aokcub::Blog

/PIC|dsPIC|Perl/

Perlでやたら大きい数字扱うとき

今,Twitterの検索API叩いてヒットしたツィートをメール通知するような自分用スクリプト書き掛けてます.

その中で過去に取得したツィートを保存して, 次に検索した時はその最大status_idより新しいもののみ取得するようにしてるんだけど, その制限がうまく効かずハマりかけたのでメモ.

なんかAPIの仕様確認したら不要な処理だったけどPerl力上がったので残しておきます

use strict;
use warnings;
use Data::Dumper;

my $num = '270815800892465152'; # status_id 例
print Dumper $num; # => $VAR1 = '270815800892465152';

$num = $num + 1;   
print Dumper $num; # => $VAR1 = '2.70815800892465e+17';

!?

どうもPerlの有効桁数の問題とのこと. たまたま今回はstatus_idをSQLite DBにTEXT型で保存していたので, DBから取ってきたときは文字列になる.

そのstatus_idに対して「それより新しいツィート」を取るために+1したい. このとき数値として扱うわけなんだけど, 有効桁数(15,16桁)より大きい桁数を扱っているため, 正しく扱ってくれない.

これをAPI叩くときのパラメータに入れても, そりゃーちゃんとリミット掛けてくれませんね.

解決策

use bigint;

を使う.

use strict;
use warnings;
use bigint;
use Data::Dumper;

my $num = '270815800892465152'; # status_id 例
print Dumper $num; # => $VAR1 = '270815800892465152';

$num = $num + 1;
print Dumper $num;

こんな感じで格納されてるようです.

$VAR1 = bless( {
                 'value' => [
                              2465153,
                              1580089,
                              2708
                            ],
                 'sign' => '+'
               }, 'Math::BigInt' );

7桁ずつ分割されてる模様.

参考

有効桁数の大きな数値を計算する Math::BigInt Math::BigFloat (サンプルコードによるPerl入門さん)

perlで標準より大きい有効数字の整数、小数を扱う (うまい棒blogさん)

謝辞

@neko_gata_s++ (アドバイスありがとうございました)

はてなブログ一周年と聞いて!

はてなブログ1周年おめでとう! id:hatenablog

http://staff.hatenablog.com/entry/1st-anniversary

めでたい。

自分が始めたのは11/17なので、あと10日くらいですね。

最初の記事→http://aokcub.hateblo.jp/entry/2011/11/17/120233

あまり頻度は高くないけど、今後もPerlだったり電子工作だったり Terragen2 CGだったり、幅広く活用していきたいと思います。

YAPC::Asia 2012 Tokyoに行ってきました

一週間遅れで遅くなりましたが...

タイトルの通り,YAPC::Asia 2012 Tokyo初参加してきました.

夜行バスで一日目の朝4時半ごろに着いたんだけど,たくさんの人or車が動いてて都会怖いと思った.

f:id:aokcub:20120928042924j:plain

YAPCとは関係ないけど実物初めて見たので撮った...

f:id:aokcub:20120928083249j:plain

トーク

後に述べるLTソンの方に多くいたり,会場かぶってたりして行けなかったトークが多く,動画で巡回しましたが,近藤さんの「Perlの勘所をマスターしよう! コンテキストとリファレンスを我が物に!」はぜひ直接会場で聞きたかったです...Perl触り始めて3年たつけど,いまだに細かいところわからないままにしながら使ってるの良くない. http://yapcasia.org/2012/talk/show/cd9ab1d4-db1b-11e1-ae64-0d4e6aeab6a4

LTソン

で自分が話したことについて少々. なんか全日程通じてここにいること多かった気がする.

チケットとった時点では,YAPCはトークを聞いて,間にPerl hackersな方々とお話しできたらな,という感じで行くつもりでした.が,Niigata.pmにもよく来て下さるHachioji.pmのuzullaさんがLTソンという企画を立ち上げてくださったので,応募.

http://ltthon-yapc2012.hachiojipm.org/

2日目午前に「Perlに声を持たせたい」というタイトルでお話してきました.

(デモ動画どうしよう...)

簡単にまとめると

  • AnyEvent::Twitter::Streamで#yapcasiaタグが付いたツィートを拾って

  • MeCabなどを用いてASCIIコードに変換して

  • Device::SerialPortを使って(USB経由で)自作基板に送って

  • 基板上の音声合成ICからしゃべらせる

という感じです.微妙にタイトル詐欺感が否めないですが.あと,新潟の方には既視感あると思いますがw当日の回線だとなぜかUserstreamに接続できなくて,デモはあらかじめ撮った動画で行いました.接続できたらリアルタイムに流せてよかったんですが...

トーク中に「家にはんだごてある人ー」って尋ねたら7~8割の方が手を上げたのが予想以上でした.やっぱりみなさんH/Wも好きなんですね!!!

たぶん何の役に立たない話だったと思うけど,ただ参加するだけじゃなく,何かしらのアウトプットをすることができてよかったです.これができただけでも謎の充実感.

あと,当日は遅刻して本当に申し訳ありませんでした.@aokcub--

また,LTソンの合間に行われた地域pmミートアップも楽しかった.いろんなpm行ってみたいな.自分の故郷は島根ですが,いつか戻るようなことがあればRubyの聖地でMatsue.pm立ち上げたいと思います.

その他

懇親会やトークの間などに,ネットでしか見たことない方々とお話できてよかった.自分と同じ学生チケットで参加してる人とも何人か話すことができて,自分も頑張らないとな,と思いました.

最後に

初めてのYAPC参加でしたが,トークや懇親会,LTソン含めて非常に楽しめました.運営関係者の方々を始め,スポンサーの企業や個人の方々,スピーカーの方々,懇親会等でお話しさせていただいた方々,本当にありがとうございました.

来年からの仕事は組み込みシステムの方なのでPerlはプライベートで触っていく感じになりますが,本業で扱う言語とともにPerlもどんどん書けるようになっていきたいと思います.

そして,YAPCもぜひ参加したい!

Niigata.pm Tech Talk 2に行ったよ

http://atnd.org/events/30550

長岡のまちなかキャンパスで開催されました.



ついにステッカー手に入れた!!!!!
f:id:aokcub:20120825234903j:plain


テーマは「データ処理」

ということで,通常発表3件,LT3件ありました.

とある研究室のガチトーク,すごかったですね...文書類似判定ってベクトルのなす角を利用してるんですね.自分はテキスト処理などの研究とはほとんど縁がないですが,非常に勉強になりました.詳しくはustアーカイブで.


自分のトークについて

そんなものなかった.


はい,すいません...TT3では何かします...


Ustreamについて

会場入りしてからUst配信思い立って,とりあえず手持ちのacroHDさんからやりました.ちょっと遠かったし,台座が充電用スタンドでかつPCのモニタで支えながらだったので,しょっちゅうピントずれるわ動くわで悲惨だった.LTのアーカイブ失敗してるし...

まあ,今回は暫定で,次はちゃんと準備する予定です.

ということで,アーカイブ並べておきますね.
http://www.ustream.tv/recorded/24946997
http://www.ustream.tv/recorded/24947140
http://www.ustream.tv/recorded/24947858


まとめ


本当に楽しく,勉強になりました.


次回

Perl入門的なものになるようです.Perl使ったことない人もどんどん集まったらいいですね!!!


参加者ブログへのリンク

猫型さん

PIC_Arpeggiatorのデモ #nds27

をようつべに投げました。

前回の記事のやつです。



昨日から発音をVS1053bに任せる方向でH/W改良を考えてる。VS1053bはMP3/AAC/WMA/Ogg Vorbis/FRAC/MIDIが再生できるオーディオデコーダで、何回か使ったことがある。こうしたら好きな楽器を選べるし、PIC側は演算(とUI)に集中できる。和音対応も楽になるでしょう。