OmniAICreator/Qiita-1.07M huggingface dataset:
mount.cifsした共有フォルダへのrsyncでエラー: File exists (17)

そのうち解消されるのと，最近の環境では発生しなそうなので賞味期限短めです．

# 事象

UbuntuサーバでマウントしているWindowsの共有フォルダへのrsyncでエラーが発生．
2020年8月17日頃 (kernel更新後) から発生．

```bash
rsync: rename "/path/to/.file.XXXXXX" -> "file": File exists (17)
```

# 環境

- サーバ
    - Ubuntu 16.04.07
    - kernel: linux-image-4.4.0-187-generic
- リモート
    - Windows Server 2012

# 原因

[ここ](https://lists.samba.org/archive/samba-technical/2020-July/135581.html)にたどり着いた．

- rsync時の一時ファイルからの上書き時にエラー: File exists (17)
- mv A B のBが存在する場合の上書きに失敗: File exists
- SMB 1.0でのみ発生

というバグでした．

# 対処

mount.cifsがデフォルトでvers=1.0な環境だったので，vers=3.0を追加したところ解消．
最近のOSだとデフォルトは2.1とかになるみたいですね．
vers=1.0しか使えない環境では元に戻すか，修正を待ちましょう．
【GCPでWordPressインストール】

GCPインスタンスで久々にWordpressを構築しましたので初投稿記念にアップします。
＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝
【動作環境】
OS：CentOS 7.8
WEB：Apache 2.4.6
AP：PHP 7.3.21
DB：MariaDB 1.5.5
＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝

```SELinux無効化
◆SELinux無効化
sed -i -e "s/^SELINUX=enforcing$/SELINUX=disabled/g" /etc/selinux/config
setenforce 0

◆時刻合わせ
timedatectl set-timezone Asia/Tokyo

◆必要パッケージのインストール
yum -y install httpd mariadb-server mariadb-client wget

◆サービス自動起動設定
systemctl enable httpd
systemctl enable mariadb

◆Wordpressのインストール
cd /var/www/html
wget https://ja.wordpress.org/latest-ja.tar.gz
tar xvf latest-ja.tar.gz
chown -R apache:apache .

◆PHPのインストール 
#最初、通常のyumでインストールしたが、500エラーが表示され、かつログにも以下のエラーが吐かれていた。
#エラーメッセージ：PHP Parse error: syntax error, unexpected '. ', expecting '&amp;' or variable (T_VARIABLE) in /var/www/html/wordpress/wp-includes/functions.php
#よって以下のようにPHPをできるだけ最新バージョンにアップデートが必要
rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
yum -y install --disablerepo=* --enablerepo=epel,remi,remi-safe,remi-php73 php php-mysql

◆DBサービス起動
systemctl start mariadb
mysql -e "create database wordpress default character set utf8;"
mysql -e "GRANT ALL ON wordpress.* TO wordpress@localhost IDENTIFIED BY 'password';"
mysql -e "FLUSH PRIVILEGES;"

◆WEBサービス起動
systemctl start httpd
＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝
```
【Android】 intentについて

# 【Android】intentについて
- intentについては、散々こすられていますが、自分のまとめ的な意味も込めてまとめます。
  - [こちら](https://developer.android.com/guide/components/intents-common?hl=ja)(公式ドキュメント)を見ていただければ、正直解決するかと思います、

## intentについて
- intentは、大体において、**別のアクテビティに遷移するとき**または、**別のアプリを開く時**のどちらかで使われます。

- そして、それぞれ以下のように呼ばれます。
  - 別のアクテビティへの遷移 => 明示的intent
  - 別のアプリを開く => 暗黙的intent

## 明示的intentと暗黙的intent
### 明示的intent
- 別のActivityに遷移するときに使います。
  - 記述としては以下のような形

``` kotlin
val intent = Intent(今のActivity.this, 遷移先のActivity::class.java)
startActivity(intent)
```

### 暗黙的intent
- 別のアプリを開くときに使います。

- 記述例
  - 端末のカメラアプリを起動するとき

``` kotlin
val intent = Intent(MediaStore.ACTION_IMAGE_CAPTURE)
startActivityForResult(intent, RESULT_CAMERA)
```
テキストボックス入力時に値を毎回消さなくも良いようにする

# 実装する機能
Webサービスのフォーム入力画面を開発しているとき、以下の機能を実装したくて調べてみた。
テキストボックスに値が入っているとき、値を書き換える場合に、毎回入っている値を消さないといけない。
これがわずらわしいので、いちいち消さなくても良いようにしたい。
例えば以下のようなテーブルで各行に個数の入力欄があるとき。
![table.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241999/eb951163-c600-603f-d67e-b53ca6b25257.png)
個数欄の数値は0となっている。個数欄をクリックしたら、0の場合は0を自動的に消して、空欄にしたい。
すると、例えば値を2にしたいなら、2を1回入力するだけで済む。わざわざBackSpaceやDelを押して0を消す必要がない。
また、その後何も入力せずにカーソルが離れた場合は、もとのゼロの値に戻したい。
このような機能を、JavaScriptで実装する。
#実装した結果
以下の画像のような感じ。最初に1行目の個数欄をクリックしたら、0が自動的に消える。そこで2を入力する。
次に、2行目の個数をクリックしたら、同じく0が自動的に消える。
が、何も入力せずに3行目にカーソルを移したので、2行目は0の表示に戻る。
![focus_zero.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241999/9724dcb7-22c2-57ca-34a6-8856be33bb60.gif)

# コード
table要素やinput要素などhtmlやcssに特別な工夫はいらない。該当のinput要素がformタグ内にあり、typeがnumberだとする。
body内にonloadを書き、formタグ内にあるすべてのinput要素に対して、typeがnumberならば、onfocusとonblurを乗っける処理を行う。それにより、カーソルが当たったときにonfocusのメソッドが走るようになる。カーソルが外れたときにはonblurが走るようになる。input要素の0などの値（value属性）は、phpなりPythonなりサーバサイド側の言語で実装する。

```test.html
<html>
  <body>
    <form>
      <table>
        <tbody>
          <tr>
            <td>
            …（略）
              <input type="number" id="hoge1" name="hoge1">
            …（略）
            </td>
          </tr>
        </tbody>
      </table>
    </form>
    <script type="text/javascript">
      window.onload = function() {
        var obj = document.forms;
        if (!obj) return;
        for (var i = 0; i < obj.length; i++) {
          var ele = obj[i].elements;
          for (var j = 0; j < ele.length; j++) {
            // 乗っけたくない要素はここで除外する。
            if (ele[j].type != "number") continue;
            ele[j].onfocus = zero2Empty;
            ele[j].onblur = empty2Zero;
          }
        }
      }
      function zero2Empty() {
        if (this.value == 0) this.value = "";
      }
      function empty2Zero() {
        if (!this.value) this.value = 0;
      }
    </script>
  </body>
</html>
```

## 参考URL
[あんぽんたん](http://www9.plala.or.jp/oyoyon/index.html)様の以下の記事を参考にしました。ありがとうございました。
[表示されている文字を入力時に削除する](http://www9.plala.or.jp/oyoyon/html/script/field_clear.html)
OpenBSD 6.7 + MATE Desktop & Lumina Desktop インストール後の備忘録

1. isoファイルは、右のサーバーからダウンロード　 http://ftp.jaist.ac.jp/pub/OpenBSD/6.7/amd64/install67.iso
2. USBドライブでは起動しないので、CD-RWにイメージファイルを書き込んで起動させる。
3. インストール時は、X がDefault で起動するようにセットアップする。
4. Default の X Window System で firefox とか、chromium(起動時はchrome)がインストール＆起動できるので、以後は、ブラウザーから情報を確認する。
5. MATE関連ファイルは何を pkg_add して、どう設定するか？　ここに情報があります。　https://wiki.mate-desktop.org/#!pages/download.md
6. lumia デスクトップは、#pkg_add lumina を実行すればインストールできる。
7. 日本語入力は、#pkg_add scim-anthy　を実行してインストールする。日本語フォントは、noto-cjk をインストールしました。
8. .xinitrc は下記のとおり。

```ruby:.xinitrc
# japanese input
export LANG=ja_JP.UTF-8
export XMODIFIERS="@im=SCIM"
export QT_IM=xim
export GTK_IM=xim
scim -d

# MATEの場合は、下記をコメントアウト
# exec mate-session

# luminna desktopの場合は、下記をコメントアウト
exec start-lumina-desktop
```

Window Manager(slim) + Desktop Manager(MATE あるいは、Lumina)と区分けしてインストールできる。Xの起動は、.xinitrc に記述すればできるようになっている。libreoffice もインストールできるし、あとはネットワークサーバー(NAS)に保管されているメディアファイルの再生ができると嬉しいのですが。(根性出して自分でやらんかい！)　開発者の皆様、ありがとうございます。
【2020年8月】cool.io / pumaのインストールに失敗する場合

# 問題の概要
2020年8月現在、`puma` や `fluentd` に使われている `cool.io` のインストールに失敗することがある。

```
current directory: /Users/example/src/nature-server/vendor/bundle/ruby/2.6.0/gems/cool.io-1.6.0/ext/cool.io
make "DESTDIR=" clean
current directory: /Users/example/src/nature-server/vendor/bundle/ruby/2.6.0/gems/cool.io-1.6.0/ext/cool.io
make "DESTDIR="
compiling cool.io_ext.c
In file included from cool.io_ext.c:11:
In file included from ./cool.io.h:11:
/Users/example/.rbenv/versions/2.6.6/include/ruby-2.6.0/ruby/backward/rubyio.h:2:2: warning: use "ruby/io.h" instead of "rubyio.h" [-W#warnings]
#warning use "ruby/io.h" instead of "rubyio.h"
....
```

# 解決方法

`--with-cflags="-Wno-error=implicit-function-declaration"` を設定してあげることで解決する。
参考Issue：）[ctype.h missing from puma_http11.c](https://github.com/puma/puma/issues/2304)

bundleの場合は下記：

```
bundle config --local build.cool.io --with-cflags="-Wno-error=implicit-function-declaration"
bundle config --local build.puma --with-cflags="-Wno-error=implicit-function-declaration"
```

gemを直接インストールする場合は下記：

```
gem install fluentd -- --with-cflags="-Wno-error=implicit-function-declaration"
gem install puma -- --with-cflags="-Wno-error=implicit-function-declaration"
```
LaravelのEloquentモデルでupdated_atがないテーブルを使う方法

Eloquentモデルは作成時に自動でcreated_atとupdated_atを更新してくれるようになっているので、updated_atがないテーブルでデータを登録しようとすると、こんな感じで怒られる。

```
Illuminate\Database\QueryException
SQLSTATE[42S22]: Column not found: 1054 Unknown column 'updated_at' in 'field list' (SQL: insert into `positions` (`name`, `order_number`, `updated_at`, `created_at`) values (test, 17, 2020-08-22 07:58:07, 2020-08-22 07:58:07))
http://localhost/positions/create
```

updated_atテーブルがないテーブルで登録したい場合はデータクラスに以下を追加すると、created_atとupdated_atの更新を無効にできます。

```Positions.php
<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Position extends Model
{
    public $timestamps = false; // 追加
}
```
アナログメーターの読取りは、例題のMNISTで出来ます。


その1
https://qiita.com/bono0/items/bf9ec40d0f63d7a193b1

https://bono0.com/


アナログメーターの読取りをする際は、人工知能で予測する前の工程で　予測精度の大半は決まってしまいます。人工知能自体の調整で出来る事は限られています。まずは、適切な撮影が重要です。人に判断がつかない画像では、人工知能も判断がつきません。次は、画像の前処理です。特にアナログメーターの針の向きが重要ですので、画像処理には定評のある、畳み込みニューラルネットワーク（ＣＮＮ）と同様の前処理を行いましょう。手動で畳み込みを行うのか、人工知能に畳み込みをさせるかの違いだけです。

前処理によって　針の向きに合わせて強調したり消去したり、自由自在です。縦横斜めの畳み込みを前処理することで、人工知能の精度は格段に向上します。

![output03[1].png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237930/b4c3fae7-533f-2a03-93a5-ad714a661338.png)

![output02[1].png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237930/6b247628-7fa3-4f57-0221-c18fd2517ada.png)

![dx05[1].png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237930/a1f9e4b4-16bf-f2a1-43fd-8e5befe3adba.png)
VMwareでのブリッジ接続について

#VMwareでブリッジ接続しようとして失敗した話

一度はやってそうなので備忘録として書き残しておく

ブリッジ接続の設定はVMwareのマシンの設定で行う
ブリッジ接続を行うマシンを選択
![vm設定.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/493254/4981a637-e557-89ad-8839-bfe756c3d724.png)
すると赤丸の部分をクリックすることで詳細な設定を行うことができる
ネットワークアダプタを選択することでブリッジ接続を選択することができる
その際にアダプタの設定を1つだけチェックを入れることに<font color="Red">注意</font>する


しかし、マシンを起動するとうまく行かないことがある

そんなときはホストPCのネットワーク設定を<font color="RED">確認!!</font>

コントロールパネル>ネットワークトインターネット>>ネットワークと共有センター>アダプターの設定の変更
そこで各アダプタでVMware Bridge Protocolが自身が使用しているネットワーク以外で選択されえいないことを確認する

確認したあと仮想マシンを再起動するとうまくいくはず、、、
C# テキストファイル取り込み方法

C#を利用して、テキストファイルを読み込む必要があり使用した方法を記録しておきます。

目次
1.ファイル読み込みついて
2.例外の回避
3.まとめ

1.ファイル読み込みついて
C#でファイル読み込みを行うには、「StreamReader」クラスを使用します。
StreamReaderクラスには、①ファイルを一度に全て読み込む方法と、②１行ずつ読み込む方法があります。今回①の方法を使用したので②は割愛します。

①一度に全て読み込む方法
使用するメソッドは「ReadToEnd」メソッドを使用します。
StreamReaderクラスの使用方法としては、コンストラクタの第1引数に"読み込むファイルパス"、第2引数に文字コードを選択します。

```C#:EX.cs
 StreamReader sr = new StreamReader(
                "text.txt", Encoding.GetEncoding("Shift_JIS"));

            string text = sr.ReadToEnd();
```
text.txt（文字コードS-JIS）ファイルをReadToEndメソッドで読み込んでいます。ReadToEndメソッドはファイルの読み込みが終わったらCloseメソッドでファイルを閉じる必要があるので注意です。


2.例外の回避
ファイルを読み込む場合、読み込むファイルが存在しない場合に例外が発生する為、それを回避する為にExistsメソッドを使ってファイルのチェックをしてから読み込む必要があります。

```C#:EX.cs
            if (File.Exists(filePath))
            {
                StreamReader sr = new StreamReader(filePath, Encoding.GetEncoding("Shift_JIS"));
 
                string str = sr.ReadToEnd();
 
                sr.Close();
 
                Console.WriteLine(str);
            }
            else
            {
                Console.WriteLine("ファイルが存在しない");
            }
 
            Console.ReadKey();
        }
```

3.まとめ
ファイルを読み込む場面は何度も発生してくると思います。
ログチェックプログラムを作成する際に使用しました。
他にも汎用的で簡潔な方法があるかもしれませんでの、発見したらまた投稿します。
MySQLの権限変更

# はじめに

MySQLのユーザーを作成し、権限を全権限を与えていたのですが、後ほど、一部の権限のみに絞ることになりました。
そして、設定したはずが、全権限付与されたままでした。

# 設定方法

## 権限を削除する
まずは、下記のコマンドでデータベースユーザのアクセス権限を削除します。

```sh:権限の削除
REVOKE ALL ON database.* FROM 'hoge';
```

権限が正常に削除されているかを確認

```sh:権限削除の確認
SHOW GRANTS for 'hoge';
```

## 権限を付与

下記のコマンドで正しい権限を付与します。

```sh:正しい権限の付与
GRANT SELECT ON database.* TO 'hoge';
```
上記の例では、`SELECT`の権限のみを付与しています。

## 付与結果の確認

```sh:付与できているか確認
SHOW GRANTS for 'hoge';
```

下記のような内容が表示されていたら、正常に設定されています。

```sh:設定完了時の内容
+------------------------------------------------------------+
| Grants for metabase_ec2@%                                  |
+------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'hoge'@'%'                           |
| GRANT SELECT ON `database`.* TO 'hoge'@'%'                 |
+------------------------------------------------------------+
```

# まとめ

権限を変更する際は、一度、削除した後に、正しいものを付与する事を覚えておかないと、いつか大問題を引き起こしそうで怖いです。
また、権限の操作を行ったあとは、しっかりと設定できているかを確認するべきですね。

もっと、データベースと仲良くなりたいと思おうので、さらに、戯れていきたいと思います(^○^)
FitbitアプリをRunさせる最低限の構成

- 2020/8/22 作成

# まえがき
Javascriptを書いたこともアプリ開発をしたこともなかったため、そもそもアプリをシュミレーターにアップロードするのにも時間がかかってしまった。
そこで、最低限これさえ書いておけばアップロードはできるという構成についてメモを残す。
Fitbit Studioの利用を前提としている。

# 参考文献
- [開発初心者でもできるFitbit Clock Faceの作り方 - Qiita](https://qiita.com/MsSsht03/items/d69b46c1940822ec534b)　<br>必須のフォルダ構成や開発開始手順、シュミレーターの使用方法について言及されている。
- [公式Reference](https://dev.fitbit.com/build/reference/)

#この記事のすべて
```javascript:/app/index.js
console.log("");
```

```html:/resources/index.gui
<svg>
</svg>
```

```html:/resources/widgets.gui
<svg>
</svg>
```
これらに加えて、`package.json`があればアプリをアップロードできる。
できたアプリはただただ真っ暗な画面を表示するだけである。


# /app
## index.js
***必須***。
アプリの挙動を書く。
何も動かすつもりがない（画面を表示させるだけ）のときはとりあえず下のコードを入れておけば怒られない。

```javascript
console.log("");
```

# /resources
## index.gui
***必須。***
アプリに表示させる要素を入れる。
これが空ファイルになることはないはず。
公式の[SVG Guide](https://dev.fitbit.com/build/guides/user-interface/svg/)とにらめっこして頑張る。

もし何も表示させるつもりがないなら、最低限以下のコードを入れておけば怒られない。

```html
<svg>
</svg>
```

## widgets.gui
***必須。***
CSSを使用したり、公式の[SVG Components Guide](https://dev.fitbit.com/build/guides/user-interface/svg-components/)にあるコンポーネントをインポートしたりするときに情報を入れるファイル。
CSSやコンポーネントを使わないなら、最低限以下のコードを入れておけば怒られない。

```html
<svg>
</svg>
```

## icon.png
アプリのアイコンの画像（80x80 pixel）。Fitbit studioにドラッグアンドドロップでアップロードできる。
ファイルが存在しないと、Runしたときに`Error -1 Invalid path '/system/apps/19/assets/resources/icon.png'`と怒られる。
でもアップロードできるので必須ではない。

#package.json
***必須。***
アプリの設定等。
Display Nameを入力し、TypeやBuild Targets、SDK Versionの設定を間違えなければ大丈夫だと思う。

#あとがき
間違い等があればご指摘いただければ幸いです。
拙い記事ですが最後まで読んでいただきありがとうございました。
「Alexa,お水あげて」でベランダの植物に水をあげる

#概要
ベランダにあるプランターの水やりを、ボイスコマンド「Alexa,お水あげて」で行えるようにしました。
・Amazon Smart Plug
・お風呂ポンプ
を組み合わせて構築しています。
<img width="2000" alt="水やり概要" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/181708/2f222d50-164a-478a-da78-8778966561e8.png">
#Alexaの設定
定型アクションで
　ON→1分待つ→OFF
の3行を登録します。
<img width="400" alt="Alexa設定" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/181708/6d96edbc-c03e-2322-5ab4-91319d62735d.png">
#応用
同様に定型アクションでタイマーを使えば
 7時30分に起動→1分待機→OFF
といった感じに制御できます。
<img width="400" alt="Alexa設定" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/181708/e7022fbe-a47c-0452-eedf-94ae43e7b274.png">


#使用したアイテム
[１．Amazon Smart Plug　1980円](https://www.amazon.co.jp/gp/product/B07V1PZFXY/ref=ppx_od_dt_b_asin_title_s00?ie=UTF8&psc=1)
[２．お風呂ポンプ　1398円](https://www.amazon.co.jp/%E3%83%9F%E3%83%84%E3%82%AE%E3%83%AD%E3%83%B3-%E7%AF%80%E6%B0%B4%E3%83%90%E3%82%B9%E3%83%9D%E3%83%B3%E3%83%97-%E6%B9%AF%E3%83%9D%E3%83%9D%E3%83%B310-%E3%83%9D%E3%83%B3%E3%83%97%CF%866-3%C3%9712-1cm-BP-42/dp/B000CPZ8ZA/ref=sr_1_5?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&dchild=1&keywords=%E3%81%8A%E9%A2%A8%E5%91%82+%E3%83%9D%E3%83%B3%E3%83%97&qid=1598079236&sr=8-5)
【Flutter】Android studio でエミュレータが見つからない場合の対処法

## 事象
エミュレータは起動されているのに、'Loading...'の表示が消えず、Buildできない自体が発生。

エラーの内容は以下。

```
emulator: ERROR: Running multiple emulators with the same AVD is an experimental feature. Please use -read-only flag to enable this feature.
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261934/03ab8a6f-a625-b6cb-a7fe-779df917f0cc.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261934/8c2e6576-ebcb-824f-bf4d-64c259de15cc.png)

## 解決方法
ユーザのルートディレクトリ直下の'.android/avd/{端末名}.avd'ディレクトリの以下の3つのファイルを削除します。

```
cache.img
hardware-qemu.ini.lock
multiinstance.lock
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261934/4e609982-d274-ee89-d3d6-d0c4f1ebaf25.png)

## 参考文献
- [ERROR: Running multiple emulators with the same AVD is an experimental feature for ubuntu in android Studio?](https://stackoverflow.com/questions/59682287/error-running-multiple-emulators-with-the-same-avd-is-an-experimental-feature-f)
windowsでiverilog その69

#概要　

windowsでiverilogやってみた。
16bitのcpu書いてみた。

#cpu仕様

レジスタマシン
16bit CPU（汎用レジスタが16bit8本）
マシン語は16bit固定長
命令は、ロード、ストア、代入、加算、減算、xor、大きい、小さいの11種類
命令に4bit、レジスタ指定に3bit、8bitを値に

|15:12|11|10:8|7:0|
|:--|:--|:--|:--|
|命令|フラグ|レジスタ|値|

レジスタは3bitなので8コ、最後レジスタをプログラムカウンタr7
条件判定用のフラグはゼロフラグだけ、フラグによるスキップ
出力はメモリにマッピング（RAMは16bit x 32word、最後の32番目を出力に接続）

#アセンブラの説明

```
r2 9   //r2に9を代入。
r1 0   //r1に０を代入。
r1 + 1 //ｒ１をインクリメント。
out r1 //ｒ１を出力。
r2 - 1 //ｒ２をデクリメント。
jz 2   //ゼロならアドレス2へジャンプ。
jp 6   //アドレス６へジャンプ。
```

#サンプルコード

```

module cpu16(input clk, input rst, output [7:0] outport);
	reg [15:0] r[7:0];
	reg [15:0] mem[31:0];
	reg zeroflg;
	wire [15:0] code;
	wire skipflgz;
	wire [3:0] op;
	wire [2:0] rega;
	wire [7:0] opland;
	assign code = mem[r[7]];
	assign op = code[15:12];
	assign skipflgz = code[11];
	assign rega = code[10:8];
	assign opland = code[7:0];
	assign outport = mem[31][7:0];
	task init_blink;
	begin
		mem[0] <= 16'h02_09; //r2 9
		mem[1] <= 16'h01_00; //r1 0
		mem[2] <= 16'h31_01; //r1 + 1
		mem[3] <= 16'h21_1f; //out
		mem[4] <= 16'h52_01; //r2 - 1
		mem[5] <= 16'h0f_02; //jz 2
		mem[6] <= 16'h07_06; //jp 6
	end
	endtask
	task init_reg;
	begin
		r[0] <= 16'h0;
		r[1] <= 16'h0;
		r[2] <= 16'h0;
		r[3] <= 16'h0;
		r[4] <= 16'h0;
		r[5] <= 16'h0;
		r[6] <= 16'h0;
		r[7] <= 16'h0;
		zeroflg = 1'b0;
	end
	endtask
	always @(posedge clk, negedge rst)
	begin
		if (!rst)
		begin
			init_blink;
			init_reg;
		end
		else
		begin
			if (skipflgz && zeroflg)
				r[7] <= r[7] + 1;
			else
			begin
				case (op)
				4'h0://let
					r[rega] <= opland;
				4'h1:// load mn
					r[rega] <= mem[opland];
				4'h2:// save mn
					mem[opland] <= r[rega];
				4'h3:// + n
					r[rega] <= r[rega] + opland;
				4'h4:// a + b
					r[rega] <= r[rega] + r[opland];
				4'h5:// - n
				begin
					r[rega] <= r[rega] - opland;
					zeroflg <= r[rega] == 0;
				end
				4'h6:// < n
				begin
					r[rega] <= r[rega] < opland;
					zeroflg <= r[rega] == 0;
				end
				4'h7:// > n
				begin
					r[rega] <= r[rega] > opland;
					zeroflg <= r[rega] == 0;
				end
				4'h8:// xor
					r[rega] <= r[rega] ^ r[opland];
				4'h9:// load mb
					r[rega] <= mem[r[opland]];
				4'ha:// save mb
					mem[r[opland]] <= r[rega];
				endcase
				if (rega != 7)
					r[7] <= r[7] + 1;
			end
		end
	end
	initial
	begin
		$monitor("%d", outport);
	end
endmodule

module test2(input clk, input rst, output led2);
	wire [7:0] outport;
	assign led2 = outport[0];
	cpu16 t(.clk(clk), .rst(rst), .outport(outport));
endmodule

module test;
	reg clk,
		rst;
	test2 t(.clk(clk), .rst(rst), .led2(led2));
	initial
	begin
		//$monitor("%d", led2);
		clk = 0;
		rst = 1;
		#2
			rst = 0;
		#2
			rst = 1;
		#900
			$finish;
	end
	always
		#1
			clk = ~clk;
	initial
	begin
		$dumpfile("test.vcd");
		$dumpvars(0, test);
	end
endmodule



```

#実行結果


```

VCD info: dumpfile test.vcd opened for output.
  x
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10


```

以上。
Laravel エラーメッセージを表示させよう

## ユーザー登録時はエラーメッセージを表示させる

`resources/views`ディレクトリに`error_card_list.blade.php`を作成して、
以下の内容に編集します。

```
@if ($errors->any())
  <div class="card-text text-left alert alert-danger">
    <ul class="mb-0">
      @foreach($errors->all() as $error)
        <li>{{ $error }}</li>
      @endforeach
    </ul>
  </div>
@endif
```

Laravelでは、Bladeの中で$errors変数を使えます。

[バリデーションエラー表示 - Laravel公式](https://readouble.com/laravel/6.x/ja/validation.html#quick-displaying-the-validation-errors)

$errors変数は、Illuminate\Support\MessageBagクラスのインスタンスであり、バリデーションエラーメッセージを配列で持っています。

以下のコードでは、MessageBagクラスのanyメソッドを使っていますが、これはエラーメッセージの有無を返します。

```
@if ($errors->any())
```

そして、エラーメッセージが1件以上ある場合は、MessageBagクラスのallメソッドで全エラーメッセージの配列を取得し、@foreachで繰り返し表示を行なっています。

```
@foreach($errors->all() as $error)
  <li>{{ $error }}</li>
@endforeach
```

## バリデーションエラーメッセージの日本語化

バリデーションエラーメッセージが表示されるようになりましたが、英語です。

これを日本語で表示するようにします。

まず、`laravel/resources/lang`ディレクトリに`ja`ディレクトリを作成し、そこに`validation.php`を作成してください。

```
.
└──laravel
    └── resources
        └── lang
            └── ja
                └── validation.php
```

そして、`validation.php`に対して、

[validation.php言語ファイル - Laravel公式](https://readouble.com/laravel/6.x/ja/validation-php.html)

の、以下が言語ファイルの内容です。と書かれているところから下のPHPコードの内容をそのままコピペしてください。

Laravelは標準では、日本語のバリデーションエラーメッセージが用意されておらず、今回は有志の方が作成した日本語ファイルを利用させてもらうことにします。

次に`laravel/config/app.php`を以下の通り編集します。

```
 'locale' => 'ja',
```

## 項目名の日本語化

```
<?php

return [
    
    // 略
    
    /*
    |--------------------------------------------------------------------------
    | カスタムバリデーション属性名
    |--------------------------------------------------------------------------
    |
    | 以下の言語行は、例えば"email"の代わりに「メールアドレス」のように、
    | 読み手にフレンドリーな表現でプレースホルダーを置き換えるために指定する
    | 言語行です。これはメッセージをよりきれいに表示するために役に立ちます。
    |
    */
    
    //==========ここから削除==========
    'attributes' => [],
    //==========ここまで削除==========

    //==========ここから追加==========
    'attributes' => [
        'name' => 'ユーザー名',
        'email' => 'メールアドレス',
        'password' => 'パスワード',
    ],
    //==========ここまで追加==========

];
```

上記のようにattributesの値に、連想配列で項目名とその別名を定義することができます。

この別名を日本語にすることで、バリデーションエラーメッセージでの項目名を日本語化できます。

改めて、エラーになる条件を満たすような内容でユーザー登録をしてみてください。

以上です:relaxed:
動的なタイトルの実装

備忘録です！

デフォルトではタイトルがどのページでもsanpleappと固定されています。

```ruby:applicaton.html.erb
<head>
  <title>sampleapp</title>
</head>
```

今回は、ページごとにタイトルを動的に変更していきます。

例）ログインページ・・・ログイン｜sampleapp

```ruby:application.html.erb
<head>
  <title><% content_for?(:title) ? yield(:title) + ' | sampleapp' : 'sampleapp' %> </title>
</head>
```
各テンプレート間で異なる情報をレイアウトファイルに伝えたい場合にcontent_forを用います。
content_forを用い、三項演算子で、titleがある場合は、タイトル｜sampleappとなり、titleがない時は、sampleappを表示されるようになります。

```ruby:user_sessions/new.html.erb
<% content_for(:title, 'ログイン') %>
```
とする。

これで、ログインページでは、ログイン｜sampleappとタイトルが表示される。
【Unity】Text Mesh Proで文字化けする(□になる)箇所を見つける方法

# TextMeshProで表示できない文字がある
TextMeshProはデフォルトで日本語に対応していないため、各々で日本語フォントからアセットを作成する必要があります。
日本語を表示させるには[UnityのText Mesh Proでほぼ全ての日本語を表示させる](https://qiita.com/kgsi/items/08a1c78b3bee71136156) の手順通りで大体は問題ありません。
ただ、仕様上「必要な文字をフォントアセットに追加している」に過ぎないため、非対応の文字が後々になって見つかる可能性はあります。

# 文字化けを見つけて直して…
テキストをTextMeshProコンポーネントに設定するところまでは問題ありません。
問題は設定されたフォントアセットによって文字が表示されるか否かが分かれるという点です。

![0.CheckUndefine.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96676/7c11d8b1-2f12-2c62-cb3a-fee93b0d0972.jpeg)

__テキストとフォントアセットを設定して、文字化けしている箇所を目で見て探し該当の文字を追加していく！__
このやり方だと大量のテキストだけ用意されている状態であれば時間が掛かります。見落す危険もあります。

1. `口`　カタカナの「ろ」
2. `ロ`　漢字の「くち」
3. `□`　 記号の「しかく」←コレ

# 文字化けだけ見つけたい
そもそもの話、Text Mesh Proは**未対応の文字は□で表示している**わけです。
つまり処理的に『未対応の文字を見つける』ことはできるわけなんです。

__大量の文字列に疲弊した人間__が目で見て探す必要はないんです………。

# 文字化けを見つける

見つける方法は、TextMeshProのメンバ変数にある`TMP_FontAsset font`を使用します。
これはTextMeshProコンポーネントに設定されているフォントアセットを示す変数です。
TMP_FontAssetクラスの**HasCahracters**関数にテキストを渡すことで未対応の文字が返ってきます。

``` .cs
    // 対象のTextMeshProと見つからない文字
    var tmp = GetComponent<TextMeshProUGUI>();
    var missingCharacters = new List<char>();

    // TMP_FontAssetに見つからない文字があれば
    if (!tmp.font.HasCharacters(tmp.text, out missingCharacters))
    {
        // missingCharactersに非対応の文字が格納される
        foreach (var character in missingCharacters)
        {
            Debug.Log(character);
        }
    }
```

![1.MissingCharacters.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96676/37ef6d6a-4543-b5d8-f8a8-1894192bf50f.jpeg)

# 最後に
__ログファイルに出力すれば完璧です。__

文字化けを見つけたタイミングでエディターを確認できればいいのですが、そうでない場合（例えばビルドしたものをデバッガーに配布する際など）には

>文字化けしてたんですけど、どの文字が表示できていないのか分からないんです…

みたいなことを言われて、大量のテキストデータを漁るという~~不毛な~~作業が必要になります。
ログファイルには『文字化けしている文章（行）』と『文字化けした未対応の文字』を出力するといいでしょう。
All same hash code string in Java

All same hash code string in Java

```java
final String p1 = "AaBB";
final String p2 = "BBAa";
final String p3 = "BBBB";
final String[] pp = new String[] { p1, p2, p3 };
final int ppLength = pp.length;
Random random = new Random();
random.setSeed(System.currentTimeMillis());
final int size = 10;
final int length = size * 4;
final int times = 2_000_000; // n百万回ループ
Map<String, String> map = new HashMap<>(10000);
File file = new File("r:/1.txt");
file.delete();
BufferedWriter bw = new BufferedWriter( //
    new OutputStreamWriter( //
            new FileOutputStream(file, true) // append
            , Charset.forName("UTF-8") // charset
    ) //
    , 1024 // buffer size
);
StringBuffer sb = new StringBuffer(length);
for (int ii = 0; ii < size; ii++) {
    sb.append(pp[random.nextInt(ppLength)]);
}
final int hashCode = sb.toString().hashCode();
sb.setLength(0);
for (int count = 0; count < times; count++) {
    for (int ii = 0; ii < size; ii++) {
        sb.append(pp[random.nextInt(ppLength)]);
    }
    String ss = sb.toString();
    if (!map.containsKey(ss)) {
        if (ss.hashCode() != hashCode) {
            bw.flush();
            bw.close();
            throw new RuntimeException("hashCode not equal");
        }
        map.put(ss, ss);
        bw.append(ss);
        bw.newLine();
    }
    sb.setLength(0);
}
System.out.println(map.size());
bw.flush();
bw.close();
```

参考サイト：
[https://stackoverflow.com/questions/8669946/application-vulnerability-due-to-non-random-hash-functions](https://stackoverflow.com/questions/8669946/application-vulnerability-due-to-non-random-hash-functions)
【Unity】対象を追跡する

```
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

// ずっと、追いかける
public class Forever_Chase : MonoBehaviour
{
	public string targetObjectName;   // 目標オブジェクト名
	public float speed = 1; // スピード：Inspectorで指定
	GameObject targetObject;

	void Start () // 最初に、目標オブジェクトを見つけておく
	{
		targetObject = GameObject.Find(targetObjectName);
	}

	private void FixedUpdate() // ずっと、目標オブジェクトの方向を調べて
	{
		Vector3 dir = (targetObject.transform.position - this.transform.position).normalized;
		// その方向へ指定した量で進む
		float vx = dir.x * speed;
		float vz = dir.z * speed;
		this.transform.Translate(vx / 50, 0,  vz / 50);
	}
}
```
まず下記で、追跡する対象の方向を求める
Vector3 dir = (targetObject.transform.position - this.transform.position).normalized;

そのあと、求めたx軸とz軸方向に、速度の値をかける。

![ezgif.com-video-to-gif (2).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/685271/38e663bd-aa09-9a02-10b8-b8146cd30673.gif)
【Azure】VMのコア数上限（クォータ）を引き上げる方法

#　はじめに
Azureで、vCPU数が多いVMを作成しようとしたとき、以下の図のような「クォータの不足」のエラーで作成できない時は、クォータの引き上げを依頼しましょう。

![Azure00quota.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/181466/27cb5cf9-1e99-3d5d-bce0-ea45bb72b258.png)

Azureでは、VMのサイズファミリー毎に、既定のvCPU上限値が存在します。この上限値を引き上げることで、vCPUの多いVMを作成できるようになります。


この記事は、以下のブログ記事を編集した記事になります、
https://tagfa.wpx.jp/archives/338

# クォータの引き上げ
まず、VMを作成したいサブスクリプションのページから「使用量＋クォータ」を開き、「クォータの引き上げを要求」を選択。
![Azure01.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/181466/1dd0a071-0147-ac4e-07be-649da58a492c.png)


次のページでは、「問題の種類」、「サブスクリプション」はデフォルトのまま。

「クォータの種類」は「コンピューティング-VM(コア-vCPU)の。。。」を選択し、次へをクリック。
![Azure02.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/181466/9156ceb9-4f47-59a1-28c6-e275111557e0.png)

このページでは、要求の詳細を入力。（次の画像参照）
「サポート方法」の連絡方法はメールを選択（電話でも大丈夫ですが、面倒なのでメールのほうが吉）。
サポート言語は日本語。
連絡先情報はご自身の連絡先を入力してください。（デフォルトのままでOK）

![Azure03_LI (2).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/181466/b39126d8-91db-e1ac-be99-cc8247156ada.jpeg)

要求の詳細の詳細の入力では、次のように入力します。
デプロイモデルは「リソースマネージャー」で問題ありません。「クラシック」は2015年頃まで使われていたデプロイ方法で、現在は原則使いません。
画像で「NVSv3 Series」となっているところは、ご自身で使いたいサイズファミリーを選択してください。今回は、ゲームなどに最適化されたGPU付きサイズ「NVSv3 Series」としています。
![Azure04.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/181466/1c01dc5a-c153-c0d3-6f90-5bc595230566.png)


次のページで、作成ボタンをクリックし、引き上げリクエストを依頼します。
依頼をすると、依頼しましたというメールが届き、依頼が承認されると、承認しましたメールが届きます。自分の場合は２分程度で承認されました。（早い。。。）

# おわりに
これでvCPU数の多いVMを作成できるようになります。
【Ruby】ランダムなアルファベット文字列を生成する方法

# はじめに
・キャッチアップした知識の備忘録です。
・間違い等あればご指摘いただけますと幸いです。

# 今回のキーワード
・`to_a`メソッド
>ハッシュ、範囲オブジェクトなどを配列に変換するメソッドです。
引用元：[【Ruby】to_aメソッドの使い方を理解しよう](https://pikawaka.com/ruby/to_a)

・`shuffle`メソッド
>shuffleメソッドは配列の要素をランダムに入れ替えて取得します。
引用元：[はじめてのRuby！配列をランダムに取得・入れ替え｜sample・shuffle](https://www.sejuku.net/blog/72965)

・`join`メソッド
>配列の要素を結合して一つの文字列としたい場合にjoinメソッドが使われます。joinメソッドは、配列の各要素を文字列に変換し、引数を区切り文字として結合します。
引用元：[Rubyのjoinメソッドの使い方を現役エンジニアが解説【初心者向け】](https://techacademy.jp/magazine/19903)

# 結論：このように書きます
```ruby
('a'..'z').to_a.shuffle[0..7].join
```

試しにターミナルでコマンドを実行してみます。
`irb`と入力してからコマンド入力してください。

```terminal:ターミナル
munetomokazushi@mba ~ % irb
irb(main):001:0> ('a'..'z').to_a.shuffle[0..7].join
=> "yahxwgti"
```

8文字のランダムなアルファベットが出力されました。
# 詳しく見ていきます
分解します。

```ruby
irb(main):001:0> ('a'..'z')
```

まず、アルファベットの文字列`'a'`から`'z'`までの範囲であることを記述します。
`..`はRangeオブジェクトです。`..`なら最後の文字も含みますが、`...`なら最後の文字を含みません。注意。

```ruby
irb(main):001:0> ('a'..'z').to_a
=> ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"]
```
.to_aメソッドで配列になりました。

```ruby
irb(main):001:0> ('a'..'z').to_a.shuffle
=> ["o", "c", "q", "i", "m", "a", "k", "l", "t", "x", "z", "w", "n", "v", "b", "s", "h", "u", "r", "e", "g", "y", "f", "j", "p", "d"]
```
shuffleメソッドで配列がシャッフルされました。（実行するたびにシャッフルされます）

```ruby
irb(main):001:0> ('a'..'z').to_a.shuffle[0..7]
=> ["r", "f", "b", "x", "y", "m", "g", "t"]
```
配列をシャッフルしたものを、最初から8文字分取得しています。
配列は0からスタートすることに注意。

```ruby
irb(main):001:0> ('a'..'z').to_a.shuffle[0..7].join
=> "yahxwgti"
```
最後にjoinメソッドで配列の要素を結合してひとつの文字列にしました。

### 2020.8.24追記
コメントをいただいたので引用して追記させてください。
@nodai2h_ITCさま、ありがとうございます！
>この方法では、「agrjesao」のような同じ文字が2回以上出てくる文字列が生成されません。たとえばじゃんけん三番勝負のプログラムを書くとして、一度出した手を出さないようなプログラムを書いたら「ランダムな手」とは言わないのではないでしょうか。
それに、この方法ではアルファベット文字数を超える例えば30文字のランダムなアルファベット文字列を作ることができません。
というわけで、同じ文字を許可した「ランダムなアルファベット文字列」を生成する方法としては、こんな感じでどうでしょうか。

```ruby
chars = ('a'..'z').to_a # = *'a'..'z' でも可
8.times.map{ chars.sample }.join
```
この結果はこんな感じです。

```ruby
irb(main):009:0> chars = ('a'..'z').to_a
=> ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"]
irb(main):010:0> 8.times.map{ chars.sample }.join
=> "bjtaniyw"
irb(main):011:0> 8.times.map{ chars.sample }.join
=> "ntbtrdml"
irb(main):012:0> 8.times.map{ chars.sample }.join
=> "ajsgpcwn"
irb(main):013:0> 8.times.map{ chars.sample }.join
=> "vxdgakuc"
irb(main):014:0> 8.times.map{ chars.sample }.join
=> "xknqtmcq" # 同じアルファベットが2回出ています。ちゃんとランダムに表示されています
```

# ランダムな文字列を生成するメソッドを定義してみる
```ruby
# string_shuffleメソッドを定義
def string_shuffle(s)
  s.split('').shuffle.join
end

# 呼び出してみる
string_shuffle("foobar")
# string_shuffleメソッドを呼び出した結果
=> "fboora" 
```

# ちなみに
```ruby
irb(main):005:0> ('あ'..'ん').to_a.shuffle[0..7].join
=> "ごふくぽれかりそ"
```
ひらがなでもできます。

# まとめ
・ランダムなサブドメインを作る時などにも活用できますね。
・コンソールで実行する場合は`rails c`とターミナルで入力してコンソールを起動してください。

# 参考
[【Ruby】to_aメソッドの使い方を理解しよう](https://pikawaka.com/ruby/to_a)
[はじめてのRuby！配列をランダムに取得・入れ替え｜sample・shuffle](https://www.sejuku.net/blog/72965)
[Rubyのjoinメソッドの使い方を現役エンジニアが解説【初心者向け】](https://techacademy.jp/magazine/19903)
【Ruby】ハッシュのバリューだけ、キーだけを取り出したい

プログラミング学習中で、これはメモしたいと思ったものを、自分用に分かりやすく残しておきます。

## ハッシュのキーだけを取り出したい

以下のようなハッシュがあったとします。

```ruby
my_favorite_beef = {miyazaki: "高千穂牛", shiga: "近江牛", hyogo: "神戸牛"}
```

ここで、

```ruby
miyazaki
shiga
hyogo
```

のように、**キーのみ**を出力させたい場合は、

```ruby
puts my_favorite_beef.keys
```

と入力します。

## ハッシュのバリューのみを出力させたい

先ほどと同じように、例としてこちらのハッシュを使用します。

```ruby
my_favorite_beef = {miyazaki: "高千穂牛", shiga: "近江牛", hyogo: "神戸牛"}
```

そして、

```ruby
高千穂牛
近江牛
神戸牛
```

のように**バリューのみ**を出力させたい場合は、

```ruby
puts my_favorite_beef.values
```

と入力します。

## まとめ
取り出したいハッシュの末尾に、
`.keys`を入力することで、**キーのみ**を
`.values`を入力することで、**バリューのみ**を
取り出すことができる。
【Excelアドイン】使用頻度が高い機能を選別したアドイン「SuperXLe Basic」

以前、Excelアドインの「RelaxTools」を紹介しました。
https://qiita.com/hrk_okd/items/7a025addd6fd601b755b

このアドインは僕自身も愛用しているのですが、機能が豊富過ぎるが故に、「あの機能どこだっけ？」と迷子になることもあります。

アドインはExcel標準では手間がかかるけど使用頻度が高い機能を手軽に扱うもの。
でも、どれが使用頻度が高いかは人によって異なります。
なので、RelaxToolsよりもコンパクトなアドインも需要があり、Excelライトユーザのファーストチョイスになり得ますよね。

じゃあそのアドインって何よという話ですが、今回紹介する「SuperXLe Basic」。
Excelのアドインを探している方は参考にしてみてください。

新サイト：https://www.superxle.com/
旧サイト：https://superxle.amebaownd.com/

# SuperXLe Basicとは？
「SuperXLe Basic」は60近くの汎用的な機能を備えたExcelアドインです。
あの窓の杜にも紹介されているソフトということもあり、アドインの質が高いことが伺えます。
https://forest.watch.impress.co.jp/docs/review/1156143.html

作者は船木 博さん。
山口県岩国市出身、広島大学卒業後、三菱電機に入社し、ルネサスへ転籍。
現在は新大阪の小さなIT企業でソフト開発をされているとのことです。

最初のバージョンがいつ作成されたのかは分かりませんでしたが、窓の杜の紹介記事が2018年12月となっているので、2018年頃にリリースされたのかなと考えています。

# SuperXLe Basicの特徴
SuperXLe_Basicの最大の利点として、一つのリボンで機能が完結していることです。
これがなぜ良いかというと、以下の2つが理由です。

- SuperXLe_Basicのタブを表示しておくだけで良い（リボンの切替が不要）
- ほとんどの機能がワンプッシュでアクセスできる

先に紹介したRelaxToolsは250個以上の機能を提供しており、標準機能だけで4つのリボンが存在します。
一方、SuperXLe_Basicで搭載する機能は約60個でリボンは1つのみ。

機能が増えればリボンの数が増えるのは仕方ありませんが、切替操作が割と面倒になります。
なので、機能を絞って一つのタブにあるのは助かるなと感じたところです。

機能の多さはアドインの指標の一つとなりますが、機能が多いから優秀とは限りません。
必要なものを必要なだけ提供される方が良いという考えもあります。

僕の場合、以下の機能にアクセスしやすいのは非常にポイント高いですね。

- オートフィルタ
- データの並べ替え
- R1C1切替

標準でアクセスコストが高いR1C1切替やPDF変換あたりは、重宝するんじゃないでしょうか。
それ以外にも、普通のExcel標準では辿り着きにくい機能が登録されていて便利ですよ。

# オススメする機能
SuperXLe_Basicでオススメする機能を挙げておきます。

## シート比較
まずはシート比較です。

これは文字通りExcelのシート同士を比較する機能で、シート内で値が異なるセルを色付きで表示してくれます。更にそのセルをクリックするとジャンプまでしてくれます。使い勝手が良いし、Excelヘビーユーザには非常に心強いです。

開発者のYoutubeもあるのでご覧頂ければと思います。
https://www.youtube.com/watch?v=ec-VrJ0G11g&t=2s
https://www.youtube.com/watch?v=uQw2s7YseEc
 
## カメラ
カメラとは、セルを画像として貼り付ける機能です。

セルをコピーして画像にするのは標準の機能として存在しますが、貼り付けの際に画像として貼り付けるワンアクションが必要で、ややストレスがたまる操作です。
でも、アドインのカメラボタンを押せばすぐに画像化が完了します。

一応手順を掲載しておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/258092/287dcc75-fca8-f986-3140-1fe2420b6dc0.png)

セルコピー時と同じくセルの外枠が点線に変更。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/258092/8921b242-0fc9-a930-c501-9aec7c300c20.png)

貼り付けは適当なセルをクリックするだけ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/258092/e967ded6-f691-d1cd-78e2-32de1a1acb99.png)

普通の人はExcelのセルを画像化することは少ないかもしれませんが、Excelのエビデンスをバンバン取る文化がある会社では力を発揮するでしょう。

# 今後取り入れて欲しい機能
SuperXLe Basicを使っていて今後取り入れて欲しいと思う機能は「アンドゥ機能」です。

例えばテーマの塗りつぶしを使えばアンドゥは効きますが、独自で備えている塗りつぶしは使えません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/258092/3131a92c-7b94-5d65-cfd7-ccd7601e5764.png)

本アドインの機能は便利ですが、誤って押してしまうこともしばしばあります。
そんなとき「Ctrl＋Z」を押して戻せたら嬉しいなと思います。
マクロでアンドゥを組むのはすごく大変そうですが :sweat_smile: 

# 最後に：「SuperXLe Basic」で効率的に作業を実現
今回紹介した「SuperXLe Basic」ですが、Excelの初心者から上級者まで喜ぶ機能が搭載されてます。
フリーで提供してくれるのってものすごくありがたいですよね。

エンジニア界隈でいえばSIerがExcelを使用する会社が高いですが、そういった方々はアドインを使ってドキュメント作成の時間を効率的にこなしましょう。

資料作成に時間がかかっている方は、こちらのアドインの導入を検討してみてはいかがでしょうか？
CSSのみでアコーディオンメニューを作ってみた


##はじめに
最近ポートフォリオサイトのコードを書き換えていたのですが、今までjQueryで書いていたアコーディオンメニューを、CSSのみで割と簡単に実装できたので、記事に残しておこうと思います。
##作るもの
アコーディオンメニュー
→webサイトのQ＆A欄とかでよく使われるやつです。一応デモ画像貼っときます。
![タイトルなし.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/694481/1b29fa8b-914c-fa48-0882-3103d9655690.gif)
##コード
**HTML**

```index.html
<!DOCTYPE html>
<html lang="ja">
  <head>
    <meta charset="UTF-8" />
    <link rel="stylesheet" href="style.css" />
    <title>Document</title>
  </head>
  <body>
    <input id="check1" type="checkbox" class="acd-check" />
    <label class="check-label" for="check1">質問文</label>
    <div class="acd-content">
      <p>
        答え
      </p>
    </div>
    <input id="check2" type="checkbox" class="acd-check" />
    <label class="check-label" for="check2">質問文 </label>
    <div class="acd-content">
      <p>
        答え
      </p>
    </div>
    <input id="check3" type="checkbox" class="acd-check" />
    <label class="check-label" for="check3">質問文</label>
    <div class="acd-content">
      <p>
        答え
      </p>
    </div>
  </body>
</html>
```
**CSS**

```style.css
p {
  margin: 0;
}
.acd-check {
  display: none;
}
.check-label,
.acd-content {
  width: 800px;
  font-size: 14px;
  max-width: 100%;
  width: 800px;
  margin: 0 auto 2px auto;
  background: #00bcd4;
  color: #fff;
}
.check-label {
  position: relative;
  display: block;
  padding: 10px;
  user-select: none;
  cursor:pointer;
}
.check-label::after {
  position: absolute;
  top: 10px;
  right: 10px;
  content: "+";
}
.acd-content {
  height: 0;
  opacity: 0;
  padding: 0 10px;
  transition: 0.3s;
}
.acd-check:checked + .check-label + .acd-content {
  display: flex;
  background: #16a085;
  align-items: center;
  height: 40px;
  opacity: 1;
}
.acd-check:checked + .check-label::after {
  content: "-";
  font-size: 16px;
}
```
##仕組み
####全体の仕組み
このコードでは、アコーディオン開閉の挙動をinputタグのチェックボックスを使って操作しています。質問文がチェックボックスのラベルになっていて、ラベルをクリックするとチェックボックスにチェックが入るという仕組みです。
試しにacd-checkのdisplay:noneをコメントアウトしてみるとわかりやすいかと思います。
アニメーション部分はopacity(透明度の操作)を使っています。チェックされていない時の透明度が0、チェックされた時を1として、この間の変化を0.3秒で行うように設定します。
####個人的に分かりずらかった部分

```style.css
.acd-check:checked + .check-label + .acd-content {
  display: flex;
  background: #16a085;
  align-items: center;
  height: 40px;
  opacity: 1;
}
```
この部分。今まで隣接セレクタ(+)を使うことがなかったので少し混乱しました。
.acd-check（チェックボックス）がチェックされた時の.acd-content（答え）に適用させるCSSを書いてるのに、+ check-labelてなんなんだ...。関係なくない？みたいな感じで。

```style.css
.acd-check:checked + .acd-content{
/* 上と同じ */
}
```

こうじゃないの？と思ったんですが、これじゃダメみたいです。
+は 隣接セレクタという名前の通り、同一階層の直後にある要素にしか適用できない。つまり、HTMLを確認すると、 .acd-checkの直後には .acd-labelがあるから、（イメージとしては）まずここに移動してからその直後にある.acd-contentに適用するってわけなんですね。

##終わりに

元々はjQueryで書いていた部分をVue.jsに変えるつもりで始めた作業だったんですが、そもそもCSSだけで実装できるってことが結構多くて驚きました。CSSすごい。
というわけで、この記事はここまでになります。ありがとうございました。
エンジニアのための工数計算サイトをGithub Pagesで作りました

今春からSEの卵として働いている @kumamupooh です．

仕事している中でほしいアプリが出てきたので，web上で作ってみました．
**作業毎の開始/終了時刻から工数を計算するサイト**です　→ [**工数計算サイト**](https://kosuke-kumapooh.github.io/timer/)

## 2021/05/03 追記
しばらく自分で使ってみて，もっと使いやすくしたかったので
画面と処理を大幅にアップデートしました．
`input type="time"`はSafariとIEに非対応のため，計算できなくなってしまっています．
（自分がChrome & Edge使いなので勘弁してください）
記事中の画面キャプチャは旧版のものになっています．ご容赦ください．

![screen.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403437/317a59f9-cb57-9fd0-e453-93e20076a622.png)

# 製作背景
## 会社でwebの勉強をしたので，なにか作りたかった
JavaScriptで動的なwebページを作れることを学んだので，せっかくだからなにか作ってみたいと思っていました．

## 工数を手軽に把握したかった
エンジニアの人はご存知と思いますが，出勤退勤の打刻以外に，
「今日はこの開発工事を何時間行った」という「工数（hour）」を毎日記録しないといけません．
一日中同じ作業をしていればいいのですが，
複数の開発工事を担当していたり，工事以外の仕事などをしたりした場合は，
きちんとメモしておかないと容易に忘れてしまいます．

さらに，私は四則演算が苦手なので（いわゆる理系の方は共感してくれると思う），
**開始時刻と終了時刻をメモっていてもそこから工数を計算するのに苦労しました**．
なので，自動で計算してくれるものがとても欲しかったのです．
~~会社の勤怠システムに同じようなのが実装されてればよかったんですけどね~~

### なぜ工数は大事？
<details>
<summary>よく知らない人はこちらをお読みください</summary>
<p>簡単に言うと，開発工事の進捗把握や，赤字/黒字の判断に使うからです．
（テレワークが広まって成果重視型の評価になったら話は変わるのでしょうが）</p>
<p>例えば，あるシステムの開発を1000万円で受注し，品質の良いシステムを納品できたとします．
この開発工事によって，いくら儲かったでしょう？</p>
<p>基本的には（利益）=（売り上げ）-（原価）なので，
1000万円から開発にかかった費用を引けば利益がわかります．
この，費用を見積もる時に大事になるのが「工数（何時間作業したか）」です．</p>
<p>開発には当然私たちの人件費がかかり，それは
（工数）×（単価）で計算されます．
（もちろん，他にもいろんな固定費などはかかります）
なので，きちんとしたシステムが納品できたとしても，開発にめっちゃ時間がかかったら
その開発工事は赤字（受注金額以上に費用をかけてしまった）になってしまうわけです．</p>
</details>

# 作ってみた
リンクを再掲　→ [**工数計算サイト**](https://kosuke-kumapooh.github.io/timer/)
GitHubにソースコードを置くとwebページとして公開してくれる，GitHub Pagesという便利なものがあるので，それを用いました．
ソースコードは[GitHub](https://github.com/kosuke-kumapooh/timer/)から見られます．

## こだわったところ
- **お昼休みをちゃんと考慮した**
<p>お昼休みをまたいで作業することはよくあると思います．私はお昼ご飯をちゃんと食べてリフレッシュしているので，工数計算からはきちんと除きます．</p>
- **お昼休み時間を変更可能にした**
<p>会社によってお昼休みの時間は異なります．フレックスの場合は個人で異なる場合もあるでしょう．</p>

# 感想
超初心者っぽい感想です．

- 作っていく中で，`window.onload()`など，これまで知らなかった機能に出会えました．

- はじめ，`input`で入力されたものが文字列になっているのに気づかなくて， 「計算できない！」ってずっと言ってました．`eval()`したりすればいいんですね．

- webを作るときはレイアウトの調整がうまくいかないことが多くて，地味にめんどくさいんですよね．Bootstrapを使って試行錯誤して，CSSの訓練にもなりました．

- ~~HTMLのフォームの繰り返し部分，どうにかして簡単にならなかったかな〜と思っています．~~
(2020/08/23 追記)
→ jQueryを使ってfor文でHTMLを生成できました．`attr()`の書き方とか，三項演算子を使った書き方とか勉強になりました．
<apex:input>タグでvalueを配列の要素で指定するとtypeが指定できないエラーの回避方法

　Visualforceの作成中にユーザ入力の利便性向上のために、入力欄のtypeを指定したいという要件がありました。
(例.電話番号の入力欄は数字のキーパッドを表示する)
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/394418/e1c8a524-15b8-2078-b83e-b34e98d42650.png)

このとき
Apex側で
`String stringVar {get; set;}`
と宣言している変数を使用して、
`<apex:input value="{!stringVar}" type="tel">`
であれば、問題なくコンパイルが通ります。

しかし、
`List<String> stringList {get; set;}`
を使用して
`<apex:input value="{!stringList[0]}" type="tel">`
とすると、コンパイルエラーとなります。
(エラー文：` Expected input type 'text', got 'tel' for Id data type`)
(変数側がdate型で、type="date"の場合や、ListではなくMapの場合も同様のエラーとなります。)

今回の要件では、上記の入力欄を動的なListの数だけ<apex:repeat>で表示しようとするため、どうしても配列を使う必要がありました。
(まあ、上記の動的なリストの最大値の数だけクラス定義したオブジェクトを用意して、\<apex:input>を静的に書いてvalueを指定し、renderdで表示を制御するという方法を使えば配列を使わなくても出来たのですが、現実的ではありませんでした。)


上記のエラー文で検索したところ、フォーラムでいくつか同様の事象に関する質問が挙げられておりました。
回答としてはhtml標準のinputタグを使って、JavaScriptでApexに値を渡してあげるというものくらいしかありませんでした。
[フォーラム1](https://salesforce.stackexchange.com/questions/51180/visualforce-compilation-error-expected-input-type-text-got-date-for-id-d)
[フォーラム2](https://developer.salesforce.com/forums/?id=906F000000099HCIAY)

# 今回の回避策
```
<apex:input value="{!stringList[0]}" type="auto" id="hoge">
<script>
    document.getElementById('hoge').setAttribute("type", "tel");
<script>
```
typeをautoで指定してあげれば、コンパイルが通るので、初期表示時にJSでtype属性だけ書き換えてあげることで要件を満たすことが出来ました。
この際、他の箇所のrerenderで当該範囲を指定している場合は、注意が必要です。
rerenderされる範囲に\<script>を記載しておかないと、初期表示時だけしかtypeが適用されません。

# まとめ
 \<apex:input>タグではなく\<input>タグを使う方法よりこの方法の方が、コントローラー側での処理の記載などが少ないため、良い方法だと個人的には思いました。
[Rails]flash変数を使いこなす秘訣はここにある！

# flash変数とは？
何かの処理を行った時に、「〜しました」のようなメッセージを表示させることが出来るものです。
これをうまく使いこなすことでユーザーの使いやすいアプリが作れます！

## flash変数の基本的な使い方
flashはハッシュのような形式で記述します。キー名は自分の好きな名前をつけることができます。

```ruby

# flash[:キー名] = "表示させたいメッセージ"

flash[:success] = '写真を投稿しました'
```

## noticeとalertオプション
あらかじめnoticeとalertというオプションが用意されています。

```ruby

flash[:notice] = 'お知らせが２件あります'　　# 通知に使用する

flash[:alert] = 'ログインしてください'      # 警告に使用する
```

## flashメッセージが消えない時は、、
flash.nowというメソッドがあるのでそれを活用すれば良いです。

```ruby

flash.now[:alert] = 'ログインしてください'
```

## 使えるテクニック集

###flash用の部分テンプレートを作る
「flash[:キー名] = "メッセージ"」の部分の「キー名」をmessage_typeで、「メッセージ」をmsgで取得できます。

```ruby

<% flash.each do |message_type, msg| %>
    <p class="alert alert-<%= message_type %>">
      <%= msg %>
    </p>
<% end %>
```

###redirect_toを使って短く記述する

```ruby

# 書き方
if article.save
  redirect_to path, flash: {キー名: "表字させたいメッセージ"}
else
  ~ 略 ~
end

# 例
if article.save
  redirect_to path, flash: {success: "登録が完了しました"}
else
  ~ 略 ~
end
```

ちなみに、noticeとalertを使う時は非常に簡潔に記述することができます。

```ruby

# 例
if article.save
  redirect_to root_path, notice: "ログインに成功しました"
else
  ~ 略 ~
end
```

###renderメソッドを使うときのflash変数の使い方
flashメッセージはアクションが動いた時に表示され、次のアクションが動くと消去される仕組みになっています。
renderメソッドを使うときはアクションを通さないでビューファイルをレンダリングするため、次のアクションが動いた後にflashメッセージが表示されてしまいます。

renderの場合は表示された後、最初のアクションが実行されます。
flashメッセージは2回目のアクションが実行された時に削除されるため、2回flashメッセージが表示されてしまいます。
こういう場合もflash.nowを使用します。

```ruby

# 例
if article.save
  redirect_to root_path, notice: "登録が完了しました"
else
  flash.now[:alert] = "名前を入力してください"
  render :new
end
```

###flashメッセージを持ち越す方法
flash.keepを使うと指定されたフラッシュを次のアクションに持ち越すことができます。

```ruby

#使い方

# 全てのflashメッセージが持ち越される
flash.keep

# 指定したキーのflashメッセージが持ち越される
flash.keep(:キー名)

# 例

private

def flash_keep
  flash.now[:alert] = "名前を入力してください"
  flash.keep(:alert)
end
```
【Ruby】include?で判定後にOK.NGなどの好きな反応を返す方法

自分用のメモとして今回はinclude?で文字列判定後にtureやfalseを返すのではなく、任意の好きな文字（好物です、まぁまぁ好きですなど）を返す方法をメモとしてここに残します。

##なぜinclude?で文字列判定後に好きな反応を返したいと思ったか？
```
foods = %w(ハンバーグ チキンライス とんこつラーメン しゃけ 味噌ラーメン　魚介系ラーメン うに丼)

上の配列の各要素で、　ラーメン　という文字が含まれる場合は「好物です」と表示し、そうでなければ「まぁまぁ好きです」と出力せよ
```
↑このような問題を解くためです。

最初は条件分岐で処理しようと考えたのですが、文字列を判定するメソッドがあるとのことでinclude?を採用した次第です。

##include?後に好きな反応を返すために記述したコード
```
foods.each do |food|
    puts food.include?("うに") ? "#{food}:好物です" : "#{food}:まぁまぁ好きです" 
  end
```
↑今回はこの記述で対応しました。
eachで格要素をfoodに入れつつinclude?で（"うに")が文字列に含まれるのかを判定します。

ここで、puts food.include?("うに")のままだとtrueかfalseが返ってきます。

ですが、その後に　? "#{food}:好物です" : "#{food}:まぁまぁ好きです" を加えることで思った反応を得ることができました！
【Laravel】SESSIONに値を渡して取得して表示

###要約
1. controllerで`\Session::flash('キー名', '渡したい文字列')`でセッションに保存
2. bladeで`session('キー名')`で値を取得

###環境
Laravel Framework 7.25.0
PHP 7.4.8
MacBook Pro

###処理をした後にSESSIONにメッセージを渡して特定の画面に遷移して、その画面上でメッセージを表示したい

たとえば

```php:controller.php
Blog::create($inputs); // データベースに登録
\Session::flash('msg' , '登録しました') // session('msg')に'登録しました'を代入
return redirect()->route('top'); // top画面に遷移（sessionにメッセージが入った状態）
```


これをトップページで表示するには

```php:top.blade.php
@if(session('msg'))
<p class="msg">
{{ session('msg') }}
</p>
@endif
```

これを表示したい部分に入れることで
`cotroller.phpで\Session::flash('msg' , '登録しました')`でセッションに保存した値を表示させることができる！
Facebookデバッガーで画像に関するエラーが出た件

サイトを公開してFacebookデバッガーにURLを入力すると、見慣れないエラーが出てOGP画像を取得できない、という状態になりました。

## エラーの内容

*指定されたog:image URL「http://〜〜〜/ogp.jpg」は、コンテンツタイプが無効であるため画像として処理できませんでした。*

とか

*提供されたog:image、http://〜〜〜/ogp.pngをダウンロードできませんでした。サポートされていないコンテンツエンコーディングがサーバーで使用されているなど、いくつかの異なる原因が考えられます。クローラーではdeflateおよびgzipのコンテンツエンコーディングを利用できます。*

とかです。

## 原因はパーミッション

画像のパーミッションを 604 から 644 に変えたら取得できるようになりました。
Sleipnir Mobileのエクステンションでハマった罠

## 概要

TampermonkeyやStylusといったブラウザ拡張は便利なものですが、AndroidのChromeでは使えず、Firefoxのエクステンションもまだ未対応のようです。が、Sleipnir Mobileというブラウザで実現することができることがわかりました。
これを使えば広告を非表示に（自己責任で）したり、スマホ表示に対応してないサイトにCSSを差し込み無理やり対応させるなど、夢がひろがりんぐです。

本記事は開発中にハマった罠のログです。

# できること

[公式のドキュメント](http://extensions.fenrir-inc.com/dev.html])をご覧ください。tampermonkeyと同じ感覚で開発ができます。

#罠

ドキュメントには書いてない仕様があるようで、いくつもハマりました。

### 文末のセミコロンが必須
内部処理で改行を削除しているのか？定かではないですが、セミコロンがないとそもそも動かず、コンソールを確認することも出来ないため、首をひねることになります。

```javascript
/* セミコロンがないので動かない */

$(".hogehoge").remove()

```
### //によるコメントアウトが効かない

これもハマりました。スクリプトそのものが動かなくなります。

```javascript
/* //を使うと動かない */

$(".hogehoge").remove();
//hogehogeを削除
```

### SLEX_addStyleは動かない場合がある
この関数はCSSをパースして処理しているようで、あまり複雑なセレクタを使うと動かないようです。styleタグを生成するして対処します。



またハマったら追記します。

# 快適な開発のために
褒められた方法ではないですが、ソース全体をtry-catchで囲むとデバッグが捗ります。

```javascript
try {
    hogehoge();
    fugafuga();
    ...
    alert("done!");
} catch(e) {
    alert(e);
}
```

うんともすんとも言わない場合は文法エラーの可能性が高いです。[jsHint](https://jshint.com/)等で確認しましょう。

#おわりに
コンソール実はあるぞ！とか、そんなのは常識だぞ！とか、こうすれば回避できるぞ！とか、情報をご存知でしたらお知らせ下さい。主は豆腐メンタルなのでなるべく優しくお願いします。
Vivado > XADC Wizard > PYNQ-Z1のvauxNのNはどれかを回路図から知る > 例: AD0に対応するのはvaux1

```txt:動作環境
PYNQ-Z1
Ubuntu 18.04 LTS
Vivado v2019.1
```

### 関連

- [Vivado > XADC Wizard > vauxp1/vauxn1, vauxp3/vauxn3などを追加する > Channel Sequencerの指定をする](https://qiita.com/7of9/items/afb2aef2d5118b9c1f76)

### XADCのVaux*(*:任意の数字)

![コメント 2020-08-22 123313.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32870/2e74efd3-b3e5-ba3b-80b2-a4b9d85717e5.png)

XADC wizardで指定するVaux*。この*に入る番号はどれがAD0やAD1に対応するのかがわからなかった。

### 参考

- [XADC constraints and I/O](https://forums.xilinx.com/t5/Other-FPGA-Architecture/XADC-constraints-and-I-O/td-p/863324)

上記で読み方を理解できた。


### 読み方 > 例: AD0はvaux1に対応

参考資料として「[pynq-z1_sch.pdf](https://reference.digilentinc.com/lib/exe/fetch.php?media=reference/programmable-logic/pynq-z1/pynq-z1_sch.pdf)」を使う。

PDFのSheet#2に以下の図がある。
![コメント 2020-08-22 144050.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32870/b1127752-2197-1e1c-1138-e090583e5273.png)

A0の場合は「CK_A0」に接続されている。

CK_A0は以下に接続されている (PDFのSheet #2)。
![コメント 2020-08-22 144050.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32870/46e7c3c8-a783-6569-091d-babba57a20dd.png)

CK_A0は0-3.3Vの電圧が入ることを想定しており、抵抗分圧で0-1Vの範囲にしていると理解をした。

次にCK_AN0_Pのピンを読む。
PDFの#Sheet 9を読む。

![コメント 2020-08-22 144050.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32870/bbb49801-cb9e-c882-a715-a17e67d9a922.png)

CK_AN0_PはIO_L3P_T0_DQS_AD1P_35とあり、この「AD1P」がVaux1に対応する
ということのようだ。

同様に他のピンを見ていくと、CK_AN1_PはVaux9に対応し、CK_AN2_PはVaux6に対応することがわかる。

### Block DesignとI/O Ports

以下のブロックデザインを用意した。

Vaux*を作る参考として以下を参考に。

- [Vivado > XADC Wizard > vauxp1/vauxn1, vauxp3/vauxn3などを追加する > Channel Sequencerの指定をする](https://qiita.com/7of9/items/afb2aef2d5118b9c1f76)

![コメント 2020-08-22 144050.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32870/69904b93-a527-514b-eb14-88b1d92bad82.png)

Vaux1_0, Vaux_6_0, Vaux9_0のI/O portsは以下となる (他の選択をできないピン）。
上記回路図のピンと対応していることがわかる。

![コメント 2020-08-22 144050.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32870/9a46363d-9527-76e7-478c-ed91f1598fef.png)


### 対応表

上記の図から整理しておく。

| AD | Vaux |
|:-:|:-:|
| AD0  | Vaux1 |
| AD1  | Vaux9 |
| AD2  | Vaux6 |
| AD3  | Vaux15 |
| AD4  | Vaux5  |
| AD5  | Vaux13  |
Laravel ログイン、ログアウトによって表示を変更させる方法

ログイン時は、マイページやログアウトを表示させたく、
ログアウト時では、ユーザー登録やログインを表示させる方法を解説します。

```
// @guest @endguestで挟むとログアウト時のみ表示される
@guest 
    <li class="nav-item">
      <a class="nav-link" href="">ログイン</a>
    </li>
@endguest 
      
// @auth @endauthで挟むとログイン時のみ表示される
@auth
    <li class="nav-item">
      <a class="nav-link" href=""><i class="fas fa-pen mr-1"></i>投稿する</a>
    </li>
@endauth
```

簡単ですね、以上です:relaxed: