2013/06/19

Arch LinuxにおけるNaClプログラム(C++)の開発環境構築とビルド

Arch Linux上で NaCl(Native Client)の開発環境を構築する際には、
基本的には簡単ですが、Pythonの複数環境の共存など落とし穴があります。
自分用のメモを兼ねて、手順を書いておきます。
(本記事は、2013/06/19 現在において最新状態のArch Linux 64bit版を基にしています。)


まずは、pacmanでmultilibリポジトリを扱うよう設定をします。
具体的には、 /etc/pacman.conf に、[multilib]というセクションがあるので、
そのコメントアウトを解除します。

$ sudo vi /etc/pacman.conf
~~~~
[multilib]
Include = /etc/pacman.d/mirrorlist
~~~~
$ sudo pacman -Syy

さらに、pacmanで、gcc-multilibをインストールします。
$ sudo pacman -Syu gcc-multilib

次に、Python環境について、python2がデフォルトとなるように対策をします。
(※ Arch Linuxには、Python2とPython3の環境が共存している場合がありますが、
今回を含めて殆どはPython2を使うので、PATHに追加することで変更しておきます。いつでも戻せます。)

$ mkdir ~/bin/
$ ln -s /usr/bin/python2 ~/bin/python
$ vi ~/.bashrc
PATH=export PATH=/home/xxxxxx/bin:$PATH
(xxxxxxは、自分のユーザ名。)

あとは、通常どおりにNaCl SDKをダウンロードしてアーカイブを展開します。
(参照: https://developers.google.com/native-client/sdk/download)
$ cd ~
$ wget http://storage.googleapis.com/nativeclient-mirror/nacl/nacl_sdk/nacl_sdk.zip
$ unzip nacl_sdk.zip
$ rm nacl_sdk.zip
$ cd nacl_sdk/

さらに、naclsdkでPepperAPIを取得して、設定を行います。
$ ./naclsdk update
$ ./naclsdk list
Bundles:
 I: installed
 *: update available

  I  sdk_tools (stable)
     vs_addin (dev)
     pepper_23 (post_stable)
     pepper_24 (post_stable)
     pepper_25 (post_stable)
     pepper_26 (post_stable)
  I  pepper_27 (stable)
     pepper_28 (beta)
     pepper_canary (canary)

All installed bundles are up-to-date.
$ vi ~/.bashrc
~~~~
export NACL_SDK_ROOT='/opt/nacl_sdk/pepper_27'
(pepper_27は、インストールされたPepperAPIのバージョンとする。)

最後に、サンプルがビルドでき、デーモンも実行できることを確認します。
$ cd pepper_27/examples/
$ make
~~~~
make[1]: ディレクトリ `/home/xxxxxx/nacl_sdk/pepper_27/examples/websocket' に入ります
  CXX newlib/Debug/websocket_x86_32.o
  LINK newlib/Debug/websocket_x86_32.nexe
  CXX newlib/Debug/websocket_x86_64.o
  LINK newlib/Debug/websocket_x86_64.nexe
  CXX _newlib/Debug/websocket_arm.o
  LINK newlib/Debug/websocket_arm.nexe
  CREATE_NMF newlib/Debug/websocket.nmf
make[1]: ディレクトリ `/opt/nacl_sdk/pepper_27/examples/websocket' から出ます
Done building targets.

$ python ../tools/httpd.py

Serving /opt/nacl_sdk/pepper_27/examples on http://localhost:5103/...
尚、ChromeやChromiumにおいて、Webストア以外のローカル上などのNative Clientを動作させるには、
chrome://flags" から、"ネイティブ クライアント"の項目を許可することが必要です。念のため。



2013/06/16

【組み込みOS自作入門】 1章&2章まで進んだ

"12ステップで作る組込みOS自作入門"という書籍で学びながら、組み込みOSを自作してみています。マイコンは、書籍のとおり H8/3069Fです。

組み込みOS自作本で勉強をはじめるという宣言のあと・・・
学業や、Webサービス開発のほうが忙しかったり、
Fedora→Arch Linuxに乗り換えたり、Raspberry PiやArduinoに手を出したり...としているうちに、めちゃくちゃ時間があいてしまいましたが(汗;)・・・

つい先日から少しずつ触りはじめ...今日やっと...まともに進めることができました。
ただいま勉強中のソースコードはGitHubで公開していますww
ソースコードをKL-01ライセンスにしてくださった本の筆者 kozosさん に感謝!
https://github.com/mugifly/study-my12os
コメントと、ちょっとしたメモも英語(Broken english(笑))で書きながら...。
(もう少し...まともな英語をかけるようになりたいものです><;)

さて...まずは、1章。


1章では、Linux上にセルフコンパイル環境とクロスコンパイル環境を構築して、
Hello, worldを表示する簡易的な”ブートローダ”や、ライブラリを作成しました。
文字を出力するための標準ライブラリを自作するというのも新鮮でした。
https://github.com/mugifly/study-my12os/tree/st1

ちなみに、クロスコンパイル環境ですが、Arch Linux (64bit)で問題なく構築できました。
https://github.com/mugifly/study-my12os/wiki/BuildEnvironment
  • binutils-2.23
  • gcc-4.8.1
PCとボードとの接続には、USBシリアル変換ケーブル "BSUSRC06"を使いました。

ボードへの書き込みは、h8write、kz_h8writeの両方で成功しています。
また、端末エミュレータには、Minicomを利用しています。

尚、ビルドと書き込みの手順は、
https://github.com/mugifly/study-my12os/wiki
にメモしておきました。

次に、2章(ブートローダの作成)です。


前章で作成したライブラリ(lib.c)におなじみの機能を追加していきます。

  • memset - メモリへのバイト書き込み
  • memcpy - メモリのコピー
  • memcmp - メモリの比較
  • strlen - 文字列の長さ取得
  • strcpy - 文字列のコピー
  • strcmp - 文字列の比較
  • strncmp - 文字列の比較 (長さ指定)

また、この章では、"SCI (シリアルコントローラ)"の話がでてきました。
要点だけ、メモしておきたいと思います。

  • H8/3069Fに搭載されたSCIは3つあり、すべてCPUに内蔵されている。
  • H8/3069Fのシリアルコネクタは、SCI1(0xffffb8)に接続されている。
    (即ち、SCI1を制御すれば、シリアル通信ができる。)
  • SCI1のレジスタマッピング: (H8/1069Fのマニュアル 13.1.4節に詳細記載)
    • SMR: 0xffffb8 - シリアルモードレジスタ
      (bitは以下の通り。今回は全bitが0となる。)
      • bit0,1 - クロックセレクト (0,0ならば、クロックそのまま)
      • bit3 -  ストップビット長 (0=1bit, 1=2bit)
      • bit4 - パリティの種類 (0=偶数, 1=奇数)
      • bit5 - パリティの有効 (0=無効, 1=有効)
      • bit6 - データ長 (0=8bit, 1=7bit)
      • bit7 - モード (0=調歩同期式, 1=クロック同期式)
    • BRR: 0xffffb9 - ビットレートレジスタ (ボーレート設定)
      あまり高速にするとうまくいかないので、9600bps。
    • SCR: 0xffffba - シリアルコントロールレジスタ (送受信の有効/無効)
      • bit0,1 - クロックイネーブル
      • bit4 - 受信イネーブル (1=送信)
      • bit5 - 送信イネーブル (1=送信)
      • bit6 - 受信割り込みイネーブル (1=割込可能)
      • bit7 - 送信割り込みイネーブル (1=割込可能)
    • TDR: 0xffffbb - トランスミットデータレジスタ (送信する1文字)
    • SSR: 0xffffbc - シリアルステータスレジスタ (送信完了/受信完了)
      • bit6 - 受信ステータス (1=受信完了)
      • bit7 - 送信ステータス (1=送信完了)
    • RDR: 0xffffbd - 受信した1文字を読み出す
  • SCI1を準備する際には・・・
    1. SCI1のSCRにすべて0を書き込むことで一旦無効化。
    2. SCI1のSMRへ通信設定を行う。
    3. 再びSCRを書き換えて有効にする。
  • SCI1で1文字送信する際には・・・
    • SCI1のSSRの送信ステータスが1であることを確認。
    • SCI1のTDRに送信したい1文字を書き込む。
    • SCI1のSSRの送信ステータスを0にする (送信依頼できる)
    • 送信完了すると・・・SCI1のSSRの送信ステータスが1になる。
  • serial.c
    • struct h8_3069f_sci として、SCIのレジスタを操作するための構造体を定義。
    • regs[] として、3つ全てのSCIのための構造体配列を生成。
  • lib.c
    • putc関数では、シリアル通信の仕様に基づいて、改行コードを '\n' → '\r'(0x0d)に変換する。これを"端末変換"という。
      端末変換された文字列は、SERIAL_DEFAULT_DEVICE(SCI1)宛に出力される。
    • 書籍では、端末変換をしない生の入出力を"シリアル"。端末変換をする入出力を"コンソール"という。
さらに、"スタートアップ"の説明もでてきました。
  • startup.s(アセンブリ)の _start からプログラム実行が開始される。
    ここではスタックポインタの設定が行われ、main関数にジャンプする。
    このような処理を"スタートアップ"という。(startup または crt(C RunTime) と呼ばれる。)
  • _startから実行が開始されるのは、CPUにより割り込みのおかげ。
  • H8は "ベクタ割込み方式"である。
    • 割込みハンドラを配置するアドレスを特定アドレス("割込みベクタ")に記述しておく方式。
    • H8の割込みベクタは、メモリ上の0x000000〜0x0000ffに、割込みの種類別に存在する。
    • 起動時(リセット時)には、"リセットベクタ"という割込みが発生する。
      H8では、割込みベクタの0番目がリセットベクタである。
      vector.cのvectors[]で、実際に割込みベクタを定義している。その0番目にstartを指定している。
    • 割込みが発生すると、CPUはこの割込みベクタを参照して、割込みハンドラの配置場所を知る。そして、割込みハンドラに処理がジャンプする。
  • "リンカスクリプト"(ld.scr)では、リンク時に関数や変数をどのアドレス上に配置するかを指定できる。
    ここで、vector.oが先頭に配置されるよう指定されている。
    即ち、vectors[]が0x000000〜0x0000ffに配置されることになる。
この章の追記はライブラリの機能追加くらいだったので、少なめでした。
こちらも無事動作しました。

次は3章です(^^)/♪ 続く...。なるべく早く続きに取り掛かりたい><

2013/05/29

Arduino Leonardoを買ってみた

Arduino Leonardoというボードを買ってみました。
ちなみに....Arduinoシリーズは、Arduino言語という開発言語でプログラムを組んで、簡単に入出力制御などが行える、一種のAVRマイコン(を手軽に扱えるボード)です。
本格的なマイコンボードとはまた一味違う楽しみ方ができます。
以前から欲しかったのですが、安かったのでつい!これで私もArduinoデビューですw
(Arduino自体がオープンプラットフォームのため、色んな会社から互換ボードや拡張ボードが発売されていたりします。)

今回購入したArduino Leonardoとその他モジュール類など...
Arduino Leonardoのパッケージを開封したところ。
実際にはかなり小さくて、ある意味かわいい感じですw
パッケージもかわいいデザインですね。
今回は、この Arduino Leonardo と、Bluetoothモジュール、
LEDやセンサーなども一緒に買いました。(ついでに追加のブレッドボードなんかも...w)

ところで。以前に購入した Raspberry Pi(名刺サイズのLinuxボード) は、
搭載されたGPIOポートを用いて、センサなどのモジュール類を接続できます。
しかし、そのポートはデジタル専用であり、アナログ制御は基本的にできません。
そこでArduinoを組み合わせると、アナログ制御も比較的容易に行えるようになります。

もちろん、Raspberry Pi単体や、Arduino単体だけでも色々と遊べるのですが、
そのような感じで、Raspberry PiとArduinoを組み合わせることで、
さらに楽しさが広がるわけです。

...ということで何かやってみたいと思います。
実はつい先日、Raspberry Pi (Model B)をもう一台購入したのですが、
その前に3G回線に接続できるようにしたあの一台は今、大学の研究室に置いてあったりします。そこにArduinoを組み合わせて...遊んでみたいと思いますww

それでは♪

2013/05/27

Fedora 17 → Fedora 18 にバージョンアップした (gnome3.6)

先日、fedup(fedup-cli)を使って、
メインPCを Fedora 17 → Fedora 18へバージョンアップしました。
(メインとして使っているOSなので...なかなか腰が上がらなくて(笑))

Fedora 18 with gnome 3.6.3.1
GUI環境は...結局、そのまま Gnome3 (バージョン: 3.6.3.1)を使っています。
バージョンアップに際して幾つか気になる点があったので、メモしておきます。

Google Chromeが動作しない:
既知の問題であり、再インストールが必要なようです。
$ sudo yum remove google-chrome-*
$ sudo yum install google-chrome-stable

Gnome shell extensionが無効になっている:
https://extensions.gnome.org/ にログインして、Installed extensionsから
Extensionを有効にしていきましょう。
また、幾つかのExtensionは使えなくなっているので・・・
代替のものを探すか、自分でハックしてパッチを送りましょう(w

Nautilusなどを最大化表示した際にタイトルバーが消えてしまう:
仕様です。
https://extensions.gnome.org/extension/515/ignore_request_hide_titlebar/

Nautilusのメニューバーがない:
トップバーにあるアプリケーションアイコンを右クリックすると代替のメニューが表示されます。
http://askubuntu.com/questions/224970/nautilus-missing-menubar-in-12-10
但し、Extension(例: TaskBar)をインストールして、これを非表示にすると...メニューが表示できなくなるので注意。

マウスカーソルがちらつく問題:
未解決

ウィンドウの最大化/最小化ボタンが無い:
そもそもGnome3からの仕様ですけど、拡張機能などから設定可能です。
http://ankyo.blog.so-net.ne.jp/2011-12-12

Nautilusの右クリックメニューから端末を開けるようにする:
$ sudo yum install nautilus-open-terminal
http://www.if-not-true-then-false.com/2011/nautilus-open-in-terminal-on-fedora-centos-red-hat-rhel/



今回適用した Gnome shell extension (拡張機能):
だいたい以前からそのまま or 代替です。
  • Activities Configurator
    Activities関連のカスタマイズができる。
  • Advanced Volume Mixer
    トップバーの音量アイコンを拡張できる。
  • Alternative Status Menu
    ユーザメニューにSuspend および Power-offを追加できる。
  • Battery remaining time and percentage 
    トップバーの電源表示を拡張できる。
  • Coverflow Alt-Tab
    Alt+Tabによるタスクスイッチャをカバーフロー風表示にできる。
  • CPU Freq
    トップバーにCPUのモードおよび動作クロックを表示できる。
  • Dash to Dock
    便利なドックバー(ランチャとタスクスイッチャ)。
  • ignore_request_hide_titlebar
    タイトルバーが非表示となる動作を抑制できる。
  • Impatience
    アニメーションを高速化できる。
  • Lock Keys
    トップバーにNum Lock および Caps Lockの状態を表示、通知できる。
  • Network Connections Shortcut
    トップバーのネットワークアイコンにネットワーク接続のショートカットを追加できる。
  • Removable Drive Menu
    トップバーにリムーバルドライブのアイコンを追加できる。
  • Remove Accessibility
    トップバーのアクセシビリティアイコンが不要な場合に非表示にできる。
  • SettingsCenter
    Gnome関連の少し細かい設定が行えるようになる。(ランチャー)
  • Status Area Horizontal Spacing
    トップバーの通知領域部分(画面右上のアイコン表示部)の幅を調整できる。
  • TaskBar
    トップバーにタスクバー的なウィンドウスイッチャを追加できる。
  • Touchpad Indicator
    トップバーにタッチパッド(トラックパッド)のインジケータを表示できる。
  • Window Slide In
    ウィンドウ切替時にスライドイン効果を適用。
  • WindowOverlay Icons
    Activities画面などにアプリケーションのアイコンをオーバレイ。


2013/04/28

Raspberry Pi + L-02A + ServersMan SIM (490円SIM) で3G接続

Raspberry Pi(ModelB, Raspbian)を3G回線に接続してみることにしました。

回線は、ServersMan SIM 3G 100 (月額490円SIM)を使います。

通信端末は、RPi界隈においては D02HWがよく使われるようですが、
今回は、docomoのFOMA-USBデータ通信カード L-02Aを使います。安く入手できたので。
(※ 尚、ServersMan SIMは、docomo FOMAのMVNO回線ですので、最近よく売っている Xi端末では利用できません。L-02AはFOMA端末です
【2013/08/08 追記】9月より、ServersMan SIMもXiのMVNO回線 (即ち、LTE)へ移行となるようです。Xi用のデータ通信カードが利用可能となります。)

Raspberry Pi (Model B) + L-02A
加えて今回は、Raspberry Pi上でnginxを起動させ、Webサーバにしてみます。
実用的なサーバを求めているわけではなく、あくまで遊びです(笑)
速度/レイテンシはともかく、動的グローバルIPアドレスが割り当てられるので、一応サーバにも使えます。
(※ DTIはそのような利用目的を推奨していませんし、私もあくまで実験であり推奨しません。自己責任でお願いします。)

【2013/08/08 追記, 2014/04/05 編集】
ServersMan SIM 100がLTEに対応し、ServersMan SIM LTE 100へ移行されることとなりました。
これに伴い、グローバルIPアドレスの提供がなくなり、
プライベートIPアドレスのみとなりましたので基本的にWebサーバなどとしては使えなくなります。
(ngrokなどを使う方法はありますが。)




まずは、WindowsのPCに、SIMカードを取り付けた状態のL-02Aを接続して、一旦設定を行なっておきます。

docomoの接続ツールをインストールします。
接続設定は、Serversman SIMのものを使い、実際に一旦接続してください。
尚、このように一旦設定を行なっておかないと、後から Linux上に接続してponする際、問答無用に"NO CARRIER"でエラーになってしまいました。

次に、Raspberry Piを起動して...
コンソールで apt-getを用いて、"pppconfig"と"eject"をインストールします。
$ sudo apt-get install pppconfig eject

続いて、L-02Aを、Raspberry PiのUSBポートに接続します。

ここで、lsusb コマンドを実行...。
$ lsusb
~~~
Bus 001 Device 007: ID 1004:610c LG Electronics, Inc.
というように、認識されていることがわかります。

ところで、L-02Aは、ゼロインストール機能があるので・・・
接続直後はCD-ROMドライブとして認識される仕様になっています.
$ ls /dev/sr* -la
brw--rw---T+ 1 root cdrom 11, 0 xxx xx xx:xx /dev/sr0
これですね。CD-ROMになっています。

これをEjectすることで、本来のデータカードとして認識されるはず...。
が!しかし...このままejectしても、実際にはうまく行きません。

モデムを/dev/ttyUSB*として認識してほしいところなのですが、
/dev/ttyACM*として認識されてしまいます。

こちらのページによると...。
Ejectを行ったあと、cdc_acmドライバの読み込みが行われるらしいのですが、L-02Aは情報がないため、その読み込みに失敗するそうです。


ですから、対策としてcdc_acmドライバが読み込まれないように設定しておきます。
$ sudo vi /etc/modprobe.d/cdc_acm-blacklist.conf
blacklist cdc_acm

さらに、udevでttyUSB*として認識してもらうための設定をします。
(引用元http://slashdot.jp/journal/491733/ubuntu-9.04-%E3%81%A7-docomo-L-02A-%E3%82%92%E4%BD%BF%E3%81%86 (ありがとうございます!))
$ sudo vi /etc/udev/rules.d/99-foma_l-02a.rules
# for FOMA L-02A
# USB Storage (Zero Installation)
KERNEL=="sr[0-9]*", ENV{ID_VENDOR_ID}=="1004", ENV{ID_MODEL_ID}=="610c", RUN+="/usr/bin/eject /dev/$kernel"

# USB Modem (ttyUSB)
SUBSYSTEM=="usb", ATTR{idVendor}=="1004", ATTR{idProduct}=="6109", RUN+="/sbin/modprobe usbserial vendor=0x$attr{idVendor} product=0x$attr{idProduct}"</del>
これでL-02Aを接続しなおしてみると...。
$ ls /dev/ttyUSB* -la
crw-rw---T 1 root dialout 188, 0 xxx  xx  xxxx /dev/ttyUSB0
crw-rw---T 1 root dialout 188, 1 xxx  xx  xxxx /dev/ttyUSB1
crw-rw---T 1 root dialout 188, 2 xxx  xx  xxxx /dev/ttyUSB2
認識されましたね( ´∀`)b!

続いて、接続設定をします。

pppconfigを実行すると、テキストベースのGUIが表示されます。
$ sudo pppconfig
まずは、[Create]を選択。
尚、都合によりスクリーンショットはターミナルからSSH接続したものですw
  • Provider name:
    ponするときの名前になりますので、適当に入力します。
    ここでは、"serversman_sim100"としました。
  • Number: "*99***1#"
  • Authentication Method: "CHAP"
  • User: "user@3gd.ynmbl.net" → "user@dream.jp" (LTEへの移行にともない変更)
  • Password: "3gd" → "dti"
  • Speed: "115200"
  • Com: "/dev/ttyUSB0"
  • DNS:"Static"を選び、適当にGoogle Public DNSでも登録しておきますw
    ("Dynamic"を選んでも良いはずなのですが、何故かうまくいかなかったので・・・。)
    • Primary: 8.8.8.8
    • Secondary: 8.8.4.4
最後に "Finished"を選択して、接続設定は完了です。

あとは、ponコマンドで接続するだけです。 (ちなみに切断するときは、poffコマンド。)
$ sudo pon serversman_sim100
これで接続されます。
尚、接続中は、L-02Aのランプ(下側)が青色に点灯します。

接続できているか、確認してみましょう。
$ ifconfig -a
ppp0 Link encap:Point-to-Point Protocol
    inet addr:xx.xx.xx.xx  P-t-P:10.64.64.64  Mask:255.255.255.255
    UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1500  Metric:1
    RX packets:xxxxx errors:x dropped:0 overruns:0 frame:0
    TX packets:xxxxx errors:x dropped:0 overruns:0 carrier:0
    collisions:x txqueuelen:x 
    RX bytes:xxxxxx (xxx.x KiB)  TX bytes:xxxxxx (xxx.x KiB)
グローバルIPアドレスが割り当てられている事が確認できます。

pingも通るようならOKですね。
$ ping google.com
さらに、自動接続できるようにしておきます。
$ sudo gpasswd -a pi dip
$ vi /etc/local.d
~~~~
pon serversman_sim100

exit 0;
接続は以上です。

...おっとw サーバにしてみよう!ということでしたね ( ゚д゚)!

とりあえず、ファイアウォールの設定を。
いつも通りにiptableを直接使ってもいいのですが、Raspbianですし、手軽にufwで。
$ sudo ufw default DENY
$ sudo ufw allow 80/tcp
$ sudo ufw enable
あとは、nginxをインストールしてお茶を濁しておきます(笑)
$ sudo apt-get install nginx
$ sudo service nginx start

これで、他のPCのブラウザから、L-02Aに割り当てられたグローバルIPアドレスにアクセスすることで、Raspberry Pi上のHTTPサーバにアクセスができます!
歴としたWebサーバの完成です∩( ・ω・)∩!w

もちろん...このIPアドレスは変動しますので、一般的な自宅サーバなどと同様に、DDNS (MyDNS.jpなど)のお世話になると良いかと思います。
また、DDNSへのIPアドレス登録には、DiCEを使わせてもらってもいいのですが、今回はもっと簡単に、”数分ごとにIPアドレスの変動をチェックしてDDNSにIPアドレス登録を行う”ようなスクリプトを書きました。

あとは切断された時に自動接続するスクリプトを書いてcrontabに入れておくとか...。
perlでゴリゴリしてみるとか、Webカメラをつないでネットワークカメラ代わりにしてみるとか、何かおもしろいセンサーをつけてみるとか...
(Raspberry Piは普通にLinuxですので大概何でもできてしまいます。夢が膨らみますね(>ω<)♪ww)

※ 最後になりましたが、前もって当然のことながら、SSH等は別途必要に応じて適切に設定しておいてください。(パスワードログインを無効化して公開鍵認証にするとか、ポート変更をするとか....その他諸々。)

2013/04/08

Google+風のフィードバック(ご意見・ご感想)機能を実装できるライブラリ

ちょっと旬からは遠ざかった気がしますが...
Google+風のフィードバック(ご意見・ご感想)機能を実装したいな〜と思い、
既存のものがあったはず...と探してみましたので、メモ程度にまとめておきます。

画面右下等に表示された"フィードバック(ご意見・ご感想)"ボタンをクリックすると、
DOMのスクリーンショットをブラウザ上で作成して、文章に添付して問い合わせできるアレです。
尚、これらのライブラリは、フィードバックの作成・送信までを行うのみですから、
バックエンド側の実装は別途行う必要があります。
(ちなみにGoogle公式では、Google Feedbackというシステムになっており、管理まで包括的に行えるようです。これが一般に開放されると、とても便利になると思うのですが。)

feedback.js
http://experiments.hertzen.com/jsfeedback/
サンプル: http://experiments.hertzen.com/jsfeedback/examples/combination/index.html
feedback.jsのサンプル。
ハイライト、塗りつぶしともに動作しました。
dom-feedback
https://github.com/jankuca/dom-feedback
サンプル: http://jankuca.github.io/dom-feedback/example/
dom-feedbackのサンプル。
しかし、私の環境ではうまく動作しませんでした。 (Google Chrome 24.0)
jQuery.sendFeedback
https://github.com/Chevex/jQuery.sendFeedback
サンプル: http://mugifly.site44.com/masanoriprog/2013-04-08_web_feedback/jquery.send_feedback/index.html
こちらは、その名のとおり、jQueryプラグインになっています。
jQuery.sendFeedbackのサンプル。
枠を描画する機能はあるものの、ハイライトや塗りつぶしは無いようです。

個人的な感想としては...今のところ、feedback.jsが最も実用できそうな感じですね。

もちろん、いずれもオープンソースですので、Pull Requestを送ったり、
これを参考にさせてもらって自分で実装するなりしても良いと思います。
(ちょうど、feedback.jsの開発者の方が公開してくださっている html2canvas を使えば、
クライアント上でJavaScriptのみでのスクリーンショット生成が簡単に行えます。)


また、有償のWebサービスですが、次のようなものもありました。

Webサービスのカスタマサポートなどに使うのであれば、検討してみても良さそうです。

2013/03/04

CPAN Testersになろう

先日、Kansai.pm ミーティングに参加して開発意欲をいただいた事もあり...
簡単なCPANモジュールを幾つかリリースしました(>ω<)/(笑)
(今まで自前のperlモジュールは作っていましたが...CPAN公開は初で...。これで私も、一応CPAN Author(><;))

さて、今回の記事は、お世話になっているCPANやCPAN Authorの皆さんに
何か僅かでも恩返し(?)を...ということで "CPAN Testersになろう!"です。

CPAN Testersというのは、CPANで公開されているモジュールのテストを行い、
レポートする活動 および CPAN上で公開されているテスト情報のことです。
新着モジュールを自ら or プログラムでチェックして積極的にレポートを送ってくださる方もいらっしゃるようです。
CPAN Testersや、perlのテストについては、Perlにおけるテストの概要/TAPとは?:Happy Testing Perlを参照させてもらいましょう。
search.cpan.prgなどで見かける、この表記。
PASS (24)は、テスト通過したレポートが24件投稿されているということ。
View Reportsをクリックすると詳細へアクセスできる。

今回は、自らのPCでCPANモジュールをインストールする際に
自動的にテスト結果をレポートするよう設定します。
・・・といっても、とても簡単です。

まずは、CPANシェル(or cpanm)で
Task::CPAN::Reporterをインストールします。

$ cpan Task::CPAN::Reporter
次に、CPANシェルでレポートのための設定を行います。
$ cpan
> o conf init test_report

Generate test reports if CPAN::Reporter is installed (yes/no)? [no] yes
Would you like me configure CPAN::Reporter now? [yes]


email_from? [] Taro Yamada

edit_report? [default:ask/no pass/na:no]

send_report? [default:ask/yes pass/na:yes]

transport? [Metabase uri https://metabase.cpantesters.org/api/v1/ id_file metabase_id.json]

Would you like to run 'metabase-profile' now to create '/home/xxxx/.cpanreporter/metabase_id.json'? [y]

Enter full name: Taro Yamada

> o conf commit
> exit
(基本的に表示のとおり進めるだけで終わります。最後に、o conf commitして、exit。)

これで完了です。
(以前はEメールの設定をして...というのが必要だったのですが、執筆現在試したところによると、不要になっているようです。)

試しに・・・CPANシェルでモジュールを何かインストールしてみてください。
※ 尚、cpanmはレポートには使えませんので、通常のCPANシェルを使います。

例えば、拙作の WebService::Zussar あたりは軽くて試すのにもってk(←←
$ cpan WebService::Zussar
~~~~
CPAN: CPAN::Reporter loaded ok (v1.2009)
Created MYMETA.yml and MYMETA.json
Creating new 'Build' script for 'WebService-Zussar' version 'v0.0.3'
(/usr/bin/perl Build.PL  exited with 0)
CPAN::Reporter: Build.PL result is 'pass', No errors.
Building WebService-Zussar
(./Build exited with 0)
CPAN::Reporter: Build result is 'pass', No errors.
  MUGIFLY/WebService-Zussar-v0.0.3.tar.gz
  ./Build -- OK
Running Build test
# Testing WebService::Zussar 0.0.3
t/00.load.t ................. ok
t/01.fetch_event.t .......... ok
t/010.online_fetch_event.t .. ok
t/02.fetch_event_user.t ..... ok
All tests successful.
Files=4, Tests=37,  2 wallclock secs ( 0.05 usr  0.01 sys +  0.83 cusr  0.11 csys =  1.00 CPU)
Result: PASS
(./Build test exited with 0)
CPAN::Reporter: Test result is 'pass', All tests successful.
CPAN::Reporter: preparing a CPAN Testers report for WebService-Zussar-v0.0.3
CPAN::Reporter: sending test report with 'pass' via Metabase
MUGIFLY/WebService-Zussar-v0.0.3.tar.gz
./Build test -- OK
Running Build install
Building WebService-Zussar
Installing /home/xxxxxx/perl5/lib/perl5/WebService/Zussar.pm
Installing /home/xxxxxx/perl5/man/man3/WebService::Zussar.3pm
  MUGIFLY/WebService-Zussar-v0.0.3.tar.gz
  ./Build install  -- OK
こんな感じで、テスト結果のログがCPANに自動送信されます。
CPAN上に反映されるには数時間〜数日かかりますが、
これだけで、自分の環境でテストを行なってレポートできます。

レポートされたテスト結果は
search.cpan.orgや、metacpan.orgの各モジュールのページからアクセスできます。
モジュールのために徹底したテストを書くということ、また、CPANを中心として、テスト環境が広く、レポートするコミュニティが確立しているということは、perlの一つの文化とも言われています。

大抵、幅ひろい環境でのテスト結果が集まることは、良いことだと思いますし、
私たちも何かしらの形で、少しでも協力できるといいですね♪