Macに通知が来ない時は設定アプリの通知からミラーリング中の通知を許可しよう

これで通知が来るようになった
image
ディスプレイのミラーリング中または共有中に通知を許可

特殊な環境だと思う。以下の状態だと、画面がミラーリングされているため、上記の設定をONにしないと通知が来ない
 - Macは開いておく
 - 外部ディスプレイを主モニタとする
 - 外部ディスプレイをMacにミラーリングする
 - Macの輝度を0にする

完成までの時間をもっと短くしたい

例えば

  • 目当てのものにたどり着くスピード
    • マシン
      • linux, ssh, LocalForward, RemoteForward
        • これはPCを自分で組めばコスパ高い
          • 例えばMacのDockerは遅いが、linuxに繋げばめちゃはやい
    • vim
      • エディタの移動とかが早くなる
    • 正規表現
      • rgとかvimで使える。いろんな場面で役立つ
    • rg
      • ファイル絞り込みでの検索
    • ag
      • 後方からの検索がrgにはないはず
  • 不要な手戻りの省略
    • コミュニケーション
      • 質問したい内容をまとめていると答えにたどり着くことも多い
    • 全体感を常に意識
      • あ、実装の前に確認しておけば、、みたいなことは割とある
  • なるべく実装しないような発想力
    • 自分で足りなければ自分以外に頼る
      • 思いついたやつの1枚外側、内側から考える
    • AI
      • 最近はGoogleよりこっちの方が早いかもしれない。
      • 必要な箇所は公式document

Macで輝度下げはFn+O上げはFn+P

いまいち詳細が理解できないがpfuのサイトに書いてた

Macでキーボードから輝度調整を行う場合、"F14/F15"を使用します。
HHKBの場合は、"PSc/SRq=F13","Scr LK=F14","Pus/Brk=F15"のキー割り付けになりますので、以下のキー操作で輝度調整ができます。
「Fnキー + Oキー」 = 輝度ダウン
「Fnキー + Pキー」 = 輝度アップ

https://faq.pfu.jp/faq/show/2694?category_id=165&return_path=%2Fcategory%2Fshow%2F165%3Fpage%3D1%26site_domain%3Dhhkb%26sort%3Dsort_access%26sort_order%3Ddesc&site_domain=hhkb

rubyで0はtruthyでnilとfalseだけがfalsy

0 falseだと思ってたわー

Vimで範囲指定検索/\%V

  1. Visual Modeで範囲指定
  2. Escapeで範囲指定を抜ける
  3. \で検索に入り
  4. %Vを入力
  5. 検索したい文字を続けて入力

Vimは選択範囲を覚えているのでEscapeで範囲指定を抜けても次のコマンドで使えるそうだ
便利やな
https://vim-jp.org/vim-users-jp/2009/08/31/Hack-65.html

terraformでconohaにデプロイを試みる

最初はjsでエンドポイントを呼び出していたが、よく考えたらこういう時に使うのがterraformでは?と思い、conoha terraformで調べると、記事がヒットする。どうやらできるようだ。
https://qiita.com/kaminchu/items/d0776c381213d54a3a69

ここでopentofuを調べてみたら、できそうだったが、providersにconohaがない。
https://github.com/opentofu/registry/tree/main/providers

しかし、terraformのprovidersにもなさそう。
https://registry.terraform.io/browse/providers

何かおかしいので、さっきのqiitaを見ると、openstackと書いてある。
そういえば、ConoHaにもOpenStackと書かれていた。
https://www.conoha.jp/vps/function/openstack/

ここでterraformのprovidersでopenstackを検索すると、ある。
https://registry.terraform.io/providers/terraform-provider-openstack/openstack/latest

opentofuのprovidersには見当たらなかった。
どうやら変換して持ってくるっぽいが何やら面倒そうなのでterraformを使うことにする。

ここでterraformを使おうとするが、よくわからない。
とりあえず環境変数が欲しい。
1passwordの環境変数を使ってみたが、linuxでyubikeyを使った認証だとうまくいかないようだった
その時の1passwordのスレッド見つけられなかった

1passwordは無理だったので、terraformで環境変数を使う。
TF_VAR_nameを使うようだ。
これで環境変数を使って、terraformを使ってみる
https://developer.hashicorp.com/terraform/cli/config/environment-variables#tf_var_name

しかし、今度はterraformの構文が書けない。
どうやれ、required_prvidersに書かないとproviderが使えない。
resourceは第一引数がresource typeでproviderから提供されているのでドキュメントをみる必要がある
また、第二引数はresource nameで、自分でつける名前

openstackは共通したプロトコルのようなものだと思った
openstackのドキュメントを見ておくと、terraformのproviderのドキュメントにも似たような単語が出てきて理解しやすいかもしれない
https://docs.openstack.org/ja/ops-guide/preface.html

複数回のデプロイが必要なときの反省点

カラムの削除処理があるなら、全てが確認終わってから削除してもいいと思った。
最短で消せる時間はあの時間だったが、後から消しもいい。むしろ何かあった時の復元がややこしいと思うので後から消したほうが良い。先に消す利点は思いつかない。

Macで画面の収録を停止するショートカットはcommand + control + esc

収録を停止するには、メニューバーの 停止ボタンNo alt supplied for Image をクリックするか、「command + control + esc」キーを押します。

https://support.apple.com/ja-jp/102618

本番への複数デプロイが必要な場合

1つのPRに複数のコミットを作成。
それぞれで動作確認後、マージ単位でPRを分割。
作成した複数のPRをそれぞれマージ。
という手順をとったが、非常に面倒。
途中で問題を見つけて修正したら、そこに戻って動作確認をやり直す。
テストを増やそうかと思ったが、そのときだけのテストを追加するのも面倒である。
このやり方が最も効率いいと思ったが、もっといいやり方があるんだろうか

Caused by: ActiveRecord::IrreversibleMigration: remove_column is only reversible if given a type.

railsのマイグレーションでchangeメソッドを書いた。型定義を書かないでいたらロールバックできなかった。

conohaのvpsを試す

管理画面でバージョン切り替えする。

旧バージョン(Ver.2.0)にする。新バージョン(Ver.3.0)はdebianが使えないため。

debianを起動

debianを一番安いプランで起動する。512mb。1cpu。

sshとfirewalldの確認

sshして、apt update && apt install firewalld。ポート22を許可しているサービス(ssh)を--remove-service --permanentする。その後--reload。ポート22でsshできないことを確認。
firewalldの設定を--add-service --permanentで戻す。その後--reload。ポート22でsshできることを確認。
次に/etc/ssh/sshd_configのPort 22を適当な数字に変更する。その後service ssh restart。ポート22でsshが失敗することを確認。
sshのPortを22に戻す。その後service ssh restart。ポート22でsshできることを確認。

firewalldの設定とsshd_configを更新して別ポートでsshする

firewalldとsshd_configを変更して、conohaのポートを全部許可する

railsのapiドキュメントの中間レコードに関する記載を誤読した

https://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html#module-ActiveRecord::Associations::ClassMethods-label-Delete+or+destroy-3F

For has_many, destroy and destroy_all will always call the destroy method of the record(s) being removed so that callbacks are run. However delete and delete_all will either do the deletion according to the strategy specified by the :dependent option, or if no :dependent option is given, then it will follow the default strategy. The default strategy is to do nothing (leave the foreign keys with the parent ids set), except for has_many :through, where the default strategy is delete_all (delete the join records, without running their callbacks).

これを誤読した。has_many :throughになっている場合、親を消すと中間レコードと子が消えると思ってしまった。

https://stackoverflow.com/a/16949638

これを見ると、Parent.find().children.deleteみたいにした場合に、中間レコードが消えるよということを言っていた。
同じように誤読している人がいたことがわかった

WEBのITエンジニアは文章の読解力が上がるのかもしれない

最近、親族などとやり取りをしながら進めないといけないことがあったけれど、ガチで調査して調査結果を逐一報告したら、こんな長文読んでいられないと言われた。なるべくポイントに抑えて、一次資料を添えるくらいにはした。

ということで私は文章を読みまくるのが得意な可能性が高い。覚えておこう。

やってみたいことがいっぱいある

なんでもやってみたい。楽器もやってみたいしスポーツもやってみたい。大学にも行ってみたい。
研究とかも楽しいのかもしれない。

ソフトウェアエンジニアをしていて、なんでもできることがわかったからなんでもやってみたいのだ
https://github.com/kajirikajiri/jamstack-tech-blog/discussions/254

そうなる?そうする?ように色々計画を立てないとなー

「プログラミングというより物事が出来るようになる思考法」を読んだ

これ
https://note.com/simplearchitect/n/n388201603a28

これを読んで、私は運がいいと思った。
ソフトウェアエンジニアを初めて2年目くらいで、同じような課題にぶつかり、どうすればいいのかを学んだ。
なので、割となんでもできるという感覚がある。時間は有限だけどね。

実際に体験を具体的に言うと、バグが解決できなかったので、同僚に解決してもらった。それを横でよく見ていた。

私のやっていたことは、ログをパーっと見て、特に何も把握せず、うーんわからんとなって、適当にかつ高速にググり続けて疲れてきて、、、できない!となっていた。
同僚はよくログを見て、「これが原因のようだ」、とあたりをつけてそこを直していた。

「これが原因のようだ」と言っていたのはログの中にここがエラーだと書いてあり、横にソースコードの行数も書いていた。ここが原因のようだよと言われれば私だって解決できた。

つまり私はちゃんと読んでいなかった。そして、あたりがつけられていなかった。早く終わらせようとして遅くなっていた。

なので、ちゃんと読んであたりをつけるようにした。
これで大体のことは解決できるようになった。

それでもわからない場合は、もっと基礎的な部分が理解できていない可能性が高いので、わからない部分はよく調べるようになった。そういう時には、なるべく公式のドキュメントを読むようになった。やっぱり公式のドキュメントなので一番正確。

世界一流エンジニアの思考法の感想を読んで違和感を感じてGPT-4に聞いて納得した

「世界一流エンジニアの思考法」の感想を読んでいた。

2章に入った。
「Be Lazy」
これは全然実践できてなかった。バックログの優先順位を決める場合、アメリカ人は1番インパクトのある1個しかやらないらしい。自分はバックログを優先順位をつけて並べて上からこなしていた。実際にできるキャパ範囲以外のことは一切やらないというのは目から鱗だった!

https://x.com/nepinepimate3/status/1743526094610030934?s=20

先に前者と後者をまとめる。
前者: 1番インパクトのある1個しかやらない
後者: バックログを優先順位をつけて並べて上からこなす

私には、前者と後者の違いがわからなかった。前者だって、1つのタスクが終わったら次に行くでしょ?と思った。
で、GPT-4に聞いてみたところ、後者は優先順位をつけて、上の1個をやりつつ、2番目も同時にこなす可能性があるらしい。
つまり、前者は完全に1個のタスクしかしない。後者は複数こなす可能性あり。

私は基本、1個のタスクを完全にやり切ってから次のタスクに移る。なので後者も最優先のタスクをやり切ってから次に進むと思っていたため、同じことを言っていると思ってしまった。

React.Fragmentにkey

この記事を見た後に、コメントを見て賢いなと思った。
{index !== 0 && <div>separator</div>}
この部分が思いつかなかった🎃
思いついたとしても、後ろに持っていって、sampleList.lengthで見るくらい。

あと、React.Fragmentにkeyを当てる方法は知らんかった

https://qiita.com/someone7140/items/39852e66198e357308b4

export const SampleComponent: FC<Props> = ({ sampleList }) => (
  <div>
    {sampleList
      .map((sample) => {
        return <div>{sample.value}</div>
      })
      .reduce<ReactNode[]>((prev, curr) => {
        return [...prev, curr, <div>separator</div>]
      }, [])
      .slice(0, -1)}
  </div>
)
<div>
  {sampleList.map((sample, index) => {
    return (
      <React.Fragment key={sample.value}>
        {index !== 0 && <div>separator</div>}
        <div>{sample.value}</div>
      </React.Fragment>
    );
  })}
</div>

macでocr

https://github.com/schappim/macOCR

テストツールをとりあえず書き出す

たまにテストのことを書いてる記事を見かけるけど、あまり書かれてないけどいいところもあるツールがある。
この記事を今日は見た。他にも見たけれどリンクを思い出せない。
だから悪いとかそういうことではないけど、興味があったら使ってみてほしい。
https://kaminashi-developer.hatenablog.jp/entry/2023/12/12/080000

jest-preview
https://github.com/nvh95/jest-preview
完全に本番と同じように表示できるわけではなかった。
しかし、htmlの文字列を見せられるよりはヒントが多い。
デバッグが捗る可能性がある。

Cypress Component Testing
https://docs.cypress.io/guides/component-testing/overview
React Testing Libraryよりは遅いかもしれない。
しかし、ローカルサーバーで立ち上げているのと同じように表示できていると思った。
それにタイムトラベルっぽいことができたはず。

vimで部分置換

例えばこうすると、aaがaabbになる。
s/(aa)/\1bb/

(と)で囲った部分を\1, \2とかで引用できる

https://vim-jp.org/vimdoc-ja/usr_12.html

12.2 "Last, First" を "First Last" に変更する

次のような形式で名前の一覧があるとします:

    Doe, John
    Smith, Peter

これを次のように変更したいとします:

    John Doe
    Peter Smith

これはたった1つのコマンドでできてしまいます:

    :%s/\([^,]*\), \(.*\)/\2 \1/

1つずつ説明しましょう。これが置換コマンドであることはわかりますよね。"%" はす
べての行を示す範囲指定です。つまり、ファイルのすべての行で置換が実行されます。
置換コマンドには "/from/to/" という形式で引数を指定します。スラッシュ (/) は
"from" パターンと "to" 文字列の区切りです。"from" パターンは次のようになってい
ます:
([^,]*), (.*)

    1つ目の \( \) で囲まれた部分は "Last" です      \(     \)
        コンマ (,) 以外の文字が                       [^,]
        何文字でもマッチする                              *
    ", " という文字にそのままマッチ                          ,
    2つ目の \( \) で囲まれた部分は "First" です                \(  \)
        どんな文字でも                                           .
        何文字でもマッチする                                      *

"to" の部分には "\2" と "\1" が指定されています。これは後方参照というものです。
"( )" で囲まれた部分にマッチしたテキストを参照しています。"\2" は2つ目の
"( )" で囲まれた部分にマッチしたテキスト ("First" name) を参照しています。
"\1" は1つ目の "( )" ("Last" name) を参照しています。
置換コマンドの "to" 部分には最大で 9 個の後方参照を指定できます。"\0" はパター
ンがマッチしたテキスト全体になります。置換コマンドには他にもいくつか特殊なアイ
テムがあります。sub-replace-special を参照してください。

Given-When-Thenパターン

AAAパターンと書き方はそんなに変わらない印象を受けた。
こういうパターンもあるくらいで覚えておきたい

vimの強調表示を一時的に止める

:noh[lsearch]

https://vim-jp.org/vimdoc-ja/pattern.html#pattern-multi-items

検索コマンドを使うか、'hlsearch' をオンに設定すると、再び強調表示されます。

これはたまに気になってた。

vimの最長一致と最短一致

https://vim-jp.org/vimdoc-ja/pattern.html

  1. パターンの概要から必要な部分を抜き出した
量指定子 アトムがいくつマッチするか 一致の長さ
* 0 以上 最長一致
+ 1 以上 最長一致
= 0 か 1 最長一致
? 0 か 1 最長一致
{n,m} n 以上 m 以下 最長一致
{n} n 正確に指定した数だけ
{n,} n 以上 最長一致
{,m} 0 以上 m 以下 最長一致
{} 0 以上 最長一致 (*と同じ)
{-n,m} n 以上 m 以下 最短一致
{-n} n 正確に指定した数だけ
{-n,} n 以上 最短一致
{-,m} 0 以上 m 以下 最短一致
{-} 0 以上 最短一致

対象の文字列 正規表現 一致する
axbxb a.*b axbxb
axbxb a.{-}b axb

GPT-4 Playgroundをなるべく安く使う

System, User, Assistantなど、全てのデータが毎回処理されることを前提に置く。

  • Systemはなるべく短い文章にする。
  • Systemに簡潔に返すように入力する。
  • なるべくリロードして新しいChatを始める。
  • 英語の方が安いはずなので、Systemは英語で入力する

私のSystem。どこかで拾ったやつを短くした。

You are an incredibly knowledgeable assistant. You are capable of doing any task, so don't question yourself.

Do away with niceties. Get straight to the point — write very short and concise answers.

https://github.com/kajirikajiri/jamstack-tech-blog/discussions/243
https://github.com/kajirikajiri/jamstack-tech-blog/discussions/244

OpenAIのapiは古いメッセージの受け渡しによるトークンの浪費を防ぐことはできない

OpenAIのapiはステートレス。毎回全ての会話の履歴を送信する必要がある。
https://community.openai.com/t/how-do-i-avoid-wasting-tokens-by-passing-old-messages/202932

OpenAIのプレイグラウンドでシステムトークンはカウントされる

薄々感じていたが、システムトークンもカウントされる。
https://community.openai.com/t/does-system-tokens-count-in-openai-playground-when-in-chat-mode/325850

リポジトリが300個くらいあったので消した

これで一括で開いて確認しながら消した。9個になった。

Array.from(document.querySelectorAll("#user-repositories-list > ul > li > div.col-10.col-lg-9.d-inline-block > div.d-inline-block.mb-1 > h3 > a")).map(a => a.href).map(a => window.open(a + "/settings"))

document.querySelector("#dialog-show-repo-delete-menu-dialog").click()
document.querySelector("#repo-delete-proceed-button").click()
document.querySelector("#repo-delete-proceed-button").click()
document.querySelector("#verification_field").value = document.querySelector("#repo-delete-proceed-button-container > primer-text-field > label").innerText.match(/\"(.*)\"/)[1]

英語の勉強した GPT-4

しかし、どうやら毎回全文章を処理しているようで値段が高くなるようなのでやめた。履歴だけ残しておく
https://community.openai.com/t/assistants-api-pricing-details-per-message/476530/6?page=2

User
先生、今日は何を教えてくださいますか

TOEIC Hotline
こんにちは!本日はTOEICの試験対策に焦点を当てていく予定です。特に次の領域について扱います:

リーディングセクションの練習:短い広告、通知、手紙、長い読解文などの練習問題を解き、戦略を学びます。
リスニングセクションの練習:会話と講義の聞き取りに焦点を当て、重要な情報を聞き取るための技術を高めます。
文法と語彙:TOEICで頻出する文法のポイントと、実践的なビジネス英語の語彙を覚えます。
これらのセクションを通して、さまざまな問題形式に慣れ、正確かつ迅速に回答できるようになるための練習をします。質問や特に不安な部分があれば、遠慮なく教えてくださいね。それでは、レッスンを始めましょう!

User
はい、お願いします。

TOEIC Hotline
結構です。それでは、まずTOEICのリーディングセクションから始めましょう。このセクションはPart 5, Part 6, そしてPart 7に分かれています。各パートの特徴を簡単に見ていき、次にそれぞれのパートの問題をいくつか解いていきます。

Part 5: 不完全文問題 (Incomplete Sentences)
ここでは、空欄に適切な単語やフレーズを選ぶ問題が出題されます。文法知識と語彙力が試されます。
Part 6: テキスト完成問題 (Text Completion)
短いメールやお知らせなどのテキストで、いくつかの空欄を埋める問題が出ます。文脈理解が鍵になります。
Part 7: 読解問題 (Reading Comprehension)
広告、記事、お知らせなどの長文読解問題が出題され、内容に関する質問に答えます。ここでは速読力と理解力が必要です。
では、Part 5から実際の問題を見ていきましょう。

Part 5: 不完全文問題 - サンプル問題

The new software allows users to easily access ____ files from both their office and home computers. (A) they (B) their (C) them (D) theirs
正しい答えを選んでみてください。そして、その選んだ答えの理由も説明してみてください。

次に、Part 6に移ります。

Part 6: テキスト完成問題 - サンプル問題

Customer Service Announcement:

Due to unforeseen circumstances, our customer service center will be ____ today at 3:00 p.m., an hour earlier than usual.

(A) closes (B) closed (C) closing (D) close

この文の空欄に最も適切な単語を選んでください。

最後に、Part 7の読解問題を試していきますが、実際の長文を用意するのはここでは難しいので、理解のための問題形式の概要を話しましょう。詳細な内容と質問は実践の中で練習する必要があります。

これらのサンプル問題を解くことで、TOEIC試験の各リーディングセクションへの理解を深め、効率的な解答技術を習得できるようトレーニングします。それでは、以上の問題に取り組んで答えと解説を提供してください。

User
Part5を日本語にすると

新しいソフトウェアでユーザーが簡単にファイルへアクセスをできるのはオフィスと家のコンピュータからになります。

となると思います。この場合、A~Dのどれが正解か判断する方法に検討がつかないです。どうすれば良いのでしょうか。

TOEIC Hotline
この問題は代名詞の所有格の使用に関わっています。文の内容を理解した上で、文法的に正しい選択肢を選ぶ必要があります。まずは文を分析しましょう。

原文は以下の通りです: "The new software allows users to easily access ____ files from both their office and home computers."

ここでの空欄は、ファイルを所有している人(ユーザー)を示す必要があります。そのため、空欄に入るのは所有格の代名詞である必要があります。

それでは選択肢を見てみましょう: (A) they - これは主格なので、文の主語としては使用できますが、所有を示していません。 (B) their - これは所有格で、"users" の所有するものを示しているから正しい選択肢です。 (C) them - これは目的格なので、動作の対象を示しますが、所有を示していません。 (D) theirs - これも所有を示す代名詞ですが、普通、名詞の代わりに使用されることが多く、ここでは前に名詞 "files" があるため不適切です。

したがって、正しい答えは (B) their で、完全な文章は以下のようになります: "The new software allows users to easily access their files from both their office and home computers."

この種の代名詞の問題を解く際には、代名詞の役割(主格、所有格、目的格)と用途を理解しておくと良いでしょう。これによって、適切な代名詞を選ぶことが可能になります。

User
代名詞とは?また、主格、所有格、目的格とは?

TOEIC Hotline
代名詞とは、名詞の代わりに用いられる単語で、人物や物事を指し示すときに使われます。代名詞は、文の中で名詞が繰り返されるのを防ぎ、文章をスムーズに読みやすくする役割を果たします。

代名詞にはいくつかの種類がありますが、ここでは主格、所有格、目的格の3つに焦点を当てて説明します。

主格(Nominative Case)
主格の代名詞は、文の主語として使用されます。これは動作を行う人または物を指します。英語の主格代名詞には次のようなものがあります:I(私は)、you(あなたは)、he(彼は)、she(彼女は)、it(それは)、we(私たちは)、they(彼らは/それらは)。

所有格(Possessive Case)
所有格の代名詞は、所有関係を示します。それには2種類があります。一つは名詞の前に来る形容詞型の所有代名詞(myyourhisheritsourtheir)で、もう一つは名詞に取って代わる独立形の所有代名詞(mineyourshishersourstheirs)です。

例:

形容詞型:This is her book.(これは彼女の本です。)
独立形:The book is hers.(その本は彼女のものです。)
目的格(Objective Case)
目的格の代名詞は、動作の対象として使われます。つまり、誰かが何かを受け取る(直接目的語)、もしくは何かに対して動作を行う(間接目的語)ときに用います。目的格の代名詞にはme(私を/に)、you(あなたを/に)、him(彼を/に)、her(彼女を/に)、it(それを/に)、us(私たちを/に)、them(彼らを/に)があります。

例:

彼は私に本を渡した。 He gave me the book.meが目的格)
これらの代名詞の役割を把握することで、TOEICのような試験において適切な代名詞を選ぶ技術を身に付けることができます。

User
所有格が理解しきれていません。形容詞とはなんでしょう。また、所有代名詞と所有格の代名詞は同義ですか。

TOEIC Hotline
所有格が理解しきれていないということですので、まずは形容詞と所有代名詞についてもう少し詳しく説明します。

形容詞(Adjectives)
形容詞は、名詞を修飾してその名詞の性質や状態を具体的に表現する言葉です。形容詞は、たとえば「赤いリンゴ」の「赤い」や、「高い建物」の「高い」といった、色や大きさ、量、形などの特徴を示します。形容詞は通常、名詞の直前に置かれることが多いです。

所有代名詞と所有格の代名詞
所有代名詞(Possessive Pronouns)と所有格の代名詞(Possessive Case Pronouns)は根本的には同じ概念を指していますが、用語として少し区別がある場合もあります。共通しているのは、どちらも「誰かのものであること」や「何かが誰かに属していること」を示す点です。

所有代名詞は、形容詞型(修飾するタイプ)と独立型(単独で立つタイプ)に分けられます。

形容詞型の所有代名詞(my, your, his, her, its, our, their)は、修飾する名詞の前に置かれ、その名詞に所有関係を加えます(例:Her car is fast. 彼女の車は速い)。
独立型の所有代名詞(mine, yours, his, hers, ours, theirs)は通常名詞なしで立ち、所有するものや関係を指し示します(例:That book is mine. その本は私のものです)。
所有格の代名詞は、しばしば形容詞型の所有代名詞のことを指して使用されますが、文脈によっては所有代名詞全体を包括する言葉として使われることもあります。

この用語の違いは微妙ですが、所有代名詞が所有関係を示すために使われる代名詞の総称であることを理解しておくと良いでしょう。TOEICテストをはじめとする英語のテストでは、これら所有代名詞を適切に使い分ける能力が求められるので、例文を通じてしっかりと理解しましょう。

ripgrepで複数行の検索

普段は1行ごとに検索する。
-Uで複数行を対象にできる。
例を以下に記載する
JavaScriptのテンプレートリテラルを使うとする。
上1列、上2列のようなものを表現すると上${n}列のようになる。
これがフォーマッターによって修正されると以下のようになることがある。

`上${
n
}列`

つまり、3行になってしまう可能性がある。これを検索するには以下。

rg -U "上(.*\n?){0,3}列"

「上」が最初に見つかる。次はグループになる。全ての文字種が0以上見つかり、改行があるかもしれないを0~3回まで。最後に「列」。

参考
https://github.com/BurntSushi/ripgrep/issues/176#issuecomment-983650727

foo(.*\n?){0,3}bar(.*\n?){0,3}

nvim-telescopeでmethod一覧

:Telescope lsp_document_symbols

これで色々一覧が表示されるので、methodで絞り込んだりすればok

https://github.com/nvim-telescope/telescope.nvim

diffを確認する時にcode -dとvimのdiffを使う場合がある

最近、基本的にはvim上でdiffを確認している。
しかし、やや複雑になってくると、vscodeを使った方が見やすいことが多い。以下のコマンドを使う。
https://code.visualstudio.com/docs/editor/command-line#_core-cli-options

柴田菜月さんの焼き物がよい

本日、蚤の市の最終日に行って来ました。
そこで見つけた焼き物が可愛かった!

猫の焼き物🐱

image

パンダの焼き物🐼

image

柴田菜月
https://instagram.com/natsuki.shibata?igshid=OGQ5ZDc2ODk2ZA==

東京蚤の市 2023.11.3 fri → 11/5 sun
https://tokyonominoichi.com/2023_autumn/

キーボードでりふぁくたと入力するとりょうめという候補が表示される

りふぁくたと入力してなぜりょうめという候補が一番に上がるのか。意味がわからない。Google日本語入力を入れてみようか

amazon(日本)がパスキーログインに対応しましたが、2段階認証を求められて悲しい

amazon対応しているって書いてる割に使えなかったんですが、使えるようになってました。が、2段階認証を求められて悲しいです。そこが強みだと思ってたのに

ここに書いてた
https://passkeys.directory/

AAAでテストを書くときにActの前後で変化を確認するテストでAssertがActの前にくるのが気になる

AAAでテストを書くときにActの前後で変化を確認するテストでAssertがActの前にくるのが気になるので、GPT-4に聞いた
そのAssertを一度変数に入れておいてからActの後に確認すればいいだろうと。。天才だなと思いました。ありがとうGPT-4。そしてなぜ思いつかなかったんだろうか。なんかAssertしないといけない気持ちになってた。

必要なデータを検索する方法

rg

否定先読ができない https://github.com/BurntSushi/ripgrep/issues/188

ag

否定先読できたはず。以下のようなもので検索成功

(?=word1)(?!word2)

--vimgrepをつけると、quickfixの形式になるっぽい。telescopeにagを入れる時によかった。 https://github.com/ggreer/the_silver_searcher/blob/master/doc/ag.1.md
また、--vimgrepの実装は後で参考にしたい。git diffをquickfixに入れたいと思っているのでその実装の参考になるかも

vim-fugitive

:Git difftoolコマンドを使うとgit diffの結果をquickfixに入れることができる。
https://github.com/tpope/vim-fugitive/blob/master/doc/fugitive.txt
https://www.reddit.com/r/vim/comments/ess2yx/any_fugitive_commands_that_gdiff_the_next_file/ffcdvqf/?utm_source=share&utm_medium=web3x&utm_name=web3xcss&utm_term=1&utm_content=share_button

ripgrepは否定先読みできない

https://github.com/BurntSushi/ripgrep/issues/188

hhkbを掃除した

これで全部外した。spaceだけ外せなくて、他のやつ全部抜いて最後に両側に親指入れて抜いた。指が痛かった。溜まってた埃を除去。キーキャップ周りの汚れをティッシュで拭きながらはめていった。綺麗になって満足。
https://amzn.to/3rXpkhd

エラー処理についてclean codeを読む予定

clean code アジャイルソフトウェア達人の技
第7章 エラー処理

Clean Architecture 達人に学ぶソフトウェアの構造と設計を読んだ

安定依存の原則(Stable Dependencies Principle)
安定している方に依存すべき。立てたコインは安定していない。テーブルは安定している。ウェブスター辞典によると、簡単には動かせないことを安定していると言うらしい。これらから、たくさん依存されているコンポーネントは複数から依存されているため動かしづらいため安定している。たくさんに依存しているコンポーネントは依存しているため動かしやすく、安定していないと言う感じだと理解した。どれが安定しているのかを見極めるのが難しそうだ。

安定度・抽象度等価の原則(The Stable Abstractions Principle)
名前の通り。安定度の高いもの、インターフェースとか抽象クラス。それは安定しているのでそれに依存させるべき。端折った気がする。少し疲れてきたので終了。

プログラムの設計についてGPT-4に聞いた

  1. Single Responsibility Principle (SRP)
  2. Open/Closed Principle
  3. Liskov Substitution Principle
  4. Interface Segregation Principle
  5. Dependency Inversion Principle
  6. Don't Repeat Yourself (DRY)
  7. Keep It Simple, Stupid (KISS)
  8. You Aren't Gonna Need It (YAGNI)
  9. Separation of Concerns (SoC)
  10. Law of Demeter
  11. Principle of Least Astonishment
  12. Don't call us, we'll call you (Hollywood Principle)
  13. Composition over Inheritance
  14. Principle of least privilege
  15. Fail-fast
  16. Encapsulate What Varies
  17. Program to an Interface, not an implementation
  18. Delegation Principle
  19. Hide Implementation Details
  20. Single Source of Truth
  21. Agnostic Design
  22. Command-Query Separation

SRP
1つのクラスは1つのことをやる。GPT-4に例を見せてもらったところ、ユーザーの設定クラスは設定のことをやる。ユーザーの認証については別のクラスに持たせるという処理になっていました。
しかし私はあまりクラスを使いません。メソッドだとどうなるでしょう。メソッドをクラスのように扱うのではなく、メソッドの場合でSRPというのは当てはまるのでしょうか?
私が言いたいのは、このような原則はクラスに当てはめるとか限定するのではなく、そういった枠組みとして他にも適用できるだろうということです。
メソッドだったらいろんなことをやりすぎない。とかになるのかな。

OCP
修正せずに拡張できる。修正しないという意味で閉じていて、拡張できるという点で開いている。
その機械がマグロを処理できるなら、カツオを処理できるようにする場合、カツオを追加するだけでよくて、機会は修正しなくて良いみたいな。
確かに、OCPがしっかりできていれば機能追加が楽そう。

ポリモーフィズム
この前wikipediaを見たらいろいろなポリモーフィズムが書いてあるように見えた。https://ja.wikipedia.org/wiki/%E3%83%9D%E3%83%AA%E3%83%A2%E3%83%BC%E3%83%95%E3%82%A3%E3%82%BA%E3%83%A0
アドホック多相。関数のオーバーロードに見える。いろんな型引数の同盟のメソッド。便利そうなのだが、JavaScriptだと、結局if文で処理しているはず。微妙に見えたので使っていない。しかし、wikipediaのc言語の例のように書けたとしても、たくさんオーバーロードすると見づらいと思う。
パラメトリック多相。ジェネリックに見える。これは使う側は便利だった。確かreact-hook-formだと、TypeScriptの補完がすごく効いて使いやすく感じた。引数に入れたkey名を引き継いで、出力された関数の引数名の補完に使えるあたりが良かった。
サブタイピング。リスコフの置換原則っぽい。サブクラスを受け取っても正しく動くはず。正方形クラスを継承した長方形クラスはリスコフの置換原則違反っていう例を以前にみて理解できた。正方形は両辺の長さが一緒だけど、長方形は違うから、辺の長さに関係する処理があると失敗する。TypeScriptの関数であれば、別名でも同じkeyを持つパラメータだったら引数として使えたような気がする。あれも同じようなことなのだろうか。

LSP
リスコフの置換原則

ISP
インターフェース分離の原則。不必要なインターフェースの実装を強制させるべきではない。

DIP
依存関係の逆転の原則。抽象に依存させる。高水準(viewとか)は低水準(modelとか)に依存しない。普通に実装してれば高水準が低水準にはあまり入ってこないはずだけど、気を付ける。抽象に依存させると実装量が増えると思う。

DRY
同じことを繰り返さない。似たような実装がいろんな場所にあることはある。そういう時は過度にDRYにしない。

KISS
シンプルにする。いろいろ見る。シンプルだけど難しいことをしている。簡単だけど冗長なことをしている。これらをうまくやりたい。バランスを取りたい。

YAGNI
将来必要そうだなーといって追加しない。結局使われない可能性あり。コードが増えればメンテコストが増える。

SoC
関心の分離。むずい。私はTypeScriptやRubyをよく書くが、exportしたら他から読み込まれる可能性がある。それだと、想定外の呼ばれ方をするかもしれないみたいな懸念があるのであまり好きじゃない。しかしテストしやすいとか利点があれば分けてる。

LoD
最小知識原則。GPT-4の例がしっくりきた。馬は、尻尾を持っていて、尻尾を振ることができる。カウボーイが馬に乗ると、馬は尻尾を振る。この時、カウボーイからは馬が尻尾を振ることが見えればよい。馬が尻尾を持っていて、尻尾を振ることは見えなくて良い。馬.尻尾ふるみたいな。馬.尻尾.ふる。ではない。wikipediaを見ると欠点としてラッパーメソッドが増えると書いてある。確かに馬に尻尾をふるを持たせる必要がある。悪い例だと、尻尾にふるを持たせれば良い。これ良さそうやな。あまり意識できてなかったし、自分でコード書くとしたら、尻尾も公開して、尻尾.ふるみたいにすると思う。覚えておきたい。
https://en.wikipedia.org/wiki/Law_of_Demeter

PoLA
驚き最小の原則。これはむずい。GPT-4が言うには、一般的な挙動にすべき。例えばctrl+sで保存。ctrl+pで印刷。とりあえず一般的の定義が難しいし。あとはユーザーの意図した結果を出すことがいいらしい。難しいね。

Fail-Fast
失敗したら直ちに知らせるべき。これによってすぐに修正できるし、気づけづに放置することによって大きな問題になることも少なくなるようだ。良さそう。失敗したらの定義が難しそうだけど。

EWV
変化する部分をカプセル化する。GPT-4だとイマイチ理解できなかったのでググった。 https://alexkondov.com/encapsulate-what-varies/

コード
// ❌ This is hard to understand and subject to change.
// We may need to check if a book is reserved.
function checkoutBook(customer, book) {
  if (
    customer &&
    customer.fine <= 0.0 &&
    customer.card &&
    customer.card.expiration === null &&
    book &&
    !book.isCheckedOut
  ) {
    customer.books.push(book)
    book.isCheckedOut = true
  }
  return customer
}

// ✅ This is easy to read and won't change even if the checkout requirements vary.
function checkoutBook(customer, book) {
  if (customer.canCheckout(book)) {
    customer.checkout(book)
  }

  return customer
}
なるほど、確かにこの例を見ると良さそう。気になるまで詳細を見なくても良くなる。LoDと似たところを感じる。いろんな原則が絡み合ってるのか?

Program to an Interface, not an implementation
プログラムはインターフェースに対して、具体的な実装に対してではなくプログラムするべきである。GPT-4によると、DIPやOCPに関係するらしい。確かにその通りの名前だと思う。

Delegation Principle
ググっても出てこない。ある機能に特化したクラスに権限を委譲することによって、わかりやすくなるらしい。例えば、特定の計算やデータ検証など特化した機能を持つオブジェクトを作成し、そのオブジェクトを使って処理を行うなどがDelegation Principleに当たります。らしい。処理の途中で特定のクラスを作って、処理を委譲するやつかな?あまりにも処理が長いと、クラスを作りたくなる時は確かにある。

残りはググっても出てこなそうなのでスキップ。

リスコフの置換原則を読んだ

継承の使い方の指針というのがスッキリした。Clean Architecture 達人に学ぶソフトウェアの構造と設計
長方形クラスを継承した正方形クラスがあるとき、長方形は辺の長さが異なるが正方形は同じである。このとき、正方形クラスが継承したのはリスコフの置換原則に違反している。

open closedの原則を読んだ

対象を修正せず(closed)に機能追加できるべき(open)

documentを見るときはバージョンに気をつける

このドキュメントを見ていた。masterブランチのやつ。
https://github.com/nvim-telescope/telescope.nvim/blob/8c69f58427f98b2ca39a90a36db830c06e30351c/doc/telescope.txt#L1

しかし私がinstallしたのはv0.1.3。

ミス。推奨されるバージョンのドキュメントを読んでいると勘違いしていた。

masterは推奨されない。
https://github.com/nvim-telescope/telescope.nvim/blob/master/README.md?plain=1#L75-L80

actions.preview_scrolling_rightとleftがどうしても動かないので色々調べてたらそもそもバージョン違い。辛い。

nvim-telescope/telescope.nvim(live_grep, grep_string, find_files)で正規表現を使えるか調査

live_grep: https://github.com/nvim-telescope/telescope.nvim/blob/8c69f58427f98b2ca39a90a36db830c06e30351c/doc/telescope.txt#L797C6-L797C6
正規表現有効で検索できる。

    Search for a string and get results live as you type, respects .gitignore

    Parameters: ~
        {opts} (table)  options to pass to the picker

    Options: ~
        {cwd}                 (string)          root dir to search from (default: cwd, use utils.buffer_dir() to search relative to open buffer)
        {grep_open_files}     (boolean)         if true, restrict search to open files only, mutually exclusive with `search_dirs`
        {search_dirs}         (table)           directory/directories/files to search, mutually exclusive with `grep_open_files`
        {glob_pattern}        (string|table)    argument to be used with `--glob`, e.g. "*.toml", can use the opposite "!*.toml"
        {type_filter}         (string)          argument to be used with `--type`, e.g. "rust", see `rg --type-list`
        {additional_args}     (function|table)  additional arguments to be passed on. Can be fn(opts) -> tbl
        {max_results}         (number)          define a upper result value
        {disable_coordinates} (boolean)         don't show the line & row numbers (default: false)
        {file_encoding}       (string)          file encoding for the entry & previewer
↓
    文字列を検索し、入力した結果をライブで取得する。

    パラメータ ~
        {opt} (テーブル) ピッカーに渡すオプション

    オプション: ~
        {cwd} (文字列) 検索元のルートディレクトリ (デフォルト: cwd、オープンバッファからの相対検索には utils.buffer_dir() を使用)
        {grep_open_files} (boolean) true の場合、開いているファイルのみに検索を制限する。
        {search_dirs} (table) 検索するディレクトリ/ディレクトリ/ファイル。
        {glob_pattern} (string|table) `--glob` と共に使用する引数、例えば "*.toml"、反対の "!*.toml" も使用可能。
        {type_filter} (string) `--type`と一緒に使う引数、例えば "rust"、`rg --type-list`を参照。
        {additional_args} (function|table) 渡される追加引数。fn(opts) -> tbl とすることができる。
        {max_results} (数値) 結果の上限値を定義する。
        {disable_coordinates} (boolean) 行番号と行番号を表示しない (デフォルト: false)
        {file_encoding} (文字列) エ ン ト リ のフ ァ イルエンコーディ ング プレビューア

grep_string: https://github.com/nvim-telescope/telescope.nvim/blob/8c69f58427f98b2ca39a90a36db830c06e30351c/doc/telescope.txt#L831
カーソル下の文字列を検索するためにありそう。正規表現が効かない。有効にはできる。

    Searches for the string under your cursor or the visual selection in your current working directory

    Parameters: ~
        {opts} (table)  options to pass to the picker

    Options: ~
        {cwd}                 (string)          root dir to search from (default: cwd, use utils.buffer_dir() to search relative to open buffer)
        {search}              (string)          the query to search
        {grep_open_files}     (boolean)         if true, restrict search to open files only, mutually exclusive with `search_dirs`
        {search_dirs}         (table)           directory/directories/files to search, mutually exclusive with `grep_open_files`
        {use_regex}           (boolean)         if true, special characters won't be escaped, allows for using regex (default: false)
        {word_match}          (string)          can be set to `-w` to enable exact word matches
        {additional_args}     (function|table)  additional arguments to be passed on. Can be fn(opts) -> tbl
        {disable_coordinates} (boolean)         don't show the line and row numbers (default: false)
        {only_sort_text}      (boolean)         only sort the text, not the file, line or row (default: false)
        {file_encoding}       (string)          file encoding for the entry & previewer
↓
    カーソルの下にある文字列か、現在の作業ディレクトリで視覚的に選択されている文字列を検索します。

    パラメータ ~
        {opt} (テーブル) ピッカーに渡すオプション。

    オプション: ~
        {cwd} (文字列) 検索元のルートディレクトリ (デフォルト: cwd、オープンバッファからの相対検索には utils.buffer_dir() を使用)
        {search} (文字列) 検索するクエリ。
        {grep_open_files} (boolean) true の場合、開いているファイルのみに検索を制限する。
        {grep_open_files` と排他的。
        {use_regex} (boolean) true の場合、特殊文字がエスケープされない。
        {word_match} (string) `-w` に設定することで、単語の完全一致を可能にする。
        {additional_args} (function|table) 渡される追加引数。fn(opts) -> tbl とすることができる。
        {disable_coordinates} (boolean) 行番号と行番号を表示しない (デフォルト: false)
        {only_sort_text} (論理値) フ ァ イル、 行、 行ではな く テキス ト だけを ソ ー ト し ます (デ フ ォ ル ト : false)。
        {file_encoding} (string) エントリ&プレビューアのファイルエンコーディング。

find_files: https://github.com/nvim-telescope/telescope.nvim/blob/8c69f58427f98b2ca39a90a36db830c06e30351c/doc/telescope.txt#L868C5-L868C5
ファイル名の検索に使う。正規表現はない。オプションもない。

    Search for files (respecting .gitignore)

    Parameters: ~
        {opts} (table)  options to pass to the picker

    Options: ~
        {cwd}                 (string)          root dir to search from (default: cwd, use utils.buffer_dir() to search relative to open buffer)
        {find_command}        (function|table)  cmd to use for the search. Can be a fn(opts) -> tbl (default: autodetect)
        {file_entry_encoding} (string)          encoding of output of `find_command`
        {follow}              (boolean)         if true, follows symlinks (i.e. uses `-L` flag for the `find` command)
        {hidden}              (boolean)         determines whether to show hidden files or not (default: false)
        {no_ignore}           (boolean)         show files ignored by .gitignore, .ignore, etc. (default: false)
        {no_ignore_parent}    (boolean)         show files ignored by .gitignore, .ignore, etc. in parent dirs. (default: false)
        {search_dirs}         (table)           directory/directories/files to search
        {search_file}         (string)          specify a filename to search for
        {file_encoding}       (string)          file encoding for the previewer

↓
    ファイルの検索 (.gitignore を尊重する)

    パラメータ ~
        {opt} (テーブル) ピッカーに渡すオプション。

    オプション: ~
        {cwd} (文字列) 検索元のルートディレクトリ (デフォルト: cwd、オープンバッファからの相対検索には utils.buffer_dir() を使用)
        {find_command} (function|table) 検索に使うコマンド。fn(opts) -> tbl (デフォルト: autodetect)。
        {file_entry_encoding} (string) `find_command` の出力のエンコーディング。
        {follow} (boolean) true の場合、シンボリックリンクをたどります (`find` コマンドの `-L` フラグを使用します)。
        {hidden} (boolean) 隠しファイルを表示するかどうかを決定する (デフォルト: false)
        {no_ignore} (boolean) 無視されるファイルを表示します。          (boolean) .gitignoreや.ignoreなどで無視されるファイルを表示する (default: false)
        {no_ignore_parent} (論理値) .gitignore や .ignore な どで無視 さ れる フ ァ イルを親デ ィ レ ク ト リ に表示 し ます。(デ フ ォル ト : false)
        {search_dirs} (テーブル) 検索するデ ィ レ ク ト リ / デ ィ レ ク ト リ / フ ァ イル。
        {検索ファイル}         (文字列) 検索する フ ァ イル名を指定 し ます。
        {file_encoding} (文字列) プ レ ビ ュ アの フ ァ イルエン コ ーデ ィ ング。

redditのrgとagどっちがいいを見た

rgのようだ。

機能比較表がある
https://beyondgrep.com/feature-comparison/

reddit
https://www.reddit.com/r/vim/comments/f9gqe4/rigrep_or_ag/

gitの詳細が理解できてない気がする

originってlocalにある?

warning: redirecting to https://github.com/kajirikajiri/dotfiles.git/

git fetchしたら発生した。
warning: redirecting to https://github.com/kajirikajiri/dotfiles.git/

.git/configの[remote "origin"]のurlがhttpになってたのでhttpsにしたら治った。

after

[remote "origin"]
    url = https://github.com/kajirikajiri/dotfiles.git

before

[remote "origin"]
    url = http://github.com/kajirikajiri/dotfiles.git

DynamoDBにはGSIを20以上に増加をリクエストできる

Amazon DynamoDB のテーブルに対して作成できるグローバルセカンダリインデックス数が 20 個まで増加し、さまざまなクエリの実行がさらに容易になりました。20 個を超えるグローバルセカンダリインデックスが必要な場合は、増加をリクエストできます。

https://aws.amazon.com/jp/about-aws/whats-new/2018/12/amazon-dynamodb-increases-the-[…]exes-and-projected-index-attributes-you-can-create-per-table/

force-pushとレビュー

フォースプッシュしたらレビューコメントが追加できなかったと返答が来た。
気をつけたい

brew upgradeした後にgh: not found

ハマった日
1回目: 2023-09-20
2回目: 2023-10-24

git pushが失敗するようになった。

git push
/home/linuxbrew/.linuxbrew/Cellar/gh/2.29.0/bin/gh auth git-credential get: 1: /home/linuxbrew/.linuxbrew/Cellar/gh/2.29.0/bin/gh: not found
Username for 'https://github.com':

~/.gitconfigにある、2.29.0を2.35.0にしたら治った

gh --version
gh version 2.35.0 (2023-09-19)
https://github.com/cli/cli/releases/tag/v2.35.0

参照
https://github.com/cli/cli/issues/5428

bash: warning: setlocale: LC_ALL: cannot change locale (en_US.UTF-8)

sudo dpkg-reconfigure locales

したら、以下のwarningが表示されなくなってスッキリした。

ruby -v 
bash: warning: setlocale: LC_ALL: cannot change locale (en_US.UTF-8)
bash: warning: setlocale: LC_ALL: cannot change locale (en_US.UTF-8)
bash: warning: setlocale: LC_ALL: cannot change locale (en_US.UTF-8)
bash: warning: setlocale: LC_ALL: cannot change locale (en_US.UTF-8)
bash: warning: setlocale: LC_ALL: cannot change locale (en_US.UTF-8)
bash: warning: setlocale: LC_ALL: cannot change locale (en_US.UTF-8)
bash: warning: setlocale: LC_ALL: cannot change locale (en_US.UTF-8)
bash: warning: setlocale: LC_ALL: cannot change locale (en_US.UTF-8)
bash: warning: setlocale: LC_ALL: cannot change locale (en_US.UTF-8)
bash: warning: setlocale: LC_ALL: cannot change locale (en_US.UTF-8)
ruby 2.7.5p203 (2021-11-24 revision f69aeb8314) [x86_64-linux]

https://unix.stackexchange.com/a/729169

MacOSのTerminal.appでNeovimのカラースキームが失敗する

https://stackoverflow.com/a/73290225

itermを入れる

Lazy.nvimとnvim-cmp

    {
        'hrsh7th/nvim-cmp',
        event = "InsertEnter",
        -- lazy = false,
        dependencies = {
            'neovim/nvim-lspconfig',
            'hrsh7th/cmp-nvim-lsp',
            'hrsh7th/cmp-buffer',
            'hrsh7th/cmp-path',
            'hrsh7th/cmp-cmdline',
            'L3MON4D3/LuaSnip',
            'saadparwaiz1/cmp_luasnip',
        },
        config = function()
            local cmp = require("cmp")
            cmp.setup {
                snippet = {
                    -- REQUIRED - you must specify a snippet engine
                    expand = function(args)
                        require('luasnip').lsp_expand(args.body)
                    end,
                },
                window = {
                    -- completion = cmp.config.window.bordered(),
                    -- documentation = cmp.config.window.bordered(),
                },
                mapping = cmp.mapping.preset.insert({
                    ['<C-b>'] = cmp.mapping.scroll_docs(-4),
                    ['<C-f>'] = cmp.mapping.scroll_docs(4),
                    ['<C-Space>'] = cmp.mapping.complete(),
                    ['<C-e>'] = cmp.mapping.abort(),
                    ['<CR>'] = cmp.mapping.confirm({ select = true }), -- Accept currently selected item. Set `select` to `false` to only confirm explicitly selected items.
                }),
                sources = cmp.config.sources({
                    { name = 'nvim_lsp' },
                    { name = 'luasnip' },
                }, {
                    { name = 'buffer' },
                })
            }
            cmp.setup.filetype('gitcommit', {
                sources = cmp.config.sources({
                    { name = 'git' }, -- You can specify the `git` source if [you were installed it](https://github.com/petertriho/cmp-git).
                }, {
                    { name = 'buffer' },
                })
            })
            cmp.setup.cmdline({ '/', '?' }, {
                mapping = cmp.mapping.preset.cmdline(),
                sources = {
                    { name = 'buffer' }
                }
            })
            cmp.setup.cmdline(':', {
                mapping = cmp.mapping.preset.cmdline(),
                sources = cmp.config.sources({
                    { name = 'path' }
                }, {
                    { name = 'cmdline' }
                })
            })
            local capabilities = require('cmp_nvim_lsp').default_capabilities()
            -- Replace <YOUR_LSP_SERVER> with each lsp server you've enabled.
            require('lspconfig')['<YOUR_LSP_SERVER>'].setup {
                capabilities = capabilities
            }
        end,
    },

nvim-tree.luaにHack Nerd Fontを反映させた

https://github.com/preservim/nerdtree

Hack Nerd Fontを入れたが反映されない

https://github.com/nvim-tree/nvim-tree.lua/blob/7f7665a17b60d80533b7a69cfad3b6875f2dd453/README.md?plain=1#L33

nvim-web-devicons is optional and used to display file icons. It requires a patched font. Your terminal emulator must be configured to use that font, usually "Hack Nerd Font"

以下に従ってインストールした。
https://github.com/ryanoasis/nerd-fonts/blob/7deaff60d02ad26c38f4f8cc714300c08f598b1e/readme.md?plain=1#L254

brew tap homebrew/cask-fonts
brew install font-hack-nerd-font

terminalの設定から反映できた
プロファイル > テキスト > フォント > 変更

dynamoidのprojected_attributes: :allがない場合scanになる

queryではない

DynamoDBのlocal secondary indexは最初に作る必要がある

https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/LCICli.html

Local Secondary Indexes must be created at the same time you create a table.

Pull Requestのレビュー時に画像があると伝わりやすいと言われた

確かに自分でレビューした時にも画像があると変更点が理解しやすい。継続したい。

相手の手間をかけさせまいと気を使ったつもりが逆に煽っている感じになった気がしたので反省

簡単にいうと、10分くらいでレビューしてくれよなみたいなことを送った。よくないと思われる。

VSCodeのStatus barにリポジトリ名を表示できなかった

したの部分をstatus barというみたいですが、ここにリポジトリ名を表示できませんでした。

VSCodeのタイトルを変更する

"window.title": "${activeEditorLong}",

shortとmediumもあるよ。

IPv6のインスタンスを作成しsshする

vpc: Amazon 提供の IPv6 CIDR ブロック

このqiitaのように、vpcのみを作成して、サブネットをIPv6のみにすると、t2microインスタンスは起動できなかった
https://qiita.com/rotekxyz/items/5f171cc70d98b22f7d9b

このページのようなエラーが発生した。どうやら対応してない。
https://blog.devopstom.com/ipv6-only-ec2/

なので、vpcを作成するときにvpcなどで作成し、インスタンス作成時にパブリック IP の自動割り当てを無効化した。
これでパブリックIPにIPv4が割り当てられていないので、IPv6でsshしてみたら成功した。

git rebaseする前にコミット数を数える

私は作業する時、大体適当なコミットメッセージでpushしておいて、最後にrebaseして1つのコミットにすることが多いです。
その際、10個程度なら目視でコミット数を確認して
git rebase -i HEAD~10
とかしますが、たまに40個くらいのコミットがあり、目視だとミスする可能性があり、その後にforce pushしてから気づいたら悲しいのでコミット数を数えるコマンドをGPT-4に聞きました。例えば今のコミットからdevelopブランチに向けるとした場合以下のコマンドでコミット数がわかります。
以下、GPT-4のメッセージです。

git rev-list --count develop..HEAD

git rev-list --countは指定したリビジョン範囲内のコミット数を数えます。

50ea213..HEAD50ea213から現在のコミット(HEAD)までのリビジョン範囲を指定しています。
リビジョン範囲は <since>..<until>の形式で、<since>より後で、かつ<until>より前であるコミットを全て指定します。

GPT-4先生と勉強すると時間が無限に溶ける

例えばdockerのネットワークが気になったとして、調べながらコマンドを入力して動かしていると、ネットワークアドレスとホストアドレスとか、サブネット、ネットワークプレフィックスが出てきたりして、それについて色々調べているうちにdocker inspectコマンドを使ったりすると、大量の詳細が表示されてほとんど初見の項目が多いわけでそんなの全部調べ始めたらマジで時間が足りない。IPAMとか調べてへ〜ってなったけどまだまだ初見の項目いっぱい。楽しいんだけど時間が足りない。そして現在の本業はフロントエンドなのでちょっと関連性が低いから関わりが少ないので忘れやすい。
し今日は従量課金で$4。好きな時に好きなだけ聞けて。すごいね。

IPAM??

dockerでコンテナを作成すると、自動でIPアドレスが割り当てられる。これはIPAM(IP Address Management)による働きだった。
勝手に割り当てるし、コンテナがいなくなれば勝手に取り下げる。便利な仕組みだ。

GPT-4

はい、その通りです。Dockerのコンテナがネットワークに割り当てられるとき、そのコンテナに対してIPアドレスが自動で割り当てられますが、このアドレスの割り当てはIPAM(IPアドレス管理)によって行われます。
Dockerはデフォルトで内部的に特定のIPアドレス範囲を持っており、新たにコンテナが作成されるとそのIPアドレスプールから未使用のIPアドレスを選び出し、そのコンテナに対して割り当てを行います。
同様にコンテナがネットワークから削除されると、そのコンテナに割り当てられていたIPアドレスは解放され、再利用可能なIPアドレスプールに戻されます。
それらのIPアドレスの管理全般を行っているのがIPAMという仕組みです。

dockerのネットワークを色々試しながらfigを使ってみた

こっちで導入した
https://github.com/kajirikajiri/jamstack-tech-blog/discussions/201

いい感じだった
docker って入力すると network が入力補完されるし、次に connect が入力補完されるし、次に既存のネットワークが補完されるし、次に既存のコンテナが補完される。素晴らしい。

しかし、一回docker container lsで表示したコンテナ名を見ながら入力しようとしていた場合、入力補完のリストで前回のコマンド結果が隠れているのでやりづらい。そこはちょっとマイナスだが便利だった

dockerのネットワークとコンテナを色々試した

# ターミナル1を立ち上げてコンテナを作成して接続する
docker run --name=my_container1 -it busybox sh

# ターミナル2を立ち上げてコンテナを作成して接続する
docker run --name=my_container2 -it busybox sh

# ターミナル3を立ち上げてIPアドレスを調べる
docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' my_container1
docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' my_container2

# ターミナル1に戻ってpingすると成功する
ping -c 3 my_container2のip

# ターミナル2に戻ってpingすると成功する
ping -c 3 my_container1のip

# 上記、pingが成功したのは両者がdockerのデフォルトのネットワークであるbridgeに接続しているため。

# ターミナル3を立ち上げてそれぞれをbridgeネットワークから外す
docker network disconnect bridge my_container1
docker network disconnect bridge my_container1

# ターミナル1に戻ってpingすると失敗する
ping -c 3 my_container2のip

# ターミナル2に戻ってpingすると失敗する
ping -c 3 my_container1のip

# 現状それぞれのコンテナはネットワークに所属していない

# ターミナル3を立ち上げてネットワークを2つ作成する
docker network create --subnet=192.168.0.0/16 my_network1
docker network create --subnet=192.169.0.0/16 my_network2

# my_container1をmy_network1に接続する
docker network connect my_network1 my_container1

# my_container2をmy_network2に接続する
docker network connect my_network2 my_container2

# ターミナル1に戻ってpingすると失敗する
ping -c 3 my_container2のip

# ターミナル2に戻ってpingすると失敗する
ping -c 3 my_container1のip
  • 同じネットワーク内にいればそれぞれIPアドレスがあるので接続できる。
  • 明示的にネットワークを接続せずともコンテナ同士で通信できるのは、デフォルトで作成されたbridgeネットワークのおかげ

figを入れてみた

https://fig.io/

Autocompleteが表示されないので調べてみた
fig doctor
してみた方が良さそう

色々対処したら治った。しばらく使ってみよう

https://github.com/withfig/fig/issues/1448
https://zenn.dev/mizchi/scraps/8969fe29a27e21

ネットワークアドレスが競合してdocker imageをpullできなかった

エラー
Error response from daemon: Get "https://registry-1.docker.io/v2/": proxyconnect tcp: dial tcp: lookup http.docker.internal on 192.168.65.7:53: read udp 192.168.0.1:36014->192.168.65.7:53: i/o timeout

私がdockerで作成したネットワーク
docker network create --subnet=192.168.0.0/16 my_network3

dockerのResources > Network > Docker subnetに設定されていた値
192.168.65.0/24 (default)

192.168.0.0/16
192.168.0.1

192.168.255.254

192.168.65.0/24
192.168.65.1

192.168.65.254

このようにたまたま競合してしまい、pullできなかったと思われる。
思われるというのは実際に、dockerネットワークを作成するとpullに失敗すること、dockerネットワークを削除するとpullに成功することは確認できているが、詳細に仕組みがわかっていないため、本当に競合したせいなのか不明。

https://note.cman.jp/network/subnetmask.cgi

ネットワークアドレスとホストアドレスとネットワークプレフィックス

ネットワークプレフィックスが大きいとネットワークアドレスが大きく、ホストアドレスが小さい。
ネットワークプレフィックスが小さいとネットワークアドレスが小さく、ホストアドレスが大きい。
ネットワークプレフィックスは10, 16, 24がよく使われるらしい。

試しにdockerでネットワークを作成してみた。

docker network create --subnet=192.168.0.0/16 my_network
docker network create --subnet=192.168.1.0/16 my_network2

これは2つ目のコマンドが失敗する。
Error response from daemon: Pool overlaps with other one on this address space

アドレス空間の重複。
ネットワークプレフィックスが/16であるため、192.168がネットワークアドレスになる。
なので、2つ目のコマンドも同じネットワークアドレスを指定したため、同じネットワークを作成しようとしたためエラーになった。

外出先から自宅のPCにsshしようとしたらIPアドレスが変わってた

外出先、ここでは会社とします。
会社から自宅のPCにsshします。
私の構成では、私の自宅のPCが立ち上がるとawsにリモートフォワーディングでsshします。
外出先で私はaws経由で自宅のPCにsshします。
awsにはインバウンドルールが設定してあり、自宅のIPアドレスでなければsshできません。
私は楽天光を動的IPアドレスで契約しているため、たまにIPアドレスが変わります。
つまり、時々会社からsshしようとして失敗します。
やるのは時々なので、そのタイミングでIPアドレスが変わっている場合に自宅PCがawsにsshが失敗します。
ここで固定IPアドレスの設定をしようと思いましたが、オプションとしてないようです。
Google検索してみた。 site:https://network.mobile.rakuten.co.jp/hikari/ 固定IPアドレス
どうするか考えたところ、自宅のIPが変わっていて、それがawsのインバウンドルールに合致しているのだから、そのルールを一瞬解除して接続できるようにしてやり、自宅のIPアドレスがわかったらそれをawsのインバウンドルールに設定し直してやればいいと思われます。
awsのインバウンドルールはホワイトリストなので、ルールを解除したところでそのIPが接続できなくなるだけ。今問題なのは、自宅PCがsshする先(awsのインスタンス)が間違っていること。つまり自宅PCのssh先のipを直す必要があります。これは、どうしようもない。自宅のIPが変わったので、そのIPがawsで許可されていなければ追加すれば良い。しかし、awsのIPが変わった場合は、自宅のPCの接続先IPを変える必要がある。
まだ試していませんが、次回はそれでやってみよう。
固定IPが欲しいですね。

理解力が向上したかもしれない

GPT-4に確認してみたところ、理解力の向上や知識の深化というらしい。色々と習熟度が上がって効率が上がった感じのようだ。
Q: 以前よりも説明を聞いた時に理解できるようになっています。この現象はなんでしょうか?
例えば、以前はclass methodやinstance method, instance variableを聞いた時になんとなくしか理解できなかったのですが、今ではしっかりとわかるようになっています。

A: それは「学習」や「理解力の向上」あるいは「知識の深化」などと呼べます。ラーニングカーブがあげられるかもしれません。ラーニングカーブは新しい情報やスキルを学習することで習熟度が改善し、同じタスクをより効率的に遂行できるようになる過程を表しています。あるいは「経験の蓄積」や「スキルの獲得」などともいえます。

rubyのローカル変数、セッターメソッド、インスタンス変数

以下の挙動はreplitによって確認した

~/Ruby-1$ ruby -v
ruby 3.1.2p20 (2022-04-12 revision 4491bb740a) [x86_64-linux]

attr_accessorでセッター、ゲッターが定義される。
https://docs.ruby-lang.org/ja/latest/method/Module/i/attr_accessor.html

class User
  attr_accessor :name # => [:name, :name=]
end
def name
  @name
end
def name=(val)
  @name = val
end

この時、def nameで定義されるゲッターはインスタンス変数@nameを呼び出し、結果を返す。def name=(val)で定義されるセッターはインスタンス変数@nameへvalを代入する。Userクラス内で、ゲッターを使う時はnameで呼び出せる、self.nameでも呼び出せる。しかしセッターはname = で呼び出せない。self.name = で呼び出す。理由を調べたところ、ローカル変数への代入とセッターメソッドの呼び出しを区別できないためと思われる。
https://stackoverflow.com/questions/44715/why-do-ruby-setters-need-self-qualification-within-the-class

試しに以下を実行してみた。実行結果は#の後ろに記載した。最初のp nameは何も代入していないのでnilが返る。これはおそらくgetterのnameを呼び出しているが、もしかしたらローカル変数のnameかもしれない。
次のp nameは一つ上の行で呼び出したセッターメソッドname=によってインスタンス変数nameに代入した'aaa'をゲッターメソッドnameによって呼び出している。ゲッターメソッド、セッターメソッドはattr_accessorで定義されたものである。
次のp nameは一つ上の行でローカル変数nameに代入した'bbb'を呼び出している。最後のp self.nameはゲッターメソッドnameを呼び出して、セッターメソッドname=によって代入した'aaa'を呼び出している。

class User
  attr_accessor :name

  def a
    p name # nil
    self.name = 'aaa'
    p name # "aaa"
    name = 'bbb'
    p name # "bbb"
    p self.name # "aaa"
  end

end

user = User.new
user.a

また、attr_accessorを使わない場合は以下

class User

  def name
    @name
  end

  def name=(val)
    @name = val
  end

  def a
    p name # nil
    self.name = 'aaa'
    p name # "aaa"
    name = 'bbb'
    p name # "bbb"
    p self.name # "aaa"
  end

end

user = User.new
user.a

https://docs.ruby-lang.org/ja/latest/method/Module/i/attr_accessor.html

git worktreeとdockerで困った

git worktreeで作成したディレクトリで docker compose up したところ、 network name がいつもと違うくなってしまった。同一 networkに接続していたので接続できなくて困った。ここで接続する方の network name を変更して docker compose kill 、 docker compose up したが container が接続している network name は変わらなかった。GPT-4に聞いたところ、 docker compose down で network が削除されるとのことで、 docker compose down して docker compose up したら接続できるようになった。

また、docker-compose.ymlを以下のような形式に直すとdefault値が使えて便利。
https://docs.docker.com/compose/compose-file/compose-file-v3/#variable-substitution

networks:
  default:
    external:
      name: ${NETWORKS_DEFAULT_EXTERNAL_NAME:-default}

使い方

NETWORKS_DEFAULT_EXTERNAL_NAME=NAME docker compose up

使ったコマンド

コマンド 説明
docker inspect [container-name or container-id] container の接続先のネットワークの確認に使った。
docker network inspect [network-name] network に接続している container の確認に使った。
docker network ls ネットワークの一覧の取得に使った。

今回使っていないが、 docker compose down せずとも、 container の接続している network を変更することも可能らしい。

コマンド 説明
docker network connect [network-name] [container-name or container-id] コンテナをネットワークに接続する
docker network disconnect [network-name] [container-name or container-id] コンテナをネットワークから切断する

参照
https://github.com/docker/docs/issues/6914
https://zenn.dev/m_yamashii/articles/33004320e85825

vimで全体に正規表現を実行するとき

%sを使う。

あと、関連して、複数行の末尾を1文字消す方法をGPT-4に聞いた結果が以下。

下記の手順で複数行の末尾1文字を消すことが可能です。

  1. カーソルを消す操作を開始する行まで移動します。

  2. コマンド「:(範囲)s/.$//」を入力します。ここで「(範囲)」は行の範囲です。例えば、3行から5行までを処理したい場合は「3,5」と入力し、「:3,5s/.$//」となります。

    .は任意の一文字を表す正規表現で、$は行末を表すため、.$とすることで行末の一文字を指定しています。

  3. そしてEnterキーを押すと、指定した行範囲の末尾1文字が消えます。

なお、ファイル全体の末尾1文字を削除する場合には、「:%s/.$//」と

Nintendo Switch Proコントローラー急に壊れる

壊れた
https://store-jp.nintendo.com/list/hardware-accessory/controller/HAC_A_FSSKB.html

買った
https://store-jp.nintendo.com/list/hardware-accessory/controller/HAC_A_FSSKA.html

同じusbケーブルに繋いだ他の端末は通電して、Proコンが通電しなかったのでusbは生きていると判断。
Proコンを修理に出そうと思ったが修理予算目安が4,290円。

https://www.nintendo.co.jp/support/repair/price_switch.html

スティック、ボタン操作ができないバッテリー交換など | Nintendo Switch Proコントローラーの部品 | 4,290

オンライン修理予約を先にしてしまったので、取り消し。と思ったら不要。勝手にキャンセル

https://support.nintendo.co.jp/app/answers/detail/a_id/34716

Q. 【修理】オンライン修理受付で申し込みをしたのですが、修理する必要がなくなりました。キャンセルできますか?
A. 修理品を送付されなければ、自動的にキャンセル扱いとなります。
キャンセルのご連絡をしていただく必要はありません。

最初は修理に出そうと思ったが、送料とか入れたら修理に5000円くらいかかると思われたため、修理をやめて購入。

また、amazonによるとスプラトゥーン2の発売日は2017/7/21
https://www.amazon.co.jp/%E4%BB%BB%E5%A4%A9%E5%A0%82-Splatoon-2-%E3%82%B9%E3%83%97%E3%83%A9%E3%83%88%E3%82%A5%E3%83%BC%E3%83%B32-Switch/dp/B072J2J26T?th=1

発売日 ‏ : ‎ 2017/7/21

私のProコンはそれの柄のものなのでおよそ同じくらいに発売されたと考えられる。今は2023/9/4なので6年使った。
結構使った側は綺麗なので勿体無い気持ち。

元記事がなくなってたけど、beforeブロックやletブロックについて

ここに翻訳されてたけど元記事はない
https://techracho.bpsinc.jp/hachi8833/2018_04_11/54697

この記事でbeforeやletブロックがない方が見やすいっぽく書かれていた。
私もそうだなと思った。
でもbeforeやletは定義できる場所に縛りがあって、その後の改修で結局beforeやletにすることがあった。
そうなってくると最初からbeforeやletを使った方が良かったのかもしれない。
しかし最初から不必要なものは入れたくない気もする。チームで決まり事があれば従った方が良さそう。

rspecのbeforeの引数のデフォ値は:exampleまたは:each

rspecのドキュメント
https://rspec.info/documentation/3.12/rspec-core/RSpec/Core/Hooks.html#before-instance_method

#before(scope, &block) ⇒ void
Parameters:
scope (Symbol) — :example, :context, or :suite (defaults to :example)

Note: The :example and :context scopes are also available as :each and :all, respectively. Use whichever you prefer.

rspecのbeforeとかのhooksの実行順

beforeとitを交互に2つずつ置いた場合beforeが先に実行される。

describe 'example' do
    before { puts 'before1' }
    it { puts 'it1' }
    before { puts 'before2' }
    it { puts 'it2'}
end
before1
before2
it1
.before1
before2
it2
.

let!とitの場合も同様

describe 'example' do
    let!(:a) { puts 'let! a' }
    it { puts 'it1' }
    let!(:b) { puts 'let! b' }
    it { puts 'it2'}
end
let! a
let! b
it1
.let! a
let! b
it2
.

letは使わない場合呼ばれない

    let(:a) { puts 'let! a' }
    it { puts 'it1' }
    let(:b) { puts 'let! b' }
    it { puts 'it2'}
it1
.it2
.

ChatGPTの従量課金と月額

chatgptにgitのこと聞いてたら従量課金が跳ね上がった。1日で$3。
これだと月額$20の方が安くなる時もありそうだな
image

gitの変更を戻す

working tree index HEAD
checkout . o x x
reset --soft x x o
reset --mixed x o o
reset --mixed x o x
reset --hard o o o

reset --mixedはdefaultでHEADを示しているため、特に指定しない場合は変更しない。指定すれば戻す。

https://git-scm.com/docs/git-reset

In the first three forms, copy entries from to the index. In the last form, set the current branch head (HEAD) to , optionally modifying index and working tree to match. The / defaults to HEAD in all forms.

git worktreeとbareリポジトリとghqでworktreeを管理する

  • kajirikajiri/git-worktree-test リポジトリに対して実行するものとする
  • bare リポジトリとしてcloneする
  • ghq を使うものとする
# クローンしたディレクトリには、通常.gitディレクトリに入っているものと同じものが入っているように見えたがちゃんと調べてはいない
ghq get --bare https://github.com/kajirikajiri/git-worktree-test.git

# 各自クローンしたディレクトリへ移動してください
cd git-worktree-test

# --bare でcloneしたファイルとディレクトリを全て格納するディレクトリ
mkdir .bare

mv * .bare

# .gitディレクトリのパスを指定する.gitファイル
echo "gitdir: ./.bare" > .git

# --bare無しでcloneした場合は設定されているが、--bare有りだと設定されていないので設定する。これがないとfetchした時にエラーが発生する。次の感じのエラー fatal: ambiguous argument 'origin': unknown revision or path not in the working tree
git config remote.origin.fetch '+refs/heads/*:refs/remotes/origin/*'

いろいろあったけどこれで落ち着きそう。

参考
https://morgan.cugerone.com/blog/how-to-use-git-worktree-and-in-a-clean-way/
https://nicknisi.com/posts/git-worktrees/

長いエリザベスカラーと犬

最初のエリザベスカラーはマズルが少しはみ出ていた。
去勢手術後の患部を舐めることができていた。
次にもらったエリザベスカラーはマズルが1cmくらい隠れていた。
しかし、犬の柔軟性が高いようで患部を舐めることができていた。
次にもらったエリザベスカラーはマズルが4cmくらい隠れていた。
犬が患部を舐めれなくなった!やったね
舐めると患部が化膿する可能性があるらしいのと、犬によっては自分で抜歯してしまうらしいので患部に届かなくなってよかった!

スプラトゥーン3(Splatoon3)のサーモンランで危険度MAXが表示された

でんせつ910くらいだった。始まる前に危険度MAXって表示されたのはびっくりしたがBGMとか変化なし。

google domainのdevドメインをcloudflareに移管しました

こちらにあるように、Squarespace より、Google Domains に登録されているすべてのドメイン名と関連する顧客アカウントを買収する契約を締結したことが発表されました。また、取引完了後少なくとも12ヶ月間は価格を維持するようです。

Under the terms of the agreement, Squarespace will honor all existing Google Domains customers' renewal prices for at least 12 months following the closing of the transaction, as well as provide additional incentives to encourage Google Domains customers to build a website with Squarespace and adopt other Squarespace offerings. Further, Squarespace will be leveraging Google’s infrastructure powering the Google Domains product during the migration period in order to ensure the seamless transfer of domains.

https://support.google.com/domains/answer/13689670?hl=ja
https://newsroom.squarespace.com/blog/googledomains

そして、cloudflareがdevドメインに対応しました。
https://twitter.com/CloudflareDev/status/1686812617153593355?s=20

ということで、いろいろ参照してcloudflareに移管しました!!

https://qiita.com/napspans/items/3e4030ea54948295c53e
https://zenn.dev/typebase_dev/articles/cloudflare-registrar-dev-and-app-domains

git worktreeをeslintで諦めた

git worktreeで親ディレクトリ内に作成された子ディレクトリにもeslintが作動しているような挙動だった。
あまりにもeslintの時間が長くて途中でキャンセルされたので詳細はわからない。諦めた。

GPT-4のapiが使えないと思ったら$1以上の課金が必要だった

GPT-4のapiにアクセスできないなーって思ってたら$1以上の支払いが必要でした。GPT-3.5-turboを使いまくって$1以上の請求を発生させたら次月にGPT-4のapiが解放されました!

Manage account -> Billing -> Usage limits
を使って、$1に設定しておくとやりやすかったです。ただし、$1を少し超えました。$1.3くらいになったのでそのくらいは超えることを許容するか、ちょっと使ってある程度時間を置いてみたいなことをすると良いです
https://platform.openai.com/account/billing/payment-methods

https://help.openai.com/en/articles/7102672-how-can-i-access-gpt-4

On July 6, 2023 , we gave access to the GPT-4 API (8k) to all API users who have made a successful payment of $1 or more. We plan to open up access to new developers by the end of July 2023, and then start raising rate-limits after that depending on compute availability.

git worktreeと.git/info/exclude

使おうと思ったけど、どうやらディレクトリが作成されてしまう。
しかし、チームの.gitignoreに記載したくなかった。
.git/info/excludeが同等のものなのでそこに記載した。
最初はglobalな設定に記載しようかと思ったが、それはそれで問題が起こりそうだったのでやめた。以下で設定できるようです。

Its default value is $XDG_CONFIG_HOME/git/ignore. If $XDG_CONFIG_HOME is either not set or empty, $HOME/.config/git/ignore is used instead.

https://zenn.dev/qnighy/articles/1a756f2857dc20
https://solutionware.jp/2020/12/11/%E8%87%AA%E5%88%86%E5%B0%82%E7%94%A8%E3%81%AE-gitignore%E7%9B%B8%E5%BD%93%E3%82%92%E4%BD%BF%E3%81%8A%E3%81%86/

Geo ゲオ Lueca ルエカ

ピクミン4 ダウンロード版をルエカで買えませんでした。パッケージ版を買った!

犬のトイレ

1回ボール投げてトイレの上に移動させる
おしっこしたら餌をあげる。しなかったらもう1回ボール投げるを繰り返してたら1歳でも覚えた

東京都の事業に意見を書いた

https://www.metro.tokyo.lg.jp/tosei/iken-sodan/tominnokoe/index.html
ここから書けるよ。

助成金が少ない気がすると思いました
https://www.fukushi.metro.tokyo.lg.jp/kodomo/kosodate/josei/funinkensa/gaiyou.html

選挙よりこっちの方が意味がありそうな気持ち

Moora Moora ムーラムーラトリーツ

猫の餌🐈

カンガルー肉のドライフード

砕いてあげようかと思ったけどそのままあげてる

猫が自分で噛み砕いて小さくして食べてる

袋持ってくと寄ってくる、かわいい

image

砂糖入りすぎじゃね

最近この本を読んで健康に気をつけている。
https://amzn.asia/d/7rd89TH

その中でも砂糖を控えることをやっている。

とにかく何にでも砂糖がたくさん入ってるので裏面の原材料
を見て欲しい。

以下に示すように、原材料は重量順に書いてある。

JAS法に基づく加工食品品質表示基準(以下、「加工品表」という。)により、原材料名は、使用した原材料を全て重量順に表示するのが原則。(加工品表第4条(2)ア)

https://www.mhlw.go.jp/shingi/2004/09/s0929-7a.html

そして、パンとか白だしとかドレッシング見ると大体1〜3番目に砂糖が入ってる。
入ってなくても糖類とか、果糖ブドウ糖液糖とかはいってる。
びっくりした。
なるべく控えるために野菜を買ってきたり、自分でパンを作ったり、酢や塩、胡椒で味付けをしてる。
どっちが美味しいか?と言ったら砂糖がたくさん入ってる方が美味しい。しかし、糖尿病とかなりたくないのでなるべく控える。
控えても砂糖は大体の食べ物に入ってるのでちょうどいいと思ってる。

パンの原材料を見ると一番最初に砂糖が来ることが多かった。次に小麦粉。
パンのレシピ調べると大体は小麦の方が多いのだが、店で売ってるパンは砂糖の方が多い。びっくり。

気をつけて健康に生きていきたい。

ローカルのパソコンのIPアドレスが変わってsshできなかった

いつも通りにdebianにsshしたら弾かれた

えっっとなって、調査しようとしたが別に何も変えてないのでhostname -IでIPアドレスが変わっていることを確認してそこにsshしたら接続できた。

そのうち固定したい

ライセンスについて

勉強中。

このパッケージをメンテしているが、MITでいいのかを判断してる。
https://github.com/kajirikajiri/eslint-plugin-mui-path-imports/commits/main

https://qiita.com/Tatamo/items/ae7bf4878abcf0584291
https://choosealicense.com/
https://www.tohoho-web.com/ex/license.html

80028140231

着信があったため検索したところ、検索結果にヤマト運輸と書いてあるので電話に出たところ、日本語以外の自動音声につながった。怪しいので、検索結果に表示しないでほしいと思った。

+1 80028140231と電話に表示された。

https://www.city.okayama.jp/kurashi/cmsfiles/contents/0000016/16949/2020.8.17.pdf

jestをcliで実行するときにsquare brackets(角かっこ([]))をファイル名に含める方法

https://discuss.circleci.com/t/jest-does-not-run-tests-with-brackets-in-filename-when-using-parallelism/44164

例えばyour/[file]/path.jsというテストのファイルを実行したいとき。

以下のどちらかを使っている。挙動から見て、\[は[として評価されてると思われる。
また、\]は]で評価されてると思う。
.は何かに1文字マッチするはずなので、厳密には別のファイルにも一致すると思うがまあ大体の場合に有効。
例えばyour/afileb/path.jsとかにもマッチすると思う。

jest your/\\\[file\\\]/path.js

or

jest your/.file./path.js

機能追加以外を先延ばしすることについて

例えばリファクタリングとか。
こういうタスクを先延ばしすると忘れ去られるらしい。そしてそれは良くないらしい。
そういう記事や本を読んだからそういう固定観念があるのかもしれない。
ここで気になるのは実際に放置して何が起こるのか。
私はまだそこまでの問題が起きたことがない。実際に忘れることは体験済み。
記事や本を読んだ知識と、実体験が乖離しているため頭が混乱している。つまり、本には良くないと書いているが、私に問題が起きたことはない。しかし私は実際に先延ばしにして忘れていく。
白黒つかないこと。うーん。時間をかけてタスクを洗い出すことはできるけど、全タスクにそれはできない。結局その時にやるべきと思ったことしかできない。

健康になる技術大全を読んでヨガに興味を持った

健康になる技術 大全 を読んで、ヨガに興味を持った

https://amzn.to/46derr0

運動には4種類くらいあるらしいが、それを全部カバーできるって書いてた気がする。
やったことないのでとりあえずやってみようと思う。

ヨガの教科書ってなんだろうと思って、ヨガインストラクターの資格を調べた。
JAY日本ヨガ連盟というのがヒットしたので、それの教科書を買って読んでみることにした。

https://amzn.to/3NzZmbx
https://amzn.to/3Pib4IY

あと、座るのがあまり良くないとのことでなるべく立ってやることにした

Cypress component testing with mui

https://github.com/kajirikajiri/cypress-component-test-mui-next-ts

@mui/material/TextField
@mui/x-data-grid

を対象にテストを書いてみた。

普通にかけた

最近あまり共通化してない

技術書読んで共通化に目覚めて、共通化してたが最近してない。
特にテスト。例えばrspecでdescribeやcontextで共通化してたが、最近はitの中に全部書いてる。
例えばorganizationっていう変数を使ってるとして、他とちょっと異なるとき、外側で共通化されてると剥がすの面倒ってなるのが辛い。
なんだろう、そっちに頭のメモリを使いたくない。あっちのテストにもこっちのテストにも影響あるかも、、、ってなると、頭が辛い。itの中に全部書いてあればそこだけ気にすれば良くて頭が楽。

debian bookwormの画面のチラつきが治らなかった

kernelを以前にインストール済みの5.10.0-23にしたらチラつきは発生しなくなった。なので、デフォルトで起動するカーネルを変更した。

/etc/default/grub
のGRUB_DEFAULTを変更した。

GRUB_DEFAULT="Advanced options for Debian GNU/Linux>Debian GNU/Linux, with Linux 5.10.0-23-amd64"

debian bookwormで電源ボタンを押してもシャットダウンしなくなった

15分程使わずにログイン画面に戻された場合に電源ボタンが効かない。ログイン状態であれば使える。ただし、bullseyeの時と挙動が違って、60秒後にログアウトしますという画面が表示される。

電源ボタンを押したらシャットダウンして欲しいので、設定を変える。

GPT-4に聞いた。成功したので載せておきます。


電源ボタンを押した時にシャットダウンするようにできますか

https://www.debian.org/releases/bookworm/amd64/index.en.html

GPT-4
はい、あなたの問題を解決するためには、ACPIイベントを設定してシャットダウンさせるスクリプトを作成します。以下にその手順を詳しく説明します。しかし、この変更はシステムレベルの変更となるため、どのような影響があるかを理解してから行うことをお勧めします。

まず、ACPI(Advanced Configuration and Power Interface)サポートが有効になっていることを確認してください。これは、あなたのマシンが電源ボタンの押下を認識できるようにする機能です。これを確認するためには、以下のコマンドを使います:

grep -i acpi /boot/config-$(uname -r)

出力が CONFIG_ACPI=y を含んでいれば、ACPIが有効になっていることが確認できます。

次に、/etc/acpi/events/ ディレクトリに新しい設定ファイルを作成します。例えば powerbtn という名前でファイルを作成します:

sudo nano /etc/acpi/events/powerbtn

このファイルに以下の内容を記述します:

event=button/power (PBTN|PWRF)
action=/sbin/shutdown -h now

これは、電源ボタン (PBTN または PWRF) が押されたときに /sbin/shutdown -h now コマンドを実行するという意味です。

最後に、ACPIデーモンをリスタートします:

sudo service acpid restart

これで、電源ボタンを押すとシステムがシャットダウンするはずです。

それでも問題が解決しない場合は、具体的なエラーメッセージやシステムの詳細情報を教えていただければ、より具体的なアドバイスが可能です。

https://chat.openai.com/share/550b906c-9af8-4c46-8717-65e81cdfa767

共有アルバムを効率的に使いたい

自分だけで使う。

1日10,000件。1時間1000件。

効率よくやって10時間で10000件。
1時間ごとに1000件づつやる。

https://support.apple.com/ja-jp/HT202299

共有アルバムの 1 時間/1 日ごとの制限は次の通りです。
すべての共有アルバムに対して参加者 1 名が投稿できる写真とビデオの 1 時間あたりの最大枚数:1,000 件
すべての共有アルバムに対して参加者 1 名が投稿できる写真とビデオの 1 日あたりの最大枚数:10,000 件
これらの共有制限は、上記のアップロード制限とは別途設けられています。たとえば、同じ日に 10,000 枚の写真をマイフォトストリームにアップロードしてから、それらの 10,000 枚の写真、または 10,000 枚のほかの写真を共有することができます。
共有アルバムについては、次のような制限も追加で設けられています。
1 人のオーナーが共有できる共有アルバムの最大数:200
1 人のユーザが参加できる共有アルバムの最大数:200
共有アルバムあたりの最大参加者数:100 人 (共有アルバムごとの参加者数)
1 つの共有アルバムで参加者全員が投稿できる写真とビデオの合計枚数:5,000 件
共有アルバムの 1 枚の写真または 1 つのビデオにつき投稿可能なコメントの最大数:200 回 (「いいね!」またはテキスト入力をコメントとみなします)
コメントあたりの最大文字数:1024 文字
1 日に共有アルバムのオーナーが招待通知を送信できる最大数:200 件

nvm useでバージョンが切り替わらない

nvm以外からインストールしたnodeが見つかったので、削除したら解消した

which -a node

brewでインストールしたnodeが入っていたので削除したらnvmでインストールしたnodeのバージョンになった

https://stackoverflow.com/a/68737310

自宅のubuntuPCにsshしてみて

開発体験は良い

会社のApple M1 Pro 32GB 14インチ 2021年モデルはdockerを動かすととても遅い。dockerでrubocopしたり、dockerでgatsby立ち上げたり、Nextjs立ち上げたりがとても遅い。体感的には1/10くらいの速さで色々が終わる。

e2eテストが特殊だった。
自宅PCで立ち上げたlocalhostをLocalForwardやRemoteForwardでどこからでも使えるようにして、e2eテストはmacから実行する。
なので、実装は自宅PCのコードを編集。テストはmacのコードを編集するのでなんかやりづらかった。

あとは、一応sshしないといけないので手間がある。

時間が経つとipが変わってawsにsshできないことがある。
接続元のipを縛ってあるので、それを変更する必要がある

浸水した

2023/06/02
まだ色々残ってるが、忘れるとあれなのでメモ。
浸水したのを発見したら写真を撮りましょう。ちょっと片付けてから気づいたので。多分保険が降りるよ。

後で見たら、weather news で16時に31mlだった。

Move focus to next window は cmd + @ だった

システム設定 → キーボード → キーボードショートカット → キーボード → 次のウィンドウを操作対象にする

これでVSCodeのwindowを切り替えれるようになった。このショートカットの存在を知らなかった

スクリーンショット 2023-06-01 11 57 26

https://www.reddit.com/r/MacOSBeta/comments/y6cy9r/comment/j15ezu4/?utm_source=share&utm_medium=web3x&utm_name=web3xcss&utm_term=1&utm_content=share_button

switchbotを家のPCに取り付けた

https://amzn.to/431XsG5

これで外出先からでも電源をonにできる。マジックパケットより楽そうなのでこれにした。まあ、物理的に取れたら終わりだけどね。10回くらい動かした感じは大丈夫そう。最初の一回で、電源スイッチから遠すぎて、スイッチを押そうとして平面を押してswitchbotが剥がれた落ちたけど、近づけたら大丈夫だった。落っこちたときにswitchbotのパネルが外れてビビった

sshのremote forwardをsystemctrlに設定した

こんな感じの設定ファイルを書いた

# /etc/systemd/system/[email protected]
[Unit]
Description=Setup a secure tunnel
After=network.target

[Service]
User=User
ExecStart=/usr/bin/ssh aws 
RestartSec=5
Restart=always

[Install]
WantedBy=multi-user.target

手動で立ち上げる

systemctl start secure-tunnel@.service

このコマンドでパソコン起動時に実行されるようにした

systemctl enable [email protected]

ログは以下のコマンドで確認

sudo journalctl -u secure-tunnel@.service --no-pager
or
systemctrl status secure-tunnel@.service

あとは、magic packetを送って外部から起動しようと思ったが、無線LANだとめんどくさいとどこかの記事で読んだので断念して、switchbotを取り付けて起動してみようと思う。長押しもできるようなのできっと大丈夫

参考
https://gist.github.com/drmalex07/c0f9304deea566842490

参考 GPT-4

QUESTION
How do I run the ssh command when my computer starts up?

ANSWER
Starting an SSH command or any command at startup can be done by setting up a script to run when the system boots. Here is a general approach for different operating systems:

Windows:

Open Notepad.
Write your command in the format: "C:\Program Files\PuTTY\putty.exe" -ssh user@hostname.
Save the file with .bat extension.
Press Win + R to open Run, type in shell:startup, and press Enter.
This opens the Startup directory. Move your .bat file into this directory.
MacOS:

Open Terminal.
Write crontab -e and press Enter.
Add the command @reboot /usr/bin/ssh user@hostname.
Press Ctrl + X to finish editing, Y to save changes, and Enter to exit.
Linux (systemd):

Open Terminal.
Write sudo nano /etc/systemd/system/sshcommand.service and press Enter.
Enter the following (replacing 'user@hostname'):
csharp
Copy code
[Unit]
Description=My SSH command

[Service]
ExecStart=/usr/bin/ssh user@hostname

[Install]
WantedBy=multi-user.target
Press Ctrl + X to finish editing, Y to save changes, and Enter to exit.
Enable this to start at boot by running sudo systemctl enable sshcommand.service.
Note: These examples assume you have the SSH command or an SSH client available and in your PATH. Adjust paths and command options as necessary. Please be careful with security considerations. Running an SSH command on startup often means either using key-based authentication, which requires careful handling of SSH private keys, or storing passwords in plaintext, which is a security risk.

ハードディスクを消去したmacを復活させた

発端

macos 500gbにssd 500gbを接続して、ssdを初期化したつもりが、macosを初期化した。

試行錯誤した

1008エラーが出たり、アクティベーションロック解除してもダメだったりして面倒だった。
https://support.apple.com/ja-jp/HT206989

apple-configuratorを使って復活に失敗したので復元して、
https://support.apple.com/ja-jp/guide/apple-configurator-mac/apdebea5be51/mac

途中でディスクユーティリティを起動させ、ハードディスクをeraseして、macosを再インストールした。
https://support.apple.com/ja-jp/HT204904

再インストールしようとしたら、フォーマットが違うとか言われて、何回かeraseを繰り返した。
以下のようなメッセージだった。

This disk doesn't use the GUID Partition Table scheme.
Use Disk Utility to change the partition scheme. Select the device containing the disk, click the Erase button, select the Volume Scheme and then click Erase

This Mac can only install macOS on APFS-formatted drives.

言われた通りにフォーマットしたら、macosの再インストールに成功した。

データは全て消えたようだが、消えてもいいようにしてるので特に問題ない。

今はventureにupdateしてる。

sshで家のパソコンに接続して開発するのは体験が良い

家にデスクトップPCを置いて、そこにsshして開発している。
自分も家にいる時は、デスクトップPCにノートPCからsshしてLocalForwardで開発している。デスクトップPCで動かしているdockerのポートをノートPCのポートから読み込めるようにしている。遅延とか特に感じない。vscodeもsshで動かせるので、ノートPCからデスクトップPCのファイルを変更している。
自分が外に行く時は、デスクトップPCをawsのインスタンスにsshしてから外出している。デスクトップPCでRemoteForwardしているので、awsからデスクトップPCにsshできる状態になっている。あとは外出先でノートPCからproxyCommandでawsにsshして、デスクトップPCにsshしている。次にデスクトップPCからRemoteForwardでdockerのポートをawsに接続して、そこで指定したポートにノートPCからLocalForwardでsshして開発している。

これのいいところ

  • デスクトップPCはノートPCより安く調達できる
  • awsは一年間無料で運用できる
  • macosだとdockerが遅いが、debianで起動したdockerが動いているので、dockerが早い
  • sshが結構使えるようになる
  • 家のネットワークをグローバルに公開する必要がない

欠点

  • デスクトップPCはでかい
  • sshに慣れるまで操作が難しい
  • 自作PCは色々と調べるのが大変
  • 家のパソコンが落ちたら外から繋げない

ssh accept: Too many open files

以下のようにしたら、localForwardしたターミナル上でエラーが発生した。これはなんだろうか?
mac --ssh--> aws --ssh--> linux --remoteForward--> aws
mac --localForward--> aws

ec2の転送料金 EC2: Data Transfer - Internet (Out)

普通に開発して、1日0.1GBだった
無料の範囲が月に100GBあるのでまあ無料で使い続けられそう

スクリーンショット 2023-05-17 12 32 29

以下参考

https://aws.amazon.com/jp/ec2/pricing/on-demand/#Data_Transfer

AWS をご利用のお客様は、すべての AWS のサービスとリージョン (中国と GovCloud を除く) で合計 100 GB のインターネットへのデータ転送 (アウト) を
毎月無料でご利用いただけます。インターネットへのデータ転送 (アウト) のための 100 GB の無料利用枠は
グローバルであり、AWS リージョンに個別にまたは別個に適用されるものではありません。

https://qiita.com/koji4104/items/60454f6a92c14016f2b1

請求書ページのコストエクスプローラーへ移動します。
グループ化の条件を指定します。詳細→タグ→Name
使用タイプグループを指定します。EC2: Data Transfer-Internet (Out)

https://zenn.dev/voluntas/scraps/2650bc3e6b4ea6

100 GB/月まで
無料

同一ネットワーク上でsshした

hostname -I
ipaddressが表示される

whoami
usernameが表示される

ssh <username>@<ipaddress>

ipaddressは複数表示されていたが、先頭のやつでsshできた
秘密鍵やport番号を変えているのであれば適宜セットしてください

https://qiita.com/rintarou/items/bef523c7c8f11097e577

debianをアップグレードしたらtp-linkのusb-wifiが繋がらなくなった

アップグレードがあるよって、通知が出てたのでアップグレードしたら、tp-linkのusb-wifiでwifiできなくなった。再度ドライバ?をインストールしたらwifiが繋がったのでok。もうすぐ、ubuntuの本の虫?がリリースされるので、その時のアップデートでも多分同じことが起きるので覚えておきたい。

sshってすごい

  1. 1.home-to-awsで家からawsの22ポートにアクセスして、RemoteForwardでawsの22222ポートへのアクセスを家の22ポートに転送しておく
  2. 2.office-to-aws-to-homeでofficeからawsの22ポートにアクセスして、awsの22222ポートへアクセスすると、家の22ポートに転送され、家のsshサーバーにアクセス
  3. 家のsshサーバーで3.home-local-remote-forwardでawsの22ポートにアクセスして、RemoteForwardでawsの3000, 4000, 5000ポートが家の3000, 4000, 5000ポートに転送する
  4. 4.office-to-aws-local-forwardでofficeからawsの22ポートにアクセスして、LocalForwardでofficeの3000, 4000, 5000ポートが家の3000, 4000, 5000ポートに転送されているawsの3000, 4000, 5000ポートに転送する

上記をすることによって、家のサーバーにsshできて、家のlocalhostで立ち上がっているrailsやnode、goやreactなどのサービスをofficeから操作できた。vscodeのremote接続をすることにより、コードの編集もofficeからできたので満足。
以下は図にまとめた。

ssh drawio (2)

また、sshのconfigには適宜これらを追加したい。

  ExitOnForwardFailure yes
  TCPKeepAlive yes
  ServerAliveInterval 30

これによって、家に強めのデスクトップPCを置いておいて、外出先から動かすことができるので非常に便利。
あとは、awsの通信量が気になるところ。

そもそもmacのdockerが遅くて作業が捗らなかったところから、色々考えてこういう構成になった。
macとlinuxか、macとwindowsのノートパソコンを持ち歩くと、2台で重い。それにノートパソコンは高い。2年前くらいに買ったthinkpadはトータル30万くらいしたが、今回は15万くらいで収まっている。
できれば2年に一回くらいは新しいPCにしたかったので、これなら半額で買い換えれる。嬉しい。

今回の色々でsshに詳しくなった。

debianを放置して、ディスプレイが消えた後にキーボードやマウスから再開できない

debianを放置して、ディスプレイが消えたが、音はなっていて、 LEDはついている状態でキーボードやマウスをクリックしてもディスプレイが表示されなかった。

強制終了すればいいのだが、気分的によくない。

それっぽい状況をみつけた。

https://unix.stackexchange.com/a/521612

Hibernationというのは冬眠とかでてきたので休止状態と思われる。
自分の状況は放置して休止状態になったか、スリープしたのでは?と思ったので、記事の通り、swapファイルを設定した。

# swapを表示
sudo swapon --show

NAME           TYPE      SIZE USED PRIO
/dev/nvme0n1p3 partition 976M   0B   -2

# RAM(メモリ)を表示
free -h

               total        used        free      shared  buff/cache   available
Mem:            31Gi       2.0Gi        27Gi       209Mi       1.4Gi        28Gi
Swap:          975Mi          0B       975Mi

# 記事を参考に、38GBのswapファイルを作成
sudo fallocate -l 38G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile

Setting up swapspace version 1, size = 38 GiB (40802185216 bytes)
no label, UUID=b9cf574a-ab09-44d3-8033-01b26f8ec0b3

# おそらくswapを設定
sudo swapon /swapfile
sudo vi /etc/fstab

# swapを確認
sudo swapon --show

NAME           TYPE      SIZE USED PRIO
/dev/nvme0n1p3 partition 976M   0B   -2
/swapfile      file       38G   0B   -3

# swapを確認
sudo free -h

               total        used        free      shared  buff/cache   available
Mem:            31Gi       2.0Gi        27Gi       156Mi       1.4Gi        28Gi
Swap:           38Gi          0B        38Gi

設定できたっぽいのでok

swapの参考値は以下。参照した記事が参照した記事中にあった
https://askubuntu.com/questions/594054/how-much-swap-should-i-take-for-1gb-to-8tb-of-ram-on-14-04-or-higher

    RAM       No hibernation    With Hibernation   Maximum

    1GB              1GB                 2GB        2GB
    2GB              1GB                 3GB        4GB
    3GB              2GB                 5GB        6GB
    4GB              2GB                 6GB        8GB
    5GB              2GB                 7GB       10GB
    6GB              2GB                 8GB       12GB
    8GB              3GB                11GB       16GB
   12GB              3GB                15GB       24GB
   16GB              4GB                20GB       32GB
   24GB              5GB                29GB       48GB
   32GB              6GB                38GB       64GB
   64GB              8GB                72GB      128GB
  128GB             11GB               139GB      256GB
  256GB             16GB               272GB      512GB
  512GB             23GB               535GB        1TB
    1TB             32GB              1056GB        2TB
    2TB             46GB              2094GB        4TB
    4TB             64GB              4160GB        8TB
    8TB             91GB              8283GB       16TB

追記
色々調べた結果、セキュアモードだと休止状態にできないとか?そんな記述を見かけたので、時間が経過しても休止状態にならないようにして、画面だけ消えるようにした。あとは、適宜シャットダウン。起動は十分に早いのでよしとする。

debianのインストールに成功した

自作PCの作成やmx-linux、ubuntu、debianのインストールを試したりしてて、GWのほとんどの時間を費やした。
ubuntuは自分のpcでは安定して動かず、debianを選択した。
ubuntuはシャットダウンでシャットダウンしなかったり、chromeが急に終了したり色々大変だった。

マザーボードにはwifi、bluetoothが付いてなかった
まさかついてないと思ってなくて確認してなかった。後付けでusbで繋ぐやつを買った。
wifiを使えるようにデバイスドライバとか入れるのが面倒だった。

debianのインストールで失敗しまくった
bootloaderのインストールに失敗したり、パッケージマネージャーのインストールが成功したり失敗したりで面倒だった。

GPTとMBR、UEFIのあたりのパーティションについて知見が溜まった。GPTの方が新しい。MBRは2だか、4TBまでの記憶領域しか使えない。GPTとMBRを共存できない。

ASUSのマザーボードはUEFIのenableとdisableが直接的な表現でなかった。
https://www.asus.com/support/FAQ/1049829/

debianのインストール手順が悪いのか、SSDが壊れたのか判断がつかなくてSSDをもう一個買った
結果、インストール手順が悪かったと思われる。
EFIリムーバブルメディアパスにGRUBインストールを強行しますか?とでた場合にYESでよかった。
リムーバブルメディアパスというのが、USBのことだと思ってて、USBにインストールされても面倒だな。と思いNOを選択していたのがよくなかった。
https://ja.wikipedia.org/wiki/%E3%83%AA%E3%83%A0%E3%83%BC%E3%83%90%E3%83%96%E3%83%AB%E3%83%A1%E3%83%87%E3%82%A3%E3%82%A2

asusのClear Secure Boot keysしたら、Install default Secure Boot keysが表示されるのでそこから戻せた。

https://www.qualityology.com/tech/disable-asus-motherboards-uefi-secure-boot/#Select-%E2%80%9CClear-Secure-Boot-keys%E2%80%9D-You-will-have-the-option-%E2%80%9CInstall-default-Secure-Boot-keys%E2%80%9D-to-restore-the-default-keys-after-you-cleared-the-Secure-Boot-Keys

Select “Clear Secure Boot keys” (You will have the option “Install default Secure Boot keys” to restore the default keys after you cleared the Secure Boot Keys)

Secure Boot keysを一回削除したあたりから、なんかうまくいかず、default Secure Boot keysに戻したあたりでうまくいった気がするけど、原因であったのか?不明。

もうすぐ、debianの最新版が出る。1ヶ月後くらい。

debianはめちゃくちゃ派生?クローン?されててすごいなと思った。ubuntuはdebianのUnstable、Testingを使って作られてた。
https://askubuntu.com/a/701364

ディズニーシー

Soaring

ssh RemoteForward

ssh -R 1111:localhost:2222
で開いたportに接続する側はport 1111に接続する。いつも2222に接続してエラーがでる

ユーフォルビア・魔界麒麟綴化

かっこよくないですか、ゲームに出てきそうですよね

サボテン

IMG_5623

ubuntuのpcを起動しておいて、macから繋げるようにした

やったこと

<->はsshのRemoteForward
<-はssh

  1. windows <-> gcp <- mac
  2. ubuntu <-> gcp <- mac
  3. ubuntu <-> gcp <- mac
  4. ubuntu <-> azure <- mac
  5. ubuntu <-> aws <- mac

最終的には

ubuntu <-> aws <- mac

  • ubuntuからawsにRemoteForwardでssh
  • macからgcpにssh

https://man.openbsd.org/ssh
RemoteForwardで接続した

なぜやったか

  • パソコンは2年に1回くらい買い替えたい
  • Thinkpad X1 Extreme Gen2の2019年モデルを2020年に買った時に、なるべくメモリとSSDを小さくしたが24万円台だった
  • Corei7 13700、DDR4 32GBメモリ、SSDは家にあったやつを使って自作PCを作成したら12万円台でできた
  • 半額で毎年新しくできるのであれば嬉しい
  • 自作PCにはUbuntuを入れて、外からsshすればなるべく快適に最新のPCを使えると思った
  • しかし、自宅のネットワークには固定IPがないので、外から自宅のPCにsshできない
  • いろいろ調べたところ、sshのRemoteForwardを使えば、自宅のPCから外のPCにsshできることがわかった

詰まったところ

気をつけたいところ

  • AzureはPublicIPが有料だった
  • マザーボードがwifiついてなかった

GPT-4に聞いてみた。What is a Reverse SSH Tunnel?

A Reverse SSH Tunnel is a technique used to create a secure communication channel between two hosts, typically through a firewall or NAT (Network Address Translation). It involves establishing an SSH (Secure Shell) connection in the opposite direction of a standard SSH connection, allowing a remote host to initiate a connection back to the local host.

In a standard SSH connection, the local host (client) initiates a connection to the remote host (server). However, in some cases, the remote host may be behind a firewall or using a NAT that prevents incoming connections. A reverse SSH tunnel can bypass these restrictions by initiating the connection from the remote host to the local host.

The process involves the following steps:

The local host starts an SSH server and listens for incoming connections.
The remote host, which is behind a firewall or NAT, initiates an SSH connection to the local host.
During the connection setup, the remote host specifies a local port to be forwarded and a remote port to listen on.
The local host accepts the connection and binds the specified local port to the forwarded remote port.
The local host can now initiate connections to the remote host through the bound local port, effectively bypassing the firewall or NAT on the remote side.
Reverse SSH tunnels are useful for various purposes, such as remote administration, accessing internal services, and establishing secure connections in otherwise restrictive network environments.

deeplの翻訳
リバースSSHトンネルは、2つのホスト間で安全な通信チャネルを作成するために使用される技術であり、通常はファイアウォールやNAT(ネットワークアドレス変換)を介して使用されます。標準的なSSH接続とは逆方向にSSH(Secure Shell)接続を確立し、リモートホストがローカルホストに戻る接続を開始できるようにするものです。

標準的なSSH接続では、ローカルホスト(クライアント)がリモートホスト(サーバー)への接続を開始する。しかし、場合によっては、リモートホストはファイアウォールの背後にあったり、着信接続を防ぐNATを使用していることがあります。逆SSHトンネルは、リモートホストからローカルホストへの接続を開始することで、これらの制限を回避することができます。

このプロセスには、次の手順が含まれます:

ローカルホストは、SSHサーバーを起動し、着信接続をリッスンします。
ファイアウォールまたはNATの背後にあるリモートホストが、ローカルホストへのSSH接続を開始します。
接続の設定中に、リモートホストは転送するローカルポートとリッスンするリモートポートを指定します。
ローカルホストは接続を受け入れ、指定されたローカルポートを転送されたリモートポートにバインドします。
ローカルホストは、バインドされたローカルポートを通じてリモートホストへの接続を開始できるようになり、リモート側のファイアウォールやNATを効果的にバイパスすることができます。
リバースSSHトンネルは、リモート管理、内部サービスへのアクセス、制限のあるネットワーク環境での安全な接続の確立など、さまざまな用途に役立ちます。

azureのインスタンスを固定IPで無料で運用できなそうだった

静的 IPv4 アドレスが有料だから
https://azure.microsoft.com/ja-jp/pricing/details/ip-addresses/

awsは1つなら無料でできそう
https://repost.aws/ja/knowledge-center/elastic-ip-charges

azureにインスタンス立てた

Warning: remote port forwarding failed for listen port xxxx

RemoteForward(-R [bind_address:]port:host:hostport)するとき

使うコマンドがこれだとして -R 11111:example.com:22222

11111をインスタンス上で受信ポートを解放すると、RemoteForwardできず Warning: remote port forwarding failed for listen port xxxx のエラーが発生する。

インスタンスに入り、sudo lsof -i | grep xxxx すると、 xxxxをLISTENしているポートが見つかるのでkill -9で消すが、即座に別のプロセスがたちあがる。

なので、受信ポートとして、11111を解放しない

permissionでどれを付与すればいいか不明

数字 分解 意味 英字
7 4 + 2 + 1 読書実行 rwx
6 4 + 2 読書 rw-
5 4 + 1 読実行 r-x
4 4 r--
3 2 + 1 書実行 -wx
2 2 -w-
1 1 実行 --x
0 0 なし ---

https://linux.die.net/man/1/chmod

エラーをうまく扱いたい

エラーハンドリングをほぼやらないでSentryに任せるだけでやってきたが問題が出てきたので調査した。

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error/Error

JavaScriptのエラーは5パターンの引数の受け取り方があるようで、便利に見えたのはこの1つ。

Error(message, options)

optionsはobjectでキーcauseを持っています。
エラーのre throwに使われる。
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error/cause

stack traceを引き継いでくれるようです。便利。

JavaScriptをブログ上で実行したい

JavaScriptをブログ上で実行したいと思ったので色々調べました。

思いついたのは、MDNのサイト上の埋め込みとVSCodeでした。

MDNのやつはこれ。
https://developer.mozilla.org/en-US/docs/MDN/Writing_guidelines/Page_structures/Code_examples#try_it

VSCodeは調べてみるとMonaco Editorでした。

あと、TypeScriptのPlayGroundもありますね。
https://www.typescriptlang.org/play?#

エディタは実装できそうでしたが、コードの実行はどうするんだろうと思い調べると、普通に文字列を実行していました。
https://github.com/mdn/bob/blob/main/editor/js/editable-js.js#L81

これを組み合わせれば実行できそうですね。

あとはiframeに埋め込まれてました

new Functionを使って文字列を実行すると危ないかもしれない。MDNのように、iframeに閉じておくべきか

iframeに閉じた。

https://github.com/kajirikajiri/monaco-editor

mdnのbobのコードを真似してコード実行環境をブログ上に作成した。

monaco editorを使ったので、補完が効いてmdnよりいい感じになった気がする。

mdnのbobはどうやってconsole.logを出力してるんだ?console.logを上書きでもしてるのか?と思ったら本当に上書きしてた。

あとchatGPTの解説が良すぎる気がする。とてもわかりやすい。

最近for await ofをよく使うが、Promiseを先に共通化しとけばいいやんと思って、共通化したら、1回目のループでPromiseが解決して、2回目以降のPromiseが即解決するというミスをした

サブドメインを一つだけ許可する正規表現を考えた

/\Ahttps?:\/\/[^.]+\.example\.com\z/

readme.comのAPI_DEFINITION_IDはどこにある?

この形式のURLにアクセス。
https://dash.readme.com/project/YOUR_DOMAIN/VERSION/reference

例えば以下のURLになる。
https://dash.readme.com/project/example-project/v1/reference

アクセスすると、API Settingsページが開くので、Your API Definitionsセクションへ移動。ID: xxxxxxという形式で記載されている。

また、API_KEYは https://dash.readme.com/project/YOUR_DOMAIN/VERSION/api-key にある。

いづれかのkeyがあればそれを使うし、なければ作ればよい。

ググっても全くヒットしなかったので、readme.comのドキュメントがもう少し検索にヒットしやすいとうれしい。

axios-mock-adapterで個別に遅延させたい時

個別に遅延させたい時

プロミスで返信できる
https://github.com/ctimmerm/axios-mock-adapter/issues/232#issuecomment-576822968

mock.onGet('/any').reply(function(config) {
 return new Promise(function(resolve, reject) {
   setTimeout(function() {
       resolve([201, null]);
   }, 2000);
 });
});
const withDelay = (delay, response) => config => {
 return new Promise(function(resolve, reject) {
   setTimeout(function() {
       resolve(response);
   }, delay);
 });
});

// And then use it:
mock.onGet('/any').reply(withDelay(2000, [201, null]));

一括で遅延させたい時

delayResponseを使う

https://github.com/ctimmerm/axios-mock-adapter#example
https://github.com/ctimmerm/axios-mock-adapter/blob/4d68a19e46c08e7b636d575087abf9982a67858b/README.md#example

// All requests using this instance will have a 2 seconds delay:
var mock = new MockAdapter(axiosInstance, { delayResponse: 2000 });

今週末の出来事

烏山付近に行った後に、リサイクルショップを巡りながら下北沢に行ってきた

メキシコ雑貨屋さんでサンタと雪だるまのフェルトを買えてえい満足

メンテした
https://github.com/kajirikajiri/eslint-plugin-mui-path-imports

1passwordを導入中
求めていたものだと思う
パスワード、秘匿情報、口座とか全部まとめれる。

あと、ブログのアクセス数が30日で400超えてる。mau400?
じわじわと増え続けてる

nem.io/downloadsがない

ここから最新のzipをダウンロードして
https://github.com/NemProject/NanoWallet/releases

readmeにあるとおりに、start.htmlを開いて、あとは以前までと同じようにできる
https://github.com/NemProject/NanoWallet

walletのrepositoryはこれ
https://github.com/NemProject/NanoWallet

公式サイトが移行したっぽい
https://nemproject.github.io/nem-docs/pages/Guides/nanowallet/nanowallet-explorer/docs.en.html

githubがわからないともはやwalletにすらアクセスできないのはびっくり。開発者じゃないとむりやんとおもいました
よく紹介してある、walletをダウンロードするリンク先は以下ですが、存在しないといわれます。
https://nem.io/downloads/

xem公式とかでググると、https://nemproject.github.io/が見つかりますが、いまいち信用できんな。。とおもったけど、リポジトリとか確認したらそれっぽかったので信用した。

スマホの通知を止めて見えなくした

メインの口座とクレカ、仕事の通知はONにした

iPhoneはホーム画面から取り除くことできるようになったので、ホーム画面のアプリを全部消した

https://support.apple.com/ja-jp/guide/iphone/iph248b543ca/ios

これでホーム画面には何もなくなった

ホーム画面に通知アイコンが見えると開きたくなってしまうので、それがなくなったのが嬉しい

マネーフォワードアプリを消した

結論として、時間が勿体無いと感じたため。

プレミアムを契約していたし、1日5回くらい見てたけど、その時間が勿体無いなと思った。

20個くらいは口座とかクレカを連携していた。

口座は1つにして、クレカも1つにして時間がかからないようにした。

無料アカウントの連携数が10から4になったが、それが原因ではない。

https://moneyforward.com/customer_news/vuUE2Nwg8IrcKD6XCp4O2Q

熱海

熱海駅にきたよ

image

これは秘宝館のいりぐち

image

プリン屋さん

image

image

issuconが気になる

issuconで高得点出せるようになれば、いろんなことに対応できそう。
パットしか見てないから、もう少し調査が必要かもしれないけど。
おそらく直近のやつを見た。そのときに記憶に残ったもの

  • sqliteで書かれたシステムを修正する
  • 高得点が出るようにする

ということはある程度出来上がったシステムがあって、それに改善を加えてパフォーマンスを良くするのかな?
無から有を作るのとはまた違いそう。
場当たり的な対応力だけでも対応できそう。
お題は毎回異なると思う。
パフォーマンスチューニングを求める会社はおそらくある程度成長した会社である。

こんな感じか。どうかなー、楽しそうではあるなー

この人のリンク先が良さそうだった。
https://zenn.dev/tohutohu

早速デザインの勉強が役に立ったよ

大体一致することをHuman Interface Guidelinesから参照してドキュメントに記載できた

利用者はデバイスが変わったとしても同じ並びを期待するはず。なぜなら、、、みたいなところに参照として貼り付けておいた。
自分がデザイナとして権威があれば不要かもしれないが、現在の本職はエンジニアなので、権威があるドキュメントを示せる場合、相手に対して説得力が増すはず。

https://developer.apple.com/design/human-interface-guidelines/foundations/layout

Design a consistent layout that adapts gracefully to context changes, while displaying the same content as much as possible. People expect your experience to work well and remain familiar when they rotate their device, resize a window, add another display, or switch to a different device. Ensure an adaptable interface by respecting system-defined safe areas, margins, and guides and specifying layout modifiers to fine-tune the placement of views in your hierarchy.

べったら市に行ったよ!

明日も行こうかなー

べったら

AppleのHuman Interface Guidelinesを読むよ

リンク

トップページの感じはGoogleのMaterial Designと似ている。

ガイドラインのナビゲーション

ナビゲーションを理解しておき、いざという時に使えるようにしておく。

  • Platforms: プラットフォームごとにまとめられている。端末の特徴とか書いてた。
    • Overview
    • Designing for iOS
    • Designing for iPadOS
    • Designing for macOS
    • Designing for tvOS
    • Designing for watchOS
  • Foundations: デザインに関連することのそれぞれのまとめって感じ。役に立ちそう
    • Overview
    • Accessibility: これはMaterial designと対比できそうで良い。44pt vs 48dpって感じで。
    • App icons
    • Branding
    • Color
    • Dark Mode
    • Icons
    • Images
    • Inclusion
    • Layout
    • Materials
    • Motion
    • Right to left
    • SF Symbols
    • Typography
  • Patterns: 入力についてやフィードバックについてなど。役に立ちそう。
    • Overview
    • Accessing private data
    • Charting data
    • Collaboration and sharing
    • Drag and drop
    • Entering data
    • Feedback
    • File management
    • Going full screen
    • Launching
    • Live-viewing apps
    • Loading
    • Managing accounts
    • Managing notifications
    • Modality
    • Multitasking
    • Offering help
    • Onboarding
    • Playing audio
    • Playing haptics
    • Playing video
    • Printing
    • Ratings and reviews
    • Searching
    • Settings
    • Undo and redo
    • Workouts
  • Components: Material Designは細かい数値が書いてあるけど、HIGはそこまで書いてない。ただ、それぞれのコンポーネントの使い方が書いてある。
    • All components
    • Content
    • Layout and organization
    • Menus and actions
    • Navigation and search
    • Presentation
    • Selection and input
    • Status
    • System experiences
  • Inputs: 入力に使う対象について書いてある。Apple独特なものかもしれない
    • Overview
    • Action button
    • Apple Pencil and Scribble
    • Digital Crown
    • Focus and selection
    • Game controllers
    • Gyro and accelerometer
    • Keyboards
    • Pointing devices
    • Remotes
    • Spatial interactions
    • Touch Bar
    • Touchscreen gestures
  • Technologies: Apple独特のものかもしれない
    • All technologies
    • AirPlay
    • Always On
    • App Clips
    • Apple Pay
    • Augmented reality
    • CareKit
    • CarPlay
    • Game Center
    • HealthKit
    • HomeKit
    • iCloud
    • In-app purchase
    • Live Photos
    • Mac Catalyst
    • Machine learning
    • Maps
    • Messages for Business
    • NFC
    • Photo editing
    • ResearchKit
    • SharePlay
    • ShazamKit
    • Sign in with Apple
    • Siri
    • Tap to Pay on iPhone
    • Wallet

DeepL proを課金した

9000円で年払い

material design 3のサイトを自動で翻訳して欲しくて拡張機能を入れて課金したが、メインコンテンツが翻訳されなかった。ナビゲーションとフッターだけ翻訳されるかんじ。。。
まあ、他のやつでも使えるのでok

Obsidianがバージョン1になったようです

https://obsidian.md/1.0
そのうち使ってみる

Material Design 3とMaterial Designのドキュメントの読み方をメモ

モチベーション

  • いつも使っているmuiを使いこなしたい
    • たまにここのパディングはなぜこの大きさ?と聞かれた時に感覚で。。という感じになってしまうため、デザインの理由を説明できるようにしたい
    • jestでa11yを使ってテストを書いているけど、a11yのことをよくわかってないので理解してテストを書く速さを上げたい。
      • ついでにa11yも良くなればなお良い
    • デザインできるエンジニアってカッコ良さそう

確認したサイト

https://material.io/
https://m3.material.io/

バージョン3のナビゲーションを確認

本でいう目次にあたると思う。ここは大事だと思うのでまずはここから把握。

  • Home: 今じゃない気がする
  • Get started: 今じゃない気がする
  • Develop: 今じゃない気がする
    • Android12
    • MDC-Android
      • Getting started
      • Color theming
      • Dark theme
      • Shape theming
      • Typography theming
      • Canonical layouts
      • Motion
    • Additional libraries
  • Foundation
    • Accessibility: この辺は良さそうだった。jestのテストを書くときに役立ちそう
    • Adaptive design
      • Overview
      • Design for large screens: Margin, Columns, Guttersのあたりが良さそう。これも説得力ありそう
      • Canonical layouts
      • Foldable devices
    • Customizing Material
    • Design tokens
    • Interaction states
    • Material A-Z
  • Styles
    • Color
      • Overview
      • Color system
      • Dynamic color
    • Icons
    • Shape
    • Typography
  • Components: これは良さそうだった。コンポーネントごとにpaddingとかが書いてあり、これをもとにデザインしてますって言えば説得力ありそう
    • Components
    • Buttons
      • All buttons
      • Common buttons
      • FAB
      • Extended FAB
      • Icon buttons
      • Segmented buttons
    • Bottom app bar
    • Bottom sheets
    • Cards
    • Chips
    • Dialogs
    • Divider
    • Menus
    • Navigation bar
    • Navigation drawer
    • Navigation rail
    • Progress indicators
    • Radio button
    • Slider
    • Switch
    • Text fields
    • Top app bar
    • Widgets

気になったこと

昭和記念公園に行ったよ

コスモス咲いてたよ!

image

噴水があったよ!
噴水

金木犀咲いてたよ
金木犀

髪を切ったよ

踊ってばかりの国のライブに行くよ🏃

なんかモヤかかってるー🥜

積立NisaやNisaの売却優先順を決めたよ

前提
Nisaとは積立NisaとNisaのことです。
普通の積立は課税口座で積立したやつです。

2022/10/25

検討すべきことを追加します。
積立Nisaは保持した期間が長くなるだけ、利益が増えるはず。であれば、非課税とはいえ、早期に売るということはその後には利益が増えたはず。つまり利益が増えれば非課税額も増えるので、その分損しているような気もする。

まあでも非課税期間が終了した後は結局また株を買うか、特定口座にそのまま移すんだろう。そして寝かせ続けるだろうから、まあ、どれから売っても一緒な気はする。
であれば、その時になるべく現金を多く得られるようにするのがいいかな。例えばNisaじゃないやつは20%くらい税金とられるはずだから、Nisaから取り崩した方が、同じ額ならNisaの方が現金を多くえられるはず。

あと現金とか株の割合が気になる。みんなどんな感じなのかね。

あとこれ強くない?
eMAXIS Slim 米国株式(S&P500)
購入時手数料: なし
信託財産留保額: なし
運用管理費用: かなり低い(マネックス証券のidecoラインナップで見比べると一番低い。 https://www.dcnenkin.jp/search/product.php?mode=show&item=784)

https://emaxis.jp/pdf/web/viewer.html?file=/pdf/koumokuromi/253266/253266_20220723.pdf#page=7
https://emaxis.jp/fund/253266.html

以下2つのリンク先を見る限り、主な費用は上記3つ。それがほとんどかからないということになる。

一般社団法人投資信託協会
https://www.toushin.or.jp/investmenttrust/costtax/index.html

松井証券
https://www.matsui.co.jp/service/fund/study/cost/

これってつまり

  • 全米株式に賭けれるので、大体は年利10%で増える。
  • 損失が出て損切りするとしても、利益がでて利確するときも費用がかからない。
  • 運用時の費用は低い。

ということで相当強い気がする。
例えば、ちょっと試しにやってみて、急に現金が必要になったとしてうるとしても、その期間の下落or上昇+運用管理費用しか取られない。便利だなー

あと、idecoで eMAXIS Slim 米国株式(S&P500) に掛けれるのは、SBI証券 | マネックス証券 | 松井証券だけっぽい。

https://www.am.mufg.jp/service/ideco/sales_slim.html

楽天だと積立Nisaはあるけど、idecoはないとか。そういうことがあるので注意。

2022/10/02

売却優先順

  1. 利益が出てるNisa(非課税だから)
  2. 普通に積立で損失が出てるやつ(損益通算できるから)
  3. 利益が出てないNisa or 利益が出てる積立

洞洞にきたよ

どうどうじゃないよ、ほらほらだよ!

image

途中でオモチャカボチャ

image

ネロリっていうハーブティー屋さんも行った

image

あとはメキシコの雑貨屋さんと、MoMAって言う雑貨屋さん

image

あとはダルトンでフィッシュがついたバターナイフとアナログキッチンタイマー買った

あとはスプラトゥーン3やってた

千葉ポートパークにきたよ!ナッツパーティー🥜

衣以ときたよ🐼

image

image

NakamuraEmi
うたってる

TypescriptでUnionの一部を取り出す方法

最近知った。これは便利!

type Animal = {
    type: 'cat',
    name: string;
} | {
    type: 'dog',
    age: number;
};
type Cat = Extract<Animal, {type: 'cat'}>
type Dog = Extract<Animal, {type: 'dog'}>

この辺の公式の例とかリテラルの場合のみ記載ありで最初気づかず
https://www.typescriptlang.org/docs/handbook/utility-types.html

VSCodeでExtension開発中にCommand 'XXX' resulted in an error (Webview is disposed)のエラーが発生した

vscode.commands.registerCommandの第一引数のコールバックでvscode.window.createWebviewPanelを実行するとこのエラーがなくなった。

vscode.commands.registerCommandの第一引数のコールバックの外でvscode.window.createWebviewPanelを実行し、戻り値を使ったらエラーが発生した。

前回必要と思ったVSCode拡張できた

これであとはPlantUMLで作成したSVGを読み込ませれば、一覧で確認できる。
設定はjsonファイルに持たせたので、gitで管理できるはず。

https://user-images.githubusercontent.com/37785038/183708953-6931fbe5-059e-4094-a28a-414457d50357.mov

PlantUMLとRDRAとVSCode拡張機能

会社で設計スキルがもう少し欲しいなという気持ちになって、色々本を読んだ結果、RDRAに書いてあることが、今の自分が困っていることまさにそのものだった。このへんが特に気になった。

影響力の大きい人が、雑誌や技術プレゼンに触発されてスタートさせたようなプロジェクトにありがちなケースが「コンセプトの不在」です。システムについてのアイディアがあり、ブレーンストーミングによって有望なアイディアがいくつもでてきます。そのアイディアを検証または分析すべく、役割を決めて作業を始めます。そして、その結果を持ち寄り、またブレーンストーミングします。プロトタイプを作成し、実現可能性や機能の有効性を検証します。一ヶ月がたち、アイディアがそこそこ形になり、この業界流行りの魅力的なセールストークがちりばめられています。でも、リーダーは何故か「これでいいのだろうか」という疑問を感じています。「分かってきたことは沢山あるけれども、そのひとつひとつがどうもうまくつながっていかない。細部をみると面白いことや今までになかったものができ上がってくるように思える...でも結局いまひとつ製品の全体像がつかめていない。これで本当にシステムのイメージが固まるのだろうか……」。

神崎善司. モデルベース要件定義テクニック (Japanese Edition) (Kindle の位置No.413-416). Kindle 版.

アイデアはどんどん広がっていくが、イメージが固まらない。
結局その時は、コンセプトに戻って、最小用件を決めた。

しかし、スムーズに決まったとは言えない。もっと快適に作業できるはずと思っていた。
RDRAは全体を図にして、理解しやすくする感じ。
それぞれの境界を明確にし、アクションを一つ一つ検証していく。
例えば、利用者、外部サービス、内部、ブラウザアプリ。
それぞれに接点がある。利用者はブラウザを操作し、結局は内部のDBにデータを保存したり、外部サービスにアクセスしたりする。
それらを完璧にとは言わないが、全体を洗い出す。
こんな感じのことが書いていた。

これは、最近フロントを書いている時にも意識していたあたり。
結局は利用者がブラウザという境界からしか操作できない。その操作ごとに、データや見た目に変化が起こる。それを洗い出し、テストを書けばいい。そういった経緯もあり、何かしっくりくるところがあったので、PlantUMLや、Miro、FigmaでRDRAを書こうとしたが、Miro、Figmaは管理しづらい。やはりGithubのようなもので管理したい。他にも色々検討はしたが、PlantUMLが良さそうという結論に至った。
ただ、ちょっと、ソフトウェアの限界があったので、補助的なものをVSCodeの拡張機能で作成している。Chrome extensionとReact, Nextjs、それとElectorも検討したが、VSCodeの拡張にした。

https://user-images.githubusercontent.com/37785038/183293400-b5a35d4b-cec4-449f-8804-b30ced987e57.mov

必要だと思ったのは一覧性。
SVGを複数読み取り、表示できればよかったのだが、見当たらなかったので作成中。
PlantUMLで作成したSVGをまとめて閲覧するのに使う

RDRAの読み方はラドラです。

RDRA:ラドラと呼びます。
神崎善司. モデルベース要件定義テクニック (Japanese Edition) (Kindle の位置No.259). Kindle 版.

衣以と港の見える丘公園にきたよ

港が見えるよ🐼

image

日傘と衣以🐼

image

アメリカとフランスがあったよ🇫🇷🇺🇸

image

夜は中華食べるよ

githubがおすすめするコミットの書き方、プロジェクトの構築の仕方を読んだ

Write Better Commits, Build Better Projects

最近、コミットを書いていて思っていたことが全て書かれていた。

ソリューションを全部書き出すと

シナリオを作成し、それに合わせてコミットを再編成する。

それぞれのコミットメントを "スモール "と "アトミック "の両方にする。

コミットメッセージには、何をしているのか、なぜそれを行っているのかを記述してください。

こうなっている。元記事を全部ちゃんと読んでください。以降は感想です。

これらは順番に、適応されている。

最初はwipコミットが含まれ、途中でリファクタし、別の関心ごとにふれているように見える。

これではPull Request(以降でPRとする)を投げられた方はたまったものではない。

だけど、最初から、全てのソリューションを適用したコミットを書くのは個人的にはできない。

コードを読み、wipコミットを加え、途中でリファクタし、別のことが気になってしまう。

おそらく最初はそれでいい。

もちろん、最初から完璧なものが書ければそれでいい。

でも、やってみたけど、それはできなかった。

だから、PRを出す前に綺麗にしよう。

リファクタは最初に済ませよう。

途中で気づいたリファクタでも、きっと最初に切り出せるものがあるはず。

それはもう、別のPRに切り出して、リファクタのPRを出せばいい。

とはいえ、難しいこともある。

リファクタだって、意味があるから。

今の流れだと、リファクタをして、その後に本来追加しようとした機能が入るはず。

その文脈があるから、そのリファクタが成り立つと思う。

そういうところが個人的には難しい。

ちなみに、この文章自体が、ごちゃごちゃで、リファクタが必要な文章だけど、走り書きなので許してください。

もし、別の関心ごとに触れたくなったら、それはそれで別のPRにしよう。

大体は、PRの前にレビューがあるから。

レビュワーの時間を大事にしましょう。

そうやって、一つのPRの関心ごとを一つの事柄にすれば、おそらく1 PRは 1コミットになるんじゃないか?と最近思っている。

また、コミットはリバートできるべき、というのも最近思っていること。

戻したら壊れるコミットを本流のブランチ、mainとかmasterに含めれるのはおかしい。

いざというとき、戻すのに時間がかかってはいけないはずだから。

こういったことをやっていけば、mainブランチを見ると、これまでの歴史が分かりやすく積み重なったブランチが完成すると思っている。

ただ、ここまでくると、githubが最適ではないのでは?とも思う。けど、今は置いておきます。

そういえば最近思ったことがもう一つ。

PRを出す前にrebaseして綺麗にしよう。

レビューとレビューの間にrebaseすると、以前のレビューとの差分がわからなくなるらしいです。

だから、レビュー前に綺麗にしよう。

マイナポイント第2弾を受け取ったよ

これですね

施策1は既に受取済みだったので

施策1
マイナンバーカードの新規取得等
最大 5,000円分のポイント
マイナンバーカードを新たに取得し、マイナポイントの申込み後、20,000円までのチャージまたはお買い物をすると、ご利用金額の25%のマイナポイント(上限5,000円分)を受け取ることができます。
マイナポイント第1弾に申し込んでいない方が対象です。
2021年12月末までにマイナポイント第1弾に申し込んだ方で、まだ20,000円のチャージやお買い物を行っていない場合(最大5,000円分までポイント付与を受けていない方)は、上限(5,000円分)までポイントの付与を受けることができます
・マイナポイント申込み期限:2023年2月末
・マイナンバーカードの申込み期限:2022年9月末

施策2と施策3を申し込みました

施策2
6/30スタート!
施策2
マイナンバーカードの健康保険証としての利用申込み
7,500円分のポイント
お持ちのマイナンバーカードを、健康保険証として利用できるよう申込み、マイナポイントの申込みをするとマイナポイントを受け取ることができます。
まだ利用申込みが済んでいない場合、マイナポイントの申込みの際に一緒に申込めます。
6月30日のマイナポイント申込み開始より前に、マイナンバーカードの健康保険としての利用申込みを行っていた方も対象です
・マイナポイント申込み期限:2023年2月末
・マイナンバーカードの申込み期限:2022年9月末

6/30スタート!
施策3
公金受取口座の登録
7,500円分のポイント
ご自身の預貯金口座を国(デジタル庁)に登録し、マイナポイントの申込みをするとマイナポイントを受け取ることができます。
マイナポイントの申込み完了後に、公金受取口座の登録をすることもできます。
・マイナポイント申込み期限:2023年2月末
・マイナンバーカードの申込み期限:2022年9月末

楽天ポイントで受け取り成功しました

通常ポイントでの付与でした

楽天ペイアプリではマイナポイントとして楽天ポイント(通常ポイント)を進呈致します。
楽天ポイントについては楽天ペイアプリをご利用した街でのお買い物のほか、通常の楽天ポイントと同様に様々な用途でお使いいただけます。
マイナポイントは楽天ペイアプリからお申し込みいただけます。
詳しくは以下の特設ホームページをご参照ください。

ポイント運用ができるやつにしようと思い、楽天、ペイペイで迷いましたが、ペイペイは1%手数料で引かれるので、楽天にしました

Raspberry pi をJavaScriptで動かせるらしい

https://paiza.hatenablog.com/entry/2022/02/02/150000

Raspberry pi picoで温度取得

成功しました

スクリーンショット 2022-07-02 21 52 53

Raspberry pi picoを外部電源で起動できない

main.pyというファイルにすれば動くらしい

。。。動かんな

Thonnyで保存した後に、Thonyを終了してから電源を切ったら成功しました。

Raspberry pi picoをm1 macでLチカ

私の横で今チカチカしております

とりあえずはまったところ

ファームウェアのインストール

公式サイトからダウンロードしてインストールした

ドラッグアンドドロップしたらUSBが接続解除された!!

どうやらこれで正常な挙動

その後、公式サイトからエディタをダウンロード

qiitaアメブロを参考にプログラムをコピペ

動きましたー

最終目標はエアコンの制御です

IMG_2878

てかスイッチとかないじゃん

オンオフはパソコンからやりました

温度センサーはついてるらしいけど

そこらへん試してからー

スイッチつけれるならつけたいなーパソコンからオンオフは面倒なのだ

USBから給電だけするから、あとはcronで動いてほしいのだ

赤外線の送受信も欲しい

受信した赤外線情報を保存する容量も欲しい

wifiもつけれるならつけたい、有線でもいいけど

Figmaのautolayoutがめっちゃ便利になってる

ビビった

今日つかったんだけど、直感的に使えた

以前のautolayoutよりいいです

5/10日にリリースされたようだ
https://www.figma.com/community/file/784448220678228461

リリース一覧
https://releases.figma.com/

npm package作った

https://github.com/kajirikajiri/eslint-plugin-mui-path-imports

muiを使ってて、開発環境のhotreloadを早くしたい人におすすめ

import { Box } from '@mui/material';
↓
import Box from "@mui/material/Box";

muiはこうすると、開発環境で読み込みが早くなるのです。

mui公式が言ってるし、実際読み込むモジュー数が10000くらい減るので間違いない

BEFORE

event - compiled successfully in 287 ms (11756 modules)
wait  - compiling...
event - compiled successfully in 384 ms (11756 modules)
wait  - compiling...
event - compiled successfully in 301 ms (11756 modules)
wait  - compiling...
event - compiled successfully in 298 ms (11756 modules)

AFTER

event - compiled successfully in 69 ms (1867 modules)
wait  - compiling...
event - compiled successfully in 72 ms (1867 modules)
wait  - compiling...
event - compiled successfully in 64 ms (1867 modules)
wait  - compiling...
event - compiled successfully in 84 ms (1867 modules)

私の開発環境でテスト済み。

リンク集

mui公式: importサイズを小さくする
https://mui.com/material-ui/guides/minimizing-bundle-size/

eslint公式: ruleの作り方
https://eslint.org/docs/developer-guide/

eslint公式: ruleの詳細
https://eslint.org/docs/developer-guide/working-with-rules

mdn公式: named import
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/import

awsexplorer: eslintのルール作るときに個人的に必須
https://astexplorer.net/

autofixリポジトリ
https://github.com/aladdin-add/eslint-plugin/tree/master

eslint-plugin-importリポジトリ
https://github.com/import-js/eslint-plugin-import/blob/main/src/rules/no-import-module-exports.js

autofixのリポジトリが紹介されてる
https://qiita.com/the_red/items/2725246044a225174d98

eslintのルールの作り方
https://blog.scottlogic.com/2021/09/06/how-to-write-an-es-lint-rule-for-beginners.html

eslintのルール作成
https://flexport.engineering/writing-custom-lint-rules-for-your-picky-developers-67732afa1803

typescriptでeslintのルールを作る
https://blog.sa2taka.com/post/custom-eslint-rule-with-typescript

zenn: named import
https://zenn.dev/captain_blue/articles/javascript-import-braces-memo

githubでpatchした

面白いコマンドだったよ

merge commitをrebaseしたら差分が消えたので、diffとってpatchしたー

https://beyondjapan.com/blog/2019/08/git-diff/
https://git-scm.com/book/ja/v2/Git-%E3%81%A7%E3%81%AE%E5%88%86%E6%95%A3%E4%BD%9C%E6%A5%AD-%E3%83%97%E3%83%AD%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%81%AE%E9%81%8B%E5%96%B6

Reactテストライブラリでよくある間違いの記事を見つけたよ

react-testing-libraryのメンバーに入っているKent C. DoddsReactテストライブラリでよくある間違いの記事を書いてるのを見つけたので読む。

内見した

今日は西馬込に内見🐼

メゾネットというタイプですた📦

部屋の中に階段があればメゾネットなんじゃないですかね?

コンクリート打ちっぱなし、デザイナーズマンションっていうんですかね?

かっこよかった、ウッドデッキもよいかんじ🪵

計算機

適当に作ってみた
https://calculate.app.kajiri.dev/

今日はエラーメッセージを追加した

reduceで早期リターンしたい

これっぽいな
https://stackoverflow.com/a/47441371

第4引数があったのか。

なるほどね、処理対象を直接変更することで処理が完了したように見せるのか。

forEachループで設定された変数が誤った型になるよ

実装してて困ってたんですよねー

letで定義して、forEachで副反応を実装しました。

そしたら、初期値で代入したやつしか出てこない

これ

以下を読むとそういうことになったらしい。トレードオフ。

https://stackoverflow.com/questions/67084305/variable-set-in-foreach-loop-getting-wrong-type

This is one of the trade-offs of the control flow analysis.
By annotating the type string | null you tell the compiler the variable, obviously, expects a value of either type. You then make an assignment to null, which lets the compiler narrow the type to null.
You expect that TypeScript accounts for the assignment inside the callback and forgoes the narrowing, but it does not. This is a trade-off the team made when deciding whether mutations happening in functions passed as parameters to higher-order functions should leak to the outer scope.
See this source repo discussion on the matter.

ちょっと参照先のgithub issueがcomment多すぎて全部読めないが。
どうやら、callbackが確実に呼ばれるかどうかわからないから初期値のままにすることにしたっぽいが?
foreachで言えば配列の要素数が0の可能性があるし。まあ、しょうがないのか。

試してみたけど、どうやら、初期値を代入せずにtypeguardで型を確定させてやれば使えそう

これがいいかなー

recursiveFindを実装したい

っていう気持ちになった

既存のやつがあるんじゃ?と思って探したが、問題を発見した。

よく考えてみたら、特定のobjectの形式で特定のkeyだけを探したいとか要件が色々あるので、既存のやつだと厳しいと思われる。

独自実装するか

Promiseを復習した

そういうことだったのねー
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Promise/allSettled

axiosの絡みとかも見といた

少々忘れてる箇所とかあったが問題ない。テスト書きまくってるからね

その着せ替え人形は恋をする

アニメ一気に全部見ました!

勝手な思い込みで、雛人形の擬人化アニメだと思い込んでましたが違いましたよ

そのビスクドールはこいをする

吉祥寺にさんぽ🚶‍♀️

えいといくよ🐼

物件みてくるよ🏠

やっと日傘をさせて嬉しいえい⛱

ランチ調査えい🐼

テラス席にすぐにひかれるえい☀️

お昼はサンドイッチになりました🥪

image

コンクリートにわんこ🐶

image

晩御飯は空野豆腐🫘

半年前にえいときたお店🐼

名物の空野豆腐🫘

image
image

豆乳ブルーベリーと豆乳抹茶🫐🍵
image

たまご🥚
image

今度は猛毒豆腐🫘食べてみたいな

特定のrepositoryを定期的に監視したい

以前の記事で書いたやつを参考にgithub actionsで定期的に結果を出力したい

特定repositoryの最新のmain | master | release | ?? をshallow cloneする。

  • ex) react, mui, hook-formとか
  • 対象のrepositoryは増えうる
    qiita

以前の記事を参考にして、コマンドを実行

  • 特定repositoryで、最も深い階層にいたファイルのリンクを出力
  • 特定repositoryで、ファイルサイズが大きいものからtop 10~20のリンクを出力
  • 条件は増えうる

md形式などでファイルを作成し、prを自動作成 or 自動マージ

zenn

派生

おすすめのcommit messageとか欲しい。
できれば、関数の内部に定義した関数の数とかも知りたい。

今日の調査内容

この先、調べようかなって思ってること

OSS
ゲーム
webgl
unity

typescriptのobjectにreadonlyはあるが、privateはまだなかった

https://www.typescriptlang.org/docs/handbook/utility-types.html#readonlytype

4.8くらいで出るかな。

Unityで出力できるプラットフォーム

結構いろいろなプラットフォーム向けに出力できるなー
https://docs.unity3d.com/ja/2018.4/Manual/Standalone.html

最近バグを生み出した書き方

JavaScriptです。関数b, dが実行前に評価されてしまった。
本当は実行時に評価したかった。

失敗

({
    a: b()
    c: d()
})[t]

成功

({
    a: b
    c: d
})[t]()

classの無い言語を調べた

最近発売された、良いコード/悪いコードで学ぶ設計入門 ―保守しやすい 成長し続けるコードの書き方 単行本(ソフトカバー) – 2022/4/30が、いい感じだと思ったが、TypeScriptのclassが個人的に好きじゃないので、classが存在しない言語ではどうしてるんだろうって気になった。

https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q12239608832

c言語でpolymorphism

https://chris-wood.github.io/2016/02/12/Polymorphism-in-C.html

本を読んだ

TITLE: David Bryant. Sustainable Web Development with Ruby on Rails: Practical Tips for Building Web Applications that Last . David Bryant Copeland. Kindle 版.

To make better technical decisions, you need access to more information than simply what someone wants the software to do. Do you know what economic or behavioral output the software exists to produce? In other words, how does the software make money for the people paying you to write it? What improvements to the business is it expected to make? What is the medium or long-term plan for the business? Does it need to grow significantly? Will there need to be increased traffic? Will there be an influx of engineers? Will they be very senior, very junior, or a mix? When will they be hired and when will they start?

より良い技術的な決定を下すためには、誰かがソフトウェアに何をさせたいかということよりも、もっと多くの情報にアクセスする必要があるのです。そのソフトウェアがどのような経済的、行動的成果を生み出すために存在するのか知っていますか?言い換えれば、そのソフトを書くためにお金を払っている人たちにとって、そのソフトはどのようにお金を生み出すのでしょうか?そのソフトウェアはビジネスにどんな改善をもたらすと期待されていますか?そのビジネスの中長期的な計画は何でしょうか?大きく成長する必要があるのでしょうか?トラフィックを増やす必要がありますか?エンジニアの流入はあるのか?そのエンジニアは、上級なのか、下級なのか、あるいは混合なのか?彼らはいつ採用され、いつ入社するのか?

The average tenure of a software engineer at any given company is pretty low, so I’m assuming that the software will outlive the team, and that the group of people charged with the software’s maintenance and enhancement will change over time. I’m also assuming the experience levels and skill-sets will change over time as well.

ソフトウェア・エンジニアの平均勤続年数はかなり低いので、ソフトウェアはそのチームよりも長持ちし、ソフトウェアの保守や改良を担当する人々のグループも時間とともに変化していくと想定しています。また、経験値やスキルセットも時間とともに変化していくものと考えています。

githubのコミットに#を使いたい

git config --global commit.cleanup whitespace

or

[commit]
    cleanup = whitespace

ディレクトリを深くするかファイル内に書き込むか

調査内容

  1. 階層の深さを見る
  2. ファイルサイズの大きいものを見る

1はこんな感じ
find . -type f -mindepth 10 | grep ".js" | grep -v "node_modules"

2はこれでいいでしょう
find . -type f -size +100k | grep ".js" | grep -v "node_modules"

調査対象

facebook/react
1: max 14
2: 観察中

githubのfast-forwardとは

githubでのfast-forward

git-scmをDeepL翻訳
別の言い方をすれば、あるコミットを最初のコミットの履歴をたどれば到達できるコミットとマージしようとするとき、Git はポインタを先に進めることで物事を単純化します。なぜなら、一緒にマージすべき分岐作業が存在しないからです。

backlog
このbugfixブランチをmasterブランチにマージする時、masterブランチの状態が以前から変更されていなければ、非常に簡単にマージを行うことができます。 bugfixブランチの履歴はmasterブランチの履歴をすべて含んでいるため、masterブランチは単純に移動するだけでbugfixブランチの内容を取り込むことができます。なお、このようなマージをfast-forward(早送り)マージと呼びます 。

qiita
ブランチXと、そこから切ったブランチYがあるとする。
YがXでの変更をすべて含むときに行われるマージをfast-forward(早送り)マージという。
つまり、分岐後に、元ブランチXにおいて変更がないときに行われるマージのこと

git-scmをDeepL翻訳
現在のブランチヘッドは、指定したコミットの先祖であることがよくあります。これは、特に git pull から実行した場合によくあるケースです。上流のリポジトリを追跡していて、ローカルでは何も変更しておらず、より新しい上流リビジョンに更新したい場合です。この場合、結合した履歴を保存するための新しいコミットは必要ありません。代わりに、余計なマージコミットを作成せずに HEAD (とインデックス) を更新し、指定したコミットを指すようにします。
この動作は --no-ff オプションで抑制することができます。

github
your enterprise上のプルリクエストでSquash and merge(squashとマージ)オプションを選択すると、そのプルリクエストのコミットは1つのコミットにsquashされます。 トピックブランチからコントリビュータの個々のコミットをすべて見る代わりに、コミットは1つのコミットにまとめられ、デフォルトブランチにマージされます。 squashされたコミットを持つプルリクエストは、fast-forwardオプションを使ってマージされます。

stackoverflowをDeepL翻訳
あるコミットと、最初のコミットの履歴をたどれば到達できるコミットをマージしようとしたとき、Git は一緒にマージする分岐作業がないため、ポインタを先に進めることで物事を単純化します。これを "早送り" といいます。
詳しくは : http://git-scm.com/book/en/v2/Git-Branching-Basic-Branching-and-Merging
別の言い方をすると
master が分岐していない場合、git は新しいコミットを作成する代わりに master に feature ブランチの最新コミットを指すようにします。これは "早送り" です。
マージの早送りでは、「マージコミット」は発生しません。

fast-forward

早送りという意味

英辞郎
〔テープ・録画映像などを〕早送りする

weblio
(テープ・ビデオなどの早送り

あとがき

mergeのとき、他に取り込む変更がなければ、ポインタを移すだけと理解した。

たまに、ffとかfast-forwardとか聞くけど、そこまで気になってなかった
今日は暇だったので調べてみた。

GitHub進化!!

Note
This is a note

Warning
This is a warning

Note

This is a note

Warning

This is a warning

https://github.com/github/feedback/discussions/16925

jest-previewでintegration-testが楽になった

integration-test

react-testing-libraryなどを用いた、JS-DOMのテストだと思っています。

楽になったポイント

既存のinteration-testが失敗した場合、その時のDOMが表示されるはず。以下のような。

<div>
  <span>hello</span>
</div>

jest-previewを導入すると、失敗した瞬間にその時の画面の状態がブラウザに表示されます。
DOMを確認するより、画面を確認する方が直感的にどこが失敗したのか分かりやすいので、とても助かる。

皇居のアジサイ

image

コナンくん

最近はよく、えいとコナンくんの映画をみてるよ👓🎬

20個くらい見たきがするなー

今日はストリートの亡霊だよ👻

axiosをmockしたが、useSWRの戻り値がmockされない

症状

axiosをfetcherにしてuseSWRを使っていた。

統合テストを書こうと思い、axios-mock-adapterでmockした。
しかし、戻り値がmockされない。

対策

useSWR公式のMiddlewareの説明zennの記事をみて、Middlewareにしたら戻り値をmockできた。

あとがき

jest-previewで確認しても、処理の直前、直後でlogを出力しても解決できなかったのでなかなかてこづった。

症状の詳細として、1つのテストだと成功するが、2つ以上のテストだと失敗した。

stackoverflowに沿って修正してみても効果なしだった。

TypeScriptでelseを書きたくないがthrowもしたくない

例えば、名前を取得する関数があるとする。
犬ならpochi、猫ならtamaだ。

ifで書いて、もう片方をelseにするか。
これは個人的に好きでない。animalが増えると、elseに入ってしまう。
playground

const getName = (animal: 'cat' | "dog") => {
    if (animal === 'cat') {
        return 'tama'
    } else {
        return 'pochi'
    }
}

ifで早期リターンするか。
これも同様にanimalが増えると、elseに入ってしまう。
playground

const getName = (animal: 'cat' | "dog") => {
    if (animal === 'cat') return 'tama'
    return 'pochi'
}

elseにして、throwするか。
これはまあまあ好き。場合によるけど、throwしなくてもいいケースはあるのでそこらへん微妙。
playground

const getName = (animal: 'cat' | "dog") => {
    if (animal === 'cat') return 'tama'
    if (animal === 'dog') return 'pochi'
    throw Error()
}

最近のTypeScriptは賢いので、switchにするとdefaultを書かなくてもundefinedを返さないので、その時のコードは美しい。
が、animalが増えた時にundefinedが戻り値に含まれてしまうのはいただけない。
playground

const getName = (animal: 'cat' | "dog") => {
    switch (animal) {
        case 'cat': return 'tama'
        case 'dog': return 'pochi'
    }
}

これがいいのではと最近思っている。
animalが増えると、TypeScriptが型エラーを吐いてくれるのでとてもわかりやすい。好き。
playground

const getName = (animal: 'cat' | "dog") => {
    return {cat: 'tama', dog: 'pochi'}[animal]
}

ワイフがお呼びです

Solanaのprogramのrent

最近はSolanaに興味がある。

Devnetへのデプロイは成功した。

Solanaはstepnで使われてるのが最近は盛り上がってるようだ。

個人的に気になったのは、うる覚えだが、rentが、デプロイ時に確定。2年分を定額で収める。以降のrentは不要というもの。
後々、定額ではなくなるっぽい記述があったし、まだbetaなので動的になるだろうと思ってる。
というのも、見た感じ初回以降のデプロイではrentが不要である場合、初回のprogramを超軽量でデプロイして、以降のデプロイで容量を増やされると困るだろうと感じたから。
ただ、容量の上限は10mbだったと思うので、そこまで問題ないのかな?

ディズニーランド行く

えいと行くよ🐼

すき家でご飯食べたよ🍚

京葉線に乗ったよ🚃

とても暑いよ🫠

yo-yoチェケyoー by えい🐼

バズライトイヤーはかじ7000点だった、えい10万点だった、えいすごい🐼

スティッチはaiだった機械学習すごい🤖

スターウォーズは怖かった、ジェットコースターではないけどな🤠

スモークチキンレッグうま🍗

ピザうま🍕

イッツアスモールワールド平和🕊

フィルハーマジックは水がかかったよ💦

広場をキャラクターが走ってくよパレード🏳️‍🌈

ティポトルタうま🤤

キノピオ平和🕊

ピーターパンは浮いてた🧚‍♀️

ホーンテッドマンションは暗いよ、クルクルまわるよ💫

白雪姫は平和🕊

クルーズは平和です、船長がハイテンション⚓️

最後にエレクトリカルパレード🧚‍♀️

image

吉野家でネギ塩豚丼食べて終わりー

いい天気だった☀️

「楽天モバイル」から「povo2.0」へのりかえた

「楽天モバイル」から「povo2.0」へのりかえた。

楽天モバイルから新料金プランへ自動移行すると発表がありました。

私のメイン回線はIIJmioの4gb。
IIJmioの容量がなくなった時に予備として楽天モバイルを使用していました。

予備ということもあり、直近の楽天モバイルの利用履歴はほぼ0だった。

image

image

image

新しい楽天モバイルよりpovo2.0 の方が必要な時だけトッピング方式なので、自分の用途にあっていると判断し、移行した。

また、ラッキーなことに、povo2.0 からキャンペーンが来た。

一日データ無制限にできるクーポン10回分。

以下メール内容

■コードの入力期限
2022/08/31
■コードの利用回数
10回
※本コードは上記の回数繰り返し入力できます。
※利用した回数を確認することはできません。別途メモをとるなどしてお忘れなきように願います。

5/31まで新規加入で貰えるよう。
image

画像に電話番号乗ってるけど、もう使ってないやつ!

クーポンは早速、ディズニーランドで使わせていただきました♪

えいと内見

石神井公園あたりに行きます
2つの物件を見てきます
ふふーん!

ふぐ屋さんにいたふぐ🐡
ふぐ

Github discussionsをブログに変換したよ。Gaasと名付けよう

やってること

Github actionsのcronで1日1回webhookをcurlでpostする。
webhookはCloudflareのDeploy Hook。
CloudflareでNext.js のSSGビルドが実行され、静的ファイルホスティングする。

本体は以下のページ

https://github.com/kajirikajiri/jamstack-tech-blog/discussions/categories/scrawl

discussionsをcurlで取得するテスト

curl -H "Authorization: bearer TOKEN" -X POST -d " \
 { \
   \"query\": \"query { viewer { login }}\" \
 } \ " https://api.github.com/graphql

curl -H "Content-Type: application/json" \
  -H "Authorization: bearer TOKEN" \
  -X POST -d '{"query": "query {repository(owner: \"kajirikajiri\", name: \"jamstack-tech-blog\") {description}}"}' https://api.github.com/graphql
  
curl -H "Content-Type: application/json" \
  -H "Authorization: bearer TOKEN" \
  -X POST -d '{"query": "query {repository(owner: \"kajirikajiri\", name: \"jamstack-tech-blog\") {discussions(first: 10) {nodes {id} edges { node {id} }}}}"}' https://api.github.com/graphql

curl -H "Content-Type: application/json" \
  -H "Authorization: bearer TOKEN" \
  -X POST -d '{"query": "query {repository(owner: \"kajirikajiri\", name: \"jamstack-tech-blog\") {discussions(first: 10) { totalCount }}}"}' https://api.github.com/graphql

curl -H "Content-Type: application/json" \
  -H "Authorization: bearer TOKEN" \
  -X POST -d '{"query": "query {repository(owner: \"kajirikajiri\", name: \"jamstack-tech-blog\") {discussions(first: 10) {nodes {title}}}}"}' https://api.github.com/graphql

curl -H "Content-Type: application/json" \
  -H "Authorization: bearer TOKEN" \
  -X POST -d '{"query": "query {repository(owner: \"kajirikajiri\", name: \"jamstack-tech-blog\") {discussions(first: 10) {nodes {title body bodyText}}}}"}' https://api.github.com/graphql
  
curl -H "Content-Type: application/json" \
  -H "Authorization: bearer TOKEN" \
  -X POST -d '{"query": "query {rateLimit { limit cost remaining resetAt } repository(owner: \"kajirikajiri\", name: \"jamstack-tech-blog\") {discussions(first: 100, after: \"CURSOR\", categoryId: \"CATEGORY_ID\", orderBy: {field: CREATED_AT, direction: DESC}) {edges {cursor node {id title body}}}}}"}' https://api.github.com/graphql
  
curl -H "Content-Type: application/json" \
  -H "Authorization: bearer TOKEN" \
  -X POST -d '{"query": "query {repository(owner: \"kajirikajiri\", name: \"jamstack-tech-blog\") {discussionCategories(first: 10) { nodes{id name} }}}"}' https://api.github.com/graphql

作成の参考にしたページ

Github
https://docs.github.com/ja/graphql/overview/resource-limitations
https://docs.github.com/ja/graphql/reference/objects
https://docs.github.com/ja/graphql/reference/objects#discussion
https://docs.github.com/ja/graphql/guides/migrating-from-rest-to-graphql
https://docs.github.com/en/graphql/guides/using-the-graphql-api-for-discussions
https://docs.github.com/ja/graphql/guides/forming-calls-with-graphql#example-query
https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/creating-a-personal-access-token

Cloudflare
https://developers.cloudflare.com/pages/platform/deploy-hooks

GraphQL Variables
https://dgraph.io/docs/graphql/api/variables/

GraphQL APIをfetchメソッドで叩く方法
https://zenn.dev/mayo_dev/articles/fetch-graphql-api

curlでGraphQLの長いqueryを投げる
https://qiita.com/ikemura23/items/ff5af3775006c3f7fb0c

giscus
https://giscus.app/ja

stackoverflow
https://stackoverflow.com/questions/52601436/graphql-how-to-handle-prev-page-next-page-last-page-and-first-page-properly
https://stackoverflow.com/questions/42021113/how-to-use-curl-to-access-the-github-graphql-api

Next.js で Markdown ブログを作る
https://blog.chick-p.work/next-js-blog/

Reactでマークダウンエディタ作成とマークダウンからHTMLに変換(ハイライト付き)
https://qiita.com/t_okkan/items/0a3318f90ee6c4468f82

marked.jsを利用してMarkdownをHTMLに変換
https://www.wakuwakubank.com/posts/699-javascript-markedjs/

Test markdown

This README can be used as a reference for github-flavored-markdown styling (and possibly behavior).


H1

followed by some text

H2

followed by some text

H3

followed by some text

H4

followed by some text

H5

followed by some text

H6

followed by some text

Auto-detected link: http://www.france.com

Some Ignored_multiple_underscore_italics here

A line of normal text with inline code and italics, strong font, and even some μ†ℱ ╋ℯ╳╋. Followed by lots of Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis id sem purus, eu commodo tortor. Donec malesuada ultricies dolor a eleifend. In hac habitasse platea dictumst. Vivamus a faucibus ligula. Nullam molestie tristique arcu, eu elementum metus ultricies sed. Aenean luctus congue lectus, vitae semper erat rhoncus non. Nulla facilisi.

Followed by another line of normal text with inline code and italics, strong font, and even some μ†ℱ ╋ℯ╳╋. Followed by lots of Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis id sem purus, eu commodo tortor. Donec malesuada ultricies dolor a eleifend. In hac habitasse platea dictumst. Vivamus a faucibus ligula. Nullam molestie tristique arcu, eu elementum metus ultricies sed. Aenean luctus congue lectus, vitae semper erat rhoncus non. Nulla facilisi.

Thin horizontal rule:

--

Thick horizontal rule:


Table Header 1 Table Header 2
Content http://example.org
Content http://localhost:\<port>
Text right below table. Follows is a table with an empty cell, and unaligned indenting.
Table Header 1 Table Header 2
Content Cntent
Content

Empty line between table and this text

def this_is
  puts "some #{4-space-indent} code"
end
def this_is puts "some #{code tag} code" end
def this_is
  puts "some #{pre tag} code"
end
def this_is
  puts "some #{fenced} code"
end
class Classy
  def this_is
    puts "some #{colored} ruby code with ruby syntax highlighting"
    @someobj.do_it(1, 2)
  end
end
var test = function this_is(){
  console.log("some" + colored + "javascript code with javascript syntax highlighting really long");
}
(defproject myproject "0.5.0-SNAPSHOT"
  :description "Some clojure code with syntax highlighting."
  :dependencies [[org.clojure/clojure "1.5.1"]]
  :plugins [[lein-tar "3.2.0"]])
var test = function this_is(){
  console.log("language declared as 'js' instead");
}
var test = function this_is(){
  console.log("language declared as bogus_language");
}

here is blockquote

Relative image link

Test from https://github.com/suan/github-flavored-markdown-test