IT戦記

プログラミング、起業などについて書いているプログラマーのブログです😚

Mac やめて Linux PC を自作した

みなさまお元気ですか

暑さも少し落ち着いてきて、ようやく外に出てもいいかなという気になってきました。季節の変わり目体調には気をつけていきたいですね。

実は、一ヶ月くらい前に Linux PC を自作して Mac から移行しました。そのときの考え、その後の感想を残しておきます。

また、学んだことや作業のログを細かく残しておきたいと思います。(どこかの誰かが不安に思ったときに同じ失敗や疑問を経験した人がいて安心してもらえたら嬉しい)

Ubuntu のインストール画面 (ベストオープンソースと開発しよう!)

目次

  • Mac をやめるきっかけ、経緯
  • Ubuntu に移行して一ヶ月の感想
  • おまけ1: どのような PC になったか
  • おまけ2: 事前に学んだこと
  • おまけ3: PC の組み立て
  • おまけ4: Ubuntu のセットアップ

加筆/修正

  • 指摘のあった誤字を修正
  • NVEnc について誤った内容があったので修正
  • レイテンシという単語の使い方が一部曖昧だったので修正

Mac をやめるきっかけ、経緯

この 10 年くらい iOS 開発に必須ということもあり macOS を使っていました。

性能的には困ってない

今使ってる Mac は iMac 2020 でもう 4 年以上前のになるんですけど、性能的にはあまり困ってない。個人的には「10 年くらい困らなさそうだな〜」なんて思ってました。

これだけ長く一つの PC で困らないのは性能の向上が需要を上回ったというのもあるんですが。特に 近年は性能がいるタスクをクラウドでやるようになった というのも大きいかもしれません。ゲームとかやらないので、低レイテンシ(低遅延)であることを求められる高度な処理があまりないというのもあるかもしれないです。

でも買い替えることに...

買い替えを意識したきっかけは、 2024/03/08 に出された tensorflow のこのアナウンスだった。

もう x86 mac 向けに Tensorflow 2.17 のビルドはリリースしない

機械学習の開発が不便になるのは相当大きいことだった。

また別件ですが、あるフォーラムで 「誰がこれから無くなる x86 mac に時間をかけたいんだ?(意訳)」ってことを言われた り、まあ x86 mac は何かとコミュニティに見捨てられた環境であったりもした。

ということで、本気で買い替えを考え始めた。

まず、最近の PC にやらせるタスクを整理してみる。特にクラウドを使えるか、ローカルの PC でやる必要性があるか を考えた。

必要なローカル PC の性能って?

以下のように、低レイテンシ(低遅延)を求められるものやデータ量が多いもの、その中で計算量が多いものを中心にローカル PC の性能を決めればいいと個人的には思っている。

PC で何をするんだっけ?

で一般的な PC でやることを書き出して、自分が次の PC に必要だと思う部分を赤色でしめした。

タスク ローカル PC の性能が必要 GPU 使う CPU 使う クラウドにオフロードしやすい 備考
ML データセット前処理 ○ ◎ ☓ ☓ 作業の価値に対して通信料金がボトルネックになりがち。ややローカル向き
ML 学習 ☓ ○ ☓ ◎ クラウドでやる場合通信料金より GPU 料金が支配的。大規模から小規模まであらゆる学習がクラウド向き
ML 推論 ○ ? ? ○ 低レイテンシが求められる場合はローカル向き。規模によってはクラウド向き。ローカルで使える推論用アクセラレータ NPU DPU など今まさに進化してる領域
動画、画像の視聴 ☓ ☓ ☓ ☓ ある程度の性能があれば困らなさそう
動画編集(エンコード) ○ ○ ◎ ☓ CPU とメモリが特に必要。ハードウェアも使えると便利。通信量が大きくクラウドに向かない
大量の動画をエンコード ◎ ◎ ☓ ☓ 大規模な場合、ハードウェアエンコーダが必須。通信量が大きくクラウドには向かない
文書作成、資料作成 ☓ ☓ ☓ ◎ 10 年前の PC でも困らなさそう
ソフトウェアのビルド(コンパイル、リンク) ☓ ☓ ○ ◎ ある程度の規模を超えるとクラウドにオフロードしたほうがいい
プログラミング ☓ ☓ ☓ ◎ 10 年前の PC でも困らなさそう
ゲーム ◎ ○ ◎ ☓ (ゲームはやらないけど)キャッシュメモリを増やして時間あたりの命令実行数を増やすのが重要っぽい。ローカル PC の性能が大事

これはあくまでも自分にとってだけど、次の PC は ML の推論、動画編集、動画エンコードに構成していけばいいことがわかった。

CPU の性能はいらないかも

上のことから、次のパソコンは GPU やアクセラレータが重要で CPU の性能は必要なさそう。今後はなるべくグラボなどをアップデートしながらその他のパーツを長く使うことを意識したい。

アクセラレータやクラウドが重要 (ECS SRIA 2024 より引用)

10 年使える PC にしたい

必要なソフトウェアが提供され、グラボの交換ができれば今の Mac は性能的には 10 年は使えた のではないだろうか。

自分が今買い替えを検討している理由は、自分の PC の拡張性の問題と、 x86 mac の「ユーザ数の先細り」の問題なのだ。

次の PC は 10 年買い替えないでいいものにしたい。そう思った。

10 年使える PC の要件とは?

その上で、 10 年使える PC とはどのようなものだろうか。

  • 大きめのタスクは基本クラウドで対応し、ローカル向けのタスクのみを考慮した設計にする
  • 未来の ML の推論や動画のコーデック必要になる GPU やアクセラレータの拡張性を持つ
  • ユーザの規模がそれなりに大きい OS やハードウェア規格
  • 買い替え乗り換えサイクルが遅い OS やハードウェア規格(サーバで使われるものは特に遅い)

Linux にする

上のようなことを考えると Mac はよくないだろう。 GPU の増設すら難しく拡張性もない。買い替えサイクルも早い。

結論として Linux。10 年の安定を手に入れたい

ディストリビューションの選定

まず、候補としてはサーバサイドでよく使われる Ubuntu, Debian, Redhat系 、最近よく名前を見る Arch Linux このあたりで悩んだ。

調べたところ Redhat 系は Ubuntu, Debian, Arch Linux と比べてあまりユーザコミュニティの活気がない気がしたので Redhat 系は一旦除外。

Debian と Ubuntu だと「ユーザの規模」や「オープンソース以外のパッケージの存在」から Ubuntu が良さそうだと思った。

Arch Linux はどうか

Arch Linux のローリングリリースはめちゃくちゃいいなと思った。 Ubuntu だと「Ubuntu 24.04 だと〇〇」のような議論になりがちだけど、ローリングリリースだとそうはならないだろう。ちゃんとした要件を議論できそう。

実際、ネット上の有用な情報は Arch Linux のコミュニティや Wiki から得られることが多いように思う。

自分の中での勝手なイメージ

結論としては Ubuntu

上のように Arch Linux にかなり魅力を感じた。だが色々悩んだ末 Ubuntu を選択した。

理由は Ubuntu が「営利企業が多く使っているディストリビューション」であり市場的に保守される可能性が高いこと。

ただ、 Arch Linux は本当に良さそう。次に OS を入れ替えるときには Arch Linux を選ぼうと思った。

Ubuntu に移行して一ヶ月の感想

Ubuntu に移行して良かったこと、良くなかったことを書いておく。

良かったこと

ビルド難易度が低い

github とかにあるようなオープンソースのツールのビルドの成功率も問題解決も圧倒的に楽になったと感じる。

これは何故なのかわからない。自分の使うツールの特性か、それともオープンソースの開発者は Linux を使っている人が多いのだろうか。

Mac のときは「XCode で入れられた〇〇」と競合するみたいなのがあったりした。 clang とかは Linux でも Mac でもそう変わらないと思う。

あと特に Google のオープンソースライブラリのビルドは Linux になってかなり楽になった。 Google が使ってる bazel はその特性からプロプライエタリなものを混ぜると使いにくい。

自分で修正しやすい

プロプライエタリな製品は不具合があまりオープンに議論されない。アカウントマネージャやソリューションエンジニアとの間でクローズドで解決することが多い。

オープンソースなソフトウェアは議論のログやパッチがオープンにされることが多く、それらの資産が個人にも届く形で残ることが多い。それによって不具合があっても個人で修正できることが多い。

逆にオープンソースであっても大きなコミュニティがなくなれば急速に問題解決が難しくなると思われる。企業も含めて多くのユーザが使っていることが問題の解決をかんたんにしている。特に問題があったときに企業で使う人たちの上げる issue に助けられることが多い。

「OS」の粒度

他の環境では「OS」とひとまとめにされる部分も細かく分かれていて、それらのコンポーネントの依存関係によってソフトウェアの要件や前提条件を詳細に認識しやすい。

たとえば GUI アプリケーションへの入力がおかしければ以下のようにコンポーネントを分けて考えることができる。

  • Gtk ã‚„ Qt などのライブラリ
  • Mutter などウィンドウマネージャ
  • デスクトップシェル
  • デスクトップポータルデーモン
  • IME デーモン
  • DBus
  • ディスプレイサーバ

ユーザが認識できるコンポーネントの粒度が細かいので、それぞれの境界でどのような入出力があったかを調べることで問題の原因を特定しやすい。

たとえ、画面全体がフリーズしてもテキストモードに移行してディスプレイサーバを再起動することもできる。これもちゃんとユーザがその境界を認識できているからであると思う。

過去 Mac を使っているとき、よくわからないデーモンがあって「それが悪い」と決めつけるみたいなことをよくしてしまっていた。

設計やコンセプトが読める

多くの部外者が関わるので開発者が設計やコンセプトや妥協点を残していることが多い。開発者に直接話しかけることもできる。

プロプライエタリなソフトウェアだと「なんでこうなったの?」っていうのが分からずモヤモヤすることが多かった。また、方針が分からず、今後使い続けるか判断する材料が乏しかったというのがあった。

クラウド環境と近い

個人的な指向ではあるかもしれないけど最近の ML のタスクは「短時間で単価の高い高性能なクラウド環境でやる」っていうのが良いと思っていて、頻繁に Cloud TPU などを使っている。

Cloud TPU の一番安いインスタンスだと Docker コンテナとかは使えず、ある程度固定された環境だったりする。これまでローカルとの違いでデプロイした先で挙動が違ったりすることがたまにあった。

クラウドは Linux を使うことがほとんどなので、ローカルも Linux だとやっぱり便利だと思った。

良くなかったこと

ファイル名の制限

Linux で一番困ったのがファイル名が 255 バイトだとカーネルに書かれてしまっている。これには自分はかなり困ってしまった。

Mac や Windows でも文字数制限はある。だが Linux では文字数制限ではなくバイト数制限なので特にマルチバイト圏の人たちが困る

ただ 255 バイトというのは日本語でもそれなりの情報を書くことができる。なので新規に Linux を使う人は困らないかもしれない。ただ、これまでの環境の大量のファイルを単純に Linux に移行できないのはそれなりに大変だった。

ファイル管理 GUI

Mac の Finder のようなよくできたファイル管理アプリは Linux にはない

Finder は素晴らしいアプリだと知った。カラムのソートとか、カラムで扱える情報量とか、最後に開いた日時とか、ドラッグドロップでできることの多さとか。とにかく洗練されていたと気がつくことができた。

マルチメディア系のソフトが弱い

要は Adobe CC がないって話である。他にも Windows Mac だけにツールを提供している企業は多い。特にクリエイター系のツール。

(ただ俺達には gstreamer があり、 mediapipe があり、オープンな ML ネットワークがある。コードを書く前提なら、クリエイティブな作業を自動化や効率化させるというところでは Linux のほうが頑張れる!!!!(といいな))

ベンダロックされたときに困る

iOS のアプリの開発とか開発環境がロックされるケースは困る。ビジネスツールで Windows 系しか使えないものもあるんだろうと思う。

なので会社で Mac を使うことになりがちである。

システム依存とアプリバンドル

普通にソフトウェアをビルドして導入すると、 ldconfig を通じてシステムの DLL を使うことになる。まあそれでもいいのだけど、そのシステムの DLL 、厳密に想定されたものですか? という問題は残る。

根本的に解決するとしたら、すべてのライブラリがバンドルされたバイナリとしての配布するとか、 bazel のように依存関係の一致を hash 値で確認してビルドされることが一般的になるのがいいことなのかもしれない。

ただ、それが幸せかはわからない。

Linux でも Flatpak や Snap や AppImage などがあるが Windows や Mac のそれと比べると若干使いにくい(ファイル選択ウィンドウとか)

Snap 版の VLC のファイル選択画面(開く場所がおかしい)

今後 AI と OS が密結合になったら困る

Copilot + PC のようなものが業務効率に直結するようになったら、もう Linux はかなり厳しいだろうなとおもう。そうなったら Near PC Computer として Linux をローカルに置いて AI 指向の OS を使うことにしよう。

次に「Linux やめた」となるとしたらこの方向性の可能性が高そう。

Copilot + PC のようなアプローチが当たり前になる世の中のような気もする

なんとも言えないところ

AppleScript と GLib

GLib は C 言語のライブラリで、他の言語からも使いやすい形で DLL (GLib Module と呼ばれる) のエクスポートができたり、 C 言語の枠内でオブジェクト指向プログラミングすることができたり、 GUI と連携するイベントドリブンなプログラムをかけたり、まあプログラミング観点では AppleScript というより Objective-C に似たものだ。

ただ、使う場所という点でいうと AppleScirpt と似ている。

Mac で AppleScirpt や Automator を書いてたくらいにはこれから GLib を日常的に使うことになるんだろうんなと思っている。

GLib は gstreamer とかでも使われてるし、勉強してもいいかなとは思える。

問題がちゃんと起きる

頻繁ではないが Mac と比べると問題が起こる頻度は高い。

画面が固まってディスプレイサーバを再起動したり、 Files が落ちたり、システムのデーモンが起動しなかったり、グラボつけたら udev が X11 に勝手に変えていろいろなアプリを設定しなおしたり、とにかく問題は起こる。

ただ、自分はこれらの問題を愛せている。なぜなら原因がちゃんと分かるから。

原因がわからないと影響範囲が確定できずに疑心暗鬼になる。原因がわかれば「ちゃんと想定した問題が起こっている」とすら思える。そういうものだと思ってる

総評

全体としてはかなり良かったと思っている。

まず、プログラミング環境や実験環境として最高であること。

そして、最新のオープンソースのソフトウェアを導入するのが楽しくなったこと。そして、問題を愛する心が生まれたこと。

Linux デスクトップ楽しいですよ!みなさんも使ってみませんか?

(ここからはおまけです)

おまけ1: どのような PC になったか

拡張性が大切だ。市販品はケースは省スペースに作られていて不器用な自分には拡張が少しむずかしそうに思えた。

CPU は弱くてよく PCIe スロットへのアクセスは重要だ。

いろいろこだわりがあるので、パーツを選んで自作することにした

ハードウェア構成

備考欄に選定したポイントを書いた。

種類 製品 当時の時価(円) 備考
CPU Ryzen 7 7700 45043 必要十分。 TDP が低い
マザーボード MPG X670E CARBON WIFI 49664 デバッグ LED 最高。公式で動作確認されたメモリの数が多い。 CPU がなくても BIOS のアップデートができる。 BIOS の更新早い。ソフトウェア的な努力を感じられる
メモリ CP2K16G56C46U5 13794 2枚組。オーバークロックを売りにしているメーカーが多い中 JEDEC 準拠へのアピールが好感
SSD 990 PRO MZ-V9P2T0B-IT 23350 フル書き込み特性(後述)を見るかぎり、どのような状況でも安定して速度が出る。容量が小さくなるとキャッシュを減らしたり GC が頻発して速度が出なくなる製品が多いが、この製品は非常に優れている。 SSD に PCIe 5.0 は不要であると判断(後述)
グラフィックボード GeForce RTX 4070 SUPER 12G VENTUS 2X OC 104240 Nvenc の AV1 ハードウェアビデオエンコーダが 2 個搭載されていると思って購入したけどはてなブックマークなどの指摘により 2 個搭載されていないことに気が付きました。指摘ありがとうございます! RTX 4070 Ti SUPER がいいらしいです。ぴえん。一旦、このグラボを使い尽くしてから買い換えるかも!
CPU クーラー AK400 3680 Ryzen 7 7700 を冷やせる中で、メンテ性、静音性、価格の安さで選んだ
ディスプレイ Dell S2722QC 46799 4K 60Hz を満たす 27inch の一番安いもの
ケース The Tower 500 19736 容積が大きい。工具なしでケースの側面全面を開放できる。ケーブルの取り回しが良い。ファンがたくさんつけられる
ケースファン いろいろ 5520 下から上に風が登るようにケース内の温度を見ながら調整した。中のファンほど静音性は犠牲にできる
HDD データセンタ用の HDD の中古 42234 合計 28 TB。ebay でデータセンタで使われてた中古 HDD 14TB を二個買った。これまでもデータセンター用の HDD を ebay で買ってきたけどとてもコスパ良い
電源 MPG A1000G PCIE5 21245 ビデオカードの買い替えは今後もありそうなので、未来の GPU のピーク電圧を考えて ATX Power supply design 3.1 規格に準拠したもの(後述)

ほぼ完成したときの写真

ほぼ完成した感じはこんなの。

正面 側面 裏面

とても拡張性が高くてケーブルの配線とかが簡単だった。今後、容積がかなり大きいのでどんな機器でも収まりそう。

でかい!

その他、買ったもの

  • HDMI ケーブル
    • Dell のディスプレイについてなかったので
  • CPU グリス
    • MX-6
    • 下手に塗ってもショートしない電気を通さないやつ

家にあって便利だったもの

  • 電源ジャンパピンを短絡させる実験用スイッチ
    • フロントパネルに接続する前にマザーボードの動作確認するときにあると便利
  • ビープスピーカ
    • 家にあったというかケースについてた
    • マザーボードがエラーを知らせる一つのインタフェースとして結構便利
    • デバッグ LED があればいらないっちゃいらない
  • エアダスター
    • ホコリを飛ばすのにめちゃくちゃ使った
  • キムワイプと無水エタノール
    • ちょっと汚れが気になったときに使った
  • クロス LAN ケーブル
    • 古いパソコンと直接繋げられる。 Wifi より圧倒的にレイテンシが低い。大量のファイルとかをやり取りするのにすごく便利だった。これを使って古いパソコンを NAS として使ってる、めんどくさいデータ移行を後回しにできた。
  • キーボード、マウス
    • 14年前の HKK と Microsoft のマウスが動いた

買ってないけど買わないといけさそうなもの

  • ウェブカメラ、マイク
    • たぶん zoom とかする必要も出てくるだろうし何か買わないとなあ

パーツ購入時に大変だったこと

初期不良を期間中に確認するためにある程度価格を度外視してそれぞれのパーツが近い日時に送達されるように PC ショップを選ぶ必要があった。これは、一台目の自作の場合はある程度しょうがないことかもしれない。

数時間で値段がコロコロ変わる。 PC パーツの最安値をみていると本当に頻繁に変わる。これを追っていたらいつまでも買えないので、価格はある程度安ければあまり気にしないほうが良い。コストを考えずに「高くてもいいや」「失敗したらもう一個買うしいいや」などとにかく心理的な安全性を高める考え方をした。

いろいろ届き始めた

おまけ2: 事前に学んだこと

会社でサーバを組み立てたり拡張したりというこをやったことはあったが、自分一人で PC の構成を考えたり組み立てたりするのは、思えば初めての経験だった。なので、色々と座学をした。

ATX (ケース、マザーボードのサイズ、電源の容量と特性)

  • ATX specification 2.2
    • Intel が出してるマザーボードの仕様書。
    • マザーボードやそれを拡張するパーツやコネクタがケースに収まり、外部との接続性が担保されることが目的。
    • マザーボードの寸法やスロットの位置、推奨される機能を示している
    • ATX, microATX などがある
    • まずマザーボードが ATX の仕様に従ったものかどうか決めるところから自作 PC の設計を始めるのが良い。 ATX 以外にも Mini ITX などがある
  • ATX 3.1 Power supply design
    • 上で述べた ATX は、電源に関する仕様も定義している
    • 「ATX 電源」とは、この仕様にのっとた PC 用の電源であることを示している
    • 電源に関しては寸法だけではなく、電源コネクタの形状、ピンアサインを仕様化している。
    • 電源ユニットが持つべき電気的特性や機械的特性についても仕様化している。
    • ATX power supply design は 2.x から 3.x へ最近 20 年ぶりにメジャーバージョンが上がった。
    • 3.0 では GPU などが発するスパイク電流への耐性を仕様の中に盛り込んだ。
    • 3.1 では、新たに GPU などの PCIe 機器に 600 W という大電力を供給するためのコネクタを定義した(16 ピンコネクタや 12VHPWR と呼ばれる。このコネクタやケーブルに対応していることを PCIe 5.0 対応電源と呼んだりもするようだ)
      • 市場の製品は従来の PCIe 補助電源でも使えるようになっているが、将来的に 12VHPWR が必須となる時代が来るかもしれない
    • ATX Power supply design の仕様を見ると現代ではほとんど +12V レーンが電力供給のメインであることがわかる(そのため +12V だけを供給してシンプルにするための ATX12VO などの仕様もでていたりもする)。なので、電力や電流の計算は主に +12V レーンに対して行えば良い。他の電圧 5V レーンや 3.3V レーンは 60W くらいあれば十分ではないかと思う。
      • PCIe 補助電源は 12V しか使わない
      • 5V レーンは SATA ã‚„ USB への給電に使われる
      • 3.3V レーンは古い機器にしか使われていない
      • CPU やメモリへはマザーボードの VRM によって 12V レーンから給電されている(と思ってる)
    • なので単純に +12V レーンの容量 = 電源容量と考えてほぼ問題はない
    • あとは ATX Power supply design 3.1 準拠が必要かどうかを検討

CPU

  • 電子回路的に CPU の仕組みを理解する
  • 周波数とコア数
    • プログラマ的にはシングル性能よりは、マルチコア全部使った性能が重要でその辺をどう選ぶか
      • タスク全体として性能が足りなかったらコードをマルチスレッド化していけば解決できることが多い
      • シングル性能には限界はあるけど、マルチ性能は XEON とか ThreadRipper でかなりスケールできる
    • GPU などのアクセラレータに載せづらい処理がどのくらいタスクとしてあるのかも考える
  • 周波数とコア数以外の部分
    • 世代が上がっていれば効率的なんだろうとざっくり理解は正しい(以下に続く内容)
    • メモリとの通信による遅延をどのくらいカバーできるか
      • L1/L2/L3 キャッシュ
      • アウト・オブ・オーダー実行(メモリを待ってる間に、依存しない命令を先に実行してしまう)の賢さ
    • 後続の命令を効率的に予測し実行する
      • 命令スケジューリング
      • 分岐予測
    • SIMD 命令のサポート
      • 一つの命令で複数のデータを演算する命令
    • 命令の多重化
  • 演算ユニットはマイクロコードを実行する
    • x86 の命令は更に細かいマイクロコードにデコードされて実行される
    • マイクロコードはマザーボードメーカーが BIOS のアップデートとして配布する
  • CPU のチップの中には周辺機器のコントローラやアクセラレータも入っている
    • 昔はノースブリッジといわれて、別のチップに入っていたものが CPU に統合されていった(?)という理解
    • メモリコントローラも入ってる
    • PCIe バスコントローラも入ってる
    • USB コントローラも入ってる
    • GPU も入ってることが多い (iGPU)
    • AI アクセラレータ、行列計算特化演算装置とか (XDNA とか)が入ってることもある

UEFI/BIOS

  • CPU の回路は最初のクロックは何をフェッチするか
    • CPU の固定物理アドレスに結線された ROM 領域にある命令をフェッチして実行が開始される
      • BIOS と呼ばれる OS のコードが読み込まれるまでのすべての処理を行う命令群が連なっている
  • UEFI とは
    • Intel が EFI という BIOS を作っていて、それをオープンな仕様にしたのが UEFI
    • UEFI に従って実際に BIOS を実装するのはマザーボードメーカー
      • マザーボードメーカーは BIOS という超重要なソフトウェアを作っているソフトウェアの会社でもあることは重要な視点
  • UEFI のオープンソースの実装がある
    • EDK 2 といって、割とこれを元に UEFI/BIOS を開発しているメーカーも多いんだと思ってる
    • github.com
  • UEFI はどこまで初期化されたかを段階(フェーズ)として定義している

PI Boot Flow · tianocore/tianocore.github.io Wiki · GitHub

  • UEFI の理解は普通の PC ユーザにも役に立つ
    • CPU とメモリをつけたけど「起動しない」となったときに「UEFI のどこのフェーズまで進んだか」を理解できると、グッと解決までの解像度があがる
    • UEFI の PEI フェーズではメモリがなくても C 言語のコードが動いている(結構びっくり!)
      • UEFI では CPU の初期化がある程度進んだら、 CPU のキャッシュ上にスタック領域を形成し、メモリの初期化以降のコードは C 言語で記述することができている。
      • CPU が C 言語で書かれた(スタックを持つような)「普通のプログラム」を実行できる状態まで初期化できたかどうかは、マザーボードにメモリを刺さなくても確認できるということ。 問題がメモリにあるのか CPU にあるのかなどの切り分けするときに便利(メモリを外して、 UEFI のフェーズがメモリエラーまで進むか見る)
    • 特に BIOS の設定画面が表示される前の状態で不具合が起こるとき、 UEFI のフェーズが理解できていると問題解決の難易度が下がる

SSD

  • M.2
    • M.2 はややこしい。 PCIe、USB 3.0、SATAなどいずれかのバスと機器をつなげる
    • 機器によって対応する接続可能なバスの種類が決まっている。同じ M.2 でも「この機器は PCIe に接続される」とか、「この機器は PCIe か SATA に接続可能」とか決まってる
    • スロット側(マザーボード側)にも「このスロットは PCIe のみ」とか「このスロットは SATA のみ」とか「SATA と PCIe」とか色々決まっている。
    • Key といって、スロットの切り欠きの位置である程度レーン数などの成約を示すことができるが、 SATA か PCIe かは Key では示せない。
    • なので M.2 は、マザーボード側で何に接続される M.2 スロットか、何に接続される機器かを確認する必要がある
    • 上の図は SATA Express という M.2 のもとになった仕様の図を Wikipedia から引用している。このように M.2 は「PCIe ã‚„ SATA ã‚„ USB 3.0 に機器をつなぐためのスロットを共通にした」というものに過ぎないので、その上で「何をどのように繋いだか」が大事。

Wikipedia M.2 より引用

  • NVMe, AHCI プロトコル
    • PCIe 上でブロックデバイスと通信を行うプロトコル。
    • 今までは AHCI という SATA 専用プロトコルを使っていた。
      • AHCI との通信は Linux ではざっくり Block IO -> SCSI device layer -> libata -> ahci という風にレイヤになっていて SCSI レイヤなどは多くのブロックデバイスと共有するレイヤとなっている
    • NVMe デバイスは Block IO -> NVMe device というように NVMe ドライバが担当する領域が大きい。これは SCSI デバイスのレイヤで IO 要求が一つのキューで待たされるのを回避するため。 NVMe プロトコルではそれが許容されているため。複数の CPU からの IO 要求に依存関係がなければ同時に実行したりできるようになるということだと思ってる。
    • NVMe はこれまでの AHCI プロトコルの制約から脱して機器の性能を引き出すことに成功している
    • M.2 経由で PCIe を使うことに加えて、 NVMe を使うことで SSD は速くなった。

Wikipedia から引用

  • MLC, TLC, SLC Caching

    • SSD はフローティングゲートという絶縁された領域にある電荷の量をビットとして扱う
      • SLC: 素子一個 1 ビット
      • MLC: 素子一個 2 ビット(電荷の量を 4 段階に量子化する)
      • TLC: 素子一個 3 ビット(電荷の量を 8 段階に量子化する)
      • QLC は 4 ビット
    • 特性
      • 寿命: SLC > MLC > TLC > QLC
      • 速度: SLC > MLC > TLC > QLC
      • データ量: SLC < MLC < TLC < QLC
    • SLC と TLC が主に使われている
      • SLC はキャッシュとして使われる
      • TLC は主記憶として使われる(QLC のものもある)
  • 書き込み増幅 (Write Amplification)

    • SSD は数 MB とかの単位で消去、書き込みを繰り返すため小さなデータをランダムに書く処理に弱い。そのため様々な工夫が行われる。
    • Wikipedia の Write amplification が詳しい
  • カタログスペックは当てにならない

    • 何故?
      • カタログの速度は理想的なもの
      • SLC キャッシュがどのように実装されているか
      • Over provisioning がどのくらいあるか
      • DRAM キャッシュがどのくらいあるかとか
      • ガーベジコレクション戦略など、 Controller がどのくらい賢いか、触ってみないとわからない
    • フル書き込みをしたときの特性を見ると良い
      • SLC キャッシュの枯渇、全体の枯渇でどのような速度になるか
      • Tech Power Up さん などの製品レビューで、以下のような SSD にフル書き込みをしたときの速度を実験してくれている。かなり色々な特性が見られて面白い。この特性を見て、自分のタスクに向いた SSD を買うと良い。

200 GB の SLC キャッシュがあり TLC 1700 MB/s くらい Tech Power Up より引用

SLC キャッシュが 400 GB 以上あるけど主記憶が 500 MB/s くらいで、多分 1150 GB 超えたあたりから SLC キャッシュを減らす処理か GC のようなものが発生してさらに遅くなる Tech Power Up より引用

メモリ

  • DDR

    • クロックの立ち上がりと立ち下がりの両方でデータを処理するから Double data rate というらしい
    • めちゃくちゃ早いのでクロックを共有するだけでは、通信ができない。なので CAS 遅延や RAS 遅延など(メモリタイミングともいう)の様々な遅延情報を CPU のメモリコントローラと交換する必要がある
    • さらに DDR5 とかでは周波数が高すぎて取り付けられた基板の電気的な特性、特に回路のリアクタンスやキャパシタンスによって出てくる微分成分や積分成分(そんな言葉があるかは知らないけど)が無視できないらしく、しきい値やタイミングのキャリブレーション(調整)を行う必要がある。
  • メモリタイミングと JEDEC/OC プロファイル

    • DDR は JEDEC という団体によって標準化されている
    • JEDEC は標準となる DDR5-4800 などの仕様を決めて様々なメモリタイミングの値のセットを標準化している
      • 各メーカーこれに合わせてメモリのタイミングを調整して製品化する(はず)
    • このタイミング仕様は SPD という DDR メモリ内の EEPROM にかかれている。これを JEDEC プロファイルといったりする
    • 「JEDEC の標準から逸脱したメモリタイミングを使えばもっと速度が出せる」ということで、 DDR メモリは JEDEC 非準拠の SPD のようなものを持つことがある。これを OC (オーバークロック)プロファイルといったりする
      • XMP: Intel CPU 用の OC プロファイル
      • EXPO: AMD CPU 用の OC プロファイル
    • OC プロファイルについて
      • 遅延を大きくしてクロック数を稼いだりするものもあり、一概にクロック数を上げれば必ず速くなるというものではない
      • JEDEC と同じパラメタを持つ OC プロファイルも存在する。これは JEDEC か OC かプロファイルの種類でメモリコントローラの設定を変えてしまう PEIM があるらしいから
        • Crucial の JEDEC 準拠メモリにそういう OC プロファイルがあり、説明にそのようなことが書いてあった。

マザーボード

  • チップセット(PCH)

    • ノースブリッジが CPU に吸収される前は、サウスブリッジと呼ばれていた部分が今はチップセットや PCH と呼ばれている(と思っている)
    • DMI ã‚„ Infinity Fabric というプロトコルで CPU とつながっている(物理層は PCIe)
    • 重要な役割としては TPM とつながっていて、 OS の検証に一定の役割を果たす
    • それ以外は以下のような一般的に必要な拡張機能が「全部入り」してるようなシステムハブとしてみなせる。
      • PCIe のハブ
      • USB コントローラ
      • Wifi ã‚„ Ethernet のコントローラ
      • SATA コントローラ
      • Bluetooth のコントローラ
  • CPU とチップセットの機能を確認したあとマザーボードを選ぶ

    • CPU の機能のどれがどのスロットやコネクタで使えるか/使えないか
    • チップセットの機能のどれがどのスロットやコネクタで使えるか/使えないか
  • デバッグ LED

    • UEFI/BIOS のフェーズのどこを実行しているか、どのようなエラーが出たかを数値で表す LED がついているものがある
    • これがあると BIOS 画面が表示しない状態だったり、メモリがない状態だったりしてもある程度 BIOS の処理を確認することができ、非常に便利。
      • 自力で切り分けることができる問題の範囲が大きくなる
      • 自分的には必須

CPU クーラー

空冷とか水冷をちゃんと整理。

一般的な呼称 寿命 メンテ性 熱の移動 冷却 備考
空冷 ◎ ◎ なし CPU にファン 一番シンプルこれで冷やせるなら文句ない
空冷(ヒートパイプ) ○ ◎ ヒートパイプで移動 ヒートパイプにファン ヒートパイプで熱を移動させ比較的大きなファンを使える
簡易水冷 △ ○ 流水で移動 ラジエータにファン ヒートパイプより大容量の熱を移動できる。最近のはメンテ性も良い?
本格水冷 △ ☓ 流水で移動 ラジエータにファン ヒートパイプより大容量の熱を移動できる。 PC を拡張するときに色々バラすのがめんどくさくて「やめとけ」って言われることが多い
液浸 ? ☓ 沸騰による滞留で移動 ラジエータにファン スーパーコンピュータとかで使われているのを見た。沸点で熱を奪って移動もしてくれるので物理的にかなり理にかなってる気がする

まず、「水冷だから冷える」というのは単純すぎる。結局冷えるのは「熱をいかに周辺温度の低い場所に移動させるか」「ファンでいかに冷やせるか」で、一般的に水冷が強いのは熱源と遠ざけるのが速く、性能の良いファンをつけやすいから。

基本的に TDP で決めればいい。 - CPU の TDP (熱設計電力)が、クーラーの target TDP 以下に収まっているか - 条件を満たす中で以下のニーズを検討してくーらーを決める - メンテナンス性 - 静音性 - 寿命の見積もり

熱は物理的に CPU の寿命を縮めるので、ちょっと余裕を持ちたい。

GPU/グラボ/ビデオカード

  • 自分の使い方だと重要なのは以下の 2 つ
  • GPGPU としての性能
    • VRAM の容量
      • VRAM に載るデータサイズが大きいと機会学習のバッチが大きくできるので
    • GPGPU の計算能力
      • TFLOPS とかを見る
      • CPU と同様いろんな指標があるのでベンチマークを見る
    • 個人的には基本的にクラウドを使いたい
      • Cloud TPU 最高!
      • ただし単純な処理を大量のデータにかけたい場合などはローカルの強みが出ることがある
        • 通信料金でコストが律されるときとか
  • 動画のハードウェアエンコーディング(この部分はこの記事を投稿した時点で大きく勘違いしていたので、書き直しました)
    • 個人的には GPGPU よりこっちのほうが重要度は大きい
    • 動画のコーデック系のチップにはデコード用の NVDec とエンコード用の NVEnc がある
    • 最新の RTX 40XX だと AV1 ハードウェアエンコードに対応した 8th 世代の NVEnc が搭載されている
    • NVEnc 一基で 8 セッションのエンコードができる。
    • GeForce RTX 4070 Ti から NVEnc が二基になり、複数のエンコーディングを走らせるときに高速になる(一基で複数セッションできるけど、同時にやるなら二基使ったほうがパフォーマンスは良い)
    • ffmpeg での例
    • svtav1 などのソフトウェアエンコーディングと比べると画質は少し劣るが、速度でいうと文字通り一桁違うスピードが出る

おまけ3: PC の組み立て

色々と写真をたくさんのせておく。

このブログを読んでいる人の多くに役に立つかはわからないけれど、今回いろいろ組み立てるにあたって自分と同じパーツで作業している人の画像を見たりすると少し失敗への不安が減る感覚があった。

なので、誰かのために載せておきたい。

作業場所の確保とか

マザーボードとかを机の上に直接置くと心配なので半田マットの上に置く感じにしよう

ディスプレイ組み立て

Dell S2722QC のセットアップ

開封 組み立て ドット欠けチェック

他には HDMI ケーブルはテレビとかに繋いで単体テストをした。

ケース開けておく

ケース The Tower 500 も開封して、マザーボードとの配線レイアウトが物理的に問題ないか確認しておく

開ける

箱。大きい... 本体

フロントパネルとそのフロントパネルから伸びているピンを確認(マザーボードに刺さるものが多く出てるはずなので)。

フロントパネル(ここから右のピン達が出てる) LED とスイッチのピン ヘッドホンやマイクのピン USB 3.0 のコネクタ 2 つ USB-C のコネクタ 1 つ

工具なしでパカパカあける(ちょっと固い部分もあるので、念のためドライバー(2番)もあってもいいかも、特に下の裾っぽいところが固かった)

その他の付属品(説明書とかは省略)

120mmファンx2 電源固定金具 ラジエータやファンをカスタマイズして付ける金具 束ねるやーつ マザーボードのエラーを教えてくれるビープスピーカー
マザーボードのネジ穴(スタンドオフ、スペーサ) ドライバで六角を回すやつ ATX電源用のネジ ハードディスクのネジ穴に付けるもの(振動対策?) その他 2 種類に統一された多目的ネジ(形が違うので説明書に用途ごとにネジの絵で記載してある。かしこい)

マザーボードの説明書をダウンロードしてきて、物理的なコネクタの位置や配線関係が記載されたページを印刷して確認しておくと良い。

こういうのを印刷 物理的な配置を確認して配線場所からピンを出しておく

電源ユニットの準備

マザーボードや CPU の動作確認を行うためにも電源は必要なので、電源ユニット MPG A1000G PCIE5 を開ける

箱 本体

ケーブル類

↓まず CPU 用(CPU には直接させないのでマザーボードに刺す。 CPU に安定した電圧をかけるための VRM という回路がマザーボードに実装されている)

CPU 電源用 2本(大電力の CPU だと 2 本使う) 電源側 マザボ側

↓PCIe 機器用(グラボは 12VHPWR のやつ使うからそれ以外)

PCIe 補助電源 2 本(150Wまでいるやつ) 電源側 機器側 (二股に別れてる)

↓グラボ用の大電力用(下のどっちか)

12VHPWR 1 本 (600Wまでいけるやつ) コネクタ部分(たしか右のコネクタが電源側)
電源側だけ 12VHPWR で機器側は PCIe 補助電源 1 本(たぶん 2 本合わせて 300W までなのかな) 下のほうが電源側、機器側は二股に別れてる

↓SATA 用(2.5 inch とか 3.5 inch とかの HDD や SSD をつなぐやつ)

SATA 電源 3 本 電源側 機器側は電車の駅みたいにレールの途中にコネクタがついてる

↓なぞのケーブル

ペリフェラル、フロッピーディスク電源 1 本 電源側 ペリフェラル機器 2 つ フロッピーディスク側 1 つ

↓マザーボードにガッチリさすやつ。

マザーボードの電源 電源側 (28ピン) マザーボード側 (24ピン)

その他の付属品は以下(説明書とかは省略)

家庭用 100V 交流用ケーブル ケーブル入れ ケースにもついてた ATX電源用の固定ネジ

コネクタはピンの本数が同じもの同士は刺す位置が入れ替わっても問題ないようになっている。なのでそこまで心配する必要はない

CPU クーラーの開封

CPU のテストをするために CPU クーラー AK400 も先に開封が必要だ。

箱 開封
ファンとヒートシンクを分離 こういう金具でファンが引っかかってるだけ ファンは 4 ピンコネクタでマザボとつながるよ

↓CPU とくっつける際の金具(あとで使う)

Intel 用 AMD 用

グリスは塗ってあった

グリスはもともと塗ってあった 自分は別で買ってしまったので無水エタノールで拭いてこっち使った

(説明書とかは省略)

最新の BIOS 用を USB メモリに入れとく

マザーボード MPG X670E CARBON WIFI は CPU がなくてもマザーボードだけで BIOS のアップデートができるので USB メモリに入れておく。

BIOS は CPU に向けたアップデートされる。それなのに CPU を接続しないと BIOS のアップデートができないマザーボードが多い。これだと未テストの環境で BIOS が動くことになる。

BIOS アップデート機能がマザーボードについていると安心できる。

MSI の場合、マザーボードのサポートページ(簡単にググればでてくる)から BIOS ファイルをダウンロードする。

ダウンロードしたファイルを解凍すると以下のような MSI.ROM というファイルが入っている

これを FAT32 でフォーマットした USB メモリのルートディレクトリにポンと置いておく

こうやって何か分かるようにしておくといい

マザーボードの開封

マザーボード MPG X670E CARBON WIFI を開封する

箱 マザボ

その他の付属品(説明書とかは省略)

SATA ケーブル(電源じゃなくて通信の方) 光らせる系のケーブル(詳しくない) アンテナ(バックパネルに付ける) M.2 を引っ掛けて固定するネジ ツール群(Windows 用?使ってない) シール

↓デバッグ LED これが自分にとっては最重要。

バックパネルの写真がなかったので 公式ページから引用

左の方に BIOS をアップデートするためのボタンがある。

CPU を開封する

CPU Ryzen 7 7700 を開封する

箱 中身 本体

CPU クーラーが付属していたけど、自分で買ったので付属のやつは使わない。

マザーボードがエラーを伝える手段の一つビープスピーカをつける

説明書を見る

BUZZER とか SPEAKER とか書かれている。フロントパネルのイヤホンとつながる部分はもっと密集したピンになっているので SPEAKER と書いてあっても 4 ピンならビープスピーカの可能性が高い

これを ここに こう

デバッグ LED を確認

現代の BIOS は UEFI のフェーズの順に初期化プロセスが行われる。そしてデバッグ LED でそのフェーズ上どこまで処理が進んでいるか。どこで停止したか。エラーの ID などがわかる。

このスイッチを ON になっているか確認 これがデバッグ LED

BIOS のアップデート

CPU が最初の命令をフェッチする前に BIOS は新しくあってほしい。マザーボードだけで BIOS アップデート出来る場合はする。

↓電源とマザーボードだけをつなぐ

↓BIOS とかかれた USB ソケットに前述した BIOS が入った USB メモリを挿して

↓電源ユニットを通電して

↓Flash BIOS と書かれたボタンを長押しする

完了するまで待つ

フロントパネルのスイッチの部分を短絡するためのスイッチを付ける

ケースに組み込む前にマザーボードと CPU のテストをするので、それ用にスイッチをつける。

これを ここに こう

CPU を付ける

パカっとあけて のせて とめる 上の黒いカバーが勝手に外れる

CPU クーラーを付ける

固定具を付ける

黒いの外して オレンジの付けて 銀色の付けて

グリスはマスキングテープと定規できれいにぬった(普通にのっけるだけでいいらしい)

うとぅくしい....

ヒートシンク付けて ファンを金具で固定

ファンの向きは大事なので、要確認。羽が膨らんでるほうが吸気方向。

これを この ここに こう

CPU とマザーボードのテストを行う

自作パートではここがたぶん一番重要。

CPU とマザーボードと電源だけでテストを行う。(メモリはつけない)

できるだけ最小構成で、 UEFI (BIOS) のフェーズがメモリエラーまで進むことを確認する(前述)

これはプログラムでいう Hello world! にあたるテストで、ここが成功すればこの後の作業が二分法での問題の特定が可能になる。

ここが一番大事な瞬間である。

ここからの作業はマザーボードの説明書を印刷しておくと作業が捗る。

まず、今の状態。メモリが刺さってなくて、 CPU、 CPU クーラー、マザーボード、電源、スイッチ、ビープスピーカー、がつながっている状態。

↓説明書を確認して 10 が出れば成功ということを認識する

↓電源ユニットを通電して、スイッチを押す。

↓ちゃんとエラーを起こす。 10 が出れば CPU は UEFI の PEI フェーズまで問題なく動いていることになる。

10 番のエラーが出ている!そして、ビープ音がピー、ピー、ピーとなっている。メモリがないことを示している。

正しく動いている!!!!

メモリを取り付ける

メモリは付属品とかもないので、シンプル

メモリは枚数によって付ける場所が決まっているので確認して

こうして

こう

BIOS の設定画面を表示するためにディスプレイとキーボードマウスをつなぐ

グラフィック内蔵 CPU だとこの時点でグラボも刺さなければならないので、グラフィック内蔵 CPU のほうが細かいステップで確認しながらセットアップできて好き。

上の用に HDMI と USB キーボードと USB マウスを挿した。

BIOS の設定画面が表示されることを確認

CPU マザーボードをテストしたときのスイッチを押して、画面が表示されるのを待つ

メモリも問題なく動いていて BIOS がほぼ最後のフェーズまで起動することが確認できた。

BIOS を設定

USB で OS をインストールするための Boot 設定 Advaced -> Security -> Secure Boot を切っておく(ちゃんと Boot イメージを署名しないと駄目だと思うので)

この時点で Boot イメージに署名する方法とかがあるのかは知らない。

M.2 を刺す

M.2 も付属品はない。

箱 中身

取り付け

ここを 外して サーマルパッドのシールを剥がして つける とめる
蓋もサーマルパッドがある はずして とめる

ケースに入れる

色々と確認は終わってるのでケースに入れる

↓まず電源

ここの金具を外して 電源につけて ケースに戻して付け直す GPU と CPU とマザボのケーブル挿して 表に出しておく

この際にマザーボードのレイアウトがあると便利

↓次マザーボード

ATX サイズだと基本スタンドオフ(スペーサ)はかえなくていい

止めるネジ確認 置く こういう点々の印の穴 9 箇所に ネジ止め 止めた

↓ケーブルつなぐ。もう事前にケーブルは出ているので刺すだけ

USB USB フロントパネル USB C マザーボード主電源 CPU 電源 2 個 フロントパネルのイヤホン

で、フロントパネルとグラボの電源以外の電源はつながった状態。

ケースファンを付ける

ケースファンを付けるときはマザーボードの SYS_FAN<番号> などと書かれているコネクタの位置を確認して、分岐ケーブルを揃えたり配線の取り回しを先に図として書いておくといいです。

背面 天板 マザーボードとグラボに空気を送る位置 下から室温取り込み ケースとつなぐ

ケースファンを接続した SYS_FAN<番号> の番号を覚えておくと、ファンの設定をするときに使えます。

後日: ファンの設定

デフォルトだと温度による制御が聞いていなかったので PWM 制御の設定をしておいた

「Hardware Monitor」というボタンからファンを個別に設定できる。基本的に最近のファンだと PWM 制御でいいとおもっている。

Wifi のアンテナ

これを つけた

グラボつける

箱 中身

つける

ここを 2スロットはずして こうはめて 電源つなぐ

完成!!

つかれた〜〜!パソコンできました!

後日: ハードディスクが届いた

普通に電源につないだのだけど、少しだけハマったので書いておきたい

以下のように普通に電源とつないだ時に動かなかった

これはデータセンター向けの POWER DISABLE という、電源を制御するための機能を持っている HDD だからのようだった。

説明書もついてた

電源とケーブルとつなぐとその制御のピンに定格 3.3 V の電圧提供に使われていてそのせいで電源が入らなくなってしまう。

この HDD についていた 3.3 V ピンを繋がないためのケーブルを噛ませることで、電源が入った

このカラフルなやつを間に噛ます

認識された

組みたての感想!

今回、先にレイアウトを見ておいてマザーボードを置く前にだいたい配線をすませておいたのが楽だった。

これといってハマったポイントはなかったけど、値段が高い部品を触っているときの心理的安全性が低かった。10 年使うものだしパーツの一個や二個は誤差という気持ちで頑張った。

おまけ4: Ubuntu のセットアップ

少しずつセットアップしてるので、やっととこまで

Ubuntu のインストール USB を作る

Ubuntuを入手する | Ubuntu | Ubuntu にいく

ダウンロードボタンからインストールイメージをダウンロード

ubuntu-24.04-desktop-amd64.iso というファイルがダウンロードできる。あたりまえだけど amd64 それは命令の種類の話で intel でも amd64 で大丈夫だ。(念の為)

以下は Mac で作業。 iso の内容をまるまるコピーした USB メモリを作る。

USB メモリを挿して diskutil list をして、その内容から USB メモリを表す /dev/disk<番号> 探す。

$ diskutil list
...
/dev/disk<番号> ...
....

アンマウントする

$ diskutil unmountDisk /dev/disk<番号>

dd で上から下まで iso の内容をコピー

$ sudo dd if=<ダウンロードしたファイル名> of=/dev/rdisk<番号> bs=4M status=progress && sync

ここで /dev/disk<番号> ではなく /dev/rdisk<番号> になっていることを確認する

Mac の場合だと /dev/disk<番号> だと中間にレイヤがあり、めちゃくちゃ遅くなる。

BIOS (UEFI) からブート可能か確認する

$ sudo gpt -r show /dev/disk<番号>

こうしたときに C12A7328-F81F-11D2-BA4B-00A0C93EC93B という行が途中に見つかればブートできる可能性が高い。

BIOS (UEFI) は、パーティションの種類として C12A7328-F81F-11D2-BA4B-00A0C93EC93B という固定値を持つパーティションを探してそこからブートするので

USB を挿して起動

組み立てのときにブートの設定を買えていると思うので USB メモリからブートして「Ubuntu インストール用の Ubuntu」が起動する。

振り返り

BIOS の設定で以下のように USB から起動するように設定されていることが前提

以下のような画面が出る

Ubuntu のインストール

とりあえず English。(英語のほうがググったときに情報量が多い

キーボードレイアウトの設定。自分は Dvorak なので English (US) - English Dnvorak を選択。早い段階で設定できるのでその先の打ち込みが楽になって良い。

ネットにつなげて

インストーラ自体も update

インストーラが更新されてるので再起動してやりなおし。

その後、ネットにつなげるところまでやり直して

Interactive Installation を選択

Default selection

third-party software も media format も使いそうなので、両方チェック

空の SSD を挿してるので Erase disk and install Ubuntu

ユーザ名とパスワードは個人でいつも使ってるやつを入れて

タイムゾーン設定して

設定の内容を確認して Install ボタン

少し待って

完了したので Restart now で再起動

再起動でもう一回インストーラが起動しないように、刺さってたら抜けって教えてくれた。

起動して、ログイン画面。

Chromium のインストール

左のバッグみたいな App Center メニューから

Install からインストール

完了したら左下の Show Apps から確認できる

ターミナルを開く

左下の Show Apps から

Terminal を起動でき、 bash というシェルを打ってコンピュータを操作できる

起動中に左側で Pin to Dash とすると、今後は左から起動できるようになる。

日本語入力用に IME デーモンを入れる

fcitx5 と mozc をインストール(fcitx5-mozc で両方入る)

im-config -n fcitx5 としてデーモンとして起動するようになる。

で、 reboot

$ sudo apt install fcitx5-mozc
$ im-config -n fcitx5
$ reboot

reboot すると

右上にこんなメニューがでるので

そこから config を選び、左半分のペインを mozc と英語を入力するためのレイアウトを選択してあげる。自分は Dvorak なので、 English のところは English (Dvorak) と書いてあるやつになってる。

日本語打てた

Chromium で日本語打てるようにする

Chromium はユーザがディスプレイサーバとして何をつかっているかを教えないと、 fcitx5 のデーモンとやりとりしてくれないので、設定する必要がある。

ディスプレイサーバとは GPU やキーボードやマウスと、ディスプレイマネージャや GUI アプリの仲介をするレイヤで wayland と x11 がある。

ターミナルから

$ echo $XDG_SESSION_TYPE

とすると wayland か x11 かが表示される。 GPU の選択とかで変わったりするので一概にどちらかとは言えない。

それを確認したら

Chromium のアドレスに chrome://flags と入力し、 Preferred Ozone Platform という設定を x11 か wayland か自分のディスプレイサーバに設定する。

一応、自分はこれで入力できたが。

Chromium の開発の issue を見ていると wayland では苦労しそうで、 wayland の text-input v3 のイベントを Chromium がサポートしていないようだった。今後のリリースで少し使いやすいオプションが提供されるようだ。

Chromium + wayland で日本語入力ができない場合、修正を待つ間 Firefox を使うのも手だし、 Chromium の nightly ビルドなどを使ってみるのも良いかもしれない。

自分もちょっときになったので試してみた。 nightly で以下のオプションをつければ日本語入力できることは確認できた。

$ chromium --enable-wayland-ime --wayland-text-input-version=3

パスワード管理機能

Chromium には Chrome のようなクラウドにパスワードを保存する機能がないようだったので 1Password を導入した。

VLC 入れた

nvim を設定

公式の github から nvim-linux64.tar.gz をダウンロードしてきて

$ tar xvfz ~/Downloads/nvim-linux64.tar.gz

解凍して、

$ sudo mv nvim-linux64 /opt

とりあえず /opt に置いておいた

~/.bashrc にも書いた

一旦雑に .config/nvim/init.lua も上のようにしておいた

ポータブルなバイナリとして配布されていて素晴らしいなあと思った。

Nvidia のドライバと CUDA ライブラリ

オープンソース版のドライバが入らないように /et/modprobe.d/blacklist-nouveau.conf に

Nvidia のドライバやライブラリのダウンロードに関しては、調べるといろいろと情報が分散して古かったりもするし、あまり URL を直で語らない方がいいように思った。常にトップページからたどるのがおすすめ

このドライバをダウンロード

CUDA の互換性を調べて

CUDA のバージョンをナビゲータにしたがって選んで

インストールするためのコマンドが出てくるのでそれにしたがってインストール

Pytorch とかから使われる cudnn も同様にナビゲータに従ってインストール(コマンド省略)

また、 An Even Easier Introduction to CUDA | NVIDIA Technical Blog に書いてあるコードで、ちゃんと cuda が動くか

確かめたりした。

Max error: 0.000000 なら問題ない。今までの経験で CUDA のインストールが間違っていて 2.000000 となったこともあり、このコードには助けられた経験がある。おすすめ

$ sudo ldconfig

DLL がシステムに配置されるので、 ldconfig して使えるようにしておく

ffmpeg のカスタムビルド

以下のように

ffmpeg のリポジトリからコードをもってくる

上のように依存関係をリストアップしていれる。それを使うようにビルド。特に今回 cuda や nvenc の機能をちゃんと ffmpeg から使えるように以下のようになった

$ ./configure \
    --disable-static --enable-shared \
    --ld="g++" \
    \
    --enable-gpl \
    --enable-version3 \
    --enable-nonfree \
    --enable-cuda-nvcc \
    --enable-libnpp \
    --extra-cflags="-I/usr/local/cuda/include "\
    --extra-ldflags="-L/usr/local/cuda/lib64 -L/usr/local/cuda/lib64/stubs" \
    --enable-cuvid \
    --enable-libnpp \
    \
    --enable-libsvtav1 \
    --enable-libx264 \
    --enable-libx265 \
    --enable-libvpx \
    --enable-libfdk-aac \
    --enable-libopus \
    --enable-libdav1d \
    --enable-libfontconfig \
    --enable-libfreetype \
    --enable-libaribb24 \
    --enable-openssl \
    --enable-libbluray \
    --enable-libmp3lame \
    --enable-libssh \
    --enable-libtheora \
    --enable-libvorbis \
    --enable-libwebp \
    --enable-libxcb \
    --enable-libxcb-shm \
    --enable-libxcb-xfixes \
    --enable-libxcb-shape \
    --enable-libxvid \
    --enable-libxml2 \
    --enable-openal \
    --enable-opencl \
    --enable-opengl \
    --enable-ffnvcodec \
    --disable-stripping \
    --enable-nvenc \
    --enable-nvdec \
    --enable-cuda \
    --enable-libvmaf

--enable-nvenc とか --enable-cuda --enable-cuda-nvcc などを追加している

実は上の libvmaf に関してはこのあとビルドする。順番が前後になってしまっているが、ゆるして欲しい。

configure したら make && sudo make install

$ make -j 16
$ sudo make install

16 はスレッド数

$ sudo ldconfig

DLL も置かれるので ldconfig しておく

CUDA を使って爆速で VMAF を求められるようにする

VMAF は netflix が作った。エンコードした結果画質がどのくらい下がったかをスコア化するためのライブラリ。

コードをリポジトリからもってきて

上のように enable_cuda してビルド

ただ、少しコードを書き換えないとビルドはできるが実行時にクラッシュするようだった

こんな感じで実行するが

こんな感じでセグフォする。

セグフォしたら gdb で場所を特定

原因をとくていしてパッチを書いたので Comparing Netflix:master...amachang:master · Netflix/vmaf · GitHub からパッチを作って当てると動く(本家の issue にも連絡済み)

で、

$ meson setup libvmaf/build libvmaf -Denable_cuda=true -Denable_avx512=true
$ ninja -vC libvfam/build

みたいにして libvmaf をビルドすることができた。

2000 Kpbs とかの動画同士だったら 1800 fps とかで VMAF が求められるようになったので、めちゃくちゃ快適である。

NeoVim の設定

特にプラグイン管理の lazy の設定や copilot の導入、 language server の設定

Lazy の設定

Lazy から copilot を入れる

Lazy の設定書いて、 Vim を再起動。

インストールされたら vim 上で :Copilot auth とやってブラウザで認証をする。

language-server の設定もなんやかんや書いた。

Gnome Shell で一部のアプリの最初の起動が遅い

デスクトップポータルというアプリがデスクトップシェルの機能を使うための仕組みがあり、これを通じて各アプリが連携できるようになっている。

このデスクトップポータルが X11 なのに wayland を待ち続けて、そのポータルが必要なアプリも、タイムアウトするまで起動しない。という現象があるらしい。まだ治ってないらしい。

遅いのも最初の一回だけだし、原因がわかったし放置することにした。

NeoVim とクリップボードの連携

ヘルプをみる

クリップボードが x11 と連携できるように unnamedplus を設定

これだけでは動かなかったので、ちょっと調べた

NeoVim は xsel というプロセスを通じて x11 のクリップボードと連携するようでその xsel がシステムに入ってなかったようだ

$ sudo apt install xsel

NeoVim で yank したものを他のアプリで貼り付けたりできるようになった

Delete キーがない問題

よく gnome-shell のデスクトップ環境だと Delete キーがいろんなもののショートカットになっていたけど、自分のキーボードには Backspace しかなかった。

ちなみに 14 年前の HHK を使っている。

Backspace を Delete キーにマッピングする機能がキーボード自体にあったが、それをすると今度は Backspace キーがなくなってしまい直前に打った文字が消せなくなってしまう。

で、 HKK をしらべていると fn + ` が Delete キーとして働くらしい。そうだったのか...。

今思うと

Mac だと Backspace が Delete と呼ばれていて Delete キーの存在自体を自分は忘れてしまっていた。

その後

なんやかんやした(追記するかも)

最後まで読んでくれた人、ありがとう

最後まで読んでくれてありがとう!

この記事が、誰かの新しいことに挑戦する安心感や何かの問題を理解するのに役にたったら嬉しいです!

では!

近況報告:無職になりました

みなさんお元気ですか?僕は少しだけ元気ではありません。じんわりとした夏の暑さを感じながらブログを書いています。

実は、数ヶ月前にスマートニュースという会社を退職しました。

しばらく無職

しばらくは就職せずに無職でいようかなと思っています。

すぐに再就職した方がいいんだろうな〜。とは思うのですが少し疲れたかも。

いい時代になったものだ

最近は AI の進化も素晴らしく、昔ソフトウェアで出来なかったことがどんどんできるようになってるなって感じます。

Rust とか、ちょうど欲しかった感じのプログラミング言語もあるし、 ChatGPT は完璧ではないけど何か新しいことを始めるときに素晴らしい洞察を与えてくれる。

時代は確実に良くなってる。そんな時代に「自分は働いていないくていいのか」と少し不安になるけれど、自由気ままにコードを書く、そんな時間が今あってのもいいのかなって思ってます。

オフトピック

2007 年くらいかな。 Web 2.0 時代は Web API でなんでもできる時代を夢見たものだった。

今は知識のパッケージ(モデルの weight)を Web からダウンロードしてローカルで AI を動かす。そうすれば今までに出来なかったことができる。ここが終着点ではないけれど、自分の思ってた未来とは少し違う形で夢のようなことができる時代になったんだなあ。

素晴らしい時代になったものだ。

とにかくスマートニュースを辞めたのだ

自分がスマニューをやめた一番大きな要因は、やはり自分の英語能力にあると思ってる。

英語能力に限界を感じた

自分は本当に英語が出来なかった。もう 10 年以上勉強している。これまで相当な量の英語でのディスカッションや会話を行なってきたとも思う。

それでも、やはりどうしても「英語を使ったコミュニケーションで人をまとめていく」というところに到達することはもうないだろうという確信がある。

自分はスマニューの中で会社を国際化の必要性を訴え、国際化を推進した一人だったと思う。今思うとあの時点でゆっくりと自分自信の役割は終わり初めていたんだろう。

会社がグローバル化していく中で「英語を使って何かを決定し、それを人に浸透させ、人を評価し、会社の事業を推進する」そんなことができるような能力が自分にはないことがはっきりと分かった。

自分はできないけど、世界にはそれができる人材はたくさんいる。情けないけど本当なのでしょうがない。

そのことを自覚し自分は自分の後任を採用して、少しずつ重要な仕事から離れていった。そして、最終的には会社を辞めることにした。

スマニューでの仕事

スマニューではずっと EM で、ほとんどコードを書かせてはもらえなかった。でもちゃんと EM はやった。

僕、土屋さん、id:mizzusano

EM をちゃんとやった

EM というか People Manager という仕事をちゃんとやった。自分はコミュ障と思っていたのに意外とうまくやれた。

ここに関しては起業していたこともあって「会社の価値(株価)を上げるためにどうすればいいか」ってことを前提に自分の取るべき行動を考えられたことが大きかった気はする。

そして、上司の存在も大きかった。

良い上司と出会った

5 年間 Paul という男が自分の直のマネージャ(上司)だった。

Paul は無邪気な男だった。自己顕示欲がなく、嫉妬やルサンチマンもなく、自分の知らないことを嬉々として聞き、ドジでミスが多く、一度や二度のことはすぐ忘れてしまうような男で、そして何よりも抜群に聡明だった。

今までに一緒に仕事した中で一番良かったな。こうなりたいって思った。ロールモデルに出会えた。

無邪気はいい

Paul を見て無邪気っていいなって思った。

無邪気って「他人からの評価を気にしていない」「人に好き嫌いがない」「ミスや遠慮のない発言をするが、悪意がないことが明確」みたいな状態だと思う。これは結構すごい能力な気がする。

自分も意図的にそのようであることを目指した。

知らないことはどんなに簡単なことでも質問する。すごいと思ったら褒める。できないことがあったらすぐに助けてと言う。

あと、とにかく人の名前を覚えた。同じ空間に人がいたら、必ず「〇〇さん順調ですか?」って聞いた。不機嫌な態度をされた時は「さっき怖かったです。僕があなたに失礼なことをしたなら謝りたいです」と悪意を持たずに言いにいった。

このような行動は EM 業にとって非常に良い影響を与えた。チームも自由に失敗できる雰囲気になったし、問題に対して最短経路で必要な人を巻き込むことができるようになった。

無邪気はいい。これからもかっこつけないでいこうと思う。

Paul はこの特性のことを自分ではステートレスと呼んでいた。「印象を持たずに、その時与えられた情報しか当てにしない」みたいなことなのだろう。

ステートレスな男、Paul

いい人では終われないこと

方法的に無邪気に仕事をしてたけど、どんな KPI より会社の株価が一番大事と言うことは常に真剣に意識してた。 Paul とはいつもその話をしてた気がする。どこまでいっても自分はそういう人間なのだ。

人に嫌われることもたくさんやったと思う。誰もやりたくない判断こそ価値があると思ってそれを選んでやった。

最後に

このブログ結局書いて公開するのに何ヶ月もかかってしまった。本当にこの会社が好きだったので、辞めたことを書いてしまうのが少し切なかった。

5 年間という長い在籍になったし、もっといろんなことがあったけど、一番書きたかったことが「自分が英語ができかったってこと」と「Paul への感謝」だったので、少しバランスの悪い記事になってしまったかもしれない。最後まで読んでくれた人ありがとう。

ここから半年か一年くらいはプログラミングしながら無職で過ごしているので、何かご飯の誘いとかあったらいつでも呼んでください。

あぁ、プログラミングはいいな。ただ書けば書いた通りに何かが生まれる。それがいいんだ。

スマニューいい会社だった。ありがとう。

スーツが似合わない、鈴木健
不器用な id:kaiseh

ナラティブって何?

最近目にする「ナラティブ」という言葉

最近ネットで「ナラティブ」という言葉を目にしませんか?

基本的には「物語」という意味のようだが。正直いまいちピンとこないことが多い。

いろんな意味で使われてない?

なんか、いろんな人がいろんな意味で「ナラティブ」という言葉を使っているような気がする。どうなんだろう、気になる。

分類してみたい

ということで、「ナラティブ」という言葉の使われ方を自分なりにこうなんじゃないかな〜と分類してみようと思う。

(元々の英語の意味がどう?というよりも、カタカナで「ナラティブ」と書く時に何を含意していることが多いか。という主観的なまとめです)

1. 体験者の中に作られる物語、主観的な語り

ゲーム制作の文脈でよく使われる。何かを体験した結果、体験者の中に作られた物語。という意味

例えば、 RPG ゲームなどで、物語を構成する様々な要素をプレイヤー自身が時系列に体験していって、それぞれのプレイヤーがそれぞれの物語を体験するように作られていることがある。このプレイヤーの中に作られる「物語」のことを「ナラティブ」と言っている

ストーリー、自由度の偏りはナラティブを生まない

https://game.watch.impress.co.jp/docs/news/612286.html

ゲーム制作だけではなく、医療の分野で「ナラティブアプローチ」という言葉があり、この「ナラティブ」も「患者の客観的な症状ではなく、患者の主観的な体験」にフォーカスするアプローチという意味で捉えると、この意味と近い使われ方のような気がする。(自信はない)

それに対して、ナラティブ・アプローチにおいて患者の言葉に耳を傾けるのは、「患者の言葉から、患者の解釈を理解するため」です。物語は患者の解釈と捉えるとわかりやすいでしょう。

https://jinjibu.jp/keyword/detl/929/

また、それを形容動詞的に使うこともある。「ナラティブな〇〇」「ナラティブ〇〇」「この〇〇はナラティブな感じがする」のように使う。「物語に主観的に没頭できる〇〇」のような意味

日本で「ナラティブなゲーム」と言われているのは、「ダークソウル」と「ワンダと巨像」の2本が挙げられた。

https://game.watch.impress.co.jp/docs/news/612286.html

非常にナラティブな作品だった。見ているこちらにも迫り来る苦しみにかなり胸が痛くなったが、作品を作りながらだんだんとキリアンとカンパニーが苦しみから解放され、最期には希望の光をなんとかつかんだのだな、ということが感じられた。観ているこちらも救われる。

https://danseparis.exblog.jp/24573327/

2. ある事象に、恣意的に意味づけするための物語

(追記)安全保障や防衛の研究では、一般的に使われる用語のようです:

安全保障や防衛分野におけるナラティブは、「政策上の目標に対して心理及び認知領域における正当性を付与するように、意図的に作成された物語」である。対象となるオーディエンスを誘導する目的を有し、現在の状況、将来の望ましい状況及びそこへの到達方法を含む。既存の防衛力と組み合わせることで相乗効果を発揮する。

安全保障や防衛におけるナラティブ

(追記ここまで)

特に政治や軍事の文脈で使われる気がする。事件とかに恣意的に意味づけをするような時に使われる物語。「この事件は〇〇の〇〇のような意図によって引き起こされたものだ」みたいな感じの物語。これは「主観的な物語」とか「体験者の中にある物語」という含意はない気がする。政治や軍事の用語なのだろうか

偽情報と違ってナラティブの拡散に対してはファクトチェックが困難だとの指摘に、大きく首肯。

https://twitter.com/hiranotakasi/status/1507228218591522832

これはテクニカルな制度上の議論というより、国内外の反対派が足を引っ張るために人工的に作り出したナラティブで、蛇足です。反対するなら他の理屈がある。

https://twitter.com/show_murano/status/1505435995344363520

3. 主観的な体験や思ったことを口語で時系列に書く感じの文章の様式

たまに「もっとナラティブに文章を書いて」と言われることがある。その場合、僕は「以前に〇〇なことがあった。その経験は僕にとって〇〇であった。これを人に伝えたいと思った。なのでこの提案をした」みたいな感じで書くことだと思っている。違うかも

これは英語の Narrative Essay のように書いてというような意味から来ているのだろうか

4. ある文脈で誰かと共有する物語

何か特定の文脈で、誰かと誰かが共有する物語全般。「主観的な物語」というよりは「発信者と受信者の共有する物語」という意味合いが強い気がする。マーケティングやブランディングの文脈で使われることが多く共有相手は顧客であることが多い気がする。

アップルの「Think Different」やナイキの「Just Do It」のように、顧客を鼓舞し、顧客の課題解決を手助けするようなナラティブは、強力な差別化要因となる。しかし、企業が語るナラティブのほとんどが自社中心のスローガンに留まり、そのような役割を果たせていない。コーポレート・ナラティブは、本来どうあるべきか。

https://www.dhbr.net/articles/-/7810

コアなイメージは?

ここまでの分類を踏まえるとカタカナ語ナラティブのコアイメージは以下のようなことなのではないだろうかと思う。

  • 物語、語り
  • 主観的、恣意的
  • 情緒的、感情的、共感的
  • 口語的、語られる対象であることの強調

最後に

やっぱり「ナラティブ」という言葉は「物語」とか「物語的」という意味ではあるけど、そのイメージを元に様々な文脈でそれぞれ結構違う含意を持って使われている気がしますね。

皆さんは「ナラティブ」をどう理解してますか?もし良かったら教えてください!

6 年間の起業を終えて

スマートニュースの社員になりました

皆様、お久しぶりです!約 7 年振りにこのブログを書いています。 元気にしてましたか?僕は元気です。

実はこの 6 年間 id:mizzusano とカクテル株式会社という会社をやっておりまして、先日のプレスリリースにもあったようにこの度会社ごとスマートニュースにジョインすることになりました。

f:id:amachang:20180529140842p:plain
UUUM に遊びに(?)行ってはしゃぐ僕と id:mizzusano

そこで今日は振り返りも兼ねて、以下の 3 点について、この 6 年間考えていたことを書いて見たいと思います。

少しでもこれから起業したい人のお役に立てればと思っております。

事業アイデアより大切なこと

6 年間の事業を振り返えると失敗の連続でした。その中で、事業そのもののアイデアより共に起業するメンバーが大切だと思ったので、その理由を書いておきます。

事業は失敗の連続

カクテル社が 6 年間で取り組んだ事業は 8 事業、作ったアプリは Android/iOS 合わせて 10 アプリ(そのうちリリースしたのは 7 アプリ)。とにかく失敗失敗の連続でした。

本当に酷いものです><

f:id:amachang:20180529154600p:plain
色んなアプリを作ったもんだなあ。一つ一つの事業に対して「笑い話」や「泣ける話」があるのですが、まあ色々とアレなのでここでは書かないでおきます。

事業に失敗しても会社は潰れない

でも逆にですね。これは声を大にして言いたいのですが「事業に失敗しても会社が潰れるわけではない」ということなのですよ。

なので、「やりたい事業がないのに会社を作るとか無いわー」などと言う人もいますが、そこは「やりたい事業がなくても起業して良いのでは?」って思います。だって、最初の事業アイデアは失敗するかもしれないし、それでも会社は続くんですから。

事業アイデアよりもメンバーが大事

「失敗」するにしても、遅すぎる段階で「失敗」するとそれは会社にとっての致命傷になることはあると思います。なので、そういう意味でも「実装のスピード」は大切です。

あと、「失敗」したときに次にいける判断力や精神的な余裕が必要だと思います。

僕なりの結論としては、結局人なのだと思います。もちろん事業アイデアも大事だとは思うのですが、「実装のスピード」と「失敗しても次を挑戦する気持ち」を持ったメンバーを集めることが大切なんだと思っています。

起業家が健康的に働く方法

この話はブログに書こうかだいぶ迷ったことなのですが、この機会を逃すとなかなか告げるタイミングがないと思いますので、書かせてください。

友人の死について

会社を作って約 8 ヶ月経った時、代表取締役だった友人が亡くなりました。一緒に起業した仲間です。

プライベートなこともあるので詳細は具体的に書けないことはご了承ください。当たり前ですが当時はだいぶ落ち込みもしたのですが、その出来事を乗り越えて、学べたこともありました。この経験から、起業家がもっと健康的に働ける方法をずっと考えていたのでここに残しておきます。

起業家が健康的に力を発揮していれば、たとえ事業が失敗し続けても、きっと良い成果が生まれると信じています。なので、これから起業したい人に少しでもお役に立てればと思います。

起業家が健康的に働く 4 つの方法

起業家が健康的に働く方法として、僕が感じたのは

  • 約束を自分で厳しくしすぎない
  • 期待値調整を上手にする
  • 不確実なことはなるべく早く終わらせる
  • 責任は分散させる

この 4 つです。

約束を自分で厳しくしすぎない

起業家には上司はいませんので、基本約束する相手は投資家や取引先になると思います。上司だったら叱ってくれるかもしれませんが、投資家や取引先はそんな優しくないので、どうしても起業家からしてみると「投資家や取引先との約束は確実に守りたい!」と思ってしまうと思います。

約束を守りたいという気持ちはあるべきです。しかし一方で、約束を自分で厳しく設定しすぎると、自分も現場も辛くなってしまうこともありますよね。起業家は自分の責任でやっているわけなので、この責任感がマイナスに働いてしまってはもったいないと思います。

そこで、約束をする時は、自分たちにとって少し甘めにするのをおすすめしています。例えば、「1 ヶ月でリリースできる」と思ったなら、「3 ヶ月でリリースできる」と言いましょう。

これは心理的にはすごく難しいことだし、勇気がいることだし、相手によっては失望されることかもしれません。それでも、出来ない約束をするより絶対に絶対に良いです。ここは頑張ってください。

あと、 3 ヶ月で出来ることを前提に事業の計画を立てた方が、その期間に様々なリスクを内包して確実に事業を進めることができます。

誰に急かされることも無く、結果的に当初の想定より早く進むとさえあると思います。突発的なトラブルで心を痛める機会もかなり少なくなると思われます。

「人と約束する時、 3 倍で言う」この法則は思えておいた方がいいと思います。

期待値調整を上手にする

これは起業家に限らずですが、あまり人の期待値を上げない方が良いです。あまり自分自身にも期待しない方がいいです。プライドはなるべく低い方がいいです。人に対しては、下から目線、低みの見物を決め込みましょう。

ただ、会社を経営していると期待されないことは実際には難しく、期待されないと資金が集まらなかったり、人材採用ができなかったりします。

なので、大事なのは「期待値調整」です。期待値を上げすぎたなと思ったらちょっと下げる、下がりすぎたなと思ったらちょっと上げる、と状況に応じて使い分けちゃいましょう。期待から得られるメリットとリスクを考えながら対外的なコミュニケーションをしていった方が良いのかなと思います。

期待されてなければ、一度や二度の失敗なんてことはないさ!

不確実なことはなるべく早く終わらせる

不確実なことがあると、人間そこに期待してしまうものです。不確実なことはなるべく早く答えを出しましょう。 例えば、「〇〇層から 100 万 DAU が見込める」みたいな話は、さっさとリリースして「〇〇層から 1 万 DAU を得ており、月ベースで 10% 成長している」というような話にしてしまうと良いと思います。

一番まずいのは、楽観的な予測を残したままリリースもせずプロジェクトが半年とか過ぎてしまうケースです。 半年もリリースされなかったらどう思いますか?きっとリリースの時に「ついについに、半年かけた大作がリリースされる!!」みたいに思われちゃうのではないでしょうか?

前項でも書いたように人から実態以上に期待されると、失敗に対する心理的コストが上がってしまうので、期待の余地もないくらい早く可能性に答えを見出しましょう。。

責任は分散させる

責任重大な仕事を一人で背負いこまないことも大切です。特に、以下のような

  • メールや文章を書く仕事(特に謝罪文)
  • 人前での発表やプレゼンの準備
  • 株主総会の議事録などを作る仕事

やろうと思えば何時間でも改善出来るような「作業者の誠意に依存したような仕事」は、特に二人でやった方が良いと思います。

例えば、いろいろ送り難いメールとかあるじゃないですか?そういう時は一人が荒く文章を書いて、もう一人がレビューして送信ボタンを押す(文章を書いた人と、送信した人が別になるようにする)みたいに「作業の責任」と「確認&決定の責任」を分離すると良いと思います。

ソフトウェア開発でいうと Pull Request を使ったコードのマージを想像すると良いかもしれません。あれも「コードを書いた責任」と「レビュー&マージした責任」を分けるようなものだと思ってます。

その後の会社経営について

彼の死後、もう一人のメンバーである id:mizzusano と手探りしながら会社経営を行ってきたのですが、分からないことだらけで本当に大変でした。投資家の方や友人に本当に助けられてここまでやってこれたのだと思います。

途中何度かお金が本当に無くなった時、事業に行き詰まった時、様々な場面で助けてくれた方々、本当に心から感謝しております。ありがとうございます。

この経験から思ったこととして「一度起業している人は優しい」というのがありました。起業家で成功してキラキラして見える人でも本当はめちゃくちゃ苦労していて、様々な部分で同情的に接してくれたのかなと思います。自分もこれからもし人に頼られたことがあったら、その人には出来る限りのことをしようと思っています。

あと時々、起業家の人が炎上しているのを見るといたたまれない気持ちになるので、みんな優しくしてあげて欲しいです。

f:id:amachang:20171010162730j:plain
写真はお金が無くて落ち込んでいた時に id:kensuu が撮影してくれました!

プログラマーが起業するということ

これから起業したいプログラマーの人に向けて、以下のことを助言したいです。

  • スタートアップの仕事はほとんど「コードを書く」こと
  • 流行りの技術をキャッチアップする時間がない
  • 大企業では使えないプログラマーになるかもしれない問題

プログラマーと一緒に起業しようと思っている人も、相手の気持ちになって読んでいただけるとありがたいです。

スタートアップの仕事はほとんど「コードを書く」こと

これはカクテル社(営業やマーケティングがほとんどいらないサービスを作っていた会社)特有のことなのかもしれませんが、会社のほとんどの作業は「コードを書く」時間でした。

なので、これからコンシューマー向けのサービスで起業する人は、プログラマーじゃないメンバーも「いざとなったらコードを書く覚悟」を持っていた方が良いかもしれません。

最近はどの会社もエンジニア採用に苦戦していて、「エンジニアの採用費を考えたら会社を買収した方がお得だよね!」という状況はあるので、会社のエンジニア率が高いと会社の EXIT の選択肢の幅も広がると思います。

(このあたりの細かいことは以前会社のブログに書いたことがあるので興味があればご覧ください)

流行りの技術をキャッチアップする時間がない

スタートアップをやっていると全くと言っていいほど自分のためのコードを書く時間が無いです。なので、流行りの技術を勉強する時間もほとんどありませんでした。

これは覚悟した方が良いかもしれません。

まあ「ライブラリ」「フレームワーク」「ツール」「プログラミング言語」などは、後からでもキャッチアップできるかもしれません。しかし、「機械学習」などの分野は、毎日のように新しいモデルが提案されるなど「分野が成長する速度」が「学習速度」に比べて非常に速いと感じます。今、一生懸命勉強してますが、いつか追いつけるかは謎です。

大企業では使えないプログラマーになるかもしれない問題

スタートアップを終えて、自分が市場から求められる人材か?ということに関して思ったことを書きます。

スタートアップで求められるエンジニア

基本的にスタートアップのエンジニアは以下のようなことが求められます。

  • とにかく早く実装する
  • シンプルに必要な機能だけ実装する
  • サーバもアプリもウェブも全部自分で書く
  • 基本はライブラリを使う

要は「拙速でフルスタックで、ライブラリを上手く使える人」というのが感じです。

しかし、こういうエンジニアは大企業ではあまり求められないかもしれません。

大企業で求められるエンジニア

大企業は、以下のようにスタートアップとは置かれる状況が全然違います。

  • 失敗に対するリスクが大きい(速度ばかりを重視できない)
  • プロダクトもそのマーケットも成熟している(シンプルな機能だけではダメかもしれない)
  • 資金があるので、専門性の高いメンバーを揃えられる(全部ひとりがやらなくても良い)
  • 資金があるので、ライブラリ自体を自社で作れる。コミッタを雇ったりもできる

要は「よくテストを書き、専門性が高く、品質の高いコードを書く人」というのが求められるのではないでしょうか?

自分は何が得意なエンジニアなのか?

カクテルを終えた今、この問いにどう答えて良いかわからない自分がいたりします。

ちゃんと自分の方向性を持ち、いざとなった時に潰しの効くエンジニアでいるということも常に意識していた方が良いかもしれません。

スマートニュースとこれからのこと

スマートニュースで働き始めて早 3 ヶ月が立ちました。

前々職のオーマから数えるともう約 9 年ぶりに会社員になったわけで、浦島太郎のような日々を過ごしております。そのあたりの感想、スマニューについて思ったこと、今後のことなどについても書いておきたいと思います。

めっちゃ人見知りになってた

6 年間ほとんど外出しなかったということもあって、ほとんど id:mizzusano としか会わない日々を過ごしていました。なので、今めっちゃ人見知りしてます><

まんじゅうこわい

必要なくても、適度に人と会っておくのは大切なことだと思いました。

「異能なエンジニア」を活かす環境作り

スマニューは非常にエンジニア駆動な会社で、いわゆる「異能なエンジニア」がビジネスに対して最大限に実力を発揮している会社だなあと感じています。

鍵は「お互いの特性の理解」と「部署を超えた連携」にあると思っています

会社って社員が増えると、部署ごとに「価値観村」のようなものが出来てしまっている例とかよく見かけませんか?(近寄り難い開発部とか) スマニューにはそういう分断が全然無いんですよね。

あと、社内にコーヒースタンドのような人が混ざり合う空間があったり、 Slack でパブリックに会話する文化が根付いていることがそういう雰囲気作りに影響しているのかもしれません。

f:id:amachang:20180529144900j:plain
執務スペースの脇にあるコーヒースタンド。バリスタさんが美味しいコーヒーを作ってくれます😋

こういった社内異文化コミュニケーションが成立しているところは、新参者としてもスマニューに入っていく中で非常に有り難く感じました。

会社の雰囲気作りに悩んでいる経営者の人は、ぜひ「社員の憩いの場」と言いますか「タバコの無い喫煙所」のような空間を設けてみるといかがでしょうか?

世界への挑戦

国内では有数のアプリになってきているスマニューですが、みんな現状にまだまだ満足しておらず「ようやく世界での挑戦権を手に入れた」というのが社内の雰囲気です。

僕もこれからスマニューの世界展開の中で少しでも貢献していけたらいいなと思っています。

今現在の僕の仕事は、グロースハックといいいますか、マーケティングをエンジニアリングの力で自動化、最適化していくみたいなことをやっています。 海外では Marketing Technology などと呼ばれる領域で、グローバル進出を目指すスマニューにおいて今後力を入れていく領域になるんだと思っています。

こういうこと一緒にやりたい人がいたら是非連絡ください!

エンジニアが足りない

スマニューでは今新しいプロジェクトが次々と始まっていて、エンジニアがまだまだ足りません!

id:mizzusano が今温めている企画もかなり面白そうだし、今めちゃくちゃ面白い仕事がたくさんあるので、面白いことやりたいエンジニアの人ぜひ一緒に仕事しませんか?

最後に

長々と書いて来ましたが、僕は元気に楽しく働いています。

エンジニアの人は、ぜひスマニューの社食で一緒にランチでもしませんか?

ツイッターか、フェイスブックで気軽に連絡してくださいねー!

f:id:amachang:20180425193021j:plain
スマニュー入社後のカクテル社員 @kazzumax 、 id:mizzusano 、 id:amachang (kazzumax は最後の 1 年カクテルにジョインしてくれました)

(おまけ) ピクトリーはこれからも続きます!

色々と事業の失敗についても書きましたが、ピクトリー自体は順調に運営されており、これからもサービスは継続していきます。

ただ、今後はよりピクトリーを発展させるためにも僕らよりも適したプレーヤーにピクトリーを譲渡することを検討しています

僕自身非常に思い入れのあるサービスですので、みなさまこれからもピクトリーのことをよろしくお願いいたします!

Windows7 搭載マシンを買ってきてやったことまとめ

はじめに

みなさま、こんにちは!年末の忙しい時期ですが、お元気ですか?
僕はなんとか元気です><
使っていた PC を壊してしまったので Windows7 搭載マシンを買ってきましたので、購入から初期設定、便利なアプリのインストールまでここにメモしておきたいと思います!

購入まで

と言うことでまず購入までにやったことをまとめてみたいと思います

価格.com で調べる

まずは、価格.comを使って、以下の条件で良さそうなパソコンを探してみます。

  • 8 万円以下の価格
  • それなりのグラフィックボード(最近 Minecraft っていうゲームをやってるので)
  • それなりのメモリ(メモリ安いので)
  • それなりの CPU
  • USB 3.0 (データ移行のときにハードディスクを USB 3.0 でつなぎたいので)
  • ディスクアクセス速度は、ある程度遅くても良い(RAM ディスクで頑張る戦略)
買うパソコンを決める

と、いうわけで以下のパソコンを購入することにしました

製品名 Aspire AS5750G-A78D/K
CPU Core i7-2670QM
メモリ 8GB
メインストレージ HDD 500 GB
グラフィックボード GeForce GT 540M 1GB
USB 3.0 有り
現時点での価格帯 75000 〜 80000 円くらい

公式ページ
価格.com のページ

パソコンを買いにいく

パソコンはその場ですぐに買いに行きたい派なので、価格.com のページから、「最安値に近い価格」で「地域が東京」で「店頭同価」なお店を調べてみます。
すると、以下のお店が良さそうだったので、そこに行ってきた
アキバ流通
で、実際に店頭に行ってみると倉庫みたいにパソコンが並んでいて、びっくり。ギーク心をくすぐられますね!

あと、このお店のすごく良いなと思ったところは、まったく接客されないところですね!めちゃめちゃ気楽に買うことができました!
棚の中に、お目当てのパソコンがありました!

実際に購入した価格は 75150 円でした。

せっかく秋葉原に行ったので

いろいろ衝動買いしちゃいました☆(ゝω・)vキャピ

開封の儀

無事、購入することが出来たのでさっそく開封してみましょう!

さっそく開けてみます!
じゃじゃーん!まさかの箱 in 箱!

最終的な中身は、バッテリー、 AC アダプタ、ケーブル、本体となんか紙類。

とりあえず
最近は CD-ROM とか付いてないんですな

最初の起動

開封したら、さっそく起動します

Windows の初期設定
  • ポチっとな
  • 以下のような画面が出てくるので、「次へ」をクリック
  • ユーザー名を「amachang」、コンピュータ名を「amandows」にして、「次へ」をクリック
  • パスワードを入力して、「次へ」をクリック
  • 「同意します」のチェックボックスをチェックして、「次へ」をクリック
  • 「推奨設定を使用します」をクリック
  • 日時をあわせて、「次へ」をクリック
  • 「ワイヤレスネットワークへの接続」の画面で、無線ネットワークを一つ選択して、「次へ」をクリック
  • 「コンピュータの場所」を選んでクリック(わからない場合はパブリックネットワークにしとけば良いと思う)

これで、 Windows の初期設定が終了します!

さて、使い始めるかと思ったら

なんか、 Acer の登録画面が出てきました><

めんどくさいので「省略」をクリック

さて、こんどこそ

と、思ったら今度はマカフィー><

めんどくさいよう><
(まあ、このおかげで多少安く買えるんでしょうね)
とりあえず、マカフィーを使う気はないので「後でアクティベート」するを選択する

最初のデスクトップ

一番最初のデスクトップはこんな感じ。

割とすっきりしてますね!わくわく!

性能を見てみる

では、さっそく性能を確認してみましょう

  • デスクトップ左下の丸いボタン(以後、「スタートメニュー」)をクリック
  • 「コントロールパネル」をクリック
  • 「システムとセキュリティ」をクリック
  • 「RAM の量とプロセッサ速度の表示」をクリック
  • おおおお!ちゃんと 8GB 認識されてますね!
  • 次に、さきほどの「システムとセキュリティ」の画面に戻り、「Windows エクスペリエンスインデックスの確認」をクリック
  • むむむ。やはりハードディスクのアクセス速度がボトルネックになっていますね!後でちゃんと作戦を考えましょう

Windows Update

正常に起動したことを確認したあとは、何はともあれ Windows を最新の状態に更新します

  • 「スタートメニュー」をクリックして、「すべてのプログラム」をクリック
  • 「Windows Update」をクリック
  • 「更新プログラムのインストール」をクリック
  • 暗転して、「ユーザーアクセス制御」のウィンドウが表示されるので「はい」をクリック(以下、ところどころでこれが起こるがすべて「はい」)
  • 同意確認などが表示された場合は、同意しつつ進める
  • 処理が終了し、再起動が必要な場合は「今すぐ再起動」をクリック
  • 再起動後、もう一度「スタートメニュー」→「すべてのプログラム」→「Windows Update」をクリックし
  • 「更新プログラムは正常にインストールされました」が表示されるまで、「更新プログラムのインストール」と「今すぐ再起動」を繰り返す

はい!これで、 Windows が最新になりました!やったね!

リカバリディスクの作成

プリインストール版の Windows7 の場合、OS のインストールディスクが付いていないので、出荷時の状態に戻すための「リカバリディスク」を作成する必要があります

  • 「スタートメニュー」をクリックして、「すべてのプログラム」をクリック
  • 「Acer」をクリックし、「Acer eRecovery Management」をクリック
  • 「デフォルトイメージディスクの作成」をクリック(このデフォルトイメージディスクっていうのが、俗に言う「リカバリディスク」ですね)
  • 「開始」をクリック
  • DVD-R メディアをドライブに入れて「はい」をクリック
  • 「デフォルトイメージバックアップの作成」が始まるので、しばらく待つ
  • ディスクを交換しつつしばらく待つと、計 3 枚のリカバリディスクが完成しますので、大事に保管しておきます。

これで、パソコンが壊れたときは出荷時の状態に戻せますね。えっとどこに保管しよう><
リカバリディスクができたら、ウィンドウを閉じます。

ディレクトリの構成を考える

次に、ディレクトリ(フォルダ)をどういう風に使っていくかという方針を考えます

まとめると

C:\Program Files … インストーラ付きアプリ
C:\Proguram Files (x86) … インストーラ付きアプリ
C:\Users\amachang\
  - bin … CUI 系アプリ
  - tools … GUI 系アプリ
  - archives … インストーラとか配布ファイル
  - dev … 開発時のソースファイルや、リソースファイルを置く
  - data … 雑多なデータ

不要なアプリやファイルの削除

さて、いろいろな設定やアプリをインストールする前に、不要なプリインストールされたアプリやファイルを削除しましょう。
基本的に 500GB のハードディスクなので、ファイルの容量が邪魔になることはありませんなので、以下ようなプリインストールされたアプリやファイルを削除する方針でいきたいと思います。

  • よく使うディレクトリや、なんらかのリストに表示され、一覧性をそこなうファイルやアプリ
  • 不必要なのに起動するアプリ
不要なアプリを探すため Process Explorer をインストール

不要なアプリを探すために、 Windows に元々入っている「タスクマネージャ」を使ってもいいのですが、更に便利な「Process Explorer」というアプリをインストールします。

  • http://technet.microsoft.com/ja-jp/sysinternals/bb896653 へ行く
  • 「Process Explorer のダウンロード」をクリック
  • ProcessExplorer.zip というファイルがダウンロードされるので、解凍する

これで Process Explorer が使える状態なので、さっそく起動してみましょう

  • 解凍された procexp.exe をダブルクリック
  • 「Process Explorer License Agreement」ウィンドウが表示されるので、「Agree」をクリック
  • すると、以下のようなプロセス(アプリの実行単位)の一覧が表示される

おおお!これは便利ですね!
また、以下のようにユーザーアクセス制御を介すと、すべてのプロセスの詳細が見られるようになります

また、以下の手順で実行ファイルの位置を表示するようにしておきます

  • カラムのところを右クリックして「Select Columns...」をクリック
  • 「Select Columns」ウィンドウで「Image Path」のチェックをオンにして「OK」をクリック


そうすると、以下のように「Path」というカラムに実行ファイルの位置が表示されるようになります。
これで、どこにインストールされたアプリが要らないかを検討することが出来ますね!

一般的なアプリのアンインストール方法

不要なプロセスの概要が分かってきたら、まずは以下の手順でアンインストールを試みます。

  • 「スタートメニュー」から「コントロールパネル」をクリック
  • 「コントロールパネル」ウィンドウから、「プログラムのアンインストール」クリック
  • 「プログラムのアンインストールまたは変更」ウィンドウにアプリ一覧が表示されるので
  • 不要なアプリを選んで右クリックし「アンインストール」をクリック

このようにして、一般的なアプリではアンインストールを行うことができます。
このとき、「Process Explorer」の「Company Name」を覚えておいて、「プログラムのアンインストールまたは変更」での「発行元」を調べると見つけやすいです
アプリによってはコントロールパネルで削除できないアプリもあります。
そのときの削除方法は以下のようになります

  • 方法の調べ方
    • アンインストール方法をネットで検索する
    • 「Process Explorer」の「Company Name」で表示される会社に問い合わせる
  • 方法は以下の処理をやる可能性がある
    • 個別にアンインストール用のプログラムがある場合はそれを使う
    • 実行ファイルやディレクトリを削除する
    • レジストリを削除する
Aspire 5750G にプリインストールされているアプリのアンインストール

では、今回買ったパソコンでプリインストールされている不要なアプリをどんどん消していきましょう。
明らかに必要そうなアプリはここには乗せていません。

アプリ名 常駐プロセスの実行パス 要不要 備考
Norton Online Backup C:\Program Files (x86)\Symantec\Norton Online Backup\NOBuAgent.exe 不要 「30 日間だけ無料のオンラインバックアップシステム」のためのプロセスは要らない
Renesas Electronics USB 3.0 Host Controller Driver C:\Program Files (x86)\Renesas Electronics\USB 3.0 Host Controller Driver\Application\nusb3mon.exe 要 USB 3.0 を制御するためのプロセスと思われる
Realtek High Definition Audio Driver C:\Program Files\Realtek\Audio\HDA\RAVCpl64.exe, C:\Program Files\Realtek\Audio\HDA\RAVBg64.exe 要 オーディオドライバを管理するためのプロセスと思われる
よくわからないけど NVIDIA 関係 C:\Program Files\NVIDIA Corporation\Display\NvXDSync.exe, C:\Windows\System32\nvvsvc.exe, C:\Program Files (x86)\NVIDIA Corporation\NVIDIA Updatus\daemonu.exe 要 グラフィックドライバ関連と思われる
NTI Media Maker 9 なし? 不要 CD とか DVD オーサリングツールは要らないかなー
Acer Backup Manager C:\Program Files (x86)\NTI\Acer Backup Manager\IScheduleSvc.exe, C:\Program Files (x86)\NTI\Acer Backup Manager\BackupManagerTray.exe 不要 バックアップは自分でやるし、プロセスを常駐させるほど必要と思えない
Bing Bar なし? 不要 ブラウザのバーは要らない
Windows Live Essentials 2011 なし? 不要 まあ、便利なものもあると思うけど全部は要らないので消す
Microsoft SQL Server 2005 Compact Edition [ENU] なし? 不要 ちょっと悩んだけど、 Windows Live Essentials も使わないので、消してみる。必要だったらまた入れればいいや
Microsoft Silverlight なし? 要 ときどき必要な場合もあるので、入れとこうかな
.NET Framework 系、 Visual Studio のランタイム系 なし? 要 まあ、いつか入りそうな気もするし
マカフィー インターネットセキュリティ スイート C:\Windows\System32\mfevtps.exe, C:\Program Files\Common Files\mcafee\SystemCore\\mfefire.exe, C:\Program Files\Common Files\mcafee\McSvcHost\McSvHost.exe, C:\Program Files\Common Files\mcafee\SystemCore\\mcshield.exe, C:\Program Files\mcafee.com\agent\mcagent.exe 不要 試用版は要らない
newsXpresso なし? 不要 ニュースはウェブブラウザで見るので
ETDWare PS/2-X64 8.0.6.3_WHQL C:\Program Files\Elantech\ETDCtrlHelper.exe, C:\Program Files\Elantech\ETDCtrl.exe 要 タッチパッド関連。普段は外付けのトラックボール使ってて要らないんだけど、外出時に要るから
MyWinLocker Suite C:\Program Files\EgisTec IPS\PMMUpdate.exe 不要 よく分からない暗号化ツールは要らない。もし必要になったら OpenSSL のユーティリティとかで暗号化するかな
Dolby Advanced Audio v2 C:\Dolby PCEE4\pcee4.exe 要 ちょっと悩んだけど、音がよくなるらしいので入れておく
clear.fi, clear.fi Client C:\Program Files (x86)\Acer\clear.fi\Movie\clear.fiMovieService.exe, C:\Program Files (x86)\Acer\clear.fi\MVP\clear.fiAgent.exe 不要 ホームシアターアプリは不要。変にファイルの関連付けするし常駐プロセスまである><
Acer Crystal Eye Webcam なし? 不要 まあ、ノート PC からそんなに写真とらないかな
Broadcom NetLink Controller, Broadcom Card Reader Driver Installer なし? 要 なんか、ネットワークドライバ関連っぽいので
Acer Updater C:\Program Files\Acer\Acer Updater\UpdaterService.exe 要 ドライバのアップデートとかをやってくれるらしいので
Acer eRecovery Management なし? 不要 もうリカバリディスク作ったので
Acer ePower Management C:\Program Files\Acer\Acer ePower Management\ePowerTray.exe, C:\Program Files\Acer\Acer ePower Management\ePowerSvc.exe, C:\Program Files\Acer\Acer ePower Management\ePowerEvent.exe 不要 Windows Vista のデフォルトのコントロールパネルで同じことが出来るから
Identity Card なし? 要 パソコンのシリアル番号を表示するためだけのファイル。要らないと思うけど、特に常駐プロセスもないので入れといてもいいかな
Welcome Center なし? 不要 名前からしていらない
Acer ScreenSaver なし? 不要 スクリーンセーバーってそんなにたくさん要らない
Acer Registration C:\Program Files (x86)\Acer\Registration\GREGsvc.exe 不要 ユーザー登録とかは要らないかな
Launch Manager ? 不要 ショートカットキー管理は AutoHotkey でやるので要らない

ふー!要らないものを削除して、だいぶすっきりしました!

アンチウィルスソフトウェアのインストール

今まで、アンチウィルスソフトウェアと言えば長年 Avast! というソフトを使ってきたのですが
今回は Microsoft の Microsoft Security Essentials をインストールしてみたいと思います。
無料ですし、動作が軽くて良いらしいので

  • まず、 http://windows.microsoft.com/ja-JP/windows/products/security-essentials へ行く
  • 「無料でダウンロード」をクリック
  • ダウンロードされた mseinstall.exe というファイルをダブルクリックして実行
  • 「ユーザーアカウント制御」ウィンドウで「はい」をクリック
  • 「ようこそ」と表示されるので、「次へ」をクリック
  • 「ライセンス条項」が表示されるので、「同意します」をクリック
  • 「プログラムに参加する」が表示されるので、「今はこのプログラムに参加しない」を選択して「次へ」をクリック
  • 「セキュリティを最適化する」が表示されるので、そのまま「次へ」をクリック
  • 「準備完了」と表示されるので、「インストール」をクリック
  • しばらく待つ
  • 「完了」と表示されるので、「スキャンして潜在的な脅威を検出します」のチェックボックスをチェックしたまま「完了」をクリック
  • しばらく待つ
  • スキャンが終わりました!これで、安心!

入力関係の設定

ようやく、最低限パソコンが使える状態になったので、個人的にまずやらなければならない設定として文字入力やショートカットの設定をしていきます。
おおまかに言うとここでは、以下の二つを目的にしています。

  • Dvorak 配列にする
  • 右手小指の酷使を避けるため Enter, Backspace, 矢印キーをすべてショートカットに割り当てる

この設定が毎回めんどくさいんですよねえ><

Dvorak の設定

普通のキーボードは Qwerty というキー配列なのですが、僕は Dvorak 配列でしかタッチタイプできないので配列を入れ替えます。
Dvorak キーにするには様々な方法があるのですが、僕は一番安定しているレジストリを書き換えて DLL を入れ替える方法を使っています。

  • 「スタートメニュー」をクリックして、「プログラムとファイルの検索」のところに「regedit」と打ち込みエンターキーを押す
  • 「ユーザーアカウント制御」ウィンドウが表示されるので、「はい」をクリック
  • 左側のペインで「HKEY_LOCAL_MACHINE」→「SYSTEM」→「CurrentControlSet」→「Control」→「Keyboard Layouts」とダブルクリックで開いていく
  • 「Keyboard Layouts」を開いたあと、「00000411」を選択する
  • 右側のペインの中の「Layout File」という箇所をダブルクリックする
  • KBDJPN.DLL ã‚’ KBDDV.DLL を書き換える

これで、次回起動した段階で Dvorak 配列になっているので、さっそくパソコンを再起動します!
やった!これでまともに入力が出来るようになりました><!

IME のショートカットの設定

次に IME のショートカットの設定をします。

  • IME のバーの工具箱みたいなボタンをクリックし、メニューから「プロパティ」をクリック
  • 「編集操作」タブを選択して、「キー設定」のタブを「変更」をクリック
  • 開かれた「詳細プロパティ」ウィンドウで、「キー追加」、「削除」、動作の「変更」を行うことができる

今回は、「矢印キー」や「半角/全角」を使わないように、以下のように Ctrl+Space, Ctrl+B, Ctrl+Shift+B, Ctrl+F, Ctrl+Shift+F, Ctrl+P, Ctrl+N を追加します。

  • Ctrl+Space
  • Ctrl+Shift+B
  • Ctrl+Shift+F
  • Ctrl+B
  • Ctrl+F
  • Ctrl+N
  • Ctrl+P
AutoHotkey_L のインストール

次は、各キーに対して様々な挙動をプログラムできる AutoHotkey_L をインストールします。

  • http://www.autohotkey.com/download/ へ行く
  • 「Installer for AutoHotkey_L」をクリックしてファイルを保存する
  • 保存したファイルをダブルクリックで実行
  • ウィンドウが開くので「Next」をクリック
  • 「Lincense Agreement」と表示されるので、「Next」を押す
  • 「Choose Version」が表示されるので、「Unicode (64-bit): Faster, but compiled scirpt won't run on 32-bit systems.」を選択して「Next」をクリック
  • 「Choose Components」が表示されるので、そのまま「Next」をクリック
  • 「Choose Install Location」が表示されるので、インストール先がそれでよければ「Next」をクリック
  • 「Choose Start Menu Folder」が表示されるので、「Install」をクリック
  • インストールが完了したら「Finish」を押す

これで、自由にショートカットキーをカスタマイズするスクリプトを記述することができるようになります。

AutoHotkey スクリプトを書く

AutoHotkey_L をインストールしたら、さっそくスクリプト(このキーが押されたらこう動くという設定が書かかれたテキストファイル)を書きます
スクリプトはどこに置いてもいいのですが、今回はとりあえず僕は C:\Users\<ユーザー名>\bin に置くことにします

  • C:\Users\<ユーザー名>\bin をエクスプローラで開いて右クリックして、メニューから「新規作成」をクリックし、「AutoHotkey Script」をクリックする
  • ファイルをメモ帳で開くとゴチャゴチャと最初から書いてあるので、それを全部消して以下のように書き換える
^h::Send, {BS}
^m::Send, {Enter}

^p::Send, {Up}
^n::Send, {Down}
^e::Send, {End}
^a::Send, {Home}

!h::Send, {Left}
!l::Send, {Right}
!j::Send, {Down}
!k::Send, {Up}

!+h::Send, +{Left}
!+l::Send, +{Right}
!+j::Send, +{Down}
!+k::Send, +{Up}

このファイルをダブルクリックで実行することで、ショートカットキーの設定が読み込まれます
今回のファイルの設定では、 Alt キーを押すと vim のキーバインドで移動できて、一部 emacs 風のキーバインドも取り入れています。

AutoHotkey がパソコン起動時の自動起動設定

さっそく AutoHotkey スクリプトをパソコン起動時に読み込むようにしましょう。

  • まず、「スタートメニュー」をクリックし、「すべてのプログラム」をクリック
  • で、「スタートアップ」で右クリックし、メニューで「開く」をクリック
  • 開いたウィンドウに、先ほど書いた AutoHotkey スクリプトのショートカットを作成する

これで、次回からパソコンを起動したら自動で AutoHotkey スクリプトが読み込まれるようになりました!
やったね!

フォントの設定

次に、プログラムを書くときに綺麗な等幅フォントを表示できる環境があるのとないのとでは大違いですね!
フォントがあるとないとではやる気もだいぶ変わってきます><
と、いうわけでフォントの設定をしていきたいと思います。

メイリオの等幅フォントを作る

まず、今 PC にインストールされているメイリオから等幅版のメイリオ「MeiryoKe_Console」を作成します。
手順は

  • http://okrchicagob.blog4.fc2.com/blog-entry-169.html へ行く
  • 「メイリオ・メイリオ改・meiryoKe・ttfname3」をクリック
  • 「meiryoKe_gen_6.02rev1.zip」をクリックしてダウンロード
  • ダウンロードした「meiryoKe_gen_6.02rev1.zip」を解凍
  • 次に、「C:\Windows\Fonts」ディレクトリから「メイリオ」を右クリックして、メニューの「コピー」をクリック
  • 「meiryoKe_gen_6.02rev1.zip」を解凍したディレクトリに貼り付ける
  • ファイルがそろったら、実行ファイル「meiryoKe_gen_6.02rev1.exe」をダブルクリック
  • 「生成します」と書かれたウィンドウが表示されるので、「OK」をクリック
  • 「正常終了」と表示されるので、「OK」をクリック
  • 以下のように新しいフォントファイル「meiryoKe_602r1」と「meiryoKeB_602r1」が生成されるので
  • それぞれのファイルをダブルクリックし、開いたウィンドウで「インストール」をクリック

インストールが終了すると、「MeiryoKe_Console」などのフォントが追加されます!

Consolas と MeiryoKe_Console をフォントリンク

個人的に Consolas という等幅フォントが一番開発をやりやすいと感じています。
しかし、困ったことに Consolas で日本語を表示するとデフォルトの設定では、 MS ゴシックで表示されてしまうのです。
MS ゴシックでは、あまり見た目が綺麗ではないので Consolas で日本語を書いたときに MeiryoKe_Console が使われるように設定したいと思います。
この設定を行うには、 Windows のフォントリンクという機能を使います。
まず、レジストリエディタを開きます

  • 「スタートメニュー」をクリックして、「プログラムとファイルの検索」のところに「regedit」と打ち込みエンターキーを押す
  • 「ユーザーアカウント制御」ウィンドウが表示されるので、「はい」をクリック

次に、フォントリンクの設定をするための値を開きます

  • 右側のペインで「HKEY_LOCAL_MACHINE」→「SOFTWARE」→「Microsoft」→「Windows NT」→「CurrentVersion」→「FontLink」とダブルクリックで開いていく
  • 「FontLink」を開いたあと、「SystemLink」を選択する
  • 「SystemLink」を選択した状態で、メニューから「編集」→「新規」→「複数行文字列値」とクリック
  • 右側のペインに一行挿入されるので、「名前」を「Consolas」と入力する
  • 名前を確定したあと、名前をダブルクリックし、表示されたウィンドウに「meiryoKe_602r1.ttc,MeiryoKe_Console」と入力し、「OK」をクリック

これで、次回起動した段階で Consals と MeiryoKe_Console がフォントリンクされた状態になるので、さっそく再起動して確認してみましょう!
ちゃんと、 Consolas で日本語はメイリオのフォントが見えてますね!
こんな感じ

ちなみに、フォントリンク前は以下のような感じでした…

微妙な違いだけど、ここが重要なんです!
これでガンガン Consolas でコードが書けるよ!やったね!

CUI 開発環環境の整備

僕も開発は、基本的に CUI でやりたい人なので、次は CUI の環境を整えたいと思います!

Console をインストール

Windows7 には、デフォルトで「コマンドプロンプト」という CUI の環境が付いているのですが、この「コマンドプロンプト」は使わずに「Console」というアプリをインストールしたいと思います。
正確には「コマンドプロンプト」 のフロントエンドとして、「Console」という UI を使うといった感じです。
「Console」を使う主な理由は、先ほど作った「Consolas + MeiryoKe_Console」のフォントが綺麗に表示できるからです><

  • http://sourceforge.net/projects/console/files/console-devel/2.00/ へ行き、「Console-2.00b148-Beta_64bit.zip」をクリック
  • しばらくするとダウンロードが開始されるので「Console-2.00b148-Beta_64bit.zip」を保存する
  • ダウンロードした「Console-2.00b148-Beta_64bit.zip」を解凍
  • 解凍して出来た「Console2」ディレクトリをどこかに置く(僕の場合は、C:\Users\<ユーザー名>\tools に置く)

次は起動しましょう

  • 解凍された「Console.exe」を起動する
  • 起動した状態だと日本語の表示がおかしくなってしまうので、メニューから「Edit」から「Settings...」をクリック
  • 左側のペインから「Appearance」をクリックし、「Font」→「Name」を先ほどフォントリンクの設定をした「Consolas」を選択し、「OK」をクリック
  • 次にメニューから「View」→「Console Window」をクリック
  • 「Console2 command window」というウィンドウが開くので、そのタイトルバーを右クリックして、メニューの「プロパティ」をクリック
  • 「"Console2 command window"のプロパティ」というウィンドウが開くので、「フォント」タブをクリックして、「MSゴシック」を選択して、「OK」をクリック
  • 「Console2 command window」はもう必要ないので閉じる
  • もう一度、「Console.exe」を起動すると、日本語が表示できるようになっている

しかし、実はこの Console では、日本語表示できるようになっても、まだ IME での入力ができません。
これに関しては、有志の方がパッチを当てたバージョンを公開されていますので、そのバージョンを使わせていただくことにします。

  • http://wiki.pythonpath.jp/moin/ConsoleIme へ行き
  • x64版をダウンロード、解凍すると出てくる Console.exe を正規のものと置き換えま

これで、日本語入力も出来るようになります!
やった!

Vim のインストール

次は、 CUI でテキストが書けるように Vim をインストールします。
このパソコンは 64bit 版の Windows7 が搭載されているので、 64bit 版のものをインストールします。

  • http://code.google.com/p/vim-win3264/downloads/list へ行く
  • 「vim73-x64.zip」をクリック
  • もう一回、「vim73-x64.zip」をクリックして、「vim73-x64.zip」をダウンロード
  • ダウンロードした「vim73-x64.zip」を解凍
  • 解凍すると「vim73」というディレクトリが入っているので、そのディレクトリをどこかに配置する(僕の場合は C:\Users\amachang\bin\vim73 に置く)
  • 「スタートメニュー」から「コントロールパネル」をクリック
  • 「コントロールパネル」を開いたら「システムとセキュリティ」をクリック
  • 「システムとセキュリティ」を開いたら「システム」をクリック
  • 「システム」を開いたら「システムの詳細設定」をクリック
  • 「システムのプロパティ」の「詳細設定」が開くので、「環境変数」をクリック
  • 「環境変数」の設定ウィンドウが表示されるので、「ユーザー環境変数」の欄を見る
  • 「ユーザー環境変数」の欄に
    • 「PATH」という「変数」の行が無ければ「新規」をクリックして、変数名「PATH」変数値「C:\Users\amachang\bin\vim73」を入力して「OK」をクリック
    • 「PATH」という「変数」の行があれば「変更」をクリックして、変数値の末尾に「;C:\Users\amachang\bin\vim73」を追記し、「OK」をクリック
  • 「環境変数」ウィンドウと「システムのプロパティ」ウィンドウを「OK」をクリックして閉じる

さて、これで「Vim」のインストールが終わりました!
これで、 Console を起動して vim と打つことで vim を起動することができるようになりました!
次は、設定をやっていきたいと思います。基本的にテキストは、 UTF-8 で書くという設定でいきたいと思います。
ユーザーディレクトリ直下に以下のような内容のテキストファイルを作って、「.vimrc」という名前で保存します

syntax on

set number
set fileencodings=utf-8,cp932
set encoding=cp932
set termencoding=cp932

set backspace=2

set expandtab
set tabstop=2
set shiftwidth=2
set softtabstop=0
set smartindent

set incsearch

とりあえずこれで内部エンコーディングは CP932 (Shift_JIS)ですが、ファイルエンコーディングは UTF-8 がデフォルトの設定になります!

Strawberry Perl のインストール

  • http://strawberryperl.com/releases.html へ行く
  • 「strawberry-perl-5.12.3.0-64-bit.msi」をクリックして、インストーラ「strawberry-perl-5.12.3.0-64-bit.msi」をダウンロード
  • ダウンロードした「strawberry-perl-5.12.3.0-64-bit.msi」を実行する
  • 「Strawberry Perl Setup」というウィンドウが開くので、「Next」をクリック
  • 「End-User License Agreement」が表示されるので、「I accept the terms in the License Agreement」を選択して、Nextをクリック
  • 「Destination Folder」が表示されるので、「C:\strawberry\」のまま、「Next」をクリック
  • 準備が出来たので、「Install」をクリック
  • 終了したら、「README」のチェックを外して、「Finish」をクリック

次は、環境変数「PATH」を設定しましょう

  • Vim のときと同様に「スタートメニュー」から「コントロールパネル」→「システムとセキュリティ」→「システム」→「システムの詳細設定」→「環境変数」へと進む
  • 「環境変数」の設定ウィンドウが表示されるので、「ユーザー環境変数」の欄を見て
    • 「PATH」という「変数」の行が無ければ「新規」をクリックして、変数名「PATH」変数値「C:\strawberry\perl\bin;C:\strawberry\c\bin」を入力して「OK」をクリック
    • 「PATH」という「変数」の行があれば「変更」をクリックして、変数値の末尾に「;C:\strawberry\perl\bin;C:\strawberry\c\bin」を追記し、「OK」をクリック
  • 「環境変数」ウィンドウと「システムのプロパティ」ウィンドウを「OK」をクリックして閉じる

これで、 perl コマンドと、 cpan コマンドが使えるようになりました!

CPAN モジュールをインストール

Perl がインストールされたので、 Console を開いて以下のように、便利なモジュールをインストールする

C:\Users\amachang\dev>cpan

cpan shell -- CPAN exploration and modules installation (v1.9600)
Enter 'h' for help.

cpan> install Bundle::CPAN

...

cpan> install App::Ack

...

cpan> install Win32::Console::ANSI

...

とりあえず、ここでは Bundle::CPAN と App::Ack と Win32::Console::ANSI だけをインストールすることにします。
これで、コンソールで便利なソースコード検索機能を使うことが出来るようになりました!

あと、これで何か自動化したいときは、 Perl を使うことが出来ますね!

その他インストールしたもの

  • Putty
    • 普段は SSH で繋いで Linux で開発をするので Putty を入れる
    • Window → Apperance でフォントを Consolas に設定する(この記事の前のほうに Consolas の設定をしているので、日本語も綺麗に表示される)
    • Window → Translation で文字コードを UTF-8 に設定する
  • WinShot
    • キャプチャソフト
  • iTunes
    • iPhone との連携と、音楽を聴くために
  • Google Chrome
    • 普段使うブラウザ
  • Firefox
    • 拡張機能には、 Multifox, Firebug をインストール
    • マルチログインが簡単に出来る Multifox が超絶便利なブラウザ
  • IETester
    • 古い IE での動作確認用

RAM ディスクの設定

最後に、このマシンではディスクアクセスがボトルネックになるのは間違いないので、 RAM ディスクを導入します。

RAM ディスクの作成

特に難しくないと思うので省略しますが ソフトウェア ダウンロードサービス | BUFFALO バッファロー を使い、 R: に 1GB の RAM ディスクを作成しました

(こんな感じの簡単なアプリでポチポチ設定できます。)
とりあえず、 RAM ディスクが出来たら再起動します

RAM ディスクの自動保存機能(バックアップモードについて)

バッファローの RAM ディスクには以下のことを行ってくれる自動保存機能(バックアップモード)という便利な機能があるのですが。

  • シャットダウン前にデータを退避
  • マシン起動時にデータを読み込み

これに関してはとりあえず使わない方針でやっています><
理由としては、バックアップすべきファイルが肥大化してしまっては、容量に制限のある RAM ディスクを生かしきれないと考えたからです。
基本的に

  • バックアップしたいものは手動で保存
  • スタートアップ時に読み込みたいものはスタートアップ時に bat ファイルか何かで読み込む

という方針でいきたいと思います><

Process Explorer と Process Monitor でディスクアクセスを調べる

次に、どのプロセスがディスクアクセスしてるかを探ります
具体的には

  • まず Process Explorer でだいたいディスクアクセスの多いプロセスを調べます。
  • 次に、 Process Monitor をインストールして、そのプロセスのディスクアクセスをトレースします。
  • Process Monitor を起動すると、以下のような画面で Win32 API の呼び出しをトレースすることが出来るので、どのディレクトリを RAM ディスクにすれば良いか一目瞭然です。


(この例では、 Operation contains "File" and Process Name contains "Chrome" で調べてます)

具体的にディレクトリが分かったら

具体的にどのディレクトリにアクセスが集中しているか分かったら、そこのディレクトリへのアクセスを RAM ディスクへ向けるようにします。
その方法は、ジャンクションという方法を使います。
ジャンクションは、「ソフトウェアがあるディレクトリにアクセスしようとしたら、実際には別のディレクトリにアクセスさせる」みたいなことが出来るものです。
具体的にはコマンドで、以下のように打ちます。

mklink /j "C:\このディレクトリにアクセスしたら" "R:\このディレクトリにアクセスしたことにする"

こんな感じで C ドライブから R ドライブにジャンクションを張っていきます。

ジャンクション先のケア

今回の場合、ジャンクションを張っている先は RAM ディスクなのでマシンを再起動すると、そのディレクトリ構造もろとも真っ白になってしまいます。
ですので、マシンが起動するたびにスクリプトで RAM ディスクを作りなおしてやる必要があります。
具体的には、「スタートアップ」に bat ファイルを突っ込んでおくことになると思います。

今回は何を RAM ディスクに置いたの?

TEMP 環境変数と TMP 環境変数を設定して R:\Temp へ

mkdir R:\Temp

Chrome はディスクキャッシュの保存先を R:GoogleChromeCache にする

  • Google Chrome が起動中に以下のように、タスクバーを右クリックして、「タスクバーにこのプログラムを表示する」をクリック
  • もう一度、タスクバーを右クリックして、「Google Chrome」を右クリックしてメニューを開いて、「プロパティ」をクリック
  • プロパティウィンドウが開いたら、以下のように「リンク先」の末尾に「 --disk-cache-dir=R:\GoogleChromeCache」を追記し、「OK」をクリック

Flash Player

mkdir R:\FlashPlayerData
rd /s "C:\Users\amachang\AppData\Roaming\Macromedia\Flash Player"
mklink /j "C:\Users\amachang\AppData\Roaming\Macromedia\Flash Player" R:\FlashPlayerData

ダウンロードディレクトリも RAM ディスクの中に入れてしまう

mkdir R:\Downloads
rd /s "C:\Users\amachang\Downloads"
mklink /j "C:\Users\amachang\Downloads" R:\Downloads

IE のキャッシュはインターネットオプションから設定できるので、 R:\IECache とかにしておく

mkdir R:\IECache


スタートアップスクリプト

で、スタートアップ時に以下のプログラムで、 R: ドライブの初期構成を作るようにしておきます!

mkdir R:\Downloads
mkdir R:\Temp
mkdir R:\IECache
mkdir R:\FlashPlayerData
RAM ディスクのログ機能を切る

バッファローの RAM ディスクは、かなり頻繁にログを吐いてディスクにアクセスします。
これでは本末転倒なので、バッファローの RAM ディスクのインストール先(デフォルトでは C:\Program Files\BUFFALO\BFRD4G)を開いて、以下のファイルの Level=9 という記述を Level=0 にします。

  • BRDUtilTray.ini
  • BRDUtil.ini
  • BRDUninst.ini

というわけで

やっと PC のセットアップが終わりました><
ふー、疲れましたわー><
でも、新しいパソコンってなんかワクワクしますね!
みなさんも年末年始、パソコンの整理なのどしてみてはいかがでしょうか
ではではーヽ(´ー`)ノ

ドワンゴの社内ハッカソンに行ってきた!

はじめに

みなさん、こんにちはあまちゃんです。
さて、今日は先日ドワンゴの社内ハッカソンに UT Startup Gym のメンバーとおじゃましてきましたので、ちょっとそのことについて書いてみたいと思います。

ドワンゴのエンジニアがほとんど参加してるらしいです!すごい人数ですね!
こんな人数でハッカソンをやるなんて、すげえ!
ちなみに、入り口はこんな感じ

僕もなんかサービス作ろう!

せっかくハッカソンに参加したんだから僕もなんか作ろうと思って、
事前にライブラリ作っておいて「あとは組み立てるだけ!」みたいな状態にしてたんですけど、
残念ながら完成せず…。
こんど機会があったら、どこかの開発合宿で仕上げたいなと思います。

ドワンゴの人が作ってたものがすごかった

最後に各々が作ったものを発表する LT があって、その発表が凄かったです。

(チラッ)
技術的にも尖っていて、ユーザー視点としても面白いものが多く、さすがニコニコ動画を生んだ会社だなあと思いました!
そのうち、製品の一部として生かされるものもあるかもしれませんね!
乞うご期待です!

ちょっと、会場の様子


(ニコニコ動画の @ 部長。同い年です。きゃー><しんちゃんかっこよす)

(いつになく、真面目風な id:Yoshiori。きっと、エッチなことを考えてるに違いない…。というのは嘘で)

(なんか、真面目風に話してます。後ろにいるのが、髪型でおなじみの右京さんこと id:yaakaito さん。)

(右京さん(id:yaakaito)、単体でパシャ。ハッカソンで彼の作ったものがめちゃめちゃ凄かった)

(java-ja の@さん、ステキな笑顔♥ 左後ろに写り込んでる人が…)

(http://mobilehackerz.jp/ の人!)

(mobilehackerz さんの名刺はなんと基盤!すげー!)

(id:con_mame さんと id:kusigahama さんを発見!なんか、はてなダイアラーからすると、すごい安心感ある二人組!)
f:id:amachang:20111219184858j:image
(左から、景虎さん、 id:Yoshiori 、みゆっき (現役高校生!!) こと id:toriimiyukki さん、そして、@:] さん!!このショットは貴重やー!)

(本部長@さんの手から凍てつく波動がー!)

(node.js の meso さん、こと id:t_43z さん!ハッカソンでは、さくっと node.js でウェブサービスを作っちゃうところがすげーと思った!)

(安定の id:hogelog さん、久しぶりに会ったらなんか、さわやかっこよくなってた!会社では id:Yoshiori とお仕事してるらしいお)

(@ さん、@ さん。 PS Vita のニコニコアプリを作ったチームらしいです!触って見たんですけど、ゲーム機でニコニコ出来るっていいですねー!)

まあ、そんなこんなで

ハッカソン楽しかったです!

(最後にちょっとみんなでピザを食べて)

(id:Yoshiori と id:con_mame ちゃんと一緒に飲みにいってー)

(歌ってー)
帰るころには、すっかり終電でした。
最近 id:Yoshiori は、ニコニコ静画の電子書籍アプリをやってるみたいで、今いちおし!らしいです!
iPhone アプリで週刊のマンガがタダで読めるのでなかなか良いですね!

最後に

三つ印象的だったことを話したいと思います。
一つ目は、ピザパーティのとき本部長の @ さんが「ドワンゴのエンジニアであることを、ある程度誇っても良いと思っている」と言っていたことです。
二つ目は、「ドワンゴではクリエイターにしっかりとお金が落ちるような、コンテンツの提供を目指している」という id:coji さんのお話です。
そして、三つ目は、「もの作り」に関して @ さんと話したときの、「ニコニコ動画では様々な機能を実装し検討してはそれをお蔵入りすることが多い」というお話です。
優秀なエンジニアを抱えていながら、技術だけに頼ることなく、常にユーザーとクリエイターの方に目を向け続けている、そしてそれを誇りと思っている。改めてドワンゴという会社の底力を感じた一日でした
ドワンゴのみなさん、昨日はありがとうございましたーヽ(´ー`)ノまた遊びにいきますね!

Facebook 向けウェブサービスは IE6 に対応すべきか ( 2011年12月の Facebook のブラウザシェア )

はじめに

みなさん、お元気ですか><リリースも終わって、一息ついたあまちゃんです!
ヽ(´ー`)ノわー
さて今日は、最近「お花サプライズ!」というサービスをリリースしたのですが、そのときにちょっと面白いデータを見つけたのでそのいきさつも含めて紹介したいと思います。

(今日のテーマはこの円グラフ)

フェイスブック系のサービスはどのブラウザに対応すれば良い?

よく、ウェブサービスを開発するときの悩みとして「古いブラウザでのデザインをどのくらいケアするか?」というものがあります。
「お花サプライズ!」でも、割と短い期間で実装することを目標としていたり、本番の HTML を書いた経験があまりないメンバーが多くいたことで「IE6 や IE7 への対応が鬼門なんじゃないか?」という心配が常にありました。
そこでよぎる甘い誘惑

このご時世、 IE6 とか IE7 に特別対応する必要なんてないんじゃね?

で、調べてみると大概の場合は「やっぱり IE6 や IE7 は無視できない… orz」となるのですが、「お花サプライズ」は、ターゲットユーザをフェイスブックだけに限定しています。
フェイスブック自体が「IE6 を非推奨にしていたりする」ということもあるので

ひょっとしたら IE6 や IE7 をそこまでケアしなくても大丈夫なんじゃないだろうか?

そう思って、ちょっと調べてみました。

ウェルカムページメーカーのデータをもとに調べる

実は、お花サプライズ!を作る前にちょっと作ったプチサービスがありまして、それがフェイスブックページのウェルカムページを作るサービス「ウェルカムページメーカー」です。
作ってからずっと放置してるんですけど、何げにずっと伸びてて、今は 3100 ページ以上のフェイスブックページに導入されていて、月間ユニークユーザーベースで 110,000 人からのアクセスがあります。

(9月〜今日までの訪問数、にょきにょき〜)
使われているページも、アナウンサーのページや、 歌手のページ、アニメのページ、EC サイト、企業のページ、個人のページと色々なページに使われていて、そこまで偏りはないと思うので、このサービスの統計をもとにフェイスブックでのブラウザシェアを考えてみたいと思います。
また、フェイスブックのウェルカムページを見れるのは基本的には PC なので、モバイルはこの統計には含みません。

昨日から 30 日前までのデータを使う

まずは、バージョンを問わないブラウザのシェアを見てみると以下のようになりました。
訪問数ベース↓

PV ベース↓

やはり、 IE を使っている人が多いですね!
では、次に IE をバージョンごとに分割したグラフを作ってみます。
訪問数ベース↓

IE6: 3.15%、 IE7: 5.09%
PV ベース↓

IE6: 3.78%、 IE7: 5.87%
表にまとめると以下のようになりました

ブラウザ 訪問数(%) PV(%)
IE6 3.15 3.78
IE7 5.09 5.87
IE8 27.92 32.81
IE9 14.86 19.04
IE10 0.00 0.00
Chrome 23.04 16.36
Firefox 14.34 13.77
Safari 8.68 6.16
Android Browser 1.52 0.98
Opera 0.51 0.52
ä»– 0.89 0.71

やはり、フェイスブックユーザに限定すると IE6 や IE7 のユーザが少ないことが分かりますね。

各ブラウザに対応するために必要なコスト

次に、各ブラウザに対応するコストを僕の主観で数値化してみる
以下の数値は、プロジェクト全体でかかる時間のうち、特定ブラウザへの対応時間以外にかかる時間を 1000 としたときに、どのくらい時間を費やす必要があるかを数値化したもの

ブラウザ JavaScript で同じ挙動を実現するのに必要な時間 CSS で文言が見えないなどの大きな崩れを解消するのに必要な時間 CSS で見た目の崩れをすべて解消するのに必要な時間
IE6 10 20 60
IE7 10 10 30
IE8 2 1 5
IE9 2 1 3
IE10 2 1 2
Chrome 1 1 1
Firefox 1 1 1
Safari 1 1 1
Opera 5 1 2

単位訪問あたりの作業時間を計算してみる

サービスへの訪問数 1% あたりのコストを計算してみる

ブラウザ 1% の訪問に対して JavaScript で同じ挙動を実現するのに必要な時間 1% の訪問に対して CSS で文言が見えないなどの大きな崩れを解消するのに必要な時間 1% の訪問に対して CSS で見た目の崩れをすべて解消するのに必要な時間
IE6 3.17 6.35 15.87
IE7 1.96 1.96 5.08
IE8 0.07 0.04 0.18
IE9 0.13 0.07 0.20
Chrome 0.04 0.04 0.04
Firefox 0.07 0.07 0.07
Safari 0.11 0.11 0.11
Opera 9.80 1.96 3.92

このように見ると IE6 の CSS のくずれを直すこと、また、 Opera の JavaScirpt に対する修正があまり生産的でないことが分かりますね><

というわけで「お花サプライズ!」では

以下のようなポリシーでブラウザ対応することにしました

  • IE6
    • JavaScript はちゃんと動くように
    • 大きく崩れてても気にしない。ただし、押せないリンクやボタン、隠れて読めない文字があるのは許さない
  • IE7
    • JavaScript はちゃんと動くように
    • レイアウトが大きく崩れてるようなのは修正。多少の崩れは気にしない。押せないリンクやボタン、隠れて読めない文字があるのは許さない
  • Opera
    • 試さない(運任せ)
    • きっと、 Opera さんならやってくれる…!!!
  • 全般的に
    • ブラウザのバグに依存したコードは書かない

まあ、そもそも

特定ブラウザに「対応する」って言い方はあまりよくないですね(><ごめんさない
こういう場合は、「なるべく多くの人が使ってるブラウザが実装してない仕様を使わないようにする」というのが正しいのかもしれません。
まあ、何にせよ。
これだけ色々な種類のブラウザが出てくると一つ一つのブラウザへの対応というものの重要性は薄れつつあるのかもしれませんね。
それなりに多くのブラウザでそれなりに動くのがちょうどいいと思うのですよヽ(´ー`)ノ

最後に

みなさんも、フェイスブックユーザをターゲットとしたサービスを作ることがあれば参考にしてみてくださいー
ではではーヽ(´ー`)ノ