2014年8月5日火曜日

近日リリース!Chrome Extensionで出来るチャットアプリ

タイトルのままです(笑)

匿名性の強いチャットアプリを近日リリースする予定です。

こういったコミュニケーションツールはサーバーの管理を考えると恐怖なので、流行るならじわじわユーザーが増えたら良いなぁという願望を持ちつつ、多分このままじゃ大して広まらないという予想。


一応、起爆剤として、スマホ版も開発しようと思ってます。
今思いついちゃったけど、ウェブビュー使えば一瞬だなー。
まぁこっちはちょっと様子を見て。
これからちょっと忙しくなりますし。


リリースしたら報告します!

2014年8月1日金曜日

JINSの出したウェアラブルに妙に可能性を感じた

ウェアラブルグラスの見方を変えた『JINS MEME』の衝撃

正直僕もこの記者と同じで、読みながらもどんなもんよ?なんて思ってたんですが、これがなかなか良い。

簡単に言うと、かけている人の視線の動き等をキャッチするセンサーを仕込んだというもの。

カメラやディスプレイを外して、外でなく内である使用者から情報を取ろうという完全に逆転の発想。

ついでに電池を食うハードウェアを外しているので連続利用時間まで伸びているという優れものです。


いやー、体との距離が一定に保たれる眼鏡の特性を生かした素晴らしい発想ですよね。


ここで紹介しているマウスや居眠り運転防止以外にも色々な応用が出来そうに思います。埋め込むセンサーで色々な事が出来そう。


なかなか、要チェックですわー

2014年7月24日木曜日

ChromeとAndroidの連携すげーなー。アムロに「そこっ!」って言われた気分w

今日気が付きました。

同じアカウントでログインしてるPCのChromeと自分のAndroidが連携して、PCのChrome上で位置情報が把握されている。

どうやらロケーション履歴を取得しているからのようですが。

GoogleはMapの渋滞情報もAndroidの位置情報使っているらしいし、ここまで考えてAndroidを作って世に出したのだとしたら、すごい壮大な計画ですよねー。

思いついても巨人Googleにしか実行できん(笑)。

PCで位置情報が正確に取れるようになるとなると、また面白いサービスが出来るかも知れませんね。


軍事利用されたら怖いけど…

さくらレンタルサーバーにnode.jsをインストールしてみた

スタンダードさくらインターネットレンタルサーバーにnode.jsをインストールしました。

こだわりゆえに死ぬほど大変でしたが、まとめておきます。

結果から言うと、node.js上でチャットアプリケーションがインターネット上のサービスとしてきちんと動作するところまで確認できました。


こういった事は計画が大事なので、どういう方針でインストールするか書いておきます。
(当然、事前に計画したものではなく、試行錯誤の結果である事は言うまでもない)


  • nvmからのインストールにこだわる
  • 問題が発生しても、安易にソース修正して機能削減を行わず、きちんと足りないライブラリをインストールするようにする
  • 倫理的に問題になりそうな手段はとらない
  • 出来るだけ理解してやる(一部解らないところも出ましたが…)

です。

また結果的に、やらなければいけない事は以下です。

  • nvmのインストール
  • libexecinfoのインストール
  • node.jsのインストール
  • アプリケーションの準備
  • アプリケーションの実行・確認

苦労話は省略して、上記の流れでどうすればいいのかを書いていきます。

nvmのインストール

これはgitで落としてきました。具体的には以下のコマンド

git clone git://github.com/creationix/nvm.git ~/.nvm

これでnvm実行に必要なすべてのファイルが~/.nvmにダウンロードされます。
~/.nvm/nvm.shを実行すればnvmコマンドが使えるようになりますが、ここではまだ実行しません。

libexecinfoのインストール

恐らくここが一番の難関だと思います。

結論から言うと、portsをインストールしてlibexecinfoをダウンロード・展開し、手動でhome/local/に作ったディレクトリにコピーするという手段をとりました。ソースからでも良いのですが、実施時点でFreeBSDの公開URLが解らなくなっておりまして…。正直、できるならソースからの方が楽だと思います。

まずportsのインストールはこちらを参考にさせて頂きました。


まずはディレクトリを準備します。参考サイトのコマンドそのままです。
% mkdir ~/local
% cd ~/local
% mkdir work
% mkdir work/ports
% mkdir work/ports/distfiles
% mkdir var
% mkdir var/db
% mkdir var/db/portsnap
% emacs ~/work/ports/portsnap.conf
最後のコマンドでportsnap.confのエディタが開きます。僕はemacsを使いますが、viでも問題ないです。

内容はこちらも参考サイトと同じ内容です。
パスの中のhome下のユーザー名部分の修正だけ注意してください。WORKDIRとPORTSDIRの2か所です。

# Default directory where compressed snapshots are stored.
WORKDIR=/home/(user name)/local/var/db/portsnap

# Default location of the ports tree (target for "update" and  "extract").
PORTSDIR=/home/(user name)/local/work/ports

# Server or server pool from which to fetch updates.  You can change
# this to point at a specific server if you want, but in most cases
# using a "nearby" server won't provide a measurable improvement in
# performance.
SERVERNAME=portsnap.FreeBSD.org

# Trusted keyprint.  Changing this is a Bad Idea unless you've received
# a PGP-signed email from  telling you to
# change it and explaining why.
KEYPRINT=9b5feee6d69f170e3dd0a2c8e469ddbd64f13f978f2f3aede40c98633216c330

# Example of ignoring parts of the ports tree.  If you know that you
# absolutely will not need certain parts of the tree, this will save
# some bandwidth and disk space.  See the manual page for more details.
#
# WARNING: Working with an incomplete ports tree is not supported and
# can cause problems due to missing dependencies.  If you have REFUSE
# directives and experience problems, remove them and update your tree
# before asking for help on the mailing lists.
#
REFUSE arabic chinese french german hebrew hungarian
REFUSE korean polish portuguese russian ukrainian vietnamese
REFUSE x11 x11-clocks x11-drivers x11-fm x11-fonts x11-servers x11-themes x11-toolkits x11-wm
REFUSE palm cad astro

このファイルをportsnapコマンドで読み込めば、portsの準備は完了です。
% portsnap -f ~/ports/portsnap.conf fetch extract update
portsからインストールしたものは、解りやすいように~/local/ports下にインストールするように設定します。

以下のコマンドで、ディレクトリの作成と~/.cshrcの編集を開きます。
% cd ~/local
% mkdir ports
% cd ports/
% mkdir -p bin sbin etc lib tmp/dist tmp/work var/db/pkg var/db/ports var/run
% emacs ~/.cshrc

.cshrcの追加内容は参考サイトとほぼ同じですが、NODE_PATHとNODE_MODULESを削除し、代わりにCPATHを追加しています。cプログラムソース内のincludeがうまく行くようにするためです。念のため、PATHに${HOME}/local/libも追加していますが、これは機能していないかもしれません。

また、SRCCONFの設定も重要ですので忘れずに入れてください。
setenv  PATH    ${PATH}:${HOME}/local/ports/bin:${HOME}/local/lib
setenv  CPATH   
setenv  CPATH   ${CPATH}:${HOME}/local/include
setenv  LD_LIBRARY_PATH
setenv  LD_LIBRARY_PATH ${LD_LIBRARY_PATH}:${HOME}/local/lib

setenv  INSTALL_AS_USER yes
setenv  PREFIX  ${HOME}/local/ports
setenv  LOCALBASE   ${HOME}/local/ports
setenv  PKG_DBDIR   ${LOCALBASE}/var/db/pkg
setenv  PKG_TMPDIR  ${LOCALBASE}/tmp/
setenv  PORT_DBDIR  ${LOCALBASE}/var/db/pkg
setenv  DISTDIR ${LOCALBASE}/tmp/dist
setenv  WRKDIRPREFIX    ${LOCALBASE}/tmp/work
setenv  PORTSDIR    ${HOME}/local/work/ports
setenv  PKGTOOLS_CONF   ${LOCALBASE}/etc/pkgtools.conf
setenv  DEPENDS_TARGET  'install clean'

setenv  X11BASE ${LOCALBASE}

setenv  PKG_CONFIG_PATH "$HOME/local/ports/lib/pkgconfig:$HOME/local/ports/libdata/pkgconfig:/usr/lib/pkgconfig:/usr/local/lib/pkgconfig:/usr/local/libdata/pkgconfig:/usr/libdata/pkgconfig"

# Set user and group variables to ourself
setenv  BINOWN  `whoami`
setenv  BINGRP  `id -G -n ${BINOWN}`
setenv  SHAREOWN    ${BINOWN}
setenv  SHAREGRP    ${BINGRP}
setenv  MANOWN  ${BINOWN}
setenv  MANGRP  ${BINGRP}

# Make sure files are installed with correct default permissions
setenv  BINMODE 744
setenv  SHAREMODE   644
setenv  MANMODE 644

# Make sure we don't really try to become root, but just execute everything as ourselves
setenv  SU_CMD  "sh -c"

# Make sure the systemdefault make.conf is not read
setenv  __MAKE_CONF ${LOCALBASE}/etc/make.conf

# Keep our own version of ldconfig hints
setenv  LDCONFIG    "/sbin/ldconfig -i -f ${LOCALBASE}/var/run/ld-elf.so.hints"
#setenv LDCONFIG    "/sbin/ldconfig -f=${LOCALBASE}/var/run/ld-elf.so.hints -i -R=${LOCALBASE}/etc/ld-elf.so.conf "
setenv  LD_LIBRARY_PATH ${LOCALBASE}/lib
setenv  LD_RUN_PATH ${LOCALBASE}/lib

setenv  PATH    ${LOCALBASE}/bin:${LOCALBASE}/sbin:${PATH}
setenv  MANPATH_MAP ${LOCALBASE}/bin:${LOCALBASE}/man

# Set application specific variables to make sure it doesn't pick up things from the main system
setenv  APXS    ${LOCALBASE}/sbin/apxs
setenv  PERL    ${LOCALBASE}/bin/perl
setenv  PERL5   ${PERL}
setenv  SITE_PERL   ${LOCALBASE}/lib/perl5/site_perl/5.8.8
setenv  SITE_PERL5  ${SITE_PERL}
setenv  PERL_VERSION    5.8.8
setenv  PERL_VER    ${PERL_VERSION}

setenv  SRCCONF     ~/local/ports/etc/src.conf

ファイルを保存したら、上記パスを通したディレクトリの作成と、libexecinfoの展開を手動で行います。

まずはportsからlibexecinfoをmake installします。
先に言っておくと、これはルート権限がないため失敗に終わりますが、その後手動でコピーするため問題ないです。

% cd ~/local/work/ports/devel/libexecinfo
% make install

実行はpermission deniedで失敗に終わりますが、~/local/ports/のincludeとlibには目的のファイルが生成されています。~/local/にユーザー領域内での参照用のディレクトリ、includeとlibを作成し、生成されたファイルをコピーします。

% cd ~/local/
% mkdir -p include lib
% cp ~/local/ports/include/execinfo.h ~/local/include/
% cp ~/local/ports/lib/libexecinfo.* ~/local/lib/


ここまで終わったのち、.cshrcを読み直します。

% source ~/.cshrc


node.jsのインストール

ここまでくればあと一歩ですが、実は大きな問題があります。

落としてくるソースのmksnapshotのコンパイルでlibexecinfoを利用するのですが、ライブラリの参照先が固定で-L/usr/local/libになっているのです。

execinfo.hのincludeはCPATHで対応できるのですが、v8エンジン系のコンパイルで使用しているgypのパラメータファイルに固定で記述された値が使用されており、ここを修正しないとコンパイルが成功しません。

ここで通常はソースからコンパイルを選択すると思いますが、僕はあえてnvmでやりたかったのでnvm.shを書き換え、makeが走る前に自作のシェルが動作するように変更しました。

関数nvm()内、case文の"install" | "i" )下、変数tmpdir、tarballの設定が終わった後のif文

      if (
        [ -n "$tarball" ] && \
        mkdir -p "$tmpdir" && \
        curl -L --progress-bar $tarball -o "$tmptarball" && \
        nvm_checksum "$tmptarball" $sum && \
        tar -xzf "$tmptarball" -C "$tmpdir" && \
        cd "$tmpdir/node-$VERSION" && \
        ./configure --prefix="$NVM_DIR/$VERSION" $ADDITIONAL_PARAMETERS && \
  +     source ~/.nvm/preinstall.add.sh && \
        $make $MAKE_CXX && \
        rm -f "$NVM_DIR/$VERSION" 2>/dev/null && \
        $make $MAKE_CXX install
        )
      then
        nvm use $VERSION
        ...


追加したシェルスクリプト~/.nvm/preinstall.add.shの内容は以下です。

#!/bin/sh

function vercomp () {
if [[ $1 == $2 ]]
then
return 0
fi
local IFS=.
local ver1=($1) ver2=($2)
for ((i=${#ver1[@]}; i<${#ver2[@]}; i++))
do
ver1[i]=0
done
for ((i=0; i<${#ver1[@]}; i++))
do
if [[ -z ${ver2[i]} ]]
then
ver2[i]=0
fi
if (( 10#${ver1[i]} > 10#${ver2[i]} ))
then
return 1
fi
if (( 10#${ver1[i]} < 10#${ver2[i]} ))
then
return 2
fi
done
return 0
}

local_vsn=${VERSION/v/}

local -i check
`vercomp $local_vsn "0.10.28"`
check=$?

if [[ $check = 1 ]]
then
fileadd="host"
else
fileadd="target"
fi

sed -i".org" -e "685s/-L\/usr\/local\/lib/-L\/usr\/local\/lib -L$\{HOME\}\/local\/lib/" "$tmpdir/node-$VERSION"/deps/v8/tools/gyp/v8.gyp

sed -i".mid" -e "696s/-L\/usr\/local\/lib/-L\/usr\/local\/lib -L$\{HOME\}\/local\/lib/" "$tmpdir/node-$VERSION"/deps/v8/tools/gyp/v8.gyp

sed -i".mid" -e "707s/-L\/usr\/pkg\/lib -Wl,-R\/usr\/pkg\/lib/-L\/usr\/pkg\/lib -Wl,-R\/usr\/pkg\/lib -L$\{HOME\}\/local\/lib/" "$tmpdir/node-$VERSION"/deps/v8/tools/gyp/v8.gyp

sed -i".mid" -e "682s/{/\{'include_dirs+':['$\{HOME\}\/local\/include'],/" "$tmpdir/node-$VERSION"/deps/v8/tools/gyp/v8.gyp

sed -i".mid" -e "693s/{/\{'include_dirs+':['$\{HOME\}\/local\/include'],/" "$tmpdir/node-$VERSION"/deps/v8/tools/gyp/v8.gyp

sed -i".mid" -e "704s/{/\{'include_dirs+':['$\{HOME\}\/local\/include'],/" "$tmpdir/node-$VERSION"/deps/v8/tools/gyp/v8.gyp


sed -i"org" -e "117s/-L\/usr\/local\/lib/-L\/usr\/local\/lib -L$\{HOME\}\/local\/lib/" "$tmpdir/node-$VERSION"/out/deps/v8/tools/gyp/mksnapshot."$fileadd".mk

sed -i"org" -e "117s/-L\/usr\/local\/lib/-L\/usr\/local\/lib -L$\{HOME\}\/local\/lib/" "$tmpdir/node-$VERSION"/out/deps/v8/tools/gyp/v8_shell."$fileadd".mk

sed -i"org" -e "162s/-L\/usr\/local\/lib/-L\/usr\/local\/lib -L$\{HOME\}\/local\/lib/" "$tmpdir/node-$VERSION"/out/node.target.mk


恐らくFreeBSD部分だけ修正すればよいと思われますが、/usr/local/lib/を直接指定している部分はすべて変更してあります。

※異なる(特にv0.10.29以降)のバージョンをインストールする場合には、一度ダウンロードして変更対象ファイルの内容を確認し、sedの行数指定などを見直す必要があります。全面的な見直しも必要かもしれません。

このシェルスクリプトには作業当時の最新バージョンであるv0.10.29のgyp関連の設定ファイル名が変更されている事への対応が入っていますが、実際この作業をしている時点でv0.10.29のインストールは出来ませんでした。
uv.h内の変数addr, address6について'xxx' has incomplete typeのエラーが出ていたためで、これはこちらで対処する範囲外と判断し、v0.10.28のインストールを実施しています。


ここまでの修正を実施して、nvm install v0.10.28を実行すればnode.jsがインストールされるはずです。

% bash
$ source ~/.nvm/nvm.sh
$ nvm install v0.10.28

アプリケーションの準備、実行・確認

ここまで来れば後はアプリケーションを動作させるだけ!と思っていたのですが、実はここまで自分が全く考慮していなかった問題があることが解りました。

解放されているポートってあるのかな…?

さくらインターネットスタンダードに関して調べてみたところ、ポートはこれ以外は閉めてまっせ、とのこと。


正直、これを見る前に闇雲にやってみて他にも空いてそうなポートが無きにしも非ずだったのですが、とりあえず開けてまっせ、とのたもうておられるWebDAVの9800で起動してみたところ、アプリケーションは問題なく動作していることが確認できました。

本番稼働は別として、デモや研究などには利用できそうに思っています。



2014年7月9日水曜日

店舗用プリンタなどのハードウェアがこんなに進化してたなんて知らなかった自分が恥ずかしい

今はHTTPやWebSocket on HTTPで印刷からキャッシュドロアなどのデバイスのコントロールまで出来ちゃうらしいです。


知らなかった~。

つまり、PCやタブレットなどのスマートデバイスに表示されたウェブアプリケーションでPOS周りのコントロールが出来ちゃうんです。

しかも、JavaScriptでシリアル制御信号を送るプログラムも組み込めるので、POSだけに留まらない、店舗全体で統一されたIT環境を作ることだってできちゃうはず!


しかし、自分が研究していた技術がこんなところで素敵に応用されているとは。。


まるで回し者のように宣伝すると、EPSONのインテリジェンスレシートプリンタに搭載されている、ePOS-PrintとePOS-Device。

【概要】

要はePOSサーバーと言っていいですかね。これを搭載したプリンタをLAN内に置いておくと、そこにHTTPやWebSocketで命令を送信することで印刷やドロアオープンなどの命令を肩代わりしてくれるというもの。

しかもePOS-Print APIとePOS-Device APIという形でJavaScriptで簡単に起動できるのでnodejs知ってる人なら見ただけで構築イメージが湧いちゃいます。

JavaScriptが都合悪い場合でもSOAPの口を用意してくれているので、ブラウザアプリ以外からでも同じ経路で命令を出すこともできます。

デバイスの登録もスクリプトのセットもプリンタ側のウェブUIで簡単に出来るので、設置の方も問題なし。

さらに、ちょっとしたデータサーバーもWebSocketで用意されているので、あるデバイスで発生したイベントをチャットのように他のデバイスで拾い、しかもさらに別のデバイスの状態に応じて動きを変えるなんてこともできそう。


店内の誰かのハッピーバースデーで動画を流したり、入店待ちの客の人数に応じて、長居してるお客さんにメッセージを流したりできそうかなー。


なんか色々考えちゃいますねー

2014年6月29日日曜日

Googleが空間認識するタブレットを作成するそうです

6月27日のニュースにこんなのがありました。


空間認識タブレット発売へ=米グーグル、来年初旬にも


今僕が研究しているAR(拡張現実)の中にも奥行などの空間を認識する技術があるのですが、おそらくこれをもっとハードウェアレベルで精緻にして端末に初期搭載し、開発者向けにゲームその他アプリ開発のプラットフォームを提供しようというもの。


この技術自体は面白いのです。

カメラのフレームに入った空間を認識することで、より自然なキャラクターなどの配置が行えますので、現実をベースにしたリアリティのあるコンテンツが提供できるのです。


ただ、これ研究してて本当に難しいのが、「どんなコンテンツを乗せると面白いのか」と言うところ。


何乗せてもある程度面白いものが出来るのですが、なかなか面白いアイディアが浮かばないんですよね。


今回のGoogleの取り組みで、より多くの技術者が参画して面白いアイディアが出ると良いなと思います。

2014年6月22日日曜日

GoogleのWeb Starter Kitが良さげ

Web作成するうえで必ず書かなければならないコードってありますよね?

最近ではモバイル端末も意識しなければならないので、非常に多くのコードとレイアウトへの意識が必要になりました。


それらをドキュメンテーションも含めてテンプレート化しちゃったものがこちら

Google Web Starter Kit


さっそくダウンロードしてみました。


結論からいって、なかなか良さげです。さすがGoogle。

めんどくさーいレスポンシブも含めてある程度のデザインがclass指定だけで出来ちゃう。

アイコンとかもセットになってる。


依存するライブラリもないみたいなので、bootstrapなんかとも共存できるんじゃないかな?


詳しい使い方は同梱のstyle guideで確認できます。メニューは以下。


  1. Typography
  2. Buttons
  3. Lists
  4. Links
  5. Icons
  6. Breadcrumbs
  7. Table
  8. Grid
  9. Colors
  10. Highlights
  11. Editorial header
  12. Article section
  13. Guides section
  14. Page header
  15. Quote
  16. Featured icons
  17. Featured spotlight
  18. Featured list
  19. Featured block
  20. Article navigation

雰囲気はこんな




今度うちのサイトをこれ使ってリニューアルしてみようかなー