OmniAICreator/Qiita-1.07M huggingface dataset:
AWSのやっておくべきセキュリティ対策

AWSのやっておくべきセキュリティ対策として、基本的なことだが 大事なことなのでまとめておこうと思います。

##AWS Identity and Access Management
###IAMによる認証
* rootユーザには、強力なパスワードと多要素認証（MFA）を設定
* 基本的には、rootユーザを使用しない
* rootユーザのAccess Keyが発行されていた場合は削除する
* IAMユーザのパスワードポリシーには強力なものを設定
* IAMユーザのパスワードやAccess Key/Secret Access Keyは定期的にローテーションする
* 認証情報の利用状況はIAMのCredential Report機能で定期的に確認

###IAMによる権限設定
* 全てのアクセスはデフォルトで拒否（Deny）となっているため、必要な権限のみ明示的に許可（Allow）設定を行う
* アクセス権限の優先度は `暗黙的なDeny（デフォルトDeny） < 明示的なAllow < 明示的なDeny` 
* IAMポリシーは最小限のアクセス権を付与

###監査
* AWS CloudTrailによる証跡取得を行う
    * 誰が、いつ、どのような操作（AWS Console、CLI、API等）したかを記録
    * AWS CloudTrail自体の料金は無料
* AWS ConfigによるAWSリソースの設定を記録し評価を行う
    * AWSリソースの変更履歴、構成情報を管理
* AWS Config RulesでAWSリソースが**あるべき状態**になっているかを自動評価
    * 例）Security GroupでSSHをフルオープンにしていないか
    * 例）公開状態になっているS3はないか
    * 例）全てのIAMユーザでMFAが有効になっているか

###IAMロール
* EC2にはIAMロールを利用する
    * AWSサービスに対してAWS操作権限を付与し、IAMユーザの認証情報をOSやアプリに持たせる必要がなく、認証情報の漏洩リスクを低減
    * 自動的に認証情報（Access Key/Secret Access Key）がローテーションされる
    * 認証情報はAWS Security Token Service（STS）により生成
* IAMロールを使えるものは全てIAMロールを利用
* オンプレからAWSリソースを操作する場合等、致し方ない場合のみIAMユーザを利用
* IAMユーザやアクセスキーは共有しない
* git-secretsを使用しクレデンシャル情報の漏洩防止

###S3 Access Management
* 必要以上に公開範囲の広いポリシーやACLを設定しない
    * EC2やAWSサービスからのアクセスはIAMロールで行う
* 外部へ開放されているバケットを定期的にチェックする
    * AWS Trusted Advisor
    * AWS IAM Access Analyzer（Access Analyzer for S3）

##発見的統制
* 各種AWSサービスのログを有効化する
    * CloudTrail：誰が、いつ、どのような操作（AWS Console、CLI、API等）したかを記録
    * VPC Flow Logs：VPCのネットワークインタフェース間のIPトラフィックをキャプチャ
    * Lambda：Lambda Functionに関するエラー出力、標準出力等のログを収集
    * CloudWatch Logs Agent：EC2上で動作するOS、ミドルウェア、アプリケーション等のログをCloudWatchへ収集

##データ保護
* 保存時のデータ暗号化（Encryption at Rest）
    * サーバサイド暗号化（SSE）ではAWS Key Management Service（KMS）キーを使用し暗号化
    * クライアントサイド暗号化（CSE）ではKMSでCustomer Master Key（CMK）を使用し暗号化
* 通信の暗号化（Encryption in Transit）
    * SSL通信を利用
    * AWS Certificate Managerで証明書を発行（無料）、自動管理
    * CloudFrontとELB間をHTTPSにし、ELBをSSH Terminationとする
* DB接続情報やクレデンシャル等はセキュアに保管する
    * AWS Systems Manager Parameter Store
    * AWS Secrets Manager
DiscordのWebhooksをurllib経由でたたいて簡単自動発言ボット作成

# 概要

AWS Lambda の Python 3.7 ランタイムを使ってDiscordのWebhook URL を叩くと 403 でうまいこと叩けずに困った。

原因を調べたらどうやらUAをチェックしているらしく、UAが urllib だとNG。( 試しに使った curl はOK )

Discordのライブラリを入れればいいんだろうけど、Lambdaという都合上、ほか依存ライブラリ追加したくない。

UAをcurlに偽装することでうまいこと叩けた。よかったよかった。

# 反省

- うまくいくパターンとだめなパターンの差分はHTTPヘッダをみよ。
- APIがコケる場合にはちゃんとステータス値とレスポンスボディとマニュアルをみよ。


# 参照

[Python3のスクリプトでjsonをPOSTする - Qiita](https://qiita.com/neko_the_shadow/items/324976c7b54623e82b26)

# 詳細

## What is Webhooks

Discordにおいて、なにかあったら自動で特定のチャンネルにメッセージを送りたい。

なんでも Webhookってのが作られるらしく、それならシンプルにJSONをポストするだけでそういうことができる。
（本当はDMを送りたかったんだけど、そっちはAPI経由になってだるそうなんでヤメ）

## How to get Webhook URL

たぶん管理者権限がいる。

1. チャンネルの右側に表示されているギアをクリック
2. 左のメニューから「連携サービス」をクリック
3. 「ウェブフック」とあるのでそこの「詳細」 or 「ウェブフックを確認」をクリック
4. 「新しいウェブフック」をクリック、ポストされるときの名前を指定し、チャンネルを指定
5. 「ウェブフックURLをコピー」をクリックすればOK

## 試す

とりあえず POST はオオゴトなんでまずは GET から。curlを使って試す。

```
$ curl -v https://discordapp.com/api/webhooks/xxxxxxxx
略
< HTTP/2 200
略
{"type": 1, "id": "xxxx", "name": "xxxxx", "avatar": null, "channel_id": "xxxxxx", "guild_id": "xxxxxx", "application_id": null, "token": "xxxxxx"}
```

OK。エンドポイントが正しくあることは確認できた。

POSTを試す。

```
$ curl -v -X POST -H "Content-Type: application/json" -d '{"content":"ふぁらおからウェブフック経由のポストで参上"}' https://discordapp.com/api/webhooks/xxxxxxxx
```

でOK。

## Pythonのコードから試す

以下で試せばOK。試しに `urllib.request.Request` の第3パラメータの `User-Agent` を削除してみてほしい。それだと弾かれてしまう。

``` python3
    url = "https://discordapp.com/api/webhooks/xxxxxxxx"
    method = "POST"
    headers = {"Content-Type" : "application/json"}
    obj = {"content" : "ふぁらおからウェブフック経由のポストで参上"}
    json_data = json.dumps(obj).encode("utf-8")
    request = urllib.request.Request(
        url,
        json_data,
        {"User-Agent": "curl/7.64.1", "Content-Type" : "application/json"},
        method
    )
    with urllib.request.urlopen(request) as response:
        response_body = response.read().decode("utf-8")
        print(response_body)

```
php.iniを変更したのにsessionの保存先が変わらない

#セッションの保存先を変更したい

と思い、php.iniのsession.save_pathの値を変更してみたのだが、変化がなかった。

```php:php.ini
session.save_path = "/home/test/session"
```

##Master ValueとLocal Value
phpinfoを見てみると、「Master Value」のほうは変更されていたが、「Local Value」のほうが変更されていなかった。

調べてみると、どうやらphp.iniより優先されるファイルがあるらしい。
```php.ini < httpd.conf < .htaccess < ini_set()```
参考：https://qiita.com/yamadayamada_jp/items/22b358e2c8389d1e31dd


なんだ他のところで上書きしてるだけかー
と思い、httpd.confと.htaccess見てみたが、見当たらない・・・
ini_set()もやってなさそう・・・


##conf.d/*.conf
どういうこったーと色々見ていると、httpd.conf内に

```php:httpd.con
IncludeOptional conf.d/*.conf
```


と記述が・・・！

/etc/httpd/conf.d/php〇〇-php.conf（※〇〇はphpのバージョンによります）
にいました。

```php:/etc/httpd/conf.d/php〇〇-php.conf
php_value session.save_path    "/var/opt/remi/php70/lib/php/session"
```

そんなところにいたんかい！
ということで、ここを書き換えて見事反映。


<br>
因みに、.htaccessやiniset()で上書きされないように「PHP_Admin_Value」というものもあるようです。
参考：https://www.php.net/manual/ja/configuration.changes.php
macOS で外付け HDD 認識しなくなったときのメモ

「タイムマシーンでバックアップをとり、OS アプデしたら、外付け HDD 認識しなくなった」という報告を受け修理。
disk utility では認識するものの、修復を試みるもうまく行かず。論理障害と見られる。

1./dev/xxx を特定

CLI から

```
diskutil list
```
で　 /dev/xxx に該当する HDD の IDENTIFIER を確認


2.fsck_hfs で修復
[fsck]( https://ss64.com/osx/fsck.html )で修復を試みる。fsck はあまりカジュアルに実行するものではない。

```
sudo fsck_hfs -fy /dev/disk2
sudo fsck_hfs -fy /dev/disk2s1
```
disk2 は適宜読み替える。timemachine がパテーションきってる場合 s1 などもパテーションごとに実行する


3.fsck のプロセスを kill

上記だけでは認識しなかったので、fsck でアクティビティモニタのプロセスを検索して kill するとようやく認識。
データを救出して HDD は新しいものに交換。
SQLアンチパターン　インデックスショットガン

# インデックスショットガン

インデックスを使用するか否かの判断をインデックスを理解しないまま行うと間違った判断をしてしまうというアンチパターン。
以下の３つのようなミスが発生してしまう可能性がある。

* インデックスを全く定義しないか、少ししかインデックスを定義しなくなる
* インデックスを多く定義しすぎるか、役立たないインデックスを定義してしまう
* インデックスを活用しないクエリを実行してしまう

## インデックスを全く定義しない

データベースはテーブルのインデックスのデータ構造を更新し、インデックスを用いて適切な行セットを検索できるようにしなければならない。

インデックスの更新によってデータベースにオーバーヘッド（INSERT、DELETE、UPDATEを行っているうちにできる未使用領域のようなもの）が生じる。
オーバーヘッドが無駄なものだという考えからインデックスそのものを排除するということが起こる。

インデックスにはオーバーヘッドを正当化するだけのメリットがあるため一概に排除すべきではない。

通常のアプリケーションの場合、テーブルの更新回数よりテーブルに対するクエリ発行が多いことが一般的である。

インデックスは目的の行を素早く見つけられるメリットがあります。
更新時や削除時にも対象の行を検索するために役立つ。

インデックスを定義していない列で検索をする場合、一致行を検索するためにテーブル全体を検索する必要がある。

## インデックスを多く定義しすぎる

インデックスのメリットを得られるのはインデックスを使用するクエリを実行するときである。
使用されていないインデックスを作成するメリットはありません。

どのインデックスがどんなクエリに役立つかわからないためテーブルの複数列や列の組み合わせに対してインデックスを定義する場合がある。
使用しない列に対してインデックスを定義した場合、メリットを得られずにオーバーヘッドを増やす要因となる。

## インデックスが役に立たない場合

### パターン１
|user_id(PK)|last_name|first_name|
|:---:|:---:|:---:|

user_idに対してインデックスを貼る場合、この列はPKは設定されており自動的にインデックスが生成されるため無駄となる。

### パターン２
|user_id|last_name|first_name|
|:---:|:---:|:---:|

上記のように苗字と名前列があった際、この２列に対して複合インデックスを貼った場合、左側の列から絞り込まれるためfirst_nameに対してインデックスを貼ることは無駄になる。

### パターン３
LIKE述語は前方一致検索でのみインデックスが有効となる。
そのため、部分一致検索の場合はインデックスは無駄となる。

# アンチパターンの見つけ方

アンチパターンの名前にもなっている通り、ショットガンのようにむやみやたらにインデックスを作成している場合は注意が必要。
次のような言葉を耳にしたらアンチパターンの兆候であると言える。

***「このクエリを高速化するにはどうしたら良い？？」***
→ テーブルの説明、インデックス、データ量、パフォーマンスの測定、最適化などについて詳細がないため、そういった部分を考慮しない回答はあてずっぽうにしかならず、とりあえずインデックスをつけるなどのアンチパターンに陥る可能性がある

***「フィールド全部にインデックスを定義したのに、実行速度が速くならない」***
→[インデックスが役に立たない場合](#インデックスが役に立たない場合)で説明したが不要なインデックスを付与しても意味がない。
オーバーヘッドを増やす要因となる。

***「データベースを遅くすると聞いたためインデックスを使用していない」***
→インデックスをうまく使うことでパフォーマンスの改善を期待できる。

# アンチパターンを用いても良い場合

ない。

作成することでメリットを得られるはずのインデックスを使用していない場合や、インデックスを作成したが不要になった場合などがあるため十分な情報に基づいて検討をすべき。

# 参考文献

[SQLアンチパターン](
https://www.amazon.co.jp/SQL%E3%82%A2%E3%83%B3%E3%83%81%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3-Bill-Karwin/dp/4873115892/ref=sr_1_1?adgrpid=104444684056&dchild=1&gclid=CjwKCAjw4_H6BRALEiwAvgfzqy-f83NTsyQkauo7gn6ysgAPmJvKyvuI5FaXFnxFmhVfCzCRRACsaBoCY-oQAvD_BwE&hvadid=447984765572&hvdev=c&hvlocphy=1009332&hvnetw=g&hvqmt=e&hvrand=13417269104929133208&hvtargid=kwd-335484809678&hydadcr=27264_11561110&jp-ad-ap=0&keywords=sql%E3%82%A2%E3%83%B3%E3%83%81%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3&qid=1599934568&sr=8-1&tag=googhydr-22)

![参考文献.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/257405/b46d45ab-75ec-a620-eeb2-a422f6b1e659.jpeg)
AWS Copilotとecspressoの違いを調べてみた

# 結論
* 下記「背景」のようなケースの場合は、ecspressoまたは類似ツールを使ったほうが事故は少ない
* コンテナやAWSやっていき勢、PoCなど速度が必要なケースはAWS Copilotを使ってみて慣れていくのはアリ
* というより、双方のツールは目指すところが全然違うので比較対象として論じること自体にちょっと無理がある

# 前提
本稿で記載している「ECS」は「ECS on Fargate」であり、「ECS on EC2」ではありません。
双方のツールを軽く触れて書いた記事なので、細かい機能について把握していないものもあると思います。

# 背景
これまでいくつかのAWSを使用したプロジェクトのインフラ管理にTerraformをオールインワンツールとして採用してきました。
しかし、システムの規模が大きくなるにつれてTerraformではどうしても取り回しの鈍さが出てくるケースが増えてきたため、アプリケーションレベルのデプロイコントロールはECSに特化したCLIに乗り換えたほうが良いのでは…と思い至り、調査した結果を記事にしました。

# ECSとは
ECS is 何？という方は、AWSの中の人として大人気なトリ先生のスライドを見るといいです。
https://pages.awscloud.com/rs/112-TZM-766/images/A-1.pdf

※本稿では触れないCLIツールも上記スライド内でPros/Consが紹介されています

# AWS Copilotとは
[AWS ECS CLI](https://github.com/aws/amazon-ecs-cli)の後継サービスでAWS謹製。
デフォルトでモダンかつプロダクションレディなインフラ構築をサポートしてくれるらしい。

## リポジトリ
https://github.com/aws/copilot-cli

## 特徴

* VPC、サブネット、ロードバランサー、デプロイパイプライン、ストレージなどのクラウドリソースを管理できる
* 上記の細かい設定はデフォルトでいい感じになっているらしい
* 生きたOSSプロジェクトなので気になる点はIssueやPRを出せる
* 単一バイナリ
* 本番や開発など環境ごとの設定をマニフェストファイルとしてYAMLで管理できる
* Dockerfileだけあればアプリケーションを最低限実行するために必要なものをインタラクティブにデプロイしてくれる
* ECS Service Discoveryを比較的簡単に使用できる
* 内部的にCloudFormationのコードを生成しているためAWSに関する対応が幅広い
* サイドカー構成は現時点では事前定義された構成(FireLens)しか使用できなさそう
* 既存のリソースはVPC周りしかインポートできなさそう
* リポジトリにWikiはあるが、限定的な情報しか書いてないので使うなら手探りになりそう

---

# ecspressoとは
面白法人カヤック社が開発したECSデプロイツール。
飲み物の「エスプレッソ」からもじったとのこと。
ECSサービスやECSタスクのコントロールに特化しているため、AWS CLIなどを使って頑張るより手軽にデプロイ操作をコントロールできる。
いくつかのCI/CDツールとの親和性もあるため、CI/CD自動化にも組み込みやすく、小規模なサービスならこれだけで事足りるケースも多い。
利用者も一定数いるため、初期導入についてはググれば十分な情報を得ることができる。

## リポジトリ
https://github.com/kayac/ecspresso

## 特徴

* タスク定義を含めて開発用リポジトリで管理できる
* みんな大好きGolang製
* 生きたOSSプロジェクトなので気になる点はIssueやPRを出せる
* 単一バイナリ
* サイドカー構成のデプロイも可能
* go-configと併用すると環境変数の展開もできる
* ツールで出来ることが限定されているので開発者が軽い気持ちで使っても大事故が起こりにくい

---

# 比較一覧表

|No|項目|AWS Copilot|ecspresso|
|:--|:--|:----------|:-------|
|1|ALBの作成|○|☓|
|1|NLBの作成|☓|☓|
|1|ECSクラスターの作成|○|☓|
|1|ECSサービスの作成|○|○|
|1|ECSタスク定義の作成|○|○|
|1|ECSタスクのスケーリング操作|○|○|
|1|ECSタスクのロールバック|☓|○|
|1|Fargate Spot|☓|○|
|1|Blue/Green Deploy対応|?|○|
|1|サイドカーのデプロイ|△|○|
|1|brew install|○|○|
|1|Task Execution IAM Roleの管理|○|☓|
|1|Task IAM Roleの管理|○|☓|
|1|DRY RUN|☓|○|
|1|YAML|○|○|
|1|Github Actions連携|☓|○|
|1|Circle CI連携|☓|○|
|1|Codeシリーズ連携|○|○|
BWT（Haskellでのコーディング練習）

## はじめに

- Haskellの勉強のためにBWT（Burrows-Wheeler Transform）を書いてみました。

  

## BWT（および逆変換）

- Qiita上にもわかりやすい説明がいっぱいあるので省略。

  


## 使い方

- 下記のソースコードのusageおよび使用例のように使用してください。

- bwtで変換する文字列に"\$"は使用できません（コマンドの内部で、文字列の終端として"\$"を付与してるので）。

- Haskellの勉強のために、（ちょっと無理やりですが）モナドを使用して結果がMaybe Stringとして返ってきます。

  【実装】

  ```
  {-
  BWT変換(Burrows-Wheeler-Transform)
  
  usage: 
    > bwt <String>
    > invBwt <String>
  使用条件:
    ・"$"を文字列の終わりとして使用しているので、"$"を含む文字列には
      使用できない。
  使用例:
    > bwt "mississippi"
    Just "ipssm$pissii"
    > bwt "mississippi" >>= invBwt
    Just "mississippi"
    > bwt "mississippi$" >>= invBwt
    Nothing
  -}
  
  module Bwt where
  
  
  import Data.List
  
  -- BWT変換
  
  getSA :: Ord a => [a] -> [Int]
  getSA str = map snd $ sort $ map (\n -> (drop n str, n)) [0..(length(str)-1)] 
  
  bwt' :: Ord a => [a] -> [a]
  bwt' str = map (\sa -> str!!(mod (sa-1) $ length(str))) $ getSA str
  
  bwt :: String -> Maybe String
  bwt str = if checkInput then Just (bwt' (str ++ "$")) else Nothing
      where
          checkInput = not $ elem '$' str
          
  
  -- BWT逆変換
  
  lfm :: Ord a => [a] -> [Int]
  lfm str = map snd $ sort $ zip str [0..]
  
  invBwt' :: Ord a => [a] -> Int -> [a]
  invBwt' str n = map (str!!) . take (length str) . tail 
      $ iterate ((lfm str)!!) n
  
  invBwt :: String -> Maybe String
  invBwt str = if checkInput then Just (init (invBwt' str endPoint)) else Nothing
      where
          checkInput = elem '$' str
          endPoint = length $ takeWhile (/='$') str
  
  ```

  


## 使用した環境

- ghci： version 8.8.3



----
2020/09/18 初稿:
【Nuxt.js】Nuxt文法編：component③動的コンポーネント

🎈 この記事はWP専用です
https://wp.me/pc9NHC-GF

# 前置き
![Frame 6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/469755/05bfa966-225c-1c10-3b05-c32b61ced72a.png)


liを使いまわして親のulによって
中のテキストを変えたりしたい！
というような場合に便利なkey属性をご紹介🌟
component②の続きです🙋‍♀️

ul、ol、table、selectといった要素には
子要素にできるタグli、tr、optionが
決まっていますね。
これらを分けてコンポーネント化したい場合に
活躍するのがkeyです。

公式: https://jp.vuejs.org/v2/guide/components.html#DOM-テンプレートパース時の警告

keyに使う値については
こちらをご覧ください👀

[【Nuxt.js】Nuxt文法編：v-for](https://nuxt.alizlab.com/%e3%80%90nuxt-js%e3%80%91nuxt%e6%96%87%e6%b3%95%e7%b7%a8%ef%bc%9av-for/)

tableでいうならthは親、
trを子コンポーネントに分けると
管理がしやすいといったメリットもあります💡

# コード①
liタグに使うコンポーネントは
is属性で指定してあげます🌟


```ListItem.vue
<template>
 <li>{{ text }}</li>
</template>

<script>
export default {
 props: ['text']
}
</script>
```


```index.vue
<template>
 <div class="page">
   <ul>
     <li
       is="ListItem"
       v-for="(fruit, index) in fruits"
       :text="fruit"
       :key="index"
     >
       {{ fruit }}
     </li>
   </ul>
 </div>
</template>

<script>
import ListItem from '~/components/Lists/ListItem.vue'

export default {
 data () {
   return {
     fruits: ['りんご', 'みかん', 'ぶどう'],
   }
 },
 components: {
   ListItem,
 },
}
</script>
```

# コード②
🎈 続きはWPでご覧ください👀
https://wp.me/pc9NHC-GF
Laravel id管理　パラメーターの{id}なんとなく振り当ててない？

パラメータ系の記事でよく見るこんなルーティング

```
Route::get('/post/{id}', 'TopController@detail');
```


初心者のワイ：はぁ(0_0)/
脳死状態で記述していたので意味調べました！！！！


----
指定されたコントローラの関数（TopController@detail）で'Request $request'でリクエスト受け取ります。

このリクエストの中に$request->idというものが生成されています。それが{id}の正体だ！！！！

---
仮に{id}を{sushi}に変更します

```
Route::get('/post/{sushi}', 'TopController@detail');
```
それでコントローラーでdd($request->id)で受け取れてるか確認
結果：null

dd($request->sushi)
結果：id表示

これで{id}が$request->idであるということの裏付けができましたね！！！！

これが初投稿です！
何かお役に立てれば幸いです！
【Vue.js】 IF文・For文　条件分岐、繰り返し処理

##【ゴール】
VueJSでの IF文・For文　条件分岐、繰り返し処理

##【環境】
`mac catarina 10.156`
`Vue.js v2.6.12`

##【実装】
①適当にワークスペース作成
②**Vue.jsインストール or 埋め込み(重要)**


####If文　
■「v-if」 / 「v-else」　を使用

```index.html
<div id="app">
  <p v-if="ok">OK</p>
  <p v-else>Not OK</p>
</div>
.
.
.
.
<script>
 new Vue ( {
   el: '#app',
   data: {
     ok: true  //ここが、true：OK表示、false: NotOKが表示される
   }
 })
</script>
```



####For文
■「v-for」使用

```index.html
<div id="app">
  <ul>
    <li v-for="name in names">{{name}}</li>
  </ul>
</div>
.
.
.
.
<script>
 new Vue ( {
   el: '#app',
   data: {
     names: ['tarou', 'hanako', 'misaki']
   }
 })
</script>
```

####結果
![スクリーンショット 2020-09-18 16.39.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620689/2f565c03-b139-04de-d3a9-9f09e81f127d.png)


##【まとめ】

■基本天気な挙動を理解している方だとすぐに理解できる

■If文は「true」「false」を上手く使い分ける

■for文は記述の省略につながるので覚えていて損なし


##【オススメ記事】

■ 【node.js】ルーティング設定ホーム画面表示させる。
https://qiita.com/tanaka-yu3/items/1c8859e16070e67d73c0

■ 【Node.js mysql】mysql接続　データを取り出す
https://qiita.com/tanaka-yu3/items/6b007dd96618bb6c844e

■ 【javascript】　テンプレートリテラル とは　一言で。
https://qiita.com/tanaka-yu3/items/9b07bd9fc4126291be28
【勉強中の新入社員】これからperl使うことになりそうで参考ページとサーバ構築エラー事例

勉強中の新入社員マルボロ・ダブルバーストです。

コンビニでカートン買い予約すればいいんやないか！と気づきました。
最寄りのコンビニに相談してみます。

いきなりプロフェクト人数変更でperl使いそうになりました。
参考にサイトだけ集めておきます。

見ながら作業になりそうですが、しっかり覚えておきましょう。
１０月のＦＥの勉強もやらにゃあかんので、ちょいとストレス気味です。

#とにかく貼る

http://ash.jp/perl/socket_ftp.htm
ASH　Perlでファイル転送(FTP)

https://tutorial.perlzemi.com/blog/20091115124667.html
perlゼミ　Net::FTP - FTPを使ったファイル転送

http://furyo.on-air.ne.jp/linux/perl.html
perlのアレコレ

https://www.itmedia.co.jp/enterprise/articles/0808/15/news011.html
Perlを用いた自動FTP転送

https://www.infraexpert.com/study/tcpip.html
ネットワーク階層図はこのページの表が一番しっくりきますね。

https://d.hatena.ne.jp/keyword/shebang
shebangも知っておきましょう。

#サーバ構築時のエラー発生事例
pingが通らない場合、OSIの低位層から確認しましょう。

https://www.fenet.jp/infla/tips/cisco_command_show+ip+interface+brief
fenet ciscoコマンド

物理層の確認 
スイッチ側コマンド show ip interface brief

データリンク層の確認
通信速度・通信方式・接続形態の確認

ポートトランキング（リンクアグリゲーション）確認
solarisサーバ側コマンド dladm
ciscoスイッチ側コマンド show run

通信速度、通信方式確認
オートネゴシエーション確認コマンド
サーバ側コマンド dladm show-ether -x net0
スイッチ側コマンド show run

VLAN 設定確認
サーバ側コマンド dladm
スイッチ側コマンド show run

→各設定方法は使うときにググろう。
多分機種ごとに違うし。こういうところでエラーがあるかもよーぐらいで今はいいかと。
多分。

#一言
htmなんて今のご時世珍しい。
Copyrightが1995-2002で納得。ネット上の古いものは大好きです。
実際の古いものも結構好きだったり。
でも新しいものも好き。
中途半端な流行ものは苦手。

てかこういうの書いてるけどさ、ブログが向いてない？
ここはブログですか。
メモ：Ubuntu18.04にPostgreSQL9.5をインストール

本番環境はいじれないから、別環境に特定のバージョンのDB環境を準備したいときありますよね。
そんなときの、自分用のメモです。

- Ubuntu18.04LTS
- PostgreSQL9.5

### postgreSQL9.5インストール
```
curl https://www.postgresql.org/media/keys/ACCC4CF8.asc | apt-key add -
echo "deb http://apt.postgresql.org/pub/repos/apt/ $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list
apt update
apt install postgresql-9.5
```


### postgreSQL起動
```
systemctl start postgresql@9.5-main
```

### ログイン
```
su postgres
psql -U
```


### データベース一覧表示
```
# \l
                                   List of databases
    Name     |  Owner   | Encoding |   Collate   |    Ctype    |   Access privileges
-------------+----------+----------+-------------+-------------+-----------------------
 postgres    | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 |
 template0   | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/postgres          +
             |          |          |             |             | postgres=CTc/postgres
 template1   | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/postgres          +
             |          |          |             |             | postgres=CTc/postgres
```

### データベース作成
```
create database test
```

### テーブル作成
pkeyカラムをプライマリーキーに設定。

```
 create table test (pkey serial primary key, id integer);
```

### テーブル一覧表示
```
# \d
              List of relations
 Schema |     Name      |   Type   |  Owner
--------+---------------+----------+----------
 public | test          | table    | postgres
 public | test_pkey_seq | sequence | postgres
(2 rows)
```
postgreSQLはprimary key設定すると「test_pkey_seq」テーブルが自動で作成されるんだね。

### テーブル選択
```
postgres=# \c test
You are now connected to database "test" as user "postgres".
```

### テーブル設定表示
```
# \d test
                          Table "public.test"
 Column |  Type   |                      Modifiers
--------+---------+-----------------------------------------------------
 pkey   | integer | not null default nextval('test_pkey_seq'::regclass)
 id     | integer |
Indexes:
    "test_pkey" PRIMARY KEY, btree (pkey)

```

### データインサート
```
insert into test (id) values ('5'); 
```

### テーブルの中身確認
```
# select * from test;
 pkey | id
------+----
    1 |  5
(4 rows)
```
pkeyは自動だね。


### カラム追加
```
# alter table test add column id2 integer;
```

--- 
あれ、コマンドあっているのに他のコンソールからpostgreSQLに接続できない。

```
psql -U postgres test
psql: FATAL:  Peer authentication failed for user "postgres"
```


```
cd /etc/postgresql/9.5/main
vim pg_hba.conf
```

``` pg_nba.conf変更前
local   all             postgres                                peer
```

``` pg_nba.conf変更後
local   all             postgres                                md5  
```

postgreSQLを再起動。

```
systemctrl restart postgresql
```
別のターミナルでもつながった。OKOK。

---
SentryでRailsアプリのエラーをトラッキング

## 契約
以下より契約
https://sentry.io/signup/

契約時にプロジェクトを作成することになり、プロジェクト作成後の画面にセットアップ方法が書かれているので、手順通りに進めていけば問題無いはず。ただ念のため自分ようにまとめなおします。

## 基本的な使い方
```rb:Gemfile
gem "sentry-raven"
```
```zsh
$ bundle install
```
```config/application.rb
module AppName
  class Application < Rails::Application
    # 省略
    Raven.configure do |config|
      config.dsn = "https://#{ENV['SENTRY_KEY']}@#{ENV['SENTRY_SECRET']}.sentry.io/#{ENV['SENTRY_ID']}"
    end
  end
end
```
Sentryのサイトで表示されるセットアップ方法には、ID等が全て直書きされているので、環境変数にしまいました。

## パラメーターやsession情報を拾えるようにする
```app/controllers/application.rb
class ApplicationController < ActionController::Base
  before_action :set_raven_context

  private

  def set_raven_context
    Raven.user_context(id: session[:current_user_id]) # or anything else in session
    Raven.extra_context(params: params.to_unsafe_h, url: request.url)
  end
end
```
## パスワードを平文で記録しない
```zsh
$ touch config/initializers/sentry.rb
```
```config/initializers/sentry.rb
Raven.configure do |config|
  config.sanitize_fields = Rails.application.config.filter_parameters.map(&:to_s)
end
```

## 本番環境でのエラーだけを参照する
デフォルトだと、開発環境のエラーも全て一覧で表示されてしまうので、設定を修正します。

Settings > Projects > プロジェクト名 > Environments > production以外の環境を`hide`
![ 2020-09-24 14.42.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244893/6ecc7b2a-457b-5c67-0667-f5931cff9624.png)

(2020/10/07追記)
上記の方法だと開発環境のエラーもメール等で通知されてしまいます。
単純に開発環境のSENTRY用のAPIキーを削除すれば、開発環境のエラーは捕捉されなくなります。

## 参考
- [RailsアプリケーションにSentryを導入する - Qiita](https://qiita.com/mikaji/items/74fac3be5e1235e0b762)
- [Environments | Sentry Documentation](https://docs.sentry.io/product/sentry-basics/environments/)

## その他
UIがめっちゃSlack笑
![ 2020-09-18 16.23.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244893/83563ee0-61eb-83ce-4dcb-522ca0776e20.png)
iPadOS / macOSに対応しているか確認する

## モチベーション
Apple SiliconによるiOSがiPadOS / macOSに統合の流れがあり、SwiftUIで広い画面を想定した実装を心がけた方が何かと役に立ちそう
[iPad and iPhone apps on Apple Silicon Macs](https://developer.apple.com/videos/play/wwdc2020/10114/)

## チェック項目
- iPadOS向けビルドするには何をすればいいのか？
- フルSwiftUIに移行するにはどうすればいいのか？mainに何を書けばいいのか？
- OS（Sizeに応じて）出し分けたい
    - readable width などのOS標準が無いか調べる
- iPhoneで回転せず、iPadでのみ回転させたい


## iPadOS向けビルドするには何をすればいいのか？
#### ビルド対象の追加
[Target] > [General] > [Deployment Info] の iPad にチェックがついていれば良い。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/135259/c605d3b7-3beb-2568-01d9-eb6b4c60e1ca.png)

#### NavigationViewでフルスクリーン表示する

`NavigationView`をデフォルトのまま利用すると、iPad上ではカラム表示されてしまいます。
`NavigationView`を使うがiPadでも全画面で利用したい場合に下記の設定を入れる。

```swift
NavigationView {
   ... some view
}
.navigationViewStyle(StackNavigationViewStyle())
```

## フルSwiftUIに移行するにはどうすればいいのか？mainに何を書けばいいのか？

#### App名と同じ.swiftファイルを作成する

メインとなるアプリ用のstructを用意し、bodyの中でWindowGroupを宣言する。

```swift:HogeApp.swift
@main
struct HogeApp: App {
    @StateObject private var model = HogeModel()
    @StateObject private var store = Store()
    
    var body: some Scene {
        WindowGroup {
            HogehogeContentView()
                .environmentObject(model)
                .environmentObject(store)
        }
    }
}

```

#### ScreenDelegateとAppDelegateを消す

ScreenDelegateとAppDelegateを消すだけで良いと言われたが、下記エラーが発生
`Could not find a storyboard named 'Main' in bundle NSBundle`

Info.plist内の`Application Session Role`以下の内容をまるっと消すと動いた

![Screen Shot 2020-08-19 at 17.13.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/135259/ad901d39-6e5c-14e8-69e3-c136b0566c41.png)

## OS（Sizeに応じて）出し分けたい

#### readable width などは無さそう、自前でmaxWidthを設定する必要がありそう
iPadの設定アプリなどのTableViewを見ると項目が画面幅最大まで広がらず、適度な大きさにとどまる様になっています。
この設定は [readableContentGuide](https://developer.apple.com/documentation/uikit/uiview/1622644-readablecontentguide) として主にTableViewなどで利用されています。

SwiftUIに上記の様な仕組みがあるか、確認したが見当たらなかった。
いずれは追加されるかもしれないが、一時的な解決策としてViewに対して`maxWidth`を設定するようにしました。

幅の参考値として[iOSでの読みやすい幅](https://techlife.cookpad.com/entry/2018/12/10/090000)を読んだところ、サイズに関わらず`672`が設定されるケースが多かったためその値を採用しました。

## iPhoneで回転せず、iPadでのみ回転させたい

こちらは想定通りでは有りませんがWorkaround的に動いているので記載します。正しい解決方法など有りましたコメントいただけますとありがたいです。

やはり必要だったAppDelegateファイルを再度用意し、回転動作を縦画面(.portrait)に固定します。

```swift:AppDelegate.swift
class AppDelegate: NSObject, UIApplicationDelegate {

  private static var orientationLock = UIInterfaceOrientationMask.portrait

  func application(_ application: UIApplication,
                   supportedInterfaceOrientationsFor window: UIWindow?) -> UIInterfaceOrientationMask {
    AppDelegate.orientationLock
  }
}
```

次に、AppファイルにAppDelegateを結びつけます

```swift:HogeApp.swift
@main
struct HogeApp: App {
  @UIApplicationDelegateAdaptor(AppDelegate.self) var appDelegate
  /* ... */ 
}
```

現状(Xcode 12)はこの設定がiOSでしか有効にならず、iPadOSでは無視され回転してしまいます。
目的は達成されているので、一旦このままにします。

## 最後に

目に見える範囲だけ対応しましたので、他に懸念などお気づきの点があれば指摘、コメントお願い致します。
Cordova iOSアプリでvideoタグの動画をインライン再生する

↓こちらの方法がiOS10以降から使えなくなっていたので
[Cordovaを使ったiOSアプリでvideoタグをインライン再生](https://qiita.com/maruware/items/ef51b96d9eaba11bca79)

```xml:config.xml
<preference name="AllowInlineMediaPlayback" value="true"/>
```

playsinline属性を追加

```html
<video src="sample.mp4" playsinline></video>
```
【Blender】オブジェクトの一部を削除したい(ブーリアン)


# この記事でできること
- tinkercadのような、「穴」で結合したような、削除の仕方ができるようになる。

---

# EXOFRAMEの配布データを3Dプリンタで印刷しよう
- サイズ的なところから、下図スクショの、余分な箇所を削除したい。

[OBSOLETE スペシャルページ](https://project-obsolete.com/en/special/)
PCによっては非常に負荷がかかるページなので、ご注意ください。
(参考までに、MacbookPro 2012年整備品のチューンモデルではまともに見られません)

![C02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191635/f87df145-97d1-a3ca-bcc3-e1a0e725ec38.png)

- 覆い隠すように、Cube等を追加する。
- 以降は、下図スクショを参考にしながら手順を進めていく。(英語と日本語の切り替えは、ショートカットキーである[cmd + ,]でプレファレンスを表示してうまくやっていこう)
- 元データを選択した状態で、モディファイアーを選択する。
- モディファイアーの中から、「ブーリアン」を選択する。
- ブーリアンの設定として、「差分」を選択する。
- 「オブジェクト」には、引き算となるオブジェクトを選択するため、この場合はCubeを選択する。
- 「適用」を選択する。(下図スクショでは、「Apply」と表記している)
- ※EXOFRAMEのSTLデータは、blenderで読み込むと非常に大きいので、今回はだいぶ小さくしている。

![C01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191635/05bc4926-a845-9c35-3671-80ffbb0784c0.png)

---

# sonicminiで印刷しようとするとこんな感じ
- サイズ調整した上で、印刷予定時間は2時間ちょっとです。

![C03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191635/1b2d9c41-6a02-7974-b8de-50e25c5536d6.png)

![3FC830C8-D356-45FD-9365-369836045CAE.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191635/027f6867-b93f-0424-3944-024986af7787.jpeg)
Windows内のファイルをWSLへ持ち込む

備忘録です。何か不備あればコメントお願いします。

使用環境　
Windows 10 home
WSLでUbuntu20.04　

Windowsで扱っているファイルをWSLへ持ち込みたい。

#１　/mnt/　付けるだけ
ファイル移動の際に
cd /mnt/ "ここにWindowsでの絶対パス()"

と入力すればWindowsの所望のフォルダに着ける。
(例：cd /mnt/c でC:　 に着く)

これを使ってファイルのあるフォルダまで移動しておく

#２　cpコマンドでファイルをコピー
１で移動した後に

cp ファイル名　"WSL側の保存先の絶対パス"

と入力すると、指定したフォルダにファイルがそのままコピーされる(名前の変更は無し)

(例：cp program.java ~)
と入力すると、WSLの一番上のディレクトリにprogram.javaがコピーされる。
EC2 インスタンス名の一部からインスタンスに SSH over Session Manager でサクッと接続する

# 背景

[EC2 インスタンス名の一部からインスタンス情報を瞬時に出す](https://qiita.com/oz-urabe/items/1911a4d14615d4b03db8) に記載した記事は単純に インスタンスの情報を返すだけだったが、そのまま接続もしてしまいたいなということで、スクリプトを少しカスタマイズしました。

# 前提

- aws cli がインストール済みである
- EC2 をよくさわる
- [SSH over Session Manager](https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/session-manager-getting-started-enable-ssh-connections.html) を設定済みである


# 利用方法（準備）

以下のようなコマンドを実行します

```
$ cat <<'CONFIG' >> ~/.$(basename $SHELL)rc
function guess-connect() {
    function help() {
         cat <<EOT >&2
guess-ssm-connect <guess> <profile>

    <guess> ec2 インスタンスの tag:Name の文字列の一部を指定します
    <profile> aws-cli で指定するプロファイルがある場合は指定します (任意)

ex.
    1. guess-ssm-connect melon prod
    2. guess-ssm-connect panda
EOT
    }

    function sshconnect() {
        id=$(echo $1 | jq -r .id | head -1)
        ssh $id
    }

    if [ $# -eq 0 ]; then
        echo 引数は1つ以上指定してください >&2
        help
        return 1;
    fi

    GUESS=$1
    PROFILE=default
    if [ $# -ge 2 ]; then
        PROFILE="$2"
    fi

    declare -a instances

    i=1
    for instance in $(aws --profile $PROFILE \
        ec2 describe-instances \
        --filter "Name=tag:Name,Values=*$GUESS*" \
        --query 'Reservations[].Instances[].{id:InstanceId,name:Tags[?Key==`Name`].Value|[0]}' \
        | jq -Mc '. | sort_by(.name)| .[] | {"id":.id,"name":.name}')
        do
            instances[$i]=$instance
            let i++
        done

    if [ $i -eq 1 ]; then
        echo 接続するインスタンスはありません
        return 1
    fi

    if [ $i -eq 2 ]; then
        echo ${instances[1]} に接続します
        sshconnect ${instances[1]}
        return $?
    fi

    for ((i = 1; i <= ${#instances[@]}; i++)) {
        echo "ID $i) $(echo ${instances[i]}| jq -r .name)"
    }

    if [[ "$SHELL" =~ /zsh$ ]]; then
        read "REPLY?どのインスタンスに接続するか ID を入力してください(1 ~ $(expr $i - 1)): "
    else
        read -p "どのインスタンスに接続するか ID を入力してください(1 ~ $(expr $i - 1)): " REPLY
    fi

    echo "${instances[$REPLY]} に接続します"
    sshconnect ${instances[$REPLY]}
}
CONFIG

# SHELL をリロード
$ exec $SHELL -l
```


これで準備ができました。

# 接続してみる

## 接続先がヒットしない場合

```
[urabe@mac48 ~]$ guess-connect hoge    
接続するインスタンスはありません
[urabe@mac48 ~]$ echo $?
1
[urabe@mac48 ~]$ 
```

## 接続先が1つヒットした場合

```
[urabe@mac48 ~]$ guess-connect reda  
{"id":"i-03*****","name":"redash"} に接続します
Welcome to Ubuntu 18.04.1 LTS (GNU/Linux 4.15.0-1045-aws x86_64)
```


## 接続先が複数ヒットした場合

```
[urabe@mac48 ~]$ guess-connect web
ID 1) production-web
ID 2) stage-web
どのインスタンスに接続するか ID を入力してください(1 ~ 2): 1
{"id":"i-06*****","name":"production-web"} に接続します
Last login: Thu Sep 17 17:49:22 2020 from localhost

       __|  __|_  )
       _|  (     /   Amazon Linux AMI
      ___|\___|___|
```
UIデザインを真似したい国内のWEBサービス

国内のWEBサービスでUIデザインやインタラクションの設計が上手いなと感じるサービスの一覧です。

Zenn
https://zenn.dev/

note
https://note.com/

ALiS
https://alis.to/

pato
https://pato.today/

アル
https://alu.jp/

ZOZOTOWN
https://zozo.jp/

mercari
https://www.mercari.com/jp/
kubectl get nodeコマンドでノードの数を確認する

## 概要
- kubernetesのノードの数をkubectlからサクッと知りたいとき用。
- CIに組み込んでいろいろするときなど。
 
## コマンド
```
kubectl get node | tail -qn +2 | wc -l
```

## 補足
- -qオプションでファイル名などを表示せずに出力
- -n +2オプションで先頭のn-1行（この場合2-1=1行目）のみ除いて出力
【勉強中の新入社員】 これからネットワーク構築に使いそうなLinuxコマンドをまとめてみる

勉強中の新入社員マルボロ・ダブルバーストです。
最近取り扱っているコンビニが減少気味で悲しんでおりますが、何とか形に残したくて記事を残すことにしました。
昨日はローソンでダブルバースト５を２箱買えました。
喫煙量は１日１～５本なので、しばらくはこれで保てそうです。
切れてるときは仕方なくパープルも吸っていますが、これもなかなか見当たらず…
寂しいものです。

では、個人的にこれからネットワーク構築で使いそうなLinuxのコマンドをまとめてみます。
ど素人なので自分がこれから使いそうなコマンドは書きます。
後々実際使ってみた結果とか詳細書いていきたいとは思います。
個人のまとめに近いものになると思いますが、よろしければ助言などコメントお願いします。

# とにかく集めてみる

### サーバ時間

data 　システムクロックの日時表示
/sbin/hwclock　ハードウェアクロックの日時表示

su -　　　　　　　　//　環境引継ぎなし・管理者権限
Password:
ntpdate <em>ntp_server</em>　　//　NTPサーバにシステムクロック同期
hwclock --systohc　　//　システムクロック基準ハードウェアクロック同期

ntpd　　　　　　　　//　クロック同期の動作状況確認

### ルーティングテーブル

/sbin/route　　　　　//　ルーティングテーブル表示
netstat -r　　　　　　//　ルーティングテーブル表示

>Destination : 対象ネットワーク・ホスト
Gateway : ゲートウェイ機器のＩＰアドレス
Genmask : 対象ネットワークのサブネットマスク
Flags : _U_　経路有効　　_G_　ゲートウェイ使用　　_H_　ターゲットはホスト　　_R_　回復される動的経路
　　　_D_　動的設定　　_M_　変更 　_A_　addconf設定　　_C_　キャッシュのエントリー　　_!_　拒否する経路
Metric : ターゲットの距離（ホップ数）
Ref ：ルート参照数
Use : 経路の参照回数(route -F, -Cの数)
Iface : 使用するインタフェース

### IP
/sbin/ifconfig eth0　　　　　　　　//　_interfaceName_ eth0の情報確認
su - 　　　　　　　　　　　　　　//　管理者権限
ifconfig _interfaceName_ [inet _ipadress_] [netmask _mask_]　//　_ipAdress_ _subnetMask_ 設定
ifconfig _interfaceName_ up　　　　　//　インタフェース有効化
ifconfig _interfaceName_ down　　　　// インタフェース無効化
【GCP】Google cloud vmware engineについて

https://cloud.google.com/vmware-engine?hl=ja#section-13
ここを読むのがはじめ
構成図とかも書いてあるので、そのへんを参考にする。実際にオンプレとつなぐときは、VPNとかPartnerinterがあれば良さそう。
⇓
「既存の VMware ワークロードをシームレスに移行」
この記載

これがやりたいといっていた

明日も引き続きここを読む

https://ascii.jp/elem/000/004/012/4012936/
ここだと概要がひととおりわかる
東京リージョンでも今年後半には提供開始予定。	

https://jp.techcrunch.com/2020/05/15/2020-05-14-google-makes-it-easier-to-migrate-vmware-environments-to-its-cloud/

見積も見積サイトでとれる

＝＝＝
関連記事
https://cloud.google.com/blog/ja/topics/hybrid-cloud/google-cloud-vmware-engine-networking-features

関連動画
https://www.youtube.com/watch?v=Z5S2fpmWuD8
https://www.youtube.com/watch?v=tO6LhpqqMYk

セミナー
https://cloudonair.withgoogle.com/events/gcve-solution-webinar-q3
9/29

https://cloud.google.com/blog/ja/topics/hybrid-cloud/move-your-vsphere-vms-to-google-cloud-vmware-engine
【Python anywhere】 でデプロイした、ディレクトリ📃の中身気になりませんか❓　Python 初心者向け　（2020年9月）

python anywhereでデプロイ　👉（part2へ）https://qiita.com/iwasaki-hub/items/241ede0367d0d9a4a9d7

その前に、

**Web フレームワーク**は、いくつかの**ディレクトリ**と**ファイル**で構成されています！

　Python　➡　**Django**　(web フレームワーク) に限らず、

　Ruby　➡　**Ruby on Rails**

　JavaScript　➡　**React**

　PHP　➡　**Laravel**

も同様です！

![django.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654025/ac1c6b17-bf20-fee5-44be-7b3f4d1806f7.png)　

実は、言語は違えどすべてに**共通**していることがあります！

それが " **M・V・Cモデル** " を基本構造にしているということです👀！！

**MVCモデル**❓❓と思われた方も多いと思います！

これを理解すれば、フレームワークの理解度が**グッ**と増すので、

しかもどのフレームワークにも応用がきくので是非、学んでみてください:ok_hand:

このことについても、近日公開するので興味のある方は、ぜひJunp in!:snowboarder:してください(^_-)-☆
 👉　（part4へ)　https://qiita.com/drafts/0257cea561f521893ebc/edit 


👇👇👇👇👇
それでは、中身を覗いてみましょう🔎
今回は、ハンズオン💻で進めていきましょう！

![2020-09-18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654025/8e6a2bb9-1b0b-4643-06c5-bd3be2b3b45a.png)


１、**[Files]** をクリックします。

２、**Directories** の **mysite/**　(もしくは、自分で作った **ディレクトリ名/** ）をクリック。
　　➡クリック後に、表示されているのがディレクトリ内の構造です！
　　　**Files** にある **manage.py**は**Django**に備わっている便利な機能が記されています。

３、さらに **Directories** の **mysite/**  (もしくは、自分で作った **ディレクトリ名/** ）をクリックします。
　　➡ここがブラウザに表示されている見た目を司る部分になります。
　　　それぞれに役割があります。
　　　**urls.py**　は、クライアントからのリクエストを受け取る場所。
　　　**settings.py**　は、設定（言語、時刻など）にかかわる場所。
　　　**wsgi.py**　は、内部での複雑な処理を準備する場所。

と、認識していただければ大丈夫です！


近日公開　➡　MVCモデル(part4へ)　https://qiita.com/drafts/0257cea561f521893ebc/edit
BigQueryにPowerBIで接続しようとしてハマった

# PowerBI で BigQueryに接続しよとしてはまってる人が少し減れば
(ぶっちゃけ不具合を放置だよね？)

# PowerBIで、BigQueryコネクタを使って、接続する

会社で初のBigQuery × PowerBIの検証をする事になりました。
手順は他のデータソースと一緒で、GUIでさくさく出来ると思うじゃないですか・・・

①データを取得クリック
②Google BigQueryに接続クリック
③プロジェクト[hogeproject]を選択
④データセット[hoge_dataset]を選択
⑤テーブル[hoge_table]を選択すると以下エラーが発生

```
DataSource.Error: ODBC: ERROR [42000] [Microsoft]BigQuery Error interacting with REST API: VPC Service Controls: Request is prohibited by organization's policy. vpcServiceControlsUniqueIdentifier: xxxxxxxxx.
詳細:
DataSourceKind=GoogleBigQuery
DataSourcePath=GoogleBigQuery
OdbcErrors=[Table]
```

普通に読むと、VPC Service Controlsが、組織のポリシーで禁止されてると思いますよね？
組織のポリシーを調べる手段がないのと、忙しい担当の方にどう設定変えれば動くのかを聞くために調べました。

## エラーメッセージで、検索すると
- BigQueryの権限を見ろ
- USリージョンなら回避できる
コミュニティに情報があり・・・

今回のプロジェクトは検証用に新たに作成されたプロジェクト（課金あり）で、
- Google Cloud Storage 転送➡ データセットをやるために東京リージョンを使ってました

* 実はその前に存在していたプロジェクトは、誰が作ったか権限も良くわからない状態（USリージョン）で、PowerBIと問題無く接続で来てました
ので、あーUSリージョンで全部やり直さないとダメなのか！と絶望してたいのですが、USリージョンにしても解決せず！

# 解決方法
コミュニティでも解決済みとかなってるけど、具体的には何も情報が無かったのですが、一人ドキュメントにリンク張ってる方がいて
「https://docs.microsoft.com/en-in/power-bi/desktop-connect-bigquery
Power BIのBigQueryの実装にバグがあると考えられます。それは非常にイライラします。」

- この中身は実は調査してる時にも何度か見ていて、読んでも良くわからなかったのですが解決方を書いていてくれたのです。分かりにくい！

- BigQuery接続でエラーが出るが無視して、データの変換をクリックして詳細設定ボタンを押して、スクリプト編集画面に行って以下を追記する

```
変更前：ソース = GoogleBigQuery.Database(null)
変更後：ソース = GoogleBigQuery.Database([BillingProject="hogeproject"])
```

- 非常に分かりにくいけど<strong>PowerBI の　BigQueryコネクタは、複数の請求プロジェクトがある場合、最初のプロジェクトとしか自動で接続できない。↑の謎のエラーが出る。　面倒だけど　BillingProjectを自分で編集する必要がある」</strong>

２，３時間ハマったのですが、PowerBIコネクタいい加減直してほしい。プロジェクト選んでるし、その下の行はプロジェクト名取れてるじゃん。なんでこうなってるんだか。イライラしました。
oFで動画を再生しようとしたところ"unable to call GetConnectedMediaType"と怒られる

#症状
上述の通り
#解決策
公式に書いてある通り、https://openframeworks.cc/ja/setup/vs/ のページのリンクからCodecを導入する。
#環境
- Windows10 Pro

- oF_v0.11.0

#所感
普段Macで書いててWindowsに持ってこうとしたときに一瞬ハマったので、共有しておきます。
ドキュメント読め事案ですが、現場でドタバタしてると失念したりしますよね..
Javaに初めて触れてみた

# Javaに触れてみた
自己満の備忘録になりますので、ご容赦ください。
## 文字列を表示する
```
class Hello {
  public static void main(String[] args) {
    System.out.println("hello IKEMEN");
  }
}
```
↓

```:ターミナル
hello IKEMEN
```
" "で囲んだ文字列が表示されます。

## 変数を使って文字列を表示する
```
class Hello {
  public static void main(String[] args) {
    String name = "IKEMEN"

    System.out.println("hello" + name);
  }
}
```
↓

```:ターミナル
helloIKEMEN
```
このままでは余白がないので訂正します。

```
class Hello {
  public static void main(String[] args) {
    String name = "IKEMEN"

    System.out.println("hello " + name);
  }
}
```
System.out.println("hello " + name);のhelloの後に余白を入れます。
↓

```:ターミナル
hello IKEMEN
```
余白ができて綺麗になりました。

## ユーザーからの入力を受け取る
### ①文字列
```
import java.util.Scanner;

class Hello {
  public static void main(String[] args) {
    System.out.print("Your name? ");
    String name = new Scanner(System.in).next();

    System.out.println("hello " + name);
  }
}
```
new Scanner(System.in).next();でキーボードからの入力を受け取れるみたいです。
↓

```:ターミナル
Your name?
```
と表示されるので、文字列（IKEMEN）を打ち込みます
↓

```:ターミナル
Your name? IKEMEN
hello IKEMEN
```

### ②数値
```
import java.util.Scanner;

class Hello {
  public static void main(String[] args) {
    System.out.print("Your guess? ");
    Integer guess = new Scanner(System.in).nextInt();
    
    System.out.println("Your guess: " + guess);
  }
}
```
new Scanner(System.in).nextInt();で入力値をintegerとして受け取るみたいです。
↓

```:ターミナル
Your guess?
```
と表示されるので、数値（6）を打ち込みます
↓

```:ターミナル
Your guess? 6
Your guess: 6
```

## 条件に応じて表示を変える
```
import java.util.Scanner;

class Hello {
  public static void main(String[] args) {
    Integer answer = 6;

    System.out.print("Your guess? ");
    Integer guess = new Scanner(System.in).nextInt();
    
    if (answer == guess) {
      System.out.println("正解!");
    } else {
      System.out.print("ハズレ");
    }
  }
}
```
入力した数値が6の場合は正解!と表示され、6以外の場合はハズレと表示されます。

## 条件を追加する
```
import java.util.Scanner;

class Hello {
  public static void main(String[] args) {
    Integer answer = 6;

    System.out.print("Your guess? ");
    Integer guess = new Scanner(System.in).nextInt();
    
    if (answer == guess) {
      System.out.println("正解!");
    } else if (answer > guess) {
      System.out.println("もっと大きい");
    } else {
      System.out.println("もっと小さい");
    }
  }
}
```
入力した数値が6の場合は正解!と表示され、6より小さい場合はもっと大きいと表示され、6より大きい場合はもっと小さいと表示されます。
許可したAzure Virtual Machine からのい blobファイルへアクセスする方法

# 利用目的

Azure VM内部からblobストレージに置いたファイルをダウンロード（アップロード）する場合に
Azure VM上に認証情報となるキーなどを一切保存せずアクセスできるようにするために利用します。
意外と実例が無かったので記事にしました。


# 利用方法 概略

直ぐに使いたい人のための手順概略のみを記載しました。

1. Azure Virtual MachineのマネージドIDを有効にする
2. blobストレージまたはBlobコンテナなどに対して、Azure Virtual Machine Blobのアクセス権を追加する
3. Azure Virtual Machineから以下のコマンドでダウンロードする

````
response=$(curl 'http://169.254.169.254/metadata/identity/oauth2/token?api-version=2018-02-01&resource=https%3A%2F%2Fstorage.azure.com%2F' -H Metadata:true -s)
access_token=$(echo $response | python -c 'import sys, json; print (json.load(sys.stdin)["access_token"])')
curl -H "x-ms-version:2017-11-09" -H "Authorization: Bearer ${access_token}" {blobのURI}
````

# 利用方法 詳細

手順の詳細を知りたい人のために記載しました。

## Azure Virtual MachineにマネージドIDを有効にする

* 新規にAzure Virtual Machineを作る時に有効にする場合

Azure の[Virtual Machines]から追加をクリックしてウィザードを起動します。
管理のタグでID システム割り当てマネージドIDをオンにします。
他の必要な項目を入力して、仮想マシンを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480189/efc6dbc9-79bf-f282-7e9c-f0e33396bdbf.png)

* 既存のAzure Virtual MachineでマネージドIDを有効にする場合

Azure の[Virtual Machines]から該当の仮想マシンを選択
メニューの[設定] => [ID] を選択
状態のスイッチをオンに切り替え、保存をクリックすることでマネージドIDを有効にします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480189/3a0ace12-4942-b316-efa5-769bfb1bcee8.png)

## Blobコンテナに対して、仮想マシンのファイルアクセス権を追加する

Azureの[ストレージアカウント]から該当のストレージアカウントを選択します。
[Blob service] => [コンテナー] へ移動します。
[+コンテナー]を選択して新しいコンテナーを作成します。
コンテナ名を入力して、[作成]をクリックします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480189/d03906ec-a152-8289-2dff-e9de8b01d66d.png)
  [パブリックアクセスレベル]は、[プライベート]とすることで匿名アクセスを防ぎます。

作成したコンテナ名を選択して画面を切り替えます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480189/d3d64702-52e0-57d7-e66c-4b0902fec631.png)

[アクセス制御(IAM)]画面に移動し、[＋追加]->[ロールの割り当ての追加]をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480189/30c54394-aff9-d9b0-0838-bf540d32eafb.png)

[役割]を[ストレージ BLOBの閲覧者]にします。
※　ファイルをアップロードする場合は、[ストレージ BLOBの共同所有者]を選んでください。
[アクセスの割当先]を[仮想マシン]にします。
[サブスクリプション]は仮想マシンのサブスクリプションを選びます。
一覧にマネージドIDが割り当てられた仮想マシン一覧が表示されるので、対象の仮想マシンをクリックして
[選択したメンバー]に移動します。
[保存]をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480189/6f38b5f7-e8d3-eebf-98ba-ad214467b91a.png)

設定を確認する場合は、[アクセス制御(IAM)]の[ロール割り当て]のタブを見てください

※　ダウンロードするファイルは必要に応じてファイルをアップロードしてください。（本文書では手順を記載しません）

## 仮想マシンのLinuxのBASHからファイルをダウンロードする

Blobのアクセストークンを取得するために以下コマンドを入力します。

````
response=$(curl 'http://169.254.169.254/metadata/identity/oauth2/token?api-version=2018-02-01&resource=https%3A%2F%2Fstorage.azure.com%2F' -H Metadata:true -s)
access_token=$(echo $response | python -c 'import sys, json; print (json.load(sys.stdin)["access_token"])')
````

curlコマンドを使って、ファイルをダウンロードします。

````
curl -H "x-ms-version:2017-11-09" -H "Authorization: Bearer ${access_token}" {blobのURL}
````
  ※　Authorization ヘッダを付けてアクセストークンを指定します。
  ※　blobのURIはコンテナ内部のファイルをクリックすると表示されます。
Javascriptの基本の書き方①

#はじめに
自分の個人的勉強のまとめ
備忘録として残します


##変数定義(代入まで)
```javascript

var 変数名=値;
let 変数名=値;
```
varとletの違いは再代入が可能かどうか
(letが可能)

##定数定義(代入まで)
```javascript
const 定数名=値;
```
定数と変数の違いは変数は値をあとで変更できるのに対して定数は値の変更ができない。

##ターミナルでの出力方法
```javascript
console.log(値);
```

##テンプレートリテラル
以下のように${変数名}と記載することで変数の値を出力することが可能

```javascript

let name="たけし";
console.log(`ぼくの名前は${name}です`);
```
出力する値は`で囲む必要がある。

##条件式の書き方
```
if (条件式){
  処理;
}
```
}の後ろに;はいらない

###if...else文
```javascript

if (条件式){
  処理;
}else{
  処理;
}
```

###else if文
```javascript

if (条件式){
  処理;
}else if (条件式){
  処理;
}else{
  処理;
}
```

##Switch文
```javascript

switch (条件の値) {
  case 値1:
    値1と条件の値が等しい時の処理;
    break;
  case 値2:
    値2と条件の値が等しい時の処理;
    break;
  case 値3:
    値3と条件の値が等しい時の処理;
    break;
  default:
    どれにも合致しなかった時の処理;
    break;
}
```
caseのブロックの最後に必ずbreakを入れることで処理を終了させることが大事
GitHubアカウント切り替え

1台のPCでGitHubアカウントを切り替えようとした時にハマったので、その備忘録です。

## この記事のゴール

仕事用のPCにプライベート用アカウントのリポジトリをcloneしてpushできるようにする。

## 切り替えの手順

1. 仕事用のPCにプライベート用アカウントに使うsshキーを作成
2. GitHubに公開キーを登録
3. ~/.ssh/configファイルにプライベート用アカウント用の設定を追加
4. 接続確認
5. git clone
6. git push

### 1. 仕事用のPCにプライベート用アカウントに使うsshキーを作成

```
$ cd ~/.ssh
$ ssh-keygen -t rsa -b 4096 -f <YOUR_FILE_NAME> // 今回は例としてprivate_rsaで作っています

// private_rsa と private_rsa.pub が作成される 
```

### 2. GitHubに公開キーを登録

```
$ pbcopy < ~/.ssh/private_rsa.pub

// 公開キーがクリップボードにコピーされる
```

GitHubのプライベートアカウントのSettingsより公開キーを登録

### 3. ~/.ssh/configファイルにプライベート用アカウント用の設定を追加

``` ~/.ssh/config
// Host githubはもともと仕事で使って存在していた
Host github
  HostName github.com
  User git
  IdentityFile ~/.ssh/main_rsa

// 以下のHost github-privateを追加する
Host github-private
	HostName github.com
	User git
	Port 22
	IdentityFile ~/.ssh/private_rsa
```

### 4. 接続確認

```
$ ssh -T github-private

// Hi <GITHUB_ACCONT_NAME> You've successfully authenticated, but GitHub does not provide shell access.
// 上記のように返ってくれば接続成功
```

### 5. git clone

接続までは成功しているので、 cloneで持ってくる。

@以下の `Host名` を先ほど作成したHostにする。

```
// こちらはエラーになる
$ git clone git@github.com:<ACCOUNT_NAME>/<REPOSITORY_NAME>.git

// こちらはOK 
$ git clone git@github-private:<ACCOUNT_NAME>/<REPOSITORY_NAME>.git
```

### 6. git push

local userの登録をする

```
$ git config --local user.name <プライベートユーザー名>
$ git config --local user.email <プライベートメールアカウント>

$ git push
// pushできる
```

以上です。
慣れてないと結構ハマりますね。。。
【gatsby】React-dndを追加したらbuild時にエラーがでた

巷で難しい難しいと言われていた react-dnd が hookでかなり楽に実装できるようになっていたので、自作アプリにDnD機能を追加したところ、gatsbyのビルド時にエラーが出て止まってしまいました

## 試行環境

| ソフトウェア | バージョン |
|:--|:-:|
| MacOS | 10.15.6 | 
| React | 16.13.1 |
| Gatsby | 2.24.2 |
| React-dnd | 11.1.3 |
| React-dnd-html5-backend | 11.1.3 |

## エラー内容

```
failed Building static HTML for pages - 24.502s

 ERROR #95313 

Building static HTML failed for path "/dashboard/"

See our docs page for more info on this error: https://gatsby.dev/debug-html


  27 |     } else {
  28 |       var argIndex = 0;
> 29 |       error = new Error(format.replace(/%s/g, function () {
     | ^
  30 |         return args[argIndex++];
  31 |       }));
  32 |       error.name = 'Invariant Violation';


  WebpackError: Invariant Violation: Expected drag drop context
  
  - invariant.esm.js:29 
    node_modules/@react-dnd/invariant/dist/invariant.esm.js:29:1
  
  - useDragDropManager.js:12 
    node_modules/react-dnd/dist/esm/hooks/useDragDropManager.js:12:12
  
  - drag.js:23 
    node_modules/react-dnd/dist/esm/hooks/internal/drag.js:23:35
  
  - useDrag.js:30 
    node_modules/react-dnd/dist/esm/hooks/useDrag.js:30:51
  
  - DraggableCard.js:22 
    src/components/cards/DraggableCard.js:22:41
```

## 対応

エラーメッセージにある通り、https://gatsby.dev/debug-html に書かれている方法で対応できました
useDragやuseDropを呼び出しているところに ``(typeof window === `undefined`)`` による処理を追加しました 

```
	const [{ isDragging }, drag] = (typeof window === `undefined`) ? [{}, null]
		: useDrag({
			item: { type: ItemTypes.TYPE },
			collect: monitor => ({
				isDragging: !!monitor.isDragging(),
			}),
		})

```

## 原因

DndProviderの読み込みと配置を `gatsby-browser.js` で行っていたためでした

```react:gatsby-browser.js
const DndProvider = require('react-dnd').DndProvider 
const HTML5Backend = require('react-dnd-html5-backend').HTML5Backend 

exports.wrapRootElement = ({ element }) => {
	return (
		<DndProvider backend={HTML5Backend}>
			{element}
		</DndProvider>
	)
}
```

全ページで使用しているラッパーコンポーネントの `<Layout />` 内に配置することでビルドエラーが出なくなりました
ただ、この方法にすると、別の場所で`Cannot have two HTML5 backends at the same time.`が出てしまいウェブアプリがクラッシュしてしまいます

## さいごに

コンポーネントを再起的に呼び出したりしているためか、エラーの根本的な原因は不明でした
ビルドを通すためだけの処理を追加したような感じでスッキリしませんが、とりあえず解決

React-dndの実装方法はこちらが完結で分かりやすかったです
https://qiita.com/hotchpotch/items/39da4b84da615b24a11f
Laravel HTMLメールで画像を埋め込む (オフライン時やセキュア対応で使う)

この時代にオンラインでない事はあまりないので、普段htmlメールは、画像はURLリンクで済ませます。
Laravel HTMLメールで画像を埋め込む必要がある時のケースでは、例えば

**【想定ケース】**
・オフラインでも画像を表示できるようにする。
[・非公開領域に画像を入れている（完全会員サイトで画像さえも公開しない場合）](https://stackoverflow.com/questions/28562908/how-to-deal-with-private-images-in-laravel-5)


こんなケースがあります。
この場合、メールのインライン画像は、URLではNGなのです。

Laravelにはhtmlメール本文に画像を埋め込む便利な機能があります。


```
<body>
    ここに画像：

    <img src="{{ $message->embed($pathToImage) }}">
</body>
```

あらかじめ用意されている、$message->embedにファイルパスを入れればOK！
超簡単です。

**参考ページ　【インライン添付】**
https://readouble.com/laravel/6.x/ja/mail.html
IBM Cloud: VPCの作成済みVSIに対して、2つ目以降のvNICにIPアドレスを明示的に指定する方法

#1. はじめに
IBM CloudのVPCにおいて、UIからは1つめのprimary InterfanceのIPアドレスを指定できません。APIやCLIでは指定可能なので、[IBM Cloud: VPCのVSIをIPアドレス指定でプロビジョニングする方法](https://qiita.com/testnin2/items/337bc02892024fb684a3)では、その解決方法を紹介しました。

本記事はその続きです。2つ目のvNICにIPアドレスを明示的に指定することが、やはりUIからではできません。すでにVSIが存在している場合には、CLI(`ibmcloud is instance-network-interface-create`)で実施するのが簡単なため、そのやり方を紹介したいと思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/77c63054-93c7-0983-7c8f-cb26380b3c2f.png)

#2. 変更対象のVSI IDと追加したいSubnet IDの確認

- VSI ID <br> ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/b9bf03e1-f538-e9f4-f330-b38f9ea45eb9.png)
- Subnet ID <br> ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/f20d885f-223e-3de0-8f45-91fe8804aac1.png)


#3. CLIでの追加方法

```shell

プラグインの更新
$ ibmcloud update
$ ibmcloud plugin update

リージョンの変更
$ ibmcloud target -r jp-tok

VPC Gen2の選択
$ ibmcloud is target --gen 2

$ ibmcloud is instance-network-interface-create eth1 02e7_5d8a75b1-ac86-451b-8f0a-d256cb6bba00 02e7-7dab365d-6b50-43d8-99ed-6e1d829e661b --ipv4 192.168.0.10
Creating network interface eth1 for instance 02e7_5d8a75b1-ac86-451b-8f0a-d256cb6bba00 under account xxxx as user xxxx@xxxxxxxx...

ID                         02e7-5086d6d4-b7f9-4acc-82e0-11914da8bb31
Name                       eth1
Status                     pending
Type                       secondary
Subnet                     sub-192-168-0-0-24
Speed                      2000
The primary IPv4 address   192.168.0.10
Security groups            ID                                          Name
                           r022-1a2bb9f2-7647-4332-8a1b-eb925fb6e160   sg-tok-syasuda-default

Attached Floating IP:      No Floating IP attached
Created                    2020-09-18T15:07:45+09:00

```

#4. 確認

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/2e6f88d4-233f-65f5-459a-12ee71cb0872.png)
【Laravel】クエリ実行前にMySQLのDBコネクションのPDOにsetAttributeする。

メモとして残します。


#■やり方

下記の例では現在のDBコネクションに`PDO::ATTR_EMULATE_PREPARES`をtrueでセットしています。

```php
(\DB::connection()->getPdo())->setAttribute(PDO::ATTR_EMULATE_PREPARES, true);
```

#■余談
laravelでは`PDO::ATTR_EMULATE_PREPARES`はデフォルトFalseですが、
`LOAD DATA LOCAL INFILE`ステートメントを実行するときにエラーになってしまうため、PDO::ATTR_EMULATE_PREPARESをTrueにしてやる必要があります。
しかし、configのdatabase.phpで常にtrueにするのはさすがにちょっと、、、
と、なったなっため、瞬間的にTrueにすることで解決しました。
【MySQL】「LOAD DATA LOCAL INFILE」ステートメントを用いてCSVファイル等からデータをインポート

自分用のメモです。


#■やり方

下記の例では取り込むファイルは郵便局マスタ「x-ken-all.csv」
文字コードはSJISで、セパレータがカンマ（,）フィールドのデリミタがダブルクォート（"）
です。

```sql
SET character_set_database = sjis; 
LOAD DATA LOCAL INFILE 'D:/hoge/x-ken-all.csv'
INTO TABLE zipcodes
FIELDS TERMINATED BY ','
       ENCLOSED BY '"'
( 
	areacode, 
	@nonimportcolumn, 
	zipcode, 
	pref_name_kana, 
	city_name_kana, 
	div_name_kana, 
	pref_name, 
	city_name, 
	div_name, 
	@nonimportcolumn, 
	@nonimportcolumn, 
	@nonimportcolumn, 
	@nonimportcolumn, 
	@nonimportcolumn, 
	@nonimportcolumn
);
```