OmniAICreator/Qiita-1.07M huggingface dataset:
GLPI 最新版 RPMパッケージをCentOSで利用できるようにする

新しいGLPI（10.0.x）リポジトリが作成された旨、メーリングリストに通知がありましたので、備忘録も兼ねて。

## 環境
OS：CentOS 7.9
Kernel: 3.10.0-1160.71.1.el7.x86_64

## repoファイルの作成

```bash
vim /etc/yum.repos.d/glpi.repo
[copr:copr.fedorainfracloud.org:ligenix:enterprise-glpi10]
name=Copr repo for enterprise-glpi10 owned by ligenix
baseurl=https://download.copr.fedorainfracloud.org/results/ligenix/enterprise-glpi10/epel-7-$basearch/
type=rpm-md
skip_if_unavailable=True
gpgcheck=1
gpgkey=https://download.copr.fedorainfracloud.org/results/ligenix/enterprise-glpi10/pubkey.gpg
repo_gpgcheck=0
enabled=1
enabled_metadata=1
module_hotfixes=1

:wq
```

## パッケージの確認
```bash
yum info glpi
Loaded plugins: copr, fastestmirror, langpacks
Loading mirror speeds from cached hostfile
 * base: ftp.iij.ad.jp
 * epel: ftp.iij.ad.jp
 * extras: ftp.iij.ad.jp
 * remi-safe: ftp.riken.jp
 * updates: ftp.iij.ad.jp
Available Packages
Name        : glpi
Arch        : noarch
Version     : 10.0.2
Release     : 1.el7
Size        : 40 M
Repo        : copr:copr.fedorainfracloud.org:ligenix:enterprise-glpi10/x86_64
Summary     : Free IT asset management software
URL         : https://www.glpi-project.org/
License     : GPLv2+ and GPLv3+ and MIT
Description : GLPI is the Information Resource-Manager with an additional Administration-
            : Interface. You can use it to build up a database with an inventory for your
            : company (computer, software, printers...). It has enhanced functions to make
            : the daily life for the administrators easier, like a job-tracking-system with
            : mail-notification and methods to build a database with basic information
            : about your network-topology.
```

Versionが10.x台であればOKです。あとはyum install してください。
RasberryPi 4でmysql:8.0イメージを動かそうとしたときにexec /usr/local/bin/docker-entrypoint.sh: exec format errorが出た

# 概要
Rasberry Pi 4でmysql:8.0イメージを動かそうとしたときに以下のようなエラーが出た。
```bash
exec /usr/local/bin/docker-entrypoint.sh: exec format error
```

どうやら調べてみるとアーキテクチャ由来のものらしい。実際、動いていた開発環境はx86でRasberryPi 4 はarmである。

# 解決策
Dockerfileを
```Dockerfile
FROM mysql:8.0
```
から
```Dockerfile
FROM --platform=linux/arm64 mysql:8.0
```
に変更すると動いた。


# 参考 
https://docs.oracle.com/cd/E19455-01/806-2720/msgs-278/index.html

https://qiita.com/toyoyuto618/items/f225e1b2ab22ca5adf33

https://dev.classmethod.jp/articles/docker-multi-architecture-image-build/
Pythonで Art-net 出力

## Pythonで　Art-net　出力が　出来ました
https://youtu.be/zpkcqg9FGVU

![python-Raspberry-out.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/378482/d72f20b1-367b-4fd0-0939-a04c24d9b7a9.png)

まだ全ソース公開出来るほど整理できていませんが、一部だけ公開します。
（参考サイトも調べて、追記予定です）

```py
def pack_put():
    #player.note_on(64, 127)
    #1  ID[8]  Int8  -  Array of 8 characters, the final character is a null termination. 
    #                   Value = puthon ‘A’ ‘r’ ‘t’ ‘-‘ ‘N’ ‘e’ ‘t’ 0x00 
    packet.extend(map(ord, "Art-Net"))
    packet.append(0x00)          # Null terminate Art,-Net

    #2  OpCode  Int 16  -  The OpCode defines the class of data following 
    #                      ArtPoll within this UDP packet. 
    #                      Transmitted low byte first. See Table 1 for the 
    #                      OpCode listing. Set to OpPoll. 
    packet.extend([0x00, 0x50])  # Opcode ArtDMX 0x5000 (Little endian)

    #3  ProtVerHi  Int8  -  High byte of the Art-Net protocol revision number. 
    packet.append(0x00)          # Null terminate Art-Net
 
   #4  ProtVerLo  Int8  - Low byte of the Art-Net protocol revision number. 
    #                      Current value 14. Controllers should 
    #                      ignore communication with nodes using a protocol version lower than 14.  
    #packet.extend([0x00, 0x0e])  # Protocol version 14
    packet.append(0x0e)           # Protocol version 14
    packet.append(0x1f)           # Protocol version 14
    packet.append(0x00)           # Protocol version 13
    packet.append(DMX_Universe)   # Protocol version 14
    packet.append(0x00)           # Protocol version 15
 
    #5  TalkToMe  Int8  -  Set behaviour of Node 
    #   7-5  Unused, transmit as zero, do not test upon receipt.  __sequence_counter)  Sequence, 
    #   4   0 = Enable VLC transmission. 
    #       1 = Disable VLC transmission. 
    #   3   0 = Diagnostics messages are broadcast. (if bit 2). 
    #       1 = Diagnostics messages are unicast. (if bit 2). 
    #   2   0 = Do not send me diagnostics messages. 
    #       1 = Send me diagnostics messages. 
    #   1   0 = Only send ArtPollReply in response to an ArtPoll or ArtAddress. 
    #       1 = Send ArtPollReply whenever Node conditions change. This selection allows the 
    #           Controller to be informed of changes without the need to continuously poll. 
    #   0   0 = Deprecated.  
    packet.append(0x02)                 # Physical

    #6  Priority  Int8  -  The lowest priority of diagnostics message that should be sent. See Table 5. 
    packet.append(0x00)

    #with socket.socket(socket.AF_INET, socket.SOCK_DGRAM) as udp:

```

## 参考文献
https://en.wikipedia.org/wiki/Art-Net

https://artisticlicence.com/WebSiteMaster/User%20Guides/art-net.pdf
powershell 気になったこと

## 環境
- windows 10
- PowerShell 7.x

## valuefrompipelinebypropertyname
`System.Management.Automation.ArgumentTypeConverterAttribute`でキャスト可能であれば、引数の型に変更してくれる

https://learn-powershell.net/2013/05/07/tips-on-implementing-pipeline-support/
```powershell
enum keyCodes {
    vk_A = 0x41
    ...
    ...
}
function func {
    [CmdletBinding()]
    param (
        [Parameter(Position=0, Mandatory, ValueFromPipeline, ValueFromPipelinebyPropertyName)]
        [ValidateNotNullOrEmpty()]
        [int] $code1,

        [Parameter(Position=1, Mandatory, ValueFromPipeline, ValueFromPipelinebyPropertyName)]
        [ValidateNotNullOrEmpty()]
        [string] $code2
    )

    process {
        Write-Output "$code1, $code2"
    }
}

[keyCodes]::vk_A | func
```

```powershell:実行結果
65, vk_A
```

## Call演算子
`Write-Output`後の一回目の値が変わらない
dot演算子、foreach-Objectでは期待通りに動作する
```powershell
$dateAfterWriteOutput = Get-Date
$dateBeforeWriteOutput = Get-Date
while ($true) {
    1..3 | & {
        process {
            $dateBeforeWriteOutput = Get-Date
            Write-Output "$_ > After : $dateAfterWriteOutput, Before : $dateBeforeWriteOutput"
            Start-Sleep -s 1
            $dateAfterWriteOutput = Get-Date
        }
    }
}
```
```powershell:実行結果
1 > After : 07/31/2022 18:21:31, Before : 07/31/2022 18:21:31
2 > After : 07/31/2022 18:21:32, Before : 07/31/2022 18:21:32
3 > After : 07/31/2022 18:21:33, Before : 07/31/2022 18:21:33
1 > After : 07/31/2022 18:21:31, Before : 07/31/2022 18:21:34
2 > After : 07/31/2022 18:21:35, Before : 07/31/2022 18:21:35
3 > After : 07/31/2022 18:21:36, Before : 07/31/2022 18:21:36
1 > After : 07/31/2022 18:21:31, Before : 07/31/2022 18:21:37
2 > After : 07/31/2022 18:21:38, Before : 07/31/2022 18:21:38
3 > After : 07/31/2022 18:21:39, Before : 07/31/2022 18:21:39
```
beginブロックに書けば期待通りに動作する
```powershell
while ($true) {
    1..3 | & {
        begin {
            $dateAfterWriteOutput = Get-Date
            $dateBeforeWriteOutput = Get-Date
        }
        process {
            $dateBeforeWriteOutput = Get-Date
            Write-Output "$_ > After : $dateAfterWriteOutput, Before : $dateBeforeWriteOutput"
            Start-Sleep -s 1
            $dateAfterWriteOutput = Get-Date
        }
    }
}
```
Android 画面光度を最大に設定する方法

今回は画面光度を最大に設定する方法を書いていこうと思います。

バーコードなどを表示するアプリでは、画面が暗いと読み取れなかったりするので、その場合に使用したりすると思います。

# 画面光度を最大に設定

```MainActivity.kt
val layoutParams = window.attributes
layoutParams.screenBrightness = WindowManager.LayoutParams.BRIGHTNESS_OVERRIDE_FULL
window.attributes = layoutParams
```
これだけです！
簡単ですね！


あまり使用頻度は少ないものなので、これを見て実装できるように、記録として残しておこうと思います！
家にあるリモコンでWindowsの動画再生制御してみる(製作編) 


# はじめに


[前回](https://qiita.com/keitanak/items/e525f4f5965de1cad622 "家にあるリモコンでWindowsの動画再生制御してみる(実験編)")で実現性が確認できたので、今回は小ぶりのブリント基板に製作を行いました。
回路図、レイアウトはKiCadを利用しました。

# プリント基板製作の過程

* 転写紙にレーザプリンタでパターンを転写します。
![PXL_20220604_130302617.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1015969/3ba87ff6-264e-bcde-b6d5-579a120b33d3.jpeg)

* ラミネータを利用してパターンを基板に転写します。

![PXL_20220605_032431668.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1015969/b7832dd2-9e55-f671-e92b-c052ced4fe82.jpeg)


* オキシドール、クエン酸、塩の混合液を40度ほどの湯せんにつけてエッチングします。

![PXL_20220605_020332755.MP.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1015969/94a3ed1c-b8db-f3aa-9bfa-c55ccc66d4f3.jpeg)

* パターン以外の銅箔が溶けたら、アセトンでこの黒い部分を除去します。

![PXL_20220605_021725236.MP.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1015969/405a30df-22fb-4eea-a4e1-17e66dc6a12a.jpeg)

* パターンがきれいに見えました。

![PXL_20220605_022039494.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1015969/5db8b0c6-9e8b-708d-897f-44f7ff8621d1.jpeg)

* Dynamaskというソルダーマスクのシートをラミネータを使って貼り付けます

![PXL_20220605_022845950.MP.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1015969/28312117-a52f-6826-496f-712ac9cd7d63.jpeg)

* ソルダーマスクをOHPシートに印刷して重ね合わせ、紫外線LEDで露光します。

![PXL_20220605_075834345.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1015969/a41bb559-d9c2-f566-afdb-6aaf2cabbeff.jpeg)

* 露光後40度程度の1%の炭酸ナトリウム溶液に浸してでマスクした部分を溶かします。

![PXL_20220611_055110949.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1015969/8353073e-6fd5-4e9b-c8ba-49080b6ebf8f.jpeg)

* 基板をカットしてクリームはんだを塗布し、表面実装部品を載せます。その後ホットプレートリフローではんだ付けします。

![PXL_20220612_094726759.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1015969/9c30d458-79b9-9f63-5328-5ebce4844703.jpeg)

* 残りの部品をはんだ付けして完成です。

![PXL_20220612_110532572.MP.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1015969/a28b2413-262c-9ed0-6b74-e12212c18fa1.jpeg)

![PXL_20220612_110540228.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1015969/83e39efc-d7ce-7bb6-40b2-afe6bcc6b5c7.jpeg)

何度もやり直してやっとそれなりのできになりました。
基板の切断時に周りのソルダーレジストを少しはがしてしまったのが惜しい感じです。

# 動作確認

前回のリモコンですが、ちょっと離れると赤外線が飛ばないようです。実用的では無い為、またもやハードオフでジャンクのリモコンを入手しました。

![PXL_20220731_093238375.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1015969/ff18e485-781f-437d-fce1-e568d3cdeeff.jpeg)


ソフトのほうもちょっと勘違いしていた箇所などもあり、修正しました。


動作確認の様子です。

<iframe width="300" height="600" src="https://www.youtube.com/embed/hu-fvzSKbpg" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>


動画ファイルのみならず、当初目的にしていた、Youtubeをブラウザで視聴しているときに使えます、また、Radikoの視聴でも機能しました。
これで、動画見ている時に、ちょっと離席するような場合に、リモコンだけで一時停止ができるようになり、かなり便利になりました。
MySQL　チートシート

## クエリ

```sql
-- DB一覧
show databases;

-- DBを指定
use db_name;

-- テーブル一覧
show tables;

-- テーブルのカラム一覧
show columns from table_name;

-- テーブル内一覧
select * from table_name;
select * from account;

-- データ挿入
insert into table_name (column_name) values (value);
```


## ストアード・プロシージャーの書き方

```sql
DROP PROCEDURE IF EXISTS get_friend_list;
DELIMITER $$
CREATE PROCEDURE get_friend_list(IN id INT(11)) BEGIN
SELECT user_id, name
FROM users
WHERE user_id IN (
  SELECT user2_id
  FROM friend_link
  WHERE user1_id = id
);
END$$
DELIMITER ;
```
2-Node.js

Node.jsで作成した機能は全部で７つある。

主に以下のyoutubeと書籍を参考にして作成した機能である。
プログラミング教室 Kikuチャンネル
「Node.js入門」
14 本の動画9,784 回視聴最終更新日: 2021/08/19
https://www.youtube.com/playlist?list=PLuFXsKgHUy2VLKAIAY3gbA1rDXf-D8VQD

「Node.js ＋SQlite3」
6 本の動画425 回視聴最終更新日: 2022/01/13
https://www.youtube.com/playlist?list=PLuFXsKgHUy2V0uE_d_E5NGTFrXagN4G-Q

Node.js超入門［第3版］ （単行本）
著者	掌田　津耶乃 著
ジャンル	IT系書籍 > プログラミング言語
書店発売日	2020/07/18
ISBN	9784798062433
判型・ページ数	B5変・468ページ
定価	3520円
（本体3200円＋税10%）
その他	ダウンロード：有
https://www.shuwasystem.co.jp/book/9784798062433.html

### １，htmlファイル（ejsファイルに変数を入れる）
使用したコード
```
<%= title %>
```
JSファイル
```
router.get('/',(req, res, next) => {
  var data = {
    title:'hello!!'
  };
  res.render('hello', data);
});
```
### ２，POST処理でデータを受け取る。

```
<form method="post" action="/hello/post">
    <label for ="msg">Message</label>
    <input type="text" name="message" id="msg">
    <input type="submit" value="送信">
```
/helloでpost処理を入力フォームを作成する。
```
router.post('/post',(req,res,next) => {
  var msg =req.body['message'];
  req.session.message = msg;
  var data = {
    content: 'あなたは'+ msg + '送りました'
  };
```
jsファイルでは、name=messageに入力された内容が送信されて、<%=content%>の部分に入れ込むことができるようになった。

### ３,googleニュースの取得
```
<%if (content != null) { %>
      <ol>
     <% for(var i in content) { %>
      <% var obj = content[i]; %>
      <li>
        <a href="<%=obj.link %>">
          <%= obj.title %>
        </a>
      </li>
    <%} %>
  </ol>
    <% }%>
```
<%contentの中には>result.rss.channel[0].itemの中に文字列のデータが２０個くらいあるので、for文で回して一つ一つ表示させている。
```
router.get('/',(req, res, next) => {
  var opt = {
    host:'news.google.com',
    port: 443,
    path: '/rss?hl=ja&ie=UTF-8&oe=UTF-8&gl=JP&ceid=JP:ja'
  };
  http.get(opt,(res2) => {
    var body =''
    res2.on('data',(data)=> {
      body += data;
    });
    res2.on('end',() => {
      parseString(body.trim(),(err,result) => {
        console.log(result);
        var data = {
          title:'google news2',
          content: result.rss.channel[0].item
        };
        res.render('hello', data);
      })
    })
  })
});
```
http.getのメソッドを利用して、googlenewsのurlを読み込んで、その結果をDataオブジェクトの中に格納している。})が４つも続くように入れ子がかなりややこしくなり始める。

続きの記事
### ４,create
### ５，update,delete
### ６，find
### ７，エラーメッセージ
証明書についてを調べたこと。

# 証明書について
証明書について忘れてしまうので、備忘録としても見れるよう記述しています。

## 秘密鍵

## CRC(Certificate Signing Request)
 "Certificate Signing Request"の頭文字を取ったものです。
証明書署名要求となります。 証明書署名要求は、認証局にサーバの公開鍵に電子署名してもらうよう要求するメッセージです。
openssl では下記のように作成します。
```
C:\temp>openssl req -new -key server.key -out server.csr
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:
State or Province Name (full name) [Some-State]:
Locality Name (eg, city) []:
Organization Name (eg, company) [Internet Widgits Pty Ltd]:
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:
Email Address []:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

```

## サーバ証明書
サーバ証明書を作成します。 普通であれば上で作成した証明書署名要求 (server.csr) を VeriSign などの機関に送付して認証局の秘密鍵で署名してもらいますが、本稿では自分で署名することでサーバ証明書を作成しますので上で作成した自分の秘密鍵 (server.key) で署名します。 


|文字|項目名|備考|
|---|---|---|
|CN|コモンネーム|有効なサーバのドメイン名（ホスト名）やIPアドレスのこと|
|O|組織名|申請組織の名称|
|L|市町村名|申請組織の事業所住所の「市区町村名」|
|S/ST|都道府県名|申請組織の事業所住所の「都道府県名」|
|C|国名|申請組織の国名（JP 固定）|

## 証明書作成の手順
1. 秘密鍵作成
CSR、サーバ証明書を作成するために必要。
1. 証明書署名要求(CSR)の作成
サーバ証明書を作成するために必要だが作成後は不要。
1. サーバ証明書の作成


認証局に対し、SSLサーバ証明書への署名を申請する内容です。CSR には「公開鍵」とその所有者情報、及び申請者が対応する秘密鍵を持っていることを示すために申請者の署名が記載されています。
認証局は証明書にその所有者情報を署名することで、所有者の存在を証明しています。
SSL 通信ではサーバが公開鍵を提示し、これを用いて暗号化通信を開始します。SSLサーバ証明書は、「公開鍵」及びその対となる「秘密鍵」の所有者情報が記述されたものです。

# 外部参考RUL
[SSL/TLS サーバー証明書の基礎知識](https://www.cybertrust.co.jp/blog/ssl/knowledge/ssl-basics.html)
[CSRを作成したい](https://help.sakura.ad.jp/ssl/2327/?article_anchor=js-nav-1)
[OpenSSLによるオレオレ認証局が署名した証明書の作成(qiita)](https://qiita.com/sotoiwa/items/35f42d969210e0fcd62e)
[デジタル証明書作成の概要(IBM)](https://www.ibm.com/docs/ja/rpt/9.1.0?topic=overview-digital-certificate-creation)
[OpenSSL でのデジタル証明書の作成(IBM)](https://www.ibm.com/docs/ja/rpt/9.1.0?topic=overview-creating-digital-certificate-openssl)
[Windows環境で自己署名証明書を作成する](https://www.mulong.me/tech/windows/ssl-self-signed-certificate-openssl/)
[OpenSSL で RSA の秘密鍵を作成する方法](https://weblabo.oscasierra.net/openssl-genrsa-secret-1/)
[公開鍵・秘密鍵とは？暗号化の仕組みをわかりやすく解説](https://it-trend.jp/encryption/article/64-0089)
[OpenSSLで秘密鍵と公開鍵を作る](https://uzimihsr.github.io/post/2020-05-20-public-key-practice/)
[秘密鍵、公開鍵、証明書、CSR生成のOpenSSLコマンドまとめ](https://blog.freedom-man.com/openssl-command)
[CSR の入力項目](https://www.cybertrust.co.jp/sureserver/support/csr.html)
KerasでTypeError: You are passing KerasTensor...が出た時の対処法(になるかも)

<h1> 概要 </h1>
最近TensorFlow/Kerasで機械学習を始めようとAuto Encoderを試してみたのですがfitの際に下の感じのエラーが出てその解決法が探してもなかなか見つからなかったため記事にしました。
著者の環境はMac OS Monterey 12.5 Python 3.8.3 tensorflow 2.9.1です。


```python
   raise TypeError(
        f'You are passing KerasTensor(...), an intermediate Keras symbolic input/output, '
        'to a TF API that does not allow registering custom dispatchers, such '
        'as `tf.cond`, `tf.function`, gradient tapes, or `tf.map_fn`. '
        'Keras Functional model construction only supports '
        'TF API calls that *do* support dispatching, such as `tf.math.add` or '
        '`tf.reshape`. '
        'Other APIs cannot be called directly on symbolic Keras'
        'inputs/outputs. You can work around '
        'this limitation by putting the operation in a custom Keras layer '
        '`call` and calling that layer '
        'on this symbolic input/output.')
```

 <h1>　原因と解決 </h1>
これの原因はvae_lossで外部のTensorを呼び出したのが原因らしいみたいです。

```python
x = Input(shape=(784,))
z_mean = encode(x)[0]
z_log_var = encode(x)[1]
def vae_loss(x, predict):
    return kl_div(z_mean, z_log_var) + metrics.mse(x,predict)
model.compile(optimizer="adam", loss=vae_loss)

#ここでTypeError(...)が発生
model.fit(train,train)

#Tensorを関数内部のxで取り直す
def vae_loss(x, predict):
    z_mean = encode(x)[0]
    z_log_var = encode(x)[1]
    return K.mean(kl_div(z_mean, z_log_var) + original_dim * metrics.mse(x,predict))

model.compile(optimizer="adam", loss=vae_loss)
#今度は成功しました。
model.fit(train,train)
```
<h1>　追記 </h1>

上記の方法は教師なし学習でtrainとcorrectが等しくないと使えません。
一応解決した後にkerasの[公式ブログ](https://blog.keras.io/building-autoencoders-in-keras.html)でのやり方を知りましたのでこちらの使用を推奨します。

```python
reconstruct_loss = original_dim * losses.mse(x,output)
kl_loss = kl_div(z_mean,z_log_var)
vae_loss = K.mean(reconstruct_loss + kl_loss)
vae.add_loss(vae_loss)
vae.compile(optimizer="adam")
```
透明だけど後ろは見えないシェーダー

透明だけど後ろは見えないシェーダーをURPに対応してみた。

仕組みは2パスでZだけ描いてからTransparentでDiffuseシェーダーで描くのをやる。
ビルトインの時にうまくいってたのをURPに対応してシンプルにしてみた。

参考
https://redhologerbera.hatenablog.com/entry/2022/01/27/193219
https://zenn.dev/kento_o/articles/b0c1b356e76adb

```
Shader "Custom/Building"
{
    Properties
    {
        _Color("Color", Color) = (1,1,1,1)
    }
    SubShader
    {
        Tags {"Queue" = "Transparent" "IgnoreProjector" = "True" "RenderType" = "Transparent"}
        LOD 200

        Pass {
            ZWrite On
            ColorMask 0
        }

        Pass
        {
            Tags {"LightMode" = "UniversalForward"}
            Tags{ "QUEUE" = "Transparent" "IGNOREPROJECTOR" = "true" "RenderType" = "Transparent" }
            Blend SrcAlpha OneMinusSrcAlpha
            ColorMask RGBA
            ZWrite Off
            ZTest LEqual

            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag

            #include "UnityCG.cginc"

            fixed4 _Color;

            struct appdata
            {
                float4 vertex : POSITION;
                float3 normal : NORMAL;
            };

            struct v2f
            {
                float4 vertex : SV_POSITION;
                float3 worldNormal : TEXCOORD0;
            };

            v2f vert(appdata v)
            {
                v2f o;
                o.vertex = UnityObjectToClipPos(v.vertex);
                o.worldNormal = UnityObjectToWorldNormal(v.normal);
                return o;
            }

            fixed4 frag(v2f i) : SV_Target
            {
                float3 L = normalize(_WorldSpaceLightPos0.xyz);
                float3 N = normalize(i.worldNormal);
                fixed4 col = _Color * max(0, dot(N, L) * 0.5f + (1 - 0.5f));
                return col;
            }
            ENDCG
        }
    }
}
```
1-Node.js立ち上げ

Node.js×Expressでにアプリ開発の手順書を記録しておく

1ファイルを作成
2ファイルにcdコマンドで移動する。
3以下のコマンドを実行する
```
npm install express-generator -g
```
実行が完了していれば、
4以下のコマンドも実行する。（pugをejsに書き換えている）
```
express --view=ejs myapp
```
5「myapp」というフォルダのなかに
・bin
・node_modules
・public
・routes
・views
フォルダと
・app.js
というファイルが作成される
6この後　appフォルダにcdコマンドで移動して、
```
npm install
```
を行う

7
```
npm start
```
が実行できるようになる。
Rails及びDocker環境でのpry-railsのデバッグ方法

## なぜ記事を書こうと思ったか
  Rails及びDocker環境でpry-railsでのデバッグをおこなったので、そのやり方を記載致します。
  これまで、行っていたデバッグよりもより細かくコードを確認でき、すごく便利に感じたので、多くの方が使ってくれると嬉しいです。

## Rails及びDocker環境でpry-railsでのデバッグ手順
**※Dockerは構築して、起動してある事を前提として記載致します。**
### デバッグ手順
1.Railsのコードで動作を止めて、確認したいコードの直後に`binding.pry`を追加します。
今回は例として、createメソッドのコードに付け足したいと思います。
```
def create
  permit_parameters = params.permit(:name, :age, :sex).to_h
  binding.pry

  user = User.create!(
           name: permit_parameters[:name].to_i,
           age: permit_parameters[:age],
           sex: permit_parameters[:sex]
         )

  return_json = { "#{ user.name }さんの登録を受け付けました。" }
  render json: return_json
end
```
上記のようにするだけで、permit_parameters変数の行までしか実行されないようになります。

2.`docker ps -a`でDockerで起動しているコンテナの一覧を表示し、Railsサーバーを立ち上げているコンテナのIDを確認します。

3.`docker attach コンテナID`を入力し、Railsサーバーを立ち上げているコンテナに入ります。

4.今回の場合はcreateメソッドにデータをPOSTします。
ログと共に、以下のようなログも表示されます。
```
  1:      def create
  2:        permit_parameters = params.permit(:name, :age, :sex).to_h
  3:        binding.pry
  4:
=>5:        user = User.create!(
  6:                 name: permit_parameters[:name],
  7:                 age: permit_parameters[:age],
  8:                 sex: permit_parameters[:sex]
  9:               )
  10:
  11:       return_json = { "#{ user.name }さんの登録を受け付けました。" }
  12:       render json: return_json
  13:     end

[1] pry(#<UsersController>)> 
```
上記のログでは、`=>`が書いてある行以前まで、コードが動いている事を表します。
また、`[1] pry(#<UsersController>)>`でrailsコンソールの時と同様の操作ができます。
```
[1] pry(#<UsersController>)> params[:name]
=> "田中太郎"
```

5.次の行のコードまで動作させたい場合は、nextと入力する。
```
[2] pry(#<UsersController>)> next

  1:      def create
  2:        permit_parameters = params.permit(:name, :age, :sex).to_h
  3:        binding.pry
  4:
  5:        user = User.create!(
  6:                 name: permit_parameters[:name],
  7:                 age: permit_parameters[:age],
  8:                 sex: permit_parameters[:sex]
  9:               )
  10:
=>11:       return_json = { "#{ user.name }さんの登録を受け付けました。" }
  12:       render json: return_json
  13:     end

[3] pry(#<UsersController>)>
```
先ほどまでは4行まで動作していましたが、今回は10行まで動作した状態になります。

このような作業をするだけで各コードが適切に動作しているか確認することができます。

### デバッグ終了方法
1.`continue`を入力して、止まっていたコードを全て動作させる。
```
[3] pry(#<UsersController>)> continue

~~~ログが流れる~~~
```

2.controlボタンを押しながら、pの後にqを押す。
こうすることで、コンテナから出ることができます。もし、`exit`や`contorol + c`をした場合は、サーバーも停止されます。

3.`binding.pry`を削除します。

## 最後に
　自分は、`logger.debug`やログで動作状況を確認していたので、このデバッグ方法は非常に便利に感じました。是非、やった事がない方はやってみる事をお勧めします。もし、もっと良いデバッグ方法がある場合は、コメントで教えていただけると嬉しいです。読んで頂きありがとうございました。
Dartでサブプロセスをパイプで繋ぐ

# これはなに？
シェルコマンドでパイプを繋いでやったことをDartに移植しようとして困ったことを解決したメモ

# やりたいこと
シェルコマンドで以下のように複数のコマンドを組み合わせて結果を得るケースをDartでやる

```bash
dpkg -s PACKAGE | grep Version | sed -e 's/Version: \([0-9]\+\.[0-9]\+\.[0-9]\+\).*/\1/'
```

コマンド叩くとこんな感じの簡単なお仕事なので、これをそのまま子プロセス呼び出してパイプで繋げばええやんと思ったのが間違いだった。

# 結果
```dart
import 'dart:io';
import 'dart:convert';

class Package {
  String? version;

  Future<bool> Execute() async {
    final dpkg = await Process.start('/usr/bin/dpkg', ['-s', PACKAGE]);
    final grep = await Process.start('/usr/bin/grep', ['Version']);
    dpkg.stdout.pipe(grep.stdin);
    final sed = await Process.start('/usr/bin/sed', ['-e', 's/Version: \\([0-9]\\+\\.[0-9]\\+\\.[0-9]\\+\\).*/\\1/']);
    grep.stdout.pipe(sed.stdin);

    await sed.stdout.transform(utf8.decoder).forEach(reader);

    return true;
  }

  void reader(String str) {
    if (version == null) {
      version = '';
    }
    version = '${version}${str.trimRight()}';
  }
}
```

こんな感じでとりあえず `version` に格納したい値はセットできた。
パイプの方法を調べるのにかなり時間がかかったので、この場合はdpkgのプロセスだけ実行して、その出力から目的の文字列の抽出はDartで書いた方がおそらく圧倒的に速く終わった。

ただ、食わせたいのがgrepやsedのような文字列置換には限らないので、今後何かしらパイプ繋いで処理した結果に対してDartで処理したい場合に役立つと思う。

役立つと思ったでしょ？実際Dartで標準入力から受け取るようにするプログラム書いて、シェルから最後にDartのプログラムにパイプしてやるのが楽だと思うよ！！！

こんな風にな！
```bash
cmd1 | cmd2 | cmd3 | DartApp
```

# ということで
せっかくやりたいことは実現できたので、ここに供養しておきます

---
それでは良いDartライフを。
Windows11にUbuntu（WSL）をインストール

# 動作環境

Windows 11
バージョン 21H2（OSビルド 22000.832）

# インストール手順

管理者権限でPowerShellを起動して ` wsl --install ` を実行してください。

```powershell
PS C:\WINDOWS\system32> wsl --install
インストール中: 仮想マシン プラットフォーム
仮想マシン プラットフォーム はインストールされました。
インストール中: Linux 用 Windows サブシステム
Linux 用 Windows サブシステム はインストールされました。
ダウンロード中: Ubuntu
要求された操作は正常に終了しました。変更を有効にするには、システムを再起動する必要があります。
```

コマンド実行後にPCを再起動すると、既定でインストールされた「Ubuntu」が起動します。
ユーザー名とパスワードを尋ねられるので任意で入力してください。

```bash
Installing, this may take a few minutes...

Please create a default UNIX user account. The username does not need to match your Windows username.
For more information visit: https://aka.ms/wslusers
Enter new UNIX username: [任意のユーザー名]
New password: [任意のパスワード]
Retype new password: [上記と同じパスワード]
passwd: password updated successfully
Installation successful!
To run a command as administrator (user "root"), use "sudo <command>".
See "man sudo_root" for details.

Welcome to Ubuntu 20.04 LTS (GNU/Linux 5.10.102.1-microsoft-standard-WSL2 x86_64)
```

これでインストール完了です。

# インストール後の確認事項

## パッケージの更新 ＆ アップグレード
自動的に更新やアップグレードが行われないため、自分で実行する必要があります。
インストール後にはとりあえず実行しておいた方が良いです。

```bash
sudo apt update && sudo apt upgrade
```

## ファイルの保存場所
### GUIから開く方法
エクスプローラーを開いて、左のナビゲーションウィンドウから「Linux」をクリックしてください。
![explorer.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/339770/0f39e9ed-c18a-1c75-bc8c-ab5aa3396ec2.png)

### Ubuntuターミナルから開く方法
以下のコマンドを実行してください。
現在のディレクトリがエクスプローラーで開きます。
```bash
explorer.exe .
```
ゼロからDocker環境構築(MacOS、Docker Desktop)

# Docker Desktopを用いたDocker環境構築
大学入学時に購入して何もわからず環境構築したMacBook Pro。
何かがおかしいと気づきつつ無理矢理使ってきましたが本当に限界を感じたので一旦出荷状態まで戻して全てを最初からやり直します。
**この記事ではとりあえずDockerが動く環境をDocker Desktopで構築していきたいと思います。**
一連の投稿のハブになる記事は[こちら](https://qiita.com/TakayoshiK/items/ae53424b788c8fcb645b)

## 参考サイト
[Mac に Docker Desktop をインストール](https://docs.docker.jp/docker-for-mac/install.html)
この記事より正直こっちに全て書いてあるのでこっちを読んでください。色々読むのがめんどくさい人は仕方ないのでこの記事を読んでください。

## 環境
MacBook Pro (13-inch, 2018)
macOS　Monterey Version 12.5
メモリ intel Core i5
zsh 5.8.1 (x86_64-apple-darwin21.0)

## 経緯
チーム開発する際に環境を揃えるためにDockerを利用しています。
とりあえず動かす分にはそんなに難しくないのでわざわざ記事を残すか迷いましたが逆に書くのも特に手間じゃないので念の為に書いておきます。

## Docker DesktopをWebサイトからダウンロード
早速Docker Desktopをダウンロードしていきましょう。
[ここ](https://www.docker.com/products/docker-desktop/)から`Mac with Intel Chip`をクリックしてダウンロード
![スクリーンショット 2022-07-31 17.13.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2756391/bfe468cb-e0b3-c00b-9823-3c2ab74ebc49.png)
あとはダウンロードされた`Docker.dmg`を開いて指示に従えばオッケー(~~ほんとにこの記事いらない~~)
ダウンロードできたらDocker Desktopを開いて権限周りを指示通り許可して必要に応じてチュートリアルをやってみましょう(個人的にはスキップ)
とりあえずは本当にこれだけで導入できました。
とても楽ですね。

## 終わりに
一応この一連の記事は個人的なメモを主眼としてるので一年後の自分が血迷って色々失敗するのを防ぐために世の中に必要のないような簡単な内容ですが記事にしました。
余談ですが開発に必要なので仕方ないですが私のMacBook ProのスペックだとDockerはかなりしんどいです、、、(他の人もパソコンで環境再現するの面倒で自分で導入した)
OracleのSQLをMySQLで書く場合

元々OracleでSQLをかいていたが、プロジェクトが変わってMySQLで書くことになったので
SQLの書き方違うモノをまとめた。

今後随時更新をしていこうと思う。

# 予約語が違うモノ

|  Oracle  |  MySQL  |  アンカーリンク  |
| ---- | ---- | ---- |
|  NVL  |  IFNULL  | [NVL](#nvl) |
|  TO_CHAR  |  日付：DATE_FORMAT<BR>数値：FORMAT  | [TO_CHAR, TO_NUMBER](#to_char-to_number) |
|  TO_CHAR  |  日付：DATE_FORMAT<BR>数値：FORMAT  | [TO_CHAR, TO_NUMBER](#to_char-to_number) |
|  decode  |  **存在しない。**  |  |

# 予約語が一緒なもの

|  Oracle  |  MySQL  |
| ---- | ---- |
|  COALESQUE  |  COALESQUE  |
|  INSTR  |  INSTR  |

## NVL
基本的にデータのNULLを置き換えるために使用する。
例えば、NULLであれば「0」を出すようにする…など。

NVLはMySQLに存在しない、代わりに`IfNull`が存在する。
COALESQUEという関数も存在し、それも同様に使うことができる。
これはOracleと一緒の感覚で使うことができる。

https://www.javadrive.jp/sqlite/function/index23.html
```
select ifnull(column,0) from table
```

## TO_CHAR, TO_NUMBER
日付型などを文字列で特定書式で表示する場合…などに使います。

MySQLでは、日付の場合はDATE_FORMAT関数を使います。
しかし、Oracleの書式指定とは全く別物なので、フォーマット指定方法は調べてから書いたほうがいいと思います。

https://www.javadrive.jp/mysql/function/index49.html#:~:text=MySQL%20%E3%81%A7%20DATE_FORMAT%20%E9%96%A2%E6%95%B0%E3%82%92,%E3%81%99%E3%82%8B%E3%81%93%E3%81%A8%E3%81%8C%E3%81%A7%E3%81%8D%E3%81%BE%E3%81%99%E3%80%82

数値の場合は、FORMAT関数を使います。

https://www.javadrive.jp/mysql/function/index42.html#:~:text=%E9%96%A2%E6%95%B0%E3%81%AE%E4%BD%BF%E3%81%84%E6%96%B9-,FORMAT%E9%96%A2%E6%95%B0(%E6%95%B0%E5%80%A4%E3%82%923%E6%A1%81%E6%AF%8E%E3%81%AB%E3%82%AB%E3%83%B3%E3%83%9E%E3%81%A7,%E3%81%99%E3%82%8B%E3%81%93%E3%81%A8%E3%81%8C%E3%81%A7%E3%81%8D%E3%81%BE%E3%81%99%E3%80%82
【PHP初級㊲】配列応用3

[問題]　　(参照：http://www.cc.kyoto-su.ac.jp/~mmina/bp1/hundredKnocksPrimary.html)

{3, 7, 0, 8, 4, 1, 9, 6, 5, 2}で初期化される大きさ10の整数型配列を宣言し、整数値を入力させ、要素番号が入力値の配列要素の値を参照し、さらにその参照した値を要素番号とする配列要素の値を参照して表示するプログラムを作成せよ。入力値が配列の要素の範囲外であるかどうかのチェックは省略してよい。

# コード
```php
$a = [3,7,0,8,4,1,9,6,5,2];
$m = intval(fgets(STDIN));
$i = $a[$m];
echo $a[$i];
```

↓「6」と入力

# 結果
```
2
```
【PHP初級㊱】配列応用2

[問題]　　(参照：http://www.cc.kyoto-su.ac.jp/~mmina/bp1/hundredKnocksPrimary.html)

{3, 7, 0, 8, 4, 1, 9, 6, 5, 2}で初期化される大きさ10の整数型配列を宣言し、整数値を2つ入力させ、要素番号が入力値である2つの配列要素の値の積を計算して表示するプログラムを作成せよ。入力値が配列の要素の範囲外であるかどうかのチェックは省略してよい。

# コード
```php
$a = [3,7,0,8,4,1,9,6,5,2];
$m = intval(fgets(STDIN));
$i = intval(fgets(STDIN));
echo $a[$m] * $a[$i];
```

↓　
「4
　8」　と入力

# 結果
```
20
```
【PHP初級㉟】配列応用1

[問題]　　(参照：http://www.cc.kyoto-su.ac.jp/~mmina/bp1/hundredKnocksPrimary.html)

{3, 7, 0, 8, 4, 1, 9, 6, 5, 2}で初期化される大きさ10の整数型配列を宣言し、整数値を入力させ、要素番号が入力値である配列要素の値を表示するプログラムを作成せよ。入力値が配列の要素の範囲外であるかどうかのチェックは省略してよい。



# コード
```php
$a = [3,7,0,8,4,1,9,6,5,2];
$m = intval(fgets(STDIN));
echo $a[$m];
```

↓「0」と入力

# 結果
```
3
```
ApacheのAliasはファイルを直接指定できるらしい

# ApacheのAliasって？
Apacheでは、Aliasを指定することによって、
リクエストのパス部分が指定したものと一致した場合、
ドキュメントルート以外のディレクトリからページを返すようにすることができます。
例えば、ドキュメントルートが、
```
/var/www/html
```
だった場合、
sample.com/site/index.html
というリクエストが来た場合、通常は、
```
/var/www/html/index.html
```
のファイルが返されます。

ただし、Aliasに、
```
Alias site /home/sites/
```
という設定をして、上記のリクエストが来た場合、
```
/home/sites/index.html
```
のファイルを返すようになります。

# 特定のファイルへのリクエストが来た時に、Aliasを適用できないか？
今回業務上で、
【ドメイン】/sample.html
というリクエストが来たとき、ドキュメントルートとは違う場所にあるsample.htmlを参照できないか
というケースに遭遇しました。（URLの変更は不可）

そこまでApacheに詳しくないため、そのケースをどうやって実現するか迷い、
Aliasでどうにかできないかと検索していました。
ですが、どのサイトでも、特定のファイルをAliasに指定する、といった使い方はしていませんでした。

# やってみた
きっと他にやりようあるんだろうなと思いながらも、とりあえずAliasでやってみようかと思い、以下のように指定してみました。
```
Alias /sample.html /home/sites/hoge/sample.html
```
ダメ元で試したところ、これでもsample.htmlを参照することができました！

# 終わりに
あまり綺麗な形とは言えないし、そんなに使いどころもないとは思いますけど、
同じような状況になった方はぜひ参考にしていただければと思います。
自分がよく使うChromeデバックの使い方

## 画面の確認
### ①　CSSの確認を行う
右のスタイル部分にCSSが表示される。
優先順で上から表示される
![１.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2701305/c2ea7fe8-d15c-4f7b-80eb-489682048a45.png)

### ② レスポンシブ対応確認
iPhoneなどの表示が確認できる。
＊ 注意点！！
safariなどで実際に、**表示される内容と異なる**ことが多々あるので実際に表示確認した方がいい。。。
インストールされてるフォントが異なる、、から？？
![6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2701305/2db94500-76ee-d269-7a4d-376bd7b84d8f.png)

![7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2701305/a024e972-58ff-e8e7-8516-c9d6f9a4ce83.png)

## コンソールログの確認
js内に、直接console.logを仕込んでデバックする
![２.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2701305/d98d0bca-118e-69f6-abd1-94aa5dec16b5.png)


## 通信の確認
API通信速度、通信内容の確認などを行う
![４.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2701305/915572a1-ff3e-bcf0-e62b-1093c4a9c5d7.png)

## キャッシュの確認を行う

![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2701305/87b92481-d356-3471-8406-8970696a09db.png)

## 
chromeさんお世話になりっぱなしです。

まだまだweb開発（フロント側）の経験が浅いので、、、
どなたか、他にもwebのデバックとかでいい方法があれば教えてください。 m(_ _)m
Windowsバッチ MySQLのコマンドでSQLファイルに引数を渡す動作を実現する

## 概要
OracleのSQL*Plusなら以下のように外部sqlファイルを定義してコマンドで引数を渡せますが、MySQLのコマンドのmysqlでは引数を渡すことができません。引数は渡せませんが、同じような処理を実現することはできることが分かったのでまとめます。背景としては作っているツールにて、バッチファイルでデータを取得する必要がありました。MySQLバージョンは8.0.29、Windows10です。

```oracle.sql
SELECT * FROM test WHERE id = &1
```

```oracle.bat
sqlplus user/password@ConnectionString @c:\oracle.sql 1
```

```MySQL.sql
SELECT * FROM test WHERE id = @param_id
```

```MySQL.bat←できない
mysql -u user -D test -ppassword < MySQL.sql 1
```

## 解決
流れとしては、MySQLにセッション固有のユーザ定義変数(この例だと、@param_id = 1)を設定して、そのあと、ユーザ定義変数を使ったSQLを実行します。バッチファイルで実行する場合、この流れの2つの処理をmysqlコマンドの1行で実行する必要がありましたので、-eオプションを使って実現させました。実行結果はtest.tsvに出力されるようにしています。(sqlファイルのパスや、出力先パスは正しく指定する必要があります。)

```MySQL.sql
SELECT * FROM test WHERE id = @param_id
```

```MySQL.bat
mysql -u user -D test -ppassword -e "set @param_id = 1; source MySQL.sql;" > test.tsv
```

バッチファイルで処理をする場合、こんな感じになりそうです。文字列結合を使って-eの後ろの文字列を作る感じになります。

```MySQL.bat
set paramid=1
set s1=set @param_id =
set s2=; source test.sql;
set execSTR="%s1%%paramid%%s2%"
mysql -u user -D test -ppassword -e %execSTR% > test.tsv
```
SIGNATE Student Cup 2022 入門編①【データ分析コンペとは？】



# 目次
[1.はじめに](#1-はじめに)
[2.本コンペの概要](#2-本コンペの概要)
[3.コンペ参加の流れ](#3-コンペ参加の流れ)
[4.コンペの順位（重要）](#4-コンペの順位)
[5.本コンペの詳細](#5-本コンペの詳細)
[6.次回予告](#5-次回予告)

# 1. はじめに
本記事は、[SIGNATE Student Cup 2022【予測部門】](https://signate.jp/competitions/724)に参加する方に向けて、一緒に取り組めればと思い作成しました！

今回からSIGNATEに挑戦したい！初めて自然言語処理を始めてみよう！という方に読んでもらいたいです！

第一弾は、データ分析コンペとは何か？仕組みついて説明していきます。仕組みが分からないと、順位を上げる方法も分からないのでとても重要です！

【第二弾の記事】

https://qiita.com/yama09/items/9a396e184591b500cb0a

【第三弾の記事】

https://qiita.com/yama09/items/2eb188f62cdfb1d23fa0

# 2. コンペの概要
今回のコンペは、英語で書かれた職務内容（求人情報に乗っている要件）から職種を予測するものです。職種は以下の4種類になります。
- データサイエンティスト（DS）
- 機械学習エンジニア（ML Engineer）
- ソフトウェアエンジニア（Software Engineer）
- コンサルタント（Consultant） 

つまり、自然言語に関する機械学習を使って、仕事に関する文章を学習させて予測してもらえばいいということです！

# 3. コンペ参加の流れ
SIGNATEやKaggleといったコンペは、主催者のお題にそって参加者が分析技術を競うというものです。分析技術は、データの加工力や機械学習モデルの作成力だったりになります。簡単にコンペの参加方法について説明していきます。基本的には、5個のステップになっています。![コンペの流れ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2759780/e2ad49a4-b801-380b-8a4b-3e72a4ef9e96.png)
1個1個のステップについては、丁寧に記載されている記事が多いので紹介します。
> [【SIGNATE練習問題】お弁当の需要予測をやってみた](https://nanjamonja.net/archives/46)（テーブルデータ）
> [【SIGNATE, 初心者向け】初コンペ参加と解析手法概要まとめ（Docker, Python）](https://baran-gizagiza.com/docker-python-signate-1/)（テーブルデータ）

このようにweb記事で学ぶこともできますが、[SIGNATE QUEST](https://quest.signate.jp/quests)という学習コンテンツで１から学ぶことが最短で確実に理解できると思います！（筆者も初めてメダルを取れるまで、ずっとSIGNATE QUESTで勉強してました）

# 4. コンペの順位
初めてコンペに参加される方に注意してもらいたいのが、公開されている順位が最終順位ではないということです！

データ分析コンペでは、機械学習の汎化性能（どのデータに対しての同じような精度がでること）を高めることが目的としてあります。つまり、一部のデータでは80%の精度は出るが、他のデータで50%の精度になってしまう状態を避けたいということです。これを考慮して、以下のような順位付けを行っています。![スコアの仕組み.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2759780/64cc23f4-e2ea-e713-cb82-39cec2d9f5a5.png)
評価用のデータを予測して、コンペサイトに予測結果を提出します。この時、評価データの一部をのみしかスコア採点をしません。よって、リーダーボードに出るのは暫定順位のスコアになります。よって、暫定順位では10位だったのに、最終順位では1位になることもあります。

この最終順位のスコアは、コンペ終了後に計算されるのでコンペ終了まで何があるか分からないということです！！

上位を狙うには、学習用のスコアと暫定順位のスコアを見比べてスコアに乖離がないかを判断しながら過学習を防ぐことは重要になります。学習用で精度が80%だったのに、提出して暫定順位のスコアをみたら精度が60%だったときは過学習が起こっている可能性が高いです。


# 5. 本コンペの詳細
データ数を見てみると、学習用とテスト用でほとんど同じ数でした。簡単にデータについて説明すると、学習用は正解データがついたもの、テスト用は正解データのないデータです。つまり、学習用で機械学習に学習させて、テスト用の正解データを作る（予測する）という感じです！
||学習用|テスト用|
|:---|:---:|--:|
|データ数|1516|1517|

実際にデータの中身を見てみます。データの種類は3種類でした。
|カラム名|概要|
|:---|:---:|
|id|データに順番に振ってある番号のようなもの|
|description|仕事の内容を記載した文章|
|jobflag|職種のラベル（DSなら１、Consultantなら４といった感じ）|

評価指標は、F1 Macroスコアを採用しています。このスコア指標は、分類データの数に偏りがある時に使用することが多い指標です。今回のデータだと、コンサルタントが500個・機械学習エンジニアリングが80個のデータになるので、データの数に偏り（不均衡）があるためこの指標を使っているのだと思います。
![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2759780/d352fbe6-6e27-a853-7f35-1dfb071eb0e2.png)
詳しくは、以下のリンクを参照してみてください。
> [【初心者向け】 機械学習におけるクラス分類の評価指標の解説](https://tech-blog.optim.co.jp/entry/2021/05/31/100000)


# 5. 次回予告
第二弾では、自然言語モデルであるBERTを使用して予測を行っていきます。BERTのコードは複雑で何を書いてあるか分からない、どこを改良すればいいか分からないという方も多いと思うので解説しながら書いていきます。

本記事を気に入って頂けたら、「LGTMボタン、コンペのフォーラムでのいいね」をお願いします！

【第二弾の記事】

https://qiita.com/yama09/items/9a396e184591b500cb0a

【第三弾の記事】

https://qiita.com/yama09/items/2eb188f62cdfb1d23fa0
CSS positionの使い方とは？？

## はじめに

CSSって初めに勉強するのに、奥が深くて難しいですよね？？(キリがない)
今回は**position**プロパティってどうなってるんだっけ？？と毎回忘れるので、備忘録としてこの記事を書きました。

## 対象者
この記事は下記のような人を対象にしています。

- CSSの**position**の使い方を知りたい方
- CSSの**position**の理解が曖昧な方
- 駆け出しエンジニア
- プログラミング初学者

## positionとは

positionとはざっくりいうと**要素の位置を決める**ためのプロパティです。

※要素とは：HTMLの開始タグ〜終了タグまでのカタマリ。
例：```<div class="container">Hello, world!</div>```

## positionの書き方

positionプロパティはCSSで以下のように書きます。
```css:index.css
セレクタ { position: 値;}
```
※セレクタとは：「CSSによるデザイン指定を**どこの部分に対して適用するか**」を決めるものになります。タグ名・id名・class名などがセレクタにあたります。

## positionの値

positionの値には以下の4種類があります。
1. **static**：初期値はこれ。指定することはほとんどない
1. **relative**：現在の位置を基準に相対的な位置を決める
1. **absolute**：親要素を基準に絶対的な位置を決める
1. **fixed**：画面のきまった位置に固定する

※今回はfixedについては省略させていただきます。

## positionとセットで使うtop・bottom・left・right

positionは基本的に```top```、```bottom```、```left```、```right```というプロパティとセットで使います。

1. ```position```で位置を決める
1. 　```top```、```bottom```、```left```、```right```で具体的な位置を調整する

といった流れです。

## position: staticとは？

#### 特徴
- 初期値：CSSで何も指定していなければコレになっている
- 要素は通常の位置に：上下左右に動かすことができない
- 要素の位置を調整できない：topやleftなどを指定しても効かない
- z-indexを指定できない：要素の重なり順を変えられない

※基本的にstaticを指定することはありません。

## position: relative

```position: relative```は現在の表示位置から相対的に要素の位置を動かしたいときに使います。

#### 使用例
実際にコードを書いて指定してみましょう。要素を```position: relative```にしたうえで```top```と```left```をそれぞれに200pxに指定してみます。分かりやすくするために指定なしの要素も作ることにします。

```html:index.html
<div class="parent">
  <div class="none">指定なし</div>
  <div class="relative">relative</div>
</div>
```
```css:index.css

.none {
  background-color: antiquewhite;
  height: 200px;
  width: 400px;
}

.relative {
  background-color: antiquewhite;
  height: 200px;
  width: 400px;
  position: relative;
  top: 200px;
  left: 200px;
}
```
![スクリーンショット 2022-07-31 16.11.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2600856/93088a21-3759-b42e-bf74-09f600982880.png)

本来は指定なしのすぐ下に表示されるはずです。
本来の表示位置を基準に、上から200px（top:200px）、左から200px（left:200px）だけ移動したわけです。

#### staticとrelativeの違い
```position:relative```としても、topやbottomを指定しなければstaticと同じ位置に表示されます。そのため一見同じように感じられますが、①位置調整の可否や②z-index指定の可否という違いがあります。z-indexやtopなどが指定できないときはrelativeにしましょう。

## position: absolute

absoluteだと親要素を基準に、絶対的な位置を指定することになります。

```html:index.html
<div class="parent">
  <div class="none">指定なし</div>
  <div class="absolute">absolute</div>
</div>
```
```css:index.css
.parent {
  position: relative;
}

.none {
  background-color: antiquewhite;
  height: 200px;
  width: 400px;
}

.absolute {
  background-color: antiquewhite;
  height: 200px;
  width: 400px;
  position: absolute;
  top: 200px;
  left: 200px;
}
```

![スクリーンショット 2022-07-31 14.08.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2600856/d84974b7-f942-fba9-4161-6d6a9799e4d2.png)

先程は本来の位置(指定なしのすぐ下)を基準に、上から200px（top:200px）、左から200px（left:200px）だけ移動しました。
今回は親要素(画面の左端)を基準に、上から200px（top:200px）、左から200px（left:200px）だけ移動しました。


#### 親要素はrelativeにしておく
```absolute```を使って位置調整するときは、親要素に```position:relative```（もしくは```fixed```）を指定しておきましょう。これを忘れると基準位置がずれて思ったように表示されません。absoluteを使うときは、おまじないのように親要素もセットで変えるようにしましょう。

## 参考記事
[CSSのpositionを総まとめ！absoluteやfixedの使い方は？](https://saruwakakun.com/html-css/basic/relative-absolute-fixed)
Joystick の操作を逆にしたい ~OnScreenStick に加工した値を流す~

# 概要
以下の記事で Joystick の値を On-Screen Stick を使って Gamepad に流したが、Joystick の操作を逆にしたかったので、流す値を加工した。

https://qiita.com/ozumin/items/e3ca82cf3523ed572c4e

**横方向**

| Before | After |
|-------|-------|
| ![before1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/747207/a6eda1cf-458d-92de-f18a-cefebe5591b7.gif) | ![after1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/747207/ceeceeee-c468-142f-6779-cffa9431b557.gif) |

**縦方向**

| Before | After |
|-------|-------|
| ![before2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/747207/df74fd91-81f8-1db2-fec8-fa21ae8146bc.gif) | ![adter2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/747207/d8dcbd7c-9501-03cf-d879-375e1bb6a45d.gif) |

# 方法

以下のようなスクリプトを用意する。
```c#
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.InputSystem.Layouts;
using UnityEngine.InputSystem.OnScreen;

[RequireComponent(typeof(FloatingJoystick))]
public class OnScreenReverseStick : OnScreenControl
{
    private FloatingJoystick _joystick;

    void Start()
    {
        _joystick = GetComponent<FloatingJoystick>();
    }

    void Update()
    {
        // ここで入力値を逆にする
        var value = new Vector2(- _joystick.Horizontal, - _joystick.Vertical);
        SendValueToControl(value);
    }

    [InputControl(layout = "Stick"), SerializeField]
    private string _controlPath;

    protected override string controlPathInternal
    {
        get => _controlPath;
        set => _controlPath = value;
    }
}

```

Joystick から `On-Screen Stick` コンポーネントを外し、作成したスクリプトをアタッチする。
![Screen Shot 2022-07-31 at 16.13.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/747207/e3399747-ddb4-62a2-911c-3fd739d997a6.png)

すると、概要の画像のように Joystick による回転が逆になる。

# 参考
- [On-screen Controls - Writing custom on-screen Controls](https://docs.unity3d.com/Packages/com.unity.inputsystem@1.0/manual/OnScreen.html#writing-custom-on-screen-controls)
- [【Unity】Input Systemでバーチャルパッドを実装する](https://nekojara.city/unity-input-system-on-screen-controls#カスタムコントロールの実装)
Pythonフルスクラッチで開発したサイトテンプレートに対してTypescriptを導入しフロントエンドを徐々にVueのコンポーネントにしていく話

# サイトテンプレートの開発をさらに進化させていく話

以前こちらの記事ではバックエンドをPythonメインでフルスクラッチでサイトのテンプレートを開発してみようという試みでWebアプリケーションの全体を開発することができました。

次は応用ということで少しjavascriptを使用している部分があるためその部分や今度javascriptで簡易的なアプリケーションを実装していくためその際にTypeScriptを使ってみようと思います。

### 自己課題の共有
https://qiita.com/noss08327439/items/93fc49d095c07bec2020

### 全体的な実装後のイメージと簡易設計の内容について
https://qiita.com/noss08327439/items/b6c3db2d271c6c1ea92f

### デザイン変更後

https://qiita.com/noss08327439/items/33f68bc86efe08911ad2


# 今後の目標

- フロントエンドをVueCLIを利用してコンポーネント化してみる。
-  Javascriptの部分をTypescriptでリプレースをかけていく。
-  フロントエンドの部分はあんまりこだわらなかったので少しずつこだわりを入れていく
-  テーブル数を増やし機能を追加してみる。
-  ブログの機能が途中なので完成させる

一旦、ここまでを実装できるように学習を進めていく
デザインやjavascriptを修正したのに反映されない場合の対応方法

## キャッシュを疑う
キャッシュが残っていて、修正前の動作をしている可能性があります。
キャッシュを削除して再度確認してみましょう。

### キャッシュとは？
>一度読み込んだ内容・情報を一時的に保存しておく。次回閲覧する際に素早く読み込めるようにするための方法

キャッシュは、速度改善に有効で便利なのですが
こういった弊害もあります。

よく、webデザインの修正してデプロイしたのにユーザーの画面に反映されていないってことがよくあります。

## キャッシュバスター
毎回、ユーザーにキャッシュ削除するの？？
っての現実的ではないです。

なので、キャッシュバスターという方法を使うのが一般的なそうです。

やり方は簡単で、
jsやcssの読み込み箇所の後ろに「？」でバージョンや、更新日時を付与します。

こうすることで、同じファイルとみなされず最新のキャッシュとして読み直されます。

例）
```
src=”style.css?date=20220731″
src=”style.css?ver=1.0"
```
Laravelにおける2重サブミット防止

# 初めに
私は、業務系のWebアプリケーションを作っているエンジニアです。

問合せでよくあるのが実行ボタン押しても、なかなか画面が変わらなくて、もう一度押したらエラーになりましたってやつ。
（なんで対策してないんだよ・・・）

てことで、Laravelにおける2重サブミット防止方法は以下の通りです。

# 2重サブミット対策
やることは2つ！

* バックエンドで、リクエストを受けてからトークンを再生成させる。そうすると、レスポンスが返る前に再度サブミットされるとトークンミスマッチ（419：TokenMismatchException）になる。
* フロントエンドで、ボタン押下後にボタンを非活性にする。

## サーバーサイド
### 1. コントローラ
トークンを再生成した状態で、レスポンスが返る前に再度サブミットされるとトークンミスマッチが発生します。
※2〜3は、コード修正不要。

```php
$session->regenerateToken();
```
### 2. ミドルウェア
トークンマッチをチェックする。
※標準で設定されてるので、追加は不要。

```php:VerifyCsrfToken.php
public function handle($request, Closure $next)
    {
        if (
            $this->isReading($request) ||
            $this->runningUnitTests() ||
            $this->inExceptArray($request) ||
            $this->tokensMatch($request)
        ) {
            return tap($next($request), function ($response) use ($request) {
                if ($this->shouldAddXsrfTokenCookie()) {
                    $this->addCookieToResponse($request, $response);
                }
            });
        }

        throw new TokenMismatchException('CSRF token mismatch.');
    }
```

### 3. カーネル
ここで、ミドルウェアを設定することでリクエストの際に処理されるようになります。
※標準で設定されてるので、追加は不要。

```php:Kernel.php
protected $middlewareGroups = [
        'web' => [
            \App\Http\Middleware\EncryptCookies::class,
            \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
            \Illuminate\Session\Middleware\StartSession::class,
            \Illuminate\View\Middleware\ShareErrorsFromSession::class,
            \App\Http\Middleware\VerifyCsrfToken::class,
            \Illuminate\Routing\Middleware\SubstituteBindings::class,
        ],
```
## フロントエンド
ボタン押下時、ボタンを非活性にし、フォームを送信する。

```html
<input type="button" id="btn1" value="実行">
```

```js
$("#btn1").click(function() {
    $("#btn1").prop("disabled", true);
    $("form").submit();
});
```
EC2でgmailにメール送ってみた

参考
https://www.sambaiz.net/article/313/
https://codeforfun.jp/how-to-send-email-with-postfix-and-gmail/
2つ目のリンクの方法で検証成功した後に1つ目のリンクの方法を検証

１つ目のリンク参照
```
echo -ne '\0めあど\0あぷりぱすわーど' | base64
#出力結果コピー
openssl s_client -connect smtp.gmail.com:465 -crlf -ign_eof


---
220 smtp.gmail.com ESMTP u7-20020a170902e80700b0016ed5266a5csm2145168plg.170 - gsmtp
HELO ip-10-0-2-159.ap-northeast-1.compute.internal
250 smtp.gmail.com at your service
AUTH PLAIN  さっきの出力されたbase64
235 2.7.0 Accepted
MAIL FROM: <送信先めあど>
250 2.1.0 OK u7-20020a170902e80700b0016ed5266a5csm2145168plg.170 - gsmtp
RCPT TO:  <送信先めあど>
250 2.1.5 OK u7-20020a170902e80700b0016ed5266a5csm2145168plg.170 - gsmtp
DATA
354  Go ahead u7-20020a170902e80700b0016ed5266a5csm2145168plg.170 - gsmtp
Subject: testmail

this mail is test
.
250 2.0.0 OK  1659249924 u7-20020a170902e80700b0016ed5266a5csm2145168plg.170 - gsmtp

quit
221 2.0.0 closing connection u7-20020a170902e80700b0016ed5266a5csm2145168plg.170 - gsmtp
read:errno=0
```
いけた
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/969819/100e5473-eceb-475d-04c0-acea236c308f.png)

RCPTに関してはgmail側で上書きされます
NCBIからデータをターミナル上でダウンロードしよう

# NCBIのゲノムデータをパパッとダウンロードしたい！
バイオインフォマティクス解析で、複数のゲノムデータをNCBIから取得する機会が多々あります。
ですが、一つ一つ検索して・・・、クリックで移動して・・・ダウンロード形式選択して・・・ってめんどくさい！！！

そこで、今回はMacターミナル上で一気にデータをダウンロードする方法を２通り紹介します。

# ncbi-acc-downloadを使おう
筆者のおすすめ方法です。
ncbi-acc-downloadというアクセッション番号を入力することでターミナル上でデータをダウンロードする方法です。
パッケージは`pip`, `conda`に入っています。まず`conda install`でインストールしましょう。
```
conda install -c bioconda ncbi-acc-download
```
これで完了です。
### 使い方
基本的にこれでOKです
```
ncbi-acc-download -F fasta -o preferance_directory/output.fasta ACCESSION_NUMBER
```
オプション`-F`はファイル形式（fasta, genbank, gffなど・・・)、`-o`でアウトプットファイルの場所/名前を指定です。
複数ファイルを一気にダウンロードする場合、ACCESSION_NUMBERを変数にして、`while read`や`for`でループさせましょう。他にもオプションがあります。ダウンロードファイルを一つにまとめたりすることもできます。`--help`で見れるので、活用するといいのではないでしょうか。

### なぜおすすめなの
アクセッション番号でダウンロードできで嬉しいのは、`BLAST`の結果を利用できるためです。バイオインフォマティクスで誰もが使うであろうブラウザ版BLAST、その結果からデータをダウンロードし、別のプログラムで利用したりするでしょう。BLASTの結果に出てくるデータを一気に取得できれば、楽なのです。
嬉しいことに、ブラウザ版のBLAST結果ファイルでは、アクセッション番号が列でまとめられて記載されてます。
筆者はこちらを編集し、欲しいデータを一気にダウンロードしてます（他にも楽な方法があるかもですが・・・）
# wgetを使おう
もう一つの方法として、`wget`でデータを取得するやり方があります。
NCBIのデータはftpサーバーに保管されてます。データのURLを入力すれば、`wget`で容易にダウンロードできますね。
こちらはこれでOKです。
```
wget -P preferance_path/ URL
```
オプション`-P`で保存先を指定できます。
シンプルでわかりやすいですが、URLをいちいちコピペしたりしないといけないので、筆者的には面倒だなと思ってます。

# 終わりに
今回はターミナル上でNCBIデータを取得する方法をまとめました。
ncbi-acc-downloadは、アクセッション番号を利用できる点がありがたいですよね。
更に便利なものが見つかれば更新します。
Go: Yahoo 郵便番号検索API の使い方

参考ページ
[郵便番号検索API](https://developer.yahoo.co.jp/webapi/map/openlocalplatform/v1/zipcodesearch.html)

```go:get_address.go
// ---------------------------------------------------------------
//
//	get_address.go
//
//					Jul/31/2022
// ---------------------------------------------------------------
package main

import (
	"os"
	"fmt"
	"io/ioutil"
	"net/http"
	"encoding/json"
	"github.com/joho/godotenv"
)

// ---------------------------------------------------------------
func json_parse_proc(str_json string) {
	var jsonBlob = []byte(str_json)
	var jsonObj interface{}
	_ = json.Unmarshal(jsonBlob, &jsonObj)

	address := jsonObj.(map[string]interface{})["Feature"].([]interface{})[0].(map[string]interface{})["Property"].(map[string]interface{})["Address"]

	fmt.Println(address)
}

// ---------------------------------------------------------------
func main() {
	fmt.Fprintf (os.Stderr,"*** 開始 ***\n")

	err := godotenv.Load(".env")
	if err != nil {
		panic(err)
		}

	appid := os.Getenv("APPID")

	code_zip := os.Args[1]
	fmt.Fprintf (os.Stderr,"%s\n",code_zip)
	url_base := "https://map.yahooapis.jp/search/zip/V1/zipCodeSearch"
	url_target := url_base + "?query=" + code_zip + "&output=json"
	req, _ := http.NewRequest("GET", url_target, nil)
	req.Header.Set("USER-AGENT", "Yahoo AppID: " + appid)
	client := new(http.Client)
	res, err := client.Do(req)
	if err != nil {
		fmt.Println("Request error:", err)
		return
	}
	defer res.Body.Close()

	body, err := ioutil.ReadAll(res.Body)
	if err != nil {
		fmt.Println("Request error:", err)
		return
	}

	str_json := string(body)

	json_parse_proc(str_json)

	fmt.Fprintf (os.Stderr,"*** 終了 ***\n")
}

// ---------------------------------------------------------------
```

```text:.env
APPID = 'dj0zaiZpPW9NN3F****'
```

実行の準備

```text
go mod init member
go mod tidy
```

実行例

```text
$ go run get_address.go 131-8634
*** 開始 ***
131-8634
東京都墨田区押上１－１－２東京スカイツリーイーストタワー１１Ｆ
*** 終了 ***
```

次のバージョンで確認しました。

```text
$ go version
go version go1.18.4 linux/amd64
```