jqGridの設定はsetGridParamで(以下略

他人の褌で相撲を取るような内容ですが、jqGridネタが有ったので少し。
getが有るならsetも(多分)有る、と言うのがプログラムです。

データを読み書きに行くURLを変更したい場合は以下のような感じで

$("#grid").jqGrid('setGridParam', {url:rurl,editurl:surl});

任意にリロードを発生させる必要が有るなら
$("#grid").trigger("reloadGrid");

jqGridは他にもonSortColでソート順をいじる、
onSelectRowで判定後にdatepickerを表示したりさせなかったりcss()で背景色を変えたり、
なんて事も出来ます。

Facebooktwitterlinkedintumblrmail

jqGridの設定はgetGridParamで取れる

jqGridのソースコードを読んでやっとわかったので記しておきます。

例えば、次のように設定した$jqGridObjというjqGridのオブジェクトがあったとします。

$jqGridObj.jqGrid({
datatype : "json",
mtype : "post",
height : 400,
url : "./getlist.php",
gridview : true,
viewrecords : true,
rowNum : 500,
hidegrid : false,
caption : "一覧",
jsonReader : {
root : "rows",
id : "pk",
cell : "fields",
page : "page",
total : "total",
records : "records",
repeatitems : false
},
colNames : [ "番号", "氏名" ],
colModel : [ {
name : "no",
sortable : false,
width : 50,
editable : true,
jsonmap : "fields.no"
}, {
name : "name",
sortable : false,
width : 130,
editable : true,
jsonmap : "fields.name"
} ]
});

オプションのcolNamesやcoModelが取りたいときってありますよね。こうします。

var colNames = $jqGridObj.jqGrid("getGridParam", "colNames");
var colModel = $jqGridObj.jqGrid("getGridParam", "colModel");

getGridParamメソッドについては jqGrid wiki にちゃんと書いてある。なぜ見つけられなかったのかなぁ。

Facebooktwitterlinkedintumblrmail

PHPでXSLTを使ってみる

今回はPHPでXSLTを使ってみました。

1)XMLファイル「list.xml」




2
山田
沖縄


3
田中
長崎


5
佐藤
北海道


1
斉藤
東京


2)XSLTファイル「table.xsl」






list

3)PHPファイル「xlst_process.php」

load('table.xsl');
$processor->importStylesheet($xsl);

$xml = new DOMDocument;
$xml->load('list.xml');

$result = $processor->transformToXml($xml);

echo $result;

4)結果

5)感想
これはすごく簡単に出来ていい!

Facebooktwitterlinkedintumblrmail

『じゃばすく製作所(仮)ふたつめ。』いってきました

たのしくJavaScript勉強してきました。主催者レポートはこちら。

例のあれ(仮題)- じゃばすく製作所(仮)ふたつめ。をこの際なのでやりました。

配布ファイルやガイドブックも用意されてるので自習もできます、Canvasを用いて描画するアナログ時計作り。

私、一応時間内に動かせたんですが、Chromeで動かすと画面に収まらないという不具合がありまして、帰ってから調べたらメソッド呼び出しに()を付け忘れているという当日に何度も繰り返したミスが残っていました。

widthとかheightって名前だとプロパティと思っちゃうんだ。

ついでに同じような処理を関数に少しまとめたりした村部版はこんな感じ。

function SampleClock() {
    try {
        this.board = document.getElementById('board');
        this.canvas = document.getElementById('time');
        this.boardContext = this.board.getContext('2d');
        this.context = this.canvas.getContext('2d');
        this.board.width = this.canvas.width = window.innerWidth;
        this.board.height = this.canvas.height = window.innerHeight;
        this.boardContext.translate(this.width() / 2, this.height() / 2);
        this.context.translate(this.width() / 2, this.height() / 2);
        this.context.rotate(this.toRad(-90));

        this.draw_board();
    } catch (e) {
        alert('initialize error...');
    }
}
SampleClock.prototype = {
    width: function () {
            return this.board.width;
    },
    height: function () {
        return this.board.height;
    },
    radius: function () {
        if(this.width() > this.height()) {
            return this.height() / 2;
        } else {
            return this.width() / 2;
        }
    },
    
    toRad: function (angle) {
       return angle * (Math.PI / 180); 
    },
    hourRad: function (datetime) {
        var hour = datetime.getHours();
        var minute = datetime.getMinutes();
        var hour_for_disp = hour;
        if(hour > 12) {
            hour_for_disp = hour - 12;
        }
        return hour_for_disp * Math.PI / 6 + minute * Math.PI / 360;
    },
    minuteRad: function (datetime) {
        var minute = datetime.getMinutes();
        var second = datetime.getSeconds();
        return minute * Math.PI / 30 + second * Math.PI / 1800;
    },
    secondRad: function (datetime) {
        var second = datetime.getSeconds();
        var millisecond = datetime.getMilliseconds();
        return second * Math.PI / 30 + millisecond * Math.PI / 30000;
    },

    draw_time: function () {
        this.context.clearRect(-this.width() / 2, -this.height() / 2, this.width(), this.height());
        var now = new Date();
        var draw_line_for_time = function(context, rad, lineWidth, lineLength, lineColor) {
            context.save();
            context.beginPath();
            context.lineWidth = lineWidth;
            context.rotate(rad);
            context.moveTo(0, 0);
            context.lineTo(lineLength, 0);
            context.strokeStyle = lineColor;
            context.stroke();
            context.restore();
        }
        draw_line_for_time(
            this.context,
            this.hourRad(now),
            this.radius() * 0.08,
            this.radius() * 0.6,
            '#000000'
        );
        draw_line_for_time(
            this.context,
            this.minuteRad(now),
            this.radius() * 0.06,
            this.radius() * 0.8,
            '#000000'
        );
        draw_line_for_time(
            this.context,
            this.secondRad(now),
            this.radius() * 0.03,
            this.radius() * 0.8,
            '#ff0000'
        );

    },
    draw_board: function () {
        this.boardContext.beginPath();
        this.boardContext.lineWidth = this.radius() * 0.05;
        this.boardContext.arc(0, 0, this.radius() * 0.9, 0, Math.PI * 2);
        this.boardContext.stroke();

        this.boardContext.beginPath();
        this.boardContext.lineWidth = this.radius() * 0.1;
        this.boardContext.arc(0, 0, this.radius() * 0.05, 0, Math.PI * 2);
        this.boardContext.stroke();

        this.boardContext.beginPath();
        this.boardContext.lineWidth = this.radius() * 0.03;
        for (var i = 0; i < 12; i++) {
            this.boardContext.moveTo(this.radius() * 0.85, 0);
            this.boardContext.lineTo(this.radius() * 0.75, 0);
            this.boardContext.rotate(this.toRad(360 / 12));
        }
        this.boardContext.stroke();

        this.boardContext.beginPath();
        this.boardContext.lineWidth = this.radius() * 0.03;
        for (var i = 0; i < 60; i++) {
            this.boardContext.moveTo(this.radius() * 0.85, 0);
            this.boardContext.lineTo(this.radius() * 0.80, 0);
            this.boardContext.rotate(this.toRad(360 / 60));
        }
        this.boardContext.stroke();
    }
};

var clock = new SampleClock();
var timer;

function tik() {
    clock.draw_time();
    timer = setTimeout('tik()', 1000 / 60);
}

function tok() {
    clearInterval(timer);
}

tik();
Facebooktwitterlinkedintumblrmail

CUI な Git ブラウザ tig を Homebrew で入れてみた

『CUI な Git ブラウザ tig を入れてみた』 を見て便利そうだったので Homebew にないかなーと。

$ brew search tig
tig         tiger-vnc

あった。

$ brew install tig
==> Downloading http://jonas.nitro.dk/tig/releases/tig-0.18.tar.gz
######################################################################## 100.0%
==> ./configure --prefix=/usr/local/Cellar/tig/0.18
==> make install
==> make install-doc-man
/usr/local/Cellar/tig/0.18: 8 files, 248K, built in 12 seconds

サックリ完了。

$ which tig
/usr/local/bin/tig

はいってるはいってる。Gitのワークツリーに移動して

$ tig

起動!

日本語も出てるし大丈夫っぽい。変更を追っかけるのに便利な感じ。

使い方がわからなくなったらhを押すとヘルプがでるので困ったらhと覚えてれば大丈夫(たぶん)。

Facebooktwitterlinkedintumblrmail

NetBeans のクリップボードでのイライラ解消に Copy and Paste History プラグイン

社内にNetBeans使ってる人、他にいないし、Eclipse使いが多いし、

Eclipseプラグインの作り方基本編
EclipseプラグインJavaEditorへの機能追加編

とEclipseプラグインを作ったりしてるしでNetBeansからEclipseに乗り換えようかとも思ったのですがやっぱりNetBeansが好き。

結局NetBeansを使っています。

そんなNetBeansが好きなわたしですが使っていてイライラすることがあります。

クリップボード拡張ソフトとの相性がわるいことです。

クリップボード拡張ソフトで履歴をさかのぼってペーストしようとしても直前にコピーした内容がペーストされてしまう。

イライラします。

NetBeans/クリップボード拡張ソフトと相性が悪い件

を参考に(ありがとうございます!)NetBeans側の起動オプションで対策したりしていたのですが2つ目に書いてある方法、NetBeansのプラグイン Copy and Paste History (http://plugins.netbeans.org/plugin/33351/copy-and-paste-history-for-netbeans-7-0-and-later)を使うってところに落ち着きました。

プラグインのメニューから使用可能なプラグインで copy とでもでも検索すればでてきますので選択してインストールするだけです。

少しひっかかったのがMacの場合はキーアサインが説明に書いてある Alt+V ではなく Ctl+V だということでした。

NetBeansクリップボードにイライラさせられている方はお試しあれ。

Facebooktwitterlinkedintumblrmail

mysqld_multiを使って同一マシンに複数のMySQLサーバを立てる

業務で複数MySQLの開発環境が必要になりました。VM作っても良かったのですが、いちいち立ち上げたくなかったのと、Mac1台で完結させたかったのでTwitterでその旨つぶやいたら、とある方からmysqld_multiというものを教えて頂きました。

私はHomebrewでMySQL5.1を入れていたのですが、

$ ll /usr/local/Cellar/mysql51/5.1.58/bin/ | grep mysqld_multi
-r-xr-xr-x  1 dataich  staff    24334 11  1 14:17 mysqld_multi

おお、既に入ってました。

でmy.cnfに設定を書いてあげます。[mysqld1][mysqld2][mysqld3]という感じでオプショングループを書いてあげてそれぞれの設定を記述します。

この状態で

$ mysqld_multi start

とすれば全部立ち上がります。
またマニュアルにもありますが、特定のサーバだけ立ち上げることも可能です。

なんで今まで知らなかったのかと後悔してます。
まあアプリ側がちゃんとポート指定に対応していないと残念なことにはなりますが、非常に便利に使えそうです。
ちなみにWindows開発環境では、多分別の社員さんが書いてくれると思います。

Facebooktwitterlinkedintumblrmail

OpenCOBOL活用セミナーで生みの親の西田さんと

OSSコンソーシアムに OSS COBOL ワーキンググループが設立されました(「【プレスリリース】OSS COBOL支援プロジェクト立ち上げ – OSSコンソーシアム」をご参照ください)。

これにともない、『フルオープンソースでCOBOLの基幹システムを実現!OpenCOBOL活用セミナー』が1/25に開催されました。長崎県からは長崎県総務部政策監の島村秀世様と弊社の峰松が長崎県での取り組みや展開について話しました。

ご参加いただいた皆様、ありがとうございました。

さて、堅い感じはおわり。本題にはいりますよー。

OpenCOBOLの生みの親、西田圭介さんに今回のセミナーのことを峰松からお話していたらなんとご本人が参加してくださったんです!

懇親会で二人が話してたところにちょっとお邪魔してパチリ(左が峰松、右が西田さんです)。

西田さんは現在、BizMobile株式会社のCTOだそうです。

OpenCOBOL開発当時のお話や著書『Googleを支える技術-‾巨大システムの内側の世界-』についてお話したり、OpenCOBOLの可能性について語りあったりととても楽しいひとときでした!

付記:
プレゼン直前にPowerPointが落ちて作っていた資料がほとんど消える。プレゼンの途中にプロジェクターへの接続がきれる。終了予定時間がすぎてからデモを始める。峰松は今回も絶好調でした。ざっつ、えんたーてぃなー。

Facebooktwitterlinkedintumblrmail

PHPでbundlerぽいことを行うOnion、Composer

pear.phpunit.de/PHPUnitを依存関係として設定する前提で、OnionComposerを使ってみました。

Onion

PEARモジュールのビルド、コンパイル、そして今回の目的であるbundler的なことを簡単に行えます。

インストール

homebrewの場合

gistにFormulaを置きましたので使ってください。

# brew install --HEAD https://raw.github.com/gist/1594321/6769fa97864462c4813f06bbb08760630ba7c87f/onion.rb
brew install --HEAD https://raw.github.com/gist/1594321/onion.rb
# 2012/02/07 修正 実行ファイルがonion.pharからonionに変更になりましたので、Formulaを修正しました。
直接

onion.pharをパスの通ったディレクトリに置いて、実行権限を与えるだけ。

# curl https://github.com/c9s/Onion/raw/master/onion > ~/bin/onion 
curl -s http://install.onionphp.org/ | sh
# 2012/02/07 修正 インストール方法が変更されてました。

使用方法

onion_sample
|– vendor
|– package.ini

プロジェクト直下にpackage.iniを作成し、ここに依存関係などを記述します。
packageセクションにあるname、desc、version、authorは必須となっています。(そもそもOnionはPEARパッケージを作る際にも使うためだと思われます。) requireセクションに使用したいPEARパッケージを記述します。 上記の状態で下記コマンドを実行することで、vendorディレクトリにPEARパッケージがインストールされます。

$ onion -d bundle

いやー、インストールから実行まで非常に手軽。この手軽さが素晴らしいです。

Composer

こちらもbundler的な事を行えるのですが、Onionよりもその依存関係部分に注力したパッケージマネージャといった感じです。 PEARだけに限らず、gitのリポジトリを依存関係として指定したりもできます。ただその辺りはあまり調べていないので、今回はPEARパッケージのみ使う前提で試して見ました。

インストール

brew install --HEAD https://raw.github.com/gist/1574469/composer.rb

使用方法

composer_sample
|– vendor
|– composer.json

プロジェクト直下にcomposer.jsonを作成し、ここに依存関係などを記述します。

上記の状態で下記コマンドを実行することで、vendorディレクトリにPEARパッケージがインストールされます。

$ composer.phar install

ComposerはPEARモジュール以外も扱うためか、PEARモジュールそのものを扱うのに設定ファイルが少々複雑になります。
今回はpear.phpunit.de/PHPUnitを依存関係として設定していますが、まずそのためにrepositoriesにチャンネルを設定する必要があります。そこまではいいのですが、PHPUnitがpear.symfony-project.com/YAMLに依存しているので、そのチャンネルも記述しておく必要があります。つまり依存関係にある全てのチャンネルを設定しておく必要があるみたいです。これどうにかならないのでしょうか。

雑感としてはPEARモジュールさえ扱えればいいのであれば、Onionの方が簡単だと思いました。対してComposerはPEARモジュール以外にも使えるので、今後に期待できるのはComposerだと思いますが、現状は用途に合わせてといったところでしょう。また気になる動きとして、OnionのGithubリポジトリにcomposer-supportというブランチがあるのが楽しみです。

Facebooktwitterlinkedintumblrmail

これだけで一応使える git-svn 入門

やぁやぁ、村部です。

分散バージョン管理はBazaarをずっと使っていましたが、世の流れには逆らえず現在やっているプロジェクトではGitを使うことにしました。

ソースコードを管理するのであればGitは強力ですしね。EclipseでもNetbeansでも使えるのも魅力。

ただし、中央リポジトリはSubversionです。ドキュメントも同じリポジトリ管理したいのでSubversionが便利なのです。

既に社内でgit-svnでの運用実績もありますので安心(Bazaar使いたい時はbzr-svnでやれますしね)。

社内Git派閥の方に聞いた所「基本trunkでやるなら下記覚えておけばOK」とのこと。

## ローカルでのコミット
git add .
git commit

## SVNへのコミット
git svn rebase  #一旦SVNのリポジトリから取り込み
git svn dcommit #ローカルの変更を反映

しばらく使ってみて不便に感じたのが git commit 直後でないと git svn rebase や git svn dcommit ができないこと。すこしでも修正しているとだめ。 タースーケーテー

「git stash があるよ」

変更を退避するコマンドだそうです。てなわけでSVNへのコミットの基本はこんな感じ。

git stash save -u #commitしてない変更を退避
git svn rebase
git svn dcommit
git stash pop #退避から取り出し

git stash save の -u オプションは –include-untracked の省略形。add していない変更も退避します。
「このオプションを付けてないとよくわからないトラブルになりがち」だそうなのでつけときましょう。

以上、これだけで一応使える git-svn 入門でした。

※2012-03-21 追記
git stash save の -u オプションについてですが、新しいファイルを作成、編集してるときにadd前にこのオプションをつけて save すると pop 時にコンフリクトすることが多いです。その場合コンフリクトを解消するにはコンフリクトしているファイルをすべて削除(または他の場所に移動)して再度 pop します。正常に pop する前に git stash drop すると編集していたファイルを失って泣くことになるのでご注意を。
ということで一概に -u をつけたほうがいいとは言えないようです。

Facebooktwitterlinkedintumblrmail