Logical Rabbit.

さくらのVPS

ConoHaの既存プラン(メモリ1GB)のイメージを512MBプランでロードできなかった話。

Twitterのほうで呟いていたものを整理しました。「諦めて手動で移行しろ」←結論。

問題

ConoHaでメモリ512MB、SSD20GBプランが新設されました。既存の最安プラン(メモリ1GB、SSD50GB)より300円弱お安くなります。

以前からConoHaの1GBプランでOwnCloudのアプリケーションイメージをロードし、データ格納先としては同じくConoHaのオブジェクトストレージを使用していたのですが、この場合フロントエンドとなるVPS側はほとんどディスクを使用しません。ルートディレクトリからの実測で9GBくらいです。

これで50GBはもったいないし、とはいえリアルタイム同期させている都合上開発サーバー等にするのは扱いが面倒になるので、新プランのSSD20GBに縮小移行しようと思ったわけです。

で、VPS上で通常シャットダウン→ConoHaコントロールパネルで手動バックアップ→新しいVPSを512MBプランで選択、イメージタイプ:「保存イメージ」で作成しようと思ったのですが…イメージのリストに出てきません。

1GBプランで選択すると出てくるので、モノとしては存在する様子。というか以前別の目的でバックアップした開発環境VPSのイメージもリストに出てこない。

調査

挙動からして何かフィルタリングされているように見えたので、 ConoHa API 側からつつけば理由が分かるかと調査を開始。

以前開発した ConoHaでメール送信するツール でAPIアクセスの基本部分は出来ていたので、これを改造して利用しました。…というかこのアクセスライブラリ部分は切り分けて公開しましょうかね。OpenStackクライアントライブラリだとConoHa独自(?)のメールサーバー機能とか、使えない様子だし。

以前作ったコード に機能を追加。

    def list_image( self ):
        try:
            response = urlopen( urllib2.Request(
                urljoin( self.imageservice_endpoint(), '/v2/images' ),
                None,
                self.auth_headers
            ) )
            self.http_status = response.getcode()
            if self.success():
                infos = json.loads( response.read() )

                image_info = {}
                for info in infos['images']:
                    image_info[info['name']] = info

                response.close()

                return image_info
            else:
                response.close()
                return self.http_status
        except HTTPError as err:
            self.http_status = err.code
            return self.http_status
        else:
            response.close()

さらに呼び出し側も改造。

from conoha import ConoHa

import sys
import json

def exit_if_failure( conoha ):
    if not conoha.success():
        print( 'HTTP_STATUS: ' + str( conoha.http_status() ) )
        exit( 1 )


with open( sys.argv[1], 'r' ) as config_reader:
    config = json.loads( config_reader.read() )

conoha = ConoHa( config['identity_url'], config['user_agent'] )

connect_response = conoha.connect(
    config['username'], config['password'], config['tenant_id']
)
exit_if_failure( conoha )

image_list = conoha.list_image()
for name,image_info in image_list.items():
    if 'private' == image_info['visibility']:
        for key in image_info.keys():
            print( key + ':' + str(image_info[key]) )

        print( "\n" )

結果(だめでしたー)

APIの「 イメージ一覧を取得 」でチェックしてみると、「min_disk:50」となっています。

$ python list_image.py  config.json
container_format:ovf
min_ram:0
updated_at:2016-11-02T01:13:15Z
file:/v2/images/XXXXXXXXXX/file
owner:YYYYYYYYYY
id:XXXXXXXXXX
size:35246112768
self:/v2/images/XXXXXXXXXX
disk_format:qcow2
direct_url:file:///var/lib/glance/images/YYYYYYYYYY/XXXXXXXXXX
app:ownCloud-8-64bit
schema:/v2/schemas/image
status:active
tags:[]
hw_qemu_guest_agent:yes
visibility:private
min_disk:50
instance_uuid:ZZZZZZZZZZ
name:owncloud
checksum:ed2798eb07530bc79aa073c6e26f6e76
display_order:280
protected:False
os_type:lin
created_at:2016-11-02T01:08:03Z

(他のバックアップ情報は割愛、IDの類はマスク)

同じAPIから取得できる、ConoHa提供の既存OSテンプレートは概ね「min_disk:20」、一部のみ「min_disk:50」となっているので、どうやらこれが、イメージをロードするVPSが最低限持つべきディスク容量のようです。

…ただ、メモリ512MBプランでディスク容量を「SSD 220GB」にしても表示できないので、微妙に別の問題が絡んでいそうな気もします。

あと何故か実測9GBしか使用していないOwnCloudフロントエンドを手動バックアップすると32.83GBになるので、どちらにしてもこのままではSSD 20GBにロードすることはできないのですが。

min_diskを20に出来れば、あとはsizeが20GB以下ならロードできそうな気もするのですが、APIを見る限りこの情報を書き換える機能は無い様子なので、まあ詰みましたかね、と。

後はAPI側のVPS構築機能でメモリ512MBプラン+min_disk:50 のイメージを指定した場合にどこかでチェックされているか否か、というポイントがあるのですが…さて。

CentOS 7でBB無線ルータを組んだ時、無線LANから有線LANへWoL信号を飛ばしたい。

CentOSでイチからBB無線ルータを構築した際、ポートを越えてWoL(Wake on LAN)信号を飛ばす方法がようやく分かったのでメモ。…これでいいんだよ…ね?

前提条件

  • CentOS 7を2ポート有線LAN+無線LANのマザーボード(MSI製 Z97I AC)にインストールしてBBルータを構築
  • 有線LANの1つ目をインターネット側光ケーブルのOSUに接続、有線LANの2つ目と無線LANはイントラネットとして設定
  • イントラネットは基本的にdhcpdによるIP払い出し、主要なマシンのみIP固定
  • 有線LAN(イントラ)と無線LANは同一セグメント

方法

  1. /etc/dhcp/dhcpd.conf にて、DHCPにおいてMACアドレスとIPアドレスを固定で紐づける
  2. arp -s <IP address> <MAC address> としてARPテーブルにおいてMACアドレスとIPアドレスを固定で紐づける
  3. firewall-cmd --add-port=9/udpとしてWake on LANが使用するポート番号9(UDP)を解放する
  4. Wake on LANするときは対象マシンのIPアドレスとポート番号を指定して送信する(同一ポート上で実行する場合はブロードキャストモードで送信するか、IPアドレスとしてブロードキャストアドレスを指定して送信している筈)。

firewalldでMACアドレス指定の信号をポート間で通すとか、ブロードキャストを通すとかできれば済むような気はしていたのだけど、私の実力じゃ調べきれず、結局この方法で解決できたのでまあ良しとしたい。ポート9(UDP)がフル解放されている気がしないでもないが…うぅむ?

arpテーブルに気付いたのは、対象マシンを止めた直後であればWOLが通るので、もしかしてIPアドレスが誰に割り振られているのか分からなくて迷子になってるんぢゃね? と。マシン停止直後だとDHCPのリースとか生きてるだろうから、その辺を固定化してやればいいんぢゃね? という具合。

なおCentOS 7だとarpではなくip neighを使うべきらしいのだけど、Blogに纏めるにあたり試してみたもののこちらのコマンドでテーブルに追加する方法がうまくできず断念したなど。

本当はWake on LANのマジックパケットの仕組みとかから調べ始めていたのだけど(うまく通過できないから専用のサーバ立ててしまえばいいんじゃね、とか思った)、この辺りって軽くググった程度だとうまく見つかりませんね…? まあ結局無駄なこと調べていたっぽいけど。

ICS形式のカレンダーデータをJavaScriptでいじるときのメモ。

…これ、結局「Ical」と「Webcal」って何がどう違うんでしょうね…。何度調べてもよく分からん。ともあれ、扱うデータは「*.ics」なので「ICS形式」と呼んでおけば間違いなかろう、と。

某所で提案しようと下調べしていたのだけど、概ねめどが経ったところで募集状況を見に行くと既に終わっていたいつものパターンでしたとさ。まあフルタイム職が終盤に差し掛かってちょいと忙しかったしね…。というところで調べた成果の記録と供養など。

実行環境と使用ライブラリ

実行環境としてはNW.jsを使用して、Node.jsで実装しています。NW.jsはJavaScriptとHTMLとCSSでお手軽に書けるうえ、JavaScriptなのでWebアクセス系は楽々扱え、しかも実行バイナリはWindows、Mac OS X、Linuxと幅広く対応できるのがとても良いと思います。

コンパイラ系言語を使わなくて良いというより、クロスプラットフォームが簡単に実現できる、モノによってはWebアプリケーション化まで視野に入れることができるという点が気に入っています。

でも最近Go言語も気になっているのだけど、あっちとの比較はどんなもんだろう…?

もとい。

使用ライブラリは icalパッケージ。加えて、画面制御系としてjQueryも使います。

実装

icalパッケージでWeb上のICS形式読み取りとオブジェクト化は容易に実現できます。

問題はICSから読み取ったイベント情報が「繰り返し」だった場合。

例えばGoogleカレンダーで「2016年1月1日から12月30日まで、毎週金曜日に「今日は金曜日!」とセットした場合、ICSデータには「毎週金曜日に「今日は金曜日!」と追加されるのではなく、開始が1月1日、終了が12月30日、かつ「週ごとの繰り返しで金曜日のみ有効」というルールが付与されたイベントが1件だけ追加されます。

このようなイベントをicalパッケージで処理した場合、rruleプロパティ内に繰り返し情報が格納されます。さらに rrule.all() とすると具体的な日付に展開したArrayが返ってきますので、これを使用することで他のイベントと同じように日付として扱うことが可能になります。

(以下のCALENDAR_URLで指定しているカレンダーは、非公開(ICSのURLを知っている人のみ参照可)として実際に置いてあります。

var ICal = require( 'ical' );

var CALENDAR_URL =
  'https://calendar.google.com/calendar/ical/u78uo80t8b784ojbbf265tpkv4%40group.calendar.google.com/private-8d07e17f65ddac761f8cf190f3e69fee/basic.ics';

ICal.fromURL( CALENDAR_URL, {}, function( error, data ) {
  if( error ) {
    console.log( error );
  }
  else {
    var keys = Object.keys( data ).sort();
    keys.forEach( function( key ) {
      var friday = data[key];
      if( friday.rrule ) {
        friday.rrule.all().forEach( function( realDay ) {
          console.log( [
            friday.summary, realDay.toLocaleDateString()
          ].join( ' ' ) );
        } );
      }
    } );
  }
} );

なお、rruleがあるデータの場合なぜかstart, endにはtoLocaleDateString()等が使用可能なデータが入っていませんので注意。

購入検討中の書籍メモ (2016.09)

…という名目のアフィリエイトリンク集。実際に買うか、いつ買うかは未定だけど気になっている本。全て電子版あり。実際に買ってレビューする気になったら別記事に分けると思われ。

ユーザーストーリーマッピング

実装技術というよりその1段上、ハンドリングとかディレクション系の本と理解。個人事業もしくは零細企業規模の職場でシステム開発をすると、どうしても発注主の意図を汲みつつ方向性をまとめたり調整したりする必要が発生するので、たぶんまとめて全体を把握した後、後々まで読み返すような使い方になるんじゃないかなー、と期待してます。

未購入(物理書店で軽く内容把握)、AmazonのほかオライリーのEbook Storeで販売中。

開眼!JavaScript

発行はかなり前なんだけどそういえば未読だったし、JavaScriptはどうしても「なんとなく」で使って覚えてしまっている部分が多いので、たまに基本を読み返すのに良いかな、と思った次第。ページ数も少なく、気になるところだけ流し読みするのにも良さそうだし。詳細は「JavaScript」とかをあたることにして、全体の復習はこちらで随時行う方向で。

未購入(物理書店で軽く内容把握)、AmazonのほかオライリーのEbook Storeで販売中。

現場でかならず使われているjQueryデザインのメソッド

個人事業やるようになって、やはりjQuery等でお手軽かつ見目良くWebサイト開発する需要は高いなぁと思うと同時に、自分自身のデザインバリエーションが少ないことを痛感してます。なにせ今まで「動けばよい」の世界というか「チェックマトリックスでテストできることが最優先のデザイン」の世界だったので「画面幅によってデザインが変わる」ような一般的な設計とは縁遠かったわけで(設計書どおりのデザイン配置にならないのはバグなので、画面幅を強制固定するのが正道、TABLEレイアウトこそ至高、の世界)。

デザイン(動き)さえ分かれば技術的には自分で考えて実装できると思うのですが、まあ使えるスペアタイヤがそこに転がっているのに使わない手も無いだろうと。

ということでサンプル集的な用途を期待。Webで色々見つけてくるのも、技術検証とか著作権確認とかが面倒になってきたから。

未購入(物理書店で軽く内容把握)、Amazon kindle版あり。

さくらのVPSをOS更新したい…という話。

現状このWebサイト等を公開運用している「さくらのVPS」は、OSがCentOS6.x系。そろそろCentOS7.xにしたい。あとリバースプロキシとかも一度再設定したいところ。

OS更新は面倒くさいし、どうせ6.xから7.xは色々変わるのでOS再インストールからやってしまいたいのだけど、いかんせんWebサイトを公開運用しているので長いこと止めるわけにもいかない。どこかに仮サーバーを設置しないと。

で、仮サーバーとして「さくらのVPS」を使うか「さくらのクラウド」を使うか、はたまた「ConoHa」に逃げるか。できれば同じさくらインターネット上のサービスを使ったほうが、仮移設時の問題が少ないように思う。「さくらのクラウド」にはVPSのイメージを元にクラウド側を構築する機能があるので、先ずこれで仮移設してしまえばよさげ。あとはDNS切り替えの問題とか。

問題は料金。

  • 「さくらのVPS」は初期費用がそこそこかかる。現在と同一プランだと月額972円+初期費用1,620円(合計2,592円)
  • 「さくらのクラウド」は初期費用は無いけど利用料金がそこそこかかる。VPSと同等で試算すると、14日利用で2,478円、月額3,132円…の筈。これ単一サーバー稼動の場合はネットワーク等のオプション要らなかったよな…?
  • 参考までに「ConoHa」は初期費用なし、月額900円または時間あたり1.3円。14日利用だと1.3円×24時間×14日=436.8円。このはたんサイキョー。

なお「さくらのVPS」は現在「2週間無料お試し」があり、まあ今回用途だと2週間もあれば用は済むので「お試し」だと言い張れば無料で使うこともできる。が、お試しではないし色々お世話になっているところなので、きちんと支払いをしておきたい。

無料お試し期間中でも決済をすれば支払いはできる筈なのだけど、"お試し期間中であっても、会員メニューより「本登録(決済)」いただくと、すぐに本サービスを開始することができます。なお、すぐに本サービスを開始いただいた場合でも、2週間は無料でご利用いただけます。"とあり、これ決済して2週間以内に解約するとどうなるんだろう…的な疑問も。

また"さくらのVPSの最低利用期間は3ヶ月"なので、2週間程度の利用目的でも3ヶ月分費用が発生してしまう。3ヶ月+初期費用だと4,536円。これを考えると「さくらのクラウド」で1ヶ月利用したほうが良いか。

「さくらのVPS」をもう1台契約、新契約のほうに移設後DNS切り替え、旧契約を解約という方法もあるのだけど、現契約は年間契約にしているため次の更新は2017年5月末…。今解約するのはもったいない。

結論としては、「さくらのクラウド」を試しに使いつつ1ヶ月以内でVPS側を再セットアップ、というところかな。VPSをそこそこ長く使っているとこの手の問題は出て来る筈なので、何か便利なサービスがあっても良いと思う今日この頃。

Google Apps Scriptで開発するときの備忘録。

最近クラウドワークスでのお仕事でいくつか Google Apps Script を使用したのだけど、なかなか使える良い子であると同時に癖もある奴なのでいつも使うパターンをメモするなど。

スクリプトの実行時間は1回あたり6分

仕様的には Quotas for Google Services を参照。

細かい処理をちょいちょいとこなす程度であれば気にする必要はないのだけど、大量のファイルとかを扱い始めるとハマる。というかハマッた。

対策としては「6分以内に終わらせる」もしくは「6分超えそうだったら一度中断し、改めて再開させる(中断・再開が可能なつくりにする)」の2パターン。ただこの制限値に引っかかるような処理をさせると結構動きがトロいのも分かるので、第3のパターンとして「Googleの外でやる(普通のサーバー上でGoogle APIを呼び出す)」を考えに入れておくべきなのかと思った。

処理を一度中断し、自動で再開させるのは Properties + Trigger 、ところにより JSON

いくつかググって、最終的には Google Apps Scriptで5分の壁(タイムアウト)を突破するを参考にしつつ自分なりのパターンを作ることにしました。

  • スクリプトの処理開始時刻を保存しておき、開始後何分経ったかを随時チェック

  • 開始後6分を超過する前に十分な余裕をもって中断処理に入る

  • スクリプトの処理に必要なデータは Properties Service に格納する

  • ただし Properties はString value しか扱えないので、構造化データなどを格納したい場合は JSONフォーマットに変換して格納する

    • Propertiesへ格納する際は JSON.stringify()
    • Propertiesから復帰する際はJSON.parse()

    なお当初Base64を使おうとしていたのは秘密だ(待て)

  • スクリプトを終了後自動的に再開させるのは Script ServiceClockTriggerBuilder クラス。

  • 前述のBlogでも言及されていたし実際うまくいかなかったのだけど、Triggerで「after(durationMilliseconds)」があるくせにセットしてもちゃんと発動しない。…というか発動するのかもしれないけど「(plus or minus 15 minutes)」などとのんびりしたことを言われてしまっては使うわけにはいかんがな。せめて単位をsecondsにしてくれ…。

    everyMinutes(n) で毎分起動→起動後に多重起動防止のためトリガーを削除 のパターンでいきませぅ。

    ただ、ここはむしろトリガー追加+削除を繰り返すより、別途キューを用意しておき、毎分キュー確認→なにかあれば実行、何もなければ休眠、のほうがスマートな予感。

参考資料など。まー私が使ってるのはオライリーが販売しているPDF版ですがねハハハ(これはこれでよりによって「String」の項にしおりが設定されていないという痛恨のバグがある)。

DELLの25インチモニター U2515H を購入した。

購入してから10日、概ね安定してきたようなのでレビューを書いてみるなど。結論としては、もう一枚買っても良いかもなー、的な。

ディスプレイ モニター U2515H。通称ゆーちゃん(違う)

スペックとしては25インチIPSノングレア、WQHD(2560x1440)、sRGB99%です。これで5万円弱なのでかなり安い印象。27インチフルHD超になると10万円くらい見ておかないといけないので、ちょっと二の足を踏んでいたところなのでした。

非DELLの汎用モニターアームで使っていますが、標準装備のディスプレイスタンドもかなり使いやすそうではありました。ただ今の机環境だと、机にスタンドで置いてしまうと画面と顔との距離が近すぎてしまうので…。

解像度は十分です。Teraterm + tmuxで使っていますが、フォントサイズ14ptで縦70行(プラスviのステータス行+tmuxのステータス行)表示できます。フォント10ptだと流石に少し見づらいか。また、Windowsキー+横キーで画面半分に寄せても、tmuxの縦2列で77桁出てます。普段はフル画面縦2列を基本にしていますが。

ハード面の機能も使い勝手が良いです。まず背面のディスプレイスタンドは工具なしで付け外しが可能。ツメで止まっているので、斜めに差し入れて垂直に戻すと自動的にロックされ、外すときはボタンを押して斜めにすれば外れます。

スタンドを止める場所は一段くぼんでいて、その中にVESAマウントのネジ穴が、ネジ付で収まっています。ネジを外してモニターアームを取り付ければ完了。しかしアーム側に付いていたネジが余ったぞ(汗) 写真を見る限りDELL純正のモニターアームならばスタンドと同様に工具レスで取り付け・取り外しできるようなので、そちらを買ったほうがまとまりが良かったかも知れませぬ。うちには既にモニターアームが3つ転がっていたので、純正品を買うのは止めたのですが…。

入力端子はHDMI×2、DisplayPort×1、mini DisplayPort×1、その他USB 3.0 HUBが付いています。D-SUBとかDVIが無いのはまあ致し方なし。DP-MiniDPのケーブルが同梱されているので、DisplayPort対応のビデオカードだと最強の組み合わせかもですね。うちはHDMI出力なのでHDMIに入れていますが。

当初モニタがノイズ出まくったりブラックアウトで点滅したり、特にMikuMikuDanceとかをフル画面で出すと頻繁にブラックアウトするのでビデオカードへの高負荷が原因、買い替えかなぁと思っていたのですが、ビデオドライバを最新に更新し、HDMIも切り替え機を通さず直結したら安定稼動になりました。おそらく最大の原因はHDMI切り替え機と思われ。先代はHDMIが1ポートだけだったので切り替え機を通していたけど、今回は2ポートあるので切り替え機が使えなくても特に困ることは無いでしょう。

なおビデオカードはNVIDIA GeForce GTX750 DDR5 2GBです。これをHDMI(WQHD)、DVI(UXGA)、D-SUB(フルHD)の3画面出力で使用中。

DELLが基本的にネット直販で現物を見ることが出来ないのと、公式ストアでも海外からの発送になって衝動買いに向かないところなのですが、Amazonにプライム対応即納品があったので(しかも公式ストアより安い)、こちらでポチることにしました(事前に横浜ヨドバシカメラのDELL売り場行ったのだけど、該当品が無かった…)。

CentOS 7 でコマンドラインからBluetooth接続を操作する

bluetoothctl を使えばイイっぽい。root権限が必要っぽい?

コマンド自体はbluezパッケージに入っています。特にインストール指定した記憶は無いので、X Windowとか入れてやれば入ってくるもの、かも。ところでこのパッケージ名、なんかトイレに置くだけのアレを連想するのはあたしだけですかね…?(ヤメロ)

$ yum info bluez
インストール済みパッケージ
名前                : bluez
アーキテクチャー    : x86_64
バージョン          : 5.23
リリース            : 4.el7
容量                : 3.7 M
リポジトリー        : installed
提供元リポジトリー  : base
要約                : Bluetooth utilities
URL                 : http://www.bluez.org/
ライセンス          : GPLv2+
説明                : Utilities for use in Bluetooth applications:
                    :         - hcitool
                    :         - hciattach
                    :         - hciconfig
                    :         - bluetoothd
                    :         - l2ping
                    :         - rfcomm
                    :         - sdptool
                    :         - bccmd
                    :         - bluetoothctl
                    :         - btmon
                    :         - hcidump
                    :         - l2test
                    :         - rctest
                    :         - start scripts (Red Hat)
                    :         - pcmcia configuration files
                    :
                    : The BLUETOOTH trademarks are owned by Bluetooth SIG, Inc.,
                    : U.S.A.

例えば MCO TK-BT01 キーボードを接続すると以下のような感じ。MACアドレスは各々XXとYYの羅列にマスク、hostnameはログインしている機体のホスト名が出ますが、一応マスクで。

$ sudo bluetoothctl
[NEW] Controller XX:XX:XX:XX:XX:XX hostname-0 [default]
[NEW] Device YY:YY:YY:YY:YY:YY MCO TK-BT01
[bluetooth]#
[bluetooth]# devices
Device YY:YY:YY:YY:YY:YY MCO TK-BT01
[bluetooth]# connect YY:YY:YY:YY:YY:YY
(ここでBluetooth機器側も接続待機にしませぅ)
Attempting to connect to YY:YY:YY:YY:YY:YY
[CHG] Device YY:YY:YY:YY:YY:YY Connected: yes
Connection successful
[bluetooth]#

connect <MAC ADDRESS> の時点でBluetooth機器側が接続待機になっていないと、以下のような感じになります。

[bluetooth]# connect YY:YY:YY:YY:YY:YY
Attempting to connect to YY:YY:YY:YY:YY:YY
Failed to connect: org.bluez.Error.Failed
[CHG] Device YY:YY:YY:YY:YY:YY Connected: yes
[CHG] Device YY:YY:YY:YY:YY:YY Connected: no
(以下yesとnoの繰り返し)

このコマンドmanがインストールされてないし --help してもろくな内容が出てこないのだけど、基本コマンド名だけで起動、対話的に操作するものっぽい。取り合えず [bluetooth]# help とやればサブコマンド一覧が出るので、それを見ながらやれば良さげ。

[bluetooth]# help
Available commands:
  list                             List available controllers
  show [ctrl]                      Controller information
  select <ctrl>                    Select default controller
  devices                          List available devices
  paired-devices                   List paired devices
  power <on off="">                Set controller power
  pairable <on off="">             Set controller pairable mode
  discoverable <on off="">         Set controller discoverable mode
  agent <on off="" capability="">  Enable/disable agent with given capability
  default-agent                    Set agent as the default one
  scan <on off="">                 Scan for devices
  info <dev>                       Device information
  pair <dev>                       Pair with device
  trust <dev>                      Trust device
  untrust <dev>                    Untrust device
  block <dev>                      Block device
  unblock <dev>                    Unblock device
  remove <dev>                     Remove device
  connect <dev>                    Connect device
  disconnect <dev>                 Disconnect device
  version                          Display version
  quit                             Quit program
[bluetooth]#

無線LANの感度を上げるために部屋の天井近くに配置した機体、基本はssh操作なのだけどたまーにコンソール(X Window)ログインする必要があって、BluetoothがあるからBluetoothキーボードで操作すればいいいや…と思っていたら再起動するとBluetoothのペアリングが消える? ので面倒くさかったのですが、これならまずsshでログインしてキーボードをペアリング、その後コンソールログインすれば良さげな感じ。

と言うわけでキーボード的にはミヨシのTK-BT01がおススメです。テンキーの無いコンパクトキーボードながら、トラックボールとホイールまで付いており、PC、Mac、Android、iOSのフルサポートという逸品。前機種にあたる専用ワイヤレスアダプタのときは不可能だった、トラックボールの取り外し掃除も簡単になりました…っ(これは嬉しい)

PRIMERGY MX130 S2にCentOS 7を入れたらハマった。

AMD CPUのPRIMERGY MX130 S2 にCentOS 7をいれてyum upgradeしたら microcode: failed to load file amd-ucode/microcode_amd.bin などと言う謎のエラーを吐いて起動しなくなっているお話(現在進行形) (解決したのでオチを追記)。

古の激安サーバー()であるPRIMERGY MX130 S2が職場に2台あるわけですが、うち1代のHDDがS.M.A.R.T.エラーを噴いて撃沈したのをいいことに、CentOS 7で再構築を始めたわけですよ。とりま、 yum upgrade でまるっと更新かけたわけですよ。 kernel が更新リストに入っていたから、何も考えずリブートしたわけですよ。

…カーネルパニックみたいな状態になって起動どころかCTRL+ALT+DELすら受け付けない状態になったわけですよ(汗)

電源断して起動時に1つ前のkernelを指定したところ無事起動したので、dmesg.oldを見たところ、最後のメッセージが冒頭の “microcode: failed to load file amd-ucode/microcode_amd.bin”。

で、このメッセージでGoogle検索してみると、以下のバグトラックが出てきた。どうも同じ現象っぽい。

0007331: Failed to load file microcode_amd.bin

実際、 /lib/firmware/ の中に amd-ucode/ というディレクトリ自体が存在しないのでそりゃファイルのロードもできないよね、という状態ではあるのだけど、今一つ分からないのが、今回の現象が意図的に行われたのか誰かのミスなのか、というところ。

英文なんで斜め読みで取り敢えず解決方法だけ探してる状況なのですが、解決方法自体はまあ、バグトラックに言及があるURLからmicrocode一式をダウンロードして入れてしまえば良さげです。

ただ仮に今回の現象が意図的なもので、今後kernelにはこのファイル群が入らないとなると、このサーバー機はCentOS 6止まりにしておくとか、運用終了も考えたほうが良い気がします。ただ、意図的な足きりならば、この手のバグトラックは割と早い段階で開発当事者の人が出てきて「そいつはもうサポート外だ」で 終わると思うんですよね。なにやら話題は継続している様子だし、足りないファイル入れておしまいなら早々にバグフィックス版が出てもよさそうなのに、1年以上もスレッドが続いている。

そして何より気にかかるのが、PRIMERGY MX130 S2を買った、CentOS入れたという日本語記事はわりとGoogle検索にひっかかるのに、このバグに遭遇したという日本語記事が出てこない。みなさんなんで大丈夫なの??

ともあれ、明日(というか今日)出勤したら、問題のファイル群を押し込んで経過観察する予定。

[2015.12.29 追記]

いや本当は12/17に解決していたのだけど、記録する暇が無くて…。

結論。microcodeは関係なかった。つか然るべきファイルを置いてみても「ファイルが無い」というエラーは出ていないもののフリーズする現象は止まらず。再度ググったところ、以下と同じ現象だった模様。

Kernel 3.10.0-327 issue on AMD Neo processor

同じ方法で対策してみたところ、安定稼働するようになりました。その後本格的なシステム構築を始めて仕事納めの12/25まで24時間動作続けています。

しかしclocksource_done_bootingってなんだろう…。名前から察してタイマー割り込み系かしら。

ruby-2.1.7 の make test で TestException#test_machine_stackoverflow_by_define_method が出たときの対処。

TestException#test_machine_stackoverflow_by_define_method でググって見つけた issue の修正内容を適用してみたら改善できたのでメモ。

ruby 2.1.7 で見つかって ruby 2.2.0 で対策されていたので、今出ているruby 2.1.7パッケージには反映されていない、と言うことなんだろう、多分。

問題のissueは Bug #9739 。以下は修正個所の転記(何かの拍子に原典が消えてしまうと困るので)。

diff --git a/configure.in b/configure.in
index f52e0ba..078f9ba 100644
--- a/configure.in
+++ b/configure.in
@@ -2782,7 +2782,7 @@ if test "$with_dln_a_out" != yes; then
            rb_cv_dlopen=yes],
    [cygwin*|mingw*], [
            : ${LDSHARED='$(CC) -shared $(if $(filter-out -g -g0,$(debugflags)),,-s)'}
-           XLDFLAGS="$XLDFLAGS -Wl,--stack,0x00200000,--enable-auto-import"
+           XLDFLAGS="$XLDFLAGS -Wl,--stack,0x01200000,--enable-auto-import"
            DLDFLAGS="${DLDFLAGS} -Wl,--enable-auto-image-base,--enable-auto-import"
            : ${LIBPATHENV=""}
            rb_cv_dlopen=yes],

修正後、念のため make clean ; ./configure ; make までやったら make check でエラーが無くなった。