Just $ A sandbox

プログラミングと計算機科学とかわいさ

Ubuntuがdisk driveエラーで起動しない

Xubuntu 13.10で以下のようなエラーが出て起動できませんでした。

The disk drive for /home is not ready yes or not present.

私のHDDのパーティションは以下のような感じになっています。

/dev/sda2 /dev/sda7 /dev/sda5
Windows7 /home /

/homeに当たる/dev/sda7の部分がマウントできていないようだったので、起動時にマウントするディスクを設定します。

The disk drive for /home is not ready yet or not present.
Continue to wait, or Press S to skip mounting or M for manual recovery.

のメッセージでMを押し、コマンドモードに入ります。

~$ blkid
/dev/sda1:...
...
/dev/sda7: UUID=hogehoge...

blkidで起動したいディスクのUUIDを調べてメモします。

~$ cat /etc/fstab

# /etc/fstab: static file system information.
#
# Use 'blkid' to print the universally unique identifier for a
# device; this may be used with UUID= as a more robust way to name devices
# that works even if disks are added and removed. See fstab(5).
#
# <file system> <mount point>   <type>  <options>       <dump>  <pass>
...
/dev/sda7       /home           ext2    defaults            1      2

のようになっているので、この/dev/sda7のところを

UUID=[さっきメモしたUUID] /home           ext2    errors=remount-ro 0       1 

に編集します。

これで起動することができました。めでたし。

参考

How to mount drive in /media/userName/ like nautilus do using udisks - Ask Ubuntu

LinuxでWindowsアプリケーションを動かしたい人のためのWineの設定

この記事はwineに関して私が蓄積したベストプラクティスとバッドノウハウをまとめたものです。

Wineとは

Wineとは、Linux*1Windowsアプリケーションが動くエミュレータではない何か*2です。

はじめに、Wineで全てのWindowsアプリが動くわけではないことを念頭に置いてください。まるで動かないものもあります。
この記事は、色んなアプリが動くようになる可能性が高くなるように設定をしています。

Wineで動かしたいアプリがあるのであれば

に行くと何か情報が得られるかもしれません。

環境

今回使用したのは以下の環境下です。

Wineのインストールにはなるべくパッケージを使っていれてください。
人柱気質たっぷりならソースからビルドでもよいかもしれません。

Wineで使うdllや必要なフレームワークを手軽にインストールしたり管理してくれるものです。必須です。

注: Wineは、こまめにバージョンを上げればよいというものではありません。特に開発段階のものをインストールするときは注意してください。バージョンがあがって今まで動いていたものが動かなくなってしまうこともあります。

設定

以下では具体的にWineの設定をしてみます。どんなアプリを動かしたいかによって入れるものや順番が変わるので注意してください。

フォントの文字化けを直す

デフォルトでは日本語の部分が豆腐状態(□□□□みたいな)だと思うのでまずはフォントをインストールします。

~$ winetricks allfonts

これで必要なフォントは入ります。

フォントを綺麗にする

お好みのフォント(例えばVL Gothic Font Family)のttfを~/.wine/drive_c/windows/Fontsに入れます。
そして~/.wine/user.regを以下のように編集します。

[Software\\Wine\\Fonts\\Replacements] 1240428288
"MS Gothic"="VL Gothic"
"MS PGothic"="VL PGothic"
"MS Sans Serif"="VL PGothic"
"MS Shell Dlg"="VL Gothic"
"MS UI Gothic"="VL PGothic"
"Tahoma"="VL PGothic"
"\xff2d\xff33 \x30b4\x30b7\x30c3\x30af"="VL Gothic"
"\xff2d\xff33 \xff30\x30b4\x30b7\x30c3\x30af"="VL PGothic"

.NET Framework系アプリを動かす

winetricks > Select the default wineprefix > Install a Windows DLL or componentから

などを入れます。

dotnetは(10->)20->30->35の順番でしか入りません。途中でコケたらその後のものは入りませんが、40だけは別に入れることができます。
ie7,8がないと上手く動かないものがあるようです。
msxml, mfc, vcrun, wshなどは必要ないかもしれません(必要があれば勝手に入る)。

メニューのフォントが化けるor綺麗じゃない場合は

~$ winecfg

デスクトップ統合 > 項目のメニューバーのテキストのフォントなどをいじると変えることができます。

ゲームを動かす

  • d3dx*
  • devenum
  • dinput, dirac
  • directmusic, directplay, dmsynth, dsound
  • dxdiag, ffdshow
  • quartz
  • vcrun*
  • wmp*

などを入れます。

d3dxは9,10,11を入れれば大丈夫だと思います。

上手く動かない

汎用

コマンドラインからwineを実行すると、たくさんメッセージが出ると思います。

err:[name]:[message]

となっているものがあれば、[name]のdllがおかしいことが多いです。
fixme:hogehogeは無視して大丈夫です。

~/.wine/drive_c/windows/system/system32の中に指定されたdllを(どうにかして手に入れて*3 )入れるか置換して、winecfgのライブラリからその名前のものを"ネイティブ版"として追加すると上手く行くことがあります。

kernel32.dll, gdi32.dll, user32.dll, ntdll.dll, ole.dllなどは置き換え無いほうがいいかもしれません。

(ゲームなどの)音が鳴らない・割れる

winecfgオーディオのところにドライバがセットされて、音をテストして上手く行くことを確認してください。
また、winetricksで音関係のdllをいれてください(dsoundとかdirectmusicとか)。

音割れが激しい場合はPulseAudioを消して再起動すると直ることがあります(PulseAudio周りのドライバがおかしい場合)。

強制終了する

ゲームであれば、動画の再生の際にコーデックがないなどの理由で強制終了してしまうことがあります。
wmpやその他の動画コーデックをいれてみてください。

詰んだ

以下のようなエラーが出たら詰んでいることが多いです。

  • Unhandled page fault on read accessなどのメモリ関係の強制終了
  • gstreamerのエラー(ディストリ用パッケージを入れると動くかも?)
  • 一部のole関係のエラー
  • 一部のinitialization系エラー(ゲームを動かす要件を満たしてないことが多い)
  • 一部のerr:module:import_dll Libraryなどのエラー(dllをネイティブ版で置き換えると上手く行くことも)
  • 何が悪いのかよく分からないエラー(何が悪いのか分かっていない場合は解決手段も分からないので詰んでる)

詰んだら一からやり直しましょう。
~/.wineをリネームして(削除でも構いませんが残しておくほうがあとあと便利だと思います)、全ての設定をしなおすと上手く行くことがあります。
(動いてるという報告があって)どうしても動かない場合は経験上これが早いです。

まとめ

  • Wineは便利だけど闇
  • 特にゲームは闇
  • winetricksで必要なものを揃えよう
  • エラーメッセージを読もう
  • 割とよく詰む

参考

情報が古いものもあるので気をつけてください。

*1:MacにもWineBottlerという名前で移植されています

*2:Wine Is Not an Emulatorの略

*3:dll-filesなどから探すかそれ以外の方法を考えてください。

Pythonでsuper(self.__class__, self)は使うな

[追記:2013/11/02]
この記事ではPython2.xを前提としていますが、Python3以降はsuperの引数を省略することができるようになっています。
[/追記]

次のPythonコードを見てください。

class A(object):
    def method(self):
        pass
 
class B(A):
    def method(self):
        super(self.__class__, self).method()
 
class C(B):
    def method(self):
        super(self.__class__, self).method()
 
>>> c = C()
>>> c.method()

このコードを実行すると、
RuntimeError: maximum recursion depth exceeded while calling a Python object
すなわち再帰の深さが限界に達したと言われてランタイムエラーが発生します。

C.methodの中のsuperによって渡されたselfオブジェクトは、クラスCのインスタンスです。 よってsuperから呼ばれたB.methodの中ではself.__class__がCと解釈されて、

        super(C, self).method() # => B.methodが呼ばれる

となってしまうのでB.methodがB.methodを呼び、無限再帰になってしまうのです。

これを解消するためにはsuper(B, self).methodのようにクラス名をちゃんと明記するか、A.methodのように直接クラスのメソッドにアクセスします。
また、参考として、こういうハックもあります:

問題点

この問題はあまりメジャーではないのか、super(self.__class__, self)と書いているコードはたくさん見かけます。しかし、これは非常に大きな問題だと思います。

super(self.__class__, self)を使っているクラスを継承してsuper(self.__class__, self)と書いてはいけない。ということを意識してPythonを書いている人がどれだけいるのか?
これといって良い代替案がないことも問題でしょう。「スーパークラスのメソッドを呼ぶこと」と「Aクラスのメソッドを呼ぶこと」は全然意味が違います。それなのにsuperが使いにくいからA.methodと書きなさいというのはいくらなんでもひどすぎではないか?

他に方法があれば教えていただけると嬉しいのですが、いずれにせよsuper(self.__class__, self)の利用は控えたほうがよさそうです。