OmniAICreator/Qiita-1.07M huggingface dataset:
DynamoDBローカル GUIの導入

# 前提条件
「[動かして学ぶ！Pythonサーバレスアプリ開発入門](https://www.amazon.co.jp/%E5%8B%95%E3%81%8B%E3%81%97%E3%81%A6%E5%AD%A6%E3%81%B6-Python%E3%82%B5%E3%83%BC%E3%83%90%E3%83%AC%E3%82%B9%E3%82%A2%E3%83%97%E3%83%AA%E9%96%8B%E7%99%BA%E5%85%A5%E9%96%80-NEXT-ONE-%E6%9C%AC%E7%94%B0/dp/4798169722/ref=sr_1_1?crid=NND8JONSPVZ7&keywords=%E5%8B%95%E3%81%8B%E3%81%97%E3%81%A6%E5%AD%A6%E3%81%B6+python%E3%82%B5%E3%83%BC%E3%83%90%E3%83%AC%E3%82%B9%E3%82%A2%E3%83%97%E3%83%AA%E9%96%8B%E7%99%BA%E5%85%A5%E9%96%80&qid=1655180973&sprefix=%E5%8B%95%E3%81%8B%E3%81%97%E3%81%A6%2Caps%2C203&sr=8-1)」を参考にDynamoDB Localをインストール&実行しています。（公式からDynamoDBローカルのzipファイルをダウンロードしてきて、Javaを用いて実行します。）

# GUIの導入
DynamoDB Localは、AWSにあるパブリックのDynamoDBとは異なり、GUIが存在しないため、OSSでGUIを作ってくれている人がいるので、そちらを利用させていただきました。
[dynamodb-admin](https://github.com/aaronshaf/dynamodb-admin)

# 準備
dynamodb-adminは、nodejsで動いているため、nodejsとパッケージ管理ツールのnpmをインストールしておく必要があります。私の場合Windowsの為、下記サイトを参考にしています。
[【Windows 10】「npm」と「Node.js」をインストールする方法！](https://otona-life.com/2022/02/09/103500/)

# dynamodb-adminのインストール
```
npm install -g dynamodb-admin
# For Windows:
set DYNAMO_ENDPOINT=http://localhost:8000
```
# 実行
```
dynamodb-admin
```
※プロンプトが戻ってこなくなるので、&を付けてバックグラウンド実行させるか、screenを使って別セッションで実行させるといいらしい、、、



# 参考文献
https://qiita.com/gzock/items/e0225fd71917c234acce
https://github.com/aaronshaf/dynamodb-admin
https://otona-life.com/2022/02/09/103500/
gvimを最大画面で起動する

# gvim を最大画面で起動する方法について

## 結論

結論から書きます。
下記の手順で設定できます。

1. $VIM/.gvimrcを開く
1. 最終行に`autocmd GUIEnter * simalt ~x`と記述する。
1. gvimを再起動すると最大画面で起動する。

以上です。
このおまじないで満足いただけたら、これ以降の文章については特に読む必要ありません。

## 説明

gvimrcに書く理由は、画面最大化がGUIに関する機能だと思ったからです。

autocmdを使う理由は、シンプルに`simalt ~x`とだけ書いた場合に機能しないからです。
機能しない理由は、先のコマンドを直書きするとGUI起動前に実行されるためです。
つまり、GUI起動時以降にこのコマンドを実行する必要があるので、autocmdでタイミングを指定して実行しています。

simaltは、simulation alt key 的な意味のコマンドです。
`~`がスペースキーを表し、`x`がxキーです。
つまり、`simalt ~x`は`Altキーを押しながらスペースキーを押しxキーを押す`動作をシミュレーションしています。
この動作は、Windowsアプリ共通の画面最大化ショートカットキーです。

以上の仕組みでこのコマンドが動作しています。

ちなみに、試していませんが`simalt ~r`で画面を元のサイズに戻せるはずです。
この方法の[元ネタ](https://www.vim.org/scripts/script.php?script_id=932)のスクリプトのように、関数化して最大化と元のサイズを行き来できるショートカットキーを作るのも良いかと思います。

## 最後に

(P.S. ここでは個人的な方法としていましたが、helpを見たり日本語の情報をググるのが不足していたようです。[ここ](https://vim-jp.org/vimdoc-ja/gui_w32.html)、つまりhelpに全く同じ内容が載っています。`:help`は偉大。)

最大化するためにググって色々試しましたが、どの方法も失敗してしまいました(dllをインポートする方法など)。
なので色々試した結果この方法に収着しました。
元ネタは下記のスクリプトです。作者である[andy fischer氏](https://www.vim.org/account/profile.php?user_id=4725)に感謝します。
https://www.vim.org/scripts/script.php?script_id=932

単純ゆえに機能しないリスクが他の方法より低いと思っています。
それでももし、機能しなかったらコメントで教えていただければと思います。
出来るだけ多くの環境で動くようなvimrcを作っておきたいと思っています。

また、今後はタイトルバーを消す方法も探していこうと思っています。
おそらくgvimの機能では実現できないでしょうけれど。(<- 追記あり)

### 追記 2022/06/16

下記のAutoHotKeyスクリプトでタイトルバーを消すことにしました。

```
#NoEnv  ; Recommended for performance and compatibility with future AutoHotkey releases.
; #Warn  ; Enable warnings to assist with detecting common errors.
SendMode Input  ; Recommended for new scripts due to its superior speed and reliability.
SetWorkingDir %A_ScriptDir%  ; Ensures a consistent starting directory.

#t:: WinSet, Style, ^0xC00000, A
```

ref. https://superuser.com/questions/1262225/how-to-remove-hide-title-bar-in-windows-10
database.ymlを編集する事で変えられるもの

Q.
database.ymlを編集する事で何が変わるのか？

A.
運用環境を変えられる。database.ymlで表記されている単語は下記の意味である。
development:開発
test:テスト
production:本番

Q.
そもそもなぜ変える必要があるのか？

A.
開発環境では、バグを見つけやすくするツールを導入するために必要
本番環境ではバグを見つけやすくするツールが導入されていると余計な処理が増え、処理に時間がかかる事を防ぐため
低スペックノートPCを購入しメモリとSSD増設するという選択肢


※換装は自己責任でございます。また、換装後は保証サービスが受けられなくなる可能性があります。
※価格は変動します。より安いタイミングでご購入ください。


## この記事が参考になる人
 Win10proのノートPCを予算10~15万円で、
スペック目安は→ CPUマルチコア6000~シングルコア1000~, メモリ16GB~, SSD512GB~、
辺りを探しているがそんなものは見つからないので頭を抱え、
中古にするか、
メモリ8GB、SSD256GB辺りに妥協しようとしている、
Lenovo好きな方。

## Thinkbook 14 Gen 3　AMD Ryzen™ 5 5500U　メモリ16GB SSD1TB を　￥101,700　で。
- [Thinkbook 14 Gen 3　AMD Ryzen™ 5 5500U](https://www.lenovo.com/jp/ja/notebooks/thinkbook/thinkbook-series/ThinkBook-14-Gen-3-AMD/p/21A2000QJP)　￥84,700(割引後の価格)
- [Crucial SSD P2シリーズ 1TB M.2 NVMe接続](https://item.rakuten.co.jp/riiccoo/riiccoo-1839645/?s-id=ph_pc_itemname) 　　￥13,320
- [Crucial PC4-25600(DDR4) 8GB](  　　　　　　　https://item.rakuten.co.jp/jism/0649528903525-44-34062-n/?s-id=ph_pc_itemname)      　　　　　　　　￥3,680

## 購入する際の注意点
- 価格ドットコムやamazonをチェックしてより安いタイミングでご購入ください。
- メモリやSSDのタイプがご自身のPCと合うかご確認ください。
- Win10proは品薄です。(Windows home→proへのアップグレードは¥13,000~くらいでできるので初めからproを探す必要はないです。)
- [Lenovoのページ](https://www.lenovo.com/jp/ja/notebooks/thinkbook/thinkbook-series/ThinkBook-14-Gen-3-AMD/p/21A2000QJP)の写真は英字配列キーボードのモデルです。日本語配列では「む」と「enter」キーがくっついています。

![6FBBE434-73DE-4C8C-953A-FF98D197B107.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2705418/e50637b7-bf70-273f-58ed-34fb35671f21.jpeg)


## 換装する際の注意点
- 回復ドライブを作成しておく。
- Fnキーが有効なことを確認しておく。換装後の起動時、ディスク選択画面へ行くにはこのPCのシリーズはF12を押すようです(※私の場合はF12を押しても選択画面は現れず、「ドライブから回復する」画面に進みました。全て完了後win10proが入っていたので気にしません。その後不具合があればお知らせいたします。)

- 裏蓋のネジを抜く際、上部と真ん中のネジ7つは上に引っ張りながら回さなければ取れない。
- 裏蓋を開ける用にギターのピック、マイナスドライバーを用意し、5分以上格闘するつもりでいる。(Macbook airなどとは違い、ネジを外すだけで裏蓋が外れない。)
- 静電気防止アイテムなどを使い作業する。
- 私はバッテリーを外さず換装しましたが、自己責任でお願いします。(※このPCに限らずCPUを換装する際はバッテリーは外してから換装を行なってください。)
![A879A0D2-81DB-4714-8482-6931C605EF38.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2705418/0cdf0875-aa95-e8ec-c326-ca337083c0a6.jpeg)

## 参考文献
[【自腹レビュー】レノボThinkBook 14 Gen3 AMDモデルはコスパ良すぎ！新生活に最適なPCなのか購入してみた　](https://www.youtube.com/watch?v=qBKgdgLstUo&t=918s)
AtCoder Libraryの導入

AtCoder Libraryについて導入したときのメモ書きを残す。
ほぼ自分用の備忘録。

# 目次
[1. 導入](#1-導入)
[2. おわりに](#2-おわりに)

# 1. 導入
本家よりzipダウンロードする。

https://atcoder.jp/posts/517

vscode上での環境整備をする。
c_cpp_properties.jsonのincludePathにACLのディレクトリをフルパスで追加。
インクルードするときのパス指定と理解。
```php
          "includePath": [
              "C:/atcoder/ACL"//フルパスディレクトリをいれる
          ],
```

tasks.jsonのargsによくわからないけど下記を追加する。
```php
            "args": [
                "-I",
                "C:/atcoder/ACL",
            ],
```

Coder Runner使ってたので、こちらにもインクルードパスを追記。
```php
 "cpp": "cd $dir && g++ $fileName -I C:/atcoder/ACL -o $fileNameWithoutExt && $dir$fileNameWithoutExt" ,
```


なんかに下記をいれてエラーが出なければとりあえずおｋ。
```php
#include <atcoder/all>
using namespace atcoder;
```

# 2. 終わりに
とりあえずこれで動いたのでメモとして残す。
unionfindの使用例。

https://atcoder.jp/contests/abc231/tasks/abc231_d


```php
#include <stdio.h>
#include <bits/stdc++.h>
#include <math.h>
#include <iostream>
#include <atcoder/all>
using namespace atcoder;
using namespace std;
typedef long long ll;
#define rep(i,a,b) for(int i=a;i<b;i++)
typedef long long ll; const int inf = INT_MAX / 2; const ll infl = 1LL << 60;
template<class T>bool chmax(T& a, const T& b) { if (a < b) { a = b; return 1; } return 0; }
template<class T>bool chmin(T& a, const T& b) { if (b < a) { a = b; return 1; } return 0; }
//cout << fixed << setprecision(15);    
ll mod=1e9+7;


int main(){
    ll n,m;
    cin>>n>>m;
    dsu d(n+1);//ACL n頂点のunionfind
    map<ll,ll>MP;
    rep(i,0,m){
        ll a,b;
        cin>>a>>b;
        if(d.same(a,b)==1){//マージ前にa,bが同一グループか判定。
            cout<<"No"<<endl;
            return 0;
        }
        d.merge(a,b);//a,bを同じグループに追加。
        MP[a]++;
        MP[b]++;   
        if(MP[a]>2 || MP[b]>2){//頂点が3以上はNG
            cout<<"No"<<endl;
            return 0;         
        }    
    }
    cout<<"Yes"<<endl;
}
```
Studentのt分布の確認

# Studnetのt分布

正規分布$N(\mu,\sigma^2)$にしたがう独立なN個の確率変数を考える。その標本平均は次式である。
```math 
\hat{\mu \;} = {1\over N}(X_1+X_2+X_3+\cdots+X_N) 
```
また不偏分散は、
```math
 \hat{\sigma^2} = { 1 \over N-1 } \sum_{i=1}^N ( X_i - \hat{\mu \;} )^2 
```
このとき次の統計量は自由度NのStudentのt分布に従う。
```math     
t = { \hat{\mu \;} - \mu \over  \sqrt{ \hat{\sigma^2}  \over  N }}
 ```
この事実をmatlabで実験的に確認した。以下のコードは、正規分布$N(0,1)$からN個のサンプルから標本平均と不偏分散を用いて統計量tを計算する。これをL回行い頻度分布を正規化してプロットする。さらに頻度分布に重ねて自由度(N-1)のt分布の確率密度分布をプロットする。

統計量tの頻度分布とt分布の確率密度分布は一致している。当然t分布の自由度を変えれば統計量tの頻度分布とはズレが生じる。

matlabのコードのなかでparforを用いている( parforが使えない場合は単純にforに置き換えることでコードは動作する)。parforにより複数コアを用いた並列計算がなされる。parforを使わずに全てをベクトル演算の形で行い、forループを廃したほうが速い可能性がある。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2517058/9179aea6-6b76-b847-b01a-890ac81d312a.png)

```matlab 
clear all; close all;
rng( 1 );

L = 10000000;
n = 30;

rst = zeros( 1, L );

parfor i = 1:L
    x = normrnd( 0, 1, 1,n );
    xav = mean( x );
    xva = var( x );
    tst = ( xav ) / ( sqrt( xva ) / sqrt( n ) );
    rst( i ) = tst;
end

histogram( rst, 1000, 'Normalization','pdf' );
hold on;
x = -4:0.01:4;
plot( x, tpdf( x, n-1 ), 'LineWidth',2 );
```
IntelliJからホスティングサービス上のファイルを開く方法

## TL; DR
業務中にコードの共有をする際に、IntelliJから直接オンプレのBitbucket上のソースのリンクを開きたくなることが多々あったので、IntelliJの機能だけで設定する方法をまとめました。


## 動作確認環境
* IntelliJ IDEA: 2021.3.1
* Bitbucket: v7.17.1


## 設定方法
`Preferences` > `Tools` > `External Tools` を開いて下記のように設定を追加します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120125/14be4ec9-4389-8b0f-bb8f-66cf5cbc0331.png)

* Program: `open`
* Arguments: `https://{ドメイン名}/bitbucket/projects/{プロジェクト名}/repos/$ProjectName$/browse/$FileRelativePath$#$SelectionStartLine$-$SelectionEndLine$` [^1]
  * 開きたいホスティングサービスのURL形式に合わせてください
* Working directory: 何でも良い
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120125/248048fa-0828-dbf8-cc04-ef9b0fffd910.png)


後は右クリックでメニューを開いて `External Tools` > `Bitbucket` と選択するだけでブラウザ上で該当のファイルのページが開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120125/ed663662-ae4d-be5b-48e6-8643d19ef75d.png)


## 詳細解説
IntelliJのExternal Tools設定は、サードパーティ製アプリケーションを外部ツールとして定義し、IntelliJ IDEAから実行できる機能です。

機能自体の詳細は[公式リファレンス][external-tools]を確認してほしいのですが、ざっくり説明すると、IntelliJ上で開いているファイルを別のエディタで開きたいときとかに設定しておくと便利なやつです。

そんなExternal Toolsですが、外部ツールの設定時に使えるマクロが色々定義されています。

Edit Tool画面で、`Program`, `Arguments`, `Working directory`のいずれかのフォームの＋ボタンを押すと定義されているマクロの一覧が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120125/dce43c34-55d8-6b48-7449-114ba7ddd7f2.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120125/619e9d1a-b888-10fa-10b2-8ec6f144160d.png)

下記に今回の設定で使用したマクロをまとめておきます。
|Macro|Description|
|-|-|
|ProjectName|The name of the project file without extension|
|FileRelativePath|File path relative to the project file|
|SelectionStartLine|Selected text start line number|
|SelectionEndLine|Selected text end line number|

```
https://{ドメイン名}/bitbucket/projects/{プロジェクト名}/repos/$ProjectName$/browse/$FileRelativePath$#$SelectionStartLine$-$SelectionEndLine$
```

上記のように開きたいホスティングサービスのURL形式に合わせてArgumentsを設定して `open` コマンドの引数として渡してあげれば、ブラウザで開けるようになるというわけです。


## まとめ
範囲選択した状態で右クリックしたらその行数をフォーカスした状態のリンクが開くようにしたので、格段に便利になりました。
特定のホスティングサービスに特化した拡張機能で似たようなことができるやつはあるかもしれませんが、開く先のホスティングサービスを選ばないのが強みかなと思っています。
External Tools設定は、他にも色々発想次第で便利に使えそうなので今後も積極的に活用していこうと思います。


## 参考
https://www.jetbrains.com/help/idea/configuring-third-party-tools.html


[external-tools]:https://www.jetbrains.com/help/idea/configuring-third-party-tools.html


[^1]:私はオンプレのBitbucketで開きたかったので例もBitbucketです:innocent:
【PHP基礎⑥】if構文-1 

［問題］　　(参照：http://www.cc.kyoto-su.ac.jp/~mmina/bp1/hundredKnocksBasic.html)
整数値を入力させ、値が0ならzeroと表示するプログラムを作成しなさい。

# コード
```php
$a = intval(fgets(STDIN));
if($a == 0){
    echo 'zero';
}
```

↓「0」と入力

# 結果
```
zero
```


☆if構文（条件分岐）
if(条件){
    条件を満たした場合に行う処理;
}


＜例＞
if($a == 100){
    echo 'perfect!';
}

☆注意！
=　代入
==　等しい
BcCheckerでbaserCMSが設置できるサーバーかどうかを確認する

https://github.com/katokaisya/BcChecker

一般的なレンタルサーバーではたいてい問題なくbaserCMSを使用することができますが、自分でサーバーを構築したときや、得体のしれないサーバーを使用せざるを得ないときに、baserCMSが設置できるかどうか不安になることも多いかと思います。

[baserCMSの公式サイト](https://basercms.net/about/system)のサーバー要件に必要な情報はある程度掲載されておりますが、サーバーの扱いに不慣れだったりすると、調査に時間がかかったりします。

そんなときのために、フォルダを設置してブラウザからアクセスするだけでサーバーがチェックできるツールを作成しました。

## 想定している対象者

**これからbaserCMSを新規導入しようと考えている人**

:::note alert
※ただし、今回のツールのDBチェックに関してははMySQL限定です。
それ以外のDBを使用されている方は、独自にDBのチェックをする必要があります。
:::

## この記事で紹介すること

#### [BcCheckerの使い方](#bcCheckerの使い方-1)
・[各項目の説明](#各項目の説明)
　・[基本チェック](#基本チェック)
　・[DB接続チェック（MySQLサーバー）](#DB接続チェック（MySQLサーバー）)
　・[メール送信チェック](#メール送信チェック)
　・[リライトチェック](#リライトチェック)
　・[モジュールチェック](#モジュールチェック)
#### [注意点](#注意点-1)


## BcCheckerの使い方
BcChecker の使い方はいたって簡単です。
[zipダウンロード](https://github.com/katokaisya/BcChecker/archive/refs/heads/main.zip)して、解凍し、フォルダの中にある「_cms」フォルダを、テストしたいサーバーのウェブルート（index.htmlなどがおいてある階層）に設置し、ブラウザからアクセスするだけです。
```
/htdocs/ がウェブルートの場合
/htdocs/_cms/ になるように設置
```
```
http(s)://あなたのドメイン/_cms/ にアクセスする。
```
画像のような画面が表示されます。
![bcchecker00.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553367/79ebfa09-4f22-010c-c1e5-f401d31a5027.jpeg)

### 各項目の説明

#### 基本チェック
・PHPのバージョンやホスト名、フルパスなどが確認できます。
#### DB接続チェック（MySQLサーバー）
DB接続のためユーザー名、パスワード、DB名などを入力し、「DB接続チェックをする」をクリックすると、phpからDBに接続できるかどうか確認できます。

:::note
localhostの場合、サーバーは省略できます。
ポートが3306の場合、省略可能です。
:::

接続に成功した場合、下記のような表示になります。
![bcchecker00db.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553367/08345eb6-2024-c450-90ae-4db4eb6ec424.jpeg)

DBのバージョンや文字コードの情報なども表示されます。
また、mysqldumpコマンドが使用できるかどうかのチェックもでき、チェックが成功すれば、/_cms/フォルダ内にSQLデータのバックアップが取れます。

#### メール送信チェック
webサーバーからメールが送信できるかチェックします。
成功すると実際にメールが送信されます。
※送信できない場合はbaserCMS側でSMTP設定などが必要になります。
### リライトチェック
リライトが許可されているかチェックします。
※許可されていない場合は、サーバー側の調整が必要になります。
#### モジュールチェック
##### 設定値
phpの設定値を表示します。
##### 必須モジュールチェック
baserCMSが動作するのに必要なモジュールをチェックします。
足りない場合は、サーバー側の調整が必要です。

##### PHPインフォ
php インフォが表示されます。

## 注意点
:::note alert
こちらのツールは、サーバーの状態が簡単に確認でき、ブラウザからDBに簡単にアクセスできてしまうため、チェックが終わったら、サーバーから速やかに削除してください。
:::

## まとめ
上記のチェックで、baserCMSが使用できるサーバーかどうかは一通りチェックができますが、絶対安心というわけではないので、
念の為に、サーバーのお試し期間などを使って、実際にbaserCMSを設置して動作確認できのが理想です。
【Rails】docker-compose 基本コマンド


railsコマンド
---
##### モデル作成
```
docker-compose run web bundle exec rails g model モデル名 カラム 
```
モデルは単数系で頭文字は大文字٩( 'ω' )و

##### マイグレーション
```
docker-compose run web bundle exec rails db:migrate
```

##### コントローラー作成
```
docker-compose run web bundle exec rails g controller posts new
```

その他
---

##### build時にキャッシュを使わない
下記コマンドは変更内容が反映されない時に使います
```
docker-compose build --no-cache
```

##### dockeの中に入る
dockerのコンテナ名は docker psで確認！
```
docker-compose exec #{container} bash 
```

##### Gem一覧確認コマンド
```
docker-compose run web ls /usr/local/bundle/gems
```

rubcop実行
```
docker-compose run web bundle exec rubocop --require rubocop-airbnb
```
情報セキュリティマネジメント試験　合格体験記

はじめに
---
2022/6/10情報セキュリティマネジメント試験を受験し、午前試験・午後試験ともに合格ラインの６０％を超えることが出来ましたので、受験時の感想と、学習期間、学習方法を紹介します。

情報セキュリティマネジメント試験
--
問題数：午前50問、午後大問3問
時間：午前90分、午後90分
合格基準：60%


受験結果
-
まずは午前の結果【78点】
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2664791/7983f95e-28ec-aa03-60d5-4cf133150815.png)

そして午後試験の結果　【67点】
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2664791/41012a8e-ade3-a4cf-4614-7e97a872422f.png)

午前試験はまずまずの結果でしたが、午後試験は危なかったです。

学習方法
-
実際に行った方法は以下の３つです。

１. Excelで学習予定表を作成する
２. 通勤・移動時間に参考書を読み込む
３. 通勤・移動時間に過去問を解く

上記のようにほとんどが移動時間や隙間時間で完結しています。
順番に解説していきます

１.Excelで学習予定表を作成する
-
まずは実際に作成した予定表です
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2664791/ab550405-6283-92ff-2b44-610bc95c3e54.png)

これを作ることでかなりモチベーションを維持することが出来ました。

先にゴールを決めてしまい、そこまでに何をすべきなのか細分化・視覚化しました。
私の場合は、４年分の過去問を最低３周するぞという風に決めていました。

毎日やることがはっきりしているので、どこまでやればいいのか明確で悩むことはありません。
ノルマを達成したら、それ以上進めることはしませんでした。

２. 通勤・移動時間に参考書を読み込む
-
私が使用したテキストはこちらです。
情報処理教科書 出るとこだけ! 情報セキュリティマネジメント テキスト&問題集 2022年版

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2664791/672ab1f3-27c3-6744-4a78-990d1eca9f04.png)

とても見やすい参考書で過去問から重要な問題をピックアップしているのでテキストを読みながら問題を解くことが出来ます。
この後行う、過去問演習の負担軽減にもなりました。

付録の過去問解説は使用しませんでした。
私の進め方は、行きの電車ではページを進め、帰りの電車で行きの際に見たページを復習するという方法です。

繰り返し同じページを読んで問題を解くことで記憶を定着させることが出来ました。
また、過去問演習だけでは補いきれない知識もここで補強できたかなと思います

３. 通勤・移動時間に過去問を解く
-
この過去問演習が最も重要かなと思いました。上記でも述べましたが4年分を3周することを目標としました。
実際に演習を行ったものがこちらになります。
![PTo4d2mlQkenN1B5IdC0tQ.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2664791/b3c533bf-8c3a-50a7-940b-069c191f3f58.jpeg)

公式HPから過去問を印刷して直接書き込む方式としました。

おすすめは、一枚に2ページ分印刷することです。コンパクトで紙も節約することが出来ます。

基本的にすべての過去問に関して一周目が精神的に厳しかったです。
テキストを事前に読んでいるはずなのに、思ったよりも解けないからです。

2週目以降はかなり楽になります。ほとんど答えが分かっているのですらすらと進めることが出来ます。
解説は、過去問道場を利用させていただきました。

テキストの読み始めから過去問を3周解ききるまで約1.5か月ほどかかりました。

まとめ
-
情報セキュリティマネジメント試験について私の学習方法を紹介させていただきました。
移動時間を利用して一つ資格を取得することが出来たのでよかったです。

これからも移動や隙間時間を利用して知識を広げていきたいと思います。
これから受験する方の参考になれば幸いです。
ありがとうございました。
big-ipのコネクション設計

最近、私の会社のプロジェクトで立て続けにBig-ipのコネクション設計で問題が起きている
ので簡単にまとめてみた。

Connection-limitは厳密じゃない
---
big-ipでコネクションを制限したいと思ったら、connection-limitを設定することを考えると
思います。
しかし、big-ipはここで設定した値に届かない場合でも上限に達したと見なしてエラーを返す
ことがあります。

なぜそんな振舞いをするのかというと、それはbig-ipはTMM毎に処理を分割して行うからです。

#### TMMとは
Traffic Management Microkernel のこと、らしいですがその中身をあまり意識はしていません。
重要なのはこのTMMがCPUのコア毎に1つ存在することです。

> https://packetpushers.net/what-the-heck-is-f5-networks-tmos/ より

#### 実際の振舞い
例えば4コアのbig-ipの、あるpool memberに40コネクションをlimitで設定した場合
実際には0~3の各TMM毎に10コネクションがlimitとして設定されることになります。
+ TMM0 10コネクション
+ TMM1 10コネクション
+ TMM2 10コネクション
+ TMM3 10コネクション

通常であれば各TMMにはバランスよく振り分けられるでしょう。そのため、ほぼ実際に設定したLimitに
到達するまでエラーを返すことはありません。
ですが、例のように小さい値を設定していると、多少の偏りが大きく影響します。

:::note warn
厳密にコネクションを制御する為にTMMを1つしか使わない設定にすることも出来ます。
しかし、本来ならば使えるCPUを使わない設定のため性能が落ちることを許容しなければなりません。
:::

まとめ
---
big-ipでConnection-limitを設定する際は、多少の偏りが発生することを考慮した値にするのが良いかと
思います。
【Git】.gitignoreって難しい Part2 - .gitignoreの作成未経験者が、ある程度の理解できるまで -

# .gitignoreの設定
昨日の記事に投稿させていただいた記事
https://qiita.com/misaki_soeda/items/c1dc6c6679f2ad561a8b

こちらで初期設定について書かさせていただきましたが、「最初に作り忘れていた時」があるかと思います。
既にリモートにあがっている、、データ量多いしどうしよう、、、

安心してください！大丈夫大丈夫～！

## .gitignoreを最初に作り忘れていた時
■ .gitignore ファイルを生成
```
$ touch .gitignore
```
<br>

■ .gitignore ファイルに設定を記述する
```.gitignore
# Nuxt dev/build outputs
.output
.nuxt
# Node dependencies
node_modules
# System files
*.log
```
ここまでは前回と同じですね。

<br>
次に、 .gitignore を追加したことをレポジトリにpushします。

```
$ git add .gitignore
$ git commit -m '.gitignoreを追加'
$ git push
```
<br>
最後に、 無視したいファイルをレポジトリから削除します。

```
$ git rm -r --cached .
$ git add .
$ git commit -am '.gitignoreに記述されたファイルを管理から削除する'
$ git push
```

完了！！


## 念の為コマンドの詳細

```
$ git rm -r --cached .
//ファイルを管理対象から除外する
```

```
$ git add .
ワークツリーで変更した内容をインデックスに追加
```

```
$ git commit -am '.gitignoreに記述されたファイルを管理から削除する'
一度addしたファイルに対して、addとcommitとを同時に行う
```

## 感想
Gitというか、コマンドってすごくない？！なんで今まで使わなかったんだろ？
できる事たーくさんある。コマンド全て使いこなしてみたい。笑
pandasのDataFrameの特定の列について、棒グラフを作成する方法

# はじめに
pandasのDataFrameの特定の列について、何が多く入ってるか知りたい時ありますよね。
そんな時のためのコードです。

# 環境
- matplotlib:3.5.2
- pandas:1.3.5
- python3:3.7.13

# データの準備
```csv:fruits.csv
apple,banana,lemon,orange,strawberry,melon,kiwi,grape,peach
```
## メインのコード
```python:main.py
from csv import reader
import random

import matplotlib.pyplot as plt
import pandas as pd

if __name__ == "__main__":
    # データの準備
    prefectures = []
    with open('fruits.csv', 'r') as csv_file:
        csv_reader = reader(csv_file)
        fruits = list(csv_reader)[0]

    fruit_data = [random.choice(fruits) for _ in range(100)]
    df = pd.DataFrame(fruit_data, index=list(range(1, 101)), columns=["fruit"])

    # ヒストグラムを描画する
    fruit_series = df['fruit']
    fruit_series.value_counts().head(3).plot(kind="bar")
    plt.show()
```
# 結果
![fruit_fig.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680649/e456c741-b47b-024d-d928-8600a2375eaa.png)

# おわりに
少しでも皆様の参考になれば幸いです。
２本目の記事です、コメントお待ちしてます！

@WolfMoonさん
ヒストグラムと棒グラフのご指摘、ありがとうございました。
[iOSアプリ審査]証明書まわりについてサクッとまとめてみた

## はじめに
iOSアプリ開発をする上で避けて通れない証明書周り。

個人アプリをリリースする過程では、なんとなーく流れ作業でやってしまったこともあり
あまり理解できていなかったので備忘録としてもまとめておきます。

まず、アプリ提出に必ず必要な`ProvisionigProfile`が何なのかを解説しますね。


## ProvisionigProfileとはなんぞや？
下記の３つをまとめたファイルのことを言います。

`・正規開発者証明書(p12ファイル)`
`・デバイス識別子（UDID）`
`・アプリケーションID（BundleId）`

簡単にいうと「誰がどのようなデバイスを使ってて、どんなアプリを作ってるか」
がわかるファイルです。

じゃあこれがなんで必要なの？

## なぜProvisionigProfileが必要なのか？

直球に言うと

`「ユーザーが実機にアプリをインストールするため」`

はい????　
　
もっと深ぼると・・・
`・悪意あるアプリをストアに流さないように`
`・本物のアプリであるということを証明するため`

ようするに
`「あなたのアプリが信頼できることが証明されていて
ユーザーが安全にインストールすることができる」`
みたいな意図ですかね。

それではProvisionigProfileの中身3つをそれぞれ端的に解説していきます。


## 正規開発者証明書
証明書が必要な理由はアプリを誰が作ったか判別するため,アプリが改ざんされていないことを判別するためです。

証明書作成には公開鍵と秘密鍵を生成する必要があり、秘密鍵は、Macのキーチェーンにのみ保管され
秘密鍵を持っているユーザーのみが、そのユーザー本人としてアプリをAppleに提出できます。

ちなみに種類が3種類
`iOS Development：開発用`
`iOS Distribution (AppStore)：App Store配布用`
`iOS Distribution (Ad Hoc)：AdHoc配布用 ※下記詳細あり`
 
## デバイス識別子（UDID）
製造時に個体ごとに割り当てられる識別番号で、利用者が削除・変更することはできません。
iPhoneの設定画面でも確認できますね。


## アプリケーションID（BundleId）

BundleIdは、アプリケーションを識別ために使われます。
BundleIdの文字列は、英数字（A-Z、a-z、0-9）、ハイフン（-）、ピリオド（.）のみで構成しないといけません。


## ProvisionigProfile作成のざっくりした流れ
`・Mac上で公開鍵・秘密鍵を生成`
`・公開鍵を含めたCSR（証明書署名要求）をAppleに送り、正規開発者証明書を発行してもらう`
 　※この証明書は、開発用・配布用の1つずつ必要
`・取得後、証明書をMacのキーチェーンに登録する`
`・証明書やアプリID、デバイスなどの情報を元にProvisionigProfileを作成する`


## AdHoc(評価用配布)とは

App Store を通さず、`テスト用や企業内利用のために登録済みのデバイスのみ`にアプリを配布する方法です。

インストールできるデバイスのUDIDをProvisioning Profileに登録する必要があります。
デバイス追加の都度、UDID登録、Provisioning Profile更新、リビルド等の作業が必要です。
証明書が無効になるとアプリが起動できなくなります。

## 終わりに
かなり端的な説明ですが、さっと整理できたと思います。
次回は証明書周りを自動化できるfastlaneについても書いていきたいと思っております。

間違っている箇所等あればご教授いただけますと幸いです！

少しでも役に立てばLGTMお願いいたします。
【CocoaPods】ライブラリのインストール時に警告が出る


# 警告文
```
[!] Your project does not explicitly specify the CocoaPods master specs repo. Since CDN is now used as the default, you may safely remove it from your repos directory via `pod repo remove master`. To suppress this warning please add `warn_for_unused_master_specs_repo => false` to your Podfile.
```
![スクリーンショット 2022-06-14 15.15.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/bf57a63c-2a20-dd3f-f766-75cefa4644a8.png)


# 解決方法
`install! 'cocoapods', :warn_for_unused_master_specs_repo => false`を最初の行に追加します。
```diff_ruby
  # Uncomment the next line to define a global platform for your project
  # platform :ios, '9.0'

+ install! 'cocoapods', :warn_for_unused_master_specs_repo => false

  target 'LicensePlist-Demo' do
    # Comment the next line if you don't want to use 
  dynamic frameworks
    use_frameworks!

    # Pods for LicensePlist-Demo
    pod 'LicensePlist'

  end
```
【備忘録】AWS実装の要点まとめ

# はじめに
この記事はアプリのデプロイの下地となるインフラ構築の`要点`をまとめたものとなります。
実装手順には触れていないのでご了承ください。

# 実装環境
作業環境
　・macOS Catalina 10.17.5

AWS上環境
　・`マシンイメージ Amazon　Linux 2`
　・`インスタンスタイプ t2.micro`

# 実装概要図
![AWS アーキテクチャ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790862/9226d173-372c-d82b-02d5-40d5beeff13a.png)

# 1.VPC
VPCとはVirtual Private Cloudの略であり、その名の通りプライベートなネットワーク空間である。
これを用いることで物理的な世界でいうルーターや機器配線を準備をすることと同等の事が実現できる。
### サブネットの作成
プレフィックス値を`/24`としVPC領域のネットワークを256分割して運用していく
サブネットは2つ作成しそれぞれ`インターネットに直接接続するパブリックサブネット`、`直接接続をしないプライベートサブネット`とする。
### インターネットゲートウェイの作成、アタッチ
現状、作成したネットワークはインターネット接続できないため、VPCサービスの提供するインターネットゲートウェイを作成しVPC領域にアタッチを行いインターネット通信を可能にする
### パブリックサブネットをインターネット接続
パブリックサブネットへのインターネット接続はまだ叶わないため、先ほど作成したインターネットゲートウェイをデフォルトゲートウェイとして利用するためパブリックサブネット用のルートテーブルを作成し、割り当てを行う。

:::note
デフォルトゲートウェイとは
「転送先が何も設定されていない時の、デフォルトの転送先」、この転送先をデフォルトゲートウェイと呼ぶ
全てのIPアドレスを示す`「0.0.0.0 /0]`をルートテーブルに作成し「転送先が何も設定されていない」を実現させる。
:::

# 2.仮想サーバー構築
### インスタンスの作成
ここでのインスタンスはAmazon　EC2というサービスで作成した仮想サーバをいう。
（EC2はIaasと言われるネットワークからOSまでを仮想環境に構築できるサービスの一種）
### パブリックIPアドレスの割り当て
このインスタンスはWebサーバとして運用するためインターネットと通信できるようにするためパブリックIPアドレスを割り当てる

::: note
Elastic IPアドレス
作成したインスタンスは起動/停止を操作できるのだが、その度に割り当てられるパブリックIPアドレスは変更される。
そうならない様にする機能としてElastic IPがあり、これによって作成したアドレスをインスタンスに割り当てる事で固定化する事ができる。
:::

### キーペアの作成
今後はインスタンスへログインして環境構築を行うため、SSHを用いてアクセスする際に必要なキーペアを作成する。

###　セキュリティグループの設定
パケットフィルタリングというパケット情報からデータ通過の可否を決める仕組みがあり、AWSではセキュリティグループがこれに該当する。
現状ではSSH通信のみを許可したいためポート22番を開けるという設定にしておく。

# 3.Webサーバーの構築
### Apacheのインストール
前の章で作成したサーバをWebサーバとして運用するためApacheと呼ばれるWebサーバ機能を提供するソフトを導入する

::: note
自動起動設定
systemctlコマンドを使って仮想マシンが再起動した際にApacheが自動起動するための設定を行う
:::

### セキュリティグループの再設定
現状、通信はSSHだけ許可しているため外部からのアクセスができない、そのためセキュリティグループの設定からポート番号80（HTTP）を開ける事でWebブラウザからのインスタンスへのアクセスを可能にする。

### DNSによる名前解決
パブリックIPアドレスでのアクセスは問題があるためドメイン名（www.xxx.~）を用いる。
TCP/IPではあくまでIPアドレスで相手を判別するため`DNS`を用いてドメイン名からIPアドレスを引き出す。`(名前解決)`
AWSではVPCサービスで自動でDNS名を作成してくれる機能があるのでそれを利用する。

# 4.プライベートサーバの作成とデータベースソフトのインストール
### プライベートサーバ
このサーバーにはWebサーバーで処理したデータのみを格納したいためバブリックサーバーの様なインターネットとの直接通信を行わない設定を行う。

::: note
DBサーバとしてインストールするMariaDBの通信は許可したいのでポート番号3306は通す設定にする。
またWebサーバーとの接続を確認するためにICMPプロトコルを用いるため、こちらもセキュリティグループで通信を許可しておく
:::

### pingによる疎通確認とWebサーバを経由してのSSH接続
WebサーバからICMPプロトコルのpingを使ってIPアドレスを用いてDBサーバと疎通ができるか確認を行う。
DBサーバはインターネットからの通信ができないためWebサーバにログインしたのちSSHを用いてログインできることを確認する。
そうすることでDBサーバの設定やメンテナンスが可能になる。

### NATゲートウェイを使ったDBソフトウェアのインストール
NATゲートウェイを用いてDBサーバのIPアドレスでインターネットにアクセスすることなく通信を行いセキュリティを高める。

::: note
NATとは
IPアドレスを変換する装置である。
今回はパブリックIPアドレスとプライベートIPアドレスを設定することでDBサーバからプライベートIPでNATにアクセスし、そこからNATのパブリックIPでインターネットにアクセスすることでDBサーバの宛先が認識されずインターネット側からのアクセスを遮断できる。
:::

### DBサーバソフトのインストール
NATのおかげでインターネットとの通信が可能になったのでDBサーバ用のMariaDBをインストールする。

# 最後に
アプリケーションをデプロイし運用するためのマシンとネットワーク環境が整った。
この下地には直接アプリの運用環境を作るのではなくDockerによるコンテナ技術を使って構築を行っていく。
そうなるとWebサーバに入れたApacheの運用作業が二度手間になってしまうが、サーバの正常稼働の確認ができたのでよしとする。
AWSの提供するNATゲートウェイは通信時間での課金が行われるためDBの長期運用予定がない限り削除しておくのが良いと思われる。
基本情報（ノイマン型コンピュータ）

ノイマンといえば天才数学者かと思いきや、色んな学問分野に影響を与えているようです。
[ジョン・フォン・ノイマン](https://ja.wikipedia.org/wiki/%E3%82%B8%E3%83%A7%E3%83%B3%E3%83%BB%E3%83%95%E3%82%A9%E3%83%B3%E3%83%BB%E3%83%8E%E3%82%A4%E3%83%9E%E3%83%B3)


**ノイマン型コンピュータ**とは以下の特徴を持ちます。

**プログラム内蔵方式**
実行時にはプログラムを予め主記憶装置上に読み込んでおく方式
**逐次制御方式**
命令を一つずつ取り出して順番に実行していく方式

プログラムをメモリに配置して、その中の命令に従ってデータを処理していく
普通のコンピュータですね。

流れとしては
```
補助記憶装置　→ 主記憶装置　→　CPUで一つずつ命令を実行
```
となります。

## 主記憶装置のアドレス
主記憶装置にはプログラムの他にも、処理中の演算結果や様々なデータが記憶されています。
そのため、主記憶装置にはコインロッカーのように番号が割り振られていて、その番号を
指定することで、任意の場所を読み書きすることができます。

この番号のことを**アドレス**（または**番地**）と呼びます
```
アドレス  メモリ空間
0000   　データ１
0001　　　　　　　画像１
0002   　テキスト１
0003　　　　　　　ほげ
0004　　　　　　　ふが
FFFF
```
アドレスが主記憶装置上の場所を示します。

## まとめ
ジョイマンとノイマンは違いますね。
【コラム】これからは機械学習！ならば統計学習は不要か？

### はじめに
機械学習でできることは日増しに高まっています。
ひとつは解釈性です。ICEやSHAP等の登場により、機械学習＝ブラックボックスという認識は変わってきているように思います。
また、データ獲得の難易度が下がってきていること、データ量が多くても取り扱えるようになってきていることもあり、効率性を重んじ、できるだけ限られたデータで、その際の検出力は大丈夫か？等ということを気にかけることも減ってきているように思います。

https://www.amazon.co.jp/dp/429712226X/ref=redir_mobile_desktop?_encoding=UTF8&ref_=cm_cr_arp_mb_bdcrb_top

https://dropout009.hatenablog.com/entry/2019/01/07/124214

https://dropout009.hatenablog.com/entry/2019/11/20/091450

であれば、従来の統計は必要ないでしょうか？

***

### 特徴量はそれでいいのか？
例えば、AKB48のメンバーをクラスタリングしよう！という場合、どのような特徴量を取り上げるべきでしょうか？

以下はどうでしょう？
- かわいい、キュート、愛らしい・・・

「何がちゃうねん！」という突っ込みが入りそうです。
もっとバリエーションを振らないといけませんね。

　
では以下はどうでしょう？
- セクシー、かわいい、おもしろい・・・

これが正解ということではないですが、前者は間違いといってよいレベルと思います。
そもそも違いを明らかにしないといけないなら、差を生む特徴量を与えないといけません。
ばらつきを与えないといけません。


***
### 多重共線性
上記の例には、もうひとつ問題があります。
特徴量同士の相関が高いということです。
「かわいい」ならば、「キュート」だろうし、「キュート」ならば「愛らしい」だろうからです。
このような特徴量をモデルに適用すると、多重共線性と呼ばれる問題が生じ、予測結果があてにならないものになってしまいます。
よく取り上げられる「身長」と「体重」という特徴量も同じです。
背が低いのに重いとか、背が高いのに軽い等、データには例外ももちろんありますが、身長が高いならば、体重も重いという傾向になるのは自明です。
先の「かわいい、キュート、愛らしい」ならば、例えば「キュート」だけ選んであとは捨ててもよいでしょうし、「身長、体重」ならば「体の大きさ」という一つの特徴量に置き換えてもいいでしょう。

多重共線性の影響、その影響を回避するための相関の見方、類似の数多くの特徴量を少数の特徴量にまとめてくれる主成分分析・・・これらは統計の範疇となります。


***
### 標準化
もっとも身近な機械学習モデルは線形の単回帰モデルです。
線形の単回帰モデルは、

> **y = aX + b**

特徴量が3つある場合、モデルは以下のようになります。

> **y = βo + β1X1 + β2X2 + β3X3**
 
モデル式の通り、特徴量（X1, X2, X3）が1単位増加すると予測値y はそれぞれ（β1,β2,β3）だけ大きくなります。特徴間でスケールが異なる場合は、同じように 「特徴量が1単位増加した場合の効果」 を見ても、「1単位」のスケールが異なり、正当な比較は難しくなります。
レンジの大きい特徴量の影響に振られるからです。

この問題を解決するのが標準化（standardization）です。
各特徴量の平均を引いて標準偏差で割り、 平均0 標準偏差1 の特徴量とすると 「特徴量を1標準偏差だけ変化させた場合に予測値に与える影響」とすることができ、特徴量のレンジの大きさの違いによる影響を受けることがなくなります。
 

***
さて、議論を元に戻しましょう。
機械学習はモデルの可視化や解釈性は高まっていますし、データが多くても気にしなくていい、これを使わない手はありません。

ただ、機械学習はモデルで予測した結果を可視化したり、解釈しやすくするものなので、あてになる結果を得るためには、ある程度のモデル精度は確保しておきたいところです。

この機械学習のモデルの精度は、特徴量エンジニアリングが成否を分けるなどといわれています。
モデルの精度はパラメーターをチューニングすることであげられる場合もありますが、そもそもはどんなデータをとるか、どんなデータを選ぶかといったことや、データ処理に依存する面も大きく、これらのバックグラウンドとしての知識、機械学習を適用する前のデータの可視化や処理は 統計が教えてくれることが主であるように思います。

とはいえ、機械学習は モデルの予測精度が十分ならば、特徴量同士の影響度合はあまり気にしなくてもいいよともいわれているから話がややこしくなる。
予測精度はやってみないと十分かどうかはわかりませんので、影響ができにくいとされる決定木モデルを使ったり、特徴量に対して正則化を施したり等、事前にできることはやっておこうという場合と、やってみてから考えようという場合が現実にはあると思います。
いずれにしても、未知のデータに対する精度はしっかり確認しないといけないでしょう。


***
### このように向き合いたいな
統計なのか？機械学習なのか？という2択ではなく、統計的考え・データ処理で足元を固め、その上に機械学習的アプローチを乗せてゆくということではないかと思いますが、機械学習を主軸とした場合に統計の何を抑えておくべきかを整理することには意味があるとも思います。

私は、巷のEDAツールでアウトプットされたものが解釈できること、多重共線性、標準化が基本。

特徴量の選択や要約につながる主成分分析などをベースとするとよいということと、「二値の試行回数を増やすと二項分布に従い、正規分布に近似する」などの分布の関係性の理解がその次にあるように思います。

一方、統計に高度な手法は、機械学習の手法に置き換わってゆくように思います。
これは、先の通り機械学習による解釈性が統計的手法同様に高まってきているからです。

巷の製品・サービスはますます高度化、複雑化し、得られるデータも膨大となっています。
機械学習が適用できるか否かが先の生産性を左右する・・・これは大げさな意見ではないように思います。

いろいろ意見はあると思いますが、両者を効率的に取り入れてゆくことが大切なんだろうということでこのコラムを締めくくりたいと思います。

***
### 参考

https://github.com/slundberg/shap

https://scikit-learn.org/stable/modules/partial_dependence.html#individual-conditional-expectation-ice-plot
htaccessのリダイレクトが効かない

PowerCMS環境にて、特定ページのリダイレクト処理をルートディレクトリ下のhtaccessに記述したが、どうもリダイレクトが走ってくれない。同一ファイル内のベーシック認証や正規化は動く。
なおかつ全部のリダイレクトが効かない訳ではなく、ごく浅い階層では走ったり走らなかったりする。なにこれ。

```
RewriteEngine On
RewriteRule ^test/$ https://www.example.com/ [R=301,L]
```
☝リダイレクト成功
```
RewriteEngine On
RewriteRule ^testA/$ /testB/ [R=301,L]
```
☝リダイレクト失敗
```
RewriteEngine On
RewriteRule ^test/test-test/test.html$ /testC/test-test2/test.html [R=301,L]
```
☝リダイレクト失敗

## 検証内容

既存のhtaccessに追加で記述している（＝挙動は過去確認済のはず）のでサーバーレベルでのチェック（htaccessが有効か、リダイレクトが有効か）は省略した。
ファイルレベルでのチェック（名前が「.htaccess」、前後にスペースが含まれていない、
文字コードがUTF-8、改行コードLF、内容に全角が含まれていない、最後に空行がある）は問題なし。
となると記法が問題かと思うが、
- エスケープはとくに不要
- リダイレクト先をフルパスで記述する必要なし=同ドメインならルートパスで問題ない
- 正規表現の範囲も問題なし

で記法の問題点もすぐに見つからない。

ここから先は先輩からアドバイスを貰いつつ、
1. 成功しているリダイレクト処理の左辺・右辺を少しずつ変えて試す
2. ファイル末尾でなく先頭に記述を移動する
3. 他の処理をすべて消してみる

など試す。右辺を変えて試した際に、リダイレクト先のページが存在しなくともリダイレクト処理は走ることがわかる。そのため左辺の記述が間違っていることが分かるが、
記述の移動や他の処理を消去しても処理が成功するわけでもない。

## 解決
原因は最終的に、下層のディレクトリにあったhtaccessが設定を上書きしていたことだった。
PowerCMSはブログの新規作成時「ダイナミックパブリッシング」がデフォルトで有効になるようになっており、その関係上mtview.phpに関するhtaccessファイルも自動生成されるようだ。
中身を見るとmod_rewriteについての命令が書かれている。
```
<IfModule mod_rewrite.c>
  Options +FollowSymLinks
  RewriteEngine On
  RewriteCond %{REQUEST_FILENAME} !-f [OR]
  RewriteCond %{REQUEST_FILENAME} -d [OR]
  RewriteCond %{REQUEST_FILENAME} ^[^.]+$|\.(html|mtml|HTML|MTML)$ [NC]
  RewriteRule ^ /test/.mtview.php [L]
</IfModule>
```
自分の理解力に自信はないが怪しい記述がある。（ブログより下のファイルを.mtview.phpにリライトしている？）あるいは単純に、mod_rewriteを上下階層で重ねて使っていたことが不具合を招いたのかもしれない。

本案件にダイナミックパブリッシングは使用していないとのことで当該htaccessファイルは削除すると、リダイレクト処理が問題なく動くようになった。

参考：https://httpd.apache.org/docs/current/mod/mod_rewrite.html
【C】初めてのC言語（10. 構造体配列）

# はじめに

* これまでの学習に続いて、今回は構造体配列について学んだ結果をまとめてみました。
  * [【C】初めてのC言語（1. Hello world）](https://qiita.com/nkojima/items/518c1a4ec06861d74b3c)
  * [【C】初めてのC言語（2. 四則演算とフォーマット指定子）](https://qiita.com/nkojima/items/36ea93b7296ce9e8a55b)
  * [【C】初めてのC言語（3. ポインタ）](https://qiita.com/nkojima/items/825bb9f931016faccd68)
  * [【C】初めてのC言語（4. 構造体）](https://qiita.com/nkojima/items/40a1101f2f6f5800bc2d)
  * [【C】初めてのC言語（5. 関数）](https://qiita.com/nkojima/items/1fa3317c04f25fe24276)
  * [【C】初めてのC言語（6. 配列）](https://qiita.com/nkojima/items/eda3ff6675b47e7ab5f0)
  * [【C】初めてのC言語（7. for文）](https://qiita.com/nkojima/items/a5659098f7e5275a96ec)
  * [【C】初めてのC言語（8. 2次元配列）](https://qiita.com/nkojima/items/f5eb25a4f8d1725faa89)
  * [【C】初めてのC言語（9. 関数のプロトタイプ宣言）](https://qiita.com/nkojima/items/57318d74bdfa670bf72e)

# 学習環境

* 今回は[paiza.io](https://paiza.io/ja/projects/new)のC言語のエディタを使いました。

# やりたい事

* 以下のような表形式で表されるデータを「構造体の配列」として処理したい。
* 「構造体の配列」を関数間で受け渡ししたい。
  * [配列を関数に渡すと、配列へのポインタに自動的に読み替えられてしまうので、関数に要素数を一緒に渡すのが定石](https://teratail.com/questions/123793)という情報がありましたが、これが一般的な実装かどうか分かりませんでした。
  * そのため、今回は関数間での構造体配列の受け渡しは実装しませんでした。

|社員番号|社員名|部署名|
|---|---|---|
|1|Sato|Sales|
|2|Suzuki|Development|
|3|Takahashi|Sales|

# サンプルコード

* 社員名と部署名はこのコード中では変更されないので、`char*` ではなく `const char*`としました。
  * この点については @angel_p_57 さんのコメントに基づいて修正しました。
  * 例えば「コード中で部署名が変更される可能性がある」という場合は `char*` になるのかもしれませんが、現時点ではよく分かりません。

```c:main.c
#include <stdio.h>

// 構造体：社員型
typedef struct employee {
    int id;             // 社員番号
    const char* name;   // 社員名
    char* deptName;     // 部署名
} Employee;

int main(void){
    // 社員リストの作成
    Employee empList[3];

    empList[0].id = 1;
    empList[0].name = "Sato";
    empList[0].deptName = "Sales";

    empList[1].id = 2;
    empList[1].name = "Suzuki";
    empList[1].deptName = "Development";
    
    empList[2].id = 3;
    empList[2].name = "Takahashi";
    empList[2].deptName = "Sales";
    
    // 社員リストの表示
    int arySize = sizeof(empList) / sizeof(Employee);
    
    for (int i=0; i<arySize; i++) {
        printf("社員番号：%d、社員名：%s、部署名：%s\n",
            empList[i].id,
            empList[i].name,
            empList[i].deptName);
    }
    return 0;
}
```

```text:実行結果
社員番号：1、社員名：Sato、部署名：Sales
社員番号：2、社員名：Suzuki、部署名：Development
社員番号：3、社員名：Takahashi、部署名：Sales
```

# 補足：構造体配列の初期化

* @angel_p_57 さんのコメントによると、以下のように構造体配列を初期化することもできるそうです。
* 実際に書いてみたところ、2番目の書き方の方がシンプルですが、1番目の書き方の方が間違いが無さそうです。

```c:emplistの初期化（その1）
    Employee empList[]={
        { .id=1, .name="Sato", .deptName="Sales", },
        { .id=2, .name="Suzuki", .deptName="Development", },
        { .id=3, .name="Takahashi", .deptName="Sales", },
    };
```

```c:emplistの初期化（その2）
    Employee empList[]={
        { 1, "Sato", "Sales", },
        { 2, "Suzuki", "Development", },
        { 3, "Takahashi", "Sales", },
    };
```

# 参考URL

* [[c言語]関数の引数に配列を指定する３つの書き方(サンプルコードあり)](https://it-ojisan.tokyo/c-func-arg-array/)
* [C言語　配列の表示について](https://teratail.com/questions/123793)
FileMakerの開発支援ツールMBS FileMaker Plugin (8) こういう時に便利なコピー機能 

## MBS FileMaker Pluginの多彩なコピー機能

MBS FileMaker Pluginは、FileMakerで作ったAppに多数の機能追加ができるプラグインですが、開発の効率化を図るための機能も有しています。
その中でも、MBS FileMaker Pluginのコピー機能は、FileMakerの標準機能では取得できない箇所の情報をコピーできるため、開発業務の効率化や、ドキュメント作成などにも重宝するでしょう。

今回はその一例を紹介します。

## スクリプトトリガーに設定したスクリプトを効率よく編集作業に進められる。

スクリプトトリガーの設定は、各イベントごとにスクリプトをアサインすることで実行されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2322472/1a0bcc75-0745-b90b-1e7e-a134ec552d79.png)

上図のように、スクリプトをセットすることや取り外すことはこちらの画面で実現します。

技術者ならばよく遭遇するケースとして、セットしたスクリプトの内容を修正したいということがあるでしょう。
現状の、スクリプトトリガの設定ウィンドウでは、ダイレクトにスクリプトの編集画面には遷移できません。

そこでうまく活用できるのが、MBS FileMaker Pluginのコピー機能です。

画面に表示されているスクリプト名を頭で覚えたり、メモを取ることは少し手間がかかります。
コピー機能があれば効率がよいです。
MBS FileMaker Pluginでは、下図の部分にてコピーを取得することが可能です。
![Untitled.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2322472/afb6529f-c10a-a9ed-0036-cf51da824d9d.jpeg)
ただし、こちらの場所でコピーすると、ダブルクォーテーションもセットでコピーされてしまうことに注意が必要です。

次の方法をオススメします
Select...ボタンを押下し
![Untitled.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2322472/047b54fa-1897-5e4e-68fe-6e050844c435.jpeg)

スクリプト選択ウィンドウを表示し、スクリプト名の上で右クリックしてCopy Valueを選びます
![Untitled.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2322472/116029e3-8726-7817-5e33-32dd33e9f664.jpeg)

あとは、スクリプトウィンドウを開き、検索窓にさきほどコピーしたスクリプト名をペーストすれば、目的のスクリプトを確実に特定できます。
![Untitled.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2322472/dc67d441-c7df-8228-1044-a84f6a3e7ded.jpeg)

スクリプト名がとても長い場合など、頭では覚えきれない場合には特に便利でしょう。

## さまざまな場所で試してみましょう
ご覧いただけたように、MBS FileMaker Pluginのコピー機能は、さまざまな場所で機能します。
「もしかしてここでコピーできる？」と思ったならば、右クリックしてみましょう。
コンテキストメニューで、MBS FileMaker Pluginのメニューが出てきたら「やったぜ！」という気持ちになることでしょう。

EOF
MeCabとmecab-ipadic-NEologdをWindowsのPythonで使用するときに注意すること

# こんにちは

2回目の投稿です。今回はWindowsでMeCabとmecab-ipadic-NEologdを、Pythonから使おうと思ったらめちゃくちゃ手こずったので、その備忘録的なものを書きます。

# インストール

情報が少なく、READMEなどを読んでも「？？？」だったので色々探したところ、これで行けました。

[WindowsでPythonでMeCab（mecab-ipadic-NEologd）](https://qiita.com/yakipudding/items/0372dc79bb5722fa4b8b)

gccが必要らしいです。私の場合、もう既に入っていたので大丈夫でした。
macやlinux系のOSでの解説はまあまあありましたが、Windowsは少なかったですね……WSLを推奨しているので仕方がないとは思いますが……

# 記述方法

[【Python】WindowsのMeCabでNEologdをユーザー辞書に使う](https://resanaplaza.com/2022/05/08/%E3%80%90%E8%B6%85%E7%B5%B6%E7%B0%A1%E5%8D%98%E3%80%91windows-%E3%81%AEpython%EF%BC%8Bmecab%E3%81%A7%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E8%BE%9E%E6%9B%B8%E3%81%ABneologd%E3%82%92%E4%BD%BF%E3%81%86/)

この記事が参考になりました。
ただし、インストールの際に64bit版ではなく32bit版のMeCabをインストールしているはずなので、パスの「Program Files」は「Program Files (x86)」に置き換えてください。（一番最初のURLじゃなくて普通にこの解説通りにインストールするほうが混乱も少なくて賢いかも）

MeCab.Tagger()の引数で、次のように辞書のあるパス文字列を指定する部分があります。

```[Python]
MeCab.Tagger('-d "C:/Program Files (x86)/MeCab/dic/ipadic"')
```

Windows以外の解説ではこのパスをダブルクオーテーションで括らずに解説しているのでややこしいです。
Windowsだと、「Program Files」の所でパスが分断されてエラーが出ます。
あと、「\」ではなく「/」を使いましょう(全部「/」で統一してほしい)

# おしまい

5時間くらいぶっ続けでこいつらと格闘した後にすぐ書いた文章なので、読みにくいかもしれませんが参考になれば幸いです。
【完全自分用】Rubyの問題を解いて知識をアウトプットする。

# はじめに
今回は完全に自分用アウトプットです。
Rubyの問題を解いて、プログラムの知識や考え方を深堀りするために記述します。

# Q1 ハッシュの基礎
まずはハッシュの基礎
```
puts hash.keys
puts hash.values
```
のメソッドを実行した際に英語と数字で123が表示されるように記述。
```
hash = {one: 1, two: 2. three: 3}
```
これは簡単。
```
hash = {　キー:　値}
```
基礎中の基礎。
# Q2 二重ハッシュ
続いて二重ハッシュ
```
user_data = [
 {user: {profile: {name: 'George'}}},
 {user: {profile: {name: 'Alice'}}},
 {user: {profile: {name: 'Taro'}}},
]
```
ユーザーの名前だけが出力されるようコーディングする

```
user_data.each do |u|
  puts u[:user][:profile][:name]
end
```
抑えるべきポイントは
```
ハッシュ[取得したい値のキー]
```
nameの値を出力するためには
```
ハッシュ[取得したい値のキー][取得したい値のキー][取得したい値のキー]
```
のように連続して記述そうすることで3つ目の値を取得できる。
以下が出力結果
```
George
Alice
Taro
```
# Q3 クラスとインスタンスの概念initialiszeメソッド
続いてクラスとインスタンスの概念
```
class Article

  def initialize(author, title, content)
    @author = author
    @title = title
    @content = content
  end

end
```
上記コードを使用し、以下の出力結果を得られるよう記述する。
```
著者: 阿部
タイトル: Rubyの素晴らしさについて
本文: Awesome Ruby!
```
```
class Article

  def initialize(author, title, content)
    @author = author
    @title = title
    @content = content
  end

  def author
    @author
  end

  def title
    @title
  end

  def content
    @content
  end

end

article = Article.new("阿部", "Rubyの素晴らしさについて", "Awesome Ruby!")
puts "著者: #{article.author}"
puts "タイトル: #{article.title}"
puts "本文: #{article.content}"
```
記述は長いですが、抑えるべきポイントはinitializeメソッドです。インスタンスが生成された瞬間に、インスタンスが実行する処理を定義するインスタンスメソッド。`article = Article.new("阿部", "Rubyの素晴らしさについて", "Awesome Ruby!")`の記述でインスタンスが生成されているのでその瞬間に実行されている。
# Q4　特定条件のみに呼応するプログラムの作成
続いて特定条件のみに呼応するプログラムの作成
DataクラスはRubyの標準ライブラリ機能。使用するには`require "date"`を記述。
今日の曜日は`Date.today.wday`のように記述。
使用例
```
require "date"

day = Date.today.wday

puts day
```
この記述で木曜日なら4が出力される。
これらを用いて今日の曜日を表示するコードをDataクラスを使用して記述
ただし、金曜日であれば、「今日は金曜日だ！」を出力
```
require "date"
day = Data.today.wday
days = ["日曜日", "月曜日", "火曜日", "水曜日", "木曜日", "金曜日", "土曜日"]

if == 5
puts "今日は#{days[day]}だ！"
else
puts "今日は#{days[day]}"
end
```
`0=日曜日〜6=土曜日`
# Q5 ifをunlessに書き換える
```
if a + b > 0
  puts "計算結果は0より大きいです"
end
```
をunlessというメソッドを用いて書き換える。
unlessはifの逆。falseの場合に処理が実行されるメソッド
```
unless a + b <= 0
  puts "計算結果は0より大きいです"
end
```
詳しifとunlessを見ると。
if
```
if 条件式
  条件式がtrueの時に実行する処理
else
  条件式がfalseの時に実行する処理
end
```
unless
```
unless 条件式
  条件式がfalseの時に実行する処理
else
  条件式がtrueの時に実行する処理
end
```

# 終わりに
簡単な内容だが、基礎固めのため毎日5問程度で進めていく。
全部で35問1週間かけて解いていきます。
【Spark AR Studio】笑顔認識させてみた

## 概要
こんにちは、トンガルマンの野間です！
今回は、前回同様Spark ARを使用して、**笑顔認識**をする方法を紹介します！

▼前回の記事はこちら！
[【SparkAR Studio】人の前後にパーティクルを表示させてみた](https://qiita.com/noma_tongull/items/d33af303690cd7a64ed3)

## 事前準備
まず、笑顔を認識した時に表示させたい素材を用意しましょう
今回はこちらの画像を使用して作成しようと思います。
![smile.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2534018/29af3473-1fe2-14cd-40b8-51c16f5f4d84.png)


## 笑顔を認識させる
では早速始めます！

1. Face Tracker>InteractionsからPatchのCreateを選択
    ![スクリーンショット 2022-06-08 14.00.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2534018/5b910b28-d565-dd66-c3e7-b4dae2fa58e1.png)

1. アクションのリストが表示されるのでその中からProducer Patchを選択
![スクリーンショット 2022-06-08 14.02.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2534018/b987de2b-07f9-6e9a-c806-f9b57c771e59.png)
![スクリーンショット 2022-06-08 14.02.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2534018/372f6cc2-db4a-d0ab-e350-051f23b3a6f2.png)

1. PatchEditor内で右クリックし、smileと検索しAddPatchする
![スクリーンショット 2022-06-08 14.05.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2534018/9cc5fe17-7751-b8a1-5007-de5b9ba170bb.png)

1. Smile PatchをfaceTracker Patchに繋ぐ
![スクリーンショット 2022-06-08 14.07.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2534018/9cca96d0-d3a5-c8b3-c693-0c0365bec4ad.png)

これで笑顔認識ができるようになりました！
## 表示させたい素材を繋ぐ
次は素材の表示です！
今回は画像なので、Planeにmaterialを追加し表示させています！
1. 表示させたいPlaneのVisibleの横にある矢印(→)を選択
![スクリーンショット 2022-06-08 14.22.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2534018/a1da0ba3-4753-569a-f59b-abc10da0f8af.png)

1. Smile Patchに繋ぐ
![スクリーンショット 2022-06-08 14.17.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2534018/1a1ddccf-63d1-9168-d71e-d5609cf68a8e.png)

以上で笑顔の時のみ画像を表示できるようになりました！

## おまけ
逆に笑顔じゃない場合に表示させたいものは、
Smile Patchと素材の間にNot Patchを挟みましょう！
1. Patch Editor内で右クリックし、Notと検索しAddPatchする
![スクリーンショット 2022-06-08 14.26.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2534018/c08ce501-d21a-a948-807a-743be849dd82.png)

## 完成！！
ぜひ参考にしてみてください！
▼笑顔の時
![スクリーンショット 2022-06-08 14.29.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2534018/0f91d2ab-9273-5324-ff47-023f09077bc5.png)

▼笑顔じゃない時
![スクリーンショット 2022-06-08 14.28.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2534018/44a70606-5de8-61ca-dedc-2acc944d93f0.png)
WSLのOpenGL errorでハマった話（LIBGL_ALWAYS_INDIRECT=1でなく0）

そもそもOpenGL周辺の知識がないので、メモがわりの記事となりますがすみません。

WSLでUbuntuを使っていていくつかのソフトウェア(ChimeraXと3dmodという研究用のソフトウェアです）でOpenGL errorが出た。
bashrcで何かの際に
```bash
export LIBGL_ALWAYS_INDIRECT=1
```
と設定していたのが問題のようだ。
下記を参考にして解決した。
https://github.com/microsoft/WSL/issues/5535

おこる症状としては
```
glxgears
```
を実行した際に（実行するにはsudo apt install mesa-utilsが必要）
```
Error: glXCreateContext failed
```
が起き、
```
sudo glxgears
```
で、ルート権限で実行すると、正常に歯車が回る。
さらに、
```
xeyes
```
では正常にウインドウが開いて動作する。（sudo apt install x11-apps)が必要。

先ほどのgithubの内容を完全にフォローしていないが、
.bashrcで
```
export LIBGL_ALWAYS_INDIRECT=0
```
で解決した。WSLのopenGLに関して、WGLg以前のWSL1, 2でGUIを使う記事が多く残っており、この場合はLIBGL_ALWAYS_INDIRECT=1としていたため、openGL errorを探していたときになかなか解決策に行き着かなかった。

参考までに
chimeraxでのエラーメッセージは
```
WARNING: WebEngineContext used before QTWebEngine::initialze() or OpenGL context creation failed
WARNING: QCLXContext: Failed to create dummy context
ERROR: Could not create OpenGL context
```

3dmodでは、正常に設定できているか確認して、LIBGL_ALWAYS_INDIRECT=1にしろとでてきて、余計に混乱した。
PythonでMatplotlibの使い方がわからないときは、公式リファレンスを見よう

# この記事の概要
今年度（記事を記載している2022年度）にほぼ初めてPythonを覚え、データ可視化の方法などを一通り覚えた駆け出しデータサイエンティストですが、未だにMatplotlibが使いこなせないので、この際だから頭の整理をしてしまおう!　というものになります。

# Matplotlibには2つの記述方法がある
あまり英語が得意じゃないのですが、<a href="https://matplotlib.org/">Matplotlibの公式サイト</a>を読み解きながら、2つの方法をまとめていきます。

## その1."pyplot"による方法
とりあえずネットにあるコードをぺたぺた貼るときに、大体初めに覚えるものです。
公式サイトでは「like MATLAB」と書いてありますね。ついでに
「オブジェクト指向よりフレキシブルじゃないから、Axesオブジェクトから呼び出すのがいいよ!」
と言っているようです（若干意訳気味ですが）。
```import.py
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
```
とりあえずおまじないのようにこれを書いて、

```plt.py
plt.hist(df)
plt.bar()
```
などと書くことで、それらしいヒストグラムや棒グラフを作ることができます。

## その2.「オブジェクト指向」による方法（Axesオブジェクトを使う方法）
上記でも触れられている「オブジェクト指向」による書き方ということになります。

```Axes.py
fig,ax = plt.subplots()
ax.plot(x,y)
```
のような感じで書きます。

ただ、これだけだと「どっちでもいいんじゃない?」となりそうですね。

# 「オブジェクト指向」をお勧めする理由
個人的にKaggleとかのデータを触ってみて思ったのは、「変数が多いデータを可視化するときに、5×5のマトリックスにしないと見づらくてしょうがない!」といったようなことが多かったので、オブジェクト指向による方法のほうがうまく書きやすいと思いました。

```hist_and_bar.py
def hist_and_bar(df,bins=10):
    # df:DataFrame
    len_col = len(df.columns)
    ax_col = np.sqrt(len_col).astype(int)
    ax_row = len_col // ax_col
    if ax_row * ax_col < len_col:
        ax_row += 1
    
    fig,ax = plt.subplots(ax_row, ax_col, figsize=(24,24))
    for i, col in enumerate(df.columns):
        if df[col].dtypes !='object':
            ax[i//ax_col, i%ax_col].hist(df[col], bins=bins)
            ax[i//ax_col, i%ax_col].set_title(col)
        else:
            ax[i//ax_col, i%ax_col].bar(df[col].value_counts().index, df[col].value_counts(),color='orange')
            ax[i//ax_col, i%ax_col].tick_params(axis='x',rotation=45)
            ax[i//ax_col, i%ax_col].set_title(col)
```
例えば、こんな感じで「カラムの型が数値型ならヒストグラム、カテゴリ型なら要素ごとの度数グラフ」としたいときに、オブジェクト指向のほうが記述しやすいなと思いました。

# 覚えておきたいこと
- 特に、データサイエンスで相関係数を可視化するときに、軸の表示方法を知らないと苦労するので、そういうのは覚えておくか、公式サイトのどこを見ればいいか把握しておきましょう。
例えばこんな感です。
```'corr.py
# df_X が分析したいデータの説明変数(DataFrame)
df_X_corr=df_X_num.corr()
fig,ax=plt.subplots(figsize=(12,12))
ax.imshow(df_X_corr,cmap='coolwarm')
ax.set_xticks(range(len(df_X_corr.columns)))
ax.set_xticklabels(df_X_corr.columns)
ax.set_yticks(range(len(df_X_corr.columns)))
ax.set_yticklabels(df_X_corr.columns)
ax.tick_params(axis='x',rotation=90);
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2656619/f95f8322-5aef-73dd-72d3-acacd9046226.png)

- グラフをコピペしたときにタイトルやラベルが設定されているほうがいいので、その辺を使いこなせるようにしましょう。

# 感想
結局<a href="https://matplotlib.org/cheatsheets/">Matplotlibの公式サイトにあるCheetSheets/Handouts</a>をちゃんと見よう、というのが一番ちゃんと理解できることがわかりました。
本当は軸やラベル、タイトルの設定の仕方などもまとめたいと思ったけど、それはまたの機会にします。
GitHubでプライベートリポジトリのContributionsでも草を生やす方法

通常プライベートリポジトリの活動は、草(四角い緑色のやつ)を含め他者に共有されませんが、
このままだと実際の活動をアピールできないので少々勿体ない気もします。

・実際の草
![スクリーンショット2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392337/12cd0715-f7e1-e857-a85a-885596c4c540.png)


・他者から見た場合の草
![スクリーンショット1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392337/e69a5cd5-3578-8df1-ff2d-90b22f0cf99a.png)


実はプライベートリポジトリのContributionsでも、
外向けに草を生やすことができたりします。

## やり方

ログイン状態でContribution settingsをクリック

![スクリーンショット3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392337/01ae3f9a-b3be-a933-89e1-a97e67690996.png)


Private contributionsのチェックを入れる

![スクリーンショット4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392337/e9f051aa-f6ff-6691-8d68-c9c68fe76063.png)


これだけです。
ログアウト状態でもしっかりと草が生えています。

![スクリーンショット5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392337/22cc27b6-e1c5-d959-8898-3c3d56330d38.png)

※ちなみに草をクリックされても「contributions in private repositories」と表記されるのみで、
プライベートリポジトリの内容は表示されませんのでご安心ください。
Next.js学習まとめ

# Next.jsの学習まとめ

### Create Next App
```zsh
npx create-next-app nextjs-sample
```

### ルート管理
ReactRouterではそれぞれのコンポーネントでルートを管理していたが、
Pages内のフォルダディレクトリで管理できるようになるメリットがある。
PagesフォルダはNextCreateApp時に追加されるので、これを使用する。
また、ルーティング管理のために特別な名称があり、
index.** というファイル名は"/"を表しており、
_**.**というようにアンダーバーから始まる場合はルーティングされず
ルーティング不要なファイルに使用されている。(_app.jsなど)
[**].**とした場合はパラメータを表し、
[...**].**とした場合は複数のパラメータを受け取る。


|階層1|階層2|階層3|
|----|----|----|
|Pages|_app.js|
||index.js|
||main|index.js|
|||content.js|
|||[articleId].js|
|||[...slug].js|

上記のようにファイルを作成した場合、
アクセスできるURLは[ / , /main , /main/content , /main/:articleId , /main/* ]となる。

### ページリンク
ページ間をリンクするためにはLinkコンポーネントを使用する
```
<Link href="/main/content" />
<Link href={{
            pathname: '/main/:articleId',
            query: { articleId: helloworld },
          }}
```

### クエリパラメーターの取得
コンポーネント内で現在のパラメーターを取得するためには"next/router"から
useRouterをインポートすることで取得することができる
```
import { useRouter } from "next/router";

const router = useRouter();
const currentQuery = router.query;
```

### SSG/ISR
* SSG
next.jsではビルド時にプリレンダリングすることで
パフォーマンスの向上やSEO対策を行うことができる。
使い方としてはコンポーネント内で下記を記述する。
* ISR
SSGの欠点として一度ビルドした後は更新されないという点がある。
その欠点を補うためにISRを設定することで自動で更新されるようになる。
revalidateを追加することで更新間隔(秒数)を設定する。
```
export async function getStaticProps(context) {
  return {
    props: {},
    revalidate: 30,
  }
}
```
また、ルーティングで[**].**というパラメーターを受け取るコンポーネントとした場合、
上記の設定のみだと動かない。
それぞれのパスを設定するために下記のような記述する
```
export async function getStaticPaths() {
  return {
    paths: [
      { params: { articleId: "a1" } },
      { params: { articleId: "a2" } },
      { params: { articleId: "a3" } },
    ],
    fallback: true
  };
}
```
pathにはビルド時に生成するパスを全て記述する。
fallbackは3つの設定があり、
trueの場合は事前に設定したパス以外も受け取り見つかった場合はページを表示し、
以降パスのリストに追加される。
falseの場合は事前に設定したパス以外はエラーとなる。
"blocking"を設定した場合は、trueとほぼ同じであるが完全にロードが完了してからページが表示される。

### SSR
ReactはCSRのためクライアントのスペックによって表示までに時間がかかってしまうことがある。
Next.jsではSSRを使用でき、これはサーバー側で処理するためスペックに依存しない。
SSRとSSGの違いとしてはSSRはリクエスト毎にページを生成するが、SSGは事前にページを生成し提供している。
SSRの書き方としては下記のように記述する。
```
export async function getServerSideProps(context) {
  return {
    props: {}, 
  }
}
```
また、ページが見つからなかった場合の処理として、
notFoundとRedirectが設定できる
```
return {
      notFound: true,
    }
```
```
return {
      redirect: {
        destination: '/',
      },
    }
```

### Next.js製コンポーネント
Headコンポーネントを使用すると普段htmlに記述しているheadを追加することができる
```
import Head from "next/head"
<Head>
   <title>My page title</title>
   <meta name="viewport" content="initial-scale=1.0, width=device-width" />
</Head>
```

Imageコンポーネントを使用すると遅延ロードと最適化がされるので基本こちらを使用した方がよい
```
<Image
  src="me.png"
  alt="Picture of the author"
  width={500}
  height={500}
/>
```
### カスタムドキュメント
pagesフォルダ内に下記のように_document.jsを追加するとhtmlの雛形の設定ができる。
主にHtml全体の設定やHeadの設定をここで行う。
```
import { Html, Head, Main, NextScript } from 'next/document'

export default function Document() {
  return (
    <Html lang="ja">
      <Head/>
      <body>
        <Main />
        <NextScript />
        <div id="overlay" />
      </body>
    </Html>
  )
}
```