Amazonのインスタントストア作ってみた
[[]]Amazonアソシエイトにインスタントストアというのがある。
カテゴリーごとツリーを追加できて、キーワードでフィルタできるので、アフィリエイト狙いというよりも、自分用の検索条件の保存と考えると意外と便利!
単独ページ→「IIJIMASおすすめストア - プログラミング、C#プログラミング」
iframe埋め込み↓
2012年春アニメは何を見ようか…
3か月ってのは早い。4月から春期アニメが始まる。というわけで自分が見れる局(関東圏)での2012年春期(4月-7月)の一覧(公式サイト、公式ツイッターアカウント、推奨タグへのリンク、放送局、放送曜日時間)を作成した。すべてのアニメを網羅しているわけではない。誤り・抜けの発見や最新情報入手の都度随時追加・更新する。
2012年春アニメ一覧表
参考リンク
2012年冬アニメは何を見ようか…
とりあえず、自分が見れる局での2012年冬(新春、1月-3月)アニメ公式サイト等リンク・放送日時一覧を作成した。なるべく、自分が見れる局(NHK Eテレ,日本テレビ,TBS,フジテレビ,テレビ東京,TOKYO MX,tvk,テレ玉,ニコニコ)で他とかぶらなくて週の最早放送曜日となる局の順番とした。すべてのアニメを網羅しているわけではない。
2012年冬(新春)アニメ一覧表
参考リンク
- [Link]「2012年冬季(新春)放送開始の新作アニメ一覧 - GIGAZINE」
- [Link]「2012年冬 新番組アニメ発表! - ニコニコチャンネル」
C#生命体の実現を目指して
自分自身と同じソースコードをコードに作成させる
一か月ほど前、C# Advent Calendar 2011に一か月もあれば何か思いつくだろうと参加表明したのはいいものの、結局いいネタが思い浮かばずに、順番がまわってきてしまいました。。
23日担当のIIJIMASです。このエントリをC# Advent Calendar 201123日目とします。
とりあえず、苦し紛れに、思いついたネタがこれです。役に立つ知識だとか、最新の話題でなくて申し訳ございません。
人間を含む生物は、遺伝子という設計図があります。遺伝子は生物の「中」にあります。細胞にという生物個体のごく小さな一部にあります。考えてみると、とても不思議な気もします。ごく一部分に全体の設計図があるのです。マトリョーシカ人形のようなイメージでいえば、中から出てくるのは外の個体より一回り小さくなっているのが直観的な気がします。実際にはそうではないので、生命の遺伝はとても興味深い現象だと思います。
そこで「コンピュータプログラムで生命のようなものができると面白い」と考えました。
まず、自己複製を考えようと思います。ファイルコピーを使えばすぐできてしまいますが、あえてファイルコピーではなくあくまでもそのプログラムで同じコードを書き出すプログラムを作成してみました。
using System; using System.IO; namespace SelfGenarationCode { /// <summary> /// 自分自身と同じ内容のコードを出力するプログラム /// </summary> class Program { const string Code1 = @"using System; using System.IO; namespace SelfGenarationCode { /// <summary> /// 自分自身と同じ内容のコードを出力するプログラム /// </summary> class Program {"; const string Code2 = @" /// <summary> /// エントリポイント /// </summary> static void Main(string[] args) { GenerateNext(""SelfGenarationCodeProgram.cs""); } /// <summary> /// 文字列にするために文字列の""を""""に変換する /// </summary> public static string ConvertCode(string source) { string result = source.Replace(""\"""", ""\""\""""); return ""@\"""" + result + ""\""""; } /// <summary> /// 次のC#コードを出力する /// </summary> public static void GenerateNext(string fileName) { using (StreamWriter sw = new StreamWriter(fileName)) { sw.WriteLine(Code1); sw.WriteLine("" const string Code1 = {0};"", ConvertCode(Code1)); sw.WriteLine("" const string Code2 = {0};"", ConvertCode(Code2)); sw.WriteLine(Code2); } Console.WriteLine(""{0}を作成しました。"",fileName); Console.ReadKey(); } } }"; /// <summary> /// エントリポイント /// </summary> static void Main(string[] args) { GenerateNext("SelfGenarationCodeProgram.cs"); } /// <summary> /// 文字列にするために文字列の"を""に変換する /// </summary> public static string ConvertCode(string source) { string result = source.Replace("\"", "\"\""); return "@\"" + result + "\""; } /// <summary> /// 次のC#コードを出力する /// </summary> public static void GenerateNext(string fileName) { using (StreamWriter sw = new StreamWriter(fileName)) { sw.WriteLine(Code1); sw.WriteLine(" const string Code1 = {0};", ConvertCode(Code1)); sw.WriteLine(" const string Code2 = {0};", ConvertCode(Code2)); sw.WriteLine(Code2); } Console.WriteLine("{0}を作成しました。",fileName); Console.ReadKey(); } } }
実に単純なプログラムですね。リテラル文字列が遺伝子といったところでしょうか。
手動でコンパイルして出力されたexeを実行します。
csc SelfGenarationCodeProgram.cs SelfGenarationCodeProgram.exe
すると、SelfGenarationCodeProgram.csが同じ内容で上書きされます(元のファイルをリネームしておかないと上書きされます。更新日時が変わるはずです。)
確かに、元と全く同じソースコードを出力できました。dfやWinMergeで確かめてみてください。
しかし、手動でexeを作成するのが面倒です。実際の生物でも次の世代を作るのに神に手をわずらわさせたりはしないと思います。
実行ファイルもコードに作成させる
そこで、コンパイルや実行もプログラム自分自身にさせようと思います。ただし、実行中のexeファイルを上書きはできないようなので、毎回、ファイルの後ろに番号を増加させて別のファイルにします。また、「実行」を完全に自動にしてしまうと、物理リソースを食いつぶすまでの無限増殖になってしまうので、[Y]キーを押した時だけ「実行」するようにします。
SelfGenarationCode.cs
using System; using System.IO; using Microsoft.CSharp; using System.CodeDom.Compiler; using System.Diagnostics; using System.Text.RegularExpressions; namespace SelfGenarationCode { /// <summary> /// 自分自身のソースコードと実行ファイルを作成するプログラム /// </summary> class Program { const string Code1 = @"using System; using System.IO; using Microsoft.CSharp; using System.CodeDom.Compiler; using System.Diagnostics; using System.Text.RegularExpressions; namespace SelfGenarationCode { /// <summary> /// 自分自身のソースコードと実行ファイルを作成するプログラム /// </summary> class Program {"; const string Code2 = @" static void Main(string[] args) { string thisExeName = Path.GetFileNameWithoutExtension(typeof(Program).Assembly.Location); GenerateNext(IncrementFileNumber(thisExeName)); } /// <summary> /// 文字列にするために文字列の""を""""に変換する /// </summary> public static string ConvertCode(string source) { string result = source.Replace(""\"""", ""\""\""""); return ""@\"""" + result + ""\""""; } /// <summary> /// 次のC#コードと、実行ファイルを作成する /// </summary> public static void GenerateNext(string fileName) { //ソースコードを作成する(あえてファイルコピーではなく) string csFileName = fileName + "".cs""; using (StreamWriter sw = new StreamWriter(csFileName)) { sw.WriteLine(Code1); sw.WriteLine("" const string Code1 = {0};"", ConvertCode(Code1)); sw.WriteLine("" const string Code2 = {0};"", ConvertCode(Code2)); sw.WriteLine(Code2); } Console.WriteLine(""{0}を作成しました。"", csFileName); //実行ファイルを作成する string outputName = fileName + "".exe""; CSharpCodeProvider cscp = new CSharpCodeProvider(); string[] assemblyNames = { ""System.dll"" }; CompilerParameters pars = new CompilerParameters(assemblyNames, outputName); pars.GenerateExecutable = true; CompilerResults results = cscp.CompileAssemblyFromFile(pars, csFileName); if (results.Errors.Count > 0) { foreach (var error in results.Errors) { Console.WriteLine(error); } } else { Console.WriteLine(""{0}を作成しました。"", outputName); Console.WriteLine(""実行しますか?(y/n)""); ConsoleKeyInfo keyinfo = Console.ReadKey(); if (keyinfo.Key == ConsoleKey.Y) { Process.Start(outputName); } } } /// <summary> /// ファイル番号をインクリメントする /// </summary> public static string IncrementFileNumber(string src) { Match m = Regex.Match(src, @""(?<Name>[^0-9]*)(?<Num>[0-9]*)""); string fileName = m.Groups[""Name""].Value; int number; int.TryParse(m.Groups[""Num""].Value, out number); return fileName + (number + 1); } } }"; static void Main(string[] args) { string thisExeName = Path.GetFileNameWithoutExtension(typeof(Program).Assembly.Location); GenerateNext(IncrementFileNumber(thisExeName)); } /// <summary> /// 文字列にするために文字列の"を""に変換する /// </summary> public static string ConvertCode(string source) { string result = source.Replace("\"", "\"\""); return "@\"" + result + "\""; } /// <summary> /// 次のC#コードと、実行ファイルを作成する /// </summary> public static void GenerateNext(string fileName) { //ソースコードを作成する(あえてファイルコピーではなく) string csFileName = fileName + ".cs"; using (StreamWriter sw = new StreamWriter(csFileName)) { sw.WriteLine(Code1); sw.WriteLine(" const string Code1 = {0};", ConvertCode(Code1)); sw.WriteLine(" const string Code2 = {0};", ConvertCode(Code2)); sw.WriteLine(Code2); } Console.WriteLine("{0}を作成しました。", csFileName); //実行ファイルを作成する string outputName = fileName + ".exe"; CSharpCodeProvider cscp = new CSharpCodeProvider(); string[] assemblyNames = { "System.dll" }; CompilerParameters pars = new CompilerParameters(assemblyNames, outputName); pars.GenerateExecutable = true; CompilerResults results = cscp.CompileAssemblyFromFile(pars, csFileName); if (results.Errors.Count > 0) { foreach (var error in results.Errors) { Console.WriteLine(error); } } else { Console.WriteLine("{0}を作成しました。", outputName); Console.WriteLine("実行しますか?(y/n)"); ConsoleKeyInfo keyinfo = Console.ReadKey(); if (keyinfo.Key == ConsoleKey.Y) { Process.Start(outputName); } } } /// <summary> /// ファイル番号をインクリメントする /// </summary> public static string IncrementFileNumber(string src) { Match m = Regex.Match(src, @"(?<Name>[^0-9]*)(?<Num>[0-9]*)"); string fileName = m.Groups["Name"].Value; int number; int.TryParse(m.Groups["Num"].Value, out number); return fileName + (number + 1); } } }
[Y]キーを押し続けると、延々と同じソースを持つファイルを生成し続けます。
なにか有用な応用はないものでしょうか?
内容が全く同じコードなのでこれでは進化しません。実際の生命は完全なコピーではなく、ランダムにごく一部が間違って次世代にコピーされ、環境にたまたま適応できた個体が生き残り次世代を生成できます。いわゆる淘汰です。これを実装する方法はまだ考えていませんので、今回のエントリはこれにて終わりです。大胆なタイトルをつけてしまいましたが、C#生命体の実現への道のりはまだまだ遠そうです。。
実は、以前の自分のわんくまブログエントリ「自分自身を出力するプログラム。」が元ネタです。元ネタではJavaScriptコードで記述しています。
ここで宣伝するのも恐縮なのですが2011年12月3日に「C# ポケットリファレンス 」WINGSプロジェクト著、技術評論社 が発売されました。 私は第7章を担当しました。
ご興味がある方は、ぜひオフィス・チームに一冊購入してみてください。もちろん一冊以上でも! |
宣伝といえば、C# Advent Calendar 2011の21日目ご担当のsuerさんのエントリ「Visual Studio で作成したセットアッププロジェクトで CI するためのコマンド」でご紹介いただいていたのでこれも…昨年の7月に発売された本ですが・・・ 「はじめてのVisual Studio 2010 (TECHNICAL MASTER 62)」techbank.jp著、秀和システム 私は第11章を担当しました。 この章、内容が内容だけにあまり読者いないだろうななどと思っていたのですが、21日目のsuerさんにお読みいただいていることがわかりうれしいかぎりです。suerさんありがとうございます。 |
2011年秋アニメは何を見ようか…
今年に入ってから急に放送している(深夜)アニメを見るようになった。早いものでもう、今年、最終の4クール目のアニメが10月頃からスタートする。うちは同時録画は1チャンネルしかできない。今季もニコニコチャンネルで最新話1週間無料配信されるものもあるが、なるべく早く見たいので、うちから見ることができるチャンネル(関東キー局すなわち日本テレビ、TBS、フジテレビ、テレ東と、TOKYO MX、TVK、テレ玉)での放送時間を可能な範囲で調べた。各アニメの放送局と時間の情報が載っている原作についてのウィキペディアページで調べた(同じページの原作内容ネタバレ注意)。ニコ動の方が放送早いのもあるし、早い放送が重なってしまう部分はどちらかを遅い放送にずらしたので最も早いとは限らない。よってあくまでも個人的なもの。私はアイマスの裏のギルティクラウンは見れなさそう…リアルタイムと録画という手もあるが…。
放送曜日 | タイトル | アニメ公式HP | 公式Twitter | 関連ウィキペディア | 放送局 | 放送開始日 | 放送時間(通常時) | 備考 | |
---|---|---|---|---|---|---|---|---|---|
土 | WORKING'!!(WORKING!!第2期) | HP | T | W | TOKYO MX | 10/01 | 23時30分 - 24時00分 | ||
土 | Fate/Zero | HP | ? | W | TOKYO MX | 10/01 | 24時00分 - 24時30分 | ||
土 | 化物語(再放送) | HP | ? | W | TOKYO MX | 10/08 | 24時30分 - 25時00分 | ||
土 | C3 | HP | T | W | TOKYO MX | 10/01 | 25時00分 - 25時30分 | TVK土曜24時30分の方が早い。 | |
土 | 灼眼のシャナⅢ-FINAL-(灼眼のシャナ第3期) | HP | T | W | TVK | 10/08 | 25時30分 - 26時00分 | TOKYO MX金曜25時30分の方が早い。 | |
日 | 未来日記 | HP | T | W | テレ玉 | 10/09 | 25時05分 - 25時35分 | ニコニコ動画日曜23時00分の方が早い。 | |
日 | ベン・トー | HP | T | W | TVK | 10/09 | 25時30分 - 26時00分 | ||
日 | 境界線上のホライゾン | HP | T | W | TVK | 10/02 | 26時00分 - 26時30分 | ||
月 | 君と僕。 | HP | T | W | テレビ東京 | 10/03 | 25時30分 - 26時00分 | ||
月 | 侵略!?イカ娘(侵略!イカ娘第2期) | HP | T | W | テレビ東京 | 09/26 | 26時00分 - 26時30分 | ||
月 | 真剣で私に恋しなさい! | HP | ? | W | TOKYO MX | 10/03 | 26時30分 - 27時00分 | TVK土曜25時00分の方が早い。 | |
火 | ちはやふる | HP | T | W | 日本テレビ | 10/04 | 24時59分 - 25時29分 | ||
火 | ましろ色シンフォニー | HP | T | W | テレ玉 | 10/04 | 26時05分 - 26時35分 | ||
水 | マケン姫っ! | HP | ? | W | tvk | 10/05 | 25時45分 - 26時15分 | テレ玉火曜 25時05分の方が早い。 | |
木 | UN-GO | HP | T | W | フジテレビ | 10/13 | 24時45分 - 25時15分 | ||
木 | ギルティクラウン | HP | T | W | フジテレビ | 10/13 | 25時15分 - 25時45分 | ||
木 | アイドルマスター | HP | T | W | TBSテレビ | 放送中 | 25時25分 - 25時55分 | ||
木 | 僕は友達が少ない | HP | T | W | TBSテレビ | 10/06 | 25時55分 - 26時25分 | ||
金 | たまゆら | HP | T | W | TOKYO MX | 10/07 | 23時00分 - 23時30分 | TVK火曜 25時45分の方が早い。 | |
金 | ペルソナ4 | HP | T | W | TBSテレビ | 10/07 | 25時55分 - 26時25分 | ||
金 | 輪るピングドラム | HP | T | W | TBSテレビ | 放送中 | 26時25分 - 26時55分 | ||
金 | ラストエグザイル-銀翼のファム- | HP | T | W | TBSテレビ | 10/14 | 26時55分 - 27時25分 |
参考リンク:
[Link]「2011年秋季放送開始の新作アニメ一覧 - GIGAZINE」
[ニコ動]「2011年 秋アニメ紹介 ‐ ニコニコ動画(原宿)」
ニコニコで最新話1週間無料配信される2011年秋季テレビアニメ:「侵略!?イカ娘」「君と僕。」「C3 シーキューブ」「灼眼のシャナⅢ-FINAL-」「Fate/Zero」「ペルソナ4」「ベン・トー」「真剣で私に恋しなさい!!」「ましろ色シンフォニー」「未来日記」「WORKING´!!(第2期)」「gdgd妖精s」
地球上には必ず、地球の中心に対して反対側の場所と同じ温度でかつ同じ気圧の場所の対がある。
4月3日は、数学者スタニスワフ・ウラムの誕生日でした。
「Stanislaw Ulam - Wikipedia, the free encyclopedia」
ウラムはこんにちボルスク・ウラムの定理呼ばれる定理を予想しました。ボルスクが証明しました。
定理の n = 2 の特別な場合で日常的表現として
地球上には必ず、地球の中心に対して反対側の場所と同じ温度でかつ同じ気圧の場所の対がある。
というのがあります。これは直観ではなかなかわかりづらいですね。しかし、数学の面白さがわかる事実だと思います。
n = 1 の場合
円周の点に対して実数を対応させる連続関数 は、像が同じ値になる対蹠点の対を持っている。
ということになり、これはグラフを書いてみれば簡単にわかります。
円周を単位円すると、円周上の点はで表され、連続関数 による値はの連続関数 とみなせる。
連続関数 のグラフを横軸:、縦軸:として描く。
が円周の上の関数だから、 の定義域はとみなせる。特に、
関数を考える。この関数のグラフはの部分を右にだけ平行移動したものとなる。
また、だから、の対蹠点。
のグラフはから、への連続曲線であり、もとののグラフはからへの連続曲線。よって、これらのグラフはどこかで交わる。つまり、あるがあって、となる。
このとき、は、の対蹠点。
もとの連続関数 がこの点の対の上で、同じ値をとることがわかる。
n=1の場合は成り立つことがわかりました。これだけでもなかなか面白いですね。