OmniAICreator/Qiita-1.07M huggingface dataset:
Macの連絡先データをCSVに変換する

# はじめに

そろそろ年賀状の季節なので、準備を始めました。

# 連絡先データの書き出し

連絡先アプリを起動し、ファイルメニューから「書き出す」-「vCardを書き出す」を選択。
半角英数でファイル名を指定して保存。

# 変換用スクリプトのダウンロード

[vCard to LDIF/CSV Converter](https://github.com/thomascube/vcfconvert)

上記のリンク先から最新版をダウンロードするか、以下のコマンドを実行。

```
$ cd ~/Downloads
$ curl -L -O https://github.com/thomascube/vcfconvert/archive/v0.8.9.zip
$ unzip v0.8.9.zip
```

2017年11月12日現在の最新版は0.8.9

# スクリプトの修正

変換にPHPスクリプトを使用しているのですが、vCardの連絡先が多いとエラーになるので使用するメモリー量を変更。

「vcfconvert.sh」の20行目あたりに以下の一文を追加。

```PHP:vcfconvert.sh
@ini_set('memory_limit', '512M');
```

# コマンドの実行

保存した連絡先のファイルを「source_file」という名前に変更し、ダウンロードした「vcfcontert-0.8.9」というフォルダに保存。

保存したら以下のコマンドを実行。

```
$ cd ~/Downloads/vcfconvert-0.8.9
$ ./vcfconvert.sh -hv -f csv -d ";" -o destination_file.csv source_file.vcf
```

実行後、「destination_file.csv」というファイルが生成される。

# Numbersで開く

Numbersで開き、CSV形式で保存。

# Excelへの取込

Excelを開き、新規ファイルを作成。
ファイルメニューから「インポート」を選択。
「CSVファイル」を選択して「インポート」をクリックし、ファイルを選択。
「テキストファイルウィザード」で、「区切り記号付き」、元のファイルは「Unicode (UTF-8)」を指定して「完了」をクリック。

できた！
OptionをResultにする

この記事は入門向けの記事になっています。

Rustが進化して行くに連れて、バージョン1以降になってからも変化がありました。個人的にその変化の一つが `?`オペレータの登場です。

```rust
fn foo() -> Result<(), String> {
    Err("error".to_owned())?;
    println!("no print");
    Ok(())
}
println!("{:?}", foo());
```

このオペレータは、try!マクロと同様の動きをします。Rustの多くのプログラマは、このオペレータが登場する前にtry!マクロを活用していました。これからは`?`が多く使われることでしょう。

他の言語では、`?` はOptionalとして扱われるケースが多いため、Rustの場合は例外時に`return`されることと、OptionではなくResultであることに注意が必要です。

## Option型は `?` が使えない
さて、ここで本題に入ります。Rustのcrateによっては、ResultではなくOptionで結果を返すライブラリも多くあります。Optionの場合は、`?` を使うことが出来ないため、Resultに変換する必要があります。

追記(2018/03/05) 使えるようになっています。

ここから先にいくつか悪い例を紹介し、最後に良い例を紹介します。

### matchで変換
```rust
fn foo() -> Result<(), String> {
    let opt: Option<String> = None;
    match opt {
        Some(s) => Ok(s),
        None => Err("error".to_owned())
    }?;
    println!("no print");
    Ok(())
}
println!("{:?}", foo());
```
型でマッチさせたあとにResultを作っています。ちょっと長いです。

### unwrap系(動かない)

```rust
fn test() {
    fn foo() -> Result<(), String> {
    let opt: Option<String> = None;
    opt.unwrap_or(Err("error".to_owned()))?;
    println!("no print");
    Ok(())
}
println!("{:?}", foo());
```

こちらは、 ```expected struct `std::string::String`, found enum `std::result::Result` ``` が発生し失敗します。
unwrap系は、成功した場合、`self` を返すため、型がどうしてもOptionになってしまいます。

### ok_or
```rust
fn foo() -> Result<(), String> {
    let opt: Option<String> = None;
    opt.ok_or("error".to_owned())?;
    println!("no print");
    Ok(())
}
println!("{:?}", foo());
```

Optionには、`ok_or<E>(self, err: E)` があり、`self` が `Option<T>` から `Result<T, E>` に変換されて返されます。OptionはErrを持っていないため、Resultに変換する際に引数をErrとして渡しているところがポイントです。

OptionをResultに変換する場合は、ok_or を使うとスッキリ書くことが出来ます。他にも、ファンクションが渡せる `ok_or_else ` があります。
CODE BLUE CTF 2017 guestroom write-up

http://ctf.codeblue.jp/

まだサーバーが動いていたので挑戦したら解けた。

ユーザー登録をして、ログインするだけのサイト。登録時に招待コードを入力できて、`ADMIN`のコードならば管理者として登録され、ログイン後にフラグを表示できる。変わったところとしては、GoogleのCAPTCHAと二段階認証が付いている。

解き方。

1. 適当なID、適当なパスワード、`GUEST--aaa（10万文字くらい）aaa`という招待コードを入力する。
2. サーバーが落ちる
3. ログインすると管理者になっている
4. 糸冬

![image.png](https://qiita-image-store.s3.amazonaws.com/0/25276/0e4f9ab8-bf68-f722-7437-02f29efb8dab.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/25276/230fba52-30c0-5697-7bcc-5a3033ffd5f8.png)

問題のプログラムは、テーブル`acl`に`GUEST`が登録されていればゲスト、それ以外は管理者という扱いになっている。

```app.php
    $sth = $app->pdo->prepare('INSERT INTO users (id, pw) VALUES (:id, :pw)');
    $sth->execute([':id' => $id, ':pw' => $pw]);

    preg_match('/\A(ADMIN|USER|GUEST)--((?:###|\w)+)\z/i', $code, $matches);
    if (count($matches) === 3 && $app->code[$matches[1]] === $matches[2]) {
        $sth = $app->pdo->prepare('INSERT INTO acl (id, authorize) VALUES (:id, :authorize)');
        $sth->execute([':id' => $id, ':authorize' => $matches[1]]);
    } else {
        $sth = $app->pdo->prepare('INSERT INTO acl (id, authorize) VALUES (:id, "GUEST")');
        $sth->execute([':id' => $id]);
    }
```

というコードなので、`preg_match`の部分で落ちると、管理者としてログインする条件を満たす。

「この問題はPHPのバージョンが古くね？」
「そういえば、『サーバーの設定が誤っていたため「guestroom」は解けない状態でした』というアナウンスがあったぞ。新しいバージョンで動いていた？」
「古いPHPの`preg_match`は長い文字列で落ちるらしいぞ」
「長い文字列を試してみたけど、落ちなかったわ」
「さすがにこんな解法はないよなw」

みたいな会話をコンテスト中にした覚えがある。もう少し色々試していれば……。ちなみに、先頭に`GUEST--`が無い単に長い文字列だと落ちなかった。

`CBCTF{pcR3_h45_b3En_rot73N_f0r_A_l0n6_7iM3:(}`
calabash-androidをインストールする

1.calabash-androidをインストールする
``gem install calabash-android``

2.Calabash-Androidのセットアップをする
``calabash-android setup``
Please enter keystore information to use a custom keystore instead of the default
Please enter keystore location
が表示されたらkeystoreの場所を入力する 
``/Users/non/nonAndroid201711/nonkapibara.keystore 
``
Please enter the password for the keystore
が表示されたらkeystoreのパスワードを入力する。

プロジェクトのルートに「.calabash_settings」というファイルが作成される
keystoreの情報を入力する
``{"keystore_location":"./●●●.keystore","keystore_password":"●●●●","keystore_alias":"●●●●●"}``


3.AndroidManifest.xmlがあるディレクトリに移動する
``cd /Users/non/nonAndroid201711/app/src/main``

4.genを実行する
``calabash-android gen``

以下のファイル群ができる。 
features/step_deﬁnitions/ 
features/support/ 
features/my_ﬁrst.feature 
irb_android.sh


5.Android開発フォルダにパスを通す
``vi ~/.bash_profile``
※隠しファイルになっている /Users/non/.bash_profile

``eval "$(rbenv init -)"
export ANDROID_HOME=/Users/non/Library/Android/sdk/platform-tools
export PATH=$PATH:/Users/non/Library/Android/sdk/tools
export PATH=$PATH:/Users/non/Library/Android/sdk/platform-tools
``
6.calabashを実行する
事前にAndroid Studioでデバッグモードでapkを作成する
``calabash-android run /Users/non/nonAndroid201711/app/app-debug.apk``

エラー内容詳細を出力するには``　-v``をつける

``calabash-android run /Users/non/nonAndroid201711/app/app-debug.apk -v``


１−１.Could not find tool ‘aapt’などのエラーが出た場合
``cd $ANDROID_HOME/platform-tools``
に移動する

１−２.Android StudioでSDKの場所を調べる
![スクリーンショット 2017-11-12 3.02.55.png](https://qiita-image-store.s3.amazonaws.com/0/93155/821cdd10-0e0e-fc09-94ea-b9617b11c758.png)
![スクリーンショット 2017-11-12 3.03.13.png](https://qiita-image-store.s3.amazonaws.com/0/93155/0b42bff4-0ff5-54bb-67c3-6cae3824506e.png)

１−３.シンボリックリンクを貼る
![スクリーンショット 2017-11-12 3.11.02.png](https://qiita-image-store.s3.amazonaws.com/0/93155/43ca4051-20ff-eec6-79f0-5739a1698c24.png)

``ln -s /Users/non/Library/Android/sdk/build-tools/22.0.1/aapt aapt``
``ln -s /Users/non/Library/Android/sdk/build-tools/22.0.1/lib lib``
``ln -s /Users/non/Library/Android/sdk/build-tools/22.0.1/aidl aidl``
``ln -s /Users/non/Library/Android/sdk/build-tools/22.0.1/zipalign zipalign``
``ln -s /Users/non/Library/Android/sdk/platforms platforms``

とすると
/Users/non/Library/Android/sdk/platform-tools
にシンボリックリンクが貼られる
![platform-tools.png](https://qiita-image-store.s3.amazonaws.com/0/93155/e0d03bd7-7b88-9d31-2c55-fe12ca06c9f7.png)
pyenv, pyenv-virtualenv開発環境の備忘録

- mac対象
- homebrew 導入済み

## 1.pyenv, pyenv-virtualenvをインストール
```
brew install pyenv
brew install pyenv-virtualenv
```

## 2.好きなversionをinstall
execute this cmd if you would like to know list python version which you can install thourgh pyenv

```
pyenv install -list
```
you specify version and set name , any name you want

```
pyenv install 'version'
pyenv virtualenv 'version' 'name'
pyenv activate 'name'
#sucessly you can see like following line
('name')user$
#confirme versions, virtualenv enviroments
pyenv versions
```

## 3.好きなライブラリをインストール
```
pip install freeze
pip install wheel
pip install numpy
pip install scilab
pip install matplotlib
pip install sockets
pip install requests
		.
		.
		.
```

## 1.5　※PATH通す(重要)
-忘れてたので追記-
PATH通さないと上記のことをやっても意味無いので...

公式のgithubを見ると'echo'コマンドで書いてるが直接.bash_profileに書いてもok
https://github.com/pyenv/pyenv

```
export PATH=/usr/local/bin:$PATH
export PYENV_ROOT=${HOME}/.pyenv
if [ -d "${PYENV_ROOT}" ]; then
        export PATH=${PYENV_ROOT}/bin:$PATH
        eval "$(pyenv init -)"
        eval "$(pyenv virtualenv-init -)"
fi
```
みたいなのを.bash_profileにvimとかviとか使って書いたり、公式通り

```
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bash_profile
echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bash_profile
echo -e 'if command -v pyenv 1>/dev/null 2>&1; then\n  eval "$(pyenv init -)"\nfi' >> ~/.bash_profile
```
を叩いてもいい

.bash_profileが無かったら（無いことは無い気がすごいするけど）

```
touch .bash_profile
```
とか叩けばできる

.bash_profileは隠しファイルなので

```
ls -a
```
とかで存在確認する

errorが出ることがたまにあるのでそういう時は公式を読むことをお勧めする。
https://github.com/pyenv/pyenv/wiki/Common-build-problems
過去の記事だと色々変わってたりするので...

一回陥ったerror（すぐ解決したけど）挙げとくと

```
xcode-select --install
```
をやり忘れてた。
新しいmacとかだと割と忘れてたりする気がする

## まとめ
他の記事とかで腐るほど紹介されてるけど、qiitaに記事上げるテストって感じで書いた。
あと筆者的にわかりやすい記事がなんか少ない感じがしたのも理由。
これからはwebパフォーマンスとか、PythonのWSGI関係,機械学習関係について上げていけたらと思っている。


## 参考
https://github.com/pyenv/pyenv
https://github.com/pyenv/pyenv-virtualenv
https://github.com/pyenv/pyenv/wiki/Common-build-problems
Androidの証明書を作成する


<font color="DeepPink">Androidの証明書を作成する</font>


<font color="DeepPink">★★★★という名前の証明書を作成。有効期限は10000日とする。</font>

``keytool -genkey -v -keystore ★★★★.keystore -alias ★★★★ -keyalg RSA -validity 10000``
Rails 4.2.3 のインストール




1.Xcodeをインストールする
2.Command Line Tools をインストールする
``xcode-select --install
``
3.Homebrewをインストールする
``ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
``
4.MacPortsでインストールしている「Ruby」をアンインストールする
``sudo port uninstall ruby``

5.「RVM」をアンイストールする
``rvm implode``

6.「rbenv」と「ruby-build」をインストールする
``brew link autoconf
brew install rbenv ruby-build
echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
source ~/.bash_profile
``
7.Ruby　2.2.2をインストールする
``rbenv install 2.2.2
rbenv global 2.2.2
``
8.rubyのバージョンを確認する
``ruby -v
``
9.gemrcを作成する
``vi ~/.gemrc
``
テキストエディタで``i``でINSERTモードにする
``install: --no-ri --no-rdoc
update: --no-ri --no-rdoc
``を書き込む。
``:wq``
で保存する

10.Bundlerをインストールする（gemがホームディレクトリに入る)
``gem install bundler``

11.Bundler のバージョンを確認する
``bundle -v``

12.ワークディレクトリを作成して移動する（作業ディレクトリに入れる）
``cd work/ruby_test/
``

13.Gemfileを編集する
``vi Gemfile
``
テキストエディタで``i``でINSERTモードにする
``source 'http://rubygems.org'
gem 'rails', '4.2.3'
``を書き込む。
``:wq``
で保存する
※Gemfileの先頭に、インストール元はhttp://rubygems.orgと宣言する
続けてインストールしたいgemを記述する。バージョンの指定4.2.3を記述する。

14.Rails 4.2.3 のインストール
Gemfileにリスト化したgemを一括インストールする。
``bundle install --path=vendor/bundle``

15.ターミナルで Ruby on Rails のバージョンを確認する。
``bundle exec rails -v``
を打つと「Rails 4.2.3」と出ること

16.ワークディレクトリに移動する　
``cd work/ruby_test/``

17.Railsプロジェクトを作成する　
``bundle exec rails new .``
でカレントディレクトリにRailsプロジェクトを作成

18.Gemfileを上書きしますか？と聞かれるので
``Y
``を入力する。
Overwrite /Users/non/work/ruby_test/Gemfile? (enter "h" for help) [Ynaqdh] ``Y``

19.Railsを起動する
``bundle exec rails c``
または
``bundle exec rails console``

Running via Spring preloader in process 45717
Loading development environment (Rails 4.2.3)
と表示される
Fortran で zip 的連結

#zip 
二つの数列 (a1,a2,...), (b1,b2,...) があって、これを (a1, b1), (a2, b2),... の形にまとめ直す処理を、近年 zip 関数と名づけることが多いようです。

Fortran には、そのような関数などはありませんが、たまに使いたくなる時があります。時々組み込み関数だけで出来ないかと考えていましたが、ふと、その昔 APL では行列の転置で同じ事をやっていたのを思い出しました。
　
ここでは、アイデア丸パクリで transpose & reshape 関数で試してみることにします。（一つの配列にまとめるので、型が一緒じゃないとできませんが。）

##実行結果
ある整数 N に対して、N 以下で N と互いに疎な正整数の数を数える Euler のファイ関数を計算します。素数 p に対しては p-1 となります。ここでは定義に従って、互いに疎な数を力づくで求めています。

```
    1    1
    2    1
    3    2
    4    2
    5    4
    6    2
    7    6
    8    4
    9    6
   10    4
   11   10
   12    4
   13   12
   14    6
   15    8
   16    8
   17   16
   18    6
   19   18
   20    8
```

##ソースプログラム
ここで [1:20] というのは Intel Fortran の独自拡張で [1,2,...,20] という配列を構成します。[(i, i = 1, 20)] と同じ意味です。 

インデックスと配列の値を、並べて縦書きにするときに、DO..LOOP が必要なく、DO 変数も要らなくなってます。（ただし非標準な Intel 拡張使ってますがｗ）

```fortran
    module m_mod
      implicit none
    contains  
      pure elemental integer function igcd(ia, ib)
        integer, value :: ia, ib
        igcd = ia
        do 
          if (ib == 0) exit
          ia = ib
          ib = mod(igcd, ib)
          igcd = ia
        end do    
      end function igcd  
      
      impure elemental integer function ieuler_phi(n) ! F2008 impure
        integer, intent(in) :: n
        integer :: i, m(n)                            ! F2008?
        m = [(i, i = 1, n)]
        ieuler_phi = count(igcd(n, m) == 1)
      end function ieuler_phi       
    end module m_mod
    
    program zip
      use m_mod
      implicit none
      print '((2i5))', transpose(reshape([[1:20], ieuler_phi([1:20])], [20, 2])) ! [1:20] non-standard ! [(i,i=1,20)]
    end program zip
```
Railsを本気で学ぶぞ。まずやり始めたことから注意書きまで。

Udemyの[こちらのコース](https://www.google.de/url?sa=t&rct=j&q=&esrc=s&source=web&cd=2&cad=rja&uact=8&ved=0ahUKEwjBu4a35bfXAhXQ16QKHfxQCvIQFggyMAE&url=https%3A%2F%2Fwww.udemy.com%2Fruby-on-rails-g%2F&usg=AOvVaw2zf_7hwBdtTsJHjjVy_0-6)を受けながら、疑問に思ったこと、調べた結果、大事なことをまとめていきます。

動画を見ながら、同じように進め、そのあとに別の名前で同じものを作り確認としてやる。

## バージョンは、5.0系のままで。

以前も勉強していたので、すでにRubyはインストール済み。5.1系にアップデートしようとしたが安定感が保証されていないとのことなので、やめ。

早速rails new でrailsアプリケーションを作成。この時が一番ワクワクするね。

    rails new frist_app


firstの綴りを間違えたのは気にしない。

|ファイル/ディレクトリ|目的|
|:----------|----------:|
|app/	    |モデル、ビュー、コントローラ、ヘルパーなどを含む主要なアプリケーションコード|
|app/assets	|アプリケーションで使用するCSS (Cascading Style Sheet)、JavaScriptファイル、画像などのアセット|
|config/	|アプリケーションの設定
|db/	|データベース関連のファイル
|doc/	|マニュアルなど、アプリケーションのドキュメント
|lib/	|ライブラリモジュール
|lib/assets	|ライブラリで使用するCSS (Cascading Style Sheet)、JavaScriptファイル、画像など¥のアセット|
|log/	|アプリケーションのログファイル|
|public/	|エラーページなど、一般(Webブラウザなど)に直接公開するデータ|
|script/rails	|コード生成、コンソールの起動、ローカルのWebサーバの立ち上げなどに使用するRailsスクリプト|
|test/	|アプリケーションのテスト(3.1.2で作成するspec/ディレクトリがあるため、現在は使用されていません)|
|tmp/	|一時ファイル|
|vendor/	|サードパーティのプラグインやgemなど|
|vendor/assets	|サードパーティのプラグインやgemで使用するCSS (Cascading Style Sheet)、JavaScriptファイル、画像などのアセット|
|README.rdoc	|アプリケーションの簡単な説明|
|Rakefile	|rakeコマンドで使用可能なタスク|
|Gemfile	|このアプリケーションに必要なGemの定義ファイル|
|Gemfile.lock	|アプリケーションのすべてのコピーが同じgemのバージョンを使用していることを確認するために使用されるgemのリスト|
|config.ru	|Rackミドルウェア用の設定ファイル|
|.gitignore	|Gitに無視させたいファイルを指定するためのパターン|
    表1.1: デフォルトのRailsフォルダ構造まとめ。
参照　https://railstutorial.jp/chapters/beginning?version=3.2


'subl Gemfile'

とすると、sublimeで指定したファイルが開く。便利。

gemfileを変更したら、馴染みのこのコード・

    $ bundle update
    $ bundle install

##railsを起動させる。

    rails s
で。

##Gitの設定

    git init ＃レポジトリセットアップ
    git add .　＃Gitに追加 
    git commit -m 'Initail commit' #変更を知らせる。
    git status #状況確認
5才と子供用PCとかな入力アプリでScratch

# はじめに

息子は5歳になります。やはりスマホで遊ぶのが好きで、何かと触りたがって困ります。

* バッテリー残量が減る。気付くと残量が12%とかになっていて困る。
* 寝ころんで遊ぶ。行儀が悪い。画面も目に近い。
* なかなか手放そうとしない。タイマーをセットさせるが、鳴っても無視している。

そこで、息子用のPCを用意する事にしました。せっかくなのでScratchでも触ってほしいので、それに合った環境を整備しました。

結論からいうと、

* スマホを使用していた時間はそのままPCの使用時間に変わりました。
* 使用時間制限アプリでPC使用時間は一日90分。強制的にログアウトするので時間を守れる。
* 寝ころんで遊ぶ事など出来はしない。
* 主にScratchで遊んでいます。文字入力をサポートするアプリ(後述)を使うことで、一人でも遊べるようになりました。

## PC

Lenovo ThinkPad X121e を中古で購入。

|Device|Spec|
|:-:|:-:|
|CPU|Corei3 2367M|
|Memory|2GB|
|HDD|SATA 320GB|

メモリの2Gがちょっと不安でしたが、以下の環境で使用している限りは概ね問題無しでした。1万円。

## OS

[Lubuntu](http://lubuntu.me/)を入れました。

## アプリケーション

いまのところ、ブラウザで見るのはScratchのサイトのみで、他のWebサイトを見たりはしていないのでWebフィルタリングはしてません。主に使っている有用なアプリは以下の4つだけ。

### Google chrome

Scratchが快適に動作するブラウザということでGoogle Chromeを入れます。自分が試した限りでは最も高速で、プラグインの追加等をしなくてもFlashが動作するので楽です。

### VNC Server

ログイン時にVNCサーバを起動するようにしています。子供がPCを使用している間、別のPCやスマホで子供PCの画面をリアルタイムに監視する事ができます。Scratchで操作がわからない場合など、遠隔でサポート出来ます。あるいは無闇に音がうるさいScratch作品を遊んでいる時にこっそり操作して音量を絞ったりしたりして。

### Timekpr

https://launchpad.net/timekpr

ユーザ毎に使用時間を制限できます。曜日毎に使用可能時間と時間帯を設定できて便利。うちでは一日90分、9:00から20:00までの間のみ使用可能としています。実際に使っている時間帯は幼稚園から帰ってきてからの15:00〜17:00か、夕食後の19:00〜20:00。今日だけ制限時間帯でも使えるようにするとか、任意の使用可能時間を追加するとかも出来るので便利。

### GCompris

http://www.gcompris.net/

2歳から10歳の子供向けミニゲームやツールがたくさん入った教育向けアプリケーション。Scratchに飽きるとこっちのミニゲームで遊んでいる。日本語化が完全でなく、ゲーム内の表示が英語だったりするので、ゲームの説明文を代わりに読んでと、いちいち呼ばれる事になる。


# Scratchと日本語入力の問題

スマホの代りにPCで遊んでくれるようにはなりました。特にScratchにはまっているのですが、そうなると一つ問題が出てきました。

Scratchは制御文や命令文のブロックをドラッグ&ドロップして繋げるだけでプログラミングができますが、パラメータを指定したり、スプライトにメッセージを言わせるにはどうしてもキーボードを使う必要があります。

![scratch.png](https://qiita-image-store.s3.amazonaws.com/0/123579/10e7bfc7-77d4-4ae5-8207-ee556a6df07c.png)
こんなかんじ。

数字ぐらいであればキーボードで入力できるのですが、日本語で「ありがとう!」等は入力出来ません。IMEのモード切り替え操作が必要になるし、ローマ字入力は出来ないので、かな入力になりますが、そうすると小文字はShift入力が必要になったりして、より複雑になります。

Scratchで遊んでくれるのは良いのですが、日本語を入力したいとなると、その度「ここに"ホゲホゲ"って入れて」と頼まれるのは面倒です。

どうしたもんかなと思っていましたが、Python + Kivy でGUIアプリが作れるという事だったので、かな文字入力アプリを作ってみる事にしました。

## かなカナ入力アプリ

直接ブラウザ側へ文字を出力させるものは難しそうなので、ソフトウェアキーボードで入力した文字をクリップボードにコピーするというものにしました。以下のような感じで動作&使用します。

![demo.gif](https://qiita-image-store.s3.amazonaws.com/0/123579/cd9d96a4-bd80-5edc-6101-029676aa25f6.gif)

コードは拙いですが、以下を参照下さい。
https://github.com/masushin/kanakana_keypad


ひらがなとカタカナさえ入力出来れば、今のところ十分だと思うので漢字は入力出来ません。

ランチャーに登録しておいて、アイコンのクリックで起動出来るようにしておきます。

「文字を全部入れたら、"コピー"を押して、文字を入れたいところをクリックしてから、Ctrl+Vを押してね」と教えています。

これで、Scratchを一人で作って遊ぶようになりました。
Googleスプレッドシートで=から始まるセルを関数ではなく文字列として扱う方法

# T関数を使う
` =T("=LOVE") ` → =LOVE
` =T("""") ` → " 

以上。
わかりやすくするためにこういうタイトルにしたけれど、厳密には「文字列を文字列として扱う方法」ですね

# 参考ページ
[T - ドキュメントエディタヘルプ](https://support.google.com/docs/answer/3094138)
イングレスのミッションデーの日程を早目に知る方法

#はじめに
イングレスというゲームはアノマリーとかミッションデーとかに行こうとすると結構旅費がかかります。
旅費は早目に申し込んだほうが安く済むケースも多いですよね。
基本的には https://ingress.com/events を確認すればよいことですが、ちょっと自動化っぽくしたいと思いまして。。。

#やってみたこと
Python3 + BeautifulSoup4 + Selenium + headless Chrome です。
[ChromeDriver](https://sites.google.com/a/chromium.org/chromedriver/downloads)をインストールすることをお忘れなく。

```ingress-md.py
#!/usr/bin/env python3
# -*- coding: utf-8 -*-

from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.chrome.options import Options
from bs4 import BeautifulSoup

options = Options()
options.add_argument('--headless')
options.add_argument('--disable-gpu')
driver = webdriver.Chrome(chrome_options=options)

driver.get("https://ingress.com/events")
data = driver.page_source.encode('utf-8')

wait = WebDriverWait(driver, 1)
soup = BeautifulSoup(data,'lxml')

tables = soup.findAll("table")[2]

for table in tables:
  for tr in table.findAll('tr'):
     date = tr.find('td')
     a = tr.find('a')
     print("%s %s" % (date.text, a.attrs['href']))
```
上記スクリプトを実行すると、次のような内容が出力されます。

```
18-Nov-2017 http://events.ingress.com/MissionDay/kiel
18-Nov-2017 http://events.ingress.com/MissionDay/SantoDomingo
18-Nov-2017 http://events.ingress.com/MissionDay/Tulsa2017
19-Nov-2017 http://events.ingress.com/MissionDay/Dordrecht
25-Nov-2017 http://events.ingress.com/MissionDay/palermo
25-Nov-2017 http://events.ingress.com/MissionDay/Fuzhou
03-Dec-2017 https://splashthat.com/sites/view/missiondayhamamatsu.splashthat.com
03-Dec-2017 http://events.ingress.com/MissionDay/Perth
03-Dec-2017 http://events.ingress.com/MissionDay/TaipeiSehke
03-Dec-2017 http://events.ingress.com/MissionDay/Bruges
03-Dec-2017 http://events.ingress.com/MissionDay/Honolulu
03-Dec-2017 http://events.ingress.com/MissionDay/madrid
03-Dec-2017 http://events.ingress.com/MissionDay/SanFrancisco2017
03-Dec-2017 http://events.ingress.com/MissionDay/EXO5Tallinn
09-Dec-2017 http://events.ingress.com/MissionDay/Aveiro
09-Dec-2017 http://events.ingress.com/MissionDay/Montevideo
16-Dec-2017 http://events.ingress.com/MissionDay/BangkokSongsOfTheKing
16-Dec-2017 http://events.ingress.com/MissionDay/Chongqing
16-Dec-2017 http://events.ingress.com/MissionDay/NYC2017
13-Jan-2018 http://events.ingress.com/MissionDay/SantaCruzdelaSierra2018
13-Jan-2018 http://events.ingress.com/MissionDay/Guadalajara2018
```


ミッションデーではなくて、NL-1331の日程を知りたい場合は、

```
tables = soup.findAll("table")[1]
```
GORUCKの日程を知りたい場合は、

```
tables = soup.findAll("table")[3]
```

Operation Clear Fieldの日程を知りたい場合は、

```
tables = soup.findAll("table")[4]
```


コミュニティイベントの日程を知りたい場合は、

```
tables = soup.findAll("table")[5]
```

ファーストサタデーの日程を知りたい場合は、

```
tables = soup.findAll("table")[6]
```

としてください。

たとえば、cronで1日1回動かして、その結果をメールとかtelegramとかに流すとかするとよいかも!?

#今後のこと
特にないです。

#参考
・[Python3 + urllib + BeautifulSoupでネット上の情報を取得する](https://qiita.com/piruty/items/d360f436d1b57cc9c980)
新Python生活一日目(振返り)【PyQ/2,3,4章】

#表示
書式

```py3
print('文字列') #文字列を表示する
```

例

```py3
print('Hello ' + 'World') #Hello World
```
#計算
■変数を使用した計算

```py3
stock = 12 #stockって名前の変数に12を代入
delivery = 20 #deliveryって変数に20を代入
new_stock = stock + delivery #32 #new_stockって変数はstock変数とdeliveryの合算
print('今の在庫は' + str(new_stock) + '本') #今の在庫は32本
```

※strは文字列に変換する

#if文
■比較演算

```py3
if stock < 10:
    print('在庫は10本より少ない') #条件①：stock変数が10以下の時にこの表示出す
elif stock == 10:
    print('在庫は10本') #条件②：stock変数が10の時にこの表示出す
else:
    print('在庫は10本より多い') #条件③：それ以外の時にこの表示出す
```

#list、for文
■ループの利用
for 変数 in リスト
※リストの要素を1つずつ変数に代入しながら、forの下に実行する

```py3
week = ['月', '火', '水', '木', '金'] #リスト名week
```

```py3
for day in week:
    print(day)
```

```text:出力結果
月
火
水
木
金
```

■リストへ値の追加

```py3
変数.append('追加要素') #末尾に追加
変数.insert(位置.追加要素) #位置は0始まり
```

■リスト値の削除

```py3
変数.pop() #末尾を削除
変数.pop(n) #末尾からn番目を削除。始まりは0
```

■リストの要素の変更

```py3
リスト名[0] = 120 #1番目の要素を120に変更
リスト名[-1] = 50 #末尾の要素を50に変更
リスト名[-2] = 5 #後ろから2番目の要素を5に変更
```
【環境構築】Electron


MacにElectron(エレクトロン)の動作環境を構築する。

# node.jsのインストール

Electronを動作するにはnode.jsが必要なのでインストールする。
下記のページから最新安定版をダウンロード
https://nodejs.org/en/
<img width="791" alt="Node_js.png" src="https://qiita-image-store.s3.amazonaws.com/0/59081/a78b61b0-88ba-2dec-a4ef-b4c938bad633.png">

node.jsをインストールするとnpmコマンドが利用できるようになる。

# Electronのインストール

```bash
# Electronインストール
npm install electron -g

# 下記のようなエラーがでる場合、アクセス権を付与してからインストールする
npm WARN checkPermissions Missing write access to /usr/local/lib/node_modules
# アクセス権付与
sudo chmod -R 777 /usr/local/lib/node_modules
```

以上。
今日学んだことを書く（renameコマンドによるファイル名変換）

ログなど日付因子を付加して記録していくことが多々ありますが
後々それらをまとめるため日付因子を取り除きたいことがあります。
mvコマンドでもよいのですもうちょっと簡単に書きたい時にどうしたらよいか
探していたらrenameコマンドがよさ気だったので自身の備忘録も兼ねて書きます。

# rename

       rename - renames multiple files
>
SYNOPSIS
       rename [ -h|-m|-V ] [ -v ] [ -n ] [ -f ] [ -e|-E perlexpr]*|perlexpr
       [ files ]
>
DESCRIPTION
       "rename" renames the filenames supplied according to the rule specified
       as the first argument.  The perlexpr argument is a Perl expression
       which is expected to modify the $_ string in Perl for at least some of
       the filenames specified.  If a given filename is not modified by the
       expression, it will not be renamed.  If no filenames are given on the
       command line, filenames will be read via standard input.
>
       For example, to rename all files matching "*.bak" to strip the
       extension, you might say
>
               rename 's/\e.bak$//' *.bak
>
       To translate uppercase names to lower, you'd use
>
               rename 'y/A-Z/a-z/' *
>


どうやら正規表現が使えるということなのでやってみる。
ファイル名から日付因子部分を消してみます（正規表現を使って）

~~~Bash
$touch aaaaaaaaaaaa_20171111.txt

$ls -l $_
aaaaaaaaaaaa_20171111.txt

$rename -v 's/(^.*)(_[0-9]{8})(.txt$)/$1$3/' aaaaaaaaaaaa_20171111.txt
aaaaaaaaaaaa_20171111.txt renamed as aaaaaaaaaaaa.txt
~~~

うまく行きました。
ここまでわかればあとは入力ファイルをまとめて（*などつかって）
一括変換すれば良さそうですね。
Java Propertyファイル読み込み

今回はJavaのPropertyファイルの読みこみ方法について紹介します。

#Propertyファイルとは
Propertyファイルとは、キーと値が対になったデータを保存しているファイルです。Windowsのiniファイルとかと同じです。
プログラムの設定値などを保存しておくファイルとして使用します。
Propertyファイルに記述しておくと、コンパイルなしでプログラムの動作を変更できるので後で変わる可能性のある値とか設定すると良いと思います。
例えば、ユーザID、パスワードとか。

#フォーマット
記述フォーマットは、キーと値を「=(イコール)」でつないで記述します。
具体的には以下のような感じです。

```
キー=値
```

また、行頭に記述された「#(シャープ)」より後ろはコメントを表します。

```
#この行はコメントです。
キー1=値
キー2=値#
キー3#=値
```

この場合、「キー2」に対応する値は、「値#」になります。また、「キー3#」に対応する値は「値」になります。

#Propertyファイルを読み込む
Propertyファイルを読み込むためには、java.util.Propertiesを使用します。
実際のプログラムを見るほうが早いと思うので具体例を記述してみます。

```java
public class PropertyUtil {

    private static final String INIT_FILE_PATH = "resourse/common.properties";
    private static final Properties properties;

    private PropertyUtil() throws Exception {
    }

    static {
        properties = new Properties();
        try {
            properties.load(Files.newBufferedReader(Paths.get(INIT_FILE_PATH), StandardCharsets.UTF_8));
        } catch (IOException e) {
            // ファイル読み込みに失敗
            System.out.println(String.format("ファイルの読み込みに失敗しました。ファイル名:%s", INIT_FILE_PATH));
        }
    }

    /**
     * プロパティ値を取得する
     *
     * @param key キー
     * @return 値
     */
    public static String getProperty(final String key) {
        return getProperty(key, "");
    }

    /**
     * プロパティ値を取得する
     *
     * @param key キー
     * @param defaultValue デフォルト値
     * @return キーが存在しない場合、デフォルト値
     *          存在する場合、値
     */
    public static String getProperty(final String key, final String defaultValue) {
        return properties.getProperty(key, defaultValue);
    }
```

Propertyファイルを読み込むのに、Propertiesのload関数を使用します。
loadは、Readerを引数に受け取りますので、Propertyファイルを読み込んだReaderを使用してください。
読み込んだPropertyファイルの値は、キーを指定してgetProperty関数で取得できます。
では、使用例を記述してみます。

```:common.properties
test=テスト値
```

```java

    public static void main(String[] args) {
        System.out.println(PropertyUtil.getProperty("test")); // ⇒ テスト値
    }
```

このようにキーを指定するとそれに対応する値を取得できます。

以上です。
__invoke()の小さなサンプル

# コード
```php:test.php
<?php

class Test{
        public function show($param){
                echo "test: ".$param.PHP_EOL;
        }
}

$test = new Test();
array_map(array($test, "show"), array(1,2,3));


class Test2{
        public function show($param){
                echo "test: ".$param.PHP_EOL;
        }

        public function show2($param){
                        echo "test2: ".$param.PHP_EOL;
        }

        //ここで->show2を指定したらそっちが呼ばれる
        public function __invoke($param){
                return $this->show($param);
        }
}

$test2 = new Test2();
array_map($test2, array(4,5,6));
```

# 実行

```
test: 1
test: 2
test: 3
test: 4
test: 5
test: 6
```
What should we know about PFDS

This slide was wrote for in-house presentation which named `FFLT`

---

# What is PFDS

---

# Purely Functional Data Structure

---

# Purely Functional Data Structure? 

* Data structure without destructive assignment
* Achieve the same efficiency as well as imperative data structure
* Computational complexity with lazy evaluation
* Sample codes are written by Standard ML and (almost) Haskell

---

# Sample code (LinkedList)

We assume interface like this

```OCaml
type t =
  | Null
  | Cons of { element: int; tail: t; }

val empty: t

(* cons 1 [2] -> [1, 2] *)
val cons: int -> t -> t

(* concat [1, 2] [3, 4] -> [1, 2, 3, 4] *)
val concat: t -> t -> t
```

---

# Imperative way O(1)

```javascript
// JavaScript
const empty = null;
const cons = element => next => ({ element, next, _tail: next === empty ? empty : next.next })
const concat = xs => ys => {
  if (xs === empty) return ys
  xs._tail.next = ys
  xs._tail = ys._tail
  return xs
}

const list_a = cons(1)(cons(2)(cons(3)(empty)))
const list_b = cons(4)(cons(5)(cons(6)(empty)))

console.log(list_a); // [1, 2, 3]
console.log(list_b); // [4, 5, 6]

console.log(require("util").inspect(
  concat(list_a)(list_b),  // [1, 2, 3, 4, 5, 6]
  { showHidden: true, depth: null }
));

console.log(list_a); // A careful audience might take notice that we already can't use the first list normally because `concat` function destroyed its held reference
```

---

# Functional way O(n)

```javascript
// JavaScript
const empty = null;
const cons = element => next => ({ element, next })
const concat = xs => ys => (xs === empty) ?
  ys :
  cons(xs.element)(concat(xs.next)(ys))

const list_a = cons(1)(cons(2)(cons(3)(empty)))
const list_b = cons(4)(cons(5)(cons(6)(empty)))

console.log(list_a); // [1, 2, 3]
console.log(list_b); // [4, 5, 6]

console.log(require("util").inspect(
  concat(list_a)(list_b),  // [1, 2, 3, 4, 5, 6]
  { showHidden: true, depth: null }
));

console.log(list_a); 
console.log(list_b);
// We can use both list normally, On the other words we can use it persistently
```

---

# We can start immediately, Now!

* [English](https://www.amazon.com/Purely-Functional-Structures-Chris-Okasaki/dp/0521663504)
* [Japanese](https://tatsu-zine.com/books/purely-functional-data-structures)
* [Solve exercise written by Rust](https://github.com/kogai/pfds/)
call_user_funcの小さなサンプル

# コード

```
<?php

function test(){
        echo "func test".PHP_EOL;
}

class TestClass{
        public function __construct(){
                echo "TEST".PHP_EOL;
        }
        public function test(){
                echo "test".PHP_EOL;
        }
}

call_user_func("test");

$testClass = new TestClass();
call_user_func(array($testClass, "test"));

call_user_func(function(){ echo "no name".PHP_EOL; });
```

# 実行

```
func test
TEST
test
no name
```
Swift 4で@objcに関するwarningが出たときの対処

# warningの内容
Swift3プロジェクトをSwift4へマイグレーションさせた際に、以下のようなwarningが出る場合があります。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/113553/886130cc-7b8a-803c-5f2c-923505dbc370.png)

> The use of Swift 3 @objc inference in Swift 4 mode is deprecated. Please address deprecated @objc inference warnings, test your code with “Use of deprecated Swift 3 @objc inference” logging enabled, and then disable inference by changing the "Swift 3 @objc Inference" build setting to "Default" for the "ターゲット名" target.

# warningの説明

まず、Swift４の`@objc`についてはこちらの記事で説明しています。
[Qiita | attributeまとめ[Swift4対応]](https://qiita.com/shtnkgm/items/a793f26445f2b8390bee)

Swift3では`@objc`が明示的に付与されてない定義にも`@objc`が暗黙的に推論され、付与されていました。Swift4では**Swift3での`@objc`推論が非推奨となったため、設定を見直したほうが良い**という警告です。この警告がでている際は、Swift3の`@objc`互換モードでビルドされるため、非推奨の`@objc`推論は有効になっています。

# 対応方法
TargetのBuild Settings設定の中に、`Swift3 @objc Infence`という項目があるので、これを**Defaultに変更**します。

| `Swift3 @objc Infence`の設定値 | 説明 | 
|:------------|:--------|
|Default|Swift4でのデフォルト値（`@objc`推論が無効）|
|On|Swift3での`@objc`推論を有効にする（非推奨）|
|Off|Swift3での`@objc`推論を無効にする|
（DefaultとOffは何が違うのだろう...🤔）

![image.png](https://qiita-image-store.s3.amazonaws.com/0/113553/79387676-843d-0686-cebb-375fef941bd8.png)

なお、`@objc`推論が利用されているエントリポイントをログ出力により調べる場合には、以下の記事が参考となります。
[The use of Swift 3 @objc inference in Swift 4 mode is deprecated?](https://stackoverflow.com/questions/44379348/the-use-of-swift-3-objc-inference-in-swift-4-mode-is-deprecated)

> SWIFT_DEBUG_IMPLICIT_OBJC_ENTRYPOINT environmental variable to values from 1 to 3 to see the usages of the Objective-C entry points in the logs.
Elasticsearch(v5)を使うにあたっての神記事まとめ


Elasticesearchについて何も知らない状態で最新のバージョン5.6を使い出そうとする人向け。

# 公式ドキュメント

最新版は[ここ](https://www.elastic.co/guide/en/elasticsearch/reference/current/index.html)。
2017/11/11現在はバージョン5.6。

# チュートリアル・基礎知識系

## [はじめての Elasticsearch](https://qiita.com/nskydiving/items/1c2dc4e0b9c98d164329)

インストールや基本的なREST API操作についての素晴らしいまとめ。
初日はこれを読まずに、curlでAPIを叩いてSAN値の急激な低下により挫折した...

**とにかくElasticsearchだけじゃなくて、Kibanaも一緒にインストールしてDev Tool画面からAPIを叩いてみるのが初心者ルートだ！**

## [Elasticsearch 日本語全文検索](https://www.qoosky.io/techs/d6d03d0e9c)

日本語のデータをつかった簡単なサンプルが紹介されている。
`Mapping`と`Analyzer`という概念が重要なことに気づく。
フィールドごとにAnalyzerを変えるという使い方が通常のようだ。


## [知識ゼロからElasticsearchを実践で使えるようになろう！](http://blog.shibayu36.org/entry/2016/09/05/110000)

Elasticesearchを使って、どうやって実際の検索用データを設計していくかを教えてくれる神記事。

特に、[Elasticsearchのインデックス定義を設計する手順](http://blog.shibayu36.org/entry/2016/08/31/110000) を繰り返し参照することになりそう。

##[Elasticsearchチュートリアル](http://code46.hatenablog.com/entry/2014/01/21/115620)

レストラン検索という例を使って、スキーマ設計から現実的な検索クエリまで説明してくれている。
検索結果の並び替えの自由度がすごいことに気づく。

## [Elasticsearch 5.xの新機能と、1.xから5.xへのアップグレード](http://soymsk.hatenablog.com/entry/2016/12/11/020850)

ネットで見つかる日本語のElasticsearch情報はバージョンが2系以下のものが多いので、この記事と照らし合わせながら、今での使えるのかどうかを確認する必要がある。

* 設定ファイルに `index.***` が書けなくなったこと
* `string`型が廃止されたこと
    * `text`と`keyword`になった。前者はanalyzeされるが、後者はされないので後者は完全一致検索用に使える。

などに引っかかった。

## [Elasticsearch インデックス・エイリアス](https://medium.com/hello-elasticsearch/elasticsearch-c8c9c711f40)

本番環境でElasticsearchを使う場合、インデックス・エイリアスの利用は必須になることを丁寧に説明してくれている記事。

# より高度な日本語検索向けの設定

## [Elasticsearchで日本語全文検索をするときの最低限の設定(形態素解析のみ)](https://qiita.com/kouyaf77@github/items/7d22f224e82520514ec7#_reference-d640792d2b29b2caee17)

##[Elasticsearch 日本語形態素解析のための文字列正規化の重要性](https://medium.com/hello-elasticsearch/elasticsearch-c98fd9ce6a18)

日本語検索にはKuromoji analyzerで、で終わってはいけないこと。
`ICU Normalization CharFilter`が有効そう。


# サジェスト検索について

##[日本語でのサジェストの難しさとElasticsearchを用いた実装例 ](http://techblog.housmart.co.jp/2016/12/16/suggester-for-japanese/)

##[Elasticsearch キーワードサジェスト日本語のための設計](https://medium.com/hello-elasticsearch/elasticsearch-キーワードサジェスト日本語のための設計-352a230030dd)

# Solrからの移行

## [Common Solr Queries in Elasticsearch Query DSL](http://www.elasticsearchtutorial.com/common-solr-queries-in-elasticsearch.html)
可変関数の小さなサンプル

# コード

```php:test.php
<?php

function test1(){
        echo "test1".PHP_EOL;
}

function test2(){
        echo "test2".PHP_EOL;
}

$func = "test1";
$func();
$func = "test2";
$func();
```

# 結果

```
$ php test.php
test1
test2
```
Angularで履歴を変えずにブラウザのURLを置き換える

  例えば、トークンなどをURLのパラメータから取得するようなケースで、トークンを取得後、ブラウザのアドレスバーに表示されているパラメータの部分を削除したい。

これを↓

```
https://example.com/foo?token=n8ml2n4pabgsa
```

こうしたい↓

```
https://example.com/foo
```

## Location#replaceStateを使う

- **[Angular - Location](https://angular.io/api/common/Location)**

`Location`は、アプリケーションがブラウザのURLとやりとりできるようにするためのAngularのservice。この`Location`クラスの`replaceState`メソッドを使うと、今回のテーマでもあるブラウザのURLの置き換えができる。

```ts
replaceState(path: string, query: string = ''): void
```

`replaceState`メソッドは、ブラウザのURLを、与えられたURLに正規化しながら変更し、プラットフォームの履歴スタックの一番上のものと置き換えてくれる。つまり、履歴を変えずにブラウザのURLを置き換えることを可能にしてくれる。

### 実装例

Locationモジュールの読み込み

```ts
import { Location, LocationStrategy, PathLocationStrategy } from '@angular/common';
```

`@Module`や`@Component`の`providers`に登録

```ts
providers: [
  Location,
  { provide: LocationStrategy, useClass: PathLocationStrategy } // <= これはなくても良い
], 
```

Componentに実装（コンポーネントが生成された際にURLを置き換える場合）

```ts
import { Component, OnInit } from '@angular/core';
import { Location } from '@angular/common';

@Component({

...

})
export class Foo implements OnInit {
  constructor(
    private location: Location,
  ) { }

  ngOnInit() {
    this.location.replaceState('foo');
  }
}
```

これで例えば`https://example.com/foo?token=n8ml2n4pabgsa`だったURLが`https://example.com/foo`に置き換えられる。

なお、`replaceState`の第二引数には、クエリが設定可能。

```ts
this.location.replaceState('foo', 'bar=baz');
```
上記のようにクエリを設定すると、`https://example.com/foo?bar=baz`に置き換えられる。

### 参考

https://angular.io/api/common/Location

## [補足] Angularじゃない場合

ちなみに、Angularアプリ以外のところでは、HTML5で導入された`history.replaceState()`を使うと同様のことが実現できる。

```js
history.replaceState(data, title, url); 
```

### 参考

https://msdn.microsoft.com/ja-jp/library/hh920758(v=vs.85).aspx
ShaderForge 上で独自に環境マップを得て IBL を行う

# 追記
　本記事の手法は Skybox 画像の取得に限る。Scene の Environment Lighting の設定を反映させるのであれば、以下の記事のコードを `Code` ノードに記述して環境光を取得した方が良い。

https://qiita.com/Santarh/items/0f0980564b53de6e9797

# 要旨
　ShaderForge はシェーダを構築する上でイテレーション速度を上げることができる非常に重要なツールだ。しかしデフォルトで用意されている `Blinn-Phong` や `PBL` ライティングを逸脱する場合に作りづらい機能が多く存在する。この記事ではそのひとつである IBL の取得を例に挙げ、`PBL` ライティングの `Specular` 項を使わずに IBL を実現する。

# 環境
- Unity 2017.2.0f3
- ShaderForge v1.38

# ShaderForge の PBL ライティングにおける IBL (Image based lighting)
　IBL 、つまり金属のような周辺環境の映り込みを実現するライティングを行うには ShaderForge の用意する `PBR` ライティングを用いて Specular 項を制御すれば良い。この例を図 1 に示す。プレビュー画像の通り Unity の `Default-Skybox` が表面に映り込んでいることが分かる。
　しかし ShaderForge の `PBL` ライティングは Unity の Standard Shader のライティング計算マクロに基づいており、また、ノードも無いため IBL の取得は完全に隠蔽され、IBL を独自のライティングに反映させることができない。

![図 1](https://qiita-image-store.s3.amazonaws.com/0/48638/5facce9f-0ef7-fa4e-0513-0243a4578756.png)
図 1: ShaderForge デフォルトの `PBL` ライティングを用いて IBL を反映させる例. 残念ながら IBL は内部に隠蔽されている.

# Unity の環境マップ取得マクロを用いた IBL
　Unity では [Vertex and fragment shader examples](https://docs.unity3d.com/Manual/SL-VertexFragmentShaderExamples.html) の Environment reflection using world-space normals 節で示されている通り、環境マップと法線ベクトルを入力に `UNITY_SAMPLE_TEXCUBE` をマクロを用いることで環境光を取得することができる。幸い環境マップは Global なプロパティであるし、法線ベクトルもノードで取得できるため `Code` ノードを用いることで容易に実現可能だ。この例を図 2 に示す。

![図 2](https://qiita-image-store.s3.amazonaws.com/0/48638/d9b5eb4f-e948-92b2-5775-f2d2f9473fae.png)
図 2: `Code` ノードに IBL 取得マクロを記述することで、環境光をそのまま表示する例.

# 環境マップのボケ具合を加味する
　前節で挙げたシェーダはひとつ気になる点が見える。それは環境マップがあまりにもくっきりはっきりと映り込んでいることだ。できれば図 1 の `Glossiness` プロパティのようなボケ方を制御するパラメータが欲しい。
　Unity の環境マップは LOD を利用して、何段階かにボカした環境マップを取得することができる。そのボケの段階数は `UnityStandardConfig.cginc` に `UNITY_SPECCUBE_LOD_STEPS` として定義されているので利用する。実装を図 3 に示す。

![図 3](https://qiita-image-store.s3.amazonaws.com/0/48638/5cde94db-a25e-09ef-9b06-1da70cdc6cb0.png)
図 3: LOD を利用してボカした環境マップを取得、適用した例.

# さいごに
　これで綺麗に IBL を取得したと言えるだろう。環境の映り込みは現代的なレンダリングに欠かせない要素のひとつであるため、さまざまな応用範囲が考えられる。正直 ShaderForge にノードとして実装して欲しいが、Forum を見る限り、Unity のあやふやな仕様には追従する気はあまりないらしい。
PowerShell+pecoでWindowsのエクスプローラでのストレスを減らす

# 経緯
Windowsを使っているとエクスプローラがたくさん開いていることがあります。エクスプローラを開き直すのが面倒くさいからだと思うのです。
ショートカットを用意しても押し間違いでイライラします。

なので、PowerShell + pecoですぐにエクスプローラを開けるようにします

# 必要なもの
PowerShell
chocolatey(https://chocolatey.org/)
Peco

# 準備
## chocolateyのインストール
https://chocolatey.org/install
上記URLからインストールしてください

## pecoのインストール
```shell-session
$ choco install peco

# ローカルのインストールの確認
$ choco list -lo
```

# 本題

## PowerShellのProfileを編集
Profileのパスを表示する

```shell-session
$ $PROFILE
C:¥...¥Microsoft.PowerShell_profile.ps1
```
PowerShellの起動時に実行されるスクリプトです。
このスクリプトファイルに以下を追加します


```ps1

# visualstudio_codeでファイルを開くため。notepadでも良い
$editor = "code"
# 移動したいpathを追加するため。
$pecoList = "~/.pecoList"

function pef {
        switch($args[0]) {
                "add" {
                        pefAdd($args[1])
                }
                "edit" {
                        pefEdit
                }
                "rm" {
                        pefRm
                }
                default {
                        pefCd
                }
        }
}

# pathのリストに追加
function pefAdd($p) {
        switch($p) {
                "." {
                        $pwd.path >> $pecoList
                }
                default {
                        $p >> $pecoList
                }
        }
}

# pecoを使ってディレクトリ移動
function pefCd {
        cd $(cat $pecoList | peco)
}

# pecoを使ってeditorを起動
function pefEdit {
        Invoke-Expression "$editor $(cat $pecoList | peco)"
}

# pathのリストを削除
function pefRm {
        $p = (cat $pecoList | peco)
        if ($p) {
                $typename = "System.Management.Automation.Host.ChoiceDescription"
                $yes = new-object $typename("&Yes", "yes")
                $no = new-object $typename("&No", "no")
                $assembly = $yes.getType().AssemblyQualifiedName
                $choice = new-object "System.Collections.ObjectModel.Collection``1[[$assembly]]"
                $choice.add($yes)
                $choice.add($no)
                $answer = $host.ui.PromptForChoice($p, "remove?", $choice, 0)
                if ($answer -eq 0) {
                        $data = $(cat $pecoList)
                        $i = [Array]::IndexOf($data, $p)
                        $data[$i] = $null
                        $data | Out-File $pecoList
                }
        }
}

```

頻繁にpowershellからvs_codeを開くので、editorの起動もできるようにしました。

## 使ってみる
```shell-session
# カレントのディレクトリをパス追加. ~/.pecoListに追加されます
$ pef add .

# 登録したパスからディレクトリ移動. pecoでリストから選択するとディレクトリを変更できます
$ pef

# ディレクトリ移動後、エクスプローラを起動
$ start .

# 選択したpathでeditor起動
$ pef edit

# 登録したパスを削除. pecoでリストから選択すると削除できます。普通にファイルを修正しても良いです
$ pef rm
```


# まとめ
1. PowerShell起動
2. pefで移動
3. PowerShellからエクスプローラを起動

これですぐに開き直せるので、マウス操作が下手くそな私にはなかなか良いです。
Android Studioで、BIOSを許可してもエミュレータが起動しない場合

## はじめに

Kotlinでは最終的にSpringなどと組み合わせてWebアプリケーションを作ることを目標としているのですが、やっぱりAndroidもやってみたいな、ということで[Kotlin スタートブック](https://www.amazon.co.jp/Kotlin%E3%82%B9%E3%82%BF%E3%83%BC%E3%83%88%E3%83%96%E3%83%83%E3%82%AF-%E6%96%B0%E3%81%97%E3%81%84Android%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0-%E9%95%B7%E6%BE%A4-%E5%A4%AA%E9%83%8E/dp/4865940391/ref=sr_1_1?ie=UTF8&qid=1510406269&sr=8-1&keywords=kotlin%E3%82%B9%E3%82%BF%E3%83%BC%E3%83%88%E3%83%96%E3%83%83%E3%82%AF)を見ながらAndroid Studioを使おうとしたのですが、どうもエミュレータが起動せず、なんだかんだ3時間ほど迷ってしまったので、Qiitaで書く練習も兼ねてメモを残しておこうという次第です。

## エラーメッセージ

以下の画像の通りです。

![rapture_20171111221346.jpg](https://qiita-image-store.s3.amazonaws.com/0/172683/5f11aba2-0848-c77e-c45a-8d9eb6b90e7a.jpeg)

一応テキストにも起こしておくと、

> Intel HAXM is required to run this AVD.
> HAXM is not installed.
>
> Install Intel HAXM for better emulation performance.

このメッセージに何度も悩まされます。

## 対策1. BIOSの設定で仮想化技術を有効にする

適当に検索すると、すぐに出てくるのが「BIOS設定でなんとかしよう」。
http://beginner-goran.com/haxm/
私も例によって設定を見直しましたが、すでにVT-xは「Enabled」になっていました。なってるのかよ。

## 対策2. 仮想化の状態を確認する

次に[VirtualChecker](https://forest.watch.impress.co.jp/library/software/virtualcheck/)を使って仮想化が出来る状態なのかを確認します。VirtualChecker自体のインストール方法は簡単なのですぐにチェックできます。

私が確認した結果がコレ。

![rapture_20171111221434.jpg](https://qiita-image-store.s3.amazonaws.com/0/172683/69510b59-2c97-85f3-d587-ecef560d45b3.jpeg)

出来るんですね。出来ちゃうんですよ。これは参ります。

## 対策3. intelHAXMを再インストールする

[参考ページ](https://stackoverflow.com/questions/36527278/dev-kvm-not-found-error-on-windows-in-android-studio)

最終的にこの対策で何とかなったのですが、intelHAXMをインストールし直します。
Android Studioで「Settings > Appearance & Behavior > System Settings > Android SDK」と進み、
「SDK Tools」タグを選択して、HAXMがインストールされているのか見てみます。

![rapture_20171111223650.jpg](https://qiita-image-store.s3.amazonaws.com/0/172683/7061df41-ba23-88f3-1d4e-519df0b76051.jpeg)

インストールされてるんですよね。この展開はちょっとしつこい。
ということで、再インストールをします。
Windowsの場合は、デフォルトで以下のディレクトリにインストーラ（intelhaxm-android.exe）が用意されています。
```C:\Users\（※ユーザー名）\AppData\Local\Android\Sdk\extras\intel\Hardware_Accelerated_Execution_Manager```
これを起動して順番に進んでいくと、インストール済みの場合はRemoveするのか聞かれるので、ドキドキしながらRemoveします。
そして、再度インストーラを起動すると、自動的にインストールを実行してくれます。

では、再インストールしたのでエミュレータを起動します。

![rapture_20171111224729.jpg](https://qiita-image-store.s3.amazonaws.com/0/172683/802768db-fa9c-86db-8026-ac3a51c0d777.jpeg)

はい、ということで無事に起動できました。
よく考えたら大したことなかったのに、さっそく壁にぶつかってしまいましたが、これで色々と勉強できるようになりました。頑張っていこうと思います。
僕が遭遇したIE11固有の不具合とその対策

最近大学時代の同期と飲んだらMSに転職したので
現在から過去の案件で~~産廃IEくたばれと心底思った~~発生した事象と対策を書いていきます:smirk:
他にもこんなことあったぜ！って意見ありましたらお待ちしております。

# キャッシュ
Windows10のIE11で遭遇した事象
ログイン→ログアウト→別アカウントログイン
したときの挙動が最初のログインアカウントの状態のレスポンスが返ってくる

* Authorization: Bearerヘッダーが再ログインしても前のBearerトークンが残り続ける
* APIレスポンスが前回のものが返ってくる

## 対策

JSのすごい人に助けてもらいました・・・

* ClearAuthenticationCacheを無効にする
* リクエストキャッシュしないようにリクエストパラメータ末尾に日付をつける→jQueryでもこの方法で回避しているらしい

~~これIEのバグですよね？~~

```js
// ClearAuthenticationCacheを無効にする（リクエスト前に呼んで確実に消す）
document.execCommand && document.execCommand('ClearAuthenticationCache', 'false')
// キャッシュしないようにリクエストパラメータ末尾に日付をつける（もしくはuuid付与などでリクエストurlを一意にする）
req.url += (req.url.indexOf('?') == -1 ? '?' : '&') + '_=' + Date.now()
```

# 位置情報
Chromeでは`navigator.geolocation.getCurrentPosition`で
位置情報が取れるのにWindows10のIE11ではPermissionエラーが返ってきていた

## 対策
windowsの設定で地図情報をオフになっているとIEでは現在位置が取れないためオンにする
<font color='red'>IEの設定ではない</font>ので気づくのに時間がかかってしまった
~~Windows10でのみこの設定がコントロールパネルに存在する~~

参考：[Windows10のIE11.5ではGeolocation APIのgetCurrentPositionが初回しか成功しない](https://qiita.com/horikeso/items/e4fed497518ec51277b1)

# videoタグ
windows7のIE11のvideoタグにて正方形の動画が再生されない
（videoタグのサイズという意味でなく、動画自体の縦横サイズが正方形）
windows8.1以降のIE11では再生される

## 対策
windows7のIE11とwindows8.1のIE11は別物
~~Windows7のIE11、Windows8.1以降のIE11で互換性がない糞っぷり~~

参考：[video タグで動画が再生されない。Windows 7 IE11 と Windows 8 IE11 は別物](https://yuichon.com/2016/05/video-win7-ie11/)

windows7のIE11ではそもそも正方形動画が対応していない
諦めて横長の動画（かつ横幅720px以下）にするしかない

# CSS
flexbox周りでIEだけレイアウトが崩れる

## 対策
[flexboxのバグに立ち向かう（flexboxバグまとめ）](https://qiita.com/hashrock/items/189db03021b0f565ae27)

# 愚痴
もはやページ開いたタイミングでお使いのブラウザでは対応していません
→Chromeストアにぶっ飛ばす
くらいやらないとこの流れは変わらないんじゃないかすら思える
python3でslackbotの作成(その6:デプロイ編)

#前回
[その5:Heroku設定編](https://qiita.com/thimi0412/items/852ee9bbfd8b1dd3c072)
前回はHeerokuのアプリの作成と設定を行いました。
今回はHerokuへデプロイを行い、botの常駐化をして行きます。

#ディレクトリの構成
slack_bot/
 ├─ Procfile      <font color="Red">new!</font>
 ├─ requirements.txt  <font color="Red">new!</font>
 ├─ runtime.txt  <font color="Red">new!</font>
 ├─ plugins/
 │   ├─ \_\_init\_\_.py
 │   ├─ bot_listen.py
 │   └─ bot_mention.py
 ├─ run.py
 └─ slackbot_settings.py

今回は追加したファイルは Profile,requirements.txt,runtime.txtの３つです。

```text:Procfile
python_bot: python3run.py
```
ProcfileはHerokuにデプロイする際、実行されるコマンドを記述します。
ここではpython_botと記述しましたがここは自由に書いて結構です。
:(コロン)以降にはコマンドラインから実行していたコマンドを記述して行きましょう。
<font color="Red">※注意</font>
":"(コロン)の後ろは必ず半角スペースを入れてください。Herokuへのデプロイの際にコマンドとして認識してくれません。(実際かなりつまずきました)

```text:requirements.txt
slackbot==0.5.1
```
requirements.txtはpythonの依存ライブラリの定義です。

```
pip3 freeze > requirements.txt
```
上記のコマンドでも書き込めますがpipに多くのライブラリをダウンロードしている方は全て書き込まれてしまうので、txtファイルを作り書き込んだ方が良いでしょう。

```text:runtime.txt
python-3.6.2
```
text:runtime.txtはpythonのバージョンの記述です。

#デプロイ
まずbrewを使いHerokuコマンドを使えるようにしましょう。

```
brew install heroku
```
herokuにログインします。

```
heroku login
```
<img width="442" alt="スクリーンショット 2017-11-11 22.22.31.png" src="https://qiita-image-store.s3.amazonaws.com/0/166626/99411451-8660-3905-2771-f55790628439.png">
このようにメールアドレスとパスワードを要求されるので入力してログインしましょう。
その後はgitを使ってpushするとデプロイできます。

```
git init
```
```
heroku git:remote -a slack_bot
```
```
git add .
```
```
git commit -m 'heroku_deploy'
```

```
git push heroku master
```
<img width="610" alt="スクリーンショット 2017-11-11 22.32.33.png" src="https://qiita-image-store.s3.amazonaws.com/0/166626/111590fc-a95c-d553-9c23-14311fae83c5.png">
こんな感じになればOK!

#起動
起動は以下のコマンドで実行

```
heroku ps:scale python_bot=1
```
これでbotの常駐化が終わりました。
以上！！！
worpdressのカスタムフィールドを劇的に使いやすくする方法


wordpress構築するときに、好きな場所で好きなカスタムフィールドを好きな回数使う方法です。

例えば、「画像大」「画像小」「テキスト」「youtube」という入力項目を作るとします。
普通にカスタムフィールドを使おうとすると、上から

「画像大」「画像小」「テキスト」「youtube」

と１つずつフィールドを作ると思います。しかし、記事によって

「画像大」「youtube」、
「画像小」「youtube」「画像大」「テキスト」、
「画像小」「テキスト」「画像大」「テキスト」「画像大」、
など

色々な順番、回数カスタムフィールドを自由に使いたいことがあるはずです。

「画像大1」「画像大2」「画像大3」のように事前にフィールドを用意しておくことは可能ですが、
順番の変更に対応できないのと何よりスマートじゃありません。


そんな時は、いつも使用しているカスタムフィールド拡張プラグイン

■Advanced Custom Fields
https://ja.wordpress.org/plugins/advanced-custom-fields/

とともに、「Advanced Custom Fields」を拡張する有料プラグイン

■Advanced Custom Fields The Repeater Field
https://www.advancedcustomfields.com/add-ons/repeater-field/

を使います。安いので必ず買いましょう、30分くらいで元が取れます。
「Repeater Field」を使うとカスタムフィールドが繰り返し使えるようになります。
細かいタグのチュートリアルは上記のリンク先に載っています。

![1.png](https://qiita-image-store.s3.amazonaws.com/0/30049/281b9d39-93ad-d7f4-3c66-5cf84d8ff8c5.png)


２つのプラグインをインストールすると、
管理画面のサイドナビの「カスタムフィールド」から自由にカスタムフィールドが作成出来るようになっているはずです。
フィールドグループを新規作成してください。

「Repeater Field」を入れているとカスタムフィールドの入れ子？ができるようになります。
フィールドタイプに「Repeater」が追加されているのでそれを選択してください。

![2.png](https://qiita-image-store.s3.amazonaws.com/0/30049/1641eb4e-4371-a03d-6772-ce09dc74a1eb.png)

入れ子のフィールドを以下のように作ります。
「レイアウト」は今回はRowにします、適宜変えてください。
「Button Label」もわかりやすい文言にした方が良いです。

![3.png](https://qiita-image-store.s3.amazonaws.com/0/30049/814bae4d-1797-17cf-8f4a-3f5188c28fdb.png)


入れ子フィールドを作る時の**ポイントその１**として、
まずプルダウンの設定を以下のようにしてください。


![4.png](https://qiita-image-store.s3.amazonaws.com/0/30049/96c8116e-991b-f80e-ea04-59b4f585c3ca.png)


次に実際にサイトに表示するコンテンツのフィールド達です。
「画像大」を例にします。
**ポイントその２**として、「条件判定」で種類が画像大に選択された時、とします。
他のフィールドも真似て設定します。


![5.png](https://qiita-image-store.s3.amazonaws.com/0/30049/19692ddc-a608-5dfe-621a-5dd97298773a.png)

これが終わったら設定を保存してください。
このカスタムフィールドを使う場所が、「投稿」なのか「カスタム投稿」なのか「固定ページ」なのか
も忘れずに設定しましょう。


![6.png](https://qiita-image-store.s3.amazonaws.com/0/30049/f9f2b14e-b4e2-6836-e738-aaefe99e9849.png)


次にfunction.phpに以下のように記述します。
htmlタグは適時変更してください。

```php:functions.php
// カスタムフィールドの制御 関数名は他と被らなければ自由
function set_body_content() {
  while ( have_rows( 'コンテンツ' ) ): the_row();
    switch ( get_sub_field( '種類' ) ) {
    case '画像大':
      echo '<div class="img img--l"><img src="' . get_sub_field( '画像大' ) . '" alt=""></div>';
    break;
    case '画像小':
      echo '<div class="img img--s"><img src="' . get_sub_field( '画像小' ) . '" alt=""></div>';
    break;
    case 'テキスト':
      echo '<div class="text">' . nl2br(get_sub_field( 'テキスト' )) . '</div>';
    break;
    case 'youtube':
      echo '<div class="youtube"><iframe src="https://www.youtube.com/embed/' . get_sub_field( 'youtube' ) . '" frameborder="0" allowfullscreen></iframe></div>';
    break;
    }
  endwhile;
}
```
このように定義しておけば、その関数をテンプレートから呼び出せるので、
呼び出したい箇所に以下のように記述します。

```php:single.php
<?php set_body_content(); ?>
```

ここまでできたら準備完了です。
投稿画面を開くと、プルダウンでカスタムフィールドを選択できるようになっており
「順番」「種類」「繰り返し回数」も自由に制御できます。
試しに入力してみます。

![7.png](https://qiita-image-store.s3.amazonaws.com/0/30049/09ff4218-f9e0-60b7-c56f-781dc3dbce55.png)

するとこんなふうにちゃんと出力されます。

![8.png](https://qiita-image-store.s3.amazonaws.com/0/30049/00086c41-30fa-bd68-6353-9e7702798f76.png)

このテクニックを使うと、htmlが使えないユーザーも割と自由に
記事のカスタマイズができます。