2015年3月31日火曜日

chromebook上でcordova(phonegap)開発環境を構築する

1.shell起動

ALT+Space+Tを押して
> shell

(chrton インストール済みであること)

>sudo enter-chroot

2.Nodebrewインストール
$ curl -L git.io/nodebrew | perl - setup
$ nodebrew install v0.12.1
$ nodebrew use v0.12.1

3.ライブラリインストール
$ sudo apt-get install -y oracle-java7-installer ant build-essential
(java7でないとエラーになる)

$ npm install cordova
$ tar zxf android-sdk_r24.1.2-linux.tgz
$ android-sdk-linux/tools/android update sdk --no-ui
$ sudo add-apt-repository ppa:webupd8team/java
$ sudo apt-get install software-properties-common -y
$ sudo add-apt-repository ppa:webupd8team/java


$ sudo apt-get install -y oracle-java7-installer ant
$ vim android-sdk-linux/tools/ant/build.xml
1.5を1.7にする



.bashrcに新たにパスを追加する。ここは環境に合わせて調整すること。

export PATH=$HOME/.nodebrew/current/bin:$PATH
export PATH=$HOME/.nodebrew/current/lib/node_modules/cordova/bin:$PATH
export PATH="/media/removable/SD Card/android-sdk-linux/tools":$PATH
export PATH="/media/removable/SD Card/android-sdk-linux/platform-tools":$PATH
export JAVA_HOME=/usr
export ANDROID_HOME="/media/removable/SD Card/android-sdk-linux"

4.Hello World実行
PCとAndroidをUSB接続しておいてから

$ cordova create hello
$ cordova platform add android
$ cordova build

SUCCESSがでればおk

実機にアプリを転送&実行
$ cordova run

chromebookの開発環境

そもそもChromebookの使い方はシンクライアント的に使う事が想定されているので、主にクラウド上の開発環境を利用するのが一般的。それでもローカルで開発環境が欲しいとと思っていろいろ調べてみると、Chrome Dev Editor というアプリがベータ版であるが、まだまだ実用レベルになってない。(というか使い慣れたエディタが使いたい。)
しかもDart言語ってキワモノ言語の一つだからまだ触れたくないのもある。

他にやり方はないかと調べていたらCordova(PhoneGap)が見つかった。
これはクロスプラットフォームでHTMLとJavascriptがわかる人なら書いたら殆どのプラットフォーム上で同じアプリが作れるよというスグレモノ。
これもキワモノなんじゃない?っていうとおっしゃる通り。でもね、Adobeでもクラウド開発環境を作っていたりMonacaというのもあったり何社か扱ってる分安心できそうなんだよ。
しかもChromeAppにもクラスプラットフォーム対応しようとがんばってる方々がいるので、Chromebookで開発するならこれだろうーってことで今回これをピックアップしてみました。

次回は開発環境の構築からHelloWorldまで。

http://www.omgchrome.com/android-development-on-chromebooks-easier-adb-built-in/

https://github.com/MobileChromeApps/mobile-chrome-apps

chromebook(64bit) でadbを動かす

adbが32Bit版らしいので、そのままでは動かない。

そんなときは
$ sudo apt-get install ia32-libs

これで良いみたい。

見つからないなどのエラーが出た場合は、直接i386版をダウンロードする方法があるので、こちらで対応すること。

sudo dpkg --add-architecture i386
sudo apt-get -qqy update
sudo apt-get -qqy install libncurses5:i386 libstdc++6:i386 zlib1g:i386

足りないライブラリを調べるには

 ldd adb

でnot found となってる項目が参照エラーになっている項目です。



参考URL:
 http://www.webmages.com/2013/06/running-android-development-tools-on.html
 http://stackoverflow.com/questions/19523502/how-to-make-androids-aapt-and-adb-work-on-64-bit-ubuntu-without-ia32-libs-work
     http://nouzui2007.blogspot.jp/2011/08/64bit-ubuntu-adb.html

chromebookでSDカード、USBメモリの中にある実行ファイルを実行できるようにする

自動でマウントされたリムーバブルディスクはすべて読み書きのみなので、実行ファイルが実行できない状態になっている。 実行可能にするには、自分でマウントするしかないので CTRL+Space+T >shell $ sudo umount /media/removable/SD card/ $ sudo mount -t vfat -o rw,exec,uid=1000,gid=1000,umask=022 /dev/mmcblk1p1 /media/removable/SD Card/ これでOK。 USBメモリの場合も同様にできる。

2015年3月27日金曜日

RS485

ネットワークカード複数刺しで初回必ずタイムアウトする現象の対策方法

ありました。


    int port = 1234;

    IPHostEntry entry = Dns.GetHostEntry(Dns.GetHostName());

    //find ip address for your adapter here
    IPAddress localAddress = entry.AddressList.FirstOrDefault();

    IPEndPoint localEndPoint = new IPEndPoint(localAddress, port);

    //use socket instead of a TcpClient
    Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

    //binds client to the local end point
    client.Bind(localEndPoint);
http://stackoverflow.com/questions/49507/controlling-which-network-card-tcp-ip-message-are-sent-on

2015年3月26日木曜日

CMOSイメージセンサーのノイズ除去テクニック(2)


前回はノイズの種類に2つあることを記事にした。

今回は固定パターンノイズを除去してランダムノイズはどういうものかについて考察してみる。

ランダムノイズを累積した画像(左)、原画(右)

左側は時間軸で見て動いた値を累積した画像です。
すでに固定パターンノイズは除去済みで左右共に64枚画像を合成・平均化したものになります。
右側は合成しただけあってノイズが全然みえないです。iphoneアプリと同じ効果がでてますね。

ノイズ画像側を見るとヘッドホンが文字までハッキリと写っているのが分かる。
つまりランダムノイズって輪郭となるエッジに吸い寄せられるように集まってくるのか?と思って時間軸フィルタを作ってみたり色々ノイズ除去のアイデアを実施してみたがうまくいかない。

なぜだと原点に立ち戻ってみると、

 Y(出力値) = A(CMOS特性) * (Xランダムノイズ + K理論値) +  B(固定パターンノイズ)


もうここの時点で間違いだったという事に気づいた。


固定パターンノイズは蚊帳の外だと思って 固定パターンノイズ と ランダムノイズを分けて考えるにはちょっと早くて


 Y(出力値) = A(CMOS特性) * {(X理論値 + ランダムノイズ) +  B(固定パターンノイズ)}

Y(出力値) = A(CMOS特性) * {理論値+ノイズ}

なので、まず最初にやるべきことは出力値をCMOS特性で割って {理論値+ノイズ}の値を求めなくてはいけなかったことだ。

 A(CMOS特性)はカメラで黒と白の画像を撮影して検量線{入力値ー出力値}の1次間数が求めておいて次の計算式を解く。


 値{(Y/A) - B} = Xランダムノイズ + K理論値


ここまで来てやっと固定パターンノイズを無視してランダムノイズのみを対処できるようになる。

何を間違っていたかというと

 {(Y - B) / A} = X理論値 + Zランダムノイズ


最初に出力値から固定パターンノイズを引いていた所である。

これだと何がいいかというと Aを求めるときにBを含める事ができるので

 Y / A = X理論値 + Zランダムノイズ

というようにできる点。

結果の違いは微々たるものだけど、間違いは正しておく必要があるので書き残しておく。


ここから前回と今回の成果をまとめると

●検量線作成
・ダーク撮影 =暗電流測定
・白背景撮影 =ホワイト =何枚か撮影して最小値を測定して、ランダムノイズ=0の白画像を取得したら平均値Mを計算する。

●画素単位のCMOS特性Aを求める
1画素単位にAを求める。該当画素をWとするとW/M

(入力値、出力値)(0, 0)(M, W)を通る線がAとなることから、Aの値は

 A=W/M

以降の計算で逆数になるので、計算しやすいように逆数にする
 A'=M/W

●得た値から本来の色を求める式を導出
この時点でY=AX+Bを計算式で求まるようになっていることから

式を変形させ

 X=(Y-B)/A

 X=(Y-B)*A'

本来はランダムノイズZがあるので付加する。

X+Z=(Y-B)*A'

K=X+Zとしたとき


 固定パターンノイズ除去画像K=(取得した画像Y - 黒画像B) * (CMOS特性画像A')

となる。


ランダムノイズの手がかりは画像Kしかないのでそこからランダム・ノイズ画像を作成して

X = K - Z(ランダムノイズZ)

を求めると答えになる。


ランダムノイズはNLMeanフィルタやBilateralフィルタでノイズ除去でZを消す手法が一般的だけど

もう少し画素単位でランダムノイズを除去する手法がないか模索してみる。


バックナンバー
 CMOSイメージセンサーのノイズ除去テクニック

2015年3月25日水曜日

[C++]署名の追加方法

C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin sn -i hello.snk world.dll

[C#][.NET]Listboxで奇数行に背景色をつける

ListBoxの奇数行の背景色を変える

ListBox.DrawModeプロパティを OwnerDrawFixedにする。

ListBox.DrawItemイベントに以下を追加する。


        private void listBox1_DrawItem(object sender, DrawItemEventArgs e)
        {
            var idx = e.Index;                                                      //描画対象の行
            if (idx == -1) return;                                                  //範囲外なら何もしない
            var sts = e.State;                                                      //セルの状態
            var fnt = e.Font;                                                       //フォント
            var _bnd = e.Bounds;                                                    //描画範囲(オリジナル)
            var bnd = new RectangleF(_bnd.X, _bnd.Y, _bnd.Width, _bnd.Height);      //描画範囲(描画用)
            var txt = (string)listBox1.Items[idx];                                  //リストボックス内の文字
            var bsh = new SolidBrush(listBox1.ForeColor);                           //文字色
            var sel = (DrawItemState.Selected == (sts & DrawItemState.Selected));   //選択行か
            var odd = (1 == idx % 2);                                               //奇数行か
            var bak = Brushes.Gold;                                                 //奇数行の背景色

            e.DrawBackground();                                                     //背景描画

            //奇数項目の背景色を変える(選択行は除く)
            if (odd && !sel)
            {
                e.Graphics.FillRectangle(bak, bnd);
            }

            //文字を描画
            e.Graphics.DrawString(txt, fnt, bsh, bnd);
        }



2015年3月24日火曜日

C#でVLCを操作する

1.準備1
VisualStudioで新規プロジェクトを作成してからnugetでVLCと検索すると、WPF版,WinForm版の2種類出てくるのでどちらかを選択する。

2.準備2
VisualStudioのツールボックスを右クリック「.NET Frameworkコンポーネント」タブを選択して、
参照からPackages内にある「Vlc.DotNet.Forms」を選択する。
すると、「VlcControl」が追加される。

3.準備3
Formに「VlcControl」を張り付けて
イベント :VlcLibDirectoryNeededを追加する。

イベント処理の中身は
        private void vlcControl1_VlcLibDirectoryNeeded(object sender, VlcLibDirectoryNeededEventArgs e)
        {
            e.VlcLibDirectory = new System.IO.DirectoryInfo(@"C:\Program Files (x86)\VideoLAN\VLC");
        }


こうしておく。

4.使ってみる
再生ボタンを追加して、

URLの場合は、
vlcControl1.Play(new Uri("http://download.blender.org/peach/bigbuckbunny_movies/big_buck_bunny_480p_surround-fix.avi"));

ローカルディレクトリの場合は
myVlcControl.Play(new FileInfo(@"..\..\..\Vlc.DotNet\Samples\Videos\BBB trailer.mov"));

などを指定して実行すると動作する。



参考URL
http://milk-tea.myvnc.com/blog/adiary.cgi/0156
https://github.com/ZeBobo5/Vlc.DotNet/tree/master/src/Samples

Windows8 speed-up高速化

windows8高速化するにはいたってシンプル。
以下の2つを有効にする必要があります。
(これはWindows8の仕様で、両方が有効になっていると高速スタートアップが有効になるので、無効にしてしまっていたら有効にしましょう。)


・ハイバネーションを有効にする
・ページファイルを有効にする

コマンドラインで電源プランを変更する


powercfg.exe というEXEを利用すると実現できる。


<例>
AC電源、バッテリー時両方ずっとつけっぱで最大性能にする設定

powercfg.exe /X /monitor-timeout-ac 0
powercfg.exe /X /disk-timeout-ac 0
powercfg.exe /X /standby-timeout-ac 0
powercfg.exe /X /hibernate-timeout-ac 0
powercfg.exe /X /hibernate-timeout-ac 0
powercfg.exe /X /processor-throttle-ac NONE

powercfg.exe /X /monitor-timeout-dc 0
powercfg.exe /X /disk-timeout-dc 0
powercfg.exe /X /standby-timeout-dc 0
powercfg.exe /X /hibernate-timeout-dc 0
powercfg.exe /X /hibernate-timeout-dc 0
powercfg.exe /X /processor-throttle-dc NONE






参考URL
http://www.atmarkit.co.jp/fwin2k/win2ktips/1013powercfg/powercfg.html

[C#][.NET]プログラムの二重起動しないようにする Prevent multiple instances of a given app

[STAThread]
static void Main() 
{
   using(Mutex mutex = new Mutex(false, "Global\\" + appGuid))
   {
      if(!mutex.WaitOne(0, false))
      {
         MessageBox.Show("Instance already running");
         return;
      }

      Application.Run(new Form1());
   }
}

private static string appGuid = "c0a76b5a-12ab-45c5-b9d9-d693faa6e7b9";




参考URL
 http://stackoverflow.com/questions/93989/prevent-multiple-instances-of-a-given-app-in-net

raspberry piでフリーズしたら自動で再起動する

調べたらウォッチドッグタイマー(WDT)の機能搭載してるようなので有効にしてみた。

#2016.06.17 jessieのsystemd用の設定を追記


$ sudo apt-get install watchdog
$ sudo update-rc.d watchdog enable
$ echo "bcm2708_wdog" | sudo tee -a /etc/modules
$ sudo modprobe bcm2708_wdog


$ sudo /etc/watchdog.conf
以下の行のコメントを外します。
 #watchdog-device = /dev/watchdog

$ sudo vim /etc/defaults/watchdog
noneをbcm2708_wdogに変更します。
watchdog_module="bcm2708_wdog"

$ sudo /etc/init.d/watchdog start

systemd(jessie)の場合は、

$ sudo vim /lib/systemd/system/watchdog.service
---
[Install]
WantedBy=multi-user.target
---
sudo systemctl enable watchdog.service

動作確認は
$ :(){ :|:& };:
これで行ってリブートすればOK。
再起動後、ちゃんとWDTがあるか確認。

cat /proc/modules | grep 2708

>bcm2708_wdog 3894 1 - Live 0xbf07e000

$  ps -lax | grep watchdog
>5     0  3312     1  -2   -   1816  1724 hrtime SLs  ?          0:00 /usr/sbin/watchdog

こんなメッセージが表示していればちゃんと有効になっている。

systemd(jessie)の場合は、

$ sudo systemctl status watchdog.service

サービスが起動しているかチェックする。

参考URL
http://www.bayerschmidt.com/raspberry-pi/89-auto-reboot-a-hung-raspberry-pi-using-the-on-board-watchdog-timer.html
http://hanposaki.blog.so-net.ne.jp/2013-03-20

Jessie版
https://www.raspberrypi.org/forums/viewtopic.php?f=63&t=147935


2015年3月20日金曜日

CMOSイメージセンサーのノイズ除去テクニック



まず、カメラの設定条件から
・手ブレしないように固定台を使って固定すること。手ブレすると画像処理で補正は効かない。
逆にピンぼけはシャープネスフィルタで多少マシにできる。
・ レンズはしっかりマウントに取り付けて置く事。ずれてるとピンぼけの原因になる。
・動的被写体はCMOSの場合、画像が歪んでしまうので狙う被写体は静的なもの限定にする。



ここから本題。
 対策の目標として1つ例を挙げると、ノイズの種類を見極めてから1つ1つフィルタで対応していく事でSN比を高めていけるのでこれが結構うまくいく。

・ノイズの種類
  大きく分けると固定パターンノイズとランダムノイズの2つに分けれる。


固定パターンノイズ・・・特定の画素がずっと光っているノイズ。この原因は増幅器のバラツキなので温度特性でも変化してしまう完全に消せそうで消えないノイズ。消すのは比較的簡単。相関二重サンプリングといって
 撮影画像 - 真っ暗な状態 = ノイズが少ない画像
 
ランダムノイズ・・・暗電流。毎回異なる場所で発生するノイズ。もちろん固定パターンノイズをサンプリングする時にも発生する。時間軸に対してメディアンフィルタを書けることで対処できるが、すべて取り除けない。

 ノイズをうまく対処するにはノイズ評価式からデジタル的にノイズは何かを解くところから始まる。

A=ランダムノイズ
B=固定ノイズ
S=信号
Y=出力値
X=時系列ノイズ乱数


これらを式に表すと
  Y = AX + B + S

固定パターンノイズは固定パターンの画像をサンプリングして減算すればOK。
ランダムノイズは、 時系列乱数が加わっているので特定はできないが、乱数の特性を知ることで
対応できる。ちなみに光量によって乱数も変化する事を利用して、全体画素の明るさとノイズ値のグラフを最小二乗法で検量線を作成する。
作り方は真っ暗な画像を100枚、白い紙を写した画像を100枚とって、各画素毎に検量線を作成すればよい。

これらをまとめると 固定パターンノイズだけを取るなら引き算1つで済むけど、
固定パターン+ランダムノイズを除去するには各画素毎に検量線を作ってノイズ成分の値を算出して減算しなくてはならない。



参考URL
 http://cweb.canon.jp/camera/cmos/technology-j/noise_reduction.html

ffmpegをビルドする for windows


以下のファイルをダウンロードしてインストールしてPathを通しておく。


できたら、VisualStudioのコマンドプロンプトを開き、

cd \MinGW\MSYS\1.0\msys.bat 

を実行して、ffmpegファイルのある場所にディレクトリ移動して

cd \dev\ffmpeg

下記コマンドを実行する。


./configure --toolchain=msvc
make
make install

参照リンク
https://www.ffmpeg.org/platform.html#Windows

boostのビルド方法

 booststrap.batを実行してから
 b2 toolset=msvc threading=multi variant=debug,release link=static runtime-link=static address-model=32 --stagedir=stage/x86 -j 8 
 b2 toolset=msvc threading=multi variant=debug,release link=shared runtime-link=shared address-model=32 --stagedir=stage/x86 -j 8 
 b2 toolset=msvc threading=multi variant=debug,release link=static runtime-link=static address-model=64 --stagedir=stage/x64 -j 8 
 b2 toolset=msvc threading=multi variant=debug,release link=shared runtime-link=shared address-model=64 --stagedir=stage/x64 -j 8 

2015年3月17日火曜日

RaspberryPiでMiracast(Piracast)する


windows側(8.1以上)

PowerShell上で

dxdiagで診断ツールを起動

WDDM1.3以上のディスプレイドライバ、NDIS6.3以上の無線LANドライバであることを確認。
get-netadapter | select name,ndisversion











対応していなかったら多分使えない可能性があります。


RapberryPi側設定



git clone https://github.com/codemonkeyricky/piracast.git

ドライバインストール
1. uname -r //gives ur rp version number 
2. Based on the rp version number choose ur 8188eu tar file from http://www.raspberrypi.org/forums/viewtopic.php?p=462982#p462982
3. wget https://dl.dropboxusercontent.com/u/80256631/8188eu-201xyyzz.tar.gz
4. tar -zxvf 8188eu-201*.tar.gz
5. sudo cp rtl8188eufw.bin /lib/firmware/rtlwifi //not needed anymore if your operating system is above 3.10.33+
6. sudo install -p -m 644 8188eu.ko /lib/modules/`uname -r`/kernel/drivers/net/wireless
7. sudo insmod /lib/modules/3.10.33+/kernel/drivers/net/wireless/8188eu.ko
8. sudo depmod -a
9. sudo reboot
 
DHCPサーバーインストール 
1. sudo apt-get install isc-dhcp-server
2. sudo cp env/isc-dhcp-server /etc/default
3. sudo cp env/dhcpd.conf /etc/dhcp/
4. sudo cp env/interfaces /etc/network/interfaces
 
コンパイル
1. cd target
2. make core
 
 
再起動してからPiracastを起動
1. cd scripts
2. sudo nice -n -20 ./core &
3. sudo python piracast.py
   
  

お疲れ様でした。

2015年3月15日日曜日

【3/29まで】Fire HD7が4,000円OFF。30日間全額返金キャンペーンも同時開催中

7インチWifiモデルで安く、Amazonクラウドで画像が無制限に保存できるサービスついて12980円。安いと思います、機能については以下のとおりです。
  • 1280x800の高精細ディスプレイ、高速プロセッサーや両面カメラを備え、お手頃価格ながらパワフルだから初めてのタブレットにぴったり
  • Fireシリーズで撮影した写真は無料・容量無制限でクラウドに保存できるから、好きなだけ写真を楽しめる
  • 通常のスマホよりも大きめのディスプレイでウェブもコンテンツも快適
  • 起動が早く持ち運びに便利なサイズでパソコンより気軽-リビングでも通勤中でも
  • 豊富なコンテンツに簡単アクセス―本やコミックはもちろん、音楽、映画、ゲームやアプリなど豊富なコンテンツを楽しめる
  • 高精細カラーディスプレイ搭載で、コミックや雑誌などにも最適
  • お子様にもぴったり―コンパクトだからお子様でも使いやすく、人気のゲームだけでなく絵本やアニメから知育アプリまで楽しみながら学べる
  • 便利な24時間カスタマーサポートで初めての方にも安心 
ASP(アフィリエイト・サービス・プロバイダー)。いわゆる広告主のサイトです。
ユーザーが自分の作ったサイトに来て、広告をクリックして購入⇢入金した段階で報酬がもらえるところがメインです。



参考サイト

おすすめアフィリエイト用WordPressプラグイン





参考サイト

SSHでXWindowを使ってGUIを表示する

SSHからGUIウィンドウが開けるのがちょっとおもしろく感じたのでやり方をまとめてみました。


1.xmingインストール
putty起動
 localhost:0を入力する。

ターミナル上でXwindowを使うアプリを起動してみる。
例:
 lxterminal
 pcmanfm
 lxtask
 midori
lxsession

参考サイト
http://helloraspberrypi.blogspot.jp/2013/11/run-putty-xming-in-windows-to-login.html

プログラマ的視点でアフィリエトサイトのHello World

今回のテーマはアフィリエイトです。
アフィリエイトとは、商品の紹介記事をブログ・サイトで公開する事を指します。

プログラマなら一度は自分のサイトを持ちたいと思って作った人は多いのではないでしょうか。
そしてある時ふと思うのです。 終電が定時 なんだと。
身のある生活をするには、社会生活においてお金が必要になってきます。
仕事するのはお金の為。でも終電は定時、つらい、というフラストレーションが高まり最終的にはあきらめてしまう。こういった思考に陥て今のポジションにいてだらだらしてしまうのがオチです。
その次に思うことが別の方法で収入を得る方法はないだろうか、と転職や別業種を探したり副業を始めてみようと考えた人向けの記事を今回書きたいと思います。


アフィリエイトのサイトって?
 記事閲覧者に「商品を買った将来の夢」をみせて商品サイトから購入していただくサイトのことです。アフィリエイターは通販番組の商品説明している人や、夢を与えるテーマパークの従業員・運営者になった気持ちで始めるとビュアーにとって良いコンテンツを提供することができるようになります。


アフィリエイトのデザインパターン




 プログラマならデザインパターンという言葉は一度は聞いた事あると思います。もしくは実施されてる方もいるんじゃないでしょうか。 私はプログラムの1つの表現方法として用語をいつも利用しています。今回もそのやり方で紹介したいと思います。
 以下にアフィリエイトのサイトをHello worldを書くためのデザインパターンを書いてみました。

基本3大要素

 Factoryパターン(ブログ・サイトの立ち上げ)
  ↓
 ビジターパターン(SEO対策で検索結果にひっかかるキーワードの設定)
  ↓
 ストラテジーパターン(アフィリンクへ誘導する為の説明文の記載)

 <説明>
 Factoryパターン
  インスタンス生成ですよね。Factoryクラスは運営サイトのことを意味していて、ブログを作れるならどのクラスを使ってもいいんです。これがStep1になります。

 ビジターパターン
   人が訪れる手段の確保です。主にSEO対策と言われている部分です。
 ロボット検索エンジンがキーワードを拾ってきて暗黙的に検索結果に出てくるのでやらなくても良いですが、 明示的にやっておいた方が訪れる人が増えます。

 ストラテジーパターン
   いわゆる戦略です。1つの記事にあたる部分ですね。
単刀直入に書くと、紹介してる商品をリンクから購入すると収入になります。

過程をユーザ視点にすると

 ポータルサイトからキーワード検索
   ↓
 該当記事にアクセス
   ↓
アフィリンク先へ
   ↓
購入(入金確定)
   ↓
アフィ収入

になるわけなので、記事を書くにあたって自身のサイトを見てもらって購買意欲を掻き立てる戦略が必要になるということです。



さて、サイト・ブログの立ち上げ方からコンテンツの作り方まで説明し終えた所で、ここからHelloWorldをやりたいと思います。


Step1.サイトを作る
 アフィリエイトOKな無料ブログでも何でもいいです。
アフィリエイトできるサイトを手に入れてください。
将来的には有料レンタルサーバーを利用してWordPressなど使ってカスタマイズしたオリジナルサイトで運営する計画でいきましょう。
なぜならば、無料サイトは急なサービス終了やデータ紛失などで作ってきたコンテンツを失われる可能性があるからです。

無料でアフィリエイトOKなブログ達。

Blogger
http://blogger.com/

FC2
http://fc2.com/

Seesaa
http://blog.seesaa.jp/


Step2.アフィ広告サイトを登録する
 様々な広告形態があるので、自分にあったジャンルを選んで登録しましょう。

 楽天アフィリエイト
  http://affiliate.rakuten.co.jp/

 AffiliateB
  http://www.affiliate-b.com/web/sample/

 A8.net
  http://www.a8.net/


Step3.記事を書く
 書く内容は何でもいいです。十人十色。
アイデアの1つとして、あなたがほしい時どういうキーワードで検索するか、です。
例えば、ほしい商品のブランド、使い方や見た目、値段、機能、コスパ、口コミ、、、、などなど書くテーマは豊富にありますよね。
成功の秘訣は、自分がほしいと思う情報をテーマに記事にするよう心がける事です。


はい、これで完成しました。
今日からあなたもアフィリエイターです。


作り方が分かったら次のステップへ。
記事の書き方でSEO対策になります。

簡単に説明すると、サイトの説明、ページの説明、画像の説明をきめ細かく書くことです。
タグで言うとMetaタグのdescriptionなどにあたります。

これを書いておくと何がいいかというと、検索ロボットがキーワードを拾ってくれるので、検索エンジンのサービスであるページ検索結果、画像検索結果、動画検索結果、に引っかかるようになるので集客効果が得られます。
SEOについては下記サイトで紹介されてますので一読するのも良いかと思います。
http://bazubu.com/seo-50tips-10103.html

2015年3月12日木曜日

Pageantでログインする。

Pageantでログインする

SSHでRaspberryPiにログインする時、おおよそTeratermかPuttyを使ってログインしてると思います。
SSHでログインしてパスワード入力する手間を省きたい、もしくはセキュリティを高めたいという時にRSAなどで鍵交換でセキュアにログインする手段があります。


やり方をまとめると、
1.Puttyをインストール
2.Puttygen.exeで鍵を作る。
 秘密鍵はローカルのどこかに保存
 公開鍵はRaspberryPiのホームディレクトリ配下.ssh/authorized_keysにコピーして

chown pi:pi authhorized_keys
chmod 600 authhorized_keys

3.pageant.exeを起動して秘密鍵をAddする。

4.Pageantを使ってSSHログインする。

これで自動的にログインします。
ただし、再起動するとPageantに登録した鍵は忘れてしまいます。



参考サイト
https://tool-lab.com/2013/11/raspi-key-authentication-over-ssh/
https://dvpizone.wordpress.com/2014/03/02/how-to-connect-to-your-raspberry-pi-using-ssh-key-pairs/
http://qapla.blog52.fc2.com/blog-category-10.html
https://blog.ymyzk.com/tag/raspberry-pi/
http://sourceforge.jp/magazine/09/10/14/0753240

Raspberry Pi Pin assign ピンアサイン一覧表




Raspberry Piのピンアサインをまとめた。

初期型は左側で RPi B+、2は 右側です。

2015年3月11日水曜日

RaspberryPiでハードウェア支援対応VLCを使う VLC with hardware acceleration on Raspberry Pi

2013年あたりの話だが、VLCがでRaspberryPiのハードウェア支援対応となっていたらしい。
ででビルドしないといけないようなので、ビルドした手順を残しておく。


$ sudo apt-get install liba52-0.7.4-dev libdirac-dev libdvdread-dev libkate-dev libass-dev libbluray-dev libcddb2-dev libdca-dev libfaad-dev libflac-dev libmad0-dev libmodplug-dev libmpcdec-dev libmpeg2-4-dev libogg-dev libopencv-dev libpostproc-dev libshout3-dev libspeex-dev libspeexdsp-dev libssh2-1-dev liblua5.1-0-dev libopus-dev libschroedinger-dev libsmbclient-dev libtwolame-dev libx264-dev libxcb-composite0-dev libxcb-randr0-dev libxcb-xv0-dev libzvbi-dev libxcb-keysyms1-dev libsdl-image1.2-dev librsvg2-dev libsamplerate0-dev libudev-dev libmtp-dev libupnp6-dev libnotify-dev libdvbpsi-dev libgme-dev libebml-dev libgnomevfs2-dev libsidplay2-dev libva-dev libjack-jackd2-dev libchromaprint-dev libxpm-dev libncurses5-dev libsidplay1-dev libtar-dev

$ git clone git://git.videolan.org/vlc.git
$ cd vlc
$ export ACLOCAL_ARGS="-I /usr/share/aclocal"
$ ./bootstrap

Now do configure and build:
# ./configure --enable-rpi-omxil --enable-dvbpsi --enable-x264
# make clean all
Now go and watch TV, go to bed, whatever: That'll take some six hours now.
As last step, start the installation:
# sudo make install
$ sudo ln -s /usr/local/lib/libvlc* /usr/lib/
$ sudo ln -s /usr/local/lib/libx264.a /usr/lib/
$ sudo ln -s /usr/local/lib/vlc /usr/lib/vlc

VLC入れ替えする時

$ vlc --reset-config –reset-plugins-cache

動画再生する時、

$ vlc --vout omxil_vout test.mp4


これでMpeg2⇢Mpeg4にトランスコードするとき、TSファイルがドロップしてるとエンコードエラーになるので、VLCを使ってTSファイルのエラー修正を行う。


まずはffmpegを使ってエラーがあるのを確認。

ffmpeg -i test.ts tmp.ts

cvlc test.ts :sout="#standard{mux=ts,dst=/media/TS1/Videos/EOWfixed.ts,access=file}" vlc://quit

もしくは

vlc.exe -I dummy "ソースファイル" --sout-all --sout-ts-es-id-pid --sout=#std{access=file,mux=ts,dst="出力ファイル"} vlc://quit



参考URL
http://intensecode.blogspot.jp/2013/10/tutorial-vlc-with-hardware-acceleration.html
http://www.oblivion-software.de/index.php?id=56&type=98
http://zion009.blog98.fc2.com/blog-entry-50.html
http://hoge7743.hatenablog.com/entry/2014/12/20/230511

LinuxでFutaba RSC-U485を使う

普通に接続して「lsusb」すると、

””
Bus 001 Device 002: ID 0424:9514 Standard Microsystems Corp.
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 003: ID 0424:ec00 Standard Microsystems Corp.
Bus 001 Device 008: ID 1115:0008
""

デバイス名が表示されない。

dmesgで見ると

[ 3598.054846] usb 1-1.4: USB disconnect, device number 7
[ 3598.803627] usb 1-1.4: new full-speed USB device number 8 using dwc_otg
[ 3598.928050] usb 1-1.4: New USB device found, idVendor=1115, idProduct=0008
[ 3598.928076] usb 1-1.4: New USB device strings: Mfr=1, Product=2, SerialNumber=0
[ 3598.928094] usb 1-1.4: Product: USB <-> Serial Cable
[ 3598.928112] usb 1-1.4: Manufacturer: Futaba

デバイス名など全部あるのになんでだろ。


lsusbでデバイス名が認識されないと不安なので、文字を表示するようにする。

vim /var/lib/usbutils/usb.ids

[ 3598.054846] usb 1-1.4: USB disconnect, device number 7
[ 3598.803627] usb 1-1.4: new full-speed USB device number 8 using dwc_otg
[ 3598.928050] usb 1-1.4: New USB device found, idVendor=1115, idProduct=0008
[ 3598.928076] usb 1-1.4: New USB device strings: Mfr=1, Product=2, SerialNumber=0
[ 3598.928094] usb 1-1.4: Product: USB <-> Serial Cable
[ 3598.928112] usb 1-1.4: Manufacturer: Futaba

-----12495行目付近
...
1112  YM ELECTRIC CO., Ltd
1113  Medion AG
        a0a2  Active Sync device
1115  Futaba
        0008  RSC-U485
111e  VSO Electric Co., Ltd
...
-----

RSC-U485と記述した部分に「USB <-> Serial Cable」と入力するとlsusbでエラーが出るので問題は記号<> にあるぽい。


書き換えてもう一度lsusbしてみる

$ lsusb
Bus 001 Device 002: ID 0424:9514 Standard Microsystems Corp.
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 003: ID 0424:ec00 Standard Microsystems Corp.
Bus 001 Device 008: ID 1115:0008 Futaba RSC-U485
Bus 001 Device 005: ID 0781:5571 SanDisk Corp.


表示されるようになった




2015年3月9日月曜日

Nancy+jquery+pjax on Raspberry pi をやってみる

以前書いた内容だと、
Nanck+SignalR+OWINでやると書いたが後々考えてみるとC#に依存しすぎるとPhoneGapに移植しずらくなる問題点があったのでライブラリ依存をなるべくjquery側にしようという判断をしました。

ということで、
・View画面に関する部分はHTMLやJqueryに依存
・Model・Controller部分はC#に依存

という構図にします。
すると、ハード周りの制御はすべてC#で記述して、外部にはRestAPIを公開して
画面周りはWinform、GTK、Android、iOS何でもどうぞという状態にしておけばクロスプラットフォーム化が進む。

画面はRestAPIを使ってハードを動かすのだけど、
画面と制御は非同期処理になるので状態を監視しなくてはならない問題がある。
そこで次世代ajaxの出番、pjaxを使う。
pjaxについて簡単に説明すると非同期通信するajaxに画面遷移が行えるようにしたjqueryのプラグインです。

画面と制御は非同時で、その間の制御も非同期でpjaxを使う構図。
これができるなら発展途上の技術signalrやowinは不要になって今まで通りの作り方でカバーできるので悪くないんじゃないかなと思ってます。


参考URL

http://www.jhovgaard.com/nancy-pjax/

2015年3月7日土曜日

objectーjsonの相互変換 convert Json To object, object To Json

コピペして実装するだけOK。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Json;
using System.IO;
using System.Globalization;
using System.Xml;

//System.Runtime.Serialization参照追加
namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            var model0 = new TicketModel()
            {
                From = "Tokyo",
                To = "Sinjuku",
                ID = 1,
                IsUse = true,
                IsExit = false,
            };

            var json = JSonConvert.ToJSon(model0);
            var model1 = JSonConvert.ToModel(json);
            Console.WriteLine(json);
            Console.WriteLine(model0.GetDateTime().ToString());
            Console.WriteLine(model1.GetDateTime().ToString());
            Console.ReadLine();
        }

    }

    public static class JSonConvert
    {
        public static T ToModel(string jsonString)
        {
            var serializer = new DataContractJsonSerializer(typeof(T));
            var jsonBytes = Encoding.UTF8.GetBytes(jsonString);
            using (var ms = new MemoryStream(jsonBytes))
            {
                return (T)serializer.ReadObject(ms);
            }
        }

        public static string ToJSon(T model)
        {
            var serializer = new DataContractJsonSerializer(typeof(T));
            using (var ms = new MemoryStream())
            {
                serializer.WriteObject(ms, model);
                return Encoding.UTF8.GetString(ms.ToArray());
            }
        }
    }

    public static class DateConvert
    {
        private static readonly string UtcDateFormat = "s";
        private static readonly string UtcDateFooter = "Z";

        public static DateTime ToDate(string utc)
        {
            return DateTime.Parse(utc);
        }

        public static string ToString(DateTime date)
        {
            return string.Concat(DateTime.UtcNow.ToString(UtcDateFormat), UtcDateFooter);
        }
    }


    [DataContract]
    public class TicketModel
    {
        [DataMember]
        public int ID { get; set; }

        [DataMember]
        public string From { get; set; }

        [DataMember]
        public string To { get; set; }

        [DataMember]
        public string CreateDate { get; set; }

        [DataMember]
        public bool IsUse { get; set; }

        [DataMember]
        public bool IsExit { get; set; }

        public TicketModel()
        {
            this.CreateDate = DateConvert.ToString(DateTime.Now);
        }

        public DateTime GetDateTime()
        {
            return DateConvert.ToDate(this.CreateDate);
        }
    }

}

2015年3月5日木曜日

Compiling C#/MSIL to Native Code using LLVM  C#プログラムをネイティブ化する。

LLVMでコンパイルするようです。

 https://csnative.codeplex.com/

Windows環境でmemcachedをコンパイルする

ここに来る人はいろんな都合でWindowsPCでウェブサーバを立てて
速度問題などが浮上してから高速化できるmemcachedというものを見つけたんだけど
公式はソースのみしか公開してない!
しかも海外でコンパイル済みの見つけたけどもバージョンが古くて
できれば早いのが欲しいって思って来たんだと思う。

と言うわけでやり方。

http://groups.google.com/group/memcached/browse_thread/thread/8c7eea241def70f9
http://cefiro.homelinux.org/resources/doc/MinGW/setting-02.html

まずソース(2011.12.07時点最新)
1.libevent-2.0.16-stable
2.memcached-1.4.10

コンパイルはMinGWで行う。

STEP.1 MSYSのパス設定
/etc/profileを開き

if [ $MSYSTEM == MINGW32 ]; then
export PATH=".:/usr/local/bin:/mingw/bin:/bin:$PATH"
else
export PATH=".:/usr/local/bin:/bin:/mingw/bin:$PATH"
fi
export PATH="$PATH:/usr/local/lib" <----これを追加。  

STEP.2 MSYSを起動。
<libeventコンパイル>
./configure --enable-static --disable-shared
make
make install

<mcachedコンパイル>
./configure
make

もしここで--with-libevent=/path/

的なエラーが出た場合は、
libeventのスタティックライブラリが作成失敗したか、
パスが通ってない場合があるので、
もしパスがあやしいなと思ったら
libeventでmake installを実行した時のログを見て
パスを指定しなおしてください。
それでもうまくいかないならmingwのlibやbinフォルダはパスが通ってるので、
/usr/local配下のファイルをそっくり





MSYSを起動して、
echo $PATHで
/usr/local/libのパスが通っているのを確認してからコンパイル作業に入る。


~番外編~
1.VC++ 2010のコマンドプロンプト上でコンパイルして、ライブラリファイルを作る。
nmake -f makefile.nmake

2.通信Socket回りなど移植作業が面倒なので、MinGWをインストール。
./configure
make
これでexeファイル完成。

pyinstallerを使う

http://www.pyinstaller.org/wiki/Python26Win

1.Zipファイルを解凍して、
python configure.py

を実行。


nginx + fastcgi経由でC/C++言語を動かす

nginxをサーバにする場合、CGIそのまま動かす事が出来ないので、
fcgi経由でロードさせて動かす事が出来るようだ。

1.インストール
apt-get install fcgiwrap libfcgi-dev

2.

lighttpdでfastcgi経由でC/C++言語を動かす。

1.インストール
$ apt-get install lighttpd
$ sudo lighty-enable-mod fastcgi

Awesomeを設定する。

1.設定ファイルを開く。
vim ~/.awesomerc

タグ名を変えるなら
tags
{
 tag one を tag 1等に変える
 ...
}

Qt for WinCE Windows上にQtCE開発環境を構築する。

configure -platform win32-msvc2008 -xplatform wince50standard-armv4i-msvc2008 -qt-gif -qt-libjpeg -qt-libpng -webkit -openssl -arch windowsce -opensource -iwmmxt

pythonのデバッガ環境を取り入れる

Pythonで開発していると、引数や変数が定義されていなくてもエラーが出ないので、
消し忘れなどで残ってしまったり結構あると思う。
pylintなど使ってチェック

debian squeezeから

udevd[803]: unable to receive ctrl connection: Function not implemented

RaspberryPiでPhoneGap(Cordova)の開発環境を構築する。


昔のRapberryPiだとCPUパワーが不足していて実用的ではなかったけど、
RaspberryPiになって2倍高速化から使えるんじゃないか?と思って構築してみた。

Step1. まずはnode.jsのインストール。

 
curl -L git.io/nodebrew | perl - setup


#2015.02.16時点最新
nodebrew install v0.12.0(ビルドすると1時間くらい)





nodebrew install-binary v0.11.14 (ビルド済みのを使う場合はこっち)

nodebrew use v0.12.0

これでnodejsのインストール完了。

ちなみにnodebrewというのはNodejsのバージョン管理ツールで
気軽にバージョンが切替できるしくみになっている。


Step2.Java jdkのインストール

#openjdkだとandriod studioが動いてくれないので、Oracle版を使うようにする。

sudo apt-get oracle-java7-jdk
sudo update-alternatives --config java
sudo update-alternatives --config javac

Step3.AndroidStudioとAndroid-sdkのインストール  Android-sdkのビルド

作業している途中でARMは自前ビルドが必要と分かったので、ビルドすることにする。

RaspberryPiデスクトップ上からAndroid Studioを実行してアップデートを開始する。(20分くらい)

~/.profile にパスを追加しておく
export ANDROID_HOME=/home/pi/share/android-sdk-linux/
export PATH=$ANDROID_HOME/platform_tools:$ANDROID_HOME/tools:$PATH

export PATH=/home/pi/bin:$PATH

設定したら再読み込みしとく。
source .profile


自前でAndroidSDKをビルドする場合、
sudo apt-get install git gnupg flex bison gperf build-essential zip curl  libncurses5-dev x11proto-core-dev libx11-dev libreadline6-dev libgl1-mesa-glx libgl1-mesa-dev python-markdown libxml2-utils xsltproc zlib1g-dev

mkdir ~/bin
PATH=~/bin:$PATH
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
chmod a+x ~/bin/repo
 
mkdir android
cd android
mkdir src
cd src
repo init -u https://android.googlesource.com/platform/manifest
repo sync
 
~ここまで40分くらい(syncがものすごい時間かかる。。)~ 
 
2     $ . build/envsetup.sh
3     $ lunch sdk-eng
4     $ make sdk 


build/core/envsetup.mk (@ line 76)
   ifneq (,$(findstring Power,$(UNAME)))
           HOST_ARCH := ppc
   endif
   
   ifneq (,$(findstring arm,$(UNAME)))
           HOST_ARCH := arm
   endif
   
   BUILD_ARCH := $(HOST_ARCH) 
 
build/core/main.mk (@ line 178)
   requires_openjdk := false
   ifeq ($(LEGACY_USE_JAVA6),)
   ifeq ($(HOST_OS), linux)
   ifneq ($(HOST_ARCH), arm)
   requires_openjdk := true
   endif
   endif
   endif 
 
build/core/combo/TARGET_linux-arm.mk (@ line 91)
   android_config_h := $(call select-android-config-h,target_linux-arm)  

   $ cd ~/android/src/external/expat
   $ mm
    . .
   $ cd ~/android/src/external/libpng
   $ mm
    . .
   $ cd ~/android/src/system/core/liblog
   $ mm
    . .
   $ cd ~/android/src/system/core/libutils
   $ mm
    . .
   $ cd ~/android/src/system/core/libcutils
   $ mm
    . . 
 
   $ cd ~/android/src/build/libs/host
   $ mm
   $ cd ~/android/src/build/tools/acp
   $ mm 
 
   $ cd ~/android/src/external/zlib
   $ vi Android.mk
   $ mm
    
   $ cd ~/android/src/system/core/libziparchive
   $ vi Android.mk
   $ mm 
 
   $ cd ~/android/src/frameworks/base/libs/androidfw
   $ mm
    . . 
 
   $ cd ~/android/src/prebuilts/misc/linux-arm/bison
   $ ln -s /usr/bin/bison . 
 
 
   $ cd ~/android/src/frameworks/base/tools/aapt
   $ mm
    . .
   $ cd ~/android/src/frameworks/base/tools/aidl
   $ mm
    . .
   $ cd ~/android/src/build/tools/zipalign
   $ mm 
 
      

Step4. Phonegap(Cordova) Helloworldをやってみる。

Step3のインストール最中にhello world を作ってみる。
npm install cordova -g

cordova create hello com.example.hello HelloWorld
cd hello
cordova 

cordova serve

参考:
 http://cordova.apache.org/docs/en/4.0.0/guide_cli_index.md.html
  http://www.timelesssky.com/blog/building-android-sdk-build-tools-aapt-for-debian-arm


SignalR の Hello world

OWIN (Open Web Interface for .NET) Hello world
の続き。


SignalRとは何か?
 WEB画面上のユーザー操作をリアルタイムにサーバーへ通知する技術です。
これが使えると、リアルタイム制御が可能になります。
しかしこれはWEB画面⇢サーバーのリアルタイム通知であって、サーバー⇢WEB画面のリアルタイム更新はknockoutなどのフレームワークを用いる必要があります。



Step1.パッケージマネージャーSignalRをインストールする。


PM> Install-Package Microsoft.AspNet.SignalR
PM> Install-Package Microsoft.AspNet.SignalR.SelfHost
PM> Install-Package Microsoft.AspNet.SignalR.Client
PM> Install-Package Microsoft.Owin.Cors




インストールが完了すると、readme.txtが開いて、ソリューションエクスプローラーにはScriptsフォルダが追加され、中にはjQueryファイルが入る。










https://www.nuget.org/packages/Microsoft.AspNet.SignalR/2.1.2

2015年3月3日火曜日

raspberry piでUSB2Dynamixelをつなぐ


Raspberry PiでFTDIデバイスドライバをインストールするの続き


USBデバイスを接続した状態でデフォルトのドライバを削除しておく。
(直接soを読めば大丈夫だと思うが、念のため)

$ lsmod

ftdi_sio               30412  0
usbserial              22397  1 ftdi_sio

$ sudo rmmod ftdi_sio
$ sudo rmmod usbserial


ドライバを削除してもUSBを抜き差しすると毎回元に戻ります。



参考URL
http://www.elefine.jp/super4/super4RaspberryPi.html

2015年3月2日月曜日

Nancy入門 install~Hello Worldまで

1.拡張機能のインストール
[ツール]⇢[拡張機能と更新プログラム]で[Nancy]をインストールしてVisualStudioを再起動する。


2.環境設定
管理者権限で起動したDosプロンプトで下記コマンドを実行。
  netsh http add urlacl url=http://+:3579/ user=ユーザー名

3.プロジェクト作成
 プロジェクト作成⇢C#⇢Web⇢Nancy SelfHosting を選択。

最初エラーがでるが、プロジェクトを保存してビルド&実行すると
初回のみNugetがNancyをダウンロード、その後実行開始する。


4.動作確認
 ブラウザでhttp://localhost:3579/ にアクセスする。

Nancy画像が表示されれば成功。


~~~~~~ここからNancyフレームワークを読み解く~~~~~~

ソリューションエクスプローラーのフォルダ構成

・NancyApplication1
⇢Content       メディアファイル
 nancy-logo.png
⇢Views         テンプレート(Html)
 index.sshtml
Bootstrapper.cs    よくわかってない https://github.com/NancyFx/Nancy/wiki/Bootstrapper
IndexModule.cs    ルーター機能搭載したコントローラー部
Programs.cs      セルフサーバーを起動するメイン関数


個々の説明

Content/Views
 コンテンツとテンプレート部分は、様々なテンプレートエンジンが用意されてるのでそれを利用するか、HTML5なページをそのまま構築していくかは自由。

IndexModule.cs
 djangoでいうurls.py、views.pyを併せ持つ存在。

NancyModule
 ベースクラス内部がシングルトンになっているのかな。コンストラクタ内部でURLメソッドの定義を行っておくと、すべてがリンクする仕組み。つまり粒度を最小単位1ページ1クラスというような構成にしてもNancyModuleを継承さえすればrouter周りの事は初回コンストラクタ生成時に自動でやってくれる。

Programs.cs
 ここは特に弄る必要はなさそうだ。


ここまでをまとめると、WEBページがアクセスされたらPrograms.csで宣言したセルフサーバーが受けて、NancyModuleを継承してるクラスを総当りで検索して該当するURLのアクションを呼び出す。



その次、
該当するNancyModuleを継承したクラスが呼び出されたら何ができるかというのは
NancyModuleのメタデータの中身を見なくてはいけなくて、

        public AfterPipeline After { get; set; }
        public BeforePipeline Before { get; set; }
        public NancyContext Context { get; set; }
        public NancyModule.RouteBuilder Delete { get; }
        public NancyModule.RouteBuilder Get { get; }
        public IModelBinderLocator ModelBinderLocator { get; set; }
        public virtual ModelValidationResult ModelValidationResult { get; set; }
        public string ModulePath { get; }
        public Negotiator Negotiate { get; }
        public ErrorPipeline OnError { get; set; }
        public NancyModule.RouteBuilder Options { get; }
        public NancyModule.RouteBuilder Patch { get; }
        public NancyModule.RouteBuilder Post { get; }
        public NancyModule.RouteBuilder Put { get; }
        public virtual Request Request { get; set; }
        public IResponseFormatter Response { get; set; }
        public virtual IEnumerable Routes { get; }
        public ISession Session { get; }
        public IModelValidatorLocator ValidatorLocator { get; set; }
        public NancyModule.ViewRenderer View { get; }
        public dynamic ViewBag { get; }
        public IViewFactory ViewFactory { get; set; }
        public class RouteBuilder : IHideObjectMembers
        public class ViewRenderer : IHideObjectMembers

うーむ、沢山あって良くわからない。が、目星だけつけておくと

茶色がRequest :入力
赤字がURLメソッド :処理
青字がページデータ :出力

基本的な実装作法は見えた気がする。
該当URLのメソッドが呼び出され、引数はRequestで受け取ってビジネスロジックが動作した後Viewでテンプレート呼び出し。

まとめると、
・公式ページにNancyは超軽量フレームワークっていうのは本当ぽい。
・新規プロジェクトを作ったらセルフサーバーが出来上がる。
・Moduleは沢山あっても良い。
・新規ページを追加するときはルートを気にせずに新規クラスを作るだけの軽い感覚で。
・ページレイアウトは自分の使いやすいものが使える。
・初見でNancyはURLのルーティグしかやってないでしょってくらいな軽量具合。
・DBは自前で用意しないといけないのかって思うと気が重くなる。
・Djangoを知ってると管理ページもついてくるDjangoがいいって騒ぎたくなる。
・最後にC#でかけるから実行速度に期待できそうなのでよしとする。


2015年3月1日日曜日

Raspberry Pi + Nancy + OWIN + SignalR

YoutubeでレゴブロックとサーボーとDCモーターでピンポン球を飛ばす装置を作って公開してる人がいて、自分も同じ仕組みのをやりたいと思ったので仕様策定からはじめた。


・準備編
 作るにあたって、仕様・ゴールをざっくり考えてみた。

 セルフホスティングでRaspberry Piをサーバーにして、ブラウザ上で操作する仕組み。
 ブラウザ上で提供されるサービスは
  ・コントロールパネル   ・・・ 各装置での制御を行う
  ・ダッシュボード      ・・・ 各装置の監視を行う
  ・デバイスマネージャー ・・・ 各装置情報の閲覧、外部公開/非公開の制御を行う

PlantUML diagram

・コントロールパネルのイメージ
  「設定画面 スマホ」の画像検索結果  「設定画面 スマホ」の画像検索結果

  各ユニット(装置)があって選ぶと個々に設定が可能になる。


・ダッシュボードのイメージ

  

  各ユニット(装置)の状態を監視。(Private/Public向けで表示内容が変わる)

・デバイスマネージャーのイメージ

  「設定画面 スマホ」の画像検索結果

  管理者専用ページで外部公開、表示設定などを行う。


・作業手順

 Step1. Nancyの設定
  RaspberryPi上でNancyを使って目的のセルフホスティングが行えるかを確認する。

 Step2. モックアプリを作る
  Nancyで各画面遷移が行えて、それらしい振る舞いができることを目指す。
 
 Step3. 機能を実装する。
  気が向いた時にスクラッチ開発していけば良い。





参考: 
http://blog.mpseidel.com/building-dashboard-with-raspberry-pi/
https://www.youtube.com/watch?v=s_ZQtiupyzE
https://github.com/neutmute/RPi.Demo

Androider