サクっと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系を前提としている様です。
- 環境
- IBM i V5R4M0
- CentOS 5.5
- iSeriesAccess for Linuxのサイト
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つでした。
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 --version」で、正しく動作するか確認します。
ansi-terminalのインストール
-
- 「cabal install ansi-terminal」を実行してansi-terminalパッケージをインストールします。
- ansi-terminalの公式サイト
- HackageDB (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)
スピーカは、私がやらせて頂く事になっております。
読書会という特性上、途中参加は難しい面もあるかと思いますが、静岡の技術者交流の場として、是非ご参加下さい。
以下の要領で第八回Haskell読書会を開催いたします。
参加者は、one drinkをオーダーして頂く必要がありますが、勉強会の参加費は無料となっておりますので、こぞってご参加下さい。
●開催要領
・日時: 2010年8月28日(土) 13:00〜17:00
・場所:場所:ぐぐれ浜松2階http://web-cci.jp/ggl/
※階段が判りづらい場所にあります。一時1階集合という事でお願い致します。
・地図: http://bit.ly/bIjs13
・定員: 20名
・費用: 無料ですが、各自1ドリンクをオーダーして頂く必要がございます。
・持ち物: パソコン(練習問題をやるのに使用)、課題図書
・課題図書: プログラミングHaskell (ISBN: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には対応している様ですが、AS400のJDBCドライバは流石に未対応のようです。とは言え、xmlベースなのでDBからメタ情報を引っ張って来て、簡単にER図を作成する事は、出来そうですね。:-)
■ER Masterスナップショット
- Eclispe
- html出力
- Excel出力