月別アーカイブ: 2009年4月

Ubuntu 9.04 そのいち

さて Ubuntu 9.04 をインストールいたしました。

まず Vista からデータの引越し、は一ヶ月しか使っていないので簡単。
Ubuntu の HDD に戻し細々したものをバックアップ、よしやるぞ。

普通に CD を焼いて 8.10 を入れてあった HDD に上書きしようと思ったら

install1

あらら、以前のバージョンとデュアルブート可能なんですね。
よく考えたら Windows とデュアルブートできるんだから当然かも。
でも旧バージョンは VirtualBox で使う予定なので上書きで行った。

完了したところで再起動。
うわ!本当に OS の機動が早い、噂は本当だった。

外観の設置に Dust Sand とかいうのが追加されている。
こんな感じ、どこかに似たような OS がありますね。

macimg

又 gEdit は上記画像のようにステータスバーからタブ幅が変更可能になった。
gEdit の変更はそれくらいか、微妙、ルーラーは付かないのかな?
あれ?スニペットが $0 指定位置にいかないんだけど…バグ?

ところで私のグラフィックカードは AMD 690G チップセット内臓品。
9.04 は ATI ドライバーを導入せずとも初回からエフェクトが可能になっている。
動画を少し再生してみましたがアクセラレーションも効いているようです。
只この状態だと Alt+PrtSc でタイトルバーが含まれないんだよなぁ…どうしよう。

sylpheed,flashplugin,lha-sjis を日本語セットアップヘルパから導入。
追加と削除にはやはり Opera が無いので公式から導入、8.10 用でイケた。
FTP や SSH は Nautirus でいいや。

そういえば Nautirus の D&D 移動は色が付いて解りやすくなっている。
あの妙に大きかったタスクバーのサイズが Windows XP と同じくらいなサイズに。
おぉ、キーボード設定のリピートキー間隔設定がキチンと摘要されるようになった。
地味に使いやすく進化しているね。

VirtualBox は何故か追加と削除に2つある。
とりあえずいままでどうりに ose 版を導入しておこう。

vboxgtk

Python は 2.6.2
Mono は 2.0.1
Perl は 5.10.0
Ruby は相変わらず無し

PyGtk は 2.14.1 になっている、少し嬉しい。
とにかく Python 関連は OS が依存しているからヘタに変更できないのよね。

MonoDevelop は追加と削除から 2.0 が導入できるようになった。
これについては後日、デバッガ内臓になったらしいから少し期待。
Linux もすっかり .NET になっていっているなぁと…
IronPython は端末からインストールできます。
でも 1.1.1 だ…2.0 は Linq やその他が無いとやらで動かなかったわ。

desktop

Y901x や SeeMe for Linux は問題なく動く、よしよし。
わざわざ 9.04 をクリーンインストールする理由は自アプリチェックだもの。

Ubuntu 8.04 での LANPP 環境構築

コレもまだまだこのままでよさそうだ。
他細かいコトは次回に続く。

アルファベットが文字化け

前回の Python 3 で decode メソッドが上手くいかない件。
そういえばと思い ignore オプションを付けて無理矢理出力してみる。

ffb

アルファベットなのに化けるって…つーか ffb って何よ。
どうやら文字コードは全然関係無なさそうだなこりゃ。

まさか decode バッファをココで使い果たしたとか…
3.0 はまだ不安定?色々試しているけど今の私ではお手上げだ。
てかあんまりコッチに手間を掛けたくないし。

とにかく何を行うのも ctypes 利用になったり別途モジュールが必要になる。
つまらん、IronPython のほうが Windows では圧倒的に面白い。
遅いけど…

ということで Ubuntu 9.04 日本語 Remix が公開されています。

Home | Ubuntu Japanese Team

いまダウンロード中、インストールは明日。
違いを確かめたいのでクリーンインストールする。
別個 HDD を買っても余るから 8.10 に上書きする予定。

あぁさらば安定した Windows 用 Opera よ…

読めない UTF-8

IronPython URLs: WPF on IronPython: Windows and Dispatching

日本語は読めないようなのによくココなんて見つけたもんだ。
というか英語ページにこういうのは無いのだろうか?

まあ WPF=3D みたいな雰囲気ができあがってしまったし。

PyGtk のようにもっと普通に GUI 部品として使う発想があってもいいのに。
せっかく元々が .NET な IronPython なんだから抵抗も少ないのだし。
でも逆に Linux にて PyGtk を経験していないと思いつきもしないのかも。

Emerge Technology: Pythonで隠しファイルかどうかってどうやって確認するだっけ?

うっ!そういえばできない。
普通に win32file を import とか書いてあって少し心配なんだが。
下記モジュールを導入しないと存在しないんですけど。

SourceForge.net: Python for Windows extensions

PLATLIB\win32\lib\win32con.py で定数はほとんど定義済みなのが嬉しい。
しかし外部依存ファイルに頼るとアプリの配布はどうすんの?になるんだが。

それよりWindowsAPI を使うなら VC++ で作ったほうがケタ違いに楽なんだが。
API 関数も定義済みヘッダが揃っている、配布もランタイムのリンクをすれば一つですむ。
スクリプト言語のほうが生産効率が悪いなんてギャグにもならない。

やっぱり Windows で Python ってイマイチだ。
もうすぐ Ubuntu 9.04 が出るから Linux へ戻るとするか。

その前に

decode

少し前の行でも同じエラーになったんだが…
もちろん UTF-8 だ、適当なサイトで試したらなんともなかった。

まさかと思い秀丸でまったく同じ文字列をトレースしたら直った。
何故?Linux と Windows では吐く UTF-8 が違うのだろうか。

んでこの行は同じようにやっても直らない、もうわけがわからん。

UNICODE の解釈がおかしいみたいな。
中国語として扱われているとかするんかなぁ?
Opera はチョン語だったとか色々あるし…
単に私の理解不足だろうと思うけど解らないや。

C# でぱい

前回のコードを C# で書いてみようと何故か思った。

書いていて気がついたのだが C# は百桁程度の整数も扱えない。
そういえば C++ も扱えない、今まで int64 までしか使ったこともない。

あぁ GMP ってそのことだったんだ。
Python や Ruby の整数は桁数が無限なので気がつかなかった。
てゆーか無限に扱える意味ってようするに数学の世界だと。

多倍長整数っていうんだね。
ググると BigInteger というのが見つかった。

CodeProject: C# BigInteger Class. Free source code and programming help

まあよく解らないものは使って覚えるのが一番早い。
クラスなので普通に new したあとは整数のように扱えるはず。
落としてプロジェクトに含めてみる。

いきなり困った、べき乗 Math.Pow() は double しか扱えない。

いや、考えてみたら計算は Math でやらなきゃいけないわけではない。
自分で for ループさせても何も問題無い、ここまではすぐに思いついた。
でもそれをどう計算…つまらないことに詰まってしまったり。

なんとか百桁に成功したところで一万桁とかにすると例外スロー。

private const int maxLength = 70;

この数値が関係あるらしい、大きな桁にするときは増やして使う。
まあとりあえずそんなこんなで書いてみたコード。

using System;
using System.Diagnostics;

namespace pi1
{
    class Test
    {
        // System.Numeric.BigInteger はまだない
        BigInteger p, q;

        BigInteger expansion(int n)
        {
            BigInteger x, nn, c, s, k;
            x = new BigInteger(0);
            nn = new BigInteger(0);
            c = new BigInteger(0);
            s = new BigInteger(0);
            k = new BigInteger(0);
            x = (p * q) / n;
            nn = n * n;
            c = 1;
            s = x;
            k = 1;
            while (x > 0)
            {
                x = x / nn;
                k = k + 2;
                c = -c;
                s = s + c * (x / k);
            }
            return s;
        }

        public void pie()
        {
            Console.WriteLine("円周率を計算します。");
            Console.WriteLine("桁数を指定してください");
            int prsn = int.Parse(Console.ReadLine());
            p = new BigInteger(1);
            q = new BigInteger(1);

            Stopwatch sw = new Stopwatch();
            sw.Start();
            for (int i = 1; i <= prsn; i++)
                p *= 10;
            for (int i = 1; i <= 10; i++)
                q *= 10;

            BigInteger y, u, v;
            y = new BigInteger(0);
            u = new BigInteger(0);
            v = new BigInteger(0);
            y = 4 * ( 12 * expansion(18) + 8 * expansion(57) - 5 * expansion(239) );
            y = y / q;
            u = y / p;
            v = y - u * p;
            sw.Stop();
            
            Console.WriteLine("{0}.{1}", u, v);
            Console.WriteLine("計算時間={0}", sw.ElapsedMilliseconds / 1000.0);
            Console.Read();
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            Test t = new Test();
            t.pie();
        }
    }
}

初期化の引数は BigInteger でもいいはずだけど怖いので int に。
あまり意味は無い。

cs_pi

IronPython より十倍速いわな、BigInteger が早いのだろうか。
それよりやはり .NET もコンパイルしたほうが早いということだろうけど。

とはいえ CPython にはボロ負けのまま…
せめてマルチスレッド化したほうが…意味があるかは置いておいて。
実用アプリじゃ全く問題無いことだし。

FFTとAGMによる円周率計算プログラム

C 言語は面倒くさいので上記のとかを試す。
百万桁でたったの 39 秒だもの、この差をどうこうしようとか思わないわ。

手元に IronPython 1.1 が残っていたので前回のコードを試す。
0.098 秒…あれ?二倍も速くなった、DLR ってもしかして絶望的に遅い?

ぱい

super pi を作ろう – ぴょぴょぴょ? – Linuxとかプログラミングの覚え書き –

というのを見つけた。
正直よく解らないけど(だから素人のままなんだ…)
super pi みたいなのを自作するのは面白そう、もっと勉強せねば。

とにかく Python でπの無限出力はどうすればいいのだろう?
スクリプト言語はこの手の計算は不得意だと解っているけどやってみたい。

math.pi では小数点以下 16 桁までしか出力してくれないし。

B. 浮動小数点演算、その問題と制限

ということで Web を探す。
とにかく例の一つでもないと私のような素人はさっぱり解らない。

情報処理 II, 第6回

簡単に見つかった…
早速 circleratio.py というのを落として実験。
エンコードが何故に latin-1 ? utf-8 に変更しておこう。

print はきちんと括弧でくくったのに例外出まくリング…

そういえば Python 3 って他にも沢山変わっていたんだっけか。

特集:もっと知りたいPython3000|gihyo.jp … 技術評論社

input() は eval(input()) にしないと文字列になるので書き換えて。
/ は // にしないと float になっちゃうので書き換えて。

#!/bin/env python
#-*- coding: utf-8 -*-
# 2007.4.9
#
# ガウスの公式による円周率の計算

from math import *  # 数学関数を使うためのまじない
from time import *  # 時間関数を使うためのまじない
from sys import *   # システム関数を使うためのまじない

# arctan(1/n) の小数展開
def expansion(n):
    x = ( p * q ) // n
    nn = n * n
    c = 1
    s = x
    k = 1
    while x > 0:
        x = x // nn
        k = k + 2
        c = - c
        s = s + c * ( x // k )
    return s

print ('円周率を計算します。')
print ('桁数を指定してください。')
prsn = eval(input())

t0 = time()     # 開始時刻
p = 10**prsn
q = 10**10

y = 4 * ( 12 * expansion(18) + 8 * expansion(57) - 5 * expansion(239) )
y = y // q
u = y // p
v = y - u * p
t1 = time()     # 終了時刻

print ("%d.%d" % (u,v))
print ('計算時間 =', t1 - t0)
fin = stdin.readline()  # Enter キーで終了

メンドクセ!
40 行のコードでコレでは大きなプログラムはマジ大変だろうなぁ。

そういえば math,time,sys は IronPython にも組み込まれているはずだよなぁ。
やってみたら一行目を消さなきゃエンコードを認識しないかやはり。
Linux の IronPython は何故か imput() ができなのでパス。

pi

IronPython 遅っ!
コンマ付きの print もおかしいし、やはり普通の Python 代わりは無理だわ。

しかし実行中は見事にデュアルコア CPU の 50 %利用ってのが笑えるよ。
ちなみに AMD Athlon64 X2 4200+ と AMD 690G というショボい構成のまま。

picpu

十万桁に 89 秒も掛かった、百万桁なんて恐ろしくて出来ん。
つか、こういうのはやはり C 言語でやるべきだよと。