とりあえず Ubuntu での C# をまとめてみた。
Ubuntu で C# – L’Isola di Niente
-pkg 指定で pkg-config 展開ができるはずなんだが方法が見つからない。
MonoDevelop 使えで済ませようか、とも思うけどインストールするかどうかも迷っている。
というか見ての通りコッソリと Python を勧めているわけでw
とりあえずこんな感じで覚書ページを小分けで移植していこうと思う。
とりあえず Ubuntu での C# をまとめてみた。
Ubuntu で C# – L’Isola di Niente
-pkg 指定で pkg-config 展開ができるはずなんだが方法が見つからない。
MonoDevelop 使えで済ませようか、とも思うけどインストールするかどうかも迷っている。
というか見ての通りコッソリと Python を勧めているわけでw
とりあえずこんな感じで覚書ページを小分けで移植していこうと思う。
AMD 880G マザーボードを買ってきた、これに Ubuntu 10.10 を入れる。
AMD 690G と Athron64 x2 2.2GHz にそろそろ限界を感じてきたので。
コイツの内蔵グラフィックで fglrx は大丈夫なのかな?
ついでに Phenom II X4 955 と DDR3 4G メモリ。
今まで Duron とかしか買わなかった私なのに 4 コア CPU とはなんてリッチ。
全部で二万円ちょっとだったけど、安くなったもんだ。
三年前のドスパラマシンの中身を全とっかえ、自分で組むのも三年ぶり。
LED 配線のプラスマイナスを間違えた以外は問題なく終了。
余っている HDD に Ubuntu をインストール、これも問題無しで再起動。
流石は CPU パワーが 1.5 倍かつ 4 コア、体感速度も超早くなった。
fglrx は普通に有効になった、標準ドライバもよくできているけど一応。
とにかくコレで動画の CPU 負荷は減るはず。
標準ドライバの時と違ってスクリーンショットのラインが解りにくい…
後はいつものように旧 HDD をスレーブ接続してデータコピー。
Gedit プラグインや Nautilus スクリプト、Opera の設定はコピーだけで使える。
ところで Ubuntu 関連を探すとディレクトリ名変更に変なことしている人が多いけど
コレを off にして F2 キーで普通に変名するだけなんだが…
~.config/user-dirs.dirs も連動して書き換えしてくれるし。
後は必要なアプリを日本語セットアップヘルパと追加と削除から。
Opera を追加と削除にデフォルトで入れてくれないかなぁ…
Opera
Y901x
Gimp
VirtualBox ose
Sylpheed
Ghex
KeepassX
Apache2
PHP
Gjot2
Gnote
再構築完了まで四時間、旧 HDD はそのまんまバックアップになるので一石二鳥。
問題はコピーした VirtualBox 仮想マシンな Vista はアクチが通るかだ。
Vista を買った時に使っていた DVD-R は同じなのでライセンスは間違っていないが。
問題なかった、数値はあまり変わらないけど明らかに快適さが違う。
CPU を 2 に割り当てしたけどタスクマネージャは一つ、何故だろう。
ついでに起動時のサウンドが歪んでいたのも良くなった。
ま、仮想マシン上での Visual Studio が重すぎるのでパワーアップしたんだが。
それと Y901x とかの動画ファイル切り替えで落ちなくなると嬉しいんだが様子見。
やはり Linux もなるべく新しいハードで使わなければ快適にはならないや。
とにかく AMD 880G + SB710 なら Ubuntu 10.10 は問題無いみたい。
よし動画を見まくるぞ!
いや、サイト整理は地味にやっているけどちっとも進まないんで…
System.IO.File.ReadLines は .NET 3.5 や mono で使えない。
だったら自分で作ってしまえ、と思ったのでやってみた。
どうでもいいけど gmcs も csc.exe と同じオプションが使えるんだね。
/out:FILENAME は -out:FILENAME みたくハイフンにするだけ。
いや、yield を使ったことが無いのでやってみようかと。
こんな強引というよりアホなメソッド追加なんてできるのかな?
using System;
using System.Collections.Generic; //IEnumerable
namespace System.IO
{
public static partial class File
{
public static IEnumerable ReadLines(string path)
{
using(var sr = new System.IO.StreamReader(path))
{
string buf;
while ((buf = sr.ReadLine()) != null)
{
yield return buf;
}
}
}
}
}
File クラス (System.IO)
File クラスは partial class では無いみたいだけど。
コンフリクトか、やっぱりダメだった。
Windows でもやってみたけど同じ、こんなことをやろうと考えるほうがおかしい。
しかたがない、名前空間には追加できるはずだから違うクラス名にしてみる。
fakeio.cs
using System;
using System.Collections.Generic; //IEnumerable
namespace System.IO
{
public static class FakeFile
{
public static IEnumerable ReadLines(string path)
{
using(var sr = new System.IO.StreamReader(path))
{
string buf;
while ((buf = sr.ReadLine()) != null)
{
yield return buf;
}
}
}
}
}
readlines.cs
using System;
using System.IO;
class __main__
{
[STAThread]
public static void Main(string[] args)
{
if (args.Length == 0)
{
Console.WriteLine("no arg...");
return;
}
int n = 0;
foreach (var line in FakeFile.ReadLines(args[0]))
{
n++;
Console.WriteLine("{0}: {1}", n.ToString("000"), line);
}
}
}
で、cat.exe という実行ファイルを作るコマンド。
gmcs -out:cat.exe *.cs
何故か exe という拡張子を付けないとエラーになる。
Linux でも強制するんかい、まぁ解りやすいと思えばいいし。
アスタリスクでディレクトリ内をまるごとコンパイルしてくれるのはありがたい。
なるほど、yield はこういう時に使うと確かに便利だ。
C#4.0 の ReadLines って上記を自作する以上のメリットがあるのかな?
何を今頃なのだが C# 4.0 を調べてみた。
なんと 4.0 では関数にデフォルト引数を指定できるようになっていた。
てか、今まで無かったのかよ…
Default argument
で可能とかウソを書いてしまった、はずかしい。
引数に数の差だけのためにオーバーロードをする必要はコレで無くなるわけだ。
それと、System.IO.File.ReadLines() というイテレーション関数も追加らしい。
StreamReader.ReadLine() じゃダメなの?と思うんだが…
他は興味がわかないので今回はパス。
ということで 3.5 と 4.0 の csc.exe で試しコードを書く。
default_param.cs
using System;
class Test
{
public static int Func(int x=5, int y=7)
{
return x+y;
}
}
class __main__
{
[STAThread]
public static void Main(string[] args)
{
int n = Test.Func(y:20);
Console.WriteLine(n);
}
}
readlines.cs
using System;
using System.IO;
class __main__
{
[STAThread]
public static void Main(string[] args)
{
int n = 0;
//foreach (var line in File.ReadAllLines(args[0]))
foreach (var line in File.ReadLines(args[0]))
{
n++;
Console.WriteLine("{0}: {1}", n.ToString("000"), line);
}
}
}
ちなみに私がパスを通しているのは 3.5 のみなのでこうなる。
うん、やっぱりどちらも 4.0 でしかビルドできないや。
これだけではツマラナイので Ubuntu でもやってみる。
あれ?デフォルト引数のほうだけ問題なくビルドできちゃった。
どっちなんだよ Ubuntu に最初から入っている mono は。
Readlines は「そんなメソッドありません」ですね、そりゃそうだ。
ReadAlllines とコメントアウトを変更すれば普通にビルドできた。
StreamReader で while ループしたほうが圧倒的効率だけどテストです。
つまり何が言いたいかというと。
コンパイルするのがメンドイけど実用無視で遊ぶなら C# は最強。
Linux で Python は単なる実用ツールでしかないもの、私はだが。
結局 Windows に戻ったのは正月だけだった、あぁ Linux は快適。
Linux で不便なのは Opera 11 の検索バーで日本語変換を行うと死ぬことだけだ。
フォントは pre と monospace を VL ゴシックに変更しただけで綺麗になった。
一昔前では考えられないほどマトモ、新参の WebKit 軍団にボロ負けだったしね。
しかしデフォルトショートカットキーをコロコロ変更しないでよ。
ネットをウロウロしていると自作漫画配布サイトに。
最近は Blog 機能を利用しているせいか連番で落とせないトコばかり。
だったけど連番で一枚一枚配布している所もまだ存在するんだね。
これは久々に新規スクリプトを書かないと。
何のために wget コマンドが存在するというのか。
wget だけでリンクをたどるのではなく連番ファイル以外はいらないし。
連番最初は 0 か 1 だし確実に 100 ファイル以下だと決め付けでいいだろう。
パラメータ 2 つ指定を強制するけど自分で使うんだから問題無い。
一応ゼロ詰めしているかどうかで振り分けしている。
#!/usr/bin/env python
#-*- coding:utf-8 -*-
"""
連番ファイルの一括ダウンロード
コマンド
$ download url num
url 連番最初のファイルのフルパス
num 最後のファイル番号の整数
"""
import sys
import os
if len(sys.argv) < 3:
print "URL と 数を指定してください"
else:
# ファイル名分離
pathname, filename = os.path.split(sys.argv[1])
try:
n = filename.rindex(".")
except ValueError:
print "拡張子が見つかりません"
sys.exit()
# 連番最初の数値(0 or 1) と拡張子
begin = int(filename[n-1])
ext = filename[n:]
# ゼロ詰めかどうかで振り分け
if filename[n-2] == "0":
name = "wget " + pathname + "/" + filename[:n-2] + "%02d" + ext
else:
name = "wget " + pathname + "/" + filename[:n-1] + "%d" + ext
# 連番数のチェック
try:
end = int(sys.argv[2]) + 1
except ValueError:
print "二番目の引数は整数でお願いします"
sys.exit()
# 開始
for i in range(begin, end):
os.system(name % i)
#print name % i
~/bin に download という名前で置いて chmod で +x して。
覚書ページに書いているけど ~/bin を作れば Ubuntu は勝手にパスが通る。

使ってみる、よしよし動く。
端末を普通に使うようになると「コレで十分」になって退化する私であった。
てゆーか、アッサリこんなのを作って使えるから Linux のほうが楽なんだよね。
実は Python での文字列のスライス方法を忘れていたので何か作ろうと…
こんなしょーもないスクリプトあたりをたまには作らないと忘れるねん。
関係無いけどこんなのを見つけた。
[ Dolphinで右クリックメニューを使う方法 Dolphin用Script] by ひねもすLinux
Dolphin でもスクリプト拡張ができるんだ、知らなかった。
しかし面倒くさいな、Nautilus がこうならないことを祈る。