WindowsでHaskellの開発環境を手っ取り早く作る
開発作業をしていて飽きたときや行き詰ったとき、作業を止めてHaskellの勉強をしていたが、 PCをWindowsに変えて、再度Haskellの実行環境を整えたのでメモしておく。
準備
やり方
.devcontainer.jsonを作る
任意のディレクトリにて、.devcontainer.jsonを作成し以下を設定。
{ "name": "Haskell", "image": "haskell", "customizations": { "vscode": { "extensions": ["haskell.haskell"] } } }
devcontainerで簡単に環境準備!みたいな記事は、ネット上にいくつも転がっているが、 devcontainer自体がアップデートされているので、最新の書き方を確認すべき。 extensionsとか結構変わっている。
devcontainersの機能で、Reopen in Containerを選択
勝手にdockerイメージがpullされる。コンテナも起動。
VScodeのターミナルより、以下のコマンドを実行してすべて完了。
stack ghci
と思ったら以下のエラー。
No compiler found, expected minor version match with ghc-9.2.7 (x86_64-tinfo6) try running 'stack setup' or use the '--install-ghc' flag. To use your system GHC installation, run 'stack config set system-ghc --global true', or use the '--system-ghc' flag.
stackのセットアップをする
エラーメッセージより、以下のコマンドを実行。
stack setup
以下のエラーが出た。
The --no-install-ghc flag is inconsistent with 'stack setup'. No action taken.
以下のオプションをつけて再実行
stack setup --install-ghc
成功!!
備考
stack setup時の--install-ghcというオプションについての詳しいことは不明。 Haskellは隙間時間にちょろっと勉強する程度しか触らないので、特に調べていない。
Vuetify v-data-tableでslotを利用せずにitem内容で行の色を変えたりしたい。
v-data-tableのslotを使えば、trタグなどいろいろ手を加えられるらしいけど、それを使わずに何とかしたい。
解決方法
:item-classでtrタグにclass名を追加できる。
感想
v-data-tableの公式ドキュメントにitem-classって書いて無くないですか?ググってもよくわからない。
Data tables Component — Vuetify.js
自分は仕事の都合で、触ったことないNuxtを触ることになったのですが、 最終的にチームリーダーが以下を見つけてきてくれて解決しました。 (チーム全体がNuxt未経験者なので、全員苦労しています。)
javascript - Vuetify data table :item-class doesn't do anything - Stack Overflow
環境
- nuxt@2.16.3
- vuetify@2.6.15
詳細
<template> <div id="app"> <h1 class="title">ToDoリスト</h1> <v-data-table :headers="headers" :items="items" :item-per-page="5" :item-class="isDone" class="elevation-3" /> </div> </template>
<script> export default { data() { return { headers: [ { text: 'Task', value: 'task', }, { text: 'Status', value: 'status', }, ], items: [ { task: '掃除', status: '未着手', }, { task: '洗濯', status: '実施中', }, { task: '買い物', status: '実施済み', }, ], } }, methods: { isDone(item) { if (item.status === '実施済み') { return 'status-done' } }, }, } </script> <style> .status-done { background: grey; } </style>
こうすると、status:実施済みのデータ行の時、
Laravelで独自テーブル(migrateで作成していないテーブル)にSeederでテストデータを登録するまでのメモ
LaravelでFactory / Seederを利用してテストデータを利用する際 migration経由で作成していないテーブル等にもデータ投入ができるのか、検証した際のメモ。
検証内容
- 独自で作成したテーブルにSeederでデータを投入
- 命名規則に準じていないテーブルに対ししてSeederでデータを投入
環境
Laravel Framework 9.43.0 PHP 8.0.26
独自で作成したテーブル
①テーブルを作成
CREATE TABLE `test_users` ( `id` int NOT NULL AUTO_INCREMENT, `name` varchar(255) DEFAULT NULL, PRIMARY KEY (`id`) );
②Factory / Seeder / Modelを作成
# php artisan make:factory TestUserFactory INFO Factory [database/factories/TestUserFactory.php] created successfully. # php artisan make:seeder TestUsersTableSeeder INFO Seeder [database/seeders/TestUsersTableSeeder.php] created successfully. # php artisan make:model TestUser INFO Model [app/Models/TestUser.php] created successfully.
TestUserFactory.php
<?php namespace Database\Factories; use Illuminate\Database\Eloquent\Factories\Factory; /** * @extends \Illuminate\Database\Eloquent\Factories\Factory<\App\Models\Model> */ class TestUserFactory extends Factory { /** * Define the model's default state. * * @return array<string, mixed> */ public function definition() { return [ 'name' => $this->faker->name(), ]; } }
TaxRatesTableSeeder.php
<?php namespace Database\Seeders; use App\Models\TaxRate; use Illuminate\Database\Console\Seeds\WithoutModelEvents; use Illuminate\Database\Seeder; class TaxRatesTableSeeder extends Seeder { /** * Run the database seeds. * * @return void */ public function run() { TaxRate::factory() ->count(3) ->create(); } }
DatabaseSeederも忘れず。
<?php namespace Database\Seeders; // use Illuminate\Database\Console\Seeds\WithoutModelEvents; use Illuminate\Database\Seeder; class DatabaseSeeder extends Seeder { /** * Seed the application's database. * * @return void */ public function run() { $this->call(TestUsersTableSeeder::class); } }
TestUser.php
<?php namespace App\Models; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; class TestUser extends Model { use HasFactory; }
③seed実行
# php artisan db:seed INFO Seeding database. Database\Seeders\TestUsersTableSeeder .................................................................................................... RUNNING Illuminate\Database\QueryException SQLSTATE[42S22]: Column not found: 1054 Unknown column 'updated_at' in 'field list' (SQL: insert into `test_users` (`name`, `updated_at`, `created_at`) values (斉藤 淳, 2023-01-05 14:56:40, 2023-01-05 14:56:40))
なるほど。。 migrateなどでテーブル作成した際、自動的に付与される日付カラム(created_at / updated_at)がないと言われている。。
公式の資料を見る。何事も公式を見るべき。 Eloquentの準備 9.x Laravel
④モデルの$timestampsをfalseにする。
<?php namespace App\Models; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; class TestUser extends Model { use HasFactory; /** * モデルにタイムスタンプを付けるか * * @var bool */ public $timestamps = false; }
⑤seed再挑戦
# php artisan db:seed INFO Seeding database. Database\Seeders\TestUsersTableSeeder .................................................................................................... RUNNING Database\Seeders\TestUsersTableSeeder ............................................................................................. 379.76 ms DONE
⑥結果確認
id | name |
---|---|
1 | テスト太郎 |
2 | コレステロー太郎 |
3 | 山本 涼平 |
4 | 山口 直樹 |
5 | 加納 さゆり |
3件ランダムデータが入りました。 (1と2は自分でINSERTしたテストデータです。既存データも消えませんね。)
命名規則から外れたテーブル
テーブル名は小文字スネークケース複数形が命名規則なんですが、そうじゃないテーブルを作ります。
①テーブルを作成
CREATE TABLE `TestShop` ( `shopId` int NOT NULL AUTO_INCREMENT, `shopName` varchar(255) DEFAULT NULL, PRIMARY KEY (`shopId`) );
②Factory / Seeder / Modelを作成
# php artisan make:factory TestShopFactory INFO Factory [database/factories/TestShopFactory.php] created successfully. # php artisan make:seeder TestShopsTableSeeder INFO Seeder [database/seeders/TestShopsTableSeeder.php] created successfully. # php artisan make:model TestShop INFO Model [app/Models/TestShop.php] created successfully.
TestShopFactory.php
<?php namespace Database\Factories; use Illuminate\Database\Eloquent\Factories\Factory; /** * @extends \Illuminate\Database\Eloquent\Factories\Factory<\App\Models\Model> */ class TestShopFactory extends Factory { /** * Define the model's default state. * * @return array<string, mixed> */ public function definition() { $shopNames = ['大阪店', '札幌店' , '名古屋店' , '広島店']; $idx = rand(0, 3); return [ 'shopName' => $shopNames[$idx], ]; } }
TestShopsTableSeeder.php
<?php namespace Database\Seeders; use App\Models\TestShop; use Illuminate\Database\Console\Seeds\WithoutModelEvents; use Illuminate\Database\Seeder; class TestShopsTableSeeder extends Seeder { /** * Run the database seeds. * * @return void */ public function run() { TestShop::factory() ->count(3) ->create(); } }
DatabaseSeeder.phpも追記(コード略)
TestShop.php
<?php namespace App\Models; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; class TestShop extends Model { use HasFactory; /** * モデルにタイムスタンプを付けるか * * @var bool */ public $timestamps = false; }
③seed実行してみる
# php artisan db:seed INFO Seeding database. Database\Seeders\TestShopsTableSeeder .................................................................................................... RUNNING Illuminate\Database\QueryException SQLSTATE[42S02]: Base table or view not found: 1146 Table 'db.test_shops' doesn't exist (SQL: insert into `test_shops` (`shopName`) values (広島店))
まぁ、そうなるよね。
③モデルを修正
結局ここに行き着く Eloquentの準備 9.x Laravel
「テーブル名」「主キー」のところを参考に。
<?php namespace App\Models; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; class TestShop extends Model { use HasFactory; /** * モデルにタイムスタンプを付けるか * * @var bool */ public $timestamps = false; /** * モデルに関連付けるテーブル * * @var string */ protected $table = 'TestShop'; /** * テーブルに関連付ける主キー * * @var string */ protected $primaryKey = 'shopId'; }
④seedを再実行
# php artisan db:seed INFO Seeding database. Database\Seeders\TestShopsTableSeeder .................................................................................................... RUNNING Database\Seeders\TestShopsTableSeeder ............................................................................................. 286.97 ms DONE
shopId | shopName |
---|---|
5 | 東京店 |
6 | 札幌店 |
7 | 大阪店 |
8 | 名古屋店 |
できた。