サブサブマシンがぶっ飛んだ・・・

表題のとおりなんですが、開発用サブサブマシンがぶっ飛んだ。
ext4ファイルシステムがぐちゃぐちゃorz

デュアルブートになってた、ほぼ使ってないWinXPの環境は問題ないとこ見ると何が原因なんだろう。。

幸いデータは、必要そうなものはDropboxとプライベートrepositoryに逃してたので無事。

というわけでHDDをSSDに変更してlubuntuで環境作り直しorz
はぁぁめんどい。


以下作業めも

無線LAN

BroadComのfirmwareが入ってない。
staドライバをインストールして無線を使えるようにする。
Lenovo Ideapad s10e

$ sudo apt-get update
$ sudo apt-get upgrade
$ sudo apt-get install bcmwl-kernel-source
$ sudo modprobe -r b43 ssb wl
$ sudo modprobe wl

参考) https://wiki.ubuntulinux.jp/UbuntuTips/Hardware/HowToSetupBcm43xx

dropbox

nautilsいれてないのでコマンドラインから

$ cd ~ && wget -O - "https://www.dropbox.com/download?plat=lnx.x86" | tar xzf -
$ ~/.dropbox-dist/dropboxd

https://www.dropbox.com/install?os=lnx

あとはページにある制御スクリプト落としてきて、chmod +xしてパスのあるところにおいておけばおk

ほんまにDropboxさまさまや(^_^;)
あとは数日待てば必要なデータは戻ってくる。

jdk

Oracle JDK7を入れる。

$ sudo add-apt-repository ppa:webupd8team/java
$ sudo apt-get update
$ sudo apt-get install oracle-java7-installe
$ java -version
java version "1.7.0_10"
Java(TM) SE Runtime Environment (build 1.7.0_10-b18)
Java HotSpot(TM) Server VM (build 23.6-b04, mixed mode)

paco

ソースからインストールするソフト用にpaco入れとく。

$ sudo apt-get install paco

tmux

ターミナルマルチプレクサ。

$ sudo apt-get install tmux

キーバインド入れ替え

~/.tmux.conf

set-option -g prefix C-j
bind C-j next-window

日本語入力

Google日本語入力のOSS版mozcいれる。

$ sudo apt-get install ibus-mozc


再起動して
スタート→設定→キーボード・インプットメソッド
からキーボードショートカットの切り替えを全角・半角キーだけにする

emacsキーバインドととかぶるので
anthyを削除してinput methodをmozcに変更

ctrl capslock入れ替え

lxkeymapが設定消えちゃうみたいなんで、一時的に.bashrcでしのぐ。

.bashrc

# ctrl capslock入れ替え
setxkbmap -option "ctrl:nocaps"
$ source ~/.bashrc

ruby

rbenvはubutuパッケージにもあるけどちょっと古いので最新版をいれる

$ sudo apt-get install git
$ git clone git://github.com/sstephenson/rbenv.git .rbenv
$ echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bashrc
$ echo 'eval "$(rbenv init -)"' >> ~/.bashrc

$ mkdir -p ~/.rbenv/plugins
$ cd ~/.rbenv/plugins
$ git clone git://github.com/sstephenson/ruby-build.git
$ cd ruby-build
$  sudo bash ./install.sh
$ source ~/.bashrc
$ rbenv install --list | grep "1.9.3"
  1.9.3-dev
  1.9.3-p0
  1.9.3-p125
  1.9.3-p194
  1.9.3-p286
  1.9.3-p327
  1.9.3-p362
  1.9.3-preview1
  1.9.3-rc1

$ rbenv install 1.9.3-p327
$ rbenv rehash
$ rbenv global 1.9.3-p327
$ which ruby
/home/uee10000/.rbenv/shims/ruby
$ gem i rbenv-rehash
$ gem i bundle
$ gem i rails

node.js

nodejs入れる。

$ curl https://raw.github.com/creationix/nvm/master/install.sh | sh
$ sudo apt-get install build-essential libssl-dev libreadline-dev
$ nvm install  v0.8.16
$ npm install -g coffee-script
$ npm install -g js2coffee

.bashrcに追記

# nvm
[[ -s /home/uee10000/.nvm/nvm.sh ]] && . /home/uee10000/.nvm/nvm.sh # This loads NVM
nvm use "v0.8.16"

android sdk

android sdkの最新版を入れる
ダウンロードページに行って

・「USE AN EXISTING IDE」をクリック
・「Download the SDK Tools for Linux
をクリック

$ tar zxvf android-sdk_r21.0.1-linux.tgz 
$ mkdir ~/dev_tools
$ mv android-sdk-linux ~/dev_tools/

.bashrcに追記

# android-sdk
PATH=$PATH:$HOME/dev_tools/android-sdk-linux/tools
PATH=$PATH:$HOME/dev_tools/android-sdk-linux/platform-tools

android ndk

$ tar jxvf android-ndk-r8d-linux-x86.tar.bz2
$ mv android-ndk-r8d ~/dev_tools/

.bashrcに追記

# Android NDK
export ANDROID_NDK_ROOT=$HOME/dev_tools/android-ndk-r8c
export PATH=$ANDROID_NDK_ROOT:$PATH
# Open CV
export ANDROID_NDK=$ANDROID_NDK_ROOT

フォルダの名前変更

$ LANG=C xdg-user-dirs-gtk-update

としたあと再起動。(Gnome再起動でいいのかも。)

Titanium Studio

Linux用をDownloadして解凍
・sudo apt-get install libwebkitgtk-1.0-0

とする。

F12-Cの認識

/etc/udev/rules.d/51-android.rules

SUBSYSTEM=="usb", ATTR{idVendor}=="04c5", MODE="0666", GROUP="root"

を追記

F12-Cの場合のみ
~/.android/adb_usb.iniへ

0x04C5

を追記

$ adb devices
List of devices attached 
F12C406705	device

あとはemacsの設定ファイル郡を鯖から引っ張ってくる&Rictyの設定で基本は終わりでいいのかな?

TitaniumMobileでAndroidアプリを書いてみた

表題のとおりなんですがTitaniumMobileでAndroidアプリを書いてみた。

目的はTitaniumMobileの調査。使用したバージョンはTitaniumMobile2.1.3。

結論から書くと、細かいハマりどころはまだあるものの、用途を選べば今の段階で大体使えそうかな~という感じ。
1年前に比べるとかなりこなれた感がある。

とりあえず作ったアプリの宣伝。


作ったアプリ ニュースクリッパー(NewsClipper)

ニュースクリッパー(NewsClipper)

https://play.google.com/store/apps/details?id=com.ueebee.newsclipper

全国紙・地域ブロック紙の情報を閲覧できるツールです。個人的に地下鉄に乗ることが多いので、オフライン状態で閲覧可能になってます。


今のところ読める新聞
[全国紙]
読売新聞・朝日新聞・毎日新聞・産経新聞・ロイター

[ブロック紙]
北海道新聞東奥日報河北新報秋田魁新報・千葉日報・神奈川新聞・新潟日報信濃毎日新聞岐阜新聞中日新聞福井新聞・京都新聞・紀伊民報山陰中央新報山陽新聞中国新聞徳島新聞愛媛新聞佐賀新聞・宮崎日日新聞・沖縄タイムス琉球新報

※今後の予定
・わかってるバグ潰す
・ダサいのでUI変えたい
・地方紙追加(残り9紙くらい)
・ジャンル分け機能欲しい(政治・地方・スポーツetc)

※感想
地方紙というか地方のニュース結構面白い。

よかったら使ってみてください。


以下TitaniumMobileを使ってみた感想・技術メモを書きます。

良いとこ1:コード量減る

これはまじで減ります。javascriptだからってのが大きな理由だと思いますが、大体体感で1/2から1/3程度になるような感覚。



良いとこ2:coffeescript便利

TitaniumMobileとは直接的には関係ありませんが、javascriptの足りないところをかなり補ってくれる。クラスが手軽に書ける&thisが@にバインドされてて直感的等々メリットでかい。またcoffee -wcでjavascriptを吐き出すとグローバルを汚さないので安心。



良いとこ3:容量が思ってたほど大きくならない

開発時に実機転送してた時「容量でかいな~」というのが正直なところでしたが、google playに公開するように、サイン付きのapkを書き出す際に1/3程度に圧縮してくれる。調査してませんがgoogle clousure toolsで圧縮してるのが効いてる?それともデフォルトでapk作るときに圧縮するからこんなもん?



微妙なところ1:マルチプラットフォームだけど・・

マルチプラットフォームはおそらく微妙。メインの処理部分は共通でいけるっていうところはありがたい。が、スマホ向けアプリの場合UI作るのにコードを結構書かなきゃいけない場合が多くて、UI向けのところはandroid向け、iphone向けで結構違う。



自分用メモ1:TabBarダサいから消したい

platform/android/res/layout/titanium_tabgroup.xmlへ以下を書く

<?xml version="1.0" encoding="utf-8"?>
<TabHost xmlns:android="http://schemas.android.com/apk/res/android"
         android:id="@android:id/tabhost"
         android:layout_width="fill_parent"
         android:layout_height="fill_parent">
  <LinearLayout
      android:orientation="vertical"
      android:layout_width="fill_parent"
      android:layout_height="fill_parent"
      android:padding="0dp">
    <FrameLayout
        android:id="@android:id/tabcontent"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:padding="0dp"
        android:layout_weight="1"/>
    <TabWidget
        android:id="@android:id/tabs"
        android:layout_width="fill_parent"
        android:layout_height="0dp"
        android:layout_weight="0"/>
  </LinearLayout>
</TabHost>

javaネイティブで書くとき風味。



自分用メモ2:初回起動時にリスタート求められる

ちなみに初回起動時でも、android端末の種類によっては正常に起動できるものもあるらしい。
ついでに自分の環境だと、初回起動時というわけではなくて、google playの起動ボタンを押すとこの現象が出た。

Titanium2.1.2で解消されてるといってるけど、以下をtiapp.xmlへ追記しないとダメだった。

<property name="ti.android.bug2373.finishfalseroot" type="bool">true</

元ネタ

http://developer.appcelerator.com/question/141450/android-issue-2373-missing-intent-categorylauncher-or-flatactivityresettaskifneeded-restarting-app



自分用メモ3:versionCode、versionNameはtiapp.xmlに書けない

バージョンアップする時に、versionCode、versionNameをアップしていくことになるけど、tiapp.xmlへ記載する方法が見つからなかった。解決方法は

一旦コンパイル→build/android/AndroidManifest.xmlをplatform/android/AndroidManifest.xmlへコピー→manifestのversionCode、versionNameを書き換えてコンパイル

これでversionCode、versionNameが上がる。



自分用メモ4:画面を縦固定にしたい場合

これもplatform/android/AndroidManifest.xmlを書き換える。activityにandroid:screenOrientation="portrait"を追記すればOK。



自分用メモ5:preferenceが使いにくい

設定画面が簡単に作れるPreferenceクラスですが、TitaniumMobileだとイベントが足りないと感じた。
closeイベント、changeイベントとかが取れるとありがたい。
仕方がないので今回はwindowのfocusイベントで代用。

追記:TitaniumMobile3.0βではイベント追加されてる模様



番外編1:google playからダウンロードエラー

エラー詳細は

サーバーからの情報の取得中にエラーが発生しました。[RPC:AEC:0]

結果わからずじまいだったのですが、
http://ameblo.jp/mu-rrr-ci/entry-11394553434.html
と同じ症状。

症状も同じで、
・初版をGoolePlayへアップロード
・数時間後ダウンロードできるようになる
・バグに気づいて修正
・再アップロード
・再アップロードから4時間後くらいに、アップデート通知がandorid端末に届く
・ここでエラー サーバーからの情報の取得中にエラーが発生しました。[RPC:AEC:0]
・PCサイトからインストールはしばらくしたら可能になった
android端末からはインストールできない
・寝る
・再アップロードから12時間後くらい?android端末からも正常にダウンロード可能
という状態。





感想

TitaniumMobile使えます。あと一歩って感はまだあるけど、WEB連携・リアルタイム性がそれほど求められないアプリなんかは、ネイティブで書くより楽な気がします。無い機能もモジュールでカバーできそうですし、もう少しこなれたらTitaniumもっと増えそうな予感。今後に期待です。

node.js製フレームワークRailwayJSで遊んでみる

こんばんは。


台風の今夜いかがお過ごしでしょうか。こちらは結構ヤバイです。今日の天気とは関係ありませんが、javascript界隈も4号以上にヤバク熱い感じになってきてます。


今日もはてブホッテントリ

http://www.publickey1.jp/blog/12/javascript_mvc.html

みたいな記事が入ってきてます。



というわけでサーバーサイドJS本命node.jsの上に乗っかったRailwayJSを使ってサンプルアプリを作ってみました。ちょろちょろとは触ってたけど、わりと普通の構成のWEBアプリ作ったらどうなるの?っていう興味本位andブラ三の合成レシピをスマホで見たかったてのも理由です。


作成したアプリはhttp://csv2sl.ueebee.com/
Excelシートをコピペすると、HTMLのテーブルに変換してページを置いておけるだけというシンプルなものです。


普通ぽいWEBアプリをnode.jsで作ってみた私個人の感想は後ほど記載します。

RailwayJSは

本家:http://railwayjs.com/
日本語:http://railwayjs.jp/

で最新の情報を得ることができます。

「Create NodeJS web apps faster with more energy, using RailwayJS」

とあってnodejs製のWEBアプリ作成を助けてくれるフレームワークです。
簡易フレームワークexpressに、Ruby on Railsの便利な機能を乗っけてきたような感じになっています。

ちなみに同じ位置づけのnode.js製フレームワークとしてはtower.jsとかです。
http://towerjs.org/

いずれもRuby on Railsを強く意識しているフレームワークだな~という感想です。

RailwayJSを選んだポイント

デフォルトでcoffee-scriptで書けるらしい(tower.jsもらしいです)
最初tower.jsに行ったんだけど・・・scaffoldingが初見で動かなかったorz
直感&なんとなく( ゜д゜)ハッ!


という理由です。

インストール

node.jsが使える環境なら、

$ npm install railway -g

とするだけです。

node.jsの環境構築等はいっぱい情報があるので省略。

アプリの雛形作成

こちらもRuby on Railsよろしく、アプリケーションの雛形を作成してくれます。
ずらずら-とファイルが作成されます。
※coffee-scriptを使うので--coffeeオプションを追加しています。

$ railway init csv2sortableList --coffee

作業ディレクトリへの移動・必要なパッケージのインストール

作成されたディレクトリに移動して、関連パッケージをインストールします。

$ cd csv2sortableList
$ npm install -l

ここまでで最低限必要な作業は終了。
ここからアプリの実装に必要な作業に入ります。

scaffoldを使って基本枠を作る

$ railway g scaffold post title content updated_at

これだけで動くアプリができます。
controllerもviewもlayoutsも、Ruby on Railsと同じ構成になっています。
また中身は空っぽですがhelper、modelも同じ構成です。

サーバー起動

以下のコマンドでサーバー起動します。

$ railway s ポート番号

※デフォルトだと3000番でサーバ起動します。

CRUD動作が行えることを確認できます。
見た目もTwitterBootStrapがデフォルトで適用されているため、おしゃれな画面になってます。


Controllerの中身

以下の感じです。CoffeeScriptなのも手伝って、かなり見通しが良くなってます。

注目するポイントとしては、
before ->
のところでここがbefore_filterのような共通化したコードになっています。
, only: ['show', 'edit', 'update', 'destroy']
で適用するアクションを指定しています。


load  'application'

before 'load post', ->
    Post.find params.id, (err, post) =>
        if err
            redirect path_to.posts()
        else
            @post = post
            next()
, only: ['show', 'edit', 'update', 'destroy']

action 'new', ->
    @post = new Post
    @title = 'New post'
    render()

action 'create', ->
    Post.create body.Post, (err, post) =>
        if err
            flash 'error', 'Post can not be created'
            @post = post
            @title = 'New post'
            render 'new'
        else
            flash 'info', 'Post created'
            redirect path_to.posts()

action 'index', ->
    Post.all (err, posts) =>
        @posts = posts
        @title = 'Posts index'
        render()

action 'show', ->
    @title = 'Post show'
    render()

action 'edit', ->
    @title = 'Post edit'
    render()

action 'update', ->
    @post.updateAttributes body.Post, (err) =>
        if !err
            flash 'info', 'Post updated'
            redirect path_to.post(@post)
        else
            flash 'error', 'Post can not be updated'
            @title = 'Edit post details'
            render 'edit'

action 'destroy', ->
    @post.destroy (error) ->
        if error
            flash 'error', 'Can not destroy post'
        else
            flash 'info', 'Post successfully removed'
        send "'" + path_to.posts() + "'"


@post.save (err) =>
みたいなコードが見受けられますが、ORMとして

https://github.com/1602/jugglingdb

jugglingdbというORMを採用しています。
対応DBとしても

redis
mongodb

等が揃っており、使い勝手がいいです。(sqlite3、rowlevel-mysql等も使えるようですが試してません)
redis、mongodbとDBを複数使用できるのもポイント高いです。

ちなみにRailwayJSの公式サイトではORMの説明が弱いと感じます。jugglingdb https://github.com/1602/jugglingdb
を確認したほうが使い方の参考になりました。

rails console相当の「railway c」

こちらもRuby on Railsのrails consoleに相当する、「railway c」とすると対話型コンソール(REPL console)が利用できます。

railway c
railway> User.find(53, c)
Callback called with 2 arguments:
_0 = null
_1 = [object Object]
railway> _1
{ email: [Getter/Setter],
  password: [Getter/Setter],
  activationCode: [Getter/Setter],
  activated: [Getter/Setter],
  forcePassChange: [Getter/Setter],
  isAdmin: [Getter/Setter],
  id: [Getter/Setter] }

というような感じになります。コンソールはjavascriptのcallbackを取るスタイルに多少なれないと行けないかもしれません。
ループも含めコールバックを使う形になります。

helper

こちらもRuby on Railsのヘルパーに似てます。組み込みヘルパーは本家RailwayJSにだいたい書いてあります。
今回時刻表示のフォーマットヘルパーがどこにあるのかわからなかったので、以下の共通ヘルパーを作ってみました。
※ここは自動で生成されたものだとcoffee-scriptじゃないみたいです。

app/helpers/application_helper.js

require('date-utils');

module.exports = {
   my_date_format_helper: function(dateString){

          if (dateString == null || dateString == undefined){
                 return "";
          } else {
                 var formatted = dateString.toFormat("YYYY-MM-DD HH24:MI");
                 return formatted;
          }
   }
};

view側で

<%- my_date_format_helper(@post.updated_at) %>

で使用できます。

routes

アプリのURI管理は
config/routes.js
に書いていきます。

exports.routes = function (map) {
    map.resources('users');
    map.root('posts#index');
    map.resources('posts');


    map.get("postsall", "postsall#index");
    map.get('tos', 'static_page#tos');
    // Generic routes. Add all your routes below this line
    // feel free to remove generic routes
    map.all(':controller/:action');
    map.all(':controller/:action/:id');
};

これもほぼRuby on Railsのroutes.rbと同じです。
map.root:アプリトップを指定
map.resources:RESTなURI
map.get:該当するURIに対するコントローラ・アクション
etcetc...



パッケージ管理

プロジェクト直下に

package.json

というファイルがあります。ここに必要なパッケージを書いていく感じになります。
これもBundlerに似てます。

{ "name": "csv2sl"
, "version": "0.0.1"
, "engines": ["node >= 0.4.0"]
, "main": "server.js"
, "dependencies":
  { "ejs":              "*"
  , "ejs-ext":          "*"
  , "express":          "~2.x"
  , "railway":          ">= 0.2.6"
  , "jugglingdb":       ">= 0.1.0"
  , "coffee-script":    ">= 1.1.1"
  , "csv":              ""
  , "mongoose":         ""
  , "async":            ""
  , "password-hash":    ""
  , "everyauth":        ""
  , "jade":             ""
  , "date-utils":       "*"
  , "js2coffee":        "*"
  },
  "devDependencies":
  { "nodeunit":         "*"
  , "sinon":            "*"
  , "semicov":          "*"
  }
, "scripts":
  { "test": "nodeunit test/*/*"
  }
}


書いたパッケージのインストールは

$ npm install -l

で依存関係含めインストールしてくれます。


ざっくりとはこんな感じになります。

気をつけるところ

node.jsは基本非同期です。
なので、

hoge = []
for sheet in sheets
    hoge.push sheet
render({hoge: hoge})

みたいなコードを書くと、Viewに変数hogeの値は[]で渡っちゃうことがあります。
なので、組み込みのnext()をうまく使うか、async.jsやstep.js等を使ってあげると楽できます。
今回はasync.jsを使ってみました。

ただそもそも非同期前提なんだしwebSocket楽に導入できるんだから、
・細かくコントローラを切って非同期で値の受け渡しをする
というのもありかなとおもいます。

その他

今回使ったライブラリは以下のとおりです。

csvパーサー
csv.js
https://github.com/wdavidw/node-csv-parser


フロー制御
async.js
https://github.com/caolan/async


oauth認証ライブラリ
everyauth
https://github.com/bnoguchi/everyauth


日付フォーマット整形
date-utils
https://github.com/JerrySievert/node-date-utils


テンプレート
jade
http://jade-lang.com/
※RailwayJSは基本はejsです。

使ってみた感想

CRUDなアプリも作れるけど、実用的な細かいものを考えるとちょっと成熟してない
やっぱりイベントループなことを考えると今のところはアプリケーションサーバの一部に使うのが吉(websocket鯖とか)
一部だけ使うって考えると、軽量フレームワークexpressが情報量が多いのもなるほど~という感じ
javascript大好きだぜ~!という人が一杯いれば採用もありかも