今更言うがとうとう冬がやってきた

微分方程式解いてると、特殊解見つけるのが難しいなとか。
偶然に1つ解を見つけろとか、結構ハードル高いよね。
それさえ見つければ万々歳なので、がんばらないとね。


さて、今日は寒いですね。昨日も寒いですね。
アメダスによれば二日とも氷点下行ってるよと。
まぁそれをクラスメイトに話しても、えらい寒いなという話なんですが。
いやいや、実際氷点下の世界は違いますよと。
至る所に霜が降りている。
自転車のサドル、交差点の押しボタン…
まぁそういうところです。手袋必須ですね。
こうなってくると冬もやってきたと思わざる得ないわけです。


冬になると、電車の混雑が激しくなったように見える。
それは厚着するからですね。大体1cm厚みが増すらしいです。
まぁそれはそうとして、普段乗ってる電車が異常に混雑する電車。
正直時間的にも行き先的にも使いにくい電車ですが、だからか、たった4両でやってくる。
それを使う学生が山ほどいると。自分もそうですけど。
そして半数以上の乗客が同じ駅で降りると。自分もそうですけど。
さらにその駅は出口がホームの端にある。だから電車の先頭に集中する。
乗り換えの都合もあるので、自分も先頭に乗るんですよね。
…そりゃドアも閉まらんわ。まぁみんな奥まで詰めて乗ってくれてるからましだけど。
さすがにこれだけぎゅうぎゅう詰めだと、あったかいですね。
スカスカの電車だと、ドア開くたびにすごい冷えますから。
時間的に最適な電車だし、まぁ乗れるし、列車変えるつもりはないけどね。


春夏秋冬なら、もっともインパクトが強いのは間違えなく冬だろうと。
寒いですから。
夏の暑さはそれほどひどくもない。特に日陰にいればね。
けど冬は締め切った部屋の中でさえ、寒い寒い言うことになる。
春と秋は知らんうちに過ぎ去ってる。
まぁ最大で-5℃程度まで下がるので、心して冬に挑んでいきたいですね。

求めるのが難しい方程式ですよ

最近、数学でも物理でも微分方程式だというので困る。
微分方程式は未知の関数の微分を含む方程式。
そんなもん解けるのかという話だが、まぁ解けないね。
特別なものは解けるというのが正しそう。
dy/dx=y
非常に簡単ですね。微分したらそれになる関数ね。
まぁexとかですよね。計算してみましょうか。
例によってMathMLですよ。Firefox・Opera以外の人、ごめんなさい。
こんな風に変形して、積分して、わかりやすいように変形すれば完成。
積分の時積分定数であるCが出てくるのがポイントです。
±eCは結局任意の数という意味だから、Aに置き換えています。
結果y=Aexと、まぁまぁ予想通りの式が出てきましたね。
まぁこんな具合でして、Aには何を入れてもさっきの式は成立するんですね。


これで、バネにおもりつけたら単振動するとかいう説明ができていると。
まぁ結論知ってて、そうなってることを確かめろいうだけなら、
微分すれば簡単に確かめられますけど、式を作るのは非常に難しいと言うことです。
数学の教科書にはいろいろ解き方が載ってるけど、難しいですね。
これをuとおくとうまく解けますよとか、そんなのばっかり。
一階線形微分方程式の解の公式とかあるけど、嫌になるほどめんどくさい。
そんなもんを数学のテストで解くことになるわけだ。


そうなると練習するしかないですね。
まぁそういうわけでいろいろ書いてやってますけどね。
練習するにも、1問解くのに結構時間がかかりますからね。
計算間違えせずに正しい答えが出せるようになりたいけどね。
今度のテストは大丈夫だろうかとか思わんこともない。多分大丈夫だけど。
あと行列だらけの代数幾何とかねぇ…これの方が怖い。
というわけでがんばらないとなと。

みんなにFastCGI用PHPを配りにいきましょう

今日は寒いですね。
まぁこれは氷点下行ったなと思ったが、アメダスは最低0.3度とのこと。
だけど場所によっては氷点下行ってるでしょうし。
あと今日は一日中気温が上がらなかったな。
寒い寒い。まぁそんな季節がきたということです。


昨日のPHP・FastCGI・SuExecの組み合わせを調べていた話の続き。
そうそう、PHPがphpinfo()で--enable-fastcgiとなってなくても、CGI動作で確かめてみると入ってるかも。
あと、Vineではphp5-fcgiとかなってたけど、php-cgiを使うこともあるし、それでもOK。
とにかくCGI動作でphpinfo()で–enable-fastcgiとなってれば間違えないでしょう。


さて、ユーザーごとにFCGIWrapperが必要であるという前提でいろいろ調べていた。
どこかのWebスペースでCGI版PHPの使い方として挙げられていた方法を参考にしてみた。
PHPを使うユーザーはFCGIWrapper用のシェルスクリプトを用意し、.htaccessで定義しろと。
というわけで、まず各人のpublic_htmlに置く、php5-fcgiというシェルスクリプト。

#!/bin/sh
exec /usr/bin/php5-fcgi

まぁそのままですね。これはパーミッション700で配置。
これでコピーしなくても各ユーザー所有のFCGIWrapperが用意できますね。
.htaccessでこれを定義する。残念ながらhttpd.confなどに埋め込むのは現実的でないので…

FCGIWrapper /home/hidemaro/public_html/php5-fcgi .php

これはパーミッションは644ですね。
.htaccessで定義できるようにAllowOverrideを設定しておく。
これでOK。各ユーザーの権限でPHPを実行できるでしょう。
もちろん動かすディレクトリではOptions +ExecCGIをしておいてね。


さて、SuExecでのパーミッションを検討してみる。
まずHTML・PNGなどはApacheユーザーから読めないとダメなので644、
けどPHPからのみ読み書きするファイルはApacheから読めなくていいので600。
そしてPHPはいままで読めればよかったが、CGI動作では実行権が必要、
だけど自分だけ実行できればよいので700、他のCGIも同様。
ディレクトリは711にするといいと思う。ディレクトリにファイル作るとしても自分だけだし。
あと、public_htmlは普通に711にすればOK。
というわけでめでたしめでたし、と行きたいのだが、以前から気になってたこと。
/home/foo/public_htmlを711にするのはよいのだが、
その前に/home/fooを711にする。
しかしこうすると他のユーザーから、例えば/home/foo/.bashrcとかにアクセスできてしまうことがある。
もちろん他ユーザーの読みこみ権などを消しておけばこんな問題は無い。
ディレクトリの実行権とは、その下のファイルにアクセスできるという意味。
だからディレクトリが実行可で、その下のファイルが読みこみ可だと…
というわけで標準では700となってるのだが、public_htmlがあると711にしないといけない。
けど誰からでも見えるのは、よろしくないよなぁ…
と考えるのならば/home/fooの所有グループをapacheにして、710とする。
これでapacheグループ以外は見れない。これでかなりましかなと。
ただ、所有グループの変更はrootがやる必要がありそう。


という非常にめんどくさい処理はPerlにやらせるのが正解ですね。

#!/usr/bin/perl
use strict;
use warnings;
my @users=qw( foo bar );
my $apachegid=( getgrnam('apache') )[2];
for(@users){
my ($uid,$gid)=( getpwnam($_) )[2,3];
my $homedir="/home/$_";
my $htmldir="$homedir/public_html";
mkdir($htmldir) if(! -e $htmldir);
chown($uid,$gid,$htmldir);
chmod(0711,$htmldir);
chown($uid,$apachegid,$homedir);
chmod(0710,$homedir);
my $fh;
open($fh,'>',"$htmldir/php5-fcgi") or die;
print $fh "#!/bin/sh\nexec /usr/bin/php5-fcgi\n";
close($fh);
chown($uid,$gid,"$htmldir/php5-fcgi");
chmod(0700,"$htmldir/php5-fcgi");
open($fh,'>',"$htmldir/.htaccess") or die;
print $fh "FCGIWrapper $htmldir/php5-fcgi .php\n";
close($fh);
chown($uid,$gid,"$htmldir/.htaccess");
chmod(0644,"$htmldir/.htaccess");
}

長いですね。非常にベタな書き方ですね。
ここでは、
public_htmlをなければ作成し、public_htmlの所有権をそのユーザーに、パーミッションを711に、
ホームディレクトリをapacheグループに設定して、パーミッションを710に、
FCGIWrapper用のphp5-fcgiを作成し、所有権をそのユーザー、パーミッションを700に、
.htaccessを作成し、所有権をそのユーザー、パーミッションを644に。
ということをやっている。
apacheの実行グループ名とか、phpの実行ファイル名とかは適当に設定すればいい。
既存の.htaccessがあるのなら’>’でなく’>>’とするべきだろうか。
これでOKなはず。
新規ユーザー作るときこれと同じ処理をすればいいですね。
これで一件落着。めでたしめでたし。

FastCGIは本当に速いけど…それだけ?

PHPをFastCGI動作に変えてみた。
実はもうFastCGI動作なんですよ。
いろいろ調べてたが、案外うまくいったので。
実はこのPHPたちはhidemaroユーザーで動作している。
初めに実行速度の変化について書いておく。
この日記のトップページの表示速度は2.26秒から1.98秒に短縮された。
どうもFastCGI動作の方が高速っぽいです。
こういう成果は挙げたものの、実はSuExecという意味ではかなり残念なことに…
というわけで実現メモということ。


LibserverはVine Linuxですね。
Vine LinuxにおいてはApacheの設定ファイル類は/etc/apache2に入ってます。
Vineでは一般的にはhttpdとなってるところがほぼ全部apache2になってると思ってOK。
だからapt-getでインストールできればうれしいですね。
と思ってたら入れられるみたい。

# apt-get install mod_fcgid-apache2
# chmod 555 /var/log/apache2/

なんでchmodしないとだめなの?というのはそういうものだからと考える。
さて、まずSuExecのことは考えずにサクサクやっていきましょう。
設定ファイルは/etc/apache2/conf.d/mod_fcgid.confをいじるのがメイン。
あとはCGI動作させるディレクトリにOptions +ExecCGIとするだけなので。

<IfModule !mod_fcgid.c>
LoadModule fcgid_module modules/mod_fcgid.so
</IfModule>
<IfModule mod_fcgid.c>
AddHandler fcgid-script .php
AddHandler fcgid-script .fcgi
FCGIWrapper /usr/bin/php5-fcgi .php
</IfModule>

他にも設定あるけど省略。
FCGIWrapperを使うのがポイントです。
これによりスクリプトの改変不要になるし、PHPが常駐するというスタイルになるので便利?
ところでVineのPHPは–enable-fastcgiとなってたからいいのだが、
CentOSでみたらこうなってなかったのだが、これは他に何かいるのか?
それとも自分でコンパイルしろと?まぁこの辺は要調査。
あとPHPでCGIを有効にする必要があるかも。php.iniで、

 cgi.force_redirect = 0

あとこの設定でPHPはCGI動作するので実行権が必要。
これでうまくいった。
まぁここまでたどり着くのはわりと簡単だった。
FastCGIで動いている証明だが、まずphpinfo()で、Server APIがCGI/FastCGIとなっていること。
そしてps axでphp5-fcgiが何個か動作していること。
実はこの辺がPHPのFastCGI動作のおもしろいところで、
一般的にはFastCGIは/usr/bin/php5-fcgi index.fcgiとかいうのがプロセスにいることになる。
そのプログラムのためのプロセスだということ。
だけどPHPではこれを共有すると。まぁ一長一短あるけどいいじゃないと。


さて、どちらかというとやりたかったSuExecだが、結論を書いておく。
ユーザーごとにphp5-fcgiが必要…なんでやねん。
このままSuExecに必要な事項を書けばいいかなと思ったんだよね。

SuexecUserGroup hidemaro hidemaro

もしかするとさっきの設定の時点で動かなかった人もいるかも。
だって、public_html以下はSuExecで動作する人はねぇ…
/var/log/apache2/suexec.logにはこんなエラーが残る。

command not in docroot (/usr/bin/php5-fcgi)

どうもphp5-fcgiのある場所がよろしくないと。
それで、/var/www/cgi-bin以下にphp5-fcgiのシンボリックリンクを貼ってみたりしたのだが…
最終的には/var/www/phpcgiを作り、所有権をSuExecするユーザーにする。
そして、php5-fcgiをコピー、これも所有権を変える。
そしてこれをFCGIWrapperに指定する。
これで動く。ただかなり意味不明な方法ですけどね。
あとなぜか実行権を与えなくても動く。なぜに?


まぁこんな具合でして、うまく動きますねと。
ただこれでわかったのはFCGIWrapperがユーザーごとに必要でありそうなこと。
これはいろいろ調べてたが、まず間違えないことですね。
そのための具体的な方法はまた考えることにしよう。
とりあえずPHPをSuExec使ってFastCGI動作というのは達成できた…のかな?

CGI版PHPはセキュリティ向上に役立つの?

そういえばPHP6からセーフモードが廃止されるそうですね。
PHPをApacheに組み込んで動作させる場合、
何でもかんでもapacheユーザーなどApacheの動作するユーザーで動作する。
まぁそういう意味ではある程度安心と言えますね。
けど、これでいろいろ実験してたのだが、多人数で共有するサーバーでは問題がある。
/home/foo/public_html/foo.txtというのを置いておく、
これはPHPから改変出来るようにと、パーミッションを666としておくわけだ。
ところが、ここで/home/bar/public_html/hack.phpというのを作る。

<?
$fh=fopen('/home/foo/public_html/foo.txt','a') or die('×');
fwrite($fh,'Hack!!') and print('○');
fclose($fh);
?>

すると改変できてしまう。これは困る!!
というわけでこういうことを防ぐためにセーフモードがあるわけだ。
PHPファイルと操作するファイルの所有者が一緒であるか確認するとか、危険な関数の制限とか。
というわけで共有サーバーではよく使われている手段です。


CGIではどうしてるのかという話だが、SuExecという仕組みでやってる。
CGIの実行をあるユーザーで実行すると。
どうもCentOSのApacheでは各ユーザーのpublic_htmlについては各ユーザーで実行させると。
こうなってるらしい。ありがたい話だ。
なのでそれに応じた設定にして欲しいと。
すなわちCGIから読み書きするファイルは他人からアクセス出来るようにしないと。
まぁどうもそういうことらしい。


なんかこれ見てるとPHPとCGIの共存が危険な気がしてきた。
すなわちPHPの各ユーザーの権限で実行するべきではということ。
あくまでもPHPのセーフモードは自主規制とも言うべき内容。
完璧なんてありえない。
その場合考えられるのはFastCGI+CGI版PHP。
一応セーフモードの代替案としてもっとも有力な方法です。
CGIだったらPHPのいちいち起動しなくてもよいので高速というメリットがなくなるのでは?
と思うのだが、どうもFastCGI上でPHPを動作させたときはちょっと都合が違うらしい。
どうもPHPのインタプリタが常駐するらしい。
他はそのCGIのプログラムが常駐するらしい。
と解したが詳細不明。
ただFastCGIでPHPを動かす分にはほとんどmod_php5と事情は変わらないらしい。
きちんと設定をすれば、ただそのユーザー権限で動くPHPになるはず。
これは調べてみる価値がありそうですね。

CGIはじめましたというから試した

部のWebサーバーでCGI動かしたいとかいう要望があったそうだ。
それで管理者がhttpd.confいじって動作するようにしたが、
うまく動かないとか言うので、見ていた。
どうもスクリプトの方がおかしかったらしい。
その後細かい設定をして完成と相成ったそうだ。


実は僕はCGIを使ったことなかったのよね。
そもそもCGIというのはCommon Gateway Interfaceという仕組みのことを言う。
まぁお約束に従って書かれたプログラムをApacheなどが動作させてくれると。
そういうことです。
ところでPHPは普通mod_php5をApacheに読み込ませて使う。
すなわちApacheをPHPの処理ができるように拡張させて、Apacheに処理してもらうと。
だからApacheが立ち上がってしまえば、PHPの処理は高速ということ。
一方では全てroot権限で実行させるから危険かもというのはある。
この仕組みで動作するのはPHPがもっとも有名ですね。
あとmod_rubyとか。


CGIだが…まぁ例を示すのが早いかな。

#!/usr/bin/php
Content-type: text/plain

<?php phpinfo(); ?>

わざわざCGIをPHPで書くあたりが不気味ですね。
まぁとりあえずこれに実行権を与えて、
コマンドラインで動作するか確かめてみる。PHPが動作するなら、動作しますね。
そしてこれをfoo.cgiとかして保存する。そしてアクセスする。
うまく動くんじゃないかな?
CGIというのは、動作するプログラムで、まずヘッダーを出力して、これに続けて内容を書き出すと。
じゃあ、というわけでこういうプログラムを書いてみた。

#include <stdio.h>
main(){
int i;
fputs("Content-type: text/plain\n\n",stdout);
for(i=1;i<=100;i++){
printf("%d\n",i);
}
}

これをgcc -o ccgi.cgi ccgi.cとかすれば完成。
普通に動きますよ。というわけでどうもこういうものらしいです。


ただ初めのヘッダーにしても、まぁCGIに特に必要なことも多いと。
だからCGI用のライブラリがありますね。
ちなみにPHPだが、基本的には組み込み動作でもCGI動作でも変わらない。
さっきは説明のために手動で書いたが、これは普通じゃない。
#!/usr/bin/php-cgiとすれば一般的なPHPをCGI動作させることができる。
まぁ…php.iniの設定をしないと弾かれますが。
あとPHPを組み込みで動作させるなら実行権いらんけど、CGIの場合必要だったりするので注意。
設定もそんなに複雑じゃないからLibserverでもCGI可にしていいかなとか。
Option +CGIExec とするだけだし。
けど動かしたいスクリプトもないからいいか。

HDDの容量が合わないのは仕様だよ

新しいHDDを買ってきた。
さすがにPATAは安いのがないですね。
SATAなら6000円切る程度であるというのにPATAだと7450円とか。
家に帰ってきて、アルミのケースに取り付けてみた。
それでUSB接続するときちんと動作した。
ただ、元のHDDはアクセスがない間、回転が止まってたが、どうも止まらんっぽい。
まぁくわしく調べてないのでなんともいえんが…
ただ常に回転していても問題は無いですけど。むしろアクセス速いので便利?


さて、このHDDは500GBと書かれていて売っていた。
そして家で15GBのFAT32、450GBのNTFSに分割した。
この15GBの方はLinuxでも使えるかもしれないという理由で設けてある。
Linux関係のバックアップとかが入ってる。
残りはデータ用。こっちがメイン。非常に多目的。
さて、ここでおかしいと思った人がいればよいのだが…
なんで500GBのHDDが465GB程度しか使えないのって?
以前も250GBのHDDを32GBのFAT32と200GBのNTFSに分割してた。
これも同様ですよね。


そもそもGというSI接頭語は109を示しますよね。
3GHzというと、3×109Hzということです。
HDDの容量は普通これで表示されています。
ところがWindowsでは、データの容量は二進接頭語と呼ばれるやつで表示されてると。
Kという接頭語は普通103だが、二進接頭語では210
数字で言うと、1000と1024。
この二進接頭語は1000の代わりに1024を単位とするものだと思えばいい。
これによればMは1048576、Gは1073741824となる。
ここでさっきの話に戻るが500GBのHDDをWindowsでは465GB程度に見えると。
465×1073741824≒499×109、ということでつじつまがあう。
実はHDDの容量は全部使えるんです。
目減りしたようにみえるが、これはWindowsの仕様ですから理解すればOK。
メモリの世界においては二進接頭語のほうが便利というあたりですね。
まぁ人間からすれば便利とは言えない気もするけど。


同じGといえど、109を示すか、230を示すかでかなり違うんですよ。
二進接頭語のほうが7.4%程度大きいんですよね。
それはさっきので実感出来ますね。
なのでこれを明確にするために二進接頭語にはKi、Mi、Gi、Ti…という接頭語を与えようと。
Kiはキビ、Miはメビ、Giはギビ、Tiはテビという風に読む。
なのでWindowsの方は、465GiBと表示する方が親切です。


あとはおまけ。
今日いろいろ見ていたのだが、あるマザーボードに日本製電解コンデンサ使用と書いてあった。
これを英語などでも書いてあった。
まぁ実に日本の電子部品の評判がよいかということですね。
それでマザーボードを見てたのだが、電解コンデンサの形がちょっと見慣れない形だった。
普通のアルミ電解コンデンサと違うなぁと…
どうも聞けば固体アルミ電解コンデンサというタイプのコンデンサらしい。
特性がいいらしい。だから高価でもマザーボードとかでは採用されてたりするらしい。
これには非常に驚いた。

外付けHDDの箱だけ再利用すればよい

今日、カバンからD-Snapを取り出すと、操作盤が派手にへこんでた。
なんか変なもんがあたったのかな?
まぁ操作に害が出るほどではないからいいけど。
D-Snapは操作盤がかなりユニークな構造なのでね。
普通にボタン作ればいいような気もするけど、まぁこれはこれでいいか。


明日大阪に行くので、おもしろいことしたいなとか思わんこともない。
外付けHDDを持ち歩いているのだが、
最近HDDがガリガリうるさいし、容量でかいファイルを投げ込んでるもんで容量が…
というわけで保守と増量のために中身を交換しようかなと。
そんなことして問題ないの?と思うだろうけど、問題ありません。
というのも、250GBだろうが500GBだろうが、筐体と変換回路は一緒。
違うのはHDDだけ。
なので基本的にはそのシリーズにある容量ならうまく動くと思ってOK。
けどその前にどんな型のHDDが必要か調べないとね。
調査するにしても、交換するにしても、まずは分解ですね。


持ってる外付けHDDはI-O DATAのHDC-Uシリーズです。
あれ? これって据置用の外付けHDDですね、と思うはず。
安価なわりに大容量で、持ち運びにも困らない大きさということでこれを選んだと。
変な感じだけど、2.5インチHDDが入ってるタイプと比べると、
電源をつなぐ必要がある、二回りほど大きいという程度でして、結構いいです。
最近はHDCN-Uシリーズに移行してますが、これはさらに小さいのでいいですよ。
かなり堅牢でして、カバンごと何度も落としてるけど、安定して動作しています。
ただ最近はちょっとうるさい。もう寿命かなと思わないことはない。
IO DATA HDC-Uを分解する (Sky’s HP)を参考に分解してみた。
つるつるで分解しにくそうですが、実は結構簡単。
マイナスドライバーをスキマに突っ込んでツメを外してしまえば終わったようなもの。
あとはただのアルミ製のHDDカバーというわけで+ドライバーで簡単に分解できる。
すると、Seagateの250GBのHDDが出てきた。
ただし、PATAだった。SATAなら安価で大容量のが買えるのだが…
PATAはパラレルATAの意味。SATAと明確に区別するのに使われている…のかな?
とはいえ、PATAでもかなり安価で買えるのでいいですけど。
WDとかHGSTとかひいきにしてるから、この辺の500GBのHDDを探してくる。
ツクモの通販で見れば8000円程度で手に入るみたい。そんなもんでしょうね。


おそらく、買ってきて接続すればうまくいくでしょう。
これで、20GB程度、Linuxでも使えるFAT32にして、残りはNTFSでフォーマット。
これは時間がかかるが、この間は適当にしてればOK。
旧HDDは、PCの1本だけ余ってたPATAのポートにつないだ。
すると当然認識した。ここから必要なデータをコピーすればいいでしょう。
これも時間かかるだろうなぁ…
といろいろ考えると一日仕事になりそうですね。まぁそれもいいか。

vimをフル活用できたらいいのにな

学校の用事で週末に大阪に行かなくてはいけないので切符を買ってきた。
もちろんVISAデビットで支払うためね。JTBで買った。
特に今回は学生会に請求する加減、返ってくるけどかなり時間がかかる。
このお金を手持ちの金から出すと、かなり金が減る。
なので、残高がたくさんあるeBankから出せばいいですねということ。
請求するのに使用済みの切符を提出してたけど、せっかくなので学生会宛に領収書を出してもらった。
JTBの切符でも結構大きいから。けど領収書もA5か…あんまり変わんないなぁ…


昨日のRubyのプログラムを見て思ったのだが、
end連続はちょっとひどいなぁ…
VBユーザーに見てもらうと、End Subとか何の終わりか明示してほしいもんだとか。
なるほどねぇ、そういう考えもあるか。
Cとかでも終わりの } だけでは何かわからんのでコメントでメモしておくというのはあるか。
しかし、こういうのはテキストエディタの対応する括弧を強調表示する機能があればいいのかな。
うーん…そういうこと考えるとvimってかなりよさそう。
Linuxでvimを使うこと多いけど、強調表示とかかなりよくできてるよね。


vimはLinuxでは当然に入ってるのでよいとして、
WindowsではKaoriYa.net – Vimから落としてくるといい。
これで展開してgvim.exeを起動するといいとおもう。
gvimはvimをそのままGUIにしただけ。まぁあんまり意味はないと思うけど。
さて、ファイルを開くとか保存とかは、マウスで操作してもいい。
もちろんvim本来の操作法である、 😮 foo.pl という風に入力して開いてもOK。
操作法は :Tutorial として勉強してください。
iで挿入モード、Escでノーマルモードに戻り、xで1字削除、ZZでセーブして終了、:q!でセーブせず強制終了。
だけ覚えておけばまぁなんとかなりますけど…
まぁ僕もあんまりvimを使いこなしてるわけでもないので、なんともいえんけど。


まぁそういうわけでTutorialで改めて勉強し直すことにした。
vimのコマンドは結構整理されてますね。
例えば行末まで削除するのは d$ というコマンドなんだが、
$ というコマンドは、行末までジャンプするというコマンドである。ちなみに行頭は0。
じゃあ、右に移動するlコマンドと組み合わせて dl とするとどうなるか。
右の1文字が消えた。まぁ単に1文字消すだけならxコマンドでいいんだけどね。
そしてコマンドの繰り返しは前に繰り返す回数を書けばいい。
3dhとすれば左の3文字が消えるはず。何の役に立つか知らんが。
同様のことは、ヤンク(コピー)するy、削除して挿入モードにするという変更のcでも言える。
2chとすれば左2字を変更できるはず。
ちなみに1行削除、1行ヤンクは特にdd、yyでいける。
1字削除もxを使うのが普通。だけど1字ヤンクはylとかでやることになる。


削除やヤンクしたのはバッファに入ってるから、Pでカーソルの前に貼り付ける。
じゃあpでは? pだとカーソルの後ろになる。
大文字と小文字はまぁ大体カーソルの前後のどっちかの違いになってることが多そう。
xはカーソルの場所の1字、Xはカーソル左の1字。
挿入についてはiとaがカーソルの左右に対応してるけど、
IとAはそれぞれ行の頭、行の最後からという意味らしい。


と非常に多機能であることがよくわかります。
初めの方の話に戻るがvimで対応する括弧は%で移動できる。
本気で設定すればすごい使いやすい環境になるに違いない。
Perlの作成、実行をスムーズに移動できたら便利ですからね。
またなんか成果が出たらメモすることにしよう。

Rubyなクラスをささっと作る

Rubyで数学の問題に挑戦している人がいた。
よく考えればLLで変なプログラム書く人って初めて見た。
どうしてもPHPでWebアプリケーション書く人は見たことあるけど。
しかし、Rubyというと僕の印象はこればっかり。

(1..100).each do |i|
p i
end

何が言いたいかというとeachメソッド便利ですねということです。
まぁdoブロックの使い方とかはおもしろいですよね。
ただ、ブロックの終わりにいちいちend書くのめんどくさいとか。
まぁいろいろあるのだが、普段C#とかPerlでプログラム書くとき、
for(1..100) {} とまず打ってしまう、そして1文字戻って中身を書くと。
しかし、endで同じことをやると3文字も後退しないといけないなぁと…別に大した差ではないか。
まぁ人によっていろいろあるだろうが、この辺はお好きにどうぞ。


いろいろ見せてもらってたのだが、こんなことがあった。
1文字目、10文字目、…、100000文字目の文字を取り出したいと。
これを素直にやると大変ですね。
そこで僕は、これはクラス作ればいいですねと思ったわけだ。
というわけでささっとクラスを作ってみた。Rubyでクラス作るの初めて。

class Selectstring
attr_reader :len , :res;
def initialize()
@len=0
@select=[1,10,100,1000,10000,100000]
@res=[]
end
def append(str)
len0=@len+1
@len+=str.size
@select.each_with_index do |cur,i|
if len0<=cur and cur<=@len
res[i]=str[cur-len0]
end
end
end
end

Stringクラスのsizeプロパティ、lengthプロパティ、どっちも1.8ではバイト数を返すのね。
1.9ではlengthは文字数になるみたいだけど。
さて、それはともかく、Rubyの変数名の頭に付ける@はインスタンス変数の意味。
@@だとクラス変数。
なるほどこうやってローカル変数と区別してるのか…
あと、C#でいうプロパティはattr_reader, attr_writerで簡易に作ることができると。
自作もわりと簡単にできるらしいです。
each_with_indexというのは面白いですね。まぁPHPならfor($arr as $idx=>$cur){ }とかでできるけど。
1つ変数用意して、ループ内で毎度インクリメントすればいいこととはいえ、これは便利。
str[cur-len0]という操作だが、これは文字列の何番目かの文字の文字コードを取り出すものらしい。
文字コードなんですよ。
文字コードから文字に直すのはchrメソッドでできるのであらかじめやっておけばよかったなとか。


さて、これの使い方だが、
まぁ結論から言えば、123456789101112…という無限に続く数の
1,10,100,1000,10000,100000番目の数を取り出し、これの積を取ると。
というわけでさっきのクラスを使って問題を解く。

myss=Selectstring.new()
j=1
while myss.len<100000
myss.append(j.to_s)
j+=1
end
p myss.res.inject(1){ |last,cur| last*cur.chr.to_i }

まぁこんな感じ。ArrayのinjectメソッドでPerl 6の[*]演算子みたいなことをやってる。
injectは、前回の計算結果と今回の取り出した値を使ってなんか値作ってするやつ。
まぁもっとわかりやすい説明があると思うのでそれ探して。
ちなみにこの問題の答えは210となった。正解らしい。


まぁこんな風に割と使い捨てのクラスも作りやすいです。
Pythonのときも同じようなことをいってた気がする。
そういえばPerl 6ではオブジェクト指向のことがいろいろ変わるんだとか。
それによってクラスもかなり作りやすくなるはず。
また調べておこう。