バグだらけ会津若松スマートフォン用の表示で見るバグだらけ会津若松2019-12-20抵抗の値をslackで確認したい!!!どうもこんにちは、最近いろいろバタバタしているはとバスです。あ当日の朝に担当だったことを知り、ほぼ半日で作った適当なslackのコマンドを紹介します。カラーコードを確認したい最近はめっきり機会が減ってしまったんですが、電子工作が好きです。大学一年のときから始めて、いろいろな物を作ってきました。hatobus.hatenablog.jphatobus.hatenablog.jp電子部品を使うときのあるあるなんですけど、抵抗の値って、難しくないですか?????12の色と値を暗記しなければいけないし、パッと見ただけでは分からないので調べてから使うという人もいると思います。そんな時に、slack上で簡単に確認できたら良さそうじゃないですか?作りましたslackのslashコマンドを作りました。[抵抗の値]と書くことで、カラーコードの画像が返ってきます。functions言語Goです。functionsをサーバーにして、リクエストに応じてGoで画像を生成、そのままslackに画像を投稿しています。ポイントgithub.comカラーコードを生成する部分です。抵抗の値を数字だけで表現する場合は入力された文字列をint64にキャストすればいいだけですが、抵抗の値を指定するときには少し特殊なフォーマットの場合があります。4k7などに表現するやつです。このようなフォーマットで表現する時に、以下のような表現の仕方があります。1k4k747k470kまた、k以外にもMの接頭辞のときもあります。このように表現されたときの抵抗値も対応しています。strconv.Atoi()などを使えば、stringをintにキャストできます。これで当たってみて、接頭辞が付いているときにはエラーが返ってくるため、Splitするセクションに入ります。Mなど)が付いているときには、入力された文字をSplitします。strings.Splitという関数があります。golang.orgこれは文字列を指定文字で切り取ることができるという関数です。Splitした値はこのようになります。47kのように、最後に切り取る文字が来ている場合には最後に空白が入ります。これで上手くSplitできればできたときの文字で乗数も割り出せますね。5あとはカラーコードを割り出すまでもうちょっとです。抵抗は上2桁の数字をそれぞれの色に対応させ、3本目の線を乗数の色にします。赤のように求まります。場合は以下のようになります。barは7になる、乗数に変化はない。barは7になる、乗数は1増やす必要がある。barは7になる、乗数は2増やす必要がある。contain[0]の長さでif-elseしています。magの3つの数値が求められ、これを元に色を出しています。色を求めて、いい感じに画像を生成しています。functionsの仕様として、ユーザーが自由にファイルを書き込める場所に制限があります。ディレクトリだけです。このディレクトリは、関数インスタンスの一時ファイルの保存先として使用できます。/tmp以下に置かなければいけないことがわかります。大急ぎで書いたのでクソ適当になりましたが、今回のアドベントカレンダーネタは以上になります。来年からはもっとちゃんと書きたい。書くべき内容があったと思いますが、内容がバカでかい騒動にまで発展してしまったので書けませんでした。早いものでもう12月ですね今年もアドベントカレンダーの時期ですね。2日目の記事になります。くんの記事になります。小学校から高校まではテニス部でそれなりに汗を流していたので、大学入学時には70kgを切っていましたが、大学生活によってブクブク太っていき去年一番太っていた時期は96kgありました。単純に30kg太ったことになります。今は85kgあたりをウロウロしています。切実な目標として、健康的な生活をしたいです。いう問題に直面しますが、WHO憲章では、その前文の中で「健康」について、次のように定義しています。infirmity.公式の訳としては健康とは、病気でないとか、弱っていないということではなく、肉体的にも、精神的にも、そして社会的にも、すべてが満たされた状態にあることをいいます。野菜を食べる野菜を食べるということはビタミンやミネラルを補給でき体のバランスを整えることに繋がります。健康的な生活をするためには不可欠です。あと「俺は野菜を意識して食べているぞ、そんじゃそこらの人よりも偉いはず、俺は偉い偉い偉い」と他人にマウントを取れます。精神的な健康も保てるはず。二郎の上に乗っているもやしを野菜と言っている人もいますが、あれは野菜ではなく油まみれのなにかです。健康的な生活をしたいのであれば二郎を月イチくらいに抑えたほうが絶対にいいです。効率的に野菜を食べようおすすめの食べ方は鍋。一人鍋用スープの素があれば片手鍋でグツグツ野菜を煮込めば放っておくだけで美味しい何かが出来上がり、野菜を摂取できます。ホーム&キッチンこの商品を含むブログを見る食材を保存する野菜は水分が多く、すぐに傷んでしまいます。自炊をしないという人に生野菜をおすすめすることは難しいと思うんですが、冷凍することでこの問題を解決できます。週の初めや野菜が安い時にキャベツや玉ねぎ、えのきやしめじを買っていい感じの大きさに無心で刻み、100均に売っている安いジップロックみたいなものに詰め込んでそのまま冷凍庫にぶち込んでください。ヘルスケア&ケア用品この商品を含むブログを見るお肉も一緒に買ってきて、ラップ等で小分けにし一緒に冷凍することもでき、タンパク質も楽に摂れます。鍋に使う野菜の王道どんな鍋にも合う味がしみて美味しい、1/4くらいでジップロック1袋くらいになる玉ねぎ味噌汁やラーメンを作るときとかにも使える常温でも保存が効くので買い置きしてもいいニンジン短冊切りにすると鍋で食べやすいラーメンを作る時に玉ねぎ一緒に入れるだけでもかさ増しになるネギ斜めの輪切りにすれば鍋や味噌汁の実として細切りにすれば薬味としてそのまま乗せられるゆっくり煮ればトロトロになっておいしいえのき意味不明なくらい安いときが多いどんな料理にも合うのでハズレが少ないしめじデフォルトのきのこどこのスーパーにもあって安く手に入るお肉はウィンナーをおすすめします。冷蔵室に置いておいてもそれなりに日持ちがするし、なんなら常温でボリボリ行けるので何か口に入れないととなった時に食った気になれます。三等分にして冷凍しても鍋にぶちこめばおいしい出汁が出てくれますし、包丁で切るのもめんどくさいときは冷蔵庫から出して手でいい感じの大きさにちぎるだけでもいいです。絶大な信頼を置いているプチッと鍋シリーズちょっとの水に鍋の素をいれて好きな野菜をぶち込んで10分くらい煮込めば野菜の入った美味しい何かが出来上がります。一緒に生姜を入れてあげれば手足の先の冷えの対策になります(なってほしい)鍋の具材を食べ終わった後に冷凍のうどんや餃子を入れればシメも美味しく楽しめます。ホーム&キッチンこの商品を含むブログを見るレンジ対応の一人鍋容器でできます。使い方としては容器に水と鍋の素を入れる好きな野菜と肉を入れる(肉は最初に入れないと焦げる可能性がある)500Wのレンジで10分くらいチンするおいしいシメにうどんやご飯を入れたいときも物を入れて5分チンすればおいしいうどんやおじやができます。洗い物も箸と容器だけで済むので楽ちんです。鍋はめちゃくちゃ楽でオススメです。具材をぶち込んで煮るだけで美味しい鍋が出来上がり、野菜も摂れるしいいことずくめです。ちなみに、友達が家に来たときとかにも楽で、一人鍋の素を人数分に増やせば鍋の量を調整できます。鍋のオートスケーリング(申し訳程度の技術成分)が可能です。おすすめの鍋の素おすすめの鍋の素をいくつか貼っておきます。スーパーならこのなかで1つは必ずあるはず。ちなみに、ドラッグストアのワゴンセールで意味不明なくらい安いときもあるのでそういうときは狙い目です。食品&飲料この商品を含むブログを見る最高の鍋の素、生姜の香りと鶏のうまみが感じられる美味しいやつです。シメのうどんも最高にうまいのでオススメ、鍋以外の料理として茹でたそうめんを入れてにゅうめんにしても美味しいですよ。会津だと簡単に手に入る。食品&飲料この商品を含むブログを見る最近ハマっているおいしいやつです、キャベツを煮込んであげると甘くておいしい。シメには業務スーパーで買った安い乾麺を入れてあげるとシメの味噌ラーメンになります。食というのは生きる上での基本であって、栄養の偏りや不規則な食事などによる肥満や、それらが原因と考えられる生活習慣病などになっては元も子もありません。長期的なことを考えればエンジニアも結局は体が資本であり、自身の健康は自分が作っていかなければなりません。日頃の不摂生がたたったせいでエンジニアとして生きていけなくなるの、嫌じゃないですか?なんか普段のツイートとは真逆のすごく意識の高い感じがして自分が嫌になったのでここらへんで失礼いたします。00:00野菜を食べる技術Tweet広告を非表示にするもっと読むコメントを書く2019-05-08平成最後はgRPCなサーバーを書いてハッカソンしていた話こういうのってあとから書こうとすると時間が経ちすぎてなかなかポストできなくなりますよね。平成最後のハッカソンに出場してきました。www.cyberagent.co.jp4月の頭くらいからtwitter上で人事の方々がこのハッカソンについて話をしていたので、「ちょっと出てみるかぁ」みたいなノリで考えてました。これ、マヤミトくんと出ない?みたいなことを言ってきました。推していましたし、なによりもマヤミトくんと一緒に出たいなと僕も少し考えていたのでこの3人で出ることにしました。id:yt8492この3人で蠱毒みたいなチーム作って参加登録しました。数日後にはみんな参加できることが決定し、やっていきを高めてました。「平成生まれの私たちが、平成を楽しく振り返ることができるサービス/モノ」というものでした。あくんとマヤミトくんと何を作るかを話し合うことにしました。チーム名とスクリーンネームが被ってちょっとテンションの上がるのあ話した時に出たものはこちら小学校時代に書いた(こともある)プロフ帳を作る黒歴史を共有できるものを作るspotifyでおすすめの曲をサジェスト主に出たのはこの3つでした。選ばれたのは黒歴史を共有するものを作るというプラン。id:yt8492このチームの人員から考えても、そんなおしゃれなものを作るよりはネタに振り切ったほうがいいだろう、という考えでボツにしました。僕達がそういうプロダクト作るのは似合わないってことですねみんなで話し合ったあとのホワイトボード黒歴史を共有できるものということで深堀りしていき、出てきたのがこのホワイトボードのようなことです。ブロックチェーン黒歴史というものは、オタクならば結構な人たちが作ったことであろう歴史です。霊感があるキャラを装って心霊写真を捏造こんな感じで「あの頃はこれがかっこいいと思った」「他人とは違う自分を演じたかった」という考えで突っ走ってしまう行為です(全部僕の体験談です)黒歴史というものはあくまで「歴史」、勝手に改変されたり、なかったことにされるということはもってのほかです。勝手にネット上で作った黒歴史を消されてはいけません。これを恒久的に保存してあげる必要があります。ここでブロックチェーンです!!ブロックチェーンは情報の改ざんに強いデータベースです。この黒歴史の情報をブロックにしてしまえば、半永久的に黒歴史は保存され、歴史の改ざんも防ぐことができるようになります。repositoryです。あくんとマヤミトくんがいろいろと頑張ってくれたので実装は早く終わりました。今までやってきたようなRESTfulなJSONサーバーより断然書きやすかったです。しなくて済むというのがめちゃくちゃ楽でした。goではstructで扱えるので変数に型があり、どういうデータなのかがすぐ分かりますし、何よりもシリアライズされたデータが行き来するので速さが出ます。そんなわけで大体のサーバーはハッカソンの3日前には大方の実装が終わり、マヤミトくんに頑張ってもらうだけになってました。合意形成アルゴリズムブロックチェーンの中心とも言える合意形成のアルゴリズムはのあくんが独自に実装してくれました。作成されたハッシュの中にビットパターンとして存在していればブロック作成の権利を得る合意形成アルゴリズムは平成を使いました。二文字を使った時でした。これも前日にはのあくんがすべて実装していたのでさすがですね。ネイティブアプリ一人で全部実装したマヤミトくんの記事でしっかり書かれているはずです。yt8492.hatenablog.com学部2年生ながらここまでやってくれたマヤミトくんは煽り抜きで最強だと思います。これで彼女がいれば敵なしですね。ハッカソン当日ハッカソン当日には黒歴史ブロックチェーンがある程度出来た状態で参加できました。あとは繋ぎこみをするだけという状態です。いう時は大体苦労するんですよね、苦労しました。サーバーにバグが結構残っていた本当に申し訳がなかったです。許して、マヤミトくん、のあくん。直前まで小さなバグがちょっとずつ出ていてそれを潰す作業をしていました。前日まで散々イキっていたのにこのザマです。「スライドは2枚、1枚は実際に動いている動画を貼り、2枚目には説明を書く」というものになっていました。見た目にインパクトがあるものが有利になったのかなと思います。みたいな部分があったので技術力としてはそれなりにあったと思いますが、インパクトが足りませんでした。優勝者のチームが以前会ったことのあるはととさんだったことにも衝撃でした。2019作ったものが。「マリオのゲームで平成を振り返る」というコンセプトで、web上でマリオのステージが進むごとにゲームハードが進化していくという技術力がやばいやつでした。「Vueのちからってすげーーーーー!!!!」まさかの発想がかぶる「黒歴史という発想は被りそうだな〜〜〜〜」とマヤミトくんとのあくんと笑いながら話していましたが、見事に被りました。それも同じ大学のmtのチームでした。会津大学生は黒歴史が好きです思わず笑い合いました。ちなみに、他のチームとは黒歴史のネタがかぶらなかったです。さいごに懇親会で他の参加者の方とお話をしていたら「黒歴史ブロックチェーン、僕は投票しました!」という声を結構聞いて嬉しかったです。他の人からフィードバックを受けるというのは気持ちがいいです。言っていたのは見ててめちゃくちゃ面白かったです。二人のおかげでとっても面白いものが作れました。ありがとうございました。(linter)はじめに自己紹介こんにちは、飛ばすはとバスと申します。この度はアカツキさんで課金基盤のサーバサイドエンジニアとしてインターンをさせていただきました。いつも僕はGoとPythonで色々な物を作っていますが、インターンとして大きなプロダクトの中でGoを書くのはほぼ初めてのインターンになりました。インターンに参加したきっかけ僕は会津大学という、東京駅から行くと新幹線とローカル線で3時間ほどかかる山の中の大学で勉強をしています。会津大学は色々と珍しい大学で、公立では珍しいコンピュータ専門の単科大学です。会津大学では、たまに企業の方々を招いてLT会を開くことがあります。www.facebook.comアカツキさんを知ったのは学部2年のときのLT会でした。今回のインターンでメンターをしていただいたsachaosさんがLTをしていて、「面白そうな会社だなぁ」と感じたのが当時の印象です。Goを書き始めたのは大学三年の夏で、春休みになったしインターンでGo/サーバーの知識を深めたいと思っていたところでした。そのときにちょうどアカツキさんから「サーバーサイド(Go)のインターンに参加しませんか?」という声をかけていただけたので、参加させていただきました。LT会などで、どのような物を作っているか、どのような人たちがいるかというのがある程度わかった状態で参加できるので、安心して業務に携わることができました。インターンの内容バックグラウンドアカツキさんでは、様々なタイトルのゲームを配信しています。その中でも特に大きな役割を持っているのは「課金」の部分です。お金という大きなものを動かすために、安定性や信頼性が必要になります。各タイトルで課金の部分を実装してもいいのですが、タイトルごとに課金部分の実装に違いが出てしまうと、いざ障害が出た時などに解決に時間がかかる可能性があります。課金の機能をマイクロサービスとして切り出すことによってこれを解決しています。今まではアプリごとに作っていた課金周りの機能を基盤としてまとめることで障害の対応や、プラットフォームのストアの仕様のアップデートへの追従などの開発・運用をやりやすくしています。参加したプロジェクトマイクロサービス化した課金基盤の開発にジョインさせていただきました。今回の記事では課金基盤の開発についてお話をします。サービスの裏側このサービスでは、課金の情報をBigQueryに保存しています。タイトルが大きくなれば、必然的に課金も増え、BigQueryに入ってくる課金のデータも多くなります。BigQueryにデータをinsertする処理はレイテンシが高く、これにリソースを割いてはレスポンスが悪くなります。ここで登場するのがTaskQueueです。リクエストの外で非同期に実行できます。アプリがバックグラウンドで作業を実行する必要がある場合、タスクがタスクキューに追加されます。cloud.google.comつまり、処理にコストのかかるinsertをTaskQueueで非同期で処理をすることで、リクエスト内でinsertにかかる時間をなくすことができ、レスポンスの向上ができます。TaskQueueは処理が失敗すると自動でQueueの末尾にTaskを追加し、何回でも再実行されます。これによってデータが闇に葬り去られることもなく、安定してデータを保存することができます。僕がやったタスク初日のメンターさんとの1on1で、インターンの中で僕が何をするかを決めました。内容としては、「TaskQueue内のレイテンシとリトライ回数を計測する」というものでした。理由としては、時間やリトライ回数を計測することでどれくらい処理が重いかということを見たかったため。TaskQueueに入った時間と、TaskQueueできちんと処理された時間の差分で時間を計測することにしました。リトライ数の取得についてはGAEがタスクをpushする際にヘッダに情報を込めて送ってくるので、これを取得することで可能でした。ヘッダに込められている情報X-AppEngine-QueueNameキューの名前X-AppEngine-TaskNameタスクの名前X-AppEngine-TaskRetryCountこのタスクが再試行された回数。この試行回数には、インスタンス数不足が原因でタスクが異常終了した試行も含まれる。X-AppEngine-TaskExecutionCountこのタスクがこれまでに異常終了した回数。この回数には、インスタンス数不足が原因の失敗は含まれないX-AppEngine-TaskETAタスクの目標実行時間。Loggingで見られるようになったので、Terraformを書きました。TerraformはIaCの一つで、インスタンスなどをコードで管理しようというものです。これを使って、上で作ったログから数値を拾ってきてログの指標にしたり、値が閾値を超えたらアラートを作成できるようになります。個人の開発ではなかなか使うものではないですが、最近の流行りとして色々な企業で導入されていたり、色々なサービスがTerraformに対応をし始めたりと注目されていて、僕自身、Terraformに触れてみたいと感じていました。どちらとも、先日のデプロイで本番環境で走ることになり、とてもいい体験になりました。会津大学生は、夏休みや春休みなど、長期休みになると出稼ぎに東京へ来るのがよくあります。今回のインターン中に、出稼ぎに来ている同じ大学の人とご飯に行ったり、古くからの友達と飲んだりと楽しい生活を送ることができました。社員の方にお昼に誘っていただいたり、同じインターン生同士でご飯に行ったりと社内での交流も盛んで、働いていても毎日が楽しいインターンでした。最後に普通の大学生では作るor触れられないような大きなサービスの開発を経験して、とても勉強になりました。3週間という期間の中で多くのことを学ぶことができ、それでいて楽しい毎日を過ごせたような気がします。インターン期間中にお世話になったメンターのsachaosさん、インターンを調整してくださった人事の方々、同じチームの皆さんなど、多くの方に感謝の気持ちを込め、ここで今回の記事を閉めようと思います。本当にありがとうございました。~アカツキさん編~Tweet広告を非表示にするもっと読むコメントを書く2018-12-31年末の振り返りどうもみなさまこんばんは、はとバスです。今私は川崎にある友人宅でRAIZINと無人島生活をローテーションしながら、紅白で椎名林檎とユーミンを見ていたら堀口がベラトールの首を取っていたのを見逃してしまい身悶えしています。なんかみんな年末の振り返りをしているので、かるーく振り返ります。春と夏の二回行きました。春はネオス株式会社さんにお邪魔させて頂き、機械学習系のインターンに参加。夏は株式会社リクルートさんにお邪魔させていただきました、こちらはGolangによるサーバーサイドのインターンに参加しました。hatobus.hatenablog.jp最近年収が一つの単位になった方に「安定の飯インターン」と言われましたが、それ以外にもGolangの大量の知見を得られ、今に至っています。技術力の低い私をインターンに受け入れていただいた関係者の方々には厚くお礼を申し上げます。夏に作った農業とITを繋げるシステム、「SmartAgri」というシステムがあります。ビニールハウスや農場にESP32で作成したデバイスを設置、温度や湿度をサーバーに送り、AmazonのAlexaを使い情報を取得できるようなシステムです。UKEMOCHIの3つのOSSによってこのシステムは動いています。SmartAgriのシステム構成図サーバーとスキルは全てGolangで作成、これも夏インターンで学んだことの復習も兼ねて作成したものでした。IT技術認定というとても栄誉のある2つの賞をいただける運びとなりました。NICT-情報通信研究機構SmartAgri一年生の時からずっとtwitterなどに投稿してきた謎の電子工作の花が開いた瞬間かなと思います。自分の作ったシステムを実際に農家の方に使って頂き「今までのスマホアプリやデバイスにはない利便性」「無限の可能性を感じる」などのお言葉を頂き、とても嬉しかったですし、自分の持てる力をもってして、農家の方々の問題を解決することができるということを知れ、とても有意義なものとなりました。細かく知りたい場合は公式サイトがありますのでこちらをどうぞ。SmartAgri色々なものを考えるのが増えたいよいよ大学三年生にもなり、必然的に考え事や思うことが多くなりました。後輩や自分の進退について考える1年になったかなと思います。自分の進退としては、学部で就職することを決めました。相まって就職という形を取らせていただきました。してももっと勉強したいという気持ちがあるならば、そういうサポートをしていただけるような企業に入り、大学院のほうで勉強しながら働くという道もありますし、自分で勉強ということもできます。幸いにも、就活の方でいくつかの内定を頂くことができたので最悪の結果は避けられるかなと言う感じです。個人的には大学で計算機科学を学ぶことができたので、この時代のIT企業のトップクラスのGoogleとかをダメ元で受けてみようかなと思います。あとGSoCに応募もしたいです。後輩のことについては、一年生と一緒に行ったハッカソンが大きいです。今年の夏の石巻ハッカソンで、今年はマヤミトくんと一ノ瀬くんとで参加しました。twitter.comtwitter.com一ノ瀬くんは去年も一緒に参戦した現役高校生です。一方で大学に入ったばかりのマヤミトくんは今回でハッカソン初参戦という感じでした。blog.github.comここでなんとマヤミトくんが所属していたチームが「ヤバイで賞」を受賞、彼自身初めてのハッカソンで、それも技術的に素晴らしいと認められての入賞です。お知り合いのフィッシュさんとの一緒のチームでの受賞でした。この後のマヤミトくんは外部のLTへの登壇や勉強会への参加というように、怒涛の勢いで成長をしています。彼のこのような成長や行動を見ていると「やっぱりハッカソンに連れてきてよかったな」と心の底から思うことができました。このような経験や体験により「後輩のためになるような行動をしよう」「後輩に憧れられるような先輩になろう」という気持ちが生まれました。来年入ってくる学生や、今いる学生の模範となるようなことや、後輩などのサポートをしていけたらなと思います。日々のアウトプットも忘れないこの3つを念頭に置いて行きていきたいと思います。最後に最近Thinkpadを買いました。お金が無いけど頑張って働きます。2018それでは、良いお年を。Calendarの15日目の記事になっています。ぼくくんadventar.org記事を書いてほしい問題このアドベントカレンダーを作ったのは僕なんですがみなさん記事書いてなさすぎじゃないですか!?!?!?!???この問題割と深刻で、半数近くの人がきちんと書いてないです。最初に飛ばしまくりまくりましたがどうもこんにちは、はとバスです。この画像見飽きましたよね、これ以上は使わないので勘弁してください。@flying_hato_bus)と申します。普段僕は意味のわからないツイートをする傍ら、朝と昼と夜にご飯を食べたり、赤べこの首を振らせたりしています。普段はGolangやPythonを使ってサーバーの作成や、研究として機械学習をやったりしています。赤べこの首を振らせる以外にも、ビニールハウス内の情報をセンサーで取得してAlexaスキルで取ってこれるようなもので新聞社から賞を頂いたりしています。供』の文字が人物の目と被っている現象を指す。提供目というのは、上にもあるように、色々なシチュエーションと出来事が重なり、目の部分に「提供」の文字が重なるということです。今回はこのように、目の部分にちょうど「提供」の文字が覆いかぶさるような画像を生成してくれるくんを作りました。使い方ですが、必要なのはGolangの実行環境とAzureのFaceAPIキー。FaceAPIの有効化について説明します。FaceAPIの有効化まず必要なのはAzureのアカウント登録、みなさんが持っているメールアドレスで登録できるので登録しちゃいましょう。ちなみに、今メールアドレスを登録すると20000円分のクレジットが付いてくるので、これを使って有料のプランも自分のおサイフを痛めないで使用することができます。次にFaceAPIの有効化、アカウント登録した後にAzureのポータルで有効化できます。クリックして、Faceを選びます。必要な情報を色々入れればデプロイが開始されます。デプロイが終わると、FaceAPIが使えるようになります。ここでサブスクリプションキーが生成されているので、FaceAPIのコンソールからKeyをクリックし、サブスクリプションキーを確認します。このキーが後々必要になります。getで取得してくる方を推奨しています。getではある程度決まった位置にレポジトリを持ってくるという性質からです。getをしてレポジトリを持ってきたときには、よっぽどで無い限りGOPATH/src/github.com/hatobus/Teikyoに僕のレポジトリがクローンされてきます。cloneでは、任意の場所にクローンされるので、画像までのパスなどを解決する必要になります。getを使えば一定の場所にインストールされるのでその心配はいらず、パスの設定などをせずにそのままで動かすことができます。.envファイルの設定クローンしてきたファイルの中には.env.sampleというファイルがあると思います。これはサブスクリプションキーなどを管理するためのファイルで、このファイルを.envというファイル名でコピーして、その中に先ほど取得したサブスクリプションキーを記載していきます。URL=KEY1=KEY2=ファイルの中身はこのようになっていますが、KEY1,2には、さきほど取得したサブスクリプションキーを入れます、URLはリソースを作成した場所で微妙に違いますが以下のようにすればいいでしょう。URL=https://[location].api.cognitive.microsoft.com/face/v1.0/KEY1=XXXXXXXXXXXXXXXXXXXXKEY2=YYYYYYYYYYYYYYYYYYYY実際に動かしてみる.envファイルを書き終えればとりあえずできるはずです。server.goで動かしてみましょう。何もなければサーバーがlocalhostの8080番ポートで動いてくれるはずです。r.Run(":8080")の部分を任意のポートに置き換えてください。-i:[ポート番号]で調べられます。動いたことを確認してから、リクエストを投げます。"multipart/form-data"このAPIでは複数の画像に対応するためにヘッダをmultipart/form-dataで処理をしています。(このためにちょっとしためんどくさいことになったりしたけど)また、jpeg画像でなければ弾かれてしまうので注意。処理がきちんとされればpicture/output/output[n].pngに画像が生成されています。プログラムの解説ここからは今回のプログラムを解説していきます。言っても本当に必要な部分のみになりますが。画像フォーマットを取得する画像のフォーマットはjpegのみを受け付けている、ファイルの終わりが.jpgになっているかなどで考えてもいいが、これだと.pngファイルの拡張子だけを.jpgに変更しただけのファイルなどの場合に死んだりする。image.DecodeConfig。image.DecodeConfigは写真のカラータイプ、フォーマットを返すメソッド。これを使えば画像がjpegなのか、またはそれ以外のフォーマットなのかがわかります。break}画像のフォーマットを取得する部分はここ。ちなみになぜ別のbufにコピーをしているかと言うと、image.DecodeConfigの内部実装にファイルを読み込む部分があるため。errorで落ちてしまう。そのために一度バッファにコピーしておくことでそれを回避しています。画像をデコードするFaceAPIに画像を投げるときには、画像をデコードしないといけない、そのためにデコードする処理を挟む。err}ファイルのシーク操作ですが、画像のデータをバッファにコピーした時に、先頭の位置からずれるようです。そのために、Seek関数を用いてファイルの先頭まで持ってきます。APIのレスポンスには、顔のパーツの座標を返してきます。目、口、鼻のみならず、眉などの情報を持っています。Golangは構造体を定義し、それを元にjsonをパースします。返ってくる情報は膨大な量があるのですが、本当に必要な情報だけに変換する処理を噛ませています。LM}見て分かると思うんですが、実は提供の字をかぶせているのは眉の情報を元にしています。これから説明していくんですが、文字だけではわかりづらいと思うので千鳥のノブで説明します。やりたいこととしてはこういうことにしたい。目の上にいい感じに乗せてあげたいです。APIは賢いんで、目に関してはこんな感じで情報を返してきます。目の全体を覆うように...どうしようかと思った時に、返ってくるのは目の情報だけではないことに気づきました。眉の情報も使えば良いこう考えれば良いんです。右目の一番下の点)という4つの点で「提供」の字をかぶせています。図で示すとこんな感じさらにこれで画像を書き出すとこんな感じになります。アルゴリズム的にはこんな感じで目のところにかぶせているというものでした。最後にこれを作ったのが今週の頭くらいで、「作ったよ〜」みたいなノリでtwitterにあげてみました。提供目を自動生成するツールを作りました。2018年12月10日ちょっとバズった。中には僕のガバガバ英文がお気に召してくれた方がおりウケる。2018年12月12日みんなの心温めるコンテンツレーベルになれたかなと思います。何か使いたいときがあれば僕に寿司をおごってください。github.com参考にさせていただいたサイト画像をリサイズする[http://dempatow.hatenablog.com/entry/2016/11/17/画像をリサイズしてDBへ保存する/golang:embed:cite]Seekしないと落ちる問題stackoverflow.comデコードした後にファイルがぶっ壊れる問題suguru03.hatenablog.com以上です、悪ふざけにお付き合い頂きありがとうございました。APIを使って提供目を自動生成Tweet広告を非表示にするもっと読むコメントを書く2018-10-12go-xormを使ってスキーマからstructの自動生成GolangGolangは静的型付け言語なのでjsonをパースするときとかにはけっこう骨が折れる。何行もstructを書かなくてはいけないのは結構めんどくさくて、JSON-to-Goとかでjson用のstructを自動生成して書きがち。DBとかのスキーマも同じで、structの後ろの属性等で色々と設定しなくてはいけないことが多々ある。いう人はいいんですが、僕はめんどくさがり屋なので色々と自動生成してくれる君を使うことが多い。今回は、そのようなスキーマからstructを自動生成してくれるものの使い方を自分のメモ代わりに書く。使うものgo-xormのコマンドラインツールを使う。xormはGolangのORMモデルの一つで、エウレカさんが作った、マッチングアプリのペアーズなどでも実際に使われているある程度メジャーなもの。今回はコマンドラインツールの方を使う。github.com/go-xorm/cmd/xormこれで基本はOK。engine.Logger().SetLevelみたいなエラーが出た際には、cmd/xorm/vendor/github.com/go-xorm/を消して、またインストールしなおせば行けるはず。go-xormでの同様のissue入ったら後はやるだけ。対応しているDBはmysqlmymysqlsqlite3postgresMSSQLの5種類のみ、個人的に使っているのはmysqlのみなのでいいかなという感じ。ちなみに、Golang以外にもC++に対応している模様。使う際にはテンプレートファイルをコピーしてくる。./xorm-template上記のコマンドを打ち、テンプレートファイルを手元に持ってくる。テンプレートファイルから自動生成してくれるっぽい。パスワードpasswordにしている時に、hogedbのスキーマのモデルを得るは以下のようにする。models/hogedb.goというファイルが生成されているはず。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。