WebService::YDMMリリースした

どうもこんにちは。id:anatofuzです。

anatofuz.hatenablog.com

このエントリから数ヶ月…ついに本日リリースしました!!

metacpan.org github.com

作成にあたっては id:papixさんに助言を頂いたりなど、皆さんに助けられてようやく…!という形です。 Acmeモジュール以外のCPANモジュールを初めて作成しました。

今回はなんとなく p-rで機能を追加していったのですが道中幾つかの処理が内部で共通化出来るなと気づき、リファクタリングのp-rを出す事ができました。

Modified floor method by AnaTofuZ · Pull Request #6 · AnaTofuZ/p5-webservice-YDMM · GitHub

個人的には

sub actress {
    my($self,$query_param) = @_;
    return $self->_send_get_request("ActressSearch", +{ %$query_param })->{result};
}

sub genre {
    my $self  = shift;
    my $query_param = _suggestion_floor_param(@_);
    return $self->_send_get_request("GenreSearch", +{ %$query_param })->{result};
}

と理路整然(?)と処理を3行くらいにまとめられたのは達成感を感じました。(自己満足ですが…)

最近ちょっと落ち込んでいましたが、やはり形になるものを公開できると嬉しいというか達成感があるので、続けていきたいですね。

今回のモジュール作成では Test2::V0 を主に使い、初めてモックテストをしっかり組むなどの行為も出来たので、今後テストの知見も溜めていきたいと考えています。頑張っていこうな

akkaのgradle runがubuntuで動かなかった件について

分散フレームワークのAkkaのJavaチュートリアルUbuntuで実行しようとした所ハマった。

具体的に言うと gradle runしようとすると

 $ gradle run

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':compileJava'.
> java.lang.reflect.UndeclaredThrowableException

* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.

* Get more help at https://help.gradle.org

BUILD FAILED in 6s
1 actionable task: 1 executed

などと :compileJava 関連でエラーが発生した。 同じ環境のMacOSXでは動いたのでなぜ…?となっていたが、原因を1つずつ調査していくと

今回利用していたUbuntu環境にに入っていたJVMはopneJDK だった。 ここのJava環境は雑に ubuntu javaなどで検索して出てきたものをいれたと思うが、このVM環境がAkkaに対応していなかったと推測される。

そこでubuntuに入っていたjava環境を一旦apt経由で削除して入れ直した。

参考にしたのは下記リンクのOracleのところ。

www.digitalocean.com

 %  sudo apt-file search add-apt-repository
software-properties-common: /usr/bin/add-apt-repository
software-properties-common: /usr/share/man/man1/add-apt-repository.1.gz
user@ubuntu ~/Documents/akka/akka-quickstart-java
$  sudo apt-get install software-properties-common
$ sudo add-apt-repository ppa:webupd8team/java
$ sudo apt-get update
$ sudo apt-get install oracle-java9-installer

ほぼこれくらいを行ってjvmを確認すると

 % java --version
java 9.0.1
Java(TM) SE Runtime Environment (build 9.0.1+11)
Java HotSpot(TM) 64-Bit Server VM (build 9.0.1+11, mixed mode)

ちゃんとOracleのものが使われている。 ここで gradle run すると

gradle run
Starting a Gradle Daemon, 1 incompatible Daemon could not be reused, use --status for details

> Task :run
>>> Press ENTER to exit <<<
[INFO] [12/28/2017 22:44:47.536] [helloakka-akka.actor.default-dispatcher-2] [akka://helloakka/user/printerActor] Good day, Play
[INFO] [12/28/2017 22:44:47.537] [helloakka-akka.actor.default-dispatcher-2] [akka://helloakka/user/printerActor] Howdy, Akka
[INFO] [12/28/2017 22:44:47.537] [helloakka-akka.actor.default-dispatcher-2] [akka://helloakka/user/printerActor] Howdy, Lightbend
[INFO] [12/28/2017 22:44:47.545] [helloakka-akka.actor.default-dispatcher-3] [akka://helloakka/user/printerActor] Hello, Java
<=========----> 75% EXECUTING [14s]

ちゃんと実行された。

もう1つのDMMクライアントWebService::YDMMについて(予告)

これはPerl Advent Calendar 2017 15日目のエントリです。


広告

YAPC::Okinawaは現在カンファレンス参加チケット・トークプロポーザルを絶賛募集中です!!!是非ご応募ください!!!

yapcjapan.org


さて今回のエントリですが,実際にAPIクライアントが完成…とまでは時間の都合上行かなかったので,大まかな実装の内容と機能についてのご紹介となります。また実装についてアドバイスなどがあれば感激です!!!(むしろそこが目的)

CPAN名前空間にはWebService::* というものがあり,こちらには主にAPIクライアントのCPANモジュールが登録されています。

この名前空間についてはpapixさんの資料が詳しいのでそちらをお読みください。

今回は練習も兼ねてタイトルにある通りDMM.comAPIクライアントの作成を行っています。

DMM APIクライアントについて

さてDMMAPIクライアントの前にDMMのAPIについて解説していきます。 DMMは公式にAPIアフィリエイトサービスの活性化の為に公開しており,誰でもアフィリエイトユーザー登録を行えば使用することが可能です。

affiliate.dmm.com

主にDMMの花形である動画サービスに関するAPIで構成されています。 例えばそういったビデオの作者,シリーズ,ジャンル検索や 女優に関してはスリーサイズをクエリパラメータとして設定可能という点で異彩を放っています。

DMM APIは2017/12/15現在でversion3.0となっており,ここ1年ほど目立った更新がない為,安定したAPIと言ってもいいでしょう。

以前はレスポンスがXMLのみでしたが,version3.0よりJSON形式が標準のレスポンスとなった為,FurlJSON系のモジュールさえあれば簡単にPerl経由でAPIを叩くことが可能です。

DMM公式(DMM.com Labo)は現在SDKを公開しています。

現在公式が対応しているSDKですが

この3言語が対応・公開されています。

またRubyの場合gemにruby-dmmとしてmeganemuraさんが公開されています。


広告

YAPC::Okinawa運営ブログも更新中です!!!

皆さん是非トーク応募しましょう!!!

docs.google.com


PerlにおけるDMM APIの対応状況

Perlでは現在CPANを見るとsyohexさんが作成されたWebService::DMMAPIクライアント実装となっています。

ですがこちらはversion2.0までのAPI実装によって作成されているので現在は使用する事が不可能となっています。

そこで現在考案しているのが新たなDMMのAPIクライアントであるWebService::YDMMです。

実装予定案

ここからは実装予定となっています。 現在作業しているリポジトリこちらとなっております

利用予定モジュール

こちらですがFurlの利用も考えていましたが,基本コアモジュールによせて書いていきたいという方針でHTTP::Tinyでの実装で進めています。

またXML形式でなく,JSONを選択しているのは個人的に(JSONの方が)使い慣れているという点です。

予定上のサンプルコード

予定上のサンプルコードです。。基本はPHP,javascript実装によせて作ることを計画しています。

use strict;
use warnings;
use utf8;


use WebService::YDMM;

my $dmm =  WebService::DMM->new(+{
                         affiliate_id => $ENV{affiliate_id}, 
                          api_id       =>  $ENV{api_id},
                      });

まずこの用にしてAPIクライアントのインスタンスである $dmm を作成します。今回はnewで呼び出し時に明示的にアフィリエイトIDをAPI IDを指定する方式にしています。

$keyword = 'ナース';
$responses = $dmm->product->("DMM.co.jp", +{
  'keyword' => $keyword
  });

map { "print $_->{title}\n" } @$responses;
# ナースなんとか…etc.

公式PHPSDKに寄せててこのように検索対象のドメインをメソッドの第一引数として取る方法と,クエリパラメータとして site=xxx の用に取る2パターンに対応を予定しています。

またレスポンス自体はオブジェクトに包まず,JSONでデコードしてhasrefの形にして複数の場合は配列形式で返却する予定です。

懸念点

バリデーションどうする問題が微妙にあります。 ここはDMM公式SDKでも各実装によって異なっており,例えばPHP実装はクエリパラメータのバリデーションは行っていません。

また公式でないですが,Rubyでの実装に関しては,一切のバリデーションは行っていないようです。

ですがGolangの実装の場合,きちんとバリデーションをしています(ここはGolangが型付き言語であることも起因してそうですが…)

今回のようなあるサービスに特化し,さらに各クエリパラメータに最大値最小値などの制限がある場合,明確にバリデーションをAPIクライアント側でした方が良いのか…?というのは疑問点です。

今後の展望

まずは年内-年明けを目指して実装していきたいと考えています。 他にもAPIクライアントとして作成したいwebサービスがあるので,このあたりを勢いで実装出来るようになっていけるといいですね!!アドバイスなどもお待ちしています!! ありがとうございました。

[河野|並列信頼]研に(仮)配属されました

という訳で河野真治先生の並列信頼研(河野研)に配属されました。めでたい。

一応(仮)配属なのですが,本配属の要件は満たしている事とあまり仮配属からの配属替えは無いのでほぼ本配属です。

研究室的にはソフトウェア工学やOS,プログラミング言語,並列処理などなどを取り扱っているのでその辺やっていくと思います。ガリガリのプログラミングやっていき研究室なので実装力高めていくぞ!!というモチベーションです。

ちなみに最近僕が個人的に興味があるのはコンパイラと並列フレームワーク,言語付近です。OS周りの内容は最近触れていなかった…。

他には河野先生がPerl Mongerである(Perlの本も書かれていた)為,Perlが書ける研究室で笑顔っていう感じがします。コンパイラ読み会ではPerl6読んだのでPerl6系の何かもできそうです。

配属先に河野研を考えだしたのはB2後期~B3になってからで,OSとコンパイラ構成論が面白かったっていうのが大きいです。なので最初大学来る時の人工知能じゃん?みたいなモチベーションではなくて,大学入ってから知った内容で研究室決めたっていう感じです。このあたり,人生何があるかわからんなっていう感じで面白いですね。別要素としては並列系の研究をしている他の研究室も考えたのですが,研究室決定アルゴリズムなどで処理された結果決定しました。*1

仮配属されてから3ヶ月でわりとえいやっとやると聞いているので頑張っていきます。

ところで2月に誕生日ですが配属記念にアレです。よろしくお願いします

*1: 某研究室GPA ave 3.7くらいありそうだった

MoarVMのbytecodeをのダンプとJITコンパイルのログ出力について

これは Perl 6 Advent Calendar 2017 5日目の記事です。

こんにちは id:anatofuzです。先日大学の講義でコンパイラ読み会を行ったのですが,その際にPerl6(Rakudo,MoarVM,NQP)を読みました。

その際に MoarVMがJIT処理をしているとこはどこか? という探索を行ったのですが,その時のメモです。

ちなみにPerl6の外観を知るために,rakudo-and-nqp-internals-courseを読んだりして進めていました。

本題

今回はPerl6のサブセットであるnqpを中心に呼んでいた。

理由はほぼ処理系はPerl6のコア機能を有しているので,とりあえずここ読めればいいかな…みたいな乗りでした。

さて,まずnqpからバイナリを出力します。 使用するプログラムは,上の例題にもあったフィボナッチ数列を求めるプログラム。

#! nqp
sub fib($n) {
    $n < 2 ?? $n !! fib($n-1) + fib($n - 2);
}

my $N := 29;

my $t0 := nqp::time_n();
my $z  := fib($N);
my $t1 := nqp::time_n();

nqp::say("fib($N) = " ~ fib($N));
nqp::say("time    = " ~ ($t1-$t0));

これがどの用にPerl6で解釈されていくかを確認していく nqpのMakefileなどを確認すると

$nqp/install/bin/nqp --target=mbc --output=fib.moarvm examples/fib.nqp

どうもこの様なコマンドでbinaryを吐ける。 ここでtargetにmbcを指定しているが,これはmoarVMで,JVMの場合はjvmだった。

ここで生成された fib.moarvm はbinaryなので当然見れない。

そこで

$MoarVM/install/bin/moar --dump fib.moarvm

などとしてmoarでdumpしてあげると

MoarVM dump of binary compilation unit:

  SC_0 : E5A15988716F4E5FD2FF889497136C7E4AD482E2-1512287908.66458
  Callsite_0 :
    num_pos: 1
    arg_count: 1
    Arg 1 : positional obj
  Callsite_1 :
    num_pos: 1
    arg_count: 1
    Arg 1 : positional num
  Callsite_2 :
    num_pos: 2
    arg_count: 2
    Arg 1 : positional obj
    Arg 2 : positional str
  Callsite_3 :
    num_pos: 0
    arg_count: 0
  Callsite_4 :
    num_pos: 1
    arg_count: 1
    Arg 1 : flat obj flat
  Frame_0 :
    cuuid : 1
    name : <mainline>
    Locals :
       0: loc_0_obj
       1: loc_1_obj
       2: loc_2_obj
       3: loc_3_obj
       4: loc_4_obj
       5: loc_5_obj
       6: loc_6_obj
       7: loc_7_str
       8: loc_8_obj
       9: loc_9_int
      10: loc_10_int
      11: loc_11_obj
      12: loc_12_num
      13: loc_13_obj
      14: loc_14_str
      15: loc_15_num
      16: loc_16_str
    Lexicals :
       0: lex_Frame_0__obj
       1: lex_Frame_0__obj
       2: lex_Frame_0__obj
       3: lex_Frame_0__obj
    Instructions :
00000      getcode      loc_1_obj, Frame_1
00001      takeclosure  loc_1_obj, loc_1_obj
00002      checkarity   0, -1
00003      param_sp     loc_0_obj, 0
00004      paramnamesused 
00005      bindlex      lex_Frame_0__obj, loc_1_obj
00006      const_s      loc_7_str, '$*CTXSAVE'
00007      getdynlex    loc_8_obj, loc_7_str
00008      set          loc_6_obj, loc_8_obj
00009      isnull       loc_9_int, loc_6_obj
00010      if_i         loc_9_int, label_1(00020)
00011      decont       loc_8_obj, loc_6_obj
00012      const_s      loc_7_str, 'ctxsave'
00013      can_s        loc_10_int, loc_8_obj, loc_7_str
00014      unless_i     loc_10_int, label_1(00020)
00015      decont       loc_11_obj, loc_6_obj
00016      findmeth     loc_8_obj, loc_11_obj, 'ctxsave'
00017      prepargs     Callsite_0
00018      arg_o        0, loc_6_obj
00019      invoke_o     loc_8_obj, loc_8_obj
     annotation: examples/fib.nqp:6
     label_1:
00020      const_i64_16 loc_9_int, 29
00021      hllboxtype_i loc_11_obj
00022      box_i        loc_11_obj, loc_9_int, loc_11_obj
00023      set          loc_2_obj, loc_11_obj
     annotation: examples/fib.nqp:8
00024      time_n       loc_12_num
00025      hllboxtype_n loc_11_obj
00026      box_n        loc_11_obj, loc_12_num, loc_11_obj
00027      set          loc_3_obj, loc_11_obj
     annotation: examples/fib.nqp:9
00028      const_s      loc_7_str, '&fib'
00029      getlexstatic_o loc_11_obj, loc_7_str
00030      decont       loc_13_obj, loc_11_obj
00031      prepargs     Callsite_0
00032      arg_o        0, loc_2_obj
00033      invoke_o     loc_13_obj, loc_13_obj
00034      set          loc_4_obj, loc_13_obj
     annotation: examples/fib.nqp:10
00035      time_n       loc_12_num
00036      hllboxtype_n loc_13_obj
00037      box_n        loc_13_obj, loc_12_num, loc_13_obj
00038      set          loc_5_obj, loc_13_obj
     annotation: examples/fib.nqp:12
00039      const_s      loc_7_str, 'fib('
00040      decont       loc_13_obj, loc_2_obj
00041      smrt_strify  loc_14_str, loc_13_obj
00042      concat_s     loc_14_str, loc_7_str, loc_14_str
00043      const_s      loc_7_str, ') = '
00044      concat_s     loc_7_str, loc_14_str, loc_7_str
00045      const_s      loc_14_str, '&fib'
00046      getlexstatic_o loc_13_obj, loc_14_str
00047      decont       loc_11_obj, loc_13_obj
00048      prepargs     Callsite_0
00049      arg_o        0, loc_2_obj
00050      invoke_o     loc_11_obj, loc_11_obj
00051      decont       loc_11_obj, loc_11_obj
00052      smrt_strify  loc_14_str, loc_11_obj
00053      concat_s     loc_14_str, loc_7_str, loc_14_str
00054      say          loc_14_str
     annotation: examples/fib.nqp:13
00055      const_s      loc_7_str, 'time    = '
00056      decont       loc_11_obj, loc_5_obj
00057      smrt_numify  loc_12_num, loc_11_obj
00058      decont       loc_11_obj, loc_3_obj
00059      smrt_numify  loc_15_num, loc_11_obj
00060      sub_n        loc_15_num, loc_12_num, loc_15_num
00061      coerce_ns    loc_16_str, loc_15_num
00062      concat_s     loc_16_str, loc_7_str, loc_16_str
00063      say          loc_16_str
00064      null         loc_11_obj
00065      return_o     loc_11_obj
  Frame_1 :
    cuuid : 2
    name : fib
    outer : Frame_0
    Locals :
       0: loc_0_obj
       1: loc_1_num
       2: loc_2_obj
       3: loc_3_int
       4: loc_4_num
       5: loc_5_str
       6: loc_6_obj
       7: loc_7_int
       8: loc_8_num
       9: loc_9_obj
    Instructions :
00000      checkarity   1, 1
00001      param_rp_o   loc_0_obj, 0
00002      paramnamesused 
     annotation: examples/fib.nqp:3
00003      decont       loc_2_obj, loc_0_obj
00004      smrt_numify  loc_1_num, loc_2_obj
00005      const_i64_16 loc_3_int, 2
00006      coerce_in    loc_4_num, loc_3_int
00007      lt_n         loc_3_int, loc_1_num, loc_4_num
00008      unless_i     loc_3_int, label_1(00011)
00009      set          loc_2_obj, loc_0_obj
00010      goto         label_2(00041)
     label_1:
00011      const_s      loc_5_str, '&fib'
00012      getlexstatic_o loc_2_obj, loc_5_str
00013      decont       loc_6_obj, loc_0_obj
00014      smrt_numify  loc_4_num, loc_6_obj
00015      const_i64_16 loc_7_int, 1
00016      coerce_in    loc_1_num, loc_7_int
00017      sub_n        loc_1_num, loc_4_num, loc_1_num
00018      decont       loc_6_obj, loc_2_obj
00019      prepargs     Callsite_1
00020      arg_n        0, loc_1_num
00021      invoke_o     loc_6_obj, loc_6_obj
00022      decont       loc_6_obj, loc_6_obj
00023      smrt_numify  loc_1_num, loc_6_obj
00024      const_s      loc_5_str, '&fib'
00025      getlexstatic_o loc_6_obj, loc_5_str
00026      decont       loc_2_obj, loc_0_obj
00027      smrt_numify  loc_4_num, loc_2_obj
00028      const_i64_16 loc_7_int, 2
00029      coerce_in    loc_8_num, loc_7_int
00030      sub_n        loc_8_num, loc_4_num, loc_8_num
00031      decont       loc_2_obj, loc_6_obj
00032      prepargs     Callsite_1
00033      arg_n        0, loc_8_num
00034      invoke_o     loc_2_obj, loc_2_obj
00035      decont       loc_2_obj, loc_2_obj
00036      smrt_numify  loc_8_num, loc_2_obj
00037      add_n        loc_8_num, loc_1_num, loc_8_num
00038      hllboxtype_n loc_6_obj
00039      box_n        loc_6_obj, loc_8_num, loc_6_obj
00040      set          loc_2_obj, loc_6_obj
     label_2:
00041      return_o     loc_2_obj
  Frame_2 :
    cuuid : 3
    name : <dependencies+deserialize>
    Locals :
       0: loc_0_str
       1: loc_1_obj
       2: loc_2_str
       3: loc_3_obj
       4: loc_4_obj
       5: loc_5_obj
       6: loc_6_str
       7: loc_7_obj
       8: loc_8_obj
       9: loc_9_str
      10: loc_10_obj
      11: loc_11_int
      12: loc_12_str
      13: loc_13_obj
    Instructions :
00000      getcode      loc_10_obj, Frame_3
00001      takeclosure  loc_10_obj, loc_10_obj
00002      checkarity   0, 0
00003      paramnamesused 
00004      const_s      loc_0_str, 'ModuleLoader.moarvm'
00005      loadbytecode loc_0_str, loc_0_str
00006      getcode      loc_1_obj, Frame_0
00007      const_s      loc_2_str, 'ModuleLoader'
00008      getcurhllsym loc_3_obj, loc_2_str
00009      const_s      loc_2_str, 'NQPCORE'
00010      decont       loc_5_obj, loc_3_obj
00011      findmeth     loc_4_obj, loc_5_obj, 'load_setting'
00012      prepargs     Callsite_2
00013      arg_o        0, loc_3_obj
00014      arg_s        1, loc_2_str
00015      invoke_o     loc_3_obj, loc_4_obj
00016      forceouterctx loc_1_obj, loc_3_obj
00017      const_s      loc_2_str, 'ModuleLoader.moarvm'
00018      loadbytecode loc_2_str, loc_2_str
00019      const_s      loc_6_str, 'ModuleLoader'
00020      getcurhllsym loc_3_obj, loc_6_str
00021      const_s      loc_6_str, 'NQPP6QRegex'
00022      decont       loc_5_obj, loc_3_obj
00023      findmeth     loc_4_obj, loc_5_obj, 'load_module'
00024      prepargs     Callsite_2
00025      arg_o        0, loc_3_obj
00026      arg_s        1, loc_6_str
00027      invoke_o     loc_3_obj, loc_4_obj
00028      const_s      loc_6_str, 'E5A15988716F4E5FD2FF889497136C7E4AD482E2-1512287908.66458'
00029      createsc     loc_4_obj, loc_6_str
00030      set          loc_7_obj, loc_4_obj
00031      const_s      loc_6_str, 'examples/fib.nqp'
00032      scsetdesc    loc_7_obj, loc_6_str
00033      hlllist      loc_4_obj
00034      create       loc_4_obj, loc_4_obj
00035      set          loc_8_obj, loc_4_obj
00036      null_s       loc_9_str
00037      null         loc_4_obj
00038      prepargs     Callsite_3
00039      invoke_o     loc_5_obj, loc_10_obj
00040      deserialize  loc_9_str, loc_7_obj, loc_4_obj, loc_5_obj, loc_8_obj
00041      elems        loc_11_int, loc_8_obj
00042      unless_i     loc_11_int, label_1(00045)
00043      const_s      loc_12_str, 'Repossession conflicts occurred during deserialization'
00044      die          loc_5_obj, loc_12_str
     label_1:
00045      null         loc_4_obj
00046      return_o     loc_4_obj
  Frame_3 :
    cuuid : 4
    name : 
    outer : Frame_2
    Locals :
       0: loc_0_obj
       1: loc_1_obj
    Instructions :
00000      checkarity   0, 0
00001      paramnamesused 
00002      bootarray    loc_0_obj
00003      create       loc_0_obj, loc_0_obj
00004      return_o     loc_0_obj
  Frame_4 :
    cuuid : 5
    name : <load>
    Locals :
       0: loc_0_obj
       1: loc_1_obj
    Instructions :
00000      checkarity   0, 0
00001      paramnamesused 
00002      getcode      loc_0_obj, Frame_0
00003      decont       loc_1_obj, loc_0_obj
00004      prepargs     Callsite_3
00005      invoke_o     loc_1_obj, loc_1_obj
00006      return_o     loc_1_obj
  Frame_5 :
    cuuid : 6
    name : <entry>
    Locals :
       0: loc_0_obj
       1: loc_1_obj
       2: loc_2_obj
    Instructions :
00000      getcode      loc_0_obj, Frame_6
00001      takeclosure  loc_0_obj, loc_0_obj
00002      checkarity   0, 0
00003      paramnamesused 
00004      clargs       loc_1_obj
00005      decont       loc_2_obj, loc_0_obj
00006      prepargs     Callsite_0
00007      arg_o        0, loc_1_obj
00008      invoke_o     loc_1_obj, loc_2_obj
00009      return_o     loc_1_obj
  Frame_6 :
    cuuid : 7
    name : <main>
    outer : Frame_5
    Locals :
       0: loc_0_obj
       1: loc_1_obj
       2: loc_2_obj
    Instructions :
00000      checkarity   0, -1
00001      param_sp     loc_1_obj, 0
00002      paramnamesused 
00003      getcode      loc_0_obj, Frame_0
00004      decont       loc_2_obj, loc_0_obj
00005      prepargs     Callsite_4
00006      arg_o        0, loc_1_obj
00007      invoke_o     loc_2_obj, loc_2_obj
00008      return_o     loc_2_obj

などと出力される。 見た感じ命令コードに _o がついておりobjectでは?などとなっていますが,基本的なノリはいつものアセンブラの結果です。

尚MoarVMのレジスタはunionで定義されていたりとした。この辺はあとでまとめてまた書きたいと思っています。

JITを追う

さて今度は実行時にMoarVMはJITコンパイルしているが,本当にしているかを追いたい。

Moarには MVM_JIT_LOG といういかにもな環境変数があるので export MVM_JIT_LOG=fib.log などとして

$nqp examples/fib.nqp などとすると

Constructing JIT graph (cuuid: 139, name: 'MATCH')
append label: 0
append label: 1
Cannot handle DEOPT_ONE (ins=set)
Build tree out of: [null, null, null, null, null, null, null, null, null, null,
null, null, null, null, null, sp_getarg_o, ]
Starting dump of JIT expression tree
====================================
digraph {
  n_0000 [label="LOCAL"];
  n_0001 [label="ADDR(0x1c8)"];
    n_0001 -> n_0000;
  n_0004 [label="TC"];
  n_0005 [label="ADDR(0x10)"];
    n_0005 -> n_0004;
  n_0008 [label="LOAD(0x8)"];
    n_0008 -> n_0005;
  n_0011 [label="ADDR(0x798)"];
    n_0011 -> n_0008;
  n_0014 [label="LOAD(0x8)"];
    n_0014 -> n_0011;
  n_0342 [label="STORE(0x8)"];
....

などと出てくる。呼んだ所どうもそこまで今回の例題ではJITコンパイルしていない事がわかった。

また,lldbで関数もおっていたが,かなり呼び出しまでにコストがかかっており,なかなか謎でした。 とりまとめのない作業ログでしたが,こんなところで

Perlと入学式とAnaTofuZ

これは Perl入学式アドベントカレンダー3日目の記事です。

こんにちは id:anatofuz です。ようやく寒くなってきた沖縄から失礼します。

そういえば去年もアドベントカレンダーに参加していて,あれから1年経ったのか…と思っています.

あれから1年か…と思っているので,去年のアドベントカレンダーからの僕とPerl入学式について書いていこうと思います。その為後半になるに連れてエモさが加速していきます。色々とすいません。

Perl入学式in沖縄でメインスタッフした

昨年はin沖縄の受講生だったのですが,今年はin沖縄のメインスタッフとして講師したりしていました。(そういえば最後の入学式で id:papixさんから「次は運営だね(ニッコリ」的ななリプを貰ったような気がする…)

一部資料改正などにも携わることが出来て,初めてGithubでpull-requestを出すという経験をしたりしました。

講師としても何回かやったのですが,ちょっとわかりにくかったり,一生懸命になってしまってネタ分が足りなかったりと今年の参加者の皆さんにはちょっと申し訳なかったかなと思っています。来年度以降は改善してより良い入学式を出来るようにしていきたいと思っています。

東京にも行った

夏の帰省がてら東京のPerl入学式にもお邪魔しました。

沖縄は半数が学生という参加体型でしたが,東京は逆に殆どが社会人の方という状態だったので地域差を感じていました。 id:xtetsujiさんのWebアプリケーションの回だったのですが,細かい気配りとわかりやすい解説があったりとスタッフとしても勉強になりました。

2017年と僕とPerl入学式と

僕とPerl入学式の2017年はこの様な感じでしたが,今年は僕とPerlの付き合いは色々と考えさせられた年でした。 例えば夏にとあるインターンに参加して「もうダメだ…」となったことが(個人的には)強烈に残っています。

正直その後は様々な事も重なったことも有りエンジニア向いていないんじゃないかなぁ…とか思うことが多々ありました。 HTMLもCSSも知識としては持っていないし,何より同年代のエンジニア候補と比べるとバイトもバズったサービスをリリースしているわけでもなく 世界的に有名なOSSにコミットしているわけでもなく,かと言って著名な論文を出しているわけでもない俺は…俺は…となっていました。

そんなことも有り9月は精神的に色々ときつかったのですが id:papix さんと id:gomayumax に東京で飲み会をしていただいたり(しかもid:papixさんには家に泊めて頂いた) 沖縄に来た時に飲みに誘っていただいたり, 夏休み期間中は隔週で id:papix さんと会うという中々無い経験をしていました。本当にpapixさんには感謝しても仕切れないなと思っています。ありがとうございます。

…思い返してみると、自分がPerl入学式に参加したのは id:codehex 先輩がYomitan.pmで「Perl入学式in沖縄します!!」と言って開催した第1回の予告を、大学のニュースサイトに投稿したものを見たのが最初の切っ掛けでした。

あの時そういえば第1回Yomitan.pmが開催されるという情報もその前に手に入れていたのですが,コミュニティ活動というのがどういったものか知らなかったことも有り参加できなかったな…という事を思い出しました。 Perl入学式はコミュニティとか知らない僕でも、初心者向けと言っているものなら参加できるかな…と考えたことを思い出しました。

ですが、去年のエントリには書かなかった事実なのですが実は1日目行こっかな…と迷った経験があります。つまり僕は参加する1日目の最後までちょっと迷いがあったのです。

ただ1歩,Perl入学式の会場に行くと,そもそも行く切っ掛けを作ったid:codehex さんを始めid:papixさんやid:xtetsujiさんがいらっしゃり,新たな1歩がたしかに踏めた感覚がありました。

そして次のPerl入学式の参加や,そこで知ったOkinawa.pm,YAPCの参加などで id:masakyst さんや同じ学科の id:cat2koban さん, 東京の id:sironekotoro さん などPerl入学式に参加しなければ,知ることさえ無かった様な方々とお話する事が出来ました。

…今こうしてみるとあの時Perl入学式に参加しなかった時の現在は想像も出来ません。あの時,もし入学式に参加しなかったら,今のようにそこまでプログラミングに興味も発生せず,なんとなくの日常を過ごしていたのかなと思います。

僕が参加できたPerl入学式in沖縄はid:codehexさんがやるぞ!!と宣言したのが切っ掛けですが, その宣言は、最後のYomitan.pmに id:papixさんが参加したことが切っ掛けで、そしてYomitan.pmは id:masakystさんら沖縄のPerlMongerのみなさんがいないと始まらなかったと考えると、Perlを通して様々な人々が繋がってきたんだなと感じています。

Perl入学式は良いコミュニティと思っていて、全国5拠点に集まるPerlMongerや他の日本全国のPerlやプログラミングに興味がある様々な人々がいます。僕のように学生をしている人もいれば, 現役のPerlエンジニアの方,またIT系とはまったく異業種の方もいらっしゃいます。

その人々が共通言語として「Perl」で一同に集まっている。この感じは非常に良いなと思っています。Perlが好きな人が,Perlを通して知見を共有する。そのコミュニティに属させていただいて,ちょっとずつですが,目標の「Perlを母国語にする」に近づいていけたと思っています。

しかし,まだ僕は「胸を張って言えます!!!」とか「ここが強みです!!」とか言えるレベルでは無いと思うんですが、それでも教えてもらうことと教えることが好きなのでPerl入学式での活動は続けていきたいと思っています。きっと自分でも出来ること,自分が得意としていて貢献できるものがあると思っているので。

2017のin沖縄の皆さんには至らぬ点を多々見せたと思いますが,もしよろしければ2018年のin沖縄のサポーターやYAPC::Okinawa でまたお会い出来ることを心待ちにしています。そして「来年もしあるなら行ってみようかな…」という皆さん!多分来年もやっていきます!!よろしくお願いします!!

それでは明日は id:codehex さんです!お楽しみに!