ishikawa_pro's memorandum

情報学生の備忘録です.

Swift Node.js Docker AWS etc...色々やります。

MySQL5.7のJSON型について調べた

こんにちは。
今日はMySQLJSON型を使う機会があったので、勉強したメモです。
基本的には、ドキュメントの内容を引っ張ってきて書いてます。
英語苦手なので解釈間違ってるかも。

dev.mysql.com

調べた経緯

業務で新しい機能を作っていて、テーブル定義のレビューの際に、それJSON型でいいんじゃないかと言われたのがキッカケです。
JSON型が使えるのは知っていましたが、実際に業務で使えるものなのか、どういう時に使えばいいかなどを全然知らなかったので、ちょっと勉強してみました。
今回は、とりあえずJSON型とは、について調べました。
ちょっと長くなりそうだから実際に使うのは次の記事で。

JSON

  • 効率的にJSONドキュメントにアクセスできる。
    • String型のカラムにJSONフォーマットの文字列を入れるよりも効率的。
    • JSON formatになっているかvalidationされる
  • JSONカラムに格納されたJSONドキュメントは、ドキュメントの要素に高速な読み取りアクセス可能な内部フォーマットに変換される
  • 格納するのにLONG BLOBかLONG TEXTとほぼ同じスペースが必要
    • 格納できるサイズはmax_allowed_packet で指定されたサイズに制限される
  • NULL以外のデフォルト値を含めることはできない
  • create, operation, searchなどのJSON値の操作は、関数を利用できる

特徴

JSONカラムの値を読み出す時、ドキュメント内の前後の値を全て読み込まなくても、サブオブジェクトやネストされた値に、キーまたは配列インデックスで直接アクセスできるように構造化されているため、テキスト表現からパースする必要がなく効率よく取り出せる。

indexについて

  • 他のバイナリ型同様にindexは貼れない。
    • JSONカラムの値からgenerated columnsを作って、そこにindexを貼ることで対応できる。

使い道

JSON型はNoSQLっぽく使えそうだから乱用しそうになりますが、generated columnsにしかindexが貼れないので適当なJSONを入れまくって雑に使うようなことは避けたほうが良さそう。多分そういう時は、ドキュメント指向DBとかが良いと思う。(ドキュメント指向DBが雑に使っていいという訳ではないです。)

今回は、今後カラムが増える可能性がある(増えない可能性もある)が、その度にalter tableをしたくないからテーブル設計をどうするか、というのが主題でした。
最初は、色々話をしてクラステーブル継承を使って解決しようとしていましたが、属性が増えて結合するテーブルの数が増えると辛くなるよ、と言われて半構造化データとしてJSON型を使うことにしました。

その他JSON型を選定した理由として、

  • サーバーサイドがnode.jsでJSONとの相性が良い
  • sequlize(ORM)がJSON型に対応している
  • 格納するデータが不揃い
  • generated columnsに貼ったindex以外で検索することがない

などです。
JSON型を使ったことがなかったので、RDBJSONという正規化されてないデータをそのままぶち込むようなことをしてもいいのかという、疑問と不安でよく調べもせずに選択肢から外してたので今回はとても勉強になりました。

次回は、実際に使う感じの記事を書こうと思います。

iOSDC2019に参加しました!

 こんにちは。

ちょっと日が経ってしまいましたが、9/5 ~ 9/7 にあったiOSDCに初めて行ってきたのでその記録です。

 f:id:ishikawa_pro:20190911225910j:plain

iOSDCとは?

詳しくはこちらを参照してください。

iosdc.jp

主にiOSに関する技術者向けのカンファレンスです。

 

なぜ参加したか

iOSアプリ開発を大学2年生の終わり頃からしていて、大学卒業するまではiOSアプリ開発を軸に勉強していました。
学生時代にもiOSDCの存在は知っていましたが、地方に住んでいたのとお金が本当になかったので、iOSDCなどの技術カンファレンスは知ってはいるものの自力では行くことのできない存在でした。 それが就職を機に上京したので、ついに念願のiOSDCに参加することができたわけです。

 

チケット

奮発してサポーターチケットにしました。
高いと感じる人もいるかと思いますが、iOSDCパーカーが貰えたり、聴きたいセッションの席を予約できたりと、かなり特典が充実しているのでサポーターになる価値は十分あります。 f:id:ishikawa_pro:20190912001038j:plain

ランチ

参加者向けにお弁当まで用意されていました。 ランチは、交流スペースのような場所で食べたりランチセッションというランチを食べながら見れるセッションなども用意されていました。

f:id:ishikawa_pro:20190911230058j:plain
1日目の弁当
3日目のランチセッションがBitriseさんの英語セッションで、楽しみだったので弁当撮り忘れました笑
(英語は苦手なのでほぼ聞き取れませんでした)

面白かった・勉強になったセッション

ライブラリのインポートとリンクの仕組み完全解説

fortee.jp

インポートやリンクは、使ってるだけで全然理解してなかったので、その勉強の足がかりになるとてもいいセッションでした。

FatViewControllerを安全に書き換える方法が見つからなかったので、どういう痛みを許容するか考えた

fortee.jp
FatViewControllerを解消することの難しさ・辛さ的な話。

Swiftクリーンコードアドベンチャー ~日々の苦悩を乗り越え、確かな選択をするために~

fortee.jp
コードを抽象化して行く際によく躓くけどイマイチどこが分からないのかがピンと来ていなかったが、このセッションでProtocolのStaticな面とDynamicな面の特徴がよく理解できてないのと、PATについて知ったのでめちゃくちゃ勉強になった。

モバイル決済アプリの作り方

fortee.jp
ここ数年はやってる、*Payに関する話。
法律に関する部分が多かったが勉強になった。

Amazon Pinpoint でユーザーに合わせたプッシュ通知を実現する

fortee.jp

以前、ユーザーに合わせて個別の内容をPush通知で送りたいと言われて、それは難しいですとお断りをしたことがあったので、Amazon Pinpoint試してみようとと思いました。

TBD

fortee.jp
rebuild.fm レギュラーのhakさんとiOSDC実行委員長のtomzohさんとの対談。
rebuild.fmファンとしては、hakさんの話が生で聞けて最高に嬉しかった。

茶会

2日目の終わりに、お酒を飲まないことがマジョリティな懇親会がありました。(見た感じ結構な人がお酒飲んでた気もした笑)
僕は、初対面のiOSエンジニア3人とずっと話をしてました。
ボードゲームがあったり、初心者、女性など色々な属性で集まれるようにもなっていてよかった。

懇親会

次の日にISUCON9予選があり、最高のコンディションで挑みたかったので、残念ながら今年は懇親会不参加でかえりました。
ISUCONの振り返りブログはこちら!
ishikawa-pro.hatenablog.com

まとめ

とにかく最高の3日間でした。
見たかったが時間が被って見れなかった(寝坊した)セッションや、見返したいセッションも沢山あるので動画が上がったら、また見ていこうと思います。
参加するという夢は叶ったので、次はLTでもいいから登壇するという目標で、来年まで頑張ろうと思います。

ISUCON9予選に参加しました!

お久しぶりです。
ISUCON9予選に参加したので、参加するまでのことや当日やったことを残します。

ISUCONとは

こちらを参照してください。

isucon.net

参加のきっかけ

5月頃に僕ともう一人の同期でISUCONに出たいね、という話になって他の同期も誘って、参加することになりました。

メンバー

今回は会社の新卒同期3人でチームを組んで出場しました。
(僕ら以外にも、新卒チームがもう1チーム参加しました。)

当日までに勉強したこと

会社の同期で、毎週 月・火・水の3日間は1時間早く出社して、過去問を解くというチャンレンジを6月頃からしていました。
また、社内でISUCON合宿という1日中ISUCONの過去問をやる合宿までやらせて頂きました。
会社と企画してくれた同期に感謝です 🙏

www.cam-inc.co.jp

当日朝の様子

当日やったこと

言語は、僕がGoを勉強してみたかったので6月下旬頃からGoの勉強をしつつ過去問を解いていて、当日もGoでやりきりました。(普段はNode.js書いてます)

役割分担は、
ko1103: リーダー & 実装
cotsupa: DB周り
id:ishikawa-pro: リポジトリ管理・ログ収集・実装

という感じでした。

時間に沿ってやったこと書いていきます。

10:00 ~ 11:00

リーダーがインスタンス立てたり、僕がGitHubのprivateリポジトリでコードを管理できるようにしたりしてました。

11:00 ~ 11:45

slow query出すようにしたり、alpaccess logを分析できるようにNginxの設定を変えたりしてました。
僕は、ちょっとだけNginxの設定に時間がかかってしまいましたが、他のチームメンバーも含めこの辺の作業は練習しただけあって、比較的すんなりいきました。

11:45 ~ 12:30

slow queyとかalpの吐いたlogを見つつどの辺が自分たちで修正できそうか探し始めました。
ko1103がUserテーブルからデータをとる部分で、カラム指定してちょっとだけスコア上げてくれました。
現時点で 2010イスコインでした
github.com

12:30 ~ 13:00

お昼休憩 f:id:ishikawa_pro:20190908222518j:plain 美味しかったです 😋

13:00 ~ 16:00

インスタンス3台使えたので、それぞれ別のインスタンスで作業して、よかったやつを採用しようという方針になりました。

僕は、itemsに紐付くcategoryを取ってくる所がN+1になっているのに気が付いたので、そこを解消することにしました。 具体的には、 getNewItemsgetNewCategoryItems の2つを直しました。

github.com

github.com

かなり時間をかけてしまったので、Goでの実装力の無さを痛感しました。
でも、categoryを取り出すクエリの呼び出し数をかなり減らせたのでよかったです。
before

Count: 100422  Time=0.00s (15s)  Lock=0.00s (2s)  Rows=1.0 (100422), isucari[isucari]@localhost
  SELECT * FROM `categories` WHERE `id` = N

after

Count: 25332  Time=0.00s (3s)  Lock=0.00s (0s)  Rows=1.0 (25332), isucari[isucari]@localhost
  SELECT * FROM `categories` WHERE `id` = N

(そもそもアプリのインメモリに載せればよかったのは内緒 🤫)
この修正で、2,310 イスコイン。
他メンバーはDB周りで色々試みていたようです。

16:00 ~ 18:00

UserSimpleの取得にも N+1があったので、categoryと同様の手法で解消しようと試んでいましたが力及ばずタイムアウトでした。
他メンバーは引き続きDB周りのチューニングを試んでいましたが ko1103 が原因不明の 2,410 イスコインを一回だけだして、結局それが最高記録で終了となりました。

感想

初のISUCON予選に参加しましたが、実力の無さを痛感しました。
特にGoはまだまだ実力不足で、やりたいことをすぐに実装できなかったのは痛かったです。
ただ、当日までに練習したことは確実に活かすことができたと思うので、コツコツ練習してきてよかったです。
会社の研修でやったISUCONの過去問では、全くスコアが上がらなかったですが、今回は自分の修正でちょっとだけスコアを上げることができたので、成長を実感することができました!

一緒に参加してくれた同期やISUCON運営の方々、ありがとうございました!!!
来年もあればリベンジします 💪

mac版Microsoft Edgeがいい感じ

こんにちは。
東京暑すぎですね。
まだ6月ですが、僕はすでに半袖・短パンで出社してます。

何もやる気が出なかったのでとりあえずブログ更新してみるかという感じで書いてます。

特に技術ネタは無いので、会社の普段使いのブラウザをMicrosoft Edgeに変えてみた話です。(フロントエンドエンジニアではないので、技術的な話はほぼないです)

Microsoft Edgeとは

Microsoftが出してるブラウザです。Win10のデフォルトブラウザですね。
Edgeは、EdgeHTMLという独自のレンダリングエンジンを使ったブラウザでしたが、去年の終わり頃に独自のレンダリングエンジンをやめて、chromiumベースのブラウザに移行するという発表がありました。 japanese.engadget.com
Edgeはwindowsにbuilt-inされたブラウザで、updateはwindows updateなどのタイミングでしかできないため、他のブラウザのように、自分のタイミングで更新できないのが辛かったんじゃないか、みたいな噂を聞いたような気がします。
もちろん、他にも色々理由はあると思いますが、、、、

発表から数ヶ月で公開へ

年末ごろにchromiumベースへの移行を発表して、4月にpreview版公開になりました。 japanese.engadget.com
発表から4ヶ月くらいでpreview版公開はすごいスピードですね笑
尊敬します。

使ってみた

ちょっと忙しかったので、実際に使っていませんでしたが、5月の下旬頃から触ってみるかなという気になって、2週間くらい使ってみました。
触ってみた感想は、Edgeのデザインだけど中身はChromeって感じです。 当たり前だろって感じですが笑
しばらく、google chromeとedgeを両方立ち上げて使ってましたが、今どっちのブラウザを表示してるのか、ぱっと見では分からないくらいです。

特徴とか独自機能とか違い

2週間使ってみて感じた、chromeとの違いをあげてみます。

  • 標準の検索エンジンがbingになってる
    設定画面から色々変更できます。(僕はgoogleにしてます笑)
  • 初期の起動画面が完全にEdge
    (これも色々変更できます。)
    f:id:ishikawa_pro:20190609152904p:plain
    macOS版edgeの画面
  • Microsoft Accountでログインする。
    chromegoogleアカウントにsign inして、設定を同期するのと同じ機能があるようです。
    しかし、まだ開発中のようで、ブックマークしか同期できないみたいです。拡張機能などの同期はtoggle switchはありますがdisableになっておりチェックできません。今後に期待ですね。
    f:id:ishikawa_pro:20190609153950p:plain
    edgeのアカウント設定画面
  • Microsoft Defender Browse Protectionが標準搭載
    Windows版Edgeには昔からある、フィッシング・マルウェア対策機能がmac版にも乗っています。chrome extensionが公開されているので、それを使ってるだけだとは思います。
  • Edge用のextensionアプリがある
    Microsoft Edge Insider Addons というchrome web storeのような所からedge用のextensionが追加できます。
    f:id:ishikawa_pro:20190609161835p:plain
    Microsoft Edge Insider Addonsの画面
  • chrome extensionが使える
    chromium ベースなので、普通にgoogle chromeの extensionも使えます。extensionsの設定ページで Allow extensions from other storesを有効にします。 f:id:ishikawa_pro:20190609160052p:plain あとはchrome web storeなりに行って好きなextensionをインストールすれば普通に動きます。今の所不具合なくchrome extensionも使えてます。
  • 言語設定がdefaultで英語になってる
    細かい話ですが、言語設定が英語になっていて複数言語用意されているサイトだと、英語版がリクエストされて表示されます。
    これも日本語へ変更可能です。

ざっとそんなかんじですかね。多分他にも色々あります。
個人的には、chrome extensionが普通に使えるのが、chromeからすんなりスイッチできて良いです。
ただ、まだ若干バグはあって、mediumの記事でコードと画像が表示されないバグとかはありました。(現在は修正済み)
chromeでは表示できてたので、レンダリングエンジンにも手は加えられてるんだろうなと思います。
現在は、まだbeta版は公開されておらず、毎週updateされるDev版と、毎日更新されるCanary版があります。 僕は、Canary版使ってますが、致命的なバグには遭遇することなく便利に使ってます。

Google1強に嫌気がさしてる皆さんはぜひご利用してみてください。
www.microsoftedgeinsider.com

Googleのiosched-ios リポジトリが勉強になる

お久しぶりです。
3月に大学を卒業して、今は渋谷で新卒としてWebエンジニアしてます。
まだ研修しかしてないのでそれほど大変でもないですが、中々家でコードを書く体力がなくてSwift書けてないです。

何となくブログ書くかなという気になったけど、ネタがないので同期が教えてくれたリポジトリを貼っときます。

iosched-ios というGoogle.ioのkeynoteのタイムテーブルなどが確認できるiOSアプリのリポジトリで、GoogleGithubアカウントが公開してます。
github.com

デザインなど

アプリのデザインは マテリアルデザイン(material-components-ios)で作られていました。
StoryBoardは一切使っていなかったです。

サーバーサイド?

バックエンドはFirebase(主にfirestore)使っていました。
Google.io開催前は、Homeタブのupcomming eventsという部分で開催までのカウントダウンをしていたのですが、firestoreのドキュメント内で開催までの残り時間を減少させて、それをrealtime updateを使って変更を受け取ってリアルタイムにカウントダウンさせていて、なるほどなーってなりました。(firebaseのプロジェクト見れないのと、結構ざっくりしか見てないので間違ってるかも)

アーキテクチャ

アーキテクチャは、MVVMっぽいですがRxSwiftなどは使わずピュアなSwiftで作られていました。 firestoreのrealtime updateとかを使ってmodelの変更を伝播してるような感じの所もありました。
UICollectionViewのDataSourceをUICollectionViewDataSource protcolに準拠した、NSObjectのクラスで管理しているのは勉強になりました。

その他

ライブラリは全部cocoapodsで管理されてました。
firebaseのsdkがcocoapodsにしか対応してないからだろうけど、それ以外のcarthageに対応してるライブラリもcocoapodsで管理してたのは何でなんだろう?
単純に1つのツールで管理した方が楽だからかな?
リポジトリ自体は9コミットしかなく、最初の1コミットでコード自体は完成したもの上げてるだけだった。(多分1人で開発した?)

感想

僕はむやみにRxSwift入れたく無い派で、割と似たような実装方法してる所もあったり、そういうやり方もあるのかと感動する所もあった。
まだ、コードを読み切れてないので、時間見つけて解読進めて自分の知識にしていきます!

今日はここまでにします。
本業の方も頑張ります。

1月振り返り(2019)

こんにちは。
1ヶ月ごとに振り返ってみようという試みです。
これくらいなら続けられるんじゃないかな。
今年は1年の振り返りエントリーを書いてみたいので、振り返り用もかねて書いていきたいと思います。

プライベート

やったこと

年末・年始は島根の実家にいました。(1月6日くらいまで)
年末年始は友達と酒飲みながらスマブラしてた記憶しかない。
頓原探検隊冬季フェフは盛り上がってよかった。別の記事でまとめたので見てください。
ishikawa-pro.hatenablog.com

仕事

去年の10月頃からクラウドワークス経由でiOSアプリ開発の仕事を受け始めました。
11月頃から1社と直で開発依頼を頂いているのと、クラウドワークス経由で時々開発の依頼を頂いている会社が1社あります。
直で依頼を受けている会社では、新規のアプリ開発に携わっているのですが、自分の設計・実装が曖昧だったツケ回ってきた感じです。そのせいで今月の後半はほとんどリファクタリングや設計やり直しをする感じになってしまいました。。(全部自分で書いてるから自分が悪いけど)

note.mu
たまたまTwitterで流れてきたNoteを読んで、まさに自分が負債を作ってしまったなと後悔しながら負債を返済しています。
学校卒業するまで、ほとんど時間がないけど設計はもっと学ぶべきことがいっぱいあるなと感じました。

読んだ本・読んでいる本

iOSアプリ設計パターン入門

PEAKSのクラウドファウンディングでできた本です。 まだ第1部までしか読めてないですが、既に買ったかいがあったなと思える内容です。読み終えたらブログ書きたい。
peaks.cc

グラーフ・ツェッペリン 夏の飛行(読みかけ)

SF小説。本読みたいなと思ってPrime Readingを探してたら見つけた。まだ最初の方しか読んでないけど、読みやすいから良い感じ。

「気がつきすぎて疲れる」が驚くほどなくなる  「繊細さん」の本 (読みかけ)

ほぼ読んだけど、読みかけ。結構共感できることが多かった。
対処法みたいな所まで書いてあったけど、自然と身につけてきたことがほとんどだったから、あんまり新しい発見みたいなモノはなかった。

最後の医者は桜を見上げて君を想う(読みかけ・読まないかも)

最後の医者は桜を見上げて君を想う (TO文庫)

最後の医者は桜を見上げて君を想う (TO文庫)

すごい考えさせられる本だった。最初の1エピソードで完全に心が折れたので多分もう読まない。内容はすごくよかったと思う。

全体

今月はあまりメリハリ付けて生活できなかった。(特に仕事)
来月はほとんど学校最後みたいなものだから忙しいけど、仕事と両立できるようにメリハリ付けて生活したい。

頓原探検隊冬季フェフに参加しました!

明けましておめでとうございます。
今年は技術系の記事以外でも良いからとりあえずブログを継続させてみたいなと思ってます。
今年最初の記事は、頓原探検隊冬季フェフというのがあり、運営のお手伝いと参加してきたのでその記録です。

頓原探検隊冬季フェフとは

僕の地元、飯石郡飯南町頓原では若者達でイベントを企画・運営するような会が去年の夏手前くらいからありました。今回の頓原探検隊冬季フェフはその企画の1つで、地元の特徴の1つである雪を活かして何かやろうという感じで企画されました。
(詳細な発足理由や主旨などは覚えてないですが、そんな感じだと思います)
今回のイベント以外では頓原探検隊フェフという、運営の皆んなで考えた変わった競技を参加者の皆んなで楽しむイベントを8月に企画しました。
言葉では伝わりずらいと思うので、告知動画とメイキング動画があるので、そちらをご覧ください。

www.youtube.com

www.youtube.com

僕は現在、岡山に住んでいますが、地元ということと友達(村長 (@seita0126) | Twitter)が実行委員長ということもあって、企画などから参加することになりました。

何したの?

今回のイベントでは、午前中に雪合戦をして、お昼に豚汁を食べ、午後から雪像づくりをする予定でした。
しかし今年は全然雪が振ってくれず、当初の企画は出来ないと判断し、雪合戦と雪像づくりは中止して「いたっボール」という競技をやることになりました。
いたっボールとは、兵庫県伊丹市発祥の室内雪合戦のような競技で、スポンジボールを投げ合いながら、敵陣のフラッグを先に取ったほうが勝ちというようなゲームです。
www.city.itami.lg.jp
今回はこの「いたっボール」のルールをちょっとアレンジして参加者の皆さんと楽しく遊ぶことになりました。

※前々日に実行委員で雪乞いの神事を行ったところ、当日本当に大雪が降りましたがイベントの変更を発表していたので、残念ながら当初の企画をすることは出来ませんでした。 とんばら探険隊冬季フェフCM 雪乞い神事編 - YouTube

当日の様子

当日は地元の高校生が結構来てくださり、運営込みで大体20人後半くらいは人が集まりました。初めていたっボールをする方も多かったですが、みなさん一生懸命に取り組んでくださり、かなり盛り上がったイベントとなりました。

f:id:ishikawa_pro:20190127220753j:plainf:id:ishikawa_pro:20190127220942j:plain
当日の様子
途中、地元のゆるキャラ「いいにゃん」も駆けつけてくれました。

f:id:ishikawa_pro:20190127221041j:plainf:id:ishikawa_pro:20190127221053j:plain

まとめ

皆んな楽しんでいたっボールをやってくれていて、場も凄く盛り上がり楽しいイベントになりました!僕は当日の準備だけでしたが、運営も皆んなで楽しくやれたので本当に最高な1日でした。
今後も楽しいイベントを実行委員長を中心に企画していってくれると思うので、僕も可能な限り協力していきたいです。
イベント当日までに実行委員長がいくつか告知動画(?)を作ってあげているので是非ご覧ください。今後も色々発信してくれると思うのでチャンネル登録もしてあげてください。 www.youtube.com

今日はここまでです。
今後もブログ継続させたい。