OmniAICreator/Qiita-1.07M huggingface dataset:
AWS Lambdaでファイルを作成・編集しS3にアップロードする

# サンプルコード
- Body・・・ファイルに書きたい内容
- Bucket・・・アップロード先のバケット
- Key・・・アップロードしたときのファイル名

```lambda_function.py
import boto3

def upload():
    client = boto3.client('s3')
    response = client.put_object(
        Body='Hello from Lambda!',
        Bucket='my-bucket',
        Key='sample.txt',
    )

def lambda_handler(event, context):
    upload()
    return 0
```

# サンプルロール

既存のラムダロールに追加する。

```
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "s3:PutObject",
      "Resource": "arn:aws:s3:::my-bucket/*"
    }
  ]
}
```

# 参考記事

- boto3 ドキュメント

https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/s3.html#S3.Client.put_object
Ubuntu Nvidia GPU メモリ　開放

1.GPUメモリの確認
　nvidia-smi

2.IDの確認

lsof /dev/nvidia*


3.該当IDの削除
　kill -9 2で調べたID

他. nvidia-smi の常時確認
　watch -n1 nvidia-smi

参考　https://qiita.com/miyamotok0105/items/033b850a205f958808e9
Fedora 32 Workstationにunixbenchをインストールする

## 実現したいこと

より簡単にunixbenchをインストールして実行したい

## 実行コマンド

```
sudo ln -s /var/lib/snapd/snap /snap
sudo systemctl enable --now snapd.socket
sudo snap install unixbench
```

```
cd /snap/bin
./unixbench
```

## 情報源

* https://snapcraft.io/install/unixbench/fedora
[Azure] DockerからAzure PowerShellを使う

# 前提
* dockerコマンドが使用できる環境

# 手順

## コンテナーでの Azure PowerShell の使用
次の手順は、イメージをダウンロードし、対話型 PowerShell セッションを開始する

```shell
# イメージダウンロード
docker pull mcr.microsoft.com/azure-powershell

# 対話モードでコンテナー実行
docker run -it mcr.microsoft.com/azure-powershell pwsh
```

## サインイン

```
PS /> Connect-AzAccount -UseDeviceAuthentication

WARNING: To sign in, use a web browser to open the page https://microsoft.com/devicelogin and enter the code xxx to authenticate.
WARNING: TenantId 'xxx' contains more than one active subscription. First one will be selected for further use. To select another subscription, use Set-AzContext.

```
ブラウザでコードを入力して、サインイン

### 複数サブスクリプションがある場合は以下で指定

```
PS /> Set-AzContext -Subscription "xxxx-xxxx-xxxx-xxxx"
```

## クライアント証明書をホストからコンテナに送る
```
# docker ps でコンテナidを取得
docker ps 

# ホストからコンテナにコピー
$ sudo docker cp my.cnf <コンテナID>:/etc/my.cnf
```

# 参考
https://docs.microsoft.com/ja-jp/powershell/azure/azureps-in-docker?view=azps-4.8.0

https://docs.microsoft.com/en-us/powershell/module/az.accounts/set-azcontext?view=azps-5.5.0#example-1--set-the-subscription-context

https://qiita.com/gologo13/items/7e4e404af80377b48fd5
ついさっきまでいたディレクトリに戻るLinuxコマンド


```shell
$ cd -
```
で、ついさっきまでいたディレクトリに戻ることができます。

例えばカレントディレクトリが`/Users/user_name/Pictures/summer`の場合

```shell
$ pwd
/Users/user_name/Pictures/summer

# いったん別のディレクトリに移動
$ cd /bin 
$ pwd
/bin

#ついさっきまでいたディレクトリに戻る
$ cd - 
$ pwd
/Users/user_name/Pictures/summer
```

こんな便利なコマンドがあるなんて知らなかったです😂

参考
https://linuxjourney.com/lesson/change-directory-cd-command
Pyhton コードで Splunk サーチ結果を読み込む (RestAPI編)


# はじめに

以前、[JpyterNotebookを使ってSplunkデータを利用する](https://qiita.com/maroon/items/3c243b0f391d9ab73411) という記事を書いたのですが、RestAPIを使ってもっと簡単に読み込むことが出来たので、ご紹介します。

# Splunk RestAPI 

Splunkでは Defaultでは 8089ポートを使って API接続することができます。RestAPIに関しては、@odorusatoshiさんの[Splunk REST APIの玄関を叩いてみる](https://qiita.com/odorusatoshi/items/06669525a9eae58e87ff)が参考になるので、ご覧ください。

今回は、この Curlで取り込む方法を使って pythonで直接読み込むようにしたいと思います。


# Curl 内容を Pythonコードに変更

Curl でできることは、pythonでももちろんできます。しかもこちらのサイトを利用すると、自動的にpythonコードに変換してくれるという[非常に便利なサイト](https://curl.trillworks.com/)もあります。

変換したコードがこちらです。

```
import requests

# サーチ内容をこちらに記載
search_list_query = """
search index=_internal 
| head 200 
| table _time source sourcetype user bytes
""" 

# curlオプションを記載
data = {
  'search': search_list_query,
  'exec_mode': 'oneshot',
  'output_mode': 'json',
  'count': '0'   # default だと 100個しかリターンされない
}

# Splunk サーバ、ユーザー、パスワードを変更ください
response = requests.post('https://<splunk-server>:8089/services/search/jobs' , data=data, verify=False, auth=("<user-name>", "<passwd>"))
```
**サーチ内容:** Splunk側でのサーチ内容は、search_list_query に書きます。
**curlオプション:** curlオプションは、 data に書いております。ポイントは count :0 とすることです。defaultだと100個までしか結果が取得できません。
**接続情報:** 最後にSplunkサーバとそのユーザー名(apiを実行できるロールを持っている）、パスワードを変更してください

注意点としては、8089ポートが FWなどでブロックされていないことを確認ください。（事前にcurlでチェックしておくのが重要) 

# 結果をデータフレームに入れる

取得したデータは jsonフォーマットになっているので、pythonで扱いやすくするために データフレームに変換しておきます。（他にリストやタプル形式でも問題ないですが、単純に好きだから）

```
import pandas as pd
result=response.json()['results']
df = pd.DataFrame(result)
```

これで、自由にpythonで取り扱えますよ！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392303/21f35c02-6f2c-016b-8268-27199fb25726.png)

# 最後に

上記の[サンプルノートブック](https://github.com/maroon-spec/qiita/blob/master/splunk_python_samplecode.ipynb)置いておくのでご自由にお使いください。



**逆にデータをRestAPIを使ってSplunkに取り込みたい時はこちらをご覧ください↓
[pythonでログを Splunkに取り込む ( RestAPI + HECの組み合わせ）](https://qiita.com/maroon/private/66e92399f00800d5f069)**
go get で "module declares its path as" のようなエラー

## エラー

```bash
$ go get github.com/motemen/ghq
go get: github.com/motemen/ghq@v1.0.3 updating to
	github.com/motemen/ghq@v1.1.6: parsing go.mod:
	module declares its path as: github.com/x-motemen/ghq
	        but was required as: github.com/motemen/ghq
```

## 解決策

```bash
$ go get github.com/x-motemen/ghq
```

## なぜ

motemen さんが x-motemen さんに改名した？
google-java-formatをVSCode・macOS環境で利用する

#対象とする読者
VSCode・macOS環境でのjava開発にて[Google Java Style](https://google.github.io/styleguide/javaguide.html)に自動整形するフォーマッタ（[google-java-format](https://github.com/google/google-java-format)）を適用させたい方



#環境
macOS Catalina (version: 10.15.7)
VSCode for macOS (version: 1.53.2)


#設定法
- ターミナルにてHomebrewでgoogle-java-formatをインストール

```bash

brew install google-java-format
```

- VSCodeにて拡張機能emeraldwalk.runonsaveをインストール
![Screen Shot 2021-02-27 at 10.27.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317017/d59a4e4b-2946-cb05-55a6-bb100da482a1.png)

- VSCodeにて`setting.json`に以下の要素を追加[^1]

[^1]: `setting.json`の開き方は[コチラの記事](https://qiita.com/y-w/items/614843b259c04bb91495)を参照


```json-doc
{
  "emeraldwalk.runonsave": {
    "commands": [
      {
        "match": "\\.java$",
        "cmd": "google-java-format --replace ${file}"
      },
    ],
  },
}
```

#参考
https://www.sethvargo.com/using-google-java-format-with-vs-code/
amplifyの作法 その5

#概要

amplifyの作法、調べてみた。
練習問題やってみた。

#練習問題

nandを実現せよ。

#nand

```
from amplify import BinaryPoly, gen_symbols, Solver, decode_solution
from amplify.client import FixstarsClient

q = gen_symbols(BinaryPoly, 2, 2)
f = -q[0][1] * q[1][0] + -q[0][0] * q[1][1] + -q[0][0] * q[0][1] + q[0][1] * q[1][1] + -q[0][0] * q[1][0] + q[1][0] * q[1][1]
solver = Solver(client)
result = solver.solve(f)
values = result[0].values
d = decode_solution(q, values)
print(d[0][0])
print(d[1][0])
print(d[0][1])
print(d[1][1])
```

#xor

```
from amplify import BinaryPoly, gen_symbols, Solver, decode_solution
from amplify.client import FixstarsClient

q = gen_symbols(BinaryPoly, 2, 2)
f = -q[0][1] * q[1][0] + q[0][0] * q[1][1] + q[0][0] * q[0][1] + q[0][1] * q[1][1] + q[0][0] * q[1][0] + q[1][0] * q[1][1]
solver = Solver(client)
result = solver.solve(f)
values = result[0].values
d = decode_solution(q, values)
print(d[0][0])
print(d[1][0])
print(d[0][1])
print(d[1][1])
```

#and

```
from amplify import BinaryPoly, gen_symbols, Solver, decode_solution
from amplify.client import FixstarsClient

q = gen_symbols(BinaryPoly, 2, 2)
f = -q[1][1] * q[1][1] + q[0][1] * q[1][0] + q[0][0] * q[1][1] + q[0][0] * q[0][1] + q[0][1] * q[1][1] + q[0][0] * q[1][0] + q[1][0] * q[1][1]
solver = Solver(client)
result = solver.solve(f)
values = result[0].values
d = decode_solution(q, values)
print(d[0][0])
print(d[1][0])
print(d[0][1])
print(d[1][1])
```

#or

```
from amplify import BinaryPoly, gen_symbols, Solver, decode_solution
from amplify.client import FixstarsClient

q = gen_symbols(BinaryPoly, 2, 2)
f = -q[0][1] * q[1][0] + q[0][0] * q[1][1] + q[0][0] * q[0][1] + -q[0][1] * q[1][1] + q[0][0] * q[1][0] + -q[1][0] * q[1][1]
solver = Solver(client)
result = solver.solve(f)
values = result[0].values
#print(values)
d = decode_solution(q, values)
print(d[0][0])
print(d[1][0])
print(d[0][1])
print(d[1][1])
```

#nor

```
from amplify import BinaryPoly, gen_symbols, Solver, decode_solution
from amplify.client import FixstarsClient

q = gen_symbols(BinaryPoly, 2, 2)
f = -q[0][0] * q[0][0] + q[0][1] * q[1][0] + q[0][0] * q[1][1] + q[0][0] * q[0][1] + q[0][1] * q[1][1] + q[0][0] * q[1][0] + q[1][0] * q[1][1]#1000 nor
solver = Solver(client)
result = solver.solve(f)
values = result[0].values
d = decode_solution(q, values)
print(d[0][0])
print(d[1][0])
print(d[0][1])
print(d[1][1])
```

以上。
【C#】Null許容のDatetimeを比較してBooleanを返すメソッド【Nullable.Compare】

Nullを許容したDateTime型変数を検索条件として、Linqの.Where内で使いたかったためメソッド作りました。

公式でNullable.Compareというメソッドがあるのですが、返却値がInt型で使いづらかったのでBoolean型にしておきました。

##メソッド
```C#:
using System;

//date1がdate2より遅い日付の場合True
public bool CompareNullableDatetime(DateTime? date1, DateTime? date2)
{
     int result = Nullable.Compare(date1, date2);
     return result > 0;
}
```

##仕様
#####DateTimeが非Nullの場合

| 返却値 | 引数1 | 引数2 | 補足 |
|:-:|:-:|:-:|:-:|
| TRUE | 2021/02/27 00:00:00 | 2021/01/27 00:00:00 | 引数1が引数2より遅い時刻　|
| FALSE | 2021/01/27 00:00:00 | 2021/02/27 00:00:00 | 引数1が引数2より早い時刻　|
| FALSE | 2021/02/27 00:00:00 | 2021/02/27 00:00:00 |引数1と引数2が同じ時刻|

#####DateTimeがNullを含む場合

| 返却値 | 引数1 | 引数2 |
|:-:|:-:|:-:|
| TRUE | 2021/02/27 00:00:00 | Null |
| FALSE | Null | 2021/02/27 00:00:00 |
| FALSE | Null | Null |



##Nullable.Compareに関して補足

######公式ドキュメント

https://docs.microsoft.com/ja-jp/dotnet/api/system.nullable.compare?view=net-5.0


####Nullable.Compareの仕様
覚え方的には、Nullを「0」だと思って「引数1-引数2」をする感覚です。

#####DateTimeが非Nullの場合

| 返却値 | 引数1 | 引数2 | 補足 |
|:-:|:-:|:-:|:-:|
| 0より大きい値 | 2021/02/27 00:00:00 | 2021/01/27 00:00:00 | 引数1が引数2より遅い時刻　|
| 0より小さい値 | 2021/01/27 00:00:00 | 2021/02/27 00:00:00 | 引数1が引数2より早い時刻　|
| 0 | 2021/02/27 00:00:00 | 2021/02/27 00:00:00 |引数1と引数2が同じ時刻|

#####DateTimeがNullを含む場合

| 返却値 | 引数1 | 引数2 |
|:-:|:-:|:-:|
| 0より大きい値 | 2021/02/27 00:00:00 | Null |
| 0より小さい値 | Null | 2021/02/27 00:00:00 |
| 0 | Null | Null |


~~より大きい値、より小さい値ってなんやねん~~
Pythonでロジスティック回帰②

# はじめに

[Pythonでロジスティック回帰①](https://qiita.com/honda28/items/c70bbee5a6b6f5e5c4ff)に続けて、ロジスティック回帰の精度向上を試みる。

## ロジスティック回帰の偏回帰係数

データに標準化処理を行った場合、学習した後に得られる偏回帰係数の絶対値の大きさがその変数の影響度の大きさといえる。そこで前回の学習時の偏回帰係数の絶対値が大きい順にソートしてみる。

```python:sortCo.py
l = []
for i, c in enumerate(lr.coef_[0]):
    l.append([i, X.columns[i], c])
li = pd.DataFrame(sorted(l, reverse=True, key=lambda x: abs(x[2]))) # 係数の絶対値に注目してソート
li.columns = ["index", "colnames", "coefficients"]
print(li)
#     index  colnames  coefficients
# 0      23   PAY_0_2      2.170240
# 1      24   PAY_0_3      2.052640
# 2      25   PAY_0_4      1.744103
# 3      26   PAY_0_5      1.237172
# 4      28   PAY_0_7      1.088260
# ..    ...       ...           ...
# 71     43   PAY_3_4      0.009774
# 72     12  PAY_AMT5     -0.003782
# 73     38   PAY_2_8      0.000000
# 74     58   PAY_5_1      0.000000
# 75     67   PAY_6_1      0.000000
```

上記結果より、重要度が高そうな PAY_0, EDUCATION, PAY_2, MARRIAGE, PAY_3 に関連する変数のみを残して再度学習してみる。

```python:retrain.py
X = df_quality_dummies[['EDUCATION_1', 'EDUCATION_2', 'EDUCATION_3', 'EDUCATION_4',
                        'MARRIAGE_1', 'MARRIAGE_2', 'MARRIAGE_3',
                        'PAY_0_1', 'PAY_0_2', 'PAY_0_3', 'PAY_0_4', 'PAY_0_5', 'PAY_0_6', 'PAY_0_7', 'PAY_0_8', 'PAY_0_-1',
                        'PAY_2_1', 'PAY_2_2', 'PAY_2_3', 'PAY_2_4', 'PAY_2_5', 'PAY_2_6', 'PAY_2_7', 'PAY_2_8', 'PAY_2_-1',
                        'PAY_3_1', 'PAY_3_2', 'PAY_3_3', 'PAY_3_4', 'PAY_3_5', 'PAY_3_6', 'PAY_3_7', 'PAY_3_8', 'PAY_3_-1']]
Y = df["default payment next month"]
X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.2, random_state=0)

lr_co = LogisticRegression(max_iter=2000)
lr_co.fit(X_train, Y_train)

THRESHOLD = 0.30
Y_pred = np.where(lr_co.predict_proba(X_test)[:,1] > THRESHOLD, 1, 0)
print("Prediction:", np.count_nonzero(Y_pred==1))
print("      Test:", np.count_nonzero(np.array(Y_test)==1))
print("AUC Score:", roc_auc_score(Y_test, Y_pred))
# Prediction: 1120
#       Test: 1297
# AUC Score: 0.6883146488133773
```

前回はTHRESHOLD=0.30の際のAUCスコアが約0.696であったため、変数を削減したもののスコアの向上は見られなかった。scikit-learnのLogisticRegressionでは、デフォルトでL2正則化を用いるので（わずかな特徴量しか扱わないよう制限をかける）L1正則化も試してはみたが、ほとんど変化はみられなかった。

```python:l1.py
lr_l1 = LogisticRegression(penalty="l1", solver="liblinear", max_iter=2000)
lr_l1.fit(X_train, Y_train)
```

別の精度改善方法を検討しつつ、ロジスティック回帰以外の他モデルでも分類を試してみようと思う。
【PHP】配列の要素をintにキャストする

# はじめに
配列の要素にstringが含まれていて、困るシーンがあったので、**配列の要素をintにキャストする**関数を考えました。

# コード

```php
$arr = ['1', '2', '3'];

$res = array_map('intval', $arr)
/*
array(3) {
  [0]=>
  int(1)
  [1]=>
  int(2)
  [2]=>
  int(3)
}
*/

```

array_mapにコールバック`intval()`を渡すことで、全要素に`intval()`が行われてキャストされるという仕組みです。


# おまけ

Utilsに自分で追記してもいいのかなと思ってます☺

```php
/**
 * 配列の要素を指定に型にキャストする
 *
 * @param array $arr キャストしたい配列
 * @param string $cast_type 【int, str, float, bool】を指定することが可能
 * @return array キャストした配列を返却
 */
function array_cast(array $arr, string $cast_type): array {
    return array_map($cast_type.'val', $arr);
}
```
TypeScript：空オブジェクト用の型をつくりたい

## やりたいこと

```ts
const a: EmptyObject = {} //OK
const b: EmptyObject = {hoge: "aaa"} //NG
const c: EmptyObject = "hoge" //NG
```

となるようなEmptyObject型を作成したい。

## 結論

```ts
type EmptyObject = {[key: string]: never}
```


## NG例

```ts

type EmptyObject = {}
```

これだと

```ts
const a: EmptyObject = {} //OK
const b: EmptyObject = {hoge: "aaa"} //OK
const c: EmptyObject = "hoge" //OK
```

になってしまいます。
理由としては、`{}`は特殊な型で、nullとundefined以外を許容してしまうからです。


### 補足：`{}`の型について

`{}`がnullとundefined以外を許容してしまうのは、JavaScriptはプリミティブに対してもプロパティアクセスができることが関係しています。

例えば、string型には.lengthというプロパティがあるので、

```ts

type StringObject = {
    length: number;
}

const hoge: StringObject = "a"
```

ということができます。number型も同様に

```ts

type NumberObject = {
   toString(): void;
}

const hoge: NumberObject = 1
```

ということができます。つまり、{}だけではstringの可能性もnumberの可能性も捨てきれないことになり、許容しているということになります。
pyquboの作法

#概要

pyquboの作法、調べてみた。


#参考にしたページ

https://qiita.com/SaitoTsutomu/items/bfbf4c185ed7004b5721

#サンプルコード

```
from pyqubo import solve_qubo
import dimod
import math
from pyqubo import Array, LogEncInteger
from pyqubo import Constraint

W = 100
w = {
    0: 21, 
    1: 11,  
    2: 15, 
    3: 9, 
    4: 34, 
    5: 25,
    6: 41,
    7: 52
}
c = {
    0: 22, 
    1: 12, 
    2: 16, 
    3: 10, 
    4: 35, 
    5: 26,
    6: 42,
    7: 53
}
N = len(w)
x = Array.create('x', shape = N, vartype = 'BINARY')
y = LogEncInteger("y", (0, W))
key1 = max(c, key = lambda k: c[k])
B = 40
A = 10 * B * c[key1]
HA = Constraint(A * (W - sum(w[a] * x[a] for a in range(N)) - y) ** 2, label = 'HA')
HB = - B * sum(c[a] * x[a] for a in range(N))
print("ナップサックの容量 : " + str(W))
print("宝物の数 : " + str(N))
H = HA + HB
Q = H
model = Q.compile()
q, offset = model.to_qubo()
sampleset = dimod.ExactSolver().sample_qubo(q)
decoded_sample = model.decode_sample(sampleset.first.sample, vartype = "BINARY")
print("選ばれた宝物 :")
treasures = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I']
weight = 0
cost = 0
for k in range(N):
    if decoded_sample.array('x', k) != 0:
        print("宝物 " + treasures[k])
        weight += w[k]
        cost += c[k]
print("合計の容量 : " + str(weight))
print("合計の重さ : " + str(cost))

```


以上。
【Ruby】irbが動作しなくなったお話。【エラー】

先日、irbを起動させようと思ったら、、、

```shell
~ $ irb
/usr/local/Cellar/rbenv/1.1.2/libexec/rbenv-exec: /Users/inouesyo/.rbenv/versions/2.6.6/bin/irb: /Users/inoueshou/.rbenv/versions/2.6.6/bin/ruby: bad interpreter: No such file or directory
/usr/local/Cellar/rbenv/1.1.2/libexec/rbenv-exec: line 47: /Users/inouesyo/.rbenv/versions/2.6.6/bin/irb: Undefined error: 0
```

という表示が出て起動できず。
エラーを読むに原因は恐らく、以前にホームディレクトリの名前を変更したのでそれが原因でパスが通ってないのかな？と推測。

と言うことで、user/Users/inouesyo/.rbenv/versions/2.6.6/bin/irb:のirbファイルを編集する。
irbファイルはUNIX実行ファイルとなっているため、右クリック→このアプリケーションで開く→からテキストエディタで開く。
すると

```shell:irb
#!/Users/inoueshou/.rbenv/versions/2.6.6/bin/ruby
#
# This file was generated by RubyGems.
#
# The application 'irb' is installed as part of a gem, and
# this file is here to facilitate running it.
#

require 'rubygems'

version = ">= 0.a"

str = ARGV.first
if str
  str = str.b[/\A_(.*)_\z/, 1]
  if str and Gem::Version.correct?(str)
    version = str
    ARGV.shift
  end
end

if Gem.respond_to?(:activate_bin_path)
load Gem.activate_bin_path('irb', 'irb', version)
else
gem "irb", version
load Gem.bin_path("irb", "irb", version)
end
```

一行目のホームディレクトリの部分が以前のホームディレクトリ名になっていたので変更。

```shell
~ $ irb
irb(main):001:0> 
```

無事に動作し一安心。
Rspecを動かすまでまとめ（簡易版: 単体・統合テスト）

今回はテスト内容などにはあまり触れていません
Rspecを使ってテストするまでをまとめています。

```ruby:Gemfile
group :test do
  gem 'capybara'
  gem 'rspec-rails'
  gem "factory_bot_rails"
  gem 'faker'
end
```

group :test do　〜　endの中を変更し、bundle install します。

``` :ターミナル
$ bundle install
$ rails g rspec:install
```

```ruby:spec/rails_helper.rb

　#最後の方に追加する
 config.include FactoryBot::Syntax::Methods
end
```
記述することでletを使用した際に、FactoryBotが使用できるようになります。


```ruby:factories/item.spec.rb
FactoryBot.define do
  factory :"モデル名" do
    "カラム名" { Faker::Lorem.characters(number: 10) }
  end
end
```
Faker::Lorem.characters(number: 10)とは
テスト用の文字列を作成する。今回の場合はカラム名のところに10文字のテストデータを作成してくれます。



```ruby:spec_helper.rb
RSpec.configure do |config|
  #追加します
  config.before(:each, type: :system) do
    driven_by :rack_test
  end

#省略
end
```

##単体テスト
```ruby:models/item_spec.rb

require 'rails_helper'

RSpec.describe 'Itemモデルのテスト', type: :model do
  describe 'バリデーションのテスト' do
    subject { item.valid? }

    let(:user) { create(:user) }
    let(:genre) { create(:genre) }
    let!(:item) { build(:item, user_id: user.id, genre_id: genre.id) }

    context 'nameカラム' do
      it '空でないこと' do
        item.name = ''
        is_expected.to eq false
      end
      it '2文字以上であること: 2文字は〇' do
        item.name = Faker::Lorem.characters(number: 2)
        is_expected.to eq true
      end
      it '2文字以上であること: 1文字は×' do
        item.name = Faker::Lorem.characters(number: 1)
        is_expected.to eq false
      end
    end
  end
end
```

```:ターミナル
$ rspec spec/models/item_spec.rb
```
単体テストの実行できます。
今回はItemモデルのテスト実行しています。

##統合テスト
```system/test.spec.rb
require 'rails_helper'

 describe 'トップ画面のテスト' do
   before do
     visit root_path
   end

   context '表示内容の確認' do
     it 'URLが正しい' do
        expect(current_path).to eq '/'
     end
   end
 end

```

```:ターミナル
$ rspec spec/system/test.spec.rb
```
統合テストの実行できます。

これでテスト環境は出来ましたので
追加したい項目を書いていくだけになります。


##おまけ
```ruby:system/test_spec.rb
let(:"モデル名") { FactoryBot.create(:"モデル名", "カラム名": "データ") }
let(:item) { create(:item, user_id: user.id, genre_id: genre.id) }
```
2個目の記述のようにFactoryBotを省略できます。

##letとlet!の違い

```ruby:item_spec.rb
let(:genre) { create(:genre) }
let!(:item) { build(:item, user_id: user.id, genre_id: genre.id) }
```
 - letを使用した場合は処理が行われずにitの中で呼ばれたときにcreateが実行されます。
 - let!を使用した場合はそのまま処理される。  
毎回呼び出す必要のないものは" ! "を外した方がわかりやすくなります。

##createとbuildの違い
```ruby:item_spec.rb
let(:genre) { create(:genre) }
let!(:item) { build(:item, user_id: user.id, genre_id: genre.id) }
```
 - createはにメモリにデータを保存する。
 - buildはDBにデータ保存する。

#####使い分け方
今回はアイテムを登録するためのバリデーションをテストしますので
createで実行すると一回でもテストに通るとメモリに残っているので
アイテムが登録されている状態でバリデーションのテスト行うようになってしまうため、
ちゃんとテストが実行されているかが判断できなくなります。
これから確認したい対象物にはbuildを使うことがいいと思います。
リカレントニューラルネットワーク（RNN）まとめ（数式なし）

#はじめに

今回は、時系列データや自然言語処理を扱うときによく使われる「リカレントニューラルネットワーク（RNN）」についてまとめていきます。


🌟難しい数式等は扱いません。

#リカレントニューラルネットワーク（RNN）とは

通常のディープラーニングでは「出力は現在の入力によって決まる」。
つまり、過去の出力は関係ない。（過去の重みを表現できない。）

一問一答の画像認識や分類問題であればこのやり方でも問題ないが、時系列データ（株価の推移）などの場合は、過去の情報が現在の出力に及ぼす影響は大きい。

よって、時間の情報を反映できる仕組みが必要となり生まれたのが「リカレントニューラルネットワーク（RNN）」。

🌟イメージ図

![Qiita用-6.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/672827/f96aca91-3b7b-a3db-4dfe-7c477e34a680.jpeg)


##概要

リカレントニューラルネットワーク（RNN）を一言でいうと、「内部に閉路をもつニューラルネットワーク」。

※閉路：一周して完結する閉じた回路

リカレントニューラルネットワークでは、「出力は現在の入力と過去の出力によって決まる」


過去の隠れ層の情報を新しい層へ反映することで、過去の情報を保持しています。

イメージ図

![RNN-5.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/672827/1a266b07-7a88-29b1-ca0e-e9d1c046150d.jpeg)


##問題点

このような仕組みを作り、過去の情報を保持できるようになったが一つ問題があった。

それは、学習を進めていくほど「遠い過去の情報」が薄れていってしまうこと。
🌟長期記憶の保持ができない。
（過去のデータが新しいデータによってどんどん更新されてしまうため。）

そこで、「現在は重要ではないが将来的に重要になりそうな情報」を保持するために生まれたのが、「LSTM」。

##LSTMとは

LSTMは、LSTMブロックというものを導入して、長期記憶の保持を実現する。

LSTMブロックでは「必要な情報の保持と不要な情報の消却」をしている。

LSTMを少し簡略化した「GRU」というのもある。
（LSTMよりも計算コストが少ない。）

#おわりに

今回は、リカレントニューラルネットワーク（RNN）をまとめました。
学習の参考になれば幸いです。
JavaScript sort()って何してるの？備忘録

JavaScriptの案件に配属された当初、比較関数を用いた配列のソートの記述がすぐ理解できなかったので、備忘録としてメモ。


# sort()とは
 * 並び替えをしてくれる便利なメソッド
 * 元の配列データを変更してしまう点には注意

# 単純な文字列のソート
文字列が格納された配列に対してsort()を実行すると、アルファベット順にソートされる。

```
const strs = ['c', 'b', 'a', 'd'];
strs.sort();
console.log(strs); // 出力結果:['a', 'b', 'c', 'd']
```

# 比較関数を用いたソート
ソートしたい対象が数値やオブジェクトなどの場合は、sort()メソッドと比較関数を使用。
### 例： 文字数でソートしてみる
今回は`['abc', '', 'aaa', 'zz']`という配列を
文字数を比較する比較関数を用いて
 `['', 'zz', 'abc', 'aaa']`の少→多の順になるようにソートしてみます。

```
const strs = ['abc', '', 'aaa', 'zz'];

strs.sort((a, b) => a.length - b.length);
console.log(strs); // 出力結果:['', 'zz', 'abc', 'aaa']
```

慣れないうちは、下記の方がわかりやすいかもです。

```
const strs = ['abc', '', 'aaa', 'zz'];

// 比較関数
const compare = (a, b) => {
 return a.length - b.length;
}

strs.sort(compare);
console.log(strs); // 出力結果:['', 'zz', 'abc', 'aaa']

```

### 理解に苦しんだ箇所
案件の中で`strs.sort((a, b) => a.length - b.length);`が出てきた時の私の心情は
下記の通りです。

* いきなり引数２つ出てきた...
* a,bってなに...
* もはやここで何が起きてるか謎...

### どんな処理がされているのか

`strs.sort((a, b) => a.length - b.length);`
ここで何が起きているのか、私なりに理解した内容をまとめます。

上記のコードでは、配列`strs`の値を2ずつ取り出して文字数で比較し、
1つずつ順番を入れ替えています。具体的な処理を書くと

```
1. 'abc' と ''    を比較 -> 'abc'の方が文字数が多いため入れ替え ['', 'abc', 'aaa', 'zz']
2. 'abc' と 'aaa' を比較 -> 文字数が同じためそのまま          　['', 'abc', 'aaa', 'zz']
3. 'aaa' と 'zz'  を比較 -> 'aaa'の方が文字数が多いため入れ替え ['', 'abc', 'zz', 'aaa']
4. 'abc' と 'zz'  を比較 -> 'abc'の方が文字数が多いため入れ替え ['', 'zz', 'abc', 'aaa']
5. ''    と 'zz'  を比較 -> ''の方が文字数が少ないためそのまま　 ['', 'zz', 'abc', 'aaa']
```
つまり、
引数a、bの正体は、`['abc', '', 'aaa', 'zz']`の中の比較する２つの値であり、
比較関数では`a.length - b.length`でどちらの文字列が大きいかを比較し、
`a.length - b.length > 0`なら`a` `b`の順を入れ替える
という処理がされている。と理解。

### 引数の名って大事
sort()が何をしてくれるかを理解し、ありがたみを感じられるようになった時に、改めて思ったこと。
今回理解に苦しんだ最大の理由は引数a、ｂが何かわからなかったから。
引数でどんな値が渡されるのか、少しでもわかりやすく命名するように心がけようと思います...!

```
const strs = ['abc', '', 'aaa', 'zz'];

strs.sort((str１, str2) => str１.length - str2.length);
console.log(strs); // 出力結果:['', 'zz', 'abc', 'aaa']
```
Python: Windows10+Eclipse+PyQt５で作成したGUIソフトをラズパイで動かす方法①

記)2021/02/27

この記事はメモである。いずれちゃんとした記事にはする予定


①ラズパイ
pip3のアップグレード、これをしないとPyQt5インストール時にsetup.pyが見つからないとエラーが出てインストールできない(理由不明)
sudo pip3 install --upgrade pip

PyQT5インストール
sudo pip3 install PyQt5
めっちゃ呪い 数時間かかる

Windows側Eclipse
あらかじめ、GitHubにはプッシュ出来るようにしておきリポジトリは作っておく

フォルダ構成
例)
GUItest
  --__init__.py
  --main.py
setup.py
requirements.txt


__init__.py中身は空ファイル

main.py

```
import sys
from PyQt5.QtCore import pyqtSlot
from  PyQt5.QtWidgets import QApplication,QMainWindow

from pk1.ui_test import Ui_MainWindow


class GUItest(QMainWindow,Ui_MainWindow):
    def __init__(self, parent=None):
        super(GUItest,self).__init__(parent)
        self.setupUi(self)
        #loadUi('test.ui',self)
        #self.pushButton.clicked.connect(self.onPushButtonCliked)

    #@pyqtSlot()
    #def onPushButtonCliked(self):
    #   self.label1.setText(self.textEdit.text)
def main():
    app=QApplication(sys.argv)
    widget=GUItest()
    widget.show()
    sys.exit(app.exec_())

if __name__=="__main__":
    main()
```
setup.py

```
from glob import glob
from os.path import basename
from os.path import splitext

from setuptools import setup
from setuptools import find_packages


def _requires_from_file(filename):
    return open(filename).read().splitlines()


setup(
    name="GUItest",
    version="0.1.0",
    license="ライセンス",
    description="パッケージの説明",
    author="sureisu",
    url="https://github.com/kamoshika9999/PythonTest.git",
    packages=find_packages("GUItest/src"),
    package_dir={"": "GUItest/src"},
    py_modules=[splitext(basename(path))[0] for path in glob('src/*.py')],
    include_package_data=True,
    zip_safe=False,
    install_requires=_requires_from_file('GUItest/requirements.txt'),
    setup_requires=["pytest-runner"],
    tests_require=["pytest", "pytest-cov"],
    entry_points={'console_scripts':['guitest = pk1.main:main' ]}
)
```

エクリプスからGitHubにプッシュすると
GUItestがルートとなってしまい、pip3でインストールするときにsetup.pyが見つからないとでる

GitHubのリポジトリルートにsetup.pyを手動で作成する。中身は同じ
Symbolのノードのバージョンを取得する

catapult-restの`/node/info`に出てくる`version`が、いつしか`0`でない値になってしばらく経ちました。

ふと気になって、どういう意味か考えてみました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172833/b8b60f6f-ed0f-ff1f-905f-37cc94d16e9d.png)

まずは、Windowsの電卓で16進数にしてみました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172833/62a2ebea-0520-f830-d7b9-503ee363bb12.png)

`0xA0007`と出ています。

これまでの経験から、４バイトの値であることを感じるので、こうなるでしょう

`0x000A0007`

ああ、なるほどなるほど、これは１バイトずつ区切って、

`0.10.0.7`

を表しているように見える。

https://symbolnodes.org/nodes/ を見てみると、なんかそんな感じ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172833/40ae6fe0-14cb-17b7-323f-2aba78309476.png)

すっきりしました。


バージョンをパースするコードをJavaScriptで書いてみました

```javascript
function parseNodeVersion(num) {
    const hex = `00000000${Number(num).toString(16)}`.substr(-8)
    const strArray = []
    for (let i = 0; i < 8; i += 2) {
        const octet = Number(`0x${hex[i]}${hex[i + 1]}`).toString(10)
        strArray.push(octet)
    }

    return strArray.join('.')
}

parseNodeVersion(655367)
// return 0.10.0.7
```
AWS Certified Data Analytics - Specialty試験に合格しました

昨日受けてきました。スコアは`813`でした
英語での受験となります。日本語の情報が少ないので参考になればと思います。

# 勉強したこと

## 教材

BlackbeltのAnalyticsのところ
https://aws.amazon.com/jp/aws-jp-introduction/aws-jp-webinar-service-cut/#analytics-services
特に仕事でさわったことがない、EMR、Redshiftなど中心に

AWSではじめるデータレイク本
https://booth.pm/ja/items/2204135
ハンズオンが良い。Glue、Athena、Redshift、QuickSightなど実際に触ってみる

Exam Readiness: AWS Certified Data Analytics - Specialty
https://www.aws.training/Details/eLearning?id=46612

Udemy AWS Certified Data Analytics Specialty - Hands On!
https://www.udemy.com/course/aws-data-analytics/
PDFで要点をしっかり抑える。動画は見ていない

## 問題集

サンプル問題
https://d1.awsstatic.com/training-and-certification/docs-data-analytics-specialty/AWS-Certified-Data-Analytics-Specialty_Sample-Questions_v.1.1_FINAL.pdf
もちろん全部答えられるようにしておく

ExamTopics
https://www.examtopics.com/exams/amazon/aws-certified-data-analytics-specialty/
77問。無料。模範回答はほとんど間違えているが、他の人がどれが正解か議論しているので議論を読んで理解を深められる。自分なりの正解を持つこと（これが正解と説明できること）が重要
とてもよかったのだが、なぜか今は見れなくなっている？？？

AWS Certified Database Specialty Practice Exams 2021
https://portal.tutorialsdojo.com/courses/aws-certified-database-specialty-practice-exams/
65問x2。説明豊富。サイトは若干使いづらい
試験途中でセッションが切れて、最初からになったことが何度か :cry: 
試験後の解説も見にくい
問題の内容自体は良問が多い

Udemy AWS Certified Data Analytics Specialty - Hands On!
https://www.udemy.com/course/aws-data-analytics/
セクションごとの小テストで理解を深める
模試１回分(65x1、ちょっとした解説あり)

## 模試

本試験の１週間前くらいに受けました
スコアは`75%`でした。ギリギリ :sweat: 
設問のパターンは難易度は本試験に近かったと思います。

# 本試験

英語での試験なので`210分`の試験となります。
感覚的には、6割くらいは問題集などで見たことがある問題だったように思います。
残りの４割のうち10-15問くらいは最後の２択までしぼれましたが、自信をもって回答とはいかず、フィーリング回答となりました。
全体の難易度としては、時間的には余裕があり30分あまりました。（追加の30分がなかったらギリギリ）
`ソリューションアーキテクトプロフェッショナル`の試験よりは簡単だけど、`データベース`の試験よりは難しかったという印象です。

次は、`Machine Learning`目指して頑張りたいとおもいますー
CppUTestでMockをつかうには

CppUTestでサンプルのMockを使おうとして嵌った箇所の対応方法を本記事に残そうと思う。

#サンプルのMockでビルドエラー

下記サンプルコードをmakeしたところ・・・・

```
#include "CppUTest/TestHarness.h"
#include "CppUTestExt/MockSupport.h"
TEST_GROUP(MockDocumentation)
{
    void teardown()
    {
        mock().clear();
    }
};

void productionCode()
{
    mock().actualCall("productionCode");
}

TEST(MockDocumentation, SimpleScenario)
{
    mock().expectOneCall("productionCode");
    productionCode();
    mock().checkExpectations();
}
```

こんなエラーが出てきた。


```
testMockBuildTimeTest.cpp:16: undefined reference to `mock(SimpleString const&, MockFailureReporter*)'
testMockBuildTimeTest.cpp:21: undefined reference to `mock(SimpleString const&, MockFailureReporter*)'
testMockBuildTimeTest.cpp:23: undefined reference to `mock(SimpleString const&, MockFailureReporter*)'
・・・・・
```

#原因
cpputest-\*.*\build内のMakefileWorker.mkの下記定義がデフォルトNとなっているために、Mock機能が使えないみたい。

```
# No extentions is default
ifndef CPPUTEST_USE_EXTENSIONS
	CPPUTEST_USE_EXTENSIONS = N
endif
```

#解決策
プロジェクト内のMakefileに上記定義をYにした一文を追加する。

``` Makefile
#Set this to @ to keep the makefile quiet
SILENCE = @

#---- Outputs ----#
COMPONENT_NAME = Project
#Set this to @ to keep the makefile quiet
SILENCE = @

#--- Inputs ----#
PROJECT_HOME_DIR = .
ifeq "$(CPPUTEST_HOME)" ""
    CPPUTEST_HOME = ../CppUTest
endif
CPP_PLATFORM = Gcc

SRC_DIRS = \
    src\
    src/*

# to pick specific files (rather than directories) use this:    
SRC_FILES = 

TEST_SRC_DIRS = \
    tests \
    tests/*

MOCKS_SRC_DIRS = \
    mocks \

INCLUDE_DIRS =\
  .\
  include \
  include/* \
  $(CPPUTEST_HOME)/include/ \
  $(CPPUTEST_HOME)/include/Platforms/Gcc\
  mocks

CPPUTEST_WARNINGFLAGS = -Wall -Werror -Wswitch-default 
CPPUTEST_WARNINGFLAGS += -Wconversion -Wswitch-enum 

# CppUMockを使う場合'Y'に
CPPUTEST_USE_EXTENSIONS = Y

include $(CPPUTEST_HOME)/build/MakefileWorker.mk
```



変更後に再度、makeすると。

```
compiling AllTests.cpp
compiling testMockBuildTimeTest.cpp
compiling testMockBuildTime.cpp
Building archive lib/libtestMock.a
a - objs/src/util/testMockBuildTime.o
Linking testMock_tests
Running testMock_tests
.
OK (1 tests, 1 ran, 1 checks, 0 ignored, 0 filtered out, 0 ms)
```

ビルドが成功した。
[memo] 設計書項目の一例（自分用のメモです・・・）

##要件定義書
※背景や理由を記載しておくと後々議事録を追わなくて済む
1.業務要件
1-1.システムの概要
　※例）ファッション系の通販サイト。海外販売も行う。
1-2.ユースケース
　※使用者、管理者などで分けて。ユースケース図などを使って。
　　例）使用者は会員登録・注文ができる。管理者は商品ページの編集ができる。
2.機能概要
2-1.アプリの種類
　※例）WEBアプリケーションのみ。アプリは不要など。不要なものも明記。
2-2.機能一覧
　※使用者、管理者などを機能（画面）単位で一覧にする。必須かどうかの欄も
　　例）マイページ（ログイン・会員登録内容変更・注文履歴確認）
2-3.外部システム連携
　※例）外部の決済APIを使用するなど
3.非機能要件
3-1.インフラ構成
　※例）EC2XXX台、S3など。
3-2.キャパシティプランニング
　※例）想定使用者数など。
3-3.性能要件
　※例）画面表示は何秒以内など
3-4.可用性
3-5.死活監視
3-6.セキュリティ要件
　※暗号化するなど
3-7.バックアップ計画

##基本設計書（外部設計書）
※顧客向けの資料なので、理解できる単語で説明。
　顧客と認識合わせできる最終資料。
　背景や理由を記載しておくと後々議事録を追わなくて済む
1.目次
2.機能一覧
　※要件定義での機能一覧に加えて裏側で必要なバッチ機能なども追加。
　　CRUDを記載したりする。
3.システム構成
　※例）AWSの構成図など。
　　draw.ioなどの作成ツールがある。
　　▼参考
　　https://ferret-plus.com/8408
4,画面設計
　※画面と要素。どのボタンでどこに遷移するなど。
　　prottのようなモックアップツールを使うのもよい。紙芝居なので顧客のイメージがわきやすい。
　　https://prottapp.com/ja/
5.帳票設計
　※印刷物の画面設計。メール文面や、出力ファイルなど、そういうものも項目を切り出して記載したらいい。
6.バッチ設計
　※日次などのスケジュール実行プログラム
　※例）クレジットカード月額課金バッチなど。目的。トリガー。処理フロー。
　　顧客に分かるレベルで。
7.データ移行設計
　※旧⇒新のデータ移行が必要な場合
　　テーブルのデータのマッピングなどを記載。
　　また、旧⇒新の場合は、機能一覧等に旧のこれが新のどれにかわるみたいなのを記載したほうが、
　　顧客はわかりやすい。廃止機能もわかりあとあとのもめごとがへる。

##詳細設計書（内部設計書）
※プログラマー向けの資料。

クラス図やシーケンス図など書き方はいろいろあるが、
正確に伝わるならなんでもよい。

##単体テスト仕様書
機能単位（関数単位や画面のパーツ単位）

##結合テスト仕様書
機能同士の組み合わせ
※例）マスメン登録してフロントを見ると、登録内容が表示されているなど

##総合テスト（システムテスト）
本番環境＋本番データ
全体をシナリオでテスト。
※例）ユーザーが会員登録して注文して注文履歴見る。
　　　月末にクレジットカードの引き落としが動くなど。

##その他参考
・設計書の項目など。
　https://pm-rasinban.com/
Windows 10 の古いISOイメージをダウンロード (Rufus)

## Download

* https://rufus.ie/downloads/

`appx`版が必要だった。

![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25728/01291da5-c728-4ab0-6a1d-09b909faaeb6.png)


![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25728/bfc6155c-1db4-0c8a-3b6c-485282425cfc.png)

* 自分は`ブラウザを使ってダウンロード`を選んだ。

![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25728/329d03ca-bf7c-7a28-09e4-a03012b8fa93.png)


## Windows 10 の バージョンごとの違い

| バージョン | 説明 |
|:--|:--|
| 1507 | 最初のバージョン。令和非対応。 |
| 1511 | 新しいBitLocker暗号化に対応。令和非対応。 |
| 1607 | 令和対応パッチあり [参考](https://www.atmarkit.co.jp/ait/articles/1905/10/news025.html) |
| 1703 | 夜間モードに対応 |
| 1909 | 令和に対応 (令和は2019年5月1日〜) |

| バージョン | 延長サポート期限 |
|:--|:--|
| 1507 | 2025年10月14日まで |
| 1607 | 2026年10月13日まで |
| 1809 | 2029年1月9日まで |

* https://ja.wikipedia.org/wiki/Microsoft_Windows_10
* [Microsoft、次期Windows 10 LTSCを2021年下半期](https://news.mynavi.jp/article/20210219-1741648/)


![a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25728/033752d0-ef30-6aac-c9a4-2504282b6495.png)
[OCI] S3 Browser を使ってObject Storage にアクセスする




S3 Browserという OCI Oracle Object Storage に接続可能なデスクトップツールがあるので、これ使ってみます。

https://s3browser.com/

からダウンロードします、フリー版を選びます。

# OCI側の準備
## オブジェクトストレージの準備

OCIコンソールから**オブジェクトストレージのバケット**を作ります。

**ネームスペース**を記録

可視性が**パブリック**であることの確認

![image-20210224073413511.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3968/9799347a-eb76-5c25-340e-9db87d791171.png)

**アイデンティティ >> ユーザー >> ユーザーの詳細**

に移動し

**顧客秘密キー > 秘密キーの生成**

![image-20210224073929514.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3968/844ac85c-8d77-1fdb-29cb-758661dcb0bc.png)

![image-20210224074022470.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3968/c89bf87b-902e-51bd-fec2-47d75b12de0d.png)

**秘密キーのコピー**をして　「閉じる」

![image-20210224074037475.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3968/38e2dc84-a752-3630-70ba-fe3e67f24f90.png)

**アクセスキーをコピー**

![image-20210224074209898.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3968/6f08752a-4a11-e387-5f31-9efceee12342.png)

リージョンの確認 : コンソール右上の表示で確認、この例ではサンパウロです

![image-20210227082958515.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3968/d533b0ba-ac9f-088e-8324-b5173823200f.png)

これで OCI 側の情報は揃いました。

# S3 Browserの設定

次はS3 Browser 側の設定です、インストールしてから

**Accounts >> Add New Account**

**Account Name : 任意**

**Account Type : S3 Compatible Storage**

**REST Endpoint:** 　"https://(namespace).compat.objectstorage.(region).oraclecloud.com"

の書式に従って自分のネームスペースとリージョン名を記載します。
**Access Key ID : 先ほど取得したもの**
**Secret Access Key : 先ほど取得したもの**

![image-20210224075323718.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3968/86afcd95-eae8-298f-3f00-983499237ca6.png)

signature を**V4** に変更、これを忘れると接続できません。

![image-20210224075453462.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3968/1deb9de8-fefb-b460-a4d4-b504d4535a5b.png)

# 動作確認

Bucketが見えました、ちょっとhtmlファイルをアップロードしてみます。

![image-20210224075623311.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3968/fe8dd01d-12a9-9406-4c7a-4e63e50e3bd5.png)

index0.html のProperties のURLをコピーして

![image-20210224134910852.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3968/4c39b3cf-86dd-acb6-e3d4-c861a4a2c48c.png)

ブラウザで開けてみます、静的コンテンツが表示できるWebサイトになっていますね。

ただし使えるプロトコルはhttpsのみでhttpは使えません。

![image-20210224134745801.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3968/22aa90f7-7ba1-a2fe-5a7a-c5a95365c0df.png)

ついでに 10GB のファイルのuploadテスト

1385個のチャンクに分かれた8MBの分割パケットで転送することが分かります。

![image-20210224132537996.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3968/da26f08e-9954-ea6d-7ee2-086703cca864.png)

5時間くらい掛かってアップロード完了しました、フリー版は速度制限が掛かっているので、これより遅いことはない、といった判断しかできません。"Pro Version allows you to upload files up to 10 times faster!" と言っています。たしかに、画面の転送表示部を見ると15行あるのでフリーの2スレッドではなくProは15スレッドで転送しそうな感じです。

# まとめ 

- S3 browser はインストールしておいたほうが良いツール
-   Cyberduck以外の選択肢となる
-     巨大ファイル(10G)の遠く(サンパウロ)への転送も問題なし
-       S3 browser 無料版は、大きなファイルは2スレッドで8MB単位のチャンクとして送信する
-         S3 browser pro版は無料版の10倍以上の性能があるらしい

以上
Raspberry PI PICOを買った！…買ったは買ったが。。。

●修正(2021.03.02)　リンク先主様への問は未だ答えないが、「相対パスを正しく指定する」だけの事なので、公開に変えます。

まずはじめに断っておく。
ただのPIC/AVRの延長線上気分で買った。
※これだけで意味がわかる人はここでブラウザバックやで！

１）ここまでの出来た事。
Ubuntu20.04にてクロスコンパイル環境構築。
ほぼ下記記事の通りに進めた。

　PicoボードにPico_SDKでC言語をビルドする: xshige's beta notes
　https://beta-notes.way-nifty.com/blog/2021/02/post-2fff25.html

一箇所誤植？があって
「Pico_SDKの準備」の「# pico SDK のダウンロード」の所で「mkdir ~/pico」後にcdしてない。
もしかしたらデレクトリ構造でSDKだけ別にするって事かも知れないが、その辺は意図が読めない。
記事主に問うてみたが…どっちだろね。

後はpicoprobeの手前まで全部うまく行きました。
自分なりのプロジェクトで軽いコンソール表示プログラムも正常に動作。なかなか恐ろしい子。
※この速さはPIC/AVR等の頃にはちょっとない開発環境の整備具合。
※H8時代なんてもっと苦労したのに…現代は凄いね。

後、project generatorだけど、python3で書かれていて、tkinterを使用している。
私は
　sudo apt install python3-tk
でインストールしたが、pipなりなんなりで導入しないと動かない。

２）解らない事
さて…いかがした物か。
PIOと言う強力な仕組みがあると聞いているが、これがなかなか…。
雰囲気的にはSoCのDSP的な感覚だが、より「GPIOを意識した機能の強化と分化」がなされた印象。
入出力に関して専用でスケーラブルな構造を与える事でオンプログラムに意識させない制御が可能。
余り大きな事、複雑過ぎる事は出来ない様だが、結構な専用領域を持っているのでそこそこの事はできそう。
そもそもデジタル信号なんてオンオフの連続、鍵となるのは時系列で見た時の意味だけだ。
※タイミングチャートって事だよね。
でもこれを「英語がわからぬ」私如きでは理解が遠い。
日本語の資料がとても欲しいよね。

３）むすび
今の所はただの「謎だらけなマイコン」状態。
ただ、マイコンとしてみてもプログラムロードのお気軽(※)さ、開発環境さえ整えば「ただの早いマイコン」として使うだけなら開発もそれ程難しくない。
プロジェクトビルダーもそれなりには強力だ。
pythonで提供されているので今後の拡張も十分期待できるし、自分なりに改造出来るかもしれぬ。
見どころは多いがやはり「言葉の壁」が老体には厳しい。
若人の奮闘に期待し、嬉しい検索結果が出るのを待つ事にしよう。

※　USBメモリ的コピー操作のみ！面倒なダウンロードケーブルや専用ソフト不要！
【SAP】SAP TechEd 2020　~データベース②編~


**【SAP】SAP TechEd 2020　~データベース①編~の続き**

メイントラック：DATABASE AND DATA MANAGEMENT
サブトラック：Administer and operate SAP HANA in the cloud

#講義内容#
##Database Administration in SAP HANA and SAP HANA Cloud [DAT104]##
SAP HANAのDB管理ツールが、これまではHana Studioが主流であったが、HANA CockpitがHANA1.0 SPS12及びHANA 2.0から、On-Premise、SAP HANA Cloudでリリースとなった。今後、HANA Studioの機能拡張は行われず、HANA Cockpitが主流になるとのこと。HANA Cockpitの特徴は以下の通り。

*・WEBベースである。*
*・SAP UI5のユーザインタフェース*
*・カタログ用のSAPHANAデータベースエクスプローラーが含まれており、SQLステートメントとトレースファイルの参照、実行が可能*


本講義では、HANA Cockpitの特徴について、実際に画面を見せながら丁寧に説明していた。
興味のある人は、資料もSAP TechEd2020のホームページからダウンロードできるので、確認してみるのが良いだろう。

##Overview of Data Tiering Options in SAP HANA and SAP HANA Cloud [DAT105]##
データベースの容量は、利用すれば当然増え続け、パフォーマンスも低下する。容量が増加に対応するためにはIn-memorの増強が必要になるが、In-memoryのコストは高い。これらを解決するためには、従来のAcrhiveという概念があるが、それ以外にも幾つかのオプションがある。ＳＡＰではまずデータを以下３種類に分別しており、そのデータの種類ごとに保管場所を変えることを推奨している。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/792264/ccfef138-c0c3-f0c1-930e-823c06d50bcf.png)

上図のようにHot Data,　Warm Data,　Cold　Dataの３パターンに分け、Hot Dataはコストの高いが、パフォーマンスの良いPMEMに、利用頻度がそれほど高くないWarm DataはNSEに、ほとんど利用しないデータはIQやHDFSなどの外部ストレージに保管するのがコスト的にもよい。

また製品によって、保管場所に対する方針は変わってくる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/792264/6dfad9b0-0bbd-3ce1-4e42-7df7c5dbbb61.png)
上図では、BWは除いているが、Native SAP HANAとS/4 HANAではとりうるオプションが異なる。S/4の場合は、NSEはAgingを指すことになる。

##Administration and Operation of SAP HANA Cloud, Data Lake  [DAT103]##
SAP HANA CloudをData Lakeとして利用する方法について解説している。
前のブログで記載したSAP HANA Cloud: How to Extend Your On Premise Landscape to the Cloud[DAT101]の⓶SAP HANA CloudをData Lakeとして利用する方法でデータをSAP HANA Cloudに収集し、大容量のデータをHANA DBとSAP IQを利用し、保持することができる。下図にあるようにSAP HANAのSide carとしてSAP IQを利用することで100TBsのデータを低コストでもつことができる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/792264/febe1069-ee11-98db-620f-ba74df6f7995.png)
※SAP TechEd2020 - Administration and Operation of SAP HANA Cloud, Data Lakeから引用
SAP TechEd2020ホームページ　(https://pages.sapteched.com/sap/sapteched2020/index)

#おわりに#
SAP HANAが登場し、かれこれ10年が経過しようとしている。データ量は日々増加しており、それに合わせてHWやCloudベンダも対応してきており、今後もニーズに合わせて対応してくと思う。ただ、コストのことも考えると、In-memoryは高価であるため、やはりよく使うデータと使わないデータを分類し、使わないデータはより安価なストレージに移行し、よく使うデータだけをIn-Memory上で保持することは今後必要になってくると思う。そのために、まずはよく使うデータと使わないデータをどのように分類し、どのようにWarm DataやCold Dataを移動する手段を知っておくのが必要だと思う。
またSAP HANA Cloudも今後採用する企業が増えてくると、On-PremiseやIaaS上のデータを移行するPJTは増加してくると思う。ここを以下に簡単に短時間で実施できるのかというは課題になると思う。
【TypeScript】TypeScript の Getter と Setter

#TypeScriptのGetterとSetter
* Getter/Setterを使うことで、カプセル化をしつつ、privateのプロパティを外部から取得/変更できます
    * カプセル化は、外部から内部のデータや処理を隠蔽する事です
* Getter `get メソッド名(引数:型)`
* Setter `set メソッド名(引数:型)`


```ts
//親クラス
class Department {

  protected employees: string[] = [];

  constructor(private readonly id: string, public name: string) {
  }
}
```
```ts
// AccountingDepartment サブクラス
class AccountingDepartment extends Department {
  private lastReport: string; 

  //Getterで、privateフィールドを外部から取得できるようにする
  get mostRecentReport() {
    if (this.lastReport) {  
      return this.lastReport; 
    }
    throw new Error('レポートが見つかりませんm(__)m');
  }

 //Setterで、privateフィールドを外部から変更できるようにする
  set mostRecentReport(value: string) {
    if (!value) { 
      throw new Error('正しい値を設定してください！');
    }
    this.addReport(value); //最新のレポートを追加
  }

  constructor(id: string, private reports: string[]) {
    super(id, 'Accounting');
    this.lastReport = reports[0]; 
  }

  addReport(text: string) {
    this.reports.push(text);
    this.lastReport = text;
  }

}

const accounting = new AccountingDepartment('d2', []);
console.log(accounting.mostRecentReport); //レポートが見つかりません。

//レポートを追加
accounting.addReport('新しいレポートだよ');

//Getterで値を取得
console.log(accounting.mostRecentReport); //新しいレポートだよ
accounting.mostRecentReport = ''; //正しい値を設定してください！

//Setterで値を設定
accounting.mostRecentReport = '重要なレポート';
accounting.addReport('とても重要なレポート');  
console.log(accounting.mostRecentReport); //とても重要なレポート

```
Gitをカードゲームで学べる Oh My Git! で遊んでみた

# はじめに
Gitの概念って理解するのが大変ですよね。
私は最近コンフリクトを起こしてしまい、
早くプロジェクトを勧めたいのにGitに時間をとられてしまいました。

もう少しわかりやすく学習できる方法はないのかな・・・
と思っていたらGitを学べるゲームがありました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532869/f0626f75-4c86-5931-63fb-f94efebac76e.png)

# ダウンロード
下記のページからWindows, Linux, MAC版がダウンロード出来ます。
https://blinry.itch.io/oh-my-git

# 遊び方
ゲームを起動したら"Levels"を選択、学びたいレベルを選択します。

![Screen Shot 2021-02-27 at 8.41.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532869/b0b4b38f-a96a-5d32-8c06-7c0c31f1a9c5.png)

- 赤背景の文字がミッションです。
各ミッションはクリアすると緑色に変わり、LEVELの全てのミッションを達成するとLEVELクリアです。

- 画面中央がブランチツリーで四角い正方形がコミット、キャラクターがいるコミットがHEADです。

- gitコマンドの書いてあるカードをドラッグまたは右下のボックスにgitコマンドを入力、
ミッションの下に表示された各ファイルを開き、編集してクリアを目指しましょう。

##コマンドの使い方

- コマンドを入力すると表示されるスニペットはtabキーで選択が出来ます.
- コミットのハッシュ値の取得はコマンド入力中に黄色い正方形(コミット)をMACなら２本指タップ、恐らくWindowsであれば右クリックで出来ます。

カードを使わずにコマンドのみでLEVELをクリアするとLEVELS画面に称号(マーク)が付きます。

#参考
https://ohmygit.org/
https://github.com/git-learning-game/oh-my-git
https://labs.cybozu.co.jp/blog/akky/2021/02/oh-my-git-learning-game/の
sympyで(二項係数)「2021 東京大学 文系数学前期[第4問]」 をやってみたい(途中)

(問題)　東京大学 2021 数学前期文系[第4問]PDF＜代々木ゼミナール
https://www.yomiuri.co.jp/nyushi/sokuho/k_mondaitokaitou/tokyo/mondai/img/tokyo_zenki_sugaku_bun_mon.pdf#page=4
(解答へ)東京大学 2021 数学前期文系[第4問]＜東進
http://www.toshin.com/sokuho/univ.php?univname=%C5%EC%B5%FE%C2%E7%B3%D8&gakubuname=%CA%B8%B2%CA%B0%EC%CE%E0%A1%A2%CA%B8%B2%CA%C6%F3%CE%E0%A1%A2%CA%B8%B2%CA%BB%B0%CE%E0

おすすめのYouTubeを教えて下さい。
# sympyで
### (1)　勉強中
### (2)　勉強中
### (3)　勉強中
### (4)　(1)(2)(3)を使っていません。

2021，31～40

```python
from sympy.functions.combinatorial.numbers import nC
for i in [37,31,32,33,34,35,36,37, 38, 39, 40 ]:
    print("#",i,nC(2021, i) % 4,nC(2021, i))
# 37 3 10549453167137272405699426118445044729600037976073052501105621045645733312800275
# 31 0 286485859642525097862685653072648388987850977030183058240924054623120
# 32 3 17815839396519529523335764050455321690181982634064508934357464646875275
# 33 3 1073809229081131643088328324131988934599150407853160856679909005534391575
# 34 2 62786257276861461954694020834541000058326794435649523031754679500069719150
# 35 2 3564465520260677854399343411378084774739866872675302921831329947618243770030
# 36 3 196639681201047394967697111527691010073149322475920877854361702110273114646655
# 37 3 10549453167137272405699426118445044729600037976073052501105621045645733312800275
# 38 0 550792502200009169813359511026183387987538824856024635847198740909503549805151200
# 39 0 28005680304169697018971587445254401496904858709987098791922951364706295878554226400
# 40 0 1387681459071608487290042157912355594171635749079860745139782240121196960782361918120
```

2020～2030，37

```python
from sympy.functions.combinatorial.numbers import nC
for i in [2020,2021,2022,2023,2024,2025,2025,2027,2028,2029,2030 ]:
    print("#",i,nC(i, 37) % 4,nC(i, 37))
# 2020 0 10356316221474689981646542018305278942863174341676861040174939215517632307073600
# 2021 3 10549453167137272405699426118445044729600037976073052501105621045645733312800275
# 2022 2 10746092848338319800667123229972735739673187298548973378959982747756006427446930
# 2023 3 10946296995059627873489219684911804834521076487897569559736175779813897785863615
# 2024 0 11150128393558473485627670177283086555143763870913276692957231896498907457769480
# 2025 2 11357650903901362579676072489435739574530242373540938281307039532399541047275250
# 2025 2 11357650903901362579676072489435739574530242373540938281307039532399541047275250
# 2027 2 11784030176612962628295041382000684817299795967243284881349983164132442003362050
# 2028 0 12003020189940275344139801066146352993211444611536605594865778933631638564951400
# 2029 1 12225967854110852747620309419282605533748002568678600779107763783302507353557425
# 2030 2 12452942671271967424821489273027440659060935882798574802603492463674907138846750
```


# wolframalphaで
### (1)　勉強中
### (2)　勉強中
### (3)　勉強中
### (4)　(1)(2)(3)を使っていません。

入力:
binomial(2021, 37) mod 4
https://www.wolframalpha.com/input/?i=binomial%282021%2C+37%29+mod+4&lang=ja
結果:
3

入力:
binomial(2021, 37)
https://www.wolframalpha.com/input/?i=binomial%282021%2C+37%29+&lang=ja
1.05494531671372724056994261184450447296000379760730525011056... × 10^79
【jquery,js】表示する時間によって画像を変更する[switch,Date,append,html] [js09_20210227]

####  <font color='orange'>処理の概要</font>
ブラウザを開いた時、時間帯によって表示する画像を変えます。
index.htmlと同じ階層にimgフォルダを用意し、任意の画像を格納して下さい。

##### 処理のフロー：
　(1)dateオブジェクトで時間を取得
　(2)ケース分岐して表示するためのファイルを指定する
　(3)jsで要素を追加し、画像を表示する

####  <font color='orange'>画面イメージ</font>


#####画像１
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647299/e9ae7e72-ab5f-0aa2-38b3-e4179d975162.png" width="300px">
時間帯によって表示される画像が変わります。今は、７時なのでこの画像が表示されます。他の画像を貼り付けるのが面倒なので、今回はこれだけです。

####  <font color='orange'>ソースコード</font>
```html:index.html
<head>
<link rel="stylesheet" href="./css/default.css">
</head>
<body>
<div id="timeBackImage"></div>
</body>
```

```javascript:main.js
// DOMの準備後に実行する内容
$(function() {
    var ldateObj = new Date();
    var currentTime = ldateObj.getHours();
    var lfileName = "";

    switch(true){
        case (0 <= currentTime && currentTime < 5):
            lfileName = 'night.png';
            break;
        case (5 <= currentTime && currentTime < 12):
            lfileName = 'morning.png';
            break;
        case (12 <= currentTime && currentTime < 18):
            lfileName = 'daytime.png';
            break;
        case (18 <= currentTime && currentTime < 24):
            lfileName = 'night.png';
            break;
    }

//   // 時間による分岐
//   if (0 <= h && h < 7) {
//     fileName = "night.png";   // 夜  0～ 6時 night.png
//   } else if (7 <= h && h < 12) {
//     fileName = "morning.png"; // 朝  7～11時 morning.png
//   } else if (12 <= h && h < 19) {
//     fileName = "daytime.png"; // 昼 12～18時 daytime.png
//   } else if (19 <= h && h < 24) {
//     fileName = "night.png";   // 夜 19～23時 night.png
//   }

    var addImageTag = $("<img>");
    addImageTag.attr("src","img/" + lfileName);
    $("#timeBackImage").append(addImageTag);
});
```

```default.css
img {
	width: 300px;
	height: 200px;
}
```

####  <font color='orange'>ポイント</font>
html：
(1)なし
js：
(1)Dateオブジェクトを作成し、現在時刻を取得する準備をする
(2)※switchメソッドはこの使い方は可読性を下げます。ifとelseifで分けた方がいいです。
(3)htmlメソッドではなく、appendで子要素として追加します

####  <font color='orange'>参考資料</font>
JavaScript(仕事の現場でサッと使える！デザイン教科書)　p130
ずっとFPGA初心者（その４：複数信号を束ねる）

# 複数信号を束ねる
今回のお題は、std_logic_vector()を使って複数の信号線を束ねるもの。

## ボタン押下回数を表現
[その１](https://qiita.com/infinite1oop/items/4b0f03b97ed859fbd954)から使っている[Odyssey MAX10 FPGA Eval Kit](https://www.macnica.co.jp/business/semiconductor/macnica_products/boards/121161/)の７つのLED（LED0-LED7）を用いて、ボタン押下の回数を表現する。例えば、５回押した場合、LED0とLED2とを点灯させる（00000101）。７セグメントディスプレイの方がふさわしいが、手元になかったため、ボード上のLEDを用いた。

### コード

```vhdl:Vector.vhd
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;  -- ①

entity Vector is
  port (BTN: in std_logic;
  LED0, LED1, LED2, LED3, LED4, LED5, LED6, LED7: out std_logic);
end Vector;

architecture RTL of Vector is
signal NUM: integer := 0;
signal LED: std_logic_vector(7 downto 0) := "00000000"; -- ②

begin
  LED0 <= not LED(0); LED1 <= not LED(1); -- ③
  LED2 <= not LED(2); LED3 <= not LED(3);
  LED4 <= not LED(4); LED5 <= not LED(5);
  LED6 <= not LED(6); LED7 <= not LED(7);
  
  process (BTN)
  begin
    if (BTN'event and BTN='0') then
		NUM <= NUM+1;  -- ④
		LED <= conv_std_logic_vector(NUM+1,8); -- ⑤
	 end if;
  end process;
end RTL;
```

①後述するconv_std_logic_vector()を使うには、「ieee.std_logic_arith.all」が必要であった。
②std_logic_vectorを用いた内部信号LEDの定義（MSBがbit 7）。
③本ボードでは負論理
④ボタン押下時、内部信号NUMをインクリメント
⑤「conv_std_logic_vector()」を用いて、Integer型からstd_logic_vector型であるLEDへ変換。なお、内部信号は次のProcess文が呼ばれる時に更新されるため、「NUM+1」を変換対象としている。

### ピンアサイン
![PinPlanner.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/25cc0e9a-f3f6-117f-e1a5-870982fe4c8e.png)
Pin Plannerを用いて、上記のようにアサイン。ピン情報などは、[その１](https://qiita.com/infinite1oop/items/4b0f03b97ed859fbd954)を参照。

### 実験
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/5b172a26-1ad0-704d-5e61-2619e03cc3d2.jpeg", width=60%>

成功。
ナウキャストの画像取得(20210224版)

# これは何ですか？
気象庁の降水レーダー画像を取得するスクリプトです。2021年02月24日の更新に伴って書き直しました。

画像取得ソースは:point_down:

https://www.jma.go.jp/bosai/nowc/

コードはgistに収めています。

[ナウキャストの画像取得(20210224版) by puppeteer/node.js]
(https://gist.github.com/59t9/666901916c2d06332f7f3a659da5e255)

相変わらず習作ですが、画像取得リトライ工作をなんぼかいたしました。Slackによるエラー通知もさせてみました。ユーザ依存な部分を伏せ書きにしていますのでご注意ください。

お役に立てれば幸いです。