[perl]Google::API::Clientを使ってみた

カテゴリ: perl / author: uechoco / 2012年02月05日 16:11:24
この記事を読む時間:1031くらい

perl歴はそろそろ1週間はすぎてるくらいのうえちょこです。初めてのPerlと続・初めてのPerlは読みましたが、リファレンスとオブジェクトの当たりから全然理解できてないです。なれるまでには暫く時間がかかりそうです。

さて、そうはいっても書かなきゃ慣れないので、前職でも使っていた日報クリエイターというWebアプリのPerl版をつくろうかなーと思っています。機能としては、Google Calendarから指定のカレンダーの指定の期間のイベントを取得し、整形して出力するだけのものです。前のはCakePHPで作ったんですがソースコードは会社に寄付しちゃってるんで、また1から作り直します。

最近のGoogle Data APIはバージョンが新しくなったらしく、GoogleからClient Libraryという形でライブラリが提供されています。PHP、Ruby、Python、Java、.NET、JavaScript、Objective-Cなどがあります。Perlのはありませんww が、perl版のClient Libraryを作っている方がいました。

Google APIs Client Library for Perl
モジュール構造で言うとGoogle::API::Clientです。

インストールログを貼っておきます。

そういえば、以下のインストール手順だと、本家のgithubから取ってきているんだけれど、今のバージョンだと、calendar APIに対するOAuth用URLが間違って出力されてしまうので、実際はforkしてoauth2_scope_delimiterというブランチ切ったものを使用しました。pull request投げたら、ローカルでは直してあるけどまだpushしてないバグだったって返答が来たので、そのうち本家も更新されると思います。

Bash:
  1. ## 環境はperlbrewでインストールしたperl 5.14.2とcpanm
  2.  
  3. ######################
  4. # ライブラリのDL
  5. ######################
  6. $ mkdir _libs
  7. $ cd _libs
  8. $ git clone https://github.com/comewalk/google-api-perl-client
  9. $ cd google-api-perl-client
  10.  
  11. ######################
  12. # 1回目のMakefile.PL … 失敗
  13. ######################
  14. $ perl Makefile.PL
  15.  
  16. ### Can't locate inc/Module/Install.pm in @INC (@INC contains: …… ) at Makefile.PL line 1.
  17. ### BEGIN failed--compilation aborted at Makefile.PL line 1.
  18.  
  19. ### (おそらく Module::Install がないのか?インストールしてみる)
  20. $ cpanm Module::Install
  21.  
  22. ######################
  23. # 2回目のMakefile.PL … 失敗
  24. ######################
  25. $ perl Makefile.PL
  26.  
  27. ### Unknown function is found at Makefile.PL line 3.
  28. ### Execution of Makefile.PL aborted due to runtime errors.
  29.  
  30. ### (readme_fromがないようなので、 Module::Install::ReadmeFromPod をインストールしてみる)
  31. $ cpamn Module::Install::ReadmeFromPod
  32.  
  33. ######################
  34. # 3回目のMakefile.PL … 失敗
  35. ######################
  36. $ perl Makefile.PL
  37.  
  38. ### Writing README from lib/Google/API/Client.pm
  39. ### Unknown function is found at Makefile.PL line 6.
  40. ### Execution of Makefile.PL aborted due to runtime errors.
  41.  
  42. ### (auto_set_repositoryがないようなので、 Module::Install::Repository をインストールしてみる)
  43.  
  44. ######################
  45. # 4回目のMakefile.PL … 成功
  46. ######################
  47. $ perl Makefile.PL
  48.  
  49. ######################
  50. # 1回目のmake … 成功
  51. ######################
  52. $ make
  53.  
  54. ######################
  55. # 1回目のmake test … 失敗
  56. ######################
  57. $ make test
  58.  
  59. ### (いろんなモノが足りない。エラーメッセージで分かるものからインストール)
  60. $ cpanm LWP::Protocol::https Test::Pod Test::Pod::Coverage
  61.  
  62. ######################
  63. # 2回目のmake test … 失敗
  64. ######################
  65. $ make test
  66.  
  67. ### (おそらくテストは通らないんじゃない?とりあえず先進む)
  68.  
  69. ######################
  70. # 1回目のmake install … 成功
  71. ######################
  72. $ make install
  73.  
  74. ### (サンプルプログラムでインストール確認)
  75. perl eg/urlshortener/cli_public_access.pl
  76.  
  77. ### $VAR1 = {
  78. ### 'kind' => 'urlshortener#url',
  79. ### 'longUrl' => 'http://code.google.com/apis/urlshortener/',
  80. ### 'id' => 'http://goo.gl/BwA5N'
  81. ### };
  82. ###
  83. ### $VAR1 = {
  84. ### 'kind' => 'urlshortener#url',
  85. ### 'status' => 'OK',
  86. ### 'longUrl' => 'http://code.google.com/apis/urlshortener/',
  87. ### 'id' => 'http://goo.gl/BwA5N'
  88. ### };

ちなみに、こんな感じのコードで、calendarList.listが取得出来ました。<CLIENT ID>とかはGoogle APIs Consoleで取得してください。

PERL:
  1. use strict;
  2. use warnings;
  3. use lib "/path/to/libs/google-api-perl-client/lib";
  4. use feature qw/say/;
  5.  
  6. use Data::Dumper;
  7.  
  8. use Encode;
  9. use Google::API::Client;
  10. use OAuth2::Client;
  11.  
  12. my $client = {
  13. id => '<client id>',
  14. secret => '<client secret>',
  15. redirect_url => '<client redirect url>',
  16. };
  17. my $service = Google::API::Client->new->build('calendar', 'v3');
  18.  
  19. my $auth_driver = OAuth2::Client->new({
  20. auth_uri => Google::API::Client->AUTH_URI,
  21. token_uri => Google::API::Client->TOKEN_URI,
  22. client_id => $client->{id},
  23. client_secret => $client->{secret},
  24. redirect_uri => $client->{redirect_url},
  25. auth_doc => $service->{auth_doc},
  26. });
  27.  
  28. say $auth_driver->authorize_uri;
  29.  
  30. say 'Enter verification code:';
  31. my $code = ;
  32. chomp $code;
  33.  
  34. my $token_obj = $auth_driver->exchange($code);
  35.  
  36. my $res = $service->calendarList->list->execute({ auth_driver => $auth_driver });
  37. #say Dumper($res);
  38.  
  39. my @calendar_list;
  40. for my $item (@{$res->{items}}) {
  41. push @calendar_list, $item;
  42. }
  43. for my $calendar (@calendar_list) {
  44. print "## Calendar Info: \n";
  45. print "$_ : $calendar->{$_}\n" for keys $calendar;
  46. print "\n";
  47. }


継続の力:ランニングタイムが良くなってます!

カテゴリ: ランニング / author: uechoco / 2012年02月02日 01:35:07
この記事を読む時間:132くらい

板橋Cityマラソンに向けて、黙々とランニングを続けています。

今回は3年ぶりのフルマラソンです。ホノルルの時は4時間55分、東京マラソンの時は風邪引いてたので5時間39分でした。今回はsub4、すなわち4時間以内の走破を目指しています。sub4というのは、市民ランナーにとっては結構大きな目標で、あこがれのタイムなんです。中高大と学芸部に勤しんだ私にとってはsub4なんて夢のまた夢だと思ってました。でも、挑戦しようと思います。

昔は週1でランニングして今いたが、sub4はそうは甘くないと思って、Nike Run Trainingのサイトを参考に、フルマラソン上級コースのトレーニングプランを実行中です。筋トレ・ストレッチもほぼ毎日やっています。ランニングは週3になりました。

最近、ランニングタイムがよくなってます。3年前はトップスピードが5'30''/kmで平均6'00/kmでランニングしていましたが、最近はトップスピード5'00〜5'15/km、平均5'30''/kmで走っています。まだスタミナが持たなくて徐々にスピードがダウンしてしまうのですが、例えばトップスピードを維持する時間が1週間当たり5分ずつくらい伸びています。着実に進歩しています。

「ああ、これが継続するってことなんだ」って今更実感しています。

自分の成長が数値化して分かるってのもいいですね。

もっともっと成長します!


DeNAに入社しました

カテゴリ: 雑記 / author: uechoco / 2012年02月02日 01:21:33
この記事を読む時間:25くらい

帰ってぼーっとして、ランニングして、お風呂入ったら、日付とっくに変わってました。
新しい勤務先はDeNAです。どうぞよろしくお願いします。

いろいろ書こうかと思ったけど、退職記事でいろいろ書きすぎたんで、こっちはシンプルにしておきます。うだうだ考えるより、前に突き進んだほうがいいしね。転職について何か聞きたければ飲み会とかで。


退職しました

カテゴリ: 雑記 / author: uechoco / 2012年01月31日 12:17:37
この記事を読む時間:933くらい

まずは

今月をもって、有限会社スグエを退職しました。実は先週から有給/代休消化していておりました。来月(明日)からは新しい会社になります(新しい会社のことは、明日にでも記事書きます)。私と最近お会いした方は、今月辞めることも、次の会社のことも知ってますねw

そういえば、入社の経緯も書いてなかった

前回の転職の時は記事書かなかったから、退職記事はこれが初ですね。
今の会社は2010年8月に入社したのでちょうど1年半勤めていたことになります。入社した経緯も書いてなかったので、簡潔に書いておきます。

前職(まだ今日の時点では"前職"だね!)では、社長が学生時代に立ち上げたベンチャーで、SNSの導入・カスタマイズ支援とか、ソーシャルゲームとかの受託開発をやっている会社でした。アルバイトからそのまま正社員になって、エンジニアチーム(数人)を率いていました。新しい技術にガンガン挑戦するって感じではなかったですが、マネジメントには力を入れていたかと思います。私のマネジメント力は前職で身につけたものがベースですね。前職を辞めたのは、会社の方針と合わなくなってきたから、という一言に留めておきます。

ちょうど前職を辞める前後に、現職の会社の社長からTELがかかってくるようになりました。実は、現職は大学時代に1年間ほどアルバイトをしていた会社でした。TELの内容としては、「会社を大きくしたいが、社長がこのままプログラマーを兼任していると厳しいから、社長はもっと経営よりにシフトして、その分できなくなった仕事を私に任せたいし、あと案件いっぱいで手が足りないんよー」といった感じの内容だった気がします。一応面接っぽいことをして、入社しました。

業務とか

現職の業務はCakePHPを使った受託開発でした。前職ではsymfony使いだったものの、独学でCakePHPは触っていたり勉強会にも顔を出したこともあったので技術的には壁は低かったです。また社員も大半はアルバイト時代からの知り合いなのでやりにくさも全くありませんでした。普通に業務に溶け込んで、入社した最初の週からプログラム書いてた気がします。

1年半でやった案件数としては中規模が4〜5個、小規模がいくつかだったかと思います。最後の半年は1案件にかかりっきりで、しかもCakePHPではなくPython/Djangoをごにょごにょしていました。現職も新しい技術にガンガン挑戦するって感じではなかったですが(もちろん挑戦していきたいという意思はあったのですが)、最後のPythonだけはいろいろ特別でした。

業務改善とか

現職では、プログラミング以外にも、業務改善という意味で功績を残せてきたのではないかと思っています。もともと自己啓発書とかかじってたこともあり、タスク管理とその効率化については日々努力をしています。また違う文化の会社から転職してきた人間ですから、異文化の良いところを会社に伝えていく義務があったと思います。マインドマップによる議事録の書き方、会議の進め方、Googleカレンダーからの日報自動作成ツール、遅刻に対する考え方、タスクの優先度の付け方、etc・・・・・・残念ながらそのすべてを残せたわけではないです。ですが一部は実践してもらいましたし、何より私が近くで実践していたので、いくらか感じ取ってくれたのではないかと思っています。

勉強会とか

大学時代はphp勉強会に顔を出していたのですが、前職に入社してからは忙しすぎて全く勉強会に参加していませんでした。現職になってからは、再び勉強会にも参加し始めました。php勉強会/symfony勉強会に参加すると、大学時代に勉強会でお会いした方から、「あれ?もう社会人なんだっけ?」と言われることもありました。

ここ1年半くらいの勉強会でよく話す人達は、昔のようにphp自体とかフレームワーク自体の話をすることだけじゃなく、テストやCIについての話をよくするようになっていました。私が参加している勉強会界隈の人々の関心は、単にフレームワークを使いこなすことではなくなり、いかに品質の良いシステムを効率良く作り上げていくか、というところにシフトしていっているのだと実感しました。

技術者としての成長とか

現職中の技術的な成長で言えば、最後の半年、Python/Djangoに触れたことで、自分の中でのプログラミング言語感が変わったことでしょうか。それぞれのプログラミング言語の思想を理解するという新しい考え方が私の頭の中に生まれました。

勉強会では、LTや講師に挑戦する機会もあり、技術を使うだけのエンジニアから、技術を発信していくエンジニアへと徐々に変わってきています。

また、前職・現職とも、ソースコードの質はエンジニアが担保していてユニットテストとかを書いたことはなかったのですが、TDD勉強会や前述のPython案件を通じて、ようやく"テスト"のできるエンジニアの第1歩を踏み出すことが出来ました。

そして転職へ

転職の理由は、後日書きますが、大きなシステムに関わりたいとか、サービス指向を強めたいとか、そういう感じの理由です。

現職を通じて知り合った方からのアドバイス

転職前後には、現職や現職の案件を通じて知り合った方々から、たくさんのアドバイスをいただきました。いくつか紹介したいです。

  • これからのビジネスマンの三種の神器は「IT、英語、会計」・・・これらの3つには文化の壁はなく、グローバルに活躍するビジネスマンには必須であるということです。私はエンジニアは専門職でもあるが、それ以前にビジネスマンでもあるというスタンスなので、エンジニアにも必要だと思います。
  • 「仕事ではなく、事業をしよう。ビジョンを持て。」仕事というのは労働して対価をもらう一連の流れのことで、1個人が出来る仕事の量は限られている。しかし事業という形を取ることで、個人の何倍・何十倍のインパクトを作り出すことができる。「自分が今やっている事業は世の中にどんな影響を与えるだろうか?この事業のビジョンは何だろうか?」それを考えることが大事。ビジョンを目標としよう。そうやって目標が明確になってくれば、目標から逆算して自分が今本当にすべきことが何なのかが見えてくる。・・・私は結構エンジニアとしてどうあるべきか?という考えに固執しがちでした。これからの仕事の価値観が変わる、というよりハッと気付かされた考え方でした。せっかく転職といういい機会を得たので、このマインドはぜひとも取り込みたいです。
  • お前はこれから何がしたいんだ?」20代でこれにきっちり答えられる奴は少ない。今答えられなくてもいい。でもそれを考えることをやめてはいけない・・・とっても優しい社長さんからのアドバイス。私は何がしたいかうまく言えませんでしたが、焦らなくてもいいがちゃんと頭の中に入れておけよって言ってくれました。
  • お金は稼いでいい・・・日本人は「お金を稼ぐ」ことに悪いイメージを抱くことが多いですよね。そもそもどうやってお金を稼ぐのかということを教育してくれません。自分の幸せの形がわかっていてそのために必要なんだったらお金をたくさん稼ぐ・貯めることを目標にしたっていい、ということだそうです。

さいごに

自分自身のことばかり書き連ねてきましたが、私がこうして成長しているのも、まわりの皆さんあってのことです。

現職の社長には大変お世話になりました。わがままばっかり言ったりして迷惑かけてすいません。私の良き理解者でありました。
もう転職されてしまいましたが、元上司のCさんにもお世話になりました。結構思考が似ているところもあったので、いろいろ相談させて頂きました。
現職のOさん、Iさん、Sさん、Uさん、Aさん、Tさん。一緒に仕事をしていて楽しかったです。心残りなのはUさんとはもうちょっと深くいろいろと話し合いたかったです。あとTさんにはいろいろと技術を叩きこみたかった。いずれまた。

関係各社ではIさん、Nさん、Yさんには、それぞれ会社の社長として、経営者として、私にアドバイスをしてくれました。まだまだ今の私では、その本質には至っていません。が、自分なりに考えて自分なりに取り込んでいきたいと思います。これから先、私が活躍する姿をお見せすることが、恩返しだと思っていますのでがんばります。

案件で知り合ったKさんとFさんには一緒に自転車の道に引きこまれましたw 最近はフルマラソンに注力してるんでロードバイクは乗ってないんですが、3月終わってからはまた乗り始めます。峠とか誘われて怖いんですけど・・・お手柔らかに連れてってくださいw

勉強会などで知り合ったエンジニアにも毎度お世話になりました。転職してもしょっちゅう会うと思いますので、転職に関わる1人だけ。Nさん、毎度飲み会に誘ってもらったり、転職先の紹介してもらってありがとうございます!

・・・・

明日から新しい会社かー。中はどんなんなってんだろうね?契約社員になってもやること変わんないだろうし、まずは研修をクリアしなきゃね。今日も新しい会社のための技術勉強してきますノシ


=>とか->とかの名前

カテゴリ: perl / author: uechoco / 2012年01月26日 16:29:36
この記事を読む時間:123くらい

phpで=>のことはダブルアローって呼んでます。そして->のことはシングルアローって呼んでます。見た目そのままですね。実は公式にもダブルアローは正しいという裏付けがあって、それはphpのパーサートークンでは「=>」が「T_DOUBLE_ARROW」と定義されているんです。ちなみに「->」は「T_OBJECT_OPERATOR」です。

Perlでは、=>のことはfat commaって呼ばれています。なぜかというと、ハッシュのリスト定義でカンマ(,)の代用として使用されるからです(言語上の正確な定義はよく知りませんが)。

PERL:
  1. my %hash = ("key1", "value1", "key2", "value2");

と同じ意味になるのが

PERL:
  1. my %hash = ("key1" =&gt; "value1", "key2" =&gt; "value2");

なんですね。

ちょっと調べきれていないですが、言語によってはfat allowとか、hash rocketとか、呼び方があるみたいです。

参考:Fat comma - Wikipedia, the free encyclopedia


次ページへ »

Copyright © 2012 うえちょこ@ぼろぐ. WP Theme created by Web Top.