ぼろぼろ平原

困った

他人の全ツイートをJSONで一括保存するコマンドを作った

Twitterには、自分の全ツイートアーカイブをダウンロードできる機能があるが、他人のツイートはダウンロードできない。

support.twitter.com

そこで、他人のツイートをダウンロードするalltweetsというコマンドを作った(もちろん自分のツイートもダウンロードできる)。

許可されていれば、非公開アカウントのツイートもダウンロードできる。

インストール

gemコマンドでインストールできる。Macの場合はsudoが必要。

$ gem install alltweets

使い方

結果は標準出力に表示されるのでいい感じにリダイレクトする。

$ alltweets tatzyr > tatzyr.json   # tatzyrのツイートをJSON形式でダウンロード

github.com

RubyGemsとGitHubに公開したgemの名前を変更する

前提

  • gemをGitHubRubyGemsに公開したけど、あとから名前を変えたくなった
  • oldnameという名前のgemをnewnameという名前にしたい

oldname gem側の作業

以下のコードをoldname gemのどこかに書いて、deprecatedになることを伝える。

warn "[DEPRECATION] This gem has been renamed to `newname` and will no longer be supported. Please switch to `newname` as soon as possible."

さらに以下のコードをoldname.gemspecに追加すると、oldname gemのアップデート時にこのメッセージが出る。

spec.post_install_message = <<-MESSAGE
 ! The 'oldname' gem has been deprecated and has been replaced by 'newname'.
 ! See: https://rubygems.org/gems/newname
 ! And: https://github.com/YourID/newname
MESSAGE

最後にバージョンを1つ上げる。

lib/oldname/version.rb

module OldName
  VERSION = "0.1.1" # テキトーに0.0.1上げる
end

newname gem側の作業

newname.gemspecdescriptionsummaryに以下の文を追加しておくと親切。

Formerly known as 'oldname'.

Twitterのふぁぼを寿司にするChrome拡張作った

f:id:tatzyr:20151104190122p:plain:w640

Twitterのふぁぼがハートアイコンの「いいね」に変わった。

Twitterにハートが登場しました | Twitter Blogs

そういう事情なのでふぁぼを🍣にするChrome拡張を作ったらやたら「いいね」された。

ソースコードGitHubで公開したが、こっちは0 Starなのが大変厳しい。

github.com

GitHubのStarも🍣に置き換えるChrome拡張を作ったらStarを付けてもらえるだろうか。

iPhoneのカレンダーをGoogle Calendarに移行する方法

f:id:tatzyr:20151030202735p:plain:w171

iPhoneiPadのカレンダーをGoogleカレンダーに移行する方法。同期ではなく移行

iPhoneからAndroidにカレンダーを引っ越したいときや、Googleカレンダーと連携するアプリをiPhoneで使いたいならこの方法で移行するのがおすすめ。

手順

  1. iCloudカレンダー にサインイン

  2. サイドバーのアイコン > パブリックカレンダー をクリックし、カレンダーを共有する

    f:id:tatzyr:20151029133200p:plain:w289 f:id:tatzyr:20151029133210p:plain:w430

  3. 共有したカレンダーの URL をコピーし、ブラウザのアドレスフィールドに貼り付ける(まだreturnキーは押さない)

  4. webcalhttpに変更してからreturnキーを押す。すると、ICS ファイルがダウンロードされる

  5. パブリックカレンダーのチェックを外し、カレンダーの一般共有を停止する

  6. Google Calendarにログイン

  7. マイカレンダー > ▼ > 新しいカレンダー をクリックし同名のカレンダーを作成する

    f:id:tatzyr:20151030200437p:plain:w437

  8. 右上の設定アイコン > 設定 >「 カレンダー」タブ > カレンダーをインポートをクリックする

    f:id:tatzyr:20151029144652p:plain:w183 f:id:tatzyr:20151029144449p:plain:w464

  9. 「ファイルを選択」ボタンでダウンロードしたICSファイルを選択する

  10. 「カレンダー」セレクトボックスで、先ほど作成した同名のカレンダーを選択する

    f:id:tatzyr:20151030195238p:plain:w539

  11. インポートをクリック

これでiCloudカレンダーのGoogle Calendar移行は完了。

るびまRubyist Hotlinks - インタビュイーの好きなメソッド・嫌いなメソッド一覧

Rubyist Magazine(るびま)には、著名なRubyistにインタビューを行うRubyist Hotlinksという企画がある。 Rubyist Hotlinksでは毎回「好きなメソッド、嫌いなメソッドはなんですか?」という質問がされるのでまとめた。

No. インタビューイ 好きなメソッド 嫌いなメソッド
第1回 まつもとゆきひろさん Kernel.#eval Kernel.#eval
第2回 前田修吾さん Enumerable#collect String#gsub!
第3回 かずひこさん Object#=== Kernel.#eval
第4回 ただただしさん みんなだいたい好き String#scan
第5回 増井俊之さん Array#eachEnumerable#collect、yield 特になし
第6回第7回 江渡浩一郎さん BasicObject#method_missing、Enumerable 特になし
第8回 田中哲さん Regexp#to_s ブロック付きメソッドの中でのretry *1
第9回 中田伸悦さん yycompile *2 特になし
第10回 わたなべひろふみさん Kernel.#p Object#initializeMutex#synchronize
第11回第12回 後藤謙太郎さん Kernel.#p Object#inspect *3
第11回第12回 後藤裕蔵さん Enumerable#inject 特になし
第13回 関将俊さん Enumerable#inject 特になし
第14回 角谷信太郎さん Object#extendModule#const_get Test::Unit::Assertions#assert_equal *4
第15回 artonさん Object#send 自分の理解できないもの
第16回 essaさん Enumerable#collect 特になし
第17回 青木峰郎さん String#slice(regexp, n) *5 Enumerable#find_all
第18回 立石孝彰さん Enumerable#inject Kernel.#eval
第19回 伊尾木将之さん Array#eachString#next String#+
第20回 石塚圭樹さん Module#module_eval Array#nitems *6
第21回 原信一郎さん Enumerable#map Enumerable#inject
第22回 nariさん GC#enable GC#disable
第23回 yharaさん Enumerable 特になし
第24回 okkezさん Enumerable#map Kernel.#set_trace_func
第25回 加藤勇也さん BasicObject#instance_eval BasicObject#instance_eval
第26回 cuzicさん Module#class_eval Kernel.#p
第27回 小波秀雄さん Enumerable#map Kernel.#printf
第28回 Yuguiさん BasicObject#instance_eval Math.sin! *7
第29回 松田明さん 言及なし 言及なし
第30回 遠藤侑介さん Array#packString#unpack Module#define_method
第31回 樽家昌也さん Thread.new ObjectSpace
第32回 卜部昌平さん Enumerable#lazy 特になし
第33回第34回 大場光一郎さん do 特になし
第33回第34回 大場寧子さん Enumerable#map Object#nil?
第35回 島田浩二さん 言及なし 言及なし

*1:Ruby 1.9で廃止。今はbeginとendの中でのみ使える

*2:MRIの関数

*3:これをデバッグする作業が嫌い

*4:テスティングフレームワーク周りはゴタゴタしていたのでRuby 2.2.0のリファレンス・マニュアルにこのメソッドはない。参考: Rubyのテスティングフレームワークの歴史(2014年版) - ククログ(2014-11-06)

*5:引数も重要

*6:Ruby 1.9で廃止。nilではない要素の数を返す

*7:昔はあったらしいが発見できなかった。CMath.#sin!なら今でもある。

RSpecで「while line = gets」をテストする方法

RSpecwhile line = getsのような標準入力のループをテストしたいとき。

Kernel.#getsARGFをレシーバとしたメソッドの省略形なので、ARGF.getsをモックにすれば良い。

テストしたいコード:

# 標準入力を行ごとに区切って配列にするメソッド
def foo
  ary = []
  while line = gets
    ary << line.chomp
  end
  ary
end

テストコード:

require "rspec"
require "stringio"
require_relative "foo"

describe "foo" do
  it "標準入力を行ごとに区切って配列にする" do
    inputs = StringIO.new("line1\nline2\n")
    allow(ARGF).to receive(:gets) { inputs.gets }
    expect(foo).to contain_exactly("line1", "line2")
  end
end

rbenvのインストールにはrbenv-installerを使おう(追記:使わない方がいい)

追記:2018-05-15

rbenv-installerは以前とは別物になりました。 もはやrbenv-installerを使うメリットはありません。

追記終わり。あとは古い内容。


rbenv-installerを使うとrbenvとプラグインを同時に導入できる。

ruby-buildなどを入れたりする必要がなくなる。

https://github.com/fesplugas/rbenv-installer

https://github.com/fesplugas/rbenv-installer

rbenv-installerを使ったrbenvのインストール

以下のコマンドでrbenv本体とruby-buildrbenv-default-gemsrbenv-gem-rehashrbenv-updateなどのプラグインが一発でインストールされる。

$ curl https://raw.githubusercontent.com/fesplugas/rbenv-installer/master/bin/rbenv-installer | bash

以下のコードを~/.bash_profile~/.bashrcに追記してbashを再起動するとrbenvが使えるようになる。

# rbenv
export RBENV_ROOT="${HOME}/.rbenv"
if [ -d "${RBENV_ROOT}" ]; then
  epxport PATH="${RBENV_ROOT}/bin:${PATH}"
  eval "$(rbenv init -)"
fi

rbenv-installerで入るプラグイン一覧

個々の紹介はしないけどrbenv-installerを使うとこれらがすべて使えるようになる。

  • rbenv-bootstrap
  • rbenv-default-gems
  • rbenv-gem-rehash
  • rbenv-update
  • rbenv-use
  • rbenv-vars
  • rbenv-whatis
  • ruby-build