OmniAICreator/Qiita-1.07M huggingface dataset:
VSCodeの入力が捗るショートカットキー  for  Mac

## 概要
最近Macに変えましたが、テキストエディタでの入力作業の効率アップのため、ショートカットキーまとめ。
いつも「あの機能のショートカットキーなんだったかな？」となりがちなので( ´Д`)y━･~~
備忘録として新たに追加していきますので、並びはバラバラです。項目が増えて見にくくなったら整理します。

## キー説明

#####  ⌘：command   
#####  ⇧：shift
#####  ⌥：option
#####  ⌃：control
#####  ⇅:上下キー
#####  ↵:エンターキー
##### →|:タブキー
## ショートカットキー一覧


|          やること        　　　 | キー操作&emsp;&emsp;&emsp;　 |    備考   　   |
|:-----------------------------|---------:|:----------------:|
| カーソルキーの移動(右)    　      | ⌃ + F    |               |
| カーソルキーの移動(左)    　      | ⌃ + B    |               |
| カーソルキーの移動(上)    　      | ⌃ + P    |               |
| カーソルキーの移動(下)    　      | ⌃ + N    |               |
| カーソル行の先頭に移動    　      | ⌃ + A    |               |
| カーソル行の行末に移動    　      | ⌃ + E    |                   |
| カーソル行の削除　　　    　      | ⌃ + ⇧ + K|ドラッグしての選択は不要 |
| カーソル右側の文字を削除          | ⌃ + D    |                   |
| カーソル左側の文字を削除          | ⌃ + H    |                   |
| カーソル右側の文字から行末までを削除 | ⌃ + H    |                   |
| カーソル行のコピー　　            | ⌃ + C     | ドラッグしての選択は不要 |
| カーソル行のコピー    　          | ⌃ + L    |                   |
| カーソル行の移動　　　    　      | ⌥ + ⇅    |                   |
| カーソル行を下に複製             | ⇧ + ⌥ + ⇅ |                   |
| カーソル行の下に空行を追加        | ⌘ + ↵     |                   |
| カーソル行の上に空行を追加        | ⌘ + ⇧ + ↵ |                   |
| マルチカーソル    　            | ⌥ + ↵(他行)|                   |
| 同じ単語の選択　　              | ⌘ + D     | 単語をドラッグで選択して |
| 同じ単語を全て選択              | ⌘ + ⇧ + L |                   |
| 単語の検索                    | ⌘ + F     |⌘ + G(次),⌘ + ⇧ + G(戻)|
| 単語の置換                    | ⌘ + ⌥ + F |                   |
| ファイルの検索　　              | ⌘ + P     | 　　　　　　　　　　  |
| コマンドパレットの表示　　         | ⌘ + ⇧ + P | 単語をドラッグで選択して |
| サイドバーの表示/非表示    　    | ⌘ + B     |                   |
| インデント調整 字上げ（字下げ）     | →｜ (+ ⇧)  |                   |
| ターミナルの起動(on/off)       | ⌃ + ⇧ + @  |                   |
Railsチュートリアルにあたってのmacの環境構築

Railsチュートリアルをするにあたっての環境構築もろもろ

# 環境
- macOS Mojave 10.14.6
- fish shell

# 方針
Railsチュートリアルでは、ローカルで環境を建てるのは難しいとして、AWS Cloud9を使っているようす。
ただ、せっかくなのでmacのローカルでの環境作りも経験しておきたい。

バージョンについては、後々管理者権限がなくて引っかかったりしたので、 `rbenv` にて管理することにした。

## rbenv

```shell
$ brew install rbenv
$ rbenv --version # バージョンが表示されればok
```

上記に書いたとおり、権限の問題で表示ができなくなったので、rbenv関係のディレクトリを `chown` でユーザーのものにしてみた。
この解決法がまずい場合、教えていただけますと幸いです。

```shell
$ sudo chown -R ユーザ名 ~/.rbenv/
```

## ruby
rbenvを使って、Rubyのバージョンを指定して入れる。
[Railsチュートリアル日本語版](https://railstutorial.jp/)は現時点(2019/08)でRails5.1(第4版)で、使われているRubyが2.6.1だった。
一応、マイナーバージョンは2.6.3がlatestだが、チュートリアルの2.6.1に合わせておく。

```shell
$ rbenv install 2.6.1
$ rbenv global 2.6.1
$ ruby -v # ruby 2.6.1p33 ... とか表示されればok
```

おわり。

# 展望
せっかくやるならDockerで環境をつくりたいので、そっちも今後検討。
ゼロからはじめるmatplotlib〜3.複数グラフの表示〜

## 準備
ハリーになりきって、「ルーモス、光よ」と唱える。

```py
import matplotlib.pyplot as plt
import numpy as np
%matplotlib inline
```
## 複数のグラフの表示

今回は複数のグラフを一度に一つの画像に表示する方法について書きます。

複数グラフを書く時には、`plt.subplot()`というメソッドを使うことで実現できます。
ざっくり表現するなら`plt.subplot()`は__グラフ用紙を準備するメソッド__です。

例えば、Jupyter上で以下を実行すると枠だけが表示された2つのグラフが出力されます。


```py
plt.subplot(2,1,1)
plt.subplot(2,1,2);
```
<出力結果>
![subplot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280728/d24b2ce8-33fa-5fc5-7ffa-c1aec912ba7c.png)

何も書かれておらず、ただの枠しかないので実質グラフ用紙が2つ並べられた状態ですね（笑）。

`plt.subplot`の引数内の数字の意味は

__plt.subplot(何行用意するか,何列用意するか,何番目のグラフか)__

という意味です。

したがってグラフ用紙を2行3列に並べたものを用意したいときは、次のように書くと

```py
plt.subplot(2,3,1) #左上
plt.subplot(2,3,2) #中上
plt.subplot(2,3,3) #右上
plt.subplot(2,3,4) #左下
plt.subplot(2,3,5) #中下
plt.subplot(2,3,6); #右下
```
![subplot2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280728/7a078f6e-febd-4dd2-cd41-eaadb0803020.png)

2×3のグラフ用紙が用意されます。
また全てのグラフ用紙には左上から右下へ、１,2,3...と順番が決められているのでそれを指定することでどのグラフ用紙に描画するかを決めています。

## グラフ用紙にグラフを書いていく

__1×2に並べたグラフ用紙にsinx,cosxのグラフを書く__

```py
# x軸となる0から2πまでの数字を0.01刻みで生成
x = np.arange(0,2*np.pi,0.01)

# 1個目のグラフ(左)
plt.subplot(1,2,1)
plt.plot(x, np.sin(x))

# 2個目のグラフ(右)
plt.subplot(1,2,2)
plt.plot(x, np.cos(x));
```
<出力結果>
![subplot3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280728/94f2ba2f-2da6-e00d-1bcb-d215e98f6d93.png)


全体の画像のバランスは`plt.tight_layout()`を追加して簡単に整えることができます。
`plt.figure(figsize=(?,?))`でサイズを変えてもOKです。(下はサイズを変化させて整えています。)

```py
x = np.arange(0,2*np.pi,0.01)

# 画面全体の調節
plt.figure(figsize=(8,4))

# 1個目のグラフ
plt.subplot(1,2,1)
plt.plot(x, np.sin(x))

# 2個目のグラフ
plt.subplot(1,2,2)
plt.plot(x, np.cos(x));
```
<出力結果>
![subplot4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280728/10e9a196-0f4b-4b30-e4c7-ba5bb0107347.png)





もっと詳細にグラフの間を調節したいときは、`plt.subplots_adjust()`を使います。
[参考サイト:matplotlib subplot。グラフ間の間隔を調整－python](http://ailaby.com/subplots_adjust/)

# ここまでの知識を使って描画してみる。
2×3に並べたグラフ用紙の一つ一つに、三角関数や媒介変数で表現される曲線を描画していく。
参考サイト:https://mathtrain.jp/sevencurve

```py

theta = np.arange(0,2*np.pi,0.01)

# 全体のサイズ調節
plt.figure(figsize=(12,9))

# 右上
plt.subplot(2, 3, 1)
plt.plot(theta, np.sin(theta))
plt.title("sin")
plt.grid()

# 中上
plt.subplot(2, 3, 2)
plt.plot(theta, np.cos(theta))
plt.title("cos")
plt.grid()

# 右上
plt.subplot(2, 3, 3)
plt.plot(theta-np.sin(theta), 1-np.cos(theta))
plt.title("cycloid")
plt.grid()

# 左下
plt.subplot(2, 3, 4)
plt.plot(np.power(np.cos(theta),3), np.power(np.sin(theta),3))
plt.title("asteroid")
plt.grid()

# 中下
plt.subplot(2, 3, 5)
plt.plot((1+np.cos(theta))*np.cos(theta), (1+np.cos(theta))*np.sin(theta))
plt.title("cardioid")
plt.grid()

# 右下
plt.subplot(2, 3, 6)
theta2 = np.arange(0,10*np.pi,0.01) # インボリュート曲線用
plt.plot(np.cos(theta2)+theta2*np.sin(theta2), np.sin(theta2)-theta2*np.cos(theta2))
plt.title("involute of circle")
plt.grid();
```
<出力結果>
![subplot5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280728/6dc990ca-7d6d-8a7f-dcbb-346e44e6f966.png)

# まとめ

plt.subplotで今回は複数の関数を書くことができるようになりました。
もうこの辺りまで来るとオブジェクト指向の書き方で細かい調整などがしたくなると思います。
オブジェクト指向型での書き方もmatplotlibの公式documentなどで勉強していってください。
フリマアプリ、ER図の作成

#　はじめに
自分のメモ用に書いています
チーム開発でフリマアプリのコピーサイトを作成することになり、私はDB設計を担当することになりました。
DB作成の前にER図を書くことに・・・あぁ不安だ〜！



# 1. 機能の洗い出し
まずは作成するアプリケーションを実際にいじってみることが大切です。
新規登録を行ったら何を入力するのか、ログインするときに何を入力するのか
これとこれってリレーションを結んだらいけるんじゃないの？....など
とにかく触って紙に書き出してみましょう。

# 2.テーブルごとにまとめてみる
まずはUserから書き出してみることにしました。

ログインする際に必要だったものは
nickname, email, passwordの3つでした。
なので表にすると以下のようになります。

Usersテーブル

|nickname|email|password|
|:--|--:|:-:|

続いて商品に関して必要な事項をあげてみましょう
商品に関して必要事項を上げるときりがありませんが
ポイントとして、「必要最低限の機能だけ書いてみる」ことにしました
ブランド名、サイズ、カテゴリーなどは、それぞれでテーブルを作成することにしました
後回しにすることでそのテーブルに必要のものだけを書き出すことができます。

今回私が必要だと思ったものは以下のものです

商品名
価格
商品説明
商品の状態
送料
送り元
出品してから何日たったか
購入方法

という風に洗い出していくといいかもしれないです。

# テーブルの関係性とカラム追加

テーブルが一通りできたら関係性を作っていきましょう
例えば、上記で出したUserとitemの関係は

・１人ユーザーは複数の商品を持てる
(has_manyの関係)
・1つの商品は１人のユーザーが売買をする
（belongs_toの関係）

という風にまとめれるので、テーブルの関係ができましたね。

なのでitemsテーブルに「user_id」のカラムを追加することができます。

このようにテーブル関係を考えながら追加するカラムを決めていくという風にやるといいですね。

# 最後に

自分が見てわかるようにざっくりと書いてみました
ご意見ご感想ありましたらお願いします。
Laravel $fillable とか validation ruleとかいちいちフィールド名書き出すの面倒じゃね？ 

そんなときは...

```SQL
select 
	concat(
		'\'', 
		column_name, 
		'\','
	)
from 
	information_schema.columns 
where 
	table_schema = 'database'
and 	
	table_name = 'table'
```

SequelPro で実行したら、結果をコピペ。不要なところを削除して利用すれば楽チン。

![スクリーンショット 2019-08-25 15.44.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/46841/fa155de7-5a15-b758-c1db-a25ac1f9850c.png)
HerokuのSlug Sizeを減らす方法

# 概要
HerokuのSlug Size長く使ってると増えてきますよね。。
そこでGitの掃除をして、Slug Sizeを減らす方法を調べました。
私はこの方法で500MB→200MBに削減成功しました。

**注意**
コミットされた大きなファイルのコミット履歴を消す操作をするため、コミット履歴が大幅に書き換わります。なのでチーム開発をしている場合、作業した人以外は全員`git clone`し直してください。

# 手順
## Gitの掃除

- 現状のRepo全体をフォルダごとコピーしてバックアップする
- まず全てのブランチをmasterにマージする
- このコマンドで重いファイルを確認

```
git rev-list --objects --all \
| git cat-file --batch-check='%(objecttype) %(objectname) %(objectsize) %(rest)' \
| sed -n 's/^blob //p' \
| awk '$2 >= 2^20' \
| sort --numeric-sort --key=2 \
| cut -c 1-12,41- \
| $(command -v gnumfmt || echo gnumfmt) --field=2 --to=iec-i --suffix=B --padding=7 --round=nearest
```

- `du -sh .git/objects`で現状の容量を確認
- `git filter-branch -f --index-filter "git rm -rf --cached --ignore-unmatch path/to/heavy/file you/can/set/multiple/files" --prune-empty -- --all`
- そのあとこれらを実行

```
$ rm -rf .git/refs/original/
$ git reflog expire --expire=now --all
$ git gc --aggressive --prune=now
```

- `du -sh .git/objects`で容量が減っていることを確認
- その後、stagingや各種必要なブランチを作成し、GitHubにforce pushする
- 共同作業者がいる場合、cloneし直してもらう

## Herokuの容量削減
- `heroku plugins:install heroku-repo`
- `heroku repo:reset -a appname`でHerokuのrepoをリセットする
- `heroku repo:gc -a appname`と`heroku repo:purge_cache -a appname`もする（参考: https://github.com/heroku/heroku-repo）
- GitHub deploy integrationなどを設定している場合は一度解除し、ターミナルから直接force pushする
- ここでHerokuのSettingsのSlug Sizeを確認する。減っていなければreset, gc, purge_cacheをもう一度する
- その後GitHub deploy integrationを再設定

# 参考
- https://dskd.jp/archives/46.html
- https://stackoverflow.com/questions/10622179/how-to-find-identify-large-commits-in-git-history
- https://github.com/heroku/heroku-repo
Firebaseでプロジェクトが作れない!!

<img width="477" alt="スクリーンショット 2019-08-24 12.54.20.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/98758/6adda404-487c-c0d9-ef08-ec8e40550d4c.png">

Firebaseでプロジェクトを作成しようとしたらこのメッセージが出てきた。

```
The project cannot be created because you have exceeded your allotted project quota.
```

その時点でFirebaseのプロジェクトは8こ保有していたが。
無料プランは8プロジェクトまでだったかな？

と思ったので、調べたら結構ショックな結果だった。

https://firebase.google.com/docs/projects/learn-more?hl=ja

```
アカウントあたりのプロジェクト数
無料の Spark プラン - プロジェクト割り当ての上限によって少ない数しか保有できません（通常は約 5～10）。
```

5~10って何？何を持って8で止められるのかさっぱりわからん。使ってる容量？
とはいえ、有料プランに変えようという気持ちはないので、もう使ってないプロジェクトを
https://console.developers.google.com
のプロジェクト管理で消して4つにしたけどまだ作成は失敗する。

そこで、もう一度規約に戻ると

```
プロジェクトが完全に削除されるまで 30 日かかります。完全に削除されるまでは割り当てにカウントされます。
```

とうわけで、30日の待ちが発生することがわかりました。
いらないものは削除して、上限に達していたらタイトルが違っても中身を消して再利用し続けるのがベストかもしれないなと思いました。
初めての投稿

#初めての投稿
##中の人は2人です。
###はじめまして、プログラミングに興味がある学生です。中の人は２人います。片方は物質工学部にて勉強しており、趣味でプログラミングの学習をしています。もう片方は情報経営学部にて勉強しております。お互いプログラミングは趣味程度ですが自分たちの取り組みなどを発信していければと思います。また、Qiitaを通じていろいろな人と繋がれればと思います。
【Java 】ターミナルで文字を入力して判断

```ruby:app.java
import java.io.*;
/**
 * app
 */
public class app {
  public static void main(String[] args)throws IOException
  {
    // System.in は InputStream のインスタンス
    // 文字列ストリームを作る new InputStreamReader();

    // バッファする new BufferedReader();
    // テキスト行を読み込む readLine()
    // 比較する equals()
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

    String res1 = "namari";
    String res2 = "25";

    System.out.println("あなたの名前と年齢を入力してください。");
    System.out.println("名前は？");
    String name = br.readLine();

    System.out.println("年齢は？");
    String old = br.readLine();

    if (name.equals(res1) && old.equals(res2)) {
      System.out.println("OK");
    } else {
      System.out.println("NG");
    }

  }
}
```

```ruby:ターミナル
$ javac app.java
$ java app
あなたの名前と年齢を入力してください。
名前は？
namari
年齢は？
25
OK
```
Gitリポジトリの状態を保存しておき、あとで再利用する

# コードを再利用したい

わたしは、よくpyramidというpythonのフレームワークを使います。
フレームワークですがいらないところや、自分好みのカスタマイズを毎回リポジトリに対して行っていました。
思ったのですが、これ業務コード書き始める前まで取っておけばよくね。
と、思ったのでリポジトリをコピーする方法をまとめておきます

## リポジトリを保存する

いい感じのところまでフレームワークの調整をします。
自分好みのところまで。

今回は、mapというリポジトリを、pyramid_initialという名前で保存しておきます。
pyramid_initialというリポジトリを作成しておきます

```
git clone --bare https://github.com/noracorn/map.git
cd map.git/
git push --mirror https://github.com/noracorn/pyramid_initial.git
cd ..
rm -rf map.git
```

## 保存先のリポジトリをクローンして使う
リネームの処理

```
git clone https://github.com/noracorn/pyramid_initial.git
cd pyramid_initial
git grep -l map | xargs gsed -i "s#map#pyramid_initial#g"
```

pyramid特有の処理

```
mv map pyramid_initial
mv map.egg-info
pip install -e .
```
チーム開発初心者のためのGitHub共有方法

※環境構築(Rails/MySQL使用)については以下にまとめました。
[Git clone から 環境構築 して プロジェクトに参加するまでの道のり（全部盛り）](https://qiita.com/key_it6/items/925a29390cd9ffdaa6aa)

---

はじめてのチーム開発。
GitHubを共有したい！けど、早速どうしたら良いかわからない、という方へはじめの一歩をまとめます。

今回は、代表者がアプリケーションの雛形を自分のGitHubのリモートリポジトリに置いていることを前提とします。
複数人で作業したい場合は、代表者(Owner)が共同で作業をするメンバー（Collaborator）を招待する、という作業が必要です。
以下、工程を分けてみていきましょう。

※こちらの記事投稿後の仕様変更について、下記の記事で説明していただいていますので、あわせてご確認ください。
[Githubのリポジトリを共有する方法（collaboratorではなくManage accessへ変更されています。）](https://qiita.com/nakapon9517/items/fcd2d7a0103869cd43b1)

# Owner側
## 招待する
1) GitHubで共有したいアプリケーションのページ［github.com/アカウント名/ファイル名］の« Settings > Collaborators »にアクセスする。

2) `Search by username, full name or email address`以下に招待したいユーザーのアカウント名またはメールアドレスを入力し、`Add collaborator`を押す。

⇒ 招待した人宛に自動的にメールが届く。
　※メールからうまく進めないケースもありましたが、招待したい人にURLを共有してみたらうまくいったので試してみてください。
![697d05f85e0fa568d7030fa34f5ca723.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/410392/4ee4a364-2638-aca6-ba55-22527993b5c1.png)
# Collaborator側
## メールを確認 → 参加する
メールの`View Invitation`よりアクセスする。
## ローカルリポジトリと同期する
1) GitHubデスクトップから« Add > Clone Repository »を選択する。
![1261eeb4fe092f7ebb9605ddeae8420f.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/410392/055a1999-7d46-5866-7a83-8eecb4be2467.png)
2) Clone a Repositoryから該当するアドレスとダウンロード先を指定して`Clone`を押す。
![ed09d6ae25a19e971b749fdb64e93695.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/410392/451be6e8-8a03-8f0f-7c75-96e64cdc968d.png)
## さいごに
以上、最低限の情報ではありますが上記の手順で進めることができました。
私のように、全員が初心者、から出発するケースは稀かもしれませんが、今後チーム開発デビューされる方に少しでもお役に立てればと思い、記事としてアップいたしました。
JavaScriptでBox-Muller法による正規分布からのサンプリング

# 1. 背景
標準正規分布に従う確率変数を生成する方法として[Box-Muller法（ボックス＝ミュラー法）](https://ja.wikipedia.org/wiki/%E3%83%9C%E3%83%83%E3%82%AF%E3%82%B9%EF%BC%9D%E3%83%9F%E3%83%A5%E3%83%A9%E3%83%BC%E6%B3%95)が知られている。
Box-Muller法を用いると、一様分布に従う確率変数を変換することで正規分布に従う擬似乱数を発生させることができる。一様分布に従う乱数は殆どのプログラミング言語で提供されている（JavaScriptなら`Math.random()`）ため、Box-Muller法と組み合わせれば正規分布からのサンプリングが可能になる。

# 2. 数式
$U_1, U_2$が区間$(0, 1)$における一様分布に従う互いに独立な確率変数のとき、以下の式によって定義される$Z_0, Z_1$は、標準正規分布$N(0, 1)$に従う互いに独立な確率変数となる。

```math
\left\{
    \begin{array}{l}
     Z_0 = R cos(\Theta) = \sqrt{-2lnU_1} cos (2 \pi U_2) \\
     Z_1 = R sin(\Theta) = \sqrt{-2lnU_1} sin (2 \pi U_2)
    \end{array}
  \right.
```

# 3. 実装
標準で利用できる`Math.random()`が一様分布に従う乱数であることを利用する。

```javascript
// Generate n samples from standard normal distribution
function boxMuller(n) {
  const samples = [];
  Array(Math.ceil(n / 2)).fill().forEach(_ => {
    const R = Math.sqrt(-2 * Math.log(Math.random()));
    const theta = 2 * Math.PI * Math.random();
    samples.push(R * Math.cos(theta)); // z1
    samples.push(R * Math.sin(theta)); // z2
  });
  // if n is odd, drop the last element
  return samples.slice(0, n);
}
```

例えば`boxMuller(10)`を呼ぶと、標準正規分布からのサンプルが10個収められた`Array`が返ってくる。

# 4. デモ
実装は[Observableというサイトのノートブック: Box-Muller transform](https://observablehq.com/@sw1227/box-muller-transform)に公開しているため、ブラウザ上で弄ることが可能。

上記関数によって生成された10000個のサンプルについて、

- ヒストグラム
- 正規Q-Qプロット

を描画したものを以下に示す。

**ヒストグラム**
![スクリーンショット 2019-08-25 15.11.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58850/c47ad580-0189-0cea-279f-0110e8e3509d.png)

**正規Q-Qプロット**
ほぼ直線上にあることが分かる。
![スクリーンショット 2019-08-25 15.11.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58850/866a008c-98b0-c4b0-7b2a-ad8ca7d63bae.png)
#rspec で let! (びっくり) を使わず、 let + before で 事前データを忘れずに生成する

Do not use let! (surprise) in #rspec, don't forget to create pre-data with let + before


before で変数を評価して呼び出すだけ。

これでデータを必ず事前に生成しつつ、 context などでデータを使い分けることができる。

```rb
let(:user) { create :user }

before do
  user
end

context 'case 1' do
  it { is_expected.to true }
end

context 'case 2' do
  it { is_expected.to true }
end

context 'case 3' do
  let(:user) { create :other_user }

  it { is_expected.to true }
end

```


# Original by Github issue

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








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
MAMP起動時のパスワード入力を省略しよう

# MAMP起動時のパスワード入力を省略しよう

MAMPを使用する時にパスワードを毎回入力しているのが手間だったので省略する方法はないかと調べ、行おうとした結果うまくアプリケーションが動かなかったため、対処法と省略する方法についてまとめました。

## パスワードを省略する方法

MAMP No Passwordというアプリとキーチェーンアクセスを利用します。
こちらのWebサイト<http://www.46palermo.com/blog/run-mamp-without-password-easy-way/>の手順に従って作業してください。

> Here is how to use it: 1. Open the Keychain Access app and click ‘+’ to add a new item. Call the item ‘MAMP’ and enter the account name and password that you use to log in to your Mac.
2.[Download and launch the MAMP No Password app](http://www.46palermo.com/wp-content/uploads/MAMP-No-Password-1.1.dmg)
Enjoy!

日本語でもう少し詳細に説明しておくと

1. キーチェーンアクセス （場所 : /Applications/Utilities/Keychain Access.app )を起動して+ボタン(下の方にありました)をクリックし、キーチェーン項目名にMAMPを入力し、アカウント名とパスワードはMacへログインするときのものを入力する。
1. [MAMP No Password app](http://www.46palermo.com/wp-content/uploads/MAMP-No-Password-1.1.dmg)をダウンロードして起動する。起動時に「securityは、キーチェーン内の"MAMP"に保存されている機密情報を使用しようとしています。許可するにはキーチェーン"ログイン"のパスワードを入力してください。」と聞かれるので、パスワードを入力して、「常に許可」をクリックする。

これで次回からMAMP起動時にパスワードを入力する必要がありません。私の場合はMAMP No Passwordアプリに、ログイン時に開くオプションがつけられていたので、MAMP No Passwordアプリを起動する必要すら無くなり楽になりました。

このように便利な一方で、当初はアプリケーションが起動されず悩んでいたのでその対処法も下記に記載します。上記で無事動いた方は読まなくて大丈夫です。

## MAMP No Passwordが起動されない？

正確には、MAMP No Passwordが起動しているはずなのにMAMPが起動されている気配が無い… そんな状態でした。閉じようとしても閉じれず、強制終了しか出来ない状態のため非常に悶々としました…

原因を結論から言うと、キーチェーンアクセスに入力していたアカウント名のところにフルネームを入力していたからでした。

詳しく説明すると、Macのユーザ情報には

- アカウント名
- フルネーム

の設定があり私の場合だと、アカウント名がYumihiki、フルネームが弓引きのようになっており、MacへのログインやMAMP起動時のユーザ名ではいつもフルネームの弓引きを使っていたためにキーチェーンアクセス でもアカウント名で弓引きと入力していた結果、エラーが起こって上手く起動できなかったみたいです。
(逆になぜログイン時にはフルネームでも大丈夫なのでしょうか… デフォルトで入力された状態でいつもフルネームが表示されていますが…)

そのため、キーチェーンアクセス に正式なアカウント名を入力してやれば起動できるはずです。
確認するためには

1. Appleメニュー > システム環境設定 > ユーザとグループ
1. 鍵をクリックしてパスワードを入力
1. トラックパッドを二本指で深く押して詳細オプションを選択

で確認できます。ここまでしなくても、Finderなどで家マークにて表示されているものがアカウント名だったりしますが一応正式そうな手順を記載しました。

さぁ、これで起動できたでしょうか！？起動できたらよかったです！良いMAMP No Passwordライフを！！

### おまけ・エラーの見つけ方

もし上記の見つけ方でも出来なかった方、申し訳ありません。エラーの見つけ方を記載するので、ぜひ参考にして手がかりにしてみてください。

1. MAMP No Password.app を置いてあるディレクトリへ移動する
1. トラックパッドを二本指で深く押してパッケージの内容を表示　を選択
1. Contents > MacOS > MAMP No Password を起動
1. ターミナルが表示されるのでエラーメッセージを確認

私のアカウント名を間違えていたときのエラーメッセージは

> Last login: Sun Aug 25 11:59:31 on ttys001
MyMBP:~ yumihiki$ /Applications/MAMP\ No\ Password.app/Contents/MacOS/MAMP\ No\ Password ; exit;
2019-08-25 11:59:43.913 MAMP No Password[1237:35722] *** -[AppDelegate applicationWillFinishLaunching:]: Finder got an error: The administrator user name or password was incorrect. (error -60007)

でした。ここから、もしかしてユーザ名間違っている？と思い試してみたところ解決しました。参考になれば幸いです。

### 参考URL
-  <https://suin.io/494>
-  <http://www.46palermo.com/blog/run-mamp-without-password-easy-way/>
井上慎也氏の転職・就職希望者向け ポートフォリオ作成相談/勉強会まとめ

まずはじめに
この投稿は初学者のレポートです。
個人的な感想の面もあります。
ご容赦ください。

勉強会日時：2019/8/18 16：00～18:00
TechCommit週末勉強会
※ 学んだ内容を簡単にまとめていますが、不適切な記述等ありましたら、修正させていただきます。

#今回の授業の目的とメニュー
##目的
私の目的として、転職を有利に進めること
そして、転職後も安定して仕事に入っていくことができるためには
どうすればよいか？を軸に考えています。

##メニュー
・ポートフォリオとは？
・採用側の気持ちを知ろう。
・ポートフォリオに魂を込めよう！
・最低限のアピールはどうすれば？

#ポートフォリオとは？
##まずポートフォリオというのは自分で作ったアプリ、コード、ブログ記事、スライド・・・etcのこと

私個人の考え方として自分の強みとなる技術を転職活動を行う企業、
不特定の人ににアピールするためのモノだと感じました。

##Q.転職には必須か？
A.あった方が良い。
####私の場合IT業界初心者なので作った方がアピールできるかもしれないと思いました。
そのため、今日からQiitaに勉強したことをまとめていければと考えました。

##＊ただし、評価されない場合もあります。
1．技術以外の専門性の高い分野
2．レガシー技術（良い意味で伝統的）な技術の場合
元からあるものに重点を置いているため、評価されにくい。

こればかりは転職活動をしながら企業の特色を探っていくことが重要になります。

##ポートフォリオの立ち位置
ポートフォリオはマッチングのための一つの武器・戦術として考える。
資格などと同じ立ち位置と考えるべき。
戦略の元で戦術を組み立てる。
今ある技術を企業に浸透させるためのもの。

#採用者側の気持ちを知ろう
また、転職を行うために相手の身になってみることも重要な考え方だと思いました。
企業がほしい人材とは
####中長期的に考えて育つ人材が欲しい。
####人材は内部の利益である。

##アピールポイント
転職活動を行うに当たって重要なアピールポイントが3つあります。
###1．技術者として活躍できそうか
###2. 一緒に仕事がしたいか
###3. 中長期的に続けてくれそうか

この3つを軸にアピールしていくことが大切だと思いました。

###1．技術者として活躍できそうか
このアピールポイントで主に井上氏が重要だと
述べていたのは2点
####・教育コストがどれくらいかかりそうか
####・役割や場所はあるか
これは企業がエンジニア就活者を見ている視点だと思いました。
####特に未経験の転職者に求められているものは教育コストにどれくらいかかるか？
だと思いました。
というのも、自分で学ぶ姿勢、困難にどのような手段でもいいから立ち向かう
姿勢のない人間は技術者として決定的に足りていないと思います。
そういった点でも未経験者は技術を学ぶことを重視すべきだと思いました。
役割や場所は技術の中で生まれるものです。

###2.一緒に仕事がしたいか
これについて井上氏が述べていたことは3点
####・仕事ができそうか
####・コミュニケーションがとれそうか
####・ポジティブか
この中で「仕事ができそうか」ということと「コミュニケーション」は相互関係のように思いました。
というのも仕事ができる人は仕事のコミュニケーションはバリバリに取れないと
周りの仕事を把握しきれないので仕事ができる人は仕事のコミュニケーションが取れる。
だと思いました。
「ポジティブか」については捉えられ方次第で変化するものなので
自分のポジティブと波長が合う企業を考えようと思いました。

###3.中長期的に続けてくれそうか
3について述べていたことは2点
####・価値観が合いそうか
####・責任感がありそうか

特に価値観は重要だと思いました。
個人にも個性があるように、企業にも個性があります。
そのため、自社の文化にフィットすることやベクトルが同じ方向を向いているかが
求められます。

#ポートフォリオに魂をこめよう！
まず転職活動するに当たって個人は企業にとってなんなのかを考えてみます。
あくまで自身と企業の関係の捉え方ということを前提として考えてもらいたいのですが、
企業にとって個人は顧客に充分な満足を得てもらうための商品としての側面があります。
では、自分に企業が魅力と感じる商品価値を持たせるにはどうすればよいか？
###そのためにポートフォリオに魂を込めることが重要だと思います。
そのため、ポートフォリオに魂を込めるということは
自分に商品価値を持たせることだと思いました。

そのためにはどういった自分がどういった商品価値を持っているかを
把握した上で、売り出すということが重要です。
###そのため…
##商品価値×売り方
この考え方が非常に重要だと思いました。
また人となりも大切な要素であるので同時にアピールすることが大事。

##しかし・・・
IT未経験の人たちにとって
技術力はないものだと思います。
そのため、最低限の技術力アピールはどうすればいいかについても
言及がありました。

#最低限のアピールはどうすれば
最低限のアピールができる技術は
###Git
###ネットワーク
###DB
###LINUX
###実際の運用を踏まえつつテスト（品質管理）まで回している。

などです。

また...
###基本情報技術者の勉強も悪くないです。
↑というのも未経験にとってまず勉強していきたい項目が
体系的に問題になっているので取っ掛かりとなるインプットがしやすいです。

私もこれから転職活動を行っていく身なので
がんばってこれらのことを踏まえつつ自分の身の丈を踏まえた
戦略を考えて行こうと思います。
。
以上、覚え書きですが
井上氏の発表のまとめをレポートしました。

また、勉強会に参加した時はレポートを
書いていければと思います。
タッチモニタもトラックパッドも有るデバイスにおける:hoverの件をDOM属性で解決する

## 前置き
iPadProやMicrosoftSurfaceではタッチモニタでのクリックも、外部ポインタデバイスでのマウスオーバーも両方あるので、単一のコンポーネントに対して「どっちから使われてもいい感じに見えるように」とか言われたりします。
今回はjs側でクラス制御するのでなく、DOM属性を付与するアプローチで、オールドスクールなCSS書きの人と分業できるアプローチを紹介します

## 要点
1. 適当な名前の `data-*` 属性を対象のコンポーネントのDOMに付与する（例えば `data-touch`)
+ `ontouchstart` で `data-touch` を常にDOMに付ける
+ `onmouseleave` で `data-touch` を常にDOMから剥がす
+ `:not([data-touch]):hover` に対して、これまで通りの素朴なCSSを書く
+ `:not([data-touch]):active, [data-touch]:active` にポインタクリック時やタップされてる時の状態をCSSで書く

以上

## Demo
<p class="codepen" data-height="265" data-theme-id="0" data-default-tab="css,result" data-user="VoQn" data-slug-hash="ExYWPzV" style="height: 265px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="Ignore (:hover) style at Touch device">
  <span>CodePen: <a href="https://codepen.io/VoQn/pen/ExYWPzV/">
  Ignore (:hover) style at Touch device</a></span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

両方のデバイスを受け付けてるSurfaceや、Chromeのモバイルシミュレーションモードでお試しください

## ReactHooksを使った簡易なHOCの例

```jsx
const TouchableContext = React.createContext({
  isTouch: false,
  handleTouchStart: e => {},
  handleMouseLeave: e => {}
});

const touchable = C => {
  return props => {
    const { onTouchStart, onMouseLeave, ...remain } = props;
    const [isTouch, setTouch] = React.useState(false);
    const handleTouchStart = e => {
      setTouch(true);
      if (onTouchStart) {
        onTouchStart(e);
      }
    };
    const handleMouseLeave = e => {
      setTouch(false);
      if (onMouseLeave) {
        onMouseLeave(e);
      }
    };
    const init = { isTouch, handleTouchStart, handleMouseLeave };
    return (
      <TouchableContext.Provider value={init}>
        <C
          onTouchStart={handleTouchStart}
          onMouseLeave={handleMouseLeave}
          data-touch={isTouch ? "" : null}
          {...remain}
        />
      </TouchableContext.Provider>
    );
  };
};
```

利用側はほぼ何もしなくてもタッチイベントで `data-touch` がDOMに付与されるので、コンポーネントの中身の実装に集中できますし、  `useContext` を使って `const { isTouch } = useContext(Touchable);` を参照することもできます。

```jsx
const TextInput = touchable(props => <input type="text" {...props} />);
const Button = touchable(props => <button {...props} />);
```
references型にunique属性を指定する方法

#はじめに
```ruby
class CreateItems < ActiveRecord::Migration[5.2]
  def change
    create_table :Items do |t|
      t.references :user, null: false, index: true, unique: true
      t.timestamps
    end
  end
end
```
これでmigrateを実行したが、unique属性が適応されていなかった。
解決方法をメモ程度に。

#結論
```ruby
class CreateItems < ActiveRecord::Migration[5.2]
  def change
    create_table :Items do |t|
      t.references :user, null: false, index: {unique: true}
      t.timestamps
    end
  end
end
```
で、出来ました。
DBの知識が少ないので、なぜ前者でダメなのかわかりません。調べてわかったら、追記します。
mpsytを実行すると日ごと制限エラー

快適な音楽ライフを楽しもうと、Linux（Linux Mint 18.3)のターミナルで動作するYouTubeプレーヤ「mpsyt（mps-youtube）」を実行したところ、以下のようなエラーが出力された。

```
$ mpsyt
Traceback (most recent call last):
  File "/home/pochy9n/.venv/lib/python3.5/site-packages/pafy/util.py", line 34, in call_gdata
    data = g.opener.open(url).read().decode('utf-8')
  File "/usr/lib/python3.5/urllib/request.py", line 472, in open
    response = meth(req, response)
  File "/usr/lib/python3.5/urllib/request.py", line 582, in http_response
    'http', request, response, code, msg, hdrs)
  File "/usr/lib/python3.5/urllib/request.py", line 510, in error
    return self._call_chain(*args)
  File "/usr/lib/python3.5/urllib/request.py", line 444, in _call_chain
    result = func(*args)
  File "/usr/lib/python3.5/urllib/request.py", line 590, in http_error_default
    raise HTTPError(req.full_url, code, msg, hdrs, fp)
urllib.error.HTTPError: HTTP Error 403: Forbidden

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/home/pochy9n/.venv/bin/mpsyt", line 6, in <module>
    from mps_youtube import main
  File "/home/pochy9n/.venv/lib/python3.5/site-packages/mps_youtube/__init__.py", line 8, in <module>
    init.init()
  File "/home/pochy9n/.venv/lib/python3.5/site-packages/mps_youtube/init.py", line 58, in init
    cache.load()
  File "/home/pochy9n/.venv/lib/python3.5/site-packages/mps_youtube/cache.py", line 34, in load
    pafy.load_cache(cached['pafy'])
  File "/home/pochy9n/.venv/lib/python3.5/site-packages/pafy/pafy.py", line 184, in load_cache
    set_categories(newcache.get('categories', {}))
  File "/home/pochy9n/.venv/lib/python3.5/site-packages/pafy/pafy.py", line 171, in set_categories
    catinfo = call_gdata('videoCategories', query)
  File "/home/pochy9n/.venv/lib/python3.5/site-packages/pafy/util.py", line 42, in call_gdata
    raise GdataError(errmsg)
pafy.util.GdataError: Youtube Error 403: Daily Limit Exceeded. 
The quota will be reset at midnight Pacific Time (PT). 
You may monitor your quota usage and adjust limits in the API Console: 
https://console.developers.google.com/apis/api/youtube.googleapis.com/quotas?project=422897895433
```

上記は「Daily Limit Exceeded」が示す通り、1日で使えるクォータを使い切ったと言う意味のメッセージであるが、pafyと言うライブラリに埋め込まれているGoogle APIキーを世界中で共有しているのだから、発生して当然のエラーであることが分かった。
市井の情報を検索しても、これと決め手となる情報が見つからなかったので、自分で理解した解決策を共有する。

## 問題点

上記エラーを回避するためには、自分のGoogle APIキーを取得して差し替えれば良いのだが、以下の理由で簡単には差し替えられない。

* mpsytは実行時に既設のAPIキーで認証するので、その時点で必ずエラーとなって終了する
* そのため、mpsytのプロンプトでAPIキーを差し替える「set api_key」コマンドを実行できない
* 「set api_key」に指定したAPIキーは ~/.config/mps-youtube/config に保存されるが、そのconfigはバイナリファイルなので迂闊に変更できない

まさに、にわとりたまご問題が発生している状況である。

## 解決策

以下の手順で「set api_key」により ~/.config/mps-youtube/config に自分のAPIキーを保存する。
なお、ここではAPIキーの取得方法について説明しないので、別途調べて欲しい。

* lib/*/site-packages/pafyに移動し cp -a g.py g.py.sav で退避する
* g.pyのapi_keyの内容を自分のAPIキーに変更する
* mpsytを実行し、プロンプトで set api_key ＜自分のAPIキー＞ を実行する
* lib/*/site-packages/pafyに移動し mv g.py.sav g.py で復旧する

以上
MVN XSensでアバタをフルトラッキングする手法

# MVN XSensとは
 　XSensとは、MVN社が製造しているおよそ400万程度する高級モーションキャプチャスーツです。マーベルシネマティックユニバースでも採用されている実績のある製品です。ここでは、MVN XSensを使用してアバタをトラッキングする方法を記述します。
  　両手・両足・両手首・両足首・両肘・両膝・両肩・両太もも・腰・胸・頭、計19点に9軸モーションセンサを取り付けたセンサを積分することで位置を特定し、アバタに反映する手法をとっています。これにより、一般コンテンツに主に採用されているIK手法では再現できない細かな動きを反映することができます。ただし、積分をしているため、誤差が蓄積するので時間経過によって位置がずれてしまうという弱点があるスーツです。キャリブレーションのめんどくささや時間経過の弱点はあるものの、動きやすさやパフォーマーの動きの忠実性という点では、所感ですがかなりのパフォーマンスを発揮していると思います。
# Unity上のアバタへの動きの反映方法
  　こちら詳しくは公式のチュートリアルを拝見していただきたいのですが、公式が公開している[Unity Asset](https://assetstore.unity.com/packages/3d/animations/mvn-live-animation-11338)内の"Xs Stream Reader(MVN XSensのクライアントアプリからの信号を受信)"をヒエラルキー内にドラッグアンドドロップし、動きを反映したいアバタに"Xs Live Animator(信号をアバタに反映)"をAdd Componentするだけです。
# FPSフルトラッキング
  　ここからが本題ですが、上記の方法でアバタに反映したとしても、VRHMDの位置とXSenseの初期位置はずれているため、そのままHMDをかぶってもTPS視点になります。ここではこの問題を解決し、一人称視点でアバタを動かす方法を説明します。
  　とはいえ非常に簡単な話で、XSensとVRHMDが別々にポジトラをしているなら、全身トラッキングしているXSensに合わせればいいだけの話です。なので、VRHMDのポジションとラッキングを切り、VR空間内のカメラ位置をアバタの頭部に固定するだけです。
  　VRHMDのポジトラを解除する方法は以下の通りです(Unity)。
InputTracking.disablePositionalTracking=true;
　　あとはカメラをアバタの頭部の動きに合わせれば、FPSを実現できるので、カメラの位置を頭部に固定しましょう。位置の固定方法はUnity 2018以降であれば、PositionConstraintが非常に簡単です。このコンポーネントは、文字通りこのコンポーネントを張り付けたオブジェクトを特定の場所に固定するものです。アバタの頭部を固定先にすれば、FPSの位置を保った場所にカメラが位置することとなります。
Pythonを始めます #1

まずは、公式サイトからインストール.　https://www.python.org/
ナビゲーションの Downloads -> All releases から Python 3.7.4. 

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/177710/b40f0f81-35a4-f65c-786f-530454da7435.png)

↓見たら、そのままだった。
https://www.python.jp/install/windows/install_py3.html
ObnizからBLEで文字列を送信する

# はじめに
ObnizでBLEを使ってデータを送信するところでつまづく人が多いので、やり方をまとめてみました。

# 前提
Obnizがperipheralです。
Obnizがセンサデータ等をNotifyで送信する状況を想定してください。
peripheral、central、Notifyなどの言葉がわからない場合は下記を参照ください。

> [開発視点の超簡単BLE入門 - クラゲのIoTテクノロジー](http://jellyware.jp/kurage/bluejelly/ble_guide.html)

# 参考
ObnizをBLE peripheralとして使うためのリファレンス
> [BLEペリフェラル \| JavaScript SDK \| obniz](https://obniz.io/ja/doc/sdk/doc/ble-peripheral)

ObnizをLINE Things デバイスとして使うためのサンプルコード
> [line\-things\-starter/obniz at master · line/line\-things\-starter](https://github.com/line/line-things-starter/tree/master/obniz)

# やり方

## 送信側

まず、Notify送信方法のおさらいです。
リファレンスでは、characteristicに`writeWait()`で値を書き込み、`notify()`でcentralに送信しています。

``` obniz-ble.js
await characteristic.writeWait(([0xf0, 0x27]))
characteristic.notify();
```

この`writeWait()`は、引数としてバイナリしか受け取れません。
幸いにも、obnizは文字列をバイナリに変換してから書き込んでくれる関数`writeTextWait()`を用意しているので、それを使います。

``` obniz-ble.js
await characteristic.writeTextWait("dataToSend")
characteristic.notify();
```

## 受信側

あとは、受信側でデータをもとに戻してやるだけです。

LINE Things 自動通信機能で、送られてきたデータをLINE Botのバックエンド(node.js)で処理する場合について説明します。
この場合、ネットワークを介すときにbase64エンコードされているため、そのデコードが必要です。

``` server.js
const blePayload = thingsData.bleNotificationPayload;
console.log(blePayload); // ZGF0YVRvU2VuZA==
// 受信データをbase64デコードする
const buffer = new Buffer.from(blePayload, 'base64');
const reveiveData = buffer.toString('utf-8');
console.log(reveiveData); // dataToSend
```

# 注意点
BLE Notifyのペイロードのうち、ユーザが利用できるのは20Byteまでです。
英数字なら20文字、日本語なら1文字3バイトのため6文字までです。
それ以上のデータの送信を試みると切り捨てられてしまうため、分けて送信するなど工夫が必要です。

分けて送信をやってみた記録を下記エントリーに残しているので、参考にしてみてください。
[移動中の心拍数\(位置情報付き\)をモバイル回線経由で記録する。丸1日動かせるくらいの低消費電力で。 \- Qiita](https://qiita.com/takeaship/items/f3a3f4be950d06670256)
プロパティの呼び出しの注意点

##プロパティの呼び出し方
プロパティにアクセスするには「.(ドット)」を使う。
このとき、プロパティ名が有効な識別子でなければいけない。(スペースとかハイフンはだめ)
有効な識別子でないプロパティ名を使う時は、ブラケット表記を使う。

```js
//ブラケット
const obj = {};

obj.color = "yello";
obj["a color"] = "red";

console.log(obj.color);
//"yello"

console.log(obj["a color"]);
//"red"
```
pythonでretryを使おうとしたらTypeError: 'module' object is not callable

#前提
- python3
- retryはインストール済み

#問題のコード

```python
import retry


@retry()
def main():
    print("hoge!")
main()
```
#エラー
```python
TypeError: 'module' object is not callable
```
モジュールをそのまま呼び出すことはできないよ！ってことらしい。

#解決
```python
import retry
```
を

```python
from retry import retry
```
にする。
お疲れ様でした！
【Java silver SE8】勉強体験


# 試験前準備
- **資格名称**：Oracle Certified Java Programmer, Silver SE 8 認定資格
- **資格合格**：1Z0-808-JPN Java SE 8 Programmer I 試験 (JPN：日本語)
- **試験時間**：150分
- **問題数**：77問(最低51問が正解だったら合格)
- **合格ライン**：65% (筆者は88%でした)

# 試験予約
- **予約サイト**：[ピアソンVUE](https://wsr.pearsonvue.com/testtaker/signin/SignInPage.htm)
- **受験料**：26,600円（税抜き）(即払い)

# 当日の流れ
- **試験会場へ到着**
 `原則として試験時間の15分前`
- **本人確認資料の提出**
`顔写真付いている証明書２つ必要`
- **写真作成**
`合格証明書用`
- **試験開始**
`私物持ち込み禁止`` A4のホワイトボードとぺん提供`

# 勉強方法

勉強方法と勉強時間は受験者のJava開発経験よりそれぞれです。
筆者は以下の２つの本を全部読み通り、最後模擬試験を受け合格した後、試験を予約しました。

基本的に土日の時間と平日電車の中の通勤時間を使って勉強し、前後1ヶ月の時間かかりました。


<img src="https://images-na.ssl-images-amazon.com/images/I/5109SRqM8XL._SX360_BO1,204,203,200_.jpg" width=30%>
<img src="https://images-na.ssl-images-amazon.com/images/I/51B0H%2BURtOL._SX350_BO1,204,203,200_.jpg" width=30%>

##ムラサキ本
**java文法の説明を読んで理解する**
説明内容を理解しているかどうかをチェックするために本の中で書いているコードを自分でeclipseの中で書いてみる。

コードを書いてもわからないものはデバックしてプログラムの流れを確認してみる。
例えば以下の類の問題をデバックで確認したら超明確にわかる。


```例.java
public class A{
  A(){
    System.out.println("A")
  }
} 
public class A extends B {
  public static void main(String[] args){
    System.out.println("B")
  }
} 
```
**質問を解答する**

- 質問のコードを読む→実行結果を予測→選択を確認する。

- 排除方法、代入方法を使って解答する。

- ポイント
 - mainメソッドの定義
 - 型変換、キャスト
 - 変数のスコープ
 - リストと配列の宣言、代入
 - 可変と非可変オブジェクトの作成
 - 比較（== 、equals()）
 - オーバーロード
 - オーバーライド
 - 継承関係、実現関係
 - ガベージコレクション
 - ...


##黒本(問題集)

ムラサキ本を読んで、上記のポイントを把握できたら問題集の問題を解答して見る。
問題集を解答とき、試験対策も考えながら以下の順番で勉強をお勧め。

- **先に全ての問題を解答する**
- **質問の聞いているポイントは何かを理解**
- **解答終わったら正誤チェック**
- **誤った問の解答分析を確認する**
- **自分の不足点を見つかり、ムラサキ本に戻り、再度文法を読み理解する**
- **模擬試験でアラーム設定してチャレンジする**
- **自分の正確率を確認する(65%以上かどうか)**
- **正確率は65%より下であれば上記を繰り返す**
- **正確率は65%より上であれば、おめでとう、試験予約しましょう!**




# 試験後結果確認
試験完了30分後、[Oracle](https://login.oracle.com/oaam_server/login.do)にログインして試験結果を確認できる。（アカウントを事前に取得すること）

# その他気になる点
- 上記２つの本のソースを筆者は個人用[GitHub](https://github.com/jsj05543/SilverSE8)にアップロードしたので参照してみてください。
- 試験対策勉強方法は色々ありますが自分のスキルに合わせて一番効果がある勉強方法を選択は一番と思います。
例えばムラサキ本と黒本両方を必ず読むという訳でわない、その中１つの本だけ読んで合格している方もいるからです。
排他的なパラメータを表現するのにenumが便利だった話

# 初めに

2つの引数を取る関数があって、引数のどちらか片方だけnilでないようにしたい、というとき ↓

```swift
func handleValue(a: Int?, b: Double?) {
    assert((a == nil) != (b == nil))
    
    // 実際の処理
}
```

こんな感じでassertを使えば実現は出来るが、enumを使えばより綺麗に書けることを知った。
そもそも関数を分けろ、などの設計の話はここでは無視する。

# やったこと

こんなenumを定義し、

```swift
enum Value {
    case a(intValue: Int)
    case b(doubleValue: Double)
}
```

関数をこう変える

```swift
func handleValue(value: Value) {
    switch value {
        case let .a(intValue):
            // aのときの処理
        case let .b(doubleValue):
            // bのときの処理
    }
}
```

これで、assertを付けなくてもやりたいことが実現できる上にinterfaceとして排他的なことが明示できるので何かと都合が良い。

# 終わりに

enumはいろいろと使い方が難しいが、慣れると便利だ。
Ubuntu18.04 (Desktop edition)のHWEカーネルをGEカーネルに切り替える

HWEに関して、[こちら](https://gihyo.jp/admin/serial/01/ubuntu-recipe/0278)の記事に詳しい

また、本記事はカーネルに手を入れるので、作業の際は十分気をつけてください。

# 目的
- xrdpを使用したいが、HWEカーネルではインストールできない [参考](https://note.spage.jp/archives/576)
- Ubuntu Serverをインストールすれば、GE (Generic)カーネルとなるが、私のPCにNVMeが刺さっているためにインストールできない（詳細は未調査）
- nvidiaドライバがうまく入らない気がする（これはパッケージが更新されたための可能性もあるため、カーネルの問題なのかは不明。しかし、今後もカーネルのアップデートに伴ってnvidiaドライバが死ぬ可能性が十分高いのでカーネルバージョンは固定しておきたい）

上記理由から、Ubuntu18.04 (Desktop edition)のカーネルをHWEからGEに変えたので、その手順を以下に示す。

# 手順
## HWEの状況確認
```bash
hwe-support-status
```
を叩くとHWEの状況が出力される

## カーネルとxorgのインストール、アンインストール
```bash
sudo telinit 3 #コンソールログイン
apt update
apt -y purge ubuntu-desktop xorg # xorgを入れ替えるのでpurge
apt install linux-generic # GEカーネルインストール
apt purge linux-generic-hwe-18.04 # HWEカーネル削除
reboot
```

GEカーネルに合わせ、xorgも再インストール

```bash
sudo telinit 3
apt purge xserver-xorg-core-hwe-18.04 xserver-xorg-input-all-hwe-18.04 xserver-xorg-legacy-hwe-18.04 linux-headers-generic-hwe-18.04 linux-image-generic-hwe-18.04 # HWE関連パッケージ削除
dpkg -l | grep hwe # HWE関連パッケージが残っていないか確認、あれば削除
apt install xserver-xorg-core
apt install ubuntu-desktop xserver-xorg xserver-xorg-video-all xserver-xorg-input-all libgl1-mesa-dri libgl1-mesa-glx
reboot
```
再起動後、```hwe-support-status```で何も出力されなければGEカーネルに切り替え完了。
C/Java/C#(SI系)なエンジニアに贈るTypeScript事始め その1（準備から動作確認まで)

#これは何？
Javaなエンジニアが必要に駆られてTypeScriptを学習する記録です。
Javaアプリケーションの開発に長年かかわってきており、以下のような
志向に染まっている、ダークサイドに落ちかけているエンジニアです。
(Javaがダークサイドと言っている訳ではありません笑　念の為）

- 志向
    - 大規模開発は静的型付けがないとねぇ、、
    - スクリプト言語で大きなWebが本当に書けるんすかね、、
    - コンパイルないから昔大規模なJavaScript書いてて死ぬかと思った、、
    - そもそも性能とか実績とかから見るとごにょごにょ、、

##この記事を書こうと思ったモチベーション

ワケあってちょろっとTypeScriptを触ってみたら思いの外、精神的に
安全な気持ちになれるじゃん！これはJavaな人（静的型付けでコンパイルに
守られていて、スクリプト言語に苦手意識のある人たち。~~いわゆる中年~~）でも
ちょっとやれば全然イケる、、と思い、筆をとることにしました。

大規模なSI開発や受託開発の現場ではまだまだJavaやC#、PHPなどの古き良き
言語が幅を利かせており、エッジの立った技術の導入に二の足を踏んでいる人たちも
多いと思います。古い言語は悪い言語、というつもりは全くありませんが、昨今の
爆発的な開発言語の増加、技術の分岐を見据えて、少しづつ、いろんなところで得た
学びや発見をお伝えしたいと思っています。

##Let's get started!
今回はTypeScriptでサーバを書きながらTypeScriptのいいところを取り上げる、
ということを目標にします。したがって、必然的にサーバはNode.jsを使います初心者編なので、
バージョンとかの細かい話は基本的には端折ります。なお、これからの作業では一部Shellを使います。
みなさまお好みのShell環境を用意していただければと思います笑。筆者の環境は以下の通りです。

- OS     : macOS Mojave(10.14.n)
- Editor : VSCode

TypeScriptはMSが開発しているため、特段のこだわりがなければVSCodeを使うのを
お勧めします。本当に何も気にせずに楽にコードが書けます。私もVSCode+Emacs key binding
な環境で快適に作業ができています。


### Node.js導入
省略笑

### TypeScript導入
globalに導入するのは抵抗があるので、特定プロジェクトに導入する、という形で
進めていきます。

```shell
#Projectの初期化
> npm config set init.author.name <name>
> npm config set init.author.email <email>
> npm init -y
```

これでpackage.jsonが出力されます。package.jsonってのはC,Javaな人向けにいうと
makefile, ant.xml, maven.xml, build.gradleみたいなものです。いわゆる
依存性の解決とか、プロジェクト構成の管理とか、そういうのをやってくれる人です。

```shell
#TypeScriptをProjectに導入
npm install --save-dev typescript
npm install --save @types/node
```
これでProjectでTypeScriptを利用する準備が整いました！おめでとうございます。
npm installってのは他のモジュールを取り寄せるコマンドです。--savaオプションを
つけると実行時も必要、--save-devだと開発時のみ必要、という意味になります。
これらのオプションをつけることによりpackage.jsonに追記してくれます。こんな感じ。

```JSON:package.json
{
  "name": "node_type",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "Keisuke Kuzukawa",
  "license": "ISC",
  "devDependencies": {
    "typescript": "^3.5.3"
  },
  "dependencies": {
    "@types/node": "^12.7.2"
  }
}
```

###Hello! TypeScript
まず必要となる環境を設定します。コード格納先のディレクトリを作って、
TypeScriptコンパイルに最低限必要となる設定ファイル(tsconfig.json)を作ります。

```shell
#ソースコードは./src以下に格納することにします。
> mkdir src
#TypeScriptのコンパイル設定ファイルを作成します。
> cat << EOF > ./tsconfig.json
 {
  "compilerOptions": {
    "module": "commonjs",
    "target": "es2017",
    "sourceMap": true,
    "types" : ["node"]
  },
  "exclude": [
    "node_modules"
  ]
}
EOF
```

次に早速コードを書きます。コードは./src/以下に格納します。
ただのJavaScriptとなんら変わりませんが・・いいんです！今はまずコンパイルして
Node上でTypeScriptが動くようになるまでを目指します。

```typescript:src/app.ts
console.log("Hello! TypeScript!!");
```

で、コンパイルしましょう。さっきnpm installしたtypescriptのコンパイルコマンドを使います。
（厳密にはTypeScriptからJavaScriptを生成するのはトランスパイルと呼ぶらしいですが、
ここではわかりやすくコンパイルで統一します）

```shell
#tscコマンドによりコンパイル実施
> node_modules/.bin/tsc
```

これだけです。早速実行してみましょう。

```shell
# nodeコマンドでアプリを実行します。app.jsを実行している点にご留意
> node src/app.js
Hello! TypeScript!!
```

おぉ！！！動きましたねー！！！たった１行のコードでも新しい環境でコードが動くと気分がいいですね。

###まとめ
私のような中年プログラマでもなんなく進むことができました。みなさまも先入観を持たずに一度、
触ってみれば、楽しめると思います！ぜひ、一緒に遊びましょう！！

to be continued...
【RubyonRails入門】テーブルにカラムを追加する方法


__【目標】testsテーブルに、mailカラムを追加する__

##1. migrationファイルを追加する

【基本形】`rails g migration add_追加したいカラム名_to_テーブル名 追加したいカラム名:データ型`

```
$ rails g migration add_mail_to_tests mail:string
```


```ruby:db/migrate/20190825031340_add_mail_to_tests.rb
# 自動で追加されたファイルの内容
class AddMailToUsers < ActiveRecord::Migration[5.2]
  def change
    add_column :tests, :mail, :string
  end
end
```

##2. 追加したmigrationファイルを、DBに追加する

```
$ rails db:migrate
```


##3. その他、補足など

###3-1. `rails g migration`と`rails g model`の違い

```
$ rails g migration add_mail_to_tests mail:string
=> 指定したmigrationファイルのみを作成する
```
```
$ rails g model
=> model と migrationファイルを作成する
```

###3-2. 初心者のための注意点
__【注意】以下のファイル内容は、自分で絶対にいじらない__
・db/migrate/20190825015302_create_tests.rb
・db/schema.rb
__【理由】__ `rails db:migrate`で自動生成しているファイルだからだそうです
C#でWindows Serviceを作る（４）

#概要
前回の記事[C#でWindows Serviceを作る（３）](https://qiita.com/yossihard/items/34f5a2298e8534fb34df)の続き。
サービス操作やパワマネ系のイベントハンドラの実装を行います。

#環境
Windows 10
Visual Studio 2017 Community

#手順
###サービス操作／パワマネ系のイベントハンドラを追加する
サービス管理ツールで一時停止／再開したときや、パソコンがサスペンド／レジュームしたときなどに、サービス側で他のシステムとの連携やファイル保存等の処理をしたいときが多々あります。
ということで、その際のイベントを受け取る処理を作ります。

ServiceBaseクラスの派生クラス（デフォルトだとService1.csというファイル。私のプロジェクトではServiceTest.cs）をデザイナーで開きます。
⇒ソリューションエクスプローラで該当ファイルをダブルクリックしてください。
その後、プロパティタブを表示します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146789/6b18958f-f36c-bcea-bbb6-218292c9caf1.png)

以下の4つのプロパティをTrueに設定します。
・CanHandlePowerEvent
・CanPauseAndContinue
・CanShutdown
・CanStop

次にイベントハンドラを記述します。
ServiceBaseクラスの派生クラスのコードを表示します。
ソースコード上で右クリックメニューを表示し、「クイックアクションとリファクタリング」を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146789/511cd4bf-0d99-4f11-3c15-d3f79d6250b1.png)

以下のようなメニューが表示されるので、「オーバーライドを生成する...」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146789/1b4ac448-aa72-aa1e-d556-614834429f84.png)

以下のようなダイアログが表示されるので、
・OnContinue()
・OnPause()
・OnPowerEvent()
・OnShutdown()
のチェックを入れて、OKをクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146789/56955966-36ae-8758-b3b3-3f042e980759.png)

そうすると、オーバーライドされたイベントハンドラが自動的に追加されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146789/5cb4dc39-a009-18cf-36a9-7496367e98ab.png)

次回は、ここにログ出力の処理を追加していきます。
ブラウザベースSVGエディタまとめ

いま個人的にSVGエディタを作っているので、ブラウザで使えるベクターグラフィックスツール(でSVGをエクスポートしたりできるもの)を調べたメモです。また、汎用なものを主に扱っていて、フォントエディタだとかフローチャートツールなどは載せていません。私にはBOXY SVGが一番参考になるかもと思いました。星は機能の数とか開発の活発さの目安です。

## ★★★★★[Gravit Designer](https://designer.gravit.io/) 

有料版あり(100USD/YEARが今なら55USDくらい？)。活発に開発が続いており、多機能です。複数ページの編集もできたり、多角形の頂点ごとに丸みを設定できたりとSVGにもない機能も。PDFやIllustrator形式もインポートできるらしいです。UIも多言語化されています。つよい。レンダリングはWebGLでCanvasに描いているっぽいです。jQuery。でもSVGをインポートすると結構崩れます。

## ★★★★☆[BOXY SVG](https://boxy-svg.com/)

有料版あり(9USD/MONTH)。レンダリングは名前の通りSVGで内部のデータ構造もSVGらしく、SVGは崩れずにインポートできますし、Elements Panelで生SVG DOMツリーを見ることができるのがSVG手書き勢は喜びそうです。有料版のみですが、これもPDFやIllustrator形式もインポートできるらしいです。バックエンドにFirebaseを使っている気配があります。[pako](https://github.com/nodeca/pako)。[Paper.js](http://paperjs.org/)、[Dexie.js](https://github.com/dfahlander/Dexie.js/)、[gif.js](https://github.com/jnordberg/gif.js)、[imagetracer.js](https://github.com/jankovicsandras/imagetracerjava)、[opentype.js](https://opentype.js.org/)あたりを使っているのが参考になりそうです。

## ★★★☆☆[Janvas](https://www.janvas.com/)　

36ユーロ/年。これも複数のページを持つことができます。機能は BOXY SVGと同程度か少し少ないくらい？デモがなくて、あまりどんな機能があるのか確認できていません。

## ★★★☆☆[vectr](https://vectr.com/)


広告付き。有料版は将来用意するかも、とのこと。機能はシンプルですが、複数ページを持てます。描いたドキュメントにURLが割り当てられて、それをそのまま公開することができるみたいです。


## ★★★☆☆[Vecteezy Editor](https://www.vecteezy.com/editor) 

まだベータ版だそう。機能はかなりシンプルですが、ひと通りのことはできそうです。


## ★★☆☆☆[henoc/svgeditor](https://github.com/henoc/svgeditor)

ブラウザベースではなくてvscodeプラグインですが、参考になるかも知れないので載せておきます。複雑なドキュメントでは重かったり、読み込めないSVGドキュメントも。まだ開発は続いているんでしょうか。


## ★★☆☆☆[SVG-edit](https://github.com/SVG-Edit/svgedit) 

オープンソース(MITライセンス)。現在も開発は続いているようですが、開発者が減り滞っているようです。UIのデザインにちょっと古さを感じます。

## ★☆☆☆☆[mrdoob/svg-editor](https://github.com/mrdoob/svg-editor)　

Mr.doob(three.jsの人)もこういうの作ってたのか！　実用的なものではなくてデモみたいな感じ。

## ★☆☆☆☆[Method Draw](https://editor.method.ac/)　

SVG Editのフォーク。すでに開発が終わっているようです。


# まだよく調べていないもの

## [Figma](https://www.figma.com/)

最近時々聞くUIデザインツール。ベクターグラフィックスツールとしても使えるとか。
Rubyist が AviUtl のスクリプトを書くための Lua の注意点

[AviUtl のスクリプトを書き始めた](https://qiita.com/cycloawaodorin/items/b2bd14e3283e8072bb07) 私が気づいたところのメモ．
AviUtl では Lua 5.1 という，古いバージョンを使うことになる．

# 違うところ
## デフォルトがグローバル変数
Ruby と違い，Perl のように，デフォルトがグローバル変数なので，`local`をつけてローカル変数にするようにする．Ruby と同様，shadowing が許容されているほか，再宣言も可能なので，コーディングでは注意．

## `if`ブロックがスコープを作る
Ruby と違い，`if`の`then`節はローカル変数のスコープを作り，`then`節で`local`をつけた変数は`if`の外では読めない．条件によって別の値を代入して後で使いたい場合は，`if`の外で宣言しておく必要がある．

## 全部テーブル
Ruby が全部メソッド，Python が全部 attribute であるように，Lua のオブジェクトは全部テーブル (Ruby の`Hash`) のようだ．つまり，Lua の`obj.func`は，Ruby でいうところの`obj[:func]`のようなものと言える．というより`obj["func"]`のシンタックスシュガーに過ぎない．`()`をつけないと呼び出しではなく，関数オブジェクトを指すという点は Python に近いと言える．つまり，`obj["func"](arg)`のように呼び出すことも可能．

## 配列は 1 オリジン
配列もテーブルだけど，キーが全部整数なら配列扱い (普通のテーブルより速い) という，よくわからない扱いらしい．その配列は (Ruby を含む多くの言語の 0 オリジンと違って) 1 オリジンが基本らしい．

## `+=`とかはない
なれてないとエラーメッセージがわかりにくいので注意．

## 論理演算子は`and`，`or`，`not`
Ruby にも`and`，`or`，`not`はあるが，他の言語と同様に Ruby にもある`&&`，`||`，`!`は Lua では使えない．また，not equal は`!=`ではなく`~=`である．

## 例外はない
例外はないので，`pcall`というのを使うらしい．`pcall`を使った処理は，Ruby の C 拡張での例外の扱いに似ている．

## C/C++ との連携
Lua とのインターフェースであるスタックを直接操作することになっている点が特徴的．C/C++ から Lua の関数を呼び出したり，テーブルの値を参照するには，関数とその引数や，テーブルをスタックに乗せてから呼び出しや読み出し参照を行う必要がある．また，C/C++ で定義した Lua の関数がその引数を読むときも，スタックを介して読み取る必要がある．このあたりをラップした API が用意されている Ruby との大きな違いである．

# 似ているところ
## 多重代入，多値 return が可能
`func(unpack(list))`のように展開もできる．ただし，引数の最後以外では最初の要素だけ返すため，`func(unpack(a), unpack(b))`は`func(a[1], unpack(b))`のようになり，Ruby の`func(*a, *b)`とは挙動が異なる．

## `nil`と`false`だけ偽でほかは真
これは Ruby と同じ．AviUtl の拡張編集スクリプトの場合，`obj.check0`は`true`/`false`だけど`--dialog`の`/chk`は`0`/`1`なので注意 (`0`は真)．

## 演算子がメタメソッド
Ruby の演算子がメソッドであるのと似ている．

## `do`，`end`などの予約語
ブロックが`do`-`end`なのは親近感．ただし勝手に作るブロックも`do`-`end` (Ruby では`begin`-`end`)．
injectしてるクラスでNullpointException

備忘録なので軽くー

ユーティリティで使用しているクラスに@injectしているクラスを設定して実行したら、NullPointExceptionで異常終了。

意味がわからなくて、調べたり聞いたりしたら、Staticメンバクラスで@injectを宣言して実行してもインスタンスが作成されないため、Nullで落ちるみたい。
それでも実行させるやり方は色々あるらしい。

ただ、実装上は問題ないため、コンパイルエラーは起きない。

詳しい話は気力があったら、調べよう。
MySQLで総数同士の割合を求める方法

MySQLである値の総数からある値の総数の割合を取得するためのもの
備忘録として

環境
---
MySQL 8.0

やりたいこと
----
以下のテーブルからclass 1に所属する男の割合を取得する

| name     |   class|  gender|
|:---------|-------:|:------:|
| taro     |      1 |      男|
| hanako   |      2 |      女|
| jiro     |      2 |      男|
| saburo   |      2 |      男|
| junko    |      1 |      女|
| shiro    |      2 |      男|

SQL文
---
```sql:SQL1
SELECT class,gender,count(*) as count,
concat(round((sum(case gender WHEN '男' THEN 1 ELSE 0 END)/count(*) * 100),1),'%') as per
FROM student
WHERE gender='男'
AND class='1'
GROUP BY class
```

結果
---
|   class|  gender|   count|   per|
|:------:|:------:|:------:|:----:|
|      1 |      男|      3 | 75.0%|


まとめ
---
他に良い方法があればよろしくお願いいたします。
PowerShellでgrepっぽいやつ

業務用パソコンに自由にPythonなどを入れてもらえれば楽なのだが、重要なデータを扱っている環境ほど新たな開発環境を入れるのは難しく、PowerShellが活躍する機会も少なくない。そんなわけでgrepっぽいことをPowerShellで書いてみた。

真面目なgrepというより、これをベースにファイルの中身を読み込んで処理するためのテンプレだと思っていただければ。

なお、動作確認はMacOSで行っている。（うちにWindowsないので・・・）

# コマンドラインの処理

grepと同じようにファイルを指定する場合と、`-r`を付けて再帰的に探索できるようにしたい。

```sh
./regex1.ps pattern file
./regex1.ps pattern path -r
```

コマンドライン引数はParamで取れるが、引数に`[switch]`を付けると、そのコマンドラインが有効になっているかをTrue/Falseで取得することができる。

```powershell
Param($regex,$path,[switch]$r)
```

# ファイル一覧の取得

Convert-Pathを使うと`.`のようなUNIX風のファイル操作をパスに展開できる。仮に、このようなファイル構造だとする。

```sh
[pwsh]$ tree
.
├── dira
│   ├── a1.txt
│   └── a2.txt
├── dirb
│   ├── b1.txt
│   └── b2.txt
├── first.ps
└── regex1.ps
```

それに対してConvert-Pathに`.`や`*`を渡すと、こんな感じで展開される。

```
PS /Users/user/pwsh> Convert-Path .
 /Users/user/pwsh
PS /Users/user/pwsh> Convert-Path *
 /Users/user/pwsh/dira
 /Users/user/pwsh/dirb
 /Users/user/pwsh/first.ps
 /Users/user/pwsh/regex1.ps
PS /Users/user/pwsh> Convert-Path *.ps
 /Users/user/pwsh/first.ps
 /Users/user/pwsh/regex1.ps
```

# ファイルを１行ずつ読み込む

汎用性を気にしなければ、とりあえず、ここだけ知ってればOKかな。

```powershell
$f = (Get-Content $file ) -as [string[]]
$pattern = 'pattern'
foreach ($l in $f ) {
  if ($l -match $pattern ){
    # ここに処理を書く
  }
}
```

# ソースコード全体

```powershell
#!/usr/local/bin/pwsh 
# usage ./regex1.ps pattern file
# usage ./regex1.ps pattern path -r

Param($regex,$path,[switch]$r)

$path = (Convert-Path $path)
$path
if($r){
    $DIR_ = dir $path -file -Recurse
}else{
    $DIR_ = dir $path -file    
}

foreach( $file in ${DIR_}.fullname ) {
    Select-String $regex $file
    $f = (Get-Content $file ) -as [string[]]
    $flag = 0
    $line = 1
    foreach ($l in $f ) {
        if ($l -match $regex ){
            if ($flag -eq 0 ){
                # 一致するキーワードが存在する場合に１回だけファイル名を出力
                Write-Host $file
                $flag = 1
            }
            Write-Host $line $l
        }
        $line++
    }
}

```
scalar, vector, matrices の次元の違い

```
import numpy as np
#この中からarray,shape,ndim関数を使う
```

##scalarの次元は0(0次元のテンソル)であることを確認

```
#scalar
#numpyの中にあるarray関数
s = np.array(3)
s.shape
# =>()
s.ndim
# =>0
x = s + 5
x
# =>8
```

##vectorの次元は1(1次元のテンソル)であることを確認

```
#vector

v = np.array([2,3,4])
v.shape
# =>(3,) 
#columunが３つあって一次元。タプルで返される。

v.ndim
# =>1

v[1:]
#numpy特有の表現。訓練用とテスト用に分ける時よく使う。
# =>array([3, 4])
#2番目以降全て
```

##matricesの次元は2(2次元のテンソル)であることを確認
```
#metrices

m = np.array([[1,2,3],[4,5,6],[7,8,9]])
m.shape
# =>(3, 3)

m.ndim
# =>2

m
# =>array([[1, 2, 3],
       [4, 5, 6],
       [7, 8, 9]])

m[1]
# =>array([4, 5, 6])
#2番目の要素にアクセス

m[1][1]
# =>5
```

参考: NumPy・Python3で】ゼロから作るニューラルネットワーク（バックプロップを徹底マスター） (https://www.udemy.com/neuralnet/)