OmniAICreator/Qiita-1.07M huggingface dataset:
Amazon Linux2にmysql-56-communityをいれる

**改訂履歴**
2021.02.18 [Amazon Linux 2 に MySQL 5.6 を入れる (2021年2月版)](https://qiita.com/katzueno/items/8bf3d736f5b8fc02350d)のコマンドに更新しました。

---

Auroraの主力はまだまだ5.6だと思うので、そのような事情により5.6が必要な場合の手順です。
コピペできるように、$を取っています。

```shell:コマンド群
## MySQL 8.0 のレポジトリをインストール
sudo yum localinstall https://dev.mysql.com/get/mysql80-community-release-el7-1.noarch.rpm
## MySQL のレポジトリリストを確認。mysql80-community/x86_64 が enabled になっているはず。
sudo yum repolist all | grep mysql
## yum-config-manager が使えるか確認。yum-ulils が入っていたらOK
sudo yum list installed | grep yum-utils
## MySQL 8.0 をインストールしないように設定
sudo yum-config-manager --disable mysql80-community 
## MySQL 5.6 をインストールするように設定
sudo yum-config-manager --enable mysql56-community
## mysql56-community/x86_64 がenabled になっているか確認
sudo yum repolist all | grep mysql
## MySQL 5.6 Server をインストール。（Client などもインストールされるはず)
sudo yum install mysql-community-server
```

<details><summary>旧コマンド</summary><div>

```shell:コマンド群
sudo yum localinstall http://dev.mysql.com/get/mysql57-community-release-el6-7.noarch.rpm
sudo yum repolist all | grep mysql
sudo yum list installed | grep yum-utils
sudo yum-config-manager --disable mysql57-community 
sudo yum-config-manager --enable mysql56-community
sudo yum repolist all | grep mysql
sudo yum info mysql-community-server
sudo yum -y install mysql-community-server
```

</div>
【Vue初心者向け】Vue.jsのシンプルなTwitterのシェアボタンの実装

Vue.jsで実装する、Twitterのシェアボタンのサンプルコードです。
シェアボタンの実装方法はいくつかありますが、その中でも単純な実装方法です。

シェアボタンだけの実装なので、初心者の方でもわかりやすいと思います。

実際の動作はこちらで確認できます。

[シンプルなTwitterのシェアボタン](https://code.ameneko.com/twitter-share)

##サンプルコード

```
<template>
    <div class="twitter_share">
        <button @click="twitterShare">ツイッターでシェアする</button>
    </div>
</template>

<script>
export default {
    methods:{
        twitterShare(){
           //シェアする画面を設定
            var shareURL = 'https://twitter.com/intent/tweet?text=' + "ツイッターシェアボタンのサンプルコード" + "%20%23あめねこサンプルコード集" + '&url=' + "https://code.ameneko.com/twitter-share";  
           //シェア用の画面へ移行
            location.href = shareURL
        }
    }
}
</script>

<style scoped>
.twitter_share{
    max-width: 1000px;
    margin: auto;
}
</style>
```

###ポイント
ポイントは、ツイッターでシェアする方法を把握することです。
twitterにシェアする場合、「https://twitter.com/intent/tweet 」でシェアするページにいけます。コメントを載せるときは「?text=」の後にコメントを書きます。ハッシュタグをつける時は「%20%23」の後にコメントを書きます。URLをつける時は「&url=」の後にURLを書きます。
「shareURL」でシェアする用のデータを設定したら、次にリンクに飛ぶようにします。そこで、「location.href」でシェア用画面に遷移します。

参考：
[twitterのツイートボタンを作るためのリンクshareとintent/tweet](https://qiita.com/coconeko/items/dcd3a004578e02f63da5)

宣伝：ブログ書いてます！→[ブログ](https://www.katonobo.com/)
Pandas - 個人的よく忘れるもの

# Pandas
個人的に忘れやすいやつをメモしています

## カラムの値の変換
```df['feature'].replace([list], new)```

## カラム名の変更
‐ 複数変更の変更
```df = df.rename(columns={old1:new1, old2:new2})```

##カラム削除
```df = df.drop([list], axis=1)```

##カテゴリカルな要素の数値へのマッピング
```
mapping_dict = {"One":1, "Two":2,...}
df["feature"] = df["feature"]map(mapping_dict)
```
## 連続値を分割する
```
df.feature = pd.cut(df.feature, number)
```
JavaScript jquery.datetimepicker.js

datetimepicer の簡易サンプル、オプションはてきとうに設定
# download (zip)<br>
https://xdsoft.net/jqplugins/datetimepicker/

# html
```html
<!DOCTYPE html>
<html lang="ja">
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8"/>

<link rel="stylesheet" type="text/css" href="./jquery.datetimepicker.css"/>
<script src="./jquery.js"></script>
<script src="./build/jquery.datetimepicker.full.js"></script>
<script>
$(function(){
$('#datetimepicker1').datetimepicker({
    timepickerScrollbar:true,
    scrollTime:true,
    scrollInput:true,
    scrollMonth:true
});
$('#datetimepicker2').datetimepicker({datepicker:false});
$('#datetimepicker3').datetimepicker({timepicker:false});
});
</script>
</head>

<body>
    <h3>DateTimePicker</h3>
    <input type="text" id="datetimepicker1"/><br><br>
    <h3>TimePicker</h3>
    <input type="text" id="datetimepicker2"/><br><br>
    <h3>DatePicker</h3>
    <input type="text" id="datetimepicker3"/><br><br>
</body>
</html>

```

- scrollTime のオプションきかない...<br>
build/jquery.datetimepicker.full.js 2087行目に以下を追加すれば．．．

```JavaScript
			if (!options.scrollTime) {
				timeboxparent.off('mousewheel');
			}
```
エンジニアだけどポートフォリオ作ってみた

私のポートフォリオを作成した際に参考にしたサイトをまとめ


こちらのサイトを参考に作成
https://qiita.com/turmericN/items/76559f0b70983469e7c7

テンプレートはこちらを使用させていただいた
https://webdesigner-go.com/template/portfolio-02/


配色を決めるのに使用した
http://photoshopvip.net/72189#tool4

↑で決めた配色のグラデーションを調べるのに使った
https://palx.jxnblk.com/73f4e7

人物画像の加工
https://www.trevo-web.com/staffdiary/service/prisma.html

作ったポートフォリオをgithubの公開ページにupするためのサイト
https://techacademy.jp/magazine/6445

その他参考サイト
https://arutega.jp/japanese-portfolio/#SHOGO_TABUCHI
https://style.potepan.com/articles/491.html
https://webdesigner-go.com/job/portfolio/

https://www.sejuku.net/blog/86008

https://nh-lab.com/web-portfolio-wireframe/

今後参考にしたいサイト
https://qiita.com/tiwu_official/items/d7fb6c493ed5eb9ee4fc
Cocoapodsでmetalファイルを含めて配布する方法と、CoreImageで使う方法

cocoapodsでMetalファイルを含めて配布する場合は、podspecにmetalファイルを追加します。

```ruby:LibraryName.podspec
s.source_files = 'LibraryName/Classes/**/*.{swift,metal}'
```

また、CoreImageのCIKernelとして呼ぶ場合は次のような設定を追加します。

```ruby:LibraryName.podspec
s.pod_target_xcconfig = {
  'MTLLINKER_FLAGS' => '-cikernel',
  'MTL_COMPILER_FLAGS' => '-fcikernel'
}
```

これでMetalファイルに含まれる関数がCoreImage用としてコンパイルされます。

CIKernelをライブラリ内で生成するには、自身のバンドルを指定します。

```swift
private final class BundleToken {}

let url = Bundle(for: BundleToken.self).url(forResource: "default", withExtension: "metallib")!
let data = try! Data(contentsOf: url)
let kernel = try! CIColorKernel(functionName: "filterName", fromMetalLibraryData: data)
```
ec2でvisudoできなくなった

# 起こったこと
ある日ec2インスタンス内で `sudo visudo` コマンドを実行すると、、、

```
sudo: >>> /etc/sudoers: syntax error near line 93 <<<
sudo: parse error in /etc/sudoers near line 93
sudo: no valid sudoers sources found, quitting
sudo: unable to initialize policy plugin
```

と言われ、sudoコマンドが実行できなくなってしまいました。

# 原因
`/etc/sudoers` を修正した時にsyntax errorを起こしてしまい開けなくなってしまった

# 解決方法
### 〜方針〜
新しくec2インスタンスを作成
↓
新しく作成したec2インスタンスに対象ec2インスタンスのEBSをマウント
↓
sudoersを修正
↓
EBSを元のec2インスタンスに戻す


### 1, 対象のec2インスタンスを停止する
<img width="370" alt="スクリーンショット 2019-08-19 1.53.37.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281558/aa538076-48a3-daa2-9528-e12d78edb1a4.png">

### 2, 停止したインスタンスのEBS(ELASTIC BLOCK STORE)をデタッチ
<img width="1074" alt="スクリーンショット 2019-08-19 2.06.54.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281558/2f11c367-6571-037e-a560-c0b554575778.png">
<img width="205" alt="スクリーンショット 2019-08-19 1.55.37.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281558/41cadd0f-0c52-e17c-1cb7-f70c22bc44d6.png">

### 3, 新しく別のec2インスタンスを生成し、そのインスタンスに先ほどデタッチしたEBSをアタッチ
<img width="1557" alt="スクリーンショット 2019-08-19 2.12.15.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281558/983c0c90-9f7b-cc33-ee84-f880805af64e.png">

### 4, 新しく生成したインスタンスに入りアタッチしたEBSをマウント
ec2インスタンスにログイン
`ssh -i { pemファイルディレクトリ } ec2-user@YY.YYY.YY.YYY`

今回マウント先は `/mnt/vol` としたいと思います

```
# /mnt/volディレクトリを作成
sudo mkdir /mnt/vol

# EBSをマウント
sudo mount /dev/xvdf1 /mnt/vol
```

### 5, `sudo vim /mnt/vol/etc/sudoers` で *sudoers* を修正
### 6, マウントしたEBSをアンマウント

```
# EBSをアンマウント
sudo umount /mnt/vol
```

### 7, 先ほどデタッチしたEBSを元のec2インスタンスにアタッチ
デバイスを `/div/xvda` としてください
<img width="1821" alt="スクリーンショット 2019-08-19 2.20.45.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281558/5b6c32a3-f44e-4d16-ce9a-c2eabbfa4fad.png">

### 8, 最初に停止したec2インスタンスを起動

以上で作業完了です


# 参考文献
https://serverfault.com/questions/392977/broke-my-etc-sudoers-file-on-amazon-ec2
https://casualdevelopers.com/tech-tips/how-to-fix-ssh-problem-to-ec2/
プログラマーがWordPressが使いにくい理由を整理してみた。

# きっかけ
仕事でWordPressを扱っているが、WordPressは正直使いにくい。
趣味でRuby on Rails やLaravelに触れたことのある私だが、WordPressはどうも好きになれない。
構築は楽だし慣れれば早いんだけど、WP全体の仕様に理解ができない。
どうやら、プログラマー側から出てきた人間であればあるほどそう思うらしく、
PHPのフレームワークでWordPressしかやったことがない人間からすれば、別に違和感を感じないらしい。
その理由として極一部であるが、どうしてそう思うのか、整理してみた。

# 使いにくい理由

## 値取得とテキスト表示が別関数

例えば、サイトのタイトルを表示させたいときは

```
<?php the_title(); ?>
```

なんだけど、タイトルを関数に入れて表示させたいときは

```
<?php 
  $title =  get_the_title();
  echo $title 
?>
```
と、別の関数が用意されている。
全ての表記が統一されておらず、サイトのURLを示す`home_url()`はechoをつけないと表示されない。カテゴリーは配列であるが、それが関数で分からないのがすごくややこしい。

## テーマ内で色々指定するファイルがfunction.phpだけ
function.phpでは
・ 投稿設定（登校時にpタグを削除する等）
・ フロント表示設定（自動で表示されるmetaタグ削除等）
・ 管理画面表示設定（メニュー非表示・ログイン時アイコン設定等）
・ 独自関数設定
・ オリジナル投稿（カスタム投稿）設定
・ 投稿画面で使える関数を設定(ショートコード)
・ ウィジェット作成
・ プラグインの詳細設定
などなど、
設定しようと思えば、なんでも出来てしまう。
しかし、これらを**設定する場所がfunction.phpしかない。**
カスタマイズをすればするほど、ファイルが長くなり、5000行を軽く超えるファイルになる。
そうなると、修正したいときに探すだけで一苦労だし、ダブっているソースに気付きにくいのも同然である。

## 管理画面上でしか設定出来ないこともあるし、どっちでも設定できることがある煩わしさ
全部function.phpで設定出来るならば移植も楽なんだけど、そうではない。
固定ページは一度管理画面で作成しなくちゃならないし、
投稿数を適切に設定しないと投稿表示がうまく表示されない。
管理画面の設定なのか、function.phpの設定なのか、はたまたプラグインの衝突なのかわかりにくい。
バグによってはこれという解決方法が無いものもあるらしく、ため息が出てしまう。


## 独特の専門用語が多すぎる

変に言葉を変えなくてもいいようなところを、専門用語を使ってややこしくしている節があるように思える。

デフォルトの記事の区分分けは「**カテゴリー**」「**タグ**」で、
オリジナルで設定する場合は「**タクソノミー**」。
オリジナルの投稿設定を「**カスタム投稿**」と言って、
カスタム投稿内での区分分けは「**カスタムタクソノミー**」。
カテゴリーやタクソノミー毎の「**スラッグ**（カテゴリー毎のID）名」を「**ターム**」。
通常の投稿枠にプラスしてオリジナルの入力枠を増やすのは「**カスタムフィールド**」

書いているだけでも混乱するし、言葉で言われたらもっと理解できない。
命名の仕方の統一性すらない。
「ターム」は「スラッグ名」じゃダメなの？
なぜ、「タクソノミー」と「オリジナルカテゴリー」に命名を分ける仕様にしている？？？

# 総括
ワードプレスは作り方が独特なように思う。
ノンエンジニアの為のフレームワークであり、Webデザイナーのための、コーダーの為のシステムって感じる。
PHPを学ぶよりも、一番最初にWordPressを学んだ人が、他でここの知識を転用出来たらいいんだけど、それが今のところ全くないんですよね。
WordPressの沼にハマった人は、そこから抜け出すのは大変だよなぁ。Wordpressの闇だよなぁ。
そのように思いました。
AzureのPostgreSQLを利用する場合の照合順序指定方法

## 概要
Azure Database for PostgreSQLを使ったときにハマったのでメモとして残します

## 結論
Windows上で動いているようで「ja_JP.utf8」は使えないため「Japanese_Japan.932」とする

```sql
CREATE DATABASE database_name OWNER=postgres ENCODING='UTF8' LC_COLLATE='Japanese_Japan.932' LC_CTYPE='Japanese_Japan.932' TEMPLATE='template0';
```
VS Codeでgithubにプッシュする際Permission denied (publickey)エラーが出る場合の対策

1. まずは、ここでちゃんとSSH Keyを生成して然るべき場所にセットしておくこと。
    
    [Generating a new SSH key and adding it to the ssh-agent](https://help.github.com/en/articles/generating-a-new-ssh-key-and-adding-it-to-the-ssh-agent#adding-your-ssh-key-to-the-ssh-agent)
    
1. ~/.ssh/config の設定を以下の設定する。

```shell:.ssh/config
Host *
AddKeysToAgent yes
UseKeychain yes
IdentityFile ~/.ssh/id_rsa
```
これでVS CodeからエラーなくGitHub.comにPushできるようになった。
LookMLのmeasure追加による数値情報の可視化


Lookerで参照するデータがint型の場合でも、lookMLにviewを作った場合、
Dimension項目と判定されてしまい、可視化がうまくできない！？

といった事が起こりやすい気がしますので、対処例をまとめました。

## 状況
**LookMLに取り込んだ数値項目がDimensionになってしまっており、可視化できない！？**


**・取込データ（例として統計局からとってきた都道府県別の人口統計データ）**

```
prefecture_code,prefecture_name,general_name,Japanese_calendar_year,survey_year,note,population_total,population_male,population_woman
"00","全国","大正",9,1920,"",55963053,28044185,27918868
"01","北海道","大正",9,1920,"",2359183,1244322,1114861
"02","青森県","大正",9,1920,"",756454,381293,375161
～　省略
```

**・LookMLの自動生成内容**
![lookML修正1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242038/8a39403f-2835-33e8-4eb4-8be7eeaf58cc.png)


**・可視化した結果、意図しない項目がグラフに出てしまった**
![lookML修正2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242038/b755070e-d95c-5095-4898-1f5c996b0816.png)


## 対処方法
**以下のようにLookMLにmeasure項目を追加→コミット→デプロイする**

```yaml
##### 対象項目のdimension状態 #####
  dimension: population_male {
    type: number
    sql: ${TABLE}.population_male ;;
  }
  dimension: population_woman {
    type: number
    sql: ${TABLE}.population_woman ;;
  }
  dimension: population_total {
    type: number
    sql: ${TABLE}.population_total ;;
  }

###### 以下をlookMLのコードに追加 ######
  measure: population_male_count {     # 名称に_countを追記
    type: sum                          # 集計項目sumを指定 
    sql: ${TABLE}.population_male ;;   # 変更なし
  }
  measure: population_woman_count {    # 名称に_countを追記
    type: sum                          # 集計項目sumを指定 
    sql: ${TABLE}.population_woman ;;  # 変更なし
  }
  measure: population_total_count {    # 名称に_countを追記
    type: sum                          # 集計項目sumを指定 
    sql: ${TABLE}.population_total ;;  # 変更なし
  }
```

**・上記対応後にmeasureに追加された項目を利用して、グラフ描画可能に**
![lookML修正3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242038/2bfd13d3-1557-8aed-5422-b82d97649877.png)


## まとめ
この事象はLooker触って最初のうちに引っかかりやすいと思いますが、
**dimensionとmeasuerの要素を知る**のにかなり良い事例とも思います。

追記：以下ブログに書かれている通り、Lookerの仕様で数値表記したい項目でも基本的に、dimensionで取込まれるらしいです。
https://dev.classmethod.jp/business/business-analytics/looker-create-measure-fields-in-view/
【GitHubメモ】Visual Studio CodeからGitHubに公開する

やる度に何回も調べているのでいい加減書き残しておきます。

#1. GitHubにリポジトリを作成する
今回はサンプルとしてファイル名を***git_test***としますので、以下の画像の通り作成しました。 
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/476952/103e44f1-8b5b-b2af-8037-af8e4ee8bb47.png" width="500px">

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/476952/55cd347e-8949-4e69-a3ce-37d2e857003f.png" width="500px">

リポジトリのURL（このサンプルの場合は" https://github.com/HiROJP/git_test.git "）をコピーしておきます。



#2. GitHubに公開したいファイルを作る
好きな階層のフォルダにファイルを作成してください。

次に***Visual Studio Code***でそのファイルを開き、エディター内のコンソールからファイルの階層へ移動します。

#3. ローカルリポジトリを作る
ローカルリポジトリを作成する為、そのコンソールにて下記のコードを入力

```
$ git init
```
念の為 ```$ git status``` で確認をするとこのような文が現れると思います。

```
On branch master

No commits yet

Untracked files:
  (use "git add <file>..." to include in what will be committed)

        git_test.txt

nothing added to commit but untracked files present (use "git add" to track)
```

#4. ファイルを追加する

```
$ git add 作成したファイル
``` 
次に上記のコード（このサンプルではgit add git_test.txt）を入力します。 また ```$ git status```で確認してみると

```
On branch master

No commits yet

Changes to be committed:
  (use "git rm --cached <file>..." to unstage)

        new file:   git_test.txt
```
git_test.txtが追加されているのがわかると思います。 

#5. コミットする

```
$ git commit -m "new commit"
```  
確認が終わったら、コミットを行う為のコードを入力します。
#6. リモートリポジトリを追加

```
$ git remote add origin リモートリポジトリのURL
``` 
（このサンプルでは" git remote add origin https://github.com/HiROJP/git_test.git "）を入力してください。 

#7. リモートリポジトリからローカルへ

```
$ git push origin master
``` 
これを入力する事で、Visual Studio Codeの***ソース管理タブ***からコミットやプルを行えるようになると思います。 また、もしソース管理タブに変化がない時は一度ファイルを閉じて、再度開くとGitHubと連携するようになることがあります。
Ubuntu Serverで内向きDNSをUnboundを使ってやってみたのでメモ

ubuntuサーバーで内向きDNSを作成します。
内向きDNSをすると何が便利なのかといいますと、例えばnas.natというドメインを自分のサーバー宛てにすることができるのです。
あまりよくない例ですが、google.comというドメインも自分のサーバーに設定することができます。（偽装もできるので注意）


#実装
まずはunboundをインストールします。

```
$ sudo apt -y install unbound
```

次にunbound.confを設定します。ここでは、サンプルのディレクトリをコピーします。

```
$ sudo cp /usr/share/doc/unbound/examples/unbound.conf /etc/unbound/unbound.conf.d/
```

そして、コピーしたファイルを編集します。

```
$ sudo nano /etc/unbound/unbound.conf.d/unbound.conf
```

こんな感じに編集します。下記サンプルです。
ここでは、３つのドメインを同一サーバー向けに設定します。

nas.uma.gov
media.uma.gov
office.uma.gov
これらすべてが、192.168.31.150(私のサーバーIP）に設定されます。必要に応じて変更してください。

```/etc/unbound/unbound.conf.d/unbound.conf
server:
	verbosity: 1

	interface: 0.0.0.0
   #アクセス許可設定　※ここでは、ローカルネットワークと31のネットワークを許可していますので、環境に合わせて変更
	access-control: 127.0.0.0/23 allow
	access-control: 192.168.31.0/23 allow
    
　　#逆引き設定
　　local-data: "nas.uma.gov. IN A 192.168.31.150"
　　local-data: "media.uma.gov. IN A 192.168.31.150"
　　local-data: "office.uma.gov. IN A 192.168.31.150"

python:
remote-control:
#Cloudflare Public DNS
 forward-zone:
	name: "."
	forward-addr: 1.1.1.1
	forward-addr: 1.0.0.1

```

最後に、設定ファイルが間違っていないか確認する

```
$ unbound-checkconf
```
unboundを再起動

```
$ sudo service unbound restart
```

##エラー対策

よしよし、、出来たぞ！！再起動しようかと思ったところ、エラーが発生


👇エラー内容

```
root@servername:~# service unbound start
Job for unbound.service failed because the control process exited with error code.
See "systemctl status unbound.service" and "journalctl -xe" for details.
```

おっと！？？？
まさか、ポートだれか使ってる？？

####👇DNSポート（PORT:53）を使ってるサービスを調べる

```
$ sudo ss -lntp | grep 53
```

```
---------------------------------------------------------------------------------------
LISTEN 0 5   127.0.1.1:53           *:*      users:(("systemd-resolved",1224,5))
---------------------------------------------------------------------------------------
```

あ、、居た！こいつだ
この、systemd-resolvedというサービスは、ネームサーバーを変えたりすることができるがここではその機能は不要のため停止する。
下記のように設定すること


```/etc/systemd/resolved.conf
[Resolve]
DNSStubListener=no
```

設定後にこのsystemd-resolvedを再起動

```
$ sudo systemctl restart systemd-resolved
```

####もう一回DNSポート（PORT:53）を使ってるサービスを調べる

```
$ sudo ss -lntp | grep 53
```

ここで何も出てこなければ設定完了です。

unboundをスタートさせましょう。

```
$ sudo service unbound start
```

とりあえず完成です。
obnizOSをM5Stack(M5StickC)にインストールする手順

#結果からM5StickC未対応でしたのでM5Stackにしてあります。

##環境
機種:Surface Pro5
OS:Windows10 Pro 64ビット
Obniz化される触媒:M5Stack ~~M5StickC~~  ※2019/08/19 時点M5StickCは未対応

※事前にPython2.7がインストールされていたのでアンインストール。

##事前の準備
###Python3.7.4(32ビット)のインストール
ダウンロード先：
https://www.python.org/ftp/python/3.7.4/python-3.7.4.exe

####Add Python 3.7 to PATHのチェックは忘れずに！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399986/c77c7525-92f0-75e9-5d1b-d755a7d5d693.png)

Python起動確認
コマンドプロンプトから Python --versionを入力
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399986/031d0846-1e91-9b04-17d6-48d6c5d2a5b7.png)



pipの確認(Pythonと同時にインストールされるらしい)
コマンドプロンプトから pip -V を入力
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399986/a6c925e8-bb27-65d9-71c2-f0ea55b738e4.png)


##obnizOSインストール ~本編~

1.コマンドプロンプトから pip install obniz_cli を入力
こんなかんじでインストール始まる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399986/586da1a1-9500-427b-8777-263db602a9f1.png)


2.M5Stack ~~M5StickC~~ をパソコンと接続します


3.コマンドプロンプトから python -m serial.tools.list_ports を入力
このコマンドは、パソコンが認識しているデバイスのリストを表示します。
図の場合は、COM6に刺さってますよーってこと。出てこない場合はM5Stackが接続されていないか、認識されていない。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399986/57f8d8cb-3258-3994-4b92-16a5e21bb6d3.png)


4.コマンドプロンプトから obniz_cli flashos -b 115200 を入力
※ -b 115200のオプションを付けないとM5StickCは通信速度制限エラーになる。
恐らく他のESP32デバイスは必要ないと思うけど、M5StickCさんは付けてあげないとダメ。
ここはArduinoで書き込みする場合と同じ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399986/817b3654-2f6e-285f-d64e-6a6d326a98ba.png)

5.COM6にインストールするため、引き続き0を入力してエンターすると書き込みが始まる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399986/d5d58879-36b0-2581-edb6-ec0813607a5c.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399986/994c38d2-b95b-d34a-d71b-0c759fd74bb2.png)

##obnizOSとシリアル通信を行いデバイスキーの登録

1.コマンドプロンプトから python -m serial.tools.miniterm COM6 115200 を入力
前述手順3のデバイスリストで認識していたポート名を入力COM6はだった場合、COM6。

※8/19時点でM5SticKCの場合は、ここでエラーとなり、再起動を繰り返すので問い合わせ中…ここからM5Stackに切り替えた。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399986/8b948b88-8450-0a77-923f-a72d4b3ad63a.png)



2.DeviceKEYを入力してエンター
※DeviceKEYはObnizの管理コンソールから購入します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399986/629ab180-50ec-6812-3549-99c9fa79e72a.png)

3.WifiのSSIDの一覧が表示されるので使いたいSSIDを入力してエンター
4.その後、パスワードを入力してエンター
5.IPを固定にするか、DHCPにするか選択肢が出てくるので、対象の番号を入力してエンター
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399986/7cfe18f6-b911-9af2-4546-52c12fdbed89.png)


OnlineになればOK!
【Ruby入門】 繰り返し文

繰り返し文にいくつか方法があったのでメモします。

##1.each

```ruby
words = ["aaa", "iii", "uuu"]

words.each do |word|
     puts word
end
```
【結果】
aaa
iii
uuu

##2.times do
1.

```ruby
omikuji = ["大吉", "中吉", "凶"]
3.times do |num|
    puts omikuji[num]
end
```

【結果】
大吉
中吉
凶

`||`はブロック変数で、
doからendの中でしか使えないもの。
普通の変数と同じように、名前を自由につけることができる。

2.

```ruby
omikuji = ["大吉", "中吉", "凶"]
3.times do
    puts omikuji.sample
end
```
【結果】
中吉
大吉
中吉
(=> ランダムに3回表示される)


##3.while
1.

```ruby
a = 0
while(a < 100)
    puts a
    a += 10
end
```
【結果】
0
10
20
30
40
50
60
70
80
90

2.

```ruby
omikuji = ["大吉", "中吉", "凶"]

result = omikuji.sample
while(result != "大吉")
    puts result
    result = omikuji.sample
end
puts result
```

【結果】
=> 大吉が出続けるまでおみくじを引き続けるプログラム
なんでSwiftで定数を使う必要があるの？

Swfitにおける、インスタンスの格納方法として、変数と定数があります。簡単に言えば、モノを格納しておく箱ですね。ただSwiftでは、定数といっても、C言語のようにコンパイル時に値が確定されされてしまうわけではなく、ただ単に実行時に最初に決めた値を後から変更できないだけなのです。そこで、あるギモンが浮かび上がります。「それ、変数とあんま変わらんくね？」と、思いませんか？私は、めちゃ思いました。
てことで、Swiftで定数を使うメリットをご紹介しようと思います！
# そもそも変数と定数って何？
インスタンスを格納する上で、値を自由に書き換えられるのが変数、初期値を設定したら値を変更できないのが定数です。
## 変数の定義
Swiftで変数を定義する方法は以下の通りです。

```swift
var 変数名: 型名 = 値
```

## 定数の定義
Swiftで定数を定義する方法は以下の通りです。

```swift
let 定数名: 型名 = 値
```

# 定数を使うメリット
お待たせしました。Swiftで定数を使うと何が嬉しいのでしょうか？
### プログラムが読みやすくなる
一つは、定数としてインスタンスを保存することによって、後からプログラムを読んだり、別の人がプログラムを読むときに、「この値は変化しないんだな」とすぐにわかるので、読みやすくなります。

### 誤って変更してしまうのを防ぐ
自分で誤って変更してはいけない値を変更してしまったり、共同開発などで、別の人が誤って値を変更してしまうような自体を防ぐことができます。

### 合理的な実行コードを生成できる
値が変化しないことがあらかじめわかっていれば、コンパイラがプログラムを解析するのが容易になるため、高速かつ効率的な実行コードを生成できる可能性があります。

# 終わりに
いかがでしたでしょうか。ざっと簡単に定数を使うメリットを紹介してみました。Swiftでコードを書くとき、変更が必要ない場合はできる限り定数を使う努力をしてみてください。
# 参考
[詳解Swift第４版| 荻原 剛志　著](https://www.amazon.co.jp/%E8%A9%B3%E8%A7%A3-Swift-%E7%AC%AC4%E7%89%88-%E8%8D%BB%E5%8E%9F-%E5%89%9B%E5%BF%97/dp/4797395184/ref=sr_1_4?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&keywords=Swift&qid=1566142823&s=gateway&sr=8-4)
n番煎じの2次元空間の線分同士の交差判定をcolabで実装してみる

調べればいくらでも出てくる外積を用いた線分同士の衝突判定
Google Colaboratoryで組んでおきました．
[ここ](https://drive.google.com/open?id=1cQBoa8nKPy96qlx4a2_j-aVpl6wr5uhQ)からサンプルが動きます．直線abとcdの衝突判定をします．
数学的な説明は他のところに任せます．

```math
\begin{bmatrix}
temp1
\end{bmatrix}
=
\begin{bmatrix}
bx-ax\\
by-ay
\end{bmatrix}
\times
\begin{bmatrix}
cx-ax\\
cy-ay
\end{bmatrix}
\\
\begin{bmatrix}
temp2
\end{bmatrix}
=
\begin{bmatrix}
bx-ax\\
by-ay
\end{bmatrix}
\times
\begin{bmatrix}
dx-ax\\
dy-ay
\end{bmatrix}
\\
\begin{bmatrix}
temp3
\end{bmatrix}
=
\begin{bmatrix}
dx-cx\\
dy-cy
\end{bmatrix}
\times
\begin{bmatrix}
ax-cx\\
ay-cy
\end{bmatrix}
\\
\begin{bmatrix}
temp4
\end{bmatrix}
=
\begin{bmatrix}
dx-cx\\
dy-cy
\end{bmatrix}
\times
\begin{bmatrix}
bx-cx\\
by-cy
\end{bmatrix}
\\
\begin{cases}
(temp1\bullet temp2 \leq 0) \cap(temp3\bullet temp4 \leq 0) & collision  
\\
otherwise & no collision
\end{cases}
```

#修正(2019/09/04)
temp1とtemp2の部分しか考えていませんでしたが，それでは不十分だったので修正しました．
Vagrant + Ansible で LAMP 環境を構築する

## はじめに

今さらですが、久しぶりにローカルに LAMP 環境を構築する機会があったので手順などをメモします。

## 準備

以下をインストールします。

- Vagrant - [Download](https://www.vagrantup.com/downloads.html)
- VirtualBox - [Download](https://www.virtualbox.org/wiki/Downloads)

Ansible を使いたいので Homebrew でインストールしておきます。

```sh
$ brew install ansible
```

## Vagrant

作業ディレクトリを用意して Vagrantfile を作成します。

```sh
# 作業ディレクトリの作成
$ mkdir /path/to/work/dir
$ cd /path/to/work/dir

# Vagrantfile の作成
$ vagrant init
```

box は [Vagrant Cloud](https://app.vagrantup.com/boxes/search) で提供されているものを使います。今回は `centos/7` を利用します。IP アドレスはデフォルトで `192.168.33.10` です。

```
Vagrant.configure("2") do |config|
  config.vm.box = "centos/7"
  
  config.vm.define "hoge" do |node|
  	config.vm.network "private_network", ip: "192.168.33.10"
  	config.vm.synced_folder "data", "/vagrant", create: true
  end
end
```

このまま  `vagrant up`  するとおそらく共有フォルダのあたりでコケます。理由は VirtualBox Guest Additions のバージョンが合わないからです。なので、それをいい感じにしてくれる Vagrant のプラグインをインストールします。

```sh
$ vagrant plugin install vagrant-vbguest
```

これで `vagrant up` すると、とりあえず CentOS な環境が出来上がります。ちなみに作成した環境にログインするときは `vagrant ssh` でもいけますが `vagrant ssh-connfig` すると ssh で接続するための情報が出力されます。`~/.ssh/config` に書き込んでおくと `ssh default` みたいな感じでログインできます。

## Ansible

今回は手っ取り早く LAMP 環境を構築したいので、AP サーバとか DB サーバとかは個別に用意しません。

Vagrantfile があるところに provisioning ディレクトリを作成して、その中に playbook.yml として作成します。情報としては古いですが、[昔参考にしていた記事](https://tanaka.sakura.ad.jp/2011/05/centos-linux-apache-php-perl-mysql-lamp.html) をもとに playbook を作成していきます。

```yaml
- hosts: playground
  become: yes
  tasks:
    - name: system update
      yum:
        name: '*'
        state: latest

    - name: install tools
      yum:
        name:
          - wget
          - vim
          - git

    - name: install repos
      yum:
        name:
          - epel-release
          - https://rpms.remirepo.net/enterprise/remi-release-7.rpm
        state: present

    - name: disable repos
      replace:
        path: /etc/yum.repos.d/{{item}}
        regexp: 'enabled *= *1'
        replace: 'enabled=0'
      loop:
        - epel.repo
        - remi.repo
        - remi-php70.repo

    - name: install packages
      yum:
        name:
          - httpd-devel
          - php
          - php-devel
          - php-mbstring
          - php-mysqlnd
          - php-pdo
          - mariadb-server
        enablerepo: "epel,remi-php70"

    - name: start httpd
      service:
        name: httpd
        state: started
        enabled: yes

    - name: start mariadb
      service:
        name: mariadb
        state: started
        enabled: yes
```

これで `vagrant provision` すると httpd/php/mariadb がインストールされた環境が構築されます。

ブラウザで `http://192.168.33.10` にアクセスしてテストページが表示されていれば OK です。

<img width="1169" alt="Screen Shot 2019-08-19 at 0.16.46.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/185323/29f4880e-55af-8a4c-aa5c-52efa47ca0ff.png">
時計の長針と短針のなす角

# はじめに
中学入試ではよく時計の長針と短針のなす角について出題があります。
場合分けもいろいろあるので、１分刻みで全部調べてみました。

# 1分間に進む角度

- 長針は１分間に６度進みます。
- 短針は１分間に0.5度進みます。

ということは長針が短針を追いかけるとすると、１分間で5.5度の差が縮まります。
追いつくと、また３６０度の差で再スタートです。

答えの角度は０度以上１８０度以下の角で答えることに注意します。

# コード

```clock.jl
for h=0:23 
    for m=0:59
        if abs(30*h-5.5*m)%360<=180
            print(h,"時",m, "分は",abs(30*h-5.5*m)%360,"度","\n")
            else 
            print(h,"時",m, "分は",360-abs(30*h-5.5*m)%360,"度","\n")
        end
    end
end
```


0時0分は0.0度
0時1分は5.5度
0時2分は11.0度
0時3分は16.5度
0時4分は22.0度
0時5分は27.5度
0時6分は33.0度
.
.
.
23時54分は33.0度
23時55分は27.5度
23時56分は22.0度
23時57分は16.5度
23時58分は11.0度
23時59分は5.5度

これでいつでも角度は求まります！

＜計算サイトもありました＞
https://www.calc-site.com/stories/clock_time
ある要素が表示されるまで待つJSライブラリを書いた(MutationObserver)


# インストール
### ブラウザで使う
```html
<script src="https://gistcdn.githack.com/GitHub30/1b13ed6687a22385a81cf98fefdd5a13/raw/42012a345cc5cb1e4f773300e99765b644a40164/async$.js"></script>
```

### Greasemonkey(Tampermonkey)で使う
下記を追加する。

```javascript
// @require  https://gist.github.com/GitHub30/1b13ed6687a22385a81cf98fefdd5a13/raw/42012a345cc5cb1e4f773300e99765b644a40164/async$.js
```

# 使い方
## querySelector
```javascript
const title = await async$('title')
console.log(title.textContent)
```
### Usage
async$(selector, [startNode])

## querySelectorAll
```javascript
const links = await async$$('a')
console.log(links)
```
### Usage
async$$(selector, [startNode])

## XPath
```javascript
const links = await async$x('//a')
console.log(links)

// 要素を１つだけ取得
const h1 = await async$x('//h1', document, XPathResult.FIRST_ORDERED_NODE_TYPE)
console.log(h1.textContent)
```
### Usage
async$x(selector, [startNode], [XPathResult#Constants])

XPathResult#Constants
https://developer.mozilla.org/ja/docs/Web/API/XPathResult#Constants

## タイムアウト
```javascript
// 1秒でタイムアウト
window.ASYNC$_TIMEOUT = 1000
await async$x('//a')
```
ASYNC$_TIMEOUTにミリ秒でタイムアウトを設定すると、要素が見つからない場合、エラーになります。よしなにtry catchしてください。
デフォルトはタイムアウトしません。

# 引用
> ある要素が表示されるまで待つJSライブラリを書いた(MutationObserver)
> https://efcl.info/2015/04/06/wait-for-element/
Storybook + React.jsでViewにロジックや静的ファイルを導入する

# 背景

- Storybook とはコンポーネント毎にViewを可視化するツールです。
- i18nなどでテキストを管理していたため動的にファイルを変更させたかったのですが、公式ドキュメントなどを記述がありませんでしたので補足です。

下記のように記述すると、エラーで怒られます。

```ts:こんな風に使いたかった
import * as React from 'react'
import { useTranslation } from 'react-i18next'

// react-i18next を呼ぶ時は別途スクリプトの記述が必要ですが略
// 公式を参照するとわかります。
// https://github.com/i18next/react-i18next

storiesOf("HelloWorld", module)
  .add("HelloWorld", () => {
    const { t } = useTranslation()
    return (
      <HelloWorld>t('hello_world')</HelloWorld>
    )
  })
```

```text:エラーメッセージ
Invariant Violation: Invalid hook call. Hooks can only be called inside of the body of a function component. This could happen for one of the following reasons:
1. You might have mismatching versions of React and the renderer (such as React DOM)
2. You might be breaking the Rules of Hooks
3. You might have more than one copy of React in the same app
See https://fb.me/react-invalid-hook-call for tips about how to debug and fix this problem.
```

## 解決策

`React.createElement`を導入します。

```ts:これだと動きます
import * as React from 'react'
import { useTranslation } from 'react-i18next'

storiesOf("HelloWorld", module)
  .add("HelloWorld", () => 
    React.createElement(() => {
      const { t } = useTranslation()
      return (
        <HelloWorld>t('hello_world')</HelloWorld>
      )
    })
  )
```

## 静的ファイルの参照方法

`webpack`の出力先をstorybookにも適用してあげるだけです。`-s`オプションを使用します。

下記は `webpack`の出力先が`dist`の場合

```json:package.json
{
// 略
"scripts": {
    "storybook": "start-storybook -p 9001 -c .storybook -s ./dist",
  },
// 略
}
```

# 参考

- [Cannot use React hooks directly inside a story #5721](https://github.com/storybookjs/storybook/issues/5721)
InsiderPreviewでWSL2を導入しよう

Windows10 Insider Preview にWSL2がはいりました。
業務用のマシンがWindowsでも簡単にLinux環境が手に入るのはとてもありがたいです。

WSL2でネットワーク構成が変わった関係でWSL上でサーバー等を起動してもlocalhostアクセスができなかったのですが、
Build 18950からできるようになったので結構便利になりました。

---

## 目的

ここではWSL2の有効化 + Ubuntuインストールまで実施します

## 環境
- OS
  - Windows 10 Enterprise Insider Preview
- Version
  - Build 18950


## WSL2 インストール

### 機能の有効化
インストール前に機能を有効化しておく必要があります
「Windowsの機能の有効化または無効化」から以下の機能のチェックボックスを入れてください

- Hyper-V
- Windows Subsystem for Linux
- 仮想マシン プラットフォーム

再起動が要求されると思うので再起動

### Microsoft Store

ストアで「Linux」と検索すると色々ディストリビューションが引っかかると思いますが今回はUbuntuで進めます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66369/733a3156-f93a-1072-cf81-8ef84faa0f1e.png)

### WSL2を使う

WSLを有効化した直後はWSL1を使うようになっているので、WSL2を使うようにコマンドを実行します
PowerShell or コマンドプロンプトの管理者権限で叩いてください

```powershell:powershell
wsl --set-version Ubuntu 2
```

バージョン確認して `VERSION:2` になっていればOK

```sh:powershell
> wsl --list --verbose
  NAME      STATE           VERSION
* Ubuntu    Running         2
```

### 起動確認

WSL1と区別はつかないですが一応…

```sh:powershell
PS C:\WINDOWS\system32> bash

### Ubuntuが起動
$ cat /etc/os-release
NAME="Ubuntu"
VERSION="18.04.2 LTS (Bionic Beaver)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 18.04.2 LTS"
VERSION_ID="18.04"
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
VERSION_CODENAME=bionic
UBUNTU_CODENAME=bionic
```

## 参考

[公式ドキュメント](https://docs.microsoft.com/en-us/windows/wsl/wsl2-install)
[WSL2を使ってみる (InsiderPreview)](https://qiita.com/namoshika/items/53a9ac2df7eace656870)
データ前処理で扱う、pythonの関数

# はじめに
雑多になるとは思うが、データ前処理で扱うnumpyとかの関数の使い方を残す

# 前提

```
import numpy as np
import pandas as pd
df = pd.read_csv(...)
```

# np.where
参考：https://www.sejuku.net/blog/73049

例えば欠損値に対して有無フラグを建てたいなぁなど、データの置換をしたい場合はコレを使う。

```
np.where(
    condition,    # 条件式 
    x,            # conditionがTrueだったときに元の配列要素の代わりに代入される値 
    y             # conditionがFalseだったときに元の配列要素の代わりに代入される値
)
```

# df.iloc, df.loc
参考：http://ailaby.com/lox_iloc_ix/

データフレームのデータ参照のための関数。
locとilocの違いはラベルで参照するか、インデックス値で参照するかの違い。ixはラベルもインデックス値も使える。
     行、列の指定方法
loc  行ラベル、 列ラベル
iloc 行の番号(0 ~ )、列の番号(0 ~ )
ix   行ラベル、列ラベル または 行の番号(0 ~ )、列の番号(0 ~ )
DockerでIPv6を無効化する方法

DockerでIPv6を無効にするにはどうすればよいでしょうか。
そのようなパラメタやコマンド自体が直接は実装されていないので、組み合わせでどうにかしましょ。

#sysctlを渡す
Dockerでsysctlをオプションを渡すことができます、それを使ってdisable ipv6の値を渡してみよう[^2]
また、sysctlオプションは複数回使えるらしいです[^3]

```bash:コンテナの作成
docker run -it --sysctl net.ipv6.conf.all.disable_ipv6=1 --cap-add=NET_ADMIN centos 
```

#iptablesでブロック
iptables(ip6tables)で落としてしまうのも一つの案でしょう

```bash:コンテナの作成
docker run -it --cap-add=NET_ADMIN ubuntu
```

すごく単純にできそうです。[^1]

```bash:iptables
ip6tables -A OUTPUT -j REJECT
ip6tables -A INPUT -j REJECT
```

#関連文献
https://github.com/moby/moby/issues/20569
https://codeday.me/jp/qa/20190410/594168.html


#参考文献
[^1]: https://lxadm.com/IPv6:_blocking_incoming_traffic_with_ip6tables
[^2]: https://stackoverflow.com/questions/30750271/disable-ip-v6-in-docker-container
[^3]: https://unix.stackexchange.com/questions/404387/how-to-sysctl-net-related-config-in-docker-container
PowerShell モジュールのバージョン確認とアップデート

## 経緯

久々に PowerShell で SharePoint PnP を使ってどうのこうのしようとしたら警告がでました

> 警告: A newer version of PnP PowerShell is available: 3.12.1908.1. Consider upgrading.

新しいバージョンがでてるからアップグレード検討してくれよな！ ということのようなのでアップグレードします

## アップグレード手順

1. 管理者で PowerShell を起動
2. `Update-Module -Name <モジュール名>` を実行

例. SharePointPnPPowerShellOnline のアップグレード

```powershell
Update-Module -Name SharePointPnPPowerShellOnline
```


## インストールされたモジュールのバージョン確認方法

Update-Module でアップデートされた時、過去のバージョンも保持しているので、カレントのバージョンと全てのバージョンの確認方法を記載します

### カレントのバージョン確認方法

1. PowerShell を起動(管理者でなくても OK)
2. `(Get-InstalledModule -Name <モジュール名>).Version` を実行

### 全てのバージョン確認方法

1. PowerShell を起動(管理者でなくても OK)
2. `(Get-InstalledModule -Name <モジュール名> -AllVersions).Version` を実行

例. SharePointPnPPowerShellOnline のインストールされているバージョン確認

```powershell
# インストールされているカレントバージョンを確認
(Get-InstalledModule -Name SharePointPnPPowerShellOnline).Version

Major  Minor  Build  Revision
-----  -----  -----  --------
3      12     1908   1       

# インストールされている全てのバージョンを確認
(Get-InstalledModule -Name SharePointPnPPowerShellOnline -AllVersions).Version

Major  Minor  Build  Revision
-----  -----  -----  --------
3      12     1908   1
3      6      1902   2
3      7      1903   0
```
翻訳機は楽しく使おう！

#今さらだけど、Microsoftの翻訳アプリに未来を感じた。

## 用意するもの
・スマホ
・パソコン
・翻訳
・マイク

## 遊び方
スマホで動画を流し、マイクに傾ける、Microsoft翻訳で音を拾う
インタビューなど音声メインの動画が便利かと思う！

## 論より証拠

### スピーチボタンを押したら、動画を流そう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/265588/e1530d00-42fa-13f9-663d-a59c1354b743.png)

### このような結果に！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/265588/06533934-597f-f119-dada-afdbcc7b2fb3.png)

ざっくりだが意外に内容が分かるｗｗｗ

### 今後の活用

「あのバンド好きなんだけど、自分には語学力がないから
インタビューで何言っているか分かんない、でも知りたい！」って時に使ったら面白いんじゃないか？
カジュアルに使えるかもしれない・・・。

実はライブでもスマホを持参すればとか夢が広がってきた。

終わり！
[メモ] node の npm で bundle exec のようなことをしたいとき

つまり `./node_modules/.bin/` 以下のファイルにある `foobarbaz` を実行したいとき

→ `npx`を使うだけ。

今はもうパスを通す必要はありません。

```zsh
$ npx foobarbaz
```

# 参考
- https://stackoverflow.com/a/45164863/4156113
【2019最新版】非推奨になったFusedLocationApiをFusedLocationProviderClientに置き換える【Android】




FusedLocationApiが非推奨になったはいいが
**じゃあどうしたらいいか**
がなかなかバシっと出てこなかったのでここに書いときたい


# ノーカットのサンプルコード
**取得した位置情報が画面に出るまでの丸ごとのサンプルコード**はこちら
[https://pannacotta-ceo.hatenablog.com/entry/2658930](https://pannacotta-ceo.hatenablog.com/entry/2658930)

# FusedLocationApi -> FusedLocationProviderClient

新しいのは **FusedLocationProviderClient** です

**build.gradleはそのままでOK**

**パーミッションの処理もそのままでOK**


# 何をどう変更するのかのざっくり概要

書き方はとりあえず置いておくとして

登場するキーワードが変わるイメージが▼こんな感じです

**LocationClient**
**-> なくてOK(LocationClientとFusedLocationApiが合体してFusedLocationProviderClient、ということなのかも)**


**LocationListener**
**-> onCompleteListener**


**onLocationChanged**
**-> onComplete**


**LocationServices.FusedLocationApi.requestLocationUpdates()**
**-> mFusedLocationClient.getLastLocation().addOnCompleteListener()**



# ソースコードのイメージ
パーミッションの処理ざっくりカットしてるイメージ掴むためだけのコード
実際動かそうとしたらパーミッションの処理やってないと動かないです

```
public class MainActivity extends AppCompatActivity {
    private FusedLocationProviderClient mFusedLocationClient;
    protected Location mLastLocation;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Button locationButton = findViewById(R.id.locationButton);
        locationButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                getLastLocation();
            }
        });
        mFusedLocationClient = LocationServices.getFusedLocationProviderClient(this);
    }

    private void getLastLocation() {
        mFusedLocationClient.getLastLocation()
                .addOnCompleteListener(this, new OnCompleteListener<Location>() {
                    @Override
                    public void onComplete(@NonNull Task<Location> task) {
                        if (task.isSuccessful() && task.getResult() != null) {
                            mLastLocation = task.getResult();
                            Log.d("ろぐ", "lat = " + mLastLocation.getLatitude() + ", lon = " + mLastLocation.getLongitude());
                        } else {
                            Log.w("ろぐ", "getLastLocation:exception", task.getException());
                        }
                    }
                });
    }
}

```

# ノーカットのサンプルコード
**取得した位置情報が画面に出るまでの丸ごとのサンプルコード**はこちら
[https://pannacotta-ceo.hatenablog.com/entry/2658930](https://pannacotta-ceo.hatenablog.com/entry/2658930)

**Google本家のサンプルコード**はこちら
[https://github.com/googlesamples/android-play-location](https://github.com/googlesamples/android-play-location)

GoogleMapで動かすサンプルコード欲しい方いたら作るのでコメントくださーい
github上のレポジトリをローカルPCにcloneする方法

# はじめに
浅すぎる記事だけど、自分が毎度git cloneの書き方を忘れるのでメモ残す。

# やりかた
1. git bashを起動する
2. コード置き場へ移動＆ディレクトリ作成
3. レポジトリのURLを手に入れる
4. git clone実行する

# 手順
1. git bashを起動する
　git bash はgitをローカルPCで使用するためのwindowsアプリ
　　URL　https://gitforwindows.org/
　windowsの検索窓で「git」って入れれば現れるのでそれを選べばOK！
　※インストール手順は割愛

2. コード置き場へ移動＆ディレクトリ作成
プロンプトが現れるので、下記のコマンド実行。
自分はソースコード置き場をprotosにしているのでそこに移動する
ディレクトリの名前は大体githubのレポジトリ名を使うようにしてる

```
cd C:\Users\watya\protos\
mkdir python-machine-learning-book
```

3. レポジトリのURLを手に入れる
githubのレポジトリより[Clone or donwload]をクリックすると
URLが現れるのでそれをコピーする（画面参照）

![キャプチャ2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416263/f8b3d0e5-c99c-4829-ba44-6e0cd33797c1.png)

4. git clone実行する
2. のプロンプト上で書き実行
別にID/PW聞かれるわけではないので超簡単。

```
git clone https://github.com/rasbt/python-machine-learning-book.git
```
実際の画面はコチラ。
![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416263/ae1bd8b2-4625-f558-9c6f-661de2872adf.png)

～おしまい～
fishでgoenv 2.0の環境構築

## 環境

OS：Mac

```shell
fish -v
fish, version 3.0.0
```

```shell
goenv
goenv 2.0.0beta11
```

## 構築手順

### goenvを公式リポからダウンロード

※[brew](https://formulae.brew.sh/formula/goenv)だと1.12.3が最新だったので、[公式リポ](https://github.com/syndbg/goenv)から2.0をダウンロードしました。

```shell
git clone https://github.com/syndbg/goenv.git $HOME/.goenv
```

### 環境変数の設定

公式の設定はbashとzshなので、fishに置き換えて設定します。

```shell:config.fish
set -x GOENV_ROOT $HOME/.goenv
set -x PATH $GOENV_ROOT/bin $PATH
eval (goenv init - | source)
set -x PATH $GOPATH/bin $PATH
```

### 環境設定読み込み

```shell
source ~/.config/fish/config.fish
```

### goのインストール

```shell
# インストールできるバージョンを一覧表示
goenv install -l
# インストールしたいバージョンを指定
goenv install 1.14.0
# 利用するバージョンの指定(goenv localの範囲を除く)
goenv global 1.14.0 
# 反映
goenv rehash
```

### 環境設定再読み込み

```shell
source ~/.config/fish/config.fish
```

```shell
go env
GOPATH="~/go/1.14.0"
GOROOT="~/.goenv/versions/1.14.0"
```

### リポジトリのダウンロード

#### ディレクトリ構成について

goenv 2.0以降ではGoのバージョン毎にリポジトリを管理するのがデフォルトになっていました。
リポジトリは$GOPATH配下に以下のように配置する。

```shell
$GOPATH/1.14.0/src/github.com/ユーザ名/リポジトリ名
```

go envでカレントのバージョンのフォルダにダウンロードできる。

```go
go get github.com/ユーザ名/リポジトリ名
```

## 参考

- [【macユーザ向け】 goenvの導入方法とModuleの使い方](https://blog.bltinc.co.jp/entry/2019/06/27/010812)
- [goenvとdirenvでGo Modules有無両対応な開発環境を作る](https://techblog.ap-com.co.jp/entry/2019/05/30/162542)
- [goenvを1.23系から2系にしたときにGOPATHでハマった話](https://qiita.com/gimKondo/items/add08298e24ae400505e)
Hyper-Vの内部ネットワークでゲストPCのIPアドレスを固定化する方法


# はじめに
どうも！生産技術部のエンジニアです。今回は、Hyper-Vの内部ネットワークでゲストPCのIPアドレスを固定化する方法とポートフォワーディングの方法について紹介します。ファイアウォールのポート解放手順については取り上げませんので、[ここ][link-firewall]を参考に設定ください。

[link-firewall]:https://pc-karuma.net/windows-10-firewall-open-port/

# 背景
ホストOS(Windows10)のHyper-V上にLinuxのウェブサーバを立上げ、ホストPCまたは外部のPCからゲストPCのサイトにアクセスできるか確認していたところ、ホストPCを再起動する度にDHCPによって割り当てられたゲストPCのIPアドレスが変わってしまい、確認に手間取りました。IPアドレスを固定する方法はないか探っていたところ、うまくいった方法がありましたので紹介します。

# 環境
* Windows10 Enterprise
* Hyper-V

# 前提条件
Hyper-Vの導入が実施済みであり、ゲストPCのWebサーバが立ち上がっている事

# 「仮想NIC」と「規定のスイッチ」のIPアドレス確認
Hyper-Vをインストールし、内部ネットワークを設定すると、ホストPC上に仮想NICとネットワークアダプタ（規定のスイッチ）が生成されます。生成された仮想NICとネットワークアダプタにはIPアドレスが割り当てられます。まずはIPアドレスを確認します。確認方法とネットワークの構成は、[「内部ネットワーク」の仮想スイッチ][link-ip]を参考にしました。


[link-ip]:https://uncle-atsushi.com/hyper-v_virtual_switch_configuration

# ネットワークアダプタのIPアドレスを設定
Hyper-Vは、「規定のスイッチ」を起動する度に、スイッチ自体の削除、再生成するイベントが走ります。これによりゲストOSに割り当てられるIPアドレスが毎度変わってしまうようです。「規定のスイッチ」のIPアドレスを固定化する方法を紹介します。

まず、現状の「規定のスイッチ」のIPv４を確認すると以下の様になっていると思います。
![ipv4設定前.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/451049/b9ef4a6d-882f-d448-cee5-b0e1dea28094.png)

`PowerShell`を起動し、vEthenet（規定のスイッチ）の`ifIndex`を確認します。確認した値は、IPアドレスの設定に使用します。

```powershell:
PS > Get-NetAdapter

Name                      InterfaceDescription                    ifIndex Status       MacAddress             LinkSpeed
----                      --------------------                    ------- ------       ----------             ---------
Wi-Fi                     Realtek 8812BU Wireless LAN 802.11ac...      19 Up           XX-XX-XX-XX-XX-XX       400 Mbps
イーサネット              Realtek PCIe GBE Family Controller           11 Disconnected XX-XX-XX-XX-XX-XX          0 bps
vEthernet (既定のスイ...  Hyper-V Virtual Ethernet Adapter              9 Up           XX-XX-XX-XX-XX-XX        10 Gbps
```

既に設定されている規定のスイッチのIPアドレスを削除します。`InterfaceIndex`に先ほど確認した`ifIndex`の値指定します。

```powershell:
PS > Remove-NetIPAddress -InterfaceIndex 9 -IPAddress "172.20.149.129"
```

次に、削除したIPアドレスを設定し直します。設定するIPアドレス、プレフィックス長は各自の環境に合わせて設定する必要がありますが、削除したIPアドレス以外のIPアドレスを設定したところ、Hyper-V上で動作しているCentOSがネットワークに繋がらなくなってしまいましたので、注意が必要です。繋がらなくなった時は、削除したIPに設定し直し、正常にネットワーク接続できる様になりました。

```powershell:
PS > New-NetIPAddress -InterfaceIndex 9 -IPAddress "172.20.149.129" -AddressFamily IPv4 -PrefixLength 28
```

すると、あら不思議。IPアドレスが設定されています。この状態で再起動しても、IPアドレスが設定された状態になりました。

![ipv4設定後.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/451049/51b4d7c7-8b0b-1d7c-068e-3ead7fa559cd.png)

# ポートフォワードの設定
`Powershell`を起動し、ポートフォワードの設定を行います。以下は、「0.0.0.0:80」のパケットを「172.20.149.140」に流す設定です。

```powershell:
netsh interface portproxy add v4tov4 listenport=80 listenaddr=0.0.0.0 connectport=80 connectaddress=172.20.149.140
```
正しく設定できているか確認します。

```powershell:
netsh interface portproxy show all
```
以上で設定完了となります。お疲れ様でした。

# ご参考
* [Windows Doc 「New-NetIPAddress」](https://docs.microsoft.com/en-us/powershell/module/nettcpip/New-NetIPAddress?view=win10-ps)
* [Windows10 - ファイアウォール - 特定のポート番号の通信を許可](https://pc-karuma.net/windows-10-firewall-open-port/)
* [Hyper-Vのネットワーク（接続の種類）について](https://uncle-atsushi.com/hyper-v_virtual_switch_configuration)
AWS AppSyncで一対多の関連を1リクエストで取得する

# 概要

AWS AppSyncはAWS上にGraphQLサーバーを構築することができるマネージドサービスです。
GraphQLの特徴の一つとして、取得するフィールドをクライアント側から指定することができる点があります。

# GraphQLとネストされたフィールド

GraphQLスキーマでは、ある型のフィールドに他の型を指定することもできます。

```text:GraphQLスキーマ
type User {
  name: String!
  posts: [Post]
}

type Post {
  id: ID!
  content: String!
  user: User!
}
```

このスキーマに適切にリゾルバーをアタッチすることで、

- Postとそれを作成したユーザーを取得
- ユーザーとそのユーザーが作成したPostの配列を取得

といったデータを1リクエストで要求できるようになります。

# 疑問点

上の例のように`User`と`Post`というモデルがあり、それを`UserTable`と`PostTable`というテーブルに別々に格納していたとします。
`PostTable`には`userId`という属性があり、これがテーブル間を結合する外部キーになります。

さて、ネストされたフィールドを含めてデータを取得するGraphQLクエリは以下のようになります。

```graphql:GraphQLクエリ
query getPost {
  getPost(id: "99999") {
    id
    content
    user {
      name
    }
  }
}
```

`Post`はクエリの引数として与えられた`id = 99999`で特定することができます。
しかし、`Post`を作成した`User`はどのように特定すれば良いのでしょうか？
GraphQLスキーマには、あるフィールドを外部キーとしてマークする仕様はありません。

# フィールドにリゾルバーをアタッチする

`Post.user`が`User`型だから、`userId`という名前で自動的にJOINしてくれる、ということはありません。
目的の動作を実現するには、**`Post.user`に対してリゾルバーをアタッチ**します。

<img alt="AppSyncのフィールドにリゾルバーをアタッチ" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142803/0b7d63cc-cadb-c62a-cec0-42632a95cca0.png">

リゾルバーのデータソースは、今回であれば`UserTable`からデータを取得したいので`UserTable`に対応するデータソースを指定します。
マッピングテンプレートはシンプルに一件アイテムを取得する命令を書けばOKです。

今回はデータソースにAmazon DynamoDBを利用しているので、以下のようになります。

```text:リクエストマッピングテンプレート
{
  "version": "2017-02-28",
  "operation": "GetItem",
  "key": {
    "id": $util.dynamodb.toDynamoDBJson($ctx.source.userId),
  }
}
```

```text:レスポンスマッピングテンプレート
$util.toJson($ctx.result)
```

ポイントはリクエストマッピングテンプレート中の`$ctx.source.userId`の部分です。
この`$ctx.source`に、`getPost`クエリの実行結果が格納されているので、それを使って`UserTable`にデータを取りに行きます。

# まとめ

モバイルアプリ / SPAを開発していると、一画面で必要となる情報が複数モデルにまたがってリクエスト数が増えたり、それらをまとめた使い回しがききにくいエンドポイントを作ったりという課題が発生するかと思います。

GraphQLを使うことで、複数エンティティにまたがるデータの取得も非常にシンプルに実現することができます。

今までRESTを使っていて、GraphQLを使い始めるに当たって戸惑ったことがいくつかあるので、それらを少しずつまとめていけたらと思います。
【js】onclickとaddEventListenerの違い

追加でイベントを追加出来るか・出来ないかの違い

##追加でイベントが
- **onclick属性** → 出来ない✖️
- **onclickプロパティ** → 出来ない✖️
- **addEventListener** → 出来る◯

console.log「ほげほげ1」の後に「ほげほげ2」を追加してみた。


##onclick属性
HTMLのタグにonclickを設定する方法
`<input type="button" onclick="hoge()">`

```html:onclick属性
<input type="button" value="ぼたん" onclick="hoge()">

<script>
function hoge() {
  console.log("ほげほげ1");
}
function hoge() {
  console.log("ほげほげ2");
}
//=>ほげほげ2
</script>
```
「ほげほげ1」が「ほげほげ2」に上書きされてしまって表示されませんでした。

##onclickプロパティ
jsにonclickを書く
`myfunc.onclick = function() {`

```html:onclickプロパティ
<input type="button" id="myfunc" value="ぼたん">

<script>
const myfunc = document.getElementById("myfunc");
myfunc.onclick = function() {
  console.log("ほげほげ1");
}
myfunc.onclick = function() {
  console.log("ほげほげ2");
}
//=>ほげほげ2
</script>
```
「ほげほげ1」が「ほげほげ2」に上書きされてしまって表示されませんでした。

##addEventListener
jsにaddEventListenerを書く
`myfunc.addEventListener("click", function() {`

```html:addEventListener
<input type="button" id="myfunc" value="ぼたん">

<script>
const myfunc = document.getElementById("myfunc");
myfunc.addEventListener("click", function() {
  console.log("ほげほげ1");
});
myfunc.addEventListener("click", function() {
  console.log("ほげほげ２");
});
//=>ほげほげ1
//=>ほげほげ2
</script>
```
「ほげほげ1」が「ほげほげ2」両方表示されました！

個人的には、onclick属性で`onclick="hoge1();hoge2()"`すれば複数できるし、1つのfunctionの中に関数を追加すればいいのでは？と疑問に思ったけど、確かにaddEventListener使った方がイベント上書きしないし、安心だなと思った。
Rubyで何も返さない関数は何が返るのか

ふと気になったので試してみた。

```ruby
def piyo
  nil
end

piyo.class # NilClass

def hoge
end

hoge.class # NilClass

def fuga
  if nil
    "fuga"
  end
end

fuga.class # NilClass
```

# 結論
なるほど、nilが返るらしい！！
AWSとGCPのネットワーク構成の違い

##はじめに

AWSとGCPのネットワーク構成の違いについて書きます。

GCPはレガシーネットワークとVPCネットワークの2種類が存在しますが、ここではVPCネットワークについて記載します。
レガシーネットワークは、新しい GCP 機能の多くはレガシー ネットワークでサポートされず2020 年 2 月 1 日に停止される予定であるため、使用することは推奨されていません。
https://cloud.google.com/vpc/docs/legacy?hl=ja

##用語の整理
AWSとGCPのネットワーク構成は、類似する点が多いですが、一部考え方が異なる点があります。
GCPの資料としては、以下にまとまってあります。
https://cloud.google.com/docs/compare/aws/networking

以下の表の通り、VPCとサブネットの考えが、AWSは各リージョンやAZに紐づく形になりますが、GCPは、VPCネットワークがGlobalなリソースとなり、サブネットが複数のゾーンをまたがって構成可能となります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78184/a4f04d9f-7572-8668-d7e2-1fd078cd4583.png)

AWSのシンプルなネットワーク構成のイメージは以下になります。Clientからのアクセスは、IGW→ELB→EC2インスタンスという流れでアクセスされます。
AWSは、VPCネットワークをリージョンごとに作成し、サブネットをAZごとに作成します。IGWがアタッチされたサブネットをPublicサブネットと呼びます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78184/703cc15e-652e-e914-e689-0a2c64c0a2ca.png)

同じような構成をGCPのネットワークに当てはめると以下になります。ClientからLB→インスタンスという流れでアクセスします。
GCPは、VPCネットワークがグローバルなりソースで、サブネットに複数のゾーンが含まれます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78184/affc3cfd-f3ad-4cbf-19e7-28fe2b70fdd3.png)

VPCネットワークは、グローバルなリソースなので同じネットワークとして日本と北米のインスタンスを同じLB配下に配置できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78184/23185931-06c3-4a04-375e-a4493fd591e2.png)

AWSで上記構成を取るには、AWS Global Acceleratorを使用すれば可能となります。
https://aws.amazon.com/jp/blogs/aws/new-aws-global-accelerator-for-availability-and-performance/

##投稿内容は私個人の意見であり、所属企業・部門見解を代表するものではありません。
要素の幅によって文字列を省略する文字数を変える


高さ（行数）は決まっているけれども幅はリキッドで都度変わる。要素の中の文字数を固定にすると場合によっては余白が空きすぎてしまう。
そんな時に役立ちそうな小技です。

###HTML
```html
<h4><span class="post-title" data-title="要素の幅によって文字列を省略する文字数を変える">要素の幅によって文字列を省略する文字数を変える</span></h4>
```
省略させたい文字列をclass="post-title"で囲みます。属性data-titleの中身にも省略させたい文字列を入れます。
class="post-title"はCSSでblock要素にしてください。


###Javascript
```Javascript
[...document.querySelectorAll('.post-title')].forEach((el, index) => {
    let originalTitle = el.getAttribute('data-title'); //元の文字列を取得
    let width = el.getBoundingClientRect().width; //要素の幅を取得
    let style = window.getComputedStyle(el, null).getPropertyValue('font-size'); //フォントサイズを取得
    let fontSize = parseFloat(style); //フォントサイズの単位を取る
    let lines = 3; //行数
    let oneLineCharacters = Math.floor(width / fontSize); //1行に入る文字数を計算
    let numberOfCharacters = oneLineCharacters * lines - 2; //要素に入る文字数を計算。念の為２文字減らす
    let omitTitle = originalTitle.substring(0,numberOfCharacters); //文字を削る
    if(originalTitle.length > numberOfCharacters) omitTitle += '…'; //削っていたら「…」を追加
    el.innerText = omitTitle; //要素に入れる
});
```
これを関数に入れてloadとresizeの時に発動させます。
letter-spacingを設定されてる時は適宜計算に入れてください。
等幅フォントではないと要素にピッタリ収まる訳ではないですが、はみ出ない程度に文字を省略できるはずです。

###参考サイト
https://javascript.programmer-reference.com/js-width-height/
【随時更新】Ruby自体のコードリーディングについて

Cで書かれたRubyのコードを読んでRubyをより理解していきましょう

# 日本語
## Cookpad Ruby Hack Challenge
[Cookpad Ruby Hack Challenge](https://techlife.cookpad.com/entry/2017/06/30/102351)

# 英語
## 随時追加していきます