OmniAICreator/Qiita-1.07M huggingface dataset:
ESXi上にRouterVMを作る方法

# ESXi上にRouterVMを作る方法

- 192.168.56.0/24ネットワークのデフォルトゲートウェイ(192.168.56.1/24)となるルータVM(Centos6.6)を作成する方法です。

|**設定項目**|**設定値**|
|---|---|
| WAN側ネットワーク | 192.168.0.0/16 |
| LAN側ネットワーク | 192.168.56.0/24 |
| WAN側IPアドレス | 192.168.0.56/16 |
| LAN側IPアドレス | 192.168.56.1/24 |

##1. Centos6.6のVMを用意します。

##2. VMにネットワークインタフェースを2つ追加します。

###2.1 vSwitchを2つ作成します。
- ESXiの制限により、vmnicとvSwitchの関係は1対1
- vSwitchの中に、ポートグループと呼ばれる、VLANグループみたいなものを作る
- 今回はvmnic0に、アップリンク(192.168.0.1/16ゲートウェイが接続されているI/F)を接続、vmnic1にダウンリンク(192.168.56.0/24ホスト群が接続されているI/F)を接続しています。

- vSwitch1に、LAN16という名前のポートグループを作成します。
- vSwitch2に、LAN24という名前のポートグループを作成します。

###2.2 VMにインタフェースを2つ追加します。

- 既存のNICを削除します。

- 追加->イーサネットカードと進み、ポートグループをLAN16にします。(vm上ではeth0と見える)
- 追加->イーサネットカードと進み、ポートグループをLAN24にします。(こちらはvm上ではeth1と見える。(eth0とeth1が逆になっている可能性もあるので、VM起動後、MACアドレスを確認すること。))


##3 VMを起動し、フォワーディングとルーティングテーブルを設定します。

###3.1 eth0とeth1に、正しくインタフェースが接続されていることを確認します。

- 具体的にはeth0側に、LAN16、eth1側にLAN24のインタフェースが接続されているかどうかを確認(eth0とeth1が逆になっていないかどうか)
- もし違っていたら、70-persistent-net.rulesの値を書き換えます。

~~~sh
cat /etc/udev/rules.d/70-persistent-net.rules
~~~


###3.2 ifcfg-eth0とifcfg-eth1を編集します。

###3.3 /etc/sysctl.confを編集します。

~~~sh
# Enable proxy ARP
net.ipv4.conf.eth0.proxy_arp = 1

~~~
サンプルをiPhoneへインストールするときに出たエラー解決


　Xcode7から、無料でXcodeプロジェクトをiPhoneにインストールできるようになりました。opneFrameworksのサンプルのビルドを行うときにちょっと詰まったのでメモ。
## 実行環境

* Xcode7.2
* iPhone6(iOS9.2)
* openFrameworks(v090)  
(※あらかじめApple ID登録済み。)





## エラーと解決方法
　サンプルを全部実機にインストールしてみましたが、3つのプロジェクトが動きませんでした。以下解決策。

### 1.iOSStoryBoardExample/iPhoneGUIExample
#### 1-1.エラー
　コンパイルは成功するが起動でクラッシュする。Xcodeから以下のようなエラーを確認。によると、storyboardファイルとxibファイルがXcodeのプロジェクトファイルに干渉している可能性があるとのこと。

```エラーログ
Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Could not find a storyboard named 'MyApp' in bundle NSBundle </var/mobile/Applications/06B86E5F-A94F-42D3-B2E7-D8DB61BF4A18/iosStoryboardExample.app> (loaded)
```

#### 1-2.解決手順
　Xcodeから`src/UI/MyApp.storyboard`を右クリックで削除する。そして、再び右クリックから削除したファイルを追加する。(※iPhoneGUIExampleの場合は、MyGuiView.xib)


  
### 2.iosNativeARCExample
#### 2-1.エラー
　コンパイル通らない。ofApp.mmがねえよという旨のエラーがでた。

```
clang: error: no such file or directory: '/Users/username/Documents/of_v0.9.0_ios_release/examples/ios/iosNativeARCExample/src/ofApp.mm'
```

#### 2-2.解決手順
iosNativeExampleから`ofApp.mm`と`ofApp.h`をコピーして、プロジェクトファイルに追加。

#### 2-3.再びエラー
　再びコンパイル。以下のエラーがでた。

```
Member access incompletetype 'ofAppiOSWindow'
```

#### 2-4.解決手順
src/AppViewControllers内の以下のファイルに`#import "ofAppiOSWindow.h"`を記述する。

* ImageAppViewController.mm
* TriangleAppViewController.mm
* SquareAppViewController.mm
* CircleAppViewController.mm


### 参考

* [Feature Request: Add this iOS native example with storyboards & arc #1829](https://github.com/openframeworks/openFrameworks/issues/1829)
* [Member access into incomplete type ‘ofAppiOSWindow’](https://forum.openframeworks.cc/t/member-access-into-incomplete-type-ofappioswindow/21462)


もっときれいなMarkdown練習しなきゃ...。
【Tomcat】HttpServletResponse#sendRedirectでlocationヘッダが相対パスになる


Commons HttpClientで、リダイレクトできなかったはなし。

## 前提

Commons HttpClientは下のような感じでhttpリクエストを送信することができます。

```java

HttpClient client = new HttpClient();
HttpMethod method = new GetMethod("http://www.apache.org/");
try {
    int statusCode = client.executeMethod(method);
} catch(IllegalArgumentException e) {
    (省略）
}

```

ここでHttpMethodに食わせるURLですが、**絶対パスでなければなりません。**

今まで Tomcat 8.0.9 でリダイレクトした際のLocationヘッダをそのままHttpMethodにセットして問題なく動いていたのですが、 Tomcat を 8.0.30 にバージョンアップしたとたん

*java.lang.IllegalArgumentException: host parameter is null*

が出るようになってしまいました。

## 原因

バージョンアップ前の環境と動作を比較したところ、Locationヘッダがそれぞれ

・バージョンアップ前
Location: http://sample.jp/mywebap/main

・バージョンアップ後
Location: /mywebap/main

となっていました。なんで相対パスになってるん。。。？

うんうん唸りながらTomcatのリリースノート見たら解決。

>As per RFC7231 (HTTP/1.1), allow HTTP/1.1 and later redirects to use relative URIs. This is controlled by a new attribute useRelativeRedirects on the Context and defaults to true. (markt)

http://tomcat.apache.org/tomcat-8.0-doc/changelog.html#Tomcat_8.0.30_(markt)

Tomcat 8.0.30 では、HttpServletResponse#sendRedirect でリダイレクトした時に、Locationヘッダに相対パスをセットするのがデフォルトになったようです。。。

上に書いてあるとおり、Context ディスクリプタに属性を加えると、これまで通りの挙動をしてくれます。

```xml:context.xml
(省略)
<Context useRelativeRedirects="false">
(省略)
</Context>
```

これで無事動くようになりました。
MacOS X上でdockerを使う

#MacOS X上でdockerを使う

|**compornent**|**version**|
|---|---|
| brew | 0.9.5 |

##1 dockerのインストール
###1.1 brewコマンドで導入
####1.1.1 brewの更新

~~~sh
brew update
~~~

####1.1.2 brewにリポジトリ追加

~~~sh
brew tap homebrew/binary
~~~

####1.1.3 dockerとboot2dockerをインストール

~~~sh
brew install docker
brew install boot2docker
~~~

####1.1.4 boot2dockerの起動

~~~sh
boot2docker init
boot2docker up
~~~

####1.1.5 `boot2docker up`コマンド後に表示される下記のメッセージに従って、3つの環境変数(DOCKER_HOST, DOCKER_CERT_PATH, DOCKER_TLS_VERIFY)をExportします。

~~~
Waiting for VM and Docker daemon to start...
.....o
Started.
Writing /Users/soushi/.boot2docker/certs/boot2docker-vm/ca.pem
Writing /Users/soushi/.boot2docker/certs/boot2docker-vm/cert.pem
Writing /Users/soushi/.boot2docker/certs/boot2docker-vm/key.pem

To connect the Docker client to the Docker daemon, please set:
    export DOCKER_HOST=tcp://192.168.59.103:2376
    export DOCKER_CERT_PATH=/Users/soushi/.boot2docker/certs/boot2docker-vm
    export DOCKER_TLS_VERIFY=1
~~~

==Macの環境によって、実行するべきコマンドは異なります。(筆者の場合は下記コマンドを実行しました。)==

~~~sh
export DOCKER_HOST=tcp://192.168.59.103:2376
export DOCKER_CERT_PATH=/Users/soushi/.boot2docker/certs/boot2docker-vm
export DOCKER_TLS_VERIFY=1
~~~

####1.1.6 (補足) `docker ssh`コマンドを実行すると、dockerを実行している仮想マシン(boot2docker)に接続できます。

~~~sh
boot2docker ssh
~~~

~~~
boot2docker ssh
                        ##        .
                  ## ## ##       ==
               ## ## ## ##      ===
           /""""""""""""""""\___/ ===
      ~~~ {~~ ~~~~ ~~~ ~~~~ ~~ ~ /  ===- ~~~
           \______ o          __/
             \    \        __/
              \____\______/
 _                 _   ____     _            _
| |__   ___   ___ | |_|___ \ __| | ___   ___| | _____ _ __
| '_ \ / _ \ / _ \| __| __) / _` |/ _ \ / __| |/ / _ \ '__|
| |_) | (_) | (_) | |_ / __/ (_| | (_) | (__|   <  __/ |
|_.__/ \___/ \___/ \__|_____\__,_|\___/ \___|_|\_\___|_|
Boot2Docker version 1.4.1, build master : 86f7ec8 - Tue Dec 16 23:11:29 UTC 2014
Docker version 1.4.1, build 5bc2ff8
~~~

クジラの絵を確認したら、`exit`コマンドで抜けましょう。

~~~sh
exit
~~~

###2 次のステップ

- [docker操作マニュアル](./Docker.md)に従って、dockerを使ってみます。
nginxの導入

#nginxの導入

==rootで実行==

|**起動コマンド**|**説明**|
|---|---|
| dockerイメージから起動する場合 | docker run -d -p 80:80 --name nginx1 soushi/nginx:1.0 |
| Centos:6イメージから新規に作成する場合 | docker run -i -t -d -p 80:80 -v /etc/localtime:/etc/localtime:ro --name nginx1 centos:6 /bin/bash |

- dockerイメージが無い場合、Dockerfileから作成できます。

~~~
docker build [ -t ｛イメージ名｝ [ :｛タグ名｝ ] ] <Dockerfileのあるディレクトリ>
~~~

- Dockerfileからdockerイメージを作成するコマンド例

~~~sh
docker build -t soushi/nginx:1.0 <Dockerfileのあるディレクトリ>
~~~
- dockerイメージを作成するためのDockerfileの場所

[~/OneDrive/docker/nginx1.0/Dockerfile](/Users/soushi/OneDrive/docker/nginx1.0/Dockerfile)



##1.1 nginxのリポジトリを登録します。
[公式サイト](http://nginx.org/en/linux_packages.html#stable)から、使用するOSのバージョンを探し、リポジトリを追加します。
※今回はCentos6.6用

~~~sh
rpm -ivh http://nginx.org/packages/centos/6/noarch/RPMS/nginx-release-centos-6-0.el6.ngx.noarch.rpm
~~~

/etc/yum.repos.d/nginx.repoが作成されます。

~~~
# nginx.repo

[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/6/$basearch/
gpgcheck=0
enabled=1
~~~

##1.2 nginxをインストールします。

~~~sh
yum -y install nginx
~~~

##1.3 nginxを起動します。

~~~sh
/etc/init.d/nginx start
~~~

※この時点でアクセス可能になるが、設定が必要と言われる。

![Nginx Fig 1.png](https://qiita-image-store.s3.amazonaws.com/0/9023/09959fa8-9a2c-0b3c-7e5f-c94ac9e2736d.png)


##1.4 nginxの設定を行う。
- 設定ファイルの場所は/etc/nginx/nginx.conf
- [こちらを参考](http://nginx.org/en/docs/beginners_guide.html)に設定を行う。
- ドキュメントルートを/var/wwwに設定する。

~~~sh
mkdir /var/www
sed -i -e "/^http/a \ \ \ \ server \{\n\tlocation \/ \{\n\t\troot \/var\/www\;\n\t\}\n\n\ \ \ \ \}" /etc/nginx/nginx.conf
service nginx restart
~~~

##2 ホストのIPアドレスにアクセスして、起動していることを確認します。
![Nginx Fig 2.png](https://qiita-image-store.s3.amazonaws.com/0/9023/fbe79d48-c657-ce7d-b9d1-61e12faaa0cb.png)


---

#全コマンド
~~~sh
rpm -ivh http://nginx.org/packages/centos/6/noarch/RPMS/nginx-release-centos-6-0.el6.ngx.noarch.rpm
yum -y install nginx
mkdir /var/www
echo "Hello world. Nginx is working. The document root directory is /var/www." >> /var/www/index.html
RUN sed -i -e "/^http/a \ \ \ \ server \{\n\tlocation \/ \{\n\t\troot \/var\/www\;\n\t\}\n\n\ \ \ \ \}" /etc/nginx/nginx.conf
service nginx start
~~~
Solutions for typical problems of Linux(Centos 6.3)

#Solutions for typical problems of Linux(Centos 6.3)

##システムリソース関係
###Too many open files
***「Too many open files」は Linux でプロセスが開けるファイルディスクリプタの上限に達してしまうと発生するエラーです。
「ファイルディスクリプタ」という名前ですが、 Linux ではソケットもファイルディスクリプタなので、ファイルを開いた場合だけでなく、ソケットを使って通信を行う場合にもファイルディスクリプタが使用されます。
そのため、Apache や Tomcat などで高負荷なサイトを運用している場合などには、比較的遭遇する確率が高い。***

####1 PAM認証モジュールの設定ファイル(limits.conf)を更新する。

[参考](http://d.hatena.ne.jp/akishin999/20130213/1360711554)

==limits.conf は PAM認証のモジュールである pam_limits.so の設定ファイルで、ログインの際に読み込まれるファイルです。
なので、一旦 su - して再読み込みをした後に再度値を確認します。==

~~~sh
vi /etc/security/limits.conf
~~~

下記を追記

~~~
*         hard    nofile      500000
*         soft    nofile      500000
root      hard    nofile      500000
root      soft    nofile      500000
~~~

####2 デーモンプロセスの場合、PAM認証を通らないため、limits.confの設定が反映されない。

OS 起動時のデーモンは PAM 認証を通らないため、limits.conf の設定が反映されません。
この現象を回避するためには init.d 以下の起動スクリプト内で個別に「ulimit -n 65536」を指定すればいいのですが、複数のプロセスに指定する必要がある場合など、設定変更の度にいちいち個別のファイルを編集するのは面倒です。
何か良い方法はないかと思っていろいろと調べてみたところ、自動起動する全てのデーモンに設定を反映するための方法がちゃんと用意されていました。[参考](http://d.hatena.ne.jp/akishin999/20130213/1360711554)

~~~sh
vi /etc/sysconfig/init
~~~

ファイルの末尾に下記を追記

~~~
ulimit -n 65536
~~~

==※リブート後、反映される。==

####2 システム全体のファイルリミットを増やす

~~~sh
vi /etc/sysctl.conf
~~~

下記を追記

~~~
fs.file-max = 2097152
~~~

設定を反映

~~~sh
sysctl -p
~~~

####3 ファイルリミットを確認

~~~sh
cat /proc/sys/fs/file-max
~~~

~~~
2097152
~~~

~~~sh
ulimit -Hn
~~~

~~~
500000
~~~

~~~sh
ulimit -Sn
~~~

~~~
500000
~~~


ユーザーsoushiの上限を確認

~~~sh
su - soushi -c 'ulimit -aHS' -s '/bin/bash'
~~~

~~~
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 78867
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 500000
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 10240
cpu time               (seconds, -t) unlimited
max user processes              (-u) 1024
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited
~~~

##セキュリティ関係
###SSH接続で、SSHクライアントが実行できるコマンドを制限したい

####1 authorized_keysファイルに、次のように記述する。



~~~
command="free" ssh-rsa AAAAB3N…QOID== jpetazzo@tarrasque
~~~
Spring-bootからメールを送信するまで

#目的
テキストだけのメールを送信する

googleの
二段階認証でどハマりしたため、メモ。

#環境
IDE STS
Spring boot 1.3.1
メールの送信spring-boot-starter-mail

#手順
プロジェクトの構成
![スクリーンショット 2016-01-20 23.29.29.png](https://qiita-image-store.s3.amazonaws.com/0/57455/01086264-a471-2768-a7e2-fbd3b0273b8c.png)
メール送信では、
・pom
・application.yml
・メール送信のためのjava
を編集する

##pom
いくつかの方法があるが、今回はspring-boot-starter-mailを利用する
pomファイルに依存性を設定

```xml:pom.xml
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-mail</artifactId>
		</dependency>
```



##メールの設定
application.ymlを編集する

```yaml:application.yml
spring:
  datasource:
    driverClassName: org.h2.Driver
    url: jdbc:h2:file:/tmp/mvp_mitsumori01 #
    username: sa
    password:
  jpa:
    hibernate.ddl-auto: validate #
  thymeleaf.cache: false
  
  mail:
    host: smtp.gmail.com
    port: 587
    username: <googleのメールアドレス>
    password: <アプリパスワード>
    properties.mail.smtp.auth: true
    properties.mail.smtp.starttls.enable: true

```
datasourceは関係ない
mailの方に今回利用するgmailの設定を記載する

問題は、＜アプリパスワード＞ってなんだ
ということですが、googleの設定のところで後述


##java
とりあえず送信の確認のため、
mainが実行されると同時にメールが送信されるようにする。

```java:MailTest02Application.java
package com.example;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.mail.MailSender;
import org.springframework.mail.SimpleMailMessage;

@SpringBootApplication
public class MailTest02Application {

	public static void main(String[] args) {
		try (ConfigurableApplicationContext ctx = SpringApplication.run(MailTest02Application.class, args)) {
            ctx.getBean(MailTest02Application.class).sendMail();
        }
	}
	@Autowired
    private MailSender sender;

    public void sendMail() {
        SimpleMailMessage msg = new SimpleMailMessage();

        msg.setFrom("test@mail.com");
        msg.setTo("<メールアドレス>");
        msg.setSubject("テストメール");　//タイトルの設定
        msg.setText("Spring Boot より本文送信"); //本文の設定

        this.sender.send(msg);
    }
}

```

##googleの設定
googleの「アカウント」から
![スクリーンショット 2016-01-20 23.36.14.png](https://qiita-image-store.s3.amazonaws.com/0/57455/002b5a76-f7ac-ff39-5c5a-10a6a3f1a99f.png)

アカウントの管理のgoogleへのログインへ入り

![スクリーンショット 2016-01-20 23.37.43.png](https://qiita-image-store.s3.amazonaws.com/0/57455/750c8978-55ad-3f4a-ff4d-2ab345f82dfd.png)
アプリパスワードを実行する
すると、
パスワードとなる対象のOSやアプリケーション（今回の場合メールを指定）を指定できるので、
当該アプリの設定で生成すると
パスワードが生成される。

これを、spring-bootからアクセス時利用する。

それが、application.ymlに設定した
<アプリパスワード>


今後これについて、次はファイル添付の方法等、出来るようになったらまとめる


#参考
http://qiita.com/rubytomato@github/items/b106ff8011bcad60bce2
How to develop a LaunchBar extension

#How to develop a LaunchBar extension

##1.Duplicate the SampleExtension.lbaction
>/Users/soushi/OneDrive/BackUps/LaunchBarExtension/SampleExtension.lbaction

##2.Open the package
###2.1 Right click on the extension file and then click the "Show Package Contents".

<img width="526" alt="How to develop a launchbar extension fig1.png" src="https://qiita-image-store.s3.amazonaws.com/0/9023/34bf7ac9-f846-0fe6-6c80-ff7c02b7ca22.png">

##3.Edit Info.plist file
###Original Info.plist

```xml
<?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>CFBundleIdentifier</key>
	<string>jp.soushi.sampleid</string>
	<key>CFBundleIconFile</key>
	<string>com.apple.iChat</string>
	<key>CFBundleName</key>
	<string>Sample Extension</string>
	<key>CFBundleVersion</key>
	<string>1.0</string>
	<key>LBRequiredApplication</key>
	<string>com.apple.iChat</string>
	<key>LBScripts</key>
	<dict>
		<key>LBDefaultScript</key>
		<dict>
			<key>LBScriptName</key>
			<string>default.scpt</string>
			<key>LBRequiresArgument</key>
			<true/>
			<key>LBAcceptedArgumentTypes</key>
			<array>
				<string>string</string>
			</array>
		</dict>
	</dict>
	<key>LBDescription</key>
	<dict>
		<key>LBSummary</key>
		<string>This action sends the file to the specified contact in Messages.app.</string>
		<key>LBAuthor</key>
		<string>Soushi Yamamoto</string>
		<key>LBWebsite</key>
		<string>http://www.soushi.jp/</string>
		<key>LBTwitter</key>
		<string>@soushiy</string>
	</dict>
	<key>NSHumanReadableCopyright</key>
	<string>Copyright © 2014 Soushi Yamamoto</string>
</dict>
</plist>
```

###3.1 Change the Extension Name
```<string>Sample Extension</string>``` ***->*** ***```<string>New Extension Name</string>```***

```xml
<key>CFBundleName</key>
<string>New Extension Name</string>
```

###3.2 Change the Extension Identifier
jp.soushi.sampleid ***->*** ***jp.soushi.newextensionid***

```xml
<key>CFBundleIdentifier</key>
<string> jp.soushi.newextensionid </string>
```

###3.3 Change the apple script location(optional)
If you want to change the file name of the script, you should fix the location setting in the Config.plist file.

```<string>default.scpt</string>``` ***->*** ***```<string>NewScriptFileName.scpt</string>```***

```xml
<key>LBScriptName</key>
<string>NewScriptFileName.scpt</string>
```

##4 Change the apple script

This is the example for sending the specified file using the Messages app.

```swift
on open _files
	display dialog "Enter the address(To):" default answer "mail@soushi.jp"
	set toaddress to text returned of result
	repeat with _targetfile in _files
		tell application "Messages"
			send _targetfile to buddy "mail@soushi.jp" of service ("E:" & toaddress)
		end tell
	end repeat
end open
```

##5 Install the extension
###5.1 Double click the extension file(.lbaction)

<img width="420" alt="How to develop a launchbar extension fig2.png" src="https://qiita-image-store.s3.amazonaws.com/0/9023/c623c6c8-baa2-ec27-9a5d-ab7504739f7f.png">
How to make a popclip extension

#How to make a popclip extension

##1.Duplicate the SampleExtension folder.
>/Users/soushi/OneDrive/BackUps/PopclipExtension/SampleExtension

##2.Edit Config.plist
###Original Config.plist

```xml
<?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>Actions</key>
	<array>
		<dict>
			<key>AppleScript File</key>
			<string>RunTerminalCommand.applescript</string>
			<key>Image File</key>
			<string>FIND.png</string>
			<key>Title</key>
			<string>Run Terminal Command</string>
		</dict>
	</array>
	<key>Credits</key>
	<array>
		<dict>
			<key>Link</key>
			<string>http://soushi.jp/</string>
			<key>Name</key>
			<string>Soushi Yamamoto</string>
		</dict>
	</array>
	<key>Extension Description</key>
	<string>Find the file from the selected text</string>
	<key>Extension Identifier</key>
	<string>jp.soushi.sample</string>
	<key>Extension Image File</key>
	<string>RTC.png</string>
	<key>Extension Name</key>
	<string>Sample Extension</string>
</dict>
</plist>
```

###2.1 Change the Extension Name
```<string>New Extension</string>``` ***->*** ***```<string>New Extension Name</string>```***

```xml
<key>Extension Name</key>
<string>New Extension</string>
```

###2.2 Change the Extension Identifier
jp.soushi.sample ***->*** ***jp.soushi.newextensionid***

```xml
<key>Extension Identifier</key>
<string>jp.soushi.newextensionid</string>
```

###2.3 Change the apple script location(optional)
If you want to change the file name of the script, you should fix the location setting in the Config.plist file.

```<string>RunTerminalCommand.applescript</string>``` ***->*** ***```<string>NewScriptFileName.applescript</string>```***

```xml
<key>AppleScript File</key>
<string>NewScriptFileName.applescript</string>
```

###2.4 Change the apple script

This is the example for launch the app(searchCopiedFileName) from the terminal.

```swift
tell application "Terminal"
	activate
	-- If there are no open windows, open one.
	if (count of windows) is less than 1 then
		do script ""
	end if
	set theTab to selected tab in first window
	do script "open -a 'searchCopiedFileName' --args '{popclip text}'" in theTab
	do script "exit" in theTab
end tell
```

##3 Duplicate the folder and add the ".popclipext" extension to the folder.

###3.1 Add the extension

<img width="410" alt="How to develop a popclip extension fig1.png" src="https://qiita-image-store.s3.amazonaws.com/0/9023/7f363744-02f9-547d-a419-8cae176c7dc1.png">

###3.2 Click "Add"

<img width="420" alt="How to develop a popclip extension fig2.png" src="https://qiita-image-store.s3.amazonaws.com/0/9023/249a2669-80b5-24e0-c342-9213a3d248f0.png">

##4 Install the extension
###4.1 Double click the extension file(.popclipext)

<img width="456" alt="How to develop a popclip extension fig3.png" src="https://qiita-image-store.s3.amazonaws.com/0/9023/f32c6889-a27f-ae94-d1cd-0fcea4dc500f.png">
Linuxユーザーの追加〜SSH公開鍵登録まで

Linuxユーザーの追加〜SSH公開鍵登録まで

####1.rootになる。
~~~sh
su
~~~

####2.ユーザーを追加する。
~~~sh
useradd soushi
passwd soushi
su soushi
~~~

####3 公開鍵を、ユーザーのホームフォルダ配下~/.ssh/authorized_keysファイルへ追加。
#####3.1 authorized_keysファイルを作成し、開きます。

#####3.2 公開鍵(id_rsa.pubの中身)をペーストします。
~~~
cd
mkdir .ssh
chmod 700 .ssh
touch .ssh/authorized_keys
chmod 600 .ssh/authorized_keys
vi ~/.ssh/authorized_keys
~~~

- 新しくログインIDを使う人(ここではsoushi)に、自分のパソコン上で `ssh-keygen` コマンドを使い、 ***秘密鍵(=id_rsa)*** と、 ***公開鍵(=id_rsa.pub)*** を作成して貰います。
- id_rsa.pubを ***メモ帳等で開き*** 、中身をauthorized_keysファイルにペーストします。

[soushiのid_rsa.pub](/Users/soushi/OneDrive/.ssh/id_rsa.pub)

###4.1 ユーザーsoushiをsudoersに追加する。
####sudoコマンドを実行するために必要
※テキストファイルを直接編集するのではなく、必ずvisudoコマンドを用いること。（構文チェックが行われる）

~~~sh
su
visudo
~~~

開いたテキストファイルの、rootの下に、以下のように追加
※ユーザーsoushiに、全ての実行権限を与えるという意味

~~~sh
## Allow root to run any commands anywhere
root ALL=(ALL) ALL
soushi ALL=(ALL) ALL
~~~
fluentdを導入する

#fluentdを導入する

- Fluentd is an open source data collector for unified logging layer.
- Fluentd allows you to unify data collection and consumption for a better use and understanding of data.

|**種類**|**場所**|
|---|---|
| fluentd本体 | /etc/init.d/td-agent |
| fluentd起動| /etc/init.d/td-agent start |
| fluentd停止| /etc/init.d/td-agent stop |
| fluentd設定ファイル | /etc/td-agent/td-agnet.conf |
| fluentdログファイル | /var/log/td-agent/ |

##1 ダウンロードおよびインストール
###1.1 yumにtreasuredataレポジトリを追加します。

~~~sh
# add GPG key
rpm --import http://packages.treasuredata.com/GPG-KEY-td-agent
# add treasure data repository to yum
  cat >/etc/yum.repos.d/td.repo <<'EOF';
[treasuredata]
name=TreasureData
baseurl=http://packages.treasuredata.com/redhat/\$basearch
gpgcheck=1
gpgkey=http://packages.treasuredata.com/GPG-KEY-td-agent
EOF
# update sources
yum check-update
# install the toolbelt
yes | yum install -y td-agent
~~~
Centos6上にDockerを導入する方法

**Dockerの仕様上、Centos6.6(カーネルのバージョンに依存)以上でなければ動きません。**

### 0 Linuxのファイルオープンリミットの上限を変更します。

- [ソリューションマニュアル](./Solutions.md)の、Too many open filesの項に従って、ファイルオープンの制限を緩和します。

### 1 yumでdocker-ioをインストールします。

- --enablerepoオプションが使えない場合(リポジトリを追加していない場合)は、Nothing to doと出てしまい、インストール出来ません。
- [VMセットアップガイド](./Virtual Machine Setup.md)に従って、yumにリポジトリを追加します。

~~~sh
su
yum -y update
yum -y --enablerepo=remi,epel,rpmforge install docker-io
~~~

- または、rpmをダウンロードしてインストールする方法もあります。

~~~sh
yum list installed | grep docker | awk '{print $1}' | xargs yum -y remove {}
cd /usr/local/download
curl -O -sSL https://get.docker.com/rpm/1.7.1/centos-6/RPMS/x86_64/docker-engine-1.7.1-1.el6.x86_64.rpm
yum -y localinstall --nogpgcheck docker-engine-1.7.1-1.el6.x86_64.rpm
~~~

### 2 dockerサービスを起動

#### 2.1 dockerサービスを起動します。

==***サービスが起動できない場合*** は、 ***/var/logs/docker*** ファイルを見ましょう。原因が分かります。==

~~~sh
service docker start
~~~

#### 2.2 ホストOS起動時にdockerサービスを自動起動する場合は、次のように設定します。

~~~sh
chkconfig docker on
~~~

### 3 次のステップ

- [docker操作マニュアル](./Docker.md)に従って、dockerを使ってみます。
Ruby Sinatraの導入〜サンプル作成まで〜

#Ruby Sinatraの導入〜サンプル作成まで〜

##1 Rubygemsをインストールします。

###1.1 こちらのマニュアルに従って、rubygemsをインストールしておきます。

[Rubygems.md](./Rubygems.md)

##2 Sinatraをインストールします。

~~~sh
gem update --system
gem install rdoc
gem install sinatra
gem install sinatra-contrib
~~~

###2.1 bundlerを使っている場合はこちら

/root/Gemfile

~~~
source "https://rubygems.org"
gem 'sinatra'
gem 'sinatra-contrib'
~~~

を書き加えた後、`Gemfile`のあるディレクトリで、(通常、ホームフォルダ)

~~~sh
cd
bundle install --path vendor/bundle
~~~

を実行。

##3 helloworldスクリプトを書きます。
※保存先はどこでも良い

myapp.rb

~~~
require 'sinatra'
require 'sinatra/reloader'
get '/' do
    "Hello world " 
end
~~~

###3.1 bundlerを使っている場合

~~~
Bundler.require
get '/' do
    "Hello world " 
end
~~~

##4 Webサーバーを起動します。
※http://IPアドレス:12345/にアクセスすると、"Hello world"と表示されます。
※ver.1.4.0から==development環境だと、localhostからのアクセスしか受け付けないのがデフォルト==となったため、`-o 0.0.0.0`オプションをつけること。(0.0.0.0は全てのアドレスを指す)

~~~sh
bundle exec ruby myapp.rb -o 0.0.0.0 -p 12345
~~~
Anacondaを入れたらHomebrewの環境が吹っ飛んだ話


pythonの環境をAnacondaで構築したら、homebrewで作った環境に不具合が出ました。
入れる前にいろいろ調べたのに知らなかったことなので、轍として残しておきます。


## 環境
MacOS X Yosemite
homebrew, Anaconda　←混ぜるな危険

## 
もともと、homebrewを用いてNode.js等の環境を構築し、hubotと戯れていた環境。
最近、話題のTensorFlowを使ってみるべくPythonの環境をAnacondaで作り、チュートリアルを少々動かし始めていました。

久々にnpmコマンドを打ったところ…

```-bash: npm: command not found```

ファッ！？


## 助けて！brew doctor！
困ったときのbrew doctor。警告が出ています。

```
Warning: Anaconda is known to frequently break Homebrew builds, including Vim and
MacVim, due to bundling many duplicates of system and Homebrew-available
tools.

If you encounter a build failure please temporarily remove Anaconda
from your $PATH and attempt the build again prior to reporting the
failure to us. Thanks!

Warning: "config" scripts exist outside your system or Homebrew directories.
`./configure` scripts often look for *config scripts to determine if
software packages are installed, and what additional flags to use when
compiling and linking.

Having additional scripts in your path can confuse software installed via
Homebrew if the config script overrides a system or Homebrew provided
script of the same name. We found the following "config" scripts:
    /Users/spiky00/anaconda/bin/curl-config
    /Users/spiky00/anaconda/bin/freetype-config
    /Users/spiky00/anaconda/bin/libdynd-config
    /Users/spiky00/anaconda/bin/libpng-config
    /Users/spiky00/anaconda/bin/libpng16-config
    /Users/spiky00/anaconda/bin/python-config
    /Users/spiky00/anaconda/bin/python2-config
    /Users/spiky00/anaconda/bin/python2.7-config
    /Users/spiky00/anaconda/bin/xml2-config
    /Users/spiky00/anaconda/bin/xslt-config
```
どうやらAnacondaはHomebrewと同じ名前のconfigを使用するため、ビルドを壊してしまうようです。えっ

## 解決しました！
環境変数からAnacondaを消し、もともと設定していた$PATHを設定し直します。

```
vi ~/.bash_profile
```

```
# added by Anaconda2 2.4.1 installer
export PATH="/Users/spiky00/anaconda/bin:$PATH"
```

蛇発見。そして私のNode環境はいずこへ…

これを…

```
# added by Anaconda2 2.4.1 installer
# export PATH="/Users/spiky00/anaconda/bin:$PATH"
```
こうして…

```
export PATH=$HOME/.nodebrew/current/bin:$PATH
# added by Anaconda2 2.4.1 installer
# export PATH="/Users/spiky00/anaconda/bin:$PATH"
```
こうじゃ！


すっきり解決。まだ試してはいませんが、PATHを変更すればAnaconda環境も依然使えるはず。
環境が壊れたときはどうしようかと思いましたが、存外カンタンでよかったです！
そういえばAnaconda入れるとき何か警告があった気がする…あれはもしかして…？
PowerLineでShellの見た目を変更しよう！(MacOS X, CentOS対応版)

#PowerLineでShellの見た目を変更しよう！

- MacOS Xのターミナル大好きな人で、ただ、ただ、格好良さを追求したい人向け。

- 完成予想図

![soushi%20%E2%80%94%20-bash%20%E2%80%94%20ttys000%20%E2%80%94%20120%C3%9724%202016-01-20%2023-26-42.png](https://qiita-image-store.s3.amazonaws.com/0/9023/0c267dbd-df7b-f3f8-ea66-1c3041e5ae9b.png)

#Mac OS Xの場合

###1 こちらからフォントをダウンロードし、ターミナルの設定で、フォントをSource Code Pro for Powerlineにします。

~~~sh
mkdir ~/powerline
cd ~/powerline
git clone https://github.com/powerline/fonts
cd fonts
bash install.sh
~~~


==Source Code Pro for Powerline以外を選択すると文字化けするので注意！==

###2 powerline-shellをインストールします。

~~~sh
cd
git clone https://github.com/milkbikis/powerline-shell
cd ./powerline-shell
./install.py
ln -s ~/powerline-shell/powerline-shell.py ~/powerline-shell.py
~~~

###3 .bash_profileに下記を追記します。

~~~
function _update_ps1() {
    export PS1="$(~/powerline-shell.py $? 2> /dev/null)"
}
export PROMPT_COMMAND="_update_ps1; $PROMPT_COMMAND"
~~~

###4 source .bash_profileを実行します。

~~~sh
source ~/.bash_profile
~~~

#Cent OS 6.6の場合

~~~sh
cd
#pypyをインストールします。
sudo yum -y --enablerepo=epel,rpmforge,remi search pypy
sudo yum -y --enablerepo=epel,rpmforge,remi info pypy
sudo yum -y --enablerepo=epel install pypy
sudo yum -y --enablerepo=epel install pypy-devel
sudo easy_install-2.6 argparse
#pythonのパッケージ管理ソフトpipをインストールします。
sudo curl -kL https://raw.github.com/pypa/pip/master/contrib/get-pip.py | sudo python
#pipを用いて、powerline本体をインストールします。
pip install powerline-status
#フォントをインストールします。
wget "https://github.com/powerline/fonts/archive/master.zip"
unzip master.zip
fonts-master/install.sh
~~~
ArangoDB で近傍地点検索

こんにちは。
地点の集合のデータ（約530万点）を、ArangoDB 2.8.7 に取り込み、近傍地点検索（[k-NN](https://en.wikipedia.org/wiki/K-nearest_neighbors_algorithm), k=10）を試しました。ランダムに選んだ各点を中心とする近傍10点の検索は、1回当たりの平均検索実行時間はおよそ 0.1 ms と極めて速かったです。

処理は、[MAPZEN の行政界データ](https://mapzen.com/data/borders/)をダウンロードし、

```console
$ wget https://s3.amazonaws.com/osm-polygons.mapzen.com/japan_geojson.tgz
```

この中の admin_level_7.geojson （約 160 MB 、multipolygon データ）の全頂点を```jq```を使って抽出し（約530万件）、ArangoDB に取り込み（メモリ使用約 1 GB）、Geo Index を付加し、検索しました。下記のようにこれらの処理はシンプルです[^1]（ただし検索に至るまでの処理時間を要しました）。

```console
$ gzcat admin_level_7.geojson.gz | jq -c '.features[].geometry.coordinates| flatten(2) | {"coordinates":.[]}' | gzip > admin_level_7_line_by_line.geojson.gz 
  real  1m11.029s
$ gzcat admin_level_7_line_by_line.geojson.gz | wc -l
  5313284
$ gzcat admin_level_7_line_by_line.geojson.gz | head -n 3
{"coordinates":[135.7183011,34.9437886]}
{"coordinates":[135.7181462,34.9437805]}
{"coordinates":[135.718176,34.9444206]}
$ gzcat admin_level_7_line_by_line.geojson.gz | arangoimp --file - --collection=admin_level_7 --create-collection=true --type=json
  real  0m57.144s
```

検索実行：

```console
$ arangosh
arangosh [_system]> db.admin_level_7.count()
  5313284
arangosh [_system]> db.admin_level_7.ensureIndex({type: "geo", fields:["coordinates"], geoJson: true})
  (およそ 20s かかった)
arangosh [_system]> db._query(`FOR x IN admin_level_7 SORT RAND() LIMIT 100000 LET coord = x.coordinates RETURN (FOR d in NEAR(admin_level_7, coord[1], coord[0], 10, \"distance\") RETURN d.distance)`).toArray().length
  100000
  (およそ 10s かかった)
```
------------
[^1]: 「[何が違うのか?PostGISと最新版MySQLのGIS機能を徹底比較](http://kenpg.bitbucket.org/blog/201511/29/slides20151127_rev.pdf) (pdf)」を、本稿（ArangoDB 利用）と見比べますと、PostGISもMySQLも検索に至るまでの前処理に知識が必要そうですね。
CentOS(minimum install)上にVNCサーバーを建てる方法(完全版)

# GUI環境をインストールして、VNCサーバーを建てる方法

- CentOSをminimumインストールしたけど、外部からSSHも良いけど、VMの画面も見たい！という需要にお応えするマニュアルです。

##1.1 GUI環境とVNCサーバーを導入します。
~~~sh
su
yum -y update
yum -y groupinstall "X Window System" "Desktop" "General Purpose Desktop" "Japanese Support"
yum -y remove tigervnc-server
yum -y install tigervnc-server
vncserver -geometry 800x600
~~~

==VNC接続の際のパスワードを入力します。==

##1.2 一旦、VNCサーバーを停止し、GNOME環境で起動する設定に変更します。

~~~sh
vncserver -kill :1
echo 'exec gnome-session' >> /root/.vnc/xstartup
vncserver -geometry 1680x1050
chkconfig vncserver on
chkconfig vncserver --list
~~~

##2 VNCクライアントをダウンロードし、1で用意したVNCサーバーに接続します。

###2.0 Windows/Linuxから接続する場合は、VNCクライアントのダウンロードが必要です。下記URLからお好みのVNCクライアントをダウンロードしてインストールしてください。その後の手順は、Macと同じです。

[VNCクライアント比較](http://gihyo.jp/lifestyle/serial/01/ganshiki-soushi/0060)

###2.1 Mac OS Xの場合は、OSに標準でVNCクライアント機能がついているので、それを利用します。

- 1. Finderメニュー->Go->Connect to Server...を選択します。

![VNC Server Fig 1.png](https://qiita-image-store.s3.amazonaws.com/0/9023/1abbb13c-9fb7-cb7c-b0e5-c15fcf8c696d.png)

- 2. サーバーのIPアドレス:VNC接続のポート番号を入力して、Connectを押下します。

==ポート番号は、5900に、ディスプレイ番号を足したものになります。通常は5901でOK。==

![VNC Server Fig 2.png](https://qiita-image-store.s3.amazonaws.com/0/9023/548be8d1-5f3a-eede-877c-cb09b7f2f68d.png)

- 3. 接続完了

![VNC Server Fig 3.png](https://qiita-image-store.s3.amazonaws.com/0/9023/4fe03541-fef3-c5d3-1222-e41bda458e05.png)

おまけ

- Firefoxのインストール

~~~sh
yum -y install firefox 
~~~

- 日本語入力環境の追加

~~~sh
yum -y install anthy ibus ibus-anthy
ibus-setup
echo 'export XMODIFIERS="@im=ibus"' >> ~/.bashrc
echo 'export GTK_IM_MODULE="ibus"' >> ~/.bashrc
echo 'export QT_IM_MODULE="xim"' >> ~/.bashrc
~~~

その後、
Caffeについて概要まとめ その１


[Caffeをはじめよう](http://www.oreilly.co.jp/books/9784873117454/)を読んでの個人的なまとめメモです。
今回はCaffe及び深層学習（Deep Learning）についての概要と、Caffeの依存するライブラリについて。

## Caffeとは

### 深層学習（Deep Learning）

* 深層学習の適用例
	* Google
		* 広告の出し方
		* 音声認識
	* Flickr
		* 投稿画像への自動タグ付け
	* Paypal
		* 詐欺検知システム

* 入力するデータは多いほうが良い学習ができるが、その分マシンリソースが必要となる。
* ネットワークをDeep（深層）にすると何が良いのか？
	* 幾層にも重なったネットワークで、ノイズ（音声であれば、音の高低、話すスピードなどの個人差、録音環境の違いなど）を取り除くことにより、本当に必要な情報を抽出できる。

* ただし層の数が多すぎると `過学習` に陥ることがある。
	* `過学習` とは、モデルが教師データに対して最適化されてしまって、未知の入力に対してパフォーマンスが出ない状態。

学習したい内容によって、ニューラルネットワークの `層の数` , `ユニットの数` , `隣接層のユニットの繋がり方` 等が異なる。

### 画像分野における深層学習

* 畳み込み層とプーリング層を含むニューラルネットワークは `畳み込みニューラルネットワーク（CNN）` という。
* CNNは画像処理分野では、当たり前のように採用される手法。

## Caffeの紹介

* CaffeにはPythonとMATLABのインターフェイスが用意されている。
* CUDA（NVIDIAのGPUを使用するためのSDK）に対応している。
* GPUを利用して高速に演算できる（CPUだけで処理することも可能。その場合は処理速度は遅くなる）。

## 依存関係にあるライブラリ

* CUDA
	* NVIDIAのGPUを使用するためのSDK
* BLAS
	* 線形代数演算を行うためのライブラリ
	* Caffeでは `ATLAS` , `OPENBLAS` , `MKL` の三種類のBLASライブラリに依存する。
		* ATLAS: 自動で最適化されたBLASライブラリを生成するオープンソースライブラリ。
		* OpenBLAS: 手動でX86などに最適化されたライブラリ。
		* MKL: Intel製CPUに最適化されたIntel製ライブラリ。
			* MKLは有償ライセンスが必要
* OpenCV(> 2.4)
	* 画像の入出力周りや、画像の一部を切り抜く際に使われる。
* Boost
	* C++用の便利な汎用ライブラリ。
* glog
	* ログAPIを提供するライブラリ。
* gflags
	* コマンドラインオプション等を処理するライブラリ。
* protobuf (Google Protocol Buffer)
	* データを効率的にシリアライズするライブラリ。MessagePackのようなもの？
	* `.proto` 形式のファイルにデータ構造を定義すると、各データをメンバ変数として扱えるクラスを自動生成する。
* LevelDB
	* 高速な `Key-Value Store` のローカルデータベースを提供する。Caffe内部では学習データと評価データの保存に使われる。
* snappy
	* データの圧縮・解凍機能を提供するライブラリ。LevelDBへの保存、取り出し時に使われる。
* LMDB
	* LevelDBの問題を解決するために導入されたローカルデータベースライブラリ。
* HDF5
	* 大量の数値データを保存するのに適したファイルフォーマットとファイル操作を提供するライブラリ。
[Silverlight] DataGridのHeaderにバインドしたい。

DataGridのHeaderにBindすると"System.Windows.Data.Binding"が表示されて困ったので対処したときのメモ。

バインドするデータ

```C#:MainWindowViewModel.cs
using System;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;

namespace SilverlightApplication4
{
    public class MainWindowViewModel
    {
        public string Header1
        {
            get {return "Test1" ; }
        }

        public string Header2
        {
            get {return "Test2" ; }
        }

        public string Header3
        {
            get {return "Test3" ; }
        }
    }
}
```

DataGridを持つ画面。右列が困った例。
左列がその対策

```C#:MainPage.xaml
<UserControl x:Class="SilverlightApplication4.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:my="clr-namespace:SilverlightApplication4"
    xmlns:data="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Data"
xmlns:dataprimitives="clr-namespace:System.Windows.Controls.Primitives;assembly=System.Windows.Controls.Data"
    mc:Ignorable="d"
    d:DesignHeight="300" d:DesignWidth="400">
    <UserControl.DataContext>
        <my:MainWindowViewModel x:Name="vm"></my:MainWindowViewModel>
    </UserControl.DataContext>

    <Grid x:Name="LayoutRoot" Background="White">
        <data:DataGrid>
            <data:DataGrid.Columns>
                <data:DataGridTextColumn>
                    <data:DataGridTextColumn.HeaderStyle>
                        <Style TargetType="dataprimitives:DataGridColumnHeader">
                            <Setter Property="Template">
                                <Setter.Value>
                                    <ControlTemplate>
                                        <TextBlock Text="{Binding Header1}" VerticalAlignment="Center" />
                                    </ControlTemplate>
                                </Setter.Value>
                            </Setter>
                        </Style>
                    </data:DataGridTextColumn.HeaderStyle>
                </data:DataGridTextColumn>
                <data:DataGridTextColumn Header="Test2"></data:DataGridTextColumn>
                <data:DataGridTextColumn Header="Test3"></data:DataGridTextColumn>
                <data:DataGridTextColumn Header="{Binding Header1}"></data:DataGridTextColumn>
            </data:DataGrid.Columns>
        </data:DataGrid>
    </Grid>
</UserControl>
```
Slackのショートカットキーのヘルプを表示するショートカット

`⌘+/` でヘルプを表示します。

![slack_help.gif](https://qiita-image-store.s3.amazonaws.com/0/43480/e90fa068-9168-f465-29fb-3238dfde0309.gif)

## <i class="fa fa-history" style="font-size:1em;"></i> 経緯
Add a reaction のショートカットキー( `⌘+shift+¥` )をよく忘れるので
忘れた時に手動でやらずに、ヘルプのショートカットだけでも覚えておいて
毎回ショートカットを使うようにしたい。
それを繰り返していれば覚えると思うので。

## <i class="fa fa-comment" style="font-size:1em;"></i> 思うこと
`/` キーの位置で shift を押せば `?` になるからヘルプのショートカットにこのキーを割り当ててるのかな？
"これだけ"でWindowsでVagrantを用いてLinux環境を複数構築


#はじめに
無駄なことは書かず、本当に必要最低限だけ記載。

ダウンロードするソフトは２つ。
+ VirtualBox
+ VAGRANT

この２つをインストールすれば、簡易的にLinux環境を作成できる

# インストール
## VirtualBox
以下からダウンロード
https://www.virtualbox.org/wiki/Downloads
本記事ではVirtualBox 4.3.34を使用
*古いversionによってはvagrant上で立ち上げたサーバ同士、デフォルトでは通信できないものがあるので注意。*

## VAGRANT
以下からダウンロード
http://downloads.vagrantup.com/

特に注意事項は無い


# 仮想サーバ作成
windowsでコマンドプロンプトを立ち上げて作業する
以下の手順ではCentOS 6.4をインストールされる。
他のリビジョンを使う場合は http://www.vagrantbox.es/ から適宜探してくる。



``` command:command
mkdir cry101
cd cry101
vagrant box add cry101 http://developer.nrel.gov/downloads/vagrant-boxes/CentOS-6.4-x86_64-v20131103.box
vagrant init cry101
```

編集　Vagrantfile
コメントアウトされているので以下のコメントアウトを外し、仮想サーバに割り当てたいIPを設定する。

```edit:Vagrantfile
---
  config.vm.network "private_network", ip: "192.168.33.11"
---
```

``` command:command
vagrant up
```


# 仮想サーバ作成(２個目以上)
上記サーバと全く同じ。
ホスト名(ディレクトリ名)とIPは必ずオリジナルにすること。
同じような要領で複数サーバを作成することが可能。

``` command:command
mkdir cry102
cd cry102
vagrant box add cry102 http://developer.nrel.gov/downloads/vagrant-boxes/CentOS-6.4-x86_64-v20131103.box
vagrant init cry102
```

編集　Vagrantfile

```edit:Vagrantfile
---
  config.vm.network "private_network", ip: "192.168.33.12"
---
```

``` command:command
vagrant up
```

# 接続確認
teratermなどを用いて割り当てたIPに接続する。

接続ユーザーは
ID vagrant
PW vagrant

ID root
PW vagrant
TypescriptもReactもズブのドシロウトのお勉強

typescriptをコンパイルしてReactを動かすまでの ただのメモ書き

# playframework プロジェクトの作成
`activator new`
でプロジェクトを作成

# gulp インストール
`npm install gulp`

# typescript インストール
`npm install -g typescript`

# gulpfile.js 作成
```js:gulpfile.js

var gulp = require('gulp');
var typescript = require('gulp-typescript');
var sourcemaps = require('gulp-sourcemaps');

gulp.task('typescript-compile', function() {
    gulp.src('./frontend/react/*.tsx')
    .pipe(typescript({ target: "ES6", removeComments: true, sortOutput: true, jsx: 'preserve' }))
    .js
    .pipe(gulp.dest('./public/javascripts/'))
})

gulp.task('default', ['typescript-compile'], function() {
  console.log('typescript-compile run...')
})

```

# もろもろ インストール 
`npm install gulp-typescript`
`npm install gulp-sourcemaps`
`npm install react`
`npm install react-dom`
`npm install browserify`
`npm install babelify`
`npm install vinyl-source-stream`
`npm install babel-preset-es2015`

# タスクを走らせてみる
`frontend\react\main.tsx(1,24): error TS2307: Cannot find module 'react'.`
ぐぐってみると・・・
http://staxmanade.com/2015/08/playing-with-typescript-and-jsx/
どうやら tsd というものが必要らしい

# tsd インストール
https://github.com/DefinitelyTyped/tsd
に記載の通り
`npm install tsd -g`
します

`tsd init`

# react インストール
`tsd install react --save`
`tsd install react-dom --save`

# もう一度 gulp を走らせる
が、エラーになるので
tsdファイルの先頭に
```
/// <reference path="./typings/react/react.d.ts" />
```
を加えてやる

# コンパイルが通る形

```js:main.tsx
var HelloMessage = React.createClass({
  render: function() {
    return <div>Hello {this.props.name}</div>;
  }
});

React.render(<HelloMessage name="John" />, mountNode);
```

# ハマリポイント
scriptの読み込みを一番最後にしないと
Target container is not a DOM element
で怒られる。

# で、最終形態
https://github.com/FScoward/react-play-study
Datadogを導入する

#Datadogを導入する

- とりあえず、サーバーのパフォーマンスを監視したい人は、Datadogオススメです。
- 色々な解析等もできます。(CPU負荷率の高い順とか、いろいろ)

##1 下記コマンドを実行するだけです。

参考[https://app.datadoghq.com/account/settings#agent/centos](https://app.datadoghq.com/account/settings#agent/centos)

[インストール後のマニュアル](http://docs.datadoghq.com/guides/basic_agent_usage/centos/)

~~~sh
DD_API_KEY=<あなたのAPIキー> bash -c "$(curl -L https://raw.githubusercontent.com/DataDog/dd-agent/master/packaging/datadog-agent/source/install_agent.sh)"
~~~

![datadog1.png](https://qiita-image-store.s3.amazonaws.com/0/9023/57b7e2e3-81c3-b18a-96db-3ba833ee5885.png)

##2 操作

- 起動

~~~sh
sudo /etc/init.d/datadog-agent start
~~~

- 停止

~~~sh
sudo /etc/init.d/datadog-agent stop
~~~

- 再起動または設定ファイルのリロード

~~~sh
sudo /etc/init.d/datadog-agent restart
~~~

- エージェントの起動状態確認

~~~sh
sudo /etc/init.d/datadog-agent status
~~~

- エージェントの各種状態を取得

~~~sh
sudo /etc/init.d/datadog-agent info
~~~

- エージェントの各種状態を取得(詳細版)

~~~sh
sudo /etc/init.d/datadog-agent info -v
~~~

##3 フォルダ構造

###/etc/dd-agent/conf.d/ディレクトリに、設定ファイルが入っています。

~~~sh
cat /etc/dd-agent/conf.d/
~~~

- 沢山の設定ファイル(.yaml)サンプルが存在

~~~
activemq_58.yaml.example      directory.yaml.example        hdfs.yaml.example             marathon.yaml.example         pgbouncer.yaml.example        snmp.yaml.example             tomcat.yaml.example
activemq_xml.yaml.example     docker.yaml.example           http_check.yaml.example       mcache.yaml.example           php_fpm.yaml.example          solr.yaml.example             varnish.yaml.example
activemq.yaml.example         elastic.yaml.example          iis.yaml.example              mesos.yaml.example            postfix.yaml.example          sqlserver.yaml.example        vsphere.yaml.example
apache.yaml.example           etcd.yaml.example             jenkins.yaml.example          mongo.yaml.example            postgres.yaml.example         ssh_check.yaml.example        win32_event_log.yaml.example
btrfs.yaml.example            fluentd.yaml.example          jmx.yaml.example              mysql.yaml.example            process.yaml.example          supervisord.yaml.example      windows_service.yaml.example
cacti.yaml.example            gearmand.yaml.example         kafka_consumer.yaml.example   nagios.yaml.example           rabbitmq.yaml.example         system_core.yaml.example      wmi_check.yaml.example
cassandra.yaml.example        go_expvar.yaml.example        kafka.yaml.example            network.yaml.default          redisdb.yaml.example          tcp_check.yaml.example        zk.yaml.example
couchbase.yaml.example        gunicorn.yaml.example         kyototycoon.yaml.example      nginx.yaml.example            riakcs.yaml.example           teamcity.yaml.example         
couch.yaml.example            haproxy.yaml.example          lighttpd.yaml.example         ntp.yaml.default              riak.yaml.example             tokumx.yaml.example   
~~~
Shell scriptノウハウ集(覚え書き)

#Shell scriptノウハウ集(覚え書き)

##if文で"Invalid Numeric Literal", "unary operator expected", "too many arguments"エラーが出る場合
###変数がnullになっている可能性
- 【原因】 コマンドの結果がnullになる可能性がある。
- 【結果】if文中の$varがnullなので、if文が壊れてしまい、Invalid Numeric Literalエラーが発生。

~~~sh
var=`コマンド`
if [ $var != "" ]; then
    echo "YES"
fi
~~~

- 【修正方法】変数名を""で囲う。

~~~sh
var=`コマンド`
if [ "$var" != "" ]; then
    echo "YES"
fi
~~~

## for文の書き方

- 基本構文

~~~sh
for 変数 in 値リスト
do
  処理
done
~~~

- コマンドの実行結果でループ

~~~sh
for var in `コマンド`
do
  処理
done
~~~

- 一定回数(N回)ループ

~~~sh
for i in `seq 1 N`
do
  echo "$i 回目のループです。"
done
~~~

for文では、`continue`および`break`が使用可能。

## while文の書き方

- 基本構文

~~~sh
while 条件式
do
   処理
done
~~~

- testコマンドを使用する

~~~sh
while [ 条件式 ]
do
   処理
done
~~~

- コマンドの実行結果を使用する
※`read line`の終了ステータスが1となり、条件式が偽となることでwhileループが終了する。

~~~sh
while read line
do
  echo "$line"
done <test.txt
~~~

- 無限ループ

~~~sh
while :
do
  処理
  if 条件式; then
    break
  fi
  処理
done
~~~

##入力待ち

~~~sh
printf "TTY1: ";read TTY1
echo $TTY
~~~

##ファイルを読み込んで行処理

~~~sh
files=`cat servers.txt`
for server in $files
do
    echo $server
done
~~~
Mavenの導入

#Mavenの導入

- Apache Maven（アパッチ メイヴン／メイヴェン）は、Java用プロジェクト管理ツールである。Apache Antに代わるものとして作られた。Apacheライセンスにて配布されているオープンソースソフトウェアである。[Wikipediaより](https://ja.wikipedia.org/wiki/Apache_Maven)
- 依存ライブラリの管理が面倒だと思い、導入に至った。

##1 Mavenのダウンロードとインストール

- ここでは、Maven-3.3.1をセットアップします。

~~~
sudo mkdir /usr/local/download
sudo cd /usr/local/download
sudo curl http://ftp.tsukuba.wide.ad.jp/software/apache/maven/maven-3/3.3.1/binaries/apache-maven-3.3.1-bin.tar.gz -o apache-maven-3.3.1-bin.tar.gz
sudo tar xvzf apache-maven-3.3.1-bin.tar.gz
sudo mv apache-maven-3.3.1 /usr/local/
sudo ln -s /usr/local/apache-maven-3.3.1/ /usr/local/maven
echo 'export PATH=$PATH:/usr/local/maven/bin' >> ~/.bashrc
export PATH=$PATH:/usr/local/maven/bin
mvn -version
~~~

##2 mvnコマンドの使い方

- mvnコマンドは、pom.xmlファイルを読み込み、その内容によって必要なライブラリを自動ダウンロードしたりしてくれます。
- 基本的には、`mvn clean` `mvn compile` `mvn package`の3種類を覚えておけば大丈夫です。
- `mvn`コマンドを実行する場所は、プロジェクトフォルダのルート（例えば、/Users/soushi/NetbeansProjects/AdContex/）です。

- treeコマンドの結果

~~~sh
$ tree /Users/soushi/NetbeansProjects/AdContex/
~~~

~~~
/Users/soushi/NetbeansProjects/AdContex/
├── lib
│   └── gson-2.3.1.jar
├── nb-configuration.xml
├── nbactions.xml
├── pom.xml
└── src
    └── main
        ├── java
        │   └── jp
        │       └── soushi
        │           └── adcontex
        │               ├── AdContexTopology.java
        │               ├── AuctionBolt.java
        │               ├── FilteringBolt.java
        │               ├── PricingBolt.java
        │               ├── PrintResultBolt.java
        │               └── SensorSpout.java
        └── resources

8 directories, 10 files
~~~

###ソースコードのコンパイル
- プロジェクトルートフォルダにcdしてから、`mvn compile`コマンドを実行します。

~~~sh
cd /Users/soushi/NetbeansProjects/AdContex/
mvn compile
~~~

- 再度、treeコマンドでフォルダを見てみると、targetディレクトリが追加されています！(この中にコンパイルされたコードが入る)

~~~sh
tree /Users/soushi/NetbeansProjects/AdContex/
~~~

~~~
/Users/soushi/NetbeansProjects/AdContex/
├── lib
│   └── gson-2.3.1.jar
├── nb-configuration.xml
├── nbactions.xml
├── pom.xml
├── src
│   └── main
│       ├── java
│       │   └── jp
│       │       └── soushi
│       │           └── adcontex
│       │               ├── AdContexTopology.java
│       │               ├── AuctionBolt.java
│       │               ├── FilteringBolt.java
│       │               ├── PricingBolt.java
│       │               ├── PrintResultBolt.java
│       │               └── SensorSpout.java
│       └── resources
└── target
    ├── classes
    │   └── jp
    │       └── soushi
    │           └── adcontex
    │               ├── AdContexTopology.class
    │               ├── AuctionBolt.class
    │               ├── FilteringBolt.class
    │               ├── PricingBolt.class
    │               ├── PrintResultBolt.class
    │               └── SensorSpout.class
    ├── generated-sources
    │   └── annotations
    └── maven-status
        └── maven-compiler-plugin
            └── compile
                └── default-compile
                    ├── createdFiles.lst
                    └── inputFiles.lst
~~~

###jarファイルを作成する。

- プロジェクトルートフォルダにcdして、`mvn package`を実行するだけです！

~~~sh
mvn package
~~~

###プロジェクトのクリーン

- targetフォルダを削除してくれます。

~~~sh
mvn clean
~~~
SSH関連の設定

#SSH関連の設定

##エージェント転送を使う
###1 ローカルマシン上に~/.ssh/configを作成して、下記のように踏み台サーバのアドレスを設定します。

~~~
ForwardAgent yes
#Agent to access the servers in LAN
Host agent
    HostName 131.113.102.199
    Port 60022
    User soushi
    IdentityFile ~/.ssh/id_rsa
~~~

###2 次に、LAN内にあるサーバーのアドレスを下記のように設定します。


|**項目**|**設定値**|**説明**|
|---|---|---|
|Host| agent-master1 | ホストにアクセスするための名前です。この例では、`ssh agent-master1`のように接続できるようになります。|
|HostName|192.168.56.201|ホストのIPアドレスです。|
|User|root|ホストにアクセスする際に利用するユーザー名です。(rootでのSSHログインが許可されていない場合は、変更してください。)|
|Port|60022|ホスト上のsshdがリスニングしているポート番号を指定します。(SSHはデフォルトで22番ポートを利用しますが、安全のため60022番ポートに変更してあるため、このように記述しています。)|
|ProxyCommand|踏み台サーバーで実行するコマンドです。|

~~~
Host agent-master1
    HostName     192.168.56.201
    User         root
    Port         60022
    ProxyCommand ssh -W %h:%p agent
~~~

##SSHで接続した際に、keep-aliveを行いたい。(放置すると勝手に切断されるのを防ぎたい)
###1 ローカルマシン上の~/.ssh/configを編集して、下記のように設定します。

|**項目**|**設定値**|**説明**|
|---|---|---|
| ServerAliveInterval |300|keep-aliveを実行する間隔(sec)です。|
| TCPKeepAlive |yes|TCPでのkeep-aliveを有効にします。|

~~~
ServerAliveInterval 300
TCPKeepAlive yes
~~~
CATextLayer usage

```Objective-C
CATextLayer *textLayer = [CATextLayer layer];
    [textLayer setFrame:CGRectMake(0, 5, kScreenWidth, 40)];
//    [textLayer setPosition:POINT(CGRectGetWidth(_topView.frame) / 4, 20)];
    [textLayer setString:@"下单       已支付       已发货       收货"];
    [textLayer setForegroundColor:[UIColor grayColor].CGColor];
    [textLayer setContentsScale:2.f];
    [textLayer setWrapped:YES];
    [textLayer setAlignmentMode:kCAAlignmentCenter];
    [textLayer setFontSize:16.f];
    
    [_viewForTextLayer.layer addSublayer:textLayer];
```