OmniAICreator/Qiita-1.07M huggingface dataset:
URLSession Swift

APIとは
--
アプリケーションプログラミングインターフェイスの略称。
他のプログラムと簡単に接続できる
殆どのプログラムではデータの送受信等にAPIが使用されている.


SwiftでAPIを取ってくるにはどうすればよいか
--
①　URLの作成

②　URLセッションの作成

③　URLセッションにタスクを与える。

④　タスクを始める
この順番でコードを書いていく

```swift:api.swift
//例
//ネットワーキングする場所
    func performRequest(urlString:String) {
        //①　URLの作成
        if let url = URL(string: urlString) {//optionalURL型で帰ってくる
            //②　URLセッションの作成(基本デフォルト設定）
            let session = URLSession(configuration: .default)
            //③　URLセッションにタスクを与える。//completionHandlerとは値として関数を取ります。
            let task = session.dataTask(with: url, completionHandler: handle(data:response:error:))
            //④　タスクを始める（データを取ってくる）
            task.resume()
        }
    }
    
    func handle(data:Data?,response:URLResponse?,error:Error?){
        //errorがわたってくるのでエラーがあったかどうか確かめられる。
        if error != nil {
            print(error!)
            return
        }
        if let safeData = data {
            let dataString = String(data: safeData, encoding: .utf8)
            print(dataString!)
        }
    }
```
クロージャーを使うと簡潔にかけるので通常は下記の様に書く

```swift:closure.swift

 func performRequest(urlString:String) {
        //①　URLの作成
        if let url = URL(string: urlString) {
            //②　URLセッションの作成(基本デフォルト設定）
            let session = URLSession(configuration: .default)
           //③　URLセッションにタスクを与える。//completionHandlerとは値として関数を取ります。
            let task = session.dataTask(with: url) { data, response, error in
                if error != nil {
                    print(error)
                    return
                }
                if let SafeData = data {
                    let dataString = String(data: safeData, encoding: .utf8)
                 print(dataString!)
                }
            }
        //④　タスクを始める
            task.resume()
        }
    }
```
これだけだとString型のものしかとってこれないのでこれをParseJsonをしてswiftでも使えるようにしなくてはいけない。

補足情報
--

URLSessionとは　ネットワーキングする際にネットワーク上のデータをまとめてダウンロードしてくれたりアップロードしてくれたりする。
URLSessionTaskとは　URLSessionがなにをするのかをきめる。ダウンロードなのかアップロードなのか等（```URLSessionDataTask URLSessionUploadTask URLSessionDownloadTask```）
URLSessionConfigurationとは　URLSessionの設定。.defaultでデフォルト設定が多いが、キャッシュやクッキーの扱い方によって```background　ephemeral```などに設定する必要がある。
Z3Py　例題　グラフ彩色問題

# 問題
以下のグラフの各頂点に 1 から 3 の数を割り当て、隣接する頂点の異なるようにせよ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118796/9d55809c-0fbc-d40d-1816-404b92ccfb0a.png)

# 回答
```example_graph_coloring.py
from z3 import *

V = [Int('v%s' % i) for i in range(1, 5)]
edges = [[1, 2], [1, 3], [2, 3], [2, 4], [3, 4]]

s = Solver()
s.add([And(1 <= V[i], V[i] <= 3) for i in range(4)])
for x, y in edges:
    s.add(V[x-1] != V[y-1])

print(s.check())
print(s.model())
```
出力

```terminal
sat
[v3 = 2, v1 = 3, v2 = 1, v4 = 3]
```

## 解説
`s.add(V[x-1] != V[y-1])` edge（辺）がつながっているノード間が異なるという制約をつける。


# 他の例題
[Z3Py個人的ポータル](https://qiita.com/Ganesha/items/7a606ffc8a7c2504c143) へ
サイト言語変換の表示

▪️ 今回はサイトに言語表記の変換機能を表示する方法を紹介

例 ] 日本の遺産を紹介している日本遺産ポータルのサイトを見ていただければわかりやすいと思います。右端の方に言語を日本語から英語、英語から日本語に変換できる場所が存在します。

http://japan-heritage.bunka.go.jp/ja/

▪️ 言語変換機能の表示

![スクリーンショット 2021-07-25 8.49.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/982443/bb9081a7-5da7-42ad-0de7-8ccecbce5817.png)

JPと書かれているコードは日本語表記を表しています。

↓
英語表記の場合はどうしたら良いのか？
上記の例で挙げた日本遺産ポータルサイトでは英語表記に変える際、英語版のサイトと日本語版のサイトを紐付けしていました。
気になる方は日本遺産ポータルサイトで検証を行って見てください。

今日の投稿は以上です。

wagaでした！
Before starting UiPath:回数が分かっていない繰り返し（While）

## 皆もすなるQiitaといふものを、儂もしてみむとてするなり。

と言う訳で、こん＊＊は！はなっち！です。

★★★この記事はUiPathブログ発信チャレンジ2021サマー、7/25の記事です。★★★

今回は、ちょっとしたシリーズです。UiPathを使うに当たって、UiPathの機能ではなく、コンピュータ言語を使う上での基礎知識を展開していこうと思います。

#回数が分かっていない繰り返し（While）

お財布の中の10円玉を積み上げてみてください。その中に、令和に発行された硬貨はあるでしょうか？
さて、どうやりますか？積み上げた、すべての硬貨を、一枚一枚、確認し、令和発行の硬貨があったら、終わりますね。

このように、単に積み上げた硬貨を一枚一枚確認していくような処理も、「繰り返し」と言います。
但し、こちらの繰り返しは、【ある条件を満たしている間】のだけの「繰り返し」となります。
【ある条件を満たすまでの間】では無い事に注意が必要です。

繰り返しは、以下のようなフローチャートになります。

　　　　積み上げた硬貨の中から【令和発行の硬貨が見つかる】まで、以下の動作を行う。
　　　　　　１）硬貨を手に取る
　　　　　　２）発行年が見える面にする
　　　　　　３）令和かどうか確認する
　　　　　　４）確認した硬貨を脇に置く
　　　　　　５）確認した効果が令和だったら、繰り返しを抜ける
　　　　　　６）確認した効果が令和でなかったら、１）に戻る

UiPathでは、回数が分からない繰り返しには下の二つがあります
　　　　「繰り返し（前判定）」アクティビティ（while）
　　　　「繰り返し（後判定）」アクティビティ（Do while）

「繰り返し（前判定）」アクティビティは、判定を先に行うものです。
ですので、場合によっては一連の処理を行わない場合もあります。
10円硬貨の場合ですと、積み上げた10円硬貨の発行年が見える状態で、更に令和であったような場合です。

「繰り返し（後判定）」アクティビティは、一連の処理をしたのち、判定を行うものです。
10円硬貨の場合ですと、積み上げた10円硬貨の発行年が見える状態で、更に令和であっても、一度は手にするような場合です。

「繰り返し（コレクションの各要素）」アクティビティや、「繰り返し（各行）」アクティビティと違い、「繰り返し（前判定）」アクティビティ、「繰り返し（後判定）」アクティビティは、コレクションなどを対象にしません。

 例えば、0秒、30秒ごとに処理をさせる仕様でしたら、「繰り返し（後判定）」アクティビティが使えます。

　　　　１）現在時刻を取得
　　　　２）0秒でない、且つ、30秒でなかったら、１）へ戻る
　　　　３）0秒、または30秒であったら業務処理をする

この際、条件の設定を間違えると、無限ループに陥りますので気を付けましょう。

##おわりに
いかがでした？

延々続くような事でも、「終わり」はあるものです。その「終わり」を見誤ると、無間地獄に陥ります。「終わり」をしっかり見極めましょう！
無間地獄に陥ってしまったら、RPACommunity 供養支部での登壇をお勧めします(^_-)-☆

是非UiPathでのロボ開発の一助になればと思っています。

ありがとうございました！
アプリ作成②「じゃんけんゲーム」

【作成の過程】
次に取り組んだのは、昔ゲームセンターで遊んだ「じゃんけんポンっ」のゲーム作成。
目指すイメージは決まっているが、そこまでどういうプロセスをたどるかは、完全にオリジナル。
とりあえず、基本的なアプリ設計過程と同じように、要件定義→設計→実装→テストというウォーターフォール型の行程をたどってみた。
要件定義は、ただじゃんけんで勝敗を決めるゲームを作るというごくごく単純なものなので難しくない。
設計では、機能設計で実装したい機能を列挙して、データベース設計、画面設計とアプリのイメージを細分化・具体化していった。
そして、実装を始めると、この画面があった方がいいとか課題が出てきて、当初の設計の甘さを感じた（笑）
最終的にテストをして、最低限の形にはなったかなという感じ。
まだまだ、デザインがチープだったり、実装したい機能（ルーレット、対戦モード、コイン複数枚がけ…）はあるが、今後の課題ということで、
まずは、オリジナルのアプリを作り、それを形にできたことのうれしさを感じた。

【アプリの概要】
小さい頃にゲームセンターで、わずかなコインを握りしめて白熱した「じゃんけんゲーム」をプログラミングで再現した。
勝った時は歓喜し、負けた時は絶望に打ちひしがれて、帰路についた。なぜ、あの頃はあんなに夢中になれたんだろう。皆さんが童心に帰ることができればいいですね。

【主な機能】
・ユーザー登録機能
・ユーザーログイン機能
・画像ファイルアップロード機能
・ゲーム機能
・ランキング表示機能

【画面一覧】
・ユーザー登録画面
・ユーザー登録確認画面
・ユーザー登録完了画面
・ログイン画面
・ゲーム画面
・ゲーム結果画面
・コイン獲得画面
・ランキング画面

【開発環境】
・CSSフレームワーク：Bootstrap
・言語：PHP
・DB:MySQL

【苦労した点】
・ゲストモードの実装（どのような方法をとればいいか試行錯誤し、結果的にguestをデータベースに登録し、ゲストボタンを押した際、guestのデータを取得しアプリを使えるようにした。※上書きは許容しない）
・コイン枚数の画面間引継ぎ方法（セッションの受け渡しをできるだけシンプルなコードで表現したかったが…）

【今後搭載したい機能】
・対戦モード（人間二人で使用）
・コンピューターの出し手や、獲得するコインを、ルーレットで決定させる。
・２枚の３枚betや、勝ったコインを元手にチャレンジができ、ハイリスクハイリターンが狙える。

【アプリURL】
・[じゃんけんゲーム](http://puputake.com/rock-paper-scissors/)
・[ソースコード](https://github.com/puputake/rock-paper-scissors)
Z3Py　例題　部分和問題

# 問題
集合 {2,3,5,8,13,21,34} の部分集合で， 和が50になるものはあるか?

# 回答
```example_coin2.py
from z3 import *

X = [2, 3, 5, 8, 13, 21, 34]
a = [Bool("a%s" % i) for i in range(len(X))]

s = Solver()
s.add(Sum([X[i]*a[i] for i in range(len(X))]) == 50)

print(s.check())
if s.check() == sat:
    m = s.model()
    subset = []
    for i in range(len(X)):
        if m[a[i]] == True:
            subset.append(X[i])

print(subset)
```
出力

```terminal
sat
[3, 5, 8, 13, 21]
```

## 解説
`Bool("a")`で、ブーリアン型の変数を定義できる。
`Sum()`で、入力したものの総和を計算します。（配列でなくてもOK）
例）Sum([a, b, c])　→　a + b + c
[Sum()の詳細](https://z3prover.github.io/api/html/namespacez3py.html#ac62e29cb18aa477df78e91a75fac7bf4)


# 他の例題
[Z3Py個人的ポータル](https://qiita.com/Ganesha/items/7a606ffc8a7c2504c143) へ
アプリの作成①「メッセージ投稿アプリ」

【作成の過程】
今まで学習した基礎的な知識を基に、オリジナルアプリの作成を始めた。
まずは、PHPの章の学習で使ったUdemy教材をベースにデザインやゲストの実装等アレンジし、「メッセージ投稿アプリ」を作成した。
今までは、動画で提示される課題の通りのものを作っていたが、
少しでもオリジナル要素を加えようとすると、正解がないわけで、どうしたらいいのかいろいろと考え込んでしまったが、
ひとまず形にし、デモデータを搭載した。

【アプリの概要】
複数のユーザーがメッセージを投稿・共有できるアプリ

【主な機能】
・ユーザー登録機能
・ユーザーログイン機能
・画像ファイルアップロード機能
・メッセージ投稿機能
・メッセージ返信機能
・メッセージ一覧表示機能
・メッセージ詳細表示機能
・ページネーション機能

【画面一覧】
・ユーザー登録画面
・ユーザー登録確認画面
・ユーザー登録完了画面
・ログイン画面
・メッセージ投稿・一覧表示画面
・メッセージ詳細画面

【開発環境】
・CSSフレームワーク：Bootstrap
・言語：PHP
・DB:MySQL

【今後搭載したい機能】
・メッセージ修正機能
・いいね機能

【アプリURL】
・[メッセージ投稿アプリ](http://puputake.com/posts_system/)
・[ソースコード](https://github.com/puputake/posts)
PHPとSQLの理解

【PHP,MySQL】
Udemy動画教材の「PHP+MySQL（MariaDB） Webサーバーサイドプログラミング入門」（たにぐちまこと氏）で学習した。
これまでは、デザインを作る要素が強かったHTML,CSSに、PHP,MySQLが加わることで、繰返し、条件分岐やデータベースとの連携など、よりプログラミングらしくなってきて、実現できる世界が広がったし、世の中のWebサイトの仕組みがなんとなくわかってきて、自分でもサービスを作ってみたいと思った。
動画合計12時間の長丁場で、特に初期の知識が空の状態だと、知識がなかなか定着せずに、モチベーションを保つのが難しかったが、行き詰まったら飛ばすなど、工夫しながら進めた。

【動画学習のコツ】
全体的に言えることだが、動画を見ながらコーディングする際重要なのは、ゴール（目的）を明確に認識したうえで取り組むことだと思う。でなければ、ただ写しているだけの「作業」になってしまう。だから、その章・レッスンごとのゴールを確認したうえで、まずは動画を見ないで自分でできるところまで進め、つまづいたところをメモに残し、動画で答え合わせをするという方法がいいと思った。
でも、まずは、動画と一緒に作り、動かすことが大事だと思う。
強化学習での「利用と探索のトレードオフ」と対処法

Q学習において方策をどのように定めるかということは、Q値、行動価値関数などの形式的な定義の後に来ることが多いです。そのような形式的な定義が頭に入っている前提で、方策を選ぶというQ学習において極めて重要な概念について私なりに説明していきます。



# グリーディー法
行動価値（厳密にはQ値）の高いものばかりを優先して取るという手法です。

そのような行動は以下のように定式化されます。これは直感的でわかりやすいです。

```math
a^*=max_{a}Q(s_t, a)

```

そして、そのような行動をとる確率は以下のように表されますが、直感的にわかりにくいです。

```math
\pi(s_t,a)=\delta(a, a^*)
```

このクロネッカーのデルタで形式的な定義をしているのがわかりにくいです。

## クロネッカーのデルタによる確率分布の意味

あなたは渋谷に来ました。
目の前にラーメン屋、健康定食屋さんがあります。
この状態では。Q値は以下のように求められたとします。
- ラーメン屋に行くこと: 100
- 健康定食屋に行く: 23

グリーティー法でない普通の方策であれば、
- ラーメン屋に行くこと: 20%
- 健康定食屋に行くこと: 66%
など確率的にどちらかが適当に確率が大きくなります。
この確率分布に従って多分健康定食屋に行くやろうけど、わんちゃんラーメン屋に行くことも理論上はありうる、みたいな状況になります。


一方で、グリーディー法の先ほどの形式的な定義によると
確率分布は
- ラーメン屋に行く:100%
- 健康定食屋に行くこと:0%
みたいなQ値の高い行動に対して確率が極端なものになります。もはや、確率分布というか、確定的な動きをしてますね。

このことを小難しく表したのが、クロネッカーのデルタを用いた先程の表現であり、それ以上の深い意味はないですね。

## グリーディー法で方策を決める問題点
グリーディー法は、現時点でのベストしか考慮しないので、他の行動を検討することにつながりません。
例えば、グリーディー法で生きる太郎くんがいたとします。太郎くんは、小学生時代は「真冬も半袖は半パンがかっこいい」という間違った、それでいて当時はQ値が高い行動を選択していたします。しかし、もし太郎くんがもっと柔軟に、「ぱっと見半袖半パンがかっこいいかもしれないけど、おしゃれなコートで登校するのもありなのでは？」と、現時点でのQ値は高くないけれども、他の行動を用いたら、太郎くんの人生は実は、より良いものになっていた可能性もあるわけです。

では、グリーディー法と対極的な方策の選び方には他に何があるでしょう？
# ランダム法 - 行き当たりばったりのセレンディピティ

この方策の選び方は、ランダムに行動を選ぶことです。より具体的には、等確率に行動を選びます。例えば、ラーメンを食べる、ポテトを食べる、タピオカを飲む、のうち1/3ずつの確率で行動を選びます。

これによって、Q値だけを見ると、ラーメンを食べるのが良かったけど、実際タピオカを飲んでみると、「食べるタピオカを作って売れば儲かるのでは？」といったビジネスアイデアがうかび、その後に起業して億万長者になる、みたいな漫画みたいな展開もありうるわけですね。

# でも、どっちもどっちじゃね？
はい、そうですね。グリーディー法をとれば近視眼的な選択しかできないが、ランダム法で選択をすれば、「今までせっかくQ値計算したけど、ランダムなんなら意味ないやんけ〜うへー」となってしまうのです。探索をすれば知識が利用できないが、知識を利用すれば探索ができない、という難しい問題に直面します。

これが「利用と探索のトレードオフ」  Exploitation-explolation Trade-off です。
英語の名称は韻踏んでてかっこいいですね。どこぞのラッパーが考えたのでしょうか？

# ではどうすればいいの？

「神のなせるままに、行動するしかないのか」
「いや、とりあえずQ値だけは計算してベストを尽くそう」

いや、諦めるのはまだ早いです。
そんなあなたに「ε-グリーディー法」や「ボルツマン選択」をお勧めします。

# ε-グリーディー法
ケンタウロスみたいに、上半身は人間、下半身は馬という動物を知っていますか？
では、もし体が上半身:下半身=ε:1-εみたいなケンタウロスがいたらどうでしょう？

ε-グリーディー法はグリーディー法とランダム法の両方を取ったもの。

```math
\pi(s_t,a_t)=P(a_t|s_t)=(1-\epsilon)\delta(a,a*)+\epsilon/N_A
```

こんな感じです。ここで$N_A$は今の状態でとりうる行動の総数ですね。
イプシロンを1-0の間で変化させて、どちらをどれだけ寄与させるか決めるという感じです。
少し苦肉の策感は否めませんね。。

# ボルツマン選択
ボルツマン選択では、行動の確率分布を以下に従って変えます。

```math
\pi(s_t,a_t)=P(a_t|s_t)\propto exp(\beta Q(s_t,a_t))
```

ここの比例$\propto$は何を表すのでしょうか？
これは、例えば、ラーメンを食べる、タピオカを食べる、などのそれぞれのQ値を正規化して、確率を求めるということです。

つまり

```math
Q_{ラーメン}, Q_{タピオカ}
```

のようにQ値がわかっているときに


```math
exp(\beta Q_{ラーメン}), exp(\beta Q_{タピオカ})
```

などをとりあえず計算します。そして、それぞれの値の和を求めます。

```math
sum = exp(\beta Q_{ラーメン}) + exp(\beta Q_{タピオカ})
```
これにより以下のような、それぞれの行動の確率がもとまる、ということです。

```math
exp(\beta Q_{ラーメン})/sum, exp(\beta Q_{タピオカ})/sum
```

なお、定数$\beta$は逆温度と呼ばれ、このパラメータを調整する必要があります。
これは、ε-グリーディ法のεと同じノリで、要は、グリーディー法の度合いとランダム法の度合いを決定するものです。
例えば、$\beta=0$だと、確率分布は完全にランダム法のそれと一致します。また、$\beta=1$だとグリーディー法と同じように、「Q値が高いものが、高い確率を持つ」というふうな確率分布が得られます。



# まとめ
方策の決め方として、グリーディ法とランダム法があるが、以下の問題をはらむ。
探索するとQ値が利用できない。一方で、Q値ばかりを利用すると誤った行動を取る可能性もある。
このような探索と利用のトレードオフに対処するには、ε-グリーディ法やボルツマン選択がある。
けど、結局パラメータ選ぶのがむずくね？という感じでした。


#参考文献
イラストで学ぶ人工知能概論　第二版


# 感想
教科書の数式は、形式的なものが多かったり、情報が抽象的に圧縮されすぎていることが多いです。
ですので、なるべく比喩を用いて説明しながら、この記事を書くことも、学習の一環として有効だったと感じました。
特に、ティーティングテクニックと呼ばれる、教えながら学ぶという方法は、学習効果が極めて高いことが数々の研究で示唆されてきました。
今後もこのような直感的な説明の記事を書いていきます。
CORSヘッダまとめ

# サーバが送るヘッダ

| ヘッダ名 | プリフライト | 本リクエスト | 説明 |
| --- | --- | --- | ---  |
| [Access-Control-Allow-Credentials](https://developer.mozilla.org/ja/docs/Web/HTTP/Headers/Access-Control-Allow-Credentials) | YES | YES | クレデンシャル（クッキーの送信、BASIC認証を許可するか）。**これをtrueにすると、Access-Control-Allow-Originでワイルドカードを使えなくなる** |
| [Access-Control-Allow-Headers](https://developer.mozilla.org/ja/docs/Web/HTTP/Headers/Access-Control-Allow-Headers) | YES | no | 本リクエストに含めることを許可するヘッダ
| [Access-Control-Allow-Methods](https://developer.mozilla.org/ja/docs/Web/HTTP/Headers/Access-Control-Allow-Methods) | YES | no | 本リクエストで許可するメソッド
| [Access-Control-Allow-Origin](https://developer.mozilla.org/ja/docs/Web/HTTP/Headers/Access-Control-Allow-Origin) | YES | YES | リクエスト元のOrigin。カンマ区切りで複数指定はできない
| [Access-Control-Expose-Headers](https://developer.mozilla.org/ja/docs/Web/HTTP/Headers/Access-Control-Expose-Headers) | no | YES | ブラウザのJavaScriptが読み取ることを許可するレスポンスヘッダ |
| [Access-Control-Max-Age](https://developer.mozilla.org/ja/docs/Web/HTTP/Headers/Access-Control-Max-Age) | YES | no | プリフライトを何秒キャッシュして良いか |

# クライアントが送るヘッダ

| ヘッダ名 | プリフライト　| 本リクエスト | 説明
| --- | --- | --- | --- |
| [Access-Control-Request-Method](https://developer.mozilla.org/ja/docs/Web/HTTP/Headers/Access-Control-Request-Method) | YES | no | 本リクエストのメソッド
| [Access-Control-Request-Headers](https://developer.mozilla.org/ja/docs/Web/HTTP/Headers/Access-Control-Request-Headers) | YES | no |　本リクエストのヘッダ
| [Origin](https://developer.mozilla.org/ja/docs/Web/HTTP/Headers/Origin) | YES | YES | オリジン

# 参考

- [Authoritative guide to CORS (Cross-Origin Resource Sharing) for REST APIs | Moesif Blog](https://www.moesif.com/blog/technical/cors/Authoritative-Guide-to-CORS-Cross-Origin-Resource-Sharing-for-REST-APIs/) 本記事内の表はこちらの記事をベースに作成した
- AWSのドキュメント[REST API リソースの CORS を有効にする](https://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/how-to-cors.html)
なぜMyBatisを使う

# なぜ必要か

業務システムでデータを扱う場合、改定日などを設けてマスターの世代管理が必要になる

改定日まで加味してレコードを取得する動きなどが必要になると

SQLを書かないで開発するというのは現実的ではない。

# MyBatisの特徴

MyBtisはSQLの実行結果とJavaオブジェクトを対応付ける

テーブルを結合する条件や抽出する条件が複雑でも問題にならない。

現場のテーブルがどのような状況でも、SQLを駆使してJavaオブジェクトと関連付けるというのが実際の業務において現実的。

反面、開発者にはSQLのスキルが求められる。

##　感想

* MyBatisについて調べていたときに見つけたので覚え書きとして簡単にまとめた。
* 実装中にも思ったが、細かい設定なしにデータベースが操作できるのはすごい。
ギリシャ文字をコードに直して加算して出力：glc

ギリシャ文字をコードに直して加算して出力します。
アルファ〜オメガまでの24個の文字を、文字列の中から一つずつ抽出して、加算します。
アルファは１、ベータは２、・・・、オメガは２４に相当します。
大文字、小文字は区別しません。
2021/7/25/12:30 改定 ver 1.2 .upper()を使用して、簡略化
2021/7/25/13:30 ver 1.3 .find()を使用して、文字の存在判定を省略
2021/7/25 14:00 ver 1.4 for ループを内包表記にして簡略化

今の所、アクセント記号（モノトニコ）は扱えません。
定数、greekcのアルファベットを変えてやると、utf-8が対応している他の言語用にもなります。

```glc.py
#!/usr/bin/python3
import sys
argvs = sys.argv
argc = len( argvs )
greekc = "ΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩ"
if argc != 2:
  exit(1)
v = argvs[1].upper()
s = sum(greekc.find(c) + 1 for c in v)
print(s)
exit(0)
```

実行例

```
$ glc.py Υπολογιστη
133

```
developerですと主張できるthedev.idのサブドメインを無料で使う方法

https://thedev.id/
>A free identity for developers on the web

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/5fwyqlb6y7w97v5mhijb.jpg)


thedev.idは無料で`yourname.thedev.id`を提供してくれています。
現状対応しているのは、GitHubとVercelです。


必要な手順は以下の通りです。
Step 1. レポジトリをForkする
Step 2. `subdomains.json`に利用したいサブドメインを追加する
Step 3. PRを送る
Step 4. `yourname.thedev.id` GitHub or Vercelに追加する


### Step 1 レポジトリをForkする

以下のレポに行って、`Click the Fork button`をクリックします。
 
{% github fransallen/thedev.id %}


### Step 2 `subdomains.json`に利用したいサブドメインを追加する

Forkしたレポジトリをクローンします。
フォルダの中にある`subdomains.json`をエディタで開き、追加したいサブドメイン情報を追加します。
フォーマットは以下の通りです。この時注意すべきことは、追加したサブドメインがちゃんとアルファベット順に則った形で追記されていることです。

ちなみに、この時点でGitHubであれば、`.github.io`　Vercelであれば、`.vercel.app`　URLがサービスから発行されている必要があります。確認したところ、herokuでも利用可能っぽいです。（1人使っている人がいて、ホスティングしているサイトが`subdomain.thedev.id`にアクセスすると表示されてます。ただ、Repo ownerがGitHubやVercelのように明言している訳ではないので、推奨環境ではないです。）

```json
"subdomain(whatever you want to have)": "site url that you are using for the site to host your site"
```

In my case, the added line is like below.
```json
"koji": "portfolio-nextjs-gdm7chx6i-kojikanao.vercel.app",
```

### Step 3 新しいPRを送る
`subdomains.json`を変更後、ファイルをForkしたレポジトリにPushし、PRをオリジナルのレポジトリを送ります。
現状、PRのフォーマットは指定ないので、以下のような形で送っておけば、大丈夫だと思います。

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/023hpwfqklkoim6rkwbh.jpg)

他の人のPRをチェックしたい場合は下記を参考にすると良いと思います。
https://github.com/fransallen/thedev.id/pulls?q=is%3Apr+is%3Aopen+sort%3Aupdated-desc

レビューのプロセスはすごく早いので、１、2日以内にはマージされると思います。


### `yourname.thedev.id` GitHub or Vercelに追加する

PRマージされたら、サブドメインを利用するためにドメインをGitHubもしくはVercelに追加します。
【Vercelの場合】
`Settings` タブを選択し、`Domains`をクリックして、`subdomain.thedev.id`を追加すれば完了です。

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/61ahge7x64ji8gft21od.jpg)


追加できたら、`https://subdomain.thedev.id`にアクセスして、ページが表示されるかどうか確認します。
mac のログイン画面で bluetooth デバイスが動作しない場合の解決法（apple シリコン編）

## TL;DR

macOS復旧からターミナルを開いて`/Volumes/Macintosh HD/Library/Preferences/com.apple.Bluetooth.plist`を削除して再起動するんだ！

### 手順
1. Macをシャットダウンする
1. 電源ボタン長押し（20秒程度）でmacOS復旧を起動する
1. 起動オプションのアイコンが表示されたら電源ボタンを約0.8秒間隔で続けて3回押す。早すぎても遅すぎてもダメ。うまくいくとmacOS復旧のログイン画面が表示される[【公式】Appleシリコンを搭載したMacでmacOS復旧を使用する](https://support.apple.com/ja-jp/guide/mac-help/mchl82829c17/11.0/mac/11.0#:~:text=%E9%9B%BB%E6%BA%90%E3%83%9C%E3%82%BF%E3%83%B3%E3%81%AF1%E7%A7%92%E4%BB%A5%E5%86%85%E3%81%AE%E9%96%93%E9%9A%94%E3%81%A7%E6%8A%BC%E3%81%99%E5%BF%85%E8%A6%81%E3%81%8C%E3%81%82%E3%82%8A%E3%81%BE%E3%81%99)
1. ログインを求められるが、この時点でbluetoothキーボードが使えるようになっているので、管理ユーザを選択しパスワードを入力してログインする。
1. メニューより「ターミナル」を起動する
1. 次のコマンドを実行し、bluetooth設定ファイルを削除する。`Machintosh HD`は各自の環境に合わせて通常起動時の起動ディスクの名前にすること。

    ```sh
    rm "/Volumes/Machintosh HD/Library/Preferences/com.apple.Bluetooth.plist"
    ```    
1. メニューより再起動する
1. ログイン画面でbluetoothキーボードが使えるようになっているので、通常ログインする
1. デスクトップが表示されたらキーボードを使って環境設定を開き、そのほかのbluetoothデバイスのペアリングを行う


## てんまつ
appleシリコンMacを使っていたら、突然bluetoothキーボードが動かなくなりました。あわててマウスでBluetooth環境設定で再接続を試みましたが、こんどはbluetoothマウスまで効かなくなってしまいました。

仕方なく有線マウスを探し出し、有線マウスで再起動をしたところ、ログイン画面でbluetoothキーボードもbluetoothマウスも動かずログインすることができなくなってしまいました。これではbluetooth環境設定を変更することができず、詰んでしまいます。

## 対応
appleシリコンMacでmacOS復旧を起動させるにはシャットダウンののち、電源ボタン長押し（20秒程度）すればよいことがわかり、早速macOS復旧を起動させました。

しかし、なぜかこの時点でbluetoothキーボードが復活しており、bluetoothマウスは復活していない状態でした。
ただし、この状態から再起動してログイン画面に戻るとやはりbluetoothキーボードもbluetoothマウスも効かない状態に逆戻りしてしまいます。

調べたところ、OS起動可能な状態でbluetoothデバイスが動かない時、`/ライブラリ/Preferences/com.apple.Bluetooth.plist`と`/ライブラリ/Preferences/com.apple.Bluetooth.plist.lockfile`ファイルを削除すれば復旧するという情報を得ました。

> 【Mac】Bluetoothが繋がらない場合にどうすれば良いのか？ | 酔いどれオヤジのブログwp
> https://minatokobe.com/wp/os-x/mac/post-19692.html

macOS復旧に「ターミナル」という項目があったので早速起動し、`/Library/Preferences/com.apple.Bluetooth.plist`を探しましたがファイルがありませんでした。

というのも、macOS復旧は普段の起動ドライブと異なるドライブで起動しており、普段使用している起動ドライブはmacOS復旧の`/Volumes/Machintosh HD`という名前でマウントされているのです。（注：`Machintosh HD`というドライブ名はデフォルト値です。皆さんの環境の起動ドライブ名に合わせて読み替えてください。）

なので、`/Volumes/Machintosh HD`内で`/Library/Preferences/com.apple.Bluetooth.plist`を探したところ、見事ファイルの存在を確認できました！

念のため、削除ではなくファイル名変更を行い動作確認を行ったところ、無事bluetoothキーボードがログイン画面で使えるようになりました！

ログイン後、環境設定よりbluetoothマウスをペアリングし、無事元通りの環境にすることができました。
軽く調査した段階では「有線キーボードがないと復旧不可」「OSの再インストールが必要」などという情報ばかりで絶望しかけましたが、探せばなんとかなるものですね。

この記事が誰かのお役に立てば幸いです。
2021/07/23開催 Connpassイベントランキング

# 申込数TOP5

|順位|イベント名|グループ|申込数|定員|
|:---:|:---|:---|:---:|:---:|
|:one:|[Hack The Boxで学ぶペネトレーションテスト（実践編）　第２回](https://hackthebox.connpass.com/event/218620/)|[Hack The Boxで学ぶペネトレーションテスト勉強会](https://hackthebox.connpass.com/)|93|95|
|:two:|[みんなでやろうDL勉強会 2ndシーズン Day6 演習＆LT会](https://jtpa.connpass.com/event/218861/)|[JTPA](https://jtpa.connpass.com/)|16|60|
|:three:|[大学生が語るふりかえりの実践](https://retrospective.connpass.com/event/217812/)|[ふりかえり実践会](https://retrospective.connpass.com/)|15|97|
|:four:|[おうじゃともくもくしたりする日 ＃47](https://oujasan-to-issho.connpass.com/event/219700/)|[おうじゃさんといっしょ](https://oujasan-to-issho.connpass.com/)|15|46|
|:five:|[プログラミング講座 : 機械学習アプリ入門 #5 音声認識編 (対面会場のみ特典あり)](https://kaishi-fc.connpass.com/event/218765/)|[開志専門職大学未来創造研究センター](https://kaishi-fc.connpass.com/)|12|19|
Django(DRF)でAPIからデータ削除時に各モデルに紐づいた画像をディレクトリからも自動削除してくれるdjango_creanupが感動するほど便利だった件

## 背景

最近、DjagoRestFramework と React を使って簡単なアプリを開発していたところ、curd でデータ削除時に各モデルに紐づいた画像を表面上では削除できるが、django アプリ側のディレクトリに画像ファイルが残ってしまう現象に少々困ったので良いものはないかと探してみると django_creanup なるものがあることを発見し、使用してみたところ、感動するほど便利だったのでこうして共有している所存です。

## 目的

- データ削除時にそのレコードに紐づいた画像ファイルを削除したい
- view の処理は増やしたくない
- もちろん手動は嫌なので自動にしたい

## django_creanup を使ってみた

- 公式 ( https://github.com/un1t/django-cleanup )
- バージョンの確認 ( https://pypi.org/project/django-cleanup/ )

※ 以下公式より引用、そして翻訳

> ### 互換性
- Django 2.2, 3.0, 3.1, 3.2 (詳細はDjango公式のサポートバージョンをご覧ください <https://www.djangoproject.com/download/#supported-versions>)
- Python 3.5+
- sorl-thumbnail <https://github.com/jazzband/sorl-thumbnail> と互換性があります。
- easy-thumbnail <https://github.com/SmileyChris/easy-thumbnails> と互換性があります。

> ### インストール

> ```
 $ pip install django-cleanup
```

> ### 構成
 ``settings.py`` の ``INSTALLED_APPS`` 以下に ``django_cleanup`` を追加します。

>（``django_cleanup.apps.CleanupConfig`` でも ``django_creanup`` だけでもどちらでも大丈夫です）

>```python:settings.py
INSTALLED_APPS = [
    ...,
    'django_cleanup.apps.CleanupConfig',
    or
    'django_cleanup',
]
```

> これだけです、他には何も必要ありません。

引用にもある通り、使用するためにはこれだけで大丈夫です。

view に何も追加必要する必要がないのが個人的にはありがたいなという感じです。

注意点としては、サードパーティーモジュールなので他のモジュールと衝突してしまう可能性があることです。

その場合はよく考えて使いましょう。

## まとめ

django_creanup めちゃくちゃ便利！！！！！！！！！！
ローカルのDb2 Data Management ConsoleでDb2 on Cloudのデータベースを管理する

# 目的

IBM CloudのDb2 on Cloudは管理用UIとしてWebコンソールがありますが、たまに不安定なときがあるのと、機能が限定されている場合があるため、ローカル版であるDb2 Data Management Consoleを使ってDb2 on Cloudを管理してみます。

# 手順

## Db2 on Cloud管理ユーザーを作成

Db2 on CloudのWebコンソールはIAMと統合されていますが、リモート接続用に固定ユーザーを登録します。サービス資格情報を追加すると、IDとパスワードが生成されます。IDは-uの、パスワードは-pの値です。また、--hostで接続アドレスとポート番号がわかります。これを控えておきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241424/0b966330-3f94-e62f-b390-2c0196a4d65c.png)

## Data Management Console環境の作成

Data Management Consoleはコンテナ版がありますのでそれを使うのが楽です。今回はComposeを使います。

``` docker-compose.yml
version: "3"
services:
  web:
    image: ibmcom/db2console
    environment:
    - LICENSE=accept
    ports:
    - 11081:8443
    volumes:
    - ${HOME}/var/dmcweb:/mnt
    - /etc/localtime:/etc/localtime
  db:
    image: ibmcom/db2
    environment:
    - DB2INST1_PASSWORD=******** # 任意のパスワード
    - DBNAME=dmcdb
    - LICENSE=accept
    volumes:
    - ${HOME}/var/dmcdb:/database
    privileged: true
```

コンテナを起動し、ログを確認します。少し待つとコンソールのユーザー名とパスワードが表示されます。

```
$ docker-compose up -d
$ docker-compose logs -f
dmcweb_1  | ******************************************************************************
dmcweb_1  | Summary
dmcweb_1  |   * Web console HTTPS URL:
dmcweb_1  |     https://<host machine>:<expose port on the host>
dmcweb_1  |   * Web console login information:
dmcweb_1  |     Username: admin
dmcweb_1  |     Password: ******
```

## Data Management Consoleの設定

ブラウザでコンソールにアクセスします。上記の例ではhttps://localhost:11081です。

先ほど入手したユーザ名とパスワードでサインインします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241424/f8d185f7-be01-8a96-5990-fdcdbcde03bc.png)

リポジトリDBへの接続情報を入力します。テスト接続で問題なければ次へ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241424/40b8c243-883a-d70e-a554-e27fb2a0d188.png)

統計イベントモニターをオンにして次へ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241424/eec7a1bd-0995-faf4-20d8-aa0c24473fce.png)

Db2 on Cloudの接続情報を入力します。テスト接続が成功することを確認します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241424/da23ae0b-17dc-61b3-8f1e-c1fab3d8bf38.png)

画面下部の操作資格情報は必要に応じて有効にします。これを設定しない場合、SQL操作などする際に改めて認証を求められます。つまり、Data Management Consoleを見るときとデータを操作するときで権限を分けることができます。今回は有効にします。その場合、テスト接続で問題ないことを確認します。

すべて問題なければ保存します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241424/b1f0aa07-1dfb-10f0-6158-4842d1a3b766.png)

設定が完了しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241424/44aac335-b940-26b0-8097-9306e7ab118e.png)

後はぜひ画面のあちこちを触ってみてください。Db2 on CloudのWebコンソールよりも多くの機能を使うことができます。
Format-listのプロパティ*指定


#前書き

PowershellでNTFSアクセス権の出力コマンド調べてたらFormat-listのプロパティ *指定なるものがあることを知ったので覚書程度にメモすることにした。

##本題
プロパティのリストがたくさん出るからよく使っていたが、
-Property *で表示できるプロパティを増やせる場合があることを今更知った。

Get-Aclで比較してみると以下の通り

*なし(Get-Acl | Format-List)
　Path 、Owner、Group、access、Audit、Sddl、

*あり(Get-Acl | Format-List -Property *)
PSPath、PSParentPath、PSChildName、PSDrive、PSProvider、CentralAccessPolicyId
CentralAccessPolicyName、Path、Owner、Group、Access、Sddl、AccessToString
AuditToString、AccessRightType、AccessRuleType、AreAccessRulesProtected、AreAuditRulesProtected、AreAccessRulesCanonical、AreAuditRulesCanonical

もうぱっと見でも項目数に差があるのがわかる。
(詳細情報の更に詳細とか知らんよ)

更に凶悪なのが*なしと*ありで結果が変わることがあるようで、

    PS C:\bin> Get-Acl | format-list

    Access : BUILTIN\Administrators Allow  FullControl
             NT AUTHORITY\SYSTEM Allow  FullControl
             BUILTIN\Users Allow  ReadAndExecute, Synchronize

    PS C:\bin> Get-Acl | format-list *

    Access: {System.Security.AccessControl.FileSystemAccessRule, System.Security.AccessControl.FileSystemAccessRule, System.Security.AccessControl.FileSystemAccessRule, System.Security.AccessControl.FileSystemAccessRule...}

*ありの方のAccessはクラス名が出力されているのみである。

NTFSアクセス権が出したかったので、SelectでAccessToString指定してcsvに吐き出すことにした。
元のコマンド内の意味のない連想配列を潰せたので結果オーライということで。

調査コマンドもついでにメモ程度に置いておく

    Get-Childitem <調査対象フォルダのルートフォルダ> -recurse | get-acl | select-object @{Label="Name";Expression={split-path $_.Path -NoQualifier}},AccessToString | Export-Csv ./<ファイル名> -NoTypeInformation -Encoding default

##参考
https://docs.microsoft.com/ja-jp/powershell/scripting/samples/using-format-commands-to-change-output-view?view=powershell-7.1
HDRPのデカールシェーダ触ってみた

# デカール触ってみた
unityのHDRPには標準でデカールという投影機の様な表現が可能なコンポーネント(Decal Projector)があります。それを少し触ってみました。

# 環境
- windows 
- unity 2020.3.11f1
- HDRP 10.5.1

# デカールの概要
このように直方体を設定でき、直方体とオブジェクトとが交差しているところに色がつくといったものになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/766461/084e0939-809e-a110-8ef3-13c5581d6418.png)
# uvを表示してみる
uvを表示してみるとこんな感じ
左下が(0,0)で右上が(1,1)とPlaneのuvを表示させてるみたいな感じですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/766461/9528e68b-8ac5-a3e5-c053-1121222e4768.png)
## uvの表示の仕方
uvの表示は簡単で、デカール用のshadergraphを使って表示を変えられます。
デカール用のShaderGraphは以下の通り [create]->[Shader]->[HD Render Pipeline]->[Decal ShaderGraph]で作成できます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/766461/d70c2b9e-3a47-5810-a910-90ab98c7f977.png)
shadergraphはこんな感じ。uvをfragmentのBaseColorにつなぐだけ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/766461/47ff5037-d84f-babc-3f80-4700e8ba1f8f.png)

Decal ProjectorというのをヒエラルキーでRendering->Decal Projectorで作成。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/766461/6fc21664-6bac-339c-db5a-fedb589f08e4.png)
デカール用のshadergraphをアタッチしたマテリアルを、Decal ProjectorコンポーネントのMaterialにアタッチしている。
*ちなみに、shaderを右クリックしてcreate->マテリアルで作成するとそのshaderをアタッチしたマテリアルが作成可能。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/766461/d7c6a971-f5ac-53ba-953d-a53d8a34b19d.png)
# shadergraphで遊ぼう
##　円を描画
uvが表示できたので円を描画してみた。
*ポストプロセスの影響で色がちょっと違って見えています
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/766461/6f761b6e-91e0-667e-02c5-e65ce7d441ed.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/766461/9eda54ad-0f29-c41e-06f9-d75cdae08c46.png)

## ミラーボールみたいなの作ってみる
投影機といえばミラーボール。なので雑なミラーボールを作ってみた。(ミラーボール本体ではなく投影結果を)
カラオケとかにあるんですかねミラーボール。
範囲を部屋を覆う様にDecal Projector設定して、下に記すshadergraph（のマテリアル）をDecal Projectorに設定すると以下のようになります。
![2021-07-24-23-55-54.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/766461/c8881929-155b-4095-6305-f171656bdbfa.gif)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/766461/654f3133-b3df-1b30-9ee1-64089fb1896f.png)
rotationノードはこんな感じ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/766461/b7102d40-a579-2bb9-a2b8-365d7f68c1d4.png)

六角形をいくつか散らばらせて、それをrotationノード（カスタムノード）でくるくる回して実装しています。六角形以外のところは真っ黒なのですが、そっちの方がカッコいいかなと残しています。多分アルファにも出力するようにすると黒い部分はなくなるかと（検証してない）

# 参考
以下のリンクの回転方法を参考にしました。
https://karanokan.info/2019/03/31/post-2465/
【500エラー】【AWS】RDSに日本語が保存できない問題　Rails on Docker

docker環境でrails6アプリを構築し、苦労してようやくEC2上にアプリをデプロイできたと思ったら、
何故かdeviseのユーザー登録時メール認証機能(comfirmable)、お問い合わせメール機能、ゲストログイン機能が500エラー。。。
メールに関する部分だけがエラーになっているからてっきりSMTPサーバーが機能していないのかな？などと推測し、
SESの設定を見直すも・・・・
解決できず。。

# 原因:RDSで作成したMySQLのDBに日本語が保存できないこと

RDSではDefaultでcharacter-setにlatin1が割り当てられるため、日本語を利用する際はutf8などに変更してあげる必要があったのでした。
そのためRDSで設定したMySQLに関するエラーが発生していました。
それに気づかずてっきりSMTPサーバー関係のエラーだと決めつけて数日もがいてました。。
そもそも私はログイン済みユーザーじゃないと新規投稿機能だったりフォローだったり、全ての機能を利用できないように制限をかけていたので
他のページの確認ができていなかったのですが、
本当はメールに関する部分だけがエラーになっていたのではなくて、
全体がエラーになっていたんだと思います。。。



# 解決につながったこと：エラーログの確認

エラーがどこで発生しているのか、原因の切り分けも大事ですが、エラーログを確認することが何より最も重要だと気づかされました。
docker環境でつくったアプリをEC2にデプロイしたら、本番環境のみエラーになってしまう。
開発環境ではエラーないのに。
その場合はどこでエラーログを見られるの？？
そもそもエラーログ出す方法なんてないんじゃないか？？
などと一週間くらいパニック状態でしたが（笑）

ログの出し方が分かったことで2、3時間くらいで解決できてしまいました！！！

# エラーログの出し方

```
[ec2]$ cd /var/www/アプリ名
[ec2]$ docker-compose exec app bash
root@f4658ed2b15e:/var/www/アプリ名# cd /var/www/アプリ名
root@f4658ed2b15e:/var/www/アプリ名# ls
root@f4658ed2b15e:/var/www/アプリ名# cd log
root@f4658ed2b15e:/var/www/アプリ名/log# ls
root@f4658ed2b15e:/var/www/アプリ名/log# tail -f production.log
```

tail -fを使うことで、ページにアクセスしたときのエラーをリアルタイムで見ることができて便利です。


# 解決策：RDSの設定変更

下記記事の通りに設定したら解決しました。ありがとうございます！


https://bamboo-note.tokyo/AWS/aws-rds-mysql-cannot-japanese/


https://qiita.com/reoy/items/e355debf1e2b2abd703b
Fargate+Secrets Managerで環境変数管理

## 前提

AWS CLIが入っていること

## create secret

create secretをコマンドラインから行います。
createすると以下のように返されるはずです。

```
aws secretsmanager create-secret --region ap-northeast-1 --name DATABASE_URL     --description "AWS Database URL"     --secret-string xxxx.yyyyyy.ap-northeast-1.rds.amazonaws.com
{
    "ARN": "arn:aws:secretsmanager:ap-northeast-1:xxxxxx:secret:DATABASE_URL-xxxxxx",
    "Name": "DATABASE_URL",
    "VersionId": "7c6cd5b1-e4ae-415f-zzzzzzz-xxxxxxxx"
}

```

AWS Secrets Managerに行くと、登録されているのが確認できます。

![Screenshot from 2021-07-25 00-33-37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396623/e8acc77c-fbf0-15d9-58c4-55c9ae409544.png)

## Secrets Manager読み取り権限の付与

読み取りのポリシーを追加します。(自分の場合は ecstaskexecutionrole)
Attach inline policyから追加しました。たぶんここもスマートな方法があるのかと思いますが、とりあえずこれで、、、

![Screen Shot 2021-07-25 at 16.54.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396623/1846e4a2-d8cd-aac9-d580-6cf85b94cc9a.png)


```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": "secretsmanager:GetSecretValue",
            "Resource": "arn:aws:secretsmanager:ap-northeast-1:803801015105:secret:DATABASE_URL-xxxxxx"
        }
    ]
}
```

## task definitionの整理

これをfargateのtask definitionのjsonファイルに貼り付けます。

```task-definition.json
# 必要なコンテナの定義に追加
"secrets": [
  {
    "name": "DATABASE_URL",
    "valueFrom": "arn:aws:secretsmanager:ap-northeast-1:803801015105:secret:DATABASE_URL-xxxxxx"
  }
]
```

## 参考

https://aws.amazon.com/jp/blogs/news/securing-credentials-using-aws-secrets-manager-with-aws-fargate/
Rails バリデーションの使い方と種類について(ActiveRecord型)。知らないとやばいくらい基本❗️

# バリデーションとは
データを保存する,不正なデータがデータベースに保存されないようにデータをチェックするシステムです。自分は共同開発の時にはログインなどの認証機能を作った時にバリデーションをかけずに、プルリクエストを出してボコボコにされてしまったことがあります。そのくらい***セキュリティ上でも大切***です。

# なぜバリデーションを使うのか.
正しいデータだけをデータベースに保存するために使われます。

# 使い方
基本的にRailsでもLaravelでも***モデルでバリデーションを使う***のが多いみたいです。
Railsチュートリアルではモデルに書いてました。
```
validates :カラム名(シンボル指定),検証ルール(シンボル指定)
```

# validationの種類
・```presence: true``` ***カラムの値が存在するかチェック***  
以下のようにcontent(テキスト内容)が存在するかのチェックです。
```post.rb
class Post < ApplicationRecord
  validates :content, presence: true
end
```
複数のバリデーションルールを指定する場合、以下のように書くこともあります。
```post.rb
class Post < ApplicationRecord
  validates :content, presence: true, length: { maximum: 140 }
end
```

・```inclusion: { in: [true, false] }``` ***boolean属性が空でないこと***

```user.rb
class User < ApplicationRecord
  validates :birthplace, inclusion: { in: [true, false] }
end
```

・```{acceptance: true}```***チェックボックス***

```rb
class User < ApplicationRecord
  validates :actor, acceptance: true
end
```

・```文字数の指定```　
***lengthを使って{maximum:数値}***を指定して***最大文字数を{minimum:数値}を指定***して
***最小文字列を指定***。***inを使い範囲や文字数飲みのバリデーションをかけ、
isで指定した数字のみ。***

```rb
class Post < ApplicationRecord

validates :content, {length: {maximum:100} } #最大１００文字以下

validates :content,　{length: {minimun:30} } #30文字以上

validates :content, {length: {in: 10..80} }  #10文字以上80文字以下

validates :content,　{length: {is: 30 }} #30文字のみ

end
```

 # 資料

 https://qiita.com/kotauchisunsun/items/e319e4c4b093d6add74b
AWS RDS外部から繋がらない(a5sql)

#はじめに
セキュリティグループを設定し、ec2からRDSに接続できた。
しかし、外部のDB接続ツールからDBが接続できない。

![WS000000.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97130/f5538c32-2b2d-fa86-3076-6222c4198206.jpeg)

#結論
パブリックアクセシビリティ「なし」の場合は、外部から接続できないため、
設定を変更する。

![WS000002.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97130/cb306a12-c391-c2c1-4e17-ce2b5d51a6fc.jpeg)

![WS000000.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97130/cf117e30-d03f-7d14-6cc3-65607e86340b.jpeg)

#接続確認

パブリックアクセシビリティ「あり」に変更されたことを確認し、
再度接続確認すると接続できます。
[04] docker-composeを活用して即座にGitLabを立てて使ってみる ... PlantUML を使う

# はじめに

GitLab を試したくてローカルPC 上に立てることにしたときの記録である.
また、別PC でも素早く環境構築ができるように docker-compose を使うことにした.
なお、試行錯誤の中での記録なので誤りもあると思う.

**今回は Git から離れて PlantUML を導入してみる**

## 参考サイトおよび書籍



## 環境

```
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=18.04
DISTRIB_CODENAME=bionic
DISTRIB_DESCRIPTION="Ubuntu 18.04.4 LTS"
```

## 手順

今回は PlantUML サーバをホスト側の 59081 番ポートを使って起動させる.


### 1. docker-compose.yml に PlantUML 定義を追加する

#### 差分

[最初に作成した docker-compose.yml](https://qiita.com/robozushi10/items/6ea798fd8f9863ef5439) に対して次を追加する.

PlantUML は latest を使っても良い.

```diff
  plantuml:
    image: plantuml/plantuml-server:jetty-v1.2021.1
    container_name: 'mygitlab-plantuml'
    restart: always
    ports:
      - '59081:8080'
    environment:
      TZ: "Asia/Tokyo"
```

#### 全文

docker-compose.yml 全文としては次のようになる

```yaml
version: '3'
services:
  gitlab:
    image: gitlab/gitlab-ce:latest
    container_name: 'mygitlab-core'
    restart: always
    hostname: 'server_01'
    volumes:
      - './PV/gitlab/config:/etc/gitlab'
      - './PV/gitlab/log:/var/log/gitlab'
      - mygitlab_opt:/var/opt/gitlab
    environment:
      TZ: "Asia/Tokyo"
      GITLAB_OMNIBUS_CONFIG: |
        external_url 'https://server_01:59443/'
        nginx['redirect_http_to_https'] = true
        gitlab_rails['gitlab_shell_ssh_port'] = 59022
        gitlab_rails['initial_root_password'] = 'rootroot'
    ports:
      - "59080:80"
      - "59443:59443"
      - "59022:22"
  runner:
    image: "gitlab/gitlab-runner"
    container_name: 'mygitlab-runner'
    restart: "always"
    hostname: "server_01"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - ./PV/runner:/etc/gitlab-runner
  plantuml:
    image: plantuml/plantuml-server:jetty-v1.2021.1
    container_name: 'mygitlab-plantuml'
    restart: always
    ports:
      - '59081:8080'
    environment:
      TZ: "Asia/Tokyo"
volumes:
  mygitlab_opt:
```


## 2. GitLab コンテナを作り直す

```bash
$ docker-compose stop gitlab
$ docker-compose rm -f gitlab
$ docker-compose up -d
```

## 3. GitLab が起動したら PlantUML を有効にする

下図の要領で PlantUML を有効にする.

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1246056/3e967287-a869-627a-da0f-65b04fab4c6f.png)


## その他

デバッグとして、`http://server_01:59081` にアクセスして次のように PlantUML サーバが起動していることを見る.

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1246056/135a438f-72ed-874c-edc4-6a9830326138.png)
[Python]ax+by=cを満たす(x,y)をPythonで求める[備忘録][数学][不定方程式]

# はじめに
先日、大学入試の問題を解いていた時に実装したコードの備忘録です。
ユークリッドの互除法に関する入試問題の解を確認できます。
Python3環境下にて、是非お使いください。

# 本編

```py:python
#sympy内の関数を使用
from sympy import *

#変数x,yの定義と定数a,b,cの入力
x = Symbol('x')
y = Symbol('y')
a,b,c = map(int,input("a,b,c=??").split())

#方程式の定義
expr1 = a*x+b*y -c

#xを求める
expr2 = a*x % b -c%b
i = 0
while expr2.subs(x,i) !=0:
    expr2.subs(x,i)
    i += 1

#求めたxの値を代入し、yを求める
expr1 = expr1.subs(x,i) 
sol = solve(expr1,y)

#出力
print("x="+str(i))
print("y="+str(sol[0]))
```

# 使い方
▶a,b,cは半角スペースで区切り、入力してください。
▶外部ライブラリにつき、予めインストールを要します。（以下、入力例）

```bash:bash/zsh
conda install sympy　#エラーが起これば、下のコマンドを実行してください。
pip install sympy 
```

# 留意点
- a≠0、b≠0で入力をお願いいたします。
- 試用していただいた@StrawBerryMoonさんに対し、この場を借りて感謝申し上げます。
:::note info
不定方程式につき(x,y)が複数組存在することがあります。
あくまで入試問題の検算用に留めていただけると幸いです。
:::

# References
## More Info
- About Sympy:https://www.sympy.org/en/index.html
- About How to Use Sympy: https://note.nkmk.me/python-sympy-factorization-solve-equation/

## About me
- SNS landing page(lit.link): https://lit.link/myon123
- GitHub: https://github.com/myon-bioinformatics
- Qiita: https://qiita.com/myon-bioinformatics
- Twitter(仕事用): https://twitter.com/myonitbusiness
- Twitter(プライベート用): https://twitter.com/myonmusicpgdev
- tumblr: https://www.tumblr.com/myon-helloworld
- Reddit: https://www.reddit.com/user/myon_reddit
- Pixiv: https://www.pixiv.net/users/87109499
- YouTube(Composer): https://www.youtube.com/channel/UC22_pvlkQynYsrSpAfyzEzA
- SpeakerDeck: https://speakerdeck.com/myon_bioinformatics
- マシュマロ(質問箱): https://marshmallow-qa.com/myonitbusiness

- LINE: https://line.me/R/ti/p/@661cphit
- Microsoft TechNet: https://social.msdn.microsoft.com/Profile/myon.TechNet
- プロフカード: https://profcard.info/u/ziUhwgZihSSTLZdqPZ0gz5aru6A3
- ニコニコ動画(niconico): https://www.nicovideo.jp/user/126513036
- Wish List: https://www.amazon.co.jp/hz/wishlist/ls/290EJPJ3PAS73?ref_=wl_share
- 転職ドラフト: https://job-draft.jp/users/58541
- RESUME.id: https://www.resume.id/myon
- Wantedly: https://www.wantedly.com/id/myon123
- Mastodon: https://mstdn.social/@myon
- mixi: https://mixi.jp/show_profile.pl?id=68
- Instagram: https://www.instagram.com/myonmusicpgdev
- Pinterest: https://www.pinterest.jp/myonmusicpgdev
- Forkwell: https://portfolio.forkwell.com/@myon

https://twitter.com/myonitbusiness/status/1573533239133671424


https://twitter.com/myonitbusiness/status/1587393241371987968
docker php-fpm に ldap拡張を組み込む

デフォルトでは php-fpm なコンテナに ldap拡張が入ってないので組み込む場合の Dockerfile

```Dockerfile
FROM php:8-fpm

ARG UID=1000
ARG GID=1000
RUN useradd -m -u ${UID} docker
# node.js for yarn
RUN curl -sL https://deb.nodesource.com/setup_16.x | bash -
RUN apt-get install -y nodejs

# yarn (webpack etc,...)
RUN apt remove cmdtest && apt remove yarn
RUN curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add -
RUN echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list
RUN apt-get update \ 
    && apt-get install -y libldb-dev libldap2-dev \
    && ln -s /usr/lib/x86_64-linux-gnu/libldap.so /usr/lib/libldap.so \ 
    && ln -s /usr/lib/x86_64-linux-gnu/liblber.so /usr/lib/liblber.so \
    && apt-get install yarn \
    && docker-php-ext-install pdo_mysql ldap \
    && apt install -y git unzip

USER ${UID}:${GID}
COPY --from=composer:latest /usr/bin/composer /usr/bin/composer
```
.NET関連の変数の仕様ついて（UiPath使用時のトピック）

この記事はUiPathブログ発信チャレンジ2021サマー　7/25の記事です。

　UiPathは.NET Frameworkがベースで作られており（そのうち.NET Coreになるようですが）、それ以前のVisualBasic6やVisualBasicForApplicationから言語仕様がかなり変化しました（といっても分岐してから20年以上たっていますが）。ただ、VisualBasic.NETが互換性維持のため、かなり文法的に工夫がされており、またUiPathの業務特性上、オブジェクトを新規につくる需要もあまりないため、VBAの知識だけでもそれなりに組めてしまいます。
　ただ、違いについて知っておいてほいたほうがいい部分もありますので、その一部を少しだけ紹介して見ようと思います。
　今回はその中でも変数について説明しようと思います。

# 変数の種類
　.NET Framework以前のVisualBasic（Ver6 含むVBA以降VisualBasic）はObject型変数以外はデータを格納する入れ物で、データを格納するしか機能はありませんでした。
　.NET Framework以降のVisualBasic（Ver7以降　以降VisualBasic.NET）では、変数を参照するときに、データ領域しか持たないデータであっても、データ型に対応したクラスを経由して参照するように変更になっています。そのため、データを参照する際に、データ型に対応したクラスに実装されているメソッドを呼び出すことができます。

たとえば、文字列を数字型に変換するときは以下の書式になります。

```vb
'【VisualBasicの場合】
 Dim i As Integer
 Dim s As String
 i = 10
 s = CStr(i)

'【VisualBasic.NETの場合】
 Dim i As Integer
 Dim s As String
 i = 10
 s = i.toString 'CStr関数もあるので、 s = CStr(i) でもOK 

```

また、変数の分類も、VisualBasicではデータを格納するプリミティブ型とオブジェクト型に分かれていましたが、Vissualbasic.NETでは、参照型と値型の２つに分類されています。
言語リファレンスには以下のように定義されています。
（詳細はVisual Basic ガイド 言語機能 データの種類[値型と参照型](https://docs.microsoft.com/ja-jp/dotnet/visual-basic/programming-guide/language-features/data-types/value-types-and-reference-types)参照のこと）

【値型】
　すべての数値データ型
　Boolean、 Char、および Date
　すべての構造体 (メンバーが参照型の場合であっても)
　列挙体 (基になる型が常に SByte、Short、Integer、Long、Byte、UShort、UInteger、または ULong であるため

【参照型】
　String
　すべての配列 (要素が値型であっても)
　Form などのクラス型
　デリゲート

※上記データと種類より抜粋

値型と参照型の基本的な相違点は以下の通りです

　・比較を行うとき
　　　値型は格納されている値同士を比較する
　　　参照型はオブジェクトが一致しているか比較する（参照型はデータとしてオブジェクトのアドレスしか保持していないため）

　・値の代入を行うとき
　　　値型は値のコピーを代入先に代入
　　　参照型はオブジェクトとのアドレスを渡す

※細かい動きについては後日追記します
※UiPath.Core.GenericValueは値型に分類されています


##String型について
　String型についてですが、上記だと参照型として提起されていますが、実際に使ってみると、

　・代入時にはオブジェクトのコピーを代入
　・参照時には値同士の比較参照を行っている

　という値型の動作をしています。これは、String型は参照型として定義されていますが、VsiualBasicとの互換性を意識して、あたかも値型に動くようにメソッドや比較演算子がオーバーライドされているためです。そのため、参照型にもかかわらず、値型のように扱うことができます。

以上簡単に、UiPAthのベース言語であるVisualStudio.NETの変数についてお伝えしました。

次回は実際の動きについて、UiPathを使ってお伝えしようと思います。

それではまた
あるリストに対して、CONF内のキーワードがヒットするか調べるロジック（VBS）

要点は以下２点。
・関数の宣言方法と、処理結果の受け取り方
　⇒主部で変数宣言しておき、関数内でこれに処理結果を代入する
・単純文字列をSplitで配列に変換する方法
　⇒型無しの変数に対してSplit結果を押し込むと、自動で配列と認識される

```vbs
Option Explicit

msgbox "Start of script.",,"INFO 01"

Function SortingCveByConf(sCveList, arrConfWord)
    Dim iFunc
    For iFunc = 0 To UBound(arrConfWord) - 1
        If Instr(sCveList, arrConfWord(iFunc)) > 0 Then
            sResult = sCveList & " : " & arrConfWord(iFunc)
            Exit For
        End If
    Next
End Function

Dim arrCveList(9)
arrCveList(0) = "Acrobat Reader DCに関する複数の脆弱性"
arrCveList(1) = "AmazonWebServiceに関わるAndAppBootHelper.exe 3.1以下の脆弱性情報"
arrCveList(2) = "Audacity 2.0と午後のこ～だの組み合わせ障害"
arrCveList(3) = "Microsoft Office 365に含まれるExcel、PowerPointの脆弱性"
arrCveList(4) = "Microsoft SQL Server Agent 2021の互換性プログラムに関する複数の脆弱性"
arrCveList(5) = "OracleVM VirtualBoxとJVMに関する複数の脆弱性"
arrCveList(6) = "TeraTermで不正なコマンドを実行されてしまう可能性"
arrCveList(7) = ""
arrCveList(8) = ""
arrCveList(9) = ""



Dim fso
Set fso = CreateObject("Scripting.FileSystemObject")

Dim oWShell
Set oWShell = CreateObject("WScript.Shell")

Dim sConfPath, oConfFile
sConfPath = oWShell.CurrentDirectory & "\" & "SortingCVE.conf"
Set oConfFile = fso.OpenTextFile(sConfPath)

Dim tmpAllConf
tmpAllConf = oConfFile.ReadAll
Set oConfFile = Nothing

Dim arrConfWord                         '*** 最初は型を配列に限定せずに宣言する
arrConfWord = Split(tmpAllConf, vbCrLf) '*** Splitで改行コードを区切り文字として分割、配列として変数に押し込む

Dim i, sResult
For i = 0 To UBound(arrCveList) - 1
    SortingCveByConf arrCveList(i), arrConfWord
    msgbox sResult
Next

Set fso = Nothing
msgbox "End of script.",,"INFO 02"
WScript.Quit
Ubuntu18.04でmacの日本語キーボードを使う

# ubuntuでmacのキーボードを使いたい
今回行ったのは以下の2つ。最善かはわからないのですが、できたので記録しています。

1. スペースキー両隣の、英数、かなを機能させる
1. 左のcommandにcontrolの役割をもたせる

#参考
こちらの2つの記事読めばできます。（2021/7/25現在)

UbuntuでMacキーボード 英数・かなキーを使う
https://atori.xyz/archives/157

Xmodmap でお好みのキーバインド
https://bearmini.hatenablog.com/entry/2013/07/12/161637

#環境

キーボード：Mac用日本語配列
ubuntu:18.04

#キーボード配列の設定(必要か謎)
以下コマンド実行。

```
sudo dpkg-reconfigure keyboard-configuration
```
1. MacBook/Macbook Pro(intl.)
1. 日本語
1. 日本語
1. キーボード配列のデフォルト
1. コンポーズキーなし
1. いいえ

#Xmodmapファイルの変更
以下コマンド実行。

```
xmodmap -pke > ~/.Xmodmap
```

キーのいろんな設定ができるファイルと認識しています。（雑）
ファイルを開いて編集。

```
vim ~/.Xmodmap
```
以下のkeycodeの箇所を書き換え。
先頭に!でコメントアウトできます。

```:.Xmodmap
!comment out
keycode 130 = Hiragana
keycode 131 = Zenkaku_Hankaku
keycode 133 = Control_L
```

以下実行。

```
xmodmap
```

実行結果例

```
xmodmap:  up to 4 keys per modifier, (keycodes in parentheses):

shift       Shift_L (0x32),  Shift_R (0x3e)
lock        Caps_Lock (0x42)
control     Control_L (0x25),  Control_R (0x69)
mod1        Alt_L (0x40),  Alt_R (0x6c),  Meta_L (0xcd)
mod2        Num_Lock (0x4d)
mod3      
mod4        Super_L (0x85),  Super_R (0x86),  Super_L (0xce),  Hyper_L (0xcf)
mod5        ISO_Level3_Shift (0x5c),  Mode_switch (0xcb)
```

ctl+cのように、何かと組み合わせて使うキーは、モディファイアキーというモディファイアキーの設定を変更するには、一旦このグループから抜かないといけない。

左のcommandは113番(16進数で0x85)なので、上記の場合はmod4からSuper_L (0x85)を削除する。また、controlとして機能させたいので、controlに追加する。ただ、先程

```
keycode 133 = Control_L
```

と追記したので、Super_L (0x85)は Control_L(0x85)になる。そのため、下記を.Xmodmapに追記（おそらく下の方に書くべき）


```:.Xmodmap
remove mod4 = Super_L
remove mod4 = Control_L
add control = Control_L
```

下記コマンド実行

```
xmodmap ~/.Xmodmap
```

#キー設定変更

右上の「あ」とか「A」とかになるところをクリック→ツール→プロパティ→キー設定　キー設定の選択　編集をクリック

入力キーの列が EisuもしくはHiraganaになっているエントリーがあれば削除する。

新たに以下のエントリーを追加

モード	入力キー	コマンド
直接入力	Hiragana	IMEを有効化
変換前入力中	Eisu	IMEを無効化
入力文字なし	Eisu	IMEを無効化
入力文字なし	Hiragana	IMEを有効化



| モード  |  入力キー  |  コマンド　|
| ---- | ---- | ---- |
|  直接入力  | Hiragana |  IMEを有効化  |
|  変換前入力中  |  Eisu  |  IMEを無効化  |
| 入力文字なし  |  Eisu |  IMEを無効化  |
|  入力文字なし  |  Hiragana  |  IMEを有効化  |
DockerでJupyterLab環境を作る - Streamlit編

Streamlitを表示させながらJupyterLabでコードを書きたいと思い、
Dockerで環境を作成しました。

前提の話はこちらの記事で書いています。

https://qiita.com/plumfield56/items/335cad3b58afe55f6529


基本的には上記の内容とほぼ変わらないですが、
docker-compose.ymlでimageを2つ作成している点がことなります。

# フォルダ構成

```
Dockerfile
docker-compose.yml
requirements.txt
src
 └ app.py
```

# Dockerfile

```dockerfile
FROM python:3

COPY requirements.txt .

RUN pip3 install --upgrade pip && \
    pip3 install --no-cache-dir -r requirements.txt && \
    pip3 install jupyterlab

WORKDIR /src
COPY /src /src
```

# requirements.txt

```
streamlit
pandas
```

# app.py

最初は空でも問題ないです。

```py
import streamlit as st

st.write('Hello Streamlit')
```

# docker-compose.yml


```yaml
version: '3'
services:
  jupyterlab:
    restart: always
    build:
      context: .
      dockerfile: Dockerfile
    container_name: jupyterlab
    working_dir: '/src'
    tty: true
    volumes:
      - ./src:/src
    ports: 
      - '8080:8080'
    command: jupyter-lab --ip 0.0.0.0 --port=8080 --allow-root --no-browser --NotebookApp.token=''

  stremlit:
    restart: always
    build: 
      context: .
      dockerfile: Dockerfile
    container_name: stremlit
    working_dir: '/src'
    tty: true
    volumes: 
      - ./src:/src
    ports: 
      - '8501:8501'
    command: streamlit run app.py
```

jupyterlabの方は`--NotebookApp.token=''`オプションを追加してトークンの入力なしで開けるようにしました。
streamlitでは`workind_dir`で指定したフォルダに`app.py`があることが重要です。

これらを用意してdockerコマンドを実行

```docker
docker compose up
```

`localhost:8080`でJupyterLab
`localhost:8501`でStreamlitが表示されます。


JupyterLabの拡張機能を入れるとimageの作成に時間がかかるので
省略していますが、実際には入れて環境構築します。

その話はこちらの記事でまとめています。

https://qiita.com/plumfield56/items/3be3bed14246d4f1e601
private と protected [Ruby on Rails]

#"private"と"protected" について
##使用例
```ruby:applicationcontrolle.rb
   def update
     @user.update(user_params)
     redirect_to users_path(@user)
   end

private
    def user_params
      params.require(:user).permit(:name, :introduction, :profile_image)
    end
```
```ruby:userscontroller.rb
 protected
  def after_sign_in_path_for(resource)
    user_path(current_user)
  end
```

##説明
　いずれも、データベースにあるデータを書き換えるときに必要な記述になります。
Rubyは安全性を考慮し、外部からデータを変えられないようになっています。いずれかの記述をすることで、データの変更が可能になります。
###「private」と「protected」の違い
・「private」は、自分だけが変更できる。
・「protected」は、自分と仲間(同じクラスのインスタンスに加え子孫クラスのインスタンス）が変更できる。
データを守る強度が、「private　**>**　protected」になります。
基本はprivateを使っておけば問題ありません。

##今回出てきた単語について
・???_params
・[after_sign_in_path_for(resource)](https://qiita.com/akachiryo/items/863a9f520bba2a1262ca)
Raspberry Pi 4 8GBにubuntu18.04 をインストール

■準備

https://www.amazon.co.jp/gp/product/B098DRRTDJ/ref=ppx_yo_dt_b_asin_title_o03_s00?ie=UTF8&psc=1
上記のRaspberry Pi 4 8GBを購入。MicroSDHCカード32GやtypeC用の電源も付属しているので事足りる。

![S__11730948.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620517/bd67cc4e-66f2-07c2-f6d5-594a9f5e9ea9.jpeg)

上記からMicroSDHCカード32Gを取り出し、PCに挿入
![S__11730946.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620517/db253b58-f326-0a9a-ed65-efdb6210c593.jpeg)

■インストール

公式のUbuntu18.04.4 LTSのRaspberry Pi4 (64-bit ARM)は公開されていないので、非公式版Xubuntu desktopのイメージをダウンロードする。
・[xubuntu-18.04.4-preinstalled-desktop-arm64+raspi4.img.xz](https://github.com/TheRemote/Ubuntu-Server-raspi4-unofficial/releases/download/v28/xubuntu-18.04.4-preinstalled-desktop-arm64+raspi4.img.xz)

 Micro SD カードに書き込む用のimager
・[Raspberry Pi Imager for Windows](https://downloads.raspberrypi.org/imager/imager_1.4.exe)

ダウンロードが完了し、手順通りにインストールが完了したらイメージファイルを選択
![スクリーンショット 2021-07-24 161558.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620517/e90f4ce7-a7a1-5931-9414-c6e88d42e2b2.png)
すると
![スクリーンショット 2021-07-24 161744.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620517/67d6af29-8865-8075-16b4-92da14113dd4.png)
CHOOSEを選択しWTITE（書き込み）開始！！