OmniAICreator/Qiita-1.07M huggingface dataset:
自己署名SSL証明書を使っているOpenStack環境にてOpenShiftをデプロイするには

# 前提

OpenShift v4.2では不可能。自己署名証明書を組み込んだOpenStackはサポートされていない。
OpenShift v4.3を使う必要がある。
※今後v4.2にバックポートされる可能性はあると思う

# 理由

OpenShift on OpenStack構成をUPIでデプロイさせる場合、CoreOSのブートの際に使用するIgnition ConfigはSwiftに配置される。
CoreOSがブートする際、外部からのCA証明書の追加がサポートされていないため、Swiftから読み込むことができない。

v4.3ならばCA証明書をUserData経由でCoreOSインスタンスに渡し、CoreOSはそのCA証明書を読み込むことができる。結果、SwiftからIgnition Configを読み込むことができる。

## 事象

前述の通り、SSL証明書エラーにより、SwiftからIgnition Configを読み込むことができない。
具体的には以下のような形。

1. `openshift-install create cluster`を実行
1. bootstrap-nodeやmaster-nodeが作成される
1. 全ノードで`x509: certificate signed by unknown authority`というエラーを出力され、ブートできない状態が続く
	* 各ノードインスタンスのコンソール画面で確認可能

# 環境

* OpenShift v4.3.3

# 方法

openshift-install create clusterするときに読み込む`clouds.yaml`にCA証明書を追加する。
ベースとなるclouds.yamlはHorizonから生成するのが楽。

```clouds.yaml
clouds:
  openstack:
    auth:
      auth_url: https://[keystone_fqdn]/v3
      username: [username]
      password: [password]
      project_id: [project_id]
      project_name: [project_name]
      user_domain_name: [user_domain_name]
    region_name: [region_name]
    interface: "public"
    identity_api_version: 3
    cacert: [/path/to/ca.crt.pem]  <-- コレを追加
```

自己署名証明書を使っている以上、CA証明書は持っているはず。それをローカル環境内に持ってきて、そのパスを指定させるだけ。
あとは勝手にそのCA証明書を読み込んでCoreOSが構成されてくれる。
もちろん、その後SwiftからIgnition Configを読み込み、コンフィギュレーションが進む。
CA証明書を読み込む過程は、ノードインスタンスのコンソール画面から確認可能。
うまくいっていれば、下記のようなログが記録されているはず。

```
[    7.401392] ignition[983]: Adding "hogehoge.example.local" to list of CAs
```

## 注意

`additionalTrustBundle`を使って証明書を渡す方法もある。確かにこれでもCoreOS側にCA証明書が渡すことができる。
しかし、OpenShift環境全体にそのCA証明書が行き渡っていないらしい。
そのため、その後のOpenShiftのコンフィギュレーション過程でエラーが発生する。私の環境では、consoleやingressなどが正しく起動しなかった。
※`oc get clusteroperator`してみると、それらがAVAILABLEにならない

## おまけ: install-config

参考程度に検証時に使用したinstall-config.yamlを置いておく。
といっても変わったところは全くない。openshift-install create install-configした情報そのまま。

```install-config.yaml
apiVersion: v1
baseDomain: [domain]
compute:
- hyperthreading: Enabled
  name: worker
  platform: {}
  replicas: 3
controlPlane:
  hyperthreading: Enabled
  name: master
  platform: {}
  replicas: 3
metadata:
  creationTimestamp: null
  name: [openshift_cluster_name]
networking:
  clusterNetwork:
  - cidr: 10.128.0.0/14
    hostPrefix: 23
  machineCIDR: 10.0.0.0/16
  networkType: OpenShiftSDN
  serviceNetwork:
  - 172.30.0.0/16
platform:
  openstack:
    cloud: openstack
    computeFlavor: [flavor_name]
    externalDNS: null
    externalNetwork: [external_nw_name]
    lbFloatingIP: [floating_ip]
    octaviaSupport: "0"
    region: ""
publish: External
pullSecret: [pull_secret_json]
sshKey: |
  [ssh_key_pem]
```


# 参考

本当に助かりました。ありがとうございました。

* [https://bugzilla.redhat.com/show_bug.cgi?id=1735192](https://bugzilla.redhat.com/show_bug.cgi?id=1735192)
BEMとは

##BEM
多くの開発者が取り入れているCSS設計(CSSを記述する時のルール)です。BEMは、厳格なクラスの命名規則が特徴です。BEMはBlock、Element、Modifierの頭文字を取ったもので、ページを構成する要素をBlock、Element、Modifierのどれかに当てはめてクラスを命名します。
##クラスの命名が簡単になる
Block、Element、Modifierのみでクラスを命名することで、クラス名に悩むことがなくなります。
##要素の再利用がしやすくなる
共通の要素を別の場所で再利用しようとしても、要素がHTMLに依存していると同じCSSを2つ書かなければなりませんでした。しかし、BEMを使用することで、クラスの命名がHTML構造に依存しなくなります。
HTML構造に依存しないことで、要素の再利用がしやすくなります。
##Block
ある要素の大元となるブロック要素です。Blockの命名には名詞を使用します。ElementやModifierは、Blockを起点に命名されます。
##Element
Blockに属する子要素です。1つ以上のElementによって、Blockは構成されています。Elementの命名には名詞を使用します。
##Modifier
Blockまたは、Elementに特別な修飾をする要素です。Modifierの命名には形容詞を使用します。
##命名規則
BlockとElementをつなぐ場合は、アンダースコア2つでつなぎます。
Modifierにつなぐ場合は、ハイフン2つでつなぎます。
【例】

```XXXX.html
nav class='HeaderNav'>
  <ul class='Menu'>
    <li class='Menu__list'>TOP</li>
    <li class='Menu__list'>CONTACT</li>
    <li class='Menu__list Menu__list--backBlack'>ABUOT US</li>
    <li class='Menu__list'>SERVICE</li>
   </ul>
</nav>
```
navはヘッダーのナビゲーションメニューなので、クラス名をHeaderNavとしました。
このようにクラス名の単語数が2つ以上の場合はキャメルケースまたはスネークケースでつなぎます。
ulはheader-navの子要素ですが他のヘッダーメニュー以外の部分でも使用したいので、クラス名をMenuとしました。
liはMenuの子要素なので、クラス名をMenu__listとしました。
liのうちABOUT USだけは背景色を黒くしたいので、クラス名をMenu__list--backBlackとしました。
Modifierはこのように特定の部品を修飾したい時に使用します。
上記に対したSass

```XXXX.scss
.Menu {
  list-style: none;
  &__list {
    background-color: #3BD1EC;
    color: #FFF;
    float: left;
    font-size: 30px;
    padding: 2% 1%;
    text-align: center;
    width: 23%;
    &--backBlack {
      background-color: #000;
      color: #3BD1EC;
    }
  }
}
```
Modifierを使用した部分だけ背景色を黒くできました。
githubのプロジェクト保守手順（個人用）

なんか毎度バージョン更新の手順が思い出せなくなるので、備忘録。

注意点： 開発時には、ローカルdevelopブランチのpackage.jsonのバージョンは変更しないこと！（これをいつも忘れるから面倒になる）

ローカル作業中のdevelopブランチをmasterへマージ:

```
$ git add .
$ git commit -m "Modified by some enhancements and fixed bugs"
$ git checkout master
$ git pull origin master
$ git merge develop
```

で、プロジェクトのバージョンを更新して、npmパッケージを更新:

```
$ npm version minor
$ git tag
$ git push origin tags/{TagName}
$ git push origin master
$ npm publish ./
```

これで完了。

更新するバージョン番号は、`{major}.{minor}.{patch}`というフォーマットなので、更新する番号位置によって`npm version {ver position}`と切り替える。

※ masterブランチのpushを忘れていたので追加したが、冗長なので、ブランチとタグを一緒にpushする、

```
$ git push origin --tags
```

の方がいいかもしれん。

もし、package.jsonのバージョン番号を手動で書き換えたりしてて、バージョンtagが飛び石になってしまったら、コミットを取り消し、タグを消してから、package.jsonのバージョンを元に戻す。そしたら、npmコマンドをやり直す。

```
$ git log -2
$ git reset --hard {CommitHash}
$ git tag -d {TagName}
```

最後に、developブランチを最新masterに追従させておく。

```
$ git checkout develop
$ git merge origin master
$ git push origin develop
```

以上。
MACで消し飛ばした管理者権限を復活させる方法

初投稿です。
自分の備忘録的に記載します。

# MAC OS High Sierra で管理者権限を消し飛ばした話

個人所有のMacでやった話  
業務関係ないですが、知見としてのこしておきます


## ■起こったこと■

MAC端末の管理者権限を持っているのが1アカウントだけでした。   
↓  
出来心で、「ユーザー名かーえよ」っと思って変更しました。  
なんか警告は出ましたが、読まずにOKしました。~~ばか。~~  
↓  
権限を失いました。以上。 

管理権限を持っているユーザーがいなくなったため、権限の再付与ができない。  
各種ソフトウェアの導入もできない  
設定変更もできない　という状態に陥りました。  

~~Youtubeが見れるだけの箱と化しました。~~  

## 対処方法  

以下の対処を実施することで権限が復活します。  

### 手順

１．シングルユーザーモードで起動。  

```
Command+Sを押しながらMacを起動
```
2．コマンドラインで以下のコマンドを実行  

・読み書き可能な権限でファイルマウント

```
mount -uw /
```

・MACの初期設定ファイルを削除し再起動

```
rm /var/db/.AppleSetupDone
reboot
```

上記を実施すると、Macの初期設定ウィザードが現れ、アカウントの再設定が行えるようになります。  
Mac自体がリセットされてしまったわけではなく、「初期設定が終わっている」ということをMacが忘れてしまった （意図的に忘れさせた）だけであり、データ消失の心配はないです。  
ただ、僕はこの手順だけでは復帰できませんでした。
 

### 上記コマンドが失敗したら
  
rmコマンドを実行後、以下のエラーが出る場合があります。 
```
rm /var/db/.AppleSetupDone: No such file or directory
```
セットアップファイルが見つけられなかった旨のエラーです。  
これが出たら、自分でセットアップファイルがあるdirectoryまで移動して  
削除をする必要があります。  

・ボリュームに移動してlsで内容確認
全てのボリュームが確認できます。

```
cd /Volumes

ls -l 
```
・MACのHDに移動し、データファイルがあるdirectoryに移動  
　基本的に、ここにセットアップファイルがあるはずです。

```
cd Macintosh\ HD

cd var/db
```
・lsコマンドで　.AppleSetupDone file　があるのを確認したら、それを削除

```
ls -la 

rm .AppleSetupDone
```
・再起動

```
reboot
```
これで、初期設定画面が表示されるはずです。
新たに管理者権限を持つユーザー(Administratorなど)を作成し、  
そちらでログインして管理者権限を消してしまったユーザーに  
権限を付けます。  

以上で、再設定の作業は終了です。
【AppStoreConnect】分かりそうで分からないAppステータスレポート(変更メール)の受け取り方

# 概要
App Store上のアプリのステータスが変更された時にSlackと連携したいなと思った時に
そもそもメールが来てないことに気付きました。
このメールが来る様にしたいんだけど、実際にどこいじったら来るのか分からなかった。

# 備考
変更するにはもしかしたらApp Store Connect上である程度の権限が必要かもしれません。

# 設定方法
## 「ユーザとアクセス」をクリック
![スクリーンショット_2020-03-16_15_35_36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11800/498621fc-aa17-64a4-b669-3a5e7856899c.png)

## 自分のセルをクリック
![スクリーンショット_2020-03-16_15_36_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11800/83c040ed-0a6e-7297-4f23-09632134cd89.png)

## 「App ステータスレポート」の選択肢を
![スクリーンショット_2020-03-16_15_36_15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11800/71a6afdb-bbad-06c9-fa91-bb5df1cacefe.png)

## 「はい」に変更
![スクリーンショット 2020-03-16 15.36.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11800/74916df0-8359-16b8-e866-5715ac0d5f4c.png)

誰かのお役に立てば。
【cluster】ワールドをアップロードするとき、Sceneにゴミがあって怒られる場合

練習ワールドをアップロードする際によく起こる事例かと。
アップロードするとき、「Scene上にMainCameraを配置しないでください」とか怒られると思います。
んなわけねぇ、置いた記憶にございません、という場合は、ヒエラルキーウィンドウで検索しましょう。

<img width="1126" alt="a01.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191635/2c61e64b-a5f7-2674-bffc-8196392dc24c.png">

下図:検索したら、いた
<img width="370" alt="a02.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191635/ce01f78a-6f9e-aad8-294f-1f0e9bf98b94.png">

あとは、怒られるオブジェクトを使用不可にしていけばOK。
mysql 外部サーバーからアクセス


外部からのアクセスを許可するために、設定ファイルを編集

```
$ sudo -e /etc/mysql/mysql.conf.d/mysqld.cnf
```

下記の行をコメントアウトする
> bind-address = 172.0.0.1

再起動

```
$ sudo service mysql restart
```

ポートを開放 (デフォは3306)

```
$ sudo apt-get install ufw
$ sudo ufw allow 3306
```

mysqlにログインして、外部から接続できるユーザを作る。
例：username: public password:publicの場合

```
mysql> grant all privileges on *.* to public@"%" identified by 'public' with grant option;
mysql>  select user,host from mysql.user;
```

設定したuserのhostが％になっていればOK
+------------------+------------+
| user             | host       |
+------------------+------------+
| public           | %          |


クライアントは今回windowsで、MySQL Workbenchを入れた
無事表示できた
1行追加のみ! Net::HTTPで発生するcertificate verify failedを回避

# 外部APIを叩くのに、Docker使っていたらエラーが発生

`SSL_connect returned=1 errno=0 state=error: certificate verify failed (self signed certificate in certificate chain)`

原因を調べるのに疲れた。
ローカル環境のみで発生するので真面目に対応するのも面倒。
本番はDocker使ってないし。
楽できる方法、探した。

## 解決策1

config/initailizersのファイルに以下を追記する。

```
OpenSSL::SSL::VERIFY_PEER = OpenSSL::SSL::VERIFY_NONE if Rails.env.development?
```
参照:[Rails5 devise twitterソーシャルログイン ローカル環境でのエラー解消](https://qiita.com/r_ishimori/items/c82a27ed2448dfae14a2)

ただ、これだと、
 ・サーバー再起動が必要
 ・ローカル環境のログで`already initialized constant OpenSSL::SSL::VERIFY_PEER`的な警告がうざい
というデメリットがある。

もっと楽、したい。
テキトーに生きたい。

## 解決策2

```rb
  def api(url)
    uri = URI.parse(url)
    req = Net::HTTP::Get.new(uri)
    http = Net::HTTP.new(uri.host, uri.port)
    http.use_ssl = (uri.scheme == 'https')
    http.verify_mode = OpenSSL::SSL::VERIFY_NONE # これ追加。
    res = http.start { |h| h.request(req) }

    JSON.parse(res.body)
  end
```

1行追加で動いた。
テキトーにif分岐追加しても1行で済む。
【Day29】積み上げ日記

##予定
○くりのすけさんnote②③④

##完了
○くりのすけさんnote②③④

##学習時間
５h

##学習ポイント
○擬似要素 (::before  ::after)
－CSS上でHTMLの変更ができる。
－HTMLだとSEOに関わるため、CSSで入力するとSEOにひっからなくなる。
－HTMLの一部分だけ色を変えたい時や大きさを変えたい時は便利

○object-fit: cover
－画像を中央の位置でトリミングする

○remって？

○z-index
－背景画像や色を重ねる時に、一番上に表示するものを指定するときに使う

○figure

##疑問点
○timeタグ？
○figure と p の違いは？
○li の点をなくすには？
○擬似要素？
○position: absolute？
○z-index？


##計画通り進んだか？
進んだ。悩んでいる時間が多かったので、悩んでいることを一旦紙に書き出し、あとで隙間時間でインプットするようにする。わからないところを増やしていくためにも、スピード感持って取り組む！

##参考にしたサイト
○object-fit
https://www.webcreatorbox.com/tech/object-fit
【Day28】積み上げ日記（※追記あり）

＜予定＞
○Airbnbサイト模写完成

○くりのすけさんnote①

＜完了＞
○Airbnbサイト模写完成

○くりのすけさんnote①

＜学習時間＞
5h

＜学んだところ＞
○justify-content: space-between
→ロゴとナビメニューをそれぞれ両端に寄せる

○align-items: center
→コンテンツを上下中央に寄せる

○CSSで装飾していく時は、誰がマネジメントしているか（親要素と子要素）を確認して指定する。

＜計画通り進んだか？＞
進んだ。
だが、時間を使いすぎ。何に時間を使っているかというと、模写を進めながら「このコードを入力したらどうなるんだろう」と本来予定していた道から横に外れて、スピード感が遅くなってしまう。もっと効率よくするには、本質はどこにあるのか。これを見失わないようにする！

#追記

記事更新を1週間ロスしていました。理由は日記を書く時間をプログラミングの時間にあてたほうがいいのではと思ったからです。
しかし、この日記を書くことによって、以下のメリットがあるのではないかと思いましたので、今後も更新をできる限り継続したいと思っています！

**①成功体験を”見える化”できる**
**②継続する力を養える**
**③これからプログラミング学習する方のロールモデルになれる（かも？笑）**
Tomcatにおける非同期処理の実装

# Tomcatにおける非同期処理

## はじめに

Webアプリケーションでは、クライアントからのHTTP要求に対して長時間を要する処理を行うとHTTP応答がタイムアウトになり、HTTP要求を正常に受け付けられたかどうかを確認しづらくなります。また、長時間を要する処理をバックグランドで行う場合でも、非同期タスクの同時実行数を制限しなければ、スレッド数がどんどん増え運用環境の資源が枯渇すると、動作不能に陥るおそれがあります。

Tomcatコンテナ上で動作するTomcatアプリケーションで、下図のように長時間を要する処理を非同期で呼び出す方法を考えます。

![非同期処理の流れ](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33023/a22a6f50-92d3-7ede-8c8f-5c39198ad10d.png "非同期処理の流れ")

**図1 非同期処理の流れ**

図1では、Tomcatコンテナの中にController、Service、Entityの3つがあります。クライアントからHTTP要求が来たときに、Tomcatコンテナを介してControllerからServiceを非同期で呼び出しています。非同期呼び出し後に、すぐクライアントへHTTP応答を返せるため、HTTP要求を受け付けたのかそれとも拒否したのかをクライアントへ通知できます。非同期タスクの実行状況をEntityへ反映しておけば、後から別のHTTP要求を出してその実行状況を確認できます。

非同期呼び出しの実装にあたっては、冒頭で述べたとおり非同期タスクの流動制御が必要ですが、ここで知っておきたいのは、アプリケーションが「適当に」スレッドを生成するのは推奨されていない点です。なぜなら、アプリケーションが生成したスレッドをTomcatコンテナやJava EEコンテナが認識しないため、スレッドのライフサイクルを適切に管理できなくなるためです。そこで、スレッドの個数やライフサイクルなどの管理を行う仕様である[「Concurrency Utilities for Java EE（JSR 236）」](https://javaee.github.io/tutorial/concurrency-utilities.html)が提唱され、Java EE 7に導入されました。

TomcatコンテナはJava EEコンテナのサブセットのようなものであり、JSR 236をサポートしているわけではありませんが、Spring Frameworkを導入すればスレッドのライフサイクル管理ができるようになります。ここでは、Spring Frameworkを活用した「**シングルテナント対応**」および「**マルチテナント対応**」の非同時処理の流動制御の実装方法を考えていきます。

## 記事構成

この記事は3つの記事で構成しています。

- 「Tomcatにおける非同期処理の実装」←この記事
  - 「[Tomcatにおけるシングルテナント対応非同期処理の実装](https://qiita.com/sipadan2003/items/3277024b7da63c844663)」
  - 「[Tomcatにおけるマルチテナント対応非同期処理の実装](https://qiita.com/sipadan2003/items/52e98b75195896cb4904)」

## サンプルソース

この記事で作成したソースコードは、[GitHub](https://github.com/sipadan2003/web01)にあります。

## まとめ

- シングルテナントの場合
  - 非同期メソッドとリクエストが1対1の対応なら、Spring Frameworkの機能で対応可能
- マルチテナントの場合
  - 非同期メソッドとリクエストが1対多の対応なら、自前でスレッドプールとそのライフサイクルを用意する必要あり
AIのビジネス活用事例まとめ

Webで見かけたAI/MLのビジネス活用事例をまとめていく。



【2020年版】課題から探す機械学習の最新事例52選
https://sorabatake.jp/11124/




＜参考図書＞
業界別! AI活用地図 8業界36業種の導入事例が一目でわかる (AI&TECHNOLOGY)


# 小売業
AWS 事例ポータル
https://aws.amazon.com/jp/local/retail/

https://dev.classmethod.jp/news/200701-prismatix-webinar/?fbclid=IwAR3hRp1bxqvBtc6gPVAGkkgnWF7lFip0AvXf0prir1PUkEzQM-MUqB23soE

Amazon Advertisement
https://pytorch.org/blog/amazon-ads-case-study/
Metaとの協業。Pytorch利用

# 金融
AWS 事例ポータル
https://aws.amazon.com/jp/financial-services/

【2020年度版】世界の注目FINTECHベンチャーをまとめてみました。
https://techgym.jp/?p=963

Financial Services Industry Lens
https://d1.awsstatic.com/whitepapers/architecture/wellarchitected-Financial-Services-Industry-Lens.pdf

FinTech Journal
https://www.sbbit.jp/fj/

金融業でのAI活用事例5選「返済を延滞する人を予想」ほか
https://ledge.ai/eg-ai-case-0815/

# ゲーム
ロマサガ RU
https://pages.awscloud.com/rs/112-TZM-766/images/I3-04.pdf

Amazon Game Tech Night #22 AWSにおけるゲームデータの分析と活用
https://www.slideshare.net/AmazonWebServicesJapan/amazon-game-tech-night-22-aws-238801221
AWS SAMを使ってLambdaにLayer設定する方法

# AWS SAMを使ってLambdaにLayerを設定する方法

## はじめに

AWS SAMでLambdaやdynamoDBを使ったサーバーレスアプリケーションを構築しているといろいろなプロジェクトで共通で使っているコードがでてきたりします。  
共通化できるものはさっさと共通化して必要なときに呼び出しができるようになると便利なのでさっそく実践してみました。  

AWS LambdaにはLayer機能があり、Lambdaのコードで使いたいライブラリなどを設定する事ができます。  
Layerに依存関係のあるコードやライブラリをAWS SAMのプロジェクトとしてまとめて設定する方法を調べてやってみました。  

Layerに必要なライブラリをZipでまとめてS3に保存して、AWSコンソールから設定する方法はいくつか見つけましたが、AWS SAMのプロジェクトとしてまとめてdeployする方法がなかなかうまくできなかったので備忘録として書いておきます。  

## 前提条件

AWS SAM CLIのインストールはすでに済んでいるものとして説明します。  
今回の説明ではPython3.6を使っています。  

## ディレクトリ構成

Layerとして使いたいコードやライブラリなどを格納するディレクトリは言語ごとに決められています。  
[AWS Lambda ライブラリの依存関係をレイヤーに含める](https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/configuration-layers.html#configuration-layers-path)  

pythonなら`python`か`python/lib/python3.6/site-packages`に格納しておかないと下記のような参照エラーが表示されます。  

```info
Unable to import module 'app': cannot import name 'layer_code'
```

`sam init`コマンドで作成したSAMプロジェクトにLayerを格納するディレクトリを追加します。  

```tree
sam-app
├── README.md
├── app
│   ├── __init__.py
│   ├── app.py
│   └── requirements.txt
├── events
│   └── event.json
├── layer                       // ここにLayer格納用ディレクトリを追加
│   └── python                  // 言語名ディレクトリ
│       └── sample
│           └── sample_layer.py   // Layerとして使いたいコード
└── template.yaml
```

## template.yamlの書き方

```template.yaml
  HelloWorldFunction:
    Type: AWS::Serverless::Function
    Properties:
      FunctionName: hello-world-sample-function
      CodeUri: hello_world/
      Handler: app.lambda_handler
      Runtime: python3.6
      Layers:
        - !Ref LayerSampleLayer     # ポイント1
      Events:
        (省略)

  # Layer定義
  LayerSampleLayer:
    Type: AWS::Serverless::LayerVersion
    Properties:
      LayerName: layer-sample-layer
      Description: Hello World Sample Application Resource Layer
      ContentUri: layer              # ポイント2

```

template.yamlの書き方のポイントは2つです。  

1. Lambda関数定義に`Layers`の項目を追加してLayer定義を参照するように設定する  

2. Layer定義ではLayerのコードを格納しているフォルダパスを設定する  
  →正確には言語名ディレクトリの親ディレクトリを設定する

## app.pyでのimport

template.yamlでLayer設定をしておくとapp.pyと同一階層にあるものとして使えるようになります。  
ただ一度`sam build`を行わないと設定は反映されません。  

```app.py
# レイヤーとして追加したファイルを参照する
from sample import sample_layer

def lambda_handler(event, context):
    res = sample_layer.hello()
    return res

```

```sample_layer.py
def hello():
    return "hello Layer!"
```

## 参考

[AWS サーバーレスアプリケーションモデル (AWS SAM) とは](https://docs.aws.amazon.com/ja_jp/serverless-application-model/latest/developerguide/what-is-sam.html)  
[AWS Lambda レイヤー](https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/configuration-layers.html#configuration-layers-path)
Chatworks APIでタスクをGoogleTaskにコピーする

こんなもんQiitaの有志たちが先に投稿しまくっとるわ！と思いつつも学習メモとして投げておきます。

#Chatworkからタスクを取得
```javascript:chatwork.gs
function GetCWTasks() {
  // プロパティ値取得
  const token = PropertiesService.getScriptProperties().getProperty('CW_TOKEN');
  
  // パラメータセット
  var params = {
    headers : {"X-ChatWorkToken" : token},
    method : "get"
  };
  
  // 自分の情報を取得する
  var url = "https://api.chatwork.com/v2/my/status";
  
  // JSON形式で取得
  var strRespons = UrlFetchApp.fetch(url, params);
  var json = JSON.parse(strRespons.getContentText());
  
  // エラーのある場合
  if (json['errors']){
    Logger.log("ChatWorkタスクの取得に失敗しました。");
    return null;
  }
  
  // 未完タスクがある場合
  if (json['mytask_num'] > 0){
    
    // タスク一覧
    url = "https://api.chatwork.com/v2/my/tasks";
    
    // JSON取得
    strRespons = UrlFetchApp.fetch(url, params);
    json = JSON.parse(strRespons.getContentText());
    
    // タスク取得
    return json;
  }

  return null;
}
```

トークンはプロジェクトのプロパティに書き込んであるのでそれを取得するようにしてます。
トークンの発行方法については[公式のドキュメント](https://developer.chatwork.com/ja/)にあるのでそちらを参照。

#Googleタスクに追加
```javascript
function AddGoogleTask(task) {
  //UNIXTime(秒)->Date(ミリ秒)変換
  var limitDate = new Date(task['limit_time'] * 1000);
  
  var task = {
    title: task['room']['name'],
    notes: task['body'],
    due: Utilities.formatDate(limitDate, "GMT", "yyyy-MM-dd'T'HH:mm:ss'Z'") 
  };
  
  // Googleタスク登録
  var taskListId = PropertiesService.getScriptProperties().getProperty('LIST_ID');
  var res = Tasks.Tasks.insert(task, taskListId);
  
  if (res.id != null){
    Logger.log("TaskID: " + res.id);
  } else {
    Logger.log("タスク書き込みエラー");
  }
}
```
GASエディタのメニューのリソース＞Googleの拡張サービスから「Tasks API」を有効にしておきます。
Chatworks側で取れる日付がUNIX時間なのでGoogleTaskに合わせてISO 8601形式に変換して登録する必要があります。
エラー処理は適当です…:sweat_smile:

#問題が発生
なんとChatwork側で期限時間を指定してるのに…GoogleTaskには設定する場所がない！
よくみたらGoogleTask側には開始時間の設定項目がありますが、
Chatworkのタスクの時間は期限なので意味合いが異なりますね…:cold_sweat:
（こういうの作る前に気づくべきなのに～～！）

あとは書き込み済みのChatworkタスクのIDをスプレッドシートに書き込んで保存しておくような仕組みも必要ですが、
時間はとりあえず置いといてタスクを一箇所に収集しておきたい方にはいいかもしれません。

…さて自分のタスク管理はどうしようかな。
Go言語のdelve  でブレークポイントを設定してデバッグ実行する ( #go / dlv cli / dlv debug / set break point and debug with single go lang file )

# ファイル

こんなファイルがある場合

```go
package main

import (
	"fmt"
)

func main() {
	fmt.Println("A")
	fmt.Println("B")
	fmt.Println("C")
	fmt.Println("D")
	fmt.Println("E")

	foo()
}

func foo() {
	value := "FOO"
	fmt.Println(value)
}
```

# delveの実行


go run みたいにファイル名を指定して実行する

```
dlv debug go/dlv/main.go
```

# ブレークポイントの指定

ファイル名+行数指定で3つのブレークポイントを指定してみる

例: `break main.go:9`

```
(dlv) break main.go:8
Breakpoint 1 set at 0x10c23af for main.main() ./go/dlv/main.go:8
(dlv) break main.go:10
Breakpoint 2 set at 0x10c2485 for main.main() ./go/dlv/main.go:10
```

# 実行

continue すると、ひとつずつ進める！
ブレークポイントの残りがなくなり、スクリプトが処理を完了すると、終了する。

```
(dlv) continue
> main.main() ./go/dlv/main.go:8 (hits goroutine(1):1 total:1) (PC: 0x10c23af)
     3:	import (
     4:		"fmt"
     5:	)
     6:
     7:	func main() {
=>   8:		fmt.Println("A")
     9:		fmt.Println("B")
    10:		fmt.Println("C")
    11:		fmt.Println("D")
    12:		fmt.Println("E")
    13:
(dlv) continue
A
B
> main.main() ./go/dlv/main.go:10 (hits goroutine(1):1 total:1) (PC: 0x10c2485)
     5:	)
     6:
     7:	func main() {
     8:		fmt.Println("A")
     9:		fmt.Println("B")
=>  10:		fmt.Println("C")
    11:		fmt.Println("D")
    12:		fmt.Println("E")
    13:
    14:		foo()
    15:	}
(dlv) continue
C
D
E
FOO
Process 54908 has exited with status 0

```

# 再実行

restart で最初から実行できる！

```
(dlv) restart
Process restarted with PID 54942

```

ブレークポイントをすべてクリアする

```
(dlv) clearall
Breakpoint 1 cleared at 0x10c23af for main.main() ./go/dlv/main.go:8
Breakpoint 2 cleared at 0x10c2485 for main.main() ./go/dlv/main.go:10
```

function + 行数指定でブレークポイントを設定する

```
(dlv) break foo:2
Breakpoint 3 set at 0x10c2616 for main.foo() ./go/dlv/main.go:19
```

```
(dlv) continue
A
B
C
D
E
> main.foo() ./go/dlv/main.go:19 (hits goroutine(1):1 total:1) (PC: 0x10c2616)
    14:		foo()
    15:	}
    16:
    17:	func foo() {
    18:		value := "FOO"
=>  19:		fmt.Println(value)
    20:	}
```

変数の中身を表示してみる
Go言語の文法が使えるわけじゃなくて CLI のコマンドで表示させるみたいだ

```
(dlv) print value
"FOO"
```

# ブレークポイントの指定方法

いくつかあるみたいだ。


[delve/locspec.md at master · go-delve/delve](https://github.com/go-delve/delve/blob/master/Documentation/cli/locspec.md)

(ここに書いたやり方だと、なぜかcurrent file を認識してくれていないが、まだ使い始めたばかりなのでよく分かっていない)

# 参考

[Golangのデバッガdelveの使い方 - Qiita](https://qiita.com/minamijoyo/items/4da68467c1c5d94c8cd7)

# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/3032








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Vue.js ネコ本チュートリアルのToDoリストを少しアレンジしてみた

#はじめに

最近Vue.jsの学習を始めたので、アウトプットがてらToDoリストを作成してみました。
※プログラミングの勉強を始めて3か月ほどなので突っ込みどころありましたらご教授いただけますと幸いです。
##自作したToDoリスト
以下が、自作したToDoリストです。
![コメント 2020-02-06 211639.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536128/978f5ddc-5421-2920-207b-945618a3aeba.jpeg)
[自作ToDoリスト](https://chobimusic.com/vuejs_todo/)
勉強がてらデザインにはBootstrapを使用してみました。
##参考
参考にさせていただいたのは以下のチュートリアルです。
[ToDoリストを作りながら学習しよう！](https://cr-vue.mio3io.com/tutorials/todo.html#%E5%AE%8C%E6%88%90%E5%BD%A2)

個人的にはVue.jsを学ぶ上で大変お世話になっている本(通称ネコ本)です。
#Let's アレンジ

アレンジがカタカナになってるのは見栄えです。(センス・・・)

本チュートリアルでは、状態が完了と着手中の2パターンの切り替えになってるところを、
アレンジ精神で3パターンの切り替えにしたいなと思い保留を追加してみました。

具体的に変更したところは2点。

①使用するデータを追記

変更前

```javascript:main.js
  data: {
    todos: [],
    current: -1,
    options: [
      { value: -1, label: 'すべて' },
      { value: 0, label: '作業中' },
      { value: 1, label: '完了' }
    ]
  },
```

⇓⇓⇓

変更後

```javascript:main.js
  data: {
    todos: [],
    current: -1,
    options: [
      { value: -1, label: 'すべて'},
      { value: 0, label: '着手'},
      { value: 1, label: '完了'},
      { value: 2, label: '保留'}
    ]
  },
```

※個人的に扱いやすいように数字を変更してます。

②メソッドを変更する

```javascript:main.js
    doChangeState: function (item) {
      item.state = !item.state ? 1 : 0
    },
```

⇓⇓⇓

変更後

```javascript:main.js
    doChangeState: function(item){
      if(2 > item.state){
        item.state = item.state + 1
      } else {
        item.state = 0
      }
    },
```

三項演算子から条件分岐に変更しました。

JavaScript初心者なので、三項演算子だとわかるまでめちゃくちゃ理解に苦しみました。
(もう少し基礎を学んだほうがいいのは間違いない・・・)

##補足

三項演算子は以下の形で条件式がtrueなら式1をfalseなら式2を返します。

```:
条件式 ? 式1 : 式2 
```
#まとめ

Laravelを学んでいく中でフロントサイドでVue.jsを使ってみたくなり学び始めました。

両FWともに様々なチュートリアルがありますが、アレンジ～自作ポートフォリオ完成までには、
しっかり1つ1つのスクリプトの意味を理解していかなければいけないと痛感しました。

引き続きアウトプットしながら学習をしていきたいと思います。
拙いアウトプットですがどなたかの参考になりましたら幸いです。
AWSで作ったLaravelアプリケーションをXserverにデプロイする

#はじめに

タイトル通りですが、LaravelアプリケーションのデプロイをXserverで試してみました。

AWSでアプリケーションは作成したのですが、
XAMPPで作成した方も以下のやり方でできると思います。

#まとめ
さっそくですがやり方を以下にまとめました。

**※XAMPPでアプリケーションを作成した方は⑥以降を参考にしていただければと思います。**

①AWSでLaravelアプリケーションを作成。

②作成したアプリケーションのフォルダをダウンロードしてXAMPP環境下(htdocs内)に保存する。

③XAMPPでphpMyAdminを起動。アプリケーション用のDB(DB名：laravel)を作成する。

④.envをXAMPP環境下でDBが使えるようにに編集。

```:.env
DB_DATABASE=laravel
DB_USERNAME=root
DB_PASSWORD=
```

⑤コマンドプロンプトで同フォルダに移動してテーブル作成

```
$ cd 作成したアプリのフォルダ
$ php artisan migrate//このコマンドでテーブルが作成されます。
```

⑥FTP(FileZillaを使用しました)で転送したいドメイン内のpublic_htmlへ作成したアプリのpublic内のファイルをすべて転送

⑦publicフォルダ以外のファイルをまとめて新しく作ったフォルダに転送(public_htmlと同じ階層下)

フォルダ名はlaraveltestとしました。
![コメント 2020-01-22 230052.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536128/69e86216-6da9-eb51-90da-83697fdf10bb.png)

⑧public_htmlに転送したindex.phpのrequire先を新しく作ったフォルダ先に変更

```php:index.php
require __DIR__.'/../laraveltest/vendor/autoload.php';//28行目
~~
$app = require_once __DIR__.'/../laraveltest/bootstrap/app.php';//38行目
```

⑨XAMPP環境下のphpMyAdminで同アプリ用に作ったテーブルをエクスポート(.sqlファイル)

⑩先ほどエクスポートしたsqlファイルをXserver環境下のphpMyAdminにインポートしてテーブル作成

⑪転送した.envを以下のように編集して保存

```:.env
APP_URL=http://独自ドメイン/

DB_connection=mysql
DB_HOST=自身のサーバ名.xserver.jp
DB_PORT=3306
DB_DATABASE=自身のデータベース名
DB_USERNAME=自身のユーザー名
DB_PASSWORD=自身で設定したパスワード
```

⑫対象のドメインへアクセスして問題ないか確認。

実際にデプロイしたサイトは以下になります。
よければ覗いてみてください◎
https://craftbeers.site


#参考
参考にさせていただいた記事は以下です。
https://qiita.com/hitotch/items/5c8c2858c883e69cd507

#最後に
完全に個人的備忘録です。
もしかしたらかなり遠回りな方法でデプロイしているかもしれませんので、
他にも良い方法がありましたら教えていただけますと幸いです。
また、初投稿で書き方もあまりわからなかったのでかなり雑な記事になってしまいました。。。
mysqlをubuntu16.04に導入

インストール

```
$ sudo apt install mysql-server mysql-client
```

一応↓もやった

```
$ sudo mysql_secure_installation
```

インストールを確認

```
$ mysql --version
```

一旦、ルート権限でmysqlにログイン
※パスワードはインストール時に設定したパスワードを

```
$ sudo mysql -u root -p
```

パスワードポリシーの設定を変更

```
mysql> SHOW VARIABLES LIKE 'validate_password%';
mysql> set global validate_password_length=6;
mysql> set global validate_password_mixed_case_count=0;
```


ユーザーを作成
登録したユーザーを確認
''をつけないとERROR

```
mysql> CREATE USER 'user_name'@'localhost' IDENTIFIED BY 'password';
mysql> SHOW GRANTS FOR 'user_name'@'localhost';
mysql> select user,host from mysql.user;
```

試しにデータベースを作成

```
mysql> CREATE DATABASE test;
```

testデータベースにlocalhostからログインできるようにとりあえず全権限を付与
権限を確認
rootは怖いのでログアウト

```
mysql> GRANT ALL ON test.* TO 'user_name'@'localhost';
mysql> exit;
```

作成したユーザーでログインし直す

```
$ sudo mysql -u user_name -h localhost -p
```



参考
https://charlie1012.hatenablog.jp/entry/2015/09/05/170000
https://qiita.com/houtarou/items/a44ce783d09201fc28f5
超シンプル: 日付をひたすら出力するシェル集


シンプルなんだけれど、いつも忘れちゃっているので書き残す。

シェルを実行してファイルのバックアップをする時などに、ファイル名に本日の日付・時間を追加したい時など、下記を覚えてシェルスクリプトに入れておくと、毎回、日付を変える面倒がなくなります。

## フォーマット YYYYMMDD

仕切りなしで、西暦日付を出力。

```
$(date "+%Y%m%d")
```

出力例

```
% echo $(date "+%Y%m%d")
20200316
```

## フォーマット YYYYMMDDHHMMSS

仕切りなしで、西暦日付秒までの時間を出力。

```
$(date "+%Y%m%d%H%M%S")
```

出力例

```
% echo $(date "+%Y%m%d%H%M%S")
20200316122346
```

## フォーマット YYYY/MM/DD-HH:MM:SS

スラッシュやセミコロンなどの仕切りを入れた例

```
$(date "+%Y/%m/%d-%H:%M:%S")
```

出力例

```
% echo $(date "+%Y/%m/%d-%H:%M:%S")
2020/03/16-12:24:45
```

以上
Sassのファイルとフォルダ

##index.html
このファイルに書かれたものがブラウザに表示されます。
##style.css
htmlファイルでstyle.cssファイルを読み込むことでスタイルを適用させます。
style.cssファイルを直接編集するのではなく、sassコマンドを実行することでstyle.cssファイルを作成・更新します。
##stylesheetsフォルダ
すべてのscssファイルを管理するフォルダです。
scssファイルを追加する場合は、stylesheetsフォルダ内に作成します。
##style.scss
このファイルですべてのscssファイルを@importで読み込むことで、一つのsassファイルに統合します。
【例】@importを使用してscssファイルを読み込みます

```
@import "reset";  /*_reset.scssを読み込む */
@import "./config/XXXX";　/* configフォルダの中の_XXXX.scssを読み込む */
```
##_reset.scss
ブラウザによって初めからcssがそれぞれのhtmlに設定されています。
そのCSSによって、意図しないデザインになってしまうことがあります。
そのようなことを防ぐために、初めにブラウザごとのCSSをすべてリセットします。
[HTML5 Doctor Reset CSS 2.0](http://html5doctor.com/html-5-reset-stylesheet/)
[sanitize.css](https://csstools.github.io/sanitize.css/)
などがあります。
##configフォルダ
プロジェクトの設定ファイルや、scssで使用する変数を定義するファイルなどを管理するフォルダです。
##mixinフォルダ
scss内で使用するmixinファイルを管理するフォルダです。
##modulesフォルダ
モジュールを管理するためのフォルダです。
モジュールとは、いくつかの要素をまとめた部品の集合という意味です。
ヘッダー、フッターのような用途ごとに分けることができます。
モジュールを使うことでまとまったCSSを独立したものとして管理することができます。
##vendorフォルダ
ライブラリのファイルを管理するフォルダです。
ライブラリとはあらかじめCSSが書かれたファイルです。
##overrideフォルダ
vendorフォルダに格納してある外部のライブラリを上書きするためのscssファイルを管理するフォルダです。
VMwareを高速化する（オプション設定など）

# 概要
VMwareで仮想環境の動きがイマイチ遅い場合、オプション等を調整する事で改善する場合がある。仮想マシンのパフォーマンス改善に有効と思われる設定のメモ。
基本的には.vmx ファイル（仮想マシン設定ファイル）の設定内容を変更する方法であるため、.vmx ファイルの変更による対応方法のものと、その他の方法によるものと分けて記載している。

# .vmx ファイルの変更
.vmx ファイル（仮想マシン設定ファイル）を開き、以下に記載するオプションを追記または値を更新する。

### 仮想マシン起動中の.vmemファイルの作成抑止
※.vmemファイル：仮想マシンのメモリ内容をバックアップするページファイル。起動中の出力を抑止する事で動作が軽くなるが、サスペンド時に一括して出力するため時間を要する。
```mainMem.useNamedFile = "FALSE"```

### ホストマシンの物理メモリの解放をしない（仮想マシンの領域をあらかじめ占有する）
```MemTrimRate = “0”```

### ページ共有機能を無効にする
※ページ共有機能：複数の仮想マシンを起動している場合、同じゲスト OS のインスタンスを実行している、同じアプリケーションまたはコンポーネントをロードしている、共通のデータを含んでいるといった状態を共有しメモリを効率的に使用する機能。メモリの使用量は押さえられるが速度は遅くなる。
```sched.mem.pshare.enable = "FALSE"```

### メモリ使用量が変化してもメモリサイズを固定する
```prefvmx.useRecommendedLockedMemSize = "TRUE"```

# その他設定など

### 仮想マシンのバージョンを最新化する
VMwareのメジャーバージョンがアップデートされた場合、仮想マシンも対応するバージョンの形式にアップデートする事で速度改善が期待できる。

### 仮想マシンの不要なデバイスを無効化する（BIOSにて設定）
レガシーデバイス等（Serial Port A、Serial port B、Parallel port、Floppy disk controller など）をBIOSレベルで抑止する事で速度改善が期待できる。

※BIOS画面の呼び出し方：「Power On」ボタン押下後、直ちに仮想マシン画面を左クリックし、VMwareの仮想BIOSの初期画面(Startingと出ている画面)で「F2」キーを押して、Boot Menu 画面を出す。どうしても呼び出せない場合は、.vmxファイルに以下の設定を追記または更新する事で必ずBIOSメニューに入る
```bios.forceSetupOnce = "TRUE"```
Glitchの5分スリープをGASで回避する

[Glitch](https://glitch.com)を利用する方向けのTipsです

- Glitchとは：Node・ExpressベースでちょっとしたAPIやWebサイトを公開するのに使える無料サービス
- 個人的にはLINEやSlackの[Bot](https://qiita.com/embokoir/items/419365542369d749654b)をつくったり、ちょっとしたWebサイトを公開したりするのに使っています

# Glitchのスリープ
- Glitchには「5分以上リクエストがない場合はスリープする」という[制限](https://glitch.com/help/restrictions/)がある
- Webサイトであれば「Waking up」といったローディング画面が出るのでまだ辛抱できるかもしれないが、WebhookのAPIなどに利用している場合、ユーザーへのレスポンスがかなり遅くなったり、他のサービスのAPIでタイムアウトになったり（Slackは特に厳しい）してしまう
[![Image from Gyazo](https://i.gyazo.com/7d250df9dd4f61fa2b90eda79cc34d86.png)](https://gyazo.com/7d250df9dd4f61fa2b90eda79cc34d86)
- 5分もインターバルができないほどリクエストがあるとは限らないことが多いはず
- 回避したい

###### 2020/4 追記

- Glitchが[有料プラン](https://glitch.com/pricing)を発表しました。有料プランに登録するとスリープはなくなり、上述の問題は解決されます
- 以下は無料プラン内でやりくりする場合の参考として残しておきます

###### 追記終わり

# 回避策
- Google Apps ScriptでGlitchのURLにリクエストを送る関数を定期実行する
- GASには定期実行のインターバルが何種類もあるが、とりあえず5分おき（12回/時）に実行するようにする。GlitchのRequestリミットは1プロジェクトにつき4000回/時なので問題なさげ

コード

```js
// 5分おきに呼び出される
function requestGlitch() {
  const urls = [
    'https://XXXXXX.glitch.me',
    'https://YYYYYY.glitch.me',
    'https://ZZZZZZ.glitch.me/?client=gas' // 後述
  ]
  urls.forEach(url => {
    const res = UrlFetchApp.fetch(url, {
      muteHttpExceptions: true
    })
    console.log(res)          
  })
}

// 設定されているトリガー確認
function showTriggers() {
  const triggers = ScriptApp.getProjectTriggers()
  triggers.forEach(trigger => {
    console.log('trigger source id: ' + trigger.getTriggerSourceId())
    console.log('handler function: ' + trigger.getHandlerFunction())
    console.log('event type: ' + trigger.getEventType())
    console.log('----------')
  })
}

// 1回だけ実行
// トリガー作成
function setTrigger() {
  ScriptApp.newTrigger('requestGlitch')
  .timeBased()
  .everyMinutes(5)
  .create()
}
```

`setTrigger()`からの`showTriggers()`を実行すると、トリガーが設定されていることが確認できます
[![Image from Gyazo](https://i.gyazo.com/9d22375ec84b16c315417f355d55538b.png)](https://gyazo.com/9d22375ec84b16c315417f355d55538b)

# さらに工夫する
- Glitchプロジェクト側で他サービスのAPIを呼び出すなどしている場合、このGASからのリクエストはリクエストボディが不正でエラーになったり、不必要に他サービスのAPIを呼び出したりすることになってしまう
- それを避けるために、パラメータに`client=gas`を付与
- Glitch側でパラメータを取得して`client=gas`の場合はそこで処理を止めればよい

## expressを使っている場合
```js
app.get('/', async (req, res) => {
  
    // gasからのリクエストの場合
    const client = req.query.client
    if (client === 'gas') {
        res.send('Glitch woke up')
        return
    }

    // それ以外の場合、処理を継続
    // ...
}
```

 Enjoy your Glitch life!
Pipenv と Pipfile.lock

流行り廃りが激しいのでいつまで使うか知らないが Pipenv https://github.com/pypa/pipenv の事を書く。Pipenv は npm みたいなツールだが、ロックファイルの使い方がちょっと違うのでこれだけ先に書く。

## Pipfile.lock

Pipenv では、開発者が Pipfile にインストールしたいバージョンの希望を書き、Pipfile.lock に実際にインストールしたバージョンが記録される。こうして開発者がインストールしたのと同じ環境を他の人も再現出来る。次のように使う。

Pipfile.lock を作成した人と同じ環境を再現したい場合。(npm で言うと `npm ci`)

    pipenv install
    または pipenv sync でも同じ事が起こる

Pipfile.lock を無視して、Pipfile に記述された最新のパッケージをインストールしたい場合。(npm で言うと `npm install`)

    pipenv update

続けて一般的な使い方を書く。

pyenv もインストールしておくと pipenv 経由で pyenv が呼び出され適切な Python のバージョンが自動インストールされます。

## 自分で新たに pipenv の環境を作る場合の典型的な作業

インストール例 (多分インストーラでで .zshrc 等に `eval "$(pyenv init -)"` が書き込まれると思う):

    brew install pipenv pyenv

Python のバージョンを指定して新しい環境を作る。Python の自動インストールには `pyenv` が必要です。

    pipenv --python 3.8

環境の中に入る

    pipenv shell

実装向けに何かインストールする。`pipenv lock` も自動的に実行されて Pipfile.lock が更新される。

    pipenv install boto3

開発向けに何かインストールする。`pipenv lock` も自動的に実行されて Pipfile.lock が更新される。

    pipenv install --dev autopep8

インストール済パッケージを列挙

    pipenv graph

[pep-508](https://www.python.org/dev/peps/pep-0508/) で定義されているように依存を確認する。

    pipenv check

古くなってしまったパッケージを探す

    pipenv update --outdated

古いパッケージを更新。Pipfile.lock を無視して Pipfile だけを見てパッケージを更新する。`pipenv lock` も自動的に実行されて Pipfile.lock が更新される。

    pipenv update

Pipfile を元に Pipfile.lock を最新に更新するが、インストールしない。

    pipenv lock
    
Pipfile.lock を元に 環境を作る。Pipfile.lock が存在する時は `pipenv install` と同じ。

    pipenv sync

環境を削除

    pipenv --rm

## すでに Pipfile と Pipfile.lock の存在するコードの開発に参加する

Pipfile.lock の通りにパッケージをインストールする。

    pipenv install

## 余談

boto3 https://pypi.org/project/boto3/ みたいに更新の早いパッケージを使うと動作確認しやすい。
VSCodeにおいて、インストール済みのlive shareができない場合の対処法（MAC）

先生から送られてきた、liveshareのリンクを踏んでも、collaboration することができませんでした、、

####解決策の結論として「GitHub で再認証を行うこと」が必要でした。

VSCodeをメニューバーから強制終了し、再起動を行なった場合は、再度Githubの認証を得る必要があり、以下に手順を示します。

---
1.VSCodeの下にある、紫色のliveshareと書いてあるバーをクリックする

2.sign in with githubと表示されるのでそれをクリック

3.safariが開き、表示された認証ボタンを押すことで、認証が完了し、liveshareが使える様になる

---

下のバーに自分のユーザー名が表示されていれば成功です。
eslintの特定のルールはwarnに留めておきたいが、引っかかるコードをコミットさせたくない場合

# 前提
husky, lint-stagedでコミット前にeslintしている

# 経緯
eslintのerrorで指定してあった或るルールをwarnに変えるコミットがあり、
「そもそも error は動作しなくなったり特に危険であるものに使われるべきで、よほどのことがない限り使うべきではない」という意見があった
確かに、と思ったがコミットもさせたくなくて、方法を調べた

# 結論
eslintのruleはwarn指定しつつ、
https://eslint.org/docs/user-guide/command-line-interface#max-warnings
のオプションを用いて ` --max-warnings=0` をlint-stagedに追加

```js

module.exports = {
  '**/*.ts?(x)': ['eslint --max-warnings=0 --fix', 'prettier --write'],
};
```

これでwarnも引っかかるとエラー終了してコミットできなくなる

```
✖ 1 problem (0 errors, 1 warning)

ESLint found too many warnings (maximum: 0).
```

これで、普段はwarnに引っかかるコードは生まれず、 `--no-verify` などをつけた暫定的なコミットなどで意図してwarnに引っかかるコードがコミットされたとき、CIによるeslintは通る想定になる

# 追記
`--max-warning` をつけると、  `.eslintignore` に書いたファイルが**lint-staged のときだけ**以下のようなwarnを吐いてコミットできなくなった

`  0:0  warning  File ignored because of a matching ignore pattern. Use "--no-ignore" to override`

eslintの` --no-error-on-unmatched-pattern` オプションを付けても解決しなかった
解決策としては、 https://github.com/okonet/lint-staged#how-can-i-ignore-files-from-eslintignore- に従って以下のような設定にすると直った

```js
const { CLIEngine } = require('eslint');
const cli = new CLIEngine({});

module.exports = {
  // @see https://github.com/okonet/lint-staged#how-can-i-ignore-files-from-eslintignore-
  '**/*.ts?(x)': [files => 'eslint --max-warnings=0 --fix ' + files.filter(file => !cli.isPathIgnored(file)).join(' '), 'prettier --write'],
};

```
情報共有ツールで意図しない情報漏洩を防ぐための設定

## はじめに
開発に限らず様々なプロジェクトで、Google DriveやTrello等のチーム内情報共有を円滑にするためのツールを使う機会は多いと思います。
ただ、うっかり設定を誤ってしまうと思わぬところで情報漏洩をしてしまうことなどがあります。
本記事ではそのような誤りがないように設定する手順をまとめます。

## Google Drive
#### リンク共有による意図しない情報漏洩を防ぐ
チーム内でファイルを共有するためにリンクURLを共有することがあると思います。
この共有可能リンクはデフォルトで「リンクを知っている人は**誰でも**アクセス可能」となるため注意が必要です。

##### リンク共有手順

（ファイルを開いた状態の場合）
「共有」をクリックします。
<img width="340" alt="スクリーンショット_2020-03-16_10_03_55.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/354791/16d30825-2733-aba5-79c0-1004e68a1d0d.png">

「共有可能なリンクを取得」をクリックします。
<img width="287" alt="スクリーンショット_2020-03-16_10_04_21.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/354791/e8f7836c-4d3f-da5a-1898-9d0bd33bd5cf.png">

（ファイル一覧表示の場合）
ファイルを右クリックして、「共有可能なリンクを取得」をクリックします。
<img width="253" alt="スクリーンショット_2020-03-18_17_54_04.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/354791/7a182beb-d9d5-7d8b-ada2-88aceada61de.png">


デフォルト設定のため、誰でもアクセスできるリンクが作られてしまいます。
（ファイルを開いた状態の場合）
<img width="345" alt="スクリーンショット_2020-03-16_10_04_30.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/354791/355bf9b1-8021-13e6-05b0-cd576a86f0fd.png">

（ファイル一覧表示の場合）
<img width="330" alt="スクリーンショット_2020-03-18_18_00_24.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/354791/7b940e28-5941-4e06-ead8-6ad9cc863b68.png">


そんな時は落ち着いて、「リンクを知っている全員が閲覧可」をクリックします。
（ファイル一覧表示の場合は、ファイルを右クリック＞「共有」をクリックして、下記の画面を表示します。）
<img width="280" alt="スクリーンショット_2020-03-16_10_04_51.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/354791/f90877b1-cbd9-e326-31bc-e09d2a7faedf.png">

「オフ - 特定のユーザーだけがアクセスできます」をクリックします。
<img width="279" alt="スクリーンショット_2020-03-16_10_04_59.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/354791/b5efd117-d721-b14b-e988-5c17f595832e.png">

これで、指定したユーザーのみアクセス可能の状態になりました。一安心ですね。
あとはアクセスを許可するユーザーを個別に指定します。
<img width="282" alt="スクリーンショット_2020-03-16_10_05_12.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/354791/5ee60e8d-9455-2651-8f47-b91649fb9445.png">

## Trello
#### 公開設定を正しく設定して意図しない情報漏洩を防ぐ
公開設定が「非公開」となっていることを確認します。
（デフォルトで非公開となっています。「公開」になっていると全世界に公開され、Google検索にも引っかかるようになってしまうのでご注意ください。）
<img width="350" alt="スクリーンショット_2020-03-16_10_33_06.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/354791/c29617d3-e1c8-2dd1-9154-bd234cf6afe8.png">

「招待」をクリックします。
<img width="350" alt="スクリーンショット_2020-03-16_10_33_53.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/354791/3ad661e0-76af-81de-2668-c0d866be74d3.png">

アクセス可能ユーザーを個別指定して、「招待状を送信する」をクリックします。
（「リンクを作成」をクリックしてしまうと、リンクURLを知っている人は誰でもアクセスできるようになってしまうのでご注意ください。）
<img width="300" alt="スクリーンショット_2020-03-16_10_34_28.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/354791/1cc433de-4c87-50c1-ecd6-36615416cf38.png">

## まとめ
情報共有ツールを使用する上では公開範囲が正しく設定されているか確認しましょう！

## 参考
- [Google Drive ファイル共有設定](https://support.google.com/drive/answer/2494822)
- [Trello ボード公開範囲設定](https://help.trello.com/article/789-changing-the-visibility-of-a-board-to-public-private-or-team)
powershellでタスクごとのメモリ使用量集計

# タスクマネージャー問題

タスクマネージャーのプロセスタブでメモリ使用量を調べたらchrome.exeのイメージ名がいくつも見つかる。
1つのイメージを見たらChromeのメモリ使用量は多くないと思うかもしれないが、本当のメモリ使用量はいくつものイメージの合計で、合計すると多い。

タスクマネージャーでは本当のメモリ使用量を調べられない。
タスクごとにイメージの合計値を算出する必要がある。

powershellでタスクごとにメモリ使用量を集計し、メモリ使用量の多いタスクのみを表示するプログラムを作成してみた。

# プログラム

```powershell:memory調査.ps1
get-process |
  select name, ws |
  group name |
  select name, @{
    name       = "sum";
    expression = { ($_.group | measure -sum ws).sum }
  } |
  where { $_.sum -gt 20 * 1024 * 1024 } |
  sort sum -descending |
  select name, @{
    name       = "WS(M)";
    expression = { [math]::round($_.sum / 1024 / 1024).tostring("#,#") + " M" }
  } |
  ft -HideTableHeaders
```

メモリ使用量が合計20M以上のタスクをメモリ使用量の降順で表示。

# 実行結果の例

```console
> powershell -ExecutionPolicy Bypass -File memory調査.ps1

chrome               1,279 M
firefox              577 M
Code                 494 M
MsMpEng              196 M
```

# Chromeの拡張機能とメモリ

このプログラムを使って、拡張機能を増やしたらChromeの起動時のメモリ使用量がどう変わるか調べてみた。

拡張機能を1個増やすごとにメモリ使用量が約30M増え、10個の拡張機能を使用すると約300Mまで増えた。

拡張機能を増やすごとに拡張機能1個あたりのメモリ使用量が減るようで、30個の拡張機能まで増やすと、1個あたりのメモリ使用量が16Mになった。
php7.4から配列でない値に配列のようにアクセスしたらエラーになる

php7.3からphp7.4への下位互換性のない変更点の１つとして
配列じゃない値に配列のようにアクセスすることができなくなりました。

ちなみにnullに対して以下のようにアクセスすると以下のようになります。

```php
$hoge = null;
var_dump($hoge[0]);
exit;
```

```php:出力結果
// php7.3まで
NULL

// php7.4
Trying to access array offset on value of type null in /hoge.php on line 3 trace => #0 ...
```


> null, bool, int, float または resource 型を ($null["key"] のように) 配列としてアクセスしようとすると、警告が生成されるようになりました。

https://www.php.net/manual/ja/migration74.incompatible.php

地味ですが、今までがよしなに動き過ぎていて、影響範囲が大きめの割と面倒な対応でした。
[漏洞通告]jackson-2658/2659/jackson-databind JNDI注入导致远程代码执行

### 漏洞描述
近日,亚信安全网络攻防实验室跟踪到jackson-databind更新了4个jndi注入的黑名单类.如果在项目包中存在该类的jar包且JDK版本满足注入版本,则可以使用JNDI注入的方式导致远程代码执行.如下为更新的黑名单类.

```
org.apache.ignite.cache.jta.jndi.CacheJndiTmLookup
org.apache.ignite.cache.jta.jndi.CacheJndiTmFactory
org.quartz.utils.JNDIConnectionProvider
org.apache.aries.transaction.jms.internal.XaPooledConnectionFactory
```

### 漏洞编号
Jackson内部编号2658
Jackson内部编号2659

### 漏洞威胁等级
中危

### 不受影响范围
jackson-databind >= 2.9.10.4
jackson-databind >= 2.10.0

### 漏洞验证
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491410/e9411cf4-f4a5-3043-b0e9-f8bdb95952a9.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491410/f2110c7c-c6f2-4a6f-6492-f355b1811c33.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491410/8be465f2-ed17-0e8d-7cbf-5d93b2796cd7.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491410/2fd0b386-efe2-8026-bceb-36bfa6c39c25.png)

fastjson受`org.apache.ignite.cache.jta.jndi.CacheJndiTmLookup`影响

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491410/b62cd0cc-808f-73e0-2840-33b71696589f.png)

###  修复建议
1.更新到最新版本
2.使用高版本JDK

### 时间轴
[0] 2020/03/16 09:12 FasterXML官方修复该漏洞
[1] 2020/03/16 亚信安全网络攻防实验室分析&复现该漏洞并发布漏洞通告

### Reference
https://github.com/FasterXML/jackson-databind/issues/2658
https://github.com/FasterXML/jackson-databind/issues/2659
fishシェルでaliasを作る

# 作り方
1. `alias [alias名] [スクリプト]`
2. `funcsave [alias名]`


# 削除方法
1. `functions -e [alias名]`

# ポイント
fishシェルの場合 `alias` コマンドは functionのラッパーになるので、他のシェルのように永続化されません。
そのため、そのシェルのセッションで作ったaliasを  fishのfunctionとして登録する必要があります。
実証済！シャックリをとめるプログラム 

# はじめに

先日、しゃっくりが止まらなくて困っている同僚に祖母直伝の方法を試したら
ピタリと治ったので、それをフローとプログラムに落とし込んでみます。
決してネタに困って出オチ記事に走っているわけではないです。。

# フローチャート
<img width="400" alt="フローチャート.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/568492/5152dec4-6638-afb3-8644-23ffb181a709.jpeg">

# プログラム
```:StopHiccup.html 
<!DOCTYPE html>
<html lang="ja">
  <head>
    <meta charset="UTF-8">
    <title>シャックリ停止めます？</title>
  </head>
  <body>
    <h1>シャックリ停止めます？</h1>
    <button id="btn">開始</button>
    <div id="area1">カウントダウン</div>
    <script>
        document.getElementById("btn").addEventListener('click', function() {
        var r1 = window.confirm('シャックリが止まりませんか？\nはい＝OK、いいえ＝キャンセル');
        if( r1 ) {
          //「true」の処理

          window.alert('シャックリ停止シーケンスを開始します。\nまず初めに、めちゃくちゃ息を吸ってみよう！');

          var r2 = true;
          do{
            r2 = window.confirm('限界まで息を吸えてる？（ここが最重要ポイント）\nはい＝OK、いいえ＝キャンセル');
            if( !r2 ) {
              window.alert('まだいける！\nこれ以上吸えないってとこまで頑張ってみよう！');
            }
          }while (!r2);

          window.alert('はい！息を止めて！\nあと少しだよ！がんばってー\nカウントダウン開始');

          document.getElementById("area1").innerText = 10;

          sleep(10, function() {
            document.getElementById("area1").innerText = "お疲れ様でした"
            window.alert('はい！終わりましたー。息はいて大丈夫です。\nお疲れ様でした。これでもうシャックリは出ないはずです。');
          });
        }
      })

function sleep(waitSec, callbackFunc) {
  var spanedSec = 0;
  var waitFunc = function () {
      spanedSec++;
      document.getElementById("area1").innerText = 10 - spanedSec;
      if (spanedSec >= waitSec) {
          if (callbackFunc) callbackFunc();
          return;
      }
      clearTimeout(id);
      id = setTimeout(waitFunc, 1000);
  };
  var id = setTimeout(waitFunc, 1000);
}

</script>
  </body>
</html>
```

# 最後に
しゃっくりは横隔膜の痙攣が原因だそうですが、止めるには横隔膜を刺激すれば止まるそうです。
なので、めちゃくちゃ息を吸って大角膜を広げてあげることでシャックリを止めている。
ということでしょうか。

以上、お付き合いいただきありがとうございましたm(__)m
【Javascript・GAS】文字列から記号を取り除きたい時

コピペで使えるようにしました．(※追記もみてください><)


```javascript
function remove() {
  const str = "ABC,.~!@#$%^&*()_+{}[]:;\"'<>?\\/|DE";
  const replaced = str.replace(/[,\.~!@#\$%\^&\*\(\)_\+\-=\{\}\[\]:;"'<>?\\\/\|]/g, '');
  console.log(replaced); // "ABCDE"
}
```

全角も含むならこんな感じです．

```javascript
function remove() {
  const str = "【】『』A，B．・；’「」｀＼C,.~!@#$%^&*()_+{}[]:;\"'<>?\\/|DE";
  const replaced = str.replace(/[【】『』，．・；’「」｀＼,\.~!@#\$%\^&\*\(\)_\+\-=\{\}\[\]:;"'<>?\\\/\|]/g, '');
  console.log(replaced); // "ABCDE"
}
```

記号は無限にあるので必要があれば随時追加してください．

## 追記
よく考えたら以下のもの以外と指定した方が安全でした．

* ひらがな
* カタカナ
* 漢字
* アルファベット
* 数字

すると以下のようになります．

```javascript
function remove() {
  const const str = "あA_!A・1";
  const replaced = str.replace(/[^0-9A-Za-z\u3041-\u3096\u30A1-\u30F6\u3005-\u3006\u3400-\u3fff]/g, '');
  console.log(replaced); // "あAA1"
}
```

UTF-8の番号は[このサイト](http://orange-factory.com/dnf/utf-8.html)を参考にしました．
Typescript async catch 考察


## やりたいこと

エラー発生時に、以降の処理をスキップしたり、例外処理したりする時に便利なメソッドを作る。

```wrapPromise.ts
type Result<T> = T | Error

export const wrapPromise = async <T>(promise: Promise<T>): Promise<Result<T>> =>
    promise.then(result => result).catch(error => error)
```

## 利用例
```typescript
const sampleTask = async () => {
    const result = await wrapPromise(asyncTask())
    if (result instanceof Error) {
        return
    }
    // 成功時のみ実行
    console.log(result)
}
```
SPMのDependencyを編集してみる

# 目的
この記事は[Editing a Package Dependency as a Local Package](https://developer.apple.com/documentation/swift_packages/editing_a_package_dependency_as_a_local_package)というApple Documentをスクショ付きで実行していく記事です。

# 概要
SPMのDependencyはリモートのままでは編集することができません。ローカルのDependencyを追加するとSPM側で認識して上書きされ、ローカルのものが使われるようになり編集可能になります。リモート利用に戻したい時はローカルを取り除くだけです。

今回の記事ではこれを実行していきます。

# 手順
1. OSSのプロジェクトのソースコードをダウンロードする(Cloneでもzipでも良い)
2. 使いたいプロジェクトを開く
3. ProjectNavigatorへコピーする

# 0. 問題発生
利用しているOSSでなんらかのクラッシュを引いてしまった...。でも自分が特に変な使い方をしているとも思えないので、ソースコードを編集しながら試してみたい。(CocoaPodsでは良くやっていた)
<img width="971" alt="スクリーンショット 2020-03-16 13.31.16.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114709/f40511bf-555f-1cd6-e049-9af05b3a0cde.png">

# 1. OSSのソースコードダウンロード
今回はzipで行いました。
<img width="836" alt="スクリーンショット 2020-03-16 13.33.07.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114709/0d2eb615-b4b4-a188-94dc-84e90c0dc187.png">

# 2. 使いたいプロジェクトを開く
プロジェクトファイルかワークスペースファイルを開くだけです。

# 3. Project Navigatorへコピーする
前準備として、パッケージ名とディレクトリ名が一致している必要があるので、zipでダウンロードすると「SwiftUI-master」という名前になっていて都合が悪いのでrenameしておきます。

<img width="387" alt="スクリーンショット 2020-03-16 13.48.45.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114709/05642e41-60ee-2832-1227-2ec3cfa13a51.png">

そのディレクトリをProject Navigatorへコピーします。

<img width="276" alt="スクリーンショット 2020-03-16 13.54.07.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114709/ff2ae596-decb-d57a-78eb-dc705e2f7f7a.png">

コピーする前のProject Navigatorはこのようになっていました。
<img width="375" alt="スクリーンショット 2020-03-16 13.44.57.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114709/8c7f82ca-3634-467c-eb79-18dc9aed97cd.png">

同名のパッケージをProject Navigatorに追加すると、Localの方で上書きされ、リモートの方は表示されなくなります。自分の場合、利用しているパッケージが1つだけだったのでSPMの表示ごと消えました。

# おわりに
こうして無事にローカルで編集しながら作業を進めることが可能になりました。開発中はCloneしてきたレポジトリを利用してOSSにコミットしながら進めて、リリースする時はLocal Dependencyを削除してリモート版を使うなどの運用が良さそうではないでしょうか。

これで記事は終わりです。ありがとうございましたー。
第4回 Google Colaboratoryで始める機械学習のための特徴量エンジニアリング - 交互作用特徴量

## はじめに

本記事では交互作用特徴量について解説しています。本記事は主に「[機械学習のための特徴量エンジニアリング](https://www.amazon.co.jp/dp/4873118689/ref=cm_sw_em_r_mt_dp_U_lRGxEbH5KBJJX)」を参考とさせて頂いておりますので、気になる方は是非チェックしてみてください。

※本記事で解説するプログラムは全て[こちら](https://colab.research.google.com/drive/1r1gAfK_ZpO6085jjp7DZWzxr8LGoAhv-)にあります。

## 交互作用特徴量とは
複数の特徴量を掛け合わせて新たな特徴量を作るという手法です。この中でで特に2つの特徴量を組み合わせるものを**ペアワイズ交互作用特徴量**と呼びます。また、特徴量が二値である場合は論理積となります。
例えば特徴量として地域と年齢層がある場合に、地域と年齢層を掛け合わせることで「20代」と「東京住み」の情報から「東京住みの20代」という目的変数をより表現できる情報を作成することができるのです。

しかしデメリットとして、学習コストが増大することと、不要な特徴量を作成してしまうことが考えられます。この学習コストの増大と不要な特徴量の問題は特徴量選択を行うことで解決することができます。

例えば以下のような特徴量データがあったとします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591117/ecccaf98-98f8-bdbe-706e-3ddca676e280.png)

このデータに対して交互作用特徴量を作成すると以下のようなデータセットが作成されました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591117/bbbe6cab-352f-eb58-9ac9-fb233d180014.png)

以下では実際に交互作用特徴量を実装するサンプルコードを示します。

```python
import numpy as np
import pandas as pd
import sklearn.preprocessing as preproc

##乱数固定
np.random.seed(100)

data_array1 = []
for i in range(1, 100):
  s = np.random.randint(0, i * 10, 10)
  data_array1.extend(s)


##乱数固定
np.random.seed(20)

data_array2 = []
for i in range(1, 100):
  s = np.random.randint(0, i * 10, 10)
  data_array2.extend(s)

data = pd.DataFrame({'A': data_array1, 'B': data_array2})

## 交互作用特徴量
data2 = pd.DataFrame(preproc.PolynomialFeatures(include_bias=False).fit_transform(data))
## interaction_only=Trueとすることで自身の値の二乗を除くことができます
# data2 = preproc.PolynomialFeatures(include_bias=False, interaction_only=True).fit_transform(data)

```

## 最後に
YouTubeでITに関する動画を上げていこうと思っています。
YoutubeとQiita更新のモチベーションに繋がるため、いいね、チャンネル登録、高評価をよろしくお願い致します。
YouTube: https://www.youtube.com/channel/UCywlrxt0nEdJGYtDBPW-peg
Twitter: https://twitter.com/tatelabo