OmniAICreator/Qiita-1.07M huggingface dataset:
Android Studioのインストール Windows編

## Android Studioのインストール
Android StudioのインストールまではUIに従って手順にできる。
以下、その時の手順をメモとして残しておく。

### 公式サイトよりダウンロード

https://developer.android.com/studio/
トップに出てくる最新版をダウンロードする。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1035014/b2ac91a9-ade9-64ec-81ce-d2ba0b756182.png)

ダウンロード時の同意確認をOKしてダウンロードを行う

### インストール

ダウンロードしたExeを実行

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1035014/2c6e4a16-d8ce-8279-792e-5ebafbae8599.png)

カスタムがなければ手順通りに実行し完了
難しい箇所はない
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1035014/cdfb55a7-3f55-875c-091e-7177c562a19d.png)

設定ファイルがなければ設定ファイルのインポートなしでOK
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1035014/bf7165ac-544f-d580-e2f9-22cfd1a4696c.png)

SetUp Wizard完了
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1035014/6b3f217c-91b8-5161-cd04-d677653ef172.png)

### SDKのインストール
次にSDKマネージャーを起動し、必要なSDKをインストールする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1035014/f2d67c63-d883-17f1-fba9-ada3cd9d1794.png)

この時点では、Andoroid11.0のみインストールされている。
Android10.0のシミュレータで開発・テストを実施することがある場合は、Android10.0もインストールしておく。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1035014/e8b1a7c4-5f2e-d7e7-6d3d-57ac7c03402e.png)

### AVDマネージャよりデバイスのインストール
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1035014/70b95af8-4a6b-5268-9f29-f12bfa8a6967.png)

デフォルトでもPixelのとあるバージョンが入っているのでそれを使う場合は、追加インストールは不要。
仮想デバイス1つ追加すると1ギガ程度は必要になるため、必要な分だけインストールするようにする。

これでシミュレータの準備はOKで、開発時にコネクトさせることでデバッグ開発が可能となる。
aws s3のパブリックアクセスについてまとめる

この記事は下記に移行しました。
今後更新は下記で行っていきます。

https://airteamlab.jp/posts/1989/

# パブリックアクセスとは

- s3はバケットを用意してその中にオブジェクト（画像）を入れていく。パブリックアクセス設定はバケットに対しての公開設定
- 基本的にパブリックアクセスを全部offにしていてもiamで許可しているユーザーは保存できる

## そもそもの勘違い。

![スクリーンショット 2021-04-18 16.19.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193389/44812956-9104-0e44-7f10-458ace6d1112.png)

ブロックパブリックアクセス (バケット設定)を設定する上記画面だがそもそもこの画面は設定自体をいじるというよりも許可を勝手にonにしないよという設定。ここを設定することで新しく作った際にonになってたりするのを防ぐ。

## 3つのアクセス権限編集

- ACL(アクセスコントロールリスト)
- バケットポリシー
- IAMポリシー

https://qiita.com/ryo0301/items/791c0a666feeea0a704c

s3には上記3つのアクセス権限の編集方法があり、この３つどれかを通ってアクセスされる。基本はIAMで管理されるがawsアカウントのない外部からの処理を上二つで受け、そのアクセス権限をこのブロックパブリックアクセス (バケット設定)で設定している。

# 参考資料

http://muessenwirwollen.hatenablog.com/entry/2019/10/19/203706
SwiftとFirestoreで部分一致させる

# はじめに
<!-- 発端や概要を記載 -->
Swiftを使ってCloud FirestoreのデータをLike検索したので、メモのために残しておきます。

# やり方
こんな感じでoder、start、endを使えばいけます！
「searchText」に部分一致する対象を検索しています。
swiftでは"\u{f8ff}"の様に中かっこで囲むのが肝みたいです。


```swift:sample
        Firestore.firestore().collection("users").order(by: "name").start(at: [searchText]).end(at: [searchText + "\u{f8ff}"]).getDocuments(){ (querySnapshot, error) in
            if let querySnapshot = querySnapshot {
                print("成功")
            } else if let error = error {
                print("失敗")
            }
        }
```

<a id="#reference"></a>
# 参考文献
- [Cloud FirestoreでLike検索する方法](https://note.com/shogoyamada/n/n8fe9486fcbec)
Mobile Publisher を使用してブランド設定したモバイルアプリケーション ⇒ ブランド設定されたアプリケーションの作成

１．ブランド設定されたアプリケーションを作成する場合の最初のステップは何ですか?
２．ブランド設定できる Mobile Publisher アプリケーションの要素はどれですか?
３．Salesforce 管理配信タイプでは、アプリケーションの公開にどの開発者アカウントが使用されますか?
４．Mobile Publisher プロジェクトには何が含まれますか?
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634241/fad10079-0f0d-a35b-efcc-c7c90f3b6c9a.png)
Julia でActor(2)

## Actorでの非同期返り値の受け渡し

前回作ったActorの実装は完全に非同期のメッセージパッシングだけで返り値を受け取れない。純粋なActorモデルはこれだけなので、これだけでプログラムは書けるはずなのだが、流石に書きにくいので普通のActor実装では、非同期に返り値を受け渡す機構が実装されている。昔なつかしABCLで提案されたFutureと呼ばれる機構を使うのが一般的。

Futureは値を受け渡すための箱で、値が入っていない状態で値を取り出そうとするとブロックするようにできている。FutureはJuliaの分散環境でも実装されているが、Juliaのようにチャンネルがすでに実装されている言語では、長さ1のチャンネルを使えばいいので簡単。

### Futureの実装

複数回読み出したときに、値をキャッシュしておく必要があるので、チャンネルを構造体でラップして、キャッシュとペアにしておく必要がある。また、キャッシュをチェックして更新する際の競合を避けるために`lock`も必要。

```Julia
mutable struct Future
    cn::Channel
    lock::ReentrantLock
    cache
end    

function Future()
    Future(Channel(1), ReentrantLock(), nothing)
end
```

このFutureから値を取り出す関数`fetch`を定義する。`lock`をかけてから`cache`をチェックして`nothing`であれば`take!`でチャンネルから読み出そうとする。2回め移行は`cache`に値が入っているはずなので、それをそのまま返す。

```Julia
import Base.fetch
function fetch(f::Future)
    lock(f.lock)
    if f.cache === nothing
        f.cache = take!(f.cn)
    end
    unlock(f.lock)
    f.cache
end
```

## タスクループと、メッセージ
メッセージと返り値のためのチャンネルをタプルにしてチャンネルで送信するようにする。

``` Julia
abstract type Actor end
abstract type Message end
struct Context end    
MessPair = Tuple{Message, Future}

function taskLoop(cn::Channel{MessPair}, target::Actor, ctx::Context)
    try
        while true
            mes, future = take!(cn)
            res = handle(target, mes, ctx)
            put!(future.cn, res)
        end
    catch e
        println(e)
    end
end

function start(target::Actor) 
    cn = Channel{MessPair}(Inf)
    ctx = Context()
    @async taskLoop(cn, target, ctx)
    cn
end
```

メッセージ送信用に`send`というメソッドを用意する。このメソッドで`Future`を作って、メッセージとペアにして送信し、`Future`を返す。
``` Julia
function send(addr, mes::Message)
    future = Future()
    put!(addr, (mes, future))
    return future
end
```
### 使い方
Actorの定義はほとんど同じで、`handle`メソッドで返り値を返すようにするだけ。

```julia
mutable struct Accum <: Actor
    v :: Int64
end

struct Add <: Message
    v :: Int64
end
function handle(self::Accum, mes::Add, ctx::Context) :: Int64
    self.v += mes.v
    self.v
end  

struct Sub <: Message
    v :: Int64
end
function handle(self::Accum, mes::Sub, ctx::Context) :: Int64
    self.v -= mes.v
    self.v
end
```

あとは、使うときに`put!`ではなく`send`を使う。

``` julia
addr = start(Accum(0))
f = send(addr, Add(10))
println(fetch(f))
f = send(addr, Sub(7))
println(fetch(f))
```

## 次にやること
型制約がかけたかったがうまく書けなかった。
定義をmacroにすれば、型情報がうまく取れるかな?
swift - アクセス修飾子

# はじめに
swiftのアクセス修飾子の種類とアクセスレベルについてメモしました．

# アクセス修飾子

上から下にアクセスレベルが下がる．

1. private : {}内のみ． 
2. fileprivate : 属するファイル内．
3. internal : 属するプロジェクト内．デフォルトなので，アクセス修飾子を何もつけずに定義した場合，アクセスレベルはinternal．
4. public : プロジェクト間（上書き不可能）．
5. open : プロジェクト間（上書き可能）．

基本的に，アプリ開発では，1 ~ 3 を利用．
Frameworkなどの開発では，4, 5 を利用．

アクセス修飾子をきちんと設定することで，他の開発者に誤って書き換えられたりすることを防ぐことができ，安全性が向上する．
MVPモデルについて

#はじめに
この記事では、MVPモデルについて簡単にまとめました。
⚠️当方初学のため認識違いがある可能性大です
誤りを見つけた際はコメントにて指摘していただけると幸いです🙇‍♀️🙇‍♂️


#参考
この記事は、以下の情報を参考にして執筆しました。

- [MVCから脱却したいのでMVPの勉強をした](https://qiita.com/hicka04/items/25be38a90fdde29c97c2)
- [iOSアプリ設計パターン入門](https://peaks.cc/books/iOS_architecture)
- [これまで自分が実装してきたMVPは中途半端だった](https://qiita.com/ARATAYOKOYAMA/items/c6042b5ddc0b51c9bd37)
- [Backbone.jsにおけるModel-View-Presenterアーキテクチャパターン]
(https://dev.classmethod.jp/articles/backbonejs-mvp/)


#MVPモデルとは
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790168/81ab81d3-489c-3051-0652-ed98df2d5b84.png)
￼￼(https://dev.classmethod.jp/articles/backbonejs-mvp/ から引用)
Presenter : Viewから移譲を受け、Modelに変更指示を送る。Modelからのコールバックを受けて，Viewを更新。
Model : 指示を受けて，自身を更新。
変更後，コールバックなどを行う。
View : 画面の描画担当。

また、MVPとMVCの違いは、MVCはオブザーバー同期に対して，MVPはフロー同期という点。
※なお、iOSアプリ設計パターンには、設計変更の動機，レイヤーの役割のどちらから見ても同じパターンだと考えてよいと書かれている。


#MVPの利点
- テストが比較的書きやすい
- protocolによって、レイヤー間の依存性を薄められる
- 小規模な開発にはちょうど良い場合が多い
- iOS開発に限って、ViewControllerから処理を減らせそう（MVC比較）


#Model
データ管理、またデータに関する操作および処理を定義。
Presenterから移譲された処理を実行（データの取得など）。
処理後、Presenterにコールバックを行う。
※iOS開発においては、import UIKitを書かない（UIを考慮しない）


#View
ユーザーが見る/操作する画面を表示。
Presenterにユーザから受けたイベントを移譲し、帰ってきた処理結果を表示。
データに影響を与える処理は一切書かない。


#Presenter
ModelとViewの仲介役。
Viewから受け取ったイベントをもとにModelに処理を移譲。
Modelの処理結果を受け取り、Viewに通知。
※iOS開発においては、import UIKitを書かない（UIを考慮しない）
分散が「偏差」を2乗する理由?

# きっかけ
[AtCoder Beginner Contest 043 C - いっしょ / Be Together](https://atcoder.jp/contests/abc043/tasks/arc059_a) でこんな問題に出くわしました。

>###問題文
>$N\,$個の整数$\,a_1,a_2,..,a_N\,$が与えられます。えび君はこれらを書き換えて全て同じ**整数**にしようとしています。各$a_i(1\leqq i\leqq N)$は高々一回しか書き換えられません(書き換えなくても良い)。整数$\,x\,$を整数$\,y\,$に書き換えるとき、コストが$\,(x-y)^2$かかります。仮に$a_i=a_j(i\neq j)$だとしても、ひとつ分のコストで同時に書き換えることは出来ません。えび君が目的を達成するのに必要なコストの総和の最小値を求めてください。

要は「$\,\sum_{k=1}^n (a_k-y)^2\,$の最小値を求めよ$\,(y\,$は整数$)\,$」ということですが、これって分散を求める公式

```math
{s_x}^2=\frac{1}{n}\sum_{k=1}^n (x_k-\bar{x})^2
```

から$\,\frac{1}{n}\,$を除いたものとほぼ同じ式ですよね。ということで$\,y\,$には$\,a_1,a_2,..,a_N\,$の平均$\,\bar{a}\,$が入りそうですが、それは本当なのでしょうか。そして、そういえば何故分散の公式は偏差、つまり「データと**平均**の差」を2乗しているのでしょうか。
とりあえず問題を解いてみましょう。

# 解いてみる
### 問題
変量 $x$ の $n$ 個のデータ $x_1,x_2,..,x_n $ について、

```math
\sum_{k=1}^n (x_k-p)^2=(x_1-p)^2+(x_2-p)^2+…+(x_n-p)^2
```

の値が最小となるような実数 $p$ の値を求めよ。

### 解答例

```math
\begin{align}
\sum_{k=1}^n (x_k-p)^2&=(x_1-p)^2+(x_2-p)^2+…+(x_n-p)^2 \\
&=({x_1}^2-2x_1p+p^2)+({x_2}^2-2x_2p+p^2)+…+({x_n}^2-2x_np+p^2) \\
&={np^2}-2(x_1+x_2+…+x_n)p+({x_1}^2+{x_2}^2+…+{x_n}^2) \\
&=n\left(p^2-\frac{2(x_1+x_2+…+x_n)}{n}p\right)+({x_1}^2+{x_2}^2+…+{x_n}^2) \\
&=n\left(p^2-2\bar{x}p\right)+({x_1}^2+{x_2}^2+…+{x_n}^2) \\
&=n(p-\bar{x})^2-n\bar{x}^2+({x_1}^2+{x_2}^2+…+{x_n}^2) \\
\end{align}
```

したがって、$\sum_{k=1}^n (x_k-p)^2$ は$\ p=\bar{x}\ $のとき最小値をとる。

# 合ってた
ということで、$\,y=\bar{a}\,$にすればよいことが確実になりました。なお、今回の問題では$\,y\,$は整数という制約があるため、$\,y\,$には$\,\bar{a}\,$の小数点以下を**四捨五入**したものが入ります。あとは線形探索で$\,(a_1-y)^2,(a_2-y)^2,\,…\,,(a_N-y)^2\,$を順々に計算し、合計を求めればOKです。

分散の公式がデータと平均の差を2乗しているのは、もしかすると得られる値が最小になるからなのかもしれませんね。あくまで憶測ですが。

<br>
ところでえび君って誰なんでしょうか。以上です。
SQL トランザクション

SQLでトランザクションに関して学びましたが、自分の脳内整理と備忘録用に残します。

<h3>●トランザクションとは</h3>
　　・DBMSに対して、複数のSQL文を送る際、１つ以上のSQL分をひとかたまりとして扱うよう指示することができ、<b>このひとかたまりのことを　トランザクション という。

<b>○トランザクションをどのように扱うのか</b>
　　・トランザクションの途中で、処理が中断されないようにする。
　　・トランザクションの途中に、他の人の処理が割り込めないようにする。
　　<b>※このようにひとかたまりのSQL文を扱うことを　トランザクション制御　という。

○トランザクション制御(1)
　　・DBMSはトランザクションに含まれる全てのSQL文について、必ず<b>「全ての実行が完了している」か、「１つも実行されていない」</b>のどちらかの状態になるように制御する。
　　・トランザクションに含まれる複数のSQL文が、DBMSによって不可分なものとして扱われる性質のことを、<b>トランザクションの原子性</b>という。(※原子のように、それ以上細かく分割できないから)

---
<h4>★トランザクションの指定方法</h4>

<b>・BEGIN</b>
　　開始の指示。この指示以降のSQL文を１つのトランザクションとする。
<b>・COMMIT</b>
　　終了の指示。この指示までを１つのトランザクションとし、変更を確定する。
<b>・ROLLBACK</b>
　　終了の指示。この指示までを１つのトランザクションとし、変更の取り消しをする。

---

<h4>●トランザクションの分離</h4>
<b>○同時実行に起こりうる３つの代表的な副作用</b>
　　<b>①ダーティーリード</b>
　　　　・まだコミットされていない未確定の変更を、他の人が読めてしまうという副作用のこと。その後キャンセルされてしまうかもしれない未確定の情報を元に、別の処理を行ってしまうため、非常に危険な副作用。

　　<b>②反復不能読み取り</b>
　　　　・あるテーブルに対して、SELECT文を実行後、他の人がUPDATE文でデータを書き換えると、次回SELECTした際に検索結果が異なってしまう副作用。（※2回の統計の間に値が書き換わることで、統計データ間で整合性が崩れてしまう。)

　　<b>③ファントムリード</b>
　　　　・反復不能読み取りと似ているが、2回のSELECT文の間に、他の人がINSERT文で行を追加することで、2回のSELECTで結果行数が変わってしまう副作用。

<b>◎上記副作用を解決するには</b>
　　<b>トランザクションを利用することで解決できる。</b>なぜなら、個々のトランザクションについて<b>分離性</b>を維持するために、以下のような制御をおこなうから。

　　・トランザクション制御を行うため、内部で<b>ロック</b>と呼ばれる仕組みを使う。<b>あるトランザクションが現在読み書きしている行に鍵をかけ、他の人のトランザクションからは読み書きできないようにしてしまう。</b>
　　・逆に、<b>自分が読み書きしたい行を他人がロックしている間、その相手のトランザクションが完了するまで自分は待たされる。</b>


<b>●一般的なトランザクション分離レベル</b>
・上に行くほど高速だが、副作用が発生する危険がある。
・下に行くほど副作用が発生する危険はないが、低速。
<b>分離レベル
READ UNCOMMITTED：ダーティーリード・反復不能読み取り・ファントムリード全て発生する恐れあり。
READ COMMITTED：ダーティーリード・反復不能読み取り・ファントムリード全て発生する恐れあり。
REPEATABLE READ：ダーティーリード・反復不能読み取り・ファントムリード全て発生する恐れあり。
SERIALIZABLE：副作用は発生しない。</b>


<b>●トランザクション分離レベルの指定</b>
<b>SET TRANSACTION ISOLATION LEVEL</b> 分離レベル名
または
<b>SET CURRENT ISOLATION</b>　分離レベル名

---
<h4>ロックの活用</h4>
<b>●明示的なロック</b>
　　・SQL文を使って、<b>明示的に指定した対象をロックすることも可能</b>。行以外にも、テーブル全体、またはデータベース全体をロックすることも可能である。

<b>○明示的に取得できるロックの種類</b>
　　・行ロック：特定の1行だけをロック
　　・表ロック：特定のテーブルぜんたいをロック
　　・データベースロック：データベース全体をロック

<b>①明示的な行ロックの取得
　　SELECT～FOR　UPDATE　（NOWAIT)</b>
　　
通常、SELECT文で選択した行には自動的に共有ロックがかかる。しかし、SELECT文の末尾に「FOR UPDATE」を追記すると<b>排他ロック</b>がかかり、他のトランザクションからはデータを書き換えることができなくなる。
※明示的なロックを取得しようとしたとき、既にロックされている場合、通常はロック解除まで自分のトランザクションは待機となるが、（NOWAIT)オプションを指定した場合、ロック解除を待機せず、すぐにロック失敗のエラーを返し、トランザクションは即終了となる。

<b>②明示的な表ロックの取得
　　LOCK　TABLE　テーブル名　IN　モード名　MODE（NOWAIT)</b>
　　　　※モード名は、<b>EXCLUSIVEで排他ロック、SHAREで共有ロック</b>となる。

---

<h4>デッドロック対策</h4>
<b>●デッドロックを予防する方法</b>
　　①トランザクションの時間を短くする。
　　②ロックする順番を同じ順番にする。
MRR (Mean Reciprocal Rank) とは

MRRとは?

MRR (Mean Reciprocal Rank) は情報検索システムの評価指標のひとつです。

MRRでは、検索結果のランキングにノイズが少なく、できるだけ上位に適合文書が存在することを重視するタイプの指標で、特に、検索結果ランキングを上位からながめたときに何番目に適合した文書（正解）があるか確認します。

MRRでは、ひとつの検索結果において、最初に見つかった適合文書のランクの逆数をスコアとします：

1位 = 1/1=1.0
2位 = 1/2=0.5
3位 = 1/3=0.333...
4位 = 1/4=0.25

さらに、こうした検索結果に対するスコアを複数そろえたときに、その平均をとったものをMRR値になります。

以下は、3つのサンプルクエリを対象とした上位5位までの書籍検索結果の例です（表中で<font color="red">**（適合文書）**</font>と示した結果が適合文書の場合）:

|Rank|検索結果1（query: “1984”）<br><font color="gray">情報要求: ジョージ・オーウェルの小説「1984」を読みたい|検索結果2 (query: “it”)<br><font color="gray" size=5>情報要求: スティーブン・キングによる小説「it」を読みたい|検索結果3 (query: “こころ”)<br><font color="gray">情報要求: 夏目漱石の小説「こころ」を読みたい
|----|-------------------------|-----------------------|---------------------
|1|<font color="red">**（適合文書）**</font><br>一九八四年, ハヤカワepi文庫 ; epi 53<br>ジョージ・オーウェル著, 高橋和久訳. 早川書房, 2009|ITナビゲーター = Information Technology Navigator, 2020年版<br>野村総合研究所ICTメディア・サービス産業コンサルティング部著. 東洋経済新報社, 2019|心<br>姜尚中著. 集英社, 2013|
|2|1984年のUWF<br>柳澤健著. 文藝春秋, 2017|ITリスクの考え方, 岩波新書<br>佐々木良一著. 岩波書店, 2008|心。 : 人生を意のままにする力<br>稲盛和夫著. サンマーク出版, 2019|
|3|経済数学の直観的方法マクロ経済学編<br>長沼伸一郎著. 講談社, 2016|ITが守る、ITを守る : 天災・人災と情報技術, NHKブックス = NHK BOOKS ; 1187<br>坂井修一著. NHK出版, 2012<br>心, 百年文庫 ; 6|ドストエフスキー, 芥川龍之介, プレヴォー著, 小沼文彦, 森鴎外訳. ポプラ社, 2010
|4|多言語社会ルクセンブルクの国民意識と言語 : 第二次世界大戦後から1984年の言語法、そして現代<br>小川敦著. 大阪大学出版会, 2015|ITロードマップ : 情報通信技術は5年後こう変わる!, 2019年版<br>野村総合研究所デジタル基盤開発部, NRIセキュアテクノロジーズ著. 東洋経済新報社, 2019|<font color="red">**（適合文書）**</font><br>こゝろ, 角川文庫<br>夏目漱石[著]. 角川書店, 2004
|5|1984年のビーンボール : オダジマタカシスポ～ツコラム大鑑<br>小田嶋隆著. 駒草出版, 2007|IT全史 : 情報技術の250年を読む<br>中野明著. 祥伝社, 2017|こころ<br>谷川俊太郎著. 朝日新聞出版, 2013

検索結果1のスコア = $1/1=1.00$
検索結果2のスコア = $0.00$
検索結果3のスコア = $1/4=0.25$

上記、検索結果1から3までのMRR（平均値） = $(1.00+0.00+0.25)/3=0.41666... \sim 0.417$

MRRは 0.0 から 1.0 までの範囲を取り、最大値は1.0です。MRR値が0.5を超えていれば、平均的に2件目までに適合文書があることが期待できるため、一定の性能があることが分かります。

一方で、最初の1件分の適合文書しか確認しないため、既知事項検索のような1件だけでも適合文書を確認すれば十分な状況には有効な指標ですが、複数の適合文書を確認しなければいけないような状況には不適切です。その場合には、平均精度等、他の評価指標を使うことをお勧めします。

また、MRRが扱う適合度は、適合か不適合かの2値 (binary relevance) が前提となっており、部分適合等の段階的な適合度 (graded relevance) を扱うことはできません。

## 参考文献

* 酒井哲也. [情報アクセス評価方法論 : 検索エンジンの進歩のために](https://www.coronasha.co.jp/np/isbn/9784339024968/). コロナ社, 2015, 297p.
* Mean reciprocal rank. https://en.wikipedia.org/wiki/Mean_reciprocal_rank (2021-04-18参照)
for文,if文,論理演算子 の組み合わせの計算

今回、for文,if文,論理演算子 の組み合わせの計算で悩み特に計算は分かるけど論理演算子が組み合わさると途端に手の動きが遅くなったのでメモします。


実際動かして、試したり数値を変えたりすることの大切さがわかりました。頭の中で考えて分からない場合、動かしてみるものありかもしれません。

簡易的なコードを作成いたしました!

例題1
<strong>ポイント</strong>
両方の倍数で0になるもの全部出力

```
for ($x = 1; $x <= 30; $x++) {
    if ($x % 3 === 0 || $x % 5 === 0) {
        echo $x . PHP_EOL;
    }
}
//3の倍数と5の倍数が0の時true。つまり両方の倍数で0になるもの全部出力
//出力結果
// 3
// 5
// 6
// 9
// 10
// 12
// 15
// 18
// 20
// 21
// 24
// 25
// 27
// 30
```

例題2
<strong>ポイント</strong>
ここでは3でも割れて5でも割れる数を出力。

```
for ($i = 1; $i <= 30; $i++) {
    if ($i % 3 === 0 && $i % 5 === 0) {
        echo $i . PHP_EOL;
    }
}
//3の倍数かつ5の倍数が0の時true.ここでは3でも割れて5でも割れる数を出力。
//出力結果
//15
//30
```

お気づきのことがありましたらコメントください！！
おすすめの問題集など！

参考
[論理演算子](https://www.php.net/manual/ja/language.operators.logical.php#language.operators.logical)
[ushiroyubi1's blog](http://ushiroyubi1.hatenablog.com/entry/2015/01/19/202442)
AWS SDK for PHPでMockする方法

# はじめに
LaravelでUnitテストを書いていて、AWS SDKに依存する部分のMockで死ぬほど詰まっていたところ先輩に教えてもらいました。AWS SDK for PHPの内部では、Client ClassのAnnotationにメソッド定義のみを行い、Annotationに定義された内容に適した実装を注入していくような形になっているので、Mockryで素直にMockする事ができませんでした。（気になる人はAWS SDK for PHPの実装をチェック）

# Aws\MockHandlerを使う
[AWS SDK for PHPバージョン 3 でのハンドラーとミドルウェア
](https://docs.aws.amazon.com/ja_jp/sdk-for-php/v3/developer-guide/guide_handlers-and-middleware.html#creating-custom-handlers)
上記のドキュメントの**Mock ハンドラー**という小節にあるサンプルコードが非常に明快です。

```php
use Aws\Result;
use Aws\MockHandler;
use Aws\DynamoDb\DynamoDbClient;
use Aws\CommandInterface;
use Psr\Http\Message\RequestInterface;
use Aws\Exception\AwsException;

$mock = new MockHandler();

// Return a mocked result
// AWS系のサービスから返って来て欲しい値をMockHandlerのキューにエンキュー
$mock->append(new Result(['foo' => 'bar']));

// You can provide a function to invoke; here we throw a mock exception
// こんな感じで例外もエンキューできる
$mock->append(function (CommandInterface $cmd, RequestInterface $req) {
    return new AwsException('Mock exception', $cmd);
});

// Create a client with the mock handler
// クライアントをインスタンス化する際にhanlderにMockHandlerインスタンスを渡す
$client = new DynamoDbClient([
    'region'  => 'us-west-2',
    'version' => 'latest',
    'handler' => $mock
]);

// Result object response will contain ['foo' => 'bar']
// 何らかのAWS系サービスと通信を行うメソッドを実行するとMockHandlerに登録された内容がデキューされ返される
$result = $client->listTables();

// This will throw the exception that was enqueued
// キューなので2回目に叩くと登録した例外が返ってくる
$client->listTables();
```

公式のドキュメントではDynamoDbClient、ネットの記事ではS３Client、私の検証ではCognitoProviderClientでも同様の手順でMockする事ができました。
AWS SDK for PHPを使ったUnitテストでお困りの方はお試しあれ。
Vuetify で特定の id リンクにジャンプする（Stringの場合、v-btnの場合）



## 経緯
Vuetifyをつかって、Rails で作成した id リンクに直接飛びたい。
しかし、一筋縄にはいきませんでした。
ボタンと文字、それぞれのリンクの付け方が異なっていたからです。
備忘録として残します。


### String に idリンク をつけたい場合
```
<nuxt-link :to="{ path: `/users/${item.user_id}` }">
  <span>
    Something
  </span>
</nuxt-link>
```

### v-btn に idリンク をつけたい場合
```     
<v-btn
  nuxt :to="`/users/${item.user_id}`"
>
  Something
</v-btn>
```

<hr>
参考記事
Nuxt × Vuetifyの状況下でv-btnをnuxt-linkにして使いたい
https://knews.vip/q/so73690053/mo-daru-e-no-nuxt-o-pun-rinku

モーダルへのNuxtオープンリンク
https://knews.vip/q/so73690053/mo-daru-e-no-nuxt-o-pun-rinku
<hr>

以上です。{} や / や " など、どの記号が必要なのか総当たりで試しました。
この記事で、どなたかの時間が節約されるのであれば幸いです。
超備忘録：教科書どおりにCFGが出力できないときに使った手法

# なんで、教科書どおりにoptが動かないんだぁぁぁ

Clang と llvm (というかopt)を使えば簡単にコールグラフやCFGが描画できる…って教科書には書いてあります。

教科書と言っているのは

https://www.amazon.co.jp/dp/4883379310/

とか

https://www.amazon.co.jp/dp/4844334158/

とかです。

書き方は以下の通りが一般的に記述されています。

```bash
$ clang -emit-llvm -S -o test.ll -c test.c
$ opt -dot-cfg test.ll
```

だが動かない。出力されている気配もない。
おまけに怒られる。

```bash
$ opt -dot-cfg test.ll
WARNING: You're attempting to print out a bitcode file.
This is inadvisable as it may cause display problems. If
you REALLY want to taste LLVM bitcode first-hand, you
can force output with the `-f' option.
```

## 救世主現わる

なぞすぎたのですが、以下の例を参考にやってみました。

https://qiita.com/saruo@github/items/65b0e4dbfc82569575d0

コードと最終的なコマンドはここ↓のを使いました。

https://stackoverflow.com/questions/5373714/how-to-generate-a-calling-graph-for-c-code/5373814#5373814

```vim:main1.cpp
static void D() { }
static void Y() { D(); }
static void X() { Y(); }
static void C() { D(); X(); }
static void B() { C(); }
static void S() { D(); }
static void P() { S(); }
static void O() { P(); }
static void N() { O(); }
static void M() { N(); }
static void G() { M(); }
static void A() { B(); G(); }

int main() {
  A();
}
```


```bash
$ clang++ -S -emit-llvm main1.cpp -o - | opt -analyze -dot-callgraph --callgraph-dot-filename-prefix=main
Cannot specify -analyze under new pass manager, either specify '-enable-new-pm=0', or use the corresponding new pass manager pass, e.g. '-passes=print<scalar-evolution>'. For a full list of passes, see the '--print-passes' flag.
```

## うーん、もう一歩みたいだ…

そこでひと工夫、というかエラーの指示に従って作成。

```bash
$ clang++ -S -emit-llvm main1.cpp -o - | opt -enable-new-pm=0  -analyze -dot-callgraph --callgraph-dot-filename-prefix=test
Writing 'test.callgraph.dot'...
Printing analysis 'Print call graph to 'dot' file':
Pass::print not implemented for pass: 'Print call graph to 'dot' file'!
```

むむ、出力されたっぽい。

ためしに

```bash
$ dot -Tpng test.callgraph.dot > test.png
```

すると…、

![test.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/494348/fa661713-9ed0-4fab-bcda-18df7a8e4c15.png)

でた。

これから詳しく調べますが、昔のようにはいかないのかもしれません。
備忘録なので、これ以上の事はつっこまない。以上。

### 調べてみて

https://releases.llvm.org/1.1/docs/CommandGuide/analyze.html

かなーり昔は analyze コマンドがあったらしい。今はないけど。で、

https://llvm.org/docs/CommandGuide/opt.html#cmdoption-opt-help

今は、opt に -analyze を付けいないと解析してくれないみたい。
…ってのはわかった。
Terraformにおけるソースコードの運用戦略

# はじめに
Terraformにおいて大きな課題の一つにソースコードの管理をどう扱うか､という課題に直面した｡
具体的にはAWSのLambdaなどはクラウドリソースであり､

今回は以下ののような構成をベースに考える｡

```
/	
└ terraform
　 ├ module
　 │ └ lambda
　 ├ production
　 ├ stagin
　 └ develop
```

その中で対策は大きく２つあると考える｡
# Terraformと同じリポジトリに埋め込む（ボツ案）
```
/
├ app
│ ├ func1
│ └ func2	
└ terraform
　 ├ module
　 │ └ lambda
　 ├ production
　 ├ stagin
　 └ develop
```
Terraformのリポジトリと同一のリポジトリにソースコードを含めてしまう｡
Terraformの環境差分をBranchを切らずに､main一本で管理していた｡
つまるところGitの機能はほぼ使わずに､ある意味ファイルサーバ的な使い方をしていた｡
リポジトリ=現在のシステム構成､と等価になるように維持していきたいからだ｡
[Terraformのディレクトリパターン集](https://qiita.com/reireias/items/253529c889cafb3fa4c7)
こうなると､appディレクトリはソースなので､もちろんバージョン管理したくBranchもどんどん切っていきたい｡

# Terraformと別リポジトリで管理する
```
/	
└ terraform
　 ├ module
　 │ └ lambda
　 ├ production
　 ├ stagin
　 └ develop
```
```
/
└func1
```
こうすると､Terraformの単一のBranchを維持したい思想と従来のソースコードのGit戦略を切り離せる｡
しかし､問題が一つ出てくる｡
**どのようにソースとTerraformを紐付けるか**だ｡

今回はこのように対処した｡

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/123667/d2d7ab6b-e35c-cb2d-a71f-3682359df613.png)
スクリーンショット 2021-04-18 15.16.11.png

具体的には､terraform側では関数の設定（IAMとの結びづけなど）自体はTerraform内で定義するが､
実際のソースコードはクラウド上のストレージ（S3やGCS）のFunc１バケットを指定｡
バケット内でバージョンごとにディレクトリを切っており､デプロイ時のバージョンごとに切られていく仕組みになる｡

これにより､明示的にTerraform側でバージョンを上げてやらない限り勝手にバージョンが上がることを防げる｡
またソースコードも従来どおりの管理が可能で､Terraformに反映させたいバージョンができると､GitにタグをつけてCI/CDを流す｡

# さいごに
正直Terraformに関してはGitと相性が悪すぎてベストプラクティスはないと思います｡
フロントエンド開発を始めるのに必要なワードを書き出してみる

## フロントエンドとは
フロントエンド・バックエンドという概念があるが、広義の意味でユーザが目に見える部分をフロントエンド、データベースとの通信やシステムの基幹処理を行うのがバックエンドという風に分類できる。
フロントエンドにもWebアプリ、ネイティブアプリがあり、別のフレームワークや言語を使うことが多い。
※共通化できるフレームワークも出てきている

## Webアプリ
ブラウザ上で動くアプリケーション。
PCやスマホの各ブラウザからのリクエストをWebサーバがHTTPで返す。
※HTTPでの通信をベースに、websocketなど別のプロトコルも使用可能
OSやブラウザが異なっても、１ソースである程度動く
【OS】
・Linux
・Windows
・MacOS
【ブラウザ】
・Chrome
・Safari
・Edge
・FireFox
・InternetExplorer
挙動やデザインが完全に同じではないこともある

## ネイティブアプリ
スマホやタブレット上で動くパッケージアプリで、AppStoreやPlayStoreに公開されたアプリをダウンロードして使用する。
スマホを持っているのが通常の今日、最も使用される頻度が高いのはネイティブアプリである。
上述のようにiOSとAndroidでストアが分かれていることからも分かる通り、iOS仕様・Android仕様に合わせた異なるパッケージ(IPA/APK)となる。
OSで提供されているものを使用するため、OSの種類や、OSのバージョンにより挙動が異なることがある。

## フレームワーク
フレームワークのトレンドでは
React.JS
Vue.js
Angular.js
が上がってくるが、中でもReact.JS/Vue.jsがツートップなのが現状。
これらが、SPAで作られているのに対し、従来ながらのPHP、Ruby on Rails、ASP.netのMVCモデルのWebアプリケーションもある。

## その他プロジェクトの選択肢として覚えておくべき技術
* PWA (Progressive Web Apps)
* ハイブリッドアプリ
* SSG (静的サイトジェネレーター)
* Jest
* Storybook

## まとめ
プロジェクトの規模や予算により様々な選択肢が可能なように現在広く使われている技術の吸収が大事である。
JestやTestCafeは自動テストを取り入れることで、テストコストの削減につながる。
モックやワイヤーフレームを用いてUIの要件定義をすることで実装コストを下げるのも有効で、
sketch・figma・XD・Cacoo・InVisionなどのツールを使いこなすことも必要。
【Rails】RSpecによるActiveStoregeでアップロードした画像のテスト

#はじめに
　RSpecでモデルテストを書いている時にActiveStorageでモデルに関連づけた画像のバリデーションのところでつまづいたのでメモ。
　RSpecとFactoryBotを使用する。（ここではインストールの部分は省略）
  
##やること
音楽レビューアプリのRecordモデルに付けた画像(`:jacket`)が空の時はエラーを表示する。

#モデル
RecordモデルはGenreモデルに紐づいている。
  
Genreモデルは、（一部省略）

```ruby:app/models/genre.rb
class Genre < ApplicationRecord
  has_many :records
end
```

Recordモデルは、（一部省略）

```ruby:app/models/record.rb
class Record < ApplicationRecord
  belongs_to :genre
  has_one_attached :jacket #一つの画像

  validate :jacket_presence　#画像のバリデーション

  def jacket_presence
    unless jacket.attached?
      errors.add(:jacket, 'must be attached')
    end
  end
end
```

`has_one_attached :jacket`で一つの画像を持つとし、
`jacket_presence`メソッドで画像が付いていない時はエラーメッセージを追加する。
　　
#テスト用画像の用意
　まず`public`ディレクトリに`jackets`ファイルを追加し、
そこに一つ画像を追加する。
![スクリーンショット 2021-04-18 14.36.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1293843/4606f292-b351-00e6-9d14-65591939e8cc.png)

ここでは`justin.jpg`ファイルを`public/jackets`に追加。
　　
#FactoryBotを編集
まずは`Genre`を編集する。

```ruby:spec/factories/genre.rb
FactoryBot.define do
  factory :genre do
    name { "Pop" }
  end
end
```
  
次は`Record`を編集する。

```ruby:spec/factories/record.rb
FactoryBot.define do
  factory :record do
    name { "Justice" }
    release_year { 2021 }
    artist { "Justin Bieber" }

    #genreとのアソシエーションは、
    #genre_id { 1 } でなく、以下のように書く
    genre

    #recordモデル作成後:jacketを関連づける。
    after(:build) do |record|
      record.jacket.attach(io: File.open('public/jackets/justin.jpg'), filename: 'justin.jpg')
    end
  end
end

```
これでテスト用のモデル作成の準備が完了。
　　
#テストファイルの編集
`Record`のモデルテストを編集する。

```ruby:spec/models/record_spec.rb
require 'rails_helper'

RSpec.describe Record, type: :model do

  describe 'create new record'do

    before do　#テスト用のRecordを作成
      genre = FactoryBot.create(:genre)
      @record = FactoryBot.create(:record)
    end

　　#全ての項目があれば有効。
    context 'with a name, release_year, artist, genre, and jacket' do
      it "is valid" do
        record = @record
        expect(record).to be_valid
      end
    end

    #:jacketなしの場合はエラー
    context 'without a jacket' do
      it "is invalid" do
        @record.jacket = nil　#:jacketを空にする。
        record = @record

        record.valid?
        #エラーメッセージが追加される。
        expect(record.errors[:jacket]).to include("must be attached")
      end
    end

  end 
end

```
`Record`は`Genre`に紐づいているため先に`genre`を作成している。

これでテストできた。
【Node.js】Express-generatorでwebアプリを開発する手順。

express-generatorを使ったwebアプリ開発の手順をメモっときます。

基本的には[Express のアプリケーション生成プログラム
](https://expressjs.com/ja/starter/generator.html)の通り。

## generatorをnpm経由でインストール

```
npm install express-generator -g
```

`-g`オプションをつけて、グローバルにインストールします。

## コマンド確認

どんなコマンドがあるか知っておくと良いかも。

```
express -h

//実行結果

  Usage: express [options] [dir]

  Options:

        --version        output the version number
    -e, --ejs            add ejs engine support
        --pug            add pug engine support
        --hbs            add handlebars engine support
    -H, --hogan          add hogan.js engine support
    -v, --view <engine>  add view <engine> support (dust|ejs|hbs|hjs|jade|pug|twig|vash) (defaults to jade)
        --no-view        use static html instead of view engine
    -c, --css <engine>   add stylesheet <engine> support (less|stylus|compass|sass) (defaults to plain css)
        --git            add .gitignore
    -f, --force          force on non-empty directory
    -h, --help           output usage information
```

## アプリ作成

```
express --view=pug myapp
```

これで`myapp`というフォルダができる。

`--view`のところはテンプレートエンジンを記述。

デフォルトは`pug(Jade)`が使われており、`--view=ejs`とかにすれば`EJS`を使える。

テンプレートエンジンが不要な場合は`--no-view`でOK。

## npm -i

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

```
npm -i

または

npm install
```

## npm start 

```
npm start
```
これでサーバーが起動します。

`http://localhost:3000/`にアクセスすれば表示されるはず。

あとはガンガン開発していけばOKですね。簡単！
create-react-appでのパッケージマネージャー


今回create-react-appで環境構築をした後、npm installでライブラリなどをインストールした際に起きたビルドエラーの対処法を備忘録として残します。

## 環境構築

```
npx create-react-app my-app --template redux-typescript
```

上記コマンドで環境を作りmaterial-uiなどをnpm installで入れた後にnpm startをした時に
下記のビルドエラーが発生。

> Could not find a declaration file for module ‘react’. implicitly has an ‘any’ type. If the ‘react’ package actually exposes this module, consider sending a pull request to amend

##原因
調べてみると、どうやらcreate-react-appではデフォルトでパッケージマネージャーにyarnを使用されていて、既存のnode_modulesがyarnで作成されているのに対して、npmで追加の依存関係をインストールしたことが原因だとのこと。

## 解決方法
node_modulesとyarn.lockファイル削除し、npm installする。
すると新たにnode_modulesフォルダが生成され、最初にインストールしていたmaterial-uiなども全てインストールされます。

## 参考記事

https://github.com/emotion-js/emotion/issues/1673

https://s8a.jp/create-react-app-use-npm
npm linkの使い方

# 概要
自作パッケージを試す際に便利な `npm link` というコマンドがあることを知りました。[公式ドキュメント](https://docs.npmjs.com/cli/v7/commands/npm-link)等を読んでも使い方が分かりにくかったのですが、試してみると簡単でとても便利だったため、その使い方をまとめます。

# 前提
`npm link` は例えば次のような状況に使えます。

- 以下の2つのプロジェクトを開発している
  - UIライブラリ
  - そのUIライブラリをnpmから利用するWebアプリ
- UIライブラリを修正したあと、webアプリ側で修正内容を確認したい

通常はライブラリを `npm publish` してアプリ側で新しいバージョンをインストールしなければ確認できませんが、 `npm link` を使えば、即座にUIの変更をアプリ側に反映することができます。

例として、以下のような構成とします。

- UIライブラリのディレクトリは `/ui-library` で、公開しているパッケージ名は `@my/ui-library` のようにスコープを持つ（package.jsonで指定）
- Webアプリのディレクトリは `/web-app`

# リンクの作成
## 参照されるパッケージ側
プロジェクトのディレクトリ `/ui-library` で下記のコマンドを実行

```
npm link
```

これにより、以下のようにシンボリックリンクが作られます。

```
/Users/<user>/.anyenv/envs/nodenv/versions/14.16.1/lib/node_modules/@my/ui-library
-> /Users/<user>/Desktop/ui-library
```
リンクはグローバルなパッケージがインストールされる場所（この例の場合はanyenvのnodenv配下）に作られます。

## パッケージ使用側
プロジェクトのディレクトリ `/web-app` で下記のコマンドを実行

```
npm link @my/ui-library
```
※ ディレクトリ名ではなくパッケージ名を指定することに注意

これにより、以下のようにシンボリックリンクが作られます。

```
/Users/<user>/Desktop/web-app/node_modules/@my/ui-library
-> /Users/<user>/.anyenv/envs/nodenv/versions/14.16.1/lib/node_modules/@my/ui-library
-> /Users/<user>/Desktop/ui-library
```

## 使用例
Webアプリ側で下記のようにUIをimportしている時、UI側の開発環境での最新のビルド結果が常に反映されるようになります。

```js
import UILibrary from '@my/ui-library'
```

# リンクの解除
## パッケージ使用側
### 新しいバージョンのパッケージを利用したい場合
例えばUI側の修正を `npm publish` した後、実際に公開されたパッケージを利用してアプリで動作確認したいときは以下のコマンドを実行します。（通常のインストールと同じです）

```
npm i @my/ui-library@バージョン
```

### すでにインストールされているパッケージに戻したい場合
下記コマンドで、リンクではなく元々のパッケージを利用するように戻ります。

```
npm i
```

### パッケージをアンインストールしたい場合
通常のパッケージと同じように下記コマンドでリンクを解除することができます。

```
npm uninstall @my/ui-library
```

（[uninstall](https://docs.npmjs.com/cli/v7/commands/npm-uninstall)のエイリアスであるremove, rm, r, un, unlinkのいずれでも大丈夫です。）

## 参照されるパッケージ側
利用側で解除した上で、グローバルにインストールされたパッケージのリンク自体を消したい場合は下記コマンドを実行します。

```
npm uninstall -g @my/ui-library
```

# バグ？（2021/04/19追記）
上記方法でリンクを解除した際、パッケージ側のnode_modulesの中身が一部変わってしまうことが確認されました（`npm i` でインストールしなおせば戻りました）。
また、webpackのexternalの関係なのか、リンクを利用するアプリ側で明らかに通常のimport時と挙動が変わってしまっている部分がありました。

後者は無視できない問題なので、原因を探りたいところです。

# 参考
npm 公式ドキュメント

https://docs.npmjs.com/cli/v7/commands/npm-link

https://docs.npmjs.com/cli/v7/commands/npm-uninstall
形式的冪級数のライブラリをありがたく使ってAtcoderの問題を解く(つづき)

## 概要
感謝の続きです


## ABC159 F - Knapsack for All Segment
どういうDPを書いたらいいのかわからん...

https://atcoder.jp/contests/abc159/tasks/abc159_f

### 概要
$A_1$, $A_2$, $\ldots$, $A_N$ に含まれる全ての区間について考える。

それぞれの区間$[L_i, R_i]$について、
$$A_{x_1} + A_{x_2} + ... + A_{x_k} = S$$
を満たす$L_i \leq x_1 \leq x_2 \leq ...\leq x_k \leq R_i $な$x_i$の組みの数を数えて、その和を求めよ。

### 立式
 (難しいので後で書く)



### 提出
この計算が難しい。これは覚えておきたい。

https://atcoder.jp/contests/abc159/submissions/21515541


## ABC169 F - Knapsack for All Subsets
どういうDPを書いたらいいのかわからん...

https://atcoder.jp/contests/abc169/tasks/abc169_f

### 概要
$A_1$, $A_2$, $\ldots$, $A_N$ の全ての部分集合$2^N -1$通りについて考える。

それぞれの部分集合について、
$$A_{x_1} + A_{x_2} + ... + A_{x_k} = S$$
を満たす$x_1, x_2, ..., x_k$の組の数を数えて、その和を求めよ。

### 立式
$f_i = (1 + T^{A_i})$として、$f_i$について考えるかどうか、$2^N$通りある、ですね。


$$ F = (1+f_1)(1+f_2)...(1+f_N) = (2 + T^{A_1})(2 + T^{A_2})...(2+T^{A_N}) $$

の、$T^{S}$の係数が答え。

### 提出
書いてみると簡単。

https://atcoder.jp/contests/abc169/submissions/21511726


## ABC171 F - Strivore
コンテストで見た時は手も足も出なかった...

https://atcoder.jp/contests/abc171/tasks/abc171_f

### 概要、立式
maspyさんの素晴らしい解説があるので省略。

https://maspypy.com/atcoder-%E5%8F%82%E5%8A%A0%E6%84%9F%E6%83%B3-2020-06-21abc-17

$-K$乗の形はよく出てきます。↓で効率的に計算できます。すごい。

https://maspypy.com/%E5%A4%9A%E9%A0%85%E5%BC%8F%E3%83%BB%E5%BD%A2%E5%BC%8F%E7%9A%84%E3%81%B9%E3%81%8D%E7%B4%9A%E6%95%B0%EF%BC%88%EF%BC%93%EF%BC%89%E7%B7%9A%E5%BD%A2%E6%BC%B8%E5%8C%96%E5%BC%8F%E3%81%A8%E5%BD%A2%E5%BC%8F#toc4

### 提出
F問題が7行くらいで解けました。嬉しい。

https://atcoder.jp/contests/abc171/submissions/21498594



## まとめ

解けたら追記していく
Excelショートカットの対照表（Win, Mac）

Windows版とMac版のExcelショートカットをひとつの表にしました。


|操作|Windows|Mac|
|:--------:|:------------|:------------|
|上書き保存|Ctrl + S|Command + S|
|元に戻す|Ctrl + Z|Command + Z|
|コピー|Ctrl + C|Command + C|
|切取り|Ctrl + X|Command + X|
|貼付け|Ctrl + V|Command + V|
|形式を選択して貼付け|Ctrl + Alt + V|Command + Option + V|
|入力の取消|Esc|esc|
|終端に移動|Ctrl + 方向キー|Command + 方向キー|
|終端まで選択|Ctrl + Shift + 方向キー|Command + Shift + 方向キー|
|選択範囲を拡張|Shift + 方向キー|Shift + 方向キー|
|セルを編集|F2|F2|
|選択セルへ一括入力|Ctrl + Enter|Command + Enter|
|セル内改行|Alt + Enter|Option + Enter|
|セルの書式設定|Ctrl + 1|Command + 1|
|オートSUM|Alt + =|Command + Shift + T|
|行全体を選択|Shift + Space|Shift + Space|
|列全体を選択|Ctrl + Space|          |
|検索|Ctrl + F|Control + F|
|置換|  |Control + H|
|右方向へコピー|Ctrl + R|        |
|下方向へコピー|Ctrl + D|          |
|直前操作の繰返し|F4|F4|
【Python】スペース区切りのコマンドライン引数をint型でリスト化

## スペース区切りのコマンドライン引数をint型にしてリスト化する
競技プログラミングなどで割と使うことが多いので、個人的な備忘録。

```python:入力例1
1 2 3 4 5
```
これをint型でリストに入れたい。

```python:sample.py
int_list = list(int(x) for x in input().split())
```
**※頂いたコメントを参考にmapを使った方法を追記します。↓**

```python:sample.py
int_list = [*map(int, input().split())]
```


```python:sample.py
int_list = list(map(int, input().split()))
```
出力結果↓

```python:sampleの結果
print(int_list)
# [1, 2, 3, 4, 5]
```

## おまけ
### 文字列のままリストに入れる

```python:sample1.py
str_list = input().split()
```

### リストにしないでint型で変数にアンパック
```python:sample2.py
a, b, c, d, e = (int(x) for x in input().split())
```

**※こちらもmapを使った方法を追記↓**

```python:sample3.py
a, b, c, d, e = map(int, input().split())
```
形式的冪級数のライブラリをありがたく使ってAtcoderの問題を解く



# 概要
競技プログラミングの強そうな人が使っている印象がある「形式的冪級数」。よくわかりませんが、名前がかっこいいので使ってみたいです。

形式的冪級数を使うにあたって、大変素晴らしいライブラリも公開していただけています。感謝しながら使っていきます。optさんありがとう。

https://opt-cp.com/fps-implementation


問題リストもあります。すごい。これを参考にして形式的冪級数を使って問題を解きながら、理解を深めていこうと思います。

https://opt-cp.com/fps-problem-list

問題リストをAtcoder-problemsのVirtual contestに登録してみました。コンテストは2030年に終了しますので、それまでに頑張りましょう。

https://kenkoooo.com/atcoder/#/contest/show/ec28e88c-2bdf-468e-be30-ab0e599abcd7

# 本題
急に問題を見ても立式できないことが多かったので、以降にメモを残していきます。

# 各問題のメモ
## TDPC-A コンテスト
準備運動。
https://atcoder.jp/contests/tdpc/tasks/tdpc_contest

### 概要
$N (\leq 100)$問ある問題の$i$番目は$p_i(\leq 100)$点。合計得点は何通りか。

### 立式
合計$k$点として、$T^k$の係数が非ゼロな$k$の個数を数えればいいです。

```math
f(T) = (1 + T^{p_1})(1+T^{p_2})\ldots(1+T^{p_N})
```
↑を展開して、係数が非ゼロの個数を数えます。

### 提出
これは簡単。

https://atcoder.jp/contests/tdpc/submissions/21434993

## EDPC-M - Candies 

これも準備運動。

### 概要
$N (\leq 100)$人に飴$K (\leq 10^5)$個を配る。$i$番目の人には$0\sim a_i$個配る。配り方は何通りか？

### 立式
$i$番目の人への配り方は、↓の多項式$f_i$に対応させます。

```math
f_i = 1 + T + T^2 + ... + T^{a_i} = \frac{1 - T^{a_i + 1}}{1 - T}
```

全員分を掛け算した$F = f_1 f_2 f_3 \ldots f_N $ の、$T^{K}$の係数が答えです。

### 提出

https://atcoder.jp/contests/dp/submissions/21432978

## TDPC F-準急
これ、DPでも解きたいのですが、頭が混乱します。

https://atcoder.jp/contests/tdpc/tasks/tdpc_semiexp

### 概要、立式
optさんが書いてくれているので省略。賢い。

https://opt-cp.com/fps-problem-list

### 提出
スッキリです。

https://atcoder.jp/contests/tdpc/submissions/21395040

## ABC179 D - Leaping Tak
DP+imos法で、区間更新的なことをする問題だった気がします。
https://atcoder.jp/contests/abc179/tasks/abc179_d

### 概要
1マス目から$N(\leq 2 \times 10^5)$マス目まで進む。

1回の移動の際には、K個の区間 $[L_1, R_1]$, $[L_2, R_2]$, $\ldots$, $[L_K, R_K]$から1つ数字を選び、その数だけ進む。$N$マス目までの進み方は何通り？

### 立式

1回の移動を、↓の多項式$f$に対応させます。$[L_i, R_i]$の次数の項で、係数を1にします。

```math
\begin{align}
f &= T^{L_1} + T^{L_1+1} + ... + T^{R_1}\\ 
 &+ T^{L_2} + T^{L_2+1} + ... + T^{R_2} \\
 &+ ... \\
 &+ T^{L_K} + T^{L_K + 1} + ... + T^{R_K} 
\end{align}
```

何回か移動するので、それを表す多項式$F$は↓。

```math
F = 1 + f + f^2 + ... = \frac{1}{1-f}
```

$N-1$マス進むので、↑の$T^{N-1}$の係数が答えです。簡単に表現できて嬉しい。

元の問題には$K\leq 10$という制約がありますが、この解き方だと不要ですね。すごい。

### 提出
10行くらい。助かります。

https://atcoder.jp/contests/abc179/submissions/21495511


## ABC178 D - Redistribution
高校受験でよくやる、ボールと仕切りで考える問題ですよね。

https://atcoder.jp/contests/abc178/tasks/abc178_d

### 概要
全ての項が3以上の整数である数列であって、その総和が Sであるような数列は、何通りあるか？($10^9+7$で割った余り)

### 立式
慣れてきました。1つの項に対応する多項式は、↓。

```math
f = T^3 + T^4 + ... = T^3 ( 1 + T + ...) = \frac{T^3}{1-T}
```

$f$, $f^2$, $f^3$, ... の、$T^S$の係数の和が答えになるので、まとめて考えればいいです。

```math 
F = f + f^2 + f^3 + ... = \frac{f}{1-f}
```

$T^S$の係数が答え。

### 提出
7行くらい。

https://atcoder.jp/contests/abc178/submissions/21497929


# まとめ
DPを書いてバグらせて時間が溶ける...のが悲しいので、形式的冪級数でシュッと解いていきたいですね！

感謝を込めてもう一度リンクを貼ります。ありがとうございました

https://opt-cp.com/fps-implementation

つづき：

https://qiita.com/gg_hatano/items/ad1c45ba7dd1021277be
Effective Java(第3版) 項目3 privateコンストラクタかenum型でシングルトンを強制する

シングルトンを実装する方法としては、privateコンストラクタを使用するか、enumを使用するというものです。

# 記載内容
## enumによるシングルトン
特に理由が無ければ、シングルトンを実装したい場合、単一要素のenum型を使用すれば良い。
ただし、何らかの親クラスを拡張したい場合は、enumは使えない。
(インタフェースを実装することはできる)

## privateコンストラクタによるシングルトン
enum型で実装しない場合はこちらを使用することになる。
この場合、方法は大きく二つに分かれる

+ public static finalフィールドにインスタンスを保持する
+ ファクトリメソッドにより単一インスタンスを返す

前者の方がシンプルであり、シングルトンであることが明示的である。

後者のメリットは、シングルトンかどうかを後から変更できることと、
ファクトリメソッドをSuuplier<?>として使えること。
この2つのメリットが重要でなければフィールドで保持すればよい。

シングルトンクラスをSerializableにしたい場合、privateコンストラクタによる方法では、
readResolveの実装が必要いなる。

# 考察
そもそも、シングルトンパターンが良いか、という問題がありますが、
シングルトンを採用するのであれば、この項目の記載に従うのが良いです。

あまり見かけないかもしれないが、特に理由が無ければ、enum型で実装してしまうのが良いと思われます。

ファクトリメソッドのメリットとして、Supplier<?>での使用について記載されていますが、
フィールドで保持する場合でも(enumの要素でも)、

```Java
() -> Singleton.INSTANCE
```

とすれば良いだけなので、ファクトリメソッドのメリットとしてはあまり強くないと思います。
どちらかと言えば、ファクトリメソッド化することで、遅延初期化等、実装の詳細を隠ぺいできることが大きいです。
(遅延初期化も乱用するべきではないと思いますが)
Flutterでカスタムアイコンを使う方法

#はじめに

Flutterでアイコンを利用するときは既存の`Icon`を使って以下のように表示しますよね🧐

```dart
const Icon(Icons.home);
```

しかし既存のアイコンでは表現できない時や何かもの足りない時があるかと思います。
svgファイルをインポートして一個一個 [flutter_svg](https://pub.dev/packages/flutter_svg)を使って表示するのも面倒なのでカスタムアイコンをいい感じにFlutterで導入できる方法をご紹介します🙌

#やり方

[FlutterIcon.com](https://www.fluttericon.com/)というサイトを使って実装して行きます。

こんな感じのサイトです。
![スクリーンショット 2021-04-17 19.35.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/551776/ca91f589-99a6-b67f-29ad-157c89f9b4d2.png)


このサイトでは自分でインポートしたSVGはもちろん、MaterialIconを含め色々なアイコンを自分で選びDartで使える形でダウンロードすることが可能です。

### 1. アイコンを選ぶ

まずは使いたいアイコンを選んでいきます。FlutterIconのサイトに既存であるものはクリック、自分で用意したsvg形式のアイコンはサイト上部にドラッグしてクリックすることで選択することが可能です。

### 2. ダウンロード

使いたいアイコンが選択できたら、ダウンロードをして行きます。
サイトの右上にテキストフィールドとDownloadボタンがあるので、テキストフィールドにアイコンセットのタイトルを設定（初期値はMyFlutterApp）してDownloadボタンを押してダウンロードします。

ダウンロードしたファイルを解凍すると以下のようなファイルが入っています。fontsフォルダの中にはttf形式のファイルがあります。

![スクリーンショット 2021-04-17 19.40.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/551776/6aa010b5-9f9e-232a-e3f2-be61ba133633.png)

### 3. プロジェクトへ設置

ダウンロードしたファイルをインポートしていくことでflutterプロジェクト内で選択したカスタムのアイコンが利用できるようになります！


assetsフォルダにttfファイルを設置して`pubspec.yaml`に以下のように書くことでアイコンセットをインポートできます。

```yaml
  assets:
    - assets/ #assetsフォルダ以下を読み込む

  fonts:
    - family: MyFlutterApp #アイコンセットのタイトル
      fonts:
        - asset: assets/MyFlutterApp.ttf #設置したファイル
```

### 4. インポートしたアイコンを使う

まずは、ダウンロードしたフォルダ内にあるdartファイルを設置して行きましょう！
dartファイルには以下のように`IconData`が定義されているクラスがあります。

```dart
import 'package:flutter/widgets.dart';

class MyFlutterApp {
  MyFlutterApp._();

  static const _kFontFam = 'MyFlutterApp';
  static const String _kFontPkg = null;

  static const IconData insert_link = IconData(0xe800, fontFamily: _kFontFam, fontPackage: _kFontPkg);
  static const IconData insert_photo = IconData(0xe801, fontFamily: _kFontFam, fontPackage: _kFontPkg);
  static const IconData alexandergreat = IconData(0xf058, fontFamily: _kFontFam, fontPackage: _kFontPkg);
}

```

あとはこれを好きな場所で呼び出してあげるだけでアイコンが利用できるようになります🙌
簡単！

```dart
  @override
  Widget build(BuildContext context) {
    return Center(
      child: Icon(MyFlutterApp.alexandergreat),
    );
  }
```


これでカスタムしたアイコンが表示できるようになりました！
（画面のアイコンは拾ったsvg）
![スクリーンショット 2021-04-18 1.44.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/551776/7d1a2d15-169b-67cf-6bbd-216b1fe25f2d.png)



#最後に

今回はFlutterで簡単にカスタムしたアイコンを表示する方法を紹介しました😀
よりアプリの表現に幅を広げたい場合は使ってみてはいかがでしょうか？
[freesvg.org](https://freesvg.org/)のようなサイトでいろんなsvgファイルがダウンロードできるので使ってみるのも面白いかもしれません🙌

また[Twitter](https://twitter.com/tomoDev_)の方でもFlutterの情報も発信していくのでよろしければフォローお願いします！
暗号化技術 - 共通鍵暗号方式 ＆ 公開鍵暗号方式 - 

# 目的
- 暗号化技術の理解がうっすらなので、復習がてらまとめ直し
- まずは、共通鍵方式、公開鍵方式辺りをまとめなおしています

## 共通鍵暗号方式
- 暗号化鍵と復号鍵が同一である方式
- 画像のように、受信者と送信者の間で共通の秘密鍵でデータを暗号化/復号化する
- 第三者に知られることなく、安全に通信相手に鍵を配布する必要がある
- 通信相手ごとに鍵を作成する必要があり、管理が煩雑となる
- 暗号化や復号の処理にかかる負担が小さく、公開鍵暗号方式に比べて処理が速い
- 代表的なものとして、DES、AESがある。

![スクリーンショット 2021-04-18 12.54.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/336993/919a93c1-3403-f7b5-b3df-8f1946f969be.png)

## 公開鍵暗号方式
- 暗号化鍵と復号鍵が異なる暗号方式
- 送信者が受信者の公開鍵で暗号化、受信者は対の「受信者の秘密鍵」で復号する
  - 復号は受信者の秘密鍵でしか行えない。
- 共通鍵暗号方式と違い鍵の配布、管理が容易
    - メールで送付したり、Webで公開したり、PKIを利用して配布したりすれば良い
- ただし、暗号化や復号化の処理にかかる負担が大きいため、共通鍵暗号方式と比べて処理が遅い
- 代表例は RSA、楕円曲線暗号が存在する

![スクリーンショット 2021-04-18 12.54.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/336993/d448b7ef-e7b9-b227-9614-2282b3ec7292.png)

- 次はディジタル署名〜SSLまでをまとめられたらと思っています

## 参考
- マスタリングTCP/IP　入門編（第6版）
https://www.amazon.co.jp/dp/B0827QNDNT/ref=cm_sw_r_tw_dp_Q0VB1TJ7JTG8MRZP0226

- 令和03年 イメージ＆クレバー方式でよくわかる 栢木先生の基本情報技術者教室 情報処理技術者試験 
https://www.amazon.co.jp/dp/B0821W2G51/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1
【Python Tips】特定の文字列を削除するstr.translate

## 1.はじめに
文字列内の文字を変換したり削除したりしたい時に便利なPython3の関数があります。
それが[str.traslate()](https://docs.python.org/ja/3/library/stdtypes.html#str.translate)です。

str.translate()は**変換テーブルを使って文字列を変換する関数**です。

## 2.例題

例えば、ネット将棋の棋譜データは消費時間や手数などのノイズがついているため、ブログに載せる時には削除する必要があります。

これを全て手作業で消すのは大変なので、これをプログラムで削除します。

### 削除前のデータ
```
1 ７六歩(77)   ( 0:03/00:00:03)
2 ３四歩(33)   ( 0:06/00:00:06)
3 ２六歩(27)   ( 0:04/00:00:07)
4 ４四歩(43)   ( 0:10/00:00:16)
```

### 削除後のデータ
```
７六歩     ３四歩     ２六歩     ４四歩
```    

きれいになりました。

## 3.コードを見てみましょう

1行目はtableという変数にstr.maketransという関数を代入します。
2行目は:(カンマ)の左側に変換前の文字(この場合は"(")
　　　 :(カンマ)の右側に変換後の文字(この場合は"空白")を設定します。

そして変換した文字を入れ切ったら
変数にresultにtext.translate()関数を代入し、引数をtableとします。

```python:str_translete.py
table = str.maketrans({
    '(': '',　　#　(を空白に変換
    ')': '',　　#　)を空白に変換
    ':': '',　　#　:を空白に変換
    '1': '',   #  以下割愛
    '2': '',
    '3': '',
    '4': '',
    '5': '',
    '6': '',
    '7': '',
    '8': '',
    '9': '',
    '0': '',
    '/': '',
})
result = text.translate(table)
result
```

## 4.まとめ

サンプルコードは[Google Colaboratory](https://colab.research.google.com/drive/1XlsAY5NUB9zH4cuK3_Ril6sEcPjuHonb?usp=sharing)に載せました。

## 5.参考URL

[文字の変換にはstr.translate()が便利]
(https://qiita.com/tag1216/items/df6c93bdb823dd48af6c)
サーバーに保存のないActiveHashデータどう保存させる？


結論：モデルに書いた「Category.rb」というファイルがテーブルの代わりになります。
-

結論２：カラム名は以下示したものになります（カラムは２列です）

```rb:app/models/delivery_fee_payment.rb
class DeliveryFeePayment < ActiveHash::Base
  self.data = [
    { id: 1, delivery_fee_payment_id: '--' },
    { id: 2, delivery_fee_payment_id: '着払い（購入者負担）' },
    { id: 3, delivery_fee_payment_id: '送料込み（出品者負担）' }
  ]
    include ActiveHash::Associations
    has_many :items
  end
```

1,2,3と数字のある左横のidが１列目カラム名
’ーー’'着払い（購入者負担）''送料込み（出品者負担）'の左横delivery_fee_payment_idが２列目カラム名

設定方法：「インスタンス変数（もしくはブロック変数など）＋ActiveHash設定モデルファイル名」

①@item.delivery_fee_payment
②item.delivery_fee_payment

以下の情報が取得できます。

```rb
>> item.delivery_fee_payment
=> #<DeliveryFeePayment:0x00007f9d9ab436a8 @attributes={:id=>2, :delivery_fee_payment_id=>"着払い（購入者負担）"}>
```

結果
-

設定方法：「インスタンス変数（もしくはブロック変数など）＋ActiveHash設定モデルファイル名」+
「モデルのカラム名」

①@item.delivery_fee_payment.delivery_fee_payment_id
②item.delivery_fee_payment.delivery_fee_payment_id

```rb
=> #<DeliveryFeePayment:0x00007f9d9ab436a8 @attributes={:delivery_fee_payment_id=>"着払い（購入者負担）"
```

ここで私は取得できなかった問題点がありました
-

モデルのitem.rbのアソシエーションで以下のように組んでいました、

```rb:app/models/item.rb
  belongs_to :category, :status, :prefecture, :delivery_fee_payment, :delivery_prepare
```

```rb:app/models/item.rb
  belongs_to :category
  belongs_to :status
  belongs_to :prefecture
  belongs_to :delivery_fee_payment
  belongs_to :delivery_prepare
```

つなげることはできないんですね。

ここを直すと通りました。
ROS rviz 視点をターゲットに合わせる

## はじめに
rvizで点群などを表示したとき、カメラの回り込み中心は原点位置なので、点群に視点を合わせるのが難しく不便だと感じることがあります。
ここではカメラが回り込む中心をターゲットの点群位置に合わせて点群の観察をしやすくする方法を説明します。

## ターゲットに視点を合わせる
rvizの視点移動方法はでファルトでOrbitが設定されていて
```指定した地点を中心に、回り込んで表示```する機能を持ちます。その指定した位置は```Focal Point```として定義されており次のいずれかの方法で移動することができます。

- Shift + left clickをしながらマウスを移動する
- Focal Pointのx,y,zを直接設定する

![Screenshot from 2021-04-18 12-08-53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/589906/85c31ef4-5d9c-965b-3363-6393ca709cbc.png)

上記いずれかの方法でFocal Pointの位置を移動させます。

![Screenshot from 2021-04-18 12-09-09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/589906/feb3ac5e-680a-8941-b4fc-c7ab4a5089d5.png)

これで、この点群を中心にカメラの回り込みや拡大縮小などが行えるようになり、ターゲットの点群観察がしやすくなります。
HomebrewによるMySQLのpostinstall&mysql.server startが出来なくて苦労した件

# HomebrewでMySQLをinstallしたらwarningが出てその後のmysql.server startも出来なかった件

解決するのに２週間かかりました。ので、記録します。

## 前置き　※今回のエラーは後述します。
おそらく、MySQLのエラーで``mysql.server start``を実行して

```
ERROR! The server quit without updating PID file (/usr/local/var/mysql/ユーザー名.pid).
```

のエラーが出ることが多いかと思います。
で、この内容に関する記事もネット上に山ほどあって

・mysqlの再インストール
・pathの見直し
・Homebrew自体をbrewdoctorして問題を解消
・my.cnfファイルの内容の見直し
・パーミッションの確認
etc...沢山試しましたが私の場合解決しませんでした。

##今回のエラー　The post-install step did not complete successfully …よく見るとinstallの時点でwarningが出ていた。
それがこちら

```
Warning: The post-install step did not complete successfully
You can try again using:
  brew postinstall mysql
```

訳するとインストール後のステップがちゃんと行われませんデシタ　的な？
とりあえず指示通り

``brew postinstall mysql``をしてみたが、症状変わらず…。

``postinstall``は**/usr/local/var/mysqlディレクトリを作成してデータベースを作成する**はずらしいのですが、
私の場合mysqlディレクトリすら存在しませんでした。

なにかPATHがおかしいのかな？
でも、MySQLのPATHは**.zshrc**に記載したハズだし…。

と途方にくれていました。

# 解決　.bash_profileに(多分過去に自分で設定してた)PATHがあるのを発見して削除したら上手く行った


**.bash_profile**　にMySQLに関するPATHが３つほどありました。そりゃ、インストールうまくいきませんよね。
削除したらWarninguも消えてMySQLもstartできました！！

※PATHの削除の仕方が分からない方へ
普通にファイルをテキストエディタで開くか、viコマンドで編集出来ます。
viコマンドは難しいので「vi　使い方」などでググると方法がでてきます。
https://prev.net-newbie.com/linux/commands/vi.html
PATHもしっかり通し直す必要があるので「XXX　のPATH　通し方」等々で調べれば出るかと思います。




# 経緯　

色々試していくうちにPostgreSQLもreinstallしてみたら同様のWarningが発生したので
https://qiita.com/ipepi/items/58dedbc0434fa9ea3b71
を参考に再設定していたら、**.bash_profile**の設定時に…「あれ？ここにMySQLのPATH通したっけ？」となり
削除したら無事warningも消えmysqlにログインできました😭

MySQLのPATHの事は**.zshrc**にだけ焦点が向いており焦点でした。


原因は2.3ヶ月前のなにも分からない時にMySQLとPostgreSQLのインストールを行っており
その際に何個もPATHを通したままにしてしまった事かと思います。

いやぁ、本当に未熟でした。反省

# 結論　PATHもちゃんと見直そう　２箇所あるかも？　

PATHは記事や教材によって　**.zshrc** と　**.bash_profile**　に通す場合と分かれているので
両者注意していきたいですね。

下記記事参考になります
https://qiita.com/k3ntar0/items/eb8cdbd8eba9da388def

　 

##
jqueryの$.postを使用して非同期通信を行う（フレームワーク：codeigniter)

<h1>ページ遷移をせずにテキスト内の数字を足し算して計算結果を表示させます</h1>

<h1>htmlの部分</h1>

``` messages_test.php
<p>$.postで足し算の結果を表示させる</p>
<p>計算</p>
<input type="text" name="textname1" id="textname1" size="20">
<p>＋</p>
<input type="text" name="textname2" id="textname2" size="20" >
<button id="btn-a" type="button">計算</button>
//以下のコードに計算結果を表示させます
<p id="sum"></p>
``` 
・ テキストを２つ用意させ、それぞれにidを付けます。
・buttonのtypeは今回非同期通信の為、submitではなくbuttonを使用。(submitだと画面遷移してしまう為）
```<p id="sum"></p> ```のコードが計算結果を表示させるコードです。idを付けてあげると分かりやすいです。

<h1>jqueryの部分</h1>

``` messages_test.php
//$.postで足し算の結果を表示させる。
$(function sum(){
	$("#btn-a").click(function() {
		$.post("/messages/test1",{textname1:$("#textname1").val(),textname2:$("#textname2").val()},function(data){
			$("#sum").html(data);
		});
	});
});
```
・ jqueryのpostの基本文法は「$.post(送信先URL,{送信データ},function(data){　　
   　　　　　　　　　　　　　//何らかの処理   });

・```"/messages/test1" 　```　が送信先URL。
　```{textname1:$("#textname1").val(),textname2:$("#textname2").val()}```が送信データとなります。
・```$("#sum").html(data);```　はhtml部分に記述した```<p id="sum"></p> ```に計算結果を表示させる処理を行います。

<h1>controllerの部分</h1>

```controllers/messages.php
function test1(){ 
  $textname1 = $this->input->post("textname1");
  $textname2 = $this->input->post("textname2");
  $data = $textname1 + $textname2;
  print $data;
}
```
・controllersには受け取った値を足し算して合計値を表示させる処理を行います。
・```$this->input->post("textname1");```、```$this->input->post("textname2");```にはテキストに入力した値が入っており、その値を変数に代入しております。
・変数に代入した値を足し算して変数($data)に入れ、printで表示させております。

<h1>画像</h1>
![スクリーンショット 2021-04-18 12.21.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1339415/b530af9c-4409-aa9b-ece7-464e4af6932e.png)

・画像の通り、4+5と記述して、「計算」ボタンを押すと合計値の「９」が表示されます。

以上が基本的なjqueryの$.postで非同期通信を行う方法です。
python isdigit メソッドについて

## 初めに
初学者です。間違った表現などありましたら、ご指摘お願いします。

###isdigitメソッド
`isdigitメソッド`とは`文字列の中身は数値かどうかを判定`してtrue(真)、false(偽)で返すメソッドになります。

```python
>>>'1'.isdigit()
True
```

```python
>>>'a'.isdigit()
Flase
```

上記のように数値の場合は`True`、数値以外の場合は`False`を返します。

簡単なメソッドですが、何点か注意点があります。
1.小数点がついた数値は`False`を返します。
2.`-１`などの負の数も`False`を返します。
3.`1a`のように数値と文字列が一緒の場合も`False`を返します。
要するに`正の数の整数`の場合のみ`True`を返すことになります。

###isdigitメソッドを使った例文
では簡単な例文を書いていきます。

```python
num = input('数値を入力せよ')
print(num. isdigit())
```

上記の例文ではinput関数を使用して数値を入力してもらっています。そして入力してもらった値を数値かどうか判定しています。詳しく書くと、、
1行目〜`文字列数値を入力せよ`を表示して値を入力させ、変数numと紐付けろ。
2行目~変数numは数値のみかどうか判定して表示せよ
入力した文字列が数値の場合は`True`、それ以外の場合は`False`を返します。
LeetCode日本語修行5日目- [26- 並べ替えられた配列から重複の値を取り除く III]

##Remove Duplicates from Sorted Array
#####参考：https://leetcode.com/problems/remove-duplicates-from-sorted-array/
###問題の内容
並べ替えられた配列numsが与えられたとき，各要素が一度だけ現れる，重複をその場で除去し，新しい長さを返す。
別の配列のための空間を使わない．入力配列をその場でO(1)の余分なメモリを使って修正する．
###例：
例1:
Input: nums = [1,1,2]
Output: 2, nums = [1,2]
numsの中に重複をその場で除去した後、最初の2つの要素が1と2です、length = 2を返す必要があります。返されたlengthの先に何を残すかは問題ではありません。

例2:
Input: nums = [0,0,1,1,1,2,2,3,3,4]
Output: 5, nums = [0,1,2,3,4]
###ヒント:
0 <= nums.length <= 3 * 104
-104 <= nums[i] <= 104
nums is sorted in ascending order.

---
日曜日に合わせて、簡単な問題で良かった...

```Kotlin
class Solution {
    fun removeDuplicates(nums: IntArray): Int {
        if(nums.size == 1){
            return 1
        }
        var a = 0
        for(i in 1 until nums.size){   
            if(nums[i] != nums[a]){
                nums[++a] = nums[i]
            } else{
                continue
            }
        }
        return a+1
    }
}
```
最後の``return a+1``気をつけてください