OmniAICreator/Qiita-1.07M huggingface dataset:
alpineコンテナでgoバイナリを定期実行するDockerflie

## 初めに
goバイナリを、alpineのDockerイメージの中にポイして、安定して動くようになったので記事にしました。
既にalpineイメージの中でgoバイナリを動かす過程で嵌った記事は幾つかあり、参考にさせて頂くと同時に助かりました。
参考にした記事は、最後に記載しております。
上記に加えてJST時刻設定と定期実行させるためのクーロン設定をDockerfileに追加してみました。
## Dockerfile
 
[github](https://github.com/shuntaka9576/alpine-gobinary.git)で公開しております。

07行目の箇所は、goのtimeパッケージを使用する際に必要となります。
cron設定は、cron設定ファイルを直接crontabs以下にコピーしています。(詳しくは、上記のgithubのソース参照)

```Dockerfile:Dockerfile
01 FROM alpine:3.4
02 WORKDIR /app
03 
04 # goバイナリを動かす設定
05 RUN mkdir /lib64 && ln -s /lib/libc.musl-x86_64.so.1 /lib64/ld-linux-x86-64.so.2
06 RUN apk add --no-cache ca-certificates
07 ADD https://github.com/golang/go/raw/master/lib/time/zoneinfo.zip /usr/local/go/8 lib/time/zoneinfo.zip
08 
09 # JST時刻設定
10 RUN apk --update add tzdata && \
11     cp /usr/share/zoneinfo/Asia/Tokyo /etc/localtime && \
12     apk del tzdata && \
13     rm -rf /var/cache/apk/*
14   
15 # バイナリのコピー
16 COPY hello /app
17 
18 # cron設定
19 COPY ./cronenv/root /var/spool/cron/crontabs/root
20 CMD ["crond", "-f", "-d", "8"]
```
## 参考記事
### goバイナリを動かす設定関連
[Docker で Go で作ったバイナリを実行するなるべく小さいコンテナを作る](https://ssig33.com/text/Docker_and_Golang)
[Dockerのbusybox内でgolangのtimeを使ったらエラーになった](https://qiita.com/wataru420/items/45d64f9ee8752937644a)
### JST時刻設定
[Alpine Linux でタイムゾーンを変更する](https://qiita.com/dtan4/items/8359e389b95cbc60952d)
## 最後に
AWSのCodePipelineを使用して、上記のようなイメージをビルド・ECRへのPush・EC2へのデプロイをしています。
次回はそれについて書けたらと思います。
Ubuntu16.04でWiresharkを使う方法

Wiresharkインストールする途中にroot以外でもキャプチャ可能にするのチェックボックスがあるがチェックを入れてもキャプチャできない。
そのため、権限関係の設定が必要である。

```
# リポジトリ追加
sudo add-apt-repository ppa:wireshark-dev/stable
sudo apt update
# wiresharkインストール
sudo apt install wireshark
```

```
# 権限関係の設定
sudo gpasswd -a username wireshark
newgrp wireshark
```
正規表現 - 「\A」・「\z」と「^」・「$」の違いを知りたい

# 2021.11.07 追記

本記事は、個人的な学習の記録です。

# 本で分からなかったことの補足
「PHPしっかり入門教室」を読んでいます。
正規表現の頁に差し掛かって、さっそく分からない部分があったので調べたいと思います。


# 「\A」・「\z」と「^」・「$」はどう違うのか、どちらを使えばいいのか

「PHPしっかり入門教室」の正規表現の頁を見ると、二者の違いに関してこう書かれています。

> 文字列の始まりは「\A」以外に「^」、「\z」以外に「$」を使用することもできます。ただし、こちらは行の始まりや終わりを表すので、間に改行コードがあっても無視されます。一方「\z」は改行コードが入る直前を意味しています。

そもそもここで「？？？」となりました。

なので、こちらのブログ記事を見てみると、『**「\A」と「\z」を使いましょう**』とあります。
[▼正規表現によるバリデーションでは ^ と $ ではなく \A と \z を使おう | 徳丸浩の日記](https://blog.tokumaru.org/2014/03/z.html)


記事の例を借ります。
以下の文字列に対して、

```text
javascript:exploit_code();/*
http://hi.com
*/
```

下記パターンを指定すると、
```/^https?:\/\/[^\n]+$/i ```

文字列```http://hi.com``` がマッチします。（Rubyの場合）
[※実際の結果（Rubularに飛びます。）](https://rubular.com/r/F4nBGwgHf9V4Bj)

パターンを見ると、文字列の始まりは『**「http」か「https」のどちらか**』になっています。
対象文字列を見ると、二行目は合致していますが、一行目は合致していません。

同じパターン、同じ文字列で今度はPHPの場合だとどうなるか試してみます。
[※実行結果（regex101に飛びます）](https://regex101.com/r/3p8iai/1)

結果は、「どの文字列にもマッチしない」となりました。
regex101で使えるデバッガーを使ってみると、以下のことがわかります。

- 指定したパターンでは1行目しかチェックしない

改めて最初に挙げた[徳丸さんの記事](https://blog.tokumaru.org/2014/03/z.html)を見ると、「Rubyの正規表現機能は、デフォルトで複数行モードである」との記載があります。これのおかげで（？）RubyとPHPでは同じ正規表現パターンでも違う結果が出るんですね。



## 行先頭で判断するか否か

「^」を使うと、**行の先頭**に指定の文字列が含まれていればマッチすることになります。
「\A」を使うと、**文字列の先頭**に指定の文字列が含まれていればマッチすることになります。


...と、それっぽく書いたは良いのですが、結局「行の先頭」と「文字列の先頭」の意味の違いがわからず。

PHPの場合、こういう認識でいればいいのでしょうか。。

- 複数行モードのとき：「文字列の先頭」（\A）の指定の仕方だと2行目以降にマッチする文字列があってもマッチしない
- 単一行モードのとき：\Aも^も同じ

# つまり

今の段階では「\A」と「\z」を使うのをデフォルトにしておけば良いということなんでしょうかね...。（まずは勉強を続けます(T_T)）

# 参考
[▼PHPしっかり入門教室](https://www.shoeisha.co.jp/book/detail/9784798153377)（「翔泳社の本」に飛びます）
技術系電子書籍（主にPDF）サイトまとめ

よく利用している技術系の電子書籍サイトをまとめました。（主にPDF、日英問わず）

1. [Packt Publishing](https://www.packtpub.com/)
フロントエンドからサーバーサイドまで幅広く揃っている印象です。
年末に全書籍5ドルセールをやっていてお買い得。

2. [The Pragmatic Bookshelf](https://pragprog.com/)
種類は多くないが良本が多いです。

3. [appress](https://www.apress.com/gp)
 内容の濃い書籍が多いですが、レイアウト的に字が小さくなり見にくいのが難点です。

4. [Leanpub](https://leanpub.com/)
 比較的最新の技術の本が多いと思います。
 決められた範囲内で自分で購入価格を決めることができます。
 執筆途中の本も購入出来ます。

5. その他
 - [翔泳社](http://www.shoeisha.co.jp/book/ebooks)
 - [技術評論社](https://gihyo.jp/dp)
 - [Oreilly](https://www.oreilly.co.jp/ebook/)
 - [インプレス](https://book.impress.co.jp/)
 - [Peachpit](http://www.peachpit.com/)
 - [Wiley](https://www.wiley.com/en-jp)
 - [マイナビブックス](https://book.mynavi.jp/ec/products/contents_type=1)
 - [ボーンデジタル](https://www.borndigital.co.jp/book/e-learning/)
 - [C&R研究所](http://www.c-r.com/book/listthum/?gid=400&vtype=1)
 - [Manatee](https://book.mynavi.jp/manatee/)
 - [ImformIT](http://www.informit.com/store/)
 - [達人出版社](https://tatsu-zine.com/books/)
 - [ラムダノート](https://www.lambdanote.com/)
アメリカに留学・駐在する際に日本でやっておいた方が良いもののチートシート

# 記事を書いたきっかけ
留学、駐在時に日本でやっておくとアメリカ生活のスタートが詰まない、楽になるTipsを個人的な経験からまとめました。
このようなnow-howが分散しておりまとめることでこれから訪米する方の助けになればと。

J1,F1,E1などのビザで訪米する方を考えてます。（筆者は会社員でJ1ビザ）

# 生活関連
## 決済口座の開設
**個人的には最重要と感じた。**
海外旅行ではクレカでどうにかなるものの、アメリカで生活する際には生活費を決済する銀行口座が基本的には必要。
あとガソリンスタンドでは現金・ATMカードしか使えなかったりするので車を持つと必要。

また家を借りる際には必須なので口座が開かないといつまでもホテル暮らしになりかねないので、早めに家を借りたい場合はunion bankの口座開設を日本でしておくと良い。
**Union bankは三菱UFJの子会社であり、おそらく日本から開設できる唯一のアメリカ決済口座。**
これを使っている人が自分を含め周りに多く、不便はあまりないのでオススメ。
ATMや支店が少ない（他銀行でもおろせるけど）ため、生活が安定したら他の大手銀行口座を開けると良い。

>MUFJ　海外口座ご紹介サービス《カリフォルニアアカウント・プログラム》
http://www.bk.mufg.jp/tsukau/kaigai/kouza/cali/index.html

### 開設した口座へ海外送金
また初期資金として100~200万円相当以上はないと厳しいので予め送金しておくと便利**（というか詰む）**。
→家や部屋を賃貸する際には敷金＋最初の家賃二ヶ月分（＝家賃三ヶ月分）を取られ、シリコンバレーでは容易にコレが100万を超えてしまう。。

Union bankへは三菱UFJの支店のテレビ窓口で実行できた。以下URLで**予め入力できるシートがあるため、入力しておかないと漏れが出てしまうのでやっておいたほうがいい。**
>MUFJ 外国送金
http://www.bk.mufg.jp/tsukau/kaigai/soukin/index.html

ただ海外送金になるので手数料は5000円近く取られるし時間もかかるので**超面倒**。手間がかなり掛かるのは覚悟して来店すべし。
渡航時に現金を大量に持ち込んでもいいがちょっと怖い。。

自分は三菱UFJにて開設したunion bank口座に送金したが、送金の源泉証明が必要でかなり戸惑った。
送金する分が給料と証明できるように通帳のコピーを取っておくとスムーズに行く。

#### 代替
楽天銀行からは簡単に送金できそう
>楽天銀行からUnion Bank(UFJ提携)への振込みに成功！
https://worktoolsmith.com/unionbank-2/

またPaypalを開設しておけば海外送金もできる。
ただ日本の住所証明を行っておく必要はあるので**日本にいるうちにアカウント開設および住所証明はやっておこう。**
渡米後から円→ドル送金できる手段のためあると安心する。
>Paypal
https://www.paypal.com/us/home

## アメリカクレカ作成
日本のクレヒスは意味なしでアメリカクレヒスを積み立てなければそもそもカードが作れない。
例外でJAL USA、ANA USAカードは作成でき限度額も高いので周りでは作っている人が多かった。

>アメリカ駐在員向けクレジットカードの作り方から選び方まで完全ガイド2018年版
http://moosefukui.hatenablog.com/entry/HowtoMakeUSCreditcards2017

>JAL USAカード
http://www.jalusacard.com/jp/

またDiscoverという低信用者用のカードもSSNがあれば作れる。
最初は限度額$500からで数ヶ月で$1500になった。
VISA MASTERしか使えない店が多いためあまり便利でないがクレヒスは溜まる。

>Discover
https://www.discover.com/


## 携帯電話
日本でSIMロック解除しておけば携帯電話はそのまま使える。
iPhoneなど一年半以上？使っていれば解除できるので是非しておくべき。

SIMカードは日本のアマゾンで買えるので予め買っておくと空港からすぐ使えて便利。（チャージは必要だが。。）


# 保険関連
会社で入れてくれない場合は加入必須。
VISA要件である規定以上の医療保険が要求される場合があるので、海外旅行保険に必ず加入する。
クレカ付帯保険では要求に満たない場合あり。

>https://www.internationalstudentinsurance.com/j1student/
Medical benefits of at least 100,000 per accident or illness
Repatriation of remains in the amount of 25,000
Expenses associated with the medical evacuation of the J1 visitor to his or her home country in the amount of 50,000
A deductible not to exceed 500 per accident or illness

三井住友海上
http://www.ms-ins.com/personal/travel/taimen/

Nomad Insurance
海外からでも加入可能。
https://www.worldnomads.com/usa/travel-insurance/?gclid=EAIaIQobChMI9KPQs6Wa2wIVDNVkCh2VNARMEAAYASAAEgLb7vD_BwE


#移動関連
## Uber
Uberのアカウントを日本で開設しておくと便利。
TBD
AWSの料金をサービス毎に取得してSlackに通知する(Python)

## なぜ書いたか
- AWSの料金通知についてたくさんの方が記事を書かれている
- が、サービスごとに料金を取得するPythonスクリプトはいい感じにコピペできるものがなかった
- そんなに頑張るようなコードでもないので完全にコピペ用に残す

## 環境

```bash
$ python -V
Python 3.6.5 # >=3.4 であれば動くはず
$ pip install requests boto3
```

## コード

```python
import os, json
from datetime import datetime, timedelta

import requests, boto3

SLACK_ENDPOINT = "your-incoming-webhook-url"
# Please add services you want to know metrics.
SERVICES = ["AmazonEC2", "AmazonRoute53", "AmazonS3", "AWSLambda", "All"]

def notify_invoice():
    # Prepare to get metrics
    client = boto3.client("cloudwatch", region_name="us-east-1")

    seconds_in_1day = 86400
    fields = []
    today = datetime.today()
    yesterday = today - timedelta(days=1)

    for service in SERVICES:
        # Setup dimensions
        dimensions = [{"Name": "Currency", "Value": "USD"}] 
        if service != "All":
            dimensions.append({"Name": "ServiceName", "Value": service})

        # Get metrics
        res = client.get_metric_statistics(
            Namespace="AWS/Billing",
            MetricName="EstimatedCharges",
            Dimensions=dimensions,
            StartTime=yesterday,
            EndTime=today,
            Period=seconds_in_1day,
            Statistics=["Average"]
        )

        # Continue if response wouldn't have data
        if len(res["Datapoints"]) == 0:
            continue

        # Append result to fields list
        invoice = res["Datapoints"][0].get("Average", "")
        field = {"title": service, "value": "{} USD".format(invoice)}
        fields.append(field)

    # Prepare to send the message 
    payload = {
        "text": "Your invoice untill yesterday",
        "username": "Invoice Notificater",
        "icon_emoji": ":moneybag:",
        "attachments": [{"fields": fields}]
    }

    # Send message
    requests.post(SLACK_ENDPOINT, data=json.dumps(payload))


if __name__ == "__main__":
    notify_invoice()
```

## 結果
<img width="297" alt="Slack_-_Osushi.png" src="https://qiita-image-store.s3.amazonaws.com/0/242836/0f1c0eb2-54be-21fd-695e-82f825fc1dad.png">

## 所感
- 誰がどう見ても30分で書いたク○コードだが、運用するわけではないし、良いのだこれくらいで(と自分に言い聞かせる)
Edwardでの変分推論、MCMCの切り替え

[Edward](http://edwardlib.org/)では変分ベイズによる推論([KLqp](http://edwardlib.org/api/ed/KLqp)等)、MCMCによる推論([HMC](http://edwardlib.org/api/ed/HMC),[SGHMC](http://edwardlib.org/api/ed/SGHMC)等)をそれぞれ使うことができるが、近似用の変数を定義する必要がありpymc,stanに比べ煩雑なところがある。

以下のように書くと変数isEmpiricalを使って切り替えて結果を比較しやすい。

状態空間モデルでの例( [Edward、PyStan、PyMC3で状態空間モデルを実装してみた
](http://www.ie110704.net/2018/04/21/edward%E3%80%81pystan%E3%80%81pymc3%E3%81%A7%E7%8A%B6%E6%85%8B%E7%A9%BA%E9%96%93%E3%83%A2%E3%83%87%E3%83%AB%E3%82%92%E5%AE%9F%E8%A3%85%E3%81%97%E3%81%A6%E3%81%BF%E3%81%9F/) を参考にさせていただきました)

```python
def genempirical(T):
    return Empirical(tf.Variable(tf.zeros(T)))

def genq():
    return Normal(loc=tf.Variable(tf.random_normal([])),  scale=tf.nn.softplus(tf.Variable(tf.random_normal([]))))

def statespace(N,T,isEmpirical=False):
    muZero = Normal(loc=0.0, scale=1.0)
    sigmaW = InverseGamma(concentration=1.0, rate=1.0)
 
    mu = [0]*N
    mu[0] = Normal(loc=muZero, scale=sigmaW)
    for n in range(1, N):
        mu[n] = Normal(loc=mu[n-1], scale=sigmaW)
 
    sigmaV = InverseGamma(concentration=1.0, rate=1.0)
    y_pre   = Normal(loc=tf.stack(mu), scale=sigmaV)
    if(isEmpicical):
        qmuZero = Empirical(tf.Variable(tf.zeros(T)))
        qsigmaW = Empirical(tf.Variable(tf.zeros(T)))
        qmu = [Empirical(tf.Variable(tf.zeros(T))) for n in range(N)]
        qsigmaV = Empirical(tf.Variable(tf.zeros(T)))
    else:
        qmuZero = genq()
        qsigmaW = genq()
        qmu = [ genq() for n in range(N) ]
        qsigmaV = genq()
      
    latent_vars = {m: qm for m, qm in zip(mu, qmu)}
    latent_vars[muZero] =qmuZero
    latent_vars[sigmaW]= qsigmaW
    latent_vars[sigmaV] = qsigmaV
    
    return y_pre, latent_vars, qmu
```

MCMC, 変分ベイズそれぞれ

```python
def nile_st_SGHMC(y,N,T):
    y_pre,latent_vars,qmu=nile_st(N,T,True)
    return ed.SGHMC(latent_vars, data={y_pre: y}) ,qmu

def nile_st_vb(y,N,T):
    y_pre,latent_vars,qmu=nile_st(N,T,False) 
    return ed.KLqp(latent_vars, data={y_pre: y}) ,qmu
```

と書いて推論の実行

```python
T=1000
inference,qmu=nile_st_vb(y,N,T)
```

サンプリング
```python
qmu_sample=np.array([ _qmu.sample(1000).eval()  for _qmu in qmu])
```

をすることができる。

が、時系列モデルのような階層的なモデルでの推論結果はまだ(version 1.3.5)安定していないようなのでお勧めできない。

- http://nbviewer.jupyter.org/gist/xiangze/b88f8bba67db598d45ab51bfdc6323bc#SGHMC
- http://nbviewer.jupyter.org/gist/xiangze/36ae7939822e80d5671bb41020edb260

 関連する質問

- https://discourse.edwardlib.org/t/why-is-edward-imho-the-greatest-idea-since-sliced-bread-so-poorly-supported/611
- https://discourse.edwardlib.org/t/hmc-and-klpq-fail-on-edward-while-pymc3-works-fine/740
nvm環境でnpmのアップデートができない時の対処法

npm本体のバージョンが最新でない場合、npmコマンドを使用した後に、
更新を促すメッセージが表示されることがあります。

``` shell
Update available X.X.X → X.X.X
Run npm i -g npm to update
```

しかし、上記コマンドを実行しても下記のようなエラーが出て、
npmをインストールすることができませんでした。

```
npm ERR! path C:\Program Files\nodejs\npm.cmd
npm ERR! code EEXIST
npm ERR! Refusing to delete C:\Program Files\nodejs\npm.cmd: is outside C:\Program Files\nodejs\node_modules\npm and not a link
npm ERR! File exists: C:\Program Files\nodejs\npm.cmd
npm ERR! Move it away, and try again.
```

解決策がないかを検索してみたところ、[nvm-windowsのissueページ](https://github.com/coreybutler/nvm-windows/issues/300)が見つかり、
`nvm-windows`特有の問題であることが判明しました。

* 2020/01/27 追記： 上記の issue はその後も伸び続け、最終的に専用のモジュールがリリースされたようです。  
[felixrieseberg/npm-windows-upgrade: Upgrade npm on Windows](https://github.com/felixrieseberg/npm-windows-upgrade)

上から順に読み進めて、記載されているコマンドをいくつか試したところ、
成功したのがstramel氏が書いた下記の内容でした。

``` shell
#!/usr/bin/bash

cd "$PROGRAMFILES"/nodejs
rm npm npx npm.cmd npx.cmd
mv node_modules/npm node_modules/npm2
node node_modules/npm2/bin/npm-cli.js i -g npm@latest
rm -rf node_modules/npm2/
```

※コマンドプロンプト等を使用している場合は、下記のコマンドで同等の処理になります。

```
cd %ProgramFiles%\nodejs
del npm npx npm.cmd npx.cmd
move node_modules\npm node_modules\npm2
node node_modules\npm2\bin\npm-cli.js i -g npm@latest
rd /S /Q node_modules\npm2
```


要は `program files/nodejs` ディレクトリがシンボリックリンクになっていて、
その中のファイルを消す時にエラーになっているのが原因なので、
一旦リネームすることでエラーを回避しています。

自分の場合、一度上記コマンドでアップデートを実行した後は
`npm i -g npm` でエラーが出なくなり、次回以降のアップデートができるようになりました。
Sourcetree起動時に、'git status' failed with code -1:'launch path not accessible' と表示されたときの対処法

# Sourcetree でエラー発生
homebrewでgitをアップデート後、Sourcetree を起動すると以下のようなダイアログボックスが表示され Git の操作が行えない状態となることがある。

```
'git status' failed with code -1:'launch path not accessible'
```

<img width="532" alt="Screen Shot 2018-05-07 at 0.00.17.png" src="https://qiita-image-store.s3.amazonaws.com/0/61809/b5a0f2fd-4d38-cda7-d675-1c740c008b79.png">

## 対処方法
Sourcetree の環境設定から git のメニューを開き、'システムのGitを使用する' をクリックしgitコマンドを選択する。

<img width="410" alt="Screen_Shot_2018-05-07_at_0_09_52.png" src="https://qiita-image-store.s3.amazonaws.com/0/61809/097a7f92-582e-3df3-74cf-b7a8696cb08c.png">
Macでやりたい初期設定

**トラックパッド**

* 「アプリケーションExpose」をチェック

**バッテリー**

* 残量のパーセントを表示する

**日付と時刻**

* 日付を表示

**ディスプレイ**

* メニューバーにミラーリングオプションを表示しない

**Dock**

* Dockを右に移動
* Dockを自動的に隠す
* ウィンドウタイトルバーのダブルクリックでしまう
* ウィンドウをアプリケーションアイコンにしまう
* サイズを1/4にする
* 拡大を1/2にする
* 必要なアプリをDockに追加
    * Finder
    * システム環境設定
    * Google Chrome
    * ターミナル
    * Sequel Pro
    * ChatWork
    * Slack
    * Visual Studio Code

**共有**

* コンピュータ名を変更

**デスクトップ**

* 表示順序を「グリッドに沿う」にする
* 壁紙を無地にする

**Finder**

* 表示形式を「カラム表示」にする
* 並び順序を「なし」にする
* 表示順序を「名前」にする
* 表示形式、並び順序、表示順序をデフォルトとして使用する
* 新規FinderウィンドウでHOMEを表示する
* 「サイドバーに表示する項目」を整理
    * AirDrop
    * アプリケーション
    * デスクトップ
    * HOME
    * 共有すべて
    * デバイスすべて
* すべてのファイル名拡張子を表示する
* 並び替えでフォルダを上部に表示する
* すべてのバーを表示する

**セキュリティとプライバシー**

* ファイアウォールを入にする

**通知センター**

* ウィジェットの整理
    * 天気

**アプリケーション**

* Command Line Tools
* Homebrew
* ndenv
* Hosts
* Docker for Mac
* ChatWork
* AppCleaner
* Sequel Pro
* Google Chrome
* Xcode
* Git
* Visual Studio Code
* Slack

**設定ファイル**

```bash:.bash_profile
# ndenv
export PATH="$HOME/.ndenv/bin:$PATH"
eval "$(ndenv init -)"
```

**Git**

* ユーザー情報を設定

**Visual Studio Code**

* 設定ファイルをコピー
* 拡張機能をインストール

**一般**

* デフォルトのWebブラウザをChromeにする
VS Code1.23の気になった新機能(まとめ)

[Visual Studio Code](https://code.visualstudio.com) の バージョン 1.23 がリリースされたので、[リリースノート](https://code.visualstudio.com/updates/v1_23)を眺めてみて気になった機能をチェックしてみた。(以前のバージョンを眺めてみた時のやつはこちら。[1.22](https://qiita.com/12345/items/8253a1eee38b6741905e) / [1.21](https://qiita.com/12345/items/71ce73c52cf2232fc10c) / [1.20](https://qiita.com/12345/items/1390c7cab11d968e7691) / [1.19](https://qiita.com/12345/items/a331c014a9d3fa9dac0e) / [1.18](https://qiita.com/12345/items/9b827138b5044ca82482) / [1.17](http://qiita.com/12345/items/28d83361341ce3ff3c9c) / [1.16](http://qiita.com/12345/items/5215293977dde2149c0f) / [1.15](http://qiita.com/12345/items/cebf4b4e9bfb2d2ef771))

- [インデントガイドのハイライト表示](https://qiita.com/12345/items/f4ed79116c8d502f3011)
- [Gitクローンコマンドの改善](https://qiita.com/12345/items/20c8603edee19c04ef50)
- [検索ビューの検索結果のコピー機能](https://qiita.com/12345/items/e3710e7fcd3ebba44a19)
- [ 検索ビューの条件ボックスが再度分割](https://qiita.com/12345/items/095d70df304bb5ebd315)
- [プロセスエクスプローラ](https://qiita.com/12345/items/6d8cb8a3b2c3c95fc318)
- [マルチルートでのターミナル分割時のフォルダ指定](https://qiita.com/12345/items/4664b48d56ce3d295291)
- [ワークスペース内のMarkdownの見出しジャンプ](https://qiita.com/12345/items/18a5482d0087e89760bd)
PHPエンジニアが絶対に読みたい本

## インフラ

|書籍名|読了|
|:--|:-:|
|Webエンジニアが知っておきたいインフラの基本|OK|
|Linuxエンジニア養成読本|OK|
|Amazon Web Services パターン別構築・運用ガイド||
|Amazon Web Services 業務システム設計・移行ガイド||
|AWSによるサーバーレスアーキテクチャ||
|Amazon Web Services負荷試験入門||
|Dockerによるアプリケーション開発環境構築ガイド||
|コンテナ・ベース・オーケストレーション||
|Ansible実践ガイド||
|nginx実践ガイド||
|Mackerel サーバ監視[実践]入門||

## データベース

|書籍名|読了|
|:--|:-:|
|達人に学ぶDB設計||
|達人に学ぶ SQL徹底指南書 ||
|SQLアンチパターン||
|SQL実践入門||
|データベース技術[実践]入門||
|やさしく学べるMySQL運用・管理入門||
|ビッグデータを支える技術||
|ビッグデータ分析・活用のためのSQLレシピ||

## フロントエンド

|書籍名|読了|
|:--|:-:|
|UX+理論で作るWebデザイン||
|HTML5&CSS3デザイン||
|HTML5&CSS3ステップアップブック||
|JavaScriptの教科書||
|Node.js超入門||
|基礎から学ぶ Vue.js||
|Atomic Design||
|Webサイトパフォーマンス実践入門||

## サーバーサイド

|書籍名|読了|
|:--|:-:|
|パーフェクトPHP||
|Laravelリファレンス||
|Laravel入門||
|PHPプログラミング開発テクニック||
|体系的に学ぶ 安全なWebアプリケーションの作り方||

## ソフトウェア開発

|書籍名|読了|
|:--|:-:|
|CODE COMPLETE||
|コーディングを支える技術||
|達人プログラマー||
|リファクタリング||
|レガシーコード改善ガイド||
|テスト駆動開発||
|初めての自動テスト||

## ソフトウェア設計

|書籍名|読了|
|:--|:-:|
|現場で役立つシステム設計の原則||
|エリック・エヴァンスのドメイン駆動設計||
|マイクロサービスアーキテクチャ||
|Web API: The Good Parts||
|アジャイルソフトウェア開発の奥義||
|オブジェクト指向のこころ||

## プロジェクト管理

|書籍名|読了|
|:--|:-:|
|SCRUM BOOT CAMP||
|アジャイルサムライ||
|スクラム現場ガイド||
|スクラム実践入門||
|カンバン仕事術||
|チーム開発実践入門||
|DevOps導入指南||
|エンジニアのためのGitの教科書||
SELinuxとは？【メモ】

#SELinuxとは
Security-Enhanced Linuxの略。
直訳すると「セキュリティが強化された」という意味ですね。

カーネルを制御する役割をしていて、詳細なアクセス制御をすることが可能になります。
root権限ですら、制御できるのだとか。

ただし、SELinuxの設定は複雑で意図しない動きをすることがあったり、また使用しなくても問題なくサーバとして機能するということもあり、SELinuxを意図的に無効化しているケースもあります。(検証環境では大体無効に設定されている印象。)
ちゃんと使いこなしてあげられればいいんでしょうけどね。

#SELinuxの状態
SELinuxの状態には、以下の３種類があります。

- disabled　：無効化されている
- permissive　：有効化されているが監査ログに記録する以外の働きをしない
- enforcing　：有効化されており設定通りに働く


#SELinuxを無効化する方法
設定ファイルを編集することで、SELinuxを無効化することができます。
編集は、rootユーザで行います。

```ruby:
# vi /etc/selinux/config
```

＜編集例＞「enforcing」となっている行をコメントアウトし、新たに「disabled」の行を追記します。

```ruby:/etc/selinux/config
#SELINUX=enforcing
SELINUX=disabled
```
追記したら保存して閉じます。
【Quiita初投稿】現在19歳。そこそこの学生エンジニア目指します！

初めまして。
Qiita初投稿です。
Qiitaの方は、「世界一のエンジニア目指します！」とかそういうタイプの人嫌いそうなので、（あとQuitaって間違える人とか、びっくりマークいっぱい使う人とか）謙虚にやっていきます。
よろしくお願いします。
（プロフィール的なのはいつか暇なときに埋めます）

プログラミング自体は高校生の時からちょくちょく勉強しては、使わなくなって忘れる、
ということを何度もしていました。（現在、忘れている段階です。）

ついこの間、有名どころのエンジニアインターンに応募するには大体コーディングテスト選考があるという驚愕の事実を知り、「これは、また勉強したいなあ！」と思っていました。

そしてその決意と同じタイミングで、生駒ちゃんが乃木坂46を本日卒業。
急に毎日が暇になり、退屈になってしまったので

「もうこれはやるしかない！」
「胸を張って学生エンジニアと言えるように今度こそなるんだ！」

と決めたのです！

ということで、まずはあの頃を思い出すために

Python100本ノックをやります！

すでに問題がある自然言語の方ではありません。
自分で問題集めて解きます。

そろそろ、生駒ちゃん最後の「乃木坂工事中」が始まってしまうので、
ここら辺で失礼します！

とりあえず、どうかQiita界隈の仲間入りできるよう頑張りますので、よろしくお願いします！
Kubernetes の Feature Map を作る

近頃デファクトスタンダードになりつつある Kubernetes ですが、機能が多くドキュメントを読んだだけではなかなか理解が難しいところがあります。そこで API から主要機能を抜き出し Feature Map を作ってみました。

参考になれば幸いです。

![KubernetesFeatureMap.png](https://qiita-image-store.s3.amazonaws.com/0/104531/8ff79c7c-7fd1-3d19-bbb7-b79d732d3dfb.png)
rails のDockerfile書き方メモ

rails環境用のDockerfileを作った時のメモです

Dockerfile

```
FROM ruby:2.4.2
RUN apt-get update -qq && apt-get install -y build-essential libpq-dev nodejs
RUN mkdir /
WORKDIR /app-name
ADD Gemfile /app-name/Gemfile
ADD Gemfile.lock /app-name/Gemfile.lock
RUN bundle install
ADD . /app-name
```

各コマンドの意味

|コマンド  |意味|
|:------|:----------|
|From   |ベースイメージを指定|
|RUN    |imageの中で実行するshellコマンド|
|ENV    |環境変数の指定|
|COPY   |ローカルファイルのコンテナへのコピー|
|WORKDIR|コンテナ起動時の作業ディレクトリの指定|
|CMD    |コンテナ起動時に実行するコマンドの定義|
|EXPOSE |ホストのPORTの割り当て|


## 参考
+ 公式リファレンス

https://docs.docker.com/compose/rails/#define-the-project
http://docs.docker.jp/engine/reference/builder.html
TwitterのQiita新着Botが凍結された話

# TL;DR

TwitterでQiitaの新着記事をツイートする@qiita_rssが凍結されてしまった・・・・
原因は、とあるツイートがDMCAに反したからだ。
該当ツイートの元となるQiitaの記事はとっくに削除されているが、内容として以下のような記事だった。

```
<タイトル>（2018年）フルムービーオンライン
<タイトル> フルムービーオンライン無料HD 1080PX〜!! 
<タイトル> フルムービーオンライン
```

勿論、このような記事が作られることを想定していなく、TwitterBotは上記の記事をツイートしてしまった。
その後、映像の著作権の所有者から著作権侵害の申立をされてしまい、凍結の流れとなった。

具体的な侵害申立は以下のような内容だった

```
==報告されたツイートのURL：https://twitter.com/<該当ツイート>

==侵害の記述：DMCAプロトコル（デジタルミレニアム著作権法）によると：このアカウント/ポストは無料のダウンロードを提供しています。 /または<所属>に所属する映画「<タイトル>」のオンライン視聴。
<所属>は、このアカウント/ポストで無料でダウンロードできる映画の権利者です。したがって、コンテンツは著作権法違反となる可能性があるため、当社の承諾なしに内容を複製、複製、改変、配布、公表、および/または変更することはできません。
```
ツイートを見ると確かにこちらが悪いことが分かる....（いや・・・こっちが悪いけどこんなの予想もしてなかったよ・・・）
現在、twitterサポートに「著作権を侵害するつもりはなく～」みたいな言い訳メール出したが、凍結解除は難しいだろう・・・涙

**Qiitaの記事をつぶやく系のTwitterBotの管理者は注意してください**
code academy : js復習 ④

*topics*
計算記号のショートカット
String型データの挿入

##記号のショートカット

```js
let a = 5;
a += 3;
//a = 8

let b = 5;
b -= 3;
//b = 2

let c = 5;
c *= 3
//c = 15

let d = 5;
d ++;   //dに1がプラスされる
//d = 6

let e = 5;
d --   //eを1マイナス
//d = 4
```

##String型データの挿入

+を使う方法では""もしくは''くぎらないといけない

```js
let name = "Taro";
console.log("私の名前は" + name + "です");
//output:私の名前はTaroです
```
"",''の代わりに、｀｀（バックコート）を使い変数を挿入には${変数名}を利用する

```js
let color = "青";
console.log(`好きな色は${color}です`);
//output:好きな色は青です
```
VRMで遊ぶ② ～ 一人称視点の対応～

##はじめに
[前回](https://qiita.com/amidaMangrove/items/dabb2cda8ae52767b685)の続きです。
今回はVRMの一人称視点対応を行ってみます。そんなに長い内容ではないのですぐに終わります。参考になれば幸いです。アドバイスや間違っている箇所ご指摘等いただけれると励みになります。

##一人称視点時の対応
普通にカメラを設定してしまうと頭のモデルに被るようになってしまいます。
![キャプチャ2.PNG](https://qiita-image-store.s3.amazonaws.com/0/48820/d6206b9d-b347-5491-67d4-fa8f96905cb1.png)

まずはこの対応です。

##タグとレイヤーの設定
一人称視点時のマスクはレイヤーで設定しているようなので、レイヤーの9と10に以下の値を設定します。

| レイヤーのNo      |       設定する値 | 
|:-----------------|------------------:|
| User Layer 9 | FIRSTPERSON_ONLY_LAYER|
| User Layer10 | THIRDPERSON_ONLY_LAYER| 


![キャプチャ3.PNG](https://qiita-image-store.s3.amazonaws.com/0/48820/ad0edaa7-f06e-1e02-6b78-e7e9111a8864.png)

##カメラのマスクを設定
キャラの目線に設定しているカメラのマスクを変更します。今回はMainCameraがそのまま視点なのでMainCameraの値を変更。

![キャプチャ4.png](https://qiita-image-store.s3.amazonaws.com/0/48820/6528fd5a-90a8-6395-dac4-52ac33976bae.png)

##一人称視点のセットアップ用スクリプトを作成する
以下のスクリプトを用意し、Scene上のVRMモデルにアタッチします。

```CS:VRMFirstPersonSetting.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using VRM;

[RequireComponent(typeof(VRMFirstPerson))]
public class VRMFirstPersonSetting : MonoBehaviour {

    [SerializeField] bool isFirtPerson;

    VRMFirstPerson vrmFirstPerson;

    void Start () {

        vrmFirstPerson = GetComponent<VRMFirstPerson>();

        if(isFirtPerson)
            vrmFirstPerson.Setup();

    }
	
	void Update () {
		
	}
}
```
![キャプチャ5.PNG](https://qiita-image-store.s3.amazonaws.com/0/48820/53033b05-8214-ffbd-3558-132b1a0c7906.png)


これで実行すれば一人視点でうまく頭部が除外されるはずです。
![キャプチャ6.png](https://qiita-image-store.s3.amazonaws.com/0/48820/5674193f-fdc4-b2ea-c811-aef89a813518.png)


##うまく行かない場合・・・
モデルによってはVRMのVRMFirstPersonの値を調整する必要があるかもしれません。
![キャプチャ7.PNG](https://qiita-image-store.s3.amazonaws.com/0/48820/84387791-8ca9-7eb2-39ba-4641e65aa63e.png)


##次回
さんざん色々な場所に記事ありますが、SteamVRでの設定を簡単にまとめます。
というかSteamVRでやった方が精度が良い感じだった・・・
Ubuntuにapt-getで最新のGolangをインストールする方法

```
apt-get update
apt-get install gcc make
apt-get install golang-1.10
```

あと $PATH を通す必要があります。

```
export PATH=”/usr/lib/go-1.10/bin:$PATH”
```

Docker Imageを作っておいたのでよかったらお使いください。


```
docker pull dqneo/ubuntu-build-essential:go
```

https://hub.docker.com/r/dqneo/ubuntu-build-essential/
無色透明の汎用ビジネススキルがあるといいよね。

とは言っても何のことやら。
これは僕が思う一般ホワイトカラーが特殊な技術（プログラミングとか英会話とか）
とは別に必要なそうなビジネススキル考です。
　※特殊な技術はそれはそれで勉強してるって前提ね。

　普遍的だけど書き出してみるとこんなやつ。
　・アクティブ
　・コミュニケーション
　・ロジック
　・ドキュメンテーション

大きくはコミュニケーションは会話力、ドキュメンテーションは作文、
読書力に依存して、ロジックは数学力に依存する。
アクティブはトライ＆エラーと何かに熱中した経験が経験値となる。

#アクティブ
自分から動く事。
これ「指示が無いと動けない」ってだけじゃなくて「他部署、上司に確認しないと動けない」
「他の所に確認する」って所でとまってしまう、仕方が無いって人が多い。
ミッションなんて大体解るはず。上司やリーダが動かなくても自分から動けよ。


#コミュニケーション
良くコミュニケーション能力っていうけど僕は3つあると思ってて
「相手と仲良くする力」「相手のいってる事を理解する力」「苦手な人を回避する能力」
特にこのうちの理解力は「ヒアリング」と外だしして別カテゴリでもいいかも。
「相手と仲良くする力」「苦手な人を回避する能力」って表裏一体で
人付き合いのうまい人って、自分と会わない人と微妙に接点を減らしてコミュニティ
としての摩擦を緩和するのよね。仲良くしないで人の和を保つ的な感じ。

#ロジック
これは凄く難しい。
説明しにくいけど「ホワイトボードで中学生を納得させれるか？」
ってのがポイントかな。少なくとも0知識の人も納得させる理論展開が出来ないといけない。
しかもなるたけ最小ステップで。

#ドキュメンテーション
これで言いたいのは「質は量より作られる」
「人に見せて初めて成立して、提出して初めて成果になる」ってとこかな。
とにかく、人に見せない、作ったけど結局提出しないって人が多すぎる。ほんと。

---

とまとめてみて出口治明さんがいう
「人に会え、本を読め、旅をしろ」ってのは本当に的を得てる。
僕個人としては前も書いたけど「＋音楽をしよう」を付け加えるけどね。
まぁ音楽が仕事に役に立ってるかどうかは知らんがｗ
少なくともワークライフバランスにはなってるでしょう。

簡単ですが以上です。
Laravel5.5でメールの認証を実装する

# 参考資料

- [「PHP」「laravel」認証のメールを作りましょう - Qiita](https://qiita.com/harukazuchi/items/32fe88f87db3b4a5fe79)

日本語が不思議な本記事を参考に、メール認証の処理を作成しました。

微妙に記述が足りなかったりしたので、補足していきます。


# やったこと
基本的に参考記事のとおりですが、一番大きな違いはSocialiteを利用してるところです。
まあ、参考記事を参考にして雰囲気で実装したら動いたんですけど。

**冷静に考えてソーシャルで取得したメールアドレスを確認する必要はない気はします。**

とりあえずやったことは以下。

1. ユーザーテーブルにverifiedとemail_tokenを追加して`php artisan migrate:refresh`
2. `php artisan make:auth` （すでに実行済みのため省略。あとverifiedが0のときログインできないように修正しました）
3. .envの修正（mailtrapを利用しました。googleかgithubでログインしたらなんか勝手にメールアカウント的なものができているので、あとは雰囲気で利用できます）
4. `php artisan config:clear`
5. `php artisan make:mail EmailVerification --markdown=emails.verification` （emails/verification.blade.php（送信メール用テンプレート）とMail/EmailVerification.php（メール送信用クラス）が作成されます）
6. Mail/EmailVerification.phpを修正
7. emails/verification.blade.phpのURLを修正
8. `php artisan make:job SendVerificationEmail`
9. Jobs/SendVerificationEmail.phpを修正。JobじゃなくてJobs
10. Auth/RegisterController.phpの修正。今回はSocialController.php
11. verification.blade.phpを追加
12. emailcomfirm.blade.phpを追加
13. ルーティングの追加


# まごついたところ
## verifiedが0のときのログイン
ログイン処理に`$user->verified == 0`ならログインさせない処理を追加しました。
とりあえず『メール確認せーや』というメッセージを付けてトップに飛ばすようにしました。

**が、メールを間違って消してしまった場合に備えて再送できる仕組みを作るべきなのかなと思いつつスルーしています。**

単純な方法なら、ユーザーの作成時間を見て、一定時間以上古ければ登録済みのデータを削除して新しく作成し直す……とかでしょうか。

知らんけどー

## 6のEmailVerification.phpの修正内容が足りない
修正は以下の3つが書かれています。

- `Protected $user`の追加
- __constructに`$this->user = $user;`の追加
- buildの戻り値にwith句で`'email_token' => $this->user->email_token,`を追加

もう一つ必要でした。

- __constructの引数に`$user`の追加

これがないとJobs/SendVerificationEmail.phpから飛んでくる$userを受け取れません。


## 7のURLが間違ってる
`'http://127.0.0.1:8000/verifyemail/$email_token'])`とあります。

`'http://127.0.0.1:8000/verifyemail/'.$email_token])`の間違いです。

## 9の修正が間違ってる
EmailVerification.phpに対して$userを投げつけるために、こちらにも`Protected $user`が必要です。

これがないと__constructでdispatchから受け取った$userが揮発してしまい、handleでエラーになります。


## 10の修正について
useは適当に必要なものを追加します。

email_tokenに関しては$userの作成時に一緒に宣言します。

registerの修正はよくわからないので雰囲気で修正しました。
元々はそのまま`Auth::login($user)`としていたところを、registerの下2行に変更。
トランザクションを利用していた関係でdispatchの方はトランザクション内に記述しましたが、問題なく動きました。

verifyの方はそのままで大丈夫でした。

## 13のルーティング
ソーシャル認証を利用しているので、RegisterControllerではなくSocialControllerですね。


## mailtrapは本当にメールが届くわけではない
**最初、本当にメールが届くんだと思って自分のアドレスを確認しまくってました。**
ダミーのメールなので、実際には届かないとも知らず……。

「このアドレスにこんなメールが送られました！」というのがmailtrap側から確認できるだけです。

![スクリーンショット 2018-05-06 20.21.45.jpg](https://qiita-image-store.s3.amazonaws.com/0/214031/5ab37599-80d4-f223-1d7d-6ad51916f064.jpeg)

こんな感じで。

## verification.blade.phpが2つある
ややこしいんですがemails/verification.blade.phpとは別にverification.blade.phpを作れと言われます。

前者が送信するメールの内容（verifyボタンを押すとトークン付きのURLに飛ぶ）で、後者が『登録に成功しました、送信したメールから認証を完了させてください』的なことが書いてある画面です。


## 参考記事からコピペするとクォートがおかしい
なんか関連記事からクォートまわりをコピーしようとすると、クォートによく似た何かが取得できます。
html的に怒られるので注意です。
Etherpad-lite PerlのAPIモジュール

# Etherpad-lite PerlのAPIモジュール

## これは何？

Etherpad-liteのHTTP APIをPerlのモジュールを使って操作する方法の紹介です。

## HTTP API
https://github.com/ether/etherpad-lite/wiki/HTTP-API

上記公式サイトの説明が非常にわかりやすいのでここを見ていただければ十分だと思います。

## プログラム言語からのHTTP API操作のモジュール

HTTP API client libraries
https://github.com/ether/etherpad-lite/wiki/HTTP-API-client-libraries
を参照してください。
Pythonについては以下も参考になります。
https://qiita.com/gkmaro634/items/8152b8ba9572dc5b5aa5

## PerlモジュールのAPI
http://search.cpan.org/~ldidry/Etherpad-1.2.13.0/lib/Etherpad.pm

上記のHTTP APIをPerlモジュールで操作します。

```
cpanm Etherpad
```

でインストールできます。

 * Mojoliciousとかが必要なようですのでPerlバージョン等は注意です。

### 使い方
https://github.com/ether/etherpad-lite/wiki/HTTP-API
のExample 1相当を実行してみます。

```perl
use strict;
use warnings;

use Etherpad;

my $url ='http://192.168.33.10:9001';
my $apikey ='secret';

my $ec = Etherpad->new(
   url      => $url,
   apikey   => $apikey
);

my $authorID = $ec->create_author_if_not_exists_for( '100', 'John');
print "$authorID:authorID\n";

my $groupID = $ec->create_group_if_not_exists_for('999');
print "$groupID:groupID\n";

my $padID = $ec->create_group_pad( $groupID, 'padName' ,'test1');
print "$padID:padID\n";

my $sessionID =$ec->create_session($groupID, $authorID, 1893423600);
print "$sessionID:sessionID\n";
```

得られたsessionIDの値をクッキーで
sessionIDというキーで書き込めば対象のドキュメントを編集できるようになります。

非常に簡単です。
ただPerlのAPIについてはMojoliciousが必要です。
やっていることの単純さの割にMojoliciousを必要とする理由は考えてみてもいいかもしれません。

 * おそらく主にMojo::Baseを使いたいためのようです。

場合によってはHTTP APIを直接操作するなり自分でモジュールを作るなりでもいいかもしれません。
code academy : js復習 ③

*topics*
constant variabele
let variable
undefined


##const
値が変えられない変数

```js
const name = "苔";
console.log(name);
//output:苔
```

##let
値の変更が可能

```js
let color = "緑";
console.log(color);
//output:緑
```

##undefined
値の与えられていない変数に初期値として割り当てられる値

```js
let whatIsThat;
//値はundefined

let a;
let b =undefined;
let c =123;
c=undefined;
//a,b,cの値は全てundefined
```
RCSメモ

## はじめに

RCSはシステムの設定ファイルなどをその場で世代管理するのに便利です。ですが、使う機会が少ないのでコマンドをすぐ忘れてしまいます。ということで最低限の使い方をメモ。

## RCSでの管理をはじめる
```
$ ci -l filename
```
同じディレクトリに ``filename,v`` というRCSファイルが作成される。オプション ``-l`` を指定しないと管理対象のファイルが消去されるので注意。
初回コミット時のコメントは「このファイルの概要説明」として利用されるので、空コメントにすれなよい。

## 修正をコミットする
```
$ ci -l filename
```
初期登録の時とオプションは同じ。

## 差分を確認する
編集中のファイルと最終コミットのファイルとの差分を見る場合は、

```
$ rcsdiff -u filename
```

特定のバージョン間の差分をみる場合は、

```
$ rcsdiff -u -r1.1 -r1.2 filename
```

## 修正履歴を見る
```
$ rlog filename
```

## 特定のバージョンを取り出す
```
$ co -l -r1.1 filename
```
[UnrealEngine4] psdからUIを生成する方法について

## 概要

UnityにはpsdからUIを生成するライブラリがいくつかありますが、
UnrealEngine4(以下UE4)にはありませんでした。

そこで、今回UE4向けに同様の機能を持つプラグインを開発しました。
基本的に今まではオープンソースで開発することが多かったのですが、
今回のプラグインはマーケットプレイスでリリースしています。

[マーケットプレイス](https://www.unrealengine.com/marketplace/psd2umg)

そのため、今回はプラグインの開発で得たUE4でPSDからUIを生成する方法について説明します。

![PSD2UMG_Screenshot1.png](https://qiita-image-store.s3.amazonaws.com/0/64773/b9bb4f8a-c3a1-8c94-8431-fede989b71fc.png)

## psdの読み込み

psdの読み込みにはpsd.cを使用しています。
これはC言語でpsdファイルをパースするライブラリです。
psdのデータをパースするのみで、レンダリングは行ってくれません。

https://github.com/hkrn/psd.c

このプラグインでは、psdの拡張子は.psdumgに変更しないとインポートできなくしています。
何故かというと、psdは最初からUnrealEngine4でレイヤーが結合済みの状態でインポートされるようになっています。その影響で、psdをUIとしてインポートできるようにするためには、拡張子を変える必要があります。

## UnrealEngine4のプラグインの実装

プラグインについてはここを参考にしました。

http://historia.co.jp/archives/367/

プラグインの中ではWidgetBlueprintを以下のコードで生成してます。

```
UWidgetBlueprintFactory* widgetFactory = NewObject<UWidgetBlueprintFactory>();
widgetFactory->AddToRoot();

UPackage* widgetPackage = CreatePackage(NULL, *packageName);

userWidget = (UWidgetBlueprint*)widgetFactory->FactoryCreateNew(
	UWidgetBlueprint::StaticClass(),
	widgetPackage,
	FName(*name),
	Flags,
	nullptr, nullptr);

widgetFactory->RemoveFromRoot();
```

ボタン等のオブジェクトはWidgetBlueprintのインスタンスから生成できます。

```
auto button = userWidget->WidgetTree->ConstructWidget<UButton>(UButton::StaticClass(), *name);
rootWidget->AddChild(button);
```

基本的にpsdの解析結果に沿って、オブジェクトを生成していくだけですが、既に同名のオブジェクトが存在する場合は、それを使用するようにしています。

```
button = userWidget->WidgetTree->FindWidget<UButton>(*name);
...
```

psdファイルにはレイヤーの大きさや位置の情報が含まれているため、位置を合わせるのは簡単です。

### 動作

可能な限りpsdとBlueprintWdigetの配置が同じようになるようにしています。
再インポートの時の利便性が上がるように、同名のオブジェクト(ボタン等)が存在する場合は、見た目のみを変更するようにしています。オブジェクトが存在していて、レイヤーが存在しない場合は特に変更を加えないようにしています。これにより、psdから作成したオブジェクトとそれ以外のオブジェクトを同時に使用しやすくしています。

制限として、レイヤー効果は適用されません。
レイヤー効果の計算方法が公開されていないためです。

### 最後に

UE4でBlueprntWidgetを作成するのは意外と簡単です。
psd以外にもhtmlやaiからも生成できるのではないでしょうか。
VSCodeでGo言語をやるときに導入する拡張機能

# 目的
VSCode使ってGo言語をやるときに使うとよいかもしれない拡張機能

# 一覧

今後も引き続き修正予定

|拡張機能|内容|
|---|---|
|Go|VSCodeのGo言語サポート追加|
|Golang TDD|テスト駆動でコードを書くなら入れましょう。テストカバレッジおよび、R/Gの状態を表示させてくれる|
|dep|Go言語のパッケージの依存関係の管理マネージャサポート|
Google Wifiを買ってみた！（Windows7で困ったこと）

## 背景
自宅のルーターが壊れてしまい、どうせならと思い[Google Wifi](https://store.google.com/jp/product/google_wifi)を買ってみました。
![wifi-google-20161005-top.png](https://qiita-image-store.s3.amazonaws.com/0/94307/e9a2a77f-b609-03c6-1334-306285303755.png)

## 現状の自宅環境

- ルーター
    - NEC [Aterm WG1800HP2](http://www.aterm.jp/product/atermstation/product/warpstar/wg1800hp2/)
- 接続端末
    - PC * 6 
        - macOS * 3
        - Windows7 * 2
        - Windows10 * 1
    - Tablet * 2
        - iOS * 2
    - SMP * 3
        - iOS * 2
        - Android * 1
    - ゲーム
        - PS4
- 家の広さ
    - 2Fの戸建て 

どう考えても多すぎる・・・（実家出る前はSwitchとかもあったからやばいｗ）
これでIoTやりたいなぁとか考えていたから見直すタイミングとしてはよかったのかも！！


## 今までのルーターの面倒な点
割りと環境構築が苦手な自分としては今までのルーター設定が嫌いだった。
接続のパスワード入力や周波数によって何か違うのか、たくさんの端末の割り振り
有線LAN使えるものはなるべく使おうとして子機の扱いなど複雑化していた。


## Google Wifiを選んだ理由
選んだ最大の理由はチャンネルの自動化でした。
どこのチャンネルに割り振ればいいのかを自動でやってくれるのは非常に助かるし
設定もとてもスムーズでした。
箱から開けて10分あればもう使えるようになっています。

もー超サクサク！！
設定もらくらく！
今年一番買ってよかったー！って思いました


## Google Wifiで困ったこと
Windows7がとても困りました。
つながる端末と繋がらない端末がありました。
家にあった全てのWindows7端末は以下になります。

- REGZA PC(東芝)
- 富士通ノートPC（古いので倉庫にあったもの）
- 富士通ノートPC

REGZA PCはテレビ見るようで、富士通PCは父のものでした。

接続をしようとしたところWindows7ではルーターの名前が文字化けして少し不安がありましたが、東芝と富士通（古い）は接続することができました。


ですが父が使っている**富士通ノートPC** がどうあがいても接続することができませんでした・・・

公式のサポートコミュニティではこうです。
https://productforums.google.com/forum/#!topic/googlewifi/WMFBOoo42N0

どうやらアメリカの方でも接続に困ってるWindows7ユーザーはたくさんいるようです。
接続ができるものとできないもの（もしかしたらGoogle Wifiのアップデートで可能になるかもですが）があるのでお気をつけください。
私は諦めました(><)
dockerでmysql

dockerにmysqlを作成した時の手順メモです。

### network作成
```
docker network create app
```

### 永続化領域の作成
```
docker pull busybox
docker create -v /Users/xx/Project/appname/storage --name appstorage busybox
```

### mysqlの構築
```
docker pull mysql
docker run --volumes-from appstorage --name appdb --network app -h appdb -p 3307:3306 -e MYSQL_ROOT_PASSWORD=password -d mysql
#タイムゾーン変更
docker exec appdb cp /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
docker exec appdb /bin/bash -c 'echo [mysqld_safe] >> /etc/mysql/my.cnf'
docker exec appdb /bin/bash -c 'echo timezone = JTC >> /etc/mysql/my.cnf'
```

### DB作成
```
docker exec appdb /bin/bash -c "mysql -uroot -ppassword -e'create database appdb'"
```
Codeanywhereにnpm入ってなくて困ったとき

タイトル通りの状況の際の応急処置です。

# apt-get で　入れちゃう

> sudo apt-get install npm

とりあえずこれで使えないことは無い。
Codeanywhere便利ですよね。
Jekyllブログの実験場でよく使ってます。

* https://codeanywhere.com/
UiPath勉強二回目

#UiPathに触ってみる(1)

前回ダウンロードしたUiPathを使用しInternet Explorerを開くプロジェクトの作成を行う。

![1.PNG](https://qiita-image-store.s3.amazonaws.com/0/246340/29bf8d40-9487-2bbc-9197-b8f2d66d5c84.png)

DESIGNタブにある「Recording」を選択、


![1.PNG](https://qiita-image-store.s3.amazonaws.com/0/246340/14bbb3f5-9c93-fc1b-03d5-2568d5275552.png)

表示された一覧の中から「Web」をクリック。

![2.PNG](https://qiita-image-store.s3.amazonaws.com/0/246340/ee8693c5-483c-0c54-0030-41df0df9c6df.png)

クリックすると下記のような画面が表示される。

![3.PNG](https://qiita-image-store.s3.amazonaws.com/0/246340/cbfa1432-90f6-d4a0-7406-984aedb220e0.png)

「Open Browser」を選択すると、デスクトップ上を選択できるようになるのでInternet Explorer上の適当な画面をクリック。クリックすると下記のようなポップアップがでてくるので、URLを確認後OKを押す。

![10.PNG](https://qiita-image-store.s3.amazonaws.com/0/246340/607b418b-5e31-f8fc-a57a-517640ab2b2d.png)

再び、レコーディングバーが表示されるので、「Save & Exit」ボタンで保存する。

![3.PNG](https://qiita-image-store.s3.amazonaws.com/0/246340/7c92d507-e05e-e3ae-bfe7-a60440562a95.png)


保存すると、UiPathの中央に「Recording Sequence」ボックスが追加されているのが確認できる。

![11.PNG](https://qiita-image-store.s3.amazonaws.com/0/246340/c58e7780-4291-ee77-f366-37fb44d12bfe.png)

その状態で、DESIGNタブにある「Run」を実行。

![1.PNG](https://qiita-image-store.s3.amazonaws.com/0/246340/60de2864-ac77-3235-f833-4de40147c2af.png)

Internet Explorerが起動することを確認できる。
PythonでNPBのチームデータが取りたい。(pandas)

日本プロ野球選手会のHPからチーム名を取得する。
python3、windowsの環境。
tableタグのあるリストを取得してprintで表示する。

```python:getTeam.py
import pandas as pd

url = ('http://jpbpa.net/register/')
fetched_dataframes = pd.io.html.read_html(url)
print(fetched_dataframes)
```

実は最終的にやりたい事とは少し違う。
PythonでWikiみたいなものを作ってみた

# 作ったもの
Python 3を使ってWikiのようにページの内容をユーザーが書き換えることができるシステムを作りました。

ページの内容はreStructuredTextを使って記述します。

リポジトリは https://github.com/SiLeader/e97 です。

# 使ったもの
## Python 3
Python 3.5からType Hintsがついて個人的にかなり使いやすくなったと感じているPython 3です。
Pythonは動的型の言語ですが、型を示すことである程度のバグを減らしたり、うっかりミスをなくしたりすることができます。

Pythonを使った理由としては以下のとおりです。

+ Pythonは標準のライブラリが多い (比較していないからどれくらいとかはわからない)
+ Python 2を今更使うのはなんか微妙
+ Rubyは記述が自由すぎて自分に合わない (Disるつもりはないです)
+ Node.jsはJavaScriptの弱い型が苦手 (これもDisるつもりはないです)
+ WebアプリをC++で書くとなるとHTTPサーバー作るところから始めないといけないし

ということでPythonになりました。

## MongoDB
個人的にSQLは難しいと感じます。SQL自体は書けなくはないですが、配列がないのが辛い。
結構配列ってよく使う構造だと思うのですが、自分の知る限りのSQL系データベースは配列に対応していない。(知らないだけかもしれません)

ということでJSONぽいBSONでデータを保存するMongoDBを使いました。
配列が使えて、カラムに当たる部分が突然一つ増えても普通に対応してくれて、文字数を指定しなくて良いというのは個人的にかなり気に入ってます。

### PyMongo
PythonのMongoDBのドライバです。
今のところ何も問題にぶち当たっていないので使いやすい部類に入ると思います。

Pythonの`datetime`を入れるとISODataとして自動的に保存してくれます。
最近気づいたのですが`MongoClient`に`tz_aware=True`を渡すとタイムゾーンを付けて返してくれるみたいですね。これを知るまでは毎回タイムゾーンを付けて回るという無駄な処理を施していました。

## Flask
Pythonのマイクロフレームワークです。

個人的には、ここまで面倒を見られないくらいがちょうどいいですね。
RailsとかDjangoはデータベースへの処理を抽象化してくれる上、MVCとかMVTをしっかり分離させてくれるのですが、色々覚えることとか設定が多いと感じました。(使いこなせるようになれば滅茶苦茶 楽なんでしょうけど)

FlaskはテンプレートエンジンにJinja2を使っています。
Jinja2はAnsibleにも使われているテンプレートエンジンで、Djangoぽさがある文法で書かれます。

### Flask-WTF (CSRFProtect)
Flask-WTFのCSRFProtectの部分だけ使わせていただいてます。

このシステムは社内Wikiとかを想定しているので、ログインしないと何もできません。
なので本来はCSRF対策はいらない気がしなくもないですが、対策ならやって後悔することもないだろうと思い付けてみました。

# さいごに
かなり作りがやわいところなどがあると思いますが、興味がある方は使ってみていただきたいです。

変なところや良くないところ、あったらいい機能などありましたら、お伝えいただけると幸いです。
WindowsでODBCドライバを設定する方法

# はじめに
今さら感はありますが、WindowsにODBCドライバを設定する方法を書き記します。
Qiitaのみならず他にもたくさん記事はありますが、筆者が見返す時に早く見返せるようにするためのメモ的な記事です。

ODBCドライバの設定は、SQLクライアントを使うときや、ExcelでDBに接続する場合など、たまに必要になる設定です。

今回の記事で筆者が使用している環境を紹介しておきます。

|カテゴリ|バージョン|補足|
|:-------|:---------|:---|
|OS|Windows 7 64bit|古くてすみません|

## 1. データソースアドミニストレーターの起動
ODBCドライバを登録するための「データソースアドミニストレーター」というアプリケーションを起動します。
データソースアドミニストレーターは、64bit用と32bit用が存在し、次の方法で起動でします。

■64bit用の起動
スタートメニューに「odbc」と入力し、検索します。
「Microsoft ODBC Administrator」をクリックし起動します。

■32bit
次のコマンドをスタートメニューの検索ボックスに入力し、Enterします。
コマンド：`%windir%\SysWOW64\odbcad32.exe`

# 2. Oracle編
こちらでは、OracleのODBCドライバを設定する方法をご紹介します。
Oracleでは、Oracleクライアントをデータソースとして使用するため、接続先サーバーに応じたクライアントをインストールしておいてください。

## 2.1. データソースの追加
データソースアドミニストレーターを使用し、データソースを追加していきます。
追加はユーザーDNSを使用します。

①追加ボタンをクリック
![p1.jpg](https://qiita-image-store.s3.amazonaws.com/0/189344/a555ff60-766d-f9ef-03c4-c11f82a44f51.jpeg)

②データソースを選択し完了をクリック
Oracleクライアントがインストール済みであれば、ORACLE_HOMEが表示されますので、それを選択して完了します。
![p2.jpg](https://qiita-image-store.s3.amazonaws.com/0/189344/18fd3b50-1b27-52a8-31d5-50d75fc7f110.jpeg)

③必要項目を入力しOKをクリック
入力内容は下記のとおりです。

|入力項目|入力内容|補足|
|:-------|:-------|:---|
|データソース名|任意にわかりやすい名前を入力します|
|説明|未入力でも構いませんが、わかりやすい説明を入力しましょう|
|TNSサービス名|tnsnames.oraに記載しているサービス名を入力します|
|ユーザーID|未入力|

入力が完了したら接続テストをしておくとよいでしょう。
![p3.jpg](https://qiita-image-store.s3.amazonaws.com/0/189344/e7afed53-bb7a-5a41-724c-04f246244ee6.jpeg)

④追加できたことを確認してOKをクリック
![p4.jpg](https://qiita-image-store.s3.amazonaws.com/0/189344/9620be80-5a81-6a30-c5c2-80c84d6be8d5.jpeg)

以上でOracle用データソースの追加は完了です。

# 終わりに
この記事は各データベース用に更新していきます。
ただし、筆者がそれを使う場面に遭遇した時になるので、あまり期待はしないでください(^^;)
Tableauでレーダーチャートをつくる

#####▼目的
Tableauでレーダーチャートを作成する。
レーダーチャートは複数の指標を俯瞰的に見ることができる。
TableauでレーダーチャートのFmtがなかったので、xyの2次元上に座標点を取得する。

下記の記事の内容を参考に、作成したメジャーの内容も含め説明します。
参考：
レーダーチャート（マニア向け）
https://ksugii.tumblr.com/post/168495305379/%E3%83%AC%E3%83%BC%E3%83%80%E3%83%BC%E3%83%81%E3%83%A3%E3%83%BC%E3%83%88%E3%83%9E%E3%83%8B%E3%82%A2%E5%90%91%E3%81%91


#####▼ポイント
・レーダーチャートで表したい指標は5つ、値の最大値は5、最小値は0であることを想定します。
・各項目においてxyの2次元上に座標点を取得する計算式を書く
　xはcosθ、yはsinθで表す(サイン、コサインで座標を表す)
　x = 指標の値 * cosθ  　　　y = 指標の値 * sinθ

![image.png](https://qiita-image-store.s3.amazonaws.com/0/100064/a50a557f-a4b7-10d9-0a0e-355d6556c100.png)
http://www.fumiononaka.com/Drafts/ActionScript30/ActionScript30_Math03.html

最初のKPI1 ⇛ π/2(cosπ/2 = 0  sinπ/2 = 1となります)
次のKPI2   ⇛ π/2 - 2π/5 
次のKPI3   ⇛ π/2 - 4π/5
次のKPI4   ⇛ π/2 - 6π/5
次のKPI5   ⇛ π/2 - 8π/5
次のKPI1'   ⇛ π/2 - 10π/5
のように続きます。
 

#####▼ステップ
①データを用意(下記画像を参照)
・エクセルでレーダーチャートで表したいデータ(Product：A)と
　レーダーチャートのグラフ(Avg、Avg-1,Avg-2,Avg+1,Avg+2)を用意します。

・レーダーチャートのグラフ(Avg、Avg-1,Avg-2,Avg+1,Avg+2)は「偽」
　レーダーチャートで表したいデータ(Product：A)は「真」となるようなカラムも用意
　※グラフの太さを変更する際に使用します。

<img src="https://qiita-image-store.s3.amazonaws.com/0/100064/fc948bb5-42a6-926c-6c71-d2a299bd6027.png" height=50%>

②データが用意できたら、レーダーチャートを作成するのに必要なメジャーを作成します。
・index

```SQL
INDEX()
```

・KPI_Counts_adj
今回はKPIの名前が6個(KPI1'も含めて)あるので、-1する。

```SQL
{FIXED:COUNTD([KPI Name])} - 1
```

・Radians：cos,sin でつかう角度

```SQL
PI()/2 - 2*PI()/avg([KPI_Counts_adj])*([index]-1)
```

・X座標

```SQL
sum([KPI Value])*COS([Radians])
```

・Y座標

```SQL
sum([KPI Value])*SIN([Radians])
```

・KPI Value for Lable：KPIの値を表示するためのラベル

```SQL
if
ATTR([Product]) = "Max"  then null 
elseif LAST() != 0 then sum([KPI Value]) 
end
```



③Tableauで下記の図のように設定するとレーダーチャートが表示される。
　線の太さや色は「Line」と「Product」で調整します。


<img src="https://qiita-image-store.s3.amazonaws.com/0/100064/1dc9b3c7-4b2d-26b1-eda1-f0f3dbf79649.png" width=75%>
サクラサーバで500エラーが出た時の対処法

サクラでレンタルサーバー
メールフォームphpをアップした時に500エラーが出てはまった時の解決方法メモ
# パーミションを確認
ファイルとディレクトリを705か755に
# メールアドレスが登録されていない
phpに記述されているメールアドレスが存在しないものだった、あるいはサクラのレンサバに契約、登録されていないものだった
最新版IBM Cloud ライトアカウント登録手順(2018-05-06時点)

訳あって、IBM Cloudライトアカウントのための画面コピー一式を取ったので、メモとしてqiitaにも手順を書き込んでおきます。

[2020-04-25]最新手順は下記リンク先に作り直しています。こちらを参照してください
[無料でなんでも試せる! Watson Studioセットアップガイド](https://qiita.com/makaishi2/items/b666f847a98c2e42dfbb)

# IBM Cloudトップページにアクセス
[IBM Cloud](https://console.bluemix.net/)で、「フリー・アカウントの作成」をクリックします。

![ibmcloud-01.png](https://qiita-image-store.s3.amazonaws.com/0/206130/8364bd0e-4f34-834c-acfa-26aa337443b8.png)

# e-mailアドレス入力
アカウント登録の画面が出てくるので、自分のe-mailアドレスを入力し、→のアイコンをクリックします。ここで入力したe-mailアドレスは、そのままIBM CloudのユーザーIDになります。
(注意)過去にIBM Cloudに登録したIDでは使えないことがあるので注意して下さい。
その場合、新しいメールアカウントを作って、そのIDで登録するのが一番簡単な方法です。

![ibmcloud-02.png](https://qiita-image-store.s3.amazonaws.com/0/206130/28e1ea02-d274-c1a1-c61b-af88ad3dea5e.png)

# 必要事項入力
下の画面で必要事項を入力して、「アカウントの作成」ボタンをクリックします。
最低限必要なのは、「名前」「姓」「国または地域」「パスワード」の4項目です。
(注意)パスワードは簡単すぎると登録エラーとなりますのでやり直して下さい。
英大文字、英小文字、数字、特殊記号('_'とか'!'など)の4種類全部を含んでいる必要があります。

![ibmcloud-03.png](https://qiita-image-store.s3.amazonaws.com/0/206130/0d1cbf88-a5f5-418e-e1f9-8a6f3da22742.png)

# ロボット対策
次のようなロボット対策の画面がでますので、正しい回答を設定して「確認」ボタンを押し、先に進みます。(失敗してもリトライできるので焦らないで下さい。)
![ibmcloud-06.png](https://qiita-image-store.s3.amazonaws.com/0/206130/fd15fcba-20b3-3296-96ea-3ef1a2d2afaf.png)

# 登録完了メッセージ
次の画面になるので、登録したe-mailアドレスに届いた招待メールを確認します。

![ibmcloud-07.png](https://qiita-image-store.s3.amazonaws.com/0/206130/a0e59e32-4b21-6b75-35e0-9aa8d91fa155.png)

# アクティベーション
登録したアドレスに下のような招待メールが届いているはずなので、「Confirm Account」のボタンをクリックして、アカウントのアクティベーションをかけます。

![ibmcloud-08.png](https://qiita-image-store.s3.amazonaws.com/0/206130/4b06c1cf-7858-af28-f201-aeb5b27283a1.png)

# アクティベーション完了
下の画面が表示されるので、「ログイン」のボタンをクリックするか、次のURLを指定します。
[ログイン](https://console.bluemix.net/login)

![ibmcloud-09.png](https://qiita-image-store.s3.amazonaws.com/0/206130/f2ecd099-55da-cd02-8602-a4635a77b8a3.png)

# ログイン(e-mailアドレス)
ログイン画面が出てくるので、登録したe-mailアドレスを指定します。
![ibmcloud-10.png](https://qiita-image-store.s3.amazonaws.com/0/206130/dba970e8-6c8a-ffb0-ebea-775e1b527d15.png)

# ログイン(パスワード)
引き続き、パスワードを入力します。
![ibmcloud-11.png](https://qiita-image-store.s3.amazonaws.com/0/206130/36a14c63-5770-b2f4-427e-4f938a08ca17.png)

# ダッシュボード画面
正しくログインできると、次のようなダッシュボード画面が表示されます。

![ibmcloud-12.png](https://qiita-image-store.s3.amazonaws.com/0/206130/9cb68c21-dc0e-f173-8459-435924fc1524.png)

# その次にどうする

- Node-REDを使う
[IBM LiteアカウントでNode-REDインスタンスを作成する](https://qiita.com/makaishi2/items/ed9d4412331d7d65fde5)

- Watson APIのインスタンスを追加
[IBM Cloudの基本 -サービスの作成から資格情報の取得まで-](https://qiita.com/makaishi2/items/43622db769d6a7e9b560)

- Watson Studioを使う
[10分でできるPython機械学習環境! Watson Studioセットアップガイド](https://qiita.com/makaishi2/items/b666f847a98c2e42dfbb)
など
20: Raspberry Pi3 で処理完了の通知を送る - LINE Notify

# はじめに
こちらは
[Arduino と Raspberry Pi の違いのまとめ](https://qiita.com/KZ2/items/5e0e79f84e4dd26bd373)
の個別記事で、Raspberry Pi で処理の完了をユーザに通知する。

## 要件
- 処理が完了したら、その処理を実行したユーザに処理の完了を通知する
- 複数人が利用するシステムで、ユーザは特定されている
- 処理完了をすぐに気がついてもらうことが必要で、通知には即時性が求められる

## 処理の通知処理のオプション
いろいろと用途に応じてオプションがあると思う。
emailを送る,SmartPhoneのApplication, ディプレイへの表示、 SMSでメッセージ通知など

今回のプロジェクトの処理は、処理を開始して2，3分で終わるものの、終わったあとにすぐ結果を得たいという動機があるため、email だとちょっと遅い可能性もあり、SMS を選択したい。
しかし、SMSだと価格は安いものの費用がかかるものしか見つけられなかったので、LINE を使って処理完了のメッセージを送ることにした。ユーザは複数人だが、とりあえず自分だけに送付できればよいので進める。

## LINE Notifty


[LINE Notify](https://notify-bot.line.me/ja/)
に自分のLINE accountでloginして、

Generate access token (For developers)

から Generate token を選択すると、TOKEN が得られる。えらく長い40数文字の文字列だ。

このTOKENを用いて、下記のようにすれば簡単にLINE Notifyというaccountから自分宛にMessageを送ることができる。


```py　notify_LINE4you.py 

#!/usr/bin/python

import requests

TOKEN = 'INPUT YOUR TOKEN HERE' # 取得したTOKENをここに入れる
API = 'https://notify-api.line.me/api/notify'
MESSAGE = 'ready.'

payload = {'message': MESSAGE}
headers = {'Authorization': 'Bearer ' + TOKEN}
line_notify = requests.post(API, data=payload, headers=headers)
```

肝はこれだけである。Library のおかげでいとも簡単にHTTPの通信ができてしまう。

APIはこちらに説明がある。オプションでJPEGやPNGの画像も同時に送ったりすることができる。
https://notify-bot.line.me/doc/en/


# 親記事
[Arduino と Raspberry Pi の違い](https://qiita.com/KZ2/items/5e0e79f84e4dd26bd373)
Linux (Ubuntu 16.04 LTS) に geth をインストール

Linux (Ubuntu 16.04 LTS) に geth をインストールするには、次のコマンドを実行します。

```
$ sudo apt-get install software-properties-common
$ sudo add-apt-repository -y ppa:ethereum/ethereum
$ sudo apt-get update
$ sudo apt-get install ethereum
```

Linux の中では、Ubuntu が正式にサポートされているので、geth をインストールするのであれば素直に Ubuntu にしておくのが吉。

#参考
- http://blog.playground.io/entry/2018/05/06/220506
- https://github.com/ethereum/go-ethereum/wiki/Installation-Instructions-for-Ubuntu

# Note
- Ethereum 関連の情報は https://scrapbox.io/sushiether/ に集約することにしました。
- この記事の内容に変更・更新がある場合は、以下の URL を更新します。
- https://scrapbox.io/sushiether/Linux_(Ubuntu_16.04_LTS)_に_geth_をインストール
Windows10のユーザフォルダ名変更後の参照エラー

Markdownの練習と作業ログも兼ねて初めて記録を残してみる。

**概要**
Win10でユーザフォルダ名を変更すると一部の古い（？）ソフトウェアが動作しなくなった。
ユーザフォルダ直下のリンクの情報を修正すれば解決する模様。

**前提**

* Windows 10 (64bit)
* （直接関係ないけど）gnupack_devel-13.06-2015.11.08
* `C\Users`直下のユーザフォルダ名を変更した

## 経緯 - ユーザフォルダ名の変更
普段“noriben”というユーザ名を愛用している（仮名）のだが、Win10のユーザーフォルダが“norib”
とかいう中途半端な名前にされてしまっていた。

モヤモヤするので、こちらの記事を参考にユーザフォルダ名の変更作業を行った。
「手順2」に従い、アカウントを追加することなくフォルダ名の変更を行った。

*Windows10のユーザーフォルダ名変更 - @aaaKUKIaaa*
*https://qiita.com/aaaKUKIaaa/items/83d6234b69b0d958d3f1*

追加作業として、念のためレジストリの関連項目を一括修正した。
適当なソフト（[Registry Finder](http://registry-finder.com/)等）で`norib\` -> `noriben\`でキー・値を一括replaceした。
（`C:\Users\norib\`だと取りこぼしがあるので注意）

## 課題 - emacsとcygwin（gnupack）が起動しない
当方emacs派なのでCygwinもセットで導入すべくgnupackを愛用しているのだが、
この両方が起動しなくなった。

start_emacs.exe（start_cygwin.exe）を起動すると以下のような警告が出た。
`fontcache`はgnupackの各種ソフトで読み込むフォント（Migu 1Mとか）が置かれるフォルダ（らしい）。

![errorlog.PNG](https://qiita-image-store.s3.amazonaws.com/0/147798/cba4ef33-7851-1526-6033-718c2a29e702.png)

## 原因 - Local Settingsの参照先情報が古い

### Local Settingsは何処へ

エラー文に従いフォルダ`fontcache`の在処を見に行こうと試みるも、ユーザフォルダ以下にLocal Settingsが無い。

![filelist.PNG](https://qiita-image-store.s3.amazonaws.com/0/147798/9de70a66-34e3-0fa6-0c37-bc31b7d3af54.png)

他アカウントのユーザフォルダでもLocal Settingsは見つからないので、コマンドプロンプトで`dir /a`してみた。

```
:\Users\noriben>dir /a
 ドライブ C のボリューム ラベルは OS です
 ボリューム シリアル番号は hoge-fuga です

 C:\Users\noriben のディレクトリ

2018/05/06  10:30    <DIR>          .
2018/05/06  10:30    <DIR>          ..
（略）
2017/12/29  16:20    <DIR>          AppData
（略）
2018/05/06  10:30    <JUNCTION>     Local Settings [C:\Users\norib\AppData\Local]
（略）
               8 個のファイル           x,xxx,xxx バイト
              34 個のディレクトリ  xxx,xxx,xxx,xxx バイトの空き領域
```

`C\Users\[username]\AppData\Local`へのリンクとして`Local Settings`が貼られているが、
その参照先が`C\Users\norib`以下となっている。
もちろん`[username]`は`noriben`に変わっているので、`fontcache`が参照不可となっていた。

### ジャンクションリンク
調べてみると、`C\Users\[username]\Local Settings`というのはWin7時代に使われていた場所で、
Win10では`C\Users\[username]\AppData\Local`がそれに相当するらしい。
当然Win7対応ソフトは前者を参照するので、Win10では前者から後者へのリンクを貼ることで
互換性対策が為されているものと想像できる。

それはともかく、このリンクは「ジャンクションリンク」と呼ばれるもので、ハードリンクや
シンボリックリンクとはまた別物。詳細は自分の説明よりも以下をご参照。

*Tech TIPS：Windowsのシンボリックリンクとジャンクションとハードリンクの違い - 打越浩幸*
*http://www.atmarkit.co.jp/ait/articles/1306/07/news111.html*

ジャンクションリンクはコマンドプロンプトから貼ることができる。
`mklink`コマンドに`/J`オプションを付ければよい。

```
> mklink /J [リンク名] [リンク先のパス]
```

## 対応 - ジャンクションリンクの貼り直し
`Local Settings`のジャンクションリンクを一旦`rmdir`コマンドで削除し、貼り直す。

```
> cd C:\Users\noriben
> rmdir "Local Settings"
> mklink /J "Local Settings" C:\Users\noriben\AppData\Local
```

## 結果 - 復活
startup_emacs.exe及びstartup_cygwin.exeが両方とも無事に起動するようになった。

#### 余談1
実際にユーザフォルダで`dir /a`すると、他にもジャンクションリンクが貼られていることが分かる。
こいつらを貼りなおせば、[上記参照記事](https://qiita.com/aaaKUKIaaa/items/83d6234b69b0d958d3f1)で言及されていた一部の問題も解決するかも？（未検証）
> 1.　iTunesの楽曲がすべて吹っ飛んだ → "Application Data"？
> 2.「最近表示したファイル」的なのが揃いも揃ってみんなだめ → "Recent"？

#### 余談2
貼り直したリンクはエクスプローラー上でも思いっきり見えている。

![newfile.PNG](https://qiita-image-store.s3.amazonaws.com/0/147798/564990d7-89b8-1a9b-a3f2-980f4701c09d.png)


## まとめ
ユーザフォルダ上には色々とジャンクションリンクが貼られている。
やむを得ない理由でユーザフォルダ名を変更したら、リンクの情報も併せて更新するべし。