WWDC2017感想とか

大きく分けて項目は6つ。

  1. tvOS
  2. watchOS
  3. macOS
  4. iMacとiMacPro
  5. iOS(iPhone + iPad)
  6. Music(HomePod)

tvOS

AmazonPrimeが来ると言う話しか覚えていません。

watchOS

  • OSとして色々改善したみたい
  • APIとかもアプデ
  • 死ぬほどでかい変更はなかった記憶
  • 新OS配信は秋予定

macOS

  • HighSierraになる => みんな失笑してた
  • Safariがめちゃめちゃ早くなったらしい
  • 動画の自動再生がデフォになって設定できるみたい
  • Photosアプリが強化されてより便利に、Photoshop連携?
  • defaultのファイルシステムがAPFSになって色々ファイル操作が早くなる(複製とか)

iMacとiMacPro

  • iMac 21.5インチ
  • iMac Retina 4K 21.5インチ
  • iMac Retina 5K 27インチ
  • Kaby Lake搭載のiMacが出る
    • そろそろCoffeeLakeと、来年にはCannonLake出るのでタイミング微妙な気もするけど更新はされたことは良いと思う
  • 一番上の5K27インチでRadeon Pro 570、575、580からグラフィックカードを選べて、 VRAMは最高8GB
  • Kaby Lakeプロセッサ搭載のMacBook Proも登場

  • iMacProはひたすら強いの

  • 8~18coreのXeon + AMDの次世代GPU「Vega」を搭載予定
  • 2017年12月予定
  • 一番下のEditonで$4999

iOS

  • iMessageアプリは未だに推している
    • ApplePayの個人間送金
    • 金をよこせというリクエストも送れるみたい
  • Siriで翻訳出来るように、喋ってくれる
    • 英語から中国語・フランス語・ドイツ語・イタリア語・スペイン語に翻訳
    • 日本語はまだ
  • jpegの圧縮率が2倍になったらしい
  • !! Live Photosが編集可能に
    • 切り取りやミュート、ループ、バランス、長時間露光などが出来るように
    • LivePhotos好きなので、良さげ
  • コントロールセンター(下からシュッってするやつ)が1画面に
    • 詰め込みすぎて地獄みたいなUIに
    • 新music以降AppleのUI/UXチームはどこへ行ってしまったのだろうか
  • 運転中のdndモードが実装。通知が来なくなるみたい。
  • FIlesっていうFinderっぽいアプリができてGoogleDriveとかDropboxとかと連携できるみたい
  • AppStoreがリメイク
  • ランキングタブが消えたっぽい?結構UIがガラッと変わった
  • !! ARKit

    • めっっっちゃ楽しそうなのでデモみてください
  • iPadPro10.5インチ

    • 大きさは9.7インチとあまり変わらずベゼルを狭くして画面幅だけ広がったはず
    • A10X
    • スペックも向上して120hz対応とか
    • Browsingのときとかはよしなにフレームレートを落としてくれてバッテリー削減
    • USB3.0
10.5インチiPad Pro 64GB:649ドル
10.5インチiPad Pro 256GB:749ドル
10.5インチiPad Pro 512GB:949ドル
12.9インチiPad Pro 64GB:799ドル
12.9インチiPad Pro 256GB:899ドル
12.9インチiPad Pro 512GB:1099ドル

Music

  • HomePodと言うものを発表
  • A8積んでいるらしい
  • 要はすごいSpeaker
  • 今後Siriをどんどん強化して最高のアシスタントになったら便利になるかも -音楽だけでなく、ニュース、天気、交通状況、スポーツスコア、単位換算、メッセージ送受信、株価や翻訳などなど。HomeKit 連携も可能。
  • 1Kの僕にはあまり欲しいと感じない
  • 12月に発売、$349
  • すぐじゃないのか…忘れられなきゃ良いけど…

まとめ・雑感

  • ハードの発表もあったからか、例年に比べて結構おもしろかった。長く感じた。
  • Keynoteの最初に出ていた、 Keep making Apps, world depends on you. という文言がよかった。エモポイント
  • 新生Musicからそうだけど、AppleのUI/UXチーム的な部署はどうなってしまったのか。
  • ゴミ箱デザインが気に入っている経緯も気になる。
  • ARKitのデモがすごかったので、本当に色々な可能性がありそう。ハコスコ + ARKitで頑張ってHoloLensごっこしたい。
  • 機械学習というコンテキストで話すと、iMacProはAMDGPUじゃなくてnvidiaの方がCUDAとかの文脈で便利という話をよく聞くので、その辺はどうなっているのか全く知らない。
  • 昔からMacAMDGPUを採用しているという経緯はあったりしていたはず。
  • とはいえAMDGPUもとても優秀で、Vegaは期待されているので楽しみ。

余談

f:id:miyachik:20170606061116j:plain

AWS Auroraをpt-online-schema-changeでオンラインscheme更新する

レコード数の多いテーブルに対してALTER TABLEしたい時ってありますよね、でも普通にALTER TABLEとかやるとロックがかかってしまって書き込みができないので、今回はpt-online-schema-changeを使いました。(逆に他のプロダクトはどうやってるかは聞いてみたいです) 色々制約がある場合には実行できないです。–dry-runオプションで確認が可能。 https://www.percona.com/doc/percona-toolkit/2.1/pt-online-schema-change.html

MySQL5.6以降からのOnlineDDLとの使い分け参考:

  • 原則 pt-online-schema-change
  • 色々オプションが付けられて融通がきく
  • Auroraなのでストレージの心配は一応無し?

https://yoku0825.blogspot.jp/2015/12/pt-online-schema-change56-innodbalter.html

仕組み

内部でやっていることは

  • 対象のテーブルと同じ構造のテーブルを作る
  • コピー先のテーブルにALTER文を適応
  • コピー元テーブルに対して、TRIGERを作成し、差分が反映されるようにする
  • テーブルのデータコピーの開始
  • コピー先テーブルをRENAMEしてテーブルを入れ替える
  • 後処理(TRIGERやコピー元テーブルの削除)

参考: http://ameblo.jp/principia-ca/entry-12129289966.html

やる

今回はローカルのMacにいれてトンネルを掘ってpt-online-schema-changeしました。

$ brew install percona-toolkit
$ ssh -f -N -L 3307:${RDS_HOST}:3306 -i ~/path/to/${ENV}.pem ec2-user@${PROXY_HOST}
mysql -u ${USER} -P 3307 -h 127.0.0.1 -p ${DATABASE}
$ pt-online-schema-change --alter='じっこうしたいALTER文;' h=127.0.0.1,P=3307,u=${DB_USER},p=${DB_PASSWORD},D=${DATABASE},t=${TABLE}

これでログがでてくるので終わり、オプションは適宜。 centosにも簡単に入れられるので踏み台鯖からやったりしても良いと思います。 トンネルのやつはこれを参考: https://cloudpack.media/9675

perconaの読み方

f:id:miyachik:20170523195851p:plain https://www.quora.com/How-do-you-pronounce-Percona

社会人二年目とiPadPro欲とRyzen

社会人二年目

無事に社会人二年目になりました。弊社は最初の一年はグレードが絶対に変わらず、この4月が初めてのグレード上がるかどうかの評価時期だったのですが、無事にグレードを上げることができました。
高専卒でそのまま入社し、最年少のままグレードを上げられたのはとてもうれしく思っています。
ただ、仕事については色々と思うところが多かったり、まだまだやっていかなきゃいけないので、適度にやっていきします。最近興味あることはLivePhotoです。
超絶個人的に今はRuby力というよりかは、JavaScriptだったりGolangだったりSwiftを積極的に触っています。仕事ではコストをそこまで気にせずAWSをゴリゴリ触れる環境にいるので、今のうちに関連知識をどんどん増やせればなと思って動いてます。

iPadPro VS Ryzen

最近ずっと新しいPCとiPadProを天秤にかけています。
メインのPCを組んだのが6年前になり、グラボは更新をしたもののメモリが8GBでは足りなくなってしまい、マザーボードの調子も悪くたまに掃除しないと起動しなくなったりしてしまっているので、買い替えたいなと。2500K + R9 260Xくらいなのですが、せっかく買ったNier: Automataや、Bayonettaすら起動しない始末。これはつらい。
買い換えようとすると、今のメモリがLGA1155 + DDR3なので、MBを変える必要があり、となるとCPU/メモリも買えなきゃで、結局ほぼほぼ作り直すことになりそんなに節約にはならない。

Ryzenは、Intelでない事自体がデメリットと北海道の方から聞こえてきて、大体同意見なのですが、元々Radeon信者だったりしてAMDはそれなりに好きだったり、グラボ積むマンなので7700kとかのHD Graphicsとかはいらないなと思っているので、Ryzenに飛び込んでみるのも楽しいんじゃないかと思っています。後は色々教わっているおじさんがAMD信者で引きづられているフシもあります。
アニメオタクは社会でも結構見つかる方だけど、自作PCオタクは全く見つからないのどうにかしてほしい。わかりやすく1680万色に光ったりして欲しい。*1
Ryzen気になるけど(AMDのCPUが)そこまでなぁという気持ち、Ryzenのソケット周り知らないのでいい機会だし飛び込んでみたい気持ち…
6月にはWWDCがありますし(6月なので新商品はないとおもいつつ)、Intel製の6コアCPU(CoffeeLake)もお披露目になりますし、どっちを買うにしてもタイミングが図りづらい…
なんだかんだR7 1700X + RX480に傾きそう、次の悩むタイミングは秋のCoffeeLakeとVEGA(RX5xx代)お披露目…!でもRyzen買えばCoffeeLakeや次の本命CannonLakeで悩む必要もなくなる。
高専でそういう話が出来る人が少なかったことに対するフラストレーションみたいなものはすごくあって、もっとちゃんとしたエンジニアの多い会社に行けばそういう人も多いと思いきや、プログラミングの話はできる人は多けれど、自作erは今の会社にも居ませんでした。プログラミングの話が出来る人が圧倒的に増えたのでそのへんの不満はまったくないんですけどね。
仕事も概ね楽しいです。

iPadProは本当にただの贅沢なので手が止まっている状況、iOSタブレットほしいけど今買うならPencil対応だよねっていう思考。iPadがPencil対応していたらすぐにでも買っていたかも。Appleさんお願いします。

色々ありつつも、引き続きやってきの気持ちでやっていきましょう。

ローカルのmysqlが死んだときの備忘録

環境

mysql 5.7.16
macOS 10.12.4
mysqlcheck Ver 2.5.1 Distrib 5.7.16, for osx10.11 (x86_64)

起きたこと

普段通りによくあるrailsのspecを通していたら、全部通らなくなった。エラーを見るとmysqlのコネクションエラー系のやつ。rails sでサーバーは起動できるが、specは通らない。mysqlcheckをしても復旧には至らず。

Mysql2::Error:
  Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)

あぁ、なんか知らないけどlocalのmysqlが死んだんだなと起動してみるも、起動しない

[kenta.miyachi]% sudo mysql.server start                                                                                                                            Password:
Starting MySQL
.. ERROR! The server quit without updating PID file (/usr/local/var/mysql/MKenta.local.pid).

む、なにかおかしいなと思い、エラーログを見てみる。いっぱい出ていた。

2017-04-17 19:57:17 0x70000728a000  InnoDB: Assertion failure in thread 123145422413824 in file trx0purge.cc line 168
InnoDB: Failing assertion: purge_sys->iter.trx_no <= purge_sys->rseg->last_trx_no
InnoDB: We intentionally generate a memory trap.
InnoDB: Submit a detailed bug report to http://bugs.mysql.com.
InnoDB: If you get repeated assertion failures or crashes, even
InnoDB: immediately after the mysqld startup, there may be
InnoDB: corruption in the InnoDB tablespace. Please refer to
InnoDB: http://dev.mysql.com/doc/refman/5.7/en/forcing-innodb-recovery.html
InnoDB: about forcing recovery.
10:57:17 UTC - mysqld got signal 6 ;
This could be because you hit a bug. It is also possible that this binary
or one of the libraries it was linked against is corrupt, improperly built,
or misconfigured. This error can also be caused by malfunctioning hardware.
Attempting to collect some information that could help diagnose the problem.
As this is a crash and something is definitely wrong, the information
collection process might fail.

こんな感じのmessageが出たときは、エラーログでぐぐってフォーラムを見ると良さそう。 ログから見た感じ、このbugっぽさ?でも違う気もする。完全に同じものは見つからず。 https://bugs.mysql.com/bug.php?id=61516

復旧

とりあえず一旦は作業ができれば良いので、DBの復旧を試みる。 innodb_force_recoveryを使ってとりえあえずdataだけdumpする。 値は以下。
1: SRV_FORCE_IGNORE_CORRUPT
2: SRV_FORCE_NO_BACKGROUND
3: SRV_FORCE_NO_TRX_UNDO
4: SRV_FORCE_NO_IBUF_MERGE
5: SRV_FORCE_NO_UNDO_LOG_SCAN
6: SRV_FORCE_NO_LOG_REDO
詳しくは公式にて。
https://dev.mysql.com/doc/refman/5.7/en/forcing-innodb-recovery.html https://dev.mysql.com/doc/refman/5.6/ja/forcing-innodb-recovery.html

[mysqld]
innodb_force_recovery = 3

これで起動だけは出来たので、一旦全部dumpする。 やっていることは

  • 全databaseをdump
  • mysqlテーブル以外を削除して
  • dumpから復元
% mysqldump -u root -p -x --all-databases > alldatabase.dump
% sudo mysql.server stop
% sudo rm -rf `ls -d /var/lib/mysql/* | grep -v "/var/lib/mysql/mysql"`
% mysql -u root -p < alldatabase.dump

とりあえずmysqlが起動するようにはなった。 これでdump復元でうまく行けば無問題、しかしそうは問屋が卸さない

[kenta.miyachi]%  mysql -u root -p < alldatabase.dump                                                                                                                                                                        Enter password:
ERROR 1813 (HY000) at line 5035: Tablespace '`mysql`.`engine_cost`' exists.

既にいるらしい、でもDROP TABLE IF EXISTSを書いているdumpなのでそんなことはないはず。直にCREATE TABLEクエリを投げてみても、同じエラー、DROPもできず。中身を見てみる。

sh-3.2# ls | grep engine
engine_cost.ibd

本来 TableName.frmTableName.ibdがいないと行けないところ、.ibdファイルしかいなかった。これが不整合の元凶なのではないかと。 とりあえず、dumpを取っているのでこいつを消してdumpから復元する。 何度か起きたので繰り返し。無事復旧完了。

.frmと .ibdについて

.frm

テーブルに関するそのデータディクショナリ情報が格納されます。

https://dev.mysql.com/doc/refman/5.6/ja/innodb-frm-file.html

.ibd

テーブル固有のテーブルスペースを持つテーブル (.ibd ファイルに格納) は、MySQL Server を停止させずに個別にリストアできます。間違ってテーブルデータを削除または更新した場合に、この手法を適用でき、DROP TABLE、TRUNCATE TABLE、または DROP DATABASE のステートメントを通じて、実際にはテーブル自体を失うことがありません。

https://dev.mysql.com/doc/mysql-enterprise-backup/3.11/ja/partial.restoring.single.html

復元中に調べていて知ったのですが、壊れたtableを特定できていれば、これで簡単に一部だけリストアできたかもしれない。今回一番の反省でした。

解決

Localなのでかなり雑にやってしまいましたが、.ibdのことを知っていればもう少し作業が楽に進んだかもしれません。 tableが壊れた原因については、別途調査中。今のところ不具合はなし。

ツッコミお待ちしております。

参考

InnoDB が破損し MySQL 全体が不安定に - http://nlogn.ath.cx/archives/001874.html
MySQLのクラッシュバグにご用心 - http://wadahiro.hatenablog.com/entry/20111006/1317927393
MySQLInnoDB破損したときの復旧方法 - http://qiita.com/skouno/items/71174c959abe435223ab
MySQLスキーマ情報に不整合が起こったら - http://accountingse.net/2015/09/943/

Golang所感

最近業務でGolangを触り始めているので、学習の記録などを綴ります。 Golang自体は昔に、AndroidGolangで開発する時代が来ると思って少し触ってはいましたが、今やKotlinが主流ですね。 GolangでViewは書くのは無理って話を雑な小耳に挟んでいます。

資料など

Golang で心を無にしてコードを書く // Speaker Deck

とても綺麗にまとまっていました。

hakobe932.hatenablog.com

よしなに色々やってくれる(できる)Rubyと、素朴に書いていくGolangって感じがした

blog.a-know.me

CLIツール作るときはRuby + Thorでやっちゃうし、Golangが生きてくるクロスプラットフォームみたいなところ、あまり魅力が…て感じが でも生きる場面はかならずあるので、Golangという手段を知っているのは強みだと思います。

Go1.7のcontextパッケージ | SOTA

contextはすごいっておもった

所感

Golangを勉強していると、素朴って単語をよく見る気がします。 素朴に書けるっていうのはチューニングをしやすかったり、知識がないと盛大なパフォーマンス低下を招いてしまうという意味に捉えているので、Golangという言語を学ぶことは他の言語に比べて大事だなと感じました。 雑なGolang所感でした。たぶんまた書きます。

RailsのRubyのVersionを上げる

個人的なメモも兼ねて

一般的なRailsプロジェクト

rbenvとかのupdate

最新のRubyをインストールするためにrbenvのversionを上げる

cd $RBENV_ROOT
git pull origin master
cd plugins/ruby-build
git pull origin master
rbenv install 2.4.0
rbenv local 2.4.0
rbenv rehash

versionファイルの編集

対象のRubyversionがメタ書きされているような場所をあげる。 今回いじったのは - .ruby-version - circle.yml - config/deploy/#{environment}.rb ぐらい。 .ruby-versionは自分でいじらなくとも先述のコマンドで変わっているはず。 Rubocopを使用している場合は.rubocop.ymlのTargetRubyVersionも変える。 おわり。capistranoでdeployしている場合はdeployサーバにも新しいRubyを入れないと死ぬ。

おひっこし

各種のアカウントをmiyachikで揃えようとしたら、はてなidは変えることが出来ないようで、仕方なくアカウントを作り直すことに。 旧Blogも対して更新はしていなかったので、特に遺恨なくお引っ越しを完了しました。 tigger501st.hateblo.jp

また気が向き次第更新していくようになると思います。