OmniAICreator/Qiita-1.07M huggingface dataset:
How to check DHCP server information


### Prerequiste

- nmap

```
yum install nmap

Loaded plugins: fastestmirror, langpacks
Loading mirror speeds from cached hostfile
 * base: ftp.nara.wide.ad.jp
 * elrepo: ftp.yz.yamagata-u.ac.jp
 * epel: ftp.jaist.ac.jp
 * epel-debuginfo: ftp.jaist.ac.jp
 * epel-source: ftp.jaist.ac.jp
 * extras: ftp.nara.wide.ad.jp
 * updates: ftp.yz.yamagata-u.ac.jp
Resolving Dependencies
--> Running transaction check
---> Package nmap.x86_64 2:6.40-7.el7 will be installed
--> Finished Dependency Resolution

Dependencies Resolved

Installing:
 nmap                               x86_64                               2:6.40-7.el7                                base                               4.0 M

Transaction Summary
Install  1 Package

Total download size: 4.0 M
Installed size: 16 M
Is this ok [y/d/N]: y
Downloading packages:
nmap-6.40-7.el7.x86_64.rpm                                                                                                             | 4.0 MB  00:00:00     
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
  Installing : 2:nmap-6.40-7.el7.x86_64                                                                                     1/1 
  Verifying  : 2:nmap-6.40-7.el7.x86_64                                                                                     1/1 
Installed:
  nmap.x86_64 2:6.40-7.el7                                                                                                                                    
Complete!
```

### How to check

- nmap --script broadcast-dhcp-discover

```
nmap --script broadcast-dhcp-discover

Starting Nmap 6.40 ( http://nmap.org ) at 2018-04-13 09:47 JST
Pre-scan script results:
| broadcast-dhcp-discover: 
|   IP Offered: XXX.XXX.XXX.XXX
|   DHCP Message Type: DHCPOFFER
|   Server Identifier: YYY.YYY.YYY.YYY
|   IP Address Lease Time: 0 days, 0:05:00
|   Subnet Mask: 255.255.255.0
|   Time Offset: 32400
|   Router: ZZZ.ZZZ.ZZZ.ZZZ
|   Domain Name Server: 
|   Domain Name: 
|   Broadcast Address: 
|_  NTP Servers: 
WARNING: No targets were specified, so 0 hosts scanned.
Nmap done: 0 IP addresses (0 hosts up) scanned in 0.23 seconds
```
Todoistの『今日のタスク』を自分のLINEに通知する方法

# やったこと

プライベートのタスクはTodoistを使って管理しています。
ただ、タスク管理していても、そもそもTodoistを確認するのを忘れてしまうということもあります。
それを防止するために、能動的に確認しにいくのではなく、受動的に知らせてほしいです。

Todoistにはリマインダーという通知機能があるのですが、タスクごとにいちいち設定していられないので使っていません。
そこで、TodoistのAPIを使って自分で通知機能を作りました！！

# 必要なもの

- todoistのアカウント
- LineNotifyの登録
- pythonのプログラムを定期実行できる環境

# Todoistとは

[Todoist](https://ja.todoist.com/)とはタスク管理のためのクラウドサービスです。
クラウドサービスなのでパソコンからはもちろんのこと、スマホからでも使えます。スマホアプリもあります。
タスク管理のサービスは色々使ってきましたが、Todoistが機能・デザインともに一番優れていると思っています。

# LineNotifyとは

[LineNotify](https://notify-bot.line.me/ja/)とはWebサービスからの通知を受けることができるLineのサービスです。
通知の方法はGmailでもよかったのですが、メールよりLineのほうが気軽なのでこっちにしました。

# 実装

以下コードと解説をします。

```python:task.py
import requests

# タスクをJSON形式で取得
token = 'xxxxxxxxxxxxxxxxx' # TodoistのAPIトークン（『設定』メニューから取得できます）
filter = '#Private&(today|overdue)' # ここでは、プライベートのタスクで、期限が今日以前のものを設定しています。
response = requests.get("https://beta.todoist.com/API/v8/tasks", params={"token": token, "filter": filter}).json()

# JSONから中身だけ取り出して整形
today_task = ''
for task in response:
    today_task = today_task + task['content'] + ' \n' \

# メッセージを作成
message = '\n' \
    + '【本日のタスク】' + '\n' \
    + today_task

# LineNotifyのトークンとAPIを設定
line_notify_token = 'xxxxxxxxxxxxxxxxx' # こっちはLineNotifyのトークン
line_notify_api = 'https://notify-api.line.me/api/notify'

# 送信
payload = {'message': message}
headers = {'Authorization': 'Bearer ' + line_notify_token}
line_notify = requests.post(line_notify_api, data=payload, headers=headers)
```

あとはこのコードを定期的に実行するだけです。
私の場合は、[さくらのVPS](https://vps.sakura.ad.jp/)を契約しているので、cronで朝・昼・夕で定期実行しています。


# まとめ

タスクを忘れないようにタスク管理ツールに登録したけど、そもそもタスク管理ツールを確認するのを忘れてしまう・・・
というのを防ぐことができました！
cronで自分で通知時間帯を調整することができるので、朝起きたときに1日のタスクを確認しておきたいとか、退社前に買い物を忘れないようにしたいとか、柔軟に対応できるのが魅力ですね。
SQLServer 2017 on Linux Dockerを作ってみました

# 概要

SQLServer 2017 on LinuxのDocker版をdocker-composeでさくっと作ってみました
MSから提供されているイメージでは初期データ投入できなかったので、初期データ投入機能を追加しときました
テスト環境が欲しい方の参考になれば幸いです

元ネタ：https://docs.microsoft.com/ja-jp/sql/linux/quickstart-install-connect-docker

# 前提

[こちらのリポジトリ](https://github.com/comefigo/docker-mssql-server-linux)をベース説明していきます

# ソース

docker-composeファイルはざっとこんな感じです
環境変数はcommon.envで管理し、初期データ投入はstart-up.shで行っています
初期データはinit-data配下の.sqlファイルを名前順にロードしていきます

```yaml:docker-compose.yml

version: "3.5"
services: 
  sqlserver:
    image: microsoft/mssql-server-linux:2017-latest
    container_name: sqlserver
    hostname: sqlserver
    ports:
      - 1433:1433
    volumes: 
      - ./init-data:/init-data
      - ./start-up.sh:/start-up.sh
      - mssql-db:/var/opt/mssql
    env_file: 
      - common.env
    command: "sh -c '/start-up.sh & /opt/mssql/bin/sqlservr;'"

volumes: 
  mssql-db:
    driver: local
```

```shell:start-up.sh
#!/bin/bash

wait_time=15s

# wait for SQL Server to come up
echo importing data will start in $wait_time...
sleep $wait_time
echo importing data...

for filepath in "/init-data/*.sql"
do
  echo "import: " $filepath
  /opt/mssql-tools/bin/sqlcmd -S localhost -U SA -P "$MSSQL_SA_PASSWORD" -i $filepath
done
```

```ini:common.env
TZ=Asia/Tokyo
# 使用許諾契約書の同意
ACCEPT_EULA=Y
# DBパスワード
MSSQL_SA_PASSWORD=4iF5uTjJ8vJG0YGL
```

# データの永続化

mssql-dbボリュームで永続化しているので、そのボリュームを削除するか、ボリューム名を変えて対応するとよいでしょう
USB-RS232 > USBシリアル変換アダプター > 表記のない製品 (青色半透明のハウジング) > 将来の情報参照が不可能になる

Linuxでドライバインストール不要のUSBシリアル変換アダプタを使用している。

Windows 7ではドライバインストールが必要である。

- 特徴
    - 青色半透明のハウジング

製品名の記載がないので、どのドライバをインストールすればいいか分からない。

下記の製品だった。

[USBシリアルケーブル > 変換名人 > USB-RS232 > CentOSで認識した](https://qiita.com/7of9/items/c35da5a818b4d0110c0e)

http://henj.in/USB.html
> 型番 USB-RS232
> JAN 4571284889118

テプラでラベリングするなどの対策が必要だろう。
Laravelで無理矢理HTTPS化

AWSのCloudFront -> ELB -> EC2 -> nginx -> php-fpm
というよくある構成で、
LaravelがリクエストをHTTPと認識して困ってました。
EC2に到達しているときにはHTTPだからです。

actionやurlヘルパなどについては、なんとかなりました。
View::shareでHTTPS判定フラグをセットして
上記ヘルパの引数にセットすれば、
https://...というURLを生成してくれるからです。
(でも、これは相当面倒)

``` php
{{!! action('xxx', [], $secure) !!}
```

ただ、FormRequestで自動的にredirect backされるケースでは、
HTTPにリダイレクトされてしまってどうにもなりませんでした。

そこで、リクエストURLからホスト名を

``` php
$host = parse_url(request()->url(), PHP_URL_HOST)
```

のように取得し、ホストがCloudFrontやELBの場合のみ

``` php
$server = request()->server;
$server->set('HTTPS', 'on');
$server->set('SERVER_PORT', '443');
```

という処理をApp\Providers\AppServiceProvider::bootに記述しました。

これで、常時HTTPS化が実現できました。
やれやれ。
Go にとても長い式を食べさせると死ぬ

[整数を419378回インクリメントするとMacのg++が死ぬ](https://qiita.com/kaityo256/items/6b5715b213e955d44f55)
や
[C++でアスタリスクをつけすぎると端末が落ちる](https://qiita.com/kaityo256/items/d54439246edc1cc58121)
にインスパイアされて。

Go が Go で書かれているのであれば、スタックが可変長なので相当しぶといと予想していた。

で、まずは括弧。

# `(((((1)))))`

```ruby:ruby
a = [*1..1000000]
p(a.bsearch do  |n|
  exp = "("*n + "1"+")"*n
  File.open( "hoge.go", "w" ){ |f| f.puts( <<"GOLANG" ) }
package main
import (
	"fmt"
)
func main() {
	fmt.Println(#{exp})
}
GOLANG
  begin
    "1" != %x( go run hoge.go ).strip
  rescue
    true
  end
end)
#=>871538
```

８７万。なかなかしぶとい。
もうちょっと(億とか)行くと予想していたので、予想は外れ。

# `1+1-1+1-1+1-1+1-1+1-1`

```ruby:ruby
a = [*1..1000000]
p(a.bsearch do  |n|
  exp = "1"+"+1-1"*n
  File.open( "hoge.go", "w" ){ |f| f.puts( <<"GOLANG" ) }
package main
import (
	"fmt"
)
func main() {
	fmt.Println(#{exp})
}
GOLANG
  begin
    "1" != %x( go run hoge.go ).strip
  rescue
    true
  end
end)
#=>68899
```

７万弱。「1」の数なら14万弱。
括弧よりも 1+1-1... の方がしぶといと予想していたので、こちらも予想は外れ。
そういうものか。

# func()int { return func()int { return func()int { return 1}()}()}()

```ruby:ruby
a = [*1..1000000]
p(a.bsearch do  |n|
  exp = "func()int { return "*n+"1"+"}()"*n
  File.open( "hoge.go", "w" ){ |f| f.puts( <<"GOLANG" ) }
package main
import (
	"fmt"
)
func main() {
	fmt.Println(#{exp})
}
GOLANG
  begin
    "1" != %x( go run hoge.go ).strip
  rescue
    true
  end
end)
#=>102
```

およそ百。少ない。
まあ、機械生成でもこの文脈で死ぬようなコードは吐きにくいと思うので無害だと思う。いわんや人間に於いてをや。

ちなみに、

```text
runtime.morestack: nosplit stack check too deep
runtime.morestack: nosplit stack overflow
```

というエラーが出る。
nosplit stack とはなんだろうか。

# <-<-<-<-<-<-<-<-<-<-

```ruby:ruby

a=[*3..10000]

p( a.bsearch do |n|
  types = Array.new(n-1){ |i|
    "type c#{i+1} chan c#{i}"
  }.join("\n")

  makes=Array.new(n){ |i|
    "v#{i} := make(c#{i})"
  }.join("\n")

  funcs=Array.new(n-1){ |i|
    "go func(){ v#{i+1}<-v#{i} }()"
  }.join("\n")
  File.open( "hoge.go", "w") do |f|
    f.puts %Q!package main

    import "fmt"

    type c0 chan int
    #{types}

    func main() {
      #{makes}
      go func(){ v0<-1 }()
      #{funcs}
      fmt.Println(#{"<-"*n}v#{n-1})
    }!
  end
  begin
    ng = "1"!=%x( go run hoge.go ).strip
    p [ n, ng ? "NG" : "okay"]
    ng
  rescue
    p [ n, "NG"]
    true
  end
end)
```

n=10000 まで試したけど死ななかった。それ以上は実行時間がかかりすぎるので試していない。

ちなみに、n=5 のときのコードは( フォーマットすると )

```go:go
package main

import "fmt"

type c0 chan int
type c1 chan c0
type c2 chan c1
type c3 chan c2
type c4 chan c3

func main() {
	v0 := make(c0)
	v1 := make(c1)
	v2 := make(c2)
	v3 := make(c3)
	v4 := make(c4)
	go func() { v0 <- 1 }()
	go func() { v1 <- v0 }()
	go func() { v2 <- v1 }()
	go func() { v3 <- v2 }()
	go func() { v4 <- v3 }()
	fmt.Println(<-<-<-<-<-v4)
}
```

こんな感じ。

# 他の処理系

* [ruby](https://qiita.com/Nabetani/items/5d62ff62ffaf4c556989)
* [python](https://qiita.com/Nabetani/items/68040ab25c4a845fb9c3)
* [node.js](https://qiita.com/Nabetani/items/af5989742fd1a5d5bdbb)
[Note] Road to Pythonista

## __slot__
https://qiita.com/tma15/items/1d7fbc4d56ac4b3678e1

## @property
http://d.hatena.ne.jp/podhmo/20110526/1306422831

## super()
https://qiita.com/Kodaira_/items/42dfe18c81af98bf0db3

## numpy.reshape
modifying the "axis" argument for numpy.reshape, we could convert the array into any dimensional matrix.
In this case, I have formatted 32x1 matrix in 1x4x8x1x1, 2x2x2x2x2 or 1x1x1x1x32 dimensional matrix.

```python
np.random.seed(3)
a = np.random.rand(32)
print(a)
print(a.reshape(1,4,8,1,1))
print(a.reshape(2,2,2,2,2))
print(a.reshape(1,1,1,1,32))
```

## np.squeeze()
https://docs.scipy.org/doc/numpy-1.14.0/reference/generated/numpy.squeeze.html

## np.vstack
https://deepage.net/features/numpy-stack.html
プログラミング言語Goを読みながらメモ(第九章)

[プログラミング言語 Go]( https://www.amazon.co.jp/dp/4621300253 ) を読みながらメモ。


第一章 : https://qiita.com/Nabetani/items/077c6b4d3d1ce0a2c3fd
第二章 : https://qiita.com/Nabetani/items/d053304698dfa3601116
第三章 : https://qiita.com/Nabetani/items/2fd9c372fcd8383955a5
第四章 : https://qiita.com/Nabetani/items/59bfd00dc3323883a07f
第五章 : https://qiita.com/Nabetani/items/4b785f1c9b0b26d48475
第六章 : https://qiita.com/Nabetani/items/1c100394a65af6506187
第七章 : https://qiita.com/Nabetani/items/6553ad253af77661e915
第八章 : https://qiita.com/Nabetani/items/3b2e3964159cc292fe00

で。

第9章は前半わりと普通なスレッドの話だった。

`sync.Once` とか あったけどね。

「並列的で待たされないキャッシュ」のところはしっかり理解できていないけど先に進むことにした。

そして 9.8 goルーチンとスレッド。

# 百万段のパイプライン

練習問題に「ひとつの値がパイプライン全体を伝わっていくのに、どのくらいの時間を要するでしょうか。」という問題があったので、測ってみた。

```go:go
package main

import (
	"fmt"
	"time"
)

const nofChans = 1000000

func main() {
	var chs [nofChans]chan int
	for i := 0; i < nofChans; i++ {
		chs[i] = make(chan int)
	}
	for i := 0; i < nofChans-1; i++ {
		go func(i int) {
			val := <-chs[i]
			chs[i+1] <- (val + 1)
		}(i)
	}
	start := time.Now()
	fmt.Println("start : ", start)
	chs[0] <- 1
	fmt.Println(<-chs[nofChans-1])
	ended := time.Now()
	fmt.Println("ended : ", time.Now())
	fmt.Println(ended.Sub(start)) // 814.117133ms
	chanTime := ended.Sub(start).Seconds() * 1000 * 1000 / nofChans
	fmt.Printf("%.3f[μs]\n", chanTime) // 0.801[μs]
}
```

こんな感じ。百万段のパイプラインを1秒弱で伝わった。
`chan` 一個あたり1マイクロ秒ぐらいで伝わるらしい。
スレッドで似たようなことを書く方法が良くわからない。比べたいんだけどなぁ。

メモリの限界までgoルーチンを作れとも言われたけど、百万でも限界に達していないので気にしないことにした。

# ピンポン

続いてまた練習問題
「二つのバッファなしチャネルを介して卓球のようにメッセージを（略）一秒で何回の通信を行うことができるでしょうか。」

```go:go
package main

import (
	"fmt"
	"time"
)

func main() {
	c0 := make(chan int)
	c1 := make(chan int)
	rt := 0
	go func() {
		for {
			rt++
			n := <-c0
			c1 <- n + 1
		}
	}()
	go func() {
		for {
			n := <-c1
			c0 <- n + 1
		}
	}()
	timer := time.NewTimer(time.Second)
	c0 <- 1
	<-timer.C
	fmt.Println(rt) // 2186179
}
```

手元のマシンで2百万往復ぐらい。

# GOMAXPROCS

重い計算をたくさんさせて、GOMAXPROCS を変えると実行時間がどう変わるか。

```go:go
package main

import (
	"math"
)

const nof_chans = 10000
const loop = 100000

func main() {
	var res [nof_chans]chan float64
	for i := 0; i < nof_chans; i++ {
		res[i] = make(chan float64)
	}
	for i := 0; i < nof_chans; i++ {
		go func(i int) {
			r := 0.0
			for c := 0; c < loop; c++ {
				r = math.Sin(r + float64(i))
			}
			res[i] <- r
		}(i)
	}
	for i := 0; i < nof_chans; i++ {
		<-res[i]
	}
}
```

何の意味もない計算ですいません。

で。結果は下表。

|GOMAXPROCS|real|user|
|--:|--:|--:|
|1|31.03|30.87|
|2|16.16|32.06|
|3|10.74|31.82|
|4|8.16|32.04|
|5|6.67|32.61|
|6|5.68|32.99|
|7|4.95|33.27|
|8|4.49|33.39|
|9|4.46|33.4|
|10|4.55|33.39|
|100|4.43|33.41|
|1000|4.64|34.21|

マシンは MacBook Pro (Retina, 15-inch, Mid 2015)。コア数4。
表を見るとコア数が 8 に見えるけど、ハイパースレッディングとかそういうことかな。

9章のメモはここまで。
WindowsのPython3(x64)におけるpipのエラー

# python3のpipについてのメモ
- 今回、pythonにchainerを入れようとしてエラーが出たので、その対策のメモ
- 64bitのpython3でしか試していないので、他はどうなるかわかりません。
- 私のpythonの環境はAnacondaです。

# エラー内容
- 次のようなエラーが出てきた。

Exception:
Traceback (most recent call last):
  File "c:\programdata\anaconda3\lib\site-packages\pip\compat\__init__.py", line 73, in console_to_str
    return s.decode(sys.__stdout__.encoding)
UnicodeDecodeError: 'utf-8' codec can't decode byte 0x83 in position 95: invalid start byte

During handling of the above exception, another exception occurred:
・・・
・・・（長いので省略）

- 調べてみるとpipのバージョンが9らしく、エラーが出ているというようなこと。
- pipの10をダウンロードすることで改善されるよう。
- コマンドは以下の通り。

　　python -m pip install -U https://github.com/pypa/pip/archive/master.zip


- これで、pipが10になったと思うので、再度チャレンジ。
- きちんとインストールできたようです。
- これからchainerを触っていきたいと思います。
Qiita の投稿からスニペットを取り出す

BeautifulSoup を使って Qiita の投稿からスニペットを取り出します。最初のスニペットだけを取り出します。

```py:get_qiita.py
#! /usr/bin/python
# -*- coding: utf-8 -*-
#
#   get_qiita.py
#
#                   Apr/13/2018
#
# ------------------------------------------------------------------
import requests
import sys
from bs4 import BeautifulSoup
#
url = sys.argv[1]
sys.stderr.write("*** 開始 ***\n")
#
try:
    response = requests.get(url=url)
    html=response.text
    try:
        result = BeautifulSoup(html, "html.parser")
#
        span = result.find(class_='code-lang')
        if (hasattr(span,'text')):
            sys.stderr.write(span.text + "\n")
#
        span = result.find(class_='highlight')
        if (hasattr(span,'text')):
            print(span.text)
#
    except Exception as ee:
        sys.stderr.write("*** error *** in BeautifulSoup ***\n")
        sys.stderr.write(str(ee) + "\n")
#

except Exception as ee:
    sys.stderr.write("*** error *** in requests.get ***\n")
    sys.stderr.write(str(ee) + "\n")
#
sys.stderr.write("*** 終了 ***\n")
# ------------------------------------------------------------------
```

実行方法

```bash
#
URL="https://qiita.com/ekzemplaro/items/01f735d7fd83d160c8dc"
#
./get_qiita.py $URL
```
ATOM を Proxy環境下で使うためには

# 目的
- ATOMをProxy環境下で使用したい

# 環境
- Windows 10 Enterprise 2016 LTSB 64bit
- ATOM 1.17.0

# Proxy 設定
1. コマンドプロンプト 若しくは Windows PowerShell を起動
2. 下記コマンドを入力

```
apm config set http-proxy http://USERID:PASSWORD@proxy.co.jp:port
apm config set https-proxy http://USERID:PASSWORD@proxy.co.jp:port
apm config set strict-ssl true
```

【参考】参照系コマンド

```
apm config get http-proxy
apm config get https-proxy
apm config get strict-ssl
```

# 参考にさせていただいたサイト
[ATOM を Windows + Proxy 環境で使うためのメモ](https://qiita.com/nekotank/items/6106dfcad7c7ed828979) 
[Windows にて Atom の proxy 設定ハマリポイント](https://qiita.com/dskst/items/6153915b658433b02cd3) 
[Atom 1.10でプロキシ設定が楽になったかもしれない](https://qiita.com/falms/items/0eb4721c319bd8ce3a56#ssltls%E3%81%AE%E3%82%A8%E3%83%A9%E3%83%BC%E7%84%A1%E8%A6%96)
PHPからhtml、javascriptへの変数、配列の受け渡し

##はじめに

PHPプログラムからhtml、javascriptへの配列の渡し方について記載します。

###HTML

①PHPで宣言した変数をechoを使い出力する。

```php

<?php
 $php_test = "test";
?>

<html>
　<head>
　</head>
　<body>
　　php変数、<?php echo $php_test; ?>出力
　　php変数(htmlspecialchars)、<?php echo htmlspecialchars($php_test, ENT_QUOTES, 'UTF-8');?>出力
　</body>
</html>

```

上記の方法で出力出来ますが、PHPの変数を直接HTMLに入れてしまうと[XSS(クロスサイトスクリプティング)](http://viral-community.com/blog/xss-1835/)の標的になってしまう事があります。
「[htmlspecialchars](http://php.net/manual/ja/function.htmlspecialchars.php)」を使いサニタイズ処理をすることでXSSの対策が出来ます。
表示したい文字列に「改行文字」などがある場合は改行されずに「改行文字」が表示されてしまいます。
その場合は、「[nl2br](http://php.net/manual/ja/function.nl2br.php)」、「replace」、PHPからの変数の出力部分のみjavascriptを無効化する処理を入れるなどの対策で対応可能です。

###javascript

①PHPで宣言した変数をそのまま入れる。

```php

<?php
$php_test = "test"
?>

<script>
var  js_test = <?php echo $php_test; ?>
var  js_test2 = <?php echo htmlspecialchars($php_test, ENT_QUOTES, 'UTF-8');?>
</script>

```
上記の方法で出力出来ますが、JavaScriptに対してPHPには「htmlspecialchars」のように簡単なサニタイズ処理が出来る機能がありません。

下記のサイト様にjQueryを使っていますが、JavaScriptで「htmlspecialchars」を使う方法が記載されています。
[jQueryでPHPのhtmlspecialchars()使う方法！](http://senoway.hatenablog.com/entry/2013/05/31/235051)


②json_encodeを使う

```php

<?php

 $php_test = "test"
 $json_test = json_encode( $php_test , JSON_HEX_TAG | JSON_HEX_AMP | JSON_HEX_APOS | JSON_HEX_QUOT);
) ;

 $list = {"1","2","3"}
 $json_list = json_encode( $list , JSON_HEX_TAG | JSON_HEX_AMP | JSON_HEX_APOS | JSON_HEX_QUOT);
) ;
?>

<script>
 var  js_test =JSON.parse('<?php echo $json_test; ?>');

 var  js_list =JSON.parse('<?php echo $json_list; ?>'); 
</script>

```

json_encodeを使ってPHPとJavaScriptの変数の受け渡しをします。
jsonを使ったXSS対策については、下記のサイト様に詳しく乗っています。

[JSONのエスケープ](https://blog.ohgaki.net/json-escape)


③implode(文字列成形)
implodeを使い配列を文字列に変換して、PHPからJavaScriptに渡す方法もあります。
しかし、「json_encode」でも配列の受け渡しは出来るため、こちらの方法で受け渡す意味は無いと思います。

###まとめ

PHPはサーバーサイドですので、基本的にPHPで作った変数は全てhtmlやJavaScriptに渡す事が出来ます。
逆にJavaScriptで作った変数をPHPに渡したい場合はajaxなどを使わないといけません。
PHPから変数を渡すときは、セキュリティについて、考えながら渡すことが大事だと思います。

参考サイト
[PHPでJSONのデータを処理する方法](https://syncer.jp/how-to-use-json)
指示関数を代理損失で置き換えるという素晴らしいテクニック

## はじめに

指示関数$I$は以下で定義される．

```math
I(x) = \left\{\begin{array}{ll}
1 \ (x = true) \\
0 \ (x = false)
\end{array}\right.
```

この指示関数は，こんなものを最適化したい！というものを表す時に便利に使える．しかし，こいつは，連続ではない．どうしたものか...，という人に向けた記事です笑．

## 代理損失

この記事では以下の形をした指示関数を考える．

```math
I(u > 0)
```

これを連続な関数にするために，代理損失を導入する．ここでは，ヒンジ損失と，ロジスティック損失を紹介する．

ヒンジ損失は以下のように定義される．

```math
\max\{0, 1 - u\}
```

ロジスティック損失は以下のように定義される．

```math
\log \left(1 + e^{-u}\right)
```

これらは主に分類のための損失．回帰の場合はどうするんだ？とにかく，以下の形で表そう．

```math
I(u > 0)
```

入力を$x \in \mathcal{X}$, 出力を$y \in \mathcal{Y}$，モデルを$f: \mathcal{X} \rightarrow \mathcal{Y}$とする．エラーを$\epsilon$以下に抑えるという以下のような形はどうだろう？

```math
I(|y - f(x)| < \epsilon) = I(\epsilon - |y - f(x)| > 0)
```

おお，これで例の形で表せた．じゃあ，ヒンジ損失を使ってみよう．

```math
\max\{0, |y - f(x)| - \epsilon\}
```

はい，かの有名な$\epsilon$-insensitive lossが出来上がりました．世の中の有名なロスはこうやってできてるんですね．素晴らしい．

## 応用: Recommendation
応用例を一つご紹介します．Recommendationです．ユーザ$u \in U$とアイテム$i \in I$を考える．implicitなフィードバック$D \subseteq U \times I$が与えられたとする．そして，ユーザ$u$にとってポジティブなアイテム集合を$I_u^{+} = \\{i | (u, i) \in D\\}$とする．最後に$D_s = \\{(u, i, j) | u \in U, i \in I_u^{+}, j \in I \setminus I_u^{+}\\}$とすれば，これがペアワイズ学習でよく使われる学習データ．要は，ユーザ$u$にとって，アイテム$j$よりアイテム$i$の方が好きというデータセットだ．

ここで，学習基準を導入する．ユーザ$u$にとってのモデル$f: U \times I \rightarrow \mathbb{R}$の良さは例えば以下のように表せるだろう．

```math
AUC(u) = \frac{1}{|I_u^{+}||I \setminus I_u^{+}|}\sum_{i \in I_u^{+}} \sum_{j \in I \setminus I_u^{+}} I(f(u, i) - f(u, j) > 0)
```

（指示関数が出てきている．ワクワクする．）

これを全ユーザで平均しよう．

```math
\begin{align*}
AUC &= \frac{1}{|U|} \sum_{u \in U} AUC(u) \\
&= \frac{1}{|U||I_u^{+}||I \setminus I_u^{+}|} \sum_{(u, i, j) \in D_s} I(f(u, i) - f(u, j) > 0)
\end{align*}
```

要はこれが高い方が良いわけで，これを最大化しよう，となる．さて，指示関数は連続じゃないので扱いづらいが，例の形で指示関数が出てきているので我々には代理損失というものがある．まずはヒンジ損失で置き換えてみよう．

```math
\begin{align*}
AUC 
&= \frac{1}{|U||I_u^{+}||I \setminus I_u^{+}|} \sum_{(u, i, j) \in D_s} \max\{0, 1 - f(u, i) + f(u, j)\}
\end{align*}
```

これは例えば確率的勾配法とかで最適化できそう．$f$にMatrix Factorization (MF)を採用すれば，Maximum margin matrix factorization (MMMF)になるぽい．次にロジスティック損失で置き換えてみよう．

```math
\begin{align*}
AUC 
&= \frac{1}{|U||I_u^{+}||I \setminus I_u^{+}|} \sum_{(u, i, j) \in D_s} \log\left(1 + \exp\left(f(u, j) - f(u, i)\right)\right)
\end{align*}
```

これは勾配法や確率的勾配法で最適化できそう．多分後者はBayesian Personalized Rankingとかになる．

## おわりに
このように，指示関数は，「こんな感じのもの」を定義するときにかなり便利に使える．例えば応用例に出したAUCなど．そしてそれを連続にして最適化手法を使えるようにするには，代理損失を使えばいい．このアイデアは多くのアルゴリズムを生み出していて，本当に素晴らしいと感じたので，メモがてら共有させていただきました．読んでいただきありがとうございました．
VSCodeのESLintで出るエラーを解決する

昨日からVSCodeとESLintを使い始めました。

その時、エラーが出たので対処法を書いておきます。

## 環境
macOS 10.13
VSCode 1.22.1

## 出たエラー
```
[Info  - 04:34:53] ESLint server is running.
[Info  - 04:34:54] ESLint library loaded from: /Users/mimikun/.anyenv/envs/nodenv/versions/9.11.1/lib/node_modules/eslint/lib/api.js
[Error - 04:34:55] Failed to load plugin import: Cannot find module 'eslint-plugin-import' Referenced from: /Users/mimikun/GitRepo/react_native_tutorial/the_basics/.eslintrc.yml
[Info  - 04:35:48] ESLint library loaded from: /Users/mimikun/GitRepo/react_native_tutorial/the_basics/node_modules/eslint/lib/api.js
```

## やったこと
**Failed to load plugin import: Cannot find module 'eslint-plugin-import' Referenced from:**

で検索した

## 解決方法

```
yarn add eslint
```

これでエラーは出なくなった。
R備忘録 #ggplot2

#ggplotの参考サイトまとめ

#Histgramが描きてえ．
*biostatistics: ggplot2 でヒストグラムを描く方法*
https://stats.biopapyrus.jp/r/ggplot/geom_histogram.html

##なんかちまちま変えたい．
*もうカツ丼はいいよな：ggplotで凡例のラベルと項目名を操作する*
http://rion778.hatenablog.com/entry/2016/01/11/213931

##なんかいい感じの色を探したい．
*ColorBrewer*
http://colorbrewer2.org/


##画像から色を抽出したい．
*イメージカラーピッカー*
https://lab.syncer.jp/Tool/Image-Color-Picker/
LaTeX備忘録 #Reference

#文献を出すには
１. `.bib` ファイルをつくる

２. コマンドに以下を書く

`\bibliographystyle{jplain} % 引用の形式を指定 ` 
`\bibliography{ファイル名} % 引用ファイル（ファイル名.bib）`

３. platex→bibtex→platexの順でコンパイル．
　（※CloudLaTeXなら，platex→uplatex→platex）

４. ちゃんと文章中で`\cite{}`する（しないとでてこないよ！）．

以上．


#参考文献
*Cloud LaTeX: ヘルプ（よくあるご質問）*
https://cloudlatex.io/help?locale=ja

*経済学におけるBibTeXの利用*
http://shirotakeda.org/ja/tex-ja/bibeco-ja.html
Unity素材おすすめサイト集

##Unity公式リファレンス(参照サイト)
https://docs.unity3d.com/ja/current/Manual/UnityManual.html
Unityが公式で出している各機能、コードの説明サイトです。
まずはこのサイトで解決しないかチェックしてみましょう。自分のエラーを検索していてもこのサイトに行き着くことは多いです。

#デザイン便利ツール/サイト
Unityゲームの作成では、システムを作った後にそのゲームをどのようにデザインするかが非常に重要になってきます。
以下にそれらを行う際に役に立つ主な無料ツール/サイトを紹介していきます。
もちろんここにあるもの以外にも、無料有料問わず良いものたくさんはあるので、自分でも探してみて自分に合うものを使っていきましょう！

##画像系おすすめサイト
NAVERまとめ（このまとめにかなりまとまってます）
https://matome.naver.jp/odai/2136583007827634301

##フォント(フリー)
FONT FREE
http://fontfree.me

おすすめフリーフォントまとめサイト(100選)
https://ferret-plus.com/7614

FONT BEAR(フリーフォント検索サイト)
https://fontbear.net

##音源(フリー)
魔王魂（曲、BGM,効果音）
http://maoudamashii.jokersounds.com/

甘茶の音楽工房（BGM）
http://amachamusic.chagasi.com/
　
効果音ラボ（効果音）
http://soundeffect-lab.info/

FREE BGM
https://dova-s.jp

musmus
http://musmus.main.jp


##2D素材作成
###ドット絵メーカー
http://neutralx0.net/dot/

###Gimp
ダウンロード↓
https://www.gimp.org
基本的な使い方↓
https://synclogue-navi.com/category/gimp

##3D素材作成
###マジカボクセル
ダウンロード↓
https://ephtracy.github.io
基本的な使い方↓
http://megumisoft.hatenablog.com/entry/2015/09/16/230139
###blender
ダウンロード↓
https://www.blender.org/download/
基本的な使い方↓
http://blender-cg.net

###3DC（3Dモデル作成ツール）
ダウンロード↓
https://3dc.io
ImageMagick で HEIF 画像を読む方法 (Delegate 方式で)

少々強引な方法ですが、ImageMagick で HEIF 画像を読む方法です。
iPhone7 以降の機種で iOS11 が入っていると HEIC 拡張子のファイルが出来る事があります。
これが HEIF 画像で、JPEG の地位を奪おうという野心溢れる次世代の画像フォーマットです。

# はじめに注意

2018年1月下旬リリースの ImageMagick-6.9.9-34,-7.0.7-22 で HEIF 読み込みに対応しているので、そのバージョンまで上げると、この記事で紹介する設定(1行追加)は邪魔になります。その時は忘れずに設定を消して下さい。自信がない時はこの記事を見なかった事にして頂けるとありがたく。。

<del>ImageMagick に入った HEIF 対応コード(coders/heic.c)は iPhone が出力した HEIC ファイル以外は全く読めない状態です(item_id が 1 から順に採番される仮定を置いてるのが厳しいのと、多分タイル仕様決めうちでデコードしてそう)。今のところこの記事の方法が良い気がします。</del>

## 2019年4月追記

2018年6月頃に HEIF 読み書き独自実装をやめて libheif を利用するようになったので、この記事の存在価値はなくなったかもしれません。2019年4月時点でも絶賛改善中なので、なるべく新しいバージョン推奨。せめて brand 解釈が直った 2018年10月以降のバージョンを使った方が良さそうです。

# Delegate

ImageMagick は自身が対応してない画像フォーマットでも Delegate と呼ぶ仕組みで外部コマンドを呼び出して画像の読み書きが出来ます。
libde265 で有名な struktur AG さんが公開している libheif レポジトリに含まれる heif-convert コマンドを使うと HEIF 画像を JPEG や PNG に変換出来るので、これを利用します。

- https://github.com/strukturag/libde265
- https://github.com/strukturag/libheif

libde265 と libheif のビルドはこちらを参考にして下さい。

- libheif の heif-convert コマンド
  -  https://qiita.com/yoya/items/4c067ed5a7cb38ab25d1

```
% which heif-convert
/usr/local/bin/heif-convert
% heif-convert IMG_0001.HEIC output.JPG
File contains 1 images
% heif-convert IMG_0001.HEIC output.PNG
File contains 1 images
% 
```

さて、設定ファイルでこれに繋げてみます。

# ImageMagick の設定ファイル

設定ファイルの置き場所は -list configure で分かります。

```
% convert -list configure | grep CONFIGURE_PATH
CONFIGURE_PATH /usr/local/etc/ImageMagick-7/
% 
```
この中の delegate.xml を編集します。元の delegate.xml ファイルはバックアップして残した方が良いでしょう。

# delegate.xml

入力画像に *.heic ファイルを指定されたら heif-convert で PNG に変換する。というルールを追加します。

```
<delegatemap>
  <delegate decode="heic" command="&quot;heif-convert&quot; &quot;%i&quot; &quot;%o.png&quot; ; /bin/mv &quot;%o.png&quot; &quot;%o&quot;"/>
```
delegatemap の先頭に１行追加するだけです。

このエントリの command のエスケープを解くとこうなります。

```
'heif-convert' '%i' '%o.png' ; /bin/mv '%o.png' '%o';
```
Delegate のルール記述は %i に入力画像、%o に(ImageMagickに渡す)出力画像を指定すれば良いのですが、これらは一時ファイルとしてランダムなファイル名となり拡張子が付きません。heif-convert は拡張子を見て出力を PNG か JPEG で切り替えるので、一旦 .png を付けたファイルで変換して、改めて %o にファイル名を変えます。

# 結果

```
% convert IMG_0085.HEIC IMG.jpg
File contains 1 images
Written to /var/folders/t9/4(略)n/T/magick-6(略)F.png
% identify IMG.jpg
IMG.jpg JPEG 4032x3024 4032x3024+0+0 8-bit sRGB 1836300B 0.000u 0:00.000
% identify IMG_0085.HEIC
File contains 1 images
Written to /var/folders/t9/4(略)n/T/magick-6(略)P.png
IMG_0085.HEIC PNG 4032x3024 4032x3024+0+0 8-bit sRGB 9800610B 0.000u 0:00.000
% compare IMG_0085.HEIC t.jpg -metric SSIM null:
File contains 1 images
Written to /var/folders/t9/4(略)n/T/magick-6(略)s.png
0.987059%
% 
```
identify が PNG と表示するのは、HEIF のままだと読めないので Delegate を介して PNG にして読んでるからです。

あと、convert で変換するだけなら直接 heif-convert を呼べば良いのですが、compare 等他のコマンドでも HEIF を直接指定出来るのは、大変便利です。
Ansibleを使ってnginxをインストールする

前回（https://qiita.com/takakuda/items/671b25c85378756daa97）
に引き続きAnsibleを使い、nginxをインストールしていきます。以下は作業ログのようなものです。

## 環境
- ホスト PC:Mac
- Ubuntu ver: 16.04.4
- 仮想環境: VirtualBox
- Vagrant: 2.0.3
- ansible: 2.5.0

前回はAnsibleで疎通確認をするところまで行ったので、今回はplaybookを作成していきます。
ansible公式ドキュメント
http://docs.ansible.com/

## playbookとは?
- サーバーの状態を定義したもの

Ansibleのplaybookは、リモートホストの状態を定義したファイルのことです。 ツールの実行が成功した時に、定義ファイルの内容がリモートホストに反映されている状態になります。


前回にVagrantを使い仮想環境でサーバーを2台立て、ホストとなるサーバーにAnsibleをインストールし、疎通確認まで行ったので、今回はnginxのインストールを実行するplaybookを作成する

## playbook

```nginx.yml
---
- name: nginx setup #実行するタスク名
  hosts: all #対象ホスト（今回は特に指定する必要がなかったのでallとした）
  sudo: True　#sudoするかどうか
  roles: #タスクを記述しているディレクトリ
    - role: vagrant_nginx 
```

rolesとは？
- nginxインストールや各種タスクを書いたファイルを配置しておく場所
- `nginx setup`というタスクがplaybookで実行されるとroles/以下のファイルに記載されている各種タスクを実行していく


roles/以下にtasksとtemplate, handlersというディレクトリを作成する
そして各ディレクトリにタスクを記載したファイルを作成していく

## tasks

```roles/vagrant_nginx/tasks/main.yml

- name: nginxの起動ユーザーの追加
  user:
    name: nginx

- name: nginxのインストール
  apt:
    name: nginx
    state: latest
    update_cache: yes
    cache_valid_time: 3600

- name: nginxのサービススタート
  service:
    name: nginx
    enabled: yes

- name: nginx設定ファイルの設置
  template:
    src: nginx.conf.j2
    dest: /etc/nginx/sites-available/default

- name: nginx本体の設定ファイルを変更
  template:
    src: nginx.conf.j2
    dest: /etc/nginx/nginx.conf
  notify:
    - restart nginx
```

## handles
タスクに notify を書いておくと、そのタスクで状態に変更があった場合にそれと対応する handlers が実行される仕組みになっている

```roles/vagrant_nginx/handlers/main.yml
---
- name: restart nginx
  service:
    name: nginx
    state: restarted
```

## templates
- テンプレートモジュールは、指定したテンプレートのファイルを設置する
- テンプレートはJinja2というテンプレート言語で記述される
- 今回はnginxのversionを表示させないようにnginx.confのデフォルトのファイルを編集する

```roles/vagrant_nginx/templates/nginx.conf.j2
# defaultのnginxのnginx.confをそのままコピーしserver_tokenのコメントアウトのみ外しています
events {
        worker_connections 768;
        # multi_accept on;
}

http {

        ##
        # Basic Settings
        ##

        sendfile on;
        tcp_nopush on;
        tcp_nodelay on;
        keepalive_timeout 65;
        types_hash_max_size 2048;
        server_tokens off;
        ....以下省略
```

## playbook実行
playbookを実行します

```
ansible-playbook nginx.yml
```

実行後にansibleで操作対象のサーバーのnginxのversionがちゃんと隠されていないかを確認します

```
$ curl 192.168.100.12
<html>
<head><title>301 Moved Permanently</title></head>
<body bgcolor="white">
<center><h1>301 Moved Permanently</h1></center>
<hr><center>nginx</center>
</body>
</html>
```

ちゃんとかくされてる〜〜！
まだまだわからないことが多い…さらにこれからもキャッチアップを続けていこうと思います。
ありがとうございました！
Google Spread Sheetに紐付いたGoogle Apps Scriptの更新をclaspでするときにglobal関数の追加が反映されない

# claspとは

これまでGoogle Spread Sheetに紐付いたGoogle Apps Scriptの更新はオンラインエディタ以外の方法で更新することができなかった。

[google/clasp](https://github.com/google/clasp)

はそれを解決するツールだ。2018年1月だから比較的最近だ(執筆時2018年4月)

[Google Apps Script をローカル環境で快適に開発するためのテンプレートを作りました](https://qiita.com/howdy39/items/0e799a9bfc1d3bccf6e5)
なんていう記事も出ている。


# Google Apps Scriptの制約

まあ上げだせばきりがないが、最大の制約は、呼び出し可能な関数が

```js
function foo(){}
```

のように`function`キーワードを用いてglobalスコープで定義された関数しか呼び出せない。

当然Google Spread Sheetに紐付いたGoogle Apps Scriptでも同じで、そうでないとGoogle Spread Sheetから呼び出せない。

上の記事のテンプレートでは[gas-webpack-plugin](https://github.com/fossamagna/gas-webpack-plugin)を用いてこれを回避している。

`gas-webpack-plugin`は


```js
function foo(){}
```

のように、`function`キーワードを用いて空っぽの関数を定義し、あとで`global`変数経由で実装を挿入するということをやってくれる。

さあ、`clasp push`すればGoogle Spread Sheetからこの関数を呼び出せるはずだ。

# Google Spread Sheetから呼び出せない

ところがそうは問屋がおろさない。

どうも関数名をGoogle Spread Sheet側でキャッシュしているらしく、`clasp push`してもこのキャッシュが更新されない。**反映するにはオンラインエディタを開いてどうでもいい編集をして一度保存する必要がある**。

![UML sequence](http://www.plantuml.com/plantuml/png/SoWkIImgAStDuKhEIImkqBLppyzFpqbrB2We3aukoYmeiL8eA2tEu8881nSKfIQc16UaffResc48EISMPwHQARoSjkZPr0rFryvuEcV5yqMxNgpgvSAkL1VJ3A1rp-SlVTpK-RXfykEc3Yuqr-2nzN7ZoiUDROyRbpzkQdhHkVvnOylpxIjUpWQAh0OQzBXnyUF6PL2NJUXztDZpic4Mq2PYB02PlGfaJ6FtuyRf8BSrhdisUykpQHk0nZnkR0ARFVznu-J7ZIiUDqs264p700CveQaRw4bCNPZH2RTjufx7ZPkVjky2UWaZ4714pDO9p-RDUR5_ojFUBLmEgNafm5G30000)

雑にUMLのシーケンス図を書くとこんな感じ？(想像です)

# Issue投げた

[Adding global function is not reflected to Google Spread Sheet by clasp push to Apps Script bounded with Google Spread Sheet · Issue #108 · google/clasp](https://github.com/google/clasp/issues/108)

いや、Issueのタイトルからもう英語崩壊しとるから。もうちょっと英語力をですね・・・


# License

[CC BY 4.0](https://creativecommons.org/licenses/by/4.0/deed.ja)

<a href="https://commons.wikimedia.org/wiki/File:CC-BY_icon.svg#/media/File:CC-BY_icon.svg"><img src="https://upload.wikimedia.org/wikipedia/commons/thumb/1/16/CC-BY_icon.svg/1200px-CC-BY_icon.svg.png" alt="CC-BY icon.svg" width="88px"></a>
環境構築ubuntu 16.04(gpu)にkerasを入れるまで

今更かもしれないが、久しぶりに環境構築したら躓いてしまったので、メモメモ

##1.anacondaを入れる
pyenv以外の方法でやるとだれてしまう
この時tensorflowとkerasはまだ入れない

https://qiita.com/neet-AI/items/f5f4aba3bfefef7a7d10

##2.cudaとcudnnを入れる

https://qiita.com/JeJeNeNo/items/05e148a325192004e2cd

ここで最新バージョン(var9.0以上)をインストールしてしまうのはご法度

##3.tensorflow-gpuとkerasをいれる
最新版(var1.5以上)のtensorflowはなにかとエラーを起こす。

```
$ pip install --upgrade --ignore-installed tensorflow-gpu==1.4
```
ここが一番厄介だった
--upgrade：指定のバージョンへダウングレード
--ignore-installed：anacondaではこれを入れないと指定したモジュールを入れられない

```
$ pip install keras
```

久しぶりの投稿ですね。
Promise で resolve/reject が呼ばれても処理は中断しない

またしても Promise まわりの勘違いにより、どハマリしたので書いておく。

## `resolve()` や `reject()` が呼ばれただけでは処理は中断しない

```js
new Promise((resolve, reject) => {
    console.log('before');
    resolve();
    console.log('after');
})
    .then(() => console.log('then'))
    .catch(() => console.log('catch'));

```

```:実行結果
before
after
then
```

---
```js
new Promise((resolve, reject) => {
    console.log('before');
    reject();
    console.log('after');
})
    .then(() => console.log('then'))
    .catch(() => console.log('catch'));

```

```:実行結果
before
after
catch
```

どちらの例もバッチリ `console.log('after')` が実行されている。

## 対策

`resolve()` / `reject()` の呼び出しと一緒に `return` しておく。

```js
new Promise((resolve, reject) => {
    console.log('before');
    return resolve();
    console.log('after');
})
    .then(() => console.log('then'))
    .catch(() => console.log('catch'));

```

```:実行結果
before
then
```

これで `console.log('after')` は実行されない。

## 【余談】`resolve()` と `reject()` を両方呼ぶとどうなるか

```js
new Promise((resolve, reject) => {
    console.log('before');
    resolve();
    reject();
    console.log('after');
})
    .then(() => console.log('then'))
    .catch(() => console.log('catch'));

```

答えは先に呼ばれたもの勝ち。

後から呼ばれた `reject()` の `catch()` の処理は実行されない。


```:実行結果
before
after
then
```
ReactのエラーリンクをVisual Studio Code で開くようにする(又は特定のエディタにする)

- 環境: OS X

下記の様なエラー画面から任意のエディタを開く方法(この記事ではVisual Studio Code)
![スクリーンショット 2018-04-13 1.18.51.png](https://qiita-image-store.s3.amazonaws.com/0/59518/4ad59690-17b0-8bb1-622c-906811fc3405.png)

# VisualStudioCode を Shell から起動できるようにする

- `Shift + Cmd + P` から `'code' コマンドをインストールします` を実行
    - https://vscode-doc-jp.github.io/docs/userguide/command-line.html#Command-Line-Interface-CLI (コマンドライン)

![スクリーンショット 2018-04-13 1.21.43.png](https://qiita-image-store.s3.amazonaws.com/0/59518/1c780d80-640b-6ad1-ee58-b258d5bbd145.png)

# 環境変数を追加

```bash:.bashrc|.bash_profile
export REACT_EDITOR=code
```

その後, reactを再起動 (npm start)
Tensorflowにおける非決定的動作とスレッド間同期

Tensorflowで乱数要素がないのに、実行するたびに結果が変わるグラフを意図せず書いてしまい、デバッグに時間を要したので原因と対策を記載する。

毎回動作が変わるグラフの例はこちら。

```python
a = tf.Variable(1, name="a")
b = tf.Variable(10, name="b")

place_a = tf.assign(a, b)
place_b = tf.assign(b, a)

with tf.Session() as sess:
    sess.run(tf.variables_initializer(tf.global_variables()))
    print (sess.run([place_a, place_b]))
```

a,b = 10, 1 と返ってくることを期待してしまうが、実際は[1,1],[10,10]のいずれかの値が返ってくる。
これは、aを更新する計算グラフとbを更新する計算グラフが非同期に(おそらく別スレッドで)実行されているためである。

対策としては、中間変数を作成し、control_dependenciesでa,bが更新される前に確実に中間変数が計算されるようにする。

```python
a = tf.Variable(1, name="a")
b = tf.Variable(10, name="b")

new_a = b + 0
new_b = a + 0

with tf.control_dependencies([new_a, new_b]):
    place_a = tf.assign(a, new_a)
    place_b = tf.assign(b, new_b)

with tf.Session() as sess:
    sess.run(tf.variables_initializer(tf.global_variables()))
    print (sess.run([place_a, place_b]))
```

これで確実にa,b = 10, 1となる。
なお、control_dependenciesを削除すると非決定的な動作になり、うまくいったりいかなかったりする。
new_a = tf.identity(b)としてもうまくいかない。(理由は[tf.identityに関する議論](https://github.com/tensorflow/tensorflow/issues/11186)を参照)

これぐらい露骨な例まで落とすと何が悪いか気付けるが、複雑なグラフ中だと見落とすリスクがある。
tf.assignの利用は常に注意が必要である。
Xubuntu: `xdg-user-dirs-gtk-update`でユーザーディレクトリが英語名になったけど、なぜか`デスクトップ`ディレクトリが英語にならない

# 環境
* Xubuntu 16.04 LST

# やりたいこと
Homeディレクトリ配下の、「デスクトップ」、「ダウンロード」ディレクトリなどのユーザディレクトリを英語名にしたいです。

>ユーザーディレクトリとは Documents, Downloads, Music, Desktop などの $HOME ディレクトリに配置されるユーザー共通のディレクトリのセットのことです。ファイルマネージャの中ではそれぞれアイコンが割り振られ、プログラムやアプリケーションによって参照されることがよくあります。

[XDG ユーザーディレクトリ](https://wiki.archlinux.jp/index.php/XDG_%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E3%83%87%E3%82%A3%E3%83%AC%E3%82%AF%E3%83%88%E3%83%AA) 引用


以下のコマンドを実行しました。

```shell-session
$ LANG=C xdg-user-dirs-gtk-update
```

※ https://qiita.com/matoken/items/1e43b4f446060f64afa1 参考

# 問題

コマンドを実行したら、`Desktop`と`デスクトップ`ディレクトリの両方が存在していました。
`デスクトップ`ディレクトリがユーザディレクトリとして有効でした。


```shell-session
$ LANG=C xdg-user-dirs-gtk-update
Gtk-Message: GtkDialog mapped without a transient parent. This is discouraged.
Moving DESKTOP directory from デスクトップ to Desktop
Moving DOWNLOAD directory from ダウンロード to Downloads
Moving TEMPLATES directory from テンプレート to Templates
Moving PUBLICSHARE directory from 公開 to Public
Moving DOCUMENTS directory from ドキュメント to Documents
Moving MUSIC directory from ミュージック to Music
Moving PICTURES directory from ピクチャ to Pictures
Moving VIDEOS directory from ビデオ to Videos
$ ls
Desktop  Documents  Downloads  Music  Pictures  Public  Templates  Videos  デスクトップ
```

# 原因
よく分かりません。
もしかしたら`デスクトップ`ディレクトリにファイルが入っていて、ディレクトリ名を変更できないから、起きたのかもしれません。
https://forums.ubuntulinux.jp/viewtopic.php?pid=7185


# 解決方法

`xdg-user-dirs-gtk-update`コマンドでなく`xdg-user-dirs-update`コマンドを使いました。

```shell-session
$ LANG=C xdg-user-dirs-update --force
```

https://blog.1q77.com/2013/06/xdg-user-dirs-update/ 参考


# 用語
* [XDG(X Desktop Group)](https://ja.wikipedia.org/wiki/Freedesktop.org)
* [GTK](https://ja.wikipedia.org/wiki/GTK%2B)
これだけ知っていれば何とかなるGitコマンド

Gitはいろいろコマンドがありますが、最低限これだけ知っていればなんとかなるコマンド紹介
これ以外は困ったときは誰かに聞くでなんとかなります。

ちょっと正確ではないですが、
Gitは**ローカルリポジトリ**と**リモートリポジトリ**と2つのリポジトリがあります。

- リモートリポジトリ：全員で共有するリポジトリ
- ローカルリポジトリ：自分のみが使用するリポジトリ

モジュールを修正してから取り込む流れはだいたい下記の通り
1. ローカルリポジトリに変更を反映
2. ローカルリポジトリにコミット
3. リモートリポジトリの内容をローカルリポジトリに取り込む
4. ローカルリポジトリの変更内容をリモートリポジトリに反映

```
git add .
```

ローカルリポジトリに変更を反映(削除ファイル反映されない)
ファイルを指定する場合は　`git add test.txt` という感じ

```
git diff HEAD [ファイル名]
```

修正前との差異を表示

```
git rm [ファイル名]
```

ローカルリポジトリからファイル削除

```
git commit -m "コミットメッセージ"
```

ローカルリポジトリにコミット
GitLabなどを使っているとコミットメッセージは**#issue番号**とよく書きます

```
git pull origin [ブランチ名]
```
リモートリポジトリの内容をローカルリポジトリに取り込む

```
git push origin [ブランチ名]
```
ローカルリポジトリの変更内容をリモートリポジトリに反映
`git push origin master`

```
git checkout -b [ブランチ名]
```
ブランチを作成する

### 履歴確認系だと

```
git log 
```
履歴を表示

```
git log -p [ファイル名]
```
指定したファイルの履歴を表示

```
git show [コミット番号]
```
指定したコミット番号で変更したファイルの差異を表示

### ちょっと難しめのコマンドだと
よくあるのが、まだプログラムの途中だけど緊急の不具合対応や仕様変更をやる場合

```
git stash 
```
コミットされていないファイルを退避する
addも含まれる

```
git stash pop
```
退避したファイルを取り出す
退避していたファイルはstash領域から削除される

```
git stash apply
```
退避されたファイルを取り出す
退避していたファイルはstash領域に残る
EC2上のmysqlにSequelProから接続

#　EC2のRDSを設定せずにEC2インスタンス上のmysqlにSequelProからつなぐ方法。

## スクリーンショット
![スクリーンショット 2018-04-13 0.26.45.png](https://qiita-image-store.s3.amazonaws.com/0/243313/b40cee98-dd81-f527-8246-eb33f760af91.png)
## 簡易説明
### SSHのタブで下記設定をする。
名前：てきとー
MySQL ホスト：127.0.0.1
ユーザ名：root
パスワード：ご自身で作成したMySQLのrootユーザのパスワード
データベース：未記入
ポート：未記入
SSHホスト：EC2で設定した'Elastic IP'
SSHユーザ：ec2-user
SSH鍵：ご自身が保持しているEC2インスタンスの秘密鍵（○○.pem）を選択
SSHポート：未記入
SSLを使用して接続：チェック入れない

これで繋がりましたー！
HTMLのinputにカレンダーから日付を入力

管理画面などで見かける日付入力時に出てくるカレンダーですが、
今までJavaScriptなどを使わないとできないと思っていました。

HTML5ではinputタグのtype属性にdateを指定するだけで、
カレンダーを出せるみたいです。

```html:サンプル
<!DOCTYPE html>
<html lang="ja">
  <head>
    <title>test</title>
  </head>

  <body>
    <!-- 日付入力 -->
    <input type="date"></input>
  </body>
</html>
```
よくある入力欄
![2018-04-12_23h27_48.png](https://qiita-image-store.s3.amazonaws.com/0/200585/ad5bc92c-dc72-c29c-13a0-479d5c90f314.png)
カレンダー出たー！
![2018-04-12_23h14_36.png](https://qiita-image-store.s3.amazonaws.com/0/200585/4621cb1d-6091-d644-61ef-b6d30631563a.png)
選択できたー！
![2018-04-12_23h28_06.png](https://qiita-image-store.s3.amazonaws.com/0/200585/bc1eb3f4-78fa-e864-4b00-962926ccd4bf.png)

min属性やmax属性を追加して最小値最大値も指定できるっぽい。

```html:サンプル2
<!DOCTYPE html>
<html lang="ja">
  <head>
    <title>test</title>
  </head>

  <body>
    <!-- 日付入力 -->
    <input type="date" min="2018-04-08" max="2018-04-14"></input>
  </body>
</html>
```

灰色になって選択できなーい！(ちょっと薄い・・・)
![2018-04-12_23h38_31.png](https://qiita-image-store.s3.amazonaws.com/0/200585/aebb76ed-002a-5329-e272-6cdcff4b6a1d.png)

管理画面のMock制作中に調べていたら、これを見つけて驚きました。

これまでフロント側を作る機会がなかったので、
これからはフロント側もちょっとは勉強しようかなぁ。
はやりのjsとかとか。。

ところで、後述のmozillaのドキュメントですが、
ページ内でお試し実行できるようになったんですね。
これにも驚きました。便利な時代だ。

以上です。

参考：
https://developer.mozilla.org/ja/docs/Web/HTML/Element/Input/date
http://www.htmq.com/html5/input_type_date.shtml
Windows で system.cpu.discovery やってみた

#はじめに

しばらくずっとデスクトップＯＳは Linux でしたが、およそ十年ぶりに Windows の常用を始めました。
CPU の使用率が気になりました。
Zabbix で記録することにしました。

#Zabbix の CPU LLD について

CPU LLD は Zabbix 2.4 から使用可能になりました。キーは system.cpu.discovery です。もちろんアイテムタイプは Zabbix Agent です。
https://www.zabbix.com/documentation/2.4/manual/discovery/low_level_discovery#discovery_of_cpus_and_cpu_cores

#プロトタイプ
##アイテム

とりあえず下記でデータを集めてます。

|No|Name|Key or Param|
|:--|:--|:--|
|1|CPU {#CPU.NUMBER} idle time|perf_counter[\Processor({#CPU.NUMBER})\% Idle Time]|
|2|CPU {#CPU.NUMBER} busy time|100-last("perf_counter[\Processor({#CPU.NUMBER})\% Idle Time]")|

どっちかというと non idle の値が見たいです。
あと、マニュアルでは perf_counter[] のパラメータは "" で囲ってありますが、計算アイテムで使う時に訳がわからなくなるので、省略しました。

##グラフ
できればタスクマネージャのようにコアを並べてグラフを見たいんですけど、そこは LLD の範疇の外なので、今回はグラフ・プロトタイプも作ってスクリーンに挿入できるようにしています。
（スクリーンに挿入できるグラフは、定義済みグラフだけ。残念。）

なお、上記アイテムを合算しても 100 になりませんが、気にしないことにします。

#まとめ
作業用ＰＣの CPU は滅多に交換されないので LLD のメリットは多くはない気がします。ただ８スレッドもあるとアイテムの修正も結構面倒なので LLD にやってもらうことにしました。
少し冗長という気もしますが、楽でよいです。
WebSocketとは？

# はじめに
Http通信での実現が難しい双方向通信を可能とする通信プロトコル「WebSocket」について調べてみたのでまとめました。

#WebSocketって？
Wikipediaによると
>WebSocket（ウェブソケット）は、コンピュータネットワーク用の通信規格の1つである。ウェブアプリケーションにおいて、双方向通信を実現するための技術規格である。

とある。要するに双方向通信が可能な通信プロトコル、ということらしい。

#双方向通信
では双方向通信とは何か？
ブラウザからアクセスする一般的なWebアプリでは、クライアントからサーバにリクエストを送り、サーバがクライアントに結果をリターンする、というのが主な流れだと思います。
これを逆にして、クライアントからのリクエスト無しにサーバからクライアントへの通信も行う事を双方向通信と言います。

#どんな時に使う？
基本的にWebアプリではクライアント⇒サーバの通信だけで問題ないのですが、リアルタイム表示（チャットなど）を行いたい場合には、サーバからクライアントへの送信が必要となります。
双方向通信を用いない場合、クライアントから一定時間毎にサーバへ更新の有無を確認する通信を飛ばす等のやり方となってしまいますが、双方向通信を使えばデータに変更があったタイミングでサーバからクライアントに向けて通信を行い、画面に表示するということが可能となるのです。

#Websocketの仕組み
WebSocketは以下の手順で双方向通信を実現しています。

1.Httpを使ってクライアント・サーバー間で通信を行い、コネクションを確立
2.以降は確立されたコネクション上で通信を行う

順番に説明していきます。

##1.コネクション確立
はじめに、クライアントからサーバーに向けて以下のようなリクエストが送られます。
`
GET /resource HTTP/1.1
Host: xxxxx.com
Upgrade: websocket
Connection: upgrade
Sec-WebSocket-Version: 13
Sec-WebSocket-Key: xxxxxxxxxxxxxx`

見て気付く人もいると思いますが、Httpのリクエストと同じ構造でWebSocketの通信も行われています。
注目すべきはUpgradeヘッダやConnectionヘッダの存在です。この2つのヘッダでHttpプロトコルからWebSocketプロトコルへアップグレードすることを表現しています。
また、Sec-WebSocket-VersionヘッダはWebSocketプロトコルのバージョンを表していて、サーバ側で送られてきたバージョンに対応出来なければ切断、という制御をしているらしい。
Sec-WebSocket-Keyはクライアントで生成された値で、この値を基にサーバ側でキー値を生成してクライアントに返却することで、クライアント側は自分のリクエストに対するレスポンスであることを確認することができる。
このリクエストに対してサーバからは以下のようなレスポンスが返却される。
`
HTTP/1.1 101 OK
Upgrade: websocket
Connection: upgrade
Sec-WebSocket-Accept: yyyyyyyyyyyyyyyy`

リクエストと同じくHttp形式でのレスポンスとなっています。
Upgradeヘッダ、Connectionヘッダもリクエストと同様に設定されていて、最後のSec-WebSocket-Acceptヘッダが先ほど説明したサーバで生成したキー値となっている。

このやり取りをした時点でWebSocketのコネクションは確立されます。

##2.双方向通信
コネクションが確立されると、以降はTCP上で双方向通信が可能となります。
その時の通信単位は**フレーム**と呼ばれる単位で行われて、詳しい説明は割愛しますが小さい単位でデータのやり取りが可能となります。
(詳しくは[こちら](https://triple-underscore.github.io/RFC6455-ja.html#section-5)に記載されています）

#どうやって使う？
WebSocketはコネクションを同時にいくつも接続状態にするので、Blocking I/Oを持つサーバープロセスでは1プロセスに1コネクションしか持てないのであまり相性が良くありません。
相性が良いのはNon Blocking I/Oを持ち、複数のコネクションを持てるサーバを使うのが一般的となっています。
その中でも最も有名なのはNode.jsで、WebSocketを利用するためのライブラリであるSocket.ioを使えば簡単な双方向通信アプリがすぐに作れてしまいます。

#まとめ
従来の疑似的双方向通信技術を改善した通信方式で、効率よくクライアントとサーバ間の双方向通信を実現してくれるプロトコルであり、対応するサーバも増えているようです。
Node.js + Socket.ioによるアプリ作成も手軽に行えるので興味のある方は試しにチャットアプリなんかを作ってみることをおすすめします。
【まだタイピングで消耗してるの？】PhraseExpressでコードの自動入力！

## まだタイピングで消耗してるの？
プログラマーの三大美徳である「怠惰」

Yahoo!さんのインターン行った時に同じインターン生の凄腕エンジニアの人から「自動入力アツいっスよ！」と勧められて導入してみたら生産性が爆上がりしたのでシェアです！

百聞は一見に如かずということで、こんな感じです
![2018-03-31_02h23_51.gif](https://qiita-image-store.s3.amazonaws.com/0/201242/3d5ddf15-aa72-8090-faf7-8c7fc24e1020.gif)

**すげぇ！！**

## 導入方法
調べてみると、**PhraseExpress**というのがメジャーだそうで。
導入方法は以下のブログで懇切丁寧に解説されています！ありがたや・・・！
[[PhraseExpress]一瞬で10万文字でも!「どこでも瞬間テンプレート呼び出しツール」](https://yossense.com/phrase-express-install/)

上記のリンク見てもらえば分かりますが、コードだけでなく住所やメールアドレスなど、割と何でも登録できるみたいですね。
ちなみに、キーワードに`name`などの通常使われる単語を入れると意図せず変換が発生するため、誤変換を防ぐためにキーワードの末尾に記号を入れておくことを推奨します。
例）
×`keyword` 〇`keyword;;`

私は`;;`にしています。
セミコロン一つだけだと、PHPとか書いてるときに`;`打って変換されるかもしれないので笑

## ちなみにMacでは
[Alfred](https://itunes.apple.com/jp/app/alfred/id405843582?mt=12)がメジャーなようです！
wslでpythonのvenv環境が作れない

wslのUbuntuでPythonのvenv環境を作成しようとするとエラーになる。
解決方法が簡単にググれなかったのでメモを残しておく。

```bash:
$ python3 -m venv xxx
The virtual environment was not created successfully because ensurepip is not
available.  On Debian/Ubuntu systems, you need to install the python3-venv
package using the following command.

    apt-get install python3-venv

You may need to use sudo with that command.  After installing the python3-venv
package, recreate your virtual environment.

Failing command: ['xxx/bin/python3', '-Im', 'ensurepip', '--upgrade', '--default-pip']
```
下記ページを参照すると解決できる。マジすごい。
[WSL の Ubuntu の Python に pip がない](https://va2577.github.io/post/79/)


リンク切れが起きた時のために簡単に手順を残しておく

```bash:
$ python3 -m venv --without-pip testdir
$ cd testdir
$ source bin/activate
(testdir) $ wget https://bootstrap.pypa.io/get-pip.py
(testdir) $ python get-pip.py
```

wls python venvとかで検索するとみんなふつーに出来てるんだけどなんでだろ？
Qiitaの記事一覧をGoogleスプレッドシートに自動取得する

# やりたかったこと

Qiitaの自分の記事一覧をGoogleスプレッドシートに取り込んで集計とかしたかった。

# 方針

- GAS(Google Apps Script)を使ってQiitaのAPIから記事一覧をjson形式で取得
- Googleスプレッドシートに取得したjson形式のデータから必要な物をセット
- GASをトリガ指定して１日１回起動するようにする

# やりかた

- Googleスプレッドシートのメニューから「ツール」→「スクリプトエディタ」を選択
- スクリプトエディタが起動するので下記のスクリプト内容で保存

```javascript
function qiitaReader() {

  var userId = "[対象ユーザーID]";
  var apiUrl = "https://qiita.com/api/v2/users/" + userId + "/items"
  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = spreadsheet.getSheets()[0];

  var keys = {
    'created_at' : "",
    'title' : "",
    'likes_count' : "",
  };  
  
  var response = UrlFetchApp.fetch(apiUrl);
  var total = response.getHeaders()['total-count'];
  
  var page=1;
  var i=1;
  while (i < total) {
    var response = UrlFetchApp.fetch(apiUrl + "?page=" + page);
    var json = response.getContentText();    
    var jsonData = JSON.parse(json);

    for (var idx in jsonData) {
      var j=1;
      for(var key in keys) {
        sheet.getRange(i, j).setValue(jsonData[idx][key]);  
        j++;
      }
      i++;
    }
    page++;
  }
}
```

- メニューから「実行」→「関数を実行」で正しく動作していることを確認
- メニューから「編集」→「現在のプロジェクトのトリガー」を選択
- 「新しいトリガーを追加」で適当なタイミングを設定
- googleスプレッドシート上で取得結果を使って好きなように集計

# 雑記

GAS便利。
アプリ開発する時のtmuxペイン分割の仕方を晒してみる

## はじめに

僕は開発中、ターミナルが住処であることが多く、主にtmuxで何枚かにペイン分割して開発しています。
といっても、tmuxを起動したら自動でペイン分割するようセッティングしているわけではなく、開発しながら逐一ペイン分割・調整しながら使っている感じです。
tmuxは自分好みにペイン分割できるところが気に入ってます。

tmuxの機能や使い方に関する記事はたくさんあるのですが、開発のときにどうやってペイン分割しているかという記事はあまり見かけませんでした。
なので、自分が開発のときにどんな感じでペイン分割しているかを晒してみることにしました。

## 自分のペイン分割の仕方

例として、Railsアプリを開発しているときのペイン分割の仕方を晒しますー
![image.png](https://qiita-image-store.s3.amazonaws.com/0/222030/e885ff3e-ed5b-44f7-5f93-4d59a0034f6c.png)

### ペイン一覧

画像に番号を振ってあるのですが、それぞれの用途はこんな感じです。

1. 開発用エディタ(```Vim```)
2. アプリログのストリーム（```tail -f log/development.log```など）
3. 開発用Webサーバをフォアグラウンドで起動（```rails s```や```webpack-dev-server```など）
4. Linuxコマンド実行（```git```とか```grep```など）
5. アプリのデバッグコンソール用（```rails c```など）

## ペイン分割の意図

以上はRailsアプリの例で書きましたが、他の言語でも基本はこの5つのペインで分けています。
以下にこのペイン分割にした意図を書いておきます。

### ペイン１：開発用エディタは大きめに使いたい

僕は開発エディタは主にvimを使っているのですが、VimFilerで左部にファイラーも表示した使い方をしているので、幅を狭めたペインの使い方はあまりしっくり来ませんでした。

なので幅も高さもなるべく大きめにとって、必要であればVim内で```:sp```とか```:vsp```とかで画面分割するようにしています。

### ペイン２：ログストリームは常時表示させておく

開発のデバッグのために、アプリのログを読むことはとても重要だと思います。

以前は別ターミナルを立ち上げてログを表示していたのですが、複数ターミナルウインドウがあると違和感があったので、エディタの横に常時表示させるようにしました。

情報がtmuxのペイン内に集約された感じが気に入っています。

### ペイン３：Webサーバ起動ペインは最小限に、だがフォアグラウンド表示はする

Railsなどのアプリ開発をするときは、アプリの動作確認などをするためにlocalhostでWebサーバを起動することになると思います。

Webサーバのプロセスはバックグラウンドで動かしたほうがペインのスペースを節約できはするのですが、そうすると日を置いて開発を再開しようとしたときに「あれ、Webサーバ動かしてたっけ？」と迷うことが多かったので、フォアグラウンドで動かすようにしています。

あとはJavaScriptのwebpack-dev-serverなど、ホットリロードされる系のプロセスも、更新されているかが確認できる程度にペインに出しています。

こちらのログ自体はほとんど見ないので、起動だけしていることが分かる程度に小さめにしておいています。

### ペイン４・５：コマンド実行やデバッグコンソールは残ったスペースを使う

残った下部のスペースで、開発に必要なコマンド実行やデバッグコンソールを使うようにしています。

小さめなスペースではあるのですが、案外```git```や```grep```、```rails c```、```psql```など、様々なことができます。
このペインは必要に応じて1つにしたり、3つにしたり、臨機応変に使い分けています。

開発用のエディタを開いたままこのようなコマンドを実行できるのは、自分にとってかなり快適です。

### 終わりに

いかがだったでしょうか。もしもっといい分割の仕方などありましたらコメントいただけるとありがたいですー。