RSS

bootstrap.cssの対応(for Play framework)

メモ。
ちょっと家庭内制作で「phpじゃないやつで!」ということになってjavaでrailsライクなplayframeworkいぢってんですが、
来月の某締切りにむけて画面周りで、Bootstrap を使ってます。
で、playはそもそもrailsライクってことで、cakephpと非常に似ているので、ファイルの構成とかは分かりやすい。
まあおいおいいろいろかけたらと思うんですけど、ひとまず、今Bootstrapが流行っているので、playframeworkで使ってみたい!ってことで使ってたんですが、一点、pagenateについてがどうにも、見た目を変更する必要がありました。

なので、paginateの導入も含めてメモしときます。

※試行錯誤なんで、自己責任でよろしくおねがいします><

1.2.2使っているので、コンソールでとりあえず

play install paginate

する。そうすると、コンソールで「いれちゃうぜ?」てきいてくるので、はいyて答える。

そうすると・・・playインストール場所/modulre/paginate-0.11

という構成になり、そこにモジュールが展開される。

そのあと、

conf/dependencies.ymlに

~ require:

~ play -> paginate 0.11
これを追記して、さらに
conf/application.confに
# Import the pagenate module
module.paginate=${play.path}/modules/paginate-0.11
こんな感じで、play再起動。起動時に、
Module paginate is available (/home/yashiro/play-1.2.2/modules/paginate-0.11)
とかいうログが見えると、無事paginateモジュールが読み込まれています。
さて、そのモジュールの中に、htmlが入っていて、(playの雛形みたいな)paginateに対してどういう記述をするか
が書かれているControls.htmlをいうソースを探し出します( paginate-0.11/app/views/にありました)。
それをコピーして、app/views/paginate/Controls.htmlという構成にします。
(やってることはcakephpで、helperを自分のappの配下にもってきて変更していることにそっくり。)

それでそのファイルをこんな感じで修正してみました。そしたらデモで見えるようなpaginateが表示されたよ!

(実際はpaginateを表示させるところまで、これ以外にもいろいろ道のりがあったんですが・・それは割愛)

app/views/paginate/Controls.html

%{
int __firstPage = 1;
int __currentPage = _items.pageNumber;
int __pagesDisplayed = _items.pagesDisplayed;
int __pagesBeforeMiddle = __pagesDisplayed / 2;
int __maxPage = _items.pageCount;
if (__currentPage > (__pagesDisplayed / 2)) {
	__firstPage = __currentPage - __pagesBeforeMiddle;
}
int __lastPage = __currentPage + (__pagesDisplayed - __pagesBeforeMiddle - 1);
if (__currentPage < (__pagesDisplayed - __pagesBeforeMiddle)) {
	__lastPage = __pagesDisplayed;
}
if (__lastPage > __maxPage) {
	__lastPage = __maxPage;
}
boolean __hasPrev = _items.hasPreviousPage;
boolean __hasNext = _items.hasNextPage;
String __firstURL = __hasPrev ? _items.getCallbackURL(1) : "#";
String __prevURL = __hasPrev ? _items.getCallbackURL(__currentPage-1) : "#";
String __nextURL = __hasNext ? _items.getCallbackURL(__currentPage+1) : "#";
String __lastURL = __hasNext ? _items.getCallbackURL(__maxPage) : "#";
%}
<div class="pagination">
	<ul>
%{ if (_items.boundaryControlsEnabled) { %}
		<li class="${__currentPage == 1 ? 'disabled' : 'first'}"><a href="${__firstURL}">&{'play-paginate.first'}</a></li>
%{ } %}
		<li class="${__hasPrev ? 'previous' : 'disabled'}"><a href="${__prevURL}">&{'play-paginate.prev'}</a></li>
%{
for (__idx = __firstPage; __idx <= __lastPage; __idx++) {
boolean __active = __currentPage == __idx;
%}
		<li class="${__active ? 'active' : 'inactive'}"><a href="${_items.getCallbackURL(__idx)}">${__idx}</a></li>
%{
}
%}
		<li class="${__hasNext ? '' : 'disabled'}"><a href="${__nextURL}">&{'play-paginate.next'}</a></li>
%{ if (_items.boundaryControlsEnabled) { %}
		<li class="${__currentPage == __maxPage ? 'disabled' : ''} next"><a href="${__lastURL}">&{'play-paginate.last'}</a></li>
%{ } %}
	</ul>
</div>
<br style="clear:both;"/>

まあここまではよかったんだけど、lastページになると、PreviousとNextのあいだのページ数が一個減るという謎の

現象に・・まあこれは次回でもどうにか修正することにしましょう。

 

※10年ぶりにJavaとか見たら、「アノテーション」とかいう謎の識別子がついていて時代を感じた。

 
コメントする

投稿者: : 10月 9, 2011 投稿先 Uncategorized

 

mysqlバックアップ

テーブルを丸ごとバックアップする方法で今までバックアップをとってきたんだが、
ある特定の業務アプリで、データが膨大なものが存在してた。
エディタでいちいちひらいてテーブルの名前から探して…みたいなことをしてたみたいで、
ちょっと手間がかかるなと。で、緊急時にリストアする際に、特定のテーブルだけしたいという
リクエストをうけたので探してみた。
それっぽいのはあったんだけどまあ、100%ってものがなかったのでとりあえず自作。
一週間で上書きっていう簡単なやつにしてみたよ。

Shellスクリプトもいろいろ面白いでつね。
#!/bin/sh
#DAYは数字で曜日。
DAY=`date '+%w'`
WORK_DIR=バックアップするディレクトリ
FILE_NAME=dump_$DAY
BACKUP_DIR=/tmp/
USER=DBのユーザ名
PASS=DBのパスワード
DB_NAME=データベース名

#バックアップディレクトリに移動
cd $BACKUP_DIR
#バックアップディレクトリがなかったら
if [ ! -d $WORK_DIR ]; then

	#ディレクトリを作成する
	mkdir $WORK_DIR
fi

#そのディレクトリに入る
cd $WORK_DIR
#事前にあったファイルは全部消す
rm ./*

#データベース内にあるテーブルリストを作成し、個別にテーブルのダンプデータを作成する
#-eはその後コマンドを実行するというオプション。
#-Bは余計な表示をせずに一覧を出力させる。
#-Nは一番上の見出しを削除する
for TABLENAME in ` mysql -u $USER -p$PASS -B -N -e 'show tables' $DB_NAME`
do
	#echo $TABLENAME
	mysqldump --opt -c -u $USER -p$PASS -x $DB_NAME $TABLENAME > $TABLENAME.sql
done

#移動する
cd $BACKUP_DIR

#該当する日付のディレクトリをまるごと圧縮する
tar -czf $DB_NAME$DAY.tar.gz $WORK_DIR
 
コメントする

投稿者: : 4月 23, 2011 投稿先 mysql

 

Containable Behaviorを追いかけてみました。

cakephp 1.3.3で開発しております。
今回は先日わたくしがハマった事象についてお話します。多少書きなぐり気味ですが><許してください。

前提条件

1.A_controllerでpaginateしている
2.paginate対象のモデル(User)には色々なモデルが関連付けられているが、その1部であるHogehogeというモデルをLEFTJOINではなく、INNERJOINで連結したいので一度unbindする
3.このメソッドが呼ばれる前にapp_controllerのbeforeFilter()にUserモデルで検索をかけている箇所がある。そこはContainableBehaviorが使われている

という前提でした。

1.A_controllerのpaginateの箇所はこんなかんじ。

$this->User->unbindModel(array('belongsTo'=>array('Hogehoge')), false);//第2引数をfalseにすることでモデルの関連性を維持させる

			'joins'=>array(
				array(
					'type'	=>'INNER',
					'fields'=>array('Hogehoge.name'),
					'table'=>'`Hogehoges`',
					'alias'=>'`Hogehoge`',
					'conditions'=>array(
						'Hogehoge.id = Hogehoge.user_id',
					),
				),
			),
//このあとpaginate実行

でハッピー! にならなかった・・・というお話。

 

Read the rest of this entry »

 
コメントする

投稿者: : 12月 21, 2010 投稿先 cakephp

 

javascriptでtextareaに値をセットしたい

ビールのんで帰ってきたので放置せずにこれだけは書いて寝よう。
やりたいこと。

DB上で登録したテンプレートなる文書のデータを、subjectだけ一覧で見せたい。
そんで、その一覧のsubjectをクリックしたら、テンプレートの内容をtextareaにセットしたい。

…たったこれだけ。
やってみたことはリンククリック時にわざわざDB通信するのもなんなので…ちょっとダサいけど、ページ出力時にテンプレートの内容はDIVで区切ってどっかに出力させて、かつ表示させない(display=none)にして、リンククリックしたらそのDIVの中身をテキストエリアにセットする、という流れ。

ところが、Chromeだとちゃんと見えるのにIE(7)だと、テンプレート内の改行が全部、すっ飛ばされてしまう!
で、ググると出てくる、出てくる。そもそもinnerHTMLには適用されないだの、textareaがUNKOだとか、IE・・・?とか色々でてくるんですけど、これ!っていう情報が出てこない。なんつーか文字コードと混同してる(私が)感じで情報が切り分けられず、phpで文字コードを変換してみたりとか色々したけどもうだめびーるのみたいしさいきん体組成系かってふとったしビールのみたいし。

で、DIVタグなのがいけないのかと思ってたので、仕方ないのでinputタグで出力し、それを見せない、みたいなことをやってみたんだけど、どうにもこうにもダメ。text()でやるとうまくいった、とかいろいろあったんだけどもうだめぽ…と思ったんですが最終的に一番楽そうな手段が見つかったので、備忘録的にメモ。これが最適手段ではないと思いますが、もし他の方法をご存知の方がいらしたら「っへ!こんなのもあるでよ!」って教えてくれるとありがたい。

結論からいうとですね、DIVタグではなくて、テンプレートの内容をあらかじめtextareaに書き出しました。そして上記のようにdispayをnoneにして非表示にし、この値をjQueryで言うところのval()で取得し、セットもval()で行いました。そうするとIEだろうがChromeだろうが、改行がきちんと判断されるようになりましたとさ。


$(document).ready(function() {
// bind 'Form' and provide a simple callback function
$(".template").click(function(event){
$('.comment').val($("textarea.setText" + $(this).attr('id')).val());
return false;
});
});

こんなかんじで、セットする元のテンプレート内容は

	if(isset($document)){
		//改行処理があるため、セットする要素と同じtextareaで対処する
	    foreach($template as $key=>$value) {
			echo "<textarea style='display:none' class='setText{$value['Template']['id']}'>";
	    	echo $value['Template']['content'];
			echo '</textarea>';
	    	
	    }
	}

こんなかんじで対処しました。他にもっと良い方法あるよ!って人は是非。いやーこれ解決するのにすんごい時間かけてしまったよ…とほほ。

※21日はCakeAdvent2010 なんで最近はまったcontainableとunbindのくだりを書く予定です。よろしくお願いします。

 
コメントする

投稿者: : 12月 15, 2010 投稿先 CSS, javascript

 

TortoiseGit &VirtualBox

今まで、サービスインしたサイトは社内ではxamppで開発し、社内で別途構築したCenOS上にデプロイし、本番機にアップ…という流れでした。ところが、巷では結構このxamppさん、あまり好かれてない。導入も楽だし、簡単な設定ですぐ動く。でもあまり好かれていない…で。会社で第2弾のサービスを立ち上げるにあたって社内の開発環境を少し変えてみることにした。

びふぉあ

  • xamppでWindow上で開発
  • DBだけは社内のテストサーバーにあるmysqlを参照(共有)
  • バージョン管理はSVN(TortoiseSVN)
  • タスク管理は完全独立でbacklog
  • あふたー

  • virtualBoxでローカルでの開発
  • DBもVirtualBox上にローカルでお好きにどうぞ
  • テスト環境は変わらず。
  • バージョン管理はgit(TortoiseGit)
  • タスク管理はredmineを導入し、gitと連動する形にする
  • ここで今回私が社内で悪戦苦闘したVirtualBoxのインポートと、Gitの接続時にしくじったことをメモ書き。

    Read the rest of this entry »

     
    コメントする

    投稿者: : 11月 12, 2010 投稿先 サーバ

     

    model Tips その1

    ここ1ヶ月、2ヶ月で急激にcake1.3で開発をしています。
    今年の初めから春先にかけても1.2で開発をしていましたが、その後はメンテナンスリリースだったり、デザイン面での改修が多かったので、改修もなかなかできず。社内の仕事が開発だけじゃないからサ…。

    で、会社とは別に1.3系で開発をしているのですが、なんていうか、
    ・今までしらなかったのか!

    みたいな事があります、あります。特に1.3系に特化した内容でもないので、「うわこいつ…いまさらこんなこといってんの?」的な生暖かい目でみてください。

    1.モデルはチェーンできんだぞ?しってた?

    Aモデルにアソシエーションを張っている場合それらのモデル(たとえばB)は、外部呼出しをせずともチェーン形式で呼び出しが可能。

    たとえばコントローラー側では
    $this->A->B->findAll();
    等が可能。もちろんBのデータを全部取って来れます。(hasOneでもhasManyでもbelongsToでも)
    ※今までusesにいれるとか、Class::registryしてました……。
    BがCとアソシエーションはっていれば、もちろん
    Aのコントローラーから

    $this->A->B->C->find();
    

    とかくだけ。書くだけです。ちなみに、アソシエーション時に、エイリアスで別のクラス名(モデル名)を設定している場合は
    そのエイリアスで呼ぶこと。そうじゃないと、無い!といわれます。

    そうなってくると。ありそうなのはMailテーブルにfromとtoというフィールドを用意し、両方、ユーザIDが入ってるような場合は当然、fromとtoにbelongsToで設定したいところです。例として名前はFromUser,ToUserという名前にしてみます。

    この場合、たとえば送信元のデータを取ってきたい場合はMailコントローラーで呼び出す場合

    $this->Mail->FromUser->getDetail();
    

    なんて呼び出しますよね。
    その場合、モデルの方に検索するメソッドを実装するのですが、問題は、モデル名.フィールドで指定したい場合。実装するのはUserモデルに実装しますが、上記のような場合に呼び出される場合はFromUser.のような形で呼び出さないといけません。そんな時は

    condtions =array(
     $this->alias.'.id' => $id ,
    )
    

    ように$this->alias.を使うことで、その際のモデル名を判断し、取得することが可能です。つまり、Userモデルのメソッドとしても利用できますし、FromUserとしても利用が可能になります。

     
    コメントする

    投稿者: : 9月 22, 2010 投稿先 cakephp

     

    munin監視&メール設定

    CentOS5.4運用しとりまして、鯖監視を最近やっとります。
    鯖監視というのは

  • 利用できるようになったら、とりあえず日々を追ってじーっとみてみろ!
  • みたいな事をいわれていまして・・・。で、後ほどエントリしようと思っていますが、muninがいいからmuninにすれば。といわれてmuninというパッケージをインストールして、ジっとながめる。ということを日々やっとります。muninのインストールについては結構いろんなところで情報があるので、そちらを参考にしていただいたほうがよいかもしれず。
    今回のエントリは

  • 特定のプロセス数を超過したら、お知らせメールを送る
  • っつーことでお知らせメール機能です。

    閾値メール設定
    /etc/muni/の中のmunin.confに下記のように追加(加筆したところは#でコメントをいれています。)

    #送信したいメールアドレスを、[email]というグループに関連づける(下記はメールアドレスまで一行つながりです)
    contact.email.command mail -s "Munin ${var:group}::${var:host}" hogehoge@xxx.vo.jp
    #以下の行はmuninで監視しているプラグインの情報を個別にメールでおくるかの設定。1にすると7通とかメールくるからコメントアウト。
    #contact.email.max_messages 1
    #以下一行はcriticalなものだけを送信対象とする
    contact.email.always_send critical
    #[email]グループに対してメールを送る
    contacts email
    # Drop somejuser@fnord.comm and anotheruser@blibb.comm an email everytime
    # something changes (OK -> WARNING, CRITICAL -> OK, etc)
    #contact.someuser.command mail -s "Munin notification" somejuser@fnord.comm
    #contact.anotheruser.command mail -s "Munin notification" anotheruser@blibb.comm
    #
    # For those with Nagios, the following might come in handy. In addition,
    # the services must be defined in the Nagios server as well.
    #contact.nagios.command /usr/sbin/send_nsca -H nagios.host.com -c /etc/send_nsca.cfg
    # a simple host tree
    [localhost]
    address 127.0.0.1
    use_node_name yes
    #プロセス数が80に達した時点でcriticalとみなす(メール送信がされるトリガ)
    #下記設定は[localhost]の中で設定すること。
    processes.processes.critical 80

    で、munin-node再起動してじっと5分まつ。
    上記はあくまでもプロセスの監視なので、フィールドやプラグインの名前はそれぞれ閾値を設定したい対象によって異なります。で、これだとmuninはグラフ描画のために5分間隔でデータを取りにいくので、プロセス数が80になったら5分おきにメールがきてしまうwwwwwこれをどうにかしないといけないのであった。各パラメーターの参照はhttp://castor.s26.xrea.com/blog/2007/10/19
    とかこちらが非常に参考になりました。
    むーん、このテーマだとコードが改行されてしまうな。見づらいのでどうにかしないと。

     
    コメントする

    投稿者: : 6月 5, 2010 投稿先 サーバ