2015年11月5日木曜日

NetBSD の SSL Root 証明書

NetBSD で Git 使おうとしたらエラーになった。

$ git clone https://github.com/letsencrypt/letsencrypt
Cloning into 'letsencrypt'...
fatal: unable to access 'https://github.com/letsencrypt/letsencrypt/': SSL certificate problem: unable to get local issuer certificate

これは以下の理由によるらしい (引用 NetBSDあるある )。
SSLのRoot証明書がないため。NetBSDはSSLのRoot証明書は、pkgsrcから入れると便利。まず、mozilla-rootcertsをインストールする。

インストール後のメッセージを参考に、

$ sudo /usr/pkg/sbin/mozilla-rootcerts install

を実行したら、なんか大量に /etc/openssl/certs 以下にインストールされた。なお、/etc/openssl/certs が空でないと拒否られる。

2015年10月21日水曜日

StartSSL でやらかした

StartSSL で失敗した話。単に自分の不注意というだけなんだが。

StartSSL は無料でSSL証明書を入手できるサイトとして人気だ。自分もここを利用している。

今回、新たに取得したドメインがあるので、そこも StartSSL の証明書を取得しようとした。

以前取得してから随分日が経っているので、細かい手順はよく覚えてはいなかったが、うろ覚えで操作をした。

まず、ドメインの所有者確認を行って、サーバ証明書の発行手続きだ。CSR を作成するのが面倒だから、プライベートキーは StartSSL 側で生成すればいいか。で、証明書を発行してダウンロードと…。

プライベートキーをコピペして保存しておくのを忘れた。

ブラウザで前のページに戻ろうにも期限切れで表示できず、StartSSL からダウンロードもできないので、プライベートキーは完全に失われてしまったようだ。

新たなプライベートキーを生成して、サーバ証明書を取得しようとしても、発行済の証明書を取り消さないとダメといわれた。当然だ。だが、証明書の取り消しは有料で $24.9 だと。

どうしたものかと思ったが、WoSign Free SSL Certificateが3年無料でマルチドメイン対応かつStartSSLがクロスルートと最強な件 によれば、WoSign という中国系のSSL認証局が無料でSSL証明書くれるらしいので、そこで取ることにした。ありがたい。

証明書を取得するところは英語のページがあるので特に問題はなかったが、アカウント管理には英語版が見当たらなかった。漢字だからなんとなくわかるところもあるけれど、間違えて変なとこクリックしても困るからほっとくか。

2015年9月26日土曜日

.htaccess と RewiteRule

Apache の RewriteRule を設定していて結構はまったのでメモ。

RewriteRule を .htaccess に書く場合、最も深いサブディレクトリにある .htaccess のルールから適用され、その後親ディレクトリの .htaccess のルールが適用される(この動作は RewriteOption で変更可能)。

でも、やってみたら親ディレクトリの .htaccess が全く効いていないっぽい。ていうか、DocumentRoot にのみ .htaccess を置いても無視された。

原因は Alias を使って子ディレクトリを別のディレクトリに向けていたことだった模様。

どいうことかというと、RewriteRule が適用される .htaccess は、URL じゃなくて、実ディレクトリベースで解釈されるので、Alias を使うと親子関係が切れてしまうってこと。シンボリックリンクなら大丈夫。

例えば、
ServerName  www.example.com
DocumentRoot  /var/www/html
Alias  child  /opt/html/child
とかいう場合、http://www.example.com/child/index.html へアクセスすると、実ファイルは /opt/html/child/index.html になる。このとき RewriteRule はプレフィックスを /opt/html/child として解釈し、/opt/html/child の .htaccess にある RewriteRule を index.html に適用する。

URL ベースでみると親ディレクトリに相当する /var/www/html は実ディレクトリベースでは親じゃない。なので、/var/www/html に置いた .htaccess の RewiteRule は参照されない。

これが、Alias じゃなくて下のようなシンボリックリンク貼ってると動作する。
/var/www/html/child -> /opt/html/child
この場合、http://www.example.com/child/index.html へアクセスすると、実ファイルは /var/www/html/child/index.html として解釈される。RewriteRule はプレフィックスを /var/www/html/child と解釈し、/var/www/html/child の .htaccess にある RewriteRule を index.html に適用する。

さらに、/var/www/html は親ディレクトリなので DocumentRoot に置いた .htaccess の RewriteRule も適用される。このときプレフィクスは /var/www/html で 適用対象は child/index.html だ。

まとめると、親ディレクトリの .htaccess で RewriteRule 使いたかったら Alias は使わずシンボリックリンクを使えってことなんだけど、これって常識?

2015年8月19日水曜日

ZeroC Ice のインストール

CentOS6に ZeroC Ice をインストールした。公式 rpm も出てて最初はそれを入れていたのだが、非標準のライブラリなども入れる必要があってそれが標準のライブラリと干渉することがあるので、ソースからビルドしてインストールすることにした。

ちなみにバージョンは公式rpmと同じ 3.5.1 にしている。もしかしたら最新の 3.6 でもphpMumbleAdmin は動くかもしれないけど、様子がわからないので動作確認がとれている 3.5.1 で実行することに決めた。

参考にしたのは Ice 3.5 と Ice 3.6 のインストールドキュメント。
ビルドに必要なライブラリがいくつかあるが、用意しないといけないのは Berkeley DB 5.3 と mcpp 2.7.2 (with patches) の2つ。どちらも ZeroC Ice のサイトからダウンロードできる。ほかは CentOS 標準のライブラリでよい。

まず DB 5.3 のビルドとインストール。今回 Java を使う予定はないので --enable-java は指定していない。/opt/db53 にインストールする。

$ wget https://zeroc.com/download/berkeley-db/db-5.3.28.NC.tar.gz
$ tar xzf db-5.3.28.NC.tar.gz
$ cd db-5.3.28.NC/build_unix
$ ../dist/configure --enable-cxx --prefix=/opt/db53
$ make
$ sudo make install
$ cd /opt/db53
$ sudo ln -s lib lib64

次に mcpp をビルドする。mcpp は静的ライブラリになるのでインストールはしない。 ソースは https://github.com/zeroc-ice/mcpp.git からダウンロードする。

$ wget https://github.com/zeroc-ice/mcpp/archive/master.zip
$ unzip master.zip
$ cd mcpp-master
$ make

最後に Ice-3.5.1 のビルドとインストール。インストール場所はデフォルトの /opt/Ice-3.5.1 。ただし、インストールドキュメント通りにしたらランタイムライブラリのパスがなぜか /opt/Ice-3.5 になってしまったので emmbedd_runpath_prefix=/opt/Ice-3.5.1 を指定してパスが正しくなるように修正している。

$ tar xvfz Ice-3.5.1.tar.gz
$ cd Ice-3.5.1/cpp
$ make DB_HOME=/opt/db53 MCPP_HOME=(絶対パス)/mcpp-master embedded_runpath_prefix=/opt/Ice-3.5.1
$ sudo make install
$ cd ../php
$ make PHP_HOME=/opt/rh/rh-php56/root/usr emmbedd_runpath_prefix=/opt/Ice-3.5.1
$ sudo make install
あとは PHP に IcePHP.so を読み込ませて /opt/Ice-3.5.1/php にパスを通せばよい。次のような内容のファイルを /etc/opt/rh/rh-php56/php.d/IcePHP.ini として作成する。
; Enable Ice extension module
extension = /opt/Ice-3.5.1/php/IcePHP.so

; Add to include_path
include_path = ${include_path}":/opt/Ice-3.5.1/php"
PHP の ini ファイルの中で既存の ini 変数を参照できるんだね、今知ったわ。

2015年8月18日火曜日

MariaDB10にしてみた

Software Collections のサイトが復活したので調子に乗って MariaDB10 を入れてみた。

rhscl-rh-mariadb100-epel-6-x86_64.noarch.rpm をダウンロードして、

$ yum install rhscl-rh-mariadb100-*.noarch.rpm
$ yum install rh-mariadb100

で、

$ mysqldump --single-transaction -u root -p --all-databases > mysqldump_all_database.dump

$ service mysqld stop
$ service rh-mariadb100-mariadb

$ scl enable rh-mariadb100 'mysql -u root' < mysqldump_all_database.dump

として mediawiki のページにアクセスしてみるとデータベースエラー、接続できないときた。

mediawiki ユーザのパスワードを再設定してみようとしたら、そんなユーザは知らないと言われる。'select user,host from mysql.user;' ではちゃんと表示されるのに!

ERROR 1133 (28000): Can't find any matching row in the user table

バックアップデータを戻したあと、flush privilieges; を実行していなかったのが原因だった。

MariaDB [(none)]> flush privileges;

mediawiki もちゃんと動作した。

2015年8月17日月曜日

301リダイレクト

MediaWiki でショートURL表記にする で301リダイレクトを返す R=301 の指定をしたのだが、"一度301リダイレクトにしてしまうと、「やっぱりやめた」というのは利きません" という罠があるらしい。

なんでも、301リダイレクトがブラウザにキャッシュされるのでブラウザにキャッシュが残っている限りはサーバで変更しても参照されない、キャッシュはデフォルトで無期限、コンテンツのサイズが0なのでキャッシュから追い出されることは期待できない、のコンボでサーバの設定をどういじっても修正できなくなるそうだ。

おそろしい。


2015年8月8日土曜日

Windows 10 のネットワークアダプタ優先順位

うっかりノートPC を Windows10 にアップグレードしてしまった。

しばらく使っていると、有線LAN接続してるのにいつの間にかWiFiに切り替わっていることがあることに気づいた。

8.1 のときは特に何もしなくても有線LANの方が優先されていたのであまり深く考えなかったが、このあたりどうなっているのだろう。

調べてみると、 http://www.lifehacker.jp/2013/05/130508force_cable_connection.html 優先順位の設定というものがあるらしい。知らなかった。初めて見た。

で Windows 10 でも 8.1 と同じ所にその設定はあった。WiFi の優先順位が有線LANより高くなっている。以前の設定はわからないがここで有線LANの優先順位を上げればよいのだろう。

(追記)
優先順位変更してもダメだった。というか変更が反映されない。
WiFiアダプタのメトリックを増やす、というのをやっても効果なし。
とりあえず手動でWiFiをOffにするか…

(追記2)
しばらく使ってみたけどその後この症状は発生していない。
あのときはISPのDNSがやや調子悪かったので有線LANが切れて無線LANにフォールバックしてたのかもしれないと想像してる。
ちなみに無線LANは2.4Gと5Gの両方あって、有線LANの識別名は2.4Gの方と同じになっている。この辺りの仕組みはよくわからない。無線LANの方はSSIDだけど、有線LANの方はなんだろう?

2015年8月6日木曜日

CentOS6 のリポジトリ

CentOS6標準のソフトがあまりにも古すぎるのでいろいろ検索したり試行錯誤したりして適当なサードパーティリポジトリをいれるという手段を選んだのだが、案の定依存するパッケージなどが喰違ってインストールできないケースがでてしまった。容易に予想されることではあるけれども。

今日調べたところ http://wiki.centos.org/AdditionalResources/Repositories によれば、適当な野良リポジトリは不整合を招くのでよくないとある。標準パッケージが古くてこまるというときは Software Collections (SCLリポジトリ) を使え、とある。

なんだ、そういうのがあるんなら早く言ってくれよ。なんでみんな黙ってるんだ?って思ったのだが、使えるようになたのが去年の終わりごろのようで、まだあまり広まっていない (ブログなどに書く人がいない) からのもよう。しゃーない。

それでも CentOS + SCL で検索するとそれなりに引っかかる。CentOS だと埋もれてしまうんだな。

さっそくやってみる。SCL で入れたパッケージは他の標準パッケージなどを壊さないように独自のディレクトリ構成の中にインストールされるので、インストールするだけなら既存の環境を壊すことがなくて安心だ。実行がちょっとめんどくさいが。

前準備
$ yum install centos-release-SCL

Apache24のインストール
SCL のページから CentOS 6 に対応する rhscl-httpd24-epel-6-x86_64.noarch.rpm をダウンロードしてくる。

$ yum install rhscl-httpd24-epel-6-x86_64.noarch.rpm
$ yum install httpd24
$ yum install httpd24-mod_ssl

設定ファイルはに置かれる。
/opt/rh/httpd24/root/etc/httpd/conf/httpd.conf


'apachectl configtest' コマンドの実行は以下のように行う。'httpd24' はパッケージグループの名前。
$ scl enable httpd24 'apachectl configtest'

サービスとして実行するときはもう少し簡単。'httpd24-' がプレフィクスにつく。
$ service httpd24-httpd start

PHP56のインストール
SCL のページから CentOS 6 に対応する rhscl-rh-php56-epel-6-x86_64.noarch.rpm をダウンロードしてくる。

$ yum install rhscl-rh-php56-epel-6-x86_64.noarch.rpm
$ yum install rh-php56
$ yum install rh-php56-php
$ yum install rh-php56-php-intl
$ yum install rh-php56-php-mysqlnd
$ yum install rh-php56-php-mbstring

MediaWiki で必要な APCはPHP56moreの方に入っていた。こちらも同様に remi-php56more-epel-6-x86_64.noarch.rpm をダウンロード。


$ yum install remi-php56more-epel-6-x86_64.noarch.rpm
$ yum install more-php56-php-pecl-apcu

プレフィクスが 'more-' なのに注意。

2015年8月3日月曜日

Postfix の設定

freenom でとった .tk ドメインでもメールを受け取れるようにしてみる。

main.cf に外部からメールを受け付ける設定と、指定ドメイン宛のメールを自分宛と認識させる設定を行う。下の例では追加で受け取るドメインを example.com としている。

inet_interfaces = all
mydestination = $myhostname, localhost.$mydomain, localhost,
        example.com

/etc/aliases で root 宛のメールを gmail に転送するようにして newaliases でデータベースを更新。

root:    どこか@gmail.com

aliases ファイルの本体は Git で管理してるディレクトリに置いて、/etc/aliases はそこへのシンボリックリンクにしてるんだけど最初 newaliases がエラーで動かなかった。

postalias: fatal: open /etc/aliases.db: Permission denied

/etc/aliases.db のパーミッションが悪いわけではなく、/etc/aliases のオーナーが root でないとこんなエラーが出る。これはエラーメッセージが不親切。

MediaWiki での CSS カスタマイズ

MediaWiki の デフォルトの文字の大きさがちょっと小さすぎるような気がしたので修正した。

MediaWikiのデフォルトのデザイン (Vectorスキン) のカスタマイズはCSSファイルを編集するのではなく MediaWiki の MediaWiki:Common.css とMediaWiki:Vector.css のページに追加のCSS記述を行う。

MediaWiki:Common.css と MediaWiki:Vector.css の使い分けははっきりしないが、スキンに依存するような修正は MediaWiki:Vector.css で行うのがよいのだろう。

Firefox の開発ツールを使うと、指定した要素にどんなCSSがどんなルールで適用されているのかがわかるのでそれを見ながら作業する。

MediaWiki:Common.css ではこんな感じ。デフォルトで h1, h2 要素が明朝体になってるのでゴシックに変更。

.mw-body h1, .mw-body h2 { font-family: sans-serif; }
.mw-body-content { font-size: inherit; }

MediaWiki:Vecor.css では左サイドバーの幅をちょっと大きめにして、本文フォントサイズをちょっと大きめに。

div#mw-panel { width: 14em; }
div#footer, #mw-head-base, div#content { margin-left: 14em; }
#left-navigation { margin-left: 14em; }

div#mw-panel div.portal h3 { font-size: inherit; }
div#mw-panel div.portal div.body ul li { font-size: 95%; }

で、これだけだとログインページヘは反映されない。安全のため、ログインページなどはデフォルトでカスタマイズCSSが反映されないようになってるとのこと。

変なCSSを注入されるおそれがない場合には LocalSettings.php で $wgAllowSiteCSSOnRestrictedPages を true に設定すると反映される。

$wgAllowSiteCSSOnRestrictedPages = true;

2015年7月31日金曜日

MediaWiki でショートURL表記にする

MediaWiki をインストールして http://サーバ/mediawiki でアクセスできるようにした。

このままだと http://サーバ/mediawiki/index.php/Hoge って感じでアクセスすることになるのでこれを http://サーバ/mediawiki/Hoge って感じでアクセスできるようにする。サーバやインストールの形態によってやり方は異なるので一例としてみてほしい。

サーバは Apache 2.2 で mediawiki のファイル群は /home/apache/mediawiki にインストール、DocumentoRoot からは以下のように httpd.conf の Alias 設定で飛ばしている。

Alias /mediawiki /home/apache/mediawiki

http://サーバ/mediawiki/Hoge にきたリクエストを http://サーバ/mediawiki/index.php/Hoge に書き換えるには以下のような .htaccess を /home/apache/mediawiki に置けばよい。

<IfModule mod_rewrite.c>
   RewriteEngine On
   # Redirect Trailing Slashes...
   RewriteRule ^(.*)/$ /$1 [L,R=301]

   # Handle From Controller...
   RewriteCond %{REQUEST_FILENAME} !-d
   RewriteCond %{REQUEST_FILENAME} !-f
   RewriteRule ^ /mediawiki/index.php [L]
</IfModule>

最後に MediaWiki 内でも http://サーバ/mediawiki/Hoge 形式で取り扱うように LocalSettings.php を以下のように修正する

$wgScriptPath = "/mediawiki";
$wgArticlePath = "{$wgScriptPath}/$1";

これで完了。

(追記)
R=301 の指定は危険なのでやめたほうが無難そう。

2015年7月29日水曜日

MediaWiki のインストール

Pukiwiki がちょっと肌に合わない感じなので MediaWiki を入れて試してみることにした。

MediaWiki のインストール説明に従い、あらかじめ MySQL でデータベースの作成と管理ユーザを作っておく。

# mysql -u root -p
mysql> create databse mediawiki;
mysql> grant index, create, select, insert, update, delete, drop, alter, lock tables on mediawiki.* to 'mediawiki'@'localhost' identified by 'パスワード';

MediaWiki を展開してアクセスすると初期設定が始まる。最初の動作環境チェックでキャッシュとunicode処理のモジュールがないと言われたので yum で追加インストールする。なくても動作するらしいがないとパフォーマンスが悪いそうなので入れておくことにした。

yum install php56u-pecl-apcu.x86_64
yum install php56u-intl.x86_64

で、もう一度チェックすると今度は libicu (php56u-intl が依存するライブラリ)が古いと言われた。

libicu の新しいのは Remi http://rpms.famillecollet.com/ とかいうリポジトリにしか見当たらなかったのでやむなく Remi を入れる。

rpm -Uvh remi-release-6.rpm

で、php から丸ごと入れなおし。

yum install --enablerepo=remi-php56 php php-mysql php-mbstring
yum install --enablerepo=remi-php56 php-pecl-apcu
yum install --enablerepo=remi-php56 php-intl

MediaWiki がなぜか動かないので Apache のログ見たら


PHP Fatal error:  Class 'DOMDocument' not found in ...

っていうエラーが出てた。 ググるとPHPパッケージによってはモジュールが別で作成されてるとのこと。php-xml を入れればいいらしい。

yum install --enablerepo=remi-php56 php-xml

動いた。

2015年5月26日火曜日

SSLの設定確認


今日口座の残高確認しようと思ってみずほ銀行のサイトにアクセスしたらあいかわらずトップページでhttpsが使えない状態だった。Googleで「みずほ銀行」を検索しても公式トップじゃなくて宝くじコーナーが検索トップにきてるし。どうなっているのやら。

それはさておき、自分のhttpsサイトの設定は大丈夫かと気になった。もちろんブラウザで接続して閲覧できることは確認してるけど、設定がちゃんとしているかどうかはわからない。
  
SSL の設定は Qualys SSL Labs の SSL Server Test  でチェックしてくれる。

チェックの結果見つかった減点項目は、SSLv3、RC4 が有効になってるのと、中間証明書がインストールされていないこと。

Apache の SSL 設定は Mozilla SSL Configuration Generator でおすすめを出してくれる。

ssl.conf を編集すればよいのかと思ったが、SSLCipherSuite などは <VirtualHost _default_:443> のブロックでなくて SNI で指定している <VirtualHost *:443> ブロックの中に書かないと有効にならなかった。このあたりの設定の有効範囲があまり理解できてない。

RC4 が有効になってないかどうか確認するには openssl を使って確認できる。

$ echo Q | openssl s_client -connect localhost:443 -servername www.example.org -cipher RC4

これで接続できれば RC4 が有効になっている(設定に失敗している)ってことだ。

という感じで設定して A 判定取得

2015年5月18日月曜日

CentOS で Apache の更新はどうしたら

CentOS6 に入ってる Apache のバージョンは 2.2.15。ちなみに2.2系の現時点の最新版は2.2.29 だ。

標準の yum のリポジトリが古いのにはもう慣れた。そうだな、最新もしくはそれに近いバージョンの rpm が入ってるリポジトリをインストールすればいいんだろ。ってなわけでググってみると http://centos.alt.ru/repository/centos/6/$basearch/ というのが見つかった。

ru...

いや、まあ、ドメインがロシアだからどうってわけではないけど(あるけど)、みんなこれ入れてるの? リポジトリの信頼性とか安全性とかみんなどう確認してんだろ。

しかも Firefox で http://centos.alt.ru/ にアクセスすると
この Web ページ (centos.alt.ru) は攻撃サイトであると報告されており、セキュリティ設定に従いブロックされました。
って出るし(google の診断らしい)。

ちょっと使えなさすぎじゃないですかね。

Apache の名前ベースバーチャルホストによる SSL (SNI)

かつて SSL は名前ベースのバーチャルホストでは運用できないとされていたが、今はそのための規格やサーバ、対応クライアントの普及もあって、まあ使える。

もちろん対応していないクライアントもまだまだ残っていて、商用では「使えない」とされるのかもしれないけれど、それは置いておこう。

その規格は SSL/TLS の拡張仕様で SNI (Server Name Indication) と呼ぶらしい。 Apache 2.2 系などで使えて、"NameVirtualHost *:443" とすると有効になる。

あとは "<VirtualHost *:443>" ~ "</VirtualHost>" の間にディレクティブを記述すればよい。通常の名前ベースのバーチャルホストと同様だ。

ただ、HTTP でリクエストされたホスト名がバーチャルホスト定義のどこにもマッチしないときは、先頭のバーチャルホスト定義がデフォルトとして使われる、かと思ったがどうも違うようだ。

ホストがマッチしない時は元から入っている "<VirtualHost _default_:443>" の定義が使われているようであるし、DocumentRoot はグローバルに記述したところが有効になっているようだ。

:80 の場合と設定が有効になるルールが異なっているような気がするのだが、どうなんだろう。

2015年5月13日水曜日

Windows の Emacs で tramp

Emacs には tramp というものが入っている。

これがどういうものかというと、リモートマシンのファイルをあたかもローカルにあるかのように取り扱えるという便利なものだ。

昔はサードパーティーの elisp パッケージだったのが、いつからか標準で Emacs に含まれるようになっている。

バックエンドとして ssh を使っていて、UNIXライクな環境だと特に何も考えずに使えるようになっているのだが、例によって Windows だと使えるようにために設定が必要である。

参考にしたのはこのページ http://d.hatena.ne.jp/t0m0_tomo/20101208/1291782058

まず、バックエンドに PuTTY を使うとして、PuTTY へのパスを通す必要がある。PATH に PuTTY のフォルダを指定している人はこの設定はたぶん飛ばせる。

たとえばユーザ xxx が自身の "ドキュメント" フォルダに PuTTY のフォルダを置いているとすると、実際のパスが "C:\Users\xxx\Documents\PuTTY" とかになっているので、~/.emacs.d/init.el に以下を設定する。
(setenv "PATH"
    (concat
     (getenv "PATH")
     ";" "C:\\Users\\xxx\\Documents\\PuTTY"))

あくまで例示なので、自分のとこではパスが違うとかそういうのは適当に自分の環境に合わせて読み替えてほしい。

これで Emacs から PuTTY を使う準備ができた。

次は tramp でPuTTY の plink.exe を使う設定。
(require 'tramp)
(setq tramp-default-method "plink")
(setq tramp-shell-prompt-pattern "^[ $]+")

これでいける。

あとは C-x C-f でファイルを開くときに "/hostname.example.com:~" とかいう感じで指定すると hostname.example.com のホームディレクトリが参照できる。

ちなみにこの hostname.example.com の部分は PuTTY でのセッション名でもいける。セッション名の方がリモートユーザ名とかあらかじめ設定できて便利だと思う。ただ、日本語のセッション名を入れたら tramp の方が認識しなかった。ホスト名っぽいセッション名にしておいた方が無難な模様。



2015年5月8日金曜日

CentOS6 の Git をアップデートした話

また、CentOS と yum の話をする。

CentOS6 の標準 git は 1.7 だった。これはあまりにも古い。が、最初から入ってるのが古い事そのものは問題ない。更新できれば。

IUS のリポジトリには git2u ってのがあってこれが 2.3.6 になっている。 これを入れればよいのだけれど、例によって初期状態で入っている 1.7 とコンフリクトして入らない。

yum のコマンドで置き換えたりできないのかなーと思って Google で検索してみたところ、出てくるページ出てくるページがどれも「CentOS標準の git が古いんで新しいの入れました。ソースから。どやぁ。」

あほか。なんのためのパッケージシステムなんだよ。ソースからビルドするんならおとなしくBSDでも使ってろ(注:筆者はNetBSDユーザです)。

で、ビルドするのにライブラリが足りないからってこっちは yum でインストールしてんの。もう見てらんない。

結局古いの削除して新しいのインストールしたよ。
# yum erase git
# yum install git2u

CentOSを使ってみた

ちょっと用事があって、さくらVPSを使ってみた。これについてはいずれ書くかもしれないけど、今回はさくらVPSの標準OSであるCentOS6を使ってみた話。

UNIX系OSとしてはこれまでNetBSDメインで使っている。以前はFreeBSDが主だったし今でもFreeBSDは使う機会もあるのだが、何が言いたいかというとBSD系だってことだ。

BSD系に愛着はあるんだけれども、世間的にはLinux系の方がメジャーなのだろうし、さくらVPSの標準OSがLinux系のCentOSだってんならそれを使おうじゃないか。標準ならインストール済みだしドライバとかでハマることもないんだろう。

世間のみんなが使ってるんだし最新のアプリがコマンド一発ポンでサクッと使えるようになってるはず。pkgsrcやportsのリポジトリを眺めながら早く最新に対応してくれないかなーって思ったり、そもそも提供されてなくて野良ビルドに苦労したりなんてことも当然ないよね?

で、ログインしたわけだ。

CentOS6ではアプリケーションはyumとかいうコマンドで管理するらしい。

うん、yum見たことある。昔サーバにLinuxインストールした時に使ったやつだ。その時のサーバはアンインストールしちゃったけどな。

で、apache とかインストールしたあと、yum list mysql php とかやったわけよ。

$ sudo yum list php mysql
読み込んだプラグイン:fastestmirror, security
Loading mirror speeds from cached hostfile
 * base: ftp.tsukuba.wide.ad.jp
 * epel: ftp.kddilabs.jp
 * extras: ftp.tsukuba.wide.ad.jp
 * updates: ftp.tsukuba.wide.ad.jp
利用可能なパッケージ
mysql.x86_64                       5.1.73-3.el6_5                        base
php.x86_64                         5.3.3-40.el6_6                        updates
$

…古くね?

で、調べてみると、yumの追加のリポジトリを 別のところから持ってこないといけないらしい。

なんだよ追加のリポジトリって。公式で一元管理されてないのか最低だな。なんだよiusって。

で、しかたないからiusリポジトリっていうのを入れたのよ。

ius に入っている mysql が mysql56u って名前なのはまだいい(56uのuってなんだよというのはこの際おいとく)。mysql56u入れようとしたら最初から入ってるmysql-libsと干渉して入んないじゃねえか(参考: http://d.hatena.ne.jp/R-H/20120505/1336187294)。

  1. MySQL の本家ページ(http://dev.mysql.com/downloads/repo/yum/)から yum のリポジトリCetOS6用をダウンロードする。これを書いてる時点の最新は mysql-community-release-el6-5.noarch.rpm だった。
  2. ダウンロードしたリポジトリをインストールする。
    yum install mysql-community-release-el6-5.noarch.rpm
  3. 古い mysql との互換ライブラリが mysql-community-libs という名前であるのでインストールすると古い mysql-libs が mysql-community-libs に置き換えられる。
  4. あとは mysql-community-server をインストールすると干渉することなく mysql 5.6 がインストールされる。
標準OSだからCentOS6で作業したけど、CentOS7とかだったら状況はマシだったんだろうか。

こんなだったらFreeBSDとかのほうがマシだったかな?


2015年3月12日木曜日

gfortranを使った依存関係の出力

Fortran でモジュールごとにファイルを分けてコンパイルするようなケースでの話。

Makefile に hoge.o とか fuga.mod とかの依存関係を手書きしたりするんだけど、数が増えてくるとめんどくさいし間違えやすいよね。

実は gfortran には依存関係を出力する機能がある(4.9.2で確認)。

オプション -M または -MM が依存関係を出力させるオプションだ。同時に -cpp も指定する必要がある。そのままだと標準出力に出力されるが -MF file を指定してファイルに出力させることもできる。

例えば hoge.f90 の依存関係を hoge.d に出力させるなら次のようにする。

$ gfortran -cpp -MM -MF hoge.d hoge.f90

ここで hoge.f90 が 内部で USE fuga としていたとすると hoge.d は次のようになる。

hoge.o: hoge.f90 fuga.mod

しかし、コマンドの実行に先立って fuga.mod が存在していなければならない。

あれ?

fuga.f90 を先にコンパイルするってわかってたら最初から Makefile にそう書くってーの!

つかえねーじゃん!!

2015年3月3日火曜日

Project Euler に参加してみた

Project Euler っていうのを知ったので参加してみた。

数学の問題 (簡単なものから難しいものまである) をプログラムを作って解くというものだ。

探せば問題文の和訳が落ちているけれど、英語の練習だと思って和訳は見ないでやってみる。使用言語は自由なので Fortran でエントリー。

結果の数値を入力して正解かどうか判定するだけなので、間違っていてもどう間違っているかはわからない。

いきなり2問目で条件を見落としてちょっと悩む。

3問目では 32bit 長で表現できない数字が出てきた。どうしようかと思ったけど int64 を使って逃げる。組み込みの型で表現しきれないのが出てきたらどうしようかな?

暇なときにゆるりと進めていくか。

2015年3月2日月曜日

Emacs 24.4 32bit 版のバイナリ (IME パッチをあてたもの)

32bit 版の Emacs 24.4 をビルドしてみた のその後。

いろいろ試した結果できた 32bit 版 Emacs 24.4 のバイナリはこちら。
emacs-24.4-IME-patched-x86_64-pc-mingw32.zip

Windows 8.1 64 bit に 64bit 版 MSYS2 をインストールし、 mingw-w64-i686 (32bit 版の開発環境) でビルドしている。

同梱の DLL は mingw64-w64-i686 からコピーしたもの。

2015年2月27日金曜日

Fortran 用の Makefile

Fortran 用の Makefile について見なおしてみた。

ポイントは
  1. make のデフォルトルールをできるだけ活用する
  2. mod の依存関係をただしく反映する
の2点。自分がこれまで使ってたのは 2 ができてなくて、モジュールを再コンパイルするとそのモジュールを use しているファイルも再コンパイルしていた(そういうルールを自分で記述していた)。

でも実際はモジュールが再コンパイルされても .mod ファイルが更新されるとは限らない。そのときはそのモジュールを use しているファイルは再コンパイルの必要がないはずだ。

サンプルを示すよ。ターゲット sample は main.o と sub.o をリンクしてて、どちらも Fortran のプログラム。そして main.f90 はモジュール sub を use している。

ポイントは Makefile に記述した %.mod のデフォルトルール。.mod は .f90 と .o に依存するけど作成のためには何もしない。参考リンクでは true にしてるけど Windows だと true 使えなかったりするので : にした。

こうしておくとオブジェクト間の依存関係を Makefile の最後の行のように素直に書くことができる。main.o は sub.mod に依存し sub.o には依存していない。

これで sub.f90 が更新されて sub.o が再作成されても sub.mod に変更がなければ main.o が再コンパイルされることはない。ただし sub.mod のみを削除するのは禁止な。

参考
http://d.hatena.ne.jp/pyridoxin/20110726/1311691190
http://lagrange.mechse.illinois.edu/f90_mod_deps/

2015年2月26日木曜日

Gist にアップしたコードを Blogger に貼り付けてみる

先日 blogger に highlight.js を組み込んだばかりなのに、今どきは GitHub Gist にコードを置いて貼り付けるのがスタンダードなようで、がっくし。

Gist にアップしたコードを Blogger に貼り付けてみるテスト。


Gist にアップすると1番目の例のようなコードが用意されるので Blogger を HTML 編集モードにして貼り付ける。複数のコードをアップしているとこのように全部貼り付けられる。

Gist に複数載せたファイルを個別に指定するには2番目のように ?file= でファイル名を指定すればよい。

参考
http://www.msng.info/archives/2013/12/gist.php

ところでこうして貼り付けたとき Gist の中に書いてあるキーワードは検索に引っかかるのかな? なんとなくダメなんじゃという気がするけど。

追記
少なくとも Google は Javascript で読んだ先も検索対象にしてくれるようだ。あとは Gist のほうで Public にしておけばいい、ということかな。
http://googlewebmastercentral-ja.blogspot.jp/2014/10/updating-our-technical-webmaster.html

32bit 版の Emacs 24.4 をビルドしてみた

手元の OS がなぜか 32bit 版の Windows 7  なので IME パッチのあたった Emacs 24.4 が使えない。

しかたがないので自分でビルドした。参考にしたのはこのページ。
https://github.com/chuntaro/NTEmacs64


事前準備

ビルドのために MSYS2 は入れてある。まずは必要なパッケージのダウンロードとインストール。

$ pacman -Syu
$ pacman -S base-devel
$ pacman -S mingw-w64-i686


Emacs のビルド

よくわからないので CFLAG は -Ofast だけにした。

$ CFLAGS='-Ofast' ./configure
...
Configured for `i686-pc-mingw32'.

  Where should the build process find the source code?    .
  What compiler should emacs be built with?               gcc  -std=gnu99 -Ofast
  Should Emacs use the GNU version of malloc?             yes
  Should Emacs use a relocating allocator for buffers?    yes
  Should Emacs use mmap(2) for buffer allocation?         no
  What window system should Emacs use?                    w32
  What toolkit should Emacs use?                          none
  Where do we find X Windows header files?                NONE
  Where do we find X Windows libraries?                   NONE
  Does Emacs use -lXaw3d?                                 no
  Does Emacs use -lXpm?                                   yes
  Does Emacs use -ljpeg?                                  yes
  Does Emacs use -ltiff?                                  yes
  Does Emacs use a gif library?                           yes
  Does Emacs use a png library?                           yes
  Does Emacs use -lrsvg-2?                                yes
  Does Emacs use imagemagick?                             no
  Does Emacs support sound?                               yes
  Does Emacs use -lgpm?                                   no
  Does Emacs use -ldbus?                                  yes
  Does Emacs use -lgconf?                                 no
  Does Emacs use GSettings?                               no
  Does Emacs use a file notification library?             yes (w32)
  Does Emacs use access control lists?                    yes
  Does Emacs use -lselinux?                               no
  Does Emacs use -lgnutls?                                yes
  Does Emacs use -lxml2?                                  yes
  Does Emacs use -lfreetype?                              no
  Does Emacs use -lm17n-flt?                              no
  Does Emacs use -lotf?                                   no
  Does Emacs use -lxft?                                   no
  Does Emacs directly use zlib?                           yes
  Does Emacs use toolkit scroll bars?                     yes
  Does Emacs support W32-IME?                             yes
  Does Emacs support RECONVERSION?                        yes
  Does Emacs support DOCUMENTFEED?                        yes
...
$ make bootstrap
...
$ make install
...

すると /usr/local (C:\msys32\usr\local) にインストールされる。

make bootstrap したけど configure のときの CFLAGS は効いてるんだろうか。


配布パッケージの作成

コマンドプロンプトを立ち上げ、環境変数 PATH をクリアしてから Dependency Walker (depends.exe) を実行する。

emacs.exe を Dependency Walker にドラッグアンドドロップして読み込ませる。と、エラーが出て読み込めなかった DLL が表示される。DLL はたいてい /mingw32/bin にあるので、それを emacs.exe と同じフォルダにコピーする。

DLL も依存関係で他の DLL を読もうとすることがあるので、やはり Dependency Walker でチェックして必要な DLL をコピーする。

いくつかの DLL は必要なときにしか参照されない。emacs を起動して変数 dynamic-library-alist の中身を確認する。DLL のリストを見て必要なものをコピーする。これらも同様に Dependency Walker で依存関係を確認する。

...バイナリにビルド時のホスト名とかユーザ名とか PATH とか埋め込まれてるな。公開するのは作りなおしてからにするか。

2015年2月25日水曜日

MSYS2 を入れた

Emacs 24.4 32bit 版をビルドしよう思って https://github.com/chuntaro/NTEmacs64 を参考に作業してたら何かがおかしい。

よく見たら手元の環境は MSYS2 じゃなく MSYS だった。

ということで MSYS2 をインストールして作業のやり直し。

MSYS2 のインストールは下のページを参考にした。

Windows でよく使われる VPN

Windows でよく使われる VPN についてのメモ。

調べたらこんな感じだった。もちろん実際に何が使えるかは接続先の環境による。
  • PPTP
  • SSTP
  • OpenVPN
  • SSHポートフォワード

PPTP
TCP 1723 と GRE を使用する。単体では NAT を通らない。ルータとかで GRE を通す設定が必要。多くの OS で使用できる。

SSTP (MS-SSTP)
通信に HTTPS (SSL) を使用する。HTTP プロキシで中継可能。クライアントは Windows の Vista 以降で使用できる。
http://www.vpngate.net/ja/howto_sstp.aspx

OpenVPN
通信に HTTPS (SSL) を使用する。HTTP プロキシで中継可能。専用ソフト (ドライバ?) が必要。
http://www.openvpn.jp/

SSH ポートフォワード
SSH で接続できる環境があればなんとかなる。PUTTY などのクライアントが必要。
http://web.plus-idea.net/2012/12/proxy-ssh-putty/

直接外部に接続できない環境だとプロキシ通せる SSTP ということになるのかな。

2015年2月24日火曜日

Emacs 24.4 のプロキシ設定

Emacs 24.4 からは標準でブラウザ機能がつくようになった。

とはいっても Windows では使うことないかなと思ってたのだが、さっき Emacs 24.4 を立ち上げた時にスプラッシュ画面の GNU Emacs リンクをうっかりクリックしてしまった。


たまたま Proxy 環境だったので接続待ちでしばらく Emacs がフリーズしてしまったので Proxy を設定することにした。

参考にしたのはここのサイト。
るびきち「日刊Emacs」: Emacsでproxyを使う設定

以下の2通りの方法があるそうだ
  • 環境変数 http_proxy を設定する
  • url-proxy-services 変数を設定する

とりあえず init.el に url-proxy-servises を設定しておく。
(setq url-proxy-services '(("http" . "proxy.example.co.jp:8080")))