Google Pixel 3a XLはUSBケーブルとの相性問題があるかも? #GooglePixel #Pixel3a #Pixel3aXL

Google Pixel 3a XLが届きました🎉

さっそく充電しようと思ったところ、充電ができない問題に遭遇したので、どんな状況だったのか書いてみます。

充電できない

常用していたUSB type A → USB type Cのケーブルをつかって端末を充電しようと思ったのですが、コネクタを刺しても反応せず…

もちろん常用していたので、別の端末 (Huawei Mate9) を接続すると正常に充電できます。

ケーブルが断線しているのかよくわからなかったのでUSB-Cの電圧・電流チェッカを使っていくつかのケーブルを比較してみました。

比較対象のケーブルたち

①: エレコム USB Type C ケーブル MPA-FACS12RD

Type A → Type Cのケーブルです。常用していて、外皮がナイロンメッシュなので耐久性が高そうで気に入っていました。

②: Huawei Mate9を買ったときに付属していたケーブル

Type A → Type Cのケーブルです。付属品なので単品では売っていません。 f:id:kuro_m88:20190519122321j:plain

③: Apple USB-C充電ケーブル MLL82AM/A

Type C → Type Cのケーブルです。Macを買うとついてくるやつです。もちろんPDにも対応してるので汎用性が高いです。

④: Pixel 3a XL付属ケーブル

Type C → Type Cのケーブルです。さすがにこれが使えないということはないと思いますが、一応比較。

f:id:kuro_m88:20190519122523j:plain

比較

USB-Cの電圧・電流チェッカが手元にあったのでチェッカを通してPixelを接続し、ケーブル自体に通電しているのか、Pixelに電流が流れているのかをを調べました。測定に使ったのはこれです。

電源の供給にはAnker PowerPort+ 5 USB-C PDを使いました。全体で60Wまで供給できてPDにも対応しているのでMacも充電できて便利です。

①: エレコム USB Type C ケーブル MPA-FACS12RD

f:id:kuro_m88:20190519121550j:plain

いきなりですがダメでした…。ケーブルには通電しているものの、Pixel側で受け入れられていないのか、電流は流れていません。充電できないということです。

②: Huawei Mate9を買ったときに付属していたケーブル

f:id:kuro_m88:20190519121750j:plain

電流が流れています。また、本体にも充電中と表示されました。

③: Apple USB-C充電ケーブル MLL82AM/A

f:id:kuro_m88:20190519121926j:plain

電流が流れています。USB-CかつPDに対応しているので約9Vで給電されています。本体にも急速充電中と表示されました。

④: Pixel 3a XL付属ケーブル

f:id:kuro_m88:20190519122651j:plain

もちろん電流が流れていますし、PDにも対応しているので本体に急速充電中と表示されました。

結果

手持ちのエレコムのケーブルではPixel 3a XLに給電できませんでした。ケーブルの細かい仕様の違いのせいなのか、詳しい原因は切り分けができませんでしたが、ケーブルとの相性問題があるかもしれませんので外出先に持っていく充電ケーブルは事前に充電できるかチェックしてみることをおすすめします。

ちなみに

給電はできないけどPCとの通信はできるということはないのか…?と考え試してみました。

f:id:kuro_m88:20190519123307j:plain

MacBook Airに接続するためにType A → Type Cの変換アダプタを間にはさみましたが、やはり認識されませんでした。残念。

紹介したもの

ssh-import-idコマンドでGitHubに登録した公開鍵をサーバに登録する

ssh-copy-id コマンドをご存知でしょうか。 サーバに公開鍵を登録するときに対象サーバの ~/.ssh/authorized_keys に公開鍵を手動で追加せずとも、手元の公開鍵を指定して自動で対象のサーバに追加してくれるコマンドです。

ssh-import-id コマンドはそれのGitHub版といった感じです。GitHubのほかにLaunchPadも対応していてそのサービスに登録している公開鍵をサービスから取得してきて登録してくれるのでとても便利です。

GitHubだと自分の公開鍵は https://github.com/kurochan.keys のように username.keys で取得できます。

使い方

Ubuntu18.04で試しました。ログインしたい対象サーバでコマンドを実行します。

GitHubの場合は gh:username, LaunchPadの場合は lp:username と打ちます。

$ ssh-import-id gh:kurochan
2019-05-07 14:37:19,163 INFO Authorized key ['2048', 'SHA256:f+9eGlHij0d5SwHYZWPkhafqQ5htuuINWrYxk8Cbipo', 'kurochan@github/11532103', '(RSA)']
2019-05-07 14:37:19,169 INFO Authorized key ['4096', 'SHA256:wKII8N+s47M+ggRhFbIrRpcVXjZCH48VVjs0TJq9XTU', 'kurochan@github/31733264', '(RSA)']
2019-05-07 14:37:19,169 INFO [2] SSH keys [Authorized]

ssh-import-id コマンドのソースコード

LaunchPadにリポジトリがあります。

ssh-import-[name] という命名規則スクリプトを作ってパスを通しておくと拡張ができるようです。便利ですね。

launchpad.net

実践Rust入門を読んだ

Rustに興味を持っていたところ、著者の一人であるκeen氏*1から献本頂いたのでゴールデンウィークに読みました。全部は読み切れていないですが、紙媒体の発売前に記事を出して応援したかったので今読んでいるところまでの感想を書きます。

Rustに興味を持ったきっかけ

κeen氏とは新卒入社時の同期で、彼はコンパイラとRustの話をよくしていたのでそれをきっかけでRustの存在は認知していましたが、そこまで強い関心は持っていませんでした。

時が経ち、世の中でもRustという言語について言及されることが増えてきた頃にこの本が出版されたので、改めて興味を持ったという感じです。

(2016年にRustのハンズオン会に参加したことがあったのですが、高熱が出てで早退してしまったのでこれは書いたウチに入らないですね。。)

普段書いている言語

普段は業務で書くScalaがメインです。Scalaで広告システムを作っています。あとはたまにスクリプト的にRubyを書くくらいです。C言語は大学の授業で使った程度です。

どんな本なのか?

Scalaを書いている人にはScalaでいうところの「コップ本」に相当すると言うとわかりやすいです。 入門する人、業務等まとまった時間を使って書きたい人が最初に読む本という感じだなと思いました。飽きずに読み進められました!

あとはRustに限らないプログラミング上必要になってくる前提知識が適度に挟まれているのがよかったです。 例えば、標準ライブラリとしてHashMapが用意されていますが、そのハッシュアルゴリズムはSipHashというものが使われています。ハッシュアルゴリズムは簡単なものだとhashdos攻撃という攻撃に対して脆弱になってしまいますが、暗号学的ハッシュ関数を使うことでこの種の攻撃に対して耐性が得られます。(初版 p183) こういった知識がしつこくない程度に入っているのが嬉しいです。

本の構成

目次の一覧は技評のサイトに載っています。

実践Rust入門[言語仕様から開発手法まで]:書籍案内|技術評論社

C言語等何かしらのプログラミング言語を触ったことがあって、とりあえずRustの言語機能的な部分が知りたい人は5章から流し読みを始めるとよさそうです。Rustの所有権の概念についてだけ知りたい人は7章だけで読むとよさそうです。ちなみに僕は1章から順番に8章までと12章を読みました。

1章はRustという言語が流行っているらしいがどんな言語なのかなんとなく知りたい、といった人にとってはありがたいと思いました。初めて聞いたプログラミング言語について調べるときまず適当にググって世の中の情報を集めるとおもうのですが、それがだいたいまとまっている感じです。どんな言語なのかなんとなく知った気になれます。

2-3章ではRustを実行するための環境を構築してVS Code上でコードを書いてみます。僕はPCを横に置いて実際に手をうごかすことはせず、流し読みしました。2章で環境構築をして、3章でバイトニックソートというソートアルゴリズムを実装します。いきなり完全なものを実装するのではなく、Pythonのコードと比較しながら最低限の実装→ジェネリクス→ソート順のカスタマイズ→並列ソートというふうに改善していきます。コードや実行結果が全て書かれているので書いて動かす様子を想像しながら進めました。とりあえず基礎編をひととおり読み進めてからまた戻ってきて見返しながら実際に実装するとよさそうな気がします。性格的な問題もあるかもしれませんが、先が気になるのでひとつひとつ丁寧に確認することはせずにどんどん読み進めめました。

4-5章でデータ型について知ることができます。5章はプログラム上で定義したデータが実行時にメモリ上でどのような扱いがされるのか等書かれているので抑えておいたほうが何か疑問に思ったときに想像がつきやすそうです。

6章が文法系です。特に違和感のあるものはなかったです。初めて見たのはシャドウイングくらいでしょうか。

7章がRustの一番の特徴でもある所有権についてです。さすがにここは初めての概念なので手元で実行しながら復習したほうがよさそうです。所有権による管理が常に強制されるのかと思っていましたが参照カウンタによるリソース管理も用意されているのは便利そうですね。弱い参照も実装されているおかげでオンメモリキャッシュ等も作りやすそうでした。

8,9-11章: トレイトとポリモーフィズム, 実践編です。まだ読んでいません。。

12章はFFI(Foreign Function Interface)についてです。RustからC言語の関数を呼び出したり、C言語からRustの関数を呼び出したりすることができますが、それの実現方法について書かれています。今までプログラミングをしていて他の言語で書かれたコードを呼び出した経験がなく興味があったのと、C言語で実装したものが呼び出せるのであればその他の言語との連携もできるのであろうという想像をしているので方法が気になったので読みました。 RustのコードからするとC言語で実装されている部分は外界なのでRustのプログラミング的な安全性は保証されませんが、unsafeという概念によってRustの言語機能によって守られる部分と守られない部分を明確に扱うことで他言語と連携できることがわかりました。

感想

2年くらいかけて書いたそうなのですが、対象は最新の2018editionについてになっていたり、昨年末に発表されたAmazonのfirecrackerについての言及があったり、常に最新の話題に追従しながら書かれていたんだろうなと思いました。

Scalaで知っていたような概念(タプルとか、トレイトとか)も多少出てきていたので、読んでいてそこまでハードルは感じませんでした。一番大きいのはきっと所有権まわりだと思いますが、まだ書いていないのでそこはこれから学びます。この本をひととおり読んでから手を動かし始めれば何もしらないよりはつまずかないはず、と予想しています。「Scalaでいうところの「コップ本」に相当する」と書きましたが、まだ自分が実際どうだったかはまだわからないものの、数日でひととおり知識としてインプットすることはできたと思うのでRustに入門したい人が周りにいればとりあえず薦めたい一冊です。

ちなみに献本してくれたκeen氏が担当した箇所は自分が読んでいない実践編なので今後ちゃんと読み進めます… m( )m

書籍版

Kindle

*1:kじゃなくてκなのがポイント

MAASを使って物理サーバとVMを簡単に構築/管理できるようにする

物理サーバ上でVMを簡単に立てたり落としたりできる環境がほしかったので、OpenStackの検証をしていました。

とりあえず最新版でVMが建てるために必要な構成を考えてKeystone, Glance, Horizon, Placement, Nova, Neutronをデプロイして、VMが経つところまでいくのに数日かかりました。(実質12時間くらい)VMが経ったのはいいのですが、VMメタデータサーバがうまく通信できていないのでcloud-initが動作せずという感じでこれ以上ゴールデンウィークの時間を使うのがしんどくなり、半ば諦める形でMAASを検証してみたのですが、MAASが自分の用途にかなり合っていたので紹介します。

結論から言うと個人で数台の物理サーバとVM管理する程度だったら構築が本当に簡単なのでおすすめです。

やりたかったこと

遠隔地にある物理サーバ数台を管理して、その上にVMを建てたり落としたりを簡単に管理できるようにする。

VMを建てるだけであれば物理サーバにOSを入れてsshをすればよいのですが、できればどのマシンでどのVMが動いているのかとか、IPアドレスとか、ついでにいろいろ管理したかったのです。 分かっていたことですが、物理サーバ複数台上にVMを建てるのとブロックストレージも使わないような環境だとOpenStackはおおげさすぎました。(単に使ってみたかった)

前提条件

MAASで管理したい各サーバの通信用ポートとIPMIポートはネットワーク的にMAASをインストールするマシンと繋がっている必要があります。サーバの通信用ポートとIPMIポートは同じネットワークでもよいですし、別れていても大丈夫です。通信用のポートに関してはPXE bootする際にDHCPを使うので同一のL2に存在している必要があります。(後述のrack controllerというのを増やすことでスケールします)IPMIがないサーバも管理できますが、MAAS経由でIPMIがないと自動で電源を入れたり、起動設定を変えたりといったことはできません。

管理対象のサーバ

RX200S5

  • CPU: 8コア16スレッド
  • Memory: 16GB
  • HDD: 1TB x 2
  • OS: Ubuntu 18.04

R610

  • CPU: 12コア24スレッド
  • Memory: 48GB
  • HDD: 320GB x2, 1TB x2
  • OS: 未インストール

R610

  • CPU: 12コア24スレッド
  • Memory: 48GB
  • HDD: 1TB x 1
  • OS: 未インストール

その他

  • 将来的には管理対象に入れたいサーバがあと数台

MAASとは

Metal as a Serviceの略でCanonicalが提供している物理サーバ等の管理ソフトウェアです。Metal(物理サーバのこと)といいつつもVMの管理もできちゃいます。

今回は詳しく紹介しませんが、MAASと連携するjujuというソフトウェアを組み合わせるとOpenStackやKubernetes等もWeb UIからぽちぽちするだけで構築できます。

MAASの構成

MAASの最小構成はサーバ1台で十分です。この次で紹介するコマンドを打つだけで以下のすべてがインストールされます。構成がシンプルなので冗長化やバックアップも簡単そうです。

PostgreSQL

MAASが使うDBです。インストール時にユーザ作成やテーブルのマイグレーション作業も自動で行われるので直接触ることはなかったです。

Region Controller

データセンターやリージョン全体を管理する概念です。1つのRegion内で管理されるAZやデータセンタのフロアといった概念も設定で表現できます。 今回は管理したい規模がとても小さいのですべてdefaultのままです。 postgresql(DB), regiond(APIとWeb UI), bind9(DNS), ntpd, squid(http cache proxy), rsyslogdが動いています。

Rack Controller

データセンタのラックを管理する概念です。ラックやラック列といった一定規模のサーバの集合ごとに設置されるイメージです。 今回は管理したい規模がとても小さいのでRegion ControllerとRack Controllerは1つのサーバに同居しています。 rackd, dhcpd, httpd, tftpdが動いています。 regiondが親だとするとrackdは子に相当します。rackdがラック等の一定規模ごとに存在することでデータセンタが大きくなってもスケールします。

MAASのインストール

今回はMAASの管理ノードとしてRX200S6を使うことにしました。ちなみにMAAS上でもVMは作れるので限られたリソースは活用できます。

$ sudo apt-add-repository -yu ppa:maas/stable
$ sudo apt update
$ sudo apt install maas
$ sudo maas init

MAAS URL [default=http://10.55.60.1:5240/MAAS]: http://192.168.0.1:5240/MAAS
Create first admin account:       
Username: admin
Password: ******
Again: ******
Email: admin@example.com
Import SSH keys [] (lp:user-id or gh:user-id): gh:kurochan

githubの公開鍵がインポートできるのでとても楽です。ここでインポートしなくてもあとで追加できますが、ここで追加しておくと作成した物理マシンやVMに自分の公開鍵でログインできるので便利です。

ハマったところ

MAASを動かすだけであれば構築作業は驚くほど簡単でした。

MAASをインストールしたサーバでだけ/var/log/syslogにログが転送されなくなるという現象に悩まされました。(Ubuntuはsyslogはログ発生(/dev/logに書き込み)→journald→rsyslog→/var/log/syslog書き込みという流れでログが転送されます)

いろいろ調査した結果、どうやらmaas-rsyslogというサービスが影響していそうなことまではわかりました。maas-rsyslogというのは、構築対象のサーバのsyslogをMAASに転送してくれるサービスです。プロセス的にはrsyslogで、

$ ps aux | grep -v grep | grep rsyslog
maas     30435  0.0  0.0 363932  4876 ?        Ssl  May05   0:00 /usr/sbin/rsyslogd -n -f /var/lib/maas/rsyslog.conf -i /var/lib/maas/rsyslog.pid
syslog   31712  0.0  0.0 269336  5344 ?        Ssl  May05   0:13 /usr/sbin/rsyslogd -n

syslogユーザで動いている通常のrsyslogに加えて、maasユーザで別のrsyslogが動いていることがわかります。maas用のrsyslogの設定を見た限り特に悪影響を与えるような設定は見当たらなかったのですが、以下の通り、通常のrsyslogの設定ファイル( /etc/rsyslog.conf )を編集し、module(load="imuxsock") の次の行に input(type="imuxsock" socket="/dev/log") の一行を加えたところなおりました。

module(load="imuxsock") # provides support for local system logging
input(type="imuxsock" socket="/dev/log") # ←この行を追加

物理マシンを認識させる

qiita.com

この記事を読みながら進めました。構築対象の物理サーバと同じセグメントに対してDHCPを有効にするとRegion ControllerのDHCPサーバが有効になり、PXE bootができるようになります。

物理マシンにOSをインストールする

物理マシンのboot優先順位をPXE bootが一番になるように設定して再起動します。するとMAASがPXE bootの要求をきっかけにサーバを認識し、IPMIのユーザを自動作成します。 対象サーバを選択し、comissionというボタンを押すとサーバの構成情報をひととおり収集してくれます。

f:id:kuro_m88:20190506183021p:plain

構築したいマシンを選んでデプロイボタンを押すだけで、rackdが対象の物理マシンのIPMIを操作して電源を入れて、PXE bootして自動でOSがインストールされます。複数台同時に構築もできて便利ですね。

f:id:kuro_m88:20190506183112p:plain

OSデプロイ時にRegister as MAAS KVM hostというチェックを入れておくとこの物理マシン上にMAASからVMが作成できるようになります。(ここでチェックを入れなくても既存のホストをKVM hostとして手動で追加する方法もあります)

VMを作成する

VMは物理マシンとちがって最初から存在しないので、作成してあげる必要があります。さきほど追加したKVM hostsはPodというメニューから見られて、ホストマシンを選択するとホストマシンのキャパシティと現在稼働しているVMの一覧が見られます。CPU, メモリのオーバーコミット率も設定できます。

f:id:kuro_m88:20190506183330p:plain

ここで好きなサイズや構成のVMを作成すると、物理マシンと同様にMachineとして認識されます。

f:id:kuro_m88:20190506183205p:plain

VMにOSをインストールする

VMと物理マシンは同様に扱われるため、物理マシンと同様な手順でOSのインストールが可能です。ただし、Comissionは終わった状態になります。

感想

OpenStackと比べなくても構築がびっくりするくらい簡単でよかった。