OmniAICreator/Qiita-1.07M huggingface dataset:
10分で作れるAMPページ

長らく放置していたホームページを一からリニューアルするにあたり、せっかくなのでAMP（Accelerated Mobile Pages）に対応させてみようと思います。

# 1. AMPとは？

https://www.ampproject.org/

# 2. テンプレートの入手
いちからハンドコーディングするのもいいですが、AMPでWebページを作成する際の初期テンプレートは、下記URLから入手することが出来ます。

[AMP Play ground](https://ampbyexample.com/playground/#url=https%3A%2F%2Fampbyexample.com%2Fintroduction%2Fhello_world%2Fsource%2F)

ソースコードをコピーし、任意のHTMLファイルに貼り付けて保存をするだけで、AMPページは完成です。

# 3. AMPテスト

念のため、先ほど作ったHTMLファイルがブラウザにAMPページとして認識されるかどうかを確認してみます。
HTMLファイルをサーバーにアップし、URLを下記のフォームに入力すると検証を行うことが出来ます。

[AMPテスト](https://search.google.com/test/amp)

<img width="680" alt="スクリーンショット 2018-06-30 21.17.26.png" src="https://qiita-image-store.s3.amazonaws.com/0/188964/c721d17c-3a2f-4698-28bb-b1f98489095d.png">

↓↓↓

<img width="680" alt="スクリーンショット 2018-06-30 21.17.07.png" src="https://qiita-image-store.s3.amazonaws.com/0/188964/666a1f5f-65d9-4409-281e-6c8f4532f157.png">

無事、AMPページとして認識して貰えたようです。

---
以上で、AMPページの下準備は完了です。
今日はここまで。
Ansible — playbook から他のplaybook を実行する ( import_playbook )

# echo するだけのplaybookを用意

import される側

```echo.yml
---
- hosts: example
  tasks:
    - name: just echo message
      debug:
        msg: THIS IS THE MESSAGE

```

# そのplaybookを三回実行するplaybook

 `import_playbook` をベタな階層に書いていく。
playbook はそもそも `hosts` に対しての動作の塊なので、 他のplaybookを呼ぶ時にホスト指定というものはない。

```import_playbooks.yml
---
- name: first import other playbook
  import_playbook: echo.yml

- name: second import other playbook
  import_playbook: echo.yml

- name: third import other playbook 
  import_playbook: echo.yml

```

# 実行例

記述通りに `echo.yml` が3回実行されるのが分かる。

```bash
ansible-playbook -i inventory.txt import_playbooks.yml
```

```bash


PLAY [example] ***********************************************************************************************************************************

TASK [Gathering Facts] ***************************************************************************************************************************
ok: [localhost]

TASK [just echo message] *************************************************************************************************************************
ok: [localhost] => {
    "msg": "THIS IS THE MESSAGE"
}

PLAY [example] ***********************************************************************************************************************************

TASK [Gathering Facts] ***************************************************************************************************************************
ok: [localhost]

TASK [just echo message] *************************************************************************************************************************
ok: [localhost] => {
    "msg": "THIS IS THE MESSAGE"
}

PLAY [example] ***********************************************************************************************************************************

TASK [Gathering Facts] ***************************************************************************************************************************
ok: [localhost]

TASK [just echo message] *************************************************************************************************************************
ok: [localhost] => {
    "msg": "THIS IS THE MESSAGE"
}

PLAY RECAP ***************************************************************************************************************************************
localhost                  : ok=8    changed=0    unreachable=0    failed=0
```

# 環境

- ansible2.4

# 参考

- [import_playbook - Import a playbook — Ansible Documentation](https://docs.ansible.com/ansible/2.5/modules/import_playbook_module.html)








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
tweepy.api めも //UserオブジェクトとStatusオブジェクトについて

Twitter API の tweepyについての覚書。
公式リファレンスをもとにしていますが、一部説明を割愛しているところもあります。
サンプルコードは自前です。

```python:まえじゅんび
import tweepy

auth = tweepy.OAuthHandler(CONSUMER_KEY, CONSUMER_SECRET)
auth.set_access_token(ACCESS_TOKEN, ACCESS_SECRET)

api = tweepy.API(auth)
```


# Status系メソッド

## update_status()
#### 処理
tweetする。
#### 戻り値
Statusオブジェクト

```python:update
# do tweet
tweet_test = api.update_status('this is test tweet')

# print
print tweet_test.text

>>> this is test tweet
```

## get_status(id)
#### 処理
指定したID値を持つStatusオブジェクトを取得する。
#### 戻り値
Statusオブジェクト

```python:get
# tweet情報を格納したStatusオブジェクト
tweet_obj = get_status(tweet_test.id)
print tweet_obj.text

>>> this is test tweet
```


## destroy_status
#### 処理
指定したID値をもつStatusオブジェクトを破棄する。
####戻り値
Statusオブジェクト

```python:destroy
tweet  = api.update_status('this is destroy test')
id     = tweet.id
d_obj  = api.destroy_status(id)

# 破棄した旧Statusオブジェクトの情報が取得される
print d_obj.text 
>>> this is test tweet

# idが示すstatusオブジェクトはすでに存在していないのでエラーとなる
api.destroy_status(id)
>>> error

```

## retweet(id)
#### 処理
指定したID値をもつStatusオブジェクトをリツイートする
#### 戻り値
Statusオブジェクト

```python:rt
tweet = api.update_status('RT test')
api.retweet(tweet.id)
```

# User系メソッド
## me()
#### 処理
自身のUserオブジェクトを取得する。
####戻り値
Userオブジェクト

```python:me
tweet      = api.update_status('user_test')
tweet_user = tweet.user

me = api.me()

if(tweet_user.id == me.id):
  print('tweet_user is me')
else :
  print('tweet_user isnt me')

>>> tweet_user is me
```

## get_user(user_id / screen_name)
#### 処理
指定したUserオブジェクトのID、またはUserオブジェクトのscreen_name値に合致するUserオブジェクトを取得する
#### 戻り値
Userオブジェクト

```python:get_user
tweet = api.update_status('get user test')

# tweetをおこなったuserのid
tweet_user_id = tweet.user.id

# tweetをおこなったuserの @ で始まる名前
tweet_user_screenName = tweet_user.screen_name

user_a = api.get_user(tweet_user_id)
user_b = api.get_user(tweet_user_screenName)

# 取得したUser情報が等しいかの判定
if(user_a.id == user_b.id):
  print('users are same')
else:
  print('users arent same')

```

## search_users(q[, per_page][,page])
#### 処理
指定した名称を持つUserオブジェクトを取得する
#### 戻り値
Userオブジェクト

```python:search_user
#'tarou'という名称を部分的に設定しているuserを検索する
users = api.search_users(q='tarou')

# 取得したuserのscreen_nameを表示する。実userなのでマスク処理を施す
for name in result:
  n = name.screen_name
  print n.replace(n[0:3], '***')

```
MIDIJackの使い方

#MIDIJackとは
UnityでMIDIコンを使えるようにしてくれるkeijiroさんが作成して下さったアセットです．
->https://github.com/keijiro/MidiJack

#使えると嬉しいこと
Unityを使ってVJをする際など，リアルタイムで値を変更する際に役立つのではないかなと思います． 

#使い方
##ドライバの導入
まず，はじめに使うMIDIコンのドライバをインストールしてください．自分はKORG　nanoKONTROL2-BKという物を使っています．（値段も安いし結構メジャーなんじゃないですかね？）一応,KORG系のドライバがインスールできるURLを貼っておきます．
https://www.korg.com/jp/support/download/product/1/200/

##スクリプトについて
基本的staticのクラスであるMidiMasterを経由してMIDIコンのノブの値を取得します．言葉で長く書くよりもソースをみてもらった方が早そうなので簡易的なプロジェクトを作成しました．
ノブの値に応じてcubeが動く感じです．
https://github.com/KeitoTakaishi/MIDIJack_Sample
![ダウンロード.gif](https://qiita-image-store.s3.amazonaws.com/0/184790/b8b187fb-868b-563d-c852-3fe829d20afe.gif)


```MidiManager.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

namespace MidiJack
{
    public class MidiManager : MonoBehaviour
    {
        private int _KnobNum = 8;//自分のmidiコンのノブの数
        public GameObject[] meter;
        private Vector3[] _pos;
        void Start()
        {
            _pos = new Vector3[_KnobNum];
            for (int i = 0; i < _KnobNum; i++){
                _pos[i] = meter[i].transform.position;
            }
           
        }

        void Update()
        {
            for (int i = 0; i < _KnobNum; i++)
            {

                meter[i].transform.position =
                            new Vector3(_pos[i].x, MidiMaster.GetKnob(MidiChannel.Ch1, i)*5.0f, _pos[i].z);
            }
        }
    }
}
```

#MIDIコンが検出されているかどうかの確認
Midiコンが接続されているかどうかわからない時はwindows->MIDI Jackを選択してみてください．
<img width="964" alt="スクリーンショット 2018-06-30 19.45.50.png" src="https://qiita-image-store.s3.amazonaws.com/0/184790/b2521fc3-aba4-799e-a303-7cd8eeec92d3.png">

検出されていた場合は下のような画面が出てくれます．
<img width="395" alt="スクリーンショット 2018-06-30 19.45.55.png" src="https://qiita-image-store.s3.amazonaws.com/0/184790/8058d04d-8fba-deb0-c5f3-7e469dfc79e9.png">


#windowsで使った際にハマった罠
自分は最初windowsでこのアセットを使ったのですがうまく検出されませんでした．しかし，macではうまく検出がうまく行きました．理由としては他のアプリで検出中であるとUnity側では検出してくれないみたいです．自分の場合はTouchDesignerで検出がされていたみたいです．TDを切ったらうまく検出されました．
OpenCV.jsをサクッと試す

OpenCVがブラウザから利用できるようになったので試してみました。

- [OpenCV.js をちょっとだけ試してみた](https://qiita.com/hon_no_mushi/items/0edb47b46f827f9fca26)
- [openCV.js を使ってスマホ上で画像処理をしてみた](https://qiita.com/r_i_qita/items/2b30c1beb99eea93f496)

先人たちの話によるとOpenCV.jsのビルドが必要だそうです。~~面倒くさい~~

とりあえずサクッと試せる方法がないか探してみました。

## TL;DR
- https://docs.opencv.org にあるので拝借
- `<script src="https://docs.opencv.org/3.4.1/opencv.js"></script>`を追加

##NPM
それっぽいパッケージはありますが、Node.js用なので違いますね...
https://www.npmjs.com/package/opencv4nodejs

公式が提供するパッケージは無さそうでした。

## 公式ドキュメント

とりあえずドキュメント見ると何かわかるかもしれません。
https://docs.opencv.org/3.4.1/df/d0a/tutorial_js_intro.html

ビルド方法はこれです。
https://docs.opencv.org/3.4.1/d4/da1/tutorial_js_setup.html

```sh
$ git clone https://github.com/opencv/opencv.git
$ cd opencv
$ python ./platforms/js/build_js.py build_wasm --build_wasm
```

WASMで動く！すごい！

...いや、そうじゃないんですよね。

自分でビルドとかせずちょっと触ってみたかっただけなんですよ。

## チュートリアル

チュートリアルのページではOpenCV.jsが動いているようです。

<img width="640" alt="スクリーンショット 2018-06-30 18.53.39.png" src="https://qiita-image-store.s3.amazonaws.com/0/106886/12d788d8-75b2-1358-34d2-e4bae839cbb0.png">

あー、はいはい。

<img width="600" alt="スクリーンショット 2018-06-30 19.06.54.png" src="https://qiita-image-store.s3.amazonaws.com/0/106886/392e1455-16e3-f223-9730-ac4629a7effe.png">

（gzip圧縮して3MBとか...）

このファイルを読み込めば良さそうです。

## 結果

`<script src="https://docs.opencv.org/3.4.1/opencv.js"></script>`を追加すればCodePenでもOpenCV.jsを動かすことができます。

↓読み込んだ画像のグレースケール変換のサンプルを書いてみました。

<p data-height="265" data-theme-id="0" data-slug-hash="aKPgVE" data-default-tab="js,result" data-user="puku0x" data-embed-version="2" data-pen-title="OpenCV.js" class="codepen">See the Pen <a href="https://codepen.io/puku0x/pen/aKPgVE/">OpenCV.js</a> by puku0x (<a href="https://codepen.io/puku0x">@puku0x</a>) on <a href="https://codepen.io">CodePen</a>.</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

読み込みが少し重いですが、ブラウザ上でOpenCVが動きました👍
YOLOを使ってみた　－Windows－　（塩尻MLもくもく会＃５）

Windows10+kerasで、YOLOを使ってみます。
YOLOの最新バージョンはv3ですが、今回はv2を使います。

YOLOは、物体検出の分野で高速な性能を提供しています。
公式動画はこちら↓
https://pjreddie.com/darknet/yolo/


![08097E42-5F4A-41E1-985D-93BF943C460A.jpeg](https://qiita-image-store.s3.amazonaws.com/0/264781/8b72d1d1-8a50-f2e8-c543-5610dc030e43.jpeg)

#事前準備
gitのインストール
https://qiita.com/toshi-click/items/dcf3dd48fdc74c91b409
wgetのインストール
https://assimane.blog.so-net.ne.jp/2013-01-21


#YOLOのインストール
ソースコードをダウンロード＆必要なライブラリをインストールします。
コマンドプロンプトで以下のように入力します。

```
git clone https://github.com/allanzelener/YAD2K.git
cd yad2k

pip install numpy h5py pillow
pip install tensorflow-gpu
pip install keras
```
weightsなどをダウンロードします。（[公式サイト](https://github.com/allanzelener/YAD2K)では２行目が古いままです。最新はyolov2.cfgです。）

```
wget http://pjreddie.com/media/files/yolo.weights
wget https://raw.githubusercontent.com/pjreddie/darknet/master/cfg/yolov2.cfg
```

kerasでモデルを作成します。

```
python ./yad2k.py yolov2.cfg yolo.weights model_data/yolo.h5
```

imagesフォルダ内にある画像に対して物体検出を実行します。

```
python ./test_yolo.py model_data/yolo.h5
```
結果はimage/outに出力されます。

#試しに動かしてみる
手持ちの画像で試してみました。

![kj.JPG](https://qiita-image-store.s3.amazonaws.com/0/264781/dbb579d7-5ed8-a7a1-c484-6deee2f7c54c.jpeg)
小さく写っている「ベンチに座っている人」も検知できています。

![ng.JPG](https://qiita-image-store.s3.amazonaws.com/0/264781/01691ead-785e-376c-b098-b482ef0db694.jpeg)
手前の車は屋根しか写っていませんが、ちゃんと検知できています。

![ij.JPG](https://qiita-image-store.s3.amazonaws.com/0/264781/d95d817d-89fc-2f56-4955-b7db6d0dd128.jpeg)
奥の燕は検知できませんでした。首の角度が悪いのかな？
そして、庇（屋根）が飛行機として認識されています。

#感想
誤検知や検知漏れもありますが、高速に動く分、我慢できる範囲かな？？
GoogleAppsScriptで郵便番号を検索してみた

#はじめに
とある事情で各所からGoogleフォームを使って住所を入力してもらったのですが、、、
・・・郵便番号の入力欄を入れ忘れた！
ということで、今回は住所から郵便番号を検索するツールを作成しました。

#環境
GoogleAppsScriptです。
①前準備がほぼない
②誰でも簡単に使用できる
③まとめて入力したら一括で郵便番号が出力される
という理由で採用しました

今回はZipcodaというサイトのAPIを使用して住所を取得します
https://zipcoda.net/

#実装

```javascript
function getPostCode(address) {
  // 空のセルはreturnする
  if (address == '') {
    return;
  }
  var url = "https://zipcoda.net/api?address="+address;
  var response = UrlFetchApp.fetch(url);
  var json = JSON.parse(response.getContentText());
  var postCode = json.items[0]['zipcode'];
  return postCode;
}
```
これだけ！！
#結果
『住所』に住所を入れ、
『郵便番号』には"=getPostCode(隣のセル)"
で即出力されます。
<img width="485" alt="スクリーンショット 2018-06-30 19.01.46.png" src="https://qiita-image-store.s3.amazonaws.com/0/99737/05a3c79a-9682-3519-94cd-6aea811af32a.png">

#まとめ
実はこの実装を行う前に、日本郵政から郵便番号一覧のCSVを取得して、検索して・・・ということをやっていましたが、Zipcodaを見つけ、超絶改善されました。
ZipcodaのAPIは郵便番号→住所も可能なので、上記コードを少し書き換えれば色々汎用的に使えるかと思います。
Zipcodaさん素晴らしいAPIの提供をありがとうございますmm
ブロックチェーン関連メモ

ブロックチェーン関連のメモ

#仮想通貨
##Fcoin
- Fcoinについて
 - HuobiでCTOをしていたZhang Jianが代表
 - 会社ではなくコミュニティ
 - 特定の国の会社ではないので、縛りが少なく、規制に該当せずに運営している
 - β版で1日の取引高世界1位（7500億円）
- FT(Fcoin Token)
 - Fcoin取引所のトークン
 - イーサリアムベース、ERC20
 - 手数料利益の100％をFT保有者に配当（FTが30億枚を超えたら80%）
 - 発行枚数20億枚。最大100億枚。

##ZIP
- 関連者にHuobiでCTOをしていたZhang Jian
- FCoin取引所で優遇されている
- 中国版リップル
- 関連リンク
 - https://virtualcurrency365.net/zip-virtualcurrency/

##Midex
- Midexについて
 - CEOはロシア、開発はロシア中心、エストニアと香港に会社拠点、取引所の拠点は香港
 - 銀行業の資格をエストニアと香港で保有、銀行もやるためフィアット通貨と仮想通貨を両方扱えるのが特徴
 - ビジネスモデルはバンクエラと非常に似ている
 - Bancorプロトコルを採用（Midexの創立メンバーにBancor創立メンバーがいる。Bancorは年間ICO調達額ランキングの10位）
 - IBM、Linux、Bancor、Ethereum、XEMが共同出資者
 - すべての仮想通貨がフィアット通貨とペア
 - 日本円、米ドル、香港ドル、中国元、ユーロなど7種のフィアット通貨に対応
 - 国際送金(SWIFT)で入出金可
 - クレジットカードで入金可（Visa/Master/デビッド)
 - イギリスのAMLライセンス取得済
 - 複数の取引所と提携していて、Midex上で一番いい条件の取引所での取引が可能
 - 取引手数料は0.1% MDXを使うと0.05%
 - 登録時にKYC不要(2BTC以上の出金にKYC必要）
 - KYC(本人確認)に日本の運転免許証可
 - ロスチャイルド家の管財人がアドバイザー
 - 日本の取引所認可取得予定
 - 日本含むアジア担当者が国際経済オリンピック優勝者
 - ICO評価スコアがほぼ最高得点
 - 2018年7月3日にβ版開始予定
 - 稼働時のペア　MDX,BTC,ETH,LTC,DASH,NANJ　すべてのペアがMDX,BTC,ETH,USD,EUR,GBP,JPY,CNYに対応
 - ベンチテストは1250万件/秒(Binanceの8倍)
 - 分散取引所はたいてい管理者不在だが、中央集権的な部分もありちゃんと管理される。また分散取引所は人がいないと取引が成立しにくいが、それを解決したBancorを導入する
 - プロの投資家に資産運用してもらうサービスを開始予定
- Midexトークン
 - 発行枚数7500万枚
 - MDX（取引手数料用のトークン）とMDI（配当用のトークン）とMDB(サービス用のトークン)がある
 - MDI保有者にMidex取引所の(手数料?)利益の20%を配当
 - MDX→MDIに1対1で変換、逆変換はできない
 - MDX→MDBに1対1で変換
 - MDXは価格上昇を促すシステムがある(取引所の取引毎にMDXの取引が行われる)

参考
[仮想通貨ICO 格付けで高評価のMidexを紹介。Bankeraバンクエラ を超える金融系ICOが登場したよ。](http://huem.net/2018/03/08/%E4%BB%AE%E6%83%B3%E9%80%9A%E8%B2%A8ico-%E6%A0%BC%E4%BB%98%E3%81%91%E3%81%A7%E9%AB%98%E8%A9%95%E4%BE%A1%E3%81%AEmidex%E3%82%92%E7%B4%B9%E4%BB%8B%E3%80%82bankera%E3%83%90%E3%83%B3%E3%82%AF%E3%82%A8/)

#Hyperledger
ハイパーレッジャー。ledger=台帳。オープンソースのブロックチェーン技術推進コミュニティ。Linux Foundationのプロジェクト。IBM、富士通、MUFJなど３０社以上が参画している。
IBM主導のHyperledger fabric（ビジネス向け）、Intel主導のHyperledger Sawtooth Lake（エンタープライズソリューション向け）、日本のソラミツ主導のHyperLedger Iroha（モバイルアプリ向け）がある。

##HyperLedger Fabric
Fabric は貨幣ではなく様々なビジネス用途を目的に設計されている。
モジュラー型アーキテクチャになっている。メンバーシップサービス・ブロックチェーンサービス・チェーンコードサービス という3つのカテゴリのコアコンポーネントの集まりになっている。
メンバーシップサービスは、参加者に対する認証局(CA)の役割を持つ。
ブロックチェーンサービスは、HTTPのP2Pプロトコルによりブロックチェーンを管理する。
チェーンコードサービスは、各ノード上でトランザクション処理をする環境を提供する。スマートコントラクトにあたる部分。Go、Node.js、Javaをサポートしている。
・マイニングや高額な計算不要
・許可性ネットワーク
・プログラム可能
・機密保持性の高い取引
Golangで実装されている。

HyperLedgerの初期メンバー
ブロックチェーン特化の企業（Blockchain、ConsenSys、Digital Asset、R3）、テクノロジー企業（シスコ、富士通、日立、IBM、Intel、NEC、NTTデータ、Red Hat、VMware）、金融会社（ABN AMRO、ANZ銀行、BNYメロン、CLSグループ、CMEグループ、預託信託会社（DTCC）、ドイツBörseグループ、JPモルガン、ステート・ストリート、SWIFT、ウェルズ・ファーゴ）、その他（アクセンチュア、キャストトン、クレジット、 、IntellectEU、Nxt Foundation、Symbiont）が含まれる。

公式サイト
https://www.ibm.com/blockchain/jp-ja/hyperledger.html

#exonum
ブロックチェーンのためのフレームワーク。Apacheライセンス。毎秒5000トランザクション可能。
https://exonum.com/
https://github.com/exonum/exonum
Goより高速と言われているRustという言語で開発されている。
Gitのコミットログを修正する方法

はじめに
-----

Gitのマイナス面として、SubVersionに比べてコミットログの編集がしにくいというのを耳にしたことがあります。コミットログをやり直したいと思う場面は意外と多いはずなので、確認したいと思います。

【case1】直前のコミットの修正
-----

![amend.png](https://qiita-image-store.s3.amazonaws.com/0/66405/631c1413-1164-774f-f715-0c96e4f5c33a.png)

```
> git commit --amend
```

エディタで前のコミットログが開くので編集します。
もしくは直接コマンドにコメントを入れます。

```
> git commit --amend -m "新しいコメント"
```

簡単でしたね。

```
> git rebase -i HEAD~
```
次のパターンと同じ`rebase -i`を使った、こちらでも同じことができます。

```
> git reset --soft HEAD~
```
リセットを使ってコミット前に戻してしまう方法もあります。コミットしなおして完了です。

【case2】ふたつ前のコミットを修正
-----

![reword.png](https://qiita-image-store.s3.amazonaws.com/0/66405/4cb79adf-ab52-d9ac-0bb1-ea2201c4b969.png)

```
> git rebase -i HEAD~2

reword 5549b30 add d
pick 07af2cf del mistake
```

変更したいコミットログの行を`pick`から`reword`に変更します。保存すると、エディタに既存のコミットメッセージが表示されるので編集して保存します。（複数変更時は複数回繰り返す）

【case3】ひとつ前のコミットログを消す
-----
![squash.png](https://qiita-image-store.s3.amazonaws.com/0/66405/e5129680-8915-3f4a-32d7-4b6fb091de5e.png)

意外とやりたい場面が多いのがこのパターン。いわゆる凡ミスの修正です。誤字修正、スペルミス、バージョン変更忘れ、コメント修正など・・・。修正自体は保持してコミットメッセージだけを消したい場合です。

```
> git rebase -i HEAD~2

pick 546f109 finish
squash 2cd5de3 del mistake
```
削除したいログ`del mistake`の方を`squash`にします。既存のメッセージ内容がエディタが開きます。初期状態では両方のメッセージが含まれているので、`del mistake`を削除してfihishだけ残して保存します。必要なければそのまま終了します。これで`finish`だけがログに残り、`squash`した方のコミット内容もそこに含まれます。

まとめ
-----

修正自体は簡単にできる桃の、新たにコミットを行って履歴を改変しているので影響範囲が気になるところ。とはいえGitを使っていく上で、こういった修正作業で作業が止まらないように準備しておきたいですね。
MacでRuby on Rails環境構築（備忘録）

詳しくまとめてくださってる人がいたのでこちらをもとに環境構築
https://qiita.com/narikei/items/cd029911597cdc71c516

## homebrewをインストール
[http://brew.sh/index_ja.html](http://brew.sh/index_ja.html)

# Rubyのインストール

## rbenvをインストール
```bash
$ brew install rbenv
$ brew install ruby-build # 
$ rbenv version
2.5.1 (set by ******)
```

ruby-buildってなに？って人は以下参照
http://ruby.studio-kingdom.com/rbenv/ruby_build/

## bash_profileに追記


```bash
$ echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile
$ echo 'if which rbenv > /dev/null; then eval "$(rbenv init -)"; fi' >> ~/.bash_profile
$ source ~/.bash_profile
```



## Rubyをインストール
```bash
$ rbenv install --list #インストールバージョンを確認
$ rbenv install 2.5.1 
```
※20180630現在の最新

## rbenvのバージョンを切り替える
```bash
$ rbenv global 2.5.1
$ rbenv rehash
$ ruby -v
ruby 2.5.1p57 (2018-03-29 revision 63029) [x86_64-darwin16]
$ gem -v
2.7.6
```

## bundlerインストール
```bash
$ gem install bundler
$ bundle -v
Bundler version 1.16.2
```

# MySQL編
## MySQLをインストール
```bash
$ brew install mysql
```

## MySQL起動
```bash
$ mysql.server start
Starting MySQL
SUCCESS! 
```

# Rails編
## 好きなワークスペースを作成
```bash
$ mkdir ~/workspace
$ cd ~/workspace
```

## bundle init
```bash
$ bundle init
Writing new Gemfile to /Users/*****/workspace/Gemfile
```

## できあがったGemfileのRailsのコメントアウトを外す
```ruby:Gemfile
# A sample Gemfile
source "https://rubygems.org"

gem "rails"
```

## Railsインストール
```bash
$ bundle install --path=vendor/bundle
Fetching gem metadata from https://rubygems.org/...........
```

## Railsアプリケーション作成
```bash
$ bundle exec rails new . -d mysql
```
mysqlを指定。
オプションを指定しない場合はsqliteがデフォルトで設定される。
GemfileがConflictしていますが Y で上書き

## （新しいGemを追加する場合）先ほどと同じようにライブラリインストール
```bash
$ bundle install --path=vendor/bundle
Fetching gem metadata from https://rubygems.org/...........
```

## Railsアプリケーション起動
```bash
$ bundle exec rails s
PC-10214:workspace a13161$ bundle exec rails s
=> Booting Puma
=> Rails 5.2.0 application starting in development 
=> Run `rails server -h` for more startup options
Puma starting in single mode...
* Version 3.11.4 (ruby 2.5.1-p57), codename: Love Song
* Min threads: 5, max threads: 5
* Environment: development
* Listening on tcp://0.0.0.0:3000
Use Ctrl-C to stop
```
Rails 5.2ではPumaがデフォルトで起動するようで

# おわり
[http://localhost:3000/](http://localhost:3000/) へアクセスしてみましょう！
VSCodeでexperimentalDecoratorsの警告がどうしても消えない

# 解決したかったこと
- VSCodeでexperimentalDecoratorsの警告がどうしても消えない

![ss](https://qiita-image-store.s3.amazonaws.com/0/46870/0a6c38cd-408b-50a7-44eb-f9408068b1f0.png)

# 環境
```
macOS: High Sierra 10.13.2
Node.js: v9.5.0
VSCode: 1.24.1
Nuxt.js: 1.4.1
TypeScript: 2.9.2
```

# 試したけどダメだったソリューション
- tsconfig.jsonに`{"compilerOptions": { "experimentalDecorators": true, "allowJs": true}}`を指定
  - https://ihatetomatoes.net/how-to-remove-experimentaldecorators-warning-in-vscode/
- `.vscode/jsconfig.json`を指定
    - https://github.com/Microsoft/vscode/issues/28097#issuecomment-306560817
- VSCodeで使うtsserver.jsを最新のものに指定
    - https://code.visualstudio.com/Docs/languages/typescript#_using-newer-typescript-versions
- 他にも色々試して直らないので不貞寝
    - ここまで5時間

# 有効だったソリューション
- VSCodeで開くフォルダを、モノレポ構成のrootフォルダではなくtsconfig.jsonのあるフォルダにする

```
. ←ここじゃなくて
├── server
└── client ←これを開く
    └── tsconfig.json
```
第17話 フェルマー数

この記事は[仮面ライダービルドの数式](https://qiita.com/izmktr/items/e26a624e79bce3edccc9)の第17話です。

```math
F_2=2^{2^2}+1=17
```

フェルマー数に関する式です。フェルマー数とは以下の式で表される式です。

```math
F_n=2^{2^n}+1\\

\begin{align}
F_0&=3\\
F_1&=5\\
F_2&=17\\
F_3&=257\\
F_4&=65537\\
F_5&=4294967297=641×6700417
\end{align}
```

フェルマーの最終定理で有名なフェルマーが提唱した式です。

フェルマー数はすべて素数である、という予想を立てました。
しかし、フェルマーが素数と確認したのはF4までで、
F5に関しては100年後にオイラーが素数ではない、ということを発見しました。

当時はコンピュータもないので、この証明を計算するだけでも大変だったでしょう。
式を見ればわかりますが、32bitで表すとぎりぎり足りない数になりますね。

結局、フェルマーの予想は完全に外れていて、
現在はコンピュータでかなりの数のフェルマー数が素数かどうかを確認しています。
しかし、F5以降に素数が発見されてはいません。

それどころか、フェルマー数がF4より後で素数である確率はかなり低く、
F4が最後のフェルマー素数ではないか、という予想もでています。
Blenderのインストール

##Blenderをダウンロードするには

- 下記のサイトで自分のPCの環境にあったBlenderのインストーラをダウンロードする

Blender 公式サイト　https://www.blender.org/download/

今回はwindows 64bit用の2.79bのインストーラをダウンロードした
     (投稿時の最新バージョン)

##Blenderをインストールするには

- 先程ダウンロードしたインストーラをダブルクリックする

今回ダウンロードしたインストーラ　blender-2.79b-windows64.msi

基本はデフォルトのままnextを押して次に進めていけばよい

これでBlenderのインストールが完了！

※これはあくまで参考程度にしてください
[Rails5]deviseでgmailを送れる様にしたが、このままだと見られちゃ困るpasswordも公開される。そんな時のconfig

#gem config
タイトル通りdeviseでgmailをユーザーに送れる様にしたが、このままだとgithub等にソースをあげた時にgmailのアプリパスワード、アドレスも公開されてしまう。そんな時に使うgemがconfig.
簡単に言うと公開しないようにできます。

#configの使い方
使い方は[rails 一度gitHubにあげたID・パスワード等を履歴から消し、環境ごとに管理する](https://qiita.com/shizuma/items/efcbd2593446015130a6)と[公式](https://github.com/railsconfig/config)を見たらすぐにできます。
[どのファイルで設定するか](https://qiita.com/cyborg__ninja/items/02d1c4304a4ba900307f)
古いNAS(2010年製以前ぐらい?)にアクセス出来ない場合

古いNAS等ではSMBv1が利用されており、Windows10やMacOS High Sierra(10.13)等ではそのままだとアクセス出来ない。
その場合、下記の方法によりアクセスが出来るようになる。

## Windows10

- スタートメニューより「Windows の機能の有効化または無効化」で検索
  - ※"Windows"の後ろに半角スペースが必要なので注意
- 「SMB 1.0/CIFS ファイル共有のサポート」にチェックを入れて「OK」ボタンを押下
- Windowsを再起動

## MacOS High Sierra

- アクセス時のURLとして"smb://" ではなく "cifs://" を指定
Aptana Studio をダウンロードしようとすると404になる件

Windows版をいくらダウンロードしようとしてもできなかったので。

以下のgithubのリリースノートから「Aptana_Studio_3.6.1_Setup.exe」を
選択するとダウンロードできる。

https://github.com/aptana/studio3/releases
macアプリ　XCode9.4.1より特定のフォルダにアクセスできない問題の回避方法 

XCode9.4.1よあるフォルダにアクセスできなくなり困りました。

この解決にとても工数を使い苦しみましたので、情報共有します。

エラー内容：
Process（コマンドラインツール）であるライブラリフォルダのキャシュフォルダにファイルを作成しようとした際にエラーで実行停止。
[General] An uncaught exception was raised
ConvertDae[3468:444538] [General] launch path not accessible


解決方法：
プロジェクト内のConvertDae.entitlementsファイルの内容に以下を追記
\<dict>
	\<key>com.apple.security.app-sandbox</key>
	\<false/>
\</dict>

単にサンドボックスのセキュリティ機能を全て解除していますので気になる方は以下を参考に厳密に対応可能のようです。
「App Sandboxの有効化」
https://developer.apple.com/library/archive/documentation/Miscellaneous/Reference/EntitlementKeyReference/Chapters/EnablingAppSandbox.html


【大変参考になりました】
@codelynx
macOS で ネットからURLでダウンロードするコードが動かなくなり焦って調べてみた
https://qiita.com/codelynx/items/35eba001de1ecee6826e
VBScriptでExcelに条件付き書式を設定する

今回はVBScriptでExcelに条件付き書式を設定する方法について説明したいと思います。
`VBScript`ではなく`VBA`でのやり方はネットでたくさん見つかるのですが、`VBScript`はなかなか見つからなかったのでQiitaの記事にしてみました。

指定したシートの全体に「空白セルの場合、背景色をグレーにする」という条件付き書式を設定するSub関数です。

```vb
'*********************************************************************
' Purpose: 指定されたシートに空白セルの背景をグレーにする条件付き書式を設定する
' Inputs: excelApp: Excelアプリケーションのオブジェクト
'                   Selectionを利用するために必要になる
'         workSheet: 条件付き書式の設定対象となるシートのオブジェクト
' Returns: なし
'*********************************************************************
Sub BlankToGray(ByRef excelApp, ByRef workSheet)
    workSheet.Cells.Select
    excelApp.Selection.FormatConditions.Add 10
    excelApp.Selection.FormatConditions(excelApp.Selection.FormatConditions.Count).SetFirstPriority
    excelApp.Selection.FormatConditions(1).Interior.ColorIndex = 15
    excelApp.Selection.FormatConditions(1).StopIfTrue = False
End Sub
```

条件付き書式の定数については[マイクロソフトのサイト](https://msdn.microsoft.com/ja-jp/vba/excel-vba/articles/xlformatconditiontype-enumeration-excel)で公開されています。
今回は空白の条件なので`xlBlanksCondition`定数の値である10を指定しています。

> XlFormatConditionType 列挙 (Excel)

| 名前 | 値 | 説明 |
|:-----|:--:|:-----|
| xlAboveAverageCondition | 12 | 平均以上の条件 |
| xlBlanksCondition | 10 | 空白の条件 |
| xlCellValue | 1 | セルの値 |
| xlColorScale | 3 | カラー スケール |
| xlDatabar | 4 | データバー |
| xlErrorsCondition | 16 | エラー条件 |
| xlExpression | 2 | 演算 |
| XlIconSet | 6 | アイコン セット |
| xlNoBlanksCondition | 13 | 空白の条件なし |
| xlNoErrorsCondition | 17 | エラー条件なし |
| xlTextString | 9 | テキスト文字列 |
| xlTimePeriod | 11 | 期間 |
| xlTop10 | 5 | 上から 10 個の値 |
| xlUniqueValues | 8 | 一意の値 |

`FormatConditions.Add`の詳細については[FormatConditions.Add メソッド (Excel)](https://msdn.microsoft.com/ja-jp/vba/excel-vba/articles/formatconditions-add-method-excel)を参照ねがいます。
イケてるDBプラットフォーム「Neo4j」導入メモ

# Neo4j[グラフデータベース作成プラットフォーム]メモ


## 導入テスト

`$ brew install neo4j`

ブラウザ
http://localhost:7474/browser/

ローカル作業フォルダ作成時
`$ npm install neo4j`

---
`$ cd /usr/local/Cellar/neo4j/3.3.0/libexec/conf
dbms.connectors.default_listen_address=0.0.0.0`
↑ローカル外の場合はコメント外す

https://www.deep-rain.com/programming/database/880#i-2
> 　localhostのみで動かす場合は問題ありませんが、外部からneo4jに繋ごうとしたとき、デフォルト設定ではアクセスできません。外部から接続する場合のみ以下を実施してください。


---

ID/パス共に初期状態は neo4j

パスは変更必要

---


### ノードを作成


例）
人物データベース作成(名前,年齢)：
```
CREATE
     (:Person{name:"次郎", age:22}),
     (:Person{name:"花子", age:25});
```


基本の相関図作成コード：
- 次郎から花子への一方通行の例
```
MATCH (p1:Person{name:"次郎"}), (p2:Person{name:"花子"}) CREATE (p1)-[:Friend]->(p2) ;
```

結果
![](https://t.gyazo.com/teams/devcap/20af33a1175f739512d27ddceaf952f1.png)


---

## グラフデータベース?

> グラフ構造を持ったデータを扱うことに最適化されたDB（グラフDB）の一種

- 相関図特化のグラフラットデータベース作成プラットフォーム
- 学習コストはあるが、UIなどかなり良さそう
- CSV読み込みも可
- 画像は出せないのか？
  - ↑ いずれにしても、データが大量にあれば読み込みが重くなる懸念
  - 何を目的としたグラフであるか、UIUX設計の検討必要
- このツールを用いての「グラフデータベース」専門書籍が数冊出ている
- 必要技術
  - Python
  - json
  - データベース知識

---

### ツール操作検証
-　ターミナル内蔵
-　データベースも可視可能
-　キーワードタグを元に1クリックでデータ確認可能なGUI設計


操作画面:
![](https://t.gyazo.com/teams/devcap/663ee00e19bf96318c42b20a124b84da.png)

---

デフォで入っているデータベースでのテスト出力結果:
![](https://t.gyazo.com/teams/devcap/9dec315c02d249a147576def312c91bc.png)


---

## 「Neo4j　使い方」

グラフDBのNeo4jでカフェのレコメンド機能を実験してみた
http://allabout-tech.hatenablog.com/entry/2017/03/02/094600


neo4j入門　Cypherクエリと使い方の具体例
https://www.deep-rain.com/programming/database/880#i

Neo4jとは
https://qiita.com/tikamoto/items/c3a1bba12e9b83aee42a

Neo4jについてちょちょいと調べたまとめ
http://the.igreque.info/posts/2014-06-08-neo4j.html

【Python】ソーシャルグラフが簡単に作れるNeo4jを試してみた
http://73spica.tech/blog/neo4j-python/

Pythonでグラフデータベース Neo4j入門 for ビギナー (Mac OSX向け)
https://qiita.com/kenmatsu4/items/f75616461dc5c63ecfe1

---

## チュートリアル動画
Using Python and Neo4j for Data Analytics
https://www.youtube.com/watch?v=Nkd6Ei-xuxI


Master Data Management with Neo4j: Merging Two Financial Institutions
https://www.youtube.com/watch?v=LkIkMsW1cVs

Intro to Graphs and Neo4j
https://www.youtube.com/watch?v=Go3P73-KV30

Intro to Cypher
https://www.youtube.com/watch?v=pMjwgKqMzi8

---

## 日本語対応 ハンズオン

Tech-Circle #25 Neo4j Hands-On-Development

Part１
https://crash.academy/ng/class/177

ドキュメント
https://crash.academy/uploads/course/177/tech-circle25.pdf
https://github.com/zackys/handson-neo4j/blob/master/doc/00_prep.md

Git
https://github.com/zackys/handson-neo4j/blob/master/doc/10_hands-on.md

> グラフデータベースをご存じでしょうか。 リアルタイム・レコメンデーション・エンジンやマネーロンダリングの検出など、RDBMSでは複雑な検索になりがちなドメインの問題解決に威力を発揮するNoSQLの一種です。そんなグラフデータベースを、パナマ文書の解析でも使用された Neo4j というプロダクトを使用し、データの基本的な操作をハンズオン形式でご紹介します。

#2 の45分くらいにCSVアップロードのやり方あり

ハンズオンに沿って相関図出力の検証テスト結果
![](https://t.gyazo.com/teams/devcap/294523d918dac0ba828ae89702f776e8.png)
USBメモリにインストールしたPythonを使う（一時的にPathを通す）

#自宅のPCと仕事先のPCでPythonを使う。
USBにPython(+wxPythonライブラリ）をインストールしました。
理由としては、私の場合、仕事先でいつも同じPCが使えるとは限らないからです。自分のノートPCを持ち歩くことも考えましたが、テストも兼ねてUSBメモリを利用してみることにしました。
GitHubを使うことも考えましたが、今回はいつ突然使用するPCが変わってもすぐに開発がスタートできる環境のひとつとして試してみました。

#インストールについて
過去記事：PythonとwxpythonライブラリをUSBにインストールする
https://qiita.com/takako_sudou/items/895b5f01753a2fdbde5c

#PATHを通す
その日作業するPCにPATHを通します。
システム情報に設定する方法もありますが、その日限りということもあるため、一時的に通す方法も必要です。
また使用するPCによっては、USBのドライブ名がEやFなど異なることもありえます。

##パスを確認する

```console
path
```

現在の設定が表示されます。特に、最後が「;」で終わっているかどうかを確認しておきます。

##パスを設定する
```console
set path=%path%E:\WinPython\python-3.6.5.amd64;E:\WinPython\python-3.6.5.amd64\Scripts;
```

##再度pathコマンドで確認する。
設定したパスが表示されます。

##バッチファイル化する
サクッと作業が終わるように、バッチファイルにしてUSBメモリに入れておきます。ドライブがEでないときでもファイル内の１文字を変更して実行すればよいので、コマンドを直接入力するよりはるかに効率が良くなると思います。

```bash

set path=%path%E:\WinPython\python-3.6.5.amd64;E:\WinPython\python-3.6.5.amd64\Scripts;

```

以上の内容をメモ帳で入力し「Setpath.bat」として保存。
コマンドプロンプトから実行します。

```console
E:>Setpath.bat

```

###参考記事
Windowsのバッチファイルの基本的な使い方
http://www.atmarkit.co.jp/ait/articles/1506/26/news026.html

#注意
これは一時的なものなので、コマンドプロンプトを閉じてしまうと設定が消えます。
PATHが通っていると、pipを動かすときにも便利です。
ansible | シェルの標準出力を ansible-playbook コマンドで出力させる

いちどシェルの実行結果をいちどansibleの変数 ( `return_from_shell` ) に入れてから、 デバッグモジュールで表示させる例。

# playbook の例

```yaml:echo_shell_stdout.yml
---
- hosts: example
  tasks:
    - name: execute shell
      shell: echo some message
      register: return_from_shell # 実行結果をansible変数に入れる
      changed_when: no
    - name: show previous shell stdout
      debug:
        msg: "{{ return_from_shell.stdout }}" # .stdout に標準出力の結果が入っている
```

# 結果例

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/bc96e0a9-3387-0245-beb5-3ddf09a1572a.png)


# 参考

- [shell - Execute commands in nodes. — Ansible Documentation](https://docs.ansible.com/ansible/latest/modules/shell_module.html)


# 環境

- ansible 2.4








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
クイックソートについて

# クイックソートとは
配列の中から一つの要素を取り出し（ピボット）、その要素と比べて大きいか小さいかで残りの要素を別の配列に分ける。

この処理を分けた配列に対して、再帰的に呼び出し、それを繰り返すことでソートをするアルゴリズム。


# 例
以下のような配列を昇順でクイックソートする場合を例に挙げる。

```
arr = [10, 5, 2, 3, 8]
```

①まずはピボットとなる値を取り出す。ここでは`5`をピボットとして取り出す。
（基本的にはどれでもいい）

```
pivot = arr.pop(1) // 5をピボットとして取り出す
```

②このpivotと比べて大きい値をまとめた配列と、小さいまたは同じ値をまとめた配列を作成する。

```
less = [2, 3]       // 5以下の配列
greater = [8, 10]   // 5よりも大きい配列
```

➂ピボットを配列化し、配列を結合する。このとき`less`と`greater`に関しては、①②の処理を再帰的に呼び出す。

```
return quick_sort(less) + [pivot] + quick_sort(greater)
```

④このままだと、再帰的に呼び出す時に無限ループに入ってしまう。そのためループを抜けるための**基本ケース**をquick_sort(arr)の頭に実装する。

```
if arr < 2:
  return arr // arrが空または、要素が一つしかない場合は処理をせず、そのまま返す。
```

これを繰り返して、再帰的に呼び出されなくなったらソートが完了する。


# パフォーマンス
クイックソートのパフォーマンスは、選択するピボットによって変動する。

例えば下記のようなソート済み配列の、先頭をピボットとしてクイックソートをする場合。
```
arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
```

`less`と`greater`は下記のように、変化していく


```
// 一回目
pivot = 0
less = []
greater = [1, 2, 3, 4, 5, 6, 7, 8, 9]

// 二回目
pivot = 1
less = []
greater = [2, 3, 4, 5, 6, 7, 8, 9]

// 三回目
pivot = 2
less = []
greater = [3, 4, 5, 6, 7, 8, 9]
・
・
```

ソート済みの配列の先頭は、その配列における最小値になるため`less`は常に空になる。
（つまり部分配列のが空）
そのた配列を二分するという考え方のクイックソートの強みが生かせていない。
この場合の計算量は各ループでは*O(N)*となり、それが全要素行うため*O(N2)*となる。

そのためピボットは、中央値を3つとったものから選んだりして工夫する必要がある。
また再帰的に呼び出していく中で、配列の要素数が少なくなってきたら挿入ソートに切り替えるなどの実装がよく使われる。

> 例：V8エンジン
>>https://github.com/v8/v8/blob/master/src/js/array.js#L760-L844
あなたの課題は、もう解かれたのかもしれない　- 国際カンファレンスの概要を読もう -

(副題をつけました）

あなたが画像認識分野で、「こんなことができたらうれしいんだけどなあ」と漠然と思ってきたことに対して、
解決可能な領域になってきているかもしれない。

[CVPR 2018 完全読破チャレンジ](http://hirokatsukataoka.net/project/cc/cvpr2018survey.html)
にアクセスしてみよう。

国際会議に参加できなくても、英語で論文を読むのが苦手でも、国際会議の動向を知ることができる。

まず、日本語で書かれたそれらの解説を読んで、自分の関心に近い論文を見つけよう。
リンクをたどれば、論文のpdfにたどり着く。
論文によっては実装を github上で公開している。

その公開している実装を、さっさとgit clone して動かしてみるべきだ。




[CVPR2018 1000本ノック！（なお37本）](https://tech-blog.abeja.asia/entry/cvpr2018-oral)


[【チュートリアル】コンピュータビジョンによる動画認識 v2 ](https://www.slideshare.net/HirokatsuKataoka/v2-97223260)
VSCode ショートカット（エディター操作）

## エディター

|コマンド                     |キーバインド                 |
|-----------------------------|-----------------------------|
|現在のエディターを閉じる     |Ctrl + w                     |
|エディターの分割             |Ctrl + \                     |
|前のエディターを開く         |Ctrl + PageUp                |
|次のエディターを開く         |Ctrl + PageDown              |
|エディターを左へ移動           |Ctrl + Shift + PageUp        |
|エディターを右へ移動           |Ctrl + Shift + PageDown      |

## フォーカス

|コマンド                               |キーバインド                 |
|---------------------------------------|-----------------------------|
|サイドバー内にフォーカス               |Ctrl + 0                     |
|最初のエディターグループにフォーカス     |Ctrl + 1                     |
|2番目のエディターグループにフォーカス    |Ctrl + 2                     |
|3番目のエディターグループにフォーカス    |Ctrl + 3                     |

## サイドバー

|コマンド                     |キーバインド                 |
|-----------------------------|-----------------------------|
|エクスプローラを開く         |Ctrl + Shift + E             |
|検索を開く                   |Ctrl + Shift + F             |
|デバッグを開く               |Ctrl + Shift + D             |
|拡張機能を開く               |Ctrl + Shift + X             |

## 表示切替

|コマンド                     |キーバインド                 |
|-----------------------------|-----------------------------|
|サイドバー表示の切り替え           |Ctrl + B                     |
|問題(エラー、警告、情報)の切り替え |Ctrl + Shift + M             |
|出力の切り替え                     |Ctrl + Shift + U             |
|デバッグコンソールの切り替え       |Ctrl + Shift + Y             |
|統合ターミナルの切り替え           |Ctrl + @                     |
|新しい統合ターミナルの作成         |Ctrl + Shift + @             |

## 拡大/縮小

|コマンド                     |キーバインド                 |
|-----------------------------|-----------------------------|
|拡大                         |Ctrl + -                     |
|縮小                         |Ctrl + ;                     |
iMacでFoxDot (SuperCollider) をやろうとした時に出たエラー

#あらすじ
SuperCollider上で
`FoxDot.start`
したら、以下のようなエラーが出ました。

```
-> FoxDot
booting server 'localhost' on address: 127.0.0.1:57110
Number of Devices: 3
   0 : "Built-in Microph"
   1 : "Built-in Input"
   2 : "Built-in Output"

ERROR: Input sample rate is 44100, but output is 48000. Mismatched sample rates are not supported. To disable input, set the number of input channels to 0.
could not initialize audio.
RESULT = 0
```
なんか output の sample rate がどうの言ってます。

# 解決方法
##1. iMacのAudio MIDI設定を開く

![スクリーンショット 2018-06-30 16.45.37.png](https://qiita-image-store.s3.amazonaws.com/0/145574/6750153e-d26a-162c-4c15-96a8f868d63f.png)

![スクリーンショット 2018-06-30 16.46.07.png](https://qiita-image-store.s3.amazonaws.com/0/145574/83442a17-d406-d701-9899-9729bc0aa267.png)
##2. ここで<b>出力</b>を選択し、フォーマットを選択

![スクリーンショット 2018-06-30 16.47.46.png](https://qiita-image-store.s3.amazonaws.com/0/145574/e5983040-6def-233c-d3bb-06fa2178f657.png)
![スクリーンショット 2018-06-30 16.48.01.png](https://qiita-image-store.s3.amazonaws.com/0/145574/9eb48447-66a9-a121-3393-95b340cf9c63.png)
##3. 入力と同じフォーマット(今回は44.1kHz)を選択
![スクリーンショット 2018-06-30 16.48.36.png](https://qiita-image-store.s3.amazonaws.com/0/145574/557712e5-1e3f-affe-562f-cd3b8c80f90e.png)

![スクリーンショット 2018-06-30 16.48.48.png](https://qiita-image-store.s3.amazonaws.com/0/145574/9fe22854-f62d-cdd6-9385-81566f95698d.png)

以上です。
Chrome キャッシュクリア

ブラウザの "Hard Reload" という機能のお話。

Chrome の場合は、以下のいずれかの手順で "Hard Reload" が可能です。

- Developer Tools を開いた上で、更新ボタン長押し
- shift を押しながら更新ボタンクリック
- ショートカットコマンド: command + shift + r (macOS)

![chrome_refresh.png](https://files.tearoom6.biz/e04a11c9-070f-469c-8a0e-20917ab2b076.png)

この "Hard Reload" が通常の "Soft Reload" と何が違うのでしょう?

まず、 "Soft Reload" の場合は、以下の HTTP Caching の仕組み (HTTP Caching の仕組みはもっとパターンが有り、複雑ですが、ざっとしたイメージとして) に従います。

1. HTTP の仕組みで、サーバ側がレスポンスヘッダ中で `cache-control` や `expires` などを使ってレスポンスをキャッシュするよう指示することがあります
2. この場合、ブラウザはレスポンスボディをキャッシュします
3. ブラウザの更新ボタンが押されると、再度リクエストを投げますが、リクエストヘッダ中の "cache-control" や "if-modified-since" などでキャッシュがあることを伝えます
4. すると、サーバ側は 304 Not Modified を返して、前回のキャッシュを使用するよう指示することがあります (レスポンスボディは返りません)

"Hard Reload" の場合は、上の 3 のところで、キャッシュがあることを伝えずにリクエストするので、サーバは新規のリクエストとして扱い、 200 OK とともにレスポンスボディを返します。

通常、 304 Not Modified を返すパターンは、静的リソース等でサーバ側から返される内容は変化ない場合が多いのですが、開発環境等で頻繁に静的ファイルを書き換えている場合などで "Hard Reload" が役に立つことがあります。

他のブラウザにも同様の機能があるようなので、他をお使いの場合はチェックしてみてください。

> References

- [Google Chrome: hard reload vs. normal reload - gHacks Tech News](https://www.ghacks.net/2018/01/24/google-chrome-hard-reload-vs-normal-reload/)
- [HTTP caching - HTTP | MDN](https://developer.mozilla.org/en-US/docs/Web/HTTP/Caching)
- [Tech tip: How to do hard refresh in Chrome, Firefox and IE?](https://www.getfilecloud.com/blog/2015/03/tech-tip-how-to-do-hard-refresh-in-browsers/#.WwQldVOFMkp)
Re:VIEW 3.0への道

Re:VIEW 3.0についての文書です。鋭意更新中。予定はまだ未定です。

# 2.0と3.0の違い

## スタイル

* 全面更新、基本的には2.0のことは忘れて欲しい
* 3.0では以下の3つのスタイルを持つ予定
    * 2.0互換jsbookスタイル
    * 3.0版jsbookスタイル
    * 3.0版jlreqスタイル（experimental）
* 一応2.0互換モードもあるけど、そのうち（動か）なくなりそう
* jlreq版もできるけど、jsbook版は維持する予定（3.0版の方）

## 3.0版の構成

* `*.sty`は4つになる
    * reviewmacro.sty
    * review-base.sty
    * review-style.sty
    * review-custom.sty
* reviewmacro
    * loader。通常は編集不可。
    * 残りの3つを読み込む
* review-base
    * 基本となるマクロ定義
    * Re:VIEWのタグから吐かれるマクロを定義する（そのためないと動かない）
* review-style
    * （主に）見た目に関するマクロ定義
    * このファイルは空にしても大丈夫かも？
* review-custom
    * ユーザ・書籍タイトル独自のマクロ定義
    * Re:VIEW自体で定義する内容はない（初期状態では空になっている）

### なぜこうなったのか

* 2.xでは頑張ろうとすると結局 `layouts/layout.tex.erb` をいじる必要があった
* `*.erb` はユーザに触らせたくない
    * マイナーバージョンアップしただけで壊れやすい
    * → `*.sty`　だけで完結したい
    * バージョンアップ時に変更するファイルと変更しない（ユーザに任せる）ファイルに分割する

### Re:VIEWのバージョンアップ時について
* いままではlayout.tex.erbを更新していたが、そういうのをやめるようにしたい
* 3.0→3.1への変更といったときには、`review-base.sty` を更新する
    * `review-init`を拡張する？ `review-update`みたいなコマンドを提供する？
    * 標準のスタイルを更新する場合には`review-style.sty`も更新される

## 3.0 preview 1に入っていないけどやりたいこと
* techbooster-dojin.styに寄せる？
    * geometryの非標準化
    * tcolorbox化
* captionblockの独自マクロ化
    * https://ctan.org/pkg/alertmessage ベースのやつに置き換える？
    * 手元では試しに実装してみたものがあるけどうまく動かない。ダメそうだったらあきらめる
Vue.js を IntelliJ から利用した際に、 `@` alias を解決してくれない対処

IntelliJ から Vue.js Plugin 利用して初期インストールした場合に、如何のようなファイルパスを解決してくれない。

```
import HelloWorld from '@/components/HelloWorld.vue'
```


# 環境

```
@vue/cli 3.0.0
```

# 対処方法
Preference -> Languages & Frameworks -> webpack -> webpack configuration file

```:旧
/Users/xxxx/project/webpack.config.js
```

↓

```:新
/Users/xxxx/project/node_modules/@vue/cli-service/webpack.config.js
```

# 参考
https://intellij-support.jetbrains.com/hc/en-us/community/posts/115000556284-vue-import-component-Module-is-not-installed-?page=2#community_comment_360000146344

Vuejs♡IntelliJ
scala-scraperのValidation

scalaのスクレイピングライブラリを触って見たメモです。
バリデーション周りを中心に動かしてみました。

基本的な使い方は下部の参考記事が詳しいです。

**scala-scraper**
https://github.com/ruippeixotog/scala-scraper#content-validation

```build.sbt
libraryDependencies += "net.ruippeixotog" %% "scala-scraper" % "2.1.0"
```

```scala:sample.scala
import net.ruippeixotog.scalascraper.browser._
import net.ruippeixotog.scalascraper.dsl.DSL._
import net.ruippeixotog.scalascraper.dsl.DSL.Extract._
import net.ruippeixotog.scalascraper.util.Validated._

object SampleApp {
  val content = """
        <!DOCTYPE html>
        <html lang="en">
        <head>
            <meta charset="utf-8">
            <title>Test page</title>
        </head>
        <body>
        <div id="wrapper">
            <div id="content">
                <section>
                    <h3>Section 1 h3</h3>
                    <p>Some text for testing</p>
                </section>

                <section>
                    <h3>Section 2 h3</h3>
                    <span>My Form</span>
                </section>
            </div>
        </div>
        </body>
        </html>"""

  def main(args: Array[String]): Unit = {
    val jsoupBrowser = JsoupBrowser()
    val doc = jsoupBrowser.parseString(content)

    // とりあえず普通に抽出
    println(doc >> text("div#content section h3"))
    // Section 1 h3
    
    // バリデーション
    println(doc >/~ validator(text("div#content section h3"))(_.nonEmpty))
    // Right(JsoupDocument(<!doctype html>......</html>)) 成功するとHTML全体

    println(doc >/~ validator(text("div#content section h3 not_exist"))(_.nonEmpty))
    // Left(()) 失敗の場合

    // バリデーションパターンを以下のようにもできる
    val succ = validator(text("title"))(_ == "AAAAAAAAAAAA") // 実際は "Test page" なので、errorsに
    val err = Seq(
      validator(text(".msg"), "Not logged in")(_.contains("sign in")),
      validator("#div content", "Empty contents")(_.isEmpty), // 該当するエラーのパターン
      validator(text("h1"),  "Internal Server Error")(_.contains("500"))
    )

    doc >/~ (succ, err) match {
      case VSuccess(content) => println(content)
      case VFailure(msg) => println(s"Error: $msg")
    }
    // Error: Empty contents
  }
}
```

# 参考 :pray: 

https://qiita.com/harry0000/items/0c4e37ebb71d102cf8b0
https://qiita.com/ara_ta3/items/8bf8c6ffec86884fb6cb
docker環境で upathの依存エラー

これで毎回つまづいていたので、私的メモ

```
upath@1.0.4: The engine "node" is incompatible with this module. Expected version ">=4 <=9".
```

下記手順で実行しないと、exit 1で強制終了してしまう。

本質的にlocal環境のyarn.lockが読み込まれて正常に起動しない。


```
$ rm -rf node_modules/
$ rm yarn.lock
$ yarn clean cache
$ rm package-lock.json
$ docker-compose up -d
```
いまさら聞けないサーバー構成図の書き方

# はじめに
- 自分の中の頭の整理に記載していきます。
- 図については基本的なLAMP環境を意識して記載しますので参考程度に。。

# サーバー構成図の書き方
- システムを構成するサーバー機器の構成を図示します。
- システム開発においては外部設計で作成されます。
- また、新規でサーバーを構築する場合には、この情報をもとに優先順位をつけ構築することになります。

## 必ず書くもの
### 識別情報（オブジェクトと識別子）

- １機器１オブジェクトとして表現する
- スケールする場合は別表などに機器名をまとめても良いが、初期構築の台数などは記載しておいたほうが良い

### 通信経路（関係線）

- in/outがわかるように矢印などを用いて記述する
- 通信プロトコルも併せて記述する

### 参考図：「必ず書くもの」だけで書いてみる
![img01.png](https://qiita-image-store.s3.amazonaws.com/0/210886/b063f6c7-e34d-a61a-096e-37be6b0c79ee.png)
(最低限だとちょっと物足りなさありますよね。。）

## できるだけ書くべきもの
### セグメント
本番環境や開発環境などでセグメントを分けている場合

### 外部サービス

- システムが外部サービスに依存している場合、どのようなアクセスをしているか記述

### 参考図：「できるだけ書くべきもの」も含めて書いてみる
![img002.png](https://qiita-image-store.s3.amazonaws.com/0/210886/bc94373b-f6b4-d377-6543-33bb38431621.png)
(まぁシンプルですが、必要な情報は書いてるかな？人によっては物足りなさが・・・？）

## 余裕があったり必要に応じて書くもの
### サーバーの役割
- WEBサーバー
- DBサーバー
- 踏み台サーバー など

### サーバースペック情報

- CPUスペック、個数
- メモリサイズ
- Disk容量（HDD,SSDなど）
- その他必要なスペック情報

### ソフトウェア情報

- OS情報
- ミドルウェア情報

### システム利用者情報

- どんな利用者がいて、どのような経路でアクセスするのか
- システム利用者、システム管理者、システム開発者など

### 参考図：さらに「余裕があったり必要に応じて書くもの」も含めて書いてみる
![img003.png](https://qiita-image-store.s3.amazonaws.com/0/210886/9c5c430d-3e1a-8627-758b-94ec76964e98.png)
（だんだんくどくなってきた。。）
 
## 場合によっては必要かもしれないが、基本的に書かなくても良いもの
### バージョン情報

- 場合によっては頻繁にバージョンアップするものもあるので、図の保守性を考えると別表で管理したほうが良い

### DBスキーマ情報

- １サーバーに複数スキーマが入っている場合は必要に応じて記載

# おわりに
ここまで書きましたが、サーバー構成情報は利用者間で記載情報やその粒度の認識を合わせておく必要がありますので、サーバー構築から運用までを意識して必要な情報を必要なだけ記載しておくのが良いと思います。
ちなみに今回の図は draw.io(https://www.draw.io/) で書きました。
作図は利便性と保守性の良いツールを使うのが良いですね。

Thankyou!
Google App Makerの使用準備


## プログラマーでなくとも、短期間でWebアプリケーション構築できる、ビジネスユースのアプリ作成環境

![スクリーンショット 2018-06-30 15.51.15.png](https://qiita-image-store.s3.amazonaws.com/0/1417/0cc8080c-b7bb-46ff-ce34-5a6ba7f63eac.png)

サイボウズのKintoneやMicrosoftのPowerAppsなどがある。Googleからこれに近い機能のプロダクトが一般公開された。この記事では、実際の利用までに至る、Google Cloud Platform上の設定項目をまとめている。

## G Suite Business エディションのアカウントを用意する

いきなり契約しなくとも14日間の無料試用ができる
- https://gsuite.google.co.jp/intl/ja/products/app-maker/
- https://gsuite.google.com/signup/business/welcome

## App Makerが使用できるアカウントを利用する

もしくは、使用しようとしているアカウントがApp Maker使用権が付与されているかどうかを、Google管理コンソールで確認するする。

Google管理コンソール > [アプリ] > [その他の Google サービス] > [App Maker] 
https://admin.google.com/AdminHome?hl=ja&pli=1&fral=1#AppDetails:service=App+Maker

## Cloud SQL インスタンスを作成する
必要なSQLデータベースは以下の通り。

- MySQL（データベース エンジン）
- 第 2 世代（インスタンスの種類）
- us-central（リージョン）

## 役割を追加する

 [IAMと管理]にて、利用プロジェクトを選択後、以下の役割を追加する。
 
### 追加する役割 一つ目
- appmaker-maestro@appspot.gserviceaccount.com

#### 付与する役割
- Cloud SQL > Cloud SQL 管理者
- Cloud SQL > Cloud SQL クライアント

### 追加する役割 二つ目

- ドメイン名（私の場合は notation.co.jp ）

#### 付与する役割
- Cloud SQL > Cloud SQL クライアント


## App Makerのデータベース設定欄にSQLインスタンス名を設定する

### SQLインスタンスを確認する
- https://console.cloud.google.com/sql/instances

### App Makerの設定へ反映させる
- https://admin.google.com/AdminHome?hl=ja&pli=1&fral=1#AppDetails:service=App+Maker

## 準備完了！ App Makerを開く
リダイレクトされてしまう場合には、使用アカウント以外のGoogleアカウントを、そのブラウザ上でログアウトすると、リダイレクトされなくなる。

- https://appmaker.google.com/
JavaScriptのbindのメモ


```javascript
class Person {
  constructor(name) {
    this.name = name;
  }
  greet() {
    console.log(this.name + "さん");
  }
}

person = new Person('Joji');
person.greet();
//Jojiさん


let person2 = person.greet;
person2()
//Uncaught TypeError: Cannot read property 'name' of undefined

let person3 = person.greet.bind(person);
person3()
//Jojiさん
```

bind()の第1引数をthis値にバインドしてくれる。
定義済みUIColorを単純にStringで取り扱うため定義したenumのメモ

## はじめに
コピペ用のメモ書き。

## 動作環境

Xcode 9.4.1
Swift　4.1

## ソースコード

```swift:DefaultUIColor.swift

public enum DefaultUIColor: String {
    case black
    case darkGray
    case lightGray
    case white
    case gray
    case red
    case green
    case blue
    case cyan
    case yellow
    case magenta
    case orange
    case purple
    case brown
    case clear
    
    public func getUIColor() -> UIColor {
        switch self {
            case .black: return UIColor.black
            case .darkGray:  return UIColor.darkGray
            case .lightGray: return UIColor.lightGray
            case .white: return UIColor.white
            case .gray: return UIColor.gray
            case .red: return UIColor.red
            case .green: return UIColor.green
            case .blue: return UIColor.blue
            case .cyan: return UIColor.cyan
            case .yellow: return UIColor.yellow
            case .magenta: return UIColor.magenta
            case .orange: return UIColor.orange
            case .purple: return UIColor.purple
            case .brown: return UIColor.brown
            case .clear: return UIColor.clear
        }
    }
}
```
Chromeパフォーマンス計測ツールの参考URL

いいサイトがあったら随時更新

* [
Timeline ツールの使い方](https://developers.google.com/web/tools/chrome-devtools/evaluate-performance/timeline-tool?hl=ja)
* [Chrome DevToolsでパフォーマンス計測](https://app.codegrid.net/entry/2016-dev-tools-1)
* [Chrome デベロッパーツールに表示される Priority と HTTP/2](https://asnokaze.hatenablog.com/entry/20151205/1449245683)
macOS/homebrewのffmpegでlibopus有効化

```bash
# libopus有効化ffmpeg
$ brew install opus
$ brew install ffmpeg --with-opus

$ ffmpeg -codecs | grep opus
 DEA.L. opus                 Opus (Opus Interactive Audio Codec) (decoders: opus libopus ) (encoders: opus libopus )
```

```bash:
# 通常のinstall ffmpeg
$ ffmpeg -codecs | grep opus
 DEA.L. opus                 Opus (Opus Interactive Audio Codec)
```


実行環境：

- ffmpeg 4.0.1
- libopus 1.2.1
- macOS 10.12.6
ParallelsのWindows10が終了しようとすると勝手に再起動する

#現象

タイトルの通り

#解決方法
Windowsの電源設定で「高速スタートアップを有効にする」のチェックを外す


#参考
https://god-support.blogspot.com/2018/06/parallels-windows10-1803-windows.html
VSCodeの[cmd+T]が効かないときの対処

# はじめに
VSCodeにはシンボルを検索して移動する機能がある．
関数の上にカーソルが置いてある状態で[cmd+T]を押すとその関数の定義元に飛べて便利なのだが，ある時この機能が動作しないことがあった．ちなみに，この記事はPythonの拡張機能，OSXの場合での対処である．

# 環境
macOS: Sierra Version 10.12.6
VS Code: Version 1.24.1
Python Extension: Version 2018.6.0

# エラー内容
[cmd+T]を押したときに次のようなエラーを吐いていた．

```
----------Generating Tags----------
ctags --options=~/.vscode/extensions/ms-python.python-2018.6.0/resources/ctagOptions --languages=Python --exclude=**/site-packages/** -o ~/.vscode/tags .
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ctags: illegal option -- -
usage: ctags [-BFadtuwvx] [-f tagsfile] file ...
```

どうやらctagsの使い方が間違っているようだ．

# 解決策
調べてたらGitHubに[これに関するissue](https://github.com/Microsoft/vscode-python/issues/2027)を見つけた．これによるとctagsを自前でインストールする必要があるらしい．  

回答に書いてあったようにbrewを使ってインストールしてみる．

```
$ brew install ctags
```
これで無事にシンボルへの移動ができるようになった．
Multidex使用時にNoClassDefFoundErrorが出た時に…


Multidexを有効化している時に`NoClassDefFoundError` が出てきてハマったのでメモ。
何かの参考になれば幸いです。

# 結論：multiDexKeepFile or multiDexKeepProguardを使ってみよう
公式のドキュメントに詳しく書いてありました（が、完全に見落としていました）。

*プライマリ DEX ファイルで必要なクラスの宣言*
https://developer.android.com/studio/build/multidex#keep


> Multidex アプリ用に各 DEX ファイルを作成するときに、ビルドツールでは複雑な判断基準に基づいて、アプリを正常に起動するためにプライマリ DEX ファイルで必要となるクラスを決定します。起動時に必要ないずれかのクラスがプライマリ DEX ファイルで提供されていない場合、アプリはエラー *java.lang.NoClassDefFoundError* でクラッシュします。

まんま書いてありました。
プライマリDEXファイルで必要となるクラスを宣言しとかないといけないということですね。

`multiDexKeepFile` と `multiDexKeepProguard` は同じようなことをしていますが、 

- `multiDexKeepFile` => ファイルで指定可能
- `multiDexKeepProguard` => ProGuardの文法で指定可能

という違いがあるようです。  
  
  
  
`NoClassDefFoundError` で困っている方は、是非一度 ***multiDexKeepFile*** or ***multiDexKeepProguard*** を試してみるといいかもしれません。