mrubyにUIButtonをバインド(登録)する

PictRubyでUIButtonやUILabelが追加できるようになったら楽しいだろうなぁと思い色々と実験中。ぼんやりと動いてきた。

PictRuby/mrb_button.m at feature/add-button · ongaeshi/PictRuby

以下、細かいポイント

ARCを切る

retain, release を手動で制御したいので mrb_button.m には-fno-objc-arcを設定しておく

ARCの有効/無効設定を切り替える方法 - Dolice Lab

mrubyにButton型を登録

MRB_SET_INSTANCE_TT(cc, MRB_TT_DATA);インスタンスをデータオブジェクトとして登録する。

/* Setup & Unsetup */
void
mrb_pictruby_button_init(mrb_state *mrb)
{
    struct RClass *cc = mrb_define_class(mrb, "Button", mrb->object_class);
    MRB_SET_INSTANCE_TT(cc, MRB_TT_DATA);

    mrb_define_method(mrb, cc, "initialize", initialize, MRB_ARGS_NONE());
}

void
mrb_pictruby_button_final(mrb_state *mrb)
{
}

UI生成時にretainを呼ぶ

UIButton自体の生成関数は作成途中。ポイントは生成した時にretainを呼ぶこと。 to_value()の中身はこの後で。

/* Create UIButton */
static mrb_value
initialize(mrb_state *mrb, mrb_value self)
{
    UIButton *button = [[UIButton buttonWithType:UIButtonTypeRoundedRect] retain];
    button.backgroundColor = [UIColor clearColor];
    [button setTitle:@"TEST" forState:UIControlStateNormal];
    button.frame = CGRectMake(100.0, 200.0, 100.0, 50.0);
    [globalScriptController.view addSubview:button];

    return to_value(mrb, mrb_class_ptr(self), button);
}

解放関数にreleaseを設定

Data_Wrap_Structはmrubyにデータオブジェクトをぶら下げる時のAPIRubyGCでオブジェクトが解放されたときにfree_funcが呼ばれる。 __bridgeはObj-CとC間でポインタをやり取りする時のおまじない。 結果として、初期化時にretainされたカウントが-1され、解放される(はず)。

/* Setup data_type */
static void
free_func(mrb_state *mrb, void *p)
{
    [(__bridge UIButton*)p release];
}

struct mrb_data_type mrb_pictruby_button_type = { "pictruby_button", free_func };

static mrb_value
to_value(mrb_state *mrb, struct RClass *cc, UIButton *ptr)
{
    if (ptr) {
        return mrb_obj_value(Data_Wrap_Struct(mrb, cc, &mrb_pictruby_button_type, (__bridge void*)ptr));
    } else {
        return mrb_nil_value();
    }
}

結果

とりあえずボタンらしきものが画面に表示された。

f:id:tuto0621:20160308000645j:plain

次はクリックされたときにRubyで書いたブロックを実行できるようにしたい。

Button.new do
  Popup.msg "HELLO!"
end

「本」と「読書」にまつわる便利なサイトをスマホから横断検索する

「本」と「読書」にまつわる便利&参考になるサイトをまとめてみた - ぐるりみち。がとても面白かったです。記事自体も素晴らしいし、はてぶのコメントも、ここには載ってないけどこのサイトもおすすめ、ほとんど知ってたけどこれは知らなかった、などよいコメントが並んではてなブックマークの楽しさを再認識しました。

どうせなら特定のキーワードでまとめて横断検索できたらさらに便利になりそうだと思いPictRubyのスクリプトを書きました。よかったら使ってやってください。

f:id:tuto0621:20160303233158g:plain

インストール

PictRuby

PictRuby

  • ongaeshi
  • 仕事効率化
  • 無料

ソースコード

以下をコピペしてPictRubyに貼り付けてください。

get_sample.rbを使ってja/book_searchでも取得するとこができます。

# # ja/book_search
#
# ## 概要
# 本にまつわる便利サイトからまとめて検索できます。
# テイクストックは検索後に地域を指定してください。
# 想は右のCLEARボタンを押したあとにクリップボードから貼り付け。
# 本の書き出しはジャンプするだけです。

def main
  word = Popup.input("検索ワード?")
  Clipboard.set(word)
  word = URI.encode_www_form_component(word)
  
  puts <<EOF
テイクストック
https://takestock.jp/searches?q=#{word}

カーリル
http://calil.jp/search?q=#{word}


http://imagine.bookmap.info

本の書き出し
http://kakidashi.com

ダ・ヴィンチニュース
http://ddnavi.com/?s=#{word}

HONZ
http://honz.jp/search/?ie=UTF-8&page=1&fulltext=#{word}

bookvinegar
http://www.bookvinegar.jp/search/word/?q=#{word}

読書メーター
http://i.bookmeter.com/s?q=#{word}

本が好き!
http://www.honzuki.jp/smp/book/new_search/?search_word=#{word}
EOF
end

使い方

入力された単語で本と読書にまつわる便利なサイトを横断検索します。

  • 「テイクストック」は検索後に地域を指定してください。
  • 「想」は右のCLEARボタンを押したあとにクリップボードから貼り付け。(検索ワードは自動でクリップボードにコピーされます)
  • 「本の書き出し」はジャンプするだけです。(でもたまに見ると楽しい)

スクリプトランチャーアプリ経由で通知センターに登録しておくとさらに便利です。

よく使うサイトを追加したり、自分の好きな順に並び替えたり、自分の使いやすい形にカスタマイズしていきましょう。

iOSのRubyプログラミング環境 PictRuby 0.4 - p, puts が使えるように

PictRuby - Ruby Programming Environment in iOS

0.4にバージョンアップしました。

p, puts が使えるように

p, puts を使ってテキストを出力できるようになり、CRubyに少し近づきました。九九テーブルを出力するプログラムも以下のように簡単に書けるようになります。

# # kuku

def main
  puts "九九 🙂😌🙄😨😢😩😬😁😄"
  puts
  
  1.upto 9 do |a|
    1.upto 9 do |b|
      printf "%3d", a * b
    end
    puts
  end
end

絵文字も簡単にputsできるのはスマホのいいところですね・・。

f:id:tuto0621:20160221125338p:plain

0.3 以前のコードの変更方法

今までテキストを返していたコードはputsを使う必要があります。(画像を返すときは今までどおりです)

# Before 0.3
def main
  "Hello, PictRuby"
end
# After 0.4
def main
  puts "Hello, PictRuby"
end

スクリプト名の変更が可能に

ファイル名を直接変更できるようになりました。

f:id:tuto0621:20160221125113g:plain

インストール

RubyPico

RubyPico

  • ongaeshi
  • 仕事効率化
  • 無料

過去の記事

PictRubyでスマホプログラミング - ブログテンプレートエンジンを作る

PictRubyプログラムの紹介記事を自動生成します。(この記事自体もブログテンプレートを使って作成されました。)

PictRuby

PictRuby

  • ongaeshi
  • 仕事効率化
  • 無料

ソースコード

以下をコピペしてPictRubyに貼り付けてください。

# blog_template.rb

def main
  title = Popup.input "Title?"
  summary = Popup.input "Summary?"
  usage = Popup.input "Usage?"
  
  template title, summary, usage
end

def template(title, summary, usage)
  <<EOF
# PictRubyでスマホプログラミング - #{title}


#{summary}

[https://itunes.apple.com/jp/app/pictruby/id1042498865?mt=8&uo=4:embed]

## ソースコード

以下をコピペしてPictRubyに貼り付けてください。

[get_sample.rb](http://ongaeshi.hatenablog.com/entry/read-pictrubygems-script-from-pictruby-app)を使って``でも取得するとこができます。

# ↓`の前のスペースは除去してください
 ```ruby
#{Clipboard.get}
 ```

## 使い方

#{usage}


スクリプトは[ランチャーアプリ経由](http://ongaeshi.hatenablog.com/entry/pictruby-0.3)で通知センターに登録しておくとさらに便利です。


EOF
end

使い方

あらかじめ紹介したいソースコードをコピーしておきます。実行してタイトル、概要、使い方を入力します。複数行の入力にはClipboard.getを使うのがポイントです。

スクリプトランチャーアプリ経由で通知センターに登録しておくとさらに便利です。

PictRubyでスマホプログラミング - 今平成何年?

今が平成何年かを表示します。

PictRuby

PictRuby

  • ongaeshi
  • 仕事効率化
  • 無料

ソースコード

以下をコピペしてPictRubyに貼り付けてください。

get_sample.rbを使ってja/heiseiでも取得するとこができます。

# # ja/heisei
#
# ## 概要
# 今が平成何年か表示します。

def main
  t = Time.now
  h = t.year - 1989 + 1
  "平成#{h}#{t.month}#{t.day}"
end

使い方

実行すると今の和暦を表示します。

スクリプトランチャーアプリ経由で通知センターに登録しておくとさらに便利です。

PictRubyでスマホプログラミング - 筋トレをWorkflowyに記録する

日々のスクワットや腕立て伏せの回数を簡単に記録できるスクリプトです。筋トレした日付を任意のフォーマットで自動入力したくて作りました。

PictRuby

PictRuby

  • ongaeshi
  • 仕事効率化
  • 無料

ソースコード

以下をコピペしてPictRubyに貼り付けてください。

# mascle.rb

def main
  squat = Popup.input "スクワット?"
  pushup = Popup.input "腕立て伏せ?"
  
  t = Time.now
  date = sprintf("%04d-%02d-%02d", t.year, t.month, t.day)
 
   Clipboard.set "スクワット #{squat} 腕立て伏せ #{pushup} #d-#{date}"
   
  # ここは自分の記録したいページやアプリに変更
  Browser.open "https://workflowy.com/#/hogehoge"
end

使い方

起動すると各トレーニングの回数を聞かれます。

入力するとクリップボードに今日の日付付きのテキストがコピーされます。Workflowyの記録用ページが開くのでクリップボードの内容を貼り付けて終了です。

スクリプトランチャーアプリ経由で通知センターに登録しておくとさらに便利です。

iOSのRubyプログラミング環境、PictRuby 0.3 をリリースしました

PictRuby 0.3 をリリースしました。

  • Rubyの標準ライブラリをたくさん追加
  • クラスブラウザ
  • エントリポイントの関数名をmainに
  • URL Schemeに対応
  • 等幅フォント

PictRuby - Ruby Programming Environment in iOS

RubyPico

RubyPico

  • ongaeshi
  • 仕事効率化
  • 無料

Rubyの標準ライブラリをたくさん追加

mrubyをios-ruby-embeddedから作成するようにしました。mrbgemsが使えるようになりライブラリの組み込みが簡単になりました。例えば以下のような機能が使えるようになります。

  • Array#-
  • ”あ”.size==1
  • rand

クラスブラウザ

追加された標準ライブラリを駆使してクラス一覧やクラスで呼び出されるメソッド一覧を取得できるスクリプトをmrubyを使って作ってみました。メタプログラミングですね。

  • get_sampleをインストール
  • get_sampleを起動して09_class_helpと入力
  • スクリプトをコピペしてインストール

起動してCancelを押せばクラス一覧、クラス名を入力してOKを押せばクラスメソッドの一覧が表示されます。クラス名はクラス一覧からコピペするのが便利です。

f:id:tuto0621:20160124215017p:plain f:id:tuto0621:20160124215020p:plain f:id:tuto0621:20160124215025p:plain

エントリポイントの関数名をmainに

スクリプトのエントリポイントの関数名をconvertからmainに変更しました。当面はconvertでも動くようにしますが今後はmainが推奨です。

# Please return the text or image in the "def main"

def main
  Popup.msg("Hi!")
  "Hello, PictRuby\nhttp://pictruby.ongaeshi.me"
end

URL Schemeに対応

URL Scheme経由でスクリプトを実行できるようになりました。LauncherなどでPictRubyのURLを指定することでスクリプトを直接起動できるようになります。例えばhello.rbという名前のスクリプトをURL Scheme経由で起動したい時は以下のように指定します。

pictruby://hello

.rbはあってもなくてもいいです。省略推奨です。

等幅フォント

エディタ画面と実行結果画面のフォントを等幅フォントに変えたので表組みなどがやりやすくなりました。

おまけ

少しずつ使ってくれる人が増えてきて嬉しい限りです。

過去の記事