2012年07月14日

FairyQuick正式版をリリースしました

東芝製無線LAN内蔵SDHCカード FlashAir 専用ブラウザアプリ「FairyQuick」の正式版を公開しました。Google Playでの配布と、野良アプリの配布をやっています。

Google Playの配布ページは こちらから

野良APKはradi開別館にて公開中

体験版から外見がかなり変わりました。
Screenshot_2012-07-08-23-00-59.png
まさに使用前使用後。でも中身はこれまでどおり(あ、バグは直してますよ)。

posted by yuji_at_radiance at 13:50| Comment(5) | TrackBack(0) | ソフトウェア | このブログの読者になる | 更新情報をチェックする

2012年06月09日

本当にそれでいいの?AndroidプログラミングでのWifi接続先切り替え

Androidプログラミングの楽なところは、困ったらgoogle先生に尋ねると、懇切丁寧な解説サイトに連れて行ってくれて、ステキなスニペットまで土産に持たせてくれるってところ。しかし、スニペットをそのまま使ってたらトラブルに遭ったので、顛末をここに記す。

ほとんどのサイトでは、Wifiの切り替えはWifiManager.enableNetwork(id, true)を使うと解説している。第二引数のtrueが重要である。trueにすると、既に接続しているネットワークを切り離して指定したネットワークに繋ぐ。たとえば以下のようなコードを書く。

  WifiManager wiman = (WifiManager) getSystemService(Context.WIFI_SERVICE);
  WifiConfiguration conf=null;
  String ssid2 = "\"myAsciiSSID\"";
  for(WifiConfiguration c0 : wiman.getConfiguredNetworks()){
    if(c0.SSID.equals(ssid2)){
      conf = c0;
      break;
    }
  }
  if(conf!=null) wiman.enableNetwork(conf.networkId, true);

確かにこれでWifiの接続先切り替えに成功する。が、「SSID_Aに接続」→「SSID_Bに接続」→「SSID_Aに接続」…と交互に切り替えを繰り返すと、急にネットワークにつながらなくなる時がある。法則性としては、

  • Android 4.xでは発生しないが、2.xでは発生する確率が高い
  • 機種依存がある?WebではNexusシリーズやDroidでの被害報告を見た
  • なぜかディスプレイを切って、もう一度つけると直る
  • なぜか、「設定→無線とネットワーク」から明示的に接続させると、直る。この際、つながらないネットワークは「無効」と表示される

いろいろ試した結果、以下のようにすると連続で切り替えても上手くいくようである。

  WifiManager wiman = (WifiManager) getSystemService(Context.WIFI_SERVICE);
  WifiConfiguration conf=null;
  String ssid2 = "\"myAsciiSSID\"";
  for(WifiConfiguration c0 : wiman.getConfiguredNetworks()){
    if(c0.SSID.equals(ssid2)){
      conf = c0;
      break;
    }
  }
  if(conf!=null){
    wiman.enableNetwork(conf.networkId, true);
    for(WifiConfiguration c0 : m_wiman.getConfiguredNetworks()){
      m_wiman.enableNetwork(c0.networkId, false);
    }
    m_wiman.saveConfiguration();
  }

最後に足された4行が重要である。こうすることで、少なくともNexusOneでは症状が改善した。ただし、WifiManager.saveConfiguration()の後はしばらくWifiManager.getConfiguredNetworks()の動きがおかしくなるようで、上記ルーチンを連打すると、時々動きがおかしくなる。

どこまで正しいかわからないが考察。WifiManager.enableNetwork(id, true)はAPIマニュアルによると、他のネットワークを無効化して目的のネットワークに繋ぐ。よって、もともと繋いでいたアクセスポイントは「無効」にされてしまう。Androidの特定バージョンでは無効化されてしまったネットワークにはWifiManager.enableNetwork()で再びつなぐことが出来ない。「無効」のタグ付けを外すことさえできれば再接続できるので、WifiManager.enableNetwork(id, false)を使って無効化を解除する(falseをつけて無効化を外す手順は、addNetwork()の使い方を参照のこと)。trueをつけて一度呼び出すのは、アクセス先の優先順位リストを書き換えるためである。

ちなみに上記スニペットのヒントは、Android 2.3のソースコードからいただいた。 packages/apps/Settings/src/com/android/settings/wifi/WifiSettings.javaのonClick()、saveNetworks()、enableNetworks()あたりが参考になる。というか、設定画面の挙動そのまんまである。 ソースをちょっと眺めるだけならgitHubからいける。
https://github.com/OESF

ラベル:android
posted by yuji_at_radiance at 22:31| Comment(0) | TrackBack(0) | ソフトウェア | このブログの読者になる | 更新情報をチェックする

FairyQuick体験版をリリースしました。

着手発表からだいぶ時間がたってしまいましたが、FairyQuick体験版をリリースしました。体験版ということで、GUIの見栄えは劇悪ですが、機能的なところはだいたい揃いました。前掲のコンセプトをどんな感じに料理したのか、勇者の皆様、ご確認ください。

配布所は、M3Naviと同様、「Radi開別館」です。
FairyQuick配布とスクリーンショットはこちら

posted by yuji_at_radiance at 22:22| Comment(2) | TrackBack(0) | ソフトウェア | このブログの読者になる | 更新情報をチェックする

2012年05月27日

FairyQuick(FlashAir専用ブラウザ)開発に着手

東芝製無線LAN SDカード FlashAir のブラウザアプリ(Android用)の開発に着手。

既にTwicca(超有名なTwitterクライアント)の作者さんが「AirShow」というアプリをリリースされているのですが、やってみたいアイデアがいくつかあったのでニッチを狙う気で実装してみようかなと。

できるだけAirShowとかぶらないように(ここが一番難しい)実用性を高めるということで、以下がコンセプト。

  • 必要最小限の時間しかFlashAirに接続しない。バックグラウンドのWifi通信をできるだけ生かす
  • オフラインブラウズモード
  • フルサイズをダウンロード済みの画像と、そうでない画像を人目で見分けられるGUI
  • 日付時刻を重視した、コンテンツの列挙・絞込み
  • 複数カードの明示的な切り替え
  • ようやく基本的なロジックと、仮設のGUIができてきたところ。まだまだこれからです。

    Screenshot_2012-05-27-18-22-39.png
    posted by yuji_at_radiance at 21:26| Comment(0) | TrackBack(0) | ソフトウェア | このブログの読者になる | 更新情報をチェックする

    2012年05月02日

    GridViewはListActivityと組み合わせられない

    ListViewをホスティングする機能に特化したListActivityがあるけれど、GridViewをホスティングするGridActivityは無いなー。でもAPI的には大して変わらんよなと思っていた。もしかして組み合わせられるんじゃないかと思って実験。

    結論:組み合わせられない。 ClassCastExceptionになって起動時にこけた。

    ラベル:android
    posted by yuji_at_radiance at 14:49| Comment(0) | TrackBack(0) | ソフトウェア | このブログの読者になる | 更新情報をチェックする

    2012年04月28日

    インストーラーも新しくなってます

    そうそう、データベースファイルのインストーラーも新しくなってます。 前回までのカタログインストーラーでは最新のデータベースを持ってこれないのでご注意を。

    配布サイトから入手してください。

    CatalogDL_capture2.png
    新しいインストーラはこんな感じ。だいぶ分かりやすくなりました。

    posted by yuji_at_radiance at 18:37| Comment(0) | TrackBack(0) | ソフトウェア | このブログの読者になる | 更新情報をチェックする

    2012年04月27日

    M3カタログビューアー(2012春)のお知らせ

    4/30に開催される音系・メディアミックス同人即売会M3のカタログビューアー・チェックリストアプリ(android)の開発を行っています。今回からgoogle playでの配布に変更いたしました。 google play非対応端末をお使いの方々も大丈夫。ちゃんと配布サイトを用意いたしました。

    配布サイトはこちらから

    今回から配布物はgoogle sitesで公開いたします。ブログという形態だと、配布物の一元的な管理が難しくてやってられません。

    今回の新機能はコレ。マップ画面を長押しすると、付近のサークル名がポップアップで表示されます。 これで迷ったときにも大丈夫。
    mapview01.png

    posted by yuji_at_radiance at 21:58| Comment(0) | TrackBack(0) | ソフトウェア | このブログの読者になる | 更新情報をチェックする

    2011年11月20日

    【作ってみた】サクラエディタでRubyをインラインで書いて実行するマクロ

    Windowsで普段使っているエディタでもRubyでちょっとしたワンライナーを実行できると素敵ということで、サクラエディタのマクロを作ってみた。

    ■ダウンロード

    windows版rubyのインストール場所に合わせて変数rubybinを変更。Vistaや7を使う場合、変数rubyscrにも適当なファイル名をフルパスで書いたほうがよいかも知れない。 設定を書き込んだら、メニューの外部マクロ設定で読み込む。ついでに右クリックメニューに足しておくと幸せになれると思う。

    ■コード
    Vimスクリプトに比べるといろいろと楽々。サクラエディタは一時ファイルをSJISで書き出すので、エディタで実際に編集している文字コードに関係なく-Ksオプションを足すのが大事。

    rubyculc_111120.js
    var rubybin = "(Your Ruby Executable) -Ks";
    var rubyscr = "script.rb";
    var command = rubybin + " " +  rubyscr;
    
    //writeout script
    var selected = Editor.GetSelectedString(0);
    var fso = new ActiveXObject("Scripting.FileSystemObject");
    var fpout = fso.CreateTextFile(rubyscr);
    
    fpout.WriteLine("include Math");
    fpout.WriteLine("def vscrEvalDescr() return yield(); end ");
    fpout.WriteLine("print vscrEvalDescr(){");
    fpout.WriteLine(selected);
    fpout.WriteLine("}");
    
    fpout.close();
    
    //execute script
    Editor.ExecCommand(command, 3);
    

    参考にした資料

    posted by yuji_at_radiance at 22:06| Comment(0) | TrackBack(0) | ソフトウェア | このブログの読者になる | 更新情報をチェックする

    2011年11月19日

    【作ってみた】vimのバッファ内にrubyをインラインで書いて実行するスクリプト

    Vimでテキストを打っている時にスクリプト言語や他のアプリケーションを使いたくなる時がある。ちょっとしたパターンを打ち込んだり、文字列をバラしたり、数式を計算したくなったり。大抵は正規表現とパイプを駆使して何とか頑張るが、頑張りたくない私のために。rubyを数行書く→実行→結果をバッファに挿入できるようにしてみた。

    ■ダウンロード

  • rubyinline_20111119.vim
  • rubyinline_20111120.vim
  • sourceコマンドで読み込んで使う。
    :source rubyinline_20111119.vim
    

    ■使い方:コードブロックとして評価
    rubyスクリプトはrubyの文法が許す限り何を書いてもよい。 visualモードでrubyスクリプトの箇所を選択した状態で(Leader)srbの順にキーを打つ(普通、Leaderはバックスラッシュキーのことらしい)。

    普通のテキスト文書
    ↓ここから
    5.times(){|iter|
      puts iter.to_s
    }
    ↑ここまで
    
    スクリプトは消去されて、標準出力の内容がバッファに追記される。
    普通のテキスト文書
    0
    1
    2
    3
    4
    
    現在のところ、実行結果が挿入される位置が1〜2行ずれる。どうやらr!コマンドでrubyを叩いているのがいけない様子。

    ■使い方:電卓モード(式として評価)
    テキスト上に現れる数式の評価値を知るためにいちいち整ったrubyの構文を書くのは面倒である。そこで、選択範囲のテキストを評価した結果を挿入するモードを作成。 こちらは(Leader)crbと打ち込む。

    たとえば、sin(1.57)*2の計算結果がほしいとしよう
    
    結果はこうなる。
    たとえば、1.99999936586367の計算結果がほしいとしよう
    
    rubyのブロック評価を使って実装しているので、複数の式を選択した場合には最後の式の評価結果が返る。また、定数を使ったりメソッドを宣言したりできない。

    ■コード
    はじめてvimのスクリプトを書いた。なんかvimな人にもrubyな人にも怒られそうな汚いコードだ。(11/20修正:putsじゃなくてprint使えば最後の改行を正規表現で落とす必要ない)

    rubyinline_20111120.vim
    "Private Functions
    :function! s:Rbscr_impl(scriptbody)
      "name of output file
      :let l:tempfile = tempname()
      :try
        "writeout and execute ruby script
        :call writefile(a:scriptbody, l:tempfile)
        :execute "r! ruby " . l:tempfile
      :finally
        "delete file
        :if filewritable(l:tempfile)
          :call delete(l:tempfile)
        :endif
      :endtry
    :endfunction
    
    :function! s:Rbculc_impl(scriptbody)
      :let l:culcPrefix  = ["#!/usr/bin/ruby"]
      call add(l:culcPrefix, "include Math")
      call add(l:culcPrefix, "def vscrEvalDescr() return yield(); end ")
      "変更:putsじゃなくてprint
      call add(l:culcPrefix, "print vscrEvalDescr(){")
    
      :let l:culcPostfix = ["}"]
    
      call extend(a:scriptbody, l:culcPrefix, 0)
      call extend(a:scriptbody, l:culcPostfix)
    
      :let l:tempfile = tempname()
      :try
        "writeout and execute ruby script
        :call writefile(a:scriptbody, l:tempfile)
        :let l:result = system("ruby " . l:tempfile)
        "変更:末尾の置換は要らない
        " :let l:result = substitute(l:result, "\n$", "", "")
        :execute "normal " . "i" . l:result
      :finally
        "delete file
        :if filewritable(l:tempfile)
          :call delete(l:tempfile)
        :endif
      :endtry
    :endfunction
    
    "Public Functions
    :function! Rbscr_visual() range
      :let l:vmode = visualmode()
      :if l:vmode == 'v'
        :let l:save_a = getreg('a')
        :silent :normal! gv"ad
        :let l:selected = split(getreg('a'), "\n")
        :silent :call s:Rbscr_impl(l:selected)
        :call setreg('a', l:save_a)
      :endif
    :endfunction
    
    :function! Rbscr() range
      "Retrive selected text
      :let l:selected = getline(a:firstline, a:lastline)
      "delete selected region
      :silent :execute a:firstline . "," .  a:lastline . " delete"
      "write file and call
      :silent :call s:Rbscr_impl(l:selected)
    :endfunction
    
    :function! Rbculc_visual() range
      :let l:vmode = visualmode()
      :if l:vmode == 'v'
        :let l:save_a = getreg('a')
        :silent :normal! gv"ad
        :let l:selected = split(getreg('a'), "\n")
        :silent :call s:Rbculc_impl(l:selected)
        :call setreg('a', l:save_a)
      :endif
    :endfunction
    
    "Key Mappings
    :execute ":map  srb :call Rbscr()"
    :execute ":vmap srb :call Rbscr_visual()"
    :execute ":vmap crb :call Rbculc_visual()"
    

    参考にした資料

    posted by yuji_at_radiance at 19:30| Comment(0) | TrackBack(0) | ソフトウェア | このブログの読者になる | 更新情報をチェックする

    2011年10月29日

    2011秋M3向けリリース物件まとめ

    明日開催の音系・メディアミックス同人即売会M3のandroid版カタログビューアのリリース物まとめです。リリース物件が増えたので、まとめを作成。急に更新が入った場合は本記事を更新します。

    ■ 何枚かスクリーンショット
    capture_28_map.png
    マップ表示
    capture_28_list.png
    リスト表示
    capture_28_spec.png
    サークル詳細表示

    m3ss_main2.png
    上映ナビメイン画面。
    m3ss_widget.png
    3x3サイズの上映ナビウィジェット。

    posted by yuji_at_radiance at 12:44| Comment(0) | TrackBack(0) | ソフトウェア | このブログの読者になる | 更新情報をチェックする

    M3カタログビューア:上映スペースナビリリース

    10月30日に開催される、音系・メディアミックス同人即売会「M3」のandroid版上映スペースナビアプリをリリースします。M3公式webサイトはこちら。カタログビューアアプリ本体はこちら

    ■機能:
    単に上映リストを表示するだけでは面白くない(pdf版があるので)ということで、 ちょっとだけ人力検索機能がついてます。

    • 上映作品のリストを表示
    • ウィジェットで直近のプログラムを表示
    • アラームの設定:指定した作品の上映が近づいたら警告
    • 上映状況を人力でアップデートすることにより、高い精度を実現(できることを期待している)
    人力更新ということで、皆様のご協力をぜひともお願いします。

    ■インストール:
    例によって野良apkです。ネット接続とバイブレーションの権限を要求します。端末で直接ダウンロードする場合は、サードパーティのブラウザだとうまくダウンロードできない場合がありますので御注意を(以前は、dolphin browserとかダメでした:途中でダウンロードが勝手に止まってしまう)。

    ■操作説明とスクリーンショット:
    m3ss_main2.png
    メイン画面。上映作品の一覧を表示します。現在上映中の作品に対してチェックマークのボタンを押してください(でも連打はダメよ)。チェックボックスのクリックをサーバーで集計して、「NowPlaying」の位置を修正します。スターのボタンはアラームの予約。
    m3ss_widget.png
    3x3サイズのウィジェット。上映中と直近の3件を表示します。ウィジェットをクリックするとメイン画面が立ち上がります。
    m3ss_widgetconfig.png
    ウィジェットの設定画面。メイン画面から移動できます。更新周期を変更できます。あまり短くするとバッテリーがもたなくなるので注意。スマホなしで展示場から帰るのは嫌でしょう?
    m3ss_alarmconf.png
    アラームの設定画面。更新周期とバイブレータ利用の有無。アイテムの削除、アラーム禁止もこの画面で行います(アラームの開始はスターボタンを押すだけでOK)。
    m3ss_alarmshow.png
    アラームを設定した作品の上映が近づくと、この画面が立ち上がります。

    posted by yuji_at_radiance at 01:22| Comment(0) | TrackBack(0) | ソフトウェア | このブログの読者になる | 更新情報をチェックする

    2011年10月22日

    M3カタログビューアー(M3Navigator)更新(10/22)

    10月30日に開催される、音系・メディアミックス同人即売会「M3」のandroid版カタログビューアーアプリをリリースします。M3公式webサイトはこちら

    ■インストール:全自動
    簡単インストーラーを使ってインストールできます。

    1. 簡単インストーラをインストールしてください
    2. 簡単インストーラを実行して、本体とカタログデータをインストールします
      • 「Install M3Navigator」ボタン、「Install Catalog」ボタンをクリック
      • 本体はSDカードの書き込みアクセスを要求します
    3. 本体を起動します
    installer.png
    インストーラの画面。「Install M3Navigator」「Install Catalog」を実行する。

    ■インストール:手動
    インストーラを使いません。ファイルマネージャー系のアプリ、またはPCと接続する必要があります。

    • M3Navigator本体
      1. 本体をインストールします
    • カタログデータ
      1. カタログ本体をダウンロードします:catalog_m3_28_111022A.zip
      2. カタログ本体はzipファイルです。解凍ソフトを使ってください
      3. 本体を解凍して出来たm3_28ディレクトリを/sdcard/m3navi/m3_28に配置してください
      4. 本体を起動します

    ■ 機能説明
    詳細な説明は、機能説明ページを御覧ください(M3Navigator紹介ページ)。スクリーンショットもあります。
    capture_28_map.png
    マップ表示
    capture_28_list.png
    リスト表示
    capture_28_spec.png
    サークル詳細表示

    posted by yuji_at_radiance at 16:53| Comment(0) | TrackBack(0) | ソフトウェア | このブログの読者になる | 更新情報をチェックする

    2011年10月21日

    M3カタログビューアー超暫定版

    来る10/30に開催される音系・メディアミックス同人即売会M3(第28回)に向けてandroid版カタログビューアーアプリを開発中です。M3公式ページはこちら

    サークルリストと配置図が公式ページで公開されたので、今回もカタログアプリの開発を正式にスタートしました。アプリの説明はこちら(過去記事)ちょっと手を動かしてみたので、「超暫定版」を公開します。人柱様向け。
    注意:「超暫定版」では重要なチェックリストを作らないでください。本体・データベースに更新の予定があります。アップデートに際しては出来る限り後方互換性の保持、ユーザデータの保全に努めますが、チェックリストへの書き込みが消える恐れがあります。

    ■ 超暫定版でサポートする機能
    超暫定版では、全機能が利用可能です。

    • マップの表示
    • サークルの検索
    • サークル詳細表示
    • サークルチェック(色付け)
    • twitterなどテキスト投稿サービスとの連携
    • その他、過去記事を参照
    ただし、下記「既知の問題」を除きます。

    ■ 超暫定版のインストール

    • 本体
      • 前回イベントでm3Navigatorをインストールしている場合は、そのまま使えます。新規にインストールする場合はこちらからどうぞ(4/28の更新記事)。
    • データベース
      1. 超暫定版のデータベースをダウンロードします。(catalog_m3_28_pre.zip
      2. zipファイルを解凍するとm3_28ディレクトリが得られます
      3. 得られたm3_28ディレクトリを/sdcard/m3navi/m3_28に配置します。

    ■ 既知の問題

    • チェックリストの色付けが、マップに反映されません。データベースが未完成のため。
    • リスト表示からマップに戻る時に、マップが第一展示場に戻ってしまいます。
    • 端末を横表示に切り替えるときに、マップが第一展示場に戻ってしまいます。

    ラベル:M3Navigator M3 android
    posted by yuji_at_radiance at 00:16| Comment(0) | TrackBack(0) | ソフトウェア | このブログの読者になる | 更新情報をチェックする

    2011年10月10日

    ウィジェットも作ってみたよ:秋M3向けカタログビューア開発進捗

    10月30日に開催される音系・メディアミックス同人即売会「M3」向けにandroid電子カタログアプリを開発中。まだサークルリストのweb版が公開されていないので、先に上映スペースナビゲータ(大いに人力頼み版)を作成中。Androidアプリの特長といえばウィジェットだろうということで、ウィジェットに対応させてみた。

    で、例によってスクリーンショット。現在上映中の作品情報と今後の上映3件を表示する。情報は数分おきに(デフォルト3分、周期は変更できる)更新される。あと、クリックするとアプリ本体が起動。
    ScreenSchedule03.png

    上映スペースナビの現在の進捗状況はこんな感じ

    • メイン画面:概ね完成。あとはリストの自動リロードを実装するか検討中
    • ウィジェット:概ね完成。見た目の調整とか
    • アラーム:指定した項目が上映直前になったら音か振動で知らせる。本当に必要?
    • M3Naviとの連携:検討中。サークル個別情報に跳べるとか?
    • 通信量の削減:これは火急。
    現在の実装はデータが必要になると毎回サーバーに読みに行くのだが、メイン画面、ウィジェット、アラームの3系統がバラバラにデータを要求するので通信量がムダに多い。サーバは過負荷になるし端末の電池は喰うしで良い事無し。さて、どうしようか。

    ちなみにAndroidのプログラミングモデルだと、Activity(だいたい、一つの画面のこと)をまたぐデータの保持・通信のコストがとても高い。

    posted by yuji_at_radiance at 00:52| Comment(0) | TrackBack(0) | ソフトウェア | このブログの読者になる | 更新情報をチェックする

    2011年10月02日

    秋M3向けカタログビューアの開発スタート(上映スペースナビもあるよ)

    10月30日に開催される音系・メディアミックス同人即売会「M3」向けにandroid電子カタログアプリを開発中。春M3からだいぶサボってきたが、紙カタログも発売されたので、ちょっとやる気出す。

    web版のサークルリストと配置マップが出ていないが、ペーパー版カタログを見て分かる限りでは、前回と同様の機能を提供できそう。私の精神力が尽きなければ。いや、サークルリストはともかく、マップは人手でデジタイズしてるから大変なんですよ!?

    さて、今回は上映スペースにも手を出してみようと思う。簡単に説明すると、上映スペースとは各サークルのPVを上映するスクリーンのことである。上映作品のリストは当日貼りだされる上に、時間通りに進行することがほとんどない。上映リストと進行状況を携帯で見られると便利→なら作ってしまえ。

    と言っても、上映リストを予め用意することは不可能だし、進行状況も予測することはできない。というわけで、スクリーンの前のあなたに助けてもらうことにする。

    M3ScreenSchedule(仮称)はandroidアプリと集計用のサーバを組み合わせて実現する。会場のあなたが番組情報をアップロードすると、サーバを経由して他の参加者に更新された番組情報が配布される。同様に、会場のあなたが上映中の番組番号をアップロードすることによって、現在上映されているものが何なのか他の参加者が知ることができる。たくさんの人がM3ScreenScheduleに接続することで、情報が正確になる。そんな仕組み。
    m3ss_structure.png

    試作版のアプリが仕上がってきたので、スクリーンショットを掲載。ウィジェットも作りたいなーと思う今日この頃。
    ScreenSchedule01.png
    項目のリスト表示。右側のアイコンをクリックするとサーバに上映中作品の報告。
    ScreenSchedule02.png
    ペンのアイコンをクリックすると、上映情報の編集。

    posted by yuji_at_radiance at 23:15| Comment(0) | TrackBack(0) | ソフトウェア | このブログの読者になる | 更新情報をチェックする

    2011年09月08日

    LLVMを32ビット向けコンパイルin64ビット環境

    仕事でLLVM Clangを使おうとしてちょっとハマったのでメモ。良い子のみんなには常識だから必要ないかな?

    ビルド環境はCentOS5 64bitな環境。教科書的な手順は以下の通り。

    1. ソースをsvnから落としてくる。clangのソースをLLVMのソースツリー内に展開する。
    2. automakeを実行する。
    3. configureを実行する
    4. makeを実行する
    しかし、64ビット環境下で32ビット向けにコンパイルするにはちょっと小細工が必要。
    configure --build=i686-pc-linux-gnu
    make CC="gcc -m32 -march=i686" CXX="g++ -m32 -march=i686"
    
    -m32をつけると32ビット向けにコンパイルを行う。これでめでたしかと言うとそんなことは無く、シンボルが足りないだの何だのエラーが出る。-marchをつけるとちゃんとリンクまでできる。

    posted by yuji_at_radiance at 21:54| Comment(0) | TrackBack(0) | ソフトウェア | このブログの読者になる | 更新情報をチェックする

    2011年08月16日

    3TBのハードディスクを使う

    録画データを保存する倉庫ディスクの残り容量が足りなくなってきたので、値段がこなれてきた3TBを購入。2TB超えのHDDが正常に扱えるか心配だが買う。買わずに後悔するくらいなら買って後悔しよう。

    購入したのはHGSTの0S03229 (中身はHDS5C3030ALA630 参考資料) 。静音低消費電力モデル。箱入りのものしか出回っていない様子。

    Centos5.5 32bitのマシンにつないで、dmesgを見る。 very big deviceとか言われるが、とりあえず3TBの容量があることを認識している模様。 とりあえず安心。

    ata3: exception Emask 0x10 SAct 0x0 SErr 0x4060000 action 0xe frozen
    ata3: irq_stat 0x00000040, connection status changed
    ata3: SError: { PHYInt CommWake DevExch }
    ata3: hard resetting link
    ata3: SATA link up 3.0 Gbps (SStatus 123 SControl 300)
    ata3.00: ATA-8: Hitachi HDS5C3030ALA630, MEAOA580, max UDMA/133
    ata3.00: 5860533168 sectors, multi 0: LBA48 NCQ (depth 0/32)
    ata3.00: configured for UDMA/133
    ata3: EH complete
      Vendor: ATA       Model: Hitachi HDS5C303  Rev: MEAO
      Type:   Direct-Access                      ANSI SCSI revision: 05
    sdc : very big device. try to use READ CAPACITY(16).
    SCSI device sdc: 5860533168 512-byte hdwr sectors (3000593 MB)
    sdc: Write Protect is off
    sdc: Mode Sense: 00 3a 00 00
    SCSI device sdc: drive cache: write back
    sdc : very big device. try to use READ CAPACITY(16).
    SCSI device sdc: 5860533168 512-byte hdwr sectors (3000593 MB)
    sdc: Write Protect is off
    sdc: Mode Sense: 00 3a 00 00
    SCSI device sdc: drive cache: write back
     sdc: unknown partition table
    sd 2:0:0:0: Attached scsi disk sdc
    sd 2:0:0:0: Attached scsi generic sg2 type 0
    

    パーティションを切る。fdiskを試すと、GPTを使えと怒られる。

    WARNING: The size of this disk is 3.0 TB (3000592982016 bytes).
    DOS partition table format can not be used on drives for volumes
    larger than 2.2 TB (2199023255040 bytes). Use parted(1) and GUID
    partition table format (GPT).
    

    うーむ。1TBのパーティションを3つ作りたいだけなのだがなぁ。 警告を無視してテーブルを切ろうとすると、領域の末尾を2.2TB相当の地点より先に設定できない。

    Disk /dev/sdc: 3000.5 GB, 3000592982016 bytes
    255 heads, 63 sectors/track, 364801 cylinders
    Units = シリンダ数 of 16065 * 512 = 8225280 bytes
    
    デバイス Boot      Start         End      Blocks   Id  System
    /dev/sdc1               1      121600   976751968+  83  Linux
    /dev/sdc2          121601      243200   976752000   83  Linux
    /dev/sdc3          243201      267349   193976842+  83  Linux
    

    fdiskではやはり無理だったので、アドバイス通りにgpartedでテーブルを切る。 1TBの領域を3つ。厳密には最後の一つは900GBくらい。mkpartfsコマンドでフォーマットも一括してできるらしいが、とりあえず後回し。

    parted /dev/sdc
    (parted) mklabel gpt
    (parted) mkpart primary 0 1024GB
    (parted) mkpart primary 1023GB 2048GBGB
    (parted) mkpart primary 2047GB -0
    (parted) quit
    

    出来上がった領域をext4でフォーマットする。

    mkfs.ext4 /dev/sdc1
    

    posted by yuji_at_radiance at 13:03| Comment(0) | TrackBack(0) | ソフトウェア | このブログの読者になる | 更新情報をチェックする

    2011年08月07日

    夏休み自由工作:掛け軸っぽい馬鹿ウィジェットを作ってみる

    適当に格好いい漢字を掛け軸調にしたらcoolじゃないかなと思った。 なので夏休み自由工作として作ってみた。 自分自身でも何のために使うのか全く分からないが後悔はしていない。 子供の漢字練習にでも使えば良いのではないだろうか。

    aji_smartphone_mini.png
    こんな感じに漢字を表示する。掛け軸というよりむしろ額縁。
    barano_yuutsu.png
    設定画面はシンプル。文字列を与えると一文字ずつ表示する。 何も設定しないとランダム表示になる。
    kirin_tablet_lcut.png
    タブレットで大きく表示。でかい。ちょっと文字にジャギーが出てる。
    kirin_tablet_resize.png
    Android 3.1以降ならばリサイズできる。

    以下、技術的な話。

    漢字データ: 漢字データはGlyphWikiからPNG画像で取得する。androidの内部文字コードはUnicodeなので、String#charAtで取得した数値をもとに画像を取ってくる。取得できる画像は200x200なので、拡大するとジャギーが出る。svg形式を使いたいがレンダリングできるライブラリがあったかな?

    画像の差し替え: 画像の取得&差し替えを普通に記述するとタイムオーバーするのでAsyncTaskを使う。HTTPコネクションの確立→ビットマップ画像の生成をAsyncTask#doInBackGroundに実装し、画像の差し替えをAsyncTask#onPostExecuteに実装する。あとはウィジェットの更新時にAsyncTaskをキックすればよい。

    一定周期の更新: AlarmManagerに次回の更新時刻をセットして、起こしてもらう。持ち越しデータ(ウィジェットの設定や次回以降に表示する文字列)をPendingIntentに格納してAlarmManagerに渡す。

    引き伸ばし対策:漢字表示部分は縦横比率を一定に保ちつつ適当にズームしてくれないとまずい。よってscaleType=fitCenterにする。さらにpaddingに適当な数値を入れて隙間を作って額縁らしくする。枠部分はリサイズしても不恰好にならないように、9patch画像にする。

    リサイズ(スマフォ向けとタブレット向けの共存): ウィジェットのリサイズはAndroid 3.1(SDK 12)から利用できる。appwidget_providerを設定するXMLにresizeMode="vertical|horizontal"と書く。これではAndroid 3.1以降でしか使えないアプリになるので、ちょっと工夫する。XMLを生成するウィザードで「what kind of resource configuration would you like」と聞かれるので、versionを選んで12と入力する(xml-v12というフォルダが新しく作られるはず)。

    良く分からないこと:android3.1向けの設定XMLをxml-v12に置いた状態でBuildTargetをAndroid 2.2にすると、XMLに不正な記述があるとして怒られてしまう。困る。だからといってBuildTargetをAndroid 3.1にすると、エミュレータや実機にアプリケーションをアップロードする際に互換性がないと注意される。どうすればよいというのだろう。

    まとめ:スマフォ・タブレットの両対応は色々と奥が深い。

    希望があったらor完成したら(SVG読み込みまでやりたいですね)アプリを配布するかも知れないです。欲しい人は連絡ください。善処します。

    posted by yuji_at_radiance at 22:58| Comment(0) | TrackBack(0) | ソフトウェア | このブログの読者になる | 更新情報をチェックする

    2011年07月28日

    Android Fragmentsの練習(with M3Navigator)

    Android 3.0からサポートされたfragmentsフレームワーク。画面をいくつかの領域に分けて振る舞いを記述できるというもの。せっかくタブレット端末を買ったのに使ってみないのは勿体無いということで、ちょっと遊んでみる。せっかく遊ぶなら実用的な例題でということで、拙作のM3Navigatorをタブレット向けのUIへ移植してみた。

    いきなり表示例。
    fragments.png
    左側にリスト、右側に詳細表示。この辺りはgmailの画面構成とかと同じ…というか、Android SDKのfragmentsサンプルまんまである。実際に、レイアウトや画面の遷移は大きくサンプルから流用している。

    概論:意外と簡単。 既存のAndroidアプリをfragments対応するのは大変じゃないかとビビっていたが、実際のところ、タブレットっぽく見せる程度の改造はそれほど難しくなかった。ただし、MVCアーキテクチャ(モデルとビューとコントロールを切り分けようというUI設計の基礎論)に沿って設計することが大事だと思う。

    レイアウト:条件付レイアウトフォルダを活用すべし。 タブレットっぽいUIの醍醐味は、傾けると変化するレイアウト。縦版と横版のレイアウトを作ることで、フレームワーク側でよしなにやってくれる。フラグメントを動的に切り替えていく箇所(上図右サイドとか)は、frameLayoutで仮のスペースを確保しておく。で、そこに生成したfragmentをアタッチする。

    アクティビティの処理:フラグメントに移植、インテントの扱いに注意。 アクティビティのonCreateなどに書いていた処理は、fragmentの相当物に移動させれば大体うまくいく。ActivityやContextが必要な時は、Fragment.getActivity()を使えばよい。注意すべきはプロセス間通信。ActivityはIntentでやり取りするが、Fragmentの引数はBundleである。Intent.getExtras()を使って、中身のBundleだけを取り出してFragmentに食べさせればよい。

    ビューの扱い:ビューの組み立てはonCreateViewでやる。 Activityでは初期化処理を全部まとめてonCreateに書くので、ちょっとコードの整理が必要かもしれない。

    データベースの扱い:そのまんま。 とくに手を入れるべきところは無い。SQLiteもPreferenceも使える。

    ボタンイベント:FragmentでListenerを継承、または無名クラスを利用。 無名クラスを使うとおそろしく捗る。直感的に理解しがたいが、インナークラスのコードからアウタークラスのメンバに触れるのだ。しかし、Cに慣れた身としては、メソッドの引数が納まる位置にクラス定義が鎮座しているのは落ち着かない。

    あとは、メニューフラグメントとかも試してみたいと思う。そのうち時間をとってやってみる。

    posted by yuji_at_radiance at 00:18| Comment(0) | TrackBack(0) | ソフトウェア | このブログの読者になる | 更新情報をチェックする

    2011年04月28日

    M3カタログビューアー(M3Navigator)更新(4/28)

    音系・メディアミックス同人即売会M3の電子カタログビューアーです。 チェックリスト一覧をテキスト起こししてメーラー等に送る機能を実装。とりあえず絶対に入れたいと思っていた機能はだいたい達成した気分。下のリンクから直接ダウンロードするか、簡単インストーラーを使ってインストールしてください。

    駆け込みでひとつだけ機能追加。検索ボタンから絞込み検索ダイアログが出るようにしました。せっかくの第四ボタンを大事にしないと。もっとも、ボタンが3つしか付いてない端末もたくさんありますが。

    ■ ダウンロードアイテム
    ■ スクリーンショット
    circlelist_27B.png

    メニューを開いてShare Textを選択

    mailedit.png

    サークルリストをテキスト化して、メールの作成画面にジャンプ

    ラベル:M3Navigator android
    posted by yuji_at_radiance at 22:27| Comment(0) | TrackBack(0) | ソフトウェア | このブログの読者になる | 更新情報をチェックする

    広告


    この広告は60日以上更新がないブログに表示がされております。

    以下のいずれかの方法で非表示にすることが可能です。

    ・記事の投稿、編集をおこなう
    ・マイブログの【設定】 > 【広告設定】 より、「60日間更新が無い場合」 の 「広告を表示しない」にチェックを入れて保存する。


    ×

    この広告は1年以上新しい記事の投稿がないブログに表示されております。