OmniAICreator/Qiita-1.07M huggingface dataset:
アルゴリズムの基本

[アルゴリズム図鑑](https://www.shoeisha.co.jp/book/detail/9784798149776)が無料公開されていたので、読んでみて自分なりに補足を加えたり、C#やPythonでの追記をして復習をする

# アルゴリズムとは?

>アルゴリズムとは、数学、コンピューティング、言語学、あるいは関連する分野において、問題を解くための手順を定式化した形で表現したものを言う。算法と訳されることもある。
>
>「問題」はその「解」を持っているが、アルゴリズムは正しくその解を得るための具体的手順および根拠を与える。さらに多くの場合において効率性が重要となる。
>
>コンピュータにアルゴリズムをソフトウェア的に実装するものがコンピュータプログラムである。人間より速く大量に計算ができるのがコンピュータの強みであるが、その計算が正しく効率的であるためには、正しく効率的なアルゴリズムに基づいたものでなければならない。
>
>Wikipediaより引用

上の説明にあるように「**問題を解くための手順を定式化した形で表現したもの**」である。つまり、数学の○○の定理のように難しい問題を一瞬で解を導いてるれるようなものである。アルゴリズムのすごいところは

- 人が理解できるように記述されていること
- 同じ種類の問題であれば適用できること
- 人手では到底調べ切れない問題を解決できること
- 計算量があらかじめ予測できること

が挙げられる。

# アルゴリズムと計算量

## 計算量とは

アルゴリズムの性能を評価するために、計算量(けいさんりょう)という指標が用いられる。計算量には、時間計算量と空間計算量とがあります。

| 計算量 |  |
|----|----|
| 時間計算量 | 理時間がどれだけ掛かるのか |
| 空間計算量 | どれだけの記憶容量を必要とするか |

計算量のほとんどは時間計算量を指している

## O(オーダー)記法

実行環境によって左右される指標ではアルゴリズムの比較をすることが出来ないので、計算量を単純に「3秒かかる」といったような表現をしない。計算量の指標として、「命令数(ステップ数)」を基準とする。

計算量の記述には、O記法という表記が用いられるのが一般的である。

$O(n)$ のように記述し、この場合、データの個数nに比例した時間が掛かることを表している。

| 記法 | 詳細 |
|----|----|
| $O(n)$ | 命令数がデータ数に比例することを意味する |
| $O(1)$ | 命令数がデータ数に比例することを意味する<br>n回、もしくは、nに比例する回数以内のループの処理で終わる場合がこれに該当する |
| $O(n^2)$ | 計算量の最大次元が $n^2$ であることを意味する<br>例えば、$2n^2 + 3n + 1$ が該当する<br>$O(n^3)$、$O(n^4)$ といった、より高次のものも同様である |
| $O(\log n)$ | データ数nとするとき、2をステップ数乗した値の定数倍が計算量になるようなアルゴリズム<br>典型的な例として、二分木などが該当する |
| $O(n \log n)$ | マージソートのように、二分木のようにデータを分割し、かつそれらのデータ全体をリニアサーチするようなアルゴリズムの計算量<br>二分木のオーダーとリニアサーチのオーダーの掛け合わせになる |

## 二分木探索のオーダー

二分木検索の計算量を考察する。二分木検索は、データ全体をに分割しながら行うサーチである。データとステップ数の関連を表にまとめる

| データの大きさ | ステップ数 |
|----|----|
| 2 | 1 |
| 4 | 2 |
| 8 | 3 |
| 16 | 4 |

$n = 2^{(ステップ数)}$ が成り立つ。つまり、両辺 log をとると $\log n = (ステップ数)$ になる。2分探索の時間計算量は $O(\log n)$ である。

## 計算量の応用

### 計算量からわかること

計算量を用いることのメリットは**処理時間にある程度の予測が立つこと**である。O記法で表現すれば、データ数や実行環境に依存すること無くアルゴリズムを比較し、処理時間を見積もることが出来る。

| 表記 | 意味 | 例 |
|----|----|----|
| $O(1)$ | 定数 | 配列を添字アクセスする場合(ex. a[0] = 1;) |
| $O(\log n)$ | 対数 | 二分探索 |
| $O(n)$ | 一時 | 線形探索 |
| $O(n \log n)$ | $n \log n$ | クイックソート |
| $O(n^2)$ | 二次 | 2重ループを伴う配列全体の走査。バブルソートなど |
| $O(n^3)$ | 三次 | 3重ループを伴う配列全体の走査。行列計算など |
| $O(2^n)$ | 指数 | 集合分割問題 |

単純に言えば、上の方が計算量の小さい、つまり効率的なアルゴリズムであることを表している。

>係数を無視していること、データ数を考慮していないので一部例外がある

```python
import numpy as np
import matplotlib.pyplot as plt

input_data = np.arange(1,100,1)

o_log = np.log(input_data)
o_nlog = input_data * np.log(input_data)
o_n2 = input_data * input_data
o_n3 = np.power(input_data, 3)

plt.plot(input_data, o_log, label="O(log n)")
plt.plot(input_data, input_data, label="O(n)")
plt.plot(input_data, o_nlog, label="O(nlog n)")
plt.plot(input_data, o_n2, label="O(n^2)")
plt.plot(input_data, o_n3, label="O(n^3)")
plt.ylim(0, 300)
plt.legend()
plt.show()
```

| O記法の計算量の比較 | nが少ない時の比較 |
|:----:|:----:|
| ![Algorithm01.png](https://qiita-image-store.s3.amazonaws.com/0/163332/e9d3c81f-4dfa-e943-d3fb-14fa0f325c56.png) | ![Algorithm02.png](https://qiita-image-store.s3.amazonaws.com/0/163332/ad24b523-51f1-43f4-e2a8-4b203e6b7155.png) |

係数の比較を付けていないが、$O(n \log n)$ と $O(n)$ は状況によっては効率が入れ替わることがある
XRDPの設定の中でハマったことの原因と答え

Google Compute EngineのインスタンスにUbuntuをインストールして、XRDPでリモートデスクトップ接続した際に、色々ハマりました。
その原因が分かりましたので、まとめます。

#XRDPログイン後画面が灰色（黒）で落ちた件
XRDPで接続したリモートデスクトップの環境で、ソフトウェアからソフトのインストールをした時に、パーミッションが無いとエラーになったので、管理者権限無いことが原因と思い、一般ユーザーでログインしていたのを管理者権限でログインできる様にユーザーの権限を変えてログインしたら、XRDPのログインを過ぎたあと画面が灰色になって接続が切れてしまったことがあります。


下記の記事を読み、この時の原因がセッションが無かったからと思いました。
https://gtrt7.com/blog/linux/ubuntu-16

この時、上記の記事の中で”(2)デスクトップにLXDEを導入している場合”を実行したら直りました。
今、Ubuntuの勉強のため、このサイトに再びアクセスしたので、じっくり読んで内容を学びました。

#GCEで追加したユーザーに管理者権限がつかない件
接続したリモートデスクトップの環境で、ソフトウェアからソフトをインストールしようとした時に、パーミッションが無いという内容のエラーが出ました。
今別件でネット検索していて、この原因が分かりました。

##SELinuxというセキュリティが原因かも
この記事が、参考になりました。
https://tech.nikkeibp.co.jp/it/article/COLUMN/20061031/252334/

早速、今動いているか確認しました。

```
getenforce
```

結果は、インストールされていないと言われました。

引き続き調査中です。



SELinuxの使い方は、こちらの記事が参考になります。
https://qiita.com/chi9rin/items/af532d0dd9237cc65741

#ソフトウェアが起動しない
VNCで接続した時、ソフトウェアを起動しようとしても、起動途中に処理が無くなってしまい起動してくれないです。
これとXRDPでログインした時に、ソフトウェアからソフトをインストールしようとした時に、パーミションがないという内容のエラーが起きるのと同じ原因のように思います。
引き続き調査中です。
SQLiteでテーブル名を変数にしようと思ったらドはまりした話

　[前回の記事](https://qiita.com/drafts/f2869061a4669809a197/edit)で、SQLiteに接続し、データを投稿することに成功した。だが、後日振り返って「テーブル名を変数にしてクラス作れば今後の開発も楽じゃね?」などと思い、実際やってみたら思った以上に苦戦した履歴。
#ドはまりしたところ
まず、Pythonで次のようなモジュールを作った。

```py
import sqlite3 as sql

dbpath="H:\Data\yieldcurve.db"
conn=sql.connect(dbpath)

cur=conn.cursor()
name='FFRate'
cur.execute("CREATE TABLE IF NOT EXISTS %s" % name)
conn.commit()
cur=conn.cursor()
```
```text:responce
sqlite3.OperationalError: near "FFRate": syntax error
```
動かない。?を使っても同じ

```py
(略)

cur.execute("CREATE TABLE IF NOT EXISTS ?" ,name)

(略)
```
```text:responce
    cur.execute("CREATE TABLE IF NOT EXISTS ?" ,name)
sqlite3.OperationalError: near "?": syntax error
```

##解決策
いろいろと試したが、[このサイト](http://hy-adversaria.blogspot.com/2011/02/pythonsqlite_05.html)にあったやり方を応用したら動いた。

```py
cur.execute("CREATE TABLE IF NOT EXISTS table_info('%s')" % name)
```
'%s'を?に置き換えるとうまくいかなくなる。

```py
cur.execute("CREATE TABLE IF NOT EXISTS table_info(?)" , name)
```
```text:responce
   cur.execute("CREATE TABLE IF NOT EXISTS table_info(?)" , name)
sqlite3.OperationalError: near "?": syntax error
```

まあ・・・とりあえず動いたし良いかな。
今度は、何度動かしても結果を同じにするため、テーブルをDROPする項目を書き加えて見たところ、動かなくなった。

```py
import sqlite3 as sql
dbpath="H:\Data\yieldcurve.db"
conn=sql.connect(dbpath)

cur=conn.cursor()
name='FFRate'

cur.execute("DROP TABLE IF EXISTS table_info('%s')" % name)
cur.execute("CREATE TABLE IF NOT EXISTS table_info(?)" , name)

conn.commit()
cur=conn.cursor()
```
```text:responce
    cur.execute("DROP TABLE IF EXISTS table_info('%s')" % name)
sqlite3.OperationalError: near "(": syntax error
```


もしかして？と思い、```table_info```を消去したら、動くようになった。

```py
cur.execute("DROP TABLE IF EXISTS %s" % name)
cur.execute("CREATE TABLE IF NOT EXISTS table_info('%s')" % name)
```

この違いは何なのだろうか・・・とりあえず先に進めることにしよう。
`cur.execute`が2行も続くのは鬱陶しいと思い、まとめてみたところ、「命令は一つにしろよ」と怒られた。

```py
cur.execute("""
    DROP TABLE IF EXISTS %s;
    CREATE TABLE IF NOT EXISTS table_info('%s')""" 
    % (name,name,))
```
教科書をよく見たら、```cur.executescript```と書かなければならないようだ。

```py
cur.executescript("""
    DROP TABLE IF EXISTS %s;
    CREATE TABLE IF NOT EXISTS table_info('%s')""" 
    % (name,name,))
```
これで一応は動作する。

#まとめ
とりあえず、テーブル名を変数としてSQLite動かすことができた。しかし、[SQLite3の公式ドキュメント](https://docs.python.jp/3/library/sqlite3.html#)をもう一度読むと、どうもこの書き方は危険らしい。(なぜ危険なのかよくわからないが)
また、なぜDROPとCREATEで書き方が異なるのか、疑問が残る。
何れにせよ今後改良していきたいところだが、今回はこのまま続行していうと思う。

#参考文献
・Pythonによるスクレイピング&機械学習
・[PythonでSQLite - カラムの新規追加](http://hy-adversaria.blogspot.com/2011/02/pythonsqlite_05.html)
・解決策が書いてあるっぽいけどクソ雑魚過ぎて意味がわからなかったページ[[Variable table name in sqlite]](https://stackoverflow.com/questions/3247183/variable-table-name-in-sqlite/33184570)
[WIP] GridSearchを使えるようになる

機械学習のハイパーパラメータを最適化するために、最適な値を総当たりする手法です。

## インタフェース

```
class sklearn.model_selection.GridSearchCV(
estimator, 
param_grid, 
scoring=None, 
fit_params=None, 
n_jobs=1, 
iid=True, 
refit=True, 
cv=None, 
verbose=0, 
pre_dispatch=‘2*n_jobs’, 
error_score=’raise’, return_train_score=’warn’)
```

## パラメータ
* estimator
    * ここに、学習に用いる予測器を渡します
* param_grid
    * 組み合わせ最適化に渡す値を入力します
* n_jobs
    * 並行実行が可能
* cv
    * クロスバリデーションの値
    * 指定した値で k-fold が実行される

## 結果を見るには
* best_estimator_
    * GridSearchで選ばれた予測器を返します
* best_score_
    * 最も良い予測器のスコアの中央値を返します
* best_params_
    * 最も良いパラメータセットを辞書形式で返します

## 最適化を実行

```
GridSearchCV
```

## なにがアウトプットされるのか？

```
clf.grid_scores_

clf.best_params_
```
SQLで順位付け -SELECT文でランキングをつくる-

# 対象読者
- RANK関数が使えないDBMSを使用している方(Oracle, SQL Server, PostgreSQLはRANK関数により実現可能)
- SQLを使って頭の体操をしたい方(自分ならどのようなSQLを書くか考えてみてください)

# 順位付けの対象（平均年収）
中国・四国地方のデータを使ってみます。

|県名|平均年収|
|:----|:-----|
|愛媛県|388万円|
|岡山県|385万円|
|広島県|386万円|
|香川県|383万円|
|高知県|379万円|
|山口県|395万円|
|鳥取県|386万円|
|島根県|369万円|
|徳島県|387万円|
[DODA 平均年収ランキング2017（47都道府県の平均年収）](https://doda.jp/guide/heikin/area/)をもとに作成

上記のデータから以下のような結果を出力するにはどうすればよいでしょう？

|県名|平均年収|順位|
|:----|:-----|--:|
|愛媛県|388万円|2|
|岡山県|385万円|6|
|広島県|386万円|4|
|香川県|383万円|7|
|高知県|379万円|8|
|山口県|395万円|1|
|鳥取県|386万円|4|
|島根県|369万円|9|
|徳島県|387万円|3|

#順位付けSQL
##SQL文
実行環境：MySQL 8.0.11

```sql
--県名　　：prefecture_name
--平均年収：average_income
SELECT
	i1.prefecture_name AS '県名'
    , i1.average_income AS '平均年収'
    , (SELECT count(i2.average_income)
		FROM income i2
		WHERE i1.average_income < i2.average_income) + 1 AS '順位'
FROM
	income i1
ORDER BY
	順位;
```
##出力結果
山口がダントツの1位！鳥取はどうしたんでしょうか。
<img src="https://qiita-image-store.s3.amazonaws.com/0/212045/2a6e8c9f-b3b1-a998-f328-ba82461abcb4.png" width=32%>

#説明
SELECT句の3列目で"順位"を生成しています。**主問合せ(i1)の各行に対して副問合せ(i2)を実行し、主問合せ(i1)の行の平均年収の値よりも大きい副問合せ(i2)内の行数をカウントします**。

例えば、平均年収の一番高い山口県は、「WHERE i1.average_income < i2.average_income」を評価しても395万円より大きい値は出てこないため、副問合せのカウント結果は0件となります。ただ、0位というのは順位として正しくないため、カウント結果に+1して順位として出力する必要があります。

平均年収が同じデータが複数ある場合は同じ順位となり（鳥取県と広島県）、その次のデータ（岡山県）の順位は、「直前の順位＋直前の順位を持つデータの個数」となります。図でいうと、鳥取県と広島県が同じ4位であり、その次の岡山県は6位になっています。

#おまけ：順位をテーブルで保持する
順位は他のカラム（この場合は平均年収）から求めてることのできる導出項目であるため、カラムとして保持することはあまりおすすめできないですが*1、何らかの理由で必要なケースもあると思うので書いておきます。

*1 導出項目をカラムとして保持する場合、導出元となるデータと導出項目との整合性が問題となります。例えば、導出項目を生成するのが30分間隔であれば、30分間はデータの不整合が起こりうるため注意が必要です。
ちなみに、整合性を確保する手段の一つとしてトリガーがあるので使用を検討するのもありです。
[トリガーとは何か -使い所と問題点を考える-](https://qiita.com/wanko5296/items/fa3620c48196acbd3ab6)

実行環境：MySQL 8.0.11

```sql
SET SQL_SAFE_UPDATES = 0; --SQLの制限を解除する
```

```sql
UPDATE 
	income
    , (
		SELECT
			i1.income_id
			,i1.prefecture_name AS '県名'
			, i1.average_income AS '平均年収'
			, (SELECT count(i2.average_income)
				FROM income i2
				WHERE i1.average_income < i2.average_income) + 1 AS '順位'
		FROM
			income i1
		ORDER BY
			順位
	) income_rank
SET
	income.rank = income_rank.順位
WHERE
	income.income_id = income_rank.income_id;
```

#最後に
RANK関数を採用しているDBMSが増えていることもあり、当記事のSQLを実際使うかといわれると微妙なところですが、「こういうSQLの使い方もあるのか」と思っていただければ幸いです。例えば、SELECT文の中でSELECTというのは他の目的のSQLにも応用できるかもしれません。応用できそうな用途を考えてみてください。

#参考文献
[達人に学ぶ SQL徹底指南書](https://www.amazon.co.jp/%E9%81%94%E4%BA%BA%E3%81%AB%E5%AD%A6%E3%81%B6-SQL%E5%BE%B9%E5%BA%95%E6%8C%87%E5%8D%97%E6%9B%B8-CodeZine-BOOKS-%E3%83%9F%E3%83%83%E3%82%AF/dp/4798115169)
mac terminal のポート開放

webpack-dev-serverとかRailsのサーバーとか、pythonサーバーとか、OSC(SuperCollider, MaxMsp, openframeworks...)だとか、諸々のサーバー立ててる時に、終了時にバグると、プロセスが適切に殺されないまま残ってしまい、次に建てる時にうまく立たないことがよくある。
そんな時に

`sudo lsof -i:[ポート番号]`でそのポート番号を使用しているプロセスが出てくるので、killコマンドで殺す

以上。
`ghi comment`できない！！と思ったら

# そもそも`ghi`とは何か

`ghi`は、CLI上からGithubのissue、Pull-request、Milestoneなどを操作することができるツールです。
よく使うものとしては*issueの参照・作成・コメントの追加・コメントの編集・close等*ができます。
公式はこちら: [stephencelis/ghi](https://github.com/stephencelis/ghi)
めちゃくちゃ便利で助かってます。


# 問題の状況について
```shell

# issue一覧を取得します
$ ghi
\# user/example open issues
 1: Test issue 1
# issue番号1にコメントをつけたいとします
$ ghi comment 1
# エディタでコメントを入力&保存
Moved Permanently
$ 
```

このようになり、コメントができていない状況です

# 問題点・解決策

`Moved Permanently`の文言は、どうやらレポジトリが移動した後(ex.改名された後)に、`remote`のURLを変更しなかった場合に起こるらしいです。

一応、別のケースではありますが似たケースがあったので参考にしました↓
https://github.com/stephencelis/ghi/issues/267

なので、**remoteを移動後の名前にきちんと変えてやればいい**わけです。

```shell
$ git remote set-url <remote名> <新しいURL>
```

思ったよりも単純でした...
一応、同じようなことに疑問を持つ人もいるかと思うので晒しときます。
追加情報等あればウェルカムです。
ハマる！ Windowsタスクスケジューラで再起動タスクを設定するときのハマりポイント

# 経緯
業務中にサーバを再起動させる為、
タスクスケジューラを設定したのですが、
設定にハマったので
ハマったポイントを載せておきます。

# ハマったポイント
タスクスケジューラにて実行するユーザを選択するが
選択するユーザが「バッチジョブとしてログオン」の権限がないと
エラー値：2147943785
のエラーとなってしまう！

ローカルセキュリティポリシー→ローカルポリシー→ユーザ権利の割り当て→バッチジョブとしてログオン
からは追加できない！(追加するボタンが非アクティブ)

追加する場合は
グループポリシーの管理→フォレスト：[ドメイン名]→ドメイン→[ドメイン名]→Domain Controllers→Default Domain Controllers Policy→右クリック→編集→コンピューターの構成→ポリシー→Windowsの設定→セキュリティの設定→ローカルポリシー→ユーザ権利の割り当て→バッチジョブとしてログオン
から追加する(追加するボタンがアクティブ)
Raspberry Piへのhomebridgeインストール手順

# はじめに

Raspberry Piでhomebridgeを利用するまでの手順メモです。

1. Raspberry Piにnode.jsをインストール
1. homebridgeをインストール
1. homebridge起動停止スクリプト作成

## 前提

Raspberry PiにRaspbian Stretch Liteがインストールされ、初期設定が完了しているものとします。


# Raspberry Piにnode.jsをインストール

次のコマンドを順次実行し、nvmとnode.jsをインストールします。

```shell:
# 1. node.jsのバージョン管理ツール nvm をインストールする。  
curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.8/install.sh | bash

# 2. .bashrc をリロードする。  
source ~/.bashrc

# 3. インストール可能な node.js のバージョンを確認する。  
nvm ls-remote

# 4. バージョンを指定して node.js をインストールする（例はバージョン8.11.2）。  
nvm install v8.11.2
```


# 2. homebridgeをインストール

```shell:
# 1. homebridge の依存ライブラリをインストールする。  
sudo apt-get install libavahi-compat-libdnssd-dev

# 2. homebridge をインストールする。
npm install -g --unsafe-perm homebridge

# 3. homebridge プラグインを必要に応じてインストールする。次のコマンドは一例。  
npm install -g homebridge-cmdswitch2 homebridge-temperature-cmd homebridge-cmdaccessory homebridge-cmd homebridge-ifttt
```

homebridge設定ファイル config.json の記述方法は、各 homebridge プラグインの説明を参照してください。


# 3. homebridge 起動停止スクリプト作成

homebridge設定ファイル config.json は ```/home/pi/homebridge/config.json``` に置かれているとします。

## 3-1. homebridge 起動スクリプトの例

logoutしてもhomebridgeが起動したままになるようnohupを用いて起動します。

```shell:start.sh
source /home/pi/.nvm/nvm.sh
nvm use 8.11.2
cd /home/pi/homebridge
nohup homebridge -U /home/pi/homebridge &
```

## 3-2. homebridge 停止スクリプト

homebridgeを複数起動させることはないと思われますので、ここでは名前で探して停止します。

```shell:stop.sh
ps aux | grep homebridge | grep -v grep | awk '{ print "kill ", $2 }' | sh
```
CicleCiでCan't connect to local MySQL server through socket

## 現象
CircleCiで`db:create`を実行すると

```
Can't connect to local MySQL server through socket
```
というエラーになる。

## 原因
原因は`database.yml`でhostを`localhost`としていること。

```yml:database.yml
default: &default
  adapter: mysql2
  encoding: utf8
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: root
  password:
  host: localhost
```

## 対策
以下のように修正すると通るようになる。

```yml:database.yml
default: &default
  adapter: mysql2
  encoding: utf8
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: root
  password:
  host: <%= ENV['DB_HOST'] %> ←を修正
```
hostを環境変数を参照するように設定。

```yml:config.yml
version: 2
jobs:
  build:
    docker:
      - image: circleci/ruby:2.5.1-node-browsers
        environment: 　　　　　　　　　　　　　　　　←を追加
          DB_HOST: 127.0.0.1 ←を追加
      - image: circleci/mysql:5.7
```
CircleCiの設定ファイルに`database.yml`で修正した環境変数を追加する。
Raspberry Pi 3 Model B+のSDカード相性問題（追記あり）

#本体
[Raspberry Pi 3 Model B+ element14 スターターセット BASIC]
(https://www.amazon.co.jp/dp/B07BHZP92R)

#動作しました(2018/06/25追記)
コメントにてフォーマット形式についてご指摘いただきました。
>SDHC(32GB以下)では通常FAT32でフォーマットされますが、SDXC(32GBよりも大きいサイズ)は、exFATが標準のフォーマットになってます。

>らずぱいでのNOOBSはexFATでは起動できないので、FAT32でフォーマットする必要があります。

フォーマット形式について意識していなかったので再度フォーマットを実行。
使用ソフトは[SD Memory Card Formatter](https://www.sdcard.org/jp/downloads/formatter_4/)です。

![スクリーンショット 2018-06-25 3.19.15.png](https://qiita-image-store.s3.amazonaws.com/0/262657/ecfe2b8b-d38c-e6f4-65a2-c45f05095947.png)

案の定exFAT形式でフォーマットされていました。
Mac標準のディスクユーティリティにてフォーマット。

![スクリーンショット 2018-06-25 3.39.09.png](https://qiita-image-store.s3.amazonaws.com/0/262657/b2dda7c5-234b-c73b-7ec6-a3a3502658a3.png)

無事**二枚とも起動確認できました。**

いくつかのサイト[SD Memory Card Formatter](https://www.sdcard.org/jp/downloads/formatter_4/)が推奨されています。
SDXC(32GBよりも大きいサイズ)利用者は注意してください。


#~~動作しなかったSDカード~~
なし

#動作したSDカード
[Samsung microSDカード32GB EVOPlus Class10 UHS-I対応 Nintendo Switch 動作確認済 正規代理店保証品 MB-MC32GA/ECO]
(https://www.amazon.co.jp/gp/product/B06XSV23T1)

[【Amazon.co.jp限定】シリコンパワー microSDXC128GBNintendoSwitch 動作確 認済 class10 UHS-1 対応 最大読込 75MB/s アダプタ付 永久保証]
(https://www.amazon.co.jp/dp/B01M5GMU3F)

[キングストン Kingston microSDXCカード 64GB クラス 10 UHS-I 対応 アダプタ付 SDC10G2/64GB 永久保証]
(https://www.amazon.co.jp/dp/B01BBRNKKW)

#詳細
SDカードを初期化後[NOOBS最新版](https://www.raspberrypi.org/downloads/noobs/)をコピー
~~動作しなかった二枚のSDカードは赤RED点灯したままでした。~~

#画像追加(2018/06/25)
<img src="https://qiita-image-store.s3.amazonaws.com/0/262657/947b11be-15f1-91b0-4996-87c220c8a91c.jpeg" width=50%>

所有の証明として。
Spring Boot(1系) + spring-security-oauth2 + Redis Session + Heroku で SerializationException

Spring Boot(1系) + spring-security-oauth2 + Redis Session の組み合わせで Heroku上で動かすと SerializationException が発生した。
(1インスタンスなら起きない。複数インスタンスの場合のみ)

## 原因と解決策

ちなみにSpring Boot 2系(Spring5系) を使っている場合は Spring Security5系 を使用すれば良いらしい。(試してない)
Spring Boot 2系(Spring5系)に上げられるならその方がいい。

問題はどうやら spring-security-oauth2 にあるっぽい。
ググって出てきた解決策は 2つ

1. SerializationException が起きたらRedis該当キーを消す。([id:katsu68 さんのブログ](http://katsu-tech.hatenablog.com/entry/2017/10/18/220901))
2. スティッキーセッションにする([Heroku スティッキーセッションの設定](https://devcenter.heroku.com/articles/session-affinity))

1だけの場合、Heroku上だと頻繁にSerializationExceptionが起きるため、ログイン状態をほとんど維持できないことになる。
２だけの場合だと複数インスタンスにしている意味が薄いし、再起動が走るとやはりSerializationExceptionが起きる。

そのため両方の対応を行い対応した。
デプロイ時とHerokuのインスタンス再起動時だけセッション切れするがしばらくはこれで運用することに。

しかし、Herokuの再起動はいつされるかわからない(任意のタイミングで再起動することによりある程度はコントロールできる)
頻繁にログアウトされるのはユーザにとってもストレス。

## ライブラリを作った

それを回避するため一部処理を自分で作ることにした。
また、それをライブラリとして公開することにもした。 -> [作ったライブラリ](https://github.com/ap-com/spring-oauth2-serializable)

```xml
		<dependency>
			<groupId>jp.co.ap-com</groupId>
			<artifactId>spring-oauth2-serializable</artifactId>
			<version>0.0.2</version>
		</dependency>
```

spring-security-oauth2 の設定が済んでいるならばソースコードは`@EnableOAuth2Sso` を `@EnableOAuth2Serializable` に変えるだけ
ただし、一箇所でも `@EnableOAuth2Sso` か `@EnableOAuth2Client` が残ってるとダメ。

デモ用アプリケーションはこちら
https://github.com/apc-hattori/spring-oauth2-demo

spring-security-oauth2だけのときから修正する際の差分はこちら
https://github.com/apc-hattori/spring-oauth2-demo/compare/use-spring-security-oauth2...master
【Ruby】メソッドの戻り値ってなんだ<2>

#Rubyの戻り値について追加演習
>サイコロ2つコロコロして、合計が7以上なら次に進めますよ、7未満ならゲームオーバーよ、のシーンを切り出します。

```ruby:
#def メソッド名でメソッドを定義
def over_sum?(higher)
#return 値で値（higher >= 7)を返す
  return higher >= 7
#defメソッドはここでおしまい
end

#if文の条件式で、メソッドを呼び出す
if over_sum?(11)
#(ここに入れた数字)次第で結果が分かれる
  puts "next challenge!!"

else
  puts "gameover"

end

```

これ使い方合ってるのかなあ
データーサイエンティストになるためには、、、講座を受けてきた。

データーサイエンティストになるためにはどうすればいいのかという議題の講座（無料）をconnpass(https://connpass.com) から予約して受けてきました。
初投稿ですが、そのメモを軽くまとめて書き出していきます。駆け出しの文なので、ご容赦を。。。


●最短でAIを学ぶ勉強法、キャリアの始め方
・実経験を積みながらが良さそう
・なりたくても転職できない→実務経験者募集ばかり
・kaggle 
　　一般企業の依頼案件があり模擬実務ができる。（賞金付き）
　課題設定済みであり、前処理、特徴量エンジニアリング　モデリングチューニング交差検証と幅広くの経験が積める。
　ここからよいものを作った、結果を出した人を採用する企業も多数いるとか。


●データサイエンティストが必要なスキルセット
・数学
　→東京では数学をプログラムに入れるIT系教育企業がある。
・Pythonのみではダメ
　→Linux Bash SSH MySQL Json encoding Git
　　機械学習、統計などなど
　求められるものは増えていきそう



●データマイニング業界の現状、データサイエンティストという職
　・データサイエンティストは今、人足らず→社外委託はありか？→
　社内解決が理想　仕事内容を知らないと工数増加するケースが多い。

　・倫理観は？将来的に機械学習が発展するが、ブラックボックス化が残った場合、例えば食品、薬品にその技術を導入した時の倫理的影響は？
	→研究されている。今年の人工知能学会でも議論されている。企業も調査など学習が大事
　・データサイエンティスト　しばらく好景気（給料高め）



以上後は在り来たりなお話でした。

今回私はconnpassというイベント参加、作成できるサイトを用い、講座を受けました。IT系の勉強でが様々できるイベントが公告されています。
無料のものもあるのでぜひ参加してはどうでしょうか。
UrlFetchの制限が緩和されました

2018年6月19日のアップデートでUrlFetchの100MB/dayの制限（GET）がなくなり、50MB/call（GET, POST）になりました。これにより、例えば、外部のURLを使ったファイルの転送が楽になります。個人的に非常に有益なアップデートでしたので、こちらでも報告させていただきました。お役に立ちますと幸いです。

参考1 https://developers.google.com/apps-script/releases/#june_19_2018
参考2 https://developers.google.com/apps-script/guides/services/quotas#current_limitations
参考3 https://plus.google.com/+RomainVialard-public/posts/HiP1nNS75Fm
Chromeでunknown error: call function result missing 'value' となった場合、WebDriverを更新すると解決するかもしれない

以前、CapybaraとSeleniumで簡単なスクレイピングのデモを作成した。

https://github.com/tamanobi/capybara-beginner-with-chrome

久しぶりに動かしたら、JavaScriptでスクロール処理実行時にRubyが実行時エラーとなって動かなかった。

# 出力されたエラー

```
unknown error: call function result missing 'value'
```

## ChromeDriverのバージョン
```
$ /usr/local/bin/chromedriver --version
ChromeDriver 2.31.488774 (7e15618d1bf16df8bf0ecf2914ed1964a387ba0b)
```

# WebDriverを更新したら直る
どうやら、 新しいChromeに対して古いWebDriverを利用していると実行時エラーになるようだった。

source: https://github.com/webdriverio/webdriverio/issues/2631

私の環境ではChromeDriverは、 `/usr/local/bin/chromedriver` にあったため、一度削除し最新版に更新した。
最新版のChromeDriverは http://chromedriver.chromium.org/downloads からダウンロードできる。

## 最新版に更新
2.40にバージョンアップすることで動作するようになった。

```
$ /usr/local/bin/chromedriver --version
ChromeDriver 2.40.565386 (45a059dc425e08165f9a10324bd1380cc13ca363)
```
trelloでリスト(リスト内カード含む)をコピーする。

#はじめに
かなり後半になってしまって気づいてしまったワニですが、右クリックメニューでリスト(カードを含む)のコピーは出来ますワニ🐊なので、このスクリプトは完全な下位互換ワニ。。

![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/211061/95287dc9-cf01-8be6-2bf3-530e0c4a86b4.png)
（これのことね！）

#やったこと
カードを含むリストの完全なコピーを作成してみたかったそれだけワニ🐊

#完全な下位互換たる所以

・カード情報は一部しかコピーできません。ワニがサボっているだけです。。
・コピーされたリストは"コピー"という名前になります。右クリックメニューはちゃんとコピー元のリスト名です。

#GAS作成の上で必要なもの
・trelloのAPIキー
　https://trello.com/app-key
・trelloのトークン
　https://trello.com/app-key
　ページ内の"あなたは手動でTokenを作られます"のToken部分のリンクをクリック→認証
・カード一覧を取得したいboardID
　boardIDは実際にボードを開いたアドレスの以下XXXXXXの部分になります。
　https://trello.com/b/XXXXXX/YYYYYY
・コピー対象のリストID
　このあたりの記事を参考に調べましょう。
　https://tonari-it.com/gas-get-trello-card-list/

#ソースコード
これがコードワニ🐊

```GASのソース.
function myFunction() {
  var trelloKey   = "trelloのAPIキー";
  var trelloToken = "trelloのトークン";
  var trelloBoard = "コピー操作を行うボードID";
  var trelloCopyList = "コピー対象のリストID";

  //　カード情報をjson形式で取得
  var boardUrl = "https://api.trello.com/1/boards/" + trelloBoard + "/lists/?key=" + trelloKey + "&token=" + trelloToken;
  var listUrl = "https://trello.com/1/lists/"+trelloCopyList+"/cards?key="+trelloKey+"&token="+trelloToken;
  var getListRes = UrlFetchApp.fetch(listUrl, {'method':'get'});
  var getListJson = JSON.parse(getListRes.getContentText()); 

  //　作成するリスト情報を設定
  var setListData = {
    'method' : 'post',
    'muteHttpExceptions' : true,
    'payload' : {
      'name' : "コピー",
      'pos' : 'bottom'
    }
  }
    
  // 作成したリストのリストIDを取得する
  var setListResponse = UrlFetchApp.fetch(boardUrl, setListData);
  var setListJson = JSON.parse(setListResponse.getContentText());
  var setListId = setListJson['id'];

  // 追加したリストにカードを足していく  
  var cardUrl = "https://trello.com/1/cards?key="+trelloKey+"&token="+trelloToken;

  for(var i = 0; i < getListJson.length; i++)
  {

    //　作成するリスト情報を設定
    var setCardData = {
      'method' : 'post',
      'muteHttpExceptions' : true,
      'payload' : {
        'name'      : getListJson[i]['name'],
        'desc'      : getListJson[i]['desc'],
        'due'       : '',
        'idList'    : setListId,
        'urlSource' : ''
      }    
    }    

    // カード作成   
    UrlFetchApp.fetch(cardUrl, setCardData);
  }  

}

```

#出力結果
![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/211061/992b7425-e48d-53d8-6f7f-b1eb9e15b729.png)
（このように"普通のハンバーガー"リストをコピーすることが出来るワニ🐊）

#所感
・たとえ車輪の再発明となろうとも、ソースを公開することに意味があると思うワニ🐊
・この記事を参考にさせて頂きましたワニ🐊
　https://qiita.com/Andysumi/items/eb281c3f0d4d30aa8a88
APIKitでMultipartFormDataBodyParametersを用いてimageをPOST/PATCHする際はvalue:でなくdata:

# MultipartFormDataBodyParametersでハマった箇所
他の箇所からコピペして使ってたが、目が腐ってるせいで`value:`と`data:`の違いがなかなか見つけられず時間を溶かしてしまった。。
一応自分用メモとして残しておく。

# imageを渡す場合
第一引数が`data:`であることに注意。`try!`いらない。

```swift
params.append(MultipartFormDataBodyParameters.Part(
                    data: imageData,
                    name: "image",
                    mimeType: "image/png",
                    fileName: "image.png"))
```

# image以外の場合
第一引数は`value:`である。`try!`いる。

```swift
params.append(try! MultipartFormDataBodyParameters.Part(
                    value: value,
                    name: "value_name"))
```
プログラミング初心者が往くwebアプリ開発への道

皆さん初めまして。まずは簡単な自己紹介を

名前:refine4
年齢：23
職業：大学生
専攻：生物学(ミクロ)
PC:windows
プログラミング歴：１ヶ月
言語：ruby


プログラミングを始めたきっかけは、大学３年生の時に初めて自分用のPCを購入したことです。ゲームやtwitterなどで遊んでいるときに、PCを使って何か作りたいと思ってrubyの勉強を始めましたが、一瞬で挫折。大学４年になってもう一度チャレンジしてみようと思い、勉強を再開しました。

今はドットインストールを利用して基礎の勉強苦戦しながら学んでいます

最終的には、自分の気に入った画像をSNSから集めて保存してくれるアプリを製作できたらいいなと思っています。

２年でにアプリを完成及び公開することを目標として気長にやっていこうと思うのでよろしくお願いします
iOSアプリ 2018年7月以降に追加される審査基準について

2018年7月以降申請される全てのiOSアプリでは、下記要件が求められている。

* iPhone Xのディスプレイサポート
* iOS11 SDKでビルド

# iPhone Xのディスプレイサポートとは

* 上下の黒帯がないこと（と考えられている）  
Xcode8以下でビルドすると、iPhoneXでは上下に黒帯ができてしまう。
* SafeAreaにアプリが表示されていること  
SafeAreaとは画面の上部・下部を除いた領域  
iPhone X登場以前の実装では、SafeAreaの外にアプリの要素がはみ出す挙動になりうる。  
cf. https://techmo-monkey.com/app-develop-iphonex-safearea/

# iOS11 SDKでビルドするということ

* Xcode9以降でないとiOS11 SDKが利用できないため、Xcodeは9に上げる必要がある。
* Xcode9はDeployment Targetの指定が8以降となるためiOS6/7のビルドはできなくなる。  
※Xcode本体とサポートするSDKとかは別々に管理できればいいのに、と思っているがそうはいかないみたい。新しいOSバージョンに対応するためには、Xcode本体のバージョンアップが必要な設計思想。
VbMeCab:形態素解析エンジンmecabをvb.net に移植

形態素解析エンジンmecabをvb.net に移植した VbMeCab 0.03を公開します。

公開場所は GitHub（[https://github.com/k-ayaki/VbMeCab/](https://github.com/k-ayaki/VbMeCab/)）と
OSDN([https://github.com/k-ayaki/VbMeCab/](https://ja.osdn.net/projects/vbmecab/))、
単純な移植なので、ライセンス条件はmecabおよびNMeCabと同様です。

いちばんの元となっているのが、C#で記載されたNMeCabです。ソースコードの構成が粗同一なところからもお分かりとおもいます。NMeCab版とのちがいは、ポインタ操作をすべて配列操作に書き換えたところです。つまり、少しだけNMeCabよりも遅く、代わりにNMeCabよりも少しだけ可読性がよい。

つまり、このソースプロジェクトの意味は、MeCabを更に他の言語に移植するための土台であります。
自分自身がMecabのソースコードを読む際の副産物です。

７月３日追記：VbMecabのPerformanceTest.exe の実行結果のキャプチャをとりました。
もっとも一般的なMecabの出力は、Parse(Lattice)とおもいますが、約1.2秒掛かっています。
![PerformanceTest.png](https://qiita-image-store.s3.amazonaws.com/0/266273/392c5aad-f2c9-00b2-cd9e-05636c3e01e3.png)

NMecabとのパフォーマンスの差異を示すために、NMecabの実行結果のキャプチャをとりました。
Parse(Lattice)の出力に、約0.9秒掛かっています。これがポインタ操作と配列操作の速度差です。
![NMecabPerformaceTest.png](https://qiita-image-store.s3.amazonaws.com/0/266273/c7177554-3afb-1589-5107-eb54a7e33b05.png)
【Xcode】Embedded Binaries と Linked Frameworks and Libraries の違いについて

# これは？
![スクリーンショット 2018-06-24 15.38.51.png](https://qiita-image-store.s3.amazonaws.com/0/153095/dbffc3e9-bab5-911f-c215-d15b80a5eca9.png)

↑Generalタブの下の方にあるこいつらの違いについての備忘録

[FirebaseSDKをCarthageで入れよう](https://github.com/firebase/firebase-ios-sdk/blob/master/Carthage.md)としたら詰まったので...

# その前に
まずは `StaticLibrary` と `DynamicLibrary` と `Framework` の違いについておさらい

## StaticLibrary（xxxx.a）

- コンパイル時に静的に組み込まれるライブラリ
- コンパイル時にリンクされるため、その分アプリケーションのサイズは大きくなる

## DynamicLibrary（xxxx.dylib）
- ランタイム時に実行されるライブラリ
- 呼び出されて初めてコードが読み込まれるためアプリケーションのサイズは小さくて済む

## Framework（xxxx.framework）
- Bundleの一種（と考えた方がわかりやすい）
- Libraryは画像やXibを含むことができないが `Framework` は可能
- `StaticFramework` は `StaticLibrary` を、 `DynamicFramework` は `DynamicLibrary` を内包する

# 本題
それでは、`Embedded Binaries` と `Linked Frameworks and Libraries` の違いについて見ていきます

## Embedded Binaries
- アプリケーションのBundleに組み込まれるバイナリ
- 主にサードパーティ製の `Framework` をここに突っ込む

## Linked Frameworks and Libraries
- ビルド時にアプリケーションにリンクされる `Framework` および `Library`
- アプリケーション内で `Framework` および `Library` のAPIを参照する場合はこっちに設定していく

例えば、サードパーティ製の `Framework` を導入する時の流れとしては
1. `Embedded Binaries`に突っ込む
2. `Linked Frameworks and Libraries`に設定する

となりますね。
（＊ `Embedded Binaries` に突っ込むだけでXcodeが `Linked Frameworks and Libraries` にも追加してくれますが）

# 詰まりどころ

`Framework` が **StaticFramework** の場合、`Embedded Binaries` に突っ込む必要はなく、`Linked Frameworks and Libraries` の設定のみでOKです

なぜなら、
> コンパイル時に静的に組み込まれるライブラリ

とあるように、Embedする必要がないからですね

（自分はFirebaseSDKが `StaticFramework` であることを失念しており結構時間を持ってかれました）
node.js から mongodb 3.0.10 で繋ぐ with async / await

node.js から npm の mongodb 3.0.10 で mongo に async / await を使って接続する方法のメモです。
検索で 2.2 系のドキュメントが上位に来るのですが、 2.2 系と 3.0 系で API が変わっていて少しハマったので書き留めます。

- mongod: 3.6.5
- (npm) mongodb: 3.0.10 ([node-mongodb-native](https://github.com/mongodb/node-mongodb-native))

# インストール

手元の mac に入れるという想定で mongodb のインストール

```bash
brew install mongodb
```

npm パッケージインストール

```bash
yarn add mongodb
yarn add --dev babel-cli babel-preset-es2015
```

.babelrc

```javascript
{ "presets": ["es2015"] }
```

# サンプルコード

[mongoDB のチュートリアル](https://mongodb.github.io/node-mongodb-native/3.0/quick-start/quick-start/)にはコールバックを使った方法が書かれてますが、実は promise を返してくれるのでそっちを使ったほうがスッキリ書けます。
es2015 の async / await を使ったサンプルコードがこちら。
一件だけドキュメントを挿入する接続テストを行います。

```javascript
import mongodb from 'mongodb'

const HOSTNAME = 'mongodb://127.0.0.1:27017'
const DB_NAME = 'test_database'
const COLLECTION_NAME = 'test_collection'

const main = async () => {
  const client = await mongodb.MongoClient.connect(HOSTNAME)
  const db = await client.db(DB_NAME)
  const collection = db.collection(COLLECTION_NAME)
  await collection.insert({ foo: "bar" })
  client.close()
}

main()
```

## 実行結果

実行します。

```bash
babel src -d dist
node dist/test.js
```

結果確認します。

```
$ mongo

> show databases
......(略)
test_database  0.000GB

> use test_database

> db.test_collection.find()
{ "_id" : ObjectId("5b2f5118b0284648fa8df6b7"), "foo" : "bar" }
```

オッケー！

# 関連

関連: [Node.jsからMongoDBに接続してみる](https://qiita.com/one-kelvin/items/c0c036f774f0b3b98ae5)
参考: [mongoDB quick start (node.js driver 3.x)](https://mongodb.github.io/node-mongodb-native/3.0/quick-start/quick-start/)
RQをsystemdでデーモン化

#RQをsystemdでデーモン化
分かる人には当たり前すぎるが、一部のわからない人のために寄稿（再投稿）

##環境
ubuntu 16.04LTS   

---
[**Python クローリング&スクレイピング**](https://www.amazon.co.jp/Python%E3%82%AF%E3%83%AD%E3%83%BC%E3%83%AA%E3%83%B3%E3%82%B0-%E3%82%B9%E3%82%AF%E3%83%AC%E3%82%A4%E3%83%94%E3%83%B3%E3%82%B0-%E3%83%87%E3%83%BC%E3%82%BF%E5%8F%8E%E9%9B%86%E3%83%BB%E8%A7%A3%E6%9E%90%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AE%E5%AE%9F%E8%B7%B5%E9%96%8B%E7%99%BA%E3%82%AC%E3%82%A4%E3%83%89-%E5%8A%A0%E8%97%A4-%E8%80%95%E5%A4%AA/dp/4774183679)にてsupervisorでRQをデーモン化していたが

supervisorが上手く動かなかったためsystemdで実装


```service:rq.service

[Unit]
Description = rq daemon

[Service]
WorkingDirectory=/home/pomcho555/project
Environment="PATH=/home/pomcho555/project/myprojectenv/bin"
ExecStart = /home/pomcho555/project/myprojectenv/bin/rq worker
Restart = always
Type = simple

[Install]
WantedBy = multi-user.target
```

注意点は3つ    
1. rq workerの本体の**絶対パス**を指定して実行してやること
2. Environmentはpythonの実行環境を指定する、virtualenvを使っている場合はそのパス
3. WorkingDirectoryを実行したいジョブ(sample_task.pyとか)と**同じディレクトリ**にすること

2を怠るとrqは起動してもジョブが渡せない（違う階層にいる）ので注意

#実行
```sudo systemctl start rq```   

#確認
```sudo systemctl status rq```   

Active: active (running)がでたらOK

#おまけ
RQ用ダッシュボードモジュール
[rq-dashboard](https://github.com/eoranged/rq-dashboard)は運用が捗るのでオススメ
td-agent | in_exec プラグインでコマンド or スクリプト実行結果を入力として扱う

in_exec プラグインでは、指定時間毎にスクリプトを実行して、その結果を入力として扱うことが出来る。

# 設定

設定ファイルに以下を記述。

例として `echo` コマンドでJSONを吐き出して入力として扱う。
これをtd-agent側に標準出力させる。


```conf:/etc/td-agent/td-agent.conf

<source>
  @type exec
  format json
  tag in_exec_test
  command echo '{ "key" : "vallue" }' # 実行するコマンド
  run_interval 1s # 1秒ごとに実行
</source>

<match in_exec_test>
  @type stdout
</match>

```


## 結果

1秒ごとに結果が出力される。

```
$ td-agent

2018-06-24 08:07:58 +0000 in_exec_test: {"key":"vallue"}
2018-06-24 08:07:59 +0000 in_exec_test: {"key":"vallue"}
2018-06-24 08:08:00 +0000 in_exec_test: {"key":"vallue"}
```

# 補足

ruby などのスクリプトで JSON を返すようにしておいてそれをコマンド実行すれば、何か柔軟な結果を返すことが出来る。

# 環境

- td-agent 0.12.40
- Ubuntu 16.04.4 LTS (Xenial Xerus)
- Docker version 18.03.1-ce, build 9ee9f40

# 参考


- [Edit "td-agent | in_exec プラグインでスクリプト実行結果を" - Qiita](https://qiita.com/drafts/09f8a4446a65584f003e/edit)
- [td-agent をインストールして debug してみる ( docker + ubuntu ) - Qiita](https://qiita.com/YumaInaura/items/07ffeb9f58c58515b0fe)








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
文系人間がJDLA Deep Learning for GENERAL 2018#1を受けてみた話

#この記事について
2018.6.16に実施された日本ディープラーニング協会が実施しているDeep Learning for GENERAL 2018 #1（通称 G検定）を受験した感想、事前準備等について書いていきたいと思います。

#私のスペック
アラサー会社員。文系学部卒からの財務経理職を経験してきた関係で、特にエンジニアリングのバックグラウンドはないです。プログラミング系はJavascript,Rを少々といったところ。Excel VBAは不自由なく使える程度には覚えています。

#事前準備
JDLAの試験要綱にあった参考図書を一通り読むことにしました。その他、他の記事等で沢山取り上げられている、
Courseraの machine learningを受講しました。

#試験について
日本時間午後1時から3時。私は仕事の都合でスイスから受験したので、時差の関係で午前6時試験開始orz。午後1時10分以降は受験を開始できなくなるので、時間どおり起きるのが最初の難関でした。

試験時間120分のうちに問題100問、回答233問という構成だったので、知識があるかどうかの勝負、さらには固有名詞を知っていないとどうにもならない問題がいくつかあるだろうと思っていました。

『人工知能は人間を超えるか』『AI白書2017』に出てくる固有名詞はすぐに思い出せるようにしたほうがいいだろうと思い、両文献に出てきた人物・固有名詞（製品名・会社名・政策の名前）に関わる事項はexcelファイルに書き出してファイルを開きながら試験に臨みました。実際に固有名詞知ってるか問題もそれなりに多くあったので、省時間になりました。パディング&ストライド問題なども、いちいち考えたくなかったので、計算式をセットしておきました。

#結果
無事合格してました。受験者の50%以上が受かっていたみたいですが、どこまでの準備が必要でどの程度正解かする必要があるのかわかりませんが、いい勉強になりました。
合格者の会が抽選制で7/4にあるとのことなので、もし行けたら楽しみたいです。
今後は興味はあるけど手を出せなかったdeeplearning.aiにも挑戦したいと思います。
EC2　MySQL 初期設定　root にパスワードの設定

##前提条件
EC2にMySQLのインストールがすんでいる

##設定
```
[ec2-user@ip-・・・・・ ~]$ sudo /etc/init.d/mysqld start
　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　[OK]
```
起動

```
[ec2-user@ip-・・・・・ ~]$ sudo mysql_secure_installation
NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MySQL
      SERVERS IN PRODUCTION USE!  PLEASE READ EACH STEP CAREFULLY!
In order to log into MySQL to secure it, we'll need the current
password for the root user.  If you've just installed MySQL, and
you haven't set the root password yet, the password will be blank,
so you should just press enter here.
Enter current password for root (enter for none): 
```
**「Enterキー」**

```
OK, successfully used password, moving on...
Setting the root password ensures that nobody can log into the MySQL
root user without the proper authorisation.
Set root password? [Y/n] y
```
パスワードをセットするか聞かれるから**「yキー」**から**「Enterキー」**

```
New password: 
Re-enter new password: 
Password updated successfully!
Reloading privilege tables..
 ... Success!
```
設定するパスワードを入力して**「Enterキー」**
確認で求められるから、もう1度、入力

```
Remove anonymous users? [Y/n] y
 ... Success!

Disallow root login remotely? [Y/n] y
 ... Success!

Remove test database and access to it? [Y/n] y
 - Dropping test database...
 ... Success!
 - Removing privileges on test database...
 ... Success!

Reload privilege tables now? [Y/n] y
 ... Success!
Cleaning up...
```
上から、
 - 匿名ユーザーを削除するかどうか。
 - rootユーザーのリモートホストからのログインを無効化するかどうか。
 - testデータベースを削除するか。
 - これらの変更を即座に反映するか。
全部問題無いので**「yキー」**から**「Enterキー」**

```
Thanks for using MySQL!
```
設定完了


##ログイン
```
[ec2-user@ip-・・・・・・ ~]$ mysql -u root -p
Enter password: 
```
先ほど設定したパスワードを入力

```
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 11
Server version: 5.5.60 MySQL Community Server (GPL)

Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>
```

実際に入れたら成功
Excel方眼で入力画面を作成する

# Excel方眼で入力画面を設計

EXCEL方眼で以下のような画面設計をします。テーブル(KJ_)にデータを保管するとします。
NC旋盤のマクロ番号をキーとします。


![情報入力.png](https://qiita-image-store.s3.amazonaws.com/0/184069/cc4ae06f-9bd3-b8ef-1bdc-0b148914639b.png)



# データのロード、セーブマクロを定義する

テーブル名(R1N),テーブル行数(M),方眼位置(R2N)を引数として、マクロを定義します。
テーブルの項目と、方眼位置を一対一に対応させます。

```vba
Sub DGET(M, R1N, R2N)
    Range(R2N).Value = DI(Range(R1N), M)
End Sub

Sub DSET(M, R1N, R2N)
    Range(R1N).Offset(M - 1, 0).Resize(1, 1) = Range(R2N).Value
End Sub

Sub LOAD()
    If Not (ActiveSheet.Name Like "情報入力") Then Exit Sub

    Dim I: I = MI(Range("KJ_[O]"), Range("E2").Value)
    If I = "" Then Exit Sub
    
    Call START_MANUAL

    Call DGET(I, "KJ_[製品名]", "K2")
    Call DGET(I, "KJ_[材料]", "Z2")
    
    Call START_AUTO
End Sub

Sub SAVE()
    If Not (ActiveSheet.Name Like "情報入力") Then Exit Sub

    Dim I: I = MI(Range("KJ_[O]"), Range("E2").Value)
    If I = "" Then Exit Sub
    
    Call START_MANUAL
    
    Call DSET(I, "KJ_[製品名]", "K2")
    Call DSET(I, "KJ_[材料]", "Z2")
 
    Call START_AUTO
End Sub
```

ちらつきを無くすために、自動計算等を停止し、画面が更新した後に元に戻します。

```vba
Sub START_MANUAL()
    Application.EnableEvents = False
    Application.ScreenUpdating = False
    Application.Calculation = xlCalculationManual
End Sub

Sub START_AUTO()
    Application.EnableEvents = True
    Application.ScreenUpdating = True
    Application.Calculation = xlCalculationAutomatic
End Sub
```
UbuntuでXRDPやVNC設定の際に役立つコマンド

私がXRDPやVNCサーバーのことで試行錯誤している中で、頻繁に使ったコマンドをまとめました。

#デスクトップマネージャー関連

```
sudo apt-get purge lightdm
sudo apt-get install lightdm
```

インストールするとlightdmとgdmのどちらをインストールするか選択画面が表示されます。

#システム修復

```
sudo apt-get update
sudo apt-get -f install
```

#XRDP再起動

##停止

```
sudo service xrdp stop 
```

または、

```
sudo systemctl stop xrdp
```

##起動

```
sudo service xrdp start　
```
##再起動

```
sudo service xrdp restart　
```
または

```
sudo systemctl restart xrdp
```

#VNC関連
##VNCサーバー設定&起動

```
vncserver
```

画面番号を指定して起動出来る。

##VNCサーバー停止

```
vncserver -kill :1
```

数字は、画面番号


##VNCサーバー起動

```
vncserver :1　
```

数字は、画面番号


#ユーザー切り替え

```
su - name
```

-でPAHTなど引き継ぐ


#ユーザー追加

```
adduser　user_name
```

adduserコマンドは、ユーザーを追加した時に、HOMEディレクトリも追加されます。

#ユーザーをsudoグループに追加

```
gpasswd -a user_name sudo
```

#ユーザーに、管理者権限を付ける

```
sudo usermod -aG sudo USER_NAME
```

-aをつけ忘れると上書きになってしまうので、-aを忘れ無いこと。
よく使う複雑なExcel関数

# EXCEL関数

よく使うExcel関数を備忘録として残します。

## シート名・ファイル名を表示する
### シート名
~~~
=RIGHT(CELL("filename",A1),LEN(CELL("filename",A1))-FIND("]",CELL("filename",A1)))
~~~ 

### ファイル名
~~~
=MID(CELL("filename",A2),FIND("[",CELL("filename",A2))+1,FIND("]",CELL("filename",A2))-(FIND("[",CELL("filename",A2))+1))
~~~

参考）
http://www.cando.co.jp/column/column_14.html


## 別シートにジャンプする（ハイパーリンク）
~~~
=HYPERLINK("#シート名!A1","リンク名")
~~~


## 別シートのセルを参照(INDIRECT)
~~~
=INDIRECT("'シート名'!A1")
~~~
HipChat クライアントアプリをEnterで改行できるようにする


##目的

HipChatの[クライアントアプリ（Windows版）](https://ja.atlassian.com/software/hipchat/downloads) でEnterキーは、送信に割り当てられている。
改行しようとして途中送信してしまうことがよくあるので防ぎたい。

##方法

アプリケーションのフォルダにある「hipchat-client.js」を書き換える。
例）C:\Program Files (x86)\Atlassian\HipChat4\localweb\hipchat-client.js

**1. hipchat-client.jsから以下の記述を見つける**

```javascript:hipchat-client.js
if (evt.keyCode === _utils2.default.keyCode.Enter && !evt.shiftKey) {
```

**2. evt.shiftKey のエクスクラメーションマークを外す**

```javascript:hipchat-client.js
if (evt.keyCode === _utils2.default.keyCode.Enter && evt.shiftKey) {
```

**3.クライアントアプリ起動中の場合は再起動する**

※アプリのアップデートなどでhipchat-client.jsの内容が更新されると改行キーが戻ってしまうので注意
Railsルーティングでnamespaceを使った時のform_for

```ruby:config/routes/rb
namespace :admin do
    resources :posts
end
```

```slim:_form.html.slim
= form_for [:admin, @post] do |f|
    •••
```

例えば，`app/views/posts/new.html.slim` をレンダリングした場合は次のような HTML が生成される．

```html
<form class="new_post" id="new_post" action="/admin/posts" accept-charset="UTF-8" method="post">
    •••
</form>
```
LinuC(LPIC)101範囲Q&A:デフォルトのランレベル変更時の実行コマンド

知人からLinuC101範囲について質問されたのでまとめました。

#デフォルトのランレベル変更時の実行コマンドについて
Ping-Tの問題ID：[22781][1]について質問を受けました。問題の概要と答えは以下の通りです。

```text:問題
次回起動時にグラフィカルモードで起動するにはどのコマンドを実行すればよいか(選択式問題)。
```
```text:答え
rm -f /etc/systemd/system/default.target
ln -s /lib/systemd/system/graphical.target /etc/systemd/system/default.target
```
ふんふんなるほどね
あんまり実務ではやらないんじゃないかな？と思うけどね

##知人の疑問①：これは何をしてるの？
**今あるファイルの削除**
まず、現在あるシンボリックリンクファイル(/etc/systemd/system/default.target)を削除します。

```shell-session
# rm -f /etc/systemd/system/default.target
```
(fオプションは確認せずに全部消しちゃうので、使わない方がいいと思います)
</br>
</br>
**新しいシンボリックリンクの作成**
次に、新しいシンボリックリンクを作成します。
シンボリックリンクのリンクは /lib/systemd/system/graphical.target
リンクファイル名は /etc/systemd/system/default.target
であり、

シンボリックリンク作成コマンドの書式は
>ln -s {オリジナルファイル名} {リンクファイル名}

ですので、以下のコマンドでシンボリックリンクを作成します。

```shell-session
# ln -s /lib/systemd/system/graphical.target /etc/systemd/system/default.target
```
これで、コンピュータが /etc/systemd/system/default.target を読み込んだ時に、グラフィカルターゲットの設定ファイル(/lib/systemd/system/graphical.target) を参照して起動時の動作を行うようになります。


##知人の疑問②：なんでそんなことするの？もっと簡単に説明して
**※以下の説明はざっくり説明するために正確ではない点がありますがご容赦ください。**
コンピュータは起動するときに「何モードで起動すればいいのかな？」と指示書を読みます。
起動時のモードを変えてもらうには、指示書の中身が書き換わっていればよいわけです。

コンピュータが迷わないように、指示書は決められた引き出しに入れておくことになっています。その引き出しには指示書を1つしか入れることができません。
ですので、まずは引き出しに入っている今までの指示書を消して、
次に新しい指示書を作って引き出しに入れる、という作業が必要なのです。

#以上です。簡単に説明するの難しいなあ
また質問されたら記載していこうと思います。


[1]:https://ping-t.com/mondai3/mondais/view/22781
athrill(アスリル)機能マニュアル(問題の早期検出機能)

#概要
[athrill(アスリル)](https://qiita.com/kanetugu2018/items/cf3dea16710a3f0737e8)の問題早期検出機能について解説します．

#問題早期検出機能
athrillはV850のCPU命令をシミュレーションしており，プリミティブなレベル(CPU/メモリ/デバイス)で，ソフトウェアの動きを監視できます．そのため，仮想環境の強みを活かした問題の早期検出ができると考えています．現状は，メモリ不正アクセス検出機能が数個ある程度ですが，機能拡張を実施予定です．

##警告通知機能
本機能は，athrillが異常があると思われるコードを実行した場合に警告表示する機能です．

###未初期化変数のREADアクセス
以下は，グローバル変数 gl_variable が未初期化のまま main関数で値参照しようとしたプログラムコードです．

```
static int gl_variable __attribute__ ((section(".bss_noclr")));
       :
int main(void)
{
	if (gl_variable == 0) {
		timer_init();
	}
        :
}
```

これを，athrillが実行すると，以下の警告メッセージを出力します．

```
WARNING: Unitialized data read : variable=>gl_variable : main()@stack_data
```

###変数領域外のWRITEアクセス
以下は，グローバル変数 gl_variable が２バイトなのに，main関数で４バイト初期化しようとしたプログラムコードです．

```
static short gl_variable __attribute__ ((section(".bss_noclr")));
       :
int main(void)
{
	memset(&gl_variable, 0, 4);
        :
}
```

これを，athrillが実行すると，以下の警告メッセージを出力します．

```
WARNING: Found invalid data write on not variable region(addr=0x6ff748a size=1) : memset(0xcfe)@stack_data
WARNING: Found invalid data write on not variable region(addr=0x6ff748b size=1) : memset(0xcfe)@stack_data
```


##エラー通知機能 
本機能は，athrillが明らかな異常と判断したコードを実行した場合に，CPUを停止する機能です．

###ROM領域へのWRITEアクセス
以下は，ポインタの値が0x0(ROM領域)であるにもかかわらず，誤ってROM領域に値を書き込みしてしまったプログラムコードです．

```
static int *gl_pointer;
       :
int main(void)
{
	*gl_pointer = 10;
        :
}
```

これを，athrillが実行すると，以下のエラーメッセージを出力し，強制停止ます．

```
mpu_put_data32:error: can not write data on ROM :addr=0x0 data=10
Exec Error code[0]=0x5f6a code[1]=0x1 type_id=0x6
CPU(pc=0xc34) Exception!!
```

###スタックオーバーフロー検出
以下は，main関数内で巨大なサイズのローカル変数を定義してしまっているプログラムコードです．
組込みエンジニアであれば簡単に気づけるコードですが，関数呼び出しが深いとなかなか気づきにくく，
問題が発生した場合，メモリ破壊が発生してしまいますので大変解析が難しいバグです．


```
int main(void)
{
	int local_variable[1000];
        :
}
```

これを，athrillが実行すると，以下のエラーメッセージを出力し，強制停止ます．

```
ERROR: Found invalid data write over stack(addr=0x6ff64e8 size=4000) : main(0xc24)@unknown_stack
ERROR: found stack overflow
Exec Error code[0]=0xef63 code[1]=0xfa1 type_id=0x6
CPU(pc=0xc24) Exception!!
```
athrillは，ストア命令を実行する場合，スタック用レジスタ(sp)を監視しています．
[TOPPERS OS](https://www.toppers.jp/project.html)の場合，各タスクおよびカーネルのタスクはすべてグローバル変数(配列)化されていますので，スタック用レジスタ(sp)が領域外にいるかどうかは簡単に判断できるため，エラー検出機構として導入しました．
※TOPPERS OS実装が優れているために，こういう機構を簡単に導入できました．
HipChat クライアントアプリのフォントを変更する

##目的

HipChatの[クライアントアプリ（Windows版）](https://ja.atlassian.com/software/hipchat/downloads) が中華フォントで気持ち悪いので変更したい。

##方法

アプリケーションのフォルダにある「hipchat-client.css」を書き換える。
例）C:\Program Files (x86)\Atlassian\HipChat4\localweb\hipchat-client.css

**1. hipchat-client.cssから以下の記述を見つける**

```css:hipchat-client.css
body,
#page,
#hipchat {
  font-family: Helvetica Neue, Helvetica, Arial, sans-serif;
  height: 100%;
  width: 100%;
  min-width: 720px;
  transition: 0.5s -webkit-filter linear, 0.5s filter linear;
}
```

**2. font-family:に任意のフォントを指定する（meiryoなど）**

```css:hipchat-client.css
body,
#page,
#hipchat {
  font-family: Arial, meiryo, sans-serif;
  height: 100%;
  width: 100%;
  min-width: 720px;
  transition: 0.5s -webkit-filter linear, 0.5s filter linear;
}
```

**3.クライアントアプリ起動中の場合は再起動する**

※アプリのアップデートなどでhipchat-client.cssの内容が更新されるとフォントが戻ってしまうので注意
sublime text3  便利なタグハイライトのプラグイン

メモ

以前使っていて、めっちゃ探すのに苦労したのでメモ。

BracketHighlighter
開始/終了タグのハイライトをしてくれます！

<img width="190" alt="スクリーンショット 2018-06-24 16.27.56.png" src="https://qiita-image-store.s3.amazonaws.com/0/165170/69526b5c-3616-1af4-8920-7d56c2b0dfa8.png">

このプラグインがめっちゃ使える！
また今使ってるsublimeのプラグインまとめよかな？


package controllからインストールすると使えるよ！

見やすくて、便利！！
VNCとXRDPのデスクトップ共有されない

XRDPでリモートデスクトップ接続した環境に、VNCサーバーでアクセスできないか試しました。
理由は、VNCサーバーで接続した方が早いからです。

#ユーザー切り替え
すでに、別のユーザー名でVNCを使っていたので、ユーザーを切り替えました。

```
su - name
```

ーをつけると、PAHTなどの環境を引き継いでユーザー切り替えできます。

既にVNCのサーバーはインストールしていますので、このユーザーでログインできる様に、パスワードを作り設定しました。

```
vncserver
```
この時に画面番号を指定したら、その番号で設定できます。
設定するパスワード聞いて来ますので、２度入力します。

```
vncserver -kill :1
```

VNCサーバーを止めます。

こちらの記事を参考にして、指定のファイルの内容を修正しました。
```
vi .vnc/xstartup
```

https://medium.com/google-cloud/graphical-user-interface-gui-for-google-compute-engine-instance-78fccda09e5c

VNCサーバーを再起動しました。

```
vncserver :1　
```

この１は、画面番号です。
ポート5901が１です。
ポート5902が２になります。

#今回は同じ画面番号でテスト
今回は、同じ画面番号でテストしましたが、画面番号を指定してVNCサーバーを起動すれば、環境を使い分けることもできます。

#デスクトップの内容が引き継がれない
XRDPのデスクトップとVNCのデスクトップは同じ内容が使えると思ったのですが、実際は別の環境になりました。

XRDPで接続できたデスクトップにVNCサーバーで接続する意味は無いと思うのですが、私は、Wi-Fiが使えない環境でスマホでVNCクライアントでアクセスするため、少しでも快適に操作できる環境で使いたかったのです。
でも、今回、リモートデスクトップで接続するサーバーが変わると、デスクトップの内容が引き継がれないことが確認できたので、Ubuntuの勉強ができたので良かったです。
Angular6ではenvが指定できなくなりました。

Angularで develop, production以外の環境を用意するときに便利だったコマンド。

```.sh
ng build --prod -e=staging
```

```.sh
ng build --prod --env=staging
```

これ、Angular6では使えなくなりました。

つかうと、

```
Unknown option: '--env'
```

と怒られます。


Angular6　では、 `env` ではなく、 `configuration` を指定します。

ただ、その前にいくつか準備が必要です。

Angular6の下記の部分を変更する必要があります。。

``` angular.json
"configurations": {
    "production": {
        "fileReplacements": [
            {
                "replace": "src/environments/environment.ts",
                "with": "src/environments/environment.prod.ts"
            }
        ],
        "optimization": true,
        "outputHashing": "all",
        "sourceMap": false,
        "extractCss": true,
        "namedChunks": false,
        "aot": true,
        "extractLicenses": true,
        "vendorChunk": false,
        "buildOptimizer": true
    },
    "staging": {
        "fileReplacements": [
            {
                "replace": "src/environments/environment.ts",
                "with": "src/environments/environment.staging.ts"
            }
        ],
        "optimization": true,
        "outputHashing": "all",
        "sourceMap": true,
        "extractCss": true,
        "namedChunks": false,
        "aot": true,
        "extractLicenses": true,
        "vendorChunk": false,
        "buildOptimizer": true
    },
}
```

ここでは、 `configurations` に `staging` を追加しています。
Angular６では、 `src/environments` 以下の設定以外も変更しやすいように、 `environment` ではなく、 `configuration` になりました。


この設定を適用するには、下記のように `build` します

```
ng build --configuration=staging
```
(ng serveなども同様)
UIStackViewとAutoLayoutとUIViewをコードから使ってみるサンプル

AutoLayoutを使って、UIStackViewを画面中央に配置し、
その中にUIViewとUISwitchを入れてみるサンプル。

UIStackViewは縦と横で必ず何かしらのAutoLayoutを指定しないといけないようでした。

```swift

		let stack:UIStackView = UIStackView()
		stack.backgroundColor = UIColor.cyan
		view.addSubview(stack)
		stack.translatesAutoresizingMaskIntoConstraints = false
		stack.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
		stack.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true
		

		let myView = UIView()
		myView.backgroundColor = UIColor.brown
		myView.translatesAutoresizingMaskIntoConstraints = false
		myView.widthAnchor.constraint(equalToConstant: 100).isActive = true
		myView.heightAnchor.constraint(equalToConstant: 100).isActive = true

		stack.addArrangedSubview(myView)
		stack.addArrangedSubview(UISwitch())
		stack.addArrangedSubview(UISwitch())
		stack.addArrangedSubview(UISwitch())
```

<img width="320" alt="IMG_0009.png" src="https://qiita-image-store.s3.amazonaws.com/0/59336/0920d7ed-6a18-c43a-e2d5-0132172f0ca5.png">
PowerShellのプロンプトをBash風にする。

### 概要
PowerShellでは、プロンプトのカスタマイズができるということを知ったので、興味本位でBash風にしてみました。
### 確認環境
|Name                           |Value
|:---|:---|
PSVersion                      |6.0.2
PSEdition                      |Core
GitCommitId                    |v6.0.2
OS                             |Microsoft Windows 10.0.17134
Platform                       |Win32NT
PSCompatibleVersions           |{1.0, 2.0, 3.0, 4.0...}
PSRemotingProtocolVersion      |2.3
SerializationVersion           |1.1.0.1
WSManStackVersion              |3.0

### 前準備
profileは、最初は存在しないので、作成しておきます。

``` PowerShell
 new-item -type file -Force $profile
```

### 方法
promptメソッドを定義して、戻り値にプロンプトに表示させたい文字列を指定する。

``` PowerShell:Microsoft.PowerShell_profile.ps1
function prompt () {  
    "[$($env:USERNAME)@$($env:COMPUTERNAME) " + (Split-Path (Get-Location) -Leaf) + "] > " 
}
# ついでに、初期位置を変更しておく。
Set-Location "C:\Users\{UserName}\Documents\GitHub"

```

変更を保存して、PowerShellを再起動すると、こんな風に変わります。（ユーザー名はマスクしてるけど。）
![image.png](https://qiita-image-store.s3.amazonaws.com/0/83578/9b114329-c3b1-cda1-afc3-ee89ad053643.png)
Visual Studio Code用コンソールだと、ファイル名が**Microsoft.VSCode_profile.ps1**に代わるようです。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/83578/675c750a-32dd-7a93-e44f-9f25ddcde99b.png)

### おまけ
メソッドの戻り値が表示内容になるので、管理者で起動したときに、表示を変更させて、さらにBash風に（ry
~~(もう、Linux使えよ。)~~
![image.png](https://qiita-image-store.s3.amazonaws.com/0/83578/8f983c35-1cd6-3f8d-a584-150dc60855d6.png)

``` PowerShell:Microsoft.PowerShell_profile.ps1


function prompt () {
    $prompt = if (-not(([Security.Principal.WindowsPrincipal] `
                    [Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole(`
                    [Security.Principal.WindowsBuiltInRole] "Administrator"`
            ))) {
        " > "
    }else{
        " # " 
    }
    "[$($env:USERNAME)@$($env:COMPUTERNAME) " + (Split-Path (Get-Location) -Leaf) + "]${prompt}" 
}
Set-Location "C:\Users\{UserName}\Documents\GitHub"

```

### 参考資料
* [PowerShellが管理権限で実行されているか確認する](http://www.vwnet.jp/windows/PowerShell/IsRunAsAdministrator.htm)
* [かわいい PowerShell プロンプト](https://qiita.com/cd01/items/40ae04b8643a84c9dc08)