OmniAICreator/Qiita-1.07M huggingface dataset:
cool-peco（peco）インストール

 2018/10/28-29 追記
~~**Macの最新OS Mojave （10.14）では本体ツールとなっている`peco`自体がおそらく利用非推奨なのでご注意ください。**~~

もしかしたら`peco`の**バージョン**をちゃんとアップデートして新しいものを使用していればMojaveでも問題ないかもしれません。
（@d6rkaizさんにコメントいただき修正）

ちなみにpecoの代替ツールには`fzf`や`gof`などがあります。
>
[おい、peco もいいけど fzf 使えよ](https://qiita.com/b4b4r07/items/9e1bbffb1be70b6ce033)
[Golang でコマンドライン Fuzzy Finder 「gof」作った。](https://qiita.com/mattn/items/edea1be5a6d84663ab8b)

---

※　[zplug](https://github.com/zplug/zplug/blob/master/doc/guide/ja/README.md)等で他プラグインと合わせてインストール・管理する方法もあるので、とりあえず cool-peco（peco） だけ入れたいって方向けの記事です。


#環境

mac
zsh
vim
homebrew

#参考
[え、まだpecoを使ってないの？？？](https://qiita.com/vintersnow/items/08852df841e8d5faa7c2)
[pecoの便利な関数を集約した奴がいたんですよぉ〜](https://qiita.com/ryoppy/items/4819d0911bf937dba821)
[例えば、pecoをビルドしない](https://qiita.com/lestrrat/items/de8565fe32864f76ac19)
[percolを使ってターミナル操作を早く、便利に。](http://memo.sugyan.com/entry/20140611/1402487717)
[ubuntuでのpecoのインストール](https://qiita.com/ryuchan00/items/022d4513ff72cc0eb783)

#github
[ryoppy/cool-peco](https://github.com/ryoppy/cool-peco/blob/master/README.md)
[peco/peco | github](https://github.com/peco/peco#installation)
[peco/peco releases | github](https://github.com/peco/peco/releases)


#インストール作業

#準備

```zsh
# wget がなければインストール
brew install wget
```

##peco
[バイナリファイル](https://github.com/peco/peco/releases)を落としてきて`/usr/local/bin`以下(パスの通っている場所)に実行ファイルをコピーするだけ

↓　（下記の`peco_darwin_386.zip`は　2018/4/3 現在の場合のmac用ファイルになるので、適宜[リリース場所](https://github.com/peco/peco/releases)を確認して**必要なファイルに置き換えて作業**する）

```zsh
#デスクトップにファイルを落として作業する場合
cd ~/Desktop
wget "https://github.com/peco/peco/releases/download/v0.5.3/peco_darwin_386.zip"
# 解凍
unzip peco_darwin_386.zip
cd peco_darwin_386
# 実行権限変更
#sudo chmod +x peco
cp peco /usr/local/bin 
```

これでとりあえずターミナルから`peco`コマンドが使えるかと

##cool-peco
gitクローンで落としてきて`.zshrc`に利用設定を記述

```zsh
$HOME
git clone https://github.com/ryoppy/cool-peco.git
cd cool-peco
sh ./install.sh
#最後に ~/.zshrc に設定を追記するか否か聞かれる。　 y で追記される
y
```

```zsh
vim ~/.zshrc
```

[autoload で -U と -z というオプションを指定](https://qiita.com/mollifier/items/6fdeff2750fe80f830c8)してる。
`-U` は、alias 設定を無視して関数展開するオプション。aliasによる動作ミスを防ぐ。
`-z` は関数を zsh 形式で読み込むというオプション。

```zsh:.zshrc
# ↓ 上記インストール時に自動追記される部分
# === cool-peco init ===
FPATH="$FPATH:/Users/＄USER/cool-peco"
autoload -Uz cool-peco
cool-peco
# ======================

# ↓ alias設定　任意で追記
#bindkey
bindkey '^r' cool-peco-history # ctrl+r
bindkey '^h' cool-peco-ssh
bindkey '^p' cool-peco-ps

alias ff=cool-peco-filename-search
alias gbb=cool-peco-git-checkout
alias gll=cool-peco-git-log
alias ta=cool-peco-tmux-session
alias cg=cool-peco-ghq

#（任意で追記）
# ↓ pecoショートカット表示
alias pecoref="cat ~/.zshrc | grep -E cool-peco-[a-zA-Z]{2,\}" # pecoショートカット表示
```

```zsh
source ~/.zshrc
```

---
バイナリ落としてきて使う場合はgoいらないけど
**やっちまった**~~なぁ！~~のでとりあえず以下作業メモ

###goのインストール

```zsh
brew install go
```

```zsh
vim ~/.zshrc
```

```zsh:.zshrc
# go path
export GOPATH=~/go
export PATH=$PATH:$GOPATH/bin
```
```zsh
source ~/.zshrc
```
Windows > Windowsデバイスコンソール Devcon.exe > 取得方法 2018-04-03 > それぞれのOSに適した取得方法

```txt:動作環境
Windows 7 Pro (32bit)
```

### 関連

- [Windows > link > Windows デバイスコンソール Devcon.exe > デバイスマネージャ上での操作を実行](https://qiita.com/7of9/items/f02ef990ea70a622fb7a)

### Devcon.exeのインストール

2012年にDevcon.exeのインストールは下記であった。

1. 以下のサイトからインストーラを取得
    - `https://msdn.microsoft.com/ja-jp/library/windows/hardware/ff544707(v=vs.85).aspx`
2. インストーラからインストール

2018年4月3日現在、下記になっているようだ

1. WDKをインストール

WDKのサイトに行くとWindows 10 version 1709用のWDKしか見当たらない。

### 取得方法

superuserにて取得方法が紹介されている。

https://superuser.com/questions/1002950/quick-method-to-install-devcon-exe
> answered Jul 11 '16 at 23:59
NetwOrchestration

それぞれのOSに適した取得方法が丁寧に紹介されている。
PowerShellのコンソール起動時に.envを読み込む

環境ごとに違う値であったり、Gitなどに入れたくない値などは.envファイルにまとめていたりする。
PowerShellのコンソール画面を起動する時に.envファイルを読み込んで欲しいときがあったので自動化してみた。

```powershell
Get-ChildItem (Get-Location) |
    Where-Object {-not $_.PsIsContainer -and $_.Name -eq ".env"} |
    Get-Content |
    ForEach-Object {
        $key, $value = $_.split('=', 2);
        Invoke-Expression "`$env:$key='$value'"
    }
```

やっていることは単純で、
1. カレントディレクトリに.envファイルがあるか探す
2. ファイルを読み込んで1行ずつ処理しだす
3. `=`で`$key`と`$value`に分割して環境変数に入れる
ということをやっている。

PowerShellでは環境変数は`$env:???`になるので、そこが参考URLとの違いになる。

あとはこれを自分のPowerShellプロファイルに書き込めば、コンソール起動時に読み込んでくれる。
PowerShellプロファイルは`$profile`変数を見ればファイルパスが確認できる。

参考URL
[power shell の変数について。 \- その他（プログラミング・開発） 解決済み\| 【OKWAVE】](https://okwave.jp/qa/q6899282.html)
Sublime Text 3でSlimのシンタックスハイライト

Ruby on Railsに対応したテンプレートエンジン「Slim」を使うのに、Sublime Textでシンタックスハイライトがなく不便だったのでパッケージ入れた。

`Command + Shift + P` でPackageControlを開き「Install Package」を選択。
<img width="549" alt="スクリーンショット 2018-04-03 11.54.17.png" src="https://qiita-image-store.s3.amazonaws.com/0/6380/798e7a91-e859-5f59-3ee7-4d31375f2737.png">

「Ruby Slim」を検索してインストール。
Sublime Textを再起動して`.slim`ファイルを開くとシンタックスハイライトされるようになる。

やったぜ。
gitのタグを削除するシェル

# 動機
古いタグを削除しようとして、ちまちまやってたけど、面倒になったので、シェルを書くことにする。(シェル考えたほうが遥かに時間かかったんじゃないかというのは内緒)

#前段階
https://qiita.com/usamik26/items/7e53bae128bf130b8a32
によればタグを削除するのは↓とのこと。
```
git tag -d <TAGNAME>
git push origin :<TAGNAME>
```

#実際のシェル
リリースタグを削除するのはちょっと宜しくないと思うのでこんな感じ。
cut使っているのは、tag名から判定のために一部取得したいため。
削除条件の部分は、tagの名称付与によって、かなり異なると思うので、その部分は略。

```tagd.sh
#bin/bash

git checkout master
git pull

git tag | grep -vE "RELEASE" | cut <条件色々> | while read line
do
	if [ $line <判定文> <削除条件> ];
	then
		git tag -d `git tag | grep $line`
		git tag | grep $line | awk {'print ":" $1'} | xargs git push origin
	fi
done
```
DockerでNginxとPHP-FPMを別コンテナで動かした構成で詰まってたのでメモ

# 結論

Nginxのドキュメント読まないと。

## 最終的に動作したNginxのdefault.conf

``` nginx
server {
    listen       80;
    server_name  _;
    root  /var/www/html;
    charset utf-8;

    location / {
        try_files $uri $uri/ /index.php$is_args$args;
    }

    location ~ [^/]\.php(/|$) {
        root           /var/www/html;
        fastcgi_pass   php7:9000;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        include        fastcgi_params;
    }
}
```

「違うコンテナのファイルパスなんてどうやって指定するんだろう」
と2ヶ月近く悩んでいたが、多分 `root` オプションでやるのか。

# tl; dr

## 構成

``` yaml
version: "3"
services:
  php7:
    build: "php:7-fpm-alpine"
    volumes:
      - "~/path/to/dir/:/var/www/html/"
  nginx:
    image: "nginx:alpine"
    ports:
      - "8080:80"
    restart: "always"
    volumes:
      - "./web/default.conf:/etc/nginx/conf.d/default.conf"
    links:
      - "php7"
```

ごく簡単な構成かと。

`php7` コンテナにローカルストレージのソースをマウントして、それを `nginx` コンテナからアクセスして閲覧する。という構成。

# 参考資料
* [nginxからphpが使えるようにPHP-FPMをインストールする - bnote.net](http://www.bnote.net/centos/php-fpm_on_nginx.html)
* ほか、たくさんのWebサイトやQiitaページ……

# P.S.

Nginxのドキュメント、シンプルすぎやしないか？
[nginx documentation](https://nginx.org/en/docs/)
JUnit4のメモ


# アノテーションを使用する


| アノテーション | 意味 | クラス |
|:---------------|:-----|:-------|
|@Test | テスト対象メソッド | org.junit.Test |
| @Test(expected=例外クラス.class) | 指定した例外が発生したら成功 | org.junit.Test |
| @Test(timeout=ミリ秒） | 指定時間をオーバーしたら失敗 | org.junit.Test |
| @Ignore("comment") | テスト対象外とする（@Testにつける） | org.junit.Ignore |
| @Before | これまでの setUp() に相当するもの | org.junit.Before |
| @After | これまでの tearDown() に相当するもの | org.junit.After |
| @BeforeClass | 全テスト実行前に１回だけ実施される前処理 | org.junit.BeforeClass |
| @AfterClass | 全テスト実行後に１回だけ実施される後処理 | org.junit.AfterClass |
Linuxコマンド Tips


## less +F

# grep

## 出力結果をバッファさせない

grep コマンドは、何もしないと出力をバッファする（一旦溜め込む）ようになっています。

「--line-buffered」オプションを使うことでバッファしなくなります。
tail -f とかと組み合わせて使う場合、リアルタイムで結果が表示されるようになります。
MYSQL のデータベースへコメント

MYSQLでデータベースヘのコメントを追記することはできますか？
PostgreSQLみたいに。。。

※テーブルへのコメントではありません。

※参考 以下はPostgreSQLでのデータベースへのコメント記載時のキャプチャ
![pg.PNG](https://qiita-image-store.s3.amazonaws.com/0/247329/d0d15f9f-d505-11be-31c8-3bdb384c0bed.png)
MAMPでPHPのバージョンを変える

MAMPのUIからの設定だとだいたい２バージョンくらいしか指定できない。
デプロイ先のサーバーの都合によりそれ以外のPHPに変えたい時の設定方法。
（phpenvはやってない）

Macの時はapacheのconfは
/Application/MAMP/conf/apache/httpd.conf
で、このファイルを編集する。

このファイルの１００行目近辺に`LoadModule`の記載があるので、PHPのモジュールを読み込んでいるところを変更する。
例）
`LoadModule php7_module        /Applications/MAMP/bin/php/php7.2.1/modules/libphp7.so`
↓
`LoadModule php5_module        /Applications/MAMP/bin/php/php5.6.10/modules/libphp5.so`

とか、変更後Apache再起動でOK

MAMPにバンドルされてるPHPはMAMP以下のbin/phpの中にあるので、その中から使いたいバージョンを指定しよう。
Mac High SierraでGoogleファイルストリームがエラーになる時の対処

以前から使用していたgoogleドライブのサポートが終了するということで、現在はGoogleドライブファイルストリームの提供がされています。

ただ、なぜかアプリをダウンロードして起動してもエラーになってしまい起動してくれない。

アンインストールしてから再インストールしても状況は変わらず、ログインしてもしばらくしてファイルストリームが停止してしまいます....。

![gdriveエラー.png](https://qiita-image-store.s3.amazonaws.com/0/174392/56e6a949-5e63-5dc6-e30e-a982ee1c6153.png)

#Mac High Sierraを使用中の場合はある設定が必要

Mac OS 10.13（High Sierra）でドライブファイルストリームを使用するには、以下の設定が必要です。

まずファイルストリームを開き、左上アップルアイコン　＞　システム環境設定　
![GFS01.png](https://qiita-image-store.s3.amazonaws.com/0/174392/8b0e58da-cdbd-8caf-f1b2-71ef3d1aaf79.png)

セキュリティとプライバシー

![GFS02.png](https://qiita-image-store.s3.amazonaws.com/0/174392/299ea0a6-2972-a0ed-c1c9-81935414812a.png)

一般タブの下部に「開発元"Google, Inc."のシステムソフトウェアの読み込みがブロックされました。」と表示されているので、ここを[許可]します。

※今回設定した後だったため、文字入れしてます

![GFS03.png](https://qiita-image-store.s3.amazonaws.com/0/174392/b932cebc-db4c-679b-3c40-95bddd94edfd.png)

これでファイルストリームに無事ログインできるようになりました。

#ファイルストリームにログインする

ファイルストリームを開くと、Googleドライブと同じく画面上部にアイコンが表示されるのでクリックしてgoogleアカウントでログイン。

![GFS04.png](https://qiita-image-store.s3.amazonaws.com/0/174392/d0221247-dbeb-c2a6-c148-ccdd456e1e11.png)

ログインするとアカウントの右横にフォルダマークが表示され、クリックするとフォルダが表示されます。

![GFS05.png](https://qiita-image-store.s3.amazonaws.com/0/174392/086d69dd-7110-e07d-090a-5291a85a7861.png)

マイドライブの方で、同期されたファイルが全て確認できます。

![GFS06.png](https://qiita-image-store.s3.amazonaws.com/0/174392/b4cd5c5f-5190-9a46-d644-e632425d3dfe.png)


#Googleドライブをアンインストールする

ファイルストリームでファイルの同期が確認できた後、今までのGoogleドライブは不要になるので、アンインストールしてしまいます。

![GFS07.png](https://qiita-image-store.s3.amazonaws.com/0/174392/a023a90a-d53a-a78f-02d1-fb80b3c778f9.png)

Finderでアプリケーションフォルダを開き、Googleドライブを削除します。

サイドバーに残っているGoogleドライブの項目も削除。
この時点でファイルストリーム上にフォルダが存在していることを再度確認しましょう。

以上でGoogleドライブからファイルストリームへの切り替えが完了しました。
Tomcat上のWebアプリケーションから作成されるファイルのPermissionを制御する

# まえがき
Tomcat上のWebアプリからファイルを作成する際に、Permissionが「-rw-r-----」になり、Tomcat以外のサービスから参照できない状態となっていた。
※Tomcatのバージョンは9.x

# やりたいこと
ファイルを作成するプログラム部分ではなくTomcatの設定でPermissionを変更したい。

# 結論
`/Tomcatインストールフォルダ/bin/catalina.sh`のumaskの値を変更。
エラーは君を成長させる

##はじめに
インターン先でプログラミングを勉強中の文系学生。

プログラミングを勉強していくなかで、わかったことが1つある。
それは**エラーを出すことは成長につながるということ**だ。

##プログラミング勉強を始めたばかりの頃
「エラー出したくないなぁ...」
プログラミングを勉強し始めて間もない頃の自分は、こういうことを思っていた。
エラーが出れば、修正するための時間がかかる。
少しでも色々なことを学びたい思いも強かったからか、『エラー＝避けるもの』と考えていた。
一般的には『エラー=間違い』という意味が強いと思う。
少しはその影響を受けていたのだろう。

基礎的なプログラミングの知識程度であれば、問題なくエラーを出さずに学習を進められた。
しかし、それも限界を迎える日が来る。

##エラーの壁
「全然先に進まない…」
プログラミングの学習を進めていくにつれて、どんどん理解しなければならない内容が難しくなっていった。
参考情報をまねて、あまりよく理解できずに作業をしていたこともしばしば。
そんなことをしていれば、エラーも出ることも当然。
その上、エラーを避けていたのだから、表面的な『勉強』しかできていなかったといっても過言ではない。

「さすがに、このままじゃやばいか…?」
このようなことを思っても、どうすれば脱出できるのかもわからない状態。
『エラー=間違い』というイメージを持っていれば、それが原因だとは思わない。
**一体、俺の何が原因なんだ…?**

##エラーと仲良くなる
現状を脱出するためには、自分のやり方を変えなければならないのだろう。
『じゃあ、一体何を変えようか…?』
このようなことを思いながらプログラミングの勉強をしていた。

そんな状態で勉強にも集中できるわけがなく、いつもどおりエラーを出した。
エラーの内容を見てみると、『ここが間違ってるよ!!』と教えてくれている。

(ん? エラーって名前だけど、それ違くね?)
ここでようやくそれに気が付いた。
ほかの分野では『エラー=間違い』と認識されることが多い。
しかし、プログラミングにおいては、それは通用しない。
プログラミングにおいて、『エラー』は『指導者』なのだ。
これほど適切に、自分のどこが間違っているのかを教えてくれる存在はいないだろう。

そのことに気が付いた自分は、エラーに対する認識が変わった。
最近ではエラーを出すことを目標に、プログラミングを進めることもある。
間違えたところを1つ1つ修正していけば、正解にたどり着く。
エラーを出さずに進めていたら、自分の弱点に気が付かないままプログラマーとなってしまうところだった。

**エラーを出すことで、構文を修正できるだけでなく、プログラマーとしても成長できる**

これからもエラーと肩を組みながら、プログラミングを勉強していこう。

##まとめ
**エラーはプログラマーを成長させる**
このことを頭に入れて、プログラミングを勉強していこう!!
ビルド時にCould not find an installed version of Gradle either in Android Studio...が出る場合の対処法

# はじめに

Cordova 8.0.0
Android Studio 3.2 Preview
cordova-android 7.0.0

で`cordova build android`を実行した時にエラーが発生した。

```
cordova build android
Android Studio project detected
ANDROID_HOME=/Users/bin/android-sdk/
JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_101.jdk/Contents/Home
studio
(node:55883) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 1): Could not find an installed version of Gradle either in Android Studio,
or on your system to install the gradle wrapper. Please include gradle 
in your path, or install Android Studio
(node:55883) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.
```

`cordova emulate android`でも`cordova run android`でも同じエラーが出る。
なんかわからんけど、Android Studioのgradleが発見できないみたい。以下で解決した。

以下を`.profile`に追加してgradleのパスを通す

```
export PATH="/Applications/Android Studio 3.2 Preview.app/Contents/gradle/gradle-4.5/bin":$PATH
```

設定を反映する

```
source ~/.profle
```

```
gradle -v
------------------------------------------------------------
Gradle 4.5
------------------------------------------------------------

Build time:   2018-01-24 17:04:52 UTC
Revision:     77d0ec90636f43669dc794ca17ef80dd65457bec

Groovy:       2.4.12
Ant:          Apache Ant(TM) version 1.9.9 compiled on February 2 2017
JVM:          1.8.0_101 (Oracle Corporation 25.101-b13)
OS:           Mac OS X 10.13.3 x86_64
```

gradleのパスが通ったら再ビルドしてみる。

```
cordova build android

...(中略)...

BUILD SUCCESSFUL in 10s
47 actionable tasks: 47 executed
Built the following apk(s): 
	/Users/work/test/platforms/android/app/build/outputs/apk/debug/app-debug.apk
```

正常にビルドできた。

# まとめ

`cordova platform add android`で追加されるのが`cordova-android@7.0.0`の場合にこのエラーが出る。

```
cordova create test com.bathtimefish.test Test
cd test
cordova platform add android@6.2.3
cordova build
```

とした場合はエラーは出ない。7.0.0からgradleの扱いが変わってるのか？
webサイトを作る際に参考にした記事の備忘録②

#はじめに
前回に引き続き、Webサイトを作る際に参考にした記事の備忘録です。
はてなブログみたいな埋め込み型のリンクを作成できたらいいのですが、まだそこまではMarkdown方式を使いこなせていないので、今回は未対応です。
記事のタイトルだけでも自動でとってこれるプラグインとかがあると嬉しいんだけれどなぁ。

##スクロールするとふわっと文字が出てくるようにしたい。
[はるらぼ>>スクロール量に応じて、横からコンテンツが出てくる](http://haryu.hateblo.jp/entry/2016/05/16/002511)
ふわっと表示の書き方に参考にさせてもらいました。

[webpark>>jQueryとCSSのtransitionで可視範囲に入ってからアニメーションさせる方法](http://weboook.blog22.fc2.com/blog-entry-415.html)
アニメーションの条件を図にしてわかりやすく解説されているので、何度か読み返したい記事です。

[theorthodoxworks.com>>スクロールするとふわっと現れる文字や画像](https://theorthodoxworks.com/web-design/scrollanimation/)
これも参考にさせてもらいました。

##jqueryによる要素の表示の仕方に悩んで。
[TASK NOTES>>【jQuery】要素の表示・非表示について (show, hide, toggle)](http://www.task-notes.com/entry/20150112/1420994026)
ちょっとshowやtoggleの表示に悩んで、あれこれと検索しました。

##tableの使い方や行間を調整したい。
[教えてgoo!>>[CSS] tableの行の間隔をあける](https://oshiete.goo.ne.jp/qa/8734837.html)

[プロスタ>>【HTML入門】colspanを使って表セルを横に結合してみよう！](http://programming-study.com/technology/html-colspan/)
セルの結合について勉強になりました。


今回はこんなところで。
SAS日付

# SAS日付
## yymmdd10 の機能
以下のようにゼロ埋めの形式が異なる日付を渡しても、宜しくやってくれる。

```sas:date_test1.sas
DATA _NULL_;
	test_date1_chr = '2017/7/1';
	test_date2_chr = '2017/07/01';
	test_date3_chr = '2017/7/01';
	test_date4_chr = '2017/07/1';
	
	test_date1 = input(test_date1_chr, yymmdd10.);
	test_date2 = input(test_date2_chr, yymmdd10.);
	test_date3 = input(test_date3_chr, yymmdd10.);
	test_date4 = input(test_date4_chr, yymmdd10.);
	
	format test_date1 yymmddn.; 
	format test_date2 yymmddn.; 
	format test_date3 yymmddn.; 
	format test_date4 yymmddn.; 
	
	put test_date1 ;
	put test_date2 ;
	put test_date3 ;
	put test_date4 ;
	
	RUN ;

/*出力
> 20170701
> 20170701
> 20170701
> 20170701
*/
```
Firewalldで連番のportを開放する

# 結論

firewalld.serviceのmanに以下のように書いてありました。

>    port="string"
>        The port string can be a single port number or a port range portid-portid or also empty to match a protocol only.

なので、`port番号-port番号`という指定方法で、連番のportを開放することができます。

```
# firewall-cmd --permanent --new-zone=renban
success
# firewall-cmd --permanent --zone=renban --add-port=10000-10100/udp
success
# cat /etc/firewalld/zones/renban.xml
<?xml version="1.0" encoding="utf-8"?>
<zone>
  <port protocol="udp" port="10000-10100"/>
</zone>
```

設定できました。servicesでも同様に指定できます。
終わり。
Postgresは複数のスキーマを超えてトランザクションが可能

PostgreSQLはひとつのデータベースに複数のスキーマを作れる。そして、スキーマには複数のテーブルを作れる。つまり次のような階層構造になる。

* データベース
    * スキーマ
        * テーブル
        * テーブル
        * テーブル
    * スキーマ
        * テーブル
        * テーブル
        * テーブル

スキーマはプログラミングで言う名前空間のような用途としても使うことができる。従って、大規模なアプリケーションではモジュールやドメイン駆動設計で言う「コンテキスト」をスキーマに分割した構成も考えられる。

気になるのが、__「スキーマを超えてトランザクションがはれるのか？」という点だ。結論としては可能__。以降は再現手順を記す。また、再現コードは[GitHubのリポジトリのsuin/postgres-demo-transaction-across-two-schemas](https://github.com/suin/postgres-demo-transaction-across-two-schemas)から入手できるようにしてある。

## 再現手順

### バージョン

* Postgres 9.6.4

### テーブル、スキーマなどを作る

```sql
CREATE TABLE bar (name text NOT NULL);

CREATE SCHEMA foo;
CREATE TABLE foo.bar (name text NOT NULL);
```

### トランザクションをはってみる

```sql
-- 普通にCOMMIT
BEGIN;
INSERT INTO bar (name) VALUES ('#1 add to public.bar');
INSERT INTO foo.bar (name) VALUES ('#1 add to foo.bar');
COMMIT;

-- 今度はロールバック
BEGIN;
INSERT INTO bar (name) VALUES ('#2 add to public.bar');
INSERT INTO foo.bar (name) VALUES ('#2 add to foo.bar');
ROLLBACK;

-- 登録されたレコードを確認する
SELECT * FROM bar UNION ALL SELECT * FROM foo.bar;
```

実行結果:

```
         name
----------------------
 #1 add to public.bar
 #1 add to foo.bar
(2 rows)
```

## まとめ

* Postgres 9.6.4ではスキーマを超えてトランザクションを効かすことが可能。
2018-04-03 Markdown > txt形式のテキスト長さと見え方 > Qiitaとesa.io > テキスト長さは110文字まで

**2018年4月3日現在。**

```txt:動作環境
Windows 8.1 Pro (64bit)
Google Chrome バージョン: 65.0.3325.181（Official Build） （64 ビット）
```

### link

esa.io上の見え方
https://esa-pages.io/p/sharing/6206/posts/5408/4c0100e5b146ee64e185.html


### 文字の長さチェック用

~~Qiitaでは110文字まで。~~Qiitaは95文字? (1920px)
esa.ioでは110文字まで。(1920px)

```txt
         1         2         3         4         5         6         7         8         9        10        11        12        13        14         1
12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890
```

### case 1a > 最後まで見えるようにした場合

`
         1         2         3         4         5         6         7         8         9        10        11        12        13        14         1
12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890
`

### case 1b > 箇条書きがある場合

Markdown解釈されない (希望どおり)。

`
         1         2         3         4         5         6         7         8         9        10        11        12        13        14         1
12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890
- A
- B
- C
`

### 背景

6年前のテキストをesa.ioに上げようとしていた。
テキストで`-`を使った箇条書きにしている。行長さは160までのものもある。

esa.ioにそのまま張り付けるとMarkdown解釈されるので、見たい形にはならない。
txt形式として貼ろうとしたら、横が切れて読めない状態になった。

Markdown形式にテキストを整形して対応した。
React Nativeでnpmライブラリを使う

##React Nativeでnpmライブラリを使う
###npmライブラリを利用する
- React Nativeではライブラリの管理にnpmを利用する。
- package.jsonでライブラリの管理を行なっている。
- npm経由で追加したパッケージはpackage.jsonに変更が記載される。

###npmライブラリの使用
####No.1 バリデーションを行うライブラリ
#####1. validatarをインストールする
```bash:validatarをインストール
npm install --save-dev validator
```

#####2. 処理を追加する
サンプルなのでreact-native initで作成したApp.jsにコードを記載

```javascript:App.js
import validator from 'validator';

// 文末に追記
const mail = "test@test.com";
console.log(validator.isEmail(mail));
```

#####3. 実行+確認
アプリをリロードして実行結果を確認する。
メールアドレスとして不正がないので「true」がコンソールに表示されています。
不正なアドレスを指定して実行すると「false」が表示されます。

このようにReact Nativeではnpmを利用して外部ライブラリを簡単にインストールし実行することができます。


####No.2 ハッシュ値計算ライブラリ
MD5のハッシュ値計算ライブラリの「jshashes」を利用します。
#####1. jshashesをインストール

```bash:jshashesをインストール
npm install jshashes
```

#####2. 処理を追加する

```javascript:App.js
import jshashes from 'jshashes';

// 文末に記載
const MD5 = new jshashes.MD5();
console.log(MD5.hex('Hello'));
```

#####3. 実行+確認
アプリをリロードして実行結果を確認する。
JavaScriptのコンソールにハッシュ値が表示される(8b1a9953c4611296a827abf8c47804d7)
＊ハッシュ計算のnpmライブラリとして「Crypto」というライブラリが用意されていますが、React Nativeで使用することはできません。
Node環境とReact NativeのJavaScriptの実行ランタイムが異なるためです。
Node標準ライブラリはNode.jsランタイム、React NativeはJavaScriptCoreランタイムを使用する。


####No.3 ネイティブコンパイルが必要なライブラリ
ネイティブを経由しないと取得できない情報をJavaScript経由で取得できるライブラリ「react-native-device-info」を利用します。

#####1. react-native-device-infoをインストール

```javascript:react-native-device-infoをインストール
npm install react-native-device-info
```

#####2. 処理を追加する
```javascript:App.js
import DeviceInfo from "react-native-device-info";

// 文末に記載
console.log(DeviceInfo.getDeviceLocale());
```

#####3. 実行+確認
アプリをリロードして実行結果を確認する。
＊このままアプリをリロードしてもエラーが発生します。これだけではネイティブコードの組込みが完了していないため。

#####4. ネイティブコードの組み込み
```bash
react-native link react-native-device-info
```
コマンド実行後にアプリを再起動します。Nodeサーバを停止し、再度「react-native run-ios」を実行する。
react-native linkコマンドを使うことで、カレントディレクトリのandroidとios以下のネイティブアプリ向けのコードに、必要な設定が追加されます。
＊npm経由のインストールでもネイティブコードの追加ができ、手軽にReact NativeのJavaScriptコードから利用ができる。
c++ tuple に対するmap風の関数適用

#はじめに
この記事では、ある要求に対して、筆者が気づいた1つの解決策を載せています。もっと拡張できる！や、全く別のアプローチがある！などの発見をぜひ楽しんでください。
##要求
同一の型を格納したコレクションに対して、そのすべての要素に関数を適用したい。
#コレクション
タイトルにあるように、サンプルとなるコレクションをstd::tuple で定義してみる。

```cpp:
enum class color { r, g, b };
const auto list = std::make_tuple( 
    color::r, 
    color::g, 
    color::b );
```


std::array のインスタンス化には必要な要素数の明示的な記述は、std::tuple では必要ない。これは、プログラムの拡張性を維持したい場合に嬉しい性質である。また、要素へのアクセスにはアクセサ（std::get）を通すため、不正な操作を防止しやすい。

#実装
早速、map “風”の関数適用の実装をお見せしたい。

アイデアはとても簡単で、tuple の要素へアクセスするための std::get に渡すテンプレートパラメータを、再帰呼び出しと部分特殊化によって満たす。ただし、注意したいのは、そのパラメータとなるインデックスが降順に適用されるところである。

```cpp:
template< typename T, size_t N = std::tuple_size<T>::value >
struct tuple_map
{
    static void apply( const T& t, const std::function<void( const typename std::tuple_element<0, T>::type&, const size_t )>& map_func )
    {
        map_func( std::get<N-1>( t ), N-1 );
        return tuple_map<T, N-1>::apply( t, map_func );
    }
};
 
template< typename T >
struct tuple_map<T, 0>
{
    static void apply( const T&, const std::function<void( const typename std::tuple_element<0, T>::type&, const size_t )>& ) {}
};

```
クラス名、関数名がもし適切ではないとしてもご容赦いただきたい。（ご助言、お待ちしております。）map_func 関数に対して、tuple 要素のインデックスを渡すことができるのも、この tuple_map の特徴である。

前提にあるように、tuple の要素はすべて同一の型であるので、map_func の型は決め打ちできる。（tuple の最初の要素の型を基準にする。）これを満たさない場合は、コンパイルエラーとなる。

#使用例
前述のコレクションに対して使用する。

```cpp:
tuple_map<decltype(list)>::apply( list, []( const color& c, const size_t index ) { std::cout << index << static_cast<uint32_t>(c) << std::endl; } );
```

インデックスを降順に走査するので、b, g, r の順に値が出力される。

#おわりに
筆者は皆さんと同様、要求に対してやや大げさな実装をしたような感覚を否めない。しかし、冗長なコードをなくし、スッキリさせることができるのは間違いない。tuple と template を使った1つの遊び、楽しんでいただけただろうか。
AWS LambdaがNode.js8.10をサポートしたのでasync/awaitを試してみた

# はじめに

本日(2018/04/03)、AWSからこんなアナウンスが来ました。

- [Node.js 8.10 runtime now available in AWS Lambda](https://aws.amazon.com/jp/blogs/compute/node-js-8-10-runtime-now-available-in-aws-lambda/)


やっとLambdaがNode.js8系に対応してくれましたので、早速 `async/await` を試してみました。

## デモっていきましょう

Lambdaの作成方法は割愛します。コンソール画面から作成していただくとか、ServerlessFrameworkから作成していただくとかしてください。
ランタイムは `Node.js 8.10` を指定してください。
今回のデモではDynamoDBにscanとqueryを実行するので、その権限は持っているようにIAMRoleを設定してください。

### デモで使っているDynamoDBはこんな感じ

- TableName: demo-table
- HashKey: id

| id | name |
|:--|:--|
| 1 | tanaka |
| 2 | sato |
| 3 | mori |


### ソースコードはこんな感じ

ちなみにランタイム `Node.js6.10` のときはこんな感じで書いてました。

```js:index.js
const AWS = require("aws-sdk");
const DynamoDB = new AWS.DynamoDB.DocumentClient({
 region: "ap-northeast-1"
});
const co = require("co");

exports.handler = (event, context, callback) => {
  co(function *(){
    // scanの実行
    const scanItems= yield DynamoDB.scan({TableName: "demo-table"}).promise();
    // queryの実行
    const queryItems = yield DynamoDB.query({
      TableName: "demo-table", 
      KeyConditionExpression: "#ID = :ID",
      ExpressionAttributeNames: {"#ID": "id"},
      ExpressionAttributeValues: {":ID": "1"}
    }).promise();
    return {
      scan: scanItems,
      query: queryItems
    };
  }).then(data => {
    return callback(data);
  }).catch(err => {
    return callback(err);
  });
};

```

上記では `co` モジュールを使っていますが、この場合はローカルでcoをnpm installしてZipで固めるなりしてアップロードしなければいけません。
それか

```
promise().then(data_1 => {
  promise().then(data_2 => {
    ...
  })
})
```

というような形で書くかですね…きったねぇ………
ランタイム `Node.js8.10` で書くとこうなります。

```js:index.js
const AWS = require("aws-sdk");
const DynamoDB = new AWS.DynamoDB.DocumentClient({
 region: "ap-northeast-1"
});

exports.handler = async (event) => {
  try {
    // scanの実行
    const scanItems= await DynamoDB.scan({TableName: "demo-table"}).promise();
    // queryの実行
    const queryItems = await DynamoDB.query({
      TableName: "demo-table", 
      KeyConditionExpression: "#ID = :ID",
      ExpressionAttributeNames: {"#ID": "id"},
      ExpressionAttributeValues: {":ID": "1"}
    }).promise();
    // scanとqueryの結果をreturnする
    return {
      scan: scanItems,
      query: queryItems
    };
  } catch (err) {
    // エラー発生時はエラー文をreturnする
    console.error(`[Error]: ${JSON.stringify(err)}`);
    return err;
  }
};

```

### 結果

```
{
  "scan": {
    "Items": [
      {
        "id": "2",
        "name": "sato"
      },
      {
        "id": "1",
        "name": "tanaka"
      },
      {
        "id": "3",
        "name": "mori"
      }
    ],
    "Count": 3,
    "ScannedCount": 3
  },
  "query": {
    "Items": [
      {
        "id": "1",
        "name": "tanaka"
      }
    ],
    "Count": 1,
    "ScannedCount": 1
  }
}

```

## さいごに

今まで非同期処理を実行するときは毎回Promiseで囲ったり、Promiseを返すようにしたり、俗に言うPromise地獄にハマることがよくあったのですが、async/awaitを使うことによって治安がよくなりそうです。

あとは現状動き続けているLambda達をメンテしていくという苦行が待っていますが、治安を守るために必要なことですので、少しづつ対応をしていこうと思います……

### 余談

余談ですが、上記のソースコードでわざとエラーを起こしたときに、Lambda自体は成功となっていたので、KinesisDataStreamsでLambdaがエラーのレスポンス返して来たときに再実行しているあたりがどうなるのか検証必要ですね…
おそらく明示的にエラーだよと返してあげれば良いのでしょうが…

ではまた！
【CSS】CSSで正方形・長方形

DIV要素で囲んでclass属性をつけるだけ


```
/* 正方形*/
.square{
  height: auto;
  position: relative;
  padding:0;
  width:100%;
}
.square:before{
  content: "";
  display: block;
  padding-top: 100%;
}
.square>*{
  position:absolute;
  display:block;
  width:100%;
  height:100%;
  top:0;
  left:0;
}

/* 長方形 */
.rectangle_4vs3{
  height: auto;
  position: relative;
  padding:0;
}
.rectangle_4vs3:before{
  content: "";
  display: block;
  padding-top: 75%;
}
.rectangle_4vs3>*{
  display:block;
  width:100%;
  height:100%;
  position:absolute;
  top:0;
  bottom:0;
}
.rectangle_16vs9{
  height: auto;
  position: relative;
  padding:0;
}
.rectangle_16vs9:before{
  content: "";
  display: block;
  padding-top: 56.25%;
}
.rectangle_16vs9>*{
  display:block;
  width:100%;
  height:100%;
  position:absolute;
  top:0;
  bottom:0;
}
```
macOS で VSCode を HiDPI 外部モニタに表示させるとチラつく問題の解決方法

<https://vscode-doc-jp.github.io/updates/v1_12.html#macOS%E3%81%AE%E3%81%A1%E3%82%89%E3%81%A4%E3%81%8D>
ここに記載されているように、`"editor.disableTranslate3d": true` を設定することで解決できる。

**追記**: 起動時に `--disable-gpu` オプションを指定するのも必要だった。

**追記2**: VSCode を再起動したらチラツキが再発したので、完璧にチラツキを抑えるには low resolution モードにするしかないみたい・・・

該当 issue は <https://github.com/Microsoft/vscode/issues/25934>

electron 側の関連 issue は <https://github.com/electron/electron/issues/9413> と <https://github.com/electron/electron/pull/10390>

chromium 側の修正コミットは <https://chromium.googlesource.com/chromium/src.git/+/0375ae80fe1d94e9d0fc175ce4312d1b3a6bc168>
Postgres: CLIからのSQL実行はpsql -cを使う

コマンドラインから直接にPostgreSQLのSQLを実行したいときは`psql`コマンドを使う。`-c`もしくは`--command`オプションに実行したいSQLを渡す:

```bash
psql データベース名 -c "SQL"
```

たとえば

```bash
psql myapp -c "SELECT * FROM foo"
```

認証が必要な場合は、`-U`、`--username`オプションにユーザ名を、環境変数`PGPASSWORD`[^1]にパスワードをセットして実行する。

[^1]: 環境変数`PGPASSWORD`はセキュリティの観点から非推奨なので、頻繁に認証する場合はパスワードを安全に管理するために[パスワードファイル](https://www.postgresql.jp/document/9.3/html/libpq-pgpass.html)を使うようにしよう。

例:

```
PGPASSWORD=passwd psql myapp -U alice -c "SELECT * FROM foo"
```
プログラミング言語ごとの変数・定数の宣言キーワードまとめ

プログラミング言語ごとの**変数**（再代入可能な値）、**定数**（再代入不可能な値）の宣言キーワードのまとめです（編集リクエスト歓迎）。

|言語|変数|定数|備考|
|---|---|---|---|
|C|-|`const`|`#define`によるマクロ定義あり|
|C++|-|`const`|`#define`によるマクロ定義あり|
|C#|-|`const`||
|Dart|`var`|`final`<br>`const`||
|Go|`var`|`const`||
|Java|`var`|`final`|`var`はJava 10以降|
|JavaScript|`var`<br>`let`|`const`|`let`、`const`はES2015以降|
|Kotlin|`var`|`val`||
|Objective-C|-|`const`|`#define`によるマクロ定義あり|
|PHP|-|`const`|`define`関数によるクラス外の定数定義あり|
|Python|-|-||
|Ruby|-|-|名前が`[A-Z]`で始まるものは定数扱いになる|
|Scala|`var`|`val`||
|Swift|`var`|`let`||
|なでしこ|-|`！`||
SwiftLintで特定のルールを特定のディレクトリだけ除外する方法

# やりたいこと

「テストクラス（≒テストディレクトリ）では`fatal_error_message`（fatal errorを投げる時はメッセージ付きにすること）ルールは除外する」というように、特定のルールを特定のディレクトリだけ除外するということをやりたかったのでその方法について説明します。

結論から言うと、Nested Configurationsを使って基本は有効にするものの、特定のディレクトリでは無効にするという設定を.swiftlint.ymlという作業をすれば良いです。

# 解決方法

[このissue](https://github.com/realm/SwiftLint/issues/823)の情報を元に書きます。

## 前提知識：Nested Configurations

今回[Nested Configurations](https://github.com/realm/SwiftLint#nested-configurations)の知識があった方がわかりやすいので、SwiftLint0.22で導入されたNested Configurationsについて図を使いつつ説明しておきます。
※図は過去の[登壇資料](https://speakerdeck.com/akatsuki174/swiftlintshi-jian-ru-men)から持ってきています。

■0.22より前

子ディレクトリ内では子ディレクトリに存在するswiftlint.ymlしか適用されませんでした。

<img src="https://qiita-image-store.s3.amazonaws.com/0/100736/91c0d669-aa3b-3a34-c244-033f9637d038.jpeg" width="600px">

■0.22以降

子ディレクトリで適用される.swiftlint.ymlは、親ディレクトリの.swiftlint.ymlとマージされたものが適用されます。

<img src="https://qiita-image-store.s3.amazonaws.com/0/100736/da9acf2b-7667-ec80-9c9a-824e03a4efb0.jpeg" width="600px">

## yml記述例

Nested Configurationsがわかったところで、実際の解決方法に入っていきます。今回はデフォルトでDisabledの`fatal_error_message`を、テストディレクトリのみdisabledにします。

まずルート直下の.swiftlint.ymlは以下のように記述します。

```
opt_in_rules:
  - fatal_error_message
```

次にテストディレクトリ直下に以下の.swiftlint.ymlを置きます。

```
disabled_rules:
  - fatal_error_message
```

テストディレクトリに.swiftlint.ymlを置いていなければ`fatal_error_message`が全てのディレクトリで有効になってしまいますが、上記の通りにすることによって2つのymlがマージされた時にどうやらdisabledの方が優先されるらしく、結果的にテストディレクトリでは`fatal_error_message`を適用対象外にすることができます。

# おまけ：exculedではダメ？

.swiftlint.ymlには`exculed`というキーワードがあります。
最初これでできたりするんじゃないかと思ったのですが、どうやらSwiftLint側ですでに用意しているルールに対して`exculed`キーワードを使う場合は「除外する文字列」が記述対象のようです。

[SwiftLintのConfigurationより](https://github.com/realm/SwiftLint#configuration)

```yml:既存ルールへのexculedの使用例
identifier_name:
  excluded: # excluded via string array
    - id
    - URL
```

一方カスタムルールにおける`exculed`は「除外するパス」が記述対象のようです。

[SwiftLintのDefining Custom Rules](https://github.com/realm/SwiftLint#defining-custom-rules)より

```yml:カスタムルールへのexculedの使用例
custom_rules:
  pirates_beat_ninjas: # rule identifier
    excluded: ".*Test\\.swift" # regex that defines paths to exclude during linting. optional
```

# おまけ：ディレクトリ単位ではなくファイル単位で指定する場合は？

[Disable rules in code](https://github.com/realm/SwiftLint#disable-rules-in-code)に書かれているように、次のコメントでdisableにするルールを指定すれば良いです。
`// swiftlint:disable <rule1> [<rule2> <rule3>...]`
このコメントで無効にされたルールは、以下のコメントが出て来るまで無効になります。
`// swiftlint:enable <rule1> [<rule2> <rule3>...]`
eslint で構文チェック (Webpack)


## eslint メモ

* JavaScript 構文チェッカー。独自ルールの設定もできる
* Sublime Text で SublimeLinter-eslint パッケージをインストールすると、.eslintrc に設定したルールでリアルタイムにエラー表示してくれる
* コマンドで `--fix` 付きで実行すると、[ここのレンチマークの付いたエラー](https://eslint.org/docs/rules/)を自動修正してくれる

## 導入の手順

今回は Webpack で使う前提。以下、Webpack 導入済とした説明

* package.json があるディレクトリで  
  `npm install eslint eslint-loader --save-dev`
* webpack.config.js に追記 (下に例)
* 設定ファイル .eslintrc を作成 (下に例)
* 間違った構文のあるコードでテスト

## webpack.config.js の例

* `enforce: "pre"`  
  babel-loader でES5に変換する前にコード検証させるために必要
* `options: {}` で[オプション設定](https://www.npmjs.com/package/eslint-loader)が可能

```
// module: {
//    	rules: [
      {
        enforce: "pre",
        test: /\.js$/,
        exclude: /node_modules/,
        loader: "eslint-loader",
      },
      // babel-loader の設定とか続く
```

## 設定ファイル .eslintrc の例

* 基本 JSON だが、// コメントが書ける (/**/ はエラー)
* rules のプロパティの値(配列)の第１引数：0は無効、1は警告、2はエラー

```
// 下に解説あり
{
  "root": true,
  "extends": "eslint:recommended",
  "rules": {
    "indent": [ 2, 2 ],
    "linebreak-style": [ 2, "unix" ],
    "semi": [ 2, "always" ],
  },
  "env": {
    "es6": true,
    "node": true,
    "browser": true,
    "jquery": true
  },
  "parserOptions": {
      "sourceType": "module"
  }
}
```

* `"root": true`  
  このプロジェクト内のみに適用 (デフォルトは親ディレクトリまで遡って適用する)
* `"extends": "eslint:recommended"`  
  [https://eslint.org/docs/rules/](https://eslint.org/docs/rules/) でチェックマークが付いた推奨設定を適用
* ` "indent": [ 2, 2 ]`  
  スペースの数。タブなら tab と書く
* `"linebreak-style": [ 2, "unix" ],`  
  改行コードが /n でないとエラー
* `"semi": [ 2, "always" ]`  
  セミコロン無しの文はエラー
* `"quotes": [ 2, double ]`  
  クォーテーションが"でないとエラー
* `"env": `  
  適用する環境 (該当の環境に合わせた設定群が適用される)
* `sourceType": "module",`  
  コードをモジュールとして扱う


## ツール

* [.eslintrc editor](https://pirosikick.github.io/eslintrc-editor/)  
  GUIでルールを選択して.eslintrcを作成できるツール

## 参考記事

* [公式：ESLint - Pluggable JavaScript linter](https://eslint.org/)
* [eslint - npm](https://www.npmjs.com/package/eslint)
* [ESLintのルールを自作しよう！ - Yahoo! JAPAN Tech Blog](https://techblog.yahoo.co.jp/javascript/how-to-create-eslint-rules/)
* [Step by Stepで始めるESLint - Qiita](https://qiita.com/howdy39/items/6e2c75861bc5a14b2acf)
* [Parsing error: 'import' and 'export' may appear only with 'sourceType: module' · Issue #462 · AtomLinter/linter-eslint](https://github.com/AtomLinter/linter-eslint/issues/462)
.ssh/config で Visual Studio Team Services のSSH接続

# 鍵の作成

`Visual Studio Team Services`用の鍵をファイル名を指定して作成します。

```bash
$ ssh-keygen -t rsa -C {メールアドレス等} -f id_rsa.vs
```

# .ssh/configの修正

ファイルを編集します。

```bash
$ vi ~/.ssh/config
```

任意の箇所に`Visual Studio Team Services`を追加します。

```text:~/.ssh/config
Host vs-ssh.visualstudio.com
  HostName vs-ssh.visualstudio.com
  IdentityFile ~/.ssh/id_rsa.vs
  Port 22
```

# `Visual Studio Team Services`で鍵を登録

```bash
$ pbcopy < ~/.ssh/id_rsa.vs.pub
```

手順は公式を参考にしてください。

[Use SSH key authentication - Microsoft](https://docs.microsoft.com/en-us/vsts/git/use-ssh-keys-to-authenticate)

# 参考

[GitHubにSSH接続できるようにする方法 - Qiita](https://qiita.com/katsukii/items/9fd5bbe822904d7cdd0a)
[.ssh/configファイルでSSH接続を管理する - Qiita](https://qiita.com/0084ken/items/2e4e9ae44ec5e01328f1)
paiza 非公式難易度表


paizaは各問題1回しか提出できないので、どの問題を開けるかの参考になれば。勿論問題タグは付けられません。
あと、私が一発ACできた問題はかかった時間を併記しておきます。

## 前説
こちらは、paizaのSランクのばらつきを示すためのものです。

- SランクはSランク問題群の前半で取りましょう。
- ガチ勢はSランクを取っただけで満足することのないよう。

[190125]　っていうか　一番大事なこと書くの忘れてた。　**本記事はpaizaのSはAtCoderのC(緑)上位っていうのは最近の問題では必ずしもあてはまらないのではという主張の根拠になります。**

## Aランク

|ID|問題番号|問題名|解答制限時間[^1]|状況|主観的点数[^2]|
|:--|:--|:--|:--|:--|:--|
|5|A001|数の探索|120|再チャレンジ|400[^3]|
|13|A002|SNSの友達関係|120|AC 10|300|
|14|A003|盤面ゲーム|120|再チャレンジ|300|
|20|A004|あみだくじ|120|AC 14|200|
|24|A005|パイザボウルゲーム|60|AC 29|400|
|28|A006|平面上の移動シミュレーション|120|AC 31|300|
|38|A007|ともだちをたどる|120|AC 6|300|
|45|A008|パレードを制覇せよ|120|再チャレンジ|400|
|50|A009|ビームの反射|40|AC 11|300|
|55|A010|クリスマスイルミネーション|120|再チャレンジ|300|
|62|A011|うなぎを蒲焼きにしたくない|120|AC 12|300|
|71|A012|最適な練習|120|AC 32|400|
|78|A013|部屋の掃除|120|AC 20|300|
|87|A014|二角取り|120|再チャレンジ|500|
|95|A015|敷き詰めパズル|120|再チャレンジ|500|
|111|A016|踏切の時刻表|120|再チャレンジ|400|
|123|A017|落ちものシミュレーション|30|AC 10|200|
|137|A018|美術館のセキュリティ|30|AC 18|200|
|151|A019|いかさまシャッフル|60|AC 14|300|
|163|A020|文字をなぞれ|40|AC 26|300|
|175|A021|海岸線|120|AC 9|200|
|189|A022|正方形の足し引き算|40|AC 20|300|
|202|A023|週休2日制|40|再チャレンジ|200|
|215|A024|アイテムの分け前|40|再チャレンジ|400|
|229|A025|動物の体調管理|40|再チャレンジ|500|
|240|A026|paizaラーニングのお得な使い方|120|再チャレンジ|500|
|244|A027|paiza諸島の侵食|120|再チャレンジ[^4]|300|
|259|A028|武器の強化|120|AC 12|**150**[^5]|
|272|A029|詰み防止チェック|120|再チャレンジ|400|
|279|A030|上司と部下|120|再チャレンジ|300[^6]|
|292| |漫画の整列|120|AC 8|400|
|299|A031|ある数でつくられた数列|120|AC 9|300|
|302|A032|Paiza電鉄|120|再チャレンジ|300|

## Sランク

S005は欠番です.

|ID|問題番号|問題名|解答制限時間|状況|主観的点数|
|:--|:--|:--|:--|:--|:--|
|6|S001|島探し|120|再チャレンジ|200|
|10|S002|最短距離を測る|120|AC 38|200|
|17|S003|嘘つき探し|120|未|1000+|
|21|S004|積まれた文字|120|AC 22|300|
|29|S006|ビリヤードの球突き|120|再チャレンジ|300|
|43|S007|データヒストグラム|120|AC 14|300|
|65|S008|サイコロで迷路|120|再チャレンジ|300|
|102|S009|辞書順最小|40|AC 11|300|
|115|S010|ひとりすごろく|40|AC 14|300|
|129|S011|追いかけっこ|120|未|800|
|141|S012|ハイライト機能|120|AC 22|500|
|157|S013|理想のタイムトラベル|120|AC 33|400|
|169|S014|直方体のマージ|120|再チャレンジ|500|
|183|S015|ABC文字列|40|再チャレンジ|400|
|194|S016|水たまり|120|再チャレンジ|700|
|208|S017|シートの重ね合わせ|120|再チャレンジ|600|
|223|S018|天気の予報|120|未|900|
|237|S019|テレポート|120|AC 52[^7]|500|
|250|S020|商品の運搬|120|AC 62|400|
|252|S021|魔法バトル|120|再チャレンジ|500|
|265|S022|センサーをかいくぐれ|120|未|1000+|
|278|S023|村人の友好関係|120|再チャレンジ|600|
|285|S024|海面の調整|120|再チャレンジ|600|

[^1]: paizaにおいてペナルティがかからない時間とします
[^2]: AtCoder基準
[^3]: 80点取れればAランク獲得できるので、それで良ければ200点
[^4]: Ruby特有のTLEが出たので、直しただけで通った(約30分)(なおこのTLEを出してもAランク取得できる)。
[^5]: Bランク問題の間違いではないでしょうか。。
[^6]: 言語によっては500点の見積もり ご注意
[^7]: 当初コンパイルエラーが出て提出できなかった、ローカルで通ったのは35分ぐらい。ちなみに原因はグローバル変数過多だった(あるあるですが…エラーメッセージ出してよね)。
IngressのスキャナのVer.upを誰よりも速く知る方法 v3

#はじめに
過去に[IngressのスキャナのVer.upを誰よりも速く知る方法 v2](https://qiita.com/nuwaa/items/398506244d08dbd8cb57)を公開していました。
が、2018/03/30の日本時間の08:15頃でしょうか。Androidアプリのダウンロードサイトのレイアウトに大幅な変更があったようです。
これに伴い、ずーっと問題なく動作していたスクリプトに不具合が発生したため、修正版をリリースします。

#していたこと

・cronで15分毎に以下のWebページをチェックしていました
　・Android版
　　　https://play.google.com/store/apps/details?id=com.nianticproject.ingress&hl=ja
　・iOS版
　　　https://itunes.apple.com/jp/app/ingress/id576505181?mt=8

つまり、
```0,15,30,45 * * * * /home/nuwaa/scanner_chk/go
```ってことです。

で、goの中身はというと、

```
cd /home/nuwaa/scanner_chk

wget -q -O ANDROID "https://play.google.com/store/apps/details?id=com.nianticproject.ingress&hl=ja"
AV=`cat ANDROID | sed "s/</\n</g" |grep "AF_initDataCallback" | grep "ds:5" | sed -e "s/<[^>]*>//g" | cut -d, -f5 | sed -e "s/\"//g"`
echo `date +"%Y/%m/%d %H:%M:%S "`$AV >> android
OLD=`tail -n 2 android | head -n 1 | awk '{print $3}'`
NOW=`tail -n 1 android | awk '{print $3}'`
if [ $OLD != $NOW ]; then
  echo "Android" | mail -s "Scanner Update" **自分のメールアドレス**
fi

wget -q -O IOS "https://itunes.apple.com/jp/app/ingress/id576505181?mt=8"
IV=`cat IOS | grep "バージョン" |  sed -e "s/<[^>]*>//g"  | awk '{ sub("{\"data\".*$",""); print $0; }' | awk '{print $2}'`
echo `date +"%Y/%m/%d %H:%M:%S "`$IV >> ios
OLD=`tail -n 2 ios | head -n 1 | awk '{print $3}'`
NOW=`tail -n 1 ios | awk '{print $3}'`
if [ $OLD != $NOW ]; then
  echo "iOS" | mail -s "Scanner Update" **自分のメールアドレス**
fi

rm ANDROID IOS
```
となります。
上記スクリプトは前半がAndroidアプリのパーションの差異を、後半がiOSアプリのバージョンの差異をチェックして、差異があったらメールするようにしていますので、仕組みに興味がある方は、[過去の記事](https://qiita.com/nuwaa/items/398506244d08dbd8cb57)と見比べてみてください。

#蛇足
現在の私は、通知はメールで飛ばすのではなく、telegramに飛ばしています。
また、この方法はスクレイピングですが、ゲーム内の情報の収集ではなく、ゲームそのもののバージョン情報を取得しているだけとなりますので、問題はないと認識しております。
問題があるとしたら「15分毎のチェック頻度をもうちょっと減らすべきでは」といった見方があるかも知れませんね。。。
[Resolved] Scipy lecture notes, Edition 2017.1 > typo > 3.1.4 > 2D arrays (such as images)

@ Scipy lecture notes, Edition 2017.1
https://www.scipy-lectures.org/_downloads/ScipyLectures-simple.pdf
p53
3.1.4 Basic Visualization

> 2D arrays (such as images)

```py
>>> image = np.random.rand(30, 30)
>>> plt.imshow(image, cmap=plt.cm.hot)
<matplotlib.image.AxesImage object at ...>
>>> plt.colorbar()
<matplotlib.colorbar.Colorbar object at ...>
```

コードが2D arraysのものではなく、1D plottingのものになっている。

Web版だけ修正されている。

@ https://www.scipy-lectures.org/intro/numpy/array_object.html#basic-visualization

連絡した。
https://github.com/scipy-lectures/scipy-lecture-notes/issues/369

Edition 2017.2に修正版が入ることになるのだろうか?
(ハイライト情報がなくなる。。。)

こういう間違いはJupyterでドキュメントを作り、PDFにしていれば起きないことかもしれない。

### 修正された
(追記 2018/04/09)

修正されたPDFファイルとなっている。
https://www.scipy-lectures.org/_downloads/ScipyLectures-simple.pdf
環境構築手順1 GCP ComputeEngine の作成

友人たちと集まって開発するMobprograming会を開催中。
環境構築手順をまとめます。

# GCP ComputeEngine の作成
![2018-04-03.png](https://qiita-image-store.s3.amazonaws.com/0/223111/16f9af01-93aa-1b0e-dcb0-018b1410d638.png)

![2018-04-03 (1).png](https://qiita-image-store.s3.amazonaws.com/0/223111/936ce38e-dbf1-b7aa-d460-b3f9e0a57451.png)

![2018-04-03 (2).png](https://qiita-image-store.s3.amazonaws.com/0/223111/9acd1d0d-e198-7534-aa7f-1c6f62ff2bdf.png)
永続ディスクを10GBにしています（無料枠内だったと思う）。docker使うので、こまめに不要なimageやcontainer, volumeの削除をしないとあっという間に10GB使っちゃいます。[こちら](https://suin.io/537)を参考に掃除します。
マシンタイプはmicroだと無料ですが、docker全然動きませんでした。他は有料なので、使わないときはインスタンス停止しましょう。


あとは一番下の作成ボタンをクリック
以上です。

SSHボタンからSSHクライアントがブラウザ上で起動します。

![2018-04-03 (3).png](https://qiita-image-store.s3.amazonaws.com/0/223111/6300c29f-5d80-86d1-b13a-341a95f6604d.png)
twitterのapiをrailsで使う際の注意点まとめ

# この記事の目的

twitterのapiを使うにあたって必要なことのまとめ。railsでの使用を前提にしています。

# app登録

https://apps.twitter.com/

でappの登録を行う。

# keyについて

| name | description |
|:--|:--|
| Consumer Key (API Key) | アプリケーション API Key になります. アプリケーションごとに付与されるユニークな ID です. |
| Consumer Secret (API Secret) | アプリケーションの API シークレットです. |
| Access Token | アクセストークン. それぞれのユーザーがそのアプリ用に発行されるものです. これが紐付けられてるユーザーはアプリ側から操作(権限選択制)できます. |
| Access Token Secret | アクセストークンのシークレットです. |

ログインしたユーザーのアカウントから何かを行いたい場合はAccess TokenとAccess Token Secretが必要になる。これをoauthで認証した際に取得してくる。

# Oauthの仕組みについて

APIを使う際に認証の情報を利用者側に渡すのは怖いため提供者に認証を代わりにやってもらうための仕組み。API利用者は認証した結果のみを得る。

Consumer keyはサービス事業者に登録したい際に得るものなのでwebサービス毎に得るkeyです。対してAccess Tokenはユーザーごとのものになります。

# つかってみよう！

https://developer.twitter.com/en/docs
Scrapyでノーベル章受賞者の情報を取得する(PJDV 6.4章) - XPath

#概要
- [PJDV 5.7～5.7.1](https://qiita.com/int_main_void/items/be86128d7694a13cdde3)、[PJDV 5.7.3](https://qiita.com/int_main_void/items/e63555837d47f479c757#_reference-1daa0a1bd9eaf7442e40)の続き。
- [O'Reilly Japan - PythonとJavaScriptではじめるデータビジュアライゼーション](https://www.oreilly.co.jp/books/9784873118086/)(PJDV)の勉強用
- PJDVではXPathの説明があまりないので、XPath基本事項の記事を紹介します。
- 次回、scrapy shellを使い、PJDV 6.4「最初のScrapyスパイダー」(nwinners_list_spider.py)のXPathを具体的に見ていきます。

#XPath基本事項

- [クローラ作成に必須！XPATHの記法まとめ - Qiita](https://qiita.com/rllllho/items/cb1187cec0fb17fc650a)
    - 一番最初に読むべき記事

その他、参考にした記事。XML向け(タグが自由に定義できる)なことに注意。

- [ロケーションパス (2) - TECHSCORE](http://www.techscore.com/tech/XML/XPath/XPath3/xpath03.html/)
- [XPathを使ってみよう- XMLDB.JP](http://www.xmldb.jp/tech/xpath_1.php)
    - ```ロケーションパス=軸::ノードテスト```となっているけど、```ロケーションステップ=軸::ノードテスト```がいいような。
- [XPath使いのための日本語チートシート-pearl-whiteのホームページ][xpathチートシート]
    - pdf http://aoproj.web.fc2.com/xpath/XPath_cheatsheets_v2.pdf



#最初のScrapyスパイダー(nwinners_list_spider.py)
##コード
[nwinners_list_spider.py](
https://github.com/Kyrand/dataviz-with-python-and-js/blob/master/Ch06_Heavyweight_Scraping_with_Scrapy/nobel_winners/spiders/nwinners_list_spider.py)

書籍に誤植があり、githubで修正されているようです。

```python:誤_nwinners_list_spider.py(PJDV_p145)
            country = h2.xpath('span[@class="mw-headline"]'\
            'text()').extract()
```

```python:正_nwinners_list_spider.py(github)
            country = h2.xpath('span[@class="mw-headline"]/text()')\
            .extract()
```

##XPath記述箇所

```python
h2s = response.xpath('//h2')
```

```python
country = h2.xpath('span[@class="mw-headline"]/text()').extract()
```

```python
winners = h2.xpath('following-sibling::ol[1]')
```

```python
for w in winners.xpath('li'):
```

```python
text = w.xpath('descendant-or-self::text()').extract()
```

#参考
## Scrapy
- [scrapy shellでスクレイピングする - Qiita][scrapy_shell_qiita]
- [Scrapy shell — Scrapy 1.5.0 documentation][scrapy_shell]
- [Scrapy 1.2 ドキュメント][scrapy_jp]


<!--LINK-->
[scrapy_shell]:https://doc.scrapy.org/en/latest/topics/shell.html
[scrapy_jp]:http://scrapy-ja.readthedocs.io/ja/latest/index.html
[scrapy_shell_qiita]:https://qiita.com/te20/items/80879072defdff645b85
[nobel]:https://en.wikipedia.org/wiki/List_of_Nobel_laureates_by_country
[xpathチートシート]:http://aoproj.web.fc2.com/xpath/
[xpathまとめ]:http://tech.vasily.jp/entry/xpath
Chunk

# To Categorize

  Class|binder of pointer(s)

　ヒトは(凝集させること|categorization)を，把握するという行為の補助に用いる．
　機械は，pointer(s)が束ねられていなくとも精確に憶えていられる．
　ごく一握りの集団を除くpeopleは，偶発的凝集のようなpointer(s)を憶えていることは困難．
　つまり，OOPとは，human orientedなのだ．
　そういえば，あのanti OOP engineerは，東大卒だった．

# functionを関数と称ぶのをやめる

　Math.functionとの混同を避けるべく，今後はprogrammingに於けるfunctionを'関数'と称ぶのをやめることにした．

　http://ryo021021.hatenablog.com/entry/2014/05/28/051453

## function

Operator f()とは「式であること」を指示する

1. parameter(s)が触媒
2. parameter(s)が素材
3. parameter(s)無し
4. 必ずしも1件以上の値が返却されるとは限らない

## Math.function

　y = f(x)|(y, x)(従属, 独立)

　公式や定理がMath.functionの最たるもの

# Template Method

　(項|単項式)という概念は，TerminalExpression@InterpreterPatternのみならずNonterminalExpession@InterpreterPatternを含んでいる．
　[TerminalExpression, NonterminalExpression]という(structure|categorization)では，coveringが難しい．
　(項|単項式)と看做せるものはChunkと考えて，[TerminalExpression, NonterminalExpression]という<観>に導入してみる．
　Template Methodを構成するeach functionは，Chunkだ．
　数学に於いて式を一文字の変数で表すような慣わしは，ごく一握りの集団を除くpeopleの常套戦法．
機械立ち上げの現場雑談

この記事はここにものってます↓
http://soup01.com/ja/2018/03/31/tripsinsite/

最近は現場経験が少しつづ増えてきていつもどうすれば現場でもっと作業時間減らすか？Troubleshootingをスムーズを進めるのかをずっと考えてるのね。以下は自己流の考え方なので参考いただけると嬉しいです。

<h1>電源入れたかを確認しよう</h1>
これはかなり大事です。だから敢えて一番最初に書きます。何回もお客さんからなぜ通信できない？なんでエラー出るの？って聞かれたらまず気がつくのはそもそも電源が入ってません。

<h1>配線確認しよう</h1>
説明しなくてご存知だと思います。配線間違ってたらうまく動けるわけがないですね。例えば日本ではDIモジュールNPNは多いですがシーメンスなどの欧州メーカーはPNPのほうが多いです。この辺もちゃんとマニュアルを読みながら確認しまよう。

<h1>Firmwareを確認しよう</h1>
ほかのFAメーカーはどんな感じなのかあまり詳しくないがSiemensはFirmwareはついてかなり厳しいです。PLCはV4.2だけどプロジェクト自体はV4.0で作られたらまだ動けるけど特殊モジュールはこうはいけません。現場いくまえにメーカーのWEBでFirmwareを確認し、事前にFirmwareをダウンロードしたほうがいいでしょう。

<h1>FB・FC・DateTypeのVer確認</h1>
これは多分？Siemensの話なんですが彼らのモジュールがHPで専用のFB、FCなどをダウンロードすることができます。めっちゃ便利でしょ？ですが！半年前HPで落としたのV2.0のFBはあくまでもこの特殊モジュールのFirmwareV2.XXに対応できるの話だけです。つまり？半年後はまた同じなモジュールを購入してFirmwareがもアップされたかもしれません。そうすると昔使ってたのV2.0のFBも使えません！まずグーグルで探して最新のFBをダウンロードしましょう。

<h1>バージョンUPされたFBなどの確認</h1>
これは本当にやめてほしい。FBのバージョンがアップしちゃうと大体変数名が変わってしまっりなくなったりの場合が多いのです。丁寧に確認し手打ちしましょう。

<h1>Factory Resetしよう</h1>
どうしてモジュールがエラー出て消えない、自分が絶対正しいと思う場合は、まず電源入れ直ししてみよう。それでもだめならFactory Resetしましょう。

<h1>WBSのUser名、Passwordをちゃんと管理しよう</h1>
SiemensのPLC、HMI、モジュールは大体WEB Serverがついてます。中にはTIAで見れない情報もたくさんのってます。なので…それらのLogin資料ちゃんと保存しておきましょう。

<h1>自分が無知でありとみとめよう</h1>
そうすればいろいろな思い込みも消えますし、中国にはこういうことわざがあります。山外有山、人外有人。つまり自分より賢い人が必ずいます。常に謙遜な態度で意見を受けましょう。

<h1>コーヒーを飲みに行こ</h1>
見つめてる鍋が煮えない。どうしてもうまくいかない場合はコーヒーでもいいしタバコでもいいし一回いまいる現場から離れよう。そうすると閃きがくるかもしれません。
Python > if (pi1==pi2>1): > 違和感の正体

```txt:動作環境
ideone (Python 3.5)
```

https://ideone.com/ysPfWl

```py
pi1 = 3.1415
pi2 = 3.1415
 
if (pi1==pi2>1):
	print('larger than 1 and equal')
```

```txt:run
larger than 1 and equal
```

PyMieScattのコードで上記のような`==`と`>`のチェックをしている実装がある。
「pi1とpi2が同じ値でかつ、１より大きい」という実装のようだ。

こういう書き方は読みやすいのだろうか? (違和感を感じた)

### link

複数の`<`を使えるという記載は以下に見つけた。
`x < y < z`という書き方の用語名は不明。

https://docs.python.org/3.6/reference/compound_stmts.html

> Also note that the semicolon binds tighter than the colon in this context, so that in the following example, either all or none of the print() calls are executed:

```py
if x < y < z: print(x); print(y); print(z)
```

### 違和感の正体

違和感の正体に気づいた。
Cでの実装を見る。

https://ideone.com/kjpBFX

```c
#include <stdio.h>
 
int main(void) {
    int pi1 = 314;
    int pi2 = 314;
    int wrk;
 
    wrk = (pi1 == pi2);
    printf("%d\n", wrk);  // 1
 
    if (pi1 == pi2 > 1) {
        printf("larger than 1 and equal\n");
    }
 
    return 0;
}
```

```txt:run
1
```

`larger than 1 and equal`は表示されない。

Pythonでは問題ない実装は、Cでは問題がある実装となる。

CもPythonも(+他の言語も)使う人にとっては違和感のある書き方なのだろう。
Python3でシンプルなカップ麺専用タイマー（通知機能付き）　＋　macのAutomatorでアプリ化 



コーティング中にカップ麺に湯を入れたまま忘れることが頻繁に起こっていました。カップ麺好きの僕にとっては耐えられません！（自分のせいですが汗）そこで、カップラーメン専用のタイマーを作りました！

## Pythonのコード
```ramenTimer.py

#!/Users/my_name/.pyenv/versions/3.6.5/bin/python3.6 -tt 

import os
import time

def ramenTimer():
    #タイマーの時間を設定(１８０秒　＝　3分）
    time.sleep(180)
       
    #通知メッセージ
    os.system("""
              osascript -e 'display notification "ラーメンできたよ！" with title "Times Up"'
              """)


def main():
    ramenTimer()

if __name__ == '__main__':
    main()
```
設定時間は３分（180秒）にしています。
通知メッセージを設定することで、３分後に画面右上に⬇️のような通知が出ます。

![スクリーンショット 2018-04-02 18.12.18.png](https://qiita-image-store.s3.amazonaws.com/0/229015/10263170-c1e6-579a-21a0-6d84397c7620.png)

## Automaterでapp化

![スクリーンショット 2018-04-02 18.02.52.png](https://qiita-image-store.s3.amazonaws.com/0/229015/aad9a4f6-3163-c5d6-c124-cf570729bde3.png)

シェルスクリプトに、上で作ったpython ファイル(ramenTimer.py)のパスを書くだけ。
command + s でappとして保存。

これで、spotlightから呼び出せるようになります。
スマホで３分タイマーを設定するより早いです！！

のびたカップ麺を食べたくない人は、ご自由にコピペしてください。