コグノスケ


link 未来から過去へ表示(*)  link 過去から未来へ表示

link もっと前
2014年9月8日 >>> 2014年8月26日
link もっと後

2014年9月8日

いきなりバージョンが飛ぶと焦る

SeaMonkeyがいきなり2.26から2.29にバージョンアップしたので、長らくアップデートを忘れていたのか?とちょっと焦った…。

都市伝説

ツルゲーネフ「片恋」二葉亭四迷 訳の「死んでも可いわ…」について。

その一節はあるけれど、I love youの訳語ではないので、都市伝説というか、誤解かな。

リンク先(FLAMA技術Blog - 二葉亭四迷は「I love you.」を「死んでもいいわ」と訳していない。)は原著にまで当たっていて大変参考になりました。

メモ: 技術系の話はFacebookから転記しておくことにした。

編集者:すずき(2015/11/29 06:02)

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



2014年9月7日

レガシィの2回目の車検

目次:

買ってから2回目となるレガシィの車検です。今回はレガシさんを購入したネクステージ大阪茨木店さんにお願いしました。お値段は大体14万円くらいでした。

そういえばネクステージ大阪茨木店は、スバル専門店だった(少なくともレガシィを買ったときは)のですが、いつのまにかミニバン専門店に様変わりしていました。1社専門だと売れ行きが厳しいのでしょうか?

毎年、夏になるとカーセキュリティが暑さで誤報を発して、近所迷惑極まりないので、車検と同時にカーセキュリティを調整してもらいました。

センサーの位置を変えたそうですが、残念ながらもう暑くないので、調整の成果は来年にならないと確認できません…。

編集者:すずき(2023/09/30 14:52)

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



2014年9月5日

PukiWikiの代わり - MoinMoinを試す

目次: 自宅サーバー

長いこと開発が停滞しているPukiWikiに鞭打って使ってきました(※)が、そろそろ置き換えようかと思います。置き換え候補としてはWikipediaでお馴染みMediaWiki、TWiki、MoinMoin辺りが割と活発なプロジェクトのようです。

(※)と思ってたら、開発が再開して7月に1.5.0がリリースされました。6年ぶり?くらい?

MoinMoin

MediaWikiはPukiWikiと同じくPHPで書かれているのは良いのですが、データベースを使うらしく面倒だったので、Python以外に何も要らないMoinMoinを試してみました。環境はApache 2.2 + WSGI + Python 2.7.3です。

MoinMoinのセットアップは初見殺しが多くてわかりづらいです。私は下記の手順で設定しました。とりあえず動きましたが、合ってるのかなあ、これ。

tar xzvf moin-1.9.7.tar.gz
tarballの展開です。でも展開しただけではダメで、インストールが必要です。
setup.py install --prefix=/home/username/public_html/wiki
インストールです。せっかくスクリプト言語なのに、コンパイルだのインストールだの面倒です…。
mv /home/username/public_html/wiki/share/moin/* /home/username/public_html/wiki/
MoinMoin本体ファイル、その他の依存ファイルを全て移動します。
ここでファイルを移動させるかWebサーバ側でshare/moinに向けてAliasを設定しないと、WikiのURLにshare/moinが入ってしまいダサいです。
mv /home/username/public_html/wiki/share/lib /home/username/public_html/
ライブラリのディレクトリを移動させます。移動させなくても動くと思いますが、後で設定ファイル書く際にパスが無意味に長くなってしまいダサいです。
cp /home/username/public_html/wiki/server/moin.wsgi /home/username/public_html/
MoinMoinのWSGIスクリプトであるmoin.wsgiのひな形をコピーします。
もし必要なら .htaccessにてDirectoryIndex moin.wsgiとすると、WikiのURLからmoin.wsgiを省略できます。
vi moin.wsgi
WSGIスクリプトはそのままでは何一つ動きません。書き足すべきは2つです。
(その1) MoinMoinのライブラリパス
sys.path.insert(0, '/home/username/public_html/wiki/lib/python2.7/site-packages')
(その2) コンフィグ(wikiconfig.py)のパス
sys.path.insert(0, '/home/username/public_html/wiki')
ln -s lib/python2.7/site-packages/MoinMoin/web/static/htdocs moin_static197
CSSとかJavaScriptの入ったディレクトリへのリンクを張ります。これを忘れるとCSSも画像も全く参照できなくなってページのデザインが崩壊し、白地に文字だけが出る悲しい有様になります。
ディレクトリ名はmoin_staticXYZという名前で、XYZにはバージョンが入ります。今回使ったのは1.9.7なのでXYZ = 197となっています。今日一番の「そんなの知らないよ…」ポイントでした。
cp /home/username/public_html/wiki/config/wikiconfig.py ./
設定ファイルのひな形をコピーしてきます。
vi wikiconfig.py
設定ファイルもデフォルトの設定ファイルのままでは動きません。書き足すべきは2つです。
(その1) CSSやJavaScriptの位置(url_prefix_staticにはmoin_static197が最初から入っています)
url_prefix_static = '/~username/wiki' + url_prefix_static
(その2) スタートページ
page_front_page = u"MyStartingPage"

とりあえず使ってみた感想としては、閲覧は速いですが、編集は異様に遅いです。遅すぎてイライラする。これを常用するのは厳しいぞ…。

蛇足

Pythonで書かれたCGIはライブラリの位置(site-modules)を設定ファイルに書く必要があって面倒です。私の場合、メインのSakuraのサーバと、サブの自宅サーバとで、パスを書き換えねばならず面倒くさいです。

今使っているMercurialのWebフロントエンド(hgwebdir.cgi)もPythonで書かれていて、ライブラリの位置を設定ファイルに書く必要があります。CGIをバージョンアップする度に、設定を上書きして潰してしまいInternal Server Errorに遭遇して、そういえば設定が要るんだった、と思い出します。

Python自体は簡潔で良い言語だと思いますが、CGIになると面倒くさくてイマイチというか…、単に私の管理方法が悪いだけなのか…。とにかく、あまり好きになれません。

編集者:すずき(2024/01/13 17:12)

コメント一覧

  • IKeJIさん(2014/09/10 01:31)
    Mediawiki + SQLite という選択肢があった気がします。使った事はないですが。
  • すずきさん(2014/09/10 02:01)
    >IKeJI さん
    ありがとうございます。
    今度の休みにトライしてみます。
open/close この記事にコメントする



2014年9月1日

Linux 3.14.16動作on自作ARMエミュ

目次: Linux

自作ARMエミュレータ上でLinux 3.14.16も起動しました。

実行速度が遅いのは相変わらずですが、ちょっとしたキャッシュを入れたおかげで、従来比2倍くらいになりました。下記はCore2 Quad Q9550での実行結果です。

Linux 3.14.16起動ログon自作ARMエミュレータ
Connected to the target VM, address: '127.0.0.1:59905', transport: 'socket'

Exception: Reset by 'Init.'.
loadFile: Z:\arm_cross\linux-3.14.16\arch\arm\boot\Image
loadFile: 'Z:\arm_cross\linux-3.14.16\arch\arm\boot\Image' done, 3912512bytes.
loadFile: Z:\arm_cross\work\initramfs.gz
loadFile: 'Z:\arm_cross\work\initramfs.gz' done, 1113122bytes.
UARTFBRD: 0x00000004
UARTIBRD: 0x00000027
UARTLCR_H: 0x00000070
[    0.000000] Booting Linux on physical CPU 0x0
[    0.000000] Linux version 3.14.16+ (katsuhiro@falcon) (gcc version 4.9.1 20140710 (prerelease) (crosstool-NG linaro-1.13.1-4.9-2014.07 - Linaro GCC 4.9-2014.07) ) #7 Tue Sep 2 00:29:04 JST 2014
[    0.000000] CPU: ARM926EJ-S [41069260] revision 0 (ARMv5TEJ), cr=00003137
[    0.000000] CPU: VIVT data cache, VIVT instruction cache
[    0.000000] Machine: ARM-Versatile PB
[    0.000000] Ignoring unrecognised tag 0x00000000
[    0.000000] Memory policy: Data cache writeback
[    0.000000] On node 0 totalpages: 16384
[    0.000000] free_area_init_node: node 0, pgdat c03c2c18, node_mem_map c3f7a000
[    0.000000]   Normal zone: 128 pages used for memmap
[    0.000000]   Normal zone: 0 pages reserved
[    0.000000]   Normal zone: 16384 pages, LIFO batch:3
[    0.001122] sched_clock: 32 bits at 24MHz, resolution 41ns, wraps every 178956969942ns
[    0.007939] pcpu-alloc: s0 r0 d32768 u32768 alloc=1*32768
[    0.009354] pcpu-alloc: [0] 0 
[    0.016694] Built 1 zonelists in Zone order, mobility grouping on.  Total pages: 16256
[    0.017822] Kernel command line: console=ttyAMA0 mem=64M lpj=0 root=/dev/ram init=/bin/sh debug printk.time=1
[    0.034226] PID hash table entries: 256 (order: -2, 1024 bytes)
[    0.037649] Dentry cache hash table entries: 8192 (order: 3, 32768 bytes)
[    0.051346] Inode-cache hash table entries: 4096 (order: 2, 16384 bytes)
[    0.171196] Memory: 59872K/65536K available (2809K kernel code, 156K rwdata, 732K rodata, 115K init, 116K bss, 5664K reserved)
[    0.176299] Virtual kernel memory layout:
[    0.176299]     vector  : 0xffff0000 - 0xffff1000   (   4 kB)
[    0.176299]     fixmap  : 0xfff00000 - 0xfffe0000   ( 896 kB)
[    0.176299]     vmalloc : 0xc4800000 - 0xff000000   ( 936 MB)
[    0.176299]     lowmem  : 0xc0000000 - 0xc4000000   (  64 MB)
[    0.176299]     modules : 0xbf000000 - 0xc0000000   (  16 MB)
[    0.176299]       .text : 0xc0008000 - 0xc037d840   (3543 kB)
[    0.176299]       .init : 0xc037e000 - 0xc039ac8c   ( 116 kB)
[    0.176299]       .data : 0xc039c000 - 0xc03c3340   ( 157 kB)
[    0.176299]        .bss : 0xc03c3340 - 0xc03e0694   ( 117 kB)
[    0.194996] NR_IRQS:224
[    0.311103] VIC @f1140000: id 0x00041190, vendor 0x41
[    0.334340] FPGA IRQ chip 0 "SIC" @ f1003000, 13 irqs, parent IRQ: 63
[    0.421699] Console: colour dummy device 80x30
[    0.426511] Calibrating delay loop... 15.18 BogoMIPS (lpj=75904)
[    1.453855] pid_max: default: 32768 minimum: 301
[    1.470559] Mount-cache hash table entries: 1024 (order: 0, 4096 bytes)
[    1.471997] Mountpoint-cache hash table entries: 1024 (order: 0, 4096 bytes)
[    1.549273] CPU: Testing write buffer coherency: ok
[    1.567848] Setting up static identity map for 0x802ac900 - 0x802ac958
[    1.792641] VFP support v0.3: no double precision support
[    1.826380] NET: Registered protocol family 16
[    1.913054] DMA: preallocated 256 KiB pool for atomic coherent allocations
[    2.222332] Serial: AMBA PL011 UART driver
[    2.232115] dev:f1: ttyAMA0 at MMIO 0x101f1000 (irq = 44, base_baud = 0) is a PL011 rev1
[    2.471302] console [ttyAMA0] enabled
[    2.506242] dev:f2: ttyAMA1 at MMIO 0x101f2000 (irq = 45, base_baud = 0) is a PL011 rev1
[    2.542220] dev:f3: ttyAMA2 at MMIO 0x101f3000 (irq = 46, base_baud = 0) is a PL011 rev1
[    2.580195] fpga:09: ttyAMA3 at MMIO 0x10009000 (irq = 70, base_baud = 0) is a PL011 rev1
[    3.207538] bio: create slab <bio-0> at 0
[    3.444611] Switched to clocksource timer3
[    4.365563] NET: Registered protocol family 2
[    4.453045] TCP established hash table entries: 1024 (order: 0, 4096 bytes)
[    4.465491] TCP bind hash table entries: 1024 (order: 0, 4096 bytes)
[    4.474190] TCP: Hash tables configured (established 1024 bind 1024)
[    4.482792] TCP: reno registered
[    4.485464] UDP hash table entries: 256 (order: 0, 4096 bytes)
[    4.493590] UDP-Lite hash table entries: 256 (order: 0, 4096 bytes)
[    4.522323] NET: Registered protocol family 1
[    4.552290] RPC: Registered named UNIX socket transport module.
[    4.555861] RPC: Registered udp transport module.
[    4.559377] RPC: Registered tcp transport module.
[    4.562420] RPC: Registered tcp NFSv4.1 backchannel transport module.
[    4.599499] Trying to unpack rootfs image as initramfs...
[   41.046708] Freeing initrd memory: 1084K (c0800000 - c090f000)
[   41.069328] NetWinder Floating Point Emulator V0.97 (double precision)
[   41.141637] futex hash table entries: 256 (order: -1, 3072 bytes)
[   41.206487] Installing knfsd (copyright (C) 1996 okir@monad.swb.de).
[   41.221841] jffs2: version 2.2. (NAND) © 2001-2006 Red Hat, Inc.
[   41.248434] ROMFS MTD (C) 2007 Red Hat, Inc.
[   41.252843] msgmni has been set to 119
[   41.288910] Block layer SCSI generic (bsg) driver version 0.4 loaded (major 254)
[   41.292702] io scheduler noop registered
[   41.294993] io scheduler deadline registered
[   41.299488] io scheduler cfq registered (default)
[   42.651584] brd: module loaded
[   42.698604] physmap platform flash device: 04000000 at 34000000
[   42.799677] physmap-flash physmap-flash.0: map_probe failed
[   42.938847] smc91x: not found (-19).
[   42.980983] mousedev: PS/2 mouse device common for all mice
[   43.023922] ledtrig-cpu: registered to indicate activity on CPUs
[   43.175215] TCP: cubic registered
[   43.177334] NET: Registered protocol family 17
UARTIFLS: 0x00000012
UARTFBRD: 0x00000000
UARTIBRD: 0x00000001
UARTLCR_H: 0x00000000
UARTFBRD: 0x00000000
UARTIBRD: 0x00000000
UARTLCR_H: 0x00000070
UARTFBRD: 0x00000004
UARTIBRD: 0x00000027
UARTLCR_H: 0x00000070
[   43.361101] Freeing unused kernel memory: 112K (c037e000 - c039a000)
hello, world!!
/bin/sh: can't access tty; job control turned off
UARTFBRD: 0x00000004
UARTIBRD: 0x00000027
UARTLCR_H: 0x00000070
/ # 

実行速度が速いと時間当たりの試行回数を増やせて、デバッグ効率が良くなるので、実行速度って結構、大事だったりします。

ハングしていたところ

以前、ハングしていた箇所はPL110 Color LCDドライバでした。今のところカーネルコンフィグを変え、PL110ドライバをコンパイル対象から外すことで、ハングを回避しています。

それだけで1週間掛かっちゃう?って思った方はスルドイです…。本当のところを言うと「ハングはイケてないぜ、直すぜー!」と思ってPL110のLinuxドライバのコードを見ていましたが、どう直したもんかわからず、諦めたのです…。

なぜかPL110のドライバはPL110とPL111(次世代コア)のレジスタアドレスが両方書いてあって、どちらのコア用の制御なのかがわかりませんでした。一応、どちらの仕様書も持っていますから、最悪、両方作って試せば良いのですけど、さすがに面倒すぎる…。

おそらく私が何か勘違いしているだけの可能性大なのと、LCDのエミュレーションはまだやるつもりがないので、この件は頭の隅で細々と考えることにします。

編集者:すずき(2024/03/05 02:28)

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



2014年8月26日

hprofプロファイラ

Javaのhprofというプロファイラは、準備を必要とせず(JDK標準だから)に、CPU、ヒープ、モニタの衝突など、一通り測れる便利なプロファイラです。

特に各メソッドのカウントを「全て取る」モード(-Xrunhprof:cpu=times)は、明らかに呼び過ぎのメソッドが一発で分かるため、大変に便利です。

しかし便利な反面、実行速度が下がりすぎて使い物にならなくなる場合があります。

今日遭遇したケースは、7MBのファイルをDataInputStreamからreadByte() するプログラムです。通常のデバッグ実行であれば、ほんの一瞬で終わりますが、cpu=timesでプロファイリングすると10分経っても終わりません…。

どうも、細かいメソッドが頻繁に呼ばれすぎるせいで、メソッド呼び出しのカウントを行う部分がパンクしているようです。

思い出してみればInputStream系はInputStream -> BufferedInputStream -> DataInputStreamなどのように連鎖させるのでメソッド呼び出しが深く、データをロードするという処理はループ回数が多くなりがちなので、深さ×ループ回数の掛け算に比例してどんどん遅くなってしまいます。

これはよろしくありません。

頑張って軽くするには

待てるくらいの時間に収まるように、何とか軽くしてみましょう。

まず目を付けたのはreadByte() です。readByte() で1バイトつずつ読むから呼び出しカウントが多くなるわけです。ならばreadLong() で8バイトずつ読めばカウントは1/8です。

コードもちょい変えで済むし、お手軽高速化としては、プロファイリング時の実行速度もほぼ8倍になる、という中々の効果です。

しかしreadLong() を持ってしても100MBオーバーとなると厳しいでしょう。もし本当にそこまで必要なら、根底から覆す(InputStreamを使わないとか)別の手立てを考える必要がありそうです。

編集者:すずき(2014/08/26 03:15)

コメント一覧

  • IKeJIさん(2014/08/26 17:13)
    BufferedInputStreamのうしろは何回もは呼ばれないのでは?
  • すずきさん(2014/08/26 21:43)
    >IKeJI さん
    そうか、確かに BufferedInputStream 以降はあまり呼ばれないから、BufferedInputStream のバックエンドは呼び出し回数にほとんど関係無いですね。すみません、間違ってました。

    ただ BufferedInputStream 自体が結構遅くて、readByte() だとつらいという点は変わりません。
    試しに DataInputStream(new BufferedInputStream(new FileInputStream())) に対して、readLong() で 30万回読みだしてみますと、

    count : method
    307547 : java.io.BufferedInputStream.read
    307547 : java.io.DataInputStream.readLong
    307547 : java.io.DataInputStream.readFully
    307567 : java.io.BufferedInputStream.read1
    307568 : java.io.BufferedInputStream.getBufIfOpen
    307894 : java.io.BufferedInputStream.getBufIfOpen
    301 : java.io.FileInputStream.read
    3584 : java.io.BufferedInputStream.read
    301 : java.io.BufferedInputStream.fill

    こんな感じになっていて、getBufIfOpen がプロファイリングを激しく邪魔します。
  • IKeJIさん(2014/08/27 00:42)
    なるほど。
    その辺のprivateなメソッドはインライン展開できそうなもんですが、何かできない理由があるんですかね?
    BufferedInputStream.readをfinalにしたら早くなるんだろうか?
  • すずきさん(2014/08/27 02:09)
    >IKeJI さん
    BufferedInputStream をコピーした OreBufferedInputStream を作って、read を final にして試してみました。

    (final にする前)
    count method
    616787 net.katsuster.semu.arm.OreBufferedInputStream.read
    616787 java.io.DataInputStream.readFully
    616787 java.io.DataInputStream.readLong
    616787 net.katsuster.semu.arm.OreBufferedInputStream.read1
    616787 net.katsuster.semu.arm.OreBufferedInputStream.getBufIfOpen
    617390 net.katsuster.semu.arm.OreBufferedInputStream.getBufIfOpen
    603 java.io.FileInputStream.read
    2 java.io.FileInputStream.<init>
    3584 java.io.BufferedInputStream.read
    896 java.io.DataInputStream.readInt
    3584 java.io.BufferedInputStream.getBufIfOpen

    (final にした後)
    616787 net.katsuster.semu.arm.OreBufferedInputStream.read
    616787 java.io.DataInputStream.readFully
    616787 java.io.DataInputStream.readLong
    616787 net.katsuster.semu.arm.OreBufferedInputStream.read1
    617390 net.katsuster.semu.arm.OreBufferedInputStream.getBufIfOpen
    616787 net.katsuster.semu.arm.OreBufferedInputStream.getBufIfOpen
    603 java.io.FileInputStream.read
    3584 java.io.BufferedInputStream.getBufIfOpen
    2 java.io.FileInputStream.<init>
    896 java.io.DataInputStream.readInt

    速度も変わらないですね。
  • IKeJIさん(2014/08/27 13:32)
    DataInputStreamがOreBufferedInputStreamをInputStreamとして扱っているからでしょうか?
  • すずきさん(2014/08/28 10:11)
    >IKeJI さん
    もしかして JIT でインライン展開されようとされまいと、関数呼び出しカウントは行われるんじゃないですかね?
    BufferedInputStream.read が遅いわけではないので、単にカウントが遅いのでは。
  • IKeJIさん(2014/08/28 14:26)
    そうですが、プロファイルしない時の実行速度はあがるのでは? > 関数呼び出しカウントは行われる
  • すずきさん(2014/08/29 17:02)
    >IKeJI さん
    プロファイルするときと、しないときとで、JIT の動作が変われば、インライン展開されそうなメソッドなのに、プロファイラにカウントされる理由が付きますかね…?
    うーむ、でも自分で書いておいてなんですが、そこまでやらないよな…さすがに…。
open/close この記事にコメントする



link もっと前
2014年9月8日 >>> 2014年8月26日
link もっと後

管理用メニュー

link 記事を新規作成

<2014>
<<<09>>>
-123456
78910111213
14151617181920
21222324252627
282930----

最近のコメント5件

  • link 20年6月19日
    すずきさん (04/06 22:54)
    「ディレクトリを予め作成しておけば良いです...」
  • link 20年6月19日
    斎藤さん (04/06 16:25)
    「「Preferencesというメニューか...」
  • link 21年3月13日
    すずきさん (03/05 15:13)
    「あー、このプログラムがまずいんですね。ご...」
  • link 21年3月13日
    emkさん (03/05 12:44)
    「キャストでvolatileを外してアクセ...」
  • link 24年1月24日
    すずきさん (02/19 18:37)
    「簡単にできる方法はPowerShellの...」

最近の記事3件

  • link 24年4月17日
    すずき (04/18 22:44)
    「[VSCodeとMarkdownとPlantUMLのローカルサーバー] 目次: LinuxVSCodeのPlantUML Ex...」
  • link 23年4月10日
    すずき (04/18 22:30)
    「[Linux - まとめリンク] 目次: Linuxカーネル、ドライバ関連。Linuxのstruct pageって何?Linu...」
  • link 20年2月22日
    すずき (04/17 02:22)
    「[Zephyr - まとめリンク] 目次: Zephyr導入、ブート周りHello! Zephyr OS!!Hello! Ze...」
link もっとみる

こんてんつ

open/close wiki
open/close Linux JM
open/close Java API

過去の日記

open/close 2002年
open/close 2003年
open/close 2004年
open/close 2005年
open/close 2006年
open/close 2007年
open/close 2008年
open/close 2009年
open/close 2010年
open/close 2011年
open/close 2012年
open/close 2013年
open/close 2014年
open/close 2015年
open/close 2016年
open/close 2017年
open/close 2018年
open/close 2019年
open/close 2020年
open/close 2021年
open/close 2022年
open/close 2023年
open/close 2024年
open/close 過去日記について

その他の情報

open/close アクセス統計
open/close サーバ一覧
open/close サイトの情報

合計:  counter total
本日:  counter today

link About www.katsuster.net
RDFファイル RSS 1.0

最終更新: 04/18 22:44