OmniAICreator/Qiita-1.07M huggingface dataset:
k近傍法について

# k近傍法とは
KNN(K-Nearest Neighbor)
クラス分類問題に使われる．
データの類似度が高いものを検出するのに使う．
対象データとの距離によりどちらのグループに分類できるか判定する．

## 解説 
以下の図の例では緑の円（対象データ）が青い四角と赤い三角の二つのグループどちらに分類されるのか計算する．特徴が2つの場合は以下のように2次元となるが，k個の特徴を持つ場合にはk次元となる．もっとも近い値を持つクラスに分類するのが最近傍法(Nearest Neighbour)．
しかし，対象データはk=3とすると赤のグループに含まれるが，k=7として，点線内側を見ると青のグループのほうが数が多いのでこの場合，対象データは青四角のグループに含まれる方が正しい．これをk近傍法(k-Nearest Neighbour) という．
<img width="244" alt="Screenshot 2018-08-08 10.10.35.png" src="https://qiita-image-store.s3.amazonaws.com/0/181094/61afe87c-04da-4337-220c-4845035d1d04.png">
ちなみに，k=4とするとどちら赤，青それぞれ2つずつ含まれるので分類ができないためkは奇数の方が良い．

## 変形k近傍法(modified kNN)
k=4とした時，k近傍法では緑は赤，青どちらのグループに含まれるか判定できないが，
各データに対象データとの近さによって重みを与える方法を変形k近傍法という．
上の図の例の場合，対象データは赤のグループに含まれる．


## sampleプログラム
```python:k_nearest.py
import cv2
import numpy as np
import matplotlib.pyplot as plt

# Feature set containing (x,y) values of 25 known/training data
trainData = np.random.randint(0,100,(25,2)).astype(np.float32)

# Labels each one either Red or Blue with numbers 0 and 1
responses = np.random.randint(0,2,(25,1)).astype(np.float32)

# Take Red families and plot them
red = trainData[responses.ravel()==0]
plt.scatter(red[:,0],red[:,1],80,'r','^')

# Take Blue families and plot them
blue = trainData[responses.ravel()==1]
plt.scatter(blue[:,0],blue[:,1],80,'b','s')


newcomer = np.random.randint(0,100,(1,2)).astype(np.float32)
plt.scatter(newcomer[:,0],newcomer[:,1],80,'g','o')

knn = cv2.ml.KNearest_create()
knn.train(trainData,cv2.ml.ROW_SAMPLE,responses)
ret, results, neighbours ,dist = knn.findNearest(newcomer, 3)

print ("result: ", results,"\n")
print ("neighbours: ", neighbours,"\n")
print ("distance: ", dist)

plt.show()
```

## 実行結果
結果のresult=0から赤いグループに属していることがわかります．
近傍は近いものから青，赤，赤になります．
距離は281,328,401となりました．
数値はランダムなので結果は毎回変わります．

```
result:  [[0.]] 

neighbours:  [[1. 0. 0.]] 

distance:  [[281. 328. 401.]]
```

![Figure_1.png](https://qiita-image-store.s3.amazonaws.com/0/181094/fd549250-0033-8c2a-c79e-3161d4a24c97.png)


#参考文献
https://www.codexa.net/collaborative-filtering-k-nearest-neighbor/
http://labs.eecs.tottori-u.ac.jp/sd/Member/oyamada/OpenCV/html/py_tutorials/py_ml/py_knn/py_knn_understanding/py_knn_understanding.html
Laravel5.5をCloud9(aws)で始める手順

環境：cloud9(AWS)

#初回のみ実行

①シェルファイルを作成【/environment/update.sh】

```
touch update.sh
```

②作成したシェルファイルに下記を記述 (phpのバージョンアップとcomposerのインストール)

```
sudo yum -y install php71 php71-cli php71-common php71-devel php71-mysqlnd php71-pdo php71-xml php71-gd php71-intl php71-mbstring php71-mcrypt php71-opcache php71-pecl-apcu php71-pecl-imagick php71-pecl-memcached php71-pecl-redis php71-pecl-xdebug
sudo alternatives --set php /usr/bin/php-7.1
sudo curl -sS https://getcomposer.org/installer | php
sudo mv composer.phar /usr/local/bin/composer
```

③シェルファイルを実行

```
$ sudo sh update.sh
```

#Laravel5.5をcloud9で始める手順

**①プロジェクトを作成**

```
$ composer create-project laravel/laravel ./projectname "5.5.*" --prefer-dist
```

**②プロジェクトに移動**

```
$ cd ~/environment/projectname
```

**③Gitイニシャライズ**

```
$ git init
$ git add .
$ git commit -m "init Project"
```

**④サーバの起動**

```
$ php artisan serve --port=8080
```

※変更が反映されなかったら[ctrl] + [c]でサーバを停止し下記コマンドでキャッシュクリア

```
$ php artisan cache:clear
```

**⑤環境変数の修正【/.env】**

```
DB_DATABASE=dbname
DB_USERNAME=root
DB_PASSWORD=
```

**⑥DBを作成**

```
$ sudo service mysqld start
$ mysql -u root
mysql> CREATE DATABASE dbname;
```

※DB名にハイフンがある場合は \`message-board\` のように囲む

**⑦DBコネクション確認**

```
$ php artisan tinker
>>>DB::connection();
>>>exit
```

**⑧デフォルトのインデックス用文字列長を設定【app/Providers/AppServiceProvider.php】**

```
public function boot()
{
    \Schema::defaultStringLength(191);
}
```

```
$ mysql --version
```

>Laravelはデータベース中への「絵文字」保存をサポートするため、デフォルトでutf8mb4文字セットを使っている。バージョン5.7.7より古いMySQLや、バージョン10.2.2より古いMariaDBを使用している場合、マイグレーションにより生成されるデフォルトのインデックス用文字列長を明示的に設定する必要がある。(ドキュメントの「Laravel 5.5 データベース：マイグレーション」を参照)

**⑨タイムゾーンの設定【config/app.php】**

```
'timezone' => 'Asia/Tokyo',
```

※必要ならlocaleとかも設定 https://www.ritolab.com/entry/48

##以下、必要であれば！(ログイン・コレクティブ)

**⑩認証に必要となるルート定義とビューをすべてスキャフォールディング**

```
$ php artisan make:auth
```

**⑪マイグレーションを実行**

```
$ php artisan migrate
```

**⑪laravelcollectiveのインストール【composer.json】**

```
"require": {
    "php": ">=7.0.0",
    "fideloper/proxy": "~3.3",
    "laravel/framework": "5.5.*",
    "laravel/tinker": "~1.0",
    "laravelcollective/html": "^5.4.0" // 追加
},
```

```
$composer update
```

**⑫laravelcollectiveを使用するにあたっての設定【config/app.php】**

```
    'providers' => [

        // 追加
        Collective\Html\HtmlServiceProvider::class,
    ],

    'aliases' => [

        // 追加
        'Form' => Collective\Html\FormFacade::class,
        'Html' => Collective\Html\HtmlFacade::class,
    ],
```

初投稿です！少しずつ見やすくなるように修正いたします。
CANプロトコル　初歩の初歩

# CANプロトコル
- 車載や医療などで使用されるCANについて記載します
- 超初心者用です

# 基本
- CAN:　controller area network
- 制御系車載ネットワークの業界標準
- Bosch(独)が1986年にSAE(Society of Automotive Engineers)で提案
- 当時のコンセプト
    - マルチマスタ・プロトコル
    - ロバスト性の高い（堅牢な）アービトレーション（調停）メカニズムを採用
    - 高優先度のメッセージは遅延なしでバスに送信
    - エラー検出メカニズム搭載
    - 故障ノードは自動開放
- アクセス方式
    - イベント・ドリブンでEthernetと同じCSMA/CDをベースにしている
    - CSMA/CDはコリジョン（衝突）が発生した場合はランダムで待ち時間を設けて再送する
    - これだと制御用のCANには向いてないので、これを改良している
    - バスが解放（信号がない状態）はどのノードでもメッセージ送信可能なマルチマスタ方式
# フレーム
- 4種類のフレームを用意
- データフレーム
    - トランスミッタ（送信ノード）からレシーバ（受信ノード）への送信用
    - データフレーム間は3ビット以上のリセッシブで分離
    - リセッシブはインターフレーム・スペースとも呼ばれる
- リモートフレーム
    - データフレームを要求するときに使う
- エラーフレーム
    - バスのエラー検出したノードが使う
- オーバロードフレーム
    - データフレームの続きで使う
## データフレーム
- 7つのフィールドで構成される
    - SOF(start of frame)
    - アービトレーション
    - コントロール
    - データ
    - CRC
    - ACK(アクノレッジ)
    - EOF(end of frame)
  
# 参考
- 車載ネットワークシステム　徹底解説　佐藤道夫著

end
Python3　自然言語処理(NLP) - Mac



#MeCab(日本語の形態素解析エンジン)を使う
```terminal
#MeCabのinstall
brew install mecab
#MeCabの辞書を install
brew install mecab-ipadic
#MeCabのより詳しい辞書をinstall(推奨空き容量が5GB以上のため必要な場合のみ)
brew install git curl xz
git clone --depth 1 https://github.com/neologd/mecab-ipadic-neologd.git
cd mecab-ipadic-neologd
./bin/install-mecab-ipadic-neologd -n -a
#python3上でmecabを使う(/usr/local/lib/mecab/dic)
pip install mecab-python3

```
#ユーザー辞書の作成・インポート
#ユーザー辞書（複数作成可能）を有効にする（作った辞書のあるディレクトリまで行く)
```vim
#mecabに設定(vim)
vi /usr/local/etc/mecabrc
#キーボードの「I」を押して編集モードに
#黄色の部分に変更する(dicdir=システム辞書, userdic=ユーザー辞書)

; Configuration file of MeCab
;
; $Id: mecabrc.in,v 1.3 2006/05/29 15:36:08 taku-ku Exp　$;
;
dicdir =  /usr/local/lib/mecab/dic/mecab-ipadic-NEologd

;userdic = /usr/local/lib/mecab/dic/add.dic　

; output-format-type = wakati
; input-buffer-size = 8192

; node-format = %m\n
; bos-format = %S\n
; eos-format = EOS\n

#escキーを押し、「:wq」で変更を保存
```
#ユーザー辞書の更新(ユーザー辞書のあるディレクトリ上で実行)
```terminal
	/usr/local/Cellar/mecab/0.996/libexec/mecab/mecab-dict-index \
-d /usr/local/lib/mecab/dic/ipadic \
-u /usr/local/lib/mecab/dic//add.dic \
-f utf-8 \
-t utf-8 \
add.csv
```
#Mecabを使う(辞書のあるディレクトリで実行)
```python
# 必要なパッケージをインポート
import psycopg2 as psy2
import MeCab
# コネクション作成
conn = psy2.connect(dbname="", user="r", password="", host="", port="")
# カーソル作成
cur = conn.cursor()
#価格に関するレビューを抽出
price = "select * from *"
# SQL結果を受け取る
cur.execute(price)
#一度に取得する行数を設定（デフォルトは2000行）
cur.itersize = 10000
#結果の最初の行だけ取ってくる
result1 = cur.fetchone()
#全ての結果を取得する
result2 = cur.fetchall()
#MeCabで使用する辞書を指定し、分かち書き
m = MeCab.Tagger("-Ochasen -u ユーザー辞書名.dic")
print(m.parse(str(price)))
```

CaboCha(日本語の係り受け解析エンジン)を使う


gensim(LDAやword2vecが使えるライブラリ)を使う
pip install gensim
BitcoinKitでWalletを作り、残高を確認する

Bitcoinを使ったiOSアプリを手軽に使えるようにする[BitcoinKit](https://github.com/yenom/BitcoinKit)。

今回は
- walletの作成
- APIを利用して、残高を確認する

初歩的なところを解説していきます。
ソースコードは[こちら](https://github.com/akifuj/SampleWallet)にあるので、良かったら参照してください。

## ビルド方法
こちらを参照して下さい
[「BitcoinKit」のinstall方法](https://qiita.com/akifuji/items/fc7223a3fc993315e3df)

## walletの作成
今回は、HDWalletではなく、1つしかアドレスを持たない一番単純なwalletを作ります。

まずはprivate keyを生成し、それを引数にとってwallet作成します。

```swift
let privateKey = PrivateKey(network: .testnet)
let wallet = Wallet(privateKey: privateKey)
```

`network`では、BCH/BTC, Mainnet/Testnetの4種類が選べます。

上のコードでは、省略されていますが、private keyのinitializerの第2引数には、`isPublicKeyCompressed`が本来あります。

pubkeyには非圧縮と圧縮の2つの形があり、非圧縮のpubkeyは65バイトなのに対して、圧縮公開鍵は33バイトです。非圧縮のpubkeyを使うメリットが基本的に無いので、実装する際は圧縮公開鍵を使いましょう。Libraryでは、デフォルトで圧縮になっているので、気にする必要はありません。

### WIF(Wallet Import Format)
生成したprivate keyをkeychainなどに保存したい場合、**WIF(Wallet Import Format)**に変換すると便利です。Libraryでは以下のコードから、WIFの生成及び、WIFからwalletを復元する方法が示されています。

```swift
let wif = privateKey.toWIF()
let wallet = wallet = Wallet(wif: wif)
```


## Addressの表示
walletが作成できたら、walletのpubkeyを使って、アドレスが表示できます。

```swift
let pubkey = wallet!.publicKey
let base58Address = pubkey.toAddress()
// mjYvGxpiE9hyXFmkrMr9qyiNfNWSWm58FX
let cashAddr = pubkey.toCashaddr()
// bchtest:qqkrlfjuxtvkldq4pel3zxzc8tzwsyta7smhre48m5
```

アドレスは、base58でエンコーディングするものと、BCHの新しいアドレス表示方式のcashAddressに対応した2種類があります。

## 残高を確認する
まずは、[Bitcoin Cash Testnetのfaucet](https://testnet.manu.backend.hamburg/bitcoin-cash-faucet)にアクセスして、BCHを受け取りましょう(動作がが非常に不安定です)。
受け取れたら、TxIDを教えてくれるので、[Bitcoin Cash Testnet Explorer](https://www.blocktrail.com/tBCC)で確認しておくと良いと思います。
今回は、[BitPayのInsight API](https://github.com/bitpay/insight-api)を利用して、ブロックチェーンから残高を取得していきます。

End pointはこちら

```swift
let apiEndPoint = "https://test-bch-insight.bitpay.com/api" 
// Mainnet: "https://bch-insight.bitpay.com/api"
```

取得する`Unspent Outputs`の形は、以下のようになります。

```swift
struct UnspentOutput: Codable {
    let address: String
    let txid: String
    let vout: Int
    let scriptPubKey: String
    let amount: Decimal
    let satoshis: Int
    let height: Int
    let confirmations: Int
    let ts: Int
}
```

レスポンスをDecodeして、`amount`をチェックすれば、残高を確認することが出来ます。

<img width="370" alt="スクリーンショット 2018-08-08 9.38.09.png" src="https://qiita-image-store.s3.amazonaws.com/0/68236/fe237e86-5638-4a75-97b0-64a2211bac06.png">

# ひとこと
次回は、トランザクションの作成及び、送金のやり方について解説したいと思います！
Python3 - Pyenvを使ったインストール方法 - Mac



#sudoの設定
```terminal
$ sudo hoge
#ルート権限でコマンド(hoge)を実行できる. パスワードが聞かれるが, それには 自分のパスワードを答える。
$ sudo -s
#プロンプトが # に変わり, exit するまでルートのままでいられる.
$ sudo -u (ユーザ名) (コマンド or -s)
-u オプションを付けてユーザ名を指定すると, 指定したユーザ権限でコマンドが実行できる.
```



#Homebrewのインストール
```terminal
#手順
#以下をターミナルにペースト
sh -c "$(curl -fsSL https://raw.githubusercontent.com/Linuxbrew/install/master/install.sh)"
#上手くいかないときは、
$ sudo xcode-select --install
```
#pythonのversion変更
#pyenvのインストール
```terminal
手順
#terminal上で
git clone https://github.com/yyuu/pyenv.git ~/.pyenv  OR brew install pyenv
export PATH=$PATH:$PYENV_ROOT/bin
export PYENV_ROOT="$HOME/.pyenv"
eval "$(pyenv init -)"
#インストールできるpythonのversionを確認
#terminal上でinstall可能なver. をチェック
pyenv install -l
#特定のver.をinstall
pyenv install (pythonのver.)
#installされた利用可能なver.の確認
pyenv versions
#利用ver.の設定
#全体で
pyenv global (利用したいpython のver.)
#特定のディレクトリで
pyenv local (利用したいpython のver.)
#正しく動作させるためにShimsの更新
pyenv rehash
#passを通す
vi ~/.bash_profile
```
save json via spark dataframe on AWS S3

```

spark.sparkContext.hadoopConfiguration.set("fs.s3n.awsAccessKeyId", "[access key id]")
spark.sparkContext.hadoopConfiguration.set("fs.s3n.awsSecretAccessKey", "[secrete access key]")

val bucketName = "[buckect name]"
val s3path = s"s3n://$bucketName/some_directory/data.json"
df.write.mode("overwrite").json(s3path)

```
PC-88 z80asmでキー入力

```inkey1.asm
; z88dk / PC-88 mon
; z80asm -b -l inkey1.asm

tvram   equ     $f3c8

        org     $b000
start:
        ld      a, $0c          ; cls
        rst     $18             ; OUTIO
.loop
        ; キー入力
        ld      a, (dir)
        ld      b, a

        in      a, ($0a)        ; 左キー
        and     $04
        jr      nz, skip1
        dec     b
.skip1
        in      a, ($08)        ; 右キー
        and     $04
        jr      nz, skip2
        inc     b
.skip2
        ld      a, b
        and     $3f             ; 0～63
        ld      (dir), a

        call    WaitVBlank

        ; クリア
        ld      hl, tvram+120*5
        ld      b, 80
        ld      a, $20          ; ' '
.cls
        ld      (hl), a
        inc     hl
        djnz    cls

        ; 描画
        ld      hl, tvram+120*5
        ld      a, (dir)
        ld      b, a
        ld      a, $8e
.cont
        dec     b
        jp      m, break
        ld      (hl), a
        inc     hl
        jr      cont
.break
        jr      loop

WaitVBlank:
        in      a, ($40)
        and     $20
        jr      nz, WaitVBlank
.wait
        in      a, ($40)
        and     $20
        jr      z, wait
        ret

dir:    defb    $20
```

![inkey1.png](https://qiita-image-store.s3.amazonaws.com/0/257554/03cf54df-e24d-7758-8301-515520228ef3.png)
Python3 - Redshiftへの接続 - Mac



#PostgrelSQLをmacに入れる
```terminal
brew install postgresql
```
#psycopg2(postgersqlに接続するためのライブラリ)の使用
```terminal
pip install psycopg2
```
#sshポートにstepで接続
#Redshiftからデータを取得
#使い方
```python
#psycopg2をインポート
import psycopg2 as psy2
# コネクション作成
conn = psy2.connect(dbname="", user="", password="", host="", port="")
# カーソル作成
cur = conn.cursor()
# テスト
test1 = "select * from logs;"
# SQL結果を受け取る
cur.execute(test1)
#結果の最初の行だけ取ってくる
result1 = cur.fetchone()
# 結果の表示
result1
#全ての結果を取得する
result2 = cur.fetchall()
# 結果の表示
result2
# クローズ
cur.close()
conn.close()
```
Macの容量（ストレージ）を30GB取り戻した。

効果（削除できた量）が高かった方法から順に

## 1. ディレクトリの容量を出力してデカいファイルを見つけ削除する
シンプルに。

https://qiita.com/miliya12/items/b65d1023da776715aa30

```
$ sudo du -sh /*

121M	/Adobe
  0B	/AdobeGCClient
9.6G	/Applications
8.1G	/Library
  0B	/Network
8.0K	/SLStore
9.1G	/System
 36G	/Users
 36M	/Volumes
2.6M	/bin
  0B	/cores
4.8M	/data
4.5K	/dev
  0B	/etc
1.0K	/home
4.0K	/installer.failurerequests
501M	/macOS Install Data
1.0K	/net
381M	/opt
4.7G	/private
1.1M	/sbin
  0B	/tmp
 25G	/usr
  0B	/var

.
.
.


$ sudo du -sh /usr/local/var/*

  0B	/usr/local/var/db
4.5M	/usr/local/var/elasticsearch
  0B	/usr/local/var/homebrew
8.0K	/usr/local/var/lib
 12K	/usr/local/var/log
  0B	/usr/local/var/mongodb
203M	/usr/local/var/mysql
 19G	/usr/local/var/postgres
408K	/usr/local/var/run

```

postgresが19GBもある笑！最近は全く使ってないので不要なものを削除

その他のディレクトリも掃除したら25GB近く回復した。

## 2. spotlightのインデックスを再生成する
意外にも5GBぐらい取り戻した。

https://apple-teach.com/macroom/storage-shortage/
ElasticsearchをWEBブラウザから操作できるChrome拡張"dejavu"の使い方を紹介　

## はじめに
開発案件でElasticsearchで検索エンジンを作っている時に、ビジネスサイドも含めたチーム内の全員に検索ロジックを触ってもらうというユースケースが発生しました。

直接クエリを叩いてもらう、KibanaのDiscoverから探索してもらうなど方法はありますが、非現実的に思えたので、WEBブラウザからElasticsearchにクエリを投げて、実行結果を試し見できる環境を検討したところ、dejavuが用途に叶っていたので、同じような境遇な人もいるかもと思い、記録を残しておきます。
(メンテナンスが2016年で終了しているようなのですが、手元の環境では問題なく動作しました。)

ElasticCloudでサーバー立てて、dejavuで接続すれば10分足らずで環境を構築できます。クエリの投げ方の学習用途でも使えそうだなと思います。

<img width="869" alt="スクリーンショット 2018-08-08 9.06.18.png" src="https://qiita-image-store.s3.amazonaws.com/0/56466/5900ae6a-26df-2a14-4f4e-0229db1540c5.png">


## 対象の読者
- Elasticsearchのクエリ実行結果をブラウザ上でサクッと操作する方法を知りたい方

### ここから説明
## STEP① : GoogleChromeの拡張機能"dejavu"をインストールします。

インストールURL:
https://chrome.google.com/webstore/detail/dejavu/jopjeaiilkcibeohjdmejhoifenbnmlh?hl=ja

Elasticsearchで通常クエリを投げると、JSON形式で結果が返ってきますが、dejavuから投げると、表形式で表示してくれるので、人間フレンドリーです。"どんなデータが格納されているのか確認したい"/"検索クエリの結果が返って来るかロジックを確認したい"という用途に適しています。

注)今回利用しているElasticsearchはElasticCloud上で環境構築して、動作する事を確認しています。コメントには、"Dooesn't work with localhost"などと、ローカルホストで動きませんな記述もあるので、試していませんが、ローカルでは動作しないのかもしれません。

## STEP② : 認証情報とタイプを入力して接続します
<img width="851" alt="スクリーンショット 2018-08-08 8.55.49.png" src="https://qiita-image-store.s3.amazonaws.com/0/56466/537b0944-74bf-6dde-2b33-9643ef62940b.png">

拡張機能にアクセスすると認証画面が表示されるので、以下の形式に沿ってURLを入力して接続します。JSONとCSVファイルを通じて、データの投入も可能です。

```
https://【ユーザー名】.【パスワード】@【ホスト名】
```

## STEP③ : クエリを作成して、結果を確認します
接続が完了すれば、左タブからクエリを発行するだけです。お手軽!
![Untitled (46).png](https://qiita-image-store.s3.amazonaws.com/0/56466/7f6b6075-6270-d9f7-428c-b7c4cff18005.png)
<img width="862" alt="スクリーンショット 2018-08-08 9.07.19.png" src="https://qiita-image-store.s3.amazonaws.com/0/56466/1d29abb0-16ff-2da1-a98c-3651954d31ad.png">

## 最後に
なんだかんだ、WEBブラウザから触れるのは手軽ですね。類似のツールもあるようなので、気に入ったものを使ってみてください。
Ubuntuでemscriptenを使う

# TL;TD;
[MDNのガイダンス](https://developer.mozilla.org/ja/docs/WebAssembly/C_to_wasm)に従え。
ただCPU資源食いつぶされるから、寝る前にコンパイルして起きたらコンパイル済んでるが理想

# 解説
emscriptenとはLLVM(低級仮想マシン)を使ってコンパイル言語であるC/C++をJavaScriptに変換できるコンパイラ(GoだろうがRustだろうが変換してくれるはず)。
Webでは低級なものを扱える仕組むとしてWebAssemblyが提案されホットな話題になりつつある。

## 事前準備
Ubuntuだとgit、cmake、既存のコンパイラ(gcc/clang)、2.7以上のpythonは普通に入っているはずなので事前準備はいらない。
もし無い場合は

```shell-session
$ apt install git cmake gcc clang python
$ apt update
$ apt upgrade
```
とうてばいい。`apt-get`しか使えない古いバージョンでもこれで要件は満たせるはず。

## ソースコードの入手とコンパイル
書いてあるとおりgitからソースをクローンしてその中にある`./emsdk`を色々叩くだけ。
ディレクトリ位置はどこでもいいが`/use/local`に入れるか、もしくはユーザー領域に明示的に作りたい場合は`$HOME/local`を作っていれるのがわかりやすいと思う。
ガイダンスにあるとおり`./emsdk install`はかなりの時間を要する。
これはコンパイルを含んでいるためと思われる。手元の[Core i5](https://ja.wikipedia.org/wiki/Intel_Core_i5)マシン(コア数2/スレッド数4)だとコンパイルが3プロセス走ったのでコンパイル中、マシンがかなり遅く使い物にならなくなったので注意が必要である。

## Hello world
ガイダンスどおり

# 問題点
コンパイルすると長いと思ってパッケージを探すとある

```shell-session
$ apt search emscripten
emscripten/bionic 1.22.1-1build1 amd64
  LLVM-to-JavaScript Compiler

emscripten-doc/bionic,bionic 1.22.1-1build1 all
  LLVM-to-JavaScript Compiler

r-cran-v8/bionic 1.5-1 amd64
  Embedded JavaScript Engine for R
```
ただこれはバージョンが古くガイダンスのサンプルですら動かない。
原因をググると英語でなんでそんな古いの入れてるのアップデートしろとのやり取りがあったのでパッケージのものを使うのはお薦めしない。

# まとめ
emscriptenをインストールするにはフルコンパイルが入るので時間がかかる(マシンパワーも食う)。
デフォルトでパッケージ配布されているものはバージョンが古く使い物にならない。

...誰か最新版配布しないかな
さまざまなO/R Mapperパターンとその問題点

**この記事は社内ブログを外部向けに書き換えたものです**

多くの(Webフレームワークに依存しない)Webアプリは、基本的にはMVCアーキテクチャに基づいて構成されています。
このうち、M(Model)にデータベースのデータを反映する処理について、よく以下の三つの方法が取られています。それぞれについて説明していきます。

- Active-Recordを自前実装する方法
- ActiveRecordを実現するライブラリを使用する方法
- Repositoryパターンを利用する方法

# Active-Recordを自前実装する方法
## そもそもActive-Recordって？
Active-Recordパターンは、Enterprise Application Patternsの一種で、一つのデータベースのテーブルと一つのクラスを対応付け、またそのクラスのインスタンスを(クラスに対応する)テーブルの一つのレコードに紐付ける、というパターンです。よくRuby on RailsやLaravelなどのWebフレームワークで用いられます。参考: [P of EAA: ActiveRecord](https://www.martinfowler.com/eaaCatalog/activeRecord.html)
これは一種のO/Rマッパーで、オブジェクト指向のやり方で簡単にデータベース操作ができるようになります。

## Active-Recordの自前実装
多くのWFと同じようなActive-Recordパターンを実現するには非常に多くの動的コードを記述する必要があり、メンテナンスコストが増えてしまいます。

**これより、自前でのActive-Recordパターンの実装は個人的には推奨しません。**


# PHP-ActiveRecordライブラリを使用する方法
例えば、PHPでなら
[このライブラリ](https://qiita.com/kimromi/items/5c22c7a6ef7e3cbd417b)が提供する機能を用いてActive-Recordパターンを実現することもできます。

これにより、Laravelフレームワーク等と同じような操作を簡単に実現できます

# Repositoryパターンを利用する方法
Repositoryパターンも同じく、Enterprise Application Patternsの一種で、任意のデータに対し、それがどこに保存されるかを一切気にすることなくアクセスすることができるようにし、保守性や拡張性を高める、というパターンです。参考: [P of EAA: Repository](https://www.martinfowler.com/eaaCatalog/repository.html)
主に、(フレームワークに依存しにくく、ドメイン駆動設計の影響が大きい)モバイルアプリの開発等でよく用いられています。

これはActiveRecordとは正反対のアプローチで、完全にModel(ドメインロジック)からデータベースに関する処理(インフラロジック)を取り除くことになります。
以下にRepositoryパターンの実装例を記述します。

```php
class User{
    public $name;
    public $age;
}

class UserRepository{
    public function getAdultUsers(): array{…}
}
```
ModelクラスとしてUserクラスを、Userに関するデータを提供する、という役割を全て担うUserRepositoryクラスを定義します。
ここで、Userクラスは全てのフィールドを公開し、ただの構造体として振舞います。このようなクラスは、POJO(Plain Old Java Object)、あるいはPI(Persistence Ignorance)と呼ばれ、Repositoryパターンとセットでよく使われます。

もちろん、以下のようなModel内のデータを組み合わせるようなメソッドを定義することは問題ありません。ここで大事なのは、Modelクラスが他のどのオブジェクトにも依存しないようにすることです。

```php
class User{
    public $name;
    public $age;

    function getBirthYear(){
        return Date::now()->year - $this->age;
    }
}
```


ここで、大人のUser一覧を取得することを考えます。コード・クライアントは該当するユーザーデータがどこに保存されているか、といったようなことは一切考慮する必要はなく、ただUserRepositoryのgetAdultUsersメソッドを呼べばいいだけです。

このように、Repositoryパターンを採用すると、完全にModel(ドメインロジック)からデータベースに関する処理(インフラロジック)を取り除くことができるようになり、データ操作の方法が非常にシンプルになります。

これはクライアントモバイルアプリのように、データが外部にあるときに特に効力を発揮するパターンです。

# まとめ、結局どれを使えばいいのか
RepositoryパターンはModelからデータベースに関する処理を取り除くことにより効力を発揮するパターンです。つまり、Active-RecordパターンをRepositoryパターンでラップすることはできません。また、ActiveRecordパターンもモデルクラスとデータベースが密につながっていることにより効力を発揮するので、ReposiotryパターンをActive-Recordパターンでラップすることもできません。

WFに依存しない環境だったらもしかしたらオールRepositoryパターンがベスト(モバイルアプリではよくこれが採用される)かもしれませんが、LaravelなどのWFではActive-Recordパターンの恩恵が非常に大きいので、データベース用モデル、リモート用モデル、といったようにハイブリットで使っていくのが一番だと思います。
SQL—分かりにくい JOIN / INNER JOIN / OUTER JOIN / LEFT JOIN / RIGHT JOIN の違い

SQLの JOIN って。
用語がたくさんあって分かりにくいですね。

しかし覚えれば良いのは、**実は次の三つだけ** です。（本当です）

- JOIN 
- RIGHT JOIN
- LEFT JOIN

これ以外のことは **考えなくて大丈夫** です。
なぜなら、あとはすべて **この三つの別名** に過ぎないからです。 

# 分類

- INNER JOIN はなんと、1種類だけです。 (驚きましたか？)
- OUTER JOIN は2種類あります。
  - そして LEFT と RIGHT に分かれます。

![image](https://qiita-image-store.s3.amazonaws.com/0/90607/843b5fd0-3932-ffc9-cfef-8884dca71f28.png)


# JOIN とは

「内部結合」です。
「結合できなかった行」は返しません。

本当の名前は INNER JOIN といいます。
でもそのことは、今は話さなくても良いでしょう。

JOIN はシャイで、優しすぎる。そして世間知らずです。
JOIN には、外の世界のことが分からないのです。

しかしこの世界にひとつしか存在しない、かけがえのないものが JOIN です。

# LEFT JOIN / RIGHT JOIN とは

彼らはどちらも「外部結合」です。
LEFT とか RIGHT とか。大人しいフリしていますが、実は OUTER JOIN の一族です。

本当の名前を LEFT OUTER JOIN / RIGHT OUTER JOIN といいます。
でもそのことは、今は忘れてください。

「結合できなかった行」がある場合も、でもそんなの関係ねえ。
無理やり表示させるので、一部のレコードは NULL になってしまったりします。

LEFT JOIN / RIGHT JOIN には優しさがありません。強引なやつです。
LEFT JOIN / RIGHT JOIN は小さなことなんか気にしないのです。

しかし二人の中でも LEFT JOIN はまだ優しく。「主」のテーブルに従います。
RIGHT JOIN は本当に横暴で。「従」のテーブルを全て返すのです。

# 補足

- 滅多に使わない FULL OUTER JOIN / CROSS JOIN のことは忘れてください。今日は世界から消しました。
- JOIN 関係が覚えにくいのは。根本的に SQL の命名が悪い気がします。
- 正確には短い名前の方が「別名」ですが、でもそんなの関係ねえ。


# 参考

- [SQL の基礎 – JOIN (表結合)の意味の違い](http://www.ecoop.net/memo/archives/2007-11-14-1.html)

# 備考

- [古いアカウントの記事](https://qiita.com/Yinaura/items/3ab6fc49ae55f52e2d55)より移動








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Linux—sleepで永遠に眠り続けるには whileループも秒数指定も要らなかったんだ

## 眠り続けよ

```
sleep infinity
```

## 動作環境

### docker + ubuntu 

```
$ docker run -it ubuntu sleep --help

Usage: sleep NUMBER[SUFFIX]...
  or:  sleep OPTION
Pause for NUMBER seconds.  SUFFIX may be 's' for seconds (the default),
'm' for minutes, 'h' for hours or 'd' for days.  Unlike most implementations
that require NUMBER be an integer, here NUMBER may be an arbitrary floating
point number.  Given two or more arguments, pause for the amount of time
specified by the sum of their values.

      --help     display this help and exit
      --version  output version information and exit

GNU coreutils online help: <http://www.gnu.org/software/coreutils/>
Report sleep translation bugs to <http://translationproject.org/team/>
Full documentation at: <http://www.gnu.org/software/coreutils/sleep>
or available locally via: info '(coreutils) sleep invocation'
```

### docker + centos 

```
$ docker run -it centos:6 sleep --version

sleep (GNU coreutils) 8.4
Copyright (C) 2010 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Written by Jim Meyering and Paul Eggert.
```

## etc

- Docker version 18.06.0-ce, build 0ffa825









<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
安全にクレジットカード処理を行うライブラリ、Omiseについて

**この記事は社内ブログを外部向けに書き換えたものです**

多くのWebサービスには有料プランの契約機能があり、そこでクライアントとクレジットカード情報のやりとりをします。ここで、安全にクレジットカードの情報をやりとりするにはどうすればいいでしょうか？

ここでは、Webサービスでクレジットカードを利用する際に使用するOmiseサービスについて説明します

# Omiseサービスについて

### Omiseの概要
ECサイトやウェブサービスのサーバで直接クレジットカード情報を取り扱うと、情報漏洩時のリスクが増大してしまいます。

ここではOmiseというサービスを用い、直接クレジットカード情報に触れずにカード情報を取り扱うことでこの問題を解決します。

PHP製WebサービスでOmiseを利用するには、Omise.js(クライアントサイド)とOmise-PHP(サーバーサイド)を使用します。


### Omiseを用いた決済処理の流れ
Omise.jsで用意される、クレジットカード情報入力フォームに情報を入力させ、Omise.jsがこれをもとにOmiseサーバと通信し、トークンを取得します。Webサーバ側では、このトークンとOmise-PHPを利用して、OmiseサーバとREST通信を行います。これにより、安全に決済の処理を実行することができます。

![small_token@2x.jpg](https://qiita-image-store.s3.amazonaws.com/0/166136/9ade452b-583d-8e2f-7899-ba087378d9d0.jpeg)

図1 Omiseを用いた決済のフロー


### 使用するライブラリについて

- Omise.jsは、クレジットカード入力フォームや、そのフォーム送信により取得したトークンの提供などをします

- Omiseサーバとの通信にはREST通信を用いますが、Omise-PHPを用いることによって、これを簡単に行うことができるようになります。

### Omise-PHPの構造について
Omise-PHPライブラリの構成を見ると、面白い構造になっていることに気がつくと思います。ここではOmise-PHPのクラス構成について説明します。

ライブラリ内にはOmiseAccount, OmiseCharge, OmiseCustomerなど"Omise~"で始まるクラスが幾つかありますが、これらはそれぞれOmiseで操作できる物(アカウント、課金、スケジュールなど)にそのまま対応しており、基本的にはこれらのクラスの静的メソッドを呼び出してAPIを利用します。これらのオブジェクトには、以下のように検索、作成などの共通のオペレーションを使うことができます。

```php
OmiseAccout::retrive(); //サーバー管理者のOmiseアカウント情報の取得
OmiseCharge::retrive(); //課金リストの取得
OmiseSchedule::retrieve(); //全てのスケジュールのリストを取得
```

Omise-PHPのAPIの例を幾つか説明します。
#### OmiseAccount
サーバー管理者のOmiseアカウントを表現するオブジェクトです。

```php
OmiseAccount::retrive(); //課金リストの取得
```

#### OmiseCharge 
クレジットカードへ課金をするためのAPIです。

```php
//課金リストの取得
OmiseCharge::retrive(); 

//トークンを使い、新しい課金を作成する
OmiseCharge::create(array(
  'amount' => 100000,
  'currency' => 'thb',
  'card' => 'tokn_test_4xs9408a642a1htto8z'
)); 

//課金情報の取得
OmiseCharge::retrieve("chrg_test_4xso2s8ivdej29pqnhz"); 

//定期課金を作成
OmiseCharge::schedule(array(
    'customer'    => 'cust_test_58e7b94d2wfmfn6p2x1',
    'card'        => 'card_test_58eeofcdwl5clmhtyf0',
    'amount'      => 100000,
    'description' => 'Membership fee'
)); 
```


詳細は、[公式リファレンス](https://www.omise.co/ja/docs)をご覧ください。
[学習用]Railsでよく使う分岐

#コントローラーの分岐
ポストでは表示されたいけど、それ以外は表示させない。

```ruby
<% if current_page?(controller: "posts", action: "show") %>

post show は表示
<% else %>
post show 以外は表示
<% end %>
```

#シェアボタンを作る時
Twiiterなどにページタイトルと一緒に投稿するシェアボタンを作る時
post show なら投稿のタイトルを表示して、それ以外のページはサイトタイトルを表示する。

```ruby
<a href="https://twitter.com/share?url=<%= request.url %>&text=
<%= controller.controller_name == "posts" && controller.action_name == "show" ? @post.title : site_title %>" 
rel="publisher" target="_new"><%= fab_icon 'twitter' %>
```
Ajaxで勝手にページ遷移される

ページ遷移したくなくてAjaxに手を出したけど…
なぜかページ遷移されてはまったので、こうしたら治ったよっていうアレ

ド初心者なので、詳しいことは偉い人に教えてもらってください。

##解決策
~~フォームタブの外にajaxのonclickイベントとってるボタンを置くと解決します。~~
*追記*
ボタンタブのtypeをbuttonと明記してあげると解決します！(ご指摘頂いたy-tn先生に感謝です！！)
こんな感じ

```html
<button id="ajax" type="button">ajax</button>
```

##うまくいかなかったコード
イベントとってる#ajaxのボタンがフォームタブの中にあります。

```html
<form id="form" method="post" accept-charset="utf-8" return false>
    <p>名前<input type="text" name="userid" id="userid"></p>
    <p>パスワード<input type="text" name="passward" id="passward"> </p>
    <button id="ajax">ajax</button>
</form>

<script type="text/javascript">
        $(function(){
            // Ajax button click
            $('#ajax').on('click',function(){
            ...
```
##~~うまくいったコード~~非推奨
~~イベントとってる#ajaxのボタンがフォームタブの外にあります。~~
ボタンタブにtype="button"を追加してあげてください。

```html
<form id="form" method="post" accept-charset="utf-8" return false>
    <p>名前<input type="text" name="userid" id="userid"></p>
    <p>パスワード<input type="text" name="passward" id="passward"> </p>
</form>
<button id="ajax">ajax</button>

<script type="text/javascript">
        $(function(){
            // Ajax button click
            $('#ajax').on('click',function(){
            ...
```
【Unity】Android 開発環境の構築手順

## **はじめに**

この記事では **Unity2018** で **Android** の開発環境を構築する手順を説明します。
書いたきっかけは Android Build Support だけでは **`.apk`**をビルドできないこと知ったためです。

### **実行環境**

以下の環境で動作確認しました。

- Windows 10 Home ver 1803
- Unity Hub 0.18.1
- Unity 2018.2.2f1
- Java SE Development Kit 8u181

## **手順**

### **1. JDK のインストール**

オラクル公式サイトから JDK(Java Development Kit) をダウンロードします。
**http://www.oracle.com/technetwork/java/javase/downloads/index.html**

ダウンロードした exe を管理者権限で実行しインストールします。
JDK をインストールしたフォルダはメモしておいてください。

Unity で使うために **JAVA_HOME** のパスを通します。

`コントロール パネル > システムとセキュリティ > システム`
からシステムの詳細設定をクリックしシステムのプロパティを開きます。

**`環境変数 > システム環境変数 > 新規`**

- 変数名： `JAVA_HOME`
- 値： JDK をインストールしたフォルダ

に設定します。

ここで一度、PCを再起動しておきます。

### **2. Android Studio のインストール**

続いて Android Studio をダウンロードしてインストールします。
**https://developer.android.com/studio/?hl=ja**

SDK 単体ではなく Android Studio ごとダウンロードする理由は、
Android Studio に **Android SDK Manager** が付いているためです。

スマホ実機で動作確認したい場合は、Android Stuido を立ち上げ、
画面右下の `Configure > SDK Manager` をクリックし、端末の OS に該当するものをインストールします。

![sdk-config.png](https://qiita-image-store.s3.amazonaws.com/0/195024/283d29ae-c2a6-07ef-f2e9-e1c8fcc1e949.png)

Android SDK のパスは SDK Manager で確認できます。

![sdk-manager.png](https://qiita-image-store.s3.amazonaws.com/0/195024/c46a3d8b-499a-2f16-9734-702297122876.png)

### **3. Unity に Android Build Support を追加**

Unity Hub を立ち上げ、Install タブを開きます。
Android Build Support を追加したいバージョンの Unity の `...`をクリックします。
Add Component を選択するとモーダル表示されます。

Platforms で Android Build Support をチェックし、Done をクリックします。
ダウンロードとインストールが始まるので終わるまで待ちます。

### **4. `.apk` ファイルのビルド**

Unity プロジェクトを立ち上げます。

まず、Unity に JDK と Android SDK のパスを通します。
`Edit > Preference` から Unity Preference を開きます。
Extra tools タブを開き、Android の JDK と SDK にそれぞれのパスを設定します。

適切に環境変数が設定されていた場合、Browse ボタンを押すと、
 Unity 側から既定のパスを設定するか聞かれるので Yes を選択します。
聞かれなかった場合、**1. JDK のインストール** と **2. Android Studio のインストール** で確認したパスを設定します。

![extra-tools.png](https://qiita-image-store.s3.amazonaws.com/0/195024/322824d0-172a-73ce-69e2-71be1ba3d4ae.png)

次に、`File > Build Setting`を開きます。
Platform で Android を選択し Switch Platform をクリックします。

![build-setting.png](https://qiita-image-store.s3.amazonaws.com/0/195024/c4760bf7-7cb7-b0ad-b651-7de2b7034398.png)

Switch Platform の右にある Player Setting をクリックします。
Inspector が開かれるので Other Settings の Package Name を設定します。
デフォルトのままだとビルドが失敗します。
![build-setting.png](https://qiita-image-store.s3.amazonaws.com/0/195024/68a22c6a-ba55-56bb-e55b-41d83777a684.png)

それでは実際にビルドしてみます。

Build Setting 右下の Build ボタンをクリックします。

出力フォルダも`.apk`ファイル名も好きに決めて問題ありません。
少々時間がかかるのでビルドが完了するまで待ちましょう。


## **まとめ**

Unity で Android 端末用に**`.apk`**ファイルをビルドするには、
**Android Build Support** に加えて **JDK** と **Android SDK** が必要です。
wget 画像　取得

wgetでのサイトからの画像のみの自動取得に手こずった。
調べてやっとできたので、忘れないように個人用にメモ

```
wget -nd -r -l 2 -H -P /save/location -A jpeg,jpg,bmp,gif,png http://www.somedomain.com
```


使用しているオプション
-nd:ディレクトリ作成を行わず取得したファイルを全て同一ディレクトリに保存
-r: 再帰的にダウンロード
-l: リンクの深さ
-H: そのドメインからのみ
-P: 保存場所
-A: 該当拡張子


参考元
https://stackoverflow.com/questions/4602153/how-do-i-use-wget-to-download-all-images-into-a-single-folder-from-a-url
Go言語のトレーサを作ってみた

# はじめに
アプリケーションのデバッグに利用できるツールは、デバッガやトレーサ、printfデバッグなどがあります。ただ、WebSocketやMySQLのトランザクション処理内などでは、迂闊にアプリケーションの実行を止めることができません。もし止めてしまうと、実行再開後にセッションがタイムアウトしていた・・・なんてことが起こります。
こういった場面で、気軽に使えることを目指している関数トレーサ [goapptrace](https://github.com/yuuki0xff/goapptrace) を作っています。


# インストールの仕方
`go install`でインストールできます。　

```bash
$ go install -u github.com/yuuki0xff/goapptrace
```


# 使い方
## 1. サーバ起動
goapptraceを使うためには、はじめにサーバをAPIサーバを起動しておく必要があります。
ログサイズは大きくなるかもしれないので、ストレージの空き容量に注意してください。

```bash
$ goapptrace server run
```

## 2. アプリケーションを起動
`go run`の代わりに`goapptrace run`を使ってアプリケーションを起動してみてください。
トレース対象のアプリケーションが`go run`で実行したり、`go build`でコンパイルすることができる必要があります。独自のビルドシステムを使用している場合は、利用できません。

```bash
# ↓ これで起動できるアプリケーションなら、
$ go run foo.go args

# ↓ このようなコマンドを実行すると、アプリケーション内にトレーサが埋め込まれた状態で起動します。
$ goapptrace run foo.go args
```

## 3. トレース対象絞り込み
初期状態だと、トレース可能な関数はすべてトレースする設定になっています。このままでは多量のログが出力されると思うので、トレース対象の関数を絞り込む必要があるでしょう。
トレースしたい関数がすでに決まっているなら、このようなコマンドを実行してみてください。これ以降は指定した関数以外のログが出力されなくなります。

```bash
# 全ての関数のトレースを止める。
$ goapptrace trace stop

# トレースしたい関数の名前を確認して・・・
$ goapptrace trace ls

# トレースしたい関数を指定する。
# --regexp引数を指定すると、関数名を正規表現で指定できます。
$ goapptrace trace start LOG_ID 'example.com/user/app.foo'
$ goapptrace trace start --regexp LOG_ID '^example\.com/user/app\.'
```

頻繁に呼び出されている関数が、ログの量を増やしているということもあります。`goapptrace log cat`をざっと眺めて、トレースする必要がなさそうな関数を見つけ、無効化してみましょう。

```bash
$ goapptrace trace stop $LOG_ID function-name
```

## 4. ログ確認
```bash
$ goapptrace log cat --tail=1000
```

# 仕組み
現状では、関数のエントリーポイントに下記のようなコードを挿入することでトレースしています。

```go:before
func foo() {
	// 省略
}
```

```go:after
var flag bool
func foo() {
	if flag {
		id := tracer.FuncStart()
		defer tracer.FuncEnd(id)
	}
	// 省略
}
```

上記のようなコードが挿入されると、関数が呼び出されたときに`FuncStart()`を、関数から抜けるときに`FuncEnd()`が呼び出されます。`FuncStart()`/`FuncEnd()`で、時刻やコールスタックなどをロギングしています。

また、GoroutineIDなどの必要な情報を取得できるようにするため、Go言語ランタイムに[パッチを当てています](https://github.com/yuuki0xff/goapptrace/blob/develop/tracer/builder/patches.go)。

goapptraceでは、上記のようなコード書き換えやパッチ当て処理をビルドプロセスの一部として扱っており、`goapptrace build`や`goapptrace run`を実行したときに自動でやってくれます。


# 今後
正式版のリリースに向けて、log viewerの改善をします。
このトレーサは、後からトレーサに機能追加をしても、利用者がコードに手を加える必要はありません。必要があれば分岐のロギング、channelとローカル変数をdumpする機能などを追加しようと思ってます。
開発環境（Riot + Stylus + Pug）を作ってみた

Riotを勉強するにあたり、
毎度まいど、開発環境を作るのが面倒臭いので、git cloneでサクッと開発環境を構築できるようにしたものを、[githubに作った](https://github.com/0ceanMoo/riot_pug_stylus_dev)記録

以下は、環境構築の具体的な作業
どうやって、環境を作ったかの備忘録として

環境構築メモ
----

### 下準備
```
yarn init -y
mkdir assets
mkdir assets/js
mkdir assets/js/tags
mkdir assets/html
mkdir public
mkdir public/js
```

### Riot
```
yarn add -D riot pug stylus
```

```
vi assets/html/index.html
<!DOCTYPE html>
<html lang="ja">
  <head>
    <meta charset="utf-8">
    <title>Riot + Pug + Stylus</title>
  </head>
  <body>
    <h1>Index</h1>
    <app></app>
  </body>
</html>
```

```
vi assets/js/app.js
import riot from "riot"
import app from "./tags/app.tag"
riot.mount("*")
```

```
vi assets/js/tags/app.js
app-header
  h1 header
  style(type="stylus").
    h1
      background red
      color white
app-content
  p Hello {opts.title}
  button(onclick="{hello}") Click me
  script.
    hello() {
      const msg = `Hello ${opts.title}`
      alert(msg)
    }
app-footer
  small footer
  style(type="stylus").
    small
      display block
      text-align center
app
  app-header
  app-content(title="{opts.title}")
  app-footer
```

### Babel
```
yarn add -D babel-core babel-loader babel-preset-env babel-preset-es2015-riot
```

```
vi .babelrc
{
  "presets": [ "es2015-riot" ]
}
```

### Webpack
```
yarn add -D webpack webpack-cli html-webpack-plugin riot-tag-loader
yarn add -D webpack-dev-server
```

```
vi webpack.config.js
import path from 'path'
import HtmlWebpackPlugin from 'html-webpack-plugin'

const ast = path.resolve(__dirname, 'assets')
const pub = path.resolve(__dirname, 'public')

export default {
  mode: 'development',
  entry: `${ast}/js/app.js`,

  output: {
    path: pub,
    filename: 'js/bundle.js'
  },

  module: {
    rules: [
      {
         test: /\.tag$/,
         enforce: 'pre',
         exclude: /node_modules/,
        use: [
          {
            loader: 'riot-tag-loader',
            options: {
              template: 'pug',
              debug: true
            }
          }
        ]
      },
      {
        test: /\.js(x)$/,
        exclude: /node_modules/,
        loader: 'babel-loader'
      }
    ]
  },

  resolve: {
    extensions: ['.js', '.tag']
  },

  plugins: [
    new HtmlWebpackPlugin({
      template: `${ast}/html/index.html`,
      filename: 'index.html'
    })
  ]
}
```

### 確認
```
yarn webpack
```

下記のファイルが生成されてれば成功

* public/index.html
* public/js/bundle.js


```
yarn webpack-dev-server
```

Webサーバが立ち上がり「localhost:8080」で閲覧できれば成功

package.jsonにエイリアスを作っておけば、
開発に選んだツール(react,vue,riot,sass,stylus,postcss,gulp,webpack)に関係なく、統一のインターフェイスで開発できるので便利

```
vi package.json
  "scripts": {
    "build": "webpack",
    "server": "webpack-dev-server"
  }
```

```
yarn build
yarn server
```
AWS上にIRCサーバーを立ててみる


動けばいい人向け。

# 動作環境
- AWS EC2
- Ubuntu 16.04
- IRCサーバー
 - ngIRCd
- IRCクライアント
 - LimeChat

# IRCサーバー立ち上げ
UbuntuでEC2インスタンスが作成されていることが条件。

## ポートを解放する
Amazon EC2の管理画面にログイン、
対象のインスタンスのセキュリティグループからインバウンドを選択。
![セキュリティグループp.png](https://qiita-image-store.s3.amazonaws.com/0/269588/ec6cdc19-c1ee-ad5d-3286-d42cb3c942cd.png)

## EC2インスタンスにSSH接続(TeraTerm等)

## パッケージの更新
```bash
$ sudo apt-get update
$ sudo apt-get upgrade
```

## ngIRCdインストール
```bash
$ sudo apt-get install ngircd
```

## 設定ファイルの更新
```bash
$ sudo vi /etc/ngircd/ngircd.conf
```
サーバーパスワードの設定など..

## ngIRCdの起動
```bash
$ sudo /etc/init.d/ngircd start
```


# 接続確認

## LimeChatで接続
[サーバ] - [サーバを追加]を選択。
ホスト名にEC2インスタンスのIPアドレスを、ポート番号に6667を指定する。
![limechat.png](https://qiita-image-store.s3.amazonaws.com/0/269588/1da7cc99-299c-a9c3-8a28-069103c9d60e.png)

# 参考
* [サクッとIRCサーバを立てる](https://blog.kawa-xxx.jp/entry/20121204/1354611440)
* [ngIRCd](https://wiki.icicleforest.com/index.php?ngIRCd)
タッチパネルを vim 内で無効化 、有効化する

ノートパソコンでvimを使っている時に誤ってタッチパネルを触ってしまい
気づいたらカーソルが動いてしまい、変なところを編集していてブチ切れそうになった方は
少なくないと思う。そもそもvimが生まれた頃はguiなんてなかった。なので

https://qiita.com/ShigekiKarita/items/6444822fb2c23dd21fb7
を参考に
マウスを

vim起動時に無効化
終了時に有効化
```スペース+d```で無効化
```スペース+e```で有効化

する vim の設定を作成した。
## 環境
ubuntu 18.04

## 作り方 
まず```xinput```コマンドを実行しマウスがどのデバイス番号に割当てられているか確認する。

```sh
$ xinput 
⎡ Virtual core pointer                    	id=2	[master pointer  (3)]
⎜   ↳ Virtual core XTEST pointer              	id=4	[slave  pointer  (2)]
⎜   ↳ VirtualBox mouse integration            	id=9	[slave  pointer  (2)]
⎜   ↳ VirtualBox USB Tablet                   	id=10	[slave  pointer  (2)]
⎜   ↳ ImExPS/2 Generic Explorer Mouse         	id=12	[slave  pointer  (2)]
⎣ Virtual core keyboard                   	id=3	[master keyboard (2)]
    ↳ Virtual core XTEST keyboard             	id=5	[slave  keyboard (3)]
    ↳ Power Button                            	id=6	[slave  keyboard (3)]
    ↳ Sleep Button                            	id=7	[slave  keyboard (3)]
    ↳ Video Bus                               	id=8	[slave  keyboard (3)]
    ↳ AT Translated Set 2 keyboard            	id=11	[slave  keyboard (3)]

```
```Mouse``` は 12 番に割り当てられていることがわかる。
シェルでは

```sh
$ xinput disable 12
```
でマウス無効化

```sh
$ xinput enable 12
```
でマウス有効化となる。

ということで書いたのが以下のvimの設定

```init.vim
" vim起動時にマウス無効化                                                                  
augroup entercmd                                                                    
  autocmd!                                                                          
  autocmd VimEnter * silent !xinput disable 12                                     
augroup END                                                                         
             
" vim終了時にマウス有効化                                                                       
augroup quitcmd                                                                     
  autocmd!                                                                          
  autocmd VimLeave * !xinput enable 12                                              
augroup END                                                                         

" スペースn でマウス無効化 (normal mode)                                                                                  
nnoremap <space>d :<C-u>!xinput disable 12<cr><esc>

"スペースe でマウス有効化 (normal mode)                                
nnoremap <space>e :<C-u>!xinput enable 12<cr><esc>  

```
# 上記設定の説明
```augroup``` は```vimrc``` を複数回読み込んでも```autocmd```により記述した部分を一度しか実行されないようにするためのもの。
今回は ```vimrc``` でなく ```init.vim``` に記述しているが多分一緒だろうということで囲っている。

コマンドラインモードで ```:!hoge``` のようにすると```vim```からシェルにコマンドが実行することを利用している

ノーマルモードにて上記ショートカットを打つと以下の動作を行う。
コロンを打ってコマンドラインモードに入り、```<C-u>```　でカーソル位置までの入力を削除、シェルコマンドをうち```<CR>``` で最後にコマンドを実行する。
PHP：CSVファイルをSplFileObjectでオブジェクティブに読み込む

PHP5.1.0以上の環境では、CSVファイルを読み込むためのSplFileObjectクラスが用意されている。
基本的には以下の参考元と変わらないが、いくつかの方法を試してみる。

参考：[【PHP】CSVファイルの読み込み](https://qiita.com/kazu56/items/06660b0dc8638a6c948f)

##まずはCSVファイルを用意する

今回は、１行目にカラム名が含まれるものを用意した。
以下では、カラム名を除いて値を参照する方法を考えたい。

```text:people.csv
name,hometown,age,job
Alice,London,25,teacher
Philipp,Geneva,33,economist
Taro,Tokyo,55,doctor
```

##ケース１：シンプルに値を取得

```php:test1.php
$fp = new SplFileObject('people.csvへのpath');
$fp->setFlags(SplFileObject::READ_CSV);

foreach ($fp as $line) {
    var_dump($line);
}
```

```terminal:test1.phpの実行結果
array(4) {
  [0]=>
  string(4) "name"
  [1]=>
  string(8) "hometown"
  [2]=>
  string(3) "age"
  [3]=>
  string(3) "job"
}
array(4) {
  [0]=>
  string(5) "Alice"
  [1]=>
  string(6) "London"
  [2]=>
  string(2) "25"
  [3]=>
  string(7) "teacher"
}
array(4) {
  [0]=>
  string(7) "Philipp"
  [1]=>
  string(6) "Geneva"
  [2]=>
  string(2) "33"
  [3]=>
  string(9) "economist"
}
array(4) {
  [0]=>
  string(4) "Taro"
  [1]=>
  string(5) "Tokyo"
  [2]=>
  string(2) "55"
  [3]=>
  string(6) "doctor"
}
array(1) {
  [0]=>
  NULL
}
```

伝統的(原始的)なfopenとfgetを用いるコードより圧倒的に綺麗だが、カラム名と空白行が取得されてしまう。

##ケース2：seekメソッドを用いてみる

[SplFileObject::seek — ファイルポインタを指定行に移動させる](http://php.net/manual/ja/splfileobject.seek.php)

seekメソッドのパラメータは
>ゼロを起点とした移動させる行数

らしいので、１を入れてみる。
ただし、いくつかメソッドを使う。
[SplFileObject::current — ファイルの現在の行を取得する](http://php.net/manual/ja/splfileobject.current.php)
[SplFileObject::eof — ファイルの終端に到達しているか調べる](http://php.net/manual/ja/splfileobject.eof.php)
[SplFileObject::next — 次の行を読み出す](http://php.net/manual/ja/splfileobject.next.php)

```php:test2.php
$fp = new SplFileObject('people.csvへのpath');
$fp->setFlags(SplFileObject::READ_CSV);
$fp->seek(1);

while (! $fp->eof()) {
	var_dump($fp->current());
	$fp->next();
}
```

```terminal:test2.phpの実行結果
array(4) {
  [0]=>
  string(5) "Alice"
  [1]=>
  string(6) "London"
  [2]=>
  string(2) "25"
  [3]=>
  string(7) "teacher"
}
array(4) {
  [0]=>
  string(7) "Philipp"
  [1]=>
  string(6) "Geneva"
  [2]=>
  string(2) "33"
  [3]=>
  string(9) "economist"
}
array(4) {
  [0]=>
  string(4) "Taro"
  [1]=>
  string(5) "Tokyo"
  [2]=>
  string(2) "55"
  [3]=>
  string(6) "doctor"
}
array(1) {
  [0]=>
  NULL
}
```

空白行が残る。。。
ポインタの問題か。。。

##ケース３：foreachに再帰する

ただし、
[SplFileObject::key — 行番号を取得する](http://php.net/manual/ja/splfileobject.key.php)
を使って、最初の行だけ除くよう処理する。

```php:test3.php
$fp = new SplFileObject('people.csvへのpath');
$fp->setFlags(SplFileObject::READ_CSV);

foreach ($fp as $line) {
	if ($fp->key() > 0 && ! $fp->eof()) {
		var_dump($line);
	}
}
```

```terminal:test3.phpの実行結果
array(4) {
  [0]=>
  string(5) "Alice"
  [1]=>
  string(6) "London"
  [2]=>
  string(2) "25"
  [3]=>
  string(7) "teacher"
}
array(4) {
  [0]=>
  string(7) "Philipp"
  [1]=>
  string(6) "Geneva"
  [2]=>
  string(2) "33"
  [3]=>
  string(9) "economist"
}
array(4) {
  [0]=>
  string(4) "Taro"
  [1]=>
  string(5) "Tokyo"
  [2]=>
  string(2) "55"
  [3]=>
  string(6) "doctor"
}
```

おそらく、このコードが一番見やすく綺麗である。

##まとめ

カラム名と空白行を除いた上で値を取得するには、ケース３がいいと思われる。
しかし、膨大な行数のファイルを読み込むときには、その行数と同じだけのif処理が行われることになる。
したがって、値を取得して何かの処理を行う際に、速度だけを意識すればいいときはケース１を使ってみるのもありかもしれない。
LinuxサーバーのIPアドレスについて

#はじめに
さくらVPNサーバーを借りて数ヶ月、払い出されたIPアドレスを使っていつもローカルからSSHでログインして作業を指定していたが、ふとこのIPアドレスってそもそもどこに設定されているのか？知りたくなり調べましたので以下に記載します。

##Linuxディストリビューション
今回紹介するLinuxディストリビューションは以下です。他Linuxディストリビューションでは、設定ファイルが異なるので注意が必要です。

```shell
[shota@hostname ~]$ cat /etc/redhat-release
CentOS release 6.9 (Final)
```

上記の通り、Linuxディストリビューションは**CentOS**です。

##設定ファイル

以下の場所にネットワークインタフェースごとに設定ファイルがあります。

```shell
[shota@hostname ~]$ ll /etc/sysconfig/network-scripts/ifcfg-*
-rw-r--r--. 1 root root 193  5月 13 21:21 2017 /etc/sysconfig/network-scripts/ifcfg-eth0
-rw-r--r--  1 root root 254  1月 18 21:10 2017 /etc/sysconfig/network-scripts/ifcfg-lo
```
~eth0は有線接続用のネットワークインタフェース。
~loはループバックインタフェース。

中を除きますと、以下の通りです（固有の値はxxxにしました）。

```shell

[shota@hostname ~]$ cat /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE="eth0"
IPADDR="xxx.xxx.xxx.xxx"
NETMASK="xxx.xxx.xxx.xxx"
GATEWAY="xxx.xxx.xxx.xxx"
ONBOOT="yes"
TYPE="Ethernet"
#IPV6INIT="yes"
#IPV6_ROUTER="no"
#IPV6ADDR="xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx/xxxx"
```

ここに固定でIPアドレス（**IPADDR**の部分）が記載されていることがわかりました。
RROSでのroot方法

時間ないのでざっとまとめます
twrPを導入しといてくだ祭
端末によってはzipの場合でも逝けたり(出来たり)するかもしれないからねぇ
自己責任という言葉の意味を理解した上で知識がある人はゆっくりしていってね！(笑)
この方法だと再起動ごとにxbinのsuを変えることになります

ヤり方

1.lineageosのsu化ファイルを取ってくる https://download.lineageos.org/extras
2.ファイルを解凍してどっかに入れとく※解凍はsystem→addon.dとetcとxbinだけでおけ
3.twRpのファイルマネージャーを開いて
    system/xbin/に行ったらsuというファイルがあるかもしれないので消しとく(上書きはやめといたほうがいいです)
4.解凍した中のファイルを
addon.d≫/system/addon.d

etc/intit/≫/system/etc/intit

xbin≫/system/xbin

てなかんじに送る
移動するファイルを押すと移動(move)出来ます
あとは再起動(reboot)するだけ
ESLint とPrettier を使って構文チェックやコードの整形ができる環境をつくる 

JavaScript のフレームワーク、Vue.js を使用した開発の際に便利だった、ESLint とPrettier について記述。また、設定方法も記述する。これも何番煎じかわからない。

## ここで説明すること
- ESLint とPrettier について簡単な概要
- ESLint とPrettier をVue.js を使ったプロジェクトにインストールする方法、設定方法

## ESLint
JavaScript の構文チェックツールのこと。
構文のエラーを見つけたり、構文のスタイル(構文で使用しているカッコやスペースの使い方)を統一したりすることができる。
https://eslint.org/

## Prettier 
Prettier はソースコードを整形してくれるツールのこと。
JavaSrcipt やVue.js、CSS、SCSS等のソースコードを整形してくれる。
https://prettier.io/

## ESLint とPrettier を併用するメリット
ESLint は構文チェックをしてくれる。しかし、「ソースコードを整形してくれる」という点ではESLint とPrettier で共通している。別にどちらかを使えばよいのでは？？となるが、ESLint だけだと整形のチェックをしてくれる範囲が狭い。しかし、Prettier はESLint では整形できない部分をカバーしてくれるため、今回はESLint とPrettier を併用する。

## インストール
Vue.js を使ったプロジェクト(vue-cli を使って作成したプロジェクト)が存在していることを前提に記述する。

ターミナルを開いて、Vue のプロジェクトのディレクトリ内且つpackage.json のファイルが存在するディレクトリ内で以下のコマンドを実行し、ESLint とPrettier のパッケージをインストールする。(今回はyarn コマンドで実行)

```zsh
yarn add -D eslint eslint-config-prettier eslint-plugin-prettier
```

```zsh
yarn add -D prettier prettier-eslint prettier-eslint-cli
```

## .eslintrc.js の設定
インストール後、.eslintrc.js を開き、以下を記述する。(ない場合は作成)
extends の部分には以下を記述。

```js
 extends: [
        'plugin:vue/essential',
        "eslint:recommended",
        "plugin:vue/recommended",
        "plugin:prettier/recommended"
    ],

```

rules の部分には以下を記述。

```js
rules: {
        "semi": [2, "never"],
        "quotes": [2, "single"],
        "single": { "allowTemplateLiterals": true },
        "no-console": "off",
        "vue/max-attributes-per-line": "off",
        "prettier/prettier": ["error", { "semi": false, "singleQuote": true }],
        // allow async-await
        'generator-star-spacing': 'off',
        // allow debugger during development
        'no-debugger': process.env.NODE_ENV === 'production' ? 'error' : 'off'
    }
```

rules の部分にeslint を使って構文をチェックしたりコードを整形したりするためのルールを決めている。
以下では主な構文ルールを説明する。
- semi : 構文の末尾にセミコロンをつける (今回は付けない設定)
- quotes : 文字列はダブルクォートで記述 (今回はシングルクォートに設定)
- no-console : console の使用をしないこと (今回は使っている)

また、prettier でのコードの整形ルールも決めている。構文の末尾はセミコロンなし、文字列はシングルクォートのルールを設定している。そうではなかった場合は警告を表示するようにしている。
Prettier でも整形のルールを細かく決めることができるが、今回は、特に凝ったルールを決めていないため、無駄な改行があったりスペースがあったりした際に警告が表示されるようにしている。
※エラーではなく警告のため、警告が表示されていてもコーディングはできる。ただし、警告がうるさい…。

## lintfix コマンドでの一発整形
コーディングして、気づいたらめちゃめちゃESLint やPrettier の警告文出ていた…ということがあるため、そういうときにターミナルからコマンド```yarn lintfix``` で一気に整形してくれるようにpackage.json に以下を記述する。

```json
"scripts": {
    "lintfix": "eslint --fix --ext .js,.vue --ignore-path .gitignore --ignore-path .eslintignore ."
  }
```

## 参考URL
ありがとうございました。
https://qiita.com/mysticatea/items/f523dab04a25f617c87d
https://qiita.com/kashimura0001/items/f2270364d57e1828ea78
https://garafu.blogspot.com/2017/02/eslint-rules-jp.html
プログラミング初心者のLESS備忘録

#LESSとは？
LESSはCSSを簡単かつ効率的に書くことができる言語である。

#特徴
**１．変数が使える**
＠～で変数を宣言できる
例：＠mycolor

**２．変数を使って四則計算ができる**

**３．変数は「p」や「h」などのプロパティにも使える**

**４．階層的な書き方ができる**
LESSでは階層構造を使用できるためプロパティの宣言をいちいち行わなくていい
例:
[CSS]              
header{}         
header a{}          
のような書き方だったがLESSでは
[LESS]
header{
    a{
    }
}
↑のように階層構造にすることができ、格段に見やすくなる

###☆ミックスイン
ミックスインとは要は関数のようなもので何度も使うであろう処理などを一つにまとめておくことで、ミックスイン名を宣言することで簡単に呼び出すことができる
例：
my-mixin(@width){ 
　　border @width solid red;
　　padding 7px;
　　margin 7px;
}
これを呼び出すには
h1{
  my-mixin(7px);
  font-size:20px;
のようになる
ミックスイン名の後ろの()は引数のような使い方ができる

#LESSファイル作成法
☐.lessでlessファイルを作成できる

パワーシェルなどでコマンド
lessc style.less(lessファイル名） styles.css(CSS名)でlessをCSSに変換してくれる

*********
・豆知識
./と../は意味が違う
前者は下の階層、後者は上の階層へアクセスする
【Photoshop】非表示レイヤーを一括削除(ロックされたレイヤー含む)

非表示レイヤーを一括削除しようと思ったらロックがかかってるレイヤーがあると「非表示レイヤーを削除」がグレーアウトしてしまうので、先にロックをはずさないといけないという。
で、スクリプト書こうかと思ったけどアクションの方が楽だったので。

以下の流れで
1.全てのレイヤーを選択：Ctrl+Alt+A
2.レイヤーをロック:Ctrl+/
3.レイヤーをロック(解除):Ctrl+/
4.非表示レイヤーを削除
![ab95b3ccbf7c8f0c930a690c6c12383d.png](https://qiita-image-store.s3.amazonaws.com/0/102588/6fc7ecf9-4d4b-0748-900b-66a000a43c3d.png)

アクション的にはこんな感じ。
![d78ce309701812f223aed0812160875d.png](https://qiita-image-store.s3.amazonaws.com/0/102588/06c3a4cd-0490-46cc-2e35-ce05ffd1c4f7.png)