OmniAICreator/Qiita-1.07M huggingface dataset:
pythonでジオコーディング

「東京タワー」や「両国国技館」のようなランドマーク名から正確な住所や緯度・経度等の地理情報を得ることをジオコーディングという。

Googleが公開しているAPIをpythonでたたいてみた。('17年11月現在、2500req/日のリミットレート)

まず調べたいスポット名をこんな風に書いて…

```text:queries
東京タワー
両国国技館
```

以下の`python geo.py`を実行

```python:geo.py
# -*- coding: utf-8 -*-
import requests
import json
from time import sleep

wait_time = 0.3 # (sec)
base_url = 'https://maps.googleapis.com/maps/api/geocode/json?language=ja&address={}&key=****YOUR_API_KEY***'
headers = {'content-type': 'application/json'}


queries = []
with open('./queries', 'r') as f:
    queries = f.readlines()

for q in queries:
    q = q.strip()
    url = base_url.format(q)
    r = requests.get(url, headers=headers)
    data = r.json()
    if 'results' in data and len(data['results']) > 0 and 'formatted_address' in data['results'][0]:
        print '{}@{}@{}@{}'.format(
            q,
            data['results'][0]['formatted_address'].encode('utf-8'),
            data['results'][0]['geometry']['location']['lat'],
            data['results'][0]['geometry']['location']['lng']
        )
    else:
        print '{}@ @ @ '.format(q)
    sleep(wait_time)
```


**結果**

```
東京タワー@日本、〒105-0011 東京都港区芝公園４丁目２−８@35.6585805@139.7454329
両国国技館@日本、〒130-0015 東京都墨田区横網１丁目３番２８号@35.6969758@139.7932863
```

スポット名@正確な住所@緯度@経度@

という形で出力。
cl-openglでグラフィックス（画像描画編）


# CommonLisp+OpenGLで画像を表示したい

[単純なプリミティブを描画できるようになる](https://qiita.com/kedama17/items/6405790323b6e2917391)と今度は画像を表示してみたくなる。
方法を探っているうちにRAW画像を読み込んで描画する方法がわかったのでサンプルをつくってみた。

# 開発環境

* Windows 10 x64
* Steel Bank Common Lisp 1.3.12
* QuickLisp

# 使用技術

## cl-opengl

先述の記事でも利用したCommon LispからOpenGLを利用するためのライブラリ。
これがないとなにもはじまりません。

## 成果物

参考にしたサイトにあるサンプルをみながらごにょごにょしたサンプルコードを[GitHub](https://github.com/singy15/cl-opengl-image-sample.git)で公開しています。

動かし方

```
cd ~/quicklisp/local-project
git clone https://github.com/singy15/cl-opengl-image-sample.git
cd cl-opengl-image-sample
sbcl
(ql:quickload :cl-opengl-image-sample)
(cl-opengl-image-sample:main)
```

こんな感じで画像の読み込みと描画を行う（一部抜粋）。
`load-rgba-texture`と描画処理部分は参考サイト~~からのパクリ~~を参考にした。

```cl:cl-opengl-image-sample.lisp

;; Variables.
(defparameter *tex* nil)

;; RAW画像を読み込む関数
(defun load-rgba-texture (path width height)
  (let ((texture (cffi:foreign-alloc '%gl:ubyte :count (* width height 4)))
        (image (alexandria:read-file-into-byte-vector path)))
      (loop for i from 0 to (1- (length image)) do
            (setf (cffi:mem-aref texture '%gl:ubyte i) (aref image i)))
      texture))

(defmethod glut:display ((window main-window))
  ; ...
  ;; 画像（テクスチャ）の描画
  (gl:raster-pos 0 0)
  (gl:enable :texture-2d)
  (gl:enable :blend)
  ;; アルファチャンネル有効
  (gl:blend-func :src-alpha :one-minus-src-alpha)
  (let ((x 100.0)
        (y 100.0)
        (size (/ 32.0 2.0))) 
    (gl:with-primitive :quads
    (gl:tex-coord 0 0)
    (gl:vertex (- x size) (- y size) 0)
    (gl:tex-coord 1 0)
    (gl:vertex (+ x size) (- y size) 0)
    (gl:tex-coord 1 1)
    (gl:vertex (+ x size) (+ y size) 0)
    (gl:tex-coord 0 1)
    (gl:vertex (- x size) (+ y size) 0)))
  (gl:disable :blend)
  (gl:disable :texture-2d)
  ; ...
)

(defmethod glut:display-window :before ((window main-window))
  ;; 画像の読み込みとテクスチャの作成
  (gl:pixel-store :unpack-alignment 1)
  (setf *tex* (car (gl:gen-textures 1)))
  (gl:bind-texture :texture-2d *tex*)
  (gl:tex-parameter :texture-2d :texture-min-filter :nearest)
  (gl:tex-parameter :texture-2d :texture-mag-filter :nearest)
  ;; アルファチャンネルがあるので:rgbaを指定、RGBAの順で各値（バイト単位）が並んでいる
  (gl:tex-image-2d :texture-2d 0 :rgba 32 32 0 :rgba :unsigned-byte (load-rgba-texture "./resource/particle.raw" 32 32)))
```

実行するとこんな感じの画面がでる。

![cl-opengl-image-sample.png](https://qiita-image-store.s3.amazonaws.com/0/74246/09593f8b-2d57-94b4-220e-891a8b75b186.png)

# 参考にしたサイト

[リリカル☆Lisp開発日記-cl-openglで画像出た](http://blog.bugyo.tk/lyrical/archives/262)
[Re: Common Lispでパーティクル](http://progn.hateblo.jp/entry/20160913/1473767869)
XorshiftのRustでの実装(32ビット版だけ)

#本日は

最近Macbook12インチの左シフトの反応が悪くなっているこの頃です．
困ったなー・・・．　そう思いながらRustでXorshift（32ビット版だけ）
を実装です．

Rustは文法が難しいと感じたり，私をチュートリアルで挫折させたりしてくれますが，最近見るとRustbyExampleなどのページが出てきて少しやる気を出さしてくれる私にとってのツンデレ（？）言語です．英語ですが，紙媒体でRustの解説本がそろそろでる時期になってきましたので嬉しい限りです．

さて，今回の実装は

- [Rust](https://www.rust-lang.org/ja-JP/)
- [クロージャ](https://rust-lang-ja.github.io/the-rust-programming-language-ja/1.6/book/closures.html)
- [stackoverflow](https://stackoverflow.com/questions/37949215/how-do-i-move-mutable-state-into-a-closure)

などをリファレンスとして記述しました．

# 実装例

```rust:main.rs
//Reference:
//https://stackoverflow.com/questions/37949215/how-do-i-move-mutable-state-into-a-closure

fn xorshift32() -> Box<FnMut() -> u32> {
    let mut y = 2463534242 ;
    Box::new(move || {
        y = y ^ (y << 13);
        y = y ^ (y >> 17);
        y = y ^ (y << 5);
        y
    })
}


fn main() {
    const N :i64 =100000000;
    let mut xor32 = xorshift32();
    let mut x: f32;
    let mut y: f32;
    let mut counter: i64 = 0;
    for _ in 0..N{
        x=((xor32() as i64) as f32)/std::u32::MAX as f32;
        y=((xor32() as i64) as f32)/std::u32::MAX as f32;
        if x*x+y*y < 1.0 {
            counter+=1;
        }
    }
    let pi = 4.0 * (counter as f32)/(N as f32);
    println!("{:?}",pi );
}
```

うーん．変数 `x` や `y` の代入部分はキャストだらけ．

# 実行例（時間計測も含め）

バージョン確認

```shell-session
$ rustc --version
rustc 1.16.0 (30cf806ef 2017-03-10)
```

（2017/11/05　現在は最新バージョンが1.21なのでそろそろ上げておきたいところですね．）

コンパイル

```shell-session
$ rustc -C opt-level=3  main.rs 
```

実行

```shell-session
$ time ./main.rs
3.1416576

real	0m0.653s
user	0m0.637s
sys     0m0.006s
```

思ってたよりも優秀です．

# 追記

ついでにRustバージョンをあげることにしました．

## アップデート
```shell-session
$ rustup update
```
で Rust を 1．21．0 にアップデートしました．

```shell-session
$ rustc --version
rustc 1.21.0 (3b72af97e 2017-10-09)
```

### コード修正
`x=(xor32() as f32)/std::u32::MAX as f32;`
でもコンパイル通りました．血迷っていたようです．

### 時間計測（1.21.0）

```shell-session
$ rustc -C opt-level=3  main.rs 
$ time ./main


3.1416576

real	0m0.965s
user	0m0.933s
sys     0m0.010s
```

あうう・・・．少しスピードダウンしました．
C++で高速にパケット分析するライブラリ PacketMachine

C++でパケット解析する [PacketMachine](https://github.com/m-mizutani/packetmachine) というライブラリの1.0.0をリリースしました，というのを紹介する記事です．

なおこの手の話ではお約束ですが，ネットワークキャプチャはあくまで自分の管理権限がある箇所のみで実施してください。不用意なネットワークキャプチャは法に触れる可能性もありますのでご注意ください。


# 何をするライブラリなのか

研究やネットワーク通信解析などのツール開発をする際，パケットキャプチャの部分をお手軽・かつ性能を出せるように書けるといいなと思ったのがモチベーションです．例えばTCPの通信を `eth0` からキャプチャしてIPアドレスやポート番号を表示する，というのは以下のように書くことができます．

```cpp
#include <iostream>
#include <packetmachine.hpp>

int main(int argc, char* argv[]) {
  pm::Machine m;

  m.on("TCP", [](const pm::Property& p) {
      std::cout << "TCP: " <<
          p["IPv4.src"] << ":" << p["TCP.src_port"] << " > " <<
          p["IPv4.dst"] << ":" << p["TCP.dst_port"] << std::endl;
    });

  m.add_pcapdev("eth0");
  m.loop();
  return 0;
}
```

`pm::Machine` の `on()` というメソッドで引っ掛けたいイベント ([対応イベント一覧](https://github.com/m-mizutani/packetmachine/blob/master/docs/events.md)) とコールバックを指定し，`pm::Property` からパケット解析で得られたパラメータ ([対応パラメータ一覧](https://github.com/m-mizutani/packetmachine/blob/master/docs/parameters.md)) を取り出して利用できます．

他にも，例えばDNSの問い合わせクエリから `.google.` という文字を含むものを探す場合には以下のように書くことができます．

```cpp
#include<iostream>
#include<packetmachine.hpp>

int main(int argc, char* argv[]) {
  int google_count = 0;

  auto m = pm::Machine();
  m.add_pcapfile("eth0");

  m.on("DNS", [&](const pm::Property& p) {
      const auto& vals = p.value("DNS.question");
      if (!vals.is_null()) {
        for (size_t idx = 0; idx < vals.size(); idx++) {
          const auto& v = vals.get(idx);
          auto s = v.find("name").repr();

          if (s.find(".google.") != std::string::npos) {
            google_count++;
          }
        }
      }
    });
  
  std::cout << google_count << std::endl;
  m.loop();
  return 0;
}
```



何ができないのか
================

- PacketMachineはパケットの分析部分を高速化するツールであり，キャプチャを高速化するものではありません．現状はバックエンドに[libpcap](https://github.com/the-tcpdump-group/libpcap)を使っており，netmapやDPDKのようにIOフレームワークを提供するものではありません．
- PacketMachineはパケットの読み取りに特化しており，パケットの編集や新しいパケット作成はできません．

どのぐらい高速なのか
=================

詳しくは[ベンチマークのページ](https://github.com/m-mizutani/packetmachine/blob/master/docs/benchmark.md)に結果を書いていますが，一部抜粋します．

![benchmark_task1.png](https://qiita-image-store.s3.amazonaws.com/0/27627/04345349-c9b9-e19c-efc8-0f6222921040.png)

三種類のデータセットを使って，同じくC++で書かれたパケット分析ライブラリ[libtins](https://github.com/mfontanini/libtins)，Goで書かれた[GoPacket](https://github.com/google/gopacket)と性能を比較しています．

このグラフはTCPポート80番のパケットがいくつあったかを数え上げるタスクの性能を比較しています．ここでの性能とは秒間あたりのパケット処理数（Packet Per Second, pps) であり，縦軸がこれにあたります．ppsは高いほど多くのパケットを処理できることを意味します．

データセットに含まれるパケットの種類などにも影響しますが，PacketMachineは概ね2Mppsを超える性能をだしています．WIDE projectの[MAWIの計測ページ](http://mawi.wide.ad.jp/mawi/ditl/ditl2017/201704130000.html)から計算すると昨今のパケット平均長は約660バイトであるため，2Mpps処理できるとなると約10Gbpsの性能がでると言えます．（実際に `net-2009-11-17-10:32.pcap` のデータセットを使った処理では13Gbpsほどの性能がでています）

念のため注意していただきたいのは，この結果はあくまでライブラリとしての一側面でしかないということです．例えばlibtinsはパケットの加工などの機能も備えているし，GoPacketではGoで書いたほうが親和性の高いプロジェクトもあるでしょう．そういった諸々を踏まえて検討する際の参考にしてほしい，というのがこの結果を出した狙いです．

# 今後

とりあえず公開はしてみましたが，一人で黙々とやっていたプロジェクトなのでまだ機能的にはいろいろ足りないところがありますし（特にTCPセッションのセグメント再構築まわりが怪しい）継続して機能拡張していこうと考えています．もしご意見・ご要望があれば可能な範囲で取り入れさせていただきたいと思いますので，お気軽にお知らせください．
orderという名前のカラムをDROPできなかった時の解決法

# つまづいたこと

あるテーブルで順番を表す「order」という名前のカラムを消そうとして、以下のコマンドを打ったらエラーになった。


```
ALTER TABLE table_name DROP order;
```

```
mysql> ALTER TABLE table_name DROP order;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'order' at line 1
```


# 解決方法

以下のように、カラム名をバッククォートで囲む。
```
ALTER TABLE table_name DROP `order`;
```

# 解決に向けて行ったこと
You have an error in your SQL syntax...のエラーは括弧が足りないとかそういう時にも出てきたので、ぱっと見では原因がわからなかった。
ただ`'order' at line 1`とあったのでそれがキーになっているかと予想。

`ERROR 1064 (42000)`でググった。
そうすると、1件目にヒットしたサイトでorderが予約語のためカラム名に設定できないことがわかる。
予約語を避けるべしと記載してあった。

だが、そういうカラム名が実際についてしまっているので、それでは解決にならない。

さらに複数の検索結果を見て回ったところ、バッククォートで囲むと実行できるとの記載があった。

おそらく、カラムをADDする時も``をつけていたんでしょう。

# あとがき
初めてのQiita記事です。
とにかく発信することが大事というのをエンジニア人生4年余りで学んだので、
些細なことですが投稿してみました。
生温かく見守っていただき、間違いがあれば指摘していただければ幸いです。
UnityのSkyboxを3分で作る

## これは何？
UnityにはシンプルなSkyboxが意外とないので簡単に自作する方法です。

## 背景
・デフォルトのSkyboxだとUnity感が出すぎてイマイチ
・アセットストアのSkyboxはたいてい豪華で綺麗だけどクセがすごい
・Skybox/Proceduralシェーダーむずい、なかなか思うような色にならない
・Unity4の頃は標準でいくつかついてたのになー
・シンプルでシーンを邪魔しないSkyboxは自作するしかなさそう
・でも、例の6面の画像用意しなきゃいけないんでしょ？あとHDRとかよくわかんないし

# 概要
・普通の正方形画像1枚だけでSkyboxは作れる
・HDRも必要なし
・これならみんな大好きペイントだけでできる
・3分でできる、慣れれば秒でできる
・Unity5.6で確認、Unity2017でもたぶん一緒
・派手でリアルなやつはアセットストアから入手する方が良いと思います

# 作り方
ペイントなどで、上下で色が異なる1024x1024ピクセルの画像を作ります。
<img width="128" alt="skybox.png" src="https://qiita-image-store.s3.amazonaws.com/0/22455/577c3129-a76b-9341-c49e-f6b89c4f4c64.png">

画像をUnityのAssetフォルダに入れます。

画像のプロパティを設定します。
・Texture ShapeをCubeにしてApply
![sb1.png](https://qiita-image-store.s3.amazonaws.com/0/22455/986aa1e7-bbb7-ca99-5da0-c890c681d8cf.png)

Assets→Create→Materialで新規マテリアル作成。

マテリアルのプロパティを設定します。
・ShaderをSkybox/Cubemapに
・Cubemapに上記画像を指定
![sb2.png](https://qiita-image-store.s3.amazonaws.com/0/22455/3459914e-8f17-a29b-56f9-93f4ed88c71d.png)

Window→Lighting→Settings→Sceneを開きます。
・Skybox Materialに上記マテリアルを指定
![sb3.png](https://qiita-image-store.s3.amazonaws.com/0/22455/1224b7e4-aa64-02ab-0a59-f57544d86cdb.png)

できた。
![sb4.png](https://qiita-image-store.s3.amazonaws.com/0/22455/6e0e6e92-4172-6083-e56e-6316328f3c91.png)
Watch App を Xcode 9 で申請したら、ファイルサイズエラーになった

# エラー出た

Xcode 9.1 を使って、iPhone X 対応を行なったアプリを申請しようとしたら、思わぬところでエラーになってしまいました。

<img width="764" alt="screen-shot.png" src="https://qiita-image-store.s3.amazonaws.com/0/7478/53071137-c27a-bd0a-7d03-03a731361ee7.png">

**iTunes Store Operation Failed**
Size Limit Exceeded. The size of watch application 'ConveniSearch.app/Watch/WatchApp.app' (76MB) has exceeded the 75MB size limit.

**Watch App の容量が大きいのでアップロードできません**

あと 1MB ...

今まではこんなエラーも出なかったし、今回もウォッチ部分は改修していないので、Xcode 9 で何かが変わってしまったんでしょうかね。。。

# 1024 * 1024 の画像のせい？

Xcode 9 からは、App Store で利用する大きいアイコン画像（1024*1024）を、アプリ内にバンドルさせて申請する必要があります。

どうやら、WatchApp の AssetCatalog にも、この大きいアイコンを含めなくてはいけなくなりました。

サイズオーバーもこれのせいなのかな？？って思っていたのですが、そもそも画像サイズも20KBくらいなので、このアイコンをどうにかしても、どうしようもないですね...

# とりあえずの回避方法

WatchApp の Build Settings にて、**Always Embed Swift Standard Libraries** を NO にすることで、容量の削減ができました。

<img width="845" alt="screen-shot2.png" src="https://qiita-image-store.s3.amazonaws.com/0/7478/02d1d0df-c751-1aa7-a9e5-c6f16fe31c31.png">

というか、この項目ってデフォルトがYESなのかな？
Virtualboxで動くHigh SierraのVMをつくる

# はじめに
ここを見て運用しています。
http://tobiwashere.de/2017/10/virtualbox-how-to-create-a-macos-high-sierra-vm-to-run-on-a-mac-host-system/

>ざっくりすぎますが、この手順通りにしただけなので、ほぼメモです。

# 少し変えたところ
Xcode周りのインストールと、CIで稼働させる設定（bundlerなど）がある
ファイルサイズは60G前後に設定しています。

# さいごに
SierraではpackerやveeweeなどでISOをつかわずにvmイメージをつくる作業だったことに比べると、だいぶ楽になった気がします。ただ、Sierraでも公開当初はISOを作成し、という方法から、バージョンアップ後にそれができなくなる、といったこともあり

- 作成可能なHigh Sierraインストーラーは早めにダウンロード
- packerやveeweeを使う方法もある

ここらへんは残しておこうと書いています。（すぐ忘れる）
npmのバージョンを変える

npmバージョンを今の5.5.1からダウングレードしたいのに出来ない事象が起きたのでまとめる


#〇事象#

ある本のマニュアルに従いサンプルアプリを作っている時、bootstrapをインストールの指定があったので実施したところ、
`can not find property "0" od underdefined`と怒られる。

ググったところnpmバージョンが5.3.0だと発生します的なコメントがあったので、ひとまず5.2.0に落とすべく`npm install npm@5.2.0`する。

しかし、`npm -v`するとまだ5.5.1のまま、なぜか分からない、、、、

<img width="733" alt="1.png" src="https://qiita-image-store.s3.amazonaws.com/0/201155/77aa9457-ebcd-1bdb-6eff-5aeff9f6a68e.png">

いろいろ調べた結果、下記の方法でひとまず解決。

#対策#

まずProgram Files(x86)>Nodist>npmvに入る

<img width="477" alt="8.png" src="https://qiita-image-store.s3.amazonaws.com/0/201155/9055f707-6ed7-4b23-8a5d-aa21681389ba.png">

npmのGithubのReleaseへアクセスし、適当なバージョンをダウンロード。

<img width="960" alt="9.png" src="https://qiita-image-store.s3.amazonaws.com/0/201155/342a6b1b-1dfc-d4de-af4c-227ad44a9e39.png">

ダウンロードしたファイルをnpmvへ格納(ここで間違えてエラーになると言われている5.3.0をダウンロードしてしまう、、、)。4.0.5はなぜか元々ありました、以前ダウンロードしたのかもしれません、覚えていませんが、、

<img width="707" alt="3.png" src="https://qiita-image-store.s3.amazonaws.com/0/201155/d7a45e15-018a-49ac-cb94-41ba46d28fe2.png">

コマンドプロンプトを開き、`nodist npm`で使えるバージョンに4.0.5と5.3.0がある事を確認。`nodist npm 5.3.0`と実行すると、npmのバージョンが切り替わる。

<img width="732" alt="4.png" src="https://qiita-image-store.s3.amazonaws.com/0/201155/69736757-ab5c-f46f-4ceb-850539b2270d.png">

ここで`nodist npm... `と打ち込むのが肝だったみたいです。

最初に戻ってbootstrapをインストールしたいフォルダで念のためもう一度npmバージョンを確認。5.3.0になっている事を確かめた上で、bootstrapをインストールしようとすると、、、、再度同じエラー(`can not find...`)。5.3.0なので当たり前。

<img width="711" alt="5.png" src="https://qiita-image-store.s3.amazonaws.com/0/201155/f55bace0-8d90-afe8-63c8-c08883cfca82.png">

コマンドプロンプトへ戻り、npmのバージョンを4.0.5へ落とす。

<img width="678" alt="6.png" src="https://qiita-image-store.s3.amazonaws.com/0/201155/4068dfec-f7ee-aaaf-07ab-f4ba143f4e84.png">

またまたbootstrapをインストールしたフォルダに戻り再度チャレンジ。

<img width="719" alt="7.png" src="https://qiita-image-store.s3.amazonaws.com/0/201155/221a863d-1d26-aa9d-a41a-5f16ab2213f7.png">

いろいろwarningは出されましたが、bootstrapのインストールは成功。

そもそもなぜ`can not find 0...`と出るのか？本当に5.3.0以降のバージョンだからなのか？もしbootstrapのバージョンが古くて噛み合っていないならbootstrapをアップデートすればよかったのか？そのあたりを調べるのは面倒なので、ここまでとします。
綺麗に止まられるRedisのSubscriber

# PythonでThreadを起こしてRedisをSubscribeするとき

下記のように書いておけば、親スレッド停止時にstopを呼んであげるだけで綺麗に止められる。

```python
class Subscriber():
    def __init__(self):
        self.stop_event = threading.Event()

        kvs = redis.StrictRedis(host='localhost', port=6379, db=0)
        self.pubsub = kvs.pubsub()
        self.pubsub.subscribe('channel')

        self.thread = threading.Thread(target=self.target)
        self.thread.daemon = True
        self.thread.start()

    def target(self):
        while not self.stop_event.is_set():
            for message in self.pubsub.listen():
                print(message)

    def stop(self):
        self.stop_event.set()
        self.pubsub.unsubscribe()
        self.thread.join()
```

ググっても、良いサンプルが無かったので書き残しておくのでした。

スレッド操作はxeno1991さんの記事を参考にしました。
https://qiita.com/xeno1991/items/b207d55a413664513e5f
rubyにおける標準入出力

# puts

putsは文字列表現や改行などを文字列表現に変換して出力してくれます。一般的にwebサイトで表示したいときはこのputsを使います。

# print

printは改行のない状態で出力される。

# p

型表現も含めた形で出力する。主にデバックで用いられる。

# gets

ターミナルから入力したいときに使う。
NTPのpeerの使い方

# NTPのpeerの使い方

ntp.confにpeerというオプションがあり、多くのシステムで使用されていますがpeerは本来、次のような異なるNTP Serverを参照し、かつ階層(Stratum)が同じクライアント間で設定する。

 ~~~~ 

(正)
NTP Server           NTP Server
    ↑                     ↑
    ↑参照                  ↑参照
    ↑                     ↑
NTP Client ←←peer→→NTP Client
 ~~~~  

しかし間違った使い方をしているシステムをよく見かけます。
次のような同じNTP Serverを参照しているクライアント間でpeerを設定する。

 ~~~~ 

(誤)
           NTP Server
           ／        ＼
         ／ 参照        ＼参照
    NTP Client ←peer→NTP Client

 ~~~~ 


これは本来のpeerの使用目的にはあわず、設定しても意味がない。
また同一Serverを参照しているクライアント間ではpeer設定をしないようにといった記述もありました。
(設定するとどのような弊害があるかまでは記述なし)
High Sierra アップグレードで日本語入力不具合とiTunes が起動しない問題の解決

# 何がしたかったのか？

macOS を Sierra　から High Sierra にアップデートしたところ、iTunes が起動しなくなり、日本語の入力もおかしくなったので、その解決方法のご紹介です。

# 解決方法

とりあえず、答えだけ知りたい方向けに解決方法を。

「**Font Book**」アプリで「**Kokonor**」フォントファミリーを「**使用する**」に設定する。

・・・これだけです。

これで、日本語入力の不具合と、iTunes が起動しなくなる問題の両方が一挙に解決されました。

情報源は Apple 公式サポートコミュニティの「[High Sierraで日本語が２〜３文字以上打てない](https://discussionsjapan.apple.com/thread/110192107?start=0&tstart=0)」です。感謝。

# 蛇足

「騙されたと思ってやってみてください。」
そんな言葉がしっくりする解決方法でした。
（今までの人生の中でも最大級の「やってみてびっくり」感。）

同じ機械なのに別ユーザーでは発生しないなど、不可解な症状が発生し、いろいろなことを試してみたのですが、上記の設定だけで見事に解決しました。

何より「Kokonor」フォントを「**使用しない**」ことで不具合が再発するという「**再現性がある**」という点で、これが原因（および解決策）であると断じて良さそうです。

これ、解決方法もさることながら、このフォントが原因だと気付いた人も、どれだけ試行錯誤したのかと思うと頭の下がる思いです。

それにしても・・・なぜ？

# 参考

- Apple 公式サポートコミュニティ「[High Sierraで日本語が２〜３文字以上打てない](https://discussionsjapan.apple.com/thread/110192107?start=0&tstart=0)」
【翻訳】Rubyでクラスをrenameする

Ruby学習の一環として、週に1度Ruby関連のブログ記事(英語)を翻訳しています。
今回はクラスをrenameする方法。

原文：[Renaming class in Ruby (a kinda)](https://mindaslab.github.io/2017/10/30/Renaming-class-in-Ruby-a-kinda.html)

↓以下本文↓

---------------------

例えば犬に関するコードを変更しなければならなくなったとしましょう。犬には何種類かあって、コードは以下のようになっているとします。


```rb
module Animal
  module Domestic
    class Dog
      def sound
        "woof"
      end
    end
  end

  module Wild
    class Dog
      def sound
        "grrr"
      end
    end
  end
end
```
コードを見ると、犬には2種類あることがわかります。1つは`Wild`で、`Animal::Wild::Dog`のようにアクセスすることができ、もう一方は`Domestic`で、こちらも同様の方法でアクセスすることができます。

なので、`Domestic::Dog`と`Wild::Dog`の`sound`を使いたい場合、以下のようなプログラムを書くことになります。

```rb
# using_dog_in_animal_module.rb

require_relative "dog_in_animal_module.rb"

include Animal

puts Domestic::Dog.new.sound
puts Wild::Dog.new.sound
```

でも毎度`Domestic::Dog.new.sound`と打つのは長くて面倒ですよね…短くすることはできるのでしょうか？幸い、Rubyではそれが可能です。以下のプログラムを見てみてください。

```rb
# renaming_class.rb

require_relative "dog_in_animal_module.rb"

DomesticDog = Animal::Domestic::Dog
WildDog = Animal::Wild::Dog

puts DomesticDog.new.sound
puts WildDog.new.sound
```
上記のコードの5, 6行目を見ると、クラスをrenameするようなことをしています。`DomesticDog = Animal::Domestic::Dog`の箇所で `Animal::Domestic::Dog`という長いクラス名を`DomesticDog`という定数に置き換えており、8行目では`puts DomesticDog.new.sound`と行った短い形式で呼び出せるようになりました。

プログラムが大規模になっている場合、タイピングの工数を減らせるのはありがたいですよね。Happy coding! :)
Blenderでボーンを設定する時のテクニック



## 困っていること

下の画像のようにBlenderで人型のボーンを埋め込むとした時に、
![initial_state.png](https://qiita-image-store.s3.amazonaws.com/0/200963/c9379a18-09af-425b-1518-956b92d6c8ff.png "initial_state.png")

左半面の位置設定はうまくいったのでそれと同じように右半面の設定を行いたいが、どうやればいいかわからない。
![after_edit_left.png](https://qiita-image-store.s3.amazonaws.com/0/200963/2f760652-7d0a-d55f-e27f-539c37fe52a2.png "after_edit_left.png")


## 解決方法
1. 編集モードに切り替え
2. Cを押して範囲選択を行い、左腕と右足を選択する
![range_pointing.png](https://qiita-image-store.s3.amazonaws.com/0/200963/05192e90-146e-7fcd-afcc-aa3b860fdc18.png "range_pointing.png")
3. アーマチュア ＞ 対称化を選択する
![set_symmetry.png](https://qiita-image-store.s3.amazonaws.com/0/200963/ef1f8c66-f968-04b8-6cc9-5c77ba39a00b.png "set_symmetry.png")
4. そのまま実行
![result.png](https://qiita-image-store.s3.amazonaws.com/0/200963/4b7ddbd8-4ba0-7c7e-a66a-9612067c1d97.png "result.png")

右側も左と同じように位置設定が行われる。
GitHub導入

# はじめに
そろそろ本気でGitでversion管理。
ということでSubversionに別れを告げるべく、
Gitセットアップからリモートリポジトリへのpushまでやってみます。


# 環境
macOS Sierra 10.12.5

# その前に
Git、GitHubとはなんぞや
[GitHub 入門](https://qiita.com/ay3/items/8d758ebde41d256a32dc)
[SubversionからのGit入門(Gitのメリット、Subversionとの違い)](https://qiita.com/kitfactory/items/693580ca3f51f5833874)

# Gitのインストール  
Macの場合、デフォでインストールされている為、基本的には不要。
ただし、versionが古い場合があるので最新版を入れておいた方が無難。

versionを確認  

```
$ git --version
```

[ここで](https://git-scm.com/)最新のversionを確認、古ければ更新しておく

```
$ brew upgrade git
```

# ユーザー情報の設定
ユーザー名とメールアドレスを設定する。
全てのGitのコミットはこの情報を用いる。

```
$ git config --global user.name [ユーザー名]  
$ git config --global user.email [メールアドレス]  
```

設定を確認(こんな感じで出ればOK)  

```
$ git config --list  
user.name=[ユーザー名]  
user.email=[メールアドレス]  
...  
```

# 公開鍵・秘密鍵の作成
GitHubにSSH接続するために鍵を作成する  

鍵の生成

```
$ cd ~/.ssh
$ ssh-keygen -t rsa -C [メールアドレス]
```
鍵が作成される
id_rsa : 秘密鍵
id_rsa.pub : 公開鍵

秘密鍵のパーミッションを変更  

```
$ chmod 600 id_rsa
```

# SSH接続設定 
ファイルに下記設定を追記しておけば
以降、` $ ssh github`で接続可能となる。

```ruby:~/.ssh/config
Host github
  HostName github.com
  User git
  IdentityFile ~/.ssh/id_rsa
```

# GitHubアカウント作成、公開鍵の登録
こちらで丁寧に説明されているので。
[GitHubアカウント作成とリポジトリの作成手順](https://qiita.com/kooohei/items/361da3c9dbb6e0c7946b)
[githubの複数アカウントにSSH接続するための設定手順](https://dev.classmethod.jp/tool/github-ssh-sub-account-setting/)  

# GitHubへの接続確認
SSHでの接続確認を行う。
下記のようなメッセージ出ればOK（一瞬エラーっぽく見える内容だが問題ない）  

```
$ ssh github
PTY allocation request failed on channel 0
Hi [ユーザー名]! You've successfully authenticated, but GitHub does not provide shell access.
Connection to github.com closed.
```

# リポジトリをクローンする
Git管理用のディレクトリを作成する

```
$ mkdir git
$ cd git
```

リポジトリをローカルにコピー  

```
$ git clone [GitHubのSSH接続URL]
```

※SSH接続URLは GitHubサイトのリポジトリページで確認しておく
<img width="493" alt="スクリーンショット 2017-11-05 4.22.04.png" src="https://qiita-image-store.s3.amazonaws.com/0/211679/c974cbd0-1225-03b9-e0e3-22cbcdb23495.png">


# Git操作(add、commit、push)

Git管理対象ファイルの追加

```
$ git add test.md
```

変更内容の確認

```
$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
new file:   test.md
```

コミット  

```
$ git commit -a
```

リモートリポジトリへプッシュ

```
$ git push origin master
```

# おわりに
いずれ複数ブランチのマージを試してみたい。
いずれ。
phpで動的な週カレンダーを作りたい

# よくある週間のカレンダーを作る
開いた時の曜日スタートで作れば楽なのに
常に曜日固定の週間カレンダーでなければならない時に困った。

## Datetimeオブジェクトをインスタンスする
```php
new DateTime();
```
これを使いましょう。

## 常に週の始まりにしたい
```php
(new DateTime())->modify('monday this week');
```
うん、これでいいはず。


これでいい？？？
これでいいの？？？
ってなったのです。

だって週の始まりってやってるのにずれる時とずれない時があったんです。

# phpでの週の始まりって曜日いつだ？？
はい、考えました。
だって日曜から始まるカレンダーもあれば、月曜から始まってるカレンダーもありますね。
サーバーではうまくいくのにローカル環境ではうまくいかない。
ずれるなー、週の始まりがいけないのかーってなった時に調べました。

# phpのバージョンによって違う！
大げさに言いましたが違う訳ではなく、5.6.23から変わってました。
>5.6.23,7.0.8
週の始まりが常に月曜日となりました。 これより前のバージョンでは、日曜日も週の始まりとみなされていました。
[PHP: サポートする日付と時刻の書式](http://jp2.php.net/manual/ja/datetime.formats.relative.php)

なるほど、しっかりローカルのバージョン管理をしましょう。自業自得でした。。
**とある先生**にもらったdockerイメージをまんま使っていたのが原因ですね。。
dockerも勉強しないと。。。

# modifyの連打が必要。
これもちょっと問題でした。
カレンダーのhtml構造上、横にループする形だったので

```php
$date->modify('+1 day')->format('Y-m-d');
```

って土曜日まで回したら

```php
$date->modify('-６day');
```

みたいに挟んでまた１日ずつずらしてって、なんか無駄だなー
modifyはするけど自身をずらして欲しくないなーなんて書いていたらやっぱりありました。

#DateTimeImmutable クラス
やっぱりあるのか。。
本当にphp知識がないですね。。
>はじめに
---
このクラスの挙動は DateTime とほぼ同じですが、 自分自身は変更せずに新しいオブジェクトを返すという点だけが異なります。
[PHP: DateTimeImmutable](http://jp2.php.net/manual/ja/class.datetimeimmutable.php#class.datetimeimmutable)

本当ドキュメント見ればいいのにって思った。
ドキュメントが充実してるphpさん。
頑張りましょう。
zsh でオプション指定を含む変数を埋め込みコマンドを実行する

スペースやオプション指定を含む文字列をコマンドに展開して使おうとするとエラーとなる。

```shell-session
$ MYOPTIONS="-alh -G"
$ ls $MYOPTIONS
ls: illegal option --...
```

スペースを含む文字列として扱われてしまう。
そんなときは **eval** を使う。コマンドの先頭につけるだけ。

```shell-session
$ eval ls $MYOPTIONS
total 384
drwxr-xr-x   19 hiro  staff   646B 11  4 12:43 .
drwxr-xr-x   46 hiro  staff   1.5K 11  5 00:09 ..
-rw-r--r--    1 hiro  staff    34B 10 26 22:05 .babelrc
...
```

引数を複数含む場合も。

```shell-session
$ export ENABLEHOSTS="$(cat ./enable_hosts.txt |perl -pe 's/^/ -d /g'| perl -pe 's/\n//g')"

$ echo $ENABLEHOSTS
-d elzup.com -d www.elzup.com -d app.elzup.com ...

$ eval ./letsencrypt-auto certonly --standalone $ENABLEHOSTS
... Congratulations! ...
```
Fabric 1.7.2 以降の Run Script の Path の変更

## 前提
```
- Xcode 9.1
- Swift 4.0.2
- CocoaPods 1.3.1
- Fabric 1.7.2
```

## 警告メッセージ
The run script is now located at '${PODS_ROOT}/Fabric/run'. To remove this warning, update your Run Script Build Phase to point to this new location.

実行スクリプトは '$ {PODS_ROOT} / Fabric / run'にあります。 この警告を削除するには、Run Script Build Phase をこの新しい Path を指すように更新してください。

## 設定

Xcode > TARGETS > Build Phases > Run Script を 以下のように修正

```diff
- shellScript = "./Pods/Fabric/Fabric.framework/run xxx;
+ shellScript = "./Pods/Fabric/run xxx;
```

command + b して warning が消えていれば修正完了です！
Android　アプリ実装TIPS、参考サイトまとめ（機能実装編）

文系出身新卒１年目、java、Android未経験者が
Androidアプリを作成していく上で参考になったものまとめですっ！　（機能実装編）

おすすめ記事があれば今後も随時更新予定です！！

# ＜機能実装TIPS集＞


##端末バックボタン操作 <br>

iOSと違ってAndroid端末にはバックボタンがあるので、時にはその動作を考えることが必要。
バックボタン＝１つ前のアクティビティに戻る、だがビューの表示を切り替えるのが自然な場合とか。
そういう時はボタンの挙動をoverrideする。

[BACK ボタンを押したときの動作を変える方法](http://android.keicode.com/basics/how-to-change-back-button.php)


##電話アプリへの遷移 <br>

電話番号をタップした時に電話アプリを起動させるときは、明示的にintentを発行すればOK（Intent.ACTION_DIALを使用する）

[Android WebView “tel:” links show web page not found](https://stackoverflow.com/questions/4338305/android-webview-tel-links-show-web-page-not-found)

##SNSシェア <br>

SNSシェアをする時は、intentを発行させる。アプリがない場合はwebで開くか、ストアに飛ばさせる。

[Gmail・Line・Facebook・Twitter 公式アプリで共有させたい時のIntentの投げ方](http://qiita.com/ueno-yuhei/items/f5c7b36e2931a9da143f)

##明るさ調整 <br>

Androidでは、アクティビティ単位でディスプレイの明るさを変更することが可能

[[iOS][Android] ディスプレイの輝度を最大にする方法](http://dev.classmethod.jp/smartphone/adjust-brightness/)
進行方向に弾を発射する

キャラクターオブジェクトの子に付けたempty objectから弾を発射するも、発射位置が子に追従せずに最初に設定した位置から生成されてしまうので調べてみた。

![LocalPosition&worldPosition1.gif](https://qiita-image-store.s3.amazonaws.com/0/185127/a04dca06-9fc7-1a91-4206-73b4f9fcb9f5.gif)
こんな感じ。

ソースは以下。

	void Update () {

        if (Input.GetKeyDown("space"))
        {
            GameObject runcherBullet = GameObject.Instantiate(bullet) as GameObject; //runcherbulletにbulletのインスタンスを格納
            runcherBullet.GetComponent<Rigidbody>().velocity = transform.forward * bulletSpeed; //アタッチしているオブジェクトの前方にbullet speedの速さで発射

        }
	}

上記のempty object(runcherbullet)の座標を調べてみるとLocal座標で見るとキャラの位置が変わっても座標が固定になっているので、ワールド座標にするために下記のように修正。

	void Update () {

        if (Input.GetKeyDown("space"))
        {
            GameObject runcherBullet = GameObject.Instantiate(bullet) as GameObject; //runcherbulletにbulletのインスタンスを格納
            runcherBullet.GetComponent<Rigidbody>().velocity = transform.forward * bulletSpeed; //アタッチしているオブジェクトの前方にbullet speedの速さで発射
            runcherBullet.transform.position = transform.position;
        }
	}

![LocalPosition&worldPosition2.gif](https://qiita-image-store.s3.amazonaws.com/0/185127/69a74221-62db-89ea-8f32-e242162630ab.gif)
うまくいきました！
プレイヤーの移動に対して向きを変更する

# キャラクターの向きを変更するには

`Quaternion.LookRotation()`を使用して進む方向へのベクトルを引き渡して回転量を取得して向きを変更する。

```C#
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Player : MonoBehaviour {

    public float speed; //プレイヤーの動くスピード

    private Vector3 Player_pos; //プレイヤーのポジション
    private float x; //x方向のImputの値
    private float z; //z方向のInputの値
    private Rigidbody rigd;

    void Start()
    {
        Player_pos = GetComponent<Transform>().position; //最初の時点でのプレイヤーのポジションを取得
        rigd = GetComponent<Rigidbody>(); //プレイヤーのRigidbodyを取得
    }

    void Update()
    {

        x = Input.GetAxis("Horizontal"); //x方向のInputの値を取得
        z = Input.GetAxis("Vertical"); //z方向のInputの値を取得

        rigd.velocity = new Vector3(x * speed, 0, z * speed); //プレイヤーのRigidbodyに対してInputにspeedを掛けた値で更新し移動

        Vector3 diff = transform.position - Player_pos; //プレイヤーがどの方向に進んでいるかがわかるように、初期位置と現在地の座標差分を取得

        if (diff.magnitude > 0.01f) //ベクトルの長さが0.01fより大きい場合にプレイヤーの向きを変える処理を入れる(0では入れないので）
        {
            transform.rotation = Quaternion.LookRotation(diff);  //ベクトルの情報をQuaternion.LookRotationに引き渡し回転量を取得しプレイヤーを回転させる
        }

        Player_pos = transform.position; //プレイヤーの位置を更新


    }

}
```

参考リンク
[強火で進め:[Unity][Unity3d]進行方向にキャラクターの向きを変える](http://d.hatena.ne.jp/nakamura001/20130718/1374175612)
[強火で進め:[Unity][Unity3d]キャラクターの移動処理(入力した方向へ移動するタイプ)Add Star](http://d.hatena.ne.jp/nakamura001/20110613/1307992289)
現在時刻の取得方法

## System.DateTime.Now

    void TimeStamp()
    {
        HH = System.DateTime.Now.Hour.ToString();
        MM = System.DateTime.Now.Minute.ToString();
        SS = System.DateTime.Now.Second.ToString();

        Debug.Log(HH + ":" + MM+":"+ SS);

    }

DeltaTimeで取得できなかったので、調べたら上記。System.DateTime.Now.XXXXXで現在の日時に関する値を取得できる。
対象をカメラに移すまで待機させる

### 概要

現在見えている画面外に配置した敵等のオブジェクトが、カメラに映るまで待機させておく方法。


### ソース

```
    private bool is_Rendered;

    void OnWillRenderObject()
    {
        if (Camera.current.name == "Main Camera")
        {
            is_Rendered = true;
        }
    }
```

`OnWillRenderObject()`はオブジェクトが表示されている場合カメラごとに 1 度呼び出されます。
なので、呼び出されたらis_Renderをtrueにして、あとはUpdate()内の行動をif分などで制御したりすればよい。

```
	void Update () {

        TimeElapsed += Time.deltaTime;

        if (is_Active == true && is_Rendered == true)
        {
            //プレイヤーの方向に向かって移動していく
            Vector3 diff = (player.transform.position - transform.position); //プレイヤーと対照との差分を取得
            Enemy_rigidbody.velocity = new Vector3(diff.x * speed_x, diff.y * speed_y);//取得した座標に対して変数をかけてやると進む
        }
```

こんな感じ。
プレイヤーの移動範囲を制限する

### 概要
***
画面をスクロールする際にプレイヤーの移動範囲に制限を付けたい場合、`Mathf.Clamp`を使用して常に値が超えないようにするようにするのが便利。

### ソース
***
```
private Vector2 player_pos;

    void Clamp()
    {
        player_pos = transform.position; //プレイヤーの位置を取得

        player_pos.x = Mathf.Clamp(player_pos.x, -4.8f, 4.8f); //x位置が常に範囲内か監視
        transform.position = new Vector2(player_pos.x, player_pos.y); //範囲内であれば常にその位置がそのまま入る
    }
```
`Mathf.Clamp(float value, float min, float max)`で、`Mathf.Clamp(制限したい値, 制限したい値の下限, 制限したい値の上限)`としてあげればよい。
敵がプレイヤーに向かってくるようにする

## 概要

敵がプレイヤーを追尾するようにしてみる。``transform.LookAt``を使用してみたが、2DだとSpriteが変な方向に向いてしまうので、別の方法を試す。

###ソース

	void Update () {

        
            //プレイヤーの方向に向かって移動していく
            Vector3 diff = (player.transform.position - transform.position); //プレイヤーと対照との差分を取得
            Enemy_rigidbody.velocity = new Vector3(diff.x * speed_x, diff.y * speed_y);//取得した座標に対して変数をかけてやると進む
        }

	}

シンプル。上記の場合ではx軸とy軸方向で進む速度を変更したかったので別の変数を使用している。
Shell 用 Timestamp スニペットを用意しておくと便利

## Snippet

`` $(date '+%Y%m%d-%H%M%S') ``
`` `date '+%Y%m%d-%H%M%S'` ``
↑バッククォート含む

## 使う例


```shell-session
# ファイル名にタイムスタンプをつけながらバックアップ移動
mv data backup/data-$(date '+%Y%m%d-%H%M%S')

# タイムスタンプ付きディレクトリ作成
# mkdir tmp-$(date '+%Y%m%d-%H%M%S')
```

Alfred の snippet に記録するとこんな感じです。

![bg-ts.gif](https://qiita-image-store.s3.amazonaws.com/0/40717/97912ef2-f898-64e9-425f-3a563b612115.gif)

Alfred の場合直接タイムスタンプをクリップボードに保存するのもあります。
https://github.com/mwaterfall/alfred-datetime-format-converter
ubuntuサーバを最速でコピーする (ISUCON向け)

ISUCONでは、サーバ壊すとそれで試合終了になるので、ぶっ壊しても困らない環境を最速でコピーします。
この記事を書いている時は、[IDCF Cloud](https://www.idcf.jp/cloud/)の ubuntu 16.04 を利用しています。

## ISUCON Imageサーバで作業

```bash
# 面倒くさいのでrootにスイッチ
sudo su -

# /backup に全て放り込むため
mkdir /backup
cd /backup

# apt-get でインストールされたパッケージ履歴から apt-get コマンドを生成
cat /var/log/apt/history.log | grep 'Commandline' |  awk -F 'Commandline: ' '{print $2}' > /backup/01-apt-get.sh

# /etc 配下をtarで固めてもっていきます
tar zcf etc.tgz /etc

# /home/isucon 配下をtarで固めて持っていきます
tar zcf home-isucon.tgz /home/isucon

# mysqlの全データをdump
mysqldump -u root-p -A | gzip > ./mysqldump.sql.tgz

# 動いているProcess一覧 (確認用)
ps aux > ps-aux.txt

# 起動中のサービス一覧 (確認用)
systemctl list-unit-files -t service > systemctl-list-unit-files.txt
```

## コピー先のサーバでやること

```bash
sudo su -
scp -r isucon@`ISUCON ImageサーバのIP:/backup /
cd /backup

tar zxf home-isucon.tgz
mv home/isucon /home/

tar zxf etc.tgz
rm -rf /etc
mv etc /

apt-get update
bash ./01-apt-get.sh

systemctl daemon-reload

zcat mysqldump.sql.tgz | mysql -u root -p
mysqladmin -u root -p flush-privileges
```

かなり乱暴なやり方ですが、上記をスクリプト化して実行すると、サクッと環境のコピーができます。
Amazon EC2 (Amazon Linux)に PHP 7 + Laravel 5.5 + MySQL をインストールする手順 (201711版)

# 参考資料
https://qiita.com/zz22394/items/2d684d980f35106d3c65

Amazon EC2 (Amazon Linux)に PHP 5.6 + Laravel 5.3 + Apache 2.4をインストールする手順 (sedでphp.iniのdate.timezoneをAsia/Tokyoに変更するワンライナー)
https://qiita.com/na0AaooQ/items/e9b782be01ce6946d7e8

# Goal
Amazon EC2 (Amazon Linux)に PHP 7 + Laravel 5.5 + Apache 2.4 + MySQL をインストールする手順 (201711版)

# 手順
## PHP 7
```bash
sudo yum -y install php70 php70-mbstring php70-pdo
```

## Git
```bash
sudo yum install git
```

## Composer
```bash
sudo curl -sS https://getcomposer.org/installer | php
sudo mv composer.phar /usr/local/bin/composer
sudo chown root:root /usr/local/bin/composer
ll /usr/local/bin/composer
```
※Macの場合は `sudo chown root:wheel /usr/local/bin/composer`

## MySQL
* https://qiita.com/toshihirock/items/c5933d3628c7d4e81ffa

EC2にMySQLインストールと設定確認

```bash
sudo yum install  mysql56 mysql56-server
sudo service mysqld start
sudo /usr/libexec/mysql56/mysql_secure_installation
```

```sql
CREATE USER your_user IDENTIFIED BY 'your_password';

drop database your_database;
create database your_database character set utf8;
show create database your_database;
GRANT ALL PRIVILEGES ON your_database.* TO your_user@localhost IDENTIFIED BY 'your_password';
flush privileges;

select Host, User, Password  from mysql.user;

mysql -u your_user -p
```

## PHP - MySQL Library install
```bash
yum list available | grep php70
sudo yum install php70-mysqlnd
yum list installed | grep php70

```
cl-openglでグラフィックス（文字列描画編:GLisph）


# Common Lisp＋OpenGLで文字列を描画したい

[以前書いた記事](https://qiita.com/kedama17/items/6405790323b6e2917391)からいろいろとグラフィックス関連を触ってて、
文字列を描画したくなったので方法を探ってみた結果、
良さそうなものがあったのでありがたく利用させていただいてサンプルを作ってみた。

# 開発環境

* Windows 10 x64
* Steel Bank Common Lisp 1.3.12
* QuickLisp

# 使用技術

## cl-opengl

先述の記事でも利用したCommon LispからOpenGLを利用するためのライブラリ。
これがないとなにもはじまりません。

## GLisph

今回文字列の描画で利用させていただいたライブラリ。
```(ql:quickload :glisph)```
でインストールできる、便利。

# 成果物

GLisphのGitHubにあるサンプルをみながらごにょごにょしたサンプルコードを[GitHub](https://github.com/singy15/cl-opengl-text-sample)で公開しています。

動かし方

```
cd ~/quicklisp/local-project
git clone https://github.com/singy15/cl-opengl-text-sample.git
cd cl-opengl-text-sample
sbcl
(ql:quickload :cl-opengl-text-sample)
(cl-opengl-text-sample:main)
```

こんなかんじのコードで文字列を描画できる（一部抜粋）。

```cl:cl-opengl-text-sample.lisp
;; Variables for GLisph.
(defparameter *font-en* nil)
(defparameter *glyph-table-en* nil)
(defparameter *text-en* #("text drawing sample"))

;; 初期化処理
(defmethod glut:display-window :before ((window main-window))
  ;; Initialize GLisph.
  (gli:init *width* *height*)
  (setf *font-en* (gli:open-font-loader #p"./font/Ubuntu-R.ttf"))
  (setf *glyph-table-en* (gli:make-glyph-table *font-en*))
  (loop for text across *text-en*
        do (gli:regist-glyphs *glyph-table-en* text))
  (setf *text-en*
        (gli:draw *glyph-table-en*
                  '(:size 20 :x 0 :y 0 :text (aref *text-en* 0)))))

;; 描画処理
(defmethod glut:display ((window main-window))
   ; ...
   ;; Draw text
  (gl:clear-stencil 0)
  (gl:clear :color-buffer-bit :stencil-buffer-bit)
  (gli:gcolor 1.0 1.0 1.0 1.0)
  (gli:render *text-en*)
  ; ...
)
```

こんなかんじの画面がでます。

![cl-opengl-text-sample.png](https://qiita-image-store.s3.amazonaws.com/0/74246/2847eb00-5ee7-f8b7-cbf8-6c825d5bd266.png)

# 疑問点など

* OpenGLの描画モード？？にstencilとmultisampleを指定している意味がよくわかってない。
* draw-stringという関数が使えるらしいんだけど、使い方がよくわからなかった。シンボルがエクスポートされてないっていわれる。

# 参考にしたサイトなど

[Common LispでGPUベクトルベースフォントレンダリング](https://qiita.com/Tamamu/items/a481ebd10b339a0e4c2a)
[GitHub - GLisph](https://github.com/tamamu/glisph)
サクッとDockerでPHPの開発環境をmacで作る

ISUCONのチーム戦では、ローカルでの開発環境を作るところから始めると決めていたので、dockerでPHP環境を作る手順を備忘録として残します。

## 前提条件

1. [Homebrew](https://qiita.com/kopug/items/aa65f73c5fcdce85461f) のインストールが完了していること
1. [Homebrew-cask](https://qiita.com/kopug/items/aa65f73c5fcdce85461f) のインストールが完了していること

## Docker for Mac のインストール

```bash
$ brew cask install docker
```

## docker-php-nginx-mysql-memcached を clone して立ち上げる

```bash
$ cd ~/
$ mkdir docker
$ cd docker
$ git clone git@github.com:koni/docker-php-nginx-mysql-memcached.git
$ cd docker-php-nginx-mysql-memcached/docker
$ docker-compose up -d
```

```bash
$ open "http://localhost/" 
```

これで、phpinfo() の情報がブラウザで見れたらOKです。

## カスタマイズ

### phpファイルの格納場所
* ~/doocker/docker-php-nginx-mysql-memcached/public/
    * ここにプログラムを配置すればOK (DocumentRootになっている)

### mysqlの接続情報
* ~/doocker/docker-php-nginx-mysql-memcached/docker/docker-compose.yml
    * 上記に記載されているが、デフォルトだと以下の通り。みんなが大好き "Sequel Pro" でも接続できます。

|key|value|
|:--|:----|
|host|127.0.0.1|
|port| 13306 |
|Database| mysql_database|
|ID| root|
|PW| mysql_passwd|

### その他

* あとは、手動で設定ファイルをいじって、動くかどうか確認しながらとかになるので、直接bashで入ったほうが楽かも。

```bash
$ docker exec -it nginx bash
$ docker exec -it web bash
$ docker exec -it mysql bash
```
GitHub で HTTPS と SSH のリンク両方表示する


地味に切り替えることが多かったので。

![elzup_okhub.png](https://qiita-image-store.s3.amazonaws.com/0/40717/50ff456d-5203-9b5e-8c09-1b814c70bfaa.png)


# コード
Tampermonkey です。

https://gist.github.com/elzup/0c6abe75bf9a06e72fdba0aad7cad86

```
// ==UserScript==
// @name         Github Display both clone link
// @namespace    http://elzup.com/
// @version      0.1
// @description  display clone url on Github
// @author       You
// @match        https://github.com/*/*
// @grant        none
// ==/UserScript==

(function() {
    'use strict';
    const e1 = document.querySelector('.file-navigation .get-repo-modal.on .ssh-clone-options');
    const e2 = document.querySelector('.file-navigation .get-repo-modal.on .https-clone-options');
    if (e1) {
        e1.style.display = 'block';
        e1.style.background = '#fff9ca';
    }
    if (e2) {
        e2.style.display = 'block';
        e2.style.background = '#dcffe1';
    }
})();
```

UserScript が廃止されてから Tampermonkey を使ってるんですがイマイチ共有の仕方がわからない。。あるのかな。
webhook(public)をprivateネットワークに投げる

CI からの webhook を受け取りたいけどお家Portを開けるのはちょっと...な場合に
便利なツールを見つけたので。

# 公式サイト
https://webhookrelay.com/

# インストール
## mac
```bash
brew install webhookrelay/tap/relay
```

## raspi
```bash
DIR=$GOPATH/src/github.com/webhookrelay/
mkdir -p $DIR
cd $DIR
git clone https://github.com/webhookrelay/client
make deps
make build
```

# 使い方
双方向な `connect` と
片方向な `forward` があります。

今回は webhook なので forward で記述します。

1. 公式ページからログイン
2. Access Tokensを生成
3. コマンド(relay)の認証
4. forwarding

## 1. 公式ページからログイン
github アカウントを使ってログインします。
専用のアカウントを使った場合は、2番を飛ばしてよいです。

## 2. Access Tokensを生成
https://my.webhookrelay.com/tokens
から token を生成します。

生成後、説明文があるあたりに `Access Key` と `Secret Key` が表示されます。
3番で使うのでリロードしないようにします。

## 3. コマンド(relay)の認証
専用のアカウントの人は、自分のアカウント名＋パスワード。
OAuthの人は、2番のキー。

```bash
relay login -u <Access Key> -p <Secret Key>
```

## 4. forwarding

localhostに立てた hubot に json を投げてみます。

### forward開始
```bash
relay forward localhost:8080
Forwarding: 
https://my.webhookrelay.com/v1/webhooks/fakeurl -> localhost:8080
Starting webhook relay agent... 
INFO[0005] webhook relay ready...                        host="api.webhookrelay.com:8080"

```

### hubot (localhost:8080でリッスン)

```coffeescript:scripts/example.coffee
  robot.router.post '/hubot/deployment/circleci', (req, res) ->
    data   = req.body
    console.log(data)
```

### client:

```bash:post
[@raspberrypi /tmp]$ curl -X POST https://fakeurl/hubot/deployment/circleci -d@hoge.json
```

```:jsonの中身
[@raspberrypi /tmp]$ cat hoge.json                                                                                
{
  "foo": "bar"
}
```

### 結果
hubotを起動している console に json が出力されていることが確認できます。

```
{ '{  "foo": "bar"}': '' }
```
Unityでキズナアイを読み込んでアニメーションをつける


Unityはpmx形式のデータをサポートしてないので、
[MMD4Mecanim](http://stereoarts.jp/)を使用

ダウンロードしたら`MMD4Mecanim.unitypackage`を展開してインポート

続いて[キズナアイの3Dモデル](http://kizunaai.com/download-page/)をダウンロード
pmxが入っているフォルダごとプロジェクトウィンドウにD&D

![kizuna.png](https://qiita-image-store.s3.amazonaws.com/0/136286/e541b82a-b20f-4f48-6deb-cf7a9a0f19b7.png)

自動的に生成されたMMD4Mecanimファイルを選択し、
利用規約に同意するとfbxファイルが生成される

![m4m.png](https://qiita-image-store.s3.amazonaws.com/0/136286/3f3ea7fd-f52e-5fb5-12b1-705de9fac35a.png)

テクスチャも問題なく読み込めているが、ジャギっているので[Edit] -> [Project Settings] -> [Quality] -> [Anti Aliasing]で調整。

![quality.png](https://qiita-image-store.s3.amazonaws.com/0/136286/cfb5ab70-ea56-0926-b5ee-c6ce625da2ca.png)

`kizunaai.fbx`の[Rig] -> [AnimationType]をHumanoidにして、[Raw Mocap Data for Mecanim](https://www.assetstore.unity3d.com/jp/#!/content/5330)から適当にアニメーションを当ててあげるとこんな感じになる。

![kizunaai.gif](https://qiita-image-store.s3.amazonaws.com/0/136286/0dca897b-8697-bf6c-7f33-0d8fdbf0428a.gif)

以上が[http://stereoarts.jp/](http://stereoarts.jp/)の[MMD4Mecanim チュートリアル（基本編）](http://stereoarts.jp/MMD4Mecanim%20%E3%83%81%E3%83%A5%E3%83%BC%E3%83%88%E3%83%AA%E3%82%A2%E3%83%AB%EF%BC%88%E5%9F%BA%E6%9C%AC%E7%B7%A8%EF%BC%89.pdf)の内容を少しアレンジしたもの。その他にも5種類ほど（2017年11月現在）解説PDFがあるので試してみると良いと思います。
ClosedXMLでセル結合しすぎるとパフォーマンス劣化する対策

#ClosedXMLはセル結合しすぎると死ぬ(ほどパフォーマンスが劣化する)  
C#でExcelファイルを操作できるライブラリClosedXMLですが、結合セルが多いExcelファイルを扱うと、セル結合(Merge())やファイル保存(SaveAs())のパフォーマンスが格段に落ちます。
その対策です。

#バージョン
0.90.0

#対策
##### Merge()に時間がかかる場合
 - Merge()ではなくてMerge(false)を実行すること！

##### SaveAs()に時間がかかる場合
 - アクセスしているセルのスタイルを変更すること！

##### 上記に共通して
 - 縦1セル横1セルのMerge()を実行していないかチェックすること！

#解説
## Merge()ではなくてMerge(false)を実行すること！ について
Merge()(もしくはMerge(True))は、指定した範囲がセル結合可能かどうかをチェックしてからセル結合します。いわゆる交差(Intersect)チェックです。
Merge(False)では、その交差チェックをせずにセル結合を実行するためパフォーマンスが上がります。
その反面、ありえない(交差チェックに引っかかる)セル結合を行うと壊れたExcelシートが出来上がってしまいます。

## アクセスしているセルのスタイルを変更すること！ について
セルにアクセスする関数(GetValue()やSetValue()とか)を実行すると、そのアクセスされたセルはClosedXML内部(XLWorkSheet.csのメンバInternals)に保持されます。
その後、ファイルを保存する(SaveAs())際、上記で保持した各セルに対して、空(IsEmpty())かどうかのチェックを行いますがそれに時間がかかっています。
具体的にはXLCell.IsEmpty()の1209行目
```if (!Style.Equals(Worksheet.Style) || IsMerged() || HasComment || HasDataValidation)
　　　　return false;```
の`IsMerged()`でセルが結合セルかどうかチェックするのに時間がかかっているのですが、それを回避するには`!Style.Equals(Worksheet.Style)`をfalseにしておけば良いので、例えば
```worksheet.Cell(row, col).Style.Alignment.Horizontal = XLAlignmentHorizontalValues.Center;```
のように実処理に影響が無いスタイルの変更をします。

変更前・後の処理時間は、、、
変更前

```
        // 無駄にセルアクセスするとIsMerge()されてパフォ劣化する版
        static void Main(string[] args)
        {
            var start = DateTime.Now;
            var workbook = new XLWorkbook();
            var worksheet = workbook.Worksheets.Add("Sample Sheet");
            for (int i = 1; i < 20000; i++)
            {
                worksheet.Range(i, 1, i, 2).Merge(false);
                var temp = worksheet.Cell(i, 1);
                //worksheet.Cell(i, 1).Style.Alignment.Horizontal = XLAlignmentHorizontalValues.Center;
                temp = worksheet.Cell(i, 2);
                //worksheet.Cell(i, 2).Style.Alignment.Horizontal = XLAlignmentHorizontalValues.Center;
            }
            workbook.SaveAs("HelloWorld.xlsx");
            Console.WriteLine(DateTime.Now - start);
        }
```

```
00:01:02.0949905
```
変更後

```
        // Style変更によりIsMerge()パフォ劣化が回避される版
        static void Main(string[] args)
        {
            var start = DateTime.Now;
            var workbook = new XLWorkbook();
            var worksheet = workbook.Worksheets.Add("Sample Sheet");
            for (int i = 1; i < 20000; i++)
            {
                worksheet.Range(i, 1, i, 2).Merge(false);
                var temp = worksheet.Cell(i, 1);
                worksheet.Cell(i, 1).Style.Alignment.Horizontal = XLAlignmentHorizontalValues.Center;
                temp = worksheet.Cell(i, 2);
                worksheet.Cell(i, 2).Style.Alignment.Horizontal = XLAlignmentHorizontalValues.Center;
            }
            workbook.SaveAs("HelloWorld.xlsx");
            Console.WriteLine(DateTime.Now - start);
        }
```
```
00:00:03.5360002
```
こうなります。処理時間が約1/20に削減。

## 縦1セル横1セルのMerge()を実行していないかチェックすること！ について
ClosedXMLでは縦1セル横1セルのMerge()という意味のないセル結合が実行できてしまいます。
例えば

```
// A1セルからA1セルまでを結合
worksheet.Range(1, 1, 1, 1).Merge(false);
```
のような実装も特にエラーも出ずに実行でき、通常のセル結合と同様にClosedXML内部にセル結合情報として保持します。なので、このような無用のセル結合情報があればあるほど、IsMerge()やSaveAs()のパフォーマンスが劣化する原因となります。
Windows 10 Fall Creators Updateで発生しているリスト ビューでスクロールバーが出ている場合、マウスの範囲選択での複数選択をするとカーソルが画面の端っこに吹っ飛んでしまうという不具合の対策

Windows 10 Fall Creators Updateではリスト ビューでスクロールバーが出ている場合、マウスの範囲選択での複数選択をするとカーソルが画面の端っこに吹っ飛んでしまうという不具合があります。

[Tablacus Explorer](http://www.eonet.ne.jp/~gakana/tablacus/explorer.html)というファイル管理ソフトではアドオンを使って対策しています。

最初はマウスカーソルが端っこの場合、元の位置に戻すという対処療法でした。

これにはひとつ問題があり、マウスカーソルが飛んでからの対処療法なのでマウスカーソルが一度、端っこに行ってしまう為にどうしてもリストがスクロールしてしまいます。

スクロール位置も覚えて戻そうかなとテストしていたところ（リストビューのスクロール位置を戻すのが、詳細とその他やグループの有無で違うなど結構ややこしいかったのです）

デバッグ ビューで数値を表示してみると何故かマウスカーソルの吹っ飛んでしまう現象が起こりません。

もしかしてと思い

リストのマウスカーソル移動時で左右ボタンが押されている場合に、`RedrawWindow`で再描画を行うようにしてみました。

予想通り不具合は発生しなくなりました。

なんでこんなので直るのかは私には解りませんが、とにかく直りました。

ソースはこんな感じです。

```JavaScript:
if (window.Addon == 1) {
  AddEvent("MouseMessage", function (Ctrl, hwnd, msg, wParam, pt)
  {
    if (Ctrl.Type == CTRL_SB && msg == WM_MOUSEMOVE) {
      if (api.GetKeyState(VK_LBUTTON) < 0 || api.GetKeyState(VK_RBUTTON) < 0) {
        api.RedrawWindow(Ctrl.hwnd, null, 0, RDW_NOERASE | RDW_INVALIDATE);
      }
    }
  });
}
```
https://gist.github.com/tablacus/fd7b6fb76680de86a803086bfbbb26d6

リストビューじゃなくても何かを`RedrawWindow`で再描画すればOkっぽいです。

Windows 10 Fall Creators Updateでマウスカーソルが吹っ飛んで困っている方、ご自由にお使いください。

追記：2017/12/7
[マウスのグローバルフックを使った対策ソフトができました。](https://qiita.com/tablacus/items/954157cd9309d8d866e0)
Rコードの実行時間を測るのに便利です「tictoc」パッケージ

**tictoc** はRコードの実行時間の計測を簡単にするパッケージです。
使い方は `tic()` と `toc()` でコードを挟んで実行するだけです。

```r:インストール
install.packages("tictoc")
```

```r:使い方
library(tictoc)

tic()
Sys.sleep(1)
toc()
```

```:結果
1.003 sec elapsed
```

## 例

ランダムフォレストの実行時間を比較してみる。

```r:R
library(kernlab)
data(spam)

library(randomForest)
tic()
randomForest(type ~ ., data = spam, ntree = 1000)
toc()
#> 26.535 sec elapsed

library(ranger)
tic()
ranger(type ~ ., data = spam, num.trees = 1000, seed = 71)
toc()
#> 4.867 sec elapsed

tic()
ranger(type ~ ., data = spam, num.trees = 1000, seed = 71, save.memory = TRUE)
toc()
#> 10.808 sec elapsed

library(Rborist)
tic()
Rborist(spam[,-58], spam[,58], nTree = 1000)
toc()
#> 12.574 sec elapsed
```

## 参考

- https://twitter.com/rudeboybert/status/923555017109450752
- https://www.slideshare.net/sfchaos/r-rangerrborist
Homebrew と mascli ではじめるmacOS入門

欲しくなったらすぐにmacbookをキレイに乗り換えられるように、なるべくパッケージマネージャを使ってmacOSのアプリは管理をしたいですよね。
>  TimeMachineだとゴミデータも一緒に引き継がれてしまうので、Homebrewで極力管理をするようにしています。

## Homebrewのインストール

インストールも何も、以下のページを見たらワンライナーでインストールするコマンドがあるので、それを使えばOKです。
* [Homebrew](https://brew.sh/index_ja.html)

```shell
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```

## Homebrew Cask のインストール

これだけだとCUIのパッケージの管理はできますが、GUI周りができません。なので [Homebere-Cask](https://caskroom.github.io/)を入れます。
caskの場合はupgradeが単体で出来ないので、[brew-cask-upgrade](https://github.com/buo/homebrew-cask-upgrade)も合わせていれます。
```
brew tap caskroom/cask
brew tap buo/cask-upgrade
```

## 基本的な使い方

```
# アプリの検索
brew search `appname`
brew cask search `appname`

# アプリのインストール
brew install `appname`
brew cask install `appname`

# アプリのアンインストール
brew uninstall `appname`
brew cask uninstall `appname`

# パッケージ情報
brew info `appname`
brew cask info `appname`

# インストール済みパッケージ一覧
brew list
brew cask list

# インストール済みのパッケージを最新版にする
brew upgrade --cleanup

# brew-cask-upgrade を使って最新版にする (for Homebrew-Cask)
brew cu

# 意外とすぐ貯まるcacheを削除する
brew cleanup
brew cask cleanup
```

## App Storeのアプリはどうするの？ mascli で管理するんだよ。

```
brew install mas
```

```
mas install 1114591412 # Memory Clean 2
mas install 803453959  # Slack
mas install 333903271  # twitter
```

ちょっと上の番号がわかりにくいですが、itunesのサイトでアプリのページを見た時にURL中に記載されている番号(idXXXXXXXXX)のXの数字を指定します。
> (例) Twitterの場合: https://itunes.apple.com/jp/app/twitter/id333903271?mt=8

```
[注意] 無料アプリをインストールする場合は "システム環境設定 -> App Store -> パスワードの設定" 
から無料ダウンロードの項目を "パスワードは不要" にしておかないとエラーになります。

Catalina(10.15)では "システム環境設定 → Apple ID → メディアと購入"
から無料ダウンロードの項目を "要求にしない" にします。
```

## 最後に

あとは新しい環境に引っ越す前に、以下のコマンドを実行してインストール済みのパッケージを Brewfileに吐き出します。

```
brew bundle dump
```
```shell=
tap "buo/cask-upgrade"
tap "caskroom/cask"
tap "homebrew/bundle"
tap "homebrew/core"
brew "gdbm"
brew "awscli"
brew "go"
brew "htop"
brew "jq"
brew "libevent"
brew "lv"
brew "mas"
brew "nmap"
brew "pcre"
brew "ssh-copy-id"
brew "tmux"
brew "tree"
brew "zsh"
cask "alfred"
cask "appcleaner"
cask "brackets"
cask "clipy"
cask "docker"
cask "duet"
cask "google-chrome"
cask "google-japanese-ime"
cask "iterm2"
cask "keepassx"
cask "sequel-pro"
cask "skype"
cask "tweeten"
cask "vagrant"
cask "vagrant-manager"
cask "vimr"
cask "virtualbox"
mas "CotEditor", id: 1024640650
mas "Keynote", id: 409183694
mas "LINE", id: 539883307
mas "Magnet", id: 441258766
mas "Memory Clean 2", id: 1114591412
mas "Pixelmator", id: 407963104
mas "Todoist", id: 585829637
mas "Twitter", id: 409789998
```

カレントディレクトリ内に Brewfile が出来ているので、それを新しい環境にコピーをし、同じディレクトリ内で
```
brew bundle
```

を実行すれば、再インストールされます。