I went a neighborhood library first time because I have moved this town 2 month ago. The library had 2 floors. There are magazines at first floor and books at second floor. I found a book which I read in childhood. I felt nostalgic and decided to borrow it. Next I picked up a book of Stephen King which I had seen the movie. I like his books and movies. His stories are not only horror but also impress me. Eventually I borrowed three books. I usually don’t read books so I want to make a habit to read.
これを一行ずつ校正してくれる。最初の2文の校正結果が次。
こんな感じで結構細かい指摘が来る。
正しく文章を書けているところでも、別の表現を教えてくれる講師も多いので勉強になる。
最終的に次のような文章になった。
I went to a nearby library for the first time because I just moved into this town 2 months ago. The library had two floors. There were magazines on the first floor and books on the second. I found a book which I had read in my childhood. Reading it again made me feel nostalgic and I decided to borrow it. After that, I picked up a book by Stephen King, whose movie adaptation I've watched before. In fact, I like both of his books and movies. His stories are not only scary but also inspiring to me. After browsing the library, I ended up borrowing three books in total. Reading books has never been a part of my interest, but I want to make it a habit.
今年に入ってから Language Exchange にもう何度か行っている。週1くらいのペースで行けたらいいと思っている。 Language Exchange とは、外国語を勉強したい異国の人同士が集まってお互いに話す会だ。例えば英語と日本語の場合は、英語がネイティブの人(または同じくらい話せる人)と日本語がネイティブの人が集まって10分英語で話して10分日本語で話す、みたいな感じだ。meetup というアプリで Language Exchange のイベントを立てている人がたくさんいるので僕はこのアプリで行けそうなときに行っている。
Language Exchange は DMM 英会話と比べて複数人で話すのが良い。DMM英会話などの英会話教室は1対1で話すことが多いと思うけど、Language Exchange は基本的に多対多で話すから他の人の話を聞いて表現を学ぶこともできる。日本語でも話せるので英語だけで話すよりはちょっと気楽な気もする。
Language Exchange はオフラインの交流会なのでそこで友達を作りたいと思っている。顔を合わせたコミュニティなのでDMM英会話のようなオフライン上のやりとりより親密度が高いように思う。
Language Exchange は1回0~1,000円程度で参加できるのでかなり安い。
IDIY で書いた文章を Language Exchange の予習とする
IDIYで日記を書いているので、それを Language Exchange の予習にすれば会話がやりやすいと思っている。どうせ、週末何をしたか、みたいな話をするわけで日記に書いたことと同じことを話せば話題にしやすい。文章で表現して校正も受けているわけだから安心して話すことができる。100語くらい書いているとそれなりに話せる。
Language Exchange は勇気がいる
Language Exchange は勇気がいる。英語を話す勇気もそうだが、それ以上に日本人ではない人と話すことに対する勇気が僕にはいる。ノリが軽かったりテンションが高かったりする人も多くて、そういう人と関わることが英語と話すこと以上にしんどい。大げさなジェスチャーをされるとびっくりする。やめてほしい。途中で耐えられなくて帰ったこともある。普段関わらないタイプの人と関わるのは結構しんどい。
Language Exchange の会場はどうしてもガヤガヤする。僕は騒がしい場所が苦手だ。人の声がうまく聞こえなくなる。右耳の聴力が弱いこともあるし、カクテルパーティー効果がうまく機能しないせいでもある。ガヤガヤした場所で相手の声を聞いて、雑音にまえないように大きな声で話さなければならない。大きな声で話すのも僕はあまり好きじゃない。もともと声が小さいし、低いので通らないのだ。
それでも Language Exchange には行くことにした。英語日記のおかげで多少自分から話すことはできる気がしてきていることと、DMM会話よりは続けていけそうな気がしているからだ。Language Exchangeは上記のような理由でかなり行くだけでしんどいので、参加しただけで自分を褒めることにしている。ガヤガヤした環境が嫌いすぎて普段から電車に乗らず居酒屋にも行かなくなってしまったくらいなので、Language Exchangeの環境のストレスはかなり高い。
WSL2 の欠点は Windows のディレクトリをマウントしている部分での処理が WSL より遅いことです。
WSL/WSL2から Windows のファイルを見るときは /mnt/cディレクトリ以下にアクセスします。このディレクトリは Windows のディレクトリをマウントしていますが、この部分が WSL2 では非常に遅いです。
ファイルシステムの都合によるもののようですが、 普通に git を使うこともできないほど遅いので正直開発では使い物になりません。
そのため、 WSL2 で開発を行うときはリポジトリを /home/ユーザー名/以下などに置くことをおすすめします。
そしてそのディレクトリを VS Code Remote WSL でマウントすることで開発を行います。
WSL2からDocker for windows にアクセスする
WSL2ではWSLと異なりdockerデーモンを動かすことができます。しかし僕は Docker for windows に寄せたほうが何かと作業しやすいので WSL2 から Docker for windows にアクセスして使っています。
WSL では ~/.bashrcに DOCKER_HOSTを設定することで Docker for windows にアクセスしていましたが、 WSL2 ではこの設定は不要になりました (むしろ DOCKER_HOSTの設定は消す必要があります)。
WSL2 を docker for windows の engine として設定しておけばResourceのところに下記の設定が表示されるようになるので、チェックを入れるだけでアクセスできるようになります。
これにより WSL2 上でも docker for windows にアクセスして開発できるようになるので、windows 側から同時に docker にアクセスして開発することが可能になります。
firebase はコンソールのUIが使いやすくドキュメントもわかりやすく人気が出るのも納得だった。
firestore の検索クエリに関しては結構できることが限られていてRDBのようにいかないので設計のいろはをもうちょっと知りたかったがよい資料を見つけられなかった。
みんなKey Value Store の設計はどうやっているんだろうか。。。リレーションを表現しようとしたときだいぶ苦しい。
複合キーで頑張るみたいなことはわかった。あとはElasticsearchになげるとか。なんとかやってる感があった。
(ns eight-queen2
(:require[clojure.string :as s]))(defn check? [x y queens](not(->> (map-indexed vector queens)(some(fn[[qy qx]](or(= y qy)(= x qx)(= (- qx qy)(- x y))(= (+ qx qy)(+ x y))))))))(defnpop-queen [n x queens](if(>= x n)(recur n (inc(peek queens))(pop queens))[x queens]))(defn queen
([n](queen n 0()))([n x queens](if(>= (count queens) n)
queens
(when(< x n)(if(check? x (count queens)(reverse queens))(recur n 0(conj queens x))(let[[nx nqueens](pop-queen n (inc x) queens)](recur n nx nqueens)))))))(defn display-queen [n](let[board (vec(repeat n (vec(repeat n "."))))
queens (map-indexed vector(queen n))
result (reduce#(assoc-in %1%2"Q") board queens)](println(s/join "\n"(map#(s/join " "%) result)))))(display-queen 8)
defcheck?(x, y, queens)
!queens.each_with_index.any? {|qx, qy|
y == qy ||
x == qx ||
(qx - qy) == (x - y) ||
(qx + qy) == (x + y)
}
enddefqueen(n)
queens = []
while queens.size < n
x = 0while x < n
if check?(x, queens.size, queens)
queens.push(x)
breakelse
x += 1while x >= n
x = queens.pop
x += 1endendendend
queens
enddefdisplay_queen(n)
queens = queen(n)
result = []
n.times do |x|
row = []
n.times do |y|
row <<
if queens[y] == x
'Q'else'.'endend
result[x] = row.join('')
end
result.join("\n")
end
puts display_queen(8)
再帰が while になっていること以外はだいたい同じ。Clojureはどうも配列の末尾に要素を追加したり、末尾以外の要素を取得する処理が書きづらい。Stackを使いたい場合は javaの stack を使うのが一番楽な気がする。
また google doc の他のサービスとの連携は非常に強固でした。例えば google form で作成した問い合わせフォームをサイトに埋め込むことは数回のクリックだけで終わりました。他にもYouTubeの動画を埋め込んだり、 google docs のスライドやスプレッドシートを埋め込むことも容易でした。google analytics の設定も一瞬で終わりました。
悪かった点
細かい変更ができません。使っている間「画像サイズをもっと小さくしたい」とか「テキストの一部のフォントだけ赤色にしたい」などのことを考えましたができませんでした。良くも悪くも google sites で作られたデザインの範囲でしかホームページを作成できません。
google workspace のときと一般のgoogleアカウントのときで、カスタムドメイン周りの設定方法が異なっておりドキュメントがなかなか見つからず苦労しました。私は google workspace 内でgoogle sites を用いて会社ホームページを作成したのですが、カスタムドメイン設定しようとしたとき時間がかかりました。
google workspace 内で作成した google sites にカスタムドメインを割り当てる
まだ必要なパーツがある。それは Raspberry Pi 用のバッテリーとモータードライバ。
そもそもなぜ Raspberry Pi 用のバッテリーとモーター用の単3電池に分ける必要があるのかということを意識する必要がある。
モーターというのは内部で電流が流れたり途絶えたりしながら回転している。そのため電気回路的にはモーターというのは電流のノイズ発生装置でしかなく Raspberry Pi のような精密機械に直接つなげるとこのノイズが悪影響を及ぼして最悪壊れてしまう。そのため Raspberry Pi の GPIO ピンに直接 DC モーターをつないではいけない (PWM制御するタイプのサーボモーターなどは別)。
そこでモーターの電流のノイズが Raspberry Pi に影響を与えないようにするために回路を分けてやる必要がある。
このための方法はいくつかあるが(簡単にやるならリレースイッチを使うとか)、モータードライバという回路を挟む方法がよく使われている。今回は次のモータードライバを使った。
import{ useForm } from "react-hook-form";
exportdefaultfunction App() {const{ register, handleSubmit, watch, formState: { errors }} = useForm();
const onSubmit = data => console.log(data);
console.log(watch("example")); // watch input value by passing the name of itreturn (
/* "handleSubmit" will validate your inputs before invoking "onSubmit" */<form onSubmit={handleSubmit(onSubmit)}>
{/* register your input into the hook by invoking the "register" function */}<input defaultValue="test"{...register("example")} />
{/* include validation with required or other standard HTML validation rules */}<input {...register("exampleRequired", { required: true})} />
{/* errors will return when field validation fails */}{errors.exampleRequired && <span>This field is required</span>}<input type="submit" />
</form>
);
}