さようなら 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

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 キーバインドできました。快適すぎて涙が出てきそうです。

Debian GNU/Linux Squeeze の MOTD 周りのメモ

12月になったし、MOTD(5) をクリスマス仕様にでもしようかなと /etc/motd を修正しても上手くいかなかったのでメモしておきます。

Debian GNU/Linux の Squeeze サーバに対して SSH 接続すると、デフォルトの状態で「ターミナルログインとしての MOTD」と「PAM の MOTD」が二重に出力されてウザかったので、後者を無効にしていたら、いつの間にか MOTD が全く表示されなくなっていました。デフォルト挙動が変更されたのかな。

まずおさらい

Debian GNU/Linux Squeeze の MOTD は次のようになっています。

/etc/motd -> /var/run/motd
/etc/motd.tail

で、起動時に実行される /etc/init.d/bootmisc.sh にて

[bash]
uname -snrvm > /var/run/motd
[ -f /etc/motd.tail ] && cat /etc/motd.tail >> /var/run/motd
[/bash]

と毎度毎度、motd の中身を書き換えやがります。(/etc/motd または /var/run/motd に記載していた内容は、起動時毎にぶち消されてしまいます。)

永続的なメッセージは /etc/motd.tail に記載せよ、という意図でしょうね。それに従って、表示させたい motd テキストを /etc/motd.tail に記載しておきます。

PAM の設定

本来の motd 表示がどのプロセスで表示されているのかは知りませんが、少なくとも PAM による認証時、pam_motd.so を有効にしておくと motd を吐いてくれます。ちなみに PAM とは、Pluggable authentication module の略で、UNIX 系 OS の共通認証システムの API です。アプリケーションの機能が、一部、特権を必要とする処理を行いたい場合、PAM の API を叩くだけで認証周りの面倒を見てくれる便利な API ですね。SSHD の認証システムにもこの PAM が利用されています。

/etc/pam.d/sshd の次の行のコメントアウトを外しました。

[bash]

Print the message of the day upon successful login.

session    optional     pam_motd.so # [1]
[/bash]

また

[bash]

Print the status of the user’s mailbox upon successful login.

session    optional     pam_mail.so standard noenv # [1]
[/bash]

の部分は、コメントが書いてあるとおり、ログイン成功時にメールボックスのメール件数を表示するモジュールです。

2013-07-23 追記

Wheezy にアップグレードした時からか、いつの間に MOTD が二重表示されるようになりました。
今回は、/etc/ssh/sshd_config の次の部分を変更し、sshd をリスタートすれば二重表示されなくなりました。

[bash]
– PrintMotd yes
+ PrintMotd no
[/bash]

Wheezy では、確認してみたところ bootmisc.sh の起動時毎に上書きする処理や motd.tail がなくなっていますね。ほとんど意味がない上に、ユーザを混乱させるだけだったから廃止されたかな。

ライブラリを作成、使用する(Windows編)

先日、覚え書きとして「ライブラリを作成、使用する」を書きましたが、同じ事を Microsoft Windows と Microsoft Visual Studio で行うためのメモです。

環境は Microsoft Windows 7 Professional 日本語版 32bit / Microsoft Visual Studio 2010 Professional です。

Linux では共有ライブラリと静的ライブラリでしたが、Windows の世界ではダイナミックライブラリ(.dll)と 共通オブジェクトファイル COFF(.lib)があるようです。後者は、Microsoft の文書中で「COFF形式の標準ライブラリ」とも表記されていますが、C 標準ライブラリとは無関係で、Linux で言う静的ライブラリの事を指すようです。

                       | Linux              | Windows
標準コンパイラ         | gcc                | cl.exe
オブジェクトファイル   | .o                 | .obj
静的ライブラリ         | .a                 | .lib
共有ライブラリ         | .so                | .dll
インポートライブラリ   |                    | .lib
エクスポートライブラリ |                    | .exp
エクスポート定義       | GCC version script | .def
ライブラリ検索パス     | 可変               | 強制
バージョン管理         | 環境変数、リンク   | Side by Side

DLL だけでも、レギュラー DLL、MFC に静的リンクしたレギュラー DLL、MFC に動的にリンクしたレギュラーDLL、MFC 拡張 DLL、COM をサポートした DLL(OLE/ActiveX/COM+)、Microsoft .NET Framework 向けのマネージド DLL など、様々な種類や実装方法があるようですが、最も純粋なレギュラーDLLをベースに書きたいと思います。

作業に取り掛かる前に、開発環境に必要な環境変数を定義する必要があります。Visual Studio をインストールすると、環境変数「VS100COMNTOOLS」が定義されます。これは名前のとおり、Visual Studio 2010 の共通ツールへのパスが定義されています。標準では「C:\Program Files\Microsoft Visual Studio 10.0\Common7\Tools」というパスになっているはずです。Visual Studio 2008 や 2005 でも VS**COMNTOOLS という環境変数が定義されるはずですので、読み替えればOKだと思います。

コマンドプロンプトを立ち上げ、次のようにタイプします。

> "%VS100COMNTOOLS%\vsvars32.bat"
 Setting environment for using Microsoft Visual Studio 2010 x86 tools.

これで開発に必要なツールに PATH が通り、開発ができるようになります。(なお、%VS100COMNTOOLS% には標準で空白文字が含まれているので、上記のようにダブルクォートで囲ってあげないと、変数展開後にパスを見失なってしまうので注意が必要です。vsvars32.bat で定義された環境変数の寿命は、コマンドプロンプトのセッション内ですので、コマンドプロンプトを一度閉じてしまったら、再度、上記のコマンドを実行する必要があります。)

前回と同様、サンプルとして次の func.c を準備します。

[cpp]
int add(int a, int b)
{
return a+b;
}
[/cpp]

二つの整数値を足して、その値を返すだけの簡単な関数 add() を定義しています。

オブジェクトファイルの静的リンク

前回と同様、Microsoft の C コンパイラ cl.exe も -c オプション(コンパイルのみ)をサポートしています。 Microsoft 流儀で言うと /c オプションとなりますが、このオプションはハイフン(-)でもスラッシュ(/)でも通るようです。実際に func.c をビルドすると、静的ライブラリ func.obj が作成できます。gcc では func.o ですが、拡張子が DOS 風に3文字となっています。

> cl -c func.c
 Microsoft(R) 32-bit C/C++ Optimizing Compiler Version 16.00.30319.01 for 80x86
 Copyright (C) Microsoft Corporation.  All rights reserved.

 func.c

Microsoft の著作権情報は /nologo オプションで非表示にすることができます。コマンドラインが長くなりますが… :(

呼び出し元から静的リンクするには、次のように一緒にビルドするだけです。ここはほとんど gcc と変わりませんね。

> cl /out:app.exe app.c func.obj
 Microsoft(R) 32-bit C/C++ Optimizing Compiler Version 16.00.30319.01 for 80x86
 Copyright (C) Microsoft Corporation.  All rights reserved.
app.c
 Microsoft (R) Incremental Linker Version 10.00.30319.01
 Copyright (C) Microsoft Corporation.  All rights reserved.
/out:app.exe
 app.obj
 func.obj
> .\app.exe
 a+b=8

gcc の -o オプションは cl だと /out: になります。省略すると、最初に指定されたファイル名に拡張子 exe をつけたものを吐いてくれますが、ビルドするファイルが多い場合や処理を自動化した場合、予期せぬファイル名を自動的につけて出力する危険性があるので、/out: オプションはなるべく省略しない方がいいと思います。

ちなみに、コマンドプロンプトから実行ファイルの指定を確実にするには、

> .\app.exe

と相対パスで実行する方が無難でしょう。

ダイナミックリンクライブラリを動的リンク

共有ライブラリのようなものとして、ダイナミックリンクライブラリ(DLL)という実装があります。これは、前回の Linux と gcc をやった時のようにコンパイルオプション一つ変更するだけで完成する訳ではなく、専用の記述やファイルを準備しなければなりません。

func.c を次のように修正します。

[cpp]
__declspec(dllexport)
int add(int a, int b)
{
return a+b;
}
[/cpp]

__declspec(dllexport) が関数宣言の前につきました。これは、ライブラリが公開する関数を制御する為に用いられるものらしいです。前回に比べればちょっと面倒くさいですが、そういうものらしいです。

これをビルドします。

>cl /LD func.c
 Microsoft(R) 32-bit C/C++ Optimizing Compiler Version 16.00.30319.01 for 80x86
 Copyright (C) Microsoft Corporation.  All rights reserved.

 func.c

 Microsoft (R) Incremental Linker Version 10.00.30319.01
 Copyright (C) Microsoft Corporation.  All rights reserved.

 /out:func.dll
 /dll
 /implib:func.lib

 func.obj

 ライブラリ func.lib とオブジェクト func.exp を作成中

オプションは /LD です。大文字・小文字を判別しますので注意してください。上手くビルドされると、4つのファイルが生成されます。

 func.dll ... DLL ファイル。
 func.exp ... エクスポートライブラリ。循環参照の解決に用いられるらしい。
 func.lib ... インポートライブラリ。外部から DLL を参照する際に用いられる。
 func.obj ... オブジェクトファイル。

これで DLL ファイルが完成しました。

次は、DEF ファイルを用いて作成してみます。DEF ファイルを用いると、オリジナルのソースコードをライブラリ化の為に変更しなくていいので、func.c を最初のサンプルのように戻します。

[cpp]
int add(int a, int b)
{
return a+b;
}
[/cpp]

そして func.def という新しいファイルを作成し、下記のように入力します。

LIBRARY    func
EXPORTS
     add @1

add 関数を序数1で「エクスポート(つまり公開)」する、という意味らしいです。

DEF ファイルを用いてビルドするには次のコマンドを実行します。

>cl /LD /DEF:func.def func.c
 Microsoft(R) 32-bit C/C++ Optimizing Compiler Version 16.00.30319.01 for 80x86
 Copyright (C) Microsoft Corporation.  All rights reserved.

 func.c

 Microsoft (R) Incremental Linker Version 10.00.30319.01
 Copyright (C) Microsoft Corporation.  All rights reserved.

 /out:func.dll
 /dll
 /implib:func.lib

 func.obj

DEF ファイルが、gcc でいうバージョンスクリプト的なものなら、なんとなく理解できる仕様です。ソースコードと DEF ファイルの管理が煩雑にならないか注意する必要がありますね。

さて、生成された DLL ファイルを利用するには、app.c も改変します。

[cpp]

include <stdio.h>

__declspec(dllimport) int add(int, int);
int main()
{
printf("a+b=%d\n", add(3, 5));
return 0;
}
[/cpp]

dllimport がついた関数宣言を追加しました。ただし、前回と同様に必須ではなく、MSDNでの解説曰く

__declspec(dllimport) を使用しなくてもコードは正しくコンパイルされますが、使用した方がコードがより洗練されます。__declspec(dllimport) を使うと、ある関数が DLL 内にあるかないかをコンパイラが判断できるようになり、その結果、コードでは通常 DLL の境界を越える関数呼び出し内に存在する間接操作のレベルをスキップできます。ただし、DLL 内に変数をインポートするには、__declspec(dllimport) を必ず使用する必要があります。

との事です。

さらにビルド時には、インポートライブラリを渡してやらなければなりません。func.lib を指定していますが、この場合は共通オブジェクトファイルとは全く別のものなので注意が必要です。

> cl app.c func.lib
 Microsoft(R) 32-bit C/C++ Optimizing Compiler Version 16.00.30319.01 for 80x86
 Copyright (C) Microsoft Corporation.  All rights reserved.

 app.c

 Microsoft (R) Incremental Linker Version 10.00.30319.01
 Copyright (C) Microsoft Corporation.  All rights reserved.

 /out:app.exe
 app.obj
 func.lib

 E:\tmp>app.exe
 a+b=8

これで実行バイナリ app.exe が生成されます。
ちなみに、インポートライブラリを使わずに DEF ファイルを用いて「インポート」する方法もあるらしいです。

ダイナミックリンクライブラリを動的ロード

1979年のOS『Version 7 UNIX』を使う

Version 7 UNIXとは、DECのPDP-11で動いていたUNIXです。AT&Tベル研究所製の初期のUNIXシリーズの直系のバージョンで、1979年にリリースされました。

V7は現在、フリーソフトウェアとして公開されており、こちらからブートイメージを入手することができます。また、x86への移植活動もあり、VM用のディスクイメージが公開されていたりします。

古いUNIXを触ってみたくなったので、古いハードウェアをシミュレートしてくれるエミュレータ simh を導入して遊んでみることにしました。

下準備

まずは必要なものを揃えます。simh は、dpkg系のパッケージ管理システムを採用しているディストリビューション上で次のようにしてインストールします。

[bash]$ sudo aptitude install simh[/bash]

次に、V7のイメージをダウンロードし、解凍しておきます。

[bash]
$ mkdir /tmp/v7
$ cd /tmp/v7
$ wget http://ftp.fibranet.cat/UnixArchive/PDP-11/Boot_Images/v7_rl02_1145.gz
$ gunzip v7_r102_1145.gz
$ ls
v7_rl02_1145
$
[/bash]

設定

V7用の設定ファイルを書きます。

[bash]
$ cat > uv7
set cpu 11/45
set rl0 RL02
att rl0 v7_rl02_1145
set rl1 RL02
att rl1 rl1.dsk
att tm0 tm0.tap
boot rl0
$
[/bash]

4行目の最後のカラムに書いている「v7_r102_1145」は、ダウンロードして解凍したV7のディスクイメージです。

実行

さっそく実行してみます。ホスト側とゲスト側を区別する為、ホスト側には「host$」プロンプトを用います。

[bash]
host$ pdp11 uv7

PDP-11 simulator V3.8-1
Disabling XQ
Overwrite last track? [N]
@
[/bash]

最後のトラックを上書きするか?と聞かれましたが、とりあえず標準の「N」と答えておきました。この「@」プロンプトの場面はきっとPDP-11の組込みブートローダなんでしょう。ブートします。

[bash]
@boot
New Boot, known devices are hp ht rk rl rp tm vt
:
[/bash]

ブートデバイスを聞いてきますので、次のように入力します。

[bash]
rl(0,0)rl2unix
mem = 177856
#
[/bash]

プロンプトが「#」に変更され、シングルユーザモードでV7が使えるようになりました。ここで、C-dをタイプしてマルチユーザモードに移行します。

[bash]
Restricted rights: Use, duplication, or disclosure
is subject to restrictions stated in your contract with
Western Electric Company, Inc.
Thu Sep 22 05:50:55 EDT 1988

login:
[/bash]

見慣れたログイン画面が登場しました。とりあえずrootでログインします。パスワードは「root」です。

[bash]
login: root
Password:
You have mail.
#
[/bash]

無事、ログインすることができました。

シェルの使い方

[bash]

stty

speed 300 baud
erase = ‘#’; kill = ‘@’
even odd -nl echo -tabs
[/bash]

sttyコマンドを実行してみると、古いUNIX入門の本にあるように、訂正は「#」記号、破棄は「@」記号にバインドされているようです。
バックスペースなどはかなり基本的な画面制御文字だと思うんですが、テレタイプ端末も現役で動いていた当時の事情を考えると、ビデオ表示端末のような書き換え可能な表示媒体をもつデバイスにしかできない「バックスペース」ではなく、より多くのデバイスに可能な「#」による訂正の方が都合が良かったんでしょう。
実際にタイプした文字を訂正するには、以下のようにします。

[bash]
la#s
[/bash]

これは「ls」を間違って「la」とタイプしてしまったので、「#」で直前の1文字を訂正して、正しい「s」をタイプしたところです。「la#s」でシェルには「ls」と解釈されます。また、

[bash]
pqd##wd
[/bash]

「pwd」を「pqd」とタイポした場合、「##」で2文字訂正して、正しい「wd」をタイプすることにより、「pwd」と解釈されています。

現在の入力を全て破棄するには、

[bash]asdf@[/bash]

のように、「@」記号を用いれば破棄されて新しいプロンプトに移ります。

終了

haltもshutdownコマンドも入っていない為、simh側から終了させます。ファイルシステムに変更を加えた場合、デバイスとの同期をとるためにsyncコマンドを打ちます。

[bash]# sync;sync;sync[bash]

次に、C-eをタイプしてsimhのコンソールに移行します。

[bash]
Simulation stopped, PC: 002306 (MOV (SP)+,177776)
sim> exit
Goodbye
host$
[/bash]

ここで、「exit」とタイプすると終了することができます。

man pageを見れるようにする

初期状態では/tmpが存在しない為、manページを表示しようとすると次のように怒られます。

[bash]

man sh

Cannot create temp file.
[/bash]

そこで、/tmpを作成しておきましょう。

[bash]

mkdir /tmp

chmod 777 /tmp

man sh

[/bash]

これでmanページが見れるようになりますが、ページャが入っていません。やはりビデオ表示端末向けのツールは、まだ充実していないようですね。

ユーザの追加

初期状態では、ユーザ情報は次のとおりになっています。

[bash]

cat /etc/passwd

root:VwL97VCAx1Qhs:0:1::/:
daemon:x:1:1::/:
sys::2:2::/usr/sys:
bin::3:3::/bin:
uucp::4:4::/usr/lib/uucp:/usr/lib/uucico
dmr::7:3::/usr/dmr:
[/bash]

シャドウ・パスワードが登場する前なので、/etc/passwdに素直に(ハッシュ化された)パスワードが記載されていますね。7行目の「dmr」というユーザ名は、先日逝去されたUNIXの開発者デニス・リッチー博士の愛称です。実際に運用されていた頃からデフォルトで入っていたのかもしれませんが、そうでなくとも、フリーソフトとして公開される際に、彼に敬意を称して追加されたのかもしれません。

[bash]

echo dyama::8:3::/usr/dyama: >> /etc/passwd

[/bash]

畏れ大くも、dmr博士の次にアカウントを追加してみました。さらにホームディレクトリも設定します。

[bash]

cd /usr

mkdir dyama

chown dyama dyama

ls -l

total 11
drwxrwxr-x 3 bin 128 Sep 22 05:45 dict
drwxrwxr-x 2 dyama 32 Sep 22 06:18 dyama
drwxrwxr-x 5 bin 416 Sep 22 05:46 games
drwxrwxr-x 3 sys 496 Sep 22 05:42 include
drwxrwxr-x10 bin 528 Sep 22 05:43 lib
drwxrwxr-x11 bin 176 Sep 22 05:45 man
drwxrwxr-x 3 bin 208 Sep 22 05:46 mdec
drwxrwxr-x 2 bin 80 Sep 22 05:46 pub
drwxrwxr-x 6 root 96 Sep 22 05:45 spool
drwxrwxr-x13 root 208 Sep 22 05:42 src
#
[/bash]

当時のファイルシステム階層では、ユーザのホームディレクトリは/homeではなく、名前のとおり/usrに格納されていたと古い本で読みました。慣例に習って設置しました。

一度、C-dをタイプしてログアウトします。

[bash]
#
login: dyama
$
[/bash]

「login:」と出てきたので、先ほど追加したユーザ名「dyama」をタイプします。パスワードを設定していない為、聞かれることなく一般ユーザプロンプト「$」が表示されました。
エミュレータ上のアカウントなのでこのままでもいいんですが、とりあえずパスワードを設定します。

[bash]
$ passwd
Changing password for dyama
New password:
Retype new password:
[/bash]

これでパスワードが変更されたはずです。試しに「hogehoge」と入力しています。

[bash]
$ su
Password:

cat /etc/passwd | grep dyama

dyama:7N.C0KCSdg3aI:8:3::/usr/dyama:
#
[/bash]

パスワードカラムに、ハッシュ化されたパスワード文字列が追加されたことが分かります。

Cプログラムを書いてみる

ccが入っていますので、C言語でプログラムを組むこともできます。ビジュアル・エディターが入っていない為、catコマンドで標準入力からダイレクトにファイルを書いていきたいと思います。

先に述べましたとおり「#」記号が訂正にバインドされているので、まずは#を正しく入力できるように設定を変更してあげます。

[bash]
$ stty erase ?
$ stty
speed 300 baud
erase = ‘?’; kill = ‘@’
even odd -nl echo -tabs
$
[/bash]

sttyコマンドで訂正を「#」から「?」に変更しました。続いてコーディングです。

[bash]
$ cat > test.c

include <stdio.h>

int main()
{
printf("hello, world\n");
return 0;
}
$ cat test.c

include <stdio.h>

int main()
{
printf("hello, world\n");
return 0;
}
[/bash]

コーディングができたら、catで確認してみてください。訂正が「?」になっていれば、プリプロセッサの「#include」は正しく入力できているはずです。

[bash]
$ stty erase #
$ stty
speed 300 baud
erase = ‘#’; kill = ‘@’
even odd -nl echo -tabs
[/bash]

忘れないうちに訂正を「#」に戻しておきます。
あとは、ccコマンドでコンパイルを行なって出力されたファイルを実行します。

[bash]
$ cc test.c
$ ls
a.out
test.c
$ ./a.out
hello, world
$
[/bash]

上記のように「hello, world」が表示されたら成功です。

NEC LaVie LightのUbuntuをアンインストール

先日、実家に帰った際、妹がパソコンを欲しいと言ってきたので、それならばと以前メインで使っていたネットブックをお下がりすることにしました。

ネットブックは NEC LaVie Light BL330。タブレットPCが流行する前の、各社が競ってネットブックを出していた頃の機種です。当時の Microsoft の OS 提供ライセンスの関係に基づいてハードウェア仕様に制限をかけてあるらしいので、当時としてもあまり高いスペックではありません。(逆に言うと、その頃に登場した主力メーカーのネットブックはほぼ Windows XP を搭載していたので、どのメーカーのものでも軒並、似たようなスペックでしたが…)

低スペックとは言えど、ちゃんとチューニングをしてあげれば、メールやインターネットは難なく行えると思います。妹は我が家でも一番コンピュータ関連に疎いライトユーザなので、このくらいのスペックでも問題ないでしょう。

今年の5月に、マウスコンピューター製の 4 万円ほどのラップトップを購入して、3万5000円で購入した LaVie Light から移行したのですが、新しい環境は

  • 画面がちょっと広い
  • スペックがちょっと高い

以外は、ほとんど魅力を感じませんでした。LaVie Light の方が、筐体がしっかりしているし、コンパクトで持ち運びにも便利。マウスコンピューター製のラップトップは、筐体の底に手をあてがって普通に持つと、底のプラスチックが自重で歪むのか、中のファンが筐体に擦れる音がなります。どんだけ筐体薄いんだよ、と思いました。筐体が全ての箇所において安っぽいのはさておき、画面がめちゃくちゃ悪く(素人目で分かるほど発色が違い、他のディスプレイで判別できる色の差がこのラップトップで表示すると判別できない、薄い色は飛び、暗い色は潰れる…など。カラープロファイルとかソフトウェア的な調整をしてみたけれど変わらず。)、絵を描いたり、画像処理をする用途にはまったく向いていませんでした。ここは、かなり凹んだと同時に、なんだかんだ言いつつ、結局日本製が安心だなと思いました。

ともあれ、メイン環境は既にマウスコンピューターのラップトップに移行済みでしたので、LaVie Light は寝室の枕元で本と一緒に並んでいました。LaVie Light には Ubuntu を入れて使っていたので、プリインストールされていた WindowsXP に戻したいと思います。

ディスク構成

LaVie Light を購入した直後は、以下のようになっていたと思います。

基本領域1Cドライブ(NTFS) 論理領域1Dドライブ(NTFS) 基本領域2リカバリ領域(FAT32)
拡張領域

物理ディスクは内蔵のSATA一つだけ。MBRにはNTローダが鎮座しており、初期値で基本パーティション1のCドライブを起動するようにしてありました。基本パーティション2のリカバリ領域は、リカバリCD-ROMが付属していない為、ハードディスクにその領域を確保してあるようで、リカバリイメージのほか、リカバリ・ウィザード表示の為の簡易Windows(MiniNT、Windows PE みたいなものらしい)一式とシマンテックのGhostが入っていました。

Ubuntuをインストールした際、リカバリCD-ROMもないと言うことで、リカバリ領域だけは残して、次の構成でインストールしました。

基本領域1swap 基本領域2/boot (ext2) 基本領域3/ (ext3) 基本領域4リカバリ領域(FAT32)

余談ですが、最初はUSB CDドライブを接続してDebian GNU/Linuxをインストールしたのですが、カーネルモジュール(ドライバ)周りを整えるのに心が折れてしまったので、オールインワンなUbuntuにしてしまいました。MBRにはgrub2、ブートエントリには/bootに入ってるカーネルと、自動認識されて追加されたリカバリ領域の2種類がありました。

さあ、この状態からWindows XPに戻します。

修復ウィザードを実行

LaVie Lightの電源を入れ、grubが起動したらリカバリ領域から起動させます。すると、MiniNTが起動して、GUIな修復ウィザードが起動します。ウィザードに従ってハードディスクをフォーマット後、リカバリするようにしました。元通りにしたいので、以下のような構成ですね。(ドライブを細分化する必要もないので、Dドライブは基本パーティションに格上げしました)

基本領域1Cドライブ(NTFS) 基本領域2Dドライブ(NTFS) 基本領域3リカバリ領域(FAT32)

ハードディスクのフォーマットを終えると、一旦再起動するように促されます。手順に従い、再起動させました。

すると、BIOS画面を過ぎた後、ブートローダが起動すべき場所で

[bash]Grub Error (22)[/bash]

と出てOSを起動することができません。半ば予想はしていたのですが、それでも淡い期待をしつつ修復ウィザードに任せた自分がバカでした。

リカバリ領域の修復ウィザードは、MBRまで修復(fixmbr)してくれないみたいです。

grubよ、そりゃあ/boot/grub/grub.cfgが消えてるんだからエラー吐くよね。お前は悪くない。自分のようにカスタマイズして使わない場合でも、マイクロソフトの回復コンソール(とfixmbr/fixbootなど)が起動するCD-ROMはないのだから、MBRが壊れたらマズいんじゃないの…。リカバリ領域を起動できた→つまり、MBRは修復しなくても大丈夫なんだろ?という発想なのかもしれません。

Trisquel GNU/Linuxで起動

さて、どうしたものかと思ったものの、とにかく起動できないのでは手の施しようもないので、ちょうど手元にあったフリーソフトウェア財団のカード型USB KeyをLaVie Lightに差して起動しました。中にはTrisquel GNU/Linuxがプリインストールされています。手元にこういうツールがあったら本当に便利ですね。コイツには何度も助けられています。

USBブートしたTrisquel上で、

[bash]sudo grub-install /dev/sda[/bash]

しても、まあナンセンスだろうと思い、マニュアルで色々するよりは、Trisquelをハードディスクにインストールして、その際に他のパーティションにあるWindows領域のブートエントリまで拵えてくれるくれる方が確実だろう、と、インストールを実行することにしました。

基本領域1Cドライブ(NTFS) 基本領域2Cドライブ(NTFS) 論理領域1/ (ext3) 論理領域2swap 基本領域3リカバリ領域(FAT32)
拡張領域

基本パーティション2を縮めて、空いた領域に論理パーティションを作成、その中に / と swap を確保しました。インストール後、再起動すると見事にgrubが復活してくれました。

基本パーティション1のCドライブのブートエントリも入ってるかなーと、またも淡い期待をしていましたが、論理パーティション1のTrisquelと基本パーティション3のリカバリ領域のエントリしかありませんでした。

というのも、Trisquel側から基本パーティション1をマウントして分かったのですが、Cドライブの中には設定ファイルが一つ入っているだけで、ほぼ空の状態でした。修復ウィザードがMBRを修復することなくハードディスクをフォーマットして再起動した時点では、まだリカバリイメージの展開が行われていなかったことをここで知りました。

リカバリ処理の続きを再開

それならブートエントリが自動的に追加されていなくて然り、この続きの手順が分からないままでしたが、とりあえずgrubが復活してリカバリ領域を起動できるようになったので、起動してみました。すると、今度は修復ウィザードではなくシマンテックのGhostが起動し、ユーザの入力を待たずしてインジケータバーを動かし始めました。あ、ようやくリカバリイメージの展開を始めたな。10分ほど待つとCドライブへの書き込みが終わったようで、自動的に再起動しました。

ここで、MBRも書き換えてくれたかなあ、と半ば諦め気味に起動画面を見ていたのですが、やはりgrubのままでした。ブートエントリはもちろん変わらず。Cドライブのリカバリイメージだけだから、ブートレコードはリカバリイメージに含まれていても、マスターブートレコードまではリカバリの対象外なんでしょうね。

さて、確実にリカバリイメージの転送は終わっているので、Cドライブは起動可能な状態になっているはずです。残るはMBRを戻したいのですが、まずはCドライブから起動できないと話しにならないので、起動してみることにしました。

Grubの設定

Trisquelでインストールされるgrubは、初期設定でパスワードが設定されていました。grubのブートエントリ選択画面でeキーを押しても、起動コマンドの編集の前にユーザ名とパスワードを求められ、編集することができません。

一旦、Trisquelを起動して

[bash]sudo less /boot/grub/grub.cfg[/bash]

してみると、ユーザ名「grub」、パスワード「12953」と設定されていることが分かりました。再起動して、grub画面でこれらの情報を入力すると、コマンドの編集画面に辿りつきました。Windowsのブートコマンドの書き方は知らないので、リカバリ領域に入ったMiniNTのものを変更して用いることにしました。

[bash]insmod fat
set root='(hd0,3)’
search –no-floppy –fs-uuid –set d8fe-92a4
drivemap -s (hd0) ${root}
chainloader +1
[/bash]

1行目はFATじゃなくてNTFSに変更、(hd0,3)はマスターに接続されたディスクの3つめのパーションってことだろうから、(hd0,1)に変更。searchの行は、ディスクを探されるとかえって面倒なので削除して、次のようにしました。

[bash]insmod ntfs
set root='(hd0,1)’
drivemap -s (hd0) ${root}
chainloader +1
[/bash]

C-xを押して起動してみると、ようやくCドライブを起動することができました。WindowsXPの初期設定画面が出てきます。その後、Windowsの初期設定→NECのプリインストールされているソフトの本当にどうでもいい初期設定で4回ほど再起動しやがりました。その度にgrub起動時のパスワード入力からエントリの書き換えまでやりました。Cドライブの起動コマンドをブートエントリに登録しとけばよかったんですが、「1回再起動したらWindowsの初期設定も終わるし、すぐにfixmbrできるだろう」と思ったのが間違いでした。ハードは最高なのにソフトがダメっていう典型的な日本企業のアレですね。本当にどうでもいい初期設定を繰替えしました。

fixmbrはどこ?

WindowsXPに戻せたとは言え、MBRがgrubのままなのでNTローダに差し替える必要があります。回復コンソールが起動できるようなリカバリCD-ROMはないし、リカバリされたWindowsXPにも、もちろんfixmbr.exeは入っていません。Microsoftの公式配布も起動用フロッピーやCDイメージばかりで、あまりこのご時世に合ったサポートは得られそうにありませんでした。そもそもこんな基本的なツールも同梱してないとは…と閉口しつつも、太陽が昇り始めていたので本日の作業はここまでということにしました。

NTローダを諦めれば、Trisquelをもう一度立ち上げて、grubのブートエントリにCドライブのみにして、自動起動までの時間を短くしておけばいいかなあ、と思っています。

NEC LifeTouch NOTE with SKK for Android IS01 ed. その2

NEC LifeTouch NOTE に、SHARP IS01 のハードウェアキーボード向けにカスタマイズされた SKK for Android をインストールし使ってみた感想を書きましたが、作者の ray_m さんにコメントを頂き、修正を施したとの事だったので、早速使ってみました。

修正がほどこされた点をかいつまんで紹介します。

  • Shift キー押下しっぱなしでの連続入力に対応。修正前のバージョンでは、「入れる」と入力する際、タイプでは「IReru」となりますが、I と R を Shift キーを押しっぱなしにして連続で入力する事が出来ませんでした。( Shift+i、Shift+r の間で、Shift キーを”離す”必要があった。) ray_m さんによると、IS01 のタイプ方法をベースに作成されていた為という事でそれを受けてすぐに修正して頂きました。LifeTouch NOTE は持ってらっしゃらないようなのに、迅速に修正して頂けるなんて頭が下がるばかりです。

IS01 の特殊キーは、同時押しではなく、キーを押した次のキーに作用するように出来ています。 これは QWERTY ハードウェアキーボードを搭載していても、サイズ自体が小さい為、同時押しがしづらい物理的な問題に対処するものだと考えられます。例えば、IS01 で大文字の ‘A’ を入力する場合、Shift キーを押した上で、( 押しっぱなしにしても、離してしまっても、Shift 押下状態が続くので、その直後に ) a キーを押す事によって入力する事が出来ます。自分の IS01 は電話専用機になってしまっているので、SKK を導入する必要はないですが、LifeTouch NOTE や Dynabook AZ のようなネットブックに匹敵するサイズの QWERTY キーボードを搭載している Android 端末上では、SKKer にとって、キラーアプリになるくらい外せないアプリになっています。

  • z キーでの記号入力に対応。カタカナ入力モードのトグルキーである q キーや、半角英数モードにする l キーは以前から利用出来ていましたが、日本語でよく利用する記号を 2 タイプで呼び出す z キー機能がありませんでした。これ自体はクリティカルに SKK の使い勝手を落とすわけではないのですが、新しいバージョンではサポートされるようになりました。これで、『』~・…‥←↓↑→ といった記号を 2 タイプで入力する事が出来ます。
  • 一時的に半角英数を入力する際、▽の表示に対応。ちょっと細かな話ですが、/ キーを押して一時的に半角英数文字をタイプする際に、最初の 1 文字を入力するまで、SKK による入力中である事を示す▽が出てきませんでした。最新版では、これもちゃんと出ている模様で、/ キーを押した状態で「えーと、スペルどうだっけ」と一瞬ディスプレイから目を離した時に、再度、/ キーを押してしまって「▽/」という入力状態にならなくなりました。
  • 通常の Android 端末にはまず付いていないであろう Delete キーは、LifeTouch NOTE 専用のテキストエディタである「ライフノート」では、IM がオンの状態でも使う事が出来ます。コピー C-c、ペースト C-v、カット C-x、アンドゥ C-z、全選択 C-a などのライフノート・ショートカットキーを使うにはは、IM をオフにする必要があります。

前回の記事は、SKK for Android をインストールしたその夜に使い勝手を調べながら書いたものですが、それから 1 ヶ月以上使ってみて、ますます満足しています。残すは変換候補の表示位置のみといったところでしょうか。

LifeTouch NOTE は、せっかく左にある Menu キー( IBM-PC キーボードで言う CapsLock の位置 )を Ctrl キーに変更する設定項目まで搭載してくれているのに、Android 自体の仕様が全体的に Ctrl キーをサポートしていないのが残念な限りです。自分に課題を出すとすれば、確定 C-j やキャンセル C-g を多用している SKKer としても、”C” になるキーを指定させてそれらをサポートしたいところです。

2011/09/23 追記

ray_m さんから新しいバージョン 1.4 のご連絡があり,早速試してみると,変換候補の表示位置がずれてしまう現象が解消されたようです.

また,上の記事には書いていませんでしたが x キーによる小文字(っ,ぁ,ぃ,ぅ …など)にも今回のバージョンから対応しているようで,使用感はほとんど Emacs や SKKIME と変わらなくなっています.

さらに SKK 使いでフルキーボードを搭載している Android 端末ユーザには,離せないアプリになっていると思います.

※ 2020/07/02 度重なるブログ移転・ブログシステムのアップデートにより崩れた記事を校正。

DEC PDP-10のOS、TWENEX(TOPS-20)を使ってみた。

1. TWENEX とは

TWENEXとは、DECが開発したTOPS-20というPDP-10用オペレーティングシステムの俗称で、1970年代から1980年代前半にかけて、ミニコンピュータ界で成功を収めたソフトウェアです。

続きを読む DEC PDP-10のOS、TWENEX(TOPS-20)を使ってみた。