Enumerable.Range(1, 100).Select<int, string>(i => (i % 15 == 0 ? “FizzBuzz” : (i % 3 == 0 ? “Fizz” : (i % 5 == 0 ? “Buzz” : i.ToString())))).ToList<string>().ForEach(s => { Console.WriteLine(s); });
反省している。
Enumerable.Range(1, 100).Select<int, string>(i => (i % 15 == 0 ? “FizzBuzz” : (i % 3 == 0 ? “Fizz” : (i % 5 == 0 ? “Buzz” : i.ToString())))).ToList<string>().ForEach(s => { Console.WriteLine(s); });
反省している。
http://www.voidspace.org.uk/ironpython/ip_in_ip.shtml (英語)
英語は読めないからソースだけ読んで参考にしました。
【参照設定】
IronPython2.0のディレクトリより
IronPython.dll
Microsoft.Scripting.Core.dll
Microsoft.Scripting.dll
【Form1.cs】
using System;
using System.Windows.Forms;
using IronPython.Hosting;
using Microsoft.Scripting.Hosting;
public partial class Form1 :Form {
public Form1() {
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e) {
ScriptEngine engine = Python.CreateEngine();
ScriptSource source =
engine.CreateScriptSourceFromFile(“./test.py”);
ScriptScope scope = engine.CreateScope();
//IronPythonにformという変数名でthisを渡す。
scope.SetVariable(“form”, this);
//ここで実行
source.Execute(scope);
//IronPythonのtestVarという変数のオブジェクトを取得する。
object value = scope.GetVariable(“testVar”);
this.button1.Text = (string)value;
}
}
【test.py】
form.Text = “Hello,World!”
testVar = “test”
こんな感じで、IronPython側にオブジェクトを渡してIronPython側で操作したり、IronPython側のオブジェクトをC#側で取得することが出来ました。
IronPythonとのオブジェクトのやり取りはScriptScopeオブジェクトを通して行うんですね。
これだけでもかなり面白いです。IronPython1.0からはかなり勝手が変わったようです。
C#でクリップボードの履歴を収集、参照するアプリを作っているんだけど、迷ってます。終了時に収集した履歴をファイルに保存して、起動時に読み込みたいんだけど、その保存形式をどうしようかと。
テキストデータしか収集しない仕様だから保存もプレーンなテキストでやりたいんだけど、区切り文字をどうしようかと悩んでる。クリップボードに格納出来ない文字とかがあればそれに決まりなんだけどなぁ…。
これを書いてるたった今、HTMLエンコードして区切り文字を2chのDATっぽく”><”にするってのを思い付いたんだけど、それもどうかなとも思う…。出来れば保存したファイルをテキストエディタで開いて理解出来る形にしたい。
結局BinaryFormatterで履歴の読み書きを実装しました。しかし、妥協はしたけど納得はしてないので引き続きよい案募集。
機能的にはこれで完成、ClipBoardWatcher(ネーミングセンス皆無w)。
DeskTopMemoに次いで手放せないツールになりそう。
今までこっそりと更新してきましたが(mixiとかTwitterには書いてたけど)、大分コード量が増えてきたので告知します。
サイドバーのコンテンツにリンクがあります。
よくあるTips集ではなく、コピペしてそのまま使って貰おうという趣旨のオンラインクラスライブラリのようなものです。なのでコードの解説等は殆どありません。コピペで使えるから、中身が分からなくても使い方だけ判ればいいのです。
あれ、これって前にも書いたよな…ってコードをPCの中から探してくるのが面倒になってきたってのがこれを書き始めた動機です。
バグ報告、リクエスト、感想、お小遣い等お待ちしてます。
調べていたらなかなか難しそうで悶絶してました。そこで見付けたのがこれ。
http://cspace.s2.xrea.com/software/SimpleCommand/index.php#1000000042
ここのコンテキストメニューってツールです。
これをProcess.Start()メソッドで起動するだけで右クリックメニューを表示出来ます。
これは良いものです。
C/Migemoをダウンロードしたら、toolsフォルダにMigemo.csというラッパーがあります。
GetRegexメソッドを叩けばRegexクラスのオブジェクトが返ります。
こんなもの作ってました。
コード保管庫の更新でいずれこういうのが必要になるんじゃないかと思って書いてみた。sysすらimportしない生粋のIronPython、全部.NETで書いてます。あーIronPython可愛いよIronPython可愛い。
import clr
clr.AddReference("System")
clr.AddReference("System.XML")
from System import *
from System.Console import *
from System.IO import *
from System.Environment import *
from System.Xml import *
def update(file):
WriteLine(file)
nameSpace = "http://www.w3.org/1999/xhtml"
xmlDoc = XmlDocument()
xmlDoc.Load(file)
xnm = XmlNamespaceManager(xmlDoc.NameTable)
xnm.AddNamespace("ns", nameSpace)
for node in xmlDoc.SelectNodes("//ns:html/ns:body/ns:p/ns:code", xnm):
at = xmlDoc.CreateAttribute("class")
at.Value = "code"
node.Attributes.Append(at)
xmlDoc.Save(file)
dir = GetCommandLineArgs()[2]
for file in Directory.GetFiles(dir, "*.html", SearchOption.TopDirectoryOnly):
if (Int32.TryParse(Path.GetFileNameWithoutExtension(file)) and
Path.GetFileNameWithoutExtension(file).Length == 5):
update(file)
XPATHで要素拾って属性付けるだけのコード。Int32.TryParseがうまく呼べないんだよなぁ。C#のout相当のことをPythonでやる方法がわからない。だから引数省いたら実行出来た。でも、パース出来ない値でもTrue返してるみたいだ。意味が無い。
dir = GetCommandLineArgs()[2]
って行なんだけど、System.Environment.GetCommandLineArgs()が返すのは頭から
0:ipy
1:自身のスクリプトのパス
2:スクリプトに渡した引数
になるみたい。sys.argvと違うから注意。