さようなら Ubuntu、こんにちは Linux Mint

ここ5年ほどメイン機で使っていた Ubuntu にとうとう別れを告げました。 Ubuntu の採用を辞める理由として挙げるとすれば以下の点です。

重い?

ハードウェアは 2012 年の暮れに SONY の公式オンラインストアで購入した VAIO Z で、Core i7 の 8GB RAM、SSD 搭載機です。 購入から1年半が経ちますが、まだまだ陳腐化していないスペックだと思います。グラフィックはインテルのHDグラフィックス…とオンボードのものですが、一昔前の安物グラボに比べれば、よっぽど安定していて高速なハズです。

なので、特に処理能力の限界を感じていたわけではありませんでした。もちろん、無駄に○○しているな〜と感じる点はありましたが、ハードウェア的なボトルネックが顕著になる以前に、私の自宅の WiFi の不安定さであったり、ファイル置き場になっている自宅サーバーのスペック不足でひっかかったりしていました。

Unity デスクトップ環境な Ubuntu 自体は大手ディストリの中でもかなり「重い」部類ではあると思いますが、そんなに苦になることはなかったと思います。

Unity まわりのUI設計のマズさ

動作の軽快さよりも、こちらの方がネックでした。使い勝手が悪いと悪評の高い Unity をやめようと思い、Classic デスクトップ環境に切り替えていた時期もありましたが、やはりしっくり来ず。 特に問題だったのが、タスクバーとメインメニューの統合です。これは登場した当初から叩かれていたので今更詳しく書くのもアレですので、要点だけを書いておきます。

  • 広いデスクトップ上でウィンドウ表示していると、左上のタスクバーにメインメニューがあると、その持ち主であるウィンドウから遠い。これは Mac なんかもそうかな?
  • GIMP などの複数ウィンドウで構成されているアプリケーションの場合、メインウィンドウがアクティブじゃないとメインメニューが表示されなくてかなり困る。つまりツールウィンドウを選択している時にタスクバーにカーソルを持っていっても、期待したメニュー項目がないんですよ。
  • タスクバーにマウス・ホバーさせないとメニューが表示されない。メニューが常に表示されていればマウスをダイレクトにポインティングできますが、一度タスクバーに盲目状態でカーソルを持っていく→表示される→改めて目的のメニュー項目までカーソルを持っていく、のパターンになって、マウス操作主体のアプリケーションだと軽く死ねます。

もともと、「ウィンドウごとにタイトルバーの下にメニュー領域を確保するのがスペース的な無駄だ」という発想だったのか、Mac の UI を真似したのか分かりませんが、使いづらく感じる人のほうが多そうですよね。前者の理由だった場合、Unity デスクトップ環境の左側に表示されているアプリケーションアイコンのほうがよっぽど邪魔です。自動的に隠すこともできますが、それでもアイコンサイズの設定できる最小値が大きすぎます。 最近のディスプレイは、ほとんどがワイド画面であるため、縦方向に領域を占有するメインメニューよりも、横方向に領域を占有するアプリケーションアイコンの方が犠牲になるコストは小さいかもしれませんが、なんだかよく分かりません。また、タブレット PC やスマホなど、タッチ操作をしなければならない端末でも、標準のマウス環境でも、どちらでも対応できるような UI 設計にしている戦略的な意味合いがありそうな気がします。どちらでも対応、と書くと聞こえが良いですが、言い替えると、どちらも中途半端ってことでしょう。こういうデザインのごり押しを見ていると、もはや商売戦略ありきの設計である Windows と何も変わらない気がします。

しかし非標準を許さない

Linux なんかの良いところは、自分の好きな環境を自分で組み合わせて最適なモノに囲まれてコンピュータ・ライフを楽しめるところだと思うんですが、ここまで時代が変わってくると、いろんなフレームワークやらライブラリやら、それを動かすためのフレームワークやら、ちょっとした事でもバックエンドの巨大なものをずるずるとひっぱってきたり、そうしているうちに整合性が取れなくなって、ちょっとした事でも意図したとおりの事ができなくなっちゃったりと、もう訳が分からなくなる事も多いです。

Ubuntu はその良い例で、標準的な考え方と Ubuntu 独自の考え方の相性が悪い印象です。ちょっとしたカスタマイズを施して使っていると、次のメジャーアップデートの際に決まって不整合となってしまい、面倒なことが発生していました。ユーザーに自由という権限を与えない変わりに、ある程度責任を持って「ユーザーが何も考えなくても快適な環境が提供されるシステム」だったら良いのですが、そこまで力及ばず、といったところでしょうかね。

カノニカルが以前、「我々のライバルは Windows ではなく、Mac OS だ。」と宣言していた気がしますが、UNIX を Mac OS にしちゃった Apple と カノニカルの大きな違いは、やっぱり力の強さ(資本や行動力)じゃないでしょうか。UNIX 系 OS でいわゆる非 UNIX ユーザも幸せになれるような環境を提供するには、Mac OS や Android といった、もはや UNIX 系とは思えないくらいの商業的かつパーソナルユーザ視点での作り込み、あるいは作り替えが必要になるんじゃないかなと。

まあ、Ubuntu コミュニティやカノニカルも含め、パーソナルユースの Linux、UNIX 環境に大きく貢献しているのは大きな事実ですので、感謝していますし、これからも発展して欲しいと思っています。

細かいところ

Nautilus が 0 バイトの画像や動画のサムネイルを生成する時にすとんと落ちてしまいます。これは致命的に痛いです。totemか何かでサムネイルを生成しているっぽいですが、Nautilus の設定等々をいじるよりも thunar に切り替えて使うケースが多かったです。また、thunar では、SSHFS でマウントしているネットワークストレージも、動画サムネイルを生成しつつもそこそこ素早くファイル一覧を表示できていたのですが、Nautilus では時間がかかった上にタイムアウトするケースも多く見られました。

うちの環境も原因の一つかもしれませんが、ファイラを替えただけでストレスなくオペレーションができている以上、Nautilus の挙動に問題があるような気もします。

これだけ不安定かつぽこぽこと強制終了していたらネモ船長もたまったもんじゃないです。

Linux Mint

Ubuntu の「かゆいところ」はまだ他にもいろいろありますが、Ubuntu の良いところを引き継ぎつつ、悪いところを排除する目標を掲げている Linux Mint に興味を持ちました。

WiFi の設定

まずはともあれ、ネットにつながってないと困ります。最近の先進的なディストリでは、デフォルトで WiFi が有効になっているので嬉しい限りです。自宅のアクセスポイントを選んでパスワードを入れるだけで繋りました。

Firefox syncの同期

次に、ウェブで情報を得たり、動画を見たりしながらセットアップをするので Firefox syncを同期します。自宅、職場、スマホと同期できるってのは本当に助かりますね。

(2014/5/15追記・最新の Firefox では sync の認証方式が変更されたようです。端末によって新方式と旧方式を同時に運用することはできず、全て新しい Firefox にアップデートして新方式にしないと同期が出来ない模様…。Windows 以外のマシンではしっかりしたバージョン管理システムの自動アプデに任せているから色々面倒だなぁ。
ちなみに、Bluetooth のハードウェア認証のような旧方式は、リカバリーキーやらペアコードやら意味が分からないものが多く、どちらがマスターデータでどちらがスレーブなのか分かりづらかったので、予想していたとおり大不評だったんでしょう。
今回の一般的なアカウントによるサーバ認証方式が採用理由は分かりますが、一度同期して運用しちゃってる設定をバージョンアップで変更しなければならないのは労力ですね)

また、宗教上の理由により検索バーのデフォルトは DuckDuckGo っていうアヒルになっていますが、

http://www.linuxmint.com/searchengines.php

の下部にある「Commercial engines(営利目的の検索エンジン)」の Google のアイコンをクリック後、検索バーのアイコンをクリックして出てくるプルダウンメニューより「”Google”を追加」をクリックすれば追加することができます。
さらに「検索バーの管理…」から Google の優先度を上げてやれば、晴れて Google に監視されっぱなし状態になれます。

Ctrl キーと Caps Lock キーの入れ替え

システム設定の「地域と言語の設定」より、キーボードレイアウト→オプションから変更しました。
Xの設定ファイルをいじって、いじっている途中に Caps Lockを押してしまってイライラしていた時代が懐しい…(でも、もはやGUIなしじゃすぐに設定できない体になってしまいそうです)

ちなみにうちは、日本語環境、日本時刻、英語配列キーボードっていう環境です。

uim と skk の導入

Mint にはデフォルトで日本語 IM が入ってないらしいんですが、SKK 使いの自分としては 使いもしない Anthy などが入っているより好都合です。

sudo aptitude install uim uim-gtk3 uim-skk

としてサクっと入れます。
一度、ログアウトしてセッションを開始し直せば、C-j で日本語入力ができるようになりました。

sshfs の導入

以前のファイルは、別のサーバーマシンに預けているので、sshfs を導入。

sudo aptitude install sshfs

で、一般権限でも fuse できるようにします。

sudo chmod o+rw /dev/fuse
sudo chmod 4755 /bin/fusermount

これでマウント可能になりました。簡単すぎる…!

自分コマンドのパスを通す

HOMEの.ファイルを移す

Dropbox のセットアップ

$ mkdir ~/bin
$ wget -O ~/bin/dropbox.py http://www.dropbox.com/download?dl=packages/dropbox.py
$ chmod a+x ~/bin/dropbox.py
$ dropbox.py start -i

Skype

http://download.skype.com/linux/skype-debian_4.2.0.13-1_i386.deb

DraftSight

http://www.3ds.com/ja/products-services/draftsight/download-draftsight/

libgtk2.0-0:i386
/opt/dassault-systemes/DraftSight/Linux/DraftSight
/opt/dassault-systemes/DraftSight/Linux/DraftSight: error while loading shared libraries: libGLU.so.1: cannot open shared object file: No such file or directory

$ sudo apt-file search libGLU.so.1
libglu1-mesa: /usr/lib/x86_64-linux-gnu/libGLU.so.1
libglu1-mesa: /usr/lib/x86_64-linux-gnu/libGLU.so.1.3.1

sudo aptitude install libglu1-mesa:i386

デスクレットの追加

「システム設定」の「デスクレット」より、デスクレットとよばれるウィジェットをデスクトップに追加できます。
Ubuntu では天気とカレンダーを表示していたのですが、カレンダーがなかったので AccuWeather Desklet だけを入れてみました。

Monodevelop

sudo aptitude install libmono-cairo2.0-cil

virtualbox

sudo aptitude install virtualbox-qt virtualbox-dkms 

gvim

JQuery覚書その1

JQueryをまともに使わなければなー、ということで自分用の覚え書きを書いておきます。

セットアップ

通常の JavaScript のようにホストに設置しても良いし、JQuery の公式や Google が提供している API 経由で読み込ませてもOK。

<script src="jquery-1.11.0.min.js"></script>

基本

エレメントには、$() でアクセスする。

<div id="hoge"></div>

$("#hoge").text("hello, world");
$("#hoge").css("background", "#FFFF00");

getElementById をとってきて innerHTML をいじくるような面倒くさいことはない。

#hogeid="hoge".hogeclass="hoge" というふうに ID や Class で指定可能。
タグで指定する場合は $('div') となる。また、複数のエレメントを指定するには、$('#foo,#bar') のようにカンマ区切りも可能。

メソッド

引数なしで呼ぶと取得、引数を渡せばその引数で設定。

  • text()
    div内などのプレーンテキスト
  • html()
    生HTML
  • val()
    input タグなどの保持している値
  • css(属性名, [値])
    css だけ属性名は必須。値は設定時のみ。

エレメントつくるよー

作るだけなら $('<p>hoge</p>') と HTML 直書きで良い。
突っ込むには、

  • elementA.append(elementB)
    elementAの中にelementBを突っ込む。
  • elementA.wrap(elementB)
    elementAをelementBで囲む。elementAが複数要素だったら個別に囲む。
  • elementA.wrapAll(elementB)
    elementAをelementBでまとめて囲む。
  • elementA.before(elementB)
    elementAの前にelementBをおく。
  • elementB.after(elementB)
    elementAの後にelementBをおく。

データを保持させとくよー

element.data(キー, 値)
var = element.data(キー)

エレメント自身にデータを持たせておいて、必要な時に使える。ページが更新されるまで生きてる。

イベント

エフェクト

非同期通信

var param = {key:”value”};
element.load(“hoge.txt”[, param])

これで element.text に結果を突っ込める。
post/getメソッドを使って、取得後の処理を行いたい場合は

$.get(“hoge.cgi”, param, func);
$.post(“hoge.cgi”, param, func);
function func(result) { … }

funcのようにコールバック関数を指定する。result にとってきた値が入る。この場合生テキスト。

$.getJSON(“hoge.json”, param, func)

で JSON 形式で取得。result は JSON オブジェクトとして使えるので、

{ "foo": "bar" }

が内容だった場合、var str = result.foo; とすると str に “bar” が入る。

シリアライズ

フォームの内容をまとめてシリアライズ!

var param = $('#form1').serialize();

こいつをpost()とかget()とかに投げる。べんり。

ANSI エスケープシーケンスについて

端末の色やカーソル制御を行うには、curses を利用するのが一般的ですが、ライブラリを利用しなくとも、シェル経由である決まりのエスケープシーケンス文字列を端末に投げることにより、色やカーソル制御を行うことができます。

次のページに詳しく記載があります。

Bash Prompt HOWTO: ANSI エスケープシーケンス: 色とカーソル操作

  • 昨今の bash では\033\eに設定されているため、例えば\033[\0m\e[0mと記述できます。
  • また色指定の\e[31mなどを\[\]で囲む記述がありますが、囲まなくても大丈夫のようです。
    • 例) \[\033[41m\]\[\033[1;37m\] string \[\033[0m\]\e[41;1;37m string \e[0m
    • だいぶすっきり。

前景色・背景色の指定

xtermなど、一般的な端末でサポートされている ANSI カラーの 8 色です。太字設定をすると、それぞれの色が高輝度・低輝度な 2 種類の色になるため、事実上 16 色になります。

0 1 2 3 4 5 6 7

赤の前景なら\e[31m、青の背景なら\e[44という風に、それぞれ30番台と40番台の1の位が上の表となります。また、太字(強調文字・高輝度な文字)表現にするには、\e[32;1mのようにセミコロン区切りで属性を加えてやります。この1桁の属性値は順番は問わないようで\e[1;32mでも同じ意味になります。 属性値は 1.太字、4.下線、5.点滅、7.反転、8.非表示 らしいです。

色の見え具合は端末によって結構変動します。上の表は原色のビビットカラーで表現していますが、最近のオサレな端末なんかは、色がギラギラして見えづらいことに対する配慮のためだろうと思いますが、デフォルトでは抑えた色で表現するよう定義されています。端末によっては色のバインドを変更することも出来ますし、見え具合はあんまり保証されていません。

また、xterm の拡張256色サポートをしている端末も結構あります。こちらはRGB値を数値指定して端末上に表現しているものですから、見え具合の差異は少ないと思われます。 256色サポートについては、5年ほど前に2chの「コンソールゲーム」スレに書き込んでいたログに書いていた内容がまだ残っているようです。

vim で簡単ドット絵エディタ

前に作っていたコンソールベースのゲームは、0から7をひたすら書いたテキストファイルをグラフィックファイルとして用いています。 シンタックスハイライトに次のように定義してやると、vim が簡単ドット絵エディタになります。

let b:current_syntax = "amap"
syn match g0 /0/
syn match g1 /1/
syn match g2 /2/
syn match g3 /3/
syn match g4 /4/
syn match g5 /5/
syn match g6 /6/
syn match g7 /7/
hi g0 ctermfg=gray ctermbg=black
hi g1 ctermfg=gray ctermbg=red
hi g2 ctermfg=gray ctermbg=green
hi g3 ctermfg=gray ctermbg=yellow
hi g4 ctermfg=gray ctermbg=blue
hi g5 ctermfg=gray ctermbg=magenta
hi g6 ctermfg=gray ctermbg=cyan
hi g7 ctermfg=gray ctermbg=white

前景色を見やすいように gray に設定しているので、set t_Co=256を設定しておかないといけないかもしれません。 あとは対象のファイルを開いてset syntax=amapしてやるだけです。

00000400000
00004440000
00444444400
44407440744
44411111444
04444444440

こういうテキストファイルが

you know what

例のアレのように表現されます。

作図っていうと、ビジュアルモードの矩形選択や一括置換が力を発揮しますね。

端末に表示するスクリプト

最近、ruby が楽しくて仕方ありません。上記のファイルを端末に表示するスクリプトです。libcaca の img2text の劣化みたいですね。

#!/usr/bin/env ruby
# -*- mode:ruby; coding:utf-8 -*- 

class String
  def number?
    self =~ /\A-?\d+(.\d+)?\Z/
  end
end

def printimg(file)
  File.open(file) do |f|
    buf = f.read
    cur = nil
    buf.each_char do |c|
      if c.number?
        if cur != c
          print "\e[4" + c + ";1m "
          cur = c
        else
          print " "
        end
      else
        print "\n"
      end
    end
    print "\e[0m"
  end
end

ARGV.each do |file|
  printimg file
  puts "---"
end

このスクリプトに

66666666666666666666607777707770777077777707707777777077777777777777777077700777
66666666666666666666077777077707770777777707770770777077777777777777777707077777
66666666666666666666607777077077770777077707777070777007777777777777777770777777
66666666666666666666660077077077770777077077777707077070777707770777777777077777
66666666666666666666666607077077770777077000077777707077077000770777777777077777
66666666666666666666666666607077707777077077700777770770000707070777077777077700
66666666666666666666666666607077707770707077777077777707707707707070707777707077
66666666666666666666666666660077707770707077777777777777770707777070770777700707
66666666666666666666666666666077707700000000007777777777000000000000000777707707
66666666666666666666666666666077707770777711177777777777777777111177770777707707
66666666666666666666666666666077707707077711117777777777777777111117707077707707
66666666666666666666666666666077770707777777777777777777777777777777777077707707
67774747477747774746677747774707770707171777777777777777777777771717777077070707
67466747474747474746674746746007770707777777777770777777777777777777770777070770
67466777477747746746674746746007770707777777777777777777777777777777770777070770
67466747474747474746674746740707770770777777777777777777777777777777707770770770
67774747474747474777477746707700777077077777711111111111111111111111111707111117
66666666666666666666666666077070777701111111111111111111111111117770111111711111
67474747477747774746677740700711111111111111111111111111111111177777011111111711
67474747474667466746674660040701111111111111111111111111111111117770111111111171
67774747474747774746667406740701111111111111111111111111111111111111111111111110
67474747474747466746666746740700111111111111111111111111111111111117770111111000
67474777477747774777477746707770011111111111110000000000111111111177777011110001
66666666666666666666666666077777000111111110000000000000000001111117770111110001

という内容のテキストを食わせてやると

charlot

こんな感じになります。

さらに、拡張256色モードを駆使すると

xterm-256-map

こんな具合に!

enter image description here

こんな具合に!!!

…ゲームなんかで多様する茶色や肌色みたいな非原色が使えるのは嬉しいんですが、256種類も色があると

  • vim で描けない
  • 管理したり作ったりするのが大変
  • 色のバインドに迷う

と、色々弊害も出てきます。

今回はすべて背景色だけで描画していますが、前景色付きの文字を組み合わせて微妙な色を表現したり、さらにはUnicode文字の網掛けなどを駆使しつつ広大な縦横文字数を持つ端末を必須にするなどすれば、事実上、なんでも表現ができてしまいそうな気がします。

表現力にこだわりたいなら、SDL でも GL でもフレームバッファでも何でも使えばいいと思うので、色のつかいすぎは「端末だってここまでできるんだよ!」的なデモ用途にしか使う意味がないのかもしれません。で、そうなると、前述の libcaca などの高品位なデモを見ていればいいわけで・・・。

ゲーム用途には、大小アルファベットと数字で表現できる64色+RGBバインドくらいがちょうどいいのかなーと思うこの頃です。
ちなみに、モノクロでダンプできる rogue はいろんな意味で美しいです。

伊能図にみる佐世保

inoh0190-trimmed

伊能忠敬が作成した「大日本沿海輿地全図」、通称「伊能図」に掲載されている19世紀初頭の佐世保市の地図です。分かりやすいように着色をしていますが、今からちょうど200年前の地図とは思えないほど正確ですね。

佐世保市民の方ならご存知の方も多いと思いますが、明治時代に佐世保に鎮守府が置かれるまで、佐世保は小さな漁村でした。そのため、明治より前の佐世保に関する史料は他の大きな街に比べれば乏しいようで、今なお研究が進められています。

白形浦

佐世保の人に「白形浦」と言っても誰もピンと来ないと思います。位置的に考えると鎮守府施設が置かれた場所のため、後世に地名が残らなかったと思われます。港湾設備を整えるために、明治初期に測量した図が実家にあったはずなので、今度帰った際に確認したいと思います。

横尾

今では影が薄い横尾町ですが、佐世保が市になるずっと昔からあったようです。私の家系の本家と分家は、横尾町一帯にあるので、市になる前から住んでいた一族なのかもしれません。だったらちょっと嬉しいな。(ほとんどの佐世保市民は、明治以降に佐賀などから移住してきた方々らしいです。)

山中

現在の山の田浄水場付近が「山中」という地名になっています。桜木町、赤木町付近だと思いますが、山中山という地名までありますね。浄水場が作られたのは1908年(明治42年)なので、その頃には山の田と呼ばれるようになっていた模様です。

早岐

早岐の古い町並みを見ると分かると思いますが、昔は早岐のほうが都会でした。江戸時代には既に100軒を越える集落があったらしく、平戸方面・長崎方面・太宰府といった福岡方面、さらには海路へとつながる地理的な理由もあったと思われます。400年続く早岐茶市がその繁栄っぷりを物語っているのではないでしょうか。また、早岐の名前の由来ともなった速来津姫伝説が収録されている「肥前国風土記」にも登場しています。

相神浦

最近、離島防衛の要となる「水陸機動団(日本版海兵隊)」が陸上自衛隊相浦駐屯地に拠点を置くことになりました。その基地がある相浦一帯は、以前は相神浦(あいこのうら)と呼ばれていたようです。相浦川流域全体のようで、柚木までカバーしています。佐世保村との境界は、今の春日町、西海学園近くにある堺木バス停留所付近だったらしく、松浦郡と彼杵郡の境界にもなっていたようです。 地図では小さくて分かりづらいかもしれませんが、愛宕山付近に飯盛城のことだと思われる「古城跡」の記載も見てとれます。

こういう風に地図を眺めているだけでも楽しいので、時間ができたら市立図書館の郷土資料室に行っていろいろと調べてみたいです。

ASP.NET を初体験

Web アプリケーションといえばもっぱら Perl, Ruby, Python あと少しだけ PHP な自分なのですが、仕事でちょっとした ASP ベースの API を書かなければならなくなりました。うちは90年代に育った小さな会社ということもあり、ネットワークは Windows ドメインネットワーク、Web サーバーも IIS ベースという(自分にとっては)息が詰まるような環境です。

ASP が書けるプログラマーがほとんどいない状況で、ASP ベースの API を担当していた先輩が事故で入院してしまい、その後釜を任された同僚のサポートという形で扱うことになりました。元々の API は無印の ASP ですので、いわゆる Visual Basic 6 的な構文。仕事の内容なので、あまり具体的には書きませんが、90年代半ばの機能を駆使してわざわざ面倒かつ煩雑なシステムにしてしまっているように思えて仕方ありません。UNIX における枯れた技術と Microsoft の政略が絡んだ枯れた技術では意味が違うと思いました・・・。

IIS の意味が分からない

Apache, lighttpd, nginx などの Web サーバーの考え方がベースになっている自分にとって、Microsoft の Web サーバー Internet Information Service の意味が分かりませんでした。実装した API の不具合がスクリプトサイドにあるのか、Web サーバーにあるのか、DB サーバーにあるのか、構造から理解するのに苦しみました。UNIX 生まれのインターネット技術をパクった挙句、ユーザーのためではなく自分らのために無駄なものをたくさん乗っけて、挙句、複雑怪奇な環境を提供しているようにしか思えません。Microsoft が出している開発環境をお金を出して買えば、トータルで面倒を見てくれるように商売戦略上設計されているんでしょうが、非 Web 環境で毎日 Visual Studio を使っている UNIX ユーザーとしてみれば、それも眉唾ものだと思いました。

Visual Studio の意味が分からない

Microsoft が提供している環境というのは往々にして、「ユーザーが自分でモノを考えて何かをやろうとすると墓穴を掘る」みたいなので、大人しく Visual Studio の Web デベロッパーツールを使用することにしました。うちは VS2008 ベースですので必然的に ASP.NET になります。Microsoft の技術にコードを投入してしまうと、過去の遺産とかそういうものは諦めないといけません。 VS2008 をインストールした時点で、まさか ASP.NET をすることになるとは思ってもいなかったので、追加インストールが必要になりました。追加インストールのためインストーラを起動してみると、嫌がらせのようにインストーラがエラーで落ちます。私の環境には、VS2010 と 2013 も入っているのですが、それが影響しているんでしょうか・・・。調べる手口もありません。 オープンソースなソフトウェアならば、調べてバグレポートのひとつも送らねば!と思うのですが、お金を払った上にこれだとそんなにマゾにもなれません。さっさと諦めてしまいました。

オープンソースの .NET 環境 Mono が素晴しい

平日、家に帰った後と休日はもっぱら Linux ベースで作業しています。職場では Windows と Visual Studio を使っています。どちらも時間的には半々なので、自身では盲目的な信者のつもりはないのですが、やっぱりオープンソースの方がユーザーフレンドリーです。

自宅の Linux 環境にも Mono を入れているので、もしかしたら ASP.NET も Linux 上で上手い具合に開発ができるのかなーなんて思って調べてみると、やはりありました。オープンソース万歳!信者とでも何とでも言ってくれ!

aspnet_on_monodevelop

Mono Develop にも最初から ASP.NET ソリューションを作成するのがついてました。もう「これでいいじゃん」感がハンパないです。さて、実際に開発をするには ASP.NET を動かすための Web サーバーを導入する必要がありますが、これも Mono 開発環境の一つとして XPS サーバーが準備されています。こいつも例のごとく、コマンド一つで導入できるのがクールです。

sudo aptitude install mono-xsp

Mono Develop のサンプルの ASP.NET ソリューションをデバッグ実行すると、次のようにちゃんと動きました。ハラショー。

asp_net_running

互換性についても C# は確か ECMA だか ISO だかで規格化されていますし、Visual Studio や IIS といった環境に左右されまくる Windows ベースでの開発よりもよっぽど安心して出来そうです。ちなみに、うちの環境では .NET は 4.0、C# は ISO-2 までサポートされています。

mono40

MonoDevelop が Vi キーバインドできるようになって、C++/CLI を使わずに済むプロジェクトをやるようになったら、本気で MonoDevelop で仕事しようと思いました。

追記

デフォルトで Vi キーバインドできました。快適すぎて涙が出てきそうです。

WordPress の記事投稿を Markdown に変更しました。

タイトルのとおり、WordPress の記事投稿を WP-Markdown というプラグインを入れて Markdown に変更しました。HTML のビジュアルエディタだと、コード中の <> 記号との相性が悪かったり、ドキュメントの文字情報とレイアウト情報がごちゃごちゃになってしまう HTML というものの、情報の入れ物としての素質的にどうなのかなあ、と思うところがあっての変更です。

シンタックスハイライターと衝突

これまで、コードのシンタックスハイライトには「SyntaxHighlighter Evolved」というプラグインを利用していましたが、Markdown プラグインと相性が悪いのか、レイアウトが崩れてしまいました。 現在は SyntaxHighlighter Evolved を無効にして、WP-Markdown の pretify syntax highlighter を有効にしています。これは pretify.js というライブラリでハイライトしてくれるらしいモノで、SyntaxHighlighter Evolved のように行番号表示や言語を指定する機能はありませんが、軽快かつ適当に色をつけてくれます。

なお、wp-markdown-syntaxhighlighter というプラグインを入れれば SyntaxHighlighter Evolved との衝突を防げるといった記事を見かけましたが、自分の環境ではムリでした。

LXC のウェブインターフェイス「LXC Web Panel」を使う

LXC Web Panel を去年の10月くらいにインストールしたのですが、早速忘れかけていたので覚え書きしておきます。

LXC Web Panel は AWS の EC2 のように WWW ブラウザから LXC コンテナを制御できるインターフェイスです。英語ですが、ごちゃごちゃとしておらずシンプルで使いやすいものになっています。

インストール

Github のページからインストールスクリプトをダウンロードして bash に食わせるだけで OK です。

wget http://lxc-webpanel.github.io/tools/install.sh -O - | bash

Python の Flask と Bootstrap で書かれているようです。もしかすると python-dev パッケージが必要かも。公式ページのインストールマニュアルを参考にしてください。

FAQ に

Can i use LXC Web Panel on Debian?

  • Nope, sorry… It doesn’t work :(

と書いてありましたが、さくらの VPS 上に作ってる Debian サーバにもインストールできました。しかし、公式サポートはあくまでも Ubuntu のようですので、自己責任で。

使う

インストールが成功すると 5000 番ポートでリスンします。WWW ブラウザで開きます。

firefox http://example.com:5000/

ログイン画面が出てきます。ユーザー名「admin」、パスワード「admin」で入れます。ログインできたら、http://example.com:5000/lwp/users でパスワードを変更しておきましょう。

lxc-web-panel

あとは見てのとおりです。必要な時にスマートにインスタンスを作ったり動かしたりできるので、いろいろとはかどりますね!

このウェブインターフェイス以前の問題ですが、ホストが Debian の場合、LXC の設定ファイルをちょっと工夫してあげなければならないので、新しいコンテナを作成する時にはシェルからコマンドを叩いているのが現実ですが、個人ユースでももっともっと VM を使うことが一般化してきたら、設定の煩雑さも解消していくと思われます。(他力本願)

ユーザごとにリソースを切り分けたりできるようになると、EC2 のようなサービスも個人でできそうですね!

参考リンク

書いた後で気付きましたが、Qiita でもっとスマートにまとめている方がいらっしゃいました。

シェルスクリプトでCGIチャットを書いてみました。

CGIは、標準入出力と環境変数を用いて動的コンテンツを生成する仕組みなので、これらを扱うことができるプログラムだったら記述言語は問いません。CGIと言えば「CGI/Perl」の組み合わせだけが突出して有名ですが、CGI/Cだって世の中にはたくさんあります。 さらに極端な事を言えば、CGI/awkだってCGI/shだって不可能ではありません。

ただし、CGI/shといったものは少なくとも私の知る限りでは、現在推奨はされていません。 Webインタフェイスとして動作するためのセキュリティを高めることに対する煩雑さであったり、大量のリクエストを効率的に捌くための本質的な性能であったり様々でしょうが、わざわざシェルスクリプトを引っ張り出してこなくても、Perl や Ruby、Python と言った気の利いた高級言語が使える環境が整っていることがほとんどでしょう。

じゃあ何故 CGI 用途にシェルスクリプトを使うかっていうと、限定された趣味の世界で、趣味目的で書く、というところが現実的なんじゃないかなって思っています。また、「(高級言語を使わなくても)シェルスクリプトだっていろいろ出来るよ!」という気持ちもあるかもしれません。(PQI Air Card のようなめちゃくちゃ小さい Linux システムにもシェルは搭載されているので、CGI/sh で簡単なウィキシステムを書いて遊んでみたりしました。)

bash.CGI

CGI として動作させるために重要なのが、リクエストの解析です。必要なものは環境変数に詰まっていますし、POST送信の内容は標準入力を読めば自分で何とでも出来ますが、シンプルかつしっかり動くbash.CGIというコードのサンプルがあるので、それをモジュールとして使いたいと思います。このコードは、CGI/Perl における CGI.pm みたいなもので、GETによるURLに付随してくるパラメータやPOST送信されたデータをシェル変数に置き換えてくれるので、いろいろ捗ります。

cgi_get_POST_vars()cgi_decodevar()cgi_getvars() の3つの関数定義と、呼び出しの大元である cgi_getvars BOTH ALL コマンドを貼っつけたスクリプトファイルを bashcgi.sh として保存しておきます。

bootstrap

最近のナウいユーザインタフェイスをちゃっちゃか実現するために Twitter の bootstrap を使っています。今回はサーバーのルートに /css や /js といったディレクトリが展開されるよう配置しています。

shellchat

さていよいよ本題。シェルスクリプトによる CGI チャットのソースコードは次のようになりました。

#!/bin/bash

. bashcgi.sh

title='shellchat!'
logfile='./log.txt'
linenb='15'

if [ -n "$nick" -a -n "$msg" ]; then
  msg=$(echo "$msg" | sed 's/</\&lt;/g' | sed 's/\(http:\/\/[^  ]*\)/<a href=\1 target=_blank>\1<\/a>/g')
  nick=$(echo "$nick" | sed 's/</\&lt;/g')
  timestamp=$(date +"%m/%d %H:%M:%S")
  echo "<code>$nick</code> <span>$msg</span> - <span class=small>$timestamp</span><br />" >> "$logfile"
  cat<<EOF
Content-Type: text/html

<meta http-equiv="Refresh" content="0; URL=$SCRIPT_NAME?nick=$nick" />
EOF
else
  cat<<EOF
Content-Type: text/html
Pragma: no-cache
Cache-Control: no-cache

<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    <meta http-equiv="Refresh" content="40; URL=$SCRIPT_NAME?nick=$nick" />
    <link rel="stylesheet" href="/css/bootstrap.min.css">
    <script src="/js/bootstrap.min.js"></script>
    <title>$title</title>
  </head>
  <body>
    <div class="container-fluid">
      <div class="row">
        <div class="col-md-2"></div>
          <div class="col-md-8">
            <h1>$title</h1>
            <div class="well">
EOF

  [ -f "$logfile" ] && tail -n $linenb "$logfile"

  cat<<EOF
            </div>
          </div>
          <div class="col-md-2"></div>
        </div>
        <div class="row">
          <div class="col-md-2"></div>
          <form class="form-inline" action="$SCRIPT_NAME" method="post" enctype="application/x-www-form-urlencoded">
            <div class="col-md-8">
              <p class="text-center">
                <input class="form-control" type="text" name="nick" size="5" placeholder="Name" value="$nick" />
                <input class="form-control" type="text" name="msg"  size="59" placeholder="Input message here." />
                <button type="submit" class="btn btn-default">
                  <span class="glyphicon glyphicon-comment"></span>
                </button>
              </p>
            </div>
          </form>
          <div class="col-md-2"></div>
        </div>
        <div class="row">
          <div class="col-md-2"></div>
          <div class="col-md-8">
            <hr />
            <p class="text-right">
              shellchat by <a href="https://dyama.org/" target="_blank">dyama.org</a>
            </p>
          </div>
          <div class="col-md-2"></div>
        </div>
      </div>
    </div>
  </body>
</html>
EOF
fi

exit 0

全体的にどべえーっと長ったらしい HTML タグがありますが、ほとんどがデザイン部です。実際に処理しているのは数行しかありません。 冒頭で bashcgi.sh を読み込んで、シェル変数に POST 送信の内容を詰め込んでいます。変数 nick と msg があれば、ログに追記した後、ユーザにはページをリフレッシュするよう META タグを返しています。また、変数がない場合はそのままログを表示しています。

セキュリティ的にも性能としても、何もやっていない分、いろいろと問題があるのですが、一応ちゃんと動いています。

shellchat

実際に動かすと、上記のように表示されます。

艦これのSKK辞書を作ってみました。

なんだかもの凄く今更感があるのですが、角川ゲームスが提供するオンライン育成ゲーム「艦隊これくしょん」のSKK辞書を作ってみました。Githubにてホスティングしてますので、ダウンロードやFolkが自由にできます。 普段のタイピングでは使わないような旧日本海軍の艦船名(艦娘名)をはじめ、装備品やゲーム中に登場する敵キャラクターの名前などを492ワードを収録しています(現時点)。まだまだ用語を網羅しているとは言えませんので、どんどん充実していけたらと思います。

Kancolle words dictionary for SKK(Githubの公開ページ)

https://github.com/dyama/skk-dict-kancolle

収録語一覧

https://github.com/dyama/skk-dict-kancolle/blob/master/src/SKK-JISYO.kancolle

辞書はUTF-8ベースで記載されています。ご利用のシステムに合わせて変更してください。src ディレクトリ内の SKK-JISYO.kancolle が辞書ファイルですが、このファイルはメンテナンスのためにソートしていません。make を実行するとソート済みの辞書を生成します。適宜、使い易いように切ったり貼ったり変換して使っていただければと思います。 また、誤字脱字、追加した方が良さそうな単語、注釈を使った便利機能のアイディアなどがありましたら、コメントやIssueをいただけると幸いです。(もちろん、Forkしたものをプルリクされても結構です!)

OpenCASCADE6.7.0でレイトレーシングレンダリングを有効にする

OpenCASCADE 6.7.0 ではレイトレーシング方式のレンダリングをサポートしている事を前回紹介しました。今回は、実際にコーディングをして試してみたものを紹介します。

前提

レイトレーシングレンダリングが何ぞや、というのは、この記事を読んでいる方なら既にお分かりだと思いますので割愛します。OCCTにおけるレイトレーシングの設定は、AIS コンテキストでも Viewer でもなく、View に付随しています。レンダリング、つまり見た目の設定なので、当たり前と言えば当たり前ですね。これは逆に言うと、同じViewerにぶら下がっているいくつかの View は、それぞれ別のレンダリング方式を設定することができるという訳です。 また、レイトレーシングをサポートした事により、それまでの方式と区別するためにOCCTでは次のようにモードとして呼称しています。

  • Raytracing Mode レイトレーシング・モード
  • Rasterization Mode ラスタライズ・モード(従来からあるレンダリング方式)

レイトレーシングがサポートされたことによって、従来からあるラスタライズ・モードが使えなくなるわけではありません。バージョン6.7.0以前のコードも(見た目まわりに関しては)レイトレーシング・モードのサポートによって書き換えの必要はなく、そのままで従来方式のレンダリングでの表示が可能です。

使い方

では、実際にコードを見てみましょう。

void OCCViewer::initViewAppearance(bool is_raytracing, bool is_shadow, bool is_antialias, bool is_reflection)
{
    if (is_raytracing) { // Enable ray tracing mode
        view->SetRaytracingMode();
        view->EnableGLLight(Standard_True);
        is_shadow     ? view->EnableRaytracedShadows()      : view->DisableRaytracedShadows();
        is_antialias  ? view->EnableRaytracedAntialiasing() : view->DisableRaytracedAntialiasing();
        is_reflection ? view->EnableRaytracedReflections()  : view->DisableRaytracedReflections();
    }
    else { // OpenGL rasterize rennaring mode
        view->SetRasterizationMode();
    }
    // ...
}

これは私が開発しているナンチャッテCADビューアー「siren」のソースコードの一部です。レイトレーシングレンダリングを有効にするには、新たに用意されたメソッド呼び出すだけで済み、非常に簡単です。 解説しなくとも書いてあるとおりですが…一応ざっくりと紹介しておきます。

V3d_View::SetRaytracingMode() Viewをレイトレーシングモードに設定します。

V3d_View::SetRasterizationMode() Viewを従来(ラスタライズした形状をOpenGLに投げて描画する)方式に設定します。

V3d_View::EnableRaytracedShadows() / DisableRaytracedShadows() レイトレーシングによる影の表現(陰ではない)を有効・無効にします。

V3d_View::EnableRaytracedAntialiasing() / DisableRaytracedAntialiasing() レイトレーシングモードの時、アンチエイリアスをかけたレンダリングを有効・無効にします。

V3d_View::EnableRaytracedReflections() / DisableRaytracedReflections() レイトレーシングモードの時、形状の鏡面反射を有効・無効にします。反射率は AIS_Shape に関連付けされたマテリアル(材質)によって変化します。

これらのメソッドをViewの初期化時に呼んでやれば、レイトレーシングによるレンダリングを行います。すべてのオプションを有効にすると、次のように描写されます。  

occt670-raytracing-sample

球と面を配置して、材質設定を「金」にしただけですが、綺麗ですね!  

やっぱり重い

私の作業PC(NVIDIA NVS 3100M)ではお世辞でも快適とは言えないくらい動作が遅くなってしまいました。とは言うものの、リアルタイムでレイトレーシングレンダリングをしているわけですから、昔のPCに比べれば、対話的に視点を回転できるだけでもびっくりです。弟の作業PC(もっと良いグラボを積んでます)でレイトレーシングモードを有効にしたところ、少ない形状数であれば、ほぼリアルタイムでぐりぐり動いているようです。 思いっきりハードウェアパワーに依存しているところですので、レイトレーシングモードの濫用は避けるべきだと思います。MayaやMAX、Blenderといった3D CGアニメーションソフトも、作業画面とレイトレーシングが有効にできるレンダリング画面は別になっていますし、用途に合わせて使っていければいいと思います。 レイトレーシングモードに絡んで、新しく追加されたGLGSベースのシェーダーとライトについては、次の記事で紹介したいと思います。