OmniAICreator/Qiita-1.07M huggingface dataset:
GoogleSpreadSheet | Enter を押すと同時に ひとつ上のセルにフォーカスする ( Shift + Enter )

# 正

編集状態から Enter を押すと。

![image](https://qiita-image-store.s3.amazonaws.com/0/89618/5dec25f5-7378-d25b-2a3c-7214ee448d81.png)

すぐ下のセルにフォーカスが移る。

![image](https://qiita-image-store.s3.amazonaws.com/0/89618/75799fa3-9705-3f0c-4743-dde9086ae409.png)

# 逆

`Shift+Enter` だと逆で、すぐ上のセルにフォーカスが移る。

![image](https://qiita-image-store.s3.amazonaws.com/0/89618/bbcd50af-024f-b27f-1fc1-8fc2b597c160.png)

# 環境

- Google Chrome 51.0.2704.103 (64-bit)
- Mac OS X El Capitan 10.11.5








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
人工知能アプリ、時代を変えそうなヘルスケアサービス「Health Tap」についてまとめてみる

運営ブログ：[人工知能搭載ヘルスケアサービス「Health Tap」についてのまとめ](http://u-kan.hatenadiary.jp/entry/research-healthtap)

# 調べた経緯

人工知能を活用したアプリを開発しようとしてる。前回まとめた中で、もっとも気になった「health tap」についてもうちょっと詳しくまとめてみようかなぁ、、と。医療先進国の日本だけど、このサービスは流行りそう。　ていうか流行った方が良い世界になりそう。


# health tap とは

health tapは、**人間の、健康に関する関わり方を再開発するもの**として、2010年にローンチされたサービス。医者と、利用者がプラットフォーム上でやり取りしあうサービスみたい。

2013年の状態で、登録している医者の数は3万5000人、毎月1000万件の質問が投稿され、累計アプリダウンロード数は200万を超えてるんだとか。医師も無料で回答しているし、患者も無料で利用できるのか？？　どうやってお金稼いでるんだこの人たち。。

患者側の使い方は簡単で、主に以下の手順に沿って利用されている。

1. 健康状態に疑問をもった人が、自分の症状を投稿する。（発疹がある、喉が腫れてる、とか）
1. 人工知能がその症状に関して詳しい、適切な医者とマッチング
1. 24時間以内に、その症状に対する対処法が回答される
1. みんなハッピーになる<3

ここで疑問に思ったのが、以下の２点。順に調べてまとめてみる。

- どうやってその回答の厳密さを担保してるんだろう
- 医者の参加メリットは？
- 該当する国内サービスってあるのかな？

## 回答の厳密さを担保する方法

## 医者の参加するメリット、インセンティブ

health tap自身が発表している内容によると、医者が一回のログインで費やす時間は60分以上。激務なはずのお医者さんがなんで、こんなにたくさんの時間を割くのかは素直に不思議だなぁと、、

でもやっぱりお医者さんにもたくさんメリットはあるみたい。流行り（？）の*ゲーミフィケーション*が使われているとかの他に、実務的な面でも。

1. 受診不要な患者さんを減らすことによる、業務の効率化
1. 潜在患者からの認知度
1. 同業者からの認知度

があるらしい。いや、確かに。全部良さそうだけど、個人的には3が結構メリットありそう。医者ってなんだかんだ紹介ビジネスなところもあるだろうし。個人的な経験からもよく行く医者なんて、口コミで全部決めちゃうしね。。

## 類似の国内サービス

M3のアスクドクターズ？モデル的にはこれが似てるのかもしれないけど、個人的にはこれは流行らない気がする。というのも、月額でお金かかるのも結構しんどいし、怪我したってわざわざカードの登録とかしてから質問するようなサービスなら気持ちも萎えてやらないと思う。

自分がこれをやるなら、全部無料にして、既存のプラットフォーム（LINE, Messanegr）から質問を投げられるようにするかなぁ
これ是非作りたいなぁ　身近な課題で、必要そうだし、色々と面白い気がする。
GoogleSpreadSheet | 日付をずらっとインクリメントする

まずは、基準日にフォーカスが当った状態にする。
この状態でセルの「右下」にカーソルを当てると、十字マークが出てくる。

![image](https://qiita-image-store.s3.amazonaws.com/0/89618/8deba330-89c2-4ade-9b53-61acd2f40b77.png)


そのままマウスで下の方までドラッグする。

![image](https://qiita-image-store.s3.amazonaws.com/0/89618/a8f76008-0206-2a13-3687-5c56de479a9e.png)

インクリメント！








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
php5.6からphp7.0にバージョンアップしてみた

codeigniter3.0で動作しているサービスでPHP5.6からPHP7.0にバージョンアップしてみたので手順をメモしておきます。
ちょっとは調整が必要になるかな～と思ってたけど何も発生しませんでした。だから只のバージョンアップしてみた記事です。

### 1.ちょっと停止
```
sudo /etc/init.d/nginx stop
sudo /etc/init.d/php-fpm stop
```
### 2.既存PHP削除
```
sudo yum -y remove php-*
```
### 3.Remiリポジトリを追加
```
# centos ver6
wget http://rpms.famillecollet.com/enterprise/remi-release-6.rpm
sudo rpm -Uvh ./remi-release-6.rpm

# centos ver7
wget http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
sudo rpm -Uvh ./remi-release-7.rpm
```
### 4.php7インストール
```
sudo yum -y install --enablerepo=remi,remi-php70 php php-fpm php-devel php-pecl-xdebug php-mbstring php-mcrypt php-openssl php-mysqlnd php-xml sendmail
```
### 5.起動
```
sudo /etc/init.d/nginx start
sudo /etc/init.d/php-fpm start
```

以上、php5.6からphp7.0にバージョンアップしてみたでした。
[雑談] 端末の時間

最近一つ現象を発見しました。端末の時間は世界の時間よりちょっと遅くる場合がありそうです・・・ここでの端末の時間は自動同期した時間です、自分で端末の時間を変えるわけでわないです。

iOSの端末（世界時間と近いかも）とAndroidの端末を並べて見て、iOSの端末は先に次の「分」に行くこともありました。例えば、23:03分から23:04分に変えるタイミングはiOSの方が先でした。

なぜかそういう現象があるかよく分からない、もし誰か原因が分かりましたら、教えて欲しいです！
韓国のゲーム利用時間を制限する法律について

# 韓国のゲーム利用時間を制限する法律について
なんかの弾みで調べなおしたので書きためておきます。

（当面PCゲームのみ）

## 2011年に制定された当時
***「シャットダウン制度（셧다운제）」***
青少年がゲームに過剰没入することを防ぐためプレイ時間を制限する制度
強制的シャットダウンと選択的シャットダウン の2種類がある
- 強制的シャットダウン
　16歳未満に適応
　夜12時から朝の6時まではゲーム鯖接続禁止（ゲーム会社が強制的にコネクションを切る）
- 選択的シャットダウン
　18歳未満に適応
　親垢が子垢をコントロールできる
　親垢で子垢がゲームを利用できる時間帯を前もって設定しておけばその時間帯はゲームができる

違反した会社は2年以下の懲役、100万円以下の罰金


## 2014年法改正
***「青少年ゲーム利用時間の保護者選択制度（청소년 게임이용시간 부모선택제）」***
16歳未満に適応
夜12時から朝の6時までは一律強制シャットダウン 
親（保護者）が 望む場合は例外としてシャットダウンを解除できる

違反した会社は2年以下の懲役、100万円以下の罰金だけど、まずは警告から

------

今も親が望む場合は解除できるってことは健在の模様。
CSがいちいち対応しないといけないし、親と子を結びつけたりと、
専用のシステム作るのが本当に面倒だったなぁ・・・（2011年当時）
だいたい、親の住民登録番号使ってアカウント作ってゲームしてる子が多数だからあまり効果はないみたいです。


## 2022年　廃止
追記　2022/11/28

参照：　https://terms.naver.com/entry.naver?docId=1049156&cid=43667&categoryId=43667  
要約：  
> 青少年のオンラインゲーム中毒を防ぐため深夜のゲームの規制（青少年保護法 第26条）として、2011年11月に導入され施行された。
しかしゲームのシャットダウン制度は国内ゲーム産業を萎縮させる代表的な規制として数えられ、モバイルゲームがメインとなる環境では時代錯誤な規制であり青少年の自由権を侵害しているという批判があった。これに政府は2121年8月「ゲーム時間選択制」として青少年のゲーム時間の制限制度を一元化するとの方針を明らかにし、国会が11月にゲームシャットダウン制度の条項を削除し青少年保護法の改定案を議決させ該当制度を2022年の1月に廃止した。

背景：
> シャットダウン制度は国内ゲーム産業を萎縮させており、実際に青少年のゲーム使用時間を抑制できていないと評価され廃止の声が挙げられていた。特に海外にサーバーを置いているゲームには適用されず、海外のオンラインゲームに利用者が集まり国内下0無産業の規模が縮小されたとの批判が多かった。ここにゲーム環境がPCからモバイル中心に移動し時代錯誤な規制という論争と青少年の自由権を侵害しているという批判が多かった。このようにゲームシャットダウン制度に対しての批判の世論が大きくなるにつれ女性家族部と文化体育観光部はゲームシャットダウン制度を父母選択制（父母が養成する場合、除外）として緩和する内容を含んだ青少年保護法の一部の改定案を2016年に国会に提出したが通過しなかった。
その後、2021年8月25日、女性家族部と文化体育観光部は、強制的なゲームシャットダウン制度を廃止し自律的な方式の「ゲーム時間選択制」を青少年のゲーム時間の制限制度を一元化するという内容の「シャットダウン制度廃止および青少年の健康なゲーム利用環境の醸成法案」として発表した。ゲーム時間選択制は満18歳未満の青少年本人または法的代理人の要請時、希望する時間帯にゲーム利用時間を設定できる制度だ。そして国会が2021年11月11日16歳未満の青少年に午前0-6時のインターネットゲーム提供を制限する規定を削除する内容を骨子にした「青少年保護法」改定案を議決し、ゲームシャットダウン制度が2022年1月1日から廃止された。


---
長い戦いでしたね 　
失ったものは大きい、、
レコードの検索条件に配列を使用するには

# Phalconでレコードの検索条件に配列を使用する方法。

* inを使用する。
* プレースホルダに*:array*を付ける。

## 例

```php
ids = [1, 2, 3];
Model::find([
    "conditions" => "id in {ids:array}",
    "bind" => [
        "ids" => $ids,
    ]
]);
```

　これでidが1または2または3のレコードがヒットする。
c++ builder XE4, 10.2 Tokyo > TDateTime > TDate型は時刻情報も保持するようだ

```txt:動作確認
C++ Builder XE4
RAD Studio 10.2 Tokyo Update 2 (追記: 2017/12/27)
```

```Unit1.cpp
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include <DateUtils.hpp>
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
	: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
	TDate procDate1 = StrToDate(L"2016/07/07");
	TDate procDate2 = StrToDateTime(L"2016/07/07 12:30:45");
}
//---------------------------------------------------------------------------
```

上記にてTDate型としてprocDate1とprocDate2を宣言している。
TDate型なのでTime情報は破棄されると思ったらそうではないようだ。

デバッグでそれぞれのvalueを見ると

- procDate1: 42558
- procDate2: 42558.521351667

`procDate2 = (TDate)StrToDateTime(L"2016/07/07 12:30:45");`という明示的な型変換でも同じ。

Now()の値からIncDay()で1日分を引いた値をTDate型に格納した場合、時刻情報も保持されてしまい、そのTDate型を基準とした日時処理をする時に失敗していた。

TDate型に格納する場合でも、以下に記載したような時刻情報消去が必要になるようだ。
http://qiita.com/7of9/items/ef540fa90615c4dcfb42
Xcode8(Beta2)とiOS10ではremote push通知用のdeviceTokenが取得できず失敗する時のチェック

ちゃんとpush通知用の設定済みでXcode7とiOS9では正常にdeviceTokenが取得できるのに
Xcode8(Beta2)とiOS10ではなぜかdeviceTokenが取れず失敗する。

```
- (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error

error => (NSError)Error Domain=NSCocoaErrorDomain Code=3000 "Appの有効な“aps-environment”エンタイトルメント文字列が見つかりません" UserInfo={NSLocalizedDescription=Appの有効な“aps-environment”エンタイトルメント文字列が見つかりません}
```


このような場合はTarget -> Capabilities -> Push Notificationsを確認してみる
Xcode8(Beta2)ではXcode7ではなかっかStepが追加されている
`Add the Push Notifications entitlement to your entitlements file`
Fix Issueボタンを押すとprojectname.entitlementsに`aps-environment`を追加してくれる

```　projectname.entitlements
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>aps-environment</key>
	<string>development</string>
</dict>
</plist>
```

これで一応開発環境でdeviceTokenが取得できる。

https://developer.apple.com/library/prerelease/content/documentation/Miscellaneous/Reference/EntitlementKeyReference/Chapters/EnablingLocalAndPushNotifications.html
とか見るとaps-environmentの値はdevelopmentとproductionが可能だがXcode8任せではdevelopmentのみ可能な状況

まだBeta2なので何が正解かはわからないが、とりあえず参考までに、、、




ーーーーーーーーーーーーーーーーーーーーー


一応探せたappleからの説明、、もう関係者のメアドとかもないので問い合わせもできず、、
<img width="554" alt="スクリーンショット 2016-07-07 10.44.40.png" src="https://qiita-image-store.s3.amazonaws.com/0/25832/0e4b1e6a-8761-a78f-044e-aecd4dfd9fa8.png">
JenkinsCLIでターミナルからジョブを実行


開発時とかよく叩くので、わざわざWebページ開くの面倒だった。
gitのpushをfookしても良いが任意のタイミングでやりたい。

ちなみにhttpリクエストだと"Nothing is submitted"とエラーになった。
gitlabと共存させているのが駄目なのかもしれない。

## ローカルの公開鍵を登録

Jenkinsの管理 > ユーザーの管理 > 自分のユーザー > 設定

SSH PublicKeysにローカルの公開鍵を入力

![スクリーンショット 2016-07-07 10.40.13.png](https://qiita-image-store.s3.amazonaws.com/0/33251/908a6d11-6984-c7af-8807-af82159a5c60.png "スクリーンショット 2016-07-07 10.40.13.png")

## ターミナル側の設定

Jenkinsの管理 > Jenkins CLI

jenkins-cli.jarをダウンロード

![スクリーンショット 2016-07-07 10.31.43.png](https://qiita-image-store.s3.amazonaws.com/0/33251/26eb36ce-563c-cae2-8b5d-417dec44369b.png "スクリーンショット 2016-07-07 10.31.43.png")

例えばこんな感じ。
JENKINS_URLがhttpsでオレオレ証明書だと"-noCertificateCheck"が必要です。

```bash
% cd ~/
% mkdir jenkins
% cd jenkins
% ls
jenkins-cli.jar
% java -jar jenkins-cli.jar -noCertificateCheck -s [JENKINS_URL] build [JOB]
```

私はこんな感じでalias置いてます。

```bash_profile
alias jenkins_cli='java -jar ~/jenkins/jenkins-cli.jar -noCertificateCheck -s [JENKINS_URL]'
```

```bash
% jenkins_cli build [JOB]
```


## JenkinsCLIで利用可能なコマンド

```
build	ジョブをビルドします。オプションで完了するまで待ちます。
cancel-quiet-down	"quite-down"コマンドの処理をキャンセルします。
clear-queue	ビルドキューをクリアします。
connect-node	ノードと再接続します。
console	ビルドのコンソール出力を取得します。
copy-job	ジョブをコピーします。
create-job	標準入力をConfig XMLとして読み込み、ジョブを新規に作成します。
create-node	標準入力をConfig XMLとして読み込み、ノードを新規に作成します。
create-view	Creates a new view by reading stdin as a XML configuration.
delete-builds	ビルドを削除します。
delete-job	ジョブを削除します。
delete-node	ノードを削除します。
delete-view	Deletes view.
disable-job	ジョブを無効化します。
disconnect-node	ノードとの接続を切断します。
enable-job	ジョブを有効化します。
get-job	ジョブ定義XMLを標準出力に出力します。
get-node	ノード定義XMLを標準出力に出力します。
get-view	Dumps the view definition XML to stdout.
groovy	指定したGroovyスクリプトを実行します。
groovysh	対話式のGroovyシェルを起動します。
help	利用可能なコマンドの一覧を表示します。
install-plugin	ファイル、URLおよびアップデートセンターからプラグインをインストールします。
install-tool	ツールの自動インストールを実行し、インストール先を表示します。
keep-build	ビルドを保存するようにマークします。
list-changes	指定したビルドの変更履歴を表示します。
list-jobs	指定したビューかItem Groupのすべてのジョブを一覧表示します。
list-plugins	インストール済みのプラグインを一覧表示します。
login	認証情報を保存して、認証情報なしにコマンドを実行できるようにします。
logout	loginコマンドで保存した認証情報を削除します。
mail	標準入力の内容をメールとして送信します。
offline-node	"online-node"コマンドが実行されるまで、ビルドを実行するノードの使用を一時的に停止します。
online-node	直前に実行した"online-node"コマンドを取り消し、ビルドを実行するノードの使用を再開します。
quiet-down	Jenkinsは再起動に向けて終了処理を実施中です。ビルドを開始しないでください。
reload-configuration	メモリにあるすべてのデータを破棄して、ファイルから再ロードします。設定ファイルを直接修正した場合に役に立ちます。
reload-job	Reloads this job from disk.
restart	Jenkinsを再起動します。
safe-restart	Jenkinsを安全に再起動します。
safe-shutdown	Jenkinsを終了モードに変更しビルドが完了後に、シャットダウンします。
session-id	Jenkinsの再起動ごとに変化するセッションIDを出力します。
set-build-description	ビルドの説明を設定します。
set-build-display-name	ビルドの名称を設定します。
set-build-parameter	現在実行中のビルドのビルドパラメータを設定、更新します。
set-build-result	現在のビルドの結果を設定します。ビルド中に呼び出された場合のみ動作します。
set-external-build-result	Set external monitor job result.
shutdown	Jenkinsサーバーを直ちにシャットダウンします。
update-job	標準入力からの情報でジョブ定義XMLを更新します。get-jobコマンドの正反対のことを行います。
update-node	標準入力からの情報でノード定義XMLを更新します。get-nodeコマンドの正反対のことを行います。
update-view	Updates the view definition XML from stdin. The opposite of the get-view command.
version	バージョンを表示します。
wait-node-offline	ノードがオフラインになるのを待ちます。
wait-node-online	ノードがオンラインになるのを待ちます。
who-am-i	認証情報を表示します。
```
【wordpress】サイト内検索でカスタム投稿を含める

ロジック忘れないように忘備録

functions.phpなどに

```
/**
 * 検索ロジックカスタマイズ
 *
 */
function customSearcher($search, $wp_query) {
	if ( $wp_query->is_main_query() && $wp_query->is_search() && !is_admin() ) {
		$q = $wp_query->query_vars;
		$n = null;
		if (!empty($q['s'])) {

			$keyword = mb_convert_kana($q['s'], 's');
			$keywords = preg_split('/[\s]+/', $keyword, -1, PREG_SPLIT_NO_EMPTY);

			foreach ($keywords as $word) {
				$n = " OR ( pm.meta_key IN ( 'search_data' ) AND pm.meta_value LIKE '%" . $word . "%') ";

				$search = str_replace( "post_content LIKE '%". $word .  "%')", "post_content LIKE '%". $word .  "%')" . $n , $search );
			}

		}

	}
	return $search;
}
add_filter('posts_search', 'customSearcher', 10, 2);
```
[C#]string.Formatで文字列に波括弧（中括弧）を入れる方法

string.Formatでは、波括弧{}は書式設定の先頭または末尾として処理される。

```
string.Format("{HOGEHOGE{0}}", "FOO");
```

例えば上記のような処理では、先頭と末尾の波括弧のせいでFormatExceptionになってしまう。
書式設定ではなく、通常の文字列として認識させたい場合は波括弧をさらに重ねてエスケープする。

```
string.Format("{{HOGEHOGE{0}}}", "FOO");
```
【mBaaS】 初期設定　～プロキシ接続をしてgitからcloneする～

mBaaS SDKを使っていろいろやってみようと思ったのですが、さっそく現れたのがプロキシ環境での問題でした。
ここでは、そのプロキシ環境の設定で苦労した部分についてまとめてみました。

# プロキシ接続をしている環境では設定が必要
自分の職場では必ずプロキシサーバーを経由して接続しないといけないため、
gitを使う場合にもプロキシの存在がいろいろと面倒になりました。

## git configコマンドの設定
プロキシサーバを経由してhttp接続する方法は複数あるのですが、初めにgit configで設定しておくと
その後は通常の処理でgitコマンドを使えるようになるので設定しておいた方がよいと思います。

__設定方法__
ターミナルから以下の設定を行います。

~~~ruby
$ git config --global http.proxy http://ユーザー名:パスワード@プロキシのサーバアドレス:ポート番号 
$ git config --global https.proxy http://ユーザー名:パスワード@プロキシのサーバアドレス:ポート番号 
~~~

（例）ユーザー名:tarou  パスワード:tarou123  プロキシのサーバアドレス:proxy.○○.○○  ポート番号:0000

~~~ruby
$ git config --global http.proxy http://tarou:tarou123@proxy.○○.○○:0000 
~~~


__設定の確認__

~~~ruby
$ git config --list
~~~
```
http.proxy=http://ユーザー名:パスワード@プロキシのサーバアドレス:ポート番号 
https.proxy=http://ユーザー名:パスワード@プロキシのサーバアドレス:ポート番号 
```

##gitからclone (mBaaSのリポジトリを指定)
git configの設定が完了すれば、実際にmBaaSのSDKをcloneしてみましょう～。

~~~ruby
$ git clone https://github.com/NIFTYCloud-mbaas/ncmb_ios
~~~
これでエラーにならなければ無事にmBaaS SDKを導入できます！

#githubから直接ダウンロード
mBaaS SDKはgithub上からもダウンロードできますので、こちらからもご利用ください。

https://github.com/NIFTYCloud-mbaas/ncmb_ios
gdrive help 日本語訳

[gdrive](https://github.com/prasmussen/gdrive) のヘルプドキュメントの日本語訳。

#gdrive list

```bash
gdrive [global] list [options]
```

ファイルの一覧を表示する。

#gdrive download

```bash
gdrive [global] download [options] <fileId>
```

ファイル / ディレクトリをダウンロードする。

#gdrive download query

```bash
gdrive [global] download query [options] <query>
```

query に合致するファイル / ディレクトリを全てダウンロードする。

#gdrive upload

```bash
gdrive [global] upload [options] <path>
```

ファイル / ディレクトリをアップロードする。

```bash
gdrive [global] upload - [options] <name>
```

標準入力からファイルをアップロードする。

#gdrive update

```bash
gdrive [global] update [options] <fileId> <path>
```

ファイルを更新する。ファイルの新しいリビジョンを作成する。

#gdrive info

```bash
gdrive [global] info [options] <fileId>
```

ファイルの情報を表示する。

#gdrive mkdir

```bash
gdrive [global] mkdir [options] <name>
```

ディレクトリを作成する。

#gdrive share

```bash
gdrive [global] share [options] <fileId>
```

ファイル / ディレクトリを共有する。

#gdrive share list

```bash
gdrive [global] share list <fileId>
```

ファイルのパーミッションを一覧表示する。

#gdrive share revoke

```bash
gdrive [global] share revoke <fileId> <permissionId>
```

パーミッションを削除する。

#gdrive delete

```bash
gdrive [global] delete [options] <fileId>
```

ファイル / ディレクトリを削除する。

#gdrive sync list

```bash
gdrive [global] sync list [options]
```

ドライブ上の同期可能なディレクトリを全て一覧表示する。

#gdrive sync content

```bash
gdrive [global] sync content [options] <fileId>
```

同期可能なディレクトリの内容を一覧表示する。

#[gdrive sync download](http://qiita.com/JhonnyBravo/items/25f588774e951b20642d)

```bash
gdrive [global] sync download [options] <fileId> <path>
```

ドライブディレクトリをローカルディレクトリへ同期する。

#[gdrive sync upload](http://qiita.com/JhonnyBravo/items/9f17a30dba1014674401)

```bash
gdrive [global] sync upload [options] <path> <fileId>
```

ローカルディレクトリをドライブへ同期する。

#gdrive changes

```bash
gdrive [global] changes [options]
```

ファイルの変更履歴を一覧表示する。

#gdrive revision list

```bash
gdrive [global] revision list [options] <fileId>
```

ファイルのリビジョンを一覧表示する。

#gdrive revision download

```bash
gdrive [global] revision download [options] <fileId> <revId>
```

指定した版のリビジョンをダウンロードする。

#gdrive revision delete

```bash
gdrive [global] revision delete <fileId> <revId>
```

ファイルのリビジョンを削除する。

#gdrive import

```bash
gdrive [global] import [options] <path>
```

ファイルをアップロードし、 google ドキュメントへ変換する。
使用可能な変換形式については [gdrive about import](#gdrive-about-import) を参照。

#gdrive export

```bash
gdrive [global] export [options] <fileId>
```

google ドキュメントをエクスポートする。

#gdrive about

```bash
gdrive [global] about [options]
```

Google Drive のメタデータ / 容量の使用率を表示する。

#gdrive about import

```bash
gdrive [global] about import
```

サポートしているインポート形式を表示する。

#gdrive about export

```bash
gdrive [global] about export
```

サポートしているエクスポート形式を表示する。

#gdrive version

```bash
gdrive version
```

アプリケーションのバージョンを表示する。

#gdrive help

```bash
gdrive help
```

ヘルプを表示する。

```bash
gdrive help <command>
```

コマンドのヘルプを表示する。

```bash
gdrive help <command> <subcommand>
```

サブコマンドのヘルプを表示する。
(2016年7月)GAE Datastore writeのコストが下がってるか試してみた

2016/7/1からCloud Datastore(GAEのDatastore)の課金体系が変わりました。

従来はオペレーション単位で課金されていて、例えば1エンティティ書き込んだとしてもsingle property indexやcustom indexの書き込みも同時に課金されていましたが、新体系ではエンティティ単位での課金になると言います。

これが本当ならばセコセコとプロパティにnoindexつけて課金を節約する、というバッドノウハウは不要になる！素晴らしい！[^1]
＼(^o^)／

[^1]: オペレーションに比べるとかなり安いですが、ストレージコストはインデックス分余計に発生するので、その点に関してはnoindexedは意味があります

詳細は下記URLを参照。

https://cloud.google.com/appengine/pricing

英語版のみ「New Cloud Datastore Pricing Starting July 1st, 2016」というところに書かれています。日本語版は未だ古い情報のみ。GCPはドキュメント翻訳がいつも遅いですよね・・・
(´･ω･`)

引用:
<img width="866" alt="スクリーンショット 2016-07-07 9.24.34.png" src="https://qiita-image-store.s3.amazonaws.com/0/31437/463b8d9c-f834-fbed-1989-c3e13be1b071.png">

従来writeオペレーションは$0.06/100,000opeでエンティティのputには最低2ope必要だった為、完全にnoindexedなエンティティの場合は従来の方が少しだけ安くなりますが、少しでもindexはると新体系の方が安くなりますね。indexの利便性を考えると今後はnoindexedにする理由は殆どなくなるかな。。

Deleteがかなり安くなったのも嬉しいですね。今までストレージコストに対してDeleteコストが高すぎて古いエンティティを残しておくか悩ましかったのですが、今後は積極的に削除してもよいかもしれないです。

あと、ドキュメントを読んで、一点気になることが・・・

インデックス書き込みが無料になる様ですがsingle property indexのみなのか、custom indexも対象になるのかはっきりとは書かれてませんでした。

# 試して見た

### モデル

```go
// indexなし
type NoIndex struct {
	Name   string    `datastore:",noindex"`
	Value  int       `datastore:",noindex"`
	Values []string  `datastore:",noindex"`
	Time   time.Time `datastore:",noindex"`
}

// single property indexのみ
type SinglePropIndex struct {
	Name   string
	Value  int
	Values []string
	Time   time.Time
}

// custom index
type CustomIndex struct {
	Name   string
	Value  int
	Values []string
	Time   time.Time
}
```

### インデックス定義

index.yaml

```yaml
indexes:

- kind: CustomIndex
  properties:
  - name: Value
  - name: Values
  - name: Name
  - name: Time

- kind: CustomIndex
  properties:
  - name: Value
  - name: Name
  - name: Time
```

それぞれ300,000件ずつPutしました。

### 結果

全てのモデルのPutが下記コストでした。

Datastore Entity Writes	

|  |  |
|:-:|:-:|
| Usage | 0.30 Million Ops |
| Billable | 0.28 |
| Price | $1.80 / Million Ops |
| Cost | $0.50 |

ちゃんと新体系のコストで課金されてました。
これは安い嬉しい！＼(^o^)／

しかもカスタムインデックスも無料みたい！？ 
インデックス貼り間違えてインデックス爆発起こしても無料ってことでしょうか。。
すごい！Google太っ腹！！＼(^o^)／

値下げ自体もとても嬉しいですが、初心者の人が「思ったよりも課金されちゃってる、なんで(´･ω･`)」という状況に陥る大きな罠が一つなくなったのが何よりですね(^_^)
AMIMOTO AMI の WordPress に同報されているプラグイン

AMIMOTO AMI の WordPress に同報されているプラグインがどんなものなのか紹介。
なお、記事執筆時点のものなので注意。
AMIMOTOの場合、AMIにWordPress及び追加プラグインが含まれているわけではなく、インスタンス起動時（あるいは `wp-setup` 実行時）に走るシェルスクリプトによってWordPressの最新版とシェルスクリプト内で指定したプラグインがインストールされるので、変更される可能性があります。

# パフォーマンス

## Nginx Cache Controller

https://wordpress.org/plugins/nginx-champuru/

Nginx リバースプロキシキャッシュの制御。AMIMOTOなら必ず有効化しておくこと。
逆に AMIMOTO なら他のキャッシュ系プラグインは不要

参照：https://support.amimoto-ami.com/%E6%97%A5%E6%9C%AC%E8%AA%9E/%E3%83%97%E3%83%AA%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%95%E3%82%8C%E3%81%A6%E3%81%84%E3%82%8B%E3%83%97%E3%83%A9%E3%82%B0%E3%82%A4%E3%83%B3%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6/nginx-cache-controller

## C3 Cloudfront Cache Controller

https://ja.wordpress.org/plugins/c3-cloudfront-clear-cache/

AWS CloudFront のキャッシュを消すプラグイン。
CloudFrontを使わない構成なら不要。

参照:https://support.amimoto-ami.com/%E6%97%A5%E6%9C%AC%E8%AA%9E/%E3%83%97%E3%83%AA%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%95%E3%82%8C%E3%81%A6%E3%81%84%E3%82%8B%E3%83%97%E3%83%A9%E3%82%B0%E3%82%A4%E3%83%B3%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6/c3-cloudfront-cache-controller

## Nephila clavata

https://wordpress.org/plugins/nephila-clavata/

WordPressのメディアをS3に移して運用できる。元データはEC2インスタンス内部にも残るので、プラグインをオフにしてもメディアが消えることはない。

参照:https://support.amimoto-ami.com/%E6%97%A5%E6%9C%AC%E8%AA%9E/%E3%83%97%E3%83%AA%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%95%E3%82%8C%E3%81%A6%E3%81%84%E3%82%8B%E3%83%97%E3%83%A9%E3%82%B0%E3%82%A4%E3%83%B3%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6/nephila-clavata

# 開発者向け

## Debug Bar 他

- Debug Bar  
https://wordpress.org/plugins/debug-bar/
- Debug-Bar-Extender  
https://wordpress.org/plugins/debug-bar-extender/
- Debug Bar Console  
https://wordpress.org/plugins/debug-bar-console/

パフォーマンスやエラー内容、ボトルネック探し、など。
公開中のサイトにより開発時に使う。

# セキュリティ

## Login LockDown

https://wordpress.org/plugins/login-lockdown/

ログイン試行制御。指定した回数ログインを失敗したIPアドレスを記録して、そのIPアドレスからは一定時間ログインを不能にする。

## Rublon Account Security: Two-Factor Auth+

https://wordpress.org/plugins/rublon/

多要素認証。
参照:https://plasticdreams.org/2015/12/04/are-you-tired-of-mfa/

# その他

##AMIMOTO Dashboard

https://wordpress.org/plugins/amimoto-dashboard/

Nginx Cache Controller / C3 CloudFront Cache Controller / Nephila clavataの管理を一括でできるプラグインです。

## Nginx Mobile Theme

https://wordpress.org/plugins/nginx-mobile-theme/

Nginx リバースプロキシ環境下でユーザーエージェントによってPC用・モバイル用のテーマ切り替え。
同様のプラグインは複数ありますが、AMIMOTOではこちらを使いましょう。

## Contact Form 7

https://wordpress.org/plugins/contact-form-7/

言わずと知れたお問い合わせフォームプラグイン。

## Flamingo

https://wordpress.org/plugins/flamingo/

Contact Form 7 で送信されたメッセージを DB に保存。ダッシュボードから確認。

参照:http://contactform7.com/ja/save-submitted-messages-with-flamingo/

## Simple GA Ranking

https://wordpress.org/plugins/simple-ga-ranking/

Google Analyticsのデータと同期してランキングを表示。
WordPressのDB内部にランキングデータを保存しないのでDBの負担にならない。

参照:http://simple-ga-ranking.org/ja/
Riot.js で短冊ジェネレータつくった

[![](https://i.gyazo.com/a26f0cb1952fcec9922765f2eda2cca4.png)](
https://secret-box.github.io/tanzaku/#C%2B%2B&%E3%83%9E%E3%82%B9%E3%82%BF%E3%83%BC%E3%81%AB&%E3%81%8A%E3%82%8C%E3%81%AF%E3%81%AA%E3%82%8B%EF%BC%81)

今日は七夕！ってことで Riot.js の練習も兼ねて簡単な[短冊ジェネレータ](https://secret-box.github.io/tanzaku/#)をつくってみました。
ソースコードは[ここら辺](https://github.com/secret-box/tanzaku)。
ちなみに元サイトは[ここ](http://tanzaku-maker.rhp.ninja-x.jp/2013.html)を参照しました。
  
Riot.js 自体そんなに難しくないのでたたき台は 2時間もかからないぐらいでサクッとつくる事が出来ましたね。
まあ結局 permalink とか複数の短冊表示を実装してたら結局5時間ぐらい作業していたんですが…。
強いて言えば HTML と CSS と JavaScript を .tag ファイルにまとめて書くのが Vim 的にちょっとつらい感じですね。
シンタックスとかどないせーっちゅうねん。
context_filetype.vim を使うにしても判定するのが難しいしなあ…。
まあ、そのあたりは追々考えてみます。
  
<del>絶対にバグがあると思うんで</del>不具合があったら教えてもらえると助かります。

## 元記事

http://secret-garden.hatenablog.com/entry/2016/07/07/000828
オブジェクトが衝突した時にParticleを発生させる方法

オブジェクトが衝突した時に、衝突されたオブジェクトにParticleを発生させる方法を紹介します。

#手順
１、GameObjectからParticle Systemを選択
２、Particle SystemをProjectへ移動
３、Particleを発生させたいオブジェクトのスクリプトを書く
４、Particle Systemをスクリプトに入れる

今回はSphereがCubeに衝突した時に、衝突されたCubeから、Particleが発生するようにします。
SphereとCubeを以下のように配置し、SphereにRigidbodyをつけ、Use Gravityにチェックを入れ、再生するとSphereがCubeに衝突するようにします。

![スクリーンショット 2016-07-05 10.12.33.png](https://qiita-image-store.s3.amazonaws.com/0/132425/c01f415f-878a-a586-d257-a632b92b6b9d.png)

#1,GameObjectからParticle Systemを選択
![スクリーンショット 2016-07-05 10.22.29.png](https://qiita-image-store.s3.amazonaws.com/0/132425/1973b62b-06d2-af82-87d7-105526797bb4.png)


ヒエラルキーにParticle Systemが追加されます。

#2,Particle SystemをProjectへ移動
![スクリーンショット 2016-07-05 10.23.48.png](https://qiita-image-store.s3.amazonaws.com/0/132425/989bdfba-5c6f-092e-b79c-54c949a05e65.png)

その後、ヒエラルキーにあるPaticle Systemは削除して大丈夫です。

#3,スクリプトを書く
Particleを発生させるCubeのスクリプトを書きます。

```php
using UnityEngine;
using System.Collections;

public class CubeScript : MonoBehaviour {
	public GameObject particle;//Particleを宣言

	// Use this for initialization
	void Start () {
	
	}
	
	// Update is called once per frame
	void Update () {
	
	}
	void OnCollisionEnter(Collision other){
//衝突したオブジェクトがSphereだったらParticleを発生させる
		if(other.gameObject.name == "Sphere"){
			Instantiate (particle, transform.position,transform.rotation);
		}
    }
}
```
このスクリプトをCubeに関連づける。

#4,Particle Systemをスクリプトに入れる
![スクリーンショット 2016-07-06 0.09.42.png](https://qiita-image-store.s3.amazonaws.com/0/132425/62b34524-aebc-1be2-d78a-3dd1b6348656.png)

CubeインスペクターのCubeスクリプトに、プロジェクトにあるParticleSystemを入れる。


再生すると・・・

![スクリーンショット 2016-07-06 0.11.22.png](https://qiita-image-store.s3.amazonaws.com/0/132425/43a0e9af-02b6-7e00-20f4-fb7b0081515e.png)

Sphereが落下し、Cubeに衝突した時にCubeからParticleが発生します。
Zybo > UART > Line-break generation

@ ug585-Zynq-7000-TRM.pdf 
p570

UART Controller
19.1.1 Features

> - Line-break generation and detection

https://ja.wikipedia.org/wiki/%E6%94%B9%E8%A1%8C%E3%82%B3%E3%83%BC%E3%83%89
> ラインフィード（英: line feed、LF、狭義の改行）またはニューライン（newline、line break または end-of-line、EOL）

のことだろうか？
RubyでCloud Pub/Subをローカルで触ってみる


[Cloud Pub/Sub](https://cloud.google.com/pubsub/)で遊ぶ。emulatorがあってローカルで遊ぶことができる。

ミドルウェアはあまり詳しくないがApache KafkaやAWSのKinesis Streamあたりに近いものだと認識している。
実際には、使い方的にもコスト的にもSQSのほうが似てる気がしているがKafkaもKinesisも使ったことないのでしらない。

Cloud Pub/Subはローカル環境で動作確認するためのエミュレータがある。
サーバを起動するには`gcloud beta emulators pubsub start`で実行できる。

クライアント側は環境変数`PUBSUB_EMULATOR_HOST`を設定しておけば、接続をエミュレータにながせる。`eval $(gcloud beta emulators pubsub env-init)`とすると簡単に設定できる。

pubsubは、topicへメッセージををpublishすると、topicをsubscribeしているsubcriberにメッセージを渡すことができる。
subscriberがメッセージを受け取るには二通り用意されていて、pull型とpush型がある。
pull型の場合は定期的にメッセージがないかサーバに取りに行くことになる。
さらに、取得したメッセージの処理したことをサーバに通知する必要がある。ackを送れば良い。ackを送らなければ一定時間経過すると再度イベントが取得できる。

push型の場合はpubsubに登録しておいたURL(endponit)にメッセージをPOSTしてくれる。
Web hookを叩いてくれる感じである。
POSTしたときのステータスコード次第で、ackの代わりになる模様。


# 試してみる

エミュレータを起動しておく。

`gem install gcloud`しておく。

適当にreplで作業していることを想定する。
replを起動する前に、

`eval $(gcloud beta emulators pubsub env-init)`で環境変数を設定する。

`irb -r gcloud`とか`pry -r gcloud`とかする。


作業しやすいように`PubSub::Service`のインスタンスを用意しておく。

```
gcloud = Gcloud.new "project-id"
pubsub = gcloud.pubsub
```

エミュレータであれば `"project-id"`は存在していないプロジェクトIDでも大丈夫だった。

## topicをつくる

`my-topic`という名前のtopicをつくってみる。

```
topic = pubsub.create_topic "my-topic"
```

## pull型でメッセージを受け取る

まずsubscriptionをつくる。subscribeすると作れる。
名前は`pull-subscriber-1`としておく。

```
subscription1 = topic.subscribe "pull-subscriber-1"
```

せっかくなのでふたつ作ってみる。

```
subscription2 = topic.subscribe "pull-subscriber-2"
```

メッセージが受け取れる状態になった。
メッセージをpullしてみる。

```
subscription1.pull.each do |message| 
    p message.message.data
    message.acknowledge!
end  # => []
```

メッセージを送ってみる。

```
topic.publish "hello"
```

再取得してみる。

```
subscription1.pull.each do |message| 
    p message.message.data
    message.acknowledge!
end  # => [ReciveMessage的なの]
```

`"hello"`と出力されるはずである。

subscription2でも受け取ってみる。

```
subscription2.pull.each do |message| 
    p message.message.data
end  # => [ReciveMessage的なの]
```

`"hello"`と出力される。ackを返していないので、しばらくおいて実行すると再出力される。subscription1のほうはもうメッセージは送られて来ない。

## push型でメッセージを受け取る

受け取るためのアプリケーションを用意する必要がある。
別のshellを起動して、以下のrubyコードを実行しておこう。

```app.rb
require "sinatra"
require "json"
require "base64"

post "/push" do
  message = JSON.parse request.body.read
  data = Base64.decode64 message["message"]["data"]
  logger.info data
  response.status = 204
end
```

```
$ ruby app.rb
```

sinatraはデフォルトポートは 4567 なのでPOSTしてもらうURLは`http://localhost:4567/push`となる。

準備ができたらREPLにもどってsubscriptionをつくる。

```
subscription1 = topic.subscribe "push-subscriber-1"
subscription1.endpoint = "http://localhost:4567/push"
```

endpointを指定するとpushになる。
(subscribeの引数に`endpoint: "http://localhost:4567/push"`としても動作しなかった。バグっぽい。)

あとはメッセージをpublishする。

```
topic.publish "hoge"
topic.publish "goro"
```

webアプリケーション側に`"hoge"`や`"goro"`が表示される。

ふたつ目のpush型のsubscriptionを用意すれば、2回メッセージがとんでくる。

```
subscription2 = topic.subscribe "push-subscriber-2"
subscription2.endpoint = "http://localhost:4567/push"
topic.publish "hoge"
topic.publish "goro"
```

`hoge`と`goro`が2度づつ出力される。


# まとめ

ローカルで試せるとTLSの設定が不要なので、push型の動きを確認しやすい。
実際に使う場合は、topicやsubscriptionはGCPのウェブコンソールからも作成できる。
Arduino > Link > pulseIn()

HC-SR04ではTrigで超音波を発して、その反射をEchoで取得する。
この仕組みをどうするのか考えていた。
Trig時にmills()のようなもので時刻を取得し、割込みでEchoのRising edgeをとらえてその時の時刻との差を出すのか、と思っていた。

pulseIn()という関数があるようだ。
http://www.musashinodenpa.com/arduino/ref/index.php?f=0&pos=2450

HC-SR04の使用チュートリアル
https://www.youtube.com/watch?v=ZejQOX69K5M&index=28&list=WL

http://qiita.com/exabugs/items/088f3f9229674be9e436
でもpulseIn()を使っている。

pulseIn()実施中はpollingのようになるのだろうか。
2m先の対象物の場合、2m/(340m/s)=5.8msecなので、loop()処理内の時間への影響としては小さいとみなせるのかもしれない。

### 誤解

(追記 2016/07/11)
pulseIn()の動作を誤解していた。

http://www.musashinodenpa.com/arduino/ref/index.php?f=0&pos=2450

> たとえば、パルスの種類(value)をHIGHに指定した場合、pulseIn関数は入力がHIGHに変わると同時に時間の計測を始め、またLOWに戻ったら、そこまでの時間(つまりパルスの長さ)をマイクロ秒単位で返します。

pulseIn()を実行した時、その時間からのHレベルになる時間が得られると思っていた。
そうではなく、上記の説明のように「HレベルになってからLレベルになるまでの時間」ということだった。

HC-SR04の測定もEchoが返った時にそのパルスの幅が距離に比例しているということだった。

### タイムアウト

http://www.musashinodenpa.com/arduino/ref/index.php?f=0&pos=2450

> pulseIn(pin, value, timeout)

タイムアウトも指定できるようだ。ESP8266で使う場合、watchdog resetがかからないようにタイムアウトを指定しておくのが良さそうだ。
距離計 > Link > Arduino Radar Demo (HC-SR04使用)

二次元レーダーのデモ。
https://www.youtube.com/watch?v=8NboJtVqWRw&list=WL&index=29

HC-SR04使用。

モータで回転しながら測定をしている。
再現性は良くない。

上記の３次元版を行って、距離計と傾斜計から2頭のライオンの概形を取得できるだろうか。
【Android】FCMのgoogle-service.jsonを置く時、ProductFlavorsでパッケージ名を変えてる場合


ProductFlavorsで本番とかステージング用とかでパッケージ名を書き換えた場合にエラーが発生します。

Firebase用のプロジェクトを作るときに、アプリのパッケージ名入れたので、パッケージ名が違うと使えません。

```groovy
    productFlavors {
        production {
            applicationId 'jp.co.hoge.hogee'
        }
        stage {
            applicationId 'jp.co.hoge.hoge.stage'
        }
    }
```

# 解決方法

以前は、Flavorごとのフォルダに置いたり試行錯誤していたらしいが、今はしっかり考慮されていました。

1. [Firebase Console](https://console.firebase.google.com/)で、プロジェクトの中の歯車マークの「設定」にアクセスします。
2. 「アプリを追加」というボタンがあるので、そこでFlavorの分だけアプリを追加。
3. 終わったらもう一度google-service.jsonをダウンロード。
4. appのフォルダに再配置

実はこれで、google-service.jsonの中には、追加した分だけ設定が追加されてるので、OKになります!


```json
{
  "project_info": {
      // ....
  },
  "client": [
    {
      "client_info": {
        //...
        "android_client_info": {
          "package_name": "jp.co.hoge.hoge"
        }
      },
      //...
    },
    {
      "client_info": {
        //...
        "android_client_info": {
          "package_name": "jp.co.hoge.hoge.stage"
        }
      },
      //...
    }
  ],
  "configuration_version": "1"
}
```

以上となります!
困ってる人の参考までに。
技術英語 > using a [kludge] such as for i = 1 to 9999?

@ Code Complete > Correspondance Between Loops and Arrays (No. 12917 / 36077)

> If the loop is an infinite loop or an event loop, is it constructed cleanly rather than using a <font color=red>kludge</font> such as for i = 1 to 9999?

kludgeの意味はというと「クラッジ」らしい。なるほど(よくわからない)。
http://ejje.weblio.jp/content/kludge

以下を見つけた。

http://blog.bulknews.net/mt/archives/002096.html
> kludge は「その場しのぎの解決策」というそのものズバリな名詞で、kuldgey とy をつければ形容詞になります。

https://en.wikipedia.org/wiki/Kludge
> a workaround or quick-and-dirty solution that is clumsy, inelegant, inefficient, difficult to extend and hard to maintain.
Unityで複数のGameObjectからランダムに一つ選んで生成する方法

#はじめに
Unityで複数のGameObjectからランダムに一つ選んで生成する方法についてまとめました。

#目次
1.スクリプト上で配列宣言
2.スクリプトをGameObjectに関連付け
3.Sizeを決める
4.オブジェクトをPrefab化
5.Prefabを登録
6.ランダムに生成する

#1.スクリプト上で配列宣言
下のようにスクリプト上でGameObjectの配列を宣言する。

```
using UnityEngine;
using System.Collections;
public class TrainScript : MonoBehaviour
{
public GameObject[] Train;
}
```

#2.スクリプトをGameObjectに関連付け
空のGameObjectにスクリプトをドラッグ&ドロップで関連付けをする。

#3.Sizeを決める
GameObjectのInspector上の追加したスクリプトの欄にSizeという項目が出る。ここにランダムに呼び出したいオブジェクトの数を入力しenterを押す。

#4.オブジェクトをPrefab化
呼び出したいオブジェクトをHierarchyからProjectにドラッグ＆ドロップでPrefab化する。Hierarchy上のオブジェクトは消す。

#5.Prefabを登録
3のSizeの下にElementの項目が出ているので、ドラッグ＆ドロップで好きなPrefabを登録。下のようになればOK。
![スクリーンショット 2016-07-07 5.32.57.png](https://qiita-image-store.s3.amazonaws.com/0/132725/e433f9ff-2a8b-c3d1-00e6-167c2feba0a8.png)


#6.ランダムに生成する
下のようにスクリプトに追加するとスタートしたとき指定したオブジェクトの配列からランダムに一つ選んで生成される。

```
using UnityEngine;
using System.Collections;
public class TrainScript : MonoBehaviour
{
public GameObject[] Train;

void Start ()
	{
number = Random.Range (0, Train.Length);
Instantiate(Train[number],transform.position,transform.rotation);
    }
}
```

#参考
[UnityのGameObject配列へInspector経由でGameObjectを登録する](http://prpr.hatenablog.jp/entry/2015/04/04/Unity%E3%81%AEGameObject%E9%85%8D%E5%88%97%E3%81%B8Inspector%E7%B5%8C%E7%94%B1%E3%81%A7GameObject%E3%82%92%E7%99%BB%E9%8C%B2%E3%81%99%E3%82%8B)
raspberry piにpuredata vanilla0.47をセットアップ

raspberry pi A+にpuredata vanilla0.47をセットアップしました

0.47はまだtestingなので、/etc/apt/sources.listに以下の一文追加。

deb http://mirrordirector.raspbian.org/raspbian/ testing main contrib non-free rpi

そのあと

sudo apt-get update

sudo apt-get install puredata/testing

で、puredata0.47入ります。なぜだか依存関係のない他のパッケージもたくさん入ります。（どうすればいいのか・・、、まぁいいか）

シリアルでコントロールしたかったので、さっそくcomportを入れようと
Helpメニュー – Find externals を選択するして
検索ボックスに、comportと入力して、[search]ボタンをクリックするとヒットしますが
なんとraspberryPi用の物がないみたい。。（arhmfに対応したのがない。。）

試しにlinux用の選択して入れてみたけど、動きません・・・
（~/comportはできていました）

自前ビルドしたらできるかなぁと、、思って下記のことを実行。

ここから↓ソースをダウンロード
https://sourceforge.net/projects/pure-data/files/libraries/comport/comport-0.2.tar.gz/download

tar -zxf comport-0.2.tar.gz で展開

cd comport-0.2 して中を見てみるとmakefileあるのでためしに

makeして出来上がったcomport.pd_linuxを~/comportへ移動（上書き）

puredataを起動してcomportオブジェクト作ると。。出来た！！

usbのシリアルケーブル(/dev/ttyUSB0)にアクセスしているみたいなので
ちゃんと動いているようだ
Callgrind + Kcachegrindで関数呼び出しのトレースをする 

まずはインストール
>sudo apt-get install valgrind kcachegrind

次にトレースデータを収集する.
トレースする対象は任意のバイナリでOK.
デバッグシンボルがついていれば詳細な情報が集められるけど, 無くてもよい.
>valgrind --tool=callgrind hoge.out

トレースが完了すると, callgrind.out.xxxx(xxxxは割り振られた適当な番号)というトレースデータのファイルができるのでそれをkcachegrindに食わせる.
>kcachegrind callgrind.out.xxxx

すると関数呼び出しの統計データやコールグラフなどがビジュアルに表示される。

これは良いですね。

ちなみに、valgrind(とkcachegrind)を使うことでキャッシュミスやメモリリークの解析などもできるできるらしい.
http://kzk9.net/column/valgrind.html
Texでsectionとかsubsectionの前の余白を減らす

>% 余白の小さなsectionとsubsectionを定義
\newcommand{\mysection}[1]{\vspace{-20pt}\section{#1}}
\newcommand{\mysubsection}[1]{\vspace{-8pt}\subsection{#1}}


ってなのを定義してsectionとかsubsectionの代わりに使う.

\@startsectionとやらで設定するともっとスマートにできるみたいだが
[DEPRECATED] Vue.js の情報まとめ

既に古くなっており、今後継続的に更新される見込みはありません

---

一旦軽くまとめたものを書いてみました。暇を見つけて更新する予定ではありますが、Contribution も大歓迎です。編集リクエストをいただくか、コメントまたは [twitter](https://twitter.com/zakuro9715) でご連絡いただければ修正します！


# 必読

- [jp.vuejs.org](http://jp.vuejs.org) 日本語版公式サイト。ほぼリアルタイムで英語のサイトに追従して翻訳されています。
- [vuejs-jp slack](https://vuejs-jp-slackin.herokuapp.com) 日本語での議論・質問が活発に行われています。
- [awesome-vue](https://github.com/vuejs/awesome-vue) 公式による情報のまとめ

# ライブラリ・ツールなど

- https://github.com/vuejs/vue-cli テンプレートを元にプロジェクトの雛形を作成できます。推奨されるテンプレートが公式から提供されているので、これを使用するのが良いでしょう。
- https://github.com/vuejs/vuex　 Vuejs で Flux like なアーキテクチャを提供します。
- https://github.com/vuejs/vue-touch
- https://github.com/vuejs/vue-validator
- https://github.com/vuejs/vue-resource
- https://github.com/vuejs/vue-devtool
- https://github.com/vuejs/vue-rx
- https://github.com/vuejs/vue-router
- https://github.com/vuejs/vue-loader
- https://github.com/vuejs/vueify

# その他

[Vue.js資料まとめ（古いので注意）](https://gist.github.com/hashrock/f575928d0e109ace9ad0)
【Unreal Engine】エディター上で影が消える / 影の「Preview」を非表示にする

ホウボウで調べれば出るのだけど、つい自分が忘れてしまうのでメモ。
（ver 4.11.2 / Windows7）

## ライトを操作すると、ビュー上で影が消える
ツールバーの「設定/（スケーラビリティ）エンジンの拡張機能設定/（品質）シャドウ」これを「Epic」にしたら無事表示。

嫌がらせでもイジメでも無く、表示品質の問題だった模様(^_^;)

![shadowQuality.jpg](https://qiita-image-store.s3.amazonaws.com/0/87387/22b989d1-5d34-fac1-f484-340aefcfd1f2.jpeg)


## 影の「Preview」を消す
ビュー上の「表示/可視化/Preview Shadows Indicator」をオフに。

![previewShadow.jpg](https://qiita-image-store.s3.amazonaws.com/0/87387/316ba553-3c89-0f4e-3441-c62b9ddbe835.jpeg)


こういったケース。どっかに解決の方法はありそうなんだけど、
まだ馴染んでないので、諸々スイッチが散り散りに点在しているように感じますねー
【Unity】shaderの行列計算でエラー

ちょっとの違いで大違い。
紫のエラーマテリアルでイヤ～ンな気持ちになったのでメモ。

## 行列 * ベクトル
ver 5.4.0b21にて確認。
シェーダ内にて、行列との掛け合わせで別のベクトルを作ろうと下記の計算。
windowsでやっていた分には普通に表示。

```
float3 nrmView = mul(UNITY_MATRIX_V, normalWorld.xyz);
float3 eyeView = mul(UNITY_MATRIX_V, eyeVec.xyz);
```

ところが、同じものをOSXで表示しようとした際「metalでは駄目！」みたいなエラーが出て、
もれなく該当シェーダ部分が紫に…
どうやら。metal環境ではマトリクスに掛けるのはfloat4でないと駄目らしい。
コンパイル通った（無理やり通した）のは以下。

```
float3 nrmView = mul(UNITY_MATRIX_V, float4(normalWorld.xyz, 0)).xyz;
float3 eyeView = mul(UNITY_MATRIX_V, float4(eyeVec.xyz, 0)).xyz;
```
ベクトルのw成分を0にして行列の移動成分とゼロ乗算して移動無し。回転だけ頂く。
一手間面倒だけど、シェーダを共用したい際にはこう書いておいた方が良さそう。なのかな？
深く調べていないけど、こんなエラーも有りましたって事で。
iOS9以降、iOS実機でsysctlでプロセス一覧が取れない

表題の通りですが、iOS9以降のiOS実機で`sysctl(3)`経由でプロセス一覧を取得しようとすると「Operation not permitted」でエラーになります。これはiOSサンドボックスによる制約です。

# 参考URL

- [Security and Privacy Changes in iOS 9 | In Security](https://nabla-c0d3.github.io/blog/2015/06/16/ios9-security-privacy/)
- [sysctl (CTL_KERN/KERN_PROC/KERN_PROC_ALL) is not working in iOS 9.0 b3
| Apple Developer Forums](https://forums.developer.apple.com/thread/9440)
if let whereを忘れるのでメモ

#### 2019/09/25 追記
コメントにて、Swift4では `if let where` は使えなくなったとの情報を頂いたので
記事作成時の環境＆バージョンを追記しておきます。

```
【確認環境】
Xcode 7.3.1
Swift 2.2
```

#### 追記ココマデ

どうもコード書いてる途中で、モニョモニョってなる構文を見て確か少し綺麗にかける方法があるはず。
ってググっちゃうので戒めのアウトプット。


## このif文が2回続くやつは

```
// audioPlayerがnilじゃないなら
if let player = audioPlayer {

	// 再生中なら
	if (player.playing) {
		player.stop()	// 停止
	}
}
```

## これでいける

```
// audioPlayerがnilでなければ、
// where以降でbindingしたplayerを利用できる。
if let player = audioPlayer where player.playing {

	player.stop()	// 停止
}
```
SendGridのWeb APIをコマンドラインから呼び出す

# はじめに
SendGridの設定変更や確認をコマンドラインから行うツールが欲しかったので作りました。SendGridの公式ライブラリが[Web API v3](https://sendgrid.com/docs/API_Reference/Web_API_v3/index.html)に対応する方向で刷新されました。このうち、[sendgrid-ruby](https://github.com/sendgrid/sendgrid-ruby)をラップして、[Thor](http://whatisthor.com/)でコマンドラインツール化しました。sendgrid-rubyは[Fluent Interfaceな実装](https://sendgrid.com/blog/using-ruby-to-implement-a-fluent-interface-to-any-restful-api/)となっており、Web APIのエンドポイントが追加されたり変更されたりしても、柔軟に対応できる作りになっています。今回のツールもその柔軟性を継承しています。curlで直接呼び出すより扱いやすくなっているのではないかと思います。

# 前提条件
Ruby 2.2 以降

# インストール
`sg`というgemをインストールします。

```text
$ gem install sg
```

# 使い方
`sg` gemをインストールすると`sg`コマンドが使えるようになります。
`sg`には`client`というコマンドが一つだけ用意してあり、全ての呼び出しはこのコマンドを利用していきます。

### ヘルプの表示
まずは、clientコマンドのヘルプを表示してみます。ツールの使い方はここで確認できます。

```text
$ sg help client
```

### オプション
clientコマンドにはいくつかのオプションがあります。

|オプション|エイリアス|詳細|
|---------|---------|------------------------------|
|--apikey |-k       |SendGridのAPIキーを指定します。このオプションを省略すると`SENDGRID_API_KEY`という環境変数からAPIキーをロードして動作します。APIキーを画面上に表示したくない場合などに利用できますが、基本的にこのオプションは省略して環境変数を利用することをお勧めします。|
|--user   |-u       |SendGridのユーザ名です。APIキーを使用しない場合に指定します。セキュリティ上の理由から通常はAPIキーの使用を推奨します。|
|--pass   |-p       |SendGridのパスワードです。APIキーを使用しない場合に指定します。セキュリティ上の理由から通常はAPIキーの使用を推奨します。|
|--request-body|-b       |APIリクエストのボディ部を指定します。具体的な内容についてはSendGridの[APIリファレンス](https://sendgrid.com/docs/API_Reference/Web_API_v3/index.html)を参照してください。|
|--query-params|-q       |APIリクエストのクエリストリング部をJSON形式で指定します。具体的な内容についてはSendGridの[APIリファレンス](https://sendgrid.com/docs/API_Reference/Web_API_v3/index.html)を参照してください。|
|--response-header|-h       |レスポンスヘッダを出力します。|
|--response-status|-s|レスポンスのHTTPステータスコードを出力します。|
|--version|-v|sgのバージョンを表示します。|

### 引数
clientコマンドの後にはエンドポイントのURLのうち、"v3"よりあとの部分をスペースで区切って、最後にメソッド（HTTP動詞）を指定します。例えば、次のようなエンドポイントを呼び出す場合、

```http
GET https://api.sendgrid.com/v3/api_keys HTTP/1.1
```

次のように実行します。

```text
$ sg client api_keys get
```

### その他の具体例
#### 例1
エンドポイントのURLに動的な変数を指定する場合も同様にスペースで区切って呼び出します。

```http
GET https://api.sendgrid.com/v3/api_keys/YOUR_API_KEY_ID HTTP/1.1
```

```text
$ sg client api_keys YOUR_API_KEY_ID get
```

#### 例2
クエリストリングを指定する場合は、--query-params(または-q）オプションにJSON形式で値を指定します。

```http
GET https://api.sendgrid.com/v3/suppression/unsubscribes?start_time=1367794504&end_time=1467794504 HTTP/1.1
```

```text
$ sg client suppression unsubscribes get -q='{"start_time":1367794504,"end_time":1467794504}'
```

#### 例3
ボディ部を指定する場合は、--request-body(または-b)オプションで指定します。

```http
POST https://api.sendgrid.com/v3/api_keys HTTP/1.1
{
  "name": "My API Key",
  "scopes": [
    "mail.send"
  ]
}
```

```text
$ sg client api_keys post -b='{"name": "My API Key", "scopes": ["mail.send"]}'
```

### 例4
その気になればメール送信もできます。ガチで使おうと思うとボディ部の組み立ては結構大変になりますが。

```
$ sg client mail send post -b='{"personalizations":[{"to":[{"email":"to@example.com"}],"subject":"Hello, World!"}],"from":{"email":"from@example.com"},"content":[{"type":"text","value":"Hello, World!"}]}'
```

# さいごに
ソースコードは[こちら](https://github.com/awwa/sg)。ヘルプなどがまだ小慣れていないのでPRとかIssueとかいろいろいただけると嬉しいです。
OpenSSLによるSSL証明書の発行の準備


# 概要

SSLの証明書を作るためには、安全に秘密鍵を生成し、その秘密鍵から作ったCSRを認証局に送って署名してもらわなければなりません。

opensslコマンドを使った秘密鍵とCSRの作り方をまとめました。


# 秘密鍵の生成

SSLの通信において、クライアントに送信するデータの暗号化、クライアントから受信したデータの復号に使用する暗号鍵です。

公開鍵を中に含むサーバ証明書とセットで使用します。


## 鍵長のみ指定、秘密鍵は暗号化しない

```
$ openssl genrsa -out privatekey.pem 2048
```

## 秘密鍵の暗号化方式に 3DES （トリプルDES）を使用

```
$ openssl genrsa -des3 -out privatekey.pem 2048
Enter pass phrase: secret ←秘密鍵の暗号化に使うパスフレーズ
Verifying - Enter pass phrase: secret
```

## 乱数生成器に /dev/random を、秘密鍵の暗号化方式に AES-256 を使用

```
$ openssl genrsa -aes256 -rand /dev/random -out privatekey.pem 2048
Enter pass phrase: secret ←秘密鍵の暗号化に使うパスフレーズ
Verifying - Enter pass phrase: secret
```


# 秘密鍵からパスフレーズを削除

```
$ openssl rsa -in privatekey.pem -out privatekey.pem
Enter pass phrase for privatekey.pem: secret ←設定したパスフレーズ
writing RSA key
```


# CSRの生成

ディスティングイッシュネームを指定して、CSR（Certificate Signing Request = 証明書署名要求）を生成します。

このCSRを認証機関に送って署名してもらったものが証明書になります。

特に重要なのはCN（コモンネーム）。WebサーバのSSL証明書として使う場合はこれがホスト名になるので、ここを間違えるとhttpsで正常にアクセスできません。

更新時に秘密鍵やCSRを作り直す場合は、ディスティングイッシュネームを設定ファイルとして保存しておくと、手順を忘れた頃にやってくる次回の更新作業を安心して行うことができます。

証明書を設置する際には認証局のルート証明書や中間証明書をあわせて設定する必要がある場合があります。


## 対話方式

```
$ openssl req -new -key privatekey.pem -out certreq.csr

You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]: JP
State or Province Name (full name) [Some-State]: Ishikawa
Locality Name (eg, city) []: Kanazawa
Organization Name (eg, company) [Internet Widgits Pty Ltd]: DreamGarage Inc.
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []: www.dreamgarage.co.jp
Email Address []:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
```

## オプションでディスティングイッシュネームを指定

```
$ openssl req -new -subj '/C=JP/ST=Ishikawa/L=Kanazawa/O=DreamGarage Inc./CN=www.dreamgarage.co.jp' -key privatekey.pem -out certreq.csr
```

## 設定ファイルでディスティングイッシュネームを指定

```
$ openssl req -new -config certreq.conf -key privatekey.pem -out certreq.csr
```

``` certreq.conf
[ req ]
distinguished_name     = req_distinguished_name
prompt                 = no

[ req_distinguished_name ]
C                      = JP
ST                     = Ishikawa
L                      = Kanazawa
O                      = DreamGarage Inc.
CN                     = www.dreamgarage.co.jp
```


# CSRの内容を確認

CSRの生成で指定したディスティングイッシュネームを確認する方法です。

## CSRの内容をすべて表示

```
$ openssl req -in certreq.csr -text
```


## ディスティングイッシュネームを含む Subject を表示

```
$ openssl req -in certreq.csr -subject
```
ターミナルソフトウェア RLogin のよく使う機能


概要：RLogin のよく使う機能をメモしておきます。

# RLogin とは

> RLoginは、Windows上で動作するターミナルソフトです。
> -- [公式サイト](http://nanno.dip.jp/softlib/man/rlogin/)より

要するに TeraTerm です。PuTTY とか Poderosa も同じカテゴリのソフトウェアですね。
RLogin は TeraTerm で同じ事をやるよりも簡単にできたりします。
~~みんな TeraTerm ばっかり使ってるので、ちょっとカッコつけて別のソフトウェアを使いたいって場合にもお勧めです。~~

ダウンロードは[公式サイト](http://nanno.dip.jp/softlib/man/rlogin/)からどうぞ。マニュアルも同ページに記載があります。

# RLogin のよく使う機能

## 接続情報を保存する

TeraTerm だと TeraTerm Menu とか TTL マクロとかを使いますが、RLoginは単独で実現できます。

設定は見れば分かります。

## 接続設定をタブで区切る

こんな感じでタブ分けできます。

![2016-07-06 (3).png](https://qiita-image-store.s3.amazonaws.com/0/58889/1c6924bd-215f-cda3-7c72-ccb0410add55.png)

タブの設定は右上の枠に入力すれば良いです。

![2016-07-06 (2).png](https://qiita-image-store.s3.amazonaws.com/0/58889/264eb3ce-c62a-1f42-135c-cf1f4d199183.png)

## 画面を分割する

接続している画面を分割して並べたい場合は「Ctrl+Shift+:arrow_up:」を押します。
複数回押すと、分割方法が変わります。
分割をやめたい場合は「Ctrl+Shift+:arrow_left:」を押します。

![2016-07-06 (5).png](https://qiita-image-store.s3.amazonaws.com/0/58889/109c651e-34de-e83b-5b7a-d46dad5728c4.png)

## 複数の接続画面にキー操作を同時送信する

ブロードキャスト（同時送信）をオンにすると、開いている接続にキー操作を同じ送信します。

![2016-07-06 (6).png](https://qiita-image-store.s3.amazonaws.com/0/58889/e97b5385-09aa-2c4d-876b-6004352ae54c.png)

ちなみに TeraTerm でも Tera Term Pro アシスタントを使えば同じ事を実現できます。

## ファイルを SFTP で転送する

SFTP でのファイル転送もできます。ただし SFTP 使用中に SFTP 接続中のターミナルで操作をすると、転送が失敗したり不安定になったりしますので注意して下さい。
大きなファイルや大量のファイルを SFTP でちゃんと転送したい場合は WinSCP を使った方が良いです。

![2016-07-06 (7).png](https://qiita-image-store.s3.amazonaws.com/0/58889/abf4b941-d698-3f35-b875-606ffdc5d08e.png)

## BOX型選択

Ctrl+ドラッグでテキストのBOX型選択ができます。それをコピーしてテキストエディタに貼り付けることもできます。

![2016-07-06 (8).png](https://qiita-image-store.s3.amazonaws.com/0/58889/74a972ab-fa7e-3286-431a-c151ca5c14d9.png)

## コンソールの色を変える

デフォルトで Solarized（ソーライズ）が用意されているのが良いと思います。

![2016-07-06 (10).png](https://qiita-image-store.s3.amazonaws.com/0/58889/0cbcf18e-b03d-dc76-3843-2ae3e3d3edc2.png)

## 通信ログを取る

- 設定のポイント
    - ログの保存先は絶対パスでも相対パスでも指定できます。
    - `%E` などの表現は[送信文字列の特殊文字](http://nanno.dip.jp/softlib/man/rlogin/#FILENAMEEXT)に詳細が記載してあります。
    - 「ファイルに保存する通信ログ形式を選択」はLINEが良いように見えます。RAWだと特殊キーも見えるようになってしまうので、ログとして人間が読めなくなってしまう場合があります。

![2016-07-06 (1).png](https://qiita-image-store.s3.amazonaws.com/0/58889/80277f33-3263-cadb-9d82-80ce611f335a.png)

TeraTerm では別ウィンドウが立ち上がって鬱陶しい場合がありますが、RLoginはそんなことはありません。

## 設定を ini に書き込む

> レジストリは、”HKEY_CURRENT_USER\Software\Culti\RLogin”を使用します。
> アンイストールする場合は、このレジストリを削除してください。
>
> 作業フォルダもしくは、実行プログラムと同じフォルダに「RLogin.ini」を作成しておくと
> レジストリに保存せずにプライベートプロファイルを使用します。
> -- [公式サイト](http://nanno.dip.jp/softlib/man/rlogin/)より

ということです。
もし既にレジストリに設定を作ってしまってそれを `RLogin.ini` に移したい場合は、「ヘルプ」→「プライベートプロファイルを作成」で `RLogin.ini` を作成できます。
※条件によっては保存したパスワードなどは移行できない場合があります。また、レジストリに戻すことはできません。

## フォントを変更する

ちょっと複雑なので[こちら](http://auewe.hatenablog.com/entry/2014/05/31/032920)を参照してください。

# まだ使ったことのない高度な機能

## スクリプト

キーコマンドを拡張したり、指定の文字に色を付けたり、色々できるようです。

運用で本格的に RLogin を使い、かつ繰り返しやったりする事が多ければ使う機会があるかもしれません。
Emacsで""や()で囲まれたところを一瞬で消してくれるやつを書きました（vimでいうci"とかci(とかciw)

皆さんこんにちは．

僕は普段，emacsを使っていて一つだけ不満に思うことがありました．
それは，""や()，{}で囲まれた部分を一瞬で消せないところです．
ただし，vimではそれが可能です．
この消したい対象の内側のどこにいても消せるというのはすごく便利です．

これに相当するものを探してみたのですが，emacsではzap-to-charとかいう微妙なやつしか見つかりませんでした．
こいつはデフォルトでM-zで呼び出せるのですが，今いるカーソルのところから消されてしまいます．

例えば，`"hello, world!"`とか書いてあったとして，カーソルが`,`の位置にあったとします．
vimだと`ci"`とすれば，`""`となります．**すごい！**
一方のemacs，zap-to-charくん，`"hello,'となってしまいます．**残念！**
あと，vimだと入れ子構造の括弧もいい感じに消してくれます．
これも再現したので後ほどgifでご覧ください．

vimのプラグインを入れてもよいのですが，それではemacsキーバインドまで食い尽くされてしまいます．
またインストールするのも巨大なパッケージになってたりして，扱いにくいんですよね．
それにともなって管理も面倒です．
というわけで書きました．


# ciel.el

名付けて`ciel.el`です．
（ciだけではなくなったので少し名前を変えました）
というわけでご紹介．
言葉で説明するよりgifで見たほうが早いです．

![circleanimationmuvie](https://raw.githubusercontent.com/cs14095/cs14095.github.io/master/ci-el.gif)

こんな感じで"とか入れ子の括弧も綺麗に消せます．
後ろのかっこのほうにいても消せます．（gifの10行目あたりにいればmain()が消える）
あと，かっこのハイライトに合わせて，Emacs用に少し調整してます．

# インストール

まずは，githubからcloneしてきます．
お好みのディレクトリに入れるために適当にcdしてください．
僕は`.emacs.d`の中にelispというディレクトリを作っているのでそこに入れます．

```
cd ~/.emacs.d/elisp/
git clone https://github.com/cs14095/ciel.el
```

次にelファイルを編集しましょう．
init.elや.emacs.elに先ほどcloneしてきたディレクトリにパスを追加します．
最後にrequireしてキーバインドを設定すれば完成！

```
(setq load-path (cons "~/.emacs.d/elisp/ciel.el" load-path))
(require 'ciel)
(global-set-key "\C-ci" 'ciel-ci)
(global-set-key "\C-co" 'ciel-co)
```
melpaに登録されました！
`package-list-packages`から選んでインストールするか、`package-install-ciel`でできるはずです！
インストールしたら.elファイルに下記を追加したら使えます。

```
(global-set-key "\C-ci" 'ciel-ci)
(global-set-key "\C-co" 'ciel-co)
```


# 使い方

基本的にvimと同じです．
まだ作っていないものや，諸事情で対応していないものは順次対応予定です．
削除したものは全てkillリングに入るのでペースト可能です．

```
Ctrl-c, i, w => 単語を削除 
Ctrl-c, i, ' => ''で囲まれた内側を削除
Ctrl-c, i, " => ""で囲まれた内側を削除
Ctrl-c, i, ` => ``で囲まれた内側を削除
Ctrl-c, i, [()] => ()で囲まれた内側を削除
Ctrl-c, i, [{}] => {}で囲まれた内側を削除  
Ctrl-c, i, [<>] => <>で囲まれた内側を削除
Ctrl-c, i, [[]] => []で囲まれた内側を削除
```
かっこの入力は開き，閉じかっこどちらでもＯＫ．
Ctrl-c, oにすれば削除の代わりにコピーもできます．

# なんかちゃんと探せばありそう

なんか探せばもっとマシなものがありそうだけど，lispの良い練習になりました！
こっちのほうがよくね？とかバグってるとかあればコメントでお願いいたしますm(_ _)m

# （追記）それっぽいのはあった
[change-inner.el](https://github.com/magnars/change-inner.el)というものがありました．
ただ，こちらは[expand-region.el](https://github.com/magnars/expand-region.el)というパッケージを使用した上でコーディングしており，特定モードではうまく動かないという点があるようです．私の環境ではうまく動きませんでした．
`ciel.el`はモードに左右されることはありませんし，vimとほぼ同様に動きます．


# 謝辞

@yuutayamada@github さんからのご指摘を受け，"で囲まれた(を無視するようにいたしました．
ご教授いただき，ありがとうございました．