OmniAICreator/Qiita-1.07M huggingface dataset:
GitHub Actionsで「No version of NDK matched the requested version 20.0.5594570. Versions available locally: 21.0.6113669」というエラーが出た時に…

# CIでエラー
GitHub ActionsでAndroidアプリのビルドをしようとしたら「 `No version of NDK matched the requested version 20.0.5594570. Versions available locally: 21.0.6113669` 」というエラーが出てCIが失敗するようになってしまいました。

# 対策
`app/build.gradle` に下記の通り `ndkVersion` を指定してあげることで、エラーが出ずにビルドが通るようになりました。

```
android {
・・・略・・・

    ndkVersion "21.0.6113669"
}
```

# 参考
https://stackoverflow.com/questions/60404457/android-no-version-of-ndk-matched-the-requested-version
Excelでセルへの入力行為に期限を設定する

# Excelでセルへの入力行為に期限を設定する
## 動機

* (他人に入力させるための)Excelファイルで、入力期限が過ぎたセルに入力できないようにしたい。
* ファイル単位であればファイルに提出期限を設けたり、期限後に書き込み権限を停止したりして解決するところだが、ネットワーク共有する単一ファイル内に入力期限の異なるセルが複数存在するという想定。
* 検索しても、入力できる日付の値を所定期間内に制限する話や、期限を過ぎたセルの色を変える話しか出てこなかった。
* 他人に触らせる以上、絶対に入力させないというのは不可能なので、期限切れに気づかずに自然に入力できてしまうのを防止できればよい。

## 環境

* Windows 10
* Microsoft Excel 2013
* 多分、他のExcelでもいけるはず。

## 方法
「データの入力規則」を使う。

### 手順1
入力期限を設定したいセルを選択して「データ」タブの「データ入力規則」を選ぶ。
![リボンの「データ」タブ](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/602526/761b1eb9-0532-cc17-b36e-b2f5bde55514.png)

### 手順2
「入力値の種類」は「ユーザー設定」にする。
![データ入力規則の設定タブ](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/602526/c12d10f5-7084-7c72-9898-0dc91a45a75a.png)

### 手順3
「数式」の欄を`=NOW()<DATE(年,月,日)+TIME(時,分,秒)`にして期限を設定する。
![=NOW()<DATE(2020,3,15)+TIME(9,0,0)](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/602526/256feca8-9a5a-fa88-6533-cd4b55ceaac1.png)

### 手順4
必要に応じて「エラーメッセージ」タブも設定する。「スタイル」を「注意」「情報」に設定すればユーザーが入力を強行できる。「スタイル」を「停止」にすると入力を禁止できるが、後述のように完璧に禁止できるわけではないことに注意。
![入力期限を過ぎています。入力は強行できますが、担当者は対応いたしません。](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/602526/e6aa8de0-aed6-d4d6-51ba-218e65157354.png)

## 結果
設定した期限までは問題なく入力できる。

期限を過ぎてから入力しようとするとメッセージが表示される。
![期限超過](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/602526/ae45f330-beaf-2a73-b646-5e7cdd719550.png)



設定期限前に入力したファイルを保存して、期限後に開いても特に問題は生じない。

## 考察
ブックやシートの保護(+パスワード)と組み合わせれば完成度は上がるが、ユーザーはファイルを持ち出してシステムクロックが変更された環境で入力を実行できるので完璧にはならない。

ブックの保護に加えて、ファイルを持ち出せないようにした上で、(偽装NTPサーバーに接続させるようなケースも含めて)システムクロックを変更できないようにしたりすればあるいは完全に出来るかもしれないが、当記事で扱うべき範疇を超える。

それよりは、非技術的な話だが上記の「担当者は対応しない」のようにPC外での実力行使が伴った方が実効性はあるように思う。

## 改訂履歴

* 2020/3/15: 初版
LGMTとストックの画像がしっくりこん( ;∀;)

前の方が好きでしたね。。
個人的意見ですが。

そして、それに対して"いいね"を表示させる、Chromeの拡張プラグインを作成する人たち。
技術者やなぁって感じでおもしろいです(笑)
Qiitaで他の人の記事をmarkdown記法で見る方法

#Qiitaで他の人の記事をmarkdown記法で見る方法

Qiitaの記事のソースコードをmarkdown(マークダウン)で見ることが可能
記事を見ていて、イケてる、オシャレだと思った書き方を確認するときに便利

##やり方

1. 記事右上の「・・・」をクリック
2. 「Markdownで本文を見る」をクリック


<br>
▼手順

|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563526/3297f8a1-0d0f-2a59-bd3b-29d518fd5734.png)|
|:---|

<br>
▼表示例

|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563526/254a87c1-23d9-de67-02b6-d30efe3a48ce.png)|
|:---|


同一タブ上で開かれるので、もとの記事に戻りたい場合は「戻る」
※「ctrl+U」のソースコード表示とは違う
初心者によるプログラミング学習ログ 260~262日目

#100日チャレンジの260~262日目
twitterの100日チャレンジ#タグ、#100DaysOfCode実施中です。
すでに100日超えましたが、継続。
100日チャレンジは、ぱぺまぺの中ではプログラミングに限らず継続学習のために使っています。
260~262日目は、

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">おはようございます<br>260日目<br>・自作ポートフォリオ改造<br>・cssをsassで書く練習<a href="https://twitter.com/hashtag/%E6%97%A9%E8%B5%B7%E3%81%8D%E3%83%81%E3%83%A3%E3%83%AC%E3%83%B3%E3%82%B8?src=hash&amp;ref_src=twsrc%5Etfw">#早起きチャレンジ</a><a href="https://twitter.com/hashtag/%E9%A7%86%E3%81%91%E5%87%BA%E3%81%97%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%81%A8%E7%B9%8B%E3%81%8C%E3%82%8A%E3%81%9F%E3%81%84?src=hash&amp;ref_src=twsrc%5Etfw">#駆け出しエンジニアと繋がりたい</a><a href="https://twitter.com/hashtag/100DaysOfCode?src=hash&amp;ref_src=twsrc%5Etfw">#100DaysOfCode</a></p>&mdash; ぱぺまぺ@webエンジニアを目指したい社畜 (@yudapinokio) <a href="https://twitter.com/yudapinokio/status/1237829766020882437?ref_src=twsrc%5Etfw">March 11, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> 

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">おはようございます<br>261日目<br>・自作ポートフォリオ改造<br>・cssをsassで書く練習<a href="https://twitter.com/hashtag/%E6%97%A9%E8%B5%B7%E3%81%8D%E3%83%81%E3%83%A3%E3%83%AC%E3%83%B3%E3%82%B8?src=hash&amp;ref_src=twsrc%5Etfw">#早起きチャレンジ</a><a href="https://twitter.com/hashtag/%E9%A7%86%E3%81%91%E5%87%BA%E3%81%97%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%81%A8%E7%B9%8B%E3%81%8C%E3%82%8A%E3%81%9F%E3%81%84?src=hash&amp;ref_src=twsrc%5Etfw">#駆け出しエンジニアと繋がりたい</a><a href="https://twitter.com/hashtag/100DaysOfCode?src=hash&amp;ref_src=twsrc%5Etfw">#100DaysOfCode</a></p>&mdash; ぱぺまぺ@webエンジニアを目指したい社畜 (@yudapinokio) <a href="https://twitter.com/yudapinokio/status/1238192681685147648?ref_src=twsrc%5Etfw">March 12, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> 

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">おはようございます<br>262日目<br>・自作ポートフォリオ改造<br>・cssをsassに書く練習<a href="https://twitter.com/hashtag/%E6%97%A9%E8%B5%B7%E3%81%8D%E3%83%81%E3%83%A3%E3%83%AC%E3%83%B3%E3%82%B8?src=hash&amp;ref_src=twsrc%5Etfw">#早起きチャレンジ</a><a href="https://twitter.com/hashtag/%E9%A7%86%E3%81%91%E5%87%BA%E3%81%97%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%81%A8%E7%B9%8B%E3%81%8C%E3%82%8A%E3%81%9F%E3%81%84?src=hash&amp;ref_src=twsrc%5Etfw">#駆け出しエンジニアと繋がりたい</a><a href="https://twitter.com/hashtag/100DaysOfCode?src=hash&amp;ref_src=twsrc%5Etfw">#100DaysOfCode</a></p>&mdash; ぱぺまぺ@webエンジニアを目指したい社畜 (@yudapinokio) <a href="https://twitter.com/yudapinokio/status/1238556597648908288?ref_src=twsrc%5Etfw">March 13, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
【Vim】コメントを入力した時、カーソルが勝手に文頭に移動してしまう


#問題
コメントを入力しようとしたら、勝手にカーソルが移動してインデントが消えてしまう問題です。

自分の場合はRubyファイルでしたが、

```ruby:controller/items_controller.rb
    if @row.save
      redirect_to title_path(title_id), notice: "ITEM SAVED"
    else
      redirect_to title_path(title_id), notice: "SAVE FAILED"
    end
```

こういう場合、if文内にそれぞれ`# 保存成功`と`# 保存失敗`を入れたくても、#を入力した瞬間にカーソルが移動してしまい、

```ruby:controller/items_controller.rb
    if @row.save
# 保存成功
      redirect_to title_path(title_id), notice: "ITEM SAVED"
    else
      redirect_to title_path(title_id), notice: "SAVE FAILED"
    end
```

とズレてしまいました。
ああああああああああ！！！！！！！！！！！！！！！


# 原因
Vimの設定で`filetype plugin indent off`になっていたからでした。


#確認方法
Vimファイルを開いて
`:filetype`
で確認出来ます。

filetype detection:ON plugin:ON indent:ON
↑
この3つすべてがONが良いみたいですね。

自分の場合は、3つ目のindentがOFFになっていました。


#設定方法
読み込んでいる.vimrcで、（最後あたりに書く？）

```vim:.vimrc
filetype plugin indent on
```

これで解決しました。


#雑記
最初はvim74/syntax/ruby.vimのあたりに原因があると思って、コメントを判別する行を消したりしてみました。
ただこのシンタックスは「このファイル形式だったら、こういうコードはこういう意味ですよ」という判別をしてくれてるファイルみたいですね。

問題はそのシンタックスの定義にもちゃんとインデント幅があり、それをちゃんと認識してなかったという事でした。

「vim ruby indent コメント」とかで検索しても、「コメント行の次の行までコメントアウトされてしまう！」問題ばかりがヒットして地味に見つけるのが大変だったのでまとめておきます。

以上です
PowerShellで起動時に自動でログを取得する

事前準備：[PowerShell起動時に署名付きスクリプトを実行出来るようにして、起動時のprofileに署名をする](https://qiita.com/fumi-m/items/9ea021511634020dca0c)

## 1. 起動時スクリプトを編集する

``` notepad $profile ```

## 2. スクリプト編集

```
# 自動ログ取得開始

$LogFolder =　"d:\dev\work\PSLog"
$TimeStamp   = (Get-Date -Format 'yyyyMMdd-HHmmss')
$UserInfo    = $Env:COMPUTERNAME + '-' + $Env:USERNAME
$LogFilePath = $LogFolder + '\PS_' + $TimeStamp + '_' + $UserInfo + '.log'

Start-Transcript -Path $LogFilePath -Append
```
魔法JS☆あれい 第2話「shiftはとってもunshiftって」

登場人物

丹生（にゅう）あれい
魔法少女「魔法（マジカル）JS（女子小学生）☆あれい」として活動中。

イテレー太
正体不明の魔法生物。

* [第1話「popでpushした、ような……」](https://qiita.com/8amjp/items/e44e707ccc8c95b4a40d)

## shift()

イテレー太「あれい、また説明をキレイさっぱり省略するけど、今戦闘の真っ最中だよ！」
あれい「また楽しやがったなこの駄犬」
イ「そして、話の流れ的に勘付いてるとは思うけど、今回の敵の弱点は『配列の最初の要素』だよ！」
あ「相変わらずマイペースだな。皮剥ぐぞ」
イ「さて、今回僕が魔法世界から召喚したデータは……これだよ！」

```js
items = ['へしこ', 'ソースカツ丼', '焼き鯖寿司'];
```

あ「今度は福井の名物かよ。福井駅前の居酒屋のメニューか」
イ「さあ、あれいの配列魔法で、敵の弱点である『配列の最初の要素』を`return`して倒してよ！」
あ「面倒くせえなあ……」

```js
return items.shift();
```

イ「おおっ！　やったよ、あれい！　へしこが炸裂したよ！　福井名産へしこで敵が苦しんでるよ！」
あ「だからお前黙ってろ。口縫うぞ」

### 解説

`shift()` メソッドも、配列を操作する基本的なメソッドです。
[MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/shift)によると……

> `shift()` メソッドは、配列から最初の要素を取り除き、その要素を返します。このメソッドは配列の長さを変えます。

前回の[pop()](https://qiita.com/8amjp/items/e44e707ccc8c95b4a40d)では『積み重ねられたカード』に例えましたが、今回は『タピオカ店の行列に並んでいる人達』をイメージすると良いかもしれません。つまり、`shift()` メソッドは、行列の一番前の人を呼び出すようなイメージです。これも、配列のもう一つの側面である『キュー』データ構造に対する、直感的でわかりやすい動きです。

## unshift()

イ「では、続いての敵にいってみましょう」
あ「ラジオパーソナリティーかよ」
イ「さて、僕が魔法世界から召喚したデータは、今こんな状態になっているよ！」

```js
items = ['ソースカツ丼', '焼き鯖寿司'];
```

あ「そうだな」
イ「そして、新たに魔法世界から召喚したデータは、これだ！」

```js
newItems = ['越前おろしそば', 'ボルガライス'];
```

イ「このデータを……」
あ「元の配列の最初に追加した上で、その最初の要素を敵にぶつけりゃいいのか？」
イ「……なんでそんな無駄なことするの？」
あ「お前が前回そうしろっつったんだろ。大根おろしを目にぶっかけるぞ」
イ「まあまあ。今回は、元の配列の最初に追加して、その配列の要素数を`return`すればいいよ！」
あ「面倒くせえなあ……」

```js
return items.unshift(newItems);
```

イ「やったね、あれい！　4で敵が苦しんでるよ！」
あ「いまだに仕組みが良くわからんな」

### 解説

`unshift()` メソッドも、基本的な操作の一つです。
[MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/unshift)によると……

> `unshift()` メソッドは、配列の最初に 1 つ以上の要素を追加し、新しい配列の長さを返します。

つまり、タピオカ店の行列の一番前に、何人かが割り込みするようなイメージです。とても理不尽ですね。
また、このメソッドの戻り値は、`push()`メソッドと同じく、新しい配列の要素の数になります。

## 次回予告

無理して並び替えてるだけで、処理が遅くてもメモリを食い潰しても誰にも相談できないし、一人ぼっちで泣いてばかり。
良いものじゃないわよ、sortなんて。

[第3話 もうsortもreverseも怖くない](https://qiita.com/8amjp/items/86f5294981fbebd3fe2d)
ゼロ知識証明

証明者が秘密情報を知っていることを、秘密情報が検証者に漏れない形で、検証者が確かめる方法。

### 例
証明者が、ESDSAの秘密鍵$\,s\,$を知っていることを、秘密鍵が検証者にもれない形で、検証者が確かめる。

| 記号 | 意味 |
|---|----|
| $G$ |集合|
| $g$ |ジェネレーター|
| $q$ |ジェネレーターの位数|
| $s$ |秘密鍵|
| $h$ |公開鍵 $\,h=g^s\,$|

1. 証明者は、$Z_q\,$から$\,r\,$をランダムに選択し、$x = g^r$を計算して、検証者に送る。
1. 検証者は、$c\,$を$\,0, 1\,$から選択して、証明者に送る。
1. 証明者は、$y = r + sc \bmod q\,$を計算して検証者に送る。
1. 検証者は、$g^y = xh^c\,$が成り立つかを調べる。

証明者が秘密鍵を知っていれば、$\,c\,$が$\,0\,$の場合は、

$$
y=r,\;g^y = g^r = x
$$

となって、$\,c\,$が$\,1\,$の場合は、

$$
y = r + s\,,\;
g^y = g^{r+s} = g^r g^s = xh
$$


となるので、検証式（ステップ４）は成り立つ。
また、この手順では、検証者に秘密鍵は漏れない。

証明者が秘密鍵を知らない場合に、検証式が成り立つ確率は$1/2$なので、検証の回数$\,n\,$を増やすことで、検証式が全体で成り立つ確率$\,1/2^n\,$を無視できる程度に小さくできる。

###参考文献
暗号技術のすべて/IPUSIRON
railsチュートリアル正規表現について

VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i

正規表現	意味
/\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i	(完全な正規表現)
/	正規表現の開始を示す
\A	文字列の先頭
[\w+\-.]+	英数字、アンダースコア (_)、プラス (+)、ハイフン (-)、ドット (.) のいずれかを少なくとも1文字以上繰り返す
@	アットマーク
[a-z\d\-.]+	英小文字、数字、ハイフン、ドットのいずれかを少なくとも1文字以上繰り返す
\.	ドット
[a-z]+	英小文字を少なくとも1文字以上繰り返す
\z	文字列の末尾
/	正規表現の終わりを示す
i	大文字小文字を無視するオプション
表 6.1: メールの正規表現を分解した結果
Windows  Terminal とScriptの署名

Windows10を開発マシンとして使うための初期設定

* 今後dockerとか使って開発を進めることになるので、Windows 10 Homeだった物をライセンス購入してProにしました。→再起動が1回かかるくらいで項目がリセットされるとか無かった
    * Windows 10 Proへのアップグレード方法→Windows StoreでWindows 10 Proを検索
    * 価格：￥12,568 (2020/3/15現在)
* プレビュー版のWindowsTerminalをインストール：こちらもMicroSoftStoreからインストール

## 1. プロンプト(PowerShell や Windows Terminal)を開いたときにスクリプトを実行出来るようにする

デフォルトだと、スクリプト実行が制限されています。
といいながらも、起動時にPowerShellの初期実行スクリプト `Microsft.PowerShell_profifle.ps1`を読み込もうとしているので怒られる訳なのです。。

PowerShellスクリプトが実行出来てしまうと、悪意のあるスクリプトを実行すると、知らないうちにシステムの設定が変更されてしまう可能性があるので、「署名付きスクリプトを実行可能」にして、上のプロフィールスクリプトに署名をすることにしました

まずは、スクリプト実行のポリシーを変更する。
以下のコマンドを管理者権限で実行したPowerShellプロンプトで実行する

``` Set-ExecutionPolicy AllSigned```


## 2. PowerShellに署名ができる様に、自己署名ルート証明書を作成し、ルート証明書に移動するる

PowerShellを起動させたときに、これを出ない様にする

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42407/0400efa9-0723-f282-90bb-44bb16bb572a.png)

1. スクリプトの実行権限を「署名付き(AllSinged)」に設定する
2. 自己署名ルート証明書を作成する
3. Microsft.PowerShell_profifle.ps1 に署名する


公式っぽいドキュメント：
* PowerShellを使用したポイント対サイトの証明書の生成とエクスポート
    * https://docs.microsoft.com/ja-jp/azure/vpn-gateway/vpn-gateway-certificates-point-to-site

ここより、自己署名ルート証明書の作成（いわゆるオレオレ証明書）

この通りやって署名しようとしたらはじかれたので、New-SelfSignedCertificateコマンド、スクリプト署名で検索した結果、こちらのページを参考にしました！

https://soma-engineering.com/coding/powershell/script-signing/2018/08/05/

1. Powershellプロンプトを管理者権限で起動する
2. 以下のコマンドを実行する:Typeが大事なんですね
    * ``` $cert = New-SelfSignedCertificate -Subject "CN=CodeSigningForPS"`
     -KeyAlgorithm RSA -KeyLength 2048 -Type CodeSigningCert `
-CertStoreLocation "Cert:\CurrentUser\My"```
3. 生成した証明書をルート証明書に移動する
    * ```$Cert = Get-ChildItem Cert:\CurrentUser\My | ? {$_.Subject -eq "CN=CodeSigningForPS"}```
    * ```Move-Item "Cert:\CurrentUser\My\$($Cert.Thumbprint)" Cert:\CurrentUser\Root```
4. スクリプトを署名する
    * ``` Set-AuthenticodeSignature -Cert $Cert -Filepath.\Microsoft.PowerShell_profile.ps1 ```
5. すると次のメッセージダイアログが表示されました
    * ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42407/2928f8fe-d2ed-6aac-09af-583503bf6d80.png)
6. ダイアログに「はい」と答えて、shellプロンプトを起動すると..
    * ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42407/9753f906-4a7f-9563-eca9-26609e1bd372.png)
7. これを「常に実行する」としました

## 新しいスクリプトを実行させるには。。

試しに起動時スクリプトを変更してみると。。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42407/dcc1c433-0287-e7a1-7f0a-105d21d2dca6.png)

エラーになります。

改めて以下で署名しました

```
$Cert = Get-ChildItem Cert:\CurrentUser\Root | ? {$_.Subject -eq "CN=CodeSigningForPS"}
Set-AuthenticodeSignature -Cert $Cert -Filepath {ファイルへのパス}
``` 
# 3. 証明書の削除方法

`certmgr.msc`を起動する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42407/ea38a75c-c338-ccba-a6ea-91da56c51cbb.png)

証明書 > 信頼されたルート証明機関 > 証明書
で見つけることが出来るので、何かあったらここから削除すると安全かも

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42407/a9da0de9-b4ac-353b-d36e-312fafeb6070.png)
【SRE】メモリ全然わからん

## メモリの理想と現実
理想は無限の容量を備え、瞬時にアクセスできるのが望ましいです。
ですが現実のメモリは何階層にもなっており、深く行けばいくほどメモリの容量が大きくなり、読み込みが遅くなります。

## 全体の流れ
1. プログラムファイル実行
2. 仮想アドレスにアクセス
3. TLBにアクセス(該当する物理アドレスがあればアクセス)
3. MMUのページテーブルに基づき、仮想アドレスから物理アドレスに変換し、物理アドレスにアクセス
4. CPUにデータ渡す

下記が全体を掴むのに最高です。
[【図解】初心者向けユーザー空間とカーネル空間,システムコール,MMU/メモリ保護,の仕組み│SEの道標](https://milestone-of-se.nesuke.com/sv-basic/architecture/user-space-kernel-space/)

## 仮想記憶
プログラムから見たメモリのことで、実際のメモリより多くメモリがあるように見せる技術をさします。
OSはメモリをページという一定のサイズごとにロードしたり追い出したり(これをスワップやページングという)することで，物理メモリのサイズを隠蔽します。
>![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148392/ed818e11-da7c-84cd-8a41-3cd1b6f52e84.png)[【図解】初心者向けユーザー空間とカーネル空間,システムコール,MMU/メモリ保護,の仕組み│SEの道標](https://milestone-of-se.nesuke.com/sv-basic/architecture/user-space-kernel-space/)より引用


[仮想記憶とは｜「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典](https://wa3.i-3-i.info/word17757.html)

### MMU(Memory Management Unit: メモリ管理ユニット)
仮想記憶のアドレスと物理メモリのアドレスの変換を行います。(仮想記憶管理機能)
CPUに組み込まれています。
[MMU（メモリマネージメントユニット） \| APS｜半導体技術コンテンツ・メディア](https://www.aps-web.jp/academy/ca/228/)

>![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148392/d6e3af73-8480-f115-52fa-51fbc76d9ddc.png)
[ファイル:MMU principle updated.png - Wikipedia](https://ja.wikipedia.org/wiki/%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB:MMU_principle_updated.png)より引用

#### ページテーブル
MMUはページテーブルを持っています。
ページテーブルとは、仮想アドレスを物理アドレスを対応づける表のことです。
[ページテーブル - Wikipedia](https://ja.wikipedia.org/wiki/%E3%83%9A%E3%83%BC%E3%82%B8%E3%83%86%E3%83%BC%E3%83%96%E3%83%AB)

#### ページ
仮想記憶のブロックのことを指します。
下記がわかりやすかったです。
>決まった大きさのページ単位でメモリを管理するやり方
[ページング方式とは｜「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典](https://wa3.i-3-i.info/word13352.html)より引用

#### ページフォールト
アクセスしたページが主記憶に存在しない場合に発生します。

### アドレス変換バッファ(TLB)
CPUが仮想アドレスと論理アドレスとを対応させた情報を一時的に保管しておくバッファメモリのことです。
仮想アドレスから物理アドレスへの変換の高速化を図ります。
ページテーブルにとってのキャッシュの役割をしてくれます。
[TLBとは何？ Weblio辞書](https://www.weblio.jp/content/TLB)
[コンピュータアーキテクチャ（6）](https://www.mtl.t.u-tokyo.ac.jp/~sakai/hard/hard6.pdf)


>![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148392/19e98fa5-c3bb-8f02-5f10-adf2a4c29bfc.png)
[The TLB and cache implement the process of going from a virtual address to a data item in the Intrinsity
Fast MATH](http://www.cabrillo.edu/~shodges/cs24/files/f05.24.pdf)より引用

### メモリアドレスの構成
ページ番号とページ内オフセットと呼ばれるフィールドから構成されます。
オフセットとは、ページ内アドレスのことを指します。
[魔術師見習いのノート](https://pied-piper.net/note/show_alltags.cgi?OS)


### 仮想記憶とキャッシュ違い
[OSにおける仮想メモリとキャッシュメモリの違い](https://ja.gadget-info.com/difference-between-virtual)

### スワップ
#### スワップアウト
物理メモリで使用している領域をスワップ領域に追い出すこと。

#### スワップイン
スワップアウトにより追い出された領域をまた物理メモリの領域に戻すこと。

>HDDを使う領域＝スワップ
[【図解】仮想記憶(仮想メモリ)の本質や仕組み、メリット　〜スワップ、MMU、ページングテーブルについて〜│SEの道標](https://milestone-of-se.nesuke.com/sv-basic/architecture/virtual-memory-and-swap/)より引用

### その他参考になった記事
[参照の局所性 - Wikipedia](https://ja.wikipedia.org/wiki/%E5%8F%82%E7%85%A7%E3%81%AE%E5%B1%80%E6%89%80%E6%80%A7)
[時間的局所性、空間的局所性とは？](https://pcinformation.info/cpu/about-temporal-locality-spatial-locality.html)
[６章 仮想記憶 （Virtual Memory）](http://www.f.ait.kyushu-u.ac.jp/~fukuda/Gakubu-OLD-1/OS/6VirtualMemory.pdf)
[コンピュータアーキテクチャ](https://www.mtl.t.u-tokyo.ac.jp/~sakai/hard/hard6.pdf)
もしあなたがSierのテスト案件に入ってしまったら？　　Tribute to マナブ

# もしあなたがSierのテスト案件に入ってしまったら？
#　概要
もしあなたが渋谷の自社開発や最低でも受注委託の会社で働くはずだったのに
いつの間にかSierのそれもテスト案件に入ってしまった場合にどうするかです。
下記はマナブさんという人の動画で自社開発や受注委託がいいとテスト案件は
やめろと親切に教えてくれています。
ここでマナブさんについて簡単に述べますが有名ユーチューバー　ブロガーです。
プログラマーのご経験がおありになるようです。お金の稼ぎ方・自由になる生き方を
提唱されています。

https://www.youtube.com/watch?v=dYX1Mg-58io


##背景
中で働けると思って就職したにしても研修後は外に出されてしまう場合がある。
それもテスト案件だったりすると何の準備もなくまるで火事場にフラフラしている
人になってしまうので非常に危ないです。
　もう少し背景をいうと技術者は受注委託やりたがるんですけど・・・経営的には非常にリスクが高いので
人を外に出して経営の安定化を図る場合があります。先行き中でやれる可能性が本当にあるにしてもそれは外で実績を作ってからの話だったりする。
社内開発やってる会社も然りです。

##最悪
・やり直しを延々と続ける
・自社の契約とは別に現場の契約があるとして途中で退場させられてしまう。
よくて自社待機だけど・・・できたとしても何割か削られてしまう。悪くて
自社からも放り出されてしまう。
・ものすごいクレームが来る。営業を吊るしあげる。←　相当タフでも潰れます。
会社の人たちとの人間関係とかプライドとか自信とか
いろんなものを奪い去って行く。病むっていうか、ダメにされてしまう。　
次の仕事を探す機会を奪われる。

##前提
Sierのテスト案件でしょう？
きつくて辛くて遅くまでやってというものだということは理解しましょう。
やっても・・・ここは違うあそこは違う・・・何もわかってないとか
全部やり直しとか・・・
言われるものだということはわかって入ってください。
テスト自体が受注委託でやろうときついと思います。
特に最初なので８時間座ってられないとか・・・テスト項目書が字として認識されないとか・・・

##気をつけること　人と仕事をするっていうことが大事業だということに気づくこと
その場所のリーダーさんのやり方を一旦ジャッジしないでやるっていうこと。
リーダーさんなりそれに相当する人のやり方でやるということ。
違う人が来たら違うやり方になるということ。
いうこと聞いてくれない人が一番NGだということを知ること。
お客さん、リーダーさん以外の同僚に対して気をつけること。

##気をつけること　空気
まず、この世界は現場次第なのでリーダーさんの方針または社風で適度に休憩をとっていいか買い物していいか悪いか分かれるのでリーダーさんまたは現場の空気を読むことを心がけてください。

##気をつけること　言動
・テストしなくてはいけないのに環境の問題でテストできないなど不条理当たり前なので・・・
それをいちいち言わない

・スキルがないことわかってないことを自慢しない。
「SQLぜんぜんできません。」
「マルマルさんがいないと何もできません。」
面談の時にどういう話し合いがあったかをしっかり頭に置いておいてくれるリーダーさんもいるが
リーダーさんにも上の会社があったりするので、気の毒だとは思いませんか？そのあとも学ばなくていいということではないと思います。
・Sierというのは上位さんだと思うのであなたはSierではない可能性・・・もあるのでSESっていうのでしょうか？Sierという用語をみだりに口にしない。一部上場の立派な会社さんが多いですよ。いわゆる
まるまる生命に入っている　マルマル製作所みたいなものですよ。
・やり直しがきついんで・・・適度にリーダーさんまたは先輩にチェックしてもらうように
お願いするのも手ですね。人間相手なのでそれがどう跳ねるかはあくまで自己責任でお願いします。

##気をつけること　離席
適度は休憩はいいと思うが・・・（それも現場次第）
やることがないからってやたら席を立たない。
やることがない時どうするのかを考えて実行する。建前としては
休憩時間以外は働いていることになっています。最終日とかだったらいいのかも知れないですけどね。
何をするかはネットや入門の本で学んで下さい。
リーダーさんによってはやることがない時何をするかを考えてくれる人もいるけどそうでなくても何か考え
て行動する。

##準備
・画面系のテストが多いと思うが画面系のテストってどういうことが目的でどういうことをするのかは
書物などで学べるので学んでおく。
・体力勝負なので何らかのエクササイズをする。
　

・SQL・コマンドは　Progateで学んでおく。（道場以外）は
Progateの中でもやりやすい方だと思うので・・・
まずオススメしておきます。
https://prog-8.com/dashboard


##あんまりきつかったら・・・
早めに切り上げるという選択肢もあります。営業さんとよく話し合ってより良い選択をする。
無理に伸ばして休んで途中退場それは最悪です。・・・影で仕事探しているのかもしれないですけどね。

##マナー
・朝、できる範囲で挨拶をする。
リーダーさん、お客さん以外もやってください。
・朝来る時間も今はバラバラで仕事集中していると相手が挨拶し返すの忘れる場合も
あると思うので・・・人が挨拶しないからって圧は出さないようにする。←　
ちょっと前まで最上級生だったのかも知れないけど・・・そこは忘れましょう。

・人にあったらちょこっと頭を下げるくらいしておく。それでいいので・・・
リーダーさん、お客さん以外もやってください。

・1時にくればどうってことないことでも12時に来てランチに行ったらかなりビックリされますので・・・
やるとしたら来た途端だね。それなら大丈夫だと思います。
そこは日本にいる間は日本の習慣に従ってください。
Swiftでfor文の最後だけ処理をする


```swift

for (i, message) in messages.enumerated() {
    // 全部にしたい処理
    if (i == messages.endIndex - 1) {
        // 最後だけしたい処理
    }
}
```
まず`enumerated()`を使うことでi（ここでindexでなく敢えてiを使ったのは`enumerated()`で取得できるのはただのカウントだから）を取得できるが、逆にendIndexは配列しか持っていない。

Swift3.0からfor文が使えなくなり`for-in`文か`forEach`、もしくは`map`などしか使えなくなった。なので上記のenumurated()を使った「何回目の処理か」を取得する方法が散見されるが、これはindexでないというのが正しい説明のよう。

https://qiita.com/motokiee/items/4886b603631a7c076f46
https://qiita.com/a-beco/items/0fcfa69cca20a0ba601c

`messages.count`でも同じ値が帰ってくるはずだが、あれ、-1であってるんだっけ…。

`guard`を使わなかったのは、処理を抜ける時に`break`と`return`の違いもあってこんがらがりそうだったから。`break`は今の繰り返し処理を抜けて次の繰り返しを始めるが、`return`を使っちゃうと`for-in`の処理がそこですべて終了しちゃう。
OSのシステムコールとベンチマークなどのリンク

OSのシステムコールとベンチマークなど

<a href="https://qiita.com/m6m/items/295d1827f5f2a32a7bb1#fnref2" target="_blank">macOSのシステムコールを詳しく見たかった - Qiita</a>

<a href="https://flying-foozy.hatenablog.com/entry/20140514/1400090130" target="_blank">OS毎のシステムコール実行性能 〜 その1 - 彷徨えるフジワラ</a>

１〜６まである。

<a href="http://blog.matsumoto-r.jp/?p=2545" target="_blank">人間とウェブの未来 - Linuxで3万（10万）プロセスを同時に起動させてみた</a>

LinuxとMacの２つで
1.perl , ruby のベンチマーク（Pythonは上記リンクにある。）
2.通常アプリレベル　のベンチマーク
3.ゲームレベルかantutuみたいなベンチマーク
のそれぞれの結果を知りたい。

Macやwindowsにあるcinebenchの様なベンチマークソフトは linuxにあるのだろうか？





他
あまり参考にならない性能値

<a href="https://www.mazn.net/blog/2016/08/11/1575.html" target="_blank">Windows bash (win-bash)のプロセスのfork性能を測ってみた | Mazn.net</a>

--
【Day14】積み上げ日記

＜予定＞
○Progate
- JS学習コースⅠ, Ⅱ

＜内容＞
○Progate
- JS学習コースⅠ終了
　- else
　- 複数の条件式
　- switch文
- JS学習コース Ⅱ 
　- 変数の復習
　- 繰り返し処理

＜学んだこと＞
○else：ifの条件以外のものを指示する。

○if

○複数条件をつけるとき
　- else if：if と else の間に条件を追加する
　- &&：条件１かつ条件２
　- ||：条件１または条件２

○switch文
switch（color）{…
    case “赤”:
    console.log(“ストップ！);
    break;
}
必ずbreakをつける！

　- default でその他条件の処理をする。≒ else

○while文
let number = 1;
while (number <= 100 {
    console.log (number)
    number += 1;

___は繰り返したい部分
【Day13】積み上げ日記

＜予定＞
○Progate
- JS学習コースⅠ

＜内容＞
○Progate
- JS学習コースⅠ
　- 文字列と数値
　- 変数・定数
　- テンプレートリテラル
　
＜学んだこと＞
○console.log()で、（）内にあるものを、console上に記録する(log)。

○数字はクオーテーションつけない。    

○末尾にセミコロン必ず！

○”余り”の数字を出すときは、％を使う。

○変数を出力するとき：let 変数(項目)（）で指示する。
更新するときは、letをつけない！

○＋でも組み合わせることができるが、${…}でも可能。

○if（条件式）{処理} で、「もし〇〇ならば●●を行う」

○条件式が成り立つ場合＝true、成り立たない場合＝false
【Day12】積み上げ日記

＜予定＞
○Progate
- HTML＆CSS 道場コース（初級）全部

＜内容＞
○Progate
- HTML＆CSS 道場コース（初級）
　- トップ部分を作ろう
　- フッター部分を作ろう

＜計画通り進んだか？＞
進んだ。
上手くいった理由は目標設定値が低かったこと、答えをコピペしたから早くなったことが要因。

＜学んだこと＞
Progateはあくまで「プログラミングの興味づけ」なので、そこまでがっつり時間をかけてやるものではない。なので、早くアウトプットするために模写に取り掛かる。
【Day11】積み上げ日記

＜予定＞
○Progate
- HTML＆CSS 道場コース（初級）全部

＜内容＞
○Progate
- HTML＆CSS 道場コース（初級）
　- お問い合わせフォームの作成

＜学んだこと＞
○一行のテキスト入力：input

○複数行のテキスト入力：textarea

○送信ボタン：input type=“submit”

○ボタンに表示されるテキスト変更：value=“〇〇”
Raspberry Pi 4にROS2をインストールしてみる

# 前準備
Raspberry Pi 4にubuntu 18.04 LTSをインストールしておく。
(ROS2では、18.04を正式サポートしているため)
https://qiita.com/Toshiaki0315/items/6b50e577a01051525f9d
# ROS2のインストール
公式ページの[Installing ROS 2 via Debian Packages](https://index.ros.org/doc/ros2/Installation/Dashing/Linux-Install-Debians/)を参考にして進めていく。

## Setup Locale
```
$ sudo locale-gen en_US en_US.UTF-8
$ sudo update-locale LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8
$ export LANG=en_US.UTF-8
```

## Setup Sources
```
$ sudo apt update && sudo apt install curl gnupg2 lsb-release
$ curl -s https://raw.githubusercontent.com/ros/rosdistro/master/ros.asc | sudo apt-key add -

$ sudo sh -c 'echo "deb [arch=amd64,arm64] http://packages.ros.org/ros2/ubuntu `lsb_release -cs` main" > /etc/apt/sources.list.d/ros2-latest.list'
```
Raspberry Pi 4は、64bitアーキテクチャなので、公式ページのdebコマンドのところに[arch=amd64,arm64] を追加して、コマンドを実行。

## Install ROS 2 packages
```
$ sudo apt update
$ sudo apt install ros-dashing-desktop
$ sudo apt install ros-dashing-ros-base

## Environment setup
### Sourcing the setup script
```
$ source /opt/ros/dashing/setup.bash
```

### Install argcomplete (optional)
```
$ sudo apt install python3-argcomplete
```
これでROS2のインストールは完了です。
【Go】Mac + VSCode + Go 環境設定

### Goのインストール
<hr>

基本こちらに記載されていた手順でインストール
[参考リンク](https://qiita.com/oruharo/items/545378eae5c707f717ed)


### 【エラー対応諸々】
<hr>
#### ① Go:Install/Update Tools が FAILED になる　[(スクショないので参考画面)](https://github.com/microsoft/vscode-go/issues/2724)

→以前GoLand（IDE）で旧バージョン（v1.11）を利用していたため。
→旧バージョンを削除し新バージョン(v1.13)をインストール [(アップグレードの手順参考)](https://www.quora.com/Whats-the-easiest-way-to-update-Go-programming-language-to-the-latest-version-in-Linux)
（旧バージョンのアンインストールは /usr/local/go 消したら良いよう）

→アップグレード後、FAILEDなくすべてSUCCESSした
→VSCodeにて問題なくHello world もデバッグ実行できることを確認



#### ② godoc command not found

go get golang.org/x/tools/cmd/godoc　で　godocのダウンロードしたが
godoc fmt で確認すると godoc command not found　となった

（旧バージョン＆GoLandでうまく動いていたから、これまで手動でPATH設定していなかった）

→vim ~/.bash_profile で
GOPATH を明記
PATH に GOPATH と GOROOT を明記

<img width="300" alt="スクリーンショット 2020-03-14 15.22.53.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/603007/dfa592d9-c15b-fae4-ade7-46bbe75de3e1.png">

source ~/.bash_profile で反映


再度 godoc fmt すると、

Unexpected arguments. Use "go doc" for command-line help output instead. For example, "go doc fmt.Printf".

と表示され、

"go doc fmt.Printf" すると確認できた。


参考リンク諸々
http://horie1024.hatenablog.com/entry/2014/08/24/024733
http://kodama-tech.hatenablog.com/entry/2016/12/14/002115
https://stackoverflow.com/questions/34708207/command-not-found-go-on-mac-after-installing-go



#### ③ コードにコメント書かないとエラー表示される

<img width="705" alt="golint_err.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/603007/c5a6251c-7610-73bc-e597-eedb1eb3ff9a.png">


→VSCodeの基本設定にてgolintを検索し、Lint on Save を OFF にして無効にした（VSCode再起動）
GitレポジトリをSubversionレポジトリにミラーリングする（Git Server-Side Hook編）

# やりたいこと

gitレポジトリをsubversionレポジトリにミラーリングする。

```
git user -> git server -> svn server -> svn user
```

ポイントは`git server`と`svn server`のつなぎ。

# さてどうしたものか。。。

とりあえず勉強だ！

# Git Server-Side Hook（調査）
https://git-scm.com/book/en/v2/Customizing-Git-Git-Hooks#Server-Side-Hooks

Gitのサーバーサイドフックは以下の3種類がある。

* `pre-receive`
    * Pushリクエストをクライアントから受け付けた時に発動する（まだPushは完了していない）。`pre-receive`はPushリクエスト一つにつき一度しか発動しない。`non-zero`を返せば、失敗となり、Pushの処理は中止される。`0`を返せば成功し、Pushの処理は継続される。
* `update`
    * 発動タイミングや成功・失敗は`pre-receive`と同様。`update`はブランチごとに発動する（Pushリクエストに含まれるコミットがそれぞれ異なるブランチのコミットとなっているような場合）。
* `post-receive`
    * Pushの処理完了後に発動する。

GitLabでサーバーサイドフックを使う場合には、以下を参照。

https://docs.gitlab.com/ce/administration/server_hooks.html#server-hooks-core-only

> For Omnibus installs the path is usually /var/opt/gitlab/git-data/repositories/\<group>/\<project>.git.

とあるが、わたしの環境では`repositories`の下はHash値になっている。

GitLabのAdmin Area>Projects以下にプロジェクト毎のページがあり、`Gitaly relative path:`という項目を参照すればプロジェクトのHash値がわかる。

# Git Server-Side Hook（作成）

私はDockerを使ってGitLabサーバーを構築している。まずはサーバーにログインする。（`gitlab`という名前のGitLabサーバーインスタンスの想定）

```
% docker exec -it gitlab /bin/bash
```

フックを作成する。

```
# cd /var/opt/gitlab/git-data/repositories/@hashed/<group>/<project>.git/
# mkdir custom_hooks
# cd custom_hooks
# touch pre-receive update post-receive
# chmod +x pre-receive update post-receive
```

`pre-receive`フックに以下の内容を記載してクライアントからサーバーへPushしてみる。Pushに失敗することを確認する。

```
#/bin/bash
exit 1
```
PDF.js にコントリビュートした話

開発に参加している [LaTeX Workshop](https://github.com/James-Yu/LaTeX-Workshop) では [PDF.js](https://github.com/mozilla/pdf.js) をヘビーに使用していて、ちょくちょくやりとりもあるので、恩返しとコードの理解のために PDF.js にコントリビュートしてみました。対象の issue には CJK ユーザー以外は対応しそうにない[縦書きの表示のバグ](https://github.com/mozilla/pdf.js/issues/11526)の修正を選びました。

無事[PRがマージ](https://github.com/mozilla/pdf.js/pull/11540)されて、Firefox へも[マージ](https://bugzilla.mozilla.org/show_bug.cgi?id=1618875)されました。 Firefox 75から有効になるはずです。Firefox Nightly ではすでに有効になっています。[オンラインデモ](https://mozilla.github.io/pdf.js/web/viewer.html)で試すことも可能です。

https://www.nta.go.jp/taxes/tetsuzuki/shinsei/shinkoku/zoyo/yoshiki2019/pdf/006.pdf

修正前

![スクリーンショット 2020-03-15 7.09.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/310575/04fe5e8f-2fc5-6681-0cdf-8a4da7ed19fd.png)

修正後

![スクリーンショット 2020-03-15 7.11.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/310575/011eb768-30e5-2512-e153-116d268218ba.png)

http://warp.da.ndl.go.jp/info:ndljp/pid/10205551/www.city.niigata.lg.jp/shisei/koho/kohoshi/shiho/backnumber/h25/shiho0217/pdf/0217_P1.pdf

修正前

![スクリーンショット 2020-03-15 7.16.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/310575/1a6c01fc-1445-c731-41a8-652ae4a594d8.png)

修正後

![スクリーンショット 2020-03-15 7.16.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/310575/c4cca3d3-fe55-d028-0532-820f6e4dafa0.png)
Raspberry Pi 4にubuntu Serverをインストールしてみる

# ubuntuのダウンロード

Ubuntuの公式サイトからubuntuをダウンロードする。
今回はROS2を使いたかったので、Raspberry Pi 4/Ubuntu18.04.4 LTS/64-bitを選択した。
(Ubuntu19.10も基本インストール手順は同じだと思います。)
https://ubuntu.com/download/raspberry-pi
![ubuntu1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28184/bd0a4a98-d51b-3c35-dca6-71e0a4ef3232.png)


# インストールメディアの作成
SDメモリカードフォーマッターを使って、インストールに使用するmicroSDをフォーマットする。
https://www.sdcard.org/jp/downloads/formatter/

balenaEtcherを使ってダウンロードしたインストールイメージをSDに書き込む。
https://www.balena.io/etcher/

# インストール
作成したmicroSDをRaspberry Pi 4にセットして起動するとインストールされる。
ログイン画面が表示されるのでユーザ名ubuntu、パスワードubuntuを入力する。
パスワードの変更を求められるので、新しいパスワードを設定する。

# ubuntu アップデート
インストールしたubuntuをアップデートする。

## 最新のパッケージ情報を取得
```
$ sudo apt update
```

## パッケージの更新
```
$ sudo apt dist-upgrade
```
dist-upgradeだとカーネルの更新までしてくれる。
upgradeだとパッケージの更新のみとなる。

### パッケージの更新に失敗した場合
インストール直後にaptコマンドが実行されているらしく、以下のようなエラーが出ることがある。
この場合は、しばらく待って実行されているaptコマンドが終了されてから、再度パッケージの更新をおこなう。

```
E: Could not get lock /var/lib/apt/lists/lock - open (11: Resource temporarily unavailable)
E: Unable to lock directory /var/lib/apt/lists/
```
## 不要ファイルの削除
最後に必要がなくなったらパッケージファイルを削除する。

```
$ sudo apt autoremove
```

# おまけ
## 今回の環境
どこでも作業ができるようにモバイルディスプレイと超小型キーボード、USB Type-c 2ポートのACアダプタを使ってみました。

* Raspberry Pi 4 4G
* [GREEN HOUSE モバイルディスプレイ GH-LCU16A-BK](https://www.green-house.co.jp/products/gh-lcu16a/)
* [タッチパッド搭載 2.4GHz ウルトラコンパクトワイヤレスキーボード DN-915836](https://www.dospara.co.jp/5shopping/detail_parts.php?bg=7&br=221&sbr=1065&ic=459930&lf=0)
* [Anker PowerPort Atom PD 2](https://www.ankerjapan.com/item/A2029.html)

![環境.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28184/bc9a9cd1-5505-deaf-28c3-92d5856f0399.png)
GitレポジトリをSubversionレポジトリにミラーリングする（実験環境編）

# やりたいこと
gitレポジトリをsubversionレポジトリにミラーリングする

git user -> git server -> svn server -> svn user

# 準備

* GitLab
* Redmine&Subversion

# セットアップ

docker composeを使うと、、、あら楽ちん。このまま本番環境には持っていけませんが、実験するには十分です。

インスタンスを立ち上げたら、RedmineとGitLabそれぞれでユーザーやレポジトリを設定します。

```
version: '3.7'

services:
    redmine:
        container_name: redmine
        image: redmine
        restart: always
        networks:
            - mynetwork
        ports:
            - 80:3000
        volumes:
            - ./data/plugins:/usr/src/redmine/plugins
            - ./data/themes:/usr/src/redmine/public/themes
            - ./data/svn:/srv/svn
        environment:
            REDMINE_DB_MYSQL: redmine-db
            REDMINE_DB_PASSWORD: redmine

    remine-db:
        container_name: redmine-db
        image: mariadb
        restart: always
        environment:
            MYSQL_ROOT_PASSWORD: redmine
            MYSQL_DATABASE: redmine
        networks:
            - mynetwork
        volumes:
            - ./data/db:/var/lib/mysql
        command: mysqld --character-set-server=utf8 --collation-server=utf8_unicode_ci

    gitlab:
        container_name: gitlab
        image: 'gitlab/gitlab-ce:latest'
        restart: always
        environment:
            GITLAB_OMNIBUS_CONFIG: |
                gitlab_rails['gitlab_shell_ssh_port'] = 2224
        networks:
            - mynetwork
        ports:
            - '8929:80'
            - '2224:22'
        volumes:
            - ./gitlab/config:/etc/gitlab
            - ./gitlab/logs:/var/log/gitlab
            - ./gitlab/data:/var/opt/gitlab

    subversion:
        container_name: svn
        image: 'kuchida1981/subversion-httpd'
        restart: always
        environment:
            SVN_DEFAULT_USER: admin
            SVN_DEFAULT_USER_PASSWD: admin
        networks:
            - mynetwork
        ports:
            - 10080:80
        volumes:
            - ./svn:/var/svn/repos

networks:
    mynetwork:
        name: mynetwork
        driver: bridge
```

* 参考
    * http://sig9.hatenablog.com/entry/2019/07/06/000000
        * docker-compose.ymlはこのサイトを参考にさせていただきました。
    * https://docs.gitlab.com/omnibus/docker/#install-gitlab-using-docker-compose
    * https://docs.docker.com/compose/
    * https://qiita.com/bezeklik/items/b9d75ee74e0ae4c6d42c
    * https://hub.docker.com/r/kuchida1981/subversion-httpd/
    * https://docs.docker.com/network/network-tutorial-host/
    * https://knowledge.sakura.ad.jp/16082/
Perl で学ぶ逆元の２ + パナソニックプログラミングコンテスト2020 C で嵌った話

# はじめに
*[C - Sqrt Inequality](https://atcoder.jp/contests/panasonic2020/tasks/panasonic2020_c)*
おっ、サービス問題じゃん

|<font color=orange>WA</font>|
|:--:|
ぐぬぬ

# パナソニックプログラミングコンテスト2020 C
```WA.pl
if (sqrt($a)+sqrt($b)<sqrt($c)) {
  say "Yes";
} else {
  say "No";
}
```
これで行きそうなのですが、実数に対する誤差のため <font color=orange>WA</font>

```BigFloat.pl
use v5.18; # strict say state
use warnings;
use Math::BigFloat;

my ($a, $b, $c) = split / /, <STDIN>;

my $x = Math::BigFloat->new($a)->bsqrt();
my $y = Math::BigFloat->new($b)->bsqrt();
my $z = Math::BigFloat->new($c)->bsqrt();

if ($x+$y<$z) {
  say "Yes";
} else {
  say "No";
}
```
**BigFloat** を使用してもダメな様子
# 逆元
*perldoc* を見ていると、**Math::BigInt** 系に **bmodinv** と **bmodpow** を発見
*[以前の投稿](https://qiita.com/superrino130/items/c72da0b8eb4d987f1488)*に適用してみました
*[D - Bouquet](https://atcoder.jp/contests/abc156/tasks/abc156_d)*

```ABC156D-Bouquet.pl
use v5.18;
use warnings;
use Math::BigInt;
use List::Util 'reduce';

my ($n, $e, $f) = split / /, <STDIN>;
my $MOD = 1e9 + 7;

sub combination {
  my ($n, $k) = @_;
  my $c = reduce {$a * $b % $MOD} (($n-$k+1)..$n);
  my $d = reduce {$a * $b % $MOD} (1..$k);

  $c * Math::BigInt->new($d)->bmodinv($MOD) % $MOD;
}
my $ans = Math::BigInt->new(2)->bmodpow($n, $MOD) - 1;
$ans += $MOD - combination($n, $e);
$ans += $MOD - combination($n, $f);
say $ans % $MOD;
```
スッキリしてる

||前回|今回|
|:--:|:--:|:--:|
|コード長|754 Byte|475 Byte|
|実行時間|129 ms|110 ms|
|メモリ|768 KB|12544 KB|
実行時間も短くなってる
# まとめ
+ パナソニックプログラミングコンテスト2020 C で嵌った
+ 本当は B も嵌っている
+ 逆元の解法に詳しくなった

参照したサイト
[Math::BigInt](https://perldoc.perl.org/Math/BigInt.html)
[標準添付の Math:: モジュールのご紹介](https://qiita.com/xtetsuji/items/a7e563d8f820e95949ea)
[perl で bignum の精度の設定方法ならびに bignum 実装での log 関数のバグについて](http://pika.way-nifty.com/pika/2014/10/perl-bignum-big.html)
[Perl で学ぶ剰余計算](https://qiita.com/superrino130/items/c72da0b8eb4d987f1488)
[Perl AtCoderのアップデートを先取りしてライバルに差をつけよう(List::Util他)](https://qiita.com/superrino130/items/eeec1fe627e934262042)

# 追記
**Math::BigInt** は *[perl の bigint は圧倒的に遅い](https://mametter.hatenablog.com/entry/20080116/p1)* 様です。
**ABC156D-Bouquet** は計算箇所が少ないので問題ないのですが、**ABC151E-Max-Min Sums** の様に多い場合は自作関数の方がいいと思われます。
*[Perl で学ぶ逆元の３ ABC 151 E が解けた！](https://qiita.com/superrino130/items/2f8a1b5769f7d0cbe3a7)*
openshift4.3でYAMLからプロジェクトを作成する(失敗)

# はじめに

うまくいっていません(笑)

前回抽出したMariaDBのテンプレートをYAMLからProjectにImportしてみます。

# WebコンソールからのYAMLインポート

YAMLメニューを押すとYAMLまたはJSON形式でインポートする画面になります。

![2020-03-15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324255/60ca0147-e334-3253-9364-09a50c095602.png)

![2020-03-15 (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324255/e54156eb-622f-84f0-bb36-7a1c6d574390.png)

試しに前回抽出したMariaDBのテンプレートをインポートしてみます。

![2020-03-15 (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324255/a83adc13-dc75-7a72-b9a0-20923ddc4135.png)

で[Create]を押すと…なんとエラー

![2020-03-15 (3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324255/b411c80e-0de7-3149-1ba7-cfaf6bebe65c.png)

> An error occurred
> The server doesn't have a resource type "kind: List, apiVersion: v1".

openshiftプロジェクトから吐き出したYAMLがインポートできないとは
一体どういうことなんでしょうか(笑)
React Nativeで作成したiOSアプリを実機で実行しようとしたら色々つまずいた

初投稿です。
優しくしてください:pray:

## 環境
- React Native 0.61.5
- Xcode 11.3.1
- iOS 13.3.1

## 背景
Reactの勉強がてら、React Nativeも触っていました。
いざiOS実機で実行しようとしたら色々躓いたので、備忘録として手順を残しておきます。

## 流れ
1. コード(App.js)が完成したので、とりあえず実機で動かす
2. **Xcodeの起動(つまづき1)**
3. **Team設定のエラー(つまづき2)**
4. **「Failed to register bundle identifier.」というエラー(つまづき3)**
5. **Nodeのバイナリが見つからないエラー(つまづき4)**

## Xcodeの起動(つまづき1)
Projectを起動しようとすると、iosディレクトリの中にそれっぽいのが2つありました。
<img width="173" alt="project.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/470361/1dc64317-a297-5919-1c89-ca394cc2b4d5.png">
xcworkspaceのファイルだとうまく実行できました。

## Team設定のエラー(つまづき2)
Team設定がNoneのままなので、Build Failedとなってしまいます。
Project navigatorをクリックし、
**TARGETS > [APP NAME] > Signing&Capabilities > Signing > Team**
の中を**Noneから自分のアカウント名**に変更すると解決します。

参考文献: [今まで発生したXcodeでのビルドエラーまとめ - Qiita](https://qiita.com/segur/items/bef54efa7764885173bb#%E3%82%B1%E3%83%BC%E3%82%B9team%E3%81%8C%E8%A8%AD%E5%AE%9A%E3%81%95%E3%82%8C%E3%81%A6%E3%81%84%E3%81%AA%E3%81%84)

## 「Failed to register bundle identifier.」というエラー(つまづき3)
バンドル登録うんぬんで、Build Failedとなってしまいます。
先程のTeamの下にある**Bundle Identifier**の名前を一意なものに変更すると解決します。

参考文献: [Xcode10で「Failed to register bundle identifier」エラーへの対応 | TickleCode](https://ticklecode.com/failed_to_register_bundle_identifier/)

## Nodeのバイナリが見つからないエラー(つまづき4)
最後にNodeのバイナリが見つからず、Build Failedとなってします。

```
error: Can't find 'node' binary to build React Native bundle
```

下記のコマンドでnodeのパスを調べ、

```
$ which node
```

**TARGETS > [APP NAME] > Build Phases > Bundel React Native code and image**
を開き、shellの1行目のnodeのパスを変更します。

```
export NODE_BINARY=node
```

の`node`の部分を調べてきたパスに変更します。

参考文献: [React Native  エラー　Can’t find ‘node’ binary to build React Native bundle - Qiita](https://qiita.com/YutamaKotaro/items/00749491cb1d5f7b82ba)

## まとめ
筆者の環境では上記のエラーをすべて解決したら、実機(iOS13.3.1)での実行が確認できたました。
これらのエラーを解決するのに、1時間弱かかったため、備忘録として残しておきます。
preact＋typescript+jsx環境　reactとの相違点

preact＋typescript+jsxの環境構築について、日本語での記事が見当たらなかったので書いてみます。
といっても基本的にはreactのものと一緒なので、相違点のみを取り上げます。

なお、０から組み立てるのでなければ**[CLIツール](https://github.com/preactjs-templates/typescript)**を使って、スタータープロジェクトを作ることもできます。

以降のサンプルコードはwebpack等のバンドラーを使っている前提になります。

### tsconfig.jsonのcompilerOptionsの変更

```tsconfig.json
{
  "compilerOptions": {
    // ...省略
    "jsx": "react",
    "jsxFactory": "h", // ← 追加
    // ...省略
  }
  // ...省略
}
```
`"jsx":"react"`の指定までは一緒ですが、加えて`"jsxFactory": "h"`の指定が必要です。
これはデフォルトでは`React.createElement()`に変換されるところをpreact向けに`h()`に変換するためです。


### tsx(jsx)ファイルではhメソッドを呼ぶ
jsxの記述されたソースファイルでは`h`をimportします。
`h`は一見使われてないように見えますが、前述の通りjsx部分で内部的に使われます（なのでVS Codeでは省くとしっかりエラーになります）

```App.tsx
// import * as React from "react"
import { h, Component } from 'preact';

interface Props {
  user: string
}
interface State {
  message: string
}

// export class App extends React.Component<Props, State> {
export class App extends Component<Props, State> {

  constructor(props: Props) {
    super(props);

    const hour = new Date().getHours()
    const msg = (hour < 12) ? "Good morning" :
      (hour < 18) ? "Good afternoon" :
      "Good evening";
    this.state = { message: msg  };
  }

  render() {
    return (
      <div>
        {this.state.message}, {this.props.user}. 
      </div>
    )
  }
}
```


### render引数の型アサーション
DOMレンダリングではreact-dom役に相当するrender関数をimportして使います。
引数もReactDOM.renderと似通ってますが、同じノリで指定すると「型が違う」と怒られます。

```index.tsx
// import ReactDOM from "react-dom"
import { h, render } from 'preact'
import { App } from './App'

const dom = document.getElementById("root");

// ReactDOM.render(
render(
  <App user="Qiita" />,
  dom // ←エラーになる
);
```

これは`as`で型アサーションすることで回避するようです。

```index.tsx
const dom = document.getElementById("root") as Element;
render(
  <App user="Qiita" />,
  dom // OK
);
```

他にも何か気づいたら追記していきます。

## 参考
[Awesome Open Source - Preact And Typescript](https://awesomeopensource.com/project/scurker/preact-and-typescript)
【Unity】Raycastで簡単に弾道に沿った当たり判定を実装する方法

#はじめに
銃を扱うゲームにおいて当たり判定の実装は不可欠ですが、リアルな弾速で弾を飛ばすと簡単にすり抜けてしまいます。
銃口からRayを飛ばせば弾速は出せますが、リアルさを求めているのに弾道が直線というのも残念ですよね。
今回はRaycastの速さと、リアルな弾道の放物線を両立する方法を紹介したいと思います。
（Unity歴が浅いので、もしかしたらポピュラーな方法かもしれません。また、もっと簡単でいい方法(CollisionDetectionModeとか)があるのかもですがご容赦ください。）

#方法
考え方は至って単純で、弾の前フレームでの位置から今のフレームでの位置にRaycastを飛ばして当たりを判定します。

#コード

```C#:

Vector3 prepos;

void Start(){
    prepos = transform.position; //前フレームでの位置
}
void Update(){
    Vector3 pos = transform.position; //今フレームでの位置
    Ray ray = new Ray(prepos, (pos - prepos).normalized); //前フレームの位置から今の位置の向きにRayを飛ばす
    RaycastHit hit; //これがあると当たったオブジェクトの情報が扱える
    if (Physics.Raycast(ray, out hit, (pos - prepos).magnitude, 1 << 8)){ //判定ししたいオブジェクトはレイヤーを分けておく（この場合はレイヤー8）
        Debug.Log("Hit!"); //当たったらコンソールにて報告
    }
    prepos = pos; //今のフレームの位置を次のフレームにおける前のフレームの位置として保存
}
```

#注意
この方法ではRay（すごくほそい）を使っているため、オブジェクトのpositionの座標が通過しないと当たりが検出されません。
そのため弾丸など小さな物体には有効ですが、大きさのあるものに使うのはおすすめしません。

#まとめ
需要があるかわからない当たり判定の紹介でした。問題等あれば教えて下さい。
heroku操作備忘録 : —app 省略

## herokuでまいどまいど--app {アプリ名} を指定するのが面倒

マジで忘れるので備忘録

```
heroku git:remote -a {アプリ名}
```

## heroku 上の環境設定を.envファイルに落としたり手元のをあげたり

```
heroku plugins:install heroku-config #初回のみ
heroku config:pull #ローカルの.envに落とす
heroku config:push #herokuの環境変数をローカルの.env
```
Houdini Tutorial Procedural Japanese Castle in Unreal Engine 4

CREATING PROCEDURAL JAPANESE CASTLE
![Procedural_20Japanese_20Castle_20ART1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/586143/7b9af154-a8f1-930a-862c-ee1f4cd81669.jpeg)

Buy On
Gumroad: https://gumroad.com/rart#iPTrw
ArtStation store: https://www.artstation.com/raducius/store
Free Demo: https://gumroad.com/rart#YcpjX
In this tutorial you will learn how to create a procedural Japanese castle generation tool in Houdini 18.
How to automatically generate interior and exterior using point instance.
The method allows to add portions that can interact with the player (e.g., opening the doors)
Provides the ability to speed up the creation of content for games.
The tool can be reused in different projects with different types of stylization, because we will use prefabricated props.

Video Presentation
https://youtu.be/tL5JWPO4lKE

WHAT’S INSIDE?
27 Video Chapters (12 hours of tutorial)
Houdini 18 Project File
Unreal Engine 4.24 Project File + all assets
PDF Documentation (54 pages).
HDA Asset

![Procedural_Japanese_Castle_12.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/586143/5936155f-3020-3774-0b21-f814bdc33e62.jpeg)

INTRODUCTION
Chapter_1_[1] Project Setup - 2 min.
Chapter_1_[2] Creating Custom Nodes - 9 min. 
Chapter_1_[3] Size Controls - 15 min. 
Chapter_2_[1] Creating Wall & Corners - 40 min. 
Chapter_2_[2] Creating Exterior Ceiling & Floor - 44 min. 
Chapter_2_[3] Creating Stairs & Ceiling - 38 min. 
Chapter_2_[4] Creating Interior Walls & Doors - 47 min. 
Chapter_2_[5] Procedural Tatami Layout Generation - 42 min. 
Chapter_2_[6] Unreal Engine Test - 12 min. 
Chapter_3_[1] Creating Exterior Walls & Corners - 31 min. 
Chapter_3_[2] Creating Stairs & Ceiling - 25 min. 
Chapter_3_[3] Creating Interior Walls & Doors - 28 min. 
Chapter_3_[4] Creating Tatami Layout - 25 min. 
Chapter_3_[5] Unreal Engine Test - 7 min. 
Chapter_4_[1] Creating Interior Walls - 21 min. 
Chapter_4_[2] Creating Exterior Walls - 24 min. 
Chapter_4_[3] Unreal Engine Test - 5 min. 
Chapter_5_[1] Creating Interior Bridge - 42 min. 
Chapter_5_[2] Creating Stairs & Floor - 19 min. 
Chapter_5_[3] Creating Exterior Walls - 27 min. 
Chapter_5_[4] Creating Balcony Structure - 45 min. 
Chapter_5_[5] Unreal Engine Test - 10 min. 
Chapter_6_[1] Creating Sides Floor - 16 min. 
Chapter_6_[2] Creating Stairs Zone - 38 min. 
Chapter_6_[3] Creating Ceiling - 22 min. 
Chapter_6_[4] Creating Corners - 14 min. 
Chapter_6_[5] Completion HDA Asset - 80 min.

![Procedural_Japanese_Castle_11.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/586143/75fd8866-172c-bf69-dbb2-eeb75cae5f6e.jpeg)

TOOLS
Houdini 18
Unreal Engine 4.24
MINIMUM REQUIREMENTS
Beginner-Intermediate Houdini Knowledge

![Procedural_Japanese_Castle_3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/586143/dc5e1c83-1dd1-1691-3820-730278d81674.jpeg)

Buy On
Gumroad: https://gumroad.com/rart#iPTrw
ArtStation store: https://www.artstation.com/raducius/store
Free Demo: https://gumroad.com/rart#YcpjX
styled-components + TypeScriptでコンポーネントが拡張できなかった

#今回の問題
コンポーネントを作成して別ファイルにインポートして拡張したかったができなかった。


```Paragraph.tsx
const Paragraph = styled.p`
  color: red;
`

export default Paragraph
```

こんなコンポーネントを作成した。
これを`App.tsx`にインポートして拡張しようとしてこんな風にした。

```App.tsx
import Paragraph from 'Paragraph'

const StyledParagraph = styled(Paragraph)`
  color: blue;
`

export default () => {
  return (
    <StyledParagraph>hoge</StyledParagraph>
  )
}
```

理想の結果：<font color="Blue">hoge</font>
実際の結果：<font color="Red">hoge</font>

なぜ青くならない…。

#原因と解決方法
原因は元になるコンポーネントに拡張後のクラス名が反映されていなかった。

`<p class="Paragraphのクラス名 StyledParagraphのクラス名">hoge</p>`
こうなってほしいのにdeveloperToolで確認すると
`<p class="Paragraphのクラス名">hoge</p>`
こうなっていたのが原因だった。

そのため、`Paragraph.tsx`で`StyledParagraphのクラス名`を受け取れるようにすればいいので、`Paragraph.tsx`を以下のように書き換えた。

```Paragraph.tsx

interface propsInterface {
  className?: string
}

const Paragraph = styled.p`
  color: red;
`
const paragraph = (props: propsInterface) => {
  return <Paragraph className={props.className} />
}

export default paragraph
```

こうすることで拡張した後のstyleを反映させることができた。
実際の結果：<font color="Blue">hoge</font>

<br />
<br />

あとがき
これがスマートで正しい解決策なのかは分からないが自分は解決することができたので、もし解決してない人がいれば参考にしてほしい。
[Swift] 同一ドメインでのユニバーサルリンク(Universal Links)は動作しないので注意

Web側とiOS側でユニバーサルリンクを設定したが何故か動作せず、調べたら同一ドメイン上では機能してくれない様でした。。
実装前の調査不足ということで、備忘録的なメモになります。

# 概要
* 同一ドメインではユニバーサルリンクは機能しない（アプリが起動しない）
* サブドメインを使った代替策

# 同一ドメイン上ではアプリへ遷移ができない
**ユニバーサルリンクは同一ドメイン上では動作しない**ため注意が必要です。
公式ドキュメントでも注意点として記載されていました。。
すでにWebで利用しているユーザーに対して急にアプリ起動したらUX的によろしくないのでAppleさんが制御しているらしいです。
（翻訳した自分の解釈が間違っていなければ）
>**Support Universal Links**: 
>https://developer.apple.com/library/archive/documentation/General/Conceptual/AppSearch/UniversalLinks.html

サブドメインをリンク先に設定することで、ユニバーサルリンクを有効にすることができます。
とはいえ、サブドメインで分けるほどのページではないがユニバーサルリンクを有効にしたい場面があるかと思います。
次では、見た目上は同一ドメインでユニバーサルリンクが動作する例を紹介します。

## 代替策
同一ドメインではユニバーサルリンクは無効ですが、サブドメインなどに遷移先を設定すれば有効になります。
以下例では、見た目上は同一ドメインでの遷移ですがユニバーサルリンクをサブドメインとしている代替策になります。

```
# shop一覧画面(www.hoge.com)から詳細画面を開く場面を想定しています。
# 詳細画面のリンク先をサブドメイン(shop.hoge.com/shop_id)として設定。
# リンク先のサブドメインはリダイレクト先として詳細画面(www.hoge.com/shop/shop_id)を設定。
# 設定したリンクはユニバーサルリンクとして設定しているため、アプリが起動します。
# アプリ未インストール＆Webでの表示では、リダイレクト先の画面(www.hoge.com/shop/shop_id)が表示されます。
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416607/d463319c-437d-0b1a-37ce-efee55f7c1e3.png)

# まとめ

*  ユニバーサルリンクは同一ドメインでは機能しない
*  機能させるためには、サブドメインなど活用する（場面に応じてリダイレクト先を設定するなど対応する）
*  ユニバーサルリンクを使用しない方法（URLスキーム）で実装できないかを考える

記載した情報に誤り等ございましたら、ご指摘をいただけると幸いですmm
CakePHPハマったの対策

#はじめに
解決が根本的なものか定かではありません。
少し前に進む手助けとなると思って書いてます。

少しずつ増やしていきそうです！
ちょっとメモ的なので絵文字とかそんな多くないです。(｡･ω･｡)そこ？そこなのか！？？？

#早速


###Argument 1 passed to Cake\Http\Session::_overwrite() must be of the type array, null given, called in /var/www/html/vendor/cakephp/cakephp/src/Http/Session.php on line

内容:overwriteの関数、配列入れるじゃないとダメなんですが、、、nullあたえとるやろ！(｡･ω･｡)お怒りのようですね、、、

対策0:キャッシュのセッションIDが残っているから不都合起きているみたいなのでブラウザのキャッシュ削除。根本的な対策ではないですが、、

対策1:ファイル権限の問題の時にでました。

```
$ chmod 777 /Users/****/Docker/cakePHP/apach/html/tmp/cache/models/myapp_cake_model_default_articles_tags
```

※/Users/****/Docker/cakePHP/apach/html/は適宜変更
※myapp_cake_model_default_articles_tagsは適宜変更

を打つと左図から右図のようになります。
あ、なっていないのは全部やってください。

<img width="485" alt="スクリーンショット 2020-03-15 2.44.58.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133940/f9377909-8ebe-178e-81c3-f90c9eb626fb.png">

###SQLSTATE[42S02]: Base table or view not found: 1146 Table 'mydb01.user_sessions' doesn't exist
対策0:
そもそもテーブルがないかもしれないのでテーブルがあるかの確認。

対策1:
内容:user_sessionsっていう感じのtabelやviewありません！！(｡･ω･｡)ふ〜〜〜ん

対策:user_sessionsのテーブルないならそこを探さないようにしました。強行突破！

```
'handler' => [
    'engine' => 'DatabaseSession',
    'model'  => 'UserSessions'  // DB table name is user_sessions
],
```

のような記述場所あるので以下のようにコメントアウト


```
'handler' => [
    //'engine' => 'DatabaseSession',
    //'model'  => 'UserSessions'  // DB table name is user_sessions
],
```

https://book.cakephp.org/4/ja/development/sessions.html
は読んでおいた方が良さそう、、、

対策2:

変なところで`pr();`的にデバッグ入れてるとでました。


###SQLSTATE[HY000]: General error: 8 attempt to write a readonly database
:fearful:エラー内容あっているか少し不安

内容:書き込みたいのに読み取り専用になってる！どないしよ！(｡･ω･｡)どないしよ！

対策:書き込みできるように権限を与える

```
$ chmod -R 777 /Users/***/Docker/cakePHP/apach/html/sample/tmp
```

```
$ chmod -R 777 /Users/***/Docker/cakePHP/apach/html/sample/logs
```

※/Users/***/Docker/cakePHP/apach/html/sample/は適宜変更

ちなみにDockerにあるからとDockerコンテナ中で行っているかもですが私の場合macにフォルダがあるのでmacの方から権限変更しないとダメでした。確か、、、

さらにちなみにこれ公式にも書いてあります以下
https://book.cakephp.org/4/ja/installation.html#id8
>CakePHP は、幾つかの操作のために tmp ディレクトリーを使用します。 モデルの定義や、ビューのキャッシュ、セッション情報などです。 logs ディレクトリーは、デフォルトの FileLog エンジンがログファイルを 出力するために使われます。

>そのため、 CakePHP をインストールしたら logs, tmp ディレクトリーと その全てのサブディレクトリーに、ウェブサーバーの実行ユーザーによる書き込み権限があることを 必ず確認してください。


#ちなみに全画面以下感じです！
<img width="558" alt="スクリーンショット 2020-03-20 22.15.25.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133940/13e9a2e5-ef0c-5610-6af0-854171d9b07c.png">


#終わりに
あとなんでCakePHPでlaravelとかでないかって？？？
CakePHPという名前の方が断然私とあうと思ったから。ケーキ！ケーキ！
と言うのとCakePHPの方がドキュメント多そうって。
っと思ったけどってなったので自分で記事をあげるといったやつです(o*｡_｡)o
というかPythonのDiangoとCakePHPで悩んでいて、もし誰かと何かやるってなった時CakePHPの方がなんか色々な面で良さそうかなと。自分の将来的な価値？より誰かとやりやすそうな方を優先しました。一緒にやってくれる人がいたらの話ですが、、、。