OmniAICreator/Qiita-1.07M huggingface dataset:
Gitbucketからcloneするときにアカウント・パスをきかれないように公開キーを設定する。



1.SSH認証の公開鍵と秘密鍵を作成
2.Mac側のSSHキーの設定
3.Gitbucketへの公開鍵の登録

##SSH認証の公開鍵と秘密鍵を作成

```
ssh-keygen -t rsa -f ~/.ssh/nini-no-id_rsa
```

```
chmod 600 ~/.ssh/nini-no-id_rsa
```

##Mac側のSSHキーの設定

鍵の管理を簡単にするために設定 ~/.ssh/config

```
vi ~/.ssh/config
```

```
Host gitbucket
	HostName host_name.com
	IdentityFile ~/.ssh/nini-no-id_rsa
	User user_name
	Port xxxx
```

##Gitbucketへの公開鍵の登録

ブラウザでGitbucketにアクセスして[account settings]>[SSH Keys]へ移動する

公開鍵をgitbucketに登録するためにファイルをクリップボードにコピー。

```
pbcopy < ~/.ssh/nini-no-id_rsa.pub
```
任意の
[Add an SSH Key]内のKeyに貼付け。
[Title]は適当に覚えやすいもの。
![SSH-Keys.jpg](https://qiita-image-store.s3.amazonaws.com/0/30301/611c8c56-2a93-455e-6c58-25888120057a.jpeg "SSH-Keys.jpg")
[Add]で登録。

[SSH認証キーをBitbucket/GitHubに設定しよう！ [Mac簡単手順]](http://morizyun.github.io/blog/ssh-key-bitbucket-github/)

###cloneするとき

```
git clone ssh://[gitbucket]/user_name/repository.git dir_name
```

*[gitbucket]は~/.ssh/configで設定したもの
自分はしばーらく直接接続しようとしてしまっていたので・・
[bitbucketにgitでpushするとPermission denied (publickey).と表示されるときの解決法](http://kuroneko0208.hatenablog.com/entry/2013/08/22/181251)
oracle パフォーマンス確認で使ったコマンド

oracle のパフォーマンス確認で使ったコマンド類をまとめた。


# oracle パラメータ情報取得

```
SQL> show parameter memory
SQL> show parameter sga
SQL> show parameter pga
SQL> show parameter log
SQL> show parameter cache
SQL> show parameter paralell
```

# SGA 情報の確認

```
SQL> select * from v$sga;
SQL> select * from v$sgainfo;
```

# REDO 書き込み wait の確認

```
SQL> SELECT
        NAME, VALUE
    FROM
        V$SYSSTAT
    WHERE
        NAME IN ('redo buffer allocation retries', 'redo entries')
    ;
```

# チェックポイントの確認

```
SQL> SELECT
        NAME, VALUE
    FROM
        V$SYSSTAT
    WHERE
        NAME = 'DBWR checkpoints'
    ;
```

# wait イベントを wait 時間でソート

```
SQL> SELECT
        EVENT, TOTAL_WAITS, TIME_WAITED, AVERAGE_WAIT
    FROM
        V$SYSTEM_EVENT e, V$EVENT_NAME n
    WHERE
        e.EVENT = n.NAME
    ORDER BY
        TIME_WAITED DESC
    ;
```


# ファイル情報取得

```
SQL> select * from v$datafile;
SQL> select * from v$tempfile;
```
oracle テーブルスペースの移動

パフォーマンス検証用に作成したテーブルスペースを、別のディスクに移す必要があったので、その時のメモ。


#手順

##1 テーブルスペースを OFFLINE に。

```
SQL> alter tablespace test1 OFFILE;
```

##2 os コマンドでファイルを移動。

```
cp -pi /home/user1/test1.dbf  /data/user1/test2.dbf
rm -i /home/user1/test1.dbf

mv しちゃえばいいだけなんですが、念のため。
```

##3 テーブルスペース情報をリネーム

```
SQL> alter tablespace test1 rename datafile '/home/user1/test1.dbf' to '/data/user1/test2.dbf';
```

##4 テーブルスペースを ONLINE に

```
SQL> alter tablespace test1 ONLINE;
```

これだけ。
oracle テーブルスペースのリサイズ

BIGFILE か SMALLFILE かでコマンドが違う。

# BIGFILE or SMALLFILE の確認

```
SQL> select tablespace_name, status, bigfile from dba_tablespaces;
```

# BIGFILE の場合

```
SQL> alter tablespace test1 resize 20G;
```


# SMALLFILE の場合

```
SQL> alter database datafile '/home/user1/test1.dbf' resize 20G;
```

これだけ。
oracle UNDOテーブルを切り替える

自前 undo 領域を構築すべく、undo の作成、切り替えをした時のメモ。

# 現在の状況を確認

```
SQL> SELECT
        NAME, VALUE
    FROM
        V$PARAMETER
    WHERE
        NAME = 'undo_tablespace'
    ;

SQL> SELECT
        TABLESPACE_NAME, FILE_NAME, BYTES/1024/1024 MBYTES 
    FROM
        DBA_DATA_FILES 
    WHERE
        TABLESPACE_NAME IN (
            SELECT
                TABLESPACE_NAME
            FROM
                DBA_TABLESPACES
            WHERE
                CONTENTS='UNDO'
        )
    ;
```

# 新 undo 領域を作成

```
SQL> CREATE
    UNDO TABLESPACE
        UNDOTBS2
    DATAFILE
        '/home/user1/undotbs02.dbf'
    SIZE
        20G
    AUTOEXTEND
        ON
;
```

# undo 切り替え

```
SQL> ALTER SYSTEM SET UNDO_TABLESPACE='UNDOTBS2';
```

こんな感じ。
oracle REDO ログファイルのサイズ変更

デフォルト状態では REDO ログファイルのサイズが 50M × 3 ファイルしかなかったので、一気に 2GB × 3 ファイルにまで上げた時のメモ。

※この環境はアーカイブログを取っていなかったので、手順も至極簡単！

```
SQL> archive log list
データベース・ログ・モード     非アーカイブ・モード
自動アーカイブ                 使用禁止
アーカイブ先                    USE_DB_RECOVERY_FILE_DEST
最も古いオンライン・ログ順序   197
現行のログ順序               199
```


#手順

## 手順1 作業用に、150 MB でREDO ファイルを作成

```
SQL> alter database add logfile group 4 ('/home/user1/redo04.log') size 150M;
SQL> alter database add logfile group 5 ('/home/user1/redo05.log') size 150M;
```


## 手順2 ログスイッチを起こして、既存のロググループを INACTIVE に、INACTIVE のロググループは drop する

(ステータス確認)
```
SQL> select group#, sequence#, bytes, blocksize, members, archived, status from v$log;
```

(ログスイッチ)

```
SQL> alter system switch logfile;
```

(ロググループを drop)

```
SQL> alter database drop logfile group 1;
SQL> alter database drop logfile group 2;
SQL> alter database drop logfile group 3;
```

## 手順 3 os コマンドで、旧 REDO ログファイルを削除

```
> rm -i /home/user1/redo01.log
> rm -i /home/user1/redo02.log
> rm -i /home/user1/redo03.log
```


## 手順4 ログサイズを 2G としてロググループ 1-3 を新規作成

```
SQL> alter database add logfile group 1 ('/home/user1/redo01.log') size 2G;
SQL> alter database add logfile group 2 ('/home/user1/redo02.log') size 2G;
SQL> alter database add logfile group 3 ('/home/user1/redo03.log') size 2G;
```


## 手順5 ログスイッチを起こして、作業用のロググループを INACTIVE に、INACTIVE のロググループは drop

(ステータス確認)

```
SQL> select group#, sequence#, bytes, blocksize, members, archived, status from v$log;
```

(ログスイッチ)

```
SQL> alter system switch logfile;
```

(ロググループを drop)

```
SQL> alter database drop logfile group 4;
SQL> alter database drop logfile group 5;
```

ここまで。
MySQL, load data infile に流しこむtsvの形式メモ

データ入れるまでに思ったよりも試行錯誤したので

## 基本的な

- デフォルトはtsvファイル(タブ区切り)
- 基本的にクオート不要
- __datetimeもクオート不要__
- `NOW()`とか関数指定してると当然怒られる
- レコードの末尾のカラムまでtsvのカラムの個数が合わないとだめ
  - 末尾のcreated的なカラムなど、`CURRENT_TIMESTAMP`をデフォルト値にしてたりでも必要

## 例

```ruby
1	testdata:1	2015-08-10 00:00:00	631	    42
2	testdata:2	2015-08-11 00:00:00	781	    60
3	testdata:3	2015-08-12 00:00:00	851	    35
4	testdata:4	2015-08-13 00:00:00	1308	32
5	testdata:5	2015-08-14 00:00:00	1391	44
```

## コマンド例

```
$ mysql
mysql > load data infile "/file/to/path/testdata.csv" INTO TABLE test_table_name;
```
三角関数を使って特定の値を求める

座標計算する時に使うので、ひと通りまとめてみた。
やっつけで書いたんで、実際に使ってないのは間違ってるかも。

```coffeescript
###
斜辺を求める
###

# 底辺と角度から
getHypotenuseFromBaAn = (base, angle) ->
  base / Math.sin(angle)

# 高さと角度から
getHypotenuseFromHeAn = (height, angle) ->
  height / Math.sin(angle)

# 底辺と高さから
getHypotenuseFromBaHe = (base, height) ->
  Math.sqrt Math.pow(base, 2) + Math.pow(height, 2)


###
高さを求める
###

# 底辺と角度から
getHeightFromBaAn = (base, angle) ->
  base * Math.tan(angle)

# 斜辺と角度から
getHeightFromHyAn = (hypotenuse, angle) ->
  hypotenuse * Math.sin(angle)

# 底辺と斜辺から
getHeightFromBaHy = (base, hypotenuse) ->
  Math.sqrt Math.pow(hypotenuse, 2) - Math.pow(base, 2)


###
底辺を求める
###

# 高さと角度から
getBaseFromHeAn = (height, angle) ->
  height / Math.tan(angle)

# 斜辺と角度から
getBaseFromHyAn = (hypotenuse, angle) ->
  hypotenuse * Math.cos(angle)

# 高さと斜辺から
getBaseFromHeHy = (height, hypotenuse) ->
  Math.sqrt Math.pow(hypotenuse, 2) - Math.pow(height, 2)


###
角度を求める
###

# 底辺と高さから
getAngleFromBaHe = (base, height) ->
  Math.atan2 height, base

# 底辺と斜辺から
getAngleFromBaHy = (base, hypotenuse) ->
  Math.acos base / hypotenuse

# 高さと斜辺から
getAngleFromHeHy = (height, hypotenuse) ->
  Math.asin height / hypotenuse
```

## 参考サイト
http://keisan.casio.jp/has10/Menu.cgi?path=04000000.%90%94%8Aw%8C%F6%8E%AE%8FW%2F02000100.%8EO%8Ap%8A%D6%90%94%81i%93x%81j
Xcode7 で pod install で ASSERTION FAILURE が発生した時の対処法



iOS9 が公開され、開発環境も Xcode7 にアップデート作業を始めている方が多いと思います。

Xcode7 にアップデートして既存のプロジェクトで pod install を実行したところ下記のようなエラーに遭遇しましたので対処法をメモ。

```
2015-09-17 13:10:30.154 ruby[55564:7519635] [MT] DVTAssertions: ASSERTION FAILURE in /Library/Caches/com.apple.xbs/Sources/IDEFrameworks/IDEFrameworks-8227/IDEFoundation/Initialization/IDEInitialization.m:590
Details:  Assertion failed: _initializationCompletedSuccessfully
Function: BOOL IDEIsInitializedForUserInteraction()
Thread:   <NSThread: 0x7f8b6309c020>{number = 1, name = main}
Hints: None
Backtrace:
  0  0x0000000104545a5c -[DVTAssertionHandler handleFailureInFunction:fileName:lineNumber:assertionSignature:messageFormat:arguments:] (in DVTFoundation)
  1  0x00000001045451e9 _DVTAssertionHandler (in DVTFoundation)
  2  0x0000000104545455 _DVTAssertionFailureHandler (in DVTFoundation)
  3  0x00000001045453b7 _DVTAssertionFailureHandler (in DVTFoundation)
  4  0x0000000105a42f5c IDEIsInitializedForUserInteraction (in IDEFoundation)
  5  0x000000010869aeb9 +[PBXProject projectWithFile:errorHandler:readOnly:] (in DevToolsCore)
  6  0x000000010869ca3e +[PBXProject projectWithFile:errorHandler:] (in DevToolsCore)
  7  0x00007fff8624bf44 ffi_call_unix64 (in libffi.dylib)
Abort trap: 6
```

# 対処法

command line のパスが不適切になっていると発生するようです(Xcode beta と共存してた時など)。下記コマンドでパスをリセットします。

```
sudo xcode-select -r
```

上記コマンド実行後、ターミナルを新たに開くと pod install が成功しました。


参考：
https://github.com/CocoaPods/CocoaPods/issues/3723
s3にある画像をgulpを使って最適化する


## 必要なもの
・aws-cli
・node

## s3にある画像をgulpを使って最適化する手順


1. s3から画像を持ってくる

 ```
 mkdir s3
 aws s3 sync s3://[バケット名] s3
 ```

2. npmの初期化とパッケージインストール

 ``` 
 npm init
 npm install --save-dev gulp
 npm install --save-dev gulp-debug
 npm install --save-dev gulp-imagemin
 npm install --save-dev gulp-plumber
 npm install --save-dev gulp-image-resize1
 npm install --save-dev gulp-rename
 npm install --save-dev gulp-ignore
 ```

3. gulpfile作成

 ```gulpfile.js
var gulp        = require('gulp');
var path        = require('path');
var debug       = require('gulp-debug');
var imagemin    = require('gulp-imagemin');
var plumber     = require('gulp-plumber');
var imageResize = require('gulp-image-resize');
var rename      = require("gulp-rename");
var ignore      = require("gulp-ignore");
var paths = {
  srcDir : 's3',
  dstDir : 'local'
}
// 画像のリサイズ＆最適化
gulp.task( 'imageresize', function(){
		var srcGlob = paths.srcDir + '/**/*.+(jpg|jpeg|png|gif|svg)';
  		var dstGlob = paths.dstDir;
  		var imageWidth = 730;
  		var imageHeight = 306;

  		var imageminOptions = {
  			optimizationLevel: 7
  		};

  		gulp.src( srcGlob )
  		// 画像のリサイズ
  		.pipe(plumber())
  		.pipe(ignore.exclude(/-/))
  		.pipe(imageResize({
    		width: imageWidth,
    		height: imageHeight,
    		crop: true,
    		upscale: false
  		}))
  		// 画像の最適化
  		.pipe(imagemin( imageminOptions ))
  		// ファイル名変更
  		.pipe(rename(function(path){ path.basename += "-"+imageWidth+"x"+imageHeight}))
	  	.pipe(debug({title: 'image:'}))
	  	// ファイル移動
  		.pipe(gulp.dest( dstGlob ));
});

 ```
 
4. gulp実行

 ```
 mkdir local
 gulp imageresize
 ```

5. s3にファイルをupload

 ```
 aws s3 sync local s3://[バケット名]/ --expires 2025-6-18 --recursive --acl public-read
 ```
 
## はまったポイント
・wordpressの場合、postmetaデータも書き換えないといけなかった。
・```--acl```を指定せずにsyncすると、なぜかs3のオブジェクトがprivateになってしまい、cloudfrontでAccessDenied！一時画像が見れなくなった
[iOS] プッシュ通知の受け取り方 - アプリの状態別


```swift:AppDelegate.swift
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
    if let o = launchOptions, userInfo = o[UIApplicationLaunchOptionsRemoteNotificationKey] {
        // アプリが起動していない時に通知タッチで起動
    }
}

func application(application: UIApplication, didReceiveRemoteNotification userInfo: [NSObject : AnyObject]) {
    switch application.applicationState {
    case .Active:
        // アプリが起動している時に受信
    case .Inactive:
        // アプリがバックグラウンドで起動している時に通知タッチでフォアグラウンドに
    default: break
    }
}
```
[Javascript] jQueryとprototype.jsが競合してエラーになるときの解決方法

ちょっとレガシーなWebサイトをいじっててハマったのでめも。

prototype.jsを使っている既存のコードで以下のようなエラーが発生

```
Uncaught TypeError: element.dispatchEvent is not a function
Uncaught TypeError: element.attachEvent is not a function
Uncaught TypeError: element.attachEvent is not a function
```

これの原因はjQueryとprototype.jsでグローバル変数"$"が
jQueryによって上書きされていることによるものだった。

jQueryもprototype.jsも"$" をグローバルスコープで使うライブラリなので、
両方共存させるときはちょっと工夫しなければならない

jQueryの方には、
jQuery.noConflict()
というメソッドが用意されているのでこれを使う。
http://semooh.jp/jquery/api/core/jQuery.noConflict/_/


```
jQuery.noConflict();
// prototype.jsを使ったコード
```

これで解決


おまけ
"$" がjQueryのものか、prototypeのものかわからなくなったら、
以下の方法で確認できる

```
console.log($ === jQuery);
```

trueなら$はjQuery, falseならprototype.js
サッと一時ディレクトリを作って作業して捨てる

# ダメ人間の日常
例えば適当なファイルを一時的に落としてきてちょっと使ったら捨てたいだとか、そんなとき僕はよく `mkdir /tmp/a; cd /tmp/a` してから何かするとかやってたんだけど、これ良くない点が色々ある。

- 一時ディレクトリに使う名前のボキャブラリが貧困な上に掃除もサボるので名前が被りまくってmkdirが中々出来ない→[結果こうなる](http://d.hatena.ne.jp/y-kawaz/20090826/1251267667)
- 後始末しないで放置も多いのでゴミファイルが増えてディスクの無駄だしパスワードや個人情報とか消すべきセンシティブな情報が含まれてると色々問題。
- 一時ディレクトリでの作業が終わったら元いた場所に戻りたいけど元いた場所が深いとこだったりすると戻るのが面倒だしそもそも何やってたか忘れてる事も…。

# tmpspaceコマンドで解決だ！

そこでそんな問題を解決するために以下のような bash 関数を作って、`~/.bashrc` とかに書いておくことにした。

```bash:
# 一時作業用コマンド https://qiita.com/kawaz/items/2b6ef25f63a4f5300e84
tmpspace() {
  (
  d=$(mktemp -d "${TMPDIR:-/tmp}/${1:-tmpspace}.XXXXXXXXXX") && cd "$d" || exit 1
  "$SHELL"
  s=$?
  if [[ $s == 0 ]]; then
    rm -rf "$d"
  else
    echo "Directory '$d' still exists." >&2
  fi
  exit $s
  )
}

# typoで補完が出てこないのもストレスなのでaliasも作っておくことにした
alias tempspace=tmpspace
```

使い方は簡単で、何か一時的な作業をしたくなったら `tmpspace` と打てば良い。作業が終わったら `exit` するだけだ。これにより以下のようなメリットが受けられるようになる。

- 一時ディレクトリ名を考える必要が無くなる。
- `exit` すれば元いた場所に戻れる。
- `exit` すれば一時ディレクトリも消える。
- 一時ディレクトリを残したままにしておきたければ `exit 1` とかすればOK。
    - 残った一時ディレクトリのパスも復帰時に表示してくれる。
    - 大事な作業中ファイルがある状態で異常終了（sshが切れた等）した場合は自動クリーニングされない。
- 一時ディレクトリは `chmod 700` な状態で作られるので別ユーザに覗かれる心配もなくなる。
mavenのコンパイルjavaバージョンを指定する

mavenでコンパイルjavaバージョンを指定する方法です。
maven-compiler-pluginが参照しているプロパティ「maven.compiler.target」と「maven.compiler.source」を設定するだけです。

```pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<groupId>org.test</groupId>
	<artifactId>test</artifactId>
	<version>0.0.1-SNAPSHOT</version>

	<properties>
		<java.version>1.8</java.version>
		<maven.compiler.target>${java.version}</maven.compiler.target>
		<maven.compiler.source>${java.version}</maven.compiler.source>

	</properties>
</project>
```

maven compiler pluginのパラメータ
http://maven.apache.org/plugins/maven-compiler-plugin/compile-mojo.html
AWS CLI を使えるようにしてみよう

## AWS CLI インストール

```
[root@localhost ~]# yum install python-pip -y
[root@localhost ~]# pip install awscli
```

※ python-pip がないときは↓でpipが使えるように

```
[root@localhost~]# yum install python-setuptools -y
[root@localhost~]# easy_install pip
```

※ AWS CLI は python 2.6 から対応なので、 pythonコマンド = 2.4 な環境の場合は、
　 python26 とかにコマンドを置き換えてやってみたらいいよ。

こんだけ

SDKより断然早いのでこっちがオススメ
http://aws.amazon.com/jp/cli/

## AWS CLI 設定

ほんとは IAMロール とかで設定するのがベストだけど、
Access Key とかで設定する場合

```
[root@localhost~]# aws configure
AWS Access Key ID [****************HOGE]: ********************
AWS Secret Access Key [****************FUGA]: ****************************************
Default region name [ap-northeast-1]: 
Default output format [None]: 
```

基本的に

* AWS Access Key ID
* AWS Secret Access Key

だけ入れればいいと思う。
output format など json とかを指定することもたまにある。

cron とかで使ってうまくいかない場合は、
export HOME=/root;
※root は使うユーザのHOMEディレクトリに合わせる。
って入れる
Macでaws-cliを使って、EC2を立ち上げてみた


##aws-cliの導入
ec2を立ち上げるのに必要なツールです。
pythonのパッケージ管理ツールであるpipを使ってインストールします。

```
pip install awscli
```

python, pipが入ってない場合

``` 
# pythonをインストール
brew install python

# 下記設定を~/.bashrcに追記
export PATH=/usr/local/share/python:$PATH

# pipをインストール
easy_install pip
```


## jqの導入
jsonをいい感じに扱えるようになるツールです。
aws-cliでインスタンスを作ったとき、そのインスタンス情報がjsonで返ってきます。インスタンス情報に含まれるinstanceIdを簡単に抜き出すために入れておきます。

```
brew install jq
```

日本語でjqの使い方を書いてくれてる記事
>[jq コマンドを使う日常のご紹介](http://qiita.com/takeshinoda@github/items/2dec7a72930ec1f658af "jq コマンドを使う日常のご紹介")

##EC2を立ち上げて名前を付ける
EC2を立ち上げるには```aws ec2 run-instances```コマンドを使います。
名前（Nameのタグ）を付けるには```aws ec2 create-tags```を使います。

1. ```aws ec2 run-instances```でインスタンスを作成する。この時、返ってきたinstance情報をtest.jsonに保存する（サブネットの指定、IAMの指定が必要ない人は外してください。）

 ```
 aws ec2 run-instances --image-id "AMIのイメージid(ami-***)" --count 1 --security-group-ids "セキュリティグループのid(sg-***)" --instance-type "インスタンスの種類(t2.micro)" --key-name "Key Pairの名前" --subnet-id "サブネットのid(subnet-***)" --iam-instance-profile Name="IAMの名前" > test.json
 ```
 
2. ```aws ec2 create-tags```でTestという名前を付ける
  
  ```
  instanceId=`cat test.json | jq -r '.Instances[].InstanceId'`
  aws ec2 create-tags --resources $instanceId --tags '[{"Key": "Name", "Value": "Test"}]'
```

## 最後に

aws-cliを使ってEC2のインスタンスを立ち上げてみました。すでに、ansibleやchefでサーバー構成を管理しているのであれば、CloudFormationを使うのもいいかもしれません。
cygwin64からssh出来ないとき

MS Windows環境で*cygwin*を使う時。

cygwinの*64-Bit*を**追加**でインストールした場合に_ssh_がエラーになりました。

`$ ssh 192.168.0.1
Pseudo-terminal will not be allocated because stdin is not a terminal.
Permission denied, please try again.
Permission denied, please try again.
Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).
`
実は*32-Bit*環境に_パス_が通っている可能性があります。
* 32-Bit C:\cygwin
* 64-Bit C:\cygwin64
とかでインストールした場合
*64-Bit*の環境で
/cygdrive/c/cygwin/bin
にパスが通っていて
sshが/cygdrive/c/cygwin/bin/sshかもしれません

`$ /usr/bin/ssh 192.168.0.1`

で確認してPATHを整理して解消しました。
Clojure で文字列から関数(含む Java のメソッド)を実行する方法幾つか

ちょっと色々検索してて目に入った中にタイトルのようなことをしようとしている記事が幾つかあって、何故か `eval` に行き着いてしまっていたりやたら複雑なことをしていたりしていたのでちょっと正しい方法とか書いておこうと思います。ちなみにどの言語でもそうだと思いますが `eval` は最終兵器であり基本的には使うべきではないものだと認識しています(だいたいやりたいことするための API は揃っている)。

## 同一ネームスペースの関数を実行する

```clj
(ns example.core)

(defn foo []
  "This is 'example.core/foo' function")
```

こういう `foo` 関数があった場合に同じネームスペースから文字列を用いて実行する場合は次のようにします。

```clj
((resolve (symbol "foo"))) ;;=> This is 'example.core/foo' function
```

https://clojuredocs.org/clojure.core/resolve

## 違うネームスペースの関数を実行する

```clj
(ns example.other)

(defn bar []
  "This is 'example.other/bar' function.")
```

こういう関数が定義してあるネームスペースがあってこれを `example.core` から呼び出したいときはこう書きます。

```clj
(let [s "example.other/bar"
      k (keyword s)
      ns-sym (symbol (namespace k))
      name-sym (symbol (name k))]
  ((ns-resolve ns-sym name-sym))) ;;=> This is 'example.other/bar' function.
```

https://clojuredocs.org/clojure.core/ns-resolve

## Java のメソッドを実行する

```clj
(let [c "java.lang.String"
      m "valueOf"
      args [200]]
  (clojure.lang.Reflector/invokeStaticMethod c m (into-array args))) ;;=> 200
```

`clojure.lang.Reflector` には他にも `invokeInstanceMethod` など欲しくなりそうなものがあるので困ったら覗いてみるといいかもしれません。


## まとめ

Clojure にはだいたい「やりたい」と思うことを簡単にやる方法が既に用意されていることが多いです。ただ、それが日本語になっていないというだけで今回の問題も `clojure function call from string` などと検索すればだいたい出てきます。

## 元ネタ

http://npnl.hatenablog.jp/entry/2012/06/02/150513

途中で言及されている `if` を呼び出すのはちょっと正攻法じゃ出来ない気がしてます(スペシャルフォームは流石に Compiler レベルまで降りるか `eval` じゃないと無理じゃないかなぁ/単純に構文的な何かを作りたいならマクロで対処出来るんですけどね)。

http://d.hatena.ne.jp/Kazuhira/20120602/1338656383

流石にここまでして関数を動的に呼び出す人はいないと思いますが…。
Ubuntuに、.Net Coreをインストールした備忘録


##概要
C#は今までオープンソース実装として、Monoが利用されてきましたが、マイクロソフト自身が、.Net Coreとして公式パッケージを配布するようになりました。
本稿は、[本家サイト](http://dotnet.github.io/core/getting-started/)の写経(作業)備忘録です。

##インストール手順
###Prepare the environment
環境のセットアップになります。.Net Coreを使うにはMonoが必要なんですね。
これかもずっと必要なのだろうか？住み分けがあるのかも知れませんね。

```
$ sudo apt-get install libunwind8 libssl-dev unzip
$ sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF
$ echo "deb http://download.mono-project.com/repo/debian wheezy main" | sudo tee /etc/apt/sources.list.d/mono-xamarin.list
$ sudo apt-get update
$ sudo apt-get install mono-complete
$ mozroots --import --sync
```
###Install .NET Version Manager (DNVM)
.Netバージョンマネージャーをインストールします。

```
$ curl -sSL https://raw.githubusercontent.com/aspnet/Home/dev/dnvminstall.sh | DNX_BRANCH=dev sh && source ~/.dnx/dnvm/dnvm.sh
```

###Install .NET Core Execution Environment (DNX)
.Net Coreの実行環境をインストールします。

```
$ dnvm upgrade -u
$ dnvm install -r coreclr latest -u
```
###Write the app
テストプロジェクトの為のファイルを用意します。
project.jsonがビルド指示ファイルっぽいですね。

```csharp:HelloWorld.cs
        using System;

        public class Program {
        	public static void Main(string[] args){
        		Console.WriteLine("Hello World from Core CLR!");
        	}
        }
```

```json:project.json
        {
            "version": "1.0.0-*",
            "dependencies": {
            },
            "frameworks" : {
                "dnx451" : { },
                "dnxcore50" : {
                    "dependencies": {
                        "System.Console": "4.0.0-beta-*"
                    }
                }
            }
        }
```

###Run the app
このステップが初め良くわからなかったのですが、[version]に書き換える文字列は、`dnvm list`で表示させることができるみたいです。インストールしたタイミングによって、バージョンは変わると思いますので、下記は例です。

```
$ dnvm list
Active Version              Runtime Architecture OperatingSystem Alias
------ -------              ------- ------------ --------------- -----
  *    1.0.0-beta8-15618    coreclr x64          linux
       1.0.0-beta8-15618    mono                 linux/osx       default
```

```
$ dnvm use [version] -r mono
$ dnu restore
$ dnvm use [version] -r coreclr
$ dnx run
```
下記の文字列が表示されれば成功です。

```
Hello World from Core CLR!
```
bashログイン、MySQLログインのユーザを確認、追加設定する


## bashログイン
### ユーザの確認
`$ cat /etc/passwd`でも確認出来ますが、以下のコマンドを使うとユーザ名だけを抜き出せます。

`$ cat /etc/passwd|sed -e 's/:.*//g'`

### ユーザの作成
#### root権限になる
`$ su`

#### ユーザ追加
hogeユーザの作成
`# useradd hoge`

#### パスワードの設定
hogeユーザにパスワード設定
`# passwd hoge`

```bash:console
Changing password for user hoge.
New password: 
Retype new password: 
passwd: all authentication tokens updated successfully.
```

## MySQLユーザ
### MySQLログイン
`$ mysql -u root -p mysql`

### ユーザの確認
`mysql> SELECT user, host FROM user;`

### ユーザの作成
#### ユーザ追加
hogeユーザの作成
`mysql> CREATE USER 'hoge'@'localhost' IDENTIFIED BY 'パスワード';`

#### 権限付与
hogeユーザに権限を付与
`mysql> GRANT ALL PRIVILEGES ON *.* TO 'hoge'@'localhost';`

### 権限の確認
`mysql> SHOW GRANTS for 'hoge'@'localhost';`


## おまけ
### rootでのSSHログインを禁止する
#### root権限になる
`$ su`

#### 現在の設定を確認
`# cat /etc/ssh/sshd_config | grep "PermitRootLogin"`

```bash:/etc/ssh/sshd_config
PermitRootLogin no
# the setting of "PermitRootLogin without-password".
```
と出ればもう弄らなくてOK

```bash:/etc/ssh/sshd_config
#PermitRootLogin yes
# the setting of "PermitRootLogin without-password".
```
と出たら↓へ

#### SSHの設定ファイルをバックアップ
`# cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bu`

#### rootログインの項目を編集
`# vi /etc/ssh/sshd_config`

```bash:/etc/ssh/sshd_config
  41 #LoginGraceTime 2m
  42 #PermitRootLogin yes
  43 #StrictModes yes
  44 #MaxAuthTries 6
  45 #MaxSessions 10
```
42行目付近にある `#PermitRootLogin yes` のコメントアウトを外して、`yes`を`no`にする
↓

```diff:/etc/ssh/sshd_config
  41 #LoginGraceTime 2m
- 42 #PermitRootLogin yes
+ 42 PermitRootLogin no
  43 #StrictModes yes
  44 #MaxAuthTries 6
  45 #MaxSessions 10
```

####  構文の確認
`# sshd -t`

#### 設定を反映
`# /etc/init.d/sshd restart`

### ユーザにsudoの実行権限を与える
#### root権限になる
`$ su`

#### sudo実行権限ファイルを変更
`# visudo`

* 普通のsudo

```diff
  104 ## Allows people in group wheel to run all commands
  105 %wheel ALL=(ALL) ALL
+ 106 %admin ALL=(ALL) ALL  # ← これを追加
```

* NOPASSWD(sudo実行時にパスワードを再入力しない)版

```diff
  104 ## Allows people in group wheel to run all commands
  105 %wheel ALL=(ALL) ALL
+ 106 %admin ALL=(ALL) NOPASSWD: ALL  # ← NOPASSWDでパス入力を省略可
```
Time.currentとDBに入れた値との比較テストを書くときに微妙に差が出てつらい問題

```ruby
Timecop.freeze do
  hoge.activate!

  assert_equal Time.current, hogs.activated_at
end
```


```
No visible difference in the ActiveSupport::TimeWithZone#inspect output.
```

こんなのが出る。

調べてみると、

```
Time.current.to_f # => 1442454360.028926
hoge.activated_at # => 1442454360.0
```

microsecの差分のせいなので、そこを無視するように`Time.freeze`する。


```ruby
Timecop.freeze(Time.current.change(usec: 0))
```


```ruby
Timecop.freeze(Time.current.change(usec: 0)) do
  hoge.activate!

  assert_equal Time.current, hogs.activated_at
end
```
IAMで請求情報(Billing & Cost Management)だけ表示できるポリシー


AWSのIAMで請求情報(Billing & Cost Management)だけ表示できるポリシーの書き方メモ。
経理担当の方などでお金の情報は見たいけど、それ以外は触ってほしくないみたいな時に有用です。

以下のカスタムポリシーを作って、該当のユーザorグループにアタッチすればOKです。


```json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "aws-portal:View*",
            "Resource": "*"
        }
    ]
}
```


普通はパスワード変更も必要だと思うので、パス変できるポリシーはこちらも参照。
[IAMで自分のパスワード変更だけできるポリシー](http://qiita.com/minamijoyo/items/7ec2246468ed6853bdb6)
IAMで自分のパスワード変更だけできるポリシー


AWSのIAMで自分のパスワード変更だけできるポリシーの書き方メモ。
以下のカスタムポリシーを作って、該当のユーザorグループにアタッチすればOKです。


```json
{
    "Version": "2012-10-17",
    "Statement": {
        "Effect": "Allow",
        "Action": [
            "iam:ChangePassword",
            "iam:GetAccountPasswordPolicy"
        ],
        "Resource": "*"
    }
}
```
cakephp3のDebug_kitは便利になってるよ！

## はじめに

cakephp3でDebug_kitを触ってみたら新しい機能が追加されていたのでご紹介です。

![001.png](https://qiita-image-store.s3.amazonaws.com/0/25290/71ec9af4-92ad-05fc-12ed-63feee86691b.png)


cakephp3では画面下に表示されますがメニューにCacheという項目が追加されています。

そのCacheをクリックするとこんな画面が表示されます。


![02.png](https://qiita-image-store.s3.amazonaws.com/0/25290/085087b2-cf89-4de7-fbd0-b5acce9c8eeb.png)


# 簡単に説明すると

```
default Metrics（画面左上）
  明示的に作成したキャッシュファイル
　path：App/tmp/cache/
```

```
_cake_core_Metrics（画面右上）
　CakePHPが自動生成するキャッシュファイル
　path：App/tmp/cache/persistent/
```

```
_cake_model_Metrics（画面左下）
　CakePHPが自動生成するキャッシュファイル
　path：App/tmp/cache/models/
```

が表示されており、今表示しているページでのキャッシュの操作（Write/delete/read/hit/miss）の回数が表記されています。


そしてこれがが面白機能になるのですが

この画面からキャッシュファイルが削除ができます。


`clear xxxxxx cache`というボタンを押すと対応するpath配下のファイルを削除してくれます。

（正確には命名規則に沿ったファイルのみを削除します）

今まではcache以下が残ってて動作が怪しいからファイルを削除して確認ということをコマンドで削除していましたがcakephp3からはそんな事をしなくても良いわけですね（地味に素晴らしい）


ということでcakephp3のDebug_Kitは便利になってますよという紹介でした。
RegistratorでSSLクライアント認証つきのetcdを使う

etcdクラスタを構成している場合など、認証なしでetcdを公開するのは危険すぎるので、SSLによるクライアント認証を使います。ところが、Registratorのetcdアダプタのソースを見たところ、無情にも[`http://`で決め打ち](https://github.com/gliderlabs/registrator/blob/640360bf7cf44a62d0bb6ee81e2c7bd377ed4914/etcd/etcd.go#L23)になっています。

しかたがないので、SSLを使えるように`etcds`というアダプタを追加し、`etcds://<etcd ip addr>:<port>` のように指定できるようにしました[PR-253](https://github.com/gliderlabs/registrator/pull/253)
証明書とクライアントの鍵ペアは以下の環境変数で指定します。

 * `ETCD_CAFILE`
 * `ETCD_CERTFILE`
 * `ETCD_KEYFILE`

dockerhubにも置いておきました。[s21g/registrator](https://hub.docker.com/r/s21g/registrator/)
node.jsでsocket.io利用のHTTPサーバーを立てる簡単な方法


# HTTP サーバー
node.jsは動的なウェブサービスのフレームワークなので、いわゆる普通のHTTPサーバーとして単に静的コンテンツを提供するためには少しコードを書く必要がある。
node.js上のHTTPサーバー[senchalabs/connect](https://github.com/senchalabs/connect)にミドルウェア[expressjs/serve-static](https://github.com/expressjs/serve-static)を入れて使うと簡単にできて、拡張もし易い。
作業ディレクトリ下の/wwwをHTTPサーバーで公開するコードは以下のようになる。

```javascript:server
var listeningPort = 8080;
var uiDir = __dirname + '/www';

var http = require('http');
var connect = require('connect');
var serveStatic = require('serve-static');
var app = connect();
app.use(serveStatic(uiDir));
var server = http.createServer(app);
server.listen(listeningPort);
console.log('Listening on port: ' + listeningPort);
```
(注意: connect v3からミドルウェアの追加方法が変更されている[senchalabs/connect#middleware](https://github.com/senchalabs/connect#middleware))

# socket.io
これに[Socket.IO](http://socket.io/) v1を組み合わせるのは以下のコードを追加すれば良い。
(注意: socket.io v0.9以前ではインスタンス生成コードが異なる)

```javascript:server
var io = require('socket.io')(server);

io.on('connection', function (socket) {
	socket.emit("emitEvent", data);
	socket.on("listenEvent", function(data){});
}
```

クライアント側には以下のコードを入れる。

```javascript:client
<script src="/socket.io/socket.io.js"></script>
<script>
var socket = io();
socket.emit("emitEvent", data);
socket.on("listenEvent", function(data){});
</script>
```
Skypeを２つ立ち上げる方法[Mac]

### 手順
以下の内容のシェルスクリプトを作成して実行する

``` skype2.sh
sudo /Applications/Skype.app/Contents/MacOS/Skype /secondary && exit
```

実行するとSkypeのログイン画面が出てくる。
ログインが確認出来たらシェルスクリプト側はCtrl+Zで一時中断、bgを実行してbackgroudプロセスに移す。（ここは単にシェルを実行してるターミナルを閉じても良い）

### 便利に使うために
skype2.shを開くアプリケーションがデフォルトだとテキストエディタになってると思うので、これをターミナルにしておけばskype2.shをクリックするだけで実行できます。デスクトップに置くなりしておけば便利です。

### 注意点
普段使ってるSkypeの設定は引き継がれません。skype2.shで開いたskype内では設定は残るので、一度設定すれば次回以降に再度設定する必要は有りません。
xargsを使わずにBashのワンライナーでgrep find

あるパターンを含むファイル名と、パターンにマッチした部分のペアを出力したい時、

普通はxargsを使って、

```
find /path/to/target | xargs grep PATTERN
```

のようにしたり、gitレポジトリ配下であればgit grepしたりすると思います。

だからなんだというわけではないですが、xargsを使わずに以下のようにも書けます。

```
find /path/to/target -exec bash -c 'ARG={}; OUT=$(grep PATTERN $ARG); if [ $? -eq 0 ]; then echo $ARG:$OUT; fi' \;
```

xargsで出来ないことをやりたい、もっとカスタマイズしたい（そんな人いるのか？）人におすすめです。
gistを表示するためにbl.ocks.orgのChromeプラグインを入れました。

> この記事の内容は古くなったので、 http://qiita.com/pugiemonn/items/bdb69dcdb0e528fedbe6 こちらの手法のほうが良いと思います(☝ ՞ਊ ՞)

簡単なHTMLやJS、CSSをgistで試したいと考えていました。

# gistで記事を作成
https://gist.github.com/ からindex.htmlという名前のファイルを作成します。

試しに作った[ファイル](https://gist.github.com/pugiemonn/d74f4261f7bab86dd0ea)

# bl.ocks.orgにページが作成される
gistにファイルを作成すると、bl.ocks.org からgistページを表示できるようです。

# bl.ocks.orgのプラグインをいれる
bl.ocks.orgにはプラグインがあると書いてあります。ChromeとFirefoxがあるそうです。
https://github.com/mbostock/bl.ocks.org/blob/master/README.md

プラグインを入れてから、gistの試しに作った[ファイルページ](https://gist.github.com/pugiemonn/d74f4261f7bab86dd0ea)にアクセスします。

# bl.ocks.orgへのリンクができる
サイドバーに**bl.ocks.org**というボタンができています。
<img src="https://qiita-image-store.s3.amazonaws.com/0/1624/59fe5d6f-4e34-c887-4351-5918ef180918.png" width="50%" />
 
ボタンを押すと、
http://bl.ocks.org/pugiemonn/d74f4261f7bab86dd0ea へのリンクになっていました。

枠がないURLのパターンはリンクにならないんですね(^^ゞ 
http://bl.ocks.org/pugiemonn/raw/d74f4261f7bab86dd0ea/

# 参考

http://bl.ocks.org/
http://qiita.com/hnakamur/items/ad1346bc9cfb0288ff60
VirtuosoのCross-Origin Resource Sharing (CORS) 許可

Virtuosoデータベースエンジンへの問い合わせに対して、ブラウザ側に
```
XMLHttpRequest cannot load ... No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://example.com' is therefore not allowed access.
```
などとエラーがでる際の対処法。

1. ブラウザでConductorを開く。 http://localhost:8890/conductor/ などにアクセス。
2. ログインする。デフォルトではID:dba, password:dba。
3. 上部タブから「Web Application Server」を選択。
4. 上部タブから「Virtual Domains & Directories」を選択。
5. リストから「/sparql」の行の「Edit」を選択
6. 「Cross-Origine Resource Sharing」のテキストボックスに「*」を入力し、「Save Changes」をクリック。
Node.jsでExcelを使う(libxl)

    CentOS7とAmazon linux2015.03上でやりました。

libxlをnode.jsで使うための[libxlモジュール](https://www.npmjs.com/package/libxl)があります。素晴らしい！


```bash

npm install libxl
```

でさっくりといけます。ただしnpm@3だとエラーが出る。
それと、gcc-c++を入れないとコンパイル出来ないのでg++エラーが出る場合は

```bash
yum install gcc-c++
```

インストールすると自動的にlibxlもダウンロードしてくる。まあ、モジュールのコンパイルに必要だしね。
既にインストールされているならやり方はドキュメントに書いてあります。

実行する場合はlibxl.soがある場所をLD_LIBRARY_PATHを設定してあげる必要がある。自動でインストールされた場合 node_modules/libxl/deps/libxl/lib64に入っています。exportしてもいいけど下記の様にしても動きます。

```
LD_LIBRARY_PATH="`pwd`/node_modules/libxl/deps/libxl/lib64:$LD_LIBRARY_PATH" node demo.js
```

みたいな。既に使っているlibxl.soが/usr/local/lib64に入っていたら下記の様にすればいいし、

```
LD_LIBRARY_PATH="/usr/local/lib64:$LD_LIBRARY_PATH" node demo.js
```

一々LD_LIBRARY_PATHを書くのが面倒なら`/usr/lib64`にlibxl.soをコピーしちゃってもいけます。

ライセンスをもっているなら、下記の様にすれば認証通ります。めんどうなら、コンパイル時にごにょごにょっとやればいいらしいです。ドキュメントに書いてあります。

```js
    var xl = require('libxl');
    var book = new xl.Book(xl.BOOK_TYPE_XLSX);
    book.setKey("hogehogehogehoge", "linux-xxxxxxxxxxxxxxxxxxxxxxxxx");
```


node.jsでエクセルファイル作れて楽しいです。
solr 3.6インストール

## 参考

* [ubuntuでsolr動かしてみる。 - podhmoの日記](http://d.hatena.ne.jp/podhmo/20120420/1334889220)

## インストール

```bash:
sudo apt-get install -y solr-tomcat
```

## 画面確認

* http://localhost:8080/solr にアクセス

![s1.png](https://qiita-image-store.s3.amazonaws.com/0/25728/8f4552d0-99c0-f389-b7ff-59c5a80020d0.png)

* `Solr Admin`をクリック

![s2.png](https://qiita-image-store.s3.amazonaws.com/0/25728/f7df7967-f8b9-7c4a-bee6-e474931c959b.png)

* Search を押すと検索ができる様子。

## 設定修正

```xml:/etc/solr/conf/schema.xml
<?xml version="1.0" encoding="UTF-8" ?>
<schema name="example" version="1.4">
  <types>
    <!-- The StrField type is not analyzed, but indexed/stored verbatim. -->
    <fieldType name="string" class="solr.StrField" sortMissingLast="true" omitNorms="true"/>
    <fieldType name="long" class="solr.TrieLongField" precisionStep="0" omitNorms="true" positionIncrementGap="0"/>
    <fieldType name="text_ja" class="solr.TextField" positionIncrementGap="100">
      <analyzer>
        <tokenizer class="solr.CJKTokenizerFactory"/>
      </analyzer>
    </fieldType>
  </types>
  <fields>
    <field name="id" type="string" indexed="true" stored="true" required="true" /> 
    <field name="title" type="text_ja" indexed="true" stored="true" />
    <field name="body" type="text_ja" indexed="true" stored="true" />
    
  </fields>
  <uniqueKey>id</uniqueKey>
  <defaultSearchField>body</defaultSearchField>
  <solrQueryParser defaultOperator="AND"/>
</schema>
```

```bash:
sudo /etc/init.d/tomcat6 restart
```

## データ投入

```bash:
sudo pip install solrpy
```

```py:a.py
# -*- coding: utf-8 -*-
import solr
s = solr.SolrConnection("http://localhost:8080/solr")
s.add(id=1, title=u"ja", body=u"日本語でおｋ")
s.commit()
```

```bash:
python a.py
```

## 確認

* Searchボタン押下

![s3.png](https://qiita-image-store.s3.amazonaws.com/0/25728/2c69da15-002f-5520-4e78-3dd47b5b5be2.png)

データが入っていることを確認
Docker+MySQL+rootユーザ

Dockerで本番環境ではなくテスト環境を構築したい。
その時のメモ。
一つのコンテナ内で完結させたかったので、MySQLイメージは使わない方法を使った。

# 事前準備

コンテナにattachした後。

```
# yum install mariadb-devel mariadb mariadb-server
```

などを実施しておく。

# MySQLはrootユーザで起動できないようになっている

起動しようとすると以下のようにエラーになる。

```
[root@9326224b98f7 home]# mysqld_safe &
150916 14:57:48 mysqld_safe Logging to '/var/log/mariadb/mariadb.log'.
150916 14:57:48 mysqld_safe Starting mysqld daemon with databases from /var/lib/mysql

150916 14:57:49 mysqld_safe mysqld from pid file /var/run/mariadb/mariadb.pid ended
```

テスト環境であればrootで実行しても問題ないので、
これを回避するために--user=rootオプションを使う。

```
[root@9326224b98f7 home]# mysqld_safe --user=root &
```

### 参考
http://dev.mysql.com/doc/mysql-security-excerpt/5.0/en/security-against-attack.html
https://mariadb.com/kb/en/mariadb/problem-while-starting-mariadb-server/
ESP8266のNodeMcuでiFttt

<a href=https://www.hackster.io/fablabeu/first-esp8266-and-ifttt-integration>ここ</a>をなぞって手入力でiFtttできたので、
<a href=https://github.com/4refr0nt/luatool>luatool.py</a>でluaファイルをアップロードして実行してみる。

★pyserialをいれておく必要がある
[参考](http://qiita.com/kosystem/items/0023cfee941fdf099087)
```
wget https://bootstrap.pypa.io/get-pip.py -O /tmp/get-pip.py
sudo python get-pip.py
sudo pip install pyserial
```

まずはifttt.luaファイルを作る
<pre>
conn=net.createConnection(net.TCP, 0)
conn:on("receive", function(conn, payload)
print(payload) 
end) 
conn:on("connection", function(c) 
print("connected")
conn:send("GET /trigger/test/with/key/YOURKEY HTTP/1.1\r\n") 
conn:send("Host: maker.ifttt.com\r\n")
conn:send("Accept: /\r\n") 
conn:send("User-Agent: Mozilla/4.0 (compatible; esp8266 Lua; Windows NT 5.)\r\n") 
conn:send("\r\n")
end)
conn:connect(80,'maker.ifttt.com') 
</pre>
luatoolでアップロードする
<pre>
$ luatool.py --port /dev/ttyUSB0 --src ifttt.lua ---dest ifttt.lua --virbose

以下でもいい
luatool.py -f ifttt.lua -v
</pre>
シリアルコンソールから実行
<pre>
&gt; dofile("ifttt.lua")
</pre>
iPhoneに通知が来ました！

ついでに、
<a href=https://github.com/nodemcu/nodemcu-firmware/wiki/nodemcu_api_en#nodeoutput>telnet.lua</a>をアップロードする

telnet.lua
<pre>
-- a simple telnet server
print("start simple telnet server at port 2323")
s=net.createServer(net.TCP)
s:listen(2323,function(c)
print("connected")
con_std = c
function s_output(str)
if(con_std~=nil)
then con_std:send(str)
end
end
node.output(s_output, 0) -- re-direct output to function s_ouput.
c:on("receive",function(c,l)
node.input(l) -- works like pcall(loadstring(l)) but support multiple separate line
end)
c:on("disconnection",function(c)
print("disconnected")
con_std = nil
node.output(nil) -- un-regist the redirect output function, output goes to serial
end)
end)
</pre>
シリアルコンソールから実行して、
telnetで繋げてみる(netcatでもいい)

ifttt.luaを実行
サーバーとクライアントを同時にできました！
予告:DockerでOracle Weblogic Serverコンテナを作成。本番環境を目指して

OracleからWeblogic構築用のDockerfiles、その他設定用スクリプトなどが公開されています。

https://github.com/oracle/docker/tree/master/OracleWebLogic/


これを、前回作成したAtomicHostのBaseBoxの上に構築しようと思います。
せっかくなので、本番運用を想定しながら、下記のポイントを順を追って進めて行きたいと思います。


* 単体でのWeblogicコンテナ構築
* １ホスト上に複数のWeblogicコンテナを構築
* Kubernetesから複数ホスト上のWeblogicコンテナを配置（出来ればLBも）
* コンテナやホストの監視（[参考](http://inokara.hateblo.jp/entry/2015/08/04/135820)）
* Weblogicコンテナ全台のログを収集
* 障害時の自動復旧
* Private registoryを構築＆利用する
* CI導入
* ZDT（ゼロダウンタイム）でデプロイ
* 性能検証など

これくらいやると、かなり本番運用がイメージできるんじゃないかなと思います。


出来れば、1台の作業用PCの上で完結する方向で、dockerのリソース消費なども合わせて検証しながら進めたいものです。
技術英語 > by や at は無冠詞が好まれ、on や inは定冠詞が好まれます

引用: 冠詞マスター教本 by 石井隆之さん
>by や at は無冠詞が好まれ、on や inは定冠詞が好まれます。
...
by car
by air
by mail
at dawn
at noon
...
on/over the telephone
in/during the night
in the dusk

もちろん例外はある (There's no rule without exceptions)。
at the beginning
など

<hr>

onとinで関連して思い出したのは

mirror, mirror on the wall...: 白雪姫に出るばあさんのセリフ

first thing in the morning (朝一でやります!)

in the first place (最初の段階で / そもそも)
Doma2 と Spring で複数データソースを同時に扱う

 
DI コンテナに Spring を利用した場合に Doma2 で複数のデータソースを使おうとしたら、ハマったので。


要件
-----

- 複数のデータソースに対し Doma の Dao で操作したい。
- DB 接続情報を記載した設定ファイルのロードは Spring にあやかりたい。


うまくいった方法
---------------

必要な DataSource ぶんの Config を返す Bean アノテーションのついたメソッドを定義。通常 AppConfig みたいな名前のクラスに実装しがちなあれ。

このメソッド名はのちに Qualifier で指定することになる。

```java
@Bean
public Config mainDbConfig() {
    return new Config() {
        // データソースかえしたりする.
    };
}
```

Doma の Dao のインタフェースに以下のアノテーションを付ける。
最後の elements で指定している部分が、上で定義したメソッド名になる。

通常1つのデータソースに複数 Dao クラスが存在すると思うので、別のわかりやすいアノテーションを定義して、それをそれぞれの Dao クラスに付与することになると思う。

```java
@AnnotateWith(annotations = {
		@Annotation(target = AnnotationTarget.CLASS, type = Repository.class),
		@Annotation(target = AnnotationTarget.CONSTRUCTOR, type = Autowired.class),
		@Annotation(target = AnnotationTarget.CONSTRUCTOR_PARAMETER, type = Qualifier.class, elements = "\"mainDbConfig\"")
})
@Dao
public interface HogeDao {
```

すると、Doma により以下の様なコンストラクタを持つ HogeDaoImpl が作られる。
(完全修飾名で読みづらい部分は端折た)

```java
@Autowired()
public HogeDaoImpl(@Qualifier("mainDbConfig") Config config) {
    super(config);
}
```

というわけで、Dao クラスのインスタンスが生成されるときに、コンストラクタに Qualifier で指定された Bean を渡してもらえる。


うまくいかなかった方法
--------------------

Dao アノテーションに Config を実装したクラスを

```java
@Dao(config = HogeConfig.class)
```

とするような方法をとろうと
org.seasar.doma.jdbc.Config を実装したクラスをデータソース分定義すると、

> No qualifying bean of type 〜

と Spring に怒られる。。。

Qualifier を XML に書いたりしてみてもうまく行かず。。。


???
-----

- Spring-load で実行すると挙動が不審? (動いてるようだけど度々例外が...)
文字列等のデータをファイルとしてダウンロードさせる関数


必要になったので書いてみました。
Google Chromeのコンソールで使うために書いたので、それ以外の環境での動作は保証しません。

```js
/**
 * @param {ArrayBuffer|ArrayBufferView|Blob|string} content ダウンロードさせるデータ
 * @param {string=} filename ファイル名。省略可
 * @param {string=} mimetype データのMIME Type。省略可
 * @see http://furudate.hatenablog.com/entry/2014/06/02/172923
 */
function downloadData(content, filename, mimetype) {
    if (arguments.length < 3) {
        mimetype = 'application/octet-stream';
    }

    var url = (window.URL || window.webkitURL).createObjectURL(new Blob([content], { 'type': mimetype }));
    var a = document.createElement('a');

    a.target = '_blank';
    a.download = filename || '';
    a.href = url;

    a.click();
}
```
ディレクトリの役割

/bin
  管理者と一般ユーザーの両方が使う基本的なコマンド。

/sbin

システムメンテナンスなどのコマンド。スーパーユーザーが使用する。

/dev

デバイス・ファイル
標準入出力装置を含めデバイスがファイルとして表現されている。

/etc
  ホストが使う設定ファイル。

/opt 
  パッケージのインストール場所。ローカルシステム向け。

/proc 

ハードウェア、メモリー、実行中のプロセス、などの情報をファイル化したもの

/usr
  読み出し可能かつ共有可能なファイル。

　　/usr/bin　シングルユーザーモードには不要なバイナリファイル
　　/usr/local　システム管理者がアプリケーションをインストールする場所
　　/usr/share　アーキテクチャに依存しないデータ

/tmp

   ゴミ箱
基本的にリブート時に削除される。

/var

  ホスト固有の可変データ（variable data）用領域
  ホストごとに用意する必要がある。当然、他ホストとの共有はできない。

　　/var/cache　一時的な記憶場所
　　/var/lock　ファイルの読み書きなどで排他制御を行う場合に使う。
　　/var/run　特定プロセスのプロセス番号を含んだファイルがほとんど。

注：これらは一部また一例です。

Filesystem Hierarchy Standard
http://www.pathname.com/fhs/

ファイルシステム階層標準の概要：Red Hat
https://access.redhat.com/documentation/ja-JP/Red_Hat_Enterprise_Linux/6/html/Storage_Administration_Guide/s1-filesystem-fhs.html
PATHを通すために環境変数の設定を理解する (Mac OS X)

前回の投稿

- [PATHを通すとは？ (Mac OS X)](http://qiita.com/soarflat/items/09be6ab9cd91d366bf71)

PATHを通すには特定のファイルに`export PATH=$PATH:追加したいコマンド検索パス`のような記述を追加するみたいですが、記述内容が理解できず「exportって何？何故$PATHを記述しているの？」状態だったのでそれに関しての備忘録です。

#PATHの通し方

`~/.bashrc`や`~/.bash_profile`に以下のコマンドを記述する。(記述はどちらかで良い。)

```bash:.bashrc
export PATH=$PATH:追加したいコマンド検索パス
```

```bash:.bash_profile
export PATH=$PATH:追加したいコマンド検索パス
```

記述後は編集したファイルに対して`source`コマンドを実行しないとPATHが通らない。

```bash:コマンド
source ~/.bashrc
source ~/.bash_profile
```

#exportコマンドとは？
以下のことができるコマンド

- 環境変数を**表示**する。
- 環境変数を**設定**する。

##環境変数を表示する
設定されている環境変数を表示する。

```bash:コマンド
export -p

#出力結果(一部のみ記載)
declare -x PATH="/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin"
declare -x LANG="ja_JP.UTF-8"
declare -x SHELL="/bin/bash"
```

##環境変数を設定する
たとえば`$ULB`という環境変数を設定したい場合、以下のように入力をする。

```bash:コマンド
export ULB=/usr/local/bin
```
結果は表示されないが、環境変数`$ULB`が設定されたので`echo $ULB`で確認できる。

```bash:コマンド
echo $ULB
/usr/local/bin #出力結果
```
設定した環境変数を利用してみる。

```bash:コマンド
#どちらのコマンドでも同じ結果が出力される。
ls /usr/local/bin
ls $ULB
```

##既に存在する環境変数を設定するとどうなるのか？
上書きされる。(再設定される。)

```bash:コマンド
echo $ULB
/usr/local/bin #出力結果

export ULB=/u/l/b

echo $ULB
/u/l/b #出力結果
```

#環境変数を削除したい
`unset`コマンドで環境変数を削除できる。先ほど設定した`$ULB`を削除したい場合、以下のように入力する。

```bash:コマンド
unset ULB #[$]は入力しなくて良い。

echo $ULB
#何も出力されない。
```
#exportを理解した上で再度PATHを通す記述を確認してみる
環境変数`$PATH`を上書き(再設定)している記述だった。

```bash
export PATH=$PATH:追加したいコマンド検索パス
```
`$PATH`を記述しなくても以下のように記述すれば同じ。

```bash
#現在$PATHに設定されているコマンド検索パスが以下の場合
#/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/sbin
#どちらの記述でも$PATHに設定されるコマンド検索パスは同じ。
export PATH=$PATH:追加したいコマンド検索パス
export PATH=/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/sbin:追加したいコマンド検索パス
```

#追加するコマンド検索パスの優先順位を高くしたい
コマンド検索パスには優先度があり、`echo $PATH`で出力された左から優先されるため、
追加するコマンド検索パスの優先度を高くしたい場合、以下のように記述する。

```bash
export PATH=追加したいコマンド検索パス:$PATH
```

# そもそも.bash_profile、.bashrcとは？
- [.bash_profile ? .bashrc ? いろいろあるけどこいつらなにもの？](http://qiita.com/hirokishirai/items/5a529c8395c4b336bf31)
- [本当に正しい .bashrc と .bash_profile の使ひ分け](http://qiita.com/magicant/items/d3bb7ea1192e63fba850)
- [.bash_profileと.bashrcについて](http://qiita.com/shyamahira/items/260862743e4c9794b5d2)

## お知らせ

Udemy で webpack の講座を公開したり、Kindle で技術書を出版しています。

Udemy:
[webpack 最速入門](https://www.udemy.com/course/practical-webpack/?couponCode=B6D5AE3897554CBBDAD7)（**~~10,800 円~~ -> 2,000 円**）

Kindle（Kindle Unlimited だったら無料）:
[React Hooks 入門](https://www.amazon.co.jp/gp/product/B08JTXQ2M6)（500 円）

興味を持ってくださった方はご購入いただけると大変嬉しいです。よろしくお願いいたします。
NTEmacs + cygwin or msys2 で exec-path-from-shell

#exec-path-from-shell#
exec-path-from-shell (https://github.com/purcell/exec-path-from-shell) は、GUI での起動時に、指定した環境変数をシェルから引き継いでくれます。楽チンです。
詳細は以下のリンクを参照
http://qiita.com/catatsuy/items/3dda714f4c60c435bb25
http://syohex.hatenablog.com/entry/20130718/1374154709

ただし、windows はサポートしてないし、そのままでは動きません。ですが、NTEmacs と cygwin/msys2 を楽して連携したいので、それを何とかしてみます。

以下の環境で検証

* Windows 7、msys2、NTEmacs 24.5.1、exec-path-from-shell melpa の最新版

#パスの形式の問題#
cygwin/msys2 のシェルで扱うパスは unix 形式であり、cygwin or msys2 の環境変数もそうなっています。一方、NTEmacs は WIN32 アプリケーションのため unix 形式のパスは読み込めません。exec-path-from-shell がうまく動かない問題はこれが原因です。よって、 unix 形式のパス → windows 形式のパスのように変換できればいいわけです。

#cygpath#
cygwin/msys2 には unix 形式のパス と windows 形式のパスを相互に変換する cygpath コマンドがあります(詳細は以下のリンク参照)。
http://takuya-1st.hatenablog.jp/entry/20110910/1315644196

このリンク先には紹介されていませんが、`-p` オプションを使うと、環境変数で使われるパスのリストを一気に変換してくれます。

```bash
$ cygpath -amp "/bin:/usr/bin" # unix 形式のパスリスト
D:/msys64/usr/bin;D:/msys64/usr/bin # windows 形式のパスリスト

$ cygpath -aup "D:/msys64/usr/bin;D:/msys64/usr/bin" # windows 形式のパスリスト
/usr/bin:/usr/bin # unix 形式のパスリスト
```
よって cygpath を NTemacs から実行すればうまくいきそうです。

#NTEmacs の設定#
以上を踏まえて、init.el あたりに以下を設定すればいいようです。
注1) bash と cygpath のフルパスは各自の環境にあわせて変更してください
注2) cygwin でもおそらく動きますが、msys2 の設定部分はコメントアウトなりしてください
注3) NTEmacs 24.3 以前を使用している場合 新 advice は動作しないので 旧 advice に書き直しが必要。

```el:init.el
(setq shell-command-switch "-c")

;; シェルからの起動では exec-path-from-shell を実行しない
(let ((shell-level (getenv "SHLVL")))
  (when (or (not shell-level) (string= "0" shell-level))
    (when (eq system-type 'windows-nt)
	  ;; bash のフルパスを指定
	  (setq shell-file-name "d:/msys64/usr/bin/bash")
	  (defvar explicit-shell-file-name)
	  (setq explicit-shell-file-name shell-file-name)
	  (setenv "SHELL" shell-file-name)

	  ;; msys2 のみの設定 mingw64 とパスを共有
	  (setenv "MSYSTEM" "MINGW64")

	  ;; 環境変数 PATH のときのみパスの変換を実行
	  (defun ad-exec-path-from-shell-setenv (orig-fun &rest args)
		(when (string=  (car args) "PATH")
		  (setf (nth 1 args)
				(with-temp-buffer
				  (call-process "d:/msys64/usr/bin/cygpath" nil '(t nil) nil "-amp" (nth 1 args))
				  (unless (bobp)
					(goto-char (point-min))
					(buffer-substring-no-properties (point) (line-end-position))))))
		(apply orig-fun args))
	  (advice-add 'exec-path-from-shell-setenv :around 'ad-exec-path-from-shell-setenv))

	;; 引き継ぎたい環境変数を列挙
	(exec-path-from-shell-copy-envs '("PATH" "MANPATH" "PKG_CONFIG_PATH"))))
```
AWS CLI で現在停止中で30日以上前に起動されたインスタンスを取得するワンライナー


インスタンスが増えてくるとずっと止まりっぱなしで放置されているものもあるので、消すものを探す時の手助け的に。


ワンライナーといわれれば、ワンライナーって感じですね。
(実行環境はMac)


今回はあえて [jq](https://stedolan.github.io/jq/) を使わずに、 `--query` のみで書きました。
[AWS CLI公式ドキュメント](http://docs.aws.amazon.com/cli/latest/userguide/cli-chap-welcome.html)


## コマンド

```bash
$ ago=30;date -v-${ago}d > /dev/null 2>&1 && DATE=`date -v-${ago}d +%Y-%m-%d` || DATE=`date --date="-${ago} days" +%Y-%m-%d`; aws ec2 describe-instances --filter Name=instance-state-name,Values=stopped --query "Reservations[].Instances[?LaunchTime<='$DATE'][].{InstanceId: InstanceId,PrivateIpAddress: PrivateIpAddress,LaunchTime: LaunchTime}"
```

出力

```
[
    {
        "InstanceId": "i-4xxxxxb5",
        "LaunchTime": "2015-08-02T16:31:32.000Z",
        "PrivateIpAddress": "172.31.0.200"
    },
    {
        "InstanceId": "i-dxxxxx2e",
        "LaunchTime": "2015-06-20T09:32:45.000Z",
        "PrivateIpAddress": "172.31.0.79"
    }
]
```

一応

```bash
$ echo $DATE
>> 2015-08-18
```

## 60日以上前に起動されたインスタンス取得したい場合とか

最初の `ago=30` の部分を `ago=60` とかに変更すれば **60日前に起動された** インスタンスを取得できます。

その時の実行結果

```
[
    {
        "InstanceId": "i-dxxxxx2e",
        "LaunchTime": "2015-06-20T09:32:45.000Z",
        "PrivateIpAddress": "172.30.0.79"
    }
]
```

一応、日付の確認

```bash
$ echo $DATE
2015-07-19
```

## さいごに

パラメーター色々変えたりすればできます。あと、パースは jq 使ったほうが便利ですね。

本当は、`StateTransitionReason` とかみてもっと色々できるのかもしれません。
yumのアップデート

CentOS6.4でgnuplotを入れたかったが

"Error: Cannot retrieve metalink for repository: epel. Please verify its path and try again"と返された

こちらのサイトを参考にした
http://d.hatena.ne.jp/C_6B4A2B/20130427/1367073209

□superuserになる
su -
□yumのリポジトリの設定を変える
vi /etc/yum.repos.d/epel.repo

#baseurl=http://download.fedoraproject.org/pub/epel/6/$basearch
mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=epel-6&arch=$basearch

↓

baseurl=http://download.fedoraproject.org/pub/epel/6/$basearch
#mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=epel-6&arch=$basearch

※編集の仕方
insertキーで編集モードにする→basearchのコメントアウトの位置を変更→escapeキー→:wqを入力してセーブして終了

□yumのアップデート

yum update と入力

あとは指示通りに従っていけばOK。


とりあえず、とりあえずこれでgnuplotやaptなどがインストールできるようになった。
[aws-cli]はじめてのAWS CodeCommit

## IAMグループ作成
```
aws iam create-group --group-name codecommit_test
```

## IAMグループポリシー適応
```
aws iam attach-group-policy --group-name codecommit_test --policy-arn "arn:aws:iam::aws:policy/AWSCodeCommitPowerUser"
```

## IAMユーザ作成
```
aws iam create-user --user-name test_user_1
```

## IAMグループへユーザ追加
```
aws iam add-user-to-group --group-name codecommit_test --user-name test_user_1
```

## 公開鍵・秘密鍵作成
パスフレーズは不要。

```
ssh-keygen
```


## 公開鍵をコピー
```
cat codecommit_rsa.pub | pbcopy
```

## AWS CodeCommit用のIAMユーザのSSHキーアップロード
```
aws iam upload-ssh-public-key --ssh-public-key-body "ssh-rsa xxxxx" --user-name test_user_1
```

## ~/.ssh/configに追加
```
Host git-codecommit.*.amazonaws.com
  User [YOUR_SSH_KEY_ID_FROM_IAM]
  IdentityFile ~/.ssh/codecommit_rsa
```


## SSH接続確認
```
ssh git-codecommit.us-east-1.amazonaws.com
```


## AWS CodeCommitに新しいリポジトリ作成
```
aws codecommit create-repository --repository-name codecommit_test --repository-description "test repository" --region us-east-1
```

## AWS CodeCommitに新しいブランチ作成
```
aws codecommit create-branch --branch-name develop --repository-name codecommit_test --region us-east-1 --commit-id xxxxxxxxxxxx
```

## AWS CodeCommitのブランチ一覧確認
```
aws codecommit list-branches --repository-name codecommit_test --region us-east-1
```

## 料金
- アクティブなユーザー 1 人につき 1 USD/月

### アクティブなユーザー 1 人につき、以下を毎月ご利用になれます。
- 10 GB のストレージ/月
- 2,000 件の Git リクエスト