Monthly Archives: 12月 2016

2016-12-27

UnityのシェーダーLODを調べてみた

こんにちは、
GMOインサイト エンジニアのfujimaruです。

UnityにはシェーダーでLOD(Level of Detail)を実現する仕組みがありますが、
参考になりそうな資料が無いので、簡単なコードを使って検証を行いました。

今回は、Unity5.4.0f3を使用し、
シェーダーLODの仕組みを使ってスクリプトからサブシェーダーを切り替える をゴールとします。

UnityのシェーダーLODについては、以下URLを参考にしてください。
https://docs.unity3d.com/Manual/SL-ShaderLOD.html


早速ですが、シェーダーのコードは、以下を用います。

サブシェーダーを4つ用意し、閾値(LOD)を設定しています。
サブシェーダーに設定されたLODと比較する値をスクリプトから送り、サブシェーダーを切り替えてみようという事です。
今回、サブシェーダーにロジックは無く、単に色を返すのみ となります。

 

次に、スクリプトのコードは、以下を用います。

Unityエディター上で作成したCubeに紐つくスクリプトコードです。
9行目が、LODと比較する数値の指定となります。

比較方法ですが、
LOD(シェーダー) <= rend.material.shader.maximumLOD(スクリプト) の時、サブシェーダが有効になります。
比較は、ソースコードの上から順に行われるので、
LODの値は、ソースコードの下になるにつれて、小さくなるように実装する必要があります。


スクリプトの値を変更した時の、実行結果は、以下のようになります。

1.rend.material.shader.maximumLOD = 5

5
2.rend.material.shader.maximumLOD = 50

50
3.rend.material.shader.maximumLOD = 100

100
4.rend.material.shader.maximumLOD = 150

150

うまくサブシェーダーが切り替わっているようです。
スクリプトの値の更新を、Update内で実行しても、同じ結果が得られました。


今回わかったこと
・シェーダーLODの仕組みを使えば、動的にサブシェーダーを切り替えることができる。

感想
対象プラットフォームが複数ある場合、
PCやAndroid等ユーザーによって環境が大きく異なる場合に有効かと考えております。

2016-12-26

機械学習環境を構築しよう!

はじめまして。GMOアドマーケティングのMHです。

機械学習が流行っていますが、何から手を付けたら良いのかわからないという方は多いのではないでしょうか

私も最近勉強を始めたのですが、数式を見ていても中々イメージが掴みづらいのですが、実際に動く環境があると理解の進みが早かったです。
なので、まずは機械学習を簡単に動かせる環境の構築をするのがおすすめです。

今回は機械学習の環境の構築と簡単な機械学習の実行をしてみたいと思います。
あまり馴染みが無いかもしれませんが、機械学習関係のライブラリが充実しているPythonをベースに環境を構築していきます。

Anacondaとは


Continuum Analytics社によって提供されている、Pythonのディストリビューションの一つです。
Python本体に加えて、機械学習/数値計算で利用する主要なライブラリをまとめてインストールすることが出来るため、データサイエンティストなどがよく利用するディストリビューションとなります。

Anacondaのインストール

それでは実際にAnacondaをインストールしてみましょう
Pythonのバージョンは2.x系と3.x系を選べますが、ライブラリ等の対応もされてきており、新規にインストールする場合は3.x系を選択することが多いため、今回は3.x系をインストールしています。

Windows環境の場合

公式ページからダウンロード後、インストーラに従ってインストールを行ってください。

Mac環境の場合

Windowsと同様に公式ページからダウンロードすることも可能ですが、pyenvを利用してのインストールがおすすめです。
pyenvのインストールにHomeBrewを利用しますので、もしインストールされていない方はHomeBrew公式ページを参照してインストールを行ってください。
では、pyenvを利用したインストールについて解説します。

1. pyenvのインストール

anacondaを直接インストールする前に、同一PC上で複数環境の切替を行うことの出来るpyenvをインストールします。

※デフォルトシェルにbashを利用していない方は環境変数の設定先を適宜変更してください。

2. anacondaのインストール

pyenvを経由してanacondaをインストールします。

以上にてanacondのインストールは完了です
実際にインストールが成功しているかを確認してみましょう

上記のようにAnacondaと表示されればインストール成功です。

これにて機械学習環境の構築は完了です。お疲れ様でした。

機械学習を試してみよう

それでは実際に、簡単なサンプルを動かしてみましょう
機械学習のライブラリはscikit-learnをメインで利用します。

scikit-learnとは

scikit-learnはPythonで実装をされているオープンソースの機械学習ライブラリです。
サポートベクターマシン、ランダムフォレスト、Gradient Boosting、k近傍法などの分類や回帰、クラスタリングアルゴリズムが数多くの機能が実装されています。
このライブラリはAnacondaに含まれていますのでインストールなどは不要です。

データの分類をしてみよう

scikit-leanを利用してデータを分類してみましょう。
分類のアルゴリズムとしてはパーセプトロンを利用します。

パーセプトロンとは視覚と脳をモデル化したニューラルネットワークの一種です。
シンプルなネットワークながらも学習が行えるアルゴリズムのため、機械学習の基礎となる概念を学ぶことが出来ます。

パーセプトロンを動かしてみよう

それでは実際に動かしてみましょう
pythonを起動して対話モードにしましょう

ライブラリの読み込み

まずは、利用するライブラリを読み込みます。
数値計算用にnumpyをグラフ描画用にmatplotlibを読み込みます。
パーセプトロンを利用するため、scikit-leanのパーセプトロンモジュールを読み込みます

サンプルデータの用意

サンプルのデータを用意します。
機械学習などでよく利用されるデータにアヤメの花びらとがくの長さがあります。
今回はがくの長さと幅のデータを利用してサンプルデータを作成しました。

上記サンプルデータは前半と後半とで品種が違っており、前半の5個がsetosa、後半の5個がversicolorとなっています。
サンプルデータを分類するためにsetosaに対しては0をversicolorに対しては1を割り振ります。

サンプルデータの可視化

サンプルデータが品種ごとに偏りが見て取れるかをグラフにして見てみましょう
matplotlibを利用してグラフを描画します。

こちらを実行すると以下のグラフが表示されます。
サンプルデータが少ないですが何となく真ん中あたりで分類できそうな気がしますね。
figure1-min

学習をしてみましょう

それでは用意したサンプルデータを利用して分類をしてみましょう
学習自体はscikit-leanのパーセプトロンモジュールを呼び出すだけです。

学習の結果を確認してみましょう

学習結果を元にサンプルデータ以外でもどのように分類されるかを確認してみましょう

こちら実行した結果になります。
いい感じに2つに分類できていますね。
figure_1

まとめ

今回は機械学習を勉強をする上でベースとなる環境の構築と実際に簡単なサンプルで学習を試してみました。
今回は紹介をしきれませんでしたがAnacondaにはPythonの実行環境jupyterも含まれています。
こちらを利用すると手軽に実行をすることが出来ますので機会があれば紹介をしたいと思います。

2016-12-26

文字列の類似度

こんにちは
GMOインサイトのエンジニアのHHです。
拙い文章で申し訳ありませんがどうぞよろしくお願いします。

私はSimplistingという検索連動型のリスティング広告サービスに携わっております。
Simplistingには日々いろんな検索リクエストが飛んでくるのですが
ときに表記ゆれというものがありまして
タイポだったり、省略形だったりいろんなものがあります。

「YOUTUBE」を例にしますと
「youtube」だったり「yuotube」だったり、はたまた「ようつべ」だったりと様々です。

(もとはタイポである「ようつべ」はもはや一般的なキーワードになっていますが)

検索したユーザーの意図は同じなのに表記ゆれによって機会損失にならないよう
カバーしてあげなければいけないのですがレリバンシーを保ちつつ広げていくところが難しいところであります。


前置きが長くなりましたが今回ご紹介したいのは「レーベンシュタイン距離」というもので
二つの文字列同士がどれくらい異なっているかを数値化する考え方です。

説明が下手なのでwikipediaから引用させていただきます。

二つの文字列がどの程度異なっているかを示す距離の一種である。編集距離(へんしゅうきょり、英: edit distance)とも呼ばれる。
具体的には、1文字の挿入・削除・置換によって、一方の文字列をもう一方の文字列に変形するのに必要な手順の最小回数として定義される

「レーベンシュタイン距離」『フリー百科事典 ウィキペディア日本語版』。2016年11月17日 15:29 (UTC)、URL: http://ja.wikipedia.org

例としては下図のようになります

levenshtein

このレーベンシュタイン距離はpythonだと
python-Levenshteinというパッケージがありますのでインストールして簡単に試すことができます。

 

日本語でも動作します。

また似たような考え方でジャロ・ウィンクラー距離というのがありまして
レーベンシュタイン距離とは逆に近さを数値化し、小数で表現します。
全く異なると0,完全に一致する場合は1を返します。

当然ですがWord2Vecなどと違いレーベンシュタイン距離は単純に文字列の比較なので意味の類似度は測れません。
また、漢字一文字などの単語につかってもあまり効果は発揮できないかと思います。

応用すれば正解辞書をつくっておきタイポを拾ってあげることもできると思います。

また機会があれば書かせていただきたいと思います。

では

2016-12-26

keepalivedによるサーバ冗長化について

GMOアドマーケティングのインフラエンジニア うたです。
サーバを冗長化させたい時によく利用するkeepalivedですが、弊社でもソフトウェアロードバランサやProxyサーバを冗長化させたりするのに使用しています。

よく見るmaster/slave構成は

keep1

のようなアクティブ/スタンバイ構成ですが、
使用するVIPの倍のサーバを用意しておかないといけなくて、ムダがありそうです。

アクティブ/スタンバイ設定例

そこでスタンバイ機にもVIPを振り、常時2台をアクティブにする構成してみます。

keep2

priorityをserver1と2で逆転させることで、master stateを2台に分散可能です。
この状態で、どちからのサーバがダウンすると、片方のserverに2つのVIPが寄せられることになります。

keep3

当然3台以上でもリング構成が可能になります。

keep4

server2がダウンすると次のpriortiyの高いノードにVIPが引き継がれます。

keep5

この仕組を利用して、IPを引き継ぎながらサーバ冗長化をできるので色々な利用方法が考えられます。

今後ともこのような小ネタがあればご紹介していきたいと思います。

2016-12-20

プリント基板を作ってみよう!

GMOインサイトのアプリエンジニア カネテックです。
みなさん半田ごて握ってますか?ユニバーサル基盤を使っていると、小型化に限界を感じませんか?

今回はレーザープリンタを用いて、家庭で簡単にプリント基板を作ってみたいと思います。
生基板がお手元に無い方は、予め注文しておくとよいでしょう。Ebayで「Copper Clad Laminate Board」などで検索すると、数百円程度で色々出てくると思います。

概要

  • 回路設計
  • レイアウト画像作成
  • 印刷
  • 転写
  • エッチング
  • 穴あけ
  • 実装

回路設計

今回はプリント基板自体が目的なので、回路は適当に2石の発信回路でLEDが点滅するものにします。

スクリーンショット 2016-12-20 18.27.01
【Upverterの回路図画面】

レイアウト画像作成

白黒画像が作れればソフトは何でも良いです。以下のような画像を作ります。今回はUpverterというWebベースのPCBレイアウトツールを使いました。

最初は成功確率を上げるために、パターンは太めにしておくと良いでしょう。

スクリーンショット 2016-12-20 18.28.22
【Upvaterのレイアウト画面】

このようなパターンを作って、Gimpを使って2値画像化しました。

モノクロ
【Gimpで白黒画像化したもの】

これにベタを追加します。ベタを追加することでエッチングされる面積が減り、より多くの基板をエッチングすることができます。

印刷

光沢紙にレーザープリンタで印刷します。この後トナーを転写してマスクとしますので、インクジェットプリンタではいけません。

img_8828jpg_31582864346_o
【光沢紙に印刷後切り出したもの】

転写

光沢紙を切り取り、生基板を同じ大きさで切り出します。切り出した基板は軽くやすっておくと定着が良いです。

img_8830jpg_30810250863_o
【形を合わせて切り出します】

img_8838jpg_31247688420_o
【やすった後の状態】

ある程度加熱すると張り付いてずれなくなるので、まずは光沢紙を濡らして張り付かせ、その後アイロンを当てて熱で貼り付けるとずれる事故が少ないです。
押し付けるように数分ほどアイロンを当てます。押しすぎるとトナーが潰れ、押す力が弱いと転写に失敗します。ここが一番難しいかもしれません。

img_8844jpg_31504305851_o
【アイロン加熱中】

転写したら、よく水に浸して紙をふやかします。

img_8845jpg_31620197465_o
【納豆容器で浸水中】

しっかりふやけたら、優しく剥がしましょう。残った繊維はトナー上のものは無視して大丈夫です。銅パターン上のものは指や爪楊枝などでしっかり落としておきましょう。

img_8849jpg_31247701780_o
【剥がした後の状態。一見きれいだが……】

しっかり処理したつもりでも、乾燥させると以下のように紙繊維が残っていたりします。乾燥後の状態をよく確認し、しっかり繊維を取り除いてください。

img_8851jpg_30810308083_o
【殆どの穴に紙繊維が残ってしまっている】

 

エッチング

以下を混合してエッチング液を作ります。

  • オキシドール
  • クエン酸

img_8856jpg_31504341821_o
【エッチングセット(塩写し忘れ)】

このとき、塩とクエン酸はだいたい1:4くらい(この二つを反応させるわけではないのでアバウトで大丈夫)とし、ぎりぎり溶け切るくらいのオキシドールを入れて混ぜます。

エッチング液はチャック付きのビニール袋に入れると扱いが楽ですし、液の量も少なくて済みます。

エッチング液に基板を投入します。

img_8858jpg_30778640414_o
【投入!】

50度くらいのお湯で湯煎しながら、見守ります。環境によって違うと思いますが、今回は3分程度の湯煎で溶けきりました。

img_8860jpg_31582951126_o
【湯煎しています】

img_8862jpg_31504352451_o
【3分後。露出している部分の銅が溶けています】

エッチングできたら、トナーパターンを落とします。除光液を使うと簡単に落とすことができます。

img_8864jpg_30810354843_o
【エッチング後】

img_8866jpg_31504360711_o
【トナー除去後。きれいに銅が残っています】

エッチング後の液はへたるまで繰り返し使えます。使い終わったら十分な量のアルミニウムを入れて反応させ、銅を析出させてから金属を濾し取り、液と金属をそれぞれ自治体のルールに従って廃棄してください。アルミニウムを投入すると反応熱が出ますので、少量ずつ、冷やしながら入れることをお勧めします。

穴あけ

PCB用のドリルビットを用意して、電動ドリルで空けました。1.2mm程度のものが良さそうです。太い足のものを使う箇所がある場合は、それに合わせてビットを選んでください。

穴あけ後は酸化を防ぐためにフラックスを塗布しておきます。

実装

普通にはんだ付けしていきます。自分で作った基板に普通にはんだ付けできるって感動です!!

img_8867jpg_31344125080_o
【裏面。せっかくなので一部チップ抵抗を使用】

img_8870jpg_31679839876_o
【表面。すっきり】

なお、線の部分もマスクされてないので普通にハンダが乗ってしまいます。見栄えが悪くなるので、ランドからハンダがはみ出ないよう注意して作業するとよいです。

 

 

いかがでしたでしょうか?
プリンタの種類、光沢紙の種類、アイロンの種類、エッチング液の混合比などに影響されて仕上がりが異なってくると思います。
みなさん最強の組み合わせを模索してみてください!