University of the People の 3 term 目。今度から履修したコースの簡単なメモを残すことにした。
今期(2021-22 term3)は MATH1280 Introduction to Statistics を履修した。
成績は A。CS 1102 より良い...
続きを読む
University of the People の 3 term 目。今度から履修したコースの簡単なメモを残すことにした。
今期(2021-22 term3)は MATH1280 Introduction to Statistics を履修した。
成績は A。CS 1102 より良い...
続きを読む
参加しました。
動画
以下メモです。
サポート体制や業務内容、現状の課題など各社の具体的な話が聞けて参考になりました。
CRE という職が生まれた歴史的経緯が会社によって様々なので、サポートひとつとってもどのような体制でCREが何をどこまで担うかはけっこう違う印象を受けました。また、どこも「CREとはこうあるべき」という絶対的な解は持ってなく模索中なんだなとも。
CRE は「エンジニア」である以上、日々のサポート業務にとどまらず技術で問題を解決することが求められると思っていますが、一方でフローの整備など泥臭く地道な作業も各社やられていて、そのへんは今まさに自分もやっていることなので安心しました。
先週の This Week In React に流れてきたやつ。
🧵 TypeScript Cheat Sheets by @orta
— Sebastien Lorber 🇫🇷 🦖 ⚛️ 📨 (@sebastienlorber) 2022年1月19日
4 nicely designed and official cheatsheets now online:
- Types
- Interfaces
- Classes
- Control Flow Analysishttps://t.co/fnqAcuU8c8 pic.twitter.com/D7BlZsyvjf
ざっと読んでみたけどそこまで目新しい発見はありませんでした。以下メモ。 💬 はコメント。
public
, private
, protected
, readonly
をつけると、インスタンス変数に自動的にセットしてくれる TypeScript 独自の機能class Location { constructor(public x: number, public y: number) {} } const loc = new Location(20, 40); loc.x // 20 loc.y // 40
new XXX()
したときの型の宣言とかしばらく知らなかった
new(s: string): JSONResponse;
左上の Type vs Interface にどっち使う?の判断材料について言及されていた。
&
によるマージ)typeof 値
で値を元にした型が作れるReturnType<関数の型>
で関数の戻り値の型が作れる以下はライブラリを作成するときや既存のJavaScriptコードを表現するときに素晴らしい機能だが、多くのTypeScriptアプリケーションではほとんど使わないとのこと。
type Artist = { name: string, bio: string }; type Subscriber<Type> = { [Property in keyof Type]: (newValue: Type[Property]) => void } type ArtistSub = Subscriber<Artist>
A extends B ? C : D
type AllLocaleIDs = `${SupportedLangs}_${FooterLocaleIDs}_id`
type Responses = | { status: 200, data: any } | { status: 301, to: string } | { status: 400, error: Error }
is
を使うやつas
と同じく TypeScript の推論に頼らず自分で宣言しているだけなので取り扱い注意asserts <引数> is SomeType
で定義するやつas const
現職のログラスでは週に3回ぐらいのペースで10分勉強会というものをやっています。
自律的に学んでいくチームにしようということで10分勉強会というものを始めました!
— ゆいと🐳ログラスのエンジニア (@Yuiiitoto) 2021年9月29日
週3開催で障害対応以外のどのタスクよりも優先されます。
累計30回くらい開催できたら記事にしますね。
ANDPADさんの試みを参考にしてます!感謝!https://t.co/WIQky4WrCu pic.twitter.com/irH5h73ENi
先日そこでふりかえり手法について話したので、自分のブログにも残しておきます。
社内事情的なものを消した以外は、ほぼ勉強会のときに使った資料そのままです。
---------------資料ここから------------------
少し前に見たこの資料が面白かったので、+αで調べたことも含め紹介します
→KPT以外の方法も選択肢として知っておくといいよね!ということで調べた
主に冒頭のスライドと、ふりかえりカタログ を参考に。
- 前職ではデイリーチェックイン時のざつだんで使ってた - これ単体で使うというよりはふりかえりとかのアイスブレイク的用途かな
先が読めないからこそアジャイルが役に立つ 予定調和にハマらないためのスクラム活用術
実際にControlled Chaos……制御されたカオスという言い方をしたりします。その中で安全に実験や失敗をしてみることが、そもそものアジャイルやスクラムの価値かなと私は考えていて。
...
アクションに起こしやすくて、計測可能なトライというか改善を上げることはもちろんいいんですが。そうではなくて、お願いしたいことはたまに実験をしてみてほしい。一見何も相関がなさそうなことをやってみると、実はあとから因果があったと判明するかもしれません。
------------資料ここまで---------------
この話をした翌日が月次振り返りで、早速「象、死んだ魚、嘔吐」を試してみようという動きになった。それだけでも話してよかった。
完全に年を越してしまったが、毎年書いてるので書く。
去年:
2021年の四半期ごとのふりかえり:
第一特集の「[自作OS×自作ブラウザで学ぶ]Webページが表示されるまで」が気になって買った。
けっこうシステムコールのところとか難しくて理解があやふやだった記憶。
これは WebAssembly 特集が読みたくて。
読書メモ:Software Design 2021年3月号の「WebAssembly入門」を読んだ - dackdive's blog
今だと 日本語訳 も出ているのでそっち買った方がいい。
読書メモ:「The Art of WebAssembly」を読んだ - dackdive's blog
一瞬だけ Ansible をやる必要性にかられて買った。
前半しか読んでないが、Playbook とか Inventory といった基本的な用語が公式ドキュメント読むよりはるかにわかりやすく説明されててよかった。
面白かった。こういう本もっと読みたい。
得意なこととはなにかっていうエピソードが印象的だった。
仕事をするとき、同じくらいのエネルギーを注いでいるはずなのに、妙によろこんでもらえるときと、あんまりよろこんでもらえないときがあるんですよ。
(中略)
つまり、自分たちがすごく苦労したと思ってないのに、妙に評価してもらえるときというのは、放っておいても、どんどんいい結果が出て、いい循環になって、どんどん力が出ていく状態。それが自分たちに向いている得意なこと、そうじゃないことは向いてないことだ、というふうに、わたしはだいたい判断していますね。
これも面白い本だった。仕事と全然関係ない息抜きに良かった。
評判良さそうだったのと Concurrent Mode あたり気になって読んだ。だいたい全部読み終わったはずだけど読書メモ書けてないな...
時系列で。だいたいこのブログで、たまに Zenn の方にちゃんとまとめた情報を書くようにしてた。
これぐらい。
Pixe.la という草生やす API サービスをブラウザ上で試せる君。
あとは、2020年の終わりぐらいから読んだ記事はここに残すようにした。
https://reading-list.zaki-yama.dev/
ざっくり、1年の前半は Rust や WebAssembly を勉強していて、後半は追いつけてなかったフロントエンド技術のキャッチアップに注力していた。
後悔はないが、最近は Rust は全く勉強できてなくて、周りでやってる声もよく聞くようになったのでもっかい一から入門したいなという気持ち。
今年の後半には University of the People (UoPeople) への入学と株式会社ログラス への転職という比較的大きな決断が2つあった。
UoPeople に関しては無事最初の term を乗り越えてもうすぐ 2 term 目も終わろうかというところ。正直まだ面白いと思える授業内容ではない (その前段の基本的なプログラミングの授業をやっている) が、このペースなら仕事や子育てと並行して続けられそうだという感触が得られたのは良かった。のんびりやっていきたい。
転職に関しても良い選択だったと思っている。以前の職場もそうだが、優秀で人間的にも良い人たちに囲まれているのはとてもありがたいこと。もうすぐ3ヶ月経とうとしているので転職エントリを書きたい。
去年も書いた気がするけど、大きく変えたい・新たに挑戦したいみたいなことはなくて、引き続きコンピューターサイエンスや Web フロントエンドの勉強を継続していきたい。
コンピューターサイエンスはよくも悪くも UoPeople 以外のことを始める余裕はないので挫折しないよう頑張る。
去年以上に頑張る必要があると思ったのはフロントエンド領域で、Hooks 時代の React における設計の知見だったりとかテストまわりだとかで自分がリードできるほどの能力がないと感じており、このあたりは喫緊の課題。当面はフロントエンドのテストのことを勉強したい。
あとは Rust。なんとか時間を見つけて勉強を再開したい。。。
2021年は引き続きコロナでメンタル的に辛いときもあったので、なんもできなかったなーとか思ってたんだけど、こうしてふりかえると一応前の年よりは前進してる感じがして良い。
2022年もよろしくお願いします。
前回:2021年4〜6月のふりかえり - dackdive's blog
6 月から読み始めて、感想ブログを書いたのが 8/2。約2ヶ月かかった。
感想
8月は読書を一旦やめて、最近あまりキャッチアップできてないと感じていたフロントエンド周りの技術を勉強した。
結果としてこのようなものを作った。
前四半期で申し込みまで済ませていた UoPeople だが、9月から本格的に講義がスタートした。
正確にはまだ正式な学生にはなれてなくて、Degree Student と呼ばれる正式な学生になるために必須の科目を受講している。
今は UNIV 1001 Online Education Strategies という一般教養みたいな科目と CS 1101 Programming Fundamentals (Python) というプログラミング基礎みたいな科目の2コマをやっている。すでに限界。
↑に挙げたものがすべて。
気持ちの部分ではあんまり書くことがない。良い意味では前四半期より気持ちが前向きになっているということなのかもしれないし、悪い意味ではこの四半期大したことしてなくてほぼ記憶がないということなのかもしれない。
それでも、8月にキャッチアップしたかった技術を学べたし9月入ってからは大学の講義についていくので精一杯で、充実感はある。
次の四半期でやりたいこと、というのがあんまり思いつかない。。。
本ぐらい。
作った。
最低限の機能しかないしコードも汚いところいっぱいあるけどとりあえず公開することにした。
ここで試せます。
pixela-api-playground.zaki-yama.dev
ソースコードはこちらに。
ここのところ仕事では SDK など GUI を持たないライブラリやCLI を作ることが多く、Next.js や swr といった最近よく聞くフロントエンド技術スタックを素振りできずにいて危機感があった。
これらの素振りをするのにちょうどよい題材はないものかと思っていたところ、 Pixela という API サービスに出会ったので
この API をブラウザ上で実行できる簡単な Web アプリケーションを作ってみた。
Pixela について、詳しくは公式サイト(https://pixe.la/ja) の説明に譲るとして、GitHub の Contribution Graph のような草を生やすことができる API サービス。
習慣化したい活動を何でも記録して草を生やすことができる。最高。
自分の場合は、日々の読書時間を記録して GitHub ぽく見れたらなーと思っていたところこのサービスを見つけた。
Pixela は、 すべての機能が REST 風の API でしか提供されていない ところが特徴的。つまり、最初のユーザー登録から何からすべて curl などを利用して直接 API を叩いて行う必要がある。
これは API を利用することに慣れたプログラマにとって非常にとっつきやすい一方、特に最初どんな API があるのか、どんなリクエストに対してどんなレスポンスが返ってくるのかを色々試したいようなときには GUI でのインターフェースもあると自分以外の人にとっても便利かもなーと思い、ブラウザ上で API を一通り試せるようなサイトを作ることにした。
今のところは本当に各種 API を揃えただけ、という感じなので、便利機能とかはないです。
グラフ表示 API など一部の API は JSON ではなく SVG でレスポンスが返ってくるが、そういったものはサイト上で直接画像が見られるようになっている。
今後時間があれば作りたい機能はいくつかあって、
などなど。
反応があればやる気も上がると思うので、リポジトリに Star をお願いします...🙏
今回使った主な技術スタックは以下。
それぞれ、初めて使ってみた感想とかよくわからなかったとこを書く。
公式ドキュメントが非常に充実しているので、まずは Learn Next.js を一通りやってその後は必要になった機能だけ個別に調べる、というやり方で十分だった。
今回は必要にならなかったけど SSG、SSR、ISR の違いとかが理解できた。
今回のようにボタン押したらリクエスト送るだけのアプリに対しては完全に too much だったとは思うものの、どういう使い勝手なのか試したくて導入した。
条件付きフェッチ – SWR
の項にもあるように、「ボタンが押されたら useSWR()
する」のではなく「レンダリングのたびに常に useSWR()
は実行されるので、実際に fetch するかどうか別の state で管理する」というところは
ちょっとこれまでと発想を変える必要があった。けど hooks に共通して言える考え方なんだろうな、そういう意味で hooks 時代の設計に頭が追いついてないんだろうなとも思った。
あと、恥ずかしながらしばらく fetch や axios などのライブラリの代わりとして選択できるものだと思っていて、あくまでデータの「取得」用のライブラリだということに遅れて気がついた。
ref. how to use post method and pass params in swr? · Issue #93 · vercel/swr
クエリパラメータがそこそこあるような API を叩くとき、 useSWR()
の key
パラメータをどう指定するのがお作法的に正しいのかよくわからなかった。
引数 – SWR にあるように第一引数の key
には配列を渡せるが、
const { data: user } = useSWR(['/api/user', token], fetcher)
クエリパラメータが複数あるからといってそれをオブジェクトにまとめてしまうのは NG とされている。
// NG const { data: events } = useSWR(['/api/events', { from, to }], fetcher)
基本的にクエリパラメータが異なると別々の結果としてキャッシュしたいから key
には含めておきたいと思うんだけど、
クエリパラメータが増えるごとに配列に追加することになる?
そうすると fetcher 関数の引数も増えて...って思ったけど、第二引数をこう書けばいいのか。
const { data: events } = useSWR(['/api/events', from, to], (url, from, to) => fetcher(url, { from, to })
よくある UI コンポーネントライブラリの1つとして必要なものだけ使った、という感じなので、どのあたりに強みがあるのかとかはまだ理解が不十分。
Comparison - Chakra UI
ここを一回ちゃんと読んだほうがいい。
あと、Chakra UI を使えば Tailwind CSS の思想とかも理解できるかと思ったけど全然そんなことはなかった。
フォーム項目にきめ細かいバリデーションを実装したい場合に力を発揮しそうだなと思いつつ、今回は必須項目ぐらいしかなかったのでこれも too much ですね。
また、Chakra UI のドキュメントに
Chakra UI + React Hook Form - Chakra UI
なんてページもあるぐらいだから両方組み合わせるのも余裕なんだと思ってたけどそんなことなかったです。
ラジオボタン (Radio, RadioGroup) にどう組み込むのかわからず今のところこうなっている。
<FormControl> <FormLabel>type</FormLabel> <Controller control={control} name="type" render={({ field: { onChange, value } }) => { return ( <RadioGroup onChange={onChange} value={value}> <Stack spacing={4} direction="row"> <Radio value="int">int</Radio> <Radio value="float">float</Radio> </Stack> </RadioGroup> ); }} /> </FormControl>
「単純なラベルつき input + 必須バリデーション + エラー時のメッセージ表示」みたいなことをやろうとすると
こういうコードを何回も書くことになる。
<FormControl isInvalid={!!errors.username}> <FormLabel htmlFor="username">username</FormLabel> <Input id="username" type="text" {...register("username", { required: "This is required.", })} /> <FormErrorMessage> {errors.username && errors.username.message} </FormErrorMessage> </FormControl>
さすがにこれはめんどいってことでコンポーネントに切り出したけど、TypeScript の型が合わず何箇所か挫折してる。
type Props<TFieldValues extends Record<string, any>> = { name: keyof TFieldValues; required?: boolean; register: UseFormRegister<TFieldValues>; errors: FieldErrors<TFieldValues>; }; export default function Input<TFieldValues>({ name, required, register, errors, }: Props<TFieldValues>) { return ( <FormControl isInvalid={!!errors[name]}> {/* @ts-ignore */} <FormLabel htmlFor={name}>{name}</FormLabel> <ChakraUIInput // @ts-ignore id={name} type="text" // @ts-ignore {...register(name, { required: required && "This is required.", })} /> {/* @ts-ignore */} <FormErrorMessage>{errors[name]?.message}</FormErrorMessage> </FormControl> ); }
これは正解がよくわからない。