OmniAICreator/Qiita-1.07M huggingface dataset:
AutoHotKey で、日本語キーボードのホームポジションに引きこもりたい

#無変換で日本語/英語入力切替え
; 無変換 → 半角/全角
sc07B ::Send, {vkF3sc029}


#右手だけでカーソル操作、Delete、BackSpace
; 変換 + H → 左カーソル
vk1Csc079 & h:: Send,{Blind}{Left}
	
; 変換 + L → 右カーソル
vk1Csc079 & l::Send,{Blind}{Right}

; 変換 + J → 下カーソル
vk1Csc079 & j::Send,{Blind}{Down}

; 変換 + K → 上カーソルd
vk1Csc079 & k::Send,{Blind}{Up}

; 変換 + i → End
vk1Csc079 & i::Send,{Blind}{End}

; 変換 + u → Home
vk1Csc079 & u::Send,{Blind}{Home}

; カタカナ/ひらがな + J → PageDown
sc070 & j::Send,{Blind}{PgDn}

; カタカナ/ひらがな + k → PageDown
sc070 & k::Send,{Blind}{PgUp}


#削除系
; 変換 + n → BackSpace
vk1Csc079 & n::Send {BackSpace}

; 変換 + m → Delete
vk1Csc079 & m::Send {Delete}

; 変換 + b → 行削除
vk1Csc079 & b::Send,{Blind}{End}+{Home}{delete}


#無変換キーとhjklで、ひらがな(F6)、全角カナ(F7)、半角カナ(F8)、半角英数字(F10)
; 無変換/ひらがな + i → F6
sc07B & h::Send,{F6}

; 無変換/ひらがな + i → F7
sc07B & j::Send,{F7}

; 無変換/ひらがな + k → F8
sc07B & k::Send,{F8}

; 無変換/ひらがな + l → F10
sc07B & l::Send,{F10}
Raspberry Pi3(ラズパイ)でpiユーザーの自動ログインを外す方法

# 環境
Raspberry Pi3でOSは以下の感じ。

```console
$ lsb_release -a
Distributor ID:	Raspbian
Description:	Raspbian GNU/Linux 8.0 (jessie)
Release:	8.0
Codename:	jessie
```

# 状況
- ラズパイのセキュリティーを高めるために、新しいユーザーを作成し、piユーザーの名前を変えようとした所、プロセスが動いているというエラーがでた。

```console
$ sudo usermod -l adm pi
usermod: user pi is currently used by process 1061
```

- processをキルしてみるも、すぐさま別のプロセスで起動

```console
$ sudo kill -9 1061

$ sudo usermod -l admin pi
usermod: user pi is currently used by process 1062
```

- piユーザーでログインして、exitコマンドでログアウトし、別のユーザーでログインしてみるもpiユーザーは健在。

```console
$ who
pi       tty1         2017-09-02 19:04
newuser  pts/0        2017-09-02 19:07 
```

# 前提
sudo権限を付与した、piユーザーの名前を変更する為のユーザー(ex. newuser)を作成済み。

# 対処
色々調べて見たら、以下の処理でなんとかなった。

```console
$ sudo vim /etc/lightdm/lightdm.conf 
autologin-user=pi
#autologin-user=pi
```
```console
$ sudo vim /etc/systemd/system/autologin@.service 
# ExecStart=-/sbin/agetty --autologin pi --noclear %I $TERM
ExecStart=-/sbin/agetty --autologin newuser --noclear %I $TERM
```

```console
$ sudo reboot
```

- newuserでログインし、whoコマンド確認。piユーザーから書き換わっていたらok。

```console
$ who
newuser    tty1         2017-09-02 19:33
newuser  pts/0        2017-09-02 19:34
```

自動ログインユーザーの変更はここまで。

# ユーザー名を変更する場合は、以下を実行


- あとはpiユーザーを好きな名前に変更

```console
$ sudo usermod -l adm pi
```
- ユーザー名を変更しただけだと、ファイル名は書き変わらないので、ホームディレクトリを/home/piから/home/admに変更

```sh
sudo usermod -d /home/adm -m adm
```

- piグループをadminグループに変更

```sh
sudo groupmod -n adm pi
```

- 必要に応じて、自動ログインするユーザーを元piユーザーに戻す

```console
$ sudo vim /etc/systemd/system/autologin@.service 
# ExecStart=-/sbin/agetty --autologin newuser --noclear %I $TERM
ExecStart=-/sbin/agetty --autologin adm --noclear %I $TERM
```

- 再度再起動して

```console
$ sudo reboot
```

- newuserでログインしてみると

```console
$ who
adm    tty1         2017-09-02 19:33
newuser  pts/0        2017-09-02 19:34
```

# 参考
- https://raspberrypi.stackexchange.com/questions/12827/change-default-username
- https://jyn.jp/raspberrypi-username-change/
- http://wings2fly.jp/yaneura/raspberry-pi-first-security-setting/
GMOクラウドVPSの初期設定メモ

VPSをレンタルしてみたので設定をメモしておきます。

今回は<a href="https://px.a8.net/svt/ejp?a8mat=2TN2C1+DYI2AI+2KX0+5YJRM" target="_blank" rel="nofollow">GMOクラウドのVPS</a><img border="0" width="1" height="1" src="https://www15.a8.net/0.gif?a8mat=2TN2C1+DYI2AI+2KX0+5YJRM" alt="">にしてみました。
入会金が他に比べて高いけど、一番安いメモリ1GBプランで780円からなのに惹かれました。

15日は無料で試用できます。

今回のOSはCentOS7.3です。

# インストールされているOSの確認
```
cat /etc/redhat-release
```
#rootパスワードの変更
```
初期設定されたrootでログイン後、
passwd
```
[rootのパスワード変更方法 – さくらのサポート情報](https://help.sakura.ad.jp/hc/ja/articles/206208141)

# 一般ユーザの追加
```
useradd ユーザ名
passwd ユーザ名
```
[一般ユーザの追加方法 – さくらのサポート情報](https://help.sakura.ad.jp/hc/ja/articles/206055882)

# sudoの設定
## 「sudo」を利用したい一般ユーザを「wheel」グループに所属させる
```
usermod -G wheel ユーザ名
```
## 「wheel」グループに所属するユーザが「sudo」を利用できるように設定を変更する
```
visudo

## Allows people in group wheel to run all commands 
# %wheel ALL=(ALL) ALL 
→## Allows people in group wheel to run all commands 
%wheel ALL=(ALL) ALL
```

# sudoの設定確認

一般ユーザでログイン後下記コマンドを実行
落ちたら手動でVPSを立ち上げなおして下さい

```
sudo shutdown -h now
```
[sudoの設定方法 – さくらのサポート情報](https://help.sakura.ad.jp/hc/ja/articles/206055842)

# システムのアップデート
```
yum -y update
```
[システムのアップデート方法 – さくらのサポート情報](https://help.sakura.ad.jp/hc/ja/articles/206055862)

# ファイアウォールの設定

CentOS7からiptablesのコマンドは使えないので下記を参考に設定

## firewallの自動起動設定
```
systemctl enable firewalld
```

## 自動起動設定を確認
```
systemctl is-enabled firewalld
```

## firewallのステータス表示
```
systemctl status firewalld
```
## firewallの起動
```
systemctl start firewalld
```
## firewallの停止
```
systemctl stop firewalld
```
## 有効な設定を確認
```
firewall-cmd --list-services --zone=public --permanent
```
## 設定を追加(http, https, ssh, mysql)
```
firewall-cmd --add-service=http --zone=public --permanent
firewall-cmd --add-service=https --zone=public --permanent
firewall-cmd --add-service=ssh --zone=public --permanent
```
[5分で終わらせるCentOS7のfirewalld設定](http://qiita.com/haminiku/items/56fcb578d86abcd0b571)
PostgreSQLにSSL接続する

# 公式サイト
[32.1. Database Connection Control Functions](https://www.postgresql.org/docs/current/static/libpq-connect.html)
[32\.1\. データベース接続制御関数](https://www.postgresql.jp/document/9.6/html/libpq-connect.html)

[32.18. SSL Support](https://www.postgresql.org/docs/current/static/libpq-ssl.html)
[32\.18\. SSLサポート](https://www.postgresql.jp/document/9.6/html/libpq-ssl.html)

# SSL接続する

## sslmode

### require


SSL接続のみ試行し、ルートCAファイルが存在する場合は、verify-caが指定されときと同じ方法で証明書を検証する。

```shell-session
$ psql 'postgres://<username>:<password>@<host>:<port>/<database>?sslmode=require'
```

### verify-ca


SSL接続のみ試行し、サーバー証明書が信頼できる認証局（CA）によって発行されていることを確認する。

```shell-session
$ psql 'postgres://<username>:<password>@<host>:<port>/<database>?sslmode=verify-ca'
```

### verify-full

SSL接続のみ試行し、サーバー証明書が信頼できるCAによって発行され、要求されたサーバーのホスト名が証明書のホスト名と一致することを確認する。

```shell-session
$ psql 'postgres://<username>:<password>@<host>:<port>/<database>?sslmode=verify-full'
```

# 接続モードの確認

SSL接続が有効であれば、接続した際にSSL接続の暗号化形式などが表示される。

```shell-session
$ psql postgres://<username>:<password>@<host>:<port>/<database>
psql (9.6.1)
SSL connection (protocol: TLSv1.2, cipher: ECDHE-RSA-AES256-GCM-SHA384, bits: 256, compression: off)
Type "help" for help.

xxxxx=>
```
Goのelasticパッケージを利用してDocker上のElasticsearchに接続する

## ハマった点
goでelasticsearchに接続する際に[olivere/elastic](https://github.com/olivere/elastic) プラグインを利用したけれど、ローカルのDockerで起動したelasticsearchに接続できなかったので調べると、SniffingをOFFにしなければいけないことがわかった。ソースは[ここ](https://github.com/olivere/elastic/wiki/Docker)にあるので気になる方はご覧ください。
簡単に言うと、docker containerにアクセスする時は、 `127.0.0.1:9200` => `172.0.0.2:9200（例）` みたいにIPがnatされているので、dockerからreturnされるIPは`172.0.0.2:9200`　になってて外からアクセスできない。SniffingをOFFにしないと`172.0.0.2:9200`　に接続しに行こうとして接続できないのでエラーとなる。

# 環境準備
### 実行環境
- Mac OS
- go1.9
- docker 17.06.1-ce

### elasticsearch (Dockerコンテナー)

```bash:
$ docker pull docker.elastic.co/elasticsearch/elasticsearch:5.5.2
$ docker run -it --rm -p 9200:9200 -p 9300:9300 \
    -e "http.host=0.0.0.0" -e "transport.host=127.0.0.1" \
    -e "xpack.security.enabled=false" --name news_search \
    -d docker.elastic.co/elasticsearch/elasticsearch:5.5.2
```

### elasticパッケージダウンロード
```go:
go get gopkg.in/olivere/elastic.v5
```

## デフォルトのコード実行
### コード内容
```go:main.go
//client, err := elastic.NewClient()
_, err :=elastic.NewClient()
if err != nil {
	panic(err)
}
```

### エラー内容
```go:
2017/09/02 19:07:17 http: panic serving [::1]:55010: no active connection found: no Elasticsearch node available
```

## SniffingをOFFにする
### コード内容
```go:main.go
//client, err := elastic.NewClient(elastic.SetSniff(false))
_, err :=elastic.NewClient(elastic.SetSniff(false))
	if err != nil {
		// Handle error
		panic(err)
	}
fmt.Println("connection OK!!")
```

これだとエラーにならず、接続ができる。
このエラーにハマった人がこの記事をみて5分で解決できたら嬉しい。
Pythonメモ Anaconda × Jupyter Notebook


<br><h4>Anaconda × Jupyter Notebook</h4>
　Anacondaで環境構築し、
　Jupyter NotebookでPythonを実行する。

　Anacondaのインストールは以下の方法。
　http://qiita.com/ShibaNDD/items/61624a947651caee40a0

　Anacondaの環境構築は以下の方法。
　http://qiita.com/ShibaNDD/items/dfbbb4e3bfa9f1218271

<br><h4>環境にJupyter Notebookをインストール</h4>
　1.Anaconda navigatorの[HOME]を選択。

　2.Application on [root] のrootの部分を自分の作成した環境を選択。

　3.Jupyter Notebookの[Install]をクリック。 

　4.Installが完了したら、[Launch]をクリックすると
　ターミナルとブラウザが立ち上がる。


<br><h4>Macでのエラー</h4>
```[C 18:56:36.621 NotebookApp] 
Copy/paste this URL into your browser when you connect for the first time,to login with a token:http://localhost:8890/token=9b9b7ec0b6788f321378138d423df62a13c05048ef89fc42```

上記のエラーはエラーコードに書いてあるURL(http://localhost:*****)
をブラウザでアクセスするとJupyterに移動することができる。

<br>

<br>
【linux】grepで前後の数行も取得する【コマンド】

すぐ忘れるのでメモ:pencil2:

# grepコマンドの-numオプション
```
# grep -3 "test"
```
「-3」を付けることで、検索文字列"test"の前後３行も表示します。
数字の部分を入れ替えれば、好きな行数が取得できます。
エラーログなんかは、前後数行が見れるだけでも違いますよね:sweat_drops:

## 前のn行が欲しい時
```
# grep -B 3 "test"
```
「**-B**」で前のn行を取得できます。
※上記サンプルでは３行

## 後ろのn行が欲しい時
```
# grep -A 5 "test"
```
「**-A**」で後ろのn行を取得できます。
※上記サンプルでは５行
HTTPクライアントライブラリFuelを初めて使ってみた


# Fuelとは？
Kotlin/Andorid用のHTTPクライアントライブラリです。
https://github.com/kittinunf/Fuel

簡単なコードでHTTP通信を行うことができます。KotlinでAndroidアプリを作成するときに活躍してくれそうです。
RxJava2に対応したAPIも提供しています。

# 導入方法
build.gradleに記述してSyncすればOK。

```groovy:build.gradle
dependencies {
    compile 'com.github.kittinunf.fuel:fuel:1.9.0'
    compile 'com.github.kittinunf.fuel:fuel-android:1.9.0'
}
```

# 使い方
GETリクエストの例です。郵便番号検索apiに対してGETしてみます。
http://zipcloud.ibsnet.co.jp/doc/api/search?zipcode={郵便番号}
郵便番号783060の住所を検索する場合
http://zipcloud.ibsnet.co.jp/api/search?zipcode=7830060
となります。

リクエストパラメータはPairのListで渡します。


```kotlin
fun get() {
        "http://zipcloud.ibsnet.co.jp/api/search".httpGet(listOf("zipcode" to "7830060")).responseJson { request, response, result ->
            when (result) {
                // ステータスコード 2xx
                is Result.Success -> {
                    val json = result.value.obj()
                    val results =json.get("results") as JSONArray
                    val data1 = results[0] as JSONObject
                    Log.d(TAG, data1["address1"]) // 高知県
                }
                // ステータスコード 2xx以外
                is Result.Failure -> {
                    // エラー処理
                }
            }
        }
    }
```

少ないコード量ですむのでよいと思います。実際にはレスポンスに対する処理はコールバックを
渡すようになると思います。

Rx Java対応のメソッドを試してた結果は次の記事に書きました。
[HTTPクライアントライブラリFuelを初めて使ってみた2 RXJava編](https://qiita.com/fanfanta/items/e924fff5c62dd1633110)
Linuxからwindowsのバッチを起動する

# Linuxからwindowsのバッチをリモートで起動する手順のメモ。

winexeを使うといいらしいのでwinexeをlinuxにインストール
ちなみにLinuxはAWSのEC2インスタンスでOSはAmazonLinux。

手順は以下
## winexeをインストール
1. wget http://sourceforge.net/projects/winexe/files/latest/download
1. # tar zxvf winexe-1.00.tar.gz
1. # cd winexe-1.00/source4/
1. # ./autogen.sh
1. # ./configure
1. # make
1. # make install

./autogenで下記のエラーが出る
> ./autogen.sh: need autoconf 2.53 or later to build samba from git

autoconfをインストールする必要があるらしい。。。
## autoconfをインストール
1. wget http://ftp.gnu.org/gnu/autoconf/autoconf-2.59.tar.gz
1. tar xvfz autoconf-2.59.tar.gz
1. cd autoconf-2.59
1. ./configure --prefix=/usr
1. make
1. make install

./configure --prefix=/usrで下記のエラーが出る
> configure: error: no acceptable m4 could be found in $PATH.

M4をインストールする必要があるらしい。。。

## M4をインストール
1. cd /usr/local/src
1. wget http://ftp.gnu.org/gnu/m4/m4-1.4.15.tar.gz
1. tar zxvf m4-1.4.15.tar.gz
1. cd m4-1.4.15
1. ./configure --prefix=/usr
1. make
1. make check
1. make install

./configure --prefix=/usrで下記のエラーが出る
> error: no acceptable C compiler found in $PATH

Cコンパイラをインストールする必要があるらしい。。。

## Cコンパイラをインストール
1. yum install gcc

これで手順を遡っていけばwinexeのインストールが完了できる。
winexeのconfigureが見つからなくて一瞬焦ったけどconfigure.developerでいいらしい。

## winexeのmakeでCan't locate getopts.pl in～

getopts.plといいうライブラリが@inc～に記述されているパスの配下に見つからないらしい。
どうやらgetopts.plというライブラリは古い様子。
宣言している部分の記述を書き換える必要がある。
エラーの出た箇所の修正：
>require 'getopts.pl';

から

>use Getopt::Std;

ついでにgetopsを使用している部分がGetopsと記述されていてコンパイルエラーになるのでgetopsに修正。

まさかコマンド一つ入れるのにこんなに疲れるとは。。。笑




参考：
> http://tetsuyai.hatenablog.com/entry/20110216/1297939037
facebookのプロフィール画像がデフォルトのシルエットか判別する方法


facebookアプリを開発していると、facebookのプロフィール画像が設定されていない場合に何か処理を行いたいときがあります。
しかしfacebookのプロフィール画像が設定されているか調べる方法が見つかりにくかったので、このエントリーで共有します。

プロフィール画像へのURLは`http://graph.facebook.com/<FacebookユーザーID>/picture`です。
そしてプロフ画像が設定されているか調べる方法は`?redirect=false`を追加して、次のURLにアクセスします。

```
http://graph.facebook.com/<FacebookユーザーID>/picture?redirect=false
```

すると以下のようなjsonレスポンスが返ってきます。
この`is_silhouette`が`true`だったら、プロフィール画像が設定されていない状態です。

```json
{
   "data": {
      "is_silhouette": false,
      "url": "https://scontent.xx.fbcdn.net/v/t1.0-1/p50x50/12803221_1204592706237252_3924866717269900224_n.jpg?oh=d0bd66a705863c3fa552877a704e0652&oe=5A54FA7E"
   }
}
```
node-jt400を試してみた（IFS read）

#IFS read
以下のJavaコードでIFS上に作成したファイル(SJIS,UTF8,UTF16)をNodeからReadしてみます。

```IfsWrite.java
public class IfsWrite {

	public static void main(String[] args) {
			AS400 as400  = new AS400("192.168.X.XXX" ,"MYUSER" ,"MYPASS");
			final String BR = System.getProperty("line.separator");

			IFSFileOutputStream fileutf8;
			IFSFileOutputStream fileutf16;
			IFSFileOutputStream filesjis;
			try {
				String str1 = "テスト文字列１行目abc";
				String str2 = "テスト文字列２行目ｱｲｳ";
				String str = str1 + BR + str2;

				byte[] utf8 = str.getBytes("UTF-8"); 
				byte[] utf16 = str.getBytes("UTF-16");
				byte[] sjis = str.getBytes(Charset.forName("Shift_JIS"));

				fileutf8 = new IFSFileOutputStream(as400, "/myIfsFolder/java-utf8.txt",IFSFileOutputStream.SHARE_ALL, true,1208);
				fileutf8.write(utf8);
				fileutf8.close();

				fileutf16 = new IFSFileOutputStream(as400, "/myIfsFolder/java-utf16.txt",IFSFileOutputStream.SHARE_ALL, true,1200);
				fileutf16.write(utf16);
				fileutf16.close();

				filesjis = new IFSFileOutputStream(as400, "/myIfsFolder/java-sjis.txt",IFSFileOutputStream.SHARE_ALL, true,932);
				filesjis.write(sjis);
				filesjis.close();

			} catch (AS400SecurityException e) {
				e.printStackTrace();
			} catch (IOException e) {
				e.printStackTrace();
			}
	}
}
```

文字コードの変換に、iconv-liteを使用していますのでインストールしてから実行して下さい。

```
npm install iconv-lite
```

```IfsRaed.JS
var jt400 = require("node-jt400");
var express = require("express");
var iconv = require('iconv-lite');
var app = express();

var pool = jt400.pool({ host: '192.168.X.XXX', user: 'MYUSER', password: 'MYPASS' });

var server = app.listen(8888, function () {
  console.log("curl http://localhost:" + server.address().port + '/~');
});

app.get("/ifsReadSjis", function (req, res, next) {
  const ifs = pool.ifs();
  let ifsReadableStream = ifs.createReadStream("/myIfsFolder/java-sjis.txt").pipe(iconv.decodeStream("Shift_JIS"));
  let buffer = "";
  ifsReadableStream.on("data", (chunk) => {
    buffer += chunk;
  });
  ifsReadableStream.on("end", function () {
    res.send(buffer);
  });
});

app.get("/ifsReadUtf8", function (req, res, next) {
  const ifs = pool.ifs();
  let ifsReadableStream = ifs.createReadStream("/myIfsFolder/java-utf8.txt").pipe(iconv.decodeStream("UTF-8"));
  let buffer = "";
  ifsReadableStream.on("data", (chunk) => {
    buffer += chunk;
  });
  ifsReadableStream.on("end", function () {
    res.send(buffer);
  });
});

app.get("/ifsReadUtf16", function (req, res, next) {
  const ifs = pool.ifs();
  let ifsReadableStream = ifs.createReadStream("/myIfsFolder/java-utf16.txt").pipe(iconv.decodeStream("UTF-16"));
  let buffer = "";
  ifsReadableStream.on("data", (chunk) => {
    buffer += chunk;
  });
  ifsReadableStream.on("end", function () {
    res.send(buffer);
  });
});
```
実行結果です。

<img width="527" alt="nodejt25.png" src="https://qiita-image-store.s3.amazonaws.com/0/146069/08fb35d7-fde7-6844-0b50-5b6e2edc6455.png">
Power Shell でフォルダ内のzipファイルをリストアップする


# やりたいこと
たくさんダウンロードしたので、まとめて処理したい。
指定フォルダ内にある、zipファイルの一覧を取得したい。

# コード
```ps1
$items = Get-ChildItem "C:\Users\xxx\Downloads" -Filter *.zip
foreach ($item in $items) {
	Write-Output ( $item.fullname )
}
```

# 要点
- Get-ChildItem でファイル一覧が取得できる。
- -Filter *.zip で絞り込める
- foreach でループさせる。
- .fullname でフルパスを取得できる。
オフラインリアルタイムどう書くE17の問題をRubyで解く

問題はこちら
http://nabetani.sakura.ne.jp/hena/orde17palin/

``` rb
def gen_kaibun_num(n,b)
  d,m = n.divmod(2)
  return (0...b).map{|e| e.to_s(b)} if d == 0
  s_min = '1'+'0'*(d-1)
  s_max = (b-1).to_s(b)*d
  kns = []
  (s_min.to_i(b)..s_max.to_i(b)).each{|e|
    s = e.to_s(b)
    if m > 0
      (0...b).each {|c|
        kns << s + c.to_s(b) + s.reverse
      }
    else
      kns << s + s.reverse
    end
  }
  kns
end

def solve(q)
  x,y,b = q.split(',').map(&:to_i)
  c = 0
  xb = x.to_s(b)
  yb = (y-1).to_s(b)
  (xb.size..yb.size).each {|n|
    gen_kaibun_num(n,b).each{|e|
      kn = e.to_i(b)
      c += 1 if kn >=x && kn < y
    }
  }
  c
end

DATA.readlines.each do |line|
  no,q,a = line.strip.split(/\s+/)
  ans = solve(q)
  print no + "\t" + ans.to_s
  puts ans == a.to_i ? ' o' : ' x'
end
__END__
0	12,34,5	5
1	10,11,10	0
2	1,100,3	18
3	11,12,10	1
4	12,13,10	0
5	123,456,7	33
6	38,274,14	17
7	98,76543,2	535
8	987,6543,2	103
9	5057,5202,3	2
10	98,76543,21	589
11	987,6543,21	264
12	1097,2889,11	35
13	2764,6482,17	132
14	16333,24085,8	121
15	21759,67173,20	114
16	32026,57805,22	53
17	188318,407853,6	523
18	51669,116065,30	72
19	294104,515248,32	216
20	444257,740280,15	1316
21	645098,2741620,9	2876
22	12345,987654321,2	62684
23	2467130,8433468,2	2902
24	323901,4712975,10	4389
25	12345,987654321,36	67446
26	3969344,4086910,24	205
27	19743263,83912295,5	11553
28	6349529,39870823,10	6637
29	66160071,153732445,5	5605
30	18799557,189007582,14	33741
31	78547566,225312226,20	18346
32	143084571,506549072,18	62323
33	2099642384,2789567569,6	14787
```
Emacsの設定ほしいものメモ

# 欲しい機能
 * [helm](http://qiita.com/jabberwocky0139/items/86df1d3108e147c69e2c)
    * ag(http://emacs-jp.github.io/packages/helm/helm-ag)
    * 履歴・recentの検索。ディレクトリの検索結果も出す
    * https://www.youtube.com/watch?v=k78f8NYYIto
    * http://emacs.rubikitch.com/helm-ag/
 * プロジェクト管理https://tech.camph.net/projectile-and-helm/
    * プロジェクト内のソースgrep
    * プロジェクト内のファイル名検索
    * シンボル検索
    * プロジェクト内の定数等のautocomplete
        * http://emacs.rubikitch.com/company/ ←?
 * プラグイン管理
 * 保存時に自動でなにかするけい[super save](https://github.com/bbatsov/super-save)
    * 保存時の最後の行の自動追加
    * 保存時に行末の空白を削除
    * 保存時にソースレイアウトの自動調整
    * 保存時にソース内の全角空白の半角化
 * ペースト時にソースレイアウトの自動調整
 * 入力時にソースレイアウトの自動調整
 * 関数(定数定義)ジャンプ
    * http://emacs.rubikitch.com/dumb-jump/
 * zsh補完しまくるくらいのがほしい
 * source tree
 * 再度開いた時に以前の状態を復元
 * additional
    * https://github.com/emacs-jp/emacs-jp.github.com/issues/38
    * http://qiita.com/itome0403/items/cd481bf505a34282b5b3
    * http://qiita.com/itome0403/items/05dc50f6bfbdfb04c0cf

# というかこういったIDEのショトカのきのうほしす

http://qiita.com/naru0504/items/99495c4482cd158ddca8
文系出身エンジニアが入社半年でJava Silverに合格した方法

#記事の目的
先日受けたJavaSilver、無事合格できました。
(得点率は72%)

それも、入社までJavaに触ったことはなく、
研修で学んだときもちんぷんかん、
しかも現場開発未経験の私が、です！

Javaに苦しんでいる文系SEや、
コーディング大好きだけどSiilverでは良い点数がとれない…
と悩んでいる方がこの記事を読んで、
少しでも合格の道に進んでもらえばと思い、
記事を書くことにしました。

どうかみなさんの参考になりますように・・・！



#使った参考書
[オラクル認定資格教科書 Javaプログラマ Silver SE 8　(紫本)](https://www.amazon.co.jp/dp/B01BLCJ984/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1)

[徹底攻略 Java SE 8 Silver 問題集[1Z0-808]対応(黒本)](https://www.amazon.co.jp/%E5%BE%B9%E5%BA%95%E6%94%BB%E7%95%A5Java-SE-8-Silver%E5%95%8F%E9%A1%8C%E9%9B%86%EF%BC%BB1Z0-808%EF%BC%BD%E5%AF%BE%E5%BF%9C-%E5%BE%B9%E5%BA%95%E6%94%BB%E7%95%A5%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA-ebook/dp/B01ASGJYIE/ref=sr_1_1?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&keywords=%E5%BE%B9%E5%BA%95%E6%94%BB%E7%95%A5+Java+SE+8+Silver+%E5%95%8F%E9%A1%8C%E9%9B%86%5B1Z0-808%5D%E5%AF%BE%E5%BF%9C&qid=1563609042&s=digital-text&sr=1-1)


紫本は、説明を読むように使うといいです。
シンプルに書かれているので、
手っ取り早く要点を掴むには最適。

・・・が、
経験値の少ない私にとってはところどころ説明が難しく、
諦めの道に走りそうになることもしばしば…

そんなときには、
・できる友達に教えてもらう(笑)
・スッキリわかるJava入門 第2版 (スッキリシリーズ) 　を読む
のどちらかが良いでしょう。

紫本の問題は、解説が非常に不親切なので、
問題演習の際には、
黒本を解くことをお勧めします！

黒本の解説は初心者の私でも
十分理解できるほど説明が丁寧です。

#学習時間・方法
平日は勤務前と勤務後1時間ずつで1日2時間、
週末は土日どちらか丸一日を勉強に費やす、
ということを1ヶ月半続けました！
全学習時間は110時間ほど。


勉強方法は・・・

試験を終えた私がお勧めしたいのは
「**紫本の解説を1章ずつ読み終えた後、
黒本で該当範囲の問題を解く**」です。


理由は次で解説します。


#必ず合格するには？
キーは、**問題演習は黒本のみでok**ということ。

タネ明かしのようになりますが、
当日の試験で出てきた問題はどれも、
黒本の巻末模試に出ていた問題・・・？！
と思ってしまうほど類似問題ばかりでした。

私は試験前日に巻末模試を解き、
間違えたところを潰せないまま
本番のテストに挑んでしまったので、
得点率は少し低めですが、
巻末模試を何度も何度も繰り返して解けば、
得点率85%は余裕でこえると思います。

なので、正直言うと、

合格のためなら黒本を買って
巻末模試を解くだけで十分です。

でも、
私のように開発経験がなかったり、
Java初心者の場合は、
**きちんと紫本で分野ごとの説明を読みながら、黒本を最初から解くこと**
をおすすめします。
黒本は問題とその解説しか載っていないからです。

大切な時間を使って勉強するなら、
試験に受かるための勉強ではなく、
少しでも自分に身につく
スキルを勉強する方が一石二鳥ですよねっ！

なので、ぜひ初心者の方は、
黒本の巻末模試だけ・・・と言わず、
ご紹介した勉強方法で進めてみてくださいね！

みなさんがJavaSilver合格も
自分自身のスキルアップも目指して、
有意義な勉強時間を過ごせますように！
curlやwgetで公開済みGoogle Driveデータをダウンロードする

サーバー上での作業などで，とりあえずcurlとかwgetでGoogle Drive上の一般公開されているデータをダウンロードしたいといったときの対処方法です．

## ファイルサイズが小さい場合

ファイルを右クリック > 共有可能なリンクを取得 > FILE_ID("id="以降の文字列)を取得し，

```bash
wget "https://drive.google.com/uc?export=download&id=<FILE_ID>" -O <FILE_NAME>
```

の形式でダウンロードすることができます．

![image.png](https://qiita-image-store.s3.amazonaws.com/0/107399/aa14d3e2-951d-9147-d833-270541a54707.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/107399/0d8297e7-fc80-095d-1fb8-359f499db21d.png)

### 例: CRF++のダウンロード

Google Driveにアクセスしてみると

https://drive.google.com/drive/u/1/folders/0B4y35FiV1wh7fngteFhHQUN2Y1B5eUJBNHZUemJYQV9VWlBUb3JlX0xBdWVZTWtSbVBneU0

共有可能なリンクは

```
https://drive.google.com/open?id=0B4y35FiV1wh7QVR6VXJ5dWExSTQ
```

となっているので，

```bash
wget "https://drive.google.com/uc?export=download&id=0B4y35FiV1wh7QVR6VXJ5dWExSTQ" -O CRF++-0.58.tar.gz
```

とすればダウンロードできます．

## ファイルサイズが大きい場合

ファイルサイズの小さい場合と手順は同じですが，「ファイルのウイルス スキャンが実行できません」という確認ダイアログが出るため，もう一手間必要になります．

![image.png](https://qiita-image-store.s3.amazonaws.com/0/107399/176b6f75-049c-dc7b-1a80-f3713625354e.png)

中身を調べてみるとconfirm=XXXXという四文字のランダムな文字列が追加で必要とわかるので，

```bash
curl -sc /tmp/cookie "https://drive.google.com/uc?export=download&id=<FILE_ID>" > /dev/null
CODE="$(awk '/_warning_/ {print $NF}' /tmp/cookie)"  
curl -Lb /tmp/cookie "https://drive.google.com/uc?export=download&confirm=${CODE}&id=<FILE_ID>" -o <FILE_NAME>
```

として4文字のパスを引っこ抜く処理を追加すればダウンロードできます．

### 例: CaboChaのダウンロード

cabocha-0.69.tar.bz2をダウンロードする例です．

https://drive.google.com/drive/u/1/folders/0B4y35FiV1wh7cGRCUUJHVTNJRnM

からFILE_ID="0B4y35FiV1wh7SDd1Q1dUQkZQaUU"を入手します．

```
FILE_ID=0B4y35FiV1wh7SDd1Q1dUQkZQaUU
FILE_NAME=cabocha-0.69.tar.bz2
curl -sc /tmp/cookie "https://drive.google.com/uc?export=download&id=${FILE_ID}" > /dev/null
CODE="$(awk '/_warning_/ {print $NF}' /tmp/cookie)"  
curl -Lb /tmp/cookie "https://drive.google.com/uc?export=download&confirm=${CODE}&id=${FILE_ID}" -o ${FILE_NAME}
```
Reactの勉強メモ(随時更新)

# Reactやるよ！
随時更新するよ！

## 背景
フロントだと手数が少なくて考えることが多くてつらい
 - というか単純にフロントで「状態」を持てるのが非常に魅力的

## 目的
Reactにすることで自分の手数を増やしてタスクを減らす

## 参考図書/サイト(予定)
 * [Reactビギナーズガイド ――コンポーネントベースのフロントエンド開発入門](https://www.oreilly.co.jp/books/9784873117881/)
    * オライリーの一番新しそうなやつ
 * [React + Typescriptシリーズ（随時更新）](http://qiita.com/uryyyyyyy/items/1f2022bbf914d65d635a#_reference-0d5d4397d0778d6ecd48)
    * React + typescriptだけではなくて、状態管理フレームワークのreduxも扱ってたりしててよい。
[git] git-completion.bash のゆくえ

``git 2.7.5`` のタブ補完スクリプトは、下記の位置にありました。

``/usr/share/doc/git-2.7.5/contrib/completion/git-completion.bash``

``yum``で``2.13.5``にアップデートしたら、``contrib``ディレクトリがなくなってました。。

しかたないので、``github``から``git``レポジトリをクローンしてきました。

```shell-session
$ cd
$ git clone https://github.com/git/git.git
$ cd git/
$ git co v2.13.5
$ vi ~/.bash_profile

# git completion
#. /usr/share/doc/git-2.7.5/contrib/completion/git-completion.bash
. $HOME/git/contrib/completion/git-completion.bash

$ . ~/.bash_profile
```

以上。
[Tips]fishを起動すると表示されるメッセージを変える

fishを起動すると以下のようなメッセージが表示されます。

```
Welcome to fish, the friendly interactive shell
```

## Remove greeting messsage
これは下記のようにして消すことができます。

```
$ set fish_greeting
```


初期状態でfish_greetingという関数にメッセージが設定されていますが、ここに空の値をセットするイメージです。

## Change greeting message
また、自分の好きなメッセージに変更することもできます。

```:fish_greeting.fish
function fish_greeting
	echo "今日も1日がんばるぞい"
end
```

またfishの問題ではないのですが、 ターミナルを起動すると表示される`Last login: Tue Jun 22 10:59:29 on ttys003` のようなメッセージを消したい場合は以下のようにすると良いようです。

```
$ touch ~/.hushlogin // 空のファイルを作成しログインメッセージを上書きする
```


### Refer the link below:
[fish: Frequently Asked Questions](https://fishshell.com/docs/current/faq.html)

[Remove the “Last login” Message from the Terminal](http://osxdaily.com/2010/06/22/remove-the-last-login-message-from-the-terminal/)
オフラインリアルタイムどう書くE17の問題


オフラインでリアルタイムに「どう書く」をやるイベント( https://yhpg.doorkeeper.jp/events/63700 )を行っています。

問題は「回文数の数」という名前で、詳細は
http://nabetani.sakura.ne.jp/hena/orde17palin/
です。

出題者の気分としては、問題を読み始めてから解けるまで1時間あればなんとかなると思ってますが、ひとそれぞれで。

実装ができた方はこちらのコメント欄からリンクを張っていただくと見つけやすくて助かります。

似たような問題をもっと解きたいという方は、https://nabetani.hatenadiary.com/entry/yhpg_list
に過去問リンク集がありますので、そちらをご覧になると良いと思います。
Power Shell 指定期間の日数を求める。

```ps1
# 対象期間
$startDate = [DateTime]"2017/01/01"
$endDate = [DateTime]"2017/09/01"

$dist = New-TimeSpan $startDate $endDate
```

結果
```ps1
Days              : 243
Hours             : 0
Minutes           : 0
Seconds           : 0
Milliseconds      : 0
Ticks             : 209952000000000
TotalDays         : 243
TotalHours        : 5832
TotalMinutes      : 349920
TotalSeconds      : 20995200
TotalMilliseconds : 20995200000
```
ESLint v4.6.0

前 [v4.5.0] | 次 [v4.7.0]

<blockquote class="twitter-tweet" data-lang="ja"><p lang="en" dir="ltr">ESLint v4.6.0 has been released: <a href="https://t.co/0tZWYRf4pW">https://t.co/0tZWYRf4pW</a></p>&mdash; ESLint (@geteslint) <a href="https://twitter.com/geteslint/status/903755640589488129">2017年9月1日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

ESLint 4.6.0 がリリースされました。
小さな機能追加とバグ修正が行われています。

質問やバグ報告等ありましたら、お気軽にこちらまでお寄せください。

> 🏢 [日本語 Issue 管理リポジトリ](https://github.com/eslint/eslint-jp)
> 👫 [日本語サポート チャット](https://gitter.im/eslint/eslint-jp)
> 🏢 [本家リポジトリ](https://github.com/eslint/eslint)
> 👫 [本家サポート チャット](https://gitter.im/eslint/eslint)

# 🚀 本体への機能追加

今回はありません。

# 💡 新しいルール

## [#8102]: [function-paren-newline]

関数定義、関数呼び出しの引数の周囲のカッコについて、カッコの内側で改行すべきかどうかを矯正するスタイルルールです。

```js:例
/* eslint function-paren-newline: error */

//✔ GOOD
function foo(bar, baz) {}

var foo = function(
  bar,
  baz
) {};

var foo = (bar, baz) => {};

foo(bar, baz, qux);

foo(
  bar,
  baz,
  qux
);

//✘ BAD
function foo(bar,
  baz
) {}

var foo = function(
  bar, baz
) {};

var foo = (
  bar,
  baz) => {};

foo(bar,
  baz);
```

# 🔧 オプションが追加されたルール

## [#8985]: [generator-star-spacing] `named`, `anonymous`, `method`

Generators 構文の `*` の前後のスペースについて、名前付き関数、匿名関数、メソッド記法それぞれで異なる設定を行えるようになりました。

```js:例
/* eslint generator-star-spacing: [error, {
    named:     {before: false, after: true},
    anonymous: {before: false, after: true},
    method:    {before: false, after: false},
}] */

//✔ GOOD
function* foo() {}
var foo = function* () {}
var foo = {
    *foo() {}
}

//✘ BAD
function *foo() {}
var foo = function *() {}
var foo = {
    * foo() {}
}
```

# ✒️ `eslint --fix` をサポートしたルール

今回はありません。

----

[v4.5.0]: http://qiita.com/mysticatea/items/7cdf8166ad1f036ee022
[v4.7.0]: http://qiita.com/mysticatea/items/bf35b048e7571bf3d4f4
[#8102]: https://github.com/eslint/eslint/issues/8102
[#8985]: https://github.com/eslint/eslint/issues/8985
[#9999]: https://github.com/eslint/eslint/issues/9999
[function-paren-newline]: http://eslint.org/docs/rules/function-paren-newline
[generator-star-spacing]: http://eslint.org/docs/rules/generator-star-spacing
[xxxx]: http://eslint.org/docs/rules/xxxx

<!-- 
![JSCS Icon](http://jscs.info/favicon.ico) JSCS 互換ルールです。
-->
ExcelVBAからGoogleAPIを呼び出す(GoogleMap編)

GoogleMapをExcelVBA(XMLで受信)を使って表示します。

## 主な流れ
・「http://www.geocoding.jp/」から経度、緯度を検索(XMLで受信)
　http://www.geocoding.jp/api?v=1.1&q=（住所を設定）

・GoogleMapにプロパティを渡して、WebBrowserオブジェクトに表示する。
　http://maps.google.com/maps/api/staticmap?size=600x600&zoom=(拡大率)&sensor=false&markers=(上記geocodingから取得した経度、緯度情報)&maptype=(表示形式)

 ※表示形式について
　roadmap…道路地図ビュー:
　satellite…航空写真:
　hybrid…通常のビューと航空写真ビューの複合ビュー
　terrain…物理地図

## サンプル
![googlemap.jpg](https://qiita-image-store.s3.amazonaws.com/0/199152/2e18a49e-282c-edb6-e3b8-6b8bb684bcfd.jpeg)

```ruby:ソースコード
Private Sub okButton_Click()
  SpinButton1.Enabled = True
  no = 10
  
  Dim xmldoc As MSXML2.XMLHTTP
  Dim myUri As String
  Set xmldoc = CreateObject("MSXML2.XMLHTTP")

  If addressTextBox.Text = "" Then
    MsgBox "正確な住所を入力してください。"
    Exit Sub
  End If
  
  '住所から座標を取得
  myUri = "http://www.geocoding.jp/api?v=1.1&q=" & addressTextBox.Text
  xmldoc.Open "POST", myUri, False
  xmldoc.send (Null)
  Dim doc As MSXML2.DOMDocument
  Set doc = CreateObject("MSXML2.DOMDocument")
  doc.LoadXML (xmldoc.responseText)
  Dim myNodes As MSXML2.IXMLDOMNodeList
  Set myNodes = doc.SelectNodes("result/coordinate")
  Dim i As Integer
  For i = 0 To myNodes.Length - 1
    myLatitude = myNodes(i).ChildNodes(0).Text
    myLongitude = myNodes(i).ChildNodes(1).Text
  Next
  Call Exe_Map
  
End Sub

'GoogleMapを表示
Private Sub Exe_Map()
  
  myAddressCoodinatePosition = myLatitude & "," & myLongitude
  Dim googleUri As String
  Dim myGoogleMapsUri As String
  Dim googleXmldoc As MSXML2.XMLHTTP
  Set googleXmldoc = CreateObject("MSXML2.XMLHTTP")
  
  'GoogleMapを表示
  googleUri = "http://maps.google.com/maps/api/staticmap?size=600x600&zoom=" & no & "&sensor=false&markers=" & myAddressCoodinatePosition & "&maptype=" & myMapType
  WebBrowser.Navigate googleUri

End Sub

'地図の縮小
Private Sub SpinButton1_SpinDown()
    If no <= 10 Then
        no = 10
        Exit Sub
    Else
        no = no - 1
        Call Exe_Map
    End If

End Sub

'地図の拡大
Private Sub SpinButton1_SpinUp()
    no = no + 1
    Call Exe_Map
End Sub

'道路地図ビュー(roadmap)
Private Sub OptionButton1_Click()
  okButton.Enabled = True
  myMapType = OptionButton1.Caption '値=roadmap
  Call Exe_Map
End Sub

'航空写真(satellite)
Private Sub OptionButton2_Click()
  okButton.Enabled = True
  myMapType = OptionButton2.Caption '値=satellite
  Call Exe_Map
End Sub

'通常のビューと航空写真ビューの複合ビュー(hybrid)
Private Sub OptionButton3_Click()
  okButton.Enabled = True
  myMapType = OptionButton3.Caption '値=hybrid
  Call Exe_Map
End Sub

'物理地図(terrain)
Private Sub OptionButton4_Click()
  okButton.Enabled = True
  myMapType = OptionButton4.Caption '値=terrain
  Call Exe_Map
End Sub
```

実行結果
![googlemap_exe.jpg](https://qiita-image-store.s3.amazonaws.com/0/199152/761bc428-6ca0-26f9-3a70-541ee9477330.jpeg)
Tips : 開いたWebサイトをMarkdownで書き出して共有する方法



勉強会で「どうやったら参照したサイトが共有できるのか」という話題が上がりましたので方法をまとめてみました。一度試してみましたのでアップデートしました。

0. 書き出すフォーマット
1. 書き出す方法
2. 共有する方法

書き出すフォーマット
-------------------------------------------------

Markdownでリンク付きで書き出すことを想定します。リンクのタイトルはサイトのタイトルから取得するものとします。[Google](https://www.google.com/)の場合、次のようになります。

```markdown
* [Google](https://www.google.com/)
```

書き出す方法
-------------------------------------------------

### Chrome

アドオンで対応可能。僕は次のものを使っています。

* [GetTabInfo - Chrome ウェブストア](https://chrome.google.com/webstore/detail/gettabinfo/iadhcoaabobddcebhmheikmbcjcigjhc?hl=ja)


#### 使い方

上のリンクからChromeの拡張機能をインストールします。

テンプレートに次の文字列を ** 改行まで含めて ** 入力します。

```template

* [%%TITLE%%](%%URL%%)

```

こんな感じになっていると準備完了です。

![スクリーンショット 2017-09-16 13.50.19.png](https://qiita-image-store.s3.amazonaws.com/0/41266/a964274b-b154-21cd-4513-7add0e32232a.png "スクリーンショット 2017-09-16 13.50.19.png")



共有する方法
-------------------------------------------------

### [Slack](https://slack.com/) オススメ

あまり広く共有できない手元の設定ファイルを手早く共有したい場合にはチャットサービスを用いた共有が最速かと思います。

### [Gist](https://gist.github.com/)

できるエンジニアが草を生やすことで有名なGithubのサービス。URLを発行して共有できる。

### [HackMD](https://hackmd.io/)

使ったことないけれど良さそう。


選外にしたツール
-------------------------------------------------

### 書き出す方法

主に筆者が使ってないので分からない、というものです…。

#### Firefox

アドオンで対応可能。次のものでできそうですけれど、普段使ってないのでわからないです！

[FireLink - Copy title and URL in any format](http://firelink.ongaeshi.me/)

#### Safari

アドオンでいけそうなんですが、やっているものを見つけられていないです。

#### Opera, Vivaldi, Edge

できるんでしょうか？

#### IE

諦めてますができるかもしれないです。



### 共有する方法

#### [Google ドキュメント](https://www.google.com/intl/ja_jp/docs/about/)

共同編集するならありかもしれないですが、テキスト編集に向いているわけではないです。

#### [Microsoft OneDrive](https://onedrive.live.com/about/ja-jp/)

ファイルを作成して共有するならこういうサービスもありですね。


最後に
-------------------------------------------------

より良い方法があったら教えてください！

Reference
-------------------------------------------------

* [HackMDってMarkdownEditaが革新的で使いやすい - Qiita](http://qiita.com/cc-kawanishi/items/85aa990dbe6582b6d701)
Power Shell でファイルをダウンロードする


# やりたいこと
- あるサイトに置いてあるzipファイルを、自分のPCにダウンロードする。
- ファイルがいっぱいあるので右クリックで保存したくない。
- やましいファイルではなく、日別の集計データです。

# 注意すること
- 基本的にブラウザからアクセスされる前提なので、プログラムで全力アクセスすると怒られる。
- 節度を持ったアクセスが必要。

# 利用ツール
Windows Power Shell

# サンプル
```ps1
# WebClient 生成
$cli = New-Object System.Net.WebClient

# 対象URL
$uri = New-Object System.Uri("http://hoge/fuga.zip")

# 保存時のファイル名を取得
$file = Split-Path $uri.AbsolutePath -Leaf

# ダウンロード
$cli.DownloadFile($uri, (Join-Path "C:\Users\xxxx\" $file))
```

ループとか外部ファイルからURL指定とかは、また別途...
VirtualBoxに入れたcentosをwebサーバとして使えるように

# ざっくりやったこと
1. Apacheインストール
2. PHPインストール
3. MySQLインストール
4. PostgreSQLインストール
5. Gitインストール
6. Nodeインストール
7. VirtualBoxでホストとゲストのファイル共有  
WinSCPとかでミラーリングするのとどっちがいいんだろう。  
→ WinSCPの方が共有したいファイルの設定とかしやすいかも？
8. vscodeの背景を[加藤恵ちゃん](http://resizer2.myct.jp/img/43875785376/s_1e3b2b35e9598b118f3c14058f66f66d.jpg)にした。天使かよ。

これでホストでコーディングしてゲストで動かして、みたいなことができるようになった（ハズ 
Vimに慣れたいとか思ってたハズなんですけど・・・ 
VUe.jsを触りたいんだけど、そもそもがまだそういう段階じゃないから1歩づつ参ります。 
とりあえず次からはTODOリスト作ってみたい。

# 覚えておきたいこと
- `vi`を`sudo`する
- `yum`でインストール
- ```$ gnome-terminal ```  
- 端末を起動
- postgresの認証とかユーザ権限まわりのこと  
とりあえずpostgresが強い
- ルートディレクトリ
- ポートフォワーディング  
ホヅトとゲストのファイル共有のアレ。SSHの設定もこれ。
- ```tar (c|x)zvf ```  
- 作成がCreate解凍がeXtract
- `make`はコンパイル installをつけるとlインストール
- nvmの設定は別にまとめる予定 nodeはしっかり触りたい
- `shutdown now [-r]` 
シャットダウン・再起動 nowが無いと1分後にスケジュール？
- `/etc/httpd/conf/httpd.conf`
- `-rw-r--r--   1 root   root        110  9月  2 15:30 index.html`  
- こいつの意味を把握する
- `chmod -R 757 /var` 
- ディレクトリ以下を再帰的に権限変更。ファイルだけとかディレクトリだけとかもなんかできそう


やったことを追記シていきます
MacでVisualStudioCodeとPlantUMLを使うときに躓いたメモ


# 前提条件

- 実行環境
	- Mac OS Sierra (10.12.6)
	- VisualStudioCode 1.15.1
	- Java 1.8.0_77
	- Homebrew 1.1.9
- Javaはすでに入っているものとします。
- VisualStudioCodeもすでにインストールされているものとします。


# PlantUMLプラグインのインストール

- Command + Pから、コマンドを実行する

```
ext install plantuml
```

- リストに表示された、PlantUML 2.1.3 をインストールする。

# Graphvizのインストール

```
brew install graphviz
```

エラーになるようであれば、cask経由でインストールする

```
brew cask install graphviz
```

# 動作確認

- VisualStudioCodeを起動し、新規ファイルを作成する。
	- 拡張子に指定はない。mdなどにも組み込める。

```
@startuml
testdot
@enduml
```

参考URL
http://www.graphviz.org
http://macappstore.org/graphviz/
GPU搭載 Windows10にTensorFlow/Kerasをインストールする

# はじめに
ディープラーニングの学習/実装のため、手元のPC(GPU搭載)にTensorFlow/Kerasをインストールします。CUDA 8.0/cuDNN 6.0もインストールして、GPUも使える状態にします。

#環境
 - Windows 10 x64 (1709 Fall Creators Update) 
 - GPU: NVIDIA GeForce GTX750Ti (玄人志向 GF-GTX750Ti-LE2GHD)
 
#事前準備

##Visual C++ Build Tools 2015をインストール
CUDA 8.0はVisual C++ 14.0に対応しているため、Visual C++ 14.0を含んでいる
Visual C++ Build Tools 2015を以下URLからダウンロードしてインストールします。
http://landinghub.visualstudio.com/visual-cpp-build-tools
インストールオプションは特に変更せず、デフォルトのまま行います。

##CUDA 8.0 およびパッチをインストール
以下URLから"Operating System: Windows", "Version: 10","Install Type: exe(network)" を選択し、"Base Installer"をダウンロード/インストールします。
https://developer.nvidia.com/cuda-80-ga2-download-archive
基本的にデフォルトオプションのままで大丈夫ですが、インストール中に
「No supported version of Visual Studio found～」と警告が出るので、
"I Understand, and wish to continue the installation regardless."に
チェックを入れて継続します。
GPUのドライバはCUDAと一緒にインストールされるため、事前の個別のインストールは必要ありません。

2017年11月14日時点で"Base Installer"と同URLより"Patch 2 (Released Jun 26, 2017)"が
ダウンロードできるので、同じくダウンロード/インストールします。
こちらもデフォルトオプションのままインストールします。

## cuDNNをインストール

以下URLからcuDNNをダウンロードします。初回はユーザ登録が必要です。
https://developer.nvidia.com/rdp/cudnn-download
選択肢の中から "Download cuDNN v6.0 (April 27, 2017), for CUDA 8.0" を選択し
cuDNN v6.0 Library for Windows 10をダウンロードします。

ダウンロードしたzipファイルを展開し、中に入っている bin, include, lib フォルダを
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v8.0\ に上書きコピーします。

## Python(Anaconda)をインストール

以下URLで"Windows"を選択し"Python 3.6 version"をダウンロードします。
https://www.anaconda.com/download/
デフォルトオプションのままインストールします。


# TensorFlowのインストール
スタートメニューから"Anaconda3 (64bit)" → "Anaconda Prompt"を起動し
環境を作成し選択します。

```
(C:\Users\user\Anaconda3) C:\Users\user> conda create -n DeepLearning python=3.5

(C:\Users\user\Anaconda3) C:\Users\user> activate DeepLearning

(DeepLearning) C:\Users\user>
```

続いて TensorFlowをインストールします。

```
(DeepLearning) C:\Users\user> pip install --ignore-installed --upgrade tensorflow-gpu==1.4.0
```


# Kerasのインストール
TensorFlowをインストールした環境を選択しKerasをインストールします。

```
(C:\Users\user\Anaconda3) C:\Users\user> activate DeepLearning

(DeepLearning) C:\Users\user> pip install keras==2.1.0
```
Windows10のIE11.5ではGeolocation APIのgetCurrentPositionが初回しか成功しない

# 現象
IE11.5ではgetCurrentPositionが2回目以降は必ず
```alert(error.message + "[" + error.code + "]");```
が「現在地を特定できませんでした。[2]」となる。

![version.jpg](https://qiita-image-store.s3.amazonaws.com/0/156195/e3dc6b4f-a251-99d8-4ab5-879bbf8cffc5.jpeg)


# 対応方法
オプション設定のmaximumAgeを大きく設定すればキャッシュを使うのでその間は失敗にはならないが、
他ブラウザの際にはキャッシュを使いたくない（常に最新の位置が欲しい）かもしれないのでキャッシュを使わない設定で回避してみた
（監視が動くまでは前回の位置情報だけど･･･）

```js
var _tempWatchID = null;
var _tempPosition = null;
var _lockFlag = false;

// 監視開始
function startLocationWatch() {

	if (_lockFlag === true) {
		return;
	} 

	if (_tempWatchID !== null) {
		return;
	}

	_lockFlag = true;

	navigator.geolocation.getCurrentPosition(
		function(position) {
			monitorLocationInfo(position);
			_lockFlag = false;
		},
		function (error) {
			console.log("error");
			if(_tempPosition !== null) {
				monitorLocationInfo(_tempPosition);
				_lockFlag = false;
				return;
			}
			alert(error.message + "[" + error.code + "]");
			_lockFlag = false;
		},
		{ enableHighAccuracy: false, maximumAge: 0, timeout: 10000 }
	);
}

function monitorLocationInfo(position) {
	_tempPosition = position;
	console.log("緯度 : " + position.coords.latitude);
	console.log("経度 : " + position.coords.longitude);
	console.log("GPS誤差 : " + position.coords.accuracy + "m");

	// 監視(デバイスの位置が変化するたびに自動的に呼び出される)
	_tempWatchID = navigator.geolocation.watchPosition(function (position) {
		_tempPosition = position;
		console.log("緯度(監視) : " + position.coords.latitude);
		console.log("経度(監視) : " + position.coords.longitude);
		console.log("GPS誤差(監視) : " + position.coords.accuracy + "m");
	});
}

// 監視停止
function stopLocationWatch() {
	if (_tempWatchID === null) {
		return;
	}
	navigator.geolocation.clearWatch(_tempWatchID);
	_tempWatchID = null;
};
```

# IE11でGeolocation APIを使う際の注意

error.codeが1になる場合は位置情報を使用する許可が出来ていないので
Windowsの設定＞プライバシー＞位置情報から位置情報サービスをONに設定する必要があります。
Chrome等では設定せずとも問題なく動作します。

![location_permission.jpg](https://qiita-image-store.s3.amazonaws.com/0/156195/646e12a4-8586-ddac-3927-a912303667d5.jpeg)
返り値がnilになるまでメソッドを再帰的に適用する


# オブジェクトを再帰的に辿る

グラフのノードを再帰的に辿るような繰り返し処理をいい感じに書くにはどうすればよいか。

# 簡単な例

ごく簡単な例を設定する。ある文字列sについて、s[1..-1]を繰り返し適用すると最後にはnilが返る。

```ruby
"abcde"[1..-1] #=> "bcde"
"bcde"[1..-1]  #=> "cde"
"cde"[1..-1]   #=> "de"
"de"[1..-1]    #=> "e"
"e"[1..-1]     #=> ""
""[1..-1]      #=> nil
```

普通に書くとこんな感じだろう。

```ruby
s = "abcde"
while _s = s[1..-1]
	puts _s
	s = _s
end
```

~~ブロック~~制御構造が嫌いならこんな感じか。

```ruby
s = "abcde"
_s = nil
puts s = _s while _s = s[1..-1]
```

# 関数にする

任意の処理を再帰的に行う関数を作る。その1。

```ruby
def recursive(obj)
	c = obj
	n = nil
	c = n while n = yield(c)
end
```

次のように使う。ブロックの最後の値に対して同じ処理を繰り返し行う。最終的にnilになるような処理じゃないと無限ループに陥るので注意。

```ruby
recursive("abcde") do |s|
	_s = s[1..-1]
	puts _s
	_s
end
```

# Enumeratorを使う

Enumeratorを使うパターン。

```ruby
def recursive(obj)
	Enumerator.new do |y|
		c = obj
		n = nil
		y << c = n while n = yield(c)
	end
end
```

次のように使う。

```ruby
s = "abcde"
recursive(s){|_s| _s[1..-1]}.to_a
=> ["bcde", "cde", "de", "e", ""]
```

# モジュールにする

Moduleで定義してインスタンスメソッドとして使う。

```ruby
module Recursive
	def recursive
		Enumerator.new do |y|
			c = self
			n = nil
			y << c = n while n = yield(c)
		end
	end
end
```

次のように使う。

```ruby
class MyString < String
	include Recursive
end

s = MyString.new('abcde')
s.recursive{|_s| _s[1..-1]}.to_a
=> ["bcde", "cde", "de", "e", ""]
```

# 繋げて書く

obj.recursive.method みたいな書き方をしたい場合。

```ruby
module Recursive
	def recursive
		Recursive::Deligator.new self
	end
end

class Recursive::Deligator
	def initialize(obj)
		@obj = obj
	end
	def method_missing(name, *args, &block)
		Enumerator.new do |y|
			c = @obj
			n = nil
			y << c = n while n = c.send(name, *args, &block)
		end
	end
end
```

次のように使う。

```ruby
s = MyString.new("abcde")

s.recursive[1..-1].to_a
=> ["bcde", "cde", "de", "e", ""]

s.recursive.slice(1..-1).to_a
=> ["bcde", "cde", "de", "e", ""]
```

# どちらの記法も使えるようにする

メソッドを続ける書き方はシンプルだが、直後のメソッドが「自分と同じクラスのインスタンスまたはnil」を返すメソッドでなければならない。ブロックを与える書き方とメソッドを続ける書き方の両方ができるような多態な関数にしておいた方が便利だろう。

```ruby
module Recursive
	def recursive
		if block_given?
			Enumerator.new do |y|
				c = self
				n = nil
				y << c = n while n = yield(c)
			end
		else
			Recursive::Deligator.new self
		end
	end
end
```

これで、どちらの書き方もできるようになる。

```ruby
s.recursive[1..-1].to_a
=> ["bcde", "cde", "de", "e", ""]

s.recursive{|_s| _s[1..-1]}.to_a
=> ["bcde", "cde", "de", "e", ""]
```
5月度勉強会で調べた事項

少し遅くなりましたが(公開 2017年9月)[Nagoya.Swift+ 5月度勉強会 - connpass](https://nagoyaswiftplus.connpass.com/event/53937/)で話題になった事柄です。

Python
======================================

import
--------------------------------------

* [Pythonのimportについてまとめる - Qiita](http://qiita.com/suzuki-hoge/items/f951d56290617df4279e)

* [134:実行しているスクリプトのパスを求める](http://lightson.dip.jp/zope/ZWiki/134_e5_ae_9f_e8_a1_8c_e3_81_97_e3_81_a6_e3_81_84_e3_82_8b_e3_82_b9_e3_82_af_e3_83_aa_e3_83_97_e3_83_88_e3_81_ae_e3_83_91_e3_82_b9_e3_82_92_e6_b1_82_e3_82_81_e3_82_8b)

ライブラリ
--------------------------------------

REST APIを使うならFlask & Requestsかなあと

### Flask (サーバー)

* [Welcome | Flask (A Python Microframework)](http://flask.pocoo.org/)

* [ウェブアプリケーションフレームワーク Flask を使ってみる - Qiita](http://qiita.com/ynakayama/items/2cc0b1d3cf1a2da612e4)

### Requests (クライアント)

* [Requests の使い方 (Python Library) - Qiita](http://qiita.com/sqrtxx/items/49beaa3795925e7de666)

* [Requests: HTTP for Humans — Requests 2.14.2 documentation](http://docs.python-requests.org/en/master/)

Syntax
--------------------------------------

* [Pythonのクラスにおける__call__メソッドの使い方 - Qiita](http://qiita.com/kyo-bad/items/439d8cc3a0424c45214a)

* [【備忘録】Pythonにおけるアンダースコア"_"の役割について - Qiita](http://qiita.com/ikki8412/items/ab482690170a3eac8c76)


機械学習
======================================


* [TensorFlowでつまづいた(Out of GPU Memoryとは) - Qiita](http://qiita.com/ikki8412/items/d50a6200b2d317fe0a68)

* [TensorFlow 大量の画像から学習するには・・・〜(ほぼ)解決編〜 - Qiita](http://qiita.com/ikki8412/items/6784370f73dc7734372a)

tf-goch
--------------------------------------

* [n-kats/tf-gogh: tensorflowでchainer-goghを書いた](https://github.com/n-kats/tf-gogh)

Google Magenta
--------------------------------------

* [tensorflow/magenta: Magenta: Music and Art Generation with Machine Intelligence](https://github.com/tensorflow/magenta)

### A.I. Duet

* [人工知能時代の音楽制作への招待 - Google Magenta 解説&体験ハンズオン (自習編) - - Qiita](http://qiita.com/icoxfog417/items/f198f2e030d861d7bbf4)

* [TensorFlow製音楽生成プロジェクト「Magenta」を開発環境の設定から曲生成までやってみる。 - Qiita](http://qiita.com/tackey/items/c9d5045743539e25e9c2)

* [ニューラルネットワークで作曲をする! Magentaを動かす - Qiita](http://qiita.com/YoshikawaMasashi/items/0f6fbbe39c4381457b0a)

* [magenta/magenta/models/melody_rnn at master · tensorflow/magenta](https://github.com/tensorflow/magenta/tree/master/magenta/models/melody_rnn#generate-a-melody)

### NSynth

* [NSynth: Sound Maker](https://aiexperiments.withgoogle.com/sound-maker/view/)

* [NSynth: Neural Audio Synthesis](https://magenta.tensorflow.org/nsynth)

開発環境周り
--------------------------------------

### Atom & Jupyter Notebook

* [browser-plus](https://atom.io/packages/browser-plus)

* [arnau/docker-octave-notebook: Dockerised Jupyter notebook with Octave kernel](https://github.com/arnau/docker-octave-notebook)

用語
--------------------------------------

* [ヘッセ行列 - Wikipedia](https://ja.wikipedia.org/wiki/%E3%83%98%E3%83%83%E3%82%BB%E8%A1%8C%E5%88%97)
Garage::Representer::NonEncodableValueが出たとき

このエラーが出たときは、だいたい`Garage::Repesenter`忘れなのですが、他のミスの場合もこのエラーが出るので、ググった時に引っかかるよう書いておきます。

## 前置き
```code.rb
class User < ApplicationRecord
  include Garage::Representer
  has_many :group_user
  has_many :groups, through: :group_user

  property :id
  property :name
  property :groups
end

class Group < ApplicationRecord
  include Garage::Representer
  has_many :group_user
  has_many :users, through: :group_user

  property :id
  property :name
  property :groups
end

class UsersController < ApplicationController
  def require_resource
    @resource = User.find_by(id: params[:id])
  end
end
```

こんな風のコードがあるとします。

## 問題
Postsを取得するために `GET /users/10` するとこんな感じのエラーが出ます。困った...。

```
Garage::Representer::NonEncodableValue in UsersController#show
Groups::ActiveRecord_Associations_CollectionProxy can not be encoded directly. Forgot to include Garage::Representer?
```

ハマってしまい困っていたんですが、間違いはシンプルで`User`の`  property :groups`が、`collection :groups`になるべきでした。

## おまけ
最初、挙動がよく分からずコードを追ってしまっていました。このあたりの動きは`garage/representer`を読むと書いてあったので共有です。

`include Garage::Representer`した時に`extend`されるクラスメソッドが`ClassMethod`で定義され、`self.included(base)`で適用されます。(これよくあるパターンぽい)

```garage/representer.rb
module Garage::Representer
  def self.included(base)
    self.representers << base

    base.class_eval do
      if Rails.application
        include Rails.application.routes.url_helpers
      end
      extend ClassMethods
    end
  end

  module ClassMethods
    attr_writer :representer_attrs

    # ...

    def representer_attrs
      @representer_attrs ||= []
    end

    def property(name, options={})
      representer_attrs << Definition.new(name, options)
    end

    def collection(name, options={})
      representer_attrs << Collection.new(name, options)
    end

    # ...
  end
  
  # ...
  
  class Collection < Definition
    def encode(object, responder, selector = nil)
      value = object.send(@name)
      value.map do |item|
        encode_value(item, responder, selector)
      end
    end
  end
end
```

モデルのハッシュが必要になった場合、`Definition#encode_value`でhashへ変換作業をしているのですが、ここでコケていたという雰囲気です。

`Collection`の場合はmapしながらhashへの変換をしていくので、`ActiveRecord_Associations_CollectionProxy`でも問題ないですね。
取得したドメインでメールサーバ構築

# 内容

何番煎じかになるが
お名前.comで入手したドメインを個人で作成したメールサーバに結びつけるためのメモ
追加でGmail・スマホアプリにも受信する設定を記載

# モチベーション

メールでやりとりすること実際そんなにないが
開発とかでSNSアカウントをすぐに作りたいとき用にあれば良いかという程度のモチベーション
後に後付け理由を記載している

## 個人のメールアドレスを得たい

つい最近キャリアから格安スマホの会社に乗り換えた際に今まで使用していたメールアドレスを失効した。
乗り換え先の会社のドメインによるメールアドレス追加オプションというのもあったが
自分のドメイン所有してたのでどうせなら自分のドメインのメールアドレス作っちゃおうかという気持ちになった。

## PCでもスマホでも容易に同じメールアドレスでやりとりしたい

そうそうないがMNPで機種乗り換えした時、
メールアドレス変わったので〜〜〜というやりとりが不毛に思えてきた。
携帯なくした時でもPCから連絡できる手段得たいというのもある。

# ざっくりとしたネットワーク図

![syonet_network.png](https://qiita-image-store.s3.amazonaws.com/0/89599/57f0b766-a0aa-bbe1-10ef-53e8686a11a7.png)

Webサーバとは分離してメールサーバを作成している
メールサーバ上では受信のPOPと送信のSMTPの両方を起動させている

# ざっくりとした構築参考

下記のリンクを順番に実行していく

メールサーバー構築(Postfix+Dovecot)
https://centossrv.com/postfix.shtml

メールサーバー間通信内容暗号化(Postfix+Dovecot+OpenSSL)
https://centossrv.com/postfix-tls.shtml
PostgreSQLでトリガーの情報を取得する

PostgreSQL 9.5にて確認済み

```sql
SELECT	 tg.event_object_table		-- テーブル名
		,tg.trigger_name			-- トリガー名
		,CASE pgtg.tgenabled
			WHEN 'O' THEN	'Enabled'
			WHEN 'D' THEN	'Disabled'
			WHEN 'R' THEN	'Replica'
			WHEN 'A' THEN	'Always'
			ELSE			NULL
			END	AS tgenabled
		,tg.event_manipulation		-- 発火動作
		,tg.action_timing			-- タイミング
		,tg.action_statement		-- Statement that is executed by the trigger
FROM	information_schema.triggers	AS tg		-- https://www.postgresql.org/docs/9.5/static/infoschema-triggers.html
	INNER JOIN pg_trigger			AS pgtg		-- https://www.postgresql.jp/document/9.5/html/catalog-pg-trigger.html
		ON (pgtg.tgname = tg.trigger_name)

ORDER BY tg.event_object_table
		,tg.trigger_name
		,tg.event_manipulation
```

参考

- [PostgreSQL: Documentation: 9.5: triggers][infoschema-triggers]
- [49.48. pg_trigger][pg_trigger]



[infoschema-triggers]:https://www.postgresql.org/docs/9.5/static/infoschema-triggers.html
[pg_trigger]:https://www.postgresql.jp/document/9.5/html/catalog-pg-trigger.html