OmniAICreator/Qiita-1.07M huggingface dataset:
ユーザー登録画面を作成しながらDBを操作する画面作成の基礎を勉強してみる～ユーザー編集画面の作成～

この記事の関連記事となります。
[ユーザー登録画面を作成しながらDBを操作する画面作成の基礎を勉強してみる](https://qiita.com/mikansei-lab/items/d7e0074df89f508e8c96)

---

## はじめに

ユーザー編集画面を作成して、Userテーブルのデータを1件画面に表示してみます。また、更新ボタンが押された場合、ユーザー情報を更新します。

## 手順

 1. コントローラーを編集します
 2. 編集画面を作成します

### 1. コントローラを編集します

コントローラーを編集します。

```php:app/Http/Controllers/UserController.php
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\User;

class UserController extends Controller
{
  // 
  public function edit(Request $request, $id)
  {
    // ID(主キー)を条件にユーザーを取得します
    $user = User::find($id);
    // 
    $errors = array();
    // ユーザー編集画面へユーザーを渡します
    return view('users.edit', ['user' => $user, 'errors' => $errors]);
  }
  // 
  public function update(Request $request, $id)
  {
    // ID(主キー)を条件にユーザーを取得します
    $user = User::find($id);
    // 氏名、メールアドレスを入力された値に変更します
    $user->name = $request->name;
    $user->email = $request->email;
    if($request->password != null) {
      $user->password = bcrypt($request->password);
    }
    // ユーザーを保存します
    $user->save();
    // ユーザー一覧画面へ遷移します
    return redirect('/users');
  }
}
```

### 2. 編集画面を作成します

編集画面を作成します。
その他のhtmlコードについては割愛します。

```html:resources/views/users/edit.blade.php
<!DOCTYPE html>
<html lang="ja">
  <head>
    <meta charset="utf-8">
    <link href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" rel="stylesheet">
  </head>
  <body>
    <div class="container">
      <form method="post" action="/users/{{ $user->id }}">
        {{ csrf_field() }}
        {{ method_field('PUT') }}
        <div class="form-group">
          <label class="control-label">ID</label>
          <input class="form-control-plaintext" type="text" value="{{ $user->id }}" readonly>
        </div>
        <div class="form-group">
          <label>氏名</label>
          <input class="form-control" name="name" type="text" value="{{ $user->name }}" required>
        </div>
        <div class="form-group">
          <label>メールアドレス</label>
          <input class="form-control" name="email" type="email" value="{{ $user->email }}" required>
        </div>
        <div class="form-group">
          <label>パスワード</label>
          <input class="form-control" name="password" type="password" value="">
          <small class="text-muted">省略した場合、パスワードは変更されません</small>
        </div>
        <div class="form-group">
          <label>作成日時</label>
          <input class="form-control-plaintext" type="text" value="{{ $user->created_at }}" readonly>
        </div>
        <div class="form-group">
          <label>更新日時</label>
          <input class="form-control-plaintext" type="text" value="{{ $user->updated_at }}" readonly>
        </div>
        <a class="btn btn-secondary" href="/users">一覧へ</a>
        <input class="btn btn-primary" type="submit" value="更新">
      </form>
    </div>
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
  </body>
</html>
```

## 参考
[AWS] InstanceConnect と SessionManager の比較

# はじめに

『[EC2 Instance Connect](https://aws.amazon.com/jp/about-aws/whats-new/2019/06/introducing-amazon-ec2-instance-connect/)』に『[Session Manager の SSH・SCPトンネリング](https://aws.amazon.com/jp/about-aws/whats-new/2019/07/session-manager-launches-tunneling-support-for-ssh-and-scp/)』と、似たような機能が立て続けにリリースされましたが、「どっち使えばいいの？」と悩んでしまいますよね。

それぞれ向き／不向きなケースがありますので、どちらを利用すべきかの判断ポイントを簡単に表にまとめてみます。

# 比較表

表はSSHのみとなっていますが、SCPでも同様です。
SessionManagerの従来の接続方法については比較対象外としています。

| 比較項目 | SessionManager (SSH) | EC2 InstanceConnect (SSH) |
|:----|:----|:----|
| 対応OS | 多い | 少ない |
| EC2ロール | 必要 | 不要 |
| オンプレサーバーでの利用 | 可 | 不可 |
| ネットワーク | 22番ポートの穴あけが不要。<br>Privateネットワークでも利用可。 | 22番ポートの穴あけが必要。<br>Privateネットワークでは利用不可。 |
| SSHキー（秘密鍵） | クライアントで保持する必要がある。 | 不要。<br>msshコマンドが勝手に作って使って捨てる。 |
| OSユーザー指定 | SSHキーで制御。 | IAMユーザー（IAMロール）に付与するポリシーで限定が可能。 |
| ログ | SessionManagerにセッション履歴が残る。<br>CloudTrail に `StartSession` のログが残る。<br>OS上の操作ログは残らない。 | CloudTrail に `SendSSHPublicKey` のログが残る。<br>OS上の操作ログは残らない。 |
核磁気共鳴技術, 安岡弘志, 2002

岩波講座-物理の世界-ものを見るとらえる〈3〉核磁気共鳴技術, 安岡弘志, 2002
![41TBBCAPR4L._SX334_BO1,204,203,200_.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51423/9f9846a3-2af5-ba91-d61d-c075020c640f.jpeg)

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

#参考文献
###1
I.D. Weisman, L.J. Swarterdruber and L.H. Bennet, Nuclear Resonance in Metals, Nuclear Magnetic Resonance and Mossbauer Effect in Measurement of Physical Properties, E. Passaglia edl., Inter Science, 1973
###2
C.P. Slichter, Principle of Magnetic Resonance 2nd ed., Springer-Verlag, 1987
###3
核磁気共鳴の基礎　丸善

###4
安岡弘志 NMR 実験化学講座　丸善
###5
安岡弘志 遍歴電子磁性体　核磁気共鳴でながめたスピンのゆらぎ　物理学最前線８

###6
遍歴電子系の核磁気共鳴　金属磁性と超伝導
###7
安岡弘志 NMRから見た高温超伝導
###8
高温超伝導の科学
###9
安岡弘志 NMR映像法　わが国における技術とその発展　科学 Vol53, p185, 岩波書店, 1983
### 最後までおよみいただきありがとうございました。

いいね　💚、フォローをお願いします。
#### Thank you very much for reading to the last sentence.

Please press the like icon 💚　and follow me for your happy life.
VSCode で anaconda の python  を使う(設定編)

構文チェックで 「import できねぇぜｗ」って出るまで気が付かなかった。
以下の設定が必要

```
python.condaPath
example)E:\python\anaconda\condabin\conda.bat

python.pythonPath
example)E:\python\anaconda\envs\hoge\python.exe
```

どうやら、パスの指定にエスケープは必要ないらしい。って書きたかった記事。

(追記)
エスケープいらないって書いたけど、`settings.json`にはきっちりエスケープありのもので反映されてました＾＾；
やっぱりいるんじゃんｗ
今さらながらDoxygenの便利さを語ってみる

### はじめに

私事ですが、最近転職しました。

新しい組織での業務をキャッチアップするために、ソースコードを読み解いて理解する必要がありますが、私はよくDoxygenを使います。

### ドキュメント生成だけじゃない

Doxygenと言えば、主に「コメントに記載した引数や返り値の情報をHTMLに整形して出力する」ことが目的のツールであると認識されていると思いますが、その他にも様々な機能があり、コードの読解にとても役に立ちます。

- ディレクトリ階層
- クラス階層
- 関数の呼び出し・被呼び出しグラフ
- 変数の宣言部、使用部へのジャンプ

上記がHTMLでリンクをたどれるように出力されるので、プロジェクト全体を把握するのにだいぶ助けとなります。

それぞれ、[Graphviz](https://www.graphviz.org/)、[GNU Global](https://www.gnu.org/software/global/)が必要となります。あらかじめインストールしておくことをお勧めします。
大半のLinuxディストリビューションであればパッケージが用意されていますので、yumなりaptなりでインストールできます。

対応している言語についても、[公式ドキュメント](http://www.doxygen.jp/features.html)に以下のようにあります。

> C/C++、Java、(Corba およびマイクロソフト) Java、Python、 IDL、C#、Objective-C をサポートしており、D と PHP のソースにもある程度対応しています。

Ruby、JavaScriptは対応してないのか、、、残念。

### 手順

(1) ドキュメントを生成したいソースツリーの最上部で、下記を実行します。

```
$ doxygen -g
```

(2) 生成されたDoxyfileをプロジェクトに合わせてカスタマイズしていきます。 
各項目の詳細な説明は[リファレンス](http://www.doxygen.jp/config.html)をご参照ください。

以下は、私のおすすめ設定です。

```Diff
# プロジェクト名。Doxygenドキュメントのタイトルなどに使われます。
-PROJECT_NAME           = "My Project"
+PROJECT_NAME           = "任意のプロジェクト名"
# 言語を選択します。（が、あんまり影響はないかも。）
-OUTPUT_LANGUAGE        = English
+OUTPUT_LANGUAGE        = Japanese
# FULL_PATH_NAMES がYESの場合、ファイル名がフルパスで出力され、けっこうわずらわしいです。
-FULL_PATH_NAMES        = YES
+FULL_PATH_NAMES        = NO
# とりあえず全部出す
-EXTRACT_ALL            = NO
+EXTRACT_ALL            = YES
# とりあえず全部出す
-EXTRACT_PRIVATE        = NO
+EXTRACT_PRIVATE        = YES
# とりあえず全部出す
-EXTRACT_STATIC         = NO
+EXTRACT_STATIC         = YES
# とりあえず全部出す
-EXTRACT_ANON_NSPACES   = NO
+EXTRACT_ANON_NSPACES   = YES
# ソースツリーのフォルダ構成が深い場合はマスト
-RECURSIVE              = NO
+RECURSIVE              = YES
# 外部パッケージのディレクトリなどはパッケージの数によっては時間がかかりますので、適宜除外します。
-EXCLUDE                =
+EXCLUDE                = ./vendor
# ソースコードをドキュメントに含めます
-SOURCE_BROWSER         = NO
+SOURCE_BROWSER         = YES
# 被呼び出し関数一覧
-REFERENCED_BY_RELATION = NO
+REFERENCED_BY_RELATION = YES
# 呼び出し関数一覧
-REFERENCES_RELATION    = NO
+REFERENCES_RELATION    = YES
# HTMLの出力ディレクトリを指定します。任意のディレクトリ名でかまいません。
-HTML_OUTPUT            = html
+HTML_OUTPUT            = doxygen
# LaTexいらない
-GENERATE_LATEX         = YES
+GENERATE_LATEX         = NO
# 呼び出しグラフ
-CALL_GRAPH             = NO
+CALL_GRAPH             = YES
# 被呼び出しグラフ
-CALLER_GRAPH           = NO
+CALLER_GRAPH           = YES
```

(3) `doxygen` コマンドを実行し、ドキュメントを生成します。

### いかがでしたでしょうか？（って言いたいだけ

使いようによってはコードリーディングの大きな助けとなります。もう一度Doxygenを見直してみてはいかがでしょうか。
Vagrantのゲストマシンを再起動すると共有フォルダが同期されない

# 記事の概要
Vagrantで立ち上げたゲストマシンを`reboot`あるいは`shutdown -r now`で再起動すると、ホストマシンとゲストマシンの共有フォルダが同期されません。

`vagrant reload`を使って再起動すると、同期されます。

Vagrantで立ち上げたゲストマシンを再起動する時は、`vagrant reload`を用いましょう。ゲストマシンにゲストマシンの再起動をさせてはいけません。ホストマシンにゲストマシンを再起動させる必要があるのです。

再起動までのプロセスを自動化する方法については、『[Vagrantのゲストマシンを自動で再起動する](https://qiita.com/flyingbarbarian/items/a46208dc25c5dc572b72)』をご覧下さい。

# 記事の詳細
## 実行環境
`Windows 10 Home`
`Vagrant 2.2.4`
`ubuntu/bionic64 Official Ubuntu 18.04 LTS(Bionic Beaver)Daily Build`

## 使用したVagrantfile

```
Vagrant.configure("2") do |config|
  # 利用するVagrantBox
  config.vm.box = "ubuntu/bionic64"
end
```

## ゲストマシンを再起動する前の共有フォルダ
`vagrant up`でゲストマシンを起動します。

下記コマンドで、ゲストマシンの共有フォルダ`/vagrant`を確認します。
ホストマシンと同じファイルが存在するのが確認できます。
すなわち、共有フォルダが正しく同期されていることを示しています。

```
vagrant ssh
cd /vagrant
ls -a
```

## rebootやshutdown -r nowで再起動した後の共有フォルダ

下記コマンドでゲストマシンを再起動します。

```
sudo reboot
```
先程と同じコマンドで、ゲストマシンの共有フォルダ`/vagrant`を確認します。
ゲストマシンの共有フォルダが空のフォルダになっています。
一方、ホストマシンの共有フォルダには再起動前と同じファイルが存在します。
すなわち、共有フォルダが同期されていないことを示しています。

下記のコマンド`shutdown -r now`で再起動しても、`reboot`と同様の結果です。
すなわち、共有フォルダは同期されません。

```
sudo shutdown -r now
```

## vagrant reloadで再起動した後の共有フォルダ

下記コマンドでゲストマシンを再起動します。

```
vagrant reload
```

同様に共有フォルダを確認します。
ゲストマシンの共有フォルダには、ホストマシンと同一のファイルが存在します。
すなわち、共有フォルダが正常に同期されていることを示しています。

**したがって、Vagrantのゲストマシンを再起動する時は`vagrant reload`を使用しましょう。**

# 補足事項

## Vagrantfileで共有フォルダを明示する場合

下記Vagrantfileのように、共有フォルダを明示的に定義しても、結果は変わりません。

```
Vagrant.configure("2") do |config|
  # 利用するVagrantBox
  config.vm.box = "ubuntu/bionic64"
  
  # 共有フォルダ
  config.vm.synced_folder "", "/vagrant_data"
end
```
`reboot`あるいは`shutdown -r now`で再起動すれば同期されません。
`vagrant reload`で再起動すれば同期されます。

## ポートフォワード

下記Vagrantfileのように、ポートフォワードされたゲストマシンについて。

```
Vagrant.configure("2") do |config|
  # 利用するVagrantBox
  config.vm.box = "ubuntu/bionic64"
  
  # ポートフォワード
  config.vm.network "forwarded_port", guest: 80, host: 8080
  
  # プロビジョニング
  config.vm.provision "shell", inline: <<-SHELL
    apt update
    apt upgrade -y
    apt install -y apache2
  SHELL
end
```
`reboot`、`shutdown -r now`、`vagrant reload`のどのコマンドで再起動しても、[http://127.0.0.1:8080/](http://127.0.0.1:8080/)でapacheのデフォルトページを見ることが出来ます。

すなわち、ポートフォワードは再起動の方法の影響を受けなさそうです。

## 参考にした記事
https://stackoverflow.com/questions/23894739/synced-folders-lost-when-rebooting-a-vagrant-machine-using-the-ansible-provision

https://superuser.com/questions/1338429/how-do-i-reboot-a-vagrant-guest-from-a-provisioner
超伝導と超流動, 勝本信吾, 2005

岩波講座-物理の世界-物質科学の展開〈1〉超伝導と超流動, 勝本信吾, 2005
![51HZ5G00G1L._SX337_BO1,204,203,200_.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51423/6574b0d2-3875-7c8d-77ed-cd63bdb2eb8b.jpeg)

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


#参考文献
###1
Z.M. Galaslewicz, Helium 4, Pergamon Press, 1971
###2
L.D. Landau and E.M. Lifshitz, Fluid Mechanics, Ch. 16, Pergamon Press, 1979
###3
超流動　培風館
###4
G.E> Volvik, The Universe in a Helium Droplet, Oxford University Press, 2003
###5
超伝導でたどるメゾスコピックの世界　岩波講座
###6
極低温の世界　超伝導への道、岩波書店
###7
低温・超伝導、高温超電導、パリティブックス
###8
M. Tinkham, Introduction to Superconductivity, second edition, Dover Publication, 2004
###9
レーザー冷却とボーズ凝縮　岩波
### 最後までおよみいただきありがとうございました。

いいね　💚、フォローをお願いします。
#### Thank you very much for reading to the last sentence.

Please press the like icon 💚　and follow me for your happy life.
連続する文字を１文字にしたい



**tr -s**を使う

ex:

```sh

$ echo "//test/awa//wawa" | tr -s /
/test/awa/wawa
```

楽ちんですね

今までsedでやってました

これだけだと寂しいので他の使い方を書いておこう

```sh
# 1をxに置換する
$ echo "12341234" | tr 1 x
x234x234

# 1と３を消す
$ echo "12341234" | tr -d 13
2424

# 範囲指定
$ echo "12341234" | tr -d 1-3
44

# 1以外をxに置換（改行も置換されるのでちゅうい）
$ echo "12341234" | tr -c 1 x
1xxx1xxxx
```
WebPackのlibraryTargetによる出力結果の違いと、TypeScriptで吐いた.d.tsの悲しみ

# WebPackのlibraryTargetによる出力結果の違いと、TypeScriptで吐いた.d.tsの悲しみ

　WebPackでライブラリを作成する際、他のプロジェクトからWebPack経由でモジュールとして出力する際は **amd** 、HTMLの\<SCRIPT>から非モジュールとして呼び出す場合は **global** を使っていました。ぶっちゃけていうと、内容をよく理解せずに使っているわけです。これではまずいので、 **libraryTarget** の設定でどう出力内容が変わるのかを確認してみることにしました。

## 出力内容

**library** の設定を **JWF** という名前にした時の結果をまとめました。

| libraryTarget | 一行目 |
| --- | --- |
|var| var JWF =|
|assign| JWF =|
|this|  this["JWF"] =|
|window| window["JWF"] =|
|self| self["JWF"] =|
|global|window["JWF"] =|
|commonjs|exports["JWF"] =|
|commonjs2|module.exports =|
|commonjs-module|module.exports =|
|amd|define("JWF", [], function() { return|
|amd-require|require([], function() { return|
|umd|(function webpackUniversalModuleDefinition(root, factory) {|
|umd2|(function webpackUniversalModuleDefinition(root, factory) {|
|jsonp|JWF(/******/ (function(modules) { //|
|system|System.register("JWF", [], function|

　設定によってwindowのプロパティになったりグローバル変数になったりしています。WebPackから使う場合はモジュールの体を成していれば上手くやってくれますが、\<SCRIPT>から直接呼び出すライブラリとして使う場合は、自分できちんと対処する必要があります。とりあえず動いていたので気にしていませんでしたが、もっと早く確認すべき内容でした。

## おまけ：TypeScriptの悲しみ

　TypeScriptで開発したコードをWebPackで非モジュールのライブラリを生成した場合、問題になるのがTypeScriptの定義ファイルである **.d.ts** です。WebPackでモジュールとして開発し、\<SCRIPT> から直接呼び出す形に libraryTarget を **var** や **global** 変更しても、**.d.ts** はモジュールの形式のままとなります。各機能のインスタンスが変数に入っているのに、それを利用したコードを書いても、開発環境の入力補完に対応せず、コンパイル時もエラーの山となります。

　これの対処法を色々と調べたのですが、有用な情報はなぁんにも見つかりませんでした。これで困っている人は人っ子一人いないようです。無いものは作る、有るものですら作るが心情なので、結局自分で変換プログラムを作りました。やっていることはモジュール定義を全て削除、そのかわりnamespaceをlibrary名で作成し囲むというものです。TypeScriptのCompilerAPIを使えば、どこに何の定義があるかを簡単に調べられるので、普通に字句解析するより簡単に作ることが出来ました。欲しい人がいるならWebPackからすぐに使える形にしてnpmに登録することも可能です。しかしニッチすぎて需要は無いでしょう。
[UE4]プレイヤーをネットワーク化(1) 

UE4のFPSサンプルをネットワーク化します。
今回は[こちら](https://www.youtube.com/watch?v=_dgBsA9xgmI)の前半となります。

サンプルプロジェクトを作成
-
新規プロジェクトでファーストパーソンを選択しプロジェクトを作成します。
![2019-07-24_132904.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59911/bd521eec-395d-4239-fa34-823a6219987c.jpeg)

![2019-07-24_133317.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59911/9588a25d-a230-fde0-7278-a869532a752d.jpeg)

プレイヤーを2人に
-
まずはプレイヤーを2人にしてみます。
再生ボタン横の▼をクリックし、詳細設定を選択
![2019-07-24_133423.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59911/dd030e62-566d-e9cd-0fe2-c7ad88aa31fd.jpeg)

複数画面を同時に確認できるよう画面サイズを小さめに設定し、
プレイヤー数を２にします
![2019-07-24_133707.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59911/a04331a2-abf2-2029-c6cf-155071760386.jpeg)

再生ボタン横の▼をクリックし、新規エディタウィンドウを選択します
![2019-07-24_133932.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59911/cc8232b3-6624-9910-1ad3-f9c1b16f8012.jpeg)

それぞれのウインドウで各プレイヤーが動かせるようになりました。
**ただし、まだ相手の画面で自分の弾が生成されません。**
![2019-07-24_134136.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59911/1564063b-e371-3a46-0887-078ab511b4b6.jpeg)

弾をネットワーク対応に
-
コンテンツブラウザ>FiestPersonBP>BluePrints>FirstPersonProjectile
をダブルクリックし、イベントグラフを開きます

詳細＞ReplicateMovement
詳細＞Replicates
にチェックを入れ、コンパイルボタンを押してウインドウを閉じます

![2019-07-24_135302.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59911/316e8cd0-5e98-860b-f924-3b1679972746.jpeg)

これでサーバー側の弾はクライアント側で生成されるようになりましたが、
**クライアント側の弾はサーバー側で生成されません。**

トリガーボタンをネットワーク対応に
-
初期状態だと「トリガーを押したときに弾が生成される」となっているので、
これを、「トリガーを押したときにサーバーでネットワークイベントが発動する」
ようにして、クライアント側でも弾が生成されるようにします。

アウトライナ>FirstPersonCharacter>クリックしてブループリントを編集
弾を生成している箇所（Spawn projectile）を探します。
![2019-07-24_140029.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59911/68caa5a6-bdc9-dd36-047d-64be4b86e3c5.jpeg)

タッチやコントローラー等不要な処理を削り、
右クリック＞カスタムイベントを生成＞ServerSpawnProjectileと名付け
グラフ>サーバーで実行 に変更
![2019-07-24_150427.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59911/58ef4a50-6883-99e8-f344-3345f3c8bd87.jpeg)

右クリック＞ServerSpawnProjectileでカスタムイベントを発動させる同名の関数を生成
![2019-07-24_150552.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59911/ae560a01-d37d-08d1-bfc6-ea278903be74.jpeg)

トリガーで弾を出していたのを
![2019-07-24_150648.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59911/792bfd11-2f8a-2eb8-ec0e-1d6645b8d95d.jpeg)

トリガーでイベントを呼び出し、イベントで弾を出すようつなぎなおす
![2019-07-24_150746.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59911/08488c62-4a38-d2cd-ed8f-4fb04728592d.jpeg)

これでどちらからも弾が出るようになりました。
laravel guzzle post 通信

laravel guzzle http リクエストしようぜ


今回は yahoo の 形態素解析を使ってみる
https://developer.yahoo.co.jp/webapi/jlp/ma/v1/parse.html

# まずは composer


```

composer require guzzlehttp/guzzle

```

# controller で以下のように

今回 twitter の client とかぶってエラーになるので、
use GuzzleHttp\Client2; として 2 をつけて読み込んでおく。

```

//        use GuzzleHttp\Client2;　としておく。
//        他の Client と バッティングさせないために 以下のように書く

$client_id = 'hogeyour';
$secret_id = 'hogesecretyour';

$client = new \GuzzleHttp\Client([
'base_uri' => 'https://jlp.yahooapis.jp/MAService/V1/',
]);

$method = 'POST';//GET or POST
$uri = 'parse?appid='.$client_id.'&results=ma,uniq&uniq_filter=9%7C10&sentence=恋に恋焦がれ恋に泣く';   // スカイツリーの郵便番号
$options = [];
$response = $client->request($method, $uri, $options);

//xml で帰ってくるので。
$data = simplexml_load_string($response->getBody()->getContents());

foreach ($data->uniq_result->word_list->word as $v) {

pd($v->surface);

}

```


結果

```

/var/www/html/uranaibako.com/app/Http/Controllers/HogeController.php (line 221)
SimpleXMLElement Object
(
[0] => 恋
)
/var/www/html/uranaibako.com/app/Http/Controllers/HogeController.php (line 221)
SimpleXMLElement Object
(
[0] => 恋焦がれ
)
/var/www/html/uranaibako.com/app/Http/Controllers/HogeController.php (line 221)
SimpleXMLElement Object
(
[0] => 泣く
)

```
LeetCode / Remove Duplicates from Sorted List

（[ブログ記事](https://mhiro216.hatenablog.com/entry/2019/07/24/135327)からの転載）

[https://leetcode.com/problems/remove-duplicates-from-sorted-list/]

Given a sorted linked list, delete all duplicates such that each element appear only once.

Example 1:
Input: 1->1->2
Output: 1->2

Example 2:
Input: 1->1->2->3->3
Output: 1->2->3

LeetCode頻出のLinkedListの問題。[以前の記事](https://mhiro216.hatenablog.com/entry/2019/07/13/153148)にも登場してます。

<b>今回の記事も長くはないですが、裏には数多の苦悩の道のりがありました。</b>
LinkedListの性質（より正確には、Pythonの変数間の参照）がどうにも理解できず、youtubeでインドの方の解説動画とかを読み漁りました。

#### 解答・解説

##### 解法1
公式のJavaの解答をPythonに翻訳したのが以下です（余談ですが、LeetCodeをやってると高級言語から入った人でもC++とかJavaが段々読めるようになってくるのがおトクですね）。

```python
class Solution:
    def deleteDuplicates(self, head: ListNode) -> ListNode:
        # currentとheadの間で参照を渡して、headの各nodeをcurrentを動かしながら移動し、重複nodeを発見・削除する
        current = head
        while current and current.next:
            # 重複nodeを発見したら、重複nodeの次のnodeにcurrent.nextをポイントさせて、重複nodeを削除する
            if current.next.val == current.val:
                current.next = current.next.next
            # 重複nodeでなかったら、通常のiterationを進める（currentを次のnodeにポイントさせる）
            else:
                current = current.next
        return head
```

、、、ということなんですが、皆さん分かりますか？
私はさっぱり分かりませんでした。current.next = current.next.nextだとnodeは削除されるのに、current = current.nextだとnodeは削除されないのはなぜ？

どうにも困ったので、慣れ親しんだデータ型であるlistで同様の状況を再現してみて、改めて考えてみました。

```python
head = [1,1,2]
current = head
while current and current[1:]:
    if current[1] == current[0]:
        current[1:] = current[2:]
    else:
        current = current[1:]
    print('current:{}'.format(current), 'head:{}'.format(head))
head
# ---> current:[1, 2] head:[1, 2]
# ---> current:[2] head:[1, 2]
# ---> [1, 2]
```

分かりやすいように、print文でIterationの途中のcurrent, headの値を吐き出すようにしました。
この結果から、朧げながら私の理解は、
current[1:] = current[2:]ではcurrentとheadの間の参照は保持したまま値が代入されている（のでheadの値も変わる）が、
current = current[1:]では参照自体が1つ先に移動する（のでheadの値が変わるわけではない）、
ということかと思いました。

間違っていたら是非是非ご指摘ください。
Laravelでいいね機能

### 環境
PHP 7.3
Laravel 5.8

Laravelにいいね機能を実装しようと思い、調べていたら[Laravel-LoveというライブラリがLaravel Newsで紹介されていました。](https://laravel-news.com/laravel-love)

[cybercog/laravel-love](https://github.com/cybercog/laravel-love)

### 準備

今回は`User`モデルで`Post`モデルにいいねします。

インストール

```
$ composer require cybercog/laravel-love
$ php artisan migrate
```

`Like`タイプを生成

```
$ php artisan love:reaction-type-add Like 1
```

Reactarebl（いいねするモデル）の準備

```php:app/User.php
<?php

namespace App;

use Cog\Contracts\Love\Reacterable\Models\Reacterable as ReacterableContract;
use Cog\Laravel\Love\Reacterable\Models\Traits\Reacterable;
use Illuminate\Foundation\Auth\User as Authenticatable;

class User extends Authenticatable implements ReacterableContract
{
    use Reacterable;
}
```

```
$ php artisan love:setup-reacterable --model="App\User" --nullable
```

Reactable（いいねされるモデル）準備

```php:app\Post.php
<?php

namespace App;

use Cog\Contracts\Love\Reactable\Models\Reactable as ReactableContract;
use Cog\Laravel\Love\Reactable\Models\Traits\Reactable;
use Illuminate\Database\Eloquent\Model;

class Post extends Model implements ReactableContract
{
    use Reactable;
}
```

```
$ php artisan love:setup-reactable --model="App\Post" --nullable
```

### 実際にいいねする

```php
<?php
use App\User;
use App\Post;
use Cog\Laravel\Love\ReactionType\Models\ReactionType;

$user1 = User::find(1);
$post1 = Post::find(1);

$likeType = ReactionType::fromName('Like');

//リアクター、リアクタントとして登録。
//すでに登録してある場合、例外が投げられます。
if ($user1->isNotRegisteredAsLoveReacter()) {
    $user1->registerAsLoveReacter();
}
if ($post1->isNotRegisteredAsLoveReactant()) {
    $post1->registerAsLoveReactant();
}

$reacter = $user1->getLoveReacter();
$reactant = $post1->getLoveReactant();

//$user1が$post1をいいねしていないことを確認
if ($reacter->isNotReactedToWithType($reactant, $likeType)) {
    //$user1で$post1をいいね
    $reacter->reactTo($reactant, $likeType);
}

//$user1がいいねしたPostが入ったCollectionを取得
$posts = Post::query()
    ->whereReactedByWithType($reacter, $likeType)
    ->get();

//$post1をいいねしたUserが入ったCollectionを取得
$likeReactions = $post1
    ->getLoveReactant()
    ->reactions()
    ->where('reaction_type_id', ReactionType::fromName('Like')->getId())
    ->get();

$likeUsers = [];
foreach ($likeReactions as $likeReaction) {
    $likeUsers[] = User::where('love_reacter_id', $likeReaction->getReacter()->id)->first();
}

//$post1をいいねした数を取得
count($likeUsers);

//いいね解除
if ($reacter->isReactedToWithType($reactant, $likeType)) {
    $reacter->unreactTo($reactant, $likeType);
}
```

### 参考
[Laravel-Loveのドキュメンテーション](https://laravel-love.readme.io/docs/getting-started)
[Githubのissue](https://github.com/cybercog/laravel-love/issues/43)
"Reference to property '(property name)' in closure requires explicit 'self.' to make capture semantics explicit"でコンパイルエラーになる 

あるあるだと思うのですが。。。

```swift
Class Map 

    var image = UIImage()
    let url = "https://〜"
    let overlay = MKTileOverlay(urlTemplate: url)

     overlay.loadTile(at: path!) { (Data, Error) in            
        image = UIImage(data: Data!)!    //!!Error!!
        return
    }
```
こんな書き方をすると、

> "Reference to property 'image' in closure requires explicit 'self.' to make capture semantics explicit"

と怒られてしまいます。
修正方法は簡単で、Xcodeに言われるがまま、怒られた変数にselfをつければいいです

```swift
Class Map 

    var image = UIImage()
    let url = "https://〜"
    let overlay = MKTileOverlay(urlTemplate: url)

     overlay.loadTile(at: path!) { (Data, Error) in            
        self.image = UIImage(data: Data!)!    //OK
        return
    }
```

で、これは何が怒られているかというと、クロージャの中で変数の参照を持つため、
循環参照になっていないか意識させるために、Swiftの文法上Selfの指定が必須になっています。

[loadTile(at:result:) についてはこちら](https://developer.apple.com/documentation/mapkit/mktileoverlay/1452445-loadtile)
【lightgallery.js】 軽量、マルチデバイス対応、高機能画像ギャラリー 作成

サイトにフォトギャラリーを作成するときに「[lightgallery.js](https://sachinchoolur.github.io/lightgallery.js/)」を利用してみました。
cssとjsを少し修正するだけで簡単にカスタマイズができ、非常に使いやすかったので利用方法を下記に紹介します。

## lightgallery.jsとは
[lightgallery.js](https://sachinchoolur.github.io/lightgallery.js/)は軽量のjQuery非依存のlightbox系のプラグインです。
画像や動画、(YouTube/Vimeo),iframeなどを使用でき、レスポンシブ対応、マルチデバイス対応、アニメーションなどのカスタマイズが簡単で高機能なスクリプトです。
[DEMOページ](https://sachinchoolur.github.io/lightgallery.js/demos/)で動作が確認できます。

### lightgallery.jsの特徴
- レスポンシブ対応
- 豊富なモジュールの追加・削除が簡単
- タッチデバイス対応
- カスタマイズ簡単
- アニメーションのサムネイル
- YouTube Vimeo対応
- 20種類以上のアニメーション
- ダイナミックモードの設定
- ズーム、フルスクリーン
- HTML5動画対応
- SNSシェア
- 画像の読み込み高速化
- レスポンシブ画像
- ギャラリーの画像に固有のURLを指定可能


## lightgallery.jsの利用方法
まずはTopページの真ん中にある「[View on github](https://github.com/sachinchoolur/lightgallery.js/)」をクリックしてgithubページにいってください

githubの「Clone or download」ボタンをクリックし「Download ZIP」をクリックしてソースをダウンロードしてください。

ダウンロード後、ファイルを解凍すると以下のようなファイルやデータがはいっています。
<img width="226" alt="スクリーンショット 2019-07-18 13.32.59.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163786/ad239388-7f89-de34-625f-07b49c629cb9.png">

この中に「dist」と書かれたフォルダがあります。
このファイルを開くと４つのフォルダがあります。
<img width="114" alt="スクリーンショット 2019-07-18 13.39.30.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163786/efbb981e-812d-3a0d-4ac7-d9983f3e48f2.png">
プラグインを使用するのに必要なファイルになります。

### lightgallery.jsの読み込み
まず\<head>ドキュメントの中にlightgallery.cssを追加します。

``` html
<head>
    <link type="text/css" rel="stylesheet" href="css/lightgallery.css" /> 
</head>  
```
次に、lightgallery.jsを追加します。
lightgalleryプラグインを含めたい場合は、lightgallery.jsの後に追加することができます。

``` html
<body>
    ....

    <script src="js/lightgallery.js"></script>

    <!-- lightgallery plugins -->
    <script src="js/lg-thumbnail.min.js"></script>
    <script src="js/lg-fullscreen.min.js"></script>
</body>  
```

※とくに中身をカスタマイズしないのなら軽量の'lightgallery.min.css'、'lightgallery.min.js'をお使いください。

#### プラグインの追加
lightgalleryのjavascriptは機能ごとに別れているので、使いたい機能があればそのプラグインを追加してください。
<img width="250" alt="スクリーンショット 2019-07-18 13.56.24.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163786/8698be85-dca5-15b5-3fb3-7ea36660ef8a.png">

### マークアップ
lightgalleryのマークアップには以下のような記述が推奨されています。

```html

<div id="lightgallery">
  <a href="img/img1.jpg">
      <img src="img/thumb1.jpg" />
  </a>
  <a href="img/img2.jpg">
      <img src="img/thumb2.jpg" />
  </a>
  ...
</div>
```
### プラグインの呼び出し
プラグインを呼び出しギャラリーを起動させます。

```html
<script type="text/javascript">
    lightGallery(document.getElementById('lightgallery')); 
</script>
```
以上で基本的な導入の仕方です。
STYLY細かい仕様メモ

# STYLYには細かい仕様が多すぎる
ちょっと覚えきれなくなってきたので、気づいたもの、思い出したものからメモしていきます。

## シーン編
### シーンにはデフォルトで透明のPlaneが居る
 * VRのTeleport移動の為に設定していると思われる。
 * 想定した区画より外に行けたり、下に移動する体験を作ろうとすると邪魔になる
 * DestroyGameObject "Plane" で消せる
   * STYLY公式見解としては非推奨らしい

## Publish編

### WebEditor上のPublish画面ではコピペができない
* アセットによってはライセンス周り書きたくなるが、コピペできない。
    * ![EditDiscriotion3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197699/1de3fe8b-c6af-f195-e0fe-bd2cdeb0e345.png)
* Galleryから編集すればコピペできる
    * ![EditDiscriotion.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197699/d80c9c51-942f-8c02-5f47-53701024df4a.png)
![EditDiscriotion2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197699/f5697bba-5307-1693-b7fa-03dffa9d4acf.png)


## Prefab制作/アップロード編

### アップロードしたPrefabはGUIDで管理される
* 普通に空間作るだけなら問題ないが、PlayMakerの時に大きな障害となるのだ。。。

### アップロードしたPrefabには自動的にColliderが張られる
* VRのTeleport移動の為に設定していると思われる。
* インタラクションを考えるときや、GameObjectが移動するような時に邪魔になったりする
* シーンをアップロードした場合はColliderが張られない
    * STYLY公式ではCollider不要の場合シーンのアップロードでの対応を推奨している
* ColliderはPrefab自体についている
    * 例えば、PrefabのChild要素を移動した場合、Colliderだけその場に残る事故が起きる
    * 逆に言えば、初めに適当なところに配置しておいて、あとで移動したらColliderを実質消したことになる
* 例外としてTextMeshにはつかないっぽい。
    * ~~これがよくわからない~~[不具合](https://twitter.com/afjk01/status/1153872677578240005)だった
* Collider必要ない場合、PlayMakerで消せる 

### C#スクリプトは使えない
* STYLYの仕組み上仕方ない
* STYLYアプリに組み込まれているC#スクリプトなら使える
    * PlayMaker
    * iTween
    * (本当はほかにもあるんじゃない？)

## PlayMaker編
### アップロードしたPrefabはFindGameObjectで取得できない
* アップロードしたPrefabはGUIDにリネームされてるので、GUIDでFindGameObjectしないと取得できない。
* ![prefabname.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197699/f32206b8-dcde-8b00-6c26-49bab1d1cd12.png)
    * PrefabをUploadすると、Prefabの名前はGUIDになる
    * STYLY上でPrefabの本来の名前はどこかに保存されてるのだろう。
    * STYLYのHierarchyをUnity風に表すと、Assetを取りまとめるObjectの下にGUIDのObjectが居るイメージ。
* Child以下はリネームされていないので、Prefab自体は捨ててChild以下を利用するようにすると安定。
    * ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197699/69ca9534-a97f-559b-1984-902091662203.png)
    * 名前がGUIDに代わってもいいように、適当なObjectのChildにする
    * この画像でいうPrefavWrapprtをSTYLYにUploadしたら、Child以降はFindGameObjectで探せる。
* 尚、SetNameでPrefabの名前をGUIDから好きな名前に変えると、[Loadできないシーン](https://gallery.styly.cc/noria901/27b083a7-9812-11e9-b34d-4783bb2170d0)が出来上がる


### グローバル変数は使えない
* [ここ](https://styly.cc/ja/tips/english-global-variable-alternatives-how-to-share-variables-between-fsm-machines/)に書いてあった。

### GetRootの結果がUnity上とSTYLY上で変わる
* Hierarchyが多分、こんな感じになってる
    * Assetroot
        * Asset1_GUID
        * Asset2_GUID

### MainCameraの取得方法がいくつかある
* [ここ](https://gallery.styly.cc/noria901/375e4842-6ccd-11e9-b34d-4783bb2170d0)で試した
* GetMainCameraで取れるにゃとれる
    * Transform普通に取得できる
    * FSMからCameraを強制移動できないことがある
* 環境ごとにMainCameraの名前が規定されてるのでそれで取れる
    * Transformがおかしい
    * FSMからCameraを強制移動できる
    * **最近の仕様変更で、VR系はすべて [VRTK]_VIVEに統合された**
        * スタンドアロンとPCVRの判断方法が一つ失われた。。。
* やり方がダメなだけかもしれないが、安定したやり方を確立したい


### 型変換は明示的にする必要がある
* STYLY上だとplaymakerの型変換(e.g. float->string、int->string)は明示的にAction使わないと動かない
* Unity上では動くんだけどなぁ。

### PCVRの時、コントローラにColliderが張られてない
 * 掴めないし殴れない、触れない。
 * 必要なら自分でPlayMakerでCollider張る必要がある。
Xserverで独自SSL設定をしたきにエラーがでたときの解決法

Xserverには独自SSLを設定使用としたときにエラーがでました。
下記にその時の解決法について記載したいと思います。

## まずはSSL設定をしてみる
xserverはドメインにSSlを簡単に設定できる機能があります。
サーバーパネルにログインし
ドメイン > SSL設定をクリックし、ドメイン選択画面からドメインを選択します。
ドメインを選択したらSSL設定画面が表示され独自SSL設定追加をクリックします。
設定対象ドメインをセレクトボタンから選択し、追加するボタンをクリックします。

ここで設定が完了し、一連の流れになります。

## エラーがでる
ところが
<img width="730" alt="スクリーンショット 2019-07-19 10.03.01.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163786/77997bda-a0c0-2be2-2a2b-c9aa7d0c3283.png">
のようなエラーがでます。

表示されているとおりにエラーが出る原因を調べてみましたが該当する箇所はどれも問題がありませんでした。

### .htaccessを疑ってみる
あと残っている可能性といえば.htaccessでhttpsに変換するように設定していたので一時的に外し、上記のSSLの設定の方に戻ってみます。

まだ、エラーはでていました。

### PCを変更してみる。
最後に疑ってみたののはキャッシュの問題、自身のPCではうまく行かなかったので違うPCから設定をしてみました。
するとうまくいきました。

## まとめ
- エラーがでたら該当の項目の設定をみなおしてみる。
- それでもだめなら.htaccessを一時的に外してみる。
- それでもだめならキャッシュを疑いキャッシュ削除、ブラウザ変更、PC変更などをし試してみる
MySQLで大文字と小文字を区別したい場合

## 解決策
照合順序に`utf8_general_bin`を指定する。
絵文字も使いたい場合は`utf8mb4_general_bin`を指定する。

## メモ書き
case sensitiveな`utf8_general_cs`および`utf8mb4_general_cs`があるかと思ったらありませんでした。


## 参考記事
以下の記事が参考になります。DBの照合順序について詳しく知りたい方はそちらもご覧ください。

[【MySQL】照合順序とは？](https://qiita.com/kazu56/items/6af85ffcf8d3954455ad)
&#160;&#160;[MySQL 5.7 セットアップ手順と関連情報](https://qiita.com/bezeklik/items/3fb55bfb9b7c3447f03f)
phpのsys_get_temp_dir()関数がmacのデフォルトだと変な位置になっててしかもpermissin errorという罠

#php で一時ファイルを一時ファイルディレクトリに作成して配置したいのにできない

ファイルを一時的に保存すべくphpの関数sys_get_temp_dirから取得したディレクトリにファイルをtouchしたら**Permission denied**


出力してもたら以下の場所でした。
Macでは見かけないフォルダなんですけどここにアクセス権を与えればいいんですが、/tmpという有名なテンポラリを使ったほうが消し忘れも防げるしいいとおもうんです。

```
/var/folders/49/w16_lxpn2qj_jp3fh1bjqxx00000gp/T
```

そこで、php.iniで設定できないか調べたら、設定項目が存在しません。
でも、ありました。

## sys_temp_dir

```
sys_temp_dir = /tmp
```

これをphp.iniに追加して再起動。これでOKです。
"pip install nagisa"でいろいろやった話

#"pip install nagisa" に失敗する

タイトル通り。早速入れようと意気込んでいたらコケた。

## 実行環境

申し訳ありません。記事を書いた当時この項目を書いていなかったため、Pythonやpip等のバージョンが把握できていません......。【追記：2019年9月21日】


##エラーその１
`Microsoft Visual C++ 14.0 is required.`

ググったら同じ現象の方が大勢いらっしゃるようで。
https://visualstudio.microsoft.com/ja/downloads/
の**Visual Studio 2019 のツール**から**Build Tools for Visual Studio 2019**をダウンロード。

起動して、一番左上の**C++ Build Tools**にチェックを入れる。
右側に詳細が出るので、デフォルトで入っているものの他に、**MSCV v140**にもチェックを入れる。(不必要なものも混じっているかもしれないがそこまで検証するモチベーションが無かった。)
![vc14_0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/393073/3c280de9-9f55-fab2-2d14-a52b9209dc55.png)

##エラーその２

`LINK : fatal error LNK1158: 'rc.exe' を実行できません。`
など。
こちらについてはQiitaの記事がありました。
[tslearnのpipインストールで&quot;LINK : fatal error LNK1158: &#39;rc.exe&#39; を実行できません。&quot;が出た時の対処 - Qiita](https://qiita.com/ruriohead/items/71c2d223c0a71020ea34)
の エラーと対処 の項目を実行します。

---

無事インストールできた。ﾖｶｯﾀ。
......今後新たなエラーが起きないことを祈りつつ。
Windowsネットワークドライブのパスをフルパスに変換する

Windowsネットワークドライブはすごく便利です。だが、文書かメールにそのファイルのパスをそのまま挿入すると、他人はそのファイルのパスが認識できませんよね。
このため、下記ツールを作ってデスクトップとかにおいて、ファイルをツールのアイコンにドラッグ＆ドロップしてから、使用箇所に貼り付けたらすみます。

```bash:toFullFN.bat
@echo off
if "%~1"=="" echo 使用方法： ファイルを「%~nx0」アイコンにドラッグ＆ドロップしてから、使用箇所に貼り付けてください。 & pause & goto :EOF
set netFileName=

:WORK
set net_path=%~d1
rem ######## get net path
for /f "skip=1 tokens=1*" %%i in ('net use %~d1') do (
    if "%%i"=="リモート名" set net_path=%%j
    goto COPY_PATH
)
:COPY_PATH
set netFileName=%netFileName%%net_path%%~pnx1

rem ######## goto NEXT
shift
if "%~1"=="" goto OUTPUT
set netFileName=%netFileName%/
goto WORK

:OUTPUT
echo %netFileName%|CLIP
```

※複数ファイルをドラッグ＆ドロップする場合、各ファイルパスを「/」で連結して出します。

:notes:
Rails6 のちょい足しな新機能を試す58（ActiveRecord::Errors#of_kind?編）

# はじめに

Rails 6 に追加されそうな新機能を試す第58段。 今回は、 `ActiveRecord::Errors#of_kind?` 編です。
Rails 6 に `ActiveRecord::Errors#of_kind?` メソッドが追加されました。

Ruby 2.6.3, Rails 6.0.0.rc1, PostgreSQL 10.7 で確認しました。Rails 6.0.0.rc1 は `gem install rails --prerelease` でインストールできます。

```shell
$ rails --version
Rails 6.0.0.rc1
```

# User モデルを作る

User モデルを作ります

```shell
$ bin/rails g model User name
```

# User モデルを修正する

validation を追加します。

```ruby:app/models/user.rb
class User < ApplicationRecord
  validates :name, presence: true
end
```

# rails console で確認する

`rails console` を実行して確認します。

```irb
irb(main):001:0> user = User.new
=> #<User id: nil, name: nil, created_at: nil, updated_at: nil>
irb(main):002:0> user.validate
=> false
irb(main):003:0> user.errors.of_kind?(:name)
=> false
irb(main):004:0> user.errors.of_kind?(:name, :blank)
=> true
irb(main):005:0> user.errors.of_kind?(:name, "can't be blank")
=> true
irb(main):006:0> user.errors.of_kind?(:name, :presence)
=> false
```

# 試したソース

試したソースは以下にあります。
https://github.com/suketa/rails6_0_0rc1/tree/try058_errors_of_kind


# 参考情報

* [What is new in Rails 6.0](https://bogdanvlviv.com/posts/ruby/rails/what-is-new-in-rails-6_0.html)
* [Add `ActiveModel::Errors#of_kind?`](https://github.com/rails/rails/pull/34866)
simple_formのcollection_radio_buttonsのinclude_hiddenオプション

simple_formのcollection_radio_buttonsで詰まったところがあったので記載。

## 環境
Rails 5.2.2
simple_form 4.1.0

## 詰まった時の状況
特定のレコードの状態の時に `collection_radio_buttons` で生成したradio buttonをdisableにしていた。
対象のカラムはint(modelでenum指定)でnot null

collection_radio_buttons で生成する際に

```
<input type="hidden" name="model_name[column_name]" value="">
```

も一緒に生成され、対応するカラムのparamがblankでpostされてしまった。

## 対応
`include_hidden: false` をオプションとして渡す

```
<%= f.collection_radio_buttons :column_name, ~~, include_hidden: false %>
```

Readme等に記載見当たらずなかなかたどり着けなかった。。。
【精度対決】MobileNet V3 vs V2

皆さん、エッジAIを使っていますか？

エッジAIといえば、MobileNet V2ですよね。
先日、後継機となる**MobileNet V3**が[論文発表](https://arxiv.org/abs/1905.02244?context=cs)されました。

世界中のエンジニアが、MobileNet V3のベンチマークを既に行っていますが、
自分でもベンチマークをしたくなりました。

本稿では、MobileNet V3のベンチマークをKerasで行いたいと思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264781/cc438c59-f680-4d16-cdfb-0fefa3624f40.png)
（図は論文より引用）
コード全体は[Github](https://github.com/shinmura0/MobileNetV3_vs_V2/blob/master/MobileNet_V3_vs_V2.ipynb)で公開しています。

#設定

##MobileNet V3
+ コードは[こちら](https://github.com/xiaochus/MobileNetV3)から拝借しています。
+ 重みは初期化された状態で学習します。
+ V3には```small```と```large```がありますが、ラズパイのCPUで動かすことを想定して```small```を採用しました。
+ $\alpha$の値によって、モデルサイズが変動します。$\alpha$は大きいほど精度が出ますが、速度は遅くなります。

##MobileNet V2
+ KerasにはV2が標準装備されており、これを使います。
+ 重みは学習済が用意されていますが、V3と同じく初期化された状態で学習します。
+ $\alpha$はV3と同じ仕様です。

##その他
+ データセットはcifar-10を使用します。
+ 実験はColaboratory（GPU）で実施しました。
+ バッチサイズは1024、エポックは100、最適化手法はAdam(lr=0.001)、DataAugmentationを使用。

#結果
##精度の比較
早速、気になる精度を見てみましょう。
下の図は各モデルを10回学習させたときの精度の結果です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264781/0eec2ac7-e8f6-242b-e713-384177bc25e4.png)

V2に対し、V3は精度も良く、ばらつきも少ないです。
V3の推論時間が速ければ、V3を使った方が良さそうです。

##推論時間の比較

Colaboratoryで1000回実行して中央値などを取り出そうとしましたが、Colaboratoryに
クセがあるのか、**実行する度に計測時間が変動しました。**（メモリや使用時間の影響？）

ただし、相対的な推論時間の関係は崩れなかったので、**相対比較**はある程度信用できそうです。
下の図は、各モデルを1000回実行させたときの推論時間の平均値です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264781/2f6ca163-e8eb-91e4-da35-0d66a38ff66c.png)

※**推論時間の数値**は信用しないでください。
※（）の値は$\alpha$の数値です。

きれいな右肩上がりになっており、V2(0.5)とV2(1)の差が大きい印象です。
また、$V2(1)\fallingdotseq V3(0.2)$となっていて、精度を考慮するとV3(0.2)を
採用する方が良いようです。

表にまとめます。

||速度|精度|
|---|---|---|
|V2(0.5)|**速い**|悪い|
|V3 small(0.2)|中|中|
|V3 small(0.5)|遅い|**良い**|


今のところ、V2(0.5)の代替品はV3で存在しないようです。

##学習時間の比較
前述のとおり、実行する度に計測時間が変わったため、ここでは計測できませんでした。
ただ、V2とV3でそこまで学習時間の差は生まれない印象です。

##重みのサイズの比較

||$\alpha$|重みのサイズ(MB)|
|---|---|---|
|MobileNet V2|0.5|3.3|
|MobileNet V2|1|9.5|
|**MobileNet V3 small**|0.2|**11.3**|
|**MobileNet V3 small**|0.5|**11.7**|

V2の方が圧倒的に軽い結果となりました。
また、V3の重みのサイズは、$\alpha$にあまり依存しないようです。

#転移学習について
実際に使うことを考えると、モデルをゼロから学習させることは稀だと思います。
通常は**転移学習を使いますが**、今のところ、Kerasで学習済の重み（V3）は公開され
ていません。しかし、Pytorchでは公開されています。

https://github.com/d-li14/mobilenetv3.pytorch

PytorchモデルをKerasやTensorFlow liteモデルへ変換する方法は、
以下の記事が参考になると思います。

https://qiita.com/lain21/items/9f9f9707ebad4bbc627d

皆さんも、どんどん転移学習しましょう。

#ラズパイで実行してみた
ラズパイでリアルタイム認識をしてみました。
コードは[こちら](https://github.com/shinmura0/MobileNetV3_vs_V2/blob/master/v3_32.py)。

+ 使用機器：Raspberry Pi3 model B
+ 外付けGPU：未使用
+ V3 smallの$\alpha=0.2$
+ 入力画像サイズ：32 x 32 x 3

![33tby-1m4wl.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264781/0cfc6c33-d1c1-d1a5-c58d-75b0bf9025ce.gif)


だいたい15～20FPSの速度が出ました。
この速度なら、リアルタイムの処理もできそうです。

ちなみに、入力サイズ：96 x 96 x 3だと、10FPSになりました。

#まとめ
+ MobileNet V3はV2の代替品になるわけではなく、**延長線上**という印象。すなわち、「V2よりも精度を出したいけど、多少処理速度が遅くなってもOK」というときに使うと良い。
+ ただ、V3であっても速度はそこまで遅くはならない。
+ 最終的には、入力画像サイズを小さくすればV3の速度は上がるため、チューニングすれば、「V2と速度は同じだけど**精度は上回る**」という可能性もあり得る。
NodejsでHTTPSクライアントの実装



```javascript




/**
 * nodejsで任意のサーバーにHTTPSでリクエストを行う
 *
 *
 */


// 各種モジュールの読み込み
var http = require("https");
var fs = require("fs");
var server= http.createServer();
var webclient = require("request");

webclient.post({
  url: "https://sample.com/index/login",
  headers: {
    "Access-Token": "senbiki_test"
  },
  body: JSON.stringify({foo: "bar"})
}, function (error, response, body){
  console.log(body);
});

var  options = {
    host: "your-origin.com",
    port: 443,
    method: "POST",
    path: "/api/something/v1/authenticate/login",
    headers: {
        "Access-Token": "my-uesr-test"
    }
};


var accessTokenSecret = null;
var request = http.request(options, function (response) {
    console.dir("~~~~")
    console.dir(response);
    for (var prop in response)
    {
        console.dir(prop)
    }
    console.dir(response.statusCode);
    console.dir(JSON.stringify(response.headers.Response.access_token_secret))
    response.setEncoding("UTF-8");
    response.on("data", function (chunk)
    {
        console.dir("Response: " + chunk);
    })

    response.on("end", function (chunk)
    {
        console.dir("Response End");
    })
})




request.write("");
request.on("error", function (e)
{
    console.dir("~~~~~~~");
    console.dir(e);
    console.dir("error: " + e.message)
})
request.end();

options = {
    host: "sample.com",
    port: 443,
    path: "",
    method: "get",
    headers: {
        "Access-Token-Secret": "任意のアクセストークン"
    }
}


server.on("request", function (request, response)
{
    // console.dir(request);
    // console.dir(response);
    response.writeHead(200, { "Content-Type": "text/html;charset=UTF-8" });
    response.write("マルチバイト文字列");
    response.end();
    var f = fs.readFileSync("./index.js", {encoding: "UTF-8"});
    // console.dir(f);
})
server.listen(3000);

```
Visual Studio CodeをWindowsにインストールしたら、最低限やっておきたい設定8個

Windows10にVSCodeをインストールしたするときの初期設定をご紹介します。
ベーシックな設定なので、開発言語や職種に関わらず、参考にしていただければうれしいです。

### 導入環境

VSCode: ver1.36
OS: Windows10

### 日本語化

まずはメニューを日本語化する。

1. Ctrl + Shift + X でサイドバーに"EXTENSIONS"を表示
1. 検索ボックスで「Japanese Language Pack」を検索しインストール
1. Ctrl + Shift + P でコマンドパレットに"config"を入力し、プルダウンに表示された"ja"を選択
1. 案内に従い、VSCodeを再起動すると、日本語化が完了

### Tabキーでスペースを入力

メニュー[ファイル]-[基本設定]-[設定]で
"Insert Spaces" にチェックを入れる。

スペースの数は、"Tab Size" で設定。

###　（半角）空白文字の表示

[ファイル]-[基本設定]-[設定]で
"Render Whitespace"で all に設定する。

### 行を画面幅で折り返す 

行を画面幅で折り返す（横スクロールを出さない）ようにしたい。

[ファイル]-[基本設定]-[設定]で
"Word Wrap" を on に変更する。

### ファイルタブ切り替えのショートカット変更

ファイルのタブ切り替えがデフォルトでは、

次のファイル：Ctrl + PageUp
前のファイル：Ctrl + PageDown

となっている。

これを次のように変更したい。

次のファイル：Ctrl + tab
前のファイル：Ctrl + shift + tab　

[ファイル]-[基本設定]-[キーボードショートカット]
メニュー右上にあるアイコン「｛｝」で、keybindings.jsonを開き、以下を追加する。

```keybindings.json
[
    {
        "key": "ctrl+tab",
        "command": "workbench.action.nextEditor"
    },
    {
        "key": "ctrl+shift+tab",
        "command": "workbench.action.previousEditor"
    }
]
```

### インデントのガイド線の表示切替

デフォルトでインデントのガイド線（タテの線）が表示されるが、これを非表示にしたい。

[ファイル]-[基本設定]-[設定]で
"Render Indent Guides"のチェックを外すと非表示になる。

### テーマ配色の変更

テーマの配色をカスタマイズしたい。

[ファイル]-[基本設定]-[設定]で
メニュー右上にあるアイコン「｛｝」で、settings.jsonを開き、設定を追加する。

以下例では、カーソル行の背景に色をつける、という場合。

```settings.json
"workbench.colorCustomizations": { 
        "editor.lineHighlightBackground": "#FFF0F5", //カーソル行に背景色
},
```

配色について公式リファレンス
https://code.visualstudio.com/api/references/theme-color


### 文字コードの自動判定

デフォルトでOFFとなっているのを、ONにする。

メニュー[ファイル]-[基本設定]-[設定]で
"Auto Guess Encoding" の有効にチェックを入れる。

以上になります。

#### 参考

https://qiita.com/HiroCh/items/481adfa969dbe689f566
https://qiita.com/ustakr/items/acad8dc12c166c2ad5e9
https://qiita.com/deren2525/items/6bc099ae8c05e3076055
https://www.off-soft.net/ja/software/develop2/visual-studio-code-preuse-settings.html
git commit時にerror: unable to start editor ''が出た時の対処法

# 環境
macOS: 10.14.4

# 事象
`git commit`
`git rebase -i HEAD~3`
などを行った際に下記エラーが発生。

```
hint: Waiting for your editor to close the file... error: cannot run : No such file or directory
error: unable to start editor ''
```
# 解決方法
.gitconfigの設定を修正することで解決。

# 手順
```
# .gitconfigの内容を確認
$ less ~/.gitconfig

# 設定変更（他のリポジトリでも使いたいのでグローバルで良いかと）
$ git config --global core.editor vi

# .gitconfigが変更されていることを確認
$ less ~/.gitconfig 
```
カスタムチェックボックスの作り方

1. もともとあるinputを隠す

```
input {
position:absolute;
height: 0px;
}
```

2. :checkedにさせるコンテンツの追加

```
input:checked ~ label::before {
content:"[x]";
}
```

※`~ `は兄弟

# サンプル

```
<style>
input[type=checkbox] {
position: absolute;
height: 0px;
}
input:not(:checked) ~ label::before {
content: "[-]";
}
input:checked ~ label::before {
content: "[x]";
}
</style>
<input type="checkbox" id="aaa-field"/>
<label for="aaa-field">aaa</label>
```
Ansibleのtemplateモジュールを使用してconfファイルを作る

Ansibleのtemplateモジュールを使ってsshd_configみたいなconfigファイルを作るスクリプトを見やすく書く方法。

###タスク内でvarsを定義

varsセクションはタスクの内部でも記述できることを利用して、templateモジュールの手前にパラメータ名: 設定値の組を列挙している。

こうやって書くと、confファイルごとに設定値が一望できて読みやすい。


```yaml:main.yml
  - name: MAKE SSHD_CONFIG
    vars:
        PermitRootLogin: "no"
        PasswordAuthentication: "no"
    template:
        src: sshd_config.j2
        dest: /etc/ssh/sshd_config

  - name: MAKE KDUMP.CONF
    vars:
        path: /var/crash
        default: reboot
    template:
        src: kdump.conf.j2
        dest: /etc/kdump.conf
```

confファイルは実機から抜き出してきて、変える必要のある部分をJinja2の変数にする。
変数名はパラメータ名と同じにするとよい。

```jinja:sshd_config.j2
# (省略)

PermitRootLogin　{{ PermitRootLogin }}
PasswordAuthentication {{ PasswordAuthentication }}

# (省略)
```

```jinja:kdump.conf.j2
# (省略)

path {{ path }}
default {{ default }}

# (省略)
```


confファイルの設定はlineinfileモジュールを使う手もあるが、これは気をつけて使わないとべき等性を失う可能性がある。
templateモジュールを使い、こうやってタスク内で変数を定義することで、確実にべき等性を保ちつつ、同時に可読性を高めることができる。


ネットを探してもこういう書き方をしている例を見つけられなかったので、あまり一般的な書き方ではないのかもしれません。
Could not find either the 'accEdit' component, 'accDisplay' component or both components in

https://trailhead.salesforce.com/ja/content/learn/modules/lightning_data_service/lightning_data_service_manipulate_records?trail_id=lex_dev

force:recordData を使用したレコードの操作

次のエラーが発生
Could not find either the 'accEdit' component, 'accDisplay' component or both components in

現状：
複数lighting record pageがあります。
対策：
Setup->Object Manager tab（Account）->lightning page->Lightning Record Pages 
使用されているページを保留し、その他のページを削除する。
macOS Mojave で RMagick gem を使う 2019年7月編

macOS を Mojave にアップグレードしたら `bundle install` で RMagick が入らないよ！
またかよ。
（OS アップグレードのたびに起きるあれの解決策。）

## 前提環境
`$ cc` を実行して command not found だったら、Xcode commndline をインストールする。
`$ xcode-select --install`

## 原因
Homebrew で ImageMagick v.7 が入ったのが原因。RMagick は v.7 非対応。（2019-07現在）
https://github.com/rmagick/rmagick/issues/256

```bash
$ brew uninstall imagemagick
$ brew install imagemagick@6
$ brew link imagemagick@6
$ gem install rmagick # (または bundle install)
```
QRコードを簡単に作成する方法（googleを利用します）

#背景
QRコードを作成したい。</br>
だけど良くわからないサイトが公開しているサービスを使うのはセキュリティ的に不安だ。</br>
QRコードの開発元であるDENSOのサイト(https://m.qrqrq.com/)を利用してもいいが、WEBサービスでは利用し難い。</br>
などなど色々思うことがあると思うので、より簡単にQRコードを作成する方法を記載します。

#QRコード作成方法
とりあえず、以下のリンクをクリック↓</br>
https://chart.googleapis.com/chart?cht=qr&chs=300x300&chl=https://developers.google.com/chart/infographics/docs/qr_codes?authuser=0&choe=UTF-8
クリックすると以下のQRコードが表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204260/48f80a54-1080-3288-5045-ae6fc36cb8f6.png)
このQRコードを読み込むと、GoogleのQRコード作成APIの仕様が書かれたページが表示されます。</br>
このページに書かれた通りにURLを作成すればQRコードが作成できますので簡単です。</br>
ですが、ページに飛ぶのも少し面倒なので、ちょっと解説します。

##URLの解説
https://chart.googleapis.com/chart?cht=qr&chs=300x300&chl=https://developers.google.com/chart/infographics/docs/qr_codes?authuser=0&choe=UTF-8
上記URLは、WEBの作成者であれば解説なしでも分かるかと思いますが、URLを読むよも面倒なので簡単に内容を記載します。

###「https://chart.googleapis.com/chart」について
これは、QRコードを作成するサイトのURLです。

###「?」について
「?」以降は、この条件でQRコードを作成してねという条件値です。

###「cht=qr」について
QRコードを作成してねという指示です。

###「&」について
まだ条件があるよという印です。

###「chs=300x300」について
縦：300、横：300のサイズのQRコードを作成してねという指示です。

###「chl=https://developers.google.com/chart/infographics/docs/qr_codes」について
QRコードに埋め込む値の指示です。
ここではURLになっていますが、「chl=私の名前は、あいうえおです。」とすれば、QRコードを読み込むと「私の名前は、あいうえおです。」と表示されます。

###「choe=UTF-8」について
これは文字コードの指示です。
文字コードはかなりプログラマーよりですので、基本この指示のままで良いかと思います。

#QRコード作成サイト
上記APIを利用したhtmlを作成しましたので以下にURLを記載します。
### GitHub Pages
https://koji-yamamoto-github.github.io/Create-QR-Code/

###GitHub
https://github.com/KOJI-YAMAMOTO-GitHub/Create-QR-Code/blob/master/index.html
【JavaScript修行】初めてのライブラリ:Moment.jsを使う環境を整えたい

日付指定で取得できるAPIを使ってあれこれやってたら
`Date`オブジェクトの面倒さにぶつかりました。

moment.jsを使うと簡単に日付加工ができる！
と聞いたのでやってみます。

##package.jsonってファイルがあった
人から頂いた環境で作業をしてて、まだまだ環境についてはからきしです。
https://qiita.com/dondoko-susumu/items/cf252bd6494412ed7847
これをみてpackage.jsonファイルについてだいたい掴んでおきました。
`--save`コマンドを打つとpackage.jsonにバージョンを記述してくれると。ふむふむ

##moment.jsインストール
```
 npm install --save moment
```

このコマンドでインストールできました。
でも。。
「package.json」「package-lock.json」の２つのファイルができてしまいました。

https://tsuyopon.xyz/2019/02/11/what-is-the-package-lock-json/
ここでpackage-lock.jsonについて学習。
なるほど、バージョンがガチッと固定されるんですね。

ところで日付といえば、お国によって色々dですよね。
分から書き始めるとことか、表記が特殊な物とかとかとか....
moment.jsには全部がマルっと入ってる。ということは、ファイルがめちゃくちゃ重いらしいです。
**日本のだけでいいのにー**
ということで、日本語以外の表記の排除に挑戦してみます。

##moment.jsの軽量化作戦
https://qiita.com/ksk1015/items/9ca85ec09dd74f70548e
これを見ると、プラグインで無視すればいいとか。プラグインって？
https://qiita.com/R-Yoshi/items/30282dee7b6d5ddd6622#ignoreplugin
ここの`IgnorePlugin`の項目がちょうどいい感じです。
そんなこともできるんですね。

webpack.configって何だろうか。。
というかそもそもwebpackについてよく知らないなあ。
ということで、[昨日ざっと勉強しました。](https://qiita.com/irico/items/753a68414537f1afba6b)


```javascript:IgnorePluginの構文
new webpack.IgnorePlugin(requestRegExp, [contextRegExp])
````

`requestPlugin`・・・作成したくないモジュール名を正規表現で記述
`contextRegExp`・・・対象とするディレクトリ（オプション）

```javascript
plugins: [
  new webpack.IgnorePlugin(/^\.\/locale$/, /moment$/)
],
```

ロケールのファイルをこれで除外できます。



##moment.js使ってみよう
https://www.yoheim.net/blog.php?q=20180201
ここをみつつ学習。

```javascript:momentjsの準備
const moment = require('moment');
//or
import moment from 'moment'
```
これをjsファイル内に記述することで使えるようになります。また、
日本のロケールを有効にするには

```javascript
import moment from 'moment'
import 'moment/locale/ja'

moment.locale('ja')
```
をjsファイル内に記述します。

```javascript
const moment = require('moment');
const thisYear = moment().year();
console.log(thisYear);   //2019
```

ちゃんと使えてますね！
デバッグ時だけログを吐き出す便利なラッパークラス

## 本記事を書く背景

QiitaでNSLogを使ったデバッグログの吐き方についての記事をみて、
本番ユーザさんにもNSLogだと参照される危険があるな〜と感じたので、
個人的に使っているデバッグ時にだけログを吐き出すログ用のラッパーを紹介します。

## 環境

* Xcode 10.2
* Swift 5.0


## 実装

プリプロセッサマクロを利用してDEBUGに設定しているスキームのときだけログを吐き出すようなメソッドとなっています。
`print`の部分はよしなに`NSLog`に差し替えても構いません。
通常エラーが発生してほしくない場合にログを吐き出す場合は`error`のメソッドを利用すると良いです。
発生した ファイル名、メソッド、行数を自動で吐き出します。

以下、テンプレとしてお使いいただければと思います。

```swift

struct Logger {
  
  /// デバッグ時だけログを吐き出すメソッド
  static func debug(_ item: Any) {
    #if DEBUG
    print(item)
    #endif
  }
  
  /// エラーパターンに埋め込むメソッド
  static func error(file: String = #file, function: String = #function, line: Int = #line, _ message: String = "") {
    #if DEBUG
    let consolLog = "file: \(file)\n function: \(function)\n line: \(line)\n message: \(message)\n"
    print(consolLog)
    #endif
  }
  
}
```

## 最後に

もっとこうした方がいいよ、間違えている箇所あるよ
等はご指摘いただけると助かります！
GIT:最後のpushの取り消し

# Gitの最後のプッシュを取り消す
## 準備
何かあった時に取り戻せるように、処理したいブランチをbackupすること

## 操作
```bash
git reset --hard HEAD^
git push -f origin master
```

#### 参考にした記事
http://www-creators.com/archives/2020#git_push