OmniAICreator/Qiita-1.07M huggingface dataset:
[CakePHP2]複数形がわからない。

CakePHPのルールで複数形？？ってなりましたが、、
以下のサイトで確認できたのでよかった。

[Infector](https://inflector.cakephp.org/)

こんな感じで表示されます。

![CakePHP  the rapid development php framework  Inflector.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278346/ad5ebd59-944a-c89e-8254-f1175e63579c.png)
Goで.NETに強いCIツールAppVeyorを試す

## AppVeyor?
[AppVeyor](https://www.appveyor.com/)
Windows and Linux用のSass系のCIツールです。
.NETに強い印象です。

## 対象
GoのCLIツールをWindowsで動作確認したいが、手動は流石に面倒だと思っている方

## モチベーション
* WindowsとMacで使える業務効率化の社内ツールを作成する必要があった
* 筆者は基本的にMacを利用しているため、Windowsの動作確認が面倒だった
* OSSのREADMEでAppVeyorのバッジをよく見かけたので試したかった

## 環境
* go 1.12.x

## appveyor.ymlの全体構成
appveyor.ymlの構成は、最終的に以下のようになりました。

```yml:appveyor.yml
# appveyor.yml
# defaultだと、MSBuildモードになるのでoff
# MSBuildモードについては、参考記事参照願います
build: off

clone_folder: c:\mycoolcmd

environment:
  GO111MODULE: on

stack: go 1.12.3 x64

install:
  - cinst -y make sed zip

build_script:
  - scripts\windows\build.bat
  - zip -l -r -j mycoolcmd.zip build/* # change to CRLF

test_script:
  - scripts\windows\test.bat
  - dir

artifacts:
  - path: mycoolcmd.zip
```

## ポイント解説
### Chocolatey
```yml
  - cinst -y make sed zip
```
ビルドやテストで必要となるコマンド類を一通り落とします。
`Chocolatey`は、Windowsのパッケージ管理ツールでAppveyorのイメージに標準で入っています。
`choco install`を略して`cinst`とすることが可能です。
### Go modules
```yml:appveyor.yml
environment:
  GO111MODULE: on

stack: go 1.12.3 x64
...
build_script:
  - scripts\windows\build.bat
  - zip -l -r -j mycoolcmd.zip build/* # change to CRLF
```

`GOPATH mode`ではく`module-aware mode`でビルドしています。
`go build`で依存のあるライブラリを一通りダウンロードし、ビルドしてくれます。
ビルド後は、設定ファイルをCRLF形式にしたいので、`zip`の`-l`オプションをつけて圧縮しています。
(バイナリに対しては無視されます)
これは、ユーザーがメモ帳で設定ファイルを開いた際に、設定ファイルが一行に見ないようにするためです。

補足ですが、ビルドスクリプトは、以下のような形です。

```build.bat
go build -o .\build\mycoolcmd.exe
cp settings.toml .\build\settings.toml
```
因みに`GOPATH mode`の場合は、環境変数に`$GOPATH`を設定し、その中にプロジェクトをクローンする必要があります。

### テスト
テストとはいえ、正常系のコマンドを実行してエラーにならないか程度を確認しています。

```yml:appveyor.yml
test_script:
  - scripts\windows\test.bat
  - dir
```

```test.bat
# ビルドしたディレクトリをコピー
XCOPY /Y /I build wintest
# 設定ファイルを書き換え
TYPE settings.toml |sed -e s/hogehoge@/%email%/g -e s/hogehoge/%password%/g>.\wintest\settings.toml
cd .\wintest
# GoのCLIアプリを実行
mycoolcmd.exe
```
`%email%`と`%password%`は、AppVeyorの設定で外部から見えないようしている環境変数です。
`TYPE`はwindowsのコマンドで、linuxの`cat`をイメージしてください。
`TYPE`と`sed`の共同作業で、設定ファイルを書き換えています。

### artifacts
```yml:appveyor.yml
artifacts:
  - path: mycoolcmd.zip
```
とても便利な機能、`path`で指定したファイル群をアップロードしてくれます。
AppVeyorのコンソール上からダウンロードします。
リビジョンごとのビルド済み資材の管理出来ます。

## appveyor使ってみた感想
* `install`や`artifacts`のフェーズでVM側の問題でエラーになることがあった、ymlが原因かVMが原因か分からず切り分ける必要があった
* chromeが標準で入っており、chromedriver.exeを落とせば、クローリング・スクレイピングをするツールのテストはすぐ出来る
* 割とサクッとwindowsで動作確認ができるので、非常に便利

## 参考
[AppVeyor Build configuration](https://www.appveyor.com/docs/build-configuration/#build-mode)
Leetcode #119: Pascal's Triangle


```swift
func getRow(_ rowIndex: Int) -> [Int] {
    var answer = Array(repeating: 1, count: rowIndex + 1)
    if rowIndex >= 2 {
        for i in 2...rowIndex {
            var original = 1
            for j in 1...i-1 {
                let tmp = answer[j]
                answer[j] = answer[j] + original
                original = tmp
            }
        }
    }
    return answer
}
```
Chart.jsに背景を入れる方法

## はじめに

棒グラフ・折れ線グラフをはじめ、様々なグラフを簡単に描画できるChart.js。
設定をすればカスタマイズも可能です。しかしこのモジュールには重大な欠点が...

ずばり、グラフに背景を入れることが**できない**！！！
プラグインを使わないとすれば、自分でcanvasに描画するしかないんです。

プラグインを増やしたくないという方に向けに、canvas情報の取得・操作の方法を書き残します。



## 動作環境

- HTML 5
- CSS 3
- jQuery 3.3.1
- Chart.js 2.8.0



## 準備

ここはできること前提なので簡単な説明のみとします。

まずはグラフを描画するための場所作り。bodyタグにcanvasタグ作ります。

```html:bodyタグ
<body>
    <canvas id="temperatureChart"></canvas>
</body>
```

今回は折れ線グラフを描画。jQueryとchart.jsの読み込みをして、最低限の設定をします。

```html:scriptタグ
<script src="https://ajax.googleapis.com/ajax/libs/jquery/x.x.x/jquery.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
<script type="text/javascript">
$(function() {

    var config = {
        type: "line",
        data: {
            labels: ["1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"],
            datasets: [{
                label: "最高気温",
                lineTension: 0,
                borderColor: "#000000",
                fill: false,
                data: [9.6, 10.4, 13.6, 19.0, 22.9, 25.5, 29.2, 30.8, 26.9, 21.5, 16.3, 11.9]
            }]
        },
        options: {
            scales: {
                yAxes: [{
                    ticks: {
                        min: -5,
                        max: 35
                    }
                }]
            }
        }
    };
    var ctx = $("#temperatureChart").get(0).getContext("2d");
    var lineChart = new Chart(ctx, config);    
});
</script>
```

これで準備はOKですね。
年間の気温を表すグラフが出来上がり。

![graph1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321361/fe9d844c-9c35-0a3a-d474-95795c4430ed.png)



## 背景の描画

ここからが本題になります。
やっていることは、canvas情報を取得してcanvas操作をしています。

まず、背景描画のための関数を用意します。引数`target`にはcanvasの情報（変数`ctx`）が入ります。`target.scales`の中にはキャンバスに描画されるものの情報が入っています。例えば、`target.scales["x-axis-0"].getPixelForValue("3月")`で3月のx座標を取得できます。
情報が取れたら`fillStyle`・`fillRect()`を使って四角形を描画します。

以下の`drawBackground()`は必要な座標情報を取得し、canvasの操作をしている関数です。

```js:drawBackground()
function drawBackground(target) {
    var xscale = target.scales["x-axis-0"];
    var yscale = target.scales["y-axis-0"];
    var left = xscale.left;
    var high_top = yscale.getPixelForValue(35);
    var high_height = yscale.getPixelForValue(25) - high_top; // 夏日
    var low_top = yscale.getPixelForValue(0);
    var low_height = yscale.getPixelForValue(-5) - low_top;   // 真冬日

    // 赤い範囲
    ctx.fillStyle = "rgba(255, 0, 100, 0.2)";
    ctx.fillRect(left, high_top, xscale.width, high_height);

    // 青い範囲
    ctx.fillStyle = "rgba(0, 100, 255, 0.2)";
    ctx.fillRect(left, low_top, xscale.width, low_height);
}
```

ここまで出来たら完成も同然です。
先ほど定義した`config`に`plugins`を追加し、`beforeDraw`で呼び出します。

```js
var config = {
    plugins: [{
        beforeDraw: drawBackground
    }],
    // 以下省略
}
```

はい、完成！！！

![graph2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321361/795c2783-2bee-4fe4-9358-e50e3d635cd1.png)

背景はcanvasに四角形を描画しているだけなので、画像を入れることも可能ですね。


## 補足

`options.animation.onComplete`で先ほど作った関数を呼び出してしまうと、グラフの上に背景を描画してしまうので注意が必要です。
逆に言えば、背景ではなくグラフの上に何かを描画したい場合は`onComplete`の方が良いですね。
Phoenix Frameworkでテーブルのデータを操作する(Ecto.Repo)


# データベース接続情報
Phoenix Frameworkのプロジェクトを作成した際に、
lib/app/repo.exが作成されているはずなので、```repo.ex ```を使ってレコードを操作します。

```repo.ex ```はデータベースを操作するマクロ```Ecto.Repo```を読みこみ、
```dev.ex ``` で設定したデータベース情報を参照するように設定されています。

```lib/app/repo.ex
defmodule App.Repo do
  use Ecto.Repo,
    otp_app: :app,
    adapter: Ecto.Adapters.Postgres
end
```

# レコードを挿入する
入力値チェックなどせずに、単純に挿入するだけであれば、

```Repo.insert 構造体名{フィールド名: 値, フィールド名: 値}　```

```Repo.insert %Post{title: "title", views: 0}　```

で挿入が可能です。
PHPのインストール

##目次
1.homebewをインストール
2.phpenvをインストール
3.phpenvのパスを通す
4.php-buildをインストール
5.PHPのインストールに必要なライブラリを全てインストール
6.PHP7.3.4をインストール
7.PHPを指定

##1. homebewをインストール

```:ターミナル
$ /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)
```

##2. phpenvをインストール

```:ターミナル
$ brew install phpenv
```

```:ターミナル
$ git clone https://github.com/CHH/phpenv.git
$ phpenv/bin/phpenv-install.sh
```

##3. phpenvのパスを通す（phpenvのコマンドをどこでも使えるようにする）

.bash_profileを開く

```:ターミナル
$ vi ~/.bash_profile
```

開いた.bash_profileに以下を記述追加する

```:ターミナル
export PATH="$HOME/.phpenv/bin:$PATH"
eval "$(phpenv init -)
```

.bash_profileを更新する

```:ターミナル
$ source .bash_profile
```

確認する

```:ターミナル
$ phpenv --version
```

パスを通すとは、どのディレクトリからでもアプリケーションを実行できるようにすることで、
アプリケーションは、それが存在するディレクトリにいないと実行できないです。

##4. php-buildをインストール

```:ターミナル
git clone git://github.com/CHH/php-build.git $HOME/.phpenv/plugins/php-build
```

##5. PHPのインストールに必要なライブラリを全てインストール

```:ターミナル
$ brew install re2c
$ brew install openssl
$ brew install bison
$ brew install libxml2
$ brew install autoconf
$ brew install automake
$ brew install icu4c
$ brew install libjpeg
$ brew install libpng
$ brew install libmcrypt
```

更新が必要なものは更新もする

##6. PHP7.2.1をインストール

```:ターミナル
$ phpenv install --list   インストールできるPHPのバージョンを確認する
$ phpenv install 7.3.4
```

できないので・・・

```:ターミナル
$ PHP_BUILD_CONFIGURE_OPTS="--with-openssl=$(brew --prefix openssl)" phpenv install 7.3.4
```

##7. PHPを指定する

```:ターミナル
$ phpenv versions      使用できるPHPのバージョン一覧を表示する
$ phpenv global 7.3.4  システム全体のPHPのバージョンを変更する
$ phpenv rehash
$ PHP --version        7.3.4が表示されることを確認
```

##8. 参考記事

https://qiita.com/spaciba_h_t/items/e266122830e10228fc0b
https://qiita.com/sato_ryu/items/47db3277ad32a0d7b491
【初心者向け】JavaGoldが解説するJavaScriptの構文について

## コンセプト
Javaの経験がある方がJavaScriptを初めて学ぶ際、
JavaとJavaScriptの構文の差分のみ学習することで、
分厚い教科書を一切読まず・短い時間で、
必要最低限をマスターしてもらおう！というコンセプトです

## JavaScriptとは
JavaScriptはスクリプト言語であり、基本的にWebページの機械的な処理や動的なコンテンツ値の変更などを担当する。
※具体的にどんなことができるかはネットで調べてみると良い

Javaと異なり、実行処理は**各Webブラウザ**が構文の解析・実行(インタープリタ方式)を行う点を押さえておけばOK

## 構文(差分のみ)
具体的な差分のみ紹介する。
以下の構文を徹底すると、Javaと大差ないプログラミングが可能になる。
しかし、実際の現場では各プロジェクト方針などあるため、そこは臨機応変に対応してね！

### strictモード（厳格モード）
JavaScriptはファイルの一部に構文エラーが発生したとしても(コンパイルエラー)、
それをある程度、優しさで包み込んでくれる
※内部的に、動作する記載に直してくれる

その優しさをはねのける鋼の精神をお持ちなら、魔法の呪文をファイルの頭に記載する。

```magic.js
"use strict";
```
### 型について
型はJava同様、プリミティブ型・オブジェクト型に大別することができるが、
記載上それを分けた変数宣言を行うことはできない。
※参照値渡しなどの処理上の振る舞いは一緒だと思ってもらって良い

```kataSample.java
satic final String name = "三橋";
int age = 14;
List<String> belongings = new ArrayList<>();
```

```kataSample.js
const name = "三橋";
let age = 14;
// 配列については後述する
let belongings = ["おにぎり","癇癪玉","バット"];
```

**⭐︎ポイント**
- 変数の宣言は全て"let"で行う(※1)
- アクセス修飾子は存在しない(※2)
- 定数は"const"を使用する

※1.変数宣言の選択肢として"var"の使用などがある(教科書などによく記載されている)
"var"にはブロックスコープの概念がなく、同一スコープ内の同一名変数宣言を許容(値の上書きがされる)という、Javaでイメージできないような振る舞いを行うため、極力"let"を使用する

※2.グローバル変数やローカル変数などの概念は存在するため、気になる人は調べてみると良い("let"で統一すれば意識する必要なし)

### 変数の比較
比較は素直に以下のように行う。
NGパターンを使用すると、内部的に型の変換が行われるため、
文字列と数値の比較も場合によってはtrueの判定になる。

```compare.js
console.log("1" === "1");
console.log("1" === 1);
console.log(1 >== 0 && "伊藤" === "三橋");

// NGパターン
console.log("1" == 1);
```

```実行結果
true
false
false
true
```

※オブジェクト型の場合、従来通りequals()メソッドを使用

※コメントより補足(@sdkeiさんより)
>JavaScript の == は Java の equals メソッドをかなり融通が利くように実装したようなもの。
JavaScript の === は Java の == と同じ。

### 拡張for文
for文はいつもの感じで書いてもらえれば良いが、
配列(List)の拡張for文は以下の記載をする。

```forSample.js
let sampleList = ["美味しいバナナ","腐ったみかん"]
for(let item of sampleList){
   console.log(item);
}
```
※Mapは"for in"句を使用する(あんま使わないか)

### MapとList
Javaで言うところのHashMapやArrayListに代わるものは以下

```mapSample.js
// Mapの生成
let map = new Map();

// 要素の追加
// ※注意：putじゃなくset!
map.set("key1", "apple");

// 要素の取得(いつも通り)
map.get("key1");
```

```listSample.js
// Listの生成(実質ただの配列)
let list = new Array();

// 要素の追加
// ※注意：addじゃなくpush!
list.push("apple");

// 要素の取得(配列のアクセス方法)
list[0];
```

### 関数
function関数を使用する

```kansuSample.js
function sampleFanc(name){
   console.log(name);
}

sampleFanc("今井");
```

### nullとundefined
JavaScriptの世界ではundefinedという概念がある。
Javaでは生成されていない(メモリー上に存在しない)変数をnullとして扱うが、
JavaScriptではそれがundefinedとして扱われると思えば良い。
※つまりnullは意図的に変数に設定しない限り、出現しない

注意点としては、nullとundefinedは別物扱いになるため、
"==="の比較を行った場合、falseの判定がされる。


##エラーの見つけ方について
上記で紹介した内容は本当に必要最低限に絞っているため、色々やるとエラーが発生する(無責任)
そのため、どんなエラーが発生しているか原因を特定するメソッドを持つことが重要

1.ログを出す
2.エラーを補足する

```specificErr.js
try{
   let name = "バグってそうな値";
   //不安ならログに出す
   console.log(e);

}catch(e){
   //try・catch可能
   console.log(e.massage);
}
```

また、各Webブラウザ標準の開発者向けの機能を使用することで、より精度の上がった特定ができる。

## まとめ
上記内容でJavaScriptの構文の基礎は固まったと言って良いでしょう。
あとは、JavaScript固有のライブラリやイベント処理、フレームワークの方法などを学んでもらえば、やりたいことは実現できるはずです。
KubernetesのPod内のJavaのパラメーターを確認する

Kubernetes上で動いているJavaのパラメーターを確認する際に、k8s(というかDocker)ならではのつまずきがあるので、うまく行った方法を共有します。

## Dockerfileの編集

通常Dockerで起動するプロセスのPIDは1になってしまいますが、後述のjcmdやjinfoはPIDが1のプロセスにアタッチ出来ないため、PIDを変更する必要があります。

PIDの変更にはTiniというパッケージを導入します。またENTRYPOINTをtiniにして、実際に起動したいアプリケーションをパラメータとして渡します。

```Dockerfile:Dockerfile
FROM openjdk:8-jdk-alpine
LABEL MAINTAINER="foo@example.com"
WORKDIR /opt/docker
ADD --chown=daemon:daemon opt /opt
USER daemon
ENTRYPOINT ["/sbin/tini", "--", "/opt/docker/your/app/entrypoint"]
CMD []
USER root
RUN apk --update add bash
RUN apk add --no-cache tini
USER daemon
EXPOSE 9000
```

Alpine以外のディストーションを利用されている場合は、TiniのGitHubに導入方法をご参照ください。
https://github.com/krallin/tini


## Podへのログイン

Podへのログインは通常の方法と同様です。

```shell
$ kubectl get pod
NAME                                             READY     STATUS             RESTARTS   AGE
pod-name-xxxxxxxxxx-xxxxx                        1/1       Running            0          10h
```

```
$ kubectl exec -it pod-name-xxxxxxxxxx-xxxxx bash
```




## パラメーターのデフォルト値の確認

```
$ java -XX:+PrintFlagsFinal -version
[Global flags]
     intx ActiveProcessorCount                      = -1                                  {product}
    uintx AdaptiveSizeDecrementScaleFactor          = 4                                   {product}
    uintx AdaptiveSizeMajorGCDecayTimeScale         = 10                                  {product}
...
```

## 起動中のJavaプログラムのパラメーターの確認

jpsコマンドで対象のプロセスのPID調べます。

```
$ jps -v
7 ProdServerStart -Duser.dir=/opt/docker
142 Jps -Dapplication.home=/usr/lib/jvm/java-1.8-openjdk -Xms8m
```

jcmdコマンドで調べたPIDを指定して有効になっているパラメーターの一覧を表示できます。

```
$ jcmd 7 VM.flags -all
7:
[Global flags]
     intx ActiveProcessorCount                      = -1                                  {product}
    uintx AdaptiveSizeDecrementScaleFactor          = 4                                   {product}
    uintx AdaptiveSizeMajorGCDecayTimeScale         = 10                                  {product}
...
```

特定のパラメーターの設定値を確認する場合はjinfoコマンドを使用します。
以下はヒープメモリの最大値の設定を確認する例です。

```
$ jinfo -flag MaxHeapSize 7
-XX:MaxHeapSize=1960837120
```

## Javaのパラメータ関連の参考サイト
https://docs.oracle.com/javase/jp/8/docs/technotes/tools/unix/java.html
http://etc9.hatenablog.com/entry/2016/05/11/012037
https://x1.inkenkun.com/archives/367
https://qiita.com/kaikusakari/items/9f96ffd3a6dd71dfd914
【ExcelVBA】DictionaryのItemにユーザー定義型を指定できない

# はじめに

仕事でVBAのコードを書いていた時に、「パブリック オブジェクト モジュールで定義されたユーザー定義型に限り、変数に割り当てることができ、実行時バインディングの関数に渡すことができます。」というエラーメッセージが出ました。
当初は何のエラーなのかさっぱり分かりませんでしたが、「DictionaryのItemにユーザー定義型を指定するとコンパイルエラーになる」ということが分かりました。

![compile_error.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/312166/f092bd53-07b9-c433-2b1f-975f7211c249.png)

# サンプルデータ

"Sheet1"という名前のワークシートに記載されている、以下のデータを使用します。

![worksheet.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/312166/86a92e99-c686-c03e-2869-8a1b1a3e8732.png)


# サンプルコード

* 下記のコードを作った後、［実行］もしくは［VBAプロジェクトのコンパイル］を行うと、コンパイルエラーが発生します。
* [こちらのページ](http://madia.world.coocan.jp/vb/vb_bbs/200312/200312_03120066.html)によると、「Dictionaryに格納できる値は、Variant型に格納可能なデータのみです。ユーザー定義型は、レジストリに登録されたパブリックな型のみ格納できます。」ということです。
 * つまり、このコンパイルエラーは仕様通りの動きだそうです。



```vb:Module1
Option Explicit

' ユーザー定義型（メンバー型）
Public Type member
    Id As Integer       ' ID
    Name As String      ' 名前
    Age As Integer      ' 年齢
    Address As String   ' 住所
End Type

' 「キーがID、値がメンバー型」のDictionaryを作る
Public Sub Test()
    Dim membersDic As Object
    Set membersDic = CreateObject("Scripting.Dictionary")

    With ThisWorkbook.Worksheets("Sheet1")
        ' Sheet1のデータの入っているRangeを二次元配列として取得する。
        Dim rng As Variant: rng = .UsedRange

        ' ヘッダ行を飛ばして、2行目から取り込む。
        Dim i As Integer
        For i = 2 To UBound(rng, 1)
            Dim Member As Member

            Member.Id = rng(i, 1)
            Member.Name = rng(i, 2)
            Member.Age = rng(i, 3)
            Member.Address = rng(i, 4)

            membersDic.Add Member.Id, Member    ' ★ここでコンパイルエラーが発生します。
        Next i
    End With
End Sub
```

# 回避策

* 以下のようにクラスモジュール（MyMember）を作り、そのクラスをDictionaryのItemにセットすることで、ほぼ同じ処理を実現することができました。

```vb:MyMember
Option Explicit

' メンバ変数
Public Id As Integer       ' ID
Public Name As String      ' 名前
Public Age As Integer      ' 年齢
Public Address As String   ' 住所

```

```vb:Module1
Public Sub Test()
    Dim membersDic As Object
    Set membersDic = CreateObject("Scripting.Dictionary")
    
    With ThisWorkbook.Worksheets("Sheet1")
        ' Sheet1のデータの入っているRangeを二次元配列として取得する。
        Dim rng As Variant: rng = .UsedRange
        
        ' ヘッダ行を飛ばして、2行目から取り込む。
        Dim i As Integer
        For i = 2 To UBound(rng, 1)
            Dim m As MyMember
            Set m = New MyMember
            
            m.Id = rng(i, 1)
            m.Name = rng(i, 2)
            m.Age = rng(i, 3)
            m.Address = rng(i, 4)
            
            membersDic.Add m.Id, m
        Next i
    End With
End Sub
```

# 追記

* Collectionの要素としてユーザー定義型を指定すると、Dictionaryと同様に「パブリック オブジェクト モジュールで定義されたユーザー定義型に限り、変数に割り当てることができ、実行時バインディングの関数に渡すことができます。」というエラーメッセージが出ることが分かりました。
* そのため、Collectionについてもクラスモジュールを作って対処するのが早道だと思います。
Leetcode #118: Pascal's Triangle


```swift
func generate(_ numRows: Int) -> [[Int]] {
    var answer = [[Int]]()
    if numRows >= 1 {
        answer += [[1]]
    }
    if numRows >= 2 {
        answer += [[1,1]]
    }
    if numRows >= 3 {
        for i in 2..<numRows {
            var row = Array(repeating: 1, count: i+1)
            for j in 0..<i-1 {
                row[j+1] = answer[i-1][j] + answer[i-1][j+1]
            }
            answer += [row]
        }
    }
    return answer
}
```
Leetcode #115: Distinct Subsequences

First try failed at the test case
["fff", "ffff"] and ["avc", ""]

```swift
func numDistinct(_ s: String, _ t: String) -> Int {
    if t.count == 0 {
        return 1
    }
    if s.count < t.count {
        return 0
    }
    let S = Array(s)
    let T = Array(t)
    var tmp = Array(repeating: 1, count: S.count + 1)
    var dp = [Int]()
    for i in 1...T.count {
        dp = Array(repeating: 0, count: S.count + 1)
        for j in i...S.count {
            if S[j-1] == T[i-1] {
                dp[j] = dp[j-1] + tmp[j-1]
            } else {
                dp[j] = dp[j-1]
            }
        }
        tmp = dp
    }
    return dp[S.count]
}
```
Ruby技術者認定試験受験したので感想ぶちまける

去年の2018年12月2日にRuby技術者認定試験を受験したのでそのことをまとめます。

# Ruby技術者認定試験とは？
そもそもRuby技術者試験とはなんぞや？と言う人も多いと思います。

> Ruby技術者認定試験制度は、Rubyベースのシステムを設計、開発、運用するエンジニア、Rubyでシステム提案を行うコンサルタント、Rubyを教える講師及びRubyを学ぶ学生などを対象とした認定試験制度です。認定者は、Ruby技術者としての技術力を公正に評価され、高い水準のRubyによるシステム開発能力を持つことを認定されます

参考 : [RubyAssociation公式サイト](https://www.ruby.or.jp/ja/certification/examination/)

まあ、**簡単に言うとRubyエンジニアとしてある程度の知識を持ってますよ！**と証明できる資格ということです。

Ruby技術者認定試験には基本レベルのSilverと応用レベルのGoldがありまして、私はSilverを2018年10月に受験して合格済みです。


![IMG_6264-768x1024.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286094/15755b6d-4fa9-52e5-3246-16a06e20f353.jpeg)


これで調子に乗ってGoldもとってやるぜ！となって受験した流れになります。


# 勉強スケジュール・内容
Gold受験の勉強期間は1ヶ月です。

```


■　 Ruby技術者認定試験合格教本を３週する。

■　メタプログラミングRuby 第2版の試験範囲1章 ~ 4章を３週する。

■　 Ruby技術者認定試験合格教本の巻末にある、RubyGold演習問題を全問正解するまでひたすら繰り返す

■　隙間時間（通勤時間など）にスマホでITトレメというサイトを使って演習問題を解きまくる。

■　Githubのサンプルクイズを全問正解するまでひたすら繰り返す。

```

参考書でインプットしてクイズでアウトプットするという手順で勉強していました。

# 試験結果

.......はい、不合格でした。



合格点75点で自分の点数は72点でした。

50問100点満点なので、あと１問正解してたら合格でした。

そう、あと１問........


![IMG_9939のコピー-768x1024.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286094/4ba90fa4-1957-1a17-7276-9e7d8c3ca21f.jpeg)


受験結果見た最初の感想は"俺持ってなさすぎ！"でしたwwwww

# 受験するメリット
まあ、結果は不合格だったんですが。勉強して感じたメリットをまとめます。

```
■　勉強する習慣がついた

■　メタプログラミングを勉強することで、Rubyの設計思想を学ぶことが出来た。
```
正直な事を言うと、Goldレベルは上級レベルで普通の現場では使わないテクニックが多いです。現場で使えるような知識を身に付けたいならSilverがオススメです。組み込みクラス（配列、ハッシュ、文字列）、オブジェクト指向の基礎などが体系的に学べます。

# 受験するデメリット
```
■　時間がない中で勉強すると睡眠時間が削られる。

■　遊べに行けなくなる。

■　受験料がバカ高い(16,200円）
```

# 感想 / まとめ
プログラマーは資格勉強する時間があれば、コード書けと言う人も多いと思います。

ちなみに僕もその類の人でした。ですが、Ruby技術者認定試験で体系的にRubyを学んだことによって今まであれなんでこのコードで動くんだろう？と思って書いてたコードが、なるほどRubyの文法的にこうだから動くんだな！のような瞬間が多くありました。

Goldは残念なことに合格まで１問足りずに不合格でしたが、一年後くらいにリベンジするつもりです。

# 2020年9月追記

リベンジするといって2年くらい経ちましたが、結局受験まだしてません笑

というのも、RubyGoldの受験内容は実務で利用しないレベルで勉強する意味がないと決断したからです。

メタプロやRubyの黒魔術、Rubyのプログラミング構造レベルで理解したい人には受験をオススメするのですが、あくまで実務レベルの観点で言うと、Goldの受験は意味ないと思います。

ちなみに、受験勉強で利用した参考書は[Ruby技術者認定試験合格教本](https://amzn.to/3KP6wX0)です。
Pythonで【売れる曜日】と【売れる時間帯】を見える化した。ネットショップの定休日は木曜だ！

Amazonの注文レポートから売れる曜日と売れる時間帯を割り出しました。
パラメータを変えれば実店舗にも他のネットショップでも対応できます。

##必要な環境
Pythonを使えればOKです。

###必要なライブラリ

* matplotlib
* pandas

入っていない場合は

```Bash:terminal
pip install matplotlib
pip install pandas
```

####pandas バージョン注意:
pandasのバージョンによってはread_tableで読み込む際、9時間ずれてしまいますので、できるだけ新しいもので。


#Pythonで見つけるショップの定休日
まずはデータを集めます。
__下記のようなデータがあればamazon以外のネットショップにも対応できます。__

| purchase-date | quantity |
|:-:|:-:|
| 2019-04-01T12:34:56+09:00  | 1  |
| 2019-04-02T12:44:56+09:00  | 2  |
| 2019-04-03T12:54:56+09:00  | 1  |
| 2019-04-04T12:04:56+09:00  | 4  |
| 2019-04-05T12:14:56+09:00  | 6  |

Amazonやヤフオク!など、ECモールの場合、管理画面からダウンロードできます。
__実店舗でもデータ化された売上表がある場合はパラメーターを変えるだけで対応できます。__

##作成できるグラフ
下記グラフはamazonからダウンロードできる__全注文レポート__をから作成したグラフです。



###曜日別のグラフ

* _横軸は曜日で、0が月曜日、6が日曜日となっています。_
* _縦軸は数量です。_

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387991/33148432-76dc-90d1-e176-3756fdcaa8a7.png "図1")

###時間別のグラフ

* _横軸は時間_
* _縦軸は数量_

![image_hour.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387991/146c755e-f427-c33b-0193-10c740d8aa13.png)

##グラフ化してわかること(取り扱いジャンルによって変わると思うので注意)

###曜日別
うちの場合、3の木曜日の売上が最小で、6の日曜日が最大となっている。
__その差は2倍以上__。アルバイトを雇っているような店舗の場合、__シフトを考える__際にも役に立つかと思います。

だいたいどの期間をとっても同じような形となるので、うちの場合は__木曜日が定休日__にしやすいです。__飲みに行くなら水曜日の夜。__


###時間別グラフでわかること
__昼型人間が自由に動ける時間帯に注文が多い。__
キャンペーンやセールの時間帯、お知らせの時間帯は工夫した方が良い。



##pythonコード

```python
import matplotlib.pyplot as plt
import pandas as pd


sales_data = 'ここに読み込みたいファイルのパス'

df = pd.read_csv(sales_data, sep='\t', index_col=['purchase-date'],
                 usecols=['purchase-date', 'quantity'],
                 parse_dates=True, encoding="shift-jis")

df = df.set_index([df.index.hour, df.index.weekday, df.index])
df.index.names = ['hour', 'weekday', 'day']

# weekday
df_weekday = df.sum(level='weekday')
df_weekday = df_weekday.sort_index(axis=0)
plt.figure()
df_weekday.plot()
plt.savefig("image_weekday.png")

# hour
df_hour = df.sum(level='hour')
df_hour = df_hour.sort_index(axis=0)
plt.figure()
df_hour.plot()
plt.savefig("image_hour.png")

```

これを実行するとグラフの.pngが出来上がります。

* weekday.pngと言う名の曜日別数量グラフ
* hour.pngと言う名の時間別数量グラフ

__Amazon__の場合、'ここに読み込みたいファイルのパス'を変更すれば__コピペするだけで実行できます__。


###実店舗や他のECモールに対応させる場合

```python
df = pd.read_csv(sales_data, sep='\t', index_col=['purchase-date'],
                 usecols=['purchase-date', 'quantity'],
                 parse_dates=True, encoding="shift-jis")
```

ここら辺のsep='\t'やカラム名をいじってやると対応できます。

###ヤフオクの月間落札明細に対応させる場合

```python
df = pd.read_csv(file_auction, sep=',', index_col=['終了日時'],
                   usecols=['終了日時', '落札個数'],
                   parse_dates=True, encoding="お使いの文字コード")
```

文字コードだけ指定してください。

##最後に
最後まで見ていただきありがとうございます。
カラム名などを変更すれば、いろんなショップに対応できるので、自分のショップでチャレンジしてみてください。
Google App Engine + Flask(Python3)で「Hello Flask!!」してみた part2 ~デプロイする~

この章では、Flaskを用いたプログラムをデプロイしていきます。
Google Cloud SDKの準備が終わっていることが前提になります。終わっていない人は、[part1](https://qiita.com/h_okawa0303/items/5ff0866b536ecc2f2349)を参考に作業を進めてください。

# 実装する
以下のコマンドで新規のファイルを作成しましょう。

```
$ mkdir [新規ファイル名]
$ cd [新規ファイル名]
```

そして以下のファイルを作成していきます。*マークがついているファイルを作成していきます。お好きなエディタでどうぞ。

```
[新規ファイル名]
 ├─templates
 │  └─main.html*
 ├─main.py*
 ├─app.yaml*
 └─requirements.txt*
```

## main.html
クライアント側を作成していきます。今回は「Hello Flask!!」と表示するだけです。

```html:main.html
<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Hello Flask!</title>
    </head>
    <body>
        <h1>{{ hello }}</h1>
    </body>
</html>
```

## main.py
Flaskを利用してmain.htmlファイルに「Hello Flask!!」を渡します。

```python:main.py
from flask import Flask,render_template

app = Flask(__name__)

@app.route('/')
def hello_flask():
    hello = "Hello Flask!!"
    return render_template('main.html', hello = hello)

if __name__ == '__main__':
    app.run()
```
Flaskの説明に関しては今回は記述しません。知りたい方は以下の記事を参考にしてください。
>[Flaskの簡単な使い方](https://qiita.com/zaburo/items/5091041a5afb2a7dffc8)

## app.yaml
環境やサービス名などを記述するファイルになっています。このファイルがデプロイ記述子となるので必ず作成しましょう。

```python:app.yaml
runtime: python37
env: standard
service: flask-test
entrypoint: gunicorn -b :$PORT main:app
```
App Engineの設定はこのファイルで行うことが多いみたいです。
>[app.yaml リファレンス  |  Python の App Engine スタンダード環境  |  Google Cloud](https://cloud.google.com/appengine/docs/standard/python/config/appref?hl=ja)

## requirements.txt
Flaskとgunicornがインストールされるように設定しましょう。

```
flask
gunicorn
```

## デプロイする
これでデプロイの準備が完了しました。実際にデプロイしていきます。

```
$ gcloud app deploy
Services to deploy:
・
(省略)
・
Do you want to continue (Y/n)?  y
・
(省略)
・
Deployed service [flask-test] to [https://flask-test-dot-[プロジェクト名].appspot.com]

You can stream logs from the command line by running:
  $ gcloud app logs tail -s flask-test

To view your application in the web browser run:
  $ gcloud app browse -s flask-test
```
こんな感じで表示されれば成功です。
実際に「 https://flask-test-dot-[プロジェクト名].appspot.com 」にアクセスしてみましょう。
![helloflaskdeploy.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217116/f53a8b08-6c18-6617-5faf-2fb949f991d3.jpeg)
これでデプロイ完了です。

# まとめ
今回は、GAEを利用してFlask環境のプログラムをデプロイしました。インフラの知識はほとんどありませんが、比較的簡単にデプロイできたと思います。無料枠もあるのでこれからもどんどん利用していこうと思います。閲覧ありがとうございました。

# 参考文献
>[PythonのFlaskアプリをGoogle App Engineにデプロイしてみた](https://qiita.com/kai_kou/items/775bcc058aaabbdff4e7)
JetBrains IDEでDocker for Windowsに接続する

# TL;DR
IDEで「Settings -> Build, Execution, Deployment -> Docker」を開き、コンフィグを追加します。
「Cannot connect:...」となってしまった場合は、Dockerで「Settings -> General」を開き、「Expose daemon on tcp://localhost:2375 widhout TLS」にチェックを付けると通ります。

# 手順
## IDEで「Settings -> Build, Execution, Deployment -> Docker」を開いてコンフィグを追加する
ツールバーにも追加することを想定して書いています。

まず、`Shift`2回で全体検索を呼び出し、Dockerを検索します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280230/33020d22-a2c3-2cec-a265-dfafc2afc0bb.png)

下のメニューにDockerが追加されるのでConfigureを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280230/6b0b3015-a904-08cf-6dc1-79099bb2e09e.png)

`+`ボタンを選択すると自動でtcp://localhost:2375が選択され、Connection successfulするはずです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280230/388cb8b1-740e-6068-5a37-a1804ee6866c.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280230/54ac1e3a-6163-fe4b-8453-98e3cb4578cc.png)

## 「Cannot connect:...」となってしまった場合の対処
「Expose daemon on tcp://localhost:2375 widhout TLS」が有効になっていない場合、以下のように、「Cannot connect:...」となってしまいます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280230/58709d85-d6ff-e702-2bfe-fc511e6312d5.png)

この設定は、Dockerの「Settings -> General」を開き「Expose daemon on tcp://localhost:2375 widhout TLS」にチェックを付けることで有効にできます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280230/b3061079-2f2b-29cd-cbc9-45fcc483284d.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280230/c6505458-a068-d0df-f7ff-4ac0898e1e90.png)

# 参考
[Docker \- 公式ヘルプ \| JetBrains Rider](https://pleiades.io/help/rider/Docker.html)
ターミナル上の出力を上書きする

https://www.youtube.com/watch?v=aE4eDTUAE70 を追っていたところ、
ターミナルに出力しているハッシュが上書き更新されてて、どうやって出力してるのか気になった。

これ。
`fmt.Printf("\r%x", hash)`

ただし Go playground でやってみると再現せず。

StackOverflow で理由を発見。
出力先によって違うみたい。
https://stackoverflow.com/questions/15442292/golang-how-to-have-an-inplace-string-that-updates-at-stdout

ターミナルに出力されるという前提がある場合は `\r` でいけるけど、
stdoutはファイルやパイプに渡されたりするので、ターミナルに出力されることを無条件に前提にしてはダメだよ、という注意付き。

ちなみに Go Playground の場合はこう。
https://play.golang.org/p/b1LlRwxPdu

stdoutがターミナルかをチェックするのには、 https://rosettacode.org/wiki/Check_output_device_is_a_terminal#Go の通り `terminal.IsTerminal(int(os.Stdout.Fd()))` を使うのが良いらしい。
peco で コマンド履歴からクリップボードにコピーできるようにする  #Mac #peco #shell  #zsh

.zshrc に以下を追加

```
function peco-history-pbcopy() {
  history -n 1 | tail -r  | awk '!a[$0]++' | peco --layout=bottom-up | tr -d "\r\n" | pbcopy 
}

zle -N peco-history-pbcopy
bindkey '^P^P' peco-history-pbcopy


```

Control + PP で起動


# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/1533








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Ubuntu19.04でデスクトップからゴミ箱の表示を消す

:::note info
Ubuntu 22.04であれば、GUIで消せます
:::
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208363/285ebd2f-bab6-9d83-2e95-8b5662edec99.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208363/86d2db18-7bab-2ea6-942a-d2e23c49ce9f.png)


以下の記事を参考に試したが、 `gsettings set org.gnome.nautilus.desktop trash-icon-visible false` を実行すると `No such schema “org.gnome.nautilus.desktop”` というエラーが出るためメモ。

> Ubuntuでデスクトップからゴミ箱の表示を消す
> https://qiita.com/teppeitherock/items/a480fa5ae879423fedb2

# Ubuntu19.04でデスクトップからゴミ箱の表示を消す
#### Before: ホームフォルダとゴミ箱アイコンが表示されている状態
![Screenshot from 2019-04-29 12-32-27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208363/8a3af446-05ce-63c0-8d0d-9677c54ff619.png)

```bash
gsettings set org.gnome.shell.extensions.ding show-trash false
gsettings set org.gnome.shell.extensions.ding show-home false
```

#### After: ホームフォルダとゴミ箱アイコンが表示されていない状態
![Screenshot from 2019-04-29 12-50-04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208363/c0f179c3-24b9-b71f-f0f1-981a0fe03e3d.png)

`gsettings list-recursively` ですべての設定項目を確認できます。

## Gnome Tweakからゴミ箱を消す

#### 1. Gnome Tweakをインストール
```bash
sudo apt install -y gnome-tweak-tool
```

#### 2. 拡張機能から歯車ボタンを押しホームフォルダとゴミ箱を非表示にする
![Screenshot from 2019-04-29 12-56-47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208363/115be26a-d986-ab1a-055a-b7cf37b6210c.png)

> Disable Desktop Icons ‘User Home’ & ‘Trash’ in Ubuntu 19.04
> http://ubuntuhandbook.org/index.php/2019/04/disable-desktop-icons-user-home-trash-ubuntu-19-04/
Node.js,Expressメモ⑤の3

atomのteletypeを知ってとてもワクワクしています。こんにちは。

サブページはお勉強だけかと思ったら急にはじまりました。

https://developer.mozilla.org/ja/docs/Learn/Server-side/Express_Nodejs/Displaying_data/LocalLibrary_base_template

# layout.pugの書き換え
pugファイルは継承可能なようなのでまずはベースとなるlayout.pugを書き換えます。
headにいろいろ書き足していますがその中にjqueryのスクリプト、bootstrapでcssの拡張？などもしているようです。

```
head
  title=title
  meta(charaset="utf8")
  meta(name="viewport", content="width=device-width, initial-scale=1")
  link(rel='stylesheet', href='https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css')
  script(src='https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js')
  script(src='https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js')
  link(rel='stylesheet', href='/stylesheets/style.css')
```

# bootstrap
フロントエンドのフレームワークなのかな？
デバイスの違いもうまい具合吸収してくれると聞いたことがあります。
web初心者としてはフロントエンドとバックエンドでフレームワークが組み合わせることができるんだ！
と少し感動です。

# なんで継承するレイアウトを作るのか
チュートリアルでは共通のサイドバーがあるみたいです。
実際は毎回レンダリングしているけど、サイドバーに表示されているものは一緒ってやつですね。

最後に継承後に置き換えるものを書いて終了のようです。

```
body
    div(class='container-fluid')
      div(class='row')
        div(class='col-sm-2')
          block sidebar
            ul(class='sidebar-nav'
              li 
                a(href='/catalog') Home
              li 
                a(href='/catalog/books') All books
              li 
                a(href='/catalog/authors') All authors
              省略...

        //contentを他のテンプレートで置き換える
        div(class='col-sm-10')
          block content
```

#サイドバーの.CSS

```
.sidebar-nav{
  margin-top: 20px;
  padding: 0;
  list-style: none;
}
```


つづく
#django で #mysql イメージの #docker コンテナに対してマイグレーションする ( #python )

# settings.py
```
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql', 
        'NAME': 'some',
        'USER': 'root',
        'PASSWORD': '',
        'HOST': '127.0.0.1',
        'PORT': '10101,
    }
}
```

# docker
```
docker run -e MYSQL_ALLOW_EMPTY_PASSWORD=yes -d -p 10101:3306 -v /tmp/data:/var/lib/mysql --name=mysql-example mysql:5.7
```
# create database
```
docker exec -t mysql-example mysql -e 'CREATE DATABASE some;'
```
# migration
```
./manage.py migrate
```
```
Operations to perform:
  Apply all migrations: admin, auth, contenttypes, sessions
Running migrations:
  Applying contenttypes.0001_initial... OK
  Applying auth.0001_initial... OK
  Applying admin.0001_initial... OK
  Applying admin.0002_logentry_remove_auto_add... OK
  Applying admin.0003_logentry_add_action_flag_choices... OK
  Applying contenttypes.0002_remove_content_type_name... OK
  Applying auth.0002_alter_permission_name_max_length... OK
  Applying auth.0003_alter_user_email_max_length... OK
  Applying auth.0004_alter_user_username_opts... OK
  Applying auth.0005_alter_user_last_login_null... OK
  Applying auth.0006_require_contenttypes_0002... OK
  Applying auth.0007_alter_validators_add_error_messages... OK
  Applying auth.0008_alter_user_username_max_length... OK
  Applying auth.0009_alter_user_last_name_max_length... OK
  Applying auth.0010_alter_group_name_max_length... OK
  Applying auth.0011_update_proxy_permissions... OK
  Applying sessions.0001_initial... OK
```

# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/1508








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
再起動をadbコマンドで実行する

Androidで開発していて、PCを実機につないで、再起動を確認するときに実際に再起動してしまうと実行が消えてしまいますよね？
どうやらADBコマンドで実際に再起動せずに再起動を再現できるみたいなので、やってみました。
ただ、やってみると意外にハマったので、手順を残したいと思います。

####①実際に実機で試す

とりあえず、PCに実機をつないで、下記コマンドを入力する

```kotlin:ADBコマンド
adb shell am broadcast -a android.intent.action.ACTION_BOOT_COMPLETED
```

すると権限がないというエラーが発生

```
Security exception: Permission Denial: not allowed to send broadcast android.intent.action.BOOT_COMPLETED

java.lang.SecurityException: Permission Denial: not allowed to send broadcast android.intent.action.BOOT_COMPLETED
        at com.android.server.am.ActivityManagerService.broadcastIntentLocked(ActivityManagerService.java:19504)
        at com.android.server.am.ActivityManagerService.broadcastIntent(ActivityManagerService.java:20142)
...........
```
どうやら権限がないようなので、調べてみるとAndroidManifestに権限の追加が必要みたいでした。

```ruby:AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest ....">

    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />

    <application.......>
        <activity.....></activity>
        <receiver android:name = ".(クラス名)" android:exported="true" >
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED" />
            </intent-filter>
        </receiver>
    </application>
</manifest>
```

uses-permissionのタグとactionタグに上記表記を追加しました。
こうすると、指定したreceiverのクラスが再起動時に動くようになるはずです。
それでも動かない場合は、上記のようにandroid:exported="true"を追加すると、うまくいく場合もあるようです。(外部に非公開ならfalseを設定する必要があります)

####②検証環境をエミュレーターに変更

なんだこれ合ってるのにと思いながら、長いこと検証していましたが、なかなかエラーは解消されませんでした。
(root権限で実行、android:enabled="true"をreceiverに追加、android:installLocation="internalOnly"をmanifestタグに追加などいろいろ試しました。)

そこで1度エミュレーターを使ってみようと思い、試しましたが、それでもだめでした。
これでうまくいくと思ったら、エラーは解消されませんでした。
また、いろいろ試している中でADB rootコマンドではなく、下記コマンドを使うと、エラーの原因がわかりました

```kotlin:ADBコマンド
>adb shell
generic_x86:/ $ su
/system/bin/sh: su: not found
```
**root権限になっていませんでした.....**

adb rootを使ったときはエラーも出てなかったので、問題なくできていると思ったのですが、できてなかったみたいです。(なんか表示してくれよと思いました)

確かに/system/binにはsuコマンドがありませんでした。

調べてみると、下記、記事に行き当たりました。

[ADBコマンドをroot権限で使いたい](https://teratail.com/questions/186703#reply-277537)

つまり、実機はもちろんroot権限は使えなくて、エミュレーターでも(Google Play)という表記があろものはroot権限が使えないのです。

それで、(Google APIs)という表記のデータを使い、試すとroot権限になれました。

```kotlin:ADBコマンド
>adb shell
generic_x86:/ $ su
generic_x86:/ #  (#に変更したので、root権限)
```

この状態で、再度実行するとうまくいきました！

```kotlin:ADBコマンド
#　am broadcast -a android.intent.action.ACTION_BOOT_COMPLETED -n (パッケージ名) / (クラス名)

Broadcasting: Intent { act=android.intent.action.ACTION_BOOT_COMPLETED flg=0x400000 cmp=com.kumaydevelop.todoreminder/AlarmBroadCastReciever }
Broadcast completed: result=0

```

なお、am broadcastで-nオプションをつけないとうまくいかなかったので、追加しました。
これでうまくいき確認が取れました。

今回は根本の原因を見つけるのに時間がかかってしまいました。試している段階である程度の見立てを早めに見つけないと、かなり時間がかかるなあと感じました。

####参照
[ADBコマンドをroot権限で使いたい](https://teratail.com/questions/186703#reply-277537)

[stack overflow](https://stackoverflow.com/questions/29370187/receive-boot-completed-and-exported-receiver-does-not-require-permission)
UITableviewにCaseiterableとCustomStringConvertibleを使ってみる



iOSエンジニアとして就職してから半年が経ちました、Swiftを初心者が半年間触って、とても便利に感じた一つの機能がProtocolです。
いくつもあるProtocolのなかで自分が特に便利に感じたものを紹介できたらと思いました


##Protocolとは
・class、struct、enumに実装できる
・複数のprotocolを１つのclassへ実装できる
・処理を実装先で定義できるため、後からの変更が容易
・身近な例だとUITableViewDelegateやUITableViewDatasourceなど



###定義



```swift
protocol ConvenienceProtocol{
    func convenienceFunc()
}
```

###実装

```swift
class ConvClass: ConvenienceProtocol{
    func convenienceFunc(){
        //実態は実装先で定義する
    }
}
```




#UITableviewにCaseiterableとCustomStringConvertibleを使ってみる

```swift
import UIKit

class TableViewController: UITableViewController{

    enum AnimalCellRows:Int, CustomStringConvertible, CaseIterable{
	    case nekochan 
	    case dog
	    case bird
		
	    var description: String {
		    switch self {
		    case .nekochan:	    return "nekochan"
		    case .dog: 			return "dog"
		    case .bird:			return "bird"
		    }
        }  
	}

    override func viewDidLoad() {
		super.viewDidLoad()
	}

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
		let cell = UITableViewCell()
		cell.textLabel?.text = {
			switch indexPath.row{
			case AnimalCellRows.nekochan.rawValue:	    return AnimalCellRows.nekochan.description
			case AnimalCellRows.dog.rawValue: 			return AnimalCellRows.dog.description
			case AnimalCellRows.bird.rawValue:			return AnimalCellRows.bird.description
			default: break											 
            }
			return ""
		}()
		return cell
	}

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
		return AnimalCellRows.allCases.count
	}
}

```
CaseIterableを使うことによってenumのcountを取得できるようになり、CustomStringConvertibleを使うことによりenumの値とは別にtitleを定義できました

#最後に
UITableViewをenumで管理したら便利なのではと思い使っていたのですが、enumだけですとcountが取れなかったり、cellのtextを直接入力しないといけなくて困っていたのですが、CaseiterableとCustomStringConvertibleを知り、変更があってもenum内だけで完結できるようになりました。
画像などを表示したい場合はCustomStringConvertibleをstructに変えて見るといいかもしれません
通販サイト構築のための技術基盤

次世代通販サイト構築の技術を分類し、整理するために、現在利用されている技術と、その次の世代の可能性を検討する。
 
 <この項は書きかけです。順次追記します。>

# web

apache
https://httpd.apache.org

nginx
https://nginx.org

Internet Information Services (IIS) for Windows Server
https://www.iis.net

# browser

Google Chrome
https://www.google.com/chrome/

Firefox
https://www.mozilla.org/en-US/firefox/new/

Safari
https://www.apple.com/safari/

Microsoft Edge
https://www.microsoft.com/en-us/windows/microsoft-edge

Opera
https://www.opera.com/ja

#言語

JavaScript
https://developer.mozilla.org/en-US/docs/Web/JavaScript

PHP
http://php.net

Python
https://www.python.org

Ruby
https://www.ruby-lang.org/ja/

Java
https://java.com/ja/

C#
https://docs.microsoft.com/ja-jp/dotnet/csharp/

GO
https://golang.org


#枠組み

AT&T Domain 2.0
SONATA
AWS IoT
Microsoft Bot Framework

Facebook
Line
Twitter

##JAVA
HADOOP

##JavaScript
Query
Adobe


 ＜この記事は個人の過去の経験に基づく個人の感想です。現在所属する組織、業務とは関係がありません。＞

### 最後までおよみいただきありがとうございました。

いいね　💚、フォローをお願いします。
#### Thank you very much for reading to the last sentence.

Please press the like icon 💚　and follow me for your happy life.
gitでfetchはできるのにpushできない時

# 起こった問題
```
% git push

remote: Repository not found.
fatal: repository 'https://github.com/XXX/XXX.git/' not found
```

fetchはできるのにpushしようとするとnot foundと怒られてしまう。

これは純粋にgithubの権限の問題。

# 権限

## read
メンバーはread(fetch)とcloneができる。

## write 
read権限に加えてpushすることができる。

## Admin
write & read に加えてメンバーを招待することができる。(settingをいじれる)
Juliaで数値計算　その5:コードサンプル〜Typeに対する計算を切り替える方法

Juliaで数値計算　その1：コードサンプル〜基本的計算編〜
https://qiita.com/cometscome_phys/items/31d0b811345a3e12fcef
Juliaで数値計算　その2：コードサンプル〜わかりやすい書き方編〜
https://qiita.com/cometscome_phys/items/dfd63f1f7b51bdda4ca4
Juliaで数値計算　その3：コードサンプル〜2次元プロット・可視化編〜
https://qiita.com/cometscome_phys/items/19b041b2f3364705f428
Juliaで数値計算　その4:コードサンプル〜MPI並列計算編
https://qiita.com/cometscome_phys/items/f1971f8590a6d69d472b
に引き続いて、FortranやCからやってきた人のためにJuliaの書き方を紹介する。
この記事はその5である。

今回は、Fortranでは実装しにくい方法を使って、Juliaでの面白い書き方を見てみることにする。
新しいTypeを作って、そのTypeの要素にmoduleを入れることで、「そのTypeに対する計算を切り替える」ということをしてみる。

#バージョン
Julia: 1.1.0

#ModuleをフィールドにもつType
以下のようなTypeを考える。

```julia
module atoms
    export Atoms,get_energy
    mutable struct Atom
        rx::Float64
        ry::Float64
        rz::Float64
        px::Float64
        py::Float64
        pz::Float64        
    end

    mutable struct Atoms
        atoms::Array{Atom,1}
        num::Int64
        method::Module
    end

    module dummy
        using ..atoms
        function get_energy(atoms::Atoms)
            println("error! This is dummy! No method exist in atoms")
        end
    end
    
    function Atoms()
        Atoms([],0,dummy)
    end

    function get_energy(atoms::Atoms)
        atoms.method.get_energy(atoms)
    end
        
end
```
このmodule atomsには、Atomsというtypeがあり、このtypeはフィールドとして、atoms,num,methodを持つ。atomsは要素がtype Atomの配列、numは整数、methodはmoduleである。
type Atomは、x,y,z,px,py,pzというフィールドを持つ。想定としては、原子の座標と運動量を保持するtypeがAtomで、全体の情報を持っているのがAtomsとなる。
なお、初期化として```Atoms()```を用意してある。

実は自分もこれまで気がついていなかったのだが、typeのフィールドとして、Moduleを持つことができる。初期化の時には、```dummy```というModuleを入れている。

このAtomsの"エネルギー"を求める関数を```get_energy```としよう。
コードとして、Atoms型の引数を入れる関数```get_energy(atoms)```を呼べばアウトプットとしてエネルギーを出すようにしたい。そして、エネルギーを求める関数は必要に応じて切り替えられるようにするとする。一つの方法としては、```get_energy(atoms,func)```として、使う関数funcを引数とすることができる。しかし、エネルギーを求める関数以外にも例えばその微分を求める関数func2とかも切り替えて使いたいとすると、```get_forces(atoms,func2)```みたいにしなければならない。そして、今どの手法を使って計算しているかを意識しておかないと、funcとfunc2に何を入れるかがわからなくなる。
これを解決するために、methodをフィールドに入れた。例えば、

```julia
module testmodule
    using ..atoms
    function get_energy(atoms::Atoms)
        e = 4
    end
end

using .atoms
using .testmodule

testatom = Atoms()
println(testatom)
get_energy(testatom)
testatom.method = testmodule
e = get_energy(testatom)
println(e)
```
と新しいmoduleである```testmodule```を定義して、methodフィールドにこれを代入```testatom.method = testmodule```してみる。すると、```get_energy(testatom)```をすればちゃんと```testmodule```内の```get_energy```を使うことができる。
同様に、新しい関数```get_forces```みたいなものを定義しておけば、```method```を異なるmoduleにするだけで、手法を切り替えることができる。
もし、新しい手法を追加したい場合には、```get_energy```を新しいmoduleに定義してmethodを切り替えるだけでコードの他の部分を一切変える必要がなくなる。
[js]プログラミング学習記録 #2　「フィボナッチ数列を求めてみた」

#今回は・・・
　前回と同じくGW課題(？)としてだされた課題の一つで、<b>余裕があればやってみよう！</b>的な課題。
　GWで暇してる私としてはやらない理由がないので、挑戦してみました。

　ちなみに、学校からの課題の詳細はこんな感じ

　0 から 31 までのフィボナッチ数を計算して画面に表示する。

　前回のプログラムをちょちょっと弄れば良いかな？

#私が書いたコード
```javascript:submit2.js
"use strict";
function fib(n) { 
    if(n == 0)return 0;
    if(n == 1)return 1;
    if(n == 2)return 1;
    return fib(n-1) + fib(n-2);
};

window.onload = function () {
    let i;
    document.write("n番目のフィボナッチ数列を「an」と表すと<br />")
    for (i = 0; i < 32; i++) {
        document.write("a" + i + " = " + fib(i) + "<br />" );
    }
}
```
　ふと思ったのが

```javascript:submit2_memo.js
    if(n == 0)return 0;
    if(n == 1)return 1;
    if(n == 2)return 1;
```
の部分、簡略化できたんじゃないかなって。

#今日のまとめ
　やる気がでてきたら、短縮のしかたを調べてみます。
なんでディレクトリに #vim しないの？

いまさらだけど、ディレクトリに対して vim コマンド打つとファイル開くのが激しく便利だよね！

`$ vim .`

![image](https://user-images.githubusercontent.com/13635059/56872653-827dc600-6a66-11e9-93d1-db4d591019bc.png)
![image](https://user-images.githubusercontent.com/13635059/56872685-d38dba00-6a66-11e9-9def-8f126ea9fbba.png)

このモードがあること自体は知ってたんだけど、なんで使ってなかったんだろう？

# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/1507








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
WordPress Jetpack プラグインの設定を無効化できないときの対処法

> Note: This article was originally posted at [WordPress Jetpack プラグインの設定を無効化できないときの対処法 - naoki.sato.name](https://naoki.sato.name/2019/04/29/wordpress-jetpack-plugin/).

WordPress をインストールして Jetpack プラグインを使用する際、設定を有効化するときは問題ないのに、無効化しようとすると次のようなエラーが発生して失敗する場合がある。

```text
設定の更新中にエラーが発生しました (無効なパラメーター: wpcom_publish_comments_with_markdown (Status 400))。
```

<img width="1149" alt="20190428-01.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140023/93212173-655f-9a6c-080d-5103e22aad53.png">

`wpcom_publish_comments_with_markdown` の部分は設定項目によって異なる。

## 参考

[CORESERVER（コアサーバー）がWordPressプラグインJetPackの設定更新時にエラーが出ることがあるがどのよう解決するか](https://www.shiseiweb.co.jp/tokyonetbiz/JetPack%E3%81%AE%E8%A8%AD%E5%AE%9A%E5%95%8F%E9%A1%8C) によると、 CORESERVER にインストールされた WordPress 環境で発生することがある模様。

当方も CORESERVER 上の WordPress で遭遇した。

## 対処方法

根本的な解消方法は不明。

設定の無効化について、確認できた方法は次のいずれか。

- [WordPress.com](https://wordpress.com) から設定を変更する
- Jetpack のデバッグメニューから当該モジュールを停止する

### [WordPress.com](https://wordpress.com) から設定を変更する

Jetpack の一部の設定は [WordPress.com](https://wordpress.com) からローカル WordPress サイトの設定変更が可能 (更に一部は [WordPress.com](https://wordpress.com) から **のみ** 操作可能)。
[WordPress.com](https://wordpress.com) で設定を無効化する際にはエラーは発生せず、ローカル WordPress サイトの設定も問題なく修正される。

詳細な手順は [上記の参考サイト](https://www.shiseiweb.co.jp/tokyonetbiz/JetPack%E3%81%AE%E8%A8%AD%E5%AE%9A%E5%95%8F%E9%A1%8C) を参照のこと。

### Jetpack のデバッグメニューから当該機能を停止する

ローカル WordPress サイトの `Jetpack` > `設定` 画面の下部にある `デバッグ` を開き、 `お使いのサイトで使用可能な Jetpack モジュールの全一覧にアクセスします。` にアクセスすることで、 Jetpack の全機能の一覧を参照することができる。

<img width="974" alt="20190428-02.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140023/b288603c-315c-d275-d96d-b32cef8ce286.png">

このページから当該の機能を `停止` する。

モジュール一覧から機能を `停止` する分にはエラーは発生しない。

参考: [Jetpack の全機能が有効/無効にできる隠しページの開き方](https://qiita.com/halpas/items/86c07fd35182d285fd45)

## おわりに

[WordPressのJetpackのマークダウンプラグインがすごく良さそうだったので翻訳しながらまとめました](https://2017.l2tp.org/archives/79) を拝見して、 Markdown 機能を試したあとに無効化しようとしたときにエラーに遭遇した。
焦った。
pythonのCounterを使用してMr.TalkBoxの英語歌詞の単語を出現数順にソートした記録

# 目的

以前からMr.TalkBoxの曲が大好きでした。
pythonで歌詞の単語から出現数が多い順でソートすれば、もっと歌詞の意味の深い部分を知れるかもと思い歌詞分析を行いました。（分析というか単語のソートのみ）

> Mr.Talkbox
https://www.mrtalkbox.com/

# 準備

TalkBoxの歌詞（今回はSomethin' Good - Mr. Talkbox）
> Somethin' Good - Mr. Talkbox
https://www.youtube.com/watch?v=TZFaD5nuzLQ

+pythonの実行環境

# コード

[こちら](https://qiita.com/mkunu/items/9b59e77de964a109e46b)を参考にさせて頂き、
歌詞から単語の出現数をカウントしてソートするコードを用意します。

```:sample.py
import re
from collections import Counter

target_text = """
I feel something 
feel something 
I feel something 
feel something good inside
I feel something 
feeling something 
I feel something 
feel something 

There is something that I’m going try to explain
/*以下省略 youtube参照 */
"""

words = re.split(r'\s|\,|\.|\(|\)', target_text.lower())
counter = Counter(words)
for word, count in counter.most_common():
    if len(word) > 0:
        print("%s,%d" % (word, count))
```

# テスト

```
$ python sample.py 
feel,40
i,30
something,28
to,17
just,10
got,10
me,9
good,8
that,8
you,8
it,8
baby,8
the,7
this,7
funky,7
inside,6
beat,6
don’t,6
music,6
up,6
and,6
is,5
now,5
makes,5
all,5
my,5
cus,4
so,4
have,4
worry,4
feet,4
we,4
there,3
im,3
turn,3
move,3
check,3
out,3
take,3
dance,3
feeling,2
i’m,2
a,2
need,2
want,2
what,2
your,2
come,2
talking,2
about,2
free,2
girl,2
on,2
in,2
get,2
going,1
try,1
explain,1
minute,1
saying,1
when,1
then,1
tight,1
right,1
make,1
spirit,1
alive,1
everybody,1
funk,1
rock,1
roll,1
help,1
us,1
its,1
time,1
joy,1
bomb,1
around,1
streets,1
with,1
melody,1
set,1
wat,1
wait,1
man,1
let,1
flip,1
thing,1
shoo,1
can,1
yah,1
hands,1
over,1
too,1

```

I feel somethingの単語が合わせて98個出てきており、
何かを感じ続けろとのメッセージを頂いたような気がします。すごくcoolです。

# 参考
[Mr.Talkbox](https://www.mrtalkbox.com/)
[Somethin' Good - Mr. Talkbox](https://www.youtube.com/watch?v=TZFaD5nuzLQ)
[英語論文から単語を抽出&登場回数順にソートし、さらに意味も載った単語帳まで作ってみた。](https://qiita.com/mkunu/items/9b59e77de964a109e46b)
[英単語帳作成～その2～](http://kuroyagi.hatenablog.com/entry/2017/10/07/202830)
Ansible で DEFAULT_SUDO_FLAGS から DEFAULT_BECOME_FLAGS に 変更

### SUDO_FLAG は 非推奨の Warning が 出た場合

```:Warning
[DEPRECATION WARNING]: DEFAULT_SUDO_FLAGS option, In favor of Ansible Become, which is a generic framework. See become_flags. , use become instead.
This feature will be removed in version 2.8. Deprecation warnings can be disabled by setting deprecation_warnings=False in ansible.cfg.
```

**/etc/ansible/ansible.cfg** を 変更してください。

```:ansible.cfg
*** sudo_flgas を コメントアウト ***

# What flags to pass to sudo
# WARNING: leaving out the defaults might create unexpected behaviours
#sudo_flags = -H -S -n

*** become_flags を 追記（もしくはコメント解除） ***

[privilege_escalation]
・・・
become_flags = -H -S -n
```

### Warning が でないことを確認

```:確認コマンド
# ansible-config dump --only-changed
・・・
DEFAULT_BECOME_FLAGS(/etc/ansible/ansible.cfg) = -H -S -n
・・・
```