ブログが続かない人のブログ

技術ネタについて書いていきたいです。

Unity認定開発者になりました

先日、Unity開発者認定試験に合格しまして、Unity認定開発者になりました! 🎉

f:id:tsukumaru:20181105000205p:plain (本名出せないので本当に自分のか怪しい感じになってますが、自分のやつです)

実は一昨年から気にはなっていたのですが、その頃はまだ自分の力に自信がなかったので、あとでいいか〜となっていました。

そして去年はなんと自分の結婚式と時期がかぶってしまい、受験どころではない事態だったので、仕方なくあきらめていました。

そして今年です。ようやく受験できました。無事合格できて本当によかったです。

試験対策

自分が試験対策でしたことは、公式のコースウェアの動画をひたすら見ることでした。

認定試験の出題範囲は広く、Unityの使い方のような基本的なところから、テクスチャやライティングなどの機能まで幅広く出題範囲になります。

自分はライティングやパーティクルのところが自信がありませんでしたが、コースウェアの動画は一から親切に教えてくれるため、しっかりと理解することができました。

他の機能についても一から復習できたのでよかったです。

まとめ

Unity開発者認定試験は試験範囲が広いため、Unityの基本知識の勉強にうってつけです。

Unityを触り始めて少し慣れてきた人は、受けてみるとかなり勉強になるんじゃないかなと思います。

これからもがんばるぞい!

ABC101に参加しました

AtCoder Beginner Contest 101 - AtCoder

ABC101に参加しました。

いままで過去問はいくつか解いてきましたが、リアルタイムで参加したのは初めてでした。

(初めてレーティングがついて、灰コーダーになりましたww)

結果は......AとBはAC、CとDはWAで終わってしまいました....

問題ごと簡単に振り返ってみようと思います。

A - Eating Symbols Easy

高橋君は,いつも頭の中に整数を 1 つ思い浮かべています.

はじめ,高橋君が思い浮かべている整数は 0 です. これから,高橋君は + または - の記号を,あわせて 4 つ食べようとしています. 高橋君が + を食べると,思い浮かべている整数は 1 大きくなります. 一方,高橋君が - を食べると,思い浮かべている整数は 1 小さくなります.

高橋君が食べようとしている記号は,文字列 S で与えられます. S の i 文字目は,高橋君が i 番目に食べる記号です.

すべての記号を食べ終わった後,高橋君が思い浮かべている整数を求めてください.

高橋くん...なんてものを食べているんだ...

AtCoderはいかに高橋くんの奇行にまどわされないかが大事ですね(笑)

問題としては簡単で、入力の文字列の中の + の数と、-の数を数えて、差を出せば終わりでした。

Submission #2718304 - AtCoder Beginner Contest 101

解説放送ではSが4文字という制限を使って、先頭から1文字ずつifで見ていってましたw

Sが4文字の条件完全に見落としてたので、ちゃんと問題読もうと思いました。

B - Digit Sums

整数 n に対して, n を十進法で表したときの各桁の和を S ( n ) で表すことにします. たとえば, S(101)=1 + 0 + 1= 2 です.

整数 N が与えられたとき, N が S ( N ) で割り切れるかどうかを判定してください.

これは単純に計算するだけでACできました。あとからわかりましたが、これD問題にでてくる「すぬけ数」の布石だったんですね...

回答の中で変数思いつかなくて $hoge とか使ってしまっているのがはずかしい...よく考えたらわざわざfor文で回さなくても List::Utilの sum 使えばできましたね。

Submission #2719378 - AtCoder Beginner Contest 101

C - Minimization

長さ N の数列 A1 , A 2 , . . . , A N があります.最初,この数列の要素は 1 , 2 , . . . , N を並び替えたものになっています.

スヌケ君は,この数列に対して次の操作を行うことができます.

・数列のうち,連続した K 個の要素を選ぶ.その後,選んだ要素それぞれの値を,選んだ要素の中の最小値で置き換える.

スヌケ君は,上の操作を何回か繰り返すことで,この数列の要素をすべて等しくしたいです. 必要な操作の回数の最小値を求めてください. この問題の制約の下,このようなことは必ず可能であることが証明できます.

この問題を見た時、 n/(k-1) で出せるのではないかと考えました。 例えば

4 3

2 3 1 4

の場合はまず最初の3つを選んで最小値が1なので 1 1 1 4 にしますが、このとき変わっているのは 2 3 の二つのみです。なので、要素数のうちのk-1個のグループの数が最小値なのではと考えました。

しかし、そんな甘くはなく、

3 2

2 3 1

のような場合、最小値は2回ですが、自分の考えた方法だと3回になってしまいます。

もちろん提出しても通るはずもなくWA..... Submission #2720408 - AtCoder Beginner Contest 101

その後エッジケースを条件分岐で継ぎ足すもACにはなりませんでした。

終了後に解説を見ると (n-1)/(k-1) と書いてあるではないですか!!惜しい〜〜〜〜〜〜

全体に伝播させる要素の分を最初から抜いておき、抜いた中でのk-1個のグループの数を考えればよかったようです。自分の考えに固執してしまうとダメですね...

ただこれは少数の場合に四捨五入する必要があるのでそこだけ注意が必要だと思いました。

D - Snuke Numbers

整数 n に対して, n を十進法で表したときの各桁の和を S ( n ) で表すことにします. たとえば, S ( 123 )= 1 + 2 + 3= 6 です.

正の整数 n であって, m> n であるような任意の正の整数 m に対して n / S ( n ) ≤ m / S ( m ) が成り立つようなものを,すぬけ数 と呼ぶことにします.

整数 K が与えられたとき,すぬけ数 を小さいほうから K 個列挙してください.

出力のサンプルから、 1 2 3 4 5 6 7 8 9 19 となっていて怪しいなと思い、実際に計算してみると、すぬけ数はnが10のときに10、11の時に5.5、...19のときに1.9と、単調減少していることに気づきました。そのあとnが20になると10になりまた大きくなります。

ここまで気づいたので、「これは19、29、39、...と続いていくのでは...!」と安直な予想を立てて提出してみましたが、玉砕しました..

Submission #2731783 - AtCoder Beginner Contest 101

解説や解説動画を見ると、方針的にはそこまで悪くなかったように思いますが、ツメが甘かったようです。

自分的に解説は数式が多く理解しにくかったので、他の方の実装を参考にしながら理解しました。以下のコードがとてもわかりやすかったです。

Submission #2731138 - AtCoder Beginner Contest 101

最上位の数字を追っていって、0でないときにはそのまま出力。桁数が変わった時にはいままで追っていた桁数の場所が0になるので、そうなったらそこに9を入れて次の桁を追うようにするという流れです。

なぜ9にしていいかは解説動画でもありましたが、n/S(n)を最小にするためです。

こういう問題をサクッと解けるようになりたいw

感想

惜しいところまでわかっていたものの、最後のツメが甘く、ACならずでした。

とりあえず理解はしましたが、まだ自分で書いてみてないので、復習がてらもう一度挑戦したいです!

go-staticmapsのcontributorになった

先日、昨日の記事でも紹介していたgo-staticmapsのコントリビュータになりました。

github.com

p-rの内容は、Markerにはあったインスタンスを生成するための関数が、PathとAreaの方にはなかったので追加したという感じです。

具体的には、いままで地図画像にPathを追加するのに、

// パスを追加
path := new(sm.Path)
path.Positions = []s2.LatLng{spot1, spot2}
path.Color = color.RGBA{0, 0, 0xff, 0xff} //パスの色
path.Weight = 3.0 //パスの幅
ctx.AddPath(path)

このように書いていたのが、今回のp-rによって

// パスを追加
ctx.AddPath(sm.NewPath([]s2.LatLng{spot1, spot2}, color.RGBA{0, 0, 0xff, 0xff}, 3.0))

このように書けばよくなります。余計な変数を宣言しなくてよく、すっきり1行で書くことができます。

自分自身、これがなくてかなり不便に感じていたので、無事mergeされて嬉しいです。

せっかくcontributorになったので、もっと貢献していけたらいいなと思います!

golang.tokyo#11 でLTしてきた

techplay.jp

12/11に開催されたgolang.tokyo#11でLTをさせていただきました。

golang.tokyoとは?

プログラミング言語Goに関する勉強会で、去年の10月からほぼ毎月のペースで行われているようです。

自分は普段あまりGoは触っておらず、この勉強会へも初参加でしたが、業務でちょうどいいネタがあったので登壇させていただきました!w

発表内容

speakerdeck.com

「Goで地図サーバを構築した話」というタイトルで発表させていただきました。 Google Mapから自社の地図サーバに移管した話で、地図のデータをどこから持ってくるのか?ガラケー用の地図はどうする?みたいな内容を話しました。

OpenMapTilesもgo-staticmapsも、とても便利なので、一度触ってみると楽しいかと思います。

ほぼ同じ内容をQiitaのアドベントカレンダーに投稿しているのでそちらも合わせてご覧ください。

qiita.com

他の方の発表資料は以下のリンクから見られます。

golang.tokyo #11 - 資料一覧 - connpass

感想

自分自身にGoの知見が少ないのもあるのですが、自分以外の方の発表内容のレベルが高くて、なかなかついていくの大変でした。

ですが、懇親会では和気あいあいと話すことができ、業務でGoを使っていてはまった点などを話せてとても楽しかったです。

次参加する時までにはもっとGoの知見をためておこうと思います...!!

「Webエンジニアが知っておきたいインフラの基本」を読んだ

Webエンジニアが知っておきたいインフラの基本

Webエンジニアが知っておきたいインフラの基本

この本、前から気になっていて、いつか読むぞ!と思っていました。やっと読んだので、感想をまとめておこうと思います。

一言で言うと、自分にはまだ早かったなという印象です。

自分の過去の投稿を見てもらえれば分かる通り、サーバ/インフラ系の本をいくつか読んできたのですが、それらのどの本よりも情報量が多く(ページ数も多く)、かなり内容が濃いためなかなか読み進められませんでした。 「サーバ/インフラを支える技術」をさらに詳しく、実践的な面も含めて書いたのがこの本という感触なので、一度読んで終わりではなく、「サーバ/インフラを支える技術」と合わせて複数回読んで徐々に理解していくのがいいと思いました。

[24時間365日] サーバ/インフラを支える技術 ?スケーラビリティ、ハイパフォーマンス、省力運用 (WEB+DB PRESS plusシリーズ)

[24時間365日] サーバ/インフラを支える技術 ?スケーラビリティ、ハイパフォーマンス、省力運用 (WEB+DB PRESS plusシリーズ)

別にこの本のステマをしようとかいうわけではなく、単純にそう思ったから書いているだけなので、あしからず。

内容的には、前半で基礎知識を詳しく解説し、後半でインフラの構築の仕方、監視の仕方、チューニングする際のボトルネックの見つけ方が載っています。

基礎知識の章で驚いたのは、サーバのスペックについての内容で、CPUやディスクなど、各パーツの選び方が載っていたことです。インフラとはなにかを知るだけでなく、実際に自分で用意する際に役立つように書かれていることに驚きました。 実際自分はそこらへんの知識が皆無なので、まったくついていけませんでしたが...

また後半でも、Howtoだけでなく、監視の章では監視サービスを実際に使ってみている様子から、グラフのどこが何を示しているのかを解説してくれていたり、チューニングの章ではコマンドと入力結果、さらにその入力結果からなにがわかるかが書かれています。 「サーバ/インフラを支える技術」でも、同じようにコマンドと入力結果から考察をする箇所はあるのですが、こちらの本の方が色も見やすかったり、説明がわかりやすいです。 自分は一度読んだだけではしっかりと理解という段階まで至れなかったので、実践しながらもう一周してみたり、もう一度「サーバ/インフラを支える技術」を読んでみたりしながらじっくり理解を深めていこうと思いました。

それでは良いお年を。

「サーバ/インフラを支える技術」を読んだ

[24時間365日] サーバ/インフラを支える技術 ?スケーラビリティ、ハイパフォーマンス、省力運用 (WEB+DB PRESS plusシリーズ)

[24時間365日] サーバ/インフラを支える技術 ?スケーラビリティ、ハイパフォーマンス、省力運用 (WEB+DB PRESS plusシリーズ)

この本は、以前紹介した、「大規模サービス技術入門」をさらに詳しく解説した本です。

tsukumaru.hateblo.jp

最初の3章でインフラを構築するための基本となる、冗長化、負荷分散について詳しく説明されています。
冗長化とはなんなのか?なぜ必要なのか?から入っていき、冗長化するためにはなにが必要かという風に話が進んでいきます。
最初に用語集がついているくらい、初心者に優しい本ですが、話が進んでいくと、サーバのconfigの記述例が出てきたり、コマンドの出力例を見ながら負荷分散について考えたりと、ある程度知識がある人でも楽しめる内容になっています。

この本の2章でMySQLレプリケーションの話が出てくるのですが、自分がここを読んでいるときにちょうど業務でレプリケーションの知識が必要になりました。
レプリケーションの大体の概念はわかっていましたが、マスターからスレーブに対してデータがどのようにコピーされるのか、マスターからコピー済みのデータかどうかはどのように判断しているのかなどなど、知らなかったこともたくさんあり、とても役に立ったのを覚えています。

4章はチューニングについての話です。
負荷分散といっても、なんでもかんでも分散すればいいってもんじゃないんだ!1台の性能を十分に引き出さないと意味ないんだ!(意訳)
という言葉から始まり、「推測するな、計測せよ」という格言をもとに話をすすめていく感じから、チューニングに対しての気合が感じられます。(多分)

サーバの負荷を見る際に有効なコマンドの紹介(topやsar, vmstat)から始まり、コマンドの出力を見ながら、なぜこのような出力がでるのかをライブラリの中身を見ながら解説していきます。
ただ単に「このコマンド使えばこういう出力でるから、負荷見るときは使うように」というような薄い内容ではないのが、自分はすごく好印象でした。
まず何からすればいい?CPU負荷が高い場合は?I/O負荷が高い場合は?など順に負荷の原因を解明していくプロセスが解説されていて、とてもわかりやすいです。

5章は、サーバ監視の話です。 Nagiosを例にとり、実際に使っていく中で、サーバ監視のあれこれを解説していきます。この章はあまり自分の興味がわかずざっとしか読めていません...また時間があったら読もうと思います。
Nagios - The Industry Standard In IT Infrastructure Monitoring

まとめ

自分はサーバ/インフラの初心者だったため、「大規模サービス技術入門」から読んだ方がいいかなと思っていましたが、「サーバ/インフラを支える技術」を読んでみると、案外こっちの方がわかりやすくためになると感じました。「大規模サービス技術入門」の方ははてなインターンシップをまとめた形のため、勉強のために読むという感じだと物足りないと思います。
インフラ系の業務で困った時の辞書的な役割をしてくれる本だと思うので、ぜひ一家に一冊あるといいのではないでしょうか。