月曜日, 3月 27, 2017

Quartz で定期処理: Job へ値を引き渡す方法

プログラムを一定時間ごと走らせたい場合、スケジューラーを使います。

シェルスクリプトなどで走らせる方法もありますが、異質なものを組み合わせるのは限界があります。

Java で書けるスケジューラーで、Quartz なる優れた(ちょっと癖のある)ライブラリがあります。

Quartz の使い方はネットでもあがってますが、自前の Job を走らせたいときつまづきやすいのが Job へ値を引き渡したいとき。

ネットであまり記述がなかったので書きます。

このさいコンストラクタを使って値を引き渡す方法はx(だめ)です。

ここは .usingJobData(String, String) を用います。


受け取る側は JobExecutionContext から getJobDataMap() を使って受け取ります。

土曜日, 3月 11, 2017

Java でログを出力:slf4j+logger

Jar 実行形式ファイルではコンソール入出力が使えません。コンソールが使えずともファイルを使う便利な方法があります。ロガーを使う方法です。

そうでなくともログは重要です。デバッグでなくともアプリのトレースが必要な場合は多いです。

Java でログを出力するための便利なライブラリは多種さまざまありますが、そのなかでも slf4j+logger なる方法が便利です。static で Logger を定義できて、出力形式を XML で指定できます。

必要な jar ファイルは以下の通りです[*]。

logback-classic-1.2.1.jar
logback-core-1.2.1.jar
slf4j-api-1.7.24.jar

必要最小限なコードを示します。


出力用のログファイルの設定は logback.xml で。


こいつは奥が深いです。ライブラリのソースの規模を見ると圧倒されます。


ログのレベルは error>warn>info>debug>trace などあります。デフォルトではファイル出力はすべて、標準出力はデバッグレベルまで。レベルごと分けておくと便利です。

Apache Commons CLI: Java でコマンドライン処理

JavaをWindows上で使うのはだからちょっとした障壁をクリアせねばなりません。この種の困難は「世界市場を独占するマイクロソフトへモノを言っているんだ」ぐらいのノリで立ち向かう必要があります。

ですからJavaでコンソールアプリってのはどうしても多少の困難を覚悟せねばなりません。コマンドライン処理など想定されていないわけです。

プロパティファイルで初期化パラメタを設定なる方法がありますが、昔ながらの伝統的スタイルを継承し、クラシックなノリでコマンドライン引数なるものを使うとプロパティなどというものを使わずまるでUnix/Linux/Gnuのコマンドのようなプログラムが書けます。

ここは外部ライブラリを使うのがオススメです。Apache Commons CLI を使う方法を示します。

Java: jar 実行ファイルをつくる

Windows で動く Java の実行ファイルを作るのは手間がかかります。

マイクロソフト社の陰謀ですね。ちょっとした関税外障壁があるわけです。

まず、そのままjavacでコンパイルしてもclassファイルができるだけです。ライブラリを組み込んで動いても、とっても不便なディレクトリ構造は動かせない。

ここは jar ファイルの作り方を工夫すれば動きます。プロジェクトを右クリック、Export からダイアログで Runnable JAR file を選択します。



或いはライブラリを組み込んでマニフェストファイルを設定し Main-Class を設定します。これだってかなりな手間ですが、話はこれで終わらない。


出来上がった jar 実行ファイルがエラーも出さず動いたと思えば動かしているのはjavawでjavaです。つまりコンソールアプリは動かない。出力はまったくなしです。

どうしてもコマンド一つで動く jar 実行ファイルを作りたい場合。copy コマンドでバッチファイルをコピーする裏技があります。

火曜日, 2月 28, 2017

Java の enum 列挙型の変数名を値から逆引きする

Java の enum 列挙型は値を設定せず列挙するだけで値を設定してくれる優れ
モノです。

Java の enum は C/C++ のより拡張性があってもっと便利です。

変数値から要素名を得る「逆引き」などという動作は、enum の一部として定義できます。



values() を使えば列挙型の設定されたすべての値を得ることができます。

 便利な Java の enum 列挙型ですが、得られた配列から値を得てももとの値を得ることができない。ようです。

あるのは ordinal() 関数のみ。これだと順番が出てきます。

設定された変数へ値を代入する、あとはメンバ関数を自作するなどいう方法が巷ではあるようですが、これだと列挙型である意味がない。並べておいて代入しなくていいのが列挙型の利点です。

???な Java の enum 列挙型ですが、そもそも最初の設計でなかった機能です。なにか考えがあるのかも。

値を設定しているのでない、順番があるだけだ、ってことでしょうか。

水曜日, 2月 22, 2017

Struts: web.xml がない場合

故あって Struts なるものを使ってます。

温故知新ならぬあらためて再評価ってところでしょうか。

データ管理がOOP!

受け渡すパラメタがカプセル化!

いいですね。ですが

ページ遷移はアクションが管理!つまりJavaファイルからは見えない。

つまり xml ファイルが問題重要なわけです。これが脳内で構成できればシステムが見える... これらの犠牲を払うとJavaのすべての機能を使える。
これはまりました。
web.xml が読み込むクラスを指定するわけなんですが、明示的な指定はないわけです。

ログなぞながめても何も書いていない。

サーバーの管理画面だと「running」でプロセスはなし。
結論をいうと web.xml が迷子だったわけなんですが... それだけです。

月曜日, 10月 17, 2016

Karplus–Strongアルゴリズム

Karplus–Strongアルゴリズムというのがあります。ランダムなデータを減衰させながら一定の間隔でフィードバックしてやると音階となり、弦をはじいたような音がする、というものです。

ほんとかよ、というノリで音を合成してみました。これが案外きれいな音が出る。ハープシコードのような音が出ます。

ハープシコードの曲を聴きながらどんな旋律を弾かせようか考えたのですが、ここは純粋かつ簡素なかの曲を弾かせてみました。

この曲がいつまでも平和のシンボルであってほしいですね。

終わらないイラク戦争でミサイルで総攻撃をかけ、殺戮と破壊の「イラク軍」(+同盟軍)へ喝采を送る市民とかいうどこかの病んだ軍事大国はよくないと思います。

戦争でないと解決しないような不安定ないどうしようもない状態で、殺戮と破壊で即片が付くかといえばそんなことはありえないわけですが、後先考えない。目的が選挙であれば勝てればいいわけですね。イラクがどうなろうとそもそもイラクのためなのか議論さえなされない。

イラク戦争を終わらせるというのはそのものがスローガンだったのですが、戦争というのは始まると終わらない、わけですね。

土曜日, 10月 15, 2016

Arduino: 温度・湿度データロガー

ロボットを作るっていうのはエンジニアとしてはかなり究極な夢だと思います。

人間の能力を超えていてもいいんですが、発想というのはどうしても考える人間を基準としてしまうんですよね。

人らしさを備えたロボットっていうのは理想っぽいんではないかと思います。

あまり人間らしいと気味悪がられるわけですが、ちゃんとした研究があって、適度な人らしさというのがいいんだそうです。

でもここはロボットを作る(日本の)技術は人助けだといいたいですよね。

最新科学技術の粋であるところのロボットで人間らしさを取り戻す。

ここのところ米メディアで騒がれているロボットアームの技術というのがあります。

 まひした手にロボットアームで触覚を取り戻す! 米国防総省の研究機関が実験に成功

精巧なロボットアームと脳をつなぎ、失った腕の感覚を取り戻すという画期的な技術なわけですが、いいですね。

こういう研究があって、しかも政府とメディアが取り上げてくれる。エンジニアとしてはありがたい存在だと思います。



夢を大きく持ったところで、しまってあった Arduino を取り出して、温度・湿度データロガーを作ってみました。

... ちょっと格差が大きいですね。でもちゃんと出来たのでアップします。

土曜日, 7月 09, 2016

Arduino: 赤外線距離センサー


赤外線距離センサーとは、赤外線LEDとフォトトランジスタを組み合わせ、反射してくる赤外線を測ることで距離を測るものです。



距離センサーというと超音波を使うものなどありますが、赤外線距離センサはまとめて売られている赤外線LEDとフォトトランジスタさえあればそのままセンサが量産できます。

LEDへの電流を制限する抵抗の値が小さいと発熱するので気を付ける必要があります。

人間の目は赤外線を検出できませんが、CCDであれば赤外線LEDが光っているのが分かります。



このセンサをモジュール化してみました。以下使ってみて気づいたことです。



このセンサは計測する物体が赤外線を反射しなければ使えません。白っぽければ反応しますが、そうでなければだめです。それはまだいいんですが…

このセンサーは赤外線を検出する方式ですので、赤外線がどこかほかからくればそれで反応します。つまり、太陽光のもとでは使えないってことです。

ライン・トレーサーなどで使われるのがこの赤外線距離センサーです。目的が限られてますね。注意しましょう。

木曜日, 7月 07, 2016

C++: べき集合の要素を数え上げる

べき集合というものがあります。部分集合の集合というものなんですが、べき集合の要素を出力するプログラムを書いてみました。

原理は簡単です。要素が n 個あるとして、含まれる場合を1、含まれない場合を0とすると

0 0 0
1 0 0
0 1 0
1 1 0
0 0 1
1 0 1
0 1 1
1 1 1

これで完全な数え上げとなります。シフト演算子とか論理ANDとかを使うと、要素の数え上げができるわけですね。

では{ドイツ、フランス、英国}という集合を考えてみましょう。べき集合はこんなふうです。

{ }
{ Germany }
{ France }
{ Germany France }
{ United Kingdom }
{ Germany United Kingdom }
{ France United Kingdom }
{ Germany France United Kingdom }

すべてのケースを考えるというのはこの小さな集合だけでも大変ですね。

じゃあ、もう少し増やしてみましょう。イタリアとオランダ、スペインを加えてみました。

{ }
{ Germany }
{ France }
{ Germany France }
{ United Kingdom }
{ Germany United Kingdom }
{ France United Kingdom }
{ Germany France United Kingdom }
{ Italy }
{ Germany Italy }
{ France Italy }
{ Germany France Italy }
{ United Kingdom Italy }
{ Germany United Kingdom Italy }
{ France United Kingdom Italy }
{ Germany France United Kingdom Italy }
{ Netherlands }
{ Germany Netherlands }
{ France Netherlands }
{ Germany France Netherlands }
{ United Kingdom Netherlands }
{ Germany United Kingdom Netherlands }
{ France United Kingdom Netherlands }
{ Germany France United Kingdom Netherlands }
{ Italy Netherlands }
{ Germany Italy Netherlands }
{ France Italy Netherlands }
{ Germany France Italy Netherlands }
{ United Kingdom Italy Netherlands }
{ Germany United Kingdom Italy Netherlands }
{ France United Kingdom Italy Netherlands }
{ Germany France United Kingdom Italy Netherlands }
{ Spain }
{ Germany Spain }
{ France Spain }
{ Germany France Spain }
{ United Kingdom Spain }
{ Germany United Kingdom Spain }
{ France United Kingdom Spain }
{ Germany France United Kingdom Spain }
{ Italy Spain }
{ Germany Italy Spain }
{ France Italy Spain }
{ Germany France Italy Spain }
{ United Kingdom Italy Spain }
{ Germany United Kingdom Italy Spain }
{ France United Kingdom Italy Spain }
{ Germany France United Kingdom Italy Spain }
{ Netherlands Spain }
{ Germany Netherlands Spain }
{ France Netherlands Spain }
{ Germany France Netherlands Spain }
{ United Kingdom Netherlands Spain }
{ Germany United Kingdom Netherlands Spain }
{ France United Kingdom Netherlands Spain }
{ Germany France United Kingdom Netherlands Spain }
{ Italy Netherlands Spain }
{ Germany Italy Netherlands Spain }
{ France Italy Netherlands Spain }
{ Germany France Italy Netherlands Spain }
{ United Kingdom Italy Netherlands Spain }
{ Germany United Kingdom Italy Netherlands Spain }
{ France United Kingdom Italy Netherlands Spain }
{ Germany France United Kingdom Italy Netherlands Spain }

そうですね。どのような通商交渉が成り立つでしょうか。

では極め付け、EUが存在しないと仮定して、EU加盟国の各国のそれぞれ組み合わせを考えたとします。

と、書きだそうとするとファイルの大きさがギガを超えてきたのでギブアップです。

組み合わせを考えるとなんと 268435456 となります。

これを考えるとEUのフレームワークってのは偉大ですね。

あらたな世界秩序ってのをつくろう、ってのは無謀じゃないでしょうか。

水曜日, 7月 06, 2016

C++: 逆ポーランド記法

数式の表現方法で、ポーランド記法ってのがあります。

普通の数式では

a + b

と書くところを、演算子(プラス記号)の順序を変えて、

+ a b

と書きます。

これだって数式は表せるわけですね。Lisp などでは (+ a b) となります。

+ + a b c

これだと、どうなるでしょう。

a + b + c

こうですね。

逆ポーランド記法というのあります。逆ポーランド記法であると、a + b が

a b +

となります。日本語だと思えばいいんですね。「a と b を足す」という形です。

a b c + +

これだと、「a と b と c と足して、また足す」となります。

以下は、逆ポーランド記法の数式を処理するプログラムです。

→  reverse-polish-notaion

#括弧の処理を追加しました。(2016-07-10)


月曜日, 7月 04, 2016

g++: テンプレートを使う場合の分割コンパイル

テンプレートを使う場合、実装を別ファイルで行うとややこしくなります。

こんなテンプレートを使うヘッダーファイルがあったとします。


ここで、別ファイルで実装します。


このヘッダーファイルをインクルードして、別ファイルで呼び出すとリンカがエラーを出します。


ヘッダーファイルで実装すると問題は解決です。

水曜日, 6月 29, 2016

C/C++ GMP ライブラリを使う(Java でいう BigInteger です)

とても大きな数を扱うとき、Java では BigInteger などを使うと制限なしです。しかも標準装備。

ここで扱いたい大きな数というのは、ほかでもないメルセンヌ素数です。とんでもなく大きな数となるのでどうしてもライブラリを使う必要があります。

ほかでもないというのは、メルセンヌ素数という形であれば素数であるかの判定が容易という理由から、発見された最大の素数はメルセンヌ素数であるからです。

このプログラムをCで実装しようとすると、GMPなど外部ライブラリが必要となります。GMPを使ったソースです。

このプログラムもC++を使うと分かりやすくなります。初期化、後始末などコンストラクタ、デストラクタで書けるからです。


C#だとこんな感じでしょうか。

火曜日, 6月 21, 2016

Arduino ISP: ATTiny13A でサイコロを回す



ATtiny13A でサイコロを回そうと思えば rand() 関数が大きいようです。ここは自分で組まねばなりません。

乱数といえば線形合同法だと思えば、Xorshift なる計算方法が流行ってるんですねえ。

高速かつ長周期、じゃあということで Xorshift へ乗り換えて作ってみました。

マシンで合成する疑似乱数ってのは「疑似」乱数なのであってパターンが決まっています。ある一定の周期を持つわけです。長ければ長いほどいい乱数です。あとは出てくる値が均一でないとなりません。

メルセンヌ・ツイスタをすすめる向きもあるようですが、ここでは Xorshift で。

あとシードが必要なんですが、タイマーを使ったりメモリを読んだり、空ピンの値を読んだりするのがベスト・プラクティスなようです。ここではスイッチでの割り込み時のカウンタの値を使ってみました。

金曜日, 6月 17, 2016

Imref とは?(フェルミ準位の話です)

英国のEU脱退の話ですね?

EUが崩壊するのか、英国が崩壊するのか。西洋社会が崩壊するのか。

世界経済が崩壊するとなんですがね。

規制緩和、プライマリーバランス。官僚の無駄遣い。よく理解できますよね。EUってのね。

しかしですよ、英国がEU脱退すると影響力とかってなくなるわけですよね。

突っ走るEUとか、米国のポチと成り果てる英国とか。

閑話休題。

オンラインで電子工学の授業を視聴していたら、imref って単語が出てきました。

新しい単位でも定義したのかと思うと、この単語よくよく見てみると...

Fermi だっていうんですよ。フェルミ準位の Fermi です。で、imref が何かといえばこの Fermi の逆。逆読みだっていうんですね。

分からないものですね。一見まったく別の単語としか見えない。疑フェルミ準位を表すものだそうです。不純物が入るとフェルミ準位がずれるのでその値です。

ということで、文字を反転するプログラムを書いてみました。

まずは Elisp で。

こちらは C++(g++)。

ついでといえばなんですが、じゃあということで反転だけじゃなくて文字列をスクランブルするプログラムを書いてみました。



乱数を計算する回数を減らすよう乱数を出してからはじくのではなく、必要な分だけ計算し文字列から選んでいます。

金曜日, 6月 03, 2016

Arduino ISP: ATtiny 割り込み・PWM

Arduino ISP を使うと ATtiny13A をそのままプログラムできます。そのままというのは、Arduino IDE を介さないでってことです。ライブラリを使わず書くと、プログラムサイズを小さくできます。

pinMode(), digitalWrite() などは使えず、マイクロコントローラのレジスタなど設定せねばなりません。pinMode() は DDRB レジスタ、digitalWrite() は PORTB などのレジスタを設定することで実装できます。

割り込みなどは MCUCR, GIMSK レジスタを設定し、割り込みを許可せねばなりません。

参照:ピン入力と割り込み


ATtiny13A では PWM 出力が可能ですが、これも TCCR0A, TCCR0B レジスタを設定し、デューティ比を OCR0A, OCR0B などで設定します。


参照:PWMについて調べて、リモコン信号出力してみた。(ATtiny13A) 


ATtiny13A の良さといえば、省電力で省スペース、低価格であること。活用しましょう。

日曜日, 5月 29, 2016

Arduino as ISP: ATtiny13A ヒューズ・リセッター

ATtiny13A というマイクロコントローラICがあります。

このたびこいつを Arduino でどうにかプログラミングすることができたので経緯を記しておきます。すったもんだしたあげくいろいろなものを壊した気がします。というのは、ヒューズの設定で動いてくれなかったからです。

わかってみるとなんですが、この入手したチップ、内部クロック用ヒューズが工場出荷時の値(0x6a, 0xff)ではなかったわけなんです(データシート)。これが原因だと分かるまで時間がかかりました。まずは表面実装部品を使ったのが苦労の発端。

使い慣れない部品を使って新しいことをやろうというのは不確定要素が重なって原因への追及への困難が増します。気を付けましょう。SOP8変換ボードが悪いのか、はたまた設定のせいなのか、そもそも不可能を試みているのかわからないからです。

自作のヒューズ・リセッタ


結論をいうと、Arduino IDE 1.6.x で ATtiny13A をプログラムすることができました。ただし、ヒューズのリセッタを作成する必要がありました。以下のサイトを参照させていただきました。

Arduino UNOでATTiny開発してるときに書き込めない!AVR壊れた!?その前に
Attiny13をArduino化 ついでに外部クロック
AVRマイコンを Arduino-IDE 1.6.x で使用する方法

リセットされれば標準的な?やり方でプログラムできます。

まず File | Examples | 11. ArduinoISP メニューから ArduinoISP をアップロードします。ロード出来たらライタ・シールドを接続し、ATtiny をセットします。青いLED が点滅すれば準備ができています。Tools|Board を ATtiny13 、Tools|Programmer を Arduino as ISP を設定します。そしてプログラムをアップロード。


Attiny 自作ライタ・シールド

ATtiny13A でフルカラーLEDを動かしてみました。


月曜日, 5月 23, 2016

Arduino: チップ部品を使う・時計を動かす

挑戦してみました。表面実装(チップ部品)。安い、小さい、軽い、将来性ってことで、使えなきゃいけないとは思ってはいたのですが、変換ボードさえあればブレッドボードで動きます。


まずは変換ボード。これがないと始まらない、というか部品が宝の持ち腐れとなってしまいます。この変換ボードが今日やっと届きました。待ち遠しかったですね。


こいつの作り方のコツはきっちり手順を踏むことですね。手順を踏まないといろいろ壊れます。まずピン足への線が細かくて切れます。パターンが熱で外れます。ブリッジができます。なんかいくつも壊した気がします。

以下手順です。

ブレッドボードを利用してピン足をはんだ付けする。これで固定できます。はんだをチップ部品のパターンへ薄く流す。チップをピンセットでつかみ、薄くついたはんだを溶かしながらチップを固定する。

薄くはんだを置いて部品を固定し、ブリッジができないよう各ICピンをはんだ付けしていくわけです。ここは細かい作業なので神経を使います。導通チェックでよくよく見ていくとつながってなかったなんてことがあるわけですね。接続はきちんと調べましょう。

このSOP8のICは時計用のICで、時計用のクリスタルを接続すると時計として使えます。プロトコルが特殊ですが、Arduino 本家のサイトのコードを使うと時間をきちんと読み込んでくれました。

これでチップ部品が使えます。

土曜日, 5月 21, 2016

(Arduino): ESP8266 を USB シリアル通信変換器 FTDI でつなぐ

WiFi モジュール ESP8266 というのがあります。無線LANとつなげるというのがウリですが、Arduino との連携がよくない。ともかく USB シリアル通信変換器 FTDI で PC とつないでみました。


ESP8266 のピン配置は以下の通り。

Rx Vcc
GPIO Reset
CPIO CH_PD
GND Tx

あとは FTDI と WiFiモジュールをつなぎます。





長足のピンヘッダーを使うとうまくブレッドボードを使えます。

Vcc, GND
Rx - Tx
Tx - Rx
pull-up CH_PD

PC とつなぐにはまず FTDI のドライバをダウンロードします。

 
あとこれ引っかかりやすいですが、デバイスマネジャーで通信速度を設定します。

Arduino IDE を立ち上げて、ポートを設定、シリアルモニターを起動して通信速度を設定し、モジュールをつなぎます。

AT とコマンドを打つと OK と返ってくるはずです。
 

画像は AT+GMR コマンドの結果を示しています。

水曜日, 5月 18, 2016

Arduino: シリアル通信(IIS)

Arduino Uno はそこそこピン数があります。7セグでもつなげてしまうほどピン数が多いわけですが、線の多いのは困りものです。場所を取るし配線がやっかいです。配線が多いのはうざいってだけではなく、配線を調べねばならないというだけで作ろうという雰囲気をぶち壊してくれます。

そこでシリアル通信なる方法を使います。効率よくデータを送受信できます。Arduino 用モジュールとして売られているセンサーなどはそもそもシリアル通信でのみ通信できるようなものも多いです。

先日頼んでおいた加速度センサーでシリアル通信(IIC)を使ってデータを読み込んでみました。Arduino 標準の Wire.h ライブラリを使ってアドレスを指定し、データを読み込みます。配線は Vcc (5V), GND, SDA (Pin 4), SCL (Pin 5), CS (5V)。


アドレス、モード指定、レジスタ番地などはデータシートなどを参照する必要があります。ここで引っかかったのはモード指定で、データシートを見ても指定しなければならないということがなかなか読めない。

書き込みは多いモジュールなので、どうやら動くよう設定することができました。以下コードです。

Flask の Blueprint のテンプレート問題

  Flask の Blueprint は、ルート、静的ファイル、テンプレートをまとめて管理できます。しかし、テンプレートが指定できません。 ここでは、Blueprint の template_folder の問題点と回避策を説明します。 Blueprint のテンプレート問題...