作ったものとか技術とか一覧
動きが分かりやすいものの一部はここにまとまってるかも知れない:
Scala
Akka HTTP/Slick/JGitを使ったMarkdownでノートが取れるサーバーサイド(非オープン)
Akka HTTPを用いたHTTPベースのファイル転送サーバー
GitHub:
目的
アカウントなしでファイルを送り会える
curlやwgetのような他のCUIをインストールせずに使える
時間で削除されたりセキュリティ的なもの
好きなタイミングでの削除
などなど
Wikipedia Dumpの巨大XMLをApache Sparkで解析するためのloaderライブラリ
GitHub: https://github.com/nwtgck/spark-wikipedia-dump-loader
Apache SparkでWikipedia Dumpからword2vecの機械学習できるPlayground
GitHub:
実際にAmazon Elastic MapReduce(Amazon EMR)で動かした
ミニマックス法を使った絶対勝てない(はず)三目並べ(OXゲーム)
GitHub:
最善手を打ち続ければ引き分ける(はず)
Apache Sparkとjsoupを使った、JapanTimesの記事をカテゴリ別に仕分ける機械学習
GitHub:
記事のスクレイピングから機械学習までする
蟻コロニー最適化を用いた巡回セールスマン問題のソルバー
GitHub:
経路の可視化付き
レイトレーシングによる3Dグラフィックのレイトレーサー
GitHub:
名書「Ray Tracing in One Weekend」の実装で、カメラワークなどもあるアニメーションがある
GitHub:
こちらはリアルタイムに描画できるタイプ
うまく距離関数を定義すれば好きなレンダリングができる
GitHub公式ぽいリポジトリカードをSVGとして生成するサーバーサイド
TypeScriptに移行した。
GitHub:
ScalaのXMLリテラルを活用
GitHub APIの返却を一時的にRedisキャッシュしたりする
クライアントサイドはTypeScript/Vue
音声分析言語Praatのトランスパイラ
GitHub:
利点は、静的型付けなScalaをかけることで、IDEなどを使って安全で効率的なコーディング/リファクタリングができること
Scalaの構文木(AST)を辿りながらPraatに変換していく
Scala => Praatにトランスパイルできる
Node.jsを参考にしたイベントループの実装
GitHub:
ThreadやFutureなしで非同期処理ができる
TypeScript
Piping Server
VueとTypeScriptでPiping Server関連のWebアプリーケーションをいくつか
クライアントサイドでエンドツーエンド暗号化などの仕組み
メッセージチャット/通話/画面共有/手書き文字共有などがある
詳しくは、Piping ServerのリンクをたどればScrapbox内にページがある
「Markdownでノートが取れるサーバー」のクライアントをTypeScript/Reactで開発
ルービックキューブの回転記号からステップ・バイ・ステップでキューブをスクランブルできるWebアプリ
GitHub: https://github.com/nwtgck/step-by-step-cube-scrambler-react
TypeScript/Reactでの実装
ルービックキューブの回転記号を覚える用途
Scalaのcase classの#copy()メソッドをTypeScriptで実現するライブラリ
GitHub:
Qita記事: TypeScriptで型安全なScalaのcase classのcopyを作る - Qiita
npmでインストール可能
型安全にcopyを実現でき、間違った使い方をしてもコンパイル時に教えてくれるように設計
Tex形式の数式をコマンドライン上で美しいSVG画像として生成するコマンド
GitHub: https://github.com/nwtgck/math2image-npm
Qiita記事: 美しい数式をコマンドラインから生み出したい! - Qiita
npmでインストール可能
Crystal製の同じ用途のプロジェクトがある
GitHub: https://github.com/nwtgck/math2img
LaTeX形式の数式を画像にするためにDockerに依存している
その一方npm版の方は、Dockerへの依存がなくなっていて、そこが利点
Haskell
型安全に配線を可能にするMIPSアーキテクチャのシミュレーション(CPU)
GitHub: https://github.com/nwtgck/type-safe-mips-haskell
型レベルプログラミングをしている
数値計算の証明に近いものがHaskellとして記述されている
リストの長さが型付けされていて、リストのtakeやdropなどの演算と長さがどうなるかをコンパイル時正しく計算するための証明
リストのtakeしたときに
Haskell上で機械語を書きそれを解釈するCPUになっている
OpenGLとYampa(FRPのライブラリ)を利用した、GUIでの群知能Boidsの実装
GitHub: https://github.com/nwtgck/boid-haskell
鳥というよりハエみたい
タブローを使った論理式のソルバー
GitHub:
充足可能性などの証明ができる
音楽ファイルMIDIをHaskell使えるデータ構造に変換するReader
GitHub: https://github.com/nwtgck/midi-reader-haskell
バイナリファイルの構造を読み取るノウハウを知るため
LISPの方言Schemeのサブセットなインタプリタ
リテラル型やUnion型などを持ち、型安全性を追求した静的型付けのスクリプト言語(現在非公開)
LLVMを使った宣言的で簡素で静的型付けのコンパイラ言語とコンパイラ
GitHub:
一貫性を持った仕様にすることに力を入れたもの
構文解析を楽にするためにS式にインスパイアされた構文になっている
あとで、モダンな構文でASTを生成すれば、見た目はモダンになる
ガベージコレクション(GC)を組み込まずにシンプルな仕様の言語
Rustを目指すわけではなく、GCが必要なる機能を取り除いた最小限を目指した
最終的にはGCはつけたいので、所有権などの話はない
ラムダ式やStringを持たないのもそういう理由
上記のコンパイラをフォークして、ガベージコレクションや、Union型などを追加して、より現在の言語に近づけたコンパイラ(現在非公開)
TemplateHaskellと準クォートを使ったopen-unionの見た目を良くし書きやすくするライブラリ
GitHub: https://github.com/nwtgck/open-union-sugar-haskell
assertしたときにソースコードの式をランタイム時に表示とコンパイル時assertを可能にするライブラリ
GitHub:
他言語であるように、assert()内の式がエラーメッセージを含めたかった
staticAssert()の方は、コンパイル時にassertできる
JavaScript
Node.js/MongoDBを使ったエンジニアに優しいファイル転送サーバサイド(非オープン)
複数言語の字幕を同時に読めるTED
GitHub:
例えば、同じ動画の日本語と英語とフランス語を同時表示して、各言語での言い回しを勉強できる
パソコン通販ドスパラの見積もりCSV生成をするChrome拡張機能
GitHub: https://github.com/nwtgck/dospara-mitsumori-chrome-extension
モールス信号をブラウザで打てる簡単なWebアプリ
GitHub: https://github.com/nwtgck/morse-web
shortやlongなどの時間を変えたりでき、モールス信号を打つ練習に使う
宿題の予定を共有できるアプリのWebクライアント
AngularJS(1.x系)を利用、旧バージョンはjQueryを利用
TEDプレゼンター用のタイマー
GitHub: https://github.com/nwtgck/ted-timer
実際のTEDxに利用された
setTimeout(f, 1000)ではなく現在時刻を使って補正して精度を向上させている
GitHubリポジトリの履歴をさかのぼり最初のコミットに戻れるChrome拡張機能
GitHub: https://github.com/nwtgck/github-back-chrome-extension
AngularJSを用いた、2次元配列をGUIでドット絵をプロットするように作れるアプリ
GitHub: https://github.com/nwtgck/2d-arrays-plotter
様々な言語の配列形式の出力に対応
AnguarJSを用いた、whileループを末尾再帰にリアルタイム変換するWebアプリ
GitHub:
自分の脳にある変換アルゴリズムを書き起こしたようなもの
利点は、命令形のwhileループ=>宣言的な末尾再帰に変換できること
この変換は自明なのか、こういう研究とか論文とかあるのか知りたいところ
上記のWebアプリ、書こうと思えばブロックとか使って色々うまくいかない例を作る意地悪もできるが、そういったあら捜しではなく変換のアイデアは伝えるために使っている。
Node.js/Socket.IO/AngularJSを用いた全世界グローバルチャット
Socket.IOの練習が目的
書き途中の内容などがわかったりして、迅速に相手が言いたいことが察せたりできる
Rust
RustでRay Tracing in One Weekend (アニメーション付き)
Rust実装でPiping Severの転送速度を1.7倍~1.8倍高速化 (Hyper)
Rust (tiny-http)でのPiping Server実装
Go
アニメーションGIFにプログレスバーをつける
GitHub:
CLIとして使える
$ cat in.gif | gif-progress > out.gif
英単語のような文字列を生成する
GitHub:
マルコフ連鎖のようなものを使って文字のコーパスから遷移確率を導いてそれを使って生成している
JavaScript/TypeScriptのGo版
入力を冗長にするCLI
GitHub:
主な目的はバッファを溢れさせること
圧縮系のコマンドだとバッファが一定までたまらないと次に進まないかったりして、そうときに使うことを想定している
printf "hello" | verbose | verbose -dで使える
パイプに挟んでハッシュを計算をしやすくするCLI
GitHub:
ハッシュの計算結果が標準出力ではなくttyに吐かれるためパイプをつないで行きやすいというメリットがある
インクリメンタルバックアップをするCLI
GitHub:
増分バックアップが可能で、MacのTime Machineみたいに増えた分だけバックアップするようになっている
内部ではtarを使っていてこのCLIがインストールされていない環境でもtarがあればバックアップ・リストアできるようになっている。
リポジトリのテンプレートエンジン
GitHub:
Piping ServerのGo実装
GitHub:
Ruby
.ではなくて、パイプでメソッドチェーンを繋げていけるライブラリの作成
GitHub:
HashマップをJSONのように扱えるようにするライブラリの作成
単純なmethod missingによる実装
例えば、user["id"]をuser.idのようにアクセス
その他いろんなデータ加工によく利用
使い捨てのプログラムは簡単に書けるRubyをよく使ってます
TUIベースのテトリス
GitHub:
Java
宿題の予定を共有できるAndroidアプリ
「エンジニアに優しい、ファイル転送サーバ」のコマンドラインツール
SwingによるGUIオセロ
AngularJSのような双方向でモデルがバインディングできるライブラリの試作
Python
Confusion MatrixからAccuracy/Precision/Recall/F-measureを計算するライブラリ
GitHub:
pipでインストール可能
Maximum A Posteriori Classifierの実装
GitHub:
pipでインストール可能
「Akka HTTPを用いたHTTPベースのファイル転送サーバ」のコマンドラインツール
最新版はGoで再実装
RubyのようにPythonを使えるようにする黒魔術ライブラリ
GitHub: https://github.com/nwtgck/rubyize-python
Pythonで[1, 2, 3].map(lambda x: x*2)などができる
C言語
elvmのHaskellとScalaバックエンド開発
elcはC言語をJavaやPythonや他言語に移植できるコンパイラ
elvmは既存のCプログラムを純粋なJavaやPythonや他言語に変換できる
Cプログラムが純粋なHaskellに変換できる
Haskell版に関して書いた記事
HaskellでC言語コンパイラ動かしたり、関数化しやすくして再利用性を高めたりしてみたよ - Qiita
PHP
TODO: Write
Docker
再現的な環境が好きなためDockerが好き
Dockerfile
使っている一覧: https://github.com/search?q=user%3Anwtgck+filename%3ADockerfile&type=Code
Docker Compose
使っている一覧:
任意のWebサーバーをHTTP/3対応させるNginxのリバースプロキシのDockerイメージ。
Quicheを使っている。
記事: 「WebサーバーのHTTP/3対応をNginxのリバースプロキシでするためのDockerイメージが出来ました - Qiita」
継続的インテグレーション
リポジトリがちゃんと別の環境で動く証拠になるためCIが好き
Travis CI
Scala/Haskell/Node.js/TypeScript/Python/Goなどのリポジトリ内で使っている
言語とライブラリと環境の組み合わせなどで少しノウハウを蓄積した
速度やパイプラインが欲しくてCircle Ciに移行したものも増えてきた。
公開しているプロジェクトでTravis CIを使っている一覧
https://github.com/search?q=user%3Anwtgck+filename%3A.travis.yml
CircleCI
Scala/Node.js/TypeScript/Go/Androidなどのリポジトリ内で使っている
公開していて使っている場所一覧
https://github.com/search?q=user%3Anwtgck+filename%3Aconfig.yml&type=Cod
GitHub Actions
GitHubのコメントで任意のスクリプトを実行するGitHub Actions
Netlifyにビルド時間0でデプロイするためのGitHub Actions
https://github.com/nwtgck/actions-netlify
思い出したら追記したい。