OmniAICreator/Qiita-1.07M huggingface dataset:
VimperatorでQiitaのスライドモードを操作するプラグインを書いた

## TL;DR

  * VimperatorでQiitaのスライドモードを操作するプラグインを書いた
  * ~~プルリクエストを送ったけど、いつマージされるかはわからない~~ マージ済み
  * ~~マージ前に使いたい場合は[kg8m/vimperator-plugins/qiita-slide.js](https://github.com/kg8m/vimperator-plugins/blob/master/qiita-slide.js)をどうぞ~~ [vimpr/vimperator-plugins/qiita-slide.js](https://github.com/vimpr/vimperator-plugins/blob/master/qiita-slide.js)をどうぞ

---

## Qiitaのスライドモードとは

Qiitaの投稿をスライドで表示できるというものです。マークダウンで手軽に書けて便利。詳細は以下をご覧ください。

  * [スライドモード - Qiita](http://qiita.com/Qiita/items/4ff5873776992f0511d6)
  * [スライドモードをリリースしました - Qiita Blog](http://blog.qiita.com/post/146195241579/slide-mode)

---

## きっかけ

自分は普段Vimperatorを使ってますが、何の設定もしていないとQiitaのスライドモードをキーボードで操作できず不便でした。

feedSomeKeys_3.jsで設定してあげればQiitaがデフォルトで提供しているショートカットキーは使えますが……

他のスライド系サービスには[lideshare.js](https://github.com/vimpr/vimperator-plugins/blob/master/slideshare.js)とか[speakerdeck.js](https://gist.github.com/hamaco/4105959#file-speakerdeck-js)があるので、Qiita用のもあると便利かなと。

---

## ステータス

とりあえずプラグイン書いて[vimpr/vimperator-pluginsにプルリクエストを送っておきました](https://github.com/vimpr/vimperator-plugins/pull/115)。管理体制がどうなっているのかわからないのでマージもどうなるかわかりません。あとプラグインの出来が悪いとかでマージされないかもしれません。

とりあえずマージされるより先に使いたいという場合は、[kg8m/vimperator-plugins/qiita-slide.js](https://github.com/kg8m/vimperator-plugins/blob/master/qiita-slide.js)がマージ元のプラグインなのでご利用ください。

（2016/10/08 20:00追記）

マージされました。なので[vimpr/vimperator-plugins/qiita-slide.js](https://github.com/vimpr/vimperator-plugins/blob/master/qiita-slide.js)をご利用ください。

（追記終わり）

---

## プラグインの機能紹介

プルリクエスト見てもらうとかプラグイン読み込んで`:h QiitaSlide-plugin`してもらえばわかると思いますが、ここにも載せておきます。

  * コマンド
  * キーマッピング
  * 設定例

---

## 機能紹介 > コマンド

  * `:QiitaSlide next`
    - 次のスライドに移動する
  * `:QiitaSlide prev`
    - 前のスライドに移動する
  * `:QiitaSlide fullscreen`
    - フルスクリーンのオンオフを切り替える

---

## 機能紹介 > キーマッピング

  * `liberator.globalVariables.qiita_slide_keys_next`
    - 次のスライドに移動するキー（デフォルト: `["l"]`）
  * `liberator.globalVariables.qiita_slide_keys_prev`
    - 前のスライドに移動するキー（デフォルト: `["h"]`）
  * `liberator.globalVariables.qiita_slide_keys_toggle_fullscreen`
    - フルスクリーンを切り替えるキー（デフォルト: マッピングなし）

---

## 機能紹介 > 設定例

vimperatorrcで以下の設定をすると、`l`または右矢印で次のスライド、`h`または左矢印で前のスライドへ移動します。また、`Control`（`Ctrl`）と`Shift`と`f`の同時押しでフルスクリーンのオンオフを切り替えます。

```vimperator
javascript <<JS
liberator.globalVariables.qiita_slide_keys_next = ["l", "<Right>"];
liberator.globalVariables.qiita_slide_keys_prev = ["h", "<Left>"];
liberator.globalVariables.qiita_slide_keys_toggle_fullscreen = ["<C-S-f>"];
JS
```

---

## 注意点

このプラグインは、QiitaのちゃんとしたAPIを叩いているわけではありません。なのでQiita側の仕様変更で動かなくなる可能性があります。

自分は把握できていないのですが、もしスライドを操作する正式なAPIをご存じの方がいたら教えていただけると嬉しいです。

---

## 終わりに

素敵なQiitaライフを！
Rubotyでbot宛てのメッセージじゃなくても反応して欲しくてコードを読んだ話

## 概要
社内で「rubotyってメッセージの文頭にbot名ないと反応してくれないんですか？」
と聞かれたので、これはOSSコミットチャンスか！？
とテンション上がって色々しらべたときのお話。

## 調査
### ドキュメントを読む
ドキュメントを一通り眺めてみる。
それっぽい言葉は無い。
きっと対応していないのだろう。
あんまり用途無いしな。
よ〜し、ちゃんと読んで、きれいに実装するぞ〜！！
そういう気持ちでコードリーディングを開始する。

https://github.com/r7kamura/ruboty

### コードリーディング開始
#### adapter

何度かコードを読んで、大体仕組みは把握している。
仕組みに興味がある人はtbpgrさんの、このあたりの投稿を読まれると良いだろう。

- http://qiita.com/tbpgr/items/7f08569dd8828bae6527
- http://qiita.com/tbpgr/items/5887003cd2e69e9d8867


メッセージ周りは、adapterを読めば良いのだろう。
adapterは、chat toolとrubotyをつなぐためのプラグインである。
今回はshell.rbを読んでいく。


```ruby:lib/ruboty/adapters/shell.rb
  def listen
    step until stopped?
  rescue Interrupt
    stop
  end

  def step
    case body = read
    when "exit", "quit", nil
      stop
    else
      robot.receive(body: body, source: SOURCE)
    end
  end
```

ふむ。全てのメッセージをrobot.receiveで受け取っているらしいな。
ということは、メッセージの文頭にbot名無くても大丈夫そう。
次は、robot.rbを読もう。

#### robot.rb 
robot.rbのreceiveを読む。
どうやら、handlersを総なめして、条件にヒットしたものをcallしてるらしい。
ということで、handlerを読もう。
(ちなみに missing: trueのときのみに、handlerの中身は処理される)

```ruby:lib/ruboty/robot.rb
def receive(attributes)
  message = Message.new(attributes.merge(robot: self))
  unless handlers.inject(false) { |matched, handler| matched | handler.call(message) }
    handlers.each do |handler|
      handler.call(message, missing: true)
    end
  end
end
```

#### handlers/base.rb
handlerはrubotyで実行する各種タスクの条件を記載しているclassである。

```ruby:lib/ruboty/handlers/ping.rb
# pingタスクの例
module Ruboty
  module Handlers
    class Ping < Base
      on(/ping\z/i, name: "ping", description: "Return PONG to PING")

      def ping(message)
        Ruboty::Actions::Ping.new(message).call
      end
    end
  end
end
```

さて、handlersのcallを読んでいく。
handlers/base.rbにあるようだ。


```ruby:lib/ruboty/handlers/base.rb
  def call(message, options = {})
    self.class.actions.inject(false) do |matched, action|
      matched | action.call(self, message, options)
    end
  end
```

ふむ。ここでも別classをcallしているようだ。
どこかで配列actionsに値を代入しているメソッドがあるのだろう。
ということで、actionsに対して値を代入しているメソッドを探す。
どうやら、onメソッドのようだ。Action インスタンスを代入しているらしい。
ということで、次はaction.rbを読む。

```ruby:lib/ruboty/handlers/base.rb
def on(pattern, options = {})
  actions << Action.new(pattern, options)
end
```

#### lib/ruboty/action.rb

もう何度目のcallだろうか。
そういう気持ちでcallメソッドを読んでいく。
ふむふむ。pattern_withで引っかかったやつは実行されるようだ。

```ruby:lib/ruboty/action.rb
def call(handler, message, options = {})
  if !!options[:missing] == missing? && message.match(pattern_with(handler.robot.name))
    !!handler.send(name, message)
  else
    false
  end
end
```

そしてなんと....
あれ？ all?
え、その正規表現は..... 


```ruby:lib/ruboty/action.rb
def all?
  !!options[:all]
end
# 省略

private

def pattern_with(robot_name)
  if all?
    /\A#{pattern}/
  else
    /#{self.class.prefix_pattern(robot_name)}#{pattern}/
  end
end
```

## 結論
handlerのonメソッドに対して、optionでall: trueを入れれば解決。

```ruby
on(/hear\z/i, name: "hear", description: "", all: true)
```

うむ....既に機能としてありました。さすがです。
ありがたく使わせていただこうと思います。
Deep Learningをお手軽に試してみる : Darknetを使ってオブジェクト認識

#はじめに

Deep LearningのライブラリにはTensorflow, Chainer, Caffeなどありますが、導入するのは少し面倒。そこで簡単にインストールできて、お手軽に使えるライブラリがないかと思っていたところ、[こちらのサイト](http://ch.nicovideo.jp/akiba-cyberspacecowboys/blomaga/ar1116319)でDarknetの存在を知りました。このDarknetを使えば、リアルタイムオブジェクト認識、画像分類、GoogleのDeep Dreamのような画像加工、RNN(Recurrent Neural Network)、AlphaGoのような囲碁などが試せます。

#Darknetのインストール方法
インストール方法は、とても簡単。[公式サイト](http://pjreddie.com/darknet/)にもインストール手順が載っています。私は、Ubuntuにインストールしました。

**① githubからクローンする**
$ git clone https://github.com/pjreddie/darknet.git

**② darknetのディレクトリができるのでそこに移動**
$ cd darknet

**③ makeする**
$ make

たったこれだけ！本当に簡単です。デフォルトではCPUのみを使用するようになっているため、GPUを使いたい場合は、Makefileの頭の設定をGPU=0からGPU=1に書き換えてmakeすれば良いそうです。

```:Makefile
GPU=0
CUDNN=0
OPENCV=0
DEBUG=0
```

#オブジェクト認識
Darknetの開発者はYOLOというリアルタイムオブジェクト認識アルゴリズムの開発者でもあり、学習済みのYOLOをダウンロードしてすぐに使えます。試しに、静止画のオブジェクト認識をしてみます。

**① YOLOをダウンロード**
$ wget http://pjreddie.com/media/files/yolo.weights

**② 実行**
$ ./darknet yolo test cfg/yolo.cfg yolo.weights data/dog.jpg

実行すると、以下のようにオブジェクト検出して分類してくれます。
(data/dog.jpgとdata/horses.pngの実行結果)
![image](https://qiita-image-store.s3.amazonaws.com/0/116157/ea343e3d-aff2-5847-7323-0872a94a90f4.png)

cfg/yolo.cfgに、ネットワーク構成が書かれています。

#参考サイト
http://ch.nicovideo.jp/akiba-cyberspacecowboys/blomaga/ar1116319
http://pjreddie.com/darknet/
Let's encrypt のWeb認証に失敗する場合の許可の通し方

#Let's encryptのWeb認証が通らないケース
Let's encryt で既に動作しているWebサーバを認証する場合、
フレームワークやWordPress、Drupalなどのアプリが、
パラメータをキャッチする設定になっていることで、Web認証に失敗する場合がある。

![image](https://qiita-image-store.s3.amazonaws.com/0/19439/e7e23d94-ee69-fe8c-9cee-f0f45147682a.png)

```shell-session:
Failed authorization procedure. <<認証したいWebサーバのドメイン>> (http-01): urn:acme:error:unauthorized :: The client lacks suffijp/.well-known/acme-challenge/tpRITlAFEtuJgZvhQwF_eRDRKu8XoLkkrwlLpp6AFTw: "<html>
<head><title>403 Forbidden</title></head>
<body bgcolor="white">
<center><h1>403 Forbidden</h1></center>
<hr><center>"

IMPORTANT NOTES:
 - The following errors were reported by the server:

   Domain: <<認証したいWebサーバのドメイン>>
   Type:   unauthorized
   Detail: Invalid response from
   http://<<認証したいWebサーバのドメイン>>/.well-known/acme-challenge/tpRITlAFEtuJgZvhQwF_eRDRKu8XoLkkrwlLpp6AFTw:
   "<html>
   <head><title>403 Forbidden</title></head>
   <body bgcolor="white">
   <center><h1>403 Forbidden</h1></center>
   <hr><center>"

   To fix these errors, please make sure that your domain name was
   entered correctly and the DNS A record(s) for that domain
   contain(s) the right IP address.
```

#解決方法
その場合は、以下の通り
別ディレクトリに認証を逃がすことで、
認証許可を出してもらうことが出来る。

チャレンジ方式の認証であり
不正に認証しているわけでもないので、認証自体も問題なし。

複数バーチャルホストの場合は、
nginx:/etc/nginx/global/letsencypt.conf
とかにまとめてIncludeしておけば良いと思う。

##Nginxの場合

```nginx:/etc/nginx/conf.d/virtual.conf
server {
    listen 80 default_server;
    server_name <<認証したいWebサーバのドメイン>>;

    #以下の2行を追加して、別ディレクトリで認証する。
    location ^~ /.well-known/acme-challenge/ {
      root /usr/share/nginx/html;
    }
    ...
}
```

```shell-session:letsencryptインストールディレクトリ
./letsencrypt-auto certonly --webroot --webroot-path /usr/share/nginx/html -d <<認証したいWebサーバのドメイン>>
```

![image](https://qiita-image-store.s3.amazonaws.com/0/19439/4c58e067-8acd-9db9-6f66-164b2e2d2649.png)

```shell-session:letsencryptインストールディレクトリ
IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at
   /etc/letsencrypt/live/<<認証したいWebサーバのドメイン>>/fullchain.pem. Your
   cert will expire on 2017-01-06. To obtain a new or tweaked version
   of this certificate in the future, simply run letsencrypt-auto
   again. To non-interactively renew *all* of your certificates, run
   "letsencrypt-auto renew"
 - If you like Certbot, please consider supporting our work by:

   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
   Donating to EFF:                    https://eff.org/donate-le
```

#参考
Let's encrypt運用のベストプラクティス
http://qiita.com/tkyk@github/items/9b6ba55bb2a6a5d90963
Free SSL/TLS Certificates with Let's Encrypt and NGINX
https://www.nginx.com/blog/free-certificates-lets-encrypt-and-nginx/
Ubuntu 14.04 > 101キーボード使用で苦戦 > mozcの設定を変更

```
東プレ REALFORCE (101keyboard)
```

TensorFlowの試用のためUbuntu 14.04をインストールした。

インストール直後の問題としては以下がある。

- [x] 無線LANドライバが入っていない
- [x] 解像度を1024 x 768より上げれない
- [ ] キーボードレイアウトが英語キーボード(89)になっていない
     - 変更しても日本語キーボードレイアウトに戻る
     
キーボードレイアウト問題にトライした。

以下を試した。

```
sudo dpkg-reconfigure keyboard-configuration 
```

一時的に101のレイアウトになったが、何故か数秒後には日本語キーボードのレイアウトに戻る。

その他の設定ファイル変更を試したが成功せず。

mozcという機能でレイアウトが決まっているようだ。

mozcの「入力メソッド」に以下を追加した。

- キーボード 英語 (US)

入力メソッドを上記にすると101のレイアウトになる。ただし、日本語は入力できなくなる。

入力メソッドをmozcにすると、日本語は入力できる。ただし、101のレイアウトでなくなる。
mozcのレイアウトは「英語(US)」にしているが。。

codingに集中する限りは101レイアウトにして、日本語を使わないというのでもいい。

## 解決した

入力メソッドの順番を変更した。

- キーボード -日本語
- Mozc
- キーボード - 英語(US)

上記の順番を以下にしたら、日本語入力と101レイアウトの両方が使えるようになった。
Ctrl+Spaceで両者を切り替えながら使う。

- Mozc
- キーボード - 英語(US)
- キーボード -日本語

最後の「`キーボード -日本語`」は消してもいいのかもしれないがほっておく。
goでURLの文字列にパスを追加する方法(urlのpathのjoin)

## 概要

goで以下のようなURLに新たなpathを追加したい。

```
http://foo.bar.jp/boo/?greeting=hello
```
例えば `/bee` を追加して以下のようにする。

```
http://foo.bar.jp/boo/bee?greeting=hello
```

結論から言うと、url.URLをコピーしてpathに対してpath.Joinをすれば良い。

## 詳細

url.Parseで型が `*url.URL` の値が返ってくる。 `url.URL` は以下のようなstruct。

```go
type URL struct {
	Scheme     string
	Opaque     string    // encoded opaque data
	User       *Userinfo // username and password information
	Host       string    // host or host:port
	Path       string
	RawPath    string // encoded path hint (Go 1.5 and later only; see EscapedPath method)
	ForceQuery bool   // append a query ('?') even if RawQuery is empty
	RawQuery   string // encoded query values, without '?'
	Fragment   string // fragment for references, without '#'
}
```

goは、値の代入でコピーが発生するので単に代入をしてあげれば複製が作られる。

```go
baseURL, _ := url.Parse(url)
copiedURL := *baseURL
```

`URL.Path` に入っているのは単なるpathの形式を持った文字列なので `path.Join()` で繋げられる。

```go
copiedURL.Path = path.Join(copiedURL.Path, newPath)
```

## 例

はじめにのところで行おうとした処理

```go
package main

import (
	"fmt"
	"net/url"
	"path"
)

func main() {
	baseURL, _ := url.Parse("http://foo.bar.jp/boo/?greeting=hello")

	copiedURL := *baseURL
	copiedURL.Path = path.Join(copiedURL.Path, "./bee")

	fmt.Printf("before: %s\n", baseURL)
	fmt.Printf("after : %s\n", &copiedURL)
}
```

以下のような出力になる

```
before: http://foo.bar.jp/boo/?greeting=hello
after : http://foo.bar.jp/boo/bee?greeting=hello
```


## URL.ResolveReference()ではダメ

ところで最初はResolveReference()だけでどうにかなると思っていた。

```go
x, _ := url.Parse("http://foo.bar.jp/boo")
// &url.URL{Scheme:"http", Opaque:"", User:(*url.Userinfo)(nil), Host:"foo.bar.jp", Path:"/boo", RawPath:"", ForceQuery:false, RawQuery:"", Fragment:""}
y, _ := url.Parse("./bee")
// &url.URL{Scheme:"", Opaque:"", User:(*url.Userinfo)(nil), Host:"", Path:"./bee", RawPath:"", ForceQuery:false, RawQuery:"", Fragment:""}

x.ResolveReference(y).String()
// "http://foo.bar.jp/bee"
```
AndroidエミュレータにtelnetでSMSメッセージ送る方法っていつから変わったのかな？


最近SMSメッセージをアレコレするアプリを作った。
テストのためにSMS送りたくなったので `android emulator sms` で検索すると、大体みんなこれでOKって言う。

```
$telnet localhost 5554
$sms send 00000000000 message
```

みんなが言うんだからやってみよう

```
$telnet localhost 5554
Trying ::1...
telnet: connect to address ::1: Connection refused
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
Android Console: Authentication required
Android Console: type 'auth <auth_token>' to authenticate
Android Console: you can find your <auth_token> in 
'/Users/shitake/.emulator_console_auth_token'
OK

$sms send 00000000000 message
KO: unknown command, try 'help'
```

おいおい`unknown`だってよ。

確かに`sms`コマンドなんて無い。

```
$help
Android console command help:

    help|h|?         print a list of commands
    auth             use 'auth <auth_token>' to get extended functionality
    avd              control virtual device execution
    quit|exit        quit control session

try 'help <command>' for command-specific help
OK
```

そこでよーく見返すと`telnet`で接続したときに何か言われている。

```
Android Console: Authentication required
Android Console: type 'auth <auth_token>' to authenticate
Android Console: you can find your <auth_token> in 
'/Users/shitake/.emulator_console_auth_token'
```

つまりこのエミュレータのいろんな機能使うには`auth`コマンドでの認証が必須だってよ。
親切にも認証に必要なトークンの在り処まで教えてくれていました。ちゃんと読まなくてごめんね。

`~/.emulator_console_auth_token`を覗く

```
$vi ~/.emulator_console_auth_token
```

それっぽいトークンがいたのでそれをコピって`auth`コマンド実行

```
$auth コピーしたトークン
Android Console: type 'help' for a list of commands
OK

$help
Android console command help:

    help|h|?         print a list of commands
    crash            crash the emulator instance
    kill             kill the emulator instance
    quit|exit        quit control session
    redir            manage port redirections
    power            power related commands
    event            simulate hardware events
    avd              control virtual device execution
    finger           manage emulator fingerprint
    geo              Geo-location commands
    sms              SMS related commands
    cdma             CDMA related commands
    gsm              GSM related commands
    rotate           rotate the screen by 90 degrees

try 'help <command>' for command-specific help
OK
```

コマンド増えた！`sms`コマンドも出た！

Androidのバージョンの問題？エミュレータの問題？
rex0220 ルックアップ一括取得プラグイン

[計算項目更新プラグイン](http://qiita.com/rex0220/items/da651a041476784ca646)に、ルックアップ一括取得機能を追加したプラグインです。

ルックアップ項目のコピー項目を追加した場合やコピー元アプリをCSVファイル読み込みなどで変更した場合など、ルックアップ項目を簡単に一括取得出来ます。
※対象アプリのデータバックアップを取得してから、実行してください。

・指定したルックアップ項目のコピー項目を再設定します。
・計算項目更新

[rex0220 stores](https://rex0220.stores.jp) で、販売中です。

Ver.7
・プラグイン設定画面のデザイン変更対応


# プラグイン設定画面

フォーム設定で計算項目を変更した場合、本番環境へ反映後にプラグインで既存レコードを更新してください。
指定レコードを更新しますので、事前にデータのバックアップを取ってから実行してください。

- 対象のルックアップ項目を指定
- 「既存レコード」をクリック

![2022-05-09_18h02_49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/71c2f981-1a88-8fca-47ca-a79ab64d0c31.png)


# プラグインのレコード更新処理

- 「レコード更新」をクリックすると更新処理が開始されます

![2023-02-02_14h05_44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/8ec93bc7-e327-fdff-cba5-dcc7879f442d.png)
![2023-02-02_14h06_03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/d86d81e5-88a0-142c-9b4a-15a23ebc72e8.png)
![2023-02-02_14h08_58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/58aa179a-7175-dcb6-9016-073ecbd9e15c.png)


# レコード更新時のエラー表示

- ルックアップ項目の値が無い場合、エラーを表示して処理を中止します。
- エラーレコードは、マニュアル対応でエラーを解消してください。


![2022-05-09_18h14_19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/856d4955-f1bc-ceae-1505-a4b22b60c72e.png)


# プラグインの追加


![lookupbulk11.png](https://qiita-image-store.s3.amazonaws.com/0/100572/1d3b8b24-d7aa-70d9-5be0-bbf7b7afeb8c.png)

# 注意事項

フォーム設定で計算項目を変更した場合、本番環境へ反映後にプラグインで既存レコードを更新してください。
rails info

```bash
2.2.3 :004 > Rails::Info
 => About your application's environment
Rails version        4.2.5
Ruby version         2.2.3-p173 (x86_64-linux)
RubyGems version     2.4.8
Rack version         1.6.4
JavaScript Runtime   therubyracer (V8)
Middleware           Rack::Sendfile, ActionDispatch::Static, Rack::Lock, #<ActiveSupport::Cache::Strategy::LocalCache::Middleware:0x00000004803640>, Rack::Runtime, Rack::MethodOverride, ActionDispatch::RequestId, Rails::Rack::Logger, ActionDispatch::ShowExceptions, WebConsole::Middleware, ActionDispatch::DebugExceptions, BetterErrors::Middleware, ActionDispatch::RemoteIp, ActionDispatch::Reloader, ActionDispatch::Callbacks, ActionDispatch::Cookies, ActionDispatch::Session::CookieStore, ActionDispatch::Flash, ActionDispatch::ParamsParser, Rack::Head, Rack::ConditionalGet, Rack::ETag
Application root     /home/vagrant/data/indexes_collection_v3
Environment          development 
```
Tensorflow v0.8 GPU版 > インストールして実行してみた on Ubuntu 14.04 > TensorBoardが表示されないため、v0.11に変更した / cuDNN v5.1にした / libcupti.so. が見つからないエラー 対応

```txt:動作環境
GeForce GTX 750 Ti
ASRock Z170M Pro4S [Intel Z170chipset]
Windows 8.1 pro (64bit)
```

上記のPCにUbuntu 14.04 (desktop amd64)をインストールして、Tensorflowインストール、実行までしてみた。

以下の情報の手順に従いました。
まったく問題なく実行までできました。
http://qiita.com/akiraak/items/1c7fb452fb7721292071

情報提供感謝です。

まだ色々分からないがGPU版としてTensorflowのサンプル実行までできた。

```
(tensorflow-GPU)yasokada@voyager01:~$ python
Python 2.7.6 (default, Jun 22 2015, 17:58:13) 
[GCC 4.8.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import tensorflow as tf
I tensorflow/stream_executor/dso_loader.cc:105] successfully opened CUDA library libcublas.so locally
I tensorflow/stream_executor/dso_loader.cc:105] successfully opened CUDA library libcudnn.so locally
I tensorflow/stream_executor/dso_loader.cc:105] successfully opened CUDA library libcufft.so locally
I tensorflow/stream_executor/dso_loader.cc:105] successfully opened CUDA library libcuda.so.1 locally
I tensorflow/stream_executor/dso_loader.cc:105] successfully opened CUDA library libcurand.so locally
>>> hello = tf.constant('Hello, TensorFlow!')
>>> sess = tf.Session()
I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:900] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
I tensorflow/core/common_runtime/gpu/gpu_init.cc:102] Found device 0 with properties: 
name: GeForce GTX 750 Ti
major: 5 minor: 0 memoryClockRate (GHz) 1.202
pciBusID 0000:01:00.0
Total memory: 2.00GiB
Free memory: 1.69GiB
I tensorflow/core/common_runtime/gpu/gpu_init.cc:126] DMA: 0 
I tensorflow/core/common_runtime/gpu/gpu_init.cc:136] 0:   Y 
I tensorflow/core/common_runtime/gpu/gpu_device.cc:755] Creating TensorFlow device (/gpu:0) -> (device: 0, name: GeForce GTX 750 Ti, pci bus id: 0000:01:00.0)
>>> print(sess.run(hello))
Hello, TensorFlow!
>>> a = tf.constant(10)
>>> b = tf.constant(32)
>>> print(sess.run(a + b))
42
>>> 
```

### TensorBoard表示されない

TensorBoardに何も表示されない問題に出くわした。v0.8でTensorBoardが表示されない。

以下を実行してv0.11にしたらTensorBoardが表示されるようになった。

```
pip install --upgrade https://storage.googleapis.com/tensorflow/linux/gpu/tensorflow-0.11.0rc0-cp27-none-linux_x86_64.whl
```



![Screenshot from 2016-10-08 13:37:16.png](https://qiita-image-store.s3.amazonaws.com/0/32870/4f517783-6ba2-0b79-8732-d542b54aafb8.png)


### cuDNNのバージョン互換性エラー > cuDNN v5.1にした

TensorFlow v0.11にしたら、今度はMNIST処理サンプルにてエラーが出るようになった。

http://qiita.com/7of9/items/94c33411891decfdd8d4

cuDNN v5.1にした。


### libcupti.so. が見つからないエラー 

以下の対応をした。
http://qiita.com/7of9/items/0ac24f0ceb502116393b
swift3の文字列操作（String.substring）メモ

文字列（String）のsubstringの使い方についての覚書。
他にも書き方はあると思いますが。

```swift

        let Str: String = "123456789"
        ///
        /// 先頭１文字 - 1
        ///
        print("\(Str.substring(to: Str.index(after: Str.startIndex)))")
        ///
        /// 先頭１文字以外 - 23456789
        ///
        print("\(Str.substring(from: Str.index(after: Str.startIndex)))")
        ///
        /// 末尾１文字 - 9
        ///
        print("\(Str.substring(from: Str.index(before: Str.endIndex)))")
        ///
        /// 末尾１文字以外 - 12345678
        ///
        print("\(Str.substring(to: Str.index(before: Str.endIndex)))")
        ///
        /// 先頭から？文字 - 12345
        ///
        print("\(Str.substring(to: Str.index(Str.startIndex, offsetBy: 5)))")
        ///
        /// 末尾から？文字 - 56789
        ///
        print("\(Str.substring(from: Str.index(Str.endIndex, offsetBy: -5)))")
        ///
        /// 先頭？文字以外 - 6789
        ///
        print("\(Str.substring(from: Str.index(Str.startIndex, offsetBy: 5)))")
        ///
        /// 末尾？文字以外 - 1234
        ///
        print("\(Str.substring(to: Str.index(Str.endIndex, offsetBy: -5)))")
        ///
        /// ？から？文字 - 456
        ///
        print("\(Str.substring(with: Str.index(Str.startIndex, offsetBy: 3)..<Str.index(Str.endIndex, offsetBy: -3)))")

```
2016-10-08 Ubuntu > link > Ubuntuでデスクトップのディレクトリ名を「Desktop」にする

Ubuntuでデスクトップのディレクトリ名を「Desktop」にする
http://d.hatena.ne.jp/mickey24/20090122/1232583960

ダウンロードやデスクトップなどフォルダ移動するたびに漢字変換をするのが面倒すぎる。
DownloadやDesktopにすることにした。

<hr>
(追記 2016/11/05)

上記のリンク先の方法を実行するときはfirefoxやchromeを閉じておくこと。
そうしないと「ダウンロード」だけカタカナのフォルダとして残ってしまう。
Downloadはできるが、ブラウザでダウンロードした時には「ダウンロード」フォルダに保存される。
macOS Sierra で dotnet コマンドが見つからない場合の対処


公式サイトのインストーラを使用して.NET Core SDK をインストールしてから
bashからdotnetコマンドを動作させようとしても、コマンドが見つからないよとbashから怒られる場合があります。

結論から言うと既に解決済みで、下記のIssueで確認ができます。
[dotnet command not found: 1.0.1 install on clean macOS Sierra](https://github.com/dotnet/cli/issues/4225)

端的にいうとこの現象は新規にクリーンインストールした場合に発生するようで、
`/etc/paths.d`が存在しないため、コマンドが見えない様子。

対処法は上記にも記載されていますが、下記のコマンドを実行してから
ターミナルを再起動すると晴れてdotnetコマンドが実行することができるようになります。

``` terminal
mkdir -p /etc/paths.d
echo /usr/local/share/dotnet > /etc/paths.d/dotnet
```

このバグについては既に修正済みで1.0.0-preview3には適用されるようなので、
それまでに実行環境を構築する際はこのコマンドを実行するしか無いようです。
C#:三角数を求める


## 三角数とは
三角数とは、自然数を順次加えることで求められる数のことです。具体的には、

<pre>
1
3   (=1+2)
6   (=1+2+3)
10  (=1+2+3+4)
15  (=1+2+3+4+5)
...
</pre>

となります。
これをどうして三角数と言うのかは、米俵を三角形に積み上げていった時の様子を思い浮かべていただければ分かるかと思います。

n番目の三角数を t(n) とすると、

<pre>
t(0) = 0
t(n) = t(n-1) + n
</pre>

と定義できます。


## C#のコード

以下の３つのメソッドを書いてみることにします。

- 先頭からn個の三角数を求める
- 三角数かどうかを調べる
- n番目の三角数を求める


以下に、C#のコードTriangularNumberクラスを示します。

ソースコードは[GitHub](https://github.com/gushwell/CSharpAlgorithmCollection)で公開しています。

```csharp:TriangularNumber.cs
public static class TriangularNumber {
    // 三角数を列挙する
    public static IEnumerable<int> Take(int n) {
        yield return 0;
        int ans = 0;
        for (int i = 1; i < n; i++) {
            ans += i;
            yield return ans;
        }
    }

    // 三角数かを調べる
    public static bool IsCorrect(long x) {
        long a = 8 * x + 1;
        long b = (long)(Math.Sqrt(a));
        if (b * b != a)
            return false;
        return (b - 1) % 2 == 0;
    }

    // ｎ番目の三角数を求める
    public static long GetAt(int nth) {
        return (long)nth * (nth + 1) / 2;
    }
}
```


「n番目の三角数を求める」GetAtメソッドは前述の定義通りに、再帰を使うこともできますが、n が大きな数の場合は、あまり効率的ではありませんので、以下の公式を使っています。

<pre>
t(n) = n * (n + 1) / 2
</pre>

## TriangularNumber.Takeメソッドの実行例

以下のコードで先頭から30個までの三角数を列挙してみました。

```csharp
    var nums = TriangularNumber.Take(30);
    int n = 0;
    foreach (var tn in nums) {
        Console.WriteLine($"{n} : {tn}");
        n++;
    }
```

結果

<pre>
0 : 0
1 : 1
2 : 3
3 : 6
4 : 10
5 : 15
6 : 21
7 : 28
8 : 36
9 : 45
10 : 55
11 : 66
12 : 78
13 : 91
14 : 105
15 : 120
16 : 136
17 : 153
18 : 171
19 : 190
20 : 210
21 : 231
22 : 253
23 : 276
24 : 300
25 : 325
26 : 351
27 : 378
28 : 406
29 : 435
</pre>

-------------------------
この記事は、Gushwell's C# Programming Pageで公開したものを加筆・修正したものです。
Qiitaスライド機能への改良機能の提案  > メモ機能

良いプレゼンテーション資料

- 長い文書では書かない
  - 聴衆に文書を読ます負担を負わせない
- 箇条書きする
- 補足事項は口頭で話す

<hr>
2016年10月8日 現在のスライドの機能

- 記載事項全て表示
  - パワーポイントにあるメモ機能が望まれる

<hr>
パワーポイントのメモ機能

- 発表者のPCには表示される
  - 練習用
  - 発表時のカンニング用
- 外部接続モニタには表示されない
  - 聴衆者閲覧用

<hr>
案

- Markdownの`####`で記載事項は隠す
- 発表練習時には、ある機能をONにすると`####`を表示

<hr>
終わり

ただの案です。
要望というほどのものでもないです。
KubernetesのCluster Loggingまとめ

## 抑えるべきポイント

- /var/log/containers/*-json.logにkubeletが全podのログを出力する
- それを何らかのアプリケーションに集約・ログの蓄積先・分析システムに送付することで、あとでログを閲覧・分析しやすくすることが目的
-　*-json.logには、pod内のコンテナが標準出力・標準エラー出力に書き出したものがそのまま含まれる
    -　ログの出力元であるKubernetesのクラスタ、ノードの、pod、コンテナの情報（メタデータ）は含まれていない。
    -　これらのメタデータがないと、ログを集約しても分析のしようがない（例: 何かエラーログが出ているけど、どのクラスタのどのノードのどのpodのエラーログかわからない！)
    -　ログを収集して、集約先に送りつける前にどのような変換をするか?
        -　ETL
        -　ELT(ログを抽出して、集約先システムに送りつけてから、その後変換）でも良いかもしれないけど、T(ransform)してからやっとログが閲覧可能になるわけなので、リアルタイム性が少しでも欲しい場合には不向き

## OSS

- [ApsOps/filebeat-kubernetes](https://github.com/ApsOps/filebeat-kubernetes)
    - Filebeat
- [mumoshu/kube-fluentd](https://github.com/mumoshu/kube-fluentd)
    - Fluentd + [fluent-plugin-kubermetes_metadata_filter](https://github.com/fabric8io/fluent-plugin-kubernetes_metadata_filter)
Google Fonts の日本語フォント

[Google Fonts](https://fonts.google.com/)の[ealry access](https://fonts.google.com/earlyaccess) で公開されている日本語フォントをまとめてみました。

Google Fontsの使い方は「[Google Web Fonts を使ってみた](http://qiita.com/umeume66/items/e37895571086a8a26158)」などをみてください。

* Hannari 
 * はんなり明朝
 * http://typingart.net/?p=44 
 * https://twitter.com/typingart 
 * ```@import url(http://fonts.googleapis.com/earlyaccess/hannari.css);```
 * ![Hannari](http://typingart.net/wp-content/uploads/2015/05/image_hannari.jpg)
* Kokoro
 * こころ明朝体
 * http://typingart.net/?p=46
 * https://twitter.com/typingart 
 * ```@import url(http://fonts.googleapis.com/earlyaccess/kokoro.css);```
 * ![kokoro](http://typingart.net/wp-content/uploads/2015/05/image_kokoro.jpg)
* Mplus 1p
 * http://mplus-fonts.osdn.jp/index.html
 * ```@import url(http://fonts.googleapis.com/earlyaccess/mplus1p.css);```
 * ![mp1p.png](https://qiita-image-store.s3.amazonaws.com/0/42120/25685903-858a-fadf-31b8-9e5316c9e5fc.png)

* Nico Moji
 * ニコモジ
 * http://nicofont.pupu.jp/nicomoji-plus.html
 * ```@import url(http://fonts.googleapis.com/earlyaccess/nicomoji.css);```
 * ![nicocmoji](http://nicofont.pupu.jp/images/nicomoji_kv_plus.png)
* Nikukyu
 * ニクキュウ
 * http://fontopo.com/?p=85
 * ```@import url(http://fonts.googleapis.com/earlyaccess/nikukyu.css);```
 * ![Nikukyu](http://fontopo.com/wp-content/uploads/2015/01/niku_image-470x470.gif)
* Noto Sans Japanese
 * https://code.google.com/p/noto/
 * ```@import url(http://fonts.googleapis.com/earlyaccess/notosansjapanese.css);```
* Noto Sans JP
 * https://code.google.com/p/noto/
 * ```@import url(http://fonts.googleapis.com/earlyaccess/notosansjp.css);```
* Rounded Mplus 1c
 * http://jikasei.me/font/rounded-mplus/about.html
 * ```@import url(http://fonts.googleapis.com/earlyaccess/roundedmplus1c.css);```
 * ![roundedmplus1d](http://jikasei.me/content/images/fontsample/mplus/rounded-mplus-1c-regular.png)
* Sawarabi Gothic
 * さわらびゴシック
 * http://sawarabi-fonts.osdn.jp/
 * http://mshio.b.osdn.me/
 * ```@import url(http://fonts.googleapis.com/earlyaccess/sawarabigothic.css);```
 * ![sawarabig](http://sawarabi-fonts.osdn.jp/img/sample-gothic.png)
* Sawarabi Mincho  
 * さわらび明朝 
 * http://sawarabi-fonts.osdn.jp/
 * http://mshio.b.osdn.me/
 * ```@import url(http://fonts.googleapis.com/earlyaccess/sawarabimincho.css);```
 * ![sawarabim](http://sawarabi-fonts.osdn.jp/img/sample-mincho.png)
Ubuntu > link > GeForce GTX 750Ti ドライバインストール

TensorFlowの試用のためUbuntu 14.04をインストールした。

インストール直後の問題としては以下がある。

- [x] 無線LANドライバが入っていない
- [ ] 解像度を1024 x 768より上げれない
- [ ] キーボードレイアウトが英語キーボード(89)になっていない
     - 変更しても日本語キーボードレイアウトに戻る

使用グラフィックスカードはGeForce GTX 750 Ti。

以下の Pilo6 さんの方法で解像度を上げることができた。
http://askubuntu.com/questions/653592/nvidia-geforce-gtx-750-ti-doesnt-work-in-ubuntu
Sierra で python3 の mod_wsgi を pip3 でインストールできない時(要homebrewインストール)

1. apacheはSierraに元から入っているものを使います。
1. python3はhomebrewでインストールしたものを使います。

さて、python3用のmod_wsgiをインストールしようとすると...

```bash
lekeu:~ mucius$ pip3 install mod_wsgi
.
.
.
    FileNotFoundError: [Errno 2] No such file or directory: '/Applications/Xcode.app/Contents/Developer/Toolchains/OSX10.12.xctoolchain/usr/local/bin/apr-1-config'
```

そんなファイルはないと怒られました。

仕方がないので、homebrew から以下をインストール。

```bash
lekeu:~ mucius$ brew install apr
lekeu:~ mucius$ brew install apr-util
```
当該ディレクトリを作成し、二つのファイルのシンボリックリンクを貼りました。

```bash
lekeu:~ mucius$ sudo mkdir -p  /Applications/Xcode.app/Contents/Developer/Toolchains/OSX10.12.xctoolchain/usr/local/bin
lekeu:~ mucius$ cd /Applications/Xcode.app/Contents/Developer/Toolchains/OSX10.12.xctoolchain/usr/local/bin
lekeu:bin mucius$ sudo ln -s /usr/local/Cellar/apr/1.5.2_3/bin/apr-1-config .
lekeu:bin mucius$ sudo ln -s /usr/local/Cellar/apr-util/1.5.4_4/bin/apu-1-config .
```
今度は...

```bash
lekeu:~ mucius$ pip3 install mod_wsgi
.
.
Successfully installed mod-wsgi-4.5.7
lekeu:~ mucius$ 
```
インストールできたようです。

/usr/local/lib/python3.5/site-packages/mod_wsgi/server/mod_wsgi-py35.cpython-35m-darwin.so

が出来ていました。
これを、LoadModule群の最後に追加。

```apache:/etc/apache/httpd.conf:

#LoadModule php5_module libexec/apache2/libphp5.so
#LoadModule perl_module libexec/apache2/mod_perl.so
LoadModule hfs_apple_module libexec/apache2/mod_hfs_apple.so
LoadModule wsgi_module /usr/local/lib/python3.5/site-packages/mod_wsgi/server/mod_wsgi-py35.cpython-35m-darwin.so
```

```bash
lekeu:~ mucius$ sudo apachectl restart
```

さてさて...

<img width="683" alt="スクリーンショット 2016-10-08 8.58.38.png" src="https://qiita-image-store.s3.amazonaws.com/0/143716/1dde669c-a6eb-d87b-a2d7-f445063300a8.png">

どうやら動いているようです。
Ubuntu > link > WI-U2-433DMのUBUNTU14.04へのインストール

TensorFlowの試用のためUbuntu 14.04をインストールした。

インストール直後の問題としては以下がある。

- 無線LANドライバが入っていない
- 解像度を1024 x 768より上げれない
- キーボードレイアウトが英語キーボード(89)になっていない
   - 変更しても日本語キーボードレイアウトに戻る

無線LANドライバに関しては以下のように対処した。

### RaspberryPi2で使用したアダプタ使用

PLANEXのGW-USNANO2Aを持っていた。とりあえずこれを接続すると、ドライバインストール作業をしなくとも2.4GHzでWiFi接続できた。
ただし、2.4GHz帯は現在の使用環境で混線しやすい。

http://qiita.com/7of9/items/83ffaafc8b3eef990aa6
http://qiita.com/kota65535/items/3d02c7c518761476c84a

### ドライバのインストール

~~マザーボードの無線LANアダプタを調べた~~。デュアルブートでWindows 8.1を立ち上げ、該当のドライバが WI-U2-433DMと知った。

(追記：マザーの無線LANでなく、USB接続している無線LANアダプタだった。掃除していて気づいた)。

以下に記載の情報を実行してWiFiを認識できた。

http://gomikuzudoctorcourse.tumblr.com/post/88221608855/wi-u2-433dm%E3%81%AEubuntu1404%E3%81%B8%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB

情報提供者に感謝。
perl使いのpythonメモ - 三項演算子


- pythonであれ？とおもったことをメモしときます。

## 三項演算子ってないの？

- 三項演算子（条件演算子）って好きなんですよね〜（新入社員にわからないと言われて衝撃を受けましたが...）

```python
>>> a = True
>>> b = a ? "OK" : "NG"
  File "<stdin>", line 1
    b = a ? "OK" : "NG"
          ^
SyntaxError: invalid syntax
```

- エラーになりました...

```
>>> b = "OK" if a else "NG"
>>> print(b)
OK
```

- こっちのほうが英語的にも自然なんでしょうね。（まだちょっと慣れない）
- perlにも後置ifで ```$b = "OK" if (a);```って書き方はありますが。

## 複合的な三項演算子

- (こういう書き方するからわからないとか言われるんですが...）
- 条件をつなげることも可能です。
 
```perl
sh-3.2$ perl -le '$a=0;$b=($a==0)?"ZERO":($a==1)?"ONE":($a==2)?"TWO":"TAKUSAN!";print $b' 
ZERO
sh-3.2$ perl -le '$a=1;$b=($a==0)?"ZERO":($a==1)?"ONE":($a==2)?"TWO":"TAKUSAN!";print $b'
ONE
sh-3.2$ perl -le '$a=2;$b=($a==0)?"ZERO":($a==1)?"ONE":($a==2)?"TWO":"TAKUSAN!";print $b'
TWO
sh-3.2$ perl -le '$a=3;$b=($a==0)?"ZERO":($a==1)?"ONE":($a==2)?"TWO":"TAKUSAN!";print $b' 
TAKUSAN!
```

- これはpython風に書くとどうなるんでしょ？

```python
>>> a=0
>>> b = "ZERO" if a == 0 else "ONE" if a == 1 else "TWO" if a == 2 else "TAKUSAN!"
>>> b
'ZERO'
>>> a=1
>>> b = "ZERO" if a == 0 else "ONE" if a == 1 else "TWO" if a == 2 else "TAKUSAN!"
>>> b
'ONE'
>>> a=2
>>> b = "ZERO" if a == 0 else "ONE" if a == 1 else "TWO" if a == 2 else "TAKUSAN!"
>>> b
'TWO'
>>> a=3
>>> b = "ZERO" if a == 0 else "ONE" if a == 1 else "TWO" if a == 2 else "TAKUSAN!"
>>> b
'TAKUSAN!'
```

- 連続するとむしろわかりづらいかも...

## やっぱり欲しいな〜

- わかりにくい言われることがありますが、使えたほうがいいな〜
- pythonの設計思想に反するんですかね？
エイリアス（別名）の使い方

stringやnumberという型をそのまま書くのではなく、mynameやmailなどのように一目見て、どんなデータか分かるような別名をつける。

```
enum gender { male, female};
type myname = string;
type mail = string;
type age = number;

type Person = [myname, mail, gender, age];

let data:Person[] = []
data.push(['taro', 'taro@yamada', gender.male, 23]);
data.push(['hanako', 'hanako@flower', gender.female, 45]);
data.push(['sachiko', 'sachiko@happy', gender.female, 67]);

document.write('<h1>Tuple</h1>');
document.write('<p>' + data[0] + '</p>');
document.write('<p>' + data[1] + '</p>');
document.write('<p>' + data[2] + '</p>');
```
JupyterのDockerイメージにスライドショー機能を追加する

## Jupyterによる探索的なデータ解析

データを探索的に解析する際には、インタラクティブなUIがあると便利です。JupyterはRやPythonなど様々なプログラミング言語で書かれた解析スクリプトをインタラクティブに処理する便利なツールです。また、JupyterにはQiitaのスライドモードと同じようなスライドショー機能をつけることが可能で、インタラクティブに求めた結果を、すぐにスライドへ組み込むことができます。

## Dockerhub内のJupyterイメージ
Jupyterはローカルにインストールするだけでなく、Dockerのコンテナとしても使用可能です。 Dockerhub内には、Jupyterに関連したイメージが多数公開されています。ただし、Dockerhaub内のイメージの多くは、スライドショー機能が組み込まれていません。せっかくの便利機能ですが、イメージサイズを最小限にすることを考えると、スライドショー機能は外されてしまうのかもしれません。

## Jupyterのdockerイメージにスライドショー機能を追加する
私は、どうしてもスライドショー機能をJupyterに組み込みたかったので、その方法を調べたところ、
https://github.com/jupyter/docker-stacks/wiki/Docker-Recipes
に記述がありました。しかし、そこに書かれたやり方だとうまくいかなかったので、少しだけ変更を加えた方法でdockerfileを作成してみました。

### dockerfileの作り方
dockerfileでは、最初に元になるイメージを指定し、その後、それに変更を加えていきます。今回は、Jupyterアカウント内のR-notebookというイメージをベースイメージにしました。このイメージはRで解析する人用です。Pythonで解析する人は別のイメージを利用すると良いでしょう。

```
FROM jupyter/r-notebook

MAINTAINER jnobuyuki <gott623@gmail.com>
```
管理者も記載しておきます。

次に、このイメージにスライドショー機能を追加します。

```
RUN wget https://github.com/pdonorio/RISE/archive/master.tar.gz \
    && tar xvzf *.gz && cd RISE-master && python3 setup.py install
```

これだけです。

### dockerfileからイメージのビルド
dockerを利用して、dockerfileからイメージをビルドしましょう。-tオプションで任意のイメージ名をつけると便利です。作業ディレクトリをdockerfileのあるディレクトリまで移動して、以下のコードを実行します。

```
docker build -t 任意のイメージ名 .
```

ビルドしたイメージはdockerhub内で公開していますので、そちらもよろしければご利用ください。
https://hub.docker.com/r/jnobuyuki/jupyter-r-notebook/
技術英語 > you put [the upper end] of each range into a table / At the other end of the spectrum / That's the other end of the coin.

@ Code Complete (No. 14020 / 36077)

> you put <font color=red>the upper end of</font> each range into a table

<hr>
関連して思い出したのは

http://eow.alc.co.jp/search?q=At+the+other+end+of+the+spectrum
> At the other end of the spectrum
その対極にある、範囲内で対照的に一方の側に

上記の由来は分光(スペクトル）の片方の端の反対としての「対極」なのだろう。

<hr>
関連して思い出したのは

the other end of the coin

https://github.com/VargMon/netbsd-cvs-mirror/blob/9a47ab5995719de8481b4f892df0777853dd6915/games/fortune/datfiles/farber
> That's the other end of the coin.
Goでクリップボード監視をする（Windows Vista以降）

Windows Vista以降で使える`AddClipboardFormatListener`(Win32 API)を使うと簡単にクリップボード監視できるみたい。

```watch_clipboard.go
package main

import (
	"fmt"
	"syscall"
	"unsafe"

	"github.com/AllenDang/w32"
)

func getClipText() (string, error) {
	if w32.OpenClipboard(0) {
		defer w32.CloseClipboard()
		hclip := w32.HGLOBAL(w32.GetClipboardData(w32.CF_UNICODETEXT))
		if hclip == 0 {
			return "", fmt.Errorf("GetClipboardData")
		}

		lpstr := w32.GlobalLock(hclip)
		defer w32.GlobalUnlock(hclip)
		return w32.UTF16PtrToString((*uint16)(lpstr)), nil
	}
	return "", fmt.Errorf("OpenClipboard")
}

func wndProc(hwnd w32.HWND, msg uint32, wParam, lParam uintptr) uintptr {
	if msg == w32.WM_CLIPBOARDUPDATE {
		text, err := getClipText()
		if err != nil {
			fmt.Println("error:", err)
			return 0
		}
		fmt.Println("clipdata:", text)
		return 0
	}
	return w32.DefWindowProc(hwnd, msg, wParam, lParam)
}

func main() {
	className := syscall.StringToUTF16Ptr("for clipboard")
	wndClassEx := w32.WNDCLASSEX{
		ClassName: className,
		WndProc:   syscall.NewCallback(wndProc),
	}
	wndClassEx.Size = uint32(unsafe.Sizeof(wndClassEx))
	w32.RegisterClassEx(&wndClassEx)

	// Message-Only Window
	hwnd := w32.CreateWindowEx(0, className, className, 0, 0, 0, 0, 0, w32.HWND_MESSAGE, 0, 0, nil)
	w32.AddClipboardFormatListener(hwnd)
	defer w32.RemoveClipboardFormatListener(hwnd)

	msg := w32.MSG{}
	for w32.GetMessage(&msg, 0, 0, 0) > 0 {
		w32.DispatchMessage(&msg)
	}
}
```

#　メッセージ受信用のウィンドウを作る

`AddClipboardFormatListener`を使うにはウィンドウハンドルが必要なので、`main`の中でメッセージ受信用の非表示のウィンドウを作っています。

`WNDCLASSEX`には`ClassName`,`WndProc`,`Size`がないと`RegisterClassEx`か`CreateWindowEx`で失敗します。

なお、`className`は適当な文字列で大丈夫です。

# WM_CLIPBOARDUPDATE メッセージを受信する

受信用のコールバック関数`wndProc`でメッセージを受信しています。
クリップボードの変更があるたびにgetClipText()で取得した内容を表示しています。

# クリップボードからテキストを取得する

`CF_UNICODETEXT`を指定して取得したハンドルを使ってデータ取得しています。
`CF_TEXT`を指定した場合は文字化けしまくりでした。
PTVSで作ったDjangoアプリをAzure上にデプロイ

#Visual Stadio2015上でDjangoを動かす
PTVSについて詳しくは[こちら](http://qiita.com/saiyuki1919/items/80c51c0045852d26399d)を参照してください。

Visual stadio2015にてDjangoプロジェクを作成します。
Views.py内のhomeをコメントアウトし、代わりにtest.htmlを呼び出すプログラムを書く。

```Python:Views.py
from django.template import RequestContext
from datetime import datetime

def home(request):
        assert isinstance(request, HttpRequest)
        return render(request,'app/test.html')
"""
def home(request):
    assert isinstance(request, HttpRequest)
    return render(
        request,
        'app/index.html',
        context_instance = RequestContext(request,
        {
            'title':'Home Page',
            'year':datetime.now().year,
        })
    )
“""
```

test.htmlを新規作成してみる。
【templates】➡️【app】➡️【test.html(Add/New Itemで新規作成する)】

```Python:test.html
<!DOCTYPE html>

<html lang="en" xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta charset="utf-8" />
    <title>test</title>
</head>
<body>
    <div>My Name is saiyuki1919</div>
    Can you ?
</body>
</html>
```

**Run**すると下のように表示される
![1.png](https://qiita-image-store.s3.amazonaws.com/0/130097/acc9a8e7-1140-5957-8628-ac13da3afe89.png)
#Azure上にデプロイする
作成中のプロジェクトを右クリックし、【**Pubulish**】を選択
![2.png](https://qiita-image-store.s3.amazonaws.com/0/130097/b63b81d1-a5f8-2321-ec7f-ad0eddf4fccb.png)



ここで、Microsoft Azure Web Appsを選択し**Publish**を押す
![3.png](https://qiita-image-store.s3.amazonaws.com/0/130097/725263ed-f2be-32e8-1185-98533ccbb10f.png)



ここで、**New**を押して新規作成する。
※既存のものでやったらエラーが起きてDjangoアプリを実行できなかった
![4.png](https://qiita-image-store.s3.amazonaws.com/0/130097/d36402fc-7bbe-c125-8932-1c4ab9fd6cf3.png)

***Web App name: 任意***
***App Service plan: 新規作成***
***Database server: No databaseを選択***
***その他: 適当でOk***
![5.png](https://qiita-image-store.s3.amazonaws.com/0/130097/51a3726c-a58d-66c2-4134-bac2a2ca4a90.png)



適当に確認したら**Publish**を選択し、デプロイが始まる。(基本的にそのままでよい)
![6.png](https://qiita-image-store.s3.amazonaws.com/0/130097/14df1f7b-523a-3d2f-de7a-067354602582.png)



管理ポータルにて
【App Service】➡️【WebApp】➡️【概要】➡️【URL】
![last.png](https://qiita-image-store.s3.amazonaws.com/0/130097/2818f6e4-2221-c9e3-9561-07d7bbd9067d.png)



URLをクリックしてWebブラウザでみると下のように先ほど作ったDjangoのWebAppを見ることができる。
![7.png](https://qiita-image-store.s3.amazonaws.com/0/130097/de2e74b7-3fa5-c9d3-7dde-b09bfabb9b03.png)
PowerShell と git clone の標準エラー出力で失敗したこと

# 現象

PowerShell で以下のように `$ErrorActionPreference = 'Stop'` した状態で `git clone` すると、

```ps1:test1.ps1
$ErrorActionPreference = 'Stop'

$Git = New-Module -AsCustomObject -ScriptBlock {
    function Clone {
        & git @('clone', 'C:/foo/test.git', 'C:/foo/test_git')
    }
}

$Git.Clone()

Write-Host 'bar'
```

以下のようにエラーで止まる。リポジトリはクローンできている。

```bat:コマンドプロンプトから実行
C:\foo>powershell -ExecutionPolicy RemoteSigned -File .\test1.ps1
"0" 個の引数を指定して "Clone" を呼び出し中に例外が発生しました: "ユーザー設定変
数 "ErrorActionPreference" または共通パラメーターが Stop に設定されているため、
実行中のコマンドが停止しました。Cloning into 'test_git'... "
発生場所 C:\foo\test1.ps1:9 文字:1
+ $Git.Clone()
+ ~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], ParentContainsErrorRecordE
   xception
    + FullyQualifiedErrorId : ScriptMethodRuntimeException 
```

# 対処

ググッて、

* git clone は標準エラー出力にメッセージを出力する。
* PowerShell は外部コマンドの実行の中で標準エラー出力があるとエラーを発生させる。
* `$ErrorActionPreference = 'Stop'` なので止まる。

と理解。

対策として以下のように `git clone` に `--quiet`, `-q` オプションを付けてメッセージを出力させない方法を採用。

```ps1
$ErrorActionPreference = 'Stop'

$Git = New-Module -AsCustomObject -ScriptBlock {
    function Clone {
        & git @('clone', '-q', 'C:/foo/test.git', 'C:/foo/test_git')
    }
}

$Git.Clone()

Write-Host 'bar'
```

https://git-scm.com/docs/git-clone から `--quiet`, `-q` オプションについて引用。

> --quiet
> -q
> Operate quietly. Progress is not reported to the standard error stream.

# よくわからないこと

`New-Module -AsCustomObject` でない場合はエラーが出ない？

```bat:test.cmd
echo foo 1>&2
```

```ps1:test2.ps1
$ErrorActionPreference = 'Stop'

& .\test.cmd # エラー出ない

New-Module -ScriptBlock {
    function Foo {
        & .\test.cmd
    }
}

Foo # エラー出ない

$Bar = New-Module -AsCustomObject -ScriptBlock {
    function Foo {
        & .\test.cmd
    }
}

$Bar.Foo() # エラー出る
```

```bat:コマンドプロンプトから実行
C:\foo>powershell -ExecutionPolicy RemoteSigned -File .\test2.ps1

C:\foo>echo foo  1>&2
foo

ModuleType Version    Name ExportedCommands
---------- -------    ---- ----------------
Script     0.0        __DynamicModule_cfb38636-5538-4e... Foo

C:\foo>echo foo  1>&2
foo
"0" 個の引数を指定して "Foo" を呼び出し中に例外が発生しました: "ユーザー設定変
数 "ErrorActionPreference" または共通パラメーターが Stop に設定されているため、
実行中のコマンドが停止しました。foo "
発生場所 C:\foo\test2.ps1:22 文字:1
+ $Bar.Foo()
+ ~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], ParentContainsErrorRecordE
   xception
    + FullyQualifiedErrorId : ScriptMethodRuntimeException
```
IEではdatasetが効かない


IEでCSSが効いていなかったので、
CSSやJSを1つずつ外していった結果、
原因はdata-属性が振られていなかったからだった

IEではdatasetが効かないようなので、
`$.attr('data-env', 'pc')`に変更

[結局IEでデータ属性（data-*）は使えるのかテスト](http://dasalog.eg2mix.com/jshtml5-data/)
Unity5.5からgradleでAndroidのビルドができるよ

Unity5.5b6で確認しています。

![image](https://qiita-image-store.s3.amazonaws.com/0/19872/ccbf64ee-3d84-efa5-0883-3bc8a7f60108.png)

Unity5.5では、Build Settingsに **Build System** という項目が増え、
**Gradle**によるビルドが選択できるようになっています。
つまり、**build.gradle が使える**ようになるということです。

とは言え、当面はbuild.gradleを手軽に編集することはできないようで、
一旦AndroidプロジェクトをExportするか、裏技的に
`PlaybackEngines/AndroidPlayer/Tools/GradleTemplates/`
にあるテンプレートを書き換えれば一応変更できる、という状況のようです。

https://forum.unity3d.com/threads/android-and-the-new-gradle-build-system.432113/

> That is not supported in the first version. But...
The templates used for creating the build.gradle files are in PlaybackEngines/AndroidPlayer/Tools/GradleTemplates
inside the Unity application directory, so as a hack in the current version you can try changing the mainTemplate.gradle directly.

> Most likely we will add support for providing your own template inside your project in an upcoming patch release.


そのうち対応されるようですが、現在はこういった状況なので、スクリプトで無理やり対応してみます。

**[追記] 5.5.2からは `Plugins/Android/build.gradle` で上書きしてくれるようです。**

Androidプロジェクトをgradle形式でExportできるようになったので、
以下の手順でbuild.gradleを上書きしつつ、ビルドすることができます。

1. Androidプロジェクト(gradle形式)をExport
2. Exportしたプロジェクトの中の`build.gradle`を、`Plugins/Android/build.gradle`に差し替える
3. gradleでビルドする

これを実装したスクリプトをGitHubに上げました。 (2016/10/12更新)
https://github.com/tkyaji/UnityAndroidGradleBuild

`AndroidGradleBuild.unitypackage`をインポートすると、Editor配下にビルド用スクリプトが設置されます。
メニューに `Build -> Gradle Build`という項目が追加されるので、これを実行するとビルドが走ります。

![image](https://qiita-image-store.s3.amazonaws.com/0/19872/ee1f393d-fffb-8c45-11ef-cc36304d920e.png)

以下のようなコードを書くことで、ビルド時に`build.gradle`を編集できるようにしてみました。

```csharp
// 1. add classpath
rootGradleElement.AddElement(new GradleParser.GradleTextElement("classpath 'com.google.gms:google-services:3.0.0'"), "buildscript", "dependencies");
// 2. add dependencies compile
rootGradleElement.AddElement(new GradleParser.GradleTextElement("compile 'com.google.firebase:firebase-core:9.6.1'"), "dependencies");
// 3. add apply plugin
rootGradleElement.AddElement(new GradleParser.GradleTextElement("apply plugin: 'com.google.gms.google-services'"));
```

詳しくはサンプルクラスを参照してください。
[SampleGradleSettings.cs](https://github.com/tkyaji/UnityAndroidGradleBuild/blob/master/Assets/Editor/SampleGradleSettings.cs)



build.gradleが使えると、[PlayServicesResolver を使ってaar入れたり](http://qiita.com/tkyaji/items/b838c97228f99f194bcd)とかが不要になって、
ライブラリ周りではだいぶ便利になるのでとても嬉しいです。


# 余談

[Firebaseを使う際](https://firebase.google.com/docs/android/setup)、`classpath 'com.google.gms:google-services:3.0.0'`
 の設定が必要で、
Unityではムリだと諦めかけていたんですが、これでなんとか動かせるかな？
コールバックを await で待ち受ける(JavaScript)


await は async および Promise を待ち受けることができますが、当然、旧来のコールバックは待ち受けることができません。自分の書いてるコードであれば Promise を返すように書き換えればいいのですが、ライブラリがコールバックを返す場合は困ったりします。

そういう場合、Promise で包んであげれば待ち受けることができます。

例えば setTimeout() のコールバックの実行が完了するのを待ち受けるコードは次のようになります。

```javascript:asyncな関数orメソッドorアロー関数の中のコード
// ...

const hoge = await (() =>
  new Promise(resolve => {
    setTimeout(() => {
      resolve('hoge')
    }, 2000)
  }))()

console.log(hoge) // 2秒後に hoge が出力される

// ...
```
Flash使いのためのAdobe Animate CC でCanvas作成　JavaScript記述の備忘録

#概要
FlashからAnimateになって、本格的にcanvasアプリ作っていなかったので、Action Scriptで実現していた基礎的なことをJavaScriptでどう書けばよいのか、作ってみながらメモります。

##環境
Windows10 + Adobe Animate CC 2015.2

##初期
新規作成で「HTML5 Canvas」を選択する


#いろいろやってみる
##基本事項
- JavaScriptはタイムラインスクリプトとして、直にかけばOK。
- 昔は、``` /*js */``` で囲って書くなど必要だったが、ベタにかけばOK。
- 実行タイミングも、Flashと同じ。JSをかいたスクリプトのフレームに入ったら実行される。

##細かいこと
- ```this``` は省略できない。
- タイプミスなど全く指摘してくれないので、かなり不便。
- ```console.log``` を多用してデバッグしていくのがよさげ。

##フレーム間の変数の取り扱い
1フレーム目で、以下のように書く

```javascript
var a = "あ";
b = "い";
```

２フレーム目で、``` console.log ``` すると、
```a``` は、undefined。
```b``` は、文字列"い"が出力される。
var 宣言をすると、そのフレームのみのローカル変数となるようだ。


## play(),stop();
ASとほぼ同じ

```javascript
this.play();
```

```javascript
this.stop();
```

##ボタンクリック
ボタンシンボルのつくりかた、インスタンス名の付け方は、Flashと同じ。アップ、オーバー、ダウン、ヒットも何もせず動作する。
クリック時のJSは以下。(btn1がボタンシンボルにつけたインスタンス名)

```javascript
this.btn1.addEventListener('click',clickFunc);

function clickFunc(){
	//処理をかく
}
```

- ボタン自身のオブジェクト自身を取得したい（ASの ```Event.target``` ）が、まだその方法がわかっていない。どなかた教えてください。

## gotoAndPlay()　gotoAndStop()
ASと同様にフレーム番号指定もできるが、ASはフレーム番号1から始まるのに対し、JSは、フレーム番号0から始まる。よって、1つずれる。
分かりらいので、ラベルをつけてジャンプするのがオススメ。ラベルの設定は、ASと同じ。
また、クリックして ```gotoAndPlay``` するようなときは、以下のようにroot宣言しておく。

```javascript
var root = this;
this.btn1.addEventListener('click',clickFunc,this);

function clickFunc(_obj){
	root.gotoAndPlay("page1");
}
```

## MovieClip制御　.x .y .scaleX .scaleY .visible .alpha
以下は動いた

```javascript
var root = this;
this.btn2.addEventListener('click',clickFunc2);

function clickFunc2(){
	root.mc.x += 10;
	root.mc.y += 10;
	root.mc.scaleX += 0.1;
	root.mc.scaleY += 0.1;
	root.mc.visible = !root.mc.visible;
	root.mc.alpha -= 0.1;
}
```

以下のプロパティは動かなかった。
```.width``` ```.height```

#ローカルで動かす場合の注意
Webサーバーではなくローカルファイルを開いて使う機会は少ないと思いますが…
ローカルで動作させる場合に特有のエラー回避方法です。
特にChromeでエラーがでます。

##スプライトシートは使わない
パブリッシュ設定で「スプライトシートに結合」のチェックを外す。これのチェックが入っていると、以下エラーで表示自体ができない。

> Uncaught SecurityError: Failed to execute 'toDataURL' on 'HTMLCanvasElement': Tainted canvases may not be exported.

なお、スプライトシートを使わないと、画像ファイルがライブラリ内のシンボル名どおり出力されます。日本語OSならバグることはないですが、英数字にしておいたほうが無難です。

##ボタンは使わない。
ボタンシンボルではなく、ステージに配置した「ボタンインスタンス」は使わない。
正確には、「ビットマップが含まれるファイルでボタンがあるとエラー」になります。「ムービークリップインスタンス」にすればOK。

##ボタンの中にビットマップを使わない。
上記の注意事項で「ムービークリップインスタンス」にしても、そのクリックアクションをつけたムービークリップの中にビットマップがあると、クリックアクションが発動したときに以下エラーになる。

> Uncaught An error has occurred. This is most likely due to security restrictions on reading canvas pixel data with local or cross-domain images.

解決策は、ボタンの上に、アルファ1のムービークリップ（中身はシェイプだけ）を重ね、そのムービークリップに対してアクションを設定する。
※アルファ0だと、クリックアクションが設定できない（イベントが発生しない）ため、アルファ1にする。

#参考サイト

公式
CreateJS　http://www.createjs.com/

参考にした記事など
https://github.com/HAKASHUN/manabi/issues/11

---

徐々に追記していきます。