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で管理できるように設定します。

環境

前提

  • sshでログインできる事

Tera Termの設定

SSH転送の設定を行います。

ローカル側は自分のPCのポート、リモート側はレンタルサーバーのポートを入力します。
リモート側ホストは、localhostの場合、入力不要です。
データベースをプライベートアドレスで運用している場合などは、そのIPアドレスを入力します。
最初に接続したSSHサーバー経由でグローバルアドレスを持たないサーバーにもアクセスが可能になります。

5432はPostgreSQLのデフォルトポート番号で、ローカル側はかぶらなければ何でも良いです。個人的にはいつも15432で運用しています。

pgAdmin Ⅲの設定

サーバーを登録します。

名前は何でも良いです。ホストはlocalhost、portは先ほどTera Termに設定したポート番号。
ユーザー名は当然ながらデータベースに登録されているユーザー名です。

Tera TermのSSH転送で設定されているサーバーに接続するので、複数のホストを管理する場合でも、同時接続するのでなければ、pgAdmin側はこの設定が一つあればOKです。

ポイント

  • pgAdmin Ⅲの通信安定性は、sshクライアントの安定性に左右されます

ArmadilloでSQLite3を動かす

Armadilloに通信の中継だけでなく、データを蓄積して欲しいという要望があるので、SQLite3を組み込んでみました。

取得・展開方法

パッケージを取得、展開し、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

ポイント

残念ながらDebian.orgで提供されているバイナリはけっこう古いバージョンです。
いずれはソースをコンパイルに挑戦してみたいです。

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のログを書き込んでる場所がどうにも分からなかったので、デバッグモードで起動するように修正してみました。

参考にしたページ

ソースコードの修正

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を使ってシリアル・イーサネット変換を行う事が出来たのでまとめます。

参考にしたページ

前提条件

  • シリアルインターフェースが解放済みである事
  • 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

3.TeraTermの設定変更

端末の設定を変更します。

  • 送信の改行コード:CR+LF
  • ローカルエコー:チェック

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

TeraTerm

aaa
   bbb
ccc
   ddd

つまずいたポイント

  • seial.confファイルを作らないとデフォルトのボーレートで起動しちゃいます
  • "-d /dev/ttymxc1"オプションを指定してseri2ethを起動しないと、デフォルトのttyS0と接続しちゃいます
  • TeraTermでローカルエコーの設定がないと、入力した文字が表示されなくて不便です
  • TeraTermで送信の改行コードをCR+LFにしておかないと、エンターキーを押してもイーサネット側へ送信しません