OmniAICreator/Qiita-1.07M huggingface dataset:
NSX Controllerがデプロイできないときに考えたい原因【phantom Controller】

#phantom controllerとは
NSX Controllerを正規の手順ではない方法で消去した場合に、GUI上からはNSX Controllerが消えているように見えるが内部的には消えていない状態になること
(VMware公式: https://docs.vmware.com/jp/VMware-NSX-Data-Center-for-vSphere/6.4/com.vmware.nsx.troubleshooting.doc/GUID-622986F8-0D29-4A5D-BE98-6D03F3C75534.html)

#正規じゃない手順って何よ
NSX Controllerの仮想マシンをvcenter上でディスクから削除したりとかすることです
正規の手順はここ(https://docs.vmware.com/jp/VMware-NSX-Data-Center-for-vSphere/6.4/com.vmware.nsx.troubleshooting.doc/GUID-794D77A1-BB77-4B02-ABB6-3FE2930677B0.html) に書いてあります
GUIかAPI以外から消すなってちゃんと書いてありますね

#前提
私や私のチームの人間がお客様の環境でトラブルシューティングした際のことを思い出しながら書いているだけなので、この記事を書く際に実際に検証はできていません。
(会社の環境で検証とかはしましたが)

##Phantom Controllerが発生して困ること
①IPアドレスプールのIPアドレスをphantom Controllerが握っている状態になるため、3つ目のNSX Controllerをデプロイする際にIPアドレスが足りなくなる
②例えばGUI上から見たNSX Controllerの数が2つしかないのに、phantom Controllerが1つあって3つ目のNSX Controllerがデプロイできなくなる
(NSX Managerの内部的には4つ目のコントローラーをデプロイしようとしているように見えてしまう)

#対処法
NSX ManagerのAPIを使ってCLIでController-IDを取得/削除する
(APIガイド: https://docs.vmware.com/en/VMware-NSX-Data-Center-for-vSphere/6.4/nsx_64_api.pdf#page211)


##Controller-IDの取得
Postmanの使用を前提としています

```
GET /api/2.0/vdn/controller
```

※Basic Authでユーザー名、PWを入力

```
 <controllers>
  <controller>
    <id></id>
    <name></name>
    <description></description>
    <ipAddress></ipAddress>
    <status></status>
    <diskLatencyAlertDetected></diskLatencyAlertDetected>
  </controller>
 </controllers>
```

上記のような形でコントローラーの情報が返ってきます
```<id></id> ``` で囲まれてるIDをメモします

##Controllerの削除
上記でメモしたController-Idを利用します
(たぶんcontroller-1とかだと思う)
※Postmanの使用を前提としています

```
DELETE /api/2.0/vdn/controller/{controllerId}
```

(```?forceRemoval=true``` 的なのを入れないと消せなかった気がする、よく覚えてないですすみません)
※Basic Authでユーザー名、PWを入力
※{controllerId}には上記手順で取得したIDを入力


終わったらまた

```
GET /api/2.0/vdn/controller
```

とかで消したコントローラーのcontrollerIdがないことを確認すればいいと思う

#まとめ
この手順は正しい運用してれば使うことなんてないと思います。
ですが原因が分かりづらいトラブルですし、困っている誰かの手助けになれば嬉しいです。
Python 　エモクロアTRPG基本キャラステータスランダム作成プログラム

先日発表された無料オンライン向けTRPG
エモクロアTRPGのキャラクターランダム生成プログラムをPythonで組んでみました
エモクロアTRPGのPC複雑なパラメータ持たないため下記の内容で組みました

今回のコードは全ステータスをD6（６面ダイス）で値を決める動きを想定していますが
パラメータをすべて振り切るものではありません
あくまですべての値をD6を振って出目合計が２５以下のパターンを設定する想定です

やってることとしてはD6を８回ふって出目の合計が２５以下のパターンを出力するというシンプルなもので
25点あるステータスポイントを全部振り切るプログラムではないというのがミソ


使用環境　　　　　Python3.9.1
コーディング環境　IDLE3.9

```python:randomcharacter.py
import random

bol = True

while bol:
    sintai = random.randint(1,6)
    kiyou = random.randint(1,6)
    seisin = random.randint(1,6)
    gokan = random.randint(1,6)
    tiryoku = random.randint(1,6)
    miryoku = random.randint(1,6)
    syakai = random.randint(1,6)
    unsei = random.randint(1,6)
    goukei = sintai +kiyou +seisin +gokan +tiryoku +miryoku +syakai +unsei
    if goukei <= 25:
        bol = False
print("身体"+str(sintai))
print("器用"+str(kiyou))
print("精神"+str(seisin))
print("五感"+str(gokan))
print("知力"+str(tiryoku))
print("魅力"+str(miryoku))
print("社会"+str(syakai))
print("運勢"+str(unsei))
print("HP"+str(sintai+10))
print("MP"+str(seisin+tiryoku))
 
```

（追記）プログラムを再利用しやすいように改良しました。
改良版では25点完全にふりきる形にしています（ループ抜ける条件変えただけですが）

```python:randomcharacter.py
import random

def rnd_char():
    dataheder = ('身体 : ','器用 : ','精神 : ','五感 : ','知力 : ','魅力 : ','社会 : ','運勢 : ','HP   : ','MP   : ')

    bol = True

    while bol:
        data = list()
        for i in range(8):
            data.append(random.randint(1,6))
        
        if sum(data) == 25:
            bol = False
    i = 0
    for st in dataheder:
        if i < 8:
            print(st + str(data[i]))
        if i == 8:
            print(st+str(data[0]+10))
        if i == 9:
            print(st+str(data[2]+data[4]))
        i += 1

rnd_char()

```
Active Recordのpluckとselect

## 違い

- pluckはArrayを返す。selectはActiveRecord::Relationを返す。
- pluckがメソッドチェーンの最後に書かれているのなら、selectを使った時と、発行されるクエリは変わらないはず。

```rb
> puts User.select(:id).to_sql
SELECT "users"."id" FROM "users"

# pluck(:id)は、Arrayを返すので、to_sql()をチェーンすることはできない
> puts User.pluck(:id)
(4761.4ms)  SELECT "users"."id" FROM "users"
```
自分用SQL単語帳

#はじめに
以前、２回に分けてSQLで使う単語をざっくりまとめていました。
一つにまとめます。
意味は自分がわかるように、大分ざっくりしているので、ご了承ください。

##単語帳

|単語|意味|
|---|---|
|SELECT|検索
|UPDATE|更新
|INSERT|挿入
|DELETE|削除
|FROM|テーブル指定
|INTO|INSERT文でテーブル指定
|VALUES|INSERT文で値を入力
|SET|UPDATE文で列名と値を入力
|WHERE|絞り込み条件(必ず真偽値)
|AS|別名をつける
|IS NULL|NULLかどうか判別
|IS NOT NULL|NULLではないかどうか判別
|LIKE|パターンマッチング
|IN|いずれかに一致
|NOT IN|どれとも一致しない
|BETWEEN A AND B|AとBの間
|ANY|いずれかと一致すれば真
|ALL|全てと一致すれば真
|A AND B|AかつB
|A OR B|AかB
|NOT A|Aではない
|DISTINCT|重複を除外
|ORDER BY|順番を変える
|ASC|昇順
|DESC|降順
|UNION|和集合
|EXCEPT|差集合
|INTERSECT|積集合
|CASE|条件と一致したら値を変換
|LENGTH|文字数
|SUM|合計値
|AVG|平均値
|MAX|最大値
|MIN|最小値
|COUNT|行数を数える
|ROUND|四捨五入
|TRUNC|切り捨て
|POWER|冪乗
|CURRENT_DATE|現在の日にち
|CURRENT_TIME|現在の時刻
|CAST|データ型を変換
|TRIM|空白削除
|REPLACE|指定文字を変換
|CONCAT|文字列を連結
|SUBSTRING|一部を抽出
|COALESCE|最初に登場するNULLでない値を返す
|GROUP BY|検索結果のグループ化
|HAVING|集計結果に対して絞り込み条件
|JOIN 〜 ON|テーブル結合|
|CREATE TABLE|テーブル作成|
|DROP TABLE|テーブル削除|
|DEFAULT|デフォルトの値指定|
|ALTER TABLE 〜 ADD|列の追加|
|ALTER TABLE 〜 DROP|列の削除|
|NOT NULL|NULLを入れない|
|UNIQUE|重複した値を入れない|
|CHECK|条件に合わない値を入れない|
|PRIMARY KEY|主キーに指定|
|REFERENCES|外部キーに指定|
|CREATE INDEX 〜 ON|インデックス作成|
|DROP INDEX|インデックス削除|
|BEGIN; 〜 COMMIT;|トランザクション|
|CREATE VIEW|ビュー作成|
|DROP VIEW|ビュー削除|
|AUTO_INCREMENT|自動連番|
|GRANT 〜 TO|権限付与
|REVOKE 〜 FROM|権限剥奪|
Atcoder用チートシート（python）

#各チートシートへのリンク

[**入力**](https://qiita.com/ysys_Ba/items/ad72f5df3cfb173459bd#目次)　[出力](https://qiita.com/ysys_Ba/items/cf926800990160b6757c#目次)
[基本演算](https://qiita.com/ysys_Ba/items/e422b6ab951853dc87d8#目次)　[文字列](https://qiita.com/ysys_Ba/items/f81f708453f800af202d#目次)　[**配列**](https://qiita.com/ysys_Ba/items/6f5b288f657608186de8#目次)　[辞書](https://qiita.com/ysys_Ba/items/62206c61dbf3692f3c06#目次)　[bit演算](https://qiita.com/ysys_Ba/items/f3b31364c2e812469951#%E7%9B%AE%E6%AC%A1)
[**優先度付きキュー**](https://qiita.com/ysys_Ba/items/90476af66df4ba954f06#%E7%9B%AE%E6%AC%A1)　[**二分探索**](https://qiita.com/ysys_Ba/items/50bc0645016a31bb3aa1#%E7%9B%AE%E6%AC%A1)　[順列全探索](https://qiita.com/ysys_Ba/items/cc897fa6ab2c9f4c5d1d#%E7%9B%AE%E6%AC%A1)　[MOD](https://qiita.com/ysys_Ba/items/9a99c250c6cc7634a403#%E7%9B%AE%E6%AC%A1)　[Decimal（未作成）](https://twitter.com/ysys_Ba)
[DP（未作成）](https://twitter.com/ysys_Ba)　[再帰](https://qiita.com/ysys_Ba/items/4dca1d5ac36b932c6802#%E7%9B%AE%E6%AC%A1)
[ダイクストラ法](https://qiita.com/ysys_Ba/items/5438928e55f41cbad802#%E7%9B%AE%E6%AC%A1)　[ワーシャルフロイド法](https://qiita.com/ysys_Ba/items/13f779b89e52624981df#%E7%9B%AE%E6%AC%A1)
[Union-Find](https://qiita.com/ysys_Ba/items/37ef7ab8fe87f7affd1e#%E7%9B%AE%E6%AC%A1)　[根付き木](https://qiita.com/ysys_Ba/items/4eedffb479c113c49a7c#%E7%9B%AE%E6%AC%A1)　[セグメント木（未作成）](https://twitter.com/ysys_Ba)

~~[for文](https://twitter.com/ysys_Ba)~~ ~~[while文](https://twitter.com/ysys_Ba)~~ 今のところコンテスト中に調べる場面があまりないので執筆中止

#チートシート以外へのリンク

[ミス記録シート](https://qiita.com/ysys_Ba/items/312d0d72311dcfc2a2be)

#そもそもこのページは何？

ysys([@ysys_Ba](https://twitter.com/ysys_Ba))がAtcoderのコンテスト中に参照するためのチートシートまとめページ
チートシートとしての機能性のために、ページ説明の前にリンクを列挙しています
**上部のリンクからチートシートすべてに飛べるようになっている**ので、このページをブックマークしておけばいつでもすぐに参照できます（宣伝）
他の人に役立つような競プロ記事を出すことはまずないと思いますが、チートシート以外の競プロ関連記事ももし書いたらここにリンクをまとめておきます（予定）

#チートシートについて

自分以外の人の参照性は基本的に考慮していませんが、もしそれでも参照したいという方がいれば自由に使ってください
チートシートではありますが、プログラミング初心者ですしページがスカスカすぎるのも微妙なので、かなり基本的なことから記載されています（♰完全に理解♰したら、その項目は消すなりページの最後の方に移すなりする予定です）
ただ、あくまでもチートシートなのでまともな解説はなく不備も多々あります
**コンテスト本番中に参照して得たい情報をいち早く得ることで、パフォーマンスを向上させることを第一目標としてチートシートを書いてます**
チートシートが直接コンテストで役立つことはないかもしれませんが、最低限これくらい知っていれば[これくらいのRating](https://atcoder.jp/users/ysys_Ba)になれるという参考にはなるかもしれません

#ysysと競プロ

[Atcoderのアカウント](https://atcoder.jp/users/ysys_Ba)
ゆるふわ勢なのでpython（pypy）で参加しています（やる気が出たらC++に手を出すかも）
かつては大学の初心者向けプログラミング授業で早々に挫折したり、エディタ代わりにメモ帳でコーディングしているのを同期にネタにされたりするレベルのプログラミング弱者でした
大学受験レベルの数学はわかります（多分）
python以外に使える言語は、学科の授業でやったC（ほとんど忘れた）と、Arduino IDEで使うArduino言語（C/C++がベースらしい）です

#Atcoder歴

2020/10/06　Atcoderのアカウント作成
2021/01/02　<font color="Gray">灰色</font>になる（ABC187、初参加のコンテスト）
2021/02/06　<font color="Brown">茶色</font>になる（ABC191、5回目参加のコンテスト）
2021/03/06　<font color="Green">緑色</font>になる（ABC194、9回目参加のコンテスト）
2021/05/15　<font color="cyan">水色</font>になる（ABC201、21回目参加のコンテスト）
2021/12/05　<font color="blue">青色</font>になる（AGC056、61回目参加のコンテスト）
appendChildメソッド実行時にかかる負荷を減らすために

#DocumentFragmentオブジェクト
appendChildはJSから文書ツリーに要素を追加できる非常に便利なメソッドです。しかし、appendChildは場合によってオーバーヘッド（負担）の高い処理にもなってしまいます。
そこで使われるのが__DocumentFragmentオブジェクト__です。
DocumentFragmentとは、文字通り「文書の断片」であり、「組み立てたノードを一時的にストップするたみに使う入れ物」です。
例を見てみましょう。
<br>
<p class="codepen" data-height="265" data-theme-id="light" data-default-tab="js,result" data-user="ryuji0526" data-slug-hash="abBexpr" style="height: 265px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="abBexpr">
  <span>See the Pen <a href="https://codepen.io/ryuji0526/pen/abBexpr">
  abBexpr</a> by Ryuji Watanabe (<a href="https://codepen.io/ryuji0526">@ryuji0526</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>

<br>
上記は、配列の値ををli要素に入れ込んで、ul要素配下に追加する簡単なコードです。
このコードはもちろん正しく動作しますが、パフォーマンス的にはあまり望ましくありません。なぜなら、li要素がul要素に追加するたびにコンテンツが描画されるからです。上記の例では、この５回コンテンツが描画されていることになります。最描画は比較的オーバーヘッドの高い処理になります。
今回のように少ない場合だと負荷を感じることはないと思いますが、配列の要素がどんどん増えると、負担になってしまいます。
このような状況では、DocumentFragmentオブジェクト上でコンテンツを組み立ててからまとめてul要素に追加すべきです。

以下のように修正します。
<br>

<p class="codepen" data-height="265" data-theme-id="light" data-default-tab="js,result" data-user="ryuji0526" data-slug-hash="abBexpr" style="height: 265px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="abBexpr">
  <span>See the Pen <a href="https://codepen.io/ryuji0526/pen/abBexpr">
  abBexpr</a> by Ryuji Watanabe (<a href="https://codepen.io/ryuji0526">@ryuji0526</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>

<br>
このようにDocumentFragmentオブジェクトに貯めることで、文書ツリーの更新は一回だけなので、最描画にかかるオーバーヘッドを最小限に抑えることができます。

#おわりに

大規模開発では、このように処理時の負担を意識しなければならないと思います。（私も初心者なので、なかなか意識してコードを組めません、、、）
以下に負担を抑えることができるか、考えてコードを組めるように心がけましょう！（私もがんばります！）
【Git】Changes not staged for commit:とエラーが出たときの対処法

<h2></h2>
gitでmasterブランチで直接編集した内容をcommitしようとしたとき下記のように怒られました。


```terminal:masterのuser_test.rbをcommitしようとした
git commit -m "Fix test"
On branch master
Your branch is up to date with 'origin/master'.

Changes not staged for commit:
        modified:   test/models/user_test.rb

no changes added to commit
```

Changes not staged for commitを直訳すると「コミットのためにステージングされていない変更」になります。

最後の行は「no changes added to commit」は「コミットするために追加された変更はありません」という意味でした。

変更したものがコミットされていないと言われています。

<h2>解決策</h2>
エラーの内容通り、Addをしたら解決しました。

stagedに対象のファイルが追加されていなかったため、「コミットのためにステージングされていない」というエラーが表示されたのだと思います。

```
git add -A
```

<h2>参考</h2>
git 2.2 Git の基本 - 変更内容のリポジトリへの記録
https://git-scm.com/book/ja/v2/Git-%E3%81%AE%E5%9F%BA%E6%9C%AC-%E5%A4%89%E6%9B%B4%E5%86%85%E5%AE%B9%E3%81%AE%E3%83%AA%E3%83%9D%E3%82%B8%E3%83%88%E3%83%AA%E3%81%B8%E3%81%AE%E8%A8%98%E9%8C%B2
GrafanaのRepeat optionsで繰り返しチャート表示

Raspberry PiにインストールしたPrometheusとNode exporterで取得した`node_cpu_scaling_frequency_hertz`をGrafanaで可視化してみました。

設定無しでするとこんな感じ。

![moritalous.grafana.net__orgId=1(Laptop with MDPI screen).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/79ae0191-2c7d-61e9-722d-fe46ea44f70b.png)

これを、CPUのコアごとのグラフにしてみたいと思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/86ec8dd7-4fbc-8b69-e550-c4283f1ed43b.png)



# 手順

## Variableの追加

右上の設定ボタン（ギアアイコン）から、`Variables`を追加します。

![moritalous.grafana.net__orgId=1(Laptop with MDPI screen) (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/b1e288be-7e0c-41ea-6f49-b949b0f43846.png)

* General

| 項目 | 設定値 |
| --- | --- |
| Name | CPU |
| Type | Query |

* Query Options

| 項目 | 設定値 |
| --- | --- |
| Data Source | Prometeus |
| Refresh | On Dashboard Load |
| Query | label_values(node_cpu_scaling_frequency_hertz, cpu)|
| Sort | Alphabetical (asc) |

* Selection Options

| 項目 | 設定値 |
| --- | --- |
| Multi-value | 有効 |
| Include All option | 有効 |

# Panelの設定

QueryのMetricsはこんな感じです。

| 項目 | 設定値 |
| --- | --- |
| Metrics | node_cpu_scaling_frequency_hertz{cpu="$CPU"} / 1024 / 1024 / 1024 |
| Legend | cpu{{cpu}} |

※`/ 1024 / 1024 / 1024`の部分は単位をGHzにしているだけですのであまり本題とは関係ありません。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/8a932b21-468f-65a9-28b9-4a8752388204.png)

右側のPanel設定の一番下に`Repeat options`があります。ここに`Variable`で追加したものが選択できます。
（選択肢が出ないときは右上の`Apply`を一度押すといいかもしれません）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/ff893b36-38e1-3e32-9cb8-0a28a4734c3e.png)

`Variables`の設定をしたので、画面上部に選択肢が出てくるようになりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/ebd7c1a0-b1f0-c1b7-0589-43c89c67c1e2.png)

表示を`Gauge`にしたらこんな感じです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/4545b76f-654e-c94f-a6c3-973869001440.png)


CPUコアごとの表示というのはあまり用途は無いですが、監視対象の全ホストのCPU利用率を一覧で見るなどは使いみちがあるかと思いました。
import 'package:firebase_core/firebase_core.dart'; が機能せず、Undefined name 'Firebase'. のエラー

##背景
FlutterとFirebase連携のチュートリアル

https://firebase.google.com/docs/flutter/setup?hl=ja

中で、配布コードのコピペのmain.dart内のimport文

```
import 'package:firebase_core/firebase_core.dart';
```
が機能していなかった。これにより

```
Firebase.initializeApp();
```
のFirebaseクラスが見つからず、実行時にエラーが発生する。

##原因
チュートリアル中のfirebase_coreのバージョンが低いことが原因。
pubspec.yaml に挿入する

```
firebase_core: ^0.4.0+9
```
は古いので、最新を入れる。現時点（2021/3/21)では最新が1.01なので

```
firebase_core: ^1.0.1
```
とすると改善された。
最新バージョンの確認はこちら（ https://pub.dev/packages/firebase_core ）

##最後に
チュートリアル中のパッケージのうち、執筆時点では

```
 firebase_auth: ^0.14.0+5
 cloud_firestore: ^0.12.9+5
```
も古いため、共に新しいバージョンに書き換えて取り組みました。
この変更で新たなエラーが発生したので、リンクを貼っておきます。

https://qiita.com/yano_t22/items/1d71031d3832bb5a2cca
Railsのコントローラー上で.envを使った環境変数を読み込めなかった時の対応

実現したいこと：
Railsのコントローラー上で、
.envのファイルに設定した環境変数を読み込んでAPIを取得したい。

環境：
Ruby 2.6.6
Rails 6.0.3.4
gemのdotenv-railsをインストール済


状況：
Ruby-on-RailsでSNSのアプリケーションを作成中にNewsApiを使用し、
Newsの情報を取得し表示する機能を実装していた。
APIKEYを.envファイルにて環境変数に置き換えて使用したかったが、
エラーが発生して読み込めなかった。


ニュース機能の実装で参考にした記事：
https://qiita.com/UTOG/items/f6438420e81b6488a508
上記執筆者様の実装方法を参考にNewsApiへ登録し、
APIKEYを取得し環境変数として設定後、記載されている実装コードを活用しファイル作成。（ニュースカテゴリー等の設定は変更）

対象ファイル：

```ruby:app/controller/news_Controller.rb
class NewsController < ApplicationController
  def index
  end

  def data
    uri = URI.parse('http://newsapi.org/v2/top-headlines?country=jp&category=business&pageSize=15&apiKey=<%="#{ENV['API_KEY']}"%>')
    json = Net::HTTP.get(uri)
    moments = JSON.parse(json)
    @data = moments['articles'].to_json
  end
end
```


```ruby:.env
API_KEY='この中に取得したAPI_KEYを入力'
```
上記コードでは下記のようなエラーが発生。

エラー文：
```syntax error, unexpected tCONSTANT, expecting ')'
...ze=15&apiKey=<%="#{ENV['API_KEY']}"%>')
...                        ^~~~~~~
/app/controllers/news_controller.rb:6: syntax error, unexpected ')', expecting end
...iKey=<%="#{ENV['API_KEY']}"%>')
```

調べたところ閉じタグがないと警告が出ており、
どうやら環境変数が読み込めていないため、
そこでコードの読み込みが止まってしまっているようあった。

試したこと：
1.環境変数を挿入していた該当のURLに取得したAPIKEYをベタ打ちで挿入
→ニュースが問題なく表示される。

2.コンソール上で環境変数を実行( 実行コード：```$ ENV['API_KEY']``` )
→.env内に記載していたAPIKEYが問題なく表示される。

→この時点で、
①ニュースを表示すること
②.env内での環境変数の設定はできていると予想。
コントローラーへの環境変数の組み込み方に問題があるのではと仮定。

2.環境変数の挿入方法を変更
(news.controller.rb 6行目を下記のパターンで変更　※対象箇所周辺コードのみ抜粋)

```
country=jp&category=business&pageSize=15&apiKey=<%="#{ENV['API_KEY']}"%>')
country=jp&category=business&pageSize=15&apiKey=<%=ENV['API_KEY']%>')
country=jp&category=business&pageSize=15&apiKey=<"#{ENV['API_KEY']}"')
country=jp&category=business&pageSize=15&apiKey=ENV['API_KEY']')
```
→検索しながら上記色々なパターンを実行したものの、エラー等で読み込めない状況は変わらず。。

原因：
<% %>や<%= %>の記述はerbファイル内で使える記述であり、
erb上でRubyコードを実行したり、Rubyで定義した変数などをHTMLとして出力したりする際に利用するとのことであり、コントローラー内では記述方法は異なるとのこと。

解決策：
下記、コードを修正。
ダブルクォーテーション(")とシングルクォーテーション(')の使い方にも間違いがあった模様。

```ruby:app/controller/news_Controller.rb
class NewsController < ApplicationController
  def index
  end

  def data
    uri = URI.parse("http://newsapi.org/v2/top-headlines?country=jp&category=business&pageSize=15&apiKey=#{ENV['API_KEY']}")
    json = Net::HTTP.get(uri)
    moments = JSON.parse(json)
    @data = moments['articles'].to_json
  end
end
```





今回、エラーにハマっていたところを質問サイトにて回答を頂いたため、
同じ状況の方のご参考になればと思い、共有させて頂きます。

まだまだ未熟なため説明不足な点もございますが、
今後修正等加えて参りますので気になる点がございましたらぜひ、
ご指導、ご鞭撻のほどよろしくお願いいたします。
10年ぶりにLinuxを触る人がnginxを立ち上げるまで

ざっくり10年前といいつつ12年前かもしれません。CentOS6が実機で使われていたのはいつ頃？

目標：読めなくて悔しかったnginxをEC2上で立ち上げる
目的：ECサイト若しくはマッチングサイトの運用


#EC2にインスタンスを設定
下記記事を参考に、EC2にインスタンスを作りました。1年間の無料枠内ですが。

https://qiita.com/ume1126/items/09e7cfc58ba003618bf9

https://qiita.com/ume1126/items/7cef8cb2c19959d25cb5

だがしかし後編を進めているとnginxはインストールできず、amazon-linux-extrasを実行してね＆Learn moreとドキュメントを紹介される。日にちも立っていますしね。![nginx1_wo_IP.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242973/541ed408-5c37-cd48-bd89-fe0f29a4a00e.png)


#nginxをAmazon Linux Extrasからインストール
Amazon Linux Extras
https://aws.amazon.com/amazon-linux-2/faqs/#Amazon_Linux_Extras


Q. What is Amazon Linux extras?
Extras is a mechanism in Amazon Linux 2 to enable the consumption of new versions of application software on a stable operating system that is supported until June 30, 2023. Extras help alleviate the compromise between the stability of the OS and freshness of available software. For example, now you can install newer versions of MariaDB on a stable operating system supported for five years. Examples of extras include Ansible 2.4.2, memcached 1.5, nginx 1.12, Postgresql 9.6, MariaDB 10.2, Go 1.9, Redis 4.0, R 3.4, Rust 1.22.1.

現況で2023年6月30日までの安定した動作を保証するソフトウェア群です。自分が必要とするであろうnginx, Postgresqlもこちらにあると判ります。「topic」というのもサブのソフトウェア群につけている単位名称らしい。
5年あると嬉しいですね　:)

```
$ sudo amazon-linux-extras install nginxl
```
インストールができました。

#サービスのスタートとスタートページの確認
さて、参考とさせていただいた後編記載のままやると下記のように失敗します。Amazon-Linux2-extrasではサービスの開始の仕方も変わっているのでしょう[*]。　

```
＄ sudo service nginx start
Failed to start nginx.service :Unit not found
```

下記、同様にAmazon-linux-extrasでインストールした方の自己解決記事にたどり着きました。（ここにきてteratailというQ&Aサイトを初めて知りました）本当はなんらか公式記事をご紹介したいところですが、動いたのでOKとします

```
＄ sudo /bin/systemctl start nginx.service
```

https://teratail.com/questions/234223

TTP and reverse proxy serverとあります。ステータスの確認もします。
![nginx2_wo_IP.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242973/6335d500-1565-e009-f507-41023bd67b03.png)

パブリックDNSにて動作を確認。Apacheの時を少し思い出します。
![nginx3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242973/3699b1e7-4b07-278f-bda4-5dc2e93ffd4d.jpeg)

ec2-userから二つ上に上がり、htmlフォルダの確認。
![nginx4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242973/cc32abbf-b3ba-cf65-0eba-ce73819de43c.png)

```
$ls -als

$ls ../

$cd ../../

$ls /usr/share/nginx/

$sudo /bin/systemctl stop nginx.service

```


#感想および次にやること
reverse proxyというのがまだ分からないまでも、Apache＋DNS＋BIND導入に比べたら
まるで詰まるところがありませんでした。
目標とするサイト運用まではまだまだ遠いものの、ひとまずWebサーバは立ち上がりました。
R53など他サービスも立ち上げて、本番時はDocker上で運用したいと思っております。

#参考

https://qiita.com/wallkickers/items/b19d3984c02147827204#%E3%82%B3%E3%83%B3%E3%83%86%E3%83%8A%E6%A7%8B%E6%88%90

https://qiita.com/sinsengumi/items/24d726ec6c761fc75cc9

[*]初めにCent OS 6と書いたブーメラン。RHLinux CentOS 7からPID 1のプロセスがinitからsystemdになり、systemctlで制御するようになったとか。
Mapbox GL JS を使用して到達圏解析を実装してみた。

## はじめに
今回は、Mapbox GL JS と ArcGIS Platform で提供されている到達圏解析のサービスを使用して、到達圏解析が実行できる簡単なアプリを作成しました。

## Service Areas（到達圏）とは
Service Area（到達圏）は、isochrone とも呼ばれ、道路ネットワーク上を車や徒歩で移動したときに到達できる距離をポリゴンで表現することができます。この分析では、不動産の検索や学校、企業、その他の施設への運転時間を判断する際によく用いられます。例えば、都市の中心部から任意の方向に 20分で移動できる距離を運転時間のポリゴンで作成することができます。

サンプルアプリのソースコードは、[GitHub](https://github.com/valuecreation/mapbox-gl-js-samples/blob/master/20210321/index.html) にも公開していますのでご参照ください。

https://freedom-tech.hatenablog.com/entry/2021/03/21/222257
RSASSA-PKCS1-v1_5について

古典的ですがデジタル署名の話です。
RSASSA-PKCS1-v1_5をPython3で実装しました。

一般的にデジタル署名は、下図のような流れで生成/検証をするという説明が多いと思います。

![abst.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/358381/e122c278-9528-fb66-49b2-718b542b2059.png)

2021年3月現在、よく使われているハッシュはSHA2-256、公開鍵暗号はRSA2048です。しかしSHA2-256の出力は256ビット長、RSA2048の入力は2048ビット長であり、上図の「ハッシュ値1」などで長さが一致しないことになります。

そこで、実際にはハッシュ値に何らかのパディングをします。やり方は何通りか規格がありますが、下図のパディングは、IETF RFC 8017の、RSASSA-PKCS1-v1_5という方式で、SHA2-256とRSA2048を適用する場合のものです。RSASSA-PKCS1-v1_5では、パディングに乱数などは使いません。

![pad.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/358381/b906f330-13c8-9c40-201b-a84b705ef7a2.png)

このRSASSA-PKCS1-v1_5を、Python3で実装しました。
https://github.com/fukuda123/crypto/blob/main/20210321-rsassa_pkcs1_v1_5/rsassa_pkcs1_v1_5.py

一応、簡単な動作確認済みです。NIST ACVP Demo serverで署名生成10問と検証18問が全部パスしましたので、おそらく大きなバグはないと思います。

プログラマさんの中には、暗号は難しいと感じている人もいるかもしれませんが、たとえ理論的なことが分かっていなくて、使いやすいライブラリがすぐ見つからない場合でも、今回のようにIETF RFC 8017をほぼそのまま100行ほどで実装できたりしますので、怖気づかなくても大丈夫です。
AWS for JavaScript で S3 の getObject で NoSuchKey を期待してたのに AccessDenied が返ってくる

## 問題

以下のようなコードコードを実行し

```javascript
    let prev = null;
    try {
      prev = await S3.getObject({
        Bucket: 'my-bucket-hogehoge',
        Key: 'path/to/object',
      }).promise();
    } catch(e) {
      // オブジェクトが存在しない場合(NoSuchKey)は無視,それ以外は throw し直す
      if (e.code !== 'NoSuchKey') {
        throw e;
      }
    }
```

存在しないオブジェクトへのアクセスは `NoSuchKey` が返ってくるものと期待していて、[s3rver](https://github.com/jamhall/s3rver) を利用したローカル環境での動作確認はそれで問題なかった。

しかし、デプロイして実際にどうさせると AccessDenied が返ってくる。

## 原因

なんで?
と1時間くらい悩んだが SDK のドキュメントに書いてあった

> https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html#getObject-property
> ### Permissions
>You need the s3:GetObject permission for this operation. For more information, see Specifying Permissions in a Policy. If the object you request does not exist, the error Amazon S3 returns depends on whether you also have the s3:ListBucket permission.
>
> - If you have the s3:ListBucket permission on the bucket, Amazon S3 will return an HTTP status code 404 ("no such key") error.
> - If you don’t have the s3:ListBucket permission, Amazon S3 will return an HTTP status code 403 ("access denied") error.

`s3:ListBucket` Action が許可されていないと `access denied` を返すと

### 追記: 2021-04-01 

API リファレンスのほうにも記載があったのでリンクを貼っておく

- [GetObject - Amazon Simple Storage Service](https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObject.html)

## 対応

以下のようにポリシードキュメントで権限を付与したら解決。
Resource の指定方法が `s3:GetObject` と異なるので注意。

```json
  (一部抜粋)
        {
            "Action": [
                "s3:GetObject",
                "s3:PutObject"
            ],
            "Resource": "arn:aws:s3:::my-bucket-hogehoge/*",
            "Effect": "Allow"
        },
        {
            "Action": [
                "s3:ListBucket"
            ],
            "Resource": "arn:aws:s3:::my-bucket-hogehoge",
            "Effect": "Allow"
        }
```
Reactを勉強していると思ったらただただBootstrapを使っていた話

<h1>初めに</h1>

自分が何もできないことにやっと気づいていろいろ勉強を始めました。

どれぐらい何もできないかというと、dockerも使ったことなく、awsやらAzureみたいなプラットフォームも使ったことなければ、Pythonをちょっとできる気になっているけどよく考えたら大したものを作ったことない感じでした。いわゆるなんちゃって情報大学生みたいな感じです(笑)

このままじゃいかんと、web系としてDjango+React、モバイルアプリ用としてFlutterの勉強を兼ねてアプリの個人開発を始めてみました。


<h1>デザインがしんどい</h1>

兎にも角にもデザインというかUIというか、すごく苦手です。Qiitaに上がっている記事で⇩を参考にして勉強というなの実践を積んでいるんですが、全然上達している気はしてないです。

https://qiita.com/ampersand-dev/items/e0768faf4b7260fc28d6

実際にDaily Cocodaをやってみてわかったんですけど、@ampersand-devさんが素直にすごい(笑)僕はちょっと挫折気味です。

<h1>React</h1>

しんどいと言っても個人で開発するのであれば避けては通れないのがフロントサイドの開発。今回はReactを選びました。理由は↓の記事のYoutubeをみて決めました。

https://qiita.com/e99h2121/items/81aad5a2b5be667b93cb

<h1>これってReactじゃなくね?</h1>

とりあえずなんか本でもかって一つでもアプリを作ってみようと衝動買い。本に従ってコーディングするとちょっとおしゃれな感じのデザインになっていった。でもそこでふと気づいた。

これってReactじゃなくてBootstrapじゃね？

でもBootstrap使うとなんか小洒落た感じになるしこれで十分じゃんと。僕みたくUIデザインが苦手な人から見たら救世主には変わりない。

<h1>Bootstrap</h1>

[gitにアップ](https://github.com/always-reach/html_bootstrap "git")してみました。ちなみにgit自体も最近使い始めたのであんまりわかっていないです。

Bootstrapの使い方自体はすごく簡単。htmlのheadタグ内に以下を記述すればとりあえず使えるようになる。

```
    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous">
```
あとは各タグのclassを↓こんなふうにすればあらびっくりもうおしゃれ

```
class="bg-色 text-色"
```
bgはBackGroundの略、textは読んで字のごとく。
こんなふうにclassの部分をいじるだけで僕みたいな人間にとってはもう満足できるような雰囲気のものができてしまうのだ。![スクリーンショット 2021-03-21 22.21.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/793703/a7c38370-a5ed-fc81-4da8-79b65c24ef32.png)

<h1>最後に</h1>

Reactの勉強も再開します。
[Rails] 削除ボタンを押した時に「本当に削除しますか？」のアラートを表示したい

# 解決したいこと
投稿などの削除をボタンを押した時に、いきなり削除されるのではなく、
確認のダイアログを表示してから削除を実行したい。
# 解決方法
link_to メソッドにdata: {confirm:""} を追加する。

```html.erb
<%= link_to post_path(@post.id), method: :delete, data: {confirm: "削除しますか？"} %>

```
上のようにlink_to にdata: {confirm: "表示したい文章"} を追加すると、
![alert.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1182947/d0ba1011-d240-5090-2834-88a264ec4e42.png)
削除ボタンを押した時に、こんな風に確認ダイアログが出てきてくれます。
あっという間にできてしまって感動です。

参考資料
https://railsdoc.com/page/link_to
ReactのuseEffectとuseReducerを用いた非同期処理

## はじめに
ReactのHooksAPIを学習したので、
useEffectとuseReducerを用いて非同期で取得したデータを表示してみる。

## ソースコードと解説
```
import React, { useReducer, useState, useEffect } from "react";
import axios from "axios";

// stateの初期値を定義しておく
const initialState = {
  isError: false,
  data: {},
};

// Reducerを定義
// アクションは
// {type: 'FETCH_SUCCESS', payload: {name: aaa}}のように定義される
const fetchReducer = (state, action) => {
  switch (action.type) {
    // 通信成功時のアクションの場合
    case "FETCH_SUCCESS":
      return {
        isError: false,
        // stateのdataに通信で取得した値が格納される
        data: action.payload,
      };
    // 通信失敗時のアクションの場合
    case "FETCH_ERROR":
      return {
        isError: true,
        data: state,
      };
    default:
      return state;
  }
};

function App() {
  // useReducerにfetchReducerとinitialStateを登録
  // dataにReducerで扱っている状態が入り、dispatchにActionを与えることを通じてStateを更新
  const [data, dispatch] = useReducer(fetchReducer, initialState);

  // 入力中の値をuseStateを使って定義
  const [inputId, setInputId] = useState("");

  // APIで送信する値をuseStateを使って定義
  const [id, setId] = useState("");

  // useEffectでは副作用を伴う処理の関数を引数に与える
  // DOMのRenderが終了後に実行される
  // 第二引数に空配列を与えると初回Render後一度だけ実行される
  // 第二引数の配列に監視したい値を入れるとその値が変化した時だけ実行されるようになる
  useEffect(() => {
    // 初回Render時のidに何も値がない場合は実行しない
    if (id === "") return;

    // アンマウントされた時に仕様
    let unmounted = false;

    // axiosで非同期通信
    axios
      .get(`https://jsonplaceholder.typicode.com/todos/${id}`)
      .then((data) => {

        // アンマウントがされているなら状態を変更しない
        if (unmouted) return;

        // dispatchに通信成功のアクションを発行。payloadには通信で取得した値を入れる
        dispatch({ type: "FETCH_SUCCESS", payload: data });
      })
      .catch((error) => {
        console.log(error);

        // 通信失敗時のアクションを発行
        dispatch({ type: "FETCH_ERROR" });
      });

    // 入力途中の値を空にする
    setInputId("");

    // useEffectではundefinedか関数を返すことができる
    // 関数を返した場合クリーンアップ関数として登録される
    // クリーンアップ関数とはアンマウントされた時などに実行される
    // 今回は先程定義したunmoutedにtrueを代入する
    // アンマウントされた場合unmoutedにtrueが代入され、
    // 状態を変更してもRenderする画面無くなっているのでif(unmouted)return;で状態を変更しない
    return () => (unmounted = true);
    // 第二引数の配列にidを指定する。idが変更された場合useEffect関数が実行される。
  }, [id]);

  return (
    <div className="App">
      <form>
        <input
          type="text"
          value={inputId}
          // inputIdをバインディングし入力された値を監視
          onChange={(e) => setInputId(e.target.value)}
        />
        <input
          type="button"
          value="取得"
          onClick={() => {
            // クリックされたらidに入力中の値をセットする。
            // ここでidの値が変化するのでuseEffectが実行される
            setId(inputId);
          }}
        />
      </form>
      {/* useEffect内の通信で取得したデータがdispatchされReducerが状態を変化後Renderされる */}
      <div>{JSON.stringify(data.data.data)}</div>
    </div>
  );
}

export default App;

```

## おわりに
Reduxなどを使わずに状態を手軽に管理できるのはいいと思った。
Tips: Rubyでresponse bodyをstreamで受け取ってNoMemoryErrorを回避する

RubyやRailsなどでHTTPリクエストを行う場合に、response bodyをstreamで受け取る方法を紹介します。
単純にリクエストをするとレスポンスの結果を全てメモリに載せてしまうので、メモリの節約や巨大なデータを取得すると`NoMemoryError`が発生してしまいます。
今回の手法はこのエラーになってしまう状態を回避する方法として有効です。

## Net::HTTPの場合

https://docs.ruby-lang.org/en/2.0.0/Net/HTTP.html#class-Net::HTTP-label-Streaming+Response+Bodies

https://docs.ruby-lang.org/ja/latest/method/Net=3a=3aHTTPResponse/i/read_body.html

にある通り、`read_body`というメソッドを用いることでstreamでデータの受け取りを行うことができます。ファイルに書き出すことでメモリを圧迫せずにデータを取得できます。

```rb
require 'net/http'

uri = URI.parse('http://example.com/')
Net::HTTP.start(uri.host, uri.port) do |http|
  http.request_get(uri.path) do |response|
    File.open("file_path", "w") do |file|
      response.read_body do |chunk|
        file.write(chunk)
      end
    end
  end
end
```

また、streamで取得したデータの累計サイズを記録しておくことで、特定のサイズでデータの取得を打ち切るようなこともできます。

```rb
require 'net/http'

uri = URI.parse('http://example.com/')
response_body = ''
total_size = 0
Net::HTTP.start(uri.host, uri.port) do |http|
  http.request_get(uri.path) do |response|
    response.read_body do |chunk|
      response_body += chunk if total_size <= 1000000 # 1Mバイトまでのデータまで受け取る
      total_size += chunk.bytesize
    end
  end
end
```


## Faradayの場合

https://lostisland.github.io/faraday/usage/streaming

にある通り、`on_data`というオプションにprocを渡すことで`read_body`と同じようなことができます（このオプションが使えるのは`Net::HTTP`をアダプタにしている場合のみです）


```rb
require 'faraday'

connection = Faraday.new(url: 'http://example.com/')
response_body = ''
connection.get('/') do |request|
  request.options.on_data = proc do |chunk, overall_received_bytes|
    puts "Received #{overall_received_bytes} characters"
    response_body += chunk
  end
end
```

また、`Net::HTTP`と同じようにファイルに書き出すこともできますし、切り捨ても行えます。


```rb
require 'faraday'

connection = Faraday.new(url: 'http://example.com/')
connection.get('/') do |request|
  request.options.on_data = proc do |chunk, overall_received_bytes|
    puts "Received #{overall_received_bytes} characters"
    File.open("file_path", "w") do |file|
      file.write(chunk)
    end
  end
end
```

```rb
require 'faraday'

connection = Faraday.new(url: 'http://example.com/')
response_body = ''

connection.get('/') do |request|
  request.options.on_data = proc do |chunk, overall_received_bytes|
    puts "Received #{overall_received_bytes} characters"
    response_body += chunk if overall_received_bytes <= 1000000 # 1Mバイトまでのデータまで受け取る
  end
end
```
VSCodeのファイルアイコンを変更する方法

#概要
VSCodeの初期状態だと拡張子を見ないとなんのファイルか分かりません。
もっと分かりやすくファイルを見分けるための拡張機能があるみたいです。

#方法
拡張機能検索に移動します。
macだとcommand + shift + xでショートカットできます。

`material-icon-theme`と検索してインストールします。

settings.jsonに

```.json
{
    "workbench.iconTheme": "material-icon-theme",
}
```

を加えると変更できます。
プログラミング言語のパッケージ管理ツール

## PHPのパッケージ管理ツール
### [Composer](https://getcomposer.org/)
- PHPのパッケージ管理ツール
- [Packagist](https://packagist.org/)に登録されているパッケージをインストール出来る
- サーバ内のアプリ毎にライブラリの構成を設定することが可能

### [PEAR](https://pear.php.net/)
- PHPパッケージのインストールツール
- PEARのパッケージをインストール出来る
- アプリケーション毎にパッケージの構成を設定することは難しい
- PHP7.4からデフォルトでインストールされなくなった
- PHPで動作するのでPECLより遅い

### [PECL](https://pecl.php.net/)
- PHPパッケージのインストールツール
- PECLのパッケージをインストール出来る
- アプリケーション毎にパッケージの構成を設定することは難しい
- C言語で動作するのでPEARより高速

## JavaScriptのパッケージ管理ツール

### [Node Package Manager(NPM)](https://www.npmjs.com/)
- JavaScriptの公式パッケージ管理ツール
- [npmjs.com](https://npmjs.com)に登録されているパッケージをインストール出来る
- 昔は使いづらかったが最近は改良が進んで使いやすくなった

### [yarn](https://yarnpkg.com/)
- JavaScriptの非公式パッケージ管理ツール
- [npmjs.com](https://npmjs.com)に登録されているパッケージをインストール出来る
- 昔のNPMと比べるとかなり優秀だったが、今のNPMと比べると少し優秀くらい
パッケージ管理システムとパッケージリポジトリまとめ

OS毎のパッケージ管理システムを調べた時のメモ
# OSのパッケージ管理システムとリポジトリ

## RedHat系Linuxのパッケージ管理システム
### [RPM Package Manager(RPM)](http://rpm.org/)
- RPMパッケージを管理するシステム
- RMPパッケージファイルを用意するかURLを指定しないとパッケージのインストールが出来ない
- 依存関係の自動解決はしてくれない
- リポジトリと連携していない

### [yum](http://yum.baseurl.org/)
- RPMパッケージを管理するシステム
- パッケージ名を指定するすだけでパッケージのインストールが出来る
- 依存関係の自動解決してくれる
- 内部でrpmを使用している
- リポジトリと連携している
- Python2で書かれている

### [dnf](https://rpm-software-management.github.io/)
- RPMを管理するシステム
- yumを改良したもの
- ドキュメントが整備されている
- 依存性の解決方法を改良
- Python3にも対応している

## サードパーティ製のRPMパッケージリポジトリ
### [EPEL(Extra Packages for Enterprise Linux)](https://fedoraproject.org/wiki/EPEL)
- Red Hat Enterprise Linux(RHEL)向けの高品質追加パッケージを集めたリポジトリ
- RHELやCentOS以外でも使用可能
- 公式はサポートしてない
- Amazon Linux Extrasでインストール可能

### [Remi Repository](https://rpms.remirepo.net/)
- 最新のPHPとその周辺のパッケージを提供するリポジトリ
- EPELに依存しているので先にEPELをインストールする必要がある
- 公式はサポートしていない

### [RepoForge (旧RPMForge)](http://repoforge.org/)
- 2014年頃からメンテナンスされていないリポジトリ
- 使用している場合は別のリポジトリに移行したほうがいい

## Debian系Linuxのパッケージ管理システム

### [dpkg](https://wiki.debian.org/Teams/Dpkg)
- depパッケージを管理するシステム
- depパッケージファイルを用意するかURLを指定しないとパッケージのインストールが出来ない
- 依存関係の自動解決はしてくれない
- リポジトリと連携していない

### [apt](https://wiki.debian.org/Apt)
- depパッケージを管理するシステム
- パッケージ名を指定するすだけでパッケージのインストールが出来る
- 依存関係の自動解決してくれる
- 内部でdpkgを使用している
- リポジトリと連携している

## サードパーティ製のdepパッケージリポジトリ
### [dotdeb](https://www.dotdeb.org/)
- Debian系の追加パッケージを提供する
- 公式はサポートしていない

その他のリポジトリについては下記から検索可能
[Debianのパッケージ検索](https://www.debian.org/distrib/packages)
[Ubuntuのパッケージ検索](https://packages.ubuntu.com/ja/)

## Windowsのパッケージ管理システム
### [winget](https://github.com/microsoft/winget-cli)
- Microsoft製のパッケージ管理システム
- 現在プレビューの段階(2021年3月現在)

### [AppGet](https://github.com/appget/appget)
- サードパーティ製のパッケージ管理システム
- 色々あってメンテナンスを終了した
pod install するとCocoaPods could not find compatible versions for pod "cloud_firestore" のエラー


##背景

https://firebase.google.com/docs/flutter/setup?hl=ja#analytics-enabled

上記のチュートリアルに取り組む中、pod install をしたところ、次のエラーが出ました。

```
 [!] CocoaPods could not find compatible versions for pod "cloud_firestore":
  In Podfile:
    cloud_firestore (from `.symlinks/plugins/cloud_firestore/ios`)

Specs satisfying the `cloud_firestore (from `.symlinks/plugins/cloud_firestore/ios`)` dependency were found, but they required a higher minimum deployment target. 

[!] Automatically assigning platform `iOS` with version `9.0` on target `Runner` because no platform was specified. Please specify a platform for this target in your Podfile. See `https://guides.cocoapods.org/syntax/podfile.html#platform`.
```
##原因
パッケージの cloud_firestore のバージョンに対して、platformのiOSのバージョンが低いということを言っています。

##解決
platformのバージョンを指定しているPodfileを編集します。Podfileの一番上です。
以下のようにデフォルトではバージョンが9.0に設定されており、コメントアウトされています。

```
# Uncomment this line to define a global platform for your project
#platform :ios, '9.0'
```
書いてある通り、バージョンを上げてコメントを無効にします。

```
# Uncomment this line to define a global platform for your project
platform :ios, '10.6'
```
現時点(2021/3/21)ではiOSのデフォルトが10.6と書いてあるので、従いました。

https://guides.cocoapods.org/syntax/podfile.html#platform

以上で、

```
pod install
```
がうまくいきました。
アルゴリズム自分用まとめ002(全探索② bit全探索)

#概要
自分のために、アルゴリズムで身に付けた内容・コードをまとめておく。

全探索の、bit全探索。

- for文を二重三重にして回す
- bit全探索
- DFS
- BFS

#内容
bitを使って、$2^n$ 通りを調べる全探索

https://qiita.com/yo314159265/items/de353fa6296c13bf37c4

```cpp:コード概観
#include<bits/stdc++.h>
...
vector<int> A(100);
...
for (int bit=0; bit<(1<<100); bit++)
  for (int i=0; i<100; i++)
    if (bit & (1<<i))
      do_something(A[i]);
```
(`bit<(1<<100)`と`bit & (1<<i)`がkey)

#参考にさせていただいた頁・本
- https://qiita.com/yo314159265/items/de353fa6296c13bf37c4
アルゴリズム自分用まとめ001(全探索①for)

#概要
自分のために、アルゴリズムで身に付けた内容・コードをまとめておく。

全探索の、for。

- for文を二重三重にして回す
- bit全探索
- DFS
- BFS

#内容

for 文を組み合わせて、すべての可能性を考える。

https://qiita.com/yo314159265/items/e7551a82d4c395fedc0a


```cpp:コード概観
#include<bits/stdc++.h>
...
vector<int> A(100), B(100);
...

for (int i=0; i<100; i++)
  for (int j=0; j<100; j++)
    do_something(A[i], B[j]);
```

#参考にさせていただいた頁・本
- https://qiita.com/drken/items/e77685614f3c6bf86f44
AWS認定クラウドプラクティショナーを受けてきた

# 概要
「AWS認定クラウドプラクティショナー」の試験を受けてきました。
その合格体験記という形で、記事にしました。これから受講する方は参考にしてください。
<b>※私自身は、クラウドを触った事のない初心者です。</b>

ただ、一応アプリケーションエンジニアをやっているので、
それなりにインフラ＆サーバー周りは、普通の人よりかは知見があると思います。


# 書籍購入
以下の書籍を購入しました。

<b>「一夜漬け AWS認定クラウドプラクティショナー」</b>
![shopping.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/644011/745cef51-ed67-41f7-4a61-7edd899fd8cc.jpeg)


クラウドプラクティショナーの書籍の中で一番読みやすく、
ボリュームがあまりなかったからです。（※やはり勉強時間は短く取得したいもの…）
ただ、今思ってみると、本書籍を購入してよかったなと思います。

クラウドプラクティショナーの試験は、勉強する書籍の内容も大事ですが、
<b>どれだけ多くの問題を解いて、どんな内容が来ても対応できるようになるか？</b>
が一番大事だとおもっており、この書籍の最後にある練習問題も質は非常に良いものです。

また、この後記載するUdemyの問題集とも差別化も図れる練習問題だと思っています。
自分は本書籍を一通り目を通したあと、練習問題のみ、ひたすら解いていました。


# 問題集
Udemyの以下問題集を購入しました。
本問題集はクラウドプラクティショナーを受けるなら、やるのが安定かと思います。

【この問題だけで合格可能！AWS 認定クラウドプラクティショナー 模擬試験問題集（7回分455問）】
https://www.udemy.com/course/aws-4260/

ただ、本問題集の"応用レベル"は非常にレベルが高いものなので、
得点自体は悪くてもあまり気にしない方がいいかと思います。
（※自分は初めて受けた時は、30％しか正解しなかったとかザラでした。）

問題を解いて、解説で知識を付ける事が一番大事な事だと思います。

あと「オプショナル問題（難易度高：アソシエイト試験レベル）模擬試験2回分130問」は、明らかに難しそうな気がしたので、
こちらは、私はやりませんでした。

# 試験日の変更
受験申し込み後、受験日を変更しようと思った事があり、ピアソンVUEで申込みを行ったのですが、
以下手順で変更する事が出来ました。

①「AWS Training & Certification」にログインして、試験の申込をクリックする。
![無題2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/644011/8423e5cb-1f72-62d4-18b4-876d769d1592.png)
②「スケジュール済みのAWS認定試験」の、右下の「スケジュール変更」から変更出来ました（※もちろん無料で）
![無題3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/644011/7ec84899-bd5d-50e3-3849-5eaaa41f4c60.png)

# 結果不合格…
試験を受けてきましたが、結果「不合格」でした。（残念！）
スコアは、<b>667点</b>でした。（※700点以上で合格）

65問ある中で、あと3・4問あっていれば、合格できたと思うのでそんなに悲観しておりませんでした。
※勉強時間としては、2週間程度業務をこなしながら勉強をしてきた感じで、もう少しやりこめば合格出来ると思ったので。

その時ディスプレイに表示された内容だと、<b>15日期間があけば、再受験できる</b> という事だったので、
２週間後の土曜日（19日後）にまたチャレンジしようと思いました。

[試験結果のお知らせ]
![無題02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/644011/bf21eac8-7d86-1e99-2029-e47d5bb72d94.png)


# 再度、試験勉強
基本的には、今までやってきた練習問題の問題＆解答の見直しを行い、
解答の精度を高める事に費やしました。

それに加えて、以下の問題集を新しく購入して解きました。
【AWS認定　クラウドプラクティショナー　模擬問題集 Kindle版】
https://www.amazon.co.jp/exec/obidos/ASIN/B081D4ZJ5G/hatena-blog-22/

模擬問題集として、65問の問題集が２回分収納しております。
本番前の模擬試験として活用してみるととても良いものでした。
（Udemyの問題集より難易度は低いと思いますし）

試験前に上記問題集を解いてみて、２回とも合格点はクリアしていたと思うので、
万全の態勢で試験を迎える事が出来ました。

# 無事合格
試験前上記問題集を、無事に合格できました。
得点は、<b>830点</b>だったので、余裕をもって合格が出来たかと思います。
半月前から153点もスコアがあがったので、短期間でも集中して勉強すれば十分効果は出る事を実感しました。

[試験結果のお知らせ]
![無題03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/644011/cec9ca6c-8a40-a5e5-6108-fbcfd9cde003.png)


# 終わりに
試験を受けてみて、試験勉強が嫌だからという理由で、
あやふやな知識のまま試験を受けに行くのは危険だと思いました（当然ですが。笑）

１回目の知識の状態でも、数打てば合格出来たかと思いますが、
今回みたいに落ちた後、半月きっちり勉強する事によって、スコアも安定するようになったので、
もし同じようにギリギリに落ちたてしまった方がいても、めげずに半月勉強して、試験に臨んでみて下さい。

またアソシエイトを受けたら、Qiitaに記事載せようかと思っておりますので、
またその時見て頂けると嬉しいです。

以上、ここまで読んでくださりありがとうございました。
ペライチで追っかけボタンを作成する（要レギュラープラン）

#やりたいこと
スクロールしてもずっと画面の下にくっついてくる例の緑っぽいボタン！

#前提
ペライチのレギュラープランが必要です

#やること
##1.htmlブロック要素を追加
ブロックの挿入 > HTML埋め込み
※[link]は任意のURLに付け替え

```html
<div id="float-div">
    <a href='[link]' target="_blank" >追っかけボタン</a>
</div>
```

##2.JS/STYLEの追加
ページ情報埋め込み > headタグ内の埋め込み


```html
<style>
    #float-div {
        width: 200px;
        height: 60px;
        position: fixed;
        right: 7vw;
        bottom: 3vh;
        background: #56C500;
        opacity: 0.8;
        border-radius: 5px;
    }

    #float-div a {
        display: block;
        position: absolute;
        margin: 0 auto;
        top: 25%;
        text-align: center;
        width: 100%;
        text-decoration: none;
        font-size: 18px;
        font-weight: bold;
        color: #fff;
    }
</style>
```
Rails sして無限ループから抜けられなくなった時の解決法【超初心者】

redirect_toしたら永遠にクルクル回ってしまった！！！

```console:コンソール
$ps -ef | grep puma
```
すると```ec2-user 1234 23456 82 10:26 pts/3    00:04:41 puma 8.11.7 (localhost:2000)```みたいなのが出てくる

```console:コンソール
kill -9 1234
#書いてある数字
```

したらpumaがストップしました、、、
良かったです、、、
Vゲートとは？

# この記事について
Amazon Braketでは、イオントラップ型のIonQが利用可能ですが、使えるゲートセットは下記の通りです。[^1]

https://docs.aws.amazon.com/braket/latest/developerguide/braket-developer-guide.pdf#page=13

<img width=800 src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183826/45e08e44-b7ab-418f-478a-f5521f24d05c.png>

X、Y、Z‥‥と続きますが、一つ見慣れぬゲートが、、

```math
V？
\ \ \ \ VI？
```

この$V$、$VI$ゲートについて確認していきたいと思います。
小ネタです。

また、他の量子コンピュータ関係の他の記事は、下記で紹介しています。

https://qiita.com/shnchr/items/41fa7fd1284d74007a7c

$$
% basic braket 
\newcommand{\bra}[1]{\left\langle #1 \right|}
\newcommand{\ket}[1]{\left| #1 \right\rangle}
\newcommand{\bracket}[2]{\left\langle #1 \middle| #2 \right\rangle}
\newcommand{\ketbra}[2]{\left| #1 \right\rangle \left\langle #2 \right|}
\newcommand{\ketbraket}[3]{\left| #1 \right\rangle \left\langle #2 \middle| #3 \right\rangle}
% small-size
\newcommand{\bras}[1]{\left\langle {\scriptsize #1}  \right|}
\newcommand{\kets}[1]{\left| {\scriptsize #1}  \right\rangle}
\newcommand{\brackets}[2]{\left\langle {\scriptsize #1} \middle| {\scriptsize #2} \right\rangle}
\newcommand{\ketbras}[2]{\left| {\scriptsize #1} \right\rangle \left\langle {\scriptsize #2} \right|}
\newcommand{\ketbrakets}[3]{\left| {\scriptsize #1} \right\rangle \left\langle {\scriptsize #2} \middle| {\scriptsize #3} \right\rangle}
% Matrix
\newcommand{\tate}[2]{\begin{bmatrix} #1 \\ #2 \end{bmatrix}}
\newcommand{\yoko}[2]{\begin{bmatrix} #1 & #2 \end{bmatrix}}
\newcommand{\mtrx}[4]{\begin{bmatrix} #1 & #2 \\ #3 & #4 \end{bmatrix}}
$$

# Vゲートとは？
結論から言うと、$V=X^{1/2}$ゲートの様です。
なお、分数のつくゲートについては、下記で扱っています。

https://qiita.com/shnchr/items/34afbf8d977d9340a81a

では、確認してみましょう。

# Braket SDKで確認
Braketでは、物理マシン（Rigetti／IonQ）への抽象化をSDKで提供しており、実機に接続しなくとも同等の操作（シミュレーション）が、SDK単体で可能です。

今回の確認であれば、下記で確認可能です。

```python
from braket.circuits import Circuit
from braket.devices import LocalSimulator

# Local Simulator
device = LocalSimulator()

# V Gate
circ = Circuit().v(0)

# return state_vector
circ.state_vector()

# Check circuits
print(circ)

# run
task = device.run(circ, shots=0)
result = task.result()

# result
print(result.values)
```

# Vゲート適用後の状態ベクトルは

```text
[array([0.5+0.5j, 0.5-0.5j])]
```

Z測定の結果が、

```math
V\ket{0} = 
\frac{1 + i}{2}\ket{0} + \frac{1 - i}{2}\ket{1} = X^{\frac{1}{2}}\ket{0}
```

ということで、

```math
V = X^{\frac{1}{2}}
```

# VIゲート適用後の状態ベクトルは
```
[array([0.5-0.5j, 0.5+0.5j])]
```

となり、

```math
VI\ket{0} = 
\frac{1 - i}{2}\ket{0} + \frac{1 + i}{2}\ket{1} = X^{-\frac{1}{2}}\ket{0}
```

ということで、

```math
VI = X^{-\frac{1}{2}}
```

# まとめ
見慣れない$V,VI$ゲートですが、確認してみるとそれぞれ$X^{\frac{1}{2}},X^{-\frac{1}{2}}$ゲートでした。


[^1]: https://docs.aws.amazon.com/braket/latest/developerguide/braket-developer-guide.pdf#page=13 より引用
AtCoder自分用まとめ014(ARC061C たくさんの数式)

#概要
自分のために、AtCoderで身に付けた内容・コードをまとめておく。

#内容
https://atcoder.jp/contests/arc061/tasks/arc061_a
>1 以上 9 以下の数字のみからなる文字列 Sが与えられます。 この文字列の中で、あなたはこれら文字と文字の間のうち、いくつかの場所に + を入れることができます。 一つも入れなくてもかまいません。 ただし、+ が連続してはいけません。
このようにして出来る全ての文字列を数式とみなし、和を計算することができます。
ありうる全ての数式の値を計算し、その合計を出力してください。

```:入力形式
S
```

##C++
```cpp
#include <bits/stdc++.h>
using namespace std;

int main() {
  string S;
  cin >> S;
  int N = S.size();
  long long res = 0;
  for (int bit = 0; bit < (1<<(N-1)); ++bit) {
    long long tmp = 0;
    for (int i = 0; i < N-1; ++i) {
      tmp *= 10;
      tmp += S[i] - '0';
      if (bit & (1<<i)) res += tmp, tmp = 0;
    }
    tmp *= 10;
    tmp += S.back() - '0';
    res += tmp;
  }
  cout << res << endl;
}
```
`S[i] - '0'`は、charをintに変換するトリック。
`'0'`は48で、例えば`'5'`は53。(ASCIIコード)

##Vim
編集中


#参考にさせていただいた頁・本
- https://atcoder.jp/contests/arc061/tasks/arc061_a
- https://drken1215.hatenablog.com/entry/2020/04/11/171900
- https://stackoverflow.com/questions/31490145/what-does-si-0-mean
[Rails]コントローラのbefore_actionでインスタンス変数を定義するのはやめよう

# 前提

この記事で書いているインスタンス変数は全てview側で参照しているものとします。

# まずは結論から

↓のように、view側で使うインスタンス変数をbefore_actionで初期化するのはやめましょう。

```ruby
class PostsController < ApplicationController
  before_action :set_post, only: [:show, :edit]

  def show; end

  def edit; end

  private

  def set_post
    @post = Post.find params[:id]
  end
end
```

# なぜ何故よくないのか


view側でインスタンス変数が呼び出されてるのを見たとき、普通は真っ先にコントローラーのアクションを見に行きます。
その時にアクションの中でインスタンス変数が初期化されてない場合、どこで初期化されたか探す必要が出るためコードの可読性が下がります。
↑のコードはまだ一目見てわかるようになっていますが、例えば、

```ruby
class PostsController < ApplicationController
  before_action :set_post, only: [:show, :edit]

  def show; end

  def edit; end

  # ここに行数が長いコード

  private

  # ここに行数が長いコード

  def set_post
    @post = Post.find params[:id]
  end
end
```

このように行数の長いコードが挟まってると、画面には収まりきらずどこでインスタンス変数を初期化したか探す羽目になります。

上記のコードの場合、コントローラ名、インスタンス変数名共に `post` を使ってるので、Railsに慣れてる方なら「多分before_actionだろうな」とすぐに気が付きますが、以下のように、

```ruby
class PostsController < ApplicationController
  before_action :set_post, only: [:show, :edit]
  before_action :set_foo, only: [:show, :edit]
  before_action :set_bar, only: [:show, :edit]

  def show; end

  def edit; end

  # ここに行数が長いコード

  private

  # ここに行数が長いコード

  def set_post
    @post = Post.find params[:id]
  end

  def set_foo
    @foo = # ここに @foo 初期化処理
  end

  def set_bar
    @bar = # ここに @bar 初期化処理
  end
end
```

こうなってくると、Railsに慣れてる方でも探すのに苦労するようになってきます。

これならまだ `set_` のプレフィックスがあるので何とか付いていけますが、例えば `check_role` みたいなbefore_actionで `@role` インスタンス変数を初期化していると、本格的にわけわからなくなってきます。（実際にこのような書き方でインスタンス変数探すのに苦労した案件が一部あります。）


# 解決案1

やはり、アクションで必要なインスタンス変数を初期化するのが王道でしょうか。

```ruby
class PostsController < ApplicationController
  def show
    @post = get_post(params[:id])
    @foo = get_foo
    @bar = get_bar
  end

  def edit
    @post = get_post(params[:id])
    @foo = get_foo
    @bar = get_bar
  end

  # ここに行数が長いコード

  private

  # ここに行数が長いコード

  def get_post(id)
    Post.find id
  end

  def get_foo
    # ここに foo 取得処理
  end

  def get_bar
    # ここに bar 取得処理
  end
end
```

# 解決案2

または、以下のようにhelper_methodにしてしまってもよいと思います。

```ruby
class PostsController < ApplicationController
  helper_method :post
  helper_method :foo
  helper_method :bar

  def show
  end

  def edit
  end

  # ここに行数が長いコード

  private

  # ここに行数が長いコード

  def post
    @post ||= Post.find params[:id]
  end

  def foo
    # ここに foo 取得処理
  end

  def bar
    # ここに bar 取得処理
  end
end
```

そしてview側では **インスタンス変数ではなくヘルパーメソッド** を呼び出します。

```erb:views/posts/show.html.erb
<p><%= post.body %></p>

<p><%= foo %></p>

<p><%= bar %></p>
```

これだと「before_action使ってる時とあまり変わらないじゃないか」と思う方もいるかもしれませんが、
`helper_method` はviewから呼び出すことが前提のメソッドなので、インスタンス変数初期化以外の用途でも使う before_action よりは「あ、これview側で使うんだな」ということがぱっと見で伝わります。

また、`helper_method` を使った場合、view側がインスタンス変数に依存しなくなるので、例えば `@pest` のようなtypoをやらかしてもその場でエラーを吐くのですぐに気が付けます。


# まとめ

システムの規模が大きくなるとbefore_actionで初期化したインスタンス変数を探すのがしんどくなるのでやめよう。
M1 mac で miniforge をインストールして環境構築

# 目的
miniforgeをインストールして、Pythonを動かせる環境を構築する！

### miniforge構築しようと思ったキッカケ
機械学習について調べた際に、ニュートラルネットワークがとても気になり、ライブラリーを使わず再現したいと思ったのが始まりです。
ニュートラルネットワークについて記載している「ゼロから作るDeep Learning」に沿って、anacondaをインストールしようと試したが、何度やっても上手くいかず、、、。よく調べてみると、現状M1 macだと、anacondaは上手く動かないらしい。。。。(詳しくは、調べると出てきます。)
仕方ないので、M1 mac上でも動くminiforgeをインストールして環境構築するこにしました。

### miniforgeとは
miniforgeは コミュニティ。conda環境で必要最小限のパッケージです。


# miniforge をインストール
https://github.com/conda-forge/miniforge から[Miniforge3-MacOSX-arm64]をダウンロードします。ダンロードが完了したら、ターミナル上で以下のコマンドを実行していきましょう。

```terminal
# ダウンロードした[Miniforge3-MacOSX-arm64]が入ったディレクトリまで移動
cd Downloads

# インストールフォルダを指定してインストール
bash Miniforge3-Linux-x86_64.sh
```

あとは、時々聞かれる質問に[yes]と答えて行けば、インストールされます。

### インストールされていることを確認

ターミナル上で以下を実行しましょう。

```terminal
open ~/.bash_profile
```
以下のように、condaの初期化処理が ~/.zshrc に書き込まれることが確認できれば、インストール成功です。

```terminal
# >>> conda initialize >>>
# !! Contents within this block are managed by 'conda init' !!
__conda_setup="$('/Users/●●/miniforge3/bin/conda' 'shell.zsh' 'hook' 2> /dev/null)"
if [ $? -eq 0 ]; then
    eval "$__conda_setup"
else
    if [ -f "/Users/●●/miniforge3/etc/profile.d/conda.sh" ]; then
        . "/Users/●●/miniforge3/etc/profile.d/conda.sh"
    else
        export PATH="/Users/●●/miniforge3/bin:$PATH"
    fi
fi
unset __conda_setup
# <<< conda initialize <<<
```

インストールが完了すると、自動的にconda環境になるため、以下のコマンドをターミナルで打ち込み、自動でconda環境にならないようにしておきましょう。

```terminal
conda config --set auto_activate_base false
```

conda環境のオン•オフは以下のとおりです。

```terminal
# conda環境オン。オンになると、”(base)”がついてきます。
conda activate
# conda環境オフ
conda deactivate
```

最後に、conda環境上で、以下を実行すると、pythonを実行するための環境が構築します。

```terminal
conda create -n ●●(名前) python=3.9
```

最後に、環境構築されたことを以下のコマンドで確認します。

```terminal
conda list
```

リストに名前があれば成功です！

### 参考資料
miniforgeをインストールする際、以下を参考にさせていただきました。
M1 MacにPythonインストールして開発環境構築してみた https://note.com/osmszk/n/n277447e8c2a4
conda 公式ドキュメント https://docs.conda.io/projects/conda/en/latest/commands.html#conda-vs-pip-vs-virtualenv-commands
AppleSilicon M1 Macにpythonをインストールする https://braveam.com/archives/1409