OmniAICreator/Qiita-1.07M huggingface dataset:
EC2のEBS拡張

EC2のEBSのボリュームを拡張する話です。


```bash
[]$ df -h
ファイルシス   サイズ  使用  残り 使用% マウント位置
devtmpfs         2.0G     0  2.0G    0% /dev
tmpfs            2.0G   92K  2.0G    1% /dev/shm
tmpfs            2.0G  448K  2.0G    1% /run
tmpfs            2.0G     0  2.0G    0% /sys/fs/cgroup
/dev/xvda1       100G   27G   74G   27% /
tmpfs            395M     0  395M    0% /run/user/40503
```

パーティションを拡張する

```bash
[]$ sudo growpart /dev/xvda 1
CHANGED: partition=1 start=4096 old: size=209711071 end=209715167 new: size=314568671 end=314572767

[]$ sudo xfs_growfs /dev/xvda1
meta-data=/dev/xvda1             isize=512    agcount=51, agsize=524159 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=1 spinodes=0
data     =                       bsize=4096   blocks=26213883, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal               bsize=4096   blocks=2560, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
data blocks changed from 26213883 to 39321083
```

結果

```bash
[togo-ma@diva-dev-ap01-al2 ~]$ df -h
ファイルシス   サイズ  使用  残り 使用% マウント位置
devtmpfs         2.0G     0  2.0G    0% /dev
tmpfs            2.0G   92K  2.0G    1% /dev/shm
tmpfs            2.0G  448K  2.0G    1% /run
tmpfs            2.0G     0  2.0G    0% /sys/fs/cgroup
/dev/xvda1       150G   27G  124G   18% /
tmpfs            395M     0  395M    0% /run/user/40503
```
.htaccess【第二弾】

.htaccess導入の第二弾です。

今回のケースは、
・404や500などのエラーページで任意のページを表示させたい時
・html、phpの拡張子を消して、urlの末尾にスラッシュを付与する

###404や500などのエラーページで任意のページを表示させたい時

構文例

```
ErrorDocument 401 /err/401.html
ErrorDocument 403 /err/403.html
ErrorDocument 404 /err/404.html
ErrorDocument 500 http://www.example.jp/error/err5.html
ErrorDocument xxx yyyyyyyyyy
```

参考サイト
https://htaccess.cman.jp/explain/error_page.html


###html、phpの拡張子を消して、urlの末尾にスラッシュを付与する

構文例

```
RewriteCond %{REQUEST_URI} (.*)/$
RewriteCond %{REQUEST_FILENAME}\.html -f
RewriteRule (.*)/$ $1.html [L]

RewriteCond %{REQUEST_URI} (.*)/$
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule (.*)/$ $1.php [L]

RewriteCond %{REQUEST_URI} (.*)/$
RewriteCond %{REQUEST_FILENAME}\.cgi -f
RewriteRule (.*)/$ $1.cgi [L]

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.html -f [OR]
RewriteCond %{REQUEST_FILENAME}\.php -f [OR]
RewriteCond %{REQUEST_FILENAME}\.cgi -f
RewriteRule .* %{REQUEST_FILENAME}/ [R=301,L]
```

公式サイト
https://www.it-swarm-ja.tech/ja/mod-rewrite/url%E3%81%AE%E6%9C%AB%E5%B0%BE%E3%81%8B%E3%82%89%E6%8B%A1%E5%BC%B5%E5%AD%90%E3%82%92%E5%89%8A%E9%99%A4%E3%81%97%E3%80%81%E6%9C%AB%E5%B0%BE%E3%81%AE%E3%82%B9%E3%83%A9%E3%83%83%E3%82%B7%E3%83%A5%E3%82%92%E5%BC%B7%E5%88%B6%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95%E3%81%AF%EF%BC%9F/957355484/



以上
kubectl --dry-runの実行時、Warningが表示される場合

# 環境
kubectl version 1.19

# 内容
オプション `--dry-run`をつけてyamlを生成するなどの場合にWarningが表示されます。

``` 
$ kubectl run test --image=nginx --dry-run -o yaml
W1007 01:09:39.889757   15904 helpers.go:553] --dry-run is deprecated and can be replaced with --dry-run=client.
```

`--dry-run`だけでは非推奨になっているので `--dry-run=client`に変更すればよい

```
$  kubectl run test --image=nginx --dry-run=client -o yaml
apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: null
  labels:
    run: test
  name: test
spec:
  containers:
  - image: nginx
    name: test
    resources: {}
  dnsPolicy: ClusterFirst
  restartPolicy: Always
status: {}
```
markdownのスニペット登録

# はじめに

VSCodeを使ってマークダウン形式でミーティングの議事録をとる機会が増えたので、スニペット機能を使ってテンプレートを登録したい。
ということで登録していったが、１箇所詰まったので、備忘録として残す。

# サンプルコード
## スニペットの登録

VSCodeの設定から、スニペットの設定＞markdown.json、を探す。
以下のようなスニペットのサンプルが記載されたファイルが見つかるはず。

```json:snippets/markdown.json
{
  // Place your snippets for markdown here. Each snippet is defined under a snippet name and has a prefix, body and 
  // description. The prefix is what is used to trigger the snippet and the body will be expanded and inserted. Possible variables are:
  // $1, $2 for tab stops, $0 for the final cursor position, and ${1:label}, ${2:another} for placeholders. Placeholders with the 
  // same ids are connected.
  // Example:
  // "Print to console": {
  // 	"prefix": "log",
  // 	"body": [
  // 		"console.log('$1');",
  // 		"$2"
  // 	],
  // 	"description": "Log output to console"
  // }
}
```

上記ファイルを下記のように修正する。

```json:snippets/markdown.json
{
  "Minutes template": {
    "prefix": "minutes",
    "body": [
      "# $1 Daily MTG",
      "## 議題",
      "- $2",
      "- $3",
      "- $4",
      "",
      "## $2",
      "- ",
      "",
      "## $3",
      "- ",
      "",
      "## $4",
      "- ",
      "",
    ],
    "description": "Daily MTG minute"
  },
```

## Markdown形式のファイルでスニペットを使えるようにする（必要であれば）

スニペットを登録すればすぐに使える場合もあるが、自分の環境では使えなかった。
解決策として、VSCodeのsettings.jsonファイルにmarkdownについて追記したら使えるようになった。

```json:settings.json
{
    "workbench.startupEditor": "newUntitledFile",
    "editor.tabSize": 2,
    "editor.suggestSelection": "first",
    "vsintellicode.modify.editor.suggestSelection": "automaticallyOverrodeDefaultValue",
    "java.home": "",
    "window.zoomLevel": 0,
    // 以下を追加
    "[markdown]": {
        "editor.wordWrap": "on",
        "editor.quickSuggestions": true,
        "editor.snippetSuggestions": "top",
    }
}
```

# 動作

1. ``minutes``と入力して、登録したスニペットを呼び出す
2. ``$1``に設定した項目に入力後、tabキーを押して次の``$2``を入力…（以下略）

![demo01.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363036/714c275d-cbdf-a1be-d2f0-7fd2830573ad.gif)

# 参考
- [Snippets in Visual Studio Code](https://code.visualstudio.com/docs/editor/userdefinedsnippets)
- [Visual Studio Code で markdown のスニペットを登録する | コーヒー飲みながら仕事したい](https://coffee-nominagara.com/2019-01-25-094628)
Djangoで画像がアップロードされていない時とされているときの条件分岐

#書いた理由
Djangoでメッセージアプリを作っているとき、アイコン画像の表示に苦労したため。

#例について
ユーザーがアイコン画像を設定しているときはその画像を表示し、アイコン画像が設定されていない時はデフォルトの画像を表示するようにした。
以下、変数の説明。
friend:ユーザー一人一人の名前やアイコン画像などの情報が格納されているUserオブジェクトのインスタンス。
friend.img:friendのうち、そのユーザーの画像のデータ。
person.png:デフォルトのアイコン画像。

#やり方

```python:index.html
{% if friend.img %}
<img src="/media/{{ friend.img }}" alt="icon" width="30vw" height="30vh">
{% else %}
<img src="/media/img/upload/person.png" alt="icon" width="30vw" height="30vw">
{% endif %}
```

if文でfriend.imgとするだけで、「画像がアップロードされているときは以下の処理を実行する」という意味になるらしい。
{% if friend.img != None %}とか試したけど、そんなことをする必要はないようです。

間違って理解している部分があったらご指摘お願いします！
RemoveDuplicatesで動的配列を使用する

特定の列を指定するのではなく、全列で重複を削除するケース
単にColumns:=arrで失敗したので対処方法を調査。
CvarでVariantをVariantに変換。。。
うまくいったみたいです。

```VBA
'選択範囲の全列で重複を削除
Sub Selection_RemoveDuplicates()
    
    With Selection
        
        Dim i As Long
        Dim arr As Variant
        
        ReDim arr(.Columns.Count - 1)
        For i = 0 To UBound(arr)
            arr(i) = i + 1
        Next
        'ヘッダーはYesにしているがケースバイケースならGuessでも。
        .RemoveDuplicates Columns:=CVar(arr), Header:=xlYes
        
    End With

End Sub
```
俺のスプレッドシート

この記事は移行しました！[最新の内容はこちら](https://naoqoo2.github.io/blog/%E4%BF%BA%E3%81%AE%E3%82%B9%E3%83%97%E3%83%AC%E3%83%83%E3%83%89%E3%82%B7%E3%83%BC%E3%83%88/)をご覧ください😀

個人的によく使うスプレッドシートのカスタム書式、関数などのメモ

# 条件付き書式

## とある列が「完了」の行の背景色を変えたい

`=$K2="完了"`

<img width="200px" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/56789/98fff249-00fd-db92-20dc-c13a64ca2fe5.png">

# フィルタ

## 日付が空 または 指定日より大きい行を抽出したい

`=OR($L2="", $L2>DATE(2020,9,30))`

<img width="200px" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/56789/8e53dd72-70e9-9cd1-2196-f8213f65ee3c.png">

# ハイパーリンク

## 一括で大量にハイパーリンクを作りたい

最終的にセル参照を使いたくないのでハイパーリンク関数の文字列 `=HYPERLINK("URL", "テキスト")` を作る手順

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/56789/2f312a1a-d795-41ed-0114-08e5b573d799.png)


1. A, B列にタイトルとURLを書く
2. C列でハイパーリンクの文字列を作る  
`="=HYPERLINK(""" & B2 & """,""" & A2 & """)"`
3. C列をコピーして任意のセルに「値のみ貼り付け」
4. ハイパーリンクと認識されず文字列のまま表示されるので、「表示形式→自動」を再選択すればOK
![capture.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/56789/4fc3fe51-5c0f-2798-86f1-f76fcdf9807c.gif)


## シート名でシートへのリンクを作る（もくじとか）

- Aセルにシート名を入力
- Bセルに関数でハイパーリンクを設置
    - `=HYPERLINK("#gid="&getSheetId(B2),"Link")`

# セル
## 現在のシート名を表示する

`=getSheetName()`
【こりゃ便利！】SLACK便利機能 10選（補足：ブックマーク編）

さて今回私がご紹介するのは、以前**「こりゃ便利！Slack便利機能 10選(その１）」**でご紹介させていただいた、こりゃ便利な機能の１つ、**ブックマーク機能**の補足的ご紹介となります。
前回までの記事はこちらをご覧ください。<br>[【こりゃ便利！】Slack便利機能 10選（その１）][1]
[1]:https://qiita.com/takeC74/items/d91022d6727bd248b194
[【こりゃ便利！】Slack便利機能 10選（番外編）待望のカスタムセクション機能][2]
[2]:https://qiita.com/takeC74/items/9fa51adf8ca74d8fb7a1
[【こりゃ便利！】Slack便利機能 10選（その２）][3]
[3]:https://qiita.com/takeC74/items/5bd2f6b433c7874146df

#▼こりゃ便利５_ブックマーク（再掲＋今回の補足）
[【こりゃ便利！】Slack便利機能 10選（その１）ブックマーク][4]
[4]:https://qiita.com/takeC74/items/d91022d6727bd248b194#%E3%81%93%E3%82%8A%E3%82%83%E4%BE%BF%E5%88%A9%EF%BC%95_%E3%83%96%E3%83%83%E3%82%AF%E3%83%9E%E3%83%BC%E3%82%AF]

※「後でじっくり読みたい」、「このメッセージ忘れちゃダメだ、大事」というようなメッセージは「ブックマークに登録」を付けておきましょう。<br>左画面の「ブックマーク」にメッセージが集約されるので便利です。ブックマークが必要無くなったら「ブックマークから外す」こともできます。<br>![pic_ブックマーク_１.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/656547/ae76831b-c048-955d-9f7f-0a7ea7755cce.png)
<br>![pic_ブックマーク_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/656547/9f6c6960-dcb4-4471-2826-e460016827e9.png)
<br>

で、ココからが今回の補足です。
「ブックマーク」画面の右上に、「右側にドッキングする」ってアイコンがありますよね。![pic1_mask_korya_bookmark.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/656547/c72492d1-3d59-8734-df76-5a35be51a482.png)
こいつをクリックすると、Slackの右側にブックマークしたスレッドがいつでも表示されるようになるんです。（下の図の丸１）こりゃ便利！
![pic2_mask_korya_bookmark.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/656547/4688fed1-3822-507a-cf54-e1951480a811.png)

で、右側に表示されたブックマークされた任意のスレッドをクリックすると、真ん中のメインページの画面は、該当チャンネルの該当スレッドへジャンプします。（上の図の丸２）

これで、ブックマークしたスレッドの前後のやりとりが直ぐに確認できるので、こりゃ便利！

更に、用が済んだら右側のブックマーク一覧の画面でブックマークを外すと、該当スレッドが外れます。（上の図の丸３）

こりゃ便利！ですねー。私は最近、この機能を利用して、自分のTodo管理に利用しています。
（思いついたらTodoとして書く。そしてブックマークしておく。→ブックマークを確認→Todoこなしたらブックマークを外す）

Slackってどんどん流れちゃうし、使いだすとチャンネルがたくさん増えていくので、この機能を使えば、いちいち検索とか、チャンネル移動とか、縦スクロールとかしなくて良くなります。

#【こりゃ便利！】SLACK便利機能 10選（補足：ブックマーク編）は以上です
皆さん、いかがでしたでしょうか？
とても実用的だと思いましたので、補足としてご紹介させていただきました。
Slackのチャンネル数が増えすぎて困っているよって人は、[【こりゃ便利！】Slack便利機能 10選（番外編）待望のカスタムセクション機能][2]　も是非ご覧ください。スッキリしますよー。
[2]:https://qiita.com/takeC74/items/9fa51adf8ca74d8fb7a1
*「知らなかった、こりゃ便利！」*とか、*「こんな風に使ってみたよ」*とか、*「このやり方の方が便利だよ」* などなど、皆さんからのご意見、ご感想を頂けると幸いです。　<br>他にも「こりゃ便利！」な機能がありましたら是非教えてください。<br>
<br>以上、最後までお読みいただきありがとうございました。
moodle csvでのユーザー取り込みを極める

moodleは最もポビュラーなe-learningオープンソースで、JobRainbowのD and I クラウドでも利用されています。

moodle バージョン：Moodle 3.8

# 目標

一つのコースしか利用しない前提のユーザーリストをcsvファイルから取り込む


## 参照ドキュメント

2020年10/07現在

* Upload users : https://docs.moodle.org/38/en/Upload_users
* 日本語版：https://docs.moodle.org/3x/ja/%E3%83%A6%E3%83%BC%E3%82%B6%E3%81%AE%E3%82%A2%E3%83%83%E3%83%97%E3%83%AD%E3%83%BC%E3%83%89

## やりたいこと

1. 新規ユーザーの登録
2. ユーザー登録時にメールは飛ばさない


## 前提知識

### ユーザー認証の種類

* 手動アカウント
    * 管理者による登録
* ログインなし
* Eメールによる自己登録
    * Create new account ボタンにより、自分のアカウントを作成する方法
* SSO(外部CASサーバー)
    * CASはSSOのプロトコルの一つ：Central Authentication Service の略
* 外部データベース
    * 外部のデータベースにusername, passwordフィールドを持つ方法
* LDAP連携
* LTI
    * IMS Global Learning Consortiumによる Learning Tools Interoperablity 規格(?)
* MNet認証
    * Moodleの共通認証
* 認証なし
    * テスト目的や、外部から接続できない状態のときに使う
* Shibboleth
    * SSOのオープンソース
* ウェブサービス認証

## ファイルによるユーザーアップロード
いわゆるcsvファイルでユーザーをアップロードできます。文字コードはShift-jisでもUTF-8で取り込み時の設定で何とかなります

サイト管理上の ユーザー > アカウント > ユーザーをアップロードする からアップロードします

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42407/defac51c-2aef-c7af-00e8-438d604c8721.png)

### 手順
1. 登録したいコースを準備:　「コース省略名」がcsvファイルに必要になります
2. グループ・コーホートを作ることをお勧めします（理由は後述）、グループはコースの 「コース管理」>　「ユーザー」 > 「グループ」から
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42407/a015a649-5938-8957-8910-cb95873b36d4.png)

3.　グループ タブで、「グループを作成する」ボタンからグループを作ります 「グループ名」がCSVファイルで必要になります
4.　コーホートは サイト管理 > ユーザー の「コーホート」で登録します
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42407/acc83570-7a76-31b2-dbbf-d6fe9391c065.png)

5.　「新しいコーホート」を追加するで、コンテクスト=システム で、名称とコーホートIDを設定しますcsvファイルには 「コーホートID」が必要になります
6.　コース内で、学生として登録するのか、教師として登録するのか、割り当てるロールの省略名を確認します サイト管理 > ユーザ > パーミッション > ロールを定義する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42407/483ed8ba-db70-8160-3fdf-a169753da015.png)



### 最低限必要なフィールド

* username
* firstname
* lastname
* email

### その他追加可能なフィールド

* password
* 組み込みユーザー属性：institution,department,city,country,lang,auth,timezone,idnumber,icq,phone1,phone2,address,url,description,mailformat,maildisplay,maildigest,htmleditor,autosubscribe,interests,theme
* カスタムプロフィール: profile_field_xxxxx
* 登録用: course1,type1,role1,group1,enroltimestart1,enrolperiod1,enrolstatus1,course2,type2,role2,group2,enroltimestart2,enrolperiod2,enrolstatus2

#### パスワードについて

* 必要に応じてパスワードを作成してメールで送信する
    * パスワードに "to be generated"とセットされ、cronジョブで判断されメールが送信される
    * mdl_user_preferences の create_password = 1のデータから、user_idを取得する
    * lib\classes\task\send_new_user_passwords_task.php
    * lib\moodlelib.php → setnew_password_and_mail でメールが送られる
* ファイルのパスワードフィールドを使用する
が選択できます

パスワードのデフォルト最低要件

* 長さ8文字
* 数字、大文字、小文字、記号を最低ひとつずつ含むこと

→ 個人てきには
* 数字・小文字を含む、最低8文字 でいいのかなと・・


#### アカウント作成とともにコースに登録する→登録用フィールドを使う
テスティングフレームワークは何を使うと良いか【Rails】

# はじめに

テストやら、細かいセキュリティ的な部分の実装はまだ課題として残したまま、とりあえず先日AWSでアプリケーションを公開しました。

というわけで無事公開したのだが、やはりテストを実装しないといけないので、テストについて調べてみました。

調べた結果RSpecをまず学習したほうが効率が良いという結論に至りました。

調べた内容は下記に列挙します。

- テストとは何か
- Railsで実装されるテスティングフレームワークとは何か
- ネット上で見つけたテスティングフレームワーク3種類の簡単な概要
- 多く使われているテスティングフレームワークとは何か



# テストとは

アプリケーションを本番環境のサーバーで動作させるためには、そのアプリケーションのコードが仕様通りに欠陥(バグ)なく動作している必要があります。

テストとは、そのアプリケーションのコードが仕様通りに動作していることを確認し、バグを見つけ出ことです。

バグを見つけ出すことで、そのバグを修正(デバッグ)します。

> 参考：[https://ja.wikipedia.org/wiki/ソフトウェアテスト](https://ja.wikipedia.org/wiki/%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2%E3%83%86%E3%82%B9%E3%83%88)

# テスティングフレームワーク

テストは、テスティングフレームワークというもので実行されます。

Railsのアプリケーションで使用するテスティングフレームワークは様々あります。

下記にいくつかのテスティングフレームワークを概要・特徴とともに列挙していきます。

- Minitest
- RSpec
- test-unit

## Minitestの概要

MinitestとはRubyに標準で備わっているテスティングフレームワークです。

標準で備わっているため、gemを追加する必要もなく、テストを行うことができます。

[Railsガイド](https://railsguides.jp/testing.html)([英語版](https://guides.rubyonrails.org/testing.html))にドキュメントが掲載されています。

> 参考：[https://railsguides.jp/testing.html](https://railsguides.jp/testing.html)

## RSpecの概要

RSpecとは、Ruby向けBehaviour-Driven Developmentツールのテスティングフレームワークです。

[rspec-rails](https://rubydoc.info/gems/rspec-rails/frames)にドキュメントが掲載されています。

> 参考：[https://relishapp.com/rspec](https://relishapp.com/rspec)

## test-unitの概要

test-unitとは、Ruby用のxUnit系の単体テストフレームワークです。

[Ruby用単体テストフレームワーク](https://test-unit.github.io/ja/index.html)にドキュメントが掲載されています。

> 参考：[https://test-unit.github.io/ja/index.html](https://test-unit.github.io/ja/index.html)

## 多く使われているテスティングフレームワークは何か

3つ見つけ出したが、エンジニアにとっては、ネット上にある知見の量や、デファクトスタンダードは何かを踏まえた上で何を使用するのがふさわしいのかを見極める必要があります。
と、いうことで、どれが一番使用されているか下記の条件で調べてみました。

- Qiitaは、「Minitest tag:rails」という形式で検索した記事の件数
- GitHubは、言語をRubyにし、検索したリポジトリの件数
- 執筆(2020年10月6日)時点の結果です。


| テスティングフレームワーク | Qiita | GitHub | 
| -------------------------- | ----- | ------ | 
| Minitest                   | 366   | 955    | 
| RSpec                      | 2151  | 11306  | 
| test-unit                  | 428   | 921    | 

上記の表が絶対というわけではないのですが、RSpecが一番利用されているようです。

確かにRSpecという単語はよく目にしますので、納得はしました。

# まだ良く理解できていない点

テスティングフレームワークのそれぞれの違いや、特徴など、BDD、xUnit系とは何かなど、まだ明確になっていませんが、今回はこの細かい部分の深堀りや辞めておきます。

テスティングフレームワークはRSpecが一番利用されているようなので、まずそちらを実際に使って、どのようなものか知見を蓄積してみようと思います。

全部実際に使って比較しても効率悪いし。

# まとめ

ということで、まずはRSpecの学習を進めてみる、という結論に至ったお話でした。
Python: Brent法で露出管の限界座屈圧力に対する必要板厚を求める

続けざまだが、必要に迫られて作っている、Brent法による数値計算事例をもう一つアップしておく。「Python便利！」である。

露出型水圧鉄管の限界座屈圧力は以下の式で計算される。


```math
\begin{equation}
p_k=\cfrac{2\cdot E_s}{1-\nu_s{}^2}\cdot \left(\cfrac{t}{D_0'}\right)^3
\end{equation}
```

<table>
<tr><td>$p_k$</td><td>鉄管の限界座屈圧力</td></tr>
<tr><td>$t$</td><td>板厚（余裕厚を除く）</td></tr>
<tr><td>$D_0'$</td><td>設計外径</td></tr>
<tr><td>$E_s$</td><td>鉄管の弾性係数 (=206,000MPa)</td></tr>
<tr><td>$\nu_s$</td><td>鉄管のポアソン比 (=0.3)</td></tr>
</table>

ここで、通常余裕厚は、$\epsilon=1.5 mm$ とされ、余裕厚を含む設計板厚 $t_0$ および設計外圧 $D_0'$ は以下の通り計算される。

```math
\begin{equation}
t_0=t+\epsilon \qquad
D_0'=D_0+t_0
\end{equation}
```
ここに、$D_0$ は設計内径である。

露出型水圧鉄管の場合、抜水時などへの万が一の対応として、0.02MPaの外圧（実質は負圧）に耐えられるよう設計することが水門鉄管技術基準で定められている。これに対する必要板厚は、安全率1.5を見込んで、限界座屈圧力 $p_k=0.03 MPa$ 以上となるよう板厚を定める必要がある。

ここでは、与えられた限界座屈圧力を満足する板厚をBrent法によって計算することを考える。
限界座屈圧力算定式を変形し、以下の $f=0$ となる非線形方程式を $t$ について解けば良いことになる。

```math
\begin{equation}
f=p_k-\cfrac{2\cdot E_s}{1-\nu_s{}^2}\cdot \left(\cfrac{t}{D_0+t+\epsilon}\right)^3=0
\end{equation}
```
Brent法での解法に必要な２つの初期値は、プログラム中で、```t1=1.0, t2=50.0``` として与えている。


プログラム事例を以下に示す。

```python
import numpy as np
from scipy import optimize


def func(t,d0,eps,pk):
    Es=206000 # elastic modulus of steel
    po=0.3    # Poisson's ratio of steel
    f=pk-2*Es/(1-po**2)*(t/(d0+t+eps))**3
    return f


def main():
    d0=4000.0 # internal diameter of penstock
    eps=1.5   # corrosion alloowance
    pk=0.02   # critical buckling pressure
    t1=1.0    # initial value for Brent method
    t2=50.0   # initial value for Brent method
    tt=optimize.brentq(func,t1,t2,args=(d0,eps,pk))
    t0=np.ceil(tt+eps) # required plate thickness
    print('t + eps=',tt+eps)
    print('t0=',t0)


#==============
# Execution
#==============
if __name__ == '__main__': main() 
```

計算結果は以下の通り。

```
t + eps= 15.695548237490522
t0= 16.0
```



That's all. 
Thank you.
BigQueryの取り込み時間パーティションテーブルのスキーマ更新手順メモ

# 背景
取り込み時間パーティションテーブルにおけるスキーマ変更作業は非常に面倒。
クエリを使った削除や、GCSを経由するLoadジョブだとパーティション情報は失われてしまうので使えない。
[テーブル スキーマからの列の削除](https://cloud.google.com/bigquery/docs/manually-changing-schemas?hl=ja#deleting_a_column_from_a_table_schema)

今回はINSERT(..., _PARTITIONTIME) を使ってパーティション情報を維持したまま、スキーマを更新する手順をメモしていく。

# 手順流れ
1. 一時テーブル作成
2. insert用SQLの作成 & 実行
3. テーブルの置き換え & バックアップ

# 一時テーブルの作成
更新後のスキーマとなる一時テーブルを作成していく。

まずは、対象のテーブルのスキーマを取得

```sh
bq show --schema --format=prettyjson dataset.target_table > schema.json
```

次に、schema.jsonを開いて更新したいテーブル定義に編集する。schema_updating_columnというカラムをSTRING -> INTEGERに変更する想定する。

```json:schema_edit_sample.json
[
# ~略~
{
        "type": "INTEGER", # STRINGから変更
        "name": "schema_updating_column",
        "mode": "NULLABLE"
    },
# ~略~
]
```

編集したschema.jsonで一時テーブルを作成する。

```sh
bq mk --time_partitioning_type=DAY --table dataset.tmp_target_table ./schema.json
```

# insert用のSQLの作成&実行

まずは対象テーブルのカラム一覧を取得する。
カラム数が多い場合は以下のようなSQLでカラム一覧を取得してもいい。
この時更新対象のカラム(schema_updating_column)を一覧から外しておくと便利。

```sql
SELECT
  ARRAY_TO_STRING(ARRAY_AGG(column_name), ', ')
FROM dataset.INFORMATION_SCHEMA.COLUMNS
WHERE table_name="target_table"
AND column_name != 'schema_updating_column'
```

これを元にINSERT用のSQLを作成。schema_updating_columnはINSERTの最後尾に追加。SELECT側でcastしておく。

```sql
INSERT INTO dataset.tmp_target_table (column1, column2, ... ,_PARTITIONTIME, schema_updating_column)
SELECT column1, column2, ... _,PARTITIONTIME, cast(schema_updating_column as INT64) FROM dataset.target_table
```

これを実行すると、一時テーブルにschema更新されたテーブルがパーティション付きでインサートされる。

# テーブルの置き換え & バックアップ

target_table と tmp_target_table でデータに差異がないかを確認する。 
例えば、テーブル全体件数や、パーティションごとのデータ件数が同じか確認する。
問題なければ、テーブルの置き換え作業に入る。

まず念のため、target_tableをバックアップとっておく。これはBigQueryのコピー機能を使って別名で保存しておけばいい。

バックアップをとったら、置き換えのためにtarget_tableを削除する。

最後に、tmp_target_tableをtarget_tableに置き換える。これも、コピー機能を使って、tmp_target_tableをtarget_tableとしてコピーして、tmp_target_tableを削除すればいい。

# 参照
[BigQueryの取り込み時間パーティションテーブルのカラム削除](https://qiita.com/munaita_/items/d7524ba49a6a971666f5)
Rails 並び替え機能の実装（likeの数順に表示）

#前提条件
・railsを用いたアプリケーション
・Recipeモデルはhas_many で　Likeモデルと紐づいている。

```recipe.rb
has_many :passive_likes, class_name: "Like",
                 foreign_key: "liked_id",
                 dependent: :destroy
```

```like.rb
class Like < ApplicationRecord
  belongs_to :liker, class_name: "User"
  belongs_to :liked, class_name: "Recipe"
  validates :liker_id, presence: true
  validates :liked_id, presence: true
end
```

#したいこと
・Recipeモデルに紐づくLikeモデルのliked_idの数（count）に順じて降順で表示
　される様に並び替えしたい。
 

#1. Recipeのindexテンプレートのpathにオプションをわたす。

```app/views/recipes/index.html.erb
      <p><%= link_to "Recent",   recipes_path(option: "recent") %></p>
      <p><%= link_to "Popular",   recipes_path(option: "popular")%></p>
```
→"Recent"をクリックする＝＞オプションで"recent"が渡される。
 "Popular"をクリックする＝＞オプションで"pupular"が渡される。

#2.渡されたオプションに即したcontrollersの条件分岐

```app/controllers/recipes_controller.rb
def index
    if params[:option] == "recent" || params[:option] == nil
      @page_title = "Recent Recipes"
      @recipes = Recipe.all.order(created_at: :desc).paginate(page: params[:page])
    elsif params[:option] == "popular"
      @page_title = "Popular Recipes"
# RecipeとLikeテーブル（has_many :passive_likes）を融合する。→Likeテーブルのliked_id(==Recipe.id)でグループカする。（複数あっても1個にまとめる。）→その数をベースに降順に並び替えする。→その中でも新しい物を先にする。→{recipe.id: liked_idの数}のハッシュが帰ってくる。（liked_idの数量を基準にした降順　＋　その中でも新しいものが先に。）
      recipes_hash = Recipe.joins(:passive_likes).group("liked_id").order('count_all DESC').order(created_at: :desc).count 
#recipe.hashのキーのみの配列（array）にする。
      recipe_ids = recipes_hash.keys　
#recipe_idsの順番のままRecipeを配列で返す。
      recipe_array = Recipe.find(recipe_ids).sort_by{ |recipe| recipe_ids.index(recipe.id)} 
#KaminariGemを活用しrecipe_array(liked_idの数の降順とcreated_atの降順)の順番のまま`@recipes`にrecipeの配列を代入する。
      @recipes = Kaminari.paginate_array(recipe_array).page(params[:page]).per(20)　
    end
  end
```

#3. Kaminariが使える様に　Kaminari Gemをインストールする。
　→Arrayでページネーションが可能になる。

#4. Recipe.rbに記載していた`default_scope -> { order(created_at: :desc) }`を削除する。

#5. 必要に応じて各コントローラーの`@recipes`に`order(created_at: :desc)`を追加する。
線形回帰の幾何的な解釈


最小二乗法や最急降下法は知っている前提

知らなければ昔記事にしたので良ければそちらへ
[「最小二乗法・最急降下法」を動く図で理解する](https://qiita.com/Ringa_hyj/items/529ed71407cdec54a160)

最初から幾何の空間で考えられていたらこの記事は必要ない


#線形回帰のイメージ

私は最初こんなイメージでした



![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275572/f757916b-5e93-5b74-38ce-5bc019df0ca4.png)




・実測値のド真ん中(平均)を通る
・傾きβの直線を引いた時、実測値からの距離(予測誤差)の合計が最も小さい

そんな**"傾き"**を求めるものである
と思ってました(別に解釈の一つとして間違ってはいない。。と思う)



#Xという一次元上で考えてみると？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275572/da63741c-4d75-db10-609a-cd9bc4e5c262.png)

Y=βXとは、すなわち**定数倍したX**である

図のように平行で走る軸上がYであった時、Xを何倍にしたら尤もらしい値になるか
というのが回帰係数の役割である

実測値と予測値の**誤差**はどうしても出てくる
これはXに直交する軸の値であると考える(表現できない値は直行する軸に押し付ける)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275572/ef85e0f0-cfb7-47f8-12f6-6193c7e7a39e.png)


この誤差を最も最小にするのは、平行するYから垂直に下してきた時である
(三平方の定理的に)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275572/19d9473b-c73f-4b50-98c8-f5b952431103.png)


**垂直に下す**ことを実現させる**βを見つける**ために最小二乗法が実行される


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275572/efc56e93-dbdf-9dea-2fd9-b9eaeb1af525.png)



つまり、係数βは、Xで張る空間(Xの定数倍や線形和)へ実測値Yを垂直に正射影するためのベクトル
係数βは誤差を表現することはできないので、最終的にはXの張る平面空間上のベクトルである


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275572/387ed09b-18a5-b429-a24f-c031e08f8686.png)


#以上

という事を最近知ったので、なるべく図として表現しとく。
これを考えるとカーネル法の入門が楽になるので、次回続きで書く。
Python: Brent法で矩形断面の等流水深を計算する

先に紹介した不等流計算プログラム（常流計算）では、下流端協会での水位を指定する必要があり、それに等流水深を用いています。すなわち等流水深を知る必要があるわけです。
一応、非線形方程式を解くことになりますが、このような計算をサッとできるのが、Pythonのいいところだと思います。

矩形断面の等流水深計算のための基本式は以下の通り。

```math
\begin{gather}
Q=A\cdot v \\
v=\cfrac{1}{n}\cdot R^{2/3}\cdot i^{1/2} \\
R=\cfrac{b\cdot h}{b+2\cdot h}
\end{gather}
```

<table>
<tr><td>$Q$</td><td>(既知) 流量</td></tr>
<tr><td>$b$</td><td>(既知) 水路幅</td></tr>
<tr><td>$n$</td><td>(既知) マニングの粗度係数</td></tr>
<tr><td>$i$</td><td>(既知) 水路床勾配</td></tr>
<tr><td>$h$</td><td>(未知) 等流水深</td></tr>
</table>

前述式を $f=0$ の形に変形した以下の方程式を、$h$ について解きます。

```math
\begin{equation}
f=Q-\cfrac{b\cdot h}{n}\cdot \left(\cfrac{b\cdot h}{b+2\cdot h}\right)^{2/3}\cdot i^{1/2}=0
\end{equation}
```

今回のプログラムでは、```scipy.optimize.brentq``` を用いて解いています。
Brent法に与える解の初期値は、```h1=0, h2=10``` として与えています。

限界水深 $h_c$ の計算はおまけです。

プログラムは以下に示すとおり。

```python
# normal depth and critical depth of rectangular cross section
import numpy as np
from scipy import optimize


def cal_hc(q,b):
    # critical depth
    g=9.8
    hc=(q**2/g/b**2)**(1/3)
    return hc


def func(h,q,b,n,i):
    f=q-b*h/n*(b*h/(b+2*h))**(2/3)*i**(1/2)    
    return f    


def main():
    q=42.0  # discharge
    b=4.0   # channel width
    n=0.014 # Manning's roughness coefficient
    i=0.001 # invert gradient
    
    h1=0.0
    h2=10.0
    hh=optimize.brentq(func,h1,h2,args=(q,b,n,i))

    print('hn=',hh) # normal depth
    
    hc=cal_hc(q,b)
    print('hc=',hc) # critical depth
    
#==============
# Execution
#==============
if __name__ == '__main__': main()
```

計算結果は以下の通り。

```
hn= 3.866645305835682
hc= 2.2407023732785825
```

That's all.
Thank you.
Docker on Ubuntu18.04 on WSL2 と VSCode インストール手順

![Windows-10.0.19041](https://img.shields.io/badge/Windows-10.0.19041-brightgreen) ![WSL-2](https://img.shields.io/badge/WSL-2-brightgreen) ![Ubuntu-18.04 LTS](https://img.shields.io/badge/Ubuntu-18.04 LTS-brightgreen) ![docker-19.03.13](https://img.shields.io/badge/docker-19.03.13-brightgreen) ![Visual Studio Code-1.49.3](https://img.shields.io/badge/Visual Studio Code-1.49.3-brightgreen)
Windowsをクリーンインストールしまして、
よい機会なので VSCode with Docker on Ubuntu on WSL without Docker Desktop on Windows のインストール手順を覚書きしておきます
これが幸せかどうかは知らんけど

## 目指す姿
![Extensions - VSCode](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244948/13c04c01-f1c7-3e56-e6d4-59ae5962e398.png)
![Docker - VSCode](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244948/978b78aa-724a-5d6e-230e-7531c7f833be.png)

## wsl2をインストール
[一次情報](https://docs.microsoft.com/ja-jp/windows/wsl/install-win10)

1. PowerShell管理者

    ```powershell
dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
```
```powershell
dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
```
1. Windows再起動
1. PowerShell管理者

    ```powershell
wsl --set-default-version 2
```

## Ubuntu 18.04 LTS をインストール
1. [Microsoft Store](https://www.microsoft.com/store/apps/9N9TNGVNDL3Q) から入手とインストールと起動

## Docker をインストール
1. Install using the repository
  * [一次情報](https://docs.docker.com/engine/install/ubuntu/)

    ```bash
sudo apt-get update
```
```bash
sudo apt-get install \
    apt-transport-https \
    ca-certificates \
    curl \
    gnupg-agent \
    software-properties-common
```
```bash
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
```
```bash
sudo add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
   $(lsb_release -cs) \
   stable"
```
```bash
sudo apt-get update
```
```bash
sudo apt-get install docker-ce docker-ce-cli containerd.io
```
1. Post-installation steps for Linux
  * [一次情報](https://docs.docker.com/engine/install/linux-postinstall/)

    ```bash
sudo groupadd docker
```
```bash
sudo usermod -aG docker $USER
```
```bash
newgrp docker
```
2. Configuring remote access with daemon.json
  * [一次情報](https://docs.docker.com/engine/install/linux-postinstall/#configuring-remote-access-with-daemonjson)

    ```bash
sudo vi /etc/docker/daemon.json
```
```vim:/etc/docker/daemon.json
{
"hosts": ["unix:///var/run/docker.sock", "tcp://127.0.0.1:2375"]
}
```
```bash
sudo service docker restart
```

## 確認
```bash
$ docker --version
Docker version 19.03.13, build 4484c46d9d
```
```bash
$ sudo netstat -lntp | grep dockerd
tcp        0      0 127.0.0.1:2375          0.0.0.0:*               LISTEN      3973/dockerd
```

## Visual Studio Code をインストール
* [Visual Studio Code](https://code.visualstudio.com/docs/setup/windows)
* Extensions
  - [Remote - WSL](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-wsl)
  - [Docker](https://marketplace.visualstudio.com/items?itemName=ms-azuretools.vscode-docker)  
  ポイント！Docker拡張はLOCALでなくWSLにインストールする

以上
StructをJSON形式にして保存する

Structをデバイスに恒久的に保存します。
アプリを閉じてもデータは残ります。
![スクリーンショット 2020-10-07 6.45.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/b295b25a-3947-cbb0-2aca-3b99b5893160.png)
#手順

１、StructをCodableにして、JSON形式でエンコード、デコードできるようにする。

```swift
struct Chocolates: Codable {
    var milk: String = " Mild and sweet. "
    var bitter: String = " Taste for the adult. "
    var white: String = " It's okay once in a while. "

    var numberOfMilk:Int = 0
    var numberOfBitter:Int = 0
    var numberOfWhite:Int = 0

    init(numberOfMilk milk:Int,numberOfBitter bitter:Int,numberOfWhite white:Int){
        self.numberOfMilk = milk
        self.numberOfBitter = bitter
        self.numberOfWhite = white
    } // 初めて作る時用イニシャライザ

// ここから下がJSON形式にエンコード・デコードできるようにする部分

    var json: Data? { // 自身のJSONにエンコードされた形式を返す計算プロパティ
        return try? JSONEncoder().encode(self)
    }

    init?(json: Data) { // 保存されたJSON形式のDataをデコードしてStructを復元するイニシャライザ
        if let newValue = try? JSONDecoder().decode(Chocolates.self, from: json) {
            self = newValue
        } else {
            return nil
        }
    }
}

```

２、StructのJSONバージョンを作る

```swift
var chocolates = Chocolates(numberOfMilk: 3, numberOfBitter: 1, numberOfWhite: 2)
let json = chocolates.json
```

３、File Managerで書き込み先URLを作って書き込む

```swift
guard let url = try? FileManager.default.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: true).appendingPathComponent("chocolates.json") else { return }

do {
    try json.write(to: url)
} catch let error {
    print(error)
}
```

４、読み出し

```swift
guard let url = try? FileManager.default.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: false).appendingPathComponent("chocolates.json") else { return }

 do {
     let jsonData = try Data(contentsOf: url)
     var readChocolates = Chocolates(json: jsonData)
} catch let error {
     print(error)
}

```

🐣
****
お仕事のご相談こちらまで
rockyshikoku@gmail.com

Core MLを使ったアプリを作っています。
機械学習関連の情報を発信しています。

[Twitter](https://twitter.com/JackdeS11)
[Medium](https://medium.com/@rockyshikoku)
はじめてのRspecでぶち当たった壁たち

# はじめに
　いよいよRspecに手を出すことにした。これを使ったらいろんなテストができるらしい。すごい。でも、ちょっと手強そうだったのでオンライン教材を使用することにした。こちらのTake off Railsというものだ。

https://freelance.cat-algorithm.com/lp/take-off-rails

　最近は時間が足りないので、いろんな物事を効率化する必要があった。時間をお金で買う形だが、これが非常によかった。情報が集約されているし、分からなかったら質問した。

　それでも結構詰まったことがあったので、ここに書いておく。

# rails g model user -s ができない
　今回は既存のuser modelに対して`spec/models/user_spec.rb`や`spec/factories/users.rb`を作成するため、

```terminal
$ rails g model user -s
```

　を実行しようとした。しかし、エラーが生じた。

```
$ rails g model user -s
Running via Spring preloader in process 1605
      invoke  active_record
The name 'User' is either already used in your application or reserved by Ruby on Rails. 
Please choose an alternative or use --force to skip this check and run this generator again.
```

　どうやらskipオプションが使えないらしかった。質問をして、変更後のファイルをすべてcommitしてから`$ rails g model user --force`　を行い `$ git restore .` を実行した。こうすることで、skipと同じ効果が得られた。

# deviseと普通のアクションのURLが被ってエラー
　userコントローラーのcreateアクションについてテストを実施しようとしたら以下のようなエラーが出た。

```
Failures:
  1) Users POST /users ユーザーのレコードが作成できる
     Failure/Error: expect{subject }.to change { User.count }.by(1)
       expected `User.count` to have changed by 1, but was changed by 0
     # ./spec/requests/users_spec.rb:53:in `block (3 levels) in <main>'
```

　原因を探っていくと、user#createアクションへ遷移していないことがわかった。その代わりdeviseの#createアクションが実行されていたのだった。

　`$rails routes`　で確認するとdevise#controller とuser#controller のパスが同じものになっていた。ちょっとこれを変えてやらないといけない。

　以下のように設定した。

```ruby:config/routes.rb
Rails.application.routes.draw do
  root to: 'users#index'
  devise_for :users
  resources :users ,path_names: { create: 'make' } do
    resources :plants do
      resources :growth_records, shallow: true
    end
  end
  
  scope 'username' do
    resources :users, only: [:create]
  end

end

```

　今回は `scope`　の箇所を変更した。これにより、ルーティングの衝突がなくなった。テストの一部は以下のようになっている。

```ruby
RSpec.describe "Users", type: :request do
#中略-----
  describe "POST /users" do
    subject { post('/username/users' ,params: params) }
    let(:params){ {user: attributes_for(:user)} }

    it "ユーザーのレコードが作成できる" do
      expect{subject }.to change { User.count }.by(1)
      expect(response).to have_http_status(204)
    end
  end
#中略-----
end
```

以前の `post(users_path,params: params)`から`post('/username/users' ,params: params)`に変更している。


# おわり
　Rspecの世界は奥が深い。いまはエラーが出ないことだけを意識しているが、いづれは自分で「何のテストがどこまで必要か」までを考えていきたい。

　なんだかんだいって、プログラミングは楽しい。
socket経由でDjango+gunicon+nginx

# django の調整

settings.py をデプロイ用に変更。

```settings.py
DEBUG=False
ALLOWED_HOSTS = ['*']
STATIC_URL = '/static/'
STATIC_ROOT = '/usr/share/nginx/html/static'

MEDIA_URL = '/media/'
MEDIA_ROOT = '/usr/share/nginx/html/media'
```
DEBUG=Falseで起動すると `ALLOWED_HOSTS` で指定したIPからしかアクセスを受け付けなくなる(400を返す)。
本来はきちんと設定すべきだが、ここではとりあえず `*`ですべて通す。

## static ファイルを nginx 用置き場にコピーする

`STATIC_URL` で指定された場所においてあるファイルを `STATIC_ROOT` で指定した場所にコピーする。

```
$ python manage.py collectstatic
```


## nginx用 static 置き場を作成

後々、nginxで読みこむ静的ファイルを置く場所を作る。

```
$ mkdir /usr/share/nginx/html/static
$ mkdir /usr/share/nginx/html/media
```

# gunicorn のインストール

```
$ pipenv install gunicorn
```

起動する場合は` $ pipenv run gunicorn ...`のようにする。

# gunicorn をsocketに紐付ける

## socketファイルの作成

```
$ sudo vi /etc/systemd/system/gunicorn.socket
```
```/etc/systemd/system/gunicorn.socket
[Unit]
Description=gunicorn socket

[Socket]
ListenStream=/run/gunicorn.sock

[Install]
WantedBy=sockets.target
```

## systemファイルの作成

```
$ sudo vi /etc/systemd/system/gunicorn.service
```

pipenv 環境のもと gunicorn を実行する。
pipenvの場所は `which pipenv` で調べる。

```/etc/systemd/system/gunicorn.service
[Unit]
Description=gunicorn daemon
Requires=gunicorn.socket
After=network.target

[Service]
PIDFile=/run/gunicorn/pid
User=root
WorkingDirectory=Djangoを配置したパス
ExecStart=/usr/local/bin/pipenv run gunicorn --access-logfile - --workers 3 --bind unix:/run/gunicorn.sock application_name.wsgi:application

[Install]
WantedBy=multi-user.target
```

## デーモン起動

```
$ systemctl start gunicorn.socket
```
`/run/gunicorn.sock` が存在していれば問題ない。
以下のようにして確かめる。

```
$ file /run/gunicorn.sock
Output/run/gunicorn.sock: socket
```
gunicorn.service は 明示的に systemctl start する必要はない、ソケットが受信すれば起動する。
試しに、curlなどでソケットにアクセスすると gunicorn を介して、djangoから html が送られてくる。

```
$ curl --unix-socket /run/gunicorn.sock localhost
```
特に問題なければ自動化。

```
$ sudo systemctl enable gunicorn.socket
```

# nginx の調整

sites-available ディレクトリの作成。

```
mkdir /etc/nginx/sites-available
```

作ったディレクトリを sites-enabled としてシンボリックリンクを張る。

```
sudo ln -s /etc/nginx/sites-available/ /etc/nginx/sites-enabled
```

http で動かすように設定。

```
$ sudo vi /etc/nginx/sites-available/project.cfg
```

```/etc/nginx/sites-available/project.cfg
server {
   listen 80;
   server_name サーバのドメイン名かIP;

   location = /favicon.ico { access_log off; log_not_found off; }

   location /static {
       alias /usr/share/nginx/html/static;
   }
   location /media {
       alias /usr/share/nginx/html/media;
   }


   location / {
       proxy_pass http://unix:/run/gunicorn.sock;
   }
}
```

作った設定を参照するように `etc/nginx/nginx.conf` を変更

```
$ sudo vi /etc/nginx/nginx.conf
```

```/etc/nginx/nginx.conf
...

http {

...

   include /etc/nginx/conf.d/*.conf;
   include /etc/nginx/sites-enabled/*; #追記
```

設定ファイルのチェック。

```
$ sudo nginx -t
```

起動と自動化。

```
$ sudo systemctl start nginx
$ sudo systemctl enable nginx
```

# Djangoを更新した場合

コードを適用したあとは、gunicorn を起動し直すだけでいい。

```
$ sudo systemctl restart gunicorn
```
Bashだけで16進数・10進数・2進数間の相互変換を行う

#2進数から10進数に変換する。

``` bin2dec.sh
# convert binary number to decimal number
# bin2dec 101 # -> 5
function bin2dec()
{
  echo $((2#$1))
}
```

#2進数から16進数に変換する。

``` bin2hex.sh
# convert binary number to hexadecimal  number
# bin2hex 1011 # -> B
function bin2hex()
{
  printf '%X' $((2#$1))
}
```

#10進数から2進数に変換する。

``` dec2bin.sh
# convert decimal number to binary number
# dec2bin 5 # -> 101
function dec2bin()
{
  local b c o2b
  o2b='000001010011100101110111'
  b=$( printf '%o' $1 | while read -N 1 c; do echo -n ${o2b:$((c*3)):3}; done )
  b=${b#0}
  b=${b#0}
  echo $b
}
```

#10進数から16進数に変換する。

``` dec2hex.sh
# convert decimal number to hexadecimal  number
# dec2hex 11 # -> B
function dec2hex()
{
  printf '%X' $1
}
```

#16進数から2進数に変換する。

``` hex2bin.sh
# convert hexadecimal number to binary number
# hex2bin B # -> 11
function hex2bin()
{
  local b c h2b
  h2b='0000000100100011010001010110011110001001101010111100110111101111'
  b=$( echo -n $1 | while read -N 1 c; do c=$((16#$c)); echo -n ${h2b:$((c*4)):4}; done )
  b=${b#0}
  b=${b#0}
  b=${b#0}
  echo $b
}
```

#16進数から10進数に変換する。

``` hex2dec.sh
# convert hexadecimal number to decimal number
# bin2dec 101 # -> 5
function hex2dec()
{
  echo $((16#$1))
}
```

#補足
自由に使っていただいて構いませんが、エラー処理や引数チェックは適時追加してください。動作保証や損害賠償は一切致しません、各自の責任でご利用ください。
参考記事→[Bashだけで10進数からn進数(2～64進数)に変換する](https://qiita.com/aachyee/items/4af6dee56a0bdb3f2a5b "Bashだけで10進数からn進数(2～64進数)に変換する")
Update-Package をしたら Could not load file or assembly で Azure Functions が動かなくなった (C#)

# Update-Package をしたら Could not load file or assembly で Azure Functions が動かなくなった (C#)

Azure Portal で Azure Functions v2 から v3 に更新することを検討しろと言われたので、上げてみたところ Azure Functions が動かなくなった.

例外を確認してみると

```
System.IO.FileNotFoundException: Could not load file or assembly 'System.IdentityModel.Tokens.Jwt, Version=6.7.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35'. The system cannot find the file specified.
File name: 'System.IdentityModel.Tokens.Jwt, Version=6.7.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35'
```

と、もう見慣れてきた感のあるやつです.

[Could not load file or assembly 'System.IdentityModel.Tokens.Jwt, Version=6.7.1.0 #460](https://github.com/Azure/azure-functions-vs-build-sdk/issues/460) の途中にワークアラウンドとして [Could not load file or assembly System.IdentityModel.Tokens.Jwt, Version=5.6.0.0 #397](https://github.com/Azure/azure-functions-vs-build-sdk/issues/397) が紹介されており、

```xml
<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>netcoreapp3.1</TargetFramework>
    <AzureFunctionsVersion>v3</AzureFunctionsVersion>
    <_FunctionsSkipCleanOutput>true</_FunctionsSkipCleanOutput>
  </PropertyGroup>
```

のように `<_FunctionsSkipCleanOutput>true</_FunctionsSkipCleanOutput>` を追加したところ動作するようになりました.

.NET の依存性管理、しょっちゅうトラブルになるのでなにか根本的に問題があるんじゃないかと思うけど、.NET 5 になって、.NET Core / .NET Standard / .NET Framework の三つ巴が終わったら解決するのかなあ. Azure Functions も v2 は .NET Standard 2.0 だったのに v3 は .NET Standard 2.1 ではなく .NET Core 3.1 という辺り混乱しすぎだろって感じる.
python x tensoflow x 画像顔認証

※本記事は記載途中です。

【目標】
・windows環境で画像ファイルを読み込み人の顔を認識させる。

【環境】
OS:windows10/CPU:x64 i7-9750/MEM:16GB
VisualStudio Code(VSCode)
[拡張機能]
・Japanese Language Pack for VS Code
・Python extension for Visual Studio Code

【参考】
・TensorFlowを使って顔認識器を作る
https://qiita.com/Hironsan/items/4c7808db4a0f172f98a9

・TensorFlowで日向坂46の顔識別をしてみた -顔画像検出編-
https://tsu-tech.hatenablog.com/entry/2019/05/02/104159

・SSDにMobileNetを組み込んで軽量化する (1)
https://proc-cpuinfo.fixstars.com/2018/12/mobilenet-ssd-1/

・MobileNet(v1,v2,v3)を簡単に解説してみた
https://qiita.com/omiita/items/77dadd5a7b16a104df83

・深層学習と機械学習 の代表的モデル
https://www.koi.mashykom.com/deep_learning.html
メモリが足りていても OutOfMemoryException が出る可能性がある (C#)

# メモリが足りていても OutOfMemoryException が出る可能性がある (C#)

Microsoft の [OutOfMemoryException Class](https://docs.microsoft.com/en-us/dotnet/api/system.outofmemoryexception?view=netcore-3.1) のドキュメントに以下のような記載があります.

> An OutOfMemoryException exception has two major causes:
> - You are attempting to expand a StringBuilder object beyond the length defined by its StringBuilder.MaxCapacity property.

適当訳:

> OutOfMemoryException 例外には2つの大きな要因があります:
> - StringBuilder.MaxCapacity プロパティで定義された長さを超えて StringBuilder オブジェクトを拡大しようとしている。

つまりメモリが足りていたとしても、`StringBuilder` に `MaxCapacity` を超えて文字を追加しようとすると `OutOfMemoryException` が発生します.

でもそれってメモリ不足と一致するんでしょって思いますよね? 実はそうではありません.

[StringBuilder.MaxCapacity Property](https://docs.microsoft.com/en-us/dotnet/api/system.text.stringbuilder.maxcapacity?view=netcore-3.1)

```cs
public int MaxCapacity { get; }
```

`MaxCapacity` は Int32 なんです. なので最大文字数は `Int32.MaxValue` = 2147483648 となります. つまりざっくりで 4GB となります(.NET の `Char` は 16bit です). 結果として 64bit 環境ではメモリが余っていても OutOfMemoryException が発生することがあります.

お手軽便利でみんな大好き `File.ReadAllText` は内部で `StreamReader.ReadToEnd` を呼び出しており、`StreamReader.ReadToEnd` は内部で `StringBuilder` を使っているため、`File.ReadAllText` は ASCII 文字のみのファイルの場合は最大でも 2GB までのファイルしか読み込めません. 悲しいね!
rlogin の日本語フォントをスリム化する

# ここは PC-6001 のスクリーンモード３ですか？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/128691/05a2643a-34a1-211f-9db0-6596662bd228.png)

これだけ言いたかったので記事書きました。わかった人もわからない人もスルーでいいです。はい。

**統計によるとエンジニアのやる気の80% はフォントに依存するということがわかっています（嘘**
適当な日本語フォントを選ぶと横幅が長くなってしまいます。体が受け付けないので原理も何も考えずに調整してみました。

# rlogin のフォントとフォントサイズの変え方
そもそも rlogin のフォントの変更方法はとても難しいです。以下のサイトで詳しく紹介されております。大変助かりました。ありがとうございました。
http://auewe.hatenablog.com/entry/2014/05/31/032920

# rlogin の日本語フォントの幅を変える
- [表示 - オプション設定][フォント]
- フォントセットの下のリストボックスのUnicodeを選択して[編集]をクリック
- Font Face: [IBM Mono Plex SemiBold] -> お好きな日本語等倍フォントをどうぞ
- 表示の微調整 - Zoom: 42 **← これ** 

ご参考までに IBM Plex Mono はこちら
https://fonts.google.com/specimen/IBM+Plex+Mono

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/128691/3d0d4313-1714-2349-6310-45ad32040a74.png)

# 調整後
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/128691/a38db410-5355-87a2-6690-fdf8844f205b.png)

**統計によると一人のエンジニアがフォントを選ぶ時間は、RPG の主人公の名前を決める時間の18倍かかるといわれています。（自分調べ）**

冗談はさておき、完璧とは言えませんが許容できるレベルにはなったかなという感じです。Zoom はドロップダウンリストで選ぶと 10刻みですが、直接入力すれば1単位で入力できます。好きに調整しましょう。

rlogin のフォント設定は作っている方のこだわりが感じられますね。それなりに理由があってこういう仕様になっているだろうと思いつつ、何も調べず適当な方法で調整してしまいました。他にちゃんとしたやり方がありそうな気はするので、ご存じの方がいらっしゃったらコメント頂けたら嬉しいです
rails console よく使う操作

#はじめに
railsの学習を始めてrails consoleを使うことが多くなったため、ここにまとめます。


#操作

##起動

```
rails c
```

##終了

```
quit
```

##全てのデータを取得
例としてモデル名は`User`にします。

```
User.all
```

##idで検索する

```
users = User.all
users.find(1)
```
##idと指定して検索する

```
users = User.all
users.find_by(id:1)　 # users.find(1)と同じ意味
```
ユーザー名で検索する場合
例としてカラム名は`username`にします。

```
users.find_by(username:'なおき')
```

##保存する

```
user.save
```
具体例：名前の書き換え

```
user = User.find(1)
user.username = 'ばいきんまん'
user.save
```


##削除

```
user.destroy
```
具体例：レコードの削除

```
user = User.find(1)
user.destroy
```

#参考
[【Rails入門】consoleの使い方まとめ](https://www.sejuku.net/blog/29910)
[RailsコンソールでModelを操作する](https://rails-ambassador.herokuapp.com/lessons/ManipulateTheModel#chapter-10)

#最後に
アプリでデータベースにデータを追加した後は、基本的にはこの操作方法を覚えていれば問題ないように思います。お役に立てれば幸いです。
PostgreSQLでデータベースはじめてみる

とりあえずデータベースを始めてみよう。
使うSQLソフトは`PostgreSQL`で。SQLはStructured Query Languageの略（ゼミ生に教えてもらった）。データベースを管理・操作するための言語のこと。
インストールは[ここから](https://www.enterprisedb.com/downloads/postgres-postgresql-downloads)自分のOSに合わせて好きなのをどうぞ。
（といいつつ、これ以降はすべてWindows10を意識して書いていきます）
パスワードを設定するので忘れないように（基本的に毎回聞かれると思ってください）。
あとはインストールフォルダはデフォルトでもよいが、不都合が起こることもあるらしいので、僕はCドライブ直下の

```
C:\PostgreSQL\13
```
に設定（バックスラッシュの部分は状況によっては半角の「￥」マークにしてください。というかそっちになるか）。
他の部分は基本的にOK牧場。あとはインストール終わると追加インストールを聞かれるがとりあえずはなくても大丈夫だと思う（おれは追加のものを使ったことないからもし使ってみて便利な機能とかあったら教えて）。

それでは早速SQLを使ってみよう。
最初にWindowsボタンを右クリックして、「Windows PowerShell (管理者)」を実行してください。そこで、

```
C:\PostgreSQL\13\bin\psql.exe -U postgres
```
のように入力すると、パスワードを求められるのでそれを入力する。これで起動完了。


```SQL
postgres=#
```
と出るはずなので、ここでSQL言語を打っていく感じ。
以降はコマンドを打ってエンターすれば実行できる。
これからいろいろデータベースを作成していくが、基本的な操作をまとめておくと、

- `\l`：自分の環境内にあるデータベースの一覧を表示
- `\c データベース名`：いじりたいデータベースへ移動

じゃあ、まずはデータベースを作ってみよう。作るときは「`CREATE`」を使うと作る！って感じ。
とりあえずデータないと作れないから車のガソリンデータベース（`car`）を作ってみよう。

```SQL
CREATE DATABASE car; 
```
これで作成されます。このとき最後の「`;`」（セミコロン）を入力するってのがSQL言語の特徴かも。
基本的に実行したい命令の最後にはセミコロンって感じです。
それでは、次の表にあるデータをデータベースに登録してみましょう。

|日付|ガソリンスタンド|走行距離|使用燃料|表示燃費|金額|
|--:|:-:|:-:|:-:|:-:|:-:|
|2019年1月25日|A|952.7|33.68|32.1|4109|
|2019年2月11日|A|904.6|32.0|30.1|3840|
|2019年2月24日|B|789.5|27.38|32.4|3340|
|2019年3月13日|A|992.9|34.13|30.9|4266|
|2019年3月23日|C||||3329|

```SQL
CREATE TABLE nenpi
(date DATE NOT NULL,
 gs CHAR(2) NOT NULL,
 dist NUMERIC ,
 gas NUMERIC ,
 nenpi NUMERIC ,
 price INTEGER ,
 PRIMARY KEY(date));
```
とすれば燃費（nenpi）という箱が作られる。
これもデータベース（正確にはテーブル）の特徴でデータを入れる前に箱を作っておかなくてはいけない。
さらに、箱を作る際にはそれぞれの変数名（列名）を決めて、その変数にどのような値（型という）が入るかまで決めておく必要がある。例えば上のコマンドの中を見ると、
`変数名 変数の型 NULLの指定`という感じで命令する。
変数名にはアルファベット、数字、アンダーバーの3種類を使い、最初の文字はアルファベットにするというルールがある（なぜか？）。
型に登場したのはSQLによって様々だが、上記の4つを知っておくと便利かなと。

- DATE：日付
- CHAR(数字)：数字の桁数（文字数）の文字列（ただし固定長。可変にするならVARCHAR）
- NUMERIC：実数値（他にもあるが基本これで大丈夫かな）
- INTEGER：整数値

`NULL`の指定は？これはNOT NULLを指定すると空白を許さないという指定になります。上の表を作ろうと思うと、最初の2列以外は空白（欠損、NULL）があるので、そこはNULLの存在を許さないといけないですね。逆に日付わかんなかったらそのデータいらない！って感じならNULLを許さないとかにするって感じですかね（乱暴ですみません）。
複数行を同時に実行するために`TRANSACTION`を使います。
これやると「BEGINからCOMMIT;」までの間の処理を同時に行ってくれるようになります。
（あまり意識したことなかったけど学生からの質問を受けて。）

```SQL
BEGIN TRANSACTION;
INSERT INTO nenpi VALUES('2019-1-25','A', 952.7, 33.68, 32.1, 4109);
INSERT INTO nenpi VALUES('2019-2-11','A', 904.6, 32,    30.1, 3840);
INSERT INTO nenpi VALUES('2019-2-24','B', 789.5, 27.38, 32.4, 3340);
INSERT INTO nenpi VALUES('2019-3-13','A', 992.9, 34.13, 30.9, 4266);
INSERT INTO nenpi VALUES('2019-3-23','C', NULL,  NULL,  NULL, 3329);
COMMIT;
```
これで実際に燃費のテーブルができた！
テーブルが出来たかを確認するためには

```SQL
\dt;
```
を実行すると作られたテーブル一覧が表示される。
また、テーブルの中身を確認するためには、

```SQL
SELECT * FROM nenpi
```
を実行すると出来上がったテーブルが表示される。
`INSERT`とか`SELECT`についてはもう少し機能があるので、また次の記事で説明しようと思います。ではまた。
phpのissetの挙動を確認する。

# issetの挙動 

nullと''や0の挙動が違う

```php
<?php
$a = null;
var_dump(isset($a));

$b = "";
var_dump(isset($b));

$c = 0;
var_dump(isset($c));

// bool(false)
// bool(true)
// bool(true)
?>
```
【Java】配列について

Javaの配列について勉強したことのメモです。
-
###配列の宣言
```
(int方の場合)
int[] arr = new int[5];
```
###配列arrに値を代入
```
arr[0] = 3;         // 1番目（先頭）の要素に 3 を代入
arr[1] = 1;         // 2番目の要素に 1 を代入
arr[2] = 6;         // 3番目の要素に 6 を代入
arr[3] = 0;         // 4番目の要素に 0 を代入
arr[4] = 4;         // 5番目の要素に 4 を代入
```
###arrを簡略化
```
int[] arr = {3, 1, 6, 0, 4};
```
###配列arrの要素数を出力
```
(要素数が3の場合)
System.out.println("配列arrの要素数…" + arr.length);
結果:配列arrの要素数…3
```
【React】LGTM数 + ストック数ランキング【毎日自動更新】

# はじめに
LGTM数 + ストック数の合計値が高い記事こそが真に価値のある記事ではないだろうか⭐︎
という思いからLGTM数 + ストック数の合計でランキングをつけ自動で投稿できようにしました。
自分の気になるタグの有益な記事が埋もれるのを防げたら最高です。
# 集計タグ
**タグ名：**`React`
**フォロワー数：**5747
**記事数：**10298
# 集計概要
**集計方法：**毎日7時に Qiita API v2をcronにて定期実行し集計
**集計期間：**2021/09/02 ~ 2021/09/09
**集計内容：**LGTM数 + ストック数合計値
**集計対象：**LGTM数3件以上
# 1位：[Clean Architecture on Frontend （翻訳） ](https://qiita.com/70ki8suda/items/7b720217c9b1b4855e99)(69P)
**LGTM数：32**  **ストック数：37**
`TypeScript`  `React`  `frontend`  `CleanArchitecture`
[@70ki8suda](http://qiita.com/70ki8suda)さんの投稿（2021/09/07/1:40 PM）
# 2位：[リアルタイムなWebアプリを簡単に作れるOSSを作ったので、立ち上げからリリースまでを時系列に書いていく](https://qiita.com/yuno_miyako/items/ede44a5d17391748b74e)(68P)
**LGTM数：40**  **ストック数：28**
`Node.js`  `AWS`  `websocket`  `React`  `個人開発`
[@yuno_miyako](http://qiita.com/yuno_miyako)さんの投稿（2021/09/06/2:14 PM）
# 3位：[フロントエンド、バックエンドを個別に構築して相互連携させる開発手法について語る](https://qiita.com/ison12/items/23704d44bd5afa71eff8)(49P)
**LGTM数：27**  **ストック数：22**
`Apache`  `Vue.js`  `React`  `vue-cli`
[@ison12](http://qiita.com/ison12)さんの投稿（2021/09/05/12:10 PM）
# 4位：[Reactによるコンポーネントパターンまとめ](https://qiita.com/sparklingbaby/items/3ceafe9433ae516aa747)(11P)
**LGTM数：5**  **ストック数：6**
`TypeScript`  `React`
[@sparklingbaby](http://qiita.com/sparklingbaby)さんの投稿（2021/09/08/5:13 AM）
初めてのAndroid Studioと公式Tutorialではまったこと

Android Studio 4.0.1を日本語化して、公式の「初めてのアプリを作成する」にチャレンジした際に、はまったところのメモ。本当に初心者で書いてあるコードの意味もさほど理解していない状態ではまったところのメモなので、詳しい説明とかはありません。とりあえず動かしてみたい！と思ったときのヒントになれば幸いです。

公式の「初めてのアプリを作成する」
https://developer.android.com/training/basics/firstapp

はまったのはココ。
インテントを作成する
https://developer.android.com/training/basics/firstapp/starting-activity#BuildIntent

```MainActivity.kt
val editText = findViewById<EditText>(R.id.editText)
```
この、`R.id.editText`が、`Unresolved Refalence: editText`になっていて、これの解決方法が分からなかった。

`activity_main.xml`開いて、TextViewをクリックして属性(右側のペイン)の一番上、ここにidが書いてあって、このidが`editText`になっていなかったのが原因。なんか、デフォルトでid入る値がTutorial作ったころから変わったのかな。

というわけで、このidを`editText`にするか、表示されているidの方にするかで解決します。

以下も同じことが起きることがあるようです。検索できるように書いておきます。

```DisplayMessageActivity.kt
val textView = findViewById<TextView>(R.id.textView).apply {
    text = message
}
```
idが`textView`になっていないことがあるようです。