Ruby でランダムな文字列を得る

昨日のやつを Ruby でもやってみた。

# coding: utf-8

def randstr(length)
  pool = ('A'..'Z').to_a + ('a'..'z').to_a + ('0'..'9').to_a
  r = Random.new
  l = pool.size
  rand_str = ''
  length.times do |i|
    rand_str += pool[r.rand(l)]
  end
  rand_str
end

length = ARGV.shift.to_i
print randstr(length)

実行結果:

^o^ > random_string.rb 20
y397x9Bx1z7fAvJTr9RK

Random クラスの使い方はここ:

cf. http://docs.ruby-lang.org/ja/1.9.3/class/Random.html

Pythonでランダムな文字列を得る

さっきのエントリのPython版。

import random
import sys

def randstr(length):
    s = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"
    pool = list(s)
    l = len(pool) - 1
    rand_str = ""
    for i in xrange(length):
        rand_str += pool[random.randint(0, l)]
    return rand_str

length = int(sys.argv[1])
print randstr(length)

random モジュールの使い方についてはこちら:
cf. randomモジュール – blog.PanicBlanket.com

実行結果:

^o^ > python random_string.py 20
cw1xeVn49yXZgexCWuDl

Perlでランダムな文字列を得る

ググってみると String::Random モジュールを使うといいらしいんだけど、うまくインストールできなかったので(原因不明)、もっとベタな方法でやることにした。

use strict;
use warnings;

sub randstr {
    my $length = shift(@_);

    my @chars;
    push(@chars, ('A'..'Z'));
    push(@chars, ('a'..'z'));
    push(@chars, ('0'..'9'));

    my $rand_str = '';

    for (my $i = 1; $i <= $length; $i++) {
        $rand_str .= $chars[int(rand($#chars+1))];
    }

    return $rand_str;
}

my $length = shift(@ARGV);
print randstr($length);

$#chars という表現は、配列 @chars の最後のインデックスを取得している。こんな書き方があるとは初めて知った。

実行結果:

^o^ > random_string.pl 20
LxN8r4RSM8rdZ4iQdp3r

ボルダリングをやってきた(2)

気がつけば一月以上も更新してなかった。当初のせめて週一更新の目標はどこへいったやら。

ブログはあんまり続いていないけど、ボルダリングは週一で続いている。
今日は、先週散々苦労した緑の5番を一撃でクリア。その勢いで緑の6、7番も一撃。だけど調子よくいったのもそこまでで、水色の4番がどうしてもクリアできなかった。来週こそ!

ボルダリングをやってきた

昨日のことになるけど、ボルダリングをやってきた。
ボルダリングっていうのは、Wikipediaによると:

ボルダリング(Bouldering)とは、フリークライミングの一種で2mから4m程度の岩や石を確保無しで登るスポーツである。

というわけなんだけど、いってきたのはインドアのいわゆるボルダリングジム。
初めてなので、まずは登録から。施設利用料を払って、あとはシューズとチョークバッグをレンタルした。道具をレンタルできるので、運動しやすいカッコウさえしていけばいいって言うのは楽でいい。
次に、簡単なルールと注意事項、課題の説明をしてもらったら、後は自由に楽しんでください、とのこと。

ルールと注意事項

  • 1枚の壁に登るのは一人ずつ。
  • 登る順番は決まっていないので、適当に譲り合ってあって登る。
  • 課題(後述)のスタートとゴールは両手で持つ。
  • 降りるときは課題のホールドにこだわらずに降りていい。
  • ある程度まで降りたら飛び降りてもいいけど、十分に注意して足から着地すること。

大体こんなところだったと思う。

課題

壁には大小いろいろなでばっぱりが貼り付けてあって、これをホールドという。で、ホールドごとに色と番号が振ってあって、同じ色と番号のホールドを使って登るのが課題。
課題には2通りあって、

  • 手で持つホールドだけ指定されている足自由の課題と(1から番号がついている)
  • 手足とも指定されたホールド(アルファベットがついている)しか使えない手足指定の課題

がある。当然手足指定の課題のほうが難しい。

で、初めての俺は足自由の課題の中でも簡単なピンクの1番から始めることにした。最初は順調だったけど、8番までこなしたころには手が疲れて握力がなくなってきてホールドをつかんでいられなくなった。
ここまでで約2時間半、自分の体力の無さを実感した1日でした(2時間半しかやってないけど)。

Perl でファイルから行を読み込む

Perl はたまにしか使わないからいつまでたっても覚えない。のでメモ。

ファイルから1行だけ読み込むには:

use strict;
use warnings;

my $file = shift;
open(my $fh, '<', $file) or die "$file: $!";
my $line = <$fh>;

print $line;

実行結果:

^o^ > type sample.txt
sun
mon
tue
wed
thu
fri
sat

^o^ > perl read_line.pl sample.txt
sun

スカラー変数じゃなくて配列変数に代入すると、ファイル全体が1行ずつの配列になる。

use strict;
use warnings;

my $file = shift;
open(my $fh, '<', $file) or die "$file: $!";
my @lines = <$fh>;

foreach my $line (@lines) {
    print $line;
}

実行結果:

^o^ > perl read_lines.pl sample.txt
sun
mon
tue
wed
thu
fri
sat

1行ずつ読み込みながら処理するには、while ループと一緒に使う:

use strict;
use warnings;

my $file = shift;
open(my $fh, '<', $file) or die "$file: $!";

while (my $line = <$fh>) {
    print uc($line);
}

実行結果:

^o^ > perl read_lines_loop.pl sample.txt
SUN
MON
TUE
WED
THU
FRI
SAT

MediaWikiでアップロード可能なファイルサイズを変更する

これは、MediaWiki というよりも PHP の設定によっている。
php.ini を次のように変更する。

post_max_size = 10M
upload_max_filesize = 10M

で、サーバを再起動すると、アップロードできるファイルの最大サイズが10MBになった。

MediaWikiをためす

昨日、Hikiの引越しがうまくいった様なエントリを書いたけど、そのあとよくよく使ってみると、エラーが出て表示ができないページ(Encoding::CompatibilityError とあるからたぶんエンコーディングのエラー)があったり、編集して保存しようとすると「指定したタイトルは既に存在しています。」と出て保存できないページがあるなど、どうも動作がおぼつかない。
そこで、せっかくVertrigoServeでPHPとMySQLがインストールされているので、MediaWikiを試してみることにした。

MediaWiki のダウンロードと展開

以下のサイトから、安定バージョンの 1.21.1 をダウンロードした。

 cf. http://www.mediawiki.org/wiki/Download/ja

ダウンロードしたファイルは .tar.gz なので、まずは tar コマンドで展開。ところがエラーになる。コマンドはあってるはず(たぶん)なのに。

^o^ > tar zxvf mediawiki-1.21.1.tar.gz
tar: Cannot fork: Function not implemented
tar: Error is not recoverable: exiting now

仕方が無いので、gunzip で解凍してから、改めて tar で展開した。

^o^ > gunzip mediawiki-1.21.1.tar.gz

^o^ > tar xvf mediawiki-1.21.1.tar

無事完了。

MediaWiki のインストール

展開したディレクトリを、丸ごとC:\www\wiki にコピー。ブラウザから http://localhost/wiki/ にアクセスすると、MediaWiki のページが表示された。「LocalSettings.php not found.」とあるので、「complete the installation」のリンクをクリックして設定をする。
このあとは難しくない。基本的には質問に答えるだけでいい。強いて言えば、データベースの文字セットをUTF-8にしたくらいだ。
最後に、LocalSettings.php をダウンロードして、index.phpと同じディレクトリにコピーすれば完了。
さあ、ブラウザでアクセスしてみよう。無事メインページが表示されてインストールに成功した。
さて、MediaWiki の記法を覚えなきゃ。

パソコンが壊れたのでHikiを引越しした

WindwosXP が動いていた古いほうのPCが壊れた。といっても、ほぼネット専用機になっていたのでたいした実害は無いんだけど、ただ、いくつかWebアプリを動かしていたので、それをどうにかしないといけなくなった。
そのWebアプリのひとつが、WikiクローンのHikiで、幸いハードディスクは無事だったので、データを回収して新しいほうのPC(といってもWindows7)に引っ越すことにした。

VertrigoServ のインストール

何はともあれ、Webサーバが無くては何もできない。古いPCでは、VertrigoServ という、Apache と MySQL と PHP がセットになっているものを使っていた。なので、今回もこれを使うことにする。まずは以下のサイトから VertrigoServ をダウンロード。バージョンは2.29。

 cf. http://vertrigo.sourceforge.net/

ファイルは実行形式のインストーラになっているので、案内に従うだけで簡単にインストールできた。ひとつ注意点としては、インストール先をデフォルトの C:\Program Files (x86)\VertrigoServ ではなく、C:\VertrigoServ に変えたところ。こうしておかないとconfファイルの編集ができない。たぶんWindows7の権限の問題なんだと思うけどそれを追及するより楽な道を選んだ。
で、変えたところは次の2点。
1点めは、httpd.conf内のWebサーバのポート。デフォルトでは 8080 になっているのを 80 に変えた。

#Listen 8080
Listen 80

コメントアウトしてあるのがデフォルトの設定ね。

もう1点は、DocumentRoot。これはvertrigo.conf内に記述がある(vertrigo.confはhttpd.confにインクルードされている)。

#DocumentRoot "C:\VertrigoServ\www"
DocumentRoot "C:\www"
#<Directory "C:\VertrigoServ\www">
<Directory "C:\www">
    Options Indexes FollowSymLinks Includes
    AllowOverride All
    Order allow,deny
    Allow from All
</Directory>

最後に、C:\VertrigoServ\www を C:\www にコピーして終わり。ブラウザで http://localhost/ にアクセスすると無事、Welcome to VertrigoServ というページが表示された。

Hiki のインストール

Hikiは次のサイトからダウンロードした。

 cf. http://hikiwiki.org/ja/

バージョンは1.0.0。これも基本的にはダウンロードしたファイルを展開して、DocumentRoot以下(C:\www\hiki
に配置、いくつかの設定をするだけでいい……はずなんだけど、いざブラウザでアクセスしてみたら、docdiff/difference がロードできないと言うエラーが出た。配布物内の Gemfile を見ると、どうも docdiff という GEM が必要なようなので、インストールする。

^o^ > gem install docdiff

さて、今度は大丈夫かと思ったら、hikidoc がロードできない、というエラーが出たので、これまたインストール。

^o^ > gem install hikidoc

今度こそ大丈夫、無事 FromtPage が表示された。

Hiki のデータを引越し

最初、これはデータを上書きすればいいだけだと思っていた。が、そうはいかなかった。データは、WebサーバのDocumentRootのそと、C:\hiki_data に置いたんだけど、この中のtextディレクトリの中見たデータそのものなので、基本的にはここに以前のデータを放り込んでしまえばいいはずなんだけど、ブラウザからアクセスしたら、エラーになってしまった。なにやらエンコードの問題らしい。
考えてみれば、古いHikiのバージョンは、0.6.3 でエンコードはEUC、対して新しいほうのHiki(1.0.0)のエンコードはUTF-8らしい。ということはEUCからUTF-8にコンバートできればいいはず、と思って配布部図の中を眺めてみると、tool/convert.rb というスクリプトを発見。中を見るとなんかあたりっぽい。これを使ってコンバートした。

^o^ > ruby -Ic:\www\hiki c:\www\hiki\tool\convert.rb --data-directory=BSL -i euc
-jp -o utf-8

なんか warning がいっぱい出たけどとりあえず無視して、変更されたデータを丸ごとhiki_data/textにコピー。
改めてブラウザでアクセスすると、今度はうまく表示された。