OmniAICreator/Qiita-1.07M huggingface dataset:
Flutter 下から選択ボタン表示(showModalBottomSheet)

今回は下から出てくる画像のようなボタン(showModalBottomSheet)を作成していきます。

<img width="400" alt="showModalBottomSheet" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/607760/90562117-7f62-08c5-2dd7-3a960e53daf0.png">

# 記述コード
```dart

void bottomSheet(BuildContext context) {
  showModalBottomSheet<void>(
      context: context,
      builder: (BuildContext context) {
        return SingleChildScrollView(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: [
              ListTile(
                leading: const Icon(Icons.photo),
                title: const Text('写真'),
                onTap: () {},
              ),
              ListTile(
                  leading: const Icon(Icons.camera),
                  title: const Text('カメラ'),
                  onTap: () {}
              ),
            ],
          ),
        );
      });
}
```

`SingleChildScrollView`で選択肢が増加した場合スクロールできるようにしています。
`leading`でアイコン部分の選択、`title`で`ListTile `に表示するテキストを書いています。
`onTap`では今回は空欄ですが、タップ時の動きを追加することが可能です。

記事には書いていませんが、showModalBottomSheetはthenで書く方式とasync,awaitを使った方式とがあるようです。
<br>
<br>
お疲れ様でした。
ここまでご覧頂きありがとうございます。
gitメモ/credential-manager


#credential-manager: 認証情報を記憶したりパスワードを記録したりするサービス。
git: 'credential-manager' is not a git command. See 'git --help'.

# [直前のコミットを取り消す](https://qiita.com/shuntaro_tamura/items/06281261d893acf049ed)

```
git reset --soft HEAD^
```

--softオプション：ワークディレクトリの内容はそのままでコミットだけを取り消したい場合に使用。
--hardオプション：コミット取り消した上でワークディレクトリの内容も書き換えたい場合に使用。

<font color="DeepPink">うかつにhardをうつと作業がなくなってしまう。</font>


HEAD^：直前のコミットを意味する。

#
【AWS】S3にしまう時に暗号化する

#はじめに
「好きなAWSサービス：S3」って書いてあると通っぽい雰囲気がでるなあ と思っています。
なので、S3をより好きになれるよう、理解した「S3でできること」を少しずつアウトプットしていきます。

#S3のデータ保護
S3はストレージサービスなので、「格納するデータをどのように保護するか？」が重要です。
「サーバ側の暗号化」と「クライアント側の暗号化」の2つがあります。

##クライアント側の暗号化
いわばデータを送る前の暗号化。
詳細は触れない。

##サーバ側の暗号化
一言でいうと「S3にしまう時に暗号化する」という方法。
以下の方法がある。

###S3管理キーによるサーバ側暗号化（SSE-S3）
S3が管理するキーで暗号化する。

設定は「デフォルトの暗号化」の選択で「S3キー」を選ぶだけ。
あとは裏側でよしなにやってくれるというわけ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254141/919dd184-5bcc-127a-cb48-90ca8aae12b2.png)

「本当に大丈夫なん？」と思ったら以下の記事がおすすめです。
https://dev.classmethod.jp/articles/behavior-when-s3-cannot-be-decrypted/

###KMSのカスタマーマスターキー(CMK)によるサーバ側暗号化（SSE-KMS）
暗号化キー管理のサービス、KMSのCMKを使ってで暗号化します。
※CMKがどんなもんかは以下を参照。
https://www.slideshare.net/ssuser2c2bf2/encryption-with-raccon-dog-and-pear-242427386

S3キーでの暗号化とほとんど同じですが、以下のようなメリットがあります。
・CMK私用の個別アクセス許可を行える
・「CMKがいつ誰に使われたか」の証跡を残せる。

S3キーによる暗号化より選択肢が多いです。
各選択肢毎の違いは別記事で触れます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254141/73ba045d-5ccb-988b-2990-b60d8c045467.png)

###利用者の指定したキーによるサーバ側暗号化(SSE-C)
言葉通り。
基本はAWS側でマネージしてくれるS3キーかKMSのCMKで暗号化すればよいと思う。

#その他サーバ側の暗号化について覚えておくこと
・メタデータは暗号化されず、実データだけが暗号化される。
・同じオブジェクトに対し、異なる種類の暗号化は利用できない
・サーバ側の暗号化では、あくまで「しまう瞬間」の暗号化。
　S3に送信するまでの通信では、暗号化通信を利用するなどで別途ネットワークセキュリティを担保する必要がある。

#感想
S3キーで暗号化するのが簡単だが、想像しづらい。
AWSの操作感と利便性をより肌で感じるためには、KMS使いながら勉強するのがよいのではないかと感じた。

#参考
暗号化を使用したデータの保護
https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/dev/UsingEncryption.html

サーバー側の暗号化を使用したデータの保護
https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/dev/serv-side-encryption.html

AWS Key Management Service (SSE-KMS) に保存された CMK によるサーバー側の暗号化を使ったデータの保護
https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/dev/UsingKMSEncryption.html
pip installでProxyError

プロキシ環境下のLinux（WSL2 Ubuntu）で `pip install` したら `ProxyError` でうまく行かなかった話です。

# エラー内容

例えばこのような内容です。

```
$ pip3 install pylint
WARNING: Retrying (Retry(total=4, connect=None, read=None, redirect=None, status=None)) after connection broken by 'ProxyError('Cannot connect to proxy.', NewConnectionError('<urllib3.connection.VerifiedHTTPSConnection object at 0x7f3e787ff340>: Failed to establish a new connection: [Errno -5] No address associated with hostname'))': /simple/pylint/
WARNING: Retrying (Retry(total=3, connect=None, read=None, redirect=None, status=None)) after connection broken by 'ProxyError('Cannot connect to proxy.', NewConnectionError('<urllib3.connection.VerifiedHTTPSConnection object at 0x7f3e787ff0d0>: Failed to establish a new connection: [Errno -5] No address associated with hostname'))': /simple/pylint/
WARNING: Retrying (Retry(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'ProxyError('Cannot connect to proxy.', NewConnectionError('<urllib3.connection.VerifiedHTTPSConnection object at 0x7f3e78806460>: Failed to establish a new connection: [Errno -5] No address associated with hostname'))': /simple/pylint/
WARNING: Retrying (Retry(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'ProxyError('Cannot connect to proxy.', NewConnectionError('<urllib3.connection.VerifiedHTTPSConnection object at 0x7f3e788065e0>: Failed to establish a new connection: [Errno -5] No address associated with hostname'))': /simple/pylint/
WARNING: Retrying (Retry(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'ProxyError('Cannot connect to proxy.', NewConnectionError('<urllib3.connection.VerifiedHTTPSConnection object at 0x7f3e78806550>: Failed to establish a new connection: [Errno -5] No address associated with hostname'))': /simple/pylint/
ERROR: Could not find a version that satisfies the requirement pylint (from versions: none)
```

# 原因

環境変数を `https_proxy=https://<略>` にしているのが悪かったようです。

`https_proxy=http://<略>` にしたらうまく行きました。

# あとがき

`https_proxy` という名前からして `https://` で書くのだと思っていましたが、違うのですね。

なぜダメなのかは、すみません、知識がなく分かりません……　お分かりの方がいればコメントいただけると幸いです。
Reactのページ遷移でstateを渡す

Reactでページ遷移の際に一緒にstateを渡す方法をいつも忘れてしまうので、書き残します。

# stateを渡す側
### Link
`react-router-dom`のLinkを使う場合、

```link.ts
<Link to={{ pathname: '/path', state: {hoge: hoge} }}>
  <Button/>
</Link>
```

### history push
history.push()の場合、

```history.ts
onClick={() => { history.push('/path', {hoge: hoge}) }}
```

#もらう側

```to.ts
const location = useLocation();
const state = location.state;
```

以上、こんな感じでやりとりできます！
GitHub Actions 経由で GitHub の private repo から package を install する

GitHub actions上で、以下のように GitHub の private repo を install する必要がある場合の対処方法メモ。

```package.json
{
  "dependencies": {
    "privatePackage": "your/privatePackage"
  },
}

```

以下のように、`actions/checkout@v2` に private repo にアクセスできる GitHub Token を渡せば良い

```ci.yml
    steps:
      - uses: actions/checkout@v2
        with:
          token: ${{ secrets.PAT }}
```

`actions/checkout@v2` は、その action 以降で使う GitHub Token を固定するため、env 等で設定された GITHUB_TOKEN も上書きされてしまう。
A - Favorite Sound, B - Bitter Alchemy, A - Simple Math 2

2021年2月９日のくじかつ
精進内容！

##[A - Favorite Sound](https://atcoder.jp/contests/abc120/tasks/abc120_a)

O(1)

```python:python
A, B ,C = list(map(int, input().split()))
res = min(B // A, C)
print(res)
```

##[B - Bitter Alchemy](https://atcoder.jp/contests/abc095/tasks/abc095_b)

O(N)
貪欲法、まず最初にN種類のドーナツを作成できるか。
その後、最も少ない材料で作成できるドーナツを可能な数だけ作成する。

```python
N, X  = list(map(int, input().split()))

m = [0] * N
min_m = 1001
res = 0

for i in range(0, N):
    m[i] = int(input())
    min_m = min(min_m, m[i])
    
    if X - m[i] >= 0:
        X = X - m[i]
        res += 1

res += X // min_m
print(res)
```

上記でACが出ました。
これテストケースのミスっぽいですね。
一度ドーナツを昇順に並び替えてから何種類だけ作成できるか判定を行うのが正しいかと思います。

```python:python
N, X  = list(map(int, input().split()))

m = [0] * N
min_m = 1001
res = 0

for i in range(0, N):
    m[i] = int(input())
    min_m = min(min_m, m[i])

m.sort()

for i in range(0, N):    
    if X - m[i] >= 0:
        X = X - m[i]
        res += 1

res += X // min_m
print(res)
```

##[A - Simple Math 2](https://atcoder.jp/contests/arc111/tasks/arc111_a)
これはARC１１１で話題になった３００点の中で最高難易度の問題の一つですね。
復習してました。
記憶を頼りに、・・・

O(1)
10^NをM進数とした時、２桁目の数字を出力せよ。

```python:python
N, M  = list(map(int, input().split()))

NN = pow(10, N, M * M)
res = NN // M
res = res % M
print(res)
```

##感想
去年より確実にできるようになってますね。
しかし、茶色問題が全く分かりませんでした。
Railsで週間いいねランキングを作る！

未経験からエンジニアへの転職を目指しています。
初投稿ですのでわかりにくい箇所があるかもしれませんがご容赦ください。

本題です。　　
Railsでいいねのランキング機能を実装中に、週間いいねランキングも作りたいと思い実装しました。
※いいねランキングの実装は以下の記事を参考にしました
https://qiita.com/mitsumitsu1128/items/18fa5e49a27e727f00b4

今回は週間いいねランキング（前週の月曜〜前週の日曜）を表示する方法を書いていきます。
モデル名等は適宜ご自身のものに置き換えてください。

# 前提
- 料理（cooks）：いいね（likes）＝1：N
- いいね機能の実装は完了している

# モデルにメソッドを定義

```ruby:cook.rb
def self.last_week # メソッド名は何でも良いです
  Cook.joins(:likes).where(likes: { created_at:　0.days.ago.prev_week..0.days.ago.prev_week(:sunday)}).group(:id).order("count(*) desc")
end
```

順番に解説していきます。
※joinsメソッドについてわからない方は以下の記事が参考になります
https://pikawaka.com/rails/joins

Cook.joins(:likes)
でcooksテーブルとlikesテーブルを内部結合しています。
内部結合したテーブルから

where(likes: { created_at:0.days.ago.prev_week..0.days.ago.prev_week(:sunday)})

で先週の月曜日（0.days.ago.prev_week）から先週の日曜日（0.days.ago.prev_week(:sunday)）の間にいいねをされた料理を全て取り出しています。
取り出した料理に対し、

group(:id)

でidが被っている料理をグループ化し、

order("count(*) desc")

でいいねの数をカウントして、いいね数が多い順に並べています。
（countの引数に*を使用していますがあまり理解できていません・・・）

もし、取り出す料理数に制限をかけたい場合は、

limit(5)

を末尾につけるといいねの数が多い順で5個取り出すことが出来ます。（1位〜5位を表示する）

# コントローラーにモデルで定義したメソッドを記載

```ruby:cooks_controller.rb
def weekly_rank
  @ranks = Cook.last_week
end
```
コントローラの可読性を高めるためにモデルにメソッドを定義しましたが、コントローラーを以下のようにしても同様です。

```ruby:cooks_controller.rb
def weekly_rank
  @ranks = Cook.joins(:likes).where(likes: { created_at:　0.days.ago.prev_week..0.days.ago.prev_week(:sunday)}).group(:id).order("count(*) desc")
end
```

# ビューを記載
```ruby:weekly_rank.html.erb
<div class="rank-container">
  <% @ranks.each.with_index(1) do |cook, i| %>
  <div class="rank-box">
    <%= i %>位
    <div class="card shadow-lg">
      <%= link_to cook_path(cook) do %>
        <%= attachment_image_tag cook, :image, :fill, 200, 120, class:"card-img-top"; %>
      <% end %>
      <%= link_to user_path(cook.user) do %>
        <span class="account ml-2 mt-2">By <%= cook.user.account %></span>
      <% end %>
      <div class="card-body pt-1 pb-1">
        <p class="card-title mb-0">◆<%= cook.name.truncate(10) %></p>
        <p class="mb-1"><%= cook.comment.truncate(13) %></p>
        <div class="row border-top m-auto">
          <div class="col-6">
            <%= link_to user_path(cook.user) do %>
            <%= attachment_image_tag cook.user, :account_image, :fill, 50, 50, fallback: "no_image.jpg", class:" rounded-circle no-image"; %><br>
            <% end %>
          </div>
          <div class="col-5 offset-1 pt-3">
            <%= link_to "詳細", cook_path(cook), class: "btn btn-sm btn-dark" %>
          </div>
        </div>
      </div>
    </div>
  </div>
  <% end %>
</div>
```

# 最後に

最後まで読んで頂きありがとうございます！
今回は週間ランキングでしたが、whereの引数の期間を変えれば、月間ランキング等も作れると思います！

上記内容は一例ですのでもっとスマートな方法があれば教えてほしいです！
また、誤りがあればご指摘ください！
JAVAのメリット3選

#JAVAのメリット3選
この記事ではプログラミング言語「JAVA」のメリットについて３つお伝えしたいと思います。

##1つ目のメリット　どんなOSの上でも動かせる
JAVAには「**JVM（Java Virtual Machine：Java仮想マシン）**」というプログラムを実行するためのソフトウェアがあります。
JVMはプログラムをどんなOSでも実行可能な状態に変換してくれる便利な方です。

通常プログラミング言語はプラットフォームやOSごとにコンパイラが用意されていて動かせる環境に制限があるのですが。。。
なんと、JAVAならWindowsやMACなど環境に依存せず動かすことが可能になっています！
##2つ目のメリット　オブジェクト指向
Javaはオブジェクト指向言語なので下記のようなメリットがあります。

* クラスを分けたり、パッケージを分けたりなどプログラムの開発・管理を細かく分割して行うことができる
* 機能ごとのメンテナンスがしやすい

こんな感じです。大人数で開発する大規模開発に向いている言語ですね。
##3つ目のメリット　求人数が多い
JAVAは求人数が多いです！エンジニアの求人数の40％ぐらいがJAVAだったりします。（違ったらごめんね）
実際の数値はググって調べてみてください。
「Twitter」や「マインクラフト」もJAVAで作成されています。
どんなOSでも動かすことができ、APIが豊富であるなど、様々なサービスでJAVAが使用されてきたのでその分　
需要多いものと思われます。

###終わりに
今回はJAVAのメリット3選を紹介させていただきました。
これ以外も細かく見ればJAVAの奥深いところでいい点がいっぱいあるかと思います。
他にもこんないいことがあるとか、間違ってる点があったら教えて下さい！

ご覧いただきありがとうございました。
react-router-domでURLは変わっているのに画面遷移がされなかった時の解決法

現在Reactの学習を始め、ReactRouterを使ってルーティングを指定しましたが、思ったように動かなかったため、その時の解決法を記録として残しておきます。

## 概要
アプリケーションは基礎中の基礎であるTodolistです。

<img width="200" alt="ファイル名" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700117/f8352b90-30b9-3069-6b64-2d0d0e7495be.png">

送信ボタンをクリックするとリスト一覧に表示される（redux使用）→一覧をクリックすると詳細ページに遷移します。

##問題点
一覧をクリックすると、URLは変わるのに画面は変わらないという状況
その時のコードが以下のとおりです。（該当箇所のみを抜粋しています。）

```react:変更前

const App = () => (
  <BrowserRouter>
    <Switch>
      <Route path="/" component={ToDoList} />
      <Route path="/to_dos/:id" component={ToDoDetail} />
    </Switch>
  </BrowserRouter>
  );
```

##解決方法
####``exact``をRouteに指定する

exactは「正確な」という意味があり、 ドキュメントには以下のように書かれています。
>When true, will only match if the path matches the location.pathname exactly

[REACT ROUTERドキュメント](https://reactrouter.com/web/api/Route/exact-bool)


exactがtrueで、pathと、locationオブジェクトのpathnameプロパティの値が正確に一致する場合に指定したコンポーネントを返してくれるみたいです。

上記の、思うように動かなかったルーティング指定の場合、"/to_dos/:id"に　"/"が含まれるため、両者ともルーティング先と見なされるため思うような挙動をしてくれませんでした。


```react:変更後
<Route exact path="/" component={ToDoList} />
<Route path="/to_dos/:id" component={ToDoDetail} />
```
デフォルトでexactはfalseのため、明記することでtrueとして、正確なパスの場合のみ該当のコンポーネントを返してくれるようになります。

これで無事、詳細ページと遷移することができました！
Windows 10, 11 標準搭載のSSHクライアントの俺的ベストプラクティス

自分の環境再現手順メモ

Windows 10 標準搭載のSSHクライアントで鍵生成 + ssh-agent

[GitHubのドキュメント](https://docs.github.com/ja/github/authenticating-to-github/generating-a-new-ssh-key-and-adding-it-to-the-ssh-agent)とかはGit Bash使う手順が書いてあるが、正直トラブルの元なので素直にWindows標準のを使う。バージョンが古い？動くことが大事なんだよ。

# 前提

Windows 10 Pro 64bit 20H2, 21H1
Windows 11 Pro 64bit 21H2, 22H2

とりあえず最新にしていれば再現するんじゃね？最近セットアップした環境なら標準でOpenSSH クライアントが入っていた。

# 操作

## PowerShellを立ち上げる

Winキー → powershell → enter

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306456/b1e8cca2-7b72-6852-e1c0-e2ae4437f9d7.png)

ちゃんとこれ↑を立ち上げる。

## 鍵を生成する

```powershell
ssh-keygen -t ecdsa -b 521 -C "Comment"
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306456/35a0324e-89f7-5e23-5fce-08fd15a91be0.png)

コメントはわかりやすい文字列に変える。きちんとパスフレーズ(passphrase)をかける。

ここでどんな鍵アルゴリズムを使うかは人によって分かれるかもしれない。接続先にCentOS 6のOpenSSHがある人は Ed25519 アルゴリズムの鍵で認証を行うことができないはずである。一方、RSAの鍵はちょっと前の OpenSSH Agent でバグるという厄介な問題があった。今は治っているらしい？各々の環境で調整しましょう。

## 管理者権限のPowerShellを立ち上げる

```powershell
Start-Process -Verb runas powershell
```

UAC確認ダイアログが出るので、許可する。

## SSH Agentの自動起動と起動

```powershell
Get-Service ssh-agent | Set-Service -StartupType Automatic -PassThru | Start-Service -PassThru | Select-Object -Property Name, StartType, Status
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306456/c91d4f62-07d6-8ae1-0d2c-38c809f201d8.png)

どう書くかは趣味が分かれるがサクッと1行が楽だろう。
Runningなのが確認できたら exit で閉じて先の通常権限のPowerShellに戻る。

## SSH Agentに鍵を追加

```powershell
ssh-add .ssh\id_ecdsa
```

この手順通りならカレントディレクトリは %USERPROFILE% のはず。違ったら適宜調整。パスフレーズを聞かれるので、 ssh-keygen で入れたパスフレーズを答える。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306456/20e4a1ce-7231-0789-3429-54da265d60df.png)

# 追加 : Git for Windows向け

Windowsのssh-agent周りの事情は歴史的経緯でかなり複雑となっている( https://qiita.com/slotport/items/e1d5a5dbd3aa7c6a2a24 をご参考に)が、「最もWindowsらしいソースコード」( https://github.com/PowerShell/openssh-portable )で動いており、きちんとWindows Serviceとして組み込まれている Win32-OpenSSH を基礎に据えるのが妥当と思い構築している。

問題はMSYS2をベースにしているGit for Windowsの存在だが、単にGitのバックエンドとなるSSHの実装を環境変数で指示すればいいだけなので、以下のコマンドを実行すれば良い。

```powershell
[Environment]::SetEnvironmentVariable('GIT_SSH', 'C:\Windows\System32\OpenSSH\ssh.exe', 'User')
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306456/49c0a3ed-d014-ddd3-25c8-6a065d8ab2d5.png)

↓PowerShell立ち上げ直し

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306456/81f47702-f10f-b47c-54c3-4fe569e34ae3.png)

これで快適なSSHライフが送れます。
【JavaScript】指定の長さで0埋めした文字（数値）を返す

####トピックについて
* 数字（文字）の左側を0埋めするときに利用する。

####ソースコード・・・
@sdkei様のコメントからソースコードを修正しました(2021/2/12)

```javascript
  /**
   * numの値をlengthで指定された長さに調整する。足りない場合は左側を0で埋める。
   * @param {*}      num    : 0埋めする数字/文字
   * @param {number} length : 0埋めしたい文字列の長さ(EX:月/日/時/分/秒の場合は2)
   */
  fucntion zeroPadding(num, length){
    let str = num.toString();
    for(let i = str.length; i < length; i++){
      str = '0' + str;
    }
    return str;
  }
```

```javascript
  const zeroPadding = ((num, length) => {
    let str = num.toString();
    for(let i = str.length; i < length; i++){
      str = '0' + str;
    }
    return str;
  });
```

●当初のソースコード
  ~~/**
   * numの値をlengthで指定された長さに調整する。足りない場合は左側を0で埋める。
   * @param {*}      num    : 0埋めする数字/文字
   * @param {number} length : 0埋めしたい文字列の長さ(EX:月/日/時/分/秒の場合は2)
   */
  fucntion zeroPadding(num, length){
    let zeroStr = '';
    for(let i = 0; i < length; i++){
      zeroStr += '0';
    }
    return (zeroStr + num).slice(-length);
  }~~

  ~~const zeroPadding = ((num, length) => {
    let zeroStr = '';
    for(let i = 0; i < length; i++){
      zeroStr += '0';
    }
    return (zeroStr + num).slice(-length);
  });~~

####メモ
●　IEでは利用できないが、`String(num).padStart(文字列の長さ,"0")`[^1]とすることでも指定文字埋めが可能。
　 ↑の関数をkintoneの全体jsの名前空間に書いて利用していた。
　 IE使っているわけじゃないから、こっちの方が簡潔で良い気がしてきた。
　 仮にIEで実装しなければいけない場合は↑を使うことにする。
●　`padStart`のお友達`padEnd`右側を指定文字埋めすることができる。


[^1]: ES2017以降で利用可能
【Unity】Scene／GameObject／Component とは何か 

# 初めに

人に説明する場合、どうすればいいのか考えたときに、うまく言葉が出てこなかったので、自分なりに整理したものです。
公式ドキュメント見れば分かる！という方は、こちら

- https://docs.unity3d.com/ja/2019.4/Manual/CreatingScenes.html
- https://docs.unity3d.com/ja/2019.4/Manual/GameObjects.html
- https://docs.unity3d.com/ja/2018.4/Manual/UsingComponents.html

# 一言で言うと…

Scene：空間、世界
GameObject：物
Component：振る舞い

# Scene

空間や世界です。
Scene は、物を配置して構成します。（物 = GameObject）
言い換えると、 Scene には複数の GameObject が配置されることで構成されているということです。

卓球で例えると、試合会場です。

# GameObject
「Scene中にある物」です。
GameObject 自身に何かする機能はありません。
キャラクターや環境、特殊な効果として働かせるためには、 Component を追加（アタッチ）する必要があります。

卓球で例えると、卓球台やラケット、ボール、照明に電子掲示板、フェンスなど全て GameObject といえます。

# Component
GameObject の振る舞い。
「画面中に物体として移す」ということは Component によって定義されます。
基本的な振る舞いは Unity が提供されています。　例）物体の形、色、重さ、音が出るなど
C# スクリプトを追加することで、独自の振る舞いを提供することもできます。

GameObject に light Component をアタッチすれば、光を放つ GameObject になります。
Mesh Filter と Mesh Renderer, Box Collider をアタッチすれば、箱型の GameObject になります。

卓球のラケットで例えると、ラケットの形、色、ボールが当たったときの反発などは Component が担当しています。

#終わりに

まとめようと思ったら、めちゃくちゃ短くなりました。
もっとより良い文章が書けたら、追記します。
MaterialDatePickerで未来日を選択できないようにする


## やりたい事
MaterialDatePickerで日付を選択するとき、デフォルトでは過去/未来含めて全ての日付が選択できる。

ここで、「未来日は選択させたくない」という要件が出てきたとき、選択日に制限を加える必要がある。

## 解決方法

`DateValidator`で制限を作成して、MaterialDatePickerの`CalendarConstraints`にセットする。

```kotlin
        MaterialDatePicker.Builder.datePicker().apply {
            // 未来を選択させない制限
            val dateValidatorMax = DateValidatorPointBackward.before(Date().time)

            // 開始日を制限したいなら DateValidatorPointForward を使う
            // val dateValidatorMin = DateValidatorPointForward.from(指定日)

            // 制限Listを作成
            val validators: List<DateValidator> = listOf(dateValidatorMax)
            val dateValidator: DateValidator = CompositeDateValidator.allOf(validators)
            // CalendarConstraintsを作成
            val constraints: CalendarConstraints = CalendarConstraints.Builder()
                .setValidator(dateValidator) // 制限をセット
                .build()
            setCalendarConstraints(constraints)

        }.build().apply {
            // OKクリック
            addOnPositiveButtonClickListener { datetime ->
                val date: String = SimpleDateFormat("yyyy/MM/dd", Locale.JAPAN).format(datetime)
                Log.d(TAG,date)
            }
        }.show(childFragmentManager, "MaterialDatePicker")
```

## 修正後スクショ
○がついた日付より後はグレーになり、選択無効になっている。
<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52227/8a8e0bbd-84a1-ce89-3628-d25ae8d17624.png  width=40%>


## 環境

```
implementation 'com.google.android.material:material:1.3.0-rc01'
```

## 感想

公式にあまり情報がなくて、StackOverFlowに助けられた。
もっとMaterial Design Componentsを使ってほしいなら、公式ドキュメント＆サンプルを充実させてほしい。

## 参考リンク

[CalendarConstraints.Builder  |  Android Developers](https://developer.android.com/reference/com/google/android/material/datepicker/CalendarConstraints.Builder#setValidator(com.google.android.material.datepicker.CalendarConstraints.DateValidator))
[Swift] enumerated() には注意が必要

# はじめに

Swift では繰り返しの処理を行う際、よく for-in 文を使います。
for-in 文はコレクションなどに含まれる要素を1つずつ取り出し処理するのに便利です。
そこで、**enumerated()** を使うと思うのですが問題点があるため解説していこうと思います。

# 解説

配列を生成し、**enumerated()** を用いて配列から要素を取得して見たいと思います。

```example01.swift
let array = ["A", "B", "C", "D", "E"]

for (i, value) in array.enumerated() {
    print(i, array[i])
}

// 結果
//0 A
//1 B
//2 C
//3 D
//4 E
```

このように一見問題なく処理できたように思えます。
どこか駄目なのかというと、**i** です。この **i** は配列の要素番号ではなく、0を始めとしたカウンターになっています。
以下のように公式のドキュメントでも説明されています。

> the integer part of each pair is a counter for the enumeration, not necessarily the index of the paired value

次に ArraySlice を行い array 配列から array2 部分配列を取得し、再度 enumerated() を使ってみました。

``` example02.swift
let array = ["A","B","C","D","E"]
let array2 = array.dropFirst()

for (i, value) in array2.enumerated() {
    print(i, array2[i])
}

// 解説
// 0 A  <- アクセスできないためエラー

// 部分配列の中身 (array2)
// array2 = ["B", "C", "D", "E"]
```

実行してみると **Index out of bounds** というエラーが返されました。
これは **dropFirst()** を使い **array 配列** の先頭を切り取ったため起こったものです。
**enumerated()** の **i** は0始まりの数値を返すため、**array2 配列** には **array2[0] = A** が存在しないためアクセスできず、エラーとなるわけです。


公式ドキュメントでは **zip(_:_:)** を使うことが推奨されています。

* ↓ サンプルコード

```example.swift
let array = ["A","B","C","D","E"]
let array2 = array.dropFirst()

for (i, value) in zip(array2.indices, array2) {
    print(i, array2[i])
}

// 結果
//1 B
//2 C
//3 D
//4 E
```

問題なく配列から要素と要素番号を取得することができました。

# さいごに

今回、一定の条件で配列から要素と要素番号を取り出す方法が必要になったためこのような方法を知る良い機会になりました。
他にも配列を使う機会は多々あると思うので、改めていい勉強になったと思います。

ここまで見ていただきありがとうございます、皆様の学びの助けになれば幸いです。

# 参考文献
* [enumerated() | Apple Developer Documentation](https://developer.apple.com/documentation/swift/array/1687832-enumerated)
* [zip(_:_:) | Apple Developer Documentation](https://developer.apple.com/documentation/swift/1541125-zip)
* [indices | Apple Developer Documentation](https://developer.apple.com/documentation/swift/array/indices)
「序数 X がダイナミックライブラリから見つかりませんでした」というエラーの原因

#前提環境
###Aというライブラリがある
A.h：A1という関数を宣言
A.cpp：A1という関数を定義
A.def：A1という関数を「@1」として指定して公開：**ここは「序数」の番号**
A.lib：コンパイル後作成
A.dll：コンパイル後作成

###BというアプリケーションがライブラリAを使っている
BがA.hを見ている
BがA1という関数を使っている
BがA.libを使用している（関数A1を使用するためにコンパイルする時に使用）
BがA.dllを使用している（関数A1を使用するために実行する時に使用）：**※ここは重要**

#開発の流れ
①Aを製造・修正
②Aをコンパイル
③Bを製造・修正
④Bをコンパイル
⑤A.dllをBの実行フォルダにコピー：**※ここは重要**
⑥Bを実行して確認

#エラーが発生する経緯
AのA.defで関数A1を「@1」として指定しているため、関数A1と「@1」の対応関係がA.libに反映されている。
BでA1関数を使う時に、A.libを参照しA.libに定義されている対応関係によって、A.dllから「@1」を探す。
すべてのソース・ライブラリ・モジュールは同じバージョンであれば「@1」は確認できるので問題ない。

しかし、上記流れの⑤は漏れたら、この記事のエラーが発生する。

例えば、ライブラリAにA2という関数を追加し、BでA2も使用される。
A.h：A2という関数の宣言を追加
A.cpp：A2という関数の定義を追加
A.def：A2という関数を「@2」として指定：**最後にエラーになる番号**
A.lib：コンパイル後「@1」と「@2」の2個の対応関係がある
A.dll：コンパイル後A1とA2両方の関数が使える

Bをコンパイルする際、A.hとA.libが参照され、A2という関数が存在することを確認でき、Bをコンパイルしてもエラーにならない。
（コンパイル時、A.hとA.libしか使用しないため、A.hとA.libが正しく参照できる限りBのコンパイルエラーが発生しない）

この後、Aの新しいdllをBの実行フォルダに**コピーせずにBを実行**すると、Bの実行時エラーが発生する。

原因としては、
①BがライブラリAのA.libからA2という関数が存在することを知っている。
②このため、BがA2を使おうとしている際、A.libの対応関係によってA.dllから「@2」を探す。
③しかし、Bが見えるA.dllは、「@2」がまだ実装されていない**古いA.dll**であるため、「序数2が見つかりませんでした」というエラーが発生する。

**即ち、Bが使用しているA.libのバージョンは、Bが見えるA.dllのバージョンと違う。**

解決方法も簡単で、上記開発の流れ⑤を漏れなく再実行すること。
※Aを更新するたびにBの実行フォルダにコピーする必要がある。
　Aのプロジェクトにコピー用のコマンドを指定してもよいし、AとBのモジュールを同じフォルダに作成してもよい。
m1 macへのhomebrewインストール「以前」

arm64とx86_64の両方のhomebrewを導入するには、事前に以下のふたつをインストールしておく必要がある（順不同）。

+ Rosetta 2
+ command-line-tools

# Rosetta 2

```
sudo softwareupdate --install-rosetta
```
何故かコマンドラインでの方法がなかなか見付からなかった。


# command-line-tools

以下からcommand-line-toolsだけのパッケージをダウンロード（430 MiB程度）してインストールする。

+ [More Downloads for Apple Developers](https://developer.apple.com/download/more/?=command%20line%20tools)

もちろんXcode全体をインストールしてもいいけど、物凄く容量が大きい（ダウンロードだけで11 GiB超え）のでお勧めしない。どのみちhomebrew使うような人ならビルドは全部CUIでやるからXcodeは不要でしょう（偏見）。

# それから
これ以降は[公式](https://brew.sh/)とか「[みんなの M1 Mac における Homebrew のベストプラクティスは間違っている](https://zenn.dev/ress/articles/069baf1c305523dfca3d)」とかを参照。
【Python】ブックやシートのセルを保護する

pythonを使用してExcelファイルの操作を勉強しています。
本日の気づき(復習)は、ブックやシートのセルの保護に関してです。
pythonでExcelを操作するため、openpyxlというパッケージを使用しています。

# ブックを保護する

WorkbookProtectionオブジェクトをWorkbook.securiti属性に代入することで
ブックを保護する事が出来ます。
また、パスワードが必須なのでこちらも一緒に設定します。

```python:protect_book.py
from openpyxl import load_workbook
from openpyxl.workbook.protection import WorkbookProtection

wb = load_workbook('資料.xlsx')

# ブックを保護
wb.security = WorkbookProtection(
    workbookPassword='test', lockStructure=True
)

wb.save('資料_保護済.xlsx')
```
これでブック「資料」を保護する事が出来ました。

# シートのセルを保護する
Protection.enableメソッドを使うとシートを保護する事が出来ます。
パスワードは任意なのですが、変えられても困るので設定しちゃいます。

```python
ws.protection.password = '任意のパスワード'
ws.protection.enable()
```

ただ、これだけだとすべてのセルが変更できないので
セルのprotection属性に保護を表すProtectionオブジェクトを代入します。

```python
cell.protection = Protection(locked=False)
```

こちらを使って任意のセルだけ入力可能な日報を作ります。

```python:protect_sheet.py
from openpyxl import load_workbook
from openpyxl.styles import Protection

wb = load_workbook('日報.xlsx')
ws = wb['原紙']

# セルB3～G22に処理を行う
for rows in ws['B3:G22']:
    for cell in rows:
        # セル入力が出来るようにする
        cell.protection = Protection(locked=False)

# シートの保護を解除する際のパスワードを設定
ws.protection.password = 'test'
# シートを保護
ws.protection.enable()

wb.save('日報_保護済.xlsx')
```

今回のように解りやすい保護設定範囲ではなく
シートの内容によっては保護する部分が点在していたりすることもあるので
一度決めてしまえばミスなく設定し続けられるのは便利だなと思います。

### 余談：複数のセルを取得する方法
多数のセルに対して同じ処理を行う場合は結構あるので
ws['B3:G22']のような記述方法以外にも、何かないか調べてみました。

- ws['列名']：指定した列のセルを取得。ws['A']だったらA列のセル全部
- ws['列名:列名']：指定した列範囲のセルを取得。ws['A:D']だったらA～D列のセル全部
- ws['行番号']：指定した行のセルを取得。ws['1']だったら1行目のセル全部
- ws['行番号:行番号']：指定した行範囲のセルを取得。ws['1:5']だったら1～5行のセル全部
- ws['セル番地:セル番地']：指定したセル番地の範囲のセルを取得。ws['A5:D10']だったらA5～D10のセル

たぶん、ws['セル番地:セル番地']がメインだと思うのですが念のため。
私はよく計算式の入っているセルを上書きしたことに気が付かず後でワタワタするのですが
対策のために保護をかけようと思うと意外に重労働で諦めていました。
これからは、もう少し楽をしよう・・・。
C# で winmm.dll を叩いてMIDIデバイス名一覧を取得する

# まえがき
コードとは関係ない話ですが、最近VRCがアップデートされてMIDIデバイスを選べるようになりました。
https://docs.vrchat.com/docs/vrchat-202111#midi-system
そのときに渡すMIDIデバイス名をなんとなくC#から取得したかったので書きました。

# しくみ
Win32API に入ってる winmm.dll の　midiInGetDevCaps　を DllImport で C# に持ってきて叩いてるだけです。
https://docs.microsoft.com/en-us/windows/win32/api/mmeapi/nf-mmeapi-midiingetdevcaps
もとが C++ なので、Midiデバイス名を格納する struct とかをドキュメントに合わせて用意しています。

# コード
`GetMidiDeviceNames.cs`

```csharp
using System;
using System.Runtime.InteropServices;

class GetMidiDeviceNames
{
	[StructLayout(LayoutKind.Sequential)]
	public struct MidiInCaps
	{
		public ushort wMid;
		public ushort wPid;
		public uint vDriverVersion;
		[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)]
		public string szPname;
		public uint dwSupport;
	}
	[DllImport("winmm.dll")]
	extern static uint midiInGetNumDevs();
	[DllImport("winmm.dll")]
	extern static uint midiInGetDevCaps(uint uDevID, out MidiInCaps pmic, int cbmic);

	static void Main()
	{
		uint midiInNumDevs = midiInGetNumDevs();
		Console.WriteLine("midi # of devs: {0}", midiInNumDevs);
		for (uint i = 0; i < midiInNumDevs; i++)
		{
			MidiInCaps midiInCaps = new MidiInCaps();
			midiInGetDevCaps(i, out midiInCaps, Marshal.SizeOf(typeof(MidiInCaps)));
			Console.WriteLine("#{0}: {1}", i, midiInCaps.szPname);
		}
	}
}

```

# コンパイルして実行
```
$ C:\Windows\Microsoft.NET\Framework64\v4.0.30319\csc.exe GetMidiDeviceNames.cs
$ GetMidiDeviceNames.exe
midi # of devs: 2
#0: Steinberg UR44C-1
#1: Impact GX61
```

# あとがき
素のWin10でもC#のコンパイラ(csc.exe)が入ってるんですね～！おどろき。パス通ってないけど。

今回は練習もかねて自分で書いたんですが、検索したら案の定いい感じのラッパーを書いてくれてる人がいたので、普通にこれ使えばいいと思います。
https://github.com/colgreen/Redzen.Midi
Linux性能分析

# Linux性能分析

## まずはじめに
アーキテクチャを理解する

- CPU、メモリ、ディスク、ネットワーク、マザーボード・・・
- どこがボトルネックになっているか

## CPU
- top コマンド
- sar コマンド


## メモリ

## ディスク

## ネットワーク

# CPU負荷をみてみる

- テストプログラム

```c

--- cpu.c ---
int main()
{
        while(1);
}
```

- コンパイル
- 
```
# cc -o cpu cpu.c
# ls 
cpu cpu.c
※「cpu」が実行プログラム
```


- 実行
- 
```
# ./cpu
```

- CPU負荷状況の確認

```
# top
～～～
top - 21:42:42 up 23:56,  3 users,  load average: 0.34, 0.09, 0.07
Tasks: 169 total,   2 running, 167 sleeping,   0 stopped,   0 zombie
%Cpu0  :  0.0 us,  0.0 sy,  0.0 ni,100.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
%Cpu1  :  0.0 us,  0.0 sy,  0.0 ni,100.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
%Cpu2  :  0.0 us,  0.0 sy,  0.0 ni,100.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
%Cpu3  :★100.0 us,  0.0 sy,  0.0 ni,  0.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem : 16222052 total,  5879608 free,  1028452 used,  9313992 buff/cache
KiB Swap:  4063228 total,  4063228 free,        0 used. 14847876 avail Mem

  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
13588 root      20   0    4212    348    276 R 100.0  0.0   0:24.78 cpu★
13512 root      20   0   58420   2220   1524 R   0.3  0.0   0:00.91 top
    1 root      20   0  193928   7040   4180 S   0.0  0.0   0:04.45 systemd
    2 root      20   0       0      0      0 S   0.0  0.0   0:00.02 kthreadd
    4 root       0 -20       0      0      0 S   0.0  0.0   0:00.00 kworker/0:0H
    6 root      20   0       0      0      0 S   0.0  0.0   0:00.44 ksoftirqd/0
    7 root      rt   0       0      0      0 S   0.0  0.0   0:00.17 migration/0
```

「cpu」プロセスが %CPU 100%利用して実行されています。
%CPUが100%とは１CPU(１論理CPU)のCPU使用率が100%で動いています。
ステータスはどういう状態でしょうか？
「S」の項目がプロセスの状態を示しています。
「R」なので「RUN」状態ですね。

- CPU上でプロセスが実行されているイメージ

![CPU利用イメージ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/731158/819a000f-5b5d-fb8f-16d0-5f57abf7b0c1.png)
ど文系ど素人のITIL Foundation合格体験記

※2012年時点での記録です。ITILは現在はV4が最新となっているので、ご参考までに。

「ITIL（Information Technology Infrastructure Library）」という、ITサービスマネジメントのフレームワークのデファクトスタンダードについての知識を身に着けているかどうかの資格試験があります。
IT企業では、営業職などで持っていると頼りになるということで、ここ最近、人気急上昇の資格らしいです。

そのITILの入門の資格である「ITIL V3 Foundation（ファウンデーション）」を受験する羽目になり、独学でもなんとか２週間で合格できたので、その体験記を後進のために記しておきます。

ちなみに、私は大学では民俗学や文化人類学を学び、就職してからはメーカーで原価管理、管理会計をずっとやっていた、ITど素人です。
ひょんなことから、転職先でシステムの運用管理に携わることになり、そのプロジェクトにアサインされる前に、上司からIT運用のデファクトスタンダードであるITILを勉強して、ついでにファウンデーションの資格も取っておけということで自腹で２万円かけて取ってきました。
まあ、会社の金で受験してたら、本気になれずに受からなかったかもしれませんけどね。

上司に受けろと言われたのが、3月14日。そして、今月中に受験しろと言われたので、試験日はぎりぎりの3月31日に設定。
最初、ITILがどんな資格かも分からなかったので、そこから調べて、勉強期間はゼロから始めて実質ちょうど2週間。
なお、ITILの試験はプロメトリック（PROMETRIC）から受験できて、EXIN（オランダ）とISEB（イギリス）の主催の試験を選べますが、日本語で受験できるのがEXINのみなので、ほとんどの人はEXINで受けるでしょう。

で、独学でITILの勉強を始めたのですが、どうやらITILにはV2とV3があるようです。（「V」は「ヴァージョン」らしいです）
今はもうV3がメインになっているので、私もV3を受験しました。
が、テキストはまだV2のものも多く出回っており、アマゾンなどで購入するときは要注意です。

私は、テキストは『ITIL V3実践の鉄則』（久納信之、技術評論社）を使用しましたが、この本はV3に特化しており、V2と範囲がかぶっている箇所は、さらっとしか説明していないよう。（アマゾンのレビューより）
そこで、その本の前バージョンである『強い会社はこうして作られる! ITIL実践の鉄則』（久納信之、技術評論社）も購入し、まずはITIL V2から勉強を始めました。
なお、それぞれの本の説明は、「ビジネスの基礎知識としてのITIL」と「ITIL実践の書（資格試験にも可）」を参照してください。

実際に勉強したスケジュールとしては、V2が5日、V3が6日、問題練習が3日くらいで時間配分しました。

問題演習は、演習用の問題集をわざわざ買うのはもったいないし、そもそもV2用の問題集はあっても、V3用の問題集はまだほとんど出ていないようなので、ネットで無料公開されている問題を主に解いていました。
参考になったサイトは、

「無料deITIL V3 Foundation模擬試験」・・・完全無料で、問題数も多く、解説も載っているので、最もお世話になりました。

「ITILファンデーション 模擬試験問題集＆解説 p1 （サービスサポート領域1）」・・・問題数は少ないですが、情報処理試験で出題されたITIL関係の問題も載っており、勉強になりました。ただ、範囲がV2からの出題が多いかもしれません。

「EX0-101J ITILv3（Foundation）模擬問題集」・・・正規版は2,500円しますが、無料公開の問題が数題あります。解説が手厚いです。

「ITIL V3ファンデーション模擬試験」・・・本番さながらの問題ですが、解説がまったくありません。最後の最後に、自信をつけるためにトライしてみてもいいかもしれません。

また、問題ではありませんが、
「ITIL V3リスト（単語帳ドットコム）」・・・ITIL V3で出てくる重要単語が網羅されています。テキストで概要を理解した後、単語を暗記することが必要であれば、使えます。

という感じで2週間勉強し、本番の試験では77%の得点率（65%以上で合格）で、何とか合格することができました。

試験の所感としては、単語を暗記していなくても（ある程度は必要ですが）、語の概念や意味、人の役割や流れ（サイクル）を理解していれば、65%は取れそうな感じでした。ただ、ひっかけのような問題もあったので、満点は難しいかもしれません。

一般的なITの用語とは違う概念で語を用いてるものがあるらしいので、ITについて詳しい方は、逆に混乱するかもしれません。（と、ITに詳しい人が言っていました）
ど文系でゼロから勉強する人は、逆にビギナーズラックがあるかもしれません。

詳しいITのプログラムや機器の話もないので、IT素人の人は、情報処理試験などから始めるより、ITILから始めたほうがとっつきやすいかもしれませんね。
あくまで、ITパスポートすら持っていないのにITILを取得してしまった、ど文系の私の個人的な感想ですが。

ということで、これから需要が高まりそうである資格試験のITIL V3 Foundationについての合格体験記でした。
ど文系ど素人の基本情報技術者試験合格体験記

※2012年時点の記録です。最新の制度では、基本情報技術者試験はCBT方式で受験できたりと変更されているので、IPAの情報を参照されることを推奨します。

ど文系のど素人ですが、仕事上の関係でやむを得ず情報処理情報技術者試験を受験することになったので、2012年10月21日（日）の基本情報技術者試験を受験してきました。
11月19日に合否が発表されましたが、結果、合格でした。

ちなみに点数は、午前：68.75点、午後：71点でした。（午前、午後ともに60点以上で合格）

文系が故、「ストラテジ系」「マネジメント系」は8割以上の得点率のものの、「テクノロジ系」はぎりぎり6割でした・・・。

午後問題の選択問題は、問2（データベース）、問4（情報セキュリティ）、問5（ソフトウェア設計）、問6（ITサービスマネジメント）、問7（経営戦略・企業と法務）、問13（表計算）を選択しました。
問4、問7は満点でしたが、あとは5割～7割の出来でした。

詳しい勉強法は「ど文系ど素人の基本情報技術者試験（平成24年度秋期）受験日記」にも記載しましたが、過去問をひたすら解くことが重要です。

テキストは『キタミ式イラストIT塾 「基本情報技術者」 平成24年度』、過去問集は、『平成24年度【春期】 基本情報技術者 パーフェクトラーニング過去問題集 (情報処理技術者試験)』を使用しました。

勉強期間としては、だらだらと半年くらいです。
受験を決めたのが5月くらい。それからテキストを購入して、しばらく勉強しなかったり、忘れたころに勉強したりして、本腰を入れて勉強しだしたのが9月の終わりくらいでした。

最初は慣れない言葉に戸惑うと思いますが、基本的な考え方はコツを掴めれば難しいところはありません。
あとは、ひたすら意味不明な単語を暗記するだけです。

午後試験は少し難しいですが、表計算はExcelと同じ考え方なので、Excelをビジネスで使っている人であれば問題ないかと思います。
あとは、分からなくても何か書いておけば、△がもらえたりするみたいなので、予測して何でもいいから書いてみるのがコツかもしれません。（自分も結構、まぐれ当たりが多かった気がします。）

情報処理試験の基本情報技術者試験は、ど文系ど素人が独学でゼロから勉強しても、合格することは可能です。

私は大学の時は民俗学や文化人類学を学んでいた根っからのど文系であり、プログラミングどころか情報系の勉強は全くしたことがありません。
ちなみに大学受験も私学文系の定番で、国語・英語・日本史しかやっていなかったので、数学もさっぱりです。

社会人になってからは、管理会計部署に配属されたので数字には強くなりましたが、システム系はさっぱりでした。
それが、昨年コンサルタントに転職して、今年の4月にシステムの運用管理支援プロジェクトにアサインされたため、やむなく情報処理の勉強を始めました。
プロジェクトにアサインされる直前にシステム運用の勉強はして、ITIL V3 Foundationは取得していたのですが、その時点ではITパスポートの内容ですら怪しい部分が多々ありました。
特にプログラムや開発など技術的なことに関しては、基本情報技術者に合格した今ですらさっぱりです。
そんな私ですら、合格することができました。


受かったところで、使えるのか使えないのか分からない資格ですが、これからの時代は、ないよりはましだと思いますので、みなさんのご検討をお祈り申し上げています。
みなさんも、がんばってください。
ど文系ど素人の応用情報技術者試験合格体験記

ど文系のど素人ですが、平成24年秋に基本情報技術者試験を受験し合格できたので、引き続き応用情報技術者試験にも独学で挑戦し、平成26年度の春期試験で午前：67. 5点、午後：62.0点を取り、ぎりぎり合格することができました。

※2014年当時の記録なので、今は制度が少し変わっている部分もあります。IPAの最新の情報を参照されることを推奨します。

ストラテジ系は9割の得点率のものの、テクノロジ系は6割を下回っており、本当にぎりぎり・・・。
ちなみに、午後問題は、問1　情報セキュリティ、問2　経営戦略、問8　情報システム開発、問9　プロジェクトマネジメント、問10　サービスマネジメント、問11　システム監査を解答しました。（今回からセキュリティが必須になりましたが、どちらにしても選択するつもりでした）

ちなみに、私は大学では民俗学を学んでいたど文系で、2年ほど前にITコンサルへ転職したものの、前職はまったくの異業種だったため、知識・実務ゼロのど素人のところからのスタートでした。
現在はITコンサルとしてプロジェクト管理やIT戦略の立案、システム監査支援等には携わっていますが、プログラミングやコーディングの経験は皆無です。

本当は平成25年秋に受験しようと思っていたのですが、再度の転職活動やプライベートで忙しく、結局、試験の半年前の平成25年秋くらいからだらだら勉強を開始して、試験2週間前くらいに過去問集を購入し直前の時間を過去問対策に充てました。

情報処理試験の午前問題は、過去問がけっこうそのまま出ます。

特に基本情報処理試験ではその傾向が顕著で、応用情報処理試験では、過去問がそのまま出されるケースは少なかったように思いますが、感覚的には3分の1以上は、過去問に近い問題（問題文や選択肢など）が出題されたのではないかと思います。

応用情報処理試験は6割以上の得点で合格なので、出題の3分の1以上に当たる過去問をカバーしておけば、実力は3割も要りません。
逆に、満点を目指す必要もないので、過去問に出てこないような知識は切り捨ててもいいかもしれません。
過去問をやっておくか、おかないかでは大きく差が付くと思います。

午後問題は、国語の文章問題のようなものなので、午前問題を解けるくらいの知識を身につけておいて（問題文を日本語として読めるようにしておいて）、過去問を見て傾向をつかめば、対策は万全と思います。

ちなみに、私は今回、午後問題の対策をほとんどしていなくて、過去問を一読したくらいでしたが、ぎりぎり合格することができました。
公開されている解答例を見て自己採点したところ、自分では不合格と思っていたのですが、ふたを開けてみると合格でした。
文章問題の採点はけっこう甘いようです・・・。

今回、使用したテキスト・問題集のレビューを以下へ簡単に記載しておきます。

■ニュースペックテキスト 応用情報技術者 平成25・26年 (情報処理技術者試験)
TAC情報処理講座、TAC出版
星：☆☆☆☆
レビュー：アマゾンで無料でもらった本だったんですが、結局、一番活用しました。
カラーなのでビジュアル的に頭に入りやすく、練習問題も付いていてちょうど良かったです。

■かんたん合格 応用情報技術者過去問題集
五十嵐聡、インプレスジャパン
星：☆☆☆☆
レビュー：情報処理試験は過去問が命なので、試験2週間前くらいに購入して、ひたすら過去門対策しました。
本書は文字が大きく見やすく、使いやすかったです。

■徹底攻略ポケット 応用情報技術者試験 午前対策
五十嵐聡、インプレスジャパン
星：☆☆☆
レビュー：電車の移動時間等で勉強するために、ポケットサイズの問題集を購入しました。
残念なのが、2010年に刊行されているため、それ以降の最新の問題が反映されていないこと。
今どきだと、わざわざ問題集を購入しなくても、スマホのアプリやメモでも対応できるかも。

■応用情報技術者 合格教本
大滝みや子、岡嶋裕史、技術評論社
星：☆
レビュー：過去門の入ったCD-ROMを目当てで購入しましたが、PCの画面サイズが合わない？ために、ボタンが画面外に表示されてしまい、まったく使えず・・・。
Windows７でダメで、他のパソコンでも試しましたが、やはりボタンが押せず使用できず・・・。
結局、本書はまったく使用することなく試験に合格することができました。

ど文系ど素人の私でも、合格することができました。

みなさんも、がんばってください。
Ruby on Railsの理念を具体例を用いて解説

# CoC ~Convention Over Configuration~

>今回も以前紹介した[Ruby on Railsの理念](https://qiita.com/iamu_TECH_CAMP/items/0d0c9686a651b009f7a1#%E3%83%95%E3%83%AC%E3%83%BC%E3%83%A0%E3%83%AF%E3%83%BC%E3%82%AF%E3%81%AE%E3%83%AB%E3%83%BC%E3%83%AB%E3%81%AB%E6%B2%BF%E3%81%A3%E3%81%9F%E5%AE%9F%E8%A3%85%E3%82%92%E8%A1%8C%E3%81%86%E7%82%BA%E3%81%AB)に関する内容を深ぼっていきます。

**CoC**とは実際にどの様な場面で用いられているのか...

>[Convention Over Configurationの略]
「設定よりも規約を優先する」

ここでいう`規約`とは、
`Railsがあらかじめ決めているルール`のことを指します。
ゼロから`自身で設定するのではなく`「設定よりも規約を優先」して作業するという捉え方で問題ないようだ。


## 具体例

Ruby on Railsを使って開発を進めてきて

>「コマンドだけで`Railsが自動で`ファイルなどを生成してくれた」
「`Railsが勝手に`処理を用意してくれていた」

なんていう経験をしてきたと思います。
まさにソレが`「設定よりも規約を優先」して作業する`ということ

---
```:ターミナル
rails g model item
```
`item.rb`ファイルが自動で生成される

---

```rb:items_controller.rb
def index
    @items = Items.all.order(id: 'DESC')
end
# コントローラーにindexというアクションを定義する
```
`index.html.erb`がレスポンスとして返却される処理が用意される

---

## CoCを意識するメリット

- すでに定義されている処理を利用するだけ
- 開発スピードが上がり質も担保できる
- 規約は開発者同士の共通認識であるため可読性が向上する



### CoCを無視したらどうなるの？

```rb:CoCを無視
class TestsController < ApplicationController
 def render_top_page
  render template: "tests/index"
 end
end
```
>アクションではなく、render_top_pageという自作のアクションを使用。
これにより、レスポンスであるビューファイルは自動で設定されないため、
renderメソッドを使用してレスポンスを指定。~~あぁダルい~~

---

```rb:CoCを意識
class TestsController < ApplicationController
 def index
 end
end
```

>index.html.erbというトップページのビューファイルを返却する場合、
規約にしたがってアクション名とビューファイル名を揃える
(レスポンスを自動で設定してくれる・レスポンスの指定をする必要がない。)
最小限のコードで実装が可能。~~ほんっと便利~~
初学者向け！ネットワーク構築での経路集約について

#前提

インフラエンジニアとして勉強を進めているかたや、ネットワーク構築に関して調べているかたで、
おそらく初学者向けです。（私がそうなので。。）

勉強するにあたりアウトプットとして書きますので、
参考になれば幸いです。

前提知識として、ネットワークの基礎（OSI参照モデルなど）や、
ルーティングの触りの知識（スタティックルーティングなど）がわかっているとします。

参考サイト　http://net-juku.org/tcpip2/tcpip266.html

##経路集約とは

まずは簡単な図で説明します。
![スクリーンショット 2021-02-09 21.37.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/626890/4eed0455-1d6a-983c-bc14-f9271cdfeb65.png)
※IPアドレスは設定してないので通信不可のマークがでていますがここでは省略します。。

RTAからみた時、RTAのルーティングテーブルに登録される経路は、
ルートB,C,D,Eとなります。（ネクストホップは全部RTB）

しかし、実用にあたり全てのルート（ネットワーク）を登録していたら、
膨大の数になってしまうのです。。
これを解決するため、ルーティングテーブルへの登録を簡潔にしよう（ルートをまとめてしまおう）というのが経路集約ということなのです。

それではどうルートをまとめていくのか。（もちろん好き勝手まとめられません）


###それはネットワークのIPアドレスで分けていきます。


具体的に、

仮にRTAのルーティングテーブルに下記アドレスが登録されているとします。
１９２．１６８．０．０／２４
１９２．１６８．１．０／２４
１９２．１６８．２．０／２４
１９２．１６８．３．０／２４

結論からいうとこれを経路集約を用いると、
１９２．１６８．０．０／２２となります。

求め方ですが、全て２進数に変換した時に、
共通しているビットを割り出し、それ移行はゼロでまとめてしまうと行った感じです。

それぞれ第３セクターから違いがあるので、そこだけで変換してみると、
０(10進数)　＝ 　００００００００　(2進数)
１(10進数)　＝ 　０００００００１　(2進数)
２(10進数)　＝ 　００００００１０　(2進数)
３(10進数)　＝ 　００００００１１　(2進数)

となり前半６ビット分だけ共通しているのがわかります。

全体でみると頭から２２ビット分は共通してまとめることできる。
ということになります。
よって１９２．１６８．０．０／２２と求めることができます。


簡単にですが経路集約についてでした！！
将棋エンジンを作ってみる【ルール実装編(0)】本記事の目指すところ

本ページでは0回として本記事の目標のみを記載することにして、実装は以降のページに譲るとする。

※「本ページ」と「本記事」同じ意味じゃね？と突っ込まれそうなので、以下のように使い分けると補足しておく。
本ページ：このURLを指す。
本記事：「将棋エンジンを作ってみる【ルール実装編】」全体を指す。

# 本記事の目指すところ

強い将棋エンジンが複雑な将棋のルールをどのように効率的に実装したのか気になったので調べてみた。
理解を深めるために実際に実装しようと思うのでその過程を記録として残すことにする。

当面は↓のように局面から合法手を列挙することを目標とする。
将棋エンジンに詳しくない読者にはわかりにくいと思うが、赤枠で囲った箇所に初期配置における合法手が全て列挙されている。
それぞれの意味はわからなくても指し手が30あることはわかると思う(初期配置における合法手は30)。
(この図はやねうら王さんエンジンを拝借して作成した)

<img src="https://raw.githubusercontent.com/samakusa/qiita_resource/master/000_%E5%B0%86%E6%A3%8B%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%B3%E3%82%92%E4%BD%9C%E3%81%A3%E3%81%A6%E3%81%BF%E3%82%8B%E3%80%90%E3%83%AB%E3%83%BC%E3%83%AB%E5%AE%9F%E8%A3%85%E7%B7%A80%E3%80%91%E6%9C%AC%E8%A8%98%E4%BA%8B%E3%81%AE%E7%9B%AE%E6%8C%87%E3%81%99%E3%81%A8%E3%81%93%E3%82%8D/%E3%81%93%E3%81%AE%E8%A8%98%E4%BA%8B%E3%81%AE%E7%9B%AE%E6%8C%87%E3%81%99%E3%81%A8%E3%81%93%E3%82%8D.jpg">

# 前提として

強い将棋エンジンを作りたいという方向けではない(いずれ、そのような情報をまとめたいとは考えているが)。
将棋ソフトが強いと話題になっており関連書籍も増えているにも関わらず、ルールの実装についてまとめられているものを見たことがないので調べたことを記録することを目的としている。

強い将棋エンジンを作るための情報はやねうら王の開発者やねうらおさんがまとめている以下の記事が参考になると思う。
http://yaneuraou.yaneu.com/yaneuraou_mini/

やねうら王はオープンソースとして公開されており、さまざまな将棋エンジンのフレームワークとなっている。
https://github.com/yaneurao/YaneuraOu
将棋ソフトの中でも有名(だと個人的には思っている)な「水匠」「elmo」「Apery」など、これらのエンジンもやねうら王をベースとして作られている
(言い切ったが確証がない、特にAperyは以前はそうだったと思うが開発言語を移行したようなので、今は違うと思う)。

つまり、**<font color="Red">本記事の内容など一切意識しなくても将棋エンジンを作ることはできるはず</font>**なのである(もちろん強い将棋ソフトの開発者は完璧に理解しておられるのだろうが)。

# 連載

1. [Bitboard入門](https://qiita.com/samakusa/items/272b6449b2412d68cd44)
1. [USIプロトコル](https://qiita.com/samakusa/items/d68b3e450d60e2daf6de)
Chromebookになでしこをインストールする

Chromebookになでしこ3をインストールする方法を紹介します。ChromebookのLinuxを有効にすると、なでしこ3からLinuxの機能が簡単に利用できます。

> なお動画でも解説を紹介しています。

https://www.youtube.com/watch?v=8IQju3oGTdw

# Web版のなでしこ3を使う

別途何かをインストールする必要はありません。
ブラウザで[なでしこ簡易エディタ](https://nadesi.com/doc3/go.php?10)にアクセスして、プログラムを作って実行できます。

# Linuxを有効にして「なでしこ3」を使う

Chromebookでは設定でLinuxをオンにすると、すぐにLinuxが使えるようになります。Linuxのターミナルを開いたら、[「なでしこのChromebookのページ🌍」](https://nadesi.com/doc3/index.php?Chromebook)を参考にして、インストールコマンドを実行しましょう。

以下、その詳しい手順を紹介します。

## 設定画面でLinuxを有効にする

画面右下の時計をタップ。そして、ポップアップしたメニューから設定ボタンのアイコンをタップ。そして、設定画面の左側にある「Linux(ベータ版)」をタップ。そして「Linux オンにする」をタップ。

![Screenshot 2021-02-09 at 14.40.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33180/b0ad2d7f-b475-ec78-12fd-96715baf9755.png)

## Linuxをセットアップしよう

画面を確認して「次へ」をタップ。

![Screenshot 2021-02-09 at 14.40.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33180/46f35076-88e1-be76-63d5-5ee37028b593.png)

「インストール」をタップ。なでしこをインストールするのにそれほどたくさんのディスクは使いませんが、とりあえず、推奨のままインストールしましょう。

![Screenshot 2021-02-09 at 14.40.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33180/11667dd5-e436-062d-9277-7c138ed46b19.png)

インストールが完了するまで、少し時間がかかります。紅茶でも入れてゆったり待ちましょう。

![Screenshot 2021-02-09 at 14.40.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33180/9221df27-0dac-eb11-c495-7abe85e09e3d.png)


## ターミナルを起動

セットアップが完了したら、アプリの一覧から「Linux > ターミナル」を選んで起動します。

![Screenshot 2021-02-09 at 18.47.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33180/2b055cd6-593c-7831-f985-0b66659ad62b.png)

## インストールのコマンドを入力

以下のインストールコマンドを一文字漏らさずコピーしましょう。

```install.sh
curl https://raw.githubusercontent.com/kujirahand/nadesiko3/master/installer/chromeos.sh | /bin/bash
```

そして、ターミナルに貼り付けます。ターミナルに貼り付けるショートカットは、[Ctrl]+[Shift]+[V]です。（あるいは、マウスの右クリック{IdeaPadだと指をタッチパッドにおいたままクリック}で貼り付け）

コマンドを貼り付けたら[Enter]キーで実行します。しばらくまっているとインストールが完了します。

![Screenshot 2021-02-09 at 21.48.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33180/64f367f1-7249-c0b9-321e-124241e3912a.png)


## なでしこエディタを起動しよう

ターミナルを開いて、以下のコマンドを実行すると、なでしこNode版のエディタが起動します。

```起動.sh
nako3edit
```

ブラウザが起動して以下のような画面がでます。「新規作成」のリンクをタップしましょう。

![Screenshot 2021-02-09 at 20.35.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33180/f4378128-14c4-9877-f152-ee24ac064eef.png)

プログラムを入力して「実行」ボタンを押すとプログラムを実行できます。

## Node版ではブラウザ版で使えないいろいろな命令が使える

Node版のなでしこ3をインストールすると、Webブラウザ上の「なでしこ」では実行できなかったいろいろな命令が使えます。

 - [なでしこv3命令リファレンス](https://nadesi.com/v3/doc/)
 - [Node版なでしこの命令一覧](https://nadesi.com/v3/doc/index.php?plugin_node)

## (メモ) なでしこを最新版にアップデートする方法

なでしこを最新版にアップデートするには、ターミナルで以下のコマンドを実行します。

```
npm update -g nadesiko3
```

## (メモ) なでしこをアンインストールする場合

ターミナルで以下のコマンドを実行します。

```
# なでしこのアンインストール
npm uninstall -g nadesiko3
# Node.jsのアンインストール
sudo apt remove nodejs npm
```
数学雑談(僕が好きな素数の性質)

#以下の問題を解いてください
どんな言語でもいいです(初学者向け程度の難易度です)
##問題
$x$, $y$が正の整数であるとき, 
$2xy+x+y$の形で表すことができない正の整数を小さい順から$20$個列挙せよ.

##解法例(Python)

```
numbers=[]

for i in range(1,50):#多分50個くらいやれば十分（適当）
    for j in range(1,i+1):
        numbers.append(2*i*j+i+j)

ans=[]

for i in range(1,10**5):#結構適当に
        if i in numbers:
            pass
        else:
            ans.append(i)
            if len(ans)==20:
                break
print(ans)

```
###出力結果

```
[1, 2, 3, 5, 6, 8, 9, 11, 14, 15, 18, 20, 21, 23, 26, 29, 30, 33, 35, 36]
```

##この数字の面白い性質

この数をすべて$2$倍してプラス$1$すると...

###Pythonでやってみた

```

A=[1, 2, 3, 5, 6, 8, 9, 11, 14, 15, 18, 20, 21, 23, 26, 29, 30, 33, 35, 36]
ans=[]
for i in range(20):
    ans.append(2*A[i]+1)
print(ans)
```

###結果

```
[3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73]
```

となります.

##まとめ
これは実は奇素数の列挙となっています. 

なぜか?はめんどくさいので書きませんが初見だと不思議で面白いと思いました.
A - Biscuits


##[A - Biscuits](https://atcoder.jp/contests/agc017/tasks/agc017_a)
最初は2^50のbit全探索を考えました。
2^50は「1.1258999e+15」ですね。
どう見てもTLEです。

```python:python
import math
 
N, P = list(map(int, input().split()))
A = list(map(int, input().split()))
 
res = 0
for bit in range(0, 2 ** N):
    total = 0
    for i in range(0, N):
        if (bit >> i) & 1:
            total += A[i]
        
    if total % 2 == P:
        res+=1
 
print(res)
```

ここで奇数と偶数に注目しました。
###p=0の時、数列の偶数の要素をnとした時の組み合わせは、

```math
V1 = 1 (n = 0) \\
V1 = \sum_{k=1}^{n} {}_nC_k
```

p=0の時、数列の奇数の要素をN-nとした時の組み合わせは、
奇数を偶数だけ取り除いた物がP=0になります。

```math
V2 = 1 (N-n = 0) \\
V2 = \sum_{k=0}^{N-n} {}_nC_k (k = 0, 2, 4, ... )
```

組み合わせの積の法則により、

```math
合計 = V1 * V2
```


###p=1の時、数列の偶数の要素をnとした時の組み合わせは、

```math
V1 = 1 (n = 0) \\
V1 = \sum_{k=1}^{n} {}_nC_k 
```

p=1の時、数列の奇数の要素をN-nとした時の組み合わせは、
奇数を奇数だけ取り除いた物がP=1になります。

```math
V2 = \sum_{k=1}^{N-n} {}_nC_k (k = 1, 3, 5, ... )
```

組み合わせの積の法則により、

```math
合計 = V1 * V2
```


```python:python
import math
 
def combinations_count(n, r):
    return math.factorial(n) // (math.factorial(n - r) * math.factorial(r))
 
N, P = list(map(int, input().split()))
A = list(map(int, input().split()))
 
res = 0
for i in range(0, N):
    if A[i] % 2 == P:
        res += 1
    
if P == 0:
    V1 = 0
    total = (len(A) - res)
    for i in range(0, total+1, 2):
        V1 += combinations_count(total, i)
 
    total = res
    V2 = 0
    for i in range(0, total+1, 1):
        V2 += combinations_count(total, i)
    
    if V1 == 0:
        V1 = 1
    if V2 == 0:
        V2 = 1
    res = V1 * V2
else:
    V1 = 0
    total = (len(A) - res)
    for i in range(0, total+1, 1):
        V1 += combinations_count(total, i)
 
    total = res
    V2 = 0
    for i in range(1, total+1, 2):
        V2 += combinations_count(total, i)
    
    if V1 == 0:
        V1 = 1
    
    res = V1 * V2
 
print(res)
```

##感想
自力でACできたので組み合わせの勉強の成果が出たと思います。
django api and vue(1)

```vuejs:App.vue
<template>
 <div>
    <FBButton />
 </div>
</template>

<script>
import FBButton from './FBButton.vue'

export default {
  name: 'App',
  components: {
    FBButton
  }
}
</script>

<style>
#app {
  font-family: Avenir, Helvetica, Arial, sans-serif;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  text-align: center;
  color: #2c3e50;
  margin-top: 60px;
}
</style>
```



```vuejs：FBButton.vue
 <template>
    <div>
        <button @click="open">Login with Facebook</button>
    </div>
</template>
<script>
 
export default {
    name: 'FBButton',
     methods: {
        open() {
            #①
            document.location.href = 
            ’https://www.facebook.com/v9.0/dialog/oauth?client_id={app-id}&redirect_uri=http://localhost:8080’
　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　↑変更する
        }
      },
    }

</script>
```
①
https://developers.facebook.com/docs/facebook-login/manually-build-a-login-flow/

FBのログインボタンをクリックすると
いろいろリンク集

##### Jackson Date
https://www.baeldung.com/jackson-serialize-dates

##### Jackson – Custom Serializer
https://www.baeldung.com/jackson-custom-serialization

##### Pythonで階乗、順列・組み合わせを計算、生成
https://note.nkmk.me/python-math-factorial-permutations-combinations/

```python
import itertools
l = ['a', 'b', 'c', 'd']
for v in itertools.permutations(l, 2):
    print(v)
# ('a', 'b')
# ('a', 'c')
# ('a', 'd')
# ('b', 'a')
# ('b', 'c')
# ('b', 'd')
# ('c', 'a')
# ('c', 'b')
# ('c', 'd')
# ('d', 'a')
# ('d', 'b')
# ('d', 'c')
```

##### How to use ssh session with no color formatting (JSch)
https://unix.stackexchange.com/questions/387109/how-to-use-ssh-session-with-no-color-formatting

```java
setPtyType("dumb");
```

##### 【Java】ByteBufferの使い方
https://nompor.com/2018/05/06/post-3660/

##### bash, zshでyes/no判定をする
https://qiita.com/u1and0/items/a628db9644a72b11584c

```sh
read -n1 -p "ok? (y/N): " yn
if [[ $yn = [yY] ]]; then
  echo hello
else
  echo abort
fi
```
テストコマンド [ をダブルで使う、つまり [[ が重要です。

##### ORACLEの空文字の扱いにハマった話。
https://qiita.com/LowSE01/items/fa1cd0bf2b8ae458b7a4
どうやらORACLEは、「''」をNULLとして扱うらしい。
この書き方が正しい様子

```sql
NVL2(TRIM(e_mail_address), 1, 0)
```
##### Java の String.format は遅い
https://redfin.engineering/java-string-concatenation-which-way-is-best-8f590a7d22a8
https://qiita.com/tana6/items/818d30f1974704746fcc
Logging using SLF4J が良さそうだ

```java
logger.info("SOME GENERAL CONTEXT: var1={}, var2={}, var3={}", var1, var2, var3);
```