2014/10/26

ReadyNAS 102 購入

FreeBSDのサーバに2Tのディスクを増設して、ファイルサーバも兼ねさせていたのだが、TimeMachineのバックアップやら他のマシンがクラッシュしたときのディスクイメージやら何やら置いていたら、手狭になってきた。
というわけで、会社にもあるNETGEAR Inc. ReadyNAS 102にしてみた。Linuxで動いているので、いろいろ遊べそうってのも理由の1つ。
ディスクはついていないので、別途2台調達する必要がある。何でもよいわけではなさそうだったので、動作確認リストにあったTOSHIBA DT01ACA300 3TB 6Gbps SATA対応 3.5インチ内蔵ハードディスクドライブにした。探していたら、他のディスクよりちょっと安かったので。
合計すると安いデスクトップパソコン位のお値段になってしまうけど、最近、インストールして、設定して、といった作業があまり楽しくなくなってきたので、こういう製品を使うのもありかなと。置き場所がないとか、安いパソコンだと壊れるとか、そういう問題もあるし。
で、これを普通のコンセントに挿すと停電で悲しい目にあうので、UPS(使っているのはAPC Smart-UPS1000 )に繋げる。停電まではいかないけど、瞬電っては意外とあるので。


2014/10/22

The RSpec Bookのoutputがエラーになる

The RSpec Bookの写経を始めたのだが、本が古い、というか、ライブラリがバージョンアップしていて、本の通りだと動かない。
#本の通りバージョンを指定してライブラリをインストールすればよいのだろうけど。

4章5章あたりでエラーになったのでググったところ、 Pragmatic Forums | Problem test doubleに解決策があった。



2014/10/18

Silexのログに項目を追加する

PHPのマイクロフレームワークの1つである Silexでログを切り替える話を Silexのロギングを変更する | Hiroaki's blogでまとめたのだが、今回は、そのログに出力する項目を増やす話。

Silexはログ出力にmonologを使うのため、MonologServiceProvider | Japan Symfony Groupというものを用意している。これに、ログの項目を増やすための口が用意されているのだが、日本語のドキュメントには書いてなさそう。まぁ、monologに用意されている機能をうまくwrapしているのだが。
monologのProcessorがそれ。既にいくつか用意されているし、コードを見た感じ、独自のものを作るのも、それほど大変ではなさそう。
Silexからは、pushProsessor()を使う。こんな感じ。

$app['monolog'] = $app->share($app->extend('monolog', function($monolog, $app) {
 $monolog->pushProcessor(new ProcessIdProcessor($app['monolog.level']));
 $monolog->pushProcessor(new WebProcessor());
 return  $monolog;
}));
ProcessIdProcessor()のように、引数が必要なものもあるので、コードをみて判断。
わかってしまえばドキュメントにするほどのものでもないのだろうけど、SilexのxxxProviderの説明がもうちょっと欲しいところ。まぁ、コードを読まない/読めない(コピペで済ます)レベルの人お断りっていうスタンスでいくなら、それもありかと。



2014/10/17

RSpecからTurnip、Capybara、WebDriverを使うための設定

さて、前回までで一般的な準備が終わったので、これからテストプログラム用の準備をして行く。
ターミナルやコマンドプロンプトを開いて、テストプログラムのディレクトリ(Gemfileのあるディレクトリ)で、bundle exec rspec --initと入力する。と、RSpecで使うファイルのひな形が用意される。 Turnipを使うには、もう一手間。作られているspecディレクトリの下に、featuresディレクトリとstepsディレクトリを作っておく。

ここから設定。.rspecとspec/spec_helper.rb に書いていく。
.rspec には、RSpecの起動時のオプションを書く。今回、Turnipを使うので、1行目に
-r turnip/rspec
を挿入する。

次、spec/spec_helper.rb。ここでようやくCapybaraSelenium WebDriverが登場する。
spec/spec_helper.rbの先頭に

require 'rubygems'
require 'bundler/setup'
require 'capybara/rspec'
require 'selenium-webdriver'
一番最後の行(行頭からendと書いてある)の前に下記を挿入。

config.include Capybara::DSL
そして、一番最後の行の下に下記を追加。

Capybara.register_driver :remote_browser do |app|
  caps = Selenium::WebDriver::Remote::Capabilities.firefox
  url  = "http://localhost:4444/wd/hub/"
  opts = { desired_capabilities: caps, browser: :remote, url: url }

  driver = Capybara::Selenium::Driver.new(app, opts)
  driver.browser.file_detector = lambda do |args|
    str = args.first.to_s
    str if File.exist? str
  end
  driver
end

Capybara.default_driver = :remote_browser
Capybara.run_server = false

Dir.glob("spec/steps/**/*steps.rb") { |f| load f, true }
まとめると、spec/spec_helper.rbは となる。

これで、spec/features ディレクトリにシナリオを書いたファイルを置いて、spec/stepsディレクトリにシナリオに対するRubyのコードを書いて行けばよい。これについては、また次回に。


2014/10/15

bundlerでライブラリを管理する

Rubyの環境を作る | Hiroaki's blogでbundlerを使えるようにしたので、それを使って必要なライブラリのインストールを行う。
テストプログラムを作るディレクトリに移って、ターミナルやコマンドプロンプトから、bundle initと入力すると、そこにGemfileというファイルが作られる。これが、ライブラリを管理するファイルで、必要なライブラリはこのファイルに記述する。RSpec + Capibara + Turnip + Selenium WebDriver でテストプログラムを書くので、こんな感じ。

# Gemfile for test of XXX project
source "https://rubygems.org"

gem "selenium-webdriver"
# gem "selenium-client"
gem "capybara"
gem "turnip"
gem "rspec"
gem "rspec_junit_formatter"
Gemfileの準備ができたら、ライブラリをインストールする。ターミナルやコマンドプロンプトから、bundle install --path vendor/bundleと入力する。--pathで指定したディレクトリに ライブラリがインストールされるので、他のプログラムと混ざることはない。一度--pathを指定してインストールすると、その設定が.bundle/config に書かれるので、以後はbundle installでOK。
ソースコードをリポジトリで管理しているのであれば、Gemfileだけではなく、vendor/* や.bundle/* も管理対象にしておくと、人によってライブラリのバージョンが違うという問題が起こらない。


2014/10/13

Rubyの環境を作る

LinuxやMac OSXであればそれほど気にすることはないのだが、Windows上でRubyを使うのはちょっと大変。
依存するライブラリを入れる必要があるので、DevKitのインストール - Railsインストールを見ながらDevKitをインストールしておく。

プロジェクトで使用するライブラリの管理にはbundlerを使うのが良いらしいので、ターミナルなりコマンドプロンプトなりからgem install bundlerとしてインストールする。インストール先がシステムで設定されているものになるが、どのプロジェクトでも使うので、これでよし。


2014/10/12

RSpecでテストすることにした

テスト。PHPでゴリゴリテストを書くのも嫌なのでどうしようかと思ったけど、受け入れテストみたいな感じでテストすることにした。とはいえ、今回のプロジェクトはいくら催促しても最終仕様が明示されないため、テストはこちらではやらないということで決着、やる必要はなくなったので、他のプロジェクトにも使えるような方法を探した。
で、結局、 Turnip + Selenium WebDriverでWebアプリ受け入れ試験 | AdventCalendar2013 あたりを参考に、RSpec + Capibara + Turnip + Selenium WebDriver でちょっと試してみることにした。
メジャーなパターンかと思いきや、意外と情報がなくて苦労したので、ボチボチまとめていくことにする。


2014/10/05

dialogがエラーになってportsの設定ができない

FreeBSD 8.4-RELEASE-p16なマシン。pkgngに切り替えたら、OCN IPv6に繋がらなくなった。 /usr/local/etc をバックアップせずに切り替えてupgradeしたのもまずかったが、 setup scriptがエラーになって設定ファイルが作られていなかったというのが原因っぽい。
# sh -x /usr/local/sbin/mpd-l2tp-ipv6pd-client-setup
+ PREFIX=/usr/local
+ DATADIR=/usr/local/share/mpd-l2tp-ipv6pd-client
+ MPD_NAME=mpd5
+ CONFDIR=/usr/local/etc/mpd5
+ : 0
+ mktemp -t ipv6pd
+ tempfile=/tmp/ipv6pd.iVAVpp8J
+ dialog --title 'L2TP-IPv6PD Setup' --clear --mixedform 'Please input L2TP-IPv6PD account information.' 11 76 0 'User ID:' 1 1 '' 1 36 64 0 0 Passwd: 2 1 '' 2 36 64 0 0 'L2TP-IPv6PD Server (Fixed Prefix):' 3 1 '' 3 36 64 0 0 'Prefix Delegation Interface:' 4 1 '' 4 36 64 0 0
+ retval=255
+ rm /tmp/ipv6pd.iVAVpp8J
+ exit
/usr/local/share/mpd-l2tp-ipv6pd-client にあるひな形を直しながら /usr/local/etc/mpd5 に置いて復活させたけど、困っていないのかな?今時8.4を使っている方が悪いのかな?


2014/09/21

Silex(Monolog)のロギングを変更する

Homepage - Silex - The PHP micro-framework based on Symfony2 Components のロギングとして、MonologServiceProvider | Japan Symfony Groupというものがあり、通常はこれを使う。
しかしこのロギング、指定したファイルに延々と書き続けるもので、日ごとにファイルをわけたり、ファイル以外の所に書き出したりできない。
元となる Seldaek/monolog · GitHubには、 Handlerという形で、メールに飛ばしたり、DBに書き込んだりする機能が用意されているので、それらを使う方法はないだろうか?

MonologServiceProvider 設定に変更する例が載っていたので、pushHandler()でRotatingFileHandlerを登録してみた。
確かに、日ごとにログファイルが分割されるのだが、相変わらず分割されないファイルにもログが書き出される。これは、変更ではなく、追加だ。

結局
$app[monolog.handler] = function() use ($app){ return new XXXhandler();};
として、無理矢理書き換えているのだが、イマイチな感じがする。

RotatingFileHandlerを使わずに外部のログのローテーションの仕組みを使え!と書いてあるのだが、今回、Windowsで動かすので、そういった当たり前の機能が見当たらない。外部コマンドで用意すべきなんだろうけど、そこはWindowsと*nixの思想の違いということで。


2014/08/11

カキ1キロがクーポンで無料だった

久しぶりにサークルのメンバーでの飲み会。
クーポンで牡蠣1キロがサービス。殻とかもろもろ含んでの1キロなんだろうけど。


適当な比較対象がないので、写真のボウルの大きさが伝わらない…。


TimeMachineが止まるので、バックアップ先のSpotlightをOffにする

MacBook Airを使用中。いちいち外付けHDを繋ぐなんて面倒なので、TimeMachineのバックアップ先は当然NAS。

どうもTimeMachineが途中で止まってしまうというか、メニューから見るとバックアップした容量が全然増えなくなることがちょくちょく発生する。ググってみると、 MavericksのTimeMachineが途中で止まって進まない場合の対処方法 - drk7jp という記事を発見した。あぁ、SpotlightのIndex作成処理で、待たされているのね。

バックアップ先をIndex対象外に設定しても、 TimeMachineのバックアップ先は複数設定できるから、新しいバックアップ先を追加した時にまた同じ問題に直面しそう。
というわけで、scriptにしてみた。rootのcronに、適当な間隔で実行するよう登録。



2014/06/08

PHPでExcelの内容をDBに登録する

Javaの時は、DbUnitでExcelに書いたテストデータをDBに登録してテスト、ということが、簡単に(とはいっても、POIに苦しめられるのだが)できたのだが、PHPではどうなの?

PHPUnitにもdbunitという拡張があって、それを使うとDBを使ったテストができる。が、

  • Excelファイルをテストデータとして読み込むことはできない。
  • CSV, XML, YAMLでテストデータを用意することはできるが、複数のテーブルに対して1つのファイルでデータを書けるのは、MySQLのときだけっぽい。
という状況。

仕方がないので、PHPの勉強も兼ねて、xlsファイルの内容をDBに登録するfunctionを書いてみた。



2014/06/03

PhingからPHPUnitを使ってみる

PHPのライブラリ管理はComposerを使うらしい。というので、 PhingPHPUnit – The PHP Testing Frameworkをインストールしようと、 composer.jsonを書いてみた。ら、見事に動かない。PHPな人はPhingを使わない?自動テストやらないの?

で、PhingのBTSのチケットにPHPUnit4で動かないというのがあって、対応したらしい。が、今の最新リリースである2.7.0は対応前のバージョンのようだ。phing/phing - Packagistで確認したところ、 2.7.0以降のものも登録されているようなので、それをcomposer.jsonで指定すれば動くはず。



2014/06/02

IIS ExperssでPHPを動かす

わざわざIIS Expressを使うのは

Download the Microsoft Web Platformからインストーラいれて、ポチポチやっておしまい。
だったらわざわざ書かない訳で。

  • 本番環境はIIS7とかIIS8とか。
  • PHPでフレームワーク使うから、URLのRewriteが必要
  • 諸般の事情により、開発環境はIIS5かIIS6が標準

なんて状態だと、Web.config(というか、Rewrite設定)って、本番用と開発用と2つ用意して…とか、いかにもトラブルが起こりそうな状態に。
という訳で、IIS Expressの出番

インストールはWeb Platformから。で、このとき、IIS用のPHPとか入れてしまわないようにする。一度、オプションを開いて、IIS Expressを選択しておくのと、インストールのときの内容確認でIIS Experss用でないものを外しておけば、OK

IIS ExpressでのPHPの設定

IIS ExpressでPHPを有効にする方法 | Express for Webにずばり…と思ったけど、うまくいかない。DOS窓からiisexpress立ち上げたときのメッセージを頼りに、使われている(起動時に生成された)設定ファイルを見てみたところ、PHP向けの設定が反映されていなかった。ので、IIS Express側の(大元の)設定ファイルを、上記記事に従って書き換えてしまう。大元なので、他の設定でIIS Expressを立ち上げることはできなくなるけど、PC安いし仮想マシンもサクッと上がるし、問題ないでしょう。
大元の設定ファイルは、

IIS Expressをインストールしたフォルダ\AppServer\applicationhost.config

IIS Expressの動かし方

ずばり、Running IIS Express from the Command Line : The Official Microsoft IIS Site。英語が辛いというのであれば、IIS EXPRESSの使い方(Windows XPでIISを使った開発) - あおきのTechメモMicrosoftが IIS Express-新しい組込みwebサーバーをどうぞ。

つまり、

iisexpress /path:アプリのあるフォルダまでの絶対パス /port:ポート番号
ポート番号を1024以下にするのであれば、管理者権限でiisexpressをキックする必要があるのはお約束。



2014/06/01

いまさらSQL Server 2000を動かす

今更ながら、SQL Server 2000との戦い(笑)が始まるのだ。

  • DB Serverアップグレードしないとまずいよね
  • DBアップグレードしても、アプリ側問題ない?
  • アプリ再テストだよね。現状を反映した仕様書ある?テストできる?
  • いっその事、アプリも新DBに対応した奴に作り替える?
  • DBもアプリも一気に更新って、リスク高くない?DBは他システムとも連携しているし
  • アプリを先に更新するか。現DBにも新DBにも対応する仕様で

なんてやり取り、ないとは言い切れないのはよくある話。 で、そうすると、SQL Server 2000が動く環境が必要になるのだ。
ググってみると、Windows 7にインストールしたなんて話がヒットするが、その話、あてにならない。やってみると わかるのだが、インストールできるのはSQL Server 2000のクライアントの部分。肝心のDBエンジンは 項目としてはグレーアウトしていて、インストールできないのだ。

結局、SQL Server 2000の動作要件に書いてあるOSが必要になる訳なのだが、XPを入れると、Windows Updateできない!というわけで、選択肢はWindows Server 2003になる。のだが…。

SPの当たっていないServer 2003を入れてみたら、

  • Windows Updateしようとする
  • IEのバージョンを上げろというエラーメッセージと、IE8のダウンロードリンクが書かれたページに飛ばされる
  • IE8をダウンロードしてインストール
  • サポートされていないOSと表示
で、結局Windows Updateできない。

正解は、「別のマシンでWindows Server 2003用のSP2をダウンロードしておいて、Windows Updateする前にSP2をインストールする。」
休日丸1日費やしてたどり着いた結論。



2014/05/06

使っているiPhoneアプリ10選

iPhoneというか、第4世代iPod Touchなので、iOS6で動くものに限られるけど、よく使っているものをピックアップ。

TwitterもFacebookもGoogle+も、読むのはこれで。Facebookはグループ毎に登録することもできる。Yahoo! Financeもtenki.jpも、これで。
書くのはこれ。Twitter/LinkedIn/Facebook/Google+に同時Postできるし、指定した時間にPostすることもできる。
Pocket
無料
(2014.05.06時点)
 App Store
posted with ポチレバ
後で読むって奴。適当に整形しておいてくれるし、必要であればオリジナルのあるWebサイトを開ける。
Feedly Reader
無料
(2014.05.06時点)
 App Store
posted with ポチレバ
Google Readerの乗り換え先。だけど、iPhoneだと読むのはReederを使うことが多い。
情報源。このアプリか、TwitterのTLから拾ってくることが多い。
Evernote
無料
(2014.05.06時点)
 App Store
posted with ポチレバ
メモ。標準アプリのメモもよく使うけど、こちらはアプリやブログの参考ページのリンクとか、構想とかで使う。Android/PCと連携しているので、ちょっと時間があれば見直して書き足すような使い方。
充電するときはこれを開いている。
電話。そもそも、電話をすることがほとんどないので、いつも持ち歩いているガラケーの無料通話枠で済んでしまう。なので、このアプリの出番はない。
ゆれくるコール
無料
(2014.05.06時点)
 App Store
posted with ポチレバ
まだ揺れることがあるからね。
FINAL SHOUT
無料
(2014.05.06時点)
 App Store
posted with ポチレバ
一応ね。


2014/05/05

リソース監視に使えるツールのメモ

HerokuでGrowthForecastを動かす | Hiroaki's blogなんてことをやって、リソース監視ツールを外のサーバ(サービス)を使うようにしようとしていたのだが、GrowthForecast - Lightning fast Graphing / Visualization以外にも流行っているツールがあるらしい。ということで、目についたものをリストアップ。

Elasticsearch.org Kibana | Overview | Elasticsearch

Splunk Storm | Cloud Data Analysis and Log Management

サービスのお値段を見ていると、さくらのVPSみたいなので自分で環境を作るのが安上がりなのだが、もうちょっと手軽にやりたいなぁということで、Splunkを触ってみることにした。Kibana+Elasticsearchを、無料で試す方法があったら試してみたいけど。



2014/05/03

HerokuでGrowthForecastを動かす

GrowthForecastをherokuで動かしてみる 2014年度版 | cohakim's blog REBORN! に従えばOK!っていうほど、世の中甘くない。

の2つにわかれるのだが、どちらも少しずつ手を入れたので、メモ。

heroku-buildpack-perl

HerokuでPerlを動かすためにはbuildpackを用意する必要がある。

  • cpanmのダウンロードURLが変わったっぽい
  • localディレクトリ以下が増殖する
といった不具合が見つかったので、修正したbuildpackをhiroaki0404/heroku-buildpack-perlに用意。これはそのまま使えるので、Herokuにアップロードするアプリのあるディレクトリで
heroku create —stack cedar —buildpack http://github.com/hiroaki0404/heroku-buildpack-perl.git
とすれば、OK。

GrowthForecast

DBとしてMySQLを使うようになっているので、herokuに環境変数を設定。

DBI_DRIVER mysql ←いらない?
MYSQL_USER
MYSQL_PASSWORD
DBI_DSN ←他の名前でもいいが、Procfileの --with-mysql に渡す。
Procfileはこんな感じ。
web: perl -Mlib=./local/lib/perl5 growthforecast.pl --front-proxy=127.0.0.1 --with-mysql "$DBI_DSN" --port $PORT
ユーザ認証が欲しいので、growthforecast.pl に追加。 環境変数GF_USERとGF_PASSWORDを参照するので、heroku config:addしておく。
Procfileはこんな感じ。
web: perl -Mlib=./local/lib/perl5 growthforecast.pl --user-auth --front-proxy=127.0.0.1 --with-mysql "$DBI_DSN" --port $PORT

本当はapp.psgiで認証処理を追加したかったのだが、うまくいかなかった。


2014/04/13

DockerやらChefやら

まとめ

非常に乱暴に言ってしまうと、
  • Chefは環境を作る手順をまとめたもの
  • Dockerは作り上げた環境のイメージ
なので、Chefは設定対象が実機であれVMであれコンテナであれ、関係なく動作する。
Dockerは、VMに似ているけど、VMが動くコマンドと見なす方がしっくりくる。

DockerのイメージをChefで作り上げるってのもありだし、Chefのレシピを作る際にDockerで動かして確認するってものあり。

Docker



2014/04/12

移行アシスタントが進まない

バックアップ

iMacを買ったので、今までのmac-miniから移行しようとした。 mac-miniはまだ10.8.2。TimeMachineで、NASとFireWire/USB接続の外付けディスクの2カ所にバックアップを取っている。

初期セットアップ時に移行する

iMacにネットワークケーブルをさして、mac-miniのバックアップディスクをUSBで繋いでからスイッチon
→移行元として外付けディスクのバックアップは見つけられない。NASのバックアップは見つけられたものの、これを使うのは無理な状態らしい。

移行アシスタントで移行してみる

そこで、一旦ダミーのアカウントを作ってiMacにログインし、移行アシスタントでmac-miniから移行しようとした。
mac-miniでも移行アシスタントを起動し、移行元としておく。 iMac側の移行アシスタントで移行する項目を選択し、移行を開始する。が、いつまで経っても残り時間が変化しない。3日経っても変わらない。
NASにあるバックアップを選択しても、使える状態ではないらしい。外付けディスクはそもそも移行元として現れない。

結局

他のマシンから移行したいアカウントでiMacにリモートログインして、mac-miniにあるHome Directoryをrsyncで一気にコピー。
rsync でディレクトリの同期(バックアップ) - maruko2 Note.

nfsでサーバのディスクをmountするので、uidやgidはrsyncする前に変更して(揃えて)おくべきだった。 こんなに大変なことになることはないと思っていたのだが…。


2014/04/06

さくらのBASE Storageに申し込んでみる

申し込み

さくらのBASE Storage | ストレージならさくらインターネットから、 「アカウント開設はこちら」をポチ。
会員IDとパスワードを入力して、「ログインして電話認証」をポチ。
登録されている電話番号が表示されるので、その電話で電話番号通知を有効にして電話する。電話の向こうから流れてくるガイダンスに従って、画面に入力する。
コントロールパネルに進むよう表示されるけど、コントロールパネルって、どこ?最初の画面(さくらのBASE Storage | ストレージならさくらインターネット)の「コントロールパネル」が正解。
コントロールパネル画面に遷移すると、シンプル過ぎる画面で心配になるけど、「アカウントの作成」しかやることがないので、それをポチ。約款を読んで、同意にチェックを入れて「作成」。これが、「サービスアカウント」になる。
再度、コントロールパネルの画面を開く。右側の「サービスアカウントでログイン」に、上記手順で作成したアカウント名とパスワードを入力してログインすれば、BASE Storageの管理画面。


画面遷移がちょっとわかりにくいかなぁ。電話認証のあとの「コントロールパネル」と、コントロールパネルでどちらでログインすると何ができるのかが、 わからなかった。けど、本質的な部分ではないからね。



2014/04/05

消費税が上がる前にお買い物

消費税があがるなら

消費税が上がる。というので、買おうかどうしようか迷っているものを思い切って買う。ディスクの遅さが厳しくなってきていたmac-miniの 置き換えとか、Amazonの欲しい物リスト とか。

自分へのプレゼントも兼ねて



2014/03/10

OCamlで数あてゲームを書いてみる

以前、Haskelで数当てゲームを書いてみた(Haskellで数あてゲームを書いてみる | Hiroaki's blog)のだが、今度はOCamlで書いてみた。Js_of_ocamlなんてのを今更ながら知ったので、OCamlもありかなぁなんて。


(* 数あてゲーム *)

(* 4桁の数を作る - これをユーザが当てる *)

(* 同じ数が既にあるかチェックする *)
(* chkvalue : int list -> int -> bool *)
let rec chkvalue lst target = match lst with
     [] -> false
   | first :: rest -> if first = target then true
        else chkvalue rest target

(* 数をリストに追加する。このとき、同じ数が追加されないようにする *)
(* appendvalue: int list -> int -> int list *)
let appendvalue lst v = if chkvalue lst v then lst
   else v :: lst

(* 4桁の数を作る *)
(* makevalue: int list -> int list *)
let rec makevalue lst = if List.length lst = 4 then lst
   else makevalue (appendvalue lst (Random.int 10))

(* blowを数える。ただし、hitもblowとしてカウントする *)
(* chkblow: int list -> int list -> int *)
let rec chkblow userlst complst = match userlst with
        [] -> 0
      | first :: rest -> if chkvalue complst first then 1 + chkblow rest complst
           else chkblow rest complst

(* hitを数える *)
(* chkhit: int list -> int list -> int *)
let rec chkhit userlst complst = match (userlst, complst)  with
    ([], []) -> 0
  |([], first1 :: rest1) -> 0
  |(first1 :: rest1, []) -> 0
  |(first1 :: rest1, first2 :: rest2) -> if first1 = first2 then 1 + chkhit rest1 rest2
      else chkhit rest1 rest2

(* 数値を1桁の配列にする。ただし、逆順になる *)
let rec strarray userval = if userval < 10 then userval :: []
      else userval mod 10 :: strarray (userval / 10)

(* game main *)
let rec judge userval complst = let userlst = strarray userval in
    let hit = chkhit userlst complst in
    let blow = chkblow userlst complst in 
    if hit = 4 then print_string "4 hit!"
    else begin
        print_int hit;
        print_string " hit ";
        print_int (blow - hit);
        print_string " blow";
        print_newline ();
        print_string "? ";
        judge (read_int ()) complst
      end

let kazuate = begin
    print_string "? ";
    judge (read_int ()) (makevalue [])
end
これを適当な名前で保存して、ocamlインタプリタで読み込むと、ゲームスタート。


「基礎」とは言いながら、実は奥が深い一冊。ある程度知識がないと、その奥行きに気付かない。OCamlの本は、他にどんなのがいいんだろう?



2014/03/08

Aterm WR8600NのWAN側アドレスを取得する

先日、家の無線機器を新しくした。今まではBuffaloの無線LANステーション2台をWDSで繋げていたのだが、新規格に対応していないので安くなっていたNEC Aterm WR8600N[HPモデル] イーサネットコンバータセット PA-WR8600N-HP/Eに交換。

で、Dynamic DNS使って外からアクセスできるようにしようと思ったら、BiglobeのDDNSサービスしか対応していないっぽい。SNMPをしゃべれるわけでもないので、管理画面から無理やり割り当てられたアドレスを取ってくるようにしてみた。
wget -q -O - http://Atermのアドレス/index.cgi/info_main | nkf -w | egrep -A 2 'IP.+WAN.+IP' | head -2 | tail -1 | sed -E 's#^.+ ([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}).+$#\1#'
wgetは.netrcをみてくれるので、管理画面のログインID/パスワードは、.netrcに記載しておけばOK。

IPアドレスだとわかるようなタグが付いているわけでもないので、ページの内容から無理やり探している。ファームウェアバージョン 1.0.15では取得できているけど、他ではダメかも。



2014/01/05

ApacheのステータスコードをMuninでグラフ化する

Apache HTTP ServerのステータスコードをMuninでグラフ化する設定。loggrepプラグインを使い、アクセスログを正規表現でパースする。
plugin-conf.dにある設定ファイル(munin-nodeやplugins.conf)に下記の設定を追加する。loggrepプラグインを有効にしたら、munin-nodeを再起動。
[loggrep]
user root
env.title apache status code
env.logfile /var/log/httpd/access_log
env.label_s20x 20x
env.regex_s20x ^[^"]+ "[^"]+" 20\d 
env.label_s30x 30x
env.regex_s30x ^[^"]+ "[^"]+" 30\d 
env.label_s40x 40x
env.regex_s40x ^[^"]+ "[^"]+" 40\d 
env.label_s50x 50x
env.regex_s50x ^[^"]+ "[^"]+" 50\d 


2014/01/02

2014年年賀状


印刷すると微妙な色合いがつぶれてしまうのが、残念。


2014/01/01

Ziproxyのrpmを作る

Ziproxyで3G回線でも快適にネットサーフィン!という記事を見かけるようになったので、試してみようと思った。ら、RPMが用意されていない。昔のバージョンでは用意されていたようだが、最近のバージョンについては見当たらなかった。

rpmfindで調べてみると、Mageiaというディストリビューションには用意されているようだ。というわけで、src.rpmを持ってきて、CentOS 5.10(64bit)向けに手を入れてみた。

rpm for CentOS 5.10(x86_64)
このパッチ、バイナリを用いた結果生じたいかなる問題についても、責任は負いません。自己責任でご利用ください。