MonkeyをRustで実装し始めました。

Rustで「Go言語でつくるインタプリタ」の実装をはじめました。 Golangでの写経はしたことありましたが、他の言語で書き直すのははじめてです。 正直、もっと簡単に移植できるかと思いましたが、結構かかっています。 他にも同じことを考えた人がいるため参考には困らないですが、Rustの文法や仕様にはなかなか慣れないですね… 参考記事 [Rust] 『Go言語でつくるインタプリタ』Rustで読了 - Qiita Uminchu618/rust-monkey: Writing An Interpreter In Go(Go言語でつくるインタプリタ)をRustで

June 17, 2021

GatsbyをTypeScriptで書き換えた

もともとGatsbyのReact関連実装がJavaScriptだったので、TypeScriptで実装し直した。 必要なライブラリのインストール。 $ yarn add gatsby-plugin-typegen $ yarn add -D typescript tsconfig.jsonを生成する。 $ npx tsc --init gatsby-plugin-typegenを入れておくと、yarn buildしたときにGraphQLのクエリに対応した型を自動的に作成してくれる。 これを利用するためにはクエリに名前をつけておく必要がある。 # 名前をつけていく query Hoge { } あとはyarn buildすると対応した型のファイルが作成されるので、これを利用して実装を書き換える。 基本的にはxxx.js -> xxx.tsxで書き直していく。 型が導入されるのでエラーが出るが、Componentに対して適した型を渡していけば対応できる。 ただし、自動生成された型は値が取得できなかった場合を考慮してundefinedを許容するようになっており、値を取得する際もそれに合わせた対応が必要になる。 ?を書くことになるがちょっと気持ち悪いのでどこかで対応したい。 const Component: React.FC<PageProps<GatsbyTypes.HogeQuery>> = ({...}) => { ... } 参考 Gatsby.jsのTypeScript化 2020

May 4, 2021

JSXGraphをReactアプリで使う

JSXGraphというグラフを描画するライブラリがある。 JSXGraph - JSXGraph これをReactアプリに組み込みたかったので、jsxgraph-react-jsを使ってみた。 sytabaresa/jsxgraph-react-js: React component library for use Javascript or JessieCode for make JSXGraph boards インストール。 TypeScript対応はされていないので、JS用のライブラリを使う。 $ yarn add jsxgraph-react-js 1次関数をグラフ化するときは以下のように実装する。 import React from 'react' import JXGBoard from 'jsxgraph-react-js' const Component = () => { const xmin = -10, xmax = 10, ymin = -10, ymax = 10 const logic = (board) => { board.suspendUpdate() const func = (x) => { return x + 1 } board....

May 1, 2021

chronoクレートを使う

Rustアプリで時間を取得したかったので、chronoクレートを使ってみた。 外部クレーなので、インストールして使用する。 $ cargo add chrono 時間関連の処理が色々実装されているらしいが、今回はローカルの現在時刻が欲しかったので以下のように実装。 use chrono::Local; fn main() { println!(Local::now().format("%Y-%m-%dT%H:%M:%S")); } 参考 chrono - Rust Rustで日時を扱う - Qiita

May 1, 2021

Gitのデフォルトブランチをmainにする

Gitのデフォルトブランチがmainになるように設定した。 git v2.28でデフォルトブランチをmainに変更する - Qiitaを参考にしようと思ったが、gitのバージョンが古かったのでこれを更新することから始める。 GitはmacOSにデフォルトで入っていたものだったので、HomeBrewで最新のものをインストールする。 $ brew update $ brew install git $ git --version # 更新されていることの更新 あとは上記を参考に設定を行う。 $ git config --global init.defaultBranch main

May 1, 2021

cargo-editをインストールした

Cargoプロジェクト内でパッケージの追加をかんたんに行いたかったのでcargo-editをインストールした。 $ cargo install cargo-edit これで、add, rm, upgradeがサブコマンドとしてcargoに追加される。 詳細は --help で確認できる。 # add: パッケージのインストール # バージョンを指定しなければ最新がインストールされる $ cargo add reqwest # オプションが色々あり、featureも指定可能 $ cargo add tokio --features full # upgrade: Cargo.tomlで管理しているクレートを更新する $ cargo upgrade # rm: クレートを削除する $ cargo rm reqwest 参考 cargo-edit - crates.io: Rust Package Registry

April 29, 2021

RustでHello World

RustでHello Worldするまで。 最近はasdfを使用しているので、rustもこれでインストールした。 $ asdf plugin-add rust $ asdf install rust latest # このときは1.15.0がインストールされた $ asdf reshim rust $ asdf global rust 1.15.0 $ cargo -V 適当にディレクトリを作って main.rs ファイルを作成する mkdir rust_hello-world cd rust_hello-world vim main.rs fn main() { println!("Hello World"); } 作成したrustファイルをコンパイルして実行する。 $ rustc main.rs $ ./main Hello World 参考 Hello, World! - The Rust Programming Language 日本語版

April 29, 2021

iTerm2のデフォルトシェルをfishに変えた

fish shellはHomeBrew等でインストールし、パスが必要になるので確認しておく。 $ brew install fish $ which fish /opt/homebrew/bin/fish VSCodeをから設定を開き、以下の順番で作業する。 Settingsを開く terminal.integrated.shell.osx を検索 Edit in settings.json をクリック jsonの値としてfish shellへのパスを記入する あとは新規でターミナルを開くとfish shellで立ち上がる。 参考 Mac Visual Studio Code のターミナルのShellをZshに変更する - Qiita

April 29, 2021

ニーアレプリカントをやっている

ニーアレプリカントのリメイクをやり始めた。 難易度ノーマルで20時間ほどで一周目が終わった。 ストーリー進行を優先してやって、サブストーリーは序盤だけ回収した。 アクションRPGだが、操作難易度はそこまで高くない。 むしろ、ストーリーを展開してプレイヤーを引き込もうとするタイプのゲームなので、全体的に何度は高くない。 ストーリーは面白い。 ただ、一周しただけだとおぼろげな部分が多く、はっきりしない部分が多々残っている。 マルチエンドということなので今後何週化することになると思う。 すでに2周目を始めているが、今の所真相が気になるので飽きずに続けられている。 以前やった「十三機兵防衛圏」のように、ゲームという特性を活かして何度も周回させつつ、少しずつ謎を解いていくのも面白い。 これが終わったら、続編であるニーアオートマタも調べてみようと思う。

April 27, 2021

juliaで接線を求める

Juliaで微分した結果を使って接線の方程式を求めるプログラムを書いてみた。 戻り値をlambdaにすることで、微分した結果や接線を求めた結果も関数として再利用できるようにしている。 # 微分の定義を式にする # lambdaを返すことで、戻り値も関数になるようにする diff(f) = (x -> (h = 0.0001; (f(x + h) - f(x)) / h)) # 接線を求める # こちらもlambdaを返すようにして、関数を戻り値にしている g(f, a) = (x -> diff(f)(a) * (x - a) + f(a)) # f(x)のx=1の点における接線を求める f(x) = (x - 1) * (x + 1) f_ = g(f, 1) using Plots plot([f, f_])

January 8, 2021