近&況

Recent Posts
Edit

2017年5月16日

2017-05-16
Diary

というわけで日記。

3月のこと

3月はsyntax-rulesの続きをしていた。3月の終わりに中間報告記事を書こうと思ってたんだけど仕事が忙しかったりして流れてしまった。5月はまたこれをする予定だったけど既に月半ばになってしまったな。どうしようかな。今年中に作りきるという目標はあまり動かしたくないけど。

4月のこと

4月はEsquisの続きをやるつもりでLLVM+例外について調べてたりしたけど、そのあとこういう閃きがあって4月はこれに費やすことになった。

とりあえずゲームが作れるとこまでやったのだけど、報告記事を書く前にブログいじりを始めてしまったのでまとまった情報はまだない。もう少ししたら書く。

「ruby ゲーム」で検索するといまだに2007年にるびまに寄稿したやつが上の方に来るので、今回もるびま記事にして塗り替えられたらいいなあなどと思ったり思わなかったり。

コーヒー

4月から、コーヒーの粉を買って家で淹れるというのをしている。いろいろ調べたので備忘録をそのうち書く。暖かくなってきたのでアイスコーヒーにするのがいい感じ。

Splatoon

最近はスシワサと無印バケツを練習している。

やり始めて2年近くになるけど、ここにきてスシって難しいなと思うようになった。ようやく入り口に立ったということかもしれない。ノヴァやバケツは一方的に有利とれる位置関係があるけど、スシはそういうのが少なくて、3発当てれば勝てるし外せば負けるという感じがする。相手の動きを読んで偏差射撃ができれば強いんだろな。

バケツはクイボが当てられないので使ってなかったんだけど、当てられるようになると無茶なキルタイムが出てびっくりする。メイン振ってクイボ投げると相手が死ぬシステム。ギアはインク回復+攻撃0.3というのを主に使ってたけど、防御対策として攻撃2.3というパターンも考えている。この場合安全靴がなくなるけど、2, 3戦してみた限りでは意外と動けそうだった。クイボあるしな。

スタートレーダーを愛用してるのでスタレ+攻撃0.3というギアが欲しいんだけど、そこまでガチャ回すのは面倒すぎるからやりたくないんだよな。スプラ2ではこのへんもうちょっと制御できるようになりそうなので期待。

Switch

スプラ2が7/21発売なのでその前に買おうと思ってるけど、未だに定価(32,378円)では買えないっぽい。大変だなあ。5/18以降に注文再開予定とあるけどどうなるか。

Edit

ブログを作る(12) カテゴリ機能を付けた

2017-05-16
Tech

記事にカテゴリを付けられるようにした。前からやりたかったものの一つである。ソースはこのへんだけど、ファイル構成の見直しも同時にやったのでこれだけ見てもよく分からないな。

同カテゴリの記事を探しやすくするというのが第一の目的だけど、もう一つの変更点として、日記(カテゴリDiary)を省いたAtomフィードを追加で提供するようにした。これを期にもうちょっと雑多な内容も書くようになるかもしれない。ならないかもしれないけど。

やったこと

既存の記事にカテゴリを振る

ここは半手作業でやった。DBを手元にダウンロードして、rake consoleでirbを立ち上げる。以下のようにすると適当な形式のテキストファイルができるので、エディタで開いてカテゴリがTechじゃないやつを編集する。

> require 'pp'
> File.write("cats.txt", Post.all.map{|post| [post.id, "Tech", post.title]}.pretty_inspect)

終わったら以下のようにするとカテゴリが設定される。

> ary = eval(File.read("cats.txt"))
> ary.each{|id, cat_name, _| cat = Category.find_or_create_by!(name: cat_name); Post.find(id).update!(category: cat)}
Edit

LLVMで例外を実装するには

2017-04-06
Tech

LLVMを使った自作言語に例外を入れることを考えてた。結論からいうとCrystalのソースを真似するのでよさそう。

_Unwind_RaiseException等の仕様はここ。http://itanium-cxx-abi.github.io/cxx-abi/abi-eh.html

「Itanium C++ ABI」という名前ではあるけれど、Level I, II, IIIのうちのLevel I部分(_Unwind_RaiseException等)はC++に限らない言語独立なAPIになっている。__cxa_throwはLevel IIで、C++用のもの(であるけれど、場合によってはこれが使えることもあるかも)。

1. http://releases.llvm.org/4.0.0/docs/ExceptionHandling.html

LLVMの公式ドキュメントに例外についての文書があるんだけど、これ読んでも何をしたらいいのか良く分からんのだよな。 特に例外を投げる方法が書いてない。

2. http://sile.hatenablog.jp/entry/20100206/1265454978

過去のLLVM(2.6)では「unwind命令」というのがあり、例外を投げることができたっぽい?

3. Crystal

Crystalのソースを見るとlibunwindというライブラリを使っているらしいことがわかる。

4. clang

clangでthrowがどうコンパイルされるか見てみると、@__cxa_throwという外部関数の呼び出しになった。

declare void @__cxa_throw(i8*, i8*, i8*)

5. g++ http://d.hatena.ne.jp/fixme/20100124/1264301168

__cxa_throwで検索すると、g++における実装が見つかる。_Unwind_RaiseExceptionという関数を呼び出している。

6. http://stackoverflow.com/a/17695760/1662841

でですね、StackOverflowによると、_Unwind_RaiseExceptionはlibunwindの関数であるらしい。

Short answer is that _Unwind_RaiseException is not a C++-specific function. It comes from the libunwind library, and allows to throw any type of exception.

ということでまとめると以下のような構図になっている。

参考文献

真面目にやるならこのへん読むのがよさそう

おまけ1

github libunwindで検索するといくつか見つけるけど、中を見る限り別のものっぽい

おまけ2

http://www.snsystems.com/ja/technology/tech-blog/2015/06/11/abi-bugs-are-a-nightmare/

ItaniumってインテルのCPUの名前じゃなかったっけ?という疑問に対する解答があった

IA-64 ABI または Itanium ABI として知られる、現在使用されている C++ コンパイラのほとんどに採用されている C++ ABI は、当初 Itanium 64 ビット プロセッサ用に開発されたものでした。しかし、この ABI は、GNU-C++、ARMcc、Clang/LLVM や PS3、PSVita および PS4 などの PlayStation 用コンパイラなど、広く使用されている多くのコンパイラによって利用されてきました。Microsoft Visual C++ コンパイラを除き、C++ ABI は、コンパイラ ベンダーの事実上の業界標準になりました。

Edit

スプラ日記

2017-04-03
Diary

久しぶりにS+になった。前はヤグラノヴァだったけど今回はバケデコのガチエリア(モズク・マサバ)。元気なときに集中してやればS+上がれるのではないか、とは前々から思ってたんだけど、実際にできることがわかって良かった。

普段は仕事終わって夕飯食べてお腹いっぱいな状態でやってたりするのでS30〜S70くらいで推移してる。一度S+に上がれてからは、強くなるというよりはいろんな武器を触って楽しんでいる状況。最近はエイムが良くなってきて、L3リールガンが扱えるようになってきた。最初触ったときはこんなん絶対無理だと思ってたのでちょっと嬉しい。

Edit

スノボ納め 16-17

2017-03-26
Diary

表大山まで滑りに行ってきた。今季はこれでおしまい。

http://www.daisen-resort.jp/

松江に住んでいると大山が近くて、冬場はほぼ毎週スノボに出かけている。数えてみると今季は9回行けたらしい。会社の人と一緒に行くんだけど、今季は社外の人とも一緒に行ったりした

今季は雪の降り始めが遅くてどうなることかと思ったけど、1月と2月に大量に降った日が一度ずつあり、3月入ってからも降ったりしたので、それなりに長く滑れるシーズンになって良かった。

今年は試乗会で板を予約したので、来季は新しい板になる。試乗会ってその場で板を買えるのかと思ってたんだけど、そうではなくて、この夏に製作するモデル(つまり17-18モデル)のサンプルが試乗できて、気に入ったら予約すると9月くらいに手に入るということだった。とても楽しみ。

今使っている板は新古品を2万で買ったやつで、スノボショップに持っていたら保存状態が悪くて変な風に反っていると言われて、一応滑れるようにエッジを調整してもらったという経緯がある。気づいたら6年これに乗っていたらしい。後悔はしてないけど、もう少し早く買い替えても良かったかなという気はする。新しい板、試乗してみて、めちゃめちゃ乗りやすいと思ったからね。

Edit

LLVMで動くオブジェクト指向言語を作ってレイトレした

2017-03-07
Tech

先月のエントリでEsquisというプログラミング言語を作っていると書いたが、あれからいろいろ機能を足して、レイトレーシングのプログラムが動くようになった。

できたもの

https://github.com/yhara/esquis/releases/tag/v0.0.1

実行結果

レイトレ結果

(前エントリと全く同じ絵なのもアレなので、T=10にしてみた)

ソース

https://github.com/yhara/esquis/blob/v0.0.1/examples/ray.es

見てもらえばわかるけどほぼRubyで、ただし引数に型指定があって、コンパイル前に型がチェックされる。(それって最高じゃん?と思ったあなた、気が合いますね) 今日はついに、「引数の型の変更漏れを処理系が教えてくれる」という幸福な体験をした。

言語仕様はこれからいろいろ変わると思うので詳細は書かない。

経過

足したもの

など。やることが多かったけど、ゴール(動くべきプログラム)が明確だったので、少し動かしては足らないものを足して、という感じでやっていたらあっという間に機能が増えていった。毎日のように出来ることが増えていくのでとても楽しかった。

今後の予定

まだまだやることはたくさんある。文字列、配列、継承、ジェネリクスなど。

一方で今年は別のこともやる予定なので今月の残りはそっちの作業をする。その間に次の良い課題となるプログラムを考えよう。

参考図書

Edit

牛乳を泡立てるやつ買った

2017-03-05
Food

百均でミルクフォーマー買った。150円だった。ミルクフォーマーはスタバの店舗で売ってるのを見たことあるけど、2000円以上してたので、百均にあると聞いてびっくりした。

商品の写真

作りがちゃっちくて、グリコのおまけ感ある。とりあえず使う前に洗おうと思ったが、本体は防水じゃないので、棒の部分だけ取り外す必要があるんだけど、これがまためちゃめちゃ固い。しかし隙間にスプーンの柄を突っ込んだりして頑張ってるうちになんとか取り外すことに成功。その後は常識の範囲内の硬さになった。

使い方だけど、カップに牛乳を入れて、こいつを突っ込んでスイッチを入れるとモーターがすごい勢いで回転し、牛乳に空気が入るという寸法。液体全体が泡になるのではなく、上部に泡が発生するという感じ。牛乳はホットでもアイスでもよい。

成果物としてどういうものが得られるのかよく分かってなかったんだけど、要するにお店のカプチーノとかの上に乗ってる泡状のやつ、あれが手に入ります。150円にしては意外なほどふわふわになる。なんとなく専用の機械とかでやってるのかなぁと思ってたけどこんな単純な機構で再現できるのか。

ということであとは発生させた泡をどのように活用するかという話になるが、スタバのサイトによると泡立った牛乳の上からコーヒーを注ぐということらしい。なるほど。

Edit

弁当はじめました

2017-03-05
Food

野菜を買いすぎたので、夕食の野菜炒めを多めに作って、半分を翌日の弁当にしてみた。普段は会社に来られるお弁当屋さんの弁当を買ってて、それと比べるとボリュームも彩りもないけど、意外とこれで良いじゃんっていう感じだった。コンビニが近いので味噌汁だけカップのを買うとかもできるし。一人暮らしだとどの野菜を買ってもたいてい大きすぎるので、こうやって消費先が増えるのは良い。

弁当を作ること自体は興味がありつつ手を付けてなかったんだけど、最近ちょうどいい大きさのランチボックスを見かけて、とりあえず買うだけ買っておいたのが役に立った。(市販の弁当箱はたくさんあるんだけど、米は冷凍して持っていくので、おかずだけ入れるやつが欲しかったのだった) 二段になってるので、慣れてきたら二段目を冷凍食品で埋めたりするのもいいかも。

Edit

CapybaraでSinatraアプリをテストする

2017-02-28
Tech

このブログはSinatraで作っていて、テストはRack::Testで書いてたのだけど、思い立ってCapybaraで書き直した

Rack::Test vs Capybara?

というのはある種のバグがRack::Testだと漏れちゃうんですよね。例えばフォームをsubmitしたときにビューのtypoで正しいリクエストが飛ばない、みたいなやつ。Rack::TestだとこういうPOSTリクエストに対しこういう挙動をする、は書けるんだけど、ボタンを押したときにどういうPOSTが飛ぶか、はCapybaraでないと書けない。

もっと規模が大きければRack::Testでコントローラのテストを書いて、Capybaraでintegraiton testを書いて…みたいな構成もあり得るけど、このブログの場合は規模が小さいのでCapybaraによるE2Eテストだけあれば良いかなと思う。

以下、Rack::Testから移行するに当たって「これどうするんだろ?」ってなったことをメモしておく。

Basic認証したい

Driverによって指定方法が違うみたい。Rack::TestドライバはBasic認証に対応してなさそう。しかしヘッダを直接指定するという方法があった(参考)。

  # https://github.com/yhara/nlog2/blob/a63294a2a1b514e76ac130b2f6400fda8a8436b5/spec/app_spec.rb#L8-L11
  def login(username='jhon', password='passw0rd')
    encoded_login = ["#{username}:#{password}"].pack('m*')
    page.driver.header 'Authorization', "Basic #{encoded_login}"
  end

フォームが表示されることを確認したい

have_content("form")…かと思いきや、これはformというテキストが画面に表示されている、という意味なのでタグには反応しない。have_selector("form")が正解。

フォームにデフォルトで入力されていることを確認したい

これもhave_selectorでいける。こんな感じ。

      expect(page).to have_selector("input[name='title'][value='#{@valid_posted[:title]}']")

POSTしたい

postメソッドがない、と思ったがCapybaraはE2Eテスト用のライブラリなので、POSTリクエストを直接送るような手段はないのだった。そりゃそうか。その代わりにclick_linkやclick_buttonといったメソッドがあるので、まずvisitで編集画面にアクセスして、フォームに記入してclick_buttonする、みたいな書き方になる。

今回はこんな感じにした。

        login
        visit '/_edit/'
        fill_editor @valid_params
        click_button "Save"

fill_editorはcheckメソッドでチェックボックスをオンにしたり、fill_inでテキストを入力したりする。定義は以下。

  def fill_editor(params)
    check "permanent" if params[:permanent]
    fill_in "title", with: params[:title]
    fill_in "slug", with: params[:slug]
    fill_in "body", with: params[:body]
    fill_in "datetime", with: params[:datetime]
  end
Edit

Rubyでレイトレーシングした

2017-02-21
Tech

生成された画像

これをRubyに移植した。aobenchが自作言語のターゲットとしてまだちょっと大きいなと思ってより小さいサンプルを探していたのだけど、最後のステップまで移植したら結局aobenchとあんまり変わらないようなものになった。ただaobenchのコードはちゃんと理解していなかったので、少し理解が深まった気がして面白かった。あと画像が出るプログラムはやっぱり楽しい。

ソースはgistに上げた。ray5.rbまであり、それぞれ以下のようになっている。

  1. 画像を生成する
  2. 球を出す
  3. 陰影を付ける
  4. 床を出す
  5. 反射させる

上に貼ったのはray5.rbの出力結果だ。よく見ると元記事と微妙に球の位置が違うことが分かるが、オリジナルは時間tを受け取ってアニメーションするようになっていて、tの値が違うのが原因と思われる(最初、アルゴリズム部分に間違いがあるのかと思って焦った)。

Next »