OmniAICreator/Qiita-1.07M huggingface dataset:
ブロックチェーンで何ができるのか

最近、ブロックチェーンサービスに興味があり、DAppを作ってみようとと思い勉強することにしました。
まずは、ブロックチェーンで何ができるのかをこの記事で自分なりにまとめてみたいと思います。

# ブロックチェーンとは
**ブロックチェーン**は、データのハッシュ値を収めた**ブロック**を時系列で鎖のようにつなげた技術のことです。
各ブロックは一つ前のブロックを指しており、ブロック内にはトランザクションをリストで保持しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2499481/9c3969ef-f948-ec19-cb68-fb07584c4de2.png)
ブロックチェーンの特徴として**自律分散システム**が挙げられます。
中央集権システムとは異なり、ブロックチェーンはノード(コンピュータ)によって管理されます。
各ノードは同じブロックチェーン情報を共有します。
そのため、**データの透明性**を実現できます。データが改ざんされた場合には他のノードとの比較・検証などにより、**耐改ざん性**も実現できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2499481/faec3ef2-4ee8-50e0-9786-b4fad839f52f.png)

ブロックチェーンの種類には3つあります。特徴を表にまとめました。

|種類|管理者|ユーザ|
|---|---|---|
|パブリックチェーン|なし|不特定多数|
|プライベートチェーン|単体|限定|
|コンソーシアムチェーン|複数|限定|

簡単にブロックチェーンのメリット・デメリット(現状の問題点)を挙げておきます。

**[メリット]**

* **システムダウン耐性**  
分散管理によって、一つのノードがダウンしてもほかのノードが生きている限りシステムとしては動き続けます。
* データの信頼性  
分散管理しているので、**データの透明性**があります。また、時系列でデータをブロックとして繋がっているので**追跡可能性**があります。
* **データの耐改ざん性**  
これも分散管理によるデータの耐改ざん性があります。
* **スマートコントラクト**  
スマートコントラクトに対応しているブロックチェーンは、契約の自動化ができヒューマンエラーなどのミスも発生しません。  
ただし、スマートコントラクトを一度ブロックチェーン上にデプロイすると変更ができないため、もし脆弱性が存在するとサービスが崩壊してしまいます。

**[デメリット]**

* スケーラビリティ問題  
ブロックチェーン内でトランザクションが増加すると承認などに時間がかかり、承認コストも高くなります。  
また、処理速度も低下し完了までに遅延が発生するようになります。
* 法的な問題  
法的な整備が必要です。特に日本の法律は厳しいらしく知らない間に法に触れていることもあるそうです。


# ブロックチェーンで何ができるのか
ブロックチェーンとはどのようなものかがわかったところで実際どのようなことができるのでしょうか。

## 例1:暗号資産(仮想通貨)
>「暗号資産（仮想通貨）」とは、インターネット上でやりとりできる財産的価値であり、「資金決済に関する法律」において、次の性質をもつものと定義されています。
（1）不特定の者に対して、代金の支払い等に使用でき、かつ、法定通貨（日本円や米国ドル等）と相互に交換できる
（2）電子的に記録され、移転できる
（3）法定通貨または法定通貨建ての資産（プリペイドカード等）ではない
日本銀行HPより(https://www.boj.or.jp/announcements/education/oshiete/money/c27.htm/)

Bitcoinをはじめ、Ethereum、BNBなどの暗号資産にブロックチェーン技術が使われています。
ブロックチェーンのトークンを発行し、そのトークンを用いて取引を行います。
このトークンはそのままでは価値は無く、**需要と供給が生まれることで価値が発生**します。
ブロックチェーンを使用することで、取引履歴が誰でも参照でき、改ざんされないというメリットがあります。

## 例2:自動決済システム
契約プロセスをスマートコントラクトなどで自動化し、契約内容をブロックチェーンに記録するシステムです。
ブロックチェーンを使用することで、契約内容は改ざんされることがありません。
また、スマートコントラクトを使用することで、契約上のヒューマンエラーは発生しません。

## 例3:サプライチェーン
ある商品がどこでどのように作られたのかなどの履歴をブロックチェーンに記録することで、消費者へ安心を届けることができます。
ブロックチェーンを使用することで、商品が辿ってきた経路を、消費者などが参照することができるメリットがあります。

# まとめ
ブロックチェーンの特徴は、以下のようになります。

* データの透明性と追跡可能性
* データの耐改ざん性
* システムダウン耐性
* スマートコントラクト

つまりこれらの特徴を活かしたサービスを考えると、よいブロックチェーンサービスができそうです。
次回は簡単なDAppを考えてみたいと思います。
SwiftUI内でUIViewControllerを使おう

# 概要

SwiftUIがだんだんと使われてきている印象を受けますが、まだまだ世間ではUIViewControllerが使われているのも事実です。
ただ単にUIKitベースの画面を表示したいのであれば `UIViewControllerRepresentable` などを使えばいいのですが、
特にサードパーティがリリースしている広告SDKなどはUIViewControllerが必要な実装が行われているので、SwiftUI内で広告を出そうとする場合、工夫が必要になります。

# SwiftUI内でUIViewControllerを取得

なるべくSwiftUIっぽくViewControllerを使おうと考え、以下のような形になりました。
ContainerViewがViewControllerを返してくれて、それを使って広告など、ViewControllerが必要なビューを表示していきます。

```swift
struct SwiftUIView: View {
    var body: some View {
        ContainerView { viewController in
            // UIViewControllerが必要な広告を、UIViewRepresentableで実装
            AdView(viewController: viewController)
        }
    }
}
```

もちろんこれはプレビューでも動作し、広告が表示されます。

![スクリーンショット 2022-01-13 17.57.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/687960/dbbba6a2-9b12-7583-3088-cf885ec5dd33.png)


# ContainerViewの実装
ViewControllerを返すContainerViewの実装です。
内部はUIViewControllerRepresentableを実装しています。

```swift
struct ContainerView<Content>: UIViewControllerRepresentable where Content : View {
    let content: (UIViewController) -> Content
    
    func makeCoordinator() -> Coordinator {
        Coordinator(self)
    }

    func makeUIViewController(context: Context) -> UIViewController {
        let vc = UIHostingController(rootView: AnyView(EmptyView()))
        vc.rootView = AnyView(content(vc))
        return vc
    }

    func updateUIViewController(_ viewController: UIViewController, context: Context) {
        viewController.rootView = AnyView(content(viewController))
    }

    class Coordinator: NSObject {
        var parent: ContainerView

        init(_ viewController: ContainerView) {
            parent = viewController
        }
    }
}
```

キモとなるのは `makeUIViewController(context:)` の部分で、一度ベースとなるUIHostingControllerをEmptyViewで作成しておいてViewControllerインスタンスを作った後、改めてパラメータのcontentをあてがう実装になってます。
これでContainerViewの内部はcontentのUIになり、SwiftUI側にはViewControllerが返されます。

# ライブラリに登録
UIViewControllerをしょっちゅう使う場合は、このContainerViewをライブラリに登録しておくと便利です。

```swift
import DeveloperToolsSupport
import SwiftUI

struct UIKitViewContent: LibraryContentProvider {
    var views: [LibraryItem] {
        LibraryItem(ContainerView(content: { _ in EmptyView() })
                    ,title: "ViewController container"
                    ,category: .layout)
    }
}
```

右上あたりの+ボタンから追加できるようになります。

![スクリーンショット 2022-01-13 17.54.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/687960/d548846f-6cd8-d8de-a4b1-0787ef858423.png)
SourceTreeでOAuthのみになったGitHubのクローンをするメモ

# SourceTreeでOAuthのみになったGitHubのクローンをするメモ 2022/1/13現在

Googleで検索しても古い情報ばかりだし、でてきても汎用性がない情報ばかりだったので

## GitHub側の準備

### アクセストークンの作成
1. Settings → Developer settings → Personal access tokensをひらく
1. Generate new tokenで新しいトークンをつくる
1. 作成したらわかるように保存しておく。作成した瞬間しかコピーできないので注意。


## SourceTree側の準備

### GitHubのアカウント情報を削除する

ツール → オプション → 認証のGitHubアカウントやパスワード関係を削除しておく。

### GitHubアカウントを追加する

1. 「追加」押下ででてきたダイアログでGitHubと認証はOAuthを選択する
1. ユーザー名は空のままで、「OAtuchトークンを再読み込み」を押す
1. ブラウザが勝手に起動してGitHubのアカウントと何かする画面がでる
    * ブラウザでGitHubにログイン中の場合はすぐに完了する
    * 未ログインの場合はログインを促してなんかする画面になる
1. ブラウザでなんかした後は、SourceTree側のダイアログの下の方に「認証に成功」と表示される


## SourceTreeでのリポジトリクローン

1. リポジトリクローンの画面をだす
1. URLにさっき作成したトークンをくっつけて入力する

```
https://github.com/hogehoge/hogehoge.git
↓ 
https://さっき作成したトークン@github.com/hogehoge/hogehoge.git
```

以上
【JavaScript】関数を別ファイルでも使えるようにする【忘備録】

JavaScriptのファイル間で同じ関数を使用したい場合は

```js
const 関数名 = () => {
  
};
```
から

```js
window.関数名 = () => {

};
```
に変えるだけで、ファイルを跨いで使用することができるようになります。
ファイルを分割したいときなどに便利です。
azureの基礎

Azure よくわからんのでまとめる。

# インスタンスの状態

## 停止済み

OSをシャットダウンしただけだと状態は「停止済み」となるが、課金される。

## 停止済み (割り当て解除)

コンソール上で、「停止」ボタンを押すと「停止済み (割り当て解除)」になる。

この状態は課金されない。

IPアドレスを固定してない場合には、この際に IPアドレスが解放される。

パブリックIPアドレスを予約することで、次回インスタンスを開始する際に同じパブリックIPで接続するようにすることもできるが、料金が発生する。

# パブリックIP

インスタンスの停止でパブリックIP は解放される

![Pasted Graphic 2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/84947/4caf95cd-e393-0572-b410-5e6d33f4c2e2.png)

停止時に「パブリック IP を予約」することも可能だが、インスタンスが停止している場合は課金される。

IPを固定することも可能、この場合は、インスタンスの状態に関わらず課金される。

https://azure.microsoft.com/ja-jp/pricing/details/ip-addresses/

課金っても、そんなにかかるもんでもない（300〜360円/月）ので、ある程度常時稼働させるなら固定しても良いかも。

一旦予約した パブリック IP を解放する手順は若干複雑。

## DNS 名

パブリック IP が動的な状態でも DNS 名ラベルを付けることで、 DNS 名でアクセスできるようになる。

仮想マシンを停止する際にパブリック IP を予約してない場合には　IP アドレス自体は解放されてしまうので、次回起動時に異なる IP アドレスが振られた状態で起動してしまうが、DNS 名は同じなので、RDP などの接続先を IP アドレスではなく DNS 名で設定しておけば、起動するたびに設定し直す手間は無くなる。

ちなみに、TTL は 10秒 に設定されているように見えるので、朝起動して業務終了時に停止するような運用なら問題なさそう。


## 予約した IP アドレスの解放

ちょっとめんどいのでメモ。

一旦予約すると　パブリック IP アドレスの割り当てが「静的」となってグレーアウトされ変更できなくなる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/84947/738092a7-5059-9557-df57-eab9b48536ac.png)

> このパブリック IP アドレスは、ネットワーク インターフェイス の IP 構成 'ipconfig1' に関連付けられているため更新することができません'<インターフェイス名>'.

インターフェイス名のリンクをクリックし、[設定 > IP 構成] で ipconfig1 をクリックする。

ipconfig1 のパブリック IP アドレスで「関連付け解除」をクリックして「保存」をクリック。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/84947/015d44e5-ee10-f1fe-fb7c-261c55c9e8df.png)

再度 パブリック IP の構成画面に戻ると、割り当てを動的に変更できるようになるので動的に変更して「保存」をクリック。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/84947/00b54e70-2915-b621-7110-ee98ec7b603e.png)

再度ネットワーク インターフェイスの [設定 > IP 構成 > ipconfig1] を開き、先ほど関連づけを解除した パブリック IP アドレスを関連づけて保存。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/84947/215ad5f2-79e2-7844-7688-e8e62b2235d3.png)

以上で、動的IPの状態に戻る。
AWS Certified DevOps Engineer - Professional 合格しました

先日、AWS認定DevOpsエンジニアプロフェッショナルの試験を受験し、合格しました！
その記録を残しておきます。

AWS認定資格としては12個目になります。先月からの約1ヶ月での連続受験としては7個目です。今回でAWS認定資格をコンプリートしました。

前回の受験はSolution Architect Professionalでしたが、その数日後に今回の受験です。

前回受験の記事

- [AWS Certified Solutions Architect - Professional 合格しました - Qiita](https://qiita.com/suzuki-navi/items/eeac0099cd7bdcb12847)

# 勉強方法

Solution Architect Professionalの試験の時は、AWSのすべての領域を勉強したつもりになっていました。しかし、Solution Architect Professional受験後の夜にDevOps Engineerのサンプル問題を見たら、ぜんぜんわからなくて、DevOps Engineerの領域は改めて勉強しないといけないと気が付きました。当たり前なんですが。。。その後なにもしないまま、よし明日受験しよう！と思い立って試験を申し込み、それから勉強し始めたので、勉強は約24時間前からです。

前日午後にBlack Beltの資料を読みました。一部はYouTube動画を見ました。見たのは以下のあたりです。これを見ながらこれまでの試験勉強で書いた自分のノートを更新します。

- CodeCommit
- CodeArtifact
- CodeBuild
- CodeDeploy
- CodePipeline
- X-Ray
- ECS

Black Beltを読んだ後、もう一度サンプル問題を解いたら正答率8割でした。BenchPrepの模擬試験も解き、正答率75%でした。

# 試験当日

75問180分。一巡するのに160分ぐらいかかりました。途中から疲れてきて、だんだん考えるのも適当になってました。難しくてちゃんと問題文も選択肢もちゃんと読まないと解けないのですが、選択肢を全部読み込まずに適当に答えた問題もあります。落ちたらまた受ければいいし、という感じ。前回のSolution Architect Professionalと違って、完全に一夜漬けでしたので、寝不足で集中力欠けました。それでも前回のSolution Architect Professionalより少し早く解けたので、Solution Architect Professionalよりは簡単だったのでしょう。

日本語は前回のSolution Architect Professionalに比べて今回ひどかったです。日本語だけでは絶対に解けない問題がいくつかありました。

ここ1ヶ月の7連続受験はすべて同じテストセンターで受験しました。週に1〜2回ペースでテストセンターに来てたことになります。勤務先オフィス出社よりも高頻度です。受付でやりとりする内容も毎回まったく同じなので、スムーズです。スタッフの顔ももちろん覚えてます。きょうは混んでるから受付が増設されてるとか、きょうはエレベータが故障中とか、いろいろありましたが、しばらくお別れです。

- なんの試験ですか？→ AWS
- 予約時間と名前（かぶりやすい名字なのでフルネーム）を言う
- 書類記入
- 身分証明書2つ提示（片方はすぐにしまう）
- 体温測定
- 顔写真撮影
- ロッカーに荷物入れる
- 注意書き書面を渡される（毎回同じなので読まない）
- ポケットチェック
- 手のひらチェック
- マスクの裏面チェック
- 注意事項を説明される（受けたことあると言えば省略される）
- 席案内
- 画面上で名前と試験名の確認
- Startボタンをクリック

# 結果

スコア 885 （合格ライン 750）。試験中の難易度の印象と比べて意外とスコアがいい。もっとギリギリかと思ってました。

# 所感

これまでにアソシエイトやスペシャリティやソリューションアーキテクトを受験してきたので、DevOpsエンジニア独自領域と思われるCodeなんちゃら系のサービスを中心に勉強しただけで済みました。これまでの試験で勉強した範囲と絡むような試験問題もたくさんありましたが、連続受験のおかげで記憶がある程度残っており解きやすかったです。AWSの各試験は出題範囲が重なっているので、数を集めたい場合は連続して取得してしまうのがおすすめです。
Webページが表示されるまでの流れ

# はじめに
Webページが表示されるまでの流れを整理しました。

__流れ__
1. URLをブラウザに入力
2. DNSサーバーにアクセスし、ドメインに紐づいているIPアドレスの取得
3. 取得したIPアドレスを所持するWebサーバーにHTTPリクエスト
4. Webサーバーからレスポンスが返却され、 ブラウザに表示される

__用語__

- URL:Webサイトの場所
- DNSサーバー:ドメインをIPアドレスに変換するサーバー、DNSが無いとIPアドレスを覚えておく必要がある
- Webサーバー:クラインアントのリクエストに対してサービスを提供するサーバー
- HTTPリクエスト:クライアントから、Webサーバーに対してのリクエスト

# おわりに
何か間違い等あればご指摘いただけるとありがたいです。

# 参考文献
https://www.amazon.co.jp/%E3%82%A4%E3%83%A9%E3%82%B9%E3%83%88%E5%9B%B3%E8%A7%A3%E5%BC%8F-%E3%81%93%E3%81%AE%E4%B8%80%E5%86%8A%E3%81%A7%E5%85%A8%E9%83%A8%E3%82%8F%E3%81%8B%E3%82%8BWeb%E6%8A%80%E8%A1%93%E3%81%AE%E5%9F%BA%E6%9C%AC-%E5%B0%8F%E6%9E%97-%E6%81%AD%E5%B9%B3/dp/4797388811/ref=as_li_ss_tl?_encoding=UTF8&qid=1608292851&sr=8-1&linkCode=sl1&tag=maro0109-22&linkId=2fc65b720532aadadf169139e0c502d6&language=ja_JP
Cloud FunctionsでCloud SQLを操作する

# 開発背景
こんにちは。
現在、Flutter＆Firebaseでアプリを作っているのですが、Firebase Firestoreの無料枠は大変助かるものの、細かい検索に対応するには限界を感じているので、GCPのCloudSQLを利用できたらいいなーなんて思い、とりあえず試しに作ってみる次第です。

# 開発指針
アプリからGCPのCloudSQLに接続するまでに、２つのパターンを想定してみました。
1. GCPのCloudFunctionsでSQLを操作し、アプリが接続できるAPIを作る
2. FirebaseのCloudFunctionsでSQLを操作し、アプリが接続できるAPIを作る

料金のことを考えると、2で無料枠のあるFirebaseでAPIを作成した方がよさそうな気がしたのですが、CloudSQLに接続するにはアイパスで繋げる方法しか見つからず、GCP内でAPIとデータベース間を安全に接続できるであろう1の方法を採択してみました。

下記の公式ドキュメントにトライの方法があったので、そのまま試してみます。
https://cloud.google.com/sql/docs/mysql/connect-functions

#手順

1. Cloud SQL APIを有効にする
2. CloudSQLをプライベートIPで作成する
    * https://cloud.google.com/blog/ja/products/databases/connect-a-private-cloud-sql-instance-to-private-ip-vm 

3. Cloud SQL インスタンスと同じ VPC ネットワークにサーバーレス VPC アクセス コネクタを作成します。
    * https://cloud.google.com/vpc/docs/configure-serverless-vpc-access#creating_a_connector

4. コネクタを使用するように Cloud Functions を構成します。
    * https://cloud.google.com/functions/docs/networking/connecting-vpc#configuring

5. サンプルを参考にCloud Functionsで関数を作って完成
【RPA】ロボット管理をする際に必要だと思う情報

# はじめに
現在、RAPを実務で行っていますが、まだまだまだまだ経験が浅く、日々勉強中です。
本記事については、自身の備忘録も含め同じ様な所で頭を抱えている方に対して、
少しでもヒントになり、先に進める力となれれば良いなと思い記事にしましたーー！

## 今回のTips
今回は、「ロボット管理をする際に必要だと思う情報」について、まとめてみました。
これがすべてでは無いと思うのですが、僕がロボットの開発+運用保守をしていて、管理に必要だと思った項目について挙げています。参考にして頂けると幸いです。

## Tips
業務でロボット開発＋管理をしている上で、以下は最低でも必要かなと思いました。

|項目|内容|
|---|---|
|- 稼働有無|現在、稼働しているかどうか。稼働終了しているロボットは管理から削除しても良いですが、過去ロボットが管理リストにあると、参考になったケースがありました|
|- 管理番号|そのロボットを管理する一意の番号|
|- 使用部署名_1|どこの部署で使用されているのかの記載。規模によっては不要な場合もあると思います。|
|- 使用部署名_2|使用部署の詳細|
|- 申請日|いつから使用開始されたロボットなのかの日付|
|- 作成元|どこで開発されたロボットなのか？RPAを担当している部署なのか、現場なのか|
|- ロボット作成者名|誰が開発したロボットかの記載|
|- 業務担当者|その業務の担当者名|
|- 処理名|そのロボットが処理している作業の処理名|
|- 起動方法|Kapplets実行 or スケジュール実行|
|- スケジュール（実行頻度）|稼働スケジュールを記載|
|- 稼働時間(分)|トータルの稼働時間を記載|
|- 年間削減時間|そのロボットに業務が置き換わった事で、どれぐらい業務時間が削減されたのか|
|- KCU消費ポイント|どれぐらいKCUを消費するロボットなのかを把握する為に記載|
|- DAの使用有無|DAを使用するロボットかどうかを記載|
|- 使用システム|どんなシステムを使用するのかを記載|
|- 運用時の注意点|何か開発者しか知らないような運用に関する注意点を記載|
|- 再実行時の注意点|ロボットを再実行する際の注意点を記載(このファイルは退避しておく等)|

以上になります。他にも、その職場ごとで毎月の報告の為に必要な項目や、連携しているシステムの参照しているカテゴリなど、管理した方が良いと思われる項目は追加していただければと思います。
PHPのバージョンが勝手に変更されてMongoDBにアクセスできなくなった話

### ※アップデート
2022年1月15日：apt upgradeでパッケージが更新されないようにする方法を追記しました

# 症状
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/459889/27c918fb-43a9-27d1-dc5a-7a6365cfb9ee.png)


突然MongoDBへアクセスができなくなったしまった
PHPのドライバが対応していないっぽい

# 解決
### PHPのバージョンを確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/459889/50e306d2-2548-e147-17bf-7b179ddee134.png)

```bash
$ php -v
PHP 8.0.12 (cli) (built: Oct 22 2021 12:34:00) ( NTS )
Copyright (c) The PHP Group
Zend Engine v4.0.12, Copyright (c) Zend Technologies
    with Zend OPcache v8.0.12, Copyright (c), by Zend Technologies
```

PHP8.0.12はアウト
もともとは**PHP7.2**で動いていた

### PHP8 ➢ PHP7.2へダウングレードする
存在するPHPのバージョン一覧を確認

```bash
$ ls /usr/bin | grep -i php
dh_phpcomposer
dh_phppear
jsonlint-php
php
php7.2
php7.4
php8.0
php-config
php-config7.2
php-config7.4
phpize
phpize7.2
phpize7.4
```
php7.2へ変更する


まず現行動いているphp8.0を無効にする

```bash
$ sudo a2dismod php8.0
[sudo] password for sugimoto:
Module php8.0 disabled.
To activate the new configuration, you need to run:
  systemctl restart apache2
```

そしてphp7.2を有効にする

```bash
$ sudo a2enmod php7.2
Considering dependency mpm_prefork for php7.2:
Considering conflict mpm_event for mpm_prefork:
Considering conflict mpm_worker for mpm_prefork:
Module mpm_prefork already enabled
Considering conflict php5 for php7.2:
Enabling module php7.2.
To activate the new configuration, you need to run:
  systemctl restart apache2
```

php7.2に切り替えを実施

```bash
$ sudo update-alternatives --set php /usr/bin/php7.2
update-alternatives: using /usr/bin/php7.2 to provide /usr/bin/php (php) in manual mode
```

Apache2の再起動

```bash
$ sudo systemctl restart apache2
```

確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/459889/ac1d0800-e7d5-c258-0786-0adfff6eed0c.png)

変わっているのでOK

データも見れているのでOK
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/459889/28cd0af9-4f6c-1f90-b441-e4e92df3d934.png)


## 追記：apt upgradeでパッケージが更新されないようにする方法！
今回の原因は不意な`apt upgrade`をした結果発生したものかと思いまして，その際にパッケージが更新されないようにする方法を見つけました．
[こちらの記事](https://qiita.com/komeda-shinji/items/339b8e14b3f8b658b288)を参照にしています

つまりパッケージを

```
$ sudo apt-mark hold (php7.2系)
```

に固定することで勝手にアップデートされることはなくなりそうです！
MPS法の重み関数と粒子数密度について

# はじめに
　一般的な流体シミュレーションでは空間をグリッドに分割して流体を表現します．これを「格子法」と呼びます．
　一方，流体を粒子で表現しようとするのが「粒子法」です．粒子法にはいろんなメリットがあります（[こちら](https://www.particleworks.com/mps_particlebasedmethod_ja.html)のサイトで詳しく説明されています）．何よりも，個人的には粒子法の方が物理的に自然なモデリングかなぁと思っています．
　この記事は「MPS法解説シリーズ」の一部です．このシリーズでは粒子法の一種である「MPS法」を解説しています．初めましての方は，ぜひ[シリーズの全体像](2022-01-09_0a8f34a2ea06c4fc96b5.md)からご覧ください．

# 目次
[やりたいこと](#やりたいこと)
[重み関数](#重み関数)
[粒子数密度](#粒子数密度)
[まとめ](#まとめ)
[参考文献](#参考文献)

# やりたいこと
　この記事では重み関数と粒子数密度についてご紹介します．これらは今後の記事でご紹介する「離散化モデル」の理解に必要不可欠な概念です．

# 重み関数
　粒子法では微分方程式を離散化する際に粒子間の相互作用を考慮します．その際，近くにある粒子の影響をより大きく反映させるため，重み関数を用います．すなわち，粒子 $i$ に対する粒子 $j$ の影響を，その間の距離に応じて”重み付け”するわけです．重み関数のことをkernelと言ったりもします．

　重み関数は様々なものが提案されていますが，基本的に必要な性質としては以下の2つが挙げられます．
　　性質1 距離が近づくにつれて重み関数の値が無限大に発散すること
　　性質2 ある距離以上離れると値がゼロになること（これをcompact supportといいます）
性質1には，粒子同士が近づきすぎることを防ぐ目的があります．性質2は計算時間を短縮するために重要です．仮に無限遠まで値を持つ重み関数を採用すると，1つの粒子に関する値を求めるのにシミュレーション空間の全粒子について計算しなくてはなりません．

　このような性質を持つ重み関数として一番シンプルなのは次のようなものです．

```math
w_{ij}= \left\{
\begin{array}{}
\frac{r_e}{|\boldsymbol{r}_{ij}|}-1 &(0\le|\boldsymbol{r}_{ij}|\le r_e)\\
0 &(r_e<|\boldsymbol{r}_{ij}|)\\
\end{array}
\right.
```

ここで， $r_e$ は特定のパラメータであり粒子の影響半径を表します．経験的に， $r_e$ は粒子間距離の2倍～4倍に取るのがいいとされています[（Koshizuka and Oka, 1996）](http://li.mit.edu/Stuff/CNSE/Paper/Koshizuka96Oka.pdf)．

　重み関数の形としてはこれ以外にも多くが提案されており，それぞれで計算精度の向上が認められています．近いうちにこれらについてもまとめたいなぁと考えています．

# 粒子数密度
　流体の密度を評価するために，粒子数密度 $n$ を用います．

`math
n_i=\sum_{j\ne i}w_{ij}
`
すなわち，粒子数密度は重み関数の和です．これを用いて，流体密度は近似的に次のように求まります．

`math
\frac{\rho_i}{\rho^0}
\approx\frac{n_i}{n^0}
`
粒子数密度の基準値 $n^0$ としては，粒子が等間隔に並んでいる初期配置において十分内側に位置する粒子の粒子数密度を用います．

#まとめ
　この記事では重み関数と粒子数密度についてまとめました．現時点では基本的なことしか述べられていませんが，重み関数の改良形はいくつか提案されていて，奥が深い内容です．今後どんどんアップデートしていきたいと考えています．

# 参考文献
・[粒子法（越塚先生）](https://www.maruzen-publishing.co.jp/item/?book_no=293175)
・[粒子法入門](https://www.maruzen-publishing.co.jp/item/b294791.html)
・[粒子法（後藤先生）](https://www.morikita.co.jp/books/mid/092231)
Express.jsにPassport.jsで、任意のフォルダ配下のみをBasic認証する

## 概要
expressを使って特定フォルダのみパスワードを掛けたい。

参考サイト、、、っていうかほぼ以下のページからゴニョゴニョした。
ありがとうございます。
Express.jsにPassport.jsで、任意のフォルダ配下のみをBasic認証する
https://qiita.com/hoshimado/items/272fba1aeb728e14f278


```JavaScript
const express = require("express");
const PORT = 3000;
const app = express();
//
const passport = require("passport");
const passportHttp = require("passport-http");
passport.use(new passportHttp.BasicStrategy(
    function (username, password, done) {
      if(username=="user" && password=="pass"){
        return done(null,true);
      }else{
        return done(null, false);
      }
    }
));
app.use("/admin", passport.authenticate("basic",{session: false}), express.static("public/admin") );
//
app.use("/", express.static("public/") );

app.listen(PORT, () => {
  console.log("app listening on port " + PORT + " " + new Date());
});
```

## 結論
動いた！ばんざーい。
いまはただそれしかない。

しかし、express-basic-authを使うほうがいまどきなのかしらん。
express全体にかけることはできても、個別のフォルダにかけるのがなんかわからんかった。
（portを2つ開けて2つのexpressを立ち上げて、publicとprivateに分けるみたいののでいいのかなぁっともおもったけどね。それはちょっとね。）


## 参考サイト
Express.jsにPassport.jsで、任意のフォルダ配下のみをBasic認証する
https://qiita.com/hoshimado/items/272fba1aeb728e14f278

Basic HTTP authentication with Node and Express 4
☑ express-basic-auth is what you want
https://www.titanwolf.org/Network/q/1ad72a53-1a15-4d32-9d05-3b39b3148093/y
【BizRobo!】ロボット開発で気を付けている事 ①

# はじめに
現在、RAPを実務で行っていますが、まだまだまだまだ経験が浅く、日々勉強中です。
本記事については、自身の備忘録も含め同じ様な所で頭を抱えている方に対して、
少しでもヒントになり、先に進める力となれれば良いなと思い記事にしましたーー！

## 今回のTips
今回は、自身が業務でロボット開発をしている際に気を付けている事について、記事にしました。
これが正解かどうかは分かりませんが、参考にして頂ければ幸いです。

## Tips概要
今回は以下の2点についてお話します。
#### 1, ロボットの全体像を考える
#### 2,前処理、本処理、後処理の3カテゴリーに分けて開発を行う

## Tips詳細
では、1点目の「1, ロボットの全体像を考える」について、ご説明します。

開発しはじめた当初は、ある程度ロボットで実現したい内容が把握出来たら、すぐに開発を進めてました…案の定、開発を進めてから、手戻りが発生したり、想定外の処理、想定外のエラーなどが発生し開発完了までの時間が予定してたよりもかかってしまっていました。また、「開発が上手くいかない」事で、精神的にも辛い時がありました…

そういった経験から、実際に手を動かす前にロボットの全体像をイメージし、何か想定外の事や、自分が考慮出来ていない部分を考えてから、開発する様になりました！
どうイメージするのかの詳細については、以下になります。

**●ロボットをベースに、どういった流れで効率よく稼働させるかの検討**
⇒手作業で実施している内容をそのままロボット化するのではなく、ロボット化する前に「ロボットで稼働させる為の手順」を設計します。(紙に手書きでもいいので、イメージしてアウトプットします)手作業で実施する際の処理手順がベースですが、ロボットで処理をする場合に非効率となる手順については組みなおしてロボット開発のイメージをする。

**●どういったエラーが発生するのか。また、そのエラーの対応方法は何かを検討**
⇒手作業で処理を実施していた時に発生したエラーと対応方法の確認、また、想定できる範囲で良いので、手順を確認した結果、想定されるエラーについて、要件調整のタイミングで確認と検討を行いイメージしておく。

**●Excelの処理がある場合、どんな方法で処理を進めるのかを検討**
⇒Excelの処理についても、DSだけで実現が出来るのか、DAが必要なのか、マクロがないと実現できないのか等、あらかじ軽くロボットを開発し処理内容を検討しておく。

**●実行結果について、報告が必要なのか確認**
⇒基本的には必要だと思いますが、「誰に」「どんな内容の」報告が必要なのか確認しておく

--------------------------------------------
では、2点目の「2, 前処理、本処理、後処理の3カテゴリーに分けて開発を行う」について、ご説明します。

これは、1ロボットの中で可読性やメンテナンスを意識するにあたり、絶対に必要なポイントだと思っているのですが、1ロボットの全体を通してみた時に、「前処理」から始まり、「本処理」を実施し、「後処理」でロボットの稼働が修了するという流れになっている必要があります。

|カテゴリ|内容|
|---|---|
|前処理|前処理は、そのロボットが処理をする際に必要となる値やファイルパスなどの情報を取得し、これから本処理を実施するにあたって、前準備をする工程|
|本処理|そのロボットで実行したい処理の工程|
|後処理|本処理が終了し、正常 or　異常のログ抽出や結果メールの送信などの後処理の工程|

どんな処理内容のロボットだとしても、この3工程を順番に進み稼働する事で、別の担当者にロボットが映ったとしても、メンテナンスのしやすいロボットになります。
当初は出来ていませんでしたが、このロジックを知ってからは可読性を意識し開発をしています。
(あの人の開発したロボットは分かりにくいと言われないために💦)

## まとめ
これが、すべてでは無いと思いますが、実際に開発する前は、最低限以上の事を意識し開発をしています！参考になれば幸いです！
インターネット回線の速度テストサイトを立てよう

# きっかけ
インターネットの速度テストとして様々なサイトがありますが、自分の思う場所に構築して計測できないかな、と思いました。
具体的には自分たちの使っているクラウド上に配置して、どのぐらいのレイテンシやスループットなのかを簡単に調べられたら良いなぁと。

探したところ librespeed というのがありました。
簡単に構築できましたので、手順をまとめておこうと思います。

# 構築手順
※ 以下手順は Oracle Linux 7.9 で実施しました。 CentOS などでも同じ手順で可能です。

必要なパッケージをインストールする

```python
sudo yum install -y git httpd php
```

Document Root に librespeed を clone する

```python
cd /var/www/html
sudo git clone https://github.com/librespeed/speedtest.git
```

firewalld でポートを開ける

```python
sudo firewall-cmd --zone=public --add-service=http --permanent
sudo firewall-cmd --reload
```

apache を起動する

```python
sudo systemctl start httpd
```


# アクセス確認
以下にアクセスする。

[http://IP Address/speedtest/](http://158.101.92.251/speedtest/)

以下のように表示されるので、Start をクリックするだけです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108605/0481ff65-6479-1f73-bfcc-7a920aaa711a.png)

以上
【BizRobo!】1つのロボット内で Device Automation ステップと併用できないステップ

# はじめに
現在、RAPを実務で行っていますが、まだまだまだまだ経験が浅く、日々勉強中です。
本記事については、自身の備忘録も含め同じ様な所で頭を抱えている方に対して、
少しでもヒントになり、先に進める力となれれば良いなと思い記事にしましたーー！

## 今回のTips
今回は、「1つのロボット内で Device Automation ステップと併用できないステップ」について、記事にしました。業務中に、なぜ使えないのか。。。。で、すごい悩んだことがあり、時間を無駄に過ごしてしまったので、そんな方に有効な記事になればと思います！！

## Tips概要
僕は青天の霹靂だったのですが、DAを使用してるロボットだと、使用できないステップがあるって知っていましたか？？

今回のそんな内容の記事になります。
詳しくは、以下のナレッジをご確認ください。

[▼1つのロボット内で Device Automation ステップと併用できないステップ](https://knowledge.bizrobo.com/hc/ja/articles/360028159391)

## Tips詳細
ポイントとしては、DAを使用する場合、実行モードを、「最小実行(ダイレクト)」から「スマート再実行(フル)」に変更しますが、その「スマート再実行(フル)」だと使えないステップがあるよという内容になります！

以下が、そのステップ達になります。
- Call REST Web Service (old version)
- Call SOAP Web Service (old version)
- Clear Web Storage
- Crawl Pages
- Crawl Pages (old version)
- Divide Table
- Divide Tag (old version)
- Divide Text
- Divide Text (old version)
- Execute SQL (old version)
- Extract from Excel (old version)
- Extract from PDF (old version)
- Extract Image
- For Each File (old version)
- Hide Tag
- Insert Tag
- Load Data (old version)
- Make Snapshot
- Normalize Table
- Query Database (old version)
- Remove Table Rows
- Remove Tag Range
- Remove Tags
- Remove Tags (old version)
- Replace Tag
- Restore Tag
- Rewrite Page
- Rewrite Style Sheet
- Select File
- Set Top Tag (old version)
- Submit Form
- Transpose Table
- Unhide Tag

**●DAを使用したロボットで上記のステップを使用したい場合は?**
別で該当のステップを使用したロボットを開発し、RESTを使って呼び出すのか、そもそもの運用設計を変更しDAを使用しないロボットにするかになります。

## まとめ
今回は、「1つのロボット内で Device Automation ステップと併用できないステップ」について紹介いたしました。
多分、この事象を知っているか知っていないかで、初速がだいぶ変わると思いますので、
記事を読まれた方が、頭の片隅にでも入れておいて頂けると業務効率が変わると思います！
[Python]docstringのNumPyスタイルの書き方

**docstring**の**NumPyスタイル**の書き方について簡単にメモしておく。
**docstring**とは、関数やクラスに対する説明を記載する方法の1つ。**docstring**を記載することで、ドキュメントをHTML形式で自動生成することもできる。

# NumPyスタイル
## 基本的な書き方
基本的な書き方は、**reStructuredTextスタイル**や**Googleスタイル**と同じで、関数やクラス定義の先頭に```'''```または```"""```で説明を囲む形で記載する。

```python
def my_function():
    """<関数の説明を記載>"""
```

スタイルごとの違いとしては、引数や返り値などの書き方が異なっている。

## 記載サンプル
NumPyスタイルでの引数や返り値などの記載例は以下のようになる。
サンプルで使用していないセッションについては下記ページを参照。
[https://numpydoc.readthedocs.io/en/latest/format.html#sections](https://numpydoc.readthedocs.io/en/latest/format.html#sections)

```python
class Sample():
    """<クラスの概要>

    <クラスの詳細説明>

　　Attributes
　　---------
　　<属性名> : <型>
　　    <説明>
    """

    def my_function():
        """<関数の概要>

        <関数の詳細説明>
        
        Parameters
　　    ---------
        <変数名> : <型>
            <説明>
  
        Returns
　　    ---------
        <戻り値名>: <型> 
            <説明>

        Raises
　　    ---------
        <例外名>
            <説明>
        """

        <関数の処理内容>
```
【Rails】scopeメソッドとクラスメソッドでnilを返す時の挙動が違う



##クラスメソッドの場合

```ruby
class Book
  def self.published
    where(published: true)
  end
end

Book.published.order(id: :desc)
#=> Attendance Load (3.8ms)  SELECT `attendances`.* FROM `attendances` WHERE `attendances`.`date` BETWEEN '2022-01-01' AND '2022-01-31' ORDER BY `attendances`.`id` DESC
```

nilの場合はnilが返るのでメソッドチェーンが使えない。

```ruby
class Book
  def self.published
    nil
  end
end

Book.published
#=> nil

Book.published.order(id: :desc)
#=> NoMethodError: undefined method `order' for nil:NilClass
```

##scopeの場合

```ruby
class Book
  scope :published, -> { where(published: true) }
end

Book.published.order(id: :desc)
#=> Attendance Load (3.8ms)  SELECT `attendances`.* FROM `attendances` WHERE `attendances`.`date` BETWEEN '2022-01-01' AND '2022-01-31' ORDER BY `attendances`.`id` DESC
```

nilの場合でも**allメソッドが実行される**のでメソッドチェーンが使える。

```ruby
class Book
  scope :published, -> { nil }
end

Book.published
#=> nil

Book.published.order(id: :desc)
#=> Attendance Load (3.8ms)  SELECT `attendances`.* FROM `attendances` WHERE `attendances`.`date` BETWEEN '2022-01-01' AND '2022-01-31' ORDER BY `attendances`.`id` DESC
```


##参考

https://pikawaka.com/rails/scope#%E3%82%B9%E3%82%B3%E3%83%BC%E3%83%97%E6%A9%9F%E8%83%BD%E3%81%AE%E5%BF%9C%E7%94%A8%E7%9F%A5%E8%AD%98
【BizRobo!】【DA】Tree Stops Changingについて 

# はじめに
現在、RAPを実務で行っていますが、まだまだまだまだ経験が浅く、日々勉強中です。
本記事については、自身の備忘録も含め同じ様な所で頭を抱えている方に対して、
少しでもヒントになり、先に進める力となれれば良いなと思い記事にしましたーー！

## 今回のTips
今回は「Tree Stops Changing」について、記事にしました。
あまり業務では使用していなかったのですが、使ってみたら、
場面によっては有効かなと思いますので、必要に応じて使用いただければと思います。

## Tips概要
「Tree Stops Changing」とは、ナレッジを参照すると以下の説明がありました。

[▼Guarded Choice（ガードチョイス）の特徴](https://knowledge.bizrobo.com/hc/ja/articles/360032997271-Guarded-Choice-%E3%82%AC%E3%83%BC%E3%83%89%E3%83%81%E3%83%A7%E3%82%A4%E3%82%B9-%E3%81%AE%E7%89%B9%E5%BE%B4)

>設定したアプリケーション内のエレメントツリーを、指定したミリ秒間、監視と待機を行うタイムアウトガードになります。
また、指定したミリ秒間にエレメントツリーが変化した場合（動的なページやページ更新等）は再度指定したミリ秒間待機します。
使用シーンの例は、主に遷移したアプリケーションのエレメントツリーの生成が全て完了し、安定するまで待機する際に使用します。
遷移後の画面の表示が静的に完了するまで待機する場合に有効となります。

要するに、「特定画面の要素が完全に解析(ページの読み込みとエレメントツリーの展開完了)するまで待ちます」ってことですね。

## Tips詳細
対象のページにて、例えばボタンを押すステップの前にこのステップを入れ、5秒設定したとします。
その5秒の間に画面が変わった(エレメントツリーが変化した)場合、更に5秒待機⇒5秒待機後、変化が無ければ次の処理を実行という感じになります。

なので、何かをクリックする前などのステップの前に入れておく事で、
対象の要素が表示されていない事で、クリックが滑ってしまうという可能性が低くなります。
(ケースバイケースですが。。。。)

## まとめ
今回は、「Tree Stops Changing」について、記事にしてみました。
開発する際は、トライアンドエラーが主だと思いますので、
その中の一つとして、「Tree Stops Changing」を使用してみるのも一つだと思います！
[py2rb] 辞書 の四則演算

# はじめに
移植やってます。
( from python 3.7 to ruby 2.7 )
# Dict (Python)
辞書の四則演算が必要らしいのですが、辞書を継承してメソッドを追加しているみたいです。
# Hash (Ruby)
```ruby
class H < Hash
  def initialize
    self.default = 0
  end
  def +(other)
    case other
    when Hash
      other.each do |k, v|
        self[k] += v
      end
    when Integer || Float
      self.each do |k, _|
        self[k] += other
      end
    end
  end
  def *(other)
    case other
    when Hash
      other.each do |k, v|
        self[k] *= v
      end
    when Integer || Float
      self.each do |k, _|
        self[k] *= other
      end
    end
  end
end

h = H.new
h + {'A' => 1}
h + {'A' => 1, 'B' => 1}
p h # {"A"=>2, "B"=>1}
h + 3
p h # {"A"=>5, "B"=>4}
h * {'B' => 2, 'C' => 2}
p h # {"A"=>5, "B"=>8, "C"=>0} 
h * 2
p h # {"A"=>10, "B"=>16, "C"=>0}
```
そられしくなりました。
本来であれば交換則で、例えば、`Integer * Hash`も必要なのですが。
もしかしたら、`gems`や`numpy/scipy`にあるかもしれませんね。
# メモ
+ Python の 辞書 の四則演算 を学習した
+ 百里を行く者は九十里を半ばとす
[rails]評価点ごと(星ごと)の一覧画面を実装

#はじめに
ポートフォリオ作成中に、評価された商品について、評価点ごとに商品を表示する機能を実装しようと試みました。
その際、ちょうどいい記事が見つからなかったので今回まとめてみました。

##開発環境
ruby '3.0.0'
Rails 6.0.3.4

#前提
下のような、評価をするためのモデル及びカラムが作成されており、投稿機能まで実装されているものとする。
ユーザが"ガジェット"を投稿するサイトにて、下のようなER図にてgadjet_pointを今回の評価点とする。
![gadjet_table.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1874224/38d39f7b-7d49-2a9a-dd5b-967e23771294.png)


今回は、下画像のように１０段階評価されたものについて、点数ごとの一覧画面を作成することを目標とする.


![スクリーンショット 2022-01-13 14.51.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1874224/1cb90311-a913-a93e-5594-e5f9b5966c1d.png)


##ルーティング
```ruby:app/models/favorite.rb
class Favorite < ApplicationRecord
.
.
.
  resources :boards do
    member do
      get :stars
    end
  end
end
```
ボードコントローラに"stars"アクションを追加し、"stars"アクションにて、評価点（星の数）ごとの一覧画面を表示する。

##ビューの作成

コントローラの前に、"stars"アクションを呼び出すビューを作成します。
今回は、した画像のようにヘッダーメニューから遷移できるようにする。
![スクリーンショット 2022-01-13 15.18.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1874224/daaeb2a7-6e9a-7f5c-faa1-f52aa06399ed.png)

```erb

<div class="dropdown">
    <button class="btn btn-secondary dropdown-toggle margin-left20" type="button" id="dropdownMenuButton" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
        Star
    </button>
    <div class="dropdown-menu" aria-labelledby="dropdownMenuButton">
        <% i = 10 %>
        <% until i == 0 do %>
            <%= link_to "#{i}stars" , stars_board_path(id:i), class:"dropdown-item font-black" %>
            <% i -= 1 %>
        <% end %>
    </div>
</div>
```
繰り返し処理にて、最初に"10"を代入し、繰り返す度に-1する。
stars_board_path(id:i)→starsアクションを実行するパスに"id"を評価点として受け渡すようにする。


##コントローラ
```ruby:app/controlles/boards_controlle.rb
class Favorite < ApplicationRecord
.
.
.
    def stars
        @gadjets = Gadjet.where(gadjet_point: params[:id])
        @stars = params[:id]
    end
end
```
Gadjetモデルのデータからgadjet_point(カラム名)が受け渡された評価点(:id)であるものを抽出。


##評価点ごとの一覧画面

```erb:stars.html.erb
<div class="album py-5 bg-light">
    <div class="container">
        <h1 class="text-center margin-bottom25">星<%= @stars %></h1>
        <%= render "shared/gajets-list", gadjets: @gadjets %> 
　　　　　　　　　　　　　　　#評価点別に抽出した@gadjetsをひとつづつ表示するviewを呼び出し。ここはご自身で作成願います。
    </div>
</div>
```
結果、以下の画像のような評価点ごとの一覧画面が作成できる。
![スクリーンショット 2022-01-13 15.52.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1874224/30e847dd-b499-ae7a-f8e3-694457c65895.png)



#終わりに

この実装方法は完全オリジナルであり、効率がより良い方法等があると思います。
間違い等がありましたら、コメントにてご指摘お願いいたします。
少しでも参考になれば幸いです。
【Project Euler】Problem 24: 辞書式順列

* 本記事は[ProjectEuler](https://projecteuler.net/about)の「100番以下の問題の説明は記載可能」という規定に基づいて回答のヒントが書かれていますので、自分である程度考えてみてから読まれることをお勧めします。

### 問題 24. 辞書式順列

原文 [Problem 24: Lexicographic permutations](https://projecteuler.net/problem=24)

**問題の要約：0123456789を並べ替えたものを辞書式順列にしたとき$10^6$番目を求めよ**

安易ですが、itertoolsのpermutationは「 [iterable に応じた辞書式順序で出力されます](https://docs.python.org/ja/3/library/itertools.html#itertools.permutations)」とのことなのでそのまま使えます。一応"012"で確認します。

```python
import itertools
for n, perm in enumerate(itertools.permutations("012"),1): 
  print(f"{n}: {''.join(perm)}")
#1: 012
#2: 021
#3: 102
#4: 120
#5: 201
#6: 210
```
確認できたので、$10^6$番目の値を出力します。

```python
import itertools
for n, perm in enumerate(itertools.permutations("0123456789"),1): 
  if n >= 10**6:
    break

print(f"Answer : {''.join(perm)}")
```

### より効率の良い解答

さすがにこれではあまりにも安易なので問題を以下のように変更します。

**問題 ２．0123456789abcdefを並べ替えたものを１６進数の辞書式順列にしたとき$10^{10}$番目を求めよ**

こうなるとitertoolsのpermutationでは厳しいので工夫が必要になります。

考え方を最初の問題で説明します。最初の桁を例えば0に固定すると残りは9桁なので順列は$9!=362880$個あります。これを積算すると$10^6$番目は2で始まることが分かります。

従って2を除いた013456789を並べ替えたものを辞書式順列にしたときに$10^6-725760=274240$番目を求めて725760に足せばよいことになります。
これを再帰的に行えば答えが得られます。

| 最初の桁| 順列の数| 順列の数（積算） |
|:---:|:---:|:---:|
| 0| $9!=362880$ |$362880$|
| 1| $9!=362880$ |$725760$|
| 2| $9!=362880$ |$1088640 > 10^6$|

以下のプログラムは１６進数まで対応できるようにしました。

```python
import math
B = 16
def lexn(N, dig, un):  # Remaing N, digit, Unused number
  result, total = "", 0
  for i in range(B):
    if un[i] == 0: continue
    d = math.factorial(dig-1)
    if total+d >= N:
      un[i] -= 1
      result = hex(i)[2] + lexn(N-total, dig-1, un)
      return result
    total += d
  return result

N = 10**10
print(f"Answer: {lexn(N, B, [1]*B)}")
# 013ae8c5dfb47692
```

（開発環境：Google Colab）
【Project Euler】Problem 23: 過剰数の和

* 本記事は[ProjectEuler](https://projecteuler.net/about)の「100番以下の問題の説明は記載可能」という規定に基づいて回答のヒントが書かれていますので、自分である程度考えてみてから読まれることをお勧めします。

### 問題 23. 過剰数の和

原文 [Problem 23: Non-abundant sums](https://projecteuler.net/problem=23)

**問題の要約：過剰数の和にならない数の合計を求めよ**

[過剰数(Abundant number)(Wikipedia)](https://ja.wikipedia.org/wiki/%E9%81%8E%E5%89%B0%E6%95%B0)の定義はこちら。今回は2つの過剰数の和で表せない数を列挙して合計を求めよと言うもの。問題では28123より大きい数は必ず和で表せるとありますが、Wikipediaによると20161が最大のようです。

過剰数の判定は「[Problem 21: 友愛数](https://qiita.com/masa0599/items/8c87da4f15711fc9f3ce)」で作った関数**sumpdiv**を使います。重複組合せのitertools.combinations_with_replacementを使ってすべての2つの数の和を求めて、その数をリストから除いて残った数を合計します。

```python
import itertools

N = 20161
# create the list of abundunt numbers
abn = [i for i in range(1, N+1) if sumpdiv(i)> i]

abn2sum = [i for i in range(N+1)]   # list of all natural numbers
for i, j in itertools.combinations_with_replacement(abn, 2):
  if i+j<=N:
    abn2sum[i+j] = 0  # erase the number by adding 2 abundant numbers combination

print(f"Answer: {sum(abn2sum)}")
```

過剰数の和にならない数は数が大きくなると減っていくみたいなので、グラフを書いてみました。確かにn=10000を超えるとかなり少なくなっていのが分かります。描画プログラムは下にあります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1922159/aba95344-c945-96f6-f34a-18be8b8071a6.png)


```python
import matplotlib.pyplot as plt

fig = plt.figure()
ax = fig.add_subplot(1,1,1)

abn2sumlist = [abn2sum[i] for i in range(1,N+1) if abn2sum[i]>0]
ax.hist(abn2sumlist, bins=300, range=(0,N))
ax.set_title('Numbers that can not be written as the sum of two abundant numbers ')
ax.set_xlabel('n')
ax.set_ylabel('Numbers')
fig.show()
```



（開発環境：Google Colab）
【Laravel】Carbonの変な挙動

# 変な挙動
Tinkerで今月の最初の日付と最終日をそれぞれ別の変数に入れて出力

```
> php artisan tinker
Psy Shell v0.10.9 (PHP 7.4.4 — cli) by Justin Hileman
>>> $now = Carbon\Carbon::now();
=> Carbon\Carbon @1642055469 {#3917
     date: 2022-01-13 15:31:09.011838 Asia/Tokyo (+09:00),
   }
>>> $now_first_day = $now->startOfMonth();
=> Carbon\Carbon @1640962800 {#3917
     date: 2022-01-01 00:00:00.0 Asia/Tokyo (+09:00),
   }
>>> $now_end_day = $now->endOfMonth();
=> Carbon\Carbon @1643641199 {#3917
     date: 2022-01-31 23:59:59.999999 Asia/Tokyo (+09:00),
   }
>>> echo $now_first_day;
2022-01-31 23:59:59⏎
>>> echo $now_end_day;
2022-01-31 23:59:59⏎
```
あれ、$now_first_dayの値も最終日になってる

<a id="#Chapter1"></a>
# startOfMonth()は日付を返してるわけじゃなかった。

指定月の最初の日付を返してくれるメソッドと勘違いしてた。dateを書き換えるメソッドだった。
んでもってオブジェクトは参照渡しだから値が変わると。変な挙動も何も無知なだけでした。ちゃんちゃん
Pythonで祭日を取得する

以前、PHPで祭日の一覧を他のサイトから取得してそれを表示するというお仕事をしたことがあるのですがpythonでは祭日をリストアップしてくれるライブラリがあったので非常に良いなと思い忘備録として記述します。

と言ってもやることは簡単。

```python
pip install holidays
```

をして

```python

import holidays
for date, name in holidays.Japan(years=[2022]).items():
    print(date, name)

2022-01-01 元日
2022-01-10 成人の日
2022-02-11 建国記念の日
2022-02-23 天皇誕生日
2022-03-21 春分の日
2022-04-29 昭和の日
2022-05-03 憲法記念日
2022-05-04 みどりの日
2022-05-05 こどもの日
2022-07-18 海の日
2022-08-11 山の日
2022-09-19 敬老の日
2022-09-23 秋分の日
2022-10-10 スポーツの日
2022-11-03 文化の日
2022-11-23 勤労感謝の日
```

という出力結果になります。
yearsには[2020, 2021, 2022]
などリストで対象年を入れるとその分のリストが出力されます。
Japanのところを他の国の名前にするとその国の祭日が出てきます。
USやCNなどを入れて試してみて下さい。

参考サイト
https://pypi.org/project/holidays/0.1/
Stripe::InvalidRequestErrorの対処法

<h2>症状</h2>
RailsでStripeのCheckoutを組み込んだ際に、下記のエラーが表示されました。
翻訳すると、「（Checkoutを使用するには、アカウントまたは会社名をで設定する必要があります」でした。

```terminal:error  
Stripe::InvalidRequestError (In order to use Checkout, you must set an account or business name at https://dashboard.stripe.com/account.):
```

<h2>解決方法</h2>
エラーメッセージに合った「https://dashboard.stripe.com/account. 」に飛んで、アカウント設定の項目を埋めたらエラーが表示されなくなりました。

<h2>参考</h2>

https://stripe.com/jp?utm_campaign=paid_brand-JP_ja_Search_Brand_Stripe-1608207349&utm_medium=cpc&utm_source=google&ad_content=305767026167&utm_term=aud-491317517717:kwd-295607662702&utm_matchtype=e&utm_adposition=&utm_device=c&gclid=CjwKCAiAlfqOBhAeEiwAYi43F_8GRHiew0DwSQjMHRsYq_Zaxs3OAf4D3e2x8z-ZISPGzAQ-AXC_VBoCr0QQAvD_BwE
【プロジェクト参画】の時の注意点（自分用のメモです）

# 【プロジェクト参画】の時の注意点（自分用のメモです）
【自分用のメモ】として、記録しています。
あくまでも、「メモ」としての内容となっております。。。

`C#` `Visual Studio`の内容が多いです。
「プロジェクト参画時」の備忘録にしています。

# 【準備：0】
すぐ使用するかも。
`Win + Shift + S : キャプチャ`
`Win + V : クリップボード`
`Win + G : 録画（ゲームバー）`

`Win + E : エクスプローラ`
  クイックアクセスにピン留めすること。（資料など）


# 【資料の整理】をいつもしよう。
### まとめておくと、便利かも
資料① : 「連絡(Teams Slack他)」「設定方法」「資料の種類・場所」
資料② : 「DBテーブル定義」「クラス図のようなもの」
         

# 【早くCheckすること】
* 「他の方のコード」「進捗状況」
* 「レビュー基準」
* 「資料」「規約・ルール」


# 【Start】いざ、開始！
* 「デバッグ実行」できること！
* 「 SQL 」: INSERT文（テストデータ）を、早く用意する。


# 【Dairy】日々、気をつける事。
* 「連絡(Teamsなど)」すぐ見る事。


# 【 ！！ 重要 ！！ 】
* 【 すべて メモする！！ 】  
   #warning //TODO: を利用すること。  
  「後からでも、100％理解できるメモ」
* 「コード提出」= 「100%完成している」

# 【課題、、、要改善！】したい
* 「１個修正する」  
   ⇒「別の処理に影響して、動作できなくなる」ループ、、、  
   ⇒「別のメソッド」に切り出した方が、Good!

# 【Visual Studio】「ビルドエラー」解決法 
* 「クリーン」する。  
* いったんVS閉じる。もう一度、開きなおす。
* 「リビルド」する。    

# 【※ 基本のコーディング 】
## Check しておこう
* 「switch ～ case ～」使ったほうがよさそう。
* 「3項演算子・null演算子」使ったほうがよさそう。
* 「変数」：使う直前に、宣言する。
* 「メソッドの順番」：呼び出し順にならべる。
* 「フィールド変数」：数を少なくする。多くなる時は、クラス化（ETモデルクラス?)する。
* 「メソッド ヘッダ コメント」：最初に、きちんと書いておく。
* 「コメント」：具体的に書く。「○○が、○○のために、○○する。」
* 「画面連携」：スタブ画面（戻り値を固定したりする。）を用意したりする。
* 「if(!false)」：早くCheckして、returnする。
* 「Enum」：「Enumクラス.プロパティ名」で、取得できる。
* 「VSの警告」：すべて解決すること。
* 「不要なusing」：削除すること。
* 「Converter」：「共通の処理」なるべく使う。
* 「最初から、完璧なコード・コメント」にする。
* 「例外処理」必要。
* 「Exception」：種類ごとに分けて catch すること。

# 【LINQ】のメモ書き

[【C#】LINQの関数 一覧](https://www.urablog.xyz/entry/2018/07/10/070000)
[ちょっと複雑な並べ替えをするときはLINQが楽でよい](https://qiita.com/NodeSleepRest/items/4408feb37f36411ffa7e)
[join 句の結果の順序指定](https://docs.microsoft.com/ja-jp/dotnet/csharp/linq/order-the-results-of-a-join-clause)
[Enumerable Class](https://docs.microsoft.com/en-us/dotnet/api/system.linq.enumerable?redirectedfrom=MSDN&view=net-6.0#methods)
[ORDER BY句のポイント6つと使い方｜Then Byについても解説](https://www.fenet.jp/dotnet/column/%E8%A8%80%E8%AA%9E%E3%83%BB%E7%92%B0%E5%A2%83/567/#1_DISTINCT%E3%81%A8ORDER_BY%E3%81%AE%E4%BD%BF%E7%94%A8%E9%A0%86%E5%BA%8F)


````
.Distinct()
.OrderBy(x => x);

.Where(e => x(e)).Take(1).ToList();

.OrderBy(d => d.Name1).ThenBy(d => d.Name2);

var result = List<>.GroupBy(x => x.Name)
                  .Select(g => 
                        new { Name = gr.Key,
                              Students = g.OrderByDescending(x => x.Member) })
                  .OrderBy(group => group.Students.First().Member);

Find() はインデックスの最小のものが約束されている?
````


## 【List から、「順序」を保証して、取り出す ?】
内容はあやしい、、ですw 要注意ですw

````
// 実際は T はある決まった型
List<T> Filter(List<T> before)
{
    List<T> after = new List<T>();
    foreach (T element in before)
    {
        if( ～ ) after.Add(element);
    }
    return after;
}

IEnumerable<T> Filter(IEnumerable<T> before> {
  foreach ( T element in before ) {
    if ( true ) yield return element;
  }
}
````
Mac + iOS で Charles を使う

## 概要

AdMobが表示されない原因調査のために、Charlesを使ったので手順を残しておきます。

## [Mac] Charlesをダウンロード＆インストール

https://www.charlesproxy.com/latest-release/download.do

## [Mac: Charles] Proxy Settings

Proxy - Proxy Settings の HTTP Proxy を確認する。必要に応じて変える。

## [Mac: Charles] SSL Settings

SSL - SSL Proxy Settings の SSL Proxying の include に `*:*` を追加する。

## [Mac: Charles] Local IP Address

Help - Local IP Address の IP Address を控えておく。

## [iOS: Safari] 証明書ダウンロード

以下へアクセスし証明書をダウンロードする。

http://chls.pro/ssl

## [iOS: 設定] 証明書インストール

設定 - 一般 - VPNとデバイス管理 ダウンロード済プロファイルにある Charles Proxy〜 を選びインストール。

## [iOS: 設定] 証明書設定

設定 - 一般 - 情報 - 証明書信頼設定 で Charles Proxy〜 を有効にする。

## [iOS: 設定] Wi-Fi設定

設定 - Wi-Fi - 選択 - HTTPプロキシ で 手動を選び、IP Address と ポート番号を設定。

## [Mac: Charles] ほうきボタン

既につながっているのでほうきボタンでクリア

## [Mac: Charles] セッション保存

File - Save Session でセッションを保存

## [iOS: 設定] Wi-Fi設定

設定 - Wi-Fi - 選択 - HTTPプロキシ で オフを選ぶ。

忘れないように・・・

## 最後に

もうちょっと何かやった気もするけど忘れてしまった・・・思い出したら追記する。
M5ATOM コンパイルエラー

![S__8503370.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/157360/1bf5f6d1-2772-8bb5-9956-d69a8e184eac.jpeg)

基本的な使い方のサイトを見て扱ってみたがコンパイルエラー

```
Arduino：1.8.19 (Windows 10), ボード："M5Stack-ATOM, Default, 1500000, None"

C:\Users\user\Documents\Arduino\libraries\M5Atom\src\M5Atom.cpp: In member function 'void M5Atom::begin(bool, bool, bool)':
C:\Users\user\Documents\Arduino\libraries\M5Atom\src\M5Atom.cpp:23:28: error: call of overloaded 'begin(int, int, int)' is ambiguous
   Wire.begin(25, 21, 100000);
                            ^
In file included from C:\Users\user\Documents\Arduino\libraries\M5Atom\src\M5Atom.h:53,

                 from C:\Users\user\Documents\Arduino\libraries\M5Atom\src\M5Atom.cpp:4:

C:\Users\user\AppData\Local\Arduino15\packages\m5stack\hardware\esp32\2.0.2\libraries\Wire\src/Wire.h:79:10: note: candidate: 'bool TwoWire::begin(int, int, uint32_t)'

     bool begin(int sda=-1, int scl=-1, uint32_t frequency=0); // returns true, if successful init of i2c bus
          ^~~~~
C:\Users\user\AppData\Local\Arduino15\packages\m5stack\hardware\esp32\2.0.2\libraries\Wire\src/Wire.h:80:10: note: candidate: 'bool TwoWire::begin(uint8_t, int, int, uint32_t)'

     bool begin(uint8_t slaveAddr, int sda=-1, int scl=-1, uint32_t frequency=0);

          ^~~~~
exit status 1
ボードM5Stack-ATOMに対するコンパイル時にエラーが発生しました。
「ファイル」メニューの「環境設定」から
「より詳細な情報を表示する：コンパイル」を有効にすると
より詳しい情報が表示されます。
```

![スクリーンショット 2022-01-13 151441.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/157360/2a7d0e15-cd30-b464-af9f-3de8757b8879.png)

Documentのlibraries￥M5Atom￥srcにある。
M5Atom.cpp
utility内にある
MPU6886.cpp
のWire.begin(25, 21, 100000);を
Wire.begin(25, 21, 100000U);
にすればコンパイル出来る。
顧客との打ち合わせをGoogleform→SpreadSheetで管理し、営業効率を上げる

<h3>顧客との打ち合わせをGoogleform→SpreadSheetで管理し、営業効率を上げる</h3>
<body>
<div class=KPI>
<p>俗人化,紙頼りの大量にある個人顧客データをGスプレッドシートとフォームを使って管理したい。
【現状】
①顧客との打ち合わせ日時決定
②Gカレンダーにて該当日時に詳細メモ
③担当者が打ち合わせにて気になった部分のみ該当カレンダーメモ部分に追記

【デメリット】
・顧客情報の共有がマストな業態なので、担当者頼りの現状だと共有に偏り、意思疎通うの齟齬が起きるとパンデミック状態に
・顧客の生まれから人柄、趣味嗜好までヒアリングするが、結局は担当者の主観で裁量されるため、効率の良いサービスの案内ができない
・新サービスを発足させても、誰に案内すればいいかわからない、そもそも誰がいるかわからない
・これまで関わりのあった顧客数は裕に1万人を超えているが、名前がわかる(思い出せる、データを出せる)顧客はせいぜい十数名

【どうしたいか？】
・顧客管理が容易になり、スムーズに共有ができる
・人柄、趣味嗜好までを一定基準の裁量で網羅したDBを作ることで、効率と精度の良いサービス案内ができる
・検索、振り返りが楽で、使いやすいUI
・1万人程度、生まれから人柄、人生、趣味嗜好までを網羅しても耐えれるDB,UI(最終目標,最初は10人くらいから)

【使いたいツール】
・10年以上Gカレンダーで予約管理しているので、Gカレンダーをそのまま使いたい。
・Gカレンダーと相性の良いGスプレッドシートが基本のDBになるかも？(費用かけれないので、無料で運用できるのが前提のため)
・↑に伴い、スプレッドシートへの入力フォームとして、Gフォームを選択

【現状の担当者のスキル】
・HTMLを読めるかどうか程度

【身につけないといけないスキル】
・ジャバスクリプトを中心に作られたGas言語習得

【着手前の懸念。コメントにて教えていただきたい部分】
・顧客情報の流入経路が、複数あり、それぞれの項目が違う
→
１からはAさんの名前、電話番号のみ
２からはBさんの名前、電話番号、メアド、職場、卒業校など
３からはAさんの趣味、乗っている車の車種、昨日スーパーで何を買ったか
など、バラバラなので、これらをDBとして統合をGasだけで
・時間がかかりすぎないか？(コスト面)他サイトに金払った方が、良いのでは？
・セキュリティ面、紙ベース、DropBoxの方が安心安全と考える社長を説得できるか？
・パソコン初心者でも扱えるようにUIやフロントエンドを整えられるか？
</p>

</div>
</body>
TypeScriptの正規表現で object is possibly 'null' を完結に回避するTips

TypeScriptで正規表現を用いて文字列解析（match）をする場合にobject is possibly 'null'を回避する方法がちゃんと解説されてるもの少なかったので、備忘録的にメモ

まず、regexp.matchの動作の正しい理解をする。

- 条件にマッチするとArrayが返る
- 条件にマッチするものがないとNullが返る
- gフラグない場合、Arrayの中は以下のようになる<br>
  ```['最初に完全一致したもの','キャプチャグループ','追加プロパティ]```<br>
  <details><summary>[**String.prototype.match()の説明ページ**](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/String/match)<br></summary>
  _返り値：Array を返します。これはグローバル (g) フラグの有無によって内容が変わります。
  一致するものが見つからなかった場合は null を返します。_ <br><br>
  _g フラグがあった場合は、正規表現全体に一致したすべての結果を返しますが、
  キャプチャグループは返しません。_ <br>
  _g フラグがなかった場合、最初に完全に一致したものと、それに関するキャプチャグループを
  返します。この場合、返される要素には下記の追加のプロパティが存在します。_
  </details>

例えば以下のような記述ではobjedt is possibly 'null'が出る。

```
const regexp = "http://hogehoge.com/?limit=10&token=XXXXXXX";
const limit = regexp.match(/limit=(.*?)(&|$)/)[1];
```
正規表現でマッチさせたキャプチャ文字を変数に代入しようとしている。
この時、regexp.matchがマッチしなかった場合nullが返ってくる。
これだと、Nullabilityエラーが出てしまう。

そこで、Nullabilityを完全に除去するには、以下のようにする事がまず思い浮かぶ。

```
const regexp = "http://hogehoge.com/?limit=10&token=XXXXXXX";
const _limit = regexp.match(/limit=(.*?)(&|$)/); 
let limit = 30;  // デフォルト設定として合う買う
if ( _limit !== null) {
  limit = Number(_limit[1])
}
```
ちなみに、```_limit[1] as number```みたいなダウンキャストでは怒られてしまった。あまり深く考えてなかったけど、ダウンキャストは型安全じゃないとかっていう事位の把握なので、今度調べる。

いずれにせよ上記だと非常に冗長。
そこでより完結（？ワンライン）に書いてみた。

```
   const regexp = "http://hogehoge.com/?limit=10&token=XXXXXXX";

   const limit = Number((regexp.match(/limit=(.*?)(&|$)/) ?? '')[1] || 20);
   const token = (regexp.match(/token=(.*?)(&|$)/) ?? '')[1];
```
ポイントとしてはregexp.matchがマッチすればArrayを返し、外側の```[1]```の式が評価され、```array[1]```となり、nullを返した場合、```''（空文字）```を返すようになっている。

空文字が返ると、次の評価式は```''[1]```となる。これは文字列に配列添字でアクセスする事と同意で、```'abcde'[2]```とかと同じ事を表してる。この場合、abcdeを0,1,2,3...の添字でアクセスしているので、```c```が返ってくる。

では、文字列の範囲外を添字指定するとどうなるか？
この場合、```undefined```が返る。これにより、nullが返ってきた場合、undefinedとして評価され、```||```オペレータでの評価により、最後の```|| 20```が評価され、limitにはデフォルト値の20が設定される。

さらに、limitの下のtokenではデフォルト値を設定せず、マッチがなければtokenにはundefinedをそのまま入れてる。これをそのまま次の関数の引数等に渡してやると、関数がtokenをオプション等で受け取るようになっていれば、関数実行時に適切に実行される。

```
   const regexp = "http://hogehoge.com/?limit=10&token=XXXXXXX";

   const limit = Number((regexp.match(/limit=(.*?)(&|$)/) ?? '')[1] || 20);
   const token = (regexp.match(/token=(.*?)(&|$)/) ?? '')[1];

　　　　　　const res   = afterMethod(limit, token)
　　　　　　　※ tokenに値が入ってる場合： afterMethod(limit, token）
　　　　　　　※　　tokenがundefinedの場合：　afterMethod（limit）
```
通称〇〇本まとめ

ツイッターやサイトで見かける「通称〇〇本」が気になって調べてみました。しかし、まとめられているところを探しきれなかったので自分が見かけたものだけ載せてます。

# カピバラ本
＃HTML ＃CSS ＃Webデザイン #入門

https://www.shoeisha.co.jp/book/detail/9784798170114

[参考]
[Web制作者にかなりオススメの解説書！ HTMLとCSSの今のテクニックを基本からしっかり学べるカピバラ本](https://coliss.com/articles/book-review/isbn-9784798170114.html)

# サイ本
＃JavaScript

https://www.oreilly.co.jp/books/9784873119700/

# 徳丸本
＃Webアプリケーション ＃Webセキュリティ

https://www.sbcr.jp/product/4797393163/

# すごいH本
＃Haskell

https://www.ohmsha.co.jp/book/9784274068850/

# Perl
### リャマ本

https://www.oreilly.co.jp/books/9784873118246/

https://www.oreilly.co.jp/books/9784873116280/

### ラクダ本

https://www.oreilly.co.jp/books/4873110963/

https://www.oreilly.co.jp/books/4873110971/

# チェリー本
＃Ruby

https://gihyo.jp/book/2021/978-4-297-12437-3

# Rust
### 自転車本

https://gihyo.jp/book/2019/978-4-297-10559-4

### 歯車本

https://www.shuwasystem.co.jp/book/9784798061702.html

### 蟹本

https://www.oreilly.co.jp/books/9784873119786/

[参考]

https://twitter.com/yusuktan/status/1375597787216179202


# 宇宙本
＃R

https://gihyo.jp/book/2021/978-4-297-12170-9

# Docker
### かわいい本

https://book.mynavi.jp/ec/products/detail/id=120304

### 自宅本

http://www.kohgakusha.co.jp/books/detail/978-4-7775-2147-0

### 黄色い本

https://www.nikkeibp.co.jp/atclpubmkt/book/20/279230/

[参考]

https://twitter.com/shigetaka256/status/1435583183102242817?s=20


# プログラミングコンテストやアルゴリズム
### チーター本

https://www.sbcr.jp/product/4797367171/

### 螺旋本

https://book.mynavi.jp/ec/products/detail/id=35408

### 蟻本

https://book.mynavi.jp/ec/products/detail/id=22672

[参考]
[プログラミングコンテストやアルゴリズムの本3選、読んでみた感想](https://www.utakata.work/entry/20180105/1515129093#f-f2c0a45c)

# セキュリティコンテスト:CTF

### ハリネズミ本

https://book.mynavi.jp/ec/products/detail/id=42421

https://book.mynavi.jp/ec/products/detail/id=75673

# ドラゴン本

https://www.saiensu.co.jp/search/?isbn=978-4-7819-1229-5&y=2009

# ガウディ本(CTMCP)

https://www.shoeisha.co.jp/book/detail/9784798113463

# 魔術師本(SICP)

https://sicp.iijlab.net/

<h1>最後に</h1>
通称が生まれるほど読まれている・親しまれている本なので読んで得すること間違いなしだと勝手に思ってます。

載ってない〇〇本があればコメントをください。
Docker+.NET 6環境でBlazor WebAssemblyアプリを動かしてみる

#はじめに
業務でBlazor WebAssemblyアプリを開発する機会があり、今回はその時に得た知識をベースに記事を書かせていただきます。

まず、この記事を書き始めた時点ではDocker+dotnetでアプリケーションサーバを構築している情報を調べてみると....
.NET Core 3.1 を使用した情報は日本語文献でも比較的入手しやすいが.NET 6の情報は海外の記事が多く日本語文献は少ない感じがしました。
そのようなこともあり今回はDocker+.NET 6環境でBlazor WebAssemblyアプリを動かす流れをご紹介いたします。

#前提条件
.NET 6を選定している理由としては現時点で最新のLTS版ということで選定しております。
Dockerのインストールと起動が完了済み、ローカルマシン上でdotnet コマンドが使える想定です。

#ベースとなるプロジェクトの生成
今回、利用するBlazor WebAssemblyアプリ用のプロジェクトを作成しておきます。
コマンドプロンプトを開きプロジェクトを作成するフォルダにカレントディレクトリを移動させます。
そこで下記のコマンドを実行するとプロジェクトに必要なファイル群が生成されます。
今回のプロジェクト名はHelloWorldにしています。

```powershell
dotnet new blazorwasm --hosted -o  HelloWorld
```

コマンドを実行すると下記のようなフォルダやファイルが出来上がっているはずです。

![HelloWorld.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342210/a448b9d0-f425-9d20-d1a7-1335fff2448f.png)
#Dockerfileを用意する
今回作成したDockerfileはこのような記述となっています。

```batch:Dokerfile
# プロジェクトのビルド環境用イメージとしてバージョン6.0のsdkを指定する
FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build

#ビルド環境側の作業ディレクトリをセット
WORKDIR /app

#ローカル環境からすべてのファイルをビルド環境へコピーする
COPY . ./

#コピーしたプロジェクトをリストアする
RUN dotnet restore

#publishディレクトリを指定して発行することで必要なファイルをまとめる
RUN dotnet publish -c Release -o publish

#アプリの稼働環境用イメージとしてバージョン6.0のaspnetを指定する
FROM mcr.microsoft.com/dotnet/aspnet:6.0

#稼働環境側の作業ディレクトリをセット
WORKDIR /app

#コンパイル環境のコンテナから発行したアプリのファイル群一式をコピーしてくる
COPY --from=build /app/publish .

#サーバの待ち受けポートを80ポートにセットする
EXPOSE 80

#起動するアプリをセットする
ENTRYPOINT ["dotnet", "HelloWorld.Server.dll"]

```

このDockerfileをプロジェクトフォルダに配置します。
![HelloWorldWithDockerfile.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342210/d08b2f5a-db8e-976a-731d-23f301bda208.png)


#Dockerイメージの作成
コマンドプロンプトのカレントディレクトリをプロジェクトフォルダ直下に移動させます。
そこで下記のコマンドを実行しDockerイメージを作成します。
今回はイメージ名をHelloWorldにしております。

```batch
docker build -t helloworld .
```

#Dockerイメージの起動
コマンドプロンプトのカレントディレクトリはプロジェクトフォルダ直下のまま下記のコマンドを実行します。

```batch
docker run -d -p 80:80 helloworld:latest --rm
```

コマンドが完了したら、`http://localhost/`をブラウザで開いてみてください。
次の画像のようなデフォルトのページが表示されるはずです。

![HelloWorldindex.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342210/a9aab39e-b6ea-cc49-1774-51aaf8ad7644.png)

次回の記事ではBlazor WebAssemblyアプリでサーバ側のログの取得方法に関してあまり情報を得られなかったので、今回私が実装してみた方法をご紹介いたします。