Translate

2016年5月20日金曜日

Ciaoサンプルコード"CiaoRestClient-ThingSpeak"を翻訳してみた

Ciaoに関する主なドキュメントを読んだので、
そろそろサンプルを動かしたくなってきました。

で、Arduino Yunサイトにリンクがあった

CiaoRestClient-ThingSpeak
http://labs.arduino.org/CiaoRestClient-ThingSpeak

を勝手翻訳してみました。
At your own riskで参照ください。

-----

CiaoRestClient-ThingSpeak


"CiaoRestClient"は、CiaoライブラリとThingSpeak Cloudとの間のインタラクションのSketchコード例です。特に、温度や湿度をモニタするためにThingsSpeakへのチャネルの作成方法をコードで確認することができます。

Ciao


このSketchは、Ciaoライブラリが必要となります。

Ciaoを実行するためには:

  • Ciao Core:パッケージマネジャもしくはソースからインストール可能、詳細は後述  
  • Ciaoライブラリ:Arduino IDE 1.7.7以降もしくはArduino Studio 0.0.4以降で使用可能、ライブラリを手作業でも追加可能、詳細は後述
  • コンパチブルボード:このリンクをチェックしてCiaoが動作するボードのリストを確認のこと

CIAO SETUPのCiao Coreのインストール手順を確認のこと。


注意:
Arduino UNO WiFiには、すでに導入済みです。


ThingSpeak

ThingSpeakは、オープンなデータプラットフォームであり、センサや(Arduinoのような)起動装置(アキュームレータ)からのデータ集約、格納、分析、参照を可能にするInternet of ThingsのためのAPIです。例えば、ThingsSpeakでセンサロギングアプリケーション、位置追跡アプリケーション、そしてステータス更新でのSocial Network of Thingsを構築することができます。それらが実現できれば、あなたの現在の場所から家庭のサーモスタット操作を実行することが可能です。ThingSpeakの主要な要素はチャネルです。そしてそれはデータフィールド、位置フィールド、ステータスフィールドを含んでいます。ThingsSpeakチャネル構築後、MATLAB(R)コードを使ってチャネルへデータを書きこみ、処理し、そしてデータを参照することができます、そしてツイートやその他のアラートによるデータへ反応することができます。典型的なThingSpeakワークフローは次の通りです:
  • チャネル作成、データ集約
  • データの分析と視覚化
  • 他のアプリを使ったデータ作用(加工?)

ThingSpeak APIは、GitHub上から取得可能です。HTTPリクエスト実行、強力な数値アルファベットデータ、数値データ処理、位置追跡、そしてステータス更新のための完全なThingSpeak APIが含まれています。


ThingSpeakチャネルの作成


Sketchを実行するには、thingspeak.com 上のアカウント登録および新規チャネルの作成が必要です。つぎの手順で実行してください:

・Webサイトから登録してください:http://thingspeak.com

図1 → http://labs.arduino.org/dl1420?display&scale=0.6

・図2のようにChannels > My Channels > New Channelメニューをクリックしてチャネルを作成してください:

図2 → http://labs.arduino.org/dl1592?display&scale=0.6

・新規チャネルにリネームし、2つのフィールドを追加してください。最初のフィールドは湿度データ、2番めのフィールドは温度です。

図3 → http://labs.arduino.org/dl1593?display&scale=0.6
図4 → http://labs.arduino.org/dl1594?display&scale=0.6

・図5のように、マクロAPIKEY_THINGSPEAKの値"XXXXXXXXX"をチャネルのAPI Keysセクションにある"Write API key"の値に書き換えてください。

図5 → http://labs.arduino.org/dl1595?display&scale=0.6

次にSketchコードをボードへアップロードします。

コード


Arduino.org IDEを使ってアップロードしてください。まだ入手していない場合は、ここからダウンロード可能です。

すでに説明したマクロAPIKEY_THINGSPEAKの値"XXXXXXXXX"を"Write API key"の値に書き換えることを忘れないで下さい。


/*
このサンプルコードはCiaoライブラリとThingSpeak Cloudとの
インタラクションを確認することができます。
実行するためには、tingspkeak.com サイト上でアカウントを登録し、
サイトの"Channels"セクションからチャネルを作成してください
(Channels -> My Channels -> New Channel)。

新しいチャネルには2つのフィールドが必要です。
最初のフィールドは湿度、2番めのフィールドは温度です。

その後、マクロAPIKEY_THINGSPEAKの値"XXXXXXXXX"を
チャネルセクションの"Write API key"の値に書き換えます。
*/

#include
#include

#define CONNECTOR     "rest"
#define SERVER_ADDR   "api.thingspeak.com"

#define APIKEY_THINGSPEAK  "XXXXXXXXX" //Insert your API Key

short hum = 60;
short temp = 22;

void setup() {
  Ciao.begin(); // CIAO 初期化
}

void loop() {
    String uri = "/update?api_key=";
    uri += APIKEY_THINGSPEAK;
    uri += "&field1=";
    uri += String(hum);
    uri += "&field2=";
    uri += String(temp);

    Ciao.println("Send data on ThingSpeak Channel");

    CiaoData data = Ciao.write(CONNECTOR, SERVER_ADDR, uri);

    if (!data.isEmpty()){
      Ciao.println( "State: " + String (data.get(1)) );
      Ciao.println( "Response: " + String (data.get(2)) );
    }
    else{
      Ciao.println("Write Error");
    }
  delay(30000); // Thinkspeak ポリシー
}


アウトプット


ThingSpeak チャネルを開き、湿度と温度を確認してください:

図6 → http://labs.arduino.org/dl1596?display&scale=0.6

もしArduino UNO WiFiを使用しているのであれば、WebパネルのWIFI CONSOLEへアクセスしてこの画面を参照してください:

図7 → http://labs.arduino.org/dl1596?display&scale=0.6

注意:
このSketchでは、デフォルトの湿度値(60)と温度値(22)を使っています。
ボードにセンサを接続しSketchを修正して湿度や温度の実測値に変更してみてください。



Ciaoライブラリを使用した他の例はGitHubの次のリンクを参考にしてください:https://github.com/arduino-org/arduino-ciao-library
 



------

そうか、Arduino社はArduino YunではなくArduino UNO WiFiをInternet of Thingsのフラッグシップモデルにしようとしているのか..

そうなると、Arduino UNO WiFiがスイッチサイエンスとかで販売されるのも時間の問題かもなあ..

今、技適マーク取ってるところなんだろうなあ..おそらく..

"Arduino Yun上のLininoディストリビューションを更新する方法"を翻訳してみた

Ciaoを使用する場合は、LininoOSを更新しなくてもよいのだけど、一応やっておこうと思い、以下のガイドを勝手翻訳してみた。

How to upgrade the Linino distribution for Arduino Yun
http://labs.arduino.org/How+to+upgrade+the+Linino+distribution+for+Arduino+Yun

以下が翻訳文だが、参考にする場合は at your own risk でおねがいします。

------

Arduino YunのLininoディストリビューションのアップグレード方法


新しいイメージはLinino.orgが提供しています。
"latest image here"から最新版を入手可能です。



LininoIOをアップグレードする方法は、
更新日付が2015/10/04日付以降の場合は、2つあります: 
  • sysupgradeを使う
  • linup コマンドを使う

警告:
2015/10/04以降のバージョンの場合のみ、この文章に従ってください
2015/10/04より古いバージョンはこのリンク先のガイドに従ってください。


sysupgradeを使ったArduino YUNの更新


rootでSSHログインし、以下のコマンドをタイプしてください:
$ cd /tmp
$ wget http://download.linino.org/linino_distro/lininoIO/latest/lininoIO-generic-linino-yun-squashfs-sysupgrade.bin
$ sysupgrade -v lininoIO-generic-linino-yun-squashfs-sysupgrade.bin

約1分後ボードはリブートされ、ボード上の新しいイメージがロードされます。
注意:
以前のイメージ上でのセッティングを上書きしたい場合、sysupgradeコマンドに-nオプションを追加する必要があります。

$ sysupgrade -v -n lininoIO-generic-linino-yun-squashfs-sysupgrade.bin

警告:
Arduino Yun Miniを使用している場合、更新ステップ内で使用するイメージを以下の指定に変更しなくてはなりません:
$ wget http://download.linino.org/linino_distro/lininoIO/latest/lininoIO-generic-linino-yun-mini-squashfs-sysupgrade.bin
$ sysupgrade -v lininoIO-generic-linino-yun-mini-squashfs-sysupgrade.bin

注意:
全体アップグレードの場合(-nオプションをつけた場合)、rootパスワードはデフォルトの"doghunter"になります。

linupコマンドを使ったLininoOSの更新



(Arduino Yunの)最新リリース上では、最新バージョンもしくは特定のリリースのLininoOSに自動更新するlinupコマンドを使用することができます。コマンドシンタックスは次のとおりです:
root@linino:/# linup
USAGE : linup ( latest or YYYYMMDD.x where x=0,1,2...n ) \
            ( optional : lininoIO or master )


もしLinino OSを最新イメージへ更新したい場合、次のコマンドを実行してください:
root@linino:/# linup latest

順番にLinino OSを更新するためのガイド


1) SSH経由でボードへ接続する
Linuxの場合は、シェルコマンドで"ssh root@linino.local"を実行する
Windowsの場合は、例えばPuttyを使用してSSH接続する

図1 → http://labs.arduino.org/dl1272?display

2) rootでログイン

図2 → http://labs.arduino.org/dl1273?display&scale=1

3) パスワードを入力する

図3 → http://labs.arduino.org/dl1274?display&scale=1

4) コマンド linup latest もしくは linup specif release を入力する

図4 → http://labs.arduino.org/dl1278?display&scale=1

5) "y"と入力する

図5 → http://labs.arduino.org/dl1284?display&scale=1

6) ロードされるまで待機

図6 → http://labs.arduino.org/dl1285?display&scale=1

7) 必要に応じて選択する。

図7 → http://labs.arduino.org/dl1277?display&scale=1

8) 更新終了まで待機する。
注意:
オプション2(-nをつけた既存設定上書きインストール)を選択した場合、rootの新パスワードは初期状態"doghunter"にもどっている。


-------

上記の通り実際にやってみると..おどろいた。

ブラウザでひらくとLuciパネルが表示されていたのがos.js ベースのGUIにかわっとる..



複数のターミナルが1画面でうごかしたかったのかな..

うわー、ここまでせんでもいいのに..

Arduino "Ciao Setup"ページを翻訳してみた

Ciaoのセットアップページ

Ciao Setup
http://labs.arduino.org/Ciao+setup

もついでに勝手翻訳しました。
参照する場合はat your own riskでお願いします。

-----

Ciao セットアップ


前提条件


Ciaoを実行するには以下のことが必要です:
  • Ciao Core: パッケージマネジャ(opkgコマンド)経由もしくはソースからインストール可能。詳細情報は以下の文章を参照のこと。
  • Ciao ライブラリ: Arduino IDE 1.7.7以降/Arduino Studio0.0.4以降で使用可能。手動でインポートする方法は以下の文章を参考のこと。
  • コンパチブルボード: Ciaoが動作するボードについては、このリンクをチェックしてください。

Ciao Core のインストール


パッケージマネジャ経由かLuciパネル利用可するか2つの方法Ciaoをインストールすることができます。
注意:Ciao Coreをインストールした後、動作させたいコネクタを有効化し・設定しなくてはなりません。

パッケージマネジャ経由


CiaoはLininoOSのすべてのバージョンで動作しますが、手動でインストールする必要があります。

LininoOSのコマンドラインで以下のコマンドを実行します:
LininoOS コマンドライン
# lininoio stop
# opkg update
# opkg install ciao

上記コマンドを実行すると、Ciao CoreとデフォルトCiao コネクタの最新バージョンをインストールすることができます。
注意:もし最新バージョンの Linino OS を更新したのであればこの手順を実行するか、LininoOSを使ってLininoOS自体のバージョンアップをしたい場合このガイドに従ってください。
警告:ボードをEthernetケーブルもしくはWiFiネットワークに接続してから実行してください。ボードの設定方法のガイドはここをクリックしてください。

Luciパネル経由


ボードの(ネットワーク)設定を完了させておいてください。
まだ完了していない場合は、このガイドに従ってください。
(ネットワーク)設定済みボードと同じネットワークにPCを接続してください。
ブラウザを起動し、ボードアドレスもしくはnameboard.local/を開いてください。ボードのIPアドレスを知らない場合は、ブラウザ経由でアクセスすることができません。簡単にIPアドレスを確認する方法については、このガイドを参照してください。


図1→ http://labs.arduino.org/dl1445?display&scale=0.5

Configuration Panelにパスワードを入力して、Configureボタンをクリックしてください。

図2→ http://labs.arduino.org/dl1446?display&scale=0.5

Luciパネル内のリンク"advanced configuration panel(luci)"を選択して、以下の画面(図3)を表示させてください

図3→ http://labs.arduino.org/dl1447?display&scale=0.5

Systemメニューを選択し、Softwareサブメニューを選択してください。

図4→ http://labs.arduino.org/dl1448?display&scale=0.5

Update list上でクリックしてください。
Available packagesメニューを選択後、"C"サブメニューをクリックして"Ciao"行を見つけてください。
その行の"Install"リンクをクリックして確認ダイアログのOKボタンをクリックしてください。

図5→ http://labs.arduino.org/dl1451?display&scale=0.5

インストールが完了するまで待機してください、しばらくすると次のような画面(図6)になります。

図6→ http://labs.arduino.org/dl1452?display&scale=0.5

これでCiaoのインストールは完了です。

ソースからのインストール


ソースからCiao Coreをインストールする手順はちょっとトリッキーすぎるのでArduino.org開発チームは忙しくて単純化することができませんでした。更新を乞うご期待!

Ciaoライブラリのインストール


Arduino IDE


Ciaoライブラリをインポートするために、最初にGitHub上の最新バージョンをダウンロードしてunzipしてください。

Arduino IDE内で"Sketch">"Import Library">"Add Library"を選択し、展開後のフォルダを指定してください。最期に"Sketch">"Import Library"を選択してライブラリを有効化してください。

注意:もしArduino IDEが前提条件より古いバージョンであるならCiaoライブラリを手動インストールしないで最新バージョンを入手してください。最新版は、arduino.org/downloadsより入手してください。

Arduino Studio


この文章を執筆した次点では Arduino Studioのバージョンは 0.0.4で、"Import Library"機能はまだ開発中です。

使用可能になるまで、しばらくお待ちください。

一般的な問題


Ciao Core もしくはコネクタが開始されない

Ciao CoreはSketchからMCU経由で操作(開始・停止)を実行します。以下のことを確認してください:
  • MCU:Sketchのsetupブロック内で呼び出されているCiao.begin()メソッドが動作しているか
  • LininoOS:少なくとも/usr/lib/python2.7/ciao/conf/内の1つの/usr/lib/python2.7/ciao/conf/内のコントローラがenabledとなっていること

MCU/MPU間通信中システムログから要求されていないテキストを受け取る

Ciaoパッケージインストール中何か誤りがあった場合に、いくつかのLininoOSパッケージが正しくアップグレードされていないとシリアル通信内にsyslogメッセージが発生することが有ります。

このような問題を解決するには、コマンドラインを開いて以下の作業を行ってください:

1. /etc/sysctl.conf をひらく
LininoOSコマンドライン
# vi /etc/sysctl.conf

2. kernel.printk 行を次のように更新する
kernel.printk = 3 4 1 7

3. sysctl 設定を再読み込みする(か、ボード自体を再起動する):
# sysctl -p

2016年5月19日木曜日

Arduino "Ciao MCU" を翻訳してみた

今度はCiaoライブラリ、Sketch側でどうCiaoライブラリを呼び出すか
が書かれている

Ciao MCU
http://labs.arduino.org/Ciao%20MCU

を翻訳してみました。

以下、at your own risk で参考のこと。

-----

Ciao MCU


イントロダクション


Ciaoライブラリは、シリアル通信経由で、シンプルで直感的な方法により、マイクロコントローラ外部へのデータ送受信を許可します。CiaoライブラリはSketch上で使用することのできる3つの主な関数を提供します:

 
  • read(connector)
  • write(connector, param1, param2, param3) 
  • writeResponse(connector, id, param1, param2, param3)

これらの関数に加えて、便利なCiaoData、管理のためのユーティリティ機能、データの取得および操作を提供します。
 
  • get(index)
  • isError()
  • isEmpty()


Ciaoライブラリを使うためには以下の作業が必要です:
 
  1. Ciaoライブラリのインポート
  2. 関数begin()による初期化

注意:Ciaoライブラリを使う前に、Sketchで使うコネクタをenableにする必要があります、そしてそれは時々設定を行う必要があります。コネクタの有効にする方法コネクタリストを読んでコネクタのセットアップ方法を学習してください。

read


関数readはコネクタからのデータ受け取りを可能にします(例:xmpp、websocket、twitter)。コネクタにより提供されたIDやデータで構成されるCiaoDataオブジェクトで返却されます。
関数getによりCiaoDataオブジェクトから様々なフィールド値の取得が可能です(関数getを参照のこと)。




xmppコネクタからデータ取得する場合、このようなシンプルなステップが必要になります:

#include

setup{
    Ciao.begin()
}

loop{
    CiaoData data;
    data = Ciao.read("xmpp"); // xmpp connectorへ問い合わせ
}

write


関数writeはボードからコネクタへデータ送信を可能にします。4つのパラメータまで認められており、最初のパラメータは常に相互通信したいコネクタのタイプです。その他のパラメータは異なる利用ケースにより自由に使用されることがあります。

例:

xmppコネクタへ送信データを送る場合、関数writeのパラメータは次のようになります:
 
  • 最初のパラメータは、コネクタタイプ
  • 2番めのパラメータは、 送信先名
  • 3番めのパラメータは、送信メッセージ

#include

setup{
    Ciao.begin();
}

loop{
    Ciao.write("xmpp","user@xmpp","hello from MCU");
}

writeResponse


関数writeResponseはコネクタにより送信したリクエストのリプライを直接受け取ることができます。最大5つのパラメータまで指定でき、最初のパラメータは常に相互通信したいコネクタタイプ、2番めのパラメータはレスポンスを送りたいID値を常に指定します。その他のパラメータは異なる利用ケースにより自由に使用されることがあります。

例:

直前のxmppリクエストのレスポンスを受け取る場合、関数writeResponseのパラメータは次のように指定します:
 
  • 最初のパラメータは、コネクタタイプ
  • 2番めのパラメータは、xmppリクエストのID
  • 3番めのパラメータは、送信メッセージ

#include

setup{
    Ciao.begin();
}

loop{
    CiaoData data;
    data = Ciao.read("xmpp"); // xmpp connectorへの問い合わせ
    String id = data.get(0);
    String sender = data.get(1);
    String message = data.get(2);

    Ciao.writeResponse("xmpp",id,"response from MCU");
}

get


関数getCiaoData内部から情報を取り出すことを許可します。この情報は使用されるコネクタタイプにより様々です。

関数はたった1つだけのパラメータ、コネクタ内でセットされたデータフォーマットの位置(インデックス)のみ受け取ります



XMPPコネクタのCiaoDataは普通、ID(インデックス"0")、送信者(インデックス"1")、そしてメッセージ(インデックス"2")となります。

情報を取り出すには、以下の様なステップでおこないます:

#include

setup{
    Ciao.begin()
}

loop{
    CiaoData data;
    data = Ciao.read("xmpp"); // xmpp connector への問い合わせ
    String id = data.get(0);  // CiaoData から情報取得
    String sender = data.get(1);
    String message = data.get(2);
}

splitString


関数splitStringは、コネクタへ送信するMCUコマンドを管理するために使用します。

関数は最大4つまでパラメータを受け取ります、最初のパラメータはMCUのシリアルコマンド、2番めのパラメータはシリアルコマンドを分割するために使用されるキャラクタ、3番めと4番めのパラメータはそれぞれ受信シリアルコマンドを分割した配列と(配列の)サイズです。




もしxmppコネクタにより、"digital/13/1"のように、3つのパラメータが送信された場合、コマンドを分割するためにまず3つの要素文字列を作成する必要があります、その後関数splitStringを呼び出します:

#include

void setup() {
     Ciao.begin();
     Serial.begin(57600);
}

void loop() {
     CiaoData data = Ciao.read("xmpp");
     String id = data.get(0);
     String sender = data.get(1);
     String message = data.get(2);
     String command[3];
     splitString(message,"/",command,3);
     Serial.println("command type: "+command[0]); //アウトプットはdigital
     Serial.println("pin: "+command[1]); //アウトプットは13
     Serial.println("pin value: "+command[2])); //アウトプットは 1
}

isError


関数isErrorCiaoDataオブジェクトにエラーコードが含まれているかチェックすることができます。
CiaoData無いにエラーコードが存在する場合、関数は真値を返却します。




xmppコネクタからの受信データ内にエラーコードが存在するかどうかチェックします。
#include

void setup() {
    Ciao.begin();
    Serial.begin(57600);
}

void loop() {
    CiaoData data = Ciao.read("xmpp");  
    if(data.isError()){
      String message = data.get(2);
      Serial.println(" error:"+ message);
    }
}

isEmpty


関数isEmptyCiaoDataオブジェクトが空かどうかをチェックすることができます。

関数はCiaoDataが空かどうか真偽値を返却します。



オブジェクトが空でなければ、CiaoDataオブジェクト内の情報を取り出す。
#include

void setup() {
    Ciao.begin();
    Serial.begin(57600);
}

void loop() {
  CiaoData data = Ciao.read("xmpp");
  if(!data.isEmpty()){
      String id = data.get(0);
      String sender = data.get(1);
      String message = data.get(2);
      Serial.println("id: "+id);
      Serial.println("sender: "+sender);
      Serial.println("message: "+message);
    }
}

----
小難しい部分は全部Ciao Coreへ分離しただけあってライブラリ側の簡単なこと..

Arduino "Ciao: development of a new connector"を翻訳してみた

既存のCiaoコネクタをつかうにしても設定ファイルのパラメータについて理解する必要があるため、

Ciao: development of a new connector
http://labs.arduino.org/Ciao+connector+development

を勝手翻訳しましたのでブログ記事に載せておきます。
参考にされる方はat your own riskでお願いします。

------

Ciao:新規コネクタの開発


Getting started


コネクタはスタンドアロンソフトウェアで、すきな言語で開発可能です。Ciaoはイメージ可能な多くのコネクタをサポートします。
各コネクタは、Ciao Coreと相互接続するために必要な2つのシンプルな要件を満たす必要があります:
 
  • TCPソケットの使用 - Ciaoと接続するために必要
  • JSONの使用 - Ciaoとの通信に必要

以下のサンプル設定ファイルは、一般的なコネクタ"samplecon"のものです:
samplecon.json.conf
{
        "name" : "samplecon",
        "enabled": true,

        //type accepted values: managed/standalone
        "type" : "managed",

        "commands": {
              // 開始コマンドのパラメータ配列
              "start": ["/usr/lib/python2.7/Ciao/connectors/samplecon/samplecon.py"],

              // 停止コマンドの全パラメータ
              "stop": ["/usr/bin/killall","-s", "HUP","samplecon.py"]
        },

        "implements" : {
            "read" : { "direction": "in", "has_params": false },
            "write" : { "direction": "out", "has_params": true },
            "writeresponse" : { "direction": "out", "has_params": true }
        }
}

設定パラメータ


name:
コンテナの名称(小文字)。Ciao Coreへの登録に使用される。name値はMCUサイド(Sketch)上でも使用する。(samplecon.json.confのように)name値をを使った設定ファイル名をつけることはベストプラクティスの一つです。

enabled:
Ciao Coreがコネクタを開始/停止しCiaoとのコミュニケーションを受け入れるかどうか、trueもしくはfalseを指定する。

type:
"managed"もしくは"standalone"のどちらかを指定する。
managedを指定すると、Ciao Coreがコネクタの開始・停止を管理する。"standalone"を指定すると、コネクタは(Ciaoと接続するシステムサービスもしくはデーモンが有効なときだけ)"自己管理"となる。


commands: (type値が"managed"である場合のみ)
    start (コネクタの開始コマンド、絶対パスで指定する)
    stop  (コネクタの終了コマンド、絶対パスで指定する)

implements:
(MCUの観点からの)コネクタによるり実装された機能の配列表現
    read: MCUサイド上で利用可能なインストイラクション"Ciao.read(…)"が指定された場合
    write: MCUサイド上で利用可能なインストイラクション"Ciao.write(…)"が指定された場合
    writeresponse: MCUサイド上で利用可能なインストイラクション"Ciao.writeResponse(…)"が指定された場合


配列には2つのキーのエントリがそれぞれ格納されている:
    direction: MCUの観点からの振る舞いの方向性を"in"、"out"、"result"のいずれかの値で表現する
        "in": チャットメッセージやHTTPリクエストからの受け取りのような、"外界"からのインタラクションのために待機するコマンド
        "out": 外部への送信のみのチャットメッセージのような、メッセージ/データを送信しなくてはならないコマンド
        "result": リクエスト構築し(一旦実行後)レスポンス提供しなくてはならないコマンド
    has_params: この値は"true"もしく"false"のどちらかをセットすることが可能。パラメータがMCU Sketchによりread/write/writeResponseメソッドでコネクタへ渡されるかどうかを指定する

コネクタの開発方法


独自のコネクタを実装する場合、(OpenWRT上でインタプリタが提供される、もしくはコンパイル可能なものであれば)あなたが快適に使えるプログラミング言語を使うことができます。

新規コネクタを設計する場合、2つのインタラクションサイドに気をつけてください:

  • TCP経由でCiao Coreをつかってのインタラクト(通常localhost上のポート番号10900番にてlisten)
  • インタラクトを希望するアプリケーションもしくはプロトコルのハンドル

コネクタの登録


それぞれの使用可能なコネクタは - 一旦Ciao Coreに接続し - 登録文字列を送信しなくてはなりません。
(コネクタにより送信される)登録文字列
{
"action" : "register",
"name" : "samplecon"
}

Ciao Coreは - もし設定ファイルが適当に指定されているならば - "samplecon"コネクタのためにMCUから、そして"samplecon"コネクタからMCUへの受け取りを開始します。


Ciao Coreは登録メッセージへのどんな確認文字列も提供されません。もし何か間違っていた場合はコネクタへアドバイスするだけです。

コネクタ通信


コネクタと Ciao Core の間の通信はJSON文字列を使って合意しなくてはなりません。

Ciao ライブラリはトンネルのように行動し、順序やフォーマットを維持してコネクタから送信されるものはなんでもMCUへフォワードされます。

MCUへ何かを送信したい場合、TCPで送るための位置配列で構成される"data"キーを含んだシンプルなJSON文字列を記述します:
(MCUを狙った)Ciao Coreへのメッセージ
{
"data": ["param1", "param2"]
}


もし Ciao Core がそのようなメッセージを受け入れるならば、"status"文字列を返信します:
Ciao Coreからのレスポンス
{
  "status": 1,
  "checksum": "alphanumeric-25char-ID"
}


Ciao Coreの各インタラクションは、オペレーションを明確にするための一意なアルファベット25文字のID(alphanumeric-25char-ID)を持っています。そしてコレはCiao Core(やコネクタ)が各メッセージのトラックやリファレンスの保持を許可します。

サードパーティアプリ/プロトコルのハンドリング


(例えばTwitterなどの)サードパーティアプリケーションや(例えばHTTP、XMPP、MQTTなどの)プロトコルとの相互接続はあなた好みのデザインパターンで開発することができます。


以下の項目を推奨します:

  • 可能な限り軽量/高パフォーマンスなコードを維持すること
  • 知識共有のために簡単なコメントを記載すること
  • (維持を簡単にするために)パラメータをハードコードする代わりに外部設定ファイルを使用すること

既に使用可能なライブラリ群


ciaoTools - Python

ciaoToolsライブラリは、Pythonを使って新規コネクタ開発を簡単にするためのものです。このライブラリはCiaoCoreとの通信をハンドルするスレッドを実装します。開発者はこのライブラリをインポートし、幾つかのメソッドをオーバライドした新規クラスをビルドする必要があります。


------

nameだけでなくenabledもきちんとセットしないと自分でPythonコネクタを操作しないといけなかったりするのか..

それにOpenWRT、実際はLininoOS最新版になるけど、上で10900が既に使われている状態ってことも、こころにとめておかないとなあ..


結構重要なこと書かれているなあ..


Arduino "Ciao CPU"を翻訳してみた

前回の記事の続き

Ciao CPU
http://labs.arduino.org/Ciao+CPU


だけ 翻訳してみました。
at your own risk で参考にしてください。



-----

Ciao CPU


Arduino Ciaoは、MCUのためにSketch記述がしやすいシンプルで軽量なライブラリと、ボードのCPU/MCUサイドを越えて動作するpythonで実装されたコア、の2つのパーツで構成されています。

Arduino Ciaoのこちら側のパーツはCiao Coreにより定義されます:ネットワーク・プロトコルを使った通信のために、いくつかのMPUからのコミュニケーション経由でコマンドを受け取り、ネットワーク・プロトコルやサードパーティのサービスやプラットフォームを使った通信のために、いくつかの(コネクタと呼ばれる)モジュールと相互接続する強力なソフトウェアです。

CiaoのMCU側はこの文章に説明があります。

Getting Started



Ciao コアは、全体としてモジュール化されており設定可能な状態になっています。ローカルリソース(ファイルシステム、コンソール、メモリ)と相互接続して、多くの標準的なプロトコル(XMPP、HTTP、WebSocket、COAP等)やアプリケーション(Jabber、WebChat、Twitter、Facebookなど)による通信のためいくつかの"コネクタ"が提供されています。

図→ http://labs.arduino.org/dl1271?display

CPU/MPU


Ciaoの CPU/MPU 側は Ciao コアといくつかのコネクタで構成されています。今日まで我々はあなたがイメージしている者と同等のコネクタをサポートするために開発してきました。

Ciao Core


Ciao はMCUと相互接続し、すべての組み込みコネクタを使ったルータとして振る舞うために開発されたマルチスレッドコンポーネントコアです。Ciao Coreは、コンソール(ttyATH0)のようなコンソールを使ってCPUのシリアル共有経由でMCUと通信をおこないます。

シンプルですが効果的な文字列エンコーディングは、MCUに登録済み/有効なコネクタを無制限にCPUと通信させるために開発されてきました。

Ciao Core は、MCUによって開始されハンドルされます。

Ciao コネクタ


コネクタは、JSONを使ってTCP経由でCiao Coreと通信するためのスタンドアロンモジュールです。
コネクタはあなたの好きなどんなプログラム言語でも開発することが可能です。

コネクタは2つのタイプに分類可能です:
  • managed:開始停止がCiao Coreにより管理される
  • independent:有効な場合CiaoCoreへ接続するソフトウェアを手動(もしくは自動で)開始停止する

それぞれのコネクタは、Ciao Coreが必要とする情報を提供するための設定ファイルを少なくとも1つ持っています:
 
  • コネクタ名は?
  • コネクタはenabledか?それともdisabledか?
  • どのような機能をコネクタが提供するか(読み取り、書き込み、返信の書き込み)?

そのような設定ファイルはCiao ライブラリの設定ディレクトリに格納されている:/usr/lib/python2.7/ciao/conf/

List of Connectors


既に有効なコネクタの発見やセットアップ方法の学習などは、Ciaoコネクタページをチェックしてください。

新しいコネクタの開発


上記のとおり Ciao Coreはモジュールとなるように設計されています。このように必要があれば誰でも1つ以上のコネクタを開発することができます。

コネクタは、LininoOS上でTCPプロトコルやJSON文字列をあつかえればどんなプログラミング言語を使って開発してもかまいません。これ以上の新規コネクタの開発方法やTCP経由でCiao Coreと相互接続する方法は次のページを参照してください。

------

コネクタの定義ファイル上に通信固有の情報を書き込みSketchからはciaoライブラリ経由でname値を指定して呼び出す仕組みになっている。

私が購入したArduino YunのLininoOSはバージョンが古く、Ciaoを動かすには更新しなければならない。

2016年5月18日水曜日

Arduino "Ciao" のトップページだけ翻訳してみた

Arduino Yunのドキュメントを読んでいると、Arduino社はどうもCiao ライブラリを使うことを推奨しているように読めた。
でも、Ciaoについてよく理解せず使っているのはまずかろう
と、
arduino.orgの

CIAO
http://labs.arduino.org/ciao

を勝手翻訳してよんでみた。

#ほかの翻訳同様参考にする場合は at your own risk でお願いします。




----

Ciao とは?


Arduino Ciao は、Arduino sketchに直感的な"外界"との通信を可能にする使いやすく強力な技術です。
サードパーティサービスやソーシャルネットワークなどの、大部分の標準的なプロトコルを使った様々なマイクロコンピュータ・Linino OS間の相互間通信のためのインタラクションを単純化することを目的としています。

Arduino Ciao - 以降 "Ciao"と略す - は、Sketch上で使用される正式なライブラリの一つです。

Ciaoは、モジュールとして簡単に設定できるように設計・実装されました。
システムリソース(ファイルシステム、コンソール、メモリ)とアプリケーション(Jabber、WebChjat、Twitter、Facebookなど)とのインタラクション可能なないくつかのコネクタをサポートすることがゴールです。

Ciao はMITライセンス準拠のオープンソースです:コードをよんだり、改善の議論やフィードバックの提供、新機能の開発が自由です。ソースコードはGitHub上で公開されています。

Ciao は2つのパーツで構成されています:

 Ciao ライブラリ:C言語で開発されました
 Ciao コア:Pyhtonで開発されました

図→ http://labs.arduino.org/dl1263?display&x=900&y=636

Ciao ライブラリ


Ciao ライブラリは、MCUがデータを(シリアル通信経由で)送受信するためにSketch内部でシンプルかつ直感的に使うことができる軽量ライブラリです。

動作の仕組みや設定方法をより理解するには、次のページを参照してください。

Ciao コア


"外界"との通信のために、Ciaoライブラリは、MPU(マイクロプロセッサ)サイド上のCiaoテクノロジキーコンポーネントである、Ciaoコアと相互接続します。Ciao コアは、Linino OS上で実行します。Ciao コアは、pythonで実装されており、コネクタとよばれるいくつかのモジュール経由で、"外界"との通信を可能にするよう設計されています。CiaoコアのコネクタはTCPソケットによりJSON形式の文字列を使って通信します。


Ciao コアは、このスマートかつ効果的な設計により、次のことが可能です:
 
  • 開発者が可能だとイメージしていることと同等のコネクタを使ってのインタラクション
  • Linino OS上で使用可能な言語で実装されたコネクタのサポート

Ciao コアアーキテクチャについての詳細や設定方法は次のリンクを参照してください。

Ciao のセットアップ


Ciao のインストールはとても簡単で数ステップで完了させることができます。このページを参照してください。

コントローラのリスト


既に使用可能なコネクタを探したりそれらをセットアップする方法を学習する場合は、Ciaoコネクタのページを参照してください。

動作可能なボード


Linino OS が動作する全てのボードで動作します:
  •     Arduino Yun
  •     Arduino Yun Mini
  •     Linino One
  •     Arduino Tian
  •     Arduino Industrial 101

Linino OS上でAlljoyn準拠のpytthonプログラムが動いていて、その上でコネクタ(これもpython)がSketch側のCiaoクラスで指定したもの(コネクタで定義したname文字列)動くようになっている。  

Alljoynは常時動いていて、コネクタをサポートし、それぞれのコネクタは設定ファイル内でnameをhじめとした細かな通信先ホスト名、ポート番号、必要があればユーザIDやパスワード(APIキーやSecretキー)、プロトコルへの細かな設定(MQTTならQoSとか)を記述する。

フレームワークでよく使用されるGoFのAbstract Factoryパターンで実装されているのでSketch側に細かな接続先の情報をいちいち書かなくて良い。

これはSketchプログラムが、最終的にAVRマイコン上に焼き込むため、なかなか更新することが難しいので、通信先のホスト名の突然の変更などはLinino OS上の設定ファイル変更で対応させようとしている、オブジェクト指向デザインの基本"関心の分離"を行っているわけか..

一見するとCiaoは記述する箇所がLininoOS上までおよぶので手数が増えるだけで旨味がないようにみえるが、その実IoTデバイスとして本番機動作迄踏まえた設計であるといえる。

つまり Arduino社も IoT に本気になった、ということだろう。

2016年5月9日月曜日

Arduinoシールド"Braccio"を組み立てる




スイッチサイエンスのサイトでふとこれを見つけた。

スイッチサイエンス:tinkerkit Braccio
https://www.switch-science.com/catalog/2699/

簡単にいえば腕だけのロボット。
ただし"手"の部分はカニバサミ状態。

おどろいたことにArduinoシールドで
上記サイト情報では常用している Arduino YUN でも動作するとのこと。

で、早速購入してみた。



到着したらすごくオサレな箱に入っていた(上の写真)。
しかも必要な工具
(先端磁石仕様のプラスドライバと薄っぺらなレンチ)
がはいっているため、
なにも工具がなくてもすぐに組み立てられる。



全部で6つのモータ、
目視した所だとおそらく全部同じ仕様のServoモータで
構成されたロボットだ。



モータには番号がついていて下から順番になっている(上の写真)。

デフォルト位置は、
Arduino IDE添付のサンプルプログラム"testbraccio90"を
実行し終わった状態、
すなわち
「腕、二の腕をまっすぐ真横にのばして、手を開いた」状態である。

M1:BASE
 土台内に埋め込まれていて、人間で言うと肩の部分にあたる。
 二の腕全体をを前や後ろに動かす動作に相当。
 デフォルト位置:90度
 旋回範囲:0度から180度まで

M2:SHOULDER
 土台のすぐ上に位置していて、M1同様肩の部分にあたる。
  二の腕を真横に上げたり下げたりする動作に相当。
 デフォルト位置:45度
 旋回範囲:15度から165度まで

M3:ELBOW
 M2の上に位置していて、肘の部分にあたる。
  腕をまげたりのばしたりする動作に相当。
 デフォルト位置:180度
 旋回範囲:0度から180度まで

M4:VERTICAL WRIST
 M3の上に位置していて、手首の部分にあたる。
  手首をのばしたり曲げたりする動作に相当。
 デフォルト位置:180度
 旋回範囲:0度から180度まで

M5:ROTATORY WRIST
 M4のすぐ上に位置していて、手首の部分にあたる。
  手首をひねる動作に相当。
 デフォルト位置:90度
 旋回範囲:0度から180度まで

M6:ROTATORY WRIST
 一番上の白い部品位置にあり、手(親指と人差指?)の部分にあたる。
  掴んだりはなしたりする動作に相当。
 デフォルト位置:10度
 旋回範囲:10度(開いた状態)から73度(閉じた状態)まで



組み立ては同梱のガイドに従って作業すればOK。
英語だが、図解されているので、
それほどむずかしくない。

BRACCIO QUICK START GUIDE
http://download.arduino.org/products/braccio/Braccio_Quick_Start_Guide.pdf

気をつける点は、
コネクタにシールが1~6とつけられているので、
このモータの番号を決して間違えないこと。
これを間違えてもシールドの結線でリカバーできるが、
カッコ悪いので組み直すことになる。
組み直しは可能だが、
木ネジ型なので一旦組み付けてしまうと
二度目以降の締め直しでバカになる可能性があるため、
できるだけ一発で決めたほうがよい。
そうしたのなら何度もしっかり確認をして組み付けていく。



また、ケーブルの取り回しを考えてケーブルを配置すること。
ガイドのほぼ全般ケーブル部分が省略されている。
というか、どこにも書いていない。
関節の可動部分に触れないようにケーブルを取り回すには、
組立中に完成した時のケーブル位置をきちんと想像できているか
にかかっている。
同梱には半透明のケーブルまとめる部品もついているが、
ある程度動作範囲が分かるまではこの部品は付けないほうが良い。

最後に土台の茶色い板を組み付けるが、
これはサンプルプログラム"testbraccio90"をうごかして
すべてのモータがデフォルト位置にある状態で
つけたほうが良い。

組み立ては30分位で完成する。



配線してArduino(同梱されていない)にShieldボードを刺すが
Arduino YUN/Tian の場合は
https://www.switch-science.com/catalog/2699/
にあるとおり5 VピンとVinピンをショートさせ
Shieldの5Vの足を1本Arduino側に接続しないように刺す必要がある。

ここまでできたらShield側に同梱のACアダプタを接続して通電させる。

そしてPCにArduinoをUSBで結線し
Arduino IDEを起動して
ファイル>スケッチの例>Braccio>testBraccio90
(見当たらない場合はIDE最新版をarduino.orgからダウンロードすること)
を開き、これをコンパイル&ロードする。



動作完了(上の写真)したら、
モータの角度を変えないように本体の一番下に
土台を組み付ける。


まだそれほど触っていないが、
意外と重いものはつかめないし
すべての動作は重心を考えて
動かしながらちょこちょこ角度をいじる必要がある。
場合によっては結線の取り回しなども変えないと
Arduinoごと振り回したりする(既に私も2度やった)。

あと、
動作中も動いていなくても
蚊の羽音のようなモータ特有の小さな音が出続ける。

でもさすがイタリア製、
日本製だとロボットを落ち着いたオレンジ色に塗らないでしょ。
見た目もきれいなので
IoTデモとしてこれを使う場合も見栄えがいい。

とりあえずXFDでもやってみるかな..

2016年2月26日金曜日

ブロックチェーンを勉強するためにまず用語集を翻訳してみた

Bluemix上にBlockchainなるサービスがLabに登場した。

IBM、「Bluemix」上で開発者向けブロックチェーンサービスを提供へ
http://japan.zdnet.com/article/35077990/

そろそろ「ブロックチェーン」というものを勉強しなきゃと思ってはいたのだけど、なんとなくのばしのばしにしていた。

でも、そろそろやらんとなあ..と思い、まず

Marblesというブロックチェーンのサンプルコードについている用語集
https://github.com/openblockchain/obc-docs/blob/master/glossary.md

をまず翻訳してみた。

先に行っておくと、ブロックチェーンの"ブ"も知らない超弩級ド素人が翻訳しているので、私のほかの翻訳文書と比較しても品質はとても低い。機械翻訳に近いくらいの出来だ。
なので、参考にするとしても、かなりリスクをともなうことを覚悟してほしい。

----

Roles & Personas

Roles


Chain Transactorトランザクションの生成やネットワークデータ問い合わせのためのパーミッションを保持するエンティティ。
Chain Validatorchain ネットワークのstakeを所有するエンティティ。各chain validatorはトランザクションが有効かどうか決定する投票権を持っており、それゆえchain validatorはそれらのchainへ送られるすべてのトランザクションを調べることができる。
Chain Auditorトランザクションを調べるためのパーミッションを持つエンティティ。

Participants

Solution Userエンドユーザはchainネットワークの詳細について知らない、一般的に彼らはSolution Providerによって有効可能となったアプリケーションを通してchainネットワーク上でトランザクションを開始する。Roles:なし
Solution Providerchainネットワークへアクセスするためのエンド(ソリューション)ユーザのためのモバイルや/もしくはブラウザベースのアプリケーションを開発する組織。アプリケーションオーナはネットワークオーナでもある。Roles: Chain Transactor
Network Proprietor(所有者)Proprietor(所有者)はセットアップし、chainネットワークの目的を決定する。彼らはネットワークのステークホルダである。Roles: Chain Transactor, Chain Validator
Network Auditorsトランザクションを調べるパーミッションを持つ個人もしくは組織。Roles: Chain Auditor

Business Network

Types of Networks


Industry Networkある特定の企業のためにビルドされたソリューションを提供するひとつのchainネットワーク。
Regional Industry Networkある特定の企業や地域のためにビルドされたアプリケーションを提供するひとつのchainネットワーク。
Application Network単一のソリューションだけを提供するひとつのchainネットワーク。


Types of Chains

Main Chainひとつのビジネスネットワーク;各main chainは、組織の同一グループによって認可された1つ以上のアプリケーション/ソリューションを運用する。
Confidential Chain契約投資家(contract stakeholders)によってのみアクセス可能な秘密のビジネスロジックを実行するために生成された特別な目的のchain。


Transactions

Types of Transactions

Deployment Transactionあるchainへ新しいchaincodeをデプロイするトランザクション。
Invocation Transactionあるchaincode上の一つの機能を発動するトランザクション。

Confidentiality of Transactions

Public transaction公となっているそのペイロードを持つトランザクション。chainネットワークへアクセス可能な誰もがpublic transactionの詳細を調べることができる。
Confidential transaction暗号化されたペイロードを持つトランザクション。もしトランザクションがdeployment transactionであれば、以降デプロイされたchaincodeを読んでいるすべてのinvocation transactionもまた秘密であるべきである。

Inter-chain Transactions

Inter-Network Transaction2つのビジネスネットワーク(main chains)間のトランザクション。
Inter-Chain Transactionconfidential chainやmain chainの間のトランザクション。confidential chainのchaincodeは一つ以上のmain chain上のトランザクションを起動する事ができる。

Network Entities

Systems

Application Backend

目的:
関連のモバイルや/もしくはブラウザベースアプリケーションをサポートするバックエンドアプリケーションサービス。

鍵となるロール:
  • エンドユーザの管理やメンバーシップサービスによるそれらの登録
  • トランザクション要求の開始、そしてノードへのリクエスト送信
所有元:
Solution Provider, Network Proprietor

Non Validating Node (Peer)

 目的:
トランザクションを構築し妥当なノードへフォワードする。ピアノードはすべてのトランザクションレコードのコピーを維持するのでsolution providerはそれらを内部で問い合わせることが可能である。(開発用語名:NVP - Non Validating Peer)

鍵となるロール:
  • メンバシップサービスによるユーザの秘密事項の管理と維持
  • トランザクションの構築と妥当なノードへのフォワード
  • 台帳のローカルコピーの維持、そして内部で情報を問い合わせるためのアプリケーションオーナへの許可
所有元:
Solution Provider, Network Auditor

Validating Node (Peer)

 目的:
トランザクションの構築と妥当性検証、そしてchaincodeのstate維持。
鍵となるロール:
  • メンバシップサービスによるユーザ秘密事項の管理と維持。
  • トランザクションの構築
  • ネットワーク上のほかの妥当性検証ノードでのトランザクションの実行と妥当性検証
  • 台帳のローカルコピーの維持
  • 合意による参加と台帳の更新
所有元:
Network Proprietor, Solution Provider (同一のエンティティに所属する場合)

Membership Service

目的:
エンドユーザや組織の識別の振り出しや管理

鍵となるロール:
  • 各エンドユーザや組織への登録証明書の発行
  • 関連する各エンドユーザや組織へのトランザクション証明書の発行
  • OBCエンティティ間のセキュア通信のためのTLS証明書の発行
  • chain 特定キーの発行
所有元:
Third party service provider

Membership Service Components


Registration Authority登録username、登録passwordのペアにネットワーク参加を割り当てる。username/passwordペアはECAから登録証明を取得することで利用される。
Enrollment Certificate Authority (ECA)メンバシップサービスにより既に登録されたネットワーク参加者に登録証明書(ECert)を発行する。ECertは一つ以上のネットワークに参加している個別のエンティティを特定するために使用される長期証明書である。
Transaction Certificate Authority (TCA)Ecert 所有者へトランザクション証明書(TCert)を発行する。それぞれのECertから無限数のTCertを抽出することが可能である。TCertはネット ワーク参加者によりトランザクションを送るために使用される。セキュリティ要求のレベルに依存して、ネットワーク参加者はそれぞれのトランザクションごと に新しいTCertを使うことを選択してもよい。
TLS-Certificate Authority (TLS-CA)あるchainネットワークのメッセージを渡すシステムへのTLS証明書の発行。TLS証明書はシステム間のセキュアな通信チャネルによって使用される。

OBC Entities

Chaincode

Public Chaincodepublic transactionによりデプロイされたchaincode。これらのchaincodeはネットワークのどんなメンバによっても割り当て可能である。
Confidential ChaincodeConfidential transactionによりデプロイされるchaincode。これらのchaincodeはネットワークの妥当性検証メンバ(chain validator)によって割り当て可能である。
Access Controlled Chaincode承 認されたinvokerのトークンも埋め込まれたConfidential transactionによりデプロイされるchaincode。これらのinvokerもまた、たとえValidatorでなくても、 confidential chaincode割り当て許可されている。

Ledger(台帳)

Chaincode-StateOBCはstateサポートを提供する;chaincodeはstate APIを通して内部のstateストレージへアクセスする。stateは、ロジックへアクセスするstateのchaincode機能を呼び出すトランザクションによって生成、更新される。
Transaction Listす べての処理されたトランザクションは台帳内にオリジナルフォーム(confidential transactionのために暗号化されたペーロード)で保管される、このためネットワーク参加者はアクセスパーミッションを使って過去のトランザク ションを調べることができる。
Ledger Hash台帳の現在のスナップショットをカプチャするハッシュ。トランザクションが生成されてからのネットワークにより処理されたすべてのvalidated transactionの結果である。

Node

DevOps Serviceク ライアントとそれらのノードやchainネットワークとのやりとりをAPIとして提供するノード上の正面のモジュール。このモジュールもまたトランザク ションの構築に責任を持ち、メンバーシップサービスとともに動作してすべてのタイプの証明書や暗号キーを受け取りストレージに格納する。
Node Serviceトランザクション処理に責任をもつノード上のメインモジュール。chaincodeをデプロイおよび実行、台帳データの維持、そして合意プロセスを起動する。
ConsensusSieveとよばれるOBCのデフォルト合意アルゴリズム。妥当性検証ノードにできるかぎり非決定論トランザクションを確認することを許可する「古典的な」PBFTメカニズムを拡張した、新しいアルゴリズムである。

----

と、最後まで翻訳したので、最初から読んでみるか..


2016年2月17日水曜日

FreeIPAでログインしたJenkins/Subversionで突然E200015: authentication cancelledというメッセージが出て失敗する

FreeIPAのLDAP連携でユーザ管理しているJenkinsサーバで毎晩必ず成功するジョブを仕掛けたままにしていたら、ある日次のようなログが出てエラーになってしまった..


ビルドします。 ワークスペース: /var/lib/jenkins/workspace/hogehoge_buildname
Updating http://subversion.server.local/svn/repo/default/tags/it_target at revision '2016-02-17T09:32:57.319 +0900'
org.tmatesoft.svn.core.SVNCancelException: svn: E200015: authentication cancelled
    at org.tmatesoft.svn.core.internal.wc.SVNErrorManager.cancel(SVNErrorManager.java:37)
    at org.tmatesoft.svn.core.internal.wc.SVNErrorManager.cancel(SVNErrorManager.java:32)

調べてみるとSubversionサーバ(subversion.server.local)のdefaultリポジトリへのアクセスで認証がキャンセルされているというエラーらしい..

で、調べてみたらFreeIPAをデフォルトインストールした時のパスワードポリシ"global_policy"が定義されていて、Max lifesycleが90日になっていた。

なのでJenkins上に定義していたCridentialsのアカウントパスワードを設定しなおしたら動作した..


FreeIPAをそのまま使っている場合はパスワードポリシに気をつけましょう..


と、いってもこんな初歩的な罠にゃ誰もひっかからんか..





2016年2月3日水曜日

メールによるRedmineチケットの登録をためしたら、ログにPermission deniedと表示され動かない

メールによるRedmineチケットの登録で

SELINUXenforcingであるCentOS7.2上にRedmine3.2.0とpostfix(MX)をインストールしているので、

メールによるチケットの登録
http://redmine.jp/guide/RedmineReceivingEmails/

をためしてみた。

しかし、上記リンクの「メールサーバからメールを転送」に従って設定して実行してみたら、/var/log/maillogに以下のエラー行がでて登録されない..

Feb  00 00:00:00 mail local[000000]: fatal: execvp /path/to/redmine/extra/mail_handler/rdm-mailhandler.rb: Permission denied


/etc/aliasesのパイプで/path/to/redmine/extra/mail_handler/rdm-mailhandler.rbを実行するように書いたのだけど、ファイルの実行権限やユーザ、グループ設定は大丈夫なので、SELINUXがあやしいとおもいためしに

semanage permissive -a postfix_local_t

を実行してpostfix_local_tがらみだけSELINUXPermissiveauditログにはエラーはでるが実行は許可する)にしてみたら動作した..

でも、これだとセキュリティ的に負けた気がする..

で、Permissiveを元に戻して

chcon -R -t postfix_local_exec_t /path/to/redmine/extra/mail_handler/rdm-mailhandler.rb

したのだけど、/var/log/audit/audit.log

type=AVC msg=audit(1454457948.826:11466): avc:  denied  { search } for  pid=10388 comm="local" name="redmine" dev="dm-1" ino=103065422 scontext=system_u:system_r:postfix_local_t:s0 tcontext=unconfined_u:object_r:httpd_sys_rw_content_t:s0 tclass=dir

と出てしまう..
どうもredmine/var/www/html以下ではないパスにインストールしたかったので、/path/to/redmine(パスのredmineのところだけauditログに出ている)に対して

chcon -R -t http_sys_rw_content_t /path/to/redmine

してしまっていたのが災いして、ファイルまで到達できなかったらしい..

どうもchconをイロイロ試してみたが、http系とpostfix_local_t系の二つのSELINUXドメインを共存させることはできないらしい..

とはいえ Redmine を動かすには http_sys_rw_context_t は外すことはできない..

しょうがないので、rdm-mailhandler.rb/another/path/rdm-mailhandler.rbに移動させて

chcon -R -t postfix_local_exec_t /another/to/redmine/extra/mail_handler/rdm-mailhandler.rb

して動かしたらやっと動作した..


そういや日本語の記事であまり有効な情報がなかったなあ..
SELINUXを有効にした状態で、みんな運用していないのかねえ..

Google Colab相当の環境をローカルPC上のDocker Composeで実現する

 Docker Composeの有料版に、お金を払いたくない ^H^Hが使えない ため古いゲーミングPC(GeForce3080)にDocker Composeを入れてその上のコンテナでGoogle Colab相当のノート操作ができないかためしてみた: コンテナイメージとして a...