2013年2月12日火曜日

Selenium2使ってみた

Playで作ってるものも形になってきたのでいよいよテスト. そこで挙がった名前が

Selenium2

しかし「名前ちょっと聞いたことあるかなー」程度の知識だったのでイロイロ調べて簡単に使ってみた記録をメモメモφ(・ω・ )

Selenium2使ってみた

1. そもそもSelenium2って?

SeleniumはWebアプリケーションのUIテスト用フレームワーク. 簡単に言えば, 「ページ上でこう動いて欲しいなーなんて動きをコードで作って自動でテストしてくれる」ようなものを作れる. なんかニホンゴヘンダorz
2があるからには1があり, そのバージョンアップ. 具体的にはSimon Stwart氏作成の「WebDriver」をSelenium1に統合したものが2ということらしい. WebDriverの持つオブジェクト指向なAPIを取り込んでさらにできるようになったらしい. 1を知らないからなんとも言えないけど.
以上薀蓄

2. 言語と対応ブラウザ

言語は
javaC#RubyPython
の4種類. 1の時代にはPHPとかもあったらしいけどWebDriver統合時にWebDriverの方が対応していなかったため切り捨てられたとか(・ω・`)

また対応ブラウザは
Firefox
Google Chrome
IE
Opera
Apple iPhone
Android ブラウザ
Safari(ver2.21.0より)
となかなか豊富.BlackBerryは対応予定とだけ見たけど未確認. もう対応してるのかね('A`)
まぁ基本は上3つか.
ちなみにこれらはもちろんこのメモ書いてる時点でのお話.
この時点でのバージョンは2.29.0
マイナーチェンジしすぎだろ・・・(・ω・`)

3. Selenium-ServerとWebDriver

この辺正直よくわからないヽ('A`)ノ
Selenium-Serverは実際にブラウザを動かす係. これが無いとテストできない.
対応ブラウザにいっぱい書いたが, 実は標準ではIE と Firefox しかサポートしていないという事実. Opera/Chromeを使うなら別途サードパーティ製のServerが必要になるので注意. まぁ割と簡単な手順なんだけどね.
特にChromeに関しては比較的安心して使えるとかなんとか.
iPhoneとAndroid, Safariは未確認.

4-a. 入手

ここからまずは必要なファイルを入手.
必要なのは
Selenium-java-"ver".zip
Selenium-server-"ver".zip
の2つ. "ver"の部分にはもちろん数字が入ります.
他にも先に書いたとおり, Chromeでテストするにはこちらから
chromedriver_win_"ver".zip
が必要. "ver"の部分がバージョンじゃなかったらごめんなさい. この時点では26.0.1383.0. バージョンか?これ.

2014/01/24 追記
何やら場所が変わったみたいです
こちら
上記のページの 「Download chromedriver」 の先になります
追記・2
きちんと最新をもらってこないと、
unknown command 'waitforalltabstostoploading'
でググることになりそうです orz

4-b. 導入

必要なものを入手したら解凍, 今度はテストプロジェクトを作る.
プロジェクトにSelenium-javaおよびSelenium-serverに入っているsrcs以外のjarをとにかくパスを通す. 適当にぶち込んで設定から読み込んでやればOK. この時両方に「libs」ディレクトリがあるが, 中身は同じなのでどちらかひとつを入れればいい.
具体的には
selenium-java-"ver".jar
Selenium-server-"ver".jar
Selenium-server-standalone-"ver".jar
libsディレクトリの中身全部
を全部通す.
すっごいにぎやかになります.
ついでにどこかにchromedriver.exeも放り込んでおこう. なるべくコード中でパスがわかりやすいところに.(自分はパスすっごい苦手なので直下に「selenium」ディレクトリ作って全部放り込む始末orz)
これで準備はOK.

5. 簡単なコード1

ためしに簡単なコードで動きを見る. ちなみにもちろんJava. 他の言語書けない(・ω・`) テスト対象はPlayのWebアプリケーションなので, 事前に play runしておく.
public class Example {
  public static void main(final String[] args) {
    WebDriver driver = new FirefoxDriver();
    driver.get("http://localhost:9000");
    driver.quit();
  }
}
まだローカルでplayアプリを走らせている状態. 懐かしきmain関数.
3行目で使用するブラウザを選択. 今回はFirefoxでやってみる. これがWebDriver統合の強み?
4行目で立ち上げたブラウザにURLを入力, getしてもらう. このgetメソッド, ブラウザにきちんと表示されるまで先に処理が進まないので注意. 逆に言うとこのメソッドが終わった時点で画面は表示されているものとしてこの先の処理を書いていける. 実にありがたい.
5行目はブラウザの終了メソッド. これをしないといつまでもブラウザが居座り続けます. 今はいいけどテストがの量が増えたときは・・・Σ(||゚Д゚)ヒィィィィ

これを実行→JavaApplicationで実行するとFirefox起動→アプリ表示!→終了!!となる. まだテストには程遠い・・・
なお今回はPlayで作ったアプリのテストなので localhost:9000 だけど,  http://www.google.co.jpにするとグーグルのトップを開いて即終了します

6. 簡単なコード2

こんどはChromeでテストがしたい. ので4-b. にあるとおりドライバを用意しましょう.
コードもjUnitTestcaseを使用. jUnit4で.

@Test
public class Example {
  public static void main(final String[] args) {
    System.setProperty("webdriver.chrome.driver", "selenium/chromedriver.exe");
    String strURL = "localhost:9000/";
    WebDriver driver = new ChromeDriver();
    driver.get(strURL);
    WebElement element = driver.findElement(By.id("id"));
    element.sendKeys("id");
    element = driver.findElement(By.id("password"));
    element.sendKeys("pass");
    element.submit();
    assertThat(driver.getTitle(), is("ホーム"));
    driver.quit();
  }
}
ほぼまんまiUnit.  importするのは
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.MatcherAssert.assertThat;
のあたり. なんか isみたいに打ち消し線出るけど大丈夫なのだろうか….

なおこのアプリは localhost:9000 を入力すると, idと パスワードを入力してログインするだけの簡単なページに出る.

4行目が拾ったchromedriverの宣言. これが無いとChromeではテストができない. まだ直下/seleniumにしまってあるorz
6行目で今度は WebDriverは ChromeDriverで newする.
7行目で getしたらいよいよテスト.
8行目,  findElement()は引数の条件に一致する, 現在開いているHTMLの中で最初に見つかった要素を返す.
引数の By.id("id")は, HTMLタグの id のこと. 他にも name等でも検索できる. がそのHTML中に該当するものが無ければエラーが返るので注意. ここでログイン idを入力するフォームを探している.
9行目 sendKey()は引数の値(文字列)を, 指定したフォームに入力するメソッド. この場合 8行目で見つけた idの入力フォームに "「id」 と入力する, というだけの動き.
この時も element が入力を受け付ける要素ではない場合エラーが返る.
10, 11行目も同様に, こんどはログインパスワードの入力フォームを取得 → 「pass」と入力.
12行目の submit()で elementのある formを submitする. この場合は最後に elementにはパスワード入力フォームが入っているので, これを子要素に持つ formがあればそれを submitする. やっぱりそんなものが無ければエラー. 何かとエラーが返ってくる.
13行目がいよいよチェック. ここまでの入力でログインが済んだはずなので, タイトルは ホーム になっているはず, というテスト.

これを今度は 実行→jUnitTestCaseで実行.
おなじみのウィンドウが登場し, テストの進行状況と結果を表示してくれるはず.

他にも, HTML文の中に指定の文字列が含まれているか探す
driver.contains()などもある.

とりあえずここまでで "それっぽく" Selenium2は動かせるはず.






次はどこをテストするかだなー(・ω・`)

2013年2月6日水曜日

SyntaxHighligterの導入方法(振り返り)

一個前の記事を書いている際
・・・あれ?JavaScriptの設定してない・・・?Σ(・д・`)


という事実の発覚により入れなおし
忘れかけていたのでメモメモφ(・ω・ )

SyntaxHighlighter設定

もちろん対象はBlogger.

1. コード生成

コードとか言うとアレだけど要はリンクの生成.
ここから生成できます.
決める項目は二つ
ひとつはテーマ. これはお好みで. こことかカタログチックになってて選びやすいかと. こーいうところあると助かります.
もうひとつが使用言語. これはブログ中でSyntaxHighlighterに載せたい/載せる予定の言語を選ぶ. あんま選びすぎると重いとか聞いた気がしたけど未確認. おそらく自分の趣味の範囲とかと相談か.
二つ設定したら Generate.
すると次のページにテキストエリアにリンクやらスクリプトやらいっぱいのタグが出たはず.
これが生成されたリンク. 全部コピーしておきましょう.

2. 設定

設定というかリンクの埋め込みというか.
Bloggerのマイブログからテンプレート→HTMLの編集へ
選択しているテンプレートのHTMLなのかがずらっと出てくるけど, 用があるのは<header>.
わかりやすいように</header>の直前あたりを選ぶといい. ctrl + F から検索をかけるとだいぶ楽になるハズ.
選んだ場所に1. で生成したコードを埋め込む. もろコピペ. てゆーかいじっちゃダメ.


これで準備はOKなはず.
なおテンプレートを変えると全部消えてしまうので, 変えるときは一緒に設定のしなおしが必要.


3. 実際に使用

これはシンプル.
投稿作成を開いてHTMLで記入するモードに変更.
普通にHTMLを書くように
<pre class="brush:使用言語ごとのブラシ名">ハイライトしたいコード</pre>
と書き込んでプレビューすると, あら不思議.


なおオプションで
・左の行数表示のカスタム
・コードのコピーなどのツールボックス
なんてのも設定できるらしい



気が向いたらやってみる(´・ω・`)イツニナルカワカラナイガナ

スクリプトでcheckboxの一括選択/解除

Playでページ作っていく際に
テーブルの中にある複数のチェックボックスを一括で選択/解除できるチェックボックスが欲しいなー
って事で
意外とテーブルの中なんかで起こりやすい「一つのformタグにまとめられない状況」の例が見当たらなかったのでこれ幸いにとメモメモφ(・ω・ )


checkbox一括選択/解除

なおjQuery使います. var. 1.9.0

といってもたいしたコードでもないのでさくっと

function allHoge{
    $(".childHoge").prop("checked", $("#parentHoge").is(":checked")));
}

一行でしたorz
parentHogeを全選択/解除のキーとなるチェックボックスやボタンに id として設定.
childHogeを上に影響されるチェックボックス全てに class として設定
もちろん名前は適当なのでお好みで
最後にparentHogeを設定した同じところにでも
onclick="allHoge()"
と設定してやるとOK.
ボタンかチェックボックスか全選択/解除をクリックするごとに
childHogeと設定したチェックボックスが切り替わる.

以下簡単に内容
$("#parentHoge").is(":checked")
jQueryの is( )メソッド.
引数内の要素を持っているか否かでtrue か falseを返す.
この場合は
:checked
を持っているか否か, すなわちチェックされているか否かをtrue/falseで取得する.
ここで全選択/解除のどちらが選ばれたかを取得する

$(".childHoge").prop("checked", true/false);
ちょっと置き換えて見やすく(?)
jQueryの prop()メソッド
引数内のマップで操作を行なう
この場合は checked要素の値を true/falseに変更する
という操作
これを組み合わせて
「子に指定したチェックボックスのチェック状態を親に指定したチェックボックスの状態と同じものに切り替える」
となる

ただこの .prop
似たようなものに .attrというものがある.
こちらを使うと最初の1回だけ同じように動いてくれるが, 2回目以降は全選択ができなくなる.
おそらくだがHTML上だけ書き換えてプロパティとしては反映されていない感じ
何というトラップ・・・('A`)

こことか参考になるかと








雪やまないかなぁ・・・('A`)


2013年1月24日木曜日

Unity使ってみた

PlayもそこそこにUnityもいじってみた.
…意外とコード書かないなぁこれ(感想)


はじめてのUnity


ここを参考にまずはイロイロいじってみた. ただまだ第1回しかなく第2回は近日公開…
近日っていつですか(・ω・`)

そんな中でまずは基礎的なところをメモメモφ(・ω・ )

1. プロジェクトとシーン

プロジェクトはゲーム本体, シーンはそのステージ, といった関係. なので1プロジェクトの中にたくさんのシーンを持つことができます. もちろんシーンから別シーンの遷移も可能. ただし編集していられるのはシーン1つずつのみ. 別シーンを開くときはセーブを忘れずに.
共同開発時のネック. シーンの衝突だけは避けましょう. 泣けます. なにいじっても衝突するので素直に声掛け合って編集するのは一人だけにする, のが一番かと.

チラッと見た話では一つのシーンを分割して作り, 後で合成して一つのシーンにするなんてやり方も…

2. ホイールボタン

3D系ツール(Blender等)をつかってて感じたホイールボタンの重要性. Unityのシーンビュー内ではホイールボタンを転がしてズーム, 右ドラッグで回転ですが, ホイールボタンドラッグで画面を平行移動ができます. ホイールボタンドラッグとかこのマウス買ってから初めて使った( ´_ゝ`)

3. asset

光, 空, 地形や水など, 普通に作ったらそれだけで製作期間が楽しいことになりそうなものは, Unityが標準で用意しているものからユーザーが作ったものまでイロイロ用意されています.
どこかの記事では「既にあるものは最大限利用しましょう」なんて書かれているほど. 特に車なんかはめんどくさいそうなので慣れるまではこちらを流用しましょう, らしい.
標準のものは
[Asset] → [Import Package] → からいろいろ選べます.
ただし中には素敵に重いものもあるので, スマホ向けを考えているなら容量に注意, いろいろ眺めて必要なものだけ入れましょう.

4. ライセンス

もっと先にメモすべきことだったorz 無料版でも十分に作れるUnity. ただしAndroid, iPhone向けにビルドしたい, 欲張って箱○やらPS3やらでやりたい!なんて考えると, それぞれにビルドするために, それぞれ別々のライセンスが必要です. なのでAndroidだけやりたいならAndroid用ライセンスが別途必要ですお客様. 無料版でできるのはhtml版の書き出しだけ. 往年のFlashゲーム時代を彷彿とさせます.

5. オブジェクトの配置(床と壁)

3. の通り地形用assetもあるけれど, まずは基本.

Hierarchyビューの左上の [Create] か
[GameObject] → [CreateOther]

からCubeを選択. これをシーンから選択してやるとInspectorビューにそのオブジェクトの情報がいろいろ出てきます.
まずはそのオブジェクトの位置や回転などを表すTransformの項目をいじって原点付近にあわせましょう. Scaleをいじれば大きさも変更可能. 基本はこれで平べったくして床を生成する. 部屋の床など平らなところは基本これでOK.
同様に縦に伸ばしてやれば柱や壁の完成. 色についてはまた別のところで.
これをPositionをいじって並べてやればフィールドの完成.

6. プレハブ化

かなーり大事なところ1号. 要するに作ったオブジェクトを登録しておき, 複製などをしやすくするための機能.

 一番シンプルなやり方は, Hierarchyビューにある, プレハブ化したいオブジェクトを, ProjectビューのASSETディレクトリの中にドラッグ&ドロップ. これでASSETの中にHierarchyの中にあったオブジェクトがASSETの中にコピーされるはず.
このASSETの中のオブジェクトを今度はSceneビューにドラッグ&ドロップ. これでOK, シーンにオブジェクトが追加されたはず. 5. の壁などや大砲の弾など, シーン中で同じものをたくさん使うなら是非こちらを.
名前はそれっぽいのを付けておきましょう. Cubeが立ち並ぶASSETとか泣けます.
ちなみにスクリプトから動的に作成するときなどは, プレハブ化しておかないと動的に作成とかできないので, 弾丸みたいなものは設定がすんだらプレハブ化しておきましょう.

7. 親子

かなり大事なところ2号. 例えば5. で作った床と壁, 今はバラバラにしか動かせないので, いざ床の位置を変えたくなったら全部変えないといけません. そこで親子化.
これまた設定は楽で, Hierarchyビューの子にしたいオブジェクトを親にしたいオブジェクトにドラッグ&ドロップ. これだけ. これでHierarchyビューではディレクトリの階層構造のようになっているはず.

このとき 親 のほうをSceneビューから動かすと, 子にあたるオブジェクト全ての位置が変更されます. 子だけを選択してInspectorを見ると, なにやら表示が太線に. これは
親のオブジェクトの基準点
から見た相対的な座標が表示されています.
これにより親のTransformの変更に紐付けた子のTransformも同時に変更されます.
もちろん子だけを選択した状態なら選択中のオブジェクトの位置を変更できる.
部屋の全景の作成や, 複数のオブジェクトがまとまってできる一つのオブジェクト, なんてものを作るのに便利.

ちなみに
[GameObject] → [Create Empty]
で空のオブジェクトが作れます.
ここに床, 壁とそれぞれ放り込んでやるとフィールドの管理とかしやすいとか, そういった使い方.
カメラもこれで管理すると楽…かも?



ほんとにただのメモ書きだぁ・・・('A`)


2013年1月18日金曜日

svnでプロジェクト管理

Unityの共同作業はなかなか難しいらしい. どうやらシーンは基本衝突した瞬間「諦めろ」らしい. orzでもやるしかないのでがんばる(||´Д`)


svnを使ってUnityを共同開発


とりあえず前回リポジトリのインポートとかしてるのでそこは省略.

1. checkout


svn checkout リポジトリのURL ローカルに起きたい場所のパス

URLの指定には注意. 変な場所を指定すると中身ぶちまけたりといろいろめんどくさい.
これでチェックアウトした後, 必ず

svn update

をローカルのディレクトリでかけましょう. コマンドプロンプトを開く場所はこのコマンドからチェックアウトしたプロジェクトのディレクトリになります.
このupdateをかけると,  .svn というバージョン管理を行なうファイルが作成されるらしい. 逆にこれをしないでコミットしようとすると,
~/.svn がありません!
とまぁ怒られるわけです.

2. ignore


共同開発時に, 共有しなくてもいいファイル/ってゆーか共有すると地獄を見るファイルを「無視する」設定.
・・・どうやるんだこれorz
いくつか参考にしたものの一向にignoreされる気配なし.
どうしたものかと頭を抱えていたら…だいぶ昔に入れてたTortoisesvnがやってくれました.
ignoreしたいフォルダで右クリック→TortoiseSVN→Add to ignore list→ignoreしたいフォルダ名を選択
でignoreしてくれました
確認は
svn status
これのリストの一番左側が
? →まだaddもされていない新しいファイル?
A→addされている管理中のファイル
M→更新があったファイル
!→衝突しているファイル(?)
ではなく,
I→ignoreされているファイル
となっていればOKっぽい
ちゃんと確認してからコミットしないとデンジャー.

3. add

svn add ファイル名

バージョン管理に乗っけるコマンド. いちおうワイルドカードも利用可らしい. UnityならAssets/*で Assets直下だけ addしてくれる. なのでAssets/Materialとかあった場合は, Material以下はまたaddしてやらないとバージョン管理に乗ってくれない.

4. commit

svn commit -m "コミットコメント"

更新のあったファイルをまるっとコミットしてくれる. もちろん後ろにファイル名を指定すれば, それだけをコミットすることも. -m がmessageあたりの略なのかコメントのオプション. これを入れておかないと登録してあるエディターが起動し, 強制的に書かせるか, もしくは登録していない場合は「コメント書かないとコミットできない」とエラーを吐かれる.

5. update

svn update

1.でもでたけどアップデートのコマンド. これで最新の状態をもらえる. もちろん競合を起こしたら教えてくれる. でもマージは自分で頑張りましょう. いろいろツールあるっぽいし. リビジョン番号も出してくれるので確認にどうぞ.

だいたいここまでできればまずはOK・・・?(・ω・`)ナノカナ
とりあえず
.svnとかバージョン管理ファイルネーゾ!(゚Д゚щ)
って言われたら, チェックアウト直後にupdateかけると解決するかも.


6. おまけ

svn log リポジトリのパス

指定したパスのリポジトリのコミットのログが見られるコマンド.
恥ずかしい感じのコミットコメントもさらされます Σ(||゚Д゚)ヒィィィィ 気をつけましょう.
batとかにしておくと確認も楽かも.






Unity関係ないな…('A`)

svnでバージョン管理 ~プロジェクトをSVNに登録?する

意外とコマンドラインからsvnコマンド打ってなかったのでメモメモφ(・ω・ )
リポジトリは既にできてる環境からやったので, リポジトリの作成に関しては未確認(・д・`)



svnコマンド

1. create

svn create リポジトリを立てたい場所のパス

未確認. やったことはあるはずだけど(・ω・`)覚えてない.
これでリポジトリの準備ができる

2. import

svn import 管理したいもとのファイル/フォルダを中に含むディレクトリのパス 立てたリポジトリの放り込みたい場所のパス(だいたいtrankかと) -m "コミットコメント"

ポイントは最初の「管理したいファイル/フォルダを中に含むディレクトリのパス」のところ. ここで指定したパスの中身を, 後に指定したパスに放り込む. 後で指定するパスに準備ができているなら問題ないが, そうでないと中身をぶちまけるハメになる.(・ω・`)

3. delete

svn delete -m "コミットコメント" 削除したいディレクトリのパス

コミットコメントが無いと処理してくれない点に注意. deleteだけだと「削除するよ!」って言いながら準備するだけにとどまっており, コミットして初めて実際に削除してくれるらしい. なので同時に -m でコミットコメントを設定して, deleteを発行と同時にコミットしてくれるようにしてやると, このコマンドひとつで削除できる. 2. で中身をぶちまけた時なんかにどうぞ. パスの指定には注意. trankを指定してしまうと, trank自体がまるっと消えてしまう. あくまで「削除したいディレクトリ」のパスを.







朝は眠いよ…('A`)

2013年1月15日火曜日

Github使ってみたけど…

あけました!(挨拶)(゚∀゚)


お仕事で使っているGithubクライアントが(Windowsだけらしいが)非常にじゃじゃ馬だったので乗り換え, Shellコマンド使ったので
メモメモφ(・ω・ )


Git Shell


github for windowsなんて名前だけならすっごい頼りになりそうなWindows用GitHubクライアントツール. ただ実際に使ってみると…

衝突したよ!→Shellで調整してね!
エラー起きたよ!→Shell開いて自分で見てね!

…GUI ? (・д・`)

と言った感じに…
いや確かに問題が起きてなければ簡単入力なGUIなんだけどね…?(・ω・`)
使い始めて数時間で
衝突が起きそうなファイルは周りの隙を見てpushする!
みたいなGUIではなくアナログな努力を費やす始末.
ってゆーか同僚は1日で見限ってた('A`)

そして訪れるGUIからいじれない(=消せない)警告.
仕方なく同梱されてたGit Shellから操作する方法のメモ.

1. 現在の状態を見るコマンド

git status
現在の自分の変更の状態を見るコマンド
現在いくつのファイルを
新規作成したか / 変更したか / 削除したか 
そのファイル名を列挙してくれる.

2. 変更を受け取るコマンド

git pull
GitHubにアップされている変更を受け取るコマンド, 基本. これをやらないといつまで経ってもボッチ開発者…(;ω;`)

git fetch
最新のリポジトリを取得する…らしい(未確認)
pullとの違いはマージしないことらしい. (= 衝突しやすそう Σ(||゚Д゚)ヒィィィィ )
ブランチが分かれたものが最後にコミットされている場合, 別ブランチのまま引っ張り出すらしい
…使わんとこ(・ω・`)

3. GitHubにアップするまでの流れ

a.
git add ファイル名
「変更した」ファイルを指定するコマンド. ここで指定したファイルは次の commit を行なう準備が整ったことになる.

b.
git commit ファイル名
「コミット」を行なうコマンド. オプションでコメントををつけない場合, テキストエディタが出現, コミットメッセージを要求してくる.

c.
git push
いよいよGitHubにアップするコマンド. アップするのは commit したもののみ. 特にオプションをつけなくても, たまっていた commit を全部アップしてくれる.
衝突注意(・ω・`)

マージコマンドは使って無いしわからないヽ('A`)ノ

4. オプション

git add -A
All のA? add にくっつけるとgit status で上がった変更したファイル全部をaddしてくれる.
ちなみにAが小文字だと, 変更だけをaddしてくれるらしい.

git commit -m "コメント"
3.-b でちょろっと書いた オプションでコメントをつける. ただしUTF-8で入力しないと文字化けするらしい.
英語頑張ろう…(・ω・`)

5. 表示からわかる現在状況

ここからはコマンドでは無いけれど


パス>[master +1 ~5 -3 | +0 ~2 -4]
という表示だった場合

    現在位置 : masterのブランチ
   (add済/未commit)のファイル : 新規1件, 変更5件, 削除3件
   (未add)のファイル                : 新規0件, 変更2件, 削除4件

    masterの文字色が水色→(commit済み/未add)のファイル 無し
    masterの文字が緑      →(commit済み/未add)のファイル 有り


ということらしい. なんか変な数字が残っていたらとりあえず git status で様子を見るといいかも.



ちなみにShellに移った理由は
どこからともなくアップされた挙句, 削除の commit がなかったのか, 居たことになってるらしい存在しないファイルの名前が… → 当然そんなファイルローカルじゃ見たこともあったこともないから処理できない → エラー
らしい
shellならその 削除した commitをpushできるので実行 → 見事エラーが消えました.
というだけのこと.
いったいどうなってたんだか… commit からじゃなく強引にファイルを除去しにかかったとかなんだろうか…






…今年も頑張ろう(・ω・`)

AWS CDKで立てたEC2インスタンスのTimeZoneとかいじりたかった話

EC2を立てることはできたけど、立てたインスタンスは UTCのままだし設定ファイルとかいちいちscpしてくるのはダルい。 当初UserDataでなんとかしようとしたものの、「書く量がヤバいしメンテしにくい」と悩んでいたところ見かけたのが  AWS::CloudFormation:...