OmniAICreator/Qiita-1.07M huggingface dataset:
MongoDB Beginning

# Introduction
MongoDB is a cross-platform, document oriented database that provides, high performance, high availability, and easy scalability. MongoDB works on concept of collection and document.

# Comparison
Difference between MongoDB and RDMS.
Or Difference between MongoDB and MySQL.

### *Concept
|MongoDB|RDMS|
|:----:|:----:|
|Database |Database|
|Table |Collection|
|Document|Row|
|Field|Column|
|Embedded Document|Table Join|
|_id|Primary Key|

### *Database Operations
|MongoDB|RDMS|
|:----:|:----:|
|create database test_database; |use test_database|
| show databases; |show dbs|
|drop database test_database; |use test_database; db.dropDatabase() |

### *Collection Operations
|MongoDB|RDMS|
|:----:|:----:|
|create table products (…); |db.createCollection(“products”)|
|alter table testcoll add …; |Automatically generated|
|show tables; |show collection|
|drop table products; |db.drop("products")|

### *Document Operations
|MongoDB|RDMS|
|:----:|:----:|
|insert into products values('a','b'); |db.products.insert({ name : ‘a’ , type : “b”  })|
| select * from products; |db.products.find()|
|select name from products where name = 'a' order by name; |db.products.find({ name : 'a' }, { name : 1 }).sort({ name : 1 })|
|select count(*) from products; |db.products.count()|



# Installation
```
brew update
brew install mongodb
sudo mkdir /data/db
sudo mkdir /var/log/mongodb
sudo chmod go+w /data/db
```
windows10にoracle動作環境を構築してみる！

oracleの動作が見たくなり、自宅PCに環境構築・・
とりあえず、ここからダウンロードしてインストール！
http://www.oracle.com/technetwork/database/database-technologies/express-edition/downloads/index.html

インストールが終わったら↓で起動。
SQLコマンドライン　⇒　
<code>SQL> STARTUP</code>

ちなみにシャットダウンは
<code>SQL> SHUTDOWN</code>

と、adminページが8080ポートだったので、

```
SQL> connect
ユーザー名を入力してください: system
パスワードを入力してください: ********
接続されました。
SQL> exec dbms_xdb.sethttpport(18080)

PL/SQLプロシージャが正常に完了しました。
```
で変更。
インストールフォルダのショートカットも併せて修正。

自分用に手順を残しておく・・。
コマンドメモ

# windows
Windows ロゴ キー  + Tab	タスク ビューを開く。
Windows ロゴ キー  + Ctrl + D	仮想デスクトップを追加する。
Windows ロゴ キー  + Ctrl + →	右側に作成した仮想デスクトップと切り替える。
Windows ロゴ キー  + Ctrl + ←	左側に作成した仮想デスクトップと切り替える。
Windows ロゴ キー  + Ctrl + F4	使用中の仮想デスクトップを閉じる。

#コマンドメモWindows
C:\Users\...... > type xxx.csv | find "ABCD" > XXX.txt

# macos / linux
twitterの画像保存コマンド twphotos -u yamatonao -t favorites -n 114514 -r
sudo apt-get install python-software-properties
macbookスリープ防止 caffeinate -i
GUIを立ち上げずに，Virtual Boxを立ち上げるコマンド（SSHで入るということ）
└VBoxManage startvm "ubuntu" --type headless
linuxのコンソールのバックスクロール（モニタでCLIのとき）
└Shift + Pageup
Linux ライトプロテクト外し方　mount -o remount,rw /dev/sda1
Ubuntu エクスプローラー アドレス入力 Ctrl + l
Ubuntu ターミナル Ctrl + Alt +t
scp -r bin yamatonao@192.168.0.101 [送信元][送信先]

sudo apt-get install aptitude
sudo aptitude install ssh
sudo vi /etc/ssh/sshd_config

sudo du -g -x -d 5 / | awk '$1 >= 5{print}'

文字列置換 find . -type f -print | xargs sed -i "s/ABCDE/abcde/g"
ファイル名置換 remane abcde ABCDE * / rename 's/ABCDE/abcde/g'
バイナリ認識対策A find . -type f -exec grep --color -nH --text -e ^0 {} + > ~/Desktop/list.txt
バイナリ認識対策B grep -a "ABCDE" xxx.csv > output.csv
共有ライブラリコンパイル g++ -shared -fPIC -o libABCDE.so ABCDE.cpp
VPC内のPrivateリソースにAPIGateway経由でアクセスする

# tl;dr;
VPC内にNLBで展開すれば，VPC integrationを使って，API GatewayでVPC内で動作しているinternalなAPIサーバを叩くことができる．

# やりたいこと
これは過去の話ですが，APIGateWayを通してのリクエストを実装する時，Lambdaや直接外部に公開しているエンドポイント経由で叩くといった方法がありますが，それらはVPC内のリソースを叩くことができませんでした．

そこで，VPC integrationという機能が2017 12月くらいに発表されました．これは，その名の通り(?)API Gatewayの統合レスポンスとして特定のVPCを指定することができます．VPCはprivateなsubnetだとしても指定可能なので，実装したAPIサーバーへのアクセスをAPI Gateway経由でのみできるようになります．

この記事ではこの方法を解説したいと思います．

# 手順

## 1.VPCを作成する
+ VPCを作成します．
+ public / privateなサブネットに切るなどありきたりな構成で問題ないです．

## 2.VPC内にEC2インスタンスを立てる．
+ ここに，実装したAPIサーバーを展開するといいです．
+ VPCのprivate subnetに展開するといいと思います．

## 3.ELBをつくる．
+ ここからが本番です．
+ NLB(Network Load Balancer)を選択してください．

![ELB](https://qiita-image-store.s3.amazonaws.com/0/176701/5062e16a-e96c-cc65-e2dc-e330ef464469.png)

+ これの真ん中のやつです．
+ NLBでないとAPI GateWayから叩く事ができないので注意してください．
+ 上で作成したEC2をこのロードバランサーにぶら下げてください．

## a.余談
+ ここまでの流れをElasticBeanstalkで作成するなら，`eb cli`を使うことをおすすめします．
+ `eb cli`では展開するVPCやAZを選択できたり，ELBのタイプも`--elb-type network`とするだけで簡単に作成できます．また，defaultでinternalなものが作成できるので繁雑なウェブコンソールを使うよりもこちらのほうがおすすめです．

## 4.VPC リンクをつくる．
+ API GatewayのウェブコンソールにVPCをリンクというタブがあるのでこれを選択します．
+ すると下の図のような画面がでるので，適当な名前，説明を振り，先程作成したNLBを選択します．

![vpclink](https://qiita-image-store.s3.amazonaws.com/0/176701/74265a61-836e-1122-80ea-eb4574e8cd52.png)

+ VPCリンクの作成がわりと遅いのでお茶でも飲みながら待ちます．

## 5.API Gatewayを作成する．
+ swaggerとかで読み込むなり，自分で頑張ってぽちぽちするなりしましょう．
+ 統合リクエストを編集します．あるリクエストの統合リクエストを見ると以下のような画面になります．

![api gateway](https://qiita-image-store.s3.amazonaws.com/0/176701/8afee781-1964-cc2d-f2ac-3245fa49a373.png)

+ ここで統合タイプでVPCリンクを，その下のVPCリンクでは先程，上で作成したものを選択します．
+ 正しく動作するかは，「テスト」を使うといいです．単純にパススルーするわけではなくヘッダを変更したり，認証はさんだりするケースがあると思うのでそれらの挙動が正しいかを調べるためにもこれは効果的です．(レスポンスがどう処理されているかが見えるのでハッピー)

## 完成
+ 完成です．これでlambda等を使うことなく，VPCを叩く事ができるようになりました．


# なにが嬉しいの？
+ APIサーバーを完全にinternalにできる．
    + 不用意に外に晒すの怖い＞＜
    + API Gatewayで適切な認証を噛ますことも可能． 



# 参考
[【新機能】API Gateway VPC integrationを使ってみた #reinvent ｜ Developers.IO](https://dev.classmethod.jp/cloud/aws/aws-reinvent-apigateway-vpc-integration/)
[Amazon API Gateway でプライベート VPC とのエンドポイント統合をサポート - AWS](https://aws.amazon.com/jp/about-aws/whats-new/2017/11/amazon-api-gateway-supports-endpoint-integrations-with-private-vpcs/)
シンプルにTinder


## はじめに
- 自動スワイプ機能です。
- seleniumを入れてください。

- [chrome driver](http://chromedriver.chromium.org/downloads) を同じフォルダに配置してください。
- スワイプ制限のある方は月500円払いましょう。缶ジュース我慢してください。


## ソースコード

```python:test.py
# coding: UTF-8
import os
import time
import random
import sys
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions
from selenium.webdriver.common.by import By
chrome = webdriver.Chrome('./chromedriver')
chrome.get("https://tinder.com/app/login")
val = input('ログイン後、0を押してください')
max_count = 500
if val == 0:
    for num in range(1,max_count):
        num=num+1
        chrome.find_element_by_tag_name("body").send_keys(Keys.RIGHT)
        time.sleep(0.3)
        print(str(num))
    print(str(max_count)+"人スワイプしました")
    chrome.close()
```

- max_countに好きな数字を入れてください。
- `python test.py`　でどうぞ。
gitのエラー(Your branch is ahead of 'origin/hotfix/hogehoge' by 5 commits.)

# エラー内容

```terminal
$ git status
On branch fix/hogehoge
Your branch is ahead of 'origin/hotfix/hogehoge' by 5 commits.
  (use "git push" to publish your local commits)

nothing to commit, working tree clean
```

なぜか現在のブランチ`fix/hogehoge`が、`hotfix/hogehoge`（削除済みのブランチ）を追跡していた。
なので`hotfix/hogehoge`から5つ分コミットが進んでしまってますよ〜大丈夫ですか？という指摘をされた。
この状態でのpull、push等は何も問題はないのだが、なんだか気持ち悪いので対処したい。

# 対処法
### 現在の状況を確認

```terminal
$ git branch -a
* fix/hogehoge
  master
  remotes/origin/HEAD -> origin/master
  remotes/origin/hotfix/hogehoge //ローカル、リモートともに削除済みのブランチを追跡中
  remotes/origin/fix/hogehoge
  remotes/origin/master
```

allオプションを付けて作業ブランチ、追跡ブランチを確認。

追跡ブランチにローカル、リモートともに削除済みのブランチ（`hotfix/hogehoge`）が残っており、現在のブランチ（`fix/hogehoge`）はそれと紐付いていた。

（今回はpush→pullもしていたため、`remotes/origin/fix/hogehoge`も同時に存在している）

### 追跡ブランチを削除

```terminal
$ git fetch --prune
From github.com:<リポジトリ名>
 - [deleted]         (none)     -> origin/hotfix/hogehoge
```


ブランチの削除はリモートとローカルの間で反映されないため、pruneオプションを付けて`git fetch --prune`を行う。

これでリモートブランチの削除をローカルに反映する事ができる。

参考：https://qiita.com/yuichielectric/items/84cd61915a1236f19221

```terminal
$ git branch -a
* fix/hogehoge
  master
  remotes/origin/HEAD -> origin/master
  remotes/origin/fix/hogehoge
  remotes/origin/master

//remotes/origin/hotfix/hogehogeがなくなっている
```

これでリモートで削除済みの`hotfix/hogehoge`（リモートブランチ）に対する`origin/hotfix/hogehoge`（追跡ブランチ）が削除された。


### 追跡を解除

これで解決するかと思ったら、追跡ブランチがなくなっても紐付きは解除されないらしい。

```terminal
$ git status
On branch fix/hogehoge
Your branch is based on 'origin/hotfix/hogehoge', but the upstream is gone.
  (use "git branch --unset-upstream" to fixup)

nothing to commit, working tree clean
```

エラー文に従い、`git branch --unset-upstream`を行う。

```terminal
$ git branch --unset-upstream
$ git status
On branch fix/set-tokyo-timezone
nothing to commit, working tree clean
```

これで解除されので、次に`git push`した時に`remotes/origin/fix/hogehoge`が追跡ブランチになるはず。（恐らく...）

ひとまず解決！

## 参考
https://qiita.com/yuichielectric/items/84cd61915a1236f19221
ティラノスクリプトでPWA対応アドバンス

[こちら](https://qiita.com/violet2525/items/13587773aa70fc44c92f)の記事でティラノスクリプトで製作したゲームをブラウザゲームとして公開する際のPWA対応について書きましたが、その後1本ブラウザゲームを公開する際に得たなんやかんやを書き連ねます。

##オフラインキャッシュ
前述の記事の内容だと、一応リソースは全てキャッシュしてくれるにはしてくれるのですが、実際にゲームをプレイしている際にはキャッシュではなくサーバー上のファイルを読みにいってしまうファイルというものがあります。

###キャッシュから読み込むもの
* 画像
* 音声ファイル
* 動画（たぶん）

###キャッシュではなくサーバーから読み込むもの
* シナリオファイル
* [loadcss]で読み込むcss
* [loadjs]で読み込むjs

実際にDevToolのNetworkタブを見てみればわかるのですが、サーバーから読み込むファイルはゲーム中に該当ファイルへの通信が発生した際に「ファイル名?+ランダムな数値」へアクセスしています。
しかしServiceWorkerでのキャッシュは「ファイル名」のみで行っているため、サーバーへの通信が発生しているようです。

これではオフラインプレイができません。いやブラウザゲームなんだからいいだろと言われてしまえばそれまでですが、せっかくできるのだからやってみたい。やる。

###全部オフラインキャッシュするには
[こちら](http://buddycollection.blog.fc2.com/blog-entry-9.html)のブログを参考にしました。

```javascript:tyrano/lib.js
    $.loadText = function(file_path, callback) {
        （中略）       
        $.ajax({
            url: file_path + "?" + Math.floor(Math.random() * 1000000),
            cache: false,
            success: function(text){
                order_str = text;
                callback(order_str);
            },
            error:function(){
                alert("file not found:"+file_path);
                callback("");
            }
        });
```
これを

```javascript:tyrano/lib.js
    $.loadText = function(file_path, callback) {
        （中略）       
        $.ajax({
            url: file_path + "?" + 1,
            cache: false,
            success: function(text){
                order_str = text;
                callback(order_str);
            },
            error:function(){
                alert("file not found:"+file_path);
                callback("");
            }
        });
```
こう
同じ要領でcssとjsも対応します

```javascript:tyrano/plugin/kag/kag.tag_system.js
  tyrano.plugin.kag.tag.loadcss = {
    vital: ["file"],
    pm: {
      file: ""
    },
    start: function (pm) {
      var file = pm.file;
//      var style = '<link rel="stylesheet" href="' + file + "?" + Math.floor(Math.random() * 1E7) + '">';
      var style = '<link rel="stylesheet" href="' + file + "?" + 1;
      $("head link:last").after(style);
      this.kag.stat.cssload[file] = true;
      this.kag.ftag.nextOrder()
    }
  };
```

```javascript:tyrano/plugin/kag/kag.tag_ext.js
tyrano.plugin.kag.tag.loadjs = {
    vital: ["storage"],
    pm: {
      storage: ""
    },
    start: function (pm) {
      var that = this;
      //ここから追加
      $.ajaxSetup({
        cache: true
      });
      //ここまで追加
      $.getScript("./data/others/" + pm.storage, function () {
        that.kag.ftag.nextOrder()
      })
    }
  };
```
loadjsは、スクリプト中で直接ランダムな数値を付与しているわけではありませんが、getScriptのデフォルトがキャッシュをしない設定なので、ajaxSetupでキャッシュをする設定に上書きしています。
実際にゲームとして公開する場合は数値をべた書きではなく別ファイルに定数として持たせて、バージョンアップごとに定数を書き換える、という形になるのかな

そして最後にtsw.jsで読み込んでいるファイルのうち、シナリオファイルと[loadcss]で読み込むcssと[loadjs]で読み込むjsのファイル名末尾に"?定数"を付与すればおｋ

*実はまだパッチ読み込みの部分も残ってるけどブラウザゲーとして公開するならパッチってそんな使わないよね…？*

一応これで短編ノベル程度ならオフラインでも動いています。立ち絵がヌルヌル動いたりフルボイスだったり長編ノベルだとどうなるかはわからない
あとティラノスクリプトの本体部分に手を加えているので**やるなら自己責任でお願いします！！！**
git で過去のコミットをまとめる。

何回やっても不安になるので備忘録的に記載

git logでこんな感じになっていて、すべてを 開発中1 にまとめたい場合

```
commit e9c336ee9898f52235a6b080460ab7f3c3d9e1ae
Author: hogehoge<hoge@hage>
Date:   Sun Jun 10 09:01:21 2018 +0900

    開発中3

commit a778f5a235x639a7ac0c159296e3edcb5b1737c3
Author: hogehoge<hoge@hage>
Date:   Sun Jun 10 08:32:59 2018 +0900

    開発中2

commit 012627a2552a8a23e650aca5e8a5323536b64a3c
Author: hogehoge<hoge@hage>
Date:   Sat Jun 9 05:13:31 2018 +0900

    開発中1

commit 22698f5a235a6cb56c3ac60a2cdbaccc045a8537
Author: hogehoge<hoge@hage>
Date:   Fri Jun 8 21:00:05 2018 +0900

   開発はじまり
```

一番下の「開発はじまり」のコミットポイントを指定して git rebase を実行する。

```
git rebase -i 22698f5a235a6cb56c3ac60a2cdbaccc045a8537
```

実行すると下記の通りの確認画面が立ち上がる。

```
pick 012627a 開発中1
pick a778f5a 開発中2
pick e9c336e 開発中3

# Rebase 22698f..e9c336e onto 22698f (3 command(s))
#
# Commands:
# p, pick = use commit
# r, reword = use commit, but edit the commit message
# e, edit = use commit, but stop for amending
# s, squash = use commit, but meld into previous commit
# f, fixup = like "squash", but discard this commit's log message
# x, exec = run command (the rest of the line) using shell
# d, drop = remove commit
#
# These lines can be re-ordered; they are executed from top to bottom.
#
# If you remove a line here THAT COMMIT WILL BE LOST.
#
# However, if you remove everything, the rebase will be aborted.
#
# Note that empty commits are commented out
```

マージさせたいものを squash で指定する。

```
pick 012627a 開発中1
squash a778f5a 開発中2
squash e9c336e 開発中3
```

保存して閉じるとコメント入力を求められるので、

```
# Merage
コミットをマージする。
```

といった感じで記載する。

結果下記のように

```
commit 012627a2552a54a03d2c31a5e8f5723536a64a3c
Author: hogehoge<hoge@hage>
Date:   Sat Jun 9 05:13:31 2018 +0900

    コミットをマージする。

commit 22698f5a235a6cb56c3ac60a2cdbaccc045a8537
Author: hogehoge<hoge@hage>
Date:   Fri Jun 8 21:00:05 2018 +0900

    開発はじまり
```

とまとめられる

```
git push -f origin ブランチ名
```

で強制的にgitリモートに持っていける。
共同開発時は超注意
GAEのデプロイされたversionで接続先DBを変更する

# 環境ごとにバージョンを検知して違うDBに接続したい
GoogleAppEngineにはプロジェクト、サービス、バージョンという概念があります。
CircleCIなどのCIツールで、異なるバージョンのコードを異なるバージョンとしてデプロイして、サブドメインを切って（自動で生成）接続先ごとに、本番環境、ステージング環境、テスト環境。。。等に振り分けて、サブドメインごとに違うDBに接続したいと思いました。

# 問題
`google.golang.org/appengine` ライブラリには、`appengine.VersionID()`というメソッドが用意してあるので、それが使えるのではないかと思いました（最初はね）。
ところが、このメソッドは`context.Context()`を引数に取るので、今回のケースでは使えません。というのも、dbに接続するのは`init()` の中であり、その時点ではまだcontextを引っ張ってくることができないからです。

# 解決策
やれやれ困ったなどうしようかと思ってググったら解決している人がいました。
[解決策？](https://stackoverflow.com/questions/42148739/go-app-engine-get-version-in-init-without-context)

`init.go` の中で、app.yamlに記述してある `version: hogehoge` を参照すればバージョンわかるくね！ということだったのでなるほど！確かに。そうすることにしました。

CircleCIでブランチごとに自動でデプロイ先のバージョンを切り替えていたのですが。。。。

```
deploy-test: &deploy-test
    run:
      name: Test Deployment
      command: |
        appcfg.py --oauth2_access_token $(gcloud auth print-access-token) -V バージョン名 update ./app/app.yaml
```

こうすると、app.yamlに記述されたversionは変更されることなく（デフォルトはv1）、`バージョン名`　というバージョンにデプロイされます。これだと、結局、コードを走らせた時に検知することができないので、app.yamlを.config.yamlの前後の行で書き換えてデプロイすることにしました

```
deploy-test: &deploy-test
    run:
      name: Test Deployment
      command: |
        sed -i -e s/v1/バージョン名/ app/app.yaml
        appcfg.py --oauth2_access_token $(gcloud auth print-access-token) -V バージョン名 update ./app/app.yaml
        sed -i -e s/バージョン名/v1/ app/app.yaml
        rm -rf app/app.yaml-e
```

一件落着。
もっといい方法あったら教えてください。。。

# 追記
そもそも、app.yamlにバージョン指定を毎回書くのは[推奨ではない](https://cloud.google.com/appengine/docs/standard/go/config/appref)そう。

> The recommended approach is to remove the version element from your app.yaml file and instead, use a command-line flag to specify your version ID:

なので、app.yamlの書き換えの下りはいらないですね。
Sequel Pro json型データがimportできない時の対処


## Sequel Proでjson型データがimportできない時の対処

Sequel Proでダンプファイルをimportすると以下のエラーが:joy:

```
create a JSON value from a string with CHARACTER SET 'binary'
```

どうやらまだ製品版で`json型データ`対応していなかった:eyes: (2018.6.10現在)
https://github.com/sequelpro/sequelpro/issues/2706

以下のリンクの `test-builds` の方を使うと解決:laughing:

https://sequelpro.com/test-builds
$http_response_header にはリダイレクトが全部入ってくる

# $http_response_header にはリダイレクトが全部入ってくる

使い捨てスクリプトで (http で) `file_get_contents` + `$http_response_header` は手軽なのでよく使うんですが、`$http_response_header` が大量にあることがあって、なんだろうと調べてみたらリダイレクトされたときのヘッダーが全部格納されてました。

```php:aaa.php
<?php
header('Location: /bbb.php');
```

```php:bbb.php
<?php
header('Location: /ccc.php');
```

```php:ccc.php
<?php
header('Location: /zzz.php');
```

```php:zzz.php
<?php
echo 'zzz!';
```

このような4つのファイルを作って `php -S localhost:8000` して built in server で試してみます。

```php
<?php
echo file_get_contents('http://localhost:8000/aaa.php');
print_r($http_response_header);
```

上記の出力は下記のようになります。

```
zzz!
Array
(
    [0] => HTTP/1.0 302 Found
    [1] => Host: localhost:8000
    [2] => Connection: close
    [3] => X-Powered-By: PHP/7.0.27
    [4] => Location: /bbb.php
    [5] => Content-type: text/html; charset=UTF-8
    [6] => HTTP/1.0 302 Found
    [7] => Host: localhost:8000
    [8] => Connection: close
    [9] => X-Powered-By: PHP/7.0.27
    [10] => Location: /ccc.php
    [11] => Content-type: text/html; charset=UTF-8
    [12] => HTTP/1.0 302 Found
    [13] => Host: localhost:8000
    [14] => Connection: close
    [15] => X-Powered-By: PHP/7.0.27
    [16] => Location: /zzz.php
    [17] => Content-type: text/html; charset=UTF-8
    [18] => HTTP/1.0 200 OK
    [19] => Host: localhost:8000
    [20] => Connection: close
    [21] => X-Powered-By: PHP/7.0.27
    [22] => Content-type: text/html; charset=UTF-8
)
```

これ多分単純に突っ込んでるだけですよね。
つまりよくある

```php
preg_match('/HTTP\/1\.[0|1|x] ([0-9]{3})/', $http_response_header[0], $matches);
$statusCode = (int) $matches[1];
if ($statusCode === 200) {
    // 
}
```

このような処理はせっかくリダイレクトの森を抜けてボディが得られたのに 200 以外と判定されて失敗することになります。
しっかりやるなら「最後のヘッダのステータスコード」を取得する必要があるけど使い捨てでそこまでするのはちょっと…。

まぁ知っておくといつか得するかもしれない。
🔰SSH一部ユーザーだけ、パス無し鍵認証をするメモ


久々古いCentOSマシンを触って、、一部ユーザーだけパスワードなし認証を使用と思い、
調べたところ、sshのバージョンが古いと、できなかったのでメモ。

> ※注意：sshの設定を失敗すると、リモートで作業などしているとそもそもアクセスできなくなり、データセンターに行って直で触らないといけなくなったり要注意です。

### sshの設定ファイルを変更

```

$ sudo vim /etc/ssh/sshd_config

```

```:sshd_config
# パスワード認証方式をOFF
PasswordAuthentication no

# 指定ユーザーだけパスワード認証方式をOFF
Match User hoge
	PasswordAuthentication no
```


### 今設定した内容の確認

```
$ /usr/sbin/sshd -t
/etc/ssh/sshd_config: line 91: Bad configuration option: Match
/etc/ssh/sshd_config: terminating, 1 bad configuration options

```

**Bad configuration option: Match**
OpenSSHのバージョンが古く、Matchが使えない模様...

### Matchコマンドが対応しているバージョンか、確認

```

$ /usr/bin/ssh -v
OpenSSH_4.3p2, OpenSSL 0.9.8b 04 May 2006
usage: ssh [-1246AaCfgkMNnqsTtVvXxY] [-b bind_address] [-c cipher_spec]
           [-D [bind_address:]port] [-e escape_char] [-F configfile]
           [-i identity_file] [-L [bind_address:]port:host:hostport]
           [-l login_name] [-m mac_spec] [-O ctl_cmd] [-o option] [-p port]
           [-R [bind_address:]port:host:hostport] [-S ctl_path]
           [-w tunnel:tunnel] [user@]hostname [command]

```

### あとは、OpenSSHのアップデートをして、設定反映すればOKなはず。

最近のCentOS6等では、デフォルトでOpenSSH_5.3のはずなので使えるはずですが、
それでもだいぶ古い汗


参考
https://qiita.com/Just4fun/items/17569b6ac6aeabe8dfe8


### 参考にさせて頂いたサイト様

http://akiniwa.hatenablog.jp/entry/2013/09/09/080718

http://neoblog.itniti.net/ssh-password-exception/

https://qiita.com/maru3/items/9cdae8cc2593b664d42e
JSONファイルを整形してくれるCLIツールを公開した

JSONを整形してくれるCLIツールを作って[公開した](https://www.npmjs.com/package/format-jsonfile)。

## 導入方法
```bash
$ npm install -g format-jsonfile
```

これにより、ターミナルでどこからでも `format-jsonfile` を利用可能になる。

## 使い方
第1引数に、整形したいjsonファイルのパスを入れるだけである。
`sample.json` がカレントディレクトリにある場合、整形のコマンドはこのようになる。

```bash
$ format-jsonfile sample.json
```

整形されたjsonのデフォルト出力先は、標準出力である。

### コマンドラインオプション
* `-o | --out` : 後続するパスに、整形済みjsonを出力する
* `-w | --width` : インデントの幅を、後続する数値に変更する
* `-t | --tabs` : インデントをタブにする
* `-h | --help` : ヘルプを表示する

### 利用例
```bash
$ cat sample.json
{"array":[1,2,3], "object":{"num":1,"bool":true}}

$ format-jsonfile sample.json -w 4
{
    "array": [1,2,3],
    "object": {
        "num": 1,
        "bool": true
    }
}
```

## 作った理由
JSONを整形してくれるウェブサービスはごまんとあるが、ウェブ経由だと巨大なJSONファイルの扱いに不向きである。
オフラインで処理が完結するツールを探したが、意外と手頃なものが存在しなかった。
このため、勉強がてら自分で作ることにした。

## その他
* npm公開の手順は、[こちら](https://docs.npmjs.com/getting-started/publishing-npm-packages)を参照した
    * ユーザー登録から実際の公開作業まですべてターミナル上の数コマンドで完結し、便利であった
* `npm -g install` で実行可能なバイナリとしてインストールさせるための設定方法は[こちら](https://docs.npmjs.com/files/package.json#bin)
    * `package.json` に1行追加するだけで済む
    * 実行するjsファイルの1行目に `#!/usr/bin/env node` を追加するのは忘れないようにしよう
* CLIコマンドのパースは [minimist](https://github.com/substack/minimist) が便利
NginxでのCORS設定（Cookie利用版）


NginxでCORSの設定するときにとりあえず全オープンするために
Access-Control-Allow-Origin *
の設定がググるとよく出てくるのだけど、これだとCookieを利用している場合、 *が許可されないため、CORSがうまく動かない。

```nginx:nginx.conf
       add_header Access-Control-Allow-Origin *;
       add_header Access-Control-Allow-Methods "POST, GET, OPTIONS";
       add_header Access-Control-Allow-Headers "Origin, Authorization, Accept";
       add_header Access-Control-Allow-Credentials true;
```

以下のような設定にすると、基本は動くようになる。
(originヘッダ乗せてこないとうまく動作しないため、ない場合は動作しないけど、、)

↓

```nginx:nginx.conf
if ($http_origin = ''){
        set $http_origin "*";
}

add_header P3P "CP=\"UNI CUR OUR\"";
add_header Access-Control-Allow-Origin $http_origin always;
add_header Access-Control-Allow-Credentials true always;
add_header Access-Control-Allow-Methods "POST, GET, PUT, DELETE, OPTIONS" always;
add_header Access-Control-Allow-Headers "Origin, Authorization, Accept" always;

if ($request_method = OPTIONS ) {
        add_header Access-Control-Allow-Origin $http_origin always;
        add_header Access-Control-Allow-Methods "POST, GET, PUT, DELETE, OPTIONS" always;
        add_header Access-Control-Allow-Headers "Origin, Authorization, Accept" always;
        add_header Access-Control-Allow-Credentials true always;
        add_header Content-Length 0;
        add_header Content-Type text/plain;
        return 200;
 }
```


>補足：
P3P "CP=\"UNI CUR OUR\　はIEでiFrameかつクロスドメインでCookieを使いたい場合に追加
（サードパーティCookieを使うということなので、そもそもサービスとしてどうなの？はありますが、やむを得ない場合は追加）
after_create, after_update, after_destroyというようなafter_xxxのcallbackを止めたいとき

# 起きたこと

`after_create`に定義しているメソッドを止める。

ex)

``` ruby: 
after_create :call_name

def call_name
  return throw(:abort) unless watasan.present?
end

```


`uncaught throw abort error ` が発生。

# 対応方法

`after_xxx` をとめるときは `raise ActiveRecord::Rollback` を使う

``` ruby: 
after_create :call_name

def call_name
  raise ActiveRecord::Rollback unless watasan.present?
end

```

＊　**Rollbackはさせたくない場合は他の例外を渡してあげるとその例外を吐いてくれます。**


# 雑談

`before_xxx` を止めたいときは `throw(:abort)`を明示する必要があります。

# 参考
https://github.com/rails/rails/pull/8479#issuecomment-46124455
https://blog.toshimaru.net/active-record-callbacks/
【ブロックチェーン論文まとめ④】Securify：スマート契約の実践的セキュリティ分析

# はじめに
第4回目です。スマートコントラクトのセキュリティの回です！

# Title

Securify: Practical Security Analysis of Smart Contracts
2018/6/4
https://arxiv.org/pdf/1806.01143.pdf

# Abstruct

ブロックチェーンにより第三者を信頼することなく任意のプログラム（スマートコントラクト）とトラストレスにやりとりできるようになった。しかし、実際には数十億ドル規模のセキュリティ問題が発生しています。
そこでこの問題を対処するために我々は、EthereumスマートコントラクトのセキュリティアナライザであるSecurifyを紹介します。これは、スケーラブルで完全に自動化され、特定のプロパティをもとに、マートコントラクトの振る舞いが安全かどうか証明します。
 Securifyの分析は2つのステップで構成されています。
まず、コントラクトの依存グラフを象徴的に分析して、コードから正確な意味情報を抽出します。次に、プロパティが保持されているかどうかを証明するのに十分な条件を取得するコンプライアンスパターンと違反パターンをチェックします。
また、拡張性を考慮して、すべてのパターンは指定されたドメイン固有の言語で指定されます。 Securifyは公表されており、ユーザーは約22,000人で、定期的にセキュリティ監査を実施しています。我々は、世の中のEthereunmスマートコントラクトを評価するSecurifyを提案し、Securifyはスマートコントラクトの安全性を効果的に証明し、重大な違反を発見できることを実証しました。

# Conclusion

我々は、Ethereumスマートコントラクトのための新しい軽量でスケーラブルな検証ツールであるSecurifyを紹介しました。 
Securifyはいくつかの重要な利点を享受しています。

 - すべての契約行動を分析する。
 - アラームが正しいものか誤ったものかを分類する際のユーザーの労力を軽減する。
 - ユーザーが新しい脆弱性パターンを出現したときに報告できる。
 - バイトコードの逆コンパイル、最適化、パターンチェックまでの分析パイプラインは、スケーラブルで既製のDatalogソルバーを使用して完全に自動化されています。
VirtualBoxにCentOS7をインストール時のメモ

基本的には下記サイトを参考にインストールする。先人に感謝。
[CentOS7.3をVirtualBoxにインストールする方法 - Qiita](https://qiita.com/uhooi/items/c41ccaed66e944aa859d)

##インストール途中VirtualBoxとWindowsホストを切り替えるキーが分からなかった。
右Ctrlがデフォルトで設定されている。

## インストール後、yum updateに失敗。 `ping www.google.co.jp`がName or service not knownとなってしまう。

[centos7 - ping: http://google.com: Name or service not known - Stack Overflow](https://stackoverflow.com/questions/43366826/ping-http-google-com-name-or-service-not-known/47272983)

```bash
nmtui
```
![nmtui.png](https://qiita-image-store.s3.amazonaws.com/0/136617/ad9b751e-79e0-8bab-3582-29fdd3694b04.png)

Edit a connection -> connectionを一つ選択 -> Automatically connectを選択して [X]にする。 それで<OK>ボタン押す。
rake routes実行時のメモ

rubyのrailsで新しいページをroutes.rbに一行追加（ルーティングに追加）したので、
rake routesで確認しようとしたら、
rake aborted!
No Rakefile found (looking for: rakefile, Rakefile, rakefile.rb, Rakefile.rb)

というエラーメッセージが出たので検索した。

以下のページを見たら解決した。
https://ameblo.jp/micha7-micha1/theme-10057658645.html
（rake routesは、プロジェクトのある階層に移動して実行しないとエラーになると書いてある。）

解決のポイント
cdを使って、カレントディレクトリを移動してから、rake routesをする。

感想
エラーメッセージの内容からすると、No Rakefile found（=Rakefileが見つからないよ）と言っているので、同じカレントディレクトリにrakefileがないといけないようだ。

rakefileについては、以下のページを参考に読んだ。
https://qiita.com/you8/items/ce893fa27b19fd6da031
https://qiita.com/tbpgr/items/5c2f192da0ccf8fad5e1
リアルタイムどう書く過去問（E13）

問題はこちら->http://nabetani.sakura.ne.jp/hena/orde13hextet/
以前書いていたのを修正したものです。
まず座標（のようなもの）をどうするかですが、
問題のアルファベットのアスキーコードに、二列目は10,三列目は20....と足して、
右上の六角形との差が14、左上との差が15、隣との差が1となるようにしてみました。
それぞれのテトロミノは、基準とした任意の六角形と他の六角形間の経路で表しました（p/2)。
またrot/6で基本形を回転した図形を作っています。
一致する図形の存在のみが問題ですので、重複は無視しています。
調べる図形は、select/3で4つの六角形の順列を作り、一致する図形が見つかるまで、
ok/3で突き合わせています。
同じ組み合わせで順番が違う突き合わせをしていて効率は悪いですが、速度は問題ありません。

```Prolog
ston([X],X):-X<102,!.
ston([X],Y):-X<106,!,Y is X+10.
ston([X],Y):-X<111,!,Y is X+20.
ston([X],Y):-X<115,!,Y is X+30.
ston([X],Y):-Y is X+40.

l(X,N,Y):-Y is X+N.         %経路

rot(P1,P2,P3,PN1,PN2,PN3):-rot1(P1,PN1),rot1(P2,PN2),rot1(P3,PN3),!.
rot1([],[]):-!.
rot1([H|L],NL):-m(H,H1),rot1(L,L1),NL=[H1|L1] .

ok(A,[T],B):-l(A,T,B),!.      %相互の関係を満たすピースがあるか
ok(A,[H|T],B):-l(A,H,C),ok(C,T,B).

solve2(H,P1,P2,P3):-select(A,H,L1),select(B,L1,L2),ok(A,P1,B),
                    select(C,L2,[D]),ok(A,P2,C),ok(A,P3,D),!.

solve1(_,_,_,_,0):-!,fail.
solve1(H,P1,P2,P3,N):-
      solve2(H,P1,P2,P3);
      (rot(P1,P2,P3,PN1,PN2,PN3),N1 is N-1,solve1(H,PN1,PN2,PN3,N1)).

solve(H,P):-p(P,[P1,P2,P3]),solve1(H,P1,P2,P3,6),!.
solve(_,"-"):-!.

solve0(B3,C,R):-solve(B3,R),(R==C->write("pass ");write(" fail ")),writeln(R),!.

pre([]):-!.
pre([_,B,C|T]):-
    atom_chars(B,B1),maplist(atom_codes,B1,B2),maplist(ston,B2,B3),solve0(B3,C,R),pre(T).

start:-str(S),split_string(S,"\s,\n","\s",L),pre(L),!.

%start.

p("B",[[-15],[15],[1]]).   　　%基本の図形のピース相互の関係
p("D",[[14],[-1],[-14]]).
p("I",[[-1],[1],[1,1]]).
p("J",[[-1],[-14],[-14,-14]]).
p("L",[[1],[-15],[-15,-15]]).
p("N",[[14],[1],[1,15]]).
p("O",[[-14],[1],[15]]).
p("S",[[-15],[1],[1,15]]).
p("Y",[[-15],[1],[14]]).
p("Z",[[14],[1],[1,-14]]).

m(1,-14).  % 60度反時計回りのmove
m(-14,-15).
m(-15,-1).
m(-1,14).
m(14,15).
m(15,1).

str("0       glmq    B
1       fhoq    -
2       lmpr    N
3       glmp    Y
4       dhkl    J
5       glpq    D
6       hlmq    O
7       eimq    I
8       cglp    S
9       chlq    Z
10      glqr    L
11      cdef    -
12      hijk    -
13      kpqu    B
14      hklm    B
15      mqrw    B
16      nrvw    B
17      abfj    B
18      abcf    B
19      mrvw    D
20      ptuv    D
21      lmnr    D
22      hklp    D
23      himr    D
24      dhil    D
25      hlpt    I
26      stuv    I
27      bglq    I
28      glmn    J
29      fghm    J
30      cdgk    J
31      lpst    J
32      imrw    J
33      dinr    J
34      cdin    L
35      eghi    L
36      cdeg    L
37      bgko    L
38      eimr    L
39      jotu    L
40      kotu    N
41      lqtu    N
42      cdim    N
43      klot    N
44      kloq    N
45      kmpq    N
46      qrvw    O
47      mnqr    O
48      kopt    O
49      mnpq    S
50      bfko    S
51      chin    S
52      hmnq    Y
53      nqrw    Y
54      bchi    Z
55      inrw    Z
56      cfgj    Z
57      jnpv    -
58      flmp    -
59      adpw    -
60      eilr    -
61      bejv    -
62      enot    -
63      fghq    -
64      cjms    -
65      elov    -
66      chlm    D
67      acop    -
68      finr    -
69      qstu    L
70      abdq    -
71      jkln    -
72      fjkn    -
73      ijmn    -
74      flqr    -").


```
UE4のマーケットプレイスでPayPalで支払いができない

マーケットプレイスで[サマーセール](https://www.unrealengine.com/marketplace/event-sale)が開催中だったので色々と物色したところ
「[Synty Studios](https://www.unrealengine.com/marketplace/profile/Synty%20Studios)」のアセットに惹かれ幾つか購入しました。

その購入手続きでPayPalでの支払いができない問題に遭遇したので解決方法を残しておきます。

SteamやUdemyなどの支払いにPayPalを使用しているので、
PayPalのアカウントが有効なのは間違いなく、
エラー表示もなく支払いが完了しない状況に困っていまいました。

ブラウザなどの環境も疑いましたが原因はEpic Gamesのアカウント登録情報で
本名が日本語表記で入力していたためでした。
(下記のようにアルファベット表記に変更することで解決)

>太郎　山田
↓
>TARO YAMADA

PayPalのアカウント登録情報がクレジットカードなどと同様にアルファベット表記だったため
Epic Gamesとの情報が不一致だったことが問題だったのかもしれません。
他のサービスでは本名の入力を求められることもなかったので同様の問題に直面したことはありませんでした。

購入したアセットでファンタジー世界が舞台のゲーム、推理物のアドベンチャーゲームなどに挑戦してみたいと考えています。
Presto（AWS Athena）で動作する緯度経度からメッシュコードの算出SQL

# はじめに
AWSのAthenaで緯度経度から３次メッシュコードを算出する必要性があったので、その際の成果を共有します。

# 実装
Athenaでは、基本的にはユーザ定義関数（UDF）は利用できないと[FAQ](https://aws.amazon.com/jp/athena/faqs/)にあったので、インラインで計算する方法を考えます。

>Q: Athena はユーザー定義関数 (UDF) をサポートしていますか?
>
>現在、Athena ではカスタム UDF をサポートしていません。カスタム UDF のサ>ポートが必要な場合は、お客様の要件についての詳細を athena-feedback@amazon.com に E メールでお問い合わせください。

## 必要な演算
メッシュコードの算出には、四則演算に加えて下記のような演算が必要です。Athenaのリファレンスでは数学関数については[Prestoのサイト](https://prestodb.io/docs/0.172/functions/math.html)にリンクされています。

 - 剰余 ： %演算子 か MOD関数
 - 少数の切り捨て ： FLOOR関数またはTRUNCATE関数
 - 型変換 ： CAST関数

## クエリ

lat(緯度）, lon（経度）

```sql:athena_lonlat2meshcode.sql
WITH  base AS 
(SELECT  
 139.73729637 AS lon -- 経度
 ,
 35.7177361 AS lat -- 緯度
)
SELECT 
  CAST(  
   floor(lat*3/2)*1000000
  +floor(lon-100)*10000+floor((lat*60%40)/5)*1000
  +floor(((lon-100)%1)*60/7.5)*100
  +floor(((lat*60%40)%5)*2)*10
  +floor((((lon-100)%1)*60%7.5)*60/45) 
    AS integer ) AS meshcode3
FROM base ;

-- 結果 53397317 
```

簡単ではありますが、prestoでも動くメッシュコード計算を記載しました。標準的なSQLに近いものなので、PostgreSQLなど広く利用可能であると思われます。

また、AWS AthenaはGIS関数（ST_Intersectsなど）が利用可能ですので、ビッグデータのGIS処理を検討する方は一度検討してみてはいかがでしょう。
Microsoft Teamsの命名規則

Microsoft Teamsがリリースされて使っている組織もかなり増えてきてる印象。使ってみたユーザーは「あ、便利だね」という反応が返ってくることが多そうだけど、管理する側はいろいろ困る。ざっと書いてみると

■ユーザーが自由に作っていい場合
・メールアドレスが勝手に作られて、アドレスリストに載ってくる
・部署名なんかで作られると、既存のメールアドレスや配布リストのアドレスと同一の表示名で作ってしまうケースがある

■管理者のみ作成するよう制限している場合
・依頼の数が少ないうちはいいけど、管理が煩雑
・ユーザーから「気軽に試してみる」ができない。


組織が大きくなればなるほど、後者のケースが多いんじゃなかろうか。指定のメンバーだけ、作成を許可する場合もあるだろうけど、ルール頼みでは結局守られないってことも多い。


全部管理者でやるぞ！というのではなく、ユーザーには自由に作らせたい、という場合にはこの方法で命名規則を強制できる。


---

GUIで命名規則を設定できるようになっています。[Microsoft Teamsの有効期限を設定する](https://qiita.com/hisssa0102/items/a73b019dfe8c7ab2f7b2)に、まとめてみました。

---




詳しい内容は[Office 365 グループの名前付けポリシー](https://support.office.com/ja-jp/article/office-365-%E3%82%B0%E3%83%AB%E3%83%BC%E3%83%97%E3%81%AE%E5%90%8D%E5%89%8D%E4%BB%98%E3%81%91%E3%83%9D%E3%83%AA%E3%82%B7%E3%83%BC-6ceca4d3-cad1-4532-9f0f-d469dfbbb552)を参照。


今回は、メールアドレスと表示名両方に、接頭辞[Teams_]をつける、というルールを強制する設定を行う。



１、AzureAD ~~Preview~~モジュールをインストールする。
Powershellを開いて、最新版をインストール。~~※Previewじゃなくてよくなってた。（20180610)Previewじゃないと動かなかったので、修正。(20180616)~~GAしたらしいので、修正。[sugerlessboy8さんのツイート](https://twitter.com/sugarlessboy8/status/1107803183068282880)で知った。多謝。

    Install-Module AzureAD

古いモジュールやpreviewモジュールがある場合はアンインストールしてからインストール。


２、365テナントにログイン
Powershellを開いて、以下実行

    Import-Module AzureADPreview
    Connect-AzureAD
（管理者アカウントでログイン）

３、既存の設定を確認する
引き続き、Powershellを開いて実行。

    $Setting = Get-AzureADDirectorySetting -Id (Get-AzureADDirectorySetting | where -Property DisplayName -Value "Group.Unified" -EQ).id
    $Setting.Values

４、設定を入れる
[GroupName]はユーザーが入力するTeam名。

    $Setting["PrefixSuffixNamingRequirement"] = "Teams_[GroupName]"

５、設定を、365テナントに反映する。

    Set-AzureADDirectorySetting -Id (Get-AzureADDirectorySetting | where -Property DisplayName -Value "Group.Unified" -EQ).id -DirectorySetting $Setting


これで完了です。
あとは、任意のユーザーアカウントでルールが強制されるか、試してください。


AzureADのいくつかの属性をグループ名に強制すること（Depertment、など）や名前に使っちゃいけない禁止単語の設定もできる。

これでユーザーは自由に作れるけど、命名規則が適用できるので「ユーザーが作成したグループだということがひとめてわかる」ようになります。

グループ、Plannerなど、「365グループ」がベースにあるものはすべて同じルールが適用されます。


※このルールは、管理者には適用されません。管理者が複数いる場合は作成するときにルールのことを共有しておきましょう。
CodeIgniterのPHPUnitでモックの返り値を動的に設定する

[ci-phpunit-test](https://github.com/kenjis/ci-phpunit-test/blob/master/docs/FunctionAndClassReference.md)のモンキーパッチを使用して返り値を動的に設定する際の書き方



# 返り値を設定

```php
$return_list = [1, 2, 3];
$index = 0;

MonkeyPatch::patchMethod(
    'Class',
    [
        'method' => function ($argument) use ($return_list, &$index) {
            return $return_list[$index++];// 呼ばれた順で返り値を設定（$argumentで判定して出しわけもできます）
        },
    ]
);
```

または

```php
$return_list = [1, 2, 3];

MonkeyPatch::patchMethod(
    'Class',
    [
        'method' => function ($argument) use ($return_list) {
            static $index = 0;
            return $return_list[$index++];// 呼ばれた順で返り値を設定（$argumentで判定して出しわけもできます）
        },
    ]
);
```

# 呼び出し確認

```php
MonkeyPatch::verifyInvokedMultipleTimes('Class::method', 3);
```
【GAS】【とりあえず版】数値を指定し、その (数値) 番目以降のシートを削除する ※後日リファクタリング必要

# 本スクリプト 作成目的
- 指定シート以降のシートを削除する作業が発生したため
- 大量のシートがあり、1シートずつ削除が手間と判断したため

# 使用する際の注意点
- 最初に表示される入力ダイアログにて、半角数値を入力すること →　全角数値など、不適切な文字列を入力した際のエラーチェックは入れておりません
- 急いで作成したため、他にも不備はあるかもしれませんが、その点はご了承ください ※機を見て、リファクタリングしたいのですが・・・

# スクリプト
```//数値を指定し、その(数値)番目のシート以降を削除する

function DeleteSheetsNanmaime(){

var actv_sprd_sht = SpreadsheetApp.getActiveSpreadsheet();
var actv_sht = actv_sprd_sht.getActiveSheet();


//指定シート番号 設定値
var del_dokokara = Browser.inputBox('何枚目以降のシートを削除しますか？');

if(del_dokokara === "cancel"){
  Browser.msgBox("キャンセルしました");
  return 0;

} else if(del_dokokara === ""){
  Browser.msgBox("数値を指定してください。");
  return 0;

} else {

var jikko_hantei = Browser.msgBox("シート削除を開始しますか？",Browser.Buttons.OK_CANCEL);

if(jikko_hantei === "cancel"){
  actv_sprd_sht.toast("シート削除をキャンセルしました！", "キャンセル", 5);
  return 0;

} else if(jikko_hantei === "ok"){

var total_sheets_cnt = actv_sprd_sht.getNumSheets();

if(total_sheets_cnt < del_dokokara){
  Browser.msgBox("シート" + del_dokokara + "枚目以降がないようです");
  return 0;
  
}else if(total_sheets_cnt >= del_dokokara){
  for(var i = total_sheets_cnt; i >= del_dokokara; i--){
    var sh = actv_sprd_sht.getSheets()[i-1];
    actv_sprd_sht.deleteSheet(sh);
  }
   actv_sprd_sht.toast(del_dokokara + "枚目以降のシートを削除しました！", "シート削除完了", 5);
}
}
}
}
```
KL divergence and JS divergence in Python

## Introduction
Following this good article, i have implemented KLD and JSD myself and evaluate the diff between mine and scipy one.  
http://yusuke-ujitoko.hatenablog.com/entry/2017/05/07/200022

## Theorem
reference:http://mathtrain.jp/logsumineq

- KL divergence

```math
\begin{align}
&KL(P||Q)\\
&= 𝔼x∼P[logP(x)Q(x)]\\
&= 𝔼x∼P[logP(x)−logQ(x)]\\
&= ∫_xP(x)(logP(x)−logQ(x))\\
&= \sum P(x) \log \frac{P(x)}{Q(x)}
\end{align}
```
- JS divergence  
reference:https://en.wikipedia.org/wiki/Jensen%E2%80%93Shannon_divergence

```math
\begin{align}
&JSD(P||Q)\\
&= \frac{1}{2}KL(P||M) + \frac{1}{2}KL(Q||M)\\
& where \space M = \frac{1}{2}(P+Q)
\end{align}
```

```python
# math definition of entropy => http://mathworld.wolfram.com/Entropy.html
# scipy entropy => https://github.com/scipy/scipy/blob/v1.1.0/scipy/stats/_distn_infrastructure.py#L2478-L2519

import matplotlib.pyplot as plt
import numpy as np
from scipy.stats import norm, entropy

def entropy_multi(p, q):
  return np.sum(p * np.log(p / q), axis=0)

def entropy_single(p):
  return np.sum(p * np.log(p), axis=0)

def KLD(pk, qk):
  # arraynise
  pk = np.asarray(pk)
  # normalise
  pk = 1.0*pk / np.sum(pk, axis=0)
  # check to decide if we apply single or multi entorpy
  if qk is None:
      return np.sum(entropy_single(pk), axis=0)
  else:
      # arraynise
      qk = np.asarray(qk)
      if len(qk) != len(pk):
          raise ValueError("qk and pk must have same length.")
      qk = 1.0*qk / np.sum(qk, axis=0)
      return np.sum(entropy_multi(pk, qk), axis=0)

# data prep
x = np.linspace(-10.0, 10.0, 1000)

# graph setting
plt.figure(figsize=(12,8))

# gradually shift the distribution
for i in np.arange(3):
    for j in np.arange(3):
        # index to shift
        index = i*3 + j
        # probabilistic distribution function
        p = norm.pdf(x, loc=0, scale=1)
        q = norm.pdf(x, loc=index*0.5, scale=1)
        # mean of them
        m = (p+q)/2
        # scipy entropy
        kl = entropy(p, q)
        kl_mine = KLD(p,q)
        # checker
        print("my_KL: ", "{0:.2f}".format(kl_mine), "scipy_KL: ", "{0:.2f}".format(kl))
        # prep for js divergence
        kl_pm = KLD(p, m)
        kl_qm = KLD(q, m)
        js = (kl_pm + kl_qm)/2
        plt.subplot(3,3,i*3+j+1)
        plt.fill_between(x, m, facecolor="y", alpha=0.2)
        plt.fill_between(x, p, facecolor="b", alpha=0.2)
        plt.fill_between(x, q, facecolor="r", alpha=0.2)
        plt.xlim(-5, 7)
        plt.ylim(0,0.45)
        plt.title("KLD:{:>.3f}".format(kl) + ",   JSD:{:>.3f}".format(js))
        plt.tick_params(labelbottom="off")
        plt.tick_params(labelleft="off")

plt.subplots_adjust(wspace=0.1, hspace=0.5)
plt.show()
```

## Result
<img width="698" alt="Screen Shot 2018-06-10 at 9.02.11.png" src="https://qiita-image-store.s3.amazonaws.com/0/240801/49253a9e-1f1e-441e-5f02-6b97375e2314.png">
PHPでdateで時間を指定したら全然違う時間が表示される。

おそらくタイムゾーンの問題。
以前はプログラム上で指定していた。
こんな感じで、

```test.php
date_default_timezone_set('Asia/Tokyo');  // 日付設定を実施
```

サーバー変更で一部漏れているところが発覚
サーバー自体で合わせるべきということで、

```
vi /etc/php.ini
date.timezone = Asia/Tokyo
/etc/init.d/httpd restart
```

を実行して php.ini で変更
Debian(Squeeze)でUSBシリアル

以下のファイルを作成する。

```/etc/udev/rules.d/73-ft231x.rules
ACTION=="add", SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_interface", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6015",  DRIVER=="", RUN+="/sbin/modprobe -b ftdi_sio"
ACTION=="add", SUBSYSTEM=="drivers", ENV{DEVPATH}=="/bus/usb-serial/drivers/ftdi_sio", ATTR{new_id}="0403 6015"
```
dockerコンテナの中でホストマシンのIPアドレスを取り出す

結論
`cat /etc/hosts | awk 'END{print $1}' | sed -r -e 's/[0-9]+$/1/g'`

# docker-composeでとりあえず普通にコンテナどうしの通信
- Dockerfileの中で`EXPOSE 80`みたいな感じでポートを指定
- docker-compose.ymlに`hostname: hoge`でホスト名をつける
- hoge以外のコンテナから`curl http://hoge/`

みたいな感じでしょう

# コンテナではなくホストマシンと通信
ホストマシンのホスト名を指定すればよいですね
`curl http://hostmachine/`

でも特に開発環境などにおいては、いつもホストマシンにホスト名を設定しているわけではありません。
それなら開発環境におけるホストマシンのIPアドレスを指定すれば解決できそうですが、
そもそもいつもホストマシンのIPアドレスが同じとは限りません。
ルーターの設定次第で会社では`10.XX.YY.ZZ`だったり家では`192.168.XX.YY`だったりします。
DHCPならなおさらですね。

どこでも同じ環境が構築できることがウリのコンテナですから、なるべく環境に固有の値はファイルに書いたりしたくないです。

そもそも別に外のネットワークにおけるホストマシンのIPアドレスが必要なわけではありません。
dockerの内部ネットワークにおけるホストマシンのIPアドレスが知りたいのです。

# コンテナからホストのIPアドレスを調べる
やっと本題です。
dockerの内部ネットワークについてはいろいろ深い話があるので興味がある人はぜひ公式ドキュメントを読むことをおすすめします。

今回はコンテナ内で余計なもの（iputilsとか）をインストールすることなく、さくっとホストのIPアドレスを知る方法を紹介します。

## /etc/hosts
コンテナの中でipアドレスとかホスト名の情報が書いてあるファイルといえばこいつでしょう

```
# cat /etc/hosts
127.0.0.1	localhost
::1	localhost ip6-localhost ip6-loopback
fe00::0	ip6-localnet
ff00::0	ip6-mcastprefix
ff02::1	ip6-allnodes
ff02::2	ip6-allrouters
172.17.0.2	0c50f3b8bcb9
```

この一番下のやつがコンテナ自身の内部IPです。
dockerの内部ネットワークではデフォルト（特に設定しなかった場合）は`172.XX.YY.ZZ`みたいなアドレスが振られます。
こいつが厄介でいつもいつも同じサブネットであるとは限りません。
おそらくデフォルトではホストマシンはゲートウェイなので`172.XX.YY.1`でホストマシンにアクセスできそうです。

# ホストのIPアドレスを取り出す
シェル芸の出番です

```
# cat /etc/hosts | awk 'END{print $1}' | sed -r -e 's/[0-9]+$/1/g'
172.17.0.1
```

## 解説
`awk 'END{print $1}'`
最後の行の1列目を取り出す

`sed -r -e 's/[0-9]+$/1/g'`
末尾の数値を1に書き換え

もっと良い方法（正しい方法）がありましたらぜひコメントでもよいので教えてください。

## 追記

`sed -e 's/[0-9]\+$/1/g'` でもいけるっぽい

# 使用例
ホストの80番にHTTPのGETを投げる

```
curl http://`cat /etc/hosts | awk 'END{print $1}' | sed -r -e 's/[0-9]+$/1/g'`:80
```
今日も残業、、、そんなことにならないようにTrelloでGTD

## 完成図

<img width="1665" alt="スクリーンショット 2018-06-10 5.19.44.png" src="https://qiita-image-store.s3.amazonaws.com/0/253910/f2238534-da93-4244-13e2-88bf71f6c31c.png">

## はじめに
- taskの管理を[trello](https://trello.com/b/2VHIaZS8/untitled-board)にて行います。
- google adoonを使って拡張して、便利にします。
- GTDの概念を使います。
- 頭の中が*整理整頓*できます。
- 脳内バッファの*節約*ができます


## 機能説明

### addon for trello

- 折り返し機能を追加します。[list layout for trello](https://chrome.google.com/webstore/detail/list-layouts-for-trello/aldklnbenbdgfgfbflalmlddkkndgnlc)

- 左側のカレンダーを追加します。[playway-calendar](https://chrome.google.com/webstore/detail/planyway-calendar-and-tim/kkgaechmpjgbojahkofamdjkaklgbdkc?hl=en)



### GTD風概念

#### カレンダー 
- 定期的なタスクを入れてください。

#### インプット
- 思いついたタスクをどんどん入れて行きます。
- *実行する前*に適切な箱に振り分けてください。

#### 着手中
- 着手中のタスクを入れます。

#### 完了
- 完了したタスクを入れます。

#### 後回し
- 後回し、いつかやる、優先順位の*低い*タスクを入れてください。

#### 連絡待ち
- 他人に確認が必要なタスクを入れてください。

#### 誰かにやってもらう
- 自分がやらずに、他の人にやってもらうタスクを入れてください。

#### やらない、ゴミ箱
- 頭には浮かんだけども、やっぱりやる必要の*ない*物を入れましょう。


## 使い方
- 思いついたタスクをどんどんインプットに入れましょう
- 後回し、連絡待ち、やってもらう、ゴミ箱に分類するかを検討しましょう
- 左図のカレンダーにドラックして、時間を決めましょう。
- 実行しましょう。
- 定期的なタスクはカレンダー（項目）にぶち込んでください。
【初心者】就活のためにJavaの勉強を始めてみた話〜4ヶ月目〜

こんにちは。
地方の無名文系大学に通う3年生です。

私は就活のために４ヶ月程前からプログラミングの勉強をしています。
勉強を始めたきっかけなどについて気になる方は1ヶ月目の記事を見て頂ければと思います。

[【初心者】就活のためにJavaの勉強を始めてみた話〜1ヶ月目〜]
(https://qiita.com/ayumitani611/items/8da091cb0f0447b509eb)

今回は


- 4ヶ月目に取り組んだ内容
- データベースの実装について
- 合同説明会に参加してみて

という３つの観点から記事を書いていきます

## **4ヶ月目に取り組んだ内容**

4ヶ月目では、実際にアプリを作リ始めました。
アプリを作り始めてからは２回の挫折がありましたが、現在漸く形になりつつあります。

はじめは、ブラックジャックのアプリを作成しようと試みました。
理由は他の方が書かれたQiitaの記事で、プログラミング初心者からの卒業にはブラックジャックのアプリを作成するのが良いと言われているものを読んだからです。
しかし、このアプリに関しては私の実力不足により、早い段階で挫折することとなってしまいました。
主な原因としては、前回の記事で反省したように３ヶ月目ではドットインストールの内容を模写するだけになってしまっていた為、開発に必要なだけの技術や知識が備わっていなかったことが挙げられます。
このような要因が、どのような順で開発を進めて行けば良いか、どのような実装を行わなければならないかなどが分からないという状況に繋がったのだと思います。

次に、日記帳のアプリを作成しようと試みました。
自分の力だけでアプリを作成するのはまだ難しいと判断し、ドットインストールのメモアプリに機能を追加するなど多少のアレンジを加えたものを作ろうとしました。
この時、サポーターズで開催されるイベントの1on1面談会に参加するため、その面接までに何か１つアプリを完成させなければなりませんでした。
しかし結局間に合わなかったので、もっとちゃんとしたアプリの開発を行なうように方向転換するためこのアプリの完成は諦めました。

このような挫折ののちに初心者でも作れそうなアプリを考え直した結果、キッチンタイマーのアプリを開発することになりました。

このアプリに実装予定の機能は主に

- タイマー機能
- よく使うタイマーの時間や用途を保存する機能

です。

保存した時間・用途は、便宜上レシピと呼んでいます。
このレシピはリストビューを使って一覧表示できるようにしています。

今の段階で完了しているのは

- 画面の作成
- データベースの実装
- レシピの新規作成・編集・更新・削除機能の実装
- タイマーをセットするためのボタンの作成・実装

です。

## **データベースの実装について**

今まではデータベースの実装にはSQLiteを用いていましたが、今回のキッチンタイマーのアプリでは初めてRealmを使用しました。
実装した方法に関しては、先日投稿した記事にまとめていますので興味のある方は下記のリンクからご確認ください。

[Realmを使ったデータベースの実装]
(https://qiita.com/ayumitani611/items/f67b421b8445178e5f3b)

## **合同説明会に参加してみて**

先日、サポーターズさんのイベントで合同説明会に参加してきました。
その際に感じたことについても書いていきたいと思います。

今回のイベントは総合職の説明会だったので私が求めている情報とは少しずれている部分もありましたが、色々な面で参考になりました。

このイベントは20卒向けのものだったので、自分と同じ大学3年生の人たちが集まっているものだと思っていました。
しかし実際は大学院の方がとても多く、自分よりも就職に対する意識が高いように感じました。
はじめに企業ごとの説明を聞いたのちに質疑応答の時間が設けられていたのですが、私は聞いた話をメモするのでいっぱいいっぱいでした。
しかし周りの人たちは聞いた内容からたくさんの事を考えれているようで、積極的に質問をしている様子が見られました。
そのような様子を実際に見たことで、ただ聞くのではなく、聞いたことからもっと知りたいと思える事を見つけられるようにならなくてはならないと感じました。
そのためにも、普段からもっと色々な場面で、聞いた情報に対しての疑問や意見を持つようにしなければならないと思いました。
また、もっと色々な企業について知る事や、説明を受ける企業についてもっと事前に知っておくようにすることが必要なように思いました。

## **最後に**

最後まで読んでくださってありがとうございました。

アプリの方は、次回までには実際にタイマーの機能を実装したのち、細かい部分を実装して完成させる予定です。
６月下旬には、サポーターズのイベントでエンジニア向けの合同セミナーに参加する予定ですので、今回の合同説明会を踏まえた上でより多くのことを得られるように頑張ります。

次は７月の上旬に５ヶ月目の進捗を書きたいと思いますので、ご覧いただければ幸いです。
【Rails】heroku + route53 + s3を連携してweb appを作る

## 0. 概要
- webアプリケーションを作成する際にかなり有用だった有用記事まとめ(qiita多め)

## 1. awsアカウントの作成 & 設定
- AWS各種サービスを使うまでの流れ
    1. AWSのrootアカウントの作成 (管理者)
    1. rootとは別のアクセス用ユーザの作成 (IAM = 一般ユーザ)
    2. セキュリティなどの設定
- [AWS・IAM(Identity and Access Management)ユーザの作成](https://qiita.com/ai-2723/items/fe83669768f8277f144c)
- [AWSアカウントを取得したら速攻でやっておくべき初期設定まとめ](https://qiita.com/tmknom/items/303db2d1d928db720888)

## 2. Herokuアプリケーション作成 & デプロイ
- 基礎知識
   - [Heroku初心者がHello, Herokuをしてみる](https://qiita.com/Arashi/items/b2f2e01259238235e187)
- Herokuはmasterブランチが基本的にデプロイされます。インフラの準備を省くために、デプロイ環境=リリース環境にしたい場合は以下

```shell

git push heroku 任意ブランチ名:master
```

## 3. Heroku + Route53 + S3の設定(独自ドメイン)
- [HerokuアプリにAWS Route53 で取った独自ドメインを割り当て、 Certificate Manager + Cloudfront を使ってhttps化する](https://qiita.com/hiraokashi/items/382b43b4bcf8e84b61ae)
- cloudflareを使う場合
    - [【完全無料】Herokuで独自ドメイン + HTTPSに対応する【Rails】](https://qiita.com/serinuntius/items/f7f08b2221f5ad068f5d)
- [S3のアクセスキーの設定](https://joppot.info/2014/06/14/1621)
CentOSのコンテナイメージに導入すると便利なパッケージlist

# CentOSのコンテナイメージに導入すると便利なパッケージlist
検証目的でCentOSのコンテナイメージを立てる場合があります。
ipコマンドやtcpdumpがdefaultでは使用出来ないので、installするコマンドをメモしておきます。
そのうちDockerHubに上げたいと思います

# install
```
yum install -y iproute vim tcpdump
```
ブロックチェーンは劣化技術


※記載内容はメモとして作成しているため、修正が必要な部分があるかもしれません。

####**ブロックチェーンについて調べたことをメモ**
P2P通信を使用した共有台帳分散型システムとのことです。
　　P2P通信とは　マシン同士が対等な関係である通信です。
　　通常はサーバクライアント通信となり、どちらかのマシンがサーバ
　　どちらかのマシンがクライアントと規定されます。
　　
　　P2Pと言えばスカイプを思い出します。
　　サーバを使わず必要なサービスを互いに提供し合うアプリのことです。
　　
　　台帳とはデータベースに見立てています。
　　スカイプはメッセージテキストを送信しますが、この代わりにトラン
　　ザクションというデータを送信するのです。

　　また、ブロックと指定したネットワークやブロックチェーンと指定し
　　たトランザクションの集まりを一つのグループと定義し、特定のまと
　　めたネットワークに送信するシステムのことです。

ブロックやブロックチェーンには独自ルールを規定することが可能であり、
HTTPと同じ認証方式を使用することから、スカイプにSSL通信とトランザク
ション送信機能とグループ認証機能がついたことをイメージすると通信は
わかりやすいかもしれません。
スカイプは結構優秀でそのときどきによってインストールしたPCがサーバ
の実態になったりしていましたがそういったことは書いていませんでした。

大きな台帳を扱うとなると、各社のバックグラウンドでサーバが必要とな
ります。
このサーバはあくまでもデータベースとしての役割と届いたトランザクシ
ョンの独自ルールの認証やチェックに使用しているということになります。
そのまま台帳を管理するとPCが重いので、バックグラウンドで簡易化してい
るのですね。

特定の共有台帳を必要とするシステムを想定したピンポイントなシステム
ですが、何に使うのでしょう。

メリットは以下です。
共有台帳の認証を会社を超えて実施できる。
ワークフローシステムの他社との共同版みたいなものでしょう。

他社を超えて同等でサービスを提供することはあるのでしょうか。
サーバとクライアントはその名の通り、サービスを提供する側とクライア
ント側が存在するのです。そもそもよく考えられたシステムです。

仮想通貨に使用されている様子ですが、取引先のブロックチェーンと客側
のブロックチェーンはそもそも異なるプログラムである必要があります。
このように作成者によって本当に対等なシステムかはあいまいに作ること
も可能となってしまいます。
ブロックチェーンを使ったシステムは契約内容をよく確認しなければなら
ないですね。
【Selenium】手動で行った動作を記録して、何度も実行させたい

#Motivation
## ~~社内向けシステムの品質が悪く、何度も何度もクリック・キーボード操作をさせる~~GUIがあまり得意ではない
ということで、ブラウザで行う動作をSeleniumを用いて半自動化したい
ただ、いきなりSeleniumAPIをばしばし叩くのも、ハードルが高いと思ったので
行った操作をスクリプト化できたらいいな、という発想

#導入
Firefox向けSeleniumプラグイン: [Selenium IDE](https://addons.mozilla.org/ja/firefox/addon/selenium-ide/)
下記画面が表示されるので、「Firefoxへ追加」を押下

<img width="1437" alt="Screen Shot 2018-06-10 at 1.33.45.png" src="https://qiita-image-store.s3.amazonaws.com/0/94861/74db7fa9-5cd3-3b01-8f43-5fe99d56e905.png">


#使ってみた(GIF)
![test2.gif](https://qiita-image-store.s3.amazonaws.com/0/94861/016b56a3-76d2-164c-0cde-0db82574a9c0.gif)


#JSON形式で操作一覧が出力される
commandsってところが、実行している操作の一覧みたい
pythonとかnodejs用にexportできればいいのだけど

```output.json
{
    "id": "702a91c3-409c-4014-afe4-9b6686858cb1",
    "name": "test_selenium",
    "suites": [
        {
            "id": "3522401c-a5eb-480f-8d61-a8671251c4c3",
            "name": "Default Suite",
            "tests": [
                "de2effc2-81c4-438c-b6f1-266d97ec6ed1"
            ]
        }
    ],
    "tests": [
        {
            "commands": [
                {
                    "command": "open",
                    "comment": "",
                    "id": "3fa1e5dd-51a6-4fe7-b76e-65e8d66b15e6",
                    "target": "/search",
                    "value": ""
                },
                {
                    "command": "type",
                    "comment": "",
                    "id": "d08aa09d-ab8d-49af-b50c-c290e5952fc5",
                    "target": "id=lst-ib",
                    "value": "qiita"
                },
                {
                    "command": "sendKeys",
                    "comment": "",
                    "id": "2d530f8a-0158-4016-b2ef-ac236f742e6b",
                    "target": "id=lst-ib",
                    "value": "${KEY_ENTER}"
                },
                {
                    "command": "clickAt",
                    "comment": "",
                    "id": "a81db28d-4209-412c-a51b-6a270cdd24c1",
                    "target": "css=h3.r > a",
                    "value": "18,13"
                },
                {
                    "command": "mouseOver",
                    "comment": "",
                    "id": "8215a23a-9504-4ed1-856a-90f796ce0999",
                    "target": "css=h3.r > a",
                    "value": ""
                }
            ],
            "id": "de2effc2-81c4-438c-b6f1-266d97ec6ed1",
            "name": "Untitled"
        }
    ],
    "url": "https://www.google.com",
    "urls": [
        "https://www.google.com"
    ]
}
```

#まとめ
Seleniumで自動化する際に、要素のIDとか気にせず直感的に操作を吐き出せるのは◎
ただし、この記事を書くために使用した際に、操作を取得できないことが頻発した
それも歯抜けで取得はできるから、途中の操作がなくて結局次の操作につながらないことがあった