OmniAICreator/Qiita-1.07M huggingface dataset:
new relic で 一定期間が経過したレコードを削除する

# new relic で "server not responding" になったあと、一定期間が経過したレコードを削除する

AWS EC2 で、インスタンスが Auto Scaling でterminateされた後も new relic 側でレコードが残り続けるので、Lambdaを使って定期的に削除するようにしました。

- Lambda のランタイムは Node.js 6.10 を使用
- 3秒以上かかるとtimeoutしてしまうので、timeoutの設定を10秒に増やしている

# code
- やっていることは、`npm install moment request` をして、curl的な処理をしているだけ
- Lambdaにアップロードするzipには、メインのjsファイルと node_modules ディレクトリを格納
- トリガは CloudWatch events に、週1で実行するルール追加（毎日とかでも良いかも）

## index.js

```js

var request = require('request');
var moment = require('moment');

var expireDays = process.env.expireDays || 7;
var apiKey = '【new relic で発行されたAPI KEY】';
var options = {
    url: 'https://api.newrelic.com/v2/servers.json',
    headers: {
        'X-Api-Key': apiKey
    }
};
var options_del = {
    url: 'https://api.newrelic.com/v2/servers/%s.json', // 実行時に上書き
    method: 'DELETE',
    headers: {
        'X-Api-Key': apiKey
    }
};

var now = moment();

function callback(error, response, body) {
    if (!error && response.statusCode == 200) {
        var info = JSON.parse(body);
        info.servers.forEach(function(item, index, arr) {
             if (item.reporting == false) {
                var m = moment(item.last_reported_at);
                if (now.diff(m, 'days') >= expireDays) {
                    // send DETETE request
                    console.log('*** deleting not reporting server from newrelic ***')
                    console.log(item);
                    options_del['url'] = 'https://api.newrelic.com/v2/servers/' + item.id + '.json';
                    // console.log(options_del);
                    request(options_del, callback_del);
                }
             }
        });
    } else {
        console.log('*** execute FAILED ***');
        console.log(body);
    }
}

function callback_del(error, response, body) {
    if (!error && response.statusCode == 200) {
        var info = JSON.parse(body);
        // console.log(info);
        var id = info.server.id;
        console.log('*** execute DELETE SUCCEEDED:' + id + ' ***');
    } else {
        console.log('*** execute DELETE FAILED ***');
        console.log(body);
    }
}

exports.handler = (event, context, _callback) => {
    console.log('*** start: deleting not reporting server from newrelic  more than '+ expireDays + ' days ago ***');
    request(options, callback);
    _callback(null, 'all done: delete records more than '+ expireDays + ' days ago.');
};
```

## 対象の日数は環境変数で変えられる
`process.env.*` で環境変数を参照できるので、これを使って。
expireDays で指定できる(指定なしの場合は7日で処理)ように。
あんまり変える需要はないかもですが

![スクリーンショット 2017-04-28 17.27.27.png](https://qiita-image-store.s3.amazonaws.com/0/6191/0abce449-fc7d-b338-6b19-5c14a8905377.png)

# see also

[Feature Idea: Auto Delete Non\-Reporting Servers \- Feature Ideas / Feature Ideas: APM/UI \- New Relic Online Technical Community](https://discuss.newrelic.com/t/feature-idea-auto-delete-non-reporting-servers/41533/6)

最初はこのワンライナーを、気がついたときに手動で行ってました。
【Python Kivy】ドラッグ＆ドロップでファイルパス取得方法

#ファイルをドラッグしてパスを取得する方法

```FileDrop.py
from kivy.app import 
from kivy.core.window import Window

class FileDropApp(App):
    def build(self):
        Window.bind(on_dropfile == self._on_file_drop)
        return

    #自分で定義するイベント処理メソッド
    def _on_file_drop(self, window, file_path):
        print(file_path)
            return

if __name__ == '__main__':
    FileDropApp().run()
```
これを利用して、ウィンドウを作成verを以下のように作った。ウィンドウ自体に、ファイルパス取得の機能をつけることになるのかなぁ、、、初心者感丸出し笑

```MyApp.py
from kivy.app import App
from kivy.core.window import Window
from kivy.uix.widget import Widget
from kivy.graphics import Rectangle

class Field(Widget):
    def __init__(self):
        super(Field, self).__init__()
        self.canvas.add(Rectangle(
            source="background.jpg", size = (1024,768)))

    #ドロップオブジェクト？をプロパティとして保存
        self._file = Window.bind(on_dropfile=self._on_file_drop)

    #自分で定義する処理メソッド
    def _on_file_drop(self, window, file_path):
        print(file_path)
        return

class MyApp(App):
    def build(self):
        return Field()

if __name__ == '__main__':
    MyApp().run()
```
目標はドロップして、CSVファイルを読み込んでRにデータを流すこと、、、
容量の大きいリポジトリを必要最低限の情報だけ clone する方法

# はじめに
git リポジトリは歴史を重ねるごとに、だんだんと容量がおおきくなっていしまい、しまいにはギガ単位になってしまう事ってありますよね。
自分も、とあるリポジトリを clone したら、なんとgitの容量が数十ギガに達していて、PCのローカルストレージが圧迫されてしまう問題にあってしまったので、その時の対応方法を備忘録として残しておきます。

#容量を調べる
どれくらいの容量なのか調べるには du コマンドを使います。

```bash
$ du -sh .git
55.8G	.git
```

55Gもあります。
泣けてきます。
ダウンロードにも1時間くらいかかります...

#解決方法
今回行った解決方法としては、下記のような対策をとりました。

* 直近の歴史だけを取得する
* 必要なブランチを1つだけを取得する

## 直近の歴史だけを取得する depth オプション
今回は特に修正歴史は必要ないと判断した為、直近の修正記録だけを取得するようにして、容量削減を行いました。
depth オプションはリポジトリを clone や fetch する際に、取得する履歴の数を指定できます。
下記のように指定した場合は、最新の履歴のみを取得します。

```bash
$ git clone {URL} --depth 1
```

## 指定したブランチだけダウンロード single-branch オプション
ブランチの管理がおざなりになっていた事もあり、相当な数のブランチが存在していました。
余計なブランチは邪魔なだけなので、必要なブランチだけダウンロードします。
下記のように指定する事で master ブランチだけをダウンロードします。

```bash
$ git clone -b master --single-branch {URL}
```

#まとめ
上記の depth と single-branch を指定して clone します。

```bash
git clone -b master --single-branch {URL} --depth 1
```

すると 先ほどまで1時間程かかっていたダウンロードが一瞬で終わります。
容量を確認すると...

```bash
$ du -sh .git
 42M	.git
```

42M !
劇的に軽減されていますw

これで、PCのストレージを圧迫される事なく、ソースコードを取得する事ができました。
今回の用に、歴史情報が必要無い場合や必要なブランチを絞れる場合にはかなり有効ですね。
Node.jsで順次処理

#はじめに
Node.jsを使ってリスト順にファイル処理などを実装したかった
しかしNode.jsはnon-blocking処理を行うため，実装の仕方によっては意図しない順序で処理が実行される恐れがある．
なので明示的に順次処理を記述してやる必要がある．
今回はnpmのパッケージの一つである[async](https://www.npmjs.com/package/async)を使った順次処理を実装した  
__なお，掲載しているスクリプトはCoffeeScriptからJSにツールによって変換されたものです，完全な動作保証は行いません__

###実行環境
* Node.js v0.12.2

#非同期処理の落とし穴
私は非同期処理でファイル処理を実装しようとして落とし穴にハマりました．
ファイル初期化よりファイル書き込みが先行してしまったり，ファイル読み込み前にファイル書き込みが走ってしまったり…
詳しくは↓ブログにて，非同期処理と格闘している方が居ましたのでそちらを参照されたし．
[非同期よ、決着をつけようじゃないか！(rororo1989のブログ)](http://hkanai.hatenablog.com/entry/2015/06/15/010804)

参考文献にも載せますが，色々な方が同期処理の実装を書いていらっしゃいます．
私はasyncを使って，わかりやすくお手軽な実装が出来ないかと模索して，その結果を載せようと思い，記事にしました．

#async.serise() + setTimeout()
```
async.series([
  function(callback) {
    console.log('proc1');
    //処理1
    //…
    setTimeout(callback, 1000);
  }, function(callback) {
    console.log('proc2');
    //処理2
    //…
    setTimeout(callback, 1000);
  }, function(callback) {
    return console.log('処理終了');
  }
], function(err, results) {
  if (err) {
    return console.log('err[' + err + ']');
  }
});
```
処理の流れとしては
* 処理1を実行
* コールバックを1000ms後に呼び出し→次の処理が呼び出される
* 処理2を実行
* コールバックを1000ms後に呼び出し→次の処理が呼び出される

という形です．これで簡単な順次処理は簡潔に記述できます．
ただし，処理する対象の数だけ関数を記述必要があります．
ファイルリストを渡して順番に処理するといったことはこの形では不可能です．

#asyncforEach() + setTimeOut()
```
var list = ['1', '2', '3', '4', '5', '6', '7', '8', '9'];

async.forEachSeries(list, (function(item, callback) {
  console.log(item);
  //繰り返し処理
  //…
  setTimeout(callback, 1000);
}), function(err) {
  if (err) {
    throw err;
  }
  //処理終了
  return console.log("end");
});

```
処理の流れとしては

* リストからitemを一つ選択
* 処理実行
* setTimeoutで1000ms後に処理呼び出し
* すべてのitem実行後終了

というような感じ．これでfor文も同期処理に実行されるようになる．

#疑問
上記処理だと，setTimeOutによって処理を制御している．なのでsetTimeOutの秒数で処理が実行される．処理の終了時間が判明すれば，処理を続けざまに行うことで完全な順次実行ができる．おそらくPromiseあたりを使えば実装できそう？asyncの中にまたasyncを入れて，中のasyncの最後にcallback呼び出しすれば大丈夫？

#参考文献
* [非同期よ、決着をつけようじゃないか！(rororo1989のブログ)](http://hkanai.hatenablog.com/entry/2015/06/15/010804)
* [JavaScriptのasync.jsでwaterfallとseries、parallelの違い(Qiita)](http://qiita.com/takeharu/items/84ffbee23b8edcbb2e21)
* [async.js の使い方](http://bonk.red/articles/JS/async/async.js.html)
[Ubuntu]Latexでフォントを埋め込む

# はじめに
探せば色々あるんですが、自分用のメモも兼ねて。
フォントをきちんと埋め込むことによって括弧が左にずれたり、環境によっては明朝体がゴシック体になるなどのトラブルが避けられます。
# 実行環境
Ubuntu 16.04
e-pTeX 3.14159265-p3.6-141210-2.6 (utf8.euc) (TeX Live 2015/Debian)

# やり方
たとえば、Takaoフォントを埋め込みたい時。
terminalで

```Bash
$cd /usr/share/fonts/truetype
$ls
```

すると、

```
abyssinica       font-awesome               lato           solomos
adf              fonts-guru-extra           liberation     takao-gothic
ancient-scripts  fonts-japanese-gothic.ttf  lohit-punjabi  takao-mincho
artemisia        fonts-japanese-mincho.ttf  lyx            tibetan-machine
```

たくさんフォントが出てくるので

```Bash
$cd takao-mincho
$ls
```

からTrueTypeフォントファイルを確認。

```
TakaoExMincho.ttf  TakaoMincho.ttf  TakaoPMincho.ttf
```
同様にしてゴシックフォントのファイル名も確認したら、texファイルと同じ場所に以下のようなmapファイル(takao.map)を作成し

```
rml   H  :0:TakaoMincho.ttf
rmlv  V  :0:TakaoMincho.ttf
gbm   H  :0:TakaoGothic.ttf
gbmv  V  :0:TakaoGothic.ttf
```
dvipdfmxの引数に指定してやれば良い。

```
dvipdfmx -f takao.map sample.dvi
```

Takao明朝を例に書きましたが、今回の流れは自分でインストールしたフォント(Notoフォント）とかでも変わらないはずなんで、参考になれば幸いです。
Atomでgitを使う

Atomで書いたものをGitで管理するにあたり色々設定してみためも。

#git-plus
コマンドパレット **（Command+Shift+H）** からgitのコマンドを呼び出し、実行できる。  
  
1. パッケージをインストール  
![スクリーンショット 2017-04-28 11.43.13.png](https://qiita-image-store.s3.amazonaws.com/0/169137/d89aa22b-c404-29c3-8485-23244c34f5b1.png)
2. プロジェクトの登録（すでに.gitで設定済みのときは不要）  
 1. 管理したいプロジェクトを開く
 2. .gitディレクトリを作成
 3. コマンドマレットでAdd All
3. gitの操作をする  
プロジェクトディレクトリの右クリック->Git
からもできるし、
コマンドパレットで操作も可能。  
＜マウス操作＞
![スクリーンショット 2017-04-28 11.47.05.png](https://qiita-image-store.s3.amazonaws.com/0/169137/d301b0af-0838-74f3-8686-7a1473ba3531.png)  
＜コマンドパレット＞Command+Shift+H
![スクリーンショット 2017-04-28 11.52.33.png](https://qiita-image-store.s3.amazonaws.com/0/169137/67822d06-fa4e-4ac4-602f-a02008b48e1a.png)

#merge-conflict
コンフリクトの修正を手助けしてくれるツール。



#git-log
git logをグラフィカルに見れる。
**Cmd+Shift+P**でコマンドパレットを開き、`Git Log:Show`で見れる。
設定で、font sizeを0.8くらいにしておいた方がみやすくなると思います。
見れる内容は以下の通り。
- graph
- discription
- commit IDの一部
- date
- author

#git-project
Atom起動時にgitリポジトリからプロジェクトを読み込む。
**Ctrl+Shift+Option+o**
でパレットが表示されるので、プロジェクトを選択する。
デフォルトの設定で読み込むリポジトリの場所が`/Users/ユーザ名/repos`になっているので別の場所にリポジトリをおいている時はRoot pathsの変更が必要。
<img width="458" alt="スクリーンショット 2017-04-28 16.53.24.png" src="https://qiita-image-store.s3.amazonaws.com/0/169137/c46ae17e-c92e-26d2-fffa-b0a5dcc98d60.png">
【知識不要】3分でローカルに構築できるmastodon

# 3分で作る mastodon

mastodon サーバの構築に挫折したけど使ってみたい人向け。
Docker や Ruby(rails), SMTP の知識もいりません。
ローカルホストだけではなく同じネットワーク環境内から参照できます。
グループ内で遊んでみるのに最適です。
https://github.com/algas/mastodon-local

## 必要なもの

- macOS (たぶん Linux でも OK、Windows は動くかもしれないけどテストしてない)
- Docker

## セットアップ

ローカル環境で Docker が動いているものとします。

1. リポジトリからコードを取ってきます。  
`git clone https://github.com/algas/mastodon-local.git`
2. セットアップスクリプトを実行します。  
`cd mastodon-local && ./setup.sh`
3. サーバを起動します。  
`./run.sh`

以上で完了です。

## 初期登録(mastodon)

1. ブラウザで以下にアクセスします。  
`http://localhost:3000/about`
2. ユーザ名、メールアドレス、パスワードを入力し、「参加する」をクリックします。
3. ブラウザで以下にアクセスします。  
`http://localhost:1080`
4. 届いたメールを開き、「メールアドレスの確認」リンクを踏みます。
5. ブラウザで以下にアクセスします。  
`http://localhost:3000/auth/sign_in`
6. 登録時に使ったメールアドレスとパスワードを入力します。
7. ようこそ mastodon へ！

## サーバの起動と停止

- サーバ停止  
`./stop.sh`  
- サーバ起動  
`./run.sh` 

## 注意点

- 公開環境では使わないでください。セキュリティ的に残念な状態です。
- 他の mastodon インスタンスとつなぐ想定はしていません。
- メール(SMTP)サーバとして mailcatcher というスタブを使っています。外部にはメール送信されません。当然メール通知も使えません。
DockerCompose上のRailsでMySQLの起動を待ってdb:migrateする

## 問題
DockerComposeでRails+MySQLを立ち上げてて、Railsコンテナの起動時にdb:migrateする時に`Can't connect MySQL`のエラーが出る

## 解決方法
MySQLのコンテナは起動してもMySQLの起動に時間がかかっていることが原因だったもよう。

ということでMySQLの起動を待ってmigrate, 起動するように変更すればOK。

```diff:docker-compose.yml
  version: '2'
  services:
    db:
      restart: always
      image: mysql
      ports:
        - "3306:3306"

    web:
      build: .
-     command: bundle exec rails s -p 3000 -b 0.0.0.0
+     command: [bin/entry]
      volumes:
        - .:/app
      ports:
        - "3000:3000"
      links:
        - db
```

```bash:bin/entry
#!/bin/bash
set -e

until mysqladmin ping -h db -P 3306 --silent; do
  echo "waiting for mysql..."
  sleep 1s
done
echo "success to connect mysql"
bundle exec rake db:migrate
bundle exec rake db:seed
bundle exec rails s -p 3000 -b 0.0.0.0

exec "$@"
```

これでOK

これだけのことに半日ほどハマってしまった('A`)
Swift3 でUITextViewのkeyboardを閉じる方法

# 環境

Xcode8
Swift3

# 必要な手順

```

↓

ストーリーボードでデリゲートを設定する

↓

classにUITextViewDelegateを継承する

↓

delegate = selfをviewDidLoadの中に設定する

```

# 実装

### Step1

と継承しないと全然動きません

```swift
class ContactUsViewController: UIViewController, UITextViewDelegate {
```

### Step2

おきまりのデリゲート

```
あなたのテキストフィールド.delegate = self

```

### Step3

リターンがされた時の処理を書く

```swift

    // hides text views
    func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {
        
        print("反応してる？")
        if (text == "\n") {
            //あなたのテキストフィールド
            bodyTextView.resignFirstResponder()
            return false
        }
        return true
    }

```

# 参考

[dismiss keyboard with a uiTextView](http://stackoverflow.com/questions/26600359/dismiss-keyboard-with-a-uitextview)

[Swift3 でUITextViewのkeyboardを閉じる方法](http://off.tokyo/blog/2017/04/28/how-to-end-keybord-swift3/)
Gitの「unpack-objects failed」エラーを徹底的に解消する方法

もしデカイファイルがあった場合、 `git pull` また `git clone` はエラーになる場合もあります：

```
remote: Counting objects: 80, done.
remote: Compressing objects: 100% (79/79), done.
Connection to bitbucket.org closed by remote host.
fatal: The remote end hung up unexpectedly
fatal: early EOF
fatal: unpack-objects failed
```

Gitの設定ファイル `~/.gitconfig ` に下記のものに追加すれば問題が解消しました。

```
[core]
	packedGitLimit = 512m
	packedGitWindowSize = 512m
[pack]
	deltaCacheSize = 2047m
	packSizeLimit = 2047m
	windowMemory = 2047m
```
ちなみに私の場合にGitレポジトリーに３５Mのファイルがありました。
redashでpythonデータソースを使い生SQLを実行して結果を表示する

要点だけ書いとく。

dockerpull で redash のイメージをローカルに落として起動しておく。

```
docker pull redash/redash
```

その後、docker-compose.yml を作成しておいて(python使えるようにREDASH_ADDITIONAL_QUERY_RUNNERS設定してる)

```
version: '2'
services:
  server:
    image: redash/redash:latest
    command: server
    depends_on:
      - postgres
      - redis
    ports:
      - "5000:5000"
    environment:
      PYTHONUNBUFFERED: 0
      REDASH_LOG_LEVEL: "INFO"
      REDASH_REDIS_URL: "redis://redis:6379/0"
      REDASH_DATABASE_URL: "postgresql://postgres@postgres/postgres"
      REDASH_COOKIE_SECRET: veryverysecret
      REDASH_ADDITIONAL_QUERY_RUNNERS: "redash.query_runner.python"
  worker:
    image: redash/redash:latest
    command: scheduler
    environment:
      PYTHONUNBUFFERED: 0
      REDASH_LOG_LEVEL: "INFO"
      REDASH_REDIS_URL: "redis://redis:6379/0"
      REDASH_DATABASE_URL: "postgresql://postgres@postgres/postgres"
      REDASH_ADDITIONAL_QUERY_RUNNERS: "redash.query_runner.python"
      QUEUES: "queries,scheduled_queries,celery"
      WORKERS_COUNT: 2
  redis:
    image: redis:3.0-alpine
  postgres:
    image: postgres:9.5.6-alpine
    volumes:
      - /opt/postgres-data:/var/lib/postgresql/data
  nginx:
    image: redash/nginx:latest
    ports:
      - "80:80"
    depends_on:
      - server
    links:
      - server:redash
```

docker-compose upする

```
docker-compose up
```

その後、redashにログインしてpostgresのデータソースで以下を設定

![スクリーンショット 2017-04-28 午後4.24.51.jpg](https://qiita-image-store.s3.amazonaws.com/0/38387/570c81d4-cc38-312f-aa2d-289bdf6b4acd.jpeg)

pythonのデータソースの設定の仕方は以下。
Modules to import prior to running the scriptは、importするものがあればカンマ区切りで書き込んでおく。

![スクリーンショット 2017-04-28 午後4.29.06.jpg](https://qiita-image-store.s3.amazonaws.com/0/38387/9ce21521-c960-da2b-e66e-65bdede6d661.jpeg)

そして、datasourceにpythonえらんで、query作成で以下を入力

```
query='\
select \
    count(*) AS count \
from queries \
'

values = execute_query('postgres', query)['rows']

add_result_row(result, {'name': 'result', 'count': values[0]['count']})

add_result_column(result, 'name', '', 'date')
add_result_column(result, 'count', '', 'date')
```

Execute押すと結果出力できる。

![スクリーンショット 2017-04-28 午後4.30.08.jpg](https://qiita-image-store.s3.amazonaws.com/0/38387/59f62999-ec3a-0ca9-9d78-1df2c9177c31.jpeg)

google spreadsheetやらDB、GAなどを結合していろんなレポートだせるな。いける、いけるぞこれは。
【メモ】UnityEventのUnityActionを抽出する

#この記事について
UnityEvent型を用意すると Buttonコンポーネントのようにインスペクターでメソッドを指定する事が出来るようになります。
この記事は、UnityEventに指定されたUnityAction（この中にメソッドがある？）を抽出するやり方のメモ書きです。
ものすごく調べた経緯があるのでメモ書きを残す事に致しました。

#この記事の内容の実用性
尚実際に使うケースはコンポーネントを作る時などになるのかと思います。

しかし、今回の記事では最小のコードに絞っているので
そのままでは 目的を果たすだけ つまり実用性はありません。
その点は何卒ご了承ください。

以下サンプルです。

#最小限のサンプル
以下はメソッドが格納されているクラス

```C#:Sample.cs
//<Summary>
//このSampleのメソッドをGetActionのUnityEventに指定する
//</Summary>

    public void TestA()
    {
        Debug.logger.Log("TestA");
    }

    public void TestB()
    {
        Debug.logger.Log("TestB");
    }
```

GameObjectにこのGetActionをAdd
Unity Eventに 上記のSampleクラスのメソッドを指定する

```C#:GetAction.cs
    public UnityEvent SetUnityEvent;/*< UnityEvent*/
    private List<Action> m_getActionList = new List<Action>();/* <取得したActionの格納先*/


    void Start()
    {

        int count = SetUnityEvent.GetPersistentEventCount();

        for (int i = 0; i < count; ++i)
        {
            //CreateDelegateでUnityActionを作っている
            Action action = (Action)System.Delegate.CreateDelegate(typeof(Action), SetUnityEvent.GetPersistentTarget(i), SetUnityEvent.GetPersistentMethodName(i));
            m_getActionList.Add(action);
            Debug.logger.Log("m_getActionList:" + m_getActionList[i].Method);

        }
    }
```
中身はLogで確認
LaravelのSSL付き環境の構築 (Docker + nginx-proxy + Let’s Encrypt)

必要なもの
・docker, docker-composeが使えるサーバー環境
・ドメイン

流れ
プロキシコンテナの作成　→　Laravel環境コンテナの作成 → プロキシコンテナが認識してSSLで通信が可能に

# プロキシコンテナの作成
参考：https://hackerslog.net/post/labs/docker-letsencrypt-on-docker-and-nginx/
詳細は参考先のurlを見てください。
nginx-proxyとLet's Encryptを利用したコンテナを生成します。

以下のdocker-comppose.ymlを作成する。

```yaml:docker-compose.yml
nginx-proxy:
  image: jwilder/nginx-proxy
  privileged: true
  ports:
    - 80:80
    - 443:443
  volumes:
    - ./docker-compose.d/certs:/etc/nginx/certs:ro
    - ./docker-compose.d/htpasswd:/etc/nginx/htpasswd
    - /etc/nginx/vhost.d
    - /usr/share/nginx/html
    - /var/run/docker.sock:/tmp/docker.sock:ro

letsencrypt-nginx-proxy-companion:
  image: jrcs/letsencrypt-nginx-proxy-companion
  privileged: true
  volumes:
    - ./docker-compose.d/certs:/etc/nginx/certs:rw
    - /var/run/docker.sock:/var/run/docker.sock:ro
  volumes_from:
    - nginx-proxy
```

そして次のコマンドで実行

```bash
$ docker-compose up -d
```

プロキシコンテナはこれにて完了です。

Laravel環境のコンテナを作成する際に、
任意のドメインのリクエストを自分のコンテナに来るように
コンテナの環境変数に設定することで通信できるようになります。
それではLaravel環境コンテナの作成を以下に述べます。

# Laravle環境のコンテナを作成（webコンテナ + mysqlコンテナ）
参考：http://qiita.com/kukimo/items/c044ad42fffac062e2f5

以下のdocker-compose.ymlを作成する。

```yaml:docker-compose.yml
web:
  build: php
  ports:
    - "80"
  environment:
    VIRTUAL_HOST: example.com
    LETSENCRYPT_HOST: example.com
    LETSENCRYPT_EMAIL: example@example.com
  volumes:
    - ./project:/var/www/html
  links:
    - mysql:mysql
mysql:
  image: mysql:5.7
  environment:
    MYSQL_ROOT_PASSWORD: password
    MYSQL_DATABASE: db_name
  volumes:
    - ./mysql:/var/lib/mysql

```

buildで指定しているフォルダには以下の3つのファイル（Dockerfile, php.ini, 000-default.conf)

```Dockerfile:Dockerfile
FROM php:7-apache
COPY php.ini /usr/local/etc/php/
RUN apt-get update \
  && apt-get install -y libfreetype6-dev libjpeg62-turbo-dev libpng12-dev libmcrypt-dev \
  && docker-php-ext-install pdo_mysql mysqli mbstring gd iconv mcrypt && \

  apt-get install -y zip unzip && \

  apt-get install -y vim && \  

  curl -sS https://getcomposer.org/installer | php && \
  mv composer.phar /usr/local/bin/composer

COPY ./000-default.conf /etc/apache2/sites-available/000-default.conf
RUN a2enmod rewrite
```

```ini:php.ini
[Date]
date.timezone = "Asia/Tokyo"
[mbstring]
mbstring.internal_encoding = "UTF-8"
mbstring.language = "Japanese"
```

```apache:000-default.conf
<VirtualHost *:80>
        ServerAdmin webmaster@localhost
        DocumentRoot /var/www/html/public

        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
```

基本的に参考と同じですが、
今回はnginx-proxyを使っているので
docker-compose.yml内でport80は開くだけ、
また、nginx-proxyとLet's Encryptにドメインを指定するために
以下の環境変数が追加されています。

```
    VIRTUAL_HOST: example.com
    LETSENCRYPT_HOST: example.com
    LETSENCRYPT_EMAIL: example@example.com
```

また、バージョンの影響かapacheのドキュメントルートの指定方法が変わっていたので、
000-default.confを上書きするように変更しています。

またLaravelプロジェクト内でデフォルトで入っているpublic/.htaccessのrewriteを使えるように
Dockerfile内で以下の命令を追加しています。

```
RUN a2enmod rewrite
```

あとはwebコンテナに入って/var/www/htmlにLaravel公式のインストールを行い(ディリクトリ権限、.envやmigration）
指定したドメインにアクセスすることでSSLで通信できるようになっています。
C++ Builder XE4, 10.2 Tokyo > Testing > UIあり / UIなし のテスト用コードの共通実装

```txt:動作環境
C++ Builder XE4
RAD Studio 10.2 Tokyo Update 2 (追記: 2017/12/28)
```

### 検討

`Application->ProcessMessage()`などのように特殊なファイルのインクルードが必要なコードを含むとする。

クラスファイルでその実装を書くとき、以下の両方で実行できるようにしたいかもしれない。

- UIを使う場合
- UIを使わない場合


UIを使うかどうかは`#ifdef VCL_H`で判断するのはどうだろうか。

```Unit1.cpp
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
	: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
#ifdef VCL_H
	ShowMessage(L"in VCL");
#endif
}
//---------------------------------------------------------------------------
```

### 利用形態

クラスファイル(テスト用)にテストの実装を書く。`#ifdef VCL_H`でUIを使う場合の希望動作を含めて実装する。

UIありのテストを行いたい場合、ユニットファイルを生成し、テスト実装コードをコピペする。こちらの場合、ユニットファイルが`#include <vcl.h>`の行を持つ。

UIなしのテストを行いたい場合、実装関数をコールする。

### ifdefのprosとcons

pros(賛成)とcons(反対)

ifdefを付ける問題点はGrenningのTest Driven Developmentの記載や、Qiitaの記事での指摘などもある。

分岐が増えていき、気づいたらビルドできない部分が発生する点が問題。

上記のような使い方をビルドエラーとならずにifdefなしで行う方法を今は知らない。
API / Framework / Libraryの違いは何？

タイトル通りAPI,Framework,APIと僕的には似たような言葉がたくさん出てきていて、
何がどう違うので分からなかったので調べました。
間違っていたらコメントいただけると嬉しいです。

#API
Application Program Interfaceの略

- オペレーティングシステムやプログラム言語で用意されたライブラリなどの機能の入り口となるもの。
- プログラミングの際に使用できる命令や規約、関数等の集合のことを指す。

参考サイト
[ITトレンド](http://it-trend.jp/words/api)
[wiki](https://ja.wikipedia.org/wiki/%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E3%82%A4%E3%83%B3%E3%82%BF%E3%83%95%E3%82%A7%E3%83%BC%E3%82%B9)

#Framework
- プログラムの雛形
- 何かの枠組み
- 汎用的な機能や基本的な制御構造をまとめた半完成品
- そのまま利用できるソフトウェアの主要部分の雛形と、汎用的で再利用可能なクラスやライブラリ、モジュール、APIなどで構成され、また、機能を追加、拡張するための方法や規約などが定められている


参考サイト
[「わかりそう」で「分からない」でも「分かった」気になれるIT用語辞典](http://wa3.i-3-i.info/word12470.html)
[IT用語辞典](http://e-words.jp/w/%E3%83%95%E3%83%AC%E3%83%BC%E3%83%A0%E3%83%AF%E3%83%BC%E3%82%AF.html)


#Library
- 汎用性の高い複数のプログラムを再利用可能な形でひとまとまりにしたもの。
- 単体ではプログラムとして作動させることができない実行ファイルではない場合がある
- プログラムの部品をいっぱい集めたファイル

参考サイト
[wiki](https://ja.wikipedia.org/wiki/%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA)
[「わかりそう」で「分からない」でも「分かった」気になれるIT用語辞典](http://wa3.i-3-i.info/word1473.html)


APIとLibraryの違いが未だにわかりませんでした。
Vivaldi のダメなところ改め，良いところ

# 前提
- 対象バージョン: 1.14.1064.3 ~~1.9.818.40~~ (Official Build) (64-bit) on Windows7 and Mac
- 2015 年のプレビューから定期的に利用しているが、常用していなかった。
- 今までは Firefox がメイン、サブが Chrome という状況で、どちらもタブが常時10枚程度ある
- Firefox が重く、かつスローダウンしてタブの切替にも5秒以上かかるようになる時があり、その場合、プロセスを再起動する必要があったので、本格的に Vivaldi への乗換を検討して、メインブラウザとして使いはじめた（約２ヶ月）。
- 主に Firefox 57以前との比較になる

# 良いところ
- Web Panel 便利
- デフォルトショートカットのカスタマイズ性(Opera 12 までとほぼ同じことができる) ※ Firefox では Add-on を利用すれば、ほぼ同じ操作性を実現できる。Chrome は良い extension が無く、思うような挙動にできないことがある。
- Chrome の extension が使える
- タブバーの配置（自分は右にしている）

## 便利 Web Panel サイト
- 英語辞書: https://www.oxfordlearnersdictionaries.com/
- タスク管理: https://ticktick.com/
- マニュアル検索: http://devdocs.io/

# ちょっと気になるところ
- Web Panel で AdBlock が有効にならない
- Firefox, chrome に比べてメモリ使用量が多い
- おそらく AntiVirus の影響だと思うが、起動直後、Webサイトを参照できないことがある。しばらく時間をおくと直る。1.14.1064.3 より新しいバージョンは 100% 発生するので、バージョンアップを停止している。(Firefox, chromeでは発生しない)
- ~~良くも悪くも Blink~~
- 表示しながらレイアウトを整えて行くのは、体感遅く感じる。
- Tab Mix Plus 相当のことができない(Chrome も同じ)

# ダメなところ
- 言語を英語にすると、ブックマーク、変換中の日本語などのに使われるフォントがおかしい。同じブックマークタイトルの中でメイリオとMS明朝（中華？）が混在する(Windowsのみ)。※挙動がおかしい時に、フォーラムを検索をする場合、英語で検索しないとひっかからないので、言語を英語にしている
- ブックマークを新しいタブで開く設定にしていて、Blank Tab がアクティブになっている状態でブックマークを開くと新しいタブを開く。Firefox, Chrome は Blank Tab を使う。
- セッション情報が消える現象は最近出ない． ~~かなりの頻度で最後のセッションの情報が消える(Mac, Windows 両方)。Open Saved Session を選んでも、No Saved Session になる。同じ使い方で
 Firefox Chrome では発生しないので、Vivaldi 側の問題だと思われる。~~
- 直ったと思う．~~日本語入力時の変換候補が常に右上に出てくる（バグと認識されているが直らない）~~

# いまのところの方針

最近かなり安定しているので Vivaldi をメインに利用している．
Blank Tab が使われないのが不満だが，Web Panel が便利．
~~セッション情報が消えるのはかなりストレスを感じる。Forum にも時々同じような現象の人が出ているが、直る（直す）気配がないので、Firefox に戻そうと思っている。~~

Firefox 利用歴はかなり長く、Tab Mix Plus の挙動にかなり慣れてしまっていて、開くタブを状況に応じてフォアグラウンド、バックグラウンドどちらにするか設定できないのはかなり不便。
Chrome でも開発者の方は Tab Mix Plus の便利さは理解されないようで、定期的に不毛な議論が繰り返されるだけ。Tab Mix Plus 相当の機能が実装される可能性は極めて低い。Firefox が web-extension に完全移行すると Tab Mix Plus は使えなくなり、Firefox を使う意味は完全に無くなるが、それまでは Firefox を使うことにするつもり。
Ipythonでplotしたグラフをテーブルに表示する

##plotしたグラフをテーブルに表示したい。
グラフを見比べるには並んでいて欲しい。 
pyplotで並べるといまいちだし、Ipyhonだと、なかなかそうなってくれない。 
そこでHTMLのtableを利用して並べる事を思いついた。
早速やってみたが、リロードをするとグラフの更新ができない。
色々やってみた結果base64を使って何とかなりました。

IPython.displayを使うと、下のa = 2 を変えてrunをしてもファイル名の登録だけだとリロードしてくれず、代替えでbase64を使用しました。


```
%matplotlib inline

import matplotlib.pyplot as plt
import numpy
import base64
from IPython.display import HTML

def encode64(filename):
    img = open(filename, 'rb')
    data = base64.b64encode(img.read())
    img.close()
    return "data:image/png;base64," + data.decode('utf-8')

a = 2

x = numpy.arange(-3, 3, 0.01)
img = []
for i in [1,2,3,4]:
    y = numpy.sin(6.28* x * a * i)
    plt.title("freq : " + str(i * a) + "Hz")
    plt.plot(x, y)
    plt.savefig("tmp.png")
    plt.clf()
    img.append(encode64("tmp.png"))
    
html = """
 <table>
  <tr>
   <td><img src="{0}" ></td>
   <td><img src="{1}" ></td>
   </tr>
  <tr>
   <td><img src="{2}"  ></td>
   <td><img src="{3}" ></td>
  </tr>
 </table>
 """.format(img[0], img[1], img[2], img[3])
HTML(html)

```

![スクリーンショット 2017-04-28 16.39.41.png](https://qiita-image-store.s3.amazonaws.com/0/153571/8092205e-3a7f-b35e-8f6a-fd4a65846b5b.png)

![スクリーンショット 2017-04-28 16.40.22.png](https://qiita-image-store.s3.amazonaws.com/0/153571/1b2c5530-8652-932c-e779-7264ab13ee43.png)

##最後に
ちょっとトリッキーな力技だけど他の方法が見当たらないので、これで良しにしました。
Unreal Engine 4 のインストールから起動まで

なんとなくゲーム開発してみたいなと思って、入れてみたからメモ。
＠Windows

##Epic Games Launcher のダウンロード
https://www.unrealengine.com/ja/what-is-unreal-engine-4
このページの一番下の方の「今すぐダウンロード」。

<img width="464" alt="1.png" src="https://qiita-image-store.s3.amazonaws.com/0/135956/4579f188-42e6-1b57-8ca0-60c5e8081dc5.png">

##アカウント登録
アカウント情報を入力して「アカウントの作成」。

<img width="365" alt="2.png" src="https://qiita-image-store.s3.amazonaws.com/0/135956/e8de0589-bc7c-f3d0-8350-c9aad8f016af.png">

「EULA（エンドユーザーライセンス契約書）を読み、これに同意するものとします。」にチェックして、「承諾」。

<img width="286" alt="3.png" src="https://qiita-image-store.s3.amazonaws.com/0/135956/8b86ff59-8d31-b3ee-666a-01c4eda07796.png">

完了。
「WINDOWS」「MAC」ボタンが表示されるけど、勝手にダウンロードが開始される。

<img width="356" alt="4.png" src="https://qiita-image-store.s3.amazonaws.com/0/135956/b4c03ad6-0860-0ff1-e4ed-bce0d92a1075.png">

##Epic Games Launcher のインストール
ダウンロードしたファイルを実行するとランチャーが立ち上がる。
インストール先を指定して「インストール」。

<img width="386" alt="5.png" src="https://qiita-image-store.s3.amazonaws.com/0/135956/dac9b8e2-97af-6fe8-e3c9-e8cc8be787a2.png">

##Epic Games Launcher の起動
インストールが完了したら「Epic Games Launcher」を起動する。
サインイン画面になるので、上で登録したアカウント情報を入力して「サインイン」。

<img width="512" alt="6.png" src="https://qiita-image-store.s3.amazonaws.com/0/135956/c0607607-a89f-8f23-f173-44d6945fa0be.png">

起動。
＃クラウドかっけー。

<img width="768" alt="8.png" src="https://qiita-image-store.s3.amazonaws.com/0/135956/02543587-0890-bfe9-781d-25e193d179a0.png">

##Unreal Engine 4 インストール

「Unreal Engine」タブを選択して左下の「インストール」を押す。
*＃写真は「インストールされていません」となっていますが、これは一度キャンセルしてしまったからで、最初は「インストール」になっています。*

<img width="768" alt="9.png" src="https://qiita-image-store.s3.amazonaws.com/0/135956/a05a66a9-51f3-5583-b447-425da0b76f37.png">

「インストール」を押すと「ライブラリ」へ移動する。
「エンジンスロット」と表示された下部へ「インストール」ボタンが現れるのでそこを押す。

<img width="768" alt="10.png" src="https://qiita-image-store.s3.amazonaws.com/0/135956/d3a6b8dc-a7ff-f5bb-f7e8-6947a6b9e071.png">

エンドユーザーライセンスをまた聞かれるので「同意」。

<img width="768" alt="11.png" src="https://qiita-image-store.s3.amazonaws.com/0/135956/80759be2-47f1-5f7a-b4bb-8f57e210a3b0.png">

インストール場所を設定して「インストール」。

<img width="768" alt="12.png" src="https://qiita-image-store.s3.amazonaws.com/0/135956/2f130b46-52fc-7ee6-3dfe-40b14f97ac44.png">

インストールされるのを待つ。
＃なぜかダウンロードが進まなかったので、一度「キャンセル」→「再開」でダウンロードが進み出しました。
インストールが終わったらボタンが「起動」に変わるのでそこを押す。

<img width="768" alt="13.png" src="https://qiita-image-store.s3.amazonaws.com/0/135956/2654524b-8c1d-718f-75c4-1af1774005d9.png">

##起動
起動しました！

<img width="833" alt="14.png" src="https://qiita-image-store.s3.amazonaws.com/0/135956/d703dce8-080d-6281-fd2f-057d64c1f857.png">


##その後は...
ゲーム開発の知識も経験もないので、少しづつ溜めていこう。


##あとがき
インストールしているときは見つけれなかったのですが、公式にインストール手順ページがありました。
https://docs.unrealengine.com/latest/JPN/GettingStarted/Installation/index.html

これを見るにアカウントは作らなくてもできるみたいですね...
iOSアプリのコード上での画面遷移

# はじめに
iOSアプリ開発中にコード上で任意のタイミングで画面遷移したかったので調べたときのメモ

# 状態

遷移元のclass LoginViewController
遷移先のclass WebViewController

#コード上で操作

1.　Storybordから遷移先のViewControllerにidentifierを付加：webView
2.　↓のコードを遷移したいポイントに書く

```swift:LoginViewController.swift
let storyboard: UIStoryboard = self.storyboard!
let webView: WebViewController = storyboard.instantiateViewController(withIdentifier: "webView") as! WebViewController
self.present(webView, animated: true, completion: nil)
```

# segueを使った遷移をコードで書く

1.　Storybordで遷移元のViewControllerから遷移先のViewControllerへsegueを登録？　(ctrl押してドラッグ)
2. segueにidentifierを付加: toWebView　
3.　↓のコードを遷移したいポイントに書く

```swift:LoginViewController.swift
self.performSegue(withIdentifier: "toWebView", sender: nil)
```

## 値の受け渡しをしたい場合
以下の作業を追加
1. performSegue()のsenderに渡したい値を追加して、遷移先に受け取るための変数を宣言
2. 遷移元でprepare関数？をoverride
例えば配列を渡したいとき

```swift:LoginViewController.swift
self.performSegue(withIdentifier: "toWebView", sender: ["HOGE": "hoge"])

・・・

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "toWebView" {
        let webView = segue.destination as! WebViewController
        webView.param = sender as! [String : String]
    }
}
```

```swift:WebViewController.swift
class WebViewController: UIViewController {
    var param: [String: String] = [:]

　・・・

}
```
日刊イトイの岩田氏の対談を読んだ感想とメモ


[社長に学べ](http://www.1101.com/president/iwata-index.html)

```
人間はやっぱり、
自分のやったことをほめてくれたり
よろこんでくれたりする人がいないと
木にはのぼらないと思うんです。
```

子供から大人になる過程で、少しづつ自分の力だけでモチベーションを
コントロールできるようになるものだけど、それでもやっぱり飴は必要という話。
子供の頃の飴は特に大事だよね。

```
「逃げない」と決めてから
材料集めに入るわけですが、
たぶんその面談のときにわたしは
「判断は、情報を集めて分析して
優先度をつけることだ」
ということがわかったんです。

「そこで出た優先度に従って
ものごとを決めて進めていけばいい」
と思うようになりました。
```

自分にある裁量の限り、シッカリとやりたい。
こういうのは、自分の裁量外のところは手が届かないので
歯がゆくて仕方がない。

```
会社との信頼関係があれば
人は残ってくれますけど、
「ここにいても芽が出ない」とか
「ここにいても不幸になる」と思ったら、
誰でも出ていくじゃないですか。
```

ホントにその通り。

```
まちがっていることがわかっていたら、
その人が受けとって
理解して共感できるように
伝えないと意味がないわけで
```

```
「なぜ相手は自分のメッセージを
受けとらないんだろう」という気持ちは、
ただしいことをいう人たちにはないんですね。
```

正しいとされることを伝える際には、まずは相手との人間関係を気付く必要がある。
ただ、それを考え始めたら、他人にアドバイスをするのは怖くなった。
アドバイスをすることって、言う人に対してはメリットがあまりないんだよね。

```
「人は逆さにして振らないと
こんなにもモノをいえないのか」
とあらためて思いました。
```

```
質問攻めにしないと、
ほんとうに考えていることが
ききだせなかったりしますから。
```


1 on 1のMTGでも、傾聴する技術が大事ってことなんだろうな。
この辺りは、どうやったらいいんだろ？

```
唯一決まっているのが
「あなたはいまハッピーですか？」
という最初の質問でした。
```

シンプルやけど、いい質問やと思う。俺も使おう。

```
人が相手のいうことを受けいれてみようと思うかどうかの判断は
「相手がトクになるからそういっているか」
「相手が心からそれをいいと思っていっているか」の、
どちらと思ってきかれているかが
すべてだと思うんですね。
```

後者が難しいと思ったら、前者の方に導いていくのがいいのかもしれない。

```
結局は
「こういう材料がそろっていたら、君ならどう考える？」
ということをきいているんです。
「ぼくでもそうしますね」
ということになったら、安心じゃないですか。
```

情報を出すのって大事。
あと、評価の仕方なんかで、君ならどう考える？とか聞くのも効果ありそう。

```
「なにを大学で勉強して、
どうして任天堂に入ろうと思って、
入ってきてからこれまでなにをしてきて、
なにをやっていたときにたのしくて、
なにをやっていたときに
つらかったのですか？」
```

いつか使えるかも？
Winキーのない環境でWinキーショートカットを使いたい

# Winキーのない環境でWinキーショートカットを使いたい

　たまにこういう環境で左手が無意識にWinキーを捜して見つからないため、ストレスがたまることがあります。
Winキーからのショートカットは便利なものがいくつかあるので、使えるようにしておくと便利です。
Win+RとWin+Dが無いと不便なので、代替案を考えてみました。


[１．キーマップを変更して余っているキーにWinキーを登録する](#１キーマップを変更して余っているキーにwinキーを登録する)
[２．各Winキーショートカットに相当するショートカットを用意する](#２各winキーショートカットに相当するショートカットを用意する)



## １．キーマップを変更して余っているキーにWinキーを登録する

以下が分かりやすく、お勧め。
- [Windows 7 でキーマップ(キーボードレイアウト)を編集・変更する方法](
https://orebibou.com/2014/11/windows-7-%E3%81%A7%E3%82%AD%E3%83%BC%E3%83%9E%E3%83%83%E3%83%97%E3%82%AD%E3%83%BC%E3%83%9C%E3%83%BC%E3%83%89%E3%83%AC%E3%82%A4%E3%82%A2%E3%82%A6%E3%83%88%E3%82%92%E7%B7%A8%E9%9B%86%E3%83%BB/)
- [レジストリを修正してCAPSLOCKの割り当て変更](http://yanor.net/wiki/?Windows%2FTIPS%2F%E3%83%AC%E3%82%B8%E3%82%B9%E3%83%88%E3%83%AA%E3%82%92%E4%BF%AE%E6%AD%A3%E3%81%97%E3%81%A6CAPSLOCK%E3%81%AE%E5%89%B2%E3%82%8A%E5%BD%93%E3%81%A6%E5%A4%89%E6%9B%B4)


　キーマップ一覧についてはこちら。
[OADG109スキャンコード](http://www3.airnet.ne.jp/saka/hardware/keyboard/109scode.html)
※Scan Code1列の左側がレジストリに入れる値。



## ２．各Winキーショートカットに相当するショートカットを用意する

　諸事情があってレジストリをいじれない（あるいはいじるのが難しい）場合については、その動作をするショートカットを用意するという手があります。
　なお、Winキーを押すとスタートメニューがでますが、これはCtrl+Escで代用可能です。

### Win + D
　NotePadなどのテキストエディタで以下のようなDesktop.scfというファイルを作成します。

```Desktop.scf
    [Shell]
    Command=2
    IconFile=explorer.exe,3
    [Taskbar]
    Command=ToggleDesktop
```

　このファイルのショートカットを用意し、ショートカットキーに 'Ctrl + Alt +D' をセットします。


### Win + R
　ショートカットを作成し、以下のリンクを設定。ショートカットキーに 'Ctrl + Alt +R' をセットします。

%windir%\explorer.exe shell:::{2559a1f3-21d7-11d4-bdaf-00c04f60b9f0}



## 参考
- [Shell コマンドで開く特殊フォルダー一覧](http://pasofaq.jp/windows/mycomputer/shellfolder7.htm)
- [Windows 7 Shell コマンドとショートカットまとめ](http://osada.us/archives/2009/04/windows-7-shell.html)
- [Windows 10ミニTips - 「ファイル名を指定して実行」のショートカットファイルを作成する](http://news.mynavi.jp/column/win10tips/017/)
- [Windowsキーが無いキーボードで、Windows+D（デスクトップの表示）するには](http://kiyoshi.hatenablog.com/entry/20120818/1345215745)
- [「デスクトップの表示」を作る](http://crocro.com/pc/write/memo/win/make_view_desktop.txt)
- [特殊フォルダ・プログラムのCLSID・アイコン一覧](http://pasofaq.jp/windows/mycomputer/folderclsid.htm)
チェックボックスにチェックが無ければリンク先へ移動させない

Wordpressで「規約に同意しますか」のチェックボックスにチェックが
入っているか確認し、チェックが無いときは、リンク先に飛ばないように
したかった。
参考になるサイトがあったが、
[同意チェックボックスはひとつ、遷移先は複数にしたい - JavaScript 解決済 | 教えて!goo](https://oshiete.goo.ne.jp/qa/8712635.html)
至れり尽くせりで、コピペしたあと、いらないところを削って
使うことはできたが、処理内容の理解がしたかったことと、
もっとシンプルに作りたくて、作ってみた。

```html
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>  
  <title>規約承認</title>
</head>
<body>
  <form name="form1" action="">
    <input id="Checkbox1" type="checkbox" />承諾します
  </form><br>
  <a id="evtarget" href="http://example.jp">入力ページへ</a>
<script>
  //  id = 'evtarget' のタグにクリックイベントを設定
  var target = document.getElementById('evtarget');
  target.addEventListener('click', chk_value, false);
 
  function chk_value(event) {
    //  チェックボックスの値を取得
    var chkflg = document.form1.Checkbox1.checked;
    if (chkflg == false) {
      event.preventDefault();  //リンク先への移動をキャンセル
      alert('未承諾です');
    }
}
</script>
</body>
</html>
```
今回覚えたことは以下の3つ（jqueryを使わずにjavascriptのみでやってみた）

* イベントの設定

　`addEventListener('click', chk_value, false);`
　　　　　　　　パラメータ：イベントの種類,実行時の関数,false　

* チェックボックスの値の取得

　`document.form1.Checkbox1.checked;`
　　　　　パラメータ：form name,チェックボックスのid,checked

* リンク先に飛ばさない

　 `event.preventDefault()`
Go言語 with Mac OS | "could not launch process: could not get thread count"

# 問題

デバッグを走らせると 5回に1回ぐらい表題のエラーが出る。

# 解決

HEAD バージョンの delve を入れることで解決した。(2017-04-28 現在)

```
brew install delve --HEAD
```

# BEFORE

```
$ dlv version
Delve Debugger
Version: 0.12.2
Build: v0.12.2
```

# AFTER

```
$ dlv version
Delve Debugger
Version: 0.12.2
Build: c67986ed7dd0b24e07dafd5af29b496c37695cba
```

# だが 残念なことに

- VsCode の launch.json に書いたコマンド引数が渡せなくなるという問題が発生。元のバージョンに戻した。

# 環境

- MacOS Sierra 10.12.3
- go version go1.8.1 darwin/amd64

# 参考

- [OS X: cannot get thread count · Issue #645 · derekparker/delve](https://github.com/derekparker/delve/issues/645#issuecomment-268020333)








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
【HTML5学習】 Part.4

4回目の投稿になります。

今回は、~~HTMLのブロック要素とインライン要素のタグを一覧にまとめました。~~
※HTML5での分類は無くなったとご指摘をいただきましたので、訂正致します。勉強不足ですね・・・失礼しました。
こういった要素があったということで、このままメモとして残させていただきます。


##ブロック要素とインライン要素##

HTMLの要素には改行される要素(ブロック要素)と改行されない要素(インライン要素)があります。


###**ブロック要素**###
縦に積まれる性質。
ブロック要素を配置した時に前後に１行分のスペース(改行)があることを指す。
ブロック要素の中にブロック要素を入れられる。

| 要素名 | 意味・用途 | 中に入れられる要素 |
|:-----------|:------------|:------------|
|h1 ~ h6        |見出し|インライン要素のみ 
|p     |段落　見出し以外の文章に使われる |インライン要素のみ
|pre        |改行や字下げを保持し、整形した通りのテキスト表示|インライン要素のみ(img,object,big,small,font etc...文字幅を変えてしまう要素は入れられない) 
|div          |Divisionの略　レイアウトを構成(グループ化)する時に使う用素|ブロック要素、インライン要素
|ul        |UnorderListの略　箇条書きリスト|li要素のみを１つ以上(li要素の中にブロック要素を含んで問題なし)
|ol     |OrderListの略　数字連番リスト|li要素のみを１つ以上　
|dl        |DefinitionListの略 定義を表す(用語と説明)リスト|dt要素、dd要素のみ 
|blockquote      |長めの引用文       |ブロック要素、script要素
|table        |表|caption要素、colgroup要素、col要素、thead要素、tfoot要素、tbody 
|address          |アドレス(連絡先)、作者情報|インライン要素のみ|
|form        |送信フォーム部品すべて|ブロック要素、script要素
|fieldset     |フォーム部品のグループ化|ブロック要素、インライン要素
|noframes      |フレーム表示されない時のコメント用|ブロック要素、インライン要素 
|hr          |水平線(区切り線)|空要素タグ



###**インライン要素**###
ブロック要素や文章のなかに含まれる要素で、前後改行されない。
横に並ぶ性質。
インライン要素の中にブロック要素は入れられない。




| 要素名 | 意味・用途 |中に入れられる要素| 
|:-----------|:------------|:------------
| a       |リンク |a要素を除くインライン要素のみ
| span|特定の範囲に使用。文字の一部分だけ色を変えたりなど。|インライン要素のみ
|br       |        改行 |空要素タグ
|button|ボタン |iframe要素、input要素、select要素、textarea要素、label要素、button要素、isindex要素、a要素を除くインライン要素のみ
|font|フォント名、色、フォントサイズを指定 |インライン要素のみ
|b    |太字|インライン要素のみ
|bdo    |文字の方向|インライン要素のみ
|small|小さめの文字|インライン要素のみ(smallを入れるとさらに小さな字にできる)
|strong |強調(太字で表示)|インライン要素のみ
|em    |強調(イタリックで表示)|インライン要素のみ
|i    |斜体(イタリック)|インライン要素のみ
|sub    |下付き文字|インライン要素のみ
|sup    |上付き文字|インライン要素のみ
|var    |変数、引数とわかるように文字表示|インライン要素のみ
|u    |下線|インライン要素のみ
|s    |取り消し(打ち消し)線|インライン要素のみ
|img    |画像|空要素タグ
|map    |イメージマップ(画像の中のリンク部分)|ブロック要素か、一つ以上のarea要素
|select    |選択画面入力部品|option要素、optgroup要素
|input    |送信フォームの入力部品|空要素タグ
|label    |フォーム部品としてのラベル|label要素を除いたインライン要素のみ
|textarea    |複数行のテキスト入力エリア|テキストのみ
|cite    |出典、参照先(イタリックで表示)|インライン要素のみ
|dfn    |用語解説の該当用語をイタリックで表示|インライン要素のみ
|q    |短めの引用文|インライン要素のみ
|samp    |サンプル形式表示|インライン要素のみ
|kbd    |キーボード入力文字形式として表示|インライン要素のみ
|code    |ソースコード|インライン要素のみ
|iframe    |インラインフレームの配置用|ブロック要素、インライン要素
|object    |様々な形式のデータを配置|ブロック要素、インライン要素、param要素
Gmailに添付されたAWS請求書をSlackに転送

# Gmailに送られてくるAWSの請求書をSlackに共有

毎月Gmailに送られてくるAWSの請求書をSlackに転送する


## 方法

泥臭くGmailの件名から抽出して、Slackに通知するようにしています

以下で[こちらのソースコード](https://github.com/comefigo/gmailattach-to-slack)をベースに説明します

1. [Token](https://api.slack.com/custom-integrations/legacy-tokens)の取得
2. 通知させたいGoogleユーザでログイン
3. 新規[Google App Script](https://www.google.com/script/start/)を作成
4. プロジェクト名は任意の名前を入力
5. コードには、Main.gsの内容を張り付け
6. 以下の箇所を修正してください

    ```
    var apiToken = '<token>';       // https://api.slack.com/custom-integrations/legacy-tokensでtokenを発行してください
    var postChannel = "<channel>";  // 通知したいチャンネル名
    ```

7. [スケジュール実行の設定](http://pineplanter.moo.jp/non-it-salaryman/2016/05/20/google-apps-script-minute-timer/)
    毎月３～４日に送られてくるので、5日あたりに自動実行を設定しとくと安全でしょう


## リファレンス

- [Gmail検索用演算子](https://support.google.com/mail/answer/7190?hl=ja)
- [Gmail Api](https://developers.google.com/apps-script/reference/gmail/gmail-app)
- [Slack Api File upload](https://api.slack.com/methods/files.upload)
【ActiveDirectory】Macのドメイン参加手順について

#はじめに
前提条件
ドメイングループ内に対象のユーザアカウントを作成する。
尚、今回のActive DirectoryはAWSのMicrosoft AD環境での作業です。


###コンピューターのドメイン参加とは

```
管理するActive Directory配下で利用したいコンピューターをドメインに参加させ、ドメイン内の他のコンピュータと共通のアカウントなどを利用できるようにすること。
```

##ドメイン参加手順

必要な情報：
Active Directoryで作成されたユーザアカウント。
またそれに紐付いたコンピューター名。
　　　　　　　　　　
①対象のMacにローカル管理者権限があるユーザでログインする			
②DNS設定			
システム環境設定　＞　ネットワーク　＞　詳細　＞　DNS　＞　検索ドメイン(ドメインを追加)	

![macAD_00.png](https://qiita-image-store.s3.amazonaws.com/0/174392/683828d9-1d42-c343-1618-ac64c33f466d.png)


![macAD_02.png](https://qiita-image-store.s3.amazonaws.com/0/174392/0569dac3-7ee5-ec4e-e8d3-465c0b64d7f2.png)



システム環境設定 ＞　ユーザーとグループ　＞　ログインオプション　＞接続...  ＞　ActiveDirectoryを選択
![macAD_03.png](https://qiita-image-store.s3.amazonaws.com/0/174392/520e8609-e345-5de8-7935-defc1ac06694.png)

![macAD_04RE.png](https://qiita-image-store.s3.amazonaws.com/0/174392/38456831-d37e-6f87-8ccb-91ec8420ca1e.png)



ActiveDirectoryのドメイン：xxxx.intra
コンピュータIDを入力しバインドへ

![macAD_05.png](https://qiita-image-store.s3.amazonaws.com/0/174392/0abf9187-ad7e-9a03-2abf-4cb907bf363f.png)


![macAD_06.png](https://qiita-image-store.s3.amazonaws.com/0/174392/0264616a-eb16-c7e6-be18-d072ac925048.png)


ここで入力するユーザ名とPWについて、注意することがあります。
前提条件でユーザ登録と合わせて、コンピューター名の登録とユーザとの紐付けが必要と前述しました。

コンピューター名の登録とユーザとの紐付けを行わない場合、
Administrator権限の入力をしなければ認証ができないようになっています。
Administrator権限の情報を安易に周知したくない場合がほとんどだと思うので、事前のコンピューター名、ユーザアカウントとの紐付けがおすすめです。


###注意点

この状態では端末の管理者権限が付与されておらず、アプリのインストールや設定変更が行えないことがあるため、管理者権限を付与する。

管理　＞　管理を許可するユーザ：にチェックを入れ、xxxx.intraを追加する

![macAD_07.png](https://qiita-image-store.s3.amazonaws.com/0/174392/ecaafd59-14e7-9529-97c3-b905dc11fffd.png)


これでMACからAD環境へのアクセスができるようになりました。

###ログアウトせずにMACでユーザを切り替える方法

今回このドメイン参加の方法を検証するにあたって、自身のMACを使っていたわけですが。
ADで作成したユーザアカウントでMACにログインできるかテストする際、いちいちログアウトするのがとても面倒だったので、簡単にアカウントを切り替える設定をご案内します。

システム環境設定　＞　ユーザとグループ　＜　クリックして編集を可能にし　＞　ログインイプション

ファストユーザスイッチメニューを表示にチェックを入れる。

![macAD_08RE.png](https://qiita-image-store.s3.amazonaws.com/0/174392/cee10a37-269d-aa26-27aa-06b747275623.png)



そうすると、画面の右上にアイコンが表示される。
これでいちいちログアウトしなくても、アカウントを素早く切り替えて作業することができます〜。

![macAD_09RE.png](https://qiita-image-store.s3.amazonaws.com/0/174392/4d02a6ae-ff11-3296-97cc-34dbfc523bb4.png)


[microsoft公式サイトより](https://www.microsoft![macAD_09.png](https://qiita-image-store.s3.amazonaws.com/0/174392/af78fb1b-0224-49d2-7f58-eb2730ca100e.png)
![macAD_09.png](https://qiita-image-store.s3.amazonaws.com/0/174392/5a64fd1a-be61-3b21-854c-10c718d3acd7.png)
.com/japan/msbc/Express/sbc/activedirectory/default.aspx)
コマンドプロンプトからgvimでマストドンとtwitterに同時に投稿してみよう！

必要なソフトウェア
================

* [twty (A command-line twitter client)](https://github.com/mattn/twty)
* [go-mastdon](https://github.com/mattn/go-mastodon)
* [gvim](https://www.kaoriya.net/software/vim/)
* ビルド用に [Go](https://golang.org/dl/)

twtyのビルド
===========

```powershell
go get github.com/mattn/twty
cd go\src\github.com\mattn\twty\
go build
copy twty.exe (%PATH%のとおったフォルダー)
```

twty は一度起動して、アカウント登録しておくこと

go-mastodon のビルド
===================

```powershell
go get github.com/mattn/go-mastodon
cd go\src\github.com\mattn\go-mastodon\
go build
cd cmd\mstdn\
go build
copy mstdn.exe (%PATH%のとおったフォルダー)
```

* もしかしたら、追加モジュールがいるかもしれないけど、適宜 go get お願いします
* こちらも、いちど mstdn.exe を起動して、アカウント登録してください

バッチファイル用意
================

```powershell:dondon.cmd
@echo off
setlocal
set "DON=%TEMP%\don.txt"
type nul > "%DON%"
gvim -c "e ++enc=utf8" "%DON%"
if errorlevel 1 exit /b
twty -ff "%DON%"
mstdn toot -ff "%DON%"
endlocal
```

コマンドプロンプトから`dondon` とタイプすると gvim が起動するので、魂の叫びを書き込もう。登録する時は普通に「`:wq`」、キャンセルする時は「`:cq`」だ。文字数超過で twitter への投稿だけが失敗する時もあるから注意な！
【FileMaker】テキスト内を検索して、マーキングする

簡単にいうと、テキスト内を検索して、マッチする単語があったらマーキングします。

まずは、動きをどうぞ。
[https://youtu.be/bxEZSKODLOE](https://youtu.be/bxEZSKODLOE)

音声はないので、念のため、画像でも。

テキストデータに"PatternCount"という文字列がない場合は、「ない」とダイアログが出ます。
<img width="1250" alt="qiita_patterncount1.png" src="https://qiita-image-store.s3.amazonaws.com/0/60538/c647c5d1-4abb-d12e-181a-64bd6063e739.png">

テキストデータに"PatternCount"という文字列がある場合は、個数をダイアログで表示し、「結果テキスト」フィールドにマッチする単語をマーキングして表示します。
<img width="1243" alt="qiita_patterncount2.png" src="https://qiita-image-store.s3.amazonaws.com/0/60538/3c3cf284-7a32-ecbd-a4b4-26e513f398a5.png">

大雑把な実装方法は、
・PatternCount関数を使って検索
・TextStyleAdd関数で、該当のテキストをマーキング
の２つです。

まず、フィールドの構成です。
<img width="728" alt="qiita_patterncount3.png" src="https://qiita-image-store.s3.amazonaws.com/0/60538/c701d4c3-d048-a3f3-f8d8-84554a8abe35.png">

これまた単純に、
・フィールド：テキストデータ
・グローバルフィールド：検索ワード、結果テキスト
のみです。
グローバルフィールドの「検索ワード」は、検索するために使うので一つでいいかなと思いグローバルフィールドにしていますが、固有の検索ワードの結果を保存しておきたいのでしたら、「検索ワード」「結果テキスト」共に通常のフィールドにしてもいいかと思います。

例えば、検索結果を後で活用するために検索ワードに関したレコードのみを引っ張ってきたい、などですかね。
別言語ですが、以前関わった遺伝子データ活用のシステム開発で、特定の遺伝情報を検索したらヒットしたデータのみをピックアップしてどうのこうの、、、というのがありました。
昔FileMakerを使っていたら是非とも提案したいところでした。

「検索」ボタンのスクリプトを見てみましょう。
<img width="1144" alt="qiita_patterncount4.png" src="https://qiita-image-store.s3.amazonaws.com/0/60538/bbdb0c7d-6623-477b-64ad-7f48fa54f954.png">

大事なところは、最後のTextStyleAddです。
<img width="845" alt="qiita_patterncount5.png" src="https://qiita-image-store.s3.amazonaws.com/0/60538/5eb3464b-ef70-e863-978e-b031708299e0.png">

[TextStyleAdd](https://www.filemaker.com/help/15/fmp/ja/index.html#page/FMP_Help%2Ftextstyleadd.html%23)は、文字の修飾をしてくれる関数なので、例えばアンダーラインを引きたい、太字にしたい、などを施してくれます。
しかも、複数指定できます。

例えば、下線をプラスしたい場合。
<img width="832" alt="qiita_patterncount6.png" src="https://qiita-image-store.s3.amazonaws.com/0/60538/d94f7c6b-9c93-a72f-2b69-6d9bfd1eac73.png">
「＋」で繋ぐだけです。

強調表示＋下線で、以下のような結果になります。
<img width="1217" alt="qiita_patterncount7.png" src="https://qiita-image-store.s3.amazonaws.com/0/60538/f9430549-db47-8b43-0f3c-2020f4de98cb.png">
アンダーライン、つきましたね。

ちなみに、「全部盛り」というのがあります。
<img width="833" alt="qiita_patterncount8.png" src="https://qiita-image-store.s3.amazonaws.com/0/60538/80584c11-ba50-4b30-2cc1-631182d6dd11.png">

こう出ます。
<img width="1193" alt="qiita_patterncount9.png" src="https://qiita-image-store.s3.amazonaws.com/0/60538/6ec0c53f-a421-6020-0242-9c974f647d05.png">
かっこ悪ぅ。。。

何事もほどほどに、というところでしょうか。
PatternCountとTextStyleAdd、適宜利用してみてくださいね。
Android SDK ManagerでInstallボタンが押せない

##症状
RubyMotion for Androidの環境構築をしている途中でAndroid SDKのSettingが上手くいかない([このサイト](http://www.rubymotion.com/jp/developers/guides/manuals/android/getting-started/)の2.4節)。具体的には以下のように必要なファイルが自動的に選択されている状態でInstall xx packages…をクリックすると、
![スクリーンショット 2017-04-20 13.24.56.png](https://qiita-image-store.s3.amazonaws.com/0/37881/4455822f-a4e7-4240-4655-02eda3aef4d2.png "スクリーンショット 2017-04-20 13.24.56.png")

このような画面が現れる。ここでAccept Licenseにチェックを入れるもInstallボタンがグレイアウトしたままで先に進めなかった。
![スクリーンショット 2017-04-20 13.25.16.png](https://qiita-image-store.s3.amazonaws.com/0/37881/7171ea19-5924-3040-2ad8-7689008e72e2.png "スクリーンショット 2017-04-20 13.25.16.png")


##解決
最初のインストールするファイルの選択で、全てにチェックボックスを入れるのではなく、sdkをまず個別にインストールするとうまくいった。

参考：http://stackoverflow.com/questions/15435007/choose-package-to-install-install-button-greyed-out

とりあえずToolsとPlatform-Toolsのみインストールすることはできた。
![スクリーンショット 2017-04-20 13.27.37.png](https://qiita-image-store.s3.amazonaws.com/0/37881/1e8ac7b1-1180-42b1-34ff-90f615944367.png "スクリーンショット 2017-04-20 13.27.37.png")

後にその他のコンポーネントもインストールできました。
![スクリーンショット 2017-04-20 13.28.43.png](https://qiita-image-store.s3.amazonaws.com/0/37881/7982dcc2-7f76-679c-a29c-e245877ce7d1.png "スクリーンショット 2017-04-20 13.28.43.png")
機械学習API群A3RTをPythonから使う

[A3RT](https://a3rt.recruit-tech.co.jp/)
テキストの分類や自動生成、画像のスコアリング、対話などができるようです。

現在使うことのできるAPIは以下のようです。
* Text Suggest API
* Text Classification API
* Listing API
* Image Influence API
* Proofreading API
* Talk API

## Pythonで使用する
使用するライブラリ: [pya3rt](https://github.com/nocotan/pya3rt)
https://github.com/nocotan/pya3rt

## インストール

```
$ pip install pya3rt
```

## サンプル

### Text Suggest

```python
# -*- coding: utf-8 -*-
import pya3rt

apikey = "{YOUR_API_KEY}"
client = pya3rt.TextSuggestClient(apikey)

print(client.text_suggest("馬"))
print(client.text_suggest("あき", style=1))
print(client.text_suggest("func", style=2))
```

### Text Classification

```python
# -*- coding: utf-8 -*-
import pya3rt

apikey = "{YOUR_API_KEY}"
client = pya3rt.TextClassificationClient(apikey)

print(client.classify("システムの企画から開発・運用まで幅広く関われます。"))
```

### Proofreading API

```python
# -*- coding: utf-8 -*-
import pya3rt

apikey = "{YOUR_API_KEY}"
client = pya3rt.ProofreadingClient(apikey)

print(client.proofreading("システムの企画から開発・運用まで幅広く関われます。"))
print(client.proofreading("システムの規格から開発・運用まで幅広く関われます。"))
```

### Image Influence API

```python
# -*- coding: utf-8 -*-
import pya3rt

apikey = "{YOUR_API_KEY}"
client = pya3rt.ImageInfluenceClient(apikey)

print(client.get_upload_url())
print(client.meat_score("meat1.jpeg", 1))
```

### Talk API

```python
# -*- coding: utf-8 -*-
import pya3rt

apikey = "{YOUR_API_KEY}"
client = pya3rt.TalkClient(apikey)

print(client.talk("おはよう"))
```
HoloLens開発時にあったら便利なもの

# 概要
HoloLensを開発していくうえであったら便利なものをまとめていく(随時更新)

# 詳細
### Windows Device Portal
- https://docs.microsoft.com/ja-jp/windows/uwp/debug-test-perf/device-portal
- https://developer.microsoft.com/en-us/windows/mixed-reality/using_the_windows_device_portal
<br>実行ファイルをwifi経由でインストールできたり、動画撮影できたり、どこ向いてるのか確認できたりする
Option の中身を検証する、ちょっとカッコイイ？書き方

本当にちょっとしたことだけど、`Option` の中身が期待通りかを確認するののスッキリした書き方をメモ。
`exists` までは思いつくけど、 `Option` に `contains` があるのは、最初はピンとこなかった。

```scala
val op: Option[Int] = ???
op.map(_ == 334).getOrElse(false) // △
op.exists(_ == 334) // ○
op.contains(334) // ◎
```