OmniAICreator/Qiita-1.07M huggingface dataset:
php7.1以降のfuelphp1.8 でDBからmigrationファイル生成

現在
PHP:7.1.1
fuelphp:1.8
で開発中

後付で自動化とか諸々を目論んでいる中、DBからmigrationファイルを作りたくなったので当然できるよなという考えの元に色々調べたらできるらしいことがわかった。

下記で本来ならできるはず

```
$ php oil r fromdb:model (テーブル名)
```

え、別にmodelいらないとおもったが、model部分をmigrationにすればmigrationファイルだけ生成できる。

```
$ php oil r fromdb:migration (テーブル名)
```

はずだったが、うわさではPHP7.1からの仕様変更により文字列と数字を合算したりするとエラーが出るらしい。
わ〜い、当たり前。

```
$ php oil r fromdb:migration (テーブル名)
Uncaught exception Fuel\Core\PhpErrorException: A non-numeric value encountered
Callstack: 
#0 /fuel/core/bootstrap.php(103): Fuel\Core\Errorhandler::error_handler(2, 'A non-numeric v...', '/Applications/M...', 1790)
#1 /fuel/packages/oil/classes/generate.php(1790): {closure}(2, 'A non-numeric v...', '/Applications/M...', 1790, Array)
#2 /fuel/packages/oil/classes/generate.php(1177): Oil\Generate::_find_migration_number()
#3 /fuel/packages/oil/classes/generate.php(747): Oil\Generate::migration(Array, false)
#4 [internal function]: Oil\Generate::model(Array)
#5 /fuel/packages/oil/tasks/fromdb.php(155): call_user_func('Oil\\Generate::m...', Array)
#6 /fuel/core/base56.php(37): Fuel\Tasks\Fromdb::model(Array)
#7 /fuel/packages/oil/classes/refine.php(108): call_fuel_func_array(Array, Array)
#8 [internal function]: Oil\Refine::run('\\Fuel\\Tasks\\Fro...', Array)
#9 /fuel/packages/oil/classes/command.php(126): call_user_func('Oil\\Refine::run', 'fromdb:model', Array)
#10 /oil(68): Oil\Command::init(Array)
#11 {main}

```

というわけでfuelphpの中身を軽く修正。
`/fuel/packages/oil/classes/generate.php(1790)`こいつが怪しいので該当箇所を見る。

```
return str_pad($last + 1, 3, '0', STR_PAD_LEFT);
```

上記を

```
return str_pad((int)$last + 1, 3, '0', STR_PAD_LEFT);
```

こうして動かしてみた。


```
$ oil r fromdb:migration (テーブル名)
        Creating migration: /fuelphp/fuel/app/migrations/001_table_name.php
```

できた〜。

応急処置が過ぎるので正式な対応かどうかわからない。
なんか問題あれば教えてください。
CentOS7 で packer をインストールしたが動かないので対処した件

- CentOS7 で packer をインストールしたが パスを通しても動かない事象に遭遇しハマったのでメモ

# Packerのインストール
- packer を公式から取得し展開
- 参考: https://www.packer.io/docs/install/index.html
- `/usr/local/bin/packer` として配置してみる
- 実行: `packer -v` が なぜか応答がない…

# 原因
- `whereis packer` で確認すると、`/usr/sbin/packer` という同名のファイルが存在し `/usr/local/bin/packer` より優先して参照されていた。
- 参考: https://github.com/cracklib/cracklib/issues/7

# `/user/sbin/packer`ってなんぞ
- `/usr/sbin/packer -> cracklib-packer` で `cracklib-packer`へのシンボリックリンクっぽい… 

# 解決
- 問題の シンボリックリンクを消す `sudo rm /usr/sbin/packer`
- 正常動作を確認

```
$ packer -v
1.1.0
```
- 消したのに /usr/sbin/packer をまだ見に行くような場合は再ログイン等で正常化するかも
Project Euler Q12 【高度整除三角数】

Project Eulerをワンライナーで解いてみる。
間違っていたらコメントください。


## 問題
三角数の数列は自然数の和で表わされ, 7番目の三角数は $1 + 2 + 3 + 4 + 5 + 6 + 7 = 28$ である. 三角数の最初の10項は:
1, 3, 6, 10, 15, 21, 28, 36, 45, 55, ...

となる.

最初の7項について, その約数を列挙すると, 以下のとおり.

     1: 1
     3: 1,3
     6: 1,2,3,6
    10: 1,2,5,10
    15: 1,3,5,15
    21: 1,3,7,21
    28: 1,2,4,7,14,28

これから, 7番目の三角数である28は, 5個より多く約数をもつ最初の三角数であることが分かる.

では, 500個より多く約数をもつ最初の三角数はいくつか.

## 解答

```bash
time seq 20000 |
awk '{print $1*($1+1)/2}' |
factor |
awk '{for(i=2;i<=NF;i++){print $1,$i}}' |
uniq -c |
awk '{if(b!=$2){s[$2]=1};s[$2]*=($1+1);print $2,s[$2];b=$2}' |
awk '500<$2{print $1*1}' |
sort -n |
head -1
76576500

real	0m0.234s
user	0m0.611s
sys	0m0.046s
```

###ポイント
1. 三角数の第n項$a_n$は$a_n=\frac{1}{2}n(n+1)$と書けること。
2. 約数の個数は素因数分解したときの各素数の指数+1の積で表せること。

※2018/01/22修正
最後の出力から約数の個数を除外

## 答え合わせ
こちらのサイト様と一致していればOKとした。
http://kingyojima.net/pje/012.html

## 参考にさせて頂いたサイト様
[約数の個数の公式と平方数の性質 _ 高校数学の美しい物語](https://mathtrain.jp/numberofd)
バンドルされたインストーラを使用してインストールした AWS CLI をアンインストールする


# 結論

[バンドルされたインストーラ (Linux, macOS, or Unix) を使用して AWS CLI をインストールする - AWS Command Line Interface](http://docs.aws.amazon.com/ja_jp/cli/latest/userguide/awscli-install-bundle.html)

> バンドルされたインストーラでは、オプションのシンボリックリンク以外は、インストールディレクトリの外に何も置きません。そのため、アンインストールはこの 2 つの項目を削除するだけでシンプルです。
>
> ```
> $ sudo rm -rf /usr/local/aws
> $ sudo rm /usr/local/bin/aws
> ```

# 背景

久しぶりにawsコマンドを使おうと思ったらエラーが出ました。

```
~ aws --version
Traceback (most recent call last):
  File "/usr/local/bin/aws", line 15, in <module>
    import awscli.clidriver
  File "/usr/local/aws/lib/python2.7/site-packages/awscli/clidriver.py", line 31, in <module>
    from awscli.help import ProviderHelpCommand
  File "/usr/local/aws/lib/python2.7/site-packages/awscli/help.py", line 20, in <module>
    from docutils.core import publish_string
  File "/usr/local/aws/lib/python2.7/site-packages/docutils/core.py", line 20, in <module>
    from docutils import frontend, io, utils, readers, writers
  File "/usr/local/aws/lib/python2.7/site-packages/docutils/frontend.py", line 41, in <module>
    import docutils.utils
  File "/usr/local/aws/lib/python2.7/site-packages/docutils/utils/__init__.py", line 20, in <module>
    import docutils.io
  File "/usr/local/aws/lib/python2.7/site-packages/docutils/io.py", line 18, in <module>
    from docutils.utils.error_reporting import locale_encoding, ErrorString, ErrorOutput
  File "/usr/local/aws/lib/python2.7/site-packages/docutils/utils/error_reporting.py", line 47, in <module>
    locale_encoding = locale.getlocale()[1] or locale.getdefaultlocale()[1]
  File "/usr/local/aws/lib/python2.7/locale.py", line 543, in getdefaultlocale
    return _parse_localename(localename)
  File "/usr/local/aws/lib/python2.7/locale.py", line 475, in _parse_localename
    raise ValueError, 'unknown locale: %s' % localename
ValueError: unknown locale: UTF-8
```

[macOS で AWS Command Line Interface をインストールする - AWS Command Line Interface](http://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-install-macos.html) の手順で`pip install`する前に古いバージョンをアンインストールしたかったです。
方法をメモします。
オフラインリアルタイムどう書くF06の問題（続）

問題はこちら->http://nabetani.sakura.ne.jp/hena/ordf06numit/
prologの解答はこちら　↓
https://qiita.com/smallbigcats/items/f3d0833ed800832fcaa6

erlangは単一代入変数なので、（プロせス辞書なるものがあるようですが）
、再帰を使わずカウンターをつくるのが難しそうです。
そこでspawn関数を使ってみました。
まず普通の再帰プログラム

```erlang
%treelist.erl

-module(treelist).
-export([tree/1,disp/1,counter/2,solve/2]).

tree(Data) when Data=0->[];  %Data<Nにしても25問まで
tree(Data)->DL=floor(Data/2-10), DR=floor(Data*2/3),
                   L=tree(DL),R=tree(DR),[L,Data,R].

disp([])->true;
disp([L,D,R])->i0:write(D),io:write(","),disp(L),disp(R).

counter([],_)->0;
counter([_,D,_],N) when D<N->0;
counter([_,D,_],N) when D==N->1;
counter([L,_,R],N)->C1=counter(L,N),C2=counter(R,N),
                    C1+C2.
solve(T,N)->L=tree(T),counter(L,N).
%solve(123,4).
```
並列プログラム

```erlang
%treelist4.erl
-module(treelist4).
-export([tree/3,solve/2]).

tree(Data,C,Pid) when Data<C->Pid ! 0;
tree(Data,C,Pid) when Data==C->Pid ! 1;
tree(Data,C,Pid)->
              DL=(Data div 2)-10, DR=Data*2 div 3,
              Self = self(),
              spawn(treelist4,tree,[DL,C,Self]),
              spawn(treelist4,tree,[DR,C,Self]),
              Pid ! summary(0,0).

summary(Sum, 2) -> Sum;
summary(Sum, N) ->receive
                        Res -> Tmp = Sum+Res,
                        summary(Tmp, N + 1)
                    end.

solve(T,C)->Pid=self(),
            spawn(treelist4,tree,[T,C,Pid]),
            receive
              N ->io:write(N)
            end.
%solve(123,4).
```
再帰で25問、並列で24問までしか解けませんでした。

すみません。初めのプログラムの最初（コメントの前）が抜けていましたので追加しました。

2017.10.6　追加
同時に生存しているプロセスが減るように工夫したら、
時間はかかりますが全問解けるようになりました。

```erlang
%treelist3.erl
-module(treelist3).
-export([tree/3,solve/2]).

tree(Data,C,Pid) when Data<C->Pid ! 0;
tree(Data,C,Pid) when Data==C->Pid ! 1;
tree(Data,C,Pid)->
              DL=(Data div 2)-10, DR=Data*2 div 3,
              Self = self(),
              spawn(treelist3,tree,[DL,C,Self]),
              Pid ! summary(DR,C,Self,0,0).

summary(_,_,_,Sum, 2) -> Sum;
summary(DR,C,Self,Sum, N) ->
              receive
                  Res -> Tmp = Sum+Res,
                  if N==0->
                     spawn(treelist3,tree,[DR,C,Self]);
                  true->true
                  end,
                  summary(DR,C,Self,Tmp, N + 1)
               end.

solve(D,C)->Pid=self(),
            spawn(treelist3,tree,[D,C,Pid]),
            receive
               N ->io:write(N)
            end.
```
ArduinoでMIDI Pitchbendの値を真っ正直に計算してみる

# Arduinoのpow関数の速度を測る

MIDIのピッチベンドメッセージは、整数値から小数点の周波数倍率値を導き出して掛け算してさらに整数に丸めてレジスタに設定するという面倒な処理をしなければなりません。
一連の処理はFPUの無いCPUでは相当に負担がかかると思われるので大体近似して補間して単純な計算に変えたりテーブル参照にしたりしています。YMF825レガシーMIDIモジュールもテーブル参照方式にしています。
しかし、実際にどれだけ処理時間がかかるのか、確かめたことは無いので簡単な例で確かめてみました。

ロジックは YAMAHAのgithubから参照、、、YMF825用のfrac値を計算させてます。
https://github.com/yamaha-webmusic/ymf825board/tree/master/sample2

256段階の計算をしてみて　millis()関数で処理時間を測ってみました。

###コード

```CalcPow.ino
/*
 *   Pow(2,...) Speed 
 * 
 *    ringoro
 */
 
#include <math.h>

void setup() {
 Serial.begin(9600);
}
bool first=true;

void loop() {
  float x,y,cent;
  int i,d[256];
  unsigned long time1,time2;

  if(!first)
     { return;}
  first=false;

  time1= millis();

  for(i=0;i<256;i++){
    x = (i-128);
    y = pow( 2,(x/128) );
    d[i]=(int)(y*512+0.5);    
  }

  time2= millis();
  
  Serial.println(time1);
  Serial.println(time2);
  Serial.println("----");

  for(i=0;i<256;i++){
    Serial.println(d[i]);
   }
}
```

### 結果

```result.txt
0
72
----
256
257
259
260
262
 :
 :
991
997
1002
1007
1013
1018
```

最初の2つの数字がmillis()の結果で256回のpowと整数値代入で 72msec と見られます。一回の処理に約0.28msecかかっているという勘定です。
また、最後の値 x=255　の場合は計算値では1018　でシンセサイザ的には1023,または1024を設定値にしておきたいところです。テーブル参照ではこの辺りを補正できるのですが補正処理もどこかでしないといけないのでまたちょと処理時間は加算されると思います。
1ピッチベンドメッセージ当たり0.28msec程度なら実装しても問題ないかなと思われますが、、とりあえずご参考まで。
RLoginスクリプトをキーボードショートカットで実行

#RLoginスクリプトをキーボードショートカットで実行
RLoginにはスクリプト機能がある。
通常はマウスで「ファイル」メニュー→「スクリプトを実行」でスクリプトを選択し実行する。
これは少々面倒くさい。ここでは、キーボートショートカットでスクリプトを実行する方法を紹介する。

##手順
###(1)コマンド作業をスクリプト化
私はLinuxでCUIアプリケーションを使うことが多いため、そのコマンドをスクリプト化している。
例としてechoするだけのスクリプトをあげておく。

```sample1.txt
Document.Open();
wait(CONNECT);
sopen(OPEN_LOCK);

sputs("echo sample1\n");
swait(5, "#");

sclose();
exit(0);
```
###(2)メニューにスクリプトを登録
編集メニューにはスクリプトの関数機能であるfunctionを登録することができる。
登録するスクリプトは以下のようになる。

```menu.txt
function sample1(){
    include("sample1.txt");
}

function sample2(){
    include("sample2.txt");
}

function sample3(){
    shellexec("sample3.bat");
}

menu(0, "サンプル1", "sample1");
menu(1, "サンプル2", "sample2");
menu(2, "サンプル3", "sample3");
```
`shellexec()`を使用することでバッチファイルをRLoginから実行することもできる。
この時点でスクリプトの実行を試すには「ファイル」メニュー→「スクリプトの実行」でmenu.txtを選択する。
![exe_script.PNG](https://qiita-image-store.s3.amazonaws.com/0/140055/b9f3d7a6-8171-ae38-ef25-cd0570019578.png)
これでメニューにfunctionが登録される。
![menu.PNG](https://qiita-image-store.s3.amazonaws.com/0/140055/1f8d9da9-8900-b507-f0b4-11103afb634a.png)
sample1.txtを実行するには「編集」メニューから「サンプル1」を実行する。

###(3)RLoginのキーカスタマイズ
「キーボード」のところで設定。
![key_setting.PNG](https://qiita-image-store.s3.amazonaws.com/0/140055/621fe5f0-54ae-6638-8158-a5983b8c3e92.png)
これによりAlt+1, Alt+2などにメニューの機能を割り当てることができる。
割り当て後にはメニューにショートカットが表示される。
![exec_menu.PNG](https://qiita-image-store.s3.amazonaws.com/0/140055/422542bc-ee5a-a96a-af3d-c65da51963ca.png)

###(4)実行
Alt+1 でサンプル1を実行。
Alt+2 でサンプル2を実行。
![result.PNG](https://qiita-image-store.s3.amazonaws.com/0/140055/2ce03ff5-1d45-13ec-e96d-170c6ad52f08.png)

###(5)エントリースクリプトの設定
エントリースクリプトに作成したmenu.txtを指定しておく。
接続時にスクリプトが実行されるため、接続のたびに実行しなおす必要がなくなり便利。
![enrty_script.PNG](https://qiita-image-store.s3.amazonaws.com/0/140055/ad8b3606-dcae-c917-6749-32562d525de1.png)
プロパティ値によるアニメーションの違いを調べてみた

FireMonkey の TAnimation の [Interpolation](http://docwiki.embarcadero.com/Libraries/Tokyo/ja/FMX.Types.TInterpolationType) プロパティは、時間の経過による値の変化の度合いを設定するプロパティで 11種類の値が設定できます。

実際にどのような違いがあるかを簡単なサンプルを作って確認してみました。
(Delphi 10.2.1 Tokyo Starter で作成)

##サンプルの説明
サンプルは、フォーム上に Panel を置き、さらにその上に SpeedButtonを Interpolation プロパティの値分(11個)置いています。
各 SpeedButton の Position.x プロパティには TFloatAnimation が設定されています。3秒かけて左から右に移動するよう設定されています。
Start ボタンを押すと、左から右に SpeedButton (旗)が動きます。

##サンプル
アニメーションの動きを決めるときの参考に

![flag.gif](https://qiita-image-store.s3.amazonaws.com/0/164551/c121e0e2-2ba6-2c30-5a7b-22a6813291ff.gif)
[Swift] UIImageViewで市松模様 [iOS]

# 市松模様を表示するするカスタムUIImageViewのサンプル

CoreImageのCIFilterを使用。

<img width="264" alt="市松模様の図" src="https://qiita-image-store.s3.amazonaws.com/0/138773/e8004282-5c8e-cdde-8671-f9ea2d96f82e.png">

<img width="246" alt="市松模様プロパティの画像" src="https://qiita-image-store.s3.amazonaws.com/0/138773/57e19834-e01b-8328-2c69-33a942be5f6e.png">

CIImageからUIImageを作成してUIImageViewで表示してしまったが、UIViewでdrawをoverrideしてCIImageを直接に描画したほうが速くてシンプルになりそう？（興味があれば誰か頼む。。。）

元ネタ
 [チェック柄(市松模様)を描画するカスタムView](https://qiita.com/KikurageChan/items/2f800067519d40d3c66f)

元ネタのコメント欄にあるCICheckerboardGeneratorを使ってみた。並ぶタイルの個数ではなくて、タイルの長さ指定とした。

```swift

import UIKit

@IBDesignable class CheckerImageView : UIImageView {
    @IBInspectable var color0 : UIColor = UIColor(red:1.0, green:1.0, blue:1.0, alpha:1.0)
    @IBInspectable var color1 : UIColor = UIColor(red:0.0, green:0.0, blue:0.0, alpha:1.0)
    @IBInspectable var length : Double = 1.0

    var oldSize = CGSize(width: 0.0, height: 0.0)
    var oldColor0 : UIColor = UIColor()
    var oldColor1 : UIColor = UIColor()
    var oldlength : Double = 0.0

    override init(frame: CGRect) {
        super.init(frame: frame)
    }
    required init?(coder aDecoder: NSCoder) {
        super.init(coder : aDecoder)
    }

    override func layoutSubviews() {
        super.layoutSubviews()
        putCheckerImage()
    }
    override func setNeedsDisplay() {
        putCheckerImage()
        super.setNeedsDisplay()
    }

    func putCheckerImage() {
        if oldSize.equalTo(self.bounds.size)
            && oldlength == length
            && oldColor0 == color0
            && oldColor1 == color1 {
            return
        }
        oldSize = self.bounds.size
        oldlength = length
        oldColor0 = color0
        oldColor1 = color1

        self.image = createCheckerImage()
    }

    func createCheckerImage() -> UIImage? {
        guard let filter = CIFilter(name: "CICheckerboardGenerator") else {
            assertionFailure()
            return nil
        }

        let size = self.bounds.size
        let rect = CGRect(origin: CGPoint.zero, size: size)

        filter.setDefaults()

        filter.setValue(CIColor(cgColor:color0.cgColor), forKey:"inputColor0")
        filter.setValue(CIColor(cgColor:color1.cgColor), forKey:"inputColor1")
        filter.setValue(NSNumber(value: length) , forKey: "inputWidth")
        filter.setValue(NSNumber(value: 1.0) as NSNumber, forKey: "inputSharpness")
        filter.setValue(CIVector(values: [size.width * 0.5, size.height * 0.5], count: 2), forKey: "inputCenter")

        guard let outputImage:CIImage =  filter.outputImage else {
            return nil
        }

        let cicontext = CIContext(options: nil)

        guard let cgimage:CGImage = (cicontext.createCGImage(outputImage, from: rect)) else {
            return nil
        }
        return UIImage(cgImage: cgimage)
    }
}
```
Windowsで簡易ルータ

# Windowsで簡易ルータ

WindowsNT4.0の時代から、レジストリHKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\IPEnableRouter (REG_DWORD)の値を「1」にすると、ルータ(複数のネットワークカードの通信を中継する)になるよ。

ルータだけど、パケットフィルタリング機能とか通信先のポート制御とかファイアウォールのように使う事はできないけどね。

RRASとか使えば、もっと高機能のことができるかもしれいけど、ルーティングだけなら。こちらの方法がレジストリ一ついじるだけなので簡単。
Windowsでスイッチングハブ

# Windowsでスイッチングハブ

WindowsXP/2003以降、ネットワークカードのアイコンを複数選択して、右クリックで「ブリッジ」を選択すれば、Windowsはスイッチングハブのように動作するよ。

![bridge.png](https://qiita-image-store.s3.amazonaws.com/0/182822/d595503d-8160-cac9-c12e-2af64d828c47.png)


バケットキャプチャしたい時とか便利かもね。
Git | peco で最近使ったローカルブランチにチェックアウトする

# コマンド

`git reflog` から取ってみる。

```bash
$ git checkout $(git reflog | grep 'checkout: moving' | awk '{ print $8}' | awk '!a[$0]++' | peco)
```

# 画面

こんな感じ。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/913962c4-9f81-79dc-25a3-d26b4d99edca.png)

いちどブランチを選ぶと、次にコマンド実行した時には、最前列に繰り上がってくれる。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/80bf7616-e923-7bc8-8cb3-c743f37b2be6.png)

# エイリアス登録

`$ git jump` とかで起動できるようにしておくと便利かもしれない。

```
[alias]
  jump = !git checkout $(git reflog | grep 'checkout: moving' | awk '{ print $8}' | awk '!a[$0]++' | peco)
```

# 環境

- git version 2.14.1
- peco version v0.5.1
- Mac OSX Sierra

# 参考

- [ソートしないで重複行を削除する - Qiita](https://qiita.com/arcizan/items/9cf19cd982fa65f87546)








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
【Swift】textfieldやtextviewなどに書かれたテキスト(文字)を読み上げる

#テキスト読み上げ

textfield textviewなどに書かれた文字を読み上げます
AVSpeechSynthesizerクラスを使えば結構簡単

翻訳アプリだったのでtextfieldの名前がダサいけど

```swift
import UIKit
import AVFoundation //読み上げ用フレームワーク

class yakuViewController: UITabBarController,AVSpeechSynthesizerDelegate{

    //Delegateを設定する事により、読み上げの開始/終了のタイミング/読み上げ中の言葉を取得する事が可能に
    
    //textfieldでも可
    @IBOutlet weak var originSentence: UITextView!
    @IBOutlet weak var yakuSentence: UITextView!
    
    //SpeechSynthesizerクラス
    var talker = AVSpeechSynthesizer()
    
    //読み上げ用
    override func viewDidLoad() {
        super.viewDidLoad()
        
        //Delegate設定した時のみ以下を書く
        self.talker.delegate = self

    }

    //tapToRead(button)で読み上げ
    @IBAction func tspToRead(_ sender: UIButton) {
        
        var talker = AVSpeechSynthesizer()
        
        let utterance = AVSpeechUtterance(string:self.yakuSentence.text!)
        utterance.voice = AVSpeechSynthesisVoice(language: "en-US") //英語を読みます
        //日本語の場合は"ja-JP"
          
    // 話す速度を設定（0.0〜1.0）
        utterance.rate = 0.5
     
    // 声の高さを設定（0.5〜2.0）
        utterance.pitchMultiplier = 1.0
   
        //読み上げ
        self.talker.speak(utterance)
       
  
        }

        //読み上げ開始
    func speechSynthesizer(synthesizer: AVSpeechSynthesizer!, didStartSpeechUtterance utterance: AVSpeechUtterance!)
    {
        print("開始")
    }
    
    //終了
    func speechSynthesizer(synthesizer: AVSpeechSynthesizer!, didFinishSpeechUtterance utterance: AVSpeechUtterance!)
    {
        print("終了")
    }
    
    //読み上げ中の言葉を取得
    func speechSynthesizer(synthesizer: AVSpeechSynthesizer!, willSpeakRangeOfSpeechString characterRange: NSRange, utterance: AVSpeechUtterance!)
    {
        let word = (utterance.speechString as NSString).substring(with: characterRange)
        print("Speech: \(word)")
    }
    
 ```
また何かあれば追加していきます

ブログも書いてるので良かったら見てください(swift関係ない話多いけど)
<a href="https://yutori-road.com/it-info/cebu-swift">フィリピン・セブ島でプログラミング言語【Swift】を学んでみた</a>
GAS　ライブラリー作成①

GASの記事を読んでいると
GASのAPIを呼び出すと回数が増えると処理時間がかかる, という記事を見かけます.
個人的には, そんな感覚はあまりなく, 
setValue(), getValue()を使うと遅くなり, setValues(), getValues()を使うと早くなる.
という感覚です.
内部的には, セルが牢屋みたいに鍵かかっており, その牢屋を開け締めする回数が多くなると,
処理が遅くなっているのでは？と思います.

結局なにがいいたいかというと,2次元配列を操作できたものがGASを制する!


#原型


```js:D2.gas
var D2 = function(D2Arr){
  return {
    element:D2Arr,
    get:  //　最後に要素を取り出す
    function(){
      return this.element;
    },
    // ここにメソッドを追加していく。   
 }
```

徐々に追加していこうと思います
Git | peco で ローカルブランチを移動する

好きなブランチにチェックアウトする。

```
git checkout $(git branch | sed 's/*//g' | sed 's/ //g' | peco)
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/fbd203ee-c847-a396-f777-c9bc17e56d74.png)


# エイリアス登録

`git jump` とかで起動できるようにしておくと便利かも。

```:~/.gitconfig
[alias]
  jump = !git checkout $(git branch | sed 's/*//g' | sed 's/ //g' | peco)
```

# 環境

- git version 2.14.1
- peco version v0.5.1
- Mac OSX Sierra








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Windows Server Backup by powershell

小難しくない程度にPowershellでもにょもにょやってみました。
作ってみたけどお蔵入り…orz

#Windows Server Backup by powershell
WBADMINによるSYSTEMバックアップ取得が失敗した場合に、PSのerrorlevelに相当する$lastexitcodeを使用して正常終了(0)でない場合に、自分で作ったフォルダを片付けてスクリプトを離脱exitする。だけ。

##point
- \$lastexitcode    
    　dosでいうerrorlevelと同じように扱える　       
- \$ret= Invoke-Expression -Command \$command2        
    　Invokeに渡すときは$commandのように変数に１つに固める。\$ret= で出力を取出せる   
- Remove-Item $bkup_path -recurse    
    　フォルダ消去。recurseで中身・サブフォルダごと。


```WSBSYSBACKUP.ps1
###ログの指定と格納先準備
$logfile = "C:\UserScripts\WSB_LOG.txt"
$bkup_path ="\\192.168.1.10\ABChost_sysbk\"
$DateText = get-date -format "yyyyMMdd_HHmmss"
$bkup_path = $bkup_path + $DateText

###フォルダ作る
md $bkup_path

###WSBコマンド
$command = "WBADMIN Delete Catalog -quiet"
$command2 = "WBADMIN START BACKUP -backupTarget:" + $bkup_path + " -allCritical -systemState -vssFull -quiet"

###いざ実行
Invoke-Expression -Command $command
$ret= Invoke-Expression -Command $command2

###WSBログはoutしとく
echo $ret > $logfile

###エラー処理（正常の0じゃneぇとき反応。WSBを直接キャンセルすると-3とか。）
if ($lastexitcode -ne 0){
    echo "WBADMINが正常に終了しなかったため処理を中断します。return:$lastexitcode" >> $logfile
    echo "この処理で作成した次のフォルダのバックアップは不完全です。" >> $logfile
    echo "$bkup_path は自動削除します。" >> $logfile
    ###フォルダは消す
    Remove-Item $bkup_path -recurse
    exit     ###離脱
}else{
}

以降に、引き続き正常な時の処理を書く

```
Xcode9 で AppStore に submit したら Invalid Bundle となる問題の解決方法

追記: Carthage のアップデートによりこの問題は発生しなくなりました。

---

## 発生した問題

- Xcode 9
- Carthage を使っている
- AppStore に submit すると下記のような Invalid Bundle というメールが来る

> Invalid Bundle - Disallowed LLVM instrumentation. Do not submit apps with LLVM profiling instrumentation or coverage collection enabled. Turn off LLVM profiling or code coverage, rebuild your app and resubmit the app.

> Once these issues have been corrected, you can then redeliver the corrected binary.

## 原因

- Carthage で依存しているライブラリの codeCoverageEnabled が YES になっている
- より詳細は: https://github.com/Carthage/Carthage/issues/2056

## 対応方法

根本的な解決は現段階では難しいので、とりあえず下記の方法で対処するのが良さそうです.

https://stackoverflow.com/questions/46160518/xcode-9-carthage-itunes-connect-error-invalid-bundle-disallowed-llvm-instr/46226810#46226810


## fastlane での対応方法

fastlane で CI を回しているので carthage で依存を解決するところを下記にような処理にしました.


```ruby
# ビルドしないでチェックアウトしてくるだけ
carthage(
  platform: "iOS",
  configuration: "Release",
  no_build: true
)

# codeCoverageEnabled を NO にする
cmd = <<"EOS"
grep -lR "codeCoverageEnabled" --include *.xcscheme --null ../Carthage | xargs -0 sed -i '' -e 's/codeCoverageEnabled = "YES"/codeCoverageEnabled = "NO"/g'
EOS

sh(cmd)

# ビルド
carthage(
  platform: "iOS",
  configuration: "Release",
  command: "build"
)
```
ゲームオブジェクトの参照


```md:Hierarchy
RootCube
	└ MyCube
		└ ChildCube
```

前提：MyCubeにスクリプトをアタッチしている状態

## インスペクタからアタッチする

```c
public GameObject TargetCube;
```

SerializeField
https://docs.unity3d.com/jp/540/ScriptReference/SerializeField.html

```c
[SerializeField] GameObject TargetCube;
```


## シーンの中からざっくり探す

GameObject.Find
https://docs.unity3d.com/jp/540/ScriptReference/GameObject.Find.html

```c
GameObject TargetCube;

void Start () {
    TargetCube = GameObject.Find("MyCube"); // ユニークな名前
}
```

## シーンの中からタグで探す

GameObject.FindWithTag
https://docs.unity3d.com/jp/540/ScriptReference/GameObject.FindWithTag.html

```c
GameObject TargetCube;

void Start () {
    TargetCube = GameObject.FindWithTag("cube");
}
```

## シーンの中からタグで探す（複数）

GameObject.FindGameObjectsWithTag
https://docs.unity3d.com/ja/540/ScriptReference/GameObject.FindGameObjectsWithTag.html

```c
GameObject[] respawns;

void Start () {
    respawns = GameObject.FindGameObjectsWithTag("Respawn");
}
```

## 子要素を探す

Transform.Find
https://docs.unity3d.com/jp/540/ScriptReference/Transform.Find.html

```c
GameObject TargetCube;

void Start () {
    // Transform情報を返すので、ChildCubeが必要ならgameObjectをつける
    TargetCube = transform.Find("ChildCube").gameObject;
}
```

Transform
https://docs.unity3d.com/jp/540/ScriptReference/Transform.html

非アクティブな要素を取得することもできるので重要
[UnityでアクティブでないGameObjectを取得する](https://spphire9.wordpress.com/2013/11/17/unity%E3%81%A7%E3%82%A2%E3%82%AF%E3%83%86%E3%82%A3%E3%83%96%E3%81%A7%E3%81%AA%E3%81%84gameobject%E3%82%92%E5%8F%96%E5%BE%97%E3%81%99%E3%82%8B/)

## 子要素から親要素を探す

|変数|意味|
|---|---|
|parent|Transform の親|
|root|階層の一番上の Transform|

### parent

https://docs.unity3d.com/jp/540/ScriptReference/Transform-parent.html

```c
GameObject TargetCube;

void Start () {
    TargetCube = GameObject.Find("ChildCube");
}
void Update () {
    TargetCube.transform.parent.Rotate(0, Time.deltaTime * 50, 0);
}
```

root（中央）は動かず、MyCubeを（一番下）中心に回転する

![parent.gif](https://qiita-image-store.s3.amazonaws.com/0/136286/cd93a28f-86dd-f564-4e08-4ddbc3fbe564.gif "parent.gif")

### root

https://docs.unity3d.com/jp/540/ScriptReference/Transform-root.html

```c
GameObject TargetCube;

void Start () {
    TargetCube = GameObject.Find("ChildCube");
}
void Update () {
    TargetCube.transform.root.Rotate(0, Time.deltaTime * 50, 0);
}
```

rootごと回しているので、全てのオブジェクトが回転する

![root.gif](https://qiita-image-store.s3.amazonaws.com/0/136286/83bb7ca2-3e53-3d51-fff0-5c1a62b61b0b.gif "root.gif")
RDF 裏面

# 1-A

RDF はトリプルで書きます。turtle 形式で概念を表現すると、こんな感じになる。

```
PREFIX ex: <http://ns.example.org/>

ex:S ex:p ex:O
```

ここまでは普通の例。

# 1-B

裏面。`rdf:Statement` を使うと、別の形でも書ける。

```
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX ex: <http://ns.example.org/>

_:ST a rdf:Statement ;
	rdf:subject ex:S 
	rdf:predicate ex:p
	rdf:object ex:O .
```

こうすると `Statement` 自体にメタ情報を付けることができるようになる。

```
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX ex: <http://ns.example.org/>
PREFIX dcterms: <http://purl.org/dc/terms/>
PREFIX xsd: <http://www.w3.org/2001/XMLSchema>

_:ST a rdf:Statement ;
  rdf:subject ex:S ;
  rdf:predicate ex:p ;
  rdf:object ex:O ;
  dcterms:created "2017-10-04"^^xsd:date .
```

まぁ普通は面倒くさくなって、こうモデル化してしまうかもしれない。`ex:p` 1つしかない場合はこれで十分だろう。

```
PREFIX ex: <http://ns.example.org/>
PREFIX dcterms: <http://purl.org/dc/terms/>
PREFIX xsd: <http://www.w3.org/2001/XMLSchema>

ex:S ex:p ex:O ;
  dcterms:created "2017-10-04"^^xsd:date .
```


# 1-C

さらに裏面。wikidata でのやりかた。

```
PREFIX wd: <http://www.wikidata.org/entity/>
PREFIX wdt: <http://www.wikidata.org/prop/direct/>

wd:Q39231 wdt:P31 wd:Q8502
```

これを、こうじゃ。名前空間を豪勢に使って対応してます。

```
PREFIX wd: <http://www.wikidata.org/entity/>
PREFIX wdt: <http://www.wikidata.org/prop/direct/>
PREFIX p: <http://www.wikidata.org/prop/>
PREFIX ps: <http://www.wikidata.org/prop/statement/>
PREFIX pr: <http://www.wikidata.org/prop/reference/>
PREFIX prov: <http://www.w3.org/ns/prov#>

wd:Q39231 p:P31 _:ST . # 富士山, 分類
_:ST ps:31 wd:Q8502 ; # 分類, 山
  prov:wasDerivedFrom [ pr:P143 wd:Q328 ] . # 移入元, 英語版ウィキペディア
```

ステートメントへは比較的簡単にアクセスできるので、便利ですね。こうすることのデメリットは、名前空間の意味をエンジンとして対応しないといけないところでしょう。

https://www.wikidata.org/wiki/Wikidata:SPARQL_query_service/queries

https://www.mediawiki.org/wiki/Wikibase/Indexing/RDF_Dump_Format#Data_model
iOS 11 で UIToolbar にカスタムビューで乗せた UITextField のサイズが暴れるのを「とりあえずなんとかする」方法

## この記事を読むにあたって
以下に記載される内容は「とりあえずなんとかする」方法である事に注意。
もっと正しい対応方法があると思いますが、様々な事情により大きな変更を入れられない場合などに使えるかもしれません。

## 事象
アプリ内のブラウザのURLを表示・編集するために使用していた UITextField をカスタムビューとして生成した UIBarButtonItem の大きさが異常に大きくなってしまう場合があった。
また、サイズを小さくしようとしても小さくならない。

## 確認した挙動

- -setFrame: するとツールバー内部の UIStackView サブクラスから -setFrame: が飛んでくる (AutoLayout)
- AutoLayoutされた結果は UITextField に入力されている text の影響を受ける
- text 全域が表示できる大きさより小さくできない
- text 全域が表示できる大きさより大きくできる
- -setText: のタイミングで大きさが変更されることはない
- text が長い場合、UITextField の右側にあるアイテムすら画面外に押しのけて自分がツールバー上で最大の大きさにまで広がる場合がある

どうやらツールバーに収まる範囲内で UIBarButtonItem のカスタムビューの -sizeThatFits: 辺りの大きさになるらしい。
※ 具体的には未検証。

## 対応
UIView の上に UITextField を乗せ、UIView をカスタムビューとして UIBarButtonItem を生成する。

UIView, UITextField の大きさは個々の事情に合わせて変更。
大体は UIView サブクラスを作って -setFrame: を subviews 内の UITextField にも適用する方式や、autoresizingMask の設定で事足りるかと。

試行錯誤段階で UITextField サブクラスを作って -setFrame: が呼ばれた時に text のコピーを作成し、テキストフィールドに空文字列をセットしてから [super setFrame:frame]; した後に コピーしていた text を再セットする方式も試したが、基本的に上手くいくものの完璧とはならなかった。
【swift】タブAで更新されたデータをタブBのテーブルビューで「再」描画する


##やりたかったこと
swift、iOSアプリで
左側のタブでデータを追加して
右側のタブを開いたときにtableViewを再描画したかった

##ハマったこと
###１，タブをクリックしてビューを遷移したことの検知
最初はtabbarItemのデリゲートを追加するとか、押されたときのイベントを検知するとか色々考えて検索をしましたが実装が面倒そう
例えば：http://hidef.jp/post-725/
####解決
今回やりたいことはviewが再読込されたときにデータを更新すればいいので、viewwillappearでデータの更新をすればOK

###２，テーブルビューの再描画
データの更新はできたのでテーブルビューを再描画すればOK
####解決
tableView.reloadData()
でかいけつ
Swift4でのクラス名取得方法まとめ

ネットに色々なクラス名取得の方法が溢れていたので、まとめました。

#モジュール名が入るパターン
こういうコードを使うとモジュール名が含まれます。

```swift:モジュール名+クラス名.swift
var className: String {
        get {
            return NSStringFromClass(type(of: self)) // ModuleName.ClassName
        }
    }

```

# クラス名のみのパターン1(最もスマート)

```swift:クラス名のみ(スマート).swift
var className: String {
    return String(describing: type(of: self)) // ClassName
}
```

ps: @mono0926 さんのご指摘により、こちら追加しました。一番スマートなコードですね！ありがとうございます！

# クラス名のみのパターン2(スマートじゃない)
クラス名を取得したいクラスで実装してください。

```swift:クラス名のみ(スマートじゃない).swift
var className: String {
        get {
            let classNameIncludeModuleName = NSStringFromClass(type(of: self))
            // モジュール名を取り除く必要がある
            let startIndex = classNameIncludeModuleName.index(of: ".")!
            let indexAfterModuleName = classNameIncludeModuleName.index(after: startIndex)
            // Module. 以降のインデックスを使ってクラス名のみを抜き出す。
            // Swift4からsubstring(to:)がdeprecatedになって、このような書き方になった。
            let classname = classNameIncludeModuleName[indexAfterModuleName...]
            return String(classname)  // ClassName
        }
    }
```

Swift4での文字列の切り出し方法はこちらを参考にしました。
http://gootara.org/library/2017/09/swift4substr.html
RedmineからSubversionのリポジトリに接続できなくなった

# 状況

停電対策でRedmineサーバーの電源を落として帰った次の日、
Redmineから「リポジトリ」を見ようとしたらエラーが出るようになりました。

「リポジトリに、エントリ/リビジョンが存在しません。」

Redmine 3.2.0
Redmineサーバー :CentOS 6.7
Subversion: https://svn.example.net/ の外部サーバー

# 対応

SVN( https://svn.example.net/ ) にブラウザからアクセスできることを確認
→ Redmineサーバーの問題っぽい

とりあえずApacheのlogを見てみる
`$ sudo less /etc/httpd/logs/error_log`

出てました

```stderr: svn: OPTIONS of 'https://svn.example.net/': Could not resolve hostname `svn.example.net': Temporary failure in name resolution (https://svn.example.net/)```

pingを打ってみる

```
$ ping svn.example.net
ping: unknown host svn.example.net
$ ping www.yahoo.co.jp
ping: unknown host www.yahoo.co.jp
```

再起動したときにDNSサーバーの設定がリセットされたようです

設定ファイルに追記（環境によって違うと思いますが）

```ruby:/etc/sysconfig/network-scripts/ifcfg-eth0
DNS1=192.168.1.5
DNS2=192.168.1.1 #追記
```

ネットワーク再起動
`$ sudo service network restart`

無事復活しました:v:
MacでKinectV2を動かす

#あくまでセットアップだけ
MacでもKinect開発できたらいいなーと思ってセットアップしてみました。
セットアップしただけなので、どんなことができるのかは全然やってません。あしからず。
[こちらのサイト](http://techblog.kayac.com/mackinect_v22015.html)を参考にしたのですが、最新の状態だと少し手順が違ったので、メモ書きです。

#環境
MacOS High Sierra 10.13
Xcode 9.0
openFrameworks 0.9.8
Xbox One Kinect センサー

#準備
- openFrameworksインストール
 http://openframeworks.cc/ja/

- ofxMultiKinectV2 インストール
 https://github.com/hanasaan/ofxMultiKinectV2

- ofxTurboJpeg インストール
 https://github.com/armadillu/ofxTurboJpeg

インストールしたopenFrameworksは適当な場所に設置
ofxMultiKinectV2とofxTurboJpegは使用するフレームワークなので、
openFrameworksのフォルダ内の「addons」フォルダ内に入れる。
必要なのはフォルダ内の「libs」と「src」のみなので、それだけ入れればOK
フォルダ名はわかりやすくしておくことを推奨。

<img width="931" alt="スクリーンショット 2017-10-04 12.36.03.png" src="https://qiita-image-store.s3.amazonaws.com/0/39089/63720ec5-b204-e9eb-42d9-e74ece2297ec.png">

#プロジェクト作成
1. openFrameworks/ProjectGenerator-osx/projectGenerator
を開く。
2. 適当な名前とプロジェクトの場所を指定。
場所は、openFrameworksのapps内に。
3. AddonにofxMultiKinectV2ととofxTurboJpegを追加
4. Generate
5. サクセスしたら、Open in IDE で開く
<img width="500" alt="スクリーンショット 2017-10-04 12.37.14.png" src="https://qiita-image-store.s3.amazonaws.com/0/39089/ab2b555d-b6fe-44bb-c273-d8bb711bb6b5.png">

プロジェクト設定：
1. Linkied Frameworks and Libraries にOpen CLを追加(＋ボタンを押して検索)
2. Embedded BinariesのとofxTurboJpegのバイナリを追加
	＋押して、AddOther →/addons/ofxTurboJpeg/libs/turbo-jpeg/lib/osx/を選択→Cleate　Folder references でOK
3. このまま実行して、空っぽのポップアップが出れば設定終了です:grinning:

#開発する
あとは参考サイトの
http://techblog.kayac.com/mackinect_v22015.html
に書いてあるプログラムを書いてみると、深度情報がポイントクラウドで表示されます。
![スクリーンショット 2017-10-04 13.00.34.png](https://qiita-image-store.s3.amazonaws.com/0/39089/f09cc999-2ce8-e4ea-a974-f60f5d53304d.png)

#教えてください
あとはこれから勉強します。
TwitterのDMで自分のパソコン(Windows)を遠隔操作する奴

# モチベーション
ベッドの上でスマホをいじってるときに眠くなって、パソコンをシャットダウンとかしたい。けど動きたくない。だから簡易的に遠隔操作できるシステムがほしい。

# 動作例
自分自身にDMを送ると、それを実行してその結果を返してくれる。
Windows環境を想定して作成。おそらくその他環境でも動く(?)
```shutdown -s -t 0```とかにすればシャットダウンできる。
下の例はdirコマンドを実行した例

![image.png](https://qiita-image-store.s3.amazonaws.com/0/91558/39d917b2-d388-077a-77be-d52f3f70e0a2.png)

# ソースコード
```python:twitter_controller.py
from twython import TwythonStreamer
from twython import Twython
import subprocess

# ご自身のアプリのキーとか入れてください
consumer_key = ""
consumer_secret = ""
access_token = ""
access_token_secret = ""
head_message = '[result from TwiCon]'

twitter = Twython(consumer_key, consumer_secret, access_token, access_token_secret)

# https://qiita.com/kentarosasaki/items/033751ba8b26cc51cf2a
def res_cmd(cmd):
  r = subprocess.Popen(cmd, stdout=subprocess.PIPE, shell=True).communicate()[0]
  return r.decode('shift-jis').strip()

# https://github.com/ryanmcgrath/twython/blob/master/examples/stream.py
class MyStreamer(TwythonStreamer):
    # https://twittercommunity.com/t/how-do-i-stream-direct-messages/61936/2
    def on_success(self, data):
        if 'direct_message' in data:
            msg = data['direct_message']
            if msg['sender']['id'] == msg['recipient']['id']:
                cmd_text = msg['text']

                if cmd_text.find(head_message) != 0: # ループ防止
                    ret_str = res_cmd(cmd_text)

                    twitter.send_direct_message(
                        screen_name = msg['sender']['screen_name'],
                        text = head_message + "\n" + ret_str
                    )

    def on_error(self, status_code, data):
        print( status_code, data )

if __name__ == "__main__":
    stream = MyStreamer(consumer_key, consumer_secret, access_token, access_token_secret)
    stream.user()
```

# なんでTwython?
TweepyをつかってDMの着信を取りたかったが、うまくいかなった。```on_direct_message```が息してない。
だから、Twythonを使った。

# 注意点
当たり前だが、TwitterのアプリケーションのパーミッションをDMが読み取れるように設定しないといけない。
これの設定を忘れてもエラーを吐いてくれない場合があったので、要注意。

# 使うにあたって
PCではPythonとTwythonが使えるように準備が必要。
またスタートアップで実行しておくと便利。
以下のようなファイルを同じディレクトリ内に作って、run.vbsをスタートアップに登録してやるとバッググラウンドでやってくれる(はず)。

```run.bat
python twitter_controller.py
```

```run.vbs
Set WshShell = WScript.CreateObject("WScript.Shell")
Return = WshShell.Run("run.bat", 0, true)
```

# その他
・スクショとかを送ってくれたりしたら便利そう。
・exe化した方がもっと使いやすい。

# 参考したサイト
ソースコードに記載してるサイトの一覧です。
[Pythonでシェルコマンドの実行結果をリストで渡す方法 - Qiita](https://qiita.com/kentarosasaki/items/033751ba8b26cc51cf2a)
[twython/stream.py at master · ryanmcgrath/twython · GitHub](https://github.com/ryanmcgrath/twython/blob/master/examples/stream.py)
[How do I stream direct messages? - Streaming APIs - Twitter Developers](https://twittercommunity.com/t/how-do-i-stream-direct-messages/61936/2)

# 宣伝
フォローお願いします:shinto_shrine: [@redshoga](https://twitter.com/redshoga)
sliceからN番目の要素を削除する

簡単だけどすぐ忘れそう。

```go
package main

import (
	"fmt"
)

func main() {
	t := []string{"0番目","1番目","2番目","3番目","4番目"}
	fmt.Println(t)
	n := 2
	fmt.Printf("%d番目を削除\n", n)
	t = unset(t, n)
	fmt.Println(t)
}

func unset(s []string, i int) []string {
	if i >= len(s) {
		return s
	}
	return append(s[:i], s[i+1:]...)
}
```

https://play.golang.org/p/53J04UE7dv
wp-cliでwordpressサイトのURLを変換する

## wp-cliのインストール
```
curl -O https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar
php wp-cli.phar --info
chmod +x wp-cli.phar
su
mv wp-cli.phar /usr/local/bin/wp
```

## サイトURL書き換えコマンドの実行
```
cd <wordpressインストールディレクトリ>
wp search-replace 'http://example.com/wordpress' 'http://newsite.com/wordpress'
```
capistrano3でリポジトリのURLを変更した時にやること

## 1. deploy.rbを変更

config/deploy.rbの`repo_url`を変更し、`update_git_repo`タスクを追加する

```rb:config/deploy.rb:

set :repo_url, "git@bitbucket.org:hoge/fuga.git"

task :update_git_repo do
  on release_roles :all do
    with fetch(:git_environmental_variables) do
      within repo_path do
        current_repo_url = execute :git, :config, :'--get', :'remote.origin.url'
        unless repo_url == current_repo_url
          execute :git, :remote, :'set-url', 'origin', repo_url
          execute :git, :remote, :update
          execute :git, :config, :'--get', :'remote.origin.url'
        end
      end
    end
  end
end
```
参考: https://github.com/capistrano/capistrano/issues/612#issuecomment-70464554

## 2. リポジトリを更新する

```
bundle exec cap <STAGES=staging,production> update_git_repo
```

## 3. デプロイを実行する

```
bundle exec cap <STAGES=staging,production> deploy
```
遅くならないfeature specの書き方ポイント

# Rspec Slowest Test 改善

Rspecで遅くなっているテストの改善を実施したときのポイント
今回はRspec単体の実行時間改善を行い、CIの速度改善や並列実行は含みません。

## 前提
```
rspec (3.6.0)
capybara (2.15.3)
poltergeist (1.16.0)
```

#### 遅いテスト例
```
$ bundle exec rspec --profile 10 spec/

Top 10 slowest examples (190.71 seconds, 37.6% of total time):
    127.35 seconds ./spec/features/furniture/search_spec.rb:35
```
:exclamation: :exclamation: :exclamation: 


## :bulb: ポイント
主にfeatureテストで遅くなるので、Capybaraを使ったテスト作成で気をつけるポイントを書いていきます。

### ElasticSearchのindex作成のコードを意識する
* ElasticSearchのindex作成をdocker上で行っています。
* 改善以前にシナリオ毎にindex作成が2回走っていました。
* 重くなる処理は必要のあるコードなのか意識しましょう。

### Controllerのbefore_filterのテストをfeatureテストの対象にしない
* featureテストでControllerのbefore_filterのテスト ( 主にログインの処理 )を書いている箇所を見かけますが、before_filterのテストはController側の債務としControllerSpec側で行う。

### ログイン前提処理はcurrent_userのモックを使う
* current_uerをモックする処理で、ログイン処理は飛ばしてしまいます。

### sleepを使わない
* Capybara.default_wait_timeが機能しているか確認し、sleepを使っている箇所を消していきます。

### 作成するデータ(FactoryGirl)は境界値を意識する。
* テストケースを作成する際に必要な境界値以上のデータは作成しない。
* 作成するデータ数そのままMysqlのInsertが走り遅くなります。
:bulb:  [境界値分析](http://ackynonichijou.com/syskai/%E3%83%86%E3%82%B9%E3%83%88/%E3%83%86%E3%82%B9%E3%83%88%E3%81%AE%E8%A6%B3%E7%82%B9%E3%81%A7%E3%81%82%E3%82%8B%E5%A2%83%E7%95%8C%E5%80%A4%E5%88%86%E6%9E%90%E3%81%A8%E5%90%8C%E5%80%A4%E5%88%86%E5%89%B2%E3%82%92%E7%90%86%E8%A7%A3.html)

### stub_constを使う
* ページングのために大量のデータが作成されている場合があります。(PER_PAGE * ページ数分)

:exclamation: :expressionless: 
```ruby 
200.times { create(:image_datum, :review) }
```
* :bulb:  stub_constで定数のstubを作って、件数を減らします。
```
stub_const("PER_PAGE", 2)
```

### withinを使う
* withinでセレクタを指定する事により、ブロック内の検索対象をあらかじめ絞ることが出来ます。

```ruby
within(:css, "li#employee") do
  fill_in 'Name', :with => 'Jimmy'
end
```
* withinもCapybara.default_wait_timeを見ているのでページ遷移後にセレクタが見つからないときの対策として意識して使ってみてください。
react native v0.49で無効になったdynamic importについて


2017.10.3にリリースされた、react-native `v0.49`の割と大きいbreaking change

```shell-session
Transformerror:... "require() must have a single string literal argument" 
```

- この `Transformerror`はα版で出るようになった
- が、結局リリース版出ても出続けることがわかったので、調べた

## Transformerrorの原因

```js
// こういうのが、通らなくなった。静的解析時にstringでないとNG
require('moment/locale/' + name);
```
- moment.js
    - ~~PRでてる~~`v2.19.0`がリリースされた
        - https://github.com/moment/moment/releases/tag/2.19.0
- realm.js
    - パッチが出たのでいまはok
- などなど
    - 使ってるモジュールで使われてるとNG

## dynamic importのサポートが（いったん）終了した

- react-nativeのbundlerである、metro-bundlerがdynamic importのサポートを切った
- 影響範囲大きいが、計画的なものっぽいので、ケアされることはなさそう


## metro-bundlerのdynamic import自体は、そのうち復活する

- ただし、stage-3の`import()`シンタックスのサポートとともに復活する
- webpack2とかでサポートされてるやつ
    - https://github.com/tc39/proposal-dynamic-import
- react-native/metro-bundlerに議論が拡散してるので、追いにくいが議論されてる
    - https://github.com/facebook/metro-bundler/issues/52
    - https://github.com/facebook/react-native/issues/6391#issuecomment-329048372
- いつ頃になるのかは、metro-bundlerのロードマップが出てないので、不明

## workaround

### projectのdependencies

- 汎用的な方法はない。
- 自分が使ってるモジュールがTransformerrorを吐いているなら、パッチを当てたforkを指定するか、そのフォークを手元にforkするとか指定する他ない

```diff
- "moment": "latest",
+ "moment": "git+ssh://git@github.com/tqc/moment.git#no-dynamic-import"
```
- 2017.10.12時点で、moment.jsはupdate済みなのでこれは実際には不要

### dependenciesのdependencies

少し面倒なケース。yarnを使ってると苦労は軽減可能

- 使用してるnpm pkgの依存pkgがdynamic importを使ってるケース
- 例:[react-native-gifted-chat](https://github.com/FaridSafi/react-native-gifted-chat)
    - package.jsonで`"moment": "2.18.1"`と固定していた
        - Transformerrorを吐くversionが指定された
        - 数日前にfixされたので
- `yarn`だとSelective dependency resolutionsを使うことで解決

```json
//package.jsonに追記したら、通常通り。yarn install, yarn.lock生成, etc..
"resolutions": {
    "react-native-gifted-chat/moment": "latest"
}
```

- c.f. [yarnのselective dependency resolutions機能 \- Qiita](https://qiita.com/sakymark/items/e8b4d68b3888bb0d303a)
RxSwiftの Variable を get only にする

## 背景
ViewModel などに、 RxSwift の `Variable`型のプロパティを定義して使いたい場合があると思いますが、それだと ViewModel の外からもそのプロパティの`value`を変更できてしまいます。
これに対して適切にアクセス制限をかける方法を紹介します。

## 既存の方法
これまで同様の課題を解決するために用いられることが多かったであろう方法として、[RxProperty](https://github.com/inamiy/RxProperty)があります。
RxProperty が提供するのは `Variable`の`value`への参照を getter のみに制限する薄いラッパーです。
これでもちろん要件は満たせるのですが、

```swift
private let _state = Variable<T>(...)
public let state: Property<T>
```

このように、毎回１つ余分にプロパティを定義しなければならないので、プロパティが多くなってくると煩雑さが出てきます。

## 別の方法
そこで今回紹介するのは、`value`の setter メソッドで、新しい値と併せて任意のファイルのみでインスタンス化できる Signature を引数にとることで、外からは値が更新できないようにする方法です。
具体的には以下のような実装になります。

```swift
public final class GetOnlyVariable<Element, Signature> {
    private let variable: Variable<Element>

    public var value: Element {
        get {
            return variable.value
        }
    }

    public init(_ value: Element) {
        variable = Variable(value)
    }

    public func onNext(_ value: Element, signature: Signature) {
        variable.value = value
    }

    public var changed: Observable<Element> {
        return variable.asObservable().skip(1)
    }
}
```

これを

```swift
final class ViewModel {
    struct Signature {
        // fileprivate にすることで、このファイル以外からはインスタンス化できず、onNext を呼び出すことができなくなる
        fileprivate init() {}
    }
    let property = GetOnlyVariable<String?, Signature>("This is get only property")
}
```

こんな感じで利用します。値の更新時に

```swift
property.onNext("new value", Signature()) // ViewModel が定義されたファイルのみで Signature() が呼び出せる
```

とする感じです。
Signature をファイル毎に定義する必要はありますが、プロパティの数が多い時などはこの方法も候補に入るかなと思います。
Xcode 9 + iPhone X シミュレータ(iOS 11) で UITabBar のアイコンとタイトルが上に寄ってしまうのを「とりあえずなんとかする」方法

## この記事を読むにあたって
以下に記載される内容は「とりあえずなんとかする」方法である事に注意。
もっと正しい対応方法があったり、この挙動自体がシミュレータ固有のバグで実機では発生しない可能性も残されている。

---

## ことの始まり
仕事で作成しているアプリの動作検証を行っていると表題の現象が発生した。
最初は「Bar + Item系のコンポーネントのAutoLayout化の影響だろうな…」と思いつつ状況を確認していたが、そもそもUITabBarはUIToolbar + UIBarButtonItemのカスタムビューのようにレイアウトを自在に決める余地がなく調査は難航した。

しばらくしてStack Overflowに以下の記事が上がっていた。

>iOS 11 iPhone X simulator UITabBar icons and titles being rendered on top covering eachother - Stack Overflow
>https://stackoverflow.com/questions/46214740/ios-11-iphone-x-simulator-uitabbar-icons-and-titles-being-rendered-on-top-coveri

## 対応
いくつかの対応案が上がっているが、実際に「とりあえずなんとかなった」のは以下の方法。
※ iPhone Xのみ発生するため「iPhone Xであること」を判定する処理も必要。

- UITabBar の superview の height を 32px 増やす
- UITabBar の height を 32px 増やす

## 終わりに
iPhone Xの発売まで少し時間があるので、最悪これでなんとかするとしても追って調査を行いたい。
本件について何か情報をお持ちの方がいらっしゃった場合、コメントいただけると助かります。

## 追記 (2017/11/29)
どうやら -setItems: を -viewSafeAreaInsetsDidChange より早い段階で行っていると崩れる場合がある模様。
-viewSafeAreaInsetsDidChange より後に -setItems: すると事象は発生しない。
CMakeでSDLを使ったコードをビルドする設定

CMakeでSDLを使ったソースコードをビルドする設定です。

下記の例のCMakelists.txtを使うとSDLのライブラリとインクルードファイルを設定できます。

```txt:CMakeLists.txt
project("sdl" C)
cmake_minimum_required(VERSION 3.0)

add_executable(sdl_app sdl.c)
find_package(FindSDL)
target_include_directories(sdl_app PRIVATE ${SDL_INCLUDE_DIR})
target_link_libraries(sdl_app ${SDL_LIBRARY})
```

`find_package()`はCMakeにインストール済みのモジュールを呼び出します。
呼び出してSDLが見つかると、`${SDL_INCLUDE_DIR} `と`${SDL_LIBRARY}`に値が
設定されます。

この設定で、LinuxとMACの両方でソースコードをビルドできて便利です。
jsdoでMK-80 その5

#概要
jsdoでMK-80やってみた。
アセンブルして、メモリーへロードするまで、自動化した。
サイコロやってみた。

#サンプルコード

```
keyinput　   EQU　0216H
showsegdata  EQU  01C0H
soko         EQU  83A0H
led0         EQU  83F7H  
led3         EQU  83F4H
ORG 8200H

start:
    mvi a, 00h
    sta led0
    mvi a, 0ffh

start1:
    mov d, a
    add a
    add a
    add d
    inr a
    jz start1
    cpi 07h
    jnc  start1
    sta led3
    sta soko
    call showsegdata
    call keyinput
    lda soko
    jmp start1
    
```


成果物

http://jsdo.it/ohisama1/eRcu

使い方
run click
run2 click
8 2 0 0 adrset
run



以上
anyenv使ってますか？

## anyenv - all in one for **env
> This is a simple wrapper for rbenv style environment managers.
You don't have to git clone or modify your shell profile for each **env anymore if you install anyenv.

はい。
[anyenv](https://github.com/riywo/anyenv)とはrbenvやndenv、goenv、plenvなどをオールインワンでやってくれる素敵なツールです。

anyenvの紹介はほどほどにしておいて…

では、皆さんにもう一点質問です。

## goenv、何使ってますか？
anyenvを使っていない人は、 `brew install goenv` で入るものを使っている方が多いのでは、と思います。

ref: [syndbg/goenv](https://github.com/syndbg/goenv.git)

```zsh
❯ brew info goenv
goenv: stable 1.4.0, HEAD
Go version management
https://github.com/syndbg/goenv
Not installed
From: https://github.com/Homebrew/homebrew-core/blob/master/Formula/goenv.rb
```


僕はanyenvを使っているので [kaneshin/goenv](https://github.com/kaneshin/goenv.git)を参照しています。

でもね、これが辛いんです。

## 何が辛いの

https://freee.slack.com/archives/C2QL6JKG9/p1506936760000411

二つのgoenvのバージョン指定に一部互換性がありません。
末尾が0のメンテバージョンの指定方法に違いがあります。

正確に言うと[syndbg/goenv](https://github.com/syndbg/goenv.git) はメンテバージョンまで指定する必要があるのですが、
[kaneshin/goenv](https://github.com/kaneshin/goenv.git)はメンテバージョンをつけたものが存在しません。
つまりインストールの指定方法が二種類あります。

```zsh
# kaneshin/goenv
❯ goenv install 1.9.0
Not found: 1.9.0
❯ goenv install --list | grep 1.9
...
gae-1.9.1
gae-1.9.0
1.9

# syndbg/goenv
❯ brew info goenv
goenv: stable 1.4.0, HEAD
Go version management
https://github.com/syndbg/goenv
/usr/local/Cellar/goenv/1.4.0 (127 files, 231.3KB) *
  Built from source on 2017-10-04 at 10:39:00
From: https://github.com/Homebrew/homebrew-core/blob/master/Formula/goenv.rb
❯ /usr/local/Cellar/goenv/1.4.0/bin/goenv install -l | grep 1.9.0
  1.9.0
```

jenkinsでinstallする際とか色々まあ運用面が辛い。

## PR作ったよ
anyenvにpr出しました。
homebrewで採用されてるし、こっちの方がメンテされてそうだし、いいよねみたいな。
マージされるといいけど、今anyenv使っているユーザーの環境が壊れるのですぐは厳しそうかな…
https://github.com/riywo/anyenv/pull/56
Kubernetes の設定ファイルの一部を差し替えるスクリプト


# はじめに

* Kubernetes の設定ファイルの値を差し替えるのに kubectl patch が使えるはずなのだが StatefulSet の image の差し替えができないっぽいので急場しのぎのスクリプトを作った

# コード

```rb:patch_yaml.rb
#!/usr/bin/ruby

require 'yaml'

file, path, value = *ARGV

y = YAML.load_file(file)

yy = y
keys = path.split("/")
keys[0 .. -2].each do |s|
  if s.match(/^\d+/)
    yy = yy[s.to_i]
  else
    yy = yy[s]
  end
end
yy[keys[-1]] = value

print y.to_yaml
```

# 使い方

* StatefulSet の一つ目のコンテナのイメージ名を差し替える場合は以下のような感じ

```
ruby patch_yaml.rb statefulset.yml spec/template/spec/containers/0/image MY_IMAGE_NAME
```
mapmate で地理的ビジュアライズ(R)

Rで地図を描画するのは容易ですが、アニメーションを作るには、少々コツが必要です。以前は手動でやっていたのですが、[mapmate](https://github.com/leonawicz/mapmate)という便利なライブラリがあったので使ってみました。

# mapmate の概要

Rのggplot2を利用して地図を作ってそれをアニメーションにするのはよくやることですが、結構コツが必要です。具体的には、地図を表示する際のサイズの設定や解像度、中間ファイルの出力方法など、標準的ではない使い方をしながら、プロダクションを進めないといけません。mapmateではいわゆる現像にあたる部分をほぼ自動化して、かつ、おしゃれな可視化をインスタントにすることが可能です。

Matthew Leonawiczさんという方が作られているようで、まだメンテはされているようです。University of Alaska Fairbanks で統計関係の仕事をしているようです。

## インストール

以下のようにすればOKです。CRANには入っていないようです。
install.packages("devtools")
devtools::install_github("leonawicz/rvtable")

## 使い方（静止画）

lat,lonがあるdata.frameについて、frameIDというカラムを追加すれば、即座に出力可能です。
サンプルではmaptilesというラスタイメージを表示しています。orthoをTRUEにすると地球儀が表示されます。

```R
library(mapmate)
library(dplyr)
data(annualtemps)

library(RColorBrewer)
pal <- rev(brewer.pal(11, "RdYlBu"))
temps <- mutate(annualtemps, frameID = Year - min(Year) + 1)
frame1 <- filter(temps, frameID == 1)  # subset to first frame
id <- "frameID"

save_map(frame1, z.name = "z", id = id, ortho = FALSE, col = pal, type = "maptiles", 
    save.plot = FALSE, return.plot = TRUE)
save_map(frame1, z.name = "z", id = id, col = pal, type = "maptiles", save.plot = FALSE, 
    return.plot = TRUE)
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/146939/066748f3-bcae-6e79-f812-b86ea668f2b4.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/146939/c05232c4-958b-c062-4e69-a02810384456.png)

## 使い方（動画）

静止画なら別にggplotなどを使えばよいので、上記のラッパーを使う意味はあまりありません。動画を作ってみましょう。
こちら[コードサンプル](https://leonawicz.github.io/mapmate/articles/networks.html)にあるように、animate関数を使って、生成される画像列を結合すればよいのですが、以下のように画像シーケンスを作るための関数が用意されています。

```R
gglist <- save_seq(paths_flat, id = "id", n.frames = n, ortho = FALSE, type = "network", 
    ylim = ylm, png.args = png.args, save.plot = FALSE, return.plot = TRUE)
```

アニメーション化は以下のようにanimationパッケージで行います。

```R
library(animation)
ani.options(convert = "C:/Program Files/ImageMagick-7.0.6-Q16/convert.exe")
saveGIF(for (i in seq_along(gglist)) print(gglist[[i]]), "network2D.gif", interval = 1/20, ani.width = 960, ani.height = 480)
```

これで非常に簡単に、以下のようなアニメーションが可能になります。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/146939/9318aad8-04b0-8fae-ec6d-4f7369dbb291.png)

ImageMagickを使っているので、gifアニメーション以外も可能なようですから、活用範囲が広がりそうです。