OmniAICreator/Qiita-1.07M huggingface dataset:
nodebrewでinstallが失敗するようになった

## エラー内容と解決法

install, install-binaryが失敗する。

```
nodebrew install-binary v8.1.4
v8.1.4 is not found

Can not fetch: https://nodejs.org/dist/v8.1.4/node-v8.1.4-darwin-x64.tar.gz
```

解決方法は、nodebrewをインストールしなおす。
`curl -L git.io/nodebrew | perl - setup`

### 原因

[nodejs で install-binary ができない](http://var.blog.jp/archives/70091283.html)によると、nodejsサーバーが新しくなったことによりレスポンスの解釈ができなくなったためのようだ。

それでも `nodebrew selfupdate` すれば対応版のnodebrewにアップデートできそうなものだが、selfupdateも環境によっては同様の理由で更新に失敗してしまうようだ。
[Fail to fetch source or binary with newest curl](https://github.com/hokaccha/nodebrew/issues/63)
この場合はnodebrewをインストールし直すしか対応方法が無い。
【追記】VSCodeを1.14.0にアップデートしたら動かなくなった

## 状況
vscodeを1.14にアップデートしたところcpu使用率が100%となり起動できなくなってしまいました・・・

当方の環境は以下の通り

* macOS Sierra 10.12.5

どうやら他にも同じ症状の人がいるようです。

https://github.com/Microsoft/vscode/issues/30449

## 対応
とりあえず1.13を再インストールすることで解決しました。
brewでインストールした場合は以下のコマンドを実行

```
$ brew cask reinstall visual-studio-code
```

各バージョンのダウンロード先は以下の記事にまとめられています。

[Visual Studio Code のバージョン一覧と入手先について (2017/07/12)](http://qiita.com/satokaz/items/02f596b96c377e40ce8f)

~~とりあえず現時点では1.14.0へのアップデートは控えたほうがよさそうです。~~

# 追記
Extensionが原因だったようです。
私の環境では以下のExtensionを無効にすることで無事起動するようになりました

- ruby-on-rails-snippets-0.0.1

## 参考
https://github.com/Microsoft/vscode/issues/30407
WordPressのstyle.cssをブラウザキャッシュさせず更新を反映する


style.cssが更新されたタイプスタンプを末尾に追記する。

```php
<link rel="stylesheet" href="<?php bloginfo('stylesheet_url'); echo '?' . filemtime( get_stylesheet_directory() . '/style.css'); ?>" type="text/css" />
```
jarファイルの中を検索する方法

#はじめに
このクラスファイルどのjarに入ってるんだろう？って時に特定ディレクトリ配下のjar内をまとめて検索する方法

##以下のコマンドを実行するだけ
```
for FILE in $(find 検索ディレクトリ -name '*.jar') ; do echo $FILE ; jar -tvf $FILE | grep 検索したいファイル ; done
```

###実行例
```
[root@server01 ~]# for FILE in $(find /usr/lib/jvm -name '*.jar') ; do echo $FILE ; jar -tvf $FILE | grep String.class ; done
/usr/lib/jvm/java-1.8.0-ibm-1.8.0.4.5-1jpp.1.el7_3.x86_64/lib/jconsole.jar
/usr/lib/jvm/java-1.8.0-ibm-1.8.0.4.5-1jpp.1.el7_3.x86_64/lib/ibmorbtools.jar
/usr/lib/jvm/java-1.8.0-ibm-1.8.0.4.5-1jpp.1.el7_3.x86_64/lib/dt.jar
/usr/lib/jvm/java-1.8.0-ibm-1.8.0.4.5-1jpp.1.el7_3.x86_64/lib/tools.jar
   817 Thu Apr 20 05:15:06 JST 2017 com/sun/tools/javac/api/Formattable$LocalizedString.class
  2990 Thu Apr 20 05:23:04 JST 2017 com/sun/tools/jdi/JDWP$VirtualMachine$CreateString.class
  1346 Thu Apr 20 05:16:12 JST 2017 com/sun/xml/internal/rngom/parse/compact/CompactSyntax$LocatedString.class
  1263 Thu Apr 20 05:16:00 JST 2017 com/sun/xml/internal/xsom/XmlString.class
/usr/lib/jvm/java-1.8.0-ibm-1.8.0.4.5-1jpp.1.el7_3.x86_64/jre/lib/ibmjsseprovider2.jar
/usr/lib/jvm/java-1.8.0-ibm-1.8.0.4.5-1jpp.1.el7_3.x86_64/jre/lib/ibmsaslfw.jar
/usr/lib/jvm/java-1.8.0-ibm-1.8.0.4.5-1jpp.1.el7_3.x86_64/jre/lib/tools/monitoring-api.jar
/usr/lib/jvm/java-1.8.0-ibm-1.8.0.4.5-1jpp.1.el7_3.x86_64/jre/lib/se-service.jar
/usr/lib/jvm/java-1.8.0-ibm-1.8.0.4.5-1jpp.1.el7_3.x86_64/jre/lib/management-agent.jar
/usr/lib/jvm/java-1.8.0-ibm-1.8.0.4.5-1jpp.1.el7_3.x86_64/jre/lib/aggressive.jar
/usr/lib/jvm/java-1.8.0-ibm-1.8.0.4.5-1jpp.1.el7_3.x86_64/jre/lib/dataaccess.jar
/usr/lib/jvm/java-1.8.0-ibm-1.8.0.4.5-1jpp.1.el7_3.x86_64/jre/lib/ibmjgssfw.jar
/usr/lib/jvm/java-1.8.0-ibm-1.8.0.4.5-1jpp.1.el7_3.x86_64/jre/lib/charsets.jar
/usr/lib/jvm/java-1.8.0-ibm-1.8.0.4.5-1jpp.1.el7_3.x86_64/jre/lib/ibmcfw.jar
/usr/lib/jvm/java-1.8.0-ibm-1.8.0.4.5-1jpp.1.el7_3.x86_64/jre/lib/amd64/default/jclSC180/vm.jar
 35433 Wed Apr 19 10:19:28 JST 2017 java/lang/String.class
/usr/lib/jvm/java-1.8.0-ibm-1.8.0.4.5-1jpp.1.el7_3.x86_64/jre/lib/amd64/default/jclSC180/j9zip.jar
/usr/lib/jvm/java-1.8.0-ibm-1.8.0.4.5-1jpp.1.el7_3.x86_64/jre/lib/amd64/compressedrefs/jclSC180/vm.jar
 35433 Wed Apr 19 10:19:28 JST 2017 java/lang/String.class
/usr/lib/jvm/java-1.8.0-ibm-1.8.0.4.5-1jpp.1.el7_3.x86_64/jre/lib/amd64/compressedrefs/jclSC180/j9zip.jar
/usr/lib/jvm/java-1.8.0-ibm-1.8.0.4.5-1jpp.1.el7_3.x86_64/jre/lib/ibmorb.jar
/usr/lib/jvm/java-1.8.0-ibm-1.8.0.4.5-1jpp.1.el7_3.x86_64/jre/lib/security/US_export_policy.jar
/usr/lib/jvm/java-1.8.0-ibm-1.8.0.4.5-1jpp.1.el7_3.x86_64/jre/lib/security/local_policy.jar
/usr/lib/jvm/java-1.8.0-ibm-1.8.0.4.5-1jpp.1.el7_3.x86_64/jre/lib/math.jar
（略）
[root@server01 ~]#
```
Linuxが起動するしくみ

Linuxが起動するしくみについてまとめてみよう。

# Linuxが起動する流れ

先ず、パソコンの電源を入れると、マザーボード上にあるBIOSというファームウェアが起動する。自分も今までそう思っていたが、長年、IT技術から離れていた間に世の中は進化しているようで、近年は、BIOSに変わって、UEFIというファームウェアが主流になりつつあるそうだ。BIOSはハードディスクの容量が2TBまでしか対応できないという制限があり、ハードディスクの大容量化に伴い普及しつつある。

このファームが起動して、ハードディスク上にある、ブートローダという部分を起動させる。ブートローダにはいくつか種類があり、LinuxではGRUBが主流となっている。各ディストリビューションでもこれが採用されており、UbuntuでもGRUBを採用している。ブートローダの役割は、カーネル（つまりLinux）をメモリ上のコピーする事にある。

さて、カーネルだが、オープンソースということもあり、全てのハードに対応しているとか限らない。運悪く対応していなければ、当然上手く起動してくれないことになる。この場合どうするか、カーネルのビルド（つまりコンパイル）をしてやらないといけなくなるのだ。素人には当然敷居が高くなる。

カーネルが立ち上がったら、次にinitシステムが起動される。initシステムだが、各サービスを自動で起動してくれるシステムである。Linuxではデーモンといういいかたをする。

ここまでの流れを経て、晴れてOSが使えるということになるのだ。

# まとめ

1. 電源ON
2. BIOS / UEFI が起動
3. GRUB（ブートローダ）が起動
4. Linux（カーネル）をメモリ上のコピー
5. initシステムが起動
npm 5.2.0の新機能！ 「npx」でローカルパッケージを手軽に実行しよう

[npm](https://www.npmjs.com/package/npm)とはNode.jsインストール時に付属するパッケージマネージャーで、Node.jsのパッケージの管理や実行を取り扱うものです。

npmのバージョン5.2.0で導入された「[npx](https://www.npmjs.com/package/npx)」を用いると、下記のように**ローカルにインストールしたnpmパッケージを、`npx`コマンドだけで実行できるようになります**。

![webpac.gif](https://qiita-image-store.s3.amazonaws.com/0/67884/0214ec02-c7ee-badf-b108-02aa32de89ef.gif)

`npx`は`npm`にバンドルされているため、`npx`の個別インストールは不要です。

次のようにしてモジュールを実行できます。


```bash
npx (モジュール名)
```

# 従来のnpmの実行方法との比較
従来では、ローカルのnpmパッケージを使用するには、次のような方法が必要でした。

- 方法1: `./node_modules/.bin/(パッケージ名)`で実行する
- 方法2: `$(npm bin)/(パッケージ名)`で実行する
- 方法3: package.jsonに[npm-scripts](https://docs.npmjs.com/misc/scripts)を記述して実行する

`npx`はいずれの方法よりも簡潔なコマンドで、パッケージを実行できます。実案件でタスクを共有する場合は方法3が望ましいですが、ちょっとした動作テストには`npx`が重宝するでしょう。

ちなみに、Facebook社製でnpmと互換性のあるパッケージマネージャー[Yarn](https://yarnpkg.com/lang/en/)では、`run`コマンドでローカルのパッケージを実行できます（参考記事「[npmから乗り換えてわかったYarnの4つのメリット \- ICS MEDIA](https://ics.media/entry/19384)」）。

# インストールしていないパッケージを一度だけ実行できる機能
ローカルにインストールしていないパッケージを、一度だけ実行できる機能もあります。

たとえば、ローカルにインストールしていない[typescript](https://www.npmjs.com/package/typescript)パッケージを、一度だけ実行するには次のようにします。

![](https://qiita-image-store.s3.amazonaws.com/0/67884/36afc2db-3eb6-e8a7-c8e1-5a22cb9517f1.gif)


コマンドが完了すると、**インストールされたパッケージはグローバルから削除されるので、汚染の心配はありません**（記事「[Introducing npx: an npm package runner – Kat Marchán – Medium](https://medium.com/@maybekatz/introducing-npx-an-npm-package-runner-55f7d4bd282b)」より）。

パッケージを試したいけれど、わざわざフォルダーを作って、インストールして。。というのが煩わしい場合に便利です。下記は、[cowsay](https://www.npmjs.com/package/cowsay)、[yosay](https://www.npmjs.com/package/yosay)、[mosay](https://www.npmjs.com/package/mosay)という、コマンドライン上に文字列を出力するパッケージを試している例です。

![ramen.gif](https://qiita-image-store.s3.amazonaws.com/0/67884/6512c00e-f0bd-9d93-99a0-730ef244b660.gif)


# npxで快適なnpmライフを
開発をしていると、ローカルのnpmパッケージの挙動を試したいというケースは多くあります。これまでは`$(npm bin)/(パッケージ名)`やnpm-scriptsを使うという煩わしさがありましたが、`npx`の登場によって手軽になります。是非試してみてください。

*参考記事「[Introducing npx: an npm package runner – Kat Marchán – Medium](https://medium.com/@maybekatz/introducing-npx-an-npm-package-runner-55f7d4bd282b)」*
Rust入門！15のエクササイズ2-3｜最大値・最小値編：Rustの型推論は強力

メインデスクトップPCのハードディスクが壊れました。昨日がプライムデーでよかった。

[新しい言語を学ぶ時の15のエクササイズ](http://www.articlecity.com/articles/computers_and_internet/article_2686.shtml) をrustでやっています。

## 課題

> finding maximum/minimum among a list of numbers

## 解答

```rust:find_min_max.rs
use std::cmp;

fn find_min_max(x: &[i64]) -> (i64, i64) {
    let mut min: i64 = x[0];
    let mut max: i64 = x[0];
    let mut x_iter = x.iter();
    while let Some(i) = x_iter.next() {
        min = cmp::min(*i, min);
        max = cmp::max(*i, max);
    }
    return (min, max)
}
```

最大値、最小値を見つける関数はこんな感じです。イテレータを利用してみました。listとか配列とかその類のものに対して同じ処理を行うのは、言語ごとの特徴が現れていて好きです。

再帰的に比較するやり方や、forやwhileのループを回すやり方など色々あります。イテレータを使うのは、比較的よくある手法なのかな。

### メイン関数はこちら

```rust:main.rs
fn main() {
    // 普通に定義
    let x_slice: &[i64] = &[8, 1, 7, 4, 0, 2, 6, 9, 3, 5];
    let (x_min, x_max) = find_min_max(x_slice);
    println!("{}", x_min); // 0
    println!("{}", x_max); // 9

    // rustの型推論は強力なので、宣言時に型を指定していなくてもi64のスライスだと推論してくれるらしい
    let y_slice = &[15, -43, 30000, -12345, 8];
    let (y_min, y_max) = find_min_max(y_slice);
    println!("{}", y_min); // -12345
    println!("{}", y_max); // 30000
}
```

こんな感じです。

スライス定義のやり方がどこに書いてあるのかわからず、調べるのに時間がかかりました。

## 型推論について補足

rustの型推論では、宣言時に型がわからなくても、後からわかれば良い、と言うことになっているらしいので試してみました。

```rust:type.rs
fn main() {
    let z_slice = &[0, 1, 2, 3, 4, 5, 6];
    let z_slice2 = example(z_slice);
    println!("{}", z_slice2[0]); // 0
}

fn example(y: &[i8]) -> &[i8] {
    return y
}
```

i8型のスライスをそのまま返すだけの関数を定義して、そこに代入すると問題なく動きます。これは、z_sliceがi8型のスライスであると推論されているからなので、

```rust:mismatch.rs
fn main() {
    let z_slice = &[0, 1, 2, 3, 4, 5, 6];
    let z_slice2 = example(z_slice);
    let (z_min, z_max) = find_min_max(z_slice);
}
```

このように両方に代入しようとすると、mismatched typesのエラーが出て怒られます。exampleはi8、find_min_maxはi64のスライスを引数にとるからです。

## まとめ

* イテレータすごい
* Rustの型推論は強力

余談ですが、listをhead（list[0]）とtail（それ以降）にパターンマッチさせるやり方ができないか模索しましたが、よくわかりませんでした。
findでマウント先のファイルシステムを検索しない方法

#はじめに
ファイルのパスがわからないときよくfindを使うのだが大きなディスクがマウントされていると実行に時間がかかる。そんな時にマウント先のディスクは検索しないでローカルディスクだけ検索する方法。

##以下のように-xdevをつけるだけ
```find 検索パス -xdev -name 検索ファイル名```

###-xdevオプションを指定しない場合
```
[root@server01 ~]# find / -name log
/script/log
/opt/chef/embedded/lib/ruby/gems/2.3.0/gems/chef-12.20.3/lib/chef/log
/opt/chef/embedded/lib/ruby/gems/2.3.0/gems/chef-12.20.3/spec/unit/log
/opt/chef/embedded/lib/ruby/gems/2.3.0/gems/mixlib-log-1.7.1/lib/mixlib/log
/opt/chef/embedded/lib/ruby/gems/2.3.0/gems/mixlib-log-1.7.1/spec/mixlib/log
/run/log
/run/initramfs/log
/var/log
^C    ←ここで待たされるのでCtrl+cでキャンセル
[root@server01 ~]#
```

###-xdevオプションを指定した場合
```
[root@server01 ~]# find / -xdev -name log
/script/log
/opt/chef/embedded/lib/ruby/gems/2.3.0/gems/chef-12.20.3/lib/chef/log
/opt/chef/embedded/lib/ruby/gems/2.3.0/gems/chef-12.20.3/spec/unit/log
/opt/chef/embedded/lib/ruby/gems/2.3.0/gems/mixlib-log-1.7.1/lib/mixlib/log
/opt/chef/embedded/lib/ruby/gems/2.3.0/gems/mixlib-log-1.7.1/spec/mixlib/log
/var/log
[root@server01 ~]#   ←待たされないで完了する
```
websocketで複数通信時に起きた問題


server.jsと複数のindex.htmlで通信

1人でもブラウザを閉じるとサーバーが閉じてしまう
（起動したnode server.jsが終了する）
→以後通信できなくなる。。。

##解決方法
###server.jsの自動再起動（永続化）
[田中さん](https://www.facebook.com/seigo.tanaka)直伝
サーバー側にforeverを導入

$ npm install -g forever
$ forever server.jsで起動する


###HTMLの自動リロード化
foreverと合わせて、ブラウザ側のindex.htmlにサーバーと通信が切れた時のイベントを設定

```index.html
    ws.onclose = function () {
      console.log('closed');
      window.location.reload();
      };
```

こうすることで、

→だれかがブラウザを閉じる
→サーバーが切断される
→自動的にserver.jsを再起動
→切断されたのを検知したhtmlが再リロード

で無事に通信を続けることができる
WordPressに Webhookの受信窓口を作る

Webhookを利用して、WordPressで新しい投稿を作成するためのプログラム。

まずは、テーマの `functions.php`かまたは、プラグインなどを作成して、新しいアクションフックを定義します。

```php
add_action('wp_ajax_hoge', 'hoge');
add_action('wp_ajax_nopriv_hoge', 'hoge');
function hoge() {
// ここに処理を書く
}
```

これで、次の URLで Webhookを受信することができるようになります。

```
https://example.com/wp-admin/admin-ajax.php?action=hoge
```

actionパラメーターに、「wp_ajax_xxx」の「xxx」の部分を当てはめます。

## JSONを処理する

Webhookで送信される内容自体は `php://input`を読み込むことで処理できます。

```
$body = file_get_contents("php://input");
$json = json_decode($body);
```

後は、このJSONの内容を使って、`wp_insert_post`等で新しい投稿を作成する事ができます。

```
$post_id = wp_insert_post( array(
	'post_type'    => 'post',
	'post_title'   => $json->xxx,
	'post_status'  => 'publish',
	'post_content' => $json->xxx,
	) );
	if ( $post_id ) {
		update_post_meta( $post_id, 'custom field', $json->xxx );
	}
));
```

## 正常に送信できない場合は、WAF等をチェック

テストをしてみると、うまく送信できない場合などがあります。この場合、Webhook側に 403エラーなどが通知されています。これは、WAFのセキュリティ設定によってはねられていたりします。サーバー側の WAFの設定を見直すなどして、再度確認すると良いでしょう。

また、セキュリティのしくみを備えないと外から誰でも投稿を追加できてしまうようになるため、注意しましょう。
Ubuntuで外付けHDDをマウントする

Ubuntuにお立ち台でHDDをマウントするときのメモ．

# デバイスの認識を確認

``sudo fdisk -l``コマンドで現在接続されているディスクの状況を確認．

```bash
$ sudo fdisk -l

Disk /dev/sda: 5.5 TiB, 6001175126016 bytes, 11721045168 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disklabel type: gpt
Disk identifier: C7F58AB2-1B53-452F-9F33-EA2CD6958FB4

Device           Start         End     Sectors  Size Type
/dev/sda1         2048     1050623     1048576  512M EFI System
/dev/sda2      1050624 11687622655 11686572032  5.5T Linux filesystem
/dev/sda3  11687622656 11721043967    33421312   16G Linux swap


Disk /dev/sdb: 931.5 GiB, 1000203804160 bytes, 1953523055 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 4096 bytes / 33553920 bytes
Disklabel type: dos
Disk identifier: 0xe7b91096

Device     Boot Start        End    Sectors   Size Id Type
/dev/sdb1           2 1953523054 1953523053 931.5G  b W95 FAT32

Partition 1 does not start on physical sector boundary.
```

自分の環境の場合は，/sdaが元から接続されているHDDなので，外付けHDDは/sdbにありました．

# マウント
/hdd_mount をマウントポイントにして，マウントを行います．

```bash
$ sudo mount /dev/sdb /hdd_mount
```

これで，外付けHDDがマウントできたはず！

# 注意
HDDのパーティションを分けている場合は，/dev/sdb1のように，パーティションの番号まで指定してください！！

# 参考
Ubuntuで外付けハードディスクを認識するには - のんびりしているエンジニアの日記
http://nonbiri-tereka.hatenablog.com/entry/2014/11/21/090050
ggplotオブジェクトからlayerを削除する

あんまり需要はないと思うけど，一応メモ。

ggplot2のレイヤー構造について
-----------------------------

よく「ggplot2はレイヤー構造である」といわれます。これについては以前別途まとめたので以下の資料を参照してください:

[ggplotのオブジェクトから眺めてみる](https://kazutan.github.io/HijiyamaR6/intro_ggplot2.html)

簡単に確認をしてみます。以下のようなggplotオブジェクトを準備します:

``` r
library(ggplot2)
g <- ggplot(iris, aes(Sepal.Length, Sepal.Width)) +
  geom_point() +
  geom_line() +
  geom_smooth()
g
  #> `geom_smooth()` using method = 'loess'
```

![unnamed-chunk-1-1.png](https://qiita-image-store.s3.amazonaws.com/0/35118/e917da1a-16e2-9c4f-7622-97a34e3a8484.png)

上記のプロットでは，`geom_point`と`geom_line`と`geom_smooth`という3つの描画レイヤーがあります:

``` r
g$layers
  #> [[1]]
  #> geom_point: na.rm = FALSE
  #> stat_identity: na.rm = FALSE
  #> position_identity 
  #> 
  #> [[2]]
  #> geom_line: na.rm = FALSE
  #> stat_identity: na.rm = FALSE
  #> position_identity 
  #> 
  #> [[3]]
  #> geom_smooth: na.rm = FALSE
  #> stat_smooth: na.rm = FALSE, method = auto, formula = y ~ x, se = TRUE
  #> position_identity
```

ggplotオブジェクトからレイヤーを削除
------------------------------------

さて本題です。

実のところ，この描画レイヤーはlistになっています:

``` r
is.list(g$layers)
  #> [1] TRUE
```

なので，**レイヤーを取り除きたいならそのlistの要素を削除すればいい**だけです:

``` r
g$layers[[2]] <- NULL
g$layers
  #> [[1]]
  #> geom_point: na.rm = FALSE
  #> stat_identity: na.rm = FALSE
  #> position_identity 
  #> 
  #> [[2]]
  #> geom_smooth: na.rm = FALSE
  #> stat_smooth: na.rm = FALSE, method = auto, formula = y ~ x, se = TRUE
  #> position_identity
g
  #> `geom_smooth()` using method = 'loess'
```

![unnamed-chunk-4-1.png](https://qiita-image-store.s3.amazonaws.com/0/35118/323e4b43-3688-7f19-8803-1ca03faf838d.png)

どこで使えるかというのはよくわかりませんが，ggplotの理解には繋がるかなと思いました。

**Enjoy!**
iPhone でバッククォート`を入力しました

iPhone からコードハイライトに使う文字の入力方法がわからなくて困ったことがあります。

以下の文字です。

```
`
```

Qiitadon でわからん！と投稿したら教えてもらえました😍😂😂

<img width="320" alt="IMG_6048.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/1624/5d9deb69-7a34-92fa-dad3-8e590f724e2a.png">
参考:
https://qiitadon.com/@pugiemonn/24518

# iPhone📱で ` の入力方法
キーボードの日本語 > ABC に候補が出てきます。

![IMG_6050.PNG](https://qiita-image-store.s3.amazonaws.com/0/1624/3a5d763b-f717-1b6e-6a00-377f12f0de46.png)
上図、最下部に`の入力候補があります。

@note103 さん教えてくださりありがとうございます😊

# ` の読み方

読み方は**バッククォート**というみたいですね😄

# 参考
http://qiita.com/hayayu/items/42f2baf6a0d6b1078578
Babel、Browserify のクイックスタート2017年夏版


Babel と Browserify の周辺ツールが2015年と比べてだいぶ変わってきたので、ドキュメントにまとめました。

## NVS (Node Version Switcher)

複数の Node.js のバージョンを管理できるツールです。ChakraCore やナイトリービルドもインストールできます。Mac、Linux 版だけでなく Windows 版のインストーラーも配布されています。

Mac にインストールする場合、次のコマンドを実行しました。


```bash
export NVS_HOME="$HOME/.nvs"
git clone https://github.com/jasongin/nvs "$NVS_HOME"
. "$NVS_HOME/nvs.sh" install
```

インストールした後で $HOME/.profile に次のコードを追加しました。

```bash
export NVS_HOME="$HOME/.nvs"
. "$NVS_HOME/nvs.sh"
```

Node.js の最新バージョンをインストールしてみましょう。

```bash
nvs add latest
```

記事の作成時点で v8.1.4 がインストールされました。コマンドから使えるように宣言してみましょう。

```bash
nvs use node/8.1
```

バージョンを確認します。

```bash
node -v
```

## Yarn

Yarn は Node.js のパッケージ管理ツールです。標準の npm よりもパッケージのダウンロード時間を短縮できます。各種 OS ごとにインストーラーが用意されています。MacOS の場合、homebrew でインストールできます。

```bash
brew install yarn
```

## npx 

npx は npm v5.2.0 で追加されたコマンドツールです。`npm run` のショートカットと考えればよいでしょう。npx がバンドルされていないのであれば、npm をアップグレードします。

```bash
npm i -g npm
```

試しに cowsay という牛のつぶやきを表示するプログラムを試してみましょう。

```bash
mkdir my-project
cd my-project
yarn add cowsay
```

牛の呟きを見てみましょう。

```bash
npx cowsay Hello
 _______
< Hello >
 -------
        \   ^__^
         \  (oo)\_______
            (__)\       )\/\
                ||----w |
                ||     ||

```

ほかのツールの例は [awesome-npx](https://github.com/js-n/awesome-npx) をご参照ください。

## Babel CLI

Babel CLI は ES2015 以降の言語仕様をもとに書かれた JavaScript を古いブラウザーが解釈できるバージョンにトランスパイルした結果を表示します。yarn でインストールしましょう。

```bash
yarn add --dev babel-cli
```

プロジェクトごとに Babel のバージョンや設定が異なるので、babel コマンドをグローバルでインストールすることは推奨されません。

変換対象となるプログラムを解析するためにはプリセットと呼ばれる無数のライブラリを別に導入します。ES2015、ES2016、ES2017 対応のプリセットをまとめて扱うために `babel-preset-env` をインストールします。

```bash
yarn add --dev babel-preset-env
```

`babel-preset-env` は設定ファイルで対象となるブラウザーや Node.js のバージョンを指定することで、トランスパイルの処理を最小限に抑えます。設定ファイルを何も指定しなければ `babel-preset-latest` と同じふるまいになります。

ES2015 で標準化されたクラスを試してみましょう。

```js:app.js
class Rectangle {
  constructor(height, width) {
    this.height = height;
    this.width = width;
  }
}
```

トランスパイルした結果をターミナルに表示させてみましょう。

```bash
npx babel --presets env app.js
```

## babili

babili (babel-minify) は Babel のための圧縮ツールです。プリセットを導入してみましょう。

```bash
yarn add --dev babel-preset-babili
```

先ほどのコードを圧縮して結果をターミナルで表示させてみましょう。

```bash
npx babel --presets=env,babili app.js
```

## babel-node

babel-node は Babel でトランスパイルした結果のコードを実行します。

```bash
npx babel-node --presets=env app.js
```

## browserify

browserify は Node.js で動かすことを前提としたソースコードをブラウザー対応版に変換するプログラムです。Babel を組み込むには babelify を一緒にインストールします。

```bash
yarn add --dev browserify babelify
```

実際に変換してみましょう。

```bash
npx browserify app.js -o bundle.js -t [ babelify --presets [ env babili ] ]
```
## watchify

ソースファイルを監視して修正されたら自動的に変換ファイルを生成するように watchify を導入してみましょう。

```bash
yarn add --dev watchify
```

watchify の実行は次のとおりです。

```bash
npx watchify -v -d app.js -o bundle.js -t [ babelify --presets [ env babili ] ]
```

## http-server

生成したスクリプトを利用する HTTP サーバーを導入してみましょう。

```
yarn add http-sever
```

HTTP サーバーを起動させてみましょう。

```bash
npx http-server -p 3000
```
Hello, Ruby. を解体

#はじめに
Ruby学習中に、[putsメソッド、printメソッド、pメソッドの振る舞い](http://qiita.com/Chinats/items/c464c3a88c263f15224b)で混乱した時に、「全部文字列を表示するやつだけど、表示され方とか用法が違う」くらいざっくり考えていたので、初歩の初歩 "Hello, Ruby." を細かく解体して考えてみました。

```Ruby:Ruby
print("Hello, Ruby.\n")
=> Hello, Ruby.
```

##メソッド　Ｐｒｉｎｔ
メソッドとは、オブジェクトを扱うための手続き

`print`
Printメソッド。引数をコンソールに出力する。
Kernelモジュールで定義されているため、全てのクラスから参照できる。（Printクラスを参照するための新しいクラスや変数を定義する必要がない）

##引数　　("Hello, Ruby.\n")
引数 = メソッドに渡す情報

`( )`
引数を囲っている

`"Hello, Ruby."`
引数の内容。文字列。文字列　（String）オブジェクト。
なお、シングルクォートを使うと、特殊文字が解釈されない。

```Ruby:＜例＞
print('Hello, Ruby.\n')
=>Hello, Ruby.\n
```

`\n`
改行文字。`\`は、それに続く文字に特別な意味を与える文字。

```Ruby:＜例＞
print("Hello, \"Ruby\".\n")
=>Hello, "Ruby".
```

###つまるところ
printメソッドに文字列オブジェクトが含まれた情報を渡して、それをコンソールに出力している。


##ついでにpメソッドについて
printメソッドは、引数をコンソールに表示するメソッドのため、戻り値はnillとなる。
pメソッドの戻り値は引数。inspectメソッド（引数を文字列にして返す）の結果に改行を加えて出力される。

```text:コンソール
irb --simple-prompt
print("Hello, \"Ruby\".\n")
p("Hello, \"Ruby\".\n")
```

Printメソッドの場合の結果

```
Hello, "Ruby".
=>nil
```

Pメソッドの場合の結果

```
=> "Hello, \"Ruby\".\n"
```

参照↓
[Rubyリファレンス](http://ref.xaio.jp/ruby)
[『たのしいRuby 第５版』](https://www.amazon.co.jp/%E3%81%9F%E3%81%AE%E3%81%97%E3%81%84Ruby-%E7%AC%AC5%E7%89%88-%E9%AB%98%E6%A9%8B-%E5%BE%81%E7%BE%A9/dp/4797386290)

ご指摘、補足、もっとここ掘って考えた方がいいよ、などありましたらコメントいただけるとありがたいです。
※コメントいただいた通り、ブランクの使い方を誤っていたため、修正いたしました。
Azure Function CD/CI

## 参考文献

[継続的デプロイ](https://docs.microsoft.com/ja-jp/azure/azure-functions/functions-continuous-deployment)
基本的には上記を参考にすれば、githubとの連携自体は簡単にできます。

## 概要
CD/CIについて、はじめにフローを示します。

1. 実装→githubへのPR
1. 開発ブランチマージ
1. 開発ブランチのマージを検知しステージング環境に自動デプロイ
1. ステージング環境で試験実施
1. 本番環境に手動デプロイ

1,2については通常のgithubフローと同様です。

## セットアップ
上記を実施するためには以下の準備が必要です。
Functionおよび、githubリポジトリについては通常どおり作成します。

- 新規Functionを作成する
- Function用のgithubリポジトリを作成する
- 本番環境およびステージング環境を用意する
- Functionとgithubリポジトリの関連付け設定を行う

### Function
Function作成後、そのFunctionが本番環境として構築していきます。
CD/CIでは本番環境とは別にステージング環境を準備します。
ステージング環境の準備方法は2つあります。

- slot(現在プレビュー版)を利用した環境準備
- ステージング用のFunctionを作成する

slotを利用するとスワップ機能を利用できます。
スワップ機能はslotで作成した環境をproductionへ展開する機能です。
slot自体はFunction配下の新規Functionといった感じで、
同様に操作できます。

### githubリポジトリ
ここでは仮にgithubリポジトリにmaster、staging、developブランチが存在するものとします。
defaultリポジトリをdevelopにし、ここで開発を行います。

githubリポジトリのフォルダ構成を以下に示します。

- rootディレクトリ
- host.json [参考](https://github.com/Azure/azure-webjobs-sdk-script/wiki/host.json)
- endpointディレクトリ(ディレクトリ名が関数名になります)
  - function.json [Function Apps] -> [既存のFunctionを選択] -> [右上の詳細エディター]にて参照可能
  - index.ts(typescriptのサンプル。jsであればindex.jsを配置するだけです)

基本的には既存のFunctionをApp Service Editorで参照してコピペで対応できます。

### Functionとgithubリポジトリの関連付け
[Function Apps] -> [作成したfunctionもしくはslotを選択] -> [プラットフォーム機能] -> [展開オプション]からgithub連携を設定できます。
設定時にブランチを指定しますが、ここで本番環境はmaster、ステージング環境はstagingを対応させて連携させることになります。
ただしslotの場合はmasterを連携させて、本番環境へはスワップ機能でデプロイという流れになると思われます。

## 未検討・検証事項

- **slotでスワップ利用時にキー情報(github web hook)が更新されることを確認しています**
  - 認証コード等が問題ないかスワップ機能を検証する
  - スワップ時のアドバイスに環境変数更新の旨が示されたが、それが何を意味するか調査する
- **デプロイ時のダウンタイムの検証**
  - スワップでもブランチからでも良いが、両者でデプロイした後ダウンタイムが発生するか調査・検証する
Qiitaの投稿をSNSに連携する方法


### はじめに
最近twitterやfacebookを再開しました。
せっかくなんでQiitaに投稿した記事を連携する方法を調べてみた。

### 手順

![Kobito.saF30E.png](https://qiita-image-store.s3.amazonaws.com/0/136533/9a007287-ce68-9114-94fd-df7874c1512c.png "Kobito.saF30E.png")

1 上記の画像のアイコン部分をクリック
![Kobito.QWeqpy.png](https://qiita-image-store.s3.amazonaws.com/0/136533/99d8ca4c-7334-e506-4c54-d2617d699a83.png "Kobito.QWeqpy.png")

2 設定をクリック
![Kobito.MpgLg6.png](https://qiita-image-store.s3.amazonaws.com/0/136533/2a6b8e44-5745-4936-aad7-fbb32a4a17b6.png "Kobito.MpgLg6.png")
3 アカウントをクリック
![Kobito.kSgEfx.png](https://qiita-image-store.s3.amazonaws.com/0/136533/f874e31c-b5f2-6421-6f52-bdd4214fa6a5.png "Kobito.kSgEfx.png")

4 twitterログインをクリック
![Kobito.w71PaC.png](https://qiita-image-store.s3.amazonaws.com/0/136533/cdb1a679-3681-da93-f69b-e3d71f0979a7.png "Kobito.w71PaC.png")
5 プロフィールをクリック
![Kobito.KsXJls.png](https://qiita-image-store.s3.amazonaws.com/0/136533/3ed974b8-2403-6c95-fddd-6c1a8def9cef.png "Kobito.KsXJls.png")
6 facebookマイページのprofile.php?id=XXXをコピペ

### 検証
上記だけで記事の投稿が連携されるのだろうか。。。
kobitでQiitaに投稿しようとしたら
![Kobito.CIaPEG.png](https://qiita-image-store.s3.amazonaws.com/0/136533/e25ffe33-4cbe-04fc-29a4-e8b1c87dfd4e.png "Kobito.CIaPEG.png")
上記のようなダイアログが。。。
これでいいのでは。

### 結果
![image.png](https://qiita-image-store.s3.amazonaws.com/0/136533/74cccb65-dca3-6f50-f626-a2948a4834d1.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/136533/c552fff6-32ca-a273-138c-db05b47f5736.png)
無事連携できていました。

### Qiitaにtwitterの投稿を埋め込むこともできーる
![image.png](https://qiita-image-store.s3.amazonaws.com/0/136533/10a797d6-73cc-0481-7d7b-aeb72d512a9e.png)
1 ツイートをサイトに埋め込むを押下
![image.png](https://qiita-image-store.s3.amazonaws.com/0/136533/82d899b1-b813-6afb-5cc1-0c654ed8a6e9.png)
2 コードをコピー
<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">Qiitaの投稿をSNSに連携する方法 on <a href="https://twitter.com/Qiita">@Qiita</a> <a href="https://t.co/YBViSI9AwZ">https://t.co/YBViSI9AwZ</a></p>&mdash; ENZEN (@ENZEN0129) <a href="https://twitter.com/ENZEN0129/status/884925250172997632">2017年7月11日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>
3 サイトにコピペする
Macの初期設定

macを買い替えた時に、設定がスムーズにいくよう自分用にメモしました。
ぼくの場合これをやると仕事ができます。（ADの設定とかは別）

#Mac起動後
言語　日本語
キーボード　US
Wifi設定
AppleIDログイン

#システム環境設定

##トラックパッド
クリックタップON
速度最大
アプリケーションExpose４本指下

##アクセシビリティ
###トラックパッドオプション
スクロール速度最大z
ドラッグを有効にする→３本指

###マウスオプション
スクロール速度最大

##キーボード
F1F2などの標準のファンクションキーとして使用
キーのリピート速い
リピート入力認識までの時間短い

修飾キー
　capslock↔️ctrl


##マウス
スクロールの方向：ナチュラル
副ボタンのクリック　右側をクリック
軌跡の速さ最大

その他のジェスチャ全部オフ

##日付と時刻
秒を表示



##Dock
下表示
サイズ小さく
Dockを自動的に隠す
###Dockが跳ねるのを禁止する

```:ターミナル
$ defaults write com.apple.dock no-bouncing -boolean true
$ killall Dock
```

#カレンダー
自分のアカウントを追加

#インストールするもの
[1Password7](https://1password.com/jp/downloads/mac/)
[Sidekick](https://www.meetsidekick.com/ja/)
[Google日本語入力](https://www.google.co.jp/ime/)
　システム環境設定→キーボード→入力ソース
　英数とひらがなのみにする
　ユーザ辞書インポートする

[Alfred](https://www.alfredapp.com/)
[BetterTouchTool](https://www.boastr.net/)
　同期ファイルはiCloud

 
[Slack](https://itunes.apple.com/app/slack/id803453959?ls=1&mt=12)
[Todoist](https://itunes.apple.com/jp/app/todoist/id585829637?mt=12)
[toggl](https://toggl.com/toggl-desktop)
[Notion](https://www.notion.so/desktop)
[be-focused](https://apps.apple.com/us/app/be-focused-focus-timer/id973134470?mt=12)
[LINE](https://line.me/ja/download)　



[office365](https://www.office.com/?omkt=ja-jp)
[kindle](https://www.amazon.co.jp/gp/digital/fiona/kcp-landing-page/ref=klp_mn)

#まとめ
よきMacLifeを！
numpy > finfo() > precision, resolutionなどを取得する

https://stackoverflow.com/questions/44779851/data-normalization-in-tensorflow
を読んでいて見つけた関数finfo()。

http://ideone.com/XeZLu8

```py
import numpy as np
 
val = np.finfo(np.float32)
print(val)
```

```txt:run
Machine parameters for float32
---------------------------------------------------------------
precision =   6   resolution = 1.0000000e-06
machep =    -23   eps =        1.1920929e-07
negep =     -24   epsneg =     5.9604645e-08
minexp =   -126   tiny =       1.1754944e-38
maxexp =    128   max =        3.4028235e+38
nexp =        8   min =        -max
---------------------------------------------------------------
```

### 関連

- [numpy.finfo @ SciPy.org](https://docs.scipy.org/doc/numpy/reference/generated/numpy.finfo.html)
- [Data types @ SciPy.org](https://docs.scipy.org/doc/numpy/user/basics.types.html)
Mockgoose Error: timeout of 120000ms exceeded. Ensure the done() callback is being called in this test.



## 概要

Mockgooseを利用しようとしてGithubからcloneし、テスト実行したもののエラーが発生した。


```コマンド実行結果
$ npm test

> mockgoose@7.3.3 test /your-project-path/Mockgoose
> mocha



  User functions
    1) "before all" hook


  0 passing (2m)
  1 failing

  1) User functions "before all" hook:
     Error: timeout of 120000ms exceeded. Ensure the done() callback is being called in this test.
  



npm ERR! Test failed.  See above for more details.
```


## 前提
* 環境は、https://github.com/Mockgoose/Mockgoose#setup 参照
* npm:v7.10.0
* OS:OSX10.10.5
* クローンしたプロジェクトのMockgoose/test/index.js を対象(15.jsとかは15.js_に変更)

## 原因調査
これという原因はわからない。状況としては、ネットワーク関係が怪しい。
仕事場では失敗するが、自宅では成功した。

自宅では以下の様に`npm test`を実行すると、`Cmpleted: 7.7 % (6mb / 77.3mbmb`というコンソールが出力されるが、仕事場ではこの処理自体発生しなかった。

```ネットワークの問題?
$ npm test

> mockgoose@7.3.3 test /your-project-path/Mockgoose
> mocha



  bug 15
Cmpleted: 7.7 % (6mb / 77.3mbmb
```

```成功時の実行結果(test/index.js)
$ npm test

(node:67560) DeprecationWarning: `open()` is deprecated in mongoose >= 4.11.0, use `openUri()` instead, or set the `useMong
oClient` option if using `connect()` or `createConnection()`. See http://mongoosejs.com/docs/connections.html#use-mongo-cli
ent
    ✓ isMocked
    ✓ should create a cat foo (42ms)
    ✓ should find cat foo
    ✓ should remove cat foo
(node:67560) DeprecationWarning: Mongoose: mpromise (mongoose's default promise library) is deprecated, plug in your own pr
omise library instead: http://mongoosejs.com/docs/promises.html
    ✓ reset


  5 passing (1s)
```
プロになるためのWeb技術入門を読んで。

今更だけど[こちら](https://www.amazon.co.jp/gp/product/4774142352/ref=oh_aui_detailpage_o01_s00?ie=UTF8&psc=1)を読んだ。
Webそのものの仕組みもだけど、その背景を全く知らなかったのでとても勉強になった。
気になった部分だけ簡単に箇条書き。

#インターネットについて
・インターネットとは
→世界中のコンピュータを相互に接続し、通信できるようにしたネットワーク網
→仕組みは電話線と同じ。網羅された範囲内で、相互がやり取りを行っている。

 

・wwwの黎明期
cernにて研究結果を共有するために、WWWを開発。
ハイパーリンクを用いてHTMLで記載された研究結果を瞬時に表示させることが可能
このネットワーク上でリンクされたハイパーリンクのつながり→WWW(Web)

 

・文字と画像を表示できるように
cernで開発された当時はまだテキストのみでHTMLが構成されていた。
MosaicというWebブラウザの登場によって、画像を表示できるように。
→Mosaicは無料で誰でも使用できるように公開。研究者以外の様々な人がインターネット上に情報を公開するように。
→→1990年代後半から2000代前半にかけて、パーソナルコンピュータの低価格化、ＡＤＳＬや光ファイバーの普及により
インターネットが利用が普及。
→→MosaicをベースにしてIEやFireFoxなどのWebブラウザが登場した。

 

・Webサーバとクライアント
クライアント:サーバに対して要求（リクエスト）を行うソフトウェア。
→Webブラウザ
サーバ:クライアントからの要求に対して、処理を行い応答（レスポンス）を返却するソフトウェア。
→ApacheやIIS

 

・クライアントとサーバに分ける理由
不特定多数の人に情報を公開するには、そのコンテンツを一か所にまとめておいた方が管理が楽。
しかし一か所に集まってるコンテンツを不特定多数の人が、直接操作するのは現実的ではない。
そのため、コンテンツの利用は利用する人のPCをクライアントとして使い、サーバとインターネットで接続をすることでWWWを実現するように。

 

・URL
WWWは不特定多数の人が様々なコンテンツをWebサーバ上で公開する。
そのためインターネット上で一意な名前をつけないと、Webクライアントがデータを取得できない。
URL:インターネット上のコンテンツを一意に指定するための仕組み。

 

・HTTP
インターネット上には様々なコンピュータが繋がっている。
WebクライアントとWebサーバにはどのよように情報をやりとりするか取り決めが必要。→通信プロトコル
当時すでにFTP(ファイル転送)やSMTP(メール転送)などのプロトコルは存在している。
HTMLの転送に適した、プロトコルが考案された。→HTTP
現在普及しているHTTPはH「HTTP/1.1」

 
#動的コンテンツの生成
・CGI
企業や一般の人にもWebが浸透してくると、なるべく多くの人に見てもらいたいため、コンテンツを更新したい人が増えてきた。
全てのコンテンツを人間が手作業で更新を行うのはひどく時間がかかる。しかしコンピュータはコンテンツを「創る」ことはできない。
そのためプログラムを使用して、リクエストを元に動的に変化を加えることができるコンテンツが生まれた。「動的コンテンツ」
あらかじめ用意されたコンテンツは、「静的コンテンツ」
動的コンテンツを作るには、Webサーバとプログラムの連携が必要。
→CGIがクライアントから送信されたリクエストを、プログラムへ渡す。プログラムが生成した動的コンテンツをCGIを経由して、Webサーバへ返却する。
→→つまりCGIとはWebサーバとプログラムの間でリクエストや、レスポンスをやりとりするための規約。

 

・サーブレット
CGIの問題点：CGIはWebサーバとコンテンツを生成するプログラムを、別プロセスで動作させており
リクエストが来てからプロセス起動が行われるため、アクセスが集中するとプログラム起動処理が多くなり処理が追いつかなくなっていった。
Perlの問題点：大規模アプリケーション開発に向いていない。
そのためJavaとサーブレットが開発された。
Java：大規模開発に向いたオブジェクト指向の機能をフルサポートした言語。
JavaVM上で動作するため、JavaVMが動くコンピュータならOSを問わずJavaを実行可能。
サーブレット：Javaで作られた、動的コンテンツを生成するためのプログラムのこと。
サーブレットの仕組みはCGIと基本的に同じ。だがCGIと違いWebサーバとコンテンツを生成するプログラムが、同じプロセスで実行する。
そのためリクエストの度、新たなプロセスを立ち上げる必要がなく、高速に動作する。

 

・JSP
サーブレットの問題点：同じファイルにデザイン部分と処理部分があるため、Webデザインとプログラミングの分担ができない。
またサーブレットではJavaの出力命令を使って、HTMLを出力する仕組み。そのためHTMlが想像しにくく、HTMLを修正するときに修正箇所がわかりにくい。
上記を改善するために、JSPが開発された。
ＨＴＭＬで記述されたファイルに、Javaコードを埋め込むような形になった。→JSP

 

・フレームワーク
元々の想定よりも大規模なWebアプリケーションが出てきた。Amazonなど。
こういった大規模なアプリケーションをゼロからサーブレットや、JSPで作っていると莫大な量のコーディングを行わなくてはならない。
またPJも大規模化し、人が多くかかわると実装者が勝手に独自クラスを作ってしまったり、デザインとロジックの繫ぎ合わせで不整合が起きたりした。
そのためどのアプリケーションでも共通的な部分に関しては、「ライブラリ」として部品化を行い再利用可能にした。
このような再利用可能な部品を集めて、開発の土台にしたのが「フレームワーク」
figwheel-sidecar

[Figwheel](https://github.com/bhauman/lein-figwheel) はGitHubのプロジェクト名(lein-figweel)から察するとleiningenプラグインとしてしか使えないような印象を受けるが、実際は[figwheel-sidecar] (https://github.com/bhauman/lein-figwheel/tree/master/sidecar)という単体で利用可能なライブラリの上に作られており、自由度が高い物だったという話

## ライブラリとして使いたくなる理由
- leiningen以外のビルドツールから使いたい
- 起動、停止のタイミングをコントロールしたい
    - leiningenプラグインだと、figwheelの設定を変更した場合leinごと再起動する必要がある
- figwheelの起動のタイミングで他の処理を行いたい
    - 例:css watcherの起動
- 自分のフレームワーク/ワークフローに組み込みたい
    - 例： [duct] (https://github.com/duct-framework/duct-figwheel-component/blob/master/project.clj)

## 使い方
[figwheel-sidecar] (https://github.com/bhauman/lein-figwheel/tree/master/sidecar)プロジェクトのREADMEに詳しい応用を含めた例が載っているが、ここでは起動と停止に絞ってreplセッションに注釈を付けてみる。(後からやる気が出て来れば他の応用に触れてみたい)

```clj
(require '[figwheel-sidecar.system :as sys])
(require '[com.stuartsierra.component :as c])

;;fetch-configはfigwheel.ednファイル,もしくはproject.cljの :cljsbuild と :figwheel の内容からfigwheelの設定値を作って返す
(def config (sys/fetch-config))

;;figwheelのStuart Sierraシステム(必要なコンポーネントの依存関係の定義)をvarに束縛する
;;https://github.com/stuartsierra/component
(def system
      (c/system-map
       :figwheel-system
       (sys/figwheel-system config)))

;;varに束縛されているオブジェクトにc/start関数を適用して起動する
(alter-var-root #'system c/start)
;Figwheel: Starting server at http://0.0.0.0:3449
;Figwheel: Watching build - example
;Figwheel: Cleaning build - example
;Compiling "out/fiddles.js" from ["src"]...
;Successfully compiled "out/fiddles.js" in 4.024 seconds.

;;varに束縛されているオブジェクトにc/stop関数を適用して停止する
(alter-var-root #'system c/stop)
;Figwheel: Stopped watching build - example
;Figwheel: Stopping Websocket Server
```

## 余談：leiningenプラグインの実装方法の話
最初に記述したような理由からreplから単体で使えるライブラリを作り、その上にleiningenのプラグインとしての薄い実装を提供することが推奨されている。
leiningenからしか使えない有用なpluginを作ってしまうとClojure界の重鎮がmavenしか使えない顧客のために[Issueを立ててくる] (https://github.com/JonyEpsilon/gorilla-repl/issues/272)みたいなので今後のlein plugin開発の参考にすると良いかも知れない。
【Swift】 ParallaxEffectでPagingするライブラリをつくってみた

# Parallax Effectとは
ページングの際に背景の画像の周期が遅れることで画面に奥行きを持たせることができる視差効果です。
身近に利用されているのは音楽ストリーミングサービスの[AWA](https://awa.fm/)。
アプリを利用してみると理解しやすいと思うのですが直感的な動きとなっています。

# アニメーション概要
スクロール方向に対して背景画像が逆向きに移動することによって遅れているように見えます。下の例でも利用しているように背景画像を景色などにするとより奥行きが感じられ、遠くにあるようなイメージを湧かせてくれます。

<img width="400" alt="図1.png" src="https://qiita-image-store.s3.amazonaws.com/0/132410/d131df64-1d85-08ef-505a-bccacca29603.png"><img width="200" alt="demo.png" src="https://qiita-image-store.s3.amazonaws.com/0/132410/4c2ebb99-68d7-f44c-bc18-4df4ee3ad19f.gif">

# ParallaxPagingViewControllerについて
上のようなページングアニメーションをサポートしてくれるライブラリ、[ParallaxPagingViewController](https://github.com/tomokitakahashi/ParallaxPagingViewController)を実装してみました。

## ParallaxPagingViewController
ページングの軸となる親ViewController、UIPageViewControllerのようなものです。
必要がある場合は継承してカスタマイズしてください。

- required

```swift
init(_ viewControllers: [ParallaxViewController] = [])
//or
func setViewControllers(_ viewControllers: [ParallaxViewController])
//ページングさせたいViewControllerを設定してください.
```

- optional

```swift
var pageSpace: CGFloat     
// ページ間のスペースを設定できます

var parallaxSpace: CGFloat 
// 背景画像をページングによってどの程度移動させるかを設定できます

var currentPageIndex: Int  
// 設定したviewControllersの初期位置(配列番号)を設定できます

func setInfinite(_ enabled: Bool) 
// 無限スクロールを設定できます、ただしviewControllerが3つ以上必要です
```

## ParallaxViewController
ページングをする子ViewControllerです。継承が必須です。
・required

```swift
@IBInspectable var parallaxImage: UIImage?
// 背景に設定したいUIImageをセットしてください
```

## ParallaxPagingViewControllerDelegate
ParallaxPagingViewControllerから通知されるDelegateです。

```swift
optional func parallaxPagingView(_ pagingViewController: ParallaxPagingViewController, willMoveTo viewController:ParallaxViewController)
// 画面切り替えが開始した際に呼ばれます

optional func parallaxPagingView(_ pagingViewController: ParallaxPagingViewController, didMoveTo viewController:ParallaxViewController)
//　画面切り替えが終了した際に呼ばれます
```

## 実装内容
既存のUIPageViewControllerを使うのではなく、UIScrollViewにViewControllerを追加していく形にしました。willMoveでViewControllerを追加し、didMoveで表示されているViewController以外のchildViewControllerを削除しています。アニメーションについてはUIScrollViewDelegateの`scrollViewDidScroll(_ scrollView:)`から得られる`scrollView.contentOffset.x`からスクロール比率を算出して該当の`imageView`の`origin.x`を変化させています。実装自体はそんなに複雑ではないですが今後、一部のEffectやEffectの向きを設定できるようにしていこうと思います。


# 終わりに
今回初めてライブラリとして公開しました。たくさんの方々のOSSから知見を得ながら作っているので至らない部分が多いと思いますがぜひ利用したり、参考にしていただければと思います。issueやPRも待ってます！
(starがつくと開発者が喜びます！w)

#引用
音楽ストリーミングサービス [AWA](https://awa.fm/) (webサイト)

ParallaxPagingViewController - https://github.com/tomokitakahashi/ParallaxPagingViewController
GameJamでMicrosoft Cognitive Service(EmoteAPI)を使ってみました。

CrossOverGameJam04
http://www.crossover.link/cogj04/

2017年7月7,8,9日 品川マイクロソフトにて行いました。
（制作自体は8,9日）

お題：顔認識を使ったなにか
企画：複数端末を使用した顔の感情を使用したじゃんけん

企画の内容は以下の通り
①カメラで撮影する
②撮影した映像でAPIを叩く→結果でグーチョキパーを決定
③勝敗判定後、勝利側の攻撃モーションが走る
④勝敗表示

# 使用したAsset、ツール等
・iOSNative(写真撮影)
・Microsoft Cognitive Service - Emotion API(写真解析)
・MiniJSON(解析結果パース)
・Photon Cloud(同期処理)

# 実際の処理はこんな感じ
①PhotonCloudで部屋に２人入室したらゲームスタート
②写真を撮る
③API実行
④相手に結果を送る、相手から結果が来るまでひたすら待機
⑤結果がきたら各端末で処理してアニメーション実行
⑥勝敗を表示する

# 実際に使ったEmoteAPIの呼び出しメソッド
https://azure.microsoft.com/ja-jp/services/cognitive-services/emotion/
↓実際のソース（一部）

```C#:EmoteAPI.cs
/// <summary>
/// 感情認識API実行
/// </summary>
/// <param name="texture">Texture.</param>
/// <param name="callback">Callback.</param>
public IEnumerator Connect (Texture2D texture, UnityAction<EntityEmoteModel> callback)
{
	Debug.Log ("Start Emote API");
	// 使うAPIによってURLが変わる
	var url = "https://westus.api.cognitive.microsoft.com/emotion/v1.0/recognize";

	byte[] bytes = texture.EncodeToPNG (); 
	// ヘッダはだいたい固定
	var headers = new Dictionary<string, string> () {
		{"Ocp-Apim-Subscription-Key", [取得したAPI_KEYを入力してください]},
		{"Content-Type", "application/octet-stream"}
	};

	WWW www = new WWW (url, bytes, headers);
	yield return www;
	Debug.Log (www.text);
	// JSON形式でくるので適当にデータクラスに突っ込む
	var request = new EntityEmoteModel ();
	request.DeSerialize (www.text);
	// データを返す
	if(callback != null)
		callback (request);
}
```

# 今後の課題
・構築したGitLabサーバーの速度が遅いのでPull/Pushに時間がかかりすぎる
　→結局Bitbacketを使って開発を行った。

# その他GameJamの醍醐味
・お昼をみんなで楽しむ
<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">お昼駆動開発 <a href="https://twitter.com/hashtag/cogj?src=hash">#cogj</a> <a href="https://t.co/fefX1hvqI9">pic.twitter.com/fefX1hvqI9</a></p>&mdash; ずんずん🍀 (@kazuma_unity) <a href="https://twitter.com/kazuma_unity/status/883540243999150080">2017年7月8日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

## お菓子駆動開発
・みんなでおかし食べながらだと楽しい！！
![IMG_3877.jpg](https://qiita-image-store.s3.amazonaws.com/0/141761/53e488e8-2db5-5710-8491-93bf00c66cae.jpeg)
rubyで順列・組合せ

順列・組合せのメソッドを見つけたのでご報告でございます:horse::unicorn:

# 順列(nPr)

```rb
[1,2,3].permutation(2) do |a, b|
  printf("(%d, %d) ", a, b)
end
# printfの出力
# (1, 2) (1, 3) (2, 1) (2, 3) (3, 1) (3, 2)
```

# 重複順列

```rb
[1,2,3].repeated_permutation(2) do |a, b|
  printf("(%d, %d) ", a, b)
end
# printfの出力
# (1, 1) (1, 2) (1, 3) (2, 1) (2, 2) (2, 3) (3, 1) (3, 2) (3, 3)
```

# 組合せ(nCr)

```rb
[1,2,3].combination(2) do |a, b|
  printf("(%d, %d) ", a, b)
end
# printfの出力
# (1, 2) (1, 3) (2, 3)
```

# 重複組合せ

```rb
[1,2,3].repeated_combination(2) do |a, b|
  printf("(%d, %d) ", a, b)
end
# printfの出力
# (1, 1) (1, 2) (1, 3) (2, 2) (2, 3) (3, 3)
```
iptablesでサーバから外部（他のサーバ）への接続を遮断する

セキュリティの関係上、特定のサーバもしくは特定のセグメントへ接続させたくない場合が多々ある。
LANを抜ければそれだけで解決なのだが、運用中のサーバでそれを実現するのはなかなかリスキーである。

iptablesで孤立させるのが手っ取り早い。



# 事前確認
``` command
iptables -L
```

# 前提条件
localhostから以下のサーバへの通信を止める

```
192.168.1.1
192.168.1.2
10.*.*.*
```

# local -> outbound を制御

``` command
iptables -A OUTPUT -d 192.168.1.1/32 -o eth0 -j DROP
iptables -A OUTPUT -d 192.168.1.2/32 -o eth0 -j DROP
iptables -A OUTPUT -d 10.0.0.0/8 -o eth0 -j DROP
```

# outbound -> localを制御

``` command
iptables -A INPUT -d 192.168.1.1/32 -j DROP
iptables -A INPUT -d 192.168.1.2/32 -j DROP
iptables -A INPUT -d 10.0.0.0/8 -j DROP
```

# 確認

``` command
iptables -L
```

# 解放

すべてのiptablesが真っ白になる

``` command
iptables -F
```
「RaspberryPi の産業用途」にRaspberry Pi搭載のGPUであるVideoCore IVを使う話を追記しました

[「RaspberryPi の産業用途」](http://qiita.com/nonbiri15/items/6f1d6d1eb438e635d111)にRaspberry Pi搭載のGPUであるVideoCore IVを使う話へのリンクを追記しました。
ルーティングで不正アクセスを遮断

不正アクセスを遮断する方法はいくつもある。

* Firewall機器側で設定
* サーバサイドでiptables,firewalldを設定

上記いずれかの方法で遮断するのが一般的だが、
今回はサーバのルーティングで不正アクセスを遮断する方法を記す。

``` code
/sbin/route add -net 123.129.19.0 netmask 255.255.255.0 reject
```

ネットワーク（123.129.19.0）からのアクセスを遮断することが可能。
ルーティングで制御するのはあまり一般的ではないが、
何らかの理由でFirewallに設定を入れることが困難な時などに使うことがある。
tcshで単純作業をループ

Linuxで作業をしている時、単純作業をループしたくなる時が多々ある。
while文を組んでも良いのだが、昔からこの時だけtcshを使っている。
あまりtcshを使っている人を見かけないので簡単な使い方を記す。

``` tcsh
tcsh
loop:
sleep 2
echo "aaa"
echo "bbb"
echo "ccc"
echo "----"
goto loop
```

スリープ2秒を挟んでaaaから---までが無限にループされる。
停止するにはctrl+c。

サーバのステータスを定期的にチェックする等によく使う。
簡易的なループであればwatchコマンドでも良いのだが、watchだとどうしても1コマンドだけに制限されてしまう。
その他コマンドも併せて実施したい時などによく使う。
RailsでTypetalkのbotから通知を受け取る方法


# RailsでTypetalkから通知を受け取る
Typetalkというチャットアプリからトピックの全ての発言をbotを通じてサーバー側に送信します。
Typetalkのapiは、トピックの先頭200件とか投稿を取得できないので、botを設置することで全件抜け漏れなく投稿情報を取得できます。
botは各トピックごとに設置します。

## botの設置
<img width="680" alt="スクリーンショット 2017-07-12 0.16.47.png" src="https://qiita-image-store.s3.amazonaws.com/0/142918/05164a7f-7d72-a3fb-f71d-ba8d27e269f0.png">

上記のように設定をおこない、webhookの使用をチェック
webhook先のurlは`ドメイン/receive`にしておく
これで、誰かがトピックで発言したら、webhook先にjsonデータが送信されます。
受信するjsonの形式は、公式リファレンスを参考ください。

webhookについて
https://developer.nulab-inc.com/ja/docs/typetalk/webhook/

## ソースコード

controllerには、下記のように書きます。

```topics_controller.rb
def receive
    # 読み込み時に一度パースが必要
    json_request = JSON.parse(request.body.read)
    
    # コンソールに受信したjsonを表示
    p "json_request => #{json_request}"

    p "messageのid:#{post["post"]["id"].to_s}"
    p "message本文:#{post["post"]["message"].to_s}"
    p "accountの登録ネーム:#{post["post"]["account"]["name"].to_s}"
    p "accountの実際の表示ネーム:#{post["post"]["account"]["fullName"].to_s}"
    p "messageの投稿時間:#{post["post"]["account"]["createdAt"].to_s}"
  end
```

ついでにroutes.rbも追加しておきましょう

```routes.rb
  post 'receive', to: 'topics#receive'
```

## 結果

### 投稿
実際に投稿したら、こんな感じです。
<img width="973" alt="スクリーンショット 2017-07-12 0.40.17.png" src="https://qiita-image-store.s3.amazonaws.com/0/142918/a44709b3-9c7c-323c-2623-b5dcdb1d6a53.png">

Typetalkからbotを通じて、webhookが実行します。
下記が投稿時のログです。

```ログ
"json_request => {\"topic\"=>{\"id\"=>41429, \"name\"=>\"api test全体\", \"isDirectMessage\"=>false, \"lastPostedAt\"=>\"2017-07-11T15:34:13Z\", \"createdAt\"=>\"2017-04-12T11:35:25Z\", \"updatedAt\"=>\"2017-04-12T11:35:25Z\"}, \"post\"=>{\"id\"=>10019445, \"topicId\"=>41429, \"replyTo\"=>nil, \"message\"=>\"testです\", \"account\"=>{\"id\"=>47124, \"name\"=>\"leokun0210\", \"fullName\"=>\"テストアカウント2\", \"suggestion\"=>\"テストアカウント2\", \"imageUrl\"=>\"https://typetalk.in/accounts/47124/profile_image.png?t=1499596169245\", \"isBot\"=>false, \"createdAt\"=>\"2017-07-09T10:20:04Z\", \"updatedAt\"=>\"2017-07-11T15:04:03Z\"}, \"mention\"=>nil, \"attachments\"=>[], \"likes\"=>[], \"talks\"=>[], \"links\"=>[], \"createdAt\"=>\"2017-07-11T15:34:13Z\", \"updatedAt\"=>\"2017-07-11T15:34:13Z\"}, \"mentions\"=>[], \"exceedsAttachmentLimit\"=>false, \"directMessage\"=>nil}"
"messageのid:10019445"
"message本文:testです"
"accountの登録ネーム:leokun0210"
"accountの実際の表示ネーム:テストアカウント2"
"messageの投稿時間:2017-07-09T10:20:04Z"
```

### 最後
需要はなさそうな記事だなぁ。。。
Spring Bootでflywayを使ってみた。

# 前提
FlywayはSQLで定義したスキーマに基づき、DBを作成してくれるDBマイグレーションツールです。

[Flywayのサイトはこちら](https://flywaydb.org/)

||ツール|
|---|---|
|Java|1.8|
|Spring Boot| 1.5.4|
|Maven| 3.5.0 |
|MySQL| 5.5|
|開発環境|STS|

今回はDBとしてMySQLを使います。

`src/main/resources`以下にある、`application.yml` で、マイグレーションの対象となるDBを定義しましょう。こちらのDBに対して、テーブルやらカラムやらが追加されます。

```
spring:
  datasource:
    url: jdbc:mysql://127.0.0.1:3306/<DB名>
    username: <User名>
    password: <Password>
    driverClassName: com.mysql.jdbc.Driver
```

# マイグレーションツールってなんだっけ？

Flywayに限らず、マイグレーションツールをどういう時に使うかですが、こういうツールがないとどういうことが発生するかを考えてみます。

マイグレーションツールは簡単にいうと、現在のDBの状態に関する情報を「**一箇所で管理し、再現する**」ツールです。

現在のDBの状態というのは、現在のテーブル構成、カラム構成にいたるまでにどういう作成・変更等があったかの情報のことです。

アプリが参照するDBにどういうテーブルがあって、どういうカラムがあるのか、その最新の情報は本番サーバを見れば確かにわかります。

一方で、別の開発者が本番DBに新しいカラム、テーブルを追加した等のDB環境の変更に関する情報を、逐一把握し、それを自分の開発環境に手動で反映するとなると骨が折れます。
どこかで、情報伝達の失敗が起こると、開発者間でも違うDBの状況になり、ある人は、古いテーブル定義のまま開発し続けることになります。「よし、テストするか」という段階で、必要なカラムがあったことに気付いたりします。つまり、複数の開発者間でDBの情報が違う状態が起こり得ます。

そんな時に役立つのがDBマイグレーションツール。

- DBの定義やその変更に関する情報を一箇所で管理する
- その情報に基づき最新のDBの状態を自動で再現する

というようなことをやってくれます。


# 導入の方法

さて、追加の方法ですが、

- Mavenのビルドファイルに設定追加
- テーブルの定義ファイルを追加

で、出来ます。

## Mavenのビルドファイルに設定追加

MavenのビルドファイルにFlywayを追加します。

```xml:pom.xml
<dependency>
  <groupId>org.flywaydb</groupId>
  <artifactId>flyway-core</artifactId>
</dependency>
```

## テーブルの定義ファイルを追加

`src/main/resources/db/migration/`以下にsqlファイルを追加します。
sqlファイルの名前についてはルールがあり、

`V<バージョン>__<任意の名前>.sql`

とつけます。ファイル名のルールは以下のようになってます。

- One or more numeric parts
- Separated by a dot (.) or an underscore (_)
- Underscores are replaced by dots at runtime
- Leading zeroes are ignored in each part



```sql:src/main/resources/db/migration/V1__User.sql
CREATE TABLE `User` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(40) DEFAULT NULL,
  PRIMARY KEY (`id`)
) 
```

# 実行

Flywayでマイグレーションする方法はSTSより、
[Run] -> [Run As] -> [Spring Boot App]
と、普段の開発時の実行と同じように **Appを実行するだけです**。とても簡単。

対象のDBに
`User` テーブルと `schema_version` テーブルが作成されます。

# 参考
http://web-dev.hatenablog.com/entry/spring-boot/intro/flyway
http://qiita.com/osuo/items/3aa375f1a1d6dd3d2459

# 今後
使って見てさらに内容を充実させていきます。
Rustに入門！std::ptr::swap関数を読む｜新しいプログラミング言語を学ぶ15のエクササイズ2-2

RustでPrashant N Mhatreさんによる新しいプログラミング言語を学ぶ15のエクササイズに挑戦しています。[前回は再宣言についてこんな記事を書きました](http://qiita.com/aimof/items/e052bbbf43686bbb8c08)。その続きです。

## 課題

> swapping two variables,

## 解答

コメントで、std::ptr::swap関数を使うと良い、という情報をいただいたので、今回はこの関数を読んでみます。

まずはstd::ptr::swap関数について、[rust公式ドキュメント](https://doc.rust-lang.org/src/core/mem.rs.html#448-463)から引用します。

>```rust:swap.rs
>pub fn swap<T>(x: &mut T, y: &mut T) {
>    unsafe {
>        // Give ourselves some scratch space to work with
>        let mut t: T = uninitialized();
>
>        // Perform the swap, `&mut` pointers never alias
>        ptr::copy_nonoverlapping(&*x, &mut t, 1);
>        ptr::copy_nonoverlapping(&*y, x, 1);
>        ptr::copy_nonoverlapping(&t, y, 1);
>
>        // y and t now point to the same thing, but we need to completely
>        // forget `t` because we do not want to run the destructor for `T`
>        // on its value, which is still owned somewhere outside this function.
>        forget(t);
>    }
>}
>```

## 具体的に読んでいきましょう！

Rustを始めたばかりの私としてはこのコードの内容はざっくりとしかわかりません！
ですので詳細に読んでいきます。上から順に気になった文法をピックアップしていきます。

### pub

publicの略……なのかな？　エクスポートするときに使います。

### [T](https://doc.rust-lang.org/1.11.0/book/generics.html)

Tはジェネリクスです。要するに任意の型みたいな意味らしい。

### [unsafe](https://doc.rust-lang.org/1.8.0/book/unsafe.html)

コンパイラに対して、unsafe内の制約を少し緩めるように指示するものらしいです。Rustでは、危険な関数にはunsafeと書いてあり、unsafeな関数を実行するためには、unsafeを宣言したブロック内でないといけないようです。つまり、今回写しているコードは、unsafeなしだとコンパイルを通りません。具体的には、uninitializedとptr::copy_nonoverlapping()がunsafeです。

### [uninitialized](https://doc.rust-lang.org/std/mem/fn.uninitialized.html)

変数を定義したときに初期化しない。unsafe。ドキュメントをみると色々危ないよと書いてある。安全に初期化する方法は、後述のptr::copy_nonoverlapping()の他には、ptr::writeとptr::copyだけらしい。

### [ptr::copy_nonoverlapping](https://doc.rust-lang.org/std/intrinsics/fn.copy_nonoverlapping.html)

名前の通りオーバーラップせずにメモリの内容をコピーする関数です。unsafe。何がオーバーラップ（重なる）するのかといえば、コピー元メモリとコピー先メモリです。比較対象のptr::copy関数は、コピー元とコピー先のメモリ領域が重なる可能性があるが、ptr::copy_nonoverlapping関数だとメモリ領域は重ならない（あるいは重ねて指定することができない）となります。

### [mem::forget](https://doc.rust-lang.org/std/mem/fn.forget.html)

こちらはsafety。指定した変数のメモリ領域そのものに変更を加えずにメモリ領域と変数の関連性だけをなくします。forget関数の段階でtとyは同じメモリ領域を参照しているため、tに何らかの変更を加えるとyにも影響が出ます。スコープを抜ける段階でtに変更が加えられる（削除とか）影響をyに与えないようにするための関数です。

## まとめ

swapするの結構難しいですね。メモリまで考えたプログラミングは今まであまりやってこなかったので、学びが得られたのは新しい言語（特にC,C++,Rustみたいなの）に触っているからこそです。

次回は、最大値と最小値を求めます。
PHPのディープコピー

#JavaScriptでディープコピーが必要になった際にPHPでのディープコピーが面倒だったことを思い出してのメモ(JavaScriptも一応メモ)

##PHP
http://php.net/manual/ja/language.oop5.cloning.php

```php
class SubObject
{
    static $instances = 0;
    public $instance;

    public function __construct() {
        $this->instance = ++self::$instances;
    }

    public function __clone() {
        $this->instance = ++self::$instances;
    }
}

class MyCloneable
{
    public $object1;
    public $object2;

    function __clone()
    {
        // this->object のコピーを作成します。こうしないと、
        // 同じオブジェクトを指すことになってしまいます。
        $this->object1 = clone $this->object1;
    }
}

$obj = new MyCloneable();

$obj->object1 = new SubObject();
$obj->object2 = new SubObject();

$obj2 = clone $obj;


print("元のオブジェクト\n");
print_r($obj);

print("クローンオブジェクト\n");
print_r($obj2);
```

PHPでオブジェクトをディープコピーをしようとすると
```clone```では<b>オブジェクト内の参照型のものはシャローコピーになる</b>ので
参照型のものについては公式のコードの上記のように```__clone```を実装してcloneを使えば良いのですが、例えばそのオブジェクトの中に更に参照型があったりした場合もそれぞれに```__clone```を実装して行かないといけないので面倒なのでした。

マニュアル通りに対応した後に見つけたのですが以下の方法が何も手を加えなくて良いので便利です。

```php
$new_object = unserialize(serialize($object));
```

`unserialize`を使う際は以下に注意。
[ユーザーからの入力をそのままunserialize()に渡してはいけません。](http://php.net/manual/ja/function.unserialize.php)
[PHPのunserialize関数に外部由来の値を処理させると脆弱性の原因になる](https://blog.tokumaru.org/2015/07/phpunserialize.html)



##JavaScript

* jQueryを使う

```js
var object = {省略};
var newObject = {};
$.extend(true, newObject, object);
// ObjectとArrayにのみ対応
```


* lodash.jsを使う

```js
var object = {省略};
var newObject = _.clone(object, true);
```
```js
var object = {省略};
var newObject = _.cloneDeep(object);
```

* JSONでのシリアライズは完全ではないようです

参考
http://qiita.com/seihmd/items/74fa9792d05278a2e898
http://qiita.com/knhr__/items/d7de463bf9013d5d3dc0