tag:blogger.com,1999:blog-10596211791565452722024-03-14T03:40:00.166+09:00naichilab - Android iOSアプリ開発メモUnityを使ってAndroid/iOS用アプリを作っています。日々調べたことやつまづいたことをメモ。naichilabhttp://www.blogger.com/profile/11086576268699869652noreply@blogger.comBlogger202125tag:blogger.com,1999:blog-1059621179156545272.post-65594728756244111922015-07-10T06:46:00.000+09:002015-07-10T06:46:00.500+09:00【スマフォアプリマネタイズ】Unity Ads ミートアップ in 大阪 に参加してきた<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiN8UOfDpIQfSCpwmAtp6ULJcfkfjuC44pfU0QhGuSn3FjCJO84s9FL1JK6N-MTcZxew7jSOYnSOJbWFZJ5s_ZXZBh_z-hOyJuviJqyfnrSfXAmnFhBUCMaVMB32QdqPKIvYXy_bpvOR1s/s1600/20150709001.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiN8UOfDpIQfSCpwmAtp6ULJcfkfjuC44pfU0QhGuSn3FjCJO84s9FL1JK6N-MTcZxew7jSOYnSOJbWFZJ5s_ZXZBh_z-hOyJuviJqyfnrSfXAmnFhBUCMaVMB32QdqPKIvYXy_bpvOR1s/s1600/20150709001.png" /></a></div>
<br />
7/8に大阪で開催されたUnityAdsの勉強会に参加してきました。<br />
<br />
<a href="https://atnd.org/events/67227" target="_blank">【スマフォアプリマネタイズ】Unity Ads ミートアップ #4 in 大阪</a><br />
<br />
UnityAdsミートアップって集まりは毎月東京でやってるらしいです。<br />
今回はたまたま関西での開催だった模様。<br />
<br />
<h2>
<span style="text-align: center;">到着〜勉強会開始まで</span></h2>
19:45頃に到着したときには15人ぐらいいたかな?<br />
遅刻だと思って急いで来たけどみんな唐揚げ食べてた。<br />
ちゃんとタイムテーブル見てみると20:30開始、19:30は乾杯だったw<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjValDQAlM_ZnGTF8QFeig8CL1Gxo4I-xwVwhsJSo9krygFhTO6scOuI82ip3DAiS_cQOsABwycyUae11kH-9hOceJ2UWR-nQSc_wjY1gsgDB6SL7XemyI2jB3HGYoYn5_sTH_866YIesU/s1600/20150709002.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="130" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjValDQAlM_ZnGTF8QFeig8CL1Gxo4I-xwVwhsJSo9krygFhTO6scOuI82ip3DAiS_cQOsABwycyUae11kH-9hOceJ2UWR-nQSc_wjY1gsgDB6SL7XemyI2jB3HGYoYn5_sTH_866YIesU/s320/20150709002.png" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">タイムテーブル</td></tr>
</tbody></table>
<br />
数人知り合いがいたのでとりあえずビールで乾杯。<br />
唐揚げとピザを食べながらビール。しかも無料。なんて幸せな・・・<br />
<br />
20:30頃、Lサイズのピザ3枚が届いたのと同時に勉強会開始。<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiisiydcy2XYvX8pbJ_c41gusUah3Lu-YmB2_MDOha8gHv_EIstuOMXQEfj_wSGBE6Y7_MKyl88bCZ-sFv7AguP8teZDRlYXmCnAwGulSeIZTMxkh6pJQd8iMz6eR5G71O5hG071_rJFho/s1600/DSC_0791.JPG" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="179" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiisiydcy2XYvX8pbJ_c41gusUah3Lu-YmB2_MDOha8gHv_EIstuOMXQEfj_wSGBE6Y7_MKyl88bCZ-sFv7AguP8teZDRlYXmCnAwGulSeIZTMxkh6pJQd8iMz6eR5G71O5hG071_rJFho/s320/DSC_0791.JPG" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">始まる頃にはみんなお腹いっぱい</td></tr>
</tbody></table>
<h2>
20:30〜 Unity Ads トレンドのご案内</h2>
Unityジャパン松井さんの発表。<br />
UnityAdsはこんなものですよ〜とか。<br />
どういうアプリに実装されてますよ〜。みたいな紹介。<br />
<br />
導入アプリの数や広告数、フィルレート、eCPMとかふむふむって聞いてた。<br />
ところどころの数字は喋っちゃダメって言ってたから伏せとく。<br />
(どこがダメだったかは酔っ払ってて覚えてない)<br />
<br />
導入数に関して言うと今年頭からすでに2倍以上になってるらしい。<br />
<br />
あとは代表的な広告の表示方法の紹介とか。<br />
<br />
<h3>
代表的な広告表示方法</h3>
UnityAdsは動画広告のみなので表示するタイミングが重要。<br />
ざっくりと4種類紹介された。<br />
<h4>
アイテムプレゼント型</h4>
動画みたらアイテムあげるよ!的なあれ。<br />
見るか見ないかユーザーが選べるしいいよね。最近増えてるのも納得。<br />
コンバージョン、eCPM共に高い。<br />
<h4>
強制表示型</h4>
定期的に強制表示されるやつ。かなりうっとうしい。<br />
5秒でスキップできる場合が多いけどそれでもイライラしちゃう。<br />
コンバージョンは並、eCPMは高い。<br />
<h4>
コンティニュー型</h4>
動画みたらもう一度コンティニューさせてあげるよってやつ。<br />
毎回じゃなくハイスコアに届きそうなときとか、ユーザーが悔しい思いをしたときに出すと効果的らしい。たしかに。広告じゃないけどツムツムとかそうやね。<br />
コンバージョンやや高い、eCPMは高い。<br />
<h4>
ゲーム開始前表示型</h4>
開始前に見ると強くてニューゲームできるよ。みたいな。<br />
今からこのゲームを遊ぶ!ってときに出すから効果は低いらしい。<br />
コンバージョン、eCPM共に低い。<br />
<br />
<h3>
Unityを信じて!</h3>
この言葉が印象的だったw<br />
効果の高い広告が出やすいように自動的に最適化されていくから2〜3ヶ月は変にいじらず使ってみて。って言ってた。<br />
いじるってブラックリストやホワイトリストで表示する広告をカスタマイズすることね。<br />
<br />
<h2>
21:15~ Unityのアプリに動画広告を実装するには</h2>
続いて鎌田さんの発表。<br />
ソースコード見せながらこんな感じで実装できますって紹介。<br />
<br />
<h3>
実装方法</h3>
<h4>
1.UnityAdsのアセットをインポート</h4>
※Unity5.2からはUnityAdsが標準ライブラリに含まれるみたいで、アセットのインポートは不要になるらしい。<br />
<h4>
2.実装する</h4>
コードはこれだけ。<br />
<pre class="brush : csharp ;">using UnityEngine.Advertisements;
public class UnityAdsTest : MonoBehaviour
{
void Start()
{
if(Advertisement.isSupported && Advertisement.isInitialized)
{
Advertisement.Initialize("gameID");
}
}
public void ShowAds()
{
if( Advertisement.isReady())
{
Advertisement.Show();
}
}
}</pre>
あら簡単。
<br />
<br />
このままゴリゴリ書き進めてもいいけど<br />
完了・中断とかのコールバック実装やiOS、Android両対応とか<br />
ちょっと踏み込むとだんだん面倒になってくる。(らしい)<br />
<br />
次はそれを解決できるヘルパーの紹介。<br />
<br />
<h3>
もっと楽な実装方法</h3>
<a href="https://github.com/wcoastsands/unity-ads-helper" target="_blank">Unity Ads Helper</a><br />
UnityAdsの実装を超簡単にしてくれるヘルパー。<br />
使い方は上記リンクをみてね。<br />
<br />
iOS,AndroidのgameIDを一緒に設定できたり、<br />
OnFinished,OnSkipped,OnFailedとかのコールバックを簡単に実装できたり。<br />
かなり便利そうに見えた。<br />
<h3>
実装サンプルプロジェクトの紹介</h3>
<a href="https://github.com/wcoastsands/unity-ads-demo" target="_blank">unity-ads-demo</a><br />
さっきのヘルパーを作ってる人のデモらしい。<br />
<br />
<br />
動画をみたらコインをプレゼント〜ってありがちな使い方のサンプル。<br />
一度見るとしばらくは「動画を見る」ボタンが押せないクールダウンタイムの実装もされてるので参考にどうぞ。<br />
<br />
<h3>
動画のスキップについて</h3>
アイテムプレゼント型の実装だとスキップできない場合が多いよね。<br />
逆に強制表示型だと5秒でスキップみたいなのが多い。<br />
<br />
UnityAdsの管理画面からスキップ可否やスキップ可能までの秒数が設定可能だそうな。<br />
<br />
<h2>
UnityAdsの強み</h2>
<ul>
<li>eCPMが高い</li>
<li>ゲームに特化してる</li>
<li>実装が楽</li>
</ul>
こんな感じのことを話してた。<br />
<br />
Unity5.2以降はアセットの追加すら不要になるみたいだからかなり楽になるね。<br />
<br />
<h2>
まとめ</h2>
実装も楽そうだし使ってみましょー。<br />
ゲーム系アプリであれば導入して損はなさそうです。<br />
<br />
<br />
あと今後は<span style="font-size: large;">ミート</span>アップってことでお肉食べてしゃべる会を目指すらしいですよ。<br />
お肉食べたくなったらUnityの人に連絡しましょう!<br />
<br />
<br class="Apple-interchange-newline" />
→<span style="color: blue;"><a href="http://naichilab.blogspot.jp/2013/05/unity.html" target="_blank">Unity系記事まとめ</a></span>naichilabhttp://www.blogger.com/profile/11086576268699869652noreply@blogger.comtag:blogger.com,1999:blog-1059621179156545272.post-46285376829820492452015-07-08T12:33:00.001+09:002015-07-08T12:57:15.863+09:00ConoHa関連<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgVef0ddtM_G0IzzTvvSCbsUsRngV-EUEDy2XXBhGBAvsrtTK1ejGW53YNbllxXvB9lVj6ke22ZsR35x866aNBoA62cpQuEHDCrRhenYQ-7JwjXOAPVPFRevcFfyoM4tj2pn21OduR-E1g/s1600/conoha.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="96" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgVef0ddtM_G0IzzTvvSCbsUsRngV-EUEDy2XXBhGBAvsrtTK1ejGW53YNbllxXvB9lVj6ke22ZsR35x866aNBoA62cpQuEHDCrRhenYQ-7JwjXOAPVPFRevcFfyoM4tj2pn21OduR-E1g/s320/conoha.png" width="320" /></a></div>
<br />
<a href="https://www.conoha.jp/" target="_blank">ConoHa</a>のVPSに関連する記事をまとめました。<br />
<br />
<h3>
公式サイト</h3>
<ul>
<li><a href="https://www.conoha.jp/referral/?token=AsF9Gb25dzxE20HSTy6Oe7ACso4IyJyg3TmUN76a2FXoSkLx7s8-4U3" target="_blank">https://www.conoha.jp/</a></li>
</ul>
<br />
<h3>
オブジェクトストレージ関連</h3>
<ul>
<li><a href="http://naichilab.blogspot.jp/2015/07/conohacyberduck401.html" target="_blank">新ConoHaのオブジェクトストレージにCyberDuckで接続しようとして401認証エラー</a></li>
<li><a href="http://naichilab.blogspot.jp/2015/07/conohaopenstackswift.html" target="_blank">ConoHaのオブジェクトストレージを操作するためにOpenStackSwiftのコマンドラインクライアントをインストールする</a></li>
<li><a href="http://naichilab.blogspot.jp/2015/07/swiftconoha.html" target="_blank">Swiftコマンドラインクライアントで新ConoHaのオブジェクトストレージに接続する。</a></li>
<li><a href="http://naichilab.blogspot.jp/2015/07/conohaweb.html" target="_blank">新ConoHaのオブジェクトストレージにWeb公開可能なコンテナを作成する。</a></li>
<li><a href="http://naichilab.blogspot.jp/2015/07/conohaajax.html" target="_blank">新ConoHaのオブジェクトストレージ上のデータをAjaxで取得してみる</a></li>
<li><a href="http://naichilab.blogspot.jp/2015/07/conohaajax_5.html" target="_blank">新ConoHaのオブジェクトストレージにAjaxを使ってアップロードする</a></li>
<li><a href="http://naichilab.blogspot.jp/2015/07/conohaurltemp-url.html" target="_blank">新ConoHaのオブジェクトストレージ、ダウンロード用一時URL(Temp URL)を試す。</a></li>
</ul>
naichilabhttp://www.blogger.com/profile/11086576268699869652noreply@blogger.comtag:blogger.com,1999:blog-1059621179156545272.post-2789715002607525952015-07-07T01:12:00.000+09:002015-07-08T12:46:54.062+09:00新ConoHaのオブジェクトストレージ、ダウンロード用一時URL(Temp URL)を試す。<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgVef0ddtM_G0IzzTvvSCbsUsRngV-EUEDy2XXBhGBAvsrtTK1ejGW53YNbllxXvB9lVj6ke22ZsR35x866aNBoA62cpQuEHDCrRhenYQ-7JwjXOAPVPFRevcFfyoM4tj2pn21OduR-E1g/s1600/conoha.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="96" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgVef0ddtM_G0IzzTvvSCbsUsRngV-EUEDy2XXBhGBAvsrtTK1ejGW53YNbllxXvB9lVj6ke22ZsR35x866aNBoA62cpQuEHDCrRhenYQ-7JwjXOAPVPFRevcFfyoM4tj2pn21OduR-E1g/s320/conoha.png" width="320" /></a></div>
ブラウザからオブジェクトストレージへ直接ファイルアップロードをしたいんだけどブラウザにアクセストークンを渡したくない。<br />
どうにか方法ないかなって調べてたら下記記事を見つけた。<br />
<br />
<a href="http://qiita.com/yuku_t/items/40b7daf018d3dab48974" target="_blank">Qiitaの画像アップロード機能も簡単に実装できる。そう、S3ならね。</a><br />
まさにやりたいことはこれ。でもS3じゃなくてConoHaオブジェクトストレージでやりたい。<br />
<h3>
調べた。</h3>
<ul>
<li><a href="http://docs.openstack.org/developer/swift/api/form_post_middleware.html" target="_blank">Form POST middleware</a><br />見た感じさっきのQiita記事はOpenStack Swiftの上記機能を使ってるっぽい。</li>
<li><a href="http://docs.openstack.org/developer/swift/api/temporary_url_middleware.html#secret-keys" target="_blank">Secret Keys</a><br />上記FormPOSTを行うためにはSecret Keysってものを使う必要がある。</li>
<li><a href="http://docs.openstack.org/developer/swift/api/temporary_url_middleware.html" target="_blank">Temporary URL middleware</a><br />Secret Keysは"Form POST" と "Temporary URL"って機能で使うらしい。</li>
<li><a href="https://www.conoha.jp/docs/swift-temporary_url_middleware.html" target="_blank">temporary url middleware | ConoHa API Documantation</a><br />ConoHaのドキュメントにも"Temporary URL"が載っててサンプルコードもあった。</li>
</ul>
ConoHaのドキュメントにはForm POSTに関する記述がなかったけど使えないのかな・・・<br />
とりあえず簡単そうな"Temporary URL"を試してみる。<br />
<br />
<h3>
コンテナを作成しファイルをアップロード</h3>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEigQkEonBJD0wEnw_6LbBD8RtRdVfGAya0iPnbtVZnxtrf2qCnY9J4oMYjF3OrFwd6I0nl5gPIwqwpu60AFH1g3OU5CfraP0MdAMn5wJjvg049_J-Xn6ldTmq6iigN5__wWrsE_aa0w3nc/s1600/20150706001.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="280" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEigQkEonBJD0wEnw_6LbBD8RtRdVfGAya0iPnbtVZnxtrf2qCnY9J4oMYjF3OrFwd6I0nl5gPIwqwpu60AFH1g3OU5CfraP0MdAMn5wJjvg049_J-Xn6ldTmq6iigN5__wWrsE_aa0w3nc/s320/20150706001.png" width="320" /></a></div>
<br />
"container"ってコンテナを作り、"hello.txt"をアップロードした。<br />
コンテナには何もメタデータを設定していないので、今のところhello.txtは直接GETできない。<br />
<h2>
トークンの発行</h2>
<a href="http://naichilab.blogspot.jp/2015/07/conohaajax_5.html" target="_blank">前回の記事</a>と同様にトークンを発行する。<br />
<pre class="brush : plain ;">curl -i -X POST \
-H "Accept: application/json" \
-d '{"auth":{"passwordCredentials":{"username":"APIユーザー名","password":"APIユーザーパスワード"},"tenantId":"テナントID"}}' \
https://identity.tyo1.conoha.io/v2.0/tokens</pre>
<br />
<h3>
TempURL用のKeyを登録</h3>
<pre class="brush : plain ;">curl -i -X POST \
-H "Accept: application/json" \
-H "X-Auth-Token: [取得したトークン]" \
-H 'X-Account-Meta-Temp-URL-Key: [セットしたいキー]' \
https://object-storage.tyo1.conoha.io/v1/nc_df3bdbc45bc04950b558834f5728517a</pre>
<a href="http://docs.openstack.org/developer/swift/api/temporary_url_middleware.html" target="_blank">Temporary URL middleware</a>に4つのキーが必要、みたいに書いてあるけどここでセットしてるのアカウントに対する鍵の1つ目(<b>X-Account-Meta-Temp-URL-Key</b>)っぽいなぁ。1つでいいのかな。残り3つはなんなんやろ。<br />
<br />
<h3>
TempURLを生成するスクリプトを用意</h3>
create-tempurl.py<br />
<pre class="brush : plain ;">import hmac
from hashlib import sha1
from time import time
method = 'GET'
duration_in_seconds = 60*60*24
expires = int(time() + duration_in_seconds)
path = '/v1/nc_df3bdbc45bc04950b558834f5728517a/container/hello.txt'
key = '[セットしたキー]'
hmac_body = '%s\n%s\n%s' % (method, expires, path)
sig = hmac.new(key, hmac_body, sha1).hexdigest()
s = 'https://{host}{path}?temp_url_sig={sig}&temp_url_expires={expires}'
url = s.format(host='object-storage.tyo1.conoha.io', path=path, sig=sig, expires=expires)
print '%s' % url</pre>
pythonにはhmacってライブラリがあるんですなぁ。rubyにもあるのかな。
<br />
<br />
<h3>
スクリプト実行</h3>
<pre class="brush : plain ;">$ python create-tempurl.py
https://object-storage.tyo1.conoha.io/v1/nc_df3bdbc45bc04950b558834f5728517a/container/hello.txt?temp_url_sig=9775eacc57b95fe57435c8f5d8b6e404a0957930&temp_url_expires=1436284812</pre>
こんな感じでURLが返ってくる。
<br />
このURLをブラウザで開くとダウンロードされるので一時URLが有効になってるのが確認できた。めでたしめでたし。<br />
<br />
とりあえずhmacによる認証ハッシュを生成する方法はわかったので次はFormPOSTを試してみたい。<br />
ConoHaの<a href="https://www.conoha.jp/docs/" target="_blank">APIドキュメント</a>に"Form POST"っぽいものがないけど使えるんだろうか・・・<br />
<br />
今日はここまで。<br />
<br />
<h4>
関連記事</h4>
ConoHa関連の記事をまとめました。<br />
<a href="http://naichilab.blogspot.jp/2015/07/conoha_8.html" target="_blank">ConoHa関連まとめ</a>naichilabhttp://www.blogger.com/profile/11086576268699869652noreply@blogger.comtag:blogger.com,1999:blog-1059621179156545272.post-75522224507481768992015-07-05T04:04:00.000+09:002015-07-08T12:46:34.110+09:00新ConoHaのオブジェクトストレージにAjaxを使ってアップロードする<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgVef0ddtM_G0IzzTvvSCbsUsRngV-EUEDy2XXBhGBAvsrtTK1ejGW53YNbllxXvB9lVj6ke22ZsR35x866aNBoA62cpQuEHDCrRhenYQ-7JwjXOAPVPFRevcFfyoM4tj2pn21OduR-E1g/s1600/conoha.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="96" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgVef0ddtM_G0IzzTvvSCbsUsRngV-EUEDy2XXBhGBAvsrtTK1ejGW53YNbllxXvB9lVj6ke22ZsR35x866aNBoA62cpQuEHDCrRhenYQ-7JwjXOAPVPFRevcFfyoM4tj2pn21OduR-E1g/s320/conoha.png" width="320" /></a></div>
<br />
前回(<a href="http://naichilab.blogspot.jp/2015/07/conohaajax.html" target="_blank">新ConoHaのオブジェクトストレージ上のデータをAjaxで取得してみる</a>)の続き。<br />
<br />
次はAjaxによるアップロードを試します。<br />
<br />
<h3>
参考サイト</h3>
<ul>
<li><a href="http://blog.chmouel.com/2013/02/01/swift-with-cors-request/" target="_blank">Upload to OpenStack Swift via CORS/HTML5 request.</a><br />まさにやりたいことやってる。これを真似た。</li>
<li><a href="http://www.ioncannon.net/programming/1539/direct-browser-uploading-amazon-s3-cors-fileapi-xhr2-and-signed-puts/" target="_blank">Direct Browser Uploading – Amazon S3, CORS, FileAPI, XHR2 and Signed PUTs</a><br />Amazon S3にアップロードしてる。OpenStackSwiftとはちょっと違うみたい。</li>
<li><a href="https://www.conoha.jp/docs/identity-post_tokens.html" target="_blank">トークン発行 | ConoHa API Documentation</a><br />トークン発行方法を調べてたどり着いた。</li>
<li><a href="https://github.com/naichilab/cors-swift-example" target="_blank">cors-swift-example</a><br />アップロードサンプル画面のhtml,js,app</li>
</ul>
<h3>
コンテナの準備</h3>
アップロード先となるコンテナの準備をする。といっても前回の記事から何も変更なかった。<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiQ2tIv80EMVVPcf1ypIHMJ4rCx3EuREf2bclL5vQShsQaeBbt2msfD3N5Vnw-X-O2SAB5cu8YeiJwaEejiwBRyNklfe_yzsjHxFXuSAsMAD7z9Aa_gmC6kXHPVrQmTEnO2jl7USBbG87w/s1600/20150705001.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="280" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiQ2tIv80EMVVPcf1ypIHMJ4rCx3EuREf2bclL5vQShsQaeBbt2msfD3N5Vnw-X-O2SAB5cu8YeiJwaEejiwBRyNklfe_yzsjHxFXuSAsMAD7z9Aa_gmC6kXHPVrQmTEnO2jl7USBbG87w/s320/20150705001.png" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">アップロード先のコンテナ</td></tr>
</tbody></table>
必要なのは<b>X-Container-Meta-Access-Control-Allow-Origin</b>メタデータだけみたい。<br />
<h3>
サイトの準備</h3>
参考サイト4つ目のGitHubのソースを真似てWebページを作った。(http://localhost:3000/ のホストとしてアクセス)<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg9v2CASwqy1zeYPaergXRYLEX4xQ1QXwb4zurN-NZEouBzzBJJtIqqoeculqqEwS_0DkiWSl6HUoHdtYsNI0QbHBtjSKcY-u-8W1CjKlBskdq7MzF7vbpTz-_maffx_HIzKXXmqqESDjc/s1600/20150705002.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="220" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg9v2CASwqy1zeYPaergXRYLEX4xQ1QXwb4zurN-NZEouBzzBJJtIqqoeculqqEwS_0DkiWSl6HUoHdtYsNI0QbHBtjSKcY-u-8W1CjKlBskdq7MzF7vbpTz-_maffx_HIzKXXmqqESDjc/s320/20150705002.png" width="320" /></a></div>
<a href="https://github.com/naichilab/cors-swift-example/blob/master/app.js" target="_blank">https://github.com/naichilab/cors-swift-example/blob/master/app.js</a><br />
アップロード処理が書かれてるjsファイル。<br />
URL組み立ててtokenつけてPUTするだけっぽい。<br />
<br />
<h3>
トークンの発行</h3>
参考サイト3つ目のConoHaドキュメントを見てみると、トークン発行方法が書かれてる。<br />
ターミナルで下記コマンドを実行してトークンを取得する。<br />
<pre class="brush : plain ;">curl -i -X POST \
-H "Accept: application/json" \
-d '{"auth":{"passwordCredentials":{"username":"APIユーザー名","password":"APIユーザーパスワード"},"tenantId":"テナントID"}}' \
https://identity.tyo1.conoha.io/v2.0/tokens</pre>
長々としたJSONが返ってくるのでaccess->token->idをメモる。<br />
どうもトークンは一度発行すると24時間有効みたいですね。<br />
<br />
<h3>
アップロード実行</h3>
さきほど立ち上げたサイトのフォームに入力していく。<br />
<br />
<ul>
<li>StorageURL:ConoHaコントロールパネル->API->Object Storage Serviceエンドポイント</li>
<li>StorageToken:さきほどメモしたトークン</li>
<li>Container:コンテナ名</li>
</ul>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEihtasp0FP73EOD651gpZ30GaIAkXxZD04f94bxhzaSdOtye0Mstk7bJU7XI3HsAO9m_TAvHu_IOE5uct2XsaevBjqk8CWmPjHbknlBlCbhswDU4YmMu5RtiDvNzqH9C4WBeuXyJgH9gzM/s1600/20150705003.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="108" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEihtasp0FP73EOD651gpZ30GaIAkXxZD04f94bxhzaSdOtye0Mstk7bJU7XI3HsAO9m_TAvHu_IOE5uct2XsaevBjqk8CWmPjHbknlBlCbhswDU4YmMu5RtiDvNzqH9C4WBeuXyJgH9gzM/s320/20150705003.png" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">こんな感じ</td></tr>
</tbody></table>
<br />
File Selectionのボタンからファイルを選ぶとアップロードが始まる。
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhvlMdEAZts9f1oWVk81vLDFyLQxMP2Wt3sP7ZOzlIjCa9wYWVpkoRUg6Fdx6WW8M49uPjaFZNSKxO4CslmaDnJXxH46Mf45tmr_-ioVr6OQQVQW_h2mFUMl-lOdVVTpShNG8YzmbSeWsw/s1600/20150705004.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="135" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhvlMdEAZts9f1oWVk81vLDFyLQxMP2Wt3sP7ZOzlIjCa9wYWVpkoRUg6Fdx6WW8M49uPjaFZNSKxO4CslmaDnJXxH46Mf45tmr_-ioVr6OQQVQW_h2mFUMl-lOdVVTpShNG8YzmbSeWsw/s320/20150705004.png" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">アップロード完了</td></tr>
</tbody></table>
<br /><br />すんなりとアップロードできた。<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiX_kmSmlm-JGaNwAA2gr-tu5Ey4mXuiGZq0LwNlEFsXu_sNumHYwIfZZvAHO90n2JU2OGlFZlXrV7L2SVXQR1KCaUhZSFVlJT-4YfeQb4xJ28HOsa0moVqxQdXUJm6bNOVOVNiubVhe8E/s1600/20150705005.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="281" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiX_kmSmlm-JGaNwAA2gr-tu5Ey4mXuiGZq0LwNlEFsXu_sNumHYwIfZZvAHO90n2JU2OGlFZlXrV7L2SVXQR1KCaUhZSFVlJT-4YfeQb4xJ28HOsa0moVqxQdXUJm6bNOVOVNiubVhe8E/s320/20150705005.png" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">CyberDuckで確認した。</td></tr>
</tbody></table>
<h2>
まとめ</h2>
<ul>
<li>ConoHaのAPIユーザーを使ってトークンを発行する。</li>
<li>コンテナにX-Auth-Tokenメタデータの設定は不要</li>
</ul>
あってんのかなこれ・・・<br />
<br /><br />だいぶやりたいことに近づいてきたような気がする。<br />
自分のサーバーでトークンを発行してブラウザに渡す→ブラウザが直接オブジェクトストレージにアップロードって感じでいいのかな。<br />
トークンが24時間有効だしこのままじゃ好きなファイルアップロードできちゃうからもーちょい厳しい認証が必要だよなぁ。<br />
どうしたらいいんかな。<br />
<br />
<h4>
関連記事</h4>
ConoHa関連の記事をまとめました。<br />
<a href="http://naichilab.blogspot.jp/2015/07/conoha_8.html" target="_blank">ConoHa関連まとめ</a>naichilabhttp://www.blogger.com/profile/11086576268699869652noreply@blogger.comtag:blogger.com,1999:blog-1059621179156545272.post-88464769767103168882015-07-04T22:15:00.000+09:002015-07-08T12:45:17.383+09:00新ConoHaのオブジェクトストレージ上のデータをAjaxで取得してみる<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgVef0ddtM_G0IzzTvvSCbsUsRngV-EUEDy2XXBhGBAvsrtTK1ejGW53YNbllxXvB9lVj6ke22ZsR35x866aNBoA62cpQuEHDCrRhenYQ-7JwjXOAPVPFRevcFfyoM4tj2pn21OduR-E1g/s1600/conoha.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="96" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgVef0ddtM_G0IzzTvvSCbsUsRngV-EUEDy2XXBhGBAvsrtTK1ejGW53YNbllxXvB9lVj6ke22ZsR35x866aNBoA62cpQuEHDCrRhenYQ-7JwjXOAPVPFRevcFfyoM4tj2pn21OduR-E1g/s320/conoha.png" width="320" /></a></div>
<br />
新ConoHaのオブジェクトストレージネタ、まだまだ続きます。<br />
前回の記事(<a href="http://naichilab.blogspot.jp/2015/07/conohaweb.html" target="_blank">新ConoHaのオブジェクトストレージにWeb公開可能なコンテナを作成する。</a>)ではオブジェクトストレージにアップロードしたファイルにブラウザから直接アクセスできるようになりました。<br />
<br />
今回は同じファイルをAjax(XmlHttpRequest)を使って取得してみます。<br />
<br />
<h3>
クロスドメインリクエストの制限</h3>
Ajaxで別ドメインのデータを取得しようとすると制限にひっかかります。<br />
参考:<a href="http://garafu.blogspot.jp/2013/07/blog-post.html" target="_blank">Ajax クロスドメインリクエスト 制約</a><br />
CORSってのを使うと上記制限を回避できるそうなので試してみます。<br />
<br />
<h3>
CORS(Cross-Origin Resource Sharing)</h3>
まだよくわかってませんがXHR(XmlHttpRequest)のクロスドメイン制約を回避する方法らしいです。<br />
新ConoHaのオブジェクトストレージはOpenStackSwiftで実現してるらしくCORSの設定が可能みたい。<br />
<br />
参考:<a href="http://docs.openstack.org/developer/swift/cors.html" target="_blank">CORS</a><br />
<br />
この制限を超えてファイルアップロードするのが目標ですがまずはGetだけできることを確認します。<br />
<h3>
サイトの用意</h3>
参考サイトに書かれた通りのHTMLを出力するページを用意しました。(Rails)<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjWpBxWfS1fBtpEhjVhW12fjcV__exYyqWWOn5_0Gq84LsljRgqdv785Ql0x0nS6s6M4KQM6ULZfyj7BLCz_Qp0pNlKvdEfziRtzFGs3j7K7sQ4MXEbq7Ae6UH40eFYOpDqLqTEai5C790/s1600/20150704001.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="254" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjWpBxWfS1fBtpEhjVhW12fjcV__exYyqWWOn5_0Gq84LsljRgqdv785Ql0x0nS6s6M4KQM6ULZfyj7BLCz_Qp0pNlKvdEfziRtzFGs3j7K7sQ4MXEbq7Ae6UH40eFYOpDqLqTEai5C790/s320/20150704001.png" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">XHRサンプルフォーム</td></tr>
</tbody></table>
このサイト(http://localhost:3000)からオブジェクトストレージ(https://object-storage.tyo1.conoha.io/)のファイルをAjaxで取得するにはクロスドメイン制約を抜ける必要があります。
<br />
<h3>
取得してみる</h3>
<a href="http://naichilab.blogspot.jp/2015/07/conohaweb.html" target="_blank">前回の記事</a>で用意したコンテナ(X-Container-Read = .r:* を設定したもの)はこんな感じ。<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgnLoymliCw6XwRPTCD78iCeq1-tnGc6o-7MYNat-onBdvEHYH9KA_W4jt-kTj1RABJw00E-qt3xEtu2-ldziwD772MQ-LRnkWm7oXPQ6TyT-nchJ6MeTMv1Ayl4nK6UN5btOgrqfLOaU4/s1600/20150704002.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="282" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgnLoymliCw6XwRPTCD78iCeq1-tnGc6o-7MYNat-onBdvEHYH9KA_W4jt-kTj1RABJw00E-qt3xEtu2-ldziwD772MQ-LRnkWm7oXPQ6TyT-nchJ6MeTMv1Ayl4nK6UN5btOgrqfLOaU4/s320/20150704002.png" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">コンテナのメタデータ</td></tr>
</tbody></table>
通信内容を確認したいのでChromeのDeveloperToolを開き、Networkタブを表示しておく。<br />
※"DisableCache"にチェックを入れておいたほうがいいと思う。これで結構悩んだ。<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhCq3oBvlieXCEqY6z5azjquo_YY01NE_-z2k73aFKGUDC2m7LYcdg26GjIb0Sw3DCwAK8eB09haodaOHsmG4HZen7uC8nE67iVW5ErJX9SW8PrXD4rTlIOcMuTcw4Hl80PcMk0EfJUbUc/s1600/20150704003.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="219" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhCq3oBvlieXCEqY6z5azjquo_YY01NE_-z2k73aFKGUDC2m7LYcdg26GjIb0Sw3DCwAK8eB09haodaOHsmG4HZen7uC8nE67iVW5ErJX9SW8PrXD4rTlIOcMuTcw4Hl80PcMk0EfJUbUc/s320/20150704003.png" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">ChromeのDeveloperTool</td></tr>
</tbody></table>
CyberDuckでhello.txtのURLをコピーし、フォームに入力してSubmit。<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgEaiN9f3osdG415WKdDcZsJRZ1yMjIqKilLmgVpgRHU4vTnsi8jbXEgNWkeusDjhgwYqIg1Nyn3gjJCdnWBq9IU-SKd0s2SxSk3zhFyDdyh_S8aUHj82gGQc4QRfLSlrpSf45QBAA_RBs/s1600/20150704004.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="216" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgEaiN9f3osdG415WKdDcZsJRZ1yMjIqKilLmgVpgRHU4vTnsi8jbXEgNWkeusDjhgwYqIg1Nyn3gjJCdnWBq9IU-SKd0s2SxSk3zhFyDdyh_S8aUHj82gGQc4QRfLSlrpSf45QBAA_RBs/s320/20150704004.png" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">取得(失敗)</td></tr>
</tbody></table>
DeveloperTool上はステータスコード200が帰ってきてるみたいだけど画面上にはstatus:0が出たまま。<br />
参考サイトによると何かがおかしいらしい。<br />
<pre class="brush : plain ;">参考サイトより:Assuming the request succeeds you should see the response header and body. If something went wrong the response status will be 0.</pre>
というかオブジェクトストレージ側に何も設定してないんだから取れたら逆に怖い。<br />
<br />
<h3>
コンテナにCORS用のメタタグを設定</h3>
コンテナに下記メタタグを設定する。
<br />
<pre class="brush : plain ;">X-Container-Meta-Access-Control-Allow-Origin: http://localhost:3000</pre>
ちなみにCyberDuckでメタタグを編集できた。Swiftクライアントいらなかったんじゃ?<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgrkHbfDaXbYZ37A7ZbS4gnhLgsM7OEpTnftinrOMRxr9qU_1ltlVpX_O5b2aaBE35SA6w6WAOUfQDAMfj-rcosm6XCvKelVlvSjkH4cmNXER2FfjThfA4xMWCv3Wl3AXIpppPHmP-_fec/s1600/20150704005.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="282" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgrkHbfDaXbYZ37A7ZbS4gnhLgsM7OEpTnftinrOMRxr9qU_1ltlVpX_O5b2aaBE35SA6w6WAOUfQDAMfj-rcosm6XCvKelVlvSjkH4cmNXER2FfjThfA4xMWCv3Wl3AXIpppPHmP-_fec/s320/20150704005.png" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">CyberDuckでメタタグ編集</td></tr>
</tbody></table>
再度取得してみる。<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiHySJQ_XvHDCwP0bC1pIatA_30LYpw35p9GqBNipMz122Xk9B7Qyn4mZLMVG2SBJ8GZRQJMLa6KSXi3XocrRi0hLJ1Ff9q03Ap8tjRLHIcjNokDWlrGDRWhntEongczNAcE_3xSqrCgT8/s1600/20150704006.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="223" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiHySJQ_XvHDCwP0bC1pIatA_30LYpw35p9GqBNipMz122Xk9B7Qyn4mZLMVG2SBJ8GZRQJMLa6KSXi3XocrRi0hLJ1Ff9q03Ap8tjRLHIcjNokDWlrGDRWhntEongczNAcE_3xSqrCgT8/s320/20150704006.png" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">再取得(成功)</td></tr>
</tbody></table>
とれた。<br />
Responseに”Access-Control-Allow-Origin:http://localhost:3000”が含まれるようになり、ファイルの内容も取得できてるのがわかる。<br />
<br />
<h3>
まとめ</h3>
オブジェクトストレージのファイルをAjax(XmlHttpRequest)を使って取得するには下記設定が必要だった。<br />
<ul>
<li>コンテナに<b>X-Container-Read</b>メタデータを設定する。</li>
<li>コンテナに<b>X-Container-Meta-Access-Control-Allow-Origin</b>メタデータを設定する。</li>
</ul>
<h3>
X-Auth-Token is 何?</h3>
<a href="http://docs.openstack.org/developer/swift/cors.html" target="_blank">参考サイト</a>を忠実にやってたんだけど結局X-Auth-Tokenは設定しなくても動いた。<br />
X-Auth-Tokenとはなんなんだろうか・・・<br />
今回はX-Container-Readで誰でも閲覧可能になってるからいらなかったんだろうか。<br />
最終的にはAjaxを使ったファイルアップロードまで実装したいのでそこらへん知る必要があるのかもしれない。<br />
<br />
だれか詳しい人教えてください。
<br />
<br />
さて次に試すのはAjaxによるアップロードかな。
<br />
<h4>
関連記事</h4>
ConoHa関連の記事をまとめました。<br />
<a href="http://naichilab.blogspot.jp/2015/07/conoha_8.html" target="_blank">ConoHa関連まとめ</a>naichilabhttp://www.blogger.com/profile/11086576268699869652noreply@blogger.comtag:blogger.com,1999:blog-1059621179156545272.post-64126450333824463042015-07-03T01:33:00.000+09:002015-07-08T12:45:12.260+09:00新ConoHaのオブジェクトストレージにWeb公開可能なコンテナを作成する。<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgVef0ddtM_G0IzzTvvSCbsUsRngV-EUEDy2XXBhGBAvsrtTK1ejGW53YNbllxXvB9lVj6ke22ZsR35x866aNBoA62cpQuEHDCrRhenYQ-7JwjXOAPVPFRevcFfyoM4tj2pn21OduR-E1g/s1600/conoha.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="96" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgVef0ddtM_G0IzzTvvSCbsUsRngV-EUEDy2XXBhGBAvsrtTK1ejGW53YNbllxXvB9lVj6ke22ZsR35x866aNBoA62cpQuEHDCrRhenYQ-7JwjXOAPVPFRevcFfyoM4tj2pn21OduR-E1g/s320/conoha.png" width="320" /></a></div>
<a href="http://naichilab.blogspot.jp/2015/07/swiftconoha.html" target="_blank">Swiftコマンドラインクライアントで新ConoHaのオブジェクトストレージに接続する。</a><br />
これの続き。<br />
<br />
SwiftコマンドでConoHaのオブジェクトストレージにアクセスできたのでコンテナの設定をしていく。<br />
<h3>
やりたいこと</h3>
コンテナにアップロードしたファイルを認証なしで取得できるようにしたい。<br />
(画像とかをブラウザから認証なしで見れるようにしたい)<br />
<br />
<h4>
参考</h4>
<a href="http://developer.openstack.org/api-ref-objectstorage-v1.html" target="_blank">Object Storage API v1 (SUPPORTED)</a><br />
よくわからんけど<b>X-Container-Read</b>ってメタデータに<b>.r:*</b>ってのをセットできればいいんかな?<br />
<br />
<a href="http://tmak-re-imagine.blogspot.jp/2013/02/openstack-swiftstatic-web.html" target="_blank">OpenStack SwiftでStatic Webサイトを作る</a><br />
ググってたら似たようなことしてる記事みつけた。<br />
<br />
<h3>
真似てみる</h3>
<pre class="brush : plain ;">$ swift post -r '.r:*' hogehoge</pre>
これだけでhogehogeコンテナの作成(すでにあれば更新)できるらしい。
<br />
<br />
<h3>
確認</h3>
コマンドラインで見る方法よくわからんしCyberDuckで見てみる。<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh5n-AfIKu_yTpjsJaO1ECZCWh9DIll-lbMz-a9pGFJZRvs3FQhsA4V-KAtC5oPlkhGjmIQY4r6HWvrFwl03hqjibFUYHyGsTMEyiS1VE-KhJL2ypLcWgpEKwt_qrLsbkddBvG45svEwNQ/s1600/20150702001.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="280" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh5n-AfIKu_yTpjsJaO1ECZCWh9DIll-lbMz-a9pGFJZRvs3FQhsA4V-KAtC5oPlkhGjmIQY4r6HWvrFwl03hqjibFUYHyGsTMEyiS1VE-KhJL2ypLcWgpEKwt_qrLsbkddBvG45svEwNQ/s320/20150702001.png" width="320" /></a></div>
それっぽく入ってる。<br />
<br />
<h3>
適当なファイルあげてみる</h3>
<pre class="brush : plain ;">$ swift upload hogehoge hello.txt </pre>
hogehogeコンテナにhello.txtをアップロード
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg4P1Z_ekUU3XfGX7FPwc6EoMmFsOQBetq1OjjU53b_4YTx5SAwpqbdN1YPozdgYI9PxjVnL4DKBQhDb6xqcRRdw2htYBrjz41wbWSmTZ_qBmC0uIO6H7wa_Cg19TApl2wzeOmxuehFCWs/s1600/20150702002.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="281" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg4P1Z_ekUU3XfGX7FPwc6EoMmFsOQBetq1OjjU53b_4YTx5SAwpqbdN1YPozdgYI9PxjVnL4DKBQhDb6xqcRRdw2htYBrjz41wbWSmTZ_qBmC0uIO6H7wa_Cg19TApl2wzeOmxuehFCWs/s320/20150702002.png" width="320" /></a></div>
入った。<br />
<br />
ブラウザで見れるかな<br />
URLどうなるんだろうと思ってCyberDuck触ってたらURLコピーする機能あった。便利。<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhlse6MNdU-5Fb5644sXal5er1N6p7M-yYYVdHA3aS7HixNWDy0adOiuxW9hOxKvL668ZU5AgnQXpPt2VnSPgcSRVQJjOiOlYGcDw5gev3y4wKJbfxDdt-6pn-JZPgQJxGyNmpntyYutN8/s1600/20150702003.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="220" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhlse6MNdU-5Fb5644sXal5er1N6p7M-yYYVdHA3aS7HixNWDy0adOiuxW9hOxKvL668ZU5AgnQXpPt2VnSPgcSRVQJjOiOlYGcDw5gev3y4wKJbfxDdt-6pn-JZPgQJxGyNmpntyYutN8/s320/20150702003.png" width="320" /></a></div>
<br />
アクセス!<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjqJTV4yv1dNffd6m2AW2QBy8XLRs2KAxk0z8EoOhuqJwrwtJVTSGrkTjmn4kotRQ0iM-Ni3c1ysuLEPBqZs9M-9cRDSZPW_srR0Giug5pg1IUclIdExNxtHIMw8HMlwv42sV-v3vPx3GY/s1600/20150702004.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="54" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjqJTV4yv1dNffd6m2AW2QBy8XLRs2KAxk0z8EoOhuqJwrwtJVTSGrkTjmn4kotRQ0iM-Ni3c1ysuLEPBqZs9M-9cRDSZPW_srR0Giug5pg1IUclIdExNxtHIMw8HMlwv42sV-v3vPx3GY/s320/20150702004.png" width="320" /></a></div>
<br />
見れたっぽい。<br />
なるほど。Web公開するだけなら簡単やね。<br />
<br />
<h3>
おまけ</h3>
コンテナ作成時にメタデータを指定しないと認証エラーしたしちゃんとできてるっぽいかな。<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiO1jOejKgp34ZTpmsoh0XljETm9lKHw-L7ml-Tpu5_btLam6ZFB2zRfDXdJGXoWrl5DKuOv5uQJqd5v32_gqW08yOyOytlrRwJYFSG9ZnY5r9tJjwOMK28_UFsDio2ydmSodbzNwVIVf4/s1600/20150702005.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="80" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiO1jOejKgp34ZTpmsoh0XljETm9lKHw-L7ml-Tpu5_btLam6ZFB2zRfDXdJGXoWrl5DKuOv5uQJqd5v32_gqW08yOyOytlrRwJYFSG9ZnY5r9tJjwOMK28_UFsDio2ydmSodbzNwVIVf4/s320/20150702005.png" width="320" /></a></div>
<br />
今日はここまで。
<br />
<h4>
関連記事</h4>
ConoHa関連の記事をまとめました。<br />
<a href="http://naichilab.blogspot.jp/2015/07/conoha_8.html" target="_blank">ConoHa関連まとめ</a>naichilabhttp://www.blogger.com/profile/11086576268699869652noreply@blogger.comtag:blogger.com,1999:blog-1059621179156545272.post-44183103699545794612015-07-02T23:51:00.000+09:002015-07-08T12:55:52.181+09:00Swiftコマンドラインクライアントで新ConoHaのオブジェクトストレージに接続する。<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgVef0ddtM_G0IzzTvvSCbsUsRngV-EUEDy2XXBhGBAvsrtTK1ejGW53YNbllxXvB9lVj6ke22ZsR35x866aNBoA62cpQuEHDCrRhenYQ-7JwjXOAPVPFRevcFfyoM4tj2pn21OduR-E1g/s1600/conoha.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="96" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgVef0ddtM_G0IzzTvvSCbsUsRngV-EUEDy2XXBhGBAvsrtTK1ejGW53YNbllxXvB9lVj6ke22ZsR35x866aNBoA62cpQuEHDCrRhenYQ-7JwjXOAPVPFRevcFfyoM4tj2pn21OduR-E1g/s320/conoha.png" width="320" /></a></div>
<br />
最近リニューアルした新ConoHa(<a href="https://www.conoha.jp/referral/?token=AsF9Gb25dzxE20HSTy6Oe7ACso4IyJyg3TmUN76a2FXoSkLx7s8-4U3" target="_blank">https://www.conoha.jp/</a>)のオブジェクトストレージを試してます。<br />
<br />
公式にはオブジェクトストレージを操作する方法として下記2つが紹介されていました。<br />
・CyberDuck(GUIクライアント)を使う方法<br />
・APIを叩く方法<br />
<h3>
CyberDuck</h3>
GUIクライアントは下記記事の通り接続できました。<br />
<a href="http://naichilab.blogspot.jp/2015/07/conohacyberduck401.html" target="_blank">新ConoHaのオブジェクトストレージにCyberDuckで接続しようとして401認証エラー</a><br />
コンテナの作成やファイルのアップロード、ダウンロードは問題なくできるんですがコンテナへの属性追加とか、細かい操作はできないみたい。<br />
やりたいのはそっちなので結局APIを使う方法に切り替えることに。<br />
<h3>
APIによる操作</h3>
APIを操作する方法はCURLを使う方法とSwiftコマンドラインクライアントを使う方法がある(?)っぽいです。(ちゃんと調べてない)<br />
swiftコマンドラインクライアントを使う方が、OpenStackSwiftの操作に適してそうな気がしたのでそっちを先に試してみます。<br />
<br />
インストールは下記記事の通り行いました。<br />
<a href="http://naichilab.blogspot.jp/2015/07/conohaopenstackswift.html" target="_blank">ConoHaのオブジェクトストレージを操作するためにOpenStackSwiftのコマンドラインクライアントをインストールする</a><br />
<br />
<h2>
swiftコマンドラインクライアントによる接続</h2>
<h4>
環境</h4>
MacOSX 10.10.3<br />
swift 2.4.0<br />
<br />
<h3>
環境変数ファイルを準備</h3>
~/swift_conoha
<br />
<pre class="brush : plain ;">export OS_AUTH_URL=https://identity.tyo1.conoha.io/v2.0 (認証サーバーのAPIエンドポイント)
export OS_TENANT_NAME=XXXXXXXXXXXX (テナント名)
export OS_USERNAME=XXXXXXXXXXXX (APIユーザー名)
export OS_PASSWORD=XXXXXXXXXXXX (APiユーザーパスワード)</pre>
<br />
<h3>
起動確認</h3>
<pre class="brush : plain ;">$ source ~/swift_conoha
$ swift stat
Auth versions 2.0 and 3 require python-keystoneclient, install it or use Auth
version 1.0 which requires ST_AUTH, ST_USER, and ST_KEY environment
variables to be set or overridden with -A, -U, or -K.</pre>
なんか怒られた。python-keystoneclientが足りない?
<br />
<h4>
python-keystoneclientをインストール</h4>
<pre class="brush : plain ;">$ sudo pip install python-keystoneclient</pre>
<h4>
再チャレンジ</h4>
<pre class="brush : plain ;">$ swift stat
Account: xx_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Containers: 1
Objects: 1
Bytes: 0
Containers in policy "policy-0": 1
Objects in policy "policy-0": 1
Bytes in policy "policy-0": 0
Meta Quota-Bytes: 107374182400
X-Timestamp: 1432076457.10619
X-Trans-Id: txa813d66137274a32b79f2-0055954ee7
Content-Type: text/plain; charset=utf-8
Accept-Ranges: bytes</pre>
いけたー
<br />
<br />
とりあえずここまで。
<br />
<h4>
関連記事</h4>
ConoHa関連の記事をまとめました。<br />
<a href="http://naichilab.blogspot.jp/2015/07/conoha_8.html" target="_blank">ConoHa関連まとめ</a>naichilabhttp://www.blogger.com/profile/11086576268699869652noreply@blogger.comtag:blogger.com,1999:blog-1059621179156545272.post-3272825011073681832015-07-02T00:46:00.001+09:002015-07-08T12:45:01.623+09:00ConoHaのオブジェクトストレージを操作するためにOpenStackSwiftのコマンドラインクライアントをインストールする<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh2tzx-8HFGV8zvR0PSYpjvSIWYa_34PCQ-igybFt26sW7LzO__81TeTTOBvEXtBBi3_rUumS7l_AHOSSjfczRi3ATrDjiPuxZ1hpj5ZmRRAA1gWxm4IH0T0WcOG6KGeeCZAOpoHlY0PQg/s1600/swift.jpeg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh2tzx-8HFGV8zvR0PSYpjvSIWYa_34PCQ-igybFt26sW7LzO__81TeTTOBvEXtBBi3_rUumS7l_AHOSSjfczRi3ATrDjiPuxZ1hpj5ZmRRAA1gWxm4IH0T0WcOG6KGeeCZAOpoHlY0PQg/s1600/swift.jpeg" /></a></div>
新ConoHaのオブジェクトストレージにも採用されてるらしいOpenStack Swift。<br />
コンテナの属性を触るのにAPI操作が必要そうなのでクライアントをインストールしてみる。<br />
いまいちよくわかってないのでメモしとくけど手順合ってるかは不明。<br />
<h4>
環境</h4>
・OS X Yosemite 10.10.3<br />
<h4>
参考</h4>
<a href="http://docs.openstack.org/ja/user-guide/content/install_clients.html" target="_blank">OpenStack コマンドラインクライアントのインストール</a><br />
<a href="https://swiftstack.com/docs/integration/python-swiftclient.html" target="_blank">https://swiftstack.com/docs/integration/python-swiftclient.html</a><br />
<h2>
前提ソフトウェアのインストール</h2>
<h3>
Python2.6かそれ以降</h3>
OS Xには最初から入ってた。<br />
<pre class="brush : plain ;">$ python -V
Python 2.7.6</pre>
※けどこのままではswiftクライアントが動かず、Homebrew経由で入れ直した。
<br />
<pre class="brush : plain ;">$ brew install python
$ python -V
Python 2.7.10</pre>
<h3>
setuptoolsパッケージ</h3>
これもOS Xには最初から入ってるらしい。<br />
<h3>
pipパッケージ</h3>
これも書かれてる通りのコマンド実行してみる。<br />
<pre class="brush : plain ;">$ sudo easy_install pip
・・・略
Installed /Library/Python/2.7/site-packages/pip-7.1.0-py2.7.egg
Processing dependencies for pip
Finished processing dependencies for pip</pre>
<br />
これでいいのかな。<br />
<br />
<h2>
クライアントのインストール</h2>
いろいろクライアントの種類があるみたいだけどオブジェクトストレージだけ操作できればいいからswiftclientってのをインストール。<br />
<pre class="brush : plain ;">$ sudo pip install python-swiftclient
・・・略
Successfully installed futures-3.0.3 python-swiftclient-2.4.0 requests-2.7.0 simplejson-3.7.3 six-1.9.0</pre>
<br />
動かしてみるもエラーで動かない<br />
<pre class="brush : plain ;">$ swift
Traceback (most recent call last):
File "/usr/local/bin/swift", line 7, in <module>
from swiftclient.shell import main
File "/Library/Python/2.7/site-packages/swiftclient/shell.py", line 31, in <module>
from swiftclient.multithreading import OutputManager
File "/Library/Python/2.7/site-packages/swiftclient/multithreading.py", line 22, in <module>
from six.moves.queue import PriorityQueue
ImportError: No module named queue</pre>
以下のページを発見。<br />
<a href="http://thornelabs.net/2014/10/29/installing-python-swiftclient-on-os-x-yosemite.html" target="_blank">Installing python-swiftclient on OS X Yosemite</a><br />
どうもMacに最初から入ってるpythonに問題があるらしい。<br />
上記ページの通り、下記コマンドを実行(一旦インストールしたものを削除する)<br />
<pre class="brush : plain ;">$ sudo pip uninstall futures
$ sudo pip uninstall requests
$ sudo pip uninstall simplejson
$ sudo pip uninstall six
$ sudo pip uninstall python-swiftclient</pre>
Homebrew経由でpythonをインストール
<br />
<pre class="brush : plain ;">$ brew install python</pre>
再度swiftclientをインストール
<br />
<pre class="brush : plain ;">$ pip install python-swiftclient</pre>
これでうまくいきました。
<br />
<pre class="brush : plain ;">$ swift --version
swift 2.4.0</pre>
めでたしめでたし。<br />
次はConoHaのオブジェクトストレージを操作してみる。
<br />
<br />
<h4>
関連記事</h4>
ConoHa関連の記事をまとめました。<br />
<a href="http://naichilab.blogspot.jp/2015/07/conoha_8.html" target="_blank">ConoHa関連まとめ</a>naichilabhttp://www.blogger.com/profile/11086576268699869652noreply@blogger.comtag:blogger.com,1999:blog-1059621179156545272.post-64793115719833991892015-07-01T11:44:00.000+09:002015-07-08T12:55:30.051+09:00新ConoHaのオブジェクトストレージにCyberDuckで接続しようとして401認証エラー<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjyp19YaxDu0JQjCPGyaUmUcyFpjXzh_AysjFhlPlpCqPLXQabXVhn-J0yz1s7hqdyLfNR-XyHOpJk4UN-cMG6s5N4EcI2MsZ8WeH5ErWMrSIKAAWLk3soGC0DOpFd0seC2V8COLdLNT0U/s1600/conoha.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="96" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjyp19YaxDu0JQjCPGyaUmUcyFpjXzh_AysjFhlPlpCqPLXQabXVhn-J0yz1s7hqdyLfNR-XyHOpJk4UN-cMG6s5N4EcI2MsZ8WeH5ErWMrSIKAAWLk3soGC0DOpFd0seC2V8COLdLNT0U/s320/conoha.png" width="320" /></a></div>
<br />
新しくなったConoHa(<a href="https://www.conoha.jp/referral/?token=AsF9Gb25dzxE20HSTy6Oe7ACso4IyJyg3TmUN76a2FXoSkLx7s8-4U3" target="_blank">https://www.conoha.jp/</a>)のオブジェクトストレージを試そうとしてる。<br />
旧ConoHaでは管理画面からコンテナの作成できたんだけど新ConoHaではできなくなってた。(APIやCyberDuckで操作してねって方針)<br />
とりあえず触ってみるためにCyberDuckを使ってみたら接続できなくてハマったのでメモ。<br />
<br />
<h2>
やったこと</h2>
一応ConoHaの接続ガイド(<a href="https://www.conoha.jp/guide/guide.php?g=49" target="_blank">https://www.conoha.jp/guide/guide.php?g=49</a>)があるんだけど旧ConoHa用となっててちょいちょい違う。<br />
<br />
最初こんな感じで設定したんだけどどうやっても401認証エラー。<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgM4lUPpjHFd_saxHiQDD6yxZ_uJiliGgMfQFQWxyL5B6xmYlawDYwp4ySzXawrF3uAQiljsSKAKxxNMp8oiRmDo8G7w7mug0hQUlgwl7flFHU_siDYhKpu2l0_aV0Ap5JP5oIK2rAR_8E/s1600/Error.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="166" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgM4lUPpjHFd_saxHiQDD6yxZ_uJiliGgMfQFQWxyL5B6xmYlawDYwp4ySzXawrF3uAQiljsSKAKxxNMp8oiRmDo8G7w7mug0hQUlgwl7flFHU_siDYhKpu2l0_aV0Ap5JP5oIK2rAR_8E/s320/Error.png" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">これじゃ繋がりません</td></tr>
</tbody></table>
どうにもこうにも接続できないのでConoHaの中の人に聞いてみたら即答いただけた。<br />
<blockquote class="twitter-tweet" lang="ja">
<div dir="ltr" lang="ja">
<a href="https://twitter.com/naichilab">@naichilab</a> ここはCyberduckのわかりづらいところなのですが、「サーバー」のところにObjectStore ServiceではなくIdentity Serviceのエンドポイントを入力する必要があります。お試し下さい。</div>
— ひろのぶ(Hironobu Saito) (@hironobu_s) <a href="https://twitter.com/hironobu_s/status/616065320696987648">2015, 7月 1</a></blockquote>
助かる・・・
<br />
ありがとうございます。<br />
<br />
新しい設定がこれ。<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhpxchE7GQ5KYd9BBDn-mi68G7IbgNC3pBOUGx9avIC1Dn4TPvsywjV84cWB_dGssxPNfVhXLydCr8nURstOJqCbV-KjNfuTd8QzDhkRZsJNdgfOqPThZmqGrWqgBRngKLQGjcQ_77gwzU/s1600/20150701001.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhpxchE7GQ5KYd9BBDn-mi68G7IbgNC3pBOUGx9avIC1Dn4TPvsywjV84cWB_dGssxPNfVhXLydCr8nURstOJqCbV-KjNfuTd8QzDhkRZsJNdgfOqPThZmqGrWqgBRngKLQGjcQ_77gwzU/s320/20150701001.png" width="251" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">これなら接続できる</td></tr>
</tbody></table>
すんなりと認証できた。<br />
<br />
さぁ難しいのはここからだ・・・<br />
<br />
<br />
<h4>
関連記事</h4>
ConoHa関連の記事をまとめました。<br />
<a href="http://naichilab.blogspot.jp/2015/07/conoha_8.html" target="_blank">ConoHa関連まとめ</a>naichilabhttp://www.blogger.com/profile/11086576268699869652noreply@blogger.comtag:blogger.com,1999:blog-1059621179156545272.post-34822451365784451002015-05-02T12:43:00.003+09:002015-05-03T23:09:24.661+09:00【本の感想】SQLアンチパターン【★★★★☆】<div class="separator" style="clear: both; text-align: center;">
<a href="http://www.amazon.co.jp/exec/obidos/ASIN/4873115892/naichilab-22/ref=nosim/" rel="nofollow" target="_blank"><img alt="SQLアンチパターン" src="http://ecx.images-amazon.com/images/I/41qHKrFZi0L._SY200_.jpg" style="border: none;" /><br />SQLアンチパターン</a></div>
<br />
だいぶ前にOracleのセミナーに参加したときオススメとして紹介されてた本書。<br />
長いこと後回しにしてたけどやっと購入して読んだ。<br />
<br />
リレーショナルデータベースの設計や利用に関する25のアンチパターンについて具体的な例をあげて分かりやすくまとめられてる。<br />
<ul>
<li>実現したいこと</li>
<li>やってしまいがちなアンチパターンの説明</li>
<li>見つけ方</li>
<li>用いてもよい場合</li>
<li>解決策</li>
</ul>
<div>
それぞれの章でこんな感じの内容が続く。</div>
<br />
役立つ内容も多く、何より楽しく読めたのがよかった。
データベース設計を何度かしたことがある人なら「あるあるネタ」としても楽しめるんじゃないかな。<br />
詳しい例をあげて説明されてるのでデータベース設計の経験がなくても十分理解できると思う。(正規化ぐらいは知っててほしいから応用情報取れるぐらいの人がいいかも)<br />
<br />
データベース設計する/したい人やSQL書くことがある人なら万人にオススメ。<br />
<br />
<br />
以下自分用メモ。<br />
<br />
<h2>
ジェイウォーク(信号無視)</h2>
一つのフィールドにカンマ区切りのリスト(文字列)を格納するやつ。<br />
<h4>
用いてもいい場合</h4>
カンマ区切りのデータが必要で、個別にアクセスする必要が全くない場合。<br />
<h4>
解決策</h4>
交差テーブル(多対多テーブル)を作成する。
<br />
<h4>
感想</h4>
自分ではさすがにやったことないけど結構やっちゃう人いるよね•••。<br />
<br />
<h2>
ナイーブツリー(素朴な木)</h2>
組織図とかの階層構造を実現するために同じテーブルの別レコードを親として参照すること。<br />
部署 [ <u>部署ID</u> , <u>親部署ID</u> , 部署名 ] みたいなテーブル。<br />
思慮が浅く親への参照しかもたない素朴(ナイーブ)な解決策らしい。隣接リストとも言う。
<br />
<h4>
用いてもいい場合</h4>
隣接リストがアプリケーションで求められているタスクに適している限りは有効。
<br />
<h4>
解決策</h4>
代替ツリーモデルを使用する。
<br />
<ul>
<li>経路列挙</li>
<li>入れ子集合</li>
<li>閉包テーブル</li>
</ul>
<h4>
感想</h4>
隣接リストの利用はシンプルだし色んな本やサイトに書かれている気がする。<br />
アンチパターンだと思ってなかったけど読んでたら確かにハマるなーって思った。<br />
自分が作ったことあるのは階層構造でも浅いものだったから問題なかったんだと思う。<br />
再帰クエリがサポートされてればそれを使って、なければ閉包テーブルを使うのがよさそう。<br />
<br />
<h2>
IDリクワイアド(とりあえずID)</h2>
何でもかんでも主キーにIDつけとけってアレ。<br />
めっちゃやってたわー。自然キーがあってもID列作って代替キーにしてたわー(遠い目<br />
<h4>
用いてもいい場合</h4>
ORMフレームワークの規約に従う場合。自然<br />
自然キーとなる項目があまりにも長すぎる場合。
<br />
<h4>
解決策</h4>
わかりやすい名前を付け、自然キー、複合キーを活用する。
<br />
<h4>
感想</h4>
自分は複合キーを主キーにすると外部キーとして使うときにキー項目すべてを持って行く必要があって、それが嫌(JOINのONとか長くなるし)だから代替キーとしてIDを付けてた。(もちろんUNIQUEKEYはつけるけど)<br />
それに対してこの本では下記のようにかかれててなるほどなーと思った。<br />
「このような開発者の複合キーへの拒否反応は、数学者が2次元や3次元の座標を使うことを拒否し、物体が1次元に存在するかのようにして計算を行うことに似ています。これによって幾何や三角法をはるかに単純化できることは事実ですが、対象とすべき現実世界の物体を正確に表すことはできません。」<br />
<br />
自然キーがある場合は代替キーは無意味だと深く納得したので今後の設計に生きると思う。<br />
<br />
<h2>
キーレスエントリ(外部キー嫌い)</h2>
外部キー?何それおいしいの?ってやつ。<br />
参照整合性が鬱陶しくて外部キーつけなかったり、そもそも外部キーなんて知らない人がデータベース設計してたり。(こういう場合はExcelみたいな使い方されてるけど)<br />
結局その整合性はアプリケーション側で保たないといけなくなってどうせ破綻するよねって話。
<br />
<h4>
用いてもいい場合</h4>
外部キーをサポートしていないDBMSを使う場合は仕方が無い。
<br />
<h4>
解決策</h4>
外部キー制約を宣言する。<br />
<h4>
感想</h4>
オーバーヘッドがーってどこかでみた気がするけどこの本で一蹴されてる。<br />
アプリケーション側でチェックのために余分なSelectしたりする事考えたら当たり前やなぁ。
<br />
<br />
<h2>
EAV(エンティティ・アトリビュート・バリュー)</h2>
Key-Value型のテーブルを用意し、属性を「行」に格納すること。
<br />
<h4>
用いてもいい場合</h4>
正当化する理由は簡単には見つからない。
<br />
<h4>
解決策</h4>
サブタイプのモデリングを行う。しっかり考えれば別の解決法はいくつかある。<br />
具体的には下記方法がある。<br />
<ul>
<li>シングルテーブル継承</li>
<li>具象テーブル継承</li>
<li>クラステーブル継承</li>
<li>半構造化データ</li>
</ul>
<h4>
感想</h4>
これは一度やっちゃったことあるので耳が痛い話だった。一生こんな設計はしまい。<br />
<br />
<h2>
ポリモーフィック関連</h2>
複数の親テーブルを参照するために二重目的の外部キーを使用すること。<br />
ある列にタイプを持たせ、そのタイプに応じて外部キー列の意味合いを変えるみたいな。
<br />
Comments ( comment_id , issue_type , issue_id , ... )とか<br />
<br />
この例だとissue_typeによってissue_idが参照するテーブルを切り替える。<br />
複数の無差別な関連を持つのでポリモーフィック関連と呼ばれるらしい。<br />
これをやってしまうと参照整合性(外部キー)制約をつけられない。
<br />
<h4>
用いてもいい場合</h4>
なし
<br />
<h4>
解決策</h4>
交差テーブルを作成する。共通の親テーブルの作成。<br />
<h4>
感想</h4>
これもやったことあるかな。悩むけど要件は満たせるしやっちゃうのよね。<br />
キーレスエントリのアンチパターンを防ぐためにもちゃんと交差テーブル用意しなきゃダメだね。
<br />
<br />
<h2>
マルチカラムアトリビュート(複数列属性)</h2>
複数の列を定義する。<br />
<br />
Bugs ( bug_id , description , tag1 , tag2 ,tag3 )<br />
<br />
個数が制限され、検索しづらくなり、タグの追加・削除が複雑になり、一意性の保証ができなくなり、いいことは全くない。
<br />
<h4>
用いてもいい場合</h4>
同じテーブルを参照するが、意味合いが違う場合のみ利用可能。
Bugs ( bug_id , description , 報告作業者ID, 修正作業者ID , 確認作業者ID ) みたいな。<br />
<br />
これはそもそも各列の意味が違うから根本的に違うと思うけど・・・
<br />
<h4>
解決策</h4>
従属テーブルを作成する。
BugTags ( bug_id , tag )<br />
<h4>
感想</h4>
人の作ったMSAccessとか開いてみるとこうなってること多いよね。Excel風。<br />
<br />
<h2>
メタデータトリブル(メタデータ大増殖)</h2>
スケーラビリティを高める目的で、テーブルや列をコピーすること。<br />
2008年バグテーブル、2009年バグテーブル、2010年バグテーブル、、、みたいな。<br />
<h4>
用いてもいい場合</h4>
過去データを最新のデータから分離するようなアーカイブ目的の場合。
<br />
<h4>
解決策</h4>
パーティショニングと正規化を行う。<br />
水平パーティショニング(またはシャーディング)はDBMSが対応していれば可能。<br />
垂直パーティショニングはBLOBやText等、サイズが大きい列を別テーブルに逃がしたりすること。<br />
<br />
または従属テーブルの導入を行う。<br />
<h4>
感想</h4>
これもやりがち。水平パーティショニングは使えるRDBMSが限られてるし膨大な件数を扱う場合はどうするのがいいんだろうなーって思いながら読んでた。<br />
<br />
<h2>
ラウンディングエラー(丸め誤差)</h2>
floatやdouble使うと誤差でるよねって話。<br />
<h4>
用いてもいい場合</h4>
intやnumberより大きな値を扱わなければいけない場合。科学技術計算とか。<br />
<h4>
解決策</h4>
numericデータ型を使用する。<br />
<h4>
感想</h4>
これはデータベースに限った話じゃないね。<br />
<br />
<h2>
サーティワンフレーバー(31のフレーバー)</h2>
列に入る値を列定義で限定する。<br />
Check制約やドメイン、ユーザ定義型など。<br />
入れたい値の種類が増えるときかなり大変なことに。入れられる値を簡単には確認できないのも面倒だし。<br />
<h4>
用いてもいい場合</h4>
有効値の変更が不要だと断言できる場合。(左/右、有効/無効、オン/オフ等)<br />
<h4>
解決策</h4>
参照テーブルを用意し、限定する値をデータで指定する。<br />
<h4>
感想</h4>
bool型がないRDBMSだとintフィールドを定義してCheck制約で0,1に限定したりするなぁ。bool以外で値を限定したい場合は参照テーブル用意してるし大丈夫かな。<br />
<br />
<h2>
ファントムファイル(幻のファイル)</h2>
画像をはじめとする大容量メディアファイルは物理ファイルとして保存することが必須と思い込む。<br />
(物理ファイルとして保存することがアンチパターンなのではない。色々な方法を検討せずに物理ファイルとして保存すべき!と思い込むことがアンチパターン)<br />
<h4>
用いてもいい場合</h4>
大容量ファイルを外部ファイルとして保存することはいくつも正当な理由がある。<br />
<ul>
<li>データベースの容量を減らせる</li>
<li>データベースのバックアップ時間、容量を減らせる</li>
<li>外部ファイルならプレビューや編集が用意</li>
</ul>
<h4>
解決策</h4>
<div>
必要に応じてBLOB型を採用する。</div>
<div>
物理ファイルもBLOBも一長一短あるので目的に合わせて選択する。</div>
<h4>
感想</h4>
あまりにも収集する画像が膨大すぎてDBストレージに保存するって選択肢が選べないことがあったなぁ。<br />
<br />
<h2>
インデックスショットガン(闇雲インデックス)</h2>
インデックスを使わない。もしくは全フィールドにインデックスを貼ること。<br />
インデックスを使うと遅くなると思っていたり、よくわからないから闇雲に貼ったり。<br />
<h4>
用いてもいい場合</h4>
汎用的なデータベースを設計する場合でどのようなクエリを最適化しなければいけないか不明な場合。(この場合、不要なインデックスを削除する必要が出てくる)<br />
<h4>
解決策</h4>
「MENTOR」の原則に基づいてインデックス管理を行う。<br />
<ul>
<li>Measure(測定)</li>
<li>Explain(解析)</li>
<li>Nominate(指名)</li>
<li>Test(テスト)</li>
<li>Optimize(最適化)</li>
<li>Rebuild(再構築)</li>
</ul>
<h4>
感想</h4>
MENTORは聞いたことあったけどちゃんと読んだのは初めてだった。<br />
インデックスの調整が必要になったら参考にしてみよう。<br />
<br />
<h2>
フィア・オブ・ジ・アンノウン(恐怖のunknown)</h2>
NULLと一般値の混同。<br />
nullはfalseだろうとか、null+空文字は空文字だろうとか、そういう思い込み。<br />
<h4>
用いてもいい場合</h4>
NULLは適切に扱う。<br />
<h4>
解決策</h4>
<div>
NULLを一意な値と認識して扱う。</div>
<div>
ISNULLやCOALESCEをうまく使う。</div>
<div>
必要ならNOTNULLを正しく定義する。</div>
<h4>
感想</h4>
null怖いって人ごく稀にいるよね。<br />
まぁこれは慣れて覚えるしかない。<br />
<br />
<h2>
アンビギュアスグループ(あいまいなグループ)</h2>
一度のgroup byでmax(date)とmax(id)とかを取ってくること。<br />
max(date)となった行とmax(id)となった行は一致するとは限らない。<br />
<h4>
用いてもいい場合</h4>
曖昧な動作が問題にならない場合。<br />
<h4>
解決策</h4>
曖昧でない列を使用する。<br />
<ul>
<li>関数従属性のある列にのみクエリを実行する。</li>
<li>相関サブクエリを使用する</li>
<li>導出テーブルを使用する</li>
<li>JOINを使用する</li>
<li>他の列に対しても集約関数を使用する</li>
<li>グループごとにすべての値を連結する</li>
</ul>
<h4>
感想</h4>
誰もが経験済みなんじゃないかな。<br />
自分は導出テーブルを使うことがほとんど。<br />
<br />
<h2>
ランダムセレクション</h2>
ランダムに行を取得したい時、全件ソートをしてしまう。<br />
select * from bugs order by rand() limit 1; みたいな。<br />
<h4>
用いてもいい場合</h4>
<div>
データセットが十分に少ない場合。</div>
<h4>
解決策</h4>
<div>
特定の順番に依存しない。</div>
<div>
<ul>
<li>1と最大値の間のランダムなキー値を選択する(キー値が欠番な場合がある)</li>
<li>欠番の穴の後にあるキー値を選択する(結果が偏る)</li>
<li>すべてのキー値を受け取り、ランダムに1つを選択する(アプリケーション側で処理)</li>
<li>オフセットを用いてランダムに行を選択する(Limit,rownum等を利用)</li>
<li>ベンダー依存の方法(SQLServerのTABLESAMPLE等)</li>
</ul>
</div>
<h4>
感想</h4>
ランダムな行を返したいってあまり必要になったことないなぁ。<br />
LIMIT使うのが現実的か。<br />
<br />
<h2>
プアマンズ・サーチエンジン(貧者のサーチエンジン)</h2>
Like '%hoge%' や正規表現で全文検索を行うこと。<br />
インデックスが活用できずフルスキャンとなる。<br />
<h4>
用いてもいい場合</h4>
めったに使用しないクエリ。<br />
<h4>
解決策</h4>
<div>
適切なツールを利用する。</div>
<div>
<ul>
<li>ベンダー拡張</li>
<li>テキストインデックス</li>
<li>RDBSから独立した全文検索エンジンの利用</li>
</ul>
</div>
<h4>
感想</h4>
<div>
検索機能とかを実装するためには必要になるんだろうなぁ。</div>
<div>
ベンダー拡張が使えるならそれが手軽かなと思った。<br />
<br /></div>
<h2>
スパゲッティクエリ</h2>
SQLクエリ数は少ないほうがいいと思い込んでいる。<br />
複雑な問題をワンステップで解決しようとし、<br />
3つのシンプルなクエリより複雑な1つのクエリを書いてしまうこと。<br />
<h4>
用いてもいい場合</h4>
単一のクエリをデータソースにひも付けて表示する場合など。<br />
<h4>
解決策</h4>
<div>
分けて書く。</div>
<div>
全く同じ結果を求めるなら単純なほうが優れている。</div>
<h4>
感想</h4>
<div>
うーんよく見かける。プログラミングと同じ、シンプルに考えよう。<br />
<br /></div>
<h2>
インプリシットカラム(暗黙の列)</h2>
タイプ数を減らす目的で*を多用する。<br />
<h4>
用いてもいい場合</h4>
<div>
試しにSQLを実行する場合など。</div>
<h4>
解決策</h4>
<div>
列名を明示的に指定する。</div>
<h4>
感想</h4>
<div>
これは以前から徹底してるので問題なし。<br />
<br /></div>
<h2>
リーダブルパスワード(読み取り可能パスワード)</h2>
データベースに読み取り可能な形でパスワードを保存する。<br />
ユーザが入力したパスワードを読み取り可能な形でSQLクエリを作る。<br />
<h4>
用いてもいい場合</h4>
<div>
作成するアプリケーションが外部アプリケーションのクライアントとなる場合のみ。</div>
<h4>
解決策</h4>
<div>
ソルトをつけてパスワードをハッシュ化する</div>
<h4>
感想</h4>
パスワードそのままDBに突っ込むのは問題外だしハッシュ化したものを保存するけど、ソルトの扱いに毎回悩む。どこにソルトを置いておくのかとか。<br />
<br />
<h2>
SQLインジェクション</h2>
動的なSQLを記述し、未検証な入力をコードとして実行する。<br />
<h4>
用いてもいい場合</h4>
<div>
なし</div>
<h4>
解決策</h4>
<div>
誰も信用しない。</div>
<div>
<ul>
<li>変数のパラメータ化</li>
<li>プリペアドステートメント</li>
<li>コードレビュー</li>
</ul>
</div>
<h4>
感想</h4>
<div>
変数のパラメータ化は当然だけどどこまでやっても怖いよね。<br />
<br /></div>
<h2>
シュードキー・ニートフリーク(擬似キー潔癖症)</h2>
擬似キー列(連番とか)の欠番を気にして埋める。<br />
<h4>
用いてもいい場合</h4>
なし<br />
<h4>
解決策</h4>
<div>
欠番は埋めない。</div>
<div>
ロールバックや行削除によって空いた欠番を埋めてはならない。</div>
<h4>
感想</h4>
<div>
当たり前。</div>
<div>
値を埋めろという上司を説得する方法まで載ってて面白かった。<br />
<br /></div>
<h2>
シー・ノー・エビル(臭いものに蓋)</h2>
戻り値を 確認せず、肝心な部分を見逃す。<br />
connection生成時、SQL実行時等、適切なタイミングでエラーチェックを行えばすぐに問題は解決できる。それらを怠って「なぜか動かない」って騒ぐのがアンチパターン。<br />
<h4>
用いてもいい場合</h4>
<div>
エラーに対して何もする必要がない場合。(アプリケーション終了時など)</div>
<h4>
解決策</h4>
<div>
エラーや戻り値を適切にチェックし、エラーから優雅に解決する。</div>
<h4>
感想</h4>
<div>
ちゃんとやるのは大事だけど例外対応って結構めんどうだよね。<br />
<br /></div>
<h2>
ディプロマティック・イミュニティ(外交特権)</h2>
システム開発のベストプラクティス(ソース管理を行い、テストを実行し、ドキュメントを整備するなど)を行うに当たって、SQL(特にDDLなど)を特別扱いして別扱いにすること。DBAが専任で存在する場合などに別扱いされやすい。<br />
<h4>
用いてもいい場合</h4>
<div>
その場限りのコードの場合。</div>
<h4>
解決策</h4>
<div>
包括的に品質問題に取り組む。</div>
<div>
品質保証(Quality Assurance)のために下記を行う。</div>
<div>
<ul>
<li>プロジェクト要件の明確な定義・文書化</li>
<li>要件に対する解決策の設計・構築</li>
<li>解決策が要件を満たしていることの確認・テスト</li>
</ul>
</div>
<h4>
感想</h4>
たしかにデータベース管理者ってプログラマからすると特殊な位置に見えるよね。仲良く仕事しましょ。<br />
<br />
<h2>
マジックビーンズ(魔法の豆)</h2>
MVCのM(モデル)を単純化する目的で、モデルをアクティブレコードそのものとしてしまう。<br />
<h4>
用いてもいい場合</h4>
プロトタイプ作成時<br />
<h4>
解決策</h4>
モデルがアクティブレコードを「持つ」ようにする。<br />
ドメインモデルの使用。<br />
<h4>
感想</h4>
なんとなーく言いたいことはわかるけどそもそもMVCをちゃんと理解できてないのでよくわからなかった。<br />
<br />
<h2>
砂の城</h2>
想定不足。性能問題や障害が起きた時どう対処するかといったポリシーが策定されていない。<br />
<h4>
用いてもいい場合</h4>
コストとの兼ね合いでどこまで行うか検討する。<br />
<h4>
解決策</h4>
<div>
どのようなトラブルが起こりうるかを可能な限り想定しておく。</div>
<div>
トラブルは「当然起きる日常的なもの」と認識する。</div>
<h4>
感想</h4>
<div>
これもデータベースに限った話ではなくシステム運用全般に関わる話やね。</div>
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://www.amazon.co.jp/exec/obidos/ASIN/4873115892/naichilab-22/ref=nosim/" rel="nofollow" target="_blank"><img alt="SQLアンチパターン" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhu-2AMW__Z2FFv_uQZgE-zOHX95w65dITZXwuJ6OE7818WzUUibPYYf6pFWgtTZDhgwNLgOiZEyJdfpf7ZMw1cLNC3eMk4k8WQ29Dkoo4W0YUr2h5Jl3MUb24hTSQhiuJx4YBVmjPXTFA/s320/%E3%83%80%E3%82%A6%E3%83%B3%E3%83%AD%E3%83%BC%E3%83%89.jpg" style="border: none;" /><br />SQLアンチパターン</a></div>
<br />
ええ本でした。naichilabhttp://www.blogger.com/profile/11086576268699869652noreply@blogger.comtag:blogger.com,1999:blog-1059621179156545272.post-76014080842079109512015-04-30T23:27:00.001+09:002015-05-01T12:44:59.548+09:00【Unity、Mac】エディタをVisual Studio Codeに変更する。<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjI7k6BZNPce08W0BeScWhOMTfM15DkuozaVllElNEUGIGjIjiegtuI7-Bq4B5du-7l38D-ugeo_OgdpHLEFKE7nTegB1BejU6NSAiJ1YgUu1JBkPjF2WI7CkUfhpKkQKY5wzLtdVZGYm0/s1600/20150430001.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjI7k6BZNPce08W0BeScWhOMTfM15DkuozaVllElNEUGIGjIjiegtuI7-Bq4B5du-7l38D-ugeo_OgdpHLEFKE7nTegB1BejU6NSAiJ1YgUu1JBkPjF2WI7CkUfhpKkQKY5wzLtdVZGYm0/s1600/20150430001.png" /></a></div>
昨夜発表されて話題になってたVisualStudioCode、インストールしてUnityで使えるように設定してみました。<br />
今日はMacでのお話。Windowsの人はVisualStudio使ってるだろうし。<br />
<h4>
環境</h4>
OS X Yosemite 10.10.3<br />
Unity 5.0.0 f4<br />
Visual Studio Code 0.1.0<br />
<h3>
Visual Studio Codeのインストール</h3>
<a href="https://code.visualstudio.com/">https://code.visualstudio.com/</a><br />
ここから落としてきて解凍。アプリケーションフォルダに移動するだけ。<br />
簡単に起動した。<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhlUlDWN0NoIsL5m3otAgtDeAZV3mNhysR2uKHDuVemHNzNrCG55vGCnixf2BD4U_ZDLjxaY53qtukFFzf2k7_sQC6vLgZzx5aKWWMbKRkHeAZyHMb0AqQBpThihZJjEYvqNDkiZdpvJG0/s1600/20150430002.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhlUlDWN0NoIsL5m3otAgtDeAZV3mNhysR2uKHDuVemHNzNrCG55vGCnixf2BD4U_ZDLjxaY53qtukFFzf2k7_sQC6vLgZzx5aKWWMbKRkHeAZyHMb0AqQBpThihZJjEYvqNDkiZdpvJG0/s1600/20150430002.png" height="238" width="320" /></a></div>
<h3>
Unityでの設定</h3>
Unityメニュー->Unity->Preferences<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjOaUf2Xva94s_YZrmfKkjIWoiEVCCYCqfbcqk3dCzSyYNikN2tZn9zK8VLmIcRIB09n2P8or153K2bRu5h_XZT-Yyp997k3Gccl29OJbxdrhASL0uIxJJeU4DZk0JCSPtMwAiPrlXvkOE/s1600/20150430003.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjOaUf2Xva94s_YZrmfKkjIWoiEVCCYCqfbcqk3dCzSyYNikN2tZn9zK8VLmIcRIB09n2P8or153K2bRu5h_XZT-Yyp997k3Gccl29OJbxdrhASL0uIxJJeU4DZk0JCSPtMwAiPrlXvkOE/s1600/20150430003.png" /></a></div>
<br />
External Tools->External Script Editor->Browse...<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiV_cdJv7yzd2J-M2-OMU8boMqLu6LbpxkicdwGPAPFYYkOSDBoOfT3bSKe6cf2h7Vo5sUljgdY7qHtO4Iof9u3WjLn2wVYKnrUvvMXxyyKmrzz7liyanpE_7KP02LHxJ7XSXEBiMZJWKM/s1600/20150430004.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiV_cdJv7yzd2J-M2-OMU8boMqLu6LbpxkicdwGPAPFYYkOSDBoOfT3bSKe6cf2h7Vo5sUljgdY7qHtO4Iof9u3WjLn2wVYKnrUvvMXxyyKmrzz7liyanpE_7KP02LHxJ7XSXEBiMZJWKM/s1600/20150430004.png" height="265" width="320" /></a></div>
<br />
Visual Studio Code.appを選択<br />
<h3>
ソリューションファイルを開く</h3>
Unityメニュー->Assets->Sync MonoDevelop Project<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiQBo8cD8Y8Foes6trcZBbWDpksrZiGyEajt1513cAHxy04EjQ8y7P_UPxdKBJyxlSscYawNm9Yz4WEYHrMgqxJ9n-mTGFhkm06L_uCgAnhh4x1UWiLGTnFTssCn_z08TdcSTOmiKgOf5o/s1600/20150430005.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiQBo8cD8Y8Foes6trcZBbWDpksrZiGyEajt1513cAHxy04EjQ8y7P_UPxdKBJyxlSscYawNm9Yz4WEYHrMgqxJ9n-mTGFhkm06L_uCgAnhh4x1UWiLGTnFTssCn_z08TdcSTOmiKgOf5o/s1600/20150430005.png" height="253" width="320" /></a></div>
<br />
これでソリューションファイル(.sln)が作られてVisual Studio Codeで開かれる。<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhU-vuiH_ZXePPG3ugpCG7wtwjl3tpJD_0d64P1s-vbBy1v9I88HBGT9Uhl43s2l8JTyxaxzvx8vb5PF4mnuFiPhvodQVGwQSRl0e8mM4K_ybrQUIn0yoUYSt_TCmecSWZgd1ZUbmMgweA/s1600/20150430006.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhU-vuiH_ZXePPG3ugpCG7wtwjl3tpJD_0d64P1s-vbBy1v9I88HBGT9Uhl43s2l8JTyxaxzvx8vb5PF4mnuFiPhvodQVGwQSRl0e8mM4K_ybrQUIn0yoUYSt_TCmecSWZgd1ZUbmMgweA/s1600/20150430006.png" height="238" width="320" /></a></div>
File->Open(もしくはCommand+Option+O) でフォルダを開くダイアログを開き、<br />
Unityのプロジェクトフォルダ(.slnファイルがあるフォルダ)を選択する。<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjHvSxiHQ1nefw6om8kY_TcLdYjKSY5RiwzTpzU80dxdNuObDfuQmpoYR0z8jbZBfszIs2ng5Xqc9qRkEm2PB4l-YZgAXP8hz1c-dm9tXNqszL_BstgQVYuAvN55cIUnbuGI6v6h4QkszE/s1600/20150430007.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjHvSxiHQ1nefw6om8kY_TcLdYjKSY5RiwzTpzU80dxdNuObDfuQmpoYR0z8jbZBfszIs2ng5Xqc9qRkEm2PB4l-YZgAXP8hz1c-dm9tXNqszL_BstgQVYuAvN55cIUnbuGI6v6h4QkszE/s1600/20150430007.png" height="188" width="320" /></a></div>
Visual Studio Codeの一番下に pick a project と表示されていると思うのでそれを押す。<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgCLEkxZGqfq1vsj1_msWSMpfaVB-1oxjdzsYSoJFEgl5c2YZw-ulJcVx7HTtA29AP58vChgRd9tDmbdf7DA9R9jvers1CABRh8z003s3Jg4bULsVgg8-xsWQ6_HLtyLMjyWADHZsNdiMA/s1600/20150430008.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgCLEkxZGqfq1vsj1_msWSMpfaVB-1oxjdzsYSoJFEgl5c2YZw-ulJcVx7HTtA29AP58vChgRd9tDmbdf7DA9R9jvers1CABRh8z003s3Jg4bULsVgg8-xsWQ6_HLtyLMjyWADHZsNdiMA/s1600/20150430008.png" /></a></div>
<br />
ソリューションファイルを選択します。どっちでも良さそう?短い方を選んだ。<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgpNH8uK9uClCceU471ABiJurRvC0n_5n8-VQZvYwsJVWt4EAjN5HuaXje4sTKM38b5Wu2rm0LP62kmGp58LmrPqiff1QtqOqSiNG20SAi2k5DzShhTDbT5xgqZSXhOiEGYgRBIBAzye9A/s1600/20150430009.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgpNH8uK9uClCceU471ABiJurRvC0n_5n8-VQZvYwsJVWt4EAjN5HuaXje4sTKM38b5Wu2rm0LP62kmGp58LmrPqiff1QtqOqSiNG20SAi2k5DzShhTDbT5xgqZSXhOiEGYgRBIBAzye9A/s1600/20150430009.png" height="120" width="320" /></a></div>
変なコンソール立ち上がったけど使いそうにないので閉じとく。<br />
(どうみてもブラウザのデバッグウィンドウだな•••)<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi7FwBLx0bxmW-gA-ulQ8E7_HowE0w4XMmMYhT31AMwKC7iU8T_e-hYQB8cNjFFSF4BtYldEGhRCi1gBGvoxyNaThmY6VVjMdZue3Tw75qyUfbEYsZYifxux1c1BlU15yiXbbfpkCy-uPc/s1600/20150430010.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi7FwBLx0bxmW-gA-ulQ8E7_HowE0w4XMmMYhT31AMwKC7iU8T_e-hYQB8cNjFFSF4BtYldEGhRCi1gBGvoxyNaThmY6VVjMdZue3Tw75qyUfbEYsZYifxux1c1BlU15yiXbbfpkCy-uPc/s1600/20150430010.png" height="214" width="320" /></a></div>
<br />
肝心のエディタ側はエラー出てる。<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgAVqv-FYyuo2YFJpcl4KXH0gm6lY-0ZFHoe284SUhvot0oTY1Kj-UTDCyEcttUX0OCLbwU56lm1upF2mh1t1YDa7rn83M_lUrhPsrOoljhvQQP_3fkoU25eFM2kN_kD-LFnrYkzxKBdcQ/s1600/20150430011.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgAVqv-FYyuo2YFJpcl4KXH0gm6lY-0ZFHoe284SUhvot0oTY1Kj-UTDCyEcttUX0OCLbwU56lm1upF2mh1t1YDa7rn83M_lUrhPsrOoljhvQQP_3fkoU25eFM2kN_kD-LFnrYkzxKBdcQ/s1600/20150430011.png" height="15" width="320" /></a></div>
<pre class="brush : plain ;">Error: Cannot start Omnisharp because Mono version >=3.10.0 is required</pre>
<h3>
エラー対応(monoのインストール)</h3>
UnityについてくるMonoが古いからこのエラー出るっぽい。<br />
terminal.app起動して brew install mono<br />
<pre class="brush : plain ;">$ brew install mono
==> Downloading https://downloads.sf.net/project/machomebrew/Bottles/mono-3.10.0
######################################################################## 100.0%
==> Pouring mono-3.10.0.yosemite.bottle.tar.gz
==> Caveats
To use the assemblies from other formulae you need to set:
export MONO_GAC_PREFIX="/usr/local"
==> Summary
🍺 /usr/local/Cellar/mono/3.10.0: 1128 files, 218M</pre>
<h3>
エディタ再起動</h3>
もいちどSync MonoDevelop Project でOK<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgygYipZDwXVWGHJONkSfsfpF5rWLwwSIwQtp4xqG-T82EUjLa_CBBO7DfVOJe9L6KJeyqpAbbQTliyTqaDBuvHeRKNl8EvBLUeCuFhOkHfewtTLaZgaGwcgfk9ltUky6O6v1KWLpG5GuU/s1600/20150430012.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgygYipZDwXVWGHJONkSfsfpF5rWLwwSIwQtp4xqG-T82EUjLa_CBBO7DfVOJe9L6KJeyqpAbbQTliyTqaDBuvHeRKNl8EvBLUeCuFhOkHfewtTLaZgaGwcgfk9ltUky6O6v1KWLpG5GuU/s1600/20150430012.png" height="238" width="320" /></a></div>
エラーなく起動した〜。<br />
<br />
<h2>
感想</h2>
<div>
難なくインストールできた。</div>
<div>
ちょー軽いしgitも認識してくれるみたいでいい感じ。</div>
<div>
変数や関数の参照数を出してくれるのもいいね。インラインで参照元も見れるし。</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgL227W08t1h36n9lXW3jQxdng4BvWGbPlgro6sIRxdf2vc2CPc7qeg8Bv3myb2dGwzry4SSkGiPd2YrgkdXl53WWSEyAlUwRe_f4UlfMZM28NhdQ8etH0dQ9F-r1neX8cNIPBJ85Ciuf8/s1600/20150430013.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgL227W08t1h36n9lXW3jQxdng4BvWGbPlgro6sIRxdf2vc2CPc7qeg8Bv3myb2dGwzry4SSkGiPd2YrgkdXl53WWSEyAlUwRe_f4UlfMZM28NhdQ8etH0dQ9F-r1neX8cNIPBJ85Ciuf8/s1600/20150430013.png" height="238" width="320" /></a></div>
<div>
Atomと同じくCommand+Pでなんでも検索ボックスが出てくるみたい。</div>
<div>
(画像はコード整形したかったから検索してみた図)</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh_ucaCaWGlcu_OTY6_izpAHtkO7GhKpylTlC96gD7Ga1xBayq8Z16DYUVfAOPILemozc8c8SVaudYlvN2zV9ez6ajF-Odi1_MqlBCbfp4w3wyBt4P1O1tLQRYE6hrDlKquRgysadORNV0/s1600/20150430014.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh_ucaCaWGlcu_OTY6_izpAHtkO7GhKpylTlC96gD7Ga1xBayq8Z16DYUVfAOPILemozc8c8SVaudYlvN2zV9ez6ajF-Odi1_MqlBCbfp4w3wyBt4P1O1tLQRYE6hrDlKquRgysadORNV0/s1600/20150430014.png" height="238" width="320" /></a></div>
<div>
やりたいことができない場合はとりあえずこれ開いて適当に入力してみるといいかも。</div>
<div>
<br /></div>
<div>
そのうちAtomのようにプラグインパラダイスになるんやろなー。</div>
<div>
しばらく使ってみましょい。<br />
<br />
<h4>
20150501追記</h4>
</div>
<div>
今まで<a href="http://naichilab.blogspot.jp/2014/01/unitymonomonodevelop.html" target="_blank">痛MonoDevelop</a>を使ってたみなさん。</div>
<div>
痛VSCodeにも出来るみたいですよ~。</div>
<div>
<br /></div>
<div>
標準MonoDevelopだと日本語入力ができなくて不便だから痛MonoDevelopにしたはずなのに。</div>
<div>
あれ、いなくなると寂しい・・・って方、下記を参考にどうぞ。</div>
<div>
<br /></div>
<div>
<a href="http://anz-note.tumblr.com/post/117784986426/vscode-visual-studio-code" target="_blank">[VSCode]痛Visual Studio Codeにしとく? | 杏z 学習帳</a></div>
<div>
<br /></div>
naichilabhttp://www.blogger.com/profile/11086576268699869652noreply@blogger.comtag:blogger.com,1999:blog-1059621179156545272.post-83506323710942951732015-04-01T01:43:00.000+09:002015-04-01T16:20:10.402+09:00ConoHaのVPSにchefを使ってRails環境を構築する。~knife solo 準備編~<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjufErzhTLcxk6_DsL39NsaHUJWqLtRtAZuVJ6HsDRuJQWku7ANdMJsbKeoKvyA6cIKX1duy6Pj6Vrpw65Kpt5yLfiFjGKfSZktwnOH_6_6ib-KizGAjzOvQRS_B2kSMM5-72pfrgZwuPo/s1600/logo_global_conoha.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjufErzhTLcxk6_DsL39NsaHUJWqLtRtAZuVJ6HsDRuJQWku7ANdMJsbKeoKvyA6cIKX1duy6Pj6Vrpw65Kpt5yLfiFjGKfSZktwnOH_6_6ib-KizGAjzOvQRS_B2kSMM5-72pfrgZwuPo/s1600/logo_global_conoha.png" /></a></div>
<br />
最近ConoHaのVPSで遊んでます。<br />
安いしコンソール見やすいしいい感じ。<br />
<br />
最終的にはRails環境を作りたいんだけどせっかくなのでChefを使ってやってみる。<br />
ただLinuxもあまり分からないから調べることだらけ。<br />
なんとかchef soloが通るとこまで行ったので一旦メモしておきます。<br />
<br />
まだまだ頭の中整理できてないので変なこと書いてたら指摘お願いします。<br />
<br />
<h2>
やりたいこと</h2>
・標準テンプレートOSをインストールしたConoHaVPSに対して、<br />
・できるだけ少ない手順で knife solo cook が通るようにする。<br />
まずはここまで。<br />
<br />
<h2>
環境</h2>
MacBookAir 2013 Mid<br />
OS X Yosemite 10.10.2<br />
Chef Solo 12.1.1(どうやって入れたか覚えてない)<br />
<h2>
手順</h2>
<h3>
VPSの作成</h3>
OSはテンプレートイメージの CentOS 6.5 を選択。<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjJZ9a3Uq6_PFBLOA7KfemyJgBtEBDm4iMYOhNUE7JnvtKu2mGK9UNQNPdf4DFGy8r91bHaTfqWHw12INVZGCTSI9e0-A1aaY0UVDwLLVjGqxFZodaG9d5h_jG5rcng2cjy-ddFQZlRzkw/s1600/20150330001.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjJZ9a3Uq6_PFBLOA7KfemyJgBtEBDm4iMYOhNUE7JnvtKu2mGK9UNQNPdf4DFGy8r91bHaTfqWHw12INVZGCTSI9e0-A1aaY0UVDwLLVjGqxFZodaG9d5h_jG5rcng2cjy-ddFQZlRzkw/s1600/20150330001.png" height="250" width="320" /></a></div>
<br />
残りは全部安いやつ。<br />
1〜2分待てば起動する。<br />
<br />
<h3>
ローカル側でSSH接続準備</h3>
ConoHaコントロールパネルからSSH Private Keyをダウンロードする。<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjt1facHNWk7KE4TI0cCXNDrJtR0gArGZ7TkWNZCp8IzcS0ZFgzyA92cYNOt0_qPM2pZAkXTQo8vQ0rSmbk3_47f0a5z_VYna-hD5S8IGQGdBfUmOVsl2e3HT8nObXx4AwKGkB2TtDroBE/s1600/20150330002.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjt1facHNWk7KE4TI0cCXNDrJtR0gArGZ7TkWNZCp8IzcS0ZFgzyA92cYNOt0_qPM2pZAkXTQo8vQ0rSmbk3_47f0a5z_VYna-hD5S8IGQGdBfUmOVsl2e3HT8nObXx4AwKGkB2TtDroBE/s1600/20150330002.png" /></a></div>
1234567-1.keyみたいな名前。とりあえずホームディレクトリ(~/)に置く。<br />
ここからローカル側Macのターミナル.appで操作<br />
<br />
<b>ローカル側(MacBookAir)</b>
<br />
<pre class="brush : plain ;">$ cd ~
// ~/.sshフォルダが存在しない場合はフォルダ作成
$ mkdir .ssh
$ chmod 700 .ssh/
$ mv 1234567-1.key .ssh/conoha_private_key
$ cd .ssh/
$ chmod 600 conoha_private_key
$ vi config
//configファイルは下記のようにして保存。すでにある場合は追記する。
Host conoha
HostName [VPSのIP]
IdentityFile ~/.ssh/conoha_private_key
User root
//うまく設定できていれば下記コマンドでssh接続ができるはず。
$ ssh conoha
[root@v[xxx-xxx-xxx-xxx]] ~]# logout
Connection to xxx.xxx.xxx.xxx closed.
//成功</pre>
<br />
どうもConoHaの標準テンプレートを使うとVPS作成時に選んだ秘密鍵でrootへSSH接続できるみたい。 この鍵はVPSをホストしている共有サーバ部分への接続にも使うらしいからあまり共用しない方がいい気がするけどよくわからん。もう少し詳しくなってから考えることにする。<br />
<br />
<h3>
VPS側でChef接続用ユーザーの作成</h3>
Chefを実行するためにはSSH接続可能且つパスワードなしでsudo可能なユーザーが必要らしい。ConoHa側に専用の'chef'ユーザーを作成し、rootに設定済みの公開鍵をchefユーザーでも利用可能にする。(rootへのssh接続は後で禁止します)<br />
<br />
<b>ローカル側(MacBookAir)</b>
<br />
<pre class="brush : plain ;">$ ssh conoha</pre>
<br />
ここからVPSのrootユーザーでの操作<br />
<br />
<b>VPS側(rootユーザー)</b>
<br />
<pre class="brush : plain ;"># adduser chef
# passwd chef
ユーザー chef のパスワードを変更。
新しいパスワード: <パスワードを決めて入力>
新しいパスワードを再入力してください: <パスワードを再入力>
passwd: 全ての認証トークンが正しく更新できました。
# visudo
// 下記1行を追加(パスワードなしでsudoできるようになる)
root ALL=(ALL) ALL ←この行の下に
chef ALL=(ALL) NOPASSWD:ALL ←この行を追加
// 保存して閉じる(esc -> :wq)
# mkdir /home/chef/.ssh
# cp ~/.ssh/authorized_keys /home/chef/.ssh/
# cd /home/chef/.ssh/
# ls -la
drwxr-xr-x 2 root root 4096 4月 1 00:08 2015 .
drwx------ 3 chef chef 4096 4月 1 00:08 2015 ..
-rw------- 1 root root 445 4月 1 00:08 2015 authorized_keys
# chown chef:chef authorized_keys
# chown chef:chef .
# chmod 600 authorized_keys
# chmod 700 .
# ls -la
drwx------ 2 chef chef 4096 4月 1 00:08 2015 .
drwx------ 3 chef chef 4096 4月 1 00:08 2015 ..
-rw------- 1 chef chef 445 4月 1 00:08 2015 authorized_keys</pre>
これでVPS側は一旦終わり。logoutで抜ける。
<br />
<br />
<b>ローカル側(MacBookAir)</b>
<br />
<pre class="brush : plain ;">$ cd ~/.ssh/
$ vi config
//root接続用になってるところをchefに書き換える
Host conoha
HostName [VPSのIP]
IdentityFile ~/.ssh/conoha_private_key
User root ← chefに書き換える
//これでchefユーザーでssh接続できるはず。
$ ssh conoha
[chef@vxxx-xxx-xxx-xxx ~]$ who am i
chef pts/0 2015-04-01 00:17
[chef@vxxx-xxx-xxx-xxx ~]$ logout
Connection to xxx-xxx-xxx-xxx closed.
//成功</pre>
これでchef solo実行準備が整った。<br />
<br />
<h3>
ChefでHello World</h3>
Chef-Soloを使ってVPSにHello Worldしてみることまでやってみます。<br />
<h4>
キッチン(リポジトリ)の作成</h4>
knife solo initコマンドを使ってリポジトリ(cookbookを入れていくための箱)を作ります。<br />
<br />
<b>ローカル側(MacBookAir)</b>
<br />
<pre class="brush : plain ;">$ cd ~
$ knife solo init conoha-helloworld
WARNING: No knife configuration file found
Creating kitchen...
Creating knife.rb in kitchen...
Creating cupboards...
Setting up Berkshelf...</pre>
<br />
こんな感じでファイルが生成されてるはず<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgJHKTHTPqp7HnnSa6ADfv0g8NC3b0tnJXJWp2LLv-kAEtzxIMsaHArEZ8Y_r1n5vOOKgUuHsd3mOU9z_cF6jLM06YhrK6SEpFkPxLf5oD-w65s0maF2R8szK3T2zJ8sAnd9KAlLbTENPI/s1600/20150330004.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgJHKTHTPqp7HnnSa6ADfv0g8NC3b0tnJXJWp2LLv-kAEtzxIMsaHArEZ8Y_r1n5vOOKgUuHsd3mOU9z_cF6jLM06YhrK6SEpFkPxLf5oD-w65s0maF2R8szK3T2zJ8sAnd9KAlLbTENPI/s1600/20150330004.png" /></a></div>
<br />
<h4>
Cookbookの作成</h4>
knife cookbook createコマンドを使ってクックブック(レシピを入れるための箱)を作ります。<br />
<br />
<b>ローカル側(MacBookAir)</b>
<br />
<pre class="brush : plain ;">$ cd ~/conoha-helloworld/
$ knife cookbook create helloworld -o site-cookbooks/</pre>
<br />
-oで指定した site-cookbooksフォルダにhelloworldクックブックが生成されました。<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjl5Qf9STJd222GueG8JiIu8udLIXO00_3h4pIO0bi9L7nv9wV8AH8axNYhDIKQAaOqK7c4FxWwFkFDz0tWyvFcbo7C2j2tb6Obj0jr6uRBTtEEqtDkJjd7TgBjB0AUuRhRuMX2161SLxo/s1600/20150330005.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjl5Qf9STJd222GueG8JiIu8udLIXO00_3h4pIO0bi9L7nv9wV8AH8axNYhDIKQAaOqK7c4FxWwFkFDz0tWyvFcbo7C2j2tb6Obj0jr6uRBTtEEqtDkJjd7TgBjB0AUuRhRuMX2161SLxo/s1600/20150330005.png" height="320" width="138" /></a></div>
<br />
<h4>
レシピの編集</h4>
helloworldクックブックの中にあるrecipes/default.rbを修正します。<br />
<pre class="brush : ruby ;">log "Hello World!!"</pre>
これだけ。
<br />
<h3>
VPSにchefをインストール</h3>
さて、レシピを作ったので実行準備。knife solo prepareコマンドを使ってvpsにchefをインストールします。<br />
<br />
<b>ローカル側(MacBookAir)</b>
<br />
<pre class="brush : plain ;">$ knife -v
Chef: 12.1.1
$ knife solo prepare conoha
WARNING: No knife configuration file found
Bootstrapping Chef...
//インストールログがずらずらと
Thank you for installing Chef!
Generating node config 'nodes/conoha.json'...
//インストール完了
//vps側で確認してみる。
$ ssh conoha</pre>
<br />
<b>VPS側(chefユーザー)</b>
<br />
<pre class="brush : plain ;">[chef@vxxx-xxx-xxx-xxx ~]$ knife -v
Chef: 12.1.1</pre>
これでVPSにchefをインストールできました。<br />
<br />
<h3>
VPSにレシピを適用</h3>
knife solo prepareを行ったときに、conoha-helloworld/nodes/conoha.jsonが生成されています。<br />
このホストに対してどのcookbookを適用するかを管理するファイル。<br />
すでにhelloworldクックブックは作成済みなのでこれを適用するようにconoha.jsonを書き換えます。
<br />
<pre class="brush : plain ;">{
"run_list": [
"recipe[helloworld]" ←この1行を追加
],
"automatic": {
"ipaddress": "conoha"
}
}</pre>
あとはcookするだけ。<br />
knife solo cookコマンドでレシピを適用します。
<br />
<b>ローカル側(MacBookAir)</b>
<br />
<pre class="brush : plain ;">$ cd ~/conoha-helloworld/
$ knife solo cook conoha
Running Chef on conoha...
Checking Chef version...
Installing Berkshelf cookbooks to 'cookbooks'...
Resolving cookbook dependencies...
Uploading the kitchen...
Generating solo config...
Running Chef...
Starting Chef Client, version 12.1.1
Compiling Cookbooks...
Converging 1 resources
Recipe: helloworld::default
* log[Hello World!!] action write
Running handlers:
Running handlers complete
Chef Client finished, 1/1 resources updated in 1.36169233 seconds</pre>
Hello World出ましたね!今日はここまで。<br />
ここから先はcookbook作成→レシピ編集→conoha.jsonに追記→knife solo cook conohaの繰り返しです。<br />
Rails環境の構築ができたらまた整理します。
naichilabhttp://www.blogger.com/profile/11086576268699869652noreply@blogger.comtag:blogger.com,1999:blog-1059621179156545272.post-68436911199189289982015-03-30T01:16:00.000+09:002015-03-31T00:35:32.896+09:00【Chef】NoMethodError undefined method `[]' for nil:NilClassChefでRuby環境作るときに起きたエラーの対応メモ
<br />
<br />
<h3>
まとめ</h3>
<br />
<ul>
<li>Chefでknife solo cookしたときに下記エラーが出た</li>
<li>NoMethodError undefined method `[]' for nil:NilClass</li>
<li>原因は未定義のattributeを呼び出してたからだった(typo)</li>
</ul>
<br />
<h3>
エラー内容</h3>
<pre class="brush : ruby ;">================================================================================
Recipe Compile Error in /home/vagrant/chef-solo/cookbooks-3/ruby-env/recipes/default.rb
================================================================================
NoMethodError
-------------
undefined method `[]' for nil:NilClass
Cookbook Trace:
---------------
/home/vagrant/chef-solo/cookbooks-3/ruby-env/recipes/default.rb:24:in `block in from_file'
/home/vagrant/chef-solo/cookbooks-3/ruby-env/recipes/default.rb:23:in `from_file'
Relevant File Content:
----------------------
/home/vagrant/chef-solo/cookbooks-3/ruby-env/recipes/default.rb:
17: mode 0644
18: owner node['ruby-env']['user']
19: group node['ruby-env']['group']
20: not_if "grep rbenv ~/.bash_profile", :environment => { :'HOME' => "/home/#{node['ruby-env']['user']}"}
21: end
22:
23: directory "/home/#{node['ruby-env']['user']}/.rbenv/plugins" do
24>> owner node['rbenv-env']['user']
25: group node['rbenv-env']['group']
26: mode 0755
27: action :create
28: end
29:
30: git "/home/#{node['ruby-env']['user']}/.rbenv/plugins/ruby-build" do
31: repository node['ruby-env']['ruby-build_url']
32: action :sync
33: user node['ruby-env']['user']</pre>
<br />
<h3>
原因</h3>
attributes/default.rtを下記のように書いてたんだけど<br />
<pre class="brush : ruby ;">default['ruby-env']['user'] = "vagrant"
default['ruby-env']['group'] = "vagrant"
default['ruby-env']['version'] = "2.1.1"
default['ruby-env']['rbenv_url'] = "https://github.com/sstephenson/rbenv"
default['ruby-env']['ruby-build_url'] = "https://github.com/sstephenson/ruby-build"</pre>
<br />
呼び出し箇所はこうなってた
<br />
<pre class="brush : ruby ;">owner node['rbenv-env']['user']
group node['rbenv-env']['group']</pre>
<h3>
対応</h3>
呼び出し部分を正しく書き換えて('ruby-env'に)完了<br />
<br />
<br />
そりゃエラーするわなって感じだけどもう少しわかりやすいエラーメッセージだと助かるな〜。<br />
typoに気づけず5分悩んだ。naichilabhttp://www.blogger.com/profile/11086576268699869652noreply@blogger.comtag:blogger.com,1999:blog-1059621179156545272.post-46914069349950486672015-03-12T18:35:00.000+09:002015-03-12T18:35:00.514+09:00MSBuildをコマンドで呼ぶとエラーする。 MSB4019 Microsoft.WebApplication.targets が見つかりませんでしたJenkinsでMSBUILD呼んだらこんなエラーでた。<br />
<pre class="brush : plain ;">error MSB4019: インポートされたプロジェクト
"C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v10.0
\WebApplications\Microsoft.WebApplication.targets" が見つかりませんでした。
<Import> 宣言のパスが正しいかどうか、
およびファイルがディスクに存在しているかどうかを確認してください。</pre>
<br />
VS開いてビルドは通るのに下記コマンドで実行するとエラーするんだよなぁ。。<br />
<pre class="brush : plain ;">MSBuild hogehoge.csproj /p:Configuration=Release /t:Rebuild</pre>
<br />
エラーに出てるパスを見てみると怪しいとこ発見。
<br />
<pre class="brush : plain ;">//↓ある
C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v12.0\WebApplications
//↓ない
C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v10.0\WebApplications</pre>
v12からv10へWebApplicationsフォルダをコピーしたら動いた。naichilabhttp://www.blogger.com/profile/11086576268699869652noreply@blogger.comtag:blogger.com,1999:blog-1059621179156545272.post-54344645231413520102015-03-04T02:46:00.000+09:002015-03-04T07:34:22.613+09:00Unity5リリース!無料版でゲームエンジンの全ての機能が利用可能に!<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgc1n7vO4dST9726bYN2SniL1wVDgw3DZI-FjTeSzun9RPIeQ7SDrnxRVLvLJhYYc_wjcK2p7H3fZktFCQjYqXGLsFN_ng-XjfxIZG4fs_pBtInmyJCnMCy7_n_CX45BgjxC7b7GYdPYG8/s1600/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88+2015-03-04+1.37.52.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgc1n7vO4dST9726bYN2SniL1wVDgw3DZI-FjTeSzun9RPIeQ7SDrnxRVLvLJhYYc_wjcK2p7H3fZktFCQjYqXGLsFN_ng-XjfxIZG4fs_pBtInmyJCnMCy7_n_CX45BgjxC7b7GYdPYG8/s1600/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88+2015-03-04+1.37.52.png" height="207" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">おっさんドヤ顔</td></tr>
</tbody></table>
プレスリリース:<a href="http://japan.unity3d.com/blog/press/20150304" target="_blank">UNITY、ゲームエンジンUNITYの最新バージョン UNITY 5を公開</a><br />
<br />
Unity5、ついにリリースされましたね!<br />
<br />
Unity4のときはProでしか使えなかった機能のほとんどがFree版でも使えるようになったようです。数百ドル分のアセットを買わないとできなかったことが全て無料でできるようになったと考えるととてもありがたいですね!<br />
<br />
物理ベースシェーディングやレンダーテクスチャ、プロファイラにポストプロセスエフェクト、、、全てPersonal(無料版)で制限なく使えます。アセットバンドルも試してみよう。あと個人的に2Dのスプライトパッカーが使えるようになったのが嬉しい!<br />
<br />
Proの機能がほぼ全て無料版におりて来ちゃった感じです。<br />
<br />
<br />
間違った事書いてるかもなので詳細は下記リンクから直接確認お願いしますー。<br />
<h3>
UnityPersonal(無料版)とProfessionalの違い</h3>
<a href="http://unity3d.com/jp/get-unity" target="_blank">http://unity3d.com/jp/get-unity</a><br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://unity3d.com/jp/get-unity" imageanchor="1" style="margin-left: 1em; margin-right: 1em;" target="_blank"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhFF5-fj5yFabej2OAK75nzZ5suEqQp7_Hrf5csMI9zQ8lniGUVdR2rbcWCNrL9c1IcHYHk5X0JyrbXG1Kvsf7GVyd-zRqhhiXSnwxPn0RNdxypkP-AWpQUn7cgl751JBRJtN7_JIMX-fA/s1600/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88+2015-03-04+2.08.32.png" height="228" width="320" /></a></div>
<br />
<h3>
Unity 5エンジンの概要(Personalでも全て利用可能)</h3>
<a href="http://unity3d.com/jp/unity/engine-features" target="_blank">http://unity3d.com/jp/unity/engine-features</a><br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://unity3d.com/jp/unity/engine-features" imageanchor="1" style="margin-left: 1em; margin-right: 1em;" target="_blank"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhhGhmnarYF-uMCFl-weqTPeOZNPxG-yJn6NsPMWmYRi_9Nm9yEy7XWb3AsuhhQ_bQvtUQl1-mj1vwVgtpGdwEwifKiRuPOfa312KNOFkvND_ziBniActRTv3OZH8COMIPcp8Y382hPtmo/s1600/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88+2015-03-04+2.12.22.png" height="258" width="320" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<br />
<h3>
Android / iOS / その他のプラットフォーム</h3>
気になるAndroid / iOSへの書き出しですが、前年度に$100,000以上の売り上げが無い場合は無料版で制限無く書き出せるようです。(Unityロゴのスプラッシュスクリーンが表示されます)<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh0Z76JNU1rOfKOywVMrBx9RbsH6Y_El_Rd2cWtYDaC3y6TUnI5Dj730OabvFRCC9vRfCp2OMC9dr9WUVGZCll5YUI1Skp5s33g9ilZzTXiTiUitMt21ZK8gWs4ixh9qAbGDsY6Wd0e8Jc/s1600/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88+2015-03-04+2.21.02.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh0Z76JNU1rOfKOywVMrBx9RbsH6Y_El_Rd2cWtYDaC3y6TUnI5Dj730OabvFRCC9vRfCp2OMC9dr9WUVGZCll5YUI1Skp5s33g9ilZzTXiTiUitMt21ZK8gWs4ixh9qAbGDsY6Wd0e8Jc/s1600/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88+2015-03-04+2.21.02.png" height="243" width="320" /></a></div>
<br />
Android/iOS Proが存在するのはあくまでも前年度$100,000以上売り上げたパブリッシャーが購入必須になるだけみたいですね。すばらしい。<br />
<br />
<h3>
すでにUnity5Pro買っちゃったんだけど…って人は?</h3>
すでにUnity5プレオーダーをした方で、Unity5 Personal版を利用したい方は条件さえ満たせば払い戻しを受ける事ができるようです。<br />
詳しくは下記FAQを確認ください。<br />
<br />
<a href="http://unity3d.com/jp/unity/faq" target="_blank">http://unity3d.com/jp/unity/faq</a><br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj2WhnJTodVL27YPSCRILjXFVvUy6YzjBonSOcOXMnImRo4A-SK3ZZtukaX3EE_6-raHjbZn3zRNPXykVo4D4ooPi_lcRoteoIVNnVF0TDfHRAyFA3hbqdZ-oNzZ-09x5PYBqPQU7ioSA4/s1600/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88+2015-03-04+7.31.52.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj2WhnJTodVL27YPSCRILjXFVvUy6YzjBonSOcOXMnImRo4A-SK3ZZtukaX3EE_6-raHjbZn3zRNPXykVo4D4ooPi_lcRoteoIVNnVF0TDfHRAyFA3hbqdZ-oNzZ-09x5PYBqPQU7ioSA4/s1600/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88+2015-03-04+7.31.52.png" height="148" width="320" /></a></div>
<br />
<br />
<h3>
Unity仮面からのありがたい一言</h3>
<br />
<blockquote class="twitter-tweet" lang="ja">
誤解させてすまない!iOS/Android のProfessionalとPersonalの違いはスプラッシュスクリーンだけだ!
個人開発者は存分にPersonal EditionでiOS/Android開発をしてくれ!<br />
— Unity仮面 (@unitymask) <a href="https://twitter.com/unitymask/status/572812833534025728">2015, 3月 3</a></blockquote>
<script async="" charset="utf-8" src="//platform.twitter.com/widgets.js"></script>
<br />
<blockquote class="twitter-tweet" lang="ja">
はっきり言えば、個人開発者は無料でUnityの全ての機能が様々なプラットフォームで使えるから自由にゲーム開発をしてくれってことだ!ケチくさい事は言わん!<br />
— Unity仮面 (@unitymask) <a href="https://twitter.com/unitymask/status/572816428581056512">2015, 3月 3</a></blockquote>
<script async="" charset="utf-8" src="//platform.twitter.com/widgets.js"></script>
Unity5を使っておもいっきりゲーム開発を楽しみましょう!<br />
<br />
<br />
他のUnity関連記事もぜひご覧ください。<br />
→<span style="color: blue;"><a href="http://naichilab.blogspot.jp/2013/05/unity.html" target="_blank">Unity系記事まとめ</a></span>naichilabhttp://www.blogger.com/profile/11086576268699869652noreply@blogger.comtag:blogger.com,1999:blog-1059621179156545272.post-87161206849327519832015-03-01T03:25:00.000+09:002015-03-03T15:24:45.927+09:00【Unity】とっても簡単に扱えるBGM再生クラスを作ってみた。フェードイン、フェードアウト対応版<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjEggHKMWwFT9_5H3Ioa9_OGgcZRl5FwMFFc9kDvknU9fYTtno41OI1gav6an42Rk3i1IsikR7eZA5QKpau4ZLUxpCfSy9QgGbyt31ilkdKMc7dhpj6AELv74I2nYwDhcFc9PaDmEq1gss/s1600/volume.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjEggHKMWwFT9_5H3Ioa9_OGgcZRl5FwMFFc9kDvknU9fYTtno41OI1gav6an42Rk3i1IsikR7eZA5QKpau4ZLUxpCfSy9QgGbyt31ilkdKMc7dhpj6AELv74I2nYwDhcFc9PaDmEq1gss/s1600/volume.png" /></a></div>
こちらの記事(<a href="http://naichilab.blogspot.jp/2013/11/unityaudiomanager.html" target="_blank">【Unity】AudioManagerクラスを作ろう</a>)の改良版です。<br />
<br />
上記記事ではBGMの再生はできましたが、BGM切り替えがスムーズではありませんでした。また、オーディオファイルをインスペクタ上から一つ一つセットしなければいけないなど、いろいろと不満が残っていました。<br />
<br />
それらを解消すべく作り直してみたので紹介します。<br />
<br />
<h3>
ダウンロード</h3>
<h4>
UnityPackage</h4>
<div>
手っ取り早く使いたい方はこちら。</div>
<a href="https://github.com/naichilab/Unity-BgmManager/archive/master.zip" target="_blank">https://github.com/naichilab/Unity-BgmManager/archive/master.zip</a><br />
<h4>
ソースコード</h4>
GitHubで公開してます<br />
<a href="https://github.com/naichilab/Unity-BgmManager" target="_blank">https://github.com/naichilab/Unity-BgmManager</a><br />
<br />
これ以降は使い方の説明とかです。<br />
<br />
<h3>
やりたいこと</h3>
<ul>
<li>BGMを再生できること。</li>
<li>とにかく簡単に扱えること。</li>
<li>BGMのフェードイン、フェードアウトに対応すること。</li>
<ul>
<li>フェードインとは:音量0からゆっくり大きくなっていくこと</li>
<li>フェードアウトとは:音量がゆっくり小さくなっていくこと</li>
</ul>
<li>BGMのクロスフェードに対応すること。</li>
<ul>
<li>クロスフェードとは:フェードアウトとフェードインを組み合わせてBGM切り替えを行うこと</li>
</ul>
<li>フェード時間とかを調整できること。</li>
</ul>
<div>
意識したのはこれくらい。<br />
とりあえずBGMだけです。<br />
SEについてもそのうち作ろう。</div>
<br />
<h3>
サンプル</h3>
<iframe height="300" scrolling="no" seamless="" src="http://unityroom.com/games/play/366/1/300/300" style="border: none; margin: 0; overflow: hidden; padding: 0;" width="300"></iframe><br />
<div>
Hosted by <a href="http://unityroom.com/games/play/366" target="_blank">UnityRoom.com</a></div>
PlayボタンでBGM再生開始。<br />
他のBGMへ切り替える際、少し重なって聞こえると思います。これがクロスフェード。<br />
(Playを押してから音が出るまでにちょっと時間があるので分かりづらいかな?)<br />
<br />
<h3>
使い方</h3>
<h4>
Unityプロジェクトを開く</h4>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj9m7eVYFsoPDnus9_NmSaTfSPIspyiNT07TD1ISdidn-1N6RYR_ftN8JMsyL8LjKz-Yi0-cw23rod0yOAxfOXY5Zp6hx7edXRdWrxQ_YdhEtymjvvSVqB5kxE9H_yFNpke-e0GH1FbzGQ/s1600/20150301001.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj9m7eVYFsoPDnus9_NmSaTfSPIspyiNT07TD1ISdidn-1N6RYR_ftN8JMsyL8LjKz-Yi0-cw23rod0yOAxfOXY5Zp6hx7edXRdWrxQ_YdhEtymjvvSVqB5kxE9H_yFNpke-e0GH1FbzGQ/s1600/20150301001.png" height="175" width="320" /></a></div>
新規Projectでも既存のProjectでもなんでもOK<br />
<br />
<h4>
BgmManagerのダウンロード</h4>
<a href="https://github.com/naichilab/Unity-BgmManager" target="_blank">https://github.com/naichilab/Unity-BgmManager</a><br />
こちらのURLにある”Download ZIP”ボタンからダウンロード<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgDyuWntlDWOFTzQfeJvkFqiFCQUaAILJe9emFMoFBE-sfuYw-8QNvz2pKprkHerOooKwPDPHh8vuKdUwr-muPAKwm-CgpBrLy1lIlBs7uLobeNkBBiXbDOMnEa18zMuNSkAktdNM999SI/s1600/20150301002.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgDyuWntlDWOFTzQfeJvkFqiFCQUaAILJe9emFMoFBE-sfuYw-8QNvz2pKprkHerOooKwPDPHh8vuKdUwr-muPAKwm-CgpBrLy1lIlBs7uLobeNkBBiXbDOMnEa18zMuNSkAktdNM999SI/s1600/20150301002.png" height="213" width="320" /></a></div>
<h4>
<br /></h4>
<h4>
BgmManagerのインポート</h4>
ZIPファイルを解凍して出てくる<br />
BgmManager.unitypackageをダブルクリックしてUnityに取り込む<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjKosgqWA9HnsHX2Gy-sHexD3dBthZsksjMS8QiGiaNLlvHv5jfzeUUJZsOv506qH3beJL__3D3yFdjvU4cPtUe3V7YFhiHKis743DYLkLaD20TtcCHh40_UdJKyEr0Bq_UGV0iAX0kQAU/s1600/20150301003.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjKosgqWA9HnsHX2Gy-sHexD3dBthZsksjMS8QiGiaNLlvHv5jfzeUUJZsOv506qH3beJL__3D3yFdjvU4cPtUe3V7YFhiHKis743DYLkLaD20TtcCHh40_UdJKyEr0Bq_UGV0iAX0kQAU/s1600/20150301003.png" height="320" width="292" /></a></div>
サンプル不要ならチェックを外してください。<br />
※サンプルに同梱したmp3ファイルはSHW様(<a href="http://shw.in/" target="_blank">http://shw.in/</a>)提供のものです。<br />
<br />
<h4>
サンプルの実行</h4>
SampleフォルダにあるSampleシーンを開きます。<br />
HierarchyビューにBgmManagerが配置されていれば準備完了です。<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiFHb9Unirzfst6I40wF7VZxD7HkUPXDMFdmnO-INj1BzoRKMDNjNslMgIa5zKQszz1o7N0oxc29AdWClDAYMYXgG2IRwy2ErtSk49MvxHPYqbug0j4BJoqci6CTDJz3uiPLvepyfJKopk/s1600/20150301004.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiFHb9Unirzfst6I40wF7VZxD7HkUPXDMFdmnO-INj1BzoRKMDNjNslMgIa5zKQszz1o7N0oxc29AdWClDAYMYXgG2IRwy2ErtSk49MvxHPYqbug0j4BJoqci6CTDJz3uiPLvepyfJKopk/s1600/20150301004.png" /></a></div>
実行してBGMを再生できる事を確認してください。<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjTIeWilEENxcmhYsffIuQmWyyL2tSQbbnzd3S4VVj0KoueWbdCOyGoa3v3Es3uWDogScWmtP_G5doy-cYCwHmpqori9F8XKPZsfdW4gyHgTEVW-16zbO3hbfIqV7a9342nw-zS_NXXDb8/s1600/20150301005.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjTIeWilEENxcmhYsffIuQmWyyL2tSQbbnzd3S4VVj0KoueWbdCOyGoa3v3Es3uWDogScWmtP_G5doy-cYCwHmpqori9F8XKPZsfdW4gyHgTEVW-16zbO3hbfIqV7a9342nw-zS_NXXDb8/s1600/20150301005.png" /></a></div>
<br />
サンプルを実行するだけならこれで終わり。これ以降は各自用意されたBGMファイルを再生する方法と、スクリプトからの呼び出し方法の解説です。<br />
<br />
<h4>
BGMファイルの追加</h4>
BGMファイルは下記フォルダに存在するものが自動的に読み込まれます。<br />
・Resources<br />
┗Audio<br />
┗BGM<br />
(Resourcesフォルダはどの階層にあっても大丈夫です。)<br />
<br />
<h4>
フェードパラメータの調整</h4>
BgmManagerにはいくつかのパラメータがあります。<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjcD6PdPLsuqK7OGn7peYLnU4yn1PJg36CGL4JJPA2DeSvrFhQMABLyfAfQpBAUSxpUsxF6kBa1wDh0KX2tLbFnE8LtjjKSxiUUAaSxf_zm-a56LcBS7QaD23Kksp7wxOQpkfS1GscA_LA/s1600/20150301006.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjcD6PdPLsuqK7OGn7peYLnU4yn1PJg36CGL4JJPA2DeSvrFhQMABLyfAfQpBAUSxpUsxF6kBa1wDh0KX2tLbFnE8LtjjKSxiUUAaSxf_zm-a56LcBS7QaD23Kksp7wxOQpkfS1GscA_LA/s1600/20150301006.png" height="165" width="320" /></a></div>
<br />
<ul>
<li>Debug Mode</li>
<ul>
<li>ONにするとサンプル実行と同じように簡易ウィンドウが表示されます。</li>
</ul>
<li>Target Volume</li>
<ul>
<li>フェードイン完了時の音量です。</li>
</ul>
<li>Time to Fade</li>
<ul>
<li>フェードイン(アウト)の開始〜完了までの時間です。</li>
</ul>
<li>Crossfade Ratio</li>
<ul>
<li>クロスフェードの重なり率を指定します。</li>
<ul>
<li>0を指定した場合、フェードアウト完了を待ち、フェードインが開始されます。</li>
<li>1を指定した場合、フェードアウトとフェードインが同時に開始されます。</li>
</ul>
</ul>
</ul>
<div>
<br /></div>
<h4>
スクリプトからの再生・停止</h4>
すきなスクリプトから下記1行でBGMを再生できます。<br />
<pre class="brush : csharp ;">BgmManager.Instance.Play ("BGMファイル名");</pre>
すでに別の曲が再生中の場合は、勝手にクロスフェード再生します。<br />
<br />
停止する場合は下記いずれかを呼び出します。<br />
<pre class="brush : csharp ;">//フェードアウト後、停止います。
BgmManager.Instance.Stop ();
//ただちに再生を停止します。
BgmManager.Instance.StopImmediately ();</pre>
<h4>
<br /></h4>
<h4>
スクリプトからパラメータの変更</h4>
こんな感じ。<br />
<pre class="brush : csharp ;">BgmManager.Instance.DebugMode = false;
BgmManager.Instance.TargetVolume = 0.8f;
BgmManager.Instance.TimeToFade = 3.0f;
BgmManager.Instance.CrossFadeRatio = 0.5f;</pre>
再生・停止と一緒ですね。
<br />
<br />
<h3>
参考サイト</h3>
<br />
<ul>
<li><a href="http://kan-kikuchi.hatenablog.com/entry/AudioManager" target="_blank">ぼくがかんがえたさいきょうのAudioManager【Unity】| (:3[kanのメモ帳]</a></li>
<ul>
<li>フォルダに置いたファイルを読み込むところはまんま<strike>パクり</strike>参考にさせていただきました。</li>
</ul>
</ul>
<div>
<br /></div>
<h3>
サンプルファイル提供</h3>
<ul>
<li><a href="http://shw.in/" target="_blank">SHW無料音楽素材</a></li>
<ul>
<li>再配布も自由とのことで使用させていただきました。</li>
</ul>
</ul>
<div>
<br /></div>
<h3>
その他</h3>
フェードイン(アウト)は直線的な補間しかしてないですし、インアウトをそれぞれ別の長さにすることもできないです。<br />
まぁとにかく簡単に使える物を目指したので今後も実装する事は無いかな…<br />
<br />
是非使ってみてください〜。<br />
<br />
<br />
<br />
→<span style="color: blue;"><a href="http://naichilab.blogspot.jp/2013/05/unity.html" target="_blank">Unity系記事まとめ</a></span>naichilabhttp://www.blogger.com/profile/11086576268699869652noreply@blogger.comtag:blogger.com,1999:blog-1059621179156545272.post-84755120076877664732015-02-16T00:17:00.003+09:002015-02-16T00:17:45.335+09:00【Unity】スワイプ、フリック操作を検出してみる。<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgruiAbkHLsIvXDEkuYSdRKkbGilWgV2F9knZRrlD7e_orKJj2V6geL_4FSTiwef9Kf3M02x5_xV1-HN41_VWU01hTZ0ADIRwh565B_W5OjHTInBeNGsSRe6T7WGm9OONC9elvLXNHAC-A/s1600/1424033100_3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgruiAbkHLsIvXDEkuYSdRKkbGilWgV2F9knZRrlD7e_orKJj2V6geL_4FSTiwef9Kf3M02x5_xV1-HN41_VWU01hTZ0ADIRwh565B_W5OjHTInBeNGsSRe6T7WGm9OONC9elvLXNHAC-A/s320/1424033100_3.png" /></a></div>
こんばんは、naichilabです。<br />
久々にUnityネタ。<br />
<br />
<h3>
スワイプ&フリックしたい</h3>
ちょっとしたミニゲームを作ろうとするとスワイプやフリックを使いたくなりますよね。<br />
でもUnity標準では用意されてないみたい。<br />
アセットストアを探しても有料しかなさそうなので作ってみました。<br />
<br />
<h3>
使い方</h3>
<a href="https://github.com/naichilab/Unity-TouchManager" target="_blank">https://github.com/naichilab/Unity-TouchManager</a><br />
ここの<a href="https://github.com/naichilab/Unity-TouchManager/archive/master.zip" target="_blank">Download ZIP</a>からソースをダウンロード。<br />
解凍すると「TouchManager.unitypackage」が入っているのでUnityプロジェクトにインポートしてください。<br />
<br />
Prefabs/TouchManagerをシーンに置いたら準備完了。<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhfA3ovwcGmT8zyZ8b_K9oUxDpZE2xoRCbYWmnhj6anCEUNInuoIUFcpRlKxpUvu1FnrHpfI7aiXePg3zlw2QuxD1HSlGnnRmsv3eGr3Juk5pABV4pmfLPgt1dRWv42Y22PoWpmluOWym0/s1600/20150215001.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhfA3ovwcGmT8zyZ8b_K9oUxDpZE2xoRCbYWmnhj6anCEUNInuoIUFcpRlKxpUvu1FnrHpfI7aiXePg3zlw2QuxD1HSlGnnRmsv3eGr3Juk5pABV4pmfLPgt1dRWv42Y22PoWpmluOWym0/s1600/20150215001.png" height="320" width="148" /></a></div>
<br />
フリックを受け取りたいスクリプトで下記コードを追加してください。<br />
<pre class="brush : csharp ;"> void OnEnable ()
{
//イベントリスナをセット
TouchManager.Instance.Swipe += OnSwipe;
TouchManager.Instance.TouchStart += OnTouchStart;
TouchManager.Instance.TouchEnd += OnTouchEnd;
TouchManager.Instance.Flick += OnFlick;
}
void OnDisable ()
{
//イベントリスナを解除
TouchManager.Instance.Swipe -= OnSwipe;
TouchManager.Instance.TouchStart -= OnTouchStart;
TouchManager.Instance.TouchEnd -= OnTouchEnd;
TouchManager.Instance.Flick -= OnFlick;
}
void OnTouchStart (object sender, TouchEventArgs e)
{
//タッチ開始時に呼び出されます。
}
void OnTouchEnd (object sender, TouchEventArgs e)
{
//タッチ終了時に呼び出されます。
}
void OnSwipe (object sender, SwipeEventArgs e)
{
//スワイプ中に呼び出されます。
}
void OnFlick (object sender, FlickEventArgs e)
{
//フリック検出時に呼び出されます。
}</pre>
引数としてタッチ場所やフリック量が渡されるので好きに加工して使ってください。<br />
<br />
<h3>
デモ</h3>
<iframe height="600" scrolling="no" seamless="" src="http://unityroom.com/games/play/357/1/600/600" style="border: none; margin: 0; overflow: hidden; padding: 0;" width="600"></iframe><br />
<div>
Hosted by <a href="http://unityroom.com/games/play/357" target="_blank">UnityRoom.com</a></div>
<br />
<h3>
まとめ</h3>
ソースコードはものすごい微妙な感じ…。<br />
Android,iOS,WebPlayer全てで動作するのは確認できていますが<br />
値がPixel数で出てくるっぽいので端末サイズが違うと<br />
フリック感覚にばらつきがありそうです。<br />
<br />
端末サイズの違いを吸収する方法ご存知の方は是非教えてください。
<br />
<br />
綺麗にまとまったらAssetStoreに申請してみたいなー。naichilabhttp://www.blogger.com/profile/11086576268699869652noreply@blogger.comtag:blogger.com,1999:blog-1059621179156545272.post-61507451525435896232015-02-13T21:19:00.000+09:002015-02-13T21:19:00.480+09:00【PowerShell】テキストファイルの内容を正規表現で置換する<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjBFn3eq5vJlQX5-24eeNKDOb57hhJMY1HHatFBxV0NPDlRDhnyC6uWv6xQ8EWZANhU8GBbnX7iCSSJzL4Ja9F4WE4t72UKtQ-G3NIfilx_dmElbXJ1LHy_1uHLdjI0JsldpWZqt1a98bg/s1600/metro-powershell-logo.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjBFn3eq5vJlQX5-24eeNKDOb57hhJMY1HHatFBxV0NPDlRDhnyC6uWv6xQ8EWZANhU8GBbnX7iCSSJzL4Ja9F4WE4t72UKtQ-G3NIfilx_dmElbXJ1LHy_1uHLdjI0JsldpWZqt1a98bg/s1600/metro-powershell-logo.png" height="200" width="200" /></a></div>
<br />
<h3>
やりたいこと</h3>
JenkinsでC#コードを自動ビルドするときにバージョンを書き換えたかった。<br />
AssemblyInfo.csを修正すればいいことは知ってたのでPowerShellでやってみた。<br />
正規表現も使えるしちょー楽。<br />
<br />
<h3>
元ファイル(一部)</h3>
<pre class="brush : plain;">[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]</pre>
<br />
<h3>
PowerShellスクリプト</h3>
<pre class="brush : ps ;">#ファイル読み込み
$filePath = "AssemblyInfo.cs"
Get-Content $filepath | tee -Variable fileContent
#正規表現で置換&保存
$input = '(Assembly.*Version\()\".*\"(\))'
$replacement = '$1"1.2.3.4"$2'
$fileContent -replace $input, $replacement | tee -FilePath $filepath</pre>
<br />
<h3>
結果ファイル(一部)</h3>
<pre class="brush : plain;">[assembly: AssemblyVersion("1.2.3.4")]
[assembly: AssemblyFileVersion("1.2.3.4")]</pre>
naichilabhttp://www.blogger.com/profile/11086576268699869652noreply@blogger.comtag:blogger.com,1999:blog-1059621179156545272.post-11922535357613992802015-02-04T00:29:00.000+09:002015-02-06T02:33:32.255+09:00【Mac】MineCraftの自宅サーバー公開した人のところに繋いでみた。<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj8a0efnZkTcyMkubQecoho0aoiKOj8dfnfRgtQtOtZzzRYKJ0p5uFg685pcQ8oylgJohAy1iXUp8hM2X3aU3cBdYw3i_WV6xjzP7EkD7Na4DaIUTJrjWHi9DN81PvziIBwTRmaPjYbCYI/s1600/minecraft.jpeg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj8a0efnZkTcyMkubQecoho0aoiKOj8dfnfRgtQtOtZzzRYKJ0p5uFg685pcQ8oylgJohAy1iXUp8hM2X3aU3cBdYw3i_WV6xjzP7EkD7Na4DaIUTJrjWHi9DN81PvziIBwTRmaPjYbCYI/s1600/minecraft.jpeg" height="148" width="320" /></a></div>
<h3>
はじめに</h3>
こんなつぶやきを見てMineCraftやってみたくなったので買ってみた。<br />
MineCraftの自宅サーバー公開したとかなんとか。<br />
ちなみに自分はMineCraftやったことないです。初クラフト。誰か一緒にやりましょう。<br />
<blockquote class="twitter-tweet" lang="ja">
今日から本格稼働マイクラ1.6.4鯖
鯖:<a href="http://t.co/5RlaayyxIJ">http://t.co/5RlaayyxIJ</a>
状況:<a href="http://t.co/HeQInRbSHK">http://t.co/HeQInRbSHK</a>
Modは1.6.4Forge前提で下記から
<a href="https://t.co/W3mp8Vbffj">https://t.co/W3mp8Vbffj</a><br />
— 加賀瀬 葵™ (@AoiKagase) <a href="https://twitter.com/AoiKagase/status/562571716245716992">2015, 2月 3</a></blockquote>
<script async="" charset="utf-8" src="//platform.twitter.com/widgets.js"></script>
でもMacで動かそうとしたらエラーしたので解決までをメモ予定。<br />
<h4>
環境</h4>
・MacBookAir2013<br />
・Mac OSX 10.9.5<br />
<h2>
単体(MODなし)起動まで</h2>
<h3>
ダウンロード</h3>
ここから。<br />
<a href="https://minecraft.net/">https://minecraft.net/</a><br />
<h3>
エラー</h3>
落ちてきたMinecraft.appを起動するもすぐエラー。<br />
<pre class="brush : csharp ;">Bootstrap (v5)
Current time is Feb 4, 2015 12:10:55 AM
System.getProperty('os.name') == 'Mac OS X'
System.getProperty('os.version') == '10.9.5'
System.getProperty('os.arch') == 'x86_64'
System.getProperty('java.version') == '1.6.0_65'
System.getProperty('java.vendor') == 'Apple Inc.'
System.getProperty('sun.arch.data.model') == '64'
Downloading: https://s3.amazonaws.com/Minecraft.Download/launcher/launcher.pack.lzma
Exception: javax.net.ssl.SSLException: java.lang.RuntimeException: Unexpected error: java.security.InvalidAlgorithmParameterException: the trustAnchors parameter must be non-empty
Downloading: https://s3.amazonaws.com/Minecraft.Download/launcher/launcher.pack.lzma (try 2/10)
Exception: javax.net.ssl.SSLException: java.lang.RuntimeException: Unexpected error: java.security.InvalidAlgorithmParameterException: the trustAnchors parameter must be non-empty
Downloading: https://s3.amazonaws.com/Minecraft.Download/launcher/launcher.pack.lzma (try 3/10)
...
...
Unable to download remote file. Check your internet connection/proxy settings.
FATAL ERROR: net.minecraft.bootstrap.FatalBootstrapError: Unable to download while being forced
at net.minecraft.bootstrap.Bootstrap.execute(Bootstrap.java:95)
at net.minecraft.bootstrap.Bootstrap.main(Bootstrap.java:381)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at apple.launcher.LaunchRunner.run(LaunchRunner.java:116)
at apple.launcher.LaunchRunner.callMain(LaunchRunner.java:51)
at apple.launcher.JavaApplicationLauncher.launch(JavaApplicationLauncher.java:52)
Please fix the error and restart.</pre>
なんでやのん。<br />
やりたいけど眠いしまた今度。<br />
土日にでも調べるか…<br />
<br />
<h3>
ぐぐる</h3>
<div>
<a href="http://www.minecraftforum.net/forums/support/unmodified-minecraft-client/1865447-minecraft-trustanchors-parameter">http://www.minecraftforum.net/forums/support/unmodified-minecraft-client/1865447-minecraft-trustanchors-parameter</a></div>
こんなの見つけた。<br />
Java7消して<a href="http://support.apple.com/kb/DL1572" target="_blank">Java6</a>入れたら良いよって。<br />
<br />
<pre class="brush : plain ;">$ java -version
java version "1.7.0_55"
Java(TM) SE Runtime Environment (build 1.7.0_55-b13)
Java HotSpot(TM) 64-Bit Server VM (build 24.55-b03, mixed mode)</pre>
現在のバージョンはJava7だった。<br />
きっとAndroid環境構築してたときに入れたんだなー。<br />
<br />
<h3>
消す</h3>
消そうと思ったけどJavaの消し方すら分からんかった。<br />
<a href="http://www.toraneco.com/blog2/?p=1795" target="_blank">Java 7をOS Xから完全にアンインストールする</a><br />
ほんとどこに何が入ってるかわからんくて気持ち悪いなぁ…<br />
分からず入れた自分が悪いんだけど。<br />
<br />
まぁこの際すっきり消しちゃおうってことで上記URL通りにやってたんだけど<br />
com.oracleで検索しても出てこない。<br />
システムファイル検索とかオプション見当たらないなーと思ったら+ボタンで設定できた。<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgccKudgjYg6XEbAbdlXniCT2tsS9qgwMzxNseJmDXUYh8BBsYHD3KhKVjY-bQc7OuJhTJAartIeilRg092WAxzG4dt-1o0fEg5echgYle7YpGZOCn6l2ufwrIkaVZde43hI89NVB1mGqw/s1600/20150205.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgccKudgjYg6XEbAbdlXniCT2tsS9qgwMzxNseJmDXUYh8BBsYHD3KhKVjY-bQc7OuJhTJAartIeilRg092WAxzG4dt-1o0fEg5echgYle7YpGZOCn6l2ufwrIkaVZde43hI89NVB1mGqw/s1600/20150205.png" height="168" width="320" /></a></div>
<h3>
Java6入れる</h3>
<a href="http://support.apple.com/kb/DL1572" target="_blank">Java6</a> ここから。<br />
<br />
<h3>
起動した〜</h3>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgNCcmE6kMGF0tQVcsmbcAwvSLP4EXvIIZdbm4xbWcWWRTZqadfOJ7KA7xEwb-i-TxPZvTEA1HhkIhmz0U2jFKoPpc7uIQGWBlD41ckOQIYt5C3ODNmoHvHkmXJX3FmciJzoTKDI80TOmo/s1600/20150206002.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgNCcmE6kMGF0tQVcsmbcAwvSLP4EXvIIZdbm4xbWcWWRTZqadfOJ7KA7xEwb-i-TxPZvTEA1HhkIhmz0U2jFKoPpc7uIQGWBlD41ckOQIYt5C3ODNmoHvHkmXJX3FmciJzoTKDI80TOmo/s1600/20150206002.png" height="205" width="320" /></a></div>
とりあえずアプリ単体では起動した。<br />
あとはMODっての入れる必要があるらしいからまた明日かな。<br />
<br />
<h2>
MOD導入して起動まで</h2>
加賀瀬さんのブログに全部書いてある。<br />
<a href="http://aokaga.dip.jp/log_20150205.html" target="_blank">MINECRAFTサーバー始めました</a><br />
<ol>
<li>Edit Profileで1.6.4を選択</li>
<li>一度起動して閉じておく</li>
<li><a href="http://files.minecraftforge.net/maven/net/minecraftforge/forge/1.6.4-9.11.1.965/forge-1.6.4-9.11.1.965-installer.jar" target="_blank">Minecraft Forge 1.6.4-9.11.1.965</a>をDLして実行</li>
<li>実行できない場合、システム環境設定→セキュリティとプライバシーからこのまま開くを実行。<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgxEixMH1omQXsD_vZac5EHxDQ-IPr6LAyX5pSCcQIzuAiubsus3fLxFaT1xCt_2qCnQZFfKoAtdl0TqJ6j4of7cxY4AwuXJBEq4ByjYbEVO-uqcO1O_VP0aIP_qP30hH8vS3ktbUz3NnQ/s1600/20150206003.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em; text-align: center;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgxEixMH1omQXsD_vZac5EHxDQ-IPr6LAyX5pSCcQIzuAiubsus3fLxFaT1xCt_2qCnQZFfKoAtdl0TqJ6j4of7cxY4AwuXJBEq4ByjYbEVO-uqcO1O_VP0aIP_qP30hH8vS3ktbUz3NnQ/s1600/20150206003.png" height="163" width="320" /></a><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi_Jz7-tvKsW882ETaINV3fanTo1ElJa4ftqH6-2sMhVWlXHwARITftYoq80epkkDQt2XMelott1AjUq2UQtIJr5YBV0hePq5aVcxwSeko8fvMOJFtfrDA66dpfA_niER3lD7KcYAnaN7I/s1600/20150206004.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em; text-align: center;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi_Jz7-tvKsW882ETaINV3fanTo1ElJa4ftqH6-2sMhVWlXHwARITftYoq80epkkDQt2XMelott1AjUq2UQtIJr5YBV0hePq5aVcxwSeko8fvMOJFtfrDA66dpfA_niER3lD7KcYAnaN7I/s1600/20150206004.png" height="250" width="320" /></a></li>
<li>Install Clientを選択してインストールする。</li>
<li>もう一度Minecraft起動してEditProfileへ</li>
<li>起動バージョンをインストールしたForge1.6.4</li>
<li>フォルダも実フォルダを探して合わせる</li>
<li><a href="https://t.co/W3mp8Vbffj" target="_blank">https://t.co/W3mp8Vbffj</a> ここからMOD詰め合わせをダウンロード</li>
<li>回答して出てきた3フォルダをForgeのインストールフォルダにコピー<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgsiYcFUf9iD02S_ZBI_SoJfetOjoHUZjrXUJVn0sxQcjpwZ8OlVcOKWBsagIzOtZ222nkardk8P7nHTadDiPKE5C-lwJYCHJzVflL2y9nv8-Zzcmg_cyjadBCjDPNhN4hUEGt1cJM7JAo/s1600/20150206006.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em; text-align: center;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgsiYcFUf9iD02S_ZBI_SoJfetOjoHUZjrXUJVn0sxQcjpwZ8OlVcOKWBsagIzOtZ222nkardk8P7nHTadDiPKE5C-lwJYCHJzVflL2y9nv8-Zzcmg_cyjadBCjDPNhN4hUEGt1cJM7JAo/s1600/20150206006.png" height="83" width="320" /></a></li>
<li>コピーしたフォルダの中のmods/IntelliInput-2.2-for164.jar を削除<br />(Macだと落ちるらしい)</li>
<li>起動!</li>
<li>Add Serverでサーバー追加<br />aokaga.dip.jp:30000<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgzANG3iC-dk755JeOPzyyGVfBtkPWNVE9yOutuC34aFj54bV5wcCIyZKgCxwr4Q5JJwwvhTm1FZ77MjVxkwvTr0fQO6rM9iBbXNngaOpSsbbzKXUPGTQubxoYg4CFHIz10aE0WxyQ8Ysw/s1600/20150206007.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em; text-align: center;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgzANG3iC-dk755JeOPzyyGVfBtkPWNVE9yOutuC34aFj54bV5wcCIyZKgCxwr4Q5JJwwvhTm1FZ77MjVxkwvTr0fQO6rM9iBbXNngaOpSsbbzKXUPGTQubxoYg4CFHIz10aE0WxyQ8Ysw/s1600/20150206007.png" height="187" width="320" /></a></li>
<li>接続できたっぽい。<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiG6yCbKsYC-XhKPZjInXbuWkZpFbOfxJkE8TikINikXses6HbU03iBtZUl0CC8sGaE960aqcjUbdnXZ9gePiCx9yuc8fCecvSpV6KgaHgp2FMNOCXdXAgC0ME8jx3raVlR-mnPp-SnhZ0/s1600/20150206008.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em; text-align: center;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiG6yCbKsYC-XhKPZjInXbuWkZpFbOfxJkE8TikINikXses6HbU03iBtZUl0CC8sGaE960aqcjUbdnXZ9gePiCx9yuc8fCecvSpV6KgaHgp2FMNOCXdXAgC0ME8jx3raVlR-mnPp-SnhZ0/s1600/20150206008.png" height="187" width="320" /></a></li>
</ol>
<br />
さー、それで何するんだこのゲーム。<br />
<br />
あとこのアドレスでゲーム起動しなくてもサーバーの状態みれるらしい。おもろい。<br />
<a href="http://aokaga.dip.jp:8123/">http://aokaga.dip.jp:8123/</a><br />
<br />naichilabhttp://www.blogger.com/profile/11086576268699869652noreply@blogger.comtag:blogger.com,1999:blog-1059621179156545272.post-46377994729076275152015-01-05T00:15:00.000+09:002015-01-05T11:52:43.969+09:002014年を振り返ってみる。<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjb-cwEZRK_e9uuWxdE0us9iDvDqWQkRhaZsA7LYP-5EWxavtJ1Jlnhq5Wju06uts_GjBX6U9yUYIcJFP_4xJa6GdVc-hesKvXLa7SmcYVTGrLFYUcfJxRfahS-URlxMba_-J8CX4jTueU/s1600/72fa95ced71f5700578d5015eaa7ae45.jpeg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjb-cwEZRK_e9uuWxdE0us9iDvDqWQkRhaZsA7LYP-5EWxavtJ1Jlnhq5Wju06uts_GjBX6U9yUYIcJFP_4xJa6GdVc-hesKvXLa7SmcYVTGrLFYUcfJxRfahS-URlxMba_-J8CX4jTueU/s200/72fa95ced71f5700578d5015eaa7ae45.jpeg" height="200" width="200" /></a></div>
あけましておめでとうございます。<br />
昨年お世話になった皆様、ありがとうございました。<br />
今年もよろしくお願い致します。<br />
<br />
↓一昨年のまとめ記事<br />
<a href="http://naichilab.blogspot.jp/2013/12/2013.html" target="_blank">2013年を振り返ってみる。</a><br />
<br />
そーいえば1年前もまとめ記事書いたなーって思い出したので<br />
去年(2014)の分も書いてみます。<br />
<br />
<h2>
やったこと</h2>
<br />
<h3>
1月</h3>
<h4>
Gitの入門記事を書いた。</h4>
→<a href="http://naichilab.blogspot.jp/2014/01/gitsourcetreegit.html" target="_blank">【連載Git入門目次】ほんとは簡単?SourceTreeでGitを始めよう!</a><br />
せっかくGit勉強したのでまとめてみた。<br />
今まで書いた記事の中で一番シェアされた記事な気がする。<br />
読んでいただいた皆さんありがとうございます。<br />
<h4>
うに部屋2.0公開</h4>
→<a href="http://unityroom.com/" target="_blank">うに部屋</a><br />
2013年に公開して放置してたうに部屋をCakePHPで作り直した。<br />
折角投稿してもらってもSEO対策してないので見つかりづらいサイトですみません。<br />
WebPlayerももうじき廃止になるそうなので早い事WebGL対応しないといけませんね。<br />
<br />
<br />
<h3>
2月</h3>
<h4>
Unityで作った→「<a href="http://unityroom.com/games/play/12" target="_blank">猫に小判(作成中)</a>」</h4>
2DToolkitで2Dゲームの練習&Photonでオンライン対戦的なの作ろうと思ったけど途中で飽きた。
<br />
<br />
<h3>
3月</h3>
何してたか記憶に無い。
<br />
<br />
<h3>
4月</h3>
<h4>
データベーススペシャリスト試験合格</h4>
よかったよかった。
<br />
<br />
<h3>
5月</h3>
<h4>
挙式&新婚旅行</h4>
GW明けにがっつりお休みいただいてハワイで挙式してきました。ハワイまた行きたい。
<br />
<h4>
Unityで作った→「<a href="http://unityroom.com/games/play/28" target="_blank">四葉のクローバーを探せ!</a>」</h4>
Unity1週間げーむじゃむで作成。さくっと作ったけど結構遊んでもらえた。
<br />
<br />
<h3>
6月</h3>
<h4>
Unityで作った→「<a href="http://unityroom.com/games/play/86" target="_blank">電話番オンライン(音量注意)</a>」</h4>
Photonの練習で作った。2〜3日で作るつもりがPhotonの扱いでかなりハマった記憶がある。
<br />
<h4>
Unityで作った→「<a href="http://unityroom.com/games/play/45" target="_blank">flyaway</a>」</h4>
これもUnity1週間げーむじゃむで作った連打ゲー。メカニムうまく扱えなかった。そして調整が足りない。<br />
<br />
<h3>
7月</h3>
何してたか記憶に無い。
<br />
<br />
<h3>
8月</h3>
<h4>
あぷまがないとに参加</h4>
日本中からスマホアプリの開発者さんが集まるイベント。普段会えない関東の人たちにも会えてとても楽しかった。
<br />
<h4>
Unityで作った→「<a href="http://unityroom.com/games/play/237" target="_blank">にょろげー</a>」</h4>
Unity1週間げーむじゃむで作成。途中で飽きて未完成。
<br />
<br />
<h3>
9月</h3>
<h4>
退職</h4>
前の会社を退職。色んな経験をさせてもらって楽しかった。<br />
<h4>
引っ越し</h4>
新居のある京都へ引っ越し。都会便利過ぎハンパない。
<br />
<br />
<h3>
10月</h3>
<h4>
転職</h4>
10月1日から新職場。転職してもう3ヶ月すぎたのか…
<br />
<br />
<h3>
11月</h3>
<h4>
情報セキュリティスペシャリスト試験合格</h4>
よかったよかった。
<br />
<h4>
Unityで作った→「<a href="http://unityroom.com/games/play/296" target="_blank">ColoColoTire</a>」</h4>
Unity1週間げーむじゃむで作成。バランス調整できてない。
<br />
<br />
<h3>
12月</h3>
<h4>
Unityで作った→「<a href="http://unityroom.com/games/play/317" target="_blank">TankWars</a>」</h4>
思いつきで作成。Photonで対戦できるゲーム作りたかったけど途中で飽きちゃった。ソースコードをGitHubで公開してみた。<br />
<h4>
Ruby楽しそう</h4>
Ruby on Railsのチュートリアルをやってる。(今も)<br />
Rubyすごい。Railsめっちゃおもろい。
<br />
<br />
<br />
<h2>
収入</h2>
・アプリ0円(作ってねぇ)<br />
・ブログ PV38万くらい 広告収益4万くらい アフィ収益5万くらい<br />
・うに部屋 PV10万くらい 広告収益1500円くらい<br />
<h2>
支出</h2>
・AppleDev登録 -8400円<br />
・Amazonで本 -21000円<br />
・レンタルサーバー -6000円<br />
・うに部屋ドメイン -950円
<br />
<br />
<h2>
まとめ</h2>
ブログ名に合ったこと何もしてないですね。<br />
Unityでクソゲー作ってただけの一年だった…<br />
Amazonアフィリエイトのおかげで本買うお金ぐらいは稼げたけど<br />
どうにかアプリで稼いでみたいねぇ。<br />
<br />
現在の興味がスマホアプリ開発じゃなくWebフロントエンド&バックエンドに向いてるのが問題だなぁ。楽しいからいいんだけど…<br />
2015年中には何かリリースできるだろうか…<br />
(何かって言ってる時点で作りそうに無いな・・・)<br />
<br />
それでは皆様、今年もよろしくお願い致します。
naichilabhttp://www.blogger.com/profile/11086576268699869652noreply@blogger.comtag:blogger.com,1999:blog-1059621179156545272.post-84475520818151009642014-12-14T01:03:00.000+09:002014-12-14T01:09:42.391+09:00【Unity、PUN】Photon Unity Networkingのコールバックメソッド一覧<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhjumvILuVnlQmh0DAILZNNLiIo5LnwMdilNCMxifgJfFz7O191iWcp-DX5Yjx0mPMjIg8fmKbffPLyyOVmheGRJ9WhdF3jA-ModAaueMdiYGo6RMGIzi1J4MAAsNQJiXwmHsrolnZgZME/s1600/20141213001.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhjumvILuVnlQmh0DAILZNNLiIo5LnwMdilNCMxifgJfFz7O191iWcp-DX5Yjx0mPMjIg8fmKbffPLyyOVmheGRJ9WhdF3jA-ModAaueMdiYGo6RMGIzi1J4MAAsNQJiXwmHsrolnZgZME/s1600/20141213001.png" /></a></div>
<br />
<a href="http://photoncloud.jp/" target="_blank">PhotonCloud</a>を使えばUnityで簡単にオンラインゲームが作れますね。<br />
<br />
接続に失敗したとき、部屋に誰か入ってきたとき、など<br />
ことあるごとに呼び出されるコールバックメソッドたち。<br />
インテリセンスも効かないし毎度調べるのも面倒なので一覧にしてみた。<br />
<br />
誰かが作ってたと思うけど自分用にまとめ直し。<br />
ちなみに超適当和訳なので怪しいと思ったら原文読んでください。<br />
(PhotonNetworkingMessage列挙型のXMLコメントに全て書かれてます)<br />
<br />
もうちょい使ったらよく使うもの同士まとめた記事も書こうとおもう。<br />
<h2>
OnConnectedToPhoton</h2>
<pre class="brush : csharp ;">/// <summary>
/// サーバーへの初期接続が確立したとき呼び出されます。
/// </summary>
/// <remarks>
/// このコールバックはサーバーとの通信が可能かどうかの判断をするためにみ有効です。
/// ほとんどの場合、OnFailedToConnectToPhoton()もしくはOnDisconnectedFromPhoton()で十分です。
/// これが呼び出ばれたときには低レベルでの接続は確率されています。
/// この後、PUNはAppIDやユーザー、その他の情報をバッググラウンドで送信します。
/// また、マスターサーバーからゲームサーバーへ移った際には呼び出されません。
/// </remarks>
void OnConnectedToPhoton(){}
</pre>
<h2>
OnLeftRoom</h2>
<pre class="brush : csharp ;">/// <summary>
/// ローカルユーザー、クライアントが部屋を出たときに呼び出されます。
/// </summary>
/// <remarks>
/// 部屋を出るとき、PUNはあなたをマスターサーバーへ移動させます。
/// あなたがロビーを使う前、もしくは部屋に入る(作る)前、
/// OnJoinedLobby() もしくは OnConnectedToMaster() が再度呼び出されます。
/// </remarks>
void OnLeftRoom(){}
</pre>
<h2>
OnMasterClientSwitched</h2>
<pre class="brush : csharp ;">/// <summary>
/// マスタークライアントが退場し、新しいマスタークライアントに切り替わった後に呼び出されます。
/// 古いマスタークライアントは既にプレイヤー一覧からは削除されています。
/// </summary>
/// <remarks>
/// このクライアントが部屋に入ったときには、このコールバックは呼び出されません。
/// </remarks>
void OnMasterClientSwitched(PhotonPlayer newMasterClient){}
</pre>
<h2>
OnPhotonCreateRoomFailed</h2>
<pre class="brush : csharp ;">/// <summary>
/// CreateRoom()の呼び出しが失敗した場合に呼び出されます。
/// オプションパラメータによってエラーコードおよびエラーメッセージを提供します。
/// </summary>
/// <remarks>
/// よくあるのは「指定した部屋名がすでに使用されている」などです。
/// PhotonNetwork.logLevel を PhotonLogLevel.Informational 以上二している場合、
/// PUNはいくつかの情報をログ出力します。
/// </remarks>
void OnPhotonCreateRoomFailed(){}
void OnPhotonCreateRoomFailed(object[] codeAndMsg){
//codeAndMsg[0]は エラーコード です。(int)
//codeAndMsg[1]は デバッグメッセージ です。(string)
}
</pre>
<h2>
OnPhotonJoinRoomFailed</h2>
<pre class="brush : csharp ;">/// <summary>
/// JoinRoom()の呼び出しが失敗した場合に呼び出されます。
/// オプションパラメータによってエラーコードおよびエラーメッセージを提供します。
/// </summary>
/// <remarks>
/// よくあるのは「部屋が存在しない」「すでに満員」などです。
/// PhotonNetwork.logLevel を PhotonLogLevel.Informational 以上二している場合、
/// PUNはいくつかの情報をログ出力します。
/// </remarks>
void OnPhotonJoinRoomFailed(){}
void OnPhotonJoinRoomFailed(object[] codeAndMsg){
//codeAndMsg[0]は エラーコード です。(int)
//codeAndMsg[1]は デバッグメッセージ です。(string)
}
</pre>
<h2>
OnCreatedRoom</h2>
<pre class="brush : csharp ;">/// <summary>
/// このクライアントが部屋を作成し、入室する際に呼び出されます。
/// この後、OnJoinedRoom() は同様に呼び出されます。
/// </summary>
/// <remarks>
/// このコールバックは部屋を作成(PhotonNetwork.CreateRoom)したクライアント上でのみ、呼び出されます。
/// クライアントはいつでも閉じる(もしくは接続を切る)可能性があり、
/// タイミングによってはOnCreatedRoomは呼び出されません。
///
/// もし部屋に関する特定のプロパティや"開始信号"が必要な場合、
/// 部屋の状態を確認するためにマスタークライアントを作り、
/// OnMasterClientSwitched()を実装するのが安全です。
/// </remarks>
void OnCreatedRoom(){}
</pre>
<h2>
OnJoinedLobby</h2>
<pre class="brush : csharp ;">/// <summary>
/// マスターサーバー上のロビーに入った際に呼び出されます。
/// 部屋のリストが更新されるとOnReceivedRoomListUpdate()が呼び出されます。
/// </summary>
/// <remarks>
/// 注意:PhotonNetwork.autoJoinLobby が false の場合、
/// OnConnectedToMaster() が呼び出され、部屋のリストが利用可能になることはありません。
///
/// ロビーに居る間、部屋のリストは自動的に一定間隔で更新されます。
/// (間隔はあなたが変更する事はできません。)
/// </remarks>
void OnJoinedLobby(){}
</pre>
<h2>
OnLeftLobby</h2>
<pre class="brush : csharp ;">/// <summary>
/// ロビーを退出した際に呼び出されます。
/// </summary>
/// <remarks>
/// (よくわからんかった。以下原文)
/// When you leave a lobby, [CreateRoom](@ref PhotonNetwork.CreateRoom) and [JoinRandomRoom](@ref PhotonNetwork.JoinRandomRoom)
/// automatically refer to the default lobby.
/// </remarks>
void OnLeftLobby(){}
</pre>
<h2>
OnDisconnectedFromPhoton</h2>
<pre class="brush : csharp ;">/// <summary>
/// Photonサーバーから切断した際に呼び出されます。
/// </summary>
/// <remarks>
/// いくつかのケースでは、OnDisconnectedFromPhoton()の前に他のコールバックが呼び出されます。
/// 例)OnConnectionFail() や OnFailedToConnectToPhoton()
/// </remarks>
void OnDisconnectedFromPhoton(){}
</pre>
<h2>
OnConnectionFail</h2>
<pre class="brush : csharp ;">/// <summary>
/// 何らかの原因で接続が失敗した際に OnDisconnectedFromPhoton() に続いて呼び出されます。
/// </summary>
/// <remarks>
/// サーバーへ到達できない場合は代わりに OnFailedToConnectToPhoton()
/// が呼び出され、エラーの原因はStatusCodeとして提供されます。
/// </remarks>
void OnConnectionFail(DisconnectCause cause){}
</pre>
<h2>
OnFailedToConnectToPhoton</h2>
<pre class="brush : csharp ;">/// <summary>
/// Photonサーバーへの接続が確立される前に接続呼び出しが失敗すると呼び出されます。
/// OnDisconnectedFromPhoton() に続いて呼び出されます。
/// </summary>
/// <remarks>
/// (よくわからんかった。以下原文)
/// OnConnectionFail only gets called when a connection to a Photon server was established in the first place.
/// </remarks>
void OnFailedToConnectToPhoton(DisconnectCause cause){}
</pre>
<h2>
OnReceivedRoomListUpdate</h2>
<pre class="brush : csharp ;">/// <summary>
/// 部屋のリストが更新された場合に呼び出されます。
/// 新規か更新かの違いはありません。
/// これはマスターサーバー上のロビー内でのみ呼び出されます。
/// </summary>
/// <remarks>
/// 全てのタイプのロビーがクライアントへの部屋リスト通知を提供するわけではありません。
/// 中にはサーバーサイドでのマッチメイキングに特化し、サイレントのものもあります。
///
/// PUNでは PhotonNetwork.GetRoomList() による部屋リストの取得が可能です。
/// 取得される各項目はカスタムプロパティを含んだRoomInfoです。
/// これらの情報はロビー上で部屋を作る際に定義したものです。
/// </remarks>
void OnReceivedRoomListUpdate(){}
</pre>
<h2>
OnJoinedRoom</h2>
<pre class="brush : csharp ;">/// <summary>
/// 部屋に入った際に呼び出されます。(部屋作成時もしくは参加時)
/// これは全てのクライアント(マスタークライアント含む)で呼び出されます。
/// </summary>
/// <remarks>
/// このメソッドはプレイヤーキャラクタの生成のためによく使われます。
/// もしあなたがより"積極的に"呼び出す必要がある場合は
/// 代わりに PhotonView.RPC を利用する事が出来ます。
///
/// これが呼び出されたとき、
/// あなたは PhotonNetwork.playerList を介して
/// 部屋に存在するプレイヤーにアクセスできます。
/// また、Room.customProperties を介して部屋のカスタムプロパティも利用できます。
/// ゲームを開始できる人数がいるかどうかは、Room.playerCount で確認できます。
/// </remarks>
void OnJoinedRoom(){}
</pre>
<h2>
OnPhotonPlayerConnected</h2>
<pre class="brush : csharp ;">/// <summary>
/// リモートプレイヤーが部屋に入ったときに呼び出されます。
/// 入室したプレイヤーは既に PhotonNetwork.playerList に追加されています。
/// </summary>
/// <remarks>
/// もしあなたのゲームが特定の人数で始まる場合、このコールバックが役立ちます。
/// Room.playerCount を確認し、開始できるか確認しましょう。
/// </remarks>
void OnPhotonPlayerConnected(PhotonPlayer newPlayer){}
</pre>
<h2>
OnPhotonPlayerDisconnected</h2>
<pre class="brush : csharp ;">/// <summary>
/// リモートプレイヤーが部屋を抜けた際に呼び出されます。
/// 退室したプレイヤーは既に PhotonNetwork.playerList から除外されています。
/// </summary>
/// <remarks>
/// あなたのクライアントが PhotonNetwork.leaveRoom を呼び出した場合、
/// PUNは残ったクライアント上でこのメソッドを呼び出します。
/// リモートクライアントの接続が切れると、
/// 数秒後のタイムアウトの後、このコールバックが呼び出されます。
/// </remarks>
void OnPhotonPlayerDisconnected(PhotonPlayer otherPlayer){}
</pre>
<h2>
OnPhotonRandomJoinFailed</h2>
<pre class="brush : csharp ;">/// <summary>
/// JoinRandom() の呼び出しが失敗した際に呼び出されます。
/// オプションパラメータによってエラーコードおよびエラーメッセージを提供します。
/// </summary>
/// <remarks>
/// よくあるのは「全ての部屋が満員」「一つも部屋がない」などです。
/// もし(JoinLobbyやTypedLobbyを介して)複数のロビーを使用している場合、
/// 他のロビーは接続可能な部屋を持っているかもしれません。
/// PhotonNetwork.logLevel を PhotonLogLevel.Informational 以上二している場合、
/// PUNはいくつかの情報をログ出力します。
/// </remarks>
void OnPhotonRandomJoinFailed(){}
void OnPhotonRandomJoinFailed(object[] codeAndMsg){
//codeAndMsg[0]は エラーコード です。(int)
//codeAndMsg[1]は デバッグメッセージ です。(string)
}
</pre>
<h2>
OnConnectedToMaster</h2>
<pre class="brush : csharp ;">/// <summary>
/// PhotonNetwork.autoJoinLobby が false の状態で、
/// マスターサーバーへ接続および認証が完了した際に呼び出されます。
/// </summary>
/// <remarks>
/// もしあなたが PhotonNetwork.autoJoinLobby に true をセットしている場合、
/// これの代わりに OnJoinedLobby() が呼び出されます。
///
/// あなたがロビーにいない場合でも、部屋を作ったり参加したりできます。
/// デフォルトのロビーはその場合に用いられます。
/// PhotonNetwork.joinLobby によってロビーに入っている場合を除いて、
/// 利用可能な部屋のリストが更新される事はありません。
/// </remarks>
void OnConnectedToMaster(){}
</pre>
<h2>
OnPhotonSerializeView</h2>
<pre class="brush : csharp ;">/// <summary>
/// PhotonViewが定期的に同期するデータをカスタマイズするために実装します。
/// PhotonViewによってネットワークアップデートが観察されるたびに呼び出されます。
/// </summary>
/// <remarks>
/// このメソッドはPhotonViewによって監視対象にされているスクリプト上で呼び出されます。
/// PhotonNetwork.sendRateOnSerialize はこのメソッドが呼び出される頻度に影響します。
/// PhotonNetwork.sendRate はこのクライアントによってパッケージが送信される頻度に影響します。
///
/// このメソッドの実装によって、PhotonViewが定期的に同期するデータをカスタマイズすることができます。
/// あなたのコードは クライアントから何が送信され、何を受信するか、を定義することができます。
///
/// 他のコールバックとは異なり、PhotonView.observed に設定されたScriptでのみ呼び出されます。
///
/// このメソッドを利用するためには、PhotonStreamが必要不可欠です。
/// 書き込みを行う側のクライアント(PhotonStream.isWriting == true)と
/// 読み取りを行う側のクライアントに別れてデータの送受信を行います。
///
/// もし書き込みを行わないと、PUNは更新をスキップします。
/// これを利用すればネットワークの帯域幅を節約する事が出来ます。
///
/// 送信を行わない場合、受信側はOnPhotonSerializeViewが呼び出されていないことに注意してください。
/// そのため「x回の受信ごとに」といった処理はできません。
/// </remarks>
void OnPhotonSerializeView(PhotonStream stream, PhotonMessageInfo info){}
</pre>
<h2>
OnPhotonInstantiate</h2>
<pre class="brush : csharp ;">/// <summary>
/// PhotonNetwork.Instantiate によって GameObject(とその子供)が生成された際に呼び出されます。
/// </summary>
/// <remarks>
/// PhotonMessageInfoパラメータは「誰が」「いつ」作成したかを提供します。
/// (「いつ」は PhotonNetworking.time に基づきます。)
/// </remarks>
void OnPhotonInstantiate(PhotonMessageInfo info){}
</pre>
<h2>
OnPhotonMaxCccuReached</h2>
<pre class="brush : csharp ;">/// <summary>
/// CCUの制限(一時的な物)によってサーバーへの接続が切断された際に呼び出されます。
/// </summary>
/// <remarks>
/// これが発生した場合は、一定時間をおいて再試行してください。
/// これが発生した場合、すでに切断されているため部屋に入ることはできません。
///
/// あなたは新しいライセンスの適用や拡張サブスクリプションによってCCUの制限を上げる事が出来ます。
/// CCU制限に達したとき、PhotonCloudはあなたにメールを送信します。
/// また、Webページ上のダッシュボードでも確認できます。
/// </remarks>
void OnPhotonMaxCccuReached(){}
</pre>
<h2>
OnPhotonCustomRoomPropertiesChanged</h2>
<pre class="brush : csharp ;">/// <summary>
/// 部屋のカスタムプロパティが変更された際に呼び出されます。
/// 引数のpropertiesThatChanged には Room.SetCustomProperties()
/// でセットされた全てのプロパティが含まれます。
/// </summary>
/// <remarks>
/// v1.25以降、このメソッドは1つの引数を持ちます。(Hashtable propertiesThatChanged)
/// ローカル上での変更においても、カスタムプロパティの変更は
/// 必ずRoom.SetCustomPropertiesによって行われる必要があります。
/// </remarks>
void OnPhotonCustomRoomPropertiesChanged(Hashtable propertiesThatChanged){}
</pre>
<h2>
OnPhotonPlayerPropertiesChanged</h2>
<pre class="brush : csharp ;">/// <summary>
/// カスタププレイヤープロパティが変更された際に呼び出されます。
/// プレイヤーと変更されたプロパティは object[] として渡されます。
/// </summary>
/// <remarks>
/// v1.25以降、このメソッドは1つの引数を持ちます。(object[] playerAndUpdatedProps)
/// これには2つのエントリが含まれます。
/// [0] は影響を受けた PhotonPlayer です。
/// [1] は変更されたプロパティのハッシュテーブルです。
/// (私たちはUnityのGameObject.SendMessageの仕様により、object[]を使用している。)
///
/// ローカル上での変更においても、カスタムプロパティの変更は
/// 必ずPhotonPlayer.SetCustomPropertiesによって行われる必要があります。
/// </remarks>
void OnPhotonPlayerPropertiesChanged(object[] playerAndUpdatedProps){
PhotonPlayer player = playerAndUpdatedProps[0] as PhotonPlayer;
Hashtable props = playerAndUpdatedProps[1] as Hashtable;
//...
}
</pre>
<h2>
OnUpdatedFriendList</h2>
<pre class="brush : csharp ;">/// <summary>
/// サーバーが FindFriends リクエストに対してPhotonNetwork.Friendsを更新し、
/// 応答を送信した際に呼び出されます。
/// </summary>
/// <remarks>
/// フレンドリストはPhotonNetwork.Friendsによって
/// 名前の一覧、オンライン状態、(もし入っているなら)部屋などを取得できます。
/// </remarks>
void OnUpdatedFriendList(){}
</pre>
<h2>
OnCustomAuthenticationFailed</h2>
<pre class="brush : csharp ;">/// <summary>
/// カスタム認証に失敗し、切断された際に呼び出されます。
/// </summary>
/// <remarks>
/// ユーザーの入力や不正なトークン/シークレットなどによってカスタム認証は失敗することがあります。
/// もし認証に成功した場合、このメソッドは呼ばれません。
/// (一般的には) OnJoinedLobby() か OnConnectedToMaster() を実装します。
///
/// ゲームの開発中、それはサーバーサイドの謝った設定により失敗することがあります。
/// そのような場合は、デバッグメッセージをログに記録する事は非常に重要です。
///
/// あなたがあなたのアプリに対して(ダッシュボード上で)カスタム認証を設定しない限り、これが呼ばれる事はありません。
/// </remarks>
void OnCustomAuthenticationFailed(string debugMessage){}
</pre>
<h2>
OnWebRpcResponse</h2>
<pre class="brush : csharp ;">/// <summary>
/// PUNがWebRPCを受信した際に呼び出されます。
/// PhotonNetwork.WebRPC を参照してください。
/// </summary>
/// <remarks>
/// 重要:もしPhotonがあなたのWebServiceに到達できるならresponse.ReturnCodeは0です。
/// 応答の内容はあなたのWebServiceが送信した物です。
/// あなたはこれを元にWebResponseのインスタンスを生成できます。
///
/// 例)WebRpcResponse webResponse = new WebRpcResponse(operationResponse);
///
/// 注意:OperationResponseクラスは下記名前空間に含まれています。
/// using ExitGames.Client.Photon;
///
/// PhotonからのOperationResponse.ReturnCodeは以下の通りです。
/// 0 : OK
/// -3 : Webサービスが未設定です。(ダッシュボード、WebHooksを確認)
/// -5 : Webサービスは現在RPCのためのpath/nameを持っていません。(少なくともAzureのため)
/// </remarks>
void OnWebRpcResponse(OperationResponse response){}
</pre>
<h2>
OnOwnershipRequest</h2>
<pre class="brush : csharp ;">/// <summary>
/// PhotonViewの現在の所有者であるあなたに対して、
/// 他のプレイヤーが所有権を要求したときに呼び出されます。
/// </summary>
/// <remarks>
/// viewAndPlayerには2つのエントリが含まれます。
/// [0] は対象のPhotonViewです。
/// [1] は要求を行ったPhotonPlayerです。
/// </remarks>
void OnOwnershipRequest(object[] viewAndPlayer){
PhotonView view = viewAndPlayer[0] as PhotonView;
PhotonPlayer requestingPlayer = viewAndPlayer[1] as PhotonPlayer;
//...
}</pre>
naichilabhttp://www.blogger.com/profile/11086576268699869652noreply@blogger.comtag:blogger.com,1999:blog-1059621179156545272.post-8575758616002462102014-12-11T01:58:00.000+09:002014-12-11T01:58:46.247+09:00【Unity、UniRx】画面の向きが変化したことを検出する<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEisafRdDBQBYj6wTECmNhytWAMXDkHTW8hLIZ0oVcAeOStnnj-A0pJICK_Lp2DxyJW56eBxtD9NGkcXEcNiwSmb0T4qsbR_3_UVoe-EgWIL4XvyGPBFH0FTiIljQPgNdctgm2dqLx1KiZY/s1600/UniRx.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEisafRdDBQBYj6wTECmNhytWAMXDkHTW8hLIZ0oVcAeOStnnj-A0pJICK_Lp2DxyJW56eBxtD9NGkcXEcNiwSmb0T4qsbR_3_UVoe-EgWIL4XvyGPBFH0FTiIljQPgNdctgm2dqLx1KiZY/s320/UniRx.png" /></a></div>
<br />
@Baiteen<br />
<br />
ReactiveExtensionsがUnityでも使えるってのを今更知ったので、今更ながら使ってみた。その9。<br />
<br />
<h2>
やりたいこと</h2>
ReactiveExtensionsを使って画面の向きが変化したことを検出する。<br />
<br />
<h2>
やり方</h2>
Input.deviceOrientationで現在のデバイスの画面の向きを取れるので、これが変化した時だけ値を発行させる。
<script src="https://gist.github.com/giteen/d2819f6c51b40166c30a.js"></script>
<br />
ソース全体は<a href="https://github.com/giteen/UnityDeviceOrientationChangedObservable" target="_BLANK">こちらのGithub</a><br />
<br />
これだと実機で試してねってなっちゃうので、せっかくなのでWebPlayerでも雰囲気確認できるようにCube置いてみた。<br />
<iframe seamless style='border:none;margin:0;padding:0;overflow:hidden;' src='http://unityroom.com/games/play/309/1/480/300' width='480' height='300' scrolling='no'></iframe><div>Hosted by <a href='http://unityroom.com/games/play/309' target='_blank'>UnityRoom.com</a></div>
<br />
ついでにトースト表示クラスをシングルトンにしてみた。<br />
CanvasとEventSystemをスクリプトからする方法がわからない。<br />
<br />baiteenhttp://www.blogger.com/profile/05581487733491062713noreply@blogger.comtag:blogger.com,1999:blog-1059621179156545272.post-69709649750987486832014-11-30T23:39:00.000+09:002014-11-30T23:39:12.880+09:00【Berkshelf】The resource at 'hoge' does not appear to be a valid cookbook. Does it have a metadata.rb?<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiaMR-MEFm3ssXeiNuBgdg8GfYqui_KKGkyJTW7kaLuGV89v3KdnORnuTN2X0gnKXDgLMEjBKZUNs7NMObwZjwHKX2rDWBVMwD-X33K9mkVQXQmixBpiV7PFC9-rLCdmtVXxpsPst-WdBA/s1600/20141130001.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiaMR-MEFm3ssXeiNuBgdg8GfYqui_KKGkyJTW7kaLuGV89v3KdnORnuTN2X0gnKXDgLMEjBKZUNs7NMObwZjwHKX2rDWBVMwD-X33K9mkVQXQmixBpiV7PFC9-rLCdmtVXxpsPst-WdBA/s1600/20141130001.png" /></a></div>
まだまだエラーは続くよー。<br />
この本の通り書いててこの本の通り書いててvendoring cookbookしたらエラーした。<br />
<table border="0" cellpadding="5" style="border-spacing: 5px; border: 0px none;"><tbody>
<tr><td align="left" style="vertical-align: top;" valign="top"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4844336789/naichilab-22/ref=nosim/" target="_blank"><img alt="CakePHPで学ぶ継続的インテグレーション" src="http://ecx.images-amazon.com/images/I/51ddWU7EoaL._SL75_.jpg" /></a></td><td align="left" style="vertical-align: top;" valign="top"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4844336789/naichilab-22/ref=nosim/" target="_blank">CakePHPで学ぶ継続的インテグレーション</a><br />
渡辺 一宏,吉羽 龍太郎,岸田 健一郎,穴澤 康裕,丸山 弘詩</td></tr>
</tbody></table>
<br />
<h2>
エラー</h2>
デプロイツール?のCapistrano3っていうのを開発用仮想マシンに入れるところ。<br />
下記コマンドでcookbookのひな形を作って<br />
<pre class="brush : plain ;">bundle exec knife cookbook create capistrano -o site-cookbooks</pre>
できたフォルダのrecipes/default.rbを変更、<br />
Vagrantfileのrun_listに追記して、<br />
Berksfileを修正。<br />
<pre class="brush : plain ; highlight:[6];">source "http://api.berkshelf.com"
cookbook "apt"
cookbook "phpenv", path: "./site-cookbooks/phpenv"
cookbook "hostsfile"
cookbook "capistrano", path: "./site_cookbooks/capistrano"</pre>
で、cookbooksをvendoringしたらエラーした。<br />
<br />
<pre class="brush : plain ; highlight:[5];">naichilabmba:vagrant_book hu$ bundle exec berks vendor cookbooks
Resolving cookbook dependencies...
Fetching 'phpenv' from source at site-cookbooks/phpenv
Fetching 'capistrano' from source at site_cookbooks/capistrano
The resource at '/Users/hu/Documents/vagrant_book/site_cookbooks/capistrano' does not appear to be a valid cookbook. Does it have a metadata.rb?</pre>
<br />
<h2>
metadata.rb?
</h2>
metadata.rbはどう見てもあるんだよなぁ。<br />
<pre class="brush : plain ;">naichilabmba:vagrant_book hu$ ls site-cookbooks/capistrano/
CHANGELOG.md README.md attributes definitions files libraries metadata.rb providers recipes resources templates</pre>
なぜだ…<br />
phpenvの方のvendoringは問題なく成功してるし…。うーむ。<br />
<br />
phpenvの方<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj6kgAjOFJyvgKUTElgkKaXbqKQ-ruByI9A0mD04sN-L5_9Mg1ZyslyZWVFBn1-Jf6Fi7DbyhQmy9eatYYlymUwPLaoi80PHi6rZns6polb0jrAWQADuGJikOM8UAoAgSE0s4wbuFnd5oA/s1600/20141130002.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj6kgAjOFJyvgKUTElgkKaXbqKQ-ruByI9A0mD04sN-L5_9Mg1ZyslyZWVFBn1-Jf6Fi7DbyhQmy9eatYYlymUwPLaoi80PHi6rZns6polb0jrAWQADuGJikOM8UAoAgSE0s4wbuFnd5oA/s1600/20141130002.png" height="102" width="320" /></a></div>
<br />
capistranoの方<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgd1GYiauggAb37iOBevaQ11IH3LBFYq5WTGiqsqTe58wdQz31qE06mqeu2VK12vuzuT5E0-q175t-tOYvZRr-tw0aqcSmPEV3EFO28VFaLXbnwT4U61B3yd11NnFCxhEKa_K8dRD-YIr0/s1600/20141130003.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgd1GYiauggAb37iOBevaQ11IH3LBFYq5WTGiqsqTe58wdQz31qE06mqeu2VK12vuzuT5E0-q175t-tOYvZRr-tw0aqcSmPEV3EFO28VFaLXbnwT4U61B3yd11NnFCxhEKa_K8dRD-YIr0/s1600/20141130003.png" height="105" width="320" /></a></div>
<br />
phpenvの方は1行追加してあるけど他は全く一緒だよなぁ。<br />
そもそも「knife cookbook create」で作ったテンプレートのままだし。<br />
<br />
ためしにphpenvの方のmetadata.rbをリネームしてberks vendorしてみた。<br />
<pre class="brush : plain ;">naichilabmba:vagrant_book hu$ bundle exec berks vendor cookbooks
/Users/hu/.rbenv/versions/1.9.3-p547/lib/ruby/gems/1.9.1/gems/ridley-4.1.0/lib/ridley/chef/cookbook.rb:40:in `from_path': no metadata.json or metadata.rb found at /Users/hu/Documents/vagrant_book/site-cookbooks/phpenv (IOError)
from /Users/hu/.rbenv/versions/1.9.3-p547/lib/ruby/gems/1.9.1/gems/berkshelf-3.1.5/lib/berkshelf/locations/path.rb:21:in `cached_cookbook'
from /Users/hu/.rbenv/versions/1.9.3-p547/lib/ruby/gems/1.9.1/gems/berkshelf-3.1.5/lib/berkshelf/dependency.rb:126:in `cached_cookbook'
from /Users/hu/.rbenv/versions/1.9.3-p547/lib/ruby/gems/1.9.1/gems/berkshelf-3.1.5/lib/berkshelf/lockfile.rb:387:in `block in reduce!'
from /Users/hu/.rbenv/versions/1.9.3-p547/lib/ruby/gems/1.9.1/gems/berkshelf-3.1.5/lib/berkshelf/lockfile.rb:372:in `each'
from /Users/hu/.rbenv/versions/1.9.3-p547/lib/ruby/gems/1.9.1/gems/berkshelf-3.1.5/lib/berkshelf/lockfile.rb:372:in `reduce!'
from /Users/hu/.rbenv/versions/1.9.3-p547/lib/ruby/gems/1.9.1/gems/berkshelf-3.1.5/lib/berkshelf/installer.rb:32:in `run'
from /Users/hu/.rbenv/versions/1.9.3-p547/lib/ruby/gems/1.9.1/gems/berkshelf-3.1.5/lib/berkshelf/berksfile.rb:371:in `install'
from /Users/hu/.rbenv/versions/1.9.3-p547/lib/ruby/gems/1.9.1/gems/berkshelf-3.1.5/lib/berkshelf/berksfile.rb:590:in `vendor'
from /Users/hu/.rbenv/versions/1.9.3-p547/lib/ruby/gems/1.9.1/gems/berkshelf-3.1.5/lib/berkshelf/cli.rb:387:in `vendor'
from /Users/hu/.rbenv/versions/1.9.3-p547/lib/ruby/gems/1.9.1/gems/thor-0.19.1/lib/thor/command.rb:27:in `run'
from /Users/hu/.rbenv/versions/1.9.3-p547/lib/ruby/gems/1.9.1/gems/thor-0.19.1/lib/thor/invocation.rb:126:in `invoke_command'
from /Users/hu/.rbenv/versions/1.9.3-p547/lib/ruby/gems/1.9.1/gems/thor-0.19.1/lib/thor.rb:359:in `dispatch'
from /Users/hu/.rbenv/versions/1.9.3-p547/lib/ruby/gems/1.9.1/gems/berkshelf-3.1.5/lib/berkshelf/cli.rb:52:in `dispatch'
from /Users/hu/.rbenv/versions/1.9.3-p547/lib/ruby/gems/1.9.1/gems/thor-0.19.1/lib/thor/base.rb:440:in `start'
from /Users/hu/.rbenv/versions/1.9.3-p547/lib/ruby/gems/1.9.1/gems/berkshelf-3.1.5/lib/berkshelf/cli.rb:27:in `execute!'
from /Users/hu/.rbenv/versions/1.9.3-p547/lib/ruby/gems/1.9.1/gems/berkshelf-3.1.5/bin/berks:5:in `<top (required)>'
from /Users/hu/.rbenv/versions/1.9.3-p547/bin/berks:23:in `load'
from /Users/hu/.rbenv/versions/1.9.3-p547/bin/berks:23:in `<main>'
naichilabmba:vagrant_book hu$ </pre>
IOエラーに変わっただと…?
<br />
一旦phpenvの方のmetadata.rbを戻してcapistrano側のmetadata.rbをリネームしてみた。<br />
<pre class="brush : plain ;">naichilabmba:vagrant_book hu$ bundle exec berks vendor cookbooks
Resolving cookbook dependencies...
Fetching 'phpenv' from source at site-cookbooks/phpenv
Fetching 'capistrano' from source at site_cookbooks/capistrano
The resource at '/Users/hu/Documents/vagrant_book/site_cookbooks/capistrano' does not appear to be a valid cookbook. Does it have a metadata.rb?
naichilabmba:vagrant_book hu$ </pre>
結果変わらず。
どういう状態だろ。<br />
metadata.rbを読み込みに行く前に無いと判断されてる?
<br />
設定ファイルミスったかなぁ。<br />
<br />
<h2>
原因発見</h2>
改めてBerksfile眺めてたら見つけた。<br />
ひどいミス。<br />
<pre class="brush : plain ; highlight:[6,7];">source "http://api.berkshelf.com"
cookbook "apt"
cookbook "phpenv", path: "./site-cookbooks/phpenv"
cookbook "hostsfile"
#cookbook "capistrano", path: "./site_cookbooks/capistrano"
cookbook "capistrano", path: "./site-cookbooks/capistrano"</pre>
まぁそんなもんだよね…。
<br />
pathが含まれるエラーはとりあえずそのpathの存在見ないとな…すぐ分かったはずなのに。naichilabhttp://www.blogger.com/profile/11086576268699869652noreply@blogger.comtag:blogger.com,1999:blog-1059621179156545272.post-65441017676511898812014-11-29T18:45:00.000+09:002014-11-29T18:45:15.916+09:00【nginx】nginxがうまく起動しなくてログおっかけて修正するだけで数時間かかった。<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiJEPCLVPFk0aJ3kfJ-0OU33-wMSmZhDIp3cOQrxl8IJF68xfHIscxSVIcSNg1drTKRm5CKye2ya5eiVGYMKwpyU3bM4LAU1qzA2NWXmL8bPTnk6AfVXwXwQEvdLGmEssYqCKc0fPGkM74/s1600/nginx.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiJEPCLVPFk0aJ3kfJ-0OU33-wMSmZhDIp3cOQrxl8IJF68xfHIscxSVIcSNg1drTKRm5CKye2ya5eiVGYMKwpyU3bM4LAU1qzA2NWXmL8bPTnk6AfVXwXwQEvdLGmEssYqCKc0fPGkM74/s1600/nginx.png" height="65" width="320" /></a></div>
<br />
相変わらず下記の本を読みながらCI環境構築を進めてるんだけどnginxがうまく起動しなかった。<br />
<table border="0" cellpadding="5" style="border-collapse: separate; border-spacing: 5px; border: none 0;"><tbody>
<tr><td align="left" style="text-align: left; vertical-align: top;" valign="top"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4844336789/naichilab-22/ref=nosim/" target="_blank"><img alt="CakePHPで学ぶ継続的インテグレーション" src="http://ecx.images-amazon.com/images/I/51ddWU7EoaL._SL75_.jpg" /></a></td><td align="left" style="text-align: left; vertical-align: top;" valign="top"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4844336789/naichilab-22/ref=nosim/" target="_blank">CakePHPで学ぶ継続的インテグレーション</a><br />
渡辺 一宏,吉羽 龍太郎,岸田 健一郎,穴澤 康裕,丸山 弘詩</td></tr>
</tbody></table>
<br />
<h2>
エラー</h2>
本では vagrant provision するとChefがnginxの設定や起動までやってくれてすぐにindex.phpに繋がるよ!って書いてあるんだけどどうにもこうにも繋がらない。<br />
<br />
vagrant sshで対象の仮想マシンに繋いでnginxの状態を調べてみると…<br />
<pre class="brush : plain ;">vagrant@develop:~$ service nginx status
* nginx is not running</pre>
nginx起動してないじゃん…<br />
あと良くわからないのがstartしても何も応答がないんだよね・・・<br />
<pre class="brush : plain ;">vagrant@develop:~$ service nginx start
vagrant@develop:~$ service nginx start
vagrant@develop:~$ service nginx status
* nginx is not running
vagrant@develop:~$ </pre>
<br />
<h2>
ログ確認</h2>
じゃあnginxの起動ログ見てみようってことで探した。<br />
参考:<a href="http://heartbeats.jp/hbblog/2012/02/nginx03.html" target="_blank">http://heartbeats.jp/hbblog/2012/02/nginx03.html</a><br />
エラーログは「/var/log/nginx/error.log」ってとこにあるらしい。
<br />
<br />
ログを見ると…ファイルはあるけど現在時刻では何も残ってない…<br />
もしかしてssh接続したユーザーって起動コマンド打てない?って思ってsudoで再実行。<br />
<pre class="brush : plain ;">vagrant@develop:~$ sudo service nginx start
vagrant@develop:~$ </pre>
そうしたらログに行が増えてた<br />
<pre class="brush : plain ;">2014/11/29 09:20:15 [emerg] 12499#0: invalid number of arguments in "root" directive in /etc/nginx/sites-enabled/test:5</pre>
<br />
testって設定ファイルがおかしーよ!って言われてるっぽいなぁ。<br />
<br />
<h2>
原因</h2>
testってファイルは<br />
VagrantからChef経由でサーバーに作ったファイル。<br />
見てみる。<br />
<br />
test<br />
<pre class="brush : plain ; highlight:[4];">server {
listen 80;
root /var/www/application/current/app/webroot
index index.php index.html index.htm;
server_name test.localhost;
location / {
try_files $uri $uri/ /index.php?$args;
}
location ~ \.php$ {
try_files $uri =404;
include /etc/nginx/fastcgi_params;
fastcgi_pass unix:/var/run/php5-fpm.sock;
fastcgi_index index.php;
fastcgi_intercept_errors on;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param CAKE_ENV test;
}
}</pre>
4行目…セミコロンないよねorz<br />
<br />
<h2>
修正</h2>
ホストマシンのtest.erbを修正し、<br />
「rm -rf cookbooks」でcookbooksフォルダを一旦削除、<br />
「bundle exec berks vendor ./cookbooks」でBerkshelfを使ってcookbookを再作成<br />
「vagrant provision」で仮想マシンへ再度反映<br />
<br />
<h2>
結果</h2>
動いたーーーーーーーー<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiSFBCtC6Itwa3-tr-EM46OUsl_Y4Cv3dB2Jle1MuhZaoJWkBzQuzCAjQeI4i6rAqC7lWqaxIZS0S_LppElO7e62MPwb1naxDXmDWm-_9856o60dRsd7m8UqUB4pHBpVu-yWzBbpCKK4cc/s1600/20141129001.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiSFBCtC6Itwa3-tr-EM46OUsl_Y4Cv3dB2Jle1MuhZaoJWkBzQuzCAjQeI4i6rAqC7lWqaxIZS0S_LppElO7e62MPwb1naxDXmDWm-_9856o60dRsd7m8UqUB4pHBpVu-yWzBbpCKK4cc/s1600/20141129001.png" height="238" width="320" /></a></div>
こんな凡ミスで数時間持ってかれた…。<br />
まぁコマンド試行錯誤しててちょっとUNIXに慣れた気がするしいいか。naichilabhttp://www.blogger.com/profile/11086576268699869652noreply@blogger.comtag:blogger.com,1999:blog-1059621179156545272.post-90888395410028388052014-11-29T13:00:00.000+09:002014-11-29T15:30:14.720+09:00【MVNO】docomoを辞めてIIJmioに乗り換えました。乗り換え前後の料金とか公開。<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiyLRwOvTfMc5wM6uD4YqgSjai0eqANYQwXv6Edrt8fd68Ky0uwJbZ4fJJB-cXdqC7Ch4ggA9h9TbLTjPkLDWnP2t1-BfQ4KXp_g4near5W_u1kv64pDddpm5dsHa5gbQ3RTsZNBlHbbaQ/s1600/20141128001.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiyLRwOvTfMc5wM6uD4YqgSjai0eqANYQwXv6Edrt8fd68Ky0uwJbZ4fJJB-cXdqC7Ch4ggA9h9TbLTjPkLDWnP2t1-BfQ4KXp_g4near5W_u1kv64pDddpm5dsHa5gbQ3RTsZNBlHbbaQ/s1600/20141128001.png" height="167" width="320" /></a></div>
長い事使ってきた(13年ぐらい?)docomoをやめてIIJmioに乗り換えました。<br />
乗り換えるにあたって調べたことをメモしておきます。<br />
<br />
この記事を書いたのは 2014/11/28 です。<br />
もし乗り換えを検討してる方がいれば参考にどうぞ。<br />
<h2>
乗り換え理由</h2>
まぁ当たり前ですけど料金ですね。あまりにも高い。マンション光が2500円/月なのにスマホに1万円ってどうかしてる。もっと早く乗り換えとけばよかった。<br />
後述しますけど最近iPadMiniを買ったんで2台持ち運用の料金を比較したら乗り換え一択でした。<br />
<h2>
料金</h2>
スマホ+iPadMiniの2台運用を前提に下記料金比較を行いました。<br />
①docomo継続(スマホのみ)<br />
②docomo継続(iPad用にSIM追加)<br />
③IIJmioにMNP(SIM2枚契約)<br />
<br />
<h3>
①docomo継続(スマホのみ)</h3>
だいたい月8000円+端末代2000円で10000円ちょいぐらい。<br />
<br />
ざっくり内訳。<br />
まずは定額分が<br />
・基本使用料+Xiカケホーダイ1500円<br />
・SPモード+パケット定額6000円<br />
従量課金が<br />
・通話料500〜1000円<br />
端末代が<br />
・端末代(分割) 2000円ぐらい<br />
こんな感じ。<br />
<br />
これで受けられるサービスは<br />
・無料通話なし(docomoへの通話は無料)<br />
・通信量7G<br />
ですね。<br />
<br />
端末代はいいとして<br />
電話しないし7Gの通信量で8000円は高いなぁ。<br />
<br />
<h3>
②docomo継続(iPad用にSIM追加)</h3>
docomoが(というかS社もA社もだけど)新料金プランを発表して、通信有無にかかわらず端末1台で3000円(タブレットなら大体2000円)かかるようになりましたね。<br />
参考:<a href="http://andronavi.com/2014/07/328626" target="_blank">3社出揃う!ドコモに追随したauとソフトバンク新料金プランの違いとは?</a><br />
<br />
ちょうどdocomoのサイトにシミュレータがありました。<br />
<a href="https://www.nttdocomo.co.jp/charge/new_plan/simulation/index.html?icid=CRP_CHA_rec1_new_plan_simulation" target="_blank">「カケホーダイ&パケあえる」かんたんシミュレーション 家族でご利用の場合</a><br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg26dq4VPai6O6Zlfg41CrutTVP8ougB3e6JLEQbk9QYxPz50-kZPdME1rU1Irw3Na29LoXV76oj8Egg6u5VDtYg1Q8AarHwGyCTR2sU-7yp03VKnFJmtjqD1MLZShqZ7j03WFT2X521F8/s1600/20141128002.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg26dq4VPai6O6Zlfg41CrutTVP8ougB3e6JLEQbk9QYxPz50-kZPdME1rU1Irw3Na29LoXV76oj8Egg6u5VDtYg1Q8AarHwGyCTR2sU-7yp03VKnFJmtjqD1MLZShqZ7j03WFT2X521F8/s1600/20141128002.png" height="137" width="320" /></a></div>
・スマホ基本使用料3000円<br />
・タブレット基本使用料2000円<br />
・通信量10G(シェア) 9200円<br />
<br />
サービスは<br />
・docomoだけでなく他社・固定電話にもカケホーダイ<br />
・通信量10G<br />
<br />
合計14200円<br />
た、高い、、、かけホーダイとかいらないし…<br />
ちょっとボリすぎじゃないですかね<br />
<br />
<h3>
③IIJmioにMNP(SIM2枚契約)</h3>
最後はIIJmioの<a href="https://www.iijmio.jp/hdd/service/miofone.jsp" target="_blank">みおふぉん</a><br />
(他にもMVNOいっぱいあるけど評判とか見てったら自然とIIJに落ち着きました)<br />
<br />
いろいろプランあるけどちょうど良さそうな組み合わせはこんな感じ。<br />
<br />
・ファミリーシェアプラン 2560円/月<br />
↑通信量7G、SIM最大3枚<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjvBD2o8PcllmP573iwu02i8aMprLSSRzvL5iJXUORqGgV0ix4Yq8RLu11FGUy_2j_d2m1PMCaVFdvTNXZM9Z6AsBLs4cLVUM4FiI3qdChVwBoQsfUh6lL9jMWTBBSHUs6h4EiSOTuQMOM/s1600/20141128003.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjvBD2o8PcllmP573iwu02i8aMprLSSRzvL5iJXUORqGgV0ix4Yq8RLu11FGUy_2j_d2m1PMCaVFdvTNXZM9Z6AsBLs4cLVUM4FiI3qdChVwBoQsfUh6lL9jMWTBBSHUs6h4EiSOTuQMOM/s1600/20141128003.png" height="101" width="320" /></a></div>
・音声通話機能付きSIMを追加 700円/月<br />
↑スマホ用<br />
・SMS機能付きSIMを追加 140円/月<br />
↑iPadMini用<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgUkdumZfuvADpO1K9E0RlRVk_JoxTfIfW4BIIKCzj7ZIbxGTQ2Ax4vocQJQ1-hFJmuRfVC92LSnfYwpEa8jii3osATn3tV9JUXmn5vIeLrTJLoFMhXpes2e1JPNWIZ7hdgnsecLOf65Nc/s1600/20141128004.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgUkdumZfuvADpO1K9E0RlRVk_JoxTfIfW4BIIKCzj7ZIbxGTQ2Ax4vocQJQ1-hFJmuRfVC92LSnfYwpEa8jii3osATn3tV9JUXmn5vIeLrTJLoFMhXpes2e1JPNWIZ7hdgnsecLOf65Nc/s1600/20141128004.png" height="101" width="320" /></a></div>
<br />
合計 3400円 安い。<br />
<br />
これでサービスは<br />
・無料通話無し(30秒20円)<br />
・通信量7G(SIM2枚で共有)<br />
<br />
十分すぎる…<br />
インフラはドコモを使ってるらしく、ドコモのスマホならSIMロック気にせず使えるようです。ドコモの回線ならエリア気にせず使えていいですねー。<br />
これに決めた!<br />
<br />
<h3>
乗り換え前後の料金</h3>
月々10000円(端末代含む)→3400円なので6600円安くなった。<br />
docomoの端末代が残り3回残ってて、違約金かからず解約できるのが来年4月だった。<br />
無理にやめると端末サポートも切れるから22000円ぐらい払うことになるけど4ヶ月で元が取れる計算。<br />
テザリング運用よりも楽だし今乗り換えた方がお得と判断して乗り換え決行。<br />
<h2>
MNPの流れ</h2>
自分の行った手続きとスケジュール感をざっくり。<br />
<br />
11/20(木)<br />
・ドコモのサイトでMNP番号発行しようとしたが蹴られる<br />
どうも主回線(親と家族契約してた)だとダメみたい。<br />
・ドコモに電話してどうやったら主回線切り替えられるか質問<br />
ドコモショップに出向く以外に方法はないらしい。めんどい。<br />
11/22(土)<br />
・ドコモショップへ<br />
・1時間ぐらい待ってから手続き開始。簡単に主回線の変更&MNP発行できた。<br />
・正直に高いからMNPするって言ってしまったけどニコニコ対応してくれて好印象だった。<br />
11/25(火)<br />
・13:00ごろ<br />
・IIJmioのサイトで申し込み開始<br />
・始めてなのでmioIDっていうものを新規に取得。<br />
・プランとSIMの形態を選んで申し込み完了。<br />
・すぐにメールが来た。本人確認できる写真を送ってくれって。<br />
・13:05ごろ<br />
・スマホで免許証の写真とってそのままアップロード<br />
・めっちゃ簡単<br />
・すぐにメールが来た。受付完了したよって。<br />
・18:45<br />
・メール来た。本人確認完了したよって。<br />
・到着予定日が決まり次第再度メールしますって書かれてた。<br />
・22:09<br />
・またメール来た。転入手続き進めるから数時間〜1日以内に今の電話番号は使えなくなるよって。<br />
11/26(水)<br />
・11:00ごろ<br />
・気づいたら圏外になってた。docomo解約されたのね。<br />
・21:00帰宅<br />
・ちょっと期待してたけどやっぱり届いてなかった。<br />
11/27(木)<br />
・06:12<br />
・メール来た。利用開始&お届け予定日のお知らせ。<br />
・音声SIMは27日<br />
・SMSSIMは28日<br />
・23:00帰宅<br />
・嫁に聞いたら22:00すぎに届けにきたらしい。がんばるねヤマトさん。<br />
・スマホにSIMさしてなんなく開通。<br />
11/28(金)<br />
・22:00帰宅<br />
・SMSSIMも届いてた。お知らせ通り。<br />
・iPadにSIMさして接続確認完了<br />
<br />
スマホが使えなかったのは30時間ぐらい。<br />
郵送の時間も入ってることを考えても結構速いんじゃないかな。<br />
どうしても使えないと困るって人は店頭でやってもらうといいかも。<br />
<br />
このまましばらく使ってみよ。<br />
もし質問とかあればTwitterでもコメントでもお気軽にどうぞー。<br />
<br />
<h2>
追記</h2>
Twitterとかで質問あった内容を書いておきます。<br />
<h4>
2014/11/29 どうしてみおふぉんにしたの?</h4>
たくさんあるMVNO業者の中で最初にIIJに目をつけた理由は自分の中でほかの業者に比べて企業イメージがよかったから。それだけ。<br />
少し調べたら通信料シェアや翌月繰り越し、高速・低速通信の切り替えアプリとか十分すぎるサービスだったのであまりほかの業者は調べてない。<br />
ちゃんと調べればもっとお得なMVNO業者はあるかもですね~。naichilabhttp://www.blogger.com/profile/11086576268699869652noreply@blogger.com