OmniAICreator/Qiita-1.07M huggingface dataset:
MacでCubemapをEquirectangularにTerminalのコマンドで変換する

MacでCubemapをEquirectangularに変換する方法がやや検索しずらいということで手順を示しておきます

# 環境

* perl: v5.18.2
* MacBook Pro (Retina, 15-inch, Mid 2015) macOS Sierra 10.12.6


# Equirectangularとは

以下のような画像([こちら](http://photopin.com/free-photos/equirectangular)から取得しました)でパノラマ画像として使われます。Thetaなどで撮影された画像はこのようになります。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/30079/5792cbef-d3e5-d88e-f1c8-804f953f738c.png)


# Cubemapとは

正方形の画像が6枚で一組となった以下のようなものです。Equirectangularに相互変換可能です。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/30079/8139e20f-3824-463e-8a8d-6f7b2641711b.png)

# CubemapからEquirectangularに変換するには

[cubic2erect](http://search.cpan.org/dist/Panotools-Script/)のperlモジュールで変換するのですが、他にもインストールしなければいけないものがあるので手順だけ示します。

## Hugin(Panorama photo stitcher)のインストール

Huginにはいっている`nona`というツールにcubic2ererctが依存しているので、[こちら](https://sourceforge.net/projects/hugin/)からダウンロードし、.dmgを開きインストールします。

その後、以下のようにPATHを通して、`/Applications/Hugin/HuginStitchProject.app/Contents/MacOS`以下のファイルを使用できるようにします。

```
export PATH="$PATH:/Applications/Hugin/HuginStitchProject.app/Contents/MacOS"
```

## perl 5.18.Xのインストール

後ほど、cubic2erectをソースからコンパイルするのですが、その際にperl 5.18.Xを使ったのでそのバージョンをhomebrewでインストールします。最新だとコンパイルエラー(正確にはmake testでこけた)になったので5.18を使っています。

```
brew install perl@5.18
```

最初にcpanの設定をします。各種きかれますので全部enterボタンをおしていればいいです

```
cpan
```

次に以下のように必要なモジュールをインストールしておきます。

```
sudo cpan install Image::ExifTool
sudo cpan install Image/Size.pm
```

# cubic2erectのインストール

ソースからコンパイルします。[こちら](http://search.cpan.org/dist/Panotools-Script/)のサイトのDownloadからパッケージを任意の位置にダウンロードします。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/30079/59c4a275-be73-00c8-08ef-cce37de3f9e3.png)

解凍してからREADMEをみてコンパイルします

```
perl Makefile.PL
make
make test
sudo make install
```

# cubic2erectの実行

やっと実行できるようになったので、以下のように変換します。```front, right, back, left, up, down```はそれぞれcubemapの画像です。```output.tif```が出力ファイルです。

```
cubic2erect front.jpg right.jpg back.jpg left.jpg up.jpg down.jpg output.tif 
```

tif画像だと面倒なのでjpgに変換しておきます。

```
convert output.tif output.jpg
```

# おまけ

ソースを覗いてみます。

* cubic2erect: nonaをwrapしているだけ
* nona: 画像の座標などを変換するもの。[ndevenish/Hugin](https://github.com/ndevenish/Hugin)に説明がある


# 参考
* http://michikosbl.exblog.jp/7752571/
* https://docs.unity3d.com/jp/540/Manual/class-Cubemap.html
* http://dic.nicovideo.jp/a/equirectangular
* https://www.360toolkit.co/convert-spherical-equirectangular-to-cubemap.html
CakePHP PHP インサート時に文字コードエラー

# Cake PHP PHP DBへインサート

mysqlになりますが、DBへ日本語をインサートしようとした時に下記エラーが発生してエラーページが出ました。

ERROR 1366 (HY000): Incorrect string value: '\x82\xE8\x82\xF1\x82\xB2' for column 'name' at row 1

なので、DBの設定を確認、

```

mysql> show variables like 'char%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
| character_set_database   | latin1                     |
| character_set_filesystem | binary                     |
| character_set_results    | utf8                       |
| character_set_server     | latin1                     |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)

```

上記のようになっておりましたので、改修！

まずは下記編集

```mysql:/etc/my.cnf

[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
character-set-server=utf8
symbolic-links=0
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES

[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

[client]
default-character-set=utf8

```

mysql 再起動

```
sudo service mysqld restart
Stopping mysqld:                                           [  OK  ]
Starting mysqld:                                           [  OK  ]
```

再度確認

````
mysql> show variables like 'char%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
| character_set_database   | utf8                       |
| character_set_filesystem | binary                     |
| character_set_results    | utf8                       |
| character_set_server     | utf8                       |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)

```

これでサイドPHPを叩くと、無事インサートできます。
Rustで文字列のソートしてみた

# Rustで文字列のソートをしてみた
String, &strには組み込みでソート関数が用意されていないようなので書いてみた。

```rust
fn main() {
    let x = "test";
    let mut it: Vec<_> = x.chars().collect();
    let mut y = String::new();

    it.sort();

    for c in it {
        y.push(c);
    }

    let y: &str = y.as_str();
    println!("{}", y);
}
```

一応動作はするものの、美しくない書き方な気がする。
特にString作ってpushしてるあたりがもっと簡単な書き方とかないんだろうか？
ご存知の方、こんなコードより良いコードを思いついた方、どうか教えて下さい。

あとUTF-8でどんな動作するのかは謎、一応アルファベットならとりあえずはソートできてる。

# 補足
コメントでより良い書き方の例をいただけました。

```rust
// for c in it {
//        y.push(c);
//}

let y: String = chars.into_iter().collect();
```
これならyをミュータブルにする必要もなく、コードもスッキリして見えます。

UTF-8の場合についてコメントで情報をいただけたので、その点について補足します。
rustではデフォルトでUTF-8を使いますが、UTF-8では1文字に見えても1文字でないみたいな文字が存在しているため、ソートなどで順番が変わると元の文字とは違う字が出現する可能性があります。
rustは全て1文字としてUnicodeのスカラ値として解釈してソートするため、一般的には正しくないと思われる動作になります。
具体的な例もコメントで確認できます。
アルファベットに関しては正しくソートできるはずです。
バッチファイルでファイル名の末尾を削除する（拡張子は削除しない）

## やりたいこと

* ファイル名の末尾にある固定文字列を削除したい。
* バッチで。
* ディレクトリ内を一括で置換したい。


ディレクトリには以下のファイルがある想定
hugahuga-debug.txt
hogehoge-debug.txt

今回はファイル名の末尾にある文字列の"-debug"を削除し、"hugahuga.txt"のようなファイル名にします。

```rename.bat
for %%F in (*-debug.txt) do call :sub "%%F"
goto :EOF

:sub
set BEFORE=%~1
set FILENAME=%~n1
set EXTENSION=%~x1
set AFTER=%FILENAME:~0,-6%%EXTENSION%
ren "%BEFORE%" "%AFTER%"
```

### 結果
hugahuga.txt
hogehoge.txt



## やってること

* バッチと同じディレクトリ内のファイルで"*-debug.txt"に引っかかるファイルを順に対象にする。
* BEFOREに変更前のファイル名が代入される。
* FILENAMEに変更前のファイル名から拡張子を除き、代入される。
* EXTENSIONに拡張子が代入される。
* AFTERにFILENAMEの末尾6文字(ここでは"-debug"が該当)を削除し、EXTENSIONをくっつける。
* renコマンドでリネームする。

こちらを参考にさせていただきました
http://wpqtqpqp.hatenablog.com/entry/2016/01/24/115618
【MySQL】processlistでwhereを使う

# プロセスを確認する方法は２つある
次の２つどっちでも:ok:

```SQL
select * from information_schema.PROCESSLIST;
```
```SQL
SHOW [FULL] PROCESSLIST;
```
→[FULL]を入れなくてもOKだけど、どんなSQLが実行されているかを示すInfoが先頭100文字までしか表示されないです。

# select * from information_schema.PROCESSLIST;
where句やorder by句などが使えて便利:exclamation:
以下、コピペしてそのまま使えるselect文です↓

## 実行時間の長い順でソートする
```SQL
select * from information_schema.PROCESSLIST
order by TIME desc   -- 実行時間の長い順でソート
;
```
## ホスト名やIPアドレスで絞り込む
```SQL
select * from information_schema.PROCESSLIST
where
  HOST like '%192:%'  -- ホストIPの一部でlike検索
  or DB = 'testDB'     -- スキーマ名で検索
;
```
ホスト名で「:」を入れているのは、ポート番号の手前だけでlike検索したいからです。
開発環境だと、末尾だけ異なる似たようなIPアドレスのプロセスが大量に並ぶので、末尾だけで確実に絞り込みたいからです。

あと、重いプロセスをkillする時は、出来るだけホスト名やIPアドレスで絞り込むとよいと思います。
他人のプロセスを間違えてkillすることもないわけじゃないので・・・。
（先日、勝手にkillされて泣きを見た:sob:）
世界のナベアツをプログラミングしてみたら少しツボった話

PHPで作成しました。

```php
for($i==0; $i<=100; $i++){
    if ($i%3 == 0 and $i <> 0) {
        echo 'アホ' . '<br>';
    }else{
        echo $i . '<br>';
    }
}
```

ところが、なぜか0が表示されないのです。
試してみるとどうも0を格納した変数を出力する際は
何も表示されないようだ。
オフラインリアルタイムどう書く F06 の実装例


問題 : http://nabetani.sakura.ne.jp/hena/ordf06numit/
実装リンク集 : https://qiita.com/Nabetani/items/deda571c9451bd7d3175

再帰呼び出ししつつメモ化するの一択だと思うけどどうだろう。
再帰呼び出しが怖い人はスタックを自分で持ったりするんだろうけど、気にせず再帰するとこんな感じ。
まずは ruby で。

```ruby:ruby2.4.2
class Solver
  def initialize( f, g )
    @f=f
    @g=g
    @memo={}
  end
  def solve( root, num )
    return 0  if root<num
    return @memo[root] ||= ( root==num ? 1 : 0 ) + solve( @f[root], num ) + solve( @g[root], num )
  end
end

class SolverNoMemo
  def initialize( f, g )
    @f=f
    @g=g
  end
  def solve( root, num )
    return 0  if root<num
    return ( root==num ? 1 : 0 ) + solve( @f[root], num ) + solve( @g[root], num )
  end
end

def solve( src )
  Solver.new(
    ->(x){ x/2-10 },
    ->(x){ x*2/3 }
  ).solve( *src.split(?,).map(&:to_i) ).to_s
end

DATA.map{ |line|
  num, src, expected = line.split(/\s+/)
  actual = solve( src )
  ok = actual == expected
  p [ ok ? "ok" : "**NG**", src, actual, expected ]
  ok
}.all?.tap{ |x| puts( x ? "okay" : "something wrong" ) }

__END__
0 123,4 5 リンク
1 1,1 1 リンク
30  5745432,1032  1287  略
```

テストデータの大半は省略。「`SolverNoMemo `」は、メモのないバージョン。こちらだと1分ぐらいかかる。
メモ化すれば、1秒かからない。

続いて C99 で。
こちらはメモ化ありのバージョンのみ。

```c:c99
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int solve_impl( int root, int num, int * buffer )
{
  if ( root<num ){
    return 0;
  }
  if ( root==num ){
    return 1;
  }
  if ( buffer[root] ){
    return buffer[root];
  }
  int a=solve_impl( root/2-10, num, buffer) + solve_impl( root*2/3, num, buffer);
  buffer[root]=a;
  return a;
}

char const * solve( char const * src )
{
  int root = atoi(src);
  char const * comma = strchr( src, ',' );
  int num = atoi( comma+1 );
  int * buffer = calloc( sizeof(int), root+1 );
  int ans = solve_impl( root, num, buffer );
  free( (void*)buffer);
  char s[100];
  sprintf( s, "%d", ans );
  return strdup(s);
}

void test( char const * src, char const * expected )
{
  char const * actual = solve( src );
  _Bool okay = 0==strcmp( actual, expected );
  printf( "%s %s->%s / %s\n", (okay ? "ok" : "**NG**"), src, actual, expected );
  free( (void*)actual );
}

int main(void)
{
/*0*/ test( "123,4", "5" );
/*1*/ test( "1,1", "1" );
/*2*/ test( "2,1", "1" );
/*30*/ test( "5745432,1032", "1287" );  
}
```

この問題なら、C言語でも大して長くならない。

やっぱりメモリの管理が面倒だね。free し忘れても気づかないし。

問題としては一直線すぎるかという懸念もあったんだけど、現場ではいろいろあったり。
楽しんでいただければ幸いです。
Xcode9とiOS11でアプリ提出までにやったこと

#はじめに
Xcode9とiOS11がリリースされました。この組み合わせでiOSアプリのビルド行い、アプリ提出をしたところ、ハマりましたのでメモしておきます。

#環境
MacOS:10.12.6 (Sierra)
Xcode:9.0
iOS:11.0

#発生したこと
Xcodeから「Upload to App Store...」でアプリのアップロードを行うと、1024x1024のpng画像(アイコン)が無いと怒られました。

#解決方法
1024x1024のアイコン画像を追加し、再アップロードで成功しました。
名前空間の小さなサンプルメモ

これはもちろんエラー

```php:namespace1.php
<?php

function test(){
        echo "test";
}

function test(){
        echo "test";
}
```


- １つのファイル内で名前空間を複数宣言
    - 宣言以下が当該名前空間になる
- 名前空間の使用は「XXX\YYY」のように記載すると、現在の名前空間からの相対パスのような形で参照される
- 「\XXX\YYY」のように記載すると、絶対パスのように参照される

```php:namespace2.php
<?php

namespace kuredev1;
echo  __NAMESPACE__."\n";
function test(){
        echo "test1\n";
}

namespace kuredev2;
echo  __NAMESPACE__."\n";
function test(){
        echo "test2\n";
}

test();//kuredev2\test()
//kuredev2\test();// kuredev2\kuredev2\test()
//kuredev1\test();  // kuredev2\kuredev1\test()
\kuredev1\test();
\kuredev2\test();
```

```sh:実行結果
# php namespace3.php
kuredev1
kuredev2
test2
test1
test2
teset
```

- requireしても名前空間はそのファイル内で宣言しないとその名前空間にならない

```php:namespace3.php
<?php

require_once "namespace2.php";

echo "test\n";
echo __NAMESPACE__."\n";
```

```sh:実行結果
# php namespace3.php
kuredev1
kuredev2
test2
test1
test2
test

```
yhpgF06 - ツリーの中の数 をPythonで解いてみる

オフラインで参加したツリーの中の数をPythonで解きました。

http://nabetani.sakura.ne.jp/hena/ordf06numit/

時間内に解けずに持ち帰って解く。
家に帰ってからは１０分くらいで成功にはなった。

当日は計算時間が話題になりましたが、
私の実行環境ではテストコードがすべて終わるまで１０分弱程度かかります。

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

# https://yhpg.doorkeeper.jp/
# http://nabetani.sakura.ne.jp/hena/ordf06numit/
from functools import reduce

def solve(data):
    data = data.split(",")

    field = []
    tmp = [(int(data[0]))]  #root
    while len(tmp) > 0:
        field.append(tmp)
        tmp = createChild(tmp)
    # print(field)

    flattern = reduce(lambda x,y:x+y,field)
    # print(flattern)
    count = flattern.count(int(data[1]))
    return str(count)

def createChild(field):
    data = []
    for i in field:
        c =child1(i)
        if c > 0:
            data.append(c)
        c =child2(i)
        if c > 0:
            data.append(c)

    return data




def child1(target):
    return int(((target) / 2) - 10)

def child2(target):
    return int((target * 2) / 3)


def test(data, expect):
    result = solve(data)
    if result == expect:
        print("成功: " + result + "/" + expect )
    else:
        print("失敗: " + result + "/" + expect )

test( "123,4", "5" );
test( "1,1", "1" );
test( "2,1", "1" );
test( "3,3", "1" );
test( "19,5", "1" );
test( "69,5", "3" );
test( "88,9", "2" );
test( "1,100", "0" );
test( "100,4", "4" );
test( "101,9", "0" );
test( "456,7", "7" );
test( "567,8", "12" );
test( "756,10", "10" );
test( "789,10", "12" );
test( "896,29", "2" );
test( "7764,6", "664" );
test( "1234,56", "3" );
test( "8563,29", "35" );
test( "12345,67", "10" );
test( "72927,51", "263" );
test( "71441,145", "22" );
test( "123456,78", "397" );
test( "123456,789", "1" );
test( "592741,216", "55" );
test( "913826,584", "81" );
test( "1234567,89", "2293" );
test( "10000000,1", "19383507" );
test( "12345678,9", "3567354" );
test( "6215879,358", "2907" );
test( "12345678,90", "79419" );
test( "5745432,1032", "1287" );

```
Laravel プロジェクトで AWS の ELB(ALB) 443(HTTPS) -> EC2 80(HTTP) とした時、 route() などを期待した動作(https)にする

以前に [Laravel プロジェクトを AWS の ELB 443(HTTPS) -> EC2 80(HTTP) とした時、強制的に HTTPS にする方法](https://qiita.com/hokutoasari/items/63976de874a00416682b) というのを書きました。

実は、以前の方法である `URL::forceSchema('https');` を使うのはあまりよろしくありません。

## どうするのが良さそうか

https://github.com/fideloper/TrustedProxy を使う。

laravel 5.5 からはデフォルトで入ってるはず。

5.4 以前を使っている場合は https://github.com/fideloper/TrustedProxy#tldr-setup に従ったインストールしましょう。

```bash
$ php artisan vendor:publish --provider="Fideloper\Proxy\TrustedProxyServiceProvider"
```

これで、 `./config/trustedproxy.php` が配置されます。

例えば以下のように、信頼されるアクセス元の情報を配列で指定しましょう。

```./config/trustedproxy.php
    'proxies' => [
        // '172.31.0.0/16',
        '10.0.0.0/24',
        '10.0.1.0/24',
    ],
     // 全部信頼できるなら以下のように指定しても OK らしい
     # 'proxies' => '*',
```

これだけ。

## そもそも何が起きているか

※前回も書いたけど。

ELB で https(443) を待ち受けて、内部の EC2 に http(80) で転送していると、 Laravel プロジェクト的には http で動作していることになる。

このため、 route() や redirect() などが、 http:// となってしまう。

期待する動作は、何も意識せずに route() などの結果が https:// になって欲しい。

## `URL::forceSchema('https');` は何が問題なのか

全部の URL が https:// になる。

全て https で処理するなら問題ないが、何らかの理由があって、 http でも処理したい場合に対処できない。
sourcemap を無効化して webpacker の production build を 2000% 速くする

## TL;DR

プロダクションで sourcemap が有効化されていたので、関連オプションを切って回ったら 2000% 高速化した。

## 問題

`NODE_ENV=production bundle exec rake webpacker:compile` が致命的に遅かった。

エントリーポイントが17個でビルド時間が合計680s という有様で、プロダクションとはいえ デプロイ を11分遅くさせるのは、ビジネス的に致命的な感じだった。

## 調査

さしあたり、いつもの経験則で uglify の mangle オプションが遅いんだろう、と思って、webpacker のソースの設定を見に行ったら、うん？？？？となる設定をみつけた。

https://github.com/rails/webpacker/blob/master/package/environments/production.js#L11-L19

```
    this.plugins.set('UglifyJs', new webpack.optimize.UglifyJsPlugin({
      sourceMap: true,
      compress: {
        warnings: false
      },
      output: {
        comments: false
      }
    }))
```

いやー、プロダクションにはsourcemapいらないだろと思って、 webpacker の既定値を無理矢理書き換えた。

```js:config/webpack/environment.js
const webpack = require('webpack');
const environment = require('./environment').toWebpackConfig();

// UglifyJsPlugin のインスタンスを見つけて置き換える
environment.plugins = environment.plugins
  .map(plug => {
    if (plug instanceof webpack.optimize.UglifyJsPlugin) {
      return new webpack.optimize.UglifyJsPlugin({
        sourceMap: false,
        parallel: true,
        mangle: false,
        uglifyOptions: {
          mangle: false
        },
        compress: {
          warnings: false
        },
        output: {
          comments: false
        }
      });
    }
    return plug;
  })

module.exports = environment;

```

ついでに並列オプションを有効化するなどして、 680s => 240s で 283% 速くなった。

## config.devtool

ってことは webpack 側の devtool の sourcemap が有効になってるのでは？ と思って、eval に戻してみた。

```js
//...
environment.devtool = 'eval';
module.exports = environment;
```

240s => 34s

## まとめ

元と比べて 2000%高速化しました。めでたしめでたし。

webpacker、設定がなんか富豪的な感じなんで、気をつけたい。
CloudFormationでHostedZoneIdを設定してるのに「Property HostedZoneId cannot be empty.」と言われた時

# 本題

標題の通りですが、AWSのCloudFormationのテンプレートで、でHostedZoneIdを設定してるのに「Property HostedZoneId cannot be empty.」とエラーが出てしまい、原因が分からずしばらくハマリました。

確かにHostedZoneIdは設定したはずなのに...。

```yaml
  DnsRecord: 
    Type: "AWS::Route53::RecordSet"
    Properties:
      HostedZoneId: XYZ1234ABCD  # ←Emptyじゃないよね!
      Name: hoge.fuga.co.jp
      Type: A
      AliasTarget:
        DNSName: xxxxxx.ap-northeast-1.elb.amazonaws.com
```

なんの事は無い、AliasTargetの方のHostedZoneIdが抜けていたのでした。

```yaml
  DnsRecord: 
    Type: "AWS::Route53::RecordSet"
    Properties:
      HostedZoneId: XYZ1234ABCD
      Name: hoge.fuga.co.jp
      Type: A
      AliasTarget:
        HostedZoneId: YSHDK1233P # ←こっちです、抜けてたのは！
        DNSName: xxxxxx.ap-northeast-1.elb.amazonaws.com
```

もし同じミスでハマった人の手助けになればと思った次第です。
Laravel + Heroku + HerokuPostgres でDB設定をサクッと環境変数に突っ込む

herokuでLaravelを動かす際、DBの接続情報は環境変数にセットするのが一般的かと思います。
ただ、毎回`heroku config:set DB_HOST=...`とするのも面倒な作業です。
特にheroku postgresの場合、せっかく環境変数に接続文字列入ってるのに...という思いを禁じえません。
そこで、PHPのワンライナー実行でなんとかします。
（RubyでもPythonでもいいけどLaravelの開発するならPHP入ってるでしょという前提）
アプリのディレクトリにcdして以下のコマンドをコピペしてください。

``php -r 'preg_match("/^postgres:\/\/(.+?):(.+?)@(.+?):(.+?)\/(.*?)$/", `heroku config:get DATABASE_URL`, $matches); `heroku config:set DB_CONNECTION=pgsql DB_HOST=$matches[3] DB_PORT=$matches[4] DB_DATABASE=$matches[5] DB_USERNAME=$matches[1] DB_PASSWORD=$matches[2]`;'``

## 前提

- PHP 入ってる
- Heroku CLI 入ってる
- heroku アプリ作成済み
- heroku postgres 追加済み

## うまく動かないときは

- `heroku config:get`, `heroku config:set` で`--app`オプションつけて対象アプリを明示する
- `heroku config`で環境変数にDATABASE_URLが追加されているか確認する
- コピペしたときに`'`や`"`や`` ` ``が勝手に変換されてないか確認する

## 解説
`php -r '...'`
→引数で渡されたPHPコードを実行しているだけです。

以下PHPのコードの解説ですが、このコードの肝は
**PHPではバッククォートで囲った部分がコマンドとして実行され、結果が文字列として返ってくる**
という点に尽きます。

``preg_match("/^postgres:\/\/(.+?):(.+?)@(.+?):(.+?)\/(.*?)$/", `heroku config:get DATABASE_URL`, $matches); `` 
→herokuの環境変数からPostgresの接続文字列を引っこ抜いて正規表現で分割してます。
前述のとおり`` `heroku config:get DATABASE_URL` ``でherokuのコマンドを叩いて結果を取得しています。

`` `heroku config:set DB_CONNECTION=pgsql DB_HOST=$matches[3] DB_PORT=$matches[4] DB_DATABASE=$matches[5] DB_USERNAME=$matches[1] DB_PASSWORD=$matches[2]` ``
→同じようにherokuを叩き、今度はherokuの環境変数に値をセットします。
`` ` ``に囲まれた部分でも変数展開が有効です。
余談ですが`$(var)`形式の変数展開を使うとコマンドラインの変数展開とバッティングしてエラーになります。

## 検証環境
macOS Sierra v10.12.6
php v5.6.30（herokuではなくローカルのPHP）
heroku-cli v6.14.24-72dfccf
LinuxやMacでチェックサムをワンライナーかつ比較までやる方法


```bash
$ wget https://github.com/prometheus/alertmanager/releases/download/v0.8.0/alertmanager-0.8.0.linux-amd64.tar.gz
$ echo 'b569ae0d31e5df59391124578bcf9b28316cf12adb4cc9d10f439fc3ab3422f1  alertmanager-0.8.0.linux-amd64.tar.gz' | shasum -a256 -c 
> alertmanager-0.8.0.linux-amd64.tar.gz: OK
```

チェックサムを表示する方法は書いてあるけど、意外と比較まで一気にやる方法は書いてなかったりしたので、公開してみました。

注意点としては、echoの部分にファイル名まで必要なところです。
リポジトリ直下にcomposer.jsonがない場合でCircleCIでハマったこと

GitHubにホスティングしているリポジトリとCircleCIを連携させようとしたところ、
リポジトリ直下にcomposer.jsonがなかったためハマりました…

CircleCIはリポジトリの直下にcomposer.jsonがあれば、
testの前にcomposer.jsonの内容で依存ライブラリをインストールしてくれるのだけれど、
そうではない場合は手動で実行させなくてはなりません。
だいたいのプロジェクトではリポジトリ直下にcomposer.jsonがあったけれど、
今回の自分が遭遇したケースではリポジトリの直下に複数のプロジェクトディレクトリがあって、
その中にcomposer.jsonがそれぞれあるケースでした。

いつもどおりcircle.ymlを書いたところphpcsがない・phpunitがないとエラーが出て、
色々ググったけれどなかなか情報がなかったので参考になれば幸いです。

```circle.yml
machine:
  timezone: Asia/Tokyo
  php:
    version: 7.1.6

dependencies:
  cache_directories:
    - path/to/.composer/cache
  pre:
    - composer config -g github-oauth.github.com $GITHUB_OAUTH_TOKEN
    - echo "memory_limit = 2048M" > /opt/circleci/php/$(phpenv global)/etc/conf.d/memory.ini
  override:
    - composer install --dev --no-interaction --working-dir=path/to    # ★ここ重要

test:
  override:
    - path/to/vendor/bin/phpunit
```

もしcomposer.jsonが`リポジトリ名/path/to/composer.json` という場所にある場合、
composer installの実行時のオプションで`--working-dir=path/to` で明示的にディレクトリを指定します。
こうすることで指定したディレクトリのcomposer.jsonを実行することができます。

普通にcomposer installまたはupdateする場合は何も考えずにcomposer.jsonのあるディレクトリまで移動してinstallまたはupdateしていましたが、いざディレクトリを移動せずに指定のcomposer.jsonでinstall・updateする場合はどうするんだろうとハマりましたが`--working-dir=path/to` することで解決します。
Python3でMacにdlibをpipしてもimportでエラーを吐く時の対処方

#dlibのインストール方法
基本的にはこの記事を参考にすれば良いですが，python3でインストールする方法を書きました．
[Dlibの高性能な顔器官検出をMacでさくっと試す](https://qiita.com/naoyu822/items/7cce2f2dbad24931cc87)

boost
`$ brew install boost`
boost-python
`$ brew install boost-python --with-python3`
cmake
`$ brew install cmake`
`$ pip install dlib`

これでうまくいくと思いましたが，importする時に
以下の記事で紹介されているエラーが発生します．
[import dlib ImportError Symbol not found: _PyClass_Type]
(https://stackoverflow.com/questions/45923202/import-dlib-importerror-symbol-not-found-pyclass-type)

そのためFinderで移動=>フォルダへ移動でフォルダの場所を/usr/local/opt/boost-python/lib/にします．
あとはlibboost_python3-mt.dylibとかをlibboost_python-mt.dylibに書き換えれば終了です！

お疲れ様でした．
全ての特徴パターンを1セルの数値で表し，どの特徴が含まれているのか自動計算する

Excel2016で実験結果をまとめる時，countやifでは難しい壁に当たった．
![excel_func01.png](https://qiita-image-store.s3.amazonaws.com/0/201962/550a6991-8e7c-ca5c-48d6-00ac790fc980.png)
※データは適当
#やろうとした集計
1. 学習者が解いたのは，どんなタイプの問題が多いか（機能性，使用性など）
2. 学習者側は，どんなタイプの問題を解いたと思ってるのか

- 学習者はA～G
- 何か数値がある所（赤背景の3とか）は「学習者が解けた」
- その数値は「学習者はそれをどういう問題だと思ったか」

例えば学習者Aが解いた問題1（赤背景）は機能性に関するものだが，Aの主観では効率性だと思ってる．

もし学習者が「この問題は機能性と使用性に関わるだろう」と答えたら，1セルでは表現できなくなる．

かといって5番目の特徴に機能性＋使用性，6番目の特徴に機能性＋効率性，と始めたら，対応づけるのが辛い．

_これ以上判定だけのためにセルを増やしたくない_．いっそのこと全パターンを1セルの記号ないし数値で表して，計算すれば任意の特徴があるかどうかわかる，みたいなのが良い．

#特徴の全パターンを1つの数値で表す

2進法を利用した自作関数で解決した．
4種の特徴（機能性，使用性，効率性，信頼性）をそれぞれ2進法の各ビット1,2,4,8と対応付けて，特徴が2つ以上あるなら加算してしまう．
すると3は1+2（機能性＋使用性），12は4+8（効率性＋信頼性）だと一意に定まる．下表のような感じ．
![excel_func02b.png](https://qiita-image-store.s3.amazonaws.com/0/201962/50a0e681-51a0-655f-8e88-0be39cda6dbf.png)


また，12の中に4があるか知りたければ，「4の2倍の数で12を割った余り」が4以上かどうかでわかる．
実際に計算してみると，4と8だけある．即ち12=4+8で合ってる．計算できるということは関数で自動化できるということなのでハッピー．

```
12 mod (1 * 2) = 0  :ない
12 mod (2 * 2) = 0  :ない
12 mod (4 * 2) = 4  :4以上，ある
12 mod (8 * 2) = 12 :8以上，ある
```

Excel2016の自作関数は以下．「縦一列のセル範囲」「探したい数字」を指定すると，その数字が含まれているかどうか1セルずつ見ていく．最終的には「その数字が含まれるセルがいくつあったか」を吐き出す．

```
Function extSingle(target As Range, fig As Integer)
Dim i As Range
Dim sum As Integer
sum = 0
For Each i In target
    If (i.Value Mod (fig * 2)) >= fig Then
        sum = sum + 1
    End If
Next i
extSingle = sum
End Function
```
使用例：=extsingle(J3:J7,1)
※関数名は適当

結果
![excel_func02_extSingle.png](https://qiita-image-store.s3.amazonaws.com/0/201962/42a06083-79fc-f6b2-6eb8-3e9d7c14278a.png)
学習者Aが解いた問題は機能性と効率性，一方でAの主観は使用性に寄ってるかな？　みたいな傾向を出せる．

※学習者の主観の数値は変えてない．最初は赤背景の3を「効率性だけ」の意味だと書いたが，ここでは「機能性と使用性」に意味が変わる．もし効率性だけという意味にしたければ，この数値は4にすれば良い．


#今までの表現方法にも適用する
ついでに「機能性が1，使用性が0」みたいなベクトル表現もどきもやめてみた．こちらもセル範囲は縦一列．
「セル範囲1」「抽出したい数字」「セル範囲2」を指定すると，「セル範囲1のN番目から数字が抽出できる」＆「セル範囲2のN番目が0超過の数字」となるセルを数える．
これで，学習者は機能性に関する問題を何個解いたか，を表せる．

```
Function extDouble(target As Range, fig As Integer, compare As Range)
Dim i As Integer
sum = 0
For i = 1 To target.Count
    If (target(i).Value Mod (fig * 2) >= fig) And (compare(i).Value > 0) Then
        sum = sum + 1
    End If
Next i
extDouble = sum
End Function
```
使用例：=extdouble(H3:H7,1,J3:J7)

結果
![excel_func02_extDouble.png](https://qiita-image-store.s3.amazonaws.com/0/201962/abb17150-5fed-f0b2-9c4a-010ddd6f891a.png)
問題2の特徴6は2+4で，つまり使用性と効率性に関する問題だという表現になる．

#既出だと思ったが・・・

この手の方法は既出のはず・・・が，僕のググり力が足りなかったのかドンピシャなものは見つけられなかった．

2進法を使って大量のフラグを簡単に処理しよう，という記事はあった．僕が最初にやってたのと同じ（機能性が1，使用性が0みたいな）．プログラミングならむしろこっちだと思う．
>[ゲームのフラグ管理はビット演算で効率かつ簡単に管理する](http://lambdalisue.hatenablog.com/entry/2013/12/22/041347)
　　　　　　sleep palarysis poison excitation
player1_state = 0　　　0　　　0　　　0
このようにビットパターンの各桁を状態として定義しておくと、以下のように非常に簡単に状態を変更できます。

本稿の内容は，これをさらに「状態数が増えても1つの数値で表せる」＆「計算すればその中に任意の状態があるか否かわかる」に変えてみた，というところか．

この手法は多分，状態数が20も30もある場合には向かない．2のn乗で表せる整数しか使わないものの，21個目の特徴を1048576で表現するのには抵抗がある．

・・・31個でint型が限界・・・？
Laravel5.4 + TravisCI + Slackで自動テストを行う

# 概要
Laravel5.4で作ったアプリケーションをTravisCIで自動テストし、Slackへ通知を行う。

# TravisCI
- 継続的インテグレーションサービス。
- GithubのリポジトリへのPushに対して、自動でテストやビルドを実行してくれる。
- publicリポジトリは無料、privateリポジトリは有料です。
- サーバー不要！GithubアカウントさえあればOK！

## TravisCI登録
- [TravisCI](https://travis-ci.org/)から、Signupをクリック。
- Githubアカウントと連携する。
<img width="1027" alt="スクリーンショット 2017-09-20 20.57.09.png" src="https://qiita-image-store.s3.amazonaws.com/0/58712/d3fbc197-863b-572c-488e-14bbae69bf7d.png">

## TravisCI連携
- organizationに所属している場合は登録時に表示される、そこのリポジトリでCIしたい場合は連携しておく。
- しばらく待つとリポジトリ一覧が表示されるので、CIしたいリポジトリを選択！
- TravisCI側の設定は完了！

# Slack
## 通知用トークンの取得
- SlackのAppsからTravisCIをインストール。
- Settingで通知チャンネルを選択し、トークンを取得する。

# Laravel5.4
- 前提として、migrationとseederを利用してDBデータを作成しており、そのデータでテストを行うとします。
- リポジトリルートでphpunitを実行するとテスト動作する状態とします。

## テスト実行用の.env.testingファイルをリポジトリルートに作成
- TravisCI上でDBに接続するので、DB情報を記述しておく。
- USERNAMEはrootでパスワードは空、ポートもなしでいけます。

```text:.env.testing
DB_CONNECTION=mysql
DB_HOST=localhost
DB_PORT=
DB_DATABASE={データベース名}
DB_USERNAME=root
DB_PASSWORD=
```

## TravisCI用設定ファイルを作成する
- リポジトリのルートにTravisCI用のファイルを作成する。

```yaml:.travis.yml
language: php
php:
 - 7.1
services:
 - mysql
before_script:
 - mysql -uroot -e "create database {データベース名}"
script:
 - cp .env.testing .env
 - composer install
 - php artisan migrate --seed
 - phpunit
notifications:
 slack: {Slackで取得したトークンを記述する}
```
`language` : プログラム言語、そのまま。
`php` : 言語で設定したphpのバージョンを指定、今回は7.1を利用しています。
`services` : DBなど利用するミドルウェアを記述する。
`before_script` : scriptの前に実行される処理、今回はDBを利用するのでテーブルを作成しておきます。
`script` : ここにテストなど自動実行するコマンドを記述する。migration実行時に.envファイルがないとDB情報を取得できないので、.envをtestingからコピーして作成しておきます。

# 動作させてみる。
- あとはpushに反応して自動でymlの内容を実行してくれるので、適当にpushしてみる！

# 結果
- 終わったらSlackに通知が来る！
- Github上のPRにもTravisCIの結果が連携されるので、PRのテスト結果も一目瞭然です！

<img width="593" alt="スクリーンショット 2017-09-20 21.20.03.png" src="https://qiita-image-store.s3.amazonaws.com/0/58712/735daab0-cc98-bef8-47fe-23fb343837a1.png">
Arch Linux と Windows 10 でデュアルブート(防備録)


Windows 10 と Arch Linux でデュアルブートする。
UEFI環境。
myhostnameやmyusernameなどは適宜読み替えてください。

# インストール
## 準備
### Live環境に入る
[公式サイト](https://www.archlinuxjp.org)から最新のイメージをダウンロードし、USBメモリなどに焼き、
ArchISOを起動。
インターネット接続を確認。可能なら有線LANを。  

```:Zsh
ping archlinuxjp.org
```

### キーボードレイアウトを設定

```:Zsh
loadkeys jp106
```

### インストール先のパーティションを確認
インストール先を /dev/sdaX、EFIパーティションを /dev/sdaE とします。

```:Zsh
fdisk -l
```

### パーティションをフォーマット

```:Zsh
mkfs.ext4 /dev/sdaX
```

### マウント

```:Zsh
mount /dev/sdaX /mnt
mkdir /mnt/boot
mount /dev/sdaE /mnt/boot
```

### システムクロックを更新

```:Zsh
timedatectl set-ntp true
```

## インストールと設定
### ベースシステムをインストール
時間がかかります。

```:Zsh
pacstrap /mnt base base-devel
```

### fstab を生成

```:Zsh
genfstab -U /mnt >> /mnt/etc/fstab
```

### chroot

```:Zsh
arch-chroot /mnt
```

### タイムゾーンとロケールを設定

```:Zsh
pacman -S vim　　　　　　　　　　　　　　//好きなエディタをインストール
vim /etc/locale.gen  　　　　　　　　　　//en_US.UTF-8 UTF-8, ja_JP.UTF-8 UTF-8 をアンコメント
locale-gen
echo LANG=en_US.UTF-8 > /etc/locale.conf
echo KEYMAP=jp106 > /etc/vconsole.conf
```

### ホストネームを設定

```:Zsh
echo myhostname > /etc/hostname
vim /etc/hosts
```

```:/etc/hosts
127.0.0.1	localhost.localdomain	localhost
::1	        localhost.localdomain	localhost
127.0.1.1	myhostname.localdomain	myhostname
```

### パスワードを設定

```:Zsh
passwd
```

# 初期設定

### ユーザを追加
```:Zsh
useradd myusername
chown -R myusername:users /home/myusername
chmod o+rx /home/myusername
```

### sudo をインストール
```:Zsh
pacman -S sudo
visudo
```
以下を追記

```:visudo
myusername     ALL=(ALL)ALL
```

### grubの設定
grubをインストール

```:Zsh
pacman -S grub efibootmgr
grub-install --target=x86_64-efi --efi-directory=/boot --bootloader-id=grub
grub-mkconfig -o /boot/grub/grub.cfg
```

### GDM と Gnome をインストール

```:Zsh
pacman -S gnome gdm
systemctl enable gdm.service
```

---
再起動し、インストールした Arch Linux に入る。
GUIが使えるはず。
さっき作成したユーザでログイン。

### ネットに接続できないとき
下記を実行して再起動する

```:Zsh
systemctl enable NetworkManager.service
```

### fcitx と fcitx-mozc をインストール
```:Zsh
$ sudo pacman -S fcitx fcitx-im fcitx-mozc fcitx-configtool
```

fcitxが動かないとき

```:Zsh
$ vim .xprofile
```

```:.xprofile
export GTK_IM_MODULE=fcitx
export QT_IM_MODULE=fcitx
export XMODIFIERS="@im=fcitx"
```

設定

```:Zsh
$ fcitx-configtool                               //fcitx設定
$ /usr/lib/mozc/mozc_tool -mode=config_dialog    //mozc設定
```


# 参考
ArchWiki - https://wiki.archlinuxjp.org


# Changelog
2017/10/26 - "grubの設定"を修正 (gnome -> grub)
2017/10/13 - "grubの設定"を追加
2017/09/21 - 軽微な修正
2017/09/20 - 投稿
Kantu for Chrome (Chrome版SeleniumIDEっぽいもの)はどんなものか調査してみた

# はじめに
- [公式ブログ](https://seleniumhq.wordpress.com/2017/08/09/firefox-55-and-selenium-ide/)でもあるように最新のFirefoxでSeleniumIDEが利用できなくなっています
  - Selenium IDEの起動自体は上手くいきますが、テストファイルの読み込みやテストの記録/作成など何もできません
  - 対処法としてはFirefox ESR版の入手かブラウザバージョンを下げるかの2択です
- @hiroshitoda さんの[2016 Seleniumゆく年くる年](https://www.slideshare.net/hiroshitoda39/2016-selenium-4-selenium-70244281)でもありましたが、このままだとFirefox57からSeleniumIDEが使えなくなります
  - そこで同じようなことができるツール Kantu for Chrome で何がどこまでできるのか調査してみようと思いました

# Kantu for Chromeとは
- [Kantu Browser Automation for Chrome](https://a9t9.com/kantu/web-automation/chrome)
- 馴染みの深いSeleniumIDE(Firefox のアドオン)のChrome版のようなもの
- インストールは[こちら](https://chrome.google.com/webstore/detail/kantu-browser-automation/gcbalfbdmfieckjlnblleoemohcganoc)

# 今回検証すること
- Selenium IDEと比べて
  - 同じような機能があるのか？
  - 使えるコマンドは？
  - 実際使ってみてどうだった？

# Selenium IDEと同じような機能があるのか？

### テストスイート/テストケースのインポート
- SeleniumIDEではあったテストスイート/テストケースの扱いはなく、インポート/エクスポート共にテストケースのみ
<img width="509" alt="スクリーンショット 2017-08-31 9.19.26.png" src="https://qiita-image-store.s3.amazonaws.com/0/19778/11c1107d-d809-96ea-5297-cbd380c3b537.png">

### テストの記録/再生
- SeleniumIDEと同様にテストの自動記録ができます
  - [日本Seleniumユーザーコミュニティのテスト用サイト](http://www.selenium.jp/test-site)を開き、 http://example.selenium.jp/reserveApp/ のクリックはできたが、 **別タブで開いたページでは記録がされない**

# 使えるコマンドは？
- [Kantu for Chrome Welcome!](https://a9t9.com/kantu/web-automation/chrome/welcome)には以下のように書いてありました
  - SeleniumIDEと同様にSeleneseコマンドをサポートしている
  - まだLight版なのでSeleniumIDEのようにコマンドが充実しているわけではないが、これから徐々にSeleniumIDE相当に開発が進んでいく可能性がある
      - 1ヶ月ほど前に記事を書き始めましたが、その頃はなかったコマンドが 2017/09/20 現在いくつか追加されていました => 開発が進んでいる感じですね^^     
- `getEval` のようなjavascript系の操作はできなさそう 

### コマンド一覧
SeleniumIDEで馴染みのあるコマンドがほとんどでした

- click
- clickAndWait
- open
- pause
- type
- select
- selectAndWait
- selectFrame
- assertAlert
- assertConfirmation
- assertPrompt
- waitForPageToLoad
- answerOnNextPrompt

# 実際使ってみてどうだった？
- 単純な操作をするには利用できそうだが、書いていて今一歩と感じるシチュエーションは結構ありそう
- `store` による変数の扱いや `getEval` などのjavascript系の操作もできないためできることは限定される
  - SelBlocksのようなif/forなどの条件分岐を導入することはできなさそう
- [公式](https://a9t9.com/kantu/web-automation/chrome/welcome)にも `Need a specific feature added? => Let us know! We can only add features and fix bugs that are reported to us.` とあるのでこれからに期待できるのでは！

# 個人的には・・・
- selenium-webdriverを利用するには以下のような開発環境の構築が必要なります
  - ブラウザのインストール
  - (必要に応じて)ドライバインストール
  - テストコードの作成
  - テストを動かすための設定ファイルなどの作成
- そのため、自動テストを組むならSeleniumIDEがお手軽という点では一番かもしれません
- ただ、kantu for Chromeの使い心地を考えると、今はdockerを利用すればその少々面倒な手間もかからないのでdockerでいいのでは！と思いました
  - 公式にもイメージがありますし、以下のように自分でDockerfileを作ってみたり
  - Ex) https://github.com/RustyNail/docker-selenium
    - ブラウザ/ドライバのインストールもされているため、DLして `docker-compose up` するとすぐに動きます
GoogleカレンダーCSVファイルで複数予定インポート

Googleカレンダーへの予定追加が、
CSVファイルで複数件一括追加できることを最近知りました。
周りでも知らなかったという人がいたので共有したいと思います。

ドキュメント
https://support.google.com/calendar/answer/37118?hl=ja

CSVファイル例(終日の予定)
※CSVファイルはUTF-8で保存しないと文字化けするので要注意。

```
Subject,Start Date,All Day Event
CSVファイルからのテスト登録1,09/16/2017,TRUE
CSVファイルからのテスト登録2,09/17/2017,TRUE
```

追加方法
　1.歯車マーク
　2.設定
　3.カレンダータブ
　4.カレンダーをインポート
　5.ファイル：CSVファイルを指定
　6.インポート
　7.完了画面

1.歯車マーク
![2017-09-14_15h49_41.png](https://qiita-image-store.s3.amazonaws.com/0/200585/48f6a871-7ba6-8fd8-62f6-60c839cb1cbd.png)
2.設定
![2017-09-14_15h49_45.png](https://qiita-image-store.s3.amazonaws.com/0/200585/558a3670-cc52-86d4-446c-847ee80efad8.png)
3.カレンダータブ
4.カレンダーをインポート
![2017-09-14_15h49_58.png](https://qiita-image-store.s3.amazonaws.com/0/200585/567dd084-ffb2-543b-a3e2-700111a7ac4f.png)
5.ファイル：CSVファイルを指定
6.インポート
![2017-09-14_15h50_12.png](https://qiita-image-store.s3.amazonaws.com/0/200585/f96a21ea-65e0-a509-d815-ac75fc9e9c43.png)
7.完了画面
![2017-09-14_15h50_21.png](https://qiita-image-store.s3.amazonaws.com/0/200585/4e6ae938-a512-6c56-0b3e-f25389479330.png)
以下のように追加されます。
![2017-09-14_15h50_46.png](https://qiita-image-store.s3.amazonaws.com/0/200585/29d53297-625d-7714-c74b-79f830b2eb4b.png)

利用例：
・Excelで管理しているシフト表からCSVファイルを作成しGoogleカレンダーにインポート
　※文字コード要注意

以上です。
iOS 11でWeb Appが強化されたけど、またしてもメタタグがおかしい

# Safari 11 でWeb Appが強化された

> * Updated WebKit support for home screen apps.
>   * Web applications saved to the home screen now support all features of modern WebKit, such as Fast-Tap, scroll snapping and the new visual viewports behavior.

https://developer.apple.com/library/content/releasenotes/General/WhatsNewInSafari/Safari_11_0/Safari_11_0.html

ということで、Safariでは使えていたがホーム画面に追加すると動作しなくなっていた項目が動くようになり、Web Appの使い勝手が若干よくなった。
特に300msのクリック遅延問題が解決されたのは嬉しい。

しかし、またしても他の問題が出てしまっている。

# ステータスバーの制御

メタタグに以下を追加することによって、ホーム画面から起動したときにURLバーなどを非表示にして、ネイティブアプリのように見せかけることができる。

```html
<meta name="apple-mobile-web-app-capable" content="yes">
```

さらに以下を追加することで、見た目を変えられる。

```html
<meta name="apple-mobile-web-app-status-bar-style" content="black">
```

![screenshot.png](https://qiita-image-store.s3.amazonaws.com/0/17664/4a29d089-79aa-9207-19fd-b0117b277a17.png)

このcontent=black-translucentの時は、上画像のように top: 0px; が画面端にきていたが、iOS 11ではステータスバーの高さが加わった状態になる。
そのため、ステータスバーの文字色が白かつ、背景色も白なので真っ白の余白が出来てしまう。

この余白、最近どっかで見た… と思い、以下のタグを追加すると想定通りの動きになった。

```html
<meta name="viewport" content="width=device-width, initial-scale=1.0, viewport-fit=cover">
```

おそらく、iPhone Xの登場でSafariのレンダリング領域の概念が改められたのだと考えられる。
そのためviewport-fit=coverを追加することで、レンダリング領域を最大限まで広げられる。

> [iPhone XのSafariで表示される謎の空白を消す方法 - Qiita](https://qiita.com/hin0deya_p0n1/items/2b8cc28f176e202976b7)

**しかし、これを追加すると今度はbottomにステータスバー分の高さの謎の余白が出る。**

CSSでposition: fixed; bottom: 0;にしても、謎の余白がなくならないのでviewportの高さ計算にバグがあるような気がする。
現状これを修正する方法は見つけられていないので、content="black"かcontent="default"を使うのが良さそう。

## 安定しないiOSのWeb App機能

> [iOS 9のMobile Safariで消えた2つの機能](https://qiita.com/ikkou/items/f494347c890c9039fdce)

この記事にもあるように、Web Appの制御メタタグはiOSのメジャーバージョンアップのたびに不具合で挙動が変わっており、全く安定していない。

> [Supported Meta Tags](https://developer.apple.com/library/content/documentation/AppleApplications/Reference/SafariHTMLRef/Articles/MetaTags.html)

Safari HTML Referenceも数年前から更新されていないので、毎回手探りで挙動を確認しなくてはならないのがとてもつらい。
AWSにEC2を作成した際に行う設定メモ

EC2インスタンスを作成した後、いつも調べたりするので忘れないようにメモ

## ユーザの追加
インスタンス作成時は`ec2-user`のみ作成されているため、別途ユーザを作成する

```.sh
$ sudo adduser new_user
$ sudo passwd new_user
# パスワードを入力
# パスワードを再入力（確認）
$ sudo visudo
```

sudo の権限を追加

```
## Same thing without a password
# %wheel        ALL=(ALL)       NOPASSWD: ALL
new_user        ALL=(ALL)       NOPASSWD: ALL
```

sshでログイン出来るようにする

```.sh
$ su - new_user
# パスワードを入力
$ mkdir .ssh
$ chmod 700 .ssh
$ cd .ssh
$ touch authorized_keys
$ chmod 600 authorized_keys
$ vim authorized_keys
# パブリックキーを追記して保存
$ exit
$ exit
```
`ssh new_user@xxx.xxx.xxx.xxx`でログイン出来るか確認

## タイムゾーンの設定
日本時間に設定する。

```.sh
$ date
Wed Sep 13 02:43:10 UTC 2017                                 # UTCになっている
$ strings /etc/localtime
TZif2
TZif2
UTC0
$ sudo cp -p /etc/localtime /etc/localtime.org               # バックアップ
$ sudo ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime  # シンボリックリンクをはる
$ data
Wed Sep 13 11:44:45 JST 2017                                 # JSTになった
$ sudo cp -p /etc/sysconfig/clock /etc/sysconfig/clock.org   # バックアップ
$ sudo vi /etc/sysconfig/clock                               # 再起動した場合UTCに戻らないようにする
```
`ZONE`と`UTC`を編集して保存

```
ZONE="Asia/Tokyo"
UTC=false
```

## パッケージのインストール
`java8`の例

```
$ java -version                                                       # javaのバージョン確認
java version "1.7.0_151"
OpenJDK Runtime Environment (amzn-2.6.11.0.74.amzn1-x86_64 u151-b00)
OpenJDK 64-Bit Server VM (build 24.151-b00, mixed mode)
$ sudo yum list available | grep java-1.8                             # 利用可能なパッケージを確認
$ sudo yum install java-1.8.0-openjdk.x86_64
$ sudo alternatives --config java
$ java -version
openjdk version "1.8.0_141"
OpenJDK Runtime Environment (build 1.8.0_141-b16)
OpenJDK 64-Bit Server VM (build 25.141-b16, mixed mode)
```
word2vecの追加学習でエラーが出たのでメモ

自然言語処理系の研究室所属になった新人のメモです．

#[修正] おまけ部分の記述について (2018/08/02)
最新のgensimでは追加学習で新規語彙を学習できるそうです．
ご指摘ありがとうございます．

# word2vecの追加学習
素性を作る際にword2vecを使うことになって，頂いたモデルに追加で学習が必要になりました．
普通に分かち書きしたテキストを以下のようにすれば追加学習できると思っていたのですが

```
model.train(wakati_list)
```

以下のようなエラー

```
ValueError: You must specify either total_examples or total_words, for proper alpha and progress calculations. The usual value is total_examples=model.corpus_count.
```

# 解決策
どうも新しいバージョンでは*total_examples*と*epochs*をちゃんと指定しないといけないようでした．

ですので，コードを以下のように修正

```
model.train(sentences, total_examples = sum([len(wakati) for wakati in wakati_list]), epochs = model.iter)
```

# おまけ
~~追加学習した際に新しい単語が入っていたとしてもその単語のベクトルが新しく登録されることはないらしい...気をつけねば．~~　
最新のgensimでは追加学習で新規語彙を学習できるそうです．
自分の事例において新規語彙が登録されない理由は「model作成時のmin_countパラメータに引っかかっている」あるいは「新規学習データsentenceがリストになっていない」とのことです．
(コメント欄参照)

# 参考文献
[Gensim word2vec training error on tweets](https://datascience.stackexchange.com/questions/18442/gensim-word2vec-training-error-on-tweets)
[gensimとword2vec](http://blog.daionet.gr.jp/knok/2015/04/22/gensim-word2vec/)
Windows 10 > 症状: デスクトップ上のファイルやフォルダが消える

```txt:動作環境
Windows 10 Pro (64bit) Creators Update適用済
```

Windows 10のPCにおいて、デスクトップ上に置いていたファイルが消える症状に3回遭遇している。

- 全部のファイルが消えるのではなく、一部のファイルが消える
- ケース1: フォルダに入っている.exeファイルがフォルダごと消えた
- ケース2: .exeファイル1つ、ショートカットが1つ消えた
- ケース3: .exeファイルが2つ消えた

https://answers.microsoft.com/en-us/windows/forum/windows_10-files/desktop-files-disappearing-on-windows-10/d6466ad4-cc2e-436c-bb8b-1c18c952c312?auth=1

消えた時点で確認したが、ごみ箱に入ってはいない。

### 対応

以下を行った。

1. コントロール パネル > すべてのコントロール パネル項目 > トラブルシューティング
において
「設定の変更」を選択
2. 「コンピューター保守」を「無効」にした

しばらく様子見をすることになる。

### 関連

[Windows 7のトラブルシューティング設定の変更について](https://answers.microsoft.com/ja-jp/windows/forum/windows_7-performance/windows/253ebb33-46aa-484d-908e-45ab45147021?auth=1)
オフラインリアルタイムどう書くF06の問題をrubyで解く

問題はこちら
http://nabetani.sakura.ne.jp/hena/ordf06numit/

```rb
def tree(ns,n,t)
  return 0 if n < t
  return 1 if n == t
  return ns[n] if ns[n] > 0
  nl = n/2-10
  nr = n*2/3
  ns[n] = tree(ns,nl,t) + tree(ns,nr,t)
end

def solve(q)
  root,target = q.split(',').map(&:to_i)
  ns = Hash.new(0)
  tree(ns,root,target)
end

DATA.readlines.each do |line|
  no,q,a = line.strip.split(/\s+/)
  ans = solve(q)
  print no + "\t" + ans.to_s
  puts ans == a.to_i ? ' o' : ' x'
end
__END__
0	123,4	5	
1	1,1	1	
2	2,1	1	
3	3,3	1	
4	19,5	1	
5	69,5	3	
6	88,9	2	
7	1,100	0	
8	100,4	4	
9	101,9	0	
10	456,7	7	
11	567,8	12	
12	756,10	10	
13	789,10	12	
14	896,29	2	
15	7764,6	664	
16	1234,56	3	
17	8563,29	35	
18	12345,67	10	
19	72927,51	263	
20	71441,145	22	
21	123456,78	397	
22	123456,789	1	
23	592741,216	55	
24	913826,584	81	
25	1234567,89	2293	
26	10000000,1	19383507	
27	12345678,9	3567354	
28	6215879,358	2907	
29	12345678,90	79419	
30	5745432,1032	1287	```
[Logstash]inputしたログファイルのタイムスタンプをstring型からdate型に変換

# 課題

Logstashでログファイル(sendmailのmaillog)をElasticsearchに放り込んだところ、
タイムスタンプのフィールドをdate型で認識してくれない。

# 解決

いろいろ調べた結果、明示的に「タイムスタンプフィールドを`string`型から`date`型に変換する」処置が必要らしい。

今回利用した`logstash.conf`は以下。

```logstash.conf
input {
    file {
        path => "/data/log/maillog*"
        start_position => "beginning"
        type => "sendmail"
    }
}

filter {
  grok {
    patterns_dir => ["/usr/share/logstash/pipeline/patterns"]
    match => { "message" => "%{SYSLOGBASE} %{SENDMAIL}" }
    overwrite => [ "message" ]
  }
  date {
    match => ["timestamp", "MMM  d HH:mm:ss", "MMM dd HH:mm:ss"]
    target => "timestamp"
  }
}


output {
    if [type] == "sendmail" {
        elasticsearch {
            index => "logstash_sendmail-%{+YYYY.MM.dd}"
            hosts => "elasticsearch:9200"
        }
    } else {
        elasticsearch {
            hosts => "elasticsearch:9200"
        }
    }
}
```

以下、dateフィルタについて抜粋。

```logstash.conf
... snip ...
  date {
    match => ["timestamp", "MMM  d HH:mm:ss", "MMM dd HH:mm:ss"]
    target => "timestamp"
  }
... snip ...
```

## match
**`match => [ "フィールド名", "タイムスタンプ形式1", "タイムスタンプ形式2", ... ]`**
フィールド内のデータがタイムスタンプ形式にマッチした場合、マッチしたデータをdate型として認識する。
上のconfの場合、string型の`timestamp`フィールドを、date型として認識させている。

## target
**`target => "フィールド名"`**
上の`match`で認識したdate型のデータを、`target`で指定するフィールドに放り込む。
上のconfの場合、`target`に`timestamp`を指定することで、`timestamp`(string型)を`timestamp`(date型)で上書きしている。[^注釈]

以上。

# 参考
https://github.com/tykling/logstash-grok-patterns/blob/master/patterns/sendmail/sendmail.grok

[^注釈]: `target => "logtimestamp"`等とした場合、string型の`timestamp`フィールドは保持され、新たにdate型の`logtimestamp`フィールドが生成される。
AWS Lambdaをlocal環境で実行できるaws-sam-localを試してみる


# インストール

npmでインストールすることができます

```
$ npm install -g aws-sam-local
```

# プロジェクト作成

適当なディレクトリを作成しSAMの[公式プロジェクトのサンプル](https://github.com/awslabs/serverless-application-model/tree/master/examples/2016-10-31/hello_world)を参考に
index.jsとtemplate.yml を作成していきます

```yaml:template.yml
AWSTemplateFormatVersion : '2017-09-20'

Description: A hello world application.

Resources:
  HelloWorld:
    Type: AWS::Serverless::Function
    Properties:
      Handler: index.handler
      Runtime: nodejs6.10
```

```js:index.js
'use strict';
console.log('Loading function');

exports.handler = (event, context, callback) => {
    callback(null, 'Hello World!');
};

```

# 実行

index.jsとtemplate.ymlが作成できたら実行してみます

※事前にDockerを起動しておく必要があります

```
$ echo '{}' | sam local invoke HelloWorld
2017/09/20 18:39:12 Successfully parsed template.yaml
2017/09/20 18:39:12 Connected to Docker 1.30
2017/09/20 18:39:12 Fetching lambci/lambda:nodejs6.10 image for nodejs6.10 runtime...
nodejs6.10: Pulling from lambci/lambda
Digest: sha256:b9a57b98dcfe226cac3fb0b8329594eefb62ba7089fa27cf8ac968e5736cc04a
Status: Image is up to date for lambci/lambda:nodejs6.10
2017/09/20 18:39:15 Reading invoke payload from stdin (you can also pass it from file with --event)
2017/09/20 18:39:15 Invoking index.handler (nodejs6.10)
START RequestId: feb31e2a-3748-1152-e1c1-85725b4021a7 Version: $LATEST
2017-09-20T09:39:16.722Z	feb31e2a-3748-1152-e1c1-85725b4021a7	Loading function
END RequestId: feb31e2a-3748-1152-e1c1-85725b4021a7
REPORT RequestId: feb31e2a-3748-1152-e1c1-85725b4021a7	Duration: 9.66 ms	Billed Duration: 0 ms	Memory Size: 0 MB	Max Memory Used: 29 MB

"Hello World!"


```

1回目の実行のときは Docker イメージの DLを行ってから実行されます
webpackerでdigest値を付けずにコンパイルする


webpackerを用いてjsの管理をしているRailsのアプリケーションを開発していて、アプリの外から参照されるjsファイルとアプリ内で使うjsファイルがあるため、

- アプリ内で使うファイル: digest値を付ける
- アプリ外から参照されるファイル: digest値を付けない

ということをwebpackerで実現してみました。
ちなみに、同様のことをsprocketsで行う場合は独自にrakeタスク作ったり `assets:precompile` で通るコードにモンキーパッチ当てたり[gem](https://github.com/alexspeller/non-stupid-digest-assets)を使ったり等の方法があります。

## バージョン

Rails: 5.1.0
webpacker: 3.0.1

## ファイル構成

```
app/javascript/
└── packs
    ├── inside1.js
    ├── inside2.js
    └── outside.js
```

今回、 app/javascript/packs 配下にwebpackで管理したいjsのファイルを置き、inside1.js, inside2.jsはdigest値ありで、outside.jsはdigest値無しで出力するという形にしていきたいと思います。

## 方針

方針として、 `bundle exec rails webpacker:install` で生成されるコードをなるべく変更しない形でやっていきます。
上記のコマンドを実行すると、 config/webpack/development.js には以下のようなコードが生成されます。

```config/webpack/development.js
const environment = require('./environment')

module.exports = environment.toWebpackConfig()
```

この `environment.toWebpackConfig()` は https://github.com/rails/webpacker/blob/fb8dd8c09ccc9d93ef3e084838e6e0f0683aaeb0/package/environment.js#L68 が呼び出されています。ここで定義されている設定を必要なところだけ上書きしていきます。

## コード

```config/webpack/development.js
const environment = require('./environment');

const defaultConfig = environment.toWebpackConfig();
var entries = defaultConfig.entry;
var outsideEntry = {outside: entries['outside']};
delete entries['outside'];

var nonDigestFileConf = {
  entry: outsideEntry,
  output: {
    filename: 'outside.js',
    path: defaultConfig.output.path,
    publicPath: defaultConfig.output.publicPath
  },
  plugins: []
};

module.exports = [
  Object.assign({}, defaultConfig, {
    entry: entries
  }),
  Object.assign({}, defaultConfig, nonDigestFileConf)
];
```
(production環境の場合は config/webpack/production.js に書きます)

module.exportsに配列で設定を書き込めば順番に実行してくれるので、2回に分けてコンパイルを実行しています。

最初にdigest値を付けるファイルの扱いです。 `environment.toWebpackConfig().entry` でコンパイルされる対象のファイルの名前（拡張子無し）とそのファイルパスのhashが取得できるので、そこからdigest値を付けたくないファイルのkeyを抜きます。最後に抜いた後の `entry` を元の設定に上書きしてあげれば、必要なファイルだけdigest値を付けることが出来ます。

digest値を付けない設定は `nonDigestFileConf` にありますが、 `entry` に対象のファイルを指定して `output.filename` にファイル名を `output.path` は出力先のパス `output.publicPath` は参照する際のパスですが、 `environment.toWebpackConfig()` が持ってるのでそれを指定します。 
`plugins` は `webpack.EnvironmentPlugin` , `ExtractTextPlugin` , `ManifestPlugin` の3つの設定がされてますが、どれも使っていなかったので空配列にしています。必要に応じて変える必要があると思いますが `ManifestPlugin` は外すなり何かしら手を加えないと既に生成された manifest.json を上書きしてしまいアプリ内で使ってる `javascript_pack_tag` が軒並みエラーになるので注意です。
オフラインリアルタイムどう書くF06の問題


オフラインでリアルタイムに「どう書く」をやるイベント( https://yhpg.doorkeeper.jp/events/64799 )を行っています。

問題は「ツリーの中の数」という名前で、詳細は
http://nabetani.sakura.ne.jp/hena/ordf06numit/
です。

出題者の気分としては、問題を読み始めてから解けるまで30分あればなんとかなると思ってますが、ひとそれぞれで。

実装ができた方はこちらのコメント欄からリンクを張っていただくと見つけやすくて助かります。

似たような問題をもっと解きたいという方は、
https://nabetani.hatenadiary.com/entry/yhpg_list
に過去問リンク集がありますので、そちらをご覧になると良いと思います。
Moshi〜Json変換ライブラリ〜

javaでjsonを扱うことがあったので、ライブラリを探していたら教えてもらいましたので、使い方を:sunglasses:

# Moshiとは
[GitHub](https://github.com/square/moshi)
squareさんがGitHubに公開しているライブラリです

JSONをクラスにparseしてくれたり、逆にクラスをJSONにserializeしてくれます
使い方も簡単です。

# Usage

## Gradle

```java
compile 'com.squareup.moshi:moshi:1.5.0'
```

を追加するだけです

## Parse

parseするクラスを作成します

```java

class PersonList {
    Map<String, Person> list;
}

class Person {
    int age;
    Sex sex;
}

enum Sex {
    MAN,
    WOMAN
}
```

parseする部分はこちら

```java
String json = "xxxxxxx";

Moshi moshi = new Moshi.Builder().build();
JsonAdapter<PersonList> jsonAdapter = moshi.adapter(PersonList.class);

try {
    PersonList personList = jsonAdapter.fromJson(json);
} catch (Exception e) {
    Log.e("json parse error", "parsePersonList: ", e);
}
```

これだけです（笑）

## Serialize

serializeする部分はこちら

```java
PersonList list = /* 作成 */

Moshi moshi = new Moshi.Builder().build();
JsonAdapter<PersonList> jsonAdapter = moshi.adapter(PersonList.class);

try {
   String json = jsonAdapter.toJson(list);
} catch (Exception e) {
    Log.e("json serialize error", "serializePersonList: ", e);
}
```

ほとんど一緒ですが、 `fromJson()`と`toJson()`が変わってます

## Caution

注意点として、使用できるクラスが限られるということです
`ArrayList`・`HashMap`等は使用できませんので、`List`・`Map`を使用しましょう

> ・Primitives (int, float, char...) and their boxed counterparts (Integer, Float, Character...).
・Arrays, Collections, Lists, Sets, and Maps
・Strings
・Enums

## CustomAdapter

```java
class PersonAdapter {
    @ToJson String toJson(Person person) {
      return String.valueOf(person.age) + sex.suit.name().substring(0, 1);
    }

    @FromJson Person fromJson(String json) {
        return // Stringを解析してPersonクラス作成
    }
}
```

String解析するところを省きましたすみません:sob:

ついでにもうひとつ

```java
class ForthPerson {
    int forthAge;
    Sex sex;
}
```

このような一般人の4倍の年齢の人のクラスがあった場合（笑）、parseの時に変換することができます

```java
class ForthPersonAdapter {
  @FromJson ForthPerson fromJson(Person person) {
    ForthPerson forthPerson = new ForthPerson();
    forthPerson.age = person.age * 4;
    forthPerson.sex = person.sex;
    return forthPerson;
  }

  @ToJson Person toJson(ForthPerson forthPerson) {
    Person person = new Person();
    person.age = forthPerson.age / 4;
    person.sex = forthPerson.sex;
    return person;
  }
}
```

```java
Moshi moshi = new Moshi.builder()
        .add(new ForthPersonAdapter())
        .build();
```

これで使えます！

## Get List

クラスの配列も取得することができます

```java
String json = "xxxxxxx";

Type type = Types.newParameterizedType(List.class, Person.class);
JsonAdapter<List<Person>> adapter = moshi.adapter(type);
List<Person> people = adapter.fromJson(json);
```

`people`に`Person`クラスの配列が取得できます
function文と関数リテラルの違いの簡単メモ

#関数定義（function文）
定義してから実行できる。

```javascript:hoge.js
function hoge(){
  console.log('ほげ')
}

hoge(); 
// "ほげ"
```
コード順関係なく先に実行させることもできる。

```javascript:hoge.js
hoge(); 
// "ほげ"

function hoge(){
  console.log('ほげ')
}
```

#関数リテラル（無名関数の代入）
関数を作ってから実行できる。

```javascript:hoge.js
var hoge = function (){
  console.log('ほげ')
};

hoge(); 
// "ほげ"
```
先に実行すると怒られる。

```javascript:hoge.js
hoge(); 
// hoge is not a function

var hoge = function (){
  console.log('ほげ')
};
```

function文はプログラムの最初に宣言されたものとみなされる。ホイスティング（巻き上げ）というらしい。
関数リテラルは、ホイスティングされず実行コンテキスト中に動的に定義される。
また、function文ではセミコロン(;)は不要で、関数リテラルは式だからセミコロン(;)があるという違いも気をつけよう。
縞々模様を均等に作成

計算が苦手で全然スマートじゃないけど、やりたい事が出来たからメモ・・・

縞模様のオブジェクト　シェイプレイヤーのYの大きさとリピーターのコピー数をベースに均等に配置する感じです。

```js
x=value[0];
y=thisComp.height/(content("リピーター 1").copies-1)-(content("長方形パス 1").size[1]/(content("リピーター 1").copies-1));
[x,y]
```

![キャプチャ.JPG](https://qiita-image-store.s3.amazonaws.com/0/178061/eac1a949-e13f-1575-7edb-10dc501e9b43.jpeg)