OmniAICreator/Qiita-1.07M huggingface dataset:
Configuration file '/etc/xdg/autostart/piwiz.desktop'って何？

#概要
ある朝、いつものようにnasに使っているRaspberryPiをsudo apt upgradeしているとこんな表示が。
![SnapCrab_NoName_2020-12-6_16-8-46_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64298/09f44110-1220-76c2-24b4-afc0ac8e1e13.png)
調べてみるとpiwiz.desktopというのはどうも初期設定ウィザードの設定ファイルらしい。

Raspberry Pi OSで何度も出せる初期設定ウィザード「piwiz」
https://raspida.com/sudo-piwiz

#翻訳してみた
```:原文
Configuration file '/etc/xdg/autostart/piwiz.desktop'
 ==> Deleted (by you or by a script) since installation.
 ==> Package distributor has shipped an updated version.
   What would you like to do about it ?  Your options are:
    Y or I  : install the package maintainer's version
    N or O  : keep your currently-installed version
      D     : show the differences between the versions
      Z     : start a shell to examine the situation
 The default action is to keep your current version.
```

```:訳文
設定ファイル '/etc/xdg/autostart/piwiz.desktop'
 ==> インストール後に(自分またはスクリプトによって)削除されました。
 ==> パッケージ配布元が更新版を出荷しました。
   あなたはどうしますか?  選択肢は以下の通りです。
    Y または I : パッケージメンテナのバージョンをインストールする
    N または O : 現在インストールされているバージョンを維持する
      D : バージョン間の違いを示す
      Z : シェルを起動して状況を調べる
 デフォルトのアクションは、現在のバージョンを維持することです。
```
#オプションを選んでみる
##D：バージョン間の違いを示す、を選んだ場合
![SnapCrab_NoName_2020-12-6_16-21-38_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64298/2184c835-878b-30d1-550c-1e2ec21ccc3d.png)

##Z : シェルを起動して状況を調べる、を選んだ場合
![SnapCrab_NoName_2020-12-6_16-21-53_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64298/abc7c344-1df5-c724-671a-9b8f73ff7428.png)

#処置
古いバージョンの設定ファイルを残すと後々面倒になりそうと感じたので、結局Yを選択してメンテナのバージョンをインストールしました。
今後、何かしらの影響が出たり新しい事が分かりましたらこの記事に追記したいと思います。
Rails エスケープ

Railsのエスケープとかについて、知識が曖昧だったので調べてみる
また後日、きちんと調べる

##XSS(クロスサイトスクリプティング)攻撃
まず、エスケープを知る前にこの攻撃方法を知っとかないといけない

XSS(クロスサイトスクリプティング:Cross Site Scripting)とは、
ユーザーに表示するコンテンツに悪意のあるスクリプト(主にJS)を
仕掛け、そのコンテンツを表示したユーザーにスクリプトを実行させることで
任意の操作をさせる攻撃のこと

Webアプリにおいて、動的にhtmlを出力する時、
そのデータをエスケープしていないと
悪意のあるhtmlやjavascriptが紛れ込む

JSは、ブラウザ上で動作し
Cookieなども更新することができたりするのでセキュリティには気をつける

例)クリックするとセッションIDが盗まれてしまう
任意のメッセージや処理が行われる など

##どう対策するか
ユーザーの入力した文字を出力する際に
自動的にHTMLを`エスケープ`する必要がある

デフォルトでエスケープさせる

###エスケープとは
スクリプトを実行する対象となる文字列を
無害な文字に置き換えること

```
& → &amp;
" → &quot;
< → &li;
> → &gt
```

##エスケープしたくないとき
この自動的にHTMLをエスケープしてくれる仕組みは、便利だが
どんなときも文字列をエスケープしたいかというとそうではない

このようなときは、以下のメソッドを使用する

##String#html_safe
html_safeメソッドそれ自体は何らエスケープを行なっていないという
`安全であるとマーキング`しているに過ぎないので注意する

```rb
s = "".html_safe
s.html_safe? # => true
```

```rb
s = "<script>...</script>".html_safe
s.html_safe? # => true
s            # => "<script>...</script>"
```
あくまで、「s」にはまだスクリプトが埋め込まれている状態

特定の文字列に対してhtml_safeメソッドを呼び出す際には、
`その文字列が本当に安全であることを確認する`義務がある

```rb
"<em>#{text}</em>".html_safe
#=> ヘルパーを使う
content_tag :em, text
```

- 安全でない文字列をエスケープ無しで出力しない
- ヘルパーでタグを出力する

##sanitizeメソッド
ある程度タグをそのまま出したいものの、危険なタグは
出力しないようにしたいという場合に利用する

出力できるタグをホワイトリスト形式で制限する

sanitizeはフィルタした結果のHTMLに対して
「String#html_safe」を実行して返すので
さらに、「raw」や「String#html_safe」を使う必要がない

```rb
<% @comment = "<script>alert('Hello');<script>
<%= sanitize @comment %>

#生成されるHTML
<div>alert('Hello');</div>
```

##参考記事
https://railsguides.jp/active_support_core_extensions.html
https://qiita.com/kamohicokamo/items/571c58f2d6738a7dfe6a
https://techracho.bpsinc.jp/hachi8833/2016_08_31/25326
https://qiita.com/sutetotanuki/items/5eda6bbb5532dd64529a#%E3%82%AF%E3%83%AD%E3%82%B9%E3%82%B5%E3%82%A4%E3%83%88%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0xss
https://railsguides.jp/security.html
https://www.websec-room.com/2013/03/14/567
https://blog.tamesuu.com/2019/10/14/459/
https://yuruli.info/rails5-using-escape-methods/
README.org

\![Mac OS X-10.15.7](<https://img.shields.io/badge/MacOSX-10.15.7-brightgreen>) \![ruby-2.7.1p83](<https://img.shields.io/badge/ruby-2.7.1p83-brightgreen>) 


# qiita\_links

1.  [README.org](https://qiita.com/yoshida-naoki001/items/1319b96446aab9e87b39)
2.  [第5回(入出力)<2020-10-21 水>](https://qiita.com/yoshida-naoki001/items/1f78e8b13cf12f181f3f)
3.  [第6回(変数とメソッド)<2020-10-28 水>](https://qiita.com/yoshida-naoki001/items/6d4142376c8493302faa)
4.  [第7回(条件分岐)<2020-11-04 水>](https://qiita.com/yoshida-naoki001/items/8ef40e96e2a72ff6d3e9)
5.  [第8回(rake)<2020-11-11 水>](https://qiita.com/yoshida-naoki001/items/0a2d7d31f9e2ef4bcfdd)
6.  [第9回(assert\_equal)<2020-11-18 水>](https://qiita.com/yoshida-naoki001/items/3ce42a5e0b8476ab610d)
7.  [第10回(フィボナッチ数列)<2020-11-25 水>](https://qiita.com/yoshida-naoki001/items/bf3a70730c0360eee0a7)
8.  [第11回(class化)<2020-12-02 水>](https://qiita.com/yoshida-naoki001/items/4ae9d609a02d5b7618b4)
9.  [第13回(thor,rubocop)<2020-12-16 水>](https://qiita.com/yoshida-naoki001/items/b0602c06fa17dee83544)


# 課題

1.  [roman\_numerals](https://qiita.com/yoshida-naoki001/items/871db7d2f693458897e2)



------
 - **source** ~/grad_members_20f/members/yoshida/README.org
VirtualBoxでフルスクリーンにする

VirtualBox Guest Additionsを追加すればよい。

1.デバイスからVirtualBox Guest Additionsを選択しインストールする。
![ksnip_20201206-164732.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396969/5afab97a-0b36-783a-ba81-80702e510f2d.png)

2.ストレージにVirtualBox Guest Additionsを追加する
![ksnip_20201206-165006.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396969/56bc0743-32b3-874a-8dfe-9bbf65c81bf5.png)

3.ターミナルで`VBoxLinuxAdditions.run`で行う。

フルスクリーンでVirtualBoxが楽しめる。
お疲れ様でした。

参考
https://ponsuke-tarou.hatenablog.com/entry/2017/07/23/175358
チーム開発で必要なgitコマンド【学習用まとめ】

チーム開発をするにあたって、最低限必要なコマンドを学習用にまとめました。

前提となるGitの仕組みと各コマンドの意味を理解して、それらを適切に使ったら、コンフリクトは発生しなくなった。

#Gitが管理するファイルの3つの段階
ローカルにおいて、Gitはファイルのバージョンを管理するにあたって、ファイルを3つの段階に分けて扱っている。

##①作業エリア
・開発者がファイルの変更を行った段階
・まだGitは変更を管理してない
##②ステージングエリア
・変更が登録される準備段階
・git addされた段階
##③ローカルリポジトリ
・変更がリポジトリに登録された段階
・git commitされた段階

#gitコマンド

###git status
・Gitの状態を確認する


###git add ファイル名

・指定したファイルをリポジトリに追加する
・指定されたファイルはステージングエリアに格納される

###git commit

・addで追加されたファイルをリポジトリに保存する
・コミットの段階でファイルの記録が保存される

###git branch ブランチ

・ブランチを作成する
・引数がない場合はブランチ一覧と現在のブランチが表示される

###git branch -D ブランチ
・ブランチを削除する

###git checkout ブランチ

・ブランチを移動する

###git clone コピー元のリポジトリ (コピー先ディレクトリ)

・リポジトリの複製
・予めクローン先のディレクトリを作成し、そのディレクトリに移動してコマンド入力するか、コピー先のディレクトリを指定する

###git pull origin リモートブランチ

・ローカルブランチにリモートブランチの内容を取り込み、ローカルブランチをリモートブランチに同期させる
・同期させたいローカルブランチで行う

###git push origin リモートブランチ

・リモートブランチにローカルブランチの変更を送る
・変更を反映させたいローカルブランチで行う

###git merge ローカルブランチ

・ローカルブランチ同士を結合させる

ブランチAにブランチBを結合させたい場合

```
$ git checkout A #ブランチAに移動
$ git merge B #ブランチBをブランチAに結合
```

#まとめ

どのブランチで作業をしているのか？
ファイルの状態はどうなっているか？

をgit branch、git statusコマンドで確認しながら、必要な操作をしていけばコンフリクトはそうそう発生しないはず、、、

参考
https://qiita.com/wann/items/688bc17460a457104d7d

https://git-scm.com/book/ja/v2/Git-%E3%81%AE%E5%9F%BA%E6%9C%AC-Git-%E3%83%AA%E3%83%9D%E3%82%B8%E3%83%88%E3%83%AA%E3%81%AE%E5%8F%96%E5%BE%97
"OSI参照モデル"とはいったい何？

ネットワークに関して勉強していると必ず目にする『OSI参照モデル』という言葉。

聞いたことはあるけど、説明はできない、ぼんやりしているという方が多いと思います。
そこで今回は、”OSI参照モデル”についてまずは大枠を簡潔に説明していきます。
<h1>

[目次]
<h4>・OSI参照モデルとはいったい何？
・なぜそんなものが存在するの？
・OSI参照モデルの仕組みはどうなっているの？
<h1>

<h1>・OSI参照モデルとはいったい何？</h1>

＝『世界中でネットワーク通信のルールを共通にしよう！』というものです。
　（ルールのことを”プロトコル”と言います）

これは、コンピューターをはじめとする通信機器の機能を定義する国際標準化機構(ISO)によって決められた標準モデルです。

<h1>・なぜそんなものが存在するの？</h1>

＝OSI参照モデルを提供することで、ネットワークの仕組みを簡単に理解できるようにし、世界中で通信規格を共通化しようとした経緯があります。つまり、様々な方法で通信が可能なネットワークに統一性を持たせることが目的だったわけです。

（記事を読み終わったら、『TCP/IP』という基本ルールも調べてみてね）


<h1>・OSI参照モデルはいったいどうなっているの？</h1>

＝OSI参照モデルは、７つの種類に分類されています。なぜかと言うと、７つはそれぞれネットワークが機能として持つべきポイントだからです。この７つを理解することで、ネットワークにどのような機能があるのか、どんな形で構築されているのかが把握できます。

[仕組み]
<h4>第７層　ー　アプリケーション層
第６層　ー　プレゼンテーション層
第５層　ー　セッション層
第４層　ー　トランスポート層
第３層　ー　ネットワーク層
第２層　ー　データリンク層
第１層　ー　物理層



このようにそれぞれ区別されています。
ではいったい、それぞれがどんな働きをするのでしょうか。

<h4>◉第７層：アプリケーション層
＝アプリケーションごとのサービスを提供する方法を規定

<h4> ◉第６層：プレゼンテーション層
＝アプリケーションデータを通信に適した形に変換する方法を規定

<h4> ◉第５層：セッション層
＝データの通信路の確立と、切断について規定

<h4> ◉第４層：トランスポート層
＝データを通信相手にちゃんと届ける方法を規定

<h4> ◉第３層：ネットワーク層
＝同じもしくは異なるネットワーク機器と接続する際の、アドレスと経路の選択方法を規定

<h4> ◉第２層：データリンク層
＝直接接続された機器との間に伝送路（データリンク）を確立する方法を規定

<h4> ◉第１層：物理層
＝ネットワークケーブルの材質やコネクタの形式など物理的な要素を規定


<h1>まとめ</h1>
OSI参照モデルとは、『コンピューターが通信するときのルールの集まりなんだなあ〜』と理解してくれれば良いと思います。


Thanks!
WSL2のインストールでエラーコード"0x80370102"が出た時の話

ごきげんよう、ちゃまおです。

約2ヶ月前の話になりますが、WSL1をインストール済みのWindows10環境にWLS2を導入しようとして、エラーが出た時の話をします。

#やりたかった事
WSL1の環境は残しつつ、WSL2を新たにインストールする。

#WSL2の導入方法
[マイクロソフトの公式ガイド](https://docs.microsoft.com/ja-jp/windows/wsl/install-win10)に従って作業しました。

#エラー内容
MSストアでインストールしたLinuxディストリビューション(Ubuntu 20.04 LTS)を起動したところ、エラーコード"0x80370102"と出て、起動に失敗しました。

#エラーの原因と解決方法
マイクロソフトの公式ガイドによると、今回のエラー原因はCPUの仮想化が有効になっていない事みたいです。

> - インストールがエラー 0x80070003 またはエラー 0x80370102 で失敗した
    * コンピューターの BIOS 内部で仮想化が有効になっていることを確認してください。 これを行う方法の手順は、コンピューターによって異なりますが、最も可能性が高いのは CPU 関連のオプションの下です。

BIOSを起動して確認した所、確かにIntel VTが無効になっていたので、有効にしました。しかしながら、タスクマネージャーのCPUパフォーマンス上では「仮想化：無効」のままとなっていました。

[こちらの記事](https://netdekagaku.com/wsl2-ubuntu/)を参考に、Hyper-Vを無効化した所、仮想化が有効になり、WSL2の導入に成功しました。
ジャンクションについて

この記事は[Takumi Akashiro ひとり Advent Calendar 2020](https://qiita.com/advent-calendar/2020/takumi_akashiro "ひとり Advent Calendar 2020")の7日目の記事です。

初心者向けにExtendScriptのことを書いてたら筆が止まって困ってるので、今週は更に小ネタ続きとなります。

## 始めに

* あるディレクトリの一部分だけ、別のボリューム(SSDとか)に置きたい。
* ファイルを保存するたびに管理者権限が必要で、UACで許可を出すのが面倒

読者のみなさまは、以上のような悩みを抱えたことはないでしょうか。
今日はこれを解決するかもしれないテクニックについて話します。

それはジャンクションです。

## ジャンクションとは
とてもザックリ説明すると通常のファイルシステムであつかえるショートカットです。

あ、この説明、C言語の初心者向け解説で`#include` をおまじないと呼ぶぐらいに雑なので話半分で聞いてくださいね。

まあ見てもらえればわかると思います。

ジャンクションは以下で作成できます。

```batch
mklink /j <dst> <src> 
```

## 実践
試しに管理者権限が必要なProgramFilesの下からジャンクションを作ってみましょう。

```batch
D:\>if exist scripts (echo True) else (echo False)
False

D:\>if exist "scripts\Delete All Empty Layers.jsx" (echo True) else (echo False)
False

D:\>if exist "C:\Program Files\Adobe\Adobe Photoshop 2021\Presets\Scripts\Delete All Empty Layers.jsx" (echo True) else (echo False)
True

D:\>mklink /j scripts "C:\Program Files\Adobe\Adobe Photoshop 2021\Presets\Scripts"
D:\Scripts  <<===>> C:\Program Files\Adobe\Adobe Photoshop 2021\Presets\Scripts のジャンクションが作成されました

D:\>if exist "scripts\Delete All Empty Layers.jsx" (echo True) else (echo False)
True

D:\>type nul > scripts/nanka.txt
アクセスが拒否されました。
```

ハイ出来ましたね！
いやいや、最後アクセス拒否されててダメじゃねーか！と思われている皆様もいると思います

そう、実はこれだけではだめなんです。
でも逆にProgramFiles側にジャンクションを張って権限のないフォルダをソースとして扱えば……！

```batch:管理者権限にて
C:\Windows\system32>robocopy "C:\Program Files\Adobe\Adobe Photoshop 2021\Presets\Scripts"  "D:\Scripts" /s /e
rem 中略

C:\Windows\system32>rename "C:\Program Files\Adobe\Adobe Photoshop 2021\Presets\Scripts"  "Scripts_bak"

C:\Windows\system32>mklink /j "C:\Program Files\Adobe\Adobe Photoshop 2021\Presets\Scripts" "D:\Scripts"
C:\Program Files\Adobe\Adobe Photoshop 2021\Presets\Scripts <<===>> D:\Scripts のジャンクションが作成されました
```

```batch
D:\>type nul > d:/scripts/foo.txt

D:\>if exist "scripts/foo.txt" (echo True) else (echo False)
True

D:\>if exist "C:\Program Files\Adobe\Adobe Photoshop 2021\Presets\Scripts\foo.txt" (echo True) else (echo False)
True
```

無事ファイルを作れてますね！

## 締め

ジャンクションを取り上げるにも関わらず、一つもFF8ネタを擦れなかった敗北感はありますが、まあいいです。
ジャンクションを **適切に** つかおう！

## 参考
[mklink | Microsoft Docs](https://docs.microsoft.com/ja-jp/windows-server/administration/windows-commands/mklink "mklink | Microsoft Docs")
[Python] BFS（幅優先探索）　ABC168D

#[ABC168D](https://atcoder.jp/contests/abc168/tasks/abc168_d)
連結グラフなので、BFSの原理から最小性が保障されることに注意する。
参考
[BFS (幅優先探索) 超入門！ 〜 キューを鮮やかに使いこなす 〜](https://qiita.com/drken/items/996d80bcae64649a6580)

```python:サンプルコード
from collections import deque
# 頂点数と辺数
N, M = map(int, input().split())
# 辺
AB = [map(int, input().split()) for _ in range(M)]
# 無向グラフの隣接リスト設定
link = [[] for _ in range(N + 1)]
for a, b in AB:
  # aとbをそれぞれ紐付け
  link[a].append(b)
  link[b].append(a)
# BFSのデータフレーム
dist = [-1] * (N + 1) # 看板未設定
que = deque([1]) # 頂点1を始点とした訪問キュー
# BFS 開始 (キューが空になるまで探索を行う)
while que:
  v = que.popleft() # キューから先頭頂点(現在地)v取得
  for i in link[v]:
   # 未設定頂点iに現在地への看板を設定し訪問キューに追加する
   # 未設定頂点iに現在地への看板を設定し、iを訪問キューに追加する
   if dist[i] == -1:
     dist[i] = v
     que.append(i)

# 結果出力（各頂点に設置する看板）
print('Yes')
print('\n'.join(str(v) for v in dist[2:]))
```
Linux mint20で発生したapt update時のGPGエラーを解決した

## 現象と環境

- OS:Linux Mint 20 Cinnamon
- ミラーサーバー(メイン):Evowise CDN
- ミラーサーバー(ベース):Tsukuba WIDE Public Mirror service


`sudo apt update` すると以下の警告が発生した

```
W: GPG エラー: http://mirrors.evowise.com/linuxmint/packages ulyana Release: 以下の署名が無効です: BADSIG A6616109451BBBF2 Linux Mint Repository Signing Key <root@linuxmint.com>
E: リポジトリ http://mirrors.evowise.com/linuxmint/packages ulyana Release は署名されていません。
N: このようなリポジトリから更新を安全に行うことができないので、デフォルトでは更新が無効になっています。
N: リポジトリの作成とユーザ設定の詳細は、apt-secure(8) man ページを参照してください。
```

## 試した方法


[GPGについて学んだことを整理してみる - Qiita](https://qiita.com/y518gaku/items/435838097c700bbe6d1b#gpg-error%E3%81%AE%E5%86%85%E5%AE%B9%E3%81%A8%E5%AF%BE%E5%87%A6)
などを参考に

```shell
sudo apt-key adv --recv-keys --keyserver https://keyring.debian.org A6616109451BBBF2 
sudo apt update
```
や

```shell
sudo apt clean
cd /var/lib/apt
mv lists lists.old
mkdir -p lists/partial
sudo apt clean
sudo apt update
```

を試してみたが変化なし。

## 解決した方法
あまりスマートではないが、大元の**ミラーサーバーを変更**したところ成功した。


1. メニューの「設定」→「システム設定」を起動する
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188949/3d099ec6-7be1-6403-f459-4244ec75e3c8.png)


1. 「システム管理」タブの「ソフトウェアソース」を選択する。
![pic1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188949/1d59c5a7-0b27-3ef9-7272-e060ee0726a9.png)

1. ミラーサーバーの設定を変更する(画像赤枠部分をクリック)。
![pic3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188949/9c297aa9-02a8-a135-b530-a566d3a84899.png)


1. 別のミラーサーバー(私は適当にJAISTにした)を選択して、「適用」をクリック。
![pic4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188949/c30ee3d2-15f9-39d1-da4a-19a7fa04f1a3.png)


1. OKをクリックして更新。
![pic5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188949/143e95a3-d42c-dced-f0a9-9ac9b9794e97.png)



## まとめ
`apt update`時のGPGエラー(BADSIG)が発生していたが、ミラーサーバーを変更したら解決した。
GIFの作成

#コード
durationの単位はmsで、このコード内だと1秒の間隔でアニメションが実行されます。loopはアニメーションが何回再生させるかを指定します。loopに「0」を指定すると無限再生となります。

```gifcreate.py
from PIL import Image

#open first image
img1 = Image.open("kick1.png")
#open second image
img2 = Image.open("kick2.png")
#open third image
img3 = Image.open("kick3.png")

#generate gif
img1.save("kick.gif",format="GIF",append_images=[img2,img3],save_all=True,duration=1000,loop=0)
```

#使用した画像
kick1.png
![kick1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/797320/b88c65d0-7cb8-7ba7-6c49-dd91305012a2.png)
kick2.png
![kick2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/797320/6fdedbf2-9893-b817-bf7e-fd23bf8e7dfe.png)
kick3.png
![kick3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/797320/e29f343d-e258-9bac-8af0-92dbb1b4a1ea.png)

#実行結果
上記のコードを実行するとこのようなGIFを作れます。
![kick.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/797320/50746dff-ebca-1da7-ae78-f78bbeac8188.gif)

durationを100msにしたら下記のようにアニメーションが早くなります。
![kick.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/797320/4d507710-e2d1-9a09-77d1-6748517bfaef.gif)
[VRChat][udon] 同期のお話（難しい）

# 同期は難しいけど分かったことをメモしておきます
これで合っているか分かりませんが、参考程度ですが備忘録として残しておきます。

## 同期のさせかた
- 変数を同期させたい場合は synced にチェックを入れれば同期できます
- 同期とは、どこかのプレイヤーのデバイス上で、該当の変数が変化した場合、他の全プレイヤーの同変数をその値に変化させる処理ということのようです
- しかし変数をGameObjectにした場合、うまく同期処理がされないように見えるので、よりnativeな型を対象とすると良さそうです
  - つまり「GameObject」は同期しない　ように見えています
  - 「int, string」などの基本型＋αは同期する　ように見えています

## 同期はMasterから同期させた方が強力？
- シンプルに同一graph（もしくはclass）内での同期では、Masterでもnot masterでも同期がうまく取れる
- しかし、複数のgraphやclassを跨いだ場合、どうもMaster側の挙動が優先されてしまっているように見えなくもない
  - graphAとgraphBがあったときに、graphAがgraphBの値Aの値を参照にして内部の値Xを変化させる処理を書いた場合、graphAに設定したgraphBの値およびgraphBの値Aをsyncedにしてしまうと、graphA/Bともに同期が崩れ、それぞれ無干渉の平行世界ができあがってしまった
  - そこで、graphBの値Aをのみをsyncedにすると、同期機構は働くようになった。しかしこの状態だと、Master以外がgraphBの値を変更できない状態に陥る（※これはMasterを切り替えることで、切り替えた後のMasterが操作可能になることで確認）
  - そうなると「どうやらMasterは同期において特別な意味合いが存在する」と推測されますが、どのような意味があるのかよく分かりません

いろいろ謎は多いですよね、同期関連。Unityだけに閉じてテストできると楽なのですが何か方法があるのでしょうか…？
Sphinxでコードブロック内をreplace

Sphinxでコードブロック内を置換させたいと考えて調べていたところ、issueとして回避策が上がっていたので備忘録

以下を見てconf.pyに追加すればOK
https://github.com/sphinx-doc/sphinx/issues/4054
置換対象は{}で囲む。

## なぜ探したか

* sphinxのreplaceを使うと用語定義ができ、可変な用語や本文中のバージョン表記を置換できる
* replaceをそのまま使ってもコードブロック内は置換できない:sob:
    * コードブロック内を置換する場合は[parsed-literal](https://docutils.sphinx-users.jp/docutils/docs/ref/rst/directives.html#parsed-literal-block)を使わなければできないという記事が見つかる[参考](https://python5.com/q/curnstkq)
    * 試してみると置換はできるが、レンダリングがうまくいかない
【Rails Google Map】ストリートビュー(Street View)を静的に表示させるには

# 【Rails Google Map】ストリートビュー(Street View)を静的に表示させるには
## この記事でできるようになること
以下の画像のように、自分のアプリ内に場所やお店のストリートビューを静的に表示できるようになります
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411851/b4e6017b-3eb5-84b6-c177-9f86121a99da.png)
## ステップ
**・GCPでStreet View static APIを追加**
**・認証用コードをマップの表示をしているViewに記述**
**・画像表示のコードを記述**

### GCPでStreet View static APIを追加
[GCPのコンソール](https://console.cloud.google.com/)に移動して頂いて、
APIとサービス>認証情報からご自分のAPI Keyをご選択ください！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411851/9eb03099-a672-dae9-b6a6-07ee80ce2e0b.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411851/81c32717-4d9e-7a19-b0b9-ffaaa29777da.png)


### 認証用コードをマップの表示をしているViewに記述
Google Mapのストリートビューは以下のリンクにて取得できます

```
https://maps.googleapis.com/maps/api/streetview?size=640x480(←任意のサイズでOK)&heading=180&fov=120&location=緯度の値,経度の値&sensor=true&key=ご自身のAPIKey
```

>
headingのパラメーターは、方向を決定します。0～360が指定可能。0は北、90は東、180は南、270は西を指します。
fovのパラメーターは、水平方向の視野を決定します。0～120が指定可能。120を指定すると広い範囲の画像が取得できます。
pitchのパラメーターは、カメラ角度（上向き下向き）を決定します。90～-90が指定可能。90は上向き、-90は下向きです。
引用元：https://maps.multisoup.co.jp/blog/1773/

### 画像表示のコードを記述
Railsで導入する例としては、
addressカラムに住所の投稿を格納しているとき、

```erb:index.html.erb
      <% @places.each do |place| %>
        <% results=Geocoder.search(place.address) %>
        <% if results.present? %>
          <% @latlng=results.first.coordinates %>
            <%= image_tag "https://maps.googleapis.com/maps/api/streetview?size=640x480&heading=180&fov=120&location=#{@latlng[0]},#{@latlng[1]}&sensor=true&key=ご自身のAPI Key" %>'
```

のようなコードで実現できますね
GeocoderのGemの導入はしておいてくださいね🙇‍♂️

うまくいかないとか、わからないなどあればいつでも
[Twitter](https://twitter.com/facultyoflaw11)
などで、ご連絡いただければ幸いです🙇‍♂️
VHDL で書く文字列比較(strcmp)

# はじめに

先日、ちょこっと twitter で呟きがあったので、急遽 VHDL で書いてみました。
あんまり考えずにでっち上げたので間違っているかもしれません。

# ソースコード

```VHDL:strcmp.vhd
library ieee;
use     ieee.std_logic_1164.all;
use     std.textio.all;
entity  test is
end     test;
architecture model of test is
    function strcmp(s1,s2:string) return integer is
        alias    str_1 : string(1 to s1'length) is s1;
        alias    str_2 : string(1 to s2'length) is s2;
        variable i     : integer;
        variable ch_1  : integer;
        variable ch_2  : integer;
    begin
        i := 1;
        loop
            if (i <= str_1'high and i <= str_2'high) then
                if (str_1(i) = str_2(i)) then
                    i := i + 1;
                    next;
                end if;
            end if;
            if (i <= str_1'high) then
                ch_1 := character'pos(str_1(i))+1;
            else
                ch_1 := 0;
            end if;
            if (i <= str_2'high) then
                ch_2 := character'pos(str_2(i))+1;
            else
                ch_2 := 0;
            end if;
            exit;
        end loop;
        return (ch_1 - ch_2);
    end function;
begin
    process
    begin
        assert (strcmp(string'("ABC"), string'("ABC")) = 0) report "Test 1 NG";
        assert (strcmp(string'("ABC"), string'("AB" )) > 0) report "Test 2 NG";
        assert (strcmp(string'("AB" ), string'("ABC")) < 0) report "Test 3 NG";
        assert (strcmp(string'("AB" ), string'("ABB")) < 0) report "Test 4 NG";
        assert (strcmp(string'("ABC"), string'("ABA")) > 0) report "Test 5 NG";
        assert (strcmp(string'("ABA"), string'("ABC")) < 0) report "Test 6 NG";
        wait;
    end process;
end model;
```

# 参考

こちらの記事を参考にしました。Cで書かれた strcmp です。

http://libc.blog47.fc2.com/blog-entry-33.html
ローカル開発環境作成におけるエラー解決の方法〜プログラミング初心者〜

#プログラミング初心者の最初の壁

ローカル開発環境の作成はプログラミング学習初心者の最初の壁と言えるでしょう。
よくわからないターミナルを使って、よくわからないコマンドを使って、よくわからないエラーが起きる。
わからないことがわからないみたいな状況って非常にストレスですよね。

しかし、サッカーの本田圭佑選手はこんなことを言っていました。

「挫折は過程、最後に成功すれば挫折は過程に変わる。
だから成功するまで諦めないだけ。」

と。エラーが起きたらそれは成長のチャンスであり、成長するためには必要な壁なんですよね。

ということで、この記事では自分なりのエラー解決の方法を書いていきます。

##エラー解決の方法

①エラー文を読む

まずはエラーの文を読みましょう。

最初は英語で長文がだらだらと書かれていて、読むのが億劫になってしまいがちですが、わからない単語があったらGoogle先生を頼ってとにかくエラーの内容を理解しましょう。

②エラー文をコピペして解決法を検索

初心者が引っ掛かるようなエラーはほぼ全てネットに書いてあります。

エラーの内容が同じ記事を選んでその記事の内容を理解したら、解決法を実践してみましょう。

##もっとも大事なこと

エラーを解決する際にもっとも大切なことは、「理解して解決する」ということだと思います。

「なぜエラーが起こったのか」
「何がわからないのか」

わからないことをひとつずつ少しずつでも理解していくことが、エラー解決への最短経路であり、成長につながると思います。

ですので、
わからない英単語や初めて使うコマンドは面倒ですが、ググってちゃんと理解することが一番大切だと思います。
Vueソーシャルシェアリングのバージョン指定

#vue-social-sharingのバージョン指定
```java:ターミナル
npm i vue-social-sharing@2.4.6
```
##@2.4.6の部分を好きなバージョンに指定するだけ！
##ver.3だとSNSアイコンが表示されない事が多いのでこちらのバージョンを指定するといけました！
#以上！
【Ruby】様々な条件分岐について①（ifの使い方）

#条件分岐について
条件分岐とは、自分が設定した条件について、値が当てはまっているか（真）そうでないか（偽）を判断し、その結果に応じた出力を呼び出すことができる方法のことです。
使用することが多いので、Rubyの勉強を始めたばかりの方はぜひ読んでみてくださいね！

【内容】
・基本となるifの使い方
・ifを一行でまとめる方法
・条件が複数ある時のifの使い方

【読んで欲しい人】
・条件分岐（if）をマスターしたい方
・Ruby初学者の方

##ifの使い方
ifを用いた条件式について解説します。ある特定の条件があり、その条件に当てはまる場合と当てはまらない場合で出力を変更したいときに使用します。

###基本となるifの使い方
```ruby:条件式が1つの場合
if 条件式
  条件式に該当する（真）ときの出力
else（条件式以外の場合）
  条件式に該当しない（偽）であるときの出力
end
```

実際に例文でも見てみましょう。

```ruby:例文1
age = 21
if age >= 20
  puts "私は成人です。"
else
  puts "私は未成年です。"
end
```
```ruby:例文1：出力結果
私は成人です。
```

このように、`age = 21`と定義されているので、ifの条件式に対しては（真）となり、「私は成人です」という値が返ってきます。もし`age = 18`など、ageの値が20未満であれば、条件式に対して（偽）となるので、「私は未成年です」という値が返ってくることになります。

###ifを一行でまとめる方法
実はこのif文をもう少しスマートに記載することができます。

```ruby:例文2
age = 12
puts age >= 20 ?  "私は成人です。" : "私は未成年です。"
```
```ruby:例文2：出力結果
私は未成年です。
```
このように、三項演算子という手法を使えば、一行でコードを記載することもできます。
`条件式?　（真）の値 : （偽）の値`
と記載することで、スマートに一行でまとめることができます。条件式の後に「？」を入れるのを忘れないようにしてくださいね。慣れてきたらこのように式を簡単にしてコードを書いてみましょう！

###条件が複数ある時のifの使い方
では、複数の条件式を使用したい場合はどのようにコードを書けば良いのでしょうか？
基本は下記のような書き方になります。

```ruby:条件式が複数ある場合
if 条件式①
  条件式①に該当する（真）ときの出力
elsif 条件式②
  条件式②に該当する（真）ときの出力
elsif 条件式③
  条件式③に該当する（真）ときの出力
else
  どの条件式にも該当しない（偽）ときの出力
end
```
実際に例文でも見てみましょう。

```ruby:例文3
hobby = "basketball"
if hobby == "baseball"
  puts "私は野球が趣味です。"
elsif hobby == "soccer"
  puts "私はサッカーが趣味です。"
elsif hobby == "basketball"
  puts "私はバスケットボールが趣味です。"
else
  puts "私は無趣味です。"
end
```
```ruby:例文3：出力結果
私はバスケットボールが趣味です。
```
このように、例文2では、`hobby = "basketball"`と定義されているので、3つ目の条件式`hobby == "basketball"`に当てはまることがわかります。複数の条件式が必要な場合は、上記のように`elsif`で条件式を追加しましょう！くれぐれも`elseif`と書かないように注意してくださいね。

今回はifの使い方について解説しました。本当は他の条件分岐についても書こうと思ったのですが、あまりにも内容が長くなってしまい、必要な情報を見落としてしまう可能性があるので、別の記事で解説しようと思います！
条件分岐は使用頻度が多いので、ぜひマスターしましょう！
TensorFlow 2.4.0-rc4のビルド手順（Windows10, CUDA11.1.1, cuDNN 8.0.5, Python 3.8.6）

2020/12/06時点でのTensorFlow 2.4.0-rc4のビルド方法の概要を残しておきます。

今回の組み合わせでは、PythonとNumpyのバージョンに気をつければ正常にビルドできました。
Pythonは3.9.0を利用すると依存パッケージの組み合わせ起因（だと思われる）のため、作成したwheelパッケージのインストールで失敗します。
Numpyは最新の1.19.4だと、Windows環境でimportするだけでエラーになるので、1つ前の`1.19.3`を使用します。（これはWindows側の問題で、2021年1月くらいに修正される予定らしいです）

## 環境情報

ビルドに利用した環境です。CUDAやcuDNNのフォルダなど、事前にパスを通した状態になっています。

* Windows 10 Pro 20H2 (64bit)
* Visual Studio Community 2019 Ver 16.8.2
* Python 3.8.6（3.9.0を使うとwheelパッケージインストール時にエラーになります）
* MSYS2（`pacman -S git patch unzip` で必要なパッケージを導入済み）
* Bazel 3.7.1 （3.1.0以上のバージョンを使う必要あり）
* CUDA 11.1.1
* cuDNN 8.0.5.39

## ビルド用のフォルダ構成など

今回は`S:\build\build_tf240rc4` フォルダ配下にTensorFlowのソースコードをダウンロードしてビルドしています。Pythonの仮想環境も、TensorFlowビルド用に用意します。

```powershell
S:/build/build_tf240rc4  # 作業フォルダRoot
 + tensorflow  # gitで取得してくるソースコード
 + venv        # Python仮想環境
 + wheelhouse  # 作成したwhlファイルを格納するフォルダ
```

## ビルド手順

`x64 Native Tools Command Prompt for VS 2019` を起動して以下の手順でビルドを行います。

```powershell
# 仮想環境を作成して有効化する
python -m venv s:\build\build_tf240rc4\venv
cd /d s:\build\build_tf240rc4
.\venv\Scripts\activate.bat

# 必要なパッケージのインストール
# 注意：Numpyは最新の1.19.4を使うとエラーになるので1.19.3を使用（利用時もNumpy 1.19.3を使用すること）
python -m pip install --upgrade pip setuptools
pip install numpy==1.19.3
pip install six wheel
pip install keras_applications==1.0.8 --no-deps
pip install keras_preprocessing==1.1.2 --no-deps

# ソースコード取得（v2.4.0-rc4のタグ指定）
git clone -b v2.4.0-rc4 https://github.com/tensorflow/tensorflow.git
cd tensorflow

# 環境によってはコマンドのパラメーターが長くなりすぎてエラーになるので不要な環境変数を削除
set _OLD_VIRTUAL_PATH=

# ビルド構成の設定
# CUDA support: Y
# CUDA compute capabilities: 7.5 （利用環境に合わせて変更）
# Optimization: /arch:AVX2 （利用環境に合わせて変更）
# それ以外はデフォルト設定（Enter）
python ./configure.py

# ビルド
# TensorFlow 2.3.x+CUDA11の場合は「DTHRUST_IGNORE_CUB_VERSION_CHECK」のおまじない（CUB互換チェックのスキップ）が必要だったが2.4.xは不要
bazel build --config=opt --config=avx2_win --config=short_logs --config=cuda --define=no_tensorflow_py_deps=true --copt=-nvcc_options=disable-warnings //tensorflow/tools/pip_package:build_pip_package

# パッケージの作成（wheelhouseフォルダにパッケージを作成）
# 数分間画面が更新されないので心配になりますが、きちんと処理されているのでしばらく待ちましょう
bazel-bin\tensorflow\tools\pip_package\build_pip_package ..\wheelhouse
```

これで完了です。
なおビルドに使用したbazelの中間ファイル等は`%UserProfile%\_bazel_%UserName%`フォルダに作成され、容量も20GB近くになるので、不要であれば削除しても問題ありません。Bazelが起動していると削除できないので、その場合はコマンドプロンプトで`bazel shutdown`として、Bazelを終了してから削除してください。

作成したTensorFlowのwheelパッケージを利用する際は、`pip install numpy==1.19.3`という感じでTensorFlowよりも先にNumpyをバージョン指定で導入しておくことをおすすめします。最新のNumpy 1.19.4は現時点では利用できません。
状態遷移表・状態遷移図の手引き

# はじめに
こんにちは。北島です。
先日ある案件で複数の機能で扱われるデータが、処理対象であるかないか・処理が済んでいるかいないか、等の管理が必要で、フラグが乱立して複雑化していました。そこで以前から気になっていた状態遷移表と状態遷移図を使ってステータスを定義したところ、うまく整理することができました。
この記事ではそこで得られた知見を共有しようと思います。

# 状態遷移を資料化するメリット・デメリット

状態遷移表は以下のメリットがあります。
- 作りやすく保守しやすい
- 設計の抜け漏れが防げる
- 個々の処理でおこなうべきことを明確化できる

一方、デメリットとしては以下です。
- 他人が読み解くのに時間がかかる

そのデメリットを補うために状態遷移図があります。
状態遷移図のメリットはなんと言っても下記。
- 直感的に流れを理解しやすい

そして状態遷移図のデメリットは描画の手間に関するところだと思います。
- 作図や保守に手間がかかる
- 見やすく記載できる複雑度に限界がある

以上は個人の感想ですので一般的な評価とは異なるかも知れません。
続いて、具体例を2つ挙げて状態遷移表と状態遷移図がどんなものか紹介します。

# 例1: 会員ステータス
ウェブアプリケーションの9割は会員制システムだと思っています。Usersテーブルを設計したことがある方は多いのではないでしょうか。

ここで考える例として以下のようなシステムを考えます。
- メールアドレスを登録すると会員登録用URLを記載したメールが届く
- 上記URLから遷移して会員情報を登録する
- 管理者は任意のアカウントを停止・停止解除できる
- 会員は退会できる

　表1: 会員ステータスの状態遷移表
![スクリーンショット 2020-12-06 14.46.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/20500/338dae4a-d22e-91c0-b2e9-b3a82e01ec2c.png)
![よろずワーク２＿２.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/20500/9f4911c2-8f32-4bf3-8b0a-2ca4c0c3d89d.png)
　図1: 状態遷移表の見かた

状態遷移表の書き方は色々とスタイルがあります。この記事で紹介するものは各行をステータス（状態）として、各列をトリガー（状態が変化する処理）としています。例えば、ステータス3行目の「本登録」の一番右のセルでは、「ユーザが退会操作を行うとステータスが退会に遷移する」という事を示しています。

ちなみに「N」とある箇所は『禁止（Not allowed）。操作が行われてはいけない』、「I」は『無視（Ignored）。内容更新等はおこなわれるが状態は遷移しない』を表します。ここは私の解釈が誤っているかもしれないので例に記載した値は正確ではないかもしれません。

上記の状態遷移表を状態遷移図にすると以下のようになります。
![状態遷移図１＿2020-12-11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/20500/62f3b2b9-3cb7-be58-bb1a-cc661ab925b7.png)
　図2: 会員ステータスの状態遷移図

これは直感的にわかりやすいと思います。黒丸から始まり、角丸四角が状態を表し、矢印が状態遷移を表します。矢印に添えたラベルが状態遷移のトリガーを表します。

# 例2: タスク管理

ステータス定義はデータ設計のみならず、開発フロー設計においても重要です。例として開発の実装タスクにステータスを定義して進捗を把握できるようにしようと思います。

　表2: タスク管理の状態遷移表
![スクリーンショット 2020-12-06 15.23.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/20500/c02aa502-ebe8-f092-2b47-97501556647c.png)
これは、単純にわかりにくいと思います。
状態遷移表のデメリットとして認知負荷が高いことが挙げられます。そのため、他者への伝達のために状態遷移図をセットで作ることをおすすめします。

![状態遷移図２.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/20500/536c6870-bfd6-bc72-0570-4d3925142f8c.png)
　図3: タスク管理の状態遷移図

状態遷移図では、状態の入れ子を表現できます。図３でいうと「対応中」と「PRレビュー」がそれにあたります。この例では未起票も含めて9個のステータスを定義しましたが、状態遷移図にすると意図や構造をつかみやすいのではないでしょうか。


# まとめ

状態遷移表と状態遷移図はデータのライフサイクルを俯瞰的に表現するのに適しています。各ステータスから見た各機能をそれぞれ検証できるので、結果として設計の品質向上に結びつきます。
実際、この記事の例示を作りながら「こういうケースもあるな」とか「この処理はこのステータスにも影響するべき」という改善点が見つかりました。

# 今後やること
Plant UML で状態マシン図（状態遷移図に相当するもの）が書けるので試してみようと思います。
https://plantuml.com/ja/state-diagram

最後まで読んでいただきありがとうございます。

# 参考文献
[状態マシン図(State Machine Diagram) - UML入門 - IT専科](https://www.itsenka.com/contents/development/uml/state_machine.html)
[UMLステートマシンと状態遷移図 astah-info](https://www.changevision.co/tutorial-statemachine-japanese.html)
[状態遷移図 - Wikipedia](https://ja.wikipedia.org/wiki/%E7%8A%B6%E6%85%8B%E9%81%B7%E7%A7%BB%E5%9B%B3?wprov=sfti1)
[朝の3分モデリング講座 - 例で理解するUML状態マシン図 - YouTube](https://youtu.be/PVshhYixdbA)
[UML状態マシン図は、なぜ重要か？ - 島 敏博さん x 平鍋対談 - YouTube](https://youtu.be/56_Jvnx5gIo)
[状態遷移表設計手法の概要 (1/3) - MONOist（モノイスト）](https://monoist.atmarkit.co.jp/mn/spv/1204/06/news001.html)
【UE4】コードプラグインを使用中にいち早くエディタ最新版に移行したい

#主旨
先日（執筆時点）、UE4.26がリリースされ、色々と魅力的な新機能や最適化が搭載されています。

既存のプロジェクトでその恩恵を受けたいとき、大きな壁の一つとなっているのが「**コードプラグイン**」を使用しているプロジェクトの時です。

コードプラグインとは、C++コードを含むプラグインのことで、そのまま（特にマーケットプレイスから入手したプラグインがある場合）では対応したバージョンが作者から提供されるまで待たなくてはなりません。

マーケットプレイスのガイドラインには、「１週間以内に最新版への対応を行うべし」とあるので、大抵のプラグインは１週間程度待てば使えるようになるでしょう。しかし、作者の都合で対応が長引くかもしれません。

この記事では、「**そんなの待ってられない！**」という人向けの最新版対応方法です。

※Windows環境での記事内容です。

#注意
**この行為は自己責任で行ってください。**
対応されていないバージョンのプラグインを無理やり最新版で使用しようとしているため、動作に問題ないこともあれば、ビルドエラーやクラッシュでどうしようもないこともあります。

#対応方法
手順は４つです。

1. **現在のプロジェクトをバックアップする**
1. 利用中バージョンのコードプラグインを自分のプロジェクトにコピー
1. コピーしたプラグインの対応バージョンを書き換える
1. プロジェクトを**再生成・リビルド**する

##1. 現在のプロジェクトをバックアップする
**これは非常に重要です！**
以降の手順で動かなくなってしまった場合、元の状態に戻すことができなくなる可能性があるからです。
バージョン管理ツールを使って管理している場合はここが一番役に立つところです。

##2. 利用中バージョンのコードプラグインを自分のプロジェクトにコピー
マーケットプレイスから入手しているコードプラグインで必要な手順です。
このプラグインの場所は、
`[インストールディレクトリ]/UE_[バージョン]/Engine/Plugins/Marketplace`
にあります。
コピー先のディレクトリは、
`[プロジェクトディレクトリ]/Plugins`
になります。（ない場合は手動で作ります）

##3. コピーしたプラグインの対応バージョンを書き換える
コードプラグインには、ガイドラインとして .upluginファイル内に対応バージョンを記載することが求められています。

UE4.25であれば、
`"EngineVersion": "4.25.0"`
と記載されている行がありますので、4.26にしたい場合はここを、
`"EngineVersion": "4.26.0"`
に書き換えます。（右端の 0 は原則固定です）

これを行わないと、エディタ起動時に異なるバージョンのプラグインがあると警告されます。

##4. プロジェクトを再生成・リビルドする
.uprojectファイルを右クリックし、 `"Switch Unreal Engine version..."` を選択。
現れたダイアログで、切り替えるバージョンを選択して "OK" すると、.uprojectファイル（と使用しているIDE用プロジェクトファイル）がそのバージョン用に再生成されます。

その後、プロジェクトをリビルドします。**ビルドではありません。**（クリーン→ビルドでもいいです）
※ビルド設定はエディタ起動の場合は（Visual Studio なら）「Development Editor」がエディタ用になります。

あとはエラーが出ないよう祈りつつ待ちます。
利用しているコードプラグインの規模に応じて時間がかかります。たくさんあるとコーヒーブレイクできるかもしれません。

###ビルド時警告がでた場合
大半が「機能の移行などにより非推奨になった処理を使ってますよ」という旨の警告です。プラグイン作者が対応するはずなので基本気にしなくても大丈夫です。

###ビルドエラーがでた場合
自分の力で直せそうな箇所であれば、対応することで突破できるかもしれません。
そうでない場合、**泣く泣く諦めてください。** 

###ビルドが成功したら
エディタを起動してみましょう。シェーダーコンパイルを待ち、一通り動かしてクラッシュしないことを確かめましょう。

以上を行って問題なければ移行できたと見て喜んでいいと思います。
もちろん、**自己責任で行っていますので、問題が発生してもなんとかしてください。**なんとかできないかもしれませんが…

#その後、プラグイン作者が対応してくれたら
対応するバージョンのプラグインがマーケットプレイス上で利用可能になったら、次の手順が必要です。

1. コードプラグインをエンジンにインストールする
1. プロジェクトにあるプラグインを取り除く
1. プロジェクトを**再生成・リビルド**する

##1. コードプラグインをエンジンにインストールする
いつもの方法でランチャーでインストールしましょう。

対応されたプラグインの数だけ行います。

##2. プロジェクトにあるプラグインを取り除く
このままではプロジェクト側のプラグインが優先されたり、エラーが発生することがあるので取り除きます。
プロジェクトにある、対応されたプラグイン名のディレクトリを取り除くだけです。

対応されたプラグインの数だけ行います。

##3. プロジェクトを再生成・リビルドする
.uprojectファイルを右クリックし、 `"Generate Visual Studio project files"` を選択し、IDE用プロジェクトファイルを再生成します。これで、プロジェクトにあった古いプラグインの情報はなくなります。

その後、プロジェクトをリビルドします。**ビルドではありません。**（クリーン→ビルドでもいいです）

あとはエラーが出ないよう祈りつつ待ちます。
（プロジェクト側のコードプラグインの数が減るので時間がはやくなります）

###対応してくれたプラグインに関連したエラーが出たら
エラー内容をよく見ましょう。もしかしたらコード上で連携してたところがプラグインの更新で変更されているかもしれません。

またはプラグイン作者がミスをしているかもしてませんので、報告する場合はよく確認してから報告しましょう。

#最後に
繰り返しますが以上の行為は**自己責任で行ってください。**

こういった最新対応をする方法の記事があまりないために書いた次第ですので…
【Rails】マイグレーション時にコメントを追加する

## マイグレーション時にコメントを追加する方法
Rails 5からこの機能が標準で装備されたそうです。
それ以前ではgemを利用していたそうです。
追加したコメントはデータベース側に保存されます。
### コメントの付け方
マイグレーションファイルを生成されたら、
以下のような書式でコメントをマイグレーションファイルに追加します。

```ruby
class CreateProducts < ActiveRecord::Migration[6.0]
  def change
    create_table :products do |t|
      t.string :name,                      comment: '雑誌名'
      t.integer :z_code, null: false,      comment: '雑誌コード'
      t.integer :num,    null: false,      comment: '取置冊数'
      t.string :release, null: false,      comment: '発売日'
      t.references :customer, null: false, foreign_key: true
      t.timestamps
    end
  end
end

```

その後、rails db:migrateで完了です！
Sequel Proの「構造」から確認できます。
### コメントをつける意味
カラムにコメントをつける機能は「定義」を記録するって事が一番だと思います。
実際、6個程度のモデルしか作っていないのですが、
「name」カラム5つ「date」カラム３つも使っているのですよね・・・。
これからさらに追加で機能をつけていくとしたら、自身の備忘録としても意味がある機能だと思います。
ちなみに、コメントはあくまでメモとして残すものなので、
テーブルの動作的には何も影響はないそうです！
## 参考にさせていただいたサイト様
https://techracho.bpsinc.jp/hachi8833/2017_02_23/36083
ありがとうございます！！
AccessのVBAでフォルダを隠しフォルダに変更

#なんで隠しフォルダに？
以下のような(ﾉ∀`)ｱﾁｬｰを防ぐ為です。

1. Accessのプログラムが使う『一時処理用フォルダー』がユーザーでも見える状態
2. ユーザーがそのフォルダーに重要なファイルを置いちゃう
3. フォルダーの中身全部消すプログラムが走ってデータ消失

『隠し』にしないでユーザーがアクセスできない場所にフォルダー作ればいいじゃんアゼルバイジャンなんだけどね(´・ω・\`)
そういう訳にもいかない場合があるんす…。

少しでも事故を減らす為の工夫として『隠し』化します(´・ω・\`)


#参照設定
この記事のサンプルでは **FileSystemObject** クラスを使うので、 **Microsoft Scripting Runtime** を参照しておく必要があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/1eb4870c-d59e-1973-e1b0-555f95fc19eb.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/5e291a37-1e81-6004-0558-a66d77a67b33.png)


#サンプルこーど
フォルダーパスをもらってフォルダーが存在していれば隠しフォルダ設定にするだけの単純なやつ！

```vb:
Public Function hide_folder(ByVal folder_path As String)
       
    Dim fso_ As New FileSystemObject
    
    If Not fso_.FolderExists(folder_path) Then
        Exit Function
    End If
    
    fso_.GetFolder(folder_path).Attributes = Hidden

End Function
```


#蛇足
この程度の行数なら関数化せず、スニペットに登録しておく方向もアリです。
でも関数化しておけば『隠しにしたいフォルダが存在しなかった時はログを吐く』なんて仕様変更があった時、1箇所変えるだけで済むので、改修が楽＆変更漏れの心配無いです。



#バージョン
Windows10 Pro バージョン1909 OSビルド19042.662
Access for Microsoft 365 MSO（16.0.13328.20334）32ビット
C#とかphpとか、せいぜいRuby on Railsの人がReact始めて見た

##一言でReactって？

### その前に昔話

いわゆるレガシーと言われている言語に生きてきたものにとって、ReactとかVueとかって、なんか近寄りがたいんですよね。
というか、JavaScript的なあたりでなんか壁を感じるのです。

VBAとかDelphiとかVisual Basicとかの時代って、画面描画とロジックが完全に分かれて見えるようになっていたのがプログラミングの革命的な所、私とかはそのあたりからプログラムを開始したので、Webプログラムとかの初期にhtmlタグの文字列を生成して返すなんていうことが、えらく不便な世界に感じたものです。

htmlなんて、version3とかの時代にはプレーンテキストの見栄えを良くするだけの印象だったのに。。

今で言うところのmarkdownののりでしたね。

なんか文章を作成するのに毎回一太郎とか開くのは重いし、とは言って「メモ帳」とか「秀丸エディタ」だと文章作成時はよいんだけど後から読むのがつらい。

そんな私によって中間の選択肢をあたえてくれたのが html。はいばーてきすとまーくあっぷらんげーじ でした。

秀丸エディタで作ったメモが ブラウザ（当時は Internet ExplorerかNetscapeか）で見るとキレイに読める！し、リンクも貼れる。
しかもiframeとか使うと、他のメモをそのまま引用できる！

とか思っていたものです。

で、そんな静的コンテンツをBrowserで見る時代からBrowerの中身がインタラクティブになってきて、表示を補完する言語が JavaScriptだったハズなんですよね。。

それが、気付けば node.jsとかいってサーバーサイドで動いているとかって。。

当初は「ロジック」を司るC言語で、スクリーン上にドットを表示する制御をする仕組みがどんどん高度になって、そのうち画面表示とロジックを分離して考えられるようになり、気がつくと画面表示のウェイトが大きくなって、画面表示の観点からロジックを実装しましょう。という、綱引き的な何かを感じるのです。。


## で、Reactを理解してみた。。？

* その前にJSXという言語の理解が必要
* JSXを細分化し、部品（コンポーネント）わけて、部品毎にロジックを記載する。という仕組み
* 部品（「子」）を配置する「親」と言う関係で、「親」から「子」に対して、"props"というデータを受け渡して、子を働かせる。（部品の見え方を制御する）→「子」は受け取った”Props"に基づき画面の一部を描画する
* "props"という"状態"で画面の描画を制御する


### 引っかかった所

* constの後の{} (destructuringというらしい） : https://github.com/lukehoban/es6features#destructuring
    * ECMAScript6の書式 => https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment
    * hashのkeyを指定して定数とか変数として再定義をすること
    * 下のケースの場合 action として定義されている hash から、createPage keyに対応するvalue を createPageという変数に読み込む 

```
({ actions }) => {
  const { createPage } = actions
}
```

* "Ref"とは：https://ja.reactjs.org/docs/refs-and-the-dom.html
    * 「子」要素の制御をクラス内で行う
        * render()でreturn される、Html要素に対して、クラスでnodeを取り出して直接操作ができる
        * render()の returnに含まれる カスタムクラスコンポーネントについて、そのインスタンスを親の方で参照出来る
        * ただし、関数コンポーネントはインスタンスを持たないので、ref属性は渡せない
    * "props"を使わず（データ受渡をせず）に、親から子になんらかの命令を出して子要素の表示を制御する仕組み
    * (React 16.3より) ```React.createRef()``` により"Ref"をというオブジェクトを「親」側で作成し「子」に ```ref```属性をつかって受け渡す

```
 constructor(props) {
  super(props)
  this.myRef = React.createRef()
 }
 render() {
   return <div ref={this.myRef}
 }
```

* export : 
    * 静的なhtmlの世界だと、htmlに複数の javascriptファイル (scriptタグで呼び出す）について、呼び出されたjavascript間で他のjavascriptファイルで宣言された変数とか自由自在に使える（グローバル変数として）。すなわち、一つのファイルに結合されたかのように振る舞う。phpのrequireとか Cのincludeとかと同じ
    * とはいえ、それぞれのjavascriptファイルがサーバーサイドで動くことを考えると、変数のスコープは基本的にファイルで閉じるという考え方になった。そこで、他のファイルで特定の変数（オブジェクト）の利用を可能にするために export 宣言により明示的にオブジェクトを指定しなければならない (昔のdllみたいに、インターフェイスに当たるエントリーポイントとかを定義するイメージ）
*  import, require：
    *  export 宣言されているオブジェクトを取り込む。
tkinterを利用して画像の入れ替え

#コード
pythonのGUI用のパッケージであるtkinterを使って、画像を入れ替えるコードを書いてみました。
そのコードは下記となります。

```flip.py
import tkinter as tk
import cv2
from PIL import Image, ImageTk

#create window
window = tk.Tk()

#read image 1
img1 = cv2.imread("cat1.jpg")
#set image size
img1 = cv2.resize(img1,(306,148))
#change color of image from bgr to rgb
img1 = cv2.cvtColor(img1,cv2.COLOR_BGR2RGB)
#convert cv2 image to pil
img_pil1 = Image.fromarray(img1)
#convert pil to photoimage
img_tk1 = ImageTk.PhotoImage(img_pil1)

#read image 2
img2 = cv2.imread("cat2.jpg")
#set image size
img2 = cv2.resize(img2,(306,148))
#change color of image from bgr to rgb
img2 = cv2.cvtColor(img2,cv2.COLOR_BGR2RGB)
#convert cv2 image to pil
img_pil2 = Image.fromarray(img2)
#convert pil to photoimage
img_tk2 = ImageTk.PhotoImage(img_pil2)

#create canvas widget
canvas = tk.Canvas(window,width=img1.shape[1],height=img1.shape[0])
#set canvas widget
canvas.pack()
#load image to canvas. first and second parameter is the position to set image. anchor parameter is for selecting part of image to be set to position. eg: nw is top right of image.
image_id = canvas.create_image(0,0,anchor="nw",image=img_tk1)

#variable for switching between two images
flip = True

#define function for switching image
def switch():
  #use global variable
  global flip
  #if true, switch to image 2
  if flip:
    canvas.itemconfigure(image_id,image=img_tk2)
    flip = False
  #if false, switch to image 1
  else:
    canvas.itemconfigure(image_id,image=img_tk1)
    flip = True

#create button widget
button = tk.Button(window,text="Change Image",command=switch)
#set button widget
button.pack()

#call event loop
window.mainloop()


```

#使用した画像
cat1.jpg
![cat1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/797320/dd4aa37c-c23b-ff61-c2f9-6bb6a83060c3.jpeg)
cat2.jpg
![cat2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/797320/4103352e-c5b4-a1e7-41f7-32298dc27e4b.jpeg)

#コードの実行結果
「Change Image」ボタンをクリックする前の状態
![beforeflip.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/797320/38a85bff-0858-2ec2-5914-e941e9cabc5c.png)
「Change Image」ボタンをクリックしたあとの状態
![afterflip.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/797320/b8839d1f-fbb3-5911-f926-499eb60d6225.png)
javascri 問題集No.15 ０埋め～年月日を20000707の形にする。～

 
const number =(' ')
                ↑この中に入れてstringに変えていきます。

const number =(`${year}${month}${day}`)

この年月日を変えていきます。

const number =(`${`0000`+year.slice(4)}${month}${day}`)
 
このような形ですね。

.slice(-length)-をする意味は　00+2　の時　002となり、必要な部分を抜き取るためです。
002.slice(-2)は　02 になります。
BFS(breadth-first search) by Python 備忘録（自分用）

自分用なので、かなり雑です。
また、以下のコードは[こちら](https://note.com/melon_ms_mtcc/n/nd2c0c7c16edb)から、引用させていただいたものです。
頂点n個、辺の数m本を標準入力で受け取り、その後、m（辺の数）回2つの頂点を受け取り、それを二つの辺における辺とする。そして、頂点1からの最短距離を出力する。
例えば、例えば頂点4個で辺4本、つながっている頂点が(1, 2)、(2, 3)、(3, 4)、(4, 2)なら

>入力
4 4
1 2
2 3
3 4
4 2

>出力
0
1
2
2


と言う感じ。

```BFS.py
 from collections import deque        #1

n, m = map(int, input().split())     #2

graph = [[] for _ in range(n+1)]     #3

for i in range(m):                   #4
 a, b = map(int, input().split())
 graph[a].append(b)
 graph[b].append(a)

dist = [-1] * (n+1)                  #5
dist[0] = 0
dist[1] = 0

d = deque()                          #6
d.append(1)

while d:                             #7
 v = d.popleft()
 for i in graph[v]:
   if dist[i] != -1:
     continue
   dist[i] = dist[v] + 1
   d.append(i)

ans = dist[1:]                       #8
print(*ans, sep="\n")
```

学んだことと分からなかったことだけを抜粋してメモ。
dequeとは、スタックとキューを合わせた感じのやつでメモリ効率が良く、O(1)で実行されるらしい。

＃３と＃４は

```BFS.py
graph = [[] for _ in range(n+1)]     #3

for i in range(m):                   #4
 a, b = map(int, input().split())
 graph[a].append(b)
 graph[b].append(a)
```

隣接リストとか言うやつで、隣接行列と一緒にグラフをプログラミングで表す時に使うらしい。因みに、上記の例でgraphを出力してみるとこんな感じ。
>
[[], [2], [1, 3, 4], [2, 4], [3, 2]]

これで、インデックス番号と中の要素をそれぞれ対応させて、無向グラフ（または、双方向グラフ）が表現されてる。
例えば、インデックス[2] の要素、1, 3, 4は頂点2と繋がってることを表す。

```BFS.py
dist = [-1] * (n+1)                  #5
dist[0] = 0
dist[1] = 0
```

distは shortest distance の略で、初期値を -1 として、すでに頂点1からの距離が計算されたかの判別の為に用いているらしい。こう言うところ、しっかり見習いたい。
今回は頂点１からの距離なので、dist[0]はさよなら。またdist[1]も『頂点１』
からなので距離０として固定されている。

＃７の挙動は例えば上の例でいくと、

```BFS.py
while d:                             #7
 v = d.popleft()
 for i in graph[v]:
   if dist[i] != -1:
     continue
   dist[i] = dist[v] + 1
   d.append(i)

```

最初、d には＃６より、

```BFS.py
d = deque()                          #6
d.append(1)
```

１が入っているので、
>v = 1

また、graph[[1]には、２のみが入っており、dist[2]は初期値 -1 のままであるので、

>dist[2] = dist[1] + 1

が行われ、dist[2] == 1（頂点１からの距離は１）と言うことになる。最後にi である２がdにappendされる。
dist[i] == -1 じゃないのが続けば、d は popleft されるだけとなり、
いずれ d == False（空）となり、while文が終了する。と言う流れ。
今回ようやくにして初歩的ではあるが、アルゴリズムを実装する経験ができ、少しずつやりたいことができるようになっている気がする。

これから、どんな風になっていくのか見当もつかないが、こんなのを扱ってご飯がたべれたら最高の外の何ものでもない。

結論、プログラミングは楽しい。イエイ。
【oracle備忘録】UNION ALL句の中でORDER BY使用して並べ替え

※この備忘録は初学者の私が学習した内容を忘れないために書き起こしたものとなります。
#目的
UNION ALL と ORDER BY を使用して、並び替え済みのUNION ALL句を結合したい。
##例題
1組、2組、3組の生徒の生年月日情報の中から誕生日の昇順に並び替えて、
1998年生まれの人のみ表示したい
・1組の誕生日の一番早い人⇒1組の誕生日の一番遅い人
⇒2組の誕生日の一番早い人⇒2組の誕生日の一番遅い人
⇒3組の誕生日の一番早い人⇒3組の誕生日の一番遅い人

***各組のテーブル***
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520051/62989de9-edd6-f2fa-b230-8cb4d427155d.png)

##誤答
単純に考えて、下記のようにUNION ALL句の中にORDER BYを使用するとエラーとなる。

~~~C#
SELECT *
  FROM 1組
 WHERE 誕生日 <= 19981231
 ORDER BY 誕生日

UNION ALL

SELECT *
  FROM 2組
 WHERE 誕生日 <= 19981231
 ORDER BY 誕生日

UNION ALL

SELECT *
  FROM 3組
 WHERE 誕生日 <= 19981231
 ORDER BY 誕生日
~~~

##上手く表示できたコード
下記のようにサブクエリを使用するとうまくいった。

~~~C#
SELECT *
  FROM (SELECT *
          FROM 1組
         ORDER BY 誕生日
         WHERE 誕生日 <= 19981231
       )

UNION ALL

SELECT *
  FROM (SELECT *
          FROM 2組
         ORDER BY 誕生日
         WHERE 誕生日 <= 19981231
       )

UNION ALL

SELECT *
  FROM (SELECT *
          FROM 3組
         ORDER BY 誕生日
         WHERE 誕生日 <= 19981231
       )
~~~

##感想
上記コードでうまく表示することができたが、なんとなく少し回りくどい表現なのかもしれないと思っている。
もっと勉強して、さらに簡潔なソースコードが記述できるようになったら、また改めてこの記事を更新したい。
自分と同じような初学者の方が、この記事にたどり着いて、少しでもヒントになってくれると嬉しく思うとともに、エンジニアの諸先輩方から「もっとこうした方がいいと思うよ！」といったアドバイスをいただけると大変ありがたいと思っています。
Guacamoleのssh-cluster上でのメモリリークチェック

## 経緯
[42tokyo](https://42tokyo.jp/)でC言語の課題を解いている途中で、メモリリークが発生していると機械採点に言われてしまいました。しかし、どこで何がメモリリークしているのかわからずに困っていました。そこで、メモリリークの確認方法を調べてみた内容をメモとしてまとめました。ただ、Guacamoleのssh-cluster上でのチェック方法なので、42の生徒以外にはあんまり役に立たないかもしれません(笑)。

## Guacamoleとは
[Guacamole](https://guacamole.apache.org/)って何やねん、という方は[こちら](https://www.designet.co.jp/faq/term/?id=QXBhY2hlIEd1YWNhbW9sZQ)とかが詳しいと思います。個人的に思うGuacamoleの大きな特徴としては、下のような感じかなと思います。

- ブラウザ上でリモートアクセスできる
- 複数人で共同で操作ができる
- ファイルとかもアップロードできる
 
## 手順
関数内のどこでメモリリークしているか、確認する手順をまとめます。今回は自作したft_split関数を例に挙げてやっていきます。この関数の動作としては、第一引数に文字列を渡し、第二引数に区切り文字を渡すと、区切り文字で区切られた配列が戻り値として返ってきます。ft_split("ABCDE", 'C')だと、[["AB"], ["DE"]]のようなイメージです。 

### 1. 無限ループする関数を作成する
下のようなft_splitを呼び出した後に無限ループする関数を作成します。

```main.c
int main(void)
{
    int index;
    char **tab;
    tab = ft_split("AxBxCCCxDDDDxEExxxF", 'x');
    index = 0;
    while (tab[index])
        free(tab[index++]);
    free(tab);
    while (1);
}
```

### 2. バックグラウンド実行して、メモリリークチェック
上のスクリプトをコンパイルしたあと、バックグラウンドで実行します。

```bash
$ ./a.out 0 &   (&をつけることで、バックグラウンドで実行)
$ leaks a.out
```
自分は最初にleaksコマンドを実行したとき、下の写真のようなメッセージが出てきました。
![Screenshot from 2020-12-06 15-47-12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/663246/7976eb17-a27b-42d3-20cd-b6c7858f76b4.png)
一番下のROOT LEAKというやつがメモリリークしています、と言っています。自分は、ft_substrというmallocする自作関数の結果をそのままft_strtrimという自作関数に引数として渡していたのですが、ft_substrで確保したメモリ領域をそのままにしていました。なので、そこをfreeするように修正すると、下のようなメッセージに変わり、メモリリークは発生していませんでした。
![Screenshot from 2020-12-06 15-45-47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/663246/31ad864c-168e-a4cc-a6b5-d067ae995986.png)
leaksコマンドを実行した後は、以下のコマンドで実行プロセスをkillしてあげてください。じゃないと、関数が無限ループのままなので(笑)。

```
$ ps  (a.outの実行プロセスを確認)
$ kill [プロセスID]
```

## まとめ
あまり多くの人の役に立つような記事ではありませんが、メモ代わりにまとめてみました。C言語はメモリ管理が大変だな思いつつ、でもその煩わしさ含めて最近はC言語が好きになってきました。

**間違いや質問、ご意見等ありましたらお気軽にコメントください。頑張って答えますので(笑)。**
【Rails】データが更新できない時は、バリデーションを確認

# 1. はじめに
アプリを作成している際に、Userテーブルに追加したカラムのデータが更新できずに困りました。
しかも、エラー文が出ないので何が原因なのかがなかなか分からずあたふたしていました。
最終的には原因を見つけられたのですが、解決に至るまでに思いの外、多くの時間を費やしてしまいました。
**同じような現象で、時間を費やしてしまう人が少しでも減るように**、ここに備忘録を残します。


#2. きっかけ
そもそもエラー文が出ていないのに、なぜデータが更新されていないことに気づいたかというと、
更新されたはずのデータを元に検索機能を実装しようとしたときに、
登録したはずのデータで検索結果が返ってくるはずが、なぜかデフォルト値で返ってきたので、
「あれ？おかしいな」と思ったのが始まりでした。

``rails c``でテーブルの中身を確認したらやっぱり更新されていない...。
コンソールを見ると、データが更新される段階でRollbackされていました。

```:コンソール
  ↳ app/controllers/users_controller.rb:11
   (0.2ms)  ROLLBACK
```


#3. 原因
結論から言うと、**パスワードにかけていたバリデーション**が原因でした。
ユーザーのデータを更新する際に、パスワードの入力が必要である設定になっていたのですが、
パスワードなしに、``@user.update``をしようとしていたので、結果的にデータが更新されなかったようです。


```:app/
def show
  @user.update (
    marriage: @post.marriage,
    childcare: @post.childcare,
   )
end
```

と言うことで、バリデーションの設定を変更します。
ユーザー情報更新の場合、パスワードのバリデーションを外すように設定するのは、

```:user.rb(変更前)
validates :password, format: { with: password_format }, length: { in: 8..32 }
```

ここに``on: :create``を追加します。
こうすることでユーザー情報を登録する際のみにパスワードのバリデーションがかかります。

```:user.rb(変更後)
validates :password, format: { with: password_format }, length: { in: 8..32 }, on: :create
```

ユーザー情報更新の際に、パスワードのバリデーションがかからなくなったので、無事データが登録されるようになりました。

#4. 最後に
原因は意外と単純でした。**自分でバリデーションをかけておきながら忘れる始末。**
灯台下暗しってやつですね...。今後は気をつけようと反省した次第です。
git bashのキーバインド登録(単語先頭、末尾ジャンプ)

git bashで単語ジャンプするときCtrl + (→ or ←)を登録する。

git bashを使っているが単語ジャンプのデフォルトがesc + b, esc + f のため使いにくかったのでキーバインドを設定します。

まずはホームディレクトリに行き`.bashrc`を作成します。

```bash:.bashrc
bind '";5C": forward-word'

bind '";5D": backward-word'
```
;5CがCtrl + →
;5DがCtrl + ←を表します。

そしてsourceコマンドでシェルに今作成した.bashrcを実行します。

```console
$ source .bashrc
```

これにてショートカットが登録できます。

bashについて調べたことがありませんでしたので面白かったです。
これで長いコマンドを打ったあとに少し修正したいときなど時短になります。
AtCoder Typical DP Contestの「A - コンテスト」を絵で理解してみたい（PHP）

AtCoderの[こちら](https://atcoder.jp/contests/tdpc/tasks/tdpc_contest)の問題に挑戦してみました。
https://atcoder.jp/contests/tdpc/tasks/tdpc_contest

```html:入力例
3
2 3 5
```

```php:PHP
<?php
    fscanf(STDIN, "%d", $d);
    $ps = explode(" ", trim(fgets(STDIN)));
    
    $ans = array([0 => TRUE]);
    
    foreach ($ps as $p) {
        foreach ($ans as $k => $v) {
            $ans[$k + $p] = TRUE;
        }
    }
    echo count($ans) . "\n";

```
foreachの中でforeachを回して、中のforeachの配列は処理中に中身が増えていきます。よりイメージしやすいように絵に描いてみました。

![スクリーンショット 2020-12-06 14.53.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/645077/7a7c6b5f-040c-5713-38f0-7feead3213d7.png)

こちらの記事は自分用のメモですが、適宜追記していきます。
コメントあれば、ぜひよろしくお願い申し上げます。