OmniAICreator/Qiita-1.07M huggingface dataset:
「5と8を使った和で表すことができない最大の整数を求めよ」を数理計画的に解く


問題定義
------

「5と8を使った和で表すことができない最大の整数を求めよ」というツイートが話題ですね。

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">小2長男「算数の問題教えて。」<br>俺「いいよー。どんな問題？」<br>長男「5と8の和で表すことができない最大の整数を求めよ。」<br>俺「！？」<br><br>小4向けの問題集だけど大学入試で出てもおかしくないレベル。なかなか良問だった。</p>&mdash; 吉田匠 (@takuYSD) <a href="https://twitter.com/takuYSD/status/1089336367782420480?ref_src=twsrc%5Etfw">2019年1月27日</a></blockquote>


解析的には$5&times;8-(5+8)=27$と一瞬で求まる（<https://todai-counseling.com/?p=1430>）わけですが、本記事ではこれを数理計画的なアプローチで解いてみます。

コードは以下のGithubに上げてあります。
<https://github.com/karak/solve-elementary-math-problem>

アルゴリズム
----

5の倍数と8の倍数の和で表される整数の集合を$S$とする。
このとき、以下の条件を満たす整数$k$を1から昇順に探索し、最初に見つかったものが解である。

1. $k \not \in S$
2. $k+i \in S\ (i=1..5)$

実装
----

JavaScript(ES6)で実装します。

### メインルーチン

```js
function solve() {
  /* ５の倍数と8の倍数の和で表される整数の集合Sを定義する */
  const S = new Set((i, j) => 5 * i + 8 * j);
  /* kがSに含まれており、k+1からk+5がSに含まれていないことを判定する関数 criteria を定義する */
  const isInS = k => S.includes(k);
  const criteria = k => !isInS(k) && all(k + 1, k + 5, isInS);
  /* criteria を満たす1以上の最小の整数を探索する。 */
  const solution = minimumNumberThatSatisfies(criteria);
  return solution;
}
```

アルゴリズムを素直に表現したコードにしてみました。そのために関数型のスタイルを多用しているので、HaskellやMLといった言語を使っている人の方が馴染みがあるかもしれません。

### Set の実装

```js
/**
 * 2つの0以上の整数i, jに対して整数を返す関数fによって定義される集合。
 * ただし、fはi,jに対して単調増加とする。
 */
class Set {
  constructor(f) {
    this.f = f;
  }

  /** 整数 k が集合に包含されているかを判定する。 */
  includes(k) {
    for (let i = 0; ; i += 1) {
      let j = 0;
      const y0 = this.f(i, j);
      if (y0 > k) {
        break;
      } else if (y0 === k) {
        return true;
      }
      for (j = 1; ; j += 1) {
        const yj = this.f(i, j);
        if (yj > k) {
          break;
        } else if (yj === k) {
          return true;
        }
      }
    }
    return false;
  }
}
```

`Set`のコンストラクタは2つの0以上の整数 $i, j$ を受け取って一つの整数を返す関数`f`を受け取ります。

`Set`は任意の整数$k$が集合に含まれるかどうかを判定する`includes`というメソッドを持ちます。

`includes` は二重のforループによる単純な探索です。探索中の値が$k$を超えたら処理を止めるため、`f`は、$i, j$ いずれに対しても単調増加である必要があります（逆に、それさえ満たせば正しく動くルーチンになっています）。

### 効率化

上のやり方では一つの整数に対して5回判定処理が実行されるため、非常に無駄です。

よって、一度計算した値を使い回す（キャッシュする）ことにしましょう。

次のような高階関数[^1] `memoize`を定義します。


```js
function memoize(f) {
  const cache = [];
  return function(k) {
    if (k >= cache.length) {
      for (let i = cache.length; i <= k; i += 1) {
        cache.push(f(i));
      }
    }
    return cache[k];
  };
}
```

今回は昇順に探索されることがわかっているので、計算済みの値より大きな数値がきたらその間の計算を一気に実行するように実装しています。

これを次のようにして `Set` に組み込めば完成です。

```js
class Set {
  constructor(f) {
    this.f = f;
    this.includes = memoize(this.includes.bind(this));
  }
}
```

`.bind(this)`は関数が実行される際の`this`が変わらないようにするためのものです。ここではそれ以上の解説はしません。

[^1]: 関数を受け取って関数を返す関数。

Appendix. 証明
----

一応。このアルゴリズムの正しさの雑な証明を記しておきます。

1) このような$k$があった場合、$k+5$以上の全ての数が表されることを示す。

まず

$$
\forall {k^\prime}\gt k+5;\exists j \in {\mathbb Z}\,|\,{k^\prime}=k_i+5j\ (i = 1..5)
$$

である。

これを条件2を用いて展開すると

$$
{k^\prime}=k_i+5j=5(n+j)+8m
$$

となる。

ゆえに、${k^\prime} \in S$である。


2) このような$k$がなかった場合、解が存在しないことを示す。

対偶の命題「解が存在した場合は必ず該当の条件を満たす」ことを示せればよい。
これは自明である。
Vagrant環境にFTP転送ツールでアクセスする

### Vagrant環境にFTP転送ツールでアクセスする

ターミナルでVagrantfileを配置している階層に移動し

    $ vagrant ssh-config

すると下記のような文字列が出力される

    HostName 127.0.0.1
      User vagrant
      Port 2222
      UserKnownHostsFile /dev/null
      StrictHostKeyChecking no
      PasswordAuthentication no
      IdentityFile /Users/mac/.vagrant.d/boxes/CentOS7_local/0/virtualbox/vagrant_private_key
      IdentitiesOnly yes
      LogLevel FATAL


上記の場合
プロトコル SFTP
サーバ 127.0.0.1
ユーザ名 vagrant
ポート 2222

パスワードをパスで指定。
macの場合 Command + Shift + G
      
      /Users/mac/.vagrant.d/boxes/CentOS7_local/0/virtualbox/vagrant_private_key 
      
これでアクセスできた。
HerokuのIPアドレス

https://help.heroku.com/JS13Y78I/i-need-to-whitelist-heroku-dynos-what-are-ip-address-ranges-in-use-at-heroku

- `heroku info`でRegionを調べる
    - 例えば以下のように表示される

```
Region:         us
```

- `heroku regions --json`でHerokuの各Regionの詳細を表示し、name欄が上記のRegionである要素を探す
    - 例えば「us」であれば以下

```
  {
    "country": "United States",
    "created_at": "2012-11-21T20:44:16Z",
    "description": "United States",
    "id": "59accabd-516d-4f0e-83e6-6e3757701145",
    "locale": "Virginia",
    "name": "us",
    "private_capable": false,
    "provider": {
      "name": "amazon-web-services",
      "region": "us-east-1"
    },
    "updated_at": "2016-08-09T22:03:28Z"
  },
```

- 当該要素のproviderのregionの値を取得する
    - 上記例だと「us-east-1」

- ブラウザで https://ip-ranges.amazonaws.com/ip-ranges.json をダウンロードし、その中からregionが対象regionかつserviceがAMAZONである要素群全てのip_prefix/ipv6_prefixが「ありえるIPアドレス範囲」となる
    - 例えば「us-east-1」だとip_prefixだけで140個くらいありそう
    - しかも変更可能性もある
    - 詳細は https://docs.aws.amazon.com/ja_jp/general/latest/gr/aws-ip-ranges.html#subscribe-notifications

```
    {
      "ip_prefix": "18.208.0.0/13",
      "region": "us-east-1",
      "service": "AMAZON"
    },
 ```

もしもWhitelistに登録するためにHerokuのIPアドレスを知りたいのなら、「多数」「変更可能性あり」なので非現実的、どうしてもと言うなら https://devcenter.heroku.com/articles/quotaguardstatic 等のInbound IP Address固定アドオンを検討すべき
ちなみにQuotaGuard Staticは「a62b1d0b4983db763450411fd393b3ce-eu-west-1.getstatica.com」等の覚えにくいドメインのURLを許容するか、それが嫌ならカスタムドメインを適用する必要あり
Windows10でディスプレイの明るさ調整ができないときの対処法


## 対象とする読者

なぜか 設定→システム→ディスプレイ→明るさ調整　の表示がない人
（根本的な解決にはなってはいないので「とりあえず明るくor暗くできたらいい」人向け。）

## 対処法

以下の手順をお試しください。

1. デスクトップの何もない画面で右クリック
1. インテルグラフィックスの設定を選択
![intel.png](https://qiita-image-store.s3.amazonaws.com/0/351891/9d562ba0-a51b-5ced-cbb9-32df797bf2d1.png)

1. ディスプレイを選択
1. 色設定を選択

明るさを調整できます。やった。
javascriptの基本

:point_up_tone3:　javascriptとは・・・・

Webページを操作するためのプログラミング言語で、WEBサイト上のHTML要素を取得したり、要素を操作したりすることができます。
HTMLやCSSをリアルタイムに変更も可能です。

-----------------------------------

＊導入
index.htmlに記入する場合

```html
<body>
 <script>
  window.alert("おはよう");
 </script>
</body>
```

↑
こんなふうに`<script></script>`で囲ってあげましょう！

メソッドの紹介

|メソッド|説明|
|---|---|
|◎window.alert(" ")|アラートを表示する|
|◎console.log(" ")|ブラウザのコンソールとよばれるところに表示する|

＊導入２
javascriptを外部ファイルから読み込む場合
①拡張子.jsファイルを作成
 （test.js)
②HTMLの

```html
<head> 
</head>
```
に外部ファイルを読み込むコードを書く

```html
<script src="読み込みたいJavaScriptファイルのパス"></script>
```
今回は、htmlファイルと同じ階層におくので,

```html
<script src="test.js"></script>
```
これで完成。
あとは、jsファイルにコードを書いていきます。
package.jsonを最新Ver.にする 




忘れるのでメモ


package.jsonを最新Ver.にする。


```shell
yarn upgrade --latest
```

または、

```shell
npm install -g npm-check-updates
```


### before

```js
  "dependencies": {
    "axios": "^0.18.0",
    "connected-react-router": "^6.0.0",
    "react": "^16.6.3",
    "react-app-polyfill": "0.1.3",
    "react-dom": "^16.6.3",
    "react-redux": "^6.0.0",
    "react-router": "^4.3.1",
    "react-router-dom": "^4.3.1",
    "history": "^4.7.2",
    "react-scripts": "2.1.1",
    "redux": "^4.0.1",
    "redux-actions": "2.6.4",
    "redux-logger": "^3.0.6",
    "redux-saga": "1.0.0-beta.3",
    "semantic-ui-css": "^2.4.1",
    "semantic-ui-react": "^0.83.0"
  },
```



### after

```js
  "dependencies": {
    "axios": "^0.18.0",
    "connected-react-router": "^6.2.2",
    "history": "^4.7.2",
    "react": "^16.7.0",
    "react-app-polyfill": "0.2.0",
    "react-dom": "^16.7.0",
    "react-redux": "^6.0.0",
    "react-router": "^4.3.1",
    "react-router-dom": "^4.3.1",
    "react-scripts": "2.1.3",
    "redux": "^4.0.1",
    "redux-actions": "2.6.4",
    "redux-logger": "^3.0.6",
    "redux-saga": "1.0.0",
    "semantic-ui-css": "^2.4.1",
    "semantic-ui-react": "^0.84.0"
  },
```
既存のNuxtプロジェクトのマイナーバージョンアップ方法

Nuxtに限った話ではないんですが、初めての作業だったので備忘録代わりに。

手順は以下の見出しの3ステップ。

##1. `package.json`の`"nuxt"`のバージョン指定を変更する

### before

```json:package.json
    "nuxt": "2.3.7"
```

### after

```json:package.json
    "nuxt": "2.4.0"
```

##2. `npm install` する

##3. `nuxt` で起動してバージョン確認

```shell
   ╭─────────────────────────────────────────────╮
   │                                             │
   │   Nuxt.js v2.4.0                            │
   │   Running in development mode (universal)   │
   │   Memory usage: 173 MB (RSS: 365 MB)        │
   │                                             │
   │   Listening on: http://localhost:3000       │
   │                                             │
   ╰─────────────────────────────────────────────╯
```

afterで指定したバージョンになっていれば成功。
Twitterの新UI用に自作Bookmarklet作りました

TwitterのUIが新しくなりました！
そしたら、今まで使っていた見ていたサイトをTwitterに投稿するBookmarkletが動かなくなっていたので、修正しました。


```javascript
javascript:var%20d=document,w=window,l=location,e=encodeURIComponent,f='http://twitter.com/compose/tweet/?text=+%5BB!%5D+%22'+e(d.title)+'%22+'+e(l.href);if(!w.open(f,'Twitter%20bookmark'))l.href=f;
```

URLが

```
http://twitter.com/home/?status=***
```

ではなくて

```
http://twitter.com/compose/tweet/?text=***
```

に変わったんですね
WindowsのXamppで任意のディレクトリをルートに設定する

#Xamppの設定

ローカル環境でアクセスができるようにしたくてXamppの設定をしようとしたものの、`403 Forbidden` エラーが出て手こずったのでメモ。


### httpd-vhosts.conf
`C:\xampp\apache\conf\extra\httpd-vhosts.conf` を開き、

```
<VirtualHost *:8081>
    DocumentRoot "C:\Users\akr\path\to\directory"
    <Directory "C:\Users\akr\path\to\directory">
        Require all granted
    </Directory>
</VirtualHost>
```
のように書く。

## ポイント
`Directory` タグと `Require all granted` で全てアクセス許可にする設定をしてあげると、エラーにならない。

##参考
https://stackoverflow.com/a/12895792
HTMLをPDFに変換する方法

PDFをHTMLに変換することは、ほとんどすべての個人またはグループとしてPDFファイルを安全に配布または共有するための最良の形式です。それからHTMLをPDFに簡単に変換して安全にするべきです。この記事では、HTMLのURLをPDFとHTMLの文字列をPDFに変換する方法を示します。

使用ツール： [Spire.PDF for .NET 5.1](https://www.e-iceblue.com/Download/download-pdf-for-net-now.html)

HTML URLをPDFまで:

```
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using Spire.Pdf;
using System.Drawing;
using Spire.Pdf.Widget;
using Spire.Pdf.Fields;
using System.Threading;
using Spire.Pdf.HtmlConverter;

namespace PDF
{
    class Program
    {
        static void Main(string[] args)
        {
            //作成するPdfDocument実例
            PdfDocument doc = new PdfDocument();
            //ページのレイアウトを設定      
            PdfPageSettings setting = new PdfPageSettings();
            setting.Size = new SizeF(1000,1000);
            setting.Margins = new Spire.Pdf.Graphics.PdfMargins(20);
            PdfHtmlLayoutFormat htmlLayoutFormat = new PdfHtmlLayoutFormat();
            htmlLayoutFormat.IsWaiting = true;
            //HTMLのURL
            String url = "https://www.wikipedia.org/";
            Thread thread = new Thread(() =>
            { doc.LoadFromHTML(url, false, false, false, setting,htmlLayoutFormat); });
            thread.SetApartmentState(ApartmentState.STA);
            thread.Start();
            thread.Join();
            //PDFファイルを保存します
            doc.SaveToFile("output-wiki.pdf");
        }
    }
}
```
![convert-HTML-into-PDF.png](https://qiita-image-store.s3.amazonaws.com/0/278784/37ac80d9-bbff-a412-fe69-3fe6846cfd5e.png)

HTML文字列をPDFに変換する

```
//作成するPdfDocument実例
PdfDocument pdf = new PdfDocument();
//ページのレイアウトを設定      
PdfHtmlLayoutFormat htmlLayoutFormat = new PdfHtmlLayoutFormat();
//ロードを待っていない
htmlLayoutFormat.IsWaiting = false;
PdfPageSettings setting = new PdfPageSettings();
setting.Size = PdfPageSize.A4;
// HTMLコードをロードする
string htmlCode = File.ReadAllText("C:\\..\\e-iceblue.html");

    Thread thread = new Thread(() =>
    { pdf.LoadFromHTML(htmlCode, false, setting, htmlLayoutFormat); });
    thread.SetApartmentState(ApartmentState.STA);
    thread.Start();
thread.Join();
// PDFファイルを保存します
pdf.SaveToFile("sample.pdf");
```
![HTML string to PDF.png](https://qiita-image-store.s3.amazonaws.com/0/278784/4452d7d8-b398-02ad-2b3c-d8967bad5342.png)
Rubyのクラスとインスタンスで特定のメソッドが存在するかどうか調べる方法

前提条件
Ruby: 2.5.1

## クラスに対してメソッドの存在を確認する

method_defined?を使う

```
String.method_defined?(:to_i)
=> true

# to_iメソッドあることがわかるので実行してみる
"1".to_i
=> 1
```

## インスタンスに対してメソッドが存在するか

respond_to?を使う

```
"string".respond_to?(:to_a)
=> false

#　to_aメソッドがないので実行してみるとNoMethodErrorエラーになる
```
SSH 秘密鍵作成コマンド


毎回、ググってばかりなので。自分の Qiita に保存しておく。

デフォルト

```
$ ssh-keygen -t rsa -b 4096 -C "email@example.com"
```

保存先が違う場合

```
$ ssh-keygen -t rsa -b 4096 -C "email@example.com" -f /var/lib/nginx
```

参考
https://qiita.com/suthio/items/2760e4cff0e185fe2db9
https://qiita.com/reflet/items/0c338df07d9f6c6ef776

## クレジット

この記事が役に立ったら、「 **CMS は concrete5 が一番**」と頭の中で10回唱えてみてください〜。
今日の記録4 ：主にjavaのenum

#java

##配列の生成と同時に初期化する方法

例

```java
table.putCard(new Card[] {card});
```

##変数について

初期化していないint型の変数をフィールドで宣言して、
++をしてもコンパイルエラーにならない

##rangeの範囲
range(0,**10**)とした場合は0から**9**まで。rangeは以上未満が基本
```java
//0から９までの要素をもつ配列
int[] arr=IntStream.range(0,10).toArray();
```

##toArrayのClassCastExceptionが発生
参考サイト:http://www.dab.hi-ho.ne.jp/sasa/biboroku/java/toArray.html
toArrayの第一引数に変換先の配列を入れないとClassCastExceptionが発生する
例

```java
return (Card[]) putCards.toArray(new Card[] {});

//下記コードはClassCastExceptionが発生する
//return (Card[]) putCards.toArray();
```

##Enum
###Enumの仕様
enum宣言で仕様した型はjava.lang.Enumクラスの継承型。
enumは内部的にクラスであるが、newはできない。その代わり、enum宣言ないに列挙したenum定数が暗黙にオブジェクトを生成する。
当然利用側は参照渡しで受け取る。

```java
public enum Gender {
//暗黙に生成されるstaticなオブジェクト
  MAN,
  WOMAN,
  OTHER;
}
```

enumはクラスなため、コンストラクタやフィールド、メソッドを追加できる

```java
public enum Gender {
  MAN("Man",0),
  WOMAN("Woman",1),
  OTHER("Other", 2);

  private final String nameForDisp;
  private final int valueForDb;

  private Gender(String nameForDisp, int valueForDb) {
    this.nameForDisp=nameForDisp;
    this.valueForDb=valueForDb;
  }

  @Override
  public String toString() {
    return this.nameForDisp;
  }

  public int toDatabaseValue() {
    return this.valueForDb;
  }

}
```

##enumの要素数を取得したい

```java

Gender.values().length;
```
scikit-learnで機械学習の入口に立ってみた。

# 概要
- クラスチェンジするためには、下記を実行せよとお告げがあった。
 - 現在の知識(pandas,numpy,matplotlib)の知識を深めよ。
 - scikit-learnを学べ。
 - コミュニケーション能力は必要だ。

- 実行しますか。
-> はい
   いいえ

# scikit-learnのtutorial
## import
* [Pythonではじめる機械学習](https://www.oreilly.co.jp/books/9784873117980/)を参考に行った。　　
- scikit-learnのirisのデータセットを用いて、k近傍法でirisの種別を分ける。

```python:import

import numpy as np
import pandas as pd
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
iris_dataset = load_iris()
import seaborn as sns

%matplotlib inline
```
## データの内容
- irisのデータセットでは、下記のようにデータが含まれています。中でも、dataはfeature_namesのように4つのパーツのデータが入っています。
- irisがどの種別に属するかは、targetで確認することができます。(target_namesで名称も確認できます。)

```python
iris_dataset.keys()
>> dict_keys(['data', 'target', 'target_names', 'DESCR', 'feature_names', 'filename'])

iris_dataset.feature_names
>> ['sepal length (cm)',
 'sepal width (cm)',
 'petal length (cm)',
 'petal width (cm)']

iris_dataset.target
>>array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
       0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
       1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
       1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
       2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
       2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2])

iris_dataset.target_names
>> array(['setosa', 'versicolor', 'virginica'], dtype='<U10')

```

## テストデータと訓練用データ

- 下記でテストデータと訓練用データを分割します。デフォルトで全データの25%がテストデータとなります。
- random_state=0としているのは、再現性を持たせるために使用しています。

```python:train_test_split
X_train,X_test,y_train,y_test = train_test_split(iris_dataset.data,
                                                 iris_dataset.target,
                                                 random_state=0)
```

## データの確認(可視化)

- データフレームにして、可視化します。
- 書籍では、pd.scatter_matrixを使ってた気がしますが、warningが出た気がしたので、下記のようにしました。
    - warningは、pd.plotting.scatter_matrixで回避できますがseabornのほうが~~楽だったので手を抜きました~~簡潔に実装できます。
- こうしてみると、setosa:0は他の２種と明確に別れており、versicolor:1とvirginica:2もなんとか分離できそうな感じがします。

```python:dataframe
df_iris_train = pd.DataFrame(X_train,columns=iris_dataset.feature_names)
df_iris_train = pd.concat([df_iris_train,pd.DataFrame(y_train,columns=['target'])],axis=1)

sns.pairplot(df_iris_train,hue='target')
```
![googleColaboratry.png](https://qiita-image-store.s3.amazonaws.com/0/148213/55a4b1ed-68a0-7318-2b5c-b6c2f3dd4a3d.png)

## k近傍法
- n_neighborsはデフォルトで5ですが、1にしました。
    - n_neighborsが大きいとノイズに強いそうですが、精度が落ちそうなため1にしました。(前段の可視化でノイズが少なそうだと判断したため）

```python:KNeighborsClassifier
knn = KNeighborsClassifier(n_neighbors=1)
knn.fit(X_train,y_train)
```

## 結果
- 精度は97%となり、かなり高精度で予測できていることがわかります。
    - 元々きれいなデータなのでこれくらいは当然なのでしょうか？

```python:score
knn.score(X_test,y_test)
>> 0.9736842105263158
```

## まとめ
- matplotlib使うの忘れてる・・・
- pairplot便利すぎわろた
- 機械学習の入口に立てた気はします。
- 理論を理解してしないと、変数をいじれないのがもどかしいので勉強します。
- 次のキャリアパスに向けて、より高みを目指す。
HerokuのDynoの日次再起動の時刻を指定する

Herokuのdynoは1日1回再起動する https://qiita.com/pilot/items/d42526c227ea322a2aa1 の続き

SchedulerアドオンでHeroku CLIを叩いて手動再起動する

1. Heroku CLI用のBuild Packを追加
    1. `heroku buildpacks:add --index 1 https://github.com/heroku/heroku-buildpack-cli`
1. Heroku CLI用の長期間認証を作成
    1. `heroku authorizations:create --description "for ＜アプリケーション名＞ HEROKU_API_KEY"`
    ★--descriptionでメモを付けておくと後でheroku authorizationsで確認できる
    ★後述するが実運用ではいわゆるシステムアカウントで作成するのがおすすめ
    1. 結果の「Token」欄の値を使う
1. 環境変数に設定
    1. `heroku config:set HEROKU_API_KEY=＜長期間認証Token＞`
    ★環境変数を設定すると起動中のアプリが再起動するので注意★
1. アプリをデプロイ (git push)
    1. ビルドログに「Heroku CLI installation done」が表示される
1. Schedulerアドオン導入
    1. `heroku addons:create scheduler:standard`
    1.  無料、Very Rareに動かない/重複実行あり https://devcenter.heroku.com/articles/scheduler
1. スケジュール設定
    1. `heroku addons:open scheduler`
        1. ブラウザが起動してスケジュール設定画面が表示される
    1. 例えば「/app/.heroku/bin/heroku restart -a ＜アプリ名＞ web.1」「Standard 1X」「Daily」「20:00 UTC」を設定
        1. web.1とweb.2で時刻をずらす等
        2. 「20:00 UTC」は日本時間の午前5時

Schedulerは`heroku run bash`と同じくOne Off Dynoで実行されるので「長時間使用で無料枠を超える」等が起きないように留意のこと

再起動処理中もなるべくアプリを使えるようにするためにPrebootも設定しておく
`heroku features:enable preboot`
Prebootについて https://devcenter.heroku.com/articles/preboot
設定していないと「Dynoは立ち上がったがアプリの準備はまだできていない」状態でリクエストが振られ、エラーになることがある

長期間認証は「発行した個人アカウント」に紐づくため、その人が退職・チーム離脱・パスワード変更等を行うとキーが無効になるため、運用上は「人に紐づかない運用専用アカウント(いわゆるシステムアカウント)」での発行が必要
当該アカウントは当該アプリの再起動を行う権限(少なくともoperate権限)が必要なので、`heroku access:add ＜対象アカウント(メアド)＞ --permissions=view,deploy,operate -a ＜アプリ名＞`で権限を付与しておく
当該アプリに対する権限リストは`heroku access -a ＜アプリ名＞`で確認できる

以上
Swift アプリのバージョン比較(Swift5.3対応)

新しいバージョンを確認するためのダイアログ機能を出すなどの処理を追加するにあたって、「Swift バージョン比較」で検索した時に見つかる記事が正しく動作しないので、動作するものを作りました。

> 2020-11-02 追記
> 用途が「古いバージョンから新しいバージョンを比較する」という限定的なものだったので間違ったコードが載っていました。
> components関数が消えていたのでメンテナンスも兼ねてアップデートしています。



- ``1.0``と``1.0.1```
    - ``1.0.1``の方が新しい
- ``10``と``9``
    - ``10``の方が新しい

条件は概ねこのような形ですが、NSComparisonResultを使った形だとうまく動作しません。

```swift
print("11".compare("10") == .orderedDescending)
-> true (ok)

print("9".compare("8") == .orderedDescending)
-> true (ok)

print("10".compare("9") == .orderedDescending)
-> false (ng)
```

### 解決策

正しくバージョンを比較するには「.」で分割し、先頭から順に数値でチェックする必要があります。

```swift
extension String {

	func compareVersionText(_ target : String) -> Bool{

		let v1 = self.split(separator: ".")
		let v2 = target.split(separator: ".")

		//個数が揃わない場合もあるので、チェックする数は統一する
		let count = max(v1.count, v2.count)

		for i in 0..<count {

			let vv1 = (v1.count > i) ? v1[i] : "0"
			let vv2 = (v2.count > i) ? v2[i] : "0"

			//数値でチェックする(数値でチェックできないものは0として扱う）
			let vv1num = Int(vv1) ?? 0
			let vv2num = Int(vv2) ?? 0

			//vv2の方が大きい時点で処理を中断
			if vv1num < vv2num {
				return true
			}
			
			//vv1の方が大きい時点で処理を中断
			if vv1num > vv2num {
				return false
			}
		}

		//最後まで進んだ場合はfalse（バージョンが一致している）
		return false
	}

}
```


## 使い方

```swift
if "1.0".compareVersionText("1.0.1") {
   print("it's new version")
}
```


## 検証用コード

```swift
func testPrint(_ expect : Bool, _ target : Bool){
	let formated = String(
		format: "%@ %@",
		arguments: [
			(expect) ? "true" : "false",
			(target) ? "true" : "false"
		]
	)
	print(formated)
}

testPrint(true, "1.0".compareVersionText("1.0.1"))
testPrint(true, "1.0".compareVersionText("1.1"))
testPrint(true, "1.0.0".compareVersionText("1.0.1"))
testPrint(true, "1.0.0".compareVersionText("1.1.1"))
testPrint(true, "1.0.0".compareVersionText("10.0.0"))
testPrint(true, "8".compareVersionText("10"))
testPrint(true, "8".compareVersionText("10.1"))
testPrint(true, "1.9.0".compareVersionText("1.10.0"))

//先頭がお大きいバージョン
testPrint(true, "1.10.0".compareVersionText("2.0.0"))
testPrint(false, "2.0.0".compareVersionText("1.10.0"))

//同じバージョン
testPrint(false, "1.0".compareVersionText("1.0"))

//一桁テスト
testPrint(false, "10".compareVersionText("9"))
testPrint(false, "100".compareVersionText("99"))
```

■ 結果

```
true true
true true
true true
true true
true true
true true
true true
true true
true true
false false
false false
false false
false false
```


----

参考 https://qiita.com/kazuman519/items/fd142219630f758d8fcf
UIScrollViewのタップの遅延をなくす

サブクラスを作る

## 説明
`delaysContentTouches`
遅延させるか？
> A Boolean value that determines whether the scroll view delays the handling of touch-down gestures

`touchesShouldCancel(in view: UIView) -> Bool`
ドラッグしだしたらキャンセルするか？
> Returns whether to cancel touches related to the content subview and start dragging.

```swift
class NoTapDelayScrollView: UIScrollView {

    override init(frame: CGRect) {
        super.init(frame: frame)
        delaysContentTouches = false
    }
    
    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        delaysContentTouches = false
    }
    
    override func touchesShouldCancel(in view: UIView) -> Bool {
        return true
    }
}
```
ReactNativeで、何やっても同じエラーが出てしまう場合(普通に用意されている機能を使うだけだった)

##環境
react-native: 0.58.1

## 状況
とあるエラーが出たんですけど、いくらプログラム変えても同じエラーが出てしまう状況となった。

## 解決方法1(解決方法2が最適な方法でした。。。笑)
~~「react-native run-ios」でプロジェクトをios用に実行した時に、
このように新たなターミナルが立ち上がります。~~
<img width="728" alt="スクリーンショット 2019-01-30 15.48.23.png" src="https://qiita-image-store.s3.amazonaws.com/0/179803/a549f17a-7c23-9da4-3e08-61915c273d37.png">

~~なので、
1.これをCtrl+Cでプロセスを完了させる。
2.次に、このターミナルを閉じる。
これで、プログラムの変更が反映されるようになって、無事にエラーが消えました。~~

## 解決方法2
追記です。。。(わざわざビルドし直す必要はなかったようです。)
[Command]+[R]で画面が更新できます。
あるいは、[Enable Live Reload]で自動更新もできました。


## 感想
ReactNativeがせっかく便利な機能を用意してくれているのに。。。何やってんだ僕は(涙)
CodeCommit＋CodeDeploy＋CodePiplineでデプロイを自動化

##　デプロイの自動化
[CodeDeployを使用してのデプロイ](https://qiita.com/tailix/items/124bb7a17c312f0ac45b)をやってみましたが、CodeDeploy単体では手作業でコードのアップやデプロイ実行をしなくてはいけません。
手間とミスをなくす為、今回は CodeCommit＋CodeDeploy＋CodePipline を使用してデプロイを自動化してみました。

## 設定

### CodeCommit
1. AWSコンソール のCodeCommitからリポジトリを作成
2. リポジトリにアクセスするための認証情報作成。 ※「AWSコンソール → IAM → ユーザー → ユーザー選択 → 認証情報」
3. 認証方法はsshとhttpsの2パターン、使用する方の認証を設定する。

### CodeDeploy
1. アプリケーション作成とデプロイグループの作成を行います。  
[CodeDeploy設定例](https://qiita.com/tailix/items/124bb7a17c312f0ac45b) ※デプロイはCodePipelineで行うので、アプリケーションとデプロイグループの作成まで行います

### CodePipeline
#### AWSコンソール CodePipelineからパイプラインを作成
1. パイプラインの設定の選択
![2019-01-30_15h08_18.png](https://qiita-image-store.s3.amazonaws.com/0/262751/73177b46-6b82-bfe1-e734-7f939c84b3c7.png)
  - パイプライン名：適当にhoge-stg-pipelineとか
  - サービスロール：新規なら新しく作る ※権限は自動で付与されるよう
  - アーティファクトストア：用意が無ければ「デフォルトの場所」で問題無し ※デプロイ時にコードが格納される場所  

2. ソースステージの追加
![2019-01-30_15h08_39.png](https://qiita-image-store.s3.amazonaws.com/0/262751/082359b1-89e2-345d-aa06-8ec5a89b2b23.png)
  - ソースプロバイダ：今回は「AWS CodeCommit」を使用 ※他にECR,S3,GitHub
  - リポジトリ名：先に作成したリポジトリを選択
  - ブランチ名：先に作成したブランチのどれかを指定(releaseやmasterなど) ※指定したブランチにプッシュが行われるとデプロイが起動するようになる
  - 変更検出オプション：Amazone Cloud Watch Events (イベント起動なので推奨)  

3. ビルド：今回は使用しないのでスキップ
![2019-01-30_15h09_45.png](https://qiita-image-store.s3.amazonaws.com/0/262751/06b804b7-613a-cf6b-9e9d-76e059f00b4b.png)

4. デプロイステージの追加
![2019-01-30_15h10_30.png](https://qiita-image-store.s3.amazonaws.com/0/262751/f6e610bd-b888-0e8f-575d-8c1a9f4e179a.png)
  - デプロイプロバイダ：今回はCodeDeployを指定
  - アプリケーション名：CodeDeployで作成したアプリケーションを指定
  - デプロイグループ：CodeDeployで作成したデプロイグループを指定  

5. パイプラインの作成
![2019-01-30_15h11_03.png](https://qiita-image-store.s3.amazonaws.com/0/262751/76725ffc-b8fa-fa49-3c10-7450ea26cd2f.png)

## デプロイ
CodePipelineの設定が完了したら、設定時に指定したブランチにプッシュを行ってみます。
![2019-01-30_15h14_47.png](https://qiita-image-store.s3.amazonaws.com/0/262751/20e2e635-d33d-a9a4-d164-53994613ff57.png)
![2019-01-30_15h15_23.png](https://qiita-image-store.s3.amazonaws.com/0/262751/ffdb678b-8e5c-42c4-5514-98c05d4fdb90.png)
プッシュを検知し自動でデプロイを実行してくれるようになりました。
ChainerのTrainer ExtensionでEpochを取得したい

# やりたいこと

以下のように, Epoch毎に呼び出されるChainerのTrainer Extensionで, その時のEpochを取得したい.


```python
@training.make_extension(trigger=(10, 'epoch'))
def print_epoch(trainer):
    print(f"Epoch : ")

trainer.extend(print_epoch)
```


# 解決
`trainer.updater.epoch`を参照する.

```python
@training.make_extension(trigger=(10, 'epoch'))
def print_epoch(trainer):
    print(f"Epoch : {trainer.updater.epoch}")

trainer.extend(print_epoch)
```
homebrewで使われていないformulaを整理する

## 経緯

homebrew を使っていると、必要のない formula がたまってきます。
`brew upgrade` に時間がかかったり、ディスク容量を圧迫してくるので、不要なものを整理します。

## 依存してないformulaを絞る

`brew uses` で、そのformulaを利用しているformula を表示できます[1]

```bash:bash
for package in $(brew list); do
  echo [$package]; 
  brew uses --installed $package
done
```

```txt:出力結果
[ansible]
[apr]
apr-util
[apr-util]
[aspell]
[autoconf]
automake             node-build           nodenv               pyenv                ruby-build
...
```

わかりやすくするために、依存がないformulaのみリストアップします

```bash:bash
for package in $(brew list); do
  echo -n $package: $(brew uses --installed $package | wc -l) | grep " 0"
done
```

```txt:出力結果
ansible:        0
awscli:        0
bash:        0
cert:        0
composer:        0
ctags:        0
curl:        0
direnv:        0
fish:        0
gawk:        0
...
```

依存関係がないformulaのうち、不要なものをアンインストールします。

[homebrew-mtree](https://github.com/beeftornado/homebrew-rmtree) をつかって依存関係も一緒にアンインストールします。

```bash:bash
rmtree <不要なformula>
```

ついでに、複数のバージョンをインストールしているformulaのうち、最新のものを残して削除します。
（ディスク容量の節約ができます。）

```bash
brew cleanup
```

## 参考

[1] [Homebrew の依存関係を表示する方法](https://yu8mada.com/2018/06/08/how-to-list-homebrew-dependencies/)
[2] [homebrew-mtree](https://github.com/beeftornado/homebrew-rmtree)
Arduino SRAMメモリオーバーを判定して見ました。

#概要
Arduino UNOを使用したセンサーに改良を加えていると、ある時から正常に動作しなくなり原因を調べたところ、SRAMメモリ不足が原因ということが分かりました。
丁度いい機会なので、SRAMメモリについて調べ、今後、同様の問題を早期に発見できるように対策を考えたいと思います。

先に結論を伝えると、空きメモリ容量が残っていても文字が追加できなくなることが分かりましたので、文字列が加算できなくなったタイミングでオーバーフロー判定とすることにしました。

#環境
・Arduino UNO

仕様より：https://www.switch-science.com/catalog/789/
![image.png](https://qiita-image-store.s3.amazonaws.com/0/191429/d84c36b3-75df-4a57-7c09-52a2e123ea36.png)

→SRAM:2KB(2048Byte)あることが分かります。

・書き込み時のメッセージと仕様が一致していることを確認します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/191429/cbce4e6b-9941-bdfd-245f-25af2128c7e9.png)

#実行中の空きメモリ容量を調査
下記のサイトのfreeRamメソッドを使用し、空きメモリを調査します。
参考：https://playground.arduino.cc/Code/AvailableMemory

＜メソッドを追加した時の書き込みメッセージと空きメモリ出力結果＞
![image.png](https://qiita-image-store.s3.amazonaws.com/0/191429/fc7103a1-5585-f79e-e58e-d57ee68c7d46.png)

```C++:memory.ino
#define SERIAL_BAUD 9600

void setup() {
  Serial.begin(SERIAL_BAUD);

  dispMemory();
}

void loop() {
  
}

void dispMemory(){
  Serial.print(F("Free memory=")); 
  Serial.print(freeRam(), DEC);
  Serial.println(F("[bytes]"));
}

int freeRam () {
  extern int __heap_start, *__brkval;
  int v;
  return (int) &v - (__brkval == 0 ? (int) &__heap_start : (int) __brkval);
}
```

#メモリオーバー時の動作を確認
メンバ変数に文字を結合していき、メモリオーバーしたときの動作を確認します。

```C++:memory2.ino
#define SERIAL_BAUD 9600

String m_buf = "a";

void setup() {
  Serial.begin(SERIAL_BAUD);

  dispMemory();
}

void loop() {
  m_buf.concat(F("a"));
  Serial.print(F("String Length=")); 
  Serial.println(m_buf.length()); 
  
  dispMemory();
}

void dispMemory(){
  Serial.print(F("Free memory=")); 
  Serial.print(freeRam(), DEC);
  Serial.println(F("[bytes]"));
}

int freeRam () {
  extern int __heap_start, *__brkval;
  int v;
  return (int) &v - (__brkval == 0 ? (int) &__heap_start : (int) __brkval);
}

```

・書き込み時のメッセージ：
![image.png](https://qiita-image-store.s3.amazonaws.com/0/191429/5899af83-2d23-c229-8753-8a5c7232fcd8.png)

・実行開始時の出力結果：
![image.png](https://qiita-image-store.s3.amazonaws.com/0/191429/378652f5-e580-b442-2764-c89caa54d523.png)

・メモリオーバーフロー後の出力結果：　※同じ出力結果が続きます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/191429/c8f78b20-325d-935e-4259-15bc20ec1e15.png)

文字数が1687バイトを超えたところで、文字列の増加が止まっています。
そして特にエラーにはならず、問題なく動作し続けています。

空きメモリは、140バイトは残っている状態で、文字が追加できなくなっているので、freeRamの結果だけを見て処理が継続できるかの判断はできなさそうです。

#調査用メソッド作成
freeRamの結果を元に、オーバーフローを判定することは難しいようなので、今回は文字を加算した値が文字数として反映されているかどうかをチェックし、メモリオーバーフローが発生しているか確認するメソッドを作成しました。

```C++:
bool isMemory(){
  String s = F("");
  s.concat(F("a"));
  if(s.length() == 1){
    return true;
  }
  return false;
}
```

＜実行結果＞
![image.png](https://qiita-image-store.s3.amazonaws.com/0/191429/81556822-d8f9-f484-6028-6533acb9c0c3.png)

文字が1669文字で文字追加が出来なくなっており、その結果（false:0）が表示されています。

#まとめ
ArduinoMegaを使った開発が多かったため、ArduinoUnoでSRAMメモリ不足という問題になかなか気づくことが出来ず、時間を使ってしまいました。
今後は同様の問題が発生した場合も上記のコードを使えば素早く判断することが出来ると思います。
docker公式centos7イメージでgitのバージョンを2系にあげる方法

docker公式のcentosイメージで```yum install git```すると古いバージョン1.8系がインストールされます。
https://hub.docker.com/_/centos

gitバージョンを2系にあげる時にシンプルにdockerfile書ける方法があったので共有します！

```dockerfile
FROM centos:7

# git ver2系インストール
RUN yum install -y http://opensource.wandisco.com/centos/7/git/x86_64/wandisco-git-release-7-1.noarch.rpm
RUN yum install -y git
```
FlutterのsetStateとは？

#はじめに
FlutterのsetStateをFlutter起動時に作成されているカウントアプリを使い解説。

#ざっくりsetStateとは？
更新を伝えるメソッド

詳細は以下で説明。

#カウントアプリの機能
+ボタンを押すと現在0が表示されている部分が1ずつ増えていく
<img width="307" alt="スクリーンショット 2019-01-30 14.47.38.png" src="https://qiita-image-store.s3.amazonaws.com/0/289485/0b1602c1-bc98-88b5-a441-498f48a410d0.png">


#カウントアプリコード全体

```dart:main.dart
import 'package:flutter/material.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(

        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  MyHomePage({Key key, this.title}) : super(key: key);


  final String title;

  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  int _counter = 0;


  void _incrementCounter() {

    /////////////////////////
    setState(() {

      _counter++;
    });
    /////////////////////////

  }

  @override
  Widget build(BuildContext context) {

    return Scaffold(
      appBar: AppBar(

        title: Text(widget.title),
      ),
      body: Center(

        child: Column(

          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              'You have pushed the button this many times:',
            ),
            Text(
              '$_counter',
              style: Theme.of(context).textTheme.display1,
            ),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(

        //ボタンを押した時に呼ばれる処理。setStateが呼び出される。
        onPressed: _incrementCounter,

        tooltip: 'Increment',
        child: Icon(Icons.add),
      ), // This trailing comma makes auto-formatting nicer for build methods.
    );
  }
}
```

#解説



```dart:main.dart
 floatingActionButton: FloatingActionButton(

        //ボタンを押した時に呼ばれる処理。setStateが呼び出される。
        onPressed: _incrementCounter,

        tooltip: 'Increment',
        child: Icon(Icons.add),
      ),
```
ここのonPressed: incrementCounterは、+ボタンを押したら incrementCounterを呼び出すという処理。


```dart:main.dart
void _incrementCounter() {

    setState(() {

      _counter++;
    });

  }
```

そして呼び出されたincrementCounterは、setStateが組み込まれている。setStateの引数であるcounter++は、表示されている数字に1を足す処理。setStateではこの足したことをクラスに伝えるということをしている。この伝える処理があることで+ボタンを押すと表示される数字が増えている。setStateがないと+ボタンを押しても画面が更新されず表示されている数字が増えない。
semantic-ui を使って手軽にスタイリング

#概要
今回はsemantic-uiを使って手軽にスタイリングしていこうと思います。
前回書いた記事のアプリをスタイリングしていきます。

前回の記事
>https://qiita.com/ssnyarii/items/d9758d6ab573b9b53c4b

前回の記事のコードは全くスタイルを当てていないので、実際起動するとものすごく見づらいです。
#semantic-uiとは
semantic-uiとはcssフレームワークのことで、直接cssを書かなくても指定されたクラス名をつけてあげればスタイルがつくといった優れものです。

詳細
>https://semantic-ui.com/

#使ってみる
semantic-uiはcdnが提供されているのでそこのsemantic.min.cssをコピーして貼りましょう。

詳細
>https://cdnjs.com/libraries/semantic-ui

コード

```html:public/index.html
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/semantic-ui/2.4.1/semantic.min.css" />
```

あとは公式サイトのdocsを見ながら指定されているクラス名をつけていくだけです。

とりあえず全体の左右にいい感じの余白、そしてボタンをリッチにして中央寄せ、あとカメラのアイコンもつけちゃいましょう。
コードは一部抜粋です。少し直接css当ててます。

```javascript:src/App.js
render() {
    return(
      <div className="ui container" style={{marginTop: 20}}>
        <h2 className="ui center aligned icon header">
          <i className="circular camera retro icon"></i>
          <button 
            onClick={this.getPhotos}
            className="ui positive basic button"
          >
            get photos
          </button>
        </h2>
        <ImageList  images={this.state.images} />
      </div>
    );
  }
```

次に表示される写真一覧も見やすくしたいと思います。

現状ではサイズも大きくて見づらいのでサイズを小さくして、写真の間に線を入れて分断をわかりやすくして、写真の詳細のメッセージも入れるようにしましょう。こちらも少し直接css当ててます。

```javascript:src/ImageList.js
const ImageList = (props) => {
  const images = props.images.map(({id, urls, description}) => {
    return (
      <div key={id}>
        <img 
          className="ui middle aligned small image"
          src={urls.regular}
          alt={description}
        />
        <span style={{marginLeft: 10}}>{description}</span>
        <div className="ui divider"></div>
      </div>
    );
  });

  return (
    <div>
      {images}
    </div>
  );
}
```
以上で終了です。以下が完成画像になります。
get photosのボタンをクリックした後の画面です。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/286470/5c9d7c4a-bf1b-a300-c7a9-5ee7fdd668e3.png)

githubにコードあげています。
GetPhotos https://github.com/ssnyarii/GetPhotos

詳細のメッセージがある画像とnullになっている画像があったので空白の写真も多いと思いますが、そこは触れないでください笑

#まとめ
semantic-ui、個人的には大変好んでいます。種類も多いです！！
cssを書くのがあまり好きではないのでこういったフレームワークには助けられます笑
まだまだ触っていないデザインもたくさんあるので色々試していきます、、！！
brew cask search が使えなくなったので brew search を使います

# はじめに

HomebrewでIntelliJというソフトを検索しようと思って、

```bash
brew cask search intellij
```

とコマンドを叩いたら、こんなエラーがでました。

```bash
Homebrew Cask provides a friendly CLI workflow for the administration
of macOS applications distributed as binaries.

Commands:

   audit      verifies installability of Casks
   cat        dump raw source of the given Cask to the standard output
   create     creates the given Cask and opens it in an editor
   doctor     checks for configuration issues
   edit       edits the given Cask
   fetch      downloads remote application files to local cache
   home       opens the homepage of the given Cask
   info       displays information about the given Cask
   install    installs the given Cask
   list       with no args, lists installed Casks; given installed Casks, lists staged files
   outdated   list the outdated installed Casks
   reinstall  reinstalls the given Cask
   style      checks Cask style using RuboCop
   uninstall  uninstalls the given Cask
   upgrade    upgrades all outdated casks
   zap        zaps all files associated with the given Cask

See also "man brew-cask"
Error: help does not take arguments.
```

ようするに、「そんなコマンド知らないよ」ということみたいです。



# 原因と解決法

おかしいなと思って調べてみました。どうやら、 `brew cask search` は2018年9月30日に廃止になったそうです。代わりに `brew search` を使えばよいそうです。


試しに、

```bash
brew search intellij
```

と入力したら、無事に `intellij` の情報が表示されました。



# 参考サイト

調査にあたり、以下のサイトを参考にしました。

- [GitHub / homebrew-cask](https://github.com/sorin-ionescu/prezto/issues/1595)
- [Homebrew Community Discussion](https://discourse.brew.sh/t/warning-calling-brew-cask-search-is-deprecated/3036)



# 最後に

どうやら `brew cask --version` も同じみたいです。

こちらに情報が書かれていました。

[macOS High Sierraでbrew cask --versionしたらCalling `brew cask --version` is deprecated and will be disabled on 2018-10-31! Use `brew --version` instead.となったときの対応方法](https://qiita.com/ponsuke0531/items/2fdf48848206bc529c99)
いつのまにかExcelでswitch文が使えるようになってた

#前提
いつのまにかExcelでswitch文が使えるようになってた。

詳しくはOfficeサポート見てください！
https://support.office.com/ja-jp/article/switch-%E9%96%A2%E6%95%B0-47ab33c0-28ce-4530-8a45-d532ec4aa25e

#いつから使える？
Excel 2016（for Mac）以降

常に最新版を使わされるような下記のExcelはもちろん使えるようです。
for Office 365（for Mac）、for iPhone、for Android、etc.

#書式

```
=SWITCH(式,値1,結果1[,値2,結果2,…][,既定])
```

式の結果＝値1 の場合、結果1を返却
[式の結果＝値2 の場合、結果2を返却（以降、値127,結果127まで）]
[式の結果が上記に含まれない場合、既定を返却]


###例
`=SWITCH(A1,1,"壱",2,"弐",3,"参",4,"四",5,"五","その他")`

A1＝1なら"壱"
A1＝2なら"弐"
A1＝3なら"三"
A1＝4なら"四"
A1＝5なら"五"
上記以外なら"その他"
が返却される

#感想
~~家のExcelが2013だった~~
ちなみに同じタイミングで~~SWITCH関数より便利そうな~~IFS関数とかいう便利なのも増えてるので覚えておくと良さそう！
https://support.office.com/ja-jp/article/IFS-%E9%96%A2%E6%95%B0-36329a26-37b2-467c-972b-4a39bd951d45
[小ネタ]docker exec でリダイレクトを使いたい

いちいち `docker exec`で bashや sh を実行してしてファイルを書くのが面倒だったのでワンライナーでやりたいが、リダイレクト(>>)がうまくいかなかった時のメモ。

# 結論

以下のようにすれば良い

```bash
$docker exec -it 8c6757b43173 /bin/sh -c "echo 'hi' >> /var/log/access.log"
```

よく見ると[docker exec](https://docs.docker.com/engine/reference/commandline/exec/)のページにも以下の記載があった。

>COMMAND should be an executable, a chained or a quoted command will not work. Example: docker exec -ti my_container "echo a && echo b" will not work, but docker exec -ti my_container sh -c "echo a && echo b" will.

# 経緯

コンテナ内でファイルへの追記をする時に以下の手順を実施していたが、面倒だなと感じた。

```bash
$docker exec -it 8c6757b43173 /bin/sh
/ # echo 'hoge' >> /var/log/access.log
/ # exit
```

しかし以下は失敗

```bash
$docker exec -it 8c6757b43173 "echo 'hoge' >> /var/log/access.log"
OCI runtime exec failed: exec failed: container_linux.go:348: starting container process caused "exec: \"echo 'hoge' >> /var/log/access.log\": stat echo 'hoge' >> /var/log/access.log: no such file or directory": unknown
```

以下の記事を見つける。

[Docker exec - Write text to file in container](https://stackoverflow.com/questions/35703317/docker-exec-write-text-to-file-in-container)

>By using a double-quoted string to pass to bash -c, you ensure that the current shell performs string interpolation first, whereas the container's bash instance then sees the expanded result as a literal, as part of the embedded single-quoted string.

なるほど。
ということで先頭に記載の通り `-c` オプションを使ってみたらうまく出来た。
APIGateWay　「プロキシの統合」でエンドポイントに送る情報の変化

## はじめに

APIGateWayを使用しています。
APIGateWayからHTTPProxyエンドポイントを叩きます。

今回調べたのはリクエスト情報が「プロキシの統合」の有無で変化することです。

エンドポイント側に送りたい情報がある際に「プロキシの統合」をどう使えばいいのかがわかります。

## 結論

### プロキシの統合なし
| 名前       |       | 
|:-----------------|------------------:|
| Header             |              ✖️ |
| Query           |            ✖️|   
| Body           |            ○ |   

### プロキシの統合あり
| 名前       |       | 
|:-----------------|------------------:|
| Header             |              ○ |
| Query           |            ○ |   
| Body           |            ○ |   


プロキシを統合していなくてもBody情報はエンドポイントに送られてくることがわかりました。

## 「プロキシの統合」使わずにQuery,Headerを渡すには
APIGateWayメソッド内の**メソッドリクエスト**画面で設定可能です。

URL クエリ文字列パラメータ 
HTTP リクエストヘッダー
に許可したいクエリ、ヘッダー名を指定することで許可できる



## 終わりに
全部の情報を渡したい時➡︎「プロキシの統合」
必要な情報のみ➡︎個別で許可

のように使い分けていくのがいいんでしょうか、
PythonでExcelの新規ファイルを作成し、計算用ドリルを書き込む

下記のQiita記事のコメント参考用に。

[プログラミング未経験者がPython覚えて子ども用計算ドリルを作る](https://qiita.com/sotogawa/items/14ecbf090ae05a8eddb7)


```python

"""計算練習ドリルを作成（新規ブック作成版）
"""

import random
import openpyxl

wb = openpyxl.Workbook()  #新規ワークブックを作成
sheet = wb.active
list_ = [[a, b] for a in range(1, 10) for b in range(1, 10)]
random.shuffle(list_)

for n, v in enumerate(list_):
	x, y = n // 6, n % 6    # 座標変換1 (碁盤タイプ） 
	r, c = x+3 , y*6+1      # 座標変換２【(r,c】各計算式左上座標）
	sheet.cell(row=r, column=c, value=v[0])
	sheet.cell(row=r, column=c + 1, value='+')
	sheet.cell(row=r, column=c + 2, value=v[1])
	sheet.cell(row=r, column=c + 3, value='=')
	print(n,(x,y),(r,c),v)  #参考に座標変換内容表示
wb.save('output.xlsx')
```
![drill_img.JPG](https://qiita-image-store.s3.amazonaws.com/0/351020/ff66a2b7-c3cb-86d2-f80a-7df9ecdf7278.jpeg)



[さらに一気に保存するバージョン(colab)](https://colab.research.google.com/github/zaq9/qiita_make_drill/blob/master/qiita_comment_2.ipynb)

```python

"""計算練習ドリルを作成
    改行処理にバッファー活用＋appendで行ごと書き込むバージョン
"""

import random
import openpyxl

wb = openpyxl.Workbook()  #新規ワークブックを作成
sheet = wb.active

# 各計算式を一つのListとして取り扱うと理解しやすい
list_ = [[a, '+', b, '=', ''] for a in range(1, 10) for b in range(1, 10)]

random.shuffle(list_)

buf = []    #dataを一時ため込む変数
for v in list_:
    if len(buf) > 25: #一行に25列以上データがある場合は改行    
        sheet.append(buf)
        buf=[]
    buf.extend(v)     #buf内にデータを一時的に追加保存
sheet.append(buf)     #最終行書き込み

wb.save('output3.xlsx')

```
Railsの特定のディレクトリ以下のファイルを探る

再帰的に特定のディレクトリ以下のファイルパスを取得したい時は、
Dirクラスを使ってパスを取得する。

Railsで呼び出す場合は、Rails.rootを使うと実行しているOSでRailsが動いている絶対パスを取得できるので、本番環境や開発環境を指揮する必要がなくて便利

実行例

```
Dir.glob("#{Rails.root}/app/models/**/*") do |f|
  p f
end

=> "/var/app/models/user.rb"
"/var/app/models/owner.rb"
"/var/app/models/blog"
"/var/app/models/blogs/comment.rb"
```
DBに接続しているクラスの一覧を取得する

Rails4以前では結構面倒だったけど、Rails5以降では
ApplicationRecord.descendants　でDBに接続しているモデルの一覧取得できる


例えばこんな感じ

```
model_list = ApplicationRecord.descendants

# クラス名の一覧を出力したいときはこう
model_list.map { |v| v.to_s }
=> ["User", "Owner", "Blogs::Comment"]
```

## 利用シーン
* バッチ処理
* xxxというメソッドが実行できるメソッドを探す場合
SQL Server: 並列処理の最大限度(maxdop) の適切な設定値を探す方法


# 並列処理の最大限度(maxdop)とは
SQL Server では、並列プランを実行する際に使用するプロセッサ数の上限値を決める設定があります。

[サーバーのプロパティ]の[詳細設定]の[並列処理の最大限度]の設定値が該当します。
(以下、max degree of parallelismの略でmaxdopと呼びます。尚、クエリヒントのmaxdopは今回は無関係です。）


![image.png](https://qiita-image-store.s3.amazonaws.com/0/148310/ffa28062-8c6a-baff-89cc-5867e58487d1.png)

規定値は0となっており、この場合は使用可能なすべてのプロセッサが使われます。（ただし最大64）

並列プランの場合、基本的には使用するプロセッサ数が多いほどCPU負荷は上昇し、代わりに実行速度が速くなる傾向があります。

そのため、maxdopの設定値はサーバー負荷と実行速度とのトレードオフとなっており、高い値を設定すれば良いというわけにはいかないところに意思決定の難しさがあります。

maxdopの設定値については、以下のガイドラインが存在します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/148310/b5cda52f-3288-ff3e-fc02-e88c55eb323b.png)
出典：[max degree of parallelism サーバー構成オプションの構成](https://docs.microsoft.com/ja-jp/sql/database-engine/configure-windows/configure-the-max-degree-of-parallelism-server-configuration-option?view=sql-server-2017)

基本的にはこのガイドラインに従って設定することになるかと思いますが、ワークロードの性質によっては別の設定値のほうが全体のパフォーマンスを最適にできる可能性も考えられるかと思います。

そこで、maxdopの複数の設定値の候補から、ベストな値をみつける方法を考えてみました。

# 適切なmaxdopの選定方法
方法はいたってシンプルです。
「ガイドラインに従うと8だが、CPUリソースには余裕がある状況なので16を試してみたい」というシナリオを想定します。

設定値の変更によって、サーバー全体の実行速度にどういった変化があったかを比較できれば、納得感のある意思決定ができると考えました。

そこで、[SQLServer:Batch Resp Statistics](https://docs.microsoft.com/ja-jp/sql/relational-databases/performance-monitor/sql-server-batch-resp-statistics-object?view=sql-server-2017)というパフォーマンスオブジェクトを使用します。
※SQL Server2012以降でサポートされています。

この値は、パフォーマンスモニターを使って確認することができます。
パフォーマンスモニター起動後、緑色の+マークを押して、[SQLServer:Batch Resp Statistics]を選択し、[<すべてのインスタンス>]を選択した状態で[追加]を押して[OK]ボタンを押すと表示されるようになります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/148310/e74b278e-2ad7-5fc0-8cde-41fd76106e31.png)

ただし、折れ線グラフだとわかり辛いので、表示形式を切り替えて（↓の赤枠の箇所を何回か押す）レポート形式でみます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/148310/1bb1bc06-62ac-6d0d-a5c1-126055976c9d.png)

今回はCPUリソースには余裕があるという前提で、クエリの実行時間(Elapsed Time）にだけ着目します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/148310/4ead15e9-1ee4-4101-8cb0-5ec619c09c1d.png)
[出典](https://docs.microsoft.com/ja-jp/sql/relational-databases/performance-monitor/sql-server-batch-resp-statistics-object?view=sql-server-2017)

各カウンターの値の意味は分かりやすいです。「Batches >=000000ms & <000001ms」なら「応答時間が 0 ミリ秒以上 1 ミリ秒未満の SQL バッチ数」となります。

この分布が、maxdopの設定変更の前後でどう変わったかをみれば良さそうです。

ただし、この値は累積値のため、特定の期間の値を算出するためには二点間の差分をとる必要があります。

DMVでも同様の値がとれるため、値を保存しておくには以下のクエリを使用すると便利です。

```sql
select * from sys.dm_os_performance_counters
where object_name = 'SQLServer:Batch Resp Statistics'
```

あとは、maxdop=8と16とでそれぞれ実行速度の分布情報を取得し、「16のほうが実行速度の分布に改善がみられ、かつCPUリソースにも依然として余裕がある」という結果になれば、maxdopを16に変更しても良いかと思います。

また、実はほとんど変わらなかった、という結論になることもあるかもしれません。

いずれにせよ、この方法を使うことで、以前よりも納得感をもってmaxdopを設定できるのではと考えています。
Linux操作するためのUNIXコマンド

###UNIXコマンドの一覧

LinuxはUNIXの互換して動くものなので同じものを使っているため、
UNIXコマンドを使う。

↓接続（localの場合）

```
ssh root@[IPアドレス]
```

↓現在のディレクトリ

```
pwd
```

↓ユーザー追加

```
useradd [ユーザー名]
```

↓ユーザー変更

```
su [ユーザー名]
```

↓名前変更

```
mv [変更前の名前] [変更後の名前]
```

↓ファイルを消す

```
rm [ファイル名]
```

↓ディレクトリ消す

```
rmdir [ディレクトリ名]
```

↓パスワード設定

```
passwd ●●
```

↓元のユーザーに戻る（root）

```
exit
```

↓ディレクトリ移動

```
cd /[ディレクトリ]
```
候補を見る


```
cd /TAB
```

↓ファイル一覧の確認

```
ls
```

↓中身の詳細を確認

```
ls -la
```

↓ディレクトリ作る

```
mkdir [●●]
```

↓一つ上のディレクトリに移動

```
cd ../
```

↓ファイルを作る

```
vi [ファイル]
```

■viエディタ
-
↓INSERTモード

```
i
```

↓ノーマルモードに戻る

```
esc0
```

↓保存

```
:w
```

↓終了

```
:q
```
今スク　コンポジションのデュレーション変更＆中身のレイヤーのアウトポイントをデュレーション秒に変更

#もう記事とかじゃなしにメモとしてQiitaを使います。
今日使ったスクリプト略して「今スク」というタイトルでとりあえず、メモ記事を投稿してきます。
簡単なスクリプトは基本的に保存しない主義ですが、やっぱりコピペで使えたら便利よね！
ってことで投稿します。

#今日のスクリプト
コンポジションのデュレーションを変更して、その中にある全てのレイヤーのアウトポイントを
コンポジションのデュレーション秒数に変更します。

#Extendscript

```jsx
var targetNum = 20;
app.beginUndoGroup("undo");
for (var i = 1; i <= app.project.numItems; i++){
    var myComp = app.project.item(i);
    if (myComp.selected && myComp instanceof CompItem == true){
        app.project.item(i).duration=targetNum;
        for (var j =1 ; j <=  app.project.item(i).numLayers ; j++){
            $.writeln(app.project.item(i).layer(j))
            app.project.item(i).layer(j).outPoint = targetNum;
        }
    }
    else if (myComp.selected && myComp instanceof CompItem == false){
        alert("コンポジションを選択して下さい。")
    }
}
app.endUndoGroup();
```

#説明
とりあえずプロジェクトのアイテムを一旦すべて読み込んで、そのアイテムが選択されていたら
デュレーション変更して、さらにその選択されているアイテム（コンポジション）の中のレイヤーのアウトポイントを変更してます。

※一旦全てのアイテムを読み込んでるのは全くもって意味ないです。逆に負荷がかかっていると思います(笑)
でもたまには使わないのも使わないと忘れるので使っているだけです。
PHPでGetterとSetterを書きたい

# 基本系でリアルに書く
- リアルに書くとIDEで補完に出てくれます。
- PHPStormを使っている場合は、
    - `Alt + Insert > [Getter and Setters...]`
    - で作れます。手で書くとつらいので。

```php:
/** Ponsukeのクラス. */
class Ponsuke
{
    /** @var string 住処. */
    private $place;

    /**
     * 住処を取得する.
     * @return string|null 住処.
     */
    public function getPlace(): string
    {
        return $this->place;
    }

    /**
     * 住処を設定する.
     * @param string $place 住処.
     */
    public function setPlace(string $place)
    {
        $this->place = $place;
    }
}
```

# マジックメソッドで書く
- マジックメソッドを書いただけではIDEで補完に出ません。
- classのPHPDocに`@method`を書いてあげると補完に出ます。
    - ただし、`@method`で補完に出るようになりますが、マジックメソッドを書き忘れても補完に出ます。
    - 結果、実行するとエラーになります:hearts:

```php
/**
 * Ponsukeのクラス.
 * @method string getPlace()
 * @method void setPlace(string $value)
 */
class Ponsuke
{
    /** @var string 住処. */
    private $place;

    /**
     * Getter.
     * @param $name
     * @return mixed
     */
    public function __get($name)
    {
        return $this->$name;
    }

    /**
     * Setter.
     * @param $name
     * @param $value
     */
    public function __set($name, $value)
    {
        $this->$name = $value;
    }
}
```

# 参考
- [メソッドのオーバーロード](http://php.net/manual/ja/language.oop5.overloading.php#object.call)
- [PhpStorm の静的解析機能をさらに活用するための3つのアノテーション | バシャログ。](http://bashalog.c-brains.jp/15/12/07-171200.php)
- [@method &mdash; phpDocumentor](https://docs.phpdoc.org/references/phpdoc/tags/method.html)