OmniAICreator/Qiita-1.07M huggingface dataset:
Visual Studio 2013 でコードスニペットを使えるようにしてみた

作業効率化のため、Visual Studio 2013 でコードスニペットを作ってみました。

今回は、以下の様なコードを自動生成するスニペットを作ります。

```cpp:
namespace test {
}    // namespace test
```

# スニペットファイルを作る
まずは、スニペットを記入するためのファイルを作ります。

1. Visual Studio の<br>
**「ファイル > 新しいファイル」**<br>
を選択します。
1. **「全般 > XML ファイル」**<br>
を選択し、「開く」をクリックします。
1. このファイルの拡張子を **\*.snippet** に変更して、ファイルを保存します。<br>
(今回は、my_namespace.snippet としました。)

この手順を見て分かる通り、スニペットファイルは XML で記述します。

# ヘッダーを記述する
次に、最低限必要になるヘッダー部分を記述します。

```xml:my_namespace.snippet
<CodeSnippet Format="1.0.0">
  <Header>
    <Title>my_namespace</Title>
    <Shortcut>ns</Shortcut>
  </Header>
</CodeSnippet>
```
この内、重要なのは以下の２つのタグです。

|タグ名|概要|
| :-- | :-- |
| Title | スニペットの名前。<br>コードスニペットマネージャにはこの名前で表示されます。|
| Shortcut | スニペットを呼び出すための名前。<br>Intellisense で表示されます。|

# コードを記述する
最後に、挿入するコードを記述します。

```xml:my_namespace.snippet
<?xml version="1.0" encoding="utf-8"?>
<CodeSnippet Format="1.0.0">
  <Header>
    <Title>namespace</Title>
    <Shortcut>ns</Shortcut>
  </Header>
  <Snippet>
    <Code Language="CPP">
      namespace test {
      } // namespace test
      
    </Code>
  </Snippet>
</CodeSnippet>
```

\<Code\> タグの値に挿入したいコードを記入します。

Language には、挿入するコードの言語を指定します。
ここに指定する文字列は
http://msdn.microsoft.com/ja-jp/library/ms171418.aspx#code
の Language 属性値に載っています。

これで準備は整いました。

# Visual Studio に登録して、使ってみる。
では、実際にスニペットを登録して使ってみます。

1. Visual Studio の<br>
**「ツール > コードスニペットマネージャー」**<br>
を選択します。
1. **「インポート」**をクリックして、先ほど作ったスニペットファイル(my_namespace.snippet)を開きます。
1. **「Visual C++ コードスニペット」**に先ほど開いたファイルが表示されていることを確認します。
1. **「場所」**の**「My Code Snippets」**にチェックを入れ、**「完了」**をクリックします。
1. **「コードスニペットマネージャー」**の**「My Code Snippets」**に先ほど追加したスニペットが追加されていることを確認します。

これでスニペットが使えるようになりました。
試しに「ns」と打ち込むと、Intellisense に「ns」が表示されているはずです。

ちなみに……
今回行った「インポート」は所定の位置に *.snippet ファイルをコピーするだけですので、既に所定の位置にあるスニペットファイルはインポートの必要はありません。

今回の例では

```:
C:\Users\[user_name]\Documents\Visual Studio 2013\Code Snippets\Visual C++\My Code Snippets
```

にコピーされていると思います。

# コードの一部を指定したものに置き換える 
さて、無事にスニペットが使えるようになりましたが、名前空間の名前は自由に指定できないと不便でなりません。

というわけで、名前空間の名前を自由に入力できるようにしてみます。

```xml:my_namespace.xml
<?xml version="1.0" encoding="utf-8"?>
<CodeSnippet Format="1.0.0">
  <Header>
    <Title>namespace</Title>
    <Shortcut>ns</Shortcut>
  </Header>
  <Snippet>
    <Declarations>
      <Literal>
        <ID>name</ID>
        <Default></Default>
      </Literal>
    </Declarations>
    <Code Language="CPP">
      namespace $name$ {
      } // namespace $name$
      
    </Code>
  </Snippet>
</CodeSnippet>
```

**\<Code\>** タグの名前の部分が **$name$** に置き換わっていますが、
これは **\<Declarations \ Literal \ ID\>** タグの値の **name** のことを指しています。

今回重要なのは、**\<Literal\>** タグの中身です。

|タグ名|概要|
|:--|:--|
|\<ID\>|置き換え場所を指定するためのリテラル名を入れます。|
|\<Default\>|リテラルのデフォルト値を指定します。<br>何も指定しない場合は今回のように何も記述しません。|

これでスニペットを呼び出すと、名前の部分が編集可能になります。

# 最後に
今回は、必要最小限の記述でコードスニペットを作成しました。
コードスニペットのタグやリテラルは他にもありますので、自分でも調べてみてください。

# 参考サイト

* チュートリアル: コード スニペットを作成する - MSDN - Microsoft
http://msdn.microsoft.com/ja-jp/library/ms165394.aspx

* コード スニペット スキーマ リファレンス - MSDN - Microsoft
http://msdn.microsoft.com/ja-jp/library/ms171418.aspx

* コード スニペットの作成例 - 株式会社ティーケーフォース
http://www.tk4.co.jp/develop/codesnippet/recipe.html
Ustreamで見つけた脆弱性

この記事は[脆弱性"&'<<>\ Advent Calendar 2014](http://www.adventar.org/calendars/622) 22日目の記事です。

Ustreamで自分でupした動画のダウンロードするためのスクリプトを書いてる最中に、（プライベート・完全非公開とか書いてある）非公開ビデオが誰にでもダウンロードできる事を見つけました。

通常の視聴ページは
http://www.ustream.tv/recorded/28790197
のようなURLで非公開ビデオは「この動画は一般公開されていません。」という風な事を言われて見れませんでしたが、ダウンロード用のURLの
http://tcdn.ustream.tv/video/28790197
からは未ログイン状態でもダウンロード可能できるという認証回避の脆弱性です。

後から仕様を変更するのが難しいので直らないだろうなあと予想していたのですが、報告して10ヶ月くらい経ってビデオの保存期間の仕様変更時に一緒に修正されたようです。
修正後は
http://upmv10-ntt-upmv.ustream.tv/0/1/56/56781/56781786/1_10474820_56781786.flv?e=1419861245&h=7d19cc6b5d3eb93fcc4b9573969da51f&tracking=92359d_0_1_0_0&peer=DE-CIX
みたいなURLになっておりhのトークンが一致しないとダウンロード出来なくなりました。

という訳でCDNを使う時は認証周りに注意しましょうという話でした。
window.Objectのfalseのようなtrueの話

とりあえず本の紹介をしておきます。

![dp_4048706705.jpeg](https://qiita-image-store.s3.amazonaws.com/0/6117/2c941478-addf-7fe1-05cc-99131cadac19.jpeg)

[オブジェクト指向JavaScript](http://www.amazon.co.jp/%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E6%8C%87%E5%90%91JavaScript-Stoyan-Stefanov/dp/4048706705)

僕がActionScriptを触っていた頃は、オブジェクト指向といえばクラスベースオブジェクト指向のことだと思い込んでいたので、タイトルに衝撃でした。

さて、ここからはObjectオブジェクトの話をすればいいのですよね？

ということで、ここでは計6問のクイズを出題します。
みなさん、全問正解できるでしょうか！？

```js:q-1.js
({}) !== ({}); // == ?
```

```js:q-2.js
var a = {};
var b = {};
a[window] = 5;
b[window] = 5;
a[window] === b[window]; // == ?
```

```js:q-3.js
var obj = {};
var obj = {};
obj[window] = 5;
obj.window = 3;
obj[window] !== obj.window; // == ?
```

```js:q-4.js
var a = {};
var b = {};
a[{}] = 5;
b[{}] = 5;
a[{}] === b[{}] // == ?
```

```js:q-5.js
!!(new Boolean(0)) // == ?
```

```js:q-6.js
var obj1 = {a:5,b:3,c:8};
var obj2 = {b:3,a:5,c:8};

var keys1 = '';
var keys2 = '';

var i;
for(i in obj1) {
  keys1 += i;
}

for(i in obj2) {
  keys2 += i;
}

keys1 !== keys2 // == ?
```

答えは[level0.kayac.com](http://level0.kayac.com/2014/12/windowobjectfalsetrue.php)で。
rubyの正規表現のオプション

##rubyの正規表現のオプション

|オプション|意味|
|:------------:|:------------|
|i|大文字小文字を区別しない。|
|o|度だけ式展開を行う。同じパターンを何度も使う時は、このオプションで高速化できる。|
|x|空白を無視する。また、#から改行までをコメントと見なす。|
|m|複数行モード。「.」は改行にもマッチする。|
|n|日本語を認識しない|


使い方

```rb:sample.rb
re = /cat/i
```

CatにもCATにもマッチ
Meteorのtest runner Velocityを試す。


# 始めに

Meteorアプリを作るならTDDでやりたいと思い、テスト環境を調べてみました。
今ナウいのはvelocityというTestFrameworkだそうです。
というかただのtest runnerのようです。


jasmineとかmochaとか選べるようです。
なぜかjasmineが上手く動かなかったので、mochaで試すことにしました。


# velocity+mochaを試す。

シンプルに該当アプリに以下のコマンドでパッケージ追加するだけです。

`meteor add mike:mocha`
拍子抜けもいいところっすね。

以下のように試してみます。

```sh:チュートリアル
$ meteor create --example leaderboard #sample作成
$ cd leaderboard
$ meteor add mike:mocha


Changes to your project's package version selections:

amplify                    added, version 1.0.0
coffeescript               added, version 1.0.5
less                       added, version 1.0.12
mike:mocha                 added, version 0.5.1
practicalmeteor:chai       added, version 1.9.2_3
practicalmeteor:loglevel   added, version 1.1.0_3
velocity:core              added, version 0.4.5
velocity:html-reporter     added, version 0.3.2
velocity:node-soft-mirror  added, version 0.2.4
velocity:shim              added, version 0.1.0
velocity:test-proxy        added, version 0.0.4


mike:mocha: Run mocha tests in the browser
```

`mike:mocha` パッケージの追加でまとめてvelocityも入ってくれるみたいですね。

`meteor`を叩いて起動し[http://localhost:3000](http://localhost:3000)にアクセスします。

![Leaderboard_1.png](https://qiita-image-store.s3.amazonaws.com/0/3844/5f14a3fd-b4bc-d070-b63a-60dcaa83b554.png "Leaderboard_1.png")

見慣れないアイコンが右上に表示されるようになり



![Leaderboard_2.png](https://qiita-image-store.s3.amazonaws.com/0/3844/f5e184e7-cb69-0ce1-b35b-ead1190f927a.png "Leaderboard_2.png")

クリックすると現在のテストの実行結果が反映されます。
現在は0件ですが図中の該当ボタンをクリックするとサンプルのテストが作成されます

![Leaderboard_3.png](https://qiita-image-store.s3.amazonaws.com/0/3844/90fec765-4134-33ab-1bfb-590c9146b47f.png "Leaderboard_3.png")



以下のようにサンプルのテストが作成されました。


```sh:tree_leaderbord/tests
tests
└── mocha
    ├── client
    │   └── sampleClientTest.js
    └── server
        └── sampleServerTest.js

3 directories, 2 files
```

```js:sampleClientTest.js
if (!(typeof MochaWeb === 'undefined')){
  MochaWeb.testOnly(function(){
    describe("a group of tests", function(){
      it("should respect equality", function(){
        chai.assert.equal(5,5);
      });
    });
  });
}
```

```js:sampleServerTest.js
if (!(typeof MochaWeb === 'undefined')){
  MochaWeb.testOnly(function(){
    describe("Server initialization", function(){
      it("should have a Meteor version defined", function(){
        chai.assert(Meteor.release);
      });
    });
  });
}

```

そもそもmochaがわからないのでそこからお勉強です・・・。
Boygroupを使ってみよう！（第二回オフ会内容②)

前回に続きまして、
オフ会の内容②です！
__Boygrouping！！__
ずーっと気になってたんだけど、
なんだかよくわからなかったノード。
試してみたい！っていうメッセージをもらってたので、オフ会でやってみました。
オフ会レポは以下。
http://qiita.com/yhy_jp/items/29102ebea94fba729b16

#Boygroupとは
Serverサイド(1台ないし、複数台)から、各種クライアントにリアルタイムにパッチ内のデータを送ることができる。

![boy1.JPG](https://qiita-image-store.s3.amazonaws.com/0/37495/f38dd8a9-c913-3572-6608-c82707ed6816.jpeg)


使い方イメージは、公式サイトのような感じ。
一説によると、アイドルが一緒に踊っているような感じを、プログラマーメンズもアイドルのように踊る！みたい感じだった気が…ｗ

##注意点
・２台以上のPCとネットワーク環境が必要（ローカルネットワークでも可能）
・送ることのできるデータのサイズは決まっている。
主に、Value、Color、Stringのデータを送ることができる。
Rendererは送ることができるが、Textureは送ることができない

#Boygroup接続
今回は、server、client１台ずつを想定し、説明します。
（clientのIPv4アドレスを、192.168.1.1、ServerのIPv4アドレスを、192.168.1.2、で実施している画像を載せているので、どっちかわからなくなったら参考にしてください。）

##①同一ネットワーク上に接続する
インターネットなどで使用しているWi-Fiルーターや
ローカルなネットワークに接続します。

##②同一ネットワーク上の接続かを確認する
コマンドプロンプトを起動し、__「ipconfig」__と入力
色々なIPアドレスが表示されると思いますが、
__デフォルトゲートウェイ__の値が2台のPCが同じか確認してください。
__２台とも__IP調べてくださいねー！
以下のような感じでいっぱい表示されると思います。
![boy2.JPG](https://qiita-image-store.s3.amazonaws.com/0/37495/92b58fd6-1519-4d4e-10d0-b2807edfcad3.jpeg)


##③Server、ClientのIPアドレスをメモ
同一のデフォルトゲートウェイの__IPv4アドレス__をメモしてください！
両方使いますからねー！

##④Serverの設定
サーバーで用いるPCの方を
__CommandlineParameterでSERVERでたちあげる！__
その後、__Boygroup(VVVV Server)__ノードを開き、
左上インレットに__Client PCのIPv4アドレス__を入力
Connectしたかどうかわかるように、左下アウトレットにToggleとかつけてみてもいいかもしれません。
３番目のインレット__BroadcastModeはTCP__がよいかと。

![boy_s.JPG](https://qiita-image-store.s3.amazonaws.com/0/37495/a72c6d8c-7e1a-38c5-c1c2-af31976a55b1.jpeg)



##⑤Clientの設定
Client側のPCは、
__CommandlineParameter__で、
__Server PCのIPv4アドレス__を入力し、起動。
...vvv.exe /client [ServerのIPv4アドレス]のような感じです。

![boy3.JPG](https://qiita-image-store.s3.amazonaws.com/0/37495/625c37d1-af4a-f6e0-bc5a-9542b3f65eb4.jpeg)



##⑥接続の確認
接続ができていれば、以下のような動きをするはずです。
・ServerのアウトレットConnectedが1になってる
・client側に自動でパッチ作成のウィンドウが立ち上がる
・Serverのウィンドウをドラッグすると、clientのウィンドが動く

#Boygroupノードの使い方
##青いノードを作ろう
青いノードは、ServerからClientに送ることができるノードです。
サーバーサイドのノードを選択し、
__Control + B__　で青くなるはず。
青くなったらClient側にも青いノードが出現する！

![boy4.JPG](https://qiita-image-store.s3.amazonaws.com/0/37495/0738524c-1edd-96ba-b6d0-8573098b03ae.jpeg)



##Serverでつくったパッチから、clientのパッチを動かそう
パッチ全部を送ってもいいし、
必要な部分だけ青くしてもOK！
いろいろ試してみましょう。以下、参考Vineのリンクです。
https://vine.co/v/OgOwtQiXxFr


#おわりに
オフ会では、たくまさんがサーバーPCで色々遊んで、
Client側にリアルタイムパッチングを公開してました。

Boygroupは、一台のサーバーPCから離れた複数のClient PCを制御するのにはかなり使えそうなイメージですが、
相互通信はTCP、UDPあたりの方がよさそうな感じでした。

何画面かを同時制御するときとか、
オフ会の基礎講座のプロジェクターない時とかに使えるかなーとか、
思ってます。
使いどころが意外と難しい感じですが、
他にも面白いアイディアあったら教えてくださいー！


Twitter:Junky_Inc
LaTeX数式をブラウザでお試しリアルタイム編集（簡易版）

LaTeXの数式をちょこちょこっと編集してリアルタイムに出力結果を見たいという際には[Daum Equation Editor](https://chrome.google.com/webstore/detail/daum-equation-editor/dinfmiceliiomokeofbocegmacmagjhe)が非常に高機能で便利です。ただ、自分の職場はChrome Web AppもMacアプリも(LaTeXも！)インストールできないPC環境なので、極めて単純な数式リアルタイム編集機能だけではありますが、AngularJSとMathJaxで実装してみました。

[デモ](http://mmizutani.github.io/angularjs-mathjax-live-update/)
[ソースコード](https://github.com/mmizutani/angularjs-mathjax-live-update)

**実装手順**
(1) JavaScriptライブラリ（AngularJSとMathJax）をページに読み込む。MathJaxは通常ページ読み込み完了時に自動的にTeXコマンドをレンダリングするが、ここではそれを止める必要があるため`&delayStartupUntil=configured`をMathJaxのURLクエリパラメータ最後に追記。

```html
<script src="//ajax.googleapis.com/ajax/libs/angularjs/1.2.27/angular.min.js"></script>
<script type="text/javascript"
src="//cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML&delayStartupUntil=configured">
</script>
```

(2) MathJaxのページ読み込み時自動レンダリングを無効化するための設定（`skipStartupTypeset: true`）を追加。

```html
<script>
  MathJax.Hub.Config({
    skipStartupTypeset: true,
    messageStyle: "none", 
    "HTML-CSS": {
      showMathMenu: false
    }
  });
  MathJax.Hub.Configured();
</script>
```

(3) bodyタグのng-app属性にモジュール名を追加、LaTeX入力用のtextareaにng-modelとして`expression`を追加、数式出力用のp要素にはmathjax-bind属性を追加。

```html
<!-- LaTeXコマンド入力用 -->
<textarea ng-model="expression"></textarea>

<!-- MathJaxレンダリング出力用 -->
<p mathjax-bind="expression"></p>
```

(4) AngularJSのディレクティブmathjax-bindを作成してtextareaを監視させ、`expression`モデルに入っているLaTeXコマンドに変更がある都度、そのコマンドを出力用p要素に挿入するようにする。p要素内のLaTeXコマンドが更新されたら、`MathJax.Hub.Queue(["Reprocess", MathJax.Hub, $element[0]]);`で即座にMathJaxに再レンダリングさせる。

```js
angular.module("myApp", [])
.directive("mathjaxBind", function () {
	return {
		restrict: "A",
		controller: ["$scope", "$element", "$attrs", function ($scope, $element, $attrs) {
			$scope.$watch($attrs.mathjaxBind, function (value) {
				var $script = angular.element("<script type='math/tex'>")
				.html(value == undefined ? "" : value);
				$element.html("");
				$element.append($script);
				MathJax.Hub.Queue(["Reprocess", MathJax.Hub, $element[0]]);
			});
		}]
	};
})
```

(5) アクセス時にLaTeX数式コマンドが全く入力されていないとなんとなく寂しいので、デフォルトの数式コマンドをいくつか挿入（JavaScript内ではLaTeXコマンドのバックスラッシュをエスケープするためにダブルバックスラッシュに置き換え）。

```js
.controller("MyCtrl", ["$scope", "$element", function($scope, $element) {
	$scope.expression = "\\frac{5}{4} \\div \\frac{1}{6} \\\\ \n\n";
	$scope.expression += "d\\!f_n(t,T) = \\alpha_n(t,T) dt + \\tau_n(t,T) dW_n^P\\!(t) \\\\ \n\n";
	$scope.expression += "\\zeta(s) = \\sum_{n=1}^\\infty\\frac{1}{n^s} \\\\ \n\n";
	$scope.expression += "% You can define custom macro with 'newcommand': \n";
	$scope.expression += "\\newcommand\\C{{\\mathbb C}} \n\\newcommand\\np[2]{{#1}#2{#1}} \n\\C[y_1,\\ldots,y_n]\\to {\\mathcal A}, \\quad a\\mapsto\\np{:}{a}";
}]);
```

(6) おまけとしてBootstrapとjQueryで見た目を~~ごまかす~~調整。

おしまい


参考
http://www.mathjax.org/demos/
https://github.com/mathjax/MathJax-docs/wiki/More-live-preview-examples
http://stackoverflow.com/questions/7925622/display-mathjax-output-in-realtime
http://genkuroki.web.fc2.com/MathJax/LivePreviewMathJax-jquery.html
fswatchでディレクトリを監視，変更があればunisonで同期し，結果を通知する


#unisonの設定
`~/.unison` 以下に設定ファイル(.prf)を置く．
どっかのサイトの丸写しに近いものなので，説明は割愛．
sshの使い方も割愛．

```Documents.prf
# コピー元ファイルのタイムスタンプも一緒にコピーする
times = true

# 新しいファイルを優先
prefer = newer

#新規作成ファイルはユーザに同期如何を問わない
auto = true

#ファイル更新日時による更新有無の判定
fastcheck = true

#エラー以外の出力停止
silent = true

# ルート・ディレクトリの指定。同期の際に最上位となるディレクトリを設定する。
root = /Users/kaz/
root = ssh://kaz//home/kaz/mac-backup/
 
# 同期したいディレクトリやファイル名を指定する
path = Documents
 
# 無視するディレクトリやファイル名を指定する。
ignore = Name *~
ignore = Name ._*
ignore = Name .DS_Store
ignore = Name *.bak
```

#unison実行，及び通知するスクリプト

$1にさっきの設定ファイル(.prf)を拡張子なしで渡してやる．

```bash:~/Documents/exec/nortificate.sh
#!/bin/bash

unison "$1"

echo 'display notification "通知する文章" with title "タイトル" subtitle "サブタイトル"' | osascript
```

#ファイル監視し，変更があれば上のスクリプトを実行するスクリプト

fswatchの使い方ほぼそのまま．
さっきの設定ファイル(.prf)を指定している．

```bash:fswatch_start.sh
#!/bin/bash

fswatch ~/Documents/ | xargs -I{} ~/Documents/exec/nortificate.sh "Documents" &
```

>fswatchのUsageにはxargsの引数として -n1 も書かれているが，必要なさそう

fswatchからは変更があったファイルのパスがその都度返ってくる．そのため，-I{} としてそれをスルーしている．詳細は以下．

###xargsについて
#### -I
-I{} は，コマンドの引数に含まれている{}を，標準入力で置換する．

例えば，

```bash:
$ echo "piyo" | xargs -I "rep" echo "rep hoge piyo"`
piyo hoge piyo
```

となる．

#### -n1

-n1 は入力を1行毎に処理するというもの．
-n10 としておけば，10回入力がある度にコマンドを実行する．

ただ，-Iを含む時点でコマンドは一行ごとに実行されているような…


-I{} を指定せずに -n1 を指定して，fswatchの返り値をnortificate.shに渡せば，変更があった箇所も同時に通知するようにすることも出来る．


#実際に使用しているスクリプト
##実行と通知
通知するメッセージはunisonのドキュメントから引っ張ってきている．

```bash:~/Documents/exec/nortificate.sh
#!/bin/bash

unison "$1"

if [ $? -eq 0 ]; then
    echo 'display notification "successful synchronization; everything is up-to-date now." with title "unison '"$1"'" subtitle "'"$2"'"' | osascript
elif [ $? -eq 1 ]; then
    echo 'display notification "some files were skipped, but all file transfers were successful." with title "unison '"$1"'" subtitle "'"$2"'"' | osascript
elif [ $? -eq 2 ]; then
    echo 'display notification "non-fatal failures occurred during file transfer." with title "unison '"$1"'" subtitle "'"$2"'"' | osascript
elif [ $? -eq 3 ]; then
    echo 'display notification "a fatal error occurred, or the execution was interrupted." with title "unison '"$1"'" subtitle "'"$2"'"' | osascript
fi
```

変更の合った箇所（つまり同期した場所）と利用した設定ファイルも含めて通知する．

echo以下をシングルクォーテーションで囲まないと動かない？ため，引数を展開するために一旦シングルクォーテーションを抜けて引数を展開した後，再度囲む

というのも，シングルクォーテーションの中では$もそのまま文字列として扱われるためである．

##監視とスクリプト実行

```bash:fswatch_start.sh
#!/bin/bash

fswatch ~/Documents/ | xargs -n1 ~/Documents/exec/nortificate.sh "Documents" &
```

設定ファイルと，変更があったファイルを渡している．
Torを使った内部告発サイト

# Torを使った告発者の匿名性を守る内部告発サイト
[Japanese activist challenges secrets law with whistleblower tool | Reuters](http://www.reuters.com/article/2014/12/19/us-japan-secrets-activist-idUSKBN0JX14F20141219 "Japanese activist challenges secrets law with whistleblower tool | Reuters")に記事が上がってたのを見つけておっと思った。
タイトル的には機密保護法 (State Secrets Law) に挑戦とあるが、その法案だけに限った話ではないと思う。

Whistleblowing.jpという内部告発サイト構想を明らかにした。
(whistle blowは内部告発という意味)

作成者は[Masayuki Hatta(@mhatta)さん | Twitter](https://twitter.com/mhatta "Masayuki Hatta(@mhatta)さん | Twitter")

詳しいスライド：
[Whistleblowing.jp （内部告発.jp）の構想（The concept of Whistleblowing.jp）](http://www.slideshare.net/masayukihatta/mhatta-waseda20141219 "Whistleblowing.jp （内部告発.jp）の構想（The concept of Whistleblowing.jp）")
早稲田で2014/12/19に行われたワークショップの動画: 
[日本におけるリークサイトの可能性 – JPleaks.org（仮）スタートアップ・シンポジウム - YouTube](https://www.youtube.com/watch?v=H6xhnQhqq2g&amp;feature=youtu.be "日本におけるリークサイトの可能性 – JPleaks.org（仮）スタートアップ・シンポジウム - YouTube")

# 使ってる技術
* スノーデン事件などでおなじみ [Tor Project: Anonymity Online](https://www.torproject.org/ "Tor Project: Anonymity Online")
* オープンソースの内部告発プラットフォーム [GlobaLeaks](https://globaleaks.org/ "GlobaLeaks")

# 面白かった所
* wikileaksとは違って、プラットフォームだけを提供している
 ”土管”と表現している。つまり、内部告発する人とジャーナリストをパイプしているだけ
* ジャーナリズムがTorなどの技術に支えられ始めていること。海外では同様の内部告発サイトが既に存在する

# 関連技術
* [SecureDrop | Freedom of the Press Foundation](https://freedom.press/securedrop "SecureDrop | Freedom of the Press Foundation")
* [Tails - Privacy for anyone anywhere](https://tails.boum.org/ "Tails - Privacy for anyone anywhere")
ElasticBeanstalk(CentOS) で Datadog の Docker コンテナモニタリングが動かない場合


ElasticBeanstalk 環境の EC2 において、リファレンス通りに `dd-agent` の Docker コンテナを立ち上げてみたが、一向にデータが飛んでこない。

``` bash
docker run -d --privileged \
    --name dd-agent \
    -h `hostname` \
    -v /var/run/docker.sock:/var/run/docker.sock \
    -v /proc/mounts:/host/proc/mounts:ro \
    -v /sys/fs/cgroup/:/host/sys/fs/cgroup:ro \
    -e API_KEY=<API_KEY> \
    datadog/docker-dd-agent
```

原因は Docker ホスト側の cgroup のマウントポイントが違うためだった。
大体の環境では `/sys/fs/cgroup` 以下に作られるが、CentOS の場合は `/cgroup` 以下になるみたい。

``` bash
# at CoreOS
core@localhost ~ $ mount | grep -i cgroup
tmpfs on /sys/fs/cgroup type tmpfs (ro,nosuid,nodev,noexec,mode=755)
cgroup on /sys/fs/cgroup/systemd type cgroup (rw,nosuid,nodev,noexec,relatime,xattr,release_agent=/usr/lib/systemd/systemd-cgroups-agent,name=systemd)
cgroup on /sys/fs/cgroup/cpuset type cgroup (rw,nosuid,nodev,noexec,relatime,cpuset)
cgroup on /sys/fs/cgroup/cpu,cpuacct type cgroup (rw,nosuid,nodev,noexec,relatime,cpu,cpuacct)
cgroup on /sys/fs/cgroup/memory type cgroup (rw,nosuid,nodev,noexec,relatime,memory)
cgroup on /sys/fs/cgroup/devices type cgroup (rw,nosuid,nodev,noexec,relatime,devices)
cgroup on /sys/fs/cgroup/freezer type cgroup (rw,nosuid,nodev,noexec,relatime,freezer)
cgroup on /sys/fs/cgroup/net_cls,net_prio type cgroup (rw,nosuid,nodev,noexec,relatime,net_cls,net_prio)
cgroup on /sys/fs/cgroup/blkio type cgroup (rw,nosuid,nodev,noexec,relatime,blkio)
cgroup on /sys/fs/cgroup/perf_event type cgroup (rw,nosuid,nodev,noexec,relatime,perf_event)

# at CentOS(ElasticBeanstalk)
[ec2-user@ip-XX-XX-XX-XX ~]$ mount | grep cgroup
cgroup on /cgroup/blkio type cgroup (rw,relatime,blkio)
cgroup on /cgroup/cpu type cgroup (rw,relatime,cpu)
cgroup on /cgroup/cpuacct type cgroup (rw,relatime,cpuacct)
cgroup on /cgroup/cpuset type cgroup (rw,relatime,cpuset)
cgroup on /cgroup/devices type cgroup (rw,relatime,devices)
cgroup on /cgroup/freezer type cgroup (rw,relatime,freezer)
cgroup on /cgroup/hugetlb type cgroup (rw,relatime,hugetlb)
cgroup on /cgroup/memory type cgroup (rw,relatime,memory)
cgroup on /cgroup/perf_event type cgroup (rw,relatime,perf_event)
```

ということで、以下のように変更することで無事に `dd-agent` の Docker コンテナが動作するように。

``` bash
docker run -d --privileged \
    --name dd-agent \
    -h `hostname` \
    -v /var/run/docker.sock:/var/run/docker.sock \
    -v /proc/mounts:/host/proc/mounts:ro \
    -v /cgroup/:/host/sys/fs/cgroup:ro \
    -e API_KEY=<API_KEY> \
    datadog/docker-dd-agent
```
ReportなどのMetadataをすべてダウンロード

はじめに
----
Salesforce Migration Tools(Ant)の話です。ApexClassなどは`*`が使えるので、簡単に全てのメタデータをダウンロードすることができますが、`*`が使えないメタデータのダウンロードに苦労したことはないでしょうか。

その中でも特に面倒なFolder, Document, Dashboard, EmailTemplate, Reportのダウンロード方法を紹介します。

参考。Allows WildcardがNoのやつは爆発しろ。
https://developer.salesforce.com/docs/atlas.en-us.daas.meta/api_meta/meta_types_list.htm

ちなみにこのページ、日本語版だと「ダウンロー
ド」よりひどいことになります
https://developer.salesforce.com/docs/atlas.ja-jp.api_meta.meta/api_meta/meta_types_list.htm

listMetadata
----
`*`が使える使えないに関係なく、Metadata APIにはlistMedatadaという機能があって、指定したメタデータタイプのコンポーネント一覧を取得することができます。
https://developer.salesforce.com/docs/atlas.ja-jp.api_meta.meta/api_meta/meta_listmetadata.htm

jsforceだとこんな感じで使えます。注意しないといけないのは、**ListMetadataQueryは3つまで**しか指定できないというところです。このせいでReportなどのlistMetadataが面倒なんです。

```
var connection = new jsforce.Connection()
connection.login(username, password)
.then(function() {
  return connection.metadata.list([{type: 'ApexClass'}]);
})
.then(function(components) {
  console.log(components);
})
```

フォルダのlistMetadata
----
Document, Dashboard, EmailTemplate, Reportはフォルダの中に入っており、listMetadataするときはフォルダを指定する必要があります。

```
connection.metadata.list([{type: 'Report', folder: 'MyReportFolder'}]);
```

じゃあこのフォルダはどうやって調べるかというと、相変わらず`*`は使えないので、こんな風にします。

```
connection.metadata.list([{type: 'ReportFolder'}]);
```

これドキュメントに明確な記載がないと思いますが、以下のように対応しています。（EmailTemplateのフォルダがEmailTemplateFolderじゃないのはホントどうかと思います…）

|コンポーネント|フォルダ|
|:---|:---|
|Document|DocumentFolder|
|Dashboard|DashboardFolder|
|EmailTemplate|**EmailFolder**|
|Report|ReportFolder|

なお、フォルダをretrieveやdeployするときのpackage.xmlには、`<name>ReportFolder</name>`ではなくて`<name>Report</name>`の方の`<types>`に記述します。

### フォルダ内コンポーネントのlistMetadata

フォルダのlistMetadata→コンポーネントのlistMetadataとすれば、目的のコンポーネント一覧を取得できます。最初はこんなふうにかくと思いますが…

```
connection.metadata.list([{type: 'ReportFolder'}])
.then(function(folders) {
  var query = folders.map(function(e) {
    return {type: 'Report', folder: e.fullName}
  });
  return connection.metadata.list(query)
})
.then(function(reports) {
  console.log(reports);
})
```

いくつか落とし穴があるので気をつけてください。

* ListMetadataQueryは3つまでです。上の例は、フォルダが3つ以内じゃないとダメです
* listMetadataの結果が0の場合、コールバックの引数はundefinedです。
* listMetadataの結果が1つの場合、コールバックの引数が配列になりません

作りました
----
Document, Dashboard, EmailTemplate, Report, DocumentFolder, DashboardFolder, EmailFolder, ReportFolderをlistMetdataして全部retrieveUnpackagedするサンプルを書きました。よろしければご利用ください。

https://gist.github.com/yusuke8609/ab6f087a0a645a106a6f

Node.jsさえあれば動きます。`npm install -g coffee-script`したあと`npm install`してください。実行は`coffee retrieve_folders.coffee`です。メタデータをretrieveUnpackagedして、unpackagedディレクトリに展開します。

以下の環境変数を設定してください。（SALESFORCE_HOSTは任意）dotenvを使っているので`.env`というファイルを作ってそこに書いてもいいです。

```
SALESFORCE_USERNAME=ユーザ名
SALESFORCE_PASSWORD=パスワード＋必要ならセキュリティトークン
SALESFORCE_HOST=login.salesforce.com
```

listMetadataを3個ずつ発行して統合するところがややこしくなっています。
SoftLayer Direct Linkへの接続ガイド

KVHで、専用線、イーサネット回線など国内ネットワークサービスのプロダクトマネージャを担当しています。

サービス開発者として、”SoftLayer Direct Linkへの接続”を語ります。

資料は↓こちらから
https://www.slideshare.net/secret/pjWYxBWebYHwzY
さくらVPS借りてwebサイト積んでみたよ

サーバセットアップの手順とかは下記のリンクが纏まっていてそちらに参考にしていただければと思います。
詰まった箇所とその時の対処した内容とかを書いていきたいと思います。

##経緯とか
・競馬を論じるのに必要なデータがあってもいちいちデータ分析とかしなきゃならない時があって不便に思っていた
・それとは別に自分の利便性と視認性の高い競馬データサイトを構築したかった
・全然サーバ触ったりとかご無沙汰だったので知識がさび付く前にもう一度勉強しなおしたかった
・世の中にアレなアプリが1つ増えたくらい別に悪い影響がないんじゃない？(って思いたい

##環境
centOS6.6+Apache+perlでデータはcsvから引っ張ってきてます、
別に大した事してるわけじゃないですしそもそも表示データがまだ少ないですから･･･
テンプレートエンジンはXslate使ってます、
埋め込みとか殆どないですけど今後使うのに便利かなと思って
普段はTT使ってるので別のテンプレートエンジンつかってもいいかなと言う安易な理由もあります。

##手順とか参考にさせてもらったサイトなど
[VPSセットアップ関連]
・[さくらVPSを借りる　初期設定編](http://qiita.com/piotzkhider/items/8550b66e633c8f1dc26d#2-9)
・[さくらVPS の OS セットアップ情報をまとめてみる(初心者向け)](http://qiita.com/RentalCat__/items/935fabcef465a60825fb#1-2)
・[さくらのVPS初期設定[SSH接続設定/ユーザ追加/公開鍵認証/iptables] ](http://wada811.blogspot.com/2014/07/initialize-sakura-vps.html)
[バーチャルホスト関係]
・[さくらVPS導入Step6 – Apache マルチドメインの設定](http://www.vpswordpress-admindocs.com/vps/install/201106)
[ドメイン設定関連]
・[さくらのVPSに独自ドメインを設定する ](http://www.atelier-nodoka.net/2013/06/vps-unique-domain/)
こちらのサイトの内容を参考にさせていただきました

##詰まった箇所
・Perlで利用してるライブラリやモジュール群をインストールするのにcpanmを使って、
非常に便利だったのですが、依存関係のあるものに関してインストールが止まったりしたので少し焦りました(初心者特有の焦り
→エラーログ読んで必要なものを適宜インストール、まずはエラーログを読もう

・アプリうごかねぇよ！！permission denyとかいうログ出てる！
→ユーザーや権限を適宜設定したりした、こちらもログを見てエラーの当たりをつけよう

・「(2)No such file or directory: exec of ～」のエラー出る！めっちゃ出る！！
→CRLFの罠を疑いTeraTerm上からテスト用のCGIを作成･･･しても出る！！めっちゃ出る！！！
→TeraTermの端末設定見る→改行コードCRやんけ！
→odコマンドで内容見る、しっかり\rが記入されており無事撃沈
→適宜置換して無事動くようになる

・バチャホの設定全然わかんない･･･
→上のサイト参考にして手探りで設定していきました、
ドキュメントルートとか適当に切ったディレクトリに設定しており
サイト構成も適当だったのでどうすればいいのかよくわからないままとりあえず動かそうという方向に

##雑感
かつて働いていた所でホスティングに毛が生えた程度のPaaS？とか使ってて、
それがめちゃくちゃ遅かったりしたもんですからそういうのと比較すると
やっぱりさくらのVPSってすごいってなっちゃいますすよね、
でもSSD20GBで借りてるのは秘密

###と言う事で作ったサイトはこちらです
・[競馬場別勝率・回収率データ一覧(β)](http://keiba-expected.net/datahorserace/)
多分今後の方向性としてはラップタイムデータとか種牡馬別コースデータとかその辺りが増えて行くと思いますが、
種牡馬別コースデータは名鑑とかにあるから別にいいか？って気はしてます。
PostgreSQLの範囲型

[範囲型とは](https://www.postgresql.jp/document/9.3/html/rangetypes.html)
[範囲型で使える演算子](https://www.postgresql.jp/document/9.2/html/functions-range.html)
[上限値もしくは下限値のみをUPDATEする方法](http://stackoverflow.com/questions/24800753/updating-the-upper-bound-of-a-daterange-to-infinity)
Update Rails to 4.2.0 and the listen address has changed.

I have my Rails installed in a VM managed by Vagrant. And after updated Rails to 4.2.0(a development environment), I can't access http://localhost:3000 in my host.

Due to the [official release notes](http://guides.rubyonrails.org/4_2_release_notes.html#default-host-for-rails-server) , the default listen host has changed to `localhost`.

If you want to bind the server to any other host, you can use the command line options like below:

```
rails s -b 0.0.0.0 -p 80
```

It's important to read the release
建築家に知ってほしいオープンソースな建築


建築家のみなさんこんにちは、今回はオープンソースとは遠い場所にいる皆さんに向けてオープンソース建築についてのリンクを紹介をしたいと思います。

## なぜ、ここQiitaに書いたか

ここQiitaはプログラマの為の知識を共有コミュニティですが、この様なオープンなコミュニティが存在する事も知って欲しくてここに書きました。
※こういったオープンで活発なコミュニティがあれば教えて下さい。

他にも[Stack Overflow](http://stackoverflow.com/ "Stack Overflow")という巨大なコミュニティもあります。
※最近日本語版もオープンしました！！[スタック・オーバーフロー](http://ja.stackoverflow.com/ "スタック・オーバーフロー")

## オープンソースとは

* [「オープンソースとは何なのか？」をレゴでわかりやすく説明したムービー - GIGAZINE](http://gigazine.net/news/20140310-open-source-lego/ "「オープンソースとは何なのか？」をレゴでわかりやすく説明したムービー - GIGAZINE")
* [オープンソース - Wikipedia](http://ja.wikipedia.org/wiki/%E3%82%AA%E3%83%BC%E3%83%97%E3%83%B3%E3%82%BD%E3%83%BC%E3%82%B9 "オープンソース - Wikipedia")
* [よくある質問 | オープンソース・ライセンスの談話室](http://www.catch.jp/oss-license/faq/#OSS-2 "よくある質問 | オープンソース・ライセンスの談話室")

## オープンソースな建築

### Be-h@us

* [aki's STOCKTAKING: 個人の‘自立’をうながす住宅システム「Be-h@us」](http://landship.sub.jp/stocktaking/archives/001067.html "aki's STOCKTAKING: 個人の‘自立’をうながす住宅システム「Be-h@us」")
* [BE-WORKS: 個人の‘自立’をうながす住宅システム「Be-h@us」](http://www.be-works.jp/blog/2008/03/behus_10.html "BE-WORKS: 個人の‘自立’をうながす住宅システム「Be-h@us」")
* [BE-WORKS](http://www.be-works.jp/blog/ "BE-WORKS")

### GPLの家

* [njun.jp](http://njun.jp/ "njun.jp")
	* [GPLの家 [GPLの家] | 受賞対象一覧 | Good Design Award](http://www.g-mark.org/award/describe/35410 "GPLの家 [GPLの家] | 受賞対象一覧 | Good Design Award")
	* [第4回 変人ファイル1「オープンソースの家」｜オープンソース geek(変人)列伝 - 内 信史｜イリイのメールマガジンili-zine](http://www.ilii.co.jp/ili-zine/archives/2012/09/4_1_1.html "第4回 変人ファイル1「オープンソースの家」｜オープンソース geek(変人)列伝 - 内 信史｜イリイのメールマガジンili-zine")

### CCハウス

* [YASUTAKA YOSHIMURA ARCHITECTS](http://wp.ysmr.com/ "YASUTAKA YOSHIMURA ARCHITECTS")
	* [10＋1 web site｜鼎談：「CCハウス」はなにを可能にするか｜テンプラスワン・ウェブサイト](http://10plus1.jp/monthly/2011/03/cc.php "10＋1 web site｜鼎談：「CCハウス」はなにを可能にするか｜テンプラスワン・ウェブサイト")
	* [住宅の図面をオープンソース化する！？](http://dtoac.com/blog/20130530/1468 "住宅の図面をオープンソース化する！？")

### WikiHouse
* [WikiHouse | Open Source Construction System](http://www.wikihouse.cc/ "WikiHouse | Open Source Construction System")
	* [「WikiHouse」が目指す建築のオープンソース化 | 人生エコ化プロジェクト](http://yoshisabroad.com/2013/05/26/wikihouse/ "「WikiHouse」が目指す建築のオープンソース化 | 人生エコ化プロジェクト")

# 提案:図面オープンソースで出してみては如何か。
Backbone-relationalで自分自身をコレクションに含める


Backboneお勉強の備忘録。

例えばこんなモデルとコレクション。

```coffeescript:models.coffee
class User extends Backbone.RelationalModel
  urlRoot: '/users/'
```

フォロー中ユーザを表すリレーションを定義。

```coffeescript:models.coffee
class User extends Backbone.RelationalModel
  urlRoot: '/users/'

  relations: [
    {
      type: Backbone.HasMany
      key: 'followings'
      relatedModel: User
    }
  ]
```

しかし、自分自身のモデル（`User`）をリレーションに定義しても、名前空間が違うので読み出せない。でも、`relatedModel`の定義をコールバックにすれば大丈夫。

```coffeescript:models.coffee
class User extends Backbone.RelationalModel
  urlRoot: '/users/'

  relations: [
    {
      type: Backbone.HasMany
      key: 'followings'
      relatedModel: ->
        User
    }
  ]
```

# 参考

* [Suggestion for nested collections](https://github.com/PaulUithol/Backbone-relational/issues/347)
Commandline Parameterの使い方(第二回オフ会内容①)

今回は、前日にオフ会のレポートについて書いてくださってたので、
 
第二回オフ会の内容の一つ、
__Commandline Parameter__についてやってみようと思います。
その次の回で__Boygroup__について書こうと思います！

第二回オフ会のレポは以下です。
http://qiita.com/yhy_jp/items/29102ebea94fba729b16

#基礎知識(Commandline Parameterとコマンドプロンプト)
##Commandline Parameterとは
__特定の目的を達成をするために、vvvvの起動時にいくつかのパラメーターを定義するためのもの__
です。
vvvv公式サイトを見るとこんな感じでいくつかのパラメーターを挙げてくれています。
![command1.JPG](https://qiita-image-store.s3.amazonaws.com/0/37495/7c3fc035-1fe4-f93e-27ec-23e4cf614327.jpeg)

http://vvvv.org/documentation/commandline-parameters#server


##コマンドプロンプトとは、
キーボード入力でPCに指示を与えられるようなものです。（ざっくりですみません。）
まずは、これを使ってvvvvを立ち上げようと思います。
![command3.JPG](https://qiita-image-store.s3.amazonaws.com/0/37495/438a0f77-ecb6-b48d-6c9f-b3cd182d863c.jpeg)


##コマンドプロンプトの場所
Windows7の場合は、
スタート＞すべてのプログラム＞アクセサリ＞コマンドプロンプト

Windows8の場合は、
・一番楽なのは「コマンドプロンプト」と検索かける
・すべてのアプリの中のどっかにある
・フォルダメニュー＞Cドライブ＞ファイルのコマンドプロンプト起動
のどれかでひらけます。
個人的には、検索が一番楽かと。

#コマンドプロンプトでvvvv.exeを立ち上げる
##vvvv.exeファイルの場所の確認
vvvv.exeファイルは、普段起動しているvvvvのファイルを
右クリック＞プロパティ
でファイルの場所がわかると思います。

##コマンドプロンプトからの起動
vvvv.exeファイルの場所を確認し、
__正確にvvvv.exeファイルまで__を入力してください。
（コピーし、右クリック貼り付けでもできます。）

そして、Enterを押す！
これで、普段通りvvvvが起動するはずです。
僕のはややこしい位置にあるので、長いですが、こんな感じ。
![command4.JPG](https://qiita-image-store.s3.amazonaws.com/0/37495/b2750e30-b109-9b87-36a3-d567ede407b4.jpeg)



#Commandline Parameterでパラメータを定義し、起動する
今回は、Boygroupを使うので、
Serverでの立ち上げとClientでの立ち上げをやってみたいと思います。

やり方は簡単。
先ほどのコマンドプロンプトに、Commandline Parameterの内容をつけて入力するだけ。
__「 / 」の前にはスペースを。__

##/server
__...vvvv.exe /server__を入力し、起動
![command_5.JPG](https://qiita-image-store.s3.amazonaws.com/0/37495/a226a86c-17c7-c6e0-3c34-b47df08402ed.jpeg)


起動しているアプリケーションのアイコンにカーソルをのせると
__「SERVER」__と表示されてれば、成功です！


##/client [IP address]
__....vvvv.exe /client 192.....(IPアドレス)__
clientもサーバーと同様に、上記のように入力すると起動します。
clientの場合は立ち上げると、起動画面にIPアドレスがこんな感じで出てきます。
![commandline6.JPG](https://qiita-image-store.s3.amazonaws.com/0/37495/495b59a8-bcc4-52f5-999a-453eb28e722e.jpeg)


これで成功！


#次回はBoygroup
Commandline Parameterの使い方は無事わかったでしょうか？
次回はBoygroupを使って、Parameterを生かしてみましょう。

オフ会楽しかったなー。
１月のオフ会テーマ絶賛募集中です。


__Twitter:Junky_Inc__
Love2D:ゲームエンジンその5


###元記事
http://www.headchant.com/2010/11/27/love2d-tutorial-part-1-invaders-must-die/

その４にｙ方向を追加します。

```lua:main.lua
-- tutorial #1
-- the 3 golden love function, lua tables, keyboard input, draw circle

function love.load()
 hero = {} -- new table for the hero
 hero.x = 300    -- x,y coordinates of the hero
 hero.y = 450
 hero.speed = 100
end

function love.update(dt)
 if love.keyboard.isDown("left") then
   hero.x = hero.x - hero.speed*dt
 elseif love.keyboard.isDown("right") then
   hero.x = hero.x + hero.speed*dt
 elseif love.keyboard.isDown("up") then
   hero.y = hero.y - hero.speed*dt
 elseif love.keyboard.isDown("down") then
   hero.y = hero.y + hero.speed*dt   
 end
end

function love.draw()
 -- let's draw some ground
 love.graphics.setColor(0,255,0,255)
 love.graphics.rectangle("fill", 0,465,800,150)

 -- let's draw our hero
 love.graphics.setColor(255,255,0,255)
 love.graphics.rectangle("fill", hero.x,hero.y, 30,15)
end
```
###Zip
作業ディレクトリで以下コマンド発行
zip -r ../${PWD##*/}.love *

###Run
はい出来ました。
![スクリーンショット 2014-12-22 19.52.44.png](https://qiita-image-store.s3.amazonaws.com/0/33317/85e01a57-fe12-515c-2d47-4875dea9489c.png "スクリーンショット 2014-12-22 19.52.44.png")
brew caskでJava8をインストール


# 前提
- brewが使える
- brew caskが使える

# やること
## 1. Javaインストール
```
$ brew cask install java
```
これで最新版のJava（2014年12月22日現在、Java8）がインストールされる。

## 2. 向き先をインストールしたJavaのバージョンに向ける
```
$ vim ~/.bash_profile
```
などでファイル編集をし、

```
export JAVA_HOME=`/usr/libexec/java_home -v 1.8`
```
の行を加える。
※　Java7に戻したいときは行末を`1.8`から`1.7`に戻せばOK。

## 3. `~/.bash_profile`に書いた内容を反映
```
$ source ~/.bash_profile
```

これで、変更が反映される。

```
$ java -version

java version "1.8.0_20"
Java(TM) SE Runtime Environment (build 1.8.0_20-b26)
Java HotSpot(TM) 64-Bit Server VM (build 25.20-b23, mixed mode)
```

※　著者は、`source ~/.bash_profile`実行前は、下記バージョンでした。

```
java -version

java version "1.7.0_51"
Java(TM) SE Runtime Environment (build 1.7.0_51-b13)
Java HotSpot(TM) 64-Bit Server VM (build 24.51-b03, mixed mode)
```
Meteor をさわってみた

Meteor 1.0.2


```shell-session
$curl install.meteor.com | /bin/sh
```
インストール終わるとこんなんが表示される。

```
Meteor 1.0.2 has been installed in your home directory (~/.meteor).
Writing a launcher script to /usr/local/bin/meteor for your convenience.

To get started fast:

  $ meteor create ~/my_cool_app
  $ cd ~/my_cool_app
  $ meteor

Or see the docs at:

  docs.meteor.com
```

新規プロジェクトは`meteor create`で作成する。

```
$mkdir ~/meteor-sample
$cd meteor-sample
$meteor create ./my-first-meteor
```

プロジェクトの作成が終わるとシンプルなメッセージが表示される。

```
my-first-meteor: created.

To run your new app:
  cd ./my-first-meteor
  meteor
```
ディレクトリを移動し、appサーバーを起動する。

```
$cd ./my-first-meteor
$meteor
[[[[[ ~/my-first-meteor ]]]]]

=> Started proxy.
=> Started MongoDB.
=> Started your app.

=> App running at: http://localhost:3000/
```

localhost:3000をみると、こんなんが表示される。

![スクリーンショット 2014-12-22 19.39.07.png](https://qiita-image-store.s3.amazonaws.com/0/7046/7d53f3be-c4df-e55f-9b8e-9fc01d39c207.png)

websocketっぽい感じで、`Click Me`とかかれたボタンを押すとスイスイとカウンターがアップする。とりあえずここは`Ctrl+C`でサーバーを停止。

さて、ファイル階層

```
$tree
.
├── my-first-meteor.css
├── my-first-meteor.html
└── my-first-meteor.js

0 directories, 3 files
```

へ、これだけなんだ。
CSSはカラやったけど、他の二つはこんな感じ。

```html:my-first-meteor.html

<head>
  <title>my-first-meteor</title>
</head>

<body>
  <h1>Welcome to Meteor!</h1>

  {{> hello}}
</body>

<template name="hello">
  <button>Click Me</button>
  <p>You've pressed the button {{counter}} times.</p>
</template>
```

```js:my-first-meteor.js
if (Meteor.isClient) {
  // counter starts at 0
  Session.setDefault("counter", 0);

  Template.hello.helpers({
    counter: function () {
      return Session.get("counter");
    }
  });

  Template.hello.events({
    'click button': function () {
      // increment the counter when button is clicked
      Session.set("counter", Session.get("counter") + 1);
    }
  });
}

if (Meteor.isServer) {
  Meteor.startup(function () {
    // code to run on server at startup
  });
}
```
Firefox Developer Editionを使って他ブラウザをリモートデバッグする

この記事は[Iwate Advent Calendar 2014の21日目](http://qiita.com/advent-calendar/2014/iwate-dev)ですが、タイトル通り岩手とは全く関係なく、私が岩手出身なだけです。

日本時間11月10日に、Firefoxが10周年を迎えて、もともとAuroraチャネルだったFirefoxがいくつかの開発者向けアドオンを標準搭載し、Developer Editionとして生まれ変わりました。
そのなかでも[Valence](https://developer.mozilla.org/en-US/docs/Tools/Valence)と呼ばれるアドオンが面白い機能だったのでアドベントカレンダーで紹介したいと思います。

# Valenceとは
[Valence (Firefox Tools Adapter) - Firefox Developer Tools | MDN](https://developer.mozilla.org/en-US/docs/Tools/Valence)
```
Valence (formerly Firefox Tools Adapter) is an experimental add-on that enables the Firefox Developer Tools to debug a wider variety of browsers, not just the Gecko-based Firefox, Firefox for Android, and Firefox OS browsers.
```
とあるように、このアドオンはFirefoxのみならず、他の様々なブラウザまでもデバッグすることができるツールとなっています。

# 実際に試してみる
## 環境
- Windows 8.1
- Firefox Developer Edition

試しにリモートデバッグするブラウザとしてGoogle Chromeを使ってみます。
※ 近いうちにMacで試す内容を追記します。

## 準備
### 起動オプションの設定
先のValenceのMDNのページにあるように、Google Chromeの起動オプションを設定します。
MacやLinuxであればターミナルから引数を渡すだけでいいのですが、Windowsはターミナル入れるのとかも面倒くさいのでショートカットを使います。

追加で設定するオプションはこちら
```
 --remote-debugging-port=9222 --no-first-run --no-default-browser-check --user-data-dir=$(mktemp -d -t 'chrome-remote_data_dir')
```

Windowsで`mktemp`相当のコマンドをどうすればいいのか微妙だったので、今回はなしで設定しています。
![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/6295/6032bf92-2f11-44eb-c018-c859c4fe3938.png)

## リモートデバッグの実行
先ほど作ったショートカットを使っておもむろにGoogle Chromeを立ち上げます。
そして適当なサイトにアクセスしておきます。

そして次にFirefox Developer Editionを立ち上げ、さらにWebIDEを呼び出します。
WebIDEの右上にある「ランタイムを選択」から「Google Chrome」を選択します。
![スクリーンショット (4).png](https://qiita-image-store.s3.amazonaws.com/0/6295/3baa8618-c546-4a62-0db1-811863530754.png)

そうするとWebIDEの左上にある「アプリを開く」の一覧の中に、今Google Chromeで開いているタブの名前がありますね？
![スクリーンショット (5).png](https://qiita-image-store.s3.amazonaws.com/0/6295/5c7b799e-d4bd-c15b-67b6-98e74dcbb505.png)

そのタブを選択してみると、WebIDEの中でFirefox Developer Toolが立ち上がり、インスペクタでGoogle Chrome内のHTMLを見ることができています。
![スクリーンショット (6).png](https://qiita-image-store.s3.amazonaws.com/0/6295/54c1f6fa-722c-16eb-e5a4-b3e408f0cb2d.png)

もちろんコンソールタブやデバッガなども利用可能です。

# まとめ
今回はPC版Google Chromeだけでしたが、iOS版SafariやAndroid版Firefoxなども手元のPCのFirefox Developer Editionからデバッグが可能になりました。
ただスマートフォンサイトのデバッグの場合には、Google ChromeのEmulationからチェックすることもあるかと思います。
そんなときには向かないので、個人的には今後の発展に期待しています。

みなさんFirefox Developer Editionを使ってみるのも楽しいですよ。
Active Directoryグループを使用した分散ファイアウォール設定 【VMware NSX】


VMware NSXでは、Active Directoryと連携することで、ADグループをそのままNSXのファイアウォールに使用することができます。
これを**「Identity Firewall」**機能と言います。

使用例としては、VDI環境のログインユーザに応じて自動的にFWポリシーを割り当てる、といったことが出来ます。
新しくVDIが追加された場合でもNSXのファイアウォール設定は変える必要がなくなりますので、運用コストを抑えることができます。

以下、設定手順です。


#1. NSXとADを連携させる

vCenter Serverへログインし [Networking & Security] をクリックします。
NSX Managerのメニューが表示されるので、いちばん下の [NSX Managers] をクリックします。
![20141222_1819-25.png](https://qiita-image-store.s3.amazonaws.com/0/63788/1f6f2b56-8d52-b263-95ad-fd7470aae641.png)


対象のNSX Managerを選択していくと詳細メニューが出てきますので [Manage] → [Domains] をクリックします。
以下のようなリストが表示されますので [+] をクリックしてActive Directoryサーバの登録画面を表示させます。
![20141222_1802-28.png](https://qiita-image-store.s3.amazonaws.com/0/63788/06a067f1-1368-a0aa-aa9b-ecc01c8a845b.png)


ドメイン追加の画面です、ドメイン名/NetBIOS 名を入れます。
![20141222_1909-34.png](https://qiita-image-store.s3.amazonaws.com/0/63788/e3f60c6f-d846-b750-c938-2f412d323344.png)

LDAP設定が出てくるのでActive DirectoryサーバのIPや認証情報を入れます。
(※User Nameを入れているにも関わらず「ユーザ名がない」エラーが出た場合は "Use Domain Credentials" のチェックをON/OFFすると治りました)
![20141222_1909-57.png](https://qiita-image-store.s3.amazonaws.com/0/63788/f94f467d-773f-6d7e-80f2-71cb0280bae2.png)

次のページはデフォルトで進めます。
![20141222_1910-16.png](https://qiita-image-store.s3.amazonaws.com/0/63788/5f10cadb-b514-60a6-f0dd-b0a3216e5961.png)

最後に確認ページが出てくるので Finish をクリックして完了。



#2. Service ComposerからADグループを確認する

NSXの設定画面で、メニューから [Service Composer] を選択して、Security Groupの画面に行きましょう。
画面のアイコンをクリックして、Security Group作成ウィザードを起動します。
![20141222_1919-11.png](https://qiita-image-store.s3.amazonaws.com/0/63788/c136d1f7-3afe-7a67-6766-feb32089937b.png)

適当に名前をつけます。
![20141222_1916-27.png](https://qiita-image-store.s3.amazonaws.com/0/63788/3ed91bcb-dbbe-1be1-9239-14dec952f519.png)


[Select objects to include] で、Object Type を [Directory Group] にします。
![20141222_1916-56.png](https://qiita-image-store.s3.amazonaws.com/0/63788/803da138-4c75-37c1-87a0-3ca1ad3aa019.png)

するとADグループがずらりと表示されますので、ここでは Group_Marketing を例として選択します。
ここで [Finish] をクリックして終了します。
![20141222_1917-27.png](https://qiita-image-store.s3.amazonaws.com/0/63788/2181a9a6-c9bc-81a9-f3ed-76d78eaee89e.png)

[Service Composer] > [Canvas] で見てみると、Security Groupにはメンバーがいない状態になっています。
![20141222_1918-10.png](https://qiita-image-store.s3.amazonaws.com/0/63788/26522d32-bd97-8f4b-9b88-60ce7688caf1.png)



#3. ADグループのユーザでログインしてみる。

さっそくWindowsを開いてログインしてみます。
![20141222_1926-21.png](https://qiita-image-store.s3.amazonaws.com/0/63788/caf2e516-0649-4bbb-3e86-9f9ecf51f83b.png)

ログインユーザは以下の通り
![20141222_1927-16.png](https://qiita-image-store.s3.amazonaws.com/0/63788/4d9a5d45-a743-8d43-ecbe-24cfc1fd8a42.png)



#4. Service Composerの状態を確認

さっきは仮想マシンが含まれていませんでしたが、再度見てみると自動的に追加されているのが分かります。
![20141222_1926-52.png](https://qiita-image-store.s3.amazonaws.com/0/63788/4bef0316-593d-ee24-86a9-812a09ba7f49.png)



あとはこんな感じ(↓)で分散ファイウォールの設定を行い、Src/Dst のオブジェクトとして Security Group を使用すればOKです。
![20141222_1930-09.png](https://qiita-image-store.s3.amazonaws.com/0/63788/0fb50dbf-4f00-1ae9-c39b-e72d4345d983.png)




お疲れ様でした。
Love2D:ゲームエンジンその4


###元記事
http://www.headchant.com/2010/11/27/love2d-tutorial-part-1-invaders-must-die/

これも良いサンプル
キーの受け取り、移動ができるようになります。

```lua:main.lua
-- tutorial #1
-- the 3 golden love function, lua tables, keyboard input, draw circle

function love.load()
 hero = {} -- new table for the hero
 hero.x = 300    -- x,y coordinates of the hero
 hero.y = 450
 hero.speed = 100
end

function love.update(dt)
 if love.keyboard.isDown("left") then
   hero.x = hero.x - hero.speed*dt
 elseif love.keyboard.isDown("right") then
   hero.x = hero.x + hero.speed*dt
 end
end

function love.draw()
 -- let's draw some ground
 love.graphics.setColor(0,255,0,255)
 love.graphics.rectangle("fill", 0,465,800,150)

 -- let's draw our hero
 love.graphics.setColor(255,255,0,255)
 love.graphics.rectangle("fill", hero.x,hero.y, 30,15)
end
```
###Zip
作業ディレクトリで以下コマンド発行
zip -r ../${PWD##*/}.love *

###Run
はい出来ました。
![スクリーンショット 2014-12-22 19.17.35.png](https://qiita-image-store.s3.amazonaws.com/0/33317/d191ce72-253d-bc99-4f19-4ce4ffcac0fa.png "スクリーンショット 2014-12-22 19.17.35.png")
依存リポジトリ管理でのsubmodule/subtree/subrepoの使い分け


依存ライブラリを利用する場合RubyGemsやらCocoaPodsといったツールで万事解決するケースがほとんどだと思いますが、たまーにGitに上がっているライブラリを直接自分のリポジトリに追加しないといけない場合もあったりします。

こういった時に使うGitのサブコマンドそれぞれの特徴と使いどころをまとめてみました。

# submodule
一番スタンダードな外部リポジトリ追加方法です。たぶん大抵の依存管理ではこれを使えば十分でしょう。`git-submodule`を利用すると、外部リポジトリのコード自体は自プロジェクトの管理下に取り込まれず、リポジトリの特定コミットへの参照情報のみが登録されます。外部リポジトリのcommit hashへのポインタが追加されるようなイメージです。

```
$ git submodule add git@github.com:Alamofire/Alamofire.git
$ git diff --cached Alamofire
      1 diff --git a/Alamofire b/Alamofire
      2 new file mode 160000
      3 index 0000000..3382b46
      4 --- /dev/null
      5 +++ b/Alamofire
      6 @@ -0,0 +1 @@
      7 +Subproject commit 3382b46170901f3c0050cd2dd31d7b07b2b7b7b0
```

submoduleとして追加した外部リポジトリがあるはずのディレクトリは、初期状態では空っぽです。`git submodule init`、`git submodule update`を実行すれば外部リポジトリのコードの実体をローカル上に落としてくる事ができ、ライブラリを自プロジェクト側から利用できるようになります。ただし、あくまでsubmoduleは外部リポジトリへの参照なので、submodule updateで取得したコードは自プロジェクトの管理下には置かれません。そのためファイルに修正を加えてcommitすることもできません。あくまで外部リポジトリを参照するだけで、外部リポジトリに一切変更を加えない場合にはsubmoduleを使うと良さそうです。

# subtree
外部リポジトリのライブラリを利用する際に、プロジェクト固有の修正をライブラリに加えたい場合があります。例えばプロジェクトで利用している言語・フレームワークのバージョンに合うようライブラリのビルド設定を変えるとか。けっこうレアケースだとは思いますが、こういった修正は外部リポジトリには反映したくないような場合が多いと思います。

`git-subtree`は、submoduleと異なり外部リポジトリのファイルを自リポジトリの一部として取り込むことができます。


```
$ git remote add alamofire git@github.com:Alamofire/Alamofire.git
$ git subtree add --prefix Libraries/Alamofire alamofire master --squash
```

subtreeでは外部リポジトリのファイルも自リポジトリの一部として扱われるため、自リポジトリのコード同様に修正・commitすることができます。またsubtreeは依存リポジトリのファイルだけでなく、コミットツリーも自リポジトリに取り込むような形になります。なので`—squash`オプションを付け忘れると、自リポジトリに外部リポジトリのhistoryが全て混ざってしまうので要注意。

一見外部リポジトリのコードを全てgit addしただけかのような見た目になりますが、submodule同様に外部リポジトリの更新は適宜取り込むことができます。

```
$ git pull -s subtree --squash alamofire master
```

この時も`--squash`を付けないと外部リポジトリの履歴が取り込まれるので忘れずに。

# subrepo


subtreeではsubmoduleにできなかった外部リポジトリへの変更が可能になっていますが、外部リポジトリのファイルやコミットツリーを自リポジトリに取り込む形となり、squashし忘れると大変なことになったりと若干扱いが面倒です。ここらへんの微妙な問題を取り払うため、[ingydotnet/git-subrepo](https://github.com/ingydotnet/git-subrepo)が公開されています。

subrepoで外部リポジトリを追加する例です。

```
$ git subrepo clone git@github.com:Alamofire/Alamofire.git Libraries/alamofire
```

外部リポジトリのファイルの実体はsubtree同様に自リポジトリの管理下に置かれますが、subtreeのようにsquashしないとhistoryごと取り込まれるといったことはありません。`git subrepo pull`で外部リポジトリの更新を取り込む際も同様です。subtree同様自リポジトリ固有のファイル修正を加えつつ、submoduleのように見かけ上外部リポジトリを独立したリポジトリとして扱うことができます。gitに内蔵されたサブコマンドではないため複数人で利用する際は面倒ですが、こういうやり方もあるよという事で。

# まとめ
Gitで外部の依存リポジトリを追加する手段として、シンプルなsubmodule、かゆいところに手が届くsubtree、submodule・subtreeのいいとこ取りとしてのsubrepoの特徴をまとめました。ほとんどの場合submoduleだけで十分だと思いますが、利用シーンに合わせてこれらを使い分けていけば依存管理がスマートになって良いと思われます。
GeoIPを使って国別にiptablesで接続制御

iptablesを使って国ごとにアクセス制限をする際にGeoIPを用いると簡単に設定ができます。
環境はCentOS6です。

#インストールの準備

```
yum install gcc gcc-c++ make automake unzip zip xz kernel-devel-`uname -r` iptables-devel
rpm -ivh ftp://ftp.pbone.net/mirror/ftp.scientificlinux.org/linux/scientific/6.1/x86_64/updates/security/kernel-devel-2.6.32-279.14.1.el6.x86_64.rpm
rpm -i http://packages.sw.be/rpmforge-release/rpmforge-release-0.5.2-2.el6.rf.i686.rpm
```

#perl-Text-CSV_XSのインストール

```
vi /etc/yum.repos.d/rpmforge.repo 
-------------
enabled = 0
-------------

yum install --enablerepo=rpmforge perl-Text-CSV_XS

```

#xtables-addonsのインストール

xtables-addonsは、iptablesを扱う際のカーネルの拡張モジュールです。

```
wget http://downloads.sourceforge.net/project/xtables-addons/Xtables-addons/1.37/xtables-addons-1.37.tar.xz

tar xvf xtables-addons-1.37.tar.xz
cd xtables-addons-1.37/
```

CentOS6の場合は以下の設定が必要なようです。（その場合のip6tablesでの動作は未検証）

```
vi /lib/modules/2.6.32-279.14.1.el6.x86_64/build/include/linux/autoconf.h
------------
/* #define CONFIG_IP6_NF_IPTABLES_MODULE 1 */
------------
```

インストールします。

```
./configure

make && make install
```

#GeoIPデータの取得&展開
データをダウンロードと配置をします。
常に最新の情報に更新するためにはcronなどで以下の処理を行う必要があります。

```
cd geoip/
./xt_geoip_dl
./xt_geoip_build GeoIPCountryWhois.csv
mkdir -p /usr/share/xt_geoip/
cp -r {BE,LE} /usr/share/xt_geoip/
```

#使い方

```
iptables -I INPUT -m geoip --src-cc CN -j DROP
```

のように-src-ccで国コードを指定します。

#参考
http://www.howtoforge.com/xtables-addons-on-centos-6-and-iptables-geoip-filtering
WordPress のユーザー権限を管理者に書き換える

はじめての投稿です！

WordPress の案件で、最新のデータベースをインポートするたびに、自分を管理者権限にしないといけないものがあったので、メモ。


```mysql

update wp_usermeta set meta_value='a:1:{s:13:"administrator";b:1;}' where user_id=ユーザＩＤ AND meta_key="wp_capabilities"
update wp_usermeta set meta_value=10 where user_id=ユーザＩＤ AND meta_key="wp_user_level"
[JAWS-UG CLI] SNS:#5 トピックの削除


AWS CLIを利用して、SNSのトピックを削除してみます。


前提条件
========


SNSへの権限
-----------

SNSに対してフル権限があること。


AWS CLIのバージョン
-------------------

以下のバージョンで動作確認済

- AWS CLI 1.10.11

```bash:コマンド:
aws --version
```

結果(例):

      aws-cli/1.11.70 Python/2.7.12 Linux/4.4.11-23.53.amzn1.x86_64 botocore/1.5.33

バージョンが古い場合は最新版に更新しましょう。

```bash:コマンド:
sudo -H pip install -U awscli
```


0. 準備
=======

まず変数の確認をします。

```bash:変数の確認:
cat << ETX

        AWS_DEFAULT_PROFILE: (0.1) ${AWS_DEFAULT_PROFILE}
        AWS_DEFAULT_REGION:  (0.2) ${AWS_DEFAULT_REGION}

ETX
```

結果(例):

      AWS_DEFAULT_PROFILE: (0.1) <SNSにフル権限のあるプロファイル>
      AWS_DEFAULT_REGION:  (0.2) ap-northeast-1

変数が入っていない、適切でない場合は、それぞれの手順番号について作業を
行います。


0.1. プロファイルの指定
-----------------------

プロファイルの一覧を確認します。

```bash:コマンド:
cat ~/.aws/credentials \
       | grep '\[' \
       | sed 's/\[//g' | sed 's/\]//g'
```

結果(例):

      iamFull-prjz-mbpr13
      <SNSにフル権限のあるプロファイル>

```bash:変数の設定:
export AWS_DEFAULT_PROFILE='<SNSにフル権限のあるプロファイル>'
```


0.2. リージョンの指定
---------------------

```bash:変数の設定:
export AWS_DEFAULT_REGION='ap-northeast-1'
```


最終確認
--------------

```bash:変数の確認:
cat << ETX

        AWS_DEFAULT_PROFILE: (0.1) ${AWS_DEFAULT_PROFILE}
        AWS_DEFAULT_REGION:  (0.2) ${AWS_DEFAULT_REGION}

ETX
```

結果(例):

      AWS_DEFAULT_PROFILE: (0.1) <SNSにフル権限のあるプロファイル>
      AWS_DEFAULT_REGION:  (0.2) ap-northeast-1


1. 事前作業
===========


1.1. トピック名の指定
---------------------

削除するトピックの名前を指定します。

```bash:変数の設定:
SNS_TOPIC_NAME='handson-20170417'
```


1.2. トピックの確認
-------------------

トピック一覧に削除するトピックが存在することを確認します。

```bash:コマンド:
aws sns list-topics \
        --query "Topics[?contains(TopicArn, \`${SNS_TOPIC_NAME}\`)]"
```

結果(例):

      [
          "TopicArn": "arn:aws:sns:ap-northeast-1:XXXXXXXXXXXX:handson-20170417"
      ]


1.3. ARNの取得
--------------

SNSでトピックを操作するときは、対象トピックのARNを特定する必要がありま
す。

```bash:変数の設定:
SNS_TOPIC_ARN=$( \
        aws sns list-topics \
          --query "Topics[?contains(TopicArn, \`${SNS_TOPIC_NAME}\`)].TopicArn" \
          --output text \
) \
        && echo ${SNS_TOPIC_ARN}
```

結果(例):

      arn:aws:sns:ap-northeast-1:XXXXXXXXXXXX:handson-20170417


1.4. トピックの購読者確認
-------------------------

削除対象トピックの購読者がいないことを確認します。

```bash:コマンド:
aws sns list-subscriptions-by-topic \
        --topic-arn ${SNS_TOPIC_ARN}
```

結果(例):

      {
          "Subscriptions": []
      }


2. トピックの削除
=================

トピックを削除します。

```bash:変数の確認:
cat << ETX

        SNS_TOPIC_ARN: ${SNS_TOPIC_ARN}

ETX
```

```bash:コマンド:
aws sns delete-topic \
        --topic-arn ${SNS_TOPIC_ARN}
```

結果(例):

      (戻り値なし)


3. 事後作業
===========


トピックの不存在確認
--------------------

トピックが存在しないことを確認します。

```bash:コマンド:
aws sns list-topics \
        --query "Topics[?contains(TopicArn, \`${SNS_TOPIC_NAME}\`)]"
```

結果(例):

      []


完了
====