OmniAICreator/Qiita-1.07M huggingface dataset:
java.lang.String#substringの心配事を調べた

記事の内容はJava8で検証しています。
※この記事が初投稿ですので至らないところがあればご容赦ください。

#概要
substring()の引数の許容範囲がどうだったのか、とか、nullを返すことはあるのか、とかしばしば忘れるのでメモ。

#まとめ

* インデックスの適正範囲は0～文字列長(=.length())
* インデックスに適正範囲外の値を与えると例外発生
* substring()がnullを返すことはない

こういう記述をしても安心:

```
String src="abc|def";
String head=null,tail=null;

int p=src.indexOf('|');
if(p>0) {
	head=src.substring(0,p); //ここが心配:p==0でもOK?
	tail=src.substring(p+1); //ここが心配:p+1==src.length()でもOK?
}

//これも心配:nullを返すケースはある?
if(head==null) head=src;

...
```

#メソッド
Stringから部分文字列を切り出して作った新たな文字列を返す。
二種類ある。

* String substring(int beginIndex) …途中から末尾までを切り出す
* String substring(int beginIndex, int endIndex) …中間を切り出す

中間を切り出す場合、beginIndexからendIndex **の前まで**(endIndex位置の文字は含まない)を切り出すことに注意。

#文字位置
1文字単位。**漢字とかのマルチバイト文字でも1文字単位。**
先頭の文字位置は0。
末尾の文字位置は .length()-1 となる。

```
"abc".substring(1); //"bc"
"あいう".substring(1); //"いう"
```

…他の文字位置指定系メソッドと同様。

#beginIndex:開始位置の範囲
##適正範囲
0～**文字列長**(=.length())が適正範囲。
適正範囲終端は末尾文字位置(=length()-1)ではないことに注意。

```
"abc".substring(0); //"abc"
"abc".substring(2); //"c"
"abc".substring(3); //""(=空文字列。nullが返るわけではない)
```

##適正範囲外の位置を指定した場合
例外発生。

```
"abc".substring(-2);
//java.lang.StringIndexOutOfBoundsException: String index out of range: -2

"abc".substring(4);
//java.lang.StringIndexOutOfBoundsException: String index out of range: -1
```

メッセージの数値には二種類の意味がある。

* 文字位置<0の場合:「逸脱した文字位置」
* 文字位置>文字列長の場合:「切り出そうとした文字列長」(=文字列長-開始位置)

デバッグ時にエラー出力の解釈で悩みそうなのでちょっと注意。

#endIndex:末尾位置の範囲
##適正範囲
開始位置と同様。
0～**文字列長**(=.length())が適正範囲。
適正範囲終端は末尾文字位置(=length()-1)ではないことに注意。

```
"abc".substring(0,0); //""(=空文字列。nullが返るわけではない)
"abc".substring(0,2); //"ab"
"abc".substring(0,3); //"abc"
"abc".substring(3,3); //""(=空文字列。nullが返るわけではない)
```

#開始位置と末尾位置が同じ場合
空文字列が返る。
nullが返るわけではない。

```
"abc".substring(1,1); //""(=空文字列。nullが返るわけではない)
```

##適正範囲外の値を指定した場合
例外発生。

```
"abc".substring(-1,4);
//java.lang.StringIndexOutOfBoundsException: String index out of range: -1

"abc".substring(0,4);
//java.lang.StringIndexOutOfBoundsException: String index out of range: 4
```

メッセージの数値には「逸脱した文字位置」が充てられる。
判定は開始位置→末尾位置の順に行われる。

#開始位置と末尾位置が転倒している場合
例外発生。

```
"abc".substring(2,0);
//java.lang.StringIndexOutOfBoundsException: String index out of range: -2
```

メッセージの数値には「切り出そうとした文字列長」が充てられる。

#substring()がnullを返すケース
ない。
Java8のソースで確認したところでは、newされたStringインスタンスか、自分自身が返される(文字列全体を返す場合)。
自分自身がnullの場合はそもそもメソッド呼び出しの時点でNullPointerExceptionが発生する。

#おまけ:((String)null).substring()を実行した場合
当然、NullPointerException発生。

```
String n=null;
String s=n+""; //nullが"null"に変換される
n.substring(0); //NG:例外発生
s.substring(0); //OK:"null"
```
勘違いしそうなので要注意。
[JS]配列メソッドと[C#]LINQの対応についての備忘録

C#からフロントエンドの開発に周り、
「これ、LINQでいうあれだな。」
みたいな配列メソッドを簡単なメモ書き備忘録としてまとめました。


全部メソッド名違うのね。。。

```cs:linq.cs
//抽出
var row = rows.Where(x => x.name == "yamada");

//1件抽出
var row = rows.FirstOrDefault(x => x.id == 2);

//全件に処理
var row = rows.Select(x => x * x);

//存在確認
var row = rows.Any(x => x.id == 2);

```

```javascript:arrayMethod.js
//抽出
var row = rows.filter(x => x.name === 'yamada');

//1件抽出
var row = rows.find(x => x.id === 2);

//全件に処理
var row = rows.map(x => x * x);

//存在確認
var row = rows.some(x => x.id === 2);

```
Anacondaに独自モジュールを追加する

## 概要
Anaconda環境にrequests_oauthlibをインストールした際のメモ。

## バージョン
```terminal
$  python --version
Python 2.7.14
```

```terminal
$ python3 --version
Python 3.6.4 :: Anaconda custom (x86_64)
```

##  anaconda search でインストールするモジュールを探す
```terminal
$ anaconda search -t conda requests_oauthlib
Using Anaconda API: https://api.anaconda.org
Run 'anaconda show <USER/PACKAGE>' to get more details:
Packages:
     Name                      |  Version | Package Types   | Platforms      
     ------------------------- |   ------ | --------------- | ---------------
     syllabs_admin/requests_oauthlib |    0.8.0 | conda           | linux-64       
Found 1 packages
```
```terminal
$ anaconda show syllabs_admin/requests_oauthlib
Using Anaconda API: https://api.anaconda.org
Name:    requests_oauthlib
Summary: 
Access:  public
Package Types:  conda
Versions:
   + 0.8.0

To install this package with conda run:
     conda install --channel https://conda.anaconda.org/syllabs_admin requests_oauthlib
```

```terminal
$ conda install --channel https://conda.anaconda.org/syllabs_admin requests_oauthlib
Solving environment: failed

PackagesNotFoundError: The following packages are not available from current channels:

  - requests_oauthlib

Current channels:

  - https://conda.anaconda.org/syllabs_admin/osx-64
  - https://conda.anaconda.org/syllabs_admin/noarch
  - https://repo.anaconda.com/pkgs/main/osx-64
  - https://repo.anaconda.com/pkgs/main/noarch
  - https://repo.anaconda.com/pkgs/free/osx-64
  - https://repo.anaconda.com/pkgs/free/noarch
  - https://repo.anaconda.com/pkgs/r/osx-64
  - https://repo.anaconda.com/pkgs/r/noarch
  - https://repo.anaconda.com/pkgs/pro/osx-64
  - https://repo.anaconda.com/pkgs/pro/noarch
```
インストール失敗。

## 仮想環境にインストールする
### anacondaの環境一覧
```terminal
$ conda info --envs
```
```terminal
$ conda env list
```

### anacondaの仮想環境に入る
```terminal
$ conda activate base
```

### pipでインストール
```terminal
$ pip install requests_oauthlib
```

### 仮想環境から抜ける
```terminal
$ conda deactivate
```

## 参考リンク
[Anaconda 環境に独自にモジュールを追加する](http://datalove.hatenadiary.jp/entry/python/anaconda/how-to-install-3rd-party-module-into-anaconda)
[anaconda環境にpythonのモジュールを追加する方法](https://qiita.com/yotayokuto/items/c55bfa2b892beddc488e)
[MacにPython仮想環境を導入する(condaを利用)](https://qiita.com/kkaries0328/items/79782da809a7ee558a73)
【Sass】SASS記法の良さを語りたい

カッコが無い方のSassの話です。

## 初めはSCSSで書いていた

僕がSassを書き始めたときはCSSに近い記法のSCSSで書いていました。SASSの記法は敷居が高そうな気がしていました。

```sass
// 難しそう
.foo
  ...

  .bar
    ...

```

## mixinがめんどくさい

そんな中、SCSSのmixinあたりの記述がめんどくさいなと感じていました。

```scss
// こういうのとか
@mixin foo{
  ...
}

.bar {
  // こういうの
  @include foo
}
```

僕がSASSに乗り換えた理由としてこれが大きいです。

## SASSで書いてみる

初めはなかなか戸惑いましたが、慣れてくると世界が変わりました。カッコやセミコロンを省略できるのでタイプ数は減り、先ほどのmixinも楽に書けます。

```sass
// 楽
=foo
  ...

.bar
  // 楽々
  +foo
```

Atomなどのエディタはいい感じにインデントを入れてくれる(はず)ので、とても楽です。

## SASSはいいぞ

そんなに良さは語れていない気がしますが、SCSSで書いている人は一度SASSでも書いてみることをおすすめします(当然向き不向きはあります)。ハマるとSCSSには戻れなくなります。

## ちなみに

もしかするとそのうちStylusにも手を出すかもしれません。
Apple Pay 実装のハマり所

## はじめに
最近、自社のアプリ（[ねこすた](https://necosta.funseek.co.jp/)）でApplePayを実装したので、そこではまった内容まとめ。

## 実装
今回、PayJPを利用したので、[ドキュメント](https://pay.jp/docs/apple-pay)通りに作業。
特に難しいところは無くすぐに実装は完了しました。

## Debugでは動くのにReleaseだと動かない？
これ結構はまりました。通常のDebugモードだとうまくうごくのですが、Releaseモードだとボタンを押しても全然反応しない。
deploygateで配信してると駄目なのか？と、TestFlightで配信してもだめ。AppStoreから配信されているものじゃないとだめ？
いろいろ悩んだあげく、Nekostabe.entitlementstというファイルを発見。※Nekostabeの箇所は各々の名前で置き換えてください
これはAPNsの設定をしたときに出来るファイルだが、Merchant IDsを設定したときにも内容が追記されている。
通常、Merchant IDはTARGETS > CapabilitiesのMerchant IDsで設定するが、ここで設定しただけだと、Debugに設定されているhoge.entitlementstしか更新されない！
Releaseで設定されている、entitlementstファイルも同様にMerchant IDsの内容を書き込んであげなければならない。
設定は以下から確認できる。
TARGETS > Build Settings > Code Signing Entitlements

以下みたいな感じになるはず
```xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>aps-environment</key>
	<string>production</string>
	<key>com.apple.developer.in-app-payments</key>
	<array>
		<string>merchant.jp.co.funseek.necosta</string>
	</array>
</dict>
</plist>
```
これでReleaseモードでも動くようになる

## Apple Payでクレカの設定がされていない場合
今回のアプリではカレンダーの購入という流れだったので、Apple Payで購入ボタンを表示。
購入ボタンを押せばApple Payのペイメントシートが表示されて購入できる。
Apple Payでクレカの設定がされていない場合は、設定する画面に移動する。（ここはApple Pay側がよしなにやってくれる）
これで問題なしと思いきや、リジェクトされて以下のメッセージ

```
We noticed that the Apple Pay button in your app does not directly initiate the Apple Pay payment sheet. Specifically, when the user taps the Apple Pay button, a modal alert regarding Apple Pay is displayed and closed automatically.

Next Steps

To resolve this issue, please revise your app to ensure that the Apple Pay button directly initiates the Apple Pay payment sheet.

Resources

Please review the Apple Pay Human Interface Guidelines to help ensure your app is in compliance with these terms and conditions.
```
Human Interface Guidelines
https://developer.apple.com/ios/human-interface-guidelines/technologies/apple-pay/

Apple Payでクレカの設定がされていない場合は、セットアップボタンを表示しろってこと？わからなかったのでResolution Centerで返信して聞いてみたけど具体的な内容は教えてくれず。
Apple Payでクレカの設定がされていない場合は、セットアップボタンを表示するように修正して、再度申請。
無事通りました。確かにセットアップボタンを表示したほうがいいっぽいことは書いてあるけど、これmustなの？って感じではありましたが、通ったのでよしとする。

## 最後に
Apple Pay便利だけど、自動改札で毎回起動するのがうざい（suicaじゃなくてiPhoneケースにいれてあるパスモで通るとき）
Dropbox PaperからAPIでダウンロード

# これなに
Dropbox Paperで定期的にエクスポートしていたが、時間がかかって困っていた。そこでAPIで自動化してみた。

## 結論

該当ページの`doc_id`が分かれば、簡単にできる。
`doc_id`は、URIのハイフン以降である。
備忘録として、手順を記す。

## Dropbox API Explorer

Dropbox API Explorerという非常に便利なものがあった。
下記サイトを開こう。
https://dropbox.github.io/dropbox-api-v2-explorer/
左のリストの下の方に**paper**というものがある。この下がDropbox PaperのAPIのようである。

### doc_idの一覧取得

`dcos/list`をクリックしよう。
https://dropbox.github.io/dropbox-api-v2-explorer/#paper_docs/list

- **Access Token**を設定しよう。持っていなければ、`Get Token`を押せばよい。
- **Request**は空のままでもよい。私は大量に結果が出たので、`filter by`を`docs_created`で自分が作成したものにした。
- **Submit Call**を押すと**Response**にdoc_idの一覧が表示される。

### doc_idの文書をDLするコードを調べる

`docs/download`を開こう。
https://dropbox.github.io/dropbox-api-v2-explorer/#paper_docs/download

各doc_idごとに以下実行できる。

- **Request**の`doc_id`に確認したいものを記入する。`export_format`は適宜選ぶ。
- **Submit Call**を押し、情報を確認する。

**Request**の**Show Code**を押し、**Code**でPython Request（requests library）を選択する。

下に出てくるコードをコピーして使える。

`r.ok`を確認し、`r.content.decode()`で中味を取り出せる。
タイトルは`eval(r.headers['Dropbox-Api-Result'])['title']`になる。


## 参考

APIは100回／日の制限があるらしい。

- [Dropbox PaperにMarkdownファイルをアップロードする](https://qiita.com/norikt/items/3d55b9b2bde88c1cef84)
Pythonで個人Slack用のbotを作る

なんでもやってくれる秘書兼[イマジナリーコンパニオン](https://ja.wikipedia.org/wiki/%E3%82%A4%E3%83%9E%E3%82%B8%E3%83%8A%E3%83%AA%E3%83%BC%E3%83%95%E3%83%AC%E3%83%B3%E3%83%89)のSlack botをPythonで作っていきます。
今回は仮想環境&slackbotのインストールまで。

## 開発環境を作る
virtualenvは導入済

```
# python3仮想環境を作成
$ virtualenv -p python3 env

# 仮想環境を有効化
$ source env/bin/activate
```

## slackbotをインストール

定番の https://github.com/lins05/slackbot を利用します。

```
# lins05/slackbotをインストール
(env)$ pip install slackbot
```

### Slack BotのAPIトークンとDEFAULT_REPLYを設定
Botはあらかじめ作成しておく。
API Tokenは管理 > カスタムインテグレート > Botsから。

```python3:slackbot_settings.py
# APIキー
API_TOKEN = "<your-api-token>"

# デフォルトの返答
DEFAULT_REPLY = "Sorry but I didn't understand you"
```

### run.pyを作成

```python3:run.py
from slackbot.bot import Bot
def main():
    bot = Bot()
    bot.run()

if __name__ == "__main__":
    main()
```

## 動くかテスト
run.pyを走らせる

```
(env)$ python run.py
```

Slackで話しかけて`DEFAULT_REPLY`が返ってくれば成功
(※自分のテンション上げるために有名なおじいさんを使っていますが気になさらず。)
<img width="361" alt="slackbot1.png" src="https://qiita-image-store.s3.amazonaws.com/0/65966/3f49e15f-6fd4-7a9f-eac9-90c43386a104.png">

## プラグイン用のディレクトリを作る
slackbot_settings.pyで指定したファイルをプラグインとして読み込むことができます。
今後の基本的な機能の実装はpluginsディレクトリ下でパッケージして追加していく予定です。

```
# プラグインディレクトリを作成
$ mkdir plugins

# ディレクトリをパッケージ化
$ touch plugins/__init__.py
```

slackbot_settings.pyにプラグインディレクトリを指定

```python3:slackbot_settings.py
PLUGINS = [
    'plugins',
]
```

## 参考URL

- [lins05/slackbot](https://github.com/lins05/slackbot)
- [virtualenv 基本的なコマンド使い方メモ](https://qiita.com/th1209/items/84f21a4499548b34ec91)
- [PythonでSlackbotを作る(1) - ビットログ](https://blog.bitmeister.jp/?p=3892)
rustにおける条件分岐

# 環境
Rust 1.25.0

# Rustにおける条件の評価
Rubyでは以下のコードが許されます。

```ruby:ruby2.5
number = 7
if number
  puts "number is #{number}"
end
```
Rubyではfalse, nil以外を真とみなすため、if文が実行されます。

しかし、Rustでは以下のコードは許されません。

```rust:rust1.25
fn main() {
    let number = 7;

    if number {
        println!("number is {}", number);
    }
}
```

Rustは条件にbool型だけ、つまりtrueかfalseだけを許しています。
number変数はint型であるため、コンパイル時にエラーを出すようです。

# 参考
[Ruby if式](https://docs.ruby-lang.org/ja/latest/doc/spec=2fcontrol.html#if)
[Rust if式](https://doc.rust-lang.org/book/second-edition/ch03-05-control-flow.html#if-expressions)
CCapture.jsでp5.jsの作品をgifアニメにする方法

p5.jsの[公式リファレンス](https://p5js.org/reference/#/p5/saveFrames)を見ていたら、p5.jsの作品を動画として出力するならばCCapture.jsとかを使えばいいよって書いてありました試してみたところ、ちょっとだけはまったのでまとめておきます。

必要なものは、CCapture.jsとgif.jsです（それとp5.jsも）。

* https://github.com/spite/ccapture.js
* https://github.com/jnordberg/gif.js

CCpature.jsは`/build/CCapture.all.min.js`が、gif.jsは`/dist/gif.worker.js`が使用するファイルとなります。

このうちの`CCapture.all.min.js`だけをスクリプトタグで読み込んでおきます。

```html
<script src="./js/CCapture.all.min.js"></script>
```

`gif.worker.js`は`CCapture.all.min.js`がスクリプト内で動的に読み込み処理を行うので、スクリプトタグで読み込んでおく必要はありません。
このときに同一オリジンポリシーを回避するために、htmlファイルが置いてある場所で以下のようにローカルサーバーを立ち上げておきます（これ以外方法でローカルサーバーを立ち上げてももちろん大丈夫です）。

```bash
$ python -m SimpleHTTPServer
```

`http://localhost:8000/`にアクセスするとhtmlファイルを開くことができます。

CCapture.jsでは以下のような操作により、gifアニメを作成することができます。

```js
// in initialization phase
var capturer = new CCapture({format: 'gif', workersPath: './js/', verbose: true});
capturer.start();

// in rendering loop
captuerer.capture(canvas);

// to finish recording
capturer.stop();
capturer.save();
```

CCaptuerクラスのコンストラクタに渡すオブジェクトのうち`workersPath`は`gif.worker.js`が置いてあるディレクトリへのパスを指定するものです。
`verbose`オプションは必ずしも必要ではありませんが、あるとコンソールに処理の進捗が出力されるので、進行具合がわかりやすくなります。
`CCapture#capture`メソッドの引数にはcanvas要素を渡します。

`p5.js`の`createCanvas`でcanvasを作成した場合、canvas要素は以下の方法で取得できます。

```js
var p5Canvas = createCanvas(500, 500);
var canvas = canvas.canvas;
```

（p5.jsの[公式リファレンス](https://p5js.org/reference/#/p5/createCanvas`)には`createCanvas`の返り値は`HTMLCanvasElement`と書かれていますが、実際には`p5.Renderer2D`クラスのオブジェクトが返り値になっています）

実際にp5.jsでCCapture.jsを使用したソースコードは以下のようになります。

```html
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>Sample to making anmation gif for p5.js by CCapture.js</title>
  </head>
  <body>
    <script src="./js/p5.js"></script>
    <script src="./js/CCapture.all.min.js"></script>
    <script>
      var loopFrame = 180;
      var capturer = new CCapture({format: 'gif', workersPath: './js/', verbose: true});
      var canvas;

      function setup() {
        var p5Canvas = createCanvas(500, 500);
        canvas = p5Canvas.canvas;
        rectMode(CENTER);
        noStroke();
        colorMode(HSB, 360, 100, 100);
        capturer.start();
      }

      function draw() {
        background(0);
        var t = (frameCount % loopFrame) / loopFrame;
        for (var w = 0; w <= width; w += 20) {
          for (var h = 0; h <= height; h += 20) {
            var d = sqrt(sq(w - width / 2) + sq(h - height / 2));
            var size = lerp(5, 10, sin(d * 0.1 + t * TWO_PI * 2.0) * 0.5 + 0.5);
            fill(t * 360, 100, 100);
            rect(w, h, size, size);
          }
        }
        if (frameCount < loopFrame) {
          capturer.capture(canvas);
        } else if (frameCount === loopFrame) {
          capturer.stop();
          capturer.save();
        }
      }
    </script>
  </body>
</html>
```

作成されるgifアニメはこんな感じです。
![result.gif](https://qiita-image-store.s3.amazonaws.com/0/61569/845e9d3f-8129-4ed0-c031-2c08697af414.gif)
database.ymlの設定で正しくDBを作成できるか確認するコマンド

やり方をよく忘れるので備忘録。

例えば環境変数が以下のように２つあったとします。

- DATABASE_USERNAME
- DATABASE_PASSWORD

開発環境の場合、通常は [dotenv](https://github.com/bkeepers/dotenv) 等で環境変数をセットしますが一時的に環境変数をセットする場合は以下のように…

```
$ RAILS_ENV=<specific_environment> DATABASE_USERNAME=username DATABASE_PASSWORD=password rails db:create
```

これでよし。
機械学習・深層学習のまとめ

#機械学習
インプットとなるデータをもとに、プログラムがルールや知識を自分で学習する
学習させることにより特定のタスクを実行可能にする
　⇒　未知のものに対する判断・予測をする
学習には時間が掛かり、タスクの実行には時間が掛からない
タスクに使用する情報（特徴量）は人間が教える必要がある
##教師あり学習
教師（人間）入力データと出力データ（特徴量と正解）をセットで渡して学習させモデルを作成する
###分類
故障する、故障しない／生存できる、生存できない　など分類する
目的変数がカテゴリ
####ロジスティック回帰
####決定木
####ランダムフォレスト
####SVM(サポートベクターマシン)
* カーネル法
* カーネルトリック

###回帰
明日の気温、1ヶ月後の売り上げなど、数値を予測する
目的変数が数量

####線形回帰
単回帰式：  $ y=ax+b $
重回帰式：  $ y=a_1x_1+a_2x_2+a_3x_3+・・・+b $

以下の手法で、$ a $、$ b $を推定
####最小二乗法
残差平方和$ \sum(y-\hat{y})^2 $が最小になる$ a $と$ b $を求める
$ y $は実測値
$ \hat{y} $は予測値

手順
① $ x $ の偏差平方和($ S_{xx} $)・ $ y $ の偏差平方和($ S_{yy} $)・$ x $と$ y $の偏差平方和($ S_{xy} $)を求める

```math
\begin{align}
S_{xx} &= \sum^n_{i=1}(x_i-\bar{x})^2\\
S_{yy} &= \sum^n_{i=1}(y_i-\bar{y})^2\\
S_{xy} &= \sum^n_{i=1}(x_i-\bar{x})(y_i-\bar{y})\\
\end{align}
```
② 残差平方和($ S_e $)を求める

```math
\begin{align}
S_{e} &= \sum^n_{i=1}(y_i-\hat{y})^2
\end{align}
```

③ 残差平方和($ S_e $)を$ a $と$ b $について微分し、$ 0 $とおいて $ a $と$ b $を求める

```math
\begin{align}
a &= \frac{S_{xy}}{S_{xx}}\\
b &= \bar{y}-\bar{x}a
\end{align}
```

##教師なし学習
教師（人間）が入力データを渡してデータの一定のパターンやルールを抽出する
データの共通点を見つけてクラスタに分けたり、頻出パターンの抽出を行う
###クラスタリング
####k-means
####LDA
###頻出パターンマイニング
####アソシエーション分析
###次元圧縮
####主成分分析

#深層学習
機械学習のニューラルネットワークの階層を深くしたもの
機械学習のときに人間が渡していた特徴量を機械自体が学習する
##教師あり学習
####CNN
####RNN
####全結合型
##教師なし学習
####オートエンコーダ
####ボルツマンマシン
Mac 起動時オプションのショートカットキー一覧 + チートシート

# はじめに
Mac 起動後のショートカットキーは Mac 上で調べれば良いのですが、起動時または応答しなくなったときには調べられないので、iPhone に入れておく用のチートシートとして作成しました。

詳しい情報は Apple の公式サポートページを参照してください：
> Mac の起動時のキーコンビネーション - Apple サポート
> https://support.apple.com/ja-jp/HT201255

# 起動時オプションのショートカット

|                                オプション                                |             キー            |
|:------------------------------------------------------------------------:|:---------------------------:|
|                              自動ログインOFF                             | Apple ロゴが消えてからShift |
|                             起動ディスク選択                             |            Option           |
|                              CD/DVD から起動                             |              C              |
|      [NVRAM/PRAM リセット](https://support.apple.com/ja-jp/HT204063)     |   Option + Command + P + R  |
|   [macOS 復元ユーティリティ](https://support.apple.com/ja-jp/HT201314)   |         Command + R         |
|         [セーフモード](https://support.apple.com/ja-jp/HT201262)         |            Shift            |
| [シングルユーザーモード (CUI)](https://support.apple.com/ja-jp/HT201573) |         Command + S         |
| [Verbose モード (起動時にCUI)](https://support.apple.com/ja-jp/HT201573) |         Command + V         |
|       [ハードウェア診断](https://support.apple.com/ja-jp/HT202731)       |              D              |
|   [ターゲットディスクモード](https://support.apple.com/ja-jp/HT201462)   |              T              |
|                             ディスク取り出し                             |       F12 or クリック       |

# フリーズ時のショートカット

|           動作           |              キー              |
|:------------------------:|:------------------------------:|
| アプリ強制終了ダイアログ |     Command + Option + Esc     |
| 最前面のアプリを強制終了 | Command + Option + Shift + Esc |
|        強制再起動        |    Command + Control + 電源    |

# チートシート用画像
<img width="300" alt="shortcut.png" src="https://qiita-image-store.s3.amazonaws.com/0/155587/032d826a-7f3b-df6c-ceea-685c311e78cb.png">
BASIC触ってみた

# きっかけ
[スティーブズ](http://comishos.shogakukan.co.jp/ume-steves.html)という漫画を読みました。
Appleを作った2人のスティーブ（[スティーブ・ジョブズ](https://ja.wikipedia.org/wiki/%E3%82%B9%E3%83%86%E3%82%A3%E3%83%BC%E3%83%96%E3%83%BB%E3%82%B8%E3%83%A7%E3%83%96%E3%82%BA)と[スティーブ・ウォズニアック](https://ja.wikipedia.org/wiki/%E3%82%B9%E3%83%86%E3%82%A3%E3%83%BC%E3%83%96%E3%83%BB%E3%82%A6%E3%82%A9%E3%82%BA%E3%83%8B%E3%82%A2%E3%83%83%E3%82%AF)）の話。
（シリコンバレーで既成概念と闘いながら伝説を次々に作っていく様が面白くてあっという間に読んじゃったのでオススメ）

その中に最初から当たり前のように登場するプログラミング言語「BASIC」。

いやいや、BASICって何？
どんな言語？
常識なの？？
悔しい！気になる！

というわけで触ってみました。

# 勉強方法
天下の[ドットインストール](https://dotinstall.com/lessons/basic_basic)！
なんとワタクシBASICでデビュー！

せっかちなエンジニア向けだからか、動画の説明が早口でいいですね。
１つ１つが短いのもいい。

# BASICの動かし方
昔の言語なので、たいていのOSではそのままじゃ動かないとのこと。
というわけで、「[Chipmunk BASIC](http://www.nicholson.com/rhn/basic/)」を使います。

環境に合わせてダウンロードすると、macOSの場合「basic」というプログラミングファイルが含まれています。
こいつを適当にフォルダにコピーして、

```bash
$ ./basic
Chipmunk BASIC 368b1.07
>
```

と打ってやるとBASICが起動します。

# BAISICの基本
## 記法
行番号と命令を対にして書いていきます。

```basic
> 10 print "hello"
> 20 print "basic"
```

行番号は`1, 2, 3...`みたいに連続に振ってもいいけど、10ずつ指定するのが慣例なんだとか。
後で行の間に処理を挟みたくなったときに`15`みたいに指定出来るようにするためだとか。

## 実行方法
　`run`と打つと行番号順に処理されます。

```basic
> run
hello
basic
```

## 保存方法
`save`コマンドを使います。

```basic
> save "hello_basic.bas"
```

すると以下のようなファイルが作成されます。

```basic:hello_basic.bas
10 print "hello"
20 print "basic"
```

## 呼び出し方法
`load`コマンドを使います。

```basic

> load "hello_basic.bas"
```

その後`run`コマンドを打つと実行されます。

```basic
> run
hello
basic
```

# 感想
その他の記法は[ドットインストール](https://dotinstall.com/lessons/basic_basic)に任せるとして、

1. `if then`とか`goto`とか`end`とか、最近自分は書いてないけど知っているコマンドが出てきて、歴史を感じて面白い！
2. 行番号を書くルールとか、歴史っぽくて面白い！
3. でもスティーブズで出てきたBASICってほんとにこれなの？

スティーブズではそもそもプログラムが紙のロールに穴開けるスタイルで書かれてたんだよな・・
まだまだ勉強が必要そうです。


# サンプル
ドットインストールで勉強しながら作ったプログラムがこちら。
[Github basicBasic](https://github.com/9pid/basicBasic)

ちら見するとBASICの記法ってこんな感じなんだ〜がわかるかも。
インデントは不要で、可読性向上のためだけにつけてるよ。
Google Data Studio で簡易データ分析してみる

# はじめに
　ちょっとしたデータの可視化をしたいときに、毎回python+matplotlibを使うのもちょっとタルいなと言う場合に、以前から使って見たかったGoogle Data Studio (GDS) を試してみることにしました。
 https://cloud.google.com/data-studio/?hl=ja

# 使い方
　ベータ版ということですが、ドキュメントも揃っていますし、少しBIツールに馴染みがあれば、ほぼ直感的に使える感じです。
　今回はtitanicのtrain.csvを可視化して見ました。データソースとしてcsvファイルもアップロードできるので、そのままデータソースとして指定します。
　レポートにグラフを貼り付けていくことで、可視化できるようになっています。例えば乗客の年齢の割合、客室のクラスごとの分布など簡単にみることができます。Qiitaではできなさそうですが、Webに埋め込めるのもありがたい。

<iframe width="600" height="450" src="https://datastudio.google.com/embed/reporting/1brwnDxtMiPdVHRllxX30DtXxmPR5kEHS/page/TYqQ" frameborder="0" style="border:0" allowfullscreen>

</iframe><img width="997" alt="Screen Shot 2018-04-21 at 13.30.37.png" src="https://qiita-image-store.s3.amazonaws.com/0/128327/916da7a0-4495-b03f-6010-ffa37584cc44.png">


https://datastudio.google.com/reporting/1brwnDxtMiPdVHRllxX30DtXxmPR5kEHS/page/TYqQ


# おわりに
　定形のグラフによる可視化であれば、python+matplotlibを使うよりも簡便で、共有もすぐにできるところがよくできていると思います。
LINE bot用の環境をコマンド１つで構築する

## 動機
* 毎回LINE botを作る時に環境を構築するのに手間取ってプログラミング始める前に萎えてしまう
* AWSをサービス開発で使っていると言えるとなんとなくかっこいい気がする

## 目標
* 何もないところから出来るだけ簡単におうむ返しbotの作成

## 必要知識
* 独自ドメインをAWSのEC2インスタンスに割り当てることが出来る
  * EC2,ElasticIP,Route53あたりで調べたら先人たちの知恵が無限に出てくる
  * インスタンスは80番,443番ポートを解放しておいてください
* docker-composeが使える
  * 先人たちの知恵を参考にする
* LINE DeveloperでLINE botの最低限の設定が出来る
  * 同じく先人たちの知恵を…
  * CHANNEL_ACCESS_TOKE, CHANNEL_SECRETの取得
  * webhookのURLには使用するドメインのルートパスを記入して置いてください
    * 使用ドメイン => xxxx.xx
    * Webhook URL => https://xxxx.xx/

## 実践
### はじめに
* この記事を書いている中の人はdockerやAWSをちゃんと触り始めて２週間程度の素人なのでセキュリティなどに一切考慮しておりません
* この記事を参考にしたシステムにおけ**る責任は一切負いかねます**のでご注意ください
* また、修正・改良などの意見はお気軽に。てか、むしろ教えていただけると非常にありがたいです

### SSH接続
とりあえずEC2にSSHで接続する
  * SSHに使うポートの解放もお忘れなく

### git hubからソースのダンロード

```sh
git clone https://github.com/yakult1995/easy-line-bot.git
```

### 各自の環境を反映する
ダウンロードしてきたフォルダのdockerフォルダの中のdocker-compose.ymlの

* DOMAIN_NAME
* USER_MAIL
* CHANNEL_ACCESS_TOKEN
* CHANNEL_SECRET

をそれぞれの環境に合わせて変更する

### 幸せになれる魔法

```sh
cd easy-line-bot/docker
docker-compose up -d --build
```

しばらく待つ

### LINEからボットにメッセージを送る
作ったボットにメッセージを送信しておうむ返ししてくれれば終わり

## その他

```sh
docker-compose up -d --build
```

の間のログは

```sh
docker-compose logs -f
```

で見ることが出来る
何かしらのエラーで起動出来なかった場合ここで原因を調べる

## ぼやき
Dockerfileの使い方分からずに何回も試行錯誤してたら
letsencryptの証明書更新し過ぎてしばらく証明書取りに行けなくなったせいで何個のドメインが犠牲になっただろうか…

## 最後に
この記事を書いてるときに色々調べてたら
Lambda使ったbotのシステム構築多くて次はそれで試してみようと思った
Announcing Building a Chatbot with Laravel and BotMan

[Laravel News](https://laravel-news.com/)には良記事が満載なので、備忘録の意味合いも込めて、記事を簡単にまとめていこうと思います（翻訳ではないです）。

# 元記事
投稿日: 2018/04/19
タイトル: Announcing Building a Chatbot with Laravel and BotMan
URL: https://laravel-news.com/announcing-building-a-chatbot-with-laravel-and-botman

# まとめ
「[Building a Chatbot with Laravel and BotMan](https://laravel-news.com/chatbot)」という本の紹介です。

BotManは[これ](https://botman.io/)ですね。
使ったことはないですが、チャットボットを作るためのフレームワークです。
Laravelに組み込んだ[BotMan Studio](https://github.com/botman/studio)というのもあるようです。

# 参考
[PHP chatbot フレームワーク Botmanを使ったbot開発 ~導入編~](https://qiita.com/Ihara-kenta/items/509ed1dafb7992100833)
PowerShell 忘備録（定数・配列・比較演算子）

スクリプトを組むときに毎回調べてしまうので忘備録として。

```powershell

> $PSVersionTable

Name                           Value                                                                                                                             
PSVersion                      5.1.16299.251                                                                                                                     
PSEdition                      Desktop                                                                                                                           
PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0...}                                                                                                           
BuildVersion                   10.0.16299.251                                                                                                                    
CLRVersion                     4.0.30319.42000                                                                                                                   
WSManStackVersion              3.0                                                                                                                               
PSRemotingProtocolVersion      2.3                                                                                                                               
SerializationVersion           1.1.0.1      


### 定数
Set-Variable -name 定数名 constant -value 値 -option constant

### 配列
〇配列の作成
name_list = "あ", "い", "う"
# 上記の記述だと、要素が一つの配列を作成する場合は以下の通り。
name_list = , "あ"

# 以下の記載だと空の配列も作成でき、要素が１つの配列もそのまま作成可能。
name_list = @("あ", "い", "う")

〇２次元配列の作成
$var = New-Object "dataType[,]" row, col
２次元配列の参照・代入
# ２次元配列の作成
$var = New-Object "String[,]" row, col
# データの代入
$var[0,0] = "あ"
$ データの参照
Write-Host $var[0,0]
あ

もしくは、ジャグ配列を使用
$arr_row = @("太郎", "次郎", "三郎")
$arr_col = @("佐藤", "鈴木", "田中")
$arr = @($arr_row, $arr_col)
Write-Host ($arr[0])[1]
次郎

### 比較演算子
$a -eq $b    等しい
$a -ne $b    等しくない
$a -gt $b    より大きい($a<$b)
$a -ge $b    以上     ($a<=$b)
$a -lt $b    より小さい($a>$b)
$a -le $b    以下     ($a>=$b)

ワイルドカードによる比較
$a = "Hello World!"
$b = "Hello*"
$a -like $b
True
$a -notlike $b
False

正規表現に合致
$a = "Hello World!"
$b = "Hello"
$a -match $b
True
$a -notmatch $b
False

比較演算子の先頭にiを付けると大文字小文字を区別しない（デフォルト）
比較演算子の先頭にcを付けると大文字小文字を区別する
$a = "POWERSHELL"
$b = "powershell"

$a -ceq $b # 大文字小文字を区別する
False
$a -ieq $b # 大文字小文字を区別
True
$a -eq $b  # デフォルトは大文字小文字を区別しない 
True








```
Laravel Page Cache for Lightning Fast Page Loads

[Laravel News](https://laravel-news.com/)には良記事が満載なので、備忘録の意味合いも込めて、記事を簡単にまとめていこうと思います（翻訳ではないです）。

# 元記事
投稿日: 2018/04/17
タイトル: Laravel Page Cache for Lightning Fast Page Loads
URL: https://laravel-news.com/page-cache

# まとめ
GETリクエストのレスポンスをhtmlにしてくれるライブラリの紹介記事です。

```php
Route::middleware('web')->get('posts/{slug}', 'PostController@show');
```

というルーティング設定で、posts/foo リクエストがきたら、レスポンスをpublic/page-cache/posts/foo.html に保存してくれます。

あとはWebサーバの設定次第ですが、

```nginx
location / {
    try_files $uri $uri/ /page-cache/$uri.html /index.php?$query_string;
}
```

このような設定にしておけば、次からはキャッシュしておいたHTMLを返すことになります。

# 感想
自分はあまり更新されないページを扱うことが多いので、結構使えそうなライブラリです。
Windowsで納得いくターミナル環境出来た 

初投稿になります。
やっとの思いでWindowsで満足のいくターミナル環境が出来たのでメモ代わりに残します。

# 結論

git-sdkでgit for windows+pacmanを入れられる。
pacmanからtmuxを入れられる。
解決!!!
![無題.png](https://qiita-image-store.s3.amazonaws.com/0/222199/d82c6de7-e32a-c23f-63b2-8e898169a96e.png)

あとはvimとtmuxのdotfile入れたら完成!!
早くvimのcolorscheme:tenderで作業したいぃぃぃ


# Windowsでのターミナルの要件

- git (fscacheを有効に出来る)
- パッケージ管理
- tmux
- そんでもってvagrantを立ち上げたくない


## git-sdk インストール
[git-for-windows/build-extra](https://github.com/git-for-windows/build-extra/releases)から最新版をダウンロード
・・・いや、待って。最新版ってどれよ！
git-sdkとgit-for-windows SDKってのがあるけどどっちよ!

->
git-sdk-1.0.7をインストールします。
git-for-windows SDK 1.0.6だとインストールで失敗しました。

また、git-sdkでgit-bashを起動した時のディレクトリを%HOME%にするために、ショートカットの作業フォルダに%HOME%を指定しました。

## tmux インストール
proxy環境下の方は`/etc/pacman.conf`の`#\XferCommand = ～curl～`のコメントを外します。

```bash
$ pacman -S tmux
```

## AWS CLIインストール

```bash
$ pacman -S python3 python3-pip
$ pip install --upgrade pip
$ pip install awscli
```

# つまずいた点

- msys2からpacmanでgit入れたら、git statusがとても遅い
- core.fscache = trueしても遅い
- 原因はmsys2のgitはfscacheが有効にならないとか…どこの記事か忘れました
- git sdkのインストールでどのバージョンが最新か分からなかった



## 参考

- [msys2を使ってみる](http://foohogehoge.hatenablog.com/entry/2015/09/22/143736)
- [Windows環境でGitを高速化する](https://qiita.com/kentana20/items/538b0f1e3a86188632d0)
【備忘】Effective Python 1章（ジェネレータ、enumerate、例外）

Pythonicな箇所をピックアップして残そうと思います。
これからPythonを勉強しようと思っている方にも役立つかもしれないです。

# ジェネレータ
[リスト内包表記](https://qiita.com/ishigero/items/82912eb96eb0c9a8c308)では要素の全てをメモリに乗せるため、大量データを扱うときはジェネレータの方が良い。

書き方：リスト内包表記での[　]を(  )にする

```py
words = ['hoge', 'fug', 'oo', 'i']
it = (len(word) for word in words)
print(it)           # <generator object <genexpr> at 0x7fa8dda48f10>
print(next(it))     # 4
```

ジェネレータは組み合わせて使うこともできる。（速い）

```py
it_2 = ((x, x*2) for x in it)
print(it_2)           # <generator object <genexpr> at 0x7fa8dda48048>
print(next(it_2))     # (3, 6)
print(next(it_2))     # (2, 4)
```

# enumerate
リストの反復処理で添字が必要なときに便利。

```py
colors = ['white', 'blue', 'green', 'red']
```

rangeを使った場合

```py
for i in range(len(colors)):
    color = colors[i]
    print('%d: %s is beautiful' % (i, color))
```

enumerateを使った場合

```py
for i, color in enumerate(colors):
    print('%d: %s is beautiful' % (i, color))
```

結果

```py
# 0: white is beautiful
# 1: blue is beautiful
# 2: green is beautiful
# 3: red is beautiful
```

# 例外
コードから

```py

def main():
  normal_sample()
  print('////////////')
  exception_sample()

# try
# no problem
# finish
# ////////////
# exception
# finish


def exception_sample():
  try:
    open('/hoge.txt')

  except:
    print('exception') 

  else:
    print('no problem')

  finally:
    print('finish')


def normal_sample():
  try:
    print('try')

  except:
    print('exception') 

  else:
    print('no problem')

  finally:
    print('finish')


if __name__ == '__main__':
  main()
```

### else
tryの中で例外が発生しなかった時に実行される

### finally
tryの中で例外が発生しても、発生しなくても実行される

分かりやすい。
docomo Developer supportの知識Q&A APIを使ってみる



しゃべってコンシェルって今も使ってる方いらっしゃるんですかね？
しゃべってコンシェルに使用されている[知識Q&A API](https://dev.smt.docomo.ne.jp/?p=docs.api.page&api_name=knowledge_qa&p_name=api_1#tag01)がdocomo Developer supportで公開されています。
RESTとSDK(Android,Server side JAVA)で提供されてるのでpythonからでも簡単に使うことができます。

TwitterとかLINEbotに仕込めば知識Q&Abotが作れそうです。
ただその場合はガイドラインに従う必要があります。

>  ガイドライン(必読)
>> サービス提供条件
必ず回答文テキスト(answerText)と引用元URL(linkUrl)を使ってください。その際、二つはユーザインタフェース上で対応付けて表示してください。引用元URLを利用してユーザが引用元のページへ遷移できるように実装してください。


サンプルリクエストコード：

```
import requests
import json

url = 'https://api.apigw.smt.docomo.ne.jp/knowledgeQA/v1/ask?q={}&APIKEY={}'
api_key = ''


def get_knowledge(question):
    response = json.loads(requests.get(url.format(question, api_key)).content)
    print(response['message']['textForDisplay'])


if __name__ == "__main__":
    get_knowledge("ブラジルの母国語は")
```

サンプルレスポンス：

```
インターネットで調べたところ、一位は、ポルトガル語です。
```

音声認識APIもあるので組み合わせれば音声対話型サービスも作れます。
Laravel5.6チュートリアル 中級者向けタスクリスト

[前回](https://qiita.com/dyoshikawa/items/4b59c9594c72eb2321ea)に引き続きLaravel5.1の[中級者向けタスクリスト](https://readouble.com/laravel/5.1/ja/quickstart-intermediate.html)をLaravel5.6でやっていく。
こちらは量が多いので関数の変更等目立つ差分だけ抽出して書く。

# データベースの準備
## Eloquentリレーション

`User`モデルのextends以降が随分違うが、`extends Authenticatable`のままでいいっぽい。

```php:app/User.php
class User extends Authenticatable{
    // ほにゃらら
}
```

# ルーティング
## 認証

認証周りはサクッと生成してしまう。

```bash
php artisan make:auth
```

gitで生成後の差分はわかるので、それを写経すると勉強になりそう。

# タスク削除
## ルートモデル結合

```php:app/Providers/RouteServiceProvider.php
parent::boot();
Route::model('user', App\User::class);
```

https://readouble.com/laravel/5.6/ja/routing.html
の`明示的な結合`項を参考に。

# 参考
https://readouble.com/laravel/5.1/ja/quickstart-intermediate.html
https://readouble.com/laravel/5.6/ja/authentication.html
https://readouble.com/laravel/5.1/ja/authentication.html
https://readouble.com/laravel/5.6/ja/container.html
https://readouble.com/laravel/5.6/ja/routing.html
Electraで脱獄した環境でOpenSSHを削除してしまいSSHにアクセスできなくなった

SSHなんていらないって思いOpenSSHを削除したのですが、いいTerminalがなくOpenSSHをまたインストールをしました。

ElectraでJailbreakするとデフォルトでOpenSSHがインストールされていて、ポート`2222`にしてSSHにアクセスすると難なくSSHが使えたのですが、OpenSSHを再インストールしてSSHにアクセスしてみると…

```
shishi:~ mobile$ ssh root@localhost -p 2222
ssh: connect to host localhost port 2222: Connection refused
```

SSHにアクセスできませんでした！！
再インストールしてもそのまま設定が引き継がれなかったのでまた設定？をします。

# やり方は簡単でSSHの設定ファイルのコメントアウトを外すだけ

なんかのファイルマネージャーやvimでもいいので`/etc/ssh`に移動して`sshd_config`というファイルを開きましょう。

15行目ぐらいに`#Port 22`とコメントアウトされたものがあると思います。

そのコメントアウトを外して`Port 114514`みたいな感じにして好きなPort番号に変更しましょう。勿論2222でもOKです。

好きなポートにできたら、端末を再起動してまたJailbreakをしましょう。

改めてSSHに接続してみると

```
shishi:~ mobile$ ssh root@localhost -p 114514    
root@localhost's password:
```

パスワードを入力して無事にSSHにアクセスできました。

## パスワードの変更はしておきましょう。
脱獄ユーザーの中にはrootユーザーのパスワードをデフォルトの`alpine`のままにしておく人がいるようです。

そこらへんにあるFree Wi-Fiに接続すると簡単に自分の端末に侵入されちゃう可能性があると思うのでデフォルトから変更しておきましょう。
mariadb/mysql : Basic level

基本コマンド

```
$ brew install mysql
```

```
$ mysql --version
```

```
$ mysql.server start
```

```
$ mysql -uroot
```

```
$ mysql_secure_installation
```

```
$ mysql -uroot -p
password:
```


```mysqldump``` :　データベースからデータをSQL文、タブ区切りのテキストファイル形式で取り出す。

```
mysqldump --user=ユーザ名 --password=パスワード データベース名 > 出力ファイル名
```

``mysqladmin`` 
　データベースを作成したり破棄したり、mariadb/mysqlの管理操作。サーバーのバーション、プロセス、ステータスなどの各情報を取得する場合。


``maysqlimport``　
LOAD DATA INFILE 構文を使用して、テーブル内にテキストファイルからデータを登録できる。

``mysqlshow``　
データベース、テーブル、カラム、インデックスに関する各情報を表示する。

``mysqlcheck``
　テーブルを保守したり、破壊されたデータを復帰させる。


##ロギング##
（SQLのトラブルの確認や重い処理のSQLの確認に使用する。）

```
$ touch  絶対パス/query.log　　　　　　　　　　#空のファイルを設置する
$ chmod 666 絶対パス/query.log  #ファイルに書き込む権限を追加
```

```
MariaDB[(none)]>use mysql;
Database changed
MariaDB[(mysql)]>SET GLOBAL general_log = 1;　　　　　　　＃on: 1, off: 0
Query OK, 0 rows affected (0.00 sec)

MariaDB[(mysql)]>SET GLOBAL general_log_file = '絶対パス/query.log;
Query OK, 0 rows affected (0.00 sec)　　　　　＃ログを書き込むファイルを指定

MariaDB[(mysql)]>¥q
Bye
```

##動作状況の確認やメンテナンス

```
>mysqladmin ping
mysqld is alive

>mysqladmin status　　　　　　　 #mysqladmin extended-status　
Uptime: 8025 Threads : 1 Questions:62 Slow queries: 0
Opens: 63 Flush tables : 1 Open tables: 0
Queries per second avg: 0.005
```

 ##mysqladmin status　実行結果の内容

``　Uptime``　： サーバーの稼働秒数
``Threads``　： Mysqlが使用中のスレッド（クライアント）の数
``Questions``　： クライアントからの質問の数
``Slow Queries``　： 設定された時間より時間がかかった問い合わせ数


##バックアップ

```
mysqldump -u ユーザー名 -p データベース名 > database.sql
```
###データを元に戻す

```
drop database データベース名 　　　　　　　　　＃データベースを空にする
create database　　データベース名　　　　　　　＃データベースの新規作成
mysql データベース名 < database.sql
```
【Amazon LightSail】  Windows Serverのスナップショットからインスタンスを作成するときの手順

####Amazon LightSailでWindows Serverのスナップショットからインスタンスを複製するときの手順(Windows Server 2016使用)



公式によると、下記の手順が必要。
URL:<https://lightsail.aws.amazon.com/ls/docs/how-to/article/prepare-windows-based-instance-and-create-snapshot>




手順：

1. 複製元のインスタンスに接続する
![1.png](https://qiita-image-store.s3.amazonaws.com/0/186724/b9c4178c-7c76-1f5f-b845-7953674ce897.png)


2. スタートメニューから　”Ec2LaunchSettings” を選択
![2.png](https://qiita-image-store.s3.amazonaws.com/0/186724/95421c94-4876-a9ff-5599-10988fcc6fda.png)


3. "Administrator Password" の項目を設定。(下記いずれか)
    - Random (Retrieve from console) : ランダムパスワードを生成。
![3-1.png](https://qiita-image-store.s3.amazonaws.com/0/186724/c0a81e68-17c9-8210-c9d0-d86ef60056bc.png)
    - Specify (Temporarily store in config file) : 任意のパスワードを設定。
![3-2.png](https://qiita-image-store.s3.amazonaws.com/0/186724/275d25f8-c53f-9487-dc52-09f3afdb3a80.png)


4. 右下の"Shutdown with Sysprep" を押してインスタンスを停止する

![4.png](https://qiita-image-store.s3.amazonaws.com/0/186724/4af6a273-d9e3-9235-5892-1552f17c34c3.png)



５. (少し時間を置き)スナップショットを作成。

![5.png](https://qiita-image-store.s3.amazonaws.com/0/186724/f32c21c4-5c16-c33c-f1d2-4aef3db19e63.png)


６. スナップショットから新しいインスタンスを作成。

![6-1.png](https://qiita-image-store.s3.amazonaws.com/0/186724/e9487d98-f5c8-753d-baaf-b7ad41f32a36.png)

![6-2.png](https://qiita-image-store.s3.amazonaws.com/0/186724/daa80bdb-0592-5963-c3b5-243051626f6f.png)

![dist_name.png](https://qiita-image-store.s3.amazonaws.com/0/186724/1265f43d-9338-cd67-349d-c1890dca691b.png)



７. 数分待つと、新しいインスタンスが利用可能になる。

![7.png](https://qiita-image-store.s3.amazonaws.com/0/186724/59108ed0-54d5-9f30-7c9d-f9422d8ecc54.png)
Emacs: tree

# file の tree 表示です。

cygwin に入っていたか何かした tree を使っていて、一時無くなってしまったので書いたものです。

自分が使っていた `-d` (Directory Only) と `-Q` (クォート) オプションのみがついています。
よく調べていませんが melpa にあったものはインタラクティブなものだったので、テキスト出力を利用したかったので用途と違いました。

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

[ここからダウンロードして](https://gist.github.com/s-fubuki/df51dec8858151765ba3c6a77b46b7d6) `load-path` の通ったディレクトリに置いて `init.el` に以下の1行を追加します。

```emacs-lisp:sample
(require 'tree)
```


# 使い方

`M-x tree` や `(global-set-key "\C-ct" 'tree)` 等として起動すると、ディレクトリを尋いてくるので、入力すると通常専用バッファに出力します。

`Prefix` 付で実行すると結果をカレントバッファのカーソル位置手前に挿入します。

# 設定できる変数

## tree-option-d
`NON-NIL` なら Directory のみを表示します。

## tree-option-Q
`NON-NIL` ならファイル、ディレクトリー名をクォートで括って表示します。

## tree-ignore-directory 
マッチから外す ディレクトリを指定した正規表現を指定します。
デフォルトでは `"^\\.+$"` ですが、これは必ず含めて、追加する場合はグルーピングを使ってください。

# その他
`d` や `Q` がデフォルトオンの `dtree(-dQ)` `ftree(-Q)` も含めてあります。

`dtree` と `ftree` は `eshell` から実行できる簡易なものも含めてありますが、コマンドラインからオプション指定ができません。

# 動作確認している Emacs のバージョン

> GNU Emacs 25.3.1 (i686-w64-mingw32)
>  of 2017-09-18
自治体データベースの悲劇

<img src="https://farm5.staticflickr.com/4684/25260822078_fc9e5d4e46_b.jpg" width="100%">

最近、自治体で運用されているデータベースを使わせていただく機会が増えました。それぞれのデータベースは大変優れたもので使い勝手の良いものです。しかし、その運用には疑問を感じています。


## データベース間の移動は紙が原則

私が経験したデータベースを使用したワークフローは以下のようになります。

1. データベースから集計表を出力（紙媒体）
2. 取り出した集計表（紙媒体）をエクセル一覧表に入力
3. エクセル一覧表を出力（紙媒体）
4. エクセル一覧表（紙媒体）のデータを別のデータベースに入力

冗談のようですが、データベースを使用していながら、**2回**も同じ内容を**手入力**しています。


## データベースは素人でも運用はプロ

同じ自治体でも私が以前勤務していた図書館の蔵書データベースは素人がつくったものでしたが、運用はしっかりと考えられていました。たとえば登録作業は以下のようになります。

1. バーコードリーダーでISBNコードを読み取ってcsvファイルに送る
2. ISBNコードの入ったcsvとアマゾンの書誌情報をマッチングさせる
3. バーコードで本の登録番号を読み取って書誌情報の入ったcsvに登録番号を入力する
4. csvファイルを蔵書データベースにインポートする

人間はキーボードを触らないので、本の取り違えをしなければ間違いは発生しません。
100冊くらいの本なら30分で登録作業が完了します。
この仕組みは**データベース素人**の職員が試行錯誤しながら考えたものですが、**運用はプロ**ですからとてもよく考えられていました。


## 2度も手入力するのは過酷です

最初に紹介したデータベースはエクセル以外はすべてプロが作った高価なものです。しかし、データ運用の一貫性が考慮されておらず、途中の2回はフル手入力になります。集計結果が紙ベースなので、最初のデータベースの出力と最後のデータベースの入力が一致しているかどうかを知るすべはありません。
**電卓**と**目視**の確認がたよりの過酷な作業です。

## 電子データは一貫して電子データとして流す

近年、国や県の業務が次々と権限委譲で自治体に降りてきています。個人情報を含む大切な情報を扱う作業です。間違いも許されません。このような作業を遅れず間違わずにこなしてきた前任者には本当に頭が下がります。
しかしながら、そうした職員をささえるデータベース運用はとても悲しいことになっています。

個人情報の取り扱いの問題を考えても、紙媒体を基本とする作業では多くのミスコピーが発生します。電子データの流出も大きな問題ですが、個人情報が記載されたミスコピーが何十枚も発生する環境も大きな問題です。

役所ですから、作業の最下流（決裁やお知らせ文書）が紙媒体になることはやむを得ません。しかし、中間で多量の紙が発生し、情報流出を誘発する環境は好ましいものではありません。電子データは**ワークフローの最下流**まで一貫して電子データとして流さなければなりません。

こうしたデータベース運用を見直すだけで、**自治体業務の効率**が大きく向上する可能性を感じています。
フォトショの使い方: 基礎メモ

# 枠線で囲む
サイドメニュー右下のRectangle Toolを使う。

<img width="1440" alt="スクリーンショット 2018-04-21 11.13.55.png" src="https://qiita-image-store.s3.amazonaws.com/0/172515/7144bb9b-2b68-46a3-86de-8e2678d3c50d.png">



上部もしくはPropertiesで、Fill（塗りつぶし）とStroke（枠線）の設定をするだけ。
PHPトラブルシューティング（自分用・随時更新）

# 概要
PHPを使う中で急に起こったエラーに対する対応履歴

# 環境
Ubuntu16.04
PHP5.6

#（１）sudo apt-get updateの後にphpコマンドが使えなくなる(2018.4.20)

###■エラーの内容

```
$ php -v
php: error while loading shared libraries: libssl.so.1.0.2: cannot open shared object file: No such file or directory
```
###■調査
調べてもなかなか解決策がでてこなかったが、以下のサイトにてヒントが得られた。
[Compile error ubuntu 16.04 SSL 1.1.0](https://www.domoticz.com/forum/viewtopic.php?t=19142#p150376)

上記サイトの最後の[コメント](https://www.domoticz.com/forum/viewtopic.php?t=19142#p150376)が解決の糸口になった。
###■解決手順
以下サイトよりlibssl1.0.2をインストールすることで解決
[パッケージ: libssl1.0.2 (1.0.2l-2+deb9u3)](https://packages.debian.org/stretch/libssl1.0.2)
AVTokyo2017バッジを使ってSTM32の開発をしてみよう

マイコンバッジを使ってARMマイコン、STM32(STM32F103)の開発をしてみましょう。


同じ内容は「STM32の開発をしてみよう（AVTokyo2017バッジをHack）」
https://qiita.com/lowlevel/items/5221a43875e1db464fa2
にもありますが、こちらは改めてテキストに適するように再構成したものです。

# Hackしよう！

流れ：


## 第1章　ボードの解説、開発環境セットアップ、サンプルの実行

記事：「inside of AVTOKYO 10th HACK BADGE」
  https://qiita.com/lowlevel/items/0fd3402e0dd4584de65f

- 開発環境インストール
- テストプログラムでLED点滅

なお、このテキストではST-Linkは使いません。Windowsの方は「ST-Linkを使う場合はST-Linkのドライバのインストールも必要となります」の箇所は、省略して下さい。




## 第2章　OLEDディスプレイに描画するサンプルプログラムを動かします。

記事：「AVTOKYO 2017 BADGE で OLEDプログラム」
　https://qiita.com/lowlevel/items/bbdce97ee2faf4768de3

- OLEDライブラリインストール
- サンプルプログラムの動作確認

## 第3章　AVTOKYOで配布したバッジにインストールされている、ミニCTFクイズ問題を書き換えて自分のクイズで遊ぼう。


「software description of AVTOKYO 10th HACK BADGE」
https://qiita.com/lowlevel/items/12c55ce9260e7d369989
に、AVTOKYOに配布したもののソースコードが記載されています。
これを書き込むと本来のソフトが復元します。
また、miniCTFの問題はハードコーディングされています。問題を書き換えて自分のCTFを作ってみましょう。

## 第4章 BadUSB

STM32でUSB HIDデバイスの機能が使うことができます。この技術を使えば、キーボードから入力があったように振る舞うことができます。
当然、悪いこともしまくりです（BadUSB）。
「STM32でBadUSBを作る」
https://qiita.com/lowlevel/items/8ef206478aaafcf6477b
この記事ではキーボードのエミュレーションのみですが、マウスやUSBストレージなどもエミュレーションできます。自信のある方はチャレンジしてみてください。


## APPENDIX　STM32duino 環境のトラブルシューティング
https://qiita.com/nanbuwks/items/7026c4bf9937eed5ded8
2018年4月版Instagram API利用規約を翻訳

Instagram　APIはやたら審査が厳しいらしく、利用規約も英語なので翻訳します。
https://www.instagram.com/developer/review/
__________________________________

Instagramプラットフォームで作成されたすべての新しいアプリはサンドボックスモードで起動します。このモードのアプリは、任意のAPIエンドポイントを使用できますが、限られた数のユーザーとメディアに制限されています。これは、アプリの開発とテストに最適です。

LiveにアクセスしてInstagramコンテンツに完全にアクセスするには、審査と承認のために申請書を提出する必要があります。審査が終わると、あなたのアプリが承認された権限スコープのみをユーザーに要求することができます。このため、対応する権限がレビューされ承認されない限り、アプリケーションは一部のAPIエンドポイントを使用できない可能性があります。

レビュープロセスにより、Instagramコミュニティのための本物で一貫した経験を保証することができます。アプリレビュープロセスは、コミュニティメンバーがサードパーティアプリを通じてコン​​テンツを共有する方法を細かく制御し、アプリが互換性のあるユースケースを構築していることを支援することを目的としています。




## How to Submit for Permissions Review：権限の確認のために提出する方法

・Manage Clientsに移動して、レビューのために送信するアプリを編集します
・Detailsタブでは、すべてのフィールドに入力し、Update Clientボタンで変更を保存してください
・Permissionsタブに移動し、各アクセス許可とそのレビューのステータスを表示します
・Start a submissionボタンをクリックし、指示に従ってください
提出の結果は、同じ[権限]タブに表示されます。提出物を審査するまで、再度提出することはできませんのでご注意ください。

##Criteria for Review：レビューの基準
#####Submission quality：提出品質
注釈は、明確かつ簡潔かつ英語で書かなければならない。不十分なメモがある投稿は承認されません。

###：ビデオスクリーンキャストの品質
ビデオスクリーンキャストには、アプリのInstagramログイン経験、適切な資格情報、および要求しているすべての権限の使用状況が示されている必要があります。明確で実用的なスクリーンキャストを提供していない場合は、提出を承認しません。

###アプリケーション開発段階：最終バージョンと本番版アプリのみをレビューします。テスト版と開発版のアプリを使った投稿は承認されません。

###ブランドとポリシーの準拠：あなたのアプリはInstagramのプラットフォームポリシーとInstagramブランドガイドラインに準拠している必要があります。

ユースケースとパーミッションの準拠：

これらのユースケースに該当するアプリの提出を承認します：

個人が第三者のアプリケーションと自分のコンテンツを共有できるようにする
ブランドと広告主が視聴者とデジタルメディアの権利を理解し管理できるようにする
放送局や出版社がコンテンツを見つけたり、メディアにデジタル権利を与えたり、適切な帰属関係でメディアを共有したりするために
提出では、要求している各権限が有効なユースケースのどれに該当するかを記述する必要があります。したがって、実際に必要な権限のみを要求してください。たとえば、最初のユースケースに該当するInstagramとの統合を構築する場合は、基本的なアクセス許可のみが必要です。

サポートしているユースケースの詳細については、ログイン許可のドキュメントを参照してください。

###よくある質問
私の提出は拒否されましたが、有効なユースケースでした。私は何をすべきか？提出を拒否する一般的な理由は、アプリの評価を行うのに十分な情報がないことです。これは、あなたの提出が短すぎる場合、重要な情報を見逃した場合、良いスクリーンキャストを提供しなかった場合、ウェブサイトが機能していない場合などに発生する可能性があります。再度審査のために提出する前に、あなたのアプリが何をし、どのようにすべての許可を使用するか。ビデオスクリーンキャストを提供し、すべてのプラットフォームポリシーに従うようにしてください。

###提出物に何を書かなければならないのですか？
提出は、あなたのアプリが何をしているのか、あなたが求めているパーミッションがなぜ必要なのかを正確に理解するのに十分な長さでなければなりません。投稿が短すぎたり、統合のすべての部分について説明していない場合は、アプリを理解して承認することができない場合があります。たとえば、あなたの提出物は、あなたのアプリや会社が何をしているのか、あなたの統合の対象となる承認されたユースケースのどれ、あなたのアプリを使うのか、あなたのユーザーがあなたのアプリをどのように認証するのか、統合、Instagramなどから取得したデータをどのように使用するか

###ビデオスクリーンキャストにはどうすればいいですか？
ビデオスクリーンキャストは、投稿の非常に重要な部分であり、省略することはできません。 Instagramログインの経験や、あなたが要求しているすべての権限の使用法など、アプリケーションがどのように動作しているかをビデオに明確に示してください。アプリはまだサンドボックスモードになっている可能性があるため、サンドボックスユーザーのデータを使用して統合を紹介することができます。

### 私の会社は複数のクライアントで作業していますが、プロジェクトごとに1つのアプリを提出する必要がありますか？
いいえ、Googleでは、ハッシュタグキャンペーン、イベント、ウェブサイトなど、ワンオフプロジェクト用に作成されたアプリは承認しません。すべての統合で1つのclient_idを使用する必要があります。

私がミスをした場合、提出を取り消すことはできますか？進行中の投稿を取り消すことはできません。あなたは、新しいものを開始する前に投稿がレビューされるまで待つ必要があります。
Eclipse + Spring Boot + MySQL 環境構築

勉強の為に開発環境を構築してみます。

◆前提
構築するのは次の環境
・Windows8.1

◆Eclipseのインストール
インストールと言っても、サイトからD/Lして配置するだけ
・対象バージョン
　Pleiades All in One 4.7.3a.v20180411　Eclipse 4.7 Oxygen 3a
・D/Lサイト
　http://mergedoc.osdn.jp/

◆Spring Boot
Eclipseプラグインのインストール
・STS（Spring Tool Suite）
・ビルドツールには「Gradle」
手順は次のサイトを参考にさせて頂きました！
https://www.marineroad.com/staff-blog/16785.html

◆MySQLのインストール
・対象バージョン
　mysql  Ver 8.0.11 for Win64 on x86_64 (MySQL Community Server - GPL)
・D/Lサイト
　https://dev.mysql.com/

手順は次のサイトを参考にさせて頂きました！
https://webkaru.net/mysql/install-windows/
【Rails】引数が多くなったので、キーワード引数使った。そしたらハマった部分とか。

なんか仮引数がめっちゃ多くなって、その仮引数に対して実引数全部書いてたんですよね。

例えば、こんな感じで。


```ruby

[11] pry(main)> def func(a, b, c, d, e, f, g)
[11] pry(main)*   a + b + c + d + e + f + g
[11] pry(main)* end
```


```ruby

[12] pry(main)> func(1, 2, 3, 4, 5, 6, 7)
=> 28

```

とまぁ期待する値は返ってくるんですが、引数増えたらくそほどめんどいじゃないですか？

ってことなので、この引数地獄から俺を解き放ってくれって感じで、なにか良い方法ないかなって探したらありました。

キーワード引数を使って、実引数をハッシュで渡してやる方法です。


まずは、仮引数をキーワード引数の形に直しましょう。

```ruby
[8] pry(main)> def func(a:, b:, c:, d:, e:, f:, g:)
[8] pry(main)*   a + b + c + d + e + f + g
[8] pry(main)* end
```


キーワード引数にするには、仮引数のあとに:を入れるだけです。

で、実引数の方は、使ってやってみるとこうなります。



```ruby
[9] pry(main)> hoge = {a: 1, b:2, c: 3, d: 4, e: 5, f: 6, g: 7}
=> {:a=>1, :b=>2, :c=>3, :d=>4, :e=>5, :f=>6, :g=>7}
[10] pry(main)> func(hoge)
=> 28
```

ふぁ！？！？
hogeをハッシュのシンボル形式で渡してやると、めっちゃスッキリしませんか？仮引数側は7つのなのに、実引数側は変数1つ打ち込めばいってことです。
fucnにhogeだけ渡せばいいので、これは楽。



ちなみにハマったのはこれ。


```ruby
[11] pry(main)> hoge = {'a' => 1, 'b'=>2, 'c' => 3, 'd'=> 4, 'e'=> 5, 'f'=> 6, 'g'=> 7}
=> {"a"=>1, "b"=>2, "c"=>3, "d"=>4, "e"=>5, "f"=>6, "g"=>7}
[12] pry(main)> func(hoge)
ArgumentError: wrong number of arguments (given 1, expected 0)
from (pry):1:in `func'
```

ハッシュで渡しても、シンボルの形ではないとダメらしいです。

ArgumentError: wrong number of arguments (given 1, expected 0)なにがダメだったのかかわからなかったorz


キーワード引数で渡したら、実引数側もキーワード形式でもしくはシンボルのハッシュでないと引数として認識してくれないってことですね。

ちなみに、キーワード引数の:のあとにデフォルト値を設定しない場合は、必須値になるそうです。

なので
こういのは、怒られる。


```ruby
[13] pry(main)> hoge = {a: 1, b:2, c: 3, d: 4, e: 5, f: 6}
=> {:a=>1, :b=>2, :c=>3, :d=>4, :e=>5, :f=>6}
[14] pry(main)> func hoge
ArgumentError: missing keyword: g
from (pry):1:in `func'
```

けど、こういうのはいける。


```ruby
[15] pry(main)> def func(a:, b:, c:, d:, e:, f:, g:0)
[15] pry(main)*   a + b + c + d + e + f + g
[15] pry(main)* end
=> :func
[16] pry(main)> func hoge
=> 21
```


これから引数多くなったら、使っていこうと！
Railsでプログラムカラムを追加したい時の流れ 

Railsでプログラム作成済み、カラムを追加したい時の流れ 

postテーブル（作成済み）に　link, image フィールド追加 
アプリ該当フォルダに入りコマンド実行 
＞rails g migration add_link_to_posts 
db-migarateフォルダの上記実行日時のファイル編集 
class AddLinkToPosts < ActiveRecord::Migration[5.0] 
def change 
add_column :posts, :link, :string 
add_column :posts, :image, :string 
end 
end 
add部分を追記して保存 

ターミナルに戻り
＞rails db:migrate 実行

railsコンソールで確認 
＞rails console 
＞Post.column_names 
でカラム追加確認 
＞Post.all 
でデータ確認 
＞exit 
でコンソール終了
またこれをヘロクにアップロードする方法の次回書きます。
（マイページにはすでに書いてます）
<a href="http://www.freestyle-life.site:3000/posts/79">マイページ</a> 
#Ruby Rails #プログラム
CSS 上下左右中央揃え 

#したいこと
CSSで上下左右中央揃え
環境
　∟Slim
　∟Sass
※検証のためSassのコードは省略しないで書く

#4つの方法
## postion + -margin
<img width="417" alt="スクリーンショット 2018-04-21 10.23.22.png" src="https://qiita-image-store.s3.amazonaws.com/0/20635/a75de1ff-6499-f1df-ae45-e4e3a2bfb520.png">


```html
.wrapper
 .box
```
```sass

.wrapper01 {
  width: 400px;
  height: 400px;
  background-color: #cccccc;
  position: relative;
  .box {
    width: 200px;
    height: 200px;
    background-color: red;
    position: absolute;
    top: 50%;
    left: 50%;
    margin-top: -100px;
    margin-left: -100px;
  }
}
```

## postion + calc()
<img width="411" alt="スクリーンショット 2018-04-21 10.23.30.png" src="https://qiita-image-store.s3.amazonaws.com/0/20635/5c7a6453-0bdd-47f6-c7f4-f00702a443f3.png">


```html
.wrapper
 .box
```
```sass
.wrapper02 {
  width: 400px;
  height: 400px;
  background-color: #cccccc;
  position: relative;
  .box {
    width: 200px;
    height: 200px;
    background-color: red;
    position: absolute;
    top: calc( 50% - 100px);
    left: calc( 50% - 100px);
  }
}

```
## postion + transform（注：ブラウザによっては、にじむ）
<img width="429" alt="スクリーンショット 2018-04-21 10.23.36.png" src="https://qiita-image-store.s3.amazonaws.com/0/20635/1e6f9f0a-510a-a03a-db09-a976c853a695.png">


```html
.wrapper
 .box
```
```sass
.wrapper03 {
  width: 400px;
  height: 400px;
  background-color: #cccccc;
  position: relative;
  .box {
    width: 200px;
    height: 200px;
    background-color: red;
    position: absolute;
    top: 50%;
    left: 50%;
    transform: translate(-50%, -50%);
  }
}

```
## Flexible Box
<img width="415" alt="スクリーンショット 2018-04-21 10.23.46.png" src="https://qiita-image-store.s3.amazonaws.com/0/20635/91f1b225-cfd8-8d64-f95d-6d0fee525196.png">

```html
.wrapper
 .box
```
```sass
.wrapper04 {
  width: 400px;
  height: 400px;
  background-color: #cccccc;
  display: flex;
  justify-content: center;
  align-items: center;
  .box {
    width: 200px;
    height: 200px;
    background-color: red;
  }
}
```