ushidayの日記

主に「IBMi」のメモに・・・

サクっとiUIを使ったiPhoneアプリの最適化

先日行なわれた、Css Nite Shizuoka(2010.09.23)で、お願いされたのもあって、LTをしてきました。

その時お話したのは、iUIを使ったiPhone最適化についてなのですが、form関係でバグがあるので、対応方法を掲載しておきます。

iUI.js(バージョン0.31)の修正箇所

// 97ステップ目辺り
//req.open(method || "GET", href, true);
if(method == "post"
   || method == "POST"){
    req.open(method, href, true);
}else{
   req.open(method || "GET", href + "?"+ args.join("&"), true);
}


// 460ステップ付近
function submitForm(form)
{
//    iui.showPageByHref(form.action || "POST", encodeForm(form), form.method);
    iui.showPageByHref(form.action , encodeForm(form), form.method  || "POST");
}


// 470ステップ付近
for (var i = 0; i < inputs.length; ++i){
   if (inputs[i].name)
//      args.push(inputs[i].name + "=" + escape(inputs[i].value));
      args.push(inputs[i].name + "=" + encodeURIComponent(inputs[i].value));
}


■使った感じ

■当日のスライド

PASE環境でのsyslogの設定

以前、PASE環境でsyslogを設定した時の事を、また忘れていたので、備忘録として...。

syslogd用のディレクトリ&ファイルを作成

PASE版syslogdは、”/QOpenSys/usr/sbin/syslogd -> /QOpenSys/QIBM/ProdData/OS400/PASE/sbin/syslogd”こういう状況になってます。syslog用のディレクトリやファイルは、予め用意する必要があり、自前で作成します。

mkdir /var/log
touch /var/log/secure

設定ファイルは、”/QOpenSys/etc/syslog.conf”を作成します。
■syslog.conf

#1日単位でファイルを区切る。ファイルは、最大7つまでで、圧縮してアーカイブする
authpriv.info /var/log/secure rotate time 1d  files 7 compress archive /var/log/archive/secure/

#全てのfacilityのデバッグレベルとメール機能を除いたログを出力。ファイルサイズは1024Kで最大2つまで
*.debug;mail.none /var/log/syslog/syslog.out rotate size 1024k files 2

PASEのsyslog設定、facilityのワイルドカードは出来るが、レベルのワイルドカードは出来ないので少し、Linuxとは違ったり...(これを結構忘れてる)。後は、IPL等でsyslogdを実行すればOKです。

Haskell読書会@ぐぐれ浜松が終わりました

第8回Haskell勉強会@ShizuDevで、無事スピーカーが終わりました。
ぐぐれ浜松...噂にたがわぬ、強者でした。それはコレを見て頂ければ、わかるでしょう...

紆余曲折ありましたが、実際には無事にプロジェクタも手に入り、1時間遅れぐらいでスタートしました。
自分の話の内容は、あまり大した事ではないので割愛いたしますが、以前取り上げたWindows」環境で、ANSIを使う場合に、ansi-terminal内の標準関数が用意されている事が分かりましたので、この場を借りて訂正します。
■カーソルポジションと画面クリア

-- nasi-terminalのインポート
import System.Console.ANSI

-- 画面クリア
clearScreen

-- カーソル位置(1,1)が左上
setCursorPosition 1 1

こんな感じでansi-terminalが入っていれば簡単に出来ます。

次回は初の富士開催です。みんなでB級グルメの”つけナポリタン”を、お昼に食べたい方は、am11:30に、岳南鉄道吉原本町駅に集合です。

iSeriesAccess for Linux の インストール

以前、Debian系にiSeriesAccess for Linuxをインストールした時に上手くいかず、投げ出したままだったので、CentOSで試した時のメモです。
IBMからは、rpmで提供されているので、環境としてはRHEL系を前提としている様です。

sudo rpm -hUv iSeriesAccess-5.4.0-1.6.i386.rpm

libodbcinst.so.1 は iSeriesAccess-5.4.0-1.6.i386 に必要とされています
libodbc.so.1 は iSeriesAccess-5.4.0-1.6.i386 に必要とされています
libstdc++.so.5 は iSeriesAccess-5.4.0-1.6.i386 に必要とされています
libstdc++.so.5(CXXABI_1.2) は iSeriesAccess-5.4.0-1.6.i386 に必要とされています
libstdc++.so.5(GLIBCPP_3.2) は iSeriesAccess-5.4.0-1.6.i386 に必要とされています
libstdc++.so.5(GLIBCPP_3.2.2) は iSeriesAccess-5.4.0-1.6.i386 に必要とされています
libXm.so.3 は iSeriesAccess-5.4.0-1.6.i386 に必要とされています
libXp.so.6 は iSeriesAccess-5.4.0-1.6.i386 に必要とされています

と足りないパッケージのオンパレードなので、

yum provides xxxxxxx.so.x

で結局たりないパッケージは以下の4つでした。

    • unixODBC-2.2.11-7.1.i386
    • compat-libstdc++-33-3.2.3-61.i386
    • openmotif22-2.2.3-18.i386
    • libXp-1.0.0-8.1.el5.i386
sudo yum install unixODBC-2.2.11-7.1.i386 compat-libstdc++-33-3.2.3-61.i386 openmotif22-2.2.3-18.i386 libXp-1.0.0-8.1.el5.i386

sudo rpm -hUv iSeriesAccess-5.4.0-1.6.i386.rpm

上記でインストールは完了しました。すんなり行きましたね。ibm5250というコマンドが/usr/binに出来ます。※ClientAccess(今は呼び方違うと思いますが)のライセンスが必要なようなのでご注意を。

5035の場合 : ibm5250 192.168.1.254 -LANG ja_JP -USE_CP5035
5026の場合 : ibm5250 192.168.1.254 -LANG ja_JP

コードページの設定は「-USE_CP5035」オプションで行えるようです。

Windows環境でプログラミングHaskell第9章をやる為の準備

ShizuDevのHaskell勉強会で、プログラミングHaskell第9章”対話式プログラム”のスピーカーをやらせて頂きます。

第9章の中でターミナルの制御に、エスケープシーケンスを使っており、Windows環境の方は、「出来なくなってしまうのでは?」と思い調べましたら、ansi-terminalというGHCのライブラリがありましたので、それを入れる事により、ターミナル制御用の関数を提供してくれます。Hugsの方はスミマセン。

勉強会まで時間が無いという事もあり、取り急ぎやり方を羅列しておきます。

検証した環境 : Windows XP SP3 ,GHC-6.10.4

GHCは恐らく、6.10.x系は大丈夫と思われます。GHC-6.12.x系は動きません。自分がそうでした。ディレクトリ構造を見たら、10から12で大きく変わってました。

cabal-installを入れる

ghcのパッケージインストールツールである”cabal-install”を入れます。
cabal-installのページ
cabal-installのダウンロードページ

ダウンロードページから、”cabal-install tool (version 0.8.2)”と書いてある下の”cabal.exe”をダウンロードします。

%HASKELL_HOME%\binに、先程ダウンロードした、”cabal.exe”をコピー or 移動します。%HASKELL_HOME%はGHCのインストールディレクトリです。PATHに%HASKELL_HOME%\binを通すのは、Windowsインストーラがしてくれているハズです。

cabalの動作確認

以下はcabalの代表的な操作です。

#バージョン確認
cabal --version

#リポジトリリストの更新
cabal update

#cabalに対応するパッケージを確認
cabal list 

# インストール済みのパッケージ
cabal list --installed

#何が起こるか事前確認が出来る
cabal install パッケージ名 --dry-run 

#パッケージのインストール
cabal install パッケージ

#更新可能パッケージの確認
cabal upgrade --dry-run

#パッケージの更新
cabal upgrade

    • 次に、「cabal update」でcabalのリポジトリリストを更新します。更新が完了すると「C:\Documents and Settings\ユーザ\Application Data\cabal」にディレクトリが、出来てここにパッケージが入ります。


ansi-terminalのインストール

ソースは勉強会、当日にもお知らせしますので、Windowsの方は、環境だけでも作っておいてください。
お忙しいとは思いますがお願い致します。

以下は、本に記載で使えない関数の代表的な代替え関数です。


カーソル位置と画面クリアは、勉強会の結果、ansi-terminalで、簡単に出来る事が分かりましたので、こちらで訂正しております。

代替えの関数の抜粋


カーソルポジション用「setCursorPosition」関数

■Win32ANSI.hs(本はputStr "\ESC[x;yH")

{-# LANGUAGE ForeignFunctionInterface#-}
module Win32ANSI (setCursorPosition) where

import System.IO
import System.Win32.Types

import Data.Bits

import Foreign.C.Types
import Foreign.Marshal
import Foreign.Ptr
import Foreign.Storable
import Foreign.StablePtr

import Control.Concurrent.MVar
import Control.Exception (bracket)

import GHC.IOBase (Handle(..) ,Handle__(..) ,FD )

hSetCursorPosition :: Handle
                   -> Int 
                   -> Int 
                   -> IO ()
setCursorPosition :: Int 
                  -> Int 
                  -> IO ()

setCursorPosition = hSetCursorPosition stdout

withHandle :: Handle -> (HANDLE -> IO a) -> IO a
withHandle handle action = do
    hFlush handle
    withHandleToHANDLE handle action

adjustCursorPosition :: HANDLE -> (SHORT -> SHORT -> SHORT) -> (SHORT -> SHORT -> SHORT) -> IO ()
adjustCursorPosition handle change_x change_y = do
    screen_buffer_info <- getConsoleScreenBufferInfo handle
    let window = csbi_window screen_buffer_info
        (COORD x y) = csbi_cursor_position screen_buffer_info
        cursor_pos' = COORD (change_x (rect_left window) x) (change_y (rect_top window) y)
    setConsoleCursorPosition handle cursor_pos'

hSetCursorPosition h y x = withHandle h $ \handle -> adjustCursorPosition handle (\window_left _ -> window_left + fromIntegral x) (\window_top _ -> window_top + fromIntegral y)




type SHORT = CShort

type UNPACKED_COORD = CInt

unpackCOORD :: COORD -> UNPACKED_COORD
unpackCOORD (COORD x y) = (fromIntegral y) `shiftL` (sizeOf x * 8) .|. (fromIntegral x)


peekAndOffset :: Storable a => Ptr a -> IO (a, Ptr b)
peekAndOffset ptr = do
    item <- peek ptr
    return (item, ptr `plusPtr` sizeOf item)

pokeAndOffset :: Storable a => Ptr a -> a -> IO (Ptr b)
pokeAndOffset ptr item = do
    poke ptr item
    return (ptr `plusPtr` sizeOf item)


data COORD = COORD {
        coord_x :: SHORT,
        coord_y :: SHORT
    }

instance Show COORD where
    show (COORD x y) = "(" ++ show x ++ ", " ++ show y ++ ")"

instance Storable COORD where
    sizeOf ~(COORD x y) = sizeOf x + sizeOf y
    alignment ~(COORD x _) = alignment x
    peek ptr = do
        let ptr' = castPtr ptr :: Ptr SHORT
        x <- peekElemOff ptr' 0
        y <- peekElemOff ptr' 1
        return (COORD x y)
    poke ptr (COORD x y) = do
        let ptr' = castPtr ptr :: Ptr SHORT
        pokeElemOff ptr' 0 x
        pokeElemOff ptr' 1 y


data SMALL_RECT = SMALL_RECT {
        rect_top_left :: COORD,
        rect_bottom_right :: COORD
    }

rect_top, rect_left, rect_bottom, rect_right :: SMALL_RECT -> SHORT
rect_top = coord_y . rect_top_left
rect_left = coord_x . rect_top_left
rect_bottom = coord_y . rect_bottom_right
rect_right = coord_x . rect_bottom_right

instance Show SMALL_RECT where
    show (SMALL_RECT tl br) = show tl ++ "-" ++ show br

instance Storable SMALL_RECT where
    sizeOf ~(SMALL_RECT tl br) = sizeOf tl + sizeOf br
    alignment ~(SMALL_RECT tl _) = alignment tl
    peek ptr = do
        let ptr' = castPtr ptr :: Ptr COORD
        tl <- peekElemOff ptr' 0
        br <- peekElemOff ptr' 1
        return (SMALL_RECT tl br)
    poke ptr (SMALL_RECT tl br) = do
        let ptr' = castPtr ptr :: Ptr COORD
        pokeElemOff ptr' 0 tl
        pokeElemOff ptr' 1 br


data CONSOLE_SCREEN_BUFFER_INFO = CONSOLE_SCREEN_BUFFER_INFO {
        csbi_size :: COORD,
        csbi_cursor_position :: COORD,
        csbi_attributes :: WORD,
        csbi_window :: SMALL_RECT,
        csbi_maximum_window_size :: COORD
    }
    deriving (Show)

instance Storable CONSOLE_SCREEN_BUFFER_INFO where
    sizeOf ~(CONSOLE_SCREEN_BUFFER_INFO size cursor_position attributes window maximum_window_size)
      = sizeOf size + sizeOf cursor_position + sizeOf attributes + sizeOf window + sizeOf maximum_window_size
    alignment ~(CONSOLE_SCREEN_BUFFER_INFO size _ _ _ _) = alignment size
    peek ptr = do
        (size, ptr1) <- peekAndOffset (castPtr ptr)
        (cursor_position, ptr2) <- peekAndOffset ptr1
        (attributes, ptr3) <- peekAndOffset ptr2
        (window, ptr4) <- peekAndOffset ptr3
        maximum_window_size <- peek ptr4
        return (CONSOLE_SCREEN_BUFFER_INFO size cursor_position attributes window maximum_window_size)
    poke ptr (CONSOLE_SCREEN_BUFFER_INFO size cursor_position attributes window maximum_window_size) = do
        ptr1 <- pokeAndOffset (castPtr ptr) size
        ptr2 <- pokeAndOffset ptr1 cursor_position
        ptr3 <- pokeAndOffset ptr2 attributes
        ptr4 <- pokeAndOffset ptr3 window
        poke ptr4 maximum_window_size

foreign import stdcall unsafe "windows.h GetConsoleScreenBufferInfo" cGetConsoleScreenBufferInfo :: HANDLE -> Ptr CONSOLE_SCREEN_BUFFER_INFO -> IO BOOL

foreign import stdcall unsafe "windows.h SetConsoleCursorPosition" cSetConsoleCursorPosition :: HANDLE -> UNPACKED_COORD -> IO BOOL
foreign import stdcall unsafe "windows.h SetConsoleTitleW" cSetConsoleTitle :: LPCTSTR -> IO BOOL



getConsoleScreenBufferInfo :: HANDLE -> IO CONSOLE_SCREEN_BUFFER_INFO
getConsoleScreenBufferInfo handle = alloca $ \ptr_console_screen_buffer_info -> do
    failIfFalse_ "getConsoleScreenBufferInfo" $ cGetConsoleScreenBufferInfo handle ptr_console_screen_buffer_info
    peek ptr_console_screen_buffer_info


setConsoleCursorPosition :: HANDLE -> COORD -> IO ()
setConsoleCursorPosition handle cursor_position = failIfFalse_ "setConsoleCursorPosition" $ cSetConsoleCursorPosition handle (unpackCOORD cursor_position)


foreign import ccall unsafe "_get_osfhandle" cget_osfhandle :: FD -> IO HANDLE

withHandleToHANDLE :: Handle -> (HANDLE -> IO a) -> IO a
withHandleToHANDLE haskell_handle action = 
    withStablePtr haskell_handle $ const $ do
        let write_handle_mvar = case haskell_handle of
                FileHandle _ handle_mvar     -> handle_mvar
                DuplexHandle _ _ handle_mvar -> handle_mvar
        
        fd <- fmap haFD $ readMVar write_handle_mvar
        
        windows_handle <- cget_osfhandle fd
        
        action windows_handle

withStablePtr :: a -> (StablePtr a -> IO b) -> IO b
withStablePtr value = bracket (newStablePtr value) freeStablePtr

■画面消去

import System.Cmd (system)


cls            :: IO ()
cls            =  do system("cls")
                     return ()


■ビープ音

beep                          :: IO ()
beep                          =  do putStr "\BEL"
                                    hFlush stdout


■標準入力読取(入力した文字を表示させない)

getCh                         :: IO Char
getCh                         =  liftM (chr . fromEnum) c_getch
foreign import ccall unsafe "conio.h getch" c_getch :: IO CInt

Haskell読書会8th@ぐぐれ浜松 開催のお知らせ

早いもので、ShizuDevのHaskell読書会も第8回を迎えます。Haskell読書会も残すところあと5回です。次のテーマは...なんて話も最近はチラホラ。

話は戻りますが、ShizuDev初の西部開催で浜松となります。

浜松と言えば餃子...懇親会は紅虎餃子房で、食べ放題です。(第9回は富士で、Haskell読書会9th@つけナポリタンを予定w)

スピーカは、私がやらせて頂く事になっております。

読書会という特性上、途中参加は難しい面もあるかと思いますが、静岡の技術者交流の場として、是非ご参加下さい。

ShizuDev haskellサイト

以下の要領で第八回Haskell読書会を開催いたします。

参加者は、one drinkをオーダーして頂く必要がありますが、勉強会の参加費は無料となっておりますので、こぞってご参加下さい。

●開催要領
・日時: 2010年8月28日(土) 13:00〜17:00
・場所:場所:ぐぐれ浜松2階http://web-cci.jp/ggl/
※階段が判りづらい場所にあります。一時1階集合という事でお願い致します。
・地図: http://bit.ly/bIjs13
・定員: 20名
・費用: 無料ですが、各自1ドリンクをオーダーして頂く必要がございます。
・持ち物: パソコン(練習問題をやるのに使用)、課題図書
・課題図書: プログラミングHaskellISBN:4274067815)※各自事前購入
・環境: OS依存はしないが、GHC又はHugsを事前導入しておく事
・範囲: 9 章
・担当: うしだ
・懇親会 : 紅虎餃子房 浜松店 http://www.hotpepper.jp/strJ000030987/map/
・懇親会費: 一般 4,000 円、学生・未成年 2,000 円 程度の予定

・登録フォーム:http://bit.ly/ShizuDevHaskell08Entry
・登録状況確認:http://bit.ly/ShizuDevHaskell08EntryList

ER Masterに感激した

今更ながら、ER Master というEclipseプラグインを初めて知りました。こういう時自分の情報収集能力の低さに呆れる時があります。あまりの出来の良さにビックリしました。ここまで痒いところに手が届いてしまって良いのか?とさえ思いました。導入や使い方等は至って簡単なので参考リンクをどうぞ。

プラグインリポジトリ - http://ermaster.sourceforge.net/update-site/

ER図を描画するとxmlベースのファイルに落ちるようです。ER図をhtml,xls形式,DDLに保存出来たり、論理名と物理名両方で表示できたり、ER図からDB作成や、リバースエンジニアリングに対応しているDBも有るようで、まさに至れり尽くせりです。
DB2には対応している様ですが、AS400JDBCドライバは流石に未対応のようです。とは言え、xmlベースなのでDBからメタ情報を引っ張って来て、簡単にER図を作成する事は、出来そうですね。:-)

■ER Masterスナップショット

  • Eclispe

  • html出力