OmniAICreator/Qiita-1.07M huggingface dataset:
動画をリサイズして画像に直すpythonプログラム

探しても見当たらなかったので作りました。
OpenCVで開ける動画ファイルを適当なフレーム毎に間引きながらリサイズして画像ファイルとして保存します。

###コード

何も難しいことはしてないので特に説明は不要かと思います。

```python3:video2jpg.py
import cv2
import os
import argparse

parser = argparse.ArgumentParser()
parser.add_argument("--video_path", type=str)
parser.add_argument("--save_dir", type=str, default="save/")
parser.add_argument("--interval", type=int, default=10)
parser.add_argument("--resize", type=int, default=None, nargs="+")
opt = parser.parse_args()

def video2jpg():
    if not os.path.exists(opt.save_dir):
        os.makedirs(opt.save_dir)
    cap = cv2.VideoCapture(opt.video_path)
    l_cap = int(cap.get(cv2.CAP_PROP_FRAME_COUNT)) 

    for i in range(l_cap):
        flag, frame = cap.read()
        if flag == True and i % opt.interval == 0: 
            save_path = os.path.join(opt.save_dir, "{}_{}.jpg".format(os.path.basename(opt.video_path).split(".")[0], i))
            if opt.resize != None: 
                frame = cv2.resize(frame, (opt.resize[0], opt.resize[1]))  
            cv2.imwrite(save_path, frame)
            print("{} has been saved".format(save_path))

if __name__ == "__main__":
    video2jpg()
```

###実行

例えばvideo2jpg.pyと同ディレクトリに存在するdouga.aviを10フレーム毎に480×480にリサイズして画像ファイルとして保存したい場合は次のようにターミナルに入力します。

```
python3 video2jpg.py --video_path douga.avi --interval 10 --resize 480 480
```
Drupal 8 でURLのパスを node 以外にする

標準のコンテンツのURLを、 <pre>http://test.com/node/{id}</pre> 以外にしたいということは多々あるかとおもいますので、やり方です。

ちなみに、以前の案件で、11万エイリアスぐらい作りましたが、負荷的に問題はなかったです。

今回は、node/{ノードID}となるデフォルトのURLを、自動採番して、article/{ノードID}となるようにします。

まずは、token モジュールをいれます。tokenはdrupalでサイト構築する際は、必須モジュールといっても過言ではないですね。ざっくりゆうと、管理画面からの入力で変数が使えるってものです

```
$ drush en token
```

ついで、pathautoモジュールをいれます。

```
$ drush en pathauto
```

pathautoモジュールをいれると「環境設定」＞「URL エイリアス」に「Patterns」タブが表示されるので、ここから下記のように、Pathatuo patternをつくります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225890/f4642675-4fca-79b7-3311-0cb8f6072dd4.png)

上記で、コンテンツタイプが記事の登録すると、URLが、article/{ノードID}となります。[node:nid]の部分はtokenが提供してくれています。
Amplifyを使って期限切れの一時クレデンシャルを更新する

## 概要

Amplifyを使用して一時クレデンシャルを更新する。
※ちなみに一時クレデンシャルの有効期限は1時間

## 実装

下記を実行するだけ。

```
Auth.currentCredential()
```

* 一時クレデンシャルの期限が切れている場合、自動的に更新される。
* 一時クレデンシャルの期限が切れていない場合、何も起きない（CignitoAPIに対してリクエストがない）。
* 更新トークンの期限が切れている場合、更新されない（更新トークンの期限切れはサインインし直し）。

## 参考

`Auth.currentCredential()` 実行時のHTTPリクエストのヘッダ

```
POST https://cognito-identity.ap-northeast-1.amazonaws.com http/2.0
Sec-Fetch-Mode      : cors
Origin              : http://localhost:3000
User-Agent          : Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36
Content-Type        : application/x-amz-json-1.1
X-Amz-Content-Sha256: 9a75f328d3abe104b37c8bdfaedc6f4151e6dc6ea3f109608a45767ccb276edc
Referer             : http://localhost:3000/
X-Amz-Target        : AWSCognitoIdentityService.GetCredentialsForIdentity
X-Amz-User-Agent    : aws-amplify/1.2.3 js aws-amplify/1.2.3 js callback
```
RHEL におけるルーティングテーブルのルートの優先順位

#ルートの優先順位

詳細は以下に記載されている。

How does kernel make decisions for adding routes to reach a destination if the interfaces are in same network in RHEL?
https://access.redhat.com/solutions/1236243

要約すると、複数の候補がある場合、以下の順番でルートの決定すると理解してよいと思う。

1.Longest prefix match (netmask が長いものが選択される)

2.Metric が小さいものが選択される

3.route コマンドでより上に表示されるものが選択されるっぽい。
※「the kernel will simply choose the first one and place it in the route table」の部分が該当すると思うがイマイチ判断がつかなかった。
  RHEL7 で検証すると、後で追加されたルートほど、route コマンドで上の行に表示され、そちらが利用される動作となった。


なお、Metric の変更は以下を参照。

How to set a route metric for a specific route in Red Hat Enterprise Linux 7?
https://access.redhat.com/solutions/3022271
タッチスクリーンでスクロール時にバウンドさせない

タッチ画面でスクロール可能なものがあって端っこに行くと、ウインドウが引っ張られる感じになります。

これを回避するために、
バウンドさせたくないコントールの ManipulationBoundaryFeedback イベントを登録して

```csharp:だいじなもの
e.Handled = true;
```
を追加します。

```csharp:追加した結果
<ScrollViewer ManipulationBoundaryFeedback="ScrollViewer_ManipulationBoundaryFeedback">
</ScrollViewer>
```

```csharp:追加した結果
private void ScrollViewer_ManipulationBoundaryFeedback( object sender, ManipulationBoundaryFeedbackEventArgs e )
{
	e.Handled = true;         //　追加
}
```
endian fortran

## big endian, little endian

fortranでのエンディアンの変換。オプションでできて便利だが、コンパイラにより、微妙にオプションが違う。一部情報古いかもしれません。g95は手元になく、、。

```
gfortran -fconvert=big-endian

ifort -convert big_endian

g95 -fendian=big
```
【SwiftUI】プラットフォームによるListの違いメモ

# List
List ->  https://developer.apple.com/documentation/swiftui/list

+ 単一の列に配置されたデータの行を表示
+ プラットフォームに応じた見た目

  + iOS
![スクリーンショット 2019-11-06 22.10.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/171702/b19f84c9-3b71-1ff5-0852-83e7c635e133.png)
  + watchOS  
![スクリーンショット 2019-11-06 22.14.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/171702/76726aaa-a92a-a4e2-f2f8-a20db205a555.png)
  + macOS  
![スクリーンショット 2019-11-06 22.16.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/171702/e9bcd0fb-8487-bea7-0685-ea0db0dba43a.png)

  + tvOS 
![スクリーンショット 2019-11-06 22.08.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/171702/117b0a1b-be36-033d-f008-d26bdd76099d.png)
Amplifyを使って期限切れのIDトークン、アクセストークンを更新する

## 概要

Amplifyを使用して期限切れのトークン（ID、アクセス、更新）を更新する。
※ちなみにトークンの有効期限は1時間

※期限切れかどうかに関わらず強制的にトークンを再発行する方法は↓を参照
[Amplifyを使って任意のタイミングでIDトークン、アクセストークンを更新する](https://qiita.com/k_hoso/items/f5e7a3c78100cc914110)

## 実装

下記を実行するだけ。

```
Auth.currentSession()
```

* トークンの期限が切れている場合、自動的に更新（更新トークンの有効期限内である場合）される。
* トークンの期限が切れていない場合、何も起きない（CignitoのAPIに対してのリクエストがない）。
* 更新トークンの期限が切れている場合、更新されない（更新トークンの期限切れはサインインし直し）。

## 参考

### リクエストサンプル

`Auth.currentSession()` 実行時のHTTPリクエストのヘッダ

```
POST https://cognito-idp.ap-northeast-1.amazonaws.com/ http/2.0
Sec-Fetch-Mode  : cors
Referer         : http://localhost:3000/
Origin          : http://localhost:3000
X-Amz-Target    : AWSCognitoIdentityProviderService.InitiateAuth
X-Amz-User-Agent: aws-amplify/0.1.x js
User-Agent      : Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36
Content-Type    : application/x-amz-json-1.1
```

リクエストボディ

```json-doc
{
    "ClientId": "xxxxxxxxxxxxxxxxxxxxxxxxxx",
    "AuthFlow": "REFRESH_TOKEN_AUTH",
    "AuthParameters": {
        "REFRESH_TOKEN": "略",
        "DEVICE_KEY": null
    }
}
```

### 更新トークンが期限切れの場合

レスポンスヘッダ

```
status                       : 400
date                         : Wed, 06 Nov 2019 03:54:02 GMT
content-type                 : application/x-amz-json-1.1
content-length               : 78
x-amzn-requestid             : 3f9e72e9-36af-4a9e-b585-8d5f1733a173
access-control-allow-origin  : *
x-amzn-errortype             : NotAuthorizedException:
access-control-expose-headers: x-amzn-RequestId,x-amzn-ErrorType,x-amzn-ErrorMessage,Date
x-amzn-errormessage          : Refresh Token has been revoked
```

レスポンスボディ（↓がbase64でエンコードされたモノが返ってくる）

```json
{"__type":"NotAuthorizedException","message":"Refresh Token has been revoked"}
```
AAで幅を合わせるための、文字とドット幅


以前Fantasioso Acsii Artに掲載されていた文字とドット幅の一覧です。

##### 幅

　１６ﾄﾞｯﾄ　　|　 |　半角で「＆emsp；」、全角スペース＋半角スペース
　１５ﾄﾞｯﾄ　　| _ |　半角スペース2個＋_
　１４ﾄﾞｯﾄ　　|　.|　全角スペース＋ドット
　１３ﾄﾞｯﾄ　　| . |　半角スペース2個＋ドット
　１２ﾄﾞｯﾄ　　| ~|　半角スペース＋~
　１１ﾄﾞｯﾄ　　|　|　全角スペース
　１０ﾄﾞｯﾄ　　| _|　半角スペース＋_
　　９ﾄﾞｯﾄ　　| ﾞ|　半角スペース＋ﾞ
　　８ﾄﾞｯﾄ　　| .|　半角スペース＋ドット
　　７ﾄﾞｯﾄ　　|~|　
　　６ﾄﾞｯﾄ　　|..|　
　　５ﾄﾞｯﾄ　　| |　半角スペース
　　４ﾄﾞｯﾄ　　|ﾞ|　
　　３ﾄﾞｯﾄ　　|.|　
　　２ﾄﾞｯﾄ　　| |　（「＆ｔｈｉｎｓｐ；」）
　　１ﾄﾞｯﾄ　　|‌|　（「＆ｚｗｎｊ；」「＆＃８２０４；」 ）

※ 1ドットはうまく表示されないみたいです。

##### 3dot

' , . : ; I l

##### 4dot

! I j { | } ﾞ ﾟ Ｉ ｉ ｊ ｌ |

##### 5dot

( ) [ ] _ f ｆ ｔ 半角スペース

##### 6dot

r t ｒ

##### 7dot

? ^ ` g k s x z ~ ｡ ｢ ｣ ､ ･ ｨ ｮ ﾄ ﾐ

##### 8dot

" # $ % * + - / 0 1 2 3 4 5 6 7 8 9 < = > \ a b c d e h n o p q u v y ｧ ｩ ｪ ｫ ｬ ｭ ｯ ﾉ ﾋ ﾒ ﾖ ﾘ ・ ： ； ゛ ゜ ´ ｀ ¨ ＾ ‐ ‘ ’ “ ” （ ） 〔 〕 ［ ］ ｛ ｝ 〈 〉 《 》 「 」 『 』 【 】 † ‡ ¶ ｖｘ ｙ ｚ

##### 9dot

E F J L T Y Z ｦ ｲ ｶ ｸ ｺ ｼ ｿ ﾀ ﾇ ﾌ ﾗ ﾚ ﾛ ﾜ ﾝ ａ ｃ ｅ ｇ ｓ く

##### 10dot

& A B D H K N P R S U V X w ｰ ｱｳ ｴ ｵ ｷ ｹ ｽ ｾ ﾁ ﾂ ﾃ ﾅ ﾆ ﾈ ﾊ ﾍ ﾎ ﾏ ﾓ ﾕ ＦＪ Ｌ Ｔ Ｘ Ｙ Ｚ ｂ ｄ ｈ ｋ ｎ ｏ ｐ ｑ ｕ ぅ ィト ョ

##### 11dot

@ C G O Q ｻ ﾑ ﾔ ﾙ 、 。 ， ． ゞ ０ １ ２ ３ ４ ５ ６ ７ ８ ９ Ａ Ｅ Ｐ Ｖ う ド ノ ミ 全角スペース

##### 12dot

M W m ヽ ヾ ゝ Ｂ Ｃ Ｄ Ｇ Ｈ Ｋ Ｎ Ｒ Ｓ Ｕ ｗ ぁ ぇ さ し じ と ょ り ァ ゥ ェ タ ッ ヒ メ ヨ リ ヮ ヵ ヶ

##### 13dot

Ｏ Ｑ ぃ ぉ ぐ こ っ も ら イ ォ カ ク コ ソ ヌ フ ャ ュ ラ ヲ

##### 14dot

え き ぎ ご ざ ち ぢ て で ど な ま ゃ ゅ よ る ろ ゎ を ア エ ゴ シ ジ ス ゾ ツ テ ビ ピ ブ プ マ モ レ ロ ン

##### 15dot

ー Ｍ ｍ あ い お け す そ ぞ た だ つ づ に ひ び ぴ ん ウ オ ガ キ ギ グ ケ ゲ ズ セ ダ チ ヂ ヅ デ ナ ニ ネ ヘ ベ ペ ホ ボ ポ ユ ワ ヴ

##### 16dot

その他、漢字等 ？！￣＿〃仝々〆〇―／＼～∥｜…‥＋－±×÷＝≠＜＞≦≧∞∴♂♀°′″℃￥＄￠￡％＃＆＊＠§☆★○●◎◇◆□■△▲▽▼※〒→←↑↓〓∈∋⊆⊇⊂⊃∪∩∧∨￢⇒⇔∀∃∠⊥⌒∂∇≡≒≪≫√∽∝∵∫∬Å‰♯♭♪◯かがげずせぜぬねのはばぱふぶぷへべぺほぼぽみむめやゆれわゐゑサザゼハバパムヤルヰヱΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩαβγδεζηθικλμνξοπρστυφχψωАБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдеёжзийклмнопрстуфхцчшщъыьэюя─│┌┐┘└├┬┤┴┼━┃┏┓┛┗┣┳┫┻╋┠┯┨┷┿┝┰┥┸╂①②③④⑤⑥⑦⑧⑨⑩⑪⑫⑬⑭⑮⑯⑰⑱⑲⑳ⅠⅡⅢⅣⅤⅥⅦⅧⅨⅩ㍉㌔㌢㍍㌘㌧㌃㌶㍑㍗㌍㌦㌣㌫㍊㌻㎜㎝㎞㎎㎏㏄㎡㍻〝〟№㏍℡㊤㊥㊦㊧㊨㈱㈲㈹㍾㍽㍼≒≡∫∮∑√⊥∠∟⊿∵∩∪
【救世主killall】`mysql.server start`が効かなかったときの対処法

## はじめに
MySQLサーバーを立ち上げた状態で、不慮の端末シャットダウン
↓
次回起動時にMySQLのサーバーを立ち上げられない

こんな状況になってしまっていました。
その解決法です。

## この記事が役に立つ方
- 不慮の事故でMySQLサーバーが立ち上がらなくなった方

## この記事のメリット
- 元通りMySQLサーバーが立ち上がるようになる。

## 環境
-  OS： macOS Mojave version 10.14.6
* シェル： zsh
-  MySQL 8.0

## エラー内容

```zsh
$ mysql.server start
Starting MySQL
.. ERROR! The server quit without updating PID file (/usr/local/var/mysql/XXXXXXXX.local.pid).
```

`mysql.server start`が効かないという内容。
エラー内容を見て探すも、PIDファイル（プロセス識別子）が存在しない状態になっていました。

`mysql.server stop`も効かない。八方塞がり！

発生したエラーはこちらの記事（↓）と全く同じです。
[mysqlがどうしても起動しない - Qiita](https://qiita.com/_natsu_no_yuki_/items/ae4c94187093e4ab3cdc)

しかし、MySQLの再インストールなど記事に書いてあることを実行してもうまくいかず…。

最終的には以下記事を発見。解決！
[MAMPのMySQLが起動しないときにやること | マテンロワークス](https://matenro-works.com/mamp-mysql)

## 解決策
```zsh
$ killall -9 mysqld
```

これで処理中のプロセスを強制終了。


```zsh
$ mysql.server start
Starting MySQL
 SUCCESS! 
```
その後無事にサーバーが立ち上げることが出来ました！
あー嬉しい。

## `killall -9 mysqld`コマンドの意味
今回の救世主`killall`コマンドの意味について触れておきます。
いやー、本当に助かりました。

### `killall`
指定したプロセスの停止を行う。
基本書式は以下の通り。

```zsh
$ killall [オプション] プロセス名
```

### `-9`
「強制終了」の意味。
数ある`killall`のオプションのうちの１つ。

### `mysqld`
MySQLの「デーモン(d)」。
※デーモン：常駐プログラムのこと。
　これがMySQLとコンピュータとの橋渡しをしてくれている。

## おわりに

同じエラーで苦しんでいる方のお役に立てれば幸いです。

## 参考にさせて頂いたサイト（いつもありがとうございます）
[mysqlがどうしても起動しない - Qiita](https://qiita.com/_natsu_no_yuki_/items/ae4c94187093e4ab3cdc)
[MAMPのMySQLが起動しないときにやること | マテンロワークス](https://matenro-works.com/mamp-mysql)
[mysqldとは｜「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典](https://wa3.i-3-i.info/word13578.html)
データの更新とは異なるタイミングでそのデータを描画更新に渡す（React）

こんにちは。
React の勉強中で、データの更新とは異なるタイミングでそのデータを描画更新に渡す方法を習得しようとしています。10 ms 毎に更新される変数 ```cum``` の値を、1000 ms 毎に描画したい想定です。

手始めに、"[Making setInterval Declarative with React Hooks](https://overreacted.io/making-setinterval-declarative-with-react-hooks/)" (```useInterval```) を見つけ、変数 ```cum``` （10 ms 毎に値を更新： ```+1```）の値を、描画更新用の変数 ```num``` へ代入を行うことで（1000 ms 毎）、描画実行させてみました。描画上で更新される ```num``` の値を確認すると ```+100``` づつ増加し想定通りの動きでした。

ただし、描画更新用の変数へ代入するという方法は冗長のような気もしますし、データとして巨大な要素数の配列などを扱いたくなった場合は処理が重くなるかなと考えています。

```
num: 99 → 199 → 299 → 399
```

```App.jsx
import React, { useState } from 'react';
import useInterval from '../src';

function App(props) {
  const [num, setNum] = useState(0);
  const [cum, setCum] = useState(0);

  useInterval(() => {
   setCum(cum + 1);
  }, 10);

  useInterval(() => {
    setNum(cum);
  }, 1000);

  return (
    <div>
      <p>num: {num}</p>
    </div>
  );
}

export default App;
```
railsのエラー: ビューの作成

railsでてこずったところがあったので備忘録として投稿します。

## htmlではなくhtml.erbであること
railsではビューは基本htmlではなく
html.erbを使用して記述します。

なぜかというと、rubyスクリプトを埋め込むためです。
具体的には
・任意のRubyスクリプトを埋め込めるので、条件分岐や繰り返し構文などの処理も自由に記述できる
・ビューヘルパーを利用することで、データベースから取得した値に基づいたリンクや
 フォーム要素などをシンプルなコードで生成できる

.erbとつなげることでrubyのコードを使えるようになります。

```html.erb:タイトル
 #例
 <% price = 2500 * 1.05 %>
 #<% %>基本がこれで変数の指定など

 <p>
 値段は<%= price %>円です。
 </p>

　#<%= %>これで変数やコントローラーなどから出力

 また-%>のように閉じるタグに-をつける形もあります。
 このようにすることで、余計な改行を取り除くことができます。
```
ページにツイッターのシェアボタンを設置する

##ページにツイッターのシェアボタンを設置したい
![IMG_0342.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/486153/cb52170f-04d4-c61f-3da9-d2f4077c3490.jpeg)
こんなやつ

##方法
```html:html
<a href="https://twitter.com/share?ref_src=twsrc%5Etfw"
   class="twitter-share-button" data-show-count="false">
    Tweet
</a>
<script async src="https://platform.twitter.com/widgets.js" 
        charset="utf-8"></script>
```
上記をボタンの設置したい場所に記述する

##結果
めちゃくちゃ簡単！
ボタンをクリックすると、そのページのタイトルとURLがテキストエリアに入った状態でツイートのウィンドウが開きます。
[Blender] 頂点が重複する原因

## はじめに
[TexTools のRectify エラーへの対処方法](https://qiita.com/noitak/items/4c89c27dcb7f9ee21d2b) を書くそもそもの原因となった「頂点の重複」について、なぜそういう状態になってしまったのか確認した。

環境はBlender 2.8

## 結論：原因は「E」のキャンセルしたつもり
複雑な操作はしていないので、候補は頂点が増える「押し出し = ショートカットE（Extrude Region）」。

初期状態の立方体。頂点数は8。
![00a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241491/ed8665ac-82e3-7124-2ed5-8c0a3dffbd37.png)

上面4頂点を選択してショートカットE、マウスを移動させたところ。まだ確定（マウス左クリック）していないが、Eの時点で頂点数は12に増えている。
![01a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241491/62ee5c93-d8b6-be5b-7c5f-677ed78a37e5.png)

確定しないでEscキーを押す。伸びていた面が消えるのでキャンセルされたように見えるが、頂点数は12のまま。
![02a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241491/36ab3a94-844a-cebf-a2e1-9a8c98840d22.png)

あー、これだ。
よく見ると左下に「領域を押し出して移動」が表示されているのでキャンセルされたわけではないのが分かる。頂点数をEする前に戻すにはUndo（Ctrl + z）が必要。

この状態でUV展開して（必要ないけど）Rectifyを実行すると、[TexTools のRectify エラーへの対処方法](https://qiita.com/noitak/items/4c89c27dcb7f9ee21d2b) に書いたエラーが発生する。

面の数は6→10に増加しているので、側面の4面がおそらく高さ0で追加されていると思われる。一方で上面は元からある1面しかないので、追加された4頂点が面で閉じていないのがRectifyエラーの原因ではないだろうかと推測する。

## まとめ
E（押し出し）はEsc を押すとキャンセルされたように見えるけど、実際はキャンセルされていないので注意。
DXライブラリのSetWaitVSyncFlag、いつ使うの？こういう時でしょ！

メリークリスマス！そしてハッピーバースデー私！was-blue.0793ことSeiten Minagawaです。
僭越ながら私が令和元年、2019年のDxLib Advent Calendarを主催してみましたが、今年のDxLib Advent Calendarはいかがだったでしょうか？
今回のDxLib Advent Calendarのラストはあまり知られていない関数、SetWaitVSyncFlag関数について考えてみる記事で締めくくろうと思います。

# まえがき

垂直同期を待つかどうかを設定するための関数、SetWaitVSyncFlag。
今回はこの「SetWaitVSyncFlag」で垂直同期を切るべき場面を考えてみました。

# そもそも垂直同期とは？

簡単に言えば、モニターへの描画が完了するまで処理全体を停止し、描画処理と更新処理の間隔を双方一定となるように処理の間隔を調整することです。
例えば、60FPSでしか描画できないのに1000FPSで描画処理・更新処理を行ってしまうと、描画が追いつかず問題になることがありました。
"ありました"と過去形なのは、筆者が制作した垂直同期を切るようにしているアプリをいくつかの環境で使ってみても、描画関連の問題が起きたことがなく、むしろ一部のゲームの記事では垂直同期を切ることを推奨している記事が見受けられたためです。

# 垂直同期を切るべき場面

## 音楽ゲーム
音楽ゲームは一般的に正しいタイミングの**時間**が使用されます。
そうなった時、60FPSの型にはめてしまうと1フレーム単位、つまり1/60秒(16ms)単位でしか判定できず、1ms、またはそれ以上で精度を判定したい場合に都合が悪いです。(特にいわゆる"キー音"があるゲームでは)
そんな時は、垂直同期を切って16msより速い間隔で判定するようにするべきです。
懸念されるのはティアリングですが、近年のモニターでそのような問題が発生するケースはほぼないと考えています。

## 絶対に特定のFPSで動かしたいゲーム
例えば格闘ゲームは、1/60秒単位で同時押しやコマンド入力の受付時間を設定しているケースが多いです。
「ゲームは絶対に60FPSで動く！」と思いがちですが、実はこのFPSは**環境依存**です。
これを環境依存せずに絶対に特定のFPSで動かしたい場合は、垂直同期を切り自前のFPS制御を行うことになります。

```fps.cpp
const int refrashtime = 1000 / 60;
int sectiontime = GetNowCount();
while (ProcessMessage() == 0)
{
    if (GetNowCount() - sectiontime >= refrashtime)
    {
        sectiontime = GetNowCount();
        Update();
        Draw();
    }
}
```

# SetWaitVSyncFlagの注意点

SetWaitVSyncFlag関数は、Windows版ではDirectXとの兼ね合いでDxLib_Initを呼ぶ前にしか使えません。
Android版では、DxLib_Init関数を呼んだ後でもSetWaitVSyncFlagで垂直同期を切るか切らないかを動的に切り替えることができますが、Windows版でも動的に垂直同期を切り替えたい場合は、以下のようにします。
(コードを平易にするためグローバル変数を使用していますが、一般的にはクラス変数などに閉じ込めて管理するようにします)

```vsync.cpp
//垂直同期を切るかどうか切り替えるグローバル変数
bool vsyncflag;

while (ProcessMessage() == 0)
{
    if (vsyncflag) WaitVSync(1);
    Update();
    Draw();
}
```

# コードのライセンスについて

[Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0)にします。著作権者名は「Seiten Minagawa」としてください。
rails 基本その3　投稿画面の作成

## その10,投稿画面の作成(ルーティング)
```ruby:routes
  get 'home/new' => 'home#new'
  #投稿画面のルーティング
  post 'home' => 'home#create'
  #データベースへの登録のルーティング
```

## その11, 投稿画面の作成(コントローラー)

```ruby:controlloer
   def new
   end
   # 投稿画面

  def create
    テーブル名.create(カラム名: params[:カラム名(ビューのid)],他に投稿内容があれば繰り返し・・・)
  end
   #これでビューで入れられた内容からデータベースに入れることができる。
  
 #例
 def create
  Item.create(name: params[:name], image: params[:image], text: params[:text])
 end


```
```ruby:controlloer
   #セキュリティーのためストロングパラメーターの設定の場合
   def new
      parameter = test_params
    end
    #privateで設定して変数を持ってくる

    private
    def test_params
      params.permit(:キー名(カラム名), 同文・・・)
    end

    #例
    def create
      Item.create(tweet_params)
    end

    private
    def tweet_params
      params.permit(:name, :image, :text)
    end
    #これでセキュリティが付加されて記述された。
```

# その12,　投稿画面と投稿完了画面の作成(ビューの作成例)
```html:ビュー(new.html.erb)
<!--基本form_tagを作成しメソッドをpostに指定-->  
<!--input.textareaなどを打ち込んで,nameで入れたいカラムを指定-->  
　
 <div>
  <%= form_tag('/home', method: :post) do %>
    <h3>
      サンプルフォーム
    </h3>
    <div>
      <label>Name:</label>
      <input palceholder="Name" type="text" name="name">
    </div>
    <div>
      <label>text</label>
      <textarea name="text" placeholder="text"></textarea>
    </div>
    <div>
      <label>image</label>
      <input placeholder="image" type="text" name="image">
    </div>
    <div>
      <input type="submit">
    </div>
  <% end %>
</div>
   
```

```html:ビュー(create.html.erb)
  #投稿が完了したこのページに遷移
　
  <div class="contents row">
    <div class="success">
      <h3>
        投稿が完了しました。
      </h3>
      <a class="btn" href="/tweets">投稿一覧へ戻る</a>
    </div>
  </div>
   
```
#Ruby の aasm で すべてのイベントに callback で共通処理を挟んでログ出力したりするには  after_all_transitions

ほぼREADMEのまま

[aasm/aasm: AASM - State machines for Ruby classes (plain Ruby, ActiveRecord, Mongoid)](https://github.com/aasm/aasm)

```rb
require 'aasm'

class Job
  include AASM

  aasm do
    state :sleeping, initial: true
    state :running, :cleaning

    event :run do
      transitions from: :sleeping, to: :running
    end

    event :clean do
      transitions from: :running, to: :cleaning
    end

    event :sleep do
      transitions from: [:running, :cleaning], to: :sleeping
    end

    after_all_transitions :log_status_change
  end

  def log_status_change
    puts "changing from #{aasm.from_state} to #{aasm.to_state} (event: #{aasm.current_event})"
  end
end
```

```rb
job = Job.new
# => #<Job:0x00007fb0d9f80750>

job.run
# changing from sleeping to running (event: run)

job.sleep
# changing from running to sleeping (event: sleep)

```

# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/2674








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
#Ruby の AASM って何？ Rails じゃなくても使えるの？ 使えるよ！

それだけ。以上。

# gem

[aasm/aasm: AASM - State machines for Ruby classes (plain Ruby, ActiveRecord, Mongoid)](https://github.com/aasm/aasm)

いろいろな ORM にアダプタとして使われてるけど、どんなRuby Classでも使えるって書いてる気がするよ。

>This package contains AASM, a library for adding finite state machines to Ruby classes.
>AASM started as the acts_as_state_machine plugin but has evolved into a more generic library that no longer targets only ActiveRecord models. It currently provides adapters for many ORMs but it can be used for any Ruby class, no matter what parent class it has (if any).

# コードと動作例

```rb
require 'aasm'

class Job
  include AASM

  aasm do
    state :sleeping, initial: true
    state :running, :cleaning

    event :run do
      transitions from: :sleeping, to: :running
    end

    event :clean do
      transitions from: :running, to: :cleaning
    end

    event :sleep do
      transitions from: [:running, :cleaning], to: :sleeping
    end

    after_all_transitions :log_status_change
  end

  def log_status_change
    puts "changing from #{aasm.from_state} to #{aasm.to_state} (event: #{aasm.current_event})"
  end
end
```

```rb
job = Job.new
# => #<Job:0x00007fb0d9f80750>

job.run
# => changing from sleeping to running (event: run)
```

# なんでDBがなくても動くの？

DBなんてなくても状態は保持できるからだよ。要するにメモリね。うん。

考えてみれば当たり前だよね。



# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/2673








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
フロントエンドフレームワーク雛形作成ツールのディレクトリ構成

## 概要
新しいプロジェクトを始めるときに、ディレクトリ構成やファイル名って悩みますよね。
React, Vue, Angularの雛形作成ツールが作成するプロジェクトが、どんなディレクトリ構成を出力するのか簡単に調べてみました。
ビルド出力がどのディレクトリに書き出されるか確認するために、 yarn build などのコマンドを実行後の結果となっています。
それぞれのツールで選択した機能は、特に記載しません。

### treeコマンド
ディレクトリ構成の確認は、treeコマンドでおこないます。
```$ tree -I "node_modules|.git" -a```
node_modulesと.gitディレクトリを除外し、不可視ファイルを表示します。

## vue-cli
[Vue CLI](https://cli.vuejs.org/)

```
.
├── .browserslistrc
├── .eslintrc.js
├── .gitignore
├── README.md
├── babel.config.js
├── dist
│   └── (省略)
├── package.json
├── postcss.config.js
├── public
│   ├── favicon.ico
│   └── index.html
├── src
│   ├── App.vue
│   ├── assets
│   │   └── logo.png
│   ├── components
│   │   └── HelloWorld.vue
│   ├── main.js
│   ├── router
│   │   └── index.js
│   ├── store
│   │   └── index.js
│   └── views
│       ├── About.vue
│       └── Home.vue
├── tests
│   └── unit
│       ├── .eslintrc.js
│       └── example.spec.js
└── yarn.lock
```

## create-react-app
[Create React App · Set up a modern web app by running one command.](https://create-react-app.dev/)

```
.
├── .gitignore
├── README.md
├── build
│   └── (省略)
├── package.json
├── public
│   ├── favicon.ico
│   ├── index.html
│   ├── logo192.png
│   ├── logo512.png
│   ├── manifest.json
│   └── robots.txt
├── src
│   ├── App.css
│   ├── App.js
│   ├── App.test.js
│   ├── index.css
│   ├── index.js
│   ├── logo.svg
│   └── serviceWorker.js
└── yarn.lock
```

## angular-cli
[Angular CLI](https://cli.angular.io/)

```
.
├── .editorconfig
├── .gitignore
├── README.md
├── angular.json
├── browserslist
├── dist
│   └── angular
│       └── (省略)
├── e2e
│   ├── protractor.conf.js
│   ├── src
│   │   ├── app.e2e-spec.ts
│   │   └── app.po.ts
│   └── tsconfig.json
├── karma.conf.js
├── package-lock.json
├── package.json
├── src
│   ├── app
│   │   ├── app-routing.module.ts
│   │   ├── app.component.html
│   │   ├── app.component.scss
│   │   ├── app.component.spec.ts
│   │   ├── app.component.ts
│   │   └── app.module.ts
│   ├── assets
│   │   └── .gitkeep
│   ├── environments
│   │   ├── environment.prod.ts
│   │   └── environment.ts
│   ├── favicon.ico
│   ├── index.html
│   ├── main.ts
│   ├── polyfills.ts
│   ├── styles.scss
│   └── test.ts
├── tsconfig.app.json
├── tsconfig.json
├── tsconfig.spec.json
└── tslint.json
```

## 所感
ビルド出力はdistやbuildで、ビルド対象はsrcの中という感じでした。
プロジェクトの拡張にあわせて、srcにサブディレクトリを追加していくのが良さそうです。
個人的には少し意外だったのは、assetsが主に画像ディレクトリとして使われることでしょうか。
（昔はsrcと同じような扱いだったはず・・・。NuxtJSとかの影響なのかな？ [アセット - NuxtJS](https://ja.nuxtjs.org/guide/assets/)）

VSCodeのアイコン拡張機能のフォルダ名のルールとかも見てみると面白いかもしれません。
[ListOfFolders · vscode-icons/vscode-icons Wiki · GitHub](https://github.com/vscode-icons/vscode-icons/wiki/ListOfFolders)
Railsの部分テンプレートに変数を渡す

# どうして変数を渡すことが必要か
コントローラに定義していたインスタンス変数を部分テンプレートに表示させようとしたところ、`nil`になっていた。色々と調べて見ると部分テンプレートではインスタンス変数の使用はオススメできないようだ。ではどうすればいいか。

# 部分テンプレートにlocalsで値を渡す
通常部分テンプレートを描画するには

```erb
<%= render "partial_template_name" %>
```
とすれば良いみたいなのですが、これに下記をつけ加えると変数が渡ります。

```ruby
locals: { foo: @foo, hoge: @hoge }
```
上記２つをつなげて、

```erb
<%= render partial: "partial_template_name",  locals: { foo: @foo, hoge: @hoge } %>
```
のようにすれば描画する部分テンプレート内で`foo`や`hoge`という変数に`@foo`や`@hoge`の値が入って使用することができます。

## 参考記事
[Rails 部分テンプレートの使い方](https://qiita.com/shizuma/items/1c655dadd2e04b3990a8)
ABテストの効果は継続しないこともある

<h2>ABテストの効果についてみんなどこまで知ってる？</h2>
エンジニアはABテストの案件の実装とかすることあると思うんですけど、エンジニア目線だとABテストについてほとんど知らないと思うんです。

僕はABテストをかれこれ長いことディレクターとしてやっているんですが、エンジニアも作り手としてABテストの効果がどれだけ信じられるのか？について知ってもいいんじゃないかということで書いてみました。

<h2>ABテストの効果の継続性と諸問題</h2>

そもそもABテストについてちょっとだけ解説しつつ、今回考えていきたいABテストの効果の継続性と諸問題について考えてみたいと思います。

<h3>ABテストの効果の測り方</h3>

ABテストの効果の測り方は、基本的にどの企業もどの担当者も統計的有意差を持って判断していると思います。許容できるリスクつまり判断の過誤が起きる確率をどこまでにするかとかが主なポイントです。

大体はユーザ数が試行回数となり、何らかの指標多くはCVRとかCTRにパターン間の差があるかどうかを統計的に検証しますよね。

ABテストやっていれば気付くんですけど、優位差99%とかはかなり期待できる確かな差ではあるんですけど、もっと低い有意差例えば９０％とかだと10回に1回は間違っているわけです。まずこれが大前提になります。

<h3>時系列で変わる外部前提があるともはやABテストの結果は信じ難い</h3>

で僕がここで考えたいのは、時系列で変わる外部前提があるともはや検証した時の結果は信じられないってことです。例えば、ABテストしていた時は商品数が多かった→なのでとある案件はうまくいった。

しかし、時間が経つにつれて商品数が何らかの理由で減ったりあるいは質が悪くなった場合に、そのABテストの良い結果が出る前提として良い商品があることだったとしましょう。

そうなるともう前提が違うのでABテストの効果も変わってきますよね。これはwebサービスであれば往往にして起こることなので、ABテストの効果はほとんど信じられないんじゃないか？と思うわけです。

<h2>じゃあABテストどうしたらいいの？</h3>

じゃあABテストどうしたらいいの？これは結論わかりません。というかこれがわかったら相当な革新です。

多くのABテストの事例では、こんなことをしてCVR１.５倍だ！ドヤァ！みたいな事例が乗っていますが、全部が全部永続してその効果が出ているわけではない、こういうことを知っておいたほうがいいのではないかと思います。

それは予算の投資の仕方だったり、深く考えることの大事さに気づきます。個人的にはもうABテストは長くやるしかないかなと思っており長ければ長いほうがいいでしょう。長期間モニタリングしてもなおよければそれは永続して効果を期待できるABテストなんじゃないでしょうか？

エンジニアの皆さんもディレクターの皆さんもですね、統計を過信してもよくないですし、過信しなすぎもよくないです。うまく使いましょう。

僕は、<a href="https://weblife-forjob.com/">weblife-forjob</a>というweb系やIT系の仕事についてブログを書いており気が向いたら読んでもらえると嬉しいです。今回はこちらで以上です。
chmodの3桁数字を自信を持って打ち込むために必要な合言葉

# それは

***「セキュリティ順！」***

セキュリティ上の重要度順に「実行」「書込み」「読込み」で1 -> 2 -> 4です。

# 概要

Linuxでファイルやディレクトリの権限を変更するchmodですが権限設定に使用するあの3桁文字列が、どうしても人間向けとは思えません。
（大昔に先輩がSharp X1のHu-BASICでキャラクタ定義(chardef)のビット列を方眼ノート片手にバチバチ入力しているのを眺めていた時の「これ覚えたらアブナイ人だな」感すら漂っています。）

普段はフィーリングで644!!などと定型を打っていますが、人前で入力するときなどこの合言葉で検算すると安心です。

ついでに「この人危ない人だわ、、、」という視線を感じた時に、人間のふりをするための言い訳にも使えるかもしれません。


# 使い方
### １、「セキュリティ順」に権限をならべる

３つの権限をセキュリティ上重要な順に並べます。

***実行 -> 書き込み -> 読込***

### ２、順に附番する

***1 -> 2 -> 4***

さらに自身のない筆者は「一番重要(1)なのは『実行』、二番目(2)が『書込み』、次が『読込』(よ(4)みこみ)」などと無駄な二重チェックを走らせます。数字の並びは「初項が1で公比2の等比数列」だとか、３だけ何処かに行ってしまったとかなんとか、、、

### ３、付与対象に応じて加算する

あとは権限の組み合わせに応じて加算して出来上がりです。
付与対象は順に***「うご！」***(User, Group, Other)です。

名著『レ・ミゼラブル』の作者のヴィクトル・ユーゴーということにしようと思っていますが、心の中では好きな漫画の『銃夢』（木城ゆきと）に出てくるサブキャラのユーゴーを思い浮かべています（最近ハリウッドでも映画化されましたね、最高ですよ）。

### (足し算が不安な人は）
もう指を使うしかないですね、、、
大丈夫です、我々は弱点を補うためにコンピュータを使っています
（Unixライクなシステムならbcコマンドが使えるかもしれません）

# 最後に

もしかすると「4桁の場合もありますよね？」という質問がくるかもしれません。
そんなときのために「chmod スティッキービット」などと検索して予習しておくと尚安心かもしれません。
年末まで毎日webサイトを作り続ける大学生 〜19日目 Ap●le 公式サイトのコンテンツ部分を真似して作ってみる〜

##はじめに
こんにちは！
年末まで毎日webサイトを作っている者です。
以前、Ap●leの公式サイトのコンテンツ部分を真似しようと試みました。
微妙な仕上がりです。
同じように再現するのって難しいなぁ・・・。
扱う技術レベルは低いですが、同じように悩んでる初心者の方を勇気付けられれば幸いです。
今日は19日目。(2019/11/6)
よろしくお願いします。

##やったこと
今日は、要素の配置を思い通りの場所に置こう！ということで他サイトの完コピを目指しました。全然完コピではない点はご了承ください。まずはgifでどうぞ（本家サイトと自分が作ったのを切り替えながら比較しています。最初に映るのは完璧にコピーできたわけではなくただの本家サイトです）↓
![test.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/516248/9ef39dce-7e5f-7976-771b-96262d7634db.gif)

構成は非常にシンプルです。

```html
<div class="content_page">
        <h2 id="content_page_title">Ephene 50000 Pro</h2>
        <h3 id="content_page_description">カメラも、ディスプレイも、性能も、Pro。</h3>
        <div>
            <a class="icon_bector" href="/">さらに詳しく</a><a class="icon_bector" href="/">購入</a>
        </div>
    </div>
```
class="content_pag"のところでが背景の画像を指定しています。
background-size: coverで全体的に画像がフィットするようにしています。↓

```css
.content_page {
...
background-image: url("iphone.jpg");
 background-size: cover;
}
```

あとは画面サイズが小さくなったらメディアクエリで大きさを調整します。↓

```css
@media screen and (max-width: 735px) and (min-width: 0px){
    .content_page {
        height: 350px;
    }
    #content_page_title {
        font-size: 30px;
    }
    .icon_bector {
        font-size: 11px;
    }
    #content_page_description {
        font-size: 14px;
    }
}
```

ただこれだけでは画像がややフィットぐらいのフィット感だったので、もしかして画像サイズからこだわらないといけないのかな？という疑念が湧いています。
画像はwebサイトで重要な役割を果たすので思いのママに操れるようになっておきたい・・・。というわけで調査して判明したらまた画像についてはご報告します。


あとついでに、擬似クラスも今日勉強したので載せておきます。

```css
.icon_bector::after{
    padding-left: .3em;
    content: ">";
    font-size: .4em;
}
.icon_bector:hover {
text-decoration: underline;
}
```

::afterは.icon_bectorクラスを指定している要素のすぐ後に何か表示したいときに使います。
cnotentプロパティで表示したいものを指定しています。

:hoverの方はクラスの上にカーソルが乗ったらスタイルを当ててくれる便利機能です。
これらを利用してJavaScriptをスタイル変更のためだけに多用することは防いで行きたいですね。


##感想
やってみて分かることって多いですね。自分はもっとできると根拠もなしに思ってましたが、今日の内容だけでも2時間半ぐらいかかってしまいました。自信がなくなる〜。年末になる頃にはweb制作の仕事を取れるようにするぞ！

最後までお読みいただきありがとうございます。明日も投稿しますのでよろしくお願いします。

##参考
1. PAKUTASHO (https://www.pakutaso.com/20190606175post-21617.html)

ぱくたそさん画像をお借りしました。ありがとうございます！
Cronの時間指定を@rebootにすると起動時実行できる

cronを使った定期実行ができるのは知っていたが、Raspberry piなんかを起動/再起動したタイミングで指定のプログラムを起動する方法はないんかなー？と思っていたらあったので個人的メモ。

[Scheduling tasks with Cron](https://www.raspberrypi.org/documentation/linux/usage/cron.md)

時間指定を`* * * * *`とかではなく `@reboot`にするだけで良いっぽい。
Jupyter NotebookをDockerを使って簡単にインストールし起動（nbextensions、Scalaにも対応）

タイトルの通りですが、Jupyter NotebookをDockerを使って簡単にインストールし使用するための作業ログです。Jupyter Notebook上でScalaも使えるようにします。

dockerはインストール済みとします。

以下の`Dockerfile`を準備します。Pythonのパッケージは使用するかもしれないものをひととおり書いておきます。

```docker:Dockerfile
FROM centos:7

RUN yum install -y python3 java-11-openjdk
RUN pip3 install jupyter jupyter-contrib-nbextensions jupyter_nbextensions_configurator numpy pandas matplotlib scikit-learn mlxtend boto3

RUN jupyter contrib nbextension install

# Jupyter-Scala インストール
WORKDIR /install
ENV SCALA_VERSION=2.13.1
ENV ALMOND_VERSION=0.8.2
RUN curl -Lo coursier https://git.io/coursier-cli
RUN chmod +x coursier
RUN ./coursier bootstrap -r jitpack -i user -I user:sh.almond:scala-kernel-api_$SCALA_VERSION:$ALMOND_VERSION sh.almond:scala-kernel_$SCALA_VERSION:$ALMOND_VERSION -o almond
RUN ./almond --install

WORKDIR /work

CMD jupyter notebook --ip='*' --no-browser --allow-root --NotebookApp.token=''
```

Pythonのパッケージの`jupyter-contrib-nbextensions`、`jupyter_nbextensions_configurator`と、そのあとで実行している`jupyter contrib nbextension install`はnbextensionsを使うためのものです。

Jupyter-Scalaのインストールに関しては以下の公式ページ参照。
[Installation · almond](https://almond.sh/docs/quick-start-install)

`jupyter`のオプションの` --allow-root`はroot権限のままJupyterを実行するために必要なオプションです。Dockerの中ではroot権限なので必要です。

` --ip='*'`はJupyterにどこからでもアクセスできるようにするための設定です。`--NotebookApp.token=''`はJupyterにブラウザでアクセスしたときのトークン入力をスキップさせるための設定です。私はPCの中のVirtualBoxで動くLinux上でこれを実行しているので、利便性のためにこれらを設定していますが、これは外部から自由にアクセスできてしまう設定なので普通は推奨されないと思います。

この`Dockerfile`のあるディレクトリで以下のコマンドでイメージを作成します。

```
$ docker build -t myjupyter .
```

Jupyterで作業したいディレクトリに移動してから以下のコマンドでJupyterを起動します。

```
$ docker run -it --rm -p 8888:8888 -v $HOME/.aws:/root/.aws -v $(pwd):/work myjupyter
```

`-v $HOME/.aws:/root/.aws`はboto3を使ってAWSのAPIにアクセスしたかったので付けています。

Jupyterを起動したらブラウザで8888番ポートにアクセスします。

普通のDockerだとJupyterで作成したファイルはオーナーがrootになってしまうので、rootless Dockerのほうがよさそうです。
Rubyの基本箇所についての復習④(ハッシュオブジェクト)

#はじめに
[前回の記事](https://qiita.com/Moon1126Snow/items/33066b3c09a873690c85)までの知識では、一つの変数に対して一つの文字か数字しか代入できません。
これでは、短い文章を表示するならともかく、複雑なアプリになってくると大量の変数を定義しなければいけなくなり、大変煩雑になってしまいます。
そこで、今回と次の記事にて、それを解消するために***ハッシュ***と***配列***というものを使えるようにしたいと思います。
#内容
ハッシュを使って、一つの変数で複数の情報を扱えるようになります。
#実行
ハッシュとは次のように書くものです。
```ruby
sport1 = { name: "野球", member: 9, item: "使う"}
```
```{}```の中に、```,```で区切られて3つの情報が存在します。
どの情報にも```:```が含まれています。
この場合、左側```（name,member,item)```を***キー***といい、右側```("野球",9,"○")```を***バリュー***と呼びます。
この状態は、3つの変数（キー）を同時に定義して、一つの変数（ハッシュオブジェクト）にまとめた様なものと言えます。
前述のハッシュオブジェクトは"野球は9人で行うスポーツで道具を使う"という情報をまとめたものです。
このままではただの情報の羅列なので、他人に伝わりやすいように文章として出力します。
文章出力には次のようにコードを書けばよいです。

```ruby
sport1 = { name: "野球", member: 9, item: "使う"}
puts "#{sport1[:name]}はsport1[:member]人で行うスポーツで道具を#{sport1[:item]}"
```
このコードを実行すれば"野球は9人で行うスポーツで道具を使う"という文章が出力されます。
```#{}```を使うのは前回までと同じですが、決定的違うところとして```#{}```の中身が```sport1[:～]```となっていることです。
これの意味することは、例えば```sport1[:name]***ハッシュオブジェクトsport1のキーの一つであるnameに保存されているバリューを呼び出す***という事です。

#おわりに
ハッシュを使えば、一つの変数（ハッシュオブジェクト）に多くの情報を持たせることができます。
しかし今のままだと、例えば100個のスポーツの情報を登録すると時に煩雑になってしまいます。
これを解消するために、次回の記事では***配列***の基礎を習得できるようにしたいと思います。
SCSSに色の変数を置くとSyntaxErrorと怒られる

# ＄redがなんや書き方エラーすわ...

[![Image from Gyazo](https://i.gyazo.com/347d645882efbc232cb0fbe19c024bd6.png)](https://gyazo.com/347d645882efbc232cb0fbe19c024bd6)

なんでやろ...
やったことは...

# SCSSに使い回す色を用意する
stylesheets/config/colors
[![Image from Gyazo](https://i.gyazo.com/e5bb11265f25eee1eeb55d4d3a2dbbf0.png)](https://gyazo.com/e5bb11265f25eee1eeb55d4d3a2dbbf0)

# よくimportし忘れちゃうから一応確認しておくか...(一応ね...)
stylesheets/application.scss
[![Image from Gyazo](https://i.gyazo.com/f6467d5bea5bd1d21b435d3035513884.png)](https://gyazo.com/f6467d5bea5bd1d21b435d3035513884)

ま、あるよね...

# じゃあ何が原因？

どうやらエラーの原因は
はじめにrails newで作成される
application.css内に記述してある
1行目から15行目のコメントアウトっぽいやつ。

scssに書き換える際にファイル名だけ変えている為、中身が
そのままになっていたから？っぽい。

改めて
stylesheets/appllication.scssのコメントアウトっぽいのを消して
実行すると...

[![Image from Gyazo](https://i.gyazo.com/ef70f802dea407a2fba7fd6fd241f3fd.png)](https://gyazo.com/ef70f802dea407a2fba7fd6fd241f3fd)

ちゃんとIndexファイルが読み込まれましたね。

cssで書いてあげる時は、さっきのコメントアウトは使うっぽい？
まだまだわからない事だらけだが、精進あるのみだ。。。
Rails チュートリアルを途中からやり直し


 先日チュートリアルをはじめ、第7章にいったあたりで、
コントローラー名を「user」にしていたことに気づき、
どうしようもならなくなってしまいました。

その後、Githubからコードをクローンしようとしたものの、
Gitの再設定やherokuの再設定などがうまくいきません。

どうしたらいいでしょうか。
Gatby.js＋NetlifyでLightHouse満点のサイトを1日で作った話

# Gatby.js＋NetlifyでLightHouse満点のサイトを1日で作った話

## 経緯
1. Qiita以外に雑記ブログ的なものをやってみた気分になる
1. 友人のエンジニアに勧められたGatsby.jsでブログを開設してみました。
1. 言われるがままとりあえず触ってみる

## ベース
今回はGatby.js＋Netlifyで行くことにしました。
https://www.gatsbyjs.org/starters/netlify-templates/gatsby-starter-netlify-cms/

いくつかGatsbyのスターターをクローンして試しましたが
このスターターが一番そのままブログとして使用できそうでした。

## Gatby.js＋Netlify選定理由
- Gatsbyは静的サイトジェネレーターなので高速
- Reactはあまり触ったことがなかったのでこの機会に触ってみたい
-  NetlifyはGitHubと連携するので楽に草が生やせる←

## 準備するもの
- Githubアカウント
- ブログに使用するドメイン

レンタルサーバー無しでOKです

## 手順
こちらの記事をそのままやってみる
https://qiita.com/ferretdayo/items/f5d97165b8c6d6077a44

環境構築から公開まで簡単

## いいと感じたこと
- 構築が簡単
- 表示速度が早く初期でも解析のスコアがかなり高水準
- お問い合わせフォームを用意してあるので設定すれば簡単に導入できる

## 困ったこと
- Reactに慣れていないため修正するときにいろいろと試しながら進めた
- WordPressのように記事にリンクを貼るだけでプレビューを表示できない
- インスタグラムの埋め込みで画像が表示できない

 **別件：書くことがない（というよりネタはあるけどちゃんとした記事を書かなきゃと思い手が止まる）**
アウトプット癖を作るには継続しかないなと実感

## 修正したこと
- GoogleAnalyticsを導入
- 画像軽量化ツールを使って画像を圧縮して軽量化
- アクセシビリティはデフォルトでは満点ではないので個別に修正しました
その際にスコアの出やすいデザインに変更などの対応
- パフォーマンス重視のため画像を最小限にしているのがいけてないので修正していきたい

## 完成
こちらで公開中
https://www.eezyanaika.com
![スクリーンショット 2019-11-06 13.50.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199085/bb0de9fc-7536-25a1-30b0-cc4af115877b.png)
DjangoアプリケーションをApacheで公開する

Djangoを用いて開発したアプリケーションをApacheサーバ上で公開したのでその手順をまとめておきます。

###http.confの編集
```conf:httpd.conf
WSGIScriptAlias / "/path/to/project/project/wsgi.py" process-group=hoge.com
WSGIDaemonProcess hoge.com python-path="/path/to/project/project"
WSGIProcessGroup hoge.com
```

このように設定することでアプリケーションにアクセスできるようになります。
この時、wsgi.pyまでのディレクトリのアクセス権限に注意しておかないとForbiddenが表示されます。
[Spring Boot] JDBCを利用してDBのテーブルを作る際は初期化が必要

# 環境
- Java 11.0.2
- Spring Boot 2.2.0  
- データベース MySQL 8.0.18

# はじめに
'schema.sql'にDBのテーブル情報を定義したのですが、レコードの内容を表示する際にエラーが出てしまう。
アプリの起動は出来ているのでDBとの接続が原因ではない。おかしいなぁとDBを確認したらテーブルが作成されていませんでした。

# 解決方法
YAMLファイルにDB初期化の設定を追加したら無事にテーブルが作成されました。

```yml:application.yml
spring:
  datasource:
    initialization-mode: always
    url: jdbc:mysql://localhost:3306/springboot-db?autoReconnect=true&useSSL=false&
      serverTimezone=UTC
    username: root
    password: root
    driver-class-name: com.mysql.jdbc.Driver
```

SQLファイルを使ったDBを初期化する場合は以下の設定を追加する必要があるのですね。
`spring.datasource.initialization-mode=always`

## 参考文献
[Spring Boot 2.0のカテゴリ別重要プロパティ一覧](https://qiita.com/suke_masa/items/d783528eb05ccbaded78#springdatasourceinitialization-mode)
[Spring Boot Reference](https://docs.spring.io/spring-boot/docs/current/reference/html/howto.html#howto-database-initialization)
MacのCatalinaさんでpyenv

# メモ

https://github.com/pyenv/pyenv/wiki

## 依存パッケージのインストール 

```
brew install openssl readline sqlite3 xz zlib
```

## CPPFLAGSを指定してpyenv install

```
env CPPFLAGS="-I$(brew --prefix zlib)/include -I$(brew --prefix openssl)/include" pyenv install 3.7.5
```
PowerShell テキストファイルの行を取得する

## 目的

- PowerShellでテキストファイルの行を出力する方法を知る。

## 書き方の例

- 下記に処理を記載する。

    ```powershell
    # 指定ファイルの最初からX行目までを取得する
    Get-Content テキストファイル名 | Select-Object -First X

    # 指定ファイルの最後から一行目のみを取得する
    (Get-Content テキストファイル名)[-1]

    # 指定ファイルの最後から二行目のみを取得する
    (Get-Content テキストファイル名)[-2]

    # 指定ファイルの二行目から四行目までを取得する
    (Get-Content テキストファイル名)[1..3]

    # 指定ファイルの2行目以降を取得する(一行目をスキップする)
    Get-Content テキストファイル名 | Select-Object -Skip 1
    ```

## より具体的な例

- コマンドを実行するカレントディレクトリにはtext.txtが存在しているものとする。
- test.txtには下記の内容が記載されているものとする。

    ``` test.txt
    aaa
    bbb
    ccc
    ddd
    eee
    fff
    ```

- 下記により具体的なテキストファイルの行の内容を出力する方法を記載する。
- `>`以降は出力を表す。

    ```powershell
    # test.txtの最初の二行目までを取得する
    Get-Content test.txt | Select-Object -First 2
    >aaa
    >bbb

    # test.txtの最後の一行目のみを取得する
    (Get-Content test.txt)[-1]
    >fff

    # test.txtの最後の二行目のみを取得する
    (Get-Content test.txt)[-2]
    >eee

    # test.txtの二行目から四行目までを取得する
    (Get-Content test.txt)[1..3]
    >bbb
    >ccc
    >ddd

    # test.txtの2行目以降を取得する(一行目をスキップする)
    Get-Content test.txt | Select-Object -Skip 1
    >bbb
    >ccc
    >ddd
    >eee
    >fff
```
pipを使ったmatplotlibのインストールでエラーが出て詰まった話

#要約
pipを使用してmatplotlibをインストールしようとしたところ、インストールに失敗した。
Pythonのバージョンを下げると、正常にインストールが可能となった。

#環境
Windows 10 64bit
Python 3.8.0 (→3.7.3 後述)

#背景
Python、Pandas、Numpy、matplotlibを使用したプログラムを常用のPC（PC1）で作成しており、正常に動作していた。
別のPC（PC2）で動作させる必要があり、PC2にPythonおよび各ライブラリをインストールしていた。

#事象
Python 3.8.0は公式のexeインストーラで正常にインストール完了。
Pandas、Numpyのインストールはpipから正常に完了（Pandasをインストールした時点で、Numpyもインストール）。

以下のコマンドでmatplotlibをインストールしようとした際に、エラーが出てインストールに失敗した。

```
C:\Users\[Username]>pip install matplotlib

（中略）

Installing collected packages: matplotlib
    Running setup.py install for matplotlib ... error
    ERROR: Command errored out with exit status 1:

（中略）

error: Microsoft Visual C++ 14.0 is required.

（後略）

```
ちなみに、Running setup.py installの行以後は赤字で表示された。

#対応
そもそもまずMicrosoft Visual C++を探すのに難儀した。それらしいものを入れてみてもエラーは変化しないし…

その後、以下の記事を参考にしてBuild Tools for Visual Studio 2017を入れてみた。
>https://qiita.com/white0221/items/b48f1b64dbd810e21702

その結果、エラーメッセージが以下のように変化した。しかし、errorが発生している点は変わらず。

```
error: command 'C:\\Program Files (x86)\\Microsoft Visual Studio\\2019\\BuildTools\\VC\\Tools\\MSVC\\14.23.28105\\bin\\HostX86\\x64\\cl.exe' failed with exit status 2
```

更に「matplotlib error status1」やら「matplotlib インストール エラー」でgoogle検索を続けた結果、以下の質問と回答を見つけた。
>https://teratail.com/questions/219050

Python 3.8.0をアンインストール、Python 3.7.3をインストールしてからpip経由でmatplotlibをインストールしたところ、拍子抜けするぐらい簡単に成功！

#学んだこと
とにかく安定版を使う！
理工系略語辞典

# 本記事の概要

この記事は以下のツイートから派生したものです。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">追加<br>ザル：プロポーザル（観測提案書）<br><br>あと次は理系略語辞典やってほしいです<br>例えばCNN=Convolutional Neural Network、HST=Hubble Space Telescopeみたいな</p>&mdash; きくち (@chrys_180) <a href="https://twitter.com/chrys_180/status/1186542443920904193?ref_src=twsrc%5Etfw">October 22, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

# スペシャルサンクス

このツイートを元に情報を寄せてくださった皆様、本記事をご覧になった皆様。

# こんな略語もあるよという方

おりましたらどしどしコメント & 編集リクエストを投げてください。折を見て追加いたします。

# A
ABL: Atmospheric Boundary Layer (大気境界層)
ALMA: Atacama Large Millimeter/submillimeter Array

# B
BAO: Baryon Acoustic Oscillation (バリオン音響振動) 
BCS: Bardeen Cooper Schrieffer theory
BH: Black Hole (ブラックホール)

# C
CNN: Convolutional Neural Network (畳み込みニューラルネットワーク)
CFD: Computational Fluid Dynamics (数値流体力学)

# D
DFT: Discrete Fourier Transform (離散フーリエ変換), Density Functional Theory (密度汎関数)
DJF: December January February (北半球冬)

# E
ESF: Edge Spread Function

# F
FFT: Fast Fourier Transform (高速フーリエ変換)
FWHM: Full Width at Half Maximum

# G
GFD: Geophysical Fluid Dynamics (地球流体力学)
GRMHD: General Relativistic Magneto Hydro Dynamics (一般相対論的磁気流体)

# H
HST: Hubble Space Telescope (ハッブル宇宙望遠鏡)

# I
IUT: Inter-universal Teichmuller theory (宇宙際タイヒミュラー理論)
ISCO: Innermost Stable Circular Orbit (最内縁安定軌道) 

# J
JJA: June July August (北半球冬)

# K

# L
LSF: Line Spread Function

# M
MAM: March April May (北半球春)
MFD: Manifold (多様体)
MHD: Magneto Hydro Dynamics (磁気流体力学)
MTF: Modulation Transfer Function

# N
NEQ: Noise Equivalent Quanta

# O

# P
PNT: Prime Number Theorem (素数定理)
PSF: Point Spread Function 

# Q
QCD: Quantum Chromo Dynamics (量子色力学)
QED: Quantum Electro Dynamics (量子電磁力学), Quod Erat Demonstrandum (証明終了)
QFT: Quantum Field Theory (場の量子論)
QM: Quantum Mechanics (量子力学)

# R
RHD: Radiation Hydro Dynamics (輻射流体力学)
RMHD: Radiation Magnety Hydro Dynamics (輻射磁気流体力学)
RPA: Random Phase Approximation (乱雑位相近似), Robotic Process Automation (ロボットによる自動化)

# S
SDSS: Sloan Digital Sky Survey
SFR: Star Formation Rate (星形成率)
SFT: String Field Theory (弦の場の理論)
SKA: Square Kilometer Array (百万平米電波望遠鏡)
SON: September October November (北半球秋)
SSP: Slice Sensitivity Profile
SST: Sea Surface Temperature (海面表面温度)
SUSY: Supersymmetry (超対称性)
SZ: Sunyaev Zeldovich effect (スニヤエフ・ぜルドヴィッチ効果)

# T
TTS: Time To Solution

# U

# V
VLBI: Very Long Baseline Interferometry（超長基線干渉計)

# W
WKB: Wentzel Kramers Brillouin (approximation)
WS: Wiener Spectrum

# X

# Y

# Z
Buttonのタイトル変更について

## Buttonのタイトルが変更できない、、、
Labelと同じだと思い

```swift:changeButtonTitle
ボタン名.currentTitle = "変更したいタイトル名"
```

とすると、エラーが表示されてしまいました。


## 変更方法

以下のコードで変更できました↓

```swift:changeButtonTitle
ボタン名.setTitle("変更したいタイトル名", for: .normal)
```

##### 参考サイト
- https://stackoverflow.com/questions/26326296/changing-text-of-uibutton-programmatically-swift
【Ruby】minitestを使う方法

#概要
アウトプット用に、学習した内容を紹介していきます。
本日の内容はRubyにおける単体テストのためのライブラリ、minitestについてです。

#環境
Mac OS Mojave 10.14.6
Ruby 2.5.3
エディタ VSCode

#minitestとは
minitestとは上記の通り、単体テスト（プログラムの中で個々の機能が正しく動作しているか検証する）のためのライブラリです。
今回は'hello'という文字列を返すメソッドを持つ以下のクラスをテストしてみます。

```Ruby:Hello.rb
class Hello
  def hello
    return 'hello'
  end
end
```
これに対するテストプログラムは以下のようになります。

```Ruby:TestHello.rb
require 'minitest/autorun'
require_relative 'Hello.rb'

class TestHello < Minitest::Test
  def setup
    @hello = Hello.new
  end

  def test_hello
    assert_equal 'hello', @hello.hello
  end
end
```
require 'minitest/autorun'で、プログラム実行時にテストが自動実行されるようになります。
require_relativeでテスト対象のファイルを相対パスで指定します。今回は同じディレクトリにHello.rbを置いていたためファイル名のみとなっています。

またその下、TestHelloはMinitest::Testを継承したテストクラスです。ここにテストの内容などを記述していきます。
setupメソッドでは、テスト対象であるHelloクラスのインスタンスを作成します。
test_helloでは、`assert_equal (自身が期待する実行結果) (テスト対象を実行して実際に返ってくる結果)`という形で記述します。これにより期待される値が返ってきたかどうか比較され、そのテスト結果が出力されます。

#結果
```
$ ruby TestHello.rb 
Run options: --seed 42144

# Running:

.

Finished in 0.000922s, 1084.5987 runs/s, 1084.5987 assertions/s.

1 runs, 1 assertions, 0 failures, 0 errors, 0 skips
```
無事成功しました。
ここでfailuresが出た場合は期待した結果と実行結果が異なっており、errorsが出た場合は例外が発生しています。
Swiftで予約語を変数名やCase名として使う


Swiftで変数名やenumのcase名を命名しようとして使った単語が、予約語であったため使えなかったという事態に遭遇したことがある人は多いと思う。

```UserStatus.swift
enum UserStatus {
    
    // Error: private' modifier cannot be applied to this declaration
    case private
    case open
}
```

```Vars.swift
// selfという命名のString型の変数は作れない
let self = "Ham Spam"
```

今回はその回避方法と、回避方法を使う際の注意点を解説する。



## 予約語を使う

Swiftの予約語として使われている単語は``でその変数名やenumのcaseを囲むことで使うことができる。

```Enum.swift
enum Status {
    case `public`
    case `private`
}

let status1 = Status.private
let status2 = Status.public

print(status1) // private
print(status2) // public 
```

```varnames.swift
let `self` = "String which variable is named self"
print(self) // String which variable is named self
```

上記の２つの例はどちらもコンパイルエラーにならず、そのまま変数名として使うことができる。



## 取り扱い注意！

さてここまでで説明した通り、swiftの予約語は``で囲いさえすれば簡単に変数名やenumのcaseとして使えてしまう。これは予約語を変数名やenumのcaseとして使いたければいつでもこの方法を使って使えばいいのだろうか？



Swift.orgの解説には以下のようにある。



> If you need to give a constant or variable the same name as a reserved Swift keyword, surround the keyword with backticks (`) when using it as a name. However, avoid using keywords as names **unless you have absolutely no choice.**

<cite>[The Basics by Swift.org](https://docs.swift.org/swift-book/LanguageGuide/TheBasics.html#//apple_ref/doc/uid/TP40014097-CH5-ID310)</cite> 太字が著者が編集したもの。



絶対的に他に選択肢がない場合以外は、予約語を``で囲って使うことはしないようにとある。予約語を予約語以外の意味を持たせて使うことは、コードの可読性の低下やミスにつながる可能性があるので極力避けるべきだろう。



## さいごに

予約語は簡単に変数名やenumのcaseとして使うことが可能だが、極力避けるべきだ。予約語を使いたくなったら創意工夫をしてできる限りその予約語を使わない別の変数名を考えるのが良いだろう。また規模が大きいプロジェクトになった場合はそもそも予約語をこのような方法で使うのを禁止するルールを定めるのもありかもしれない。
【中級者への道】Pythonの*args, **kwargsって何？


# まとめへのリンク

https://qiita.com/ganariya/items/fb3f38c2f4a35d1ee2e8


# はじめに

Pythonのコードをよく見ていると

```python
def f(*args, **kwargs):
    pass
```

`*印付きのargs`
そして`**印付きのkwargs`というのを見かけます。

これは何なのでしょうか？？

# そもそも何の略？

args, kwargsはそれぞれ何の略なのでしょうか？

英語で引数を`argument`といい、複数なら当然argumentsです。
Pythonはかなり省略しがちな記法であり

- args = argumentsの略　可変長タプル
- kwargs = keyword argumentsの略　キーワード辞書

という意味になっています。

# *args

`*args`は、関数で渡された**余ったキーワード指定なし引数**を、一個のタプルで受け取ることの出来る記法です。

例えば、以下のようにたくさん与えられた整数を足して返す関数accumulateを考えてみます。

```py
def accumulate(*args):
    print(args)
    return sum(args)

'''
(10, 20, 30, 40)
100
'''
print(accumulate(10, 20, 30, 40))
```

accumulateに与えられた引数が多いため、`*args`にタプルとして格納されます。

このように`*args`のように、「アスタリスク」を一つ付けた引数を用意することで、余ったキーワード指定なし引数を一個に受け取ることができます。

さらに、タプルやリストのイテラブルは、「アスタリスク」を再びつけることで、**アンパック**することができます。

```py
def accumulate(*args):
    print(*args)
    return sum(args)

'''
10 20 30 40
100
'''
print(accumulate(10, 20, 30, 40))
```

よって、このアンパックを使うことで、何度でも他の関数にわたすことができます。

```py
def accumulate(*args):
    return sum(args)


def some_calc(*args):
    
    # アンパックしてaccmulateにわたす
    return accumulate(*args)


print(some_calc(10, 20, 30, 40))
```

# **args

`**args`は、キーワード指定引数で、他の引数で当てはまらなかったものを一緒くたに**辞書として受け取ります**。

```py
def f(x, y, **kwargs):
    print(x)
    print(y)
    print(kwargs)


'''
10
20
{'a': 20, 'b': 'hello'}
'''
f(x=10, y=20, a=20, b="hello")
```
上記では、x, yはすでに関数fの引数に存在するためそっちに流れますが、何も受け取り手がないa, bは残念ながらkwargsに一緒くたにされてしまいます。

辞書もアンパックが可能です。

「アスタリスク」を一つのみ使うと、キーのみ取り出せます。
そして、2つ使うと、a=20, b="hello"のような形になります。

```py
def f(x, y, **kwargs):
    print(x)
    print(y)
    print(*kwargs)

    #print(**kwargs)


'''
10
20
a b
'''
f(x=10, y=20, a=20, b="hello")
```
`print(**kwargs)`は残念ながらうまく動きません。エラーが出てしまいます。
Pythonのprintに
`print(a=20, b="hello")`という記法が用意されていないためです。


# 最後に

`*args`, `**kwargs`は、動的な言語だからこそできる記法であり、
これがよくPythonのパッケージのdef __init__などで使用されています。
これによって、ユーザから与えられたパラメータなどを辞書やタプルで受け取ることができ、多くの挙動を許容してくれます。

varsと一緒に活用すると、非常に便利な挙動を実行することができます。
それは別の記事で扱いたいと思います。
[ゼロから作るDeep Learning]ソフトマックス関数から交差エントロピー誤差までのレイヤ実装

#はじめに
この記事は**ゼロから作るディープラーニング 6章誤差逆伝播法**を自分なりに理解して分かりやすくアウトプットしたものです。
文系の自分でも理解することが出来たので、気持ちを楽にして読んでいただけたら幸いです。
また、本書を学習する際に参考にしていただけたらもっと嬉しいです。


#出力層から損失関数までのレイヤ実装
ニューラルネットワークに逆伝播処理を実装するための最後のピースである出力層から損失関数までのレイヤ実装を行いたいと思います。

今回は分類に使うソフトマックス関数から交差エントロピー誤差までのレイヤ実装をしたいと思いますが、この部分は回帰に使う二乗和誤差の時もほとんど同じ実装になるのでこれを参考にすればできるかと思います。


```python
class SoftmaxWithLoss: # ソフトマックス関数＋交差エントロピー誤差のレイヤ
    def __init__(self):
        self.loss = None # 損失関数の値
        self.y = None # softmax関数の結果
        self.t = None # 教師データ
        
    def forward(self, x, t):
        if t.ndim == 1: # 正解データがone-hotじゃない場合は直す
            new_t = []
            for i in t:
                oh = list(np.zeros(10)) # 分類ラベルの数
                oh[i] = 1
                new_t.append(oh)
            t = np.array(new_t)
        self.t = t
        self.y = softmax_function(x)
        self.loss = cross_entropy_errors(self.t, self.y)
        
        return self.loss
    
    def backward(self, dout=1):
        batch_size = self.t.shape[0]
        dx = (self.y - self.t) / batch_size # バッジに対応するために誤差をデータ数でわる
        
        return dx
```

順伝播処理では、ソフトマックス関数ではone-hot法の正解データしか使えないので最初にone-hotじゃない正解データだったら、one-hotに直します。

そしてあとは、今まで作成してきたソフトマックス関数や交差エントロピー誤差のメソッドを呼び出して使用します。

逆伝播処理は簡単で、予測データから正解データを引いて誤差を出し、それを総和してそれから平均を出します。
実を言うと、ソフトマックス関数・交差エントロピー誤差と恒等関数・二乗和誤差のような組み合わせになる理由は、逆伝播処理を上のような単純な式で求められるよう調整され二つの関数が作られたからなのです。

そのため最初に言った通り、恒等関数と二乗和誤差の場合も逆伝播処理は上のように実装すれば良いです。