2014年3月13日木曜日

ArchLinux + XfceでもシステムヴォイスをCV:丹下桜に

最近知りましたが,Linux-HA JapanさんがUbuntuやCinnamon用にサウンドテーマを公開しているようです. リンク

Ubuntu用,とはありますが,/usr/share/sounds/に配置する形のフォルダ構造/ファイル名で,
実はこれFreeDesktop.org準拠なデスクトップ環境ならだいたい使えるはずです.

ということでこれをXfceで使ってみようというのが今回の趣旨です.
CV:丹下桜さんですよ! ゴウランガ!

はじめに
@lindwurm_ さんがブログでUbuntuやCinnamon用に設定方法をブログで紹介されております.
該当する環境の方はそれを参考にすると良いでしょう.
http://blog.lindwurm.biz/2013/07/use-sound-theme.html
http://blog.lindwurm.biz/2013/12/cinnamon-sounds-setting.html

Ubuntuを使用していてもXubuntuユーザーならこっちの記事が参考にできるかもしれません.

だうんろ〜ど
記事冒頭で挙げたリンクからダウンロードしましょう

Xfceで使用するのはUbuntu用と書いてあるほうです.

そして,
$ sudo tar xvf kayo-theme.tar.gz -C /
 としてインストール.次は設定ですね

必要ソフトウェア
と,設定の前に必要なソフトウェアをインストールせねばなりません.
GUIでなにか行動した時,イベントサウンドを発行するのはLibcanberraです
また,このイベントサウンドを実際に再生するのは,SoXです
ちなみにSoXはplayというコマンドをつかってCUIで多種多様な音声ファイルを再生できる上に
CUIなのにレベルメーターが見れます.

インストールは,
$ sudo pacman -S libcanberra libcanberra-pulse libcanberra-gstreamer sox
でOK. PulseAudioを使わずにALSAしかつかってない人はlibcanberra-pulseなくて良し
なんのことかわからない人はとりあえずインストールしておきましょう.
もしかしたらlibcanberra*は既にインストールされているかもしれません.

設定

では設定です.まず,libcanberraを使うために環境変数をセットする必要があります.
export GTK_PATH=/usr/lib/gtk-2.0
export GTK_MODULES=canberra-gtk-module
とか言うのを.xprofileなり.bashrcなり.zshenvなり.zshrcなりに書いとけば良いと思います.
が,
ArchLinuxの場合
/etc/X11/xinit/xinitrc.d/40-libcanberra-gtk-module
で既に定義されているようなので上に挙げた2行はどこにも追加せず何もしなくて良い模様

私の場合AdobeAirを使用する関係上.zshenvでGTK_SESSION_ID環境変数を設定していたところ,
GTK_MODULESが設定されなくなっていたので自分で.zshenvに追加しました
(40-libcanberra-gtk-moduleを読むとわかると思います)

次にデスクトップ環境での設定です.(画像はクリックで拡大)
まずSetting Manager(設定マネージャ)を開きます

そしてAppearance(外観)を開きましょう


外観の中のタブで,Settings(設定)を選びます.


項目の下側にEnable event sounds(イベントサウンドを有効にする)というのがあるので,
このチェックボックスをオンにしましょう.
一度設定マネージャに戻って,


Settings Editor(設定エディタ)を開きます


xsettings > Net > SoundThemeNameの項目を見ると空っぽのはずですので,
そこにサウンドテーマの名前(今回はkayo)を書き込みます.
/usr/share/sounds/にあり,index.themeというファイルを持つフォルダのフォルダ名を
サウンドテーマの名前として使います.
デフォルトではfreedesktopというサウンドテーマが実は用意されています.

最後に

あとはログアウトしてからログインしなおすなり,再起動するなりすると後は
LinuxがCV:丹下桜に!

あとこのサウンドテーマのファイル名とフォルダ構造を参考にお好きなサウンドテーマを作って使ってみるのも良いのではないでしょうか.
おそらくWindows向けサウンドテーマも流用できるでしょう.

Q&A

Q. ログイン&ログアウトの音はないままなんだけど……

A. ログインは適当にスクリプトを用意して,
#!/bin/sh
play /usr/share/sounds/<サウンドテーマの名前>/stereo/desktop-login.ogg
あとはそれをログイン時に読み込むようにSession and Startup(セッションとスタートアップ)から設定してください.      ……ログアウト? がんばってください

Q.  ゴミ箱を空にした時とかの音がちゃんと出てない気がするんだけど

A. がんばって♡
libcanberraのソースコード
(https://gitorious.org/libcanberra/mainline/source/ac5ac9e486aa33f7be0cd9ddd315c03780676795:src/canberra-gtk-module.c#L40)
の40行目から列挙されてるTODOまでのファイル名以外の音声ファイルは確実に読み込んでくれるかどうかちょっと不確定っぽいです.

2014年2月15日土曜日

Windows7にServicePack1をインストールするのに2年ぐらい掛った話


2011年ごろにWindows7のServicePack1は配布されはじめたはずですが、
私はつい昨日にようやくインストールができました。

なんだか邪魔してるかもしれないWindows Updateの更新プログラムをアンインストールしてみたり
CheckSur.exeをインストールしてみたりと色々試したのですが結局それらは徒労でした。

次に問題解決手順をメモしときます。

ERROR_SXS_ASSEMBLY_MISSING(0x80073701)とかERROR_NOT_FOUND(0x80070490)で
インストール失敗してる人向け。

・日本MSの公式フォーラム

Windows Updateの再実行、SP1を手動ダウンロード/手動インストール、
そしてOSの再インストールと月並の回答しかありません。
これは参考にしないほうがよいかと……
http://answers.microsoft.com/ja-jp/windows/forum/windows_7-windows_install/windows-7-service-pack/8e219dd5-9080-4997-a2f4-7ccbf602ef78

・じゃあどうしよう

英語フォーラムや英語ブログで回答がいくつかありますが、最終的にこれらが功を奏しました。
ERROR_SXS_ASSEMBLY_MISSINGの解決方法
http://marcin.malkowski.eu/2011/03/02/windows-7-service-pack-1-error_sxs_assembly_missing/
ERROR_NOT_FOUNDの解決方法
http://beerpla.net/2011/05/06/how-to-fix-error_not_found-0x80070490-during-windows-7-sp1-installation/

・順を追って

ERROR_SXS_ASSEMBLY

まず、普通にインストールしようとしたら失敗してしまいます。
sfc /scannowというコマンドを管理者権限で行ないファイルの破損の有無をチェックしたりしても
問題解決はせず。
この時のエラーがERROR_SXS_ASSEMBLY_MISSING。

この場合、C:\Windows\Logs\CBS.logを参照します。
(管理者権限でないと開けないファイルなのでメモ帳などを管理者権限で開いてから、ファイルを開く→拡張子を「全てのファイル」に→C:\Windows\Logs\とアドレスバーに打つ→CBS.logを開くとすると良い)

最初にErrorが起ったときのログ
2011-02-25 20:31:49, Error                 CSI    000001a3@2011/2/25:23:31:49.483 (F) d:\w7rtm\base\wcp\componentstore\csd_locking.cpp(324): Error STATUS_SXS_ASSEMBLY_MISSING originated in function CCSDirectTransaction::LockComponent expression: (null)
の直上の行
2011-02-25 20:31:49, Info                  CBS    Exec: Resolving Package: Microsoft-Windows-Client-Drivers-Package~31bf3856ad364e35~x86~pt-BR~6.1.7601.17514, Update: INF_netrndis, PinDeployment: x86_netrndis.inf-languagepack_31bf3856ad364e35_6.1.7600.16385_pt-br_5a74a56194bd58af
に注目(この例は先に挙げたサイトより引用)。
ここで、Package: なんとか~x86~pt-BR~6.1.7 みたいに書いてある場所ありますよね。
この、pt-BRはロケールといいます。 Linux等を使用したことのある方には馴染があるかもしれません。

少々脱線してロケールについて説明すると、
これはpt(ポルトガル語)-BR(ブラジル)、ということでブラジルで使われるポルトガル語という意味です。
日本だとja-JPです(日本でほぼ公用語と呼べるのは日本語しかないのでjaしかないです)
 カナダだと公用語が英語とフランス語の2つあるので、en-CAとfr-CAといった具合です。


このロケールが指す言語の、Windows用言語パッケージが(何故か)インストールされていないとこのERROR_SXS_ASSEMBLY_MISSINGが発生します。なので、Windowsの表示言語にこの言語をインストールする必要がありますが、
UltimateやEnterpriseでないとインストールできなかったりしたはず(うろ覚え)
そういう時は http://www.froggie.sk/ からダウンロードして、インストールすると良いみたいです。
(公式のものかどうかわからないので、インストールして何かPCに問題が発生しても責任は取れません、自己責任です)

私の場合de-DE(ドイツ-ドイツ語)でエラーが出ていました。
ボリュームライセンスのEnterprise版のはずなのですが、なぜかドイツ語の言語パッケージはインストールできず先程のサイトからインストールしました。

あとはもう一度Windows7 Service Pack 1をインストールしなおせば良いです。
ちなみに、Windows Updateからインストールするより、インストーラをダウンロードしてきて
手動でインストールを試行したほうがダウンロードの手間が省ける上に速いのでラク。

ERROR_NOT_FOUND

これでインストールが無事終わり再起動に入るはずです。
このまま再起動を何回かしたりしてログイン画面になって、
ログイン終えてからインストール終了と出た方はおめでとうございます、あとは読まなくて良いです。

一回目の再起動の後にWindowsの再構成とかメッセージが出ているところでエラーが出て、
ログイン後にインストールに失敗しましたと言われることがあります。

この時ERROR_NOT_FOUNDと言われます(ました)。

その時は、またまたC:\Windows\Logs\CBS.logを参照してください。

Failed uninstalling driver updatesとか0x80070490 - ERROR_NOT_FOUNDとかで検索すると
いくつかログがヒットすればビンゴ
(何故か私の場合検索しても検索がヒットしませんでしたが、そのまま次の手順に進んでも
問題解決できました。なのでログがなくても次を試してみてください)

次はC:\Windows\inf\setupapi.dev.logを参照してください。
これは管理者権限でなくともメモ帳で開けます。

Failed to find driver updateと検索すると、
sto: Failed to find driver update 'C:\Windows\WinSxS\amd64_usbvideo.inf_31bf3856ad364e35_6.1.7600.16543_none_8a1a2513d42628c3\usbvideo.inf' in Driver Store. Error = 0×00000490
といった感じのものがヒットするはずです。(このログも例によって先に挙げたサイトより引用)
どうやら、Service Pack 1をインストールするにあたってドライバを一度アンインストールしようとするも、
そのアンインストールをしようとしたドライバが見つからないというエラーっぽい?
とりあえず、上の太文字のような、''で囲まれたファイルパスを使って、
管理者権限のコマンドプロンプト上で
pnputil -a C:\Windows\WinSxS\amd64_usbvideo.inf_31bf3856ad364e35_6.1.7600.16543_none_8a1a2513d42628c3\usbvideo.inf
とするとドライバをインストールするが良いか、というセキュリティ警告ダイアログが出てきますがこれを了承しドライバを手動で再インストールします。

あとは、もう一度Service Pack 1のインストールを試みてください。

今度こそ成功するでしょう。

私もusbvideo.infがFailed to find updateと言われたのでusbvideo(再インストール時公開名がoem13.infと出ました)というドライバの筋が悪いのかもしれませんが、詳細不明。


兎にも角にも、これにて作業は終了です。
WindowsのドライバSDK(NTDDK)を駆使したりできる方ならここらへんのエラーとかに詳しかったりすぐ原因を特定できるかもですね。
私はかなり苦労した上に結局原因もさっぱりなままでした。

詳細を誰か教えてくださる方が居ればありがたいですね……(疲れました)

チョコチョコチョコ~

バレンタインなので研究室で生チョコ作ってみました

チョコ5枚と生クリーム1パック(200ml)用意。
生クリームは電子レンジで沸騰しないぐらいに暖めてある

チョコの入ったボウルは湯煎しつつ、生クリーム投入して混ぜる。
すぐ溶けて綺麗に混ざるので、クッキングシートを敷いたトレイに流し込む

冷蔵庫でてきとーに冷ましたら包丁で切り分けてココアパウダー(純ココア)塗して出来上がり
……のはずだったけど生クリーム多すぎて切り分けられないぐらい柔らかかった。
でもさっと溶けて甘くて美味しく出来たので、まあよし!

無塩バターとか洋酒(ブランデー、ラム)とか用意できればよかったかもしれなかったけど
ズボラながら用意しませんでした(あと高いよね)

たまにはこういうのも良いよね

2014年2月9日日曜日

区切り

えー,私は2/7に誕生日を迎えました.
それに加えて雑事が滞りなく終了し,春までしばらくのんびりできそうな気がします.


そして,

Amazonほしいものリストから誕生日プレゼントを注文してもらいました!
@syuu1228さん,匿名さん2人ありがとうございます!

なかなか読み終えるのに時間掛けてしまいそうですががんばります…!



とりあえず抱負としては,環境が変わってもどうにか生きていく努力します

……以上でした

2014年1月29日水曜日

UEFIアプリケーション/ドライバー開発の話、メモ、その他

最近得られた知見をメモしておくね.

リンクとか

UEFI 仕様書 http://www.uefi.org/specs/download
Phoenix wiki http://wiki.phoenix.com/wiki/index.php/UEFI

とりあえずここらへん.仕様書のページ数はけっこうあるけど、
案外読み易いのでとりあえずここみましょう.
ヘンにググるよりProtocolとかこっち読んだほうが見つかったりします.
Phoenix wikiのUEFIの項は最初のリンク、Phoenix Developer Information About UEFI
Protocolのdefinitionが網羅的に載ってるのでUEFIのAPIの引数とかプロトタイプ宣言
探したくなったら役立ちます.

OSDev Wiki http://wiki.osdev.org/UEFI
多くのOSS系のプロジェクトでEFIを使うときはIntelのEDKよりgnu-efiを用いてる例
が多いですが、このwikiはgnu-efiとgcc toolchainのUEFIターゲットの導入をわりと丁寧に書いてあります. gnu-efiを使うとgdbでブレークポイントデバッグできるので、良さげ.

x86asm.net http://x86asm.net/articles/uefi-programming-first-steps/index.html
Othersの項にいくつかUEFIについての記事がある模様.
gnu-efiを使ってHello Worldを作るにあたって、なぜかアセンブリでのプログラムを解説している
稀有なサイト.

tianocore http://sourceforge.net/apps/mediawiki/tianocore/index.php?title=EDK_II_User_Documentation
EDKのホスティングをしているtianocoreのサイト(sourceforge)にあるユーザーマニュアル

EDK II Module Writer's Guide v 0.7Driver Writer Guide V1.01は必読.
まずEDKでビルドするのにConf書いたりWindowsの設定ファイルやドライバとかで使うinfとか書かなきゃいけないので、それらをどう書くかをまず知るのに前者がないとわからなくなる.
後者は様々なProtocolのサンプルコードがあるので、Specificationやwikiで一覧を見ただけじゃわからないところを補完できる.

メモ

導入
gnu-efiは上記のOSDev wikiにある通り、まあ普通にツールチェインを導入するだけ
EDKはちょっとわかり辛い気がするのでメモ(かなり悩んだ)
まずsourceforgeのsvnか、github.com/tianocoreからかどちらでも良いので、EDKを取ってくる
~/src/edk2にEDKを配置したとして、
export EDK_TOOLS_PATH=$HOME/src/edk2/BaseToolsという環境変数を実行し、
~/src/edk2/に移動し、
$ source edksetup.sh BaseToolsを実行.
あとは諸々設定されるので、buildコマンドを実行するとあとはUEFIアプリをビルドしてくれます.

ポイントは、ここで何がビルドされるか.
$EDK_TOOLS_PATH/Confに設定ファイル郡があって、
target.txtのACTIVE_PLATFORM変数に指定したUEFIアプリケーションパッケージをビルドします.
パッケージは$EDK_TOOLS_PATH/*Pkgとして多数用意されており、良いサンプルコードです.
このときTOOL_CHAIN_TAG変数に使うコンパイラも指定.

パッケージの作成設定
パッケージの設定は<pkg_base_name>Pkg/<pkg_base_name>Pkg{.dec,.dsc}がそれにあたる.
この場合の<pkg_base_name>は適当で、MyAppPkgとかそんな感じで適当にパッケージ名を決定.
*.decはほとんど書くことなくて、どっかのパッケージからパクってGUIDだけはuuidgenコマンドとかで適当に生成してやれば良い(とおもう)
*dscはDefinesはどこかからパクってきて、名前とGUIDだけ書き換えておくのはdecとおなじで良いとおもう.ただし、[LibraryClasses]が難敵.
ここに、他のパッケージに含まれる関数とか使いたい時にライブラリとしてロードするものを指定しておく.たとえば、LibCを自分のパッケージで使いたいとき、
このセクションに
LibC|StdLib/LibC/LibC.inf
としておく.ここで |の左は、そのライブラリのエイリアス.あとで実際にアプリケーションを書く時、infを書く必要があるのだがその時書くライブラリ名を一々ファイルパス書かずに済むためのエイリアスっぽい.
|の右のパスはライブラリの定義場所だが、プレフィクスとして頭に$EDK_PATH_TOOLS/が付いてると考えると良いと思う.
そして、[Components]セクションに、
MyAppPkg/MyApp/MyApp.inf
とかと書いて、自分が実際に作るアプリケーションの定義ファイルへのパスを書いておく.

さて、ここで出てくるinfファイルは、
AppPkg/Applications/Hello.infを参考にすると良いとおもう.
dscのDifinitionsセクションと書くことは殆どおなじだけど、アプリケーションのエントリポイントを指定する必要がある.普通のC言語同様、main( argc, **argv )形式のエントリポイントを使いたければ
ShellCEntryLibを指定する(これをするにはパッケージのdscの[LibraryClasses]にShellCEntryLibを書いた上でinfの[LibraryClasses]にも指定する必要アリ)が、 これをするとおそらくUEFI Shell以外から起動できなりそう(これは不明、試してない)
とくにライブラリ入れずUefiMainとかって指定してやればエントリポイントがUefiMainになる他、
Main引数が(EFI_HANDLE ImageHandle, EFI_SYSTEM_TABLE SystemTable)とかになる.

実際にアプリケーションでEDKのライブラリを使うには、パッケージのdscの[LibraryClasses]に指定したものに限定されるが、そこの|の左側のエイリアスをinfの[LibraryClasses]にも追加するだけ
あと別のパッケージからライブラリを読みこむのに[Packages]セクションで<pkg name>/<pkg name>.decを書く必要あり.

また、このinfファイルの[sources]セクションでソースコード名、[includes]セクションでインクルードファイルを指定する必要があり、指定されたものだけが実際にビルドされる.

ここまで書いておいてなんだが、自分でパッケージ作らなくてもAppPkg/Applications/にフォルダとinf、ソースコードを追加して、AppPkg.dscの[components]セクションに作ったinfファイルを追加するだけでもUEFIアプリケーションはつくれたりするので、お手軽.

ただし、たとえば標準にない(FAT以外の)ファイルシステムをオープンするアプリを作る必要がある時などは、パッケージのフォルダに<Driver Name>Dxeというフォルダを作成し[components]に追加し、そこにドライバを作成、配置するということがママあるので、自前でパッケージを作って必要なライブラリを追加しておいたほうが良い気もする.

ちなみにDxeはDriver Execution Environment、UEFIの起動においてUEFI BootManagerの前にロードされUEFIのAPIを実際に提供するドライバ郡.
また、<foo>PeiというフォルダをつくってそこにPre EFI Initialization、EFIドライバを読む前の手順のプログラムを追加することもあるかもしれない

ここらへんのことは私の勘が多分に含まれており、上記リンク集に挙げた
EDK II Module Writer's Guide v 0.7に設定ファイルの書き方など、良く載っている.
たぶんこれを熟読したほうが良い(面倒だからあまり読んでないです)

ドライバについて
infファイルの、MODULE_TYPE変数にUEFI_APPLICATIONかUEFI_DRIVERか選べるので後者を書いておく.
UEFI DRIVERはUEFI APPLICATIONと違いエントリポイントだけでなくアンエントリポイントも必要.どちらも変数に名前を指定.
あとはソースにエントリポイントとアンエントリポイントを書くだけ、簡単ですね.
ただしドライバはおそらくリエントラントにしておく必要がありそう(要出典)

UEFIドライバはShellCEntryLibつかえないだろうしLibCは諦めてUEFI Protocolなプログラムをしましょう.

あと、UEFI Shellやブートローダー側にAPIとして見える関数を指定して、そのProtocolだと一意に識別できるGUIDも設定する必要がある.

また、UEFI Protocolを使うには、SystemTable->BootServicesのメンバにある関数を使っていく.
たとえば、LocateHandleで特定のプロトコルについてハンドルを取得し、
OpenProtocolでハンドルとプロトコル名をつかってそのハンドルについてのプロトコルをオープン、
プロトコル名と同名の変数に開いたプロトコルがロードされるので、
その変数のメンバにある関数を使ってやればAPIが叩ける
使い終わったらCloseProtocol.
 たとえば、LocateHandleで引数にgEfiBlockIoProtocolGuidを指定してfor文でまわしておけば、Bufferに指定した変数に配列の形でブロックI/Oができるデバイスのハンドルが全部格納されるので、実際ブロックI/OしたいデバイスのハンドルだけOpenProtocolの引数に渡してやれば、
OpenProtoclはEFI_BLOCK_IO_PROTOCL*型な変数に開いたプロトコルをくれるので、
あとは(EFI_BLOCK_IO_PROTOCOL*)fooとかとすると
foo->ReadBlocks( ... とかするとブロックのリーディングをしてくれるわけである.

なんともヤヤコシイしvoidもunsigned intもVOIDとかUINTNとかとして再定義されてたりする
Win32APIっぽさ満載なCソースコードが生まれてくるのでなかなかマゾ度高いです.
sprintf系関数がMSDNに合わせて第二引数が第一引数のバッファのサイズになってるとか、
規格違反なカンジが素敵.

VisualStudioだとEDKつかってブレークポントデバッグとかできちゃうらしいのでこっちのほうがわりとおすすめ.
UEFIドライバ作るのにもUEFI Driver Wizardとかあるし…

アプリケーション全般
エントリポイントにShellCEntryLibを使わなかったとき、なぜかprintf系が動かなかった.
当初#define Print(a) SystemTable->Conout->OutputString(SystemTable->Conout, a)
とかやって出力していたが、
EDKはPrintというフォーマットストリングを処理できる出力関数を持っているらしい.
これに気がつかなくて友人巻き込んで大分時間かけてしまったりしてた.
あと、ヒープの確保はmalloc() free()でなくてAllocatePool()もしくはAllocateZeroPool()とFreePool()
を使う.テストにでるよ.

書籍
UEFIの書籍はあんまりないけど(むしろまったく?)
Intelのペーパーブックがamazon comのほうにある.
Harnessing the UEFI Shell
ただし2010年の本で、EDKのサンプルコードのところで微妙に今と似わないコードの書き方があるように思われるが、おそらくこれが一番公式な書籍なので参考にはなる.
ただし、tianocoreで公開されてる上記リンク集にあるマニュアルで十分な気もするので、
高い金を払って輸入する必要があるかは微妙



まあこんなところ.読みやすさを意識してない文章ですいませんが、
興味ある人は頑張って汲み取ってくださいな

2014年1月26日日曜日

SECCON CTF 2013 ONLINE wirteup

表題通り.
route 9として参加しました.

解いたのはMisc200「Encode me.」とBin300「RISC Processor」

たぶんけっこうの人が解いてるとおもうのでどちらかというと自分の備忘録です

Misc200

問題のファイル、encode_me_91は31byteのバイナリファイルで、
31byteというのをみてもしやアセンブラ短歌では…とか思いましたが全く見当違いでした.

ファイル名の91がヒントで、
ecoding 91とかでググるとbasE91というエンコーディングが出てくるので、
それをつかってencode_me_91をエンコードすると
PASSWORD/IS/WHICH+ENCODING+DO+YOU+LIKE
とでます.それだけでした.

Bin300

char main[] =" ....
とmainという配列にASCIIコードが詰まってて、これをバイナリとして解釈すると
マシン語になるというやつ. shell codeっぽい.
char main[]も函数として解釈されちゃうのはIOCCCで知りました.

とりあえず使ってたマシンがGentooだったので
$ crossdev -t <arch>で有名どこのRISCアーキテクチャのツールチェインを用意して、
コンパイル->objudmp -Dのコンボ.
なぜかshとsparcのemergeに失敗しました…

その逆アセンブル結果いまどっかいったのであとで見つければ載せる.
追記: みつけた

やってることはひたすらr0とr3にデータをロードして減算でASCIIコード作りだしては
スタックに載せてスタックポインタ(r1レジスタ)を一つ進める、を繰り返して、
r0に4、r3に1、r4にスタックポインタ、r5に10を格納してシステムコール.
r0をシステムコール番号、r3、r4、r5をarg1、arg2、arg3として解釈するので、
Linuxでシステムコール番号4番のsys_write( unsigned int fd, const char *str, size_t count )
を呼びだす.
sys_write( stdout, スタックポインタ, 10 );
なのでそれまでにスタックに積んだASCIIコードを吐き出してるだけ.
その後のコードはsys_exit( 0 )してるだけでした.

答えは
Hakkaisan
でしたがHakkaisanて八海山…?

2013年12月26日木曜日

*nixの入門にBSDはどうですか

ディストリビューション/パッケージマネージャ Advent Calender 25+1日目の記事です.
最終日なのにておくれましたが、神は寛大なので赦してくれるとおもいます.

さて、みなさんディストリビューションと言うと、Linuxばかりです.
たしかにカーネルだけを開発するLinuxと違いユーザーランドも作るBSD系は
ディストリビューションがあまりないです.
しかし、FreeBSDにいくつかディストリビューションがあるのはご存知でしょうか

Debian GNU/kFreeBSD
Gentoo BSD
ArchBSD
PC-BSD

上3つは、みなさんもどこかで目にした名前だとおもいます.

に上2つ、DebianとGentooは本家がカーネルだけをBSDに挿し替えたプロジェクトとしてやっています.
FreeBSDのカーネルと同時に開発されてるユーザーランドのツール郡は、それをパッケージ化していますが、
その他追加としてインストールするパッケージはLinux同様それぞれのチームが保守管理しています.
しかし、FreeBSDはPortsで独自にパッチを当てていることが多く、普通にビルドしようとしてもコケることが多いです(ビルドシステムを提供するGentooはBSDで使うと割と悲惨です)

しかし、下二つ(ArchBSDとPC-BSD)はPortsからビルドしパッケージ化しているため、
比較的多くのパッケージが容易に使用できます.




ArchBSDはArchチームは関係なく、Archファンがやってるプロジェクトで、
今年の始めに*.isoなインストールメディアがリリースされた新しいプロジェクトです.
最初は全くパッケージがありませんでしたが最近はGnome等のパッケージも用意されています.
pacmanが使えるFreeBSDという感じなので、pacman以外のメリットはあんまりないかもしれません.







して、最後に上げたPC-BSD、これを特に今回は紹介します

PC-BSDは、他3つと違い、純粋にFreeBSDのためだけのディストリビューションです.
Linux向けディストリビューションの派生とかじゃありません.
プロジェクトは2005年から始まっていますが2006年にiXsystemsが買収し、
現在もiXsystems社の元開発が行われています.



Debian、Gentoo、Arch どれもLinuxでもXが最初からなかったり、インストーラーが付属してない
といった"硬派"なディストリビューションです.
FreeBSD自体、Xは後に手動でインストールせねばなりません.



PC-BSDはそれらと一線を画す"軟派"なディストリビューションで、
GUIのインストーラが付いている上にデフォルトでXがインストールされます
また、インストール時にデスクトップ環境を選択することができます(デフォルトはKDE)
そして、これまたBSDらしくはないのですが、
AppCafeというGUIのパッケージマネージャまで付いています.
おそらく、この時点でも、「おや、BSDとはいってもかなり簡単そうだ」とおもっていただけるでしょう.



さらに最近のことですが、PC-BSDが以前から使用していた*.pbi形式の独自パッケージを止めて
FreeBSD 10から正式採用されるpkg(8)の形式のパッケージに変更しました.
パッケージはPC-BSDがFreeBSDのものとは別に管理しているサーバーからインストールしますが、以前のPC-BSDと違い本家と互換性があります
(pkg(8)についてはこの同アドベントカレンダー8日目の拙著記事を参考にしてください)

もう一点、最近のこととしては、PC-BSDがローリングリリースモデルを採用しました.
ArchやGentooで採用されているモデルで、ディストリビューションがバージョンを持たず、
カーネル含むコアシステムや、各種ソフトウェア、それら全てをパッケージマネージャが
管理して、常に最新にするモデルです.



PC-BSDの概説は以上ですが、ここで記事タイトル通り、ちょっとした主張をしたいとおもいます.
情報技術を学ぶのに、*nix OSを勉強しよう、Ubuntuがラクだよ!というのを見かけることは多いです.
しかし、たとえばwebデザインを学ぶにはAdobeのソフトウェアが使え、コードもブラウザが動作すれば十分だったりしてWindowsやMacで良かったりします.
そうでなくとも、近年はMacがBSDベースだったりしてちょっとしたコマンドの学習に良いかもしれません.
Ubuntuやその派生(たとえばMint)がよくインストールの簡易な*nix入門向けディストリビューションとしてよく紹介されますがそもそも極端にGUI化が進んで独自要素の強いUbuntu派生が初学者に向くのでしょうか.

そこで、インストールが簡易で、安定し、歴史的にもUNIXらしいUNIXライクなOSとして、
PC-BSDを使うという選択はどうでしょうか.
なにもLinuxばかりがUNIXライクOSではありません.
仮想環境にインストールするにも悪くないOSだと考えるのですが、どうでしょうか


記事は以上です