C++ の Global Constructors を表示

投稿者 nanki 2010-09-14 02:16:00 GMT

otool を使う。

ᐚ otool -s __DATA __mod_init_func -V test.o | c++filt
test.o:
Contents of (__DATA,__mod_init_func) section
0x0000000000204698 0x0000000000192810 global constructors keyed to Signals.cpp
…
0x0000000000204b98 0x0000000000012430 global constructors keyed to ProfileInfo.cpp

Objective-JおよびCappuccinoとそのvim補完 2

投稿者 nanki 2010-07-10 13:15:00 GMT

前回のエントリから早一年半。

Atlasのベータプログラムもいつの間にかスタートして、心躍るネタを提供してくれるObjective-J/Cappuccino.

一方僕はVimScriptを改良した。

主な改善点は、

  • []を自動で追加
  • 代入による変数の型推測
  • 定数を補完データベースに追加

Objective-CやObjective-Jでは、メッセージを続けて送る場合、[]を入れ子に書かないといけなくて、かなり苦痛なのだが、直前の対応する[の前に[を自動挿入することで、

  [CPView alloc] init
  // ☟
  [[CPView alloc] init]

という補完が行われるようになった。


WebSDL - Ruby/SDL × WebSocket/Canvas

投稿者 nanki 2010-06-23 02:42:00 GMT

Ruby勉強会@関西44の懇親会にて @cyross, @KazkiMatz さんらとSDLをWebSocketと組み合わせて…という話をしていておもしろそうだったので実装してみた。

websdl
青は@nanki, 赤は@ujm

github - WebSDL

  1. Ruby/SDLの画面描画を全て文字列としてシリアライズし、WebSocketで送信、Canvasに描画する。
  2. ブラウザ上で発生したイベントをWebSocketで送信、SDLのイベントモデルの中に還元してやる。

というのが基本的な仕組み。

# samples/sample1.rb
require 'rubygems'
gem 'rubysdl'
require 'sdl'
require 'websdl'

class TestFrame < Frame
  attr_reader :mx, :my, :color

  def initialize
    @color = 0xff000000 | (1..3).inject(0){|r,i|r << 8 | rand(0xff)}
    @mx = -100
    @my = -100
  end

  def open_screen
    SDL::Screen.open(640, 480, 32, SDL::HWSURFACE || SDL::DOUBLEBUF)
  end

  def mainloop(screen)
    screen.fill_rect(0, 0, screen.w, screen.h, 0)

    while event = SDL::Event.poll
      @mx, @my = event.x, event.y if SDL::Event::MouseMotion === event
    end

    frames.each do |f|
      screen.fill_rect(f.mx - 15, f.my - 15, 30, 30, f.color)
    end
    
    screen.flip
  end
end


SDL = WebSDL if ARGV.first == 'web'

SDL.init(SDL::INIT_VIDEO)
SDL.run(TestFrame, :host => '0.0.0.0', :port => 3000)

上記のようなコードで、

$ rsdl -Ilib samples/sample1.rb

ではSDLのウィンドウが起動し、

$ ruby -Ilib samples/sample1.rb web

でWebSDL版が起動するようになっている。 WebSDL版はsamples/test.html をWebSocket, Canvasに対応したブラウザで開く。

ただCanvasを使うだけでは芸が無いので、マルチユーザに対応、ユーザ間の情報共有にも対応してみた。

言うまでもなくProof of Conceptの段階であり、SDLの機能もdraw_rect, MouseMotion くらいしか実装していない。

また、0.1秒毎に更新しているのがかっこわるいが、適切なイベントに基づいた処理をすれば、パズルゲームやアドベンチャーゲームなど頻繁に画面更新のないものなら実用的なものができる可能性がある。 ウェブへぇボタンとかね。

問題点

一方、SDLのAPIは同期的なものもあり、SDL::Surface#get_pixel (画面上のピクセルの色を返す) などは現在の方法では実現が困難である。

参考:

iPadホルダーにおすすめのアプリn個

投稿者 nanki 2010-05-28 15:55:00 GMT

LiveSketch HD

こちらの動画で有名になったお絵描きアプリ。 自分が描いた線以外に、近傍の線の間に細かい線を描き入れてくれるので、すごい丁寧にスケッチしたみたいな出来映えになります。楽しいです。

お金の無い人は、Harmonyをホーム画面に入れておくといいです。というかこっちのほうがいろんなブラシが選べたり、色が選べたりと、機能豊富だったりすします。 短所はオフラインで使えない事と、消しゴムが無いくらい?

Gravilux

数千の点々があなたの指にまとわりついてくるアプリ

noby noby boy

のびのびBOY。 ひも理論などを研究している理系の人たちにオススメ。 ゆるい紐状のボーイを引っぱったり、振り回したりして遊びます。

当初「仕事効率化」カテゴリにあったように、非常に高機能で、カメラ(iPadでは無理?)、時計、音楽プレイヤー、ブラウザ、メモ帳、メール、お絵描き機能などを内蔵しています。

特にお絵描き機能は、ほとんど唯一マルチタッチに対応していて、同時に11本の線を描く事ができます。

また、GPSロギング機能付きの地図も内蔵しており、ここで貯めた移動距離は宇宙にいるのびのびガールに送信することで、のびのびガールがどんどんのびのび、太陽系を旅します。 のびのび族はきっと進化したアリの仲間。

公式サイトo——–=————oも楽しい。 企画会議の様子を動画で見られます。 重いながらもFlash不使用で、iPadでも見られる。

あと猫飼ってる人にもオススメできます。

Sunny3D

手書きの絵が立体化でき、色を塗る事もできます。

サンプル iPad Sunny3D で描いた画伯のスプー

その他

  • 頑張ればいい感じに絵が描けるBrushes
  • PCのブックマークレットから簡単にpdfなどのURLを送れるOffline Pages
  • iPad対応の噂が密かにささやかれている新幹線予約


思いついたときに増やしていきます。


RubyでIMAPを使ってGMailにアクセスする

投稿者 nanki 2010-05-20 19:29:00 GMT

だいたい以下のような感じになる。

password_from_keychainはOSXのkeychainからパスワードを取ってくるだけの関数。

GMailのTwitterフォルダ(follow通知メールが溜まる)の中から未読(UNSEEN)のメールを探してきて、ユーザ名とおぼしき部分を抜き出して出力、既読にする。

require 'net/imap'

# for Mac
def password_from_keychain(server, user)
  require 'open3'
  _, _, err = Open3.popen3("/usr/bin/security find-internet-password -s #{server} -a #{user} -r imap -g")

  if /^password: "(.*)"$/ === err.gets
    $1
  else
    nil
  end
end

SERVER = 'imap.gmail.com'
USER = 'nanki@example.com'
imap = Net::IMAP.new(SERVER, 993, true)

imap.login(USER, password_from_keychain(SERVER, USER))
imap.select("Twitter")

imap.search(%w(UNSEEN)).each do |msg|
  body = imap.fetch(msg, "BODY[TEXT]")[0].attr["BODY[TEXT]"]

  if /twitter.com\/([^?\/]+)/ === body
    puts "f #{$1}"
    imap.store(msg, "+FLAGS", [:Seen])
  end
end