OmniAICreator/Qiita-1.07M huggingface dataset:
Elm&Rails5.1の環境構築 (globalに干渉せずに)

Rails5.1のwebpackerを用いて、Elmの環境を構築したのでメモ。

# Rails5.1の導入
https://qiita.com/emadurandal/items/e43c4896be1df60caef0
にRailsをローカルにインストールする丁寧な解説が載っているので、これをそのまま実行しました。
(記事では、5.xは未確認となっていますが、問題なかったです)
Gemfileのrailsのバージョンを指定しなければ、最新がインストールされます。

# Webpackerの導入
```
$ bundle exec rails server
```
でrailsサーバーが立ち上がったら、Webpackerをダウンロードします。

Gemfileに

```
gem 'webpacker'
```
を追加して、

```
$ bundle install --path vendor/bundle
```
を実行。

# Elmのインストール

```
$ bundle exec rails webpacker:instal:elm
```
でElmがインストールされます。

確認方法としては、```Main.elm```が自動で生成されているので、これを表示してみる。

```# app/view/application/index.html.erb```

```erb
<%= javascript_pack_tag "hello_elm" %>
```

```# config/routes.rb```

```ruby
Rails.application.routes.draw do
  get '/', to: 'application#index'
end
```
これらを書き足したら、をもう一回サーバーを立ち上げると「Hello Elm!」とブラウザに表示されるはずです。

```
$ bundle exec rails server
```

#経緯
最初に紹介した記事の

```
$ bundle exec rails new example --skip-bundle
```
に```--webpack=elm```を付け足して実行してもエラーになったので、対処法を探した次第です。

#参考
https://pragmaticstudio.com/blog/2017/5/12/elm-with-rails-5-1
[小ネタ]Basic 認証の際に必要な Authorization ヘッダーを作成する

小ネタです。

# 結論

Mac で試しましたが、以下のような形式で出力可能。
username/password は実際に値に置き換え下さい。

```bash
$echo "Basic $(echo -n 'username:passoword' | base64)"
```
あとはこれを Authorization ヘッダーに追加すればOK.

```bash
curl https://xxxxx -H 'Authorization: Basic MjhkdH
```

[Postman](https://chrome.google.com/webstore/detail/postman/fhbjgbiflinjbdggehcddcbncdddomop?hl=ja) を使うと GUI で直接ユーザー名・パスワード入力で Authorization ヘッダーの追加などもしてくれるのでこれを使うのもあり。

# そもそも Basic 認証の手順とは

Basic 認証を通すためにはクライアントでは以下のようにする必要があります。

[Basic access authentication](https://en.wikipedia.org/wiki/Basic_access_authentication#Client_side)


>The username and password are combined with a single colon. (:)
>The resulting string is encoded into an octet sequence.[7]
>The resulting string is encoded using a variant of Base64.[8]
>The authorization method and a space (e.g. "Basic ") is then prepended to the encoded string, separated with a space.

最終的に`Authorization: Basic QWxhZGRpbjpPcGVuU2VzYW1l`という文字列を作ります。
Apacheのmod_rewrite設定メモ

# この記事でわかること
dockerにて、Apacheのmod_rewriteの設定を行い、リクエストするURLをスマートにする方法。

どんなURLを指定されても、index.phpを介してコントローラへ処理を引き渡すようにする方法。

# 経緯
REST APIを試そうとしたが、URLの指定方法が気に入らなかった。
処理`hoge`を呼び出すとき、以下のようにURLを指定させたかった。

**やめたかったURL表記**
`https://localhost/api.php?action=hoge`

**やりたかったURL表記**
`https://localhost/api/hoge`


# 解決策
## 1．モジュールを入れる
debian系OSが元になっているDocker Imageの場合、このコマンドでrewriteモジュールを有効化する必要があるそうです。
`a2enmod rewrite`

## 2．apache設定ファイルを編集
`/etc/apache2/sites-available/000-default.conf`を編集。
以下を`<VirtualHost></VirtualHost>`内に追加。

```:000-default.conf
    <Directory /var/www/html>
        Options Indexes FollowSymLinks MultiViews
        AllowOverride All
        Require all granted
    </Directory>
```

## 3．.htaccessを編集
`/var/www/html`の`.htaccess`を編集します。（なければ作成します。）

```:.htaccess
<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteRule ^api/(.*)$ index.php
</IfModule>
```
この設定をすることで、`https://localhost/api/`で始まるURLで指定されたリクエストは、すべて`index.php`を実行するようになりました。
あとは、`index.php`で、`$_SERVER['REQUEST_URI']`でとってきたURL情報を`/`で区切るなりなんなりし、パラメータとして取り出せばいいのかな。
（この方法を使うと`$_SERVER['PATH_INFO']`は使えなくなるらしい。）

# その他
Dockerで行う場合は、Dockerfileにコマンドを記述するなり、設定ファイルをビルド時に配置させたりして何とかする。

# 参考
http://magcho.hatenablog.jp/entry/2017/08/11/213243
HoudiniのUIフォントを変更する

_2015/02/15 過去記事の移行記事_

---

# はじめに

先日、定型のHQueueを自動生成するようなスクリプトを書いていて、ヒューマンエラー対策に以下のようなダイアログボックスを表示することになっていた。

![スクリーンショット 2015-02-14 午前11.46.33.png](https://qiita-image-store.s3.amazonaws.com/0/51857/9eebd56e-a71e-2296-b250-4320a431b8c6.png)


ここで遊び心で日本語使った時(Houdini 14でマルチバイト文字にも対応しましたし！)にデフォルトフォントだとちょっとしっくりこなかった。

なのでふとSNSでその事に関してつぶやいたところSESIの中のKen Takiさんが気づいてくださって早速のアドバイスを頂きました。ということで、実際は以前にすでにTakiさんが書かれていた記事に行き当たったわけで。。気づいておらずごめんなさい…。

それで、Macでこの方法を試そうとしたのですが、当たり前のごとくディレクトリ構造がそもそも違う上、そのためにあれこれしたのでそれを残しておきたいと思う。

# 概要

○ HFSのhoudini/fonts/font.mapを編集する。Proportional-CJKとFixed-CJKが日本語・漢字などのマルチバイト文字フォントを取り扱っている。
○ HOUDINI_USER_PREF_DIRの環境変数下にfonts/font.mapという形で保存しなおす。起動時にHoudiniがこちらを読みに

# 方法

まずはHoudiniのfontを設定している位置を特定する。
そのためにはまずHoudiniのコンフィグ位置を特定しなければいけない。

Houdini Tuminalを使用する。
![スクリーンショット 2015-02-15 午前10.21.35.png](https://qiita-image-store.s3.amazonaws.com/0/51857/08c91e18-fd8e-0594-7b72-e61c5d246ef5.png)


そしてマシンの名前やユーザー名が表示されてカーソルが表示されたら`hconfig`とだけ入力する。

すると、以下のような情報が表示される。

```
HFS                       := '/Library/Frameworks/Houdini.framework/Versions/14.0.228/Resources'
HOME                      := '/Users/(ユーザー名)'
HOUDINI_DESKTOP_DIR       := '/Users/(ユーザー名)/Desktop'
HOUDINI_OS                := 'MacOS'
HOUDINI_TEMP_DIR          := '/tmp'
HOUDINI_USER_PREF_DIR     := '/Users/(ユーザー名)/Library/Preferences/houdini/14.0'
SHELL                     := '/bin/bash'
USER                      := '(ユーザー名)'
```
上記でハイライトされているHFSとHOUDINI_USER_PREF_DIRが今回利用するディレクトリ。



まずHOUDINI_USER_PREF_DIRを開いておく。

デフォルトでは/Users/(ユーザー名)/Library以下のディレクトリは隠されているのでこれを表示する。

Finderのコンフィグを書き換える方法で表示してもいいのだが、再起動や書き直しなどが面倒臭いのでターミナルを使う。

ターミナルでユーザーのディレクトリにいる事を確認したら、 `open library`と入力する。

するとFinderで隠しフォルダ以下が表されるのでそのままHOUDINI_USER_PREF_DIRのディレクトリ位置に行く。

そこでfontsというフォルダを作る。



次に別ウィンドウかタブでHFS下に行く。

このディレクトリの **houdini/fonts/font.map** がUIフォントを設定しているファイルになる。

これを先ほど作成したfotnsフォルダにコピペする。

コピペしたfont.mapをテキストエディタで開いて以下でハイライトされている内容を編集する。

デフォルトでは中国語のためのフォントになってるため日本語表示が変になってしまっている様。

これをMacに搭載されているフォントに切り替える。無難なところだとOsakaフォントなどではないだろうか(文字が小さくても見やすい。ここ重要。)。

```
# A flat list of UI font usage to font name mappings
Black   "Vegur Bold"
Proportional  "DejaVu Sans"
Proportional-CJK "WenQuanYi Zen Hei Mono"
Fixed   "DejaVu Sans Mono"
Fixed-CJK  "WenQuanYi Zen Hei Mono"
```
↓↓↓↓↓↓↓↓↓↓

```
# A flat list of UI font usage to font name mappings
Black   "Vegur Bold"
Proportional  "DejaVu Sans"
Proportional-CJK "Osaka"
Fixed   "DejaVu Sans Mono"
Fixed-CJK  "Osaka"
```

これを保存した後、Houdiniを起動・再起動してあげると変更される。


以上！



[References]
・ikatnek: Houdini 14: Changing UI font
・Change $HOME Location - General Houdini Questions - od|forum
DIVIDING SURFACES IN CUBIC BLOCKS

_2012/06/20 過去記事の移行記事_

---

TutorialのLearning Pyro FXにおいて、CubeのDivisionの値ごとに切り取りを行う手段があったので、それのメモ。
_↑この動画資料が消えてた…。ノート残しといてよかった…。_

![82d74734f147dd038a17378cb743f8f4.png](https://qiita-image-store.s3.amazonaws.com/0/51857/8642a0a3-9df9-e4e0-754c-c883980daa78.png)

![81a0bc972dc91b2d9c07fc64b647f09a.png](https://qiita-image-store.s3.amazonaws.com/0/51857/b8516473-793e-1c64-f414-6e15c75792e2.png)


まず、Geometry内にboxを作成、それにIso Surface nodeを追加、box1の下に繋ぐ。

Iso Surfaceは、Objectに等尺性のsurfaceを生成さる。

ParameterのImplicit Functionにexpressionを入れてbox1の表面を変化させる。
`snoise($X*5+100, $*5, $*5)`
**snoise** はsimulated noiseの一種で、ここではX, Y, Zにsimulationでnoiseをかける。

Divisionsの値を30に上げる。これで3方向に30づつの分割がされたことになる。

 ![fa3cf35ef79c0bd0d3481cfd161c7dd0.png](https://qiita-image-store.s3.amazonaws.com/0/51857/130c7121-4a95-6412-1b7c-81eb4c4eb4e5.png)

この立法方向へのDivisionは、これはBuild Volumeのcheck boxにチェックを居れる事で分かりやすくなる。

 ![b0bfcb3f5a5ce008eae5862fcaee5628.png](https://qiita-image-store.s3.amazonaws.com/0/51857/4cd4de0a-4e8d-4dad-57b1-bf4a75abcf33.png)


このチェックを入れると、Veiwport上で以下の様な表示になり、よく見ると、透けた面が何枚も重なってるようになっている。これが各立法方向への分割面となる。(Divisionsの値をいじってリアルタイムで確認するとさらに分かりやすい。）


![c50a8a681ac2ecf48f4b37cf3780ebe3.png](https://qiita-image-store.s3.amazonaws.com/0/51857/b9d18ecc-4139-a568-7308-7527937cee8f.png)


Box nodeを追加する。box2のParameterのDivisionsにチェックを入れ分割する。

iso1をコピーしてIso Surfaceを増やす。

box2のDivisionsをCopy Parameterし、iso2のDivisionsのところでPaste Copied Relative Referencesしてbox2のDivisions parameterのアクションをiso2のDivisions parameterに同期させる。

ここで、iso2のDivision parameterの各値に
`ch("../box2/divsx")`
のdiv"x"の値が各方向のものが代入された。

box2の下にColor nodeをつなぐ。

iso1とiso2をSwitch nodeで接続する。

switch1の下にColor nodeをつなぎ、ParameterのColor TypeをBounding Boxに変更する。これで虹色のカラーが適用される。

![a65fd95940a64d507456bb3482513b0f.png](https://qiita-image-store.s3.amazonaws.com/0/51857/4d0a4964-7edf-47c3-cb1a-57f822bf0c50.png)


後は、color1とcolor2をMerge nodeで接続する。

ここで、switch1でiso2が表示されるようにし、box2のDivisionsの値を弄ってる。

最初の設定だと10の値で、このままであればトップの画像と同じようになっているだろうが、例えば、iso1のDivisoionsの値と同じ30まで上げてみるとiso1で設定したsurfaceと同じsurfaceを生成する結果が生まれる。

 
![b36f44422f17882c015e644c6e4f98b9.png](https://qiita-image-store.s3.amazonaws.com/0/51857/a141319b-e0a7-2b8a-a1ff-3ed3e4fcee99.png)



TutorialでのDivisionに関する取り扱いはこれまでだが、Gas Solver系を扱って行く時やFluid Solver、Smoke Solverなどにも関わって来る基礎的知識なので理解しておきたい。


[References]
Learning Pyro FX - Side Effects Software Inc.
最大/最小のバウンディングボックスサイズを取得する

_2012/07/04 過去記事の移行記事_

---

例えば、Geo to I3D ROPを使用する時、解像度の設定やバウンドのサイズの設定が必要になる。
このメモでは、それらを持ってくるエクスプレッションについてまとめることにする。

![スクリーンショット 2012-06-24 13.45.33.png](https://qiita-image-store.s3.amazonaws.com/0/51857/6b8433c5-8cbb-6ca3-2483-d4a6e7afefbf.png)

まず最初に、IsoOffset SOPなどのバンドボックスを持ったデータをおかなければならない。それから、ボックス内に値を入力する。しかしながら、例えば、バンドボックスのサイズを変更した際や何かIso Surfaceと関連したものを変更した際に自動的に値が変更するようにしたい。そこで、それらの値にエクスプレッションを当てることにする。

先に解像度に関して述べると、適切なサイズの値を持ってくるためにこのエクスプレッションを使用する。

`volumeres(surface_node, prim_id, axis)`

もし、Geo to I3Dノードにこのエクスプレッションを入れたいのであれば、それぞれのaxis resolutionに入れる。例えば、サーフェイスノードがIsoOffset(isooffset1)の場合でボリュームノードの数が0の時、エクスプレッションはこうなる。

`volumeres("../../isooffset1", 0, 0)`

ここでaxisの値の所に0を入れた理由は、左のボックスはX軸に値するからだ。
ここで使用する値を記載しておく。

```
X軸 = 0
Y軸 = 1
Z軸 = 2
```

次にMin Bounds及びMax Boundsに当てはめるエクスプレッションだが、こういう構造になっている。
bbox(surface_node, type)
ここでのsurface_nodeは例えばIsoOffsetから値を持ってくるのであれば、そのIsoOffsetのパスを書けばいいのだが、Typeが少し特徴的だ。Min Boundsの場合、それらを箇条書きするならばこうなる。

```
X軸 Type = D_XMIN
Y軸 Type = D_YMIN
Z軸 Type = D_ZMIN
```

そして、これをMax Boundsのパラメーターに入力する際はMINのところをMAXに書き換えるだけだ。
【Android】もっと見るボタンの作成

#もっと見るボタン

##部品
contentsTextView　：　表示領域を可変にしたいテキストビュー
readMoreTextView　：　「もっと見る」ボタンとして利用するテキストビュー

##仕様
コンテンツのテキストが8行より多い場合　→　「もっと見る」を表示

##実装内容
Android5以上ではgetEllipsisCount()を使用
それ未満では使えない？ぽいのでテキストビューの最大行数より、表示されているテキスト行数が多いか少ないかで「もっと見る」を表示するかどうかを判断しています。
 

##コード

```MainActivity.java

public void setView (){

            contentsTextView.setMaxLines(8);
            contentsTextView.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
                @Override
                public boolean onPreDraw() {
                    int lineCount = contentsTextView.getLineCount();

                    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                        //android 5以上じゃないと正常に動作しないぽい

                        int hiddenLineCount = contentsTextView.getLayout().getEllipsisCount(lineCount - 1);
                        if (hiddenLineCount > 0) {
                            readMoreTextView.setVisibility(View.VISIBLE);
                        } else {
                            readMoreTextView.setVisibility(View.GONE);
                        }
                    } else{
                        //android 5未満

                        if(lineCount > 8){
                            readMoreTextView.setVisibility(View.VISIBLE);
                        }else{
                            readMoreTextView.setVisibility(View.GONE);
                        }
                    }

                    return true;
                }
            });
}

@Override
    public void onClick(View v) {

        if (v.getId() == readMoreTextView.getId()){

                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                    contentsTextView.setMaxLines(100);
                    contentsTextView.setEllipsize(null);

                } else {

                    contentsTextView.setMaxLines(1000);
                    contentsTextView.setEllipsize(null);
                }
            }
    }


```
hou.session とかいう、地味便利機能

## 概要

HoudiniのメインメニューのWindow > Python Source Editorで、サンプルコードをさくっと書いて実行できるという事を知っている人は多いと思う。で、そのWindowのところをよく見ると、 **Source File** のところで **hou.session module** というのが記載されている。これ何？なんか意味あんの？ではここの意義ってなんだろう？？

![Screenshot from 2017-11-19 01-24-51.png](https://qiita-image-store.s3.amazonaws.com/0/51857/dcbeeaf5-b34e-36c4-8c93-1e82095c18db.png)

## とりあえず基本の使い方

Python Source Editorは、Python Shell(Python Panel)などのインラインコード入力と違いコードの維持が複数行にわたって可能なため、以下の様にテストとして利用するケースがある。

![Screenshot from 2017-11-19 02-02-54.png](https://qiita-image-store.s3.amazonaws.com/0/51857/1873ebcd-9392-aeaf-67a3-e10e60d0b6a1.png)


## hou.session とは？

とりあえず、これに関してはドキュメントがあるので、そのリンクを貼っておく。

> [hou.session module](http://www.sidefx.com/docs/houdini/hom/hou/session.html)

まぁ、つまり書いている事をとりあえず、やってみるとこういうこと。

とりあえず、これだけ入力してApplyしておく。

```Python
import hou    
    
def checkPrimCount(node):
    geo = node.geometry()
    print len(geo.prims())
```

そんでもって、Python Shell(Python Panel)にて実行してみる。

っと入力してると…,


![Screenshot from 2017-11-19 02-05-27.png](https://qiita-image-store.s3.amazonaws.com/0/51857/3f4cf5aa-940e-0ab0-ddd5-32b646ce180f.png)

予測変換に出てくる!!

で、実行すると、

![Screenshot from 2017-11-19 02-08-17.png](https://qiita-image-store.s3.amazonaws.com/0/51857/8dbadd89-a293-a258-a9c4-9ee77b7b225e.png)

実行できる！


ということで、つまるところ、デフォルトで **Python Source Editorで実行されたものはhou.sessionのオブジェクトアトリビュートとして格納される**。そして、このhou.sessionはhipシーン内のどこでも利用出来るため、Python Source Editorの中で実行したものが実行出来るようになる！

とまぁ、これはPython使ってると、よくみる使い方だったりはする。hou.sessionは、Houdiniがこういった用途で様々な場所で使えるように用意されたスペースのようものと捉えればよいかと。


なので、ボタンに使って実行してみたりと、関数化でコードを書きつつ実行テストみたいなのも出来たりする。

![Screenshot from 2017-11-19 02-12-22_edit.png](https://qiita-image-store.s3.amazonaws.com/0/51857/c291d542-d0e0-72ab-0b9a-054cd55d4317.png)


## hou.session に色々突っ込む

hou.sessionに対して関数が適応されたのは認識した。

ということで、この挙動から気づく人も要ると思うが、このhou.sessionオブジェクトにアトリビュートをどんどん追加していける。

```Python
hou.session.defaultValue = 100
```

とか、ただのIntegerのやつを突っ込んで、以下のように入力すると、代入した値が返ってくる。

```
hou.session.defaultValue
```


## まとめ

いろいろツール構えの実行テストとかでとりあえず関数作ってみたりとか、あと、いろいろ値を突っ込める様に用意されているクラスがこのhou.sessionだったりする。さらに、それらはhipシーン内のどこでも利用が出来る。
まぁ、実にPythonらしいというかなんというか、こういう事もできちゃうのだけれど、オブジェクト指向を認識してない人だと、ちょっと混乱してしまうかもしれない。これを機会に、Pythonの中身をじっくり勉強してみるのも良いのでは？？

## ついでにオススメ書籍
[パーフェクトPython](http://amzn.to/2zOgLbk) - どちらかというとPythonプログラミング経験者向けの書籍だけれども、ざっくりと挙動の事が書かれてたりして読みやすい。
<a href="https://www.amazon.co.jp/%E3%83%91%E3%83%BC%E3%83%95%E3%82%A7%E3%82%AF%E3%83%88Python-Python%E3%82%B5%E3%83%9D%E3%83%BC%E3%82%BF%E3%83%BC%E3%82%BA-ebook/dp/B00P2EG5QM/ref=as_li_ss_il?_encoding=UTF8&qid=1511025788&sr=8-1&linkCode=li2&tag=magister72rak-22&linkId=7eee2323c534eee9b5437fa7e09e15de" target="_blank"><img border="0" src="//ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&ASIN=B00P2EG5QM&Format=_SL160_&ID=AsinImage&MarketPlace=JP&ServiceVersion=20070822&WS=1&tag=magister72rak-22" ></a><img src="https://ir-jp.amazon-adsystem.com/e/ir?t=magister72rak-22&l=li2&o=9&a=B00P2EG5QM" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />
ubuntuでAndroid StudioのEmulatorが起動しない問題

環境  
- ubuntu17.10
- Android Studio 3.0

エミュレータを動かそうとすると、下記のようなエラーとなり起動に失敗してしまいます。

```
1:08	Gradle sync started

1:08	Project setup started

1:08	Gradle sync finished in 2s 16ms (from cached state)

1:09	Executing tasks: [:app:assembleDebug]

1:09	Emulator: libGL error: unable to load driver: nouveau_dri.so

1:09	Emulator: libGL error: driver pointer missing

1:09	Emulator: libGL error: failed to load driver: nouveau

1:09	Emulator: libGL error: unable to load driver: swrast_dri.so

1:09	Emulator: libGL error: failed to load driver: swrast

1:09	Emulator: X Error of failed request:  BadValue (integer parameter out of range for operation)

1:09	Emulator: Major opcode of failed request:  155 (GLX)

1:09	Emulator: Minor opcode of failed request:  24 (X_GLXCreateNewContext)

1:09	Emulator: Value in failed request:  0x0

1:09	Emulator: Serial number of failed request:  33

1:09	Emulator: Current serial number in output stream:  34

1:09	Emulator: Process finished with exit code 1

1:09	Gradle build finished in 10s 28ms
```

調べると環境変数にANDROID_EMULATOR_USE_SYSTEM_LIBS=1を設定すると解決するようです。
参考:https://qiita.com/fjmthdk/items/64e57a559dab6d5235d3

```bash
export ANDROID_EMULATOR_USE_SYSTEM_LIBS=1
```

Android Studioを再起動してエミュレータを起動してみると、今度は起動しました。
が、起動してから数秒で落ちてしまいます。
エラー内容はこちら

```
1:24	Emulator: Process finished with exit code 139 (interrupted by signal 11: SIGSEGV)
```

これは調べても解決方法が見当たらなったので、手当り次第にAVDの設定を弄っていたところ、
Emulated PerformanceのGraphicsをAutomaticからSoftwareに変更すると起動するようになりました。
Herdwareにすると落ちることから、AutomaticでHerdwareになっていたのが原因みたいです。

Android Studioの公式ガイド:https://developer.android.com/studio/run/managing-avds.html?hl=ja#hpproperties によるとEmulated PerformanceのGraphics項目は

>エミュレータでのグラフィックのレンダリング方法を選択します。
>
>[Hardware]: コンピュータ グラフィック カードを使用して高速レンダリングします。
>[Software]: ソフトウェアでグラフィックをエミュレートします。グラフィック カードでのレンダリングに問題がある場合に便利です。
>[Auto]: グラフィック カードに応じてエミュレータが最適なオプションを選択します。

とのことです。私のPCのグラボは玄人志向の GEFORCE GTX 1050 GF-GTX1050-2GB/OC/SF です。
ハードウェア設定の方が良いみたいですが、対応するまではソフトウェア設定で我慢しよぅと思います。
Unityから実機にビルドしたapkでGoogle Play Games Servicesにログインできない

めちゃめちゃハマったけど日本語の解決策が見つからなかったので記事残しときます。

#前提
[Google Play Games Services](https://developers.google.com/games/services/)をUnityで使いたいと思った時に、GitHubにある[Unityプラグイン](https://github.com/playgameservices/play-games-plugin-for-unity)を使うと思います。

READMEの言うがまま、Developer Consoleの設定と、Unityでの設定を済ませて、ちょっとしたコードを書き、PCとAndroid端末を繋いでUnityからアプリをビルドして実機テストしてました。

ちなみに自分の環境は
Unity 2017.2.0f3
Google Play Games Plugin 0.9.42
Mac OS X Siera 10.12.6
Android 6.0.1
Nexus 5

#起きた問題

実機で開くと一瞬Google Play ゲームのポップアップが出たと思ったらすぐ消える。

ログを見ると

``` :Log
V/GamesNativeSDK: Play Games callback indicates connection failure.
I/GamesNativeSDK: UI interaction required to connect to Google Play.
I/GamesNativeSDK: Resolving connection.
```

とかが出ている。
コード的に書いたのは

```:C#
PlayGamesClientConfiguration config = new PlayGamesClientConfiguration.Builder().Build();
PlayGamesPlatform.InitializeInstance(config);
PlayGamesPlatform.DebugLogEnabled = true;
PlayGamesPlatform.Activate();

Social.localUser.Authenticate((bool success) => {
    Debug.Log("Auth Success: " + success);
});
```
これが`Auth Success: False`を吐く。

**認証できない。**

#うまくいかなかった理由
問題は[Google Play App Signing](https://support.google.com/googleplay/android-developer/answer/7384423)という最近できた機能を使っていたからでした。

今まではGoogle Playにアプリをあげるのにはキーストアを発行してそれと紐づける必要があったのですが、最近このアプリ署名という機能ができて、ビルド時にキーストアが不要になったぽいです。（というかそっちがデフォルトっぽい感じに。）

代わりに、Googleにアップした時に署名(SHA-1 署名証明書フィンガープリント)をつけるらしいのですが、Google Play Games ServicesはそのGoogle側がつけた署名のあるapkからAPIを叩かないとうまくいきません。

**PCから直接デバイスにインストールしたapkは正しい署名を持っていないので、API叩いてもエラーになります。**

というか、Games ServicesのプロジェクトをDeveloper Consoleで作成する時に、すでに上げてたアプリのプロジェクトと紐づけたので、その時にAPI用の署名がアプリのものになったぽいです。ゲームサービスのAPIの署名は[変えられる](https://console.developers.google.com/)のでPCでキーストア作ってSHA-1を抜いてAPIの設定変えたらPC直インストールのでも通ると思いますが、そのビルドはストアには上げられなくなるのd（めんどくさいのでやめましょう）


#結論
**Google Playからアプリをインストールしましょう。**

キーストアなしでビルドしたapkをDeveloper Consoleにあげた場合は（=App Signingを使った場合は）、Alpha/Betaテストのユーザーとして　Google Playからアプリをインストールするとうまくいきます。（とりあえずログインとリーダーボード開くまではうまく行きました。）

PCから直インストールでもこれからなんとかなるようにもなるかもしれないです。その際この記事は不要になります。

というかこれ、Unity環境だけじゃない気がしますが。

#参考
[Can't login to the play game services - RESOLVED #1834](https://github.com/playgameservices/play-games-plugin-for-unity/issues/1834)
Javaのインストールが自由に行えない環境でJavaのversionを変えて実行する方法

Javaのインストールが自由に行えない環境でJavaのversionを変えて実行する方法をjmeterを例に記載する。

#1.コマンドプロンプトを起動する。
#2.実行したいjavaのversionのjreが格納されていフォルダをパス指定する。
＜コマンド＞
set PATH="C:\00_dev_eclipse\pleiades-4.7.0-java-win-64bit-jre_20170628\pleiades\java\8\bin";%PATH%
#3.Jmeterのディレクトリに移動する。
＜コマンド＞
C:\01_tool\apache-jmeter-3.3\bin
#4.Jmeterを実行する。
＜コマンド＞
jmeter.bat
mecabのユーザー辞書をphp-mecabから認識させる

mecabのユーザー辞書をインストールして、mecabrcも書き換えて、コマンドラインでユーザー辞書が使われているのを確認して、さあphpから処理をスタートするぞって時に「あれっ、エラーになる？」そんな時は、**php.ini**の**mecab.default_userdic**を作成したユーザー辞書ファイルに指定しましょう。

（※ini_setでやる場合）

```php
ini_set('mecab.default_userdic', '/usr/lib64/mecab/dic/ipadic/user.dic');
```

尚、ユーザー辞書ファイルにたどり着けなかった場合は変わらずエラーとなるのでご注意を。


```php
// 失敗したコード
ini_set('mecab.default_userdic', '/home/ec2-user/mecab/user.dic');

/*
 PHP Warning:  MeCab_Tagger::__construct(): '/home/ec2-user/mecab/user.dic' does not exist or is not readable in /var/www/html/text/text_convert.php on line 43
*/
```
Google Home(実機)から開発中のGoogle Assistant のappをテストする方法

特に難しくもなんともないですが、最初わからなかったんで、
同じような悩みを持つ人もいるかもしれないと思いアップします。


## 環境


- Google Home mini
- Nexus5X
  - 「Google Home」アプリをインストール済み
    <br> → Google Assistant appの開発に使ったのと同じGoogle アカウントでログイン済み
    <br> → Google Home Miniと連携して「オフィス」という名前で登録済み
    <br> → 言語は日本語

- 開発中のGoogle Assistant App
  - [GithubのGoogle公式のサンプル](https://github.com/dialogflow/fulfillment-webhook-importer-nodejs)から流用したもの
  - DialogFlow
  - US英語

※DialogFlow以外でもいけるんじゃないかと思われるが、未確認です。



  

## DialogFlowのコンソールの設定

1. [DialogFlowのコンソール](https://console.dialogflow.com/)をブラウザで開く。
2. 左上のハンバーガーメニューで、開発中のAppを選択。
3. Integrationsをクリック。
4. Google Assistantアイコンをクリック。
5. 右下のTESTをクリック。
6. 「TEST YOUR APP」の右の方にある「VIEW」をクリック。
7. Simulator画面で、右上の方の「PC+スマホ」のアイコンをクリック。
ポップアップが開き「Testing Device」が「Active」になっていればOK。

　　<img width=400 src="https://qiita-image-store.s3.amazonaws.com/0/173392/e2f541dd-9fbb-667c-5dc9-03fffaccd50e.png">

　しかし、もし「PC＋スマホ」のアイコンに斜め線が入っていたら、画面左下に「START TESTING」というボタンがあるのでクリックする。
　　<img width=400 src="https://qiita-image-store.s3.amazonaws.com/0/173392/8d12b46d-4c20-397b-127d-a93e53cab5cc.png">

8 . Simulator上で動作確認する。
　シュミレーターの左下にある文字記入欄に「Talk to my test app」と字が出ているので、そこにカーソルを持って行って入力欄をクリックし、エンターで実行。
　　<img width=200 src="https://qiita-image-store.s3.amazonaws.com/0/173392/86d2a2ed-431a-bbd5-59dc-4c810532e504.png">

　Appが正常に出来上がっている状態なら、Google Assistantが期待通りの返答をする。
　　<img width=400 src="https://qiita-image-store.s3.amazonaws.com/0/173392/180cf76d-96a6-7353-b322-a14ce04a957d.png">
　Simulatorでは、画面左側にGoogle Assistant appのアウトプットが表示され、右側はRequestやResponseの生のJson。デバッグ用に使う。
　もしここで動作がおかしい場合は、あとでGoogle Homeでも動かないので、Appを直して再度チャレンジ！


## スマホの「Google Home」アプリの設定

「Google Home」アプリは[これ](https://play.google.com/store/apps/details?id=com.google.android.apps.chromecast.app&hl=ja)。iOS用にもおんなじのがある。
今回は、Google Assistant appの対応言語がUS英語なので、Google Home miniの設定もUS英語にする。

1 . スマホのGoogle Homeアプリを起動
2 . 左上のハンバーガーメニュー
3 .「その他の設定」
4 .「デバイス」の「オフィス」を選択
5 .「アシスタントの言語」で「English(US)」を選択
　
設定変更後は、Google Home Miniに反映されるまで10秒くらいかかる。この間は呼んでも応答しない！

## Google Home Miniに呼びかける

まず、英語の設定が反映されたか状況確認のために軽く一発きいてみる。

自分：" OK Google, What's the whether of tokyo ?"
Google Home：" Meguro weather is ほにゃらら〜（聞き取れない..(^^;)"

英語環境はOKそう。
ついでにもう一発聞いてみる。


自分：" OK Google, What's the result of Arsenal vs Tottenham ?"
Google Home：" Yesterday, （ほにゃらら） two Nil to ARSENAL" 

おー、、よしよしいいぞー (^^) 
さっきのノースロンドンダービーでアーセナルは勝っており、点数も正解(^o^)
![スクリーンショット 2017-11-19 0.25.03.png](https://qiita-image-store.s3.amazonaws.com/0/173392/fffcd969-8040-838d-1f53-abbfbb46d988.png)


というわけで英語の設定はOK。
次はAppのテスト。

自分：" OK Google, Talk to my test app ?"
Google Home："（回答）"
先ほどSimulatorでテストした時と同じ回答をしてくれたら、OK！

## 注意事項

- 同時にテストできるappは1個だけのようだ。

（複数アプリを開発する時は、1アプリ毎に１グーグルアカウント用意しなきゃいけなくなるんだろうか？）
Unity などで CSV ファイルを読み込むためのコードを C# で書いた (CsvHelperを使いたくなかった)

## tl; dr
https://github.com/furukazu/UnityCSVReader

`var result = CSVReader.ParseCSV(File.ReadAllText(@"/Users/furukazu/data.csv"));`


## 目的など

CsvHelper の導入が面倒なので、何か雑にコピペして使える CSV　読み込み機構が欲しかったので作った。

`string.Split(',')` でやってるコードがやたら検索上位に出回っているけど、これだとダブルクオートやコンマ、あるいは改行を含む、(特に)Excel由来のCSVファイルの読み込みが上手くいかないので、そういうのを滅したかった。このプログラムはそういうのものもちゃんと解釈できる。


## 実績など

Android/iOS あわせて10万インストールくらいされた商用[^1]アプリ(Unity製なのでMonoの上で動いた感じですね)で動きました。改行やダブルクオートを含む文字列情報(キャラの台詞みたいなのとか)を解釈するために必要でした。

[^1]: 個人ではなく、会社から会社の名義で出した、という意味で `商用` です。Unity製なのでAndroidではMonoの上で、iOSではIL2CPPを経由して動作したことになります。
作業者的プログラマーにならないために

以下の１つでも当てはまる場合は、作業者的プログラマーの可能性が高いです。
作業者的プログラマーとは、プログラミングを作業としか捉えず、
バグを出さないためのコツや可読性、処理速度といったことが考えられず、
設計書をそのままプログラムに変換することしか考えないといったプログラマーです。

# 可読性の観点
### 1つの関数は1画面内に収めること
1画面内（50行程度でしょうか）に収まるようにする。収まらない場合は別関数化の検討をする。
どんなに複雑な文章でも、句読点や段落の無い文章は無いように、分けれるはずです。

### 変数のスコープは可能な限り小さく
グローバル変数(C言語の言葉ですが)的な、どこからでもアクセスできる変数はやめましょう。
というのも、変数の値と値が入るタイミングを解析するとき、たくさんのところからアクセスしうるため、
解析が難しくなってきます。

### ドキュメンテーションコメントを書く
優れたソースコードはドキュメンテーションコメントとクラス名、メソッド名だけ見れば
振る舞いが分かるようになっています。
ソースコードを読む人の負担が減ります。

### 見ればわかることをコメントに書かない
以下のようなプログラマーであればソースを見ればわかるようなことは行数が増えてかえって見づらいです。

```java:見れば分かるぞコメントの例
//aにbを代入する
String a = b;
//リストを生成する
List<String> = new ArrayList<>();
```
こういったコメントばかり書いてドキュメンテーションコメントをろくに書かないのはいかにも作業者的に見えます。
全体を俯瞰して見て、それをドキュメンテーションコメントに書きましょう。

### マジックナンバー禁止
論外です…。
同じマジックナンバーを使用している個所を全て洗いださないと解析ができなくなり、
コードを読む人改修する人の負担が増えます。

### ツールを使うかコピペすること
DBのテーブル名や他のシステムと接続するようなものをコーディングする際は、
インターフェイスにかかわる箇所だけは、変数名などをコピペかツール化してtypoが起きないようにすること。
typoしてしまったソースのメンテナンスは、コピペ・ツールによる自動生成と一致しなくなるため、バグを生みやすくなってしまう。

### 再利用可能にするべきか検討すること
ソースコードを再利用するべき箇所をコピペして作っている場合、以下問題が発生してしまう。

* コピペしたところ全て修正が発生するため、修正漏れが発生する可能性が高くなる。
* 微妙に違う場合、どこが違うのかdiffをとらないといけなくなる。

# 処理速度の観点
* 1回の実行で十分な処理をループ内に書かない
* 同じ処理を複数回行わない

```java:処理速度わるいコード
for( String line: lines ){
    Pattern p = Pattern.compile("[a-z]+");//ここは結果が毎回同じ値のため、ループの外で良い。
    if( p.matcher( line.trim() ).find() ){
        System.out.println( line.trim() );//trim()を2回もしているためパフォーマンスが悪い
    }
}
swiftで複数のアニメーションを組み合わせる

単純に画像を動かすだけなら
UIViewPropertyAnimator
でうまくいったが、複数の動きを組み合わせて設定する方法がわからなかったので色々調べた。


http://www.lanches.co.jp/blog/7323
に書いていた方法でうまくいったので、少しメモ


載っていた方法は以下の通り↓↓

例）移動しながら途中から回転してフェードアウト

UIView.animateKeyframes(withDuration: 2.0, delay: 0.0, animations: {
    UIView.addKeyframe(withRelativeStartTime: 0.0, relativeDuration: 1.0, animations: {
        self.imageView.center.y += 300.0
    })
    UIView.addKeyframe(withRelativeStartTime: 0.5, relativeDuration: 0.5, animations: {
        self.imageView.transform = CGAffineTransform(rotationAngle: CGFloat(M_PI_2))
    })
    UIView.addKeyframe(withRelativeStartTime: 0.5, relativeDuration: 0.5, animations: {
        self.imageView.alpha = 0.0
    })
}, completion: nil)




これでいけたが色々初心者なので間違えた。　

○間違いその１
まずこれらをふつうに
class ViewController: UIViewController {}
の中に書いてしまった。　ボタンつくってAction接続して、その中に書かないとダメだった

○間違いその2
self.imageView.○○
の部分をそのまま写した通り書いてもエラーだった。
動かしたい画像のものをimageviewつくって、outlet接続し、名前を決める。　決めた画像の名前がhoshiなら
self.hoshi.○○
と書き換えると動くようになった。
ちょこっと MathJax （目次）

前に「[そうだ， TeX Live 2017 (for Windows) をインストールしよう！ （目次）](https://qiita.com/spiegel-im-spiegel/items/7e2ba1246c1780a18625)」を書いたが，似たようなノリで MathJax についても個人ブログで書いたので目次を公開しておく。

- [ちょこっと MathJax： 初期設定](http://text.baldanders.info/remark/2017/09/getting-started-mathjax-1/)
- [ちょこっと MathJax： 基本的な数式表現](http://text.baldanders.info/remark/2017/09/getting-started-mathjax-2/)
- [ちょこっと MathJax： インライン数式と別行立て数式](http://text.baldanders.info/remark/2017/10/getting-started-mathjax-3/)

本当はチートシートのような記事も書く予定だったが，当分書かない気がするので，現状のままで。

ご笑覧あれ。
Linuxでよく使うコマンドまとめ②セキュリティ編


#前提
Linuxはディストリビューション(種類)によってコマンドが多少異なる。
この記事ではRedHat系(RHEL,Cent,Fedora)について触れる。
(RedHat系は~6と7以降で大きく変化があったらしいが、この記事は7以降という前提)
一部root権限でないと出来ないものもあるが、面倒なのでシリーズ通して表記は$で統一する


#セキュリティ編(firewalld,selinux)

###□ファイアウォールの起動と停止


```java
//サービスの状態を確認
$ systemctl status firewalld

//開始
$ systemctl start firewalld

//停止
$ systemctl stop firewalld

//自動起動を無効化
$ systemctl disable firewalld

//自動起動を有効化
$ systemctl enable firewalld

```


###□ファイアウォールの設定(sshやtcpを例に記載)

```java
//設定の確認
$ firewall-cmd --list-all --zone=public

//一時的なサービスの追加と削除(再起動後は無効)
$ firewall-cmd --add-service=ssh --zone=public
$ firewall-cmd --remove-service=ssh --zone=public

//恒久的なサービスの追加(再起動後も有効)
$ firewall-cmd --add-service=ssh --zone=public　--permanent
$ firewall-cmd --remove-service=ssh --zone=public --permanent

//許可するポートの追加と削除
$ firewall-cmd --add-port=22/tcp --zone=public [--permanent]
$ firewall-cmd --remove-port=22/tcp --zone=public [--permanent]

//設定の反映(リロード)
$ firewall-cmd --reload
```


###□selinuxの起動と停止
```java
//状態の確認(簡易・詳細)
$ getenforce
$ sestatus

//一時的に無効化
$ setenforce 0

//一時的に有効化
$ setenforce 1

//恒久的に無効化、有効化
$ cd /etc/selinux/
$ vi config
SELINUX=disabled　　//無効化
SELINUX=enforcing　 //有効化
```

#あとがき
iptaablesというのがあるらしいが、勉強不足でまだ使ってない・・・
(オフライン環境で使っているため)
ちなみにfirewalldに関しては従来の書き方(多分)でもリダイレクトされる

```java
$ service firewalld stop
Redirecting to /bin/systemctl stop  firewalld.service
```
Linuxでよく使うコマンドまとめ①基本操作編

#はじめに
恥ずかしながら、この年になって初めてLinuxを触り、勉強したので、
備忘録として残したいと思う

#前提
Linuxはディストリビューション(種類)によってコマンドが多少異なる。
この記事ではRedHat系(RHEL,Cent,Fedora)について触れる。
(RedHat系は~6と7以降で大きく変化があったらしいが、この記事は7以降という前提)
一部root権限でないと出来ないものもあるが、面倒なのでシリーズ通して表記は$で統一する

#基本操作編
###□ディレクトリ移動(cd)

```java
//現在のディレクトリを確認
$ pwd

//rootへ移動
$ cd /

//一つ上位のディレクトリへ移動
$ cd ../

//絶対パスで移動
$ cd /etc/sysconfig/

//相対パスで移動
$ cd /
$ cd etc/
$ cd sysconfig/


```
###□ディレクトリの中身の表示(ls)
```java
//現在のディレクトリの中身を表示
$ ls

//特定のディレクトリの中身を表示
$ ls /etc/sysconfig

//ディレクトリの中身の詳細を表示
$ ls -l
```

###□ディレクトリの作成と削除
```java
//作成
$ mkdir XXXX

//空のディレクトリを削除
$ rmdir XXXX

//中身ごと削除
$ rmdir -r XXXX
```


###□ファイル関係(cp,mv,rm,cat)
```java
//ファイルをコピー
$ cp file1 file1_backup

//ファイルを移動
$ mv file1 /home/ 

//ファイルを削除
$ rm file1

//ファイルの中身を表示
$ cat file1

//柔軟にファイルの中身を表示
$ less file1

//ファイルの中身を表示(viの使い方は別途)
$ vi file1
```

###□その他 便利なもの
```java
//ユーザをrootへ変更
$ su

//ユーザをuser1へ変更
$ su user1

//表示時にXXXXを検索(ls以外も汎用的に使える)
$ ls | grep XXXX

//電源を落とす、即落とす
$ shutdown
$ shutdown now

//再起動する
$ reboot
```










```
【メモ】LaraveEcho + Vue.jsでチャットメッセージ送受信〜既読判定処理のざっくりとした流れ(図)

#背景
チャット機能に既読判定機能をつけて、メッセージ送信後既読にならなかった場合に受信者に通知メールを送信する、という機能を作成。
非同期とかWebsocketって流れが分かりづらいと感じることが多いので流れを図解でメモ。


#メッセージ送受信の流れ
今回実装したメッセージ送受信のざっくりとした流れを示す図。
メッセージを送信してから受信側が受信し、既読になるまでの流れを示しています。

![chat_flow.png](https://qiita-image-store.s3.amazonaws.com/0/121811/b591432a-55d4-834f-bffc-b7c4cff65b9e.png)

[流れ]
<送信側>
1.画面を表示(room.blade.php)
　この時にVueインスタンスを生成し、ChatLog.vue等のコンポーネントを生成
2.ユーザーがフォームにメッセージを入力し送信ボタンをタップ
3.タップを起点にメッセージを画面に追加(フロント)するメソッド実行
4.上記メソッド内で非同期にメッセージのDB登録処理を実行
5.DB登録後、イベント発行(Laravel)
6.channels.phpで投稿の認可

<受信側>
7.受信側でイベントを購読(LaravelEcho)
8.イベントを購読したら送信されたメッセージを画面上に追加
9.画面に追加される際にVueライフサイクルのupdated()の時点でDBのmessagesテーブルに既読フラグを登録

<送信側>
10.送信側のupdated()のタイミングでmessagesテーブルに既読フラグが存在するか確認して存在しなければ受信者のアドレスにメッセージ通知メールを送信する処理を非同期で実行
(送信側のupdated()のタイミングが受信者側よりも早いため、メッセージ通知メールの処理はsetTimeoutで60秒ほど遅らせる)
→もっといいやり方あればご教示下さい><

以上。
Windows 10にCUDA 9，Theano 1，Keras 2をインストール


Windows 10にCUDA，Theano，およびKerasをインストールするまでを忘備録として記します．いろいろなサイトを参考にして試行錯誤した結果です．本当は，PyCUDAもインストールしたかったのですが，まだうまくいっていません．

# 環境

* PC: VAIO Fit 14 (SVF14A1A1J)
* OS: Windows 10 Home (64-bit)
* CPU: Intel Core i5-3337U @ 1.80 GHz
* GPU: NVIDIA GeForce GT 735M
* RAM: 8 GB

#  CUDA Toolkit

https://developer.nvidia.com/cuda-downloads で，

* Operating System: Windows
* Architecture: x86_64
* Version: 10
* Installer Type: exe (local)

を選び，ダウンロードしたファイルを実行してインストールする．Version 9.0.176がインストールされた．

# NVIDIA cuDNN

インストールするにはメンバーシップが必要なので，未登録の場合は https://developer.nvidia.com の右上のJoinから登録する（無料）．

https://developer.nvidia.com/rdp/cudnn-download で，同意ボタンを選択し，リストの中から，

 * Download cuDNN v7.0.4 (Nov 13, 2017), for CUDA 9.0
    * cuDNN v7.0.4 Library for Windows 10

を選んでダウンロードした圧縮ファイルを展開する．そして，展開してできた`cudnn-9.0-windows10-x64-v7\cuda`以下をすべて，`C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v9.0`にコピーする．

# Miniconda

https://conda.io/miniconda.html で，

* Windows
* Python 3.6
* 64-bit (exe installer)

を選び，ダウンロードしたファイルを実行してインストールする．インストール中の選択肢は，すべてデフォルト設定のまま行った．Miniconda3 4.3.30 (64-bit)がインストールされた．

# Theano

Kerasのバックエンドとして，主にTensorFlowとTheanoという選択肢があるが，今回は[Theano](http://deeplearning.net/software/theano/)を選ぶ．

スタートメニューからAnaconda Promptを起動し，以下を順次実行する．最新のバージョン1.0をインストールするために，チャネルに`mila-udem`を指定するところがポイント．（2017/11/18では，`conda install theano`だとバージョン0.9.0がインストールされるが，これはcuDNN v7と互換性がない．）

```bash
conda create -n keras
activate keras
conda install -c mila-udem theano pygpu
```

`m2w64-toolchain`，`libpython`，`libgpuarray`などの依存パッケージも一緒にインストールされる．

コントロールパネルで環境変数を設定する．（これを設定しなかったときに出たエラーメッセージに従っているだけで，理由については理解していません．）

* 変数名: `MKL_THREADING_LAYER`
* 変数値:  `GNU`

GPUを使用するために，`~\.theanorc.txt`を作成して，以下の内容で保存する．

```text
[global]
device = cuda
floatX = float32
```

実際にインポートしてみる．

```bash
python
>>> import theano
Using cuDNN version 7004 on context None
Mapped name None to device cuda: GeForce GT 735M (0000:01:00.0)
>>> theano.__version__
'1.0.0'
```

うまく動いていそう．

# Keras

同じく仮想環境`keras`下で，Kerasをインストールする．

```bash
conda install -c conda-forge keras
```

Kerasをインポートしてみる．

```bash
python
>>> import keras
（中略）
ModuleNotFoundError: No module named 'tensorflow'
```

デフォルトのバックエンドがTensorFlowのため，`ModuleNotFoundError`が発生する．Theanoをバックエンドに指定するために，（先ほどの`import`文で自動で作成された）`~\.keras\keras.json`を以下の内容に書き換える．

```json
{
    "floatx": "float32",
    "epsilon": 1e-07,
    "backend": "theano",
    "image_data_format": "channels_last"
}
```

もう一度インポートしてみる．

```bash
python
>>> import keras
Using Theano backend.
Using cuDNN version 7004 on context None
Mapped name None to device cuda: GeForce GT 735M (0000:01:00.0)
>>> keras.__version__
'2.0.9'
```

今度はうまくいった．
Azure上でActive Directory環境を構築する

# Azure上に独自のActive Directory環境を構築したい

オンプレ環境とは違ってハマりました。
Microsoftの公式ドキュメントって異常にわかりにくくないですか・・（僕だけ？）

### 目的

こんなかんじのAzure上でActive Directoryのドメイン環境を構築する

![azure.png](https://qiita-image-store.s3.amazonaws.com/0/78367/ec9ae70f-258d-d2f9-14a7-a0e3e24bb05c.png)


###手順
1.VMを二台構築（初号機、弐号機）
2.Azureポータル；初号機のローカルIPを固定
3.Azureポータル：仮想ネットワークのDNSを初号機のローカルIPに設定
4.初号機ログイン：ADの役割インストールとドメイン設定（ユーザ追加など）
5.弐号機ログイン：ドメイン参加


## 2.初号機のローカルIPを固定

![AzureIP.png](https://qiita-image-store.s3.amazonaws.com/0/78367/2e5da668-a272-3cef-c205-3dcb5ba9275f.png)


## 3.仮想ネットワークのDNSを設定

![AzureDNS.png](https://qiita-image-store.s3.amazonaws.com/0/78367/26ad1d2f-b0f0-b529-3435-07c97605e385.png)

## 4.ADインストール
サーバワールド様を参考にしました。
https://www.server-world.info/query?os=Windows_Server_2016&p=active_directory&f=1

## 5.ドメイン参加
下記でイーサネットでDNSを指定する手順は不要です。（仮想ネットワーク内でDNSを指定しているため）
https://www.server-world.info/query?os=Windows_Server_2016&p=active_directory&f=8

## その他参考にさせていただいたURL
http://www.simplebox.jp/infra/azure-ad-build/
VMware 12 Player上のCentOSの環境を設定 NAT

## 仮想マシンの設定
ネットワークをNATに設定したので通信経路を設定する。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/213269/783bc6e9-4efb-04ba-23fd-9dcec6c20928.png)

## 環境
- ホスト Windows10 1703
- VMware Workstation 12 Player 12.5.8 build-8097237
- CentOS release 6.6 (Final)
- IPアドレス固定

## ホストの設定
「C:\ProgramData\VMware\vmnetnat.conf」を編集する。
※「C:\ProgramData」は隠し

```diff
～略～
# SSH
#      ssh -p 8889 root@localhost
#8889 = 192.168.27.128:22
+ 8128 = 192.168.234.128:22

[incomingudp]
# UDP port forwarding example
#6000 = 192.168.27.128:6001

[PrivilegedTCP]
autodetect = 1

[PrivilegedUDP]
autodetect = 1
```

Windows の VMware NAT Service を停止→開始する。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/213269/fa59e7ce-6ed1-cef6-e40d-8b9f58f899bb.png)

Windows でポートを確認する。
8128 が「LISTENING」になっていればOK

```
C:\>netstat -nao

アクティブな接続

  プロトコル  ローカル アドレス      外部アドレス           状態            PID
  TCP         0.0.0.0:80             0.0.0.0:0              LISTENING       4
  TCP         0.0.0.0:135            0.0.0.0:0              LISTENING       812
  TCP         0.0.0.0:445            0.0.0.0:0              LISTENING       4
  TCP         0.0.0.0:902            0.0.0.0:0              LISTENING       2960
  TCP         0.0.0.0:912            0.0.0.0:0              LISTENING       2960
  TCP         0.0.0.0:1801           0.0.0.0:0              LISTENING       2760
  TCP         0.0.0.0:2103           0.0.0.0:0              LISTENING       2760
  TCP         0.0.0.0:2105           0.0.0.0:0              LISTENING       2760
  TCP         0.0.0.0:2107           0.0.0.0:0              LISTENING       2760
  TCP         0.0.0.0:2425           0.0.0.0:0              LISTENING       8172
  TCP         0.0.0.0:3389           0.0.0.0:0              LISTENING       1164
  TCP         0.0.0.0:5357           0.0.0.0:0              LISTENING       4
  TCP         0.0.0.0:8128           0.0.0.0:0              LISTENING       8912
  TCP         0.0.0.0:49664          0.0.0.0:0              LISTENING       824
～略～
```

## 確認
teratermで接続できることを確認する。
※192.168.0.151は、ホストOSのIPアドレス
※ポートは、ホストの設定で設定したポートを指定
![image.png](https://qiita-image-store.s3.amazonaws.com/0/213269/9288fc76-8e13-f722-f1ae-71334eb40f5a.png)

接続を確認できた。

```
[root@localhost ~]# ifconfig -a
eth0      Link encap:Ethernet  HWaddr 00:0C:29:A2:37:AE
          inet addr:192.168.234.128  Bcast:192.168.234.255  Mask:255.255.255.0
          inet6 addr: xxxx::xxx:xxxx:xxxx:xxxx/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:411 errors:0 dropped:0 overruns:0 frame:0
          TX packets:264 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:49650 (48.4 KiB)  TX bytes:49172 (48.0 KiB)

lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:4 errors:0 dropped:0 overruns:0 frame:0
          TX packets:4 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:240 (240.0 b)  TX bytes:240 (240.0 b)
```
Visual Studio Codeで複数の行を処理する方法

##はじめに
Visual Studio Codeでコードを書いていて、複数の行を操作したいときに使えるtipsです。

##具体例
こういうコードがあったとして、
複数の行を処理するには、
<img width="555" alt="スクリーンショット 2017-11-18 22.53.26.png" src="https://qiita-image-store.s3.amazonaws.com/0/207922/9b54202b-0116-d5cf-8be9-20290dc32616.png">

以下のキーで選択できます。
MAC : command + option + カーソル（上 or 下）
Windows : Ctrl + Alt + カーソル（上 or 下）

<img width="489" alt="スクリーンショット 2017-11-18 22.54.16.png" src="https://qiita-image-store.s3.amazonaws.com/0/207922/0e23bf28-d354-ebf6-e60d-10593ada1487.png">

選択できたらそのまま入力すると、選択した行全てに入力が反映されます。
例）tab キー
<img width="567" alt="スクリーンショット 2017-11-18 22.55.12.png" src="https://qiita-image-store.s3.amazonaws.com/0/207922/58fbe8ca-b01c-98bf-db30-e498c0012e79.png">

##おわりに
複数行のインデントを下げたいときなんかに使えると思います。
以上、ありがとうございました。
atcoder メモ書き python

exec: 文字列を動的に実行
例：exec 'ans=%s%s%s%s%s%s%s' % (s[0], op1, s[1], op2, s[2], op3, s[3])

exit():プログラムを終了
例：
if ans == 10:
   print '%s%s%s%s%s%s%s=10' % (s[0], op1, s[1], op2, s[2], op3, s[3])
   exec()
tvOSのParallaxエフェクトとは


# Parallaxエフェクトとは
tvOSではお馴染みのParallaxエフェクト。かっこいいですね。

![parallax.gif](https://qiita-image-store.s3.amazonaws.com/0/35008/0ca25af8-3f04-71dc-2861-73eb97b61069.gif "parallax.gif")
Parallaxは奥行き的な意味らしく、よく見ると確かに画像が何層かに分かれて表示されています。
Parallaxエフェクトを用いると、よりtvOSらしい体験を作り上げることができ
ます。

# 運用方法
このような画像を用意するには、以下のいずれかになります。

- Parallax Exporter Adobe Photoshop plug-in
- Xcodeのアセットカタログ
- layerutilコマンド

以下のページでざっくり紹介されています。
https://developer.apple.com/tvos/human-interface-guidelines/icons-and-images/layered-images/

いずれも静的に作成してアプリにバンドルするかサーバに配置するかで、動的にアプリ側で生成する方法は今のところ提供されていません。

# 自分で実装できるのか？
ではこのParallaxエフェクトを自分で実装することはできるのでしょうか？
自前で実装するためには、上で説明した奥行き効果に加えて、以下のようなポイントを抑える必要があります。

## シャドウ
以下のように透明な画像を用意して見てみると、影が拡大やモーションに応じてアニメーションしています。
![Nov-23-2017 08-09-55.gif](https://qiita-image-store.s3.amazonaws.com/0/35008/51fbf173-153d-6f3d-7dd5-58b05bf98da6.gif "Nov-23-2017 08-09-55.gif")


## フォーカス移動の方向による細かい動き
さらによく見ていくと、フォーカスが隣に移動した時は移動した方向に少し引っ張られて元の位置に戻るようなモーションがかかっています。微妙に右に引っ張られているのがわかりますか？
![Nov-23-2017 08-04-02.gif](https://qiita-image-store.s3.amazonaws.com/0/35008/be91da30-74c6-d5f2-ee5b-5929e8301c08.gif "Nov-23-2017 08-04-02.gif")


## 光の反射効果
ぐりぐり回すと、画像の角度によって光が反射しているエフェクトがかかっています。
![parallax.gif](https://qiita-image-store.s3.amazonaws.com/0/35008/0ca25af8-3f04-71dc-2861-73eb97b61069.gif "parallax.gif")

このように見れば見るほど細部まで作り込まれていて、なかなか自前で実装するのは難しいかもしれません。

# まとめ
Parallaxエフェクトの紹介でした。
Apple謹製のMovieアプリなんかを見ていると、結構Parallax画像をちゃんと用意しているコンテンツも多いです。AppleTVのアプリを作る時は、ぜひサムネイルのParallax対応を検討してみてください。
Parallaxエフェクトの自前実装については、 @dekatotoro が本アドベントカレンダー「Parallaxエフェクトの独自カスタム実装をしてみる」の記事で解説してくれそうなので、そちらも参考にしてみてください。
リスト系のインデックスラベルを自作してみる


# 概要
## 高速スクロール
tvOS10.2から、スクロールビューが縦に長い場合に、Accelerated Scroll（高速スクロール）という機能が追加されました。
これは、

- 同じ方向に何度もスワイプ
- タッチサーフェス右端を上下にスワイプ

のいずれかで発火します。

![accelerated-scroll.gif](https://qiita-image-store.s3.amazonaws.com/0/35008/8592fb75-f1d1-9858-5f2e-19c7f26ec882.gif "accelerated-scroll.gif")

標準で有効になっていて、無効にはできません。

## リスト系のインデックスラベル
さらにUITableViewとUICollectionViewの場合はインデックスラベルをカスタマイズできます。
高速スクロールが始まると以下のdelegateが呼ばれ、適切な値を返すと指定したラベルが表示されます。

![Screen Shot 2017-11-03 at 18.24.43.png](https://qiita-image-store.s3.amazonaws.com/0/35008/3b0c4c3a-4c88-d378-3cb2-f6b96041ad97.png "Screen Shot 2017-11-03 at 18.24.43.png")

上下スワイプで操作すると、ラベルに対応するIndexPathに一気にジャンプしてくれます。とっても便利だと思います。

## 番組表の再生ボタン割り当て問題
AbemaTVの番組表では、日付の変更のために再生ボタンを使わせています。

![datelist.gif](https://qiita-image-store.s3.amazonaws.com/0/35008/cd260e41-0660-3c05-a876-621bf6e6f026.gif "datelist.gif")


本来であれば再生ボタンは番組表からの直接再生に割り当てたいところですが、現状こういうUXで落ち着いています。
インデックスラベルに日付変更の機能を任せれば、直接再生を解放できそうです。

## 実際に実装してみた
実際にやってみて気づいたのですが、このラベル、フォントや背景色、表示位置を指定することができません。表示上コンテンツと重なってしまって、とても見づらい感じになってしまいました。
あと半角5文字くらいが限度で、それ以上だとtruncateされてしまいました😇

![Screen Shot 2017-11-19 at 11.05.13.png](https://qiita-image-store.s3.amazonaws.com/0/35008/5cba0cac-7543-330d-9f3c-05f539c4c199.png "Screen Shot 2017-11-19 at 11.05.13.png")

# 解決方法

## 非表示にする
高速スクロールは無効にできませんが、インデックスラベルを非表示にすることはできるようです。
以下の要領で非表示にできます。もちろん番組表のケースではこれだと再生ボタン割り当て問題の解決にはなっていません。

```swift
if #available(tvOS 10.2, *) {
    collectionView.indexDisplayMode = .alwaysHidden
}
```

## 自作する
というわけで標準のUIが微妙なので、自作しようということになります。
ざっくり仕様をまとめてみるとこんな感じです。

- 右端のスワイプを検知する
- インデックスをスクロールしている間もスワイプにスクロールが反応する
- 右端を上下にドラッグしている間は、スクロールが加速して一気にジャンプする
- インデックスの表示/非表示は若干lazyに反応する

## 右端スワイプを検知する

多分課題になるのは「右端のスワイプを検知する」というところだと思いますが、既に[この記事](https://qiita.com/toshi0383/private/76bedc46f7a478f952e6)で解決済なので、これを利用してラッパーライブラリを作りました。

https://github.com/toshi0383/GestureTV

## 作ってみた

このGestureTVを利用して、サクッと以下のようなものを作ってみました。

![Nov-23-2017 08-46-40.gif](https://qiita-image-store.s3.amazonaws.com/0/35008/abd3b5e8-0fbb-6931-680f-ea6ec7e0c59e.gif "Nov-23-2017 08-46-40.gif")


- 右端に指がある時に右側のビューを表示してフォーカス更新
- 右側のビューでフォーカスインデックスが変わったら左側のテーブルビューに反映

という実装になっています。[サンプルコードをGestureTVのリポジトリに同梱](https://github.com/toshi0383/GestureTV/blob/master/GestureTVExample/AcceleratedScrollViewController.swift)してありますのでご覧ください。

標準のインデックスラベルの場合、インデックスラベルが出ている時のフォーカスの移動速度がもっと速く、インデックス間のジャンプがもっと楽にできる印象なので、まだまだチューニングの余地はあると思います。

# まとめ
リスト系のインデックスラベルを自作してみました。イベントさえ取れれば、あとはなんとかなりそうです。
これで少しは番組表が使いやすくなると良いのですが。
リモコンのイベント取得その2 タッチサーフェスの端のタッチを検知する


# GameController.framework
[その1](https://qiita.com/toshi0383/private/51f96c7167f76a7494df)で触れた端のタッチ取得、正解はGameController.frameworkを使用するでした！

```swift
import GameController

...

    private func observeGCController(force: Bool) {
        if let gc = GCController.controllers().first?.microGamepad {
            gc.reportsAbsoluteDpadValues = true
            gc.dpad.valueChangedHandler = { [weak self] (dpad, _, _) in
			     // dpad.xAxis.value / dpad.yAxis.value で座標を取得できる
            }
        } else {
            if force {
                return
            }
            NotificationCenter.default.addObserver(forName: Notification.Name.GCControllerDidConnect, object: nil, queue: nil, using: { [weak self] _ in
                self?.observeGCController(force: true)
            })
        }
    }
```

`dpad.xAxis.value` もしくは `dpad.yAxis.value` は -1.0から1.0の範囲なので、この値の絶対値が例えば0.8以上なら端っこに指があるということになります。

# Game CenterのCapability
なお上の実装でApp Storeに申請するにはGame CenterのCapabilityをONにする必要がありますのでご注意ください。ONにしないとたしかバイナリのアップロードのタイミングでエラーになったと思います。
![Screen Shot 2017-11-18 at 9.53.26.png](https://qiita-image-store.s3.amazonaws.com/0/35008/ea9d2019-3c96-98c5-d3e7-f8ad2987e2cb.png "Screen Shot 2017-11-18 at 9.53.26.png")

別にゲームではないアプリでも、問題なく申請は通りました👌

# 参考
- https://developer.apple.com/documentation/gamecontroller/gcmotion
Github Pages上のサイトを高速化するためにCDNを活用する

dev.toとか阿部寛のサイトとか見て高速化させたくなったので、自分のサイトで色々頑張ってたのだが、CDNを上手く利用するのがよろしいことがわかった。

特に[私のサイト](https://duct-and-rice.github.io/yaruo-blog/)はやる夫スレのまとめサイトなので、AA用Webフォント(Saitamaar)という結構重いもの(398KiB)をブラウザに渡す必要がある。
しかし、Github Pagesのキャッシュはヘッダで600秒しかもたないよう設定してしまっているため[^1]、5分過ぎて新しいページを見る度に398KiBを送る必要になるわけだ。やる夫スレは電車の中で見るものなので、これは非常に良くない。ということでCDNを上手く利用し、フォントキャッシュを半永久的に使い回させる。

なお、以下の計測内容はlocalhost環境で、git checkoutしつつDevtoolsのPerformance欄を使ってAAがWebフォントで描画された時間を測った。

## WebフォントをRawGitに移管
まず簡単なCDNと言えばRawGitである。RawGitはGithub上のファイルを保管し、再度出力してくれる。
登録は簡単で、Github上のファイルを[メインページ](https://rawgit.com/)上のインプットボックスに入れるとURLが出てくる。これがCDNを通したものになっている。同じリポジトリであればどんなファイルでもいいらしいので、URLからファイル名を変えて使い回してもいい。
こいつは、ちゃんとキャッシュを永久的に使い回してもいいよ、という設定にして返してくれているので、とても助かる。
これで、11秒かかっていた読み込み時間が、再読込した瞬間にキャッシュからフォントを読み出してくれるようになったのでほぼ1秒-2秒とかになった。本当にフォントがどれだけ重いのかということが良く分かった。

とりあえず、静的ファイルはすべてRawGitにした。

## Webpagetestに怒られたのでCDNをGitHackに変更
[webpagetest](http://www.webpagetest.org/)を使って測ってみたところ、他はほぼAなのだがCache static contentだけBの判定を貰った。その理由について調べてみると、実はpngはGithub側のraw.githubusercontent.comにリダイレクトするらしい。

という訳でRawGitではなく[GitHack](https://raw.githack.com/)を使った。GitHackも使い方はほぼ同じなのだが、ここはpngだろうとraw.githubusercontent.comにリダイレクトなんかしない平等な楽園だ。多分アセット類は同じCDNの方がいいだろうと思って全部取っ替えた。

今度はCompress TransferでBを食らった。gzip圧縮が足らないらしい。クソ。

[^1]: 詳しくないのであってないかもしれない。
IBM Cloud 内部にある、使えそうなISO一覧

# 追記

`service.softlayer.com (10.0.77.54)` 
--> `adn.networklayer.com (161.26.0.6)` とした URL も有効なようです。

#内容
VMware 上などでゲストOSを立てるときに使えるのでオススメです。

ただし、VMware上のゲストOSに関しては、IBM Cloud からライセンス提供されませんので、
ライセンスが必要なOSについては、別途持ち込みによる適用が必要です。

PoC等であれば、試用版として使えば問題ないと思います。

##Windows 2008 R2

```
wget http://downloads.service.softlayer.com/WindowsVirtual/2008isos/Win2k8_R2_ALLVERSIONS_64.ISO
```

##Windows 2012 R2

```
wget http://downloads.service.softlayer.com/WindowsVirtual/2012R2/SW_DVD5_Windows_Svr_Std_and_DataCtr_2012_R2_64Bit_English_Core_MLF_X19-05182.ISO
```

##Windows 2016

```
wget http://downloads.service.softlayer.com/WindowsVirtual/2016isos/SW_DVD9_Win_Svr_STD_Core_and_DataCtr_Core_2016_64Bit_English_-2_MLF_X21-22843.ISO
```

##Windows 2019

```
wget http://downloads.service.softlayer.com/WindowsVirtual/2019isos/SW_DVD9_Win_Server_STD_CORE_2019_64Bit_English_DC_STD_MLF_X21-96581.ISO
```

##CentOS 6 minimal

```
wget http://mirrors.service.softlayer.com/centos/6/isos/x86_64/CentOS-6.9-x86_64-minimal.iso
```

##CentOS 6 LiveCD

```
wget http://mirrors.service.softlayer.com/centos/6/isos/x86_64/CentOS-6.9-x86_64-LiveDVD.iso
```

##CentOS 7 minimal

```
wget http://mirrors.service.softlayer.com/centos/7/isos/x86_64/CentOS-7-x86_64-Minimal-1708.iso
```

##CentOS 7 DVD

```
wget http://mirrors.service.softlayer.com/centos/7/isos/x86_64/CentOS-7-x86_64-DVD-1708.iso
```

##Ubuntu 16.04 Desktop

```
wget http://mirrors.service.softlayer.com/ubuntu-releases/ubuntu-gnome/xenial/daily-live/current/xenial-desktop-amd64.iso
```

##Ubuntu 18.04 Server

```
wget http://mirrors.service.softlayer.com/ubuntu-releases/releases/18.04/release/ubuntu-18.04.4-server-amd64.iso
```

##Ubuntu 18.04 Desktop

```
wget http://mirrors.service.softlayer.com/ubuntu-releases/daily-live/current/bionic-desktop-amd64.iso
```

##Ubuntu 19.10 Server

```
wget http://mirrors.service.softlayer.com/ubuntu-releases/ubuntu/releases/19.10/release/ubuntu-19.10-server-amd64.iso
```

##CoreOS Stable

```
wget http://mirrors.service.softlayer.com/coreos/stable/current/coreos_production_vmware_ova.ova
```
Processingで三角関数とちょっと仲良くなった

三角関数...
サインコサインタンジェント...
って聞くと

![](https://media.giphy.com/media/3oz8xx7sAl2aIiuLJK/giphy.gif)

ってなるような私でも

[sin/cos/tanを計算するには](http://mslabo.sakura.ne.jp/WordPress/make/processing%E3%80%80%E9%80%86%E5%BC%95%E3%81%8D%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9/sincostan%E3%82%92%E8%A8%88%E7%AE%97%E3%81%99%E3%82%8B%E3%81%AB%E3%81%AF/)を読んだら、少しサインコサインがこわくなくなったので、テンションが上がった。

プロセッシングで滑らかな線を描いたりするのに、cos, sinを使って座標を指定する。

x座標 = cos(radians(角度)) * 任意の数字
y座標 = sin(radians(角度)) * 任意の数字

sin(radians(角度)), cos(radians(角度))は-1から1の間の値を返すので、それに任意の数字を掛けて座標を指定する。

![](https://media.giphy.com/media/3ohhwg6aZazXYfjy9O/giphy.gif)
時間がない人のためのYouTubeやニコニコ動画の再生速度を変更するブックマークレット

# なにこれ
ブックマークレットは、ウェブブラウザのお気に入り機能を利用して使える追加機能みたいなものです。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/91558/9d8ee3d3-d1d0-7686-37b9-475aa885d3dc.png)

例えば上の画像のような登録して、動画再生中に「x2」のブックマークをクリックすると再生速度が2倍になります。
確認したところ、YouTubeやニコニコ動画、ドットインストールとかで使えます。


# 作り方
適当なブックマークを作成して、URLを以下のスクリプトのように設定するだけです。
最後の数値を変えると、再生速度が変えられます。(この例だと2倍速)
名前は分かりやすいように適当に設定してください。(この画像では「x2」になっています。)
再生速度を戻す用に1倍速のブックマークレットも設定しておくと便利です。

```js:bookmarklet
javascript:document.getElementsByTagName('video')[0].playbackRate = 2;
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/91558/ad55bb1d-0d2b-b45d-898e-8febbf3127d1.png)

中でやっていることは、ウェブページ中の動画を引っ張ってきて再生速度を変えているだけです。

# 使い方
動画があるページでブックマークレットをクリックするだけ。

# 宣伝
フォローお願いします:rowboat_tone5: [@redshoga](https://twitter.com/redshoga)