May 1, 2012
DNSサーバのIPアドレスが変わった時の networksolutions の手続きに関する諸々
networksolutionsのDNSサーバのIPアドレスの変更について書いたのだが、間違っていたので訂正。
Managing Domain Name Serversによると、新しいネームサーバを追加したり、アップデートするためには、
- www.networksolutions.com にいく
- 右上にある、Manage Account タブをクリック
- User ID と password を入力
- My Products & Services タブをクリック
- My Domain Names をクリック
- More Domain Optionsまでスクロールして、Manage Name Serversをクリック
- 変更したいまたは追加したいサーバ名を入力して、GO (Continue)をクリック
- IPアドレスの入力欄が出てくるので、ネームサーバのアドレスを入力して、GOをクリックする。
- 変更していいか確認が出るので、良ければ Save Changesをクリック
- 更新した旨のメッセージが出る。
注意:世界中のサーバにドメインネーム情報が行き渡るのに、およそ72時間かかります。この手順を完了するとドメイン名を利用できるようになります。
April 13, 2012
MathJaxを使ってみた
まずは、オイーラーの公式から
おおぅ。ではガウスの法則はどうだっ!
すばらしい。
April 12, 2012
素数日を調べるプログラムを書いてみた
長文こへだというブログの素数と素材とアホ夫婦の話という記事に、素数日だと思って2011年4月17日に婚姻届を出したのだが、20110417は、19の倍数(1058443 x 19)で素数ではなかったという話が載っていた。この夫婦の悲劇を繰り返してはならないという使命に燃え、素数日を調べるプログラムを書いてみた。ここでは素数日を、ある日付の西暦を4桁、月を2桁、日を2桁で表し、それをYYYYMMDDと並べた数値が素数である日付と定義する。
それではまず、素数のリストを求めよう。素数は無数にあることが分かっている(数学ガール参照のこと)ので、求める範囲を2020年12月31日までとしよう。これは、私が結婚をすることを諦めるであろう期間の最大値であると根拠なく推定したからだ。ともあれ、C++で書くとこんな感じ。
#include<iostream>
#include<cstdio>
using namespace std;
const int MAX = 20201231;
int main(void)
{
FILE *f;
int n;
if(NULL == (f = fopen("prime.dat", "wr")))
return -1;
fwrite("0", 1, 1, f);
for(int i=0; i<MAX; i++){
fseek(f, i, SEEK_SET);
fwrite("1", 1, 1, f);
}
for(int i=2; i<=MAX/2; i++)
{
for(int j=2; MAX>(n=j*i); j++){
fseek(f, n-1, SEEK_SET);
fwrite("0", 1, 1, f);
}
}
fseek(f, 0, SEEK_SET);
for(int n=1; 0==feof(f);n++){
if((int)'1' == fgetc(f))
printf("%d\n", n);
}
return 0;
}
C++とで書いたと言ってたくせにCじゃないかとか、最大値がマクロで指定されていてカッコ悪とか都合の悪いことは知らんぷりなのであしからず。素数の計算というと、べらぼうに時間がかかるイメージがあったのだが、実際に計算させてみるとCore2の2.4GHz、RAM2GByteで15分くらいだった。ちょっと拍子抜け。これならRubyで書いても問題なかったなぁと思った。 この出力をリダイレクトして、prime.lstというファイルに保存しておこう。
このコードはシンプルなアイデアで、20201231個の「1」を書いたファイルを用意して、2の倍数、3の倍数、4の倍数...個目の1を0に変えていく。これをある大きさまで繰り返すと、素数個目の数が1で、それ以外が0になっている。つまり、1が何番目にあるか調べれば素数のリストを作ることができる。全く最適化していないので、無駄な計算をしている部分があるのだが、40行程度で書け、実行時間が実用上支障のない時間だったので、よしとする。
次に、求めた素数が存在する日付であるか判定するプログラムが必要だ。PCが素数を探している間に、そのプログラムを書くことにしよう。こういうことはC/C++よりも、RubyやPerlがきっと得意なのでRubyで書くと、
#!/usr/bin/ruby
def calcEndofMonth(year, mon)
t1 = Time.mktime(year, mon, 1);
if(mon == 12)
t2 = Time.mktime(year+1, 1, 1);
else
t2 = Time.mktime(year, mon+1, 1);
end
return year*10000 + mon*100 + (t2-t1)/(3600*24);
end
def isCal(val)
for year in 2012..2020
for month in 1..12
if((val > year*10000 + month*100) && (val <= calcEndofMonth(year, month)))
return true;
end
end
end
return false;
end
f = File.open("prime.lst", "r");
f.each{|n|
if(isCal(n.to_i))
p n.to_i;
end
}これも簡単で、ある月に何日あるかを調べ、それをYYYYMMDDに並べて数を作る(たとえば、2012年4月であれば、4月には30日あるので20120430)。 次にその月の1日の数を作る(20120401)。そしてさきほど求めた素数がその範囲に入っているか調べる。入って入れば表示し、入っていなければ次の月で同じことを行う。これを求めたいすべての月で行うと、素数日を求めることができる。
計算の結果、2012年1月1日から2020年12月31日までの間に182日あるようだ。計算した2020年までの素数日のリストもリンクしておく。
April 8, 2012
後悔と失意の週末
今日は映画、サッチャーを見た。 マーガレットサッチャーは、私が物心付いたときの英国の首相だ。 メリルストリープの演技が非常にすばらしく、マーガレットが類い稀な信念を持ち、 国民の反発を招きつつも、家族、特に夫ロバートに支えられていたことがよく描かれていた。
終わった後、私は深い後悔の念を感じた。
この作品を見たことに対する後悔ではない。
やるべきことをやらなかったこと、できることをしなかったことに。
そしてその時は過ぎ去り、取り返しがつかないのに...
スコッチが飲みたい。
March 26, 2012
変数を宣言せずに1から100までの和を求める方法
twitterで、
@nullmineral
「1から100までの整数の和を表示するプログラムを作れ」という問題を鼻で笑う諸君、「但し変数は新たに宣言しないこと」 という条件を付けても鼻で笑っていられるかな?
というtweetがあったので、あぁ再帰を使えば簡単。Rubyで書くとこんな感じかな。
def sum(n, r)
if(n > 100)
return r;
else
sum(n+1, n+r);
end
end
p sum(1, 0)
だが、もっと強者がいた。
p (1 + 100) * 100 / 2
等差数列の和の公式....ボロ負けでした...orz
追記:
twitterでいろいろツッコミをいただいたので、追記。
@littlestarling:
(1..100).inject(0){|i, sum| sum += i} だと宣言してることになるのかな。まあ公式ちゃんと使う方が正しいっすね。
ほう。こんなものもあるのか。ということで調べてみると、Rubyの1.9系には、Enumerateにreduceというメソッドがあり、injectの別名のようだ。これを使うとわずか1行で書ける。
(1..100).reduce(:+)
すばらしい。LISPでこのような問題を解く場合、「Lisp脳」の謎に迫る - Schemeプログラマの発想に記されているように、「データからデータへの変換」を考える。すなわち、1から100までのリストを作って、それをいじって結果を出すという考え方だ。例えばSchemeで書くとしたらこんな感じになる。
(use srfi-1) (fold + 0 (iota 100 1))
injectやreduceを使ったやり方は、まさにこの考え方だ。ちなみにreduceに渡している":+"というのは、+演算子のSymbolで、これはSchemeでいうと'+'という関数をFOLDに渡すことに相当する。
最後に、もう一つ。
@hiromiso:
sum(1:100)
GNU Rか... またもや敗北...orz
March 2, 2012
Rubyのlambdaでクロージャを書いてみた
いつの間にかRubyにlambdaができていたようなので、条件反射でいつものクロージャーを書いてみる。
def makefunction
x = 0;
return lambda {
return x+=1
};
end
f = makefunction;
x = -100;
p f.call;
p f.call;
p f.call;
p x; これを実行すると
1 2 3 -100
すばらしい。 だが、この程度であれば1.8以前でもProcを使えばできたことは秘密だ。
def makeproc
x = 0;
return Proc.new {
return x+=1
};
end
f = makefunction;
x = -100;
p f.call;
p f.call;
p f.call;
p x;
$ ruby1.8 clojur.rb
1
2
3
-100
だが、Understanding Ruby Blocks, Procs and Lambdasによると、lambdaとProcには微妙な違いがあるようだ。これは後日。
おまけ。Procの中で、self.callを呼べば無名再帰できるんじゃね?と思ったけれど、Proc.selfはObject型でした。残念。
February 5, 2012
Gnuplotの canvas terminalドキュメントの和訳
gnuplot 4.4 document の canvas terminal の所を和訳してみました。かなり意訳になっているので、間違いや勘違いを含んでいる可能性があります。この原文は英語で、http://www.gnuplot.info/docs_4.4/gnuplot.pdf (p.169 - 170)にあります。この邦訳の著作権も原文に準じるものとし、この邦訳によって生じたいかなる損害の責任は負いません。
83.7 Canvas
Syntax:
set terminal canvas {size <xsize>, <ysize>} {fsize <fontsize>}
{{no}enhanced} {linewidth <lw>}
{standalone {mousing} | name '<funcname>'}
{jsdir 'URL/for/javascripts'}
{title '<some string>'}
ここで、<xsize> と <ysize> は、プロットエリアのサイズをピクセルを単位で指定します。 デフォルトサイズは、standalone モードで、横600、縦400ピクセルです。 デフォルトフォントサイズは10です。 NB: Only one font is available, the ascii portion of Hershey simplex Roman provided in the file canvastext.js. You can replace this with the file canvasmath.js, which contains also UTF-8 encoded Hershey simplex Greek and math symbols.
デフォルトのstandaloneモードは、HTML5の canvas 要素を使ってプロットする JavaScript のコードを含むHTMLページを生成します。このHTMLページは ''canvastext.js' と 'gnuplot_common.js' の2つの JavaScript ファイルをリンクしなければなりません。デフォルトでは、ローカルにあるファイルをリンクしており、一般的な Unixライクなシステムでは、/usr/local/share/gnuplot/<version>/js ディレクトリの中にあります。他のプラットフォームに関しては、installation notesを参照してください。これを変更するには、jsdir オプションに、他のローカルのディレクトリまたはURLを指定します。このURLの指定は、ネットワークに接続されているクライアントマシンにプロットしたグラフを転送するときに使われます。
canvas ターミナルによって全てのプロットにマウスを使うことができます。キーワード mousing を追加すると、standalone モードのプロットの横にマウストラッキングボックスが追加されます。gnuplot は、canvastext.js'と同じディレクトリ、または URL にあるJavaScript ファイル 'gnuplot_mouse.js' とマウスボックスのためのスタイルシート 'gnuplot_mouse.css' へのリンクを追加します。
name オプションを指定すると、JavaScript だけが含まれたファイルを作成します。javascript ファイルに含まれている関数の名前と、 canvas 要素の id は、name オプションに続く文字列になります。以下のコマンドは、
set term canvas name 'fishplot'
set output 'fishplot.js'fishplotという id を持つ canvas に描画する fishplot() という JavaScript で書かれた関数を含むファイルを生成します。 またこの JavaScript 関数を呼び出す HTML ファイルは、前述の canvastext.js をロードしておかなければなりません。 この fishplot を含む最低限の HTML ファイルは以下のようになるでしょう。
<html>
<head>
<script src="canvastext.js"></script>
<script src="gnuplot_common.js"></script>
</head>
<body onload="fishplot();">
<script src="fishplot.js"></script>
<canvas id="fishplot" width=600 height=400>
<div id="err_msg">No support for HTML 5 canvas element>/div>
</canvas>
</body>
</html>
February 4, 2012
gnuplot の canvas terminal についての諸々
gnuplot 4.4から、terminalにcanvasが追加された。このcanvasは、何を隠そうHTML5のCanvasオブジェクトに、グラフを描画するコードを出力する。たとえば、以下のコマンドを入力すると、
set terminal canvas mousing jsdir 'http://www.argv.org/~chome/gnuplot' set output 'sinx.html' plot sin(x)
sinをプロットした画像が、sinx.html に書き出される。次に、
set terminal canvas name 'sinx' set output 'sinx.js' plot sin(x)
と入力すると、name オプションで指定した文字列のidを持つcanvas要素にグラフを描画する関数を含むJavaScriptのコード「のみ」が、sinx.jsに出力される。ドキュメントによると、このスクリプトを使う最小構成は以下のようなHTMLとのことだ。
<html> <head> <script src="canvastext.js"></script> <script src="gnuplot_common.js"></script> </head> <body onload="fishplot();"> <script src="fishplot.js"></script> <canvas id="fishplot" width=600 height=400> <div id="err_msg">No support for HTML 5 canvas element</div> </canvas> </body> </html>
が、OSX版のChromeでは、変数zoomedが宣言されていないとエラーが出るので、以下のようにグローバル変数 zoomedを宣言する。JavaScriptのみを出力する場合は自前でコードを追加するはずなので、そこで宣言しておけばよいだろう。
<html>
<head>
<script src="canvastext.js"></script>
<script src="gnuplot_common.js"></script>
</head>
<body onload="sinx();">
<script type="text/javascript">
var zoomed = false;
....
</script>
<script src="sinx.js"></script>
<canvas id="sinx" width=600 height=400>
<div id="err_msg">No support for HTML 5 canvas element</div>
</canvas>
</body>
</html> 2012年2月4日現在、すでにgnuplot 4.6-RC1が出ており、このバグが修正されているか確認するしたところ、修正されていた。よって4.6以降のgnuplotでは変数zoomedを宣言刷る必要はない。
February 2, 2012
pipeを使ってgnuplotをCで書いたプログラムから制御する方法(Win32)
gnuplotは優れたプロットプログラムである。インタラクティブにコマンドを入力してもよいし、スクリプトを書いてバッチ処理もできる。そしてWin32であっても、パイプを使って外部プログラムから制御することもできる。ここではWin32 APIを使って、Cで書かれたプログラムからgnuplotを操作してみた。
#include <stdio.h>
#include <stdlib.h>
static const char *GNUPLOT = "c:\\gnuplot\\binary\\gnuplot.exe -persist";
int main(int argc, char* argv[])
{
FILE *pPipe = _popen(GNUPLOT, "w");
if(NULL == pPipe){
printf("popen fail\n");
return 0;
}
fprintf(pPipe, "set terminal png\n");
fprintf(pPipe, "set output 'test.png'\n");
fprintf(pPipe, "plot cos(x)\n");
_pclose(pPipe);
return 0;
}非常に簡単だ。UNIX同様パイプを作成し、パイプにコマンドを入力する。この例だと、test.pngというファイルにcos(x)のグラフがPNG画像として保存される。ポイントは、gnuplotコマンドに -persistオプションを付けることである。
そういえば、気になっていたスタイルシートを修正しました。
January 23, 2012
2011年京都、奈良の旅
iPad用のキーボードLogicool Tablet Keyboard for iPadを買ったので、試してiPadでblogを書いてみることにする。このキーボードは、iPadのスタンドとBlueroothキーボードがセットになったものだ。iPad用のHTMLエディタであるdPadでこの記事を書いている。印象としては実用上支障なしといった感じ。入力補完が少し煩わしいが慣れの問題だろう。シングルタスクでアプリを切り替えながらFlickrやブラウザから比較的簡単にコピペできるし、HTMLの入力支援もなかなか。さて、次から本文。
昨年の12月に例年通り京都、奈良に旅行に行った。初日の京都は寝不足だったせいか、体調が悪かったので清水寺と三十三間堂にしか行かなかった。二日目は奈良。実はほとんど写真を撮っていなかった。
奈良ではまず元興寺に行った。ここは近鉄奈良駅から奈良公園までの間にある。猿沢の池の近くにある寺で世界遺産にも登録されている。本尊が曼荼羅という珍しい寺だ。また本堂の屋根に奈良時代当初の瓦が使われていたりなかなかぐっとくる。上の写真の色が変わっている瓦が当初の瓦だ。また宝物館では、五重塔のミニチュアがある。これは当初のものだ。奈良時代の寺院の屋根は、鎌倉以降再建された屋根に比べ角度が浅かった。これは屋根の角度が浅いために雨水が流れ落ちにくく雨漏り等による痛みが激しかったため角度を急にしている。唐招提寺では平成の大修理で屋根の垂木からこの事実が証明されている。このミニチュアの五重塔は屋根の角度が浅い。屋根の角度でずいぶん違って見える。屋根の角度は変わり、朱塗が剥げた建物を私達は見ている。当初と印象はずいぶん違うだろう。このミニチュアは当初の五重塔がどのようなものか私達に教えてくれる。
次に興福寺。興福寺は国宝館ができていた。興福寺といえば阿修羅像だが、阿修羅像を含む乾漆八部衆立像が好きだ。阿修羅像は言うに及ばず八部衆のどれも傑作だ。次に平安神宮に行く。東大寺と平安神宮の参道の分岐点から結構歩く。参拝したあとは、東大寺三月堂まで歩く。三月堂といえば不空羂索観音立像。これは東大寺で最も古い仏像だ。大仏よりもこちらがお目当てだ。なんと三月堂の須弥壇の修復が平成25年3月末まで行われるらしく、残念ながら見ることができなかった。東大寺のWebによると不空羂索観音立像、日光月光菩薩立像は東大寺ミュージアムで見ることができるようだ。
ここから鐘楼を通り大仏殿へ向かうが、あえてスルーして戒壇堂へ(上の写真)。戒壇は僧侶に戒律を授ける場所だ。聖武天皇は国内の僧に戒を授けてもらうために唐から鑑真和上を招聘した。東大寺の他に栃木県の下野薬師寺と福岡県の観世音寺に戒壇院を設置した。
次は正倉院。正倉院も修復中は入れず。なんか覆い屋根を作っているようだったので長くかかるのかもしれない。活動限界まで時間があったので、ようやく大仏殿に。大仏殿は軒が長く、重いため組物も大がかりだ。最後は南大門を通ってるバスで近鉄奈良駅まで行き伊丹に向かってこの旅を終えた。
今回の旅は修復中で見られないものが多かったなぁ。が、元興寺を見つけることができたのでよしとするか。



