OmniAICreator/Qiita-1.07M huggingface dataset:
コンセンサス・アルゴリズムとは？

### 前提

ブロックチェーンネットワークは1箇所もしくは1つの団体で管理されているのではなく、複数のノード（コンピュータ）が参加することによって管理されている。

### ネットワーク内で起こっていること

ネットワーク内である一定のトランザクションの量が溜まったら、それらを一塊（ブロック）としてその前に作成されたブロックと結びつけようとする。その際に複数のマイナー（マイニングをする人）によるマイニング（ある計算問題を解き、解を見つける作業）によってそのブロックが正しいものであることが証明される。

### なぜコンセンサス・アルゴリズムが必要なのか？

通常マイナーたちは同じトランザクションの記録や計算処理を行っているため、マイナーごとの処理の結果は全く同じになるはず。しかし、実際には多少の計算ミスや、悪意のあるノードがトランザクション内容を都合の良いように書き換え、全員の答えが一致しない場合がある。

⇒ **そのような最終的なトランザクションの処理の結果がマイナーごとに異なった場合に、どのマイナーの結果を正しいと処理をするかを決める必要があるから。**

### 単語の意味

consensus = 「意見の一致、総意」の意味。

# 代表的なアルゴリズム

- PoW (Proof of Work)
    
    最も早く計算処理を行なったマイナーの答えを正しいものとする。よって、計算処理の速度が求められるため、必然的にマシンパワーを向上させる必要がある。51%攻撃を仕掛けられる可能性がある。
    
- PoS (Proof of Stake)
    
    コインを持っている割合（Stake）で、報酬獲得率を決める。マイニングではなく、フォージングと呼ばれている。PoWの欠点を突いた51%攻撃を再現する場合、発行数の51%を保有する必要があるため不正は困難。仮想通貨の保有数によってブロック生成者を決定するため、出来高を下げてしまうデメリットがある。
    
- PoI (Proof of Importance)
    
    保有量と取引回数、そして取引量に応じて報酬をもらうことができる。主にネムで採用されているコンセンサス・アルゴリズム。マイニングではなく、ハーベストと呼ばれている。取引回数も考慮に入れることによって、出来高が下がらない仕組みになっている。
    
- PoC (Proof of Consensus)
    
    権限を与えられた特定のノードがブロックの生成を行うことができる。ノードが不特定多数ではないので51％攻撃は発生しないが、非中央集権性が損なわれている。
    

| アルゴリズム名 | 主な採用仮想通貨 | 特徴 |
| --- | --- | --- |
| PoW | ビットコイン | 取引情報の計算を行う演算力に応じてブロック生成者を決定 |
| PoS | イーサリアム | 仮想通貨の保有量に応じてブロック生成者を決定 |
| PoI | ネム | 仮想通貨の保有量・取引数・取引量に応じてブロック生成者を決定 |
| PoC | リップル | 信用の高い企業など特定のノードがブロック生成者となる |

# PoWの具体的に行なっていること

![Screen Shot 2022-08-27 at 10.37.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2987391/b4f86327-9b0a-afb0-d2b5-93193dff4cf6.png)

![Screen Shot 2022-08-27 at 10.38.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2987391/4dc033eb-297f-ccda-fbb4-65cca8bd3870.png)

### マイニング

1. 前のブロックのハッシュ値とトランザクション内容とチャレンジ値（最終的にnonceと言われる問題の解）をブロックにしてハッシュ値を生成する。
2. ハッシュ値の先頭がディフィカルティ（この計算問題の難易度）で決められた数の分だけ0が出てくるまでチャレンジ値を変更していく。
3. 期待されるハッシュ値が見つかった場合、その時のチャレンジ値がnonceとなりブロックが生成される。

**トランザクション内容が改ざんをされてなく同じならば、どのマイナーが計算しても同じnonceが出てくるため、これを使って合意（コンセンサス）を取ることができる。**

# 最後に
![Frame 9 (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/672609/87f2a488-c5cd-549d-f07f-01b44a1317b8.png)
<b>Veroo</b>は、Blockchain技術を活用した「想いの巡るグルメSNSアプリ」です。食に対する熱量、例えばラーメンがめちゃくちゃ好きで年間400杯食べているとか、変態的に具材にこだわった中華料理を作っているなどのような、今まで直接お金にはならなかった食に対する情熱や熱量、その裏側にある想いがトークンを使うことで巡る世界。自分のラーメンに費やす熱量がコミュニティに承認される。自分がほんとにいいと思って作った食べ物がコミュニティで広まる。Verooは単なるSNSアプリではなく、クリエイターたちの想いが紡がれるソーシャルグルメアプリです。

##### Homepage: https://veroo.xyz/
##### Discord URL：https://t.co/VoT0gpsflA
toggle(トグル)の使用方法

## 概要
ビデオ通話実装中に、マイク機能とスピーカー機能、カメラの反転機能の実装をしていた時に、switch文を用いてtrueとfalesを判別していました。しかし、その条件分岐を3つの機能にそれぞれ、記述しないといけなかったのでかなり可読性が低いコードになっていました。そこで、レビュー時にtoggle（)というものを教えていただいたので、備忘録を残しておきます。

## 前提条件
「そもそも、toggleとは何ぞや？」ということで、Apple公式ドキュメントを調べてみました。
ドキュメントには、こう書かれていました。
> 「Use this method to toggle a Boolean value from true to false or from false to true.」
```Apple.swift
var bools = [true, false]
bools[0].toggle()
// bools == [false, false]
```
要するに、「変数が持っている現状のBool値を切り替えたい時に使えよ！(もちろん、定数ではない。)」とのことです。

###### Apple公式ドキュメント
https://developer.apple.com/documentation/swift/bool/toggle()/

自分は、今まで以下のように実装をしてかなり面倒な実装をしていたので「toggle()」に出会って人生が変わりました！（大嘘)

## 実装方法
それでは、実際にどのようにtoggle()を用いてリファクタリングしたのかを確認してみましょう！
まずは、リファクタリング前のswitch文での条件分岐から！（コードが汚いかもしれませんが、ご了承ください。）

```BeforeSwitch.swift
    @IBOutlet private weak var speakerButton: UIButton!
    private weak var isSpeakerOn = true
    @IBAction private func tappedMic(_ sender: UIButton) {
        swith isSpeakerOn {
        case .true:
            //スピーカー機能オフ
            speakerButton.background = 暗い系の色
            isSpeakerOn = false
        case .false:
            //スピーカー機能オン
            speakerButton.background = 明るい系の色
            isSpeakerOn = true
        }
    }
```

まぁ安易にやりがちなコードの書き方かなと思います。
次はリファクタリング後です。

```AfterSwitch.swift
    @IBOutlet private weak var speakerButton: UIButton!
    private weak var isSpeakerOn = true
    @IBAction private func tappedMic(_ sender: UIButton) {
        //スピーカー機能オンとオフの機能
        let backgroundColor: UIColor = isSpeakerOn ? 暗い系の色 : 明るい系の色
        isSpeakerOn.backgroundColor = backgroundColor
        //ここで、toggleを使用する！
        isSpeakerOn.toggle()
    }
```

実際には、BeforeSwitch.swiftのswitch文の中にもっと色んな要素が入っていましたが、上記のように、toggle()と三項演算子をうまく活用することで、より可読性が高いコードを書くことができました！
やはり、switch文は場合分けを可視化するにはいいかもしれませんが、「可視化すること=可読性の向上」にならないということを改めて学びました。
レビューしていただくと本当に勉強になります！

ちなみに、toggleとは以下の辞書によると、電子計算機の2つの状態をトグルで切り換えるという意味で、そもそも英語では、toggle単語は一般的に使われるんですかね。英単語を調べたりしながら実装すると理解しやすい。

https://ejje.weblio.jp/content/toggle

## さいごに
今回はレビューをしていただき、提案していただいてtoggle()の存在を知りましたが、今後は自分でも「ここはこのように書けば、もっと可読性が良くなるのでは？」という視点を持ってコードを書いていきたいと思います！
VSCodeで複数のgo.modを持つディレクトリを開くとBrokenImportが出る

# 問題

VSCodeで開いるプロジェクトディレクトリ下に複数の`go.mod`が存在すると、`BrokenImport`のメッセージが出てしまいます。

![Screen Shot 2022-11-30 at 19.27.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/676735/3ca2a10b-1ae6-3411-bd67-22c684392354.png)

# 解決法
各`go.mod`が存在するディレクトリがそれぞれworkspaceであることを明示するために `go.work` を作成します。

例えば`./gin/go.mod` `./http/go.mod` があるとしたら以下を実行します。
```bash
$ go work init ./gin ./http
```

そうすると以下のファイルがプロジェクトディレクトリ直下に作成されます

```go.work
go 1.18

use (
	./gin
	./http
)
```

`go.mod`が多い場合は、`go work init`を実行してできた空の`go.work`にエディタのサジェストに頼りながら手入力するのも速いかもしれません。
![Screen Shot 2022-11-30 at 19.34.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/676735/eb2e5162-33e0-4e2e-ae4d-004edbb7acc7.png)

# 参考
- 公式 https://go.dev/doc/tutorial/workspaces#create-the-workspace

(検索用)warningの中身

```
could not import github.com/gin-gonic/gin (cannot find package "github.com/gin-gonic/gin" in any of 
	/usr/local/go/src/github.com/gin-gonic/gin (from $GOROOT)
	/Users/xxxx/go/src/github.com/gin-gonic/gin (from $GOPATH))compilerBrokenImport
```

以前は以下のメッセージが出ており、vscode側の設定`experimentalWorkspaceModule`でも解決できましたが、この設定は今年5月にdeprecatedとなったみたいです。https://github.com/golang/go/issues/52897
```
gopls requires a module at the root of your workspace.
You can work with multiple modules by opening each one as a workspace folder.
Improvements to this workflow will be coming soon, and you can learn more here:
https://github.com/golang/tools/blob/master/gopls/doc/workspace.md.
```
picoCTF Writeup picoGym Practice Challenges It is my Birthday (注意<spoiler>)

# It is my Birthday
Description
I sent out 2 invitations to all of my friends for my birthday! I'll know if they get stolen because the two invites look similar, and they even have the same md5 hash, but they are slightly different! You wouldn't believe how long it took me to find a collision. Anyway, see if you're invited by submitting 2 PDFs to my website. http://mercury.picoctf.net:11590/

hash collisionを使用する。

https://github.com/corkami/collisions#pdf

ここからMD5値のPDFをダウンロードしてアップロードを行えばPHPコードが現れ、フラグが見つかる。

picoCTF{c0ngr4ts_u_r_1nv1t3d_3d3e4c57}
フィボナッチ数列

出力1 2 3 5 8 13 21 34 55
```java
int [] argo = new int [3];
                argo [0]=0;
                argo [1]=1;
                argo [2]=argo [0]+argo [1];
                // System.out.print(argo [0]);
                // System.out.print(" ");
                // System.out.print(argo [1]);
                // System.out.print(" ");
                // System.out.print(argo [2]);
                // System.out.println(" ");
                
            for(int i = 0;i<=10;i++){

                //argo [2]=argo [0]+argo [1];
                argo [0]=argo [1];
                argo [1]=argo [2];
                argo [2]=argo [0]+argo [1];
                //System.out.print("argo [0]"+argo [0]);
                System.out.print(" ");
                System.out.print(argo [1]);
                System.out.print(" ");
                System.out.print(argo [2]);
                //System.out.println("");
                System.out.print(" ");
                argo [0]=argo [1];
                argo [1]=argo [2];
                argo [2]=argo [0]+argo [1];
            } 
```
AWSのリソース棚卸しアプリを公開しました

# 概要
AWSのコンピューティングリソース（EC2、RDS、ECSサービス）を一覧化してCSV出力するアプリを公開しました。

[AWS R2 - AWS Resources Reader -](https://app.aws-r2.orehayaruzo.com/)

- リソースを90日以内に操作したユーザー（Users）
- 各リソースの使用状況の参考値となるメトリクス(EC2のNetworkIn, NetworkOutなど)

については、処理時間などの懸念があり、公開アプリ上では取得しない設定にしています。
個別に対応はできますので、[Email](mailto:ssktty1994&#64;gmail.com)にてお問い合わせください。

# 不要なコンピューティングリソースは意外と多い
使われていないまま放置されているコンピューティングリソースありませんか？
立てっぱなしのEC2、RDS、ECSはとてつもない金食い虫です。自分は、会社のコンピューティングリソースを棚卸ししてみたら、数百万の不要リソースがあったなんて経験もありました（わりとありえる話な気もします）。

不要だと思っていても、いつか使うかもしれない、よくわからないから止めるのが怖い、そういった心理が働くと思います。なので棚卸しはトップダウンでプロジェクト的に実施する必要があるかと思います。

# 棚卸し方法
基本的にスプレッドシート（エクセル）でリソース種類ごとにタブを作って一覧化するのがおすすめです。
[クラスメソッドさんの記事](https://dev.classmethod.jp/articles/organize-aws-resources/)のような形式でやるのがシンプルかつ効率的だと思います。

上記の記事では、全リソースを対象に`resourcegroupstaggingapi`でタグ付けされたリソースを取得しています。しかしコスト削減を目的とした棚卸しでは、この方法だといくつか不都合が生じます。
- タグ付けされていないリソースの取得が一部できない
- リソースの詳細情報が取得できない
- コスト削減にインパクトがないリソースがノイズとなる

よって、コスト削減の上では、「不要だけど課金されている」、「高額になりがち」なEC2, RDS, ECSに絞ってまずは棚卸しするのがオススメです。そのためには`ec2 describe-instances`, `rds describe-db-instances`, `ecs describe-services` あたりで取得して一覧化するとよいです。

# リソース一覧化が面倒くさいのでアプリ化した
上記のリソース一覧取得はそんなに難しいものではないのですが、やはり面倒です。
なので、Webアプリとして作りました。

[AWS R2 - AWS Resources Reader -](https://app.aws-r2.orehayaruzo.com/)

EC2, RDS, ECSの３つのCSVをまとめたZipファイルとしてダウンロードできます。
これをスプレッドシートやエクセルにインポートしてご利用ください。

# リソースの使用状況、コスト、問い合わせ先なども出したい
理想的には一覧化された情報に使用状況の参考となるメトリクスとコストも入っていて、「この使用状況ならきっと不要だ」、「このリソースはかかっているコストのわりに使用量は少ないから、インスタンスサイズを見直そう」などとしたいと考えています。

これらの情報も随時加えていくつもりです。しかしながら、これらの情報を抽出するには大量のリクエストをAWSに投げる必要があり、一般公開のWebアプリではリスキーだと考えています。

もしこれらの情報も加えたCSVが必要だという場合には、[Email](mailto:ssktty1994&#64;gmail.com)にまでご連絡ください。
text-decorationを学び直す

[ひとりCSS Advent Calendar 2022](https://qiita.com/advent-calendar/2022/css-becolomochi) 1日目です。
text-decoration関連のプロパティを学び直します。

## text-decoration プロパティ

- `text-decoration` とはテキストを装飾するプロパティ
    - a 要素（リンク）にアンダーラインをつけるかつけないかといった指定をすることが多い
        - もちろん他の要素にも使える
- `text-decoration` はショートハンドだった
    - （知らなかった）
    - 以下をまとめて指定できる
        - `text-decoration-line` - 線の位置
            - `none`(なし)
            - `underline`(下線)
            - `overline`(上の線)
            - `line-through`(文字の中央)
            - `underline overline` のように空白スペースで区切ることで複数設定も可能
        - `text-decoration-color` - 線の色
        - `text-decoration-style` - 線の種類
            - `solid`(単独線)
            - `double`(二重線)
            - `dotted`(点線)
            - `dashed`(破線)
            - `wavy`(波線)
        - `text-decoration-thickness` 太さ

## text-underline-offsetプロパティ

- `text-decoration: underline` を設定した場合、`text-underline-offset` 線と文字の距離を広げることが可能
    - 今まで `text-decoration` ではなく、`padding-bottom` `border-bottom` の両方を設定することで調整していた
        - このような設定をしなくて済む

## Codepen

text-decoration で遊んでみた。

<p class="codepen" data-height="300" data-default-tab="html,result" data-slug-hash="JjZaJrG" data-user="becolomochi" style="height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/becolomochi/pen/JjZaJrG">
  text-decoration</a> by Beco (<a href="https://codepen.io/becolomochi">@becolomochi</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41088/66a3ccc5-6673-b21c-30d2-4f16f7a073a0.png)

## 感想

- ショートハンドなの知らなかった
- 波線かわいい
- 線の色もショートハンド内で変えられて便利
- 複数の線は設定できるが、色や形状は線それぞれに指定できない様子だった


## 参考

- https://www.w3.org/TR/css-text-decor-3/#line-decoration
- https://developer.mozilla.org/ja/docs/Web/CSS/text-decoration
- https://developer.mozilla.org/ja/docs/Web/CSS/text-underline-offset
Ubuntu22.04からRSA鍵が使えない!?（使える）

# 仮想マシンでUbuntu22.04を立てて早速TeraTermで接続しようと思ったらつながらない!?

これはUbuntu22.04に入っているOpenSSHの8.8系からSHA-1を使用したRSA鍵がデフォルトで廃止になったこととTeraTermがSHA-2 RSAに対応していないことが原因です。


すなわちSHA2 RSAの`rsa-sha2-256`(sha-256)や`rsa-sha2-512`(sha-512)などのアルゴリズムは大丈夫なのでRSA鍵がダメというわけではないです。


さらに言えば、TeraTermではなくCommandPromptやPowerShellなどでならRSA鍵でも（SHA-1は除く）SSH接続は可能です

でも、TeraTermで接続できないのはちょっと困りますよね。
これに関する[チケット](https://ja.osdn.net/projects/ttssh2/ticket/36109)はあがっているので今後改善はあるかもしれません。
取り敢えず現時点での解決を試みたいと思います。

# 解決その1

**RSA以外のアルゴリズムを使う**
RSA以外の暗号化アルゴリズムは
- ECDSA
- Ed25519（おすすめ）

とかがあるので鍵を生成するときにこれらを指定する方法です。

```shell:ECDSA
ssh-keygen -t ecdsa
```

```shell:Ed25519
ssh-keygen -t ed25519
```

専門家ではないので割愛しますが、鍵の適切なbit長は安全性や処理負荷の観点から色々いい長さがあるみたいです。


AWSではRSAとEd25519の2種類が選べるので、EC2でUbuntu22.04をたてるときはEd25519のキーペアを選ぶようにすると、良さそうです。

TeraTermでの接続方法はRSA鍵のときと同じです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402157/6b1cfef0-9957-e8ed-ed53-28112f8db088.png)



# 解決その2

sshの設定で`ssh-rsa`を許可する。
これはあまり推奨される方法ではないですが、一応可能です。

CommandPromptやPowerShellなどでまずはアクセスをして`/etc/ssh/sshd_config`に下記の設定を追記します。

```conf:/etc/ssh/sshd_config
PubkeyAcceptedAlgorithms=+ssh-rsa
```

これで`sshd`をリスタートします。

```shell
sudo systemctl restart sshd
```

これでTeraTermからでもRSA鍵を用いてUbuntu22.04に接続できるようになります。
ONLYOFFICE DocsとRedmineを連携させる方法

## ONLYOFFICEとRedmineの連携について

ONLYOFFICEでは、ONLYOFFICE Docsと[Redmine](https://www.redmine.org/)を連携させ、Redmineモジュールに添付されたオフィスドキュメントをコラボレーションするための公式コネクタを提供しています。Issues、Files、Documents、Wiki、News の各 Redmine モジュールに添付されたオフィスドキュメントをコラボレーションすることが可能です。ONLYOFFICEコネクタは、Redmine [Marketplace](https://www.redmine.org/plugins/onlyoffice_redmine)またはONLYOFFICE [GitHubページ](https://github.com/ONLYOFFICE/onlyoffice-redmine)よりダウンロードできます。本アプリケーションはApacheライセンスで配布されています。

## 主な機能

* ユーザーのアクセス権に応じたRedmineモジュールからのテキスト文書、スプレッドシート、スライドの閲覧と編集
* オンラインフォームの作成と入力
* リアルタイムでのドキュメントの共同編集：2つの共同編集モード（高速と厳格）、変更履歴、コメント、内臓チャット
* JWTのサポートにより、適切な権利を持つユーザー以外がドキュメントにアクセスできないように、トラフィックを保護する

## ONLYOFFICE DocsとRedmineを連携させる

### 動作条件

* ONLYOFFICE Docs バージョン 6.4 以降
Redmineとエンドクライアントの両方から解決可能で接続可能なONLYOFFICE Docsのインスタンスが必要です。また、Redmineに直接POSTできる必要があります。

:::note warn
ONLYOFFICE Docsのインストールについては、[公式技術ドキュメント](https://helpcenter.onlyoffice.com/installation/docs-index.aspx)のページをご参照ください。
:::

* Redmine v4.0.0。Redmineを初めて使う場合は、[この手順](https://www.redmine.org/projects/redmine/wiki/RedmineInstall)でインストールしてください。
* Redmine用ONLYOFFICEコネクタv1.0.0 

### Redmine 用 ONLYOFFICE コネクタのインストール

１．Redmine用のONLYOFFICE連携プラグインをダウンロードします。いくつかの方法があります。

  * Redmine [Marketplace](https://www.redmine.org/plugins/onlyoffice_redmine)から最新のアーカイブされたバージョンをダウンロードします。
  * ONLYOFFICE [GitHubページ](https://github.com/ONLYOFFICE/onlyoffice-redmine)から最新のアーカイブ版をダウンロードします。

```
wget https://github.com/ONLYOFFICE/onlyoffice-redmine/archive/refs/tags/v1.0.0.tar.gz
```

アーカイブを解凍してください。

```
tar -xvzf v1.0.0.tar.gz
```
*  masterブランチをクローンします。 

```
git clone https://github.com/ONLYOFFICE/onlyoffice-redmine
```

:::note warn
**plugins**のサブディレクトリは**onlyoffice_redmine**という名前にする必要があります。クローンした**onlyoffice-redmine**または解凍した**onlyoffice_redmine-x.y.z**フォルダの名前を**onlyoffice_redmine**に変更します。

```
mv onlyoffice-redmine onlyoffice_redmine
mv onlyoffice-redmine-1.0.0 onlyoffice_redmine
```
:::

プラグインをインストールする前に、Redmineのインスタンスが停止していることを確認してください。

２．**onlyoffice_redmine**のプラグインディレクトリを**plugins**ディレクトリに配置します（例）。

```
cp -r /root/onlyoffice_redmine/. /redmine/plugins/onlyoffice_redmine
```
:::note warn
プラグインディレクトリへのパスは、Redmineのインストールオプションによって異なる場合があります。`find / -type d -name plugins` コマンドでパスを確認することができます。
:::


３．Redmineのルートディレクトリに移動します。

```
cd redmine
```

４．依存関係をインストールします。

```
bundle install
```

５．データベースの初期化／更新を行います。

```
RAILS_ENV=production bundle exec rake db:migrate
```

```
RAILS_ENV=production bundle exec rake redmine:plugins:migrate NAME=onlyoffice_redmine
```

６．Redmineインスタンスを再起動します。

ONLYOFFICE Docsを[今すぐダウンロード](https://www.onlyoffice.com/download-docs.aspx?from=qiita)
アドベントカレンダー2022始まるよ！！

## はじめに
こちらの記事は金属加工プラットフォームを開発・運用する[Catallaxy](https://catallaxy.me/)の[Catallaxy Advent Calendar 2022](https://qiita.com/advent-calendar/2022/catallaxy)の12/1の記事となります。

https://qiita.com/organizations/catallaxy-dev

## 開会のご挨拶

<p class="codepen" data-height="300" data-default-tab="html,result" data-slug-hash="YzvpMWP" data-user="ryota-shimajiri" style="height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/ryota-shimajiri/pen/YzvpMWP">
  Untitled</a> by 島尻 亮汰 (<a href="https://codepen.io/ryota-shimajiri">@ryota-shimajiri</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>

ルパンのタイトル風、始まりの挨拶でした〜
備忘録: pycharm community termcolor最新版2.1.1でrunさせたとき、コンソールに色の付いた文字が出力されなかった問題

OS: Win10
pycharm: 2022.4
Anaconda3 2022.10
termcolor: 2.1.1
問題
サードパーティ製のtermcolorの最新版をインストールし、runさせたら、色の付いたテキストがコンソールに出力されなかった。

ターミナル上で、python code1.pyと打つと色の付いたテキストが出ます。

解決方法
pip install termcolor==1.1.0
と打ってバージョンをダウングレードしたら上手く出力されました。

懸念点
但し、termcolor 2.1.1でもVSCodeではrunさせて上手くできたので気がかりです。
VBScriptでAPIを叩いてみた

# はじめに
ZOZOではVBScriptといったレガシーな技術をJavaなどに置き換えるリプレイスを進めています。
そのため、現在絶賛過渡期です。
しかし、まだVBScriptで書かれたコードを見にいくことも多く、VBScriptで改修を行う場面もあります。

今回は、VBScriptでAPIを叩いてみました！


# この記事のゴール
この記事を読んだら、誰でもVBScriptでAPIを叩くことができるようになります。


# 実装
早速実装例を見てみましょう。

```vb:httpTest.vbs
option explicit

dim args
dim method
dim url
dim oHTTP

set args = wscript.arguments

if args.count < 1 then
   wscript.echo "No URL provided"
   wscript.quit
end if

set oHTTP = createObject("MSXML2.ServerXMLHTTP")

method = "GET"
url    = args(0)

wscript.echo "method: " & method
wscript.echo "URL: " & url

oHTTP.open method, url, false
oHTTP.send

wscript.echo "Status: " & oHTTP.status & " " & oHTTP.statusText
wscript.echo oHTTP.responseText
```

コードを実装したら下記のコマンドで実行しましょう。
例として、[Qiita API](https://qiita.com/api/v2/docs#%E3%82%BF%E3%82%B0)の`v2/tags`をたたいて`vbscript`のタグ情報を取得してみます。

```:実行コマンド
cscript httpTest.vbs https://qiita.com/api/v2/tags/vbscript
```
このコマンドでは、第一引数にURLを指定しています。


実行すると次のような結果が取得できました。
```:実行結果
method: GET
URL: https://qiita.com/api/v2/tags/vbscript
Status: 200 OK
{"followers_count":186,"icon_url":"https://s3-ap-northeast-1.amazonaws.com/qiita-tag-image/60640a626e82e31a031a5d0afe5c08a6c3ba6b58/medium.jpg?1598802046","id":"VBScript","items_count":510}
```
APIのアクセスに成功し、データを取得できていることがわかります。


# 解説
コードの中の処理はそれぞれ何をしているのか見ていきましょう。


## 処理の流れ
まずは、処理の流れです。
コマンドラインの第一引数に指定したURLにアクセスし、GETメソッドでデータを取得しています。
このとき、以下の情報を表示させています。
 + HTTPメソッド
 + URL
 + HTTPステータスコード＋ステータステキスト
 + レスポンスボディ


## 引数指定
下記の処理で引数を指定しています。
```
set args = wscript.arguments

if args.count < 1 then
   wscript.echo "No URL provided"
   wscript.quit
end if
```
`args`に引数を配列として渡しています。
`if`文内では、引数が何も指定されていないと`No URL provided`というエラーメッセージが表示されて、処理を終了させています。


## ServerXMLHTTPオブジェクト生成
下記の処理でServerXMLHTTPオブジェクトを生成しています。
```
set oHTTP = createObject("MSXML2.ServerXMLHTTP")
```
[ServerXMLHTTP](https://learn.microsoft.com/ja-JP/previous-versions/windows/desktop/ms762278(v=vs.85))は、異なる Web サーバー上のファイルまたはオブジェクト間で HTTP 接続を確立できるようにするメソッドとプロパティを提供します。


## HTTPリクエストを送信
```
oHTTP.open method, url, false
```
`Open`メソッドで「要求するメソッド」「URL」「非同期通信かどうか」を指定しています。

```
oHTTP.Send
```
`Send`メソッドでサーバーに HTTPリクエストを送信し、応答を受信します。

[（参考：ServerXMLHTTPのメソッド）](https://learn.microsoft.com/en-us/previous-versions/windows/desktop/ms754586(v=vs.85)?redirectedfrom=MSDN#methods)



## レスポンス結果を出力
```
wscript.echo "Status: " & oHTTP.status & " " & oHTTP.statusText
wscript.echo oHTTP.responseText
```
`status`プロパティで「HTTPステータスコード」、`statusText`で「HTTPステータス」、`responseText`で「レスポンスボディの中身」を出力します。


[(参考：ServerXMLHTTPのプロパティ）](https://learn.microsoft.com/en-us/previous-versions/windows/desktop/ms754586(v=vs.85)?redirectedfrom=MSDN#properties)




# まとめ
この記事では、VBScriptでAPIを叩く方法を説明しました。
VBScriptでもこうやったらAPI叩けるんだ〜くらいに思ってもらえたら幸いです。




# 参考文献
https://renenyffenegger.ch/notes/development/languages/VBA/Useful-object-libraries/MSXML/XMLHTTP/get_vbs

https://qiita.com/aratana_ogawa/items/609953a85d713759610e
プロジェクトの問題を素早く特定するコツ（更新中）

本記事は以下より作成しました。
[原文1](https://blog.jp.uwa4d.com/2022/11/08/%e3%83%86%e3%82%b9%e3%83%88%e3%83%87%e3%83%bc%e3%82%bf%e8%a7%a3%e6%9e%90tips/)
[原文２](https://blog.jp.uwa4d.com/2022/11/30/%e3%83%97%e3%83%ad%e3%82%b8%e3%82%a7%e3%82%af%e3%83%88%e3%81%ae%e5%95%8f%e9%a1%8c%e3%82%92%e7%b4%a0%e6%97%a9%e3%81%8f%e7%89%b9%e5%ae%9a%e3%81%99%e3%82%8b%e3%82%b3%e3%83%84/)

---
GOT Onlineサービスには、Overview、Mono、Resource、Lua四つのテストモードを整えました。

**Overviewモード**で、レンダリング、物理システム、アニメーション、パーティクルシステム、UIモジュール、ローディング６のモジュールの各構成項目のCPU時間などの詳細性能データを確認できます。

 

**Monoモード**では、Monoメモリの割当及リークを確認できます。逆順のコール分析も用意され、これを使えばCPU時間が高い子関数はどれかすぐわかる。

https://youtu.be/T-znZ-hdPUk


**Resourceモード**では、テクスチャー、メッシュ、アニメーション・オーディオクリップ、マテリアル、シェーダー、フォント、RT(Render Texture)、パーティクルシステムなどのリソースの具体的な実行状況（メモリ使用量・アセット量を確認できます。

**Luaモード**では、CPU時間が高いコールスタックリストが表示されます。逆順のコール分析も用意され、これを使えばCPU時間が高い子関数はどれかすぐわかる。

https://youtu.be/ywYeVEORXns

---

Overviewのコードページで、**CPU時間**の高い関数を確認できます。CPU時間が異常なフレームを特定できて、**スタック情報**もはっきりと把握できます。

https://youtu.be/qgOErwVsyO0

https://youtu.be/-yf5Fbweya4


**温度、電量**の変化幅や具体数値につては、ハードウェアページで示されています。

https://youtu.be/ocZ-dUG6yrg

**全体性能の傾向**アイテムの下には、レンダリング、物理システム、アニメーション、

パーティクル、UI、ローディングという六のモジュールを分けてプロジェクトの性能を示しています。

![截屏2022-11-30 下午2.17.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/85f95542-d5f2-43b1-72f9-ca817aa2a200.png)

**レンダリングモジュール性能分析**

迅速に特定し、一目瞭然！


https://youtu.be/Lftl2AQbfG4


**Unityアンローディング最適化分析**

シーンを切り替えると、長い時間かかる場合、いかに最適化すべきか？

https://youtu.be/7DXWjTiaf88


---
UWA Technologyは、モバイル/VRなど様々な**ゲーム開発者向け、パフォーマンス分析と最適化ソリューション及びコンサルティングサービス**を提供している会社でございます。

今なら、UWA GOTローカルツールが**15日間に無償試用**できます！！
よければ、ぜひ！

UWA公式サイト：https://jp.uwa4d.com
UWA GOT OnlineレポートDemo：https://jp.uwa4d.com/u/got/demo.html
UWA公式ブログ：https://blog.jp.uwa4d.com
Ubuntuをアップグレードしただけなのに...

:::note info
こちらは [本番環境でやらかしちゃった人 Advent Calendar 2022](https://qiita.com/advent-calendar/2022/yarakashi-production) 10日目の記事です。
:::

# Ubuntuをアップグレードした少年の物語

僕は新卒エンジニア！
今日はWordpressに入門してみるぞー！
てことで、久々に個人開発で使っているVPSにログインするぞー！

```
ssh -i id_rsa ubuntu@personal-server
```

```
Welcome to Ubuntu 20.04.5 LTS (GNU/Linux 5.4.0-131-generic x86_64)
```
よし。ログイン完了！


あれ、なんかメッセージ出てるな。
```
New release '22.04.1 LTS' available.
Run 'do-release-upgrade' to upgrade to it.
```
あー、そういえばUbuntuに新しいバージョン出てたな。
この前WSLでアップグレードしたけど特に問題なかったし、アップグレードしておくか。

```
sudo do-release-upgrade
```
ポチッ

```
This session appears to be running under ssh. It is not recommended 
to perform a upgrade over ssh currently because in case of failure it 
is harder to recover. 

If you continue, an additional ssh daemon will be started at port 
'1022'. 
Do you want to continue? 
```
ん？なんだろ。まあいいか。

```
y
```

結構時間かかるなあ。夜ご飯でも食べて待ってるか。

```terminal:1時間後
...たくさんのメッセージ

System restart required
```

お、終わってる。再起動させるか。

```
sudo reboot
```

ちょっと時間置いてssh接続しよう。

```terminal:10分後
ssh -i id_rsa ubuntu@personal-server
```
ん？接続できないな。なんでだろ。

🔍 「Ubuntu 22.04 ssh できない」 

https://kledgeb.blogspot.com/2022/04/ubuntu-2204-59-ubuntu-2204-lts.html

> 「ssh-rsa」がデフォルトで無効化されました。

え、待って、rsaの鍵使ってたんだけど。
てか今思い出したけど、普通に先輩に使ってもらってるサービスとかこのサーバーに乗っけてたわ。
しかもDBも同じサーバーで管理してたしバックアップもないぞ？
やばい、どうしよう、、、

# この少年の問題点

色々と問題点のある少年ですが、**これをやっておけば被害は最小限に済んだ**というポイントを3つ紹介します。

### 1. 変更点を事前に確認する
今回で言うと`Ubuntu 20.04`から`Ubuntu 22.04`に移行すると何が変わるのかについて調べておくべきでした。
これは「リリースノートを隅々まで見ろ！」という話ではありません。
アップグレードする前に「Ubuntu22.04 変更点」などと調べておけば記事になるような大きな変更を事前に知ることができます。
今回で言うとssh-rsaの無効化などは気付けたはずです。

### 2. バックアップを取る
もはや取るのが当たり前だとは思いますが、個人開発などでバックアップを取っていないプロダクトもあるかもしれません。
これも「全てのプロダクトでバックアップを自動化しろ！」と言うわけではなく、OSのアップデートなどの**大きな変更のあるときだけでも**バックアップを取るべきでした。

### 3.本番サーバーは分ける
当たり前の当たり前ですが、本番サーバー（特にWEBサーバー）はプロジェクトごとに分けましょう。
「一旦このサーバーに置いておこう」で始めてしまうとそのままダラダラ続けてしまいます（体験談）。

# 終わりに

幸い、先輩に提供していたサービスはデータ消失が大きな問題にはならず、無償で提供していたこともあって和解しました。
もっと責任感を持って開発をしようと今回の事件で気付かされました。

こんな失態を犯す人は中々いないとは思いますが、皆さんもどうかお気をつけください。
GKEのコンテキスト確認・整理・削除

# はじめに
GKEでクラスタやノードプールを作成・削除を繰り返している内に、kubectlが使えなくなったしまった。
どうやらkuebctlでアクセスするクラスタへの権限が書かれているconfigとcontext(コンテキスト)がぐちゃぐちゃになったみたいです。
それらを整理した際のメモです。

※ぐちゃぐちゃになった原因がGCPウェブコンソールからクラスタを作成したり、CentOSサーバー内のkubectlで作成したりとしていたからだと後々気づきました。

# kubectlのconfigファイル
どのクラスタにアクセスして操作するかの権限をまとめたファイルかと勝手に認識しています。
複数あるコンテキストを１つにまとめたものになるかと思います。
なので各コンテキストをちゃんと整理すれば、このファイルは自動的に整理されるはず・・・。

## configファイルの場所
CentOS内ユーザーのホームディレクトリ配下に/.kube/configになります。
これは今は触らない。
```
kubectl config view
```
でも内容は確認できます。

# コンテキスト
## コンテキスト一覧を確認
```
kubectl config get-contexts
```
コンテキストがあれば表示されます。
*印があるものが現在選択されているコンテキストです。
なので現在選択させているコンテキストに書かれているクラスタにしかkubectlは利用できません。

## コンテキストを切り替える
別のクラスタに命令を出す場合は、コンテキストの切り替えが必要になる。
```
kubectl config use-context コンテキスト名
```

## コンテキストの削除
クラスタを使わなくなった場合などはコンテキストを削除して整理したいので。
```
config delete-context コンテキスト名
```

# まとめ
1つのコンテキストで複数のクラスタへのアクセスも可能みたいです。
今回の参照元はこちら

https://tech.yuzuyu.mobi/archives/354
まずはここから！EC-CUBEを始めたい方向けまとめ

「[EC-CUBE Advent Calendar 2022](https://qiita.com/advent-calendar/2022/ec-cube)」1日目の投稿です。
今回は、EC-CUBEが気になる方向けに、EC-CUBEの紹介と、EC-CUBEの始め方についてまとめてみます。

# まずはEC-CUBEって？
EC-CUBEはオープンソースで公開されているEC構築システムです。推定稼働店舗は35,000店舗以上（[導入事例](https://www.ec-cube.net/product/cases/backnumber.php)）。オープンソースのため、どなたでも無料で自由にご利用いただけます。
ECの基本機能に加え、プラグイン・デザインテンプレートの導入や独自カスタマイズも可能です（参考：[EC-CUBEが選ばれる理由](https://www.ec-cube.net/product/reason.php)）。
[開発者向けドキュメント](https://doc4.ec-cube.net/)や、[運用マニュアル](https://www.ec-cube.net/manual/ec-cube4/)も公開されています。
実際触ってみたいという方は、[ソースコードのダウンロード](https://www.ec-cube.net/download/)か、[2週間無料のトライアル環境](https://www.ec-cube.net/product/co/)をお試しください。
もっと詳しいご紹介は、[EC-CUBE紹介資料](https://www.ec-cube.net/download/material.php?=first_view)をご覧ください。

# EC-CUBEのバージョン
EC-CUBEは2006年にリリースされ、[2系・3系・4系のバージョン](https://www.ec-cube.net/download/other.php)で利用されています。2022年9月には、バグバウンティによりクオリティとセキュリティを高めたバージョン[「EC-CUBE 4.2」がリリース](https://www.ec-cube.net/news/detail.php?news_id=426)されており、こちらがEC-CUBEの最新版となります。
「EC-CUBE 4.2」では、最新のSymfony 5.4 / PHP 8 にフレームワークがアップデートされた他、2023年10月から施行されるインボイス制度や、これまでプラグインやカスタマイズが必要だった改正特定商取引法の対応も追加されました。現在は、ECに欠かせない決済プラグインも含め、[4.2対応のプラグイン](https://www.ec-cube.net/products/list.php?mode=&category_id=0&maker_id=0&keywords=&ecversion_id=0&partner_id=0&orderby=date&ecversion=4.2&protype=all&disp_number=30&price_type=&product_type=&price_max=&price_min=&pageno=1&product_id=&classcategory_id1=&classcategory_id2=&product_class_id=&quantity=)も200件以上揃い、今すぐお使いいただけるバージョンとなっています。

# EC-CUBEの始め方は？
EC-CUBEでネットショップを始めるには、自社で環境構築から行う方法と、制作会社のパートナーをみつけて一緒に構築する方法の2つの進め⽅があります。
EC-CUBE公式サイトの「[EC-CUBEによるネットショップの始め方](https://www.ec-cube.net/#p-howtobuild)」では、イラスト付きで構築～サイト公開後の運営までの各ステップをご紹介しています。
尚、サイトを構築する前段階となる、開業届けやコンセプト・仕入れ方法の検討など、ネットショップ開業に必要な情報は[ネットショップ開業に必要な8つのステップ](https://www.ec-cube.net/know_how/step_to_open_online_shop.php)でご紹介しています。
EC-CUBEを始める際のパートナー選びについては、[マッチングサービス](https://www.ec-cube.net/adhoop/)や[アドバイザー相談](https://www.ec-cube.net/advisor/)も開設していますので、併せてご利用ください。

# 最後に
EC-CUBEには、利用者同士でフラットに情報交換ができる開発コミュニティやユーザーグループがあります。12/3（土）には
[名古屋ユーザーグループ勉強会](https://www.ec-cube.net/event/detail.php?event_id=345)、12/15（木）には[ユーザーグループの忘年会](https://www.ec-cube.net/event/detail.php?event_id=347)が企画されていますので、ここから始めてみるのもおすすめです。初心者の方や、これからやろうか迷っている方も話しやすい雰囲気なので、お気軽に覗いてみてください～。

明日は[@chihiro-adachi](https://qiita.com/chihiro-adachi)さんです！
よろしくおねがいします！
オンプレサーバーでMulti GPUによる計算が実行できなかったときの対処法

こんにちは、朝日新聞社メディア研究開発センターの田森です。

アドベントカレンダー12日目の今日は、ちょっとマニアックな内容ですがご容赦ください。

今や機械学習、とりわけ深層学習の実験には欠かすことのできなくなったGPUは、弊社もオンプレミスやクラウドで調達、運用しています。今回は、オンプレミスで購入した際の設定について、みなさんも経験するかもしれない？事例について共有したいと思います。

---
とりあえず解決方法を記載しておくと
```text
BIOSにて、VT-dの設定項目にあるACS Controlというものだけを無効化することで回避できた。
```
というオチでした。

---

先日、実はSupermicroのサーバーを新規導入しました。GPUはA100、CPUはIntel、BIOSはAMI BIOSというものです。PyTorchを利用したいつもの実験スクリプトで動作確認をしていたところ、複数枚のGPUを同時使用すると、GPUを利用するプログラム実行の段階になるとエラーする事象が発生しました。試しに、 `CUDA_VISIBLE_DEVICES=0`　のように、GPUを1枚だけ指定すると問題なく動作しました。

そこで、[CUDA Samples](https://github.com/nvidia/cuda-samples) の [simpleP2P](https://github.com/NVIDIA/cuda-samples/tree/master/Samples/0_Introduction/simpleP2P) にて確認をしたところ、やたら時間がかかり、挙げ句「Test failed!」となってしまい、やはりGPU間の通信がうまくいっていないらしいことがわかりました。

```bash

[./simpleP2P] - Starting...
Checking for multiple GPUs...
CUDA-capable device count: 2
 
Checking GPU(s) for support of peer to peer memory access...
> Peer access from NVIDIA A100 80GB PCIe (GPU0) -> NVIDIA A100 80GB PCIe (GPU1) : Yes
> Peer access from NVIDIA A100 80GB PCIe (GPU1) -> NVIDIA A100 80GB PCIe (GPU0) : Yes

Enabling peer access between GPU0 and GPU1...
Allocating buffers (64MB on GPU0, GPU1 and CPU Host)...
Creating event handles...
cudaMemcpyPeer / cudaMemcpy between GPU0 and GPU1: 1.07GB/s
Preparing host buffer and memcpy to GPU0...
Run kernel on GPU1, taking source data from GPU0 and writing to GPU1...
Run kernel on GPU0, taking source data from GPU1 and writing to GPU0...
Copy data back to host from GPU0 and verify results...
Verification error @ element 0: val = nan, ref = 0.000000
Verification error @ element 1: val = nan, ref = 4.000000
Verification error @ element 2: val = nan, ref = 8.000000
Verification error @ element 3: val = nan, ref = 12.000000
Verification error @ element 4: val = nan, ref = 16.000000
Verification error @ element 5: val = nan, ref = 20.000000
Verification error @ element 6: val = nan, ref = 24.000000
Verification error @ element 7: val = nan, ref = 28.000000
Verification error @ element 8: val = nan, ref = 32.000000
Verification error @ element 9: val = nan, ref = 36.000000
Verification error @ element 10: val = nan, ref = 40.000000
Verification error @ element 11: val = nan, ref = 44.000000
Disabling peer access...
Shutting down...
Test failed!
```

このあたりの[issue](https://github.com/pytorch/pytorch/issues/24081)を見てみると、VT-d（仮想化の支援機能、とのことですが…）という設定をBIOS上で無効にすれば、というような記述を発見しました。VT-dを無効にしてみましたが同じくmulti gpuでは動作しませんでした。

最終的にはVT-dの設定項目にあるACS Controlというもの**だけ**を無効化することで回避できました。

![Untitled (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106239/f3df5742-5edb-b8d5-401d-1153a23fb325.png)

ACSというのはAccess Control Serviceというものらしく、GPUが装着されているPCI Expressとの通信をコントロールするもののようです（曖昧な表現ですみません…）。

現在ではGPUの利用はクラウドを使われている方がほとんど？だと思うので、あまり関係のない方も多いと思いますが、もしオンプレでこのような事があったときにお役に立てれば幸いです。

現場からは以上です。
PG16:make use of regular expressions for the username in pg_hba.conf

## はじめに

にゃーん。趣味でポスグレをやっている者だ。

この記事は[PostgreSQL 16 全部ぬこ Advent Calendar 2022](https://qiita.com/advent-calendar/2022/pg16-all-nuko) 2日目の記事です。
今回はPostgreSQL 16に追加された、pg_hba.confに記述するユーザ名のちょっとした改善内容を書いてみます。

## 概要

|項目|内容|
|:--|:--|
|タイトル|[make use of regular expressions for the username in pg_hba.conf](https://commitfest.postgresql.org/40/3824/)|
|Topic|Miscellaneous|
|Last modified|2022-10-24|
|ステータス|commited|
|概要|``pg_hba.onf``のユーザ名に正規表現の指定を可能にする。|

## 変更内容
PostgreSQLへの接続を制御する``pg_hba.conf``ファイルのユーザ名(user_name)の記述に正規表現での記述を許容します。
正規表現で記述する場合には、先頭にスラッシュ(``/``)をつけます。

## 動作例
ユーザ名に正規表現を使った簡単な例を示します。

### ユーザとデータベースの設定

デフォルトユーザ(postgres)以外に、nuko, nuko_mike, nuko_tamaという一般ユーザが作成されているとします。

```sh
$ psql -U postgres postgres -c "\du"
                                   List of roles
 Role name |                         Attributes                         | Member of
-----------+------------------------------------------------------------+-----------
 nuko      |                                                            | {}
 nuko_mike |                                                            | {}
 nuko_tama |                                                            | {}
 postgres  | Superuser, Create role, Create DB, Replication, Bypass RLS | {}

$
```

また、データベース``nuko``が作成されているとします。

```sh
$ psql -U postgres postgres -c "SELECT datname FROM pg_database"
  datname
-----------
 postgres
 nuko
 template1
 template0
(4 rows)
```

### pg_hba.confの設定

``pg_hba.conf``に接続設定を追加します。設定後、PostgreSQLサーバをリロードして、``pg_hba_dile_rules``ビューで内容を確認します。

```sh
$ psql postgres -c "SELECT type, database, user_name FROM pg_hba_file_rules"
 type  | database |  user_name
-------+----------+-------------
 local | {nuko}   | {/^nuko_.*}
 local | {all}    | {postgres}
(2 rows)
```

database=nukoのエントリのuser_nameの記述に注目。
ここに``/^nuko_.*``という正規表現によるユーザ名の指定を書きます。
最初のスラッシュ(``/``)は正規表現記述を示すもの（だと思います）。続いて書かれている文字列が正規表現文字列になります。
``^nuko_.*``は、「先頭から``nuko_``で始まり以降は任意の文字」を示します。
追加したユーザのうち、``nuko_mike``と``nuko_tama``はこの正規表現に合致するユーザ名となります。``nuko``はこの正規表現には合致しません。

### 接続検証
この設定で、ユーザ``nuko``,``nuko_mike``,`nuko_tama`がデータベース``nuko``に接続できるか確認します。

ユーザ``nuko``の場合、``^nuko_.*``の正規表現には合致せず、他に合致するエントリがないので接続エラーとなります。

```shell
$ psql -U nuko nuko -c "SELECT 1"
2022-10-31 09:03:16.955 JST [354] FATAL:  no pg_hba.conf entry for host "[local]", user "nuko", database "nuko", no encryption
psql: error: connection to server on socket "/tmp/.s.PGSQL.16001" failed: FATAL:  no pg_hba.conf entry for host "[local]", user "nuko", database "nuko", no encryption
```

ユーザ``nuko_mike``,``nuko_tama``は接続に成功します。

```sh
$ psql -U nuko_mike nuko -c "SELECT 1"
 ?column?
----------
        1
(1 row)

$ psql -U nuko_tama nuko -c "SELECT 1"
 ?column?
----------
        1
(1 row)
```

## おわりに

``pg_hba.conf``のユーザ名に正規表現が使えるようになることで、例えば接頭辞が同じで後ろが異なるユーザを特定のデータベースに接続可能にする、といったケースの記述が楽になるかもしれませんね。
Visual Studio CodeでMarkdownを書いていて、大量のalt文の連番リネームが必要になったときにやったこと

## この記事の概要

Visual Studio Codeで文章を書く中で、挿入する画像のalt文を連番にしないといけない場面がありました。
手動で変更するのは大変だったので備忘録として残します。

なお、記載しているショートカットはmacOSのものです。

## 当時の状況

- 画像を貼るのは普通のMarkdownの形式（`![alt文](画像path)`）
- `alt文`は`図1`、`図2`と連番にするルール
- 途中で図が増えた場合、後に続く`alt文`をすべてずらす必要がある

長い記事だったので画像が100枚くらいあり、手動で変更するのは嫌でした。

## 対応したこと

1. Insert Numbersをインストールしておく
1. `alt文`の中身を正規表現ですべて選択する
1. 不要な部分を消して、再度すべてにカーソルを合わせる
2. Insert Numbersで置換する

正直簡単な内容ですが、それぞれ説明します。

### Insert Numbersをインストールしておく

[Insert Numbers](https://marketplace.visualstudio.com/items?itemName=Asuka.insertnumbers)という拡張機能があるので、インストールします。

色々なフォーマットで連番を入力できる拡張機能です。

以下の記事が丁寧に説明されていたのでリンクを貼っておきます。

https://kekaku.addisteria.com/wp/20200714160757

### `alt文`の中身を正規表現ですべて選択する

状況をざっくり再現するとこうです。

```markdown
![図1](./image.png)
![図2](./image.png)
![図3](./image.png) <!-- 新しく追加した画像 -->
![図3](./image.png) <!-- これより後の画像はすべて番号を変えたい -->
![図4](./image.png)
![図5](./image.png)
![図6](./image.png)
![図7](./image.png)
![図8](./image.png)
![図9](./image.png)
![図10](./image.png)
```

この状態で、置換（`option + command + F）`を実行します。

正規表現モードをオンにして、`Find`に`!\[図.*\]`と入力し、`Replace`に`![図]`を入れて`Replace All`（`command + return`）を実行します。
（画像番号が1桁から3桁まであったので、正規表現を利用しています。）

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214677/b3c8274f-aaf0-ae77-aa3c-a5207f285684.png)

### 不要な部分を消して、再度すべてにカーソルを合わせる

実行すると以下のようになります。
この状態で`![図`を選択して`Find in selection`（`option + command + L`）を実行し、すべての`図`の文字の後ろのカーソルがあっている状態を作ります。

```markdown
![図](./image.png)
![図](./image.png)
![図](./image.png)
![図](./image.png)
![図](./image.png)
![図](./image.png)
![図](./image.png)
![図](./image.png)
![図](./image.png)
![図](./image.png)
![図](./image.png)
```

### Insert Numbersで置換する

`command + option + n`でInsert Numbersを実行します。
デフォルトだと0始まりなので、ショートカットを押して出てきたウィンドウに`%d:1:1`と入力して`return`を押すと以下の結果が得られます。

```markdown
![図1](./image.png)
![図2](./image.png)
![図3](./image.png)
![図4](./image.png)
![図5](./image.png)
![図6](./image.png)
![図7](./image.png)
![図8](./image.png)
![図9](./image.png)
![図10](./image.png)
![図11](./image.png)
```

## 最後に

非常に簡単な内容ではありますが、最初手作業でやろうとして挫折し、新しい拡張機能まで導入してしまいました。
今回はalt文でしたが画像パスなどでも連番を挿入する場面はありそうな気がして記事にしています。

そうしょっちゅう出くわすシチュエーションでは無いと思いますが、どなたかの役に立てば幸いです。

---

最後まで読んでくださってありがとうございます！
Twitterでも情報を発信しているので、良かったらフォローお願いします！

https://twitter.com/xrxoxcxox

Devトークでのお話してくださる方も募集中です！

https://jobs.qiita.com/employers/qiita-inc/dev_talks/489
Djangoでtemplatesファイルを使用してHTMLを表示する

Djangoで新しいアプリケーションを作成したその続きとして書く。
そこまでは下のものを参考にする。

https://qiita.com/ysk-s/items/52b5c3747d3c10391ec5

○templatesの役割
templateではユーザーからの要求に応じ動的にページを作成して返す機能を持っている。HTML、CSS、JSと同時にPythonのコードを埋め込むことでPythonで生成した値を画面上に出力することが出来る。

○Templateの使用
appディレクトリ内にtemplatesフォルダを作成した場合、appディレクトリ内のviews.pyに既にインポートされているrenderを用いて、下のように記述する。


#app/views.py
```
def index(request):
    return render(request, 'app/index.html')
```
この記述があると、appディレクトリ内に作成した、appフォルダ内のindex.htmlがこの関数がURLを介して呼ばれた際呼び出される。templatesディレクトリ内にappフォルダを作成していない場合、app/は不要になる。


templatesディレクトリの場所をappディレクトリなどと同じ階層で管理する場合、プロジェクトディレクトリ内のsettings.pyに変更を加える必要がある。

#settings.py
```
BASE_DIR = Path(__file__).resolve().parent.parent
TEMPLATE_DIR = os.path.join(BASE_DIR, 'templates')
```
templatesディレクトリのpathをTEMPLATE_DIRとして定義して、同様にsettings.py内にあるTEMPLATESのDIRSの部分に変更を加えていく。
DIRSのリスト内に先程定めた、TEMPLATE_DIRを要素として入れる。

```
TEMPLATES = [
    {
        "BACKEND": "django.template.backends.django.DjangoTemplates",
        "DIRS": [TEMPLATE_DIR,],
     
```

○templateに値を渡す。
views.pyのreturnのrenderの引数内にcontextとして、辞書型で渡したい値を投げることが出来る。変数やクラスなども渡すことが出来る。
```
def index(request):
    val = "goodbye"
    return render(request, 'template_app/index.html', context= {'value': val})
```
また、HTML内では2重の波括弧で囲うことでその値を表示することが出来る。
```
<h1>Index</h1>
<p>{{value}}</p>
```
また、クラス変数や辞書型の変数の値を取り出すときは
```
 <p>名前：{{member.name}}</p>
```
クラス名.(Dot)変数名や、辞書名.(Dot)キーなどDotを挟めば良い。

Templateについてもう少し書くことがある。
また、別の投稿で追加する。
MFC から SVG クラスのグラデーション、塗パターン呼び出しコードサンプル

## MFC から SVG クラスのグラデーション呼び出し
線形グラデーションの２パターンのサンプルコードを比較します。

横方向で緑から青にグラデーションするサンプルです。

MFC(GDI+) の場合以下のようになります。
```cpp
	RectF rcDraw(0, 0, 300, 50)
    Gdiplus::LinearGradientBrush brush(rcDraw,
        Color(255, 0, 255, 0),
        Color(255, 0, 0, 255),
        LinearGradientModeHorizontal
        );
    pGraphics->FillPolygon(&brush, lpPoints, nCount);
```
SvgImage に書き出すと以下のようになります。
```cpp
		CString strGradient = pSvgImage->AddGradient(&rect,
                         RGB(0, 255, 0), RGB(0, 0, 255), GRADIENT_MODE_HORIZONTAL1);
		CString strGradient;
		pSvgImage->AddRect(0, 0, 300, 50);
		pSvgImage->AddFillUrl(strGradient);
```

横方向で左端から中心まで緑から青に、中心から右端まで青から緑にグラデーションするサンプルです。
中心でグラデーションが折り返すため Gdiplus::LinearGradientBrush::SetBlendTriangularShape 関数で "0.5" を設定します。

MFC(GDI+) の場合以下のようになります。
```cpp
    
	RectF rcDraw(0, 0, 300, 50)
    Gdiplus::LinearGradientBrush brush(rcDraw,
        Color(255, 0, 255, 0),
        Color(255, 0, 0, 255),
        LinearGradientModeHorizontal
        );
	brush.SetBlendTriangularShape(0.5);
    pGraphics->FillPolygon(&brush, lpPoints, nCount);
```

SvgImage ではグラデーションの折り返しが中心固定で設定しておりますので指定は特にありません。
可変にしたい場合はカスタマイズしてください。

SvgImage に書き出すと以下のようになります。
```cpp
		CString strGradient = pSvgImage->AddGradient(&rect,
                         RGB(0, 255, 0), RGB(0, 0, 255), GRADIENT_MODE_HORIZONTAL2);
		CString strGradient;
		pSvgImage->AddRect(0, 0, 300, 50);
		pSvgImage->AddFillUrl(strGradient);
```

## MFC から SVG クラスの塗パターン呼び出し

MFC(GDI+) のハッチパターンの表示に似せて SvgImage::AddHatchStyle 関数を用意しました。
本稿では GDI+ のハッチパターンの表示方法と SvgImage への書き出しを比較します。

MFC(GDI+) の場合以下のようになります。
```cpp
    HatchStyle hatchStyle = HatchStyleHorizontal;
    Gdiplus::Color backColor(255, 255, 255);
    Gdiplus::Color brushColor(0, 0, 255);
    Gdiplus::HatchBrush brushBack(backColor);
    Gdiplus::HatchBrush brushHatch(hatchStyle, brushColor);
    pGraphics->FillRectangle(&brushBack, 0, 0, 100, 100);
    pGraphics->FillRectangle(&brushHatch, 0, 0, 100, 100);
```
SvgImage に書き出すと以下のようになります。
```cpp
    CString strHatch = pImage->AddHatchStyle(HatchStyleHorizontal,
                                         RGB(0, 0, 255), RGB(255, 255, 255));
    pImage->AddRect(0, 0, 100, 100, 0, 0);
	pSvgImage->AddFillUrl(strHatch);
```
負荷テストはk6が便利


## k6とは


[公式サイト]([https://k6.io/)によるとk6は、
負荷テストを行う上でベストな開発者体験の提供を目指しているソフトウェアです。

>The best developer
experience for load testing


JavaScriptを使って負荷テストのコードを書く事ができます。
コードで負荷テストを記述できるので、バージョン管理がやりやすいです。

Go言語で開発されているオープンソースのソフトウェアで、ライセンスはAGPL-3.0です。
GraphQLやWebScoketやgRPCにも対応しています。

インストール方法は簡単で、macOSであれば、`brew install k6`でインストールすることができます。
他のOSでも簡単にインストールすることが可能です。
詳しくは、[こちらをご覧ください](https://k6.io/docs/get-started/installation/)。


## 最小のサンプルコード

最も簡単なサンプルのコードはこちらです。

```javascript
import http from 'k6/http';
import { sleep } from 'k6';

export default function () {
  http.get('https://test.k6.io');
  sleep(1);
}
```

次のコマンドで実行することができます。
```
$ k6 run script.js
```

仮想のユーザを作って実行する場合は、次のようにオプションを設定して実行することで、ユーザ数を増やすことができます。
```
$ k6 run --vus 10 --duration 30s script.js
```
--vus で、仮想ユーザ数の指定
--durationで、継続時間を指定


## POSTリクエストを送りたい場合

POSTリクエストを送りたい場合は、下記のように記述することで送れます。
リクエストBody（payload）をJSON形式で送りたい場合は、JSON形式に変換して送る必要があります。
また、headerにContent-Typeを指定する必要があります。

``` javascript
export default function () {
  //loginして、jwtを取得する
  const url = 'ログイン先URL'
  let payload = JSON.stringify({
    user: {
      email: 'user@example.com',
      password: 'password',
    },
  })
  const params = {
    headers: {
      'Content-Type': 'application/json',
    },
  }
  const res = http.post(url, payload, params)
  check(res, {
    'status is 200': (r) => r.status === 200,
  })
  const JWTToken = JSON.parse(res.body).data.attributes.token
}
```



## JWTなどの認証情報が必要な場合

JWTなどの認証情報を使いたい場合は、paramsに渡すことで利用することが可能です。

```javascript
export default function () {

    const url = 'JWT認証が必要なURL'
    const JWTToken = '取得したJWTTocken'
    const params = {
        headers: {
          'Content-Type': 'application/json',
          Authorization: `Bearer ${JWTToken}`,
        },
    }
    let res = http.get(`${url}`, params)
    check(res, {
        'status is 200': (r) => r.status === 200,
    })
}
```


## 最後に
少し癖がありますが、便利なのでぜひ使ってみてください。
より詳しく知りたい方は、[公式ドキュメント](https://k6.io/docs/)をご覧ください！
公式ドキュメントは、わかりやすい英語で書かれており、スイスイ読むことができます。
初心者がenebularのチュートリアルをみてどれだけ理解し、できるのか検証してみた！



はじめまして。ウフルの藤原です。

この記事では、完全文系脳の私がenebularのチュートリアルを誰の助けも得ずにどれだけできるかを検証し、非エンジニアの目線で改善点や良かった点を挙げてみました。


### enebularのチュートリアルとは

enebularのチュートリアルは、以下に公開されているenebularの操作を簡単に学習するためのコンテンツです。

https://docs.enebular.com/ja/

以下のようなコンテンツから構成され、サインアップからデータの可視化まで一通りの操作を確認できます。

- サインアップ〜プロジェクトの作成

- フローの実行

- デバイスでのフローの実行

- Herokuへのフローのデプロイ

- データの可視化

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2952678/d4a0bfa8-b6c3-8c71-c186-3cab108bf2aa.png)


一通り、やってみてわかったことですが、基本的に、図や画面のイメージどおりに進めれば完了できるようになっています。

初心者の私も全部できました！

ただ、以下の点が私のような初心者には理解しずらかったと感じましたので、その点についてご説明します。

## やってみて難しかったところ

1. 専門用語のあるところ

2. 説明が先にあるところ

3. うまくいかないときの対処方法

### 専門用語のあるところ

enebularが簡単とはいっても、チュートリアルをすすめるための前提となる知識はやはり必要です。イントロダクションで基本的な用語はおさえておきましょう。

チュートリアルを進めて、モーダルという専門用語があって意味不明でした。ググってみると、モーダルとは、前面に出てくるウインドウのことだとわかりました。

このような専門用語は初心者にとっては内容を理解しにくくなります。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2952678/01445a86-67f2-d149-368b-7fb2d4481738.png)

### 説明が先にあるところ

初心者は、リンクのあるところ全部先に読み込まないとわからないと考えます。

しかし、読めば読むほど、わけがわからなくなることも結構あります。実際にチュートリアルを進めるだけなら、読まなくても良かったりします。

例えば、クラウド実行環境のこちらの説明や定義とかはチュートリアルを完成させた後でもよかったと思います。終わってから読んでもらうなどの工夫をした方がとっつきやすいかもしれません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2952678/35dba64b-e472-0ced-3ae0-f75df94d833a.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2952678/7fafe2fb-a304-6625-2400-41b3a2fe1d47.png)

### うまく行かないときの対処方法

Discoverで表示がうまくされないことがありました。初心者からすれば、チュートリアルで想定外のことがおこるだけでパニックになります。

私の場合は、その後再現せず、もう一度やったらうまく行きました。

そういうときは、ひとまず休憩して、もう一度やり直すことをおすすめします。

## まとめ

今回、プログラミングに抵抗がある私でも、まずは軽くやってみることで、チュートリアルをすすめて、デモを完成させることができました。特に、画像や図があると理解の助けになりました。

初心者にとって難しい言葉の定義や専門用語があるとアレルギーを起こしがちです。企画開発部門の人にも改善のためのフィードバックをしたいと思いました。

## enebularとは

enebular（エネブラー）は、IoT製品・サービスづくりを包括的に支援する、開発・運用サービスです。

初心者でもエッジとクラウドをまたがるアプリを作れるようなサービスを目指しています。

enebularは無料で始められます。ご登録は以下から、よろしくお願い致します。

https://www.enebular.com/ja/
git submodule 追加・削除のやり方【2022 年版】

「git submodule 削除」でやり方を調べると何通りか方法が見つかりますが、中には古いものもあったりして紛らわしいので現在のやり方をまとめてみようと思います。

検証バージョン

```shell
$ git --version
git version 2.38.1.windows.1
```

## 準備

サブモジュールとして追加したいリポジトリのクローン URL を用意してください。
ここではクローン URL を `https://github.com/ryangrose/easy-pandoc-templates.git` とします。
また、クローン先のパスを `docs/templates/easy-pandoc-templates` とします。

以下の変数を実際のリポジトリやパスに変えると、その後のコマンドがコピペで実行できます。
ぜひお試しください。

```shell
CLONE_URL="https://github.com/ryangrose/easy-pandoc-templates.git"
CLONE_PATH="docs/templates/easy-pandoc-templates"
```

以後のコマンドは、すべて親リポジトリのルートディレクトリで実行します。

## 操作

### 追加する

以下のコマンドを実行します。

```shell
git submodule add ${CLONE_URL} ${CLONE_PATH}
```

### 削除する

以下のコマンドで削除できます。
削除後は忘れずにコミットを行ってください。

```shell
git rm ${CLONE_PATH}
```

https://git-scm.com/docs/gitsubmodules#_forms

> Deleted submodule: A submodule can be deleted by running `git rm <submodule path> && git commit`. This can be undone using `git revert`.

これで削除は完了なのですが、Git のディレクトリ内部には保持しているようです。
これにより、削除したサブモジュールを再度追加したい場合に、別のリポジトリからフェッチすることなくチェックアウトできるようになっています。

> The submodule’s working directory is removed from the file system, but the Git directory is kept around as it to make it possible to checkout past commits without requiring fetching from another repository.

Git のディレクトリ内部からも完全に削除したい場合、以下のコマンドを実行します。

```shell
rm -rf .git/modules/${CLONE_PATH}
git config --remove-section submodule.${CLONE_PATH}
```

### 再び追加する

追加のコマンドをもう一度実行します。

```shell
git submodule add ${CLONE_URL} ${CLONE_PATH}
```

Git のディレクトリ内部にリポジトリの内容が残っている場合、以下のようなエラーメッセージが表示されます。
Git のディレクトリ内部まで完全に削除した場合は表示されません。

```text
fatal: A git directory for 'docs/templates/easy-pandoc-templates' is found locally with remote(s):
  origin        https://github.com/ryangrose/easy-pandoc-templates.git
If you want to reuse this local git directory instead of cloning again from
  https://github.com/ryangrose/easy-pandoc-templates.git
use the '--force' option. If the local git directory is not the correct repo
or you are unsure what this means choose another name with the '--name' option.
```

過去に削除したモジュールをもう一度同じパスに取り込む場合は `--force` を付けて実行します。

```shell
git submodule add --force ${CLONE_URL} ${CLONE_PATH}
```

出力

```text
Reactivating local git directory for submodule 'docs/templates/easy-pandoc-templates'
```

## 参考にした記事

https://stackoverflow.com/questions/1260748/how-do-i-remove-a-submodule

https://git-scm.com/docs/gitsubmodules

https://qiita.com/k_yamashita/items/040c04f8798d2384806e
【DataGrip】invalid fetch size というエラーが出た件

<br>
備忘録のために記事にします。(二度と同じ事象にならないかもですが)
もし、この記事を見て参考になれば幸いです。

## 事象について
ある日突然DataGripからテーブルを見ようとすると以下のエラーが表示され、テーブルが見れない状態に。

```
9:26	[table_name]
(conn=137361316) invalid fetch size.
		および 25 件の重複レポート (3 秒 485 ms)
```
一旦テーブルをリフレッシュしたところ、全てのテーブルが消えてしまった…！！

invalid fetch size … 無効なフェッチサイズ…
何のことかさっぱりなのでGoogle先生に頼ることに。

## 参考サイト

https://youtrack.jetbrains.com/issue/DBE-16376

https://youtrack.jetbrains.com/issue/WI-68759

上記サイトを確認すると、どうやらドライバーのバージョンによるものらしい… なぜ急に…

ちなみにドライバーのバージョンの確認方法は以下の通り。
[File] > [Data Sources] > サイドメニューの[Drivers]タブ > DBを選択するとそのドライバーのバージョンが確認可能。
![DBドライバー確認方法.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1739387/b654275b-8d73-ada6-b6e2-91c5b59b9e01.png)

また、自分はDataGripは日本語に変更しています。変更したい方は以下からプラグインをインストールしましょう。
[File] > [settings] > [Plugins] > 検索から"Japan"と入力し、「Japanese Language Pack / 日本語言語パック」をインストール
![日本語パック.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1739387/01313512-0216-f04e-f4df-c168b7118bb2.png)


## 解決編
余談はさておき、解決方法ですが、
こういうのはまず本体のバージョンを最新にしてからだな~と思い、[Help] から [Check For Updates] を押し、
最新バージョンに更新をかけたところ、なんと直ってしまいました。

意外とあっさり<b>DataGrip本体のバージョンアップ</b>により解決してしまいました。


## 最後に

もし、同様の事象に陥った方いらっしゃれば、まずは<b>DataGripのバージョンを最新にしましょう。</b>

それから参考サイトに挙げさせていただいたサイトの通り、ドライバのバージョンをダウングレードいただくと解決できるかもしれません。
picoCTF Writeup picoGym Practice Challenges dont-use-client-side (注意<spoiler>)

# dont-use-client-side

Description
Can you break into this super secure portal? https://jupiter.challenges.picoctf.org/problem/17682/ (link) or http://jupiter.challenges.picoctf.org:17682

htmlにフラグがある

```
  function verify() {
    checkpass = document.getElementById("pass").value;
    split = 4;
    if (checkpass.substring(0, split) == 'pico') {
      if (checkpass.substring(split*6, split*7) == '706c') {
        if (checkpass.substring(split, split*2) == 'CTF{') {
         if (checkpass.substring(split*4, split*5) == 'ts_p') {
          if (checkpass.substring(split*3, split*4) == 'lien') {
            if (checkpass.substring(split*5, split*6) == 'lz_b') {
              if (checkpass.substring(split*2, split*3) == 'no_c') {
                if (checkpass.substring(split*7, split*8) == '5}') {
                  alert("Password Verified")
                  }
                }
              }
      
            }
          }
        }
      }
    }
    else {
      alert("Incorrect password");
    }
    
  }
```

picoCTF{no_clients_plz_b706c5}