ごらくらいふ

プログラミングしたりゲームしたり

Zaif Apiに対する知見

Zaif Api v1.1.1 http://techbureau-api-document.readthedocs.io/ja/latest/index.html

Zaif APIを弄ってて得た覚え書き。

  • trade_api/active_ordersや、trade_api/cancel_ordercurrency_pairは任意項目となっているが、入力しないと挙動が安定しない。
  • ほぼ開発時のデバッグにしか影響しないが、trade_api/tradeの結果で得た注文のcancel_orderは、少なくとも5秒待てば実行可能だった。

Rustでzaif apiのwrapperを書いている

Rustでzaif apiのwrappreを書いている。

reqwestでもりもり実装していて、なんか楽しい。

まだ借用チェッカーと戦ってるボーイなので、もりもりコピーして構造体たち皆所有権のあるデータ持つ、みたいな書き方してる。 まぁ使う分には引数に与えたデータを延命させたりとか、そういう気を使わなくて良いんじゃないでしょうか。教えてくれ。

Crate

https://crates.io/crates/zaif-api

github.com

すげぇ

cargo publishするとcrate.ioに載って、Cargo.tomldependenciesに依存対象として書けるようになる。

驚いたのはDocs.rsに自動でドキュメントが出力されること。かしこい~~。

列挙型で error[E0507]: cannot move out of borrowed content に対処した

ムーブセマンティクスを忘れていた話。

Builderパターンで以下のように書いたところコンパイラerror[E0507]: cannot move out of borrowed contentと怒られた。

enum Method {
    Get,
    Post,
}
struct Client {
    method: Method,
}
struct ClientBuilder {
    method: Method,
}
impl ClientBuilder {
    fn new() -> Self {
        ClientBuilder {
            method: Method::Get,
        }
    }
    fn method(&mut self, method: Method) -> &mut Self {
        self.method = method;
        self
    }
    fn finalize(&self) -> Client {
        Client {
            method: self.method,
        }
    }
}

ClientBuilder.finalize()で、self.methodの所有権を失ってしまうために怒られていた。

対応

列挙型MethodCopyトレイトを実装することで解決できる。そのためのアトリビュートもある。

#[derive(Copy, Clone)]
enum Method {
    Get,
    Post,
}

認識の修正

この対処方法はドキュメントにも書いてある

このケースは、以下の認識で書いたために引っかかってしまった。

  • enumの中身は数値だろう、すなわち、プリミティブな値だろう
  • プリミティブな値であればコピーされて所有権を失わないだろう

この認識を改めていく。

enumの中身はプリミティブな値ではない

ドキュメント 列挙型 より

列挙型の値(ヴァリアントと呼ぶ)は構造体の定義である。 Unit-like構造体であったり、名前付きフィールドを持つ構造体であったり、タプル構造体であったり。

enum Message {
    Quit,
    ChangeColor(i32, i32, i32),
    Move { x: i32, y: i32 },
    Write(String),
}

そもそもプリミティブな値だから所有権を失わないのではない

ドキュメント 所有権 より

全てのプリミティブ型は Copy トレイトを実装しているので、推測どおりそれらの所有権は「所有権ルール」に従ってはムーブしません。

Copyトレイトを実装しているから、所有権を失わない。

所感

見事にドキュメントで説明される事柄を踏み抜いた

ロッテリアのバーガーはレア物を店内で戴け

のびーるピザバーガー。これは良いものだった。もう食べちゃって写真すらないんだけれど、これは何かに書き残しておきたいと思ったのでセットドリンクを吸い上げながら執筆している。

注文して待つこと数分。座席に届いた限定バーガーは、身の丈が高い。モスバーガーに来たのかと思うほどだった。

齧る。前歯が温かくふっくらとしたバンズを裂き、ハッシュドポテトを削り、下の歯と協力して本命のチーズを断つ。滲むピザソースの塩気が舌に心地よい。

ついに口からバーガーを引き離した途端、チーズが、伸びたのだ。

伸びる。これがよく伸びる。唇で何度か手繰るもののまだ伸びる。 これは冷めたら大変だ固まってしまう。齧り、引き、噛み、また齧るサイクルを高速で繰り返し、すぐに完食した。

食べきって思う。やはりロッテリアのバーガーは新登場や期間限定品に限ると。店内だとなお良い。

まず温かく食べられる。そして何より型崩れしていない。もう一度言う、型崩れしていない。

絶品チーズバーガーもそうだった。今や哀愁すら感じる有様だが、登場したときは香ばしさすら感じるバンズ、滴らんばかりのチーズがもたらすはじめの一口は感動的ですらあった。

もしロッテリアに足を運ぶときが来たら限定商品を食べてみよう。新商品を食べてみよう。 ポテトのおかずではない、「あんたが主役」なバーガーと出会えるだろう。

C93を翌日に控えてポテトつまんでる現場からお送りしました。

ライフゲームってやつをDOM+VanillaJSで書いてみた

ライフゲーム - Wikipedia

ライフゲームというものをつい最近知ったので、息抜きにガガガっと書いてみた。(DOM+VanillaJS製)

「まず動く」に重点を置いて書いて1.0.0のタグを切ったので、よければforkしてリファクタリングの練習材料にでもしてほしい。

github.com

一度書くことで概念を吸収したので(誇張)、何か別のタイミングでライフゲームを書くことがあったらより良い1.0.0タグが切れるだろう。

ちょろっとリファクタリングしたらCanvasで描画してみようかなー。 セルをクリックした時の挙動をスクラッチすることになるんだろうなぁ。ちょっとめんどそう。

vimをビルドするスクリプト書いたらただそれだけでも捗りがあった

自分好みの./configureオプションをどこかに残しておきたかっただけなんだけど、そのままmakeしてしまえと思ったのです。

makeがだばだばと状況を吐き出す姿は頼もしい…

dotfiles/build-latest-vim at master · yajamon/dotfiles · GitHub

一応 2017-12-01現在のコードを転記しておくと以下のとおり。

#!/bin/bash

readonly VIMREPO=$GHQ_ROOT/github.com/vim/vim

cd $VIMREPO
git fetch --all --prune
if [ $(git rev-parse master) = $(git rev-parse origin/master) ]; then
    param=""
    while [ -z $param ]; do
        echo -n "Already up-to-date. continue?(yN): " >&2
        read -r param _trush
    done
    if [ $param != "y" ]; then
        exit 0
    fi
fi

git checkout master && git merge --ff origin/master

make distclean
./configure --with-features=huge \
    --enable-perlinterp \
    --enable-rubyinterp \
    --enable-luainterp \
    --enable-fail-if-missing \
    --prefix=/usr/local
make
sudo make uninstall
sudo make install

更新が無い場合にはワンクッション置くところが工夫したところで、捗りポイントかな。

コミットハッシュを見て差分の有無を確認したり、readできちっと値を取り出したり、知見が生きている。

yajamon.hatenablog.com

qiita.com

gitのコミットハッシュを見て、処理を続行するか判断する

結論

git rev-parseでコミットハッシュを取得できる。

たとえば、リモートで変更があるかどうかによって、処理を分岐させることができる。

git remote
# origin
# upstream

git fetch --all --prune

if [ $(git rev-parse master) = $(git rev-parse upstream/master) ]; then
    echo "Already up-to-date" >&2
    exit 0;
fi

# heavy logic
git checkout master && git merge --ff upstream/master && git push
make

参考リンク