水曜日, 4月 26, 2017

Java: アダプターを作る。

車輪を発明なんていいますよね。でも自前で直せるっていうメリットはあります。

あれ?これなんでないんだろうって思ったらネットで探してなければ作る。この精神(勢い)が大事ですね。

よく考えてみると作れる!ってのは存外いけます。作ったら仕組みが理解できます。

Java アダプターの話です。アダプターってのは addActionListener() でリスナーをつけるとき、リスナーを実装したクラスを使うのでなくてその場で内部クラス(アダプター)をつくる方法です。

機能がまとまって書けるのでコードが読みやすくなります。

この便利なアダプターですが、なぜか ActionListener のがない。

で、作りました。アダプターってなんだろうって考えたわけですね。なんかのクラスでリスナーが実装されていればいい。

これで動きます。これだけなんですね。んー なんか探すより作ったほうが早い。

こんなケースもあるわけなんですね。

土曜日, 4月 22, 2017

文字列変換:変換文字列をそれぞれ指定する

学校で習うような複雑なアルゴリズムを使う機会ってのは実際ほとんどないですね。

クイックソートを実装するなんてのはまずない。あれを一発で通せなんていう無茶な要求がありましたよね。ハノイの塔とか。

複雑であればライブラリを使う。

それでも多少は面倒なときもあります。

文字列を分割するとか。

これ、特定の文字列を変換するコードです。全ての文字列を単変換ならライブラリがありますが、各変換ごと数値を当てはめるとかカスタマイズするとなるとやっぱり書かざるを得ない。

金曜日, 4月 21, 2017

Java: タイムアウト実践編

タイム・アウト実践編です。

終わらない(かもしれない)仕事を時間制限をつけて実行します。

ここはスレッドを用いたクラスを用います。

スレッドを synchronized された関数で呼び出します。

一定時間のち interrupt() を呼び出してスレッドを終了します。


FileTask の定義です。

時間がかかるファイルアクセスをスレッドで実行します。コマンドを走らせて終了時フラグをセットします。


これで終わらない仕事は強制終了です。

木曜日, 4月 20, 2017

Java: タイム・アウト

この仕事が終わらない

なんて状態はよくあります。

終わらないなら強制終了させねばなりません。

指定時間内で終わらない仕事は強制終了する、そんな方法(コード)をお見せします。

Java で時間を指定するならスレッドを使うしかありません。

便利なクラスが提供されていますが基本はスレッドです。

行う動作を別スレッドで走らせて、指定時間が来たら interrupt() をかけます。

月曜日, 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 の良さといえば、省電力で省スペース、低価格であること。活用しましょう。

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

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