OmniAICreator/Qiita-1.07M huggingface dataset:
PowerCLIでDRSの自動化レベルを切り替える

#DRS切り替える目的
大規模のリンククローン環境で、Deep Security Virtual Applianceを使用する場合、再構成(recompose)を実行する際はDRSが有効な場合は一時的に手動にすることが推奨されています。
[VDI環境で再構成(Recompose)、更新(Refresh)、再分散(Rebalance)を実施する際の注意事項](http://esupport.trendmicro.com/solution/ja-JP/1114930.aspx)

しかし、全部の作業をGUIで行うのはかなりダルい…
再構成自体は予約が簡単に出来ますので、GUIで予約するとして、じゃあそのタイミングだけDRS止めたいという場合にタスクスケジューラ等に組み込んで使ういたいのでDRSをPowerCLIで切り替えたいと思ったので調べてみました。


```Powershell
＄MyCluster = "DRSを設定したいクラスタ名"

#DRSを手動にする
Get-Cluster $MyCluster | Set-Cluster -DrsAutomationLevel PartiallyAutomated -Confirm:$false

#DRSを自動にする
Get-Cluster $MyCluster | Set-Cluster -DrsAutomationLevel FullyAutomated -Confirm:$false
```

#実際にこんな感じのスクリプト

##DRS手動に変更

```DRS-PartiallyAutomated.ps1
#PowerCLIモジュール読み込み
$null = Import-Module VMware.PowerCLI 2>&1
$null = Set-PowerCLIConfiguration -weboperationtimeout 30000 -Scope User -Confirm:$false

#vCenter接続
$vCenterServerAddress = "vCenter01"
$null = Connect-VIServer -Server $vCenterServerAddress -WarningAction 0

#DRS手動設定
＄MyCluster = "Cluster01"
$null = Get-Cluster $MyCluster | Set-Cluster -DrsAutomationLevel PartiallyAutomated -Confirm:$false

$null = Disconnect-VIServer -Server * -Confirm:$false
```


##DRS自動に変更

```DRS-FullyAutomated.ps1
#PowerCLIモジュール読み込み
$null = Import-Module VMware.PowerCLI 2>&1
$null = Set-PowerCLIConfiguration -weboperationtimeout 30000 -Scope User -Confirm:$false

#vCenter接続
$vCenterServerAddress = "vCenter01"
$null = Connect-VIServer -Server $vCenterServerAddress -WarningAction 0

#DRS手動設定
＄MyCluster = "Cluster01"
$null = Get-Cluster $MyCluster | Set-Cluster -DrsAutomationLevel FullyAutomated -Confirm:$false

$null = Disconnect-VIServer -Server * -Confirm:$false
```

実際にはログ残したりとか色々仕込むわけですが基本的にはこれだけです。
これをタスクスケジューラでメンテナンス時刻チョイ前にDRS手動に、翌日出勤時間前にはDRS自動にするように仕込んでおけば安心ですね。
~~再構成までスクリプトに組み込んでも良いんだけど、それはまた別のネタで~~
[DesktopBridge] 非UWP(WPF等)をパッケージする方法のまとめ

# やりたいこと
WPFアプリも、UWPアプリと同じようにappxなどのパッケージにして、ストアに登録したりできるらしい。
が、なんだかそのやり方が複数あって、しかも今はもう推奨しないやり方とかもあるらしく、どれがどういうやり方なのか、ちょっとネット見たくらいではわかりづらい。

勉強がてら、どんな方法があるのか、どういう特徴があるのかまとめたい。

# 非UWPアプリをパッケージする方法
非UWPのアプリをappxやmsixにパッケージすることを「デスクトップブリッジ」という。
DACはWindows 10, version 1607以降をサポートしており、
Windows 10 Anniversary Update (10.0; Build 14393)以降をターゲットにしたプロジェクトでのみ使用できる。

で、その非UWPアプリ(WinformやWPFなど)をパッケージする方法は、下記のようなものがあるらしい。

### 〇DAC(Desktop App Converter)
Desktop App Converterというアプリ、もしくはコマンドラインの場合、DesktopAppConverter.exeを使ってappxを作るやり方。
19/08/21現在、MSの推奨外となっていた。
https://docs.microsoft.com/ja-jp/windows/msix/desktop/desktop-to-uwp-run-desktop-app-converter

### 〇Windows Application Packaging Projectプロジェクト
Windows Application Packaging Projectプロジェクトを使用して、デスクトップアプリのパッケージを生成する方法。
https://docs.microsoft.com/ja-jp/windows/msix/desktop/desktop-to-uwp-packaging-dot-net

### 〇MakeAppx
MakeAppx.exeを使い、appxmanifest.xmlを作成してappxまたはmsixをつくるやり方。
Visual StudioやMSIX Packaging Toolなどのツールを使用せずにUWP/非UWPのアプリケーションをパッケージするためのやり方。
MakeAppxは、非UWPアプリをパッケージするためだけのものではなく、UWPアプリのappxやmsixからバンドルファイルを作ったりもする。
https://docs.microsoft.com/ja-jp/windows/msix/desktop/desktop-to-uwp-manual-conversion#make-appx
https://docs.microsoft.com/ja-jp/windows/msix/package/create-app-package-with-makeappx-tool

### 〇MSIXパッケージツール
MSIXパッケージツール、もしくはコマンドラインの場合、MsixPackagingTool.exeを使ってmsixを作るやり方。(appxは作れないっぽい)
Windows 10, version 1809以降が必要。
概要：https://docs.microsoft.com/ja-jp/windows/msix/package/manual-packaging-root
ツール：https://docs.microsoft.com/ja-jp/windows/msix/packaging-tool/create-app-package-msi-vm
CLI：https://docs.microsoft.com/ja-jp/windows/msix/packaging-tool/package-conversion-cli

# その他
Windows Application Packaging Projectプロジェクトについては**[こちら](https://qiita.com/tera1707/items/49855e37983377b929f3)**の記事でも、少し調べた。参照。

あと、ここ読んだ方がよさそう
パッケージの仕組み
https://docs.microsoft.com/ja-jp/windows/msix/desktop/desktop-to-uwp-behind-the-scenes

おかしなことを言っていたら、ご指摘頂けたら幸いです。
Ubuntu18.04LTS ユーザー登録のミス

社内メンバーをユーザー登録する際、

```
useradd hogihogi
```

で登録した結果、`\home`配下にhogihogiのディレクトリができなかった。
正しくは

```
adduser hogihogi
```

で`\home\hogihogi`を作成してくれる。
ごっちゃになっちゃうのでメモしときます。
ちなみにグループ追加は

```
adduser hogihogi group
```

で作成。ちゃんとできたか確認は

```
id -a hogihogi
```

で確認。useraddコマンド間違えて使っちゃった場合は

```
userdel -r hogihogi
```

で消してみる。プロセスIDが動いてて消せなかった場合は

```
kill -KILL processID
```

で消してから

```
adduser --force-badname hogihogi
```

でユーザーを再追加できる。

どれもどこかに書いてあることばかりだけど、備忘録として書き残します。。。
JSONアンエスケープ by Python

ニッチな内容だけど、JSONのvalueの中の入れ子なJSON形式を、「"」をアンエスケープさせつつ文字列として格納する方法のメモ。

jsonパッケージを使う。

```python
import json
```

まず、入れ子構造になったJSON形式を、jsonパッケージで文字列にdumpすると下記の通り。

```python
dict1 = {
    "key1" : {
        "key2" : {
            "key3" : "value"
        }
    }
}
s = json.dumps(dict1)
s
#出力結果
#'{"key1": {"key2": {"key3": "value"}}}'
```

という感じで、入れ子要素もすべて「"キー" : "値"」というフラットな構造の文字列となる。

これに対し、入れ子要素を文字列として保存し、さらにその入れ子も文字列として、、と保存する。
やり方は、単純に、段階的にjson.dumpsを呼べば良い。

```python
dict1["key1"]["key2"] = json.dumps(dict1["key1"]["key2"]) #文字列 '{"key3": "value"}'
dict1['key1'] = json.dumps(dict1["key1"])  #文字列 '{"key2": "{\\"key3\\": \\"value\\"}"}'
s = json.dumps(dict1)
s
#出力結果
'{"key1": "{\\"key2\\": \\"{\\\\\\"key3\\\\\\": \\\\\\"value\\\\\\"}\\"}"}'
```

という感じでJSON文字列の入れ子を作れる。
なお、json.dumpsは「"」をアンエスケープしてくれる仕様のため、入れ子の深さの数だけ「"」がアンエスケープした形で保持される。

復号には、同じ回数のjson.loadsを呼べば良い。

```python
key1_d = json.loads(s)
key1_d
#出力結果
{'key1': '{"key2": "{\\"key3\\": \\"value\\"}"}'}

key2_d = json.loads(key1_d["key1"])
key2_d
#出力結果
{'key2': '{"key3": "value"}'}

key3_d = json.loads(key2_d["key2"])
key3_d
#出力結果
{'key3': 'value'}
```
呼び出しのたびにエスケープされつつ、文字列が復元されるのがわかる。

ちなみに、文字列に日本語（UTF8)が含まれる場合、json.dumpsは、バイト列に変換するためアンエスケープがさらに激しいことになるが、驚かないようにされたい。

```python
dict1 = {
    "key1" : {
        "key2" : {
            "key3" : "こんにちは"
        }
    }
}

dict1["key1"]["key2"] = json.dumps(dict1["key1"]["key2"]) 
dict1['key1'] = json.dumps(dict1["key1"]) 
s = json.dumps(dict1)
s
#出力結果
'{"key1": "{\\"key2\\": \\"{\\\\\\"key3\\\\\\": \\\\\\"\\\\\\\\u3053\\\\\\\\u3093\\\\\\\\u306b\\\\\\\\u3061\\\\\\\\u306f\\\\\\"}\\"}"}'
```
と、なかなか読み難いものになる。

同様に復号も可能。

```python
key1_d = json.loads(s)
key1_d
#出力結果
{'key1': '{"key2": "{\\"key3\\": \\"\\\\u3053\\\\u3093\\\\u306b\\\\u3061\\\\u306f\\"}"}'}

key2_d = json.loads(key1_d["key1"])
key2_d
#出力結果
{'key2': '{"key3": "\\u3053\\u3093\\u306b\\u3061\\u306f"}'}

key3_d = json.loads(key2_d["key2"])
key3_d
#出力結果
{'key3': 'こんにちは'}
```

以上。
二次モーメントに関する話

# はじめに
おなじみの概念だが，少し離れるとちょっと忘れてしまうので，その備忘録．

# 二次モーメントとは

## モーメント
関数 $f:X\subset\mathbb{R}\rightarrow \mathbb{R}$ の $c$ 周りの $p$ 次 [モーメント](https://ja.wikipedia.org/wiki/%E3%83%A2%E3%83%BC%E3%83%A1%E3%83%B3%E3%83%88_(%E6%95%B0%E5%AD%A6)) $\mu_{p}^{(c)}$ は，

```math
\mu_{p}^{(c)} := \int_X (x-c)^pf(x)\mathrm{d}x
```
で定義される．$f$ が密度関数なら $M:=\mu_0$ は質量，$\mu:=\mu_1^{(0)}/M$ は重心であり，確率密度関数なら $M=1$ で，$\mu$ は期待値，$\sigma^2=\mu_2^{(\mu)}$ は分散である．二次モーメントとは，この $p=2$ のモーメントのことである．

離散系の場合も，$f$ が [デルタ関数](https://ja.wikipedia.org/wiki/%E3%83%87%E3%82%A3%E3%83%A9%E3%83%83%E3%82%AF%E3%81%AE%E3%83%87%E3%83%AB%E3%82%BF%E9%96%A2%E6%95%B0) の線形和であると考えれば良い．

## 応用
確率論における [分散](https://ja.wikipedia.org/wiki/%E5%88%86%E6%95%A3_(%E7%A2%BA%E7%8E%87%E8%AB%96)) や [最小二乗法](https://ja.wikipedia.org/wiki/%E6%9C%80%E5%B0%8F%E4%BA%8C%E4%B9%97%E6%B3%95) における二乗誤差の他，[慣性モーメント](https://ja.wikipedia.org/wiki/%E6%85%A3%E6%80%A7%E3%83%A2%E3%83%BC%E3%83%A1%E3%83%B3%E3%83%88) や [断面二次モーメント](https://ja.wikipedia.org/wiki/%E6%96%AD%E9%9D%A2%E4%BA%8C%E6%AC%A1%E3%83%A2%E3%83%BC%E3%83%A1%E3%83%B3%E3%83%88) といった，機械工学面での応用もあり，重要な概念の一つである．

# 性質
二次モーメントには，次のような面白い性質がある．(以下，積分範囲は省略する)

```math
\begin{align}
\mu_2^{(c)} &= \int (x-c)^2f(x)\mathrm{d}x \\
&= \int (x^2-2cx+c^2)f(x)\mathrm{d}x \\
&= \int x^2f(x)\mathrm{d}x-2c\int xf(x)\mathrm{d}x+c^2\int f(x)\mathrm{d} x \\
&= \mu_2^{(0)}-\mu^2M+(c-\mu)^2 M \\
&= \int \left(x^2-2\left(\mu_1^{(0)}/M\right)x+\left(\mu_1^{(0)}\right)^2/M\right)f(x) \mathrm{d}x+(\mu-c)^2M \\
&= \mu_2^{(\mu)}+\int (x-c)^2\big(M\delta(x-\mu)\big)\mathrm{d}x
\end{align}
```

つまり，重心 $\mu$ 周りの二次モーメントと，質量が重心1点に集中 ($f(x)=M\delta(x-\mu)$) したときの $c$ 周りの二次モーメントの和になり，($0<M$ なら) $c=\mu$ のとき最小になることがわかる．

$c=\mu$ のとき最小になるという性質は，統計において1点で代表するときに平均を使うのは，平均二乗誤差を最小にする代表値である[^1]ということや，空中で物を回転させると重心を通る軸の周りで回転することなどの理由になっている．

[^1]: 逆に言えば，平均でものを見るというのは，二乗誤差を気にするということであり，中央値でものを見るというのは，絶対値誤差を気にするということである，と言える．

## 分散の逐次計算とか
この性質から，(標本)分散の逐次計算などに応用できる．

(標本)平均については，$(x_1,x_2,\ldots,x_n)$ の平均

```math
m_n := \dfrac{1}{n}\sum_{i=1}^{n} x_i
```
がわかっているなら，$x_i$ をすべて保存していなくても，

```math
m_{n+1} = \dfrac{nm_n+x_{n+1}}{n+1}
```
のように逐次計算できることがよく知られているが，分散についても同様に，

```math
\begin{align}
\sigma_n^2 &:= \dfrac{1}{n}\sum_{i=1}^n (x_i-m_n)^2 \\
\sigma_{n+1}^2\! &\ = \dfrac{n\sigma_n^2}{n+1}+\dfrac{n(m_n-m_{n+1})^2+(x_{n+1}-m_{n+1})^2}{n+1} \\
&\ = \dfrac{n\sigma_n^2}{n+1}+\dfrac{n(m_n-x_{n+1})^2}{(n+1)^2}
\end{align}
```
のように計算できる．

さらに言えば，濃度 $n$，平均 $m$，分散 $\sigma^2$ の多重集合を $(n,m,\sigma^2)$ と表すと，2つの多重集合の結合は，

```math
(n_0,m_0,\sigma_0^2)\uplus(n_1,m_1,\sigma_1^2)=\left(n_0+n_1,\dfrac{n_0m_0+n_1m_1}{n_0+n_1},\dfrac{n_0\sigma_0^2+n_1\sigma_1^2}{n_0+n_1}+\dfrac{n_0n_1(m_0-m_1)^2}{(n_0+n_1)^2}\right)
```
のように書ける．$(n,m_n,\sigma_n^2)\uplus(1,x_{n+1},0)$ をこれに代入すると，上記の式に一致することがわかる．

また，これは連続体における二次モーメントの性質として，次のように記述できる($\sigma^2\rightarrow\mu_2=M\sigma^2$に変えている点に注意)．

```math
(M,\mu,\mu_2)\uplus(M',\mu',\mu_2')=\left(M+M',\dfrac{M\mu+M'\mu'}{M+M'},\dfrac{M\mu_2+M'\mu_2'+MM'(\mu-\mu')^2}{M+M'}\right)
```

# 不偏分散の分散の推定
話は変わるが，不偏分散の分散の推定について以前考察したことがあるので，リンクだけ貼っておく．

- http://cycloawaodorin.sakura.ne.jp/column/pdf/variance_of_variance.pdf
Leetcode #156: Binary Tree Upside Down

Solution 1: Recursively

```swift
func upsideDownBinaryTree(_ root: TreeNode?) -> TreeNode? {
    if root == nil || root?.left == nil {
        return root
    }
    let res = upsideDownBinaryTree(root?.left)
    root?.left?.left = root?.right
    root?.left?.right = root
    root?.left = nil
    root?.right = nil
    return res
}
```

Solution 2: Iteratively

```swift
func upsideDownBinaryTree(_ root: TreeNode?) -> TreeNode? {
    var current = root
    var pre: TreeNode?
    var next: TreeNode?
    var tmp: TreeNode?
    while current != nil {
        next = current?.left
        current?.left = tmp
        tmp = current?.right
        current?.right = pre
        pre = current
        current = next
    }
    return pre
}
```
【Javascript】第一級関数と高階関数、関数を作る関数

#概要
第一級関数・・・変数や配列（第一級オブジェクト）と同じように扱える関数
高階関数・・・第一級関数を引数として取る関数のこと

Javascriptは第一級関数な言語で使いやすいので以下Javascriptでやっていきます。
第一級関数な言語は以下に載ってます。
https://ja.wikipedia.org/wiki/第一級関数

例：マップ関数

```javascript
function add2(n) {
  return n + 2;
}

const arr = [1,2,3];
const result = arr.map(add2);

console.log(arr);
console.log(result);
// > [1, 2, 3]
// > [3, 4, 5]
```
#関数を作る関数
第一級関数と高階関数を使うことができれば、同じ処理を関数でまとめてしまうかのようにダブっている部分をまとめることができます。
例えば2つの配列の各要素を四則演算する関数は四則演算子以外すべて同じです。

```javascript
function addArray(arrA, arrB) {
  return arrA.map(function(_, i) {
    return arrA[i] + arrB[i];
  });
}

function mulArray(arrA, arrB) {
  return arrA.map(function(_, i) {
    return arrA[i] * arrB[i];
  });
}

function subArray(arrA, arrB) {
  return arrA.map(function(_, i) {
    return arrA[i] - arrB[i];
  });
}

function subArray(arrA, arrB) {
  return arrA.map(function(_, i) {
    return arrA[i] / arrB[i];
  });
}
```
ダブっているところを高階関数でまとめてしまいましょう。

（残念なことにJavascriptでは演算子は第一級オブジェクトでは無いので関数で改めて定義してあります。）

```javascript
function add(a, b) { return a + b; }
function mul(a, b) { return a * b; }
function sub(a, b) { return a - b; }
function div(a, b) { return a / b; }

function makeFunction(fn) {
  return function(arrA, arrB) {
    return arrA.map(function(_, i) {
      return fn(arrA[i], arrB[i]);
    });
  }
}

var addArray = makeFunction(add);
var mulArray = makeFunction(mul);
var subArray = makeFunction(sub);
var divArray = makeFunction(div);
```
makeFuncitonは関数（この場合は四則演算関数）を引数に取り、返り値として関数を返えす関数です。
内容は上のもののダブっていたとこはそのままに四則演算部分を関数で置き換えた関数を返しています。

#最後に
この手の関数の利用はLisp(commonlispやscheme)で学ばせてもらいました。あちらにはもっと自由で抽象的なマクロもあるので関数型プログラミング言語をやってみたい方はぜひLispを使ってみてください。Lispの宣伝でした。
【RubyonRails入門】独自のヘルパーを作成する

#[Rails]独自のヘルパーをつくる

##1.ヘルパー

```ruby:app/helpers/forms_helper.rb
module FormsHelper
    def hello(name)
        "こんにちは、" + name + "さん。"
    end
    
    def check_age(age)
        if age.to_i >= 15
            "ようこそ、お楽しみください。"
        else
            "このサイトは15歳以上限定です。"
        end
    end
end
```

####■to_i と to_s
`.to_i` ==> int型(数字)に変換する
`.to_s` ==> string型(文字)に変換する



##2.ヘルパーを元にした、ビュー

```erb:app/views/forms/formtest.html.erb
<%= hello("花子") %>
<!-- こんにちは、花子さん。 -->
```


```erb:app/views/forms/input_age.html.erb
<%= check_age(25) %>
<!-- ようこそ、お楽しみください。 -->

<%= check_age(25) %>
<!-- このサイトは15歳以上限定です。 -->
```
Vue.jsでタスクキューっぽいものを実現する

# はじめに
APIへのリクエストをするときに、連続でリクエストを送るようなシーンで連続送信を防止するために現在の処理が実行中の場合は処理を待つみたいなシーンがありました…

```javascript
let isConnecting = false
let isRetry =false
api: function () {
  if (!isRetry) {
    if (!isConnecting) {
      isConnectiong = true
      axios.get('api')
      .then(function(res) {
        // 成功時の処理
        isConnecting = false
        api()
      })
    } else {
      isRetry = true
    }
  }
}
```
こうやって書くとネストが深くなって、イケてないですよね
※ 正確にはこれじゃ失敗したときにつみますが

そこで、タスクキュー的なもので処理を予約するみたいなことをやりたいと思いました。

## JavaScriptのタスクキュー
いいライブラリが殆どない…

ということで、自分で頑張りました

# やってみた
Vue.jsで書いていたので、ここではvue.jsで書いてます。
通常のjavascriptでやるには変数の`watch`機能とかを頑張れば同じやり方でできると思います。
## やりたいこと
1. APIへリクエストを送る
2. APIへのリクエストが完了していない場合は、タスクキューにためて、前の処理が終わってから実行する
3. 貯める処理は2つまでで、最終待機しているタスクは最新の状態にしたい

## コード
```javascript
new Vue({
  el: "#app",
  data: function() {
    return {
      exQueue: []   // タスクを貯めておく用の配列
    }
  },
  watch: {
    // タスクを貯める配列の値に変化があったら呼ばれる関数
    exQueue: function(queue) { /*③*/
      // タスクが一つのときしか実行されないので、現在実行中の場合は無視される
      if (queue.length === 1) {
        queue[0].func(queue[0].params)
      }
    }
  },
  methods: {
    main: function () { /*①*/
      this.addQueue({ func: this.callAPI, params: params }) 
    },
    // タスクを追加する関数
    addQueue: function (job) {  /*②*/
      // 3の条件を満たすために貯めれるタスクは2つまで
      if (this.exQueue.length < 2) {
        this.exQueue.push(job)
      } else {
        // 2つを超えるときは後ろを最新のものに上書きする
        this.exQueue.pop()
        this.exQueue.push(job)
      }
    },
    // APIを呼び出す関数
    callAPI: function(params) { /*④*/
      axios.get('api')
      .then(function(res) {
        // 完了したタスク(配列の先頭を削除する)
        this.exQueue.shift()
      })
      .catch((error => {
        console.error('APIからの取得失敗')
      }))
    }
  }
})
```

## 解説

* ① → ② → ③ → ④ の順番に実行されていく
* ④ で `exQueue` が更新されるため、 再び ③　が実行される
* タスクがある場合は再度実行
* 残タスクがあるうちは繰り返し

といった形で、タスクキューを割と簡単に実装することができます。

# さいごに
簡単にVue.jsでタスクキューを実装してみました。
この辺の処理効率化みたいな部分て、ゴリゴリのサーバーサイドよりなコアな言語とかでよく繰り広げられることを見るのですが、JavaScriptだと以外にないなと思い書いてて楽しかったです。※そもそも言語の思想と違う感じはしていますが
とはいえ、if文のネストをしてしまうと、視認性も悪くなったり、ストックしたいタスクを増やすってなると改修が大変になるってことを考えると配列を見てタスクキューだって分かるようになりだいぶシンプルにかけると思います。APIの通信とか非同期の処理をするときに参考になればと思います。
React Native + React Navigation で、 Android の画面遷移アニメーションを iOS と同様にする

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103885/406ca584-ef13-da52-2c9d-524b3d5eba86.gif" height=400px>

React Navigation の画面遷移のアニメーション、 Android だけよくわからない。

デフォルトだと、モーダルが重なるようになるが、 iOS のように左から右に進んでいくようにしたい。


<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103885/f28b8fe8-35a4-11a7-194a-62a7c60ffbe9.gif" height=400px>


めっちゃ簡単にできた。

```tsx
import {
  createAppContainer,
  createStackNavigator,
  StackViewTransitionConfigs,
} from 'react-navigation'

const Navigation = createStackNavigator({
  screenA: ComponentA,
  screenB: ComponentB,
}, {
  mode: 'card',
  transitionConfig: () => StackViewTransitionConfigs.SlideFromRightIOS,
}

export const AppNavigation = createAppContainer(Navigation)
```

なんでこれがデフォルトじゃないんだ・・・笑

https://stackoverflow.com/questions/48018666/how-to-change-the-direction-of-the-animation-in-stacknavigator
Javascriptを用いたランダムなクジ

はじめに
===
[未来電子テクノロジー](https://www.miraidenshi-tech.jp/intern-content/program/)でインターンをしている<小栗>です。
「プログラミング初心者であるため、内容に誤りがあるかもしれません。
もし、誤りがあれば修正するのでどんどん指摘してください。

Javascriptを用いたランダムなクジ
===

```javascript
'use strict';

{
  const btn = document.getElementById('btn');

  btn.addEventListener('click', () => {
    
    const n = Math.random();
    if (n < 0.15) {
      btn.textContent = '$100'; 
    } else if (n < 0.35) {
      btn.textContent = '$20'; 
    } else {
      btn.textContent = '$1'; 
    }
  });
  btn.addEventListener('mousedown', () => {
    btn.classList.add('pressed');
  });
  btn.addEventListener('mouseup', () => {
    btn.classList.remove('pressed');
  });
}

```
if文のnの数値を変えれば、結果の割合を変えることができます。
自分は$100が15%、$20が35%、$1が残りの50%で出るようになっています。



一応自分のHTMLも記しておきます。

```html

<div class='lottery'>
        <div id='btn'>Lottery</div>
        <script src="js/main.js"></script>
</div>
```
Leetcode #981: Time Based Key-Value Store

```swift
class TimeMap {
    
    /** Initialize your data structure here. */
    private var timestamps = [String: [Int]]()
    private var dict = [Int: String]()
    
    func set(_ key: String, _ value: String, _ timestamp: Int) {
        timestamps[key, default: []].append(timestamp)
        dict[timestamp] = value
    }
    
    func get(_ key: String, _ timestamp: Int) -> String {
        if let ar = timestamps[key] {
            if ar[0] > timestamp {
                return ""
            }
            var start = 0
            var end = ar.count - 1
            while start <= end {
                let mid = start + (end - start) / 2
                if ar[mid] == timestamp {
                    return dict[ar[mid]]!
                } else if ar[mid] < timestamp {
                    start = mid + 1
                } else {
                    end = mid - 1
                }
            }
            return dict[ar[end]]!
        } else {
            return ""
        }
    }
}
```
micro:bitでLEDと温度センサーを試してみた

マルツ電波でmicro:bitのスターターキットが安売りしていたので購入。
地元のお祭りも終わったのでちょっといじってみた。

ブロックエディタ、JavaScript、Pythonで開発できるとのこと。
Windows10なので、ストアからMakeCode for micro:bitをダウンロード。

エディタはブロックとJavaScriptと切り替え可能。
JavaScriptでコードを書いてブロックに切り替える、その逆も可能。
ただし、JavaScript→ブロック→JavaScriptと切り替えると、コードがブロックから再生成しているのか、整形しなおしているのか、元に戻りませんね。

とりあえず、こんかいはLEDと温度センサーを使って、温度を簡易的に表示してみました。
エディタが良くできていて、パレットというのか基本や入力などを選ぶと利用できるメソッドなどが選べるのがよい。

で、書いたコードは以下の通り。
大したことはしていませんが、input.temperature()で取得した温度を文字列に変えて、1文字づつ表示しています。

```javascript
let leds: number[][][] = []
let tmp = 0
let num = 0
basic.forever(function () {
    leds = [
        [
              [0, 0, 1, 0, 0]
            , [0, 1, 0, 1, 0]
            , [0, 1, 0, 1, 0]
            , [0, 1, 0, 1, 0]
            , [0, 0, 1, 0, 0]
        ], [
              [0, 0, 1, 0, 0]
            , [0, 1, 1, 0, 0]
            , [0, 0, 1, 0, 0]
            , [0, 0, 1, 0, 0]
            , [0, 0, 1, 0, 0]
        ], [
              [0, 1, 1, 1, 0]
            , [0, 0, 0, 1, 0]
            , [0, 0, 1, 1, 0]
            , [0, 1, 0, 0, 0]
            , [0, 1, 1, 1, 0]
        ], [
              [0, 1, 1, 1, 0]
            , [0, 0, 0, 1, 0]
            , [0, 0, 1, 1, 0]
            , [0, 0, 0, 1, 0]
            , [0, 1, 1, 1, 0]
        ], [
              [1, 0, 0, 0, 0]
            , [1, 0, 1, 0, 0]
            , [1, 0, 1, 0, 0]
            , [1, 1, 1, 1, 0]
            , [0, 0, 1, 0, 0]
        ], [
              [0, 1, 1, 1, 0]
            , [0, 1, 0, 0, 0]
            , [0, 1, 1, 0, 0]
            , [0, 0, 0, 1, 0]
            , [0, 1, 1, 0, 0]
        ], [
              [0, 0, 1, 1, 0]
            , [0, 1, 0, 0, 0]
            , [0, 1, 1, 0, 0]
            , [0, 1, 0, 1, 0]
            , [0, 1, 1, 0, 0]
        ], [
              [0, 1, 1, 1, 0]
            , [0, 0, 0, 1, 0]
            , [0, 0, 1, 0, 0]
            , [0, 0, 1, 0, 0]
            , [0, 0, 1, 0, 0]
        ], [
              [0, 0, 1, 0, 0]
            , [0, 1, 0, 1, 0]
            , [0, 1, 1, 1, 0]
            , [0, 1, 0, 1, 0]
            , [0, 0, 1, 0, 0]
        ], [
              [0, 1, 1, 1, 0]
            , [0, 1, 0, 1, 0]
            , [0, 1, 1, 1, 0]
            , [0, 0, 0, 1, 0]
            , [0, 1, 1, 1, 0]
        ]
    ]
    let cnt;
    cnt = 0
    while (true) {
        tmp = input.temperature()
        let strTmp = tmp.toString()
        console.log(strTmp)
        num = parseInt(strTmp.charAt(cnt))
        for (let y = 0; y <= 5 - 1; y++) {
            for (let x = 0; x <= 5 - 1; x++) {
                if (leds[num][y][x] == 0) {
                    led.plotBrightness(x, y, 0)
                } else {
                    led.plotBrightness(x, y, 255)
                }
            }
        }
        cnt += 1
        if (cnt >= strTmp.length) {
            cnt = 0
        }
        basic.pause(200)
    }
})
```
Dockerを使ってみよう-1

この記事は　~~Dockerを分かった気になれる~~　Dockerのコンセプトとかあまり紹介しないまま、~~脳死~~コピペでなんとかいける仕様になってます。今回はDockerをインストールし、コンテナを作って起動させるところまで書きます。
次回はAWSのECRにコンテナをプッシュする作業について書きたいと思います。



仕事でDockerを使えって言われたけど、どこから手を付ければいいのか分からなかった数日前の自分のために…


#環境
・Amazon Linux AMI 2018.03.0 (HVM)
・Docker CE
・ポート4000

#Dockerをインストール
最初から**スーパーユーザー**になってたら楽かもしれませんね。

```ruby:アプデ
sudo yum update
```
```ruby:インストール
sudo yum install docker -y
```
```ruby:Docker起動
sudo service docker start
```

#Docker Imageを作成
ここでは`Dockerfile`、`requirements.txt`、`app.py`のファイルを三種類を作り、編集していきます
以下のコードはDocker公式のドキュメントから拝借しています。リンクは記事の一番下にあるのでぜひ見に行ってくださいね！
コードの詳細が書かかれてますよ（英語）


##ファイルを作成



```
touch Dockerfile
```

内容はこれに編集します

```ruby:Dockerfile

# Use an official Python runtime as a parent image
FROM python:2.7-slim

# Set the working directory to /app
WORKDIR/app

# Copy the current directory contents into the container at /app
COPY. /app

# Install any needed packages specified in requirements.txt
RUN pip install --trusted-hostpypi.python.org -rrequirements.txt

# Make port 80 available to the world outside this container
EXPOSE80

# Define environment variable
ENVNAME World

# Run app.pywhen the container launches
CMD["python", "app.py"]
```

`requirements.txt`も作り、編集していきます

```ruby:requirements.txt
Flask
Redis
```
`app.py`も同様です

```ruby:app.py

from flask import Flask
from redis import Redis,RedisError
import os 
import socket
# Connect to Redis
redis = Redis(host="redis", db=0, socket_connect_timeout=2, socket_timeout=2)

app=Flask(__name__)

@app.route("/")
def hello():
    try:
        visits = redis.incr("counter")
    except RedisError:
        visits = "<i>cannot connect to Redis, counter disabled</i>"

    html = "<h3>Hello {name}!</h3>"\
            "<b>Hostname:</b> {hostname}<br/>"\
            "<b>Visits:</b{visits}"
   return html.format(name=os.getenv("NAME","world"),
hostname = socket.gethostname(), visits=visits)

if__name__=="__main__":

    app.run(host='0.0.0.0',port=80)
```



#Dockerを走らせます
いよいよですよ…

##まずはビルドから
friendlyhelloのタグをつけてやりますので、タグの名前を変更しても大丈夫です

```
docker build -t friendlyhello .
```

Docker imagesでビルドを確認します

```
docker images
```
先ほどつけた名前が*REPOSITORY*の下にでますので、ちゃんとありましたら走らせます！！！！
**ポート4000**を使うのでEC2インスタンスの方でもちゃんと開けておいてくださいね

```
docker run -p 4000:80 friendlyhello
```

アウトプットに*'#Running on http://0.0.0.0.80/ (Press CTRL+C to quit)'*　がでましたら、インスタンスのPublic IP アドレスとポート番号を指定して実際に***Hello World!***が表示されてるか確認しにいきましょう

簡単にいうとこんな感じです↓
        http://your_public_ip:4000/



#参考にしたサイト

この記事で使用したコードはDocker公式のご提供です
・https://docs.docker.com/get-started/part2/

アマゾンさんは日本語に対応していますので
・https://docs.aws.amazon.com/AmazonECS/latest/developerguide/docker-basics.html
【ABAP】Code push down実践編（メモ）

##趣旨
実務の中で「これはCode push downできそう」と思ったネタを実装します。（ネタはエッセンスのみで、実際の要件とは異なります）
思いついたベースでこの記事に追加していきます。

**Code push downに関するこれまでの記事**
[【ABAP】Code push downを実現する方法](https://qiita.com/tami/items/12bfdaae112965250b31)
[【ABAP】Code push down実装編](https://qiita.com/tami/items/72fc1d4de4ad21edf62a)

##要件1：EKKOとEKPOを結合、EKPOは削除されていない1件だけ
発注ヘッダ(EKKO)と明細(EKPO)を結合したデータを取得します。
ただし、EKPOから欲しいのはプラント、保管場所情報のみです。
1発注内でプラント、保管場所は共通という制約があるので、EKPOの削除されていない明細の中から最小の明細を取得したいです。

###考えたこと
####①INNER JOINの条件に最小の明細番号を指定できないか？

```abap
SELECT EBELN, EKORG, EKGRP, EBELP, WERKS, LGORT
  FROM EKKO
  INNER JOIN EKPO
     ON EKKO~ebeln = EKPO~EBELN
    AND EKPO~ebelp = select min( ebelp ) from ekpo where ebeln = '4500000001' and loekz is initial.
```

シンタックスとしてONの条件にSELECTを書けないためダメでした。
あと、発注番号がパラメータなどで指定されないとこの書き方では無理。

エラー画面
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276021/5d50c824-53ca-6e85-b60b-211a68af04cc.png)


####②CDSビューを2つ作って最小の明細番号を条件に取得できないか？
ちょっと面倒ですが、2つのCDSビューを作ることにしました。
1. EKPOから発注番号と削除されていない最小の明細番号の組み合わせを取得するビュー
2. EKKOと1.のビューを結合し、さらにEKPOを足したビュー

ビュー1
※アノテーションは省略しています

```abap
define view ZMOB58_I_MIN_PO as select from ekpo {

    key ebeln,
    key min( ebelp ) as ebelp
             
}where loekz is initial
group by ebeln
```

ビュー2

```abap
define view ZMOB58_C_PO
  as select from ekko            as h
    inner join   ZMOB58_I_MIN_PO as min_i on h.ebeln = min_i.ebeln
  association [1] to ekpo as _ekpo on  min_i.ebeln = _ekpo.ebeln
                                   and min_i.ebelp = _ekpo.ebelp
{

  key h.ebeln,
  key ebelp,
      bukrs,
      bsart,
      lifnr,
      ekorg,
      ekgrp,
      waers,
      _ekpo.werks,
      _ekpo.lgort

}
```

ビュー2の実行結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276021/139ee724-3f75-3f34-5471-b5b5fe047b9e.png)

ビュー2をABAPから呼ぶこともできます。

```abap
SELECT * from zmob58_c_po
   INTO TABLE @DATA(lt_ebelp).
```

###結論
残念ながらSQL一発では無理で、CDS2つでできました。
ビューを定義するのがちょっと面倒ですが、ビューごとに正しい結果になっているか確認しながら進められるのでわかりやすいと思いました。
FUZE BASICを触ってみる１（最初の一歩編）

# 今日やること

FUZE公式で配布されている、Worksheets(https://www.fuze.co.uk/worksheets-tutorials.html)
の `Coding Projects Book 1 - The Basics` を斜め読みしてできるところまで進めてみます。

# アンカー

前の記事）[FUZE BASICを手元のMacで動かそう(FUZE BASIC on Ubuntu)](https://qiita.com/suruseas/items/a3ec87901b457e3e0e36)

# とりあえずやってみる

前回に引き続き相変わらず画面上のアイコンから起動しないのでterminalから起動します。

起動した青い画面は `immediate mode` の画面で、その名のとおりコマンドを即座に実行できる画面です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144344/f887da12-0c94-f02f-52bc-2df0238a11ad.png)

この画面で `F2` を押すとプログラムエディタが表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144344/9ca3b3b2-9c62-92cc-4817-7d10126eb2b8.png)

もう一度 `F2` を押すとファイル保存のダイアログが表示され、その後 `immediate mode` に戻ります。
あとはなんとなくわかるのでフィーリングで行きましょう。

# project: 1a

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144344/a62a266a-cae2-b448-c853-75f540ac5c1f.png)

- プログラム実行は `RUN` もしくは `F3` でおけ。
- 命令は小文字でもよい
    - と思ったけどエディタを起動して普通に入力すると大文字になる？ `caps lock` が勝手にONになる？
- ソースのインデントはつけてもつけなくても良さげ
- きちんとシンタックスハイライトされる
- プログラムを途中で止めるには `ESC`
- PRINT命令はデフォルトで改行コードあり。 `;` をつけると改行コードなしになるみたい
    - あとできちんとドキュメントを見よう
- WAITは秒単位(少数指定も可)なんだけど…なんか本当に１秒なのかタイミングがずれるような？

# Project: 1b

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144344/a4d87014-c64a-975a-c97d-430470c3a0d2.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144344/4493c92b-af89-a385-f0ae-6e64bcfb9196.png)


- 行番号が熱い！ちなみに今のVisualBasicもたしか行番号かけたはず。
- 特に目新しいことなし！

# Project: 2

変数のお話みたい。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144344/c8386a9a-b338-be94-bb19-3b2e2511ab45.png)

- `REPEAT UNTIL` が使える
- `END` でプログラムが終わる

# Project: 4 "Let's get Quizzical"

`INPUT` と `IF THEN` 構文ですね。いよいよプログラムっぽくなってきた。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144344/583d0af2-eb67-4469-9012-0dfeb3fff57b.png)

- `ENDIF` 懐かしい。これぞBASIC！
- 文字列を格納する変数名の後ろに `$` をつける！懐かしい！
 
# 所感

子供の頃を思い出します。全部ローマ字で文字を書いていたなー
今日はここまで。
テスト13

```vb

'クラスモジュール名：Btnhdl

Private WithEvents btn As MSForms.TextBox

Public Sub setbtn(ByVal Newbtn As MSForms.TextBox)
Set btn = Newbtn
MsgBox btn.Value
End Sub

'Private Sub btn_click()
'MsgBox btn.Value
'End Sub

'----------------------------------------------------

'フォームモジュール
Private Sub UserForm_initialize()

'UserForm_initializeの部分をコマンドボタンのクリックイベントにする

Static btnArray() As Btnhdl

Dim ctr As MSForms.Control
Dim num As Long

For Each ctr In Controls

    If TypeOf ctr Is MSForms.TextBox Then
    
        num = num + 1
        ReDim Preserve btnArray(1 To num) As Btnhdl
        Set btnArray(num) = New Btnhdl
        btnArray(num).setbtn ctr
    
    End If

Next

End Sub

'会社コード
'会社名

'申請コード
'1
'2

'担当者コード1
'名前
'アドレス

'担当者コード2
'名前
'アドレス

```
【RubyonRails入門】 ハッシュの値を取得する

#ハッシュ入門


##二段階構造のハッシュの値をとる

```ruby
d = {"test" => {"japanese" => 80, "science" => 60, "English" => 90}}
```

"test"の中に、
さらに"japanese","science","English"のハッシュがある。

===> "japanese"の中の"kobun"の値をとりたい！！

##"test"の中の"japanese"の値をとる


```ruby
d["test"]["japanese"]
```
答えはシンプルでした。

逆に、`d["test"]["japanese"]`は、
`d => {"test" => {"japanese" => xxx}}`
となることがわかります！
Leetcode #714: Best Time to Buy and Sell Stock

```swift
func maxProfit(_ prices: [Int], _ fee: Int) -> Int {
    var cash = 0
    var hold = -prices[0]
    for i in stride(from: 1, to: prices.count, by: 1) {
        cash = max(cash, hold + prices[i] - fee)
        hold = max(hold, cash - prices[i])
    }
    return cash
}
```
expressとreactで作るSPA(0) - 準備編

# 概要

サーバサイドをexpress、フロントエンドをreactで構成するSPAのWebアプリケーションを作る流れを書いていきます。
Ubuntu 18.04 LTSで必要なものを一からinstallしながら進めていきます。

最初はコードを書き始める前に必要な準備。

# Git
## インストール
Ubuntu 18.04 だと標準リポジトリからinstallでもバージョン2.17.1が落ちてきて、まあそれなりに新しいんですが、少し古いといえば古い。
なので以下のコマンドで最新のGitを取得します。

```shell
sudo add-apt-repository ppa:git-core/ppa
sudo apt update
sudo apt install git
git --version
# -> git version 2.21.0
```
## 初期設定

以下のコマンドで最低限の初期設定をします。
これをしておかないと、Gitでcommitができません（たぶん）。

```shell
git config --global user.name "<ユーザ名>"
git config --global user.email "<メールアドレス>"
```
# curl

デフォルトでcurl入ってないみたいなので、以下でインストール。

```shell
sudo apt install curl
```
# node.js

node.jsのインストール方法は色々ありますが、rubyのrbenvと同じように使えて、
プロジェクトごとにnode.jsのバージョンを変えられる ~~ndenvが良いと思います。~~
ndenvはもうメンテされてなくて非推奨でした。nodenvが後継みたいです。

nodenvのinstallは、直接インストールしても良いんですがanyenvというのを使用すると
他の**envもお手軽にインストールできるようになるのでそちらを使います。

詳しくはコチラ。
[anyenvを使う](https://qiita.com/zaburo/items/8ac16133c3823c6e6ad6)

ここでは実行するコマンドを書いておきます。

```shell
git clone https://github.com/anyenv/anyenv ~/.anyenv
echo 'export PATH="$HOME/.anyenv/bin:$PATH"' >> ~/.bashrc
echo 'eval "$(anyenv init -)"' >> ./.bashrc
exec $SHELL -l
anyenv install --init
anyenv install -l # インストール可能な**envを表示
anyenv install nodenv
echo 'eval "$(nodenv init -)"' >> ~/.bashrc
exec $SHELL -l
nodenv install -l # インストール可能なバージョンの表示
nodenv install 12.3.1 # お好みのバージョンでどうぞ
nodenv rehash
nodenv global 12.3.1 # インストールしたバージョンを指定
node --version
# -> v12.3.1
```

# Yarn

JavaScriptのパッケージマネージャには、Yarnを使います。
Yarnのインストールは以下。

```shell
curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add -
echo "deb https://dl.yarnpkg.com/debian/ stable main" | sudo tee /etc/apt/sources.list.d/yarn.list
sudo apt update
sudo apt install yarn
```

# 参考
[Git Download for Linux and Unix](https://git-scm.com/download/linux)
[サルでもわかるGit入門 チュートリアル1 Gitの基本 初期設定](https://backlog.com/ja/git-tutorial/intro/06/)
https://github.com/anyenv/anyenv
https://github.com/nodenv/nodenv
[インストール | Yarn](https://yarnpkg.com/ja/docs/install#debian-stable)
SQLServer CONVERT 秒間で抽出したい

使いたいときにいつも忘れてしまうため備忘録。

■ 秒間
CONVERT(VARCHAR, getdate(), 120)  --秒間

ex). 2019-11-11 15:18:43

■ 分間
left(CONVERT(VARCHAR, getdate(), 120), 16)  --分間

ex). 2019-11-11 15:20


■ 年月日
CONVERT(VARCHAR, getdate(), 111)　--年月日

ex). 2019/11/11
Leetcode #1048: Longest String Chain

```swift
func longestStrChain(_ words: [String]) -> Int {
    let words = words.sorted { $0.count < $1.count }
    var dp = Array(repeating: 1, count: words.count)
    var answer = 1
    for i in stride(from: 1, to: words.count, by: 1) {
        for j in stride(from: i-1, through: 0, by: -1) {
            let diff = words[i].count - words[j].count
            if diff == 0 {
                continue
            } else if diff > 1 {
                break
            } else {
                if isFront(words[j], words[i]) {
                    dp[i] = max(dp[i], dp[j]+1)
                }
                answer = max(answer, dp[i])
            }
        }
    }
    return answer
}

private func isFront(_ previous: String, _ next: String) -> Bool {
    var i = 0
    var j = 0
    var previous = Array(previous)
    var next = Array(next)
    while i < previous.count {
        if previous[i] == next[j] {
            i += 1
            j += 1
        } else {
            j += 1
            if j - i > 1 {
                return false
            }
        }
    }
    return true
}
```
pythonでべたに使うもの(python3)

# 目的
pythonをちょこちょこ調べらながら書いていて、今後も使用するであろうものをまとめる。
※初心者向け

# dict(辞書)からキーがなくても落ちない方法
下記のようにdictから取得すると実行時にエラーが発生してしまう。

```python
dict = {}
print(dict['test'])
```

``` txt:実行結果
Traceback (most recent call last):
  File "sample.py", line 2, in <module>
    print(dict['test'])
KeyError: 'test'
```


dictのgetメソッドを使用することで、キーがなくてもエラーにならずにNoneが返却される。

```python
dict = {}
print(dict.get('test'))
```

```txt:実行結果
None
```

# 数値のチェック

```python:
# 数値であるかチェックします。
# 半角数値、少数の場合Trueを返します。
def isNum(num):
    return re.compile('^([1-9]\\d*|0)(\\.\\d+)?$').match(num) is not None
```

# 正の整数のチェック

```python:
# 正の整数(0を除く)であるかチェックします。
# 正の整数(0を除く)である場合Trueを返します。
def isPlusInteger(num):
    return re.compile('^[1-9]\\d*$').match(num) is not None
```

# 少数第1位で切り捨て

```python:
from decimal import Decimal,ROUND_DOWN

def roundDown(val):
    return Decimal(val).quantize(Decimal('0.1'), rounding=ROUND_DOWN)
```

# 少数を整数に切り捨て

```python:
from decimal import Decimal

# 整数に切り捨てます。
def truncateNum(val):
    return str(math.floor(Decimal(val)))
```

# 日付のフォーマット

```python:
from datetime import datetime

# YYYYMMDDをYYYY/MM/DDの形式にフォーマットします。
def dayFormat(day):
    return datetime.strptime(day, '%Y%m%d').strftime('%Y/%m/%d')
```

# AWSで日本時間で現在日時を取得します。

```python
def getNowTime():
    # AWSの時刻は、UTCなのでJSTに変換
    return datetime.now(timezone(timedelta(hours=+9), 'JST'))
```

# 最後に
メソッド名のセンスのなさが悩み。
メール送信のパスワードが破られたらどうなるか

##序章

あるところに、世界に公開している メールサーバＡ がありました。
このサーバで aaaa@xxxx.yyy（仮称）というメールアドレスを、
登録／運用していました。

この aaaa@xxxx.yyy には送信用パスワードが設定されていましたが、
ある日、何者かによって、パスワードが ばれてしまいました。
（おそらくパスワードの総当たり攻撃で、偶然 判明したのでしょう。）

このパスワードを引き当てた相手（ファースト スパマー）は、
正規のアドレス aaaa@xxxx.yyy から、世界中にスパムメールを送りつけたのです。

それだけではありません。
ファーストスパマーは、親切にも他のスパマー仲間に
メアドとパスワードを教えてあげたのです（たぶんですが。）

その結果 世界中から、メールサーバＡ の送信用の
２５番ポート（５８７番や４６５番も）にアクセスが集中したのです。

##対応開始

メールサーバＡ が どうもおかしいということで、さっそく調査しました。
数時間かけてようやく、上記の現象を把握しました。

まずはスパムメールを止めないといけません。

：
どうやって？
：

メールサーバＡ では postfix を利用していて、postfix の停止を考えましたが、
それだと aaaa@xxxx.yyy 以外のアカウントも使えなくなってしまうので、
この案は却下しました。

とりあえず aaaa@xxxx.yyy のパスワードを変えてみました。
長いパスワードに変えてやりましたよ。

これで大丈夫、と netstat コマンドで確認すると・・・
スパマーからの接続は まだ残っています。なぜ？

おそらく、新規の接続はできなくなったけど、
パスワード変更前のコネクションが、切断されずに残っているのでしょう。

それではと、これらコネクションを iptables コマンドで切断してみました。

ＩＰアドレスごとに切断するので、何個ものコマンドを根気強く投入しました。
少し時間は かかりましたが、残っていたコネクションはすべて、
消えて無くなりました。

これでＯＫ！ とその日は家に帰りました。

##翌日・・・

はぁぁっ！？
スパムメール送信は、まだ続いていました。

パスワードが再度ばれた？ のではありません。
じつは送信キューに、大量の処理待ちが残っていたのです。

スパマーは昨日のコネクション接続時に、
これでもか！と送信要求をしていたのでしょう。
そのため１日経った時点でも、まだ数万のキューが残っていました。

業を煮やした私は、最終手段をとります。
「キュー全削除じゃぁっ！」

参考ＵＲＬ
[Postfixのメールキューを確認、削除する方法](https://qiita.com/pb_tmz08/items/60c760d71da00fcf5d9b)

##最後に

これでようやく、ほんとにスパムメール送信が収まりました。

スパムメールの受信も厄介ですが、送信のほうは さらに厄介です。
なにせ加害者になってしまいますからね。ほんと気を付けましょう。

（まぁスパムメールの大半は、宛先不明で届かなかったようですが。）

ちなみに破られたパスワードは、文字数も短く「弱い」パスワードだったようです。
今後はアカウント作成時、「強い」パスワードを要求するように設定変更しました。
TypescriptのUnion型でどれかを判定する

# TypescriptのUnion型でどれかを判定する方法
TypeScriptのUnion型が便利なので使いまくっていたら判定時に詰まったので備忘を兼ねて

## 基本的な型のみで構成される場合
typeOfで判定すれば良い

``` typescript
type Hoge = number | string

(h:Hoge) => {
  if(typeof h === 'string'){
    //この中ではhはstring型として扱える
  } else {
    //hはnumber型として扱える
  }
}

```

## 自分で組んだ型の場合

### 手段1:type assertion＋片方にしかないPropertyを使う
~~TypeScriptの型推論は頭がいいのでこれで通る。~~
訂正：通らなかった

```typescript

type Fuga = {
    f:string
}

type Piyo = {
    p:string
};

type Hoge = Fuga|Piyo;

(h:Hoge) => {
    if((h as Fuga).f){
      //hはFuga
　　　 //(h as Fuga).f という形で処理を行う
    }else{
      //hはPiyo  
    }

}
```
Type Assertionは``(<Fuga>h)``のようにも書けるが、tsxファイル内だとjsxのタグだと誤認されるので注意。


### 手段2：判別共用体を使う
Union型の候補に同じproperty名で別の値の固定値を指定することによって判別する。
この時に利用する固定値(タグ)のキーは自由に決めて良い
この場合はswitchも利用可能。
基本的には、型推論が効くこちらの方が使いやすそうか。

``` typescript
type Fuga = {
    k:'fuga'
}

type Piyo = {
    k:'piyo'
};

type Hoge = Fuga|Piyo;

(h:Hoge) => {
    switch(h.k){
        case 'fuga':
            /// hはFuga
            break;//当然breakしないと下でPiyoとして扱えない
        case 'piyo':
            /// hはPiyo
            break;    
    }

}

```
【Android】NumberPickerでフォーカスが当たらないようにする

これをやめたい。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112818/5c11aa38-2afc-e2db-afb1-842116d13069.jpeg" width="320"/>

# 解決法
xmlに`android:descendantFocusability="blocksDescendants" `を追加してあげればOK。

```xml
<NumberPicker
    android:id="@+id/num_picker_1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:descendantFocusability="blocksDescendants" //追加
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toBottomOf="parent"/>

```

[android - Disable soft keyboard on NumberPicker - Stack Overflow](https://stackoverflow.com/questions/8854781/disable-soft-keyboard-on-numberpicker)
RailsでCSVを出力する機能を実装(Shift_JIS対応)

最近の勉強で学んだ事を、ノート代わりにまとめていきます。
主に自分の学習の流れを振り返りで残す形なので色々、省いてます。
Webエンジニアの諸先輩方からアドバイスやご指摘を頂けたらありがたいです！

#CSVエクスポート(出力)
以下の記事を参考にさせて頂きました！
[Ruby on RailsでCSV一覧出力する３つの方法](https://tisnote.com/ruby-on-rails-csv/)

まずはcsvでしっかり出力できるかを試したかったので参考にした記事の
①csv出力用のアクションを作成する方法を行いました！
これは記事にも書いている通りREST設計に背く形となるので１つのデメリットですね。
なぜならRESTfulに設計するとindexで処理すべき内容だからです。


アクションはこのように定義しました。

```
def export
    @members = Member.all
    send_data render_to_string, filename: "members_#{Time.now.utc.strftime("%Y/%m/%d %H:%M:%S")}.csv", type: :csv
  end
```

いつ出力したのかをファイル名で確認できるようにこのようなコードを追記した感じです。

```
filename: "members_#{Time.now.utc.strftime("%Y/%m/%d %H:%M:%S")}.csv"
```

あとはルーティングを設定し、csv出力ファイルであるexport.csv.rubyファイルを作成して出力したい値を設定します！

```
require 'csv'

CSV.generate do |csv|

    csv_column_names = [
        "アカウントID",
        "ユーザー名",
        "メールアドレス",
        "姓",
        "名",
        "性別"
    ]
    csv << csv_column_names

    @members.each do |member|
        csv_column_values = [
            member.account_id,
            member.user_name,
            member.email,
            member.last_name,
            member.first_name,
            member.gender
      ]
     csv << csv_column_values
  end
end
```

これで最後にファイル出力する為のリンクを作成したら終了です。

```
<%= link_to "csv出力",csv_export_path(format: :csv) %>
```

#エクセルで読み込むためのCSVファイルにする
csvファイルを無事出力できて喜んでいたのですがここで問題がなんとエクセルと開くと文字化けが発生！
原因を調査していると理由が判明

RailsアプリケーションでCSV出力をしたファイルをExcelで開くと文字化ける。
理由はExcelがUTF-8のファイルをShift_JISで開こうとしてしまうため。

エクセルはShift_JISしか対応してみたいな
なんやそれ〜めちゃくちゃめんどくさい笑

[この記事](https://qiita.com/bbq-all-stars/items/03fa27eeb6f46b580525)に書いているみたいに文字コードの問題を解決する為に[「BOM」](https://ja.wikipedia.org/wiki/%E3%83%90%E3%82%A4%E3%83%88%E3%82%AA%E3%83%BC%E3%83%80%E3%83%BC%E3%83%9E%E3%83%BC%E3%82%AF5)を使えば上手くいくようなのですが僕の場合は上手くいかず。

参考ページを見てこのようにしたら上手くいきました！

```
send_data render_to_string.encode(Encoding::Windows_31J, undef: :replace, row_sep: "\r\n", force_quotes: true), filename: "members_#{Time.now.utc.strftime("%Y/%m/%d %H:%M:%S")}.csv", type: :csv
```
##参考ページ
[Rubyでエンコードのエラーの対処](https://qiita.com/sibakenY/items/c2fb5754e605a2dd602d)
[RailsからShift-JISとUTF-8でCSV出力する](https://qiita.com/simukappu/items/be4a0c998c2a0591ed52)
[send_dataでファイルを書き出すときの日本語ファイル名の文字化け対策](http://rails.hatenadiary.jp/entry/2013/01/31/104006)
[ruby on rails で utf-8 から shift_jis にしたかった](http://noterr0001.hateblo.jp/entry/20131007/1381157708)
[[Rails] SJISのエクスポートでの「ActionView::Template::Error (U+2212 from UTF-8 to Windows-31J):」のエラー対応](https://developer-collaboration.com/2017/12/17/rails-sjis-error/)
PythonのIDLEにIVS付きの文字を入力すると落ちる件のメモ

#落ちる
　IDLEのシェルまたはエディタで IVS付きの文字を入力すると、何も言わずに実行を終了する。
　※ Windows10 の Python 3.7.3 (64bit) で確認。Windows 以外はわかりません。

　キーボードからIVSを入力するのは少々面倒なので、大抵はコピペした文字列にそういう文字が混じっていたというケースになります。そういったデータを扱う機会の多い人が IDLEで何かしようと企んだ時だけ起こりうる事故で、とてもびっくりします。
　※ たとえば次項「IVSとは」の本文を貼り付けると、落ちます。

【追記】 (2020-06-28)
これはPython 3.8以降および3.7のメンテナンスリリースで修正されています。8年越しの懸案だったようです・・
[課題13153 IDLE 3.x on Windows exits when pasting non-BMP unicode](https://bugs.python.org/issue13153)


#IVSとは
　**IVS**は「**異体字セレクタ**」の一種で、フォントが内蔵する別字体を**Unicode**で指定するための仕組み。

　例として、「**進**（U+9032）」を表示するとき。
「**進**」の左側は、戦後日本では一点のしんにょう（**辶**）とされているが、もし二点（**辶**）で表示したい場合には、文字コードの後にセレクタを付与して「**進󠄁**（U+9032, U+E0101）」あるいは「**進󠄃**（U+9032, U+E0103）」とすれば選択できる。
……と、UnicodeコンソーシアムのIVD（漢字異体字データベース）には登録されている。

　※ U+E0101 の方は「Adobe-Japan1」コレクション、U+E0103 の方は「Hanyo-Denshi（汎用電子情報交換環境整備プログラム）」コレクション、または「Moji_Joho（文字情報基盤整備事業）」のコレクション

　実際に表示されるかどうかはフォントの実装次第。なので、**どれも「進」にしか見えない**可能性もあるが、使用フォントが例えば Adobe-Japan1 に対応する「游ゴシック」か「游明朝」ならば、「**進󠄁**（U+9032, U+E0101）」は二点（辶）になるだろう。

#参考
- Wikipedia 『異体字セレクタ』
 https://ja.wikipedia.org/wiki/%E7%95%B0%E4%BD%93%E5%AD%97%E3%82%BB%E3%83%AC%E3%82%AF%E3%82%BF
- Unicode Ideographic Variation Database 
https://unicode.org/ivd/
pythonのログ出力(python3)

# 目的
python3でのログ出力をまとめる。

# ソース
ログレベルERRORの例

```logTest.py
import logging

# ログオブジェクト作成
def get_logger(workername, logLvel):
    # ログの出力名を設定
    logger = logging.getLogger(workername)
    # ログレベルの設定
    logger.setLevel(logLvel)

    return logger

def main():
    # ロガー
    logger = get_logger(__name__, logging.ERROR)
    logger.debug('デバッグログです')
    logger.info('インフォログです')
    logger.warning('ワーニングです')
    logger.error('エラーです')
    logger.critical('クリティカルです')

if __name__ == "__main__":
    main()

```

上記例のログレベルであるlogging.ERRORは、int型。
実際の値は下記。

| ログレベル   |  値 |
|:-------------|----:|
| DEBUG        |  10 |
| INFO         |  20 |
| WARNING      |  30 |
| ERROR        |  40 |
| CRITICAL     |  50 |

# 参考
python3のloggingのAPI
https://docs.python.org/ja/3/library/logging.html#levels

# 最後に
ログレベルは、外部ファイルや環境変数を読み込んで設定するのが普通なのかと思います。
RailsのノリでDockerを使ってNginx+Laravelの環境を作ろうとしたらハマった話

## 概要
DockerでNginx + Laravelの環境を作ろうとしたらハマったのでまとめました。
仕組みを知るって大切ですね。

## ハマった経緯
Railsで下記のような構成のアプリケーションを触っていたため、Nginx+Laravelでもいけるだろと思ったらハマった。

### Railsの構成(成功)
![rails-rp.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23306/d2548dc7-b251-621f-55ac-fa3e34c7f646.png)


### Laravelの構成(失敗)
![laravel-failed.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23306/41bd814d-4181-f9e7-e0dd-b41a09cc82fd.png)


## 何故ハマったかの結論
PumaはWebサーバであるが、PHP-FPMはWebサーバではないから静的ファイルを返さなかった！
当たり前の話なんでしょうけど、コピペで動けばいいやでやってるといずれハマるものですね・・・。

## じゃあどうするのが正解？
### 前提
- Dockerを利用した場合で考えるので、1コンテナ1プロセスとして設計する
(Logを収集しやすかったりといろいろと利点がありますよね)
- 本番環境はKubernetesを利用する

### 開発環境パターン1(ネット上でよく見るやつ)
NginxとLaravelでソースを共有して静的ファイルを返すパターン
今回ハマってなんで動くのかよく理解ができました・・・！
![laravel-success1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23306/96913f70-afae-e1b6-6979-fbccf2b217b3.png)

### 開発環境パターン2(静的ファイルを分離)
静的ファイルを別サーバで返すようにするパターンです。
LaravelをAPI化してSPAと連携する場合などはこっちの方がよいと思います
※ LocalではBackendとFrontendを別ディレクトリとしてmountする。
![laravel-success2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23306/3f85336a-0832-4739-e747-c1391f675396.png)

### 本番環境パターン1(開発環境パターン1に近い形)
1Podに3コンテナはちょっと美しいとは言えないけどFrontとBackをわけていない場合はこれでいいと思います。
![laravel-kubernetes1 (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23306/cfe1a413-cf93-86d8-e446-72232e54a118.png)

### 本番環境パターン2(開発環境パターン2に近い形)
開発環境パターン2のようにFrontとBackで分けている場合はこのような構成がいいと思います。
あとは調査が足りてませんが、頑張ればingress-nginxでfastcgiの対応が可能かもしれません。
![laravel-failed (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23306/89bd9e93-fd92-c158-305f-624282d352e8.png)

## まとめ
- PHP-FPMはFastCGIで動作するミドルウェアであり、WebサーバではないためNginxと連携して静的ファイルを返す仕組みが必要になる
- 上手く連携させるためには2パターンある(サーバを分離しないのも含めると3パターン)
    1. ソースを共有できる場所を用意してNginxでそちらを参照する
    1. 静的ファイルをPHP-FPMサーバから分離する
        + RPサーバに置く事も可能だが、役割を考えると専用にサーバを用意した方がよい

## 参考文献
Webサーバ、FastCGI、Unixドメインソケット、TCPソケットについて詳しく書かれています
https://qiita.com/kotarella1110/items/634f6fafeb33ae0f51dc
Python基礎３ class メモ

pythonの基礎を備忘録として残しておく

# 1.クラスとメソッド
クラス名の先頭は大文字。オブジェクト = クラス（）でオブジェクトを生成し、メソッドはオブジェクト.メソッド()で呼び出す。

```python
class Calc:  # クラス名Calc

   def plus(self, a, b):  # メソッド
       return a + b

   def minus(self, a, b):  # メソッド
       return a - b 

calc = Calc()  # オブジェクト ＝ クラス（）でオブジェクトを生成(インスタンス化)
print(calc.plus(1, 2))  # オブジェクト.メソッド()で呼び出し
print(calc.minus(3, 2))

# 出力
3
1
```
コンストラクタは、オブジェクト生成時に呼び出される関数でデータの初期化などを行う。

```python
class Member:

   def __init__(self, x, y):  # コンストラクタ
      self.name = x
      self.age = y

   def dump(self):  # メソッド
      print('name' + self.name)
      print('age' + str(self.age))

mbr = Member('渋野',20)
mbr.dump()

# 出力
name渋野
age20
```

★名字と名前を保持するNameという名前のクラスを作る。
1)インスタンス変数にlast_nameとfirst_nameを持ち、コンストラクタで受け取る
2)last_nameを表示できるshow_last_nameという名前のメソッドを持つ
3)first_nameを表示できるshow_last_nameという名前のメソッドを持つ
4)last_nameとfirst_nameを結合して表示できるshow_nameという名前のメソッドを持つ

```python
class Name:  # Class名はName
    
    def __init__(self, last_name, first_name):  # コンストラクタ
        self.last_name = last_name
        self.first_name = first_name
        
    def show_last_name(self):  # メソッド
        print(self.last_name)

    def show_first_name(self):  # メソッド
        print(self.first_name)

    def show_name(self):  # メソッド
        print(self.last_name + self.first_name)

name = Name("渋野", "日向子")  # オブジェクトを作成（インスタンス化）
name.show_last_name()  # オブジェクト.メソッド（）で呼び出す
name.show_first_name()  
name.show_name()  

# 出力結果
渋野
日向子
渋野日向子
Python基礎２ for文、内包表記、lambda式のメモ

pythonの基礎を備忘録として残しておく

# summary

```python
x = ['a', 'b', 'c']
for i in x:  # 配列を読み出す
for i in range(3):  # 0〜２を読み出す
for i, j in enumerate(x):  #インデックスと配列を読み出す
for i, j, k in zip(x, y, z)  # 複数の配列を読み出す

# x = {'a':1, 'b':2, 'c':3}
for k in x:  # キーを読み出す
for v in x.values():  # バリューを読み出す
for k, v in x.items():  # キーとバリューを読み出す

x = [1, 2, 3]
l = []
for i in x:
    l.append(i*3)
# 全ての要素を3倍（ノーマル）

[i*3 for i in x]
# 全ての要素を3倍（内包表記）

x = [1, '2', 3]
l = []
for i in x:
    if isinstance(i, str):
       continue
    l.append(i)
# strを除く

[i for i in x if not isinstance(i, str)] 
# strを除く（内包表記）

func = lambda x:print('引数は'+ x)
func = lambda x="未入力": print('引数は' + x)
(lambda x="未入力": print('引数は' + x))('整数')
(lambda x="未入力": print('引数は' + x))()
```

# １. for 文
for 文は配列から要素を順次読み出して処理を行います。配列には、文字列、リスト、辞書、タプル、セットが該当します。

```python
for 変数　in 配列：
    処理
```

具体的な例を見て行きましょう。リストを読み込み、処理をする。

```python
x = ['a', 'b', 'c']
for i in x:
    print(i)

# 出力結果
a
b
c
```
range関数を使ってインデックスを読み込み、処理をする。range(初期値, 回数, 増分）で、初期値と増分は記載しなければ、初期値＝０、増分＝１です。

```python
for i in range(3):
    print(i)

# 出力結果
０
１
２
```
enumerate関数を使って、インデックスとリストを両方読み込み、処理をする。

```python
x = ['a', 'b', 'c']
for i, j in enumerate(x):
    print(i, j)

# 出力結果
0  a
1  b
2  c
```
zip関数を使って、２種類以上のリストを読み込み、処理をする。

```python
x = ['a', 'b', 'c']
y = ['L', 'M', 'S']
z = ['X', 'Y', 'Z']
for i, j, k in zip(x, y, z)
    print(i, j, k)

# 出力結果
a  L  X
b  M  Y
c  S  Z
```

辞書 {キー１：バリュー１, キー２:バリュー２, ...} からキーを読み出す。普通に書くとキーを読み出します。

```python
# x = {'a':1, 'b':2, 'c':3}
for k in x:
    print(k)

# 出力結果
a
b
c
```

values関数を使って、辞書からバリューを読み出す。

```python
x = ['a':1, 'b':2, 'c':3]
for v in x.values():
    print(v)

# 出力結果
1
2
3
```
items関数を使って、辞書からキーとバリューを読み出す。

```python

x = ['a':1, 'b':2, 'c':3]
for k, v in x.items():
    print(k, v)

# 出力結果
a  1
b  2
c  3
```
# 2. 内包表記
for 文には内包表記という便利なものがあります。

```python
[iの処理　for i in 配列]
```
具体的な例を通常表記と内包表記の２つの場合で、みて行きましょう。
リストを与えると全ての要素を３倍にして返す関数（例：[1, 2, 3] → [3, 6, 9]）

```python

def func(x):
    l = []
    for i in x:
        l.append(i*3)
    return l

def func(x):
    return[i*3 for i in x]
```
整数と整数の文字列の混じる要素のリストを与えると、全ての要素を整数にして返す関数（例：[1, '2', 3] → [1, 2, 3])

```python

def func(x):
    l = []
    for i in x:
        l.append(int(i))
    return l

def func(x):
    return [ int(i) for i in x]
```

整数と整数の文字列の混じる要素のリストを与えると、文字列を取り除いたリストを返す関数（例：[1, '2', 3] → [1, 3]

```python
def func(x):
    l = []
    for i in x:
        if isinstance(i, str):
           continue
        l.append(i)
    return l

def func(x):
    return[i for i in x if not isinstance(i, str)] 
```
# 3. 無名関数（lambda式）

lambda式を使うと、def文を使わずに関数を定義できます。基本構文は、以下の様です。

```python
lambda 引数：処理
```
具体的な例を記します。

```python
func = lambda x:print('引数は'+ x)
func('整数')

# 出力
引数は整数
```
lambda式で引数xが設定されている場合は、引数がないとその設定が有効になる。

```python 
func = lambda x="未入力": print('引数は' + x)
func('整数')
func()

# 出力
引数は整数
引数は未入力
```
lambda式を( )で囲って、引数を（ )で後ろにくっ付けるやり方もある。

```python
(lambda x="未入力": print('引数は' + x))('整数')
(lambda x="未入力": print('引数は' + x))()

# 出力
引数は整数
引数は未入力
```
bash で利用される特殊変数

どっかで見た記事をコピペでメモ

```
$0      #シェルスクリプト名
$1      #第1引数
$2      #第2引数
$#      #引数の個数
$@      #すべての引数を展開 "$1" "$2" ...
$*      #すべての引数を展開 "$1 $2 ..."
$?      #直前に実行したコマンドの終了ステータス
$!      #直前に実行したコマンドのPID
$$      #シェルスクリプトのPID
```