start

FreeBSDの環境そのままにCPU代えたらIllegal instructionでまくり

ASRock C2750D4Iは8コアAtom C2750搭載でSATAポートが12個もある、正にファイルサーバにうってつけのマザボである。Mini-ITXながら通常サイズのDDR3 DIMMが4本刺さり、やろうと思えば16GBモジュール×4で64GBものメモリが積めるのも素晴らしい。これまた大食漢のZFSにおあつらえ向きの仕様で、加えてIPMIでリモートで電源ON/OFFやBIOSがいじれたりして、刺さる人には刺さりまくりの素敵ママンだ。流石は変態紳士ASRock。

発売当初から目は付けていたものの、4万後半という値段に手が出せないまま円安と増税の影響で更に値上がりし、もう買えない…と諦めかけていたその時!偶然、JMC DirectでB級品が35000円弱で売られているのを見つけてしまったので光速でポッチッチ。

家鯖のFreeBSD 10.1-RELEASE環境はそのままに、早速Z77A-GD65 + Xeon E3-1260Lと入れ替えてみたところ、難なく動いた。

……と思ったのも束の間、portsで入れたソフトが軒並みIllegal instructionで落ちまくる!CPUTYPE?=nativeでコンパイルしたバイナリなので、Avotonじゃ実行できない命令が生成されてるんだろう。SandyBridgeからのグレードダウンとはいえ、同時期のCPUで実行できないほどのアグレッシブなコードを吐くclang先輩マジぱねっす。C2750用にビルドし直そうとしても、これまた軒並みIllegal instructionで落ちまくり。ツールチェイン、お前らもか……。たかがgmakeですら超最適化してくれるclang先輩マジ(ry

怪しそうなportsを片っ端からリビルドしたり、gdbで落ちてるライブラリを探ったり、どうしても分からん時はpackagesに逃げたりして何とか再構築できた。最適化ビルドも考えものだな…。少なくともカーネルを再構築する時は、無難な最適化オプションにしないと泣きを見そう……。そのためのCPUTYPE?なんだろうし(?付きの方はカーネル構築時には適用されないらしい)。

1年以上放置してたWindows Updateが全然進まない件→解決

(2016-04-19 追記)
多くの方にご参照頂いているようなので、自分が行った手順を完結にまとめておきます。

  1. Windows 7のシステム更新準備ツールを実行(約半日)
  2. Windows Updateエージェントを最新バージョンに更新(時間失念。多分そこまで掛かってない)
  3. 再度Windows 7のシステム更新準備ツールを実行(2〜3時間)
  4. Windows Updateを実行(全部入れるのに約半日)
    • いきなり全てを入れると時間かかるし失敗した時の精神的ダメージが計り知れないので、数個ずつ適用していく。
    • .NET Framework系の更新は特に時間がかかる傾向にあるので、時間に余裕がある時に行った方が無難です。

自分のマシンがしょぼいという点を差し引いても、兎に角時間がかかるので辛抱強く取り組むしかありません。

仮想マシン上のWindows 7 (64bit)のWindows Updateを1年ぶり位にやってみたら全然進まないでやんの。更新件数は113件程とそこそこあり、ホストが貧弱Avoton Atomとはいえ、半日放置しても「更新プログラムをダウンロードしています」が0%からピクリともしないのは流石におかしい。一番ボトルネックになりそうなストレージは仮にもSSDだし。

止むなく一旦キャンセル→再起動からの再実行してみたら、今度は最初の「更新プログラムを確認しています」から進まなくなった\(^o^)/

それから色々やってみて、何とか無事更新が出来たが、超絶時間がかかった。取りあえず、効果があったと思われるのは以下のもの。

システム更新準備ツールを実行し(これが超時間食いで終了まで半日くらい掛かった)、Windows Updateエージェントを最新にして、もう一度システム更新準備ツールを実行(今度は2〜3時間で終了)した所、うちの環境では問題が解決した。それでも最初のWindows Updateが完了するまでは更に数時間かかったけど…。

 初めてこの画面を拝むまで半日!

BITSのトラブルシューティングやWindows Updateのキャッシュのクリアは然程意味がなさそうに思えた。特にキャッシュのクリアは意味がないどころか、逆に悪影響な気がした。どちらも何の根拠もない私見なので悪しからず。

しっかし、何もしてないのにOSの最重要コンポーネントがおかしくなるのは止めてもらいたいもんだね。Windows Updateがぶっ壊れるだけならまだいいが、ぶっ壊れた結果、関連のバックグラウンドタスクがCPUとメモリをバカ食いするのが頂けない。CPUを常時25%のメモリ2GB超を持ってくんだから、貧弱マシンにゃ辛いのよ(それでWindows Updateの不具合に気付いたのだけども)。最近頻発してるらしいし、どうしちゃったのゲイツ。

まぁ、1年も更新を怠るなって話ではあるが…。

C#のstring.Trim()は全角スペースまで削って下さりやがる

C#のstringクラスにあるTrim()メソッドは、C#の三大便利関数の1つと言って良いくらい便利な関数だ。

言わずもがな、文字列の先頭と末尾に付随する空白を削除してくれる関数であるが、空白って一体なんなのよというと「Unicodeが定める空白文字」である。従って、Trim()は文字列の前後からUnicodeが定める空白文字を削除する関数という事になる。(更に言うと.NET Frameworkのバージョンによって細部の挙動が違う。詳細はMSDNを参照の事。)

んじゃんじゃUnicodeの空白文字ってなんぞ?というと、C#的にはChar.IsWhiteSpace(letter) == trueとなる文字である。詳細はUnicodeの規格書なりWikipediaなりを見て頂くとして、true判定になる文字には半角スペース(U+0020)やタブ文字(U+0009)は然ることながら、全角スペース(U+3000)も含まれるのだ。つまりTrim()を使うと全角スペースも奇麗さっぱりなくなっちゃう。なんというか、C/C++の非WIDE文字な文字列操作に慣れている身からすると、直感とは異なる挙動なわけ。

今回はこれにハマった。削られちゃマズい全角スペースが見事になくなってて、Trim()の挙動を初めて知ったという(´・ω・`)

回避策は引数ありバージョンのTrim()で、全角スペースを除いた空白文字配列を渡すしかない模様。↓こんな感じで拡張メソッド化しておくと便利に使えるよ(`・ω・´)

public static class MyStringAdditions
{
    static char[] WhiteSpaceDelimiters = new char[] {
        '\u0009',  // CHARACTER TABULATION
        '\u000A',  // LINE FEED
        '\u000B',  // LINE TABULATION
        '\u000C',  // FORM FEED
        '\u000D',  // CARRIAGE RETURN
        '\u0020',  // SPACE
        '\u00A0',  // NO-BREAK SPACE
        '\u2000',  // EN QUAD
        '\u2001',  // EM QUAD
        '\u2002',  // EN SPACE
        '\u2003',  // EM SPACE
        '\u2004',  // THREE-PER-EM SPACE
        '\u2005',  // FOUR-PER-EM SPACE
        '\u2006',  // SIX-PER-EM SPACE
        '\u2007',  // FIGURE SPACE
        '\u2008',  // PUNCTUATION SPACE
        '\u2009',  // THIN SPACE
        '\u200A',  // HAIR SPACE
        '\u200B',  // ZERO WIDTH SPACE
//      '\u3000',  // IDEOGRAPHIC SPACE -- これが所謂全角スペース
        '\uFEFF' // ZERO WIDTH NO-BREAK SPACE
    };
 
    public static string TrimWithoutZenkakuSpace(this string str)
    {
        string s = str.Trim(WhiteSpaceDelimiters);
        return s;
    }
}

この件とは直接関係ないけど、TrimStartTrimEndなんてメソッドもあったんだね。取り除きたい文字の配列を渡すと、対象文字列の先頭もしくは末尾から除去してくれる。Trimの分割バージョンみたいなやつ、というよりもTrimTrimStartTrimEndの合体技と言った方がいいか。覚えといて損は無さそう。

TOSHIBA MQ01ABB200R購入

家鯖のHDDが手狭になってきたので、東芝の2.5インチで2TBなHDD、MQ01ABB200のリファービッシュ品MQ01ABB200Rを購入した。

モノ自体は傷・汚れはなく、至って普通のバルクHDDという感じ。RMAで送られてくる如何にもなリファービッシュ品とは雲泥の差だ。ベンチマークとS.M.A.R.T.なんぞ載せてみる。USB 3.0変換なので参考程度に。

一応、リファービッシュ版専用のファームが書かれているようだが、モデル名が違うだけな気がする。AY000Uというファームバージョンも同一みたいだし。

ついでに、WD DLGDIAGで検査したあとのS.M.A.R.T.も載せてみる。

うむ、温度、使用時間、ロードイン時間がそれなりに変化しただけだな。尚、検査は無事に通過した。

あ、そうそう、念のため書いておくけど、このHDDは15mm厚なんで要注意。Seagate以外からも9.5mm厚の2TBが出て欲しいんだがなー。

com.hp.help.tocggeneratorのエラーログを止める

OSXのコンソールログを見ていたら2015/08/01 9:10:26.559 com.apple.launchd.peruser.501[188]: (com.hp.help.tocgenerator) Throttling respawn: Will start in 10 secondsこんなログが延々出続けていた。

ウザいのでどうにかすべくググった所、HPのフォーラムに解決方法が載ってた。ターミナルで以下のコマンドを実行せよとの事。

launchctl unload /Library/LaunchAgents/com.hp.help.tocgenerator.plist
sudo rm -f /Library/LaunchAgents/com.hp.help.tocgenerator.plist

無事、出なくなった。

  • start.txt
  • 最終更新: 2022-07-27 15:26
  • by Decomo