ʍoɹɐɥsのブ口グ

ส็็็็็็็็็็็็็็็็็็็็็็็็็ ส็็็็็็็็็็็็็็็็็็็็็็็็็ ส็็็็็็็็็็็็็็็็็็็็็็็็็ ส็็็็็็็็็็็็็็็็็็็็็็็็็ ส็็็็็็็็็็็็็็็็็็็็็็็็็ ส็็็็็็็็็็็็็็็็็็็็็็็็็ ส็็็็็็็็็็็็็็็็็็็็็็็็็ ส็็็็็็็็็็็็็็็็็็็็็็็็็ ส็็็็็็็็็็็็็็็็็็็็็็็็็ ส็็็็็็็็็็็

猫と小判とArchLinux

これはArch Linux Advent Calendar 2015の8日目の記事です


ArchLinuxを使うことになった経緯

私は基本的にずーーっとMicrosoftユーザーでしたが、その経緯や涙あふれる感動の嵐(ただし青い)はここではスキップすることにします。根っからのWindowsユーザーがなぜLinuxを使うことになったのかというと、相次ぐVPSサービスの開始があり、VPSではまぁ普通はLinuxを使うものだと思っていて、しょうがなく使い始めたような気がします。それはこのプレスリリースを見て「980円!安~」と思った勢いで始めたので時期は2010年の冬あたりですね。そう、丁度震災の少し前でした。

それまでWindowsばっかりでしたが、UNIX系には触れる機会は何度かありました。大学にはSolaris*1がありましたし、IRIX*2上でOpenGL*3で遊んだこともありました。家でFedoraを試したりSuSEも少しだけ入れてた時期もありました。しかしその当時私が使いたいソフトウェアはWindowsMacでしか動かず、基本はやっぱりWindowsでした。使いたいソフトウェア、一部のユーザーにとってとても有用なソフトウェアがWindowsMac(OSX)でしか動かないのは残念ながら今も同じです*4。逆もしかりですが。

それはさておき、VPSのディストリはCentOS 5でした。CentOS全体をディスるつもりはないのですが、まぁちょっと気に入らないとこがあったんですね。理由はブート時にコンソールを見ていると"Starting Sendmail:"で固まったかと思うほど待たされること。もちろん、ググればすぐ解決するようなことなんだけど、そもそも、なんでsendmailなんてものが入っているんだ??*5

この感覚、わかりますかね。買ったばっかりのWindowsPCなのにスタートをクリックするとプリインストールされたゴミみたいなソフトがわんさか入ってる、あの感覚。「駅すぱあと」とか「AOLインスタントメッセンジャー」とか「なんとかかんとか簡単セットアップ!」とか、一生クリックしないアイコンのコレクション。これと近い感覚をCentOS5に感じてしまったのです。「くそ、最初から余計なもの入れやがって!」。


私の好きなことわざに「猫に小判」があります(もっとも、知ってることわざなんて数個ですけども)。意味は

価値の分からない人に貴重なものを与えても何の役にも立たないことのたとえ。

だそうです。これはこれでよい教えですが、私が好きな理由はUNIXパロディ版がまた面白いからです。そっちの文脈での意味は

catコマンドにはその作者が便利と思って実装したオプションがたくさんあるが、ユーザーの99%はそれを使わない。

です。これは記憶で書いてるので、原文を見たい方は「C言語を256倍使うための本」を古本屋で探してみてください(ちなみにめっちゃおもしろい本です)。

たぶん、私にとってsendmailなどもろもろのプリインストールソフトは「猫に小判」だったんです。価値がわからないだけでなく邪魔でしたがね。そんなこんなで、CentOS以外のディストリを試して回ったり調べたりして、小判がほとんど入ってないディストリ、ArchLinuxを知ったのでした。どうやらこれは猫向けです。

これをなんとかVPSに入れてやろう。幸いさくらのVPSは再インストールボタンで簡単に初期状態に戻せるので試行錯誤ができました。スワップ領域の1GBを潰してArchLinuxのISOをそこに書き込んで、GRUBにそこからブートさせるという方法です*6スワップ領域を潰してISOからブートさせていた先駆者のブログ記事に助けられました。当時私の持ってるPCはCoreSolo 1GHz*7のノートPCだけでして、VMXにも対応しておらずドライブの空きの問題もあり、仮想マシンで試すより実際にVPSでやるほうが早かったのです。こうして私は人生初なのにいきなりVPS上でArchLinuxを使い始めたのでした。*8

私は猫だが、ここに小判はない。猫が価値を認めないものは何一つ入っていない。価値を認めたものだけ後で入れればいい。


...とはいえ、catコマンドのオプションを何一つ使ったことが無いのは認めざるを得ないところです。 *9


*1:zfsの故郷

*2:xfsの故郷であり、OpenGLの前身(IRIS GL)の故郷

*3:当時のOpenGLは1.2か1.3で、今のOpenGLとは別物でした。いわゆるRGB本が教科書の時ですね。このときはみんなglPushMatrix()で何かを積み上げていました。

*4:The "Linux Sucks" SeriesでBryan Lundukeは特に生産者向けのマルチメディア、作曲や動画編集の環境がLinuxではとても厳しい状況であると指摘しています。

*5:CentOSのために言っておくと、とっくに解決されてると思います。・・・よね?

*6:当時はISOアップロード機能がなかったのです

*7:今もネイティブでArchLinuxいれて現役です

*8:もしあの時sendmailが私をイラつかせなかったら、私はCentOSユーザーになっていたかもしれません。人生は不思議です。

*9:今見てみたけど、-sくらいは覚えておいてもいいかもしれない

WiMAXがクソになったと言ったがあれはウソだ

WiMAX2+の以降に伴い、基地局(マイクロセル)の統廃合とかあったんでしょうか、前までWiMAXの電波が3本入っていたのが、1本~2本になってました。向きを変えたら2本で安定になり、通信速度はかなり改善された。実測で400KiB~600KiB/s出る。これくらい出て制限無しならいいんじゃない?別にWiMAXは解約せずに今のままでいい気がしてきた。どうせ使い続けるならWiMAX2+に乗り換えても損はない。

電波は3本入ればもうちょいスピード出ると思われる。きっとURoadHomeとかにすると電波の入りもいいんだろうな。思えばあんまり外で作業しないし、外で作業するときはだいたいSSHなのでスピードはそんなにいらない。そういう時用にはDMMmobileとかのデータSIMでいいのかもしれない。据え置きのWiMAX2+とDMMmobile、どっかで聞いた話だがこれは良さそうな気がする。

WiMAX2+も制限が3日間というのが結構公平性があって良い気がしてきた。いきなり制限されることはないから、1日に50GiBの爆通信をすることもできるし、制限食らっても400KiB/sほどは出てしまうのだから、あー、何が問題なの?っていう気になってます。

移住キャンペーンはまだやってるので12月にWiMAX2+に移行しようかな…。

最近感じた債務(負債)

f:id:sharow:20151120094414j:plain

モニターがぶっ壊れた。いいヤツだったよ。まじで、EIZOの10bit出力対応機種だったし。

よくEIZOは5年保証だと売り込んでるけど、実はパネルは3年保証でパネル以外が5年保証という仕組み。今回は3年以上経っていて、修理に出したら壊れた箇所はパネルだという。送られてきた見積書は新品より高い値段なので修理する気ゼロとみた。

ま、それはいいんだけど、PC用モニターは再生エネルギーなんとか法とか資源有効利用促進法とかいうので、捨てる時は粗大ゴミじゃなくて生産者が回収するという仕組みになっている。もちろん有料で、しかも粗大ゴミと違うからメーカーなりメーカーが契約してる団体なりに連絡して回収施設に送らなければならない。めんどくさい。

(ちなみにEIZOはリサイクルシールを購入後に申し込まなければもらえない。申し込むと郵送で2cm画くらいのシールが送られてくる。Appleのラップトップなんかは最初からシールも付いてくるのに、なんでわざわざ?)

これがいままで気付かなかった債務。壊れるまでは自分にとって資産としてしか考えてなかったものが、壊れた瞬間に債務になる、とっても物理な例になった。今回の例だと、普通に有料粗大ゴミとして回収してもらえると思ってたものが、そうじゃなかったという単なる無知によるものだけど、実はこういう無知とか予見不測なケースってけっこうあるのかもしれない。例えば免許とか銀行口座というのは持ってると役立つ資産ではあるけれど、引越し時や紛失時に想定外にめんどくさい債務を弁済することになる。放置するとさらに大きな債務が降りかかるリスクがあると分かってるから弁済する「必要がある」と言っていいほど自己拘束力がある。資産のすべてに債務の面があると想定すると、いままでは資産面しか見えてなかったなぁと思うことがある。

断捨離とかミニマリストみたいのが流行ってる(あるいは叩かれてる)らしいけど、根底にあるのは「永遠に資産ではない」「いつかはゴミになる」っていう当たり前の事なんじゃないかな。さしあたり、うちの所有物・・つまり処分する債務を負っているモノで量的に大きいのは本と・・・うむ、とにかく本だな・・・。

WiMAXがクソになった

追記: 10/24の深夜、丁度帯域移行のタイミングらしいのでその影響かもしれません 以後変わりませんでした

10月23日ごろから、うちの地域も元祖WiMAXの帯域の一部がWiMAX2+にとられるようになった故と思われる通信速度の低下がおきた。最初は障害かと思ってたけど直る気配がない。2011年からずっとお世話になってきたけど、そろそろ見納めかなーという気がしてきた。

実測がどれくらいかというと、うちの環境では平均で120KiB/sくらい。最高(深夜)で340KiB/s、調子が悪いと60KiB/s(混雑時?)。昔使ってたWILLCOMの安物データ通信プランのようだ。なぜWiMAX2+への乗り換えをしなかったかというと、やはり3日で3GiB(当初は1GiBだった)の制限があるから。ひっかかるかひっかからないかとかもあるが、通信量を気にしなきゃいけない心理状況が嫌だったし、3GiBなんてVPS上へのデータのバックアップとか、youtubeの動画とかみてたらどう考えてもすぐに突破してしまう気がしたのと、それならば制限かかったときのフォールバックである元祖WiMAXのままと考えた方が制限が無いので楽だし、プランが変わるから契約タイミング(解約手数料無料の月)が変わってしまう、こっそり2台持ち(機器追加オプション)が無くなっていること・・などなど。帯域が変わる前までの実測が平均で1300KiB/s程度だったので、40Mbpsから13.3MBpsへの変更で平均400KiB/sくらいに落ちるかもなーと思っていた。実際にふたを開けてみるともっと悲惨だった。

WiMAXには通信量による制限なしでそこそこスピードが出る、というニッチに輝いている唯一のワイヤレスだと思っていただけに残念。そもそも、容量制限付の220MBpsのスピードなんて求めていない。そんな人は最初っから無制限の有線を使ってる。無線の物理レイヤーでそんなスピードが出ても、全員にそのスピードを提供するだけのバックボーンはあるんでしょうか(無いから制限してるんだろうが…)。たしかUQは「電波は有限の資源であるから」とか云々いっていたけど、WiMAXはマイクロセル(とても小さな基地局のこと)で運用してるので、ひとつの基地局を大人数が奪い合うことはそんなにない。だから物理レイヤー(電波の有限性)の問題ではなくて、それらマイクロセルが有線で繋がってるUQKDDIのバックボーンがパンクするから通信制限を設けている・・のが本当のところだと思う。少なくとも、電波の有限性を言うなら1つのマイクロセルの帯域を多人数が奪い合うような状況が多数あるはずだし、その際の解決策は「サービス全体に制限を導入する」ではなくて、普通に、ごく普通に「その地域にマイクロセルを増設する」・・・だと思う。

例えると、40km/hでずっと走れる車だったのが、最高速度220km/hになったものの、燃費が悪すぎてある程度進むと人力になり13km/hに落ちてしまう車・・みたいな感じ。そしてどうせ人力になるなら、と、元祖WiMAXのままにした自分みたいな人はその遅さをいま味わっているところ。けども自分は一部で「集団起訴だー!」みたいにやってた「解約する自由すらない人」じゃないので、「解約する」という普通の選択肢をとることになりそう(実際これが企業にもっともダメージが大きいのだが)。

RaspberryPi ケーブルによって不安定になる

f:id:sharow:20150826061257p:plain

よく電源が足りないと不安定になるRaspberryPiだが、電源(定格出力)が足りてても不安定になることがあるようだ。同じ電源ソースで、ケーブルを変えたら途端に安定したので原因はケーブルで間違いないと思う。ケーブルを元のに戻すとまた不安定になる。

黒いほうが秋葉原で買った100円のケーブル、白いほうは単品では手に入らないと思われる、たぶんポータブルバッテリか何かに付属していたもの。白いほうが安定する、黒い方だと有線LANが不安定、それも再現する状況が分かりやすくて、CPUを100%使うとLINKのインジケータが消える。いかにも電力不足という感じ。

よく、電源はPCのUSBポートとかじゃなく、セルフパワーのUSBハブ、またはACアダプタ経由の電力ソースからとれ、と言われるのだけど、まさかケーブルが原因になるとは思っていなかった。ちなみに使ってるソースは2000mAのUSBアダプタで、機材は初代のRaspberryPi(256MB)。

買って安心なUSB充電ケーブルはこれだ! 〜 低抵抗モデルを求めてガチ検証してみた - mitok(ミトク)

USB極細延長ケーブルの電圧降下を測定してみた

f:id:sharow:20150826062001p:plain

秋葉原にいったついでにBMP085を買ったのでそのうちつなげてみる予定。本当はBMP180が欲しかったんだけど、そのときの秋月の店頭には置いてなかった。

BMP085使用気圧センサモジュール(I2Cインタフェース): センサ一般 秋月電子通商 電子部品 ネット通販

インターフェースはI2Cっぽいのだけど、RaspberryPiのポート的にDS18B20と共存できるのか不安。たぶんできる・・・。

一見textのメールだけども中身はHTMLメールで開封したかどうか確認されてることがある

f:id:sharow:20150713194411p:plain

このようなケース。multipartで送られてきていて、片方はtext/plainだがもう片方がtext/htmlになっている。見た目では違いが分からない。が、中にはサイズが1x1と思われるgifファイルが埋め込まれていて、IDがパラメータとして渡されている。ブラウザがそこにリクエストすることで開封した日時、受信者のUser-Agent(ブラウザの種類やOS)、IPアドレスまでもが取得されてしまう。

これをやってるのはIntelligent Communication | Outreachとかいうところ。メール出した相手を嗅ぎまわるようなこと、まだやってるとこあるんですね。たしかに出したメールを相手が読んでいるかどうかは、次のメールを出すべきかどうかの重要な情報源になるし、何度も開封していたらなおさら送ってくるだろう。

ThunderBirdだと設定でHTMLを読み込まないようにできるので(デフォルトかな?)回避できる(厳密には外部コンテンツを読み込まない、かな)。そういう設定ができないメーラーなんて無いと思うので設定しておきましょう。

ちなみに内容はいわゆる迷惑メールっぽくはない。普通にビジネス~な文章。といってもセールスだけどもね。

関連:

温度センサの値をブラウザから見れるようにする(4)

f:id:sharow:20150701185535p:plain

20日くらいが過ぎた。データは300kbくらいで、レンスポンスが600ms~700ms程度、まだ許容範囲内か。

変更点はdatetimeからepoch時間に変換するのに結構時間食ってたので、センサーのデータ取得時にepochも記録するようにした。これでjsonデータのレスポンスは2倍速くらいになった。あと、最高気温・平均気温・最低気温をその日の12時にプロットするようにした。こうしてみると、毎日の10分ごとの変化はいらないような気がしてくる。長期的になるほど、細かい変化はそんなに重要ではなくなってくるんだろうな。せいぜい今日と昨日データだけ見れればいい。

いまのところレスポンスを生成する部分はこんなんなってる。

def render_censor(id_idx=0, days=30):
    dev_ids = pickle_stockpile()
    L, max_temp, min_temp, ave_temp = ([], [], [], [])
    getter = operator.itemgetter('temp')
    t0 = time.time()
    for i in load_temp_datas(dev_ids[id_idx], days=days):
        at = i[0]['at'].replace(hour=12, minute=0, second=0)
        epoch = int(time.mktime(at.timetuple()))
        max_temp.append({'epoch': epoch, 'temp': max(map(getter, i))})
        min_temp.append({'epoch': epoch, 'temp': min(map(getter, i))})
        ave_temp.append({'epoch': epoch, 'temp': int(statistics.mean(map(getter, i)))})
        L.append(i)
    L = itertools.chain.from_iterable(reversed(L))
    t1 = time.time()
    def make_elem(key, data):
        values = [[x['epoch'], x['temp']] for x in data]
        return dict(key=key, values=values)
    e0 = make_elem('temperature', L)
    e1 = make_elem('max', max_temp)
    e2 = make_elem('min', min_temp)
    e3 = make_elem('ave', ave_temp)
    t2 = time.time()
    print('  load and stat: {:.1f} ms'.format((t1 - t0) * 1000))
    print('  marge: {:.1f} ms'.format((t2 - t1) * 1000))
    return [e0, e1, e2, e3]

これをbottleでマウントされた関数から読んでる。ここでbottleの文句をいってもしょうがないんだけど、bottleはcontent_typeに'application/json'を渡すとマウントされた関数が返した値をjsonシリアライズしてしまう。なのでreturn json.dumps(data)とかやると、文字列をjsonでさらにシリアライズされたものが返されてしまい、js側のJSONでデシリアライズしてもただの文字列になる、という罠。この仕様、どうですかねぇ・・・。

ところで関係ないけど、最近コレが気になっている。BMP180 気圧センサ(気温センサ付き) 約1200円と、4倍の価格だけど気圧と温度両方が測れるらしい。気温は室内だと外気との乖離があるけど、気圧は室内でも変わらないだろうから、こっちのほうがデータとしてはおもしろい。・・・と思ったけど、気象予報士ではあるまいに、気圧をみてもなにもわからないぞおれ。