Java

プロセス置換を使ってjsvcの標準出力をローテートする。

jsvcの起動オプションの-outfile/-errfileにファイルパスを指定すると、そのファイルに標準出力/標準エラー出力を吐きだすようになる。但しこのファイルは普通にはローテートされないので、何らかの方法でローテートするようにしたい。例としてTomcat6以降 +…

JavaでOutOfMemoryErrorを出す方法

お題: 結合テスト中のシステムで、OutOfMemoryErrorが発生しました。UT後ソースコードの変更はしていません。ヒープメモリは足りているようです。原因として何が考えられますか?(筆記解答) 8つの質問で、Java SI業界の現状を知る - レベルエンター山本大…

Javaで状態モナド

そろそろモナド変換子のことを覚えたいなーと思ったものの、見つけたサンプルが状態モナドを例にとっていたので、学習の準備としてひとまず状態モナドの実装を写経してみることにした。Javaで。参考にするページ: 状態モナド遊び - あどけない話 Stateモナド…

Apacheのアクセスログを再生する

前に作った「http://d.hatena.ne.jp/terazzo/20090201/1233442194」のクラスの一部を使って、アクセスログの中身をリプレイするプログラムを書いてみた。 GitHub - terazzo/CustomLogTool: CustomLogTool ガラケーサイトで端末プロファイルを分散させつつ負…

確実に一定時間スリープする

Javaで、例えば通信エラー時のリトライ間隔を確保したい場合などのように、一定時間処理を停止したい時はThread.sleep()を使ったりすると思う。 // 三秒間待機する(なんだか問題のある実装!) public void waitForThreeSeconds() { try { Thread.sleep(3 * 1…

JavaでReaderモナドでテンプレートエンジン

前に作ったReaderモナドを使ってテンプレートエンジンを実装するよ。 といっても「The Reader monad」にあるサンプルを写経しただけ。 テンプレートの実装 サンプルを見るとこうなっている - これはテンプレートの抽象構文表現です -- Text Variable Quote I…

JavaでTree Iteratorいろいろ

前回ラーニングしたTree Iteratorで、過去に書いたツリー構造を外部イテレータにするコードを書き直した。 こりゃシンプル。 黒歴史: ツリー構造用の外部/内部イテレータの実装 - terazzoの日記 http://d.hatena.ne.jp/terazzo/20090308/1236526403 ノードに…

Javaでプリキュア冪集合(DX3)

お題: プリキュア冪集合(DX3) - rna fragments べき集合ということは、各要素について選ぶか/選ばないかの組み合わせを全通り数え上げたものってことで、つまり二分木をトラバースする問題だな。 「『ある金額になるコインの組み合わせ』 に挑戦 - コードの…

JavaでReaderモナドでFizzBuzz

例のごとく「All About Monads」を読んでたら、Readerモナドでテンプレートというサンプルが載っていたので、テンプレートエンジン厨としてはこれは是非会得しておきたい。 がしかし、内容がイマイチよく分からないので、とりあえず練習で写経してみた。 Rea…

スタックトレースとして FizzBuzz を出力

「型エラーとして FizzBuzz を出力 - EAGLE 雑記」見て連想。 Javassistを使ってます。 Javassist直接使ったの初めてだけど、楽でいいなあ(ASMに比べて。) package sample.fizzbuzz; // depends on javassist-3.15.0 import javassist.*; public class FizzB…

JavaでWriterモナドでFizzBuzz

「All About Monads」を読んでたら、前に書いたFizzBuzzが実はWriterモナドであることに気がついたのでそれっぽく書き直してみた。 しかし自分のような素人が考え付くような単純なモナドは大体「標準的モナドのカタログ」の中のどれかになってるような。本当…

Javaで非決定計算

「http://d.hatena.ne.jp/keyesberry/20110831/p1」によると、RubyにはAmbという非決定計算をおこなう為の拡張モジュールがあるらしい。 Javaでもやってみた。 Javaではカレント継続のキャプチャ機能が言語レベルでサポートされてないので、前に作った継続モ…

文字列変換処理の合成

自社で共通で使ってる全角→半角の文字列変換のプログラムが遅いので中身を見てみた。 中身見てみると、以下のようにラテン文字の変換とカナの変換を合成していた。 public static String zen2Han(final String p) { return kanaZen2Han(latinZen2Han(p)); } …

Javaで「ある金額になるコインの組み合わせ」

お題: ある金額になるコインの組み合わせ数とその組み合わせを全て答え下さい。条件) ・コインの種類は自由に設定できるようにする。 ・順序が違うだけのものは一つの組み合わせとする。 (例:16の組み合わせで、[1, 5, 10]と[10, 5, 1]は同じ) やってみ…

続・Javaで継続モナド

少し使い方が分かったら書いてみる。 継続モナドのCpsクラスは前回のものベースにする。 この辺がとても参考になった。ほぼ写経……*1 http://d.hatena.ne.jp/einblicker/20110319/1300525656 call/cc 入門 (Coroutine with call/cc) - MAYAH breakとcontinue …

Javaで継続モナド

実践Scala読んでたら継続モナドのこと理解出来そうな気がして来たので実装してみた。Javaで。 やれそうな気がする時は、やれる! この辺がとても参考になった。 Haskellの継続モナド(Continuation Monad)を理解するポイント - よくわかりません howm wiki - …

Javaでチャーチ数

「関数型のテンプレートエンジンで計算 - terazzoの日記」でテンプレートエンジン上でチャーチ数を使って計算してみる際に、どうにも内容が理解できずに詰まったので、Javaで実装してみた。 プログラムとしての動きをつかむことが目的なので全部をλで書き下…

続・続・比較モナド〜復讐編〜

もういい加減飽きてるだろうけど続けるよ。今日は比較モナドについて復讐するよ。 ソースコードは抜粋なので全部を見たかったらここ見てください。 事のいきさつ ◆ 「http://d.hatena.ne.jp/terazzo/20110526/1306434704」で「比較条件」のチェーンってモナ…

JavaでモナドでFizzBuzz〜復讐編〜(Re:数値のFizz、Buzz等への変換を、Javaで通常より直感的に表現したい)

以前作った「数値のFizz、Buzz等への変換を、Javaで通常より直感的に表現したい - terazzoの日記」の焼き直しですよ。 事のいきさつ ◆ id:sumim様が、「数値のFizz、Buzz等への変換を、Smalltalk(とRuby)で通常より直感的に表現したい - Smalltalkのtは小…

続・Javaで複合モナド

前回の自分用宿題 ・ 拡張スタイルの関数(というかbind)の導出 これをやってみる。あと逆に拡張スタイルから代数スタイルの導出もやる。 unit, flatten, mapからのbindの導出 unit, bindからのflatten, mapの導出 e_unit, e_bind, l_unit, l_bind, combinati…

Javaで複合モナド

実験的にテンプレートエンジンを書き始めたのはいいけど、早くもかなりpurityが失われている感じなので整理したい。実装をざっと見て、 テンプレートのモナド コンテキスト(ステートモナド) (あと多分リストも) が混ざった感じの実装になっているので綺麗に…

続・比較モナド

モナドのこと検索してたら次のようなtweet見かけた。 window.twttr = (function(d, s, id) { var js, fjs = d.getElementsByTagName(s)[0], t = window.twttr || {}; if (d.getElementById(id)) return t; js = d.createElement(s); js.id = id; js.src = "h…

比較モナド

前回は「ソート順(order by句)の情報から、特定レコードの上界/下界を求めるクエリ(where句)を自動生成する」というのをやった。 その時のwhere句の形 ... AND ((t0.pub_date < t2.pub_date) OR ((t0.pub_date = t2.pub_date) AND (t0.id > t2.id))))を見て…

一覧用の検索条件からいろいろ自動で取得する

一覧で要素を一つ選択して詳細ページでその内容を表示するようなサイトを作ることは良くあると思うけど、その為のDBアクセス処理を毎回一機能ずつ書くのは面倒なのでどうにかする方法を考える。 今回はフレームワークとしてはCayenneを使うけど、実例を挙げ…

関数型のテンプレートエンジンを作ってみる(0.3) - 条件分岐・繰り返しの導入

前回追加したdefineタグ、insertタグに加えて、今回は条件分岐タグ(ifタグ)と繰り返しタグ(foreachタグ)を導入する。 ifタグは以下のように、条件が満たされた時にその内部がレンダリングされる。 // 会員のみメッセージを表示 {if condition="customer.isMe…

関数型のテンプレートエンジンを作ってみる(0.2.3) - 実行系を書く

前回の続きで、テンプレートエンジンのエンジン部分を書く。 今回実装したところまでをVers_0.2というブランチにしてみた。 方針 0.1の時点ではモナド則とか考えたけど、あんまり純粋さには拘らない。 パース結果をASTとして実行部分は別個に評価器として実…

関数型のテンプレートエンジンを作ってみる(0.2.2) - パーサを書く

前回の続きで、前回作ったトークナイザからパーサを書く。パーサの作成には引き続きJParsecのライブラリを使用する。 おさらい&今日のミッション 前回作ったnewTokenizer(Terminals)で生成するトークナイザ(字句解析部)は、Stringを受け取りListを生成するP…

関数型のテンプレートエンジンを作ってみる(0.2.1) - パース用のトークナイザを書く。

関数型のテンプレートエンジンを作ってみる(0.2) - スコープ・変数定義の導入 - terazzoの日記で定義したタグのパーサを書く。 パーサの実装にはJparsec*1を使用する。シンボルと属性名はJparsecに用意されているTerminals.Identifierを、属性値のExpression…

関数型のテンプレートエンジンを作ってみる(0.2) - スコープ・変数定義の導入

前回は、テンプレート中のプレースホルダ(変数)を置き換える部分を作ったので、次はテンプレート中で変数を定義できるようにする。また、変数の有効な範囲(スコープ)を明確にする。スコープは静的スコープにしたい。 要素がプレースホルダだけなら単純に「{…

関数型のテンプレートエンジンを作ってみる(0.1) - 変数の置き換え

最もシンプルなテンプレートエンジンは、あらかじめテキストを用意しておき、テキスト内の特定の箇所(プレースホルダ)を随時好きな値で置き換えて使用するようなものだと思う。とりあえずそれから実装する。 「圏論やモナドが、どうして文書処理やXMLと関係…