GitHubの気になるユーザーのレポジトリをiOSで一覧表示する

次のバージョンのRubyPico 0.9 からリンク付き文字列を生成できるようになった。いちいちURLを表示しないですむ。

puts AttrString.new("foo", link: "http://ongaeshi.me")

GitHubのレポジトリ一覧を表示してみる。

def repos(user)
  json = Browser.json("https://api.github.com/users/#{user}/repos?sort=pushed&per_page=8")

  puts "#{user}'s repos"
  json.each do |e|
    puts AttrString.new(e["name"], link:  e["html_url"])
  end
end

repos('ongaeshi')

loop do
  print "user?> "
  name = gets
  repos(name)
end

最初に自分のレポジトリを表示する。2回目以降はユーザー名を入力してその人の最近のレポジトリを見ることができる。

f:id:tuto0621:20160924143357p:plain

matzはstreemやってるとかいつでも分かるようになった。

RubyPico開発日誌4 - getsでirbを再実装

コンソールを表示しながら入力できるようになったので、irbをgetsで再実装してみた。

# # irb
#
# ## Description
# Interactive Ruby Shell (REPL).

puts "irb - Interactive Ruby Shell"
no = 0

loop do
  print "irb:%03d> " % no
  cmd = gets
  
  puts cmd
  
  break if cmd == "exit"
  
  begin
    puts "=> #{eval(cmd).inspect}"
  rescue Exception => e
    puts e.message
  end
  
  no += 1
end

実行画面。pがちゃんとCRubyと同じ挙動になったぞ万歳。(コンソールに出力しつつ、戻り値も返す)

f:id:tuto0621:20160924004944p:plain

文字に色付けたくなるね。

英会話はできなくていいから英語が読めるようになりたい人の勉強法

Create Your Own Programming Languageを紹介したときに洋書読むの大変そうという話を見たので自分が使った教材を紹介してみる。

読む > 話す

私のスタンスは世間一般とは多分逆で、

  • 読む(優先高)
  • 書く(優先低)
  • 聞く(優先すごく低)
  • 話す(優先すごく低)

になっている。「しゃべったり聞いたりしないと英語能力はいつまでたっても向上しませんよ!」という言葉を受けてヒアリングも取り入れたこともあったけどいくら勉強しても使う機会の少ないものはモチベーションが保てなかった。

書きはGitHubのIssueにコメント書いたり質問に返信するときにたまに使う。あとコミットログ。読むだけじゃなくて書くと確かに文法に対する理解が格段に向上するのを感じるときがあるので、(使うシチュエーションを作り出せるのなら)聞く、話すも取り入れるといいんだとは思う。でもそれよりも自分が楽しく勉強できる状況をコントロールする方がずっと大切だとは思う。

モチベーションを保つ == 英語を読む理由を作り出す

モチベーションを保つために基礎勉強よりも実践的に使える状況を頑張って作り出すことに多く時間をかけている。私の場合は本を読むのが割と好きなので、

「英語じゃないと読めないけどどうしても読みたい文章」

を頑張って探すことに結構時間を使っている。これはとてもうまくいったと思う。

英語じゃないと読めないけどどうしても読みたい文章

英語力0から洋書を読むだけで英語を学んでいくリストに自分が読んできた洋書をまとめたので参考にして欲しい。

Create Your Own Programming LanguageやThe Rust Programming Languageはまさに読みたいのだけど英語じゃないと読めない系の書籍だった。Rust本なんてepubも提供されてて無料で読めたりしてお得感がある。Swift本もepubがあったのでcalibreでmobiに変換してKindleに入れて今読んでいる。

少し前にhigeponさんのブログで話題になっていたSoft Skillsもどうしても読みたくて頑張って読んだ。(もう日本語版でてるけどね)

あと、英語に不慣れな序盤におすすめなのが「全体の50%くらいは知っている本を読む」という方法。英語はわからなくても内容は理解しているのでなんとなく分かったりすることが多い。同じ理由でソースコードが多く載っている本もよい。私はRubyのテキスト処理について紹介しているText Processing with Rubyがそんな感じだった。(もちろん知らないこともたくさんあった)

英文法の本

さておき英文法は勉強した方がよい。基礎的な英文法を理解してしまえばあとは辞書さえあれば時間をかけることで読めるようになるので。

  • 英語ベーシック教本
  • 基本からわかる英語リーディング教本
  • English Grammar in Use

あたりが役立った。順番に紹介していく。

英語ベーシック教本

英語ベーシック教本―ゼロからわかる

英語ベーシック教本―ゼロからわかる

まずはこの本を買うのがいい思う。中学校の英語レベルから順に教えてくれるので難しい英語の知識は必要としない。

品詞(名詞、動詞、形容詞、副詞など)という文章の最小単位からはじまり、それがどのような働き(名詞は主語や目的語に、動詞は述語動詞に、など)をするか、応用として動詞を活用(playing, played)すると他の働き(動名詞や形容詞用法)ができる、などを低レイヤーから積み上げるように丁寧に説明してくれる。本全体では文章内の品詞と働きを全て正確に言えるようになる、というのが大きな目的。

他の英語教本と比べるとかなり理屈っぽいがその感じがプログラミング言語の初心者向け教本にすごく似ている。なのでプログラマにはとてもおすすめ。(もっと早く出会いたかった) 新しいプログラミング言語を覚えるつもりで英語を学ぶことができると言うとちょっと言い過ぎかもしれないが、そんな気持ちで取り組むとちょっと気が楽になるかもしれない。(習得した時の費用対効果も新進気鋭のプログラミング言語よりは期待値が高いと思う)

基本からわかる英語リーディング教本

基本からわかる英語リーディング教本

基本からわかる英語リーディング教本

ベーシック教本の後に読むとよい。英語ベーシック教本ではとりあげられなかった従属接続詞などの高度な文法の説明と、反復して解くことでどんな形の英文も読むことができるようになる38題の短文問題が収録されている。

また英語ベーシック教本を読んでいなくても進められるようになっているので英語に少し自身のある人はこちらだけ購入してもいいかもしれない。私自身先にこちらを購入したが特に困るようなことはなかった。ただし英語ベーシック教本を先に読んだ方が理解の坂道の傾斜が低くなるのでおすすめ。

English Grammar in Use

English Grammar in Use Book with Answers and Interactive eBook: Self-Study Reference and Practice Book for Intermediate Learners of English

English Grammar in Use Book with Answers and Interactive eBook: Self-Study Reference and Practice Book for Intermediate Learners of English

すっかり有名になった本。「英語じゃないと読めないけどどうしても読みたい文章」の1つとして英語で書かれた文法書を読む、というのは割とよい。本の内容が理解できるようになるという意味で英語が読めるようになる喜びをすぐに味わうことができる。

まとめ

私自身のステータスとしては

  • English Grammar in Use Book は途中で挫折(でも役にたった)
  • 英語ベーシック教本 は読了
  • 基本からわかる英語リーディング教本 も読了、短文問題を繰り返し解き中(今2週目)
  • 今読んでる本はリスト

といった感じだが、自身が内容に明るく簡単な文章なら大分スラスラと読めるようになってきた。例えばThe GitHub BlogGoogle Operating System (Unofficial Google Blog)RSSで購読して基本的に全記事読むようになった。どちらもあまり難しい単語を使わないでくれるので助かる。

最近読んで良かったのはGitHub Pages now runs Jekyll 3.2とか、Deoptimization Engine by shyouhei · Pull Request #1419 · ruby/ruby(斜め読み)とか。

読んで面白かった英語記事ははてブenglishタグにブックマークしている。

英語力0から洋書を読むだけで英語を学んでいくリスト その2

旧ページから引っ越しました。

本当に読みたい洋書だけを読んで英語力を向上させていく取り組みです。 はるか昔にやったTOEICは400点くらいだった記憶があります。

役に立つ基礎知識

  • epubcalibreを使うことでKindleで読めるmobiに変換できます。
  • Send to Kindle を使えばmobiを添付してメールするだけで自分のKidleに書籍を転送することができます

(読書中: 10%) Politics and the English Language

Politics and the English Language

ジョージ・オーウェルのエッセイ。「政治と英語」。

Producing Open Source Software

Producing Open Source Software

(購入) - 2016-08-12 無料

日本語タイトル「オープンソフトウェアの育て方」。日本語のepubもある!と喜んだが残念ながらうまく開けなかった(ドイツ語や中文も無理だった)。仕方がないので英語版のepubをダウンロード。

日本語版もWebからは読める模様。

(追記) 以下の手順でepubを修正すれば日本語版も読むことができる(thx: @icm7216)

Spark

Spark: 17 Steps That Will Boost Your Motivation For Anything (ebook) - PsyBlog $10.00

(購入) - 2016-08-05

PSYBLOGの人が書いた本。短くて安いので買ってみる。

Create Your Own Programming Language

Create Your Own Programming Language $39.99

たった100Pでプログラミング言語の作り方の基礎が学べる。

感想 - 自分でプログラム言語を書いてみたい人は「Create Your Own Programming Language」がおすすめ - ブログのおんがえし

REWORK

REWORK ¥1,400

(購入) 2016-05-01

日本語訳もあるけど、37signalsっぽい雰囲気を生で感じてみたかったので原著で。

自分が作ったものの過程で学んだ副産物もコンテンツだからちゃんと公開しろよ!(意訳)」みたいなトピックが妙に心に残った。(だからこんな記事書いてる)

iOS 9 SDK Development

The Pragmatic Bookshelf | iOS 9 SDK Development $27.00

(購入) 2016-01-03

ずっとiOS5辺りの古い知識のままiOSアプリを作っているのでそろそろ刷新しようと思い購入。

dispatch_asyncを使った非同期処理の書き方とかかなり参考になった。

Mastering Emacs

The Mastering Emacs Ebook $20.00

(購入) 2015-11-28

セール中で20$だったので買った。ブログも良い情報が多い。

感想 - Mastering Emacsのすすめと、意外と便利な数引数の話 - ブログのおんがえし

The Rust Programming Language

Download 'The Rust Programming Language' E-Books (PDF, EPUB, MOBI) 無料

公式マニュアルをebook化したもの。epub版をcalibreでmobiに変換して読んでます。

読了、メモリとポインタ周りの話が面白かったです。GCを入れてシンプルに解決するGoと違い、たくさんの仕組みを導入して泥臭く(そして実行時オーバーヘッドを最小にして)解決しようとする姿勢が良いです。

ソフトスキル - ソフトウェア開発者のライフマニュアル

Soft Skills $27.99

Elixirでプログラミング

Programming Elixir $24.00

  • 並列プログラミングに特化したプログラミングの概念がざっくりと分かった
  • async-await (C#)やActor (Scala) いったものがElixir(というかErlangVMの)の強力な並列性の上にライブラリとして作られている所。
    • async-awaitやActor,Taskはあくまで「よく使うライブラリ」
    • その原子にあるのは「軽量で安全なメッセセージパッシングでやりとりするErlangプロセス」ということがなんとなく分かった気がする。
  • Elixirは見た目がRubyに似ているので読みやすくて助かった。
  • attr_reader がないとか、Rubyいいけどここはこっちの方がよくない?みたいな「オレオレRuby」感があるのも結構好き。(私はattr_reader好きだけど)
    • module A.B.Math … end みたいにモジュール名を名前空間付きで一行で定義できるのはいいなと思った。

健康なプログラマー

The Healthy Programmer

  • サンプルコードのない本を読めるかチャレンジ
  • 結構大変だったがなんとか読めた(時間はいままで一番かかった)
  • 日本語書籍の薄さを見て(こんなに英語だと時間がかかるものかと)愕然とした

Rubyでテキスト処理

Text Processing with Ruby

  • 自分のそこそこ詳しいことなら英語でも読みやすいんじゃないか作戦
  • うまくいった、半分くらいはもう知っていることだったので半分を予測しながら読める
  • Gitのプログレスバーみたいなやつを再現するにはstderrを使えばよい、ということが分かったのが最大の収穫

Rubyでゲームプログラミングを学ぶ

Learn Game Programming with Ruby

  • Rubyでゲームプログラミングを学ぶ本
  • ゲームだと画像も多めで読みやすいじゃないかという予測→当たった!
  • もしかしたら子供も読むことを想定して語彙も簡単にしてくれているのかもしれない

使用中の英文法

English Grammar in Use

  • まずは最低限の英文法を覚える
  • 英文法を覚えるために英語で書かれた英文法の本を読むのおすすめ
  • 感想1, 感想2 全部は終わらなかった、全体の2/3くらいで飽きたので実践形式で読みたい本を読んでいくことにした

更新履歴

  • 2016-08-09 引っ越し
  • 2015-09-26 新しいものを一番上に置くようにしました
  • 2015-09-26 ソフトスキル -ソフトウェアでデベロッパーのライフマニュアル- 追加
  • 2015-09-26 Programming Elixir読了

RubyPico開発日誌3 - getsを実装する

Popup.input()を使えば今でもプログラムに入力を渡すことはできるのだが、ポップアップ中は後ろの画面にアクセスできなくなってしまうのが不便。という訳でgetsを実装したい。

puts "Please input >>>"

while l = gets
  break if l.empty?
  puts l
end

puts "The end."

iConsoleがそれっぽい画面だったので参考に軽く実装。それっぽい画面にはなった。

f:id:tuto0621:20160819021650p:plain

しかしいくつかの不満が残る。(上から致命度が高い)

  • プログラム起動直後に[_inputField becomeFirstResponder]すると入力がソフトウェアキーボードの下に隠れてしまう
  • LINEのように複数行入力できるようにしたい
  • getsを使用しないときは入力部分は非表示にしたい(OR とても小さくしたい)、代案としては入力不可

いくつかモンキーパッチを試してみたがうまくいかない。この辺りでiOSのUI周りのプログラムに対するレベルアップが必要な気がしてきた。

cocoapodsで参考になりそうなpodsを探すと以下が良さそう。

知りたいことは以下。

  • 非storyboardでAutoLayoutを使ったUIの構築
  • プログラム起動直後にフォーカスを移してもUIがソフトウェアキーボードの下に隠れないように
  • 複数行の入力

その他、今は使わないけど面白そうな機能。

  • Autocompletion (絵文字の補完)
  • Markdonw Formatting
  • Typing Indicator (プログラムからの入力補助に使えるかも?)
  • Panning Gesture
  • Shake Gesture
  • External Keyboard (キーボードショートカット)

しばらく時間をかけてコードを読んでみよう。まずは動かすところから。

RubyPico 0.8 リリース - mainが不要に、画像がputs可能に

RubyPico 0.8 をリリースしました。以前に紹介したようにメインルーチンをmain関数で囲まずに実行できるようになり、よりRubyらしく書けるようになりました。

puts "Hello, RubyPico!"
puts "http://rubypico.ongaeshi.me"
puts Image.load("chat_ruby.png")

f:id:tuto0621:20160816111155p:plain

アプリ内のサンプルコードは全て新しい書き方に書き直されているので詳しくはそちらを参考にしてください。

RubyPico

RubyPico

  • ongaeshi
  • 仕事効率化
  • 無料

mainが不要に

CRubyと同じように書けるようになったため、Webや書籍のサンプルコードをコピペで動かすことができるようになりました。例えばこれは初めてのRuby内の素数を求めるサンプルコードですが、そのままRubyPicoで動かすことができるようになります。

(2..100).each do |candidate|
  sqrt = Math.sqrt(candidate)
  factor_found = (2..sqrt).any? {|i| candidate % i == 0}
  if factor_found then
    print "#{candidate} は合成数\n"
  else
    print "#{candidate} は素数\n"
  end
end

f:id:tuto0621:20160815214622p:plain

旧コードの動かし方

main関数を明示的に呼び出すようにしてください。

def main
  .
  .
  .
end

# プログラムの最後にmain呼び出しのコードを追加
main

チャットの方は動かなくなってしまいます、すいません。手元にもたくさんのチャットコードがあり悩んだのですがCRubyと同じ感覚で使えることを優先することにしました。

なお、チャットUIのようにプログラムに対して画面をオーバーレイせず入力を渡す仕組みは別途用意する予定です。

画像をURL指定で表示できるように

Image.pick_from_libraryでフォトライブラリから、Image.load(path)サンプル画像を表示することができましたが、加えてURLを指定して画像を表示することができるようになりました。

URL = "http://rubypico.ongaeshi.me/images/rubypico_icon.png"
logo = Image.load(URL)
puts logo

複数の画像の出力が可能に

最初の実行結果でお気付きの方もいるかもしれませんが、テキストと画像を混在して出力させることができるようになりました。さらに複数枚の画像を出力することもできます。サンプルのimage.rbは選択した画像の右下にRubyPicoのロゴ画像を重ねて表示させています。

# # image
#
# ## Description
# Display image and overray with logo

puts "image"
image = Image.pick_from_library
# image = Image.load("sample.jpg")
puts image

puts "logo"
URL = "http://rubypico.ongaeshi.me/images/rubypico_icon.png"
logo = Image.load(URL)
puts logo

puts "overray"
overrayed_image = Image.render(image.w, image.h) do
  image.draw(0, 0, image.w, image.h)

  w = image.w / 8
  h = logo.fith(w)

  img = logo.sepia
  img.draw(image.w - w,
           image.h - h,
           w,
           h)
end
puts overrayed_image

画像をコピー、カメラロールに保存したい場合はその画像を長押ししてください。

f:id:tuto0621:20160816111239p:plain

「初めてのRuby」をRubyPicoで実際に動かしながら読む

RubyPico向けの入門記事を書きたくて、Rubyの入門書を改めて色々と読み直している。まずはずっと気になっていた「初めてのRuby」を購入。

初めてのRuby

初めてのRuby

pdfはHonyomiに突っ込んだのでいつでも検索できるようになった。こういう振り返り記事を書くときはとても役に立つ。

f:id:tuto0621:20160815214402j:plain

今回初の試みとして

  • iPadでpdfを表示 (こっちは紙の書籍でもKindleでもよい)
  • iPod touchでRubyPicoを実行

させてサンプルコードを実行しながら読み進めた。今申請中の0.8からはmain不要でスクリプトを書けるようになり、大分CRubyと同じ雰囲気で書けるようになったからだ。例えば書籍内で紹介されていた素数か判定する以下のプログラムはそのままRubyPicoで実行することができた。

(2..100).each do |candidate|
  sqrt = Math.sqrt(candidate)
  factor_found = (2..sqrt).any? {|i| candidate % i == 0}
  if factor_found then
    print "#{candidate} は合成数\n"
  else
    print "#{candidate} は素数\n"
  end
end

実際にコードを打ち込んで挙動を確認しながら読み進めると理解が一段深くなる。ifにはthenをつけない、{|i| }{ |i| }派、みたいな自分のスタイルに置き換えても同じように動くことを確認していけるのもよい。

f:id:tuto0621:20160815214622p:plain

書籍自身の感想としては、RubyコミッタのYuguiさんが書いただけあってRubyの深いところまで理解した上でRuby初心者(この書籍は他言語を習得しているけどRubyを初めて使う人を対象に書かれている)向けの内容が厳選されており大変読みやすい。私は割と必要なスクリプトを書くために実践的にRubyを覚えてしまったところがあるので、基礎的な知識がポッカリ抜けている部分がありそれらを補完することができた。String#[regexp]とかString#%とか知らなかったけどこれからは積極的に使っていこうと思う。私が使い慣れているC++C#などの静的言語と比較しながら説明してくれるのもわかりやすかった。

特に面白かったのは7章のメソッドと8章のオブジェクトとクラスで、なんとなく使っていたブロック付きメソッドとProc型の違いブロックを引数として受け取る方法などがすごく短いページに(ここ重要)簡潔にまとめられていて大変よかった。8章などRubyの強力なメタ機能をささえるクラス、オブジェクト、特異、モジュールといったコア要素の一通りの説明がたった22Pに収められていて必要に応じてまた読み返したいと思う。あとモジュールの説明で2つの目的があってMix-in(これはよく見かける)と名前空間の提供(これ割と見かけない)というのをちゃんと章を分けて説明してくれていて大変安心した。他の人のコード読んだりすればモジュールを名前空間として使ってよいのはなんとなく分かるのだけどそれを章立てして説明してくれているのは初めてみたので(多分書いてあるのだけど私が今まで見落としていた)。

と、いう訳ですでにRubyに慣れている人でも「初めてのRuby」は大変おすすめです。短いページ数に必要な情報が凝縮されているのでさっと読んだ後に必要に応じて簡単に読み返せるのもよいです。

※ 余談ですが最近はたくさんの情報が網羅されてページ数の多い本よりも必要な情報が短いページに凝縮された本の方を好むようになってきました