project

Project

よいプロジェクトの条件として思い浮かぶこと。

  • ワクワクすること
  • 1ヶ月以内で終わること
  • 何か形として残ること
  • テストしやすいこと
  • 新しく学ぶことが絞られていること
  • 成功か失敗かわかりやすいこと
  • 他人からのフィードバックが得られること
  • 難しいと思えること

らいおんの隠れ家 : ポール・グレアム「良い後回し、悪い後回し」の、解くべき問題に取り組んでいるかのチェックリスト。

  1. あなたの分野でいちばん重要な難問は何ですか。
  2. それに取り組んでいますか。
  3. なぜ取り組んでいないのですか。

あなたとあなたの研究の、自分に才能をもちながら成功しない大勢の人の特徴。

  • 重要な問題に取り組まないこと
  • 問題に熱中しないこと
  • 難しい問題を状況を変え、簡単にできるがまだ重要な問題に代えないこと
  • なぜしないか言い訳を捜し続けること

Memo

道具を作る表現力

Well-grounded rubyistで、 最期の章はテストの原形をつくった。すごい。メタなものが扱えることは、作れるものの幅を大きく広げる。多くの人に、いろんな目的で利用される道具は抽象的だ。そういうものが作れるようになったら楽しいだろうな。

ゲーム作りの問題点

ゲームの問題点。遊ぶ人が自分だけであること。ゼロからやるのは楽しいが、自分の望むものが大きすぎて途中で飽きる。小さいツール類だと完全に自分用でも達成できる。どこかに提出する前提でやるのがいいか。最初にそういう会を見つけておいて、そのレギュレーションに合う形でやると。

Tasks

org idリンクの修正ツール

タイトルをリネームしたときに、ドキュメント全体のリンクもなおしてほしい。idがあるのだから、検索でわかるはずである。

ブラウザでシェルの実行結果を見る

  • GitHub Actionsの実行結果のイメージ
  • できればリアルタイムで

Pythonの雛形リポジトリを作る

Linter設定とかしておく。

GitHubリポジトリを自動設定するプログラム

CLIでURLを打つと、自動でその設定にしてくれるプログラム。というか、リポジトリの作成からやってくれる。リポジトリ設定のファイル化。すでにありそう。

  • デフォルトトークンの権限を読み書き可能にする
  • ブランチを自動削除する

関連するWikipediaの項目を出すプログラム

たとえばCPUと打ったら、CPUに関連する記事を列挙するような。

勉強するときに、ドバっとまとめて関連する分野の単語をおさえるのに使う。

Google ChromeのPDFでスクロールしたときにページ数を更新する

ページを自動更新してほしい。いや、ブックマークレットとかできそうな感じもする。

Google Meetのコメントを流して表示する

画面共有中に、ほかのタブでコメントを見られるようにしたい。流れるようにできればベスト。Chrome拡張でできそうなのがあったが、動かなかった。

  • X Window でやればできるだろう。コメントを取れるかはわからないが

バイナリの可視化ツール

バイナリかるたでやっているように、出現頻度で画像化したい。

create-link修正

org-make-link-stringを使ってリンクを組み立てるようにする。

TODO vtermが、負の前置引数を尊重してないように見える

vtermだけ実行できないのを調べる。eshellではできた。

TODO 郷土本

作る。

TODO denote renameをディレクトリ内の全ファイルに対して適用する

denote-rename-file-using-front-matter を全ファイルに対して実行したい。

TODO アセンブラの実行結果を可視化するツール

パラパラ漫画にすれば一瞬で理解できるように見える。

いい感じのものが見つからない。デバッガとは違うんだよな。

TODO 簡易メモ帳

Emacsからpecoみたいな感じで、あまり覚えてないテキストをインクリメンタル検索しながら呼び出せるようにする。

リンクのかぶりチェックツール

同じものを追加していることがよくあるので、検知できるようにする。

エレベーター実装

アルゴリズムを実装してみる。

コードドキュメント生成ツール

コメントとソースコードでいい感じのWebページに変換する。

TODO RFCページのように各段落にアンカーを設定できるツールを作成する

RFCのサイトでは各段落ごとでアンカーを設定できる。示しやすい。

  • PLATEAUのHTMLドキュメントでやろうとしたが、タグ構造が複雑で難しい。段落という概念がとれない
  • PDFをHTML化するとタグ構造はめちゃくちゃになっているため難しい

Chrome拡張のorg-captureを右クリックに対応させる

ボタンかショートカットキーからしかできないが、右クリックからできたら便利だろうな。

org-agendaのブラウザ表示

ブラウザでの表示をモダンにできるようにする。orgパーサーが必要か。

TODO コンテナダッシュボード

docker-composeで立てたコンテナを手軽に一覧できるようにする。

  • envconfig
    • 環境変数の読み込み、ないときはデフォルト値を設定する
  • signal.NotifyContext
    • シグナルをキャッチしてコンテキストをcancelさせる処理を楽に書ける
  • sync.RWMutex
  • webサーバ - クライアントはWebソケット。webサーバはdockerからのイベントを受け付け、それをクライアントに通知する
  • websocketConnectionとclientConnectionの違いはなんだ
    • WebSocketは、HTTPとは異なるプロトコルである
    • HTTPで接続を確立してから、UpgradeしてWebSocketで通信する
    • つまり両方は別のconnectionで、WebSocketで通信するには両方必要
  • ClientConnectionsは購読リスト。websocket接続を確立したクライアントごとにある
    • たとえばブラウザとcurlでリクエストを飛ばしたとしたら、ClientConnectionsの長さは2になる。
  • LogStoreやDocker構造体はどのリクエストでも共通

TODO バックエンドのコードを把握する

けっこう複雑で絡み合っていて、よくわかっていない。

読むというよりは、実際機能追加したみたほうがいいんだろうな。

TODO フロント側のコードを把握する

おそろくフロントのちゃんとした書き方なので参考になる感じがする。

TODO 検証しやすいようにする

ウェブソケットの確かめ方がよくわからない。どうやってデバッグすればいいのだろう。

各node数をカウントするコマンド

ASTテストが網羅しているか調べるツール。プロジェクト全体で見るのもおもしろそう。

golangci-lintを調べる

  • エラーが出るが、矢印が正しくないときがあるのを調べる
  • オフラインのとき解決に失敗するのを調べる
  • タグの形式をチェック。チェックできなさそうな気もする

シェルを実装する

理解したいなら実装してみればよい。なので、UNIXプログラミングが理解したければ、シェルを実装すればよい。

参考。

静的サイトジェネレータ

GitHub Actionsでリポジトリの一覧をHTMLできれいに表示できるようにする。

関数一覧からテストを自動生成する

テンプレートを生成する。あるいは、一覧から選択して作成してくれると良い。

テストをドキュメントに変換する

Emacs Lispのテストを書いている。HTMLに変換して、デプロイしてブラウザで見られるようにしたい。

org projectを1つのPDFにビルドする

メモ・日記が多すぎなので、1つのPDFで閲覧できるようにする。

探検記

いくつかネタがあるので探検記を書く。画像を大量に使う予定だが、いい感じに表示するためにはどうしたらよいだろうか。

テスト駆動のEmacs Lispチュートリアル

Goのテスト駆動のやつは非常によかった。Emacs Lisp版もあるとよさそう。自分の勉強がてら。

楽しい経路探索

どこかで言われていたこと。地図検索で最短距離でなく、楽しさや静かさを考慮した経路探索する。それらのスコア付けは、ユーザによる2つの画像の比較によって行われる。

org-modeのパーサ

解析してほかの用途へ使えるようにする。すでにありそうだけど練習に。

意味のない中間変数検知ツール

a := "aaa"
return a

のような明らかに意味のない中間変数をコード中から探すツール。変数名を扱うから構文解析が必要か。

いい感じの規模感のリポジトリを探すツール

言語ごとに行数、スター数から調べる。

行数が少ないものは読みやすい。

サーバレスかGitHub Actionsで定期実行して、加工して公開する。

PRの統計

GitHubから生産性について取れる情報はたくさんある。

有益な指標のリスト。エリート DevOps チームであることを Four Keys プロジェクトで確認する | Google Cloud Blog

  • デプロイの頻度 - 組織による正常な本番環境へのリリースの頻度
  • 変更のリードタイム - commit から本番環境稼働までの所要時間
  • 変更障害率 - デプロイが原因で本番環境で障害が発生する割合(%)
  • サービス復元時間 - 組織が本番環境での障害から回復するのにかかる時間

Dockerの時間統計

ビルド時間のステージごとの統計が取れたら便利だろうな。あるいはイメージ。

  • 統計情報の記録/取得
  • 保存
  • 表示

の2つになりそう。保存に関しては、GitHub Actionsが使えないだろうか。

yml-sorterのWEB版

docker-compose.ymlを並び替えたいが、ちょっと見たらweb版がない。需要ありそうだけどな。でも、docker-composeは単にソートすればいいってわけでもない。たとえばversionは一番上に書くのが普通だが、これは別にソートではない。キーワードごとで例外というか、優先度をつけなければいけなそう。

フォーマッタがありそうな。

simple covの結果を元に、PR毎にコメントを表示する

一般化できる方法で解きたい。

床屋シミュレータ

Programming Scalaの218ページ付近で紹介されている床屋シミュレータ。 グラフィカルにして動くのを眺めたい。

orgの文書lint

よい文書のための、特定の形式を満たしていることをチェックするlint。

たとえば。

  • コードブロックにはキャプションがついている
  • 見出しがネストしすぎてない
  • タイトルタグがついている
  • 見出しだけ(本文がなく)の項目がない
  • 特定の見出しが存在すること

simplecovのエディタ表示

すでにいくつかのエディタでは存在する。

読書ページ記録

pdf.jsでページ送りするたびに、その時刻が記録されるのはどうだろう。 ちょっと楽しい感じがする。前の時間との差分も計算する。

  • 1: 2021-11-13T20:21:20+09:00
  • 2: 2021-11-13T20:21:34+09:00 (14)

言語記述型のシミュレーション

Simutransを、言語記述でできないだろうか。

たとえば2つに画面がわかれていて、左側はエディタ、右側は画面が表示されている。左側でA = station(1, 2)とすると右の画面に駅が作られる。train(A, B)とするとA, Bを往復する列車が表示される。

method quiz

たとえばRubyのメソッド一覧から任意のものを取って表示する。 知ってるか、知らないかだけ。 ドキュメント、ソースへのリンクを飛ばす。

クラスも指定できるといいな。メソッドの開拓に使える。

ジャンルの指定とかもしてな。 ! がついてるやつとか述語メソッドとか。

各言語でのxmpfilter

xmpfilterはrubyのrcodetools gemsに付属しているコード。 実行結果アノテーションをつけて、行ごとの評価結果をファイルに出力してくれるので学習に便利。

DBゲーム

話がデカすぎてやる気が持続するとは思わないが。

自動生成操作をするプログラムをユーザに見立てて、dbアプリを作成する。出来ていくデータを眺める。とにかく重要なのは、生身のユーザを必要としないことだ。 基本的に眺める楽しさ。

viewは一切開発せず、直にパブリックメソッドを実行するbotを仮想ユーザとして考える。何かイベントを与えると必要なことを行おうとする。経営のダッシュボードだけ可視化できるようにして、あとはルールとして実装する。あとで変更しやすいように、テキストで全管理できるDBにしたいな。

  • 病院
  • レンタルビデオ
  • 人間関係ネットワーク。お互いに影響を与え合う様子。

パワポケのペナントモードという考え方もできる。チームという入力を入れると、試合データが出てくる。試合やチームによって、所属する選手は変化していく。それってシミュレーションゲーム。値を自由に入れることができないシミュレーション。 うむむ、DBを使う必要はあるんだろうか。

プログラムゲーム

最低限の世界のルールを定めておいて、それをプログラムで解決するゲーム。

世界のルール: 物体は質量を持つ、移動には費用がかかる、その枠の中で自由にプログラムできる、というもの。本質的には、ルールセットを記述して戦うロボット的なゲームに似ている。でもそうやって具体的なひとつのケースを見るのではなくて、全体を見るところが違う。

サウンドノベル・web

  • markdownを拡張してサウンドノベル用の文法を作る。
  • webでmdを読み込んで表示できるようにする。

バッジ出力ツール

たとえばカバレッジ出力などは乱立している。

References

practical-tutorials/project-based-learning: Curated list of project-based tutorials

プロジェクトベースのチュートリアル集。面白い。

Archives

CLOSE Textlint Web

  • もうすでにある。

CLOSE テキストベースのゲーム

diggerで、Rubyを使ってやった。

  • テストしやすいためテキスト主体。
  • ローグライク
  • アドベンチャーゲーム

CLOSE melpaクローン

ruby gemsのクローンのmelpa版。すでにあった。

DONE gemfile exporter

絶対もうあるが、便利コマンドの練習になる。

DONE stale-files-action

更新のないファイルを検知して、issueを作成し、一覧コメントをつけるアクション。

  • 更新のないファイル検知
  • issue作成
  • データを受け取って整形、コメント送信
- [ ] ./docs/ruby.org 2021-03-04 40days
- [ ] ./docs/python.org 2021-03-04 44days

変数情報

コメントの最後で、実行した条件を表示する。

カウント

stale総数 / 検索対象数、 パーセント。

DONE git-linkを展開する拡張

GitHub上でパーマリンクのコードが展開されるみたいに、リンクを評価するとコードを展開できるようにしたい。org-modeで使えれば便利だろう。

構想

echo "a"

a

と同様に、パーマリンクを書いて、評価する。元リンクもついているので、あとで元を辿ることもできる。ただこの場合の問題点は、シンタックスハイライトを効かせるのが難しいことか。いや、resultsにも効くな。とはいえ再評価すると消えてしまうのでビミョーではある。拡張子をそのまま結果に使えばよさそうだな。

echo “aaaa”

普通の関数としても使えるが、org-babelのひとつとして使うのがしっくりくるな。解決したい課題: コードを貼り付けたいけど、元の場所も示しておきたいとき。あとから参照できなくなるのもあるし、引用的にも元リンクはほしい。

  • リンク
  • コード

問題は、org-babelを使うのが正しい方法なのか、ということだ。

  • リンクと展開を別にできる
  • 再評価可能

実装

  • リンクをパースする部分
    • サイトを入れ替えられるようにする
  • 取得する部分
    • サイトを入れ替えられるようにする
  • 描画する部分
    • すべてのサイトで共通

DONE やったことの3D/VR表示(MVP)

何かやったことを3D表示したい。Gitとか組み合わせられないか。何かものの収集は、形があるのでたくさんやるほど結果が目に見えやすい。般若心経、ゴミヘビ。どこか行く系は距離で苦労が理解しやすい。

収集やかけた労力によってもっと好きになっていく循環ってある。みうらじゅんはそんな感じのことをよく言っている。

  • データ構造
    • 種別
      • リポジトリ
      • Web
        • Web
    • URL
    • 識別名

とりあえず文字表示は抜きにして、立方体と色で表示する。タスク数は、roamにhttpリクエストしてgrepする…。org側でjson出力とかできたらそれを取得するようにしたい。なかなか役立つ感じがするな。

途中まで完了。タスク表示はできてない。

org-roamのjson出力

タスクの情報を加工しやすくする。roam以外にも対応させたいが、メインは自分使用なので管理が2重になるのは避けたい。

roamの各ページで表示する

各ページでjson表示できるなら、roamの各ページで、タスクモデルを表示できそう。

マウスオーバーで情報表示

立方体のマウスオーバーでそのタスク名とリンクを出してくれたら最高。難しそうだが、価値はある。

入力方法の一般化

入力方式の規定、ブラウザでタスクの入力をできるようにすれば、ほかの人も利用できる。

TypeScript

整備しやすいようにする。また入門するか。

表示方法をわかりやすくする

今の積み重なっていく方式はベストでないように見える。ビジュアル的にもビミョーなので改善する。展示会でズラーっと並べられたゴムヘビのように、見て沸き立つものにしたい。

ベストなのはすべてのオブジェクトに画像と文字をつけることで、やったことがすべて違う形、見え方を持たせることだ。そういうのが100、200並んだのは遠くから見ても壮観だし、近くからじっくり見ることもできる。円周上に並べるのが良いのかな。

DONE github actionsライクなランナー [15/15]

必要なツールがインストールされてるか、宣言的に書いて診断するツール。なかったら実行できそうな場合は自動実行させる。

yamlで書き、ローカルで実行する。別にymlでなくてよくない、という感じはする。うむむ、目的がよくわからなくなってきた。GitHub Actionsのクローンを作ってみるでよくないか。面白そうだし、要件はこの上なく明確だ。

jobs:
  job_a:
    description: test
    steps:
      - name: a
        run: echo hello

実行結果が確認できる。

- job_a ✓
  - a ✓
    ログ...
  - b ✓
    ログ...
- job_b ✓
  - c skip
    ログ...
  - d ✓
    ログ...

目標としては、GitHub Actions用のymlをそのまま実行できること。

DONE データ構造を定義する

  • jobs(workflow)
    • job
      • step
        • task
        • task
    • job
      • step
        • task

DONE yamlをパースする

設定ファイルをパースする。

DONE 複数steps実行

stepsは順次実行。

CLOSE jobの並列処理

jobは並列実行。

  • どうしよう。ranを参考にしようにも、よくわからない
    • 何かのプログラミングパターンなんだ
  • 単にゴルーチンにすればいいような。とりあえずそれでやってみる

DONE ログを別フィールドにする

結果画面でjob, stepごとに一気に表示する。

DONE 実行結果にインデントをつける

cmd.Start()したときに自動で入ってしまうが、これにインデントをつけるにはどうしたらよいのだろう。

実行時は別のstdoutではない別のwriterに入れておいて、実行したあとにインデントをつけてstdoutに送信する。

DONE envキーワード追加

環境変数追加。

GitHub Actionsにはworkflow, job, stepであるみたいだが、とりあえずstepだけを実装する。

DONE ifキーワード追加

if条件式追加。

DONE logを楽に保存できるようにする

dockerの実装を参考にする。

が途中経過。

DONE steps数表示

steps数を表示してないので追加する。

DONE working_directory追加

cmdは独立してるので、単にフィールドに代入するだけでできた。

working_directory追加。

  • definition追加
  • 最初のディレクトリを記録
  • 実行前に指定ディレクトリに移動
  • 実行後に戻る

DONE 実行結果を表示する

並列処理するとめちゃくちゃになるので結果表示があると良い。成功、失敗、スキップあたりがあるとよさそう。

DONE 設定ファイル指定オプション

設定ファイルをコマンドラインオプションで指定できるようにする。また、デフォルトファイルを設定する。

CLOSE 使い方のサンプルを作る

自分で使うサンプルを示す。

DONE table driven test にする

テストの重複が多いので書き換える。

DONE 簡単なlintを作る

とりあえず識別子を判定するlint、テストをほぼコピペだけど作成した。

DONE Golangの全カバレッジ率を表示したHTML

すぐできた。

あると便利そう。すでにある可能性はある。

DONE oav機能追加

  • 連続でテストを実行できるようにする
    • テストで再現させる
    • load doc: error converting YAML to JSON: EOF
    • 一度読み込んだあとはこれが出るから、引数の値が変わっているように見える。ポインタではないけど
    • 一度走らせたあと、schemafileの入るbyteが空になるのを確認
    • Readerは、一度読み込みが終わると次読み込むときは中身が空になる。状態を保持している
    • bytes.Bufferを使うようにする
  • コマンドとして、パスをダンプできるようにする
  • GET以外に対応する
  • パラメータ追加に対応する
  • 出る画面をわかりやすくする

DONE プロジェクトで使う静的解析ツールを作る

Goでは簡単にlinterが作れるようだ。

  • モックを使ったとき、明示的にtimesを呼び出していることを確かめる
  • 無意味な関数コメントを検知

CLOSE Slackで倉庫番

のように、SlackをゲームのUIとして用いることができる。

DONE プレイヤーが移動できるようにする

コマンドラインで移動できるようにする。壁やマップ外には移動できない。

DONE 荷物を追加する

配置できるようにする。

DONE 荷物を押せるようにする

プレイヤーが移動する方向に荷物があって、空きスペースがあるなら移動できる。

  • プレイヤーと荷物の衝突判定。
  • 荷物と衝突した場合は、荷物で再度移動を試す。その方向に動けるなら、荷物とプレイヤーを動かす。荷物を動かせない場合は何もしない
  • いつのまにかプレイヤーが分身していた
    • 移動後に消えてない。コピーが作られているようだ
  • ポインタにしたらなぜか荷物entityがゴールentityになる
  • keyの座標と、entityの持ってる座標が一致してない

DONE クリア条件を追加する

すべて適当な位置に置くとクリア。

DONE 地図をテキストから読み込む

手作りで作って、ファイル化して複数読み込めるようにする。

DONE goalをtileに移動

動く可能性がないので。

DONE 地図生成時のバリデーション

縦横が同じサイズでないとエラーを吐くようにする。

DONE ファイル・ディレクトリの整理

どこにあるかわからなくなってきた。

DONE 地図を自動生成できるようにする[100%]

レベルを指定して生成してくれるようにする。生成ロジックを入れ替えられるように設計する。

  • プレーンなマップ生成
  • ランダムにゴールと荷物配置
  • ✓を定数にする
  • 壁をランダムに生成する
  • 逆に動かす関数作成
  • ランダムに動かす

DONE CUIモードに組み込む

ステージ生成を適用させる。

DONE 最初からリセット機能

  • 動けなくなったら最初の位置へリセットできるようにする
    • 変わらないな
    • スライスのメモリアドレスは違う
    • が、変更内容を明らかに共有しているように見える、ポインタが同じなのだろう
    • スライスEntitiesの中身はEntity構造体。構造体の中には、ポインタのフィールドもある。たとえばPosはポインタでないと移動を反映できないのでポインタにしている
    • ポインタをコピーしても、値は戻らない。向いてる先は同じ値なので
    • イテレートして手動でコピーするしかないのか

CLOSE サーバモード

echoで処理できるようにする。現在の地図と、移動方向を送信すると移動結果を返す。

CLOSE 統計保存

何かしらデータベースの機能を使う。

CLOSE デプロイ

サーバレスでどこかに上げる。

DONE webサーバをスクラッチ実装する

システムコールを使ってやる。

  • 標準入出力
  • ソケットを使う

DONE 倉庫番

でかいのに取り組むより、これくらいがよい。

  • 空間の実装方法が理解できる。

CLOSE 経済ゲーム

Practical Ruby Projectsに書いてあったやつ。経済シミュレーター。Moneyの知識と絡められないか。

DONE 環境構築ツール

assertとインストールコマンドをセットで書いてインストールするツール。

- cond: "cd ~/aaa"
  run: git clone aaa.git
  • とりあえず今のdotfileの内容をかきあげて、どんな感じにしたら便利かを探る。
  • バイナリにすれば、何もインストールされてないまっさらな状態から実行しやすい
    • もとのスクリプトはシェルだから、別にどこでも実行できるのは変わらないか
  • dotfilesを埋め込めないか

DONE gitのタグ番号をもとにファイルを書き換えるツール

  • 対象ファイルを指定できるようにする
  • .versionファイルを作成すればいいのでは、と考えた。古いバージョンはそれで特定すればよさそう

DONE Goアセンブラを出力するorg-babel

出力アセンブラを試すのが面倒なので簡単なのを作る。一般性はないのでMELPAには送れない。

package main
func main() {
      for i := 1; i <= 10; i++ {
	      print(i)
      }
}

main.main STEXT size=87 args=0x0 locals=0x18 funcid=0x0 align=0x0 0x0000 00000 (/tmp/babel-ZDNznW/go-src-AsiWm8.go:2) TEXT main.main(SB), ABIInternal, $24-0 0x0000 00000 (/tmp/babel-ZDNznW/go-src-AsiWm8.go:2) CMPQ SP, 16(R14) 0x0004 00004 (/tmp/babel-ZDNznW/go-src-AsiWm8.go:2) PCDATA $0, $-2 0x0004 00004 (/tmp/babel-ZDNznW/go-src-AsiWm8.go:2) JLS 80 0x0006 00006 (/tmp/babel-ZDNznW/go-src-AsiWm8.go:2) PCDATA $0, $-1 0x0006 00006 (/tmp/babel-ZDNznW/go-src-AsiWm8.go:2) SUBQ $24, SP 0x000a 00010 (/tmp/babel-ZDNznW/go-src-AsiWm8.go:2) MOVQ BP, 16(SP) 0x000f 00015 (/tmp/babel-ZDNznW/go-src-AsiWm8.go:2) LEAQ 16(SP), BP 0x0014 00020 (/tmp/babel-ZDNznW/go-src-AsiWm8.go:2) FUNCDATA $0, gclocals·g2BeySu+wFnoycgXfElmcg==(SB) 0x0014 00020 (/tmp/babel-ZDNznW/go-src-AsiWm8.go:2) FUNCDATA $1, gclocals·g2BeySu+wFnoycgXfElmcg==(SB) 0x0014 00020 (/tmp/babel-ZDNznW/go-src-AsiWm8.go:3) MOVQ $1, main.i+8(SP) 0x001d 00029 (/tmp/babel-ZDNznW/go-src-AsiWm8.go:3) JMP 31 0x001f 00031 (/tmp/babel-ZDNznW/go-src-AsiWm8.go:3) CMPQ main.i+8(SP), $10 0x0025 00037 (/tmp/babel-ZDNznW/go-src-AsiWm8.go:3) JLE 41 0x0027 00039 (/tmp/babel-ZDNznW/go-src-AsiWm8.go:3) JMP 70 0x0029 00041 (/tmp/babel-ZDNznW/go-src-AsiWm8.go:4) PCDATA $1, $0 0x0029 00041 (/tmp/babel-ZDNznW/go-src-AsiWm8.go:4) CALL runtime.printlock(SB) 0x002e 00046 (/tmp/babel-ZDNznW/go-src-AsiWm8.go:4) MOVQ main.i+8(SP), AX 0x0033 00051 (/tmp/babel-ZDNznW/go-src-AsiWm8.go:4) CALL runtime.printint(SB) 0x0038 00056 (/tmp/babel-ZDNznW/go-src-AsiWm8.go:4) CALL runtime.printunlock(SB) 0x003d 00061 (/tmp/babel-ZDNznW/go-src-AsiWm8.go:4) JMP 63 0x003f 00063 (/tmp/babel-ZDNznW/go-src-AsiWm8.go:3) INCQ main.i+8(SP) 0x0044 00068 (/tmp/babel-ZDNznW/go-src-AsiWm8.go:3) JMP 31 0x0046 00070 (/tmp/babel-ZDNznW/go-src-AsiWm8.go:6) PCDATA $1, $-1 0x0046 00070 (/tmp/babel-ZDNznW/go-src-AsiWm8.go:6) MOVQ 16(SP), BP 0x004b 00075 (/tmp/babel-ZDNznW/go-src-AsiWm8.go:6) ADDQ $24, SP 0x004f 00079 (/tmp/babel-ZDNznW/go-src-AsiWm8.go:6) RET 0x0050 00080 (/tmp/babel-ZDNznW/go-src-AsiWm8.go:6) NOP 0x0050 00080 (/tmp/babel-ZDNznW/go-src-AsiWm8.go:2) PCDATA $1, $-1 0x0050 00080 (/tmp/babel-ZDNznW/go-src-AsiWm8.go:2) PCDATA $0, $-2 0x0050 00080 (/tmp/babel-ZDNznW/go-src-AsiWm8.go:2) CALL runtime.morestack_noctxt(SB) 0x0055 00085 (/tmp/babel-ZDNznW/go-src-AsiWm8.go:2) PCDATA $0, \(-1 0x0055 00085 (/tmp/babel-ZDNznW/go-src-AsiWm8.go:2) JMP 0 0x0000 49 3b 66 10 76 4a 48 83 ec 18 48 89 6c 24 10 48 I;f.vJH...H.l\).H 0x0010 8d 6c 24 10 48 c7 44 24 08 01 00 00 00 eb 00 48 .l$.H.D$…….H 0x0020 83 7c 24 08 0a 7e 02 eb 1d e8 00 00 00 00 48 8b .|$..~……..H. 0x0030 44 24 08 e8 00 00 00 00 e8 00 00 00 00 eb 00 48 D$………….H 0x0040 ff 44 24 08 eb d9 48 8b 6c 24 10 48 83 c4 18 c3 .D$…H.l$.H…. 0x0050 e8 00 00 00 00 eb a9 ……. rel 42+4 t=7 runtime.printlock+0 rel 52+4 t=7 runtime.printint+0 rel 57+4 t=7 runtime.printunlock+0 rel 81+4 t=7 runtime.morestack_noctxt+0 go:cuinfo.producer.main SDWARFCUINFO dupok size=0 0x0000 2d 4e 20 2d 6c 20 72 65 67 61 62 69 -N -l regabi go:cuinfo.packagename.main SDWARFCUINFO dupok size=0 0x0000 6d 61 69 6e main main..inittask SNOPTRDATA size=24 0x0000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ……………. 0x0010 00 00 00 00 00 00 00 00 …….. gclocals·g2BeySu+wFnoycgXfElmcg== SRODATA dupok size=8 0x0000 01 00 00 00 00 00 00 00 ……..

DONE carve で取るタグが時系列順になっていない

古いタグが、最新になってしまっている。直す。

軽量タグを取れてなかったためだった。

DONE tiny file managerのアップロードスクリプトを作成する

特殊な状況用に作る。

  • ファイル指定できるようにする
    • 不要とする
  • ツールのヘルプ文を作る
  • goreleaserを設定する
  • 転送成功メッセージと転送先パス
    • アップロードしたあとどこに配置されるかはファイルマネージャの設定によるのでスキップ
  • curlのプログレスバーをリアルタイム表示する
  • サイズがでかくても成功するかを確認する
  • ユーザ・パスを指定できるようにする
    • まだいらない
  • クロスプラットフォームにする
    • シェルまわりがかなり違う
    • シェルを使わない形式に書き直した

DONE グラフ生成

さくっとグラフを作る。

DONE openapi3filterのミドルウェアの使い方を調べる

openapi3filterは、Go言語のAPIサーバとOpenAPIを連携させるライブラリ。

に例が書いてあるが、なぜこれで動くのかがわからない。

  • squareHanderとパスの紐付けはどこでやっている
    • 紐付けはしてなかった。パスによってハンドラが分岐してなかった
    • 1つのハンドラだけ
  • 実行テストはできたが、これをどうやってミドルウェアに組み込むか。テストするか
  • 少し不器用だが、Ginに組み込めた

DONE 通知ビューワを作る2

electronで作る。

前回の問題点は何か。

  • iframeの制約で遷移できなかった
  • よくわからないエラーで落ちる

メモ。

  • タブを切り替えたい
    • うまくいかない
    • できた。preload.jsを読み込んでないだけだった

設計。

  • フロントではタブの状態管理をする
    • UIとしては切り替えられればよい
  • バックエンド
    • ソースURL(feed URLとか)をもとに、エントリURL+タイトルの取得ジョブ実行
    • サーバ
    • SQLiteとのやりとり
    • エントリテーブルを作って、そこで管理する。既読がついてないものを返す
    • エンドポイント
      • 設定一覧

エントリのステート。

  • 未取得
  • エントリ取得
  • 同期ずみ
    • クライアントを起動しなおすと再度受信する
    • クライアントが取得時に排除するしかないのかな
    • クライアントが現在あるものをパラメータで送信するようにして、バックエンドはそれを含むと返さない、でよさそうか。やってることは同じだが、バックエンドから来る値をそのまま使えるほうが直感的だ
  • 既読
  • 全体の状態管理が必要。タブボタンとウィンドウは一致しなければならない
    • react側で状態管理する
    • 状態管理に対してメソッドを定義して、同時にIPC通信を実行させればよさそう
  • タブボタンを削除すると対応するウィンドウが削除される
  • 今はウィンドウのURLで判断して切り替えてるけど、複数ある場合はどうなるか
  • ウィンドウを開いたときに、IDを保存させる。IDを元にタイトルやURLだのにアクセスさせる
    • タイトルはタブが持ってるのでDBにはいらない可能性がある
  • ステートのデータ構造はどうするか
    • ViewのID
      • URL
      • タイトル
      • は、viewから取得できるのでいらない
  • ipcRendererの使い方がわからない
    • preload.tsで登録して使う
    • コピペしたコードにonはすでに登録してあった
  • main側のdom-readyは実行できてる
    • なのでsendはできてるように見える
    • 受信が原因か、送信が原因かわからない
    • 送信してるwindowを指定できてなかった。UIがあるwindowに送る必要がある
  • タブを消したあとに、新しいタブを開こうとするとエラーになる。前のタブにフォーカスしようとするからか
  • 取得の手順
    • 「10件取得」ボタンをつくり、それを押すと最大10個のリンクを取得してくる
    • 入力: 件数とすでにあるリンク一覧
    • 出力: 指定件数で、すでにあるリンクを排除したリンクを返す
  • フィードを書くところをファイルにするかデータベースにするか
    • ファイルだとGit管理できる。準備や説明が面倒。実装は楽
    • データベースだとブラウザでそのまま設定しやすい。UIの準備はやや面倒

DONE 監視ツールを試す

コンテナログを見やすくする。

  • Management -> Kibana -> DataViewでデータを追加。fluentdからうまく送信されていれば、indexの候補が表示される
  • Management -> Data -> Index Lifecycle Policies で削除設定を追加する。肥大化するので
  • kibanaは通知が有料だったので、途中でやめた。監視しても通知できなきゃ意味がない
  • 代わりにprometheusを使うことにした

CLOSE go playgroundからとってくるorg-babel

org-babelのGoは制約が大きいので。いっそplaygroundから取ってきたほうが便利そう。

すでにそういうパッケージがあったのでそれを使う。テストが実行できないな。

DONE 遮断プロキシを設定する

集中したいとき遮断できるようにする。

  • 今のプロキシのモード設定(priv, work, disable)
    • あまり起動設定変更しないし、いいか
  • システムのプロキシ選択状況表示(オフ、オン)
  • CLIでのプロキシモード切り替え

DONE PDF管理

本はPDFで買うことが多い。ストレージに置いているがわけわからない。2個買ってたりする。既存ツールでいいのがないか調べる。ファイル構造じゃなくて、タグで管理したい。バージョン管理したい。

ファイルとメタデータを紐付けられればよい。

ファイル。

{ID}_{タイトル}.pdf
{ID}.toml

- 20240303T201703_ふつうのLinuxプログラミング.pdf
- 20240303T201703.toml
- 20250101T191703_コーディングを支える技術.pdf
- 20250101T191703.toml
  • タイトルはPDF情報から取ってこれるので、コマンドでファイル名は自動生成する。IDがあるのでタイトルはかぶってもよい
    • PDFじゃないこともあるのでこれはまあいいか
    • ID以降はどうでもいい
  • tomlも同時に自動生成する。タイトルなどがある

TOMlファイル。

[book]
[book.basic]
title = "ふつうのLinuxプログラミング"
[book.todo]
name = "TODO"      # TODO || WIP || DONE
[[book.tag]]
name = "linux"     # 特定のタグしか許容しない
[[book.tag]]
name = "container" # 特定のタグしか許容しない
[タグ選択]

本一覧 # クリックするとpdf.jsで開く
--------
- ふつうのLinuxプログラミング [Linux]
- Docker book [Linux, Container]
  • idの変換ロジックは文字列でよいけど、ディレクトリとか絡んでくるとそれ用の型を使ったほうがいい

DONE ドラフトを解除するスクリプト

エントリのドラフト状態を解除するのが面倒なのでたまりがち。

  • コメントをすべて削除する
  • タグのdraftを消す
  • リネームを実行する

DONE 本棚のタグを直す

現在のページ分しかタグが出ないのを直す。

DONE PDFスライドを表示できるようにする

ブログにPDFスライドを追加した話 | κeenのHappy Hacκing Blogが面白そうだった。参考にして作成してみる。

  • 準備はPDFへのリンクを配置しておくだけ
  • サーバを起動させる必要はなく、配置するだけでクライアント上で動作する
    • リンクリストを読み取り、HTMLを生成できればいい
    • iframeリスト
  • リンク一覧ではサムネを表示する
  • スライド用PDFビューと、フルPDFビューへのボタンがある
  • スライド作成にいい感じのツールがない
    • drawio.svgのように閲覧と編集が同じファイルでできるのがベスト
    • 図がメイン
    • markdownでは表現できない
  • pdf.jsがぼやける。参考元と同じ設定なのに
    • ズーム率が高い設定になってただけだった…
  • CIで文字化けする
    • 手元で再現できた
    • ローカルで作ったPDFを見ると、全部TakaoPGothicになっている。何を選択しても全部。

CLOSE go packageをPlantUMLで出力する

理解しやすくする。

PlantUMLでエラーになる。よくわからない。Dumelsではなぜかできる。まあ見やすいし、サイトで確認するでいいか、ってなった。