will_paginateでAjax
will_paginateをAjaxページに追加したので、作業内容をまとめます。
環境
- Rails 2.3.8
- will_paginate 2.3.15
参考にしたページ
概要
will_paginateのページ遷移はAjaxに対応していないので、そのままではエラーが発生してしまいます。
そこで、jQueryを使用して、will_paginateが生成するa要素クリック時のイベントを、Ajaxに変換させる事で対応しました。
ほぼ参考ページのままなのですが、なかなか動かず苦労しました。
prototype.jsの場合はこちらで行けるんじゃないでしょうか?
Controller
class ModenaviController < ApplicationController def search @model_id = params[:model_id] @center_id = params[:center_id] @machine_log_list = DailyMachineData.average_list(@model_id, @center_id, @current_time, @filter, params[:page]) render :update do |page| page.replace_html "log-list-chart", :partial => "log_list_chart" page.replace_html "log-list", :partial => "log_list" page << "ajaxifyPagination();" end end end
View
<%= will_paginate @machine_log_list, :params => { :model_id => @model_id, :center_id => @center_id }, :class => 'pagination' %>
public/javascripts/application.js
$(function(){ ajaxifyPagination(); }); function ajaxifyPagination() { $(".pagination a").click(function() { $.ajax({ type: "POST", url: $(this).attr("href"), dataType: "script" }); return false; }); }
ポイント
- controllerのrenderの最後で実行する「page << "ajaxifyPagination();"」が大切
- $.ajaxのtypeは"POST"
- will_paginateの引数"params"で、controllerにパラメータを渡せる
pgAdmin ⅢでWindowsからレンタルサーバーのPostgreSQLを管理する
コマンドだけの管理ではつらいので、ポートフォワーディングを利用して、Windows上のpgAdminで管理できるように設定します。
環境
- PostgreSQL 8.4
- Centos 5.5
- Tera Term 4.65
前提
- sshでログインできる事
Tera Termの設定
SSH転送の設定を行います。
ローカル側は自分のPCのポート、リモート側はレンタルサーバーのポートを入力します。
リモート側ホストは、localhostの場合、入力不要です。
データベースをプライベートアドレスで運用している場合などは、そのIPアドレスを入力します。
最初に接続したSSHサーバー経由でグローバルアドレスを持たないサーバーにもアクセスが可能になります。
5432はPostgreSQLのデフォルトポート番号で、ローカル側はかぶらなければ何でも良いです。個人的にはいつも15432で運用しています。
pgAdmin Ⅲの設定
サーバーを登録します。
名前は何でも良いです。ホストはlocalhost、portは先ほどTera Termに設定したポート番号。
ユーザー名は当然ながらデータベースに登録されているユーザー名です。
Tera TermのSSH転送で設定されているサーバーに接続するので、複数のホストを管理する場合でも、同時接続するのでなければ、pgAdmin側はこの設定が一つあればOKです。
ポイント
- pgAdmin Ⅲの通信安定性は、sshクライアントの安定性に左右されます
PL/pgSQLの利用準備
データベースに対し権限を持っているユーザーのコンソールで以下を実行。
createlang plpgsql <データベース名>
ArmadilloでSQLite3を動かす
Armadilloに通信の中継だけでなく、データを蓄積して欲しいという要望があるので、SQLite3を組み込んでみました。
必要なバイナリ
- http://packages.debian.org/ja/lenny/armel/sqlite3:sqlite3_3.5.9-6_armel.deb
- http://packages.debian.org/ja/lenny/armel/libsqlite3-0:libsqlite3-0_3.5.9-6_armel.deb
- http://packages.debian.org/ja/lenny/armel/libreadline5:libreadline5_5.2-3.1_armel.deb
- http://packages.debian.org/ja/lenny/armel/libncurses5:libncurses5_5.7+20081213-1_armel.deb
取得・展開方法
パッケージを取得、展開し、romfsへコピーします
atmark@atde3:~/binary$ wget http://ftp.jp.debian.org/debian/pool/main/s/sqlite3/sqlite3_3.5.9-6_armel.deb atmark@atde3:~/binary$ dpkg -x sqlite3_3.5.9-6_armel.deb temp-sqlite3 atmark@atde3:~/binary$ cp -r temp-sqlite3/* ../sources/atmark-dist/romfs/
コピーが終わったら、make imageして、Armadilloに転送します。
atmark@atde3:~/sources/atmark-dist$ make image atmark@atde3:~/sources/atmark-dist$ sudo cp images/*gz /var/lib/tftpboot/
Armadilloで稼働確認
SQLite3のコマンドラインインターフェースで、稼働確認を行います。
[guest@armadillo420-0 (ttymxc1) ~]$ sqlite3 test.db SQLite version 3.5.9 Enter ".help" for instructions sqlite> create table person(id, name); sqlite> .tables person sqlite> insert into person values(1, 'suzuki'); sqlite> insert into person values(2, 'takahashi'); sqlite> select * from person; 1|suzuki 2|takahashi sqlite> .exit [guest@armadillo420-0 (ttymxc1) ~]$ ls test.db
Rubyでシリアル通信
seri2ethで目的達成したけど、ついでにRubyでシリアル通信してみました。
ソースコード
参考ページそのままです。ポート名とボーレートを修正。
com1 = open("/dev/ttymxc1","r+"); system(" stty < /dev/ttymxc1 115200") com1.write "123456789\n" stream = "" while c = com1.read(1) stream += c break if(c == "\n") end print stream com1.close
まずはArmadilloから文字を送信。
TeraTerm側から入力された文字を取得して表示という流れになります。
一発で動きました。Ruby素敵。
ポイント
- requireもgemも必要ないです
seri2ethをデバッグモードで起動する
seri2ethのログを書き込んでる場所がどうにも分からなかったので、デバッグモードで起動するように修正してみました。
参考にしたページ
- atmark-dist-20100603\user\seri2ethにあるソースコード
ソースコードの修正
seri2ethのソースコードを以下のように修正してmakeします。
/* //////////////////// macro define ///////////////////// */ #define __DEBUG__ <---この行を追加 #ifdef __DEBUG__ #define LOG(args...) printf(args) #define ERR(args...) printf(args) #define PERROR(args...) perror(args) #define RESET_SIGNAL SIGINT #else #define LOG(args...) {} #define ERR(args...) {} #define PERROR(args...) {} #define RESET_SIGNAL SIGUSR1 #endif
ポイント
- "#define __DEBUG__"を追加してmakeするのみ
- 元に戻すには"//"を行頭に追加してmakeです
Armadilloでシリアル・イーサネット変換
Armadilloで、seri2ethを使ってシリアル・イーサネット変換を行う事が出来たのでまとめます。
環境
参考にしたページ
- 作ってみよう,MyガジェットPart3 | 組み込みLinuxのArmadilloサイト
- atmark-dist-20100603\user\seri2ethにあるソースコード
前提条件
- シリアルインターフェースが解放済みである事
- TCPクライアントが作成済みである事
- TFTPブートの設定済みである事
1.seri2ethの組み込み
Armadilloにはシリアル・イーサネット変換を行うアプリ"seri2eth"が付属しているので、組み込みを行う。
Main Menu
Kernel/Library/Defaults Selection ---> を<Select> Customize Vendor/User Settings を<Select> < Exit > をEnter < Exit > をEnter Do you wish to save your new kernel configuration? で、< Yes > をEnter
Userland Configuration
Network Applications ---> を<Select> seri2eth を<Select> < Exit > をEnter < Exit > をEnter Do you wish to save your new kernel configuration? で、< Yes > をEnter
設定変更が終わったらmakeを実行します。
2.serial.confの作成
ATDE上でseri2ethの設定ファイルを作成する
atmark@atde3:~/source/20100603/atmark-dist$ vi romfs/etc/config/serial.conf
中身は以下の通り。
SOCKPROTO 0 CONNECTADDR 0.0.0.0 BAUDRATE 115200 DATALEN 3 PARITY 0 STOPBIT 0 FLOWCTRL 0 PORTNO 21347
編集が終わったらイメージファイルを作成し、Armadilloに転送する。
atmark@atde3:~/source/20100603/atmark-dist$ make image
4.seri2ethの実行
Armadilloにtelnetで接続してrootにsuし、seri2ethを起動します。
atmark@atde3:~/source/20100603/atmark-dist$ telnet 192.168.1.119 Trying 192.168.1.119... Connected to 192.168.1.119. Escape character is '^]'. atmark-dist v1.26.1 (AtmarkTechno/Armadillo-420) Linux 2.6.26-at9 [armv5tejl arch] armadillo420-0 login: guest [guest@armadillo420-0 (ttyp0) ~]$ su - Password: [root@armadillo420-0 (ttyp0) ~]# seri2eth -d /dev/ttymxc1
5.TCPクライアントの実行
以前作成したTCPクライアントをネットワークにつながるところで起動します。
コードは以下の通り。
require 'socket' host = if ARGV[0] then ARGV[0] else "localhost" end port = if ARGV[1] then ARGV[1] else "echo" end sock = TCPSocket.open(host, port) while msg = STDIN.gets sock.write(msg) print sock.gets end sock.close
起動します。
C:\Users\toshifusa\Documents\NetBeansProjects\Armadillo\lib>ruby tcpclient.rb 192.168.1.119 21347
まずは、こちらからメッセージを送信。
aaa
TeraTerm側から返信。
bbb
交互に繰り返した結果は以下のようになります。
TCPクライアント側
C:\Users\toshifusa\Documents\NetBeansProjects\Armadillo\lib>ruby tcpclient.rb 19 2.168.1.119 21347 aaa bbb ccc ddd
aaa bbb ccc ddd