Project Flower ブログ

Project Flowerのブログです。

フェイルセーフ

まだWindowsが98あたりが全盛期だった頃、ウェブサイト巡回ツールなるアプリケーションを利用していました。

巡回するサイトはアプリケーションが管理するファイルに記録されていました。まあ、普通ですね。

当時私は学生かアルバイトか派遣社員で貧乏だったので、HDDは大して良いものを使っておらず、すぐに空き領域はギリギリの環境でした。
(今でもSSDを使おうと思うほど気持ちは裕福ではありません…)

そうした苦労から考え出したのがDisk list makerだったのですが、

Windowsは、と言うかファイルAPIの仕様だと思うのですが、ファイルを上書きする時に、既存のファイルの大きさを超えるような場合で、更にその超過分をHDDの空き領域に割り当てる事ができない場合、どのような挙動をするのかと言うと、

“既存のファイルを0バイトのファイルで上書きする”

というものでした。

お陰で度々大事な設定を闇に消し去られました。まあ、大事なものはバックアップしておけってのは今も昔も変わらないのですが、「つい」「うっかり」をやってしまうのが人間です。

先日、WinMergeでGitで管理されたファイルの編集をしていた時、突然OSがプツンと落ちました。

オーバークロックとかはしていないのですが、何しろ自作PCなので、恐らくはハード関係に起因するハングアップや突然の再起動はたまにあります。

で、再起動した後に編集途中だったファイルをもう一度開こうとしたら、ファイルがありません。

修復ツールで修復を試みましたが、既に別のファイルでセクタは上書きされていたため、修復もできませんでした。

幸いバックアップは取っていたので大事には至りませんでしたが、Gitとかでローカルで作業をしていると忘れがちになるのは私だけではないと思うのですが。

改めてフェイルセーフとは何か。と考えました。

この場合ではWinMergeに原因があるのか特定できていませんが、HDD上のファイルは書込み待ち状態になっていたと思われます。ユーザーが“更新”を実行しない限り、アプリケーションはファイルに対しWrite権限を持つべきではないでしょう。

そして前述の巡回ツールの場合では、ファイル上書きのアルゴリズムの改善が必要だと思います。恐らく既存は以下のようなものだと思います。(フローチャート書くのが面倒なので失敗パターンのみ)

(ファイル上書き開始)

[ファイルの内容を消去]

[メモリからファイルへデータをコピー]

(空き領域不足により失敗)

(終了)

フェイルセーフを考慮すれば、これは以下のようにするべきではないでしょうか。フラグメント等も当然考慮して計算する前提です。

(ファイル上書き開始)

[既存ファイルの大きさと空き領域の和がメモリ上のデータを収めるに足るか計算]

(計算結果が条件を満足しない事により中断)

とは言ったもののIO周りの低級なAPIでここまで親切な実装をすることはないでしょうね。

自分で安全な上書きアルゴリズムを作るしかなさそうです。

Project Flowerのアプリケーションも親切ではないのでHDD空き領域には余裕を持って利用して下さい…。

最上

私はプログラマーを本職とする前は自動車メカニックをしていた。

自動車メカニックというのは業態にもよるが、直接客と接する、意外と神経を使う仕事である。

ある時、あまりにボロい車を車検に出してきたお客さんがいて、直さなければならない箇所を計算したら修理代は20万を超えた。

お客さんにその事を説明すると、返ってきた返事がこうだ。

「20万もかけたら、車が買えてしまうだろ!」

20万で車に乗れると思っているのは愚かだ。

20万で買えるような車はすぐに乗れなくなるか、あちこちが壊れて必ずそれ以上のお金が必要になる。

中には不人気で相場がその位の車種もあるかもしれないが、それでいいならそういう車に乗ればいい。

とにかく客というのはこちらが考えている水準より低い考え方をするので、うんざりだった。

それはソフトウェア業界でもそんなに変わらない。

プロプライエタリなソフトウェアを複製して使う方法を調査させられたり、聞いた事もないような使途不明な書類を作らされたり。

バカな客とは付き合いきれない。ずっとそう思ってきた。

──────────

話は変わるが、私は散髪には美容院に行っている。

腕のいいお気に入りのスタイリストが立て続けに二人も辞めてしまい(寿退社で)、残念だなあと思っていたところ、その日はいつも見かけない違う人がシャンプーをしてくれた。

その人のシャンプーが、今まで経験した事のない素晴らしい施術だった事に驚いた。

美容院でのシャンプーは自分で手を出す事ができないので、如何に、自分だったらこうしてほしいと洗ってもらえるかが満足度に繋がる。

いつもオプションで炭酸泉を付けてもらっているのだが、万遍なく念入りに施してもらい、実に気持ちが良かった。

かつて体験した事がないほど良かったので、思わずスタイリストの人に、あの人は誰かと聞いてみた。

「あの人はここの社長です。」

衝撃的だった。

美容院でのシャンプーは、大抵、アシスタントと呼ばれる人がやってくれるので、見習いつまり下っ端の仕事だと考えていた。

そんな下っ端がするような仕事が一番上手いのが、社長だったのだ。

どういう事なんだろう。

私は前述のようにバカな客と接するのが嫌なので、いずれ独立して社長にでもなって、そうしたら面倒臭い客とのやり取りは下っ端にやらせてしまえ、という思いが少なからずあった。

しかしこの社長である。末端の客に真正面から向き合い、どの従業員にも負けない最高の技術を提供する事ができる。

私はカラーリングやパーマ等も頼まないし、髪を切る頻度も低いので大した儲けに繋がるような客ではない。

社長になったとしても、お金を払ってくれるのは客だ。間に従業員が入ろうと、客の満足のために真正面から向き合い、手を抜かない。

ソフトウェア業界に置き換えれば、どの社員よりも優れたコードが書ける社長といったところか。意外とそういう会社、あるかもしれない。

お気に入りのスタイリストはいなくなってしまったが、社長の心意気に惚れた私は、次もこの店に行かずにはいられなくなってしまった。

設計書

ソフトウェアというものは、通常、SEが設計書を書いて、PGが実装する。

ところが今の現場では設計書を書くのも実装するのもテストを作るのも全部同じ人。

そうなるとどうなるかと言えば、設計書がその人しか読めないものになる。
(酷い時は、「プログラムだけは書いといたから設計書作って」なんて言われた事もある。なんだそりゃ)

先日スケジュールの都合で、珍しく設計と実装を分担することになった。

あまりシステムに馴染みのない自分が実装で、長年システムに携わってきた人が設計書を書いた。

渡された設計書を読んでも、どう実装すればいいのか読み取れない。

設計者に確認すると、

「それは、ExcelでXXXというファイルを開いて、XXXという仕様書に沿ってテーブルにデータを入れて、XXXというマクロを実行して、出力されたファイルをXXXに置いて…」

って、そんな事どこにも書いてない…。行間読むにも程があるだろ。

単体テストをよく理解している人は、設計するのも実装するのも、テストされやすい事を意識する。

必ずしもそれがベストプラクティスとは限らないけれど、直交性が高いモジュールを設計しようとすると、自然にプログラムも綺麗になってくる。

設計書も“プログラムを実装するために読む”という理解があれば、他人が読み取れない設計書を作ってしまうようなことはないはずだ。

そもそもここの客が設計書の納品を要求しているのは“ちゃんと作った証拠”を見ておきたいだけであって、それを逆手に取って“それっぽい物を納品しさえすればいい”と考えてる体質はどうにかならないものだろうか。

I♥富士通

f:id:project_flower:20170921002348j:plain

小学生時代は公務員だった父が所有していたOASYSで遊び

中学生時代はFM TOWNSでF-BASIC386を遊び尽くし

実家の暖房機はホットマン

PC-9821を所有していた頃も何故かFMV-TOWNSのゲームパッドを使用(D-Sub25pinだった)

最近までキーボードはbuffaloの一番安いものを使っていた。

キー配置に癖がなく打ちやすく、ストロークも好みだった。

しかしプログラマーを本職として幾年、プロフェッショナルが安物を商売道具にしていいものか?と思い、キーボードくらいは贅沢してもいいかな、と、又、職場でサイレントマウスを使ってみたらなかなか良かったので、キーボードも静かなのがいいなと思って(職場のDELLのキーボードが実にうるさかった)、キーボード選びをしてみた。

最初に買ったのはLogicoolのK120

buffaloほどではないが、とにかく安い。使ってみると、確かに静かだった。

キーのタッチはペチペチといった感じ。お世辞にも心地良いとは言えない。

そして一番気に入らなかったのが、エスケープキーが普通のレイアウトから少し右側にオフセットしている事。ファンクションキーの位置も微妙にずれていて、ミスタイプ頻発。

タッチタイピングをしていてもエスケープキーとファンクションキーの位置は割と意識している。もしこの配置に慣れたら、一般的な配置のキーボードで違和感を感じる事になってしまう。このキーボードはすぐに使うのをやめた。

秋葉原FILCOや東プレ、Happy Hacking(HHKB)も触ってみたけどどれもしっくり来なかった。

HHKBの安い方(Lite)のタッチは好みだったけど、HHKBは大学の頃BSDのマシンに付いていたけど、こんな使いにくいキーボードはなるべく使いたくないと思った。

慣れれば快適というのはわかるけど…必ずしも現場でHHKBが使えるとは限らない事を考えたら、HHKBの習熟にコストをかけてまで使いたいとは思わなかった。あとちょっと、ミーハーぽい人も少なからずいるのが嫌(全然打つのが上手じゃない人とか)。極めつけに、今のロゴはかっこ悪い。昔のHappy Hackingロゴはカッコ良かった。それはそれでミーハーぽいけれど。

そんな中、ストロークとデザインがなかなか良いと思ったのがエレコムTK-DUX31(30)BK

タッチはいかにもラバースプリングという感じでクニャクニャしている。キートップも高めで長時間打っているとちょっと疲れる。

プリセットのボタンのLEDが隙間から漏れてて、安っぽいのがイマイチ。でも値段の割に打ちやすく特にキーの刻印がかっこいいキーボードだと思った(デザインはちょっと子供っぽい?)。

その後見つけたのが、画像のLibertouch秋葉原のヨドバシにかなりくたびれた見本があったので打ってみると、これだ!と思った。FILCOや東プレとも違うタッチ。しかも大好きな富士通。迷わず注文。置いてある店が少ないのが寂しい。

しばらく自宅で使ってみたけど、本当に打ち心地がいいので、職場の分までこれにした。

残念な点:

  • 清掃のため分解したら(※保証対象外になる)、分厚い鉄板の上に本当にメンブレンスイッチが付いていた。
    メンブレン自体は普通の安物キーボードと何ら違いはない。耐久性が不安。実際、某レビューとかによると割と壊れやすい模様。
    タッチは金属製のスプリングとラバーコーンで生み出しているので、何とかメンブレンじゃないスイッチにできなかったのかな?信頼性が上がるのであればもう少し高くても絶対買うけど。
    ちなみに構造が複雑なので元に戻すのは結構大変です。
  • 40%静音化という割に、打鍵音は結構うるさい。
  • テンキー無しバージョンも欲しい。
  • デザインが古臭い。
  • 刻印も耐久性が無さそう。

気に入っている点:

  • 打ち心地が格別。踊るように指が動く。
  • 東プレほど高くない。

キーボードは好みによって評価が左右されるので、“これが最高”とは言い切れないけど、このキーボードのタッチは実に侮れない。

約半年使用しているけど、タイピングが速く正確になった気がする。

落ちまくる

再び自作ネタ。

Dual Graphicsが使い物にならなかったので、改めてMSIGeForce GTX 1050Tiを購入。

Forza Horizon 3はSXGA 30FPSであれば"ハイ"設定でスムーズに遊べる。しかし、システムがフリーズする事が多くなった。

一度不具合を起こすとグラフィックボードを挿し直さないと電源が入らない。この時、PCの電源が入ってもグラボのファンは廻っていない。

初期不良かもしれないのでまずはグラフィックボードを疑ってみる。マザーボードのもう一つのPCI Expressスロットの方に挿してみる。やっぱり調子が悪い。

MSI Kombustorで負荷をかけてみると、一分ほどで60℃程になり、落ちる。

元のスロットに挿しても同じ。熱暴走か?でもGTX 1050Tiは65℃程度は正常範囲内のはず。耐えられないとすれば初期不良の可能性はある。それともファンの組み付け不良?尤もファンを外したら保証対象外になるのでその場合も不良だ。

或いは電力不足?でも電源はコルセアの650W 80PLUS Goldを奢っているし、補助電源のない1050Tiがそんなに電力食うとも思えない(後で調べたら1050Tiの推奨容量は300Wだった)。

ではマザーボードの不良では?購入以来PCI-Expressのスロットは使っていないので可能性は捨てきれないが…

昔使っていたマザーに戻してみようか?調子が悪いから買い替えたので、ちゃんと動くかもわからない。面倒臭いな~と思いつつふと見ると、ATX電源の24ピンコネクターに少し隙間があるのに気がついた。

この部分、マザー側が良くないのか電源側が良くないのかわからないが、どうも奥まで綺麗に入ってくれない(昔使っていたMSIのK9マザーとEverGreenの時はパチンと入っていた。それ以外も同様)。

もう一度グッと押し込み、Kombustorを試す。30分以上耐えた。

自作PCのハード的な不具合は原因が判断し辛い。原因の一つとして、参考になれば。

Radeon Dual Graphics

A10-7890KとRadeon R7 250、MSIマザーボードでDual Graphicsを構築した。

Web上で見つかる情報と異なる部分が多くありハマッたので覚書。

MSIのM/B(旬ではないが…)を使っている人には役に立つかもしれない。

グラフィックボードのディスプレイ出力を使用する場合

BIOS設定

Integrated Graphics Device Configuration
  • Initiate Graphics Adapter: PEG
  • Integrated Graphics Devices: Dual Graphics
  • Integrated Graphics Share Memory: (任意)
  1. ボード取り付け後、BIOS上で上記の設定にする。
    (※BIOSメニューはInitiate Graphics Adapterで設定した出力先にディスプレイを繋がないと表示されないので注意)
  2. Windows起動後、自動的にドライバがインストールされる。
  3. Radeon Softwareを開き、"ゲーム"→"グローバル設定"→"グローバルグラフィック (AMD Radeon R7 Graphics + R7 200 Dual Graphics)"→"AMD CrossFire"が"オン"になっている事を確認する。
    f:id:project_flower:20170818154321p:plain
  4. グローバルグラフィック (AMD Radeon R7 Graphics + R7 200 Dual Graphics)が表示されない場合、"ゲーム"→"グローバル設定"→"グローバルグラフィック (AMD Radeon 200 Series)"→"AMD CrossFire"をクリックすれば確認が表示され、オンにする事ができる。
    f:id:project_flower:20170818154527p:plain
  5. バイス マネージャでディスプレイ アダプタを見ると、"AMD Radeon R7 Graphics + R7 200 Dual Graphics"と"AMD Radeon(TM) R7 Graphics"の組み合わせとなっている。
  6. そうでない場合、AMDのサイトより、Radeon Softwareの最新版をダウンロードし、インストールし、2.からやり直してみる。

オンボードのディスプレイ出力を使用する場合

BIOS設定

Integrated Graphics Device Configuration
  • Initiate Graphics Adapter: IGD
  • Integrated Graphics Devices: Dual Graphics
  • Integrated Graphics Share Memory: (任意)
  1. ボード取り付け後、BIOS上で上記の設定にする。
  2. Windows起動後、自動的にドライバがインストールされる。
  3. バイス マネージャでディスプレイ アダプタを見ると、"AMD R7 200 Series"と"AMD Radeon(TM) R7 Graphics"の組み合わせとなっている。
    f:id:project_flower:20170817085855p:plain
  4. Radeon Softwareを開き、"ゲーム"→"グローバル設定"→"AMD Radeon Dual Grap..."が"オン"になっている事を確認する。
    そうでない場合、クリックすれば確認が表示され、オンにする事ができる。
    f:id:project_flower:20170818155039p:plain

ポイント

  • グラボからの出力を使用する場合、デバイス マネージャ上でDual Graphicsが有効である事が確認できる。又、Radeon Software上ではCrossFireと表記される。
  • オンボード出力を使用する場合、デバイス マネージャ上にDual Graphicsは表示されない。

Web上で見つかった情報

  • Radeon Softwareの"Radeon 追加設定"(従来のCatalyst Control Center)から設定するという情報があるが、現在のRadeon Softwareでは存在せず、設定はできない。
    (※Windows Updateによるドライバがインストールされている場合、"Radeon 追加設定"は存在したが、その先に"ゲーム"及びDual Graphicsの項目はなかった)

パフォーマンス

3DMark

  Clowd Gate Fire Strike
A10 7890K 6243 1468
Radeon R7 250 1GD5 OC 8523 2171
Dual Graphics (グラフィックボードのディスプレイ出力) 9853 2552
Dual Graphics (オンボードのディスプレイ出力) 9874 2566

Dual Graphicsの効果はあるようだが、Fire Strikeのデモ画面を見ている限りでは、オンボードでは紙芝居なのがグラボ出力では何とかアニメーションに見えるようになるので、グラボが特に頑張っているように感じる。

メイン メモリをDDR3-2400にするとどの位パフォーマンスが向上するか気になるところ。(M/BはDDR3-2133までしか対応していない)

ただ、元々ゲーム向きの構成は考えていないし、本当に快適にゲームをやりたいならA10は選ばないかな。

その他

  • Forza Horizon 3で試した結果、スペックは出力しているアダプタに依存する。
    グラボから出力すると、恐らくGDDR5のメモリ効率が良いためパフォーマンスは良いが、VRAMは(1GBとして認識され)不足と警告が出る。
    オンボードとグラボのVRAM容量を合計して3GB、という訳ではない様子。
    但しこれは、アプリケーション(ゲーム)によって異なるかもしれない。
    本来Forza Horizon 3はSLIに対応していないらしいので、CrossFireを応用したDual Graphicsは利用できないのだと思う。実際、オンボード出力を使用するとVRAM不足の警告は出なくなるが動きがおかしく、ゲームにならなかった。
    (ちなみにDual Graphicsを使わずに7890Kのオンボード出力を使用すれば、画質は最低限だがゲームはそれほど問題なく楽しめる)
  • MSIのR7 250はVRAMがGDDR5 1GBのもの(今回装着したもの)とDDR3(1800MHz) 2GBのものがある。
    GDDR5はバススピードが4.6GHzなのでパフォーマンスはこちらが上だと思う。但し、GDDR5版にはCrossFire(ボードどうしの方)への対応が書かれていない。
    尚、MSIのサイトを見るとR7 250は7種類もあり、GDDR5 2GBのものもあるが、アスクが販売しているのは前述の2種類のみの模様。
    R7 250は流通量も少なくなっており、スペックの割に高値となっている。
    A-Series最新版の7890Kとは言え、Dual Graphicsの現実的なメリットはかなり薄らいでいる感じがある。

所感

ソフトベンダーはアップデートで仕様を変え、その差異が詳細に公表されていない場合が多く、今までのチュートリアルが役に立たなくなる事が多い。今回はMSIのM/Bの設定方法は自力で調べたが、Web上で調べたRadeon Software(とCatalyst)の情報はほとんど役に立たなくなっていた。

例えばマイクロソフトによるWindows Creators Updateも顕著で、NEC富士通が自社PCユーザー向けに公開しているWindows 10のチュートリアルは既にUIが異なっており、役に立たない部分が少なくない。

ベンダーの立場とすればユーザーがUIに従えば目的に辿り着けるというスタンスなのかもしれないが、ユーザーは既に機能を知っており、知りたいのはその機能がどこからどこへ移動したのかでしかなく、それを知る術はベンダー側は用意していない事が多い。

手順書

とあるシステムへのインストーラの作り方。

  1. Subversionからソースコードをチェックアウトする。
  2. 仮想マシンソースコードをコピーする。
  3. ソースコードをビルドする。
  4. 仮想マシンのDドライブのXXXXXというフォルダに年・月・日とバージョンを記したフォルダを作成する。
  5. XXXXXというバッチファイルを実行する。
  6. チェックアウトしたフォルダを4.で作成したフォルダにコピーする。
  7. XXXXXというバッチファイルを実行する。
  8. XXXXXというフォルダの前回のバージョンのフォルダをコピーして新しいバージョンにリネームする。
  9. workというフォルダにXXXXXというファイルがあったら削除する。
  10. 6.でコピーしたフォルダをホストPCにコピーする。
  11. ホストPCでXXXXXというフォルダのExcelブックを開いてマクロを実行する。
  12. ダイアログが現れるので、7.のバッチで出力されたファイルを指定する。
  13. 新しいExcelのシートが作成されるので、8.でコピーしたフォルダにあるExcelのブックにシートを追加する。

一つでも失敗したらどうなるんでしょうね。気が狂いそうになるわ。

ちなみにバッチファイルは何らかのエラーが発生しても決して通知しません。素敵です。

一体誰が考えたんでしょう。

考えた時、“面倒臭い”とか“手順を間違えそう”とか思わなかったのかな。

プログラマーという人間は、面倒臭い事を減らしたくなる性分だと思うので、プログラマーではないよね、きっと。