OmniAICreator/Qiita-1.07M huggingface dataset:
TouchDesignerでShaderToysを使う方法


最近にわかに盛り上がっている感の『TouchDesigner』。

一方熊本で『TouchDesigner』に詳しい人がいないということで始まった

『KumaMCN』勉強会。

会を重ねるに連れ、少しずつ『GLSL』の話がでてくるようになり、


ぜひともヌルヌル動かしたいなということでググりにググり、

『ShaderToys』に書かれたコードの使い方の動画(全編英語)を見つけたので、

メモ書きしつつ画像キャプチャすることにしました。


詳細+画像キャプチャ版はブログにまとめてます。

[ブログ もんプロ](https://coinbaby8.com/td-glsl-movie-learning5-1.html)

オリジナルのYoutubeはこちら。
[YouTube](https://www.youtube.com/embed/4d6IKvZELBk)

もってきたコードはこちら。
[ShaderToys marble](https://www.shadertoy.com/view/MtX3Ws)


変更点は下記。

1. uniform変数の定義
2. Cube対応(sTDCubeInputs)
3. mainImage関数→main関数に変更
4. fragColor設定(main関数外に出す)
5. fragCoord設定
6. マウス入力設定


## 1. uniform変数の定義

ShaderToysはデフォルトで変数定義されているものの、
コピーしたコードには含まれないので追記します。


```
uniform float iTime;
uniform vec2 iResolution;
uniform vec3 iMouse;
```



## 2. Cube対応(sTDCubeInputs)

TouchDesignerのマニュアル『Write a GLSL TOP』の中で、

cubeで検索すると、

どうやらcubeの場合は、

『sTD2DInputs』ではなく、『sTDCubeInputs』 を使うようです。

```
#define iChannel0 sTDCubeInputs[0]
```


360度撮影された画像を使い、


『Movie File In』 -> 『Projection』 とつないで、
『Projection』のInput/Outputを下記に変更します。

- Input・・Equirectangular
- Output・・Cube Map



## 3. mainImage関数→main関数に変更

```
//void mainImage( out vec4 fragColor, in vec2 fragCoord )
void main()
```

## 4. fragColor設定(main関数外に出す)

```
out vec4 fragColor;

void main()
{
    vec4 fragCoord = gl_FragCoord;
```

## 5. fragCoord設定

fragCoordも追加します。


```
//void mainImage( out vec4 fragColor, in vec2 fragCoord )

out vec4 fragColor;

void main()
{
    
    vec2 fragCoord = vec2(vUV.s*iResolution.x, vUV.t*iResolution.y);
```

## 6. マウス入力設定

『Mouse In CHOP』→『Null CHOP』とつないで

『Null CHOP』を

『GLSL TOP』->Vectors1->iMouse の箇所にドラッグドラップします。


ドラッグドラップ時に『Export CHOP』を選択すると、

マウス座標が『GLSL TOP』に反映されるようになります。


ググってみてもなかなか見つからなかったので助かりました。


一方、
コードによっていろいろ対応必要そうで、
なかなか一筋縄ではいかないようです。

[ブログ もんプロ](https://coinbaby8.com/td-glsl-movie-learning5-1.html)
ArrayListを使用するVBAでメモリ不足エラーが発生するようになった件(Windows10)

# 突然の出来事
新しいWindows10パソコンで、過去に作成した業務用のVBAマクロが「メモリ不足です」とエラーを吐くようになった。

# 調査
調べてみると、.NET 4.5 Framework以降？で、外部からのSystem.Collection.ArrayListへのアクセスができなくなっているようだ。
最近のWindows10はクリーンインストール時に、.NET 4.5 Framework以前の環境が無効化されている。

# 対応
Windows10の設定 - Windows機能の有効化または無効化(検索でOptionalFeaturesでも表示される)で、「.NET Framework 3.5」にチェックを入れて有効化する。

![2019-07-11_09h59_45.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17089/7743d654-961c-66c7-2296-36e4708f1e8f.jpeg)
GCP アップデート (7/5-7/11 2019)

### Compute: [July 8, 2019](https://cloud.google.com/compute/docs/release-notes#july_8_2019)
- C2マシンタイプがベータで出たよ。
  - Cascade Lakeベース。
  - ベータ中はus-central1-a/b、europe-east4-b/cだけで提供。
- OS Inventory Managementがベータで出たよ。
  - OSの種類とかバージョンとか、インストールされているパッケージが見れる。
  - 大量にGCE管理しててログインせずにいろいろ確認するのには使えそう？(既に何か使ってなければ。)

### Traffic Director [July 8, 2019](https://cloud.google.com/traffic-director/docs/release-notes#june_18_2019)
- Route rulesとTraffic policis使ったtraffic管理がベータで出たよ。
  - xDS API互換のサイドカープロキシベース。
  - だんだんTraffic Director周りが整ってきた感じ。

### Cloud Run [July 8, 2019](https://cloud.google.com/run/docs/release-notes?hl=en#july_10_2019)
- service detailsページにYAMLタブができたよ。

### Cloud Run [July 10, 2019](https://cloud.google.com/run/docs/release-notes?hl=en#july_10_2019)
- Cloud Runがasia-northeast1, europe-west1, and us-east1で使えるようになったよ！
  - ついに来た！大阪はまだ。

### ML [July 10, 2019](https://cloud.google.com/blog/products/ai-machine-learning/cloud-tpu-pods-break-ai-training-records)
- TPUv3がMLPerfでAI学習の記録作ったよ。(ブログから。)
  - クラウドプロバイダがオンプレに勝ったの初。



### ディスクレーマ
- アップデートの内容はあくまでも個人の理解していることを書いています。正しい内容はリリースノート等を確認下さい。
- リリース内容できるだけ拾うようにしているのですが、抜けていそうなリリースノートが追加するのでぜひ教えて下さい！(一覧[ここ](https://qiita.com/kenzkenz/items/ac18a359b803dbb6b490)で更新してます。)
Directory Harvest Attack（ディレクトリ獲得攻撃）を被った記録

a long time ago in a galaxy far far away
遙か昔のことです…
会社のネットワークが、DHA（Directory Harvest Attack（ディレクトリ獲得攻撃））の被害を被りました。
教訓として、記録・公開します。

## 前提
- あくまで遙か昔のことで、直後に物理的・論理的にリプレースし、徹底的に対策済みです。
- メールサーバーがオンプレミスでした。
　当時は「IT企業なのだから、メールサーバーを自社で構築・運用していないのはちょっと恥ずかしい」という時代でした。

## 事象の概要
- 大量（数万）の宛先不明メールを受信しました。
- 上記がメールサーバー内で滞留（数万）し、パフォーマンス低下⇒システム不調となりました。
- 滞留メール削除・対策等で工数を浪費しました（夜間・週末・月末に集中）。

## DHAとは？
スパム業者などがメール・アドレスを収集するハーベスティングの手法の1つ。自動生成したメール・アドレスを特定のドメインに送信し、有効なメール・アドレスを収集する行為のこと。
ハーベスティングを実行するために、大量の電子メールを送りつける結果、対象のメール・サーバやネットワークに大きな負荷を掛ける「攻撃」にもなることから、DHA攻撃と呼ばれる。
Webサイトなどから有効なドメイン名を収集し、そのドメイン名のメール・アドレスを自動生成し、次々と送信することで、あて先不明のエラーが返信されなかったメール・アドレスを“有効なメール・アドレス“として収集する。

## 事象
### キュー状況
14894件のキューが滞留しています。
![キュー状況](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458322/b257e9fd-18df-240f-c2ea-6b8718acc704.png)

![キュー状況](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458322/fa26a9bf-dfe0-0cb8-ec56-1b34d1abe1ed.png)

### SMTPログ（ファイルサイズ）
最大で15MBのログ（テキストデータ）が記録されています。
![SMTPログ_件数](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458322/c1552c08-5e12-8daf-9dc6-6ea297dc90ef.png)

### メール内容
件名や本文は全て同じで意味はありません。
！！このようなメールは開けてはいけません！！
![メール内容](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458322/13301e64-6ea9-c018-5ef1-ba1f9f55ac3c.png)

### どこから？
メールのソースを見ると、ナイジェリア発のようでした。

```
Received: from User ([41.203.64.134] RDNS failed) by ・・・
```

## 渦中の対応策
### 実行した事
|対応策|結果|
|:-----------------|:------------------|
|タールピット|×|
|グローバルIPのフィルタリング|×|
|RBL（Realtime Blocking List）によるブロック|×|
|送信元メールアドレスのフィルタリング|○ ただし、直ぐに違うアドレスを騙って再開するので、あまり意味無し|

### メールアドレスのフィルタリング
多数滞留させると、サーバーが障害を起こし、削除メールを検索・表示するのに長時間必要になり、実質操作不能になります。
脅迫観念に追われながら、出来る限りリアルタイムで手動で対応しました。

FROM／受信時／削除件数
aaaa＠aaaa.aaaa.aaaa／23:16-05:04／420824
フィルタ設定しても、直ぐに違うアドレスで再開
bbbb＠bbbb.bbbb.bbbb／05:19-05:30／4514
フィルタ設定しても、直ぐに違うアドレスで再開
cccc＠cccc.cccc.cccc／05:45-05:47／1106
フィルタ設定しても、直ぐに違うアドレスで再開
dddd＠dddd.dddd.dddd／05:57-05:58／666

## 原因
- ネットワーク構成の甘さが致命的でした（恥ずかしいので、詳細は記載しません）。
- とにかく危機感の欠如。

## 対策
情報セキュリティ対策上、詳細は記載出来ませんが、コストも投下し、徹底的に対策しました。

## 最後の雑記
- キューが溜まり過ぎると、メールサーバーがフリーズして操作できなくなります、追随して、手動でキューを削除するしかないので、攻撃中は、不眠不休で対応しました。
- 最も悲惨だったのは、夏休み家族旅行中、宿に着いた瞬間に攻撃が開始され、旅館で寝ずに対応しました（監視されているかのよう）、翌日、車で移動しながらも、SAなどで止まって対応しました、「心ここにあらず」家族にも悪い事をしました。
- 相手も、こういう希少な（穴の開いている）ICT資源が枯渇しないように＝対策されないように、毎月だいたい２０日～月末のみしか攻撃してきませんでした、その間もたまに「休日」があったり。
- 攻撃が途絶えると「対策が効いた」と勘違いする、という効能もある気がします、敵はプロです
- ネットワークやメールサーバーのスキルを、止むに止まれず会得しました、やれば出来ます。
- メールシステムというのはとても原始的なものですね、敵の手法を調べ、試しに外部から当社メールサーバーへ実行、簡単に出来ました・・・

責任はもちろん別として、
問題のポンコツネットワーク構成は、私の仕業ではありません。
最後に少しだけ名誉を主張します。
[Unity] Destory処理中のOnDisableとOnDestroyの呼び出され方と、その最中にGameObjectの親子関係を解除したときの挙動

#結論から
OnDisableやOnDestroyで親子関係を変えると意図しない挙動を引き起こしやすいので
Destroyする前に親子関係を解除した方が良い

##検証用GameObjectの構造とコード
![コメント 2019-07-09 153613.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253279/2cbb2a5a-bb92-b4e6-dfdb-7006441b37cf.png)

```C#:DestroyTest
DestroyTest : MonoBehaviour
	{
		public bool detachChildrenOnDisable;
		public bool detachParentOnDisable;
		public bool detachChildrenOnDestroy;
		public bool detachParentOnDestroy;

		private void OnDisable()
		{
			if (detachChildrenOnDisable) { transform.DetachChildren(); }
			if (detachParentOnDisable) { transform.parent = null; }
			Debug.Log(gameObject.name + "OnDisable");
		}

		private void OnDestroy()
		{
			if (detachChildrenOnDestroy) { transform.DetachChildren(); }
			if (detachParentOnDestroy) { transform.parent = null; }
			Debug.Log(gameObject.name + "OnDestroy");

		}
	}
```
##コードから親をDestroyした場合
親→子→孫という順番でOnDisableが呼ばれ、その後同じ順序でOnDestroyも呼ばれる
![コメント 2019-07-09 134746.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253279/ed3038b6-5592-8845-5fb2-e924888d378b.png)
##Editorの操作から削除した場合
![コメント 2019-07-09 154128.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253279/8f989f91-9eac-75c9-74de-55eb5aeb40a9.png)
Disableは孫→子→親の逆順で呼ばれ、Destroyはコード側の操作と同じ順序で呼ばれる
![コメント 2019-07-09 134916.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253279/94739fa2-53b6-093a-2b51-01ccb089656d.png)
##親のOnDestroyで親子関係を解除した場合


すべてのOnDisableが呼び出された後、親子関係が解除され親のOnDestroyのみ呼ばれる
![1213213.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253279/34d5a786-2a8e-897e-bcf8-8c6c9e023c6a.jpeg)

この場合DestroyしたGameObjectの直下にある子のみdisableのままになり孫はEnableが呼ばれコンポーネントが起動する
![1010.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253279/d4d7b85f-3e49-9ed4-b709-42f1b47c39b8.jpeg)
コードにOnEnableを書き加え確認するとしっかり呼ばれているのを確認できる
![1111.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253279/82e4dbef-d417-48c4-be89-6a58c83971f9.jpeg)
Destroy処理の途中で親子関係を外す場合に期待する挙動としては確かに子はDisableされずEnableのままにしてほしいと思うので
中断できた場合は改めてEnableにするのだろうが
構造的に子か否かでその処理が走るかどうか決めていて親になった「子」には適用されないのだろう
##親のOnDisableで親子関係を解除した場合
特筆することもなく親だけで処理が完結する
![212212.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253279/ee6db7bf-9b1d-a6e0-c101-120c75803bb7.jpeg)
#子のOnDestroyで親を外した時
親を外す処理はDestory中には不可能で、エラーになりそのままDestroyされる
![22222222.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253279/88fda6f7-8d79-637b-f0cc-40ff24a51443.jpeg)
##子のOnDisableで親を外した時
子でOnDisableの伝播が止まり孫はDisableされていないのでOnEnableも呼ばれない
![1515654.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253279/fc523215-0a4b-e07b-27bd-62602ab7c654.jpeg)
子はDisableのままになる
![654566.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253279/1e764bd3-51e4-44c9-fdcb-67caeeb2dcd7.jpeg)
#Unityが用意しているコンポーネントは？
子がRootへ変化する状況では同じくDisableされる
![16548163.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253279/09781913-2c25-9a76-e4f8-1170cc1d94c4.jpeg)
Particle Systemなどは出てるパーティクルが一度すべて消える
#感想
あんまり無い状況かもしれませんが、Destory中に親子関係を解除するとコンポーネントがDisableのままというのは
結構罠だと思うので、事前に解除しておきましょう
Mediumの長いURLを短くするbookmarklet


# 動機
Mediumでタイトルに日本語の入った記事を書くと、URLのパス部分に日本語部分がurl encodeされたものが入り、とても長くて使いにくいです。

例えばこんな感じ。

https://medium.com/librize/%E4%BC%9A%E7%A4%BE-%E3%82%AA%E3%83%95%E3%82%A3%E3%82%B9-%E3%81%AE%E8%94%B5%E6%9B%B8%E7%AE%A1%E7%90%86%E3%81%AB%E3%83%AA%E3%83%96%E3%83%A9%E3%82%A4%E3%82%BA%E3%82%92%E4%BD%BF%E3%81%86-851a42b7274b

このパスのうち、有効なのは最後の `851a42b7274b` だけです。つまり、上記のURLは

https://medium.com/librize/851a42b7274b

と書くこともできます。

Mediumの記事を紹介するというシーンはあまりないので、そのたびに手動で短くしていましたが、さすがに面倒になってきたので、それをやってくれるbookmarkletを作りました。

# 使い方

以下をブックマークとして保存し、 medium.com の記事を表示させた状態でクリックすると、短くなったURLがalertで表示されます。それをコピーして使います。

```
javascript:var%20url=new%20URL(window.location.href);"medium.com"==url.host?(url.pathname=url.pathname.replace(/[^\/]+-([0-9a-z]{12})$/,"$1"),alert(url.href)):alert("Site%20is%20not%20`medium.com`.");
```
【３行クイズ】クラス定義やrequire関数で正常かエラーかよく分からなくなるかもしれないクイズ

## はじめに

5つのソースコード（Q01～05）が、○（正常終了）か× （エラー）か答えてください。回答はページ末尾にあります。なお、動作確認したPHPのバージョンは7.2.17です。

※base.phpは共通して下記のソースになります。

```php:base.php
<?php
class base{}
```

それでは、問題です。

## Q.01
```php:q01.php
<?php
new hoge();
class hoge extends base{}
class base{}
```

## Q.02
```php:q02.php
<?php
new hoge();
class base{}
class hoge extends base{}
```

## Q.03
```php:q03.php
<?php
new hoge();
require("base.php");
class hoge extends base{}
```

## Q.04
```php:q04.php
<?php
require("base.php");
new hoge();
class hoge extends base{}
```

## Q.05
```php:q05.php
require("base.php");
class hoge extends base{}
new hoge();
```

## （回答の前に）結論

「ロード（includeやrequire） → 親クラス定義、子クラス定義（extendsやtrait） → インスタンス化 」という順番を守っていれば何の問題にはなりません。とある理由でバラしていたところ当たり前なことがよく分からなくなりました。私と同じように「わけが解らなくなる人」がいるのではないかと思いクイズにしてみました。

みなさんは、一瞬で答えられたでしょうか？

## 回答

1. × エラー
2. ○ 正常終了
3. × エラー
4. × エラー
5. ○ 正常終了

## 参考リンク

- [PHP/クラス定義とrequireのタイミング](http://www.betatechnology.jp/pp/index.php?PHP%2F%E3%82%AF%E3%83%A9%E3%82%B9%E5%AE%9A%E7%BE%A9%E3%81%A8require%E3%81%AE%E3%82%BF%E3%82%A4%E3%83%9F%E3%83%B3%E3%82%B0)
Qiitaのいかがでしたかを警告する

# 発端

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">“いかがでしたかブログ”を警告するGoogle Chrome拡張に続き, Qiitaで文中に自己紹介あったら警告するGoogle Chrome拡張の需要が高まっている</p>&mdash; Kayrlas🦅 (@eagleutkk) <a href="https://twitter.com/eagleutkk/status/1142765152774680576?ref_src=twsrc%5Etfw">2019年6月23日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

[いかがでしたか Qiita - Twitter検索](https://twitter.com/search?q=%E3%81%84%E3%81%8B%E3%81%8C%E3%81%A7%E3%81%97%E3%81%9F%E3%81%8B%20Qiita&src=typd)

ほう、そんなものがあるのかと調べました。

[しょうもない“いかがでしたかブログ”を警告するGoogle Chrome拡張【レビュー】 - 窓の杜](https://forest.watch.impress.co.jp/docs/review/1174083.html)
今年の三月にまたとり上げられたようですが、2017年にすでにあった拡張ですね。

ということでぱぱっとQiita用に書くだけ書きます。[^2]

[^2]: それ系は多分タイトルで避けていると思うので使わないかな

# コード

```js
// ==UserScript==
// @name         Qiita ikaga alert
// @namespace    http://tampermonkey.net/
// @version      0.1
// @description  本文のいかがでしたかを検知する
// @author       khsk
// @match        https://qiita.com/*/items/*
// @grant        none
// ==/UserScript==

(function() {
  'use strict';

  const item = document.querySelector('section.it-MdContent')
  const match = item.textContent.match(/(いかが|如何)でした(でしょう)?か/)
  if (!match) {
    return;
  }

  // 古い記事警告を参考にしている
  const alert = document.createElement('div')
  // 色被るので背景を手動で赤にしてもよいだろう
  alert.className = 'it-Alert mb-5 p-2'
  alert.textContent = 'この記事は「' + match[0] + '」が含まれています。'
  const icon = document.createElement('span')
  icon.className = 'fa fa-warning mr-1'
  alert.insertBefore(icon,  alert.firstChild)

  item.insertBefore(alert, item.firstChild)
})();
```
# スクリーンショット

自分の記事には遺憾にも「いかがでしたか」がなかったようなので([「いかがかな」はありました](https://qiita.com/khsk/items/085db0947c650e2db463#tldr))

失礼ながら他人様の記事をお借りします。

[「いかがでしたか」タグについて - Qiita](https://qiita.com/j5c8k6m8/items/9d911527cb3db75eaa0d)[^1]
[^1]: この記事で提唱されているタグ説明と私の記事へのいかがでしたかタグ付けの意味は違っていると思いますが、倣うより自分感覚優先で…

![ikaga.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62354/65d94284-d907-96a5-3ecc-78ba8a507225.jpeg)

タグは見てないのでご了承ください。


***

なお、先日リリースされたFirefox 68からUser Scripts APIがデフォルトで使えるといった話も見かけたので、
Tampermonkeyなどのアドオン不要のブラウザのみでユーザースクリプトを活用できるかもしれません。便利ですね。
MySQLの初期パスワードが/var/log/mysqld.logに出力されないときの対応（CentOS7 + MySQL8.0におけるパスワードリセット）


AzureのCentOS7.5にMySQL8.0をインストールした際、/var/log/mysqld.logに初期パスワードが出力されなかったので（パーミッションの問題？）、その際の対応をメモ。

## 結論

* パスワードをリセットするしかない

## やり方

とりあえずmysqldを停止させる。

```bash
sudo systemctl stop mysqld
```

mysqldをセーフモード？で起動させる。
CentOS7環境ではmysqld_safeコマンドは使えないみたいなので環境変数で起動オプションを設定。

```
sudo systemctl set-environment MYSQLD_OPTS="--skip-grant-tables"
```

mysqldを起動させる。

```
sudo systemctl start mysqld &
```

>コンソールが戻ってくるよう&をつけている。

rootでログイン

```
mysql -u root
```

パスワードを一度nullでリセット。

```
use mysql;
UPDATE mysql.user SET authentication_string=null WHERE User='root';
```

一応反映。

```
FLUSH PRIVILEGES;
```

mysqlを抜けて、mysqldを停止させる。

```
sudo systemctl stop mysqld
```

環境変数をリセット。

```
sudo systemctl unset-environment MYSQLD_OPTS
```

mysqldを起動。

```
systemctl start mysqld
```

パスワード無しで入れることを確認。

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

あとは、初期状態ならmysql_secure_installation等でパスワードを設定するか、

```
mysql_secure_installation
```

Alterでパスワードを変更する。

```
ALTER USER 'root'@'localhost' identified BY 'hogehoge';
```

以上。
【技術備忘録④】パスワード自動生成ツールの「apg」コマンドを試用して、地味にかかる思考時間を削減

- 現在利用している言語や技術の記法や不明点等を記録していく記事第四弾。
- 半覚醒状態での寝ぼけPC作業は、危険な破滅作業であることを深く刻みこむ最近。
- 今回は、わりと時間をとられてしまうパスワード生成に便利な「apg」コマンドを試用していくことにしよう。

## 概要
- 簡単なコマンドで、ランダムなパスワードの自動生成が可能なコマンドツール。
- 単純な文字列や形式指定のものまで、あらゆるパスワードを生成できる。
- ターミナルのみで完結するため、コマンドに組み込めたり、思考時間の削減等につながる。

## 特徴

### 豊富なオプション
- 単純なランダム文字列から、「何文字以上」や「記号や英数字を含む」等、パスワード入力で求められる形式も、指定して生成が可能。

### コマンド完結
- コマンドツールのため、ターミナル内の作業で完結するため、Webサイト等のジェネレーターを利用しなくても済む。
- また、shellやエイリアスに組み込むことで、さらに生成が簡単になる。

### 思考時間削減
- 様々な形式での生成が簡単に実行可能ため、パスワードの文字列に悩む時間を削減できる。
- **※単一の生成パスワードが不安であれば、複数生成して、それらを組み合わせることで、強固なものになる。**

## 結果
- 下記のように、簡単なコマンドで、ランダム文字列を自動生成。

<img width="346" alt="apg.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/336499/6904c781-0352-84a8-852f-845079ab9d01.png">

- 指定形式での生成も可能。
    - 例: **数字・記号・大文字・小文字を含む**

<img width="289" alt="apg_option.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/336499/2822426e-a0c9-3c8f-c747-0ed5c76f7f0f.png">

- 最長文字数指定での生成も可能

<img width="263" alt="apg_max.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/336499/21fc5023-fa02-44b5-f442-2378e1f6e670.png">

- 生成される数を指定しての生成も可能。

<img width="261" alt="apg_count.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/336499/ca140e8b-6d89-7227-708a-47b1442e6aa5.png">

- パスワード生成だけではなく、覚え方の表示も可能。

<img width="477" alt="apg_l.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/336499/a562db0e-ed53-d653-dd24-5eab1eaa9305.png">

## 作業環境
- Ubuntu 18.04.2

## インストール
- Linux(Ubuntuやapt環境)でのインストールは、下記のコマンドをうち、行う。

```bash
# apgのインストール
$ sudo apt install apg

# バージョン確認
$ apg -v
```

## 基本操作
- apgの基本操作コマンドとして、下記。

|内容|コマンド|
|:---:|:---:|
|通常生成|`apg`|
|表示数指定での生成|`apg -n数`<br>例 : `apg -n2`で2個|
|指定形式での生成|`apg -M形式`<br>形式一覧は下記。**※大文字で必須。()内の小文字で必須ではない。**<br>`S(s)` : 記号を含んだ生成<br>`N(n)` : 数字を含んだ生成<br>`C(c)` : 大文字を含んだ生成<br>`L(l)` : 小文字を含んだ生成<br>例 : `apg -M SCNL`で上記の形式を全て含んだ生成|
|指定文字を除いた生成|`apg -E指定文字`<br>例 : `apg -Eabcdefg -n2`で「小文字のapcdefg」を除いた2個|
|指定アルゴリズムでの生成|`apg -a指定アルゴリズム`<br>アルゴリズム一覧は下記。<br>`0` : デフォルト(可読性が高い生成)<br>`1` : ランダム生成<br>例 : `apg -a1`でランダム生成|
|指定文字数(最大)での生成|`apg -m数`<br>例 : `apg -m10`で10文字以上での生成|
|指定文字数(最低)での生成|`apg -x数`<br>例 : `apg -x10`で10文字以下での生成|
|指定形式のみでの生成|`apg -オプション -a1`<br>例 : `apg -Mn -a1 -n2`で数字のみ生成<br>例 : `apg -Ms -a1 -n2`で記号のみでの生成|
|覚え方も含んだ生成|`apg -l`<br>例 : `apg -n2 -l`で覚え方含む2個の生成|
|発音可能な生成|`apg -t`<br>例 : `apg -n2 -t`で発音可能な2個の生成|
|暗号化も同時に行う生成|`apg -y`<br>例 : `apg -n2 -y`で暗号化含む2個の生成|
|ヘルプページ表示|`apg -h`|
|バージョン確認|`apg -v`|

## まとめ
- 今回は自動パスワード生成コマンドの試用ということで、現在脳内をCLIツールが一世風靡している状態で、記事を書く。
- 単体利用ではなく、「他の生成ツールやランダム手動入力文字との組み合わせ」も便利だと感じたが、私の狭量脳内での記憶作業に不安。
- 「不要なパスワードの大量生成」と「無作為文字列の組み合わせ」という快感作業が完了したら、次回のツール捜索に取り掛かることしよう。

## 参考
- http://bioinfo-dojo.net/2018/05/07/linux_command_apg/  
→こちらの記事を参考にしました。大変お世話になりました。

- https://matoken.org/blog/2017/08/01/apg-command-option/  
→こちらの記事を参考にしました。大変お世話になりました。
Progateがわかりやすい

今週、「progate」を初めて使用しわかりやすく学ぶこともあったのでまとめていきたいと思います。

#Progateの使いやすさ
私は、Web関係の言語は趣味でサイトを作る際に本を読んで学びサイト作成してきました。ゆえに、作ったもの動きはサイトを更新しながら確認しておかしかったらコードを直して…を繰り返していたのですがProgateはリアルタイムでプレビューを目視でき、コードの修正がとてもしやすいと感じました。

#JQueryが楽しい
今回学習して一番楽しくできたのがJQueryでした。
関数を指定し、動かすのはプログラミングをしている感じが強まりわくわくしました。

```ruby:qiita.rb
$(function() {
  // showメソッドを用いて、「#title」要素を表示してください
  $('#title').show();
  
  // fadeInメソッドを用いて、「#image」要素を表示してください
  $('#image').fadeIn();
  
});
```

今週は全体的に初歩的なところを学ぶ形だったので来週はアウトプット中心に行いたいと思います。
【web開発 JQuery】動的に用意した要素にイベントを追加

# 躓き

```html
<a class="anker" href="#">anker0</a>
```
こちらはHTMLで処理前に用意した要素・

```javascript
let string = array("anker1","anker2","anker3");
for (let i=0; i<3; i++){
  $('.class').append('<li><a class="anker" href="#">'+string[i]+'</a></li>');
}
```
こちらはJavaScriptで動的に用意した要素。

```javascript
$('.class').on("click", function(e){ /* 処理 */});
```
上で用意した要素全てにclickイベントを追加したつもりが、JavaScriptで動的に用意した要素に対してはclickイベントは機能しなかった。

# 解決策

```javascript
$(document).on("click", ".anker", function(e){ /* 処理 */ });
```
こうすることで、動的に用意した要素にもclickイベントを追加することができた。

#onメソッドについて
##基本形
```
.on( events [, selector ] [, data ], handler )
```
|引数|データ型|説明|
|:-----------------|:------------------|:------------------|
|events|String|半角スペース区切りでイベントタイプ("click"など)とoptional namespaces("keydown.myPlugin"など)を単数もしくは複数設定可能|
|selector|String|選択された要素の子孫要素に対してイベントデリゲートできる|
|data|Anything|イベントハンドラに渡したいデータをハッシュで指定できる。|
|handler|Function|eventsが起きたタイミングで実行される機能|

##events
基本的な使い方は省略するが、連想配列を使用しイベント毎に機能を付与できるのは便利。

```javascript
$('.foo').on({
  'mouseenter': function(){ /* 処理 */ },
  'mouseleave': function(){ /* 処理 */ }
});
```
##selector
こちらは子要素で発生するイベントが親要素に次々に伝搬するイベントバブリングというJavaScriptの特徴を利用した設定方法であるイベントデリゲートを利用してイベントを付与する方法。動的に用意された要素に対しても付与できること、親要素に設定するためメモリを節約できることのメリットがある。

```javascript
$("ul").on("click","li",function(){ /* 処理 */ });
```
##data
event.dataに引数のdataを格納することができる。

```javascript
for (let i = 0; i < 3; i++) {
  $('button').eq(i).on('click', { value: i }, function(e){
    alert(e.data.value + '番目のボタンをクリックしました');
  });
}
```

#参考URL
[jQuery APIドキュメント（公式）](https://api.jquery.com/on/)
[【jQuery】onメソッドの使用方法](https://qiita.com/katsunory/items/7b50d399329767a893e1)
Lightsail環境のMySQLのパスワードを、スクリプトに平文で記載しない方法。

まず、スクリプトに平文で書いていたり、
コマンドラインで `-p<password>` の様にオプションを記載してMySQLへログインすると、
以下の様に叱られますね。

```
[Warning] Using a password on the command line interface can be insecure.
```

平文で書かずに暗号化しておく方法もありますが、今回は、
パスワード情報を他のファイルに置いて、
スクリプト上では それを参照する様に記載する方法を紹介します。

以下の記事を参考にさせていただきました。
[MySQL - コマンドラインでパスワード指定した場合の警告出力を抑止！](https://www.mk-mode.com/blog/2016/02/26/mysql-insecure-warning-on-commandline/)
　-　3. 方法・その２
　-　設定ファイルを使用する方法。

とりあえず、以下の要領で別ファイルを作成したんです。

```
[client]
user     = user_name
password = password

上記内容を下記構成ファイルへ記載。
bitnami@ip-xxx:~$ sudo vi /etc/myfeeder.cnf
bitnami@ip-xxx:~$ sudo chmod 600 /etc/myfeeder.cnf
```

しかし、敢え無く失敗。

```
bitnami@ip-xxx:~$ sudo mysql --defaults-extra-file=/etc/myfeeder.cnf feeder
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)
```

これは、socketに関する設定が不適と理解。以下の様に対処しました。

Lightsail環境のMySQLで利用されていると思われる
`/opt/bitnami/mysql/my.cnf` にある内容もそのまま `/etc/myfeeder.cnf` へ持ってこよう。
その上で上記内容〔ユーザー名、パスワード〕を該当セクションへ追記してあげよう。
（なお、末尾の !include /opt/bitnami/mysql/bitnami/my.cnf は除きました。）

これにより、該当Warningを回避できる様になりました。

```
bitnami@ip-xxx:~$ sudo mysql --defaults-extra-file=/etc/myfeeder.cnf feeder
Reading table information for completion of table and column names
    :
```
SQLアンチパターン-8章 メタデータトリブル-まとめ

ある年度の引越しの数のデータをまとめるテーブルを考えてみましょう。

このようなアンチパターンの設計のテーブルを作ったとします。

2019_move_count

|prefecture|move_count|created_at|
|:--:|:--:|:--:|
|東京都|100|2019-01-01 00:00:00|
|大阪府|80|2019-01-01 00:00:00|
|愛知県|50|2019-01-01 00:00:00|




## デメリット

### データ制約
このテーブル設計では、2020年になったら新たにテーブルを追加することになります。
そのテーブルには201９年以前のデータが入らないようにするために
created_atにはデータのCHECK制約を設ける必要があります。

### 間違ったデータの処理の手間
2020年のテーブルに入っているべきデータが
2019年のテーブルに入っていた場合、
2019年のテーブルから該当業を削除し、
2020年のテーブルに新たに挿入するという操作をしなければなりません。

### 一意性
2020年のテーブルにあるデータと、2019年のテーブルにあるデータで、（2018,2017...と全てのテーブルに対しても）ある行のデータの一意性が保たれていることを保証するためには
別テーブル(MoveIds)を用意し、各年毎のテーブルの行のidを利用して一意であることを保っておく必要があります。

### テーブル結合
全ての年度のデータをまとめるとなった際には、
年毎にテーブル結合のクエリが更新されていく必要があります。

### 新たな列の追加
新しい列を追加するとなった際には、全てのテーブルに対して
列の追加操作をする必要があります。


### 外部キーによる参照整合性がない
テーブルは複数に分かれているので
外部キーを元に引越し回数を取得するといったことは
基底テーブルや交差テーブルを作成する必要があります。

## 解決策

### パーティショニング

#### 水平パーティショニング
MySQLには `PARTITION BY HASH` を使って
テーブル内を分けることができます。

#### 垂直パーティショニング
こちらは列を元にテーブルを分割する方法です。
BLOB型、TEXT型といったデータを扱う列がある場合は
それらを別のテーブルとして扱ってデータを保存します。
多くのDBソフトがこれを自動で行なっているらしいです。
githubからcloneした(第3者が製作した)リポジトリを扱う際に詰まった点

# xcode
そのままビルドしても`PROJECT`側にエラーが出る場合
・`Automatically manage signing`に**チェックを入れる**
・`Signng`→`Team`のとこは**自分のアカウント(または有効なアカウント)に切り替える**
・`Identity`→`Bundle Identifier`のところは**独自の名前にする**(ex. com.hogehoge.`アプリ名`)

# sourceTree,Github
### ブランチにチェックアウトしたい時
```
error: Your local changes to the following files would be overwritten by checkout
```
と出たら、とりあえず`commit`する(`push`はしない)

随時書き足します

# 参考記事
**・[【Git】checkout時に、「error: Your local changes to the following files would be overwritten by checkout: 」｜Koushi Kagawa 😊｜note](https://note.mu/koushikagawa/n/n6f7c16a0d9e6)**
**・[git checkout で error: Your local changes to the following files would be overwritten by checkoutと言われる解決方法 - Qiita](https://qiita.com/pugiemonn/items/6f3adef98d279a5aac98)**
css memo

# MEMO


## スクロールバーを消す
モーダルウィンドウを出現させたは良いけど、スクロール出来る状態になってしまう。

```css:example
#example{
  overflow: hidden;
}
```
を使えば良さそう。

```js:example
$('body').css('overflow', 'hidden')
```
けれど、スクロールバーが非表示になったら、消えた領域分変な動きになる。
どうしよう。

戻すときは、styleを消す。

```js:example
$('body').removeAttr('style')
```
### 要調査
- スクロール更新も無効化されるか
- 横幅減る謎挙動
Raspberry Pi 3にWindows10 IoT Coreをインストールする

#概要
Raspberry Pi 3にWindows10 IoT Coreをインストールする手順です。

#使ったもの
[Raspberry Pi 3 Model B](http://www.amazon.co.jp/dp/B01NAHBSUD)
[Samsung microSDカード32GB EVO Plus Class10 UHS-I対応](http://www.amazon.co.jp/dp/B06XSV23T1)

#Windows 10 IoT Core ダッシュボード のインストール
ここからダウンロードします。
https://docs.microsoft.com/ja-jp/windows/iot-core/downloads
[インストール]をクリックします。
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/454725/42c2f8bc-de89-d854-40a2-8ca5995dd0f5.png)
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/454725/ee4e586a-f07a-c74d-9226-25ba0c2eec87.png)

#microSDカードにWindows 10 IoT Coreをインストール
[新しいデバイスのセットアップ]をクリックします。
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/454725/3553e699-04cd-6587-2b3e-a1abd3574bb1.png)
[デバイスの種類]
　下図の通り
[OSビルド]
　下図の通り
[ドライブ]
　Windows10 IoT CoreをインストールしたいmicroSDカードをのドライブを選択します。
[デバイス名]
　お好みで
[新しい管理者パスワード]
　お好みで
[Wi-Fiネットワーク接続]
　チェック外す
※ここでWi-Fiプロファイルを選択しておけば、Windows10 IoT Coreを起動したときのネットワーク設定が不要になるのかと思ったけど、そうはならなかった。。。

[ソフトウェアライセンス条項に同意する]にチェックします。
[ダウンロードとインストール]をクリックします。
![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/454725/de4604f8-4dc4-bef2-196c-aa5c206ce988.png)
[続ける]をクリックします。
![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/454725/4e2ad88b-bc3a-8c83-c47a-4471bf88cd21.png)
必要なファイルのダウンロードとmicroSDカードへの書き込みが開始されます。
![6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/454725/b6927794-bd8e-d2c1-85ce-12584a2afe73.png)
![7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/454725/32661683-8ccc-827c-7738-31a581e52c78.png)
途中で下記のメッセージが表示されたら[キャンセル]をクリックします。
![8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/454725/8e8eecab-64e8-d29a-7e0f-747f3985d8fa.png)
完了すると下図が表示されます。
![9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/454725/4ec5aeb5-0e01-e242-eebe-83a37676e80c.png)

Windows10 IoT Coreをインストールしたドライブ（今回はF:）以降にG:～I:のドライブが追加されています。
ここまで確認できたら、microSDカードを取り外します。
![10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/454725/7ba1e182-510b-605f-bee6-157fc71fbda2.png)

#Windows 10 IoT Coreを起動する
Windows10 IoT CoreをインストールしたmicroSDカードをRaspberry Piに挿入します。
Raspberry Piの電源をONにします。#画像が曲がっててゴメンナサイ
![11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/454725/619d9f52-72db-bd4c-5712-d26f8063ece7.png)
言語設定やプライバシー設定、ネットワーク接続設定が続きます。
![12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/454725/2fac1f67-271a-bb56-9fe2-2b5007e6bd42.png)
無事、Windows10 IoT Coreが起動しました。
![13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/454725/7068d4d4-d6fb-d01e-d7f8-93e5ec5cd6c6.png)
Selenium for Python Elementにフォーカスを当てる

# はじめに

Seleniumで要素をクリックするとフォーカスが移るものだと思っていました。
挙動を監視していると、どうもそうではないように思える事が多々あります。
そこで確実にフォーカスを移す方法を考えてみました。

# 実装

JavaScriptとPythonを使って実現します。

## JavaScript

実際にファーカスを移す処理はJavaScriptで行います。
ここでは、以下のような記述にしてみました。

```javascript:javascript
arguments[0].focus({"preventScroll": arguments[1]})
```

## Python

上記のJavaScriptをSeleniumから呼び出します。

```python:python
def focusToElement(driver, by, value, preventScroll):
  JavaScriptFocusToElement = "arguments[0].focus({'preventScroll': arguments[1]})"
  element = driver.find_element(by, value)
  driver.execute_script(JavaScriptFocusToElement, element, preventScroll)
```

実際に使う場合は、以下のようになります。

```python:python
focusToElement(driver, By.XPATH, "//input[@name='cat']", True)
```

# 最後に

フォーカスを移す処理を入れてみたら既存のプログラムの安定性が上がりました。
また、スクロールの挙動がおかしかったのが治りました。
明示的にフォーカスを当てるのも考えて方が良いかもしれません。
python×Cloud Functions×FirestoreでAPIを簡単に作ってみる Pt2 テスト編（要約）

## 概要
Cloud Functionsは2019/7時点でpythonのエミュレータがありません。それで最初に躓いたのが、関数へのパラメータの受渡をローカルでどうテストするかです。結果的に、Cloud Functions同様にFlaskのrequestオブジェクトを使うのが楽だったので、やり方をまとめます。
また、折角なのでFirestoreも含めて、ローカルでテストしてみます。


 - 前回の記事はこちら
   - [python×Cloud Functions×FirestoreでAPIを簡単に作ってみる Pt1](https://qiita.com/ny7760/items/9cdc3407dfda99c21ae1)

## 開発環境
- 開発環境
  - MacOS
  - python3.7
  - pycharm

## 要約

やることは以下の通りです。

1. テストしたい関数のソースを作る
2. Flaskを使ってローカルにAPIを作る
3. 2を実行して、localhostにリクエストを投げる

##### テストしたい関数

```python:functions/getFilteredUser.py
import json
from google.cloud import firestore


# ソースはPt1と同じ
def get_filtered_user(request):

    request_json = request.get_json()
    if request.args and 'name' in request.args:
        request_name = request.args.get('name')
    elif request_json and 'name' in request_json:
        request_name = request_json['name']
    else:
        request_name = ''

    db = firestore.Client()

    query = db.collection('user').where('name', '==', request_name)
    docs = query.get()
    users_list = []
    for doc in docs:
        users_list.append(doc.to_dict())
    return_json = json.dumps({"users": users_list}, ensure_ascii=False)

    return return_json
```

###### FlaskでローカルにAPI作成

```python:localServer.py
from flask import Flask, request, abort, render_template, send_from_directory
# テストしたい関数を外部ソースからimport
from functions.getFilteredUser import get_filtered_user

app = Flask(__name__)


# methodにPOST等も指定(FlaskではデフォルトGETのみのため)
# '/~'がテストするときのパス
@app.route('/get-filtered-user', methods=['GET', 'POST'])
def local_api():
    return get_filtered_user(request)


if __name__ == '__main__':
    app.run()

```
Firestoreへのアクセス方法として、実行時に環境変数で秘密鍵ファイルを読み込ませています。localServer.pyを実行するとAPIが作られます。

###### POSTでリクエスト

```console
$ curl -X POST -H "Content-Type: application/json" -d '{"name": "Alice"}' http://127.0.0.1:5000/get-filtered-user
{"users": [{"age": 19, "name": "Alice", "gender": "female"}]}
```

これで、Cloud Functionsにデプロイせずともテストできるようになりました。デプロイすると２分ほど待ちますが、この方法だとすぐにテストできます。

## 詳細版書きました
(2019/8/4) 詳細版書きました。良ければこちらも読んでみてください。
[python×Cloud Functions×FirestoreでAPIを簡単に作ってみる Pt2 テスト編（詳細）](https://qiita.com/ny7760/items/01dacd4df434f4a5be25)


## 参考文献
[How to develop Python Google Cloud Functions](https://www.timvink.nl/google-cloud-functions/)
[ローカルでの関数の実行](https://firebase.google.com/docs/functions/local-emulator?hl=ja)

 - 次回以降の記事はこちら
   - [python×Cloud Functions×FirestoreでAPIを簡単に作ってみる Pt2 テスト編（詳細）](https://qiita.com/ny7760/items/01dacd4df434f4a5be25)
   - [python×Cloud Functions×FirestoreでAPIを簡単に作ってみる Pt3 デプロイ編](https://qiita.com/ny7760/items/7ff05b255aac2e8fa3a3)
おしゃれなフォームタグ

```index.html
<link href="https://use.fontawesome.com/releases/v5.6.1/css/all.css" rel="stylesheet">
 <div class="search-box">
    <input class="search-txt" type="text" name="" placeholder="Type to search">
   <a href="#" class="search-btn">
        <i class="fas fa-search-plus"></i>
   </a>
</div>
```

```style.css
 
body{
    margin:0;
    padding:0;
    background:#e84118;
}

.search-box{
    position:absolute;
    top:50%;
    left:50%;
    transform:translate(-50%,-50%);
    background:#2f3640;
  
    height:40px;
    border-radius:40px;
    padding:10px;
}
.search-btn{
 color:#e84118;
 float:right;
 width:40px;
 height:40px;
border-radius:50%;
background:#2f3640;
display:flex;
justify-content:center;
align-items:center;
}

.search-txt{
    border:none;
    display:none;　//写経できてなかったところ
    background:none;
    outline:none;
    float:left;
    padding:0;
    color:white;
    font-size:16px;
    transition: .4s;
    line-height:40px;
    width:240px;
}

.search-box:hover > .search-txt{
    width:240px;
    padding:0 6px;
    display:block;　　//写経できてなかったところ
}
.search-box:hover > .search-btn{
  background:white;
}
.search-btn{
    color:#e84118;
    float:right;
    width:40px;
    height:40px;
    transition: .4s;
}

```
<img width="960" alt="2019-07-11.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439295/de5c4f39-8bad-c034-70ea-a5ef3c17a657.png">

マウスカーソルをおくと・・・・・
<img width="960" alt="2019-07-11 (1).png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439295/07c9edfb-2334-b02f-5243-aee8210dccea.png">

参考（写経）にしたurl
[Awesome CSS Search Box Using Only HTML & CSS](https://www.youtube.com/watch?v=v1PeTDrw6OY&list=WL&index=58&t=0s)
pythonのことはじめ

# pythonのことはじめ

このページはpythonとはなんぞやといった基礎的な情報を、Javaとの違いを交えてまとめます。

Contents
=========

## pythonとは

* pythonとはインタプリタ型のプログラム言語である。
* pythonのバージョンは現在は、2系と3系が主流でそこそそこの違いがある。<br>
  新しく作るものは、3系を採用するのが主流だと思われるが、用の中の多くのアプリケーションやツールなどではまだまだ2系であるものも少なくない。
* 科学計算や統計処理などのライブラリが豊富に提供されているため、昨今の人工知能とかのバズワードに乗って、シェアを拡大している。<br>

## pythonの特徴

* シンプルなコードで読みやすい
* 他の言語に比べて比較的に記述量が少なく済むことが多い。
* インデントでブロックを識別する（[オフサイドルール](https://ja.wikipedia.org/wiki/%E3%82%AA%E3%83%95%E3%82%B5%E3%82%A4%E3%83%89%E3%83%AB%E3%83%BC%E3%83%AB)）
* すべての変数はオブジェクトである。（Javaのようなプリミティブ型は無い）
* 動的型付けである。（変数に型宣言などはなく、最初に代入されて時に決まる（実行時））
* クラスを使ったオブジェクト指向型の実装もできるが、javaのように全部クラスで書かないといけないわけではなく、関数型プログラミング的な特徴も持っている。<br>
  また、１ファイル１クラスのような縛りもない。（コーディングルールで縛ることも私の経験上では少ない）

その他、いろいろあるが、弊社で主流のみんな知っているであろうjavaとの比較記事を参照。

### javaとの比較

* [JavaプログラマがPythonを勉強してみた。(型について）](https://qiita.com/riekure/items/57f306500636727bc125)
* [独断と偏見のプログラミング言語比較](https://qiita.com/sileader/items/63bb8c373f8a99c830e3)
* [JavaとPython徹底比較を専門用語ゼロで解説](https://www.sejuku.net/blog/36782)

## pythonの実行環境

pythonの実行環境は、[公式サイト](https://www.python.org/)からそれぞれのOSにあったものをインストールすることで実行可能となる。

Unix/Linux系の各ディストリビューションについては、概ねデフォルトでインストールされている。
（大半はv2.7当たりが入っているが、最新のものだと3系がデフォルトになっているものとちらほら出てきた）

[Anaconda](https://www.anaconda.com/)のように中にpythonを含まれるプロダクトとかもある。
Anacodaについては以下を参照。<br>
[Anaconda を利用した Python のインストール ](https://pythondatascience.plavox.info/python%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB/python%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB-windows)

## パッケージ（ライブラリ）の管理

javaのmaven/gradle、NodeJSのnpm/yarn、PHPのcomposerなどのようにパッケージ（ライブラリ）を管理するためのpipというものを利用する。
公式のpythonをインストールするとで一緒にインストールされるので、実質的にこれがスタンダート。

実行例）
* httpのクライアントライブラリをインストールする。<br>
`pip install requests`
* インストールされているパッケージ一覧を表示<br>
`pip freeze`

## 実行仮想環境について

１つの端末（OS）で複数のバージョンなどを実行する仮想環境を構築する仕組みがいくつかの方法で用意されている。
この仮想環境を利用する理由は、以下のようなもの。

* 複数のプロジェクトで異なるバージョンを利用していたりするケース
* 多くのLinuxのディストリビューションの各モジュールはpythonで実行されているものがあり、前述の通り、大抵はOS標準でインストールされているバージョンを前提とした実装となっているため、標準をアンインストールして異なるバージョンをインストールするとOSのモジュールが動かなくなってしまう可能性があるため

仮想環境の構築方法には、いくつかの仕組みが提供されいてるが、詳細は以下のリンク集を参照。


私的な見解では、pythonのオフィシャルがvenvを取り込んだこと、パッケージも含めた仮想環境を簡単に作れることから、Pipenv(venvとpipのセットで全体を管理)が主流になっていくのではないかと思われる。<br>
※Pipenvはnodeのnpmのpackage.jsonに似た感じでPipfile/Pipfile.lockでプロジェクトで利用する仮想環境、パッケージ（ライブラリ）のバージョン全体を管理できる。

実際にpythonで実装したアプリケーションを実行する場合でもDockerようなコンテナでそのアプリケーションプロセス以外を動かさないなどのケースを除いては、この仮想環境でアプリケーションを実行することが多い。（私的見解）

### 仮想環境関連のリンク集
* [Pythonの環境管理ツール良し悪し](http://www.zopfco.de/entry/2017/04/03/233811)
* [初心者向け・Pythonの仮想環境venvとPipenvによるパッケージ管理についての解説](https://paiza.hatenablog.com/entry/2018/07/05/%E5%88%9D%E5%BF%83%E8%80%85%E5%90%91%E3%81%91%E3%83%BBPython%E3%81%AE%E4%BB%AE%E6%83%B3%E7%92%B0%E5%A2%83venv%E3%81%A8Pipenv%E3%81%AB%E3%82%88%E3%82%8B%E3%83%91%E3%83%83%E3%82%B1%E3%83%BC%E3%82%B8)
* [チームで使うPython3開発環境の比較検討と構築手法](https://qiita.com/po3rin/items/5c853bc172e5de330148)
CSSの変更が反映されない

#現象
HTMLとCSSを勉強のため、dockerとnginxでwebサーバーを構築したが、CSSを変更しても反映されなかった。


#対処法
調べたところ、nginx.confのsendfileをoffにすればよいとわかった。


```nginx.confの確認
$ docker exec -it コンテナID /bin/bash
$ cat /etc/nginx/nginx.conf

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;
```


# nginx.confの編集

docker内のファイルを直接編集する方法がわからず、以下のコマンドでローカルにコピー。

```
$ docker cp nginx_web_1:/etc/nginx/nginx.conf .
```

nginx.confのsendfileをoffに変更。

```nginx.conf
sendfile        off;
```
docker-compose.ymlに以下を追加し、confファイルをコンテナにマウント。

```docker-compose.yml
'- ./nginx.conf:/etc/nginx/nginx.conf'
```

コンテナを再度作成

```
$ docker-compose up
```

#直らず
CSSを削除しても変わらなかったので、ブラウザが原因だと思い、
デベロッパーツールからブラウザのキャッシュをクリアしたところ直った。
CSSが反映されないときはとりあえずブラウザのキャッシュを疑うべきとのことらしい。
<img width="589" alt="スクリーンショット 2019-07-11 1.31.47.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/421393/041a7b9f-ddd1-b8e6-ab03-de6841b965bc.png">

#参考
https://qiita.com/shoyan/items/12389d5beaa8695b1a53
https://qiita.com/gologo13/items/7e4e404af80377b48fd5
【練習】pythonでbaseball-labをスクレイピングする

#はじめに
[【世界で5万人が受講】実践 Python データサイエンス](https://www.udemy.com/course/python-jp/)
を受講して野球のデータを触ってみたくなったので
スクレイピングしてみることにした。
著者のプログラミング歴は2週間ほど

#やってみたこと
- [ベースボールラボ](http://www.baseball-lab.jp/)から2018年のベイスターズの野手データを抜き出す
- 抜き出したデータをdataframe化


#参考
[ベースボールラボ](http://www.baseball-lab.jp/)
[【世界で5万人が受講】実践 Python データサイエンス](https://www.udemy.com/course/python-jp/)

#コード

```python
from bs4 import BeautifulSoup
import requests
import pandas as pd
from pandas import Series, DataFrame

#2018年のベイスターズの野手データ
url = 'http://www.baseball-lab.jp/player/batter/3/2018/'

#この辺は講座の情報通りおこなった
result = requests.get(url)
c = result.content
soup = BeautifulSoup(c)
summary = soup.find('div', {'class': 'content-holder'})
tables = summary.find_all('table')
data = []
rows = tables[0].find_all('tr')
for tr in rows:
    cols = tr.find_all('td')
    th_sort = tr.find_all('th')
    for td in cols:
        players = td.find(text=True)
        data.append(players)


#numpyをimportして、リストをアレイ化して26個ずつにreshapeする
import numpy as np
arr1 = np.array(data).reshape(-1,26)
```
ここまででdataframe化するアレイは用意できたのでcolumnsに設定する項目を作っておく（thタグから取り出そうとしたが、改行のせいか中身がないデータが返ってきたため）

```text
:index_batter.txt
背番号
選手名
試合
打席
打数
得点
安打
二塁打
三塁打
本塁打
塁打
打点
三振
四球
敬遠
死球
犠打
犠飛
盗塁
盗塁刺
併殺打
失策
打率
長打率
出塁率
OPS
```

```python
#columnsに名前を付ける
f = open('index_batter.txt')
index_batter = f.read().split()
print(index_batter)
f.close()

df = DataFrame(arr1)
df.columns = index_batter

#実行
df
```

![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458572/9e04a5eb-31c0-b8d2-037f-99b1538b998b.png)


#今後の課題

- 選手名に改行やスペースがあり、扱いづらいので修正したい
- columnsの名前をhtmlから直接引っ張ってきたい
- 年度別や他チームとの比較したい
- データの可視化
ある社内SEが初めて作ったWebサービスの構成と昨今の何でもAWSに物申す

## 本番システム構成
**サービス本体**
Webサーバ：Nginx
APサーバ：Puma
DB:PostgreSQL
プログラム：Ruby on Rails
OS:CentOS7
を
さくらのクラウドで動かす。

**バッチ処理**
C#.NET
他省略。たいしたことやってない。

を
さくらのクラウドで動かす。

DBをサービス本体と共有して、やり取りしてる。今の時代はマイクロサービス的なAPI経由なんでしょうけど、
まあいつか・・・

**検証環境**
社内のそこらへんにあったWindowsPCにVMWareを入れて、その上に上記環境入れて動いています。
WMwareめっちゃいいですよ。壊れても消せばいいし、ファイルコピーすれば他のPC
もっていってもすぐに復元するし。バックアップもファイルコピーしておけばよいし。重いけど。
（ほんとはどっかーとかでやるのが一番いいって分かってる。分かってるんよ！まあいつか・・・）
社内SEの人はWindowsオンリーの人ばかりだと思います。ただ、Webサービス作るにあたっては
どうしてもLinux系のOSに慣れる必要がどうしてもあります。

なぜか。

本番環境は結局CentOS7を想定していたので、Windowsだとわけわからないエラーが出ます。
（実際にありました。Windowsではちゃんと動くのに検証環境持っていったら、動かないやつ。
　この時の原因はWindowsでしか動作しないPing系のGemを入れていたためでした。分からんて。
　そんなん。2日間かかりました。原因調べるの。）
まあ、でも開発はWindowsでしてますがね。てへ。

話は戻して、ちなみに本番は
今どきのクラウドサーバにおいて動かしてます。
でも、
AWSじゃないよ**さくら**だよ。

なぜか。

日本のサービスだから、とっても分かりやすい。マニュアルも全部日本語やし、
初めてだったが、かなりスムーズに構築できた。
みんなクラウドと言えばAWSみたいな感じですが、取っつきやすさ、課金の
分かりやすさ（従量課金ではない）はさくらがダントツ。
※ちなみにうちの経営者はAWSで！ってミーハーな感じで言ってきてたので、
　従量課金で24時間動かしてたら、かなりコストいっちゃいますよ～
　想定よりかなりいっちゃう可能性ありますよ～。にやにや。とやんわり伝えたら、
　さくらで了承してくれました。

## ちょっと言いたいこと（AWSに物申す。AWS信者にも。）
はっきり言って小規模の会社で、社内運用並み＋αくらいのものであれば、
オンプレミス環境でもあまり問題にならないと思います。
（電源管理、インターネットの帯域管理、Windowsなら勝手に再起動しないでがある程度
求められますが、まあ稼働率90％あればええやん的な。ゆるい感じ。
かけるコストと内容と運用する時間とのバランスを考えると上記のような考えは全然ありです。
今までもこうしてきて、クレームほぼないし。お金を追加で払わなくてよいし。
ほんとに24時間絶対動かさないかんっていうやつであれば、じゃあクラウド考えましょうで良い。）
まあでも経営者はやたらとクラウドでって言うので、これも時代の流れでしょうか。
最初オンプレでも全然ＯＫだと私は思います。なんかやばくなってきてからクラウドに移せばいいし。
オンプレミスからクラウドに移すっていう経験もとても良いものですよ♪

また、Webサービス作って、AWSに上げて、いい感じに構成してって、一般ピーポーからしたら
ものすごいハードル高い。
ローカルでもぎりぎり動いているのに、CentOSの理解に一苦労、AWSのドキュメント読みこんで、
AWSの理解に二苦労、ぐぐっても英語ばかりで三苦労ってなると、ほぼ挫折するはず。一般ぴーぽーは。
だから、ほぼ日本語で押し通せて、一番挫折しなさそうな　Ruby　→　さくら　という選択になりました。
ただ、さくらもしっかりしたクラウドで他のも似たようなもんだと考えると、
今ならたぶんAWSでも大丈夫な自信が無駄にあります。

## ということで、一般ぴーぽー社内SEがWebサービス作るなら・・・
- Ruby(on Rails)　と　さくら　で決まり！一番挫折しない組み合わせですよ。ほんとにお勧め。
- DBは何でもいいよ。好きなの。お勧めはPostgreSQL
- エディタはVSCodeを使いましょう。
- Teraterm(SSHでCentOSに入るためのツール。コピペが簡単にできるからとっても重宝する。)
- WinSCP(ファイル転送ソフトだが、CentOSのファイルも見れる。ディレクトリ構成が一目瞭然

## 最後に
昨今の日本は生産性の向上が叫ばれていますが、ポイントとなるのは開発側の人間ではないです。
導入する側のITリテラシーにかかっています。そして導入側をリードするのが我々社内SEです。
実は生産性の向上に一番寄与するのが我々社内SEのはずなんです。業務フローも分かっていて、
ITの知識もあり、間に入って仕様の調整、工数調整できるのは我々です。
逆に社内SEがしっかりしていないところは、いわゆるベンダーの言いなり価格、言いなり仕様に
なります。自分もベンダー側の人間だったことがあるので・・・
結果、現場で使われない、意味不明な仕様の実装、無駄なお金が飛びます。

ただ、上記のしっかりしている社内SEになるには
レガシーな知識にとらわれず、最新のIT知識・その知識を持って簡単なサービスの実装
ができるほどの力は持っていないといけません。と私は思います。と私は思ったからこそ
今更Webサービス作ったりしています。
色々やっていると、実はフルスタックF/W（RubyだとRails）で全て作るような時代は
とうの昔に過ぎ去っており、サーバーサイドとクライアントサイドに明確に分けて
サーバーサイドはAPI実装が基本、クライアントサイドはSPAでの実装が基本というのが今の時代だそうです。
いわゆるマイクロサービス的な～♪　PayPayも3か月で組んだそうですよ。マイクロサービス的な
開発で。昔は考えられなかったのですが、インターネットの速度が劇的に向上したからこそ、こういうのが
できる時代になったんでしょうね。

**まだまだ私はレガシー社内SEだった**ということで、今回のお話の締めにしたいと思います。
ああ、書いてすっきりした。
Nuxt 2.8の生成するtsconfig.jsonを使うとIntelliJ(WebStorm、PhpStorm等)がCannot find moduleエラーを吐く

※本記事の修正方法は、試行錯誤の結果導き出したもので、Nuxtのビルドシステムの全体的な理解を欠いた不十分なソリューションである可能性があります。ご了承ください :pray:

## 不具合の概要

[Nuxt.js](https://ja.nuxtjs.org/)でプロジェクトを作成し、[公式の手順](https://ja.nuxtjs.org/guide/typescript)でTypeScriptサポートを有効にすると、IntelliJ系のIDEが以下のように「TS2307: Cannot find module」エラーを吐く状態になってしまいます。

<img width="381" alt="Screen Shot 2019-07-11 at 0.51.53.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33450/9f78d6ec-1784-db36-4d4b-5730fb65b6c1.png">

※手元の環境はWebStorm 2019.1.3、Nuxt 2.8.1、TypeScript 3.5.3

## 直し方

`*.vue` の型定義を `shims-vue.d.ts` という名前で作成し、これをプロジェクトのルートディレクトリに置きます。

```shims-vue.d.ts
declare module '*.vue' {
  import Vue from 'vue'
  export default Vue
}
```

次に、[tsconfig.json](https://www.typescriptlang.org/docs/handbook/tsconfig-json.html) の設定を調整し、 `*.vue` （と、ついでにtsも）をincludeします。

```tsconfig,.json
  "files": [
    "shims-vue.d.ts"
  ],
  "include": [
    "components/**/*.ts",
    "components/**/*.vue",
    "layouts/**/*.ts",
    "layouts/**/*.vue",
    "pages/**/*.ts",
    "pages/**/*.vue"
  ],
  "exclude": [
    "node_modules"
  ]
```

これによって、IDEのエラーが消え、モジュールの解決が動作するようになります。

<img width="285" alt="Screen Shot 2019-07-11 at 2.25.41.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33450/055587d8-31a7-59df-1f63-475f46501ac3.png">

修正後のプロジェクトは以下のリポジトリに置いてます。
https://github.com/ryo-utsunomiya/nuxt-ts

shims-vue.d.ts がなぜ必要かについては以下のissueに詳しいです。
https://github.com/vuejs/vue-cli/issues/1198
簡単にいうと、実際のビルドには不要ですが、IDE(WebStorm/VSCode等)がCannot find moduleエラーを吐かないようにするために必要なファイルです。ちなみに、vue-cliでTypeScriptサポートを有効にした場合はsrc配下に配置されます。

## Nuxt + TypeScriptプロジェクトの構築手順

本記事で使用したプロジェクトの構築手順を、最後に書いておきます。

```
npx create-nuxt-app nuxt-ts
```

選択はミニマムで（パッケージマネージャはyarnにしてますがnpmでも問題ないです）。

<img width="733" alt="Screen Shot 2019-07-11 at 0.45.42.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33450/64109dc7-de3a-19aa-c539-609fd38e2b9f.png">

```
cd nuxt-ts
yarn add -D @nuxt/typescript
yarn add ts-node
touch tsconfig.json
yarn nuxt
```

ここまででTypeScriptのセットアップ完了。

次に、.vueファイルの中でTypeScriptを使うため、pages/index.vue のscriptタグに `lang="ts"`を追加。

```pages/index.vue
<script lang="ts">
```

pages/index.vue の中で以下のようなコードを書くと、型チェックエラーが発生します :thumbsup: 

```typescript
const add = (a:number, b:number) => a + b;
add("a", "b");
```

<img width="682" alt="Screen Shot 2019-07-11 at 2.09.42.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33450/48ce9e5d-9bd6-f55f-46b1-d7c1d5b86a15.png">
Kuromame6の幽霊

#[HIISU](https://wasforum.jp/2019/03/hardening-ii-su/)のエンディングテーマ（非公式・非公認）

 - 米津元帥の「海の幽霊」の替え歌で「Kuromame6の幽霊」
 - 2019年7月4日のツイートを元に、7月10日に映画「海獣の子供」を鑑賞したこともあって7月11日に再編集
 - 元の歌は　⇒　https://youtu.be/1s84rIhPuhk


-

開け放たれた このドームには誰もいない　潮風の匂い 染み付いた ブースが複数

あなたが分からないように ログ消しとくよ　軋むキーボード叩いて

何から探せばいいのか わからなくなるかな

**DoSが降る夜にあなたに会えた　あの攻撃を忘れはしない**

**大切な証拠はログに残らない　夏の日に起きたキルチェーン**

**思いがけず光るのはkuromame6の幽霊**


-


茹だる夏の夕に木馬がデータを見送る　いくつかのコマンドを叩く酒飲み散らして

あなたがどこかで怒鳴る声が聞こえる　熱い経営会議で

ねじれた攻撃成功したら権限が昇格

**離れ離れでもコマンドは効くもの　叩こう ラテラルムーブメント**

大切なデータはだいたい取れた　C&Cサーバに飛ばして

怒声飛ぶ夜に　あなたに会えた　多層防御を忘れはしない

**標的型攻撃は言葉にならない　夏の日に起きたインシデント**

思いがけず光るのはkuromame6の幽霊

**風薫る あの島で また会いましょう**
vue.jsのディレクティブをまとめてみた。part2

##v-for
jsのfor文

```index.html
<div id="app">
      <ul>
          <li v-for="pref in prefs"><!--変数名 in　配列名-->
           {{pref.name }}   
          </li>
      </ul>     
    </div>
  
<script src="https://cdn.jsdelivr.net/npm/vue"></script>
<!--vueのCDNを読み込む-->
<script>
   let app=new Vue({
        el:"#app",
        data:{
            prefs:[
                {name:'北海道'},
                {name:'青森県'},
                {name:'岩手県'},
                {name:'宮城県'},
                {name:'秋田県'},
                {name:'山形県'},
                {name:'福島県'},
            ]
        }
   });
</script>

```
上記にボタンを押すと、シャッフルできるようにしたい。
lodashというライブラリを使う。

```index.html
<div id="app">
    <ul>
        <li v-for="pref in prefs"><!--変数名 in　配列名-->
            {{pref.name }}   
        </li>
    </ul>   
    <button v-on:click="shuffle">シャッフル</button>  
   
    </div>

<script src="https://cdn.jsdelivr.net/npm/vue"></script>
<!--vueのCDNを読み込む-->
<script src="https://cdn.jsdelivr.net/npm/lodash@4.17.14/lodash.min.js"></script>
<script>
    let app=new Vue({
        el:"#app",
        data:{
            prefs:[
                {name:'北海道'},
                {name:'青森県'},
                {name:'岩手県'},
                {name:'宮城県'},
                {name:'秋田県'},
                {name:'山形県'},
                {name:'福島県'},
            ]
        },
        methods:{
            shuffle:function(){
               this.prefs=_.shuffle(this.prefs); //_.はlodashを使うためのルール
            }

        }
    });　　//ボタンを押すとprefがシャッフルされるという処理になる。
</script>

```
##v-on:click
addEventLintener('click',()=>{});に意味が似ている?クリックした後処理をする。

```index.html
<div id="app"> 

 <p>{{now}}</p>
    <button v-on:click="time">現在時刻を表示する</button>
    </div>
  
<script src="https://cdn.jsdelivr.net/npm/vue"></script>
<script>
   let app=new Vue({
       el:"#app",
       data:{
           now:"00:00:00"
       },
       methods:{
           time:function(e){
               var date=new Date();

               this.now=date.getHours()+":"
               +date.getMinutes()+":"+
              　date.getSeconds();　　//現在時刻を表示
           }
       }
   });
</script>
```
part1 
[vue.jsのディレクティブをまとめてみました。part1](https://qiita.com/masal9pse/items/3b6ea7b8f1b2a7ade2e9)
assert_difference~ヘルスケアwebサービスを自分で作る医者の日記~

13章　終わりまで長い、、、

assert_differenceは　引数に渡してものが、do以下によって変わっているかどうかをしらべるもの


```
test "associated microposts should be destroyed" do
    @user.save
    @user.microposts.create!(content: "Lorem ipsum")
    assert_difference 'Micropost.count', -1 do
      @user.destroy
    end
  end
```
次回13.2から
pixi.js ではサウンドをサポートをしていない?require-is-not-defined

pixi.jsではサウンドをサポートしていません。
別にあるpixi-sound.jsという音のみをサポートするフレームワークを別途導入する必要があるようです。

早速、CDN版を入れたところ、
https://www.jsdelivr.com/package/npm/pixi-sound
以下のエラー
<img width="982" alt="スクリーンショット 2019-07-11 午前0.45.16.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/426556/a398489f-22e7-6a41-9955-b7baeeb8d20f.png">


TypeScript(.ts)形式で作られ始める前までの2.1.3で動かしたところ、動作は確認できました。
https://github.com/pixijs/pixi-sound/releases/tag/v2.1.3

2.1.4以降でなぜエラーが出るのかは調査中です。

https://stackoverflow.com/questions/19059580/client-on-node-uncaught-referenceerror-require-is-not-defined
require()は、WebブラウザのJavaScriptで存在していないため、以下の３つの方法で解決できるとか

1　Use ＜script> tag.
2　Use a CommonJS implementation. Synchronous dependencies like Node.js
3　Use an AMD implementation.

実施結果は追々。
Django

# いろいろと

## 環境構築
[こちら](https://qiita.com/yohei-29/items/1c1befb67f118976c7ff)

## 初期設定
[こちら](https://qiita.com/yohei-29/items/cbc7a021e8544fa8a835)


## ベストプラクティス
[こちら](https://qiita.com/yohei-29/items/c50be80c5ce7494aa0ca)
はじめに

# はじめに
初期設定
runserverしつつもやると、設定ミスに気づきやすい。

## 設定

```py:setting.py
INSTALLED_APPS = [
    ...
    '<AppDir>.apps.<class>',
]
ALLOWED_HOSTS = ['*']
LANGUAGE_CODE = 'ja'
TIME_ZONE = 'Asia/Tokyo'

# 必要に応じて
STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static')]
MEDIA_URL = '/media/'
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.<>',
        'NAME': '<>',
        'USER': '<>',
        'PASSWORD': os.environ['<>'],
        'HOST': '<>',
    }
}
LOGGING = {
   ...
}
TEMPLATES = [
    {
        ...
        'DIRS': [],
    },
]
```

## DB
```sh
create datacase web;
grant all on <db>.<tb> to '<user>';
```

## Git
[こちら](https://qiita.com/yohei-29/items/b9339cd0ccdfcb7756da)
Laravel学習-Laravelのテーブル検索とかtruncate()とか  7月10日

ブラック企業と名乗っている会社で働いている副業ぴーです。

めちゃくちゃプログラミングが未熟ですが、1日平均4時間のプログラミング学習を習慣化しようと奮闘中
（とりあえず夜の2時くらいになると眠いよね。。）

現在、Laravelで自社の新規事業のwebアプリを開発中！
週末には新大久保のオフィスハウスで開発しとります♪
connpassイベント＝<a href="https://7chord.connpass.com/event/138635/">Laravelで営業ツール開発</a>

それ以外は、自宅で開発♪

開発中に役に立った記事やブログ、開発したソースコードを備忘録として、記載していこうと思います！


#Laravelのテーブル検索機能

昨日は、あまり意識しなくてDBにinsert出来たんですが、
正確にテーブル名を書いていないのに、insert出来た事に？？？ってなりました。

調べた結果
<strong>LaravelはModelのClass名に対して複数系の名前でDBにTableを探しに行くとの事</strong>

マジか。。そんな高性能&高性能だったのかLaravelさん。。

英語苦手な自分は非常に複数形の書き方間違えそうなので何か代替えになりそうなテーブルの設定方法を探すと下記のようにテーブル名を書くのもOKとの事。
これでmodelの英語の綴りが間違っていても多分大丈夫だと思われる。


```
class TestTable extends Model
{
    //DBにあるテーブル名を記載
    protected $table = 'test';

}
```

#テーブルに入っているデータを全削除のtruncate()

truncate()というものを使用されていたので、試しにやってみると
ファッ○。。。全部テーブルのデータ消えますやん。。

バルスのような破壊力。。。

備忘録として記載

```
model::truncate();
```

#バルクインサートの完成

本日は、csvファイルをインポートしてバルクインサートするページが完成
ソースコードは、昨日もご紹介した世界のアオキさんのブログに記載されている方法が最高&最高でした。
参照URL：https://coinbaby8.com/php-csv-import-bulk-insert-laravel.html

500ファイルずつ、importできるようになったので、エラーが減るはず。。