ラベル Java の投稿を表示しています。 すべての投稿を表示
ラベル Java の投稿を表示しています。 すべての投稿を表示

日曜日, 1月 27, 2019

Scala: BigInt で階乗を計算する

Java の BigInteger の扱いは面倒です。すべての演算が関数形式で引数を指定しなければならないのでとても不便です。オペレータ演算子を定義できない安全志向 Java の弱みでもあります。

Scala ならその心配はありません。何の躊躇もなく演算子を書き換えれば独自の世界が展開します。BigInt の扱いも自然です。オペレータ演算子をほぼすべてそのまま使えます。いわゆる中置記法(infix)で書けるので読みやすくデバッグしやすいコードが書けます。

Java: BigInteger で階乗を計算する では Java の BigInteger で階乗を計算するコードを載せました。Scala で書いたのがこれです。これだとなんか特記すべきこともないです。



比べてみれば利点は明らかです。言語設定がプログラミングの効率をどこまで上げるのか、現場を顧みない世迷いごとは「プログラミング言語はどれもC言語が基本だから(!)、基本構造が同じなら書けることは同じ」これで論破できますね。

水曜日, 4月 26, 2017

Java: アダプターを作る。

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

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

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

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

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

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

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

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

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

土曜日, 4月 22, 2017

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

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

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

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

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

文字列を分割するとか。

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

木曜日, 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アルゴリズムというのがあります。ランダムなデータを減衰させながら一定の間隔でフィードバックしてやると音階となり、弦をはじいたような音がする、というものです。

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

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

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

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

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

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

水曜日, 6月 29, 2016

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

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

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

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

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

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


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

金曜日, 11月 20, 2015

EPUB形式で電子本を作る

アドビ社の迫害をものともせずオープン規格EPUB電子本を作るとここで宣言。

mimetype
META-INF/
 container.xml
OEBPS/
 content.opf
 toc.ncx
 xhtml file

できた。が自前のJavaアプリで圧縮する必要があった。こんな感じです。

木曜日, 6月 11, 2015

コマンドラインでシカゴの気温を調べる(Java で JSON データを読む)

なんと、近々発表されるはずの Java 9 から JSON ライブラリが外されてしまいました。

これは、政治ですね?(笑・XML派の妨害ですね。)

JSON ってコンパクトですよね。名前なしの{}(中括弧)を使うところが XML 形式より多少なりとも不確実ではあっても記述が短くて済むわけです。

openweathermap サイトのデフォルト設定は JSON 出力です。



このサイトは天気情報を提供してくれます。都市名とかを URL で送ってやると天気情報を返してくれます。

そこで、「ねえ、パーサーを書いたら?」とかいう余計な手間をかけたくない忙しいプログラマのため org.json.simple ライブラリの使い方を紹介します。

まず JSON.simple JAR ファイルをダウンロード。


データを読み込むプログラムの手順を示します。

  1. まず、JSONParser オブジェクトをインスタンス化。
  2. URL オブジェクトから InputStreamReader、BufferedReader をインスタンス化。
  3. JSONParser.parse() でパース。
  4. あとは JSONParser.get() で要素を読んでいくだけです。
  5. ネストされている要素であれば、JSONParser オブジェクトとして扱う。


あとは、JAR ファイルとコンパイルするだけ。

javac -classpath "JARファイルのあるディレクトリ;." WeatherApp.java
これで、コマンドラインからシカゴの気温が検索できます。

火曜日, 2月 24, 2015

Java: 楕円銀河

銀河系ってのはさまざまな形をしていますが、楕円形ってのがもっとも多いわけです。

楕円形のつぶれかたで記号までついてるわけですね。

E0 から E7 まであるわけですが、E0 がもっとも丸い。E7 がつぶれた形をしている。



こんなのを Java でインタラクティブで動かせたらいいかな、というんで書いてみました。

そのままコンパイルすると動くはずです。です。


火曜日, 1月 13, 2015

Java: BigInteger で階乗を計算する

自然数ってのは限りがありません。もし上限 n があったと仮定すると、 n+1 が整数、これは矛盾します。よって上限はない。数学ってのは証明ができていいですね。

ところがいざプログラムで実装となるとガラスの壁ってのがあるわけです。ご存じのとおり整数型の上限は64ビット long で -9223372036854775808 から 9223372036854775807。

これだともっと大きな整数は扱えません。そこで、Java では整数を抽象化し、BigInteger として制限のない整数を表現します。

この BigInteger、四則演算は揃っているのですが、演算メソッドが限られていて、階乗がありません。いちいち定義すればいいわけですが、こんなところで立ち止まっていては世界が見えてこない。

そこで、BigInteger で階乗を計算するコードを載せておきます。



この階乗を使うと、組み合わせなど計算ができます。階乗で定義されるやつですね。



実はこの組み合わせ、再帰で定義できます。パスカルの三角形といわれるやつです。



証明はこちら。

水曜日, 4月 09, 2014

Java:バイナリ表示

Java でバイナリを表示するには、toBinaryString()関数を使うと簡潔に表現できます。

水曜日, 3月 19, 2014

Java 8: ストリーム

Java 8 では文字列をストリームとして扱うことができます。

ストリームにフィルターを追加し、要素を選択することもできます。

下記のコードでは要素の文字長を指定し、表示するものです。

下記のコードは要素の頭文字を指定し、表示します。

Java 8: ラムダ式

Java 8 が正式にリリースされました。

ラムダ式が導入されるということで、さっそく試してみました。

ラムダ式とは関数を抽象化したもので、コンパクトにコールバック関数の引渡し・定義ができます。

ラムダ式のフォーマットですが、

 (引数) -> 定義

となります。Lisp などとは異なる形式ですが、内部クラスなどと比較して簡潔にコールバック関数が定義できます。



土曜日, 12月 14, 2013

Java: 列挙型 enum を switch文で使う

Mandelbrot
列挙型 enum は Java5 で導入されました。

public enum Periodic{PERIODIC,PREPERIODIC,NONPERIODIC};

名前を付けて、識別子を列挙します。

この値を変数に代入するには、静的に定義された変数として扱います。

 Periodic periodic=Periodic.NONPERIODIC;


列挙型変数名を指定する必要があるわけです。

ただし、switch文で使う場合には指定しません。

switch(isPeriodic())
            {
            case PERIODIC:
                System.out.println("f is periodic.");
                break;
            case NONPERIODIC:
                System.out.println("f is not periodic.");
                break;
            case PREPERIODIC:
                System.out.println("f is pre-periodic.");
                break;
            }

気を付けましょう。

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

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