3月
Sub-archives
2009年03月30日
CentOS 5.2 netinst
CentOS 5.2 をnetinst をやった。
ミラーの選択ができずに手動でホストとパスを打ち込むのが面倒。
stoneって便利だな
ファイアウォールの内側からproxyでごにょごにょするのが楽。
何が楽ってコンパイルが楽。ファイルが2つしかない。適当にやってもなんとかなる。サーバにsshで入れない状況のときにサーバー側から
ssh -R sport:127.0.0.1:dport host
とかやれば転送が効くので stone proxy sport とやる。
Plone 3.2.1-r4移行テスト
Plone 3.2.1-r4への移行テストをやってみた。
- 単にData.fsをコピーしただけだと挙動不審
- Products/* を全部持ってきたら当然エラーだらけ
- エラーの出るのを地道に削っていって、skinのエラーを直してゴミとなったtoolを消してとやっていたらどうやら動くように。
- Productの中身をコピーしてこないとエラーになる。何が問題かは把握できず。
- 残る問題はQuillsだけ?
2009年03月08日
tailor
migrate changesets between version control systems
いろんなSCMを互いに変換するソフト。汎用的に色々対応しているのが利点か。
例
tailor --verbose -s git -R /home/takaki/src/haskell --subdir oth > o.tailorgitからdarcsに変換した。
tailor --verbose -s svn -R http://svn.plone.org/collective --module Products.Quills --subdir Productsvnからdarcsに変換。
2009年03月06日
オセロのプログラムを書いたときのメモ
オセロのプログラムをHaskellで作成。こんな修正したよというメモ。
if を使わずガードで表記
- rowCheck x y cb =
- if x < 0 then
- True
- else
+ rowCheck x y cb
+ | x == -1 = True
+ | otherwise =
こっちのほうがきれいにかけますね。
List関係いろいろ
リファレンスをながめていて色々できることに気がついた。- if and [getPiece x y ob == Empty, length revPos > 0] then単純な話だけどライブラリは使おう。
+ if and [getPiece x y ob == Empty, not $ null revPos ] then
- foldl (++) "" [ob2Line (7-y) ob | y <- [0..7]]foldlでやっているのが変だった。
- ++ "/01234567\n"
+ concat ([ob2Line (7-y) ob | y <- [0..7]] ++ ["/01234567\n"])
+ doReverse piece ob pos =自分で再帰で書いていたのを工夫したらfoldlでできるようになった。
+ foldl (\ob p -> (putOnPiece (fst p) (snd p) piece ob)) ob pos
- doReverse piece ob [] = ob
- doReverse piece ob (p:pos) =
- doReverse piece (putOnPiece (fst p) (snd p) piece ob) pos
- concatMap (\y -> ob2Line (7-y) ob) [0..7] ++ "/01234567\n"これもライブラリを使ったほうが自然ですよと。
+ concatMap (ob2Line ob) (reverse [0..7]) ++ "/01234567\n"
- initBoard =これはちょっと迷うところではあるけれど。
- Map.fromList [( (p2int 3 4), White), ((p2int 4 4), Black),
- ((p2int 3 3), Black), ((p2int 4 3), White)
- ]
-
+ initBoard =
+ let ob = Map.empty in
+ foldl (\ob p -> putOnPiece (fst (fst p)) (snd (fst p)) (snd p) ob)
+ ob [((3,4), White), ((4,4), Black),
+ ((3,3), Black), ((4,3), White)]
do記法の意味がちょっとわかった
catch (readIO line :: IO (Int,Int))syntax sugar という話。>> がずらずら並ぶときには do を使えば消える
- (\e -> return (e::SomeException) >>
- putStr "Input again!: " >>
- hFlush stdout >>
- readPos)
+ (\e -> do
+ return (e::SomeException)
+ putStr "Input again!: "
+ hFlush stdout
+ readPos)
2009年03月03日
スプロケ発注
チェーンが飛ぶ飛ぶ。駄目だこりゃ。
真ん中3つがほぼ使えない。どういうギアを入れればいいんだか。ホットスピンでCS-6500 11-21を発注。ついでにフロントのリムも交換。Mavicの安いやつに。シルバーの在庫がないからブラックに…。前後で色が違うってのもなあ…。まあいいか。
あたらしいpamの設定ファイルとpam_ldap
libpam-runtimeに入っているpam.d/common-*が変わったのでちょっと設定変更
auth [success=2 default=ignore] pam_unix.so nullok_secure
auth [success=1 default=ignore] pam_ldap.so use_first_pass
auth requisite pam_deny.so
auth required pam_permit.so
となった。3行目の部分がデフォルトで追加されているのでこうなる。今までよりsuccessで飛ばす行数が増えた。
pam.conf(5)を読んでいて気付いたがrequiredとかのキーワードは[...]で定義される条件に名前をつけたものになっているわけですね。
git pushでちょっと驚いたこと
git pushはgit pullの反対ではない。
warning: updating the currently checked out branch; this may cause confusion,
as the index and working tree do not reflect changes that are now in HEAD.
git pushは gitの管理のところにcommit されるだけでワーキングツリーには反映されない。pushしたけりゃ専用リポジトリを用意しておけということみたい。確かに編集中にpushされてどんどんソースが変更されたら困ると思ってそういう設計にしてあるんだろうね。ちなみにpushされた側で git reset をかけたらきちんと merge(?)されたがそれでいいんだろうか。git diffでは何も出力されずに git diff HEADで出力されるというのも、合っているけどなんかね。
でも、自分のやっているように手元のPCとサーバ上の二箇所で作業するんだけの話だとdarcs使ったほうがいいかもしれない。FAQにはいろいろ工夫すればいいよということを書いてあるが…。
readIOで例外処理
パースに失敗してプログラムが落ちるでは意味がないので。
最初はreadを使っていたがreadIOに変更してごにょごにょと次のように。
import IO hiding (catch)
import Control.Exception
import Prelude hiding (catch)
-- ......
readPos :: IO (Int, Int)
readPos = do
line <- getLine
catch (readIO line :: IO (Int,Int))
(\e -> return (e::SomeException) >>
putStr "Input again!: " >>
hFlush stdout>>
readPos)
てな具合で。だんだんなんでもかんても再帰で処理する脳になってきた。よしよし。

