時雨に舞う

プログラミングや技術情報などの備忘録

Unityで#ifを使う

C#でプログラムを書いている前提で、Defineシンボルの定義によって実行コードを分岐される方法です。

C言語みたいな「#ifdef」ではなく「#if」になります。

(1)プログラム側

 #if USE_AAA
  :
 #endif

(2)エディタ側

「File」→「Build Settings」→「Player Settings」

「Other Settings」の項目を開き「Configuration」「Scripting Define Symboles」に定義を記載する。

例> USE_AAA;USE_BBB

複数ある場合はセミコロン

 

ちなみにここを変更すると

 ProjectSettings/ProjectSettings.asset

が変わります。

 

 

著者:t.n

Selenium IDE を使ってみた

Webサービスのテストを行う際に商品や会員などをひたすら登録する単純作業が発生したら、Selenium IDE を検討してみてはいかがでしょうか。

Selenium IDE はブラウザ上の自動テストツールです。

手軽に使うには Firefox をインストールして、アドオンで Selenium IDE を追加します。色々と準備すれば他のブラウザもできるようですが、取り敢えず今回の要件はデータ入力なのでブラウザは問わないのです。

所感としては強力なような非力なような、標準でテストケースの繰り返し処理を入れて欲しかったが・・・、他のアドオンやコードの工夫で対応するしか無さそうですね。

 

1.まずは一連の動作を記録しよう

Selenium IDE は記録モード(赤い丸ボタン)があり、それをONにした状態でブラウザ上のコントロールをクリックしたり、テキストボックスに入力を行うと、1アクション→1行という単位で変換してくれます。

例えば「あいうえお」と入力したら

 type | id=txtName | あいうえお

といった具合です。上記のパイプで繋ぐ表現は

 コマンド | 対象 | 値

とご理解ください。

 

2.記録された内容を整理しよう

途中でクリックミスしたり誤入力したりすると、意図しない行が生成されるのでその辺りを削除するなどして必要なフローだけ残るようにしましょう。

 

3.コンボボックスに注意しよう

コンボボックスの中には画面内に捉えてないと失敗する事があります。

そんな時は画面をスクロールさせ、画面内に捉えてからクリック動作するように調整してみてはいかがでしょうか。

 storeEval | selenium.browserbot.getCurrentWindow().scrollTo(0,1900) |

この1900が座標値ですが、この値は何回か試して出したものです。コントロールの位置やブラウザの画面サイズなどから計算する事もできるかもしれませんが、今回はそんなに多くなかったのでマジックナンバーで失礼。

 

4.上記2.の内容を関数化しよう

追加でアドオン「SelBlocks」を入れると関数化など便利なコマンドが追加されます。それを使って関数にしてしまえば、繰り返し処理も書き易いです。

 function | 関数名 |
  :
 endFunction | |

これで関数ができました。繰り返しの呼び出し部を最初に持ってきて、関数を後に記述するといいかと思い、下記のようにしてみました。

 for | i=0; i<10; i++ | i
 call | 関数名 |
 endFor
 exitTest

 function | 関数名 |
  :
 endFunction | |

ようやくやりたかった繰り返し処理ができました。

 

5.変数を使ってワンランク上の自動化を目指してみよう

ここまできたら商品IDなどユニークな文字列を動的に生成しつつイテレートしたいなぁ~と思うのが普通ですよね。

  store | 値 | 変数名
 ※2番目が値である点に注意!Selenimu IDE の画面上は3番目のキャプションが「値」となっている!!

また、文字列と数値を結合したり、四則演算する場合は

 storeEval | javascript | 変数名

という形でjavascriptに頼るのが一般的(?)らしいです。ベストプラクティスは他にもあるかもしれませんが…。

例えばユーザーIDの命名規則が'XYZ'に続けてゼロ埋め6桁数値で、forループ内のiを使って増加させていく場合、

 store | 1234 | baseUserId
 storeEval | 'XYZ'+('00000'+(parseInt(storedVars.baseUserId)+parseInt(${i}))).slice(-6) | userId

 

ここで1234はループ開始時のベース値として使っています。

変数を使う時は

 clickAndWait | id=btn_itemid${itemId} |

という感じで ${変数名} で適用させます。

 

 

著者:t.n

SQL Server 遅いクエリの特定

MySQLなんかだと

  slow_query_log=ON
  slow_query_log_file=/var/lib/mysql/mysql-slow.log
  long_query_time=5

とかで分かるのですが、SQL Server の場合のやり方を知らなかったのでメモします。環境が SQL Server 2000 なので参考にならないかもしれませんが、取り敢えず。

スタートメニューから「Microsoft SQL Server」→「プロファイラ」を順に選びます。

メニュー「ファイル」→「新規追加」→「トレース」を順に選びます。

SQL Server の接続」ダイアログで接続対象や認証情報を入れて「OK」ボタン。

「トレース プロパティ」ダイアログで

  【全般】
   トレース名:お好きな名前をどうぞ
   テンプレート名:SQLProfilerTSQL_Duration
  【イベント】はそのまま
  【データ列】
   StartTime、EndTime、HostNameを追加しておくと便利
  【フィルタ】
   「Duration」→「Greater than or equal」にミリ秒を入れる
   (例:3秒以上かかるものを対象とするなら3000)

で、「実行」ボタン。

これでリストに表示される。CSV出力ができないしカラムでソートできないのでリスト選択してコピー、エクセルにペーストしてフィルタかけるなりして閲覧した方が良いかもしれません。

最新の SQL Server はこの辺りどうなんでしょうかね、きっと便利になっているのでしょう。

トレースが終わったらツールバーの所にある停止を押して止めましょう。それなりに負荷をかけるでしょうから、必要最小限に留めたいですね。

 

著者:t.n

awsのCloudFrontを試してみる

awsのCloudFront、要するにCDNですね。

今持っているアカウントが無料期間中なので、せっかくだから試してみました。

今回用意したコンテンツ自体がテキスト数行だった為、その速度向上については触れる事ができません。

CloudFrontの設定で少しハマったのでその点について少しだけ。

 

まず、CloudFrontの設定を変えて思った通りに動かない時、DistributionのStatusがDeployedになっているかを確認しましょう。何か設定を変えると10分~20分くらいは更新処理で反映されていない点に注意!

せっかちな私は設定を変えて「Save」ボタンを押したらすぐに反映すると思いこんで、思った通りに動かず、あーでもないこーでもないと無駄に時間を費やしてしまいました…。

きっとあちこちにあるサーバーに情報を同期させる為、時間がかかってしまうのでしょうね。

 

次に設定を変更してもそもそもキャッシュされたままだと反映されないやつもある。取り敢えずDistributionの詳細からInvalidationsタブを選択し、Create Invalidationから任意のObject Pathsを指定してInvalidateしてみましょう。

ちなみにこの処理も結構時間がかかります。StatusがCompletedになるまでしっかりと待ってから次の行動に移すのが吉です。

 

CloudFrontを使う場合はEC2やS3と連動させると思いますが、Distributionの詳細からBehaviorsタブでBehaviorを追加する事で、任意のパターンファイルを任意のEC2やS3から取って来る形に構成する事ができます。

例えば *.jpg は S3 から、*.php は EC2 から、といった感じです。ちなみにphpはキャッシュして欲しく無いのでBehaviorの設定でObjectCachingをCustomizeにし、Minimum TTLを0としたのですが、保存しても設定が反映されません。気付かずに何度か無駄に更新してしまいました。

CloudFrontのキャッシュ時間(TTL)はどの程度なのか | Developers.IO

上記のリンクにあるページから、headerでCache-Controlを使うのが順当なやり方だと知り、php

 <?php header("Cache-Control: no-cache"); ?>

を付ける形でキャッシュさせないようにできました。

 

とりあえずここまで

 

著者:t.n

mysqldumpしたファイルを圧縮しつつ他のサーバーに飛ばす

とあるサーバー上でmysqldumpしたいけど、そのサーバーはHDDの容量が少なくて(この時点で問題があるように思うが…)他のサーバーに保存したい時のお話です。

相変わらずlinuxのストリーミング処理には関心させられますね。大助かりです。

コマンド例としては以下の通り

mysqldump -udbuser -pdbpass dbname | gzip | ssh -l username 123.123.123.123 'cat > ~/dump.sql.gz'

 パラメータについて
  dbにアクセス可能なユーザー名:dbuser
  上記ユーザーのパスワード:dbpass
  dumpするDB名:dbname
  転送先サーバーのIPアドレス:123.123.123.123
  転送先サーバーのユーザー名:username
  転送先サーバー上の保管先:~/dump.sql.gz(ホームディレクトリ直下ですね)

mysqldumpした内容をgzipで圧縮しつつsshで接続先に飛ばしてその内容を保存するという流れですね。この例ではsshでパスワード認証を想定しており、コマンド実行後はパスワードを入力する必要があります。

ちなみにmysqldump側で-pの直後にDB側のパスワードを指定しない場合、最初のDBのパスワード、次にsshのパスワードを入力する必要があります。私の環境だけかもしれませんが、DBのパスワードを入れた直後は何も表示されなくなり、Enterを押すと「もう一度sshのパスワード入れて」と表示され、そこでsshのパスワードを入れると処理が開始されます。何かやり方を間違えているのでしょうかね…。

あと、このやり方だと、sshで鍵認証を使っている場合は秘密鍵をmysqldumpする側のサーバーに持って来て、ssh の -i で指定する必要がありそうですね。転送先のサーバーにログインして、取りに来るというやり方も出来るかと思いますが、結局転送元が鍵認証だったら同じ事になるので、まぁ臨機応変にという感じでしょうか。

 

 

著者:t.n

複数人でのunity開発に関して

unityを複数メンバーで開発する際、色々と注意する事がある。

そんな注意事項をまとめて下さっている素敵な記事をご紹介。


Unity開発者が複数人で開発を進める上で覚えておくと幸せになる9つの事 - テラシュールブログ

 

gitでファイルロックできないかな~(ひとりごと)

 

著者:t.n

.gitignoreについて

gitの管理対象外ファイルを指定する.gitignoreについて。

.gitignoreの書き方に関して、よく正規表現が使えるという記述があったりしますが、実際には簡易正規表現のようなもので、globパターンというものが使えるようです。


・空行あるいは # で始まる行は無視される
・標準の glob パターンを使用可能
・スラッシュ( / )で始まる場合はルートディレクトリからを表す
・ディレクトリを指定するには、パターンの最後にスラッシュ (/) をつける
・パターンを逆転させるには、最初に感嘆符 (!) をつける
複数マッチするパターンがある場合は最後にマッチするものが優先

 

globパターンの主なもの

・* 任意の0文字以上の文字列
・? 任意の1文字
・[abc] a or b or cのいずれかに一致
・[a-d] aからdまでにいずれかに一致

例えば a*e であれば age, ace, abcde, axxxxxxxxxxe などが該当する。
例えば a?e であれば age, ace, axe などが該当する。


著者:t.n