OmniAICreator/Qiita-1.07M huggingface dataset:
推計統計学のPythonでの簡単な実装

# 推計統計学
様々な種類を持つ統計学ですが、代表的なものとして「記述統計学」、「推計統計学」、「ベイズ統計学」の３種類があります。（今回は「ベイズ統計学」に関しては置いておきます。）
「記述統計学」と「推計統計学」はそれぞれ、記述統計学 = `手持ちのデータを集計する方法の学問`、
推計統計学 = `手持ちのデータを分析して、まだ手に入れていないデータについて議論する方法を学ぶ学問`と説明されます。
(引用：[Logic of Blue 記述統計の基礎](https://logics-of-blue.com/%E8%A8%98%E8%BF%B0%E7%B5%B1%E8%A8%88%E3%81%AE%E5%9F%BA%E7%A4%8E/))
つまり、記述統計学ではデータ（標本）から平均や標準偏差を求めるのに対して、推計統計学では標本をベースに統計的な分析を実施して、その背後にあるデータ全体（母集団）を求めます。

　　　　　　　　　　　　![m-1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1859982/946f227e-a24e-8beb-ac8a-9689c958fa2d.jpeg)

## 大数の法則
サイコロを投げて出目を調べる事を考えます。
サイコロをどんどん振っていき、それまでの平均値の軌跡をたどります。具体的には、１回目投げた時の目が $1$の時は平均 $1$、次に投げたときに $3$が出た場合は、$(1+3)/2$で平均は $2$というように、続けて平均値を計算します。

```python
# 大数の法則
# 計算回数
calc_times =1000
# サイコロ
sample_array = np.array([1, 2, 3, 4, 5, 6])
number_cnt = np.arange(1, calc_times + 1)

# 4つのパスを生成
for i in range(4):
    p = np.random.choice(sample_array, calc_times).cumsum()
    plt.plot(p / number_cnt)
```
![スクリーンショット 2021-10-06 18.35.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1859982/b567ff40-414b-81b5-5ce3-cd931b34f3b4.png)

## 中心極限定理
中心極限定理は「ある母集団から無作為に抽出された標本の平均は、サンプルのサイズを大きくすると母集団の平均（母平均）に近づく」と言うもので、今の場合、サイコロを投げる回数 $N$ が増えれば増えるほど、標本平均が正規分布の形になっていく法則です。

```python
# 中心極限定理
def function_central_theory(N):
    
    sample_array = np.array([1, 2, 3, 4, 5, 6])
    numaber_cnt = np.arange(1, N + 1) * 1.0
 
    mean_array = np.array([])
 
    for i in range(1000):   
        cum_variables = np.random.choice(sample_array, N).cumsum()*1.0
        mean_array = np.append(mean_array, cum_variables[N-1] / N)
 
    plt.hist(mean_array)
```
上記の関数```function_central_theory(N)```を用いて、 $N$ を増加させていき、その日ストグラフを見てみます。

```python
# N=3
function_central_theory(3)
```
![スクリーンショット 2021-10-06 18.35.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1859982/71ed5413-1020-c0d4-fd83-c5765d476f04.png)

```python
# N=6
function_central_theory(6)
```

![スクリーンショット 2021-10-06 18.35.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1859982/7a5f9ba0-8daf-16e4-e84a-58631ebfb643.png)

```python
# N= 10^4
function_central_theory(10**4)
```
![スクリーンショット 2021-10-06 18.35.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1859982/a42cacfa-83b4-84ef-78c2-bab715342393.png)

$N$ をどんどん増やしていくと、正規分布に近づいていくのが確認できます。

参考文献：
[記述統計学と推計統計学の違い](https://ai-trend.jp/basic-study/basic/inductive-statistics/)
【python】クロージャ[py_03_20211006]



###はじめに
Pythonでは関数の中に関数を定義することができます。

###実行環境
pycharm　2021.2(python3.10)


###コード１
まずはクロージャの簡単な動作から。

```python
def func():
    def inner(a):
        print('a:', a)
        print('a**2:', a ** 2)

    inner(2)

func()
```

<font color="#56c502"><b>表示</b></font>

```
a: 2
a**2: 4
```


###コード２
関数内関数を使うことにより、関数を戻り値として返すことができるようになります。

```python
def adder(a):
    def inner(x):
        # xは関数内関数の引数、aはadder呼び出し時の引数
        return x + a
    return inner

# クロージャを作成し、add3, add5に代入する
add3 = adder(3)
add5 = adder(5)

# add3, add5に代入されたクロージャを呼び出す
print(add3(10))
print(add5(10))
```

<font color="#56c502"><b>表示</b></font>

```
13
15
```
Remote WSLの罠

## 前書き
ただのメモです、VsCodeのRemote WSLを使っていて、少し悩んだことがあったので、残しておきます

## C++のインテリセンスが効かない？
Remote WSLを使っていて、変だと思った点がありました。妙にインテリセンスが効かない、というか全く機能していない...　拡張機能のC/C++ extensionのc_cpp_properties.jsonを調べても、特に問題はなさそうだったので、困ってしまいました。
## 原因
どうやら一度ローカルにインストールした拡張機能の殆どが、Remote WSLのワークスペースでは無効となってしまうようです(そういう認識で合ってますかね？)。一度ローカルでインストールしたはずのC/C++ extensionも無効になっていました。

## 解決策
![capture.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/694810/2247e582-892e-b01a-aa87-25a567c87c56.png)
ただWSL上にもインストールし直すだけです。ローカルには存在するもののWSL上には存在しない拡張機能は、図のような警告表示がなされています。

##あとがき
Remote WSLの仕様を理解せずに使っていたのが原因で時間を取られてしまいました。気をつけたいです。
AndroidのNavigationコンポーネントで親Fragmentを取得する方法

# 解決策
``` kotlin
val navHostFragment = parentFragment as NavHostFragment
val parent = navHostFragment.childFragmentManager.fragments[0]
if (parent is MainFragment)
// ...略
```
`Fragment#getParentFragment()`が`NavHostFragment`なのでDialogFragmentなどを実装している時、呼び出し元のFragmentにコールバックさせるのがひと手間いる。
`NavHostFragment`の子Fragmentを覗いてみたら

```
[呼び出し元のFragment, 呼び出されたFragment, ...]
```
という風になっているので上記の内容で呼び出し元のFragmentを取得できた。

:::note warn
ただし、バックスタックがたくさんある場合はfragments[0]が呼び出し元のFragmentとは限らない。
:::

# 別の解決策
https://stackoverflow.com/a/53872585

``` kotlin
val navHostFragment = parentFragment as NavHostFragment
val parent = navHostFragment.parentFragment as Fragment
if (parent is MainFragment)
// ...略
```
のように取得できるとのことだが、自分の環境ではnullが返ってきてしまうので１つ目の解決策をとらざるを得なかった。
`NavHostFragment`にスタックを格納してるっぽいのでこれで取得できない気もするんだけど、バックスタックが多い環境下では取得できるのかもしれない。

# 所感
Navigationコンポーネント最高！
でも、以前の組み方が独特な方はご注意を！

# 参考
- [How to access a view of parent fragment from child fragment in navigation component](https://stackoverflow.com/a/53872585)
VSCodeでFlutterをデバッグしてもChromeに何も表示されない問題

# はじめに
「Flutterでアプリ開発をしてみよう！」と思った矢先につまづいたので、備忘録として残します。

# 現象
Flutterをインストールし、`flutter create myapp`と初期プロジェクトを作り、VSCodeでデバッグしたら発生しました。

こんな感じです。
待てど暮らせど、Webアプリは表示されません。
![スクリーンショット 2021-10-06 16.31.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1820436/31a74fa6-b09d-8774-0a09-b938cc14994e.png)

もう少し設定の詳細を書くとこんな感じです。
* VSCodeのdeviceはChromeを選択
* デバッグは`Dart & Flutter`を選択
* launch.jsonで構成は正しく設定

少しおかしいなと思ったのは以下です。
* `flutter create myapp`直後の1回目のデバッグはうまくいった
* デバッグをやり直すと失敗した

# 解決策
色々調べた結果、**Flutterのアップデート**で解決しました。

```
flatter upgrade
```
確認したところ、Flutterのバージョンが`2.0.1`から`2.5.2`に上がっていました。

ChromeのアップデートによるDartSDK変更による問題だったようです。
最新のFlutterでは解決済みとのことです。
連想配列の逆引きFunction

`Dic(Key)`→`Item`
となるところを逆引きしたくて作った

引数にItem名と辞書名を入れたらKeyを取り出せる。
ヒットしない場合は空白を返す


``` vb
Function Dic逆引き(Item名, TargetDic As Object)
  Dim Keys, Items
  Keys = TargetDic.Keys
  Items = TargetDic.Items
  
  Dim i
  For i = 0 To TargetDic.Count
    If Items(i) = Item名 Then
      Dic逆引き = Keys(i)
      Exit Function
    End If
  Next
  Dic逆引き = ""
End Function
```
【Android】OkHttpによるHTTP通信時のコネクションの再利用

## 概要

[OkHttp](https://square.github.io/okhttp/)のOkHttpClientオブジェクトを再利用することによる通信処理の効率化について記載します。

[iOS(Swift)についてはこちら](https://qiita.com/cwan/items/a1d169152fc65520bf3b)

## 障害事象

弊社が開発しているAndroidアプリのデータ転送量が多すぎるのではないかという報告を受けました。データ転送量を測定してみると、HTTPリクエスト・レスポンスのヘッダーおよびボディサイズの合計の2.5倍程度の量が発生していました。

※このアプリの外部への通信はすべてOkHttp (ver.4) を使用して実装されています。

## 調査方法

Android StudioのProfilerを使用して、通信状況を調べてみることにしました。

1. Androidシミュレーター (AVD) でアプリを起動する
1. ツールバー > [View] > [Tool Windows] > [Profiler]
1. [SESSION] の右の [+] ボタンをクリックして、起動したアプリのプロセスを選択する
1. [NETWORK] をクリックする

![launch_profiler.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27823/fa85cce9-ce6d-f2bc-ebe8-205bd6e73c32.png)

以下の画像がそのときの状況です。[Connections] の数を見ると、単調増加していることが分かります。このことから、コネクションが再利用されていないことが問題であると推測されました。

![connections_before.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27823/c12843aa-e417-5554-8713-8e7219f76f24.png)

## 問題点と修正内容

通信処理の実装では、リクエストの度にOkHttpClientオブジェクトを生成してたため、コネクションプールが使用されていませんでした。

以下の記事にある通り、シングルトンにして同一のOkHttpClientオブジェクトを再利用するようにしました。

* [OkHttp3はシングルトンにすべし - Qiita](https://qiita.com/taki4227/items/a6ce71c6496998aa1ecc)

## 修正後の効果

以下の画像は、修正後のProfilerの状況です。Connectionsの数が増えなくなりました。  

![connections_after.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27823/238e21a1-07e7-3ec6-1c95-6d1a2a367588.png)

また、データ転送量の合計は以前の半分程度に減りました。
Sysdig OSSをGKE Cos(Container Optimized OS) で実行する

## モチベーション

GKEにて調査のため、Sysdigを使って、systemcallを取りたい。
（Sydig OSSはSystem callを取得、FilterしてtroubleshootなどができるOpen Sourceです）


## 問題

Sysdigをインストールすると以下のようなエラーがでる。


```
fedra / # docker run -it --name sysdig --privileged --net=host -v /var/run/docker.sock:/host/var/run/docker.sock -v /dev:/host/dev -v /proc:/host/proc:ro -v /boot:/host/boot:ro -v /lib/modules:/host/lib/modules:ro -v /usr:/host/usr:ro -v /etc:/host/etc:ro  sysdig/sysdig
* Setting up /usr/src links from host
* Unloading sysdig-probe, if present
* Running dkms install for sysdig
Error! echo
Your kernel headers for kernel 5.4.120+ cannot be found at
/lib/modules/5.4.120+/build or /lib/modules/5.4.120+/source.
* Running dkms build failed, couldn't find /var/lib/dkms/sysdig/0.27.1/build/make.log
* Trying to load a system sysdig-probe, if present
* Trying to find precompiled sysdig-probe for 5.4.120+
Found kernel config at /proc/config.gz
* Trying to download precompiled module from https://download.sysdig.com/stable/sysdig-probe-binaries/sysdig-probe-0.27.1-x86_64-5.4.120%2B-c4b74c595cdb9cd3ad6f7660bec5729a.ko
curl: (22) The requested URL returned error: 404
```

これはsysdig probe moduleがインストールできないため。
それでも、GKEにてSysdig OSSが使いたい。


## 解決

`-e SYSDIG_BPF_PROBE=""` 環境変数で、eBPFオプションを渡すと起動します。

```
docker run -it --name sysdig --privileged --net=host -v /var/run/docker.sock:/host/var/run/docker.sock -v /dev:/host/dev -v /proc:/host/proc:ro -v /boot:/host/boot:ro -v /lib/modules:/host/lib/modules:ro -v /usr:/host/u
sr:ro -v /etc:/host/etc:ro -e SYSDIG_BPF_PROBE="" sysdig/sysdig
* Setting up /usr/src links from host
* Mounting debugfs
Found kernel config at /proc/config.gz
* COS detected (build 16108.470.1), using cos kernel headers...
* Downloading https://storage.googleapis.com/cos-tools/16108.470.1/kernel-headers.tgz
* Extracting kernel sources
* Configuring kernel
* Trying to compile BPF probe sysdig-probe-bpf (sysdig-probe-bpf-0.27.1-x86_64-5.4.120+-c4b74c595cdb9cd3ad6f7660bec5729a.o)
In file included from /usr/src/sysdig-0.27.1/bpf/probe.c:13:
In file included from ./include/linux/sched.h:14:
In file included from ./include/linux/pid.h:6:
In file included from ./include/linux/wait.h:9:
In file included from ./include/linux/spinlock.h:89:
In file included from ./arch/x86/include/asm/spinlock.h:27:
In file included from ./arch/x86/include/asm/qspinlock.h:110:
...

4 warnings generated.
* BPF probe located, it's now possible to start sysdig
```

## テスト

立ち上がった、dockerにて sysdigコマンドを使ってみる。

```
root@gke-cluster-2-pool-1-2413fd52-3kr2:/# sysdig "proc.name=containerd-shim and evt.dir=< and evt.type=read"
^Croot@gke-cluster-2-pool-1-2413fd52-3kr2:/# sysdig "proc.name=containerd-shim and evt.type=read"

39397 08:56:16.479886942 0 containerd-shim (44905) > read fd=23 size=4096
39401 08:56:16.479899460 0 containerd-shim (44905) < read res=1 data=.
39408 08:56:16.479933193 0 containerd-shim (44905) > read fd=23 size=4096
39409 08:56:16.479934883 0 containerd-shim (44905) < read res=-11(EAGAIN) data
```



## 参照

https://github.com/draios/sysdig/wiki/eBPF
【Power Automate】Dataverse の行の更新をトリガーにするとき列を選択する方法

向井です。

Power Automate のトリガーを Dataverse の行が更新されたときにして、列を選択したときにエラーが出た場合の解消方法をメモしておきます。

#発生した事象
今回出たエラーの内容は以下です。
*"The following filtering attributes are not valid in entity msdyn_projecttask"*
![MicrosoftTeams-image (7).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1004488/1936f20c-a991-799d-9b35-775e6e0feda1.png)

下の画像のように、プロジェクトタスクテーブルのレコードのある列が更新されたときをトリガーとして設定しています。
この「列を選択する」の書き方が問題でエラーが出ていました。
![MicrosoftTeams-image (6).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1004488/5036ba3f-9f46-4889-f723-5ceca2c3c18e.png)

#解決方法
列のフィルターをするには列名を記入するのですが、**この列名は小文字で入力する必要があります。**

今回大文字を入力してしまった理由は下の画像の①のところをコピペするとなぜか大文字が入ってしまっていたからです。。
②のところをよく見ると、列名は小文字になっています。
このようなことがたまにあるようですが、Power Automate で列名を指定するときは小文字で入力するようにしましょう。
![InkedMicrosoftTeams-image (8)_LI.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1004488/e0a24b6b-eff5-1171-ab0a-c93ded05bf4c.jpeg)
HTML/CSS/javascriptに関して覚書

#大前提#
__可読性の高いコードを書こう__
学生の頃はこんなこと1mmも教わらなかったけど本当に大事だな～と42tokyo在籍時に感じた。
#HTML#
BEMでの命名について
・-first等枝番や-small等形容詞的な命名はNG
せっかくメンテナンスしやすいようにBEMを採用してるのに、仕様変更で変わる可能性のある枝番や形容詞的なクラス名は意味がない。

#CSS#
・疑似クラスについて
nth-child(n)は全体の何番目
nth-op-type(n)は指定した要素の何番目

#javascript#
・$(function() { });
DOMが準備されてからjQueryを実行するおまじない。

・メソッドチェーン
返り値でjQueryオブジェクトを返すメソッドの後にのみメソッドを連結できる。

・addClass()
対象のDOMにクラスを追加する（引数のクラスには.を付けないので注意）
css()よりもjavascriptがわの記述量が少なく使いまわしが効く。

・find()
指定されたDOM要素から引数に渡された要素を取得する。

・setTimeout()
第一引数に関数、第二引数に秒数（ミリ秒単位）を渡す。

・on()
取れる引数は、イベント名,セレクタ,データ,関数

・modal
表示するmodal windowを作っておいてdisplay: noneで見えないようにする。
対応する処理が実行された際にblockにするなりfadeInするなりして表示、非表示にする。

・タブメニュー
addClass,removeClassでdiplay: noneを切り替える。

・stop()
現在実行されているアニメーションを止める。
第一引数はキューのクリア、第二引数はゴールジャンプ

for,while,if等や配列、その他はCでいろいろ書いてた時期（大学～42tokyo在籍時）があって割と身についてる感じがしたので割愛。
~~jsは変数に型の宣言いらないの気持ちわるっって思って書いてました。~~
【Swift】HTTP通信時のコネクションの再利用

## 概要

URLSessionオブジェクトを再利用することによる通信処理の効率化について記載します。

[Androidについてはこちら](https://qiita.com/cwan/items/391557a9edc4524cd685)

## 障害事象

弊社が開発しているiOSアプリのデータ転送量が多すぎるのではないかという報告を受けました。データ転送量を測定してみると、HTTPリクエスト・レスポンスのヘッダーおよびボディサイズの合計の2.5倍程度の量が発生していました。

※このアプリの外部への通信はすべて[Swift標準のHTTPRequest](https://developer.apple.com/documentation/foundation/urlrequest)を使用して実装されています。

## 調査方法

XCodeのDebug Navigatorで通信状況を調べてみることにしました。

1. シミュレーターでアプリを起動
1. ツールバー > [View] > [Navigators] > [Debug] を選択
1. [Network] をクリック

以下のgifアニーメーションがそのときの状況です。[Active Connections]のところを見ると、TCPコネクションが短時間のうちに発生したり消えたりしていることが分かりました。このことから、TCPコネクションが再利用されていないことが問題であると推測されました。

![network_before.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27823/cf54727d-6288-1311-1ccb-be1e2ec21f0b.gif)


## 問題点と修正内容

通信処理の実装では、APIエンドポイントごとのタイムアウト値を設定するため`HTTPSession.shared`は使用しておらず、リクエストの度にURLSessionオブジェクトを生成していました。

```swift
// 修正前のコード
func getXXX(...) {
    let config = URLSession.shared.configuration
    config.timeoutIntervalForRequest = 5
    config.timeoutIntervalForResource = 10

    let session = URLSession(configuration: config)
    urlSession.dataTask(with: request) { ... }
}
```

以下のようにURLSessionをstaticプロパティに保持して、再利用するように修正しました。

```swift
// 修正後のコード
static let urlSessionForXXX: URLSession = {
    let config = URLSessionConfiguration.ephemeral
    config.timeoutIntervalForRequest = 5
    config.timeoutIntervalForResource = 10
    return URLSession(configuration: config)
}()

func getXXX(...) {
  urlSessionForXXX.dataTask(with: request) { ... }
}
```

## 修正後の効果

以下のgifアニーメーションが修正後の状況です。[Active Connections]のところを見ると、TCPコネクションが存在し続けていることが分かります。

![Network after.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27823/f488e876-93f3-bfd5-4fd7-f29538ae4f8f.gif)

また、データ転送量の合計は以前の半分程度に減りました。
Android NDK で静的ライブラリを最小構成で作成する

## ことの発端

他のプラットフォームで `C++` を使って開発した機種依存しないコード（所謂`共有コード`）を `Android` で使いたい。
小規模ならば `AndroidStudio` で自動生成された `CMakeLists.txt`　にソースコードを追加して終了なのだが、`共有コード`が巨大（またはビルドに相当な時間が掛かる）だと色々と厄介。
なので、`共有コード`を独立してビルドして、後でガッチャンコしたい。

## `共有コード`のビルド

いきなり巨大な`共有コード`だと大変なので、まずは簡単な構成でやってみましょう。

### 1. ファイル・フォルダ構成

```:ファイル・フォルダ構成
/
  src/
    sub.cpp
    sub.h
  CMakeLists.txt
  build.sh
```

### 2. `CMakeLists.txt` を作る

お好きな感じで `CMakeLists.txt` を作ります。

```cmake:CMakeLists.txt
cmake_minimum_required(VERSION 3.10.2)

project("sub")

add_library(
  sub
  src/sub.cpp
)

target_link_libraries( 
  sub
)
```

### 3. ビルドスクリプトを作る

`CMake` をアーキテクチャ毎に呼び出してビルドするスクリプトを書きましょう。
`ANDROID_NDK_HOME` はフォルダを探して適宜指定しましょう。

```sh:build.sh
#　NDKのパスとAPIレベルの設定（外部で定義するも良し）
ANDROID_NDK_HOME=~/Library/Android/sdk/ndk/23.0.7599858
ANDROID_NATIVE_API_LEVEL=26

#　パスの設定（libsが成果物でアーキテクチャ毎サブディレクトリが生成される）
BUILD_PATH=build
LIBS_PATH=libs
BASE_PATH=`pwd`

# CMAKEの設定
CMAKE_TOOLCHAIN_FILE=${ANDROID_NDK_HOME}/build/cmake/android.toolchain.cmake
CMAKE_BUILD_TYPE=Release

# 並列ビルド数
PARALLEL=2

# ABI のアーキテクチャを列挙（このくらいあればOK？）
TARGETS="armeabi-v7a x86 arm64-v8a"

# 作業フォルダと成果物フォルダの削除
rm -rf ${BUILD_PATH}
rm -rf ${LIBS_PATH}

# ABIでループする
for ABI in ${TARGETS}
do    
  mkdir -p ${BUILD_PATH}/${ABI}
  cd ${BUILD_PATH}/${ABI}

  cmake \
    -DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE} \
    -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} \
    -DANDROID_NATIVE_API_LEVEL=${ANDROID_NATIVE_API_LEVEL} \
    -DANDROID_NDK=${ANDROID_NDK_HOME} \
    -DANDROID_ABI=${ABI} \
    ${BASE_PATH}

  make -j${PARALLEL}
  cd -

  mkdir -p ${LIBS_PATH}/${ABI}
  cp ${BUILD_PATH}/${ABI}/*.a ${LIBS_PATH}/${ABI}
done
```

### 4. ビルド実行

言わずもがな、 `build.sh` を実行します。
実行後に `libs` フォルダが下記のような感じになります。

```sh:libsフォルダ
/
  libs/
    armeabi-v7a/
      libsub.a
    x86/
      libsub.a
    arm64-v8a/
      libsub.a
```

## ガッチャンコ

アプリで使用する際にはアーキテクチャ毎にリンクするライブラリを指定する必要がりますので、下記のように設定します。

```cmake:ライブラリを使うときのCMakeLists.txt
set(SUB_MODULE_PATH ....)
add_library(libsub STATIC IMPORTED)
set_target_properties(libsub PROPERTIES IMPORTED_LOCATION
        ${SUB_MODULE_PATH}/libs/${CMAKE_ANDROID_ARCH_ABI}/libsub.a)

target_link_libraries(
  ...
  libsub
)
```

ちなみに、 `Android` アプリから呼び出されることになるので、生成されるライブラリは `Shared Library` です。


## あとがき

サンプル用のプロジェクトを作成しました。

1. `sub` というフォルダで `build.sh` を実行してライブラリを生成します。
1. アプリをビルドします。

`build.gradle` で依存関係を組んでも良いかもですね。（どうなるの？）


### サンプル

https://github.com/CODIANZ/test.jnilib


### 参考文献

https://stackoverflow.com/questions/47146262/cmake-targeting-multiple-architectures-at-once-without-manual-cleaning-between
プログラミングしか出来ない奴いらなくね？

##はじめに

皆さんは、プログラミングしか出来ない人材になっていませんか？
僕はなってます(^^;

IT人材不足と言われていますが、皆さんの会社は不足していますか？
右を見ても、左を見ても、自分より出来る人ばかりじゃないですか？

トレンドの言語を追って常に学び続ける。
それってわざわざ競争率の高いレッドオーシャンに頭を突っ込みに行っているだけじゃないですか？

僕はそれに危機感を覚え、周りが持ってない価値をつける事にしましいた。
それがマーケティングスキルです。
エンジニア✖️マーケター
これを僕の価値にするべくマーケティングの勉強を始めました。
この記事はそれをアウトプットするものです。

※随時更新予定

####この記事に書いてあること

- マーケティング用語
- マーケティングの事例

####この記事を読むと...
- マーケティングの概要がわかる
- 商品の強みや、売るべき相手を把握出来る

####自己紹介

Tomy: 未経験から自社開発の企業に就職し、フロントエンジニアを担当。
最近自分の現状と立ち位置に危機感を覚え、絶賛インプット、アウトプットをしています。

##マーケティング

####コーポレートブランディング

- Googleは広告会社だが、広告会社ではない(検索ツールの会社と思わせる)
競合を把握し、競合と戦わないブランディングをする。

####プロダクトブランディング

- Proctoer&Gambleはロゴや広告スローガンで他の製品との違いに価値を見いだす
パッケージ、商品名、宣伝方法でブランドを確立させる。

####マーケティングブランディング

- スタバはコーヒー500円で売っているのではなく、ライフスタイルを500円で売っている。

ゆったり仕事がしたい。ゆったり話がしたい。この人たちにライフスタイルを売る。

####セールスブランディング

- ヤマハは100万以上のピアノをピアノ教室を開いてから売る
100万以上するようなピアノをいきなり買う人はいない。教室でピアノを習わせ、ピアノが欲しいと思わせてから売る。

###心理的法則

####バンドワゴン効果

- 人気商品


皆んなが買っているから買う。
・タピオカ

####スノップ効果

- 特別感

プレミアムモルツなどの商品名や限定100個などの特別感がある物を買う。

####ヴェブレン効果

- 高めの価格設定

見せびらかしたい時、価格の高いものを購入。

・高級車やルイヴィトン

###３C分析

- Customer 　=　顧客

- Comopetitor　=　競合

- Company　=　自社


__ハンバーガーショップの事例__
Customer
・幅広い年齢層
・安さや手軽さを求める層や品質を求める層が存在する。

Comopetitor　モスバーガー
・品質重視
・流行商品や期間限定商品などの発売がある

Company　マクドナルド
・コストを抑え、安価に商品提供できる
・提供スピードが早い

###Swot分析

- Strength　=　強み　

- Weakness　=　弱み　

- Opportunity　=　拡大可能性　

- Threat　=　縮小可能性　

__個人経営のフレンチ__

Strength
・通り沿いで目立つ立地
・材料は国産を使用、仕入原価が安い。
・デリバリーサービス可能
・オフィス街で人が多い

Weakness
・一人でやっているので、メニューが少ない
・1店舗目なので、ブランド名がない
・値段が多少高めに設定
・オフィス街なので週末空き

Opportunity
・週末だけレンタルスペースとして貸し出す
・インスタなどで面白イベント開催

Threat
・大型休日などが増える
・外食する人が減っている

###STP戦略

####Segment

市場を顧客やニーズなどの共通項によって細分化する作業

・トレーニングジム
　筋肉を付けたいため・ダイエットのため・健康のため

####Target

細分化された市場の中からどこを標的とするのか

無意味。筋肉を付けたいおじいちゃんをターゲットから外す必要はない。

####Position

自社がどのような立ち位置で勝負するか。

競合の明確化をし、勝負する場所がかぶらないようなポジションをとる。

###ショット収入・ストック収入

- ショット収入
毎回単発でモノやサービスを提供し、収入を得ること。
一度の販売で大きな収入を得る事ができるが、売り続ける必要があり、売り上げを予想しにくい。

- ストック収入
継続的に収入が得られるもの。
得られる収入は大きくないが、安定した収入が期待できるため、売り上げ予想をしやすい。

##まとめ
自分なりの解釈を書き綴ってみました。

色々書きましたが、結局一番大事なのはWHY(なぜ)を追求することだと思います。
なぜその商品が必要なの？
なぜその客層なの？
なぜ価格を上げないの？
なぜオフィシャルアカウントしかないの？

一度身の回りのものに「なぜ？」と問うと新しい発見があるかもですね(^^
【RxSwift】クロージャが二重になる場合の [weak self] について

## 結論
**クロージャが二重になる場合、どちらのクロージャでも `self` を弱参照でキャプチャする必要がある**

## 環境
- Xcode 12.5.1(12E507)
- RxSwift 5.1.3
- RxDataSources 4.0.1

## 事例

- `UICollectionView` の `CellProvider` 内部で購読処理を行う


### アンチパターン

```swift
self.dataSource = UICollectionViewDiffableDataSource<PseudoSection, PseudoItem>(collectionView: collectionView, cellProvider: { (collectionView: UICollectionView, indexPath: IndexPath, item: PseudoItem) -> UICollectionViewCell? in {
    
    if let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "PseudoCellIdentifier", for: indexPath) {

        cell.someSignal
            .emit(onNext: { [weak self] _ in
                 
                 self?.someRelay.accept(())
            })
            .disposed(by: cell.disposeBag)
         
        return cell
    }
    
    return nil
}
```

- 一見 `self` を弱参照しているためメモリリークは発生しないように見える
- **実際にはメモリリークが発生する**
- `[weak self]` でキャプチャされる `self` が `CellProvider` クロージャ内で強参照扱いになっている?

### 修正

```swift
self.dataSource = UICollectionViewDiffableDataSource<PseudoSection, PseudoItem>(collectionView: collectionView, cellProvider: { [weak self](collectionView: UICollectionView, indexPath: IndexPath, item: PseudoItem) -> UICollectionViewCell? in {
    
    if let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "PseudoCellIdentifier", for: indexPath) {

        cell.someSignal
            .emit(onNext: { [weak self] _ in
                 
                 self?.someRelay.accept(())
            })
            .disposed(by: cell.disposeBag)
         
        return cell
    }
    
    return nil
}
```

- `CellProvider` クロージャの内部で `self` を弱参照でキャプチャするように
- 特段 `guard` などでオプショナルを外さなくてもこのままでOK
【Rspecエラー】HTTP Basic: Access denied

##環境
Ruby 3.0.2
Rails 6.1.4.1

##状況
Rspec実行時、401エラーが出た

```
Failure/Error: expect(response).to have_http_status(200)
       expected the response to have status code 200 but it was 401
```


##解決法

responseの中身を確認

```
> response.body
=> "HTTP Basic: Access denied.\n"
```

Basic認証を採用していたことを思い出したので、テスト環境ではBasic認証をしないように指定

```app/controllers/application_controller.rb
class ApplicationController < ActionController::Base
   before_action :basic_auth unless Rails.env.test?

   def basic_auth
    ...
   end
end
```

##参考

https://qiita.com/pli8xxx_yu/items/09b885db0f4a52acd446
libc++ で parallel STL は対応していない(2021/10/06 clang-12 時点)

Parallel STL は libc++ では対応していませんでした. :cry:

https://en.cppreference.com/w/cpp/compiler_support
(`std::execution` あたり検索するとよい)

gnustl では tbb 依存ですが一応サポートしています.

https://stackoverflow.com/questions/51031060/are-c17-parallel-algorithms-implemented-already/55989883#55989883

libc++ で tbb 非依存で pstl 対応はいつになるかわかりませんので(あと 3~4 年後くらい?), C++17 or later でポータブルな並列処理をするなら現状では(今までどおり)自前で `std::thread` あたりでマルチスレッドコードを書くしかないです...

pstl の repo があるが, 実装ステータスは不明.
また, 現状のコードは結局 tbb 依存...(tbb 依存本当にやめてほしい)

https://github.com/llvm/llvm-project/tree/main/pstl
Charlesを使っていて、Charlesが起動していない時にネットワークに繋がらない時の対処

プロキシアプリCharlesを普段使っていて、突然、Charlesを使ってないときにインターネットが繋がらなくなった時の対処方法になります。
Macでの説明をします。

# 公式サイトの説明

こちらに`Can no longer browse without Charles running`として各種対処法が載っています。
https://www.charlesproxy.com/documentation/faqs/can-no-longer-browse-without-charles-running/

# Macでの対処方法
1. Charlesを終了する
1. システム環境設定を起動
1. ネットワークより、現在接続中のWi-Fiを選択し、「詳細」ボタンを押下
![スクリーンショット 2021-10-06 17.09.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/687960/8d083473-7eb4-1046-46b7-6ee20cb77287.png)


1. 「プロキシ」タブより、`Webプロキシ（HTTP）`、`保護されたWebプロキシ（HTTPS）`にチェックが入っていたら、チェックをオフにする

![スクリーンショット 2021-10-06 17.11.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/687960/5845a7df-9bcf-c312-e361-21986fc2778a.png)

1. 「OK」を押下し、「適用」を押下する
TypeScript 4.5で入る予定の"types" import conditionについて

最初に断っておきますが、ちょっとマニアックな記事です。

TypeScript 4.5 Betaがアナウンスされました。
こちら:point_right: [Announcing TypeScript 4.5 Beta](https://devblogs.microsoft.com/typescript/announcing-typescript-4-5-beta/)

[前回](https://qiita.com/daishi/items/b4b6e683fdb8bb8c9f46)と同じように全体を紹介する記事を書こうかとも思ったのですが、一つだけピックアップすることにしました。それが[package.jsonのexportsのサポート](https://devblogs.microsoft.com/typescript/announcing-typescript-4-5-beta/#packagejson-exports-imports-and-self-referencing)です。

package.jsonのexportsというのは、[Node.jsのドキュメント](https://nodejs.org/dist/latest-v14.x/docs/api/packages.html#packages_package_entry_points)に書かれているPackage entry pointです。これによるとパッケージが提供する複数のエントリーポイントをexportsで定義できるのです。過去のnodeではファイル構造がそのままエントリーポイントとして使えたかもしれませんが、今はexportsでちゃんと定義する必要があります。exportsにはconditonal exportsというのがあって、CommonJSとESMの双方に対応したパッケージが定義できます。

今回の、TypeScript 4.5 Betaの記事では、ここに`"types"`も追加で書けるようになったとのことです。

なぜこれが個人的に注目かというと、すでに[jotai](https://github.com/pmndrs/jotai)ではそれを設定しているからです。

https://github.com/pmndrs/jotai/blob/v1.3.7/package.json#L21

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63327/1baef5c9-bc0b-ee3c-5257-57baa781ee29.png)

これは、明確な根拠があったわけではなく、これができたらいいのになぁ、という期待から設定したもので、それが今回サポートされることになったと知って、いい意味で驚いた次第です。

他にも地道な改善が多くなされているようでTypeScript 4.5が出るのが楽しみですね。
Confluence：Excel VBAからConfluenceのページを作成する (Server/DataCenter)


# 手順
## １．VBA-JSONの追加

### １）以下よりVBA-JSONをダウンロードします

https://github.com/VBA-tools/VBA-JSON

### ２）「JsonConverter.bas」 をプロジェクトに追加します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/81cd0198-6aa6-40f6-35ad-038faa13b104.png)


## ２．参照設定の追加
「Microsoft XML v6.0」と、「Microsoft Scripting Runtime」を追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/c04282e1-5844-3082-d9ad-f51cfb6a1e53.png)

## ３．VBAコードの追加

Microsoft Visual Basic for Applications を開き、次のコードを入力し、実行します。

### 親ページを指定せずに新規ページを作成する場合
```vb
Sub CreatePage()
  Dim httpReq As New XMLHTTP60
  Dim sUrl As String

  Dim page As New Dictionary
  Dim pageSpace As New Dictionary
  Dim pageBody As New Dictionary
  Dim pageBodyStorage As New Dictionary
  Dim sJson As String

  pageSpace.Add "key", "<スペースKey>"
  pageBodyStorage.Add "value", "<ページ本文>"
  pageBodyStorage.Add "representation", "storage"
  pageBody.Add "storage", pageBodyStorage

  page.Add "type", "page"
  page.Add "title", "<ページタイトル>"
  page.Add "space", pageSpace
  page.Add "body", pageBody

  ' JSONテキストへコンバートする
  sJson = ConvertToJson(page, Whitespace:=2)
  Debug.Print (sJson) ' JSONテキストをイミディエイトに出力

  sUrl = "https://<ConfluenceのベースURL>/rest/api/content/"

  ' HTTPリクエストする
  With httpReq
    .Open "POST", sUrl
    .setRequestHeader "Authorization", "Basic <Basic認証のユーザー名とパスワード(Base64エンコード)>"
    .setRequestHeader "Content-Type", "application/json; charset=UTF-8"
    .setRequestHeader "X-Atlassian-Token", "no-check"
    .send (sJson)
    Debug.Print .responseText ' HTTPレスポンスをイミディエイトに出力
  End With
End Sub
```

### 親ページを指定して（指定されたページの子ページとして）新規ページを作成する場合

```vb
Sub CreatePage()
  Dim httpReq As New XMLHTTP60
  Dim sUrl As String

  Dim page As New Dictionary
  Dim pageSpace As New Dictionary
  Dim pageBody As New Dictionary
  Dim pageBodyStorage As New Dictionary
  Dim pageAncestors As New Dictionary
  Dim sJson As String

  pageSpace.Add "key", "<スペースKey>"
  pageBodyStorage.Add "value", "<ページ本文>"
  pageBodyStorage.Add "representation", "storage"
  pageBody.Add "storage", pageBodyStorage
  pageAncestors.Add "id", "<親ページID>"

  page.Add "type", "page"
  page.Add "title", "<ページタイトル>"
  page.Add "space", pageSpace
  page.Add "body", pageBody
  page.Add "ancestors", Array(pageAncestors)

  ' JSONテキストへコンバートする
  sJson = ConvertToJson(page, Whitespace:=2)
  Debug.Print (sJson) ' JSONテキストをイミディエイトに出力

  sUrl = "https://<ConfluenceのベースURL>/rest/api/content/"

  ' HTTPリクエストする
  With httpReq
    .Open "POST", sUrl
    .setRequestHeader "Authorization", "Basic <Basic認証のユーザー名とパスワード(Base64エンコード)>"
    .setRequestHeader "Content-Type", "application/json; charset=UTF-8"
    .setRequestHeader "X-Atlassian-Token", "no-check"
    .send (sJson)
    Debug.Print .responseText ' HTTPレスポンスをイミディエイトに出力
  End With
End Sub

```
pandas str.containsについて

## この記事の目的
pandasのDataFrameの検索方法について整理

## pandasとは？
データ解析を容易にするためのライブラリ
私の場合、csvからデータを読みこみ、
pandasを使用してDataFrameにしていじったりします

### DataFrameとは？
pandasでデータを扱う際の型になります
DataFrameとSeriesがあります

- Series(シリーズ)
データが1列の場合の型です

- DataFrame(データフレーム)
データが複数列の場合の型です
DataFrameから１列を抽出した場合、自動でSeriesとなります


## DataFrameでの検索(str.contains())
今回はDataFrameでの検索方法の中で、str.contains()を使用した方法を整理しました
str.containsは特定の文字を含む検索が可能です

次のようなDataFrameを例とします

```
     A   B   C   D
0  NaN  B0  C0  D0
1       B1  C1  D1
2   A1  B2  C2  D2
3   A3  B3  C3  D3

    A   B   C   D   F
3  A1  B1  C4  D4  F2
5  A5  B2  C5  D5  F3
6  A0  B4  C6  D6  F6
7  A7  B6  C7  D7  F7
```

コード

```
import pandas as pd
import numpy as np

df1 = pd.DataFrame({'A': [np.NaN, '', 'A1', 'A3'],
                    'B': ['B0', 'B1', 'B2', 'B3'],
                    'C': ['C0', 'C1', 'C2', 'C3'],
                    'D': ['D0', 'D1', 'D2', 'D3']})

df2 = pd.DataFrame({'A': ['A1', 'A5', 'A0', 'A7'],
                    'B': ['B1', 'B2', 'B4', 'B6'],
                    'C': ['C4', 'C5', 'C6', 'C7'],
                    'D': ['D4', 'D5', 'D6', 'D7'],
                    'F': ['F2', 'F3', 'F6', 'F7']},
                    index=[3, 5, 6, 7])

```

### 引数ごとの動作例

#### regex 正規表現の指定

コード

```
# regex:True 正規表現を使用（デフォルト）
result = df2[df2['A'].str.contains('A[1|0]')]

# regex:False 正規表現を不使用
result = df2[df2['A'].str.contains('A[1|0]',regex = False)]

```

結果

```
# regex:True 
    A   B   C   D   F
3  A1  B1  C4  D4  F2
6  A0  B4  C6  D6  F6

# regex:False 
Empty DataFrame
Columns: [A, B, C, D, F]
Index: []

```

#### na NaNの処理指定

コード

```
# na:False NaNがある行をFalseとして扱います
result = df1[df1['A'].str.contains('1',na = False)]

# na:True NaNがある行をTrueとして扱います
result = df1[df1['A'].str.contains('1',na = True)]
print(result)

# NaNがデータに存在する状態で、naを使用しないとエラーとなります
try: 
    result = df1[df1['A'].str.contains('1')]
except Exception as e:
    print(e)
```

結果

```
# na:False 
    A   B   C   D
2  A1  B2  C2  D2

# na:True 
     A   B   C   D
0  NaN  B0  C0  D0
2   A1  B2  C2  D2

# na:なし
Cannot mask with non-boolean array containing NA / NaN values
```

#### case 大文字小文字の区別

コード

```
# case:Ture 大文字小文字を区別（デフォルト）
result = df2[df2['A'].str.contains('a[1|0]')]

# case:False 大文字小文字を区別しない
result = df2[df2['A'].str.contains('a[1|0]',case = False)]

```

結果

```
# case:Ture
Empty DataFrame
Columns: [A, B, C, D, F]
Index: []

# case:False
    A   B   C   D   F
3  A1  B1  C4  D4  F2
6  A0  B4  C6  D6  F6

```

## 終わり
今回はstr.containsについて、
文字だけだとイメージがつかないこともありまとめてみました
GitHubで "fatal: Could not read from remote repository." になって確認したこと

# はじめに
GitHubで "fatal: Could not read from remote repository." となった際に確認すべきことを備忘のために記事にしました。
随時追記していく予定です。
謝っている箇所やアドバイスなどありましたらコメントいただけますと幸いです。

# 1. ssh-agentにキーが追加されているかを確認
下記コマンドで、ssh-agentに追加されているキーが存在しているか確認

```console
$ ssh-add -l
```

もし期待するキーが存在していなかった場合は、新しくキーを追加する

```console
$ ssh-add -K {秘密鍵へのパス}
```

(2022/02/16 追記)
MacOS Monterey では、`-K` オプションは非推奨となっているため、代わりに `--apple-use-keychain` を使ってください。

```console
$ ssh-add --apple-use-keychain {秘密鍵へのパス}
```

# 参考
- [GitHub に SSH で接続する](https://docs.github.com/ja/authentication/connecting-to-github-with-ssh)
シンプルな Web API を FastAPI で作成

# はじめに

機械学習で作成したモデルを実用化するには、システムが必要になる。もっともシンプルなシステム実装としては、学習済みモデルが API リクエストに対して推論結果をレスポンスで返す簡単な Web API が考えられるが、機械学習モデルは大半が Python で構築されているため、API も Python ベースで作成することが望ましい。
本記事では、後々機械学習モデルの推論結果を返す Web API を作成することを見据え、まず簡単な Web API を Python フレームワークである FastAPI を用いて作成してみる。[FastAPI 公式ドキュメント](https://fastapi.tiangolo.com/ja/)を参考にした。

# FastAPI のインストール

[FastAPI 公式ドキュメント](https://fastapi.tiangolo.com/ja/)を参考にインストールする。

```bash
$ pip install fastapi uvicorn
```

# Web API の作成

main.py を作成して、以下コードで最低限の Web API が作成できる。

```python:main.py
from fastapi import FastAPI

app = FastAPI()

@app.get("/")
def read_root():
    return {"Hello": "World"}

@app.get("/items/{item_id}")
def read_item(item_id: int, q: str = None):
    return {"item_id": item_id, "q": q}
```

FastAPI インスタンス `app` を作成し、`@app.get("/")` のようにデコレータを用いて、HTTP メソッドとパスを指定している。さらにリクエストを受け取るたびに呼び出される関数を定義している。この関数の返り値がレスポンスとして返される。

以下コマンドで実行して、[http://127.0.0.1:8000/items/5?q=somequery](http://127.0.0.1:8000/items/5?q=somequery) にアクセスするとレスポンスが返ってくることが確認できる。`--reload` は開発用オプションで、コードの変更時にサーバーを再起動させる。

```bash
$ uvicorn main:app --reload
```

# おわりに

FastAPI を用いて簡単な Web API を作成した。機械学習モデルの推論結果を返すような Web API を作成していきたい。
RailsにgemでBootstrapを導入する

#はじめに
現在プログラミング学習を始めて３ヶ月目の初学者です。
学んだことをqiitaに投稿という形でアウトプットするため、また備忘録として記事を作成しました。

###1.Gemfileを編集する
gem 'bootstrap', '~> 4.5'

###2.bootstrapファイルを読み込む

app/assets/stylesheetsの「application.css」を「application.scss」に変更

###3.BootstrapをSCSSに読み込ませる

app/assets/stylesheets/application.scss

@import "bootstrap";

###4.application.jsファイルを編集する

app/assets/javascripts/application.js

//= require jquery3
//= require popper
//= require bootstrap-sprockets←追加
//= require rails-ujs
//= require activestorage
//= require turbolinks
//= require_tree .

##最後に
qiitaへの投稿に慣れていないので、分かりづらい上に情報が少ないですが、これから欠かさず投稿していこうと思います。
保存済みのマイグレーションファイルを削除する方法

こんにちは！テックアカデミーのWebアプリコースを受講している駆け出し高校生エンジニアの安田駿介です。

今回は、「保存済みのマイグレーションファイルを削除する方法」というテーマで解説していきます。

#保存済みのマイグレーションファイルを削除する手順
１．rails db:migrate:status
２．rails db:rollback
３．rails db:migrate:status
４．マイグレーションファイルを削除

という手順です。

#解説
##１．rails db:migrate:status
これは、マイグレーションファイルの状態を確認するコードです。
![9b784c91b77cad3247c4526ad0c8b9c9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1903726/a84f3290-b33a-1e46-2c18-5694a2ef0c77.png)
Statusがupになっているのは、保存済みということです。

##２．rails db:rollback
次に、マイグレファイルを保存済みを削除します。
![06962816eeeea519e997de55ee5a2749.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1903726/90e817bf-c368-dcbc-b1c9-9521a7dd1d9b.png)
これで、保存済みのマイグレファイルではなくなったはずです。

##３．rails db:migrate:status
1と同じコードで、マイグレファイルの状態を確認してみましょう。
![9c09df9d9e97d6053c0a62b46ba97e75.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1903726/b9430b35-1f76-05ab-692e-4f2148d6d88d.png)
statusがupからdownになっているので、保存済みは解除されました。

##4.マイグレーションファイルを削除
それでは、今保存済みを解除したマイグレファイルを削除してください。
くれぐれも、まだup状態のマイグレファイルは削除しないようにしましょう。

#保存済みのマイグレーションファイル削除してしまったときは？
https://qiita.com/yasshun1229/items/de86ee4b65e47e641828

#開発環境
・AWS
・Ruby 3.0.0
・Rails 6.1.3.1
no such column　エラー

#ビューでタスク一覧を開こうとしたところ以下のエラーが発生した。

```:エラー文
ActionView::Template::Error (SQLite3::SQLException: no such column: tasks.user_id: SELECT "tasks".* FROM "tasks" WHERE "tasks"."user_id" = ? ORDER BY "tasks"."created_at" DESC):
    11:       th= Task.human_attribute_name(:created_at)
    12:       th 
    13:   tbody 
    14:     - @tasks.each do |task|
    15:       tr 
    16:         td= link_to task.name, task
    17:         td= task.created_at    
  
app/views/tasks/index.html.slim:14:in `_app_views_tasks_index_html_slim___960545833629484385_70134346560000'
```
tasks.user_idのカラム（列）が見つからないと出ているので、マイグレーションファイルか、コントローラーか、モデルファイルに間違いがあり、うまくデータを紐付けできていないと考えた。

```rb:xxxxxxxxxxxxxx_add_user_id_to_tasks.rb
class AddUserIdToTasks < ActiveRecord::Migration[5.2]
  def up
    execute 'DELETE FROM tasks;'
    add_reference :tasks, :user, null: false, index: true
  end

  def down
    remove_reference :tasks, :user, index: true
  end
end
```

```rb:app/models/user.rb
class User < ApplicationRecord
  has_secure_password

  validates :name, presence: true
  validates :email, presence: true, uniqueness: true

  has_many :tasks
end
```

```rb:app/models/tasks.rb
class Task < ApplicationRecord
  validates :name, presence: true
  validates :name, length: { maximum: 30 }
  validate  :validate_name_not_including_comma

  belongs_to :user

  scope :recent, -> { order(created_at: :desc) }

  private

  def validate_name_not_including_comma
    errors.add(:name, 'カンマを含めることはできません') if name&.include?(',')
  end
end
```

tasksテーブルにuser_idというカラムを追加するにはジェネレータで作成したマイグレーションファイル(xxxxxxxxxxxxxx_add_user_id_to_tasks.rb)に「execute 'DELETE FROM tasks' :tasks」で今まで作られたタスクを全て削除し、「add_reference :tasks, :user, null: false, index: true」でtasksテーブルに外部キーであるuser_idカラムを作成し、モデルファイルのuser.rbとtask.rbにそれぞれ、「has_many :tasks」と「belongs_to :user」を記入することでそれぞれのクラス同士の紐付けを定義するということは理解できたが、該当するファイルに間違いはありませんでした。

#原因

結論、マイグレーションファイルを直接変更した後にrails db:migrateをしても変更が反映されない」ということがわかりました。原因としては、マイグレーションファイルを直接変更した場合、マイグレーションの現在のバージョンとファイルが一致しているため再実行されないからということでした。解決方法は、マイグレーションファイルを前のバージョンに戻す(rails db:rollback)→マイグレーションの再実行(rails db:nigrate)、もしくは、この二つの機能を備えた「rails db:migrate:redo」を使うことで再実行可能になりました。その結果、エラーを解決することができました。

#migrate コマンド
・マイグレーションファイルを前のバージョンに戻す

```:ターミナル
$ rails db:rollback
```
・マイグレーションの再実行

```:ターミナル
$ rails db:migrate
```
・　「マイグレーションファイルを前のバージョンに戻す」、「マイグレーションの再実行」　を同時に行う場合

```:ターミナル
$ rails db:migrate:redo
```
自治体DX推進計画の備忘録

1年近く前になるのだけれど、2020年12月25日に、総務省から、自治体DX推進計画が発表された。
以下のURLから、自治体DX推進計画概要（A4横・35ページ・PDF）をダウンロードできる。
https://www.soumu.go.jp/main_content/000727133.pdf
このPDF自体が「自治体DX推進計画」の概要だけど、備忘録としてさらに要約する。
（以下記事内容については保証できないので、関心を持たれた方は、オリジナルのPDFを参照願います）

#1.自治体ＤＸ推進計画の意義・目的

誰一人取り残されない、人にやさしいデジタル化社会に向け、市区町村の役割は重要である。
自治体は、

* 住民の利便性の向上させ、業務効率化=人的資源を行政サービスのさらなる向上につなげていくことが求められている。
* データの円滑な流通を促し、民間のデジタル・ビジネスなど新しい価値を創出することが期待される。

#2.自治体DX推進計画策定の目的

自治体が重点的に取り組む内容を具体化するとともに、関係省庁の支援策をとりまとめ、「自治体DX推進計画」として策定する。

#3.自治体DX推進計画の対象期間等

2021年1月から2026年3月までの約5年間。

#4.推進体制の構築

（省略）

#5.重点取組事項

##①自治体の情報システムの標準化・共通化
2025年度には、基幹系17業務システムを標準仕様に準拠したシステムへ移行する。
補正予算にて自治体の取り組みを支援する。

<details>
<summary>基幹系17業務システム</summary>
住民基本台帳、選挙人名簿管理、固定資産税、個人住民税、法人住民税、軽自動車税、国民健康保険、国民年金、障害者福祉、後期高齢者医療、介護保険、児童手当、生活保護、健康管理、就学、児童扶養手当、子ども・子育て支援
</details>

##②マイナンバーカードの普及促進
2022年度末までにほとんどの住民のマイナンバーカードの保有を目指す。
補正予算にて甲府体制のさらなる充実を支援する。

##③行政手続のオンライン化
2022年度末を目指して主に住民がマイナンバーカードを用いて申請を行うことが想定される31手続き（児童手当等の受給資格及び児童手当の額についての認定請求、介護保険負担限度額認定申請など）のオンライン手続きを可能にする。
マイナポータルの改修と、補正予算にて接続を支援する。

<details>
<summary>31手続き</summary>
「特に国民の利便性向上に資する手続」として、子育て（15手続）、介護（11手続）、被災支援（罹災証明書）及び自動車保有（4手続）
</details>

##④AI・RPAの利用推進
上記①③による業務見直しを契機にAIやRPAを導入・活用を推進する。
ガイドブックや人材の確保・育成で支援する。

##⑤テレワークの推進
テレワークの導入・活用を推進し、対象業務を拡大する。
ガイドラインの改定と、LGWAN-ASPによるテレワーク環境の提供を行う。

<details>
<summary>自治体テレワーク推進実証実験事業参加団体（460団体）</summary>
都道府県及び政令指定都市　19
特別区及び中核市　35
市（中核市除く）　291
町村、一部事務組合等　115
</details>

##⑥セキュリティ対策の徹底
改定セキュリティポリシーガイドラインを踏まえ、見直しを行い、対策を徹底する。
「三層の対策」の抜本的見直しと、補正予算での次期自治体情報セキュリティクラウドへの移行を支援する。

#6.デジタル人材の確保・育成（案）

CIOのマネジメントを専門的知見から補佐するCIO補佐官を、外部から任用している市町村はほとんどない。
外部から専門人材を招き、登用したいというニーズはある。
自治体の情報化担当職員の確保・育成も課題である。

##①外部人材の確保
デジタル庁・総務省・都道府県が連携する。
経費について、特別交付税措置を講じる。
##②内部人材の育成
担当職員とデジタル庁との対話の促進のため、共創プラットフォームを創設する。
デジタル庁等が研修を行う。
担当職員のデジタル庁への出向等のキャリアパスを用意する。
error: src refspec main does not match any が出た時

# 状況

リモートリポジトリとローカルの紐付けが完了し、いざプッシュしようとした際に以下のエラーが出た。

 ```bash
$ git push origin main
error: src refspec main does not match any
error: failed to push some refs to 'https://github.com/XXXX/XXXX.git'
``` 

# 解決方法

以下の記事を参考にさせていただきました。
https://deepblue-ts.co.jp/git/git-push-error/

原因は、プッシュしたいリモートリポジトリのブランチ名と、プッシュしようとしているローカルのブランチ名が異っているからだった。

実際に `git branch` で確認してみると

```bash
$ git branch
* master
```
`master`のままで修正していないことが判明
(今回プッシュしたいリモートリポジトリは `master` ではなく `main` で設定している)

なので、以下のコマンドで `master` を `main` に変更し、

```bash
$ git branch -m master main
```
```bash
$ git branch
* main
```
`main` に変わったことを確認し、再度プッシュをすればOK
RSpec traitとは

# RSpecとは
Rubyでwebアプリケーションを開発する際に、想定通りの動作をするか検証するための
テストフレームワークです。

# traitとは
traitとは特性という意味の単語です。
FactoryBotで複数のテストデータを作る時に使われます。
その際に記述が重複してしまう場合があるので、これを避けるために
使われます。



```
FactoryBot.define do
  factory :モデル名 do
    trait :上記モデルを継承したインスタンスの属性値 do
  
    end
  end
end

```
このように使われます。

# 使い方
例えばFactoryBotで下のように定義していたとします。

```staffs.rb

factory :staff do
    name = "Taro"
    name { name }
    id  = "1234"
    id   { id }
    job = "programmer"
    job { job }

    #新しいfactoryを定義したい
    factory :second_job do
      job = "marketer"
      job { job }
   end
end
end

```

Staffモデルにname,id,jobの3つのカラムが存在します。
jobつまり仕事を他にも兼任している。marketerというファクトリーを作りたい。
そのためには```継承```を使いたい。
この```継承によって記述の重複がなくなります。```
インスタンス内のファクトリーが多くなると手間になるので継承は便利みたいです。


```staffs.rb

factory :staff do
    name = "Taro"
    name { name }
    id  = "1234"
    id   { id }
    job = "programmer"
    job { job }

    #新しいファクトリを定義
    trait :second_job do
      job = "marketer"
      job { marketer }
   end
end
end

```

このように記述することで記述の重複が防げます。

テストコードはこのようにかけるみたいです。

```staff_spec.rb

staff = FactoryBot.create(:staff(:モデル名), :second_job(:ファクトリー名))

```
のように使えるみたいです。

⚫︎補足
下のように記述するとFactoryは省略してかけます。

```spec/rails_helper.rb

RSpec.configure do |config|
  config.include FactoryBot::Syntax::Methods

end

```



⚫︎参考資料
https://techtechmedia.com/inheritance-trait-rspec/
https://qiita.com/ShotaroHirose59/items/7c64be350676120de9bd
[Rails] ソート機能

ポートフォリオにソート機能を実装した時のメモ。

# 完成イメージ
![ezgif.com-gif-maker (5).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/974719/a33e6b86-d9e2-2d17-5a23-def4229c24f2.gif)

# 実装と解説
今回実装したのは投稿されたイベントを新着順、古い順、イベントの参加者数順に並び替える機能です。

### ① ルーティングの定義

`example.com/?sort_new` → 新しい順に並び替え のように、
パラメーターの変更で並び替えできるようにルーティングを変更していきます。

```ruby:congig/routes.rb
get 'events/search/sort_new', to: 'events#search', as: 'sort_new'
get 'events/search/sort_old', to: 'events#search', as: 'sort_old'
get 'events/search/sort_join', to: 'events#search', as: 'sort_join'
```

### ② scope定義

並び替えるためのscopeをそれぞれ定義します。

```ruby:app/models/event.rb
scope :latest, -> {order(updated_at: :desc)}
scope :old, -> {order(updated_at: :asc)}
scope :join_count, -> { includes(:joins).sort {|a,b| b.joins.size <=> a.joins.size}}
```

### 解説
```ruby
scope :join_count, -> { includes(:joins).sort {|a,b| b.joins.size <=> a.joins.size}}
```
`b.joins.size`と`a.joins.size`はそれぞれ参加の数を表しています。
それを`sort`メソッドを使って昇順に並び替えています。

[sortメソッドについて](https://docs.ruby-lang.org/ja/latest/method/Array/i/sort.html)


### ② Controllerで分岐
scopeをControllerで定義しパラメーターで分岐して使用できるようにします。
ページネーションにはkaminariを使用しています。

```ruby:app/controllers/events_controller.rb
if params[:new]
  @events = Event.latest.page(params[:page]).per(PER_PAGE)
elsif params[:old]
  @events = Event.old.page(params[:page]).per(PER_PAGE)
elsif params[:join]
  events = Event.join_count
  @events =  Kaminari.paginate_array(events).page(params[:page]).per(PER_PAGE)
end
```

### ③ ソートリンクをViewに追加して反映
最後にViewでパラメーター変更のためのリンクを追加します。

```ruby:app/
.sort-container
%ul.sort
  %li 並び順
    %li
      = link_to '新着', events_search_path(new: 'true'), {class: 'sort-link' "#{'active' if current_page?('/events/search?new=true')}"}
    %li
      = link_to '古い', events_search_path(old: 'true'), {class: 'sort-link' "#{'active' if current_page?('/events/search?old=true')}"}
    %li
      = link_to '参加者数', events_search_path(join: 'true'), {class: 'sort-link' "#{'active' if current_page?('/events/search?join=true')}"}
```

### 解説
```ruby
"#{'active' if current_page?('/events/search?new=true')}"
```
link_toにつけた上の部分は`/events/search?new=true`のページつまり、新着順に並び替えられているページにおいて`active`というクラスをつけるという書き方です。
これをすることで完成イメージのようにHTMLを動的に変更することができます。

あとはお好みでスタイルを当てれば完成です！
【Flutter】TextFieldのstyleをThemeに書いてみた

備忘録として残します。
TextFieldのデザインは統一させようとしているので、Themeに書けないか試してみました。
他のinput系のstyleを指定したい場合は個別で指定していこうと思います。
設定しなくても良くなったので楽になりました。

![textField.001.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/873366/a208eff7-d5a3-8923-1eee-87e4ba273019.jpeg)



```dart
final liteThemeData = ThemeData.light();

liteThemeData.copyWith(
      useMaterial3: true,
      inputDecorationTheme: InputDecorationTheme(
        labelStyle: TextStyle(fontSize: 14),
          hintStyle: TextStyle(fontSize: 14, color: Colors.gray),
          border: OutlineInputBorder( // 角丸
            borderRadius: BorderRadius.all(Radius.circular(10)),
          ),
          filled: true, // 塗りつぶし
          fillColor: Colors.red, // 塗りつぶし
          enabledBorder: const OutlineInputBorder( // 角丸
            borderRadius: BorderRadius.all(Radius.circular(10)),
            borderSide: BorderSide(color: Colors.red, width: 1),
);

return MaterialApp(
      title: 'Flutter Demo',
      theme: liteThemeData, // ここに設定
      ),
      home: HomeScreen(),
    );

```

基礎知識はこちらから。めちゃくちゃわかりやすくて参考になりました。
https://qiita.com/agajo/items/4e0fa344dd6c1a36c937

https://zenn.dev/sugitlab/articles/bef3a05963680a#materialcolor-%E3%82%92%E3%81%A1%E3%82%83%E3%82%93%E3%81%A8%E7%90%86%E8%A7%A3%E3%81%97%E3%82%88%E3%81%86
Flutter始めたての頃に書いた記事なので、かなり省略したり間違っていますのでご了承ください！！
Androidテスト全書 第1章 テスト入門

##　はじめに
私はAndroidエンジニア一年目になります。
今まで全くと言っていいほどテストコード書かずにいました。
どう書けばいいかもわからない中「[Androidテスト全書](https://peaks.cc/books/android_testing)」を読み始めました。
アウトプットのため各章をまとめさせていただけたらと思います。

書籍については以下になります。
Androidテスト全書
https://peaks.cc/books/android_testing
### なぜテストが必要なのか

- 未然にクラッシュ防ぎ、開発プロセスに強固なテスト基盤を構築することは品質を確保する必要があるから
    - Play Storeで星1のレビューのついたアプリを解析したところ、42%もの割合のアプリがクラッシュを含む安定性の問題があった
    - Googleは低品質なアプリをPlay Storeのランキングや検索結果の上位には表示されないようにアルゴリズムを改良した
    - テストは動く仕様書であり資産である

### Androidのテストの種類と方法

- ブラックボックステスト → 手動テスト
    - 外部から観測できる結果が仕様書に沿っていることが重要であり、内部的（コード的に）どのように実装されているかは考慮しない
- ホワイトボックステスト → テストコード
    - 内部的なロジックのチェックに重きが置かれている。仕様が勘違いしていた場合にホワイトボックステストとして正しいが、ブラックボックステストしては期待どおりじゃない可能性がある
- 結論、Androidでは上記二つ両方が用いられる

- テストの種類
    - ユニットテスト
        - ユニットテスト(Unit Testing)|ま ソースコードの個々のユニット(構成単位)が意図した振 る舞いをしているか検証するテストです。ソフトウェアを開発する際には一連のデータや処理を モジュールと呼ばれる意味のあるまとまりに分割しながら構築します。ユニットテストはこのモ ジュールが想定するとおりに動作していることを確認するために開発者自らが記述します。
    - Local Unit Test
        - Local Unit Testは実機やエミュレーターを利用せずに開発マシンから直接高速に実行できるユ ニットテス トの手法。
    - Instrumented Unit Test
        - Instrumented Unit Testは 実機やエミュレーターを使つてユニットテストを実行する手法
    - インテグレーションテスト
        - インテグレーションテストは結合テストとも呼ばれ、複数のモジュールを組み合わせたときに正 しく動作することを検証するために行う手法
    - UIテスト
    - ユーザーが実際にアプリのUl(ユーザーインターフェイス)を操作した ときに画面が正しく反応できるかといった内容を検証する手法になります
    

### テストのピラミッド
<img src="https://thinkit.co.jp/sites/default/files/article_node/test_practice04_01.png" width="400" height="300">
※図1：The Testing Pyramid
「Fundamentals of Testing」の「Understand the Testing Pyramid」より転用
[Flutter] main()でSharedPreferencesを参照するには

Flutterでmain()でrunAppする前にSharedPreferencesを参照するとエラーになります。設定によって最初の画面を切り替えたいときとか困ります。

```dart:SharedPreferencesでエラー
void main() async {  
  SharedPreferences prefs = await SharedPreferences.getInstance();
```
上のように書くと
*Unhandled Exception: Null check operator used on a null value*
になります。

こういうときは、SharedPreferencesを呼ぶまえにWidgetsFlutterBinding.ensureInitialized();を呼べば大丈夫です。

```dart:エラーの対処
void main() async {  
  WidgetsFlutterBinding.ensureInitialized();
  SharedPreferences prefs = await SharedPreferences.getInstance();
```

ということを前にいろいろググって見つけたけど、日本語でそのものズバリ書いたページがなかったので投稿。
https://stackoverflow.com/questions/50458526/flutter-read-shared-preferences-in-main-then-decide-which-startup-page
[JavaScript] 継承

# 継承とは
　**継承**とは、新しい機能を作るとき、以前作った機能と共通する部分を引き継ぐことであり、オブジェクト指向プログラミングの基本的な概念。
　継承元となるクラスを「親クラス（スーパークラス）」、継承して作成した新たなクラスを「子クラス（サブクラス）」という。

# クラスの継承
子クラスの宣言で、**extends**キーワードを指定する。


```javascript
class 子クラス extends 親クラス{
    // クラスでの処理を定義
}
```

#superキーワード
継承して定義した子クラスから親クラスのメソッドを呼び出すには**super**というキーワードを使用する。まず、子クラスのコンストラクタから親クラスのコンストラクタを呼び出す場合は、以下のように記述する。

```javascript
class 子クラス extends 親クラス{
    constructor(x, y){
        super(x);
    }
}
```
ここで、コンストラクタの処理順は、親クラスから子クラスへと順番が決まっている。
次に、親クラスのメソッドを呼び出す場合は「**super.メソッド名**」で指定する。

```javascript
super.test();
```

#多重継承
**多重継承**とは、オブジェクト指向プログラミンにおいて、あるクラスを定義する際に複数のクラスから継承すること。JavaScriptは、**単一継承**（1つのクラスのみを継承する）であるため、複数のクラスを継承することはできない。

#まとめ
**継承**を使うメリットは、同じ機能をまとめてクラスを作成するので、重複部分の記述を省略することができる。それによりコードが読みやすくなること、既存機能を活用できるようになる。
【学習記録】 文字列 (paizaランク C 相当)

## 目次
- 問題文
- 書いたコード
- 解答例
- 学んだこと
- 振り返り

## 問題文 
[詳細はコチラ](https://paiza.jp/works/mondai/c_rank_level_up_problems/c_rank_string_boss)

###問題文の要約
一行目に以降の入力件数を。二行目以降で、スタート時刻と、要する時間のセットを複数行与えられる。

>入力例2
2
15:59 0 1
23:20 1 0

>出力例2
16:00
00:20


## 書いたコード
``` main.py
count = int(input())

def time_change(h, s):
    if s >= 60:
        h += 1
        s -= 60
        if h >= 24:
            h -= 24
    else:
        if h >= 24:
            h -= 24
    if len(str(h)) == 1:
        h = "0" + str(h)
    if len(str(s)) == 1:
        s = "0" + str(s)
    print(str(h) + ":" + str(s))
    

while count > 0:
    attr = input().split()
    time_change(int(attr[0][:2]) + int(attr[1]) ,int(attr[0][3:])+ int(attr[2]))
    count -= 1
```

time_changeという関数を作りました。
時間と分数を引数にして、求められている形式で表示する、というものです。

## 解答例

``` main.py
N = int(input())

for i in range(N):
    [t, h, m] = input().split() # ['13:00', '1', '30']
    th = int(t[:2]) # 13
    tm = int(t[3:]) # 0
    h = int(h) # 1
    m = int(m) # 30

    ah = th + h
    am = tm + m

    if am >= 60:
        ah += 1
        am -= 60
    if ah >= 24:
        ah -= 24

    ah = str(ah)
    am = str(am)

    if len(ah) == 1:
        ah = "0" + ah
    if len(am) == 1:
        am = "0" + am

    print(ah + ":" + am)
```
行っていること自体には大きな差はないのですが、可読性に雲泥の差が…。
変数を有効に使って、随時定義していることが一番の違いでしょうか。
私の書いたコードだと何が入っているのか一目で分からない点に大きな問題がありそうです。
if文の乱立もさらに可読性を下げている印象。

## 学んだこと
1. 無理せず随時変数を定義すること
1. ブロックごとに処理をまとめること

## 一言
動けばいいコードから脱却して、可読性を上げることも意識したいです。
`[t, h, m] = input().split()`
→この書き方がよく分かっていなかったので次には使えるように復習します。