近&況

Recent Posts
Edit

2017年6月9日

2017-06-09
Book

スプラ2

未だにSwitch本体が入手できてない。スプラ2発売前に普通に買えるように…なるんだろうか?ならなそうな予感がするなぁ。

最近はtwitterでブキ情報が小出しにされていて楽しい。トラップの強化、スプリンクラーの性能変更はどんな感じなのか楽しみ。

あとは試写会で出てた「チャージキープ」だけど、スコなし版だけの特典だということが明らかにされた。チャージャーの人みんなスコープ使ってた印象あるのでなるほどなぁという感じ。

サッポロクラシック

会社近くのローソンにサッポロクラシックがあった。「北海道限定」と書いてあるので、松江にも北海道が存在し得ることが分かった。

サッポロクラシックは、サイクリング部で北海道を走ってたときに毎日飲んでたので思い入れが強い。一番好きなビールかもしれない。

ラーメン完食問題

初夏にラーメンを食べるとお腹をこわす、という傾向があって、今シーズンも既に達成した。

この時期は体が体重を減らしたがっているのか、消化できる量が減るので、ちゃんとお腹いっぱいになったら残さないといけないんだけど、どうも目の前にある食べ物を何も考えずに完食してしまう傾向があって、そうするとキャパオーバーでお腹をこわす結果になる。

なんでそうなってるかというと、たぶん子供の頃に残さず食べるよう教育された結果で、食べ物を残して怒らられることはあっても、完食して怒られることってないので、とりあえず全部食べれば安全、というアルゴリズムになる。大人になった今では、体調を鑑みて適切に残していかなければならないのだけど、疲れてると判断力が鈍って全部食べてしまう。意識して直していきたいところ。

ところで胃腸が弱い問題についてはこの本とか良かったです。

Edit

2017年6月2日

2017-06-02
Diary

OP-1

OP-1というシンセを見つけてしまった。めっちゃ欲しい(というか触りたい)んだけど10万くらいするらしい。10万…10万っていくらだ?(混乱)

液晶部分が遊び心があって、テープの絵とか牛とかボクサーが出てくる。最高かよ。

マイクラ

超久々にMinecraftやってた。4年振りくらいかもしれない。最近はバニラで空が飛べるらしいのでエリトラ取るとこまでやろうかと思ったんだけど、エンドポータル探すのが面倒で頓挫してる。

マイクラ動画とかどうなってるかなと思ったけど、埋め埋めクラフトは更新停止してしまったようだ。てりぃさんのシリーズは新企画になってた。

Edit

Rubyで呼ばれたメソッドを列挙するやつ作った

2017-05-27
Tech

この記事を読んで、TracePointで同じことができないかと考えた。TracePointはRuby 2.0からある機能で、Rubyのメソッド呼び出しなどのイベントをフックできる。(昔のset_trace_funcに相当する)

とりあえず動いたのでgithubに置いた。

こういう適当なa.rbがあるとする。

class A
  def self.asdf
  end

  def foo
    p yield
  end

  def bar
    # do nothing
  end
end

A.new.foo{ 1 }
A.new.bar{ 1 }
A.asdf

これをruby -r ./trace_method_call.rb examples/a.rbのようにして動かすと以下のように、本体を実行した後に呼ばれたメソッドの一覧が出る。

1
--- Called Methods ---
A#bar
A#foo
A.asdf

実行例

このブログのテスト(rspec)に適用してみたのがこれ

生成にはけっこう時間がかかる。通常は6秒で終わるのが27秒かかっている。

% time bundle exec rspec
...............................

Finished in 2.71 seconds (files took 2.21 seconds to load)
31 examples, 0 failures

bundle exec rspec  4.57s user 0.61s system 85% cpu 6.028 total
% time bundle exec rspec -r ~/proj/lang/ruby/MethodCallTracer/trace_method_call.rb > calls.txt
bundle exec rspec -r ~/proj/lang/ruby/MethodCallTracer/trace_method_call.rb >  25.12s user 0.89s system 96% cpu 27.021 total

用途

例えば冒頭のブログ記事のように、メソッドが使われたかどうか判定するのに使えそうだ。ただしTracePointだと全部のメソッド呼び出しでフックが走るので遅い。okurubito gemの方は事前にメソッド名の一覧を用意して、それらに対してラップしたメソッドを生成するような感じっぽくて、それだとずっと速そう。

実装

見れば分かるが中身は50行弱しかない。TracePointでcallイベントをフックしているだけ。ただ実際のコードで試してみたらメタプログラミングで作られた変なクラス名が大量にヒットしたので、そういうのは除外するようにしている。

https://github.com/yhara/MethodCallTracer/blob/master/trace_method_call.rb

Edit

WASMはじめの一歩 (wastを書いてブラウザで動かすところまで)

2017-05-24
Tech

こんばんわ。今日はWebAssemblyにチャレンジしたいと思います。wasm用のプログラムを書いて、それをブラウザで動かすところまでやります。

用意するもの1:.wat

まずはWebAssemblyで書かれたプログラムが必要です。拡張子は.wasmです。あいにくこれはバイナリファイルなので手書きするのは難しいです。一般的にはお好みの言語で書いたプログラムをLLVM経由で.wasmに変換するのだと思いますが、今回はWebAssemblyそのものの例としたいので、wasmのテキスト表現を使います。

以下の内容をsquare.watというファイルに保存します。.watというのはwasmのテキスト表現のための拡張子です。ツールによっては.wastという形式を受け付けるものがありますが、これは.watの非公式な上位互換拡張だそうです。

;; square(i32 i) -> i32
(module
  (func (export "square") (param $i i32) (result i32)
    (i32.mul
      (get_local $i)
      (get_local $i))))

.watのサンプルはこのへんにいくつかあります。

用意するもの2:wabt (wast2wasm)

.watはWebAssembly/wabtに入っているwast2wasmというツールで.wasm形式に変換できます。このリポジトリをgit cloneしてmakeすると./out以下にwast2wasmという実行ファイルができます。

(Note: 私の環境では一発でmakeできましたが、もしうまく行かなくて、Node.jsには詳しい場合、https://github.com/ewasm/wast2wasm というnpm packageを使うと良いかもしれません。)

(6/13追記:コンパイルしなくてもbrew install wabtで入るのですが、生成される.wasmが新しすぎてChrome 59.0で読めませんでした。Wasm decoding failed: expected version 01 00 00 00, found 0d 00 00 00 みたいなエラーが出ます。wabtの765d59だとversion 01が出るっぽくて大丈夫です)

wasmを生成する

以下のようにして.watを.wasmに変換します。

$ ~/somewhere/wast2wasm square.wat -o square.wasm

ちなみに-vを使うとバイナリを解説付きでダンプしたものが出ます。

$ ~/somewhere/wast2wasm square.wat -V
0000000: 0061 736d                                 ; WASM_BINARY_MAGIC
0000004: 0100 0000                                 ; WASM_BINARY_VERSION
; section "Type" (1)
0000008: 01                                        ; section code
0000009: 00                                        ; section size (guess)
000000a: 01                                        ; num types
...

JSから読み込む

以下の内容をindex.htmlとして保存し、ブラウザで開きます (Ajaxを使って.wasmを読み込むので、Chromeの場合はlocalhostにサーバを立てるなどしてください)。

<!DOCTYPE html>
<html>
  <head>
  </head>
  <body>
    <script type='text/javascript'>
      function get(path, cb) {
        var xhr = new XMLHttpRequest();
        xhr.onreadystatechange = function(){
          if (this.readyState == 4 && this.status == 200) {
            cb(this.response);
          }
        }
        xhr.open('GET', path);
        xhr.responseType = 'arraybuffer';
        xhr.send();
      }

      var importObject = {imports: {}};
      get('square.wasm', function(response){
        WebAssembly.instantiate(response, importObject)
        .then(function(result) {
          var instance = result.instance;
          console.log(instance.exports.square(24));
        });
      });
    </script>
  </body>
</html>

Developer Consoleに576と表示されたら成功です。

deveoper consoleのスクリーンショット

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で、ただし引数に型指定があって、コンパイル前に型がチェックされる。(それって最高じゃん?と思ったあなた、気が合いますね) 今日はついに、「引数の型の変更漏れを処理系が教えてくれる」という幸福な体験をした。

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

経過

足したもの

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

今後の予定

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

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

参考図書

Next »