OmniAICreator/Qiita-1.07M huggingface dataset:
Awesome AWS Workshops, public learning resources

## Summary 

Hello, I'm Diego Magalhães, the creator of [Awesome AWS Workshops](https://awesome-aws-workshops.com/). 

It is the **(Unofficial)** Curated list of awesome workshops found around in the internet. As we all have been there, finding that workshop that you have just attended shouldn't be hard. The idea is to provide an easy central repository, in a collaborative way.
![Awesome AWS Workshops Banner](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109477/09758280-e840-a372-7aa6-1fbce554b228.jpeg)
## Categories
There are currently 26 categories, and we rely on open-source collaborations to grow!
![List of Categories Available](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109477/255de9be-92f2-877b-37a2-466823199c40.jpeg)
## Search
The portal also provides a convenient way to search for the workshop that you're looking for:
![Search within the categories](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109477/cf2ce5c3-b090-7bc6-caca-0ef710f4b4aa.jpeg)
## Contributing
Your contributions are always welcome! Please take a look at the [contribution guidelines](https://github.com/dgomesbr/awesome-aws-workshops/blob/master/CONTRIBUTING.md) first.
We will keep pull requests open so you can [vote for them](https://github.com/dgomesbr/awesome-aws-workshops/pulls) by adding :+1: to it.
Fake News detectionに関するsurvey

#はじめに
Fake News detectionに関するsurveyです．
自分用です.
#1. 論文List
1. Qi, Peng, et al. "Exploiting multi-domain visual information for fake news detection." 2019 IEEE International Conference on Data Mining (ICDM). IEEE, 2019.
2. Khattar, Dhruv, et al. "Mvae: Multimodal variational autoencoder for fake news detection." The World Wide Web Conference. 2019.
3. Yang, Shuo, et al. "Unsupervised fake news detection on social media: A generative approach." Proceedings of the AAAI Conference on Artificial Intelligence. Vol. 33. 2019.

#2. 説明
##2.1.Exploiting multi-domain visual information for fake news detection
pixelドメインと周波数ドメインのネットワークを作って，MVNNを提案している．画像のみ利用．

##2.2. Mvae: Multimodal variational autoencoder for fake news detection.
オートエンコーダを利用している．潜在変数を用いて，Fake or Trueの二値分類．テキストと画像のマルチモーダル．
##2.3. Unsupervised fake news detection on social media: A generative approach.

#3. データセット
##3.1. MediaEval(Twitter)

##3.2. (Webio)
##3.3. LIAR
text only．評価が6段階になってる．True-Fire
##3.4. BuzzFeed News

#Fake News Chalenge
見出しと本文の関係を識別するチャレンジ
AWSのEC2でメール送信する場合の申請方法

## Eメール送信制限の解除申請
AWSのEC2でメールサーバを立ち上げて運用する場合、注意が必要です。
AWSはSMTPの25番ポートを制限しています。こちらを解除申請する必要があります。

## 逆引きレコード設定の申請
一般的な迷惑メールフィルタは、逆引きできないIPからのメールを受け取らないことが多いため、
メールサーバのIPアドレスの逆引きレコードを登録してあげる必要があります。
AWSのEC2でメールサーバを立ち上げた場合、AWSに申請が必要です。

## 申請方法
ここではEメール送信制限の解除申請と逆引きレコード設定の申請を同時に行います。
下記のサイトから申請をして下さい。

Request to remove email sending limitations
https://aws-portal.amazon.com/gp/aws/html-forms-controller/contactus/ec2-email-limit-rdns-request



下記を参考に記入して下さい。
#### Request information
##### ・Email address
　AWSからの連絡を受信できるメールアドレスを入力してください。

##### ・Use case description
　Please removal of Email sending limit and create reverse DNS record.

#### Elastic IPs information
##### ・Elastic IP address - optional
　対象メールサーバのElasticIPを入力してください。
　例）123.124.125.126

##### ・Reverse DNS record - optional
　対象メールサーバのDNS名を入力してください。
　例）mail.example.com

submitで送信してから、数時間～最大で48時間の営業時間待ちが必要です。
承認されるとAWSからメールが届きます。


## 参考文献
Amazon EC2 サービスクォータ
https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/ec2-resource-limits.html

EC2 インスタンスからポート 25 の制限を削除するにはどうすればよいですか?
https://aws.amazon.com/jp/premiumsupport/knowledge-center/ec2-port-25-throttle/

AWS EC2 Eメール上限緩和 / 逆引き(rDNS)設定 申請⼿順
https://d0.awsstatic.com/webinars/jp/pdf/services/ForCustomer_rDNS_EC2Email_Request_20170828update.pdf
AWS CLIを使ってS3にファイルをアップロード/ダウンロードする

Windows10のコマンドプロンプトからAWS CLIを利用してファイルのアップロード・ダウンロードをおこなう。

##アップロード
####ファイル名を指定してアップロードしたいとき

```
aws s3 cp ./{ファイル名} s3://{バケット名}/{ディレクトリ}/
```

###ファイル名の一部を指定して一括アップロードしたいとき

カレントディレクトリのファイルのうち、拡張子が.xmlのファイルをアップロードする。

```
aws s3 cp .\ s3://{バケット名}/{ディレクトリ}/ --recursive --exclude "*" --include "*.xml"
```
--include ".xml" --exclude "*" とやって失敗することが多い。。（順番が違う）

##一覧取得
####ファイルの一覧を取得したいとき

```
aws s3 ls s3://{バケット名}/{ディレクトリ}/
```
####ファイル名の一部を指定して一覧を取得したいとき

Windowsなのでgrepではなくfindを使う。

```
aws s3 ls s3://{バケット名}/{ディレクトリ}/ | find ".xml"
```
##ダウンロード
####S3から一括ダウンロードしたいとき

```
aws s3 cp s3://{バケット名}/{ディレクトリ}/ .\ --exclude "*" --include "*.xml" --recursive
```

##Amazon CLI Command Reference

https://docs.aws.amazon.com/ja_jp/cli/latest/index.html
Snapパッケージを使ってみた


# Snapとは
Snapパッケージとはアプリケーション・ソフトウェアとその依存パッケージをバンドルしたパッケージになります。
snapパッケージはSnapStoreを通して公開されており、様々な既存アプリケーションのスナップパッケージが
登録されています。


#Sanpを使ってみる前に（Snapdのインストール）
Snapd（snapデーモン）はローカルシステムのスナップ環境の管理を行います。snapdをインストールすると、snapを利用するのに必要なツールも自動でインストールされます。　

私の環境（Ubuntu18.04 LTS）ではデフォルトでsnapd（スナップデーモン）がインストールされているの特に何もしなくてもsnapを利用できまが、インストールされていない場合は、インストールをする必要があります。
[各Distroでのsnapdのインストール方法](https://snapcraft.io/docs/installing-snapd)
<details><summary>Snapdが既にインストールされているDistro</summary>	　Ubuntu 16.04.4 LTS (Xenial Xerus)
　Ubuntu 18.04 LTS (Bionic Beaver)
　Ubuntu 20.04 LTS (Focal Fossa)
　Zorin OS
　Solus 3 and above
　KDE Neon
　Manjaro
</details>


#Snapパッケージを使ってみる

###Snapパッケージの検索
snapパッケージをキーワードを利用して検索する場合は、下記のコマンドが利用できます。

```
$ snap find "media player"
Name  Version  Developer  Notes  Summary
(...)
vlc        3.0.4     videolan✓    -      The ultimate media player.
mpv        0.26.0    casept       -      a free, open source, and cross-platform media player.  
(...)
```
###Snapパッケージの詳細を調べる
探したsnapパッケージの詳細を表示するにはinfoオプションを利用します。
    

```
name:      vlc
summary:   The ultimate media player
publisher: VideoLAN✓
store-url: https://snapcraft.io/vlc
contact:   https://www.videolan.org/support/
license:   GPL-2.0+
description: |
  VLC is the VideoLAN project's media player.
  
  Completely open source and privacy-friendly, it plays every multimedia file and streams.
  
  It notably plays MKV, MP4, MPEG, MPEG-2, MPEG-4, DivX, MOV, WMV, QuickTime, WebM, FLAC, MP3,
  Ogg/Vorbis files, BluRays, DVDs, VCDs, podcasts, and multimedia streams from various network
  sources. It supports subtitles, closed captions and is translated in numerous languages.
snap-id: RT9mcUhVsRYrDLG8qnvGiy26NKvv6Qkd
channels:
  latest/stable:    3.0.11                      2020-06-16 (1700) 304MB -
  latest/candidate: 3.0.11                      2020-06-05 (1700) 304MB -
  latest/beta:      3.0.11.1-30-gf309e89d11     2020-08-23 (1853) 308MB -
  latest/edge:      4.0.0-dev-12702-g392e2feee7 2020-08-17 (1841) 352MB -

```
###Snapパッケージをインストールする
スナップパッケージはinstallオプションでインストールすることができます。

```
masahiro@masahiro-GS65-Stealth-9SE:~$ snap install vlc
vlc 3.0.11 from VideoLAN✓ installed
```
###Snapパッケージを実行する
snapパッケージのインストール後にsnap info <snapパッケージ名＞を実行するとCommandというラインが表示されておりそこにsnapパッケージに含まれる実行コマンドが表示されています。

```
(...）
commands:
  - vlc
snap-id:      RT9mcUhVsRYrDLG8qnvGiy26NKvv6Qkd
tracking:     latest/stable
refresh-date: today at 15:34 JST
(...）

masahiro@masahiro-GS65-Stealth-9SE:~$ vlc
VLC media player 3.0.11 Vetinari (revision 3.0.11-0-gdc0c5ced72)
[000055b04f7c6b10] main libvlc: Running vlc with the default interface. Use 'cvlc' to use vlc without interface.
Qt: Session management error: None of the authentication protocols specified are supported
[000055b04f7bc3c0] main playlist: playlist is empty

```





中川　雅裕　Canonical Japan (Iot Field Engineer)
Ubuntu Blog: https://jp.ubuntu.com/blog
Canonical Japan: https://jp.ubuntu.com/
Email: masahiro.nakagawa@canonical.com
Email:info-jp@canonical.com
Phone: 03-6205-3075
laravel 前のレコード、次のレコードを取得

laravelで前のレコード、次のレコードを取得したい

```hoge.php

$social_id = 5803142;

//前のレコードを取得
$prev = Social::where('id', '<', $social_id)->orderBy('id','desc')->first();

//次のレコードを取得
$next = Social::where('id', '>', $social_id)->orderBy('id','asc')->first();

print_r($prev);
print_r($next);


```

以上
TypeScript: Append<[1,2], 3> ─ タプル型の最後に要素を追加するユーティリティ型

TypeScriptでタプル型の最後に要素を追加した型を導出するユーティリティタイプです。

## `Append<T, U>`

```typescript
type Append<T extends unknown[], U> = [...T, U]
```

[可変長タプル型](https://www.typescriptlang.org/docs/handbook/release-notes/typescript-4-0.html#variadic-tuple-types)が導入されたTypeScript 4.0以降で使えます。

## 使用例

```typescript
const t1: Append<[], 1> = [1]
const t2: Append<[1], 2> = [1, 2]
const t3: Append<[1, 2], 3> = [1, 2, 3]
const t4: Append<[boolean, null, undefined], number> = [false, null, undefined, 0]
```

## 試す

このユーティリティタイプを試したい方は、[TypeScript Playground](https://www.typescriptlang.org/play?noImplicitReturns=false&target=7&module=1&ts=4.0.2#code/C4TwDgpgBAgmkDsAmAeAKlCAPYFkGcoBXBAawQHsB3BAbQF0AaKAVQD4oBeKWgOn7TMW9AFAiAxhQT5gUYAEYAXLHh5UDZvI7da80ZOmzgAJmVxE6vc2Pae86-qky5AZjOrkKXQ+Yvb3qGNfR0M5ABZ3Cy8AIwoKABsIAEMEZgQiePjmEiQIADMASwQIJCYodIBbaIgAJ388pPj8CDSMrOJkfKKS5gAGUSA)をご覧ください。
AuthenticationProvider実装クラスのーと

- SpringSecurity: `5.3.4.RELEASE`

`spring-security-core`, `spring-security-config`, `spring-security-web` に含まれる `AuthenticationProvider` 実装クラスと一言。

![XLJTJXD15BxVfzXBlLYUm0kgt4WYD5IkoNGPoagxs-nECKIzc5r_A8MG809L4ln1MaeeAbmeL7oOmmxrYbVmT6VJgNNjJzAaCz_vpdU-EUUCUeouh5J8Q_FMBDLfeSYMz08jPAchQPRDg3j7JAgdIcoUsimo2RCSE-qwYuX6H96O2oH7TQ_e8jZmg5boBRPac8uzP-Nq9vgP9vwdJvJo-LGQ_-hu4RkDTlquRBuLLH_uqTNF.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158796/02d0f5d1-5f1a-d309-4c40-6181fa381124.png)

横長緩和のためAuthenticationProviderをAPと略しています。

- TestingAuthenticationProviderの根拠
    - https://github.com/spring-projects/spring-security/issues/1262
    - https://github.com/spring-projects/spring-security/issues/5463

<!--
```pluntuml
hide empty member

interface AuthenticationProvider

package sprint-security-config {
class NullAP {
    未設定時に使用されるNullObject
}
}
package sprint-security-core {

class AnonymousAP {
    Anonymousとして認証する
}

class TestingAP {
     SpringSecurity自身のUnitTest用
     spring-security-testで使ったりはしていない
     削除すると後方互換を崩すから残ってる模様
}

class RememberMeAP {
     以前にログインした時の
     Cookieを使って認証する
}
class AbstractUserDetailsAP {
    UserDetailsで認証する
    単純に使うならこれ
}

class DaoAP {
    UserDetailsService
    ---
    UserDetailsServiceを介して
    DB（など）からUserDetailsを取得して認証する
}
class RemoteAP {
    リモートの認証を使うクライアント
}

class AbstractJaasAP {
    JASS(Java標準)に移譲する
}
class RunAsImplAP {
    AOPでRUN_AS_を検証する
}
}
package spring-security-web {
class PreAuthenticatedAP {
    SpringSecurityより手前で
    認証済みの情報で認証する
}
}


AuthenticationProvider <|.. NullAP

AuthenticationProvider <|..  PreAuthenticatedAP

AuthenticationProvider <|..  RememberMeAP
AuthenticationProvider <|..  TestingAP
AuthenticationProvider <|..  AbstractUserDetailsAP
AuthenticationProvider <|..  RemoteAP
AuthenticationProvider <|..  AnonymousAP
AuthenticationProvider <|..  RunAsImplAP
AuthenticationProvider <|..  AbstractJaasAP
AbstractUserDetailsAP <|-- DaoAP
```
-->
クチコミを利用したチャットボット作成

# はじめに
山手線グルメというLINEチャットボットを作りました。忘備録に作り方を残します。

# チャットボット作成の背景
山手線の駅前には飲食店が密集しています。土地勘のない駅近辺で好みの店を探すのは大変です。食べログ、ホットペッパー、Rettyなど、飲食店アプリはたくさんありますが、検索条件にジャンル、予算、地名などを入力し、検索した飲食店の評価や口コミを確認したりします。好みの店を探すのは時間がかかってしまいます。そこで、お勧めの飲食店を教えてくれるチャットボットを目指しました。

# 概要
山手線の駅から近い飲食店データをもとに、クチコミを自然言語処理し、チャットボットが応答する仕組みです。自然言語処理とチャットボットは[UserLocal](https://ai.userlocal.jp/document/free/top/)、UIは[LINE](https://www.linebiz.com/jp/login/)です。いずれも無料です。

# データ概要
2018年頃に東京23区の飲食店情報をスクレイピングしたことがあります。全体では約8万店舗ありましたが、評価が高く山手線の駅から100m以内の飲食店を抽出し、1万店舗に絞り込みました。

## データ内容

- [飲食店名]
- [食べログURL]
- [クチコミ]
- [最寄り駅]　→ 山手線の駅
- [最寄駅からの距離(m)]　→　駅から100m以内
- [食べログ評価点数]　→ 3.2以上

クリコミは１店舗２件、５０文字程度の短いものを採用しました。データ量が多い方が飲食店と直感的なキーワードのバリエーションが増えると思いますが、まずはお試しにデータを減らしました。

# チャットボット
直感的なキーワードにはクチコミを自然言語処理して使用します。会話っぽい単語や文章をチャットボットに入力すれば、類似度の高いクチコミを持つ飲食店を提案する仕組みです。

[UserLocalのチャットボット](https://ai.userlocal.jp/document/free/top/)を使用しました。個人開発者向けは無料で提供されています。文章データが自然言語処理され、ユーザが問い掛けた文章に近いものを応答します。単語の検索が文章に含まれる単語を見つけるのに対し、文章と文章で類似度の高いものを見つけてくるイメージです。
例えば、「恵比寿のおいしい寿司屋」などと入力すると、自然言語処理されたクチコミから類似度の高い飲食店が返答されます。クチコミを返答することで、より会話っぽくなります。返答内容には飲食店名、食べログURLを追加しています。もし、返答できる内容がなかった場合も、とぼけた返答をするので会話っぽくなります。

# チャットボットのフロント画面
フロント画面はLineを使用しました。[LINE for Business](https://www.linebiz.com/jp/login/)

# 完成イメージ
山手線グルメチャットボットをLINEで公開しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213256/030faec9-5044-3337-3ca2-785e8243d76c.png)

## LINE QRコード
![M.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213256/68c0bf04-a624-ee44-5881-b261ab0d7be2.png)

# まとめ
サクッと１週間ほどで完成しました。クチコミを使ったことで思ったより会話っぽくなりました。飲食店を厳選したので、自分好みのツールになりました。データが古いため閉店した飲食店が提案されることもあります。いつかはデータの最新化はやりたいです。
2つ目のGithub Accountを作成し、その新しいアカウントにPushする方法

今回、普段使っているGithub Acccountではなく、新しいアカウントを作成し、そこに新しいRepositoryを作ってPushしようとしたら、できなかったので、方法を調べながらなんとかできたので、載せておきます。


プライベートと会社用でGithub Accountを分けたい方など、参考になれば幸いです。

[参考Youtube](https://www.youtube.com/watch?v=fnSRBRiQIU8)

[参考資料](https://www.freecodecamp.org/news/manage-multiple-github-accounts-the-ssh-way-2dadc30ccaca/)

手順は以下の通り
1. 新しいSSH Keyを作成する (Generate a new SSH key)


## 1.  新しいSSH Keyを作成する (Generate a new SSH key)

まずは指定したメールアドレス用のSSH Keyを作成します。

`ssh-keygen -t rsa -C "<メールアドレス>"`
例えば、
`ssh-keygen -t rsa -C "test@gmail.com"`

```
Generating public/private rsa key pair.
Enter file in which to save the key (/Users/********/.ssh/id_rsa): 
```
(********は隠しています。)
と聞かれるので、

`/Users/********/.ssh/id_rsa_######`
(######に、好きなwordを入れれば良い)

```
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
```
と聞かれたら、passphraseを入力。

```
Your identification has been saved in /Users/********/.ssh/id_rsa_kjx63pro.
Your public key has been saved in /Users/********/.ssh/id_rsa_kjx63pro.pub.
The key fingerprint is:
**************************************** ********@gmail.com
The key's randomart image is:
+---[RSA ****]----+
|.... oE++= ++ .  |
|+.  . o.oo*..=   |

```

これで、新しいSSH Keyの作成は完了。
作成できたか確認する場合は、
`cd ~/.ssh`
で、sshダイレクトリーに移動し、
`ls -la`
を入力すると、これまでに作成されたSSH Keyがリストアップされます。


## 2.  新しいGithub アカウントに、作成したSSH Keyを紐付ける
新しいGithubアカウントにログインし、
Setting => SSH and GPG keys(左のメニューの真ん中あたり)　＝＞New SSH key(緑のボタン)
で、TitleとKeyの入力を要求されるので、

"Title"は、なんでも
"Key"の欄には、先ほど作成したSSH keyを入力。


コマンドラインで、
`pbcopy < ~/.ssh/id_rsa_######.pub`
と入力して、Public Keyをコピーし、"Key"欄に貼り付ければ完了。

## 3. Macのssh-agentにSSH keyを登録する。
タイトルだけ見れば、よくわからないかもしれませんが、SSH keyをMacで使えるようにする作業です。

コマンドラインで
`ssh-add ~/.ssh/id_rsa_kjx63pro`
と入力すると

```
Enter passphrase for /Users/********/.ssh/id_rsa_kjx63pro: 
```
と聞かれるので、先ほど決めたpassphraseを入力。
すると、

```
Identity added: /Users/********/.ssh/id_rsa_kjx63pro (********@gmail.com)
```

## 4. SSH config ファイルを作成する。
まず.sshダイレクトリーに移動(おそらく移動していなかったら、この時点で.sshファイルにいるでしょう)。

`cd ~/.ssh`

Config ファイルを作成
`touch config`
`code config` <- 好きなText Editorで入力すれば良い。自分の場合、VS Codeでconfig file内に記入するためにvsCodeを開く

デフォルトのアカウント(上の "Default Account")と、二つ目のGithub Account(kjx63pro Account)の両方を書いておく。

```
# Default Account
Host github.com
   HostName github.com
   User git
   IdentityFile ~/.ssh/id_rsa
   
# kjx63pro Account
Host github-kjx63pro  
   HostName github.com
   User git
   IdentityFile ~/.ssh/id_rsa_kjx63pro
```

これで完成。

## 5. 新しいGithub アカウントにPush

```
git remote add origin git@github.com-kjx63pro:kjx63pro/simple_todo_app_with_react_hooks.git
git push -u origin master
```

すれば、新しいアカウントに、いつものユーザーとしてPushされます。


## 6. 補足. Git Userの変更
```
git config user.name "User 1"   // Updates git config user name
git config user.email "user1@workMail.com" // Updates git config user email
````

これで、gitコマンドをどのユーザーが行ったかの設定ができます。
Windows ローカル管理者パスワードの一括更新

#備忘録

# script
```powershell
# パスワード更新
function UpdatePasswd( $UserID, $Password ){
    $hostname = $Env:COMPUTERNAME
    [ADSI]$UpdateUser = "WinNT://${HostName}/${UserID},User" 
    $UpdateUser.SetPassword( $Password )
    $UpdateUser.SetInfo()
}

# ローカルユーザーが存在するか
function IsLocalUserAccunt( $UserID ){
    $hostname = $Env:COMPUTERNAME
    [ADSI]$Computer = "WinNT://${hostname},computer" 
    $Users = $Computer.psbase.children | ? {$_.psBase.schemaClassName -eq "User"} | Select-Object -expand Name
    return ($Users -contains $UserID)
}

IsLocalUserAccunt "localadmin"
UpdatePasswd "localadmin" "[new password]" 
```

#サーバ群なら一括実行
 * GPOでファイル配布
 * GPOでタスクスケジューラか、zabbix agentで臨時アイテム作成


# メモ
コアメンバーが退職すると、やらざるを得なくなる。
Yoctoでqemu用のイメージを作ったけど失敗してやり直した話

# やったこと(image 作成、qemu実行)

以下のような事を実施しました。

```terminal
$ git clone -b dunfell git://git.yoctoproject.org/poky.git
$ cd poky
$ source oe-init-build-env build001
$ bitbake core-image-minimal
 # 実行途中なんだけど、CTRL + Cで強制終了
$ bitbake core-image-minimal # 後日再度実行
$ runqemu tmp/deploy/images/qemux86-64/
```

実行した結果が以下。
ログインしようとしたら "getty: tty1: can't execute '/bin/login'" と出る。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/429094/1c9cdc5e-40c9-55a2-d413-d1e647a19f82.png)

# 原因(推測)

おそらく、 "bitbake core-image-minimal" を途中で強制終了したのが原因と思う。

```terminal
$ git clone -b dunfell git://git.yoctoproject.org/poky.git
$ cd poky
$ source oe-init-build-env build001
$ bitbake core-image-minimal
 # 実行途中なんだけど、CTRL + Cで強制終了
$ bitbake core-image-minimal # 後日再度実行
$ runqemu tmp/deploy/images/qemux86-64/
```

# やり直す。でも少しラクをしたい。

最初、以下のようにしようかとも考えました。
ただこれだと、一回目と同じくらい時間がかかる。
それは嫌だ。

```terminal
$ source oe-init-build-env build002 # 新しくbuild002 を作成 
$ bitbake core-image-minimal
$ runqemu tmp/deploy/images/qemux86-64/
```

## 一回目のダウンロードしたコードを流用する

一回目のbitbake コマンド実行時にダウンロードしたコード一式は
そのまま利用できるだろうと考え(さすがにここはおかしくなってないだろうと推測)、流用することに。

以下のように conf/local.conf で DL_DIR変数にパスを設定

```conf:conf/local.conf
#
# Where to place downloads
#
# During a first build the system will download many different source code tarballs
# from various upstream projects. This can take a while, particularly if your network
# connection is slow. These are all stored in DL_DIR. When wiping and rebuilding you
# can preserve this directory to speed up this part of subsequent builds. This directory
# is safe to share between multiple builds on the same machine too.
#
# The default is a downloads directory under TOPDIR which is the build directory.
#
DL_DIR ?= "/home/username/yocto/poky/build001/downloads"
```
参考:https://www.yoctoproject.org/docs/latest/mega-manual/mega-manual.html#var-DL_DIR

# 再度実行(ダウンロードしたコードは流用して)

ということで、再実行ときに実施した手順は以下。

```terminal
$ source oe-init-build-env build002 # 新しくbuild002 を作成 
$ vim conf/local.conf # DL_DIRにパスを設定
$ bitbake core-image-minimal
$ runqemu tmp/deploy/images/qemux86-64/
```
実行した結果は以下。無事 loginできました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/429094/797b1bdb-9b01-3686-f038-ccee78be9edd.png)
Android開発リンクまとめ

#Android

Fragment
https://developer.android.com/guide/components/fragments?hl=ja

ActivityとFragment
https://akira-watson.com/android/activity-fragment.html

AlertDialog
https://qiita.com/ohwada/items/f95518b6948b271433a3
https://shkh.hatenablog.com/entry/2012/12/30/053819
https://qiita.com/granoeste/items/bc30c25caefe5ceb102b
http://www.366service.com/jp/qa/42f4109029cf60909206170c40d3d8f2

色
https://www.javadrive.jp/android/resources/index2.html

ボタンデザイン
https://qiita.com/masaibar/items/3df3ebbb981cd274fe78
https://www.it-swarm.dev/ja/android/setbackground%E3%81%A8setbackgrounddrawable%EF%BC%88android%EF%BC%89/1067646043/

Bar
https://akira-watson.com/android/theme-notitlebar.html
https://appcoding.net/disappear-navigator-bar/

レイアウト
http://s-takumi.hatenablog.com/entry/2014/05/19/170757
http://ichitcltk.hustle.ne.jp/gudon2/index.php?pageType=file&id=Android060_RelativeLayout
https://qiita.com/yukiyamadajp/items/eb4a25cedca2ff8078fd

タブ実装(ViewPager2) 
https://developer.android.com/training/animation/screen-slide-2?hl=ja

Linphone
http://masahiroshiomi.jp/blog/linphone/281/

WebView js
https://qiita.com/j_catfish/items/fc5167d09eba15bdd8ff

sdk
https://blog.77jp.net/android-about-compilation-sdk-version
https://feel-log.net/android/api-level-target-version-min-version/

permission
https://medium.com/@sriramaripirala/android-10-open-failed-eacces-permission-denied-da8b630a89df
https://qiita.com/kurararara/items/968b2bc562a609a12f1e

APIレベル
https://developer.android.com/distribute/best-practices/develop/target-sdk?hl=ja

UI design(bottomsheet)
　・implementation "androidx.coordinatorlayout:coordinatorlayout:1.1.0”(build.gradle)
　・<androidx.coordinatorlayout.widget.CoordinatorLayout(xml)
https://qiita.com/napplecomputer/items/5b3d1225533a59488ac3
https://stackoverflow.com/questions/30571097/error-inflating-class-android-support-design-widget-coordinatorlayout
https://medium.com/android-bits/android-bottom-sheet-30284293f066
https://qiita.com/kurramkurram/items/32b5b208c2ddb6ff4f51
http://java-lang-programming.com/articles/81
https://office2016-01.xyz/error-on-the-theme

表示、非表示
http://ichitcltk.hustle.ne.jp/gudon2/index.php?pageType=file&id=Android053_layout2
http://androidgamepark.blogspot.com/2013/03/setvisibilityviewgone-findviewbyid.html

###Android Studio

Android Emulator settings for AMD
https://webbibouroku.com/Blog/Article/amd-ryzen-android-emulator

Google USB ドライバ
https://windows10-help.com/863/
https://blog.codecamp.jp/android_test

adb setup for windows
https://mapeli.net/conblo/2019/02/15/windows10-adb/
※android studio 再起動

COLOR TOOL
https://material.io/resources/color/#!/?view.left=0&view.right=0

logcat
https://developer.android.com/studio/debug/am-logcat?hl=ja

コード整形プラグイン(Android studio)
https://qiita.com/ikemura23/items/9a33c1b2bdb5a65d29a5

置換
https://qiita.com/hmiyado/items/5e2c9f2b4423e629f4d0

###Java

Json
https://weblog.4141.biz/archives/406

enum
http://4geek.net/use-an-enum-rather-than-an-int-constant-in-java/

Java string 部分一致
https://www.sejuku.net/blog/19257

コーディング非推奨
*関数の引数に関数を使うとメモリーに負荷がかかるのでだめ！！
TypeScript: Concat<[1,2], [3,4]> ─ 2つのタプル型を結合するユーティリティ型

TypeScriptで2つのタプル型を結合するユーティリティタイプです。

```typescript
type Concat<T extends unknown[], U extends unknown[]> = [...T, ...U]
```

## 使用例

```typescript
const t1: Concat<[], []> = []
const t2: Concat<[], [1]> = [1]
const t3: Concat<[1], []> = [1]
const t4: Concat<[1], [1]> = [1, 1]
const t5: Concat<[1, 2], [3, 4]> = [1, 2, 3, 4]
const t6: Concat<[boolean, number], [string, symbol]> = [true, 1, '', Symbol()]
```

## 注意点

このユーティリティタイプが使えるのは[可変長タプル型(variadic tuple types)]([TypeScript: Handbook - TypeScript 4.0](https://www.typescriptlang.org/docs/handbook/release-notes/typescript-4-0.html#variadic-tuple-types))が追加されたTypeScript 4.0以上です。
コンパイラを作る。

#概要

コンパイラを作る。
俺言語を俺cpuのアセンブラに変換するコンパイラを作る。
下記に、ソースとコンパイル結果を載せる。

#ソース

```
10 a=0
20 a=a+1
30 b=a/15
40 #=%=0*120
50 b=a/5
60 #=%=0*140
70 b=a/3
80 #=%=0*160
90 ?=a
100 #=a<100*20
110 #=200
120 ?="fizzbuzz "
130 #=100
140 ?="buzz "
150 #=100
160 ?="fizz "
170 #=100
```

#結果

```
  push  1
  set  a
label20:
  get  a
  push  100
  >
bye:
  jz  bye
  get  a
  push  15
  %
  jz  label120
  get  a
  push  5
  %
  jz  label140
  get  a
  push  3
  %
  jz  label160
  get  a
  push  10
  /
  push  48
  +
  out
  get  a
  push  10
  %
  push  48
  +
  out
  jmp  label100
label120:
  push  'f'
  out
  push  'i'
  out
  push  'z'
  out
  push  'z'
  out
  push  'b'
  out
  push  'u'
  out
  push  'z'
  out
  push  'z'
  out
  jmp  label100
label140:
  push  'b'
  out
  push  'u'
  out
  push  'z'
  out
  push  'z'
  out
  jmp  label100
label160:
  push  'f'
  out
  push  'i'
  out
  push  'z'
  out
  push  'z'
  out
label100:
  push  32
  out
  get  a
  push  1
  +
  set  a
  jmp  label20
i:
  0x0000

```

#パースの方針

最初は、１から２５５の数字、そしてスペース、そしてワード（a、ｂ、ｃ、＃、？）、＝が来て、ワードか数字か”となるか、演算子（＋、－、・、＊、＝、＜、＞）が来てワードの繰り返しとなる。


以上。
メール送信時に受信拒否・迷惑メールにならないようにする対策

送信したメールが、受信側で受信できなかったり、迷惑メールボックスに入ったりする原因は、受信側の判定によります。
なので、すべての対策をしたとしても必ず100％正常に受信させるという保証はありませんが、基本的には受信側に合わせた送信側の設定が必要です。

### 原因１：送信メールサーバがブラックリストに入っている
第三者が利用できるような設定になっていたり、短期間に宛先不明のメールを大量に送信しているなどの条件に該当しているサーバは各種のブラックリストに入ってしまっている可能性があります。
まず、ブラックリストに入っているか確認し、入ってればメールサーバのSMTPの設定を見直して、ブラックリスト解除申請をしてください。

■ブラックリスト
MX TOOL BOX
https://mxtoolbox.com/

blacklistalert.org
http://www.blacklistalert.org/

http://www.senderbase.org

http://www.spamhaus.org/

http://www.barracudacentral.org/rbl

http://www.spamcop.net/


### 原因２.送信元のドメイン認証をしていない
なりすましでメールを送信できてしまうのは、メールのFROMを詐称することができるからです。
なので、送信元ドメインが偽装されていないことを確認するために、ドメインにサーバの情報を登録しておく技術としてSPFが、受信したメールが改ざんされていないかを電子署名を利用して確認するDKIMがあります。
少なくともSPFの対応は必須となります。

#### SPFの設定方法
SMTPサーバのIPもしくはドメイン名を、ドメインのDNSサーバでTXTレコードとして保存します。
受信側は、この情報とメール送信元を照合して、正しい送信元かどうかを判断します。

例：
example.com. IN TXT "v=spf1 +ip4:192.0.2.1 -all"
→IPアドレスが192.0.2.1のサーバはOK、それ以外のサーバはNGという設定

example.com. IN TXT "v=spf1 +ip4:192.0.2.1 ~all"
→IPアドレスが192.0.2.1のサーバはOK、それ以外のサーバは正当なメールであっても認証失敗することがある

「+」→正常なメールとして処理する
「-」→不正なメールとして処理する
「~」→不正なメールとして処理されるが、配信はされる。受信もとで拒否されることもある
「?」→SPF指定なしとして処理される

example.com.　IN TXT "v=spf1  a:www.sample.co.jp  -all"﻿
→www.sample.co.jpのAレコードのIPと一致する場合はOK、れ以外のサーバはNGという設定


example.com.　IN TXT "v=spf1  include:www.sample.co.jp  -all"﻿
→www.sample.co.jpのSPFレコードと一致する場合はOK、れ以外のサーバはNGという設定

#### DKIMの設定方法
送信側メールサーバの公開鍵をあらかじめドメインのDNSサーバに登録しておきます。
送信側メールサーバは自身の秘密鍵で電子署名をつけてメールを送信します。
受信側は、メールから特定したドメインのDNSサーバに問い合わせて公開鍵を取得して電子署名を検証します。

##### ・OpenDKIMで秘密鍵と公開鍵を生成
LinuxにOpenDKIMというツールがあるので、こちらで秘密鍵と公開鍵を生成します。

```
$ sudo yum install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
$ sudo yum install opendkim
```

下記でディレクトリを作成して、公開鍵と秘密鍵を作成できます。

```
mkdir example.com_keys
opendkim-genkey -D example.com_keys -d example.com -s default
```

default.private
→秘密鍵
default.txt
→公開鍵

##### ・公開鍵をDNSサーバにレコードとして登録する

＜セレクタ名＞._domainkey.＜ドメイン名＞.	IN　TXT "v=DKIM1; k=rsa; p=＜公開鍵データ＞"

default._domainkey.example.com.	IN　TXT "v=DKIM1; k=rsa; p=22H33axe4MOdqcwuZ7（省略）"


##### ・秘密鍵をSMTPサーバに登録する
→他の文献を参考にしてください。


## 参考文献
一般財団法人インターネット協会　有害情報対策ポータルサイト　迷惑メール対策編
https://salt.iajapan.org/wpmu/anti_spam/

postfix+opendkimでお名前.comにDKIMを設定する
https://mebee.info/2020/06/26/post-11901/
CodeIgniterのMVCモデル

CodeIgniterのMVCモデルの書き方をメインに書いています。

# Controller

- 静的なページを作成するためのクラスを実装したコントローラを作成する。

    作成するクラスは、system/core/Controller.php の CI_Controller クラスを継承させる。

    引数にページの名前を取る。

    そのページをロードするメソッドは、show()

    ```php
    class Pages extends CI_Controller {

            public function show($page = 'home')
            {
            }

    }
    ```

- クラスの継承
    - オーバーライド：小クラスと親クラスで同じメソッドを使用した場合、コクタスが優先され、親クラスを上書きする。
- メソッド

    特殊な役割を持つメソッド

    - デフォルトメソッド：index()
        - 第二メソッドが空の時に実行されるメソッド
    - 再マップメソッド：_remap()
        - デフォルトメソッドより優先して呼び出される（デフォルトメソッド必要なくなる）
        - 通常のURIルーティングは無視される。
    - 出力メソッド：_output()
        - ユーザー側のブラウザにデータを返す手前で何らかの処理を行うことができる。
    - コンストラクタメソッド：クラス名と同名()
        - コントローラクラスが呼ばれた時に一度だけ実行される。
        - コントローラ内で共通で使用するライブラリなどを初期化する場合や決まった処理を毎回実行したい場合に便利。

        ```php
        function __construct() {
        	// 親コントローラクラスのコンストラクタを呼び出す			
        	parent::__construct();
             
        }
        ```

    - プライベートメソッド：_任意のメソッド名()
        - URLから直接アクセスできない。
        - 以下のような書き方で、デフォルトメソッドを経由して呼び出される。

        ```php
        function index() 
        {
        	echo $this->_private_method();
        }

        function _private_method()
        {
        	echo 'プライベートメソッドです';
        }
        ```

# View

- 特徴
    - PHP構文とHTMLタグで記述できる
    - ビュー同士の連携が可能で、階層構造をもたせることができる。
    - ヘルパーやライブラリが直接利用できる。
    - キャッシュ機能がある。
    - Smartyのような疑似変数ができる。
- Viewの読み込み

    ```php
    $this->load->view('ファイル名', データの連想配列 or オブジェクト)
    ```

    ```php
    <?php 
       class Hello extends CI_Controller
       {  
    		// index()メソッドの中身>>'Hello World'
          public function index() 
    	  { 
             echo "Hello World"; 
          }

    		// about()メソッドの中身>>about.php
    	  public function about() 
    	  { 
             $this->load->view('about'); 
          }
    	  
       } 
    ?>
    ```

- ループ
    - foreach構文を使って繰り返し処理を行う。

    ```php
    // Controller 

    function index()
    {
    	$data["title"] = "サンプル"
    	$data["contents"] = array("りんご", "みかん")
    	$this->load->view("ファイル名", $data);
    }
    ```

    ```php
    <title><?=$title?></title>
    .
    .
    .
    <ul>
    	<?php foreach($contents as $item):?>
    	<li><?=$item;?></li>
    	<?php endforeach;?>
    </ul>
    ```

# Model

- Modelの書き方

    ```php
    <?php 
       class Model_name extends CI_Model 
       { 
          public function __construct()
    	  { 
             parent::__construct(); 
          } 
       } 
    ?>
    ```

- Modelの読み込み
    - 読み込み

    ```php
    // /system/application/models/read/read.phpを読み込みたいとき
    $this->load->model('read/read');
    ```

    - メソッドの実行

    ```php
    $this->read->function();
    ```
【Redux】【React】本当に基礎の部分。Functional ComponentでHooks(useDispatch, useSelector)

#はじめに
Reduxの基礎の部分についてまとめておく。
redux-thunkやredux-sagaを理解するために、Reduxが手元で動かせることを確認した。
Functional ComponentでReduxのHooks（useDispatch, useSelector等）を使った。

#Counterコンポーネント

```tsx

import * as React from 'react';
import { useDispatch, useSelector } from 'react-redux';
//Actionをインポート
import { countUp, countDown } from '../../actions';

export const Counter = (props) => {
  const dispatch = useDispatch();
  const count = useSelector(state => state.count)

  const onCountUp = () => {
    dispatch(countUp());
  };
  const onCountDown = () => {
    dispatch(countDown());
  };

  return (
    <div>
      <div>count:{count}</div>

      <button onClick={onCountUp}>up!</button>
      <button onClick={onCountDown}>down!</button>
    </div>
  );
};

```

・Viewでボタンがクリックされた時に、Actionがstoreにdispatch（発送）される。
・useSelectorは新しいstateと古いstateに差異があった時に、それをViewに送り反映させる。




#Reducer
Actionを受け取った時に、新しいstateにどのように変更するか書く。

frontend/src/reducers/index.tsx

```tsx
// Reducer
const reducer = (state = { count: 0 }, action) => {

  switch (action.type) {
    case 'COUNT_UP':
      return { count: state.count + 1 };
    case 'COUNT_DOWN':
      return { count: state.count - 1 };
    default:
      return state;
  }
};
export default reducer;
```
引数のstateを、dispatchされてきたactionを基に処理して返す。



#Provider store={store}

frontend/src/javascripts/components/home.tsx

```tsx
import * as React from 'react';
import { BrowserRouter, Route, Switch, Link } from 'react-router-dom';

import { Counter } from '../pages/Counter';

import {
  createStore,
} from "redux";
import { Provider } from 'react-redux';
import reducer from '../../reducers/'

const store = createStore(reducer);

export const Home = () => {
  return (
    <BrowserRouter>
      <Provider store={store}>
        <Switch>
          <Route exact path="/redux" component={Counter} 
        </Switch>
      </Provider>
    </BrowserRouter>
  );
};

```

importしたreducerを基に、storeを作成し、
<Provider store={store}>で以下のコンポーネントと接続する。

#Action

frontend/src/actions/index.tsx

```tsx
export const countUp = () => {
return ({ type: 'COUNT_UP' });
}
export const countDown = () => {
return ({ type: 'COUNT_DOWN' });
}
```



###終わりに。
最後まで読んで頂きありがとうございます:bow_tone1:
転職の為、未経験の状態からReact,Railsを学習しております。継続して投稿していく中で、その為のインプットも必然的に増え、成長に繋がるかと考えています。
投稿の内容に間違っているところや、付け加えるべきところが多々あるかと思いますので、ご指摘頂けると幸いです。この記事を読んで下さりありがとうございました。
DatabricksでMLflowを使う③ - モデルのライフサイクル管理 -

# はじめに
機械学習モデルのライフサイクル管理を行うオープンソースであるMLflowをDatabricksのUI上で使用する方法について書いています。

[DatabricksでMLflowを使う① - ノートブック上での実験トラッキング -](https://qiita.com/knt078/items/49a14a83c45f3f501ee7)
[DatabricksでMLflowを使う② - 実験パラメータとメトリクスの可視化 -](https://qiita.com/knt078/items/b1455d57a0fa6cee3f7d)

こちらの記事の続きとなります。
Databricksのマネージド型MLflowではトレーニングしたモデルのステージングについてもUI上で行うことができます。今回はこちらについて書きます。

# モデルの登録
前回の記事の各実験の比較画面です。こちらから一番左のモデルを本運用に移行しようとしているとします。run idから個別ページへ移動します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/618791/1cdf1563-da78-9103-1f5d-8ad7f7de7c73.png)

個別ページへ移動して下のほうへスクロールします。アーティファクトの「model」を選択すると「Register Model」と表示されるのでクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/618791/0d0243fb-c57a-7751-388b-683ff658ad65.png)

モデルとモデル名を記載して、登録します。初めてモデルを作成する場合は「+ Create New Model」しか選択できませんが、登録済みのモデルがある場合にはそのモデルが選択できるようになります。その場合、既存モデルのバージョン違いのものとして登録されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/618791/f9d1b3e3-2e20-c7f2-68bd-ccae25ebfa43.png)

登録が完了すると、モデルの個別ページに移動できるようになります。
画面右のモデル名とバージョンが記載されている部分か、左のサイドバーの「Models」から移動できます。
今回はサイドバーから移動します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/618791/ad669628-2f55-69be-7374-8651c721c1e7.png)

登録したモデルとバージョンが表示されます。ライフサイクルを管理するバージョンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/618791/85cc0bfc-02c3-c9ec-ea7b-a6df91dabe6b.png)

# ライフサイクル管理
個別ページの「Source Run」から該当のrun idの個別ページへ移動できます。
さっそくステージングを行いたいと思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/618791/9ba6fd80-9974-4ce4-a4bb-a0846b799b8f.png)

Stageの部分をクリックするとプルダウンで変更後のステージ状態が選択できるようになっています。ステージには「Staging」「Production」「Archived」の3種類があります。
それぞれに対してRequestを求めてから変更するか、直接変更するかが選べます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/618791/2cdc172a-553e-9040-c61f-b3f2fc717c09.png)

今回は「Request transition to → Staging」を選択します。
コメントを加えてokします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/618791/04691108-92df-d5ab-b41d-723ada0343ae.png)

「Pending Requests」の部分にリクエストが表示されます。このモデルにアクセスできるメンバーはApproveまたはRejectできるようになります。（リクエストした本人はCancelもできるようになっています。）ためしにApproveしてみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/618791/cb49edea-58b5-aeac-6ee8-a292e121fbb2.png)

コメントを加えてconfirmします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/618791/eb22389a-346c-14e1-16da-730c549e80f7.png)

Pending Requestsから消えて、Stageが「Staging」へ移行しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/618791/a128aa12-fe11-bea4-a28c-63ea7a43f98b.png)

下にスクロールすると履歴が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/618791/6dfd7c83-2db3-7a5a-868f-da452743a2f6.png)

# おわりに
今回はモデルのライフサイクル管理について書きました。
次回は本運用へ移行するモデルができたときのモデルの呼び出しについて書きたいと思います。
チームビルディング

チームビルディングと題した書籍、体験型ゲームなど市場におおくありますので、それを手にして実践しようとする方々が多いようですが、それでは仕事に効力を発揮するチームを作るには片手落ちです。
チームビルディングという言葉が独り歩きしていて、仕事の現場でのチームの理想的な姿を具体的挙げることが出来ない方々を見かけます。
キーワードで盛り上がるよりも、自身が属する**チームの理想的な姿を描く**ことから始めていくことです。その理想と現実の乖離から、**日々だれでも行動できる手軽な事から始めて、成長に合わせて、その行動のレベルを上げていく**ことなのです。
先に、人間の本質でお話ししたように、個性を大切にし、モチベーションも大切にすることですが、人の常として、究極は自分が正しいとの立ち位置はだれでも同じです。そうすると全く違った個性が出会うと、そこには争いが起こるのが常です。
**相手を尊重する**という姿勢が必要ですが、これも頭でわかってしても行動に落としてみると難しくなってきます。そこで**チーム全員で共通するルール**を設けることです。例えば『元気よく挨拶する』・『人を責めず、現象をとらえて、真因を見つけ、対策をたてる』です。
その他にも色々とあります。ぜひとも、チーム全員で話してルールを立ててください。
ルールは立てただけでは駄目です、**確りとルール通りに行動しているかを、だれが見ても分かる様にする**ことも重要です。
私たちの仕事・作業は手に取って見ることが出来ません、見える化でも伝えましたが、見えない事を見えるようにすることは現場の人たちが行う事です。現場チームメンバー全員がどんな事でも、些細な問題の芽となる現象も、**正直に見えるようにする行動**を促せるのは、安全領域がチームの中にあることが必須です。**チームビルディングには安全領域の醸成**も含まれています。声の大きな人にチームの雰囲気や行動が左右されてしまいます。声の大きな人を小さくしろと言っても、そもそもの個性の一つですから無理です。短気な方にたいしても同じです。短気は決断が速い傾向があります。即断即決には必要な事です。**個性というのは、その場その場の状況でプラスにもマイナスにもなります。**
チーム全員がメンバー個々の**個性を理解して、お互いにフォローする**ように振る舞うようにする必要があります。そのために、チームビルディングの初段で個人の特性を可視化することを全員で実施しても良いのです。
仕事やプロジェクトのゴールをチーム全員で付箋に綴って語りそれを模造にはって張り出すのも良いでしょうし、現在の不安を付箋に書いて貼りだし、全員でどの不安をフォローする行動を促すことも良いと思います。
普段の仕事ではほとんど会話されていない、**趣味やプライベートの事を話すのも有効**です。
どんなプロジェクトや現場でもこのチームビルディングを蔑ろにしては成功を手にすることは出来ません。
日々、照れくさいかもしれませんが、同じ職場・プロジェクトのメンバーと理想的な現場の姿を語ってみては如何でしょうか？
これがチームビルディングの第一歩なのです。
次は、理想に向かって成長するマイルストーンを設け、そのマイルストーンへ近づくように日々行動することを決めます。
日々行動します。この行動は確りと可視化して、マイルストーンへ向かって成長しているのか、確認します。上手くいかないようであれば、マイルストーンや日々の行動を改善し、さらに行動する。
この一連のプロセスをサイクル化して継続していきことで、**チームビルディングから業務改善・生産性向上・品質向上といった業務・仕事の不断の改善ができるチーム**へと変えていくことができます。
入力内容の取得

##出力側
出力する側のhtmlのform属性のactionに送信先のphpファイルを設定する。

```html:qiita.html
<form action="submit.php" method="get">
        <label for="my_name">氏名：</label>
        <input type="text" id="my_name"
               name="my_name" maxlength="255"
               value="">
        <input type="submit" value="送信する">
    </form>
```

##受け取る側
$_REQUESTの内容はname属性でつけた値を入れることで取得

htmlspecialcharsとすることでhtmlのタグとして認識される文字列を逃がせる

ENT_QUOTESは数値であるために””はつかない


```php:qiita.php
<?php
        print(htmlspecialchars
        ($_REQUEST['my_name'],ENT_QUOTES));
        ?>
```

###getメソッド以外のやり方
method = postを指定する
このやり方だと**URLは変化しない**

```html:qiita.html
<form action="submit.php" method="post">
        <label for="my_name">氏名：</label>
        <input type="text" id="my_name"
               name="my_name" maxlength="255"
               value="">
        <input type="submit" value="送信する">
    </form>
```

submit.phpのほうは$_POSTを使う

$_REQUESTを使えば、汎用的にget,postどちらも受け取れるが思っても見ないような操作が発生する場合があるので注意


```php:qiita.php
<?php
        print(htmlspecialchars
        ($_POST['my_name'],ENT_QUOTES));
        ?>
```

###ラジオボタン
php側に送られるのはvalue属性で設定した値、
次の場合、男性を選択しても送られる値はvalueで設定したmale

```html:qiita.html
<form action="submit.php" method="post">
        <p>性別：
            <input type="radio" name="gender" value="male">男性
            /
            <input type="radio" name="gender" value="female">女性
        </p>
            <input type="submit" value="送信する">
    </form>
```

###複数の値を取得
name属性に[]をつけることで複数選択を受け取れるようにする

```html:qiita.html
<form action="submit.php" method="post">
        <p>
            <input type="checkbox" name="reserve[]" value="1/1">1月1日<br>
            <input type="checkbox" name="reserve[]" value="1/2">1月2日<br>
            <input type="checkbox" name="reserve[]" value="1/3">1月3日<br>

        </p>
            <input type="submit" value="送信する">
    </form>
```

checkboxの値は**配列の形で出力される**ためforeach/for構文を使う


```php:qiita.php
<?php
        foreach ($_POST['reserve'] as $reserve){
            print (htmlspecialchars($reserve,ENT_QUOTES). ',');
        }
        ?>
```
vimで、ウィンドウの幅を簡単に調整できるようにしたい

オッスオッス。うちさぁ、屋上あんだけど....

今回はvimのウィンドウの幅を簡単に調整できるためのショートカットみたいなのを共有します。

一応使っているvimのバージョンが8.1なので、悪しからず。

```
nnoremap C :!
nnoremap <Down>  :res -5<CR>
nnoremap <Up>    :res +5<CR>
nnoremap <Left>  :vertical res -5<CR>
nnoremap <Right> :vertical res +5<CR>

```

はじめの一行目は無視して、まず、

```
nnoremap <Down>  :res -5<CR>
```

これは、ノーマルモード（nnoremap）のときに <Down>↓キーを押したら 今のウィンドウを５下にさげてね、という命令になります。その次の行はその全く逆をしているかんじです。


```
nnoremap <Left>  :vertical res -5<CR>
nnoremap <Right> :vertical res +5<CR>
```

これは、ノーマルモードのとき、 :vertical （x軸の方向に）それぞれ５、増減してね、と命令しています。

なので、これを使うと矢印キーでvimウィンドウを調整できるようになります。

便利ですね。

さて、はじめの

```
nnoremap C :!
```

ですが、これは今回のタイトルとは関係ないんですけど、

大文字のCを押したらシェル実行モードに切り替えてね、という指令なので、

: を押して ! を押すよりもはやいので、個人的に重宝しています（CommandのCです。）

現場からは以上です。

https://twitter.com/geeksugano
【FactoryBot】【trait】を使って、わかりやすくテストデータをつくる



#はじめに

Traitsを使うと、



```ruby:spec/requests/api_spec.rb
 let!(:words_starting_with_ruby) { create_list(:product_suggest, 6, :ruby) }
  let!(:word_starting_with_rails) { create(:product_suggest, :rails) }
  let!(:api_key) { Rails.application.credentials.api[:API_KEY] }
```

上の
> create_list(:product_suggest, 6, :ruby)
や
> create(:product_suggest, :rails) 

の:ruby, :railsといったようにステータスを指定してテストデータを作ることができ、使いやすい。


#定義

```ruby:spec/factories/product_suggests.rb
FactoryBot.define do
  factory :product_suggest, class: "Product::Suggest" do
    trait :ruby do
      sequence(:keyword, "ruby-keyword_1")
    end

    trait :rails do
      keyword { "rails-keyword" }
    end
  end
end
```

>     trait :ruby do
      sequence(:keyword, "ruby-keyword_1")
    end


などのようにステータスごとの内容を定義する。

ちなみに、
> sequence(:keyword, "ruby-keyword_1")

とすると、データ作成毎に末尾の数値がインクリメントする。


###終わりに。
最後まで読んで頂きありがとうございます:bow_tone1:
転職の為、未経験の状態からRailsを学習しております。正しい知識を着実に身に着け、実力のあるエンジニアになりたいと考えています。継続して投稿していく中で、その為のインプットも必然的に増え、成長に繋がるかと考えています。
今現在、初心者だからといって言い訳はできないですが、投稿の内容に間違っているところや、付け加えるべきところが多々あるかと思いますので、ご指摘頂けると幸いです。この記事を読んで下さりありがとうございました。
Gorm2.0でsqlMockに対応する

[Gorm2.0](https://gorm.io/ja_JP/docs/v2_release_note.html)がリリースされて早速アプデしたら、sqlMockへの対応が必要だったので、そちらを紹介します。

```go

import (
	"github.com/DATA-DOG/go-sqlmock"
	"gorm.io/driver/mysql"
	"gorm.io/gorm"
)


db, mock, err := sqlmock.New()

// 2.0以前
mockDB, err := gorm.Open("mysql", db)

// 2.0
mockDB, err := gorm.Open(mysql.Dialector{Config: &mysql.Config{DriverName: "mysql", Conn: db, SkipInitializeWithVersion: true}}, &gorm.Config{})
```

どなたかのお役に立てば幸いです。
bcコマンドを使って、terminal上で簡単な計算機を使う

オッスオッス

今回は簡単に、ターミナル上で簡単な計算をする方法をシェアします。
もちろん rubyとかpythonとかでもできるし、bashでもできるんですけど、
いまいちinteractive強制だったり、bashなんかブサイクすぎて気軽に使うにはちょっとつらいですね？

bcを使うと簡単です

```
$ bc -l <<< "1+1"
```

みたいにやるとreplにならなくても計算できますし、こいつを

```
/usr/local/bin/calc
```
に

```
bc -l <<< $*
```

みたいに書いてやって、実行権限つけてやれば、

```
$ calc 2^2
```

とかやると

```
4
```

とか吐いてくれます。かわいいですね。

現場からは以上です。

https://twitter.com/geeksugano
Rails６でPuma4台をインストールできない問題

事象

Rails6で開発しようとしたところ、以下のエラーが出てしましいpumaのインストールが出来ない状態になってしまいました。


![c9c3e938d2a7417c590c329363879ca3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/683447/a325d2f9-cdde-54e2-e803-05d83d889ced.png)


対処方法

Xcodeの最新バージョンがpumaに悪影響？があるみたいです。
以下のコマンドで無事に解決しました。

![9beb200b0c66704999cf25225db5be0f.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/683447/b25eb79d-30dc-1703-8cb6-4f89d790eb49.png)


無事にインストール出来ました。


![ab7fdd1e066085a0fef399f1fb1340ec.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/683447/46862675-cea7-d690-8e7e-c621ccc81a12.png)
Linux,C言語テストプログラム

C言語で開発をしていると、関数の使い方や一部のコードの挙動を知るために小さなテスト環境が欲しくなるのだが、毎回、書くのが面倒くさいのでメモしておく。

```言語:makefile
CC = gcc
CFLAGS = -g -Wall
OBJS = main.o test.o
TARGET = main
%.o: %.c
	$(CC) $(CFLAGS) -o $@ -c $<
ALL: $(OBJS)
	$(CC) $(CFLAGS) -o $(TARGET) $(OBJS)
clean:
	rm -rf $(OBJS) $(TARGET)
```

```main.c
#include <stdio.h>
#include "test.h"

int main(int argc, char *args[])
{
	test("Test program");
    return 0;
}
```

```test.c
#include "test.h"
#include <stdio.h>

int test(char *data)
{
    printf("%s\n",data);
	return 0;
}
```

```test.h
#ifndef TEST_H
#define TEST_H

int test(char *data);

#endif /* TEST_H */

```
Power Automate HTTPアクション使用時の送信元IPを確認する

Power AutomateのHTTPアクションを使って別サービスにデータ送信する際、相手のサービスが**特定のIPアドレス以外拒否する**ように制限されている事がありますよね。

そんな時は相手のシステムにアクセスを許可してもらうために、Power Automate側の「送信元IP」を確認する必要があります。

送信元IPは[Power Automateのドキュメント「制限と構成」](https://docs.microsoft.com/ja-jp/power-automate/limits-and-config#connectors)の「コネクタ」セクションにリージョン毎に記載されていますので、ここで地域が日本のものを探す事で確定できそうですが、ふと目を移すと次のような注意事項が...

> フローによる一部の呼び出しは、ロジック アプリ ドキュメントに記載された IP アドレスから発信される場合があります。 このような呼び出し例としては、HTTP や HTTP + OpenAPI などがあります。

ふむ。通常は「コネクタ」のセクションにあるIPアドレス一覧が使われるものの、**一部のコネクタはLogic AppsのIPアドレスから送信される**っぽい。

ぱっと見た感じ、今回利用する「HTTPアクション」はLogic Appsが送信元となるようですが「一部の呼び出し」とか書き方がちょっと曖昧なのが気になるので、実際に動かして送信元IPを確認してみることにします。

## 送信元確認のためのフローを作成する

まず最初に[webhook.site](https://webhook.site/)にアクセスして、テスト用のWebhookURLを取得します。
![Webhook.site.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679672/7dd591b3-decd-106f-fb3e-78589ba6788a.png)
※「Webhook.site」はWebhookのデバッグなどに使われる便利サイトです。Webhook.siteについては、[SendGridさんのブログ](https://sendgrid.kke.co.jp/blog/?p=11340)に詳細な説明がありますので、詳しくはそちらをご覧ください。）

次にPower AutomateのTOPページにログインし、左メニューの「①作成」をクリックして「空白から開始」ページを開き、「②インスタントフロー」をクリックします。![インスタントフローを作成.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679672/2b31c0b2-c6cf-8072-bfba-bdb7639d57f2.png)

「インスタントフローを作成」ウインドウが表示されるので、「このフローをトリガーする方法を選択します」から「①HTTP要求の受信時」を選択し「②作成」ボタンをクリックします。![インスタントフローを作成2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679672/5654bc98-65d3-c0fa-3e3d-48b1fce715da.png)

「新しいステップ」をクリックして「HTTP」アクションを探してフロー上に配置し、「①方法（メソッド）」に「POST」を「②URI」にwebhook.siteで取得したテスト用のURLを入力します。
![HTTP要求.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679672/87d1ccde-215a-464f-6a1a-5c7ba89f58f6.png)

最後に保存をクリックして、フローを確定させます。

今回はブラウザーからこのフローを動かしたいので、フローの保存後に再度「HTTP要求の受信時」アクションを開いて、ウインドウ下部の「詳細オプションを表示する」をクリックして開き、「②method」に「GET」を指定します。その上で①URLをコピーして控えておきます。
![HTTP要求をGETに変更.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679672/55d993cb-fb2d-1615-72f5-ddaf41a70ce0.png)

フローの編集画面に戻るので、フローがONになっている事を確認します。（フローがOFFの場合はメニュー上部の「オンにする」をクリックして、フローをONの状態にします。）

## 実際に試してみる

「HTTP要求の受信時」でコピーしたURLをブラウザーのアドレスバーに入力し、実行してみます。

ブラウザーには何も返していませんので空白の表示となりますが、Webhook.siteの方にはフローの結果としてHTTPによるPOSTが行われているはずです。

実際にwebhook.siteを確認してみると、確かにPower Automateで実行されたHTTPリクエストが届いている事が確認できました。
![Webhook.site詳細.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679672/c8b0a324-7666-2ebd-9344-2f062ac3805f.png)
結果の送信元IPは**「13.71.158.3」**。これは想定通りPower Automateのドキュメントではなく[Logic Appsドキュメント](https://docs.microsoft.com/ja-jp/azure/logic-apps/logic-apps-limits-and-config#outbound-ip-addresses)内の「送信 IP アドレス」セクションに記載の送信IPアドレス（東日本リージョン）です。

やはりこの「HTTP」アクションは、Logic AppsのIPアドレスから送信されるようです。
（※2020/9/2時点のドキュメントによる確認。送信元IPは都度変更されていくと思われますので、正式なIPについては最新のドキュメントをご確認ください。）

## まとめ

Power AutomateはもともとLogic Appsが元になっているそうなので、ベースとなる「フローからの呼び出し」はLogic Appsから直接行い、フロー内の「コネクタ」からの呼び出しはPower Automateから行われている、という事かなと想定はしましたが、ドキュメントを読んだだけでは確信が持てなかったので、実際に確認してみました。

Power AutomateとLogic Appsの関係性、内部的な処理の想定がついていれば検証せずとも自明な事かも知れませんので、サービスの成り立ちなども含めて、もう少し深く掘り下げて学ぶ必要がありそうです。
sedで&を含む変数をワンライナーで変換するときのエスケープのお話

# 目的
- 数字実体とか&を含む文字列をsedで変換したい時があります。
- このねたはかなりネットに情報があるので新規性はないのですが、きっとまた忘れるのでじぶんのために書いておきます

# コード
- いきなりコードです。

```{bash}
# h=1.5mの数字実体です
hoge="h&#61;1&#46;5m"
```
```{bash}
# 変数を埋め込むための特定の文字列（例えば%1)をファイルに埋め込みます
cat << EOF > fuga
高さは%1
EOF
```

```{bash}
# コードです
cat fuga | sed 's|%1|'$( sed "s|\&|\\\&|g" <<< $hoge)'|'
高さはh&#61;1&#46;5m
# うまくいきました
```
- これをHTMLでそのまま表示させると数字実体は文字に変換されて人に優しい情報に変換されます。
- 
### 解説

- このワンライナーはsedを二重で使っているのですが、一つ目のsedの置換後の文字列を変数$hogeから`&`をエスケープします
- ちなみに`<<<`は変数をコマンドに渡すbash機能です。
- `sed`は変換後の文字指定に`&`があると変換前の文字列を参照します。そのため`\&`とエスケープする必要があります。
- ただし、参考文献の場合は直接変換なので`\\&`を２つでいいのですが、今回は`$()`の中でsedを使っているので`&`のエスケープは`\\\&`とひとつ多くしなければなりません。
- それと`'`と`"`を使い分けて混乱がないようにしています。
- 数字実体は、shellでコマンドインジェクションの脅威を減らすとか、ユーザ入力の不定形な文字列であってもホワイトスペース区切りとできるのでcgiにもちいるには便利です。
- shell系の知識は数十年有効だったしきっとこれからもそうでしょうから、どんな言語よりも教育コストが低いのかもしれないなと思うこの頃です
 
# 参考文献
[sed で変数に代入されている&等のメタ文字のエスケープ処理を行いたい](https://teratail.com/questions/90197)
色々な関数の書き方 【JavaScipt】

###どれも結果は同じなのに、関数の記法は実に色々。 
###混乱していた所、とても良い教材と巡り合った。 以下、ざっと一覧。



```javascript

  //関数宣言
  function double(x) {
    return x * 2;
  };

  //関数式
  const double = function (x) {
    return x * 2;
  };

  //アロー関数 function 省略
  const double = (x) => {
    return x * 2;
  };

  //アロー関数 引数が1つのときは()省略
  const double = x => {
    return x * 2;
  };

  //アロー関数 {}省略
  const double = x => x * 2;

```

###アレンジ--引数が2つver.

<details><summary></summary><div>

```javascript
  //＝＝＝＝＝＝＝三角形の面積＝＝＝＝＝＝＝＝＝＝＝＝＝//

    //  (底辺 × 高さ / 2) 

  function triangle(a, b) {//関数宣言
    return a * b / 2;
  }
  
  const triangle = function (a, b) {//関数式
    return a * b / 2; 
  }
  
  const triangle = (a, b) => {  //アロー関数 functionを省略
    return a * b / 2; 
  } 
  
  const triangle = (a, b) => { //引数が2つなので、()は要
    return a * b / 2;
  }
  
  const triangle = (a, b) => a * b / 2;//1行のときは、波括弧{}省略
  
  console.log(triangle(3, 4));  // => 全て「6」

```
</div></details>

###ピタゴラス（三平方の定理）

<details><summary></summary><div>

```javascript
  //＝＝＝＝＝＝ ピタゴラス ＝＝＝＝＝＝＝＝＝＝＝///

  //  a2乗 + b2乗 = c2乗 //
  
  function PythagoreanTheorem(a, b,) {
    return a** 2 + b** 2 
  }
    console.log('C = ' + PythagoreanTheorem(3, 4)); //　=> C = 25
```
</div></details>
####尚、どれを使うかは、開発現場によるとのこと。

<b>[参考:しまぶーのIT大学] https://www.instagram.com/p/CAHEsTsDg2U/
500が返ってきても許せるかもしれない...HTTPステータスにちなんだ動物の画像を返してくれるサービス

## HTTPステータスにちなんだ猫画像を返してくれるWebサービス

先日こんなツイートをしました。
猫が好きなので、一目惚れした結果です。

https://twitter.com/shinshin86/status/1298883373000093697

こちらのサイトですが、`HTTP Cats`というサービスになります。

https://http.cat/

Qiitaを利用されている皆さんであれば、こちらのサイトに飛んでもらえればすぐに内容は理解してもらえるかと思いますが、HTTPステータスにちなんだ猫画像を返してくれるWebサービスになります。
HTTPステータスの意味を考えながら画像を見ると、ジワジワきます笑。

アカウント登録などは不要で、URLを叩けば猫画像が返ります。

```
https://http.cat/500
```

このURLを叩くと、 `HTTP Status: 500` にちなんだ画像が返ります。
どんな画像かは実際に叩いて見てみてください。

ちなみに末尾に".jpg"をつけてもOKです。
こういう挙動は地味にありがたいものです。

```
https://http.cat/500.jpg
```


なお、こちらのサービスはGitHub上でソースコードが公開されています。

https://github.com/httpcats/http.cat

私はこういうサービスがあることを知らなかったのですが、なるほど、これはシンプルでわかりやすく、実に良いアイデアだと思いました。
そこで他の動物もあるのではないかと思い、検索してみました。

ありました。

## HTTPステータスにちなんだ犬画像を返してくれるWebサービス

`HTTP STATUS DOGS` というサイトです。

https://httpstatusdogs.com/

なお、先ほどの猫HTTPサイトとは仕様が異なるので、そこだけ注意が必要です。

例えば、204ステータスを返したい場合は下記のように入力します。

```
https://httpstatusdogs.com/204-no-content
```

また下記のURLでもアクセスは可能ですが、その場合、
上のURLに302リダイレクトがかかり、転送されます。

```
https://httpstatusdogs.com/204
```

## その他のサービスについて

と、ここまで探してみましたが、意外と類似サービスってないもんですね。。。
他にも鳥とか車で探してみましたが、それっぽいものは見つかりませんでした。

ご存じの方がいましたら教えていただけると幸いです。