Hatena::ブログ(Diary)

Perl勉強メモ アルパカDiary出張版

2013-03-27

AWSでsshするならyogafireも便利

| 23:01 | AWSでsshするならyogafireも便利 - Perl勉強メモ アルパカDiary出張版 を含むブックマーク

※便乗記事ですごめんなさい><

http://m.igrs.jp/blog/2013/03/14/ec2-ssh/


yogafireはec2を便利に使うためのコマンドラインツールです。

yogafireの機能はsshだけではありませんが、

sshするだけでも便利なのでチラッと紹介してみます。


インストール

# ※cpanmコマンド無い時
brew install cpanminus

# インストール (ncurses-devel / readline-devel / libxml2-devel パッケージが必要)
cpanm https://github.com/toritori0318/p5-Yogafire/tarball/master

初期設定する

yoga use --init

sshする

# 一覧から選択
yoga ssh

# Nameタグが「www01」のサーバにsshログイン
yoga ssh www01

# Nameタグが「www*」のサーバを一覧表示。ユーザはec2-userでログインする
yoga ssh 'www*' --user=ec2-user

# AWS APIの条件から絞り込んで一覧表示
yoga ssh --filter='availability-zone=ap-northeast-1,group-name=base'

ssh踏み台指定

# タグ名「fumidai」のインスタンスを踏み台にする
yoga ssh --proxy=fumidai

または、.yogaファイルに「proxy」を設定してもOKです。

application1:
  access_key_id: xxxxxxxxxxxxxxxxx
...
  proxy: fumidai
...

インタラクティブに絞り込んでみる

1.普通にyoga sshしたあと、「app」を入力してEnter。

タグ名に「app」を含むインスタンスフィルタされます。

f:id:tori243:20130327164305p:image:w360

2.さらに「b」で絞込み。

f:id:tori243:20130327164304p:image:w360

3.さらに「web」で絞り込むと、最後の一つのインスタンスなので自動でsshが実行されます。

f:id:tori243:20130327164303p:image:w360


もちろん、途中でNoを指定してsshを実行することも可能です。


リモートコマンド実行

# Nameタグが「www01」のサーバでlsを実行
yoga cmd www01 ls

# Nameタグが「www」で始まるサーバでuptimeを実行
yoga cmd 'www*' 'uptime'

# Nameタグが「db」で始まるサーバでsudo+password実行
yoga cmd 'db*' -s -p '/etc/init.d/redis start'

リモートにファイルを get / put

rsyncでリモートサーバのファイルを取得します。

# Nameタグが「www02」サーバの「/tmp/hoge.log」をローカルの「./」に転送
yoga get www02 /tmp/hoge.log ./

# Nameタグが「www」で始まるサーバ全部に「/tmp/hoge.log」をローカルの「./」に転送
yoga get 'www*' /tmp/hoge.log ./

# ホスト名でも可能
yoga get hogehoge.example.com /tmp/hoge.log ./

# dry-runモード
yoga get www02 /tmp/hoge.log ./ --dry-run

# rsyncオプションを追加(node_modulesディレクトリを除外してsync)
yoga get www02 ./nodapp ./ -o '--exclude=node_modules'

# ローカルの「README」ファイルを、Nameタグが「www03」サーバの「/home/tori243」に送信
yoga put www03 README /home/tori243


yogafireには他にも多数のコマンドが実装されているので

ご興味のある方は他の記事もご参照ください。

http://d.hatena.ne.jp/tori243/20130102/1357142925

http://d.hatena.ne.jp/tori243/20130327/1364392574

2013-03-19

App::RedisTopをcpanに上げて念願のCPAN Authorになったよ

| 03:13 | App::RedisTopをcpanに上げて念願のCPAN Authorになったよ - Perl勉強メモ アルパカDiary出張版 を含むブックマーク

上がったようです。わーい\(^o^)/

http://search.cpan.org/~toritsuyo/App-RedisTop-0.01/


cpanm App::RedisTop

インストールできるようになりました。楽ちん!


パッチを送っていただいたfujiwaraさん、hirose31さん、

lingerで相談に乗っていただいたsongmuさん、tokuhiromさん

ありがとうございました!

2013-01-02

YogafireというAWSツールでヨガの奥義を極める

| 01:08 | YogafireというAWSツールでヨガの奥義を極める - Perl勉強メモ アルパカDiary出張版 を含むブックマーク

※注 タイトルに深い意味はありません


https://github.com/toritori0318/p5-Yogafire

だいぶ前からgithubには置いてたんですが

年始だしドキュメントっぽいのを書いてみることにしました。

超長い!でも便利かも!


前置き

仕事上AWSEC2)を使うことが多いのですが、

自分で使っていて「こんなんあったら便利かなー」というのを寄せ集めたCLIです。

基本的な考え方としては「EC2をタグNameベースで」いろいろと操作できるようなツールですね。*1 *2

貧乏性な自分はスポットインスタンスを定常的に使うので

yoga sshは割と必須だったりしています。


※Windows

たぶん動きません!


インストール

cpanm https://github.com/toritori0318/p5-Yogafire/tarball/master

# cpanm無い時
curl -LOk http://xrl.us/cpanm
# 環境によっては sudo 付ける
# ncurses-devel / readline-devel パッケージが必要
perl cpanm https://github.com/toritori0318/p5-Yogafire/tarball/master

依存が多くていらいらするかもしれませんがしばらく待ちましょう。

インストールが成功するともれなく「yoga」コマンドが使えるようになります。



コマンド一覧

設定系
configYogafireコンフィグを設定
useプロファイル設定
EC2操作系
lsEC2インスタンスのリストを表示/操作
sshEC2インスタンスssh接続
startEC2インスタンスを起動
stopEC2インスタンスを停止
rebootEC2インスタンス再起動
terminateEC2インスタンスを削除
create-imageEC2インスタンスからAMIイメージを作成
expand-volumeEC2ボリュームを拡張
infoEC2インスタンスの詳細情報を表示
cmdリモートサーバでコマンド実行
getリモートサーバからrsyncでファイルを取得
putリモートサーバrsyncでファイルを送信
AMI操作系
ls-amiAMIリストを表示/操作
プラグイン
all-region-info全てのリージョンをまたいで様々な情報を取得
aws-statusAWSステータスを表示
hostshostsファイルユーティリティ
regionリージョンリストを表示
sshconfigsshconfigユーティリティ
amiwatcherAMIのステータス監視
ec2watcherEC2のステータス監視
instance-typeEC2インスタンスタイプ一覧表示
renderEC2レンダリングツール



初期設定

利用するにはyogaコマンド用のコンフィグファイルを設定する必要があります。


yoga config --init

対話形式での設定を開始します。

AWS関連の環境変数を設定していればある程度自動で設定してくれます。

ただしpemファイルの在り処は入力する必要があるでしょう。

デフォルトでは「$HOME/.yogaにコンフィグファイルが作られます。

コンフィグファイルの場所は環境変数「YOGAFIRE_CONFIG」で指定することも可能です。

このファイルを直接編集することも可能です(YAML形式)。

コンフィグファイルのexample


yoga use

yogafireでは複数のAWSアカウントを管理することができます。

プロファイルを複数用意し、useコマンドでプロファイル名を指定することによって

簡単に切り替えることができます。

通常は「global」プロファイルに紐付けられています。

# プロファイル一覧
yoga use

# "account1"プロファイルに切り替える
yoga use 'account1'




Yoga Core:利用頻度ランキング

自分がよく使う順に説明していきます。


yoga ssh

インスタンスに対してSSHします。runningのインスタンスのみが自動でピックアップされます。

f:id:tori243:20121231042125p:image:w640

# 起動中の全サーバを一覧表示し、番号を選択してsshログイン
yoga ssh

# Nameタグが「www01」のサーバにsshログイン
yoga ssh www01
(以下でも同じ意味)
yoga ssh --tagsname www01

# Nameタグが「www*」のサーバを一覧表示し、番号を選択してsshログイン
yoga ssh 'www*'

# --filterオプションでAPIのフィルターも自由にかけることも可能
#   ※sshコマンドに限らず、他のコマンドでも同様
#   http://docs.amazonwebservices.com/AWSEC2/2011-05-15/APIReference/index.html?ApiReference-query-DescribeInstances.html
yoga ssh --filter='instance-state-name=running,availability-zone=ap-northeast-1,group-name=base'

yoga ls

インスタンスのリストを表示できます。全てのステータスが対象となります

オプションで絞り込むことは可能)

f:id:tori243:20121231042603p:image:w640

# "www"でタグNameが始まるインスタンスのみ表示
yoga ls 'www*'
(以下でも同じ意味)
yoga ls --tagsname 'www*'

また、-iオプションを追加すると、表示したインスタンスに対して更にコマンド(ssh / start /stop /...)を

実行することができます。

# さらに追加コマンドを選択
yoga ls -i

f:id:tori243:20121231042837p:image:w640


yoga ls-ami

lsAMI版。

これをよく使うのは、AMI削除するときにスナップショットも一緒に消せるようにしているからですね。*3

# "www"でAMINameが始まるインスタンスのみ表示
yoga ls-ami 'www*'
(以下でも同じ意味)
yoga ls-ami --name 'www*'

lsと同じように、-iオプションを追加するとインタラクティブモードになります。

# さらに追加コマンドを選択
yoga ls-ami -i

yoga get

rsyncでリモートサーバのファイルを取得します。

# Nameタグが「www02」サーバの「/tmp/hoge.log」をローカルの「./」に転送
yoga get www02 /tmp/hoge.log ./

# Nameタグが「www」で始まるサーバ全部に「/tmp/hoge.log」をローカルの「./」に転送
yoga get 'www*' /tmp/hoge.log ./

# ホスト名でも可能
yoga get hogehoge.example.com /tmp/hoge.log ./

# dry-runモード
yoga get www02 /tmp/hoge.log ./ --dry-run

# rsyncオプションを追加(node_modulesディレクトリを除外してsync)
yoga get www02 ./nodapp ./ -o '--exclude=node_modules'

yoga put

getの反対でリモートサーバのファイルを取得します。

dry-runやrsyncオプションもgetと同じように指定できます。

# ローカルの「README」ファイルを、Nameタグが「www03」サーバの「/home/tori243」に転送
yoga put www03 README /home/tori243

yoga cmd

指定したコマンドをリモートサーバで実行します。

並列実行はTodo...

# Nameタグが「www04」のサーバでlsを実行
yoga cmd www04 'ls'

# Nameタグが「www」で始まるサーバでuptimeを実行
yoga cmd 'www*' 'uptime'

# Nameタグが「db」で始まるサーバでsudo+password実行
yoga cmd 'db*' -s -p '/etc/init.d/redis start'



Yoga Plugin:利用頻度ランキング

プラグインで自分がよく使う順に説明していきます。


yoga instance-type

EC2インスタンスタイプの一覧を表示します。

idとタイプの紐付けや、スペックの確認に便利。

f:id:tori243:20121231044007p:image:w500


yoga region

リージョンのIDも忘れがちなので一覧で見れると便利ですね!

f:id:tori243:20121231044127p:image:w200


yoga render

割とお気に入りの機能です。EC2インスタンス情報をテンプレートで記述できます。

具体例をいくつか上げてみます。

# ステータスがrunningのサーバ全てを対象にdnsNameを生成
yoga render --template='"[% dnsName %]",\n' --state=running
(結果)
"ec2-xxx-xxx-xxx-xxx.ap-northeast-1.compute.amazonaws.com",
"ec2-yyy-yyy-yyy-yyy.ap-northeast-1.compute.amazonaws.com",
...

# タグNameが'www'で始まるサーバのグローバルIPを生成
yoga render --template='[% ipAddress %]\n' --tagsname='www*'
(結果)
xxx.xxx.xxx.xxx
yyy.yyy.yyy.yyy

# タグNameが'db'で始まるサーバ情報でPerlのコードっぽいのを生成
yoga render --template='{ instance => { instance_id => "[% instanceId %]", private_ip => "[% privateIpAddress %]", launch_time => "[% launchTime %]" } },\n' --tagsname='www*' 
(結果)
{ instance => { instance_id => "i-bbbbbbb", private_ip => "x.x.x.x", launch_time => "2012-03-30T09:00:34.000Z" } },
{ instance => { instance_id => "i-ccccccc", private_ip => "y.y.y.y", launch_time => "2012-03-30T09:01:49.000Z" } }

yoga aws-status

awsステータス情報の通知を時系列に表示します。日付/リージョン/サービス名指定も可能。

f:id:tori243:20121231044451p:image:w500


yoga hosts

EC2インスタンスipアドレスをhostsに自動更新します。

以下のようなフォーマットでファイルの末尾に追記されます。

更新時も「Yogafire Begin <-> Yogafire End」の間だけが自動で置換されます。

フォーマット

#======== Yogafire Begen ========#
<public_ip or private_ip> <tag_Name>
...
#======== Yogafire End   ========#

実行例

# 更新後のhostsファイルをプレビュー
yoga hosts --preview

# プライベートIPでhostsファイルを置換します(バックアップ有り)
yoga hosts --replace --private-ip --backup

更新後ファイルの例

127.0.0.1	localhost pn-agent pn-broadcast
::1             localhost 
fe80::1%lo0	localhost
...
#======== Yogafire Begen ========#
59.1.1.1         wwwhoge
59.1.1.2         wwwfuga
59.1.1.3         dbpiyo
#======== Yogafire End   ========#

yoga sshconfig

EC2インスタンスipアドレスをsshconfigに自動更新します。

以下のようなフォーマットでファイルの末尾に追記されます。

フォーマット

#======== Yogafire Begen ========#
Host <tag_Name>
    HostName     <dnsName>
    IdentityFile    <.yogaコンフィグの鍵ファイルパス>
    User              <.yogaコンフィグのユーザ名>
    Port               <.yogaコンフィグのポート番号>
...
#======== Yogafire End   ========#

実行例

# 更新後のsshconfigファイルをプレビュー
yoga sshconfig --preview

# sshconfigファイルを置換します(バックアップ有り)
yoga sshconfig --replace --backup

更新後ファイルの例

#======== Yogafire Begen ========#
Host wwwhoge
    HostName     hogehoge.com
    IdentityFile    /path/to/id.pem
    User         ec2-user
    Port         22

Host wwwfuga
    HostName     fugafuga.com
    IdentityFile    /path/to/id.pem
    User         ec2-user
    Port         22

Host dbpiyo
    HostName     piyopiyo.com
    IdentityFile    /path/to/id.pem
    User         ec2-user
    Port         22

#======== Yogafire End   ========#

他にも

割愛しますが、リージョンを横断して情報表示できる all-region-info や、

ステータスを監視して ステータスが変更されたらgrowl表示したりできる

ec2watcherやamiwatcherという機能もあったりします。




Tips的な話


ヘルプ
# 全部のコマンド一覧
yoga

# コマンド毎のヘルプを見る
yoga <command> --help

オートコンプリート

sshls -iなど、番号/インスタンス名/インスタンスIDを入力するところでは

TABキーでオートコンプリートが効きます。

f:id:tori243:20121231050508p:image:w200

また、zsh補完を設定しておくと、コマンドラインでもいろいろと補完が効くようになります。

yogaコマンド補完

f:id:tori243:20121231050649p:image:w300

さらに絞り込んで補完とか。

f:id:tori243:20121231050730p:image:w300

インスタンス名補完

また、ssh / ls / start / stop /terminate / get /put などのコマンドでは

yoga <command>TABキー でもzsh補完でインスタンス名の補完が可能です。

f:id:tori243:20121231051057p:image:w300


カラムのカスタマイズ

ssh / ls / ls-ami などで表示される一覧のカラムは

コンフィグファイルでカスタマイズすることが可能です。

app1:
  access_key_id: aaaaaaaaaaaaaaaa
  identity_file: '/path/to/nyoro.pem'
  ###############################################
  # amiリストのカラム
  #  VM::EC2::Imageのメソッドと一致するものを指定
  #   http://search.cpan.org/~lds/VM-EC2/lib/VM/EC2/Image.pm#METHODS
  #  タグの場合は「tags_<タグ名>」で指定可能
  image_column:
    - tags_Name
    - name
    - imageId
    - colorfulImageState
  ###############################################
  # インスタンスリストのカラム
  #  VM::EC2::Instanceのメソッドと一致するものを指定
  #   http://search.cpan.org/~lds/VM-EC2/lib/VM/EC2/Instance.pm#METHODS
  #  タグの場合は「tags_<タグ名>」で指定可能
  instance_column:
    - tags_Name
    - tags_Role
    - instanceId
    - ipAddress
    - privateIpAddress
    - dnsName
    - launchTime
    - colorfulInstanceState
  region: ap-northeast-1
  secret_access_key: bbbbbbbbbbbbbb
  ssh_port: 22
  ssh_user: ec2-user

alias

指定しておくとさらに便利ですね。

# wwwサーバへssh
alias yssh-www='yoga ssh "www*"'
# dbサーバへコマンド実行
alias ycmd-db='yoga cmd "db*"'
# /etc/hostsを置換
alias yhost-replace='sudo YOGAFIRE_CONFIG=/home/toritori0318/.yoga /path/to/yoga hosts --replace'

他のコマンドと連携してみるとか

yoga render コマンドの結果を用いてpsshに食わせたりとか夢ひろがりんぐですね。


Nameタグについての注意点

Nameタグの値が 'www 01 desuyo' のように、間にスペースがあると

動作に影響する可能性があります。スペース禁止!



Todo(たぶんやる)

  • 表示系のソート指定
  • sync や cmdのパラレル実行
  • 入力履歴っぽいのをテンプレートで保存して使えるようにするような仕組み*4


まとめ

自分の用途に特化しているため、まとまりがなかったりAPIが微妙だったりするかもしれないですが

ssh / render / hosts などは割と便利だと思うので

興味がある方は触ってみてください。

また、コマンド自体はMouse::App::Cmdで定義しているだけなのでコマンド追加もコマンドファイル一つ作るだけでいけます。*5

コマンドを自分用に作るのもいいでしょう。


番外編:yogaコマンド依存度

ちなみに自分のコマンドランキングはこんな感じ。

 566 cd
 515 perl
 486 git
 407 yoga
 404 vi
 308 curl
 178 make
 150 ll
 135 node
 101 npm
 101 ack

どんだけyogaコマンドうってるの…

*1:コマンドによってはName関係無かったりしますけどw

*2:任意のタグや、任意の条件も指定可能です

*3AWSの管理画面でもできるようになって欲しいなー

*4:Launch入力時のパラメータを保持しておくとか

*5:これが例としてわかりやすいかも https://github.com/toritori0318/p5-Yogafire/blob/master/lib/Yogafire/Plugin/Command/allregioninfo.pm

2012-09-30

YAPC::Asia 2012感想

| 22:26 | YAPC::Asia 2012感想 - Perl勉強メモ アルパカDiary出張版 を含むブックマーク

毎年恒例のPerl祭り「YAPC::Asia2012」に行って参りましたので

トークや全体の感想などつらつらと。


前夜祭(今年は行けず…)


トークまとめ

Web::Security beyond HTML5

HTML5時代のWebアプリケーションのセキュリティについて

ブラウザ側とサーバ側でどういう脆弱性があるか、

またどういう対策をすべきか、というありがたいお話。

IEほんとひどい。


リアルタイム通知システムの舞台裏

リアルタイム通知システムを開発するにあたって、

課題となったところやそれを解決した方法などのお話。

実は今自分もかなり似たような仕組みを作っていて

課題のところなどは「あーそうですよねー」など妙に納得しながら聞いてました。

通知サーバをクラスタ化するのは自分もRedisで検証してみたんですけど

同時接続15000行かないくらいで頭打ちになってしまい止めてしまいました*1

RabbitMQのpubsubはまだ試してないので一度触ってみたいですね。

後ほど直接お話したかったんですが見つからず…


Perl初心者が作ったサーバ運用ツール

サーバ運用の自動化について。

マニュアルでやると大変だし失敗もするし

そういうことを減らすためにTouryoというツールを作ったというお話。

DSLで設定やテスト書いて(ロールごと?)sshでリモートインストールする、という感じ?

また、LTソンではTouryoをgithubに上げない理由をお話されていました。

もちろんそれらを理解した上なんですが、上げて欲しいなあと思いましたw

*2


Perlと出会い、Perlを作る

世界一高速なPerlをスクラッチで書いている、というお話。

ほとんど趣味の範囲で書いているらしいですが徐々に動くところまではきている様子。

目標は「mixiのhome.plが動くまでがんばる」ということで楽しみですねw

実際のベンチマークでは既存のperlよりだいぶ高いスコアが出ていました。


続・Mobage を支える技術

Prallel::Prefork + Q4M のベストプラクティス的な話からスマートフォン通知やランキングの裏側の話まで。

複数ワーカでQ4Mを利用した時にシグナルを受け取ると子プロセスが処理中でも死んでしまう、

さらにqueue_waitで止まってしまう、などの

問題点を一つ一つ実例を挙げながら解決していくという素晴らしい内容でした。

スマートフォン通知はiPhone向け(APNs)とAndroid(GCM)にどのような仕組みでpush通知が行われているか、

それをPerlでどのように書くか、といった内容。

最後にリアルタイムランキングをRedis+MySQLでPerlでどのように実現するかというお話でしたが

だいぶ時間が押していて端折られていました。詳しくお聞きしたかった!


Redmine::Chan で IRC からプロジェクト管理

Redmineの登録フローをIRCから自動で行うというお話。

単にチケット登録するだけではなくて、きちんとフローになっているのが凄いなーと思いました。

実際に使ってみたいです。


平均レスポンスタイム50msをPerlで捌く中規模サービスの実装/運用

現状のWeb広告についてのお話と、DSP(Demand-Side Platform)システムの裏側のお話。

自分も昔ASPアドサーバの開発運用をしていたことがあるのですが、

まあそのサービス自体は「昭和」な感じでしたので中身はもう全然違いますね。

「古典的なことを地道にやる」「事実を積み上げて判断する」

というのはガツンときました。


Perlアプリケーションのベンチマークとプロファイリング

Webアプリケーションのボトルネックをどのように見つけていくか?

そのポイントと手法と考え方についてのお話。

実践的なお話かつ、いままさにプロダクションで負荷テストなど行なっているので

とても参考になりました。

Parallel::Benchmark+Furlでローカルテストしてみましたが、

ApacheBenchと比較しても(思ったより)差がでないくらいのパフォーマンスだったので

仕事でも使わせていただきたいと思います!


Perlハッカーは息をするようにCPANモジュールを書く

どのような動機でCPANモジュールを書いているか、

またCPANに上げる時のポイントやCPAN怖くないよ!というお話。

ドキュメントには「モジュールに対する想いを全部ぶつけるところ」らしい!熱い!

自分はgithubにたくさんモジュール眠らせてるタイプです…


LT

1日目/2日目とも全て楽しませていただきました!が、

やはりどちらもトリをつとめた方々(mayuminさん)(takesakoさん)は秀逸。


Keynote

How Perl Changed My Life

Perl、またはコミュニティから現在の自分にどのように影響しているかというお話でした。

自分も初めて触れたLLがPerlということもあり、

自分自身にも置き換えて考えてしまいました。


LTソン

LTソン本当よかったです。

集中してセッション聴いたあとにリラックスする場*3としてとても良かったと思います。

自分も飛び込みしたかったんですが、2日目の競争率が激しそうだったのもあり断念。


懇親会

ご飯も美味しかったしTwitterで見かけたり絡んだりする方とお話できてとても嬉しかったです!

毎年思っていることですが、もっとアグレッシブに行けばよかった、とか

ひと通り話し終わったあとに「あの話をすればよかった」とか後悔…


まとめ

Closingで「YAPCは懐の広いカンファレンスでありたい」という言葉がありました。

たしかにPerlに限らず他言語の話もたくさんあったにもかかわらず

一緒に盛り上がれるYAPCは凄いなと思いました。

丸々2日間本当に楽しかったです。ありがとうございました&お疲れ様でした!

そしてやっぱり来年も参加したいと思いました!

*1:これだとだいぶ要件に届いてない

*2:自分が参考にしたいというのもあったり><

*3:もちろん盛り上がりもありつつも

2012-02-12

TwitterAPIでRT削除にハマった件+α

| 00:21 | TwitterAPIでRT削除にハマった件+α - Perl勉強メモ アルパカDiary出張版 を含むブックマーク

TwitterAPIでリツイート削除するのに結構調べたので備忘録で残しておく。


ぐぐってみると「destroyでOK」みたいなのは見つかるんだけど

destoryすると「他のユーザのツイートを削除することができません」

というエラーで削除できない。


この時点でハマってたんだけど、リツイートを削除するには

「リツイート元のステータスID」ではなく

「リツイートした時に新たに付与されるID」を使わないといけないらしい。

通常のタイムラインにはそのIDは表示されないため、

一度 retweet_by_me を叩いてリツイート元のIDを探す必要がある。


サンプルコード

retweet_by_meから元のステータスIDを探すんだけど、

直接指定することはできないのでループで元のIDを検索して

マッチしたらリツイートIDを取得する、

といったことをしないといけない。

ちょっと面倒ですね。



これだけでも何なので、

Twitter関連のTipsみたいなのも書いておきます。

Twitterのcreated_atを日付に変換したり

このあたり、Net::Twitterだと変換してくれるんですが

いろいろインストールされるのであまり使いたくないですよね!

そこで簡単な変換クラスを作ればいいと思います。

ちなみにREST APIで取得した場合とSearchAPIで取得した場合で

日付のフォーマットが違うので2つ用意してます。


friendを全員取得

これだけ。

ちなみに両想いの友達を取得したい場合は

上記レスポンスに「following」という要素があるので

これがONかどうかで判定することができます。