OmniAICreator/Qiita-1.07M huggingface dataset:
Re:VIEWでPDFを出力する

[Re:View](https://github.com/kmuto/review)環境を整えたときのメモです。

公式ドキュメントをもとにセットアップをしていました。

# install

```bash
$ gem install review
$ git clone https://github.com/kmuto/review.git
$ review-init hello
$ cd hello

```

pdfを出力しようとするとエラーになりました。

```bash
$ rake pdf
review-pdfmaker config.yml
compiling hello.tex
W, [2018-07-09T22:44:18.946295 #6812]  WARN -- : hello.re:1: headline is empty.
/Users/satoutakeshi/.rbenv/versions/2.1.8/lib/ruby/gems/2.1.0/gems/review-2.5.0/lib/review/pdfmaker.rb:39:in `system_or_raise': failed to run command: ebb cover.jpg (RuntimeError)
	from /Users/satoutakeshi/.rbenv/versions/2.1.8/lib/ruby/gems/2.1.0/gems/review-2.5.0/lib/review/pdfmaker.rb:272:in `block in copy_images'
	from /Users/satoutakeshi/.rbenv/versions/2.1.8/lib/ruby/gems/2.1.0/gems/review-2.5.0/lib/review/pdfmaker.rb:264:in `chdir'
	from /Users/satoutakeshi/.rbenv/versions/2.1.8/lib/ruby/gems/2.1.0/gems/review-2.5.0/lib/review/pdfmaker.rb:264:in `copy_images'
	from /Users/satoutakeshi/.rbenv/versions/2.1.8/lib/ruby/gems/2.1.0/gems/review-2.5.0/lib/review/pdfmaker.rb:233:in `generate_pdf'
	from /Users/satoutakeshi/.rbenv/versions/2.1.8/lib/ruby/gems/2.1.0/gems/review-2.5.0/lib/review/pdfmaker.rb:131:in `execute'
	from /Users/satoutakeshi/.rbenv/versions/2.1.8/lib/ruby/gems/2.1.0/gems/review-2.5.0/lib/review/pdfmaker.rb:81:in `execute'
	from /Users/satoutakeshi/.rbenv/versions/2.1.8/lib/ruby/gems/2.1.0/gems/review-2.5.0/bin/review-pdfmaker:16:in `<top (required)>'
	from /Users/satoutakeshi/.rbenv/versions/2.1.8/bin/review-pdfmaker:23:in `load'
	from /Users/satoutakeshi/.rbenv/versions/2.1.8/bin/review-pdfmaker:23:in `<main>'
rake aborted!
Command failed with status (1): [review-pdfmaker config.yml...]
lib/tasks/review.rake:71:in `block in <top (required)>'
Tasks: TOP => pdf => book.pdf
(See full trace by running task with --trace)
```

エラーの原因はこちら

```
failed to run command: ebb cover.jpg
```

`ebb`というコマンドが実行されないとのこと。Texを入れないといけません。

ということでTexをインストールします。

http://ftp.jaist.ac.jp/pub/CTAN/systems/mac/mactex/MacTeX.pkg

> 3.2Gもあるので気長にダウンロードを待ちます。

`~/.bash_profile`ファイルにtexコマンドのパスを通します

```bash:~/.bash_profile
$ echo export PATH=$PATH:/Library/Tex/texbin >> ~/.bash_profile
$ source  ~/.bash_profile
```

これでOKです。
もう一度`$ rake pdf`をするとPDFが出力されるはずです。
Python、R間でSVDの特異値が同じか確認

# PythonのSVD

```
import numpy as np
X = np.array(
[[0.23619964, 0.93715782, 0.50648748, 0.36245609, 0.06628567],
[0.95440595, 0.02250788, 0.47989255, 0.59502410, 0.58785659],
[0.73162857, 0.04590415, 0.04265483, 0.16959635, 0.64327691],
[0.6970129, 0.9410706, 0.1723309, 0.2452992, 0.8771952]])
U, S, V = np.linalg.svd(X, full_matrices=False)
S
```

array([ 2.21555332,  1.03585253,  0.62783174,  0.06628274])


# RのSVD

```
X <- rbind(
c(0.23619964, 0.93715782, 0.50648748, 0.36245609, 0.06628567),
c(0.95440595, 0.02250788, 0.47989255, 0.59502410, 0.58785659),
c(0.73162857, 0.04590415, 0.04265483, 0.16959635, 0.64327691),
c(0.6970129, 0.9410706, 0.1723309, 0.2452992, 0.8771952)
)
out <- svd(X)
out$d
```

[1] 2.21555332 1.03585253 0.62783174 0.06628274

全く同じです。前者はscikit-learnのPCAの中で、後者はprcompの中で使われていて、共にLAPACKのラッパーらしいです。
R/Bioconductor開発者のための開発環境の構築

ここらへんの記事は多少古くなってしまったので、知識をアップデート
https://qiita.com/antiplastics/items/33410a168a2fe7aad82f
https://qiita.com/antiplastics/items/fb13f8c9cde61f3f9bd1

R/Bioconductorパッケージを開発するためには、開発者版のRとBioconductorパッケージを使って、自分のパッケージがうまく動作するかテストする必要がある（R CMD build/check/BiocCheck）

しかし、開発者版のRを入れることで、普段使いのRが使えなくなってしまうため、環境を棲み分けたい

そのため、Dockerのコンテナの中だけで、開発者版のRを使うことをここでは考える

Dockerなので、OSはあまり関係ないが、ここでは手元のMacのマシンで行った作業をメモ

# Step.1 : Dockerをインストール

まず、dockerコマンドをインストール

```{bash}
brew install docker
```

すでに入っている場合は、アップグレード

```{bash}
brew upgrade docker
```

# Step.2 : Docker Community Edition for Macをインストール

Macでdockerを動かすための作業

boot2dockerはもう使われてなさそうなので（ https://qiita.com/umechiki/items/426b5a202425aca75927 ）、[Docker Community Edition for Mac](https://store.docker.com/editions/community/docker-ce-desktop-mac)に移行した

インストーラーがあるので、クリックしてインストールするだけ

インストール後に、dockerコマンドが動くか確認

```{bash}
docker version
```

ここで、30秒ぐらいかたまる場合は、https://qiita.com/umechiki/items/426b5a202425aca75927
のように、以前にboot2dockerを使用していたせいで、bash_profileにDocker関連の環境変数を書いている可能性大なので、削除してから、bashを再起動（地味にハマった）

```{bash}
exec $SHELL -l
```

# Step.3 : Dockerfileを作成

以降、手元のLRBaseDbiというパッケージに、開発者版のRで、R CMD build/check/BiocCheckを実行することを考える

LRBaseDbiとは今投稿中の、BiocCheckのところでてこづっている自分のパッケージです...
https://github.com/Bioconductor/Contributions/issues/787

Dockerfileはbioconductor/devel_base2をベースに作る

[以前の記事](https://qiita.com/antiplastics/items/33410a168a2fe7aad82f)のbioconductor/devel_baseはメンテナンスされていないらしく、R Under development (unstable) (2016-06-29 r70854)とBioconductor 3.4の組み合わせとかなり古い

bioconductor/devel_base2のほうは継続的にメンテナンスしているらしい

（Docker使ってても、結局こういう依存するツールが古いと動かないパターンありますね、全てのツールをバージョン指定でインストールできるといいですが）

以下のようにDockerfileを書いてから、

```{docker}
FROM bioconductor/devel_base2

RUN R -e "biocLite('AnnotationDbi'); \
biocLite('Biobase'); \
install.packages('RSQLite')"
```

docker buildで自分用の環境を構築する

```{bash}
docker build -t koki/devel .
```

これで、自分の依存パッケージがインストールされた開発版Rの環境ができたので、コンテナの中にログインしてみる

```{bash}
docker run -v YOUR_WORKING_DIR/Devel:/Devel -ti koki/devel bash
```

-vのところは、自分のローカル環境のDevelというディレクトリと、コンテナ内に新たに作成されたDevelというディレクトリを同期するオプション

これにより、手元でパッケージに修正を加えると、コンテナ内部にも反映されるため、あとは、コンテナの中で、R CMD build/check/BiocCheckを実行すれば良いだけ

```{bash}
cd NTF
R CMD build --keep-empty-dirs --no-resave-data LRBaseDbi
R CMD check --no-vignettes --timings --no-multiarch LRBaseDbi_0.99.8.tar.gz
R CMD BiocCheck --build-output-file=R.out --new-package LRBaseDbi_0.99.8.tar.gz
```

引き続きパッケージング頑張ります...

なお新規ではないパッケージの場合は `BiocCheck` で `--new-package` が、いらないです。
[BiocCheck Version Check](https://bioconductor.riken.jp/packages/3.5/bioc/vignettes/BiocCheck/inst/doc/BiocCheck.html#version-checks) 

```{bash}
R CMD BiocCheck --build-output-file=R.out LRBaseDbi_1.2.0.tar.gz
```
lumenでviewにbladeを使おうとおもったらlumen.logのパーミッションエラー。

## lumenでviewにbladeを使おうとおもったらでたエラー。
```bash
PHP Fatal error: Uncaught UnexpectedValueException: The stream or file "myapp/storage/logs/lumen.log" could not be opened: failed to open stream: Permission denied
```
## 解決した方法
https://stackoverflow.com/questions/23540083/file-put-contentsmeta-services-json-failed-to-open-stream-permission-denied

```bash
php artisan cache:clear 
chmod -R 777 storage/
composer dump-autoload
```
`php artisan cache:clear` キャッシュ削除する　　
`chmod -R 777 storage/` パーミッション変更する
`composer dump-autoload` オートロードを再実行する
## 宿題
オートロードが何をしてるか調べる。
Go + echoで社内からのみアクセスできるAPIを作る

# 背景

社内システムからのみアクセスできる（パブリックからはアクセスできない）APIを作成したい。
今回は、IPアドレスでアクセスできる／できないを切り替えるようにする。

# 方法

echoにはミドルウェアという概念がある。
https://echo.labstack.com/cookbook/middleware

アクセス元のIPアドレスを見て、アクセス元のIPアドレスが指定したネットワークに属さない場合に`403 Forbidden`を返すようなミドルウェアを作る。

```go:ミドルウェア使用例
e.GET("/internal/hoge", internal.Hoge, middleware.InternalAccess()) // 社内からしかアクセスできない
e.GET("/internal/huga", internal.Huga, middleware.InternalAccess()) // 社内からしかアクセスできない

e.GET("/public/piyo", public.Piyo) // 社外からアクセスできる
```

```go:internal_access.go
package middleware

import (
	"errors"
	"net/http"
	"github.com/labstack/echo"
)

// InternalAccess は社内アクセスのみを許可するためのミドルウェア
func InternalAccess() echo.MiddlewareFunc {
	return func(next echo.HandlerFunc) echo.HandlerFunc {
		return func(c echo.Context) error {
			networkUtil := app.NewNetworkUtil()

			isPrivateAddress := networkUtil.IsPrivateAddress(c.RealIP())

			if !isPrivateAddress {
				return cc.String(http.StatusForbidden, "public access is forbidden.")
			}

			return next(c)
		}
	}
}

```


```go:network_util.go
package app

import "net"

// NetworkUtil はIPがネットワークに所属するかどうか調べる
type NetworkUtil struct {
	networks []*net.IPNet
}

// NewNetworkUtil はNetworkUtilを作る
func NewNetworkUtil() *NetworkUtil {
	nu := new(NetworkUtil)

	// TODO: ここを設定ファイルに出す
	networks := []string{
		// ローカルマシン
		"10.0.0.0/8",
		"172.16.0.0/12",
		"192.168.0.0/16",
		"127.0.0.0/8",
		"::1/128", // ipv6ローカルホスト用

		// オフィスネットワーク
		"xx.xxx.xxx.xx/32", // current

		// データセンター
		"xxx.xxx.xx.0/24",
		"xxx.xxx.xx.128/25",
		"xxx.xxx.xx.64/26",
	}

	for _, v := range networks {
		_, ipnet, err := net.ParseCIDR(v)
		if err != nil {
			continue
		}

		nu.networks = append(nu.networks, ipnet)
	}

	return nu
}

// IsPrivateAddress はプライベートアドレスかどうかを調べる
func (nu NetworkUtil) IsPrivateAddress(ipString string) bool {
	ip := net.ParseIP(ipString)

	if ip == nil {
		return false
	}

	for _, v := range nu.networks {
		if v.Contains(ip) {
			return true
		}
	}

	return false
}
```

# 感想

* ParseIPとParseCIDRは便利
Nginxをリバースプロキシとして利用しWEBサーバに渡す


・環境
AWSのEC2を利用
OS：Amazon Linux 2
ミドル：nginx-1.12.2-1.amzn2.0.2.x86_64
　　　：httpd-2.4.33-2.amzn2.0.3.x86_64

・目的
Nginxの設定ファイルを修正し、Apacheの画面を表示する。

・前提
作業ユーザはrootを想定
EC2サーバにはパブリックIPを割り当てている

・作業内容
リバプロの設定方法が知りたいだけなので、サーバを追加はたてず一台の中にnginxもapacheも入れます。nginxとポート番号がかぶっていたので、httpdは81番ポートで起動しています。
下の「localhost:81」で、localhostはWEBサーバのホスト名かIPアドレスに、81はポート番号を記載
nginxが入っていなければ、[ここ](https://qiita.com/ashbrain/items/4de51ff33e4bddf1278b)を見ながら導入。
httpdが入っていなければ、「yum -y install httpd」で導入。

```bash:command内容
# cp -ip /etc/nginx/nginx.conf /etc/nginx/nginx.conf_bk
# vi /etc/nginx/nginx.conf
# diff -u /etc/nginx/nginx.conf /etc/nginx/nginx.conf_bk
--- /etc/nginx/nginx.conf       2018-07-09 13:40:36.865406140 +0000
+++ /etc/nginx/nginx.conf_bk    2018-07-09 13:45:27.331980494 +0000
@@ -45,7 +45,6 @@
         include /etc/nginx/default.d/*.conf;

         location / {
-          proxy_pass http://localhost:81/ ;
         }

         error_page 404 /404.html;
# systemctl restart nginx

```

・確認方法
ブラウザからパブリックIPを見るとApacheのトップ画面が表示されることを確認。

・失敗した場合
FirewallやSecurityGroupなどのセキュリティ関係の設定を見ることをお勧めします。
[WP REST] vue.jsで投稿数、投稿の総ページ数を取得する

WordpressのREST APIを提供しているWP RESTで全投稿数や投稿の総ページ数を取得する方法です。
ページ送りなんかを作る際に必要ですね。

まず、そのままではWP RESTは投稿数を返してくれないので、
WordPressテーマのfunctions.phpに投稿数を返すように設定します。

```php:functions.php

//add page count to headers
function my_customize_rest_cors() {
  remove_filter( 'rest_pre_serve_request', 'rest_send_cors_headers' );
  add_filter( 'rest_pre_serve_request', function( $value ) {
    
    //投稿数、ページ数を返すように追加する
    header( 'Access-Control-Expose-Headers: X-WP-Total, X-WP-TotalPages', false );

    return $value;
  });
}
add_action( 'rest_api_init', 'my_customize_rest_cors' );

```

これでresponseのheadersに投稿数を入れたものを返してくれます。

それをvus.jsではaxiosなどで以下のようにして取得できました。

```javascript

axios.get('/wp-json/wp/v2/post/'), {
    params: {
        per_page: 10
    }
}).then(function(response) {

   //10件分の投稿内容
   console.log(response.data)

   //headers部分で投稿数が取得できる
   console.log(response.headers['x-wp-total'])

   //こちらはページ数。一度に取得する投稿数(per_page)の値により変わります。
   console.log(response.headers['x-wp-totalpages'])

}).catch(function(error) {

    console.log('[Error] : ' + error )
    
})


```
rails + vue で単一ファイルコンポーネントに書いたcssがなぜか当たらないエラー

```html:index.html.erb
<div id="home">
  <h1>Home</h1>
  <test></test>
</div>

#home.jsをここで読み込む
<%= javascript_pack_tag 'home' %>
```

```js:home.js
import Vue from 'vue/dist/vue.esm';
import ElementUI from 'element-ui';
import 'element-ui/lib/theme-chalk/index.css'
import locale from 'element-ui/lib/locale/lang/ja'
import Test from '../test.vue';

Vue.use(ElementUI, { locale });

new Vue({
  el: '#home',
  components: {
    'test': Test,
  }
});
```

```vuejs:test.vue
<template>
  <div id="app">
    <p class="test-class">{{ message }}</p>
    <el-button @click="visible = true">Button</el-button>
    <el-dialog :visible.sync="visible" title="Hello world">
      <p>Try Element</p>
    </el-dialog>
  </div>
</template>

<script>
export default {
  data: function() {
    return {
      message: "Vue Componet!",
      visible: false
    };
  }
};
</script>

#ここに書いたcssがなぜか適用されない
<style lang="scss" scoped>
p {
  font-size: 2em;
  text-align: center;
  color: red;
}
.test-class {
  color: red;
}
</style>
```

ファイル構成が以下の時に```test.vue```で書いたcssがなぜか適用されないというエラーにどハマりました。
(vue自体は動作していました。)

## 結論

```html:index.html.erb
<div id="home">
  <h1>Home</h1>
  <test></test>
</div>

#home.jsをここで読み込む
<%= javascript_pack_tag 'home' %>
#これを付け加える
<%= stylesheet_pack_tag 'home' %>
```

jsを読み込む記述だけでなくcssを読み込む記述をする必要がありました。
```<%= stylesheet_pack_tag 'home' %>```の部分です。

## 原因

https://github.com/rails/webpacker/issues/987

こちらに書いてありました。
```vue-loader```を扱う場合にこのような記述が必要になるそうです。
メモ：Ubuntuでホームディレクトリに作成される「デスクトップ」などを英語表記に変更


## 環境
```
NAME="Ubuntu"
VERSION="17.10 (Artful Aardvark)"
```


## コマンド

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


http://mickey24.hatenablog.com/entry/20090122/1232583960
ブックマークレットでの困った集

ブックマークレットを作っていて困ったことをメモしていきます。壁に当たった時に追記していくスタイルでいきます。


#Uncaught SyntaxError: Invalid or unexpected token が発生
2018/7/9
10で割りたいだけなのに、うまく動かなかった。

##コード

```javascript
javascript:(
    function(){
        for( i=0; i<100; i++){
            if( i % 10 == 0 ){
                console.log(i);
            }
        }
    }
)()
```

##Closure compilerのコード

```javascript
(function(){for(i=0;100>i;i++)0==i%10&&console.log(i)})();
```


##実行結果
![image.png](https://qiita-image-store.s3.amazonaws.com/0/168315/44848c77-c8ad-9189-b902-0e1f1211dd69.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/168315/f40d6668-00f2-5ac4-ee1e-6e3574954784.png)

##原因
```%10``` がURLに入ると、ブラウザがURLエンコードされた文字として扱ってしまい正しく解釈されないから。%2から%9までならうまくいく（chromeブラウザの場合）。

##解決方法
剰余演算子の%を%25にエンコードする。見かけ上は%2510になるが2510で割るわけではない。
```i % 10 == 0``` ではなく、```i % val == 0``` のように何かの変数で割るようにする。単純にやりすぎるとclosure compilerが気を利かして%10に置き換えてしまうので注意
10以上で割るコードを書かない。
JavaScriptでURLクエリを取得する

クエリ文字列の取得は

```javascript
window.location.search
=> "?foo=1&bar=2"
```

クエリ文字列をオブジェクトに整形する関数を用意。

```javascript
function getUrlQueries() {
  var queryStr = window.location.search.slice(1);  // 文頭?を除外
      queries = {};
      
  // クエリがない場合は空のオブジェクトを返す
  if (!queryStr) {
    return queries;
  }
  
  // クエリ文字列を & で分割して処理
  queryStr.split('&').forEach(function(queryStr) {
    // = で分割してkey,valueをオブジェクトに格納
    var queryArr = queryStr.split('=');
    queries[queryArr[0]] = queryArr[1];
  });
  
  return queries;
}

```

これでめでたくクエリのオブジェクトの取得ができるようになりました🎉

※ブログからの転載記事です。

http://akinov.hatenablog.com/entry/2018/07/08/183134
ALTER TABLEのめも


# まえがき
開発をしていると、仕様の変更に伴ってすでに用意したDBテーブルへ変更がはいる場合があります。
そんなとき、大幅な変更であればDBテーブルごと新しく作ったりしますが、
ちょっとした変更であれば`ALTER TABLE`で対応するわけです。

なので、わりとなじみが深い`ALTER TABLE`なんですが、
変更対象がカラムならサクサクっと出来るのだけど、
相手がテーブルやインデックスとなるとちょっと怪しくなって、Google先生に頼ってしまいます。。

とはいえ、大概先生に聴くのもメンドくさくなったので、自分用に残しておきます


# 相手がテーブル
この記事を書くきっかけになった対応。
あんまりテーブル自体に対して`ALTER TABLE`はしないので、いざやろうとしても手が動かないレベルです。。

## テーブルの名前変更

```sql
ALTER TABLE [old_table_name] RENAME [new_table_name];
```

テーブル名にはスキーマ名を明記するクセがついているといいかも。

ツール（A5:Mk-2とか）で別スキーマのテーブル名を変更しようとしたとき、
うっかり新しいテーブル名にスキーマ名を付け忘れて、全然別のスキーマ上に新テーブルをつくってしまい、
ソースが動かなくて小1時間悩んでみたりすることがたまにある。。


## テーブルのコメント変更

```sql
ALTER TABLE [table_name] COMMENT [new_comment];
```

別に直接システムに何か影響があるわけじゃないのだけど、
役割が変わってしまったり誤字があったりとちょっと直したいときに。


## テーブルの文字コード変更

```sql
ALTER TABLE [table_name] DEFAULT CHARACTER SET [new_charset_name];
```

絵文字対応でUTF8からUTF8mb4に変更する、とか。
まぁ、最初からUTF8mb4で作っておけよって言われかねないですが、、、

## AUTO_INCREMENTの変更

```sql
ALTER TABLE [table_name] AUTO_INCREMENT = [value];
```

開発ではつかわないクセに、本番で実行することが比較的多い、困ったコマンド。。。
まぁ、あらかじめ始めの値が分かっている場合はDDLの`CREATE TABLE`に仕込んでおいたりするので、
そこまでよく使うってわけでもないですが、、、


# 相手がインデックス
追加と削除は問題ないんですが、インデックスの貼り換えでよくとちります。
安直に`CHANGE INDEX`とか`MODIFY INDEX`とか打って怒られるとか。。。

## インデックスの追加

```sql
ALTER TABLE [table_name] ADD INDEX [index_name] ([column_name]);
```


## インデックスの削除

```sql
ALTER TABLE [table_name] DROP INDEX [index_name];
```

## インデックスの変更

```sql
ALTER TABLE [table_name] DROP INDEX [index_name], ADD INDEX [index_name] ([column_name]);
```

カラムと違って、変更のためのコマンドは用意されていない（らしい）。
なので、削除→追加で対応します。



# 相手がカラム
さすがに相手がカラムとなると困ることは滅多にないんだけど、ついでなので残しておきましょう。

## カラムの追加

```sql
-- 一番最後に追加
ALTER TABLE [table_name] ADD COLUMN [column_name] [column_definition];

-- 一番最初に追加
ALTER TABLE [table_name] ADD COLUMN [column_name] [column_definition] FIRST;

-- 指定したカラムの後に追加
ALTER TABLE [table_name] ADD COLUMN [column_name] [column_definition] AFTER [column_name];
```

`FIRST`・・・・使った覚えがないな。。。


## カラムの変更

```sql
-- カラム定義のみ変更
ALTER TABLE [table_name] MODIFY COLUMN [column_name] [column_definition];

-- カラム名もあわせて変更
ALTER TABLE [table_name] CHANGE COLUMN [old_column_name] [new_column_name] [column_definition];
```

## カラムの削除

```sql
ALTER TABLE [table_name] DROP COLUMN [column_name];
```


# あとがき
我ながら「マニュアル読めよ！」レベルですな。。(ﾟДﾟ；)
まぁ、ググる手間を省くためなので、、、
PCを新しく購入した時のおすすめカスタマイズ備忘録

#はじめに
ついこの前、lenovoのthinkpadL380を購入したもので。
いろいろ設定をデスクトップと同じように設定しましたが、その手順をまた再利用できるように備忘録。
とはいえ、ほとんどググりながらやったやつなのでリンク集みたいなもんです。
まだまだカスタマイズしていくので、その都度追記します。

#もろもろ
##BIOSからCtrlとFnキーを入れ替える
https://www.microsoft.com/ja-jp/p/sylphyhorn/9nblggh58t01?rtc=1
##Cortanaを無効にする
https://news.mynavi.jp/article/windows-403/
##ディレクトリの名前を英語表記にする
http://appllio.com/how-to-use-windows-default-japanese-ime-settings
ディレクトリ日本語表記だと気持ち悪いからね...
##仮想デスクトップを使いやすくするために以下インストール
https://www.microsoft.com/ja-jp/p/sylphyhorn/9nblggh58t01?rtc=1
※ちょっと不具合あるので一長一短（2018/08/01追記）
Windows10の仮想デスクトップを番号でダイレクトに切り替える

# はじめに
会社ではmacOS、家ではWindows10のPCを使っています。
普段はシングルディスプレイで作業しており、シングルディスプレイでも複数のアプリケーションを効率的に切り替えられるよう、macOSでは[この記事](https://qiita.com/saboyutaka/items/d6cfd2a2b60f1a374d60)を参考にControl+デスクトップ番号で仮想デスクトップの切り替えを設定しています。
この設定は慣れるとものすごく便利なので、家のWindows機でも同様にControl+デスクトップ番号で仮想デスクトップを切り替えられないか調べてみました。
結果、[sdias/win-10-virtual-desktop-enhancer](https://github.com/sdias/win-10-virtual-desktop-enhancer) を使用することで同様に実現できたのでご紹介します。

<img src="https://qiita-image-store.s3.amazonaws.com/0/122672/e3790e0f-4061-9fa4-c4ec-31bb0bbd582e.gif" width=50%>

# 手順
## ダウンロード
現時点での最新版はBeta 0.11.1でしたので[ダウンロード](https://github.com/sdias/win-10-virtual-desktop-enhancer/releases/download/0.11.1/Windows.10.Virtual.Desktop.Enhancer.0.11.1.zip)します。

## インストール
先程ダウンロードしたzipファイルを適当な場所に展開します。
フォルダ内の **virtual-desktop-enhancer.exe** を実行するとバックグラウンドで起動します。
OS起動時に自動起動するには:

1. 実行ファイルを右クリック → **送る** -> **デスクトップ (ショートカットを作成)**
2. デスクトップに **virtual-desktop-enhancer.exe** というファイルが作成されるので、そのファイルを右クリック → **切り取り**
3. スタートメニューを開き、検索ボックスに `run` と入力し、**ファイル名を指定して実行ダイアログ**を実行します。
4. ダイアログに `shell:startup` と入力し **OK** を押します。
5. 新しく開かれたフォルダ内を右クリック → **貼り付け** します。

公式のインストール手順は[こちら](https://github.com/sdias/win-10-virtual-desktop-enhancer/blob/master/docs/installation.md)をご覧ください。

## カスタマイズ
ここでショートカットキーの割り当てとアニメーションの時間を変更します。
設定ファイル(**settings.ini**) を適当なテキストエディタで開きます。

### ショートカットキー
デフォルトはControl+Win+数字ですが、macOSと合わせてControl+数字に変更します。
`SwitchDesktop=Win, Ctrl`
↓
`SwitchDesktop=Ctrl`

### アニメーション
デフォルトは500msですが、視覚効果は必要ないので0に変更します。
`FadeOutAnimationDuration=100`
↓
`FadeOutAnimationDuration=0`

# 感想
macOSの時と違い、フリーで同様の設定が出来たことはとても大きいです。
若干の表示におけるタイムラグがあるものの許容範囲ですし、ストレスなく作業が行えているのでおススメです。
ちなみに私は以下のように設定をしています。

- 1:ブラウザ
- 2:SlackとかTypetalk
- 3:ターミナル
- 4:Gitクライアント
- 5~9:動的に1プロジェクトで1つのIDE
- 10:ブラウザ

よかったらお試しください。

# 参考
- [macOSでディスプレイ1枚で作業する技術](https://qiita.com/saboyutaka/items/d6cfd2a2b60f1a374d60)
- [Windows 10 の仮想デスクトップ機能を、強化する！「Windows 10 Virtual Desktop Enhancer」](https://www.gigafree.net/utility/VirtualDesktop/Windows10-Virtual-Desktop-Enhancer.html)
- [Windows 10の仮想デスクトップショートカットキー](https://qiita.com/masahiro_toriumi/items/f086f132657452de363e)
SION, a data serialization format a little more expressive than JSON

SIONというシリアライゼーションフォーマットを提案します。Swiftによるレファランス実装はこちら。

* https://github.com/dankogai/swift-sion

SIONという名前は Swift Interchangeable Object Notation からとりました。名前の通りSwiftのリテラルが元になっています。以下はSIONで表現されたデータの一例です。

```swift
[
    "array" : [
        nil,
        true,
        1,    // Int in decimal
        1.0,  // Double in decimal
        "one",
        [1],
        ["one" : 1.0]
    ],
    "bool" : true,
    "data" : .Data("R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7"),
    "date" : .Date(0x0p+0),
    "dictionary" : [
        "array" : [],
        "bool" : false,
        "double" : 0x0p+0,
        "int" : 0,
        "nil" : nil,
        "object" : [:],
        "string" : ""
    ],
    "double" : 0x1.518f5c28f5c29p+5, // Double in hexadecimal
    "int" : -0x2a, // Int in hexadecimal
    "nil" : nil,
    "string" : "漢字、カタカナ、ひらがなの入ったstring😇",
    "url" : "https://github.com/dankogai/",
    nil   : "Unlike JSON and Property Lists,",
    true  : "Yes, SION",
    1     : "does accept",
    1.0   : "non-String keys.",
    []    : "like",
    [:]   : "Map of ECMAScript."
]

```

見ての通り、

* (`Dictionary`|`Object`|`Map`)は`{}`ではなく`[]`で囲っている
* `Data`は`.Data("base64encoded")`と表現。ここで`base64encoded`は[Base64]でエンコードされたバイト列。
* `Date`は`.Date(timeIntervalSince1970)`と表現。ここで`timeIntervalSince1970`は1970年01月01日00:00:00GMTからの経過時間を`Double`で表現したもの(Swiftの`Date`型の内部表現)。
* `//` から改行まではコメント

[Base64]: https://ja.wikipedia.org/wiki/Base64

としています。

## 動機

要はJSONは痒くても掻けなかったところを掻けるようにしたかったということです。痒いところというのは以下のとおり。

* 数値が`Number`、実質上の`Double`しかなく、数値データがlossyになりがち
  * `Int`と`Double`をきちんと分けたい
* `String`以外のキーが使えない
* `Data`と`Date`をサポートしていない
* コメントが書けない

[MessagePack]はこれらをすベて解決していますが、しかしMessagePackはバイナリー。データ交換には最適でもデータ視覚化には何らかの形でそれをテキスト化する必要がある。しかしJSONでは漏れが出る。というわけでたどり着いたのが Swift のリテラルだったわけです。

参考に各種データシリアライゼーションフォーマットの各種データのサポート状況を表にまとめました。

[MessagePack]: https://msgpack.org

| Type | SION | MsgPack | JSON | Property List | Comment |
|--------|---------------|-------|---|---|---|
| `Nil`           | ✔︎ | ✔︎ | ✔︎ | ❌ | plist: .binary only |
| `Bool`          | ✔︎ | ✔︎ | ✔︎ | ✔︎ |
| `Int`           | ✔︎ | ✔︎ | ❌ | ✔︎ | 64bit |
| `Double`        | ✔︎ | ✔︎ | ✔︎ | ✔︎ | JSON's Number |
| `String`        | ✔︎ | ✔︎ | ✔︎ | ✔︎ | utf-8 encoded |
| `Data`          | ✔︎ | ✔︎ | ❌ | ✔︎ | binary blob |
| `Date`          | ✔︎ | ✔︎ | ❌ | ✔︎ | .timeIntervalSince1970 in `Double` |
| `[Self]`        | ✔︎ | ✔︎ | ✔︎ | ✔︎ | aka Array |
| `[String:Self]` | ✔︎ | ✔︎ | ✔︎ | ✔︎ | aka Object, Map…|
| `[Self:Self]`   | ✔︎ | ✔︎ | ❌ | ❌ |non-`String` keys|

## レファランス実装

その最初のレファランス実装である[swift-sion]は、本記事執筆現在

* `SION`型の生成と操作。操作感は[swift-json]と同様
* [JSON]との相互変換
* [Property List]との相互変換
* [YAML]への出力(出力のみ)

をサポートしています。

[swift-sion]: https://github.com/dankogai/swift-sion
[swift-json]: https://github.com/dankogai/swift-json
[JSON]: https://json.org
[Property List]: https://en.wikipedia.org/wiki/Property_list
[YAML]: http://yaml.org

## TODO

* 他言語での実装
* [MessagePack]との相互変換

## さいごに

ご意見をお待ちしております。

Dan the Safe, Fast and Expressive
.htaccessのメモ(アクセス制限と有効期限)

Apacheでは、公開デレクトリィに.htaccessを配置し各種設定を行える。しかし、機能が多すぎるので、よく使う機能について以下にまとめる。

#アクセス制限
複数指定する場合の優先順位は、必ずしも下に書いたものが優先されるとは限らないことに注意する。
##IPアドレスによる制限
###設定
特定のIPアドレスのみを許可する。

```:.htaccess
order deny,allow
deny from all
allow from (許可するIPアドレスもしくはドメイン名) 
allow from (許可するIPアドレスもしくはドメイン名)
.
.
.
 
```

###解除
特定のデレクトリィ以下をアクセスを許可する。

```:.htaccess
allow from all
```

##BASIC認証(ID及びパスワード)による制限

BASIC認証(ID及びパスワード)はキャッシュ制御に注意する。キャッシュの有効期限とBASIC認証情報の更新は直接リンクしていない。また、一部のブラウザーでは何度も古い認証情報でアクセスする場合があるが、何度か認証情報を入力すると更新される。

##設定
フルパス部分はURLではなくファイルシステムのパスを記述する必要があることに注意。

```:.htaccess
AuthUserFile (フルパス)/.htpasswd
AuthName "Please enter your ID and password"
AuthType Basic
require valid-user
```
###.htpasswdの作成

新規でカレントデレクトリィの.htpasswdを生成する場合、次のコマンドをbashから実行する。パスワードは10文字の乱数文字列で設定される。

```bash:
username=(ユーザ名)
passwordfile=(フルパス)/.htpasswd
password=`perl -e "@c = (a..z,A..Z, 0..9); print @c[rand @c] for 1..10"`
htpasswd -c -b $passwordfile $username $password
echo "$username $password"
```
####新規の場合
ここでの新規とは.htpasswdを新規に作成する意味である。

```
 htpasswd -c -b (フルパス)/.htpasswd ユーザ名 パスワード
```

####更新の場合
次のコマンドは、.htpasswdを更新し、ユーザーを追加もしくはパスワードを変更する。.htpasswdがなければ、ファイル作成されない。

```
 htpasswd -b (フルパス)/.htpasswd ユーザ名 パスワード
```

####セキュリティ
ほとんど発生しないが、上記の例のようにhtpasswd コマンドにパスワードを直接コマンドラインに記述すると、htpasswdが起動している一瞬の間psコマンドで表示されることは頭に入れておきたい。現在主流のOSでは、プロセスへのアクセス権が必要なので、アカウントを共有しない限り問題は発生しない。

```bash

$ps 
(省略)
12770 pts/1    R      0:00 htpasswd -b -c .htpasswd user3750 password
(省略)

```

####Webサービス
htpasswdを生成するWebサービスがいくつか公開されている。例えば次のサイトがある。

https://tech-unlimited.com/makehtpasswd.html


##解除
特定のデレクトリィ以下をBASIC認証なしでのアクセスを許可するには次のように記述する。

```:.htaccess
Satisfy any
allow from all
```

#有効期限
コンテンツの有効期限を設定する。ExpiresヘッダーもしくはCache-Controlヘッダーを出力するが、ここではExpiresヘッダーについて記述する。mod_expiresが必要。単位は様々使えるが、daysとminutesの2つだけで十分である。

##MIME Typeを使う場合
画像ファイルのみ60分有効で、他のファイルは1日有効の場合の例。

```:.htaccess
ExpiresActive On
ExpiresDefault "access plus 1 days"
ExpiresByType image/* "access plus 60 minutes"
```

##拡張子を使う場合

jsファイルのみ60分有効で、他のファイルは1日有効の場合の例。

```:.htaccess
ExpiresActive On
ExpiresDefault "access plus 1 days"

<FilesMatch "\.js$">
     ExpiresDefault "access plus 60 minutes"
</FilesMatch>
```

#その他
##リバースプロキシ
apache2.4では、リバースプロキシの設定に.htaccessを使うことはできない。

##nginx
nginxには.htaccessに相当する機能がない。動作中に設定を変更することはできないので設定ファイルを変更後、nginxの~~再起動~~設定再読込が必要になる。どうしても対応させたいときには、次の方法がある。しかし、どれも.htaccessを再現しているとは言い難い。

- 設定ファイルのコンバータを用意する。htaccessを更新する度に、設定ファイルのコンバートを行いnginxを~~再起動~~設定再読込させればよい。コンバータには次のWebサービスがある。https://winginx.com/ja/htaccess
- Apacheを使う。nginxをリバースプロキシで動作させApacheにアクセスする。当然、Apacheは.htaccessに対応しているので、.htaccessが使えるようになる。

#参考サイト
乱数文字列の生成 http://d.hatena.ne.jp/miau/20110324/1300966320 
apache公式ドキュメント http://httpd.apache.org/docs

#######誤りやもっといい方法など、ご指摘ください。
Jenkins PipelineでDockerを使う際に毎回imageをpullする方法

- 以下の通り
  - `Declarative Pipeline`で記述

    ```
    agent {
        docker {
            image 'image-name'
            alwaysPull true
        }
    }
    ```

# 参考

- <https://jenkins.io/doc/book/pipeline/syntax/#agent>
- <https://issues.jenkins-ci.org/browse/JENKINS-47106>
MSX VRAM (2)

screen 2でカラーとパターンジェネレータを登録する。
参考：z88dk\examples\msx\ex2.c

- MSX-BASIC

```smile2.bas
100 defint a-z
110 dim g(7)
120 for i=0 to 7:read d$:g(i)=val("&b"+d$):next
130 data 00111100
140 data 01000010
150 data 10100101
160 data 10000001
170 data 10100101
180 data 10011001
190 data 01000010
200 data 00111100
210 color 15,1,14:screen 2
220 for k=0 to 2
230  c=(2+k*3)*&h10+1
240  for j=0 to 255
250   p=(k*256+j)*8
260   for i=0 to 7:vpoke &h2000+p+i,c:next
270   for i=0 to 7:vpoke p+i,g(i):next
280 next j,k
290 if strig(0)=0 then 290
300 p=&h2000+int(rnd(1)*768)*8
310 c=int(rnd(1)*16)*&h10+1
320 for i=0 to 7:vpoke p+i,c:next
330 goto 300
```

- z88dk

```smile2.c
/*
zcc +msx -lndos -create-app smile2.c
bload"cas:",r
*/

#include <msx/gfx.h>

#define BYTE unsigned char

void main()
{
	BYTE g[] = {0x3c, 0x42, 0xa5, 0x81, 0xa5, 0x99, 0x42, 0x3c};

	set_color(15, 1, 1);
	set_mode(mode_2);

	// パターンジェネレータ
	for (int i = 0; i < MODE2_MAX; i += 8) {
		vwrite(g, i, 8);
	}

	while (! get_trigger(0)) {
		int c = rand() & 15;
		int addr = (rand() % MODE2_MAX) & ~(7);
		fill(MODE2_ATTR + addr, c << 4, 8);
	}
}
```
ROMカートリッジ版
http://webmsx.org/?rom=http://www.maroon.dti.ne.jp/lance/file/smile2.rom


MSX-BASICの実行例
![WMSX Screen (1).png](https://qiita-image-store.s3.amazonaws.com/0/257554/e9db0abf-de5b-31b4-b4d8-2ce0a1b38386.png)
Linuxで 特定文字列を含むファイルを一括して処理したい

$(grep -l 文字列 ファイル名) を引数にする
 
例）
「testという文字列が含まれるカレントディレクトリのファイル」を
上位のhogeフォルダに移動させたい場合は

```
mv $(grep -l test *) ../hoge
```
hackscodeでXcodeをちょっと便利にする

# hackscode
最近ちょっとしたツールを書きました。
https://github.com/toshi0383/hackscode

今後色々便利コマンドを追加していきたいと思っていますが、今のところ下記の1つだけです。

## remove-build-file
以下のようにすると、 `MyViewModelSpec.swift` 以外の `*Spec.swift` をビルド対象から除くことができます。

```shell-session
$ hackscode remove-build-files --from-target Tests --matching Spec.swift --excluding MyViewModelSpec.swift
```

Build Phase(`PBXBuildFile`)から除いているだけなので、Xcode上でファイルは編集できるというのがポイントです。
このようにターゲットのチェックが外れた状態になります。
<img width="149" alt="Screen Shot 2018-07-09 at 19.13.30.png" src="https://qiita-image-store.s3.amazonaws.com/0/35008/e53c5305-6828-6e00-96e3-8e1e9df7e60d.png">


Swiftのコンパイルはとても時間がかかるので、大きなコードベースでテストケース1つだけを直すような時に使うと便利です。

しかしこれをコマンドラインで毎回指定するのも、ちょっと長くて面倒ですよね？そこで、AppleScriptの出番です。

```applescript
#!/usr/bin/osascript

use AppleScript version "2.4" # Yosemite or later
use scripting additions
use framework "Foundation"

on run
    tell application "Xcode"
        set projectPath to path of active workspace document
        set projectFolder to characters 1 thru -((offset of "/" in (reverse of items of projectPath as string)) + 1) of projectPath as string
        set sourceName1 to (get name of window 1)

        try
            do shell script "hackscode remove-build-files --from-target AbemaTVTests --matching Spec.swift --excluding " & sourceName1 & " --project-root " & projectFolder
            display notification "👌 Ignored all specs except " & sourceName1 with title "Hackscode"
        on error errStr number errorNumber
            display notification "🛑 " & errStr & " (" & errorNumber & ")"
        end try
    end tell
end run
```

このコードを適当なファイル名で保存して、以下のようにXcodeの設定 => Behaviorsに追加します。

<img width="794" alt="Screen Shot 2018-07-09 at 18.46.59.png" src="https://qiita-image-store.s3.amazonaws.com/0/35008/b488804f-ca39-ea2f-012a-d3ebb2c00f6b.png">

こうすると、ショートカット1発で、現在開いているファイルを `--excluding` に指定して実行することができます。今日もこれ何度か使ったのですが結構便利です。

pbxprojの編集には、XcodeGenでも使われている[xcodeproj](https://github.com/xcode-project-manager/xcodeproj)を使っています。

## トラブルシュート
コマンドラインと違って、XcodeのBehavior経由だと `PATH` が通っていなかったり、カレントディレクトリがプロジェクトルートになっていない場合があります。
そんな時は、コマンドラインからXcode.appを開き直すとうまくいくようになるかもしれません。

```console
$ cd project_root/ # App.xcodeprojのあるディレクトリに移動
$ open -a /Applications/Xcode.app App.xcodeproj
```

# なぜXcode Editor Extensionではないのか？
Xcode Editor Extensionも試したのですが、以下の理由でやめました。
- 開いているファイル名が取得できない（致命的。。）
- インストールが面倒かつ期待通り変更が反映されなかった
- AppCodeやvimユーザが使えない

Editorのメニューに出てくるのはとても便利なんですけどね。そこだけ使わせて欲しい😅

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">Xcode Editor Extensionで一応こういう置換ツールはサクッと作れたけど、バグ修正した後の再リリース内容が反映されず、配布とインストールが鬼門な印象を受けた。 <a href="https://t.co/8ELsJE4iCD">pic.twitter.com/8ELsJE4iCD</a></p>&mdash; Toshihiro Suzuki (@toshi0383) <a href="https://twitter.com/toshi0383/status/1015242886240059397?ref_src=twsrc%5Etfw">2018年7月6日</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

Xcode Editor Extensionについてはこちらのスライドが参考になると思います。
https://speakerdeck.com/takasek/20170916-number-iosdc

# まとめ
以上久しぶりにちょっと記事を書いてみました。
Xcodeは長く使っている割に使いこなせていない部分も結構ある気がしているので、他にもこういうコマンドあったら便利そうとかあれば教えて欲しいです🙏
Windows版OpenSSHでGitHubに接続する方法を非エンジニア向けに最短で説明してみる

## 概要

最短で說明する為に、概要は省略する。


## Chocolateyのインストール

### 管理者権限でコマンドプロンプトを開く

Windowsボタンを押して cmd と入力。
「コマンドプロンプト」という名前のアプリケーションが出てくるので、右クリックして「管理者として実行」を選択。

<img src="https://qiita-image-store.s3.amazonaws.com/0/56337/5a2a5633-edd2-b93a-8e9b-a84e5e0f2736.png" width=50%>


### Chocolateyのインストールコマンドを実行

Chocolateyのインストールページを開く
https://chocolatey.org/install

"Install with cmd.exe" の横にあるコピーボタン(copy command text)をクリックする。

先ほど開いたコマンドプロンプトを右クリックして、コマンドを貼り付ける。

エンターキーを押して、コマンドを実行する。

インストールが終わると"C:\WINDOWS\system32>" の横でカーソルが点滅するので、
一旦コマンドプロンプトを閉じる。

## OpenSSHのインストール

"管理者権限でコマンドプロンプトを開く" の手順で再度管理者権限のコマンドプロンプトを開く。

```
choco install openssh
```

インストールするか？と聞かれるので`Y`を押して進める。

## 鍵の生成

(管理者権限でない)コマンドプロンプトを開く。
以下のGitHubヘルプページにある手順で、`ssh-keygen`コマンドを利用して鍵を生成する。
[Generating a new SSH key and adding it to the ssh-agent - GitHub Enterprise 2.13 Documentation](https://help.github.com/enterprise/2.13/user/articles/generating-a-new-ssh-key-and-adding-it-to-the-ssh-agent/)

```
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
# メールアドレスは適宜変更
```

完了すると、ホームディレクトリ以下の`.ssh`フォルダに秘密鍵(`id_rsa`)及び公開鍵(`id_rsa.pub`)が作成される。


## GitHubへ鍵の登録

以下のコマンドを打つと、先ほど作成した鍵の公開鍵がクリップボードにコピーされる。

```
type %HOMEPATH%\.ssh\id_rsa.pub | clip
```

こちらをSSHキーの管理ページに登録する。名前は適当で構わない。
https://github.com/settings/keys

## SourceTreeへの登録

SourceTreeで、[ツール]->[オプション]を選び設定画面を開く。
SSHクライアントを[PuTTY/Plink]から[OpenSSH]へ変更する。
[SSHキー]として、先ほど作成した秘密鍵(`id_rsa`)のパスが選ばれていることを確認する。
違う場合は手動で選択する。

## 完了！

これで、SourceTreeからSSHでクローン/プッシュができるようになったはずです。
react-native > react-native-firebase



[Initial setup - Installation | React Native Firebase](https://rnfirebase.io/docs/v4.2.x/installation/initial-setup)


# アプリ作成

## ベースのアプリを作成する

react-native initでアプリのプリジェクトファイルを作成します。

```
react-native init firebase1

```

作成されたフォルダをVisual Studio Codeで開きます。


## react-native-firebaseの追加

VS Codeのターミナルから以下コマンドを打ち、react-native-firebaseを追加します。

```
npm install --save react-native-firebase

```


# Firebase


## 新しいプロジェクトを作成

コンソールから新しいプロジェクトを作成します。
[Firebase console](https://console.firebase.google.com/)

以下に沿ってGoogleService-Info.plistのダウンロードまで進みます。
[React-Native-Firebaseを試して見る - Qiita](https://qiita.com/sugasaki/items/98e804da4e0b26a8bff9)


プロジェクトフォルダ配下の以下に保存します。
ios/[YOUR APP NAME]/GoogleService-Info.plist


## AppDelegate.m


[iOS - Installation | React Native Firebase](https://rnfirebase.io/docs/v4.2.x/installation/ios)


ios/[YOUR APP NAME]/AppDelegate.m file


`#import <Firebase.h>`と`[FIRApp configure];`を追加します。

以下のような感じになります。

```
#import "AppDelegate.h"
#import <React/RCTBundleURLProvider.h>
#import <React/RCTRootView.h>
#import <Firebase.h>
@implementation AppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
  [FIRApp configure];
  NSURL *jsCodeLocation;

  jsCodeLocation = [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@"index" fallbackResource:nil];
以下略
```
  
  
## Install Firebase Library

Cocoapodsを使用してFirebase SDKをインストールすることを推奨しているとの事です。

### Podfile 作成。
Podfile がない場合は作成します。
[Firebase を iOS プロジェクトに追加する  |  Firebase](https://firebase.google.com/docs/ios/setup#add_the_sdk)


```
cd ios
pod init
```

Podfileができます。
tvOSTestsが２回宣言されているようですが、これはバグのようです。
tvOSTestsを削除します。



### Podインストール

以下コマンドでインストールします。

```
pod install
```

UPDATEもやっときます。 
```
pod update
```



### Link React Native Firebase

プロジェクト直下のフォルダに移動して以下コマンドを打ちます

```
react-native link react-native-firebase

```

結果

```
Scanning folders for symlinks in /Users/atsu/react_native/Firebase/firebase1/node_modules (19ms)
rnpm-install info Linking react-native-firebase ios dependency
rnpm-install info Platform 'ios' module react-native-firebase has been successfully linked
rnpm-install info Linking react-native-firebase android dependency
rnpm-install info Platform 'android' module react-native-firebase has been successfully linked
```



## サンプルアプリ

ようやくここに戻ってこれました。
[Initial setup - Installation | React Native Firebase](https://rnfirebase.io/docs/v4.2.x/installation/initial-setup)




```
import firebase from 'react-native-firebase';

firebase.auth()
  .signInAnonymouslyAndRetrieveData()
  .then(credential => {
    if (credential) {
      console.log('default app user ->', credential.user.toJSON());
    }
  });
```



pod 'Firebase/Auth'



pod install


react-native run-ios



## podのインストールやりなおし

```
cd ios
rm -rf Pods/
pod install
```




```
rm -rf node_modules/
npm i
```
Deployerのrsyncレシピでexcludeとincludeの同時指定を行う

以下のようなディレクトリ構造において、`public/`だけをrsync対象にしたい場合があるとします。

```
deploy_taget
├── .git/
├── src/
├── public/
├── deploy.php
└── README.md
```

Deployerのrsyncレシピで`--include="/public" --exclude="/*"`を期待し、以下のように書いてもうまく動きません。

```deploy_bad.php
<?php
require 'recipe/rsync.php'

// (略)

// Rsync Settings
set('rsync_src', __DIR__);
set('rsync_dest', '{{ release_path }}');
set('rsync',[
    'include'      => ['public'],
    'include-file' => false,
    'exclude'      => ['*'],
    'exclude-file' => false,
    'filter'       => [],
    'filter-file'  => false,
    'filter-perdir'=> false,
    'flags'        => 'rz', // Recursive, with compress
    'options'      => ['delete', 'delete-excluded'],
    'timeout'      => 300,
]);

// Deploy
task('deploy', [
    'deploy:prepare',       // Create dirs on server
    'deploy:release',       // Release number on server
    'rsync',                // Send files to server
    'deploy:symlink',       // Symlink /current on server
    'cleanup',              // Cleanup old releases on server
    'success',
])->desc('Deploy Project');
```

これは[`$ rsync {{$options}} --exclude={{$exclude}} --include={{$include}} --filter={{$exclude}}`の順番で決め打ちされているため](https://github.com/deployphp/recipes/blob/6d49dd3d5405a7980d586456a1af121ef9324e8c/recipe/rsync.php#L98)、excludeに指定したものが常に最優先となってしまうためです。 (2018/07/09 現在)

Deployerのrsyncレシピでexludeとincludeを同時指定したい場合は、`filter`を使ってexlude/includeの順番を明示的に示すのがおすすめです。

```deploy_good.php
// (略)

set('rsync',[
    'exclude'      => [],
    'exclude-file' => false,
    'include'      => [],
    'include-file' => false,
    'filter'       => [
        '+ /public',
        '- /*',
    ],
    'filter-file'  => false,
    'filter-perdir'=> false,
    'flags'        => 'rz', // Recursive, with compress
    'options'      => ['delete', 'delete-excluded'],
    'timeout'      => 300,
]);
```

参考: [rsync で凝ったファイル名のパターンを指定する \- daily dayflower](http://d.hatena.ne.jp/dayflower/20060714/1152872353)
Elixirで関数の実行速度を測定する

(この記事は、「[fukuoka.ex x ザキ研 Advent Calendar 2017](https://adventar.org/calendars/2873)」の22日目です）

昨日は@piacere_exさんの「[関数型でデータサイエンス#4：インプットしたデータを集約する②](https://qiita.com/piacere_ex/items/7c33836f930b63b0444d)」でした．

---

#はじめに
　前回の記事「[Elixirで2次元のリスト加算関数をつくる](https://qiita.com/hisaway/items/78caa3115d107319e83e)」では，2次元リストの加算関数について説明しました。

- ガード句とパターンマッチングは併用できる
- 2次元リストだと表示が上手くいかないことがあるので注意

今回の記事は打って変わり，再帰呼び出しによるリストの操作以外にも，`Enum`や`Flow`で記述したコードの実行速度を測定した結果を示します．

# 実行速度測定
　実行速度の測定には`:timer.tc`を使います．以下は与えられた関数の処理時間を単位`[s]`で表示するコードです．

こちらの記事([Elixirでパフォーマンス測定](https://qiita.com/masashi127/items/d54688d9c9e25f057d61))を参考にさせていただきました．

```elixir
defmodule Test
　...
  # サンプルコード
  def timed(func) do
      func
      |> :timer.tc
      |> elem(0) 
      |> Kernel./(1000000)
  end
  ...
end
```
 
上記のコードに少し手を加えて，強引に実行速度を測定します．
`Flow`のコードはこちらの記事([Elixir Flowでlazyな並列分散処理](https://qiita.com/shufo/items/59d1c3b0baac6751777f))を参考にさせていただきました．

```elixir
defmodule Test
    def timed_recursive() do
    :timer.tc( fn -> 
      1..10_000_000 
      |> Enum.to_list 
      |> Numex.twice end )
      |> elem(0) 
      |> Kernel./(1_000_000)
  end

  def timed_enum() do
    :timer.tc( fn -> 
      1..10_000_000 
      |> Enum.to_list 
      |> Enum.map(& &1 * 2 ) end )
      |> elem(0) 
      |> Kernel./(1_000_000)
  end
  
  def timed_flow(stage) do
    :timer.tc(fn -> 
    1..10_000_000 
    |> Flow.from_enumerable(stages: stage) 
    |> Flow.map(& &1 * 2) 
    |> Enum.to_list
    |> Enum.sort end) 
    |> elem(0) 
    |> Kernel./(1_000_000)
  end

  # 要素ごと2倍
  def twice([a|tla]) when not is_list(a) do
    [a*2|twice( tla)] 
  end
  def twice([]), do: [] 
end
```


## 確認
使用したデータは，(A) 一千万もしくは，(B) 一億の要素をもつリストです．

|実行速度[s]|(A)10_000_000|(B)100_000_000|
|:-:|:-:|:-:|
|Recursive|1.0722782|27.61662|
|Enum|1.2500004|17.484315|
|Flow(1)|3.5802442|41.678115|
|Flow(2)|6.6561348|123.548497|

※一千万の方の結果は10回実行した平均値，一億の方は1回実行した結果です．

処理自体が単純なものなので，`Flow`で並列化させても効果は薄そうです．(並列化するコストの方が高そう)
`Enum`と比較してみると，(A)のときは，いい勝負になってますが，(B)のときは最適化もされていない再帰呼び出しでは及ばなさそうです．

# 最後に
今回は実行速度を測定しました．再帰呼び出しが最速とも言い切れない，まとまりのない情報でしたが，実行速度を測ってみたいという方の参考になれば幸いです．

# 参考文献

- **Elixir School**[「Erlangとの相互運用」](https://elixirschool.com/ja/lessons/advanced/erlang/#%E6%A8%99%E6%BA%96%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA)

- **masashi127** [「Elixirでパフォーマンス測定」](https://qiita.com/masashi127/items/d54688d9c9e25f057d61)

- **shufo** [「Elixir Flowでlazyな並列分散処理」](https://qiita.com/shufo/items/59d1c3b0baac6751777f)

明日は @Takeshi-Kogu さんの[「モジュールをファイルに書き込んでみる(後半)」](https://qiita.com/Takeshi-Kogu/items/b8147db8f7a9297353cf)です。お楽しみに！
開発中のiOSアプリにMacからプッシュ通知を送る

# tl;dr
[Pusher](https://github.com/noodlewerk/NWPusher) という macOSアプリで簡単に送ることができた

<img width="612" alt="osx1.png" src="https://qiita-image-store.s3.amazonaws.com/0/39720/669943a7-3b75-6b34-0b6b-4db1f85428da.png">

# インストール

```
$ brew cask install pusher
```

以上

# APNS証明書のインストール

これはいつもの作業だと思うので、以下の記事などを参考に。

[プッシュ通知に必要な証明書の作り方2018](https://qiita.com/natsumo/items/d5cc1d0be427ca3af1cb)

APNS証明書を自身のマシンにインストールできれば自動的にリスト表示してくれる

![p12s.png](https://qiita-image-store.s3.amazonaws.com/0/39720/efe20c54-4a09-4527-d4d2-cc4dfc0745dc.png)


# device token の取得

プッシュ通知の送り先を決めるために device token を指定する必要がある。
アプリにプッシュ通知を受けるための実装全般については [別の記事](https://dev.classmethod.jp/smartphone/iphone/wwdc-2016-user-notifications-remote/) を参考に。

プッシュ通知を受ける実装が完了していれば、通知を許可したタイミングで以下のデリゲートメソッドが呼ばれる。
取得した文字列をテキストボックスにコピーする。

```AppDelegate.swift

// MARK: - UIApplicationDelegate

    func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
        let token = deviceToken.map { String(format: "%02.2hhx", $0) }.joined()
        print(token) // この文字列を device token としてテキストボックスに貼り付ける
    }
```

![devicetoken.png](https://qiita-image-store.s3.amazonaws.com/0/39720/967ce7bc-cdb3-4de3-339f-66288b28de3e.png)


# 通知

Push ボタンを押すと通知がとぶ。

![IMG_E918237FD2AC-1.png](https://qiita-image-store.s3.amazonaws.com/0/39720/a44c2011-4a00-5500-11d9-1b90bd42bbe5.png)
【Python】リストの要素を使ってさしこみ文書の作成

コードはPython2.6と3.6での動作を確認しました。
コメントで @shiracamus さんがより簡潔で有用な記述を指摘してくださっている。
# やりたいこと

```python:list.py
 Name = [“anago”,”ikura”,”unko”]
```

みたいなリストから

```python:Text0.txt
 Hello, I am anago
```
```python:Text1.txt
 Hello, I am ikura
```
```python:Text2.txt
 Hello, I am unko
```
っていう感じのファイルを作りたい。


# やってみた
```python:say_hi.py
Name = ["Anago","Ikura","Unko"]
for i in range(3):
        with open("Text{0}.txt".format(i),"w") as file:
                file.write("Hello, I am {0}".format(Name[i]))


```
作ったテキストファイルは以下のとおり

```python:Text0.txt
 Hello, I am anago
```
```python:Text1.txt
 Hello, I am ikura
```
```python:Text2.txt
 Hello, I am unko
```

Forによる繰り返しと、with open みたいなコマンドと ”bunshou”.formatみたいなのを組み合わせたらできました。

参考にさせていただいたサイト

[ファイル読み書き file open read write ](https://python.civic-apps.com/file-io/)

[pythonでファイルの読み書き](http://python-remrin.hatenadiary.jp/entry/2017/05/02/182203)

[python for文を初心者向けに解説！for文基礎はこれで完璧](https://udemy.benesse.co.jp/development/python-for.html)

[【Python入門】format関数で文字列の書き方](http://programming-study.com/technology/python-format/)

# すこし複雑な例

```python:eat_sushi.py
number = [1,2,1000]
name = ["anago","ikura","unko"]
for i in range(3):
        for j in range(3):
                with open("eatsushi{0}{1}.txt".format(i,j),"w") as file:
                        file.write("Hello, I am {0} \n ".format(name[j]))
                        file.write("\n\n")
                        file.write("I have eaten {0} sushis  \n".format(number[i]))
                        file.write("Good bye"+"{0}{1}".format(name[j],number[i]))
                        file.write("\n\n")


```

同じディレクトリに

```python:eatsushi00.tet
Hello, I am anago 
 

I have eaten 1 sushis  
Good byeanago1

```
などが生成される。
10分で理解するGrafana

# [Grafana](https://grafana.com/) とは
[Grafana](https://grafana.com/) は Grafana Labs が公開しているログ・データ可視化のためのツールです
可視化ツールとしては [kibana](https://www.elastic.co/jp/products/kibana) とほぼ同じようなものです

![grafana_top.png](https://qiita-image-store.s3.amazonaws.com/0/43699/69c8fdad-1e71-21ab-dc63-b4bcead746fd.png)

Grafana も kibana も、DB に保存されたログに対してリアルタイムにクエリを投げてデータを表示することができ、
表示する期間の長さや時間帯を変えたり、パーツ毎に特定のノードだけのデータを表示したりインタラクティブに可視化を操作することができます

Grafana は複数のデータベースに対応しており現時点では以下に対応しています
- Graphite
- Prometheus
- Elasticsearch
- InfluxDB
- OpenTSDB
- MySQL
- AWS Cloudwatch

kibana は elasticsearch のみ対応しています
UI の機能は kibana の方が高機能な気がしますが、Grafana でもプラグインで様々な機能・UIが公開されていますし自分で開発することもできます
https://grafana.com/plugins

ただ、リソース監視やアプリケーションのスタッツ監視という観点で考えれば、そこまでリッチな可視化は必要ない場合がほとんどだと思うので、どちらを使っても大きな違いはないはずです

[Prometheus](https://qiita.com/Chanmoro/items/ac0eb1bf93760566b338) で取得したデータをカッコよく可視化するためにも Grafana を使うことができます

# Grafana インストール
[公式ドキュメント](http://docs.grafana.org/installation/) に沿ってインストールしてもらえばOKですが、Docker を利用するのが一番簡単です

データの保存を考えずにとりあえず動かすならこれだけ！

```text:DockerでGrafanaを起動
$ docker run -d -p 3000:3000 grafana/grafana
```

# Grafana で可視化する
Dashboard というのを作成し Dashboard ごとに可視化パーツを設定していくことになります

可視化の手順は基本的に以下だけです
1. Dashboard を作成
1. UIパーツを追加
1. データ取得のクエリをセット

クエリを考えるのに多少頭を使う必要があるくらいで、あとはサクサク試しながら追加していくことができます
一度セットアップした Dashboard は保存できますし、設定を Json 形式で export できるのでコードとしてバックアップを取っておくことも可能です

## 利用できる UIパーツ
デフォルトでは以下のパーツが用意されています
Graph と Singlestat があればとりあえず困ることはないでしょう
![UI.png](https://qiita-image-store.s3.amazonaws.com/0/43699/2200558f-3bf1-d127-bff7-ace811f06e78.png)

Heatmap ってやつがなかなかイケてる見た目をしています
![heatmap.png](https://qiita-image-store.s3.amazonaws.com/0/43699/c7c20396-497d-cc05-16f5-3fdda5fc7094.png)

Grafana のプラグインでいろいろな UI パーツが公開されているので、
込み入った表示がしたければそういうものを利用するのもありです

github のコミットの履歴のグラフみたいなプラグインとかもありました
https://github.com/NeoCat/grafana-cal-heatmap-panel
![commit.png](https://qiita-image-store.s3.amazonaws.com/0/43699/15101019-5e6d-a7d1-37d7-0f12f5b42291.png)


## クエリの設定 (Prometheus の場合)
利用するバックエンドによってクエリの詳細は違いますが、Prometheus を利用した場合の例を少しだけ

[10分で理解する Prometheus](https://qiita.com/Chanmoro/items/ac0eb1bf93760566b338)  で紹介した node_exporter を利用するとマシンのCPU、メモリ、ディスクなどのリソース情報を取得できます

空きメモリを取得するには以下をセットします

```text:空きメモリ取得
node_memory_MemAvailable
```

各マシンの CPU 使用率は以下のクエリで取得できます

```text:CPU使用状況
100 - (avg by (instance) (irate(node_cpu{mode="idle"}[5m])) * 100)
```
ぶっちゃけクエリの意味はあんまりわかっていません
クエリの意味の解説はコチラへ！
https://www.robustperception.io/understanding-machine-cpu-usage/

# これが Grafana で作ったダッシュボードだ！
色々と設定をするとこんな感じのダッシュボードが出来上がります
Prometheus で用意されているデフォルトのダッシュボードと比べると雲泥の差ですね

![grafana_s.png](https://qiita-image-store.s3.amazonaws.com/0/43699/243a0f06-3a20-e657-4c0d-1bd4cf6d89b9.png)

以上、快適なダッシュボードライフを！
Kotlin + dagger2でUninitializedPropertyAccessExceptionが出た時の対処

#概要
Kotlin で dagger2を試している時に
UninitializedPropertyAccessException: lateinit property hogeViewModel has not been initialized
が発生。他のActivityではできるのになぜ？ってなったので備忘録

#原因
他のActivityではDaggerAppCompatActivityを継承しているのに
AppCompatActivityを継承してた。。。
という初歩的なミス


#別の解決法
``` activity.kt

class HogeActivity : AppCompatActivity() {
@Inject
    lateinit var hogeViewModel: HogeViewModel

override fun onCreate(savedInstanceState: Bundle?) {
        AndroidInjection.inject(this)//←追加
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_hoge)
        hogeViewModel.getHogeFromApi~~~//以下略
    }
}
```
DaggerAppCompatActivityはAndroidInjection.inject(this)をonCreateでやってくれているBaseクラスなので、AppCompatActivityを継承したクラスのonCreateでAndroidInjection.inject(this)を追加しても解決します。

まだまだ、DIの勉強不足が否めない。
OpenZeppelinをREMIXで読みこむ方法

# 前置き
Solidityの開発環境として、REMIXというIDEが公開されている。

こういうの
<img width="1233" alt="スクリーンショット 2018-07-09 17.16.31.png" src="https://qiita-image-store.s3.amazonaws.com/0/254378/16b5ee55-bdbc-4a6e-a269-c59a7d274f29.png">


これ一つでコンパイル、testRPCの起動と接続、metamaskと連携して各種ネットワークへのデプロイなど、様々な操作が行える。

普段はTruffleでの開発が多くなるけど、あんまり依存関係の激しくないコントラクトの場合、ちゃちゃっとテストネットでの挙動をみたい時とかは、こっち（REMIX）を使うことも多いかも。。。

# 疑問（やりたいこと）
あれ。。。OpenZeppelinとかの外部ライブラリってREMIXでどうやって読み込むんだ。。。。
ファイルを一つ一つインポートしていくのは面倒くさすぎて毛根へのダメージが。。。


# どうやる
こうやる

```
pragma solidity ^0.4.21;

//ここで読み込む
import "github.com/OpenZeppelin/zeppelin-solidity/contracts/token/ERC20/StandardToken.sol";

//ここから下は普通のトークンコントラクトなので気にしない
contract MyToken is StandardToken {
  string public name = "MyToken";
  string public symbol = "MTKN";
  uint public decimals = 18;

  function MyToken(uint initialSupply) public {
    totalSupply_ = initialSupply;
    balances[msg.sender] = initialSupply;
  }
}
```

↑みたいに
import "github.com/〜
のようにできるのがポイントでした。
毛根は守られた。

以上
OpenCV Video Frame Extraction

##OpenCVでフレームスキップを指定したビデオフレームの抽出 (Python)

```python

import cv2
vidcap = cv2.VideoCapture('<VIDEO FILE NAME>')
success,image = vidcap.read()
fps = vidcap.get(cv2.CAP_PROP_FPS)
totalframes = vidcap.get(cv2.CAP_PROP_FRAME_COUNT)

frame2skip = <FRAME_SKIP_RATE>  # num of frames to skip when extracting
outputframe = int(totalframes / frame2skip)

print('Video FPS rate is {}'.format(fps))
print('You will get {} frames in total'.format(outputframe))

while success:
    frameId = int(round(vidcap.get(1)))
    success, image = vidcap.read()

    if frameId % frame2skip == 0:
        cv2.imwrite('frame_%d.jpg' % frameId, image)
        print('Export frame {}: '.format(frameId), success)

vidcap.release()
print ('Extraction completed!')
```
Microsoft FlowでSlackのメッセージ投稿で特定のユーザをメンションする方法

# 今回の投稿背景
Microsoft Flowでカスタムリストが更新されたよーってのをSlackのチャンネルに投稿したいと思って
投稿は簡単にできた。
だけど、カスタムリストの更新って、あて先決まってるよね・・・
チャンネル全員に通知はするけど、特にその人には念入りに知らせたいよね
ってことでいろいろ試行錯誤したのです。

# SlackのAPIでメンションを送るにはどうすればいいのか？
Slack-API message-formatting
https://api.slack.com/docs/message-formatting

ここの **Linking to channels and users**

```
 Hey <@U024BE7LH>, did you see my file?
```
という感じで指定すればメンションできるらしい。

# Microsoft-Flowではどうやって宣言するのか？ 
APIどおりに以下のように記述しました。

```
 <@SlackID>
```
ダメでしたorz

いろいろ試行錯誤した結果、こうしました。

```
 concat('<@',SlackID,'>')
```

OKでした😃

concat関数で文字列結合をするとうまく反映されます。
Slack-botをMicrosoft Flowで作りたい方はぜひご参考ください。