OmniAICreator/Qiita-1.07M huggingface dataset:
Unityバックグラウンドでの処理 & 動作の検出

# バックグラウンドでの処理
- 非Active時にUnityの動作を続けるように設定する

```File > BuildSettings > Player Settings
```
を選択し、Run In Backgroundにチェックを入れる

<img width="300" alt="Main_unity_-_DynamicPatch_-_PC__Mac___Linux_Standalone__Personal___OpenGL_4_1_.png" src="https://qiita-image-store.s3.amazonaws.com/0/34936/666043ab-9653-f489-2fb7-9b75313ac90f.png">


# バックグラウンドへの移行と復帰を検知する
OnApplicationPause(bool pause)を使い、引数pauseStatusでバックグラウンドへの移行とフォアグラウンドへの復帰を判別します。

```hoge.cs
	void OnApplicationPause (bool pauseStatus)
	{
		if (pauseStatus) {
			Debug.Log("applicationWillResignActive or onPause");
		} else {
			Debug.Log("applicationDidBecomeActive or onResume");
		}
	}
```
RodeoのIPythonで日本語を使う @ Windows


# WindowsでPython

Windowsマシンを使わなければいけない環境で、ちょっとPythonでの動作を確認するのにわざわざLinuxのサーバなり仮想マシンなりに入るのもなんなので、Pythonの環境を作ってみた。

## インストールしたもの

- [Anaconda](https://anaconda.org/)でPython3
- [Rodeo](http://rodeo.yhat.com/) - Python IDE

## 困ったこと

RodeoのIPythonコンソールに日本語入力すると固まる。

どうやらIPythonコンソールの入出力はUTF-8なのに、Anacondaで入れたpythonの`sys.stdin`と`sys.stdout`の`encoding`が`cp932`になっているのが原因。

## とりあえずの解決策

以下のようなバッチファイルを作成して、Rodeoの設定の「Python Command」に指定することでとりあえずなんとかなった。

```bat:python-utf8.bat
@echo off
setlocal
set PYTHONIOENCODING=utf-8
%~dp0\python.exe %*
endlocal
```

なんかスマートじゃない感じがする。
Homebrewでパッケージをインストールする際の３つの手段

## 1. 普通にパッケージをインストール

例）wgetをインストールする

```
$ brew install wget
```

## 2. dmg(pkg?)をcaskでインストールする

例）docker for macをインストールする

```
$ brew cask install docker
```

## 3. mas-cliを使用して、AppStoreからインストールする

・mas-cli: Mac App Store command line interface
https://github.com/mas-cli/mas

```
$ brew install mas      # mas-cliのインストール
$ mas install 497799835 # xcode(IDで指定)
```

`mas install XXXXXX`の数値はアプリごとのIDで、itunes.apple.comのアプリのURLに`idXXXXX`とあるのでそれを。

例）Xcode
https://itunes.apple.com/jp/app/xcode/id497799835?mt=12

## 番外

シェルスクリプトにまとめると楽かも？

```
#!/bin/sh

echo "Homebrewのインストール(※コマンドが変わることがあるので注意)"
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

echo "brew診断"
brew doctor

echo "⇒Your system is ready to brewって出たら成功です"

# ①そのままパターン
brew install wget

# ②caskパターン
brew cask install docker

# ③mas-cliパターン
mas install 497799835 # xcode(IDで指定)
```
golang complex(複素数)型の計算をする

# golang
[golang complex(複素数)型を使う](http://qiita.com/shh/items/039eccffd422321ec6dd)で基本的な使い方を解説しています。

今回はこういう画像を使って解説します。

![Shiny Window 2016_10_11 21_07_03.png](https://qiita-image-store.s3.amazonaws.com/0/96468/173f9a3f-e347-914e-197f-0ab48c4c7128.png)
縦軸=虚数 (上が3i、下が-3i)
横軸=実数 (左が-3、右が3)

## 絶対値
math/cmplxパッケージのAbs()関数で絶対値を求めることができます。
![Shiny Window 2016_10_12 14_08_51.png](https://qiita-image-store.s3.amazonaws.com/0/96468/c1227fa3-6551-13f9-e22a-bbdbb1623d54.png)
水色の矢印の長さが絶対値です。
水色の線と、黄色の点から垂直に降りる線と、横軸の線をつなぐと直角三角形で、黄色の点の座標から水色の線(斜辺)の長さを求めることができます。
これはピタゴラスの定理の計算です。

実数型と複素数型で比較してみます。
float64でのピタゴラスの定理の計算
<pre>
f1 := 1.0
f2 := 2.0
ans := math.Sqrt(math.Pow(f1, 2) + math.Pow(f2, 2))
</pre>
complex128での絶対値の計算
<pre>
c := 1+2i
ans := math.Abs(c)
</pre>
複素数の仕組みさえ分かっていれば、このようにとても短く書くことができます。

## 加算,減算 -> 座標の移動とベクトルの加算・減算
![Shiny Window 2016_10_12 13_29_30.png](https://qiita-image-store.s3.amazonaws.com/0/96468/f688df36-761f-5478-f0a0-534f8ad7480f.png)
赤は加算、緑は減算した結果を表しています。

黄色の円黄色の円は初期値(足される、引かれる前の数)です。
加算すると右上に、左下に来ることがわかります。
加算と減算はそのまま座標がずれる計算です。
![f688df36-761f-5478-f0a0-534f8ad7480f.png](https://qiita-image-store.s3.amazonaws.com/0/96468/9460bd81-161d-0120-dc77-844cfadeff70.png)

また同時に、ベクトルの計算でもあります。
こういった動画の方がイメージがつかみやすいでしょうか。
[Dimensions 第5章 複素数](http://www.nicovideo.jp/watch/sm6514026)


## 乗算,除算 = 回転と絶対値の変化
![Shiny Window 2016_10_12 13_29_48.png](https://qiita-image-store.s3.amazonaws.com/0/96468/07291cb6-8a31-a731-92e0-33335390de41.png)


青は乗算、白は除算した結果を表しています。

黄色い点が基準になるよう青が左回転し、白がその逆方向に回転しています。
また、黄色の点が基準になるように青が拡大され、白が縮小されています。

これは、実数の値だけ拡大縮小され、虚数の値だけ回転するという複素数の性質によるものです。
虚数の値をかけるだけで画像の回転を実現したり、実数をかけるだけで拡大縮小ができてしまいます。
画像の加工で大活躍ですね！

## べき乗
べき乗は複雑な計算に思えるかもしれませんが、虚数に対してのべき乗は座標上の回転量の調整に過ぎません。
先ほど載せた[Dimensions 第5章 複素数](http://www.nicovideo.jp/watch/sm6514026)こちらを見ていただければわかるかと思いますが、虚数をかけることは座標上の1/4回転にあたります。

cmplx.Pow(1i, 2)
1/4*2 = 1/2回転、つまり実数の-1と同じです。
cmplx.Pow(1i, 1.0/2.0)
1/4*1/2 = 1/8回転です。

```
v := 1+0i  //初期位置=1
c := cmplx.Pow(1i, 1.0/50.0)  // 一度に(1/200)の回転
for n := 0; n < 200; n++{  //200回なので1回転
  fmt.Println(real(v), imag(v))
  v *= c
}
```
たったこれだけで半径１の円座標の計算ができてしまいます。

## その他
描画は自作ツールです。
[github: rcwindow](https://github.com/intelfike/rcwindow)
スレッドセーフなどかなり気を使っていますが、低レベルなことしか出来ません。
自由にドットを表示するだけのパッケージなので動画再生や画像の表示、加工のアニメーション等も出来ます(自動圧縮等しないので超遅い)
golang complex(複素数)型を使う

<h1>golang</h1>
goには、complex(64 or 128)型というものがあります。
complexとは複素数のことです。

<h2>初めに</h2>
難しいのでむやみに使うとわかりづらいコードになります。

<h2>複素数型リテラル</h2>
floatのリテラルの末尾にiを付けます。

```go
c := 1i
fmt.Println("%T, %v", c, c)  //表示[complex128, 0+1i]
```
省略しないリテラルは0+1iのようですね。
また、型はデフォルトでcomplex128のようです。

<h2>型の変換</h2>
もちろん実数型と互換性があります。

```go
var c complex128 = complex(1, 2) // 複素数に変換
var fr float64 = real(c) // 実数に戻す
var fi float64 = imag(c) // 実数に戻す
fmt.Println(fr, fi)  //表示[1 2]
```
関数みたいに書くと

<b>・実数→複素数</b>
complex(real, imag float)complex

<b>・複素数→実数</b>
real(c complex)float
imag(c complex)float

といった感じです
(float32,64はそれぞれcomplex64,128に対応します)

<h2>標準パッケージ</h2>
https://golang.org/pkg/math/cmplx/
```import "math/cmplx"```
これで標準パッケージが使えます。

mathパッケージにもあるような便利な関数が入っています。
cmplx.Log()
cmplx.Pow()
cmplx.Sin()
などなど。

[golang complex(複素数)型の計算をする](http://qiita.com/shh/items/f92f5c9ff2e515e16d47)
WordPressで画像編集したかったのでGDを無理やりインストールしたらWordPressが動かなくなったので直した件

# はじめに
WordPressで画像編集しようとしたら、GDをインストールする必要があるとのことで、
[またGDか](http://qiita.com/nusa/items/8a71dcc630e7d7118f5b)、と思いつつもGDをインストールすることに。

構成：EC2＋nginx＋RDS(MySQL) 

## GDインストール
いつも通りGDをインストール
> yum install php-gd

## yum remove の罠
インストールコマンドが依存性の関係でインストールできなかったので、何も考えずにcommon削除。

> yum remove  php56-common-5.6.25-1.127.amzn1.x86_64
> yum install php-gd

無理やりGDをインストールして、WordPressにアクセスしたら

「502 Bad gateway」

('w')!?

いろいろ調べてみると、

php56-fpm

あたりがcommonと一緒にアンインストールされていた。

## PHP存在確認
そもそもPHP大丈夫かなと確認してみると、

php -v

「Command not found」

ないやないですか。。

## 再セットアップ

仕方がないので、結局全部アンインストール

yum remove php-*

PHP再インストールのついでにGDもインストール。

yum install php56 php56-fpm php56-gd -y

## 動作確認

php-fpmとnginxを再起動して、WordPressにアクセスすると

「お使いのサーバーの php では wordpress に必要な mysql 拡張を利用できないようです。」

('w')ﾌｧｯ!?

なんだかよくわからないけどどこかのタイミングでMySQL接続クライアントも消えた模様。。

yum install mysql-community-client
php -m | grep mysql

これで直りました。
うるせえな、forkするんだよ

持ってきたいリポジトリをforkしてcloneする
cloneしたリポジトリの直下に移動

```
$ git remote add upstream git:github.com<owner>/<repo_name>.git
$ git fetch upstream
# git branch -a
# 欲しいbranchをlocalに持ってきてチェックアウトする
$ git checkout -b new_branch_name upstream/remote_branch_name
```

後はいつもと同じ様にaddしてcommitするなりfetchしてmergeするなりしてください.


```console
$ git pull --rebase args1 args2
```

`rebase`が結構好きだったんですが、綺麗になりすぎる。
コードレビューをしてもらう時は `merge` 使う方がイイです

人の気持ちを考えましょう

```magic_cmd
$ git remote rm <repository_name>
```
swift (3)


#变量和简单类型


对于变量来说就好比它是一个鞋盒子,它包含了一个严格定义的单个值. 每一个变量都需要显式正式的定义. 要想将一个对象塞进鞋盒子, 就需要让这个变量指向这个对象. 这里我们说说如何定义和初始化一个变量.还有会说道一些内置的简单类型.(之所以说简单是相对于集合这样的复杂类型,之后会说到_)


- Variable Scope and Lifetime
- Variable Declaration
- Computed Initializer
- Computed Variables
- Setter Observers
- Lazy Initialization
- Built-In Simple Types



## 变量的作用域和生命周期

### 全局变量
   定义在一个swift 文件顶层的变量就是全局的变量.
   
### 属性
   属性是对于那些定义在顶层的对象类型(类,枚举或者结构)来说的,有2中属性,一是实例的属性,二是静态/类 属性.
   
- 实例属性
   
     默认的来说, 一个属性它就是实例的属性,
     
- 静态/类属性
   
     就是在定义他们的时候通过 static 或者 class 关键字来修饰的属性.  

看下面的代码

```
// File1:
class Dog {
    static let staticProperty = "staticProperty"
    let instanceProperty = "instanceProperty"
    func printInstanceProperty() {
        print(self.instanceProperty) // *
    }
}
// File2:
class Cat {
    func printDogStaticProperty() {
        print(Dog.staticProperty) // *
    }
    func printDogInstanceProperty() {
        let d = Dog()
        print(d.instanceProperty) // *
    }
}

```


## 本地变量

在函数体内的变量我们就称之为`本地的变量`,一个本地的变量它的生存范围就是在`{}`之间.

```
class Dog {
    func printLocalVariable() {
        let localVariable = "local"
        print(localVariable) // *
    }
}
```



## 定义变量

可以通过` let` 或者` var` 来定义变量区别在于:

- 通过` let`, 变量将会变成`常理`, 意味着它的值不会再变.
- 通过`var`, 它就是真正意义的 **变量**.

而一旦定义变量他们的类型是不能够改变的. 尽管他们的值是可以修改但是这些值都应该是一类的.

定义变量三种方法:


- var x:Int
- var x = 1
- var s:Int = 1

推荐第三种显式给类型并初始化.



## 计算生成的初始化方法


有些时候你需要执行那么几行代码来给一个变量初始值, 一个简单的方法就是通过匿名函数立即执行的方式来实现:

```
let times: Bool  = {
  if val == 1 {
    return true
  } else {
    return false
  }
}
```



## 计算生成的变量

setter 方法

```
var now : String { 
    get { 
        return Date().description 
    }
    set { 
        print(newValue) 
    }
}

```

##  setter监视

swift 同样有另外一个特性就是能够 hook 进去一些方法来监视 set 方法.

```
var s = "whatever" { 
    willSet { 
        print(newValue) 
    }
    didSet { 
        print(oldValue) 
        // self.s = "something else"
    }
}
```


## 惰性初始化

- 全局变量, 默认惰性初始化. 对于全局变量来说当 app 启动的时候完全没有必要初始化, 因为程序还是没有跑起来呢,所以延迟到之后的某个步骤才合适.
- 静态属性, 默认也是延迟.
- 实例属性, 默认并不是延迟的, 但是可以通过` lazy` 关键字来让它延迟.而且必须要` var` 来声明.


## 内置简单类型

- Bool `var selected : Bool = false`
- Numbers
	- Int
	- Double
	- 数字转换
	- 运算符
	- 比较

- String
- Character
- Range
- Tuple
- Optional
	- umwrapped optional
	- implicitly unwrapped optional

```
let stringMaybe : String? = "howdy"
let upper = stringMaybe.uppercased() // compile error
```

上面的代码里的` stringMayBe` 其他它是 Optional 封装过的. 你要让它当 string 你需要解出来

```
let stringMaybe : String? = "howdy"
let upper = stringMaybe!.uppercased()
```



```
func realStringExpecter(_ s:String) {}
var stringMaybe : String! = "howdy"
realStringExpecter(stringMaybe) // no problem
```

- 好神奇的 Nil


```
var stringMaybe : String? = "Howdy"
print(stringMaybe) // Optional("Howdy")
if stringMaybe == nil {
    print("it is empty") // does not print
}
stringMaybe = nil
print(stringMaybe) // nil
if stringMaybe == nil {
    print("it is empty") // prints
}

```

- Optional Chains


```
let stringMaybe : String? = "howdy"
let upper = stringMaybe!.uppercased()
```


- optional 的对象比较


```
let s : String? = "Howdy"
if s == "Howdy" { // ... they _are_ equal!
```


## 为什么需要 Optional
【C#】nullチェックを楽にする演算子のオーバーロード

Unity界隈ではおなじみの
UnityEngine.Objectを継承しているオブジェクトの

if (obj) { ... }

というnullチェックの書き方ですが
こんな感じで演算子のオーバーロードすると実装できます

---

```csharp
public class Hoge
{
    public static implicit operator bool(Hoge self)
    {
        return self != null;
    }
    
    public static bool operator true(Hoge self)
    {
        return self != null;
    }

    public static bool operator false(Hoge self)
    {
        return self == null;
    }
}
```


```csharp
public class Main
{
    private Hoge hoge;

    public Main(object[] args)
    {
        if (hoge) { Console.WriteLine(hoge.ToString()); }
    }
}
```
はうつーろけぽす

#ろけぽすとは

様々な位置情報共有サービスが誕生する中、また[@tmyt](https://twitter.com/tmyt)がなんか作ったようです。
<del>拙作の[今ココ互換鯖](https://github.com/hamache9821/ImacocoServer)とやや被るところもあるけど気にしない</del>

##どんなの
位置情報の集約と表示に特化したSaaS的なやつ。
[公式サイト](https://locapos.com/)と[公式ドキュメント](https://github.com/locapos/docs/blob/master/api.md)を見たほうが早いかも。
利用規約や料金諸々は後日書くような感じのようです。


##とりあえず動かしてみた

まず、[@tmyt](https://twitter.com/tmyt)にコンタクトを取ってクライアントIDを発行してもらいます。

次に、お好みのブラウザで下記urlを開きます。
※client_idとredirect_uriはurlエンコードしてね。redirect_uriは適当に放り込もう

```
https://locapos.com/oauth/authorize?response_type=token&client_id=<Your ClientID>&redirect_uri=<redirect uri>

```

すると、以下のように出るので、お好みのサービスで認証しよう
![1.png](https://qiita-image-store.s3.amazonaws.com/0/90264/317321d9-38ca-ceb7-a04b-4146af2e5048.png)

認証を進めていくと、リダイレクトしていますの画面のソースからトークンが取れるので、適当に保存します。
※ちゃんとリダイレクトして受け取るほうがよさげ

##位置情報を投げてみよう
curlの使える環境で以下のコマンドをサクッと実行しよう

```
curl -w '\n' -H 'Authorization:Bearer <Your Access Token>' 'https://locapos.com/api/locations/update' --data 'latitude=34.6873316&longitude=135.5238653&heading=0' -XPOST

```

すると

![locpos.png](https://qiita-image-store.s3.amazonaws.com/0/90264/f8c16e7d-70eb-c8ce-285c-0e4279ce7a2c.png)

こんな感じに表示されます。めっちゃらくちん。

ほかの機能はドキュメントが埋まってきたら書きます。たぶん。
Docker  コンテナからdockerコマンドを使えるようにする

#環境

OS:windows 8.1
DockerToolbox 1.12


#概要
windows内でdockerを使って開発環境を構築していました。
慣れるにしたがってCIコンテナから他のコンテナを起動して、テストなんてできたらいいなという欲求が出てきたので、コンテナからdockerコマンドを利用できるようにしました。

#方法
ホスト側のdockerデーモンをコンテナのdockerコマンドで呼べるようにします。

####ホスト側
デーモンを確認
![shot.gif](https://qiita-image-store.s3.amazonaws.com/0/8613/d24d25bd-7b18-b747-c817-8b15891176b9.gif)

ホスト側では/var/lib/boot2docker以下の証明書を使ってTLS通信しているようです。

ですので、例えばですが、
・/var/lib/boot2docker以下をdocker run時にマウント
・ホスト側のIPが192.168.99.100
の場合、以下のようなコマンドで呼べるようになります。

####コンテナ側
コンテナ側でdockerをインストールします。
 
    
    yum -y install docker


    docker \
      -H tcp://192.168.99.100:2376 \
      --tlscacert=/var/lib/boot2docker/ca.pem \
      --tlscert=/var/lib/boot2docker/server.pem \
      --tlskey=/var/lib/boot2docker/server-key.pem \
      --tlsverify  \
    ps 
長い。。

IP変わることもあるので docker build時にARGとかでIP渡すなりした方がいいですね。
これでコンテナ側からdockerコマンドで他コンテナを操作できるようになりました。
SpringBoot+Doma2+Thymeleaf開発（Eclipse環境構築編）

#Eclipse環境構築
EclipseでSpringBoot + Doma2 + Thymeleaf の開発を行う為に必要なEclipseの環境構築手順を記載


##Eclipseダウンロード
Pleiades All in One eclipseの最新版をダウンロード(JavaのFull Edhitionを選択)
http://mergedoc.osdn.jp/


##Eclipseインストール
解凍して起動

##Javaインストール
Pleiades All in One eclipseに含まれているので不要

##プラグイン追加
###Spring Tool Suite(STS) for Eclipse
- Spring用プラグイン
    - eclipseでSpring開発を行うためには必須
- マーケットプレイスからインストール

###Doma Tools
- Doma2用プラグイン
    - JavaとSQLファイルの関連チェックや整合性チェックを行ってくれる
- マーケットプレイスからインストール or 新規ソフトウェアのインストール（http://dl.bintray.com/domaframework/eclipse/）

###FreeMarker IDE
- Doma2用プラグイン（FreeMarkerエディタプラグイン）
    - Doma-GenのテンプレートエンジンがFreeMarkerなので入れておくと見やすい
- マーケットプレイスからインストール

###Thymeleaf Content Assist
- Thymeleaf用プラグイン
    - Thymeleafタグのコンテンツアシストを行ってくれる
- 新規ソフトウェアのインストール（http://www.thymeleaf.org/eclipse-plugin-update-site/）
    - インストールしただけでは有効にならないので有効にするには以下を実行
        - プロジェクト右クリック → Thymeleaf → Thymeleafネーチャーの追加

###EGit
- git用プラグイン
- 最新版のeclipseならデフォルトでインストールされている

###Buildship
- gradle用プラグイン
- 最新版のeclipseならデフォルトでインストールされている
Vagrantへプライベート接続できなくなった

ときどき、突然Vagrantに繋がらなくなることがあります。
大抵はVirtualBoxの実体ファイルが謎の失踪をしていたりするのですが、今回は新しいパターン。
（ちなみに↑は案外簡単に直ります[→参考](http://d.hatena.ne.jp/kojimu/20110930/1317369588)）

# 現象
Vagrant上のWebサーバにアクセスできない。
`ping 192.168.33.10`も失敗する。
127.0.0.1:2222宛のSSH接続はうまくいく。

# 何が起こっているか
127.0.0.1:2222にSSHで入って調査。

```Terminal.
$ ifconfig
```
してみる。

```Terminal.
eth0      Link encap:Ethernet  HWaddr 08:00:27:82:D2:22  
          inet addr:10.0.2.15  Bcast:10.0.2.255  Mask:255.255.255.0
          inet6 addr: fe80::a00:27ff:fe82:d222/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:1618 errors:0 dropped:0 overruns:0 frame:0
          TX packets:916 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:1025139 (1001.1 KiB)  TX bytes:104928 (102.4 KiB)

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:7775 errors:0 dropped:0 overruns:0 frame:0
          TX packets:7775 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:911282 (889.9 KiB)  TX bytes:911282 (889.9 KiB)
```
本来、192.168.33.10が割り当てられているはずのeth1が起動していない。

# 対策
```Terminal.
$ sudo vim /etc/sysconfig/network-scripts/ifcfg-eth1
```
として、eth1の設定を開いてみると空っぽだった。
以下を追記する。

```vim
BOOTPROTO=none
DEVICE=eth1
IPV6INIT=no
IPADDR=192.168.33.10
NM_CONTROLLED=no
ONBOOT=yes
TYPE=Ethernet
```
※IPADDRは、Vagrantfileに設定した各自のIPに置き換えてください。

ネットワーク再起動。

```Terminal.
$ sudo service network restart
```

繋がるようになった。
一応、ホストマシンから`vagrant halt` `vagrang up`を実行したが問題なし。
突然この現象が発生した原因は謎のままです・・・。

# 参考
- [複製したvagrant boxでNICエラーになりssh接続できない](http://qiita.com/J_Sugar__/items/1b590e413a3d0b4e46f6)
- [vagrantで立ち上げた環境にPrivateIpでssh接続ができなかった](http://qiita.com/akito0190/items/630e4ded9675e03442dc)
Numpy 基本演算メモ

Pythonの数値計算ライブラリ、Numpyでよく使うやつのメモ。だいたいnpという名前でインポートされることが多い。随時更新予定。

```py
import numpy as np
```

# array
行列を作る。

```py
>>> np.array([1, 2, 3])
array([1, 2, 3])
>>> np.array([[1, 2], [3, 4]])
array([[1, 2],
       [3, 4]])
```

# T
転置行列を作る。

```py
>>> a = np.array([[1, 3], [2, 1]])
>>> a
array([[1, 3],
       [2, 1]])
>>> a.T
array([[1, 2],
       [3, 1]])
```

# zeros, ones
zerosは0で、onesは1で埋められた、指定された形の行列を生成する。

```py
>>> np.zeros(3)
array([ 0.,  0.,  0.])
>>> np.zeros([3, 3])
array([[ 0.,  0.,  0.],
       [ 0.,  0.,  0.],
       [ 0.,  0.,  0.]])
>>> np.ones(3)
array([ 1.,  1.,  1.])
>>> np.ones([3, 3])
array([[ 1.,  1.,  1.],
       [ 1.,  1.,  1.],
       [ 1.,  1.,  1.]])
```

# eye
単位行列を作る。

```py
>>> np.eye(3)
array([[ 1.,  0.,  0.],
       [ 0.,  1.,  0.],
       [ 0.,  0.,  1.]])
```

# diag
対角行列を作る。

```py
>>> np.diag([1, 2, 3])
array([[1, 0, 0],
       [0, 2, 0],
       [0, 0, 3]])
```

# vstack, hstack
行列の合成に使われる。使い方は次の通り。

```py
>>> a = np.array([1, 1, 1])
>>> b = np.array([2, 2, 2])
>>> np.vstack([a, b])
array([[1, 1, 1],
       [2, 2, 2]])
>>> np.hstack([a, b])
array([1, 1, 1, 2, 2, 2])
```

# dot
内積を計算する。

```py
>>> np.dot([1, 2, 3], [1, 2, 3])
14
```

# cross
外積を計算する。

```py
>>> np.cross([0, 1], [1, 0])
array(-1)
```

# flatten
一次元配列に変更する

```py
>>> a = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
>>> a.flatten()
array([1, 2, 3, 4, 5, 6, 7, 8, 9])
```

# random.rand
ランダムな数値の行列を生成する。

```py
>>> np.random.rand(3)
array([ 0.37043199,  0.67058649,  0.53891633])
>>> np.random.rand(2, 3)
array([[ 0.50614319,  0.04483549,  0.39542568],
       [ 0.04853891,  0.55439793,  0.81737454]])
```
【AWS S3コマンド】S3から複数ファイルを同時にダウンロード/アップロードする方法。

いつも忘れるのでメモ。
実はこれでいける。

### ダウンロード
```text:指定パス内のファイルを全て再帰的に
aws s3 cp s3://test_bucket/test/ ./folder --recursive
```
```text:*で対象ファイルを絞り込んで（*.txt）
aws s3 cp s3://test_bucket/test/ ./folder --exclude "*" --include "*.txt" --recursive
```
```text:*で対象ファイルを絞り込んで（*.txtと*.dat）
aws s3 cp s3://test_bucket/test/ ./folder --exclude "*" --include "*.txt" --include "*.dat" --recursive
```

### アップロード
```text:指定フォルダ内のファイルを全て再帰的に
aws s3 cp ./folder s3://test_bucket/test/ --recursive
```
```text:*で対象ファイルを絞り込んで（*.txt）
aws s3 cp ./folder s3://test_bucket/test/ --exclude "*" --include "*.txt" --recursive
```
```text:*で対象ファイルを絞り込んで（*.txtと*.dat）
aws s3 cp ./folder s3://test_bucket/test/ --exclude "*" --include "*.txt" --include "*.dat" --recursive
```
openFrameworksで日本語を表示する方法

## 1. ofxTrueTypeFontUCを追加する
標準だとできないので、アドオンを追加する。
[hironishihara/ofxTrueTypeFontUC](https://github.com/hironishihara/ofxTrueTypeFontUC)からアドオン一式をダウンロードして、`OF_ROOT/addons`に配置する。

## 2. 使用するフォントを追加する
使用したい日本語フォントをアプリの下の`bin/data`とかに配置する。

## 3. コードを書く

まずヘッダーファイルでアドオンをインクルードして、インスタンスを作成する。

```ofApp.h
#pragma once

#include "ofMain.h"
#include "ofxTrueTypeFontUC.h"

class ofApp : public ofBaseApp{

	public:
		void setup();
		void update();
		void draw();

		void keyPressed(int key);
		void keyReleased(int key);
		void mouseMoved(int x, int y );
		void mouseDragged(int x, int y, int button);
		void mousePressed(int x, int y, int button);
		void mouseReleased(int x, int y, int button);
		void mouseEntered(int x, int y);
		void mouseExited(int x, int y);
		void windowResized(int w, int h);
		void dragEvent(ofDragInfo dragInfo);
		void gotMessage(ofMessage msg);

    static const int fontSize = 19;
    static const int posX = 100;
    static const int posY = 100;
    ofxTrueTypeFontUC font;
};

```

次に、実際にフォントデータを読み込んで描画する。

```ofApp.cpp
#include "ofApp.h"

//--------------------------------------------------------------
void ofApp::setup(){
    font.loadFont("fontName.otf", fontSize);
}

//--------------------------------------------------------------
void ofApp::draw(){
    font.drawString("こんにちは", posX, posY);
}
```
Docker volumeの削除

##Docker vlumeの削除

```docker-compose.yml
volumes:
  db-data:
    driver: local
```
##voloume list
```
docker volume ls
```

DRIVER　　　VOLUME NAME
local　　　　00c9dd5125c6c249363e6cbc3202fc30b8a1c17d98ee8b1f305e509ba316804f
　　:
　　:
　　:
local　　　　project_db-data

##削除
```
docker volume rm project_db-data
```

##全部削除
```
docker volume rm $(docker volume ls -qf dangling=true)
```

##リンク切れ削除
```
docker volume ls -qf dangling=true | xargs -r docker volume rm
```
追記：[docker volume prune](https://docs.docker.com/engine/reference/commandline/volume_prune/#parent-command)
Remove all unused local volumes

未だに、この古い記事にいいね！してくれてる方が定期的にいるようですので追記しておきます。(2018.06.04)


###参照
- [docker-cleanup-volumes](https://github.com/chadoe/docker-cleanup-volumes)

- [how-to-remove-all-docker-volumes](http://stackoverflow.com/questions/36663809/how-to-remove-all-docker-volumes)
swift (1)


#swift 的结构

## Object

> Three Flavors of Object Type

- struct
- enum
- class


## Variables

> A variable is a name for an object. Technically, it refers to an object; it is an object reference. 

> all variables must be declared. If you need a name for something, you must say “I’m creating a name.” You do this with one of two keywords: let or var.

通过` let` 或者` var` 来声明变量


```
let one = 1
var two = 2
```


## 函数

上面的代码是不能够随便写的,需要放到函数体内. 最普通的声明方式就是:

```
func go() {
    let one = 1
    var two = 2
    two = one
}
```


>Swift also has a special rule that a file called main.swift, exceptionally, can have executable code at its top level, outside any function body, and this is the code that actually runs when the program runs. You can construct your app with a main.swift file, but in general you won’t need to.

swift 同样有程序运行入口. 那就是` main.swift`.

一个 swift 文件的构成:


- 模块` import`
- 变量声明,
	- 直接声明的变量就是全局的.
- 函数声明
- 对象类型:类,枚举还有结构


##作用域和生命周期

规则就是他们是否是同级可见或者更高层级可见.

- 一个模块
- 一个文件
- 一个大括号


## 对象成员

在对象类型(类,结构还有枚举)里,往往定义在顶层的内容都有其特殊原因,这里拿一个类叫` Manny` 来示范:


```
class Manny {
  let name = "manny"
  func sayName() {
    print(name)
  }
}
```

在这个代码里

- `name` 它是定义在对象` Manny` 顶层的. 我们将它称之为`属性` (property).
- `sayName` 这个函数同样也是定义在顶层,我们称之为对象方法.


凡是定义在顶层的都是作为对象的 **成员** 存在. 他们通常都是很重要的,因为他们定义了可以传递什么样的 **消息** 给这个对象.

## 命名空间

它同样也是作为作用域而存在, 一个命名空间内的属性是不能够随便让外界访问到. 它可以 **同时用来防止命名冲突**.

```
class Manny{
  class Klass {}
}
```
像这上面的写法就是很好地将类` Klass` 隐藏在了` Manny` 内部,这个时候` Manny` 就是`命名空间`.
访问的时候可以通过` Manny.Klass` 来访问.

##模块

通常顶层的命名空间我们称之为模块, 其实你的 ios app 就是一个 module, 而各种 framework 也是 module, 通常顶层的 module 我们不需要在调它们成员的时候显式再来来`打点`调用.因为既然已经` import` 了那它们顶层的模块已经就是可见的.

swift 本身就是定义在一个 module 之内 -- **swift 模块**.你的代码总是隐士的在引入` swift` 模块. 你完全可以在一个 swift 文件里开头使用` import swift` 作为开始,但是完全没有必要. 但是呢, 为什么说这个呢想想看我们从哪里定义的` print` 方法呢,其实它就是定义在顶层的一个函数在 swift 模块里.你也可以写成这样子:` Swift.print("hello, world")!`

## 实例

对象类型(类,结构,枚举)他们都是可以被 **实例化**的. 也就是说当你定义一个对象的时候它本身只是一个 **类型**. 而实例化一个类型就是它它实例化得到一个`实例`.


如我定义一个` Dog` 对象:

```
class Dog{
  func bark(){
    print("woof")
  }
}
```

其他敲响上面这些代码在程序中并没有发生什么,你只是描述了一个类型. 你想要一个实际的` Dog`,你就需要`创建`一个. 那就是实例化.

在 swift 中如何实例化一个对象呢, 就是直接在对象名后面加上 **括号**, 它就是一个特殊的方法,传递了一个消息给对象创建一个实例出来:

```
let fido = Dog()

```

然后我们可以继续调用它的方法:

```
let fido = Dog()
fido.bark()
```
Python > QMC(Halton_Sequence)の実装 > v0.2, v0.3

QMC (Quasi-Monte Carlo Methods)で使うHalton SequenceのPython実装


## v0.2

http://qiita.com/7of9/items/5e61943bcb898521e1c6
のC実装をPython用にしただけ。

http://ideone.com/9LC7WO

```py
def Halton_sequence(i0):
	xbase = 2
	ybase = 3
 
	invxbase = 1.0 / xbase
	facx = 1.0 / xbase
 
	invybase = 1.0 / ybase
	facy = 1.0 / ybase
 
	inp = i0
	x0 = 0.0
	while inp > 0:
		x0 = x0 + (inp % xbase) * invxbase
		inp = inp / xbase
		invxbase = invxbase * facx
 
	inp = i0
	y0 = 0.0
	while inp > 0:
		y0 = y0 + (inp % ybase) * invybase
		inp = inp / ybase
		invybase = invybase * facy
 
	return x0, y0
 
for i0 in range(10):
	x0,y0 = Halton_sequence(i0)
	print x0,y0
```

```txt:結果
0.0 0.0
0.5 0.333333333333
0.25 0.666666666667
0.75 0.111111111111
0.125 0.444444444444
0.625 0.777777777778
0.375 0.222222222222
0.875 0.555555555556
0.0625 0.888888888889
0.5625 0.037037037037
```

見覚えのある数値が出ているので多分あっているかと。

時間ができたときに整理するかも。

## v0.3
(追記 2017/03/20)

importできるように変更した。
static methodにしている。
参考 http://stackoverflow.com/questions/735975/static-methods-in-python

```UtilHaltonSequence.py
'''
v0.3 Mar. 20, 2017
    - change to a static function in a Class
v0.2 Oct. 22, 2016
    - implemented in Python
v0.1 Mar., 2005 or so
    - implemented in C
'''

# codingrule:PEP8


class CHaltonSequence:
    @staticmethod
    def calc_Halton_sequence(index):
        XBASE = 2
        YBASE = 3

        inv_xbase = 1.0 / XBASE
        fac_x = 1.0 / XBASE

        inv_ybase = 1.0 / YBASE
        fac_y = 1.0 / YBASE

        inp = index
        xwrk = 0.0
        while inp > 0:
            xwrk = xwrk + (inp % XBASE) * inv_xbase
            inp = inp / XBASE
            inv_xbase = inv_xbase * fac_x

        inp = index
        ywrk = 0.0
        while inp > 0:
            ywrk = ywrk + (inp % YBASE) * inv_ybase
            inp = inp / YBASE
            inv_ybase = inv_ybase * fac_y

        return xwrk, ywrk

'''
Usage example:

from UtilHaltonSequence import CHaltonSequence

for idx in range(0, 11):
    x0, y0 = CHaltonSequence.calc_Halton_sequence(index=idx)
    print(x0, y0)

'''

```

```test_haltonSeq.py
from __future__ import absolute_import
from __future__ import division
from __future__ import print_function
from UtilHaltonSequence import CHaltonSequence

for idx in range(0, 11):
    x0, y0 = CHaltonSequence.calc_Halton_sequence(index=idx)
    print(x0, y0)

```

```txt:実行結果
$ python test_haltonSeq.py 
0.0 0.0
0.5 0.333333333333
0.25 0.666666666667
0.75 0.111111111111
0.125 0.444444444444
0.625 0.777777777778
0.375 0.222222222222
0.875 0.555555555556
0.0625 0.888888888889
0.5625 0.037037037037
0.3125 0.37037037037
```
Droneのビルドをスキップするコミットメッセージ

Droneネタばかりですみません。小ネタですが、社内共有を兼ねて。

Documentを読んでいて、Build & Testのページに[Skip Commits](http://docs.drone.io/hooks/#skip-commits)という項があるのに気付きました。

> ### Skip Commits
> Instruct Drone to skip builds by by including any combination of ci and skip wrapped in square brackets in your commit message. Examples: [skip CI] [ci skip]

コミットメッセージの中に”ci”と”skip”という文字列が角括弧[]で囲われた形で含まれていたら、ビルドをスキップします。例：`[skip CI]` `[ci skip]`

コードのロジックに影響のない修正をした時にもビルドが走ってしまうため、気軽にremoteにpushできないことがあったので、これは地味に便利です。

```
[skip ci] remove old comments.
```

みたいなコミットメッセージにしておけば、共有しているCIのリソースを無駄に消費しないし、こまめにpushできるので精神衛生的にも良いですね。


---

この記事は2016.4.7に[こちらのURL](http://dev.karappo.net/?p=267)で公開していた内容を移行しました。
Droneのキャッシュを使ってビルドを高速化

Karappoでは、[Drone](https://github.com/drone/drone)というオープンソースのCIを使っています。Dockerイメージが用意されているので簡単にインストールできるし、非常に便利です。DigitalOceanへのインストールの仕方は[こちら](http://qiita.com/naokazu_terada/items/d040ad27e77b587ef49f)を御覧ください。

このDroneは、ビルド毎に指定されたDockerのContainerが立つので（前回ビルド時の環境からは完全に切り離されている状態のため）、例えばRailsのプロジェクトをCIしたい時などに、bundle installを実行すると、その度にダウンロード時間がかかることになります。これはnpmなど他のパッケージマネージャーを使っている場合でも同じです。毎回パッケージのインストールはしたくない、かと言ってビルドに使うDockerイメージ自体に依存ライブラリを入れちゃうと変更が効かなくなるし、どうしたらよいのかなーと思っていました。

理想的には、ローカルでbundle installする場合は、既にインストール済みのパッケージは無視して新しいパッケージのみダウンロードするので、そんな感じにしたいです。そこで、ドキュメントを読んでいると[Caching](http://readme.drone.io/usage/caching/)という項目があるのに気付きました。これを使うと、まさに上で書いたように差分を見てダウンロードしてくれるようにできるはずです。なので、早速試してみました。

例えば、こんな感じの.drone.ymlだった場合、

```.drone.yml
build:
  image: hoge/hoge
  commands:
    - bundle install --path=vendor/bundle --binstubs=vendor/bin
    - RAILS_ENV=test bundle exec rake db:create db:migrate
    - bundle exec rspec
```

このように、cache > mountのリストにキャッシュしたいディレクトリを指定を追加してやるだけです。

```.drone.yml
build:
  image: hoge/hoge
  commands:
    - bundle install --path=vendor/bundle --binstubs=vendor/bin
    - RAILS_ENV=test bundle exec rake db:create db:migrate
    - bundle exec rspec
cache:
  mount:
    - vendor
```

この場合だと、vendor以下にgemをインストールしているのでこんな感じになります。プロジェクトディレクトリ外のディレクトリをキャッシュする場合は、注意が必要みたいでドキュメントに詳しく書いてあるので見ておいてください。

これで、こんなログだったのが、

```shell-session
$ bundle install --path=vendor/bundle --binstubs=vendor/bin
...
Installing rake 10.5.0
Installing CFPropertyList 2.3.2
Installing i18n 0.7.0
...
```

こんな感じでInstallingがUsingに代わって、ビルドが高速化されているのが確認できます。

```shell-session
$ bundle install --path=vendor/bundle --binstubs=vendor/bin
...
Using rake 10.5.0
Using CFPropertyList 2.3.2
Using i18n 0.7.0
...
```

---

この記事は2016.4.7に[こちらのURL](http://dev.karappo.net/?p=253)で公開していた内容を移行しました。
DigitalOceanにDrone 0.4 をインストールする

【追記】 [DigitalOceanにDrone 0.8 をインストールする](https://qiita.com/naokazuterada/items/71045b3063db1eaf120a) を書きました。


---

[DigitalOcean](https://www.digitalocean.com/)には、[One-Click Apps](https://www.digitalocean.com/features/one-click-apps/)という、名前のとおりワンクリックで何も設定等なくいきなりサービスを立ち上げることができるDropletがあり、この中にある[Droneのアプリ](https://www.digitalocean.com/features/one-click-apps/drone/)をKarappoではしばらく使っていました。ただ、Droneのバージョンが古かったので、今回は用意されたDropletの中から Ubuntu Docker 1.10.3 on 14.04 に最新のDrone(v0.4)をインストールしてみた覚書です。

やり方は[ドキュメント](http://readme.drone.io/setup/overview/)ほぼそのままです。
Karappoでは、gitのリポジトリ管理にGitlab（v8.1.2）を使っているので、そのGitlabとDroneを連携させるための手順になります。

まず先に、Gitlabでcallback urlをhttp://{drone_host}/authorizeにして、Applicationを登録し、発行されたclinet_idとsecretをメモしておきます。

DigitalOceanのサーバーにログインしてから、

```shell-session
$ sudo docker pull drone/drone:0.4
$ sudo mkdir /etc/drone
$ sudo vi /etc/drone/dronerc
```

として、dronercの内容を以下のようにします。

```dronerc
REMOTE_DRIVER=gitlab
REMOTE_CONFIG=https://{gitlab_host}?client_id={client_id}&client_secret={client_secret}
```

これでもう終わりです。後は起動するだけ。

```shell-session
$ sudo docker run \
--volume /var/lib/drone:/var/lib/drone \
--volume /var/run/docker.sock:/var/run/docker.sock \
--env-file /etc/drone/dronerc \
--restart=always \
--publish=80:8000 \
--detach=true \
--name=drone \
drone/drone:0.4
```

Dockerイメージを使えるので、すごく簡単でした。DroneのDockerイメージは[ここ](https://hub.docker.com/r/drone/drone/tags/)にあります。

---

この記事は2016.4.6に[こちらのURL](http://dev.karappo.net/?p=251)で公開していた内容を移行しました。
TensorFlow Tutorial #01 Simple Linear Model > chain-rule for derivatives > NumPyより効率的な方法

TensorFlow関連のYoutube。

Hvass Laboratoriesのビデオは資料が読みやすく説明も丁寧。
https://www.youtube.com/watch?v=wuo4JdG3SvU&index=44&list=PL_MJualihC5A3REXN1CnuIlImC_o9YqnH

その中で気にかかったのはTensorFlow Graphの説明部分。
3:10頃。

NumPyと比べて処理が効率的な点として

> so the gradient of the entire graph can be calculated using <font color=red>the chain-rule for derivatives</font>.

chain-ruleで計算部分をコンパクトにしているのだろう。

T-matrixやDDAなどの手法で適用できないだろうか。
すでにやっている可能性もあるが。
サイト内の全ページのFacebookのogデータを一括で更新するスクリプト

以前、「[複数ページのFacebookのogデータを一括で更新するスクリプト](http://qiita.com/naokazu_terada/items/fa3d94ad6605d7abecca)」という記事で、og_scrapeというスクリプトを作って公開していましたが、ベースとなるURL（サイトのトップページなど）を一つ渡すとwgetを使ってサイト内のページリストを出力してくれるスクリプトを作り、内部でこれを呼び出すことで、引数にベースURLを渡すだけで一括更新してくれるようにしてみました（自分なりにUnix的発想[^1]にもとづいたつもり）。

[og_scrape](https://github.com/naokazuterada/dotfiles/blob/master/functions/og_scrape)
サイト内の全ページのFacebookのogデータを一括で更新するスクリプト

[page_list](https://github.com/naokazuterada/dotfiles/blob/master/functions/page_list)
トップページのURLからリンクを辿ってサイト内の全ページのリストを取得するスクリプト

上記の２つをダウンロードして、仮にデスクトップに保存した場合、こんな感じで使います。

はじめに実行権限を与えておいてください。

```shell-session
$ cd ~/Desktop
$ chmod +x ./og_scrape
$ chmod +x ./page_list
```

## og_scrape

ヘルプの表示。

```shell-session
$ ./og_scrape -h
Usage:
  og_scrape [-u ]
  og_scrape   ...
 
Description:
  Facebook og data bulk scraping
 
Options:
  -u ARG
  -h
 
Dependencies:
  - page_list (https://github.com/naokazuterada/dotfiles/blob/master/functions/page_list)
```

使い方。

```shell-session
$ ./og_scrape -u http://hoge.com
```

一応、以前のように引数にURLを指定して渡すこともできます。

```shell-session
$ ./og_scrape http://hoge.com http://hoge.com/about.html http://hoge.com/contact.html
```

## page_list

og_scrapeの内部で使っているpage_listも、ページ一覧を作りたい時などに便利だと思います。
dオプションでリストのデリミッター（区切り文字）も指定できます。デフォルトは改行です。

```shell-session
$ ./page_list -u http://hoge.com
http://hoge.com/
http://hoge.com/about.html
http://hoge.com/contact.html
 
$ ./page_list -u http://hoge.com -d ','
http://hoge.com/,http://hoge.com/about.html,http://hoge.com/contact.html
 
$ ./page_list -u http://hoge.com -d ' '
http://hoge.com/ http://hoge.com/about.html http://hoge.com/contact.html
```

ヘルプの表示。

```shell-session
$ ./page_list -h
Usage:
  page_list [-u <base_url>] [-d <delimitter>] [-h]
 
Description:
  Get list of page urls from base_url.
  Delimitter is optional (default is linebreak)
 
Options:
  -u ARG *
  -d ARG
  -h
 
Dependencies:
  - wget
```

いずれも動作はMacでしか確認しておらず、それ以外の動作保証はしてません。

[^1]: “一つのことを行い、またそれをうまくやるプログラムを書け。”という有名なやつです。うまくやってるのかどうかは自信ないですが…。[UNIX哲学](https://ja.wikipedia.org/wiki/UNIX%E5%93%B2%E5%AD%A6)

---

この記事は2015.3.28に[こちらのURL](http://dev.karappo.net/?p=181)で公開していた内容を移行しました。
XcodeのStoryboard上でViewのマージンを全て表示させる方法

[これ](https://off.tokyo/blog/view%e3%81%ae%e3%83%9e%e3%83%bc%e3%82%b8%e3%83%b3%e3%82%92%e5%85%a8%e3%81%a6%e8%a1%a8%e7%a4%ba%e3%81%95%e3%81%9b%e3%82%8b%e6%96%b9%e6%b3%95-xcode-storyboard/)でいけた
SublimeTextのpluginをテストする

みなさん、テスト書いてますか？
当然書いてますよね〜。

だがしかし…
まったく恥ずかしいことに、
KARAPPOにはまだテストの文化がありません orz…

弊社の場合、見た目的な部分はテストしにくかったり、業務の大半はシステム的にそれほど複雑でなかったりするのが主な理由です。作るもののプラットフォームが様々で個別にテストの方法が違うため、ノウハウが蓄積しにくいのもあります。また、テストが必要な場合でも、その習慣がないためにどうしても後回しになってしまうのですが、やらなきゃという不安感をいつも抱えています。なので、ここ２年くらい、特に長期に渡ってメンテナンスをするプロジェクトでは、テストカバレッジを上げようと地道に努力しているところです。

２年前にリリースした[juery.kerning.js](https://github.com/karappo/jquery.kerning.js)も、TravisでCIを回して、READMEにstatus badgeを表示しています（これあるだけでも意志表示の意味で安心感ありますね）。最低限の内容ですが、一度仕組みづくりをしてしまえば、範囲を広げていくのはゼロからよりも簡単にできるようになります。

（前置きが長くなりました…）

今回、記事を書こうと思ったのは、３年前に個人的に作った[MarkdownTOC](https://github.com/naokazuterada/MarkdownTOC)というSublimeText用プラグインのテストおよびCI環境を、ようやく整えることができたからです[^1]。

最初はクライアント納品用のシステムの取扱説明ページなどを、Markdownで手軽に作れるようにしたくて、その目次作りを楽にするために作りました。最近では自分の本業ではほとんど出番がなく、むしろユーザーから集まる要望などに応えるのがメインになっています。そのためメンテナンスをするときは、大抵久しぶりに触る状態なので、不用意にデグレードしてしまうのも怖かった、できるだけ早くテスト導入したかったのです。ただ、ちゃんと動くテスティングフレームワークにたどり着くのに、かなり時間がかかってしまいました。

上に例で書いたjQueryプラグインの場合は、QUnitとTravisCIという組み合わせがデファクトなので、それに乗っかっていればよかったのですが、SublimeTextの場合は何がよいのか、オフィシャルサイトにも特に言及が見当たらず。検索してたどりついたのが[sublime-plugin-tests](https://github.com/twolfson/sublime-plugin-tests)だったんですが、これが手元の環境だと動かない・・・[^2]。

暇をみつけては、何度もトライしたのですが、どうしてもうまく使えなかったので、他の選択肢を探し始めました。以前は探し方が悪かったのか、すぐに[UnitTesting](https://github.com/randy3k/UnitTesting/)というのを見つけました。READMEのIntroductionのところに他のフレームワークについての言及があって『フムフム』と思ったり、ST2,ST3両方のバージョンを、しかも[Travis](https://travis-ci.org/)と[AppVeyor](https://ci.appveyor.com/)を使ってMacとWindows両方のプラットフォームでCI回せるなんて『カッチョいい！』と思ったり、そして何よりサンプルがちゃんと動いたので（泣）、こいつに決めました。

まだ、カバーできていないところはありますが、[ざっくり一通りの機能のテストを書いて](https://github.com/naokazuterada/MarkdownTOC/tree/master/tests)CI回して、ST2でエラーが起こってるのに気づいたりしたので、改めてテスト書いてよかったと思いました。今後もカバレッジ上げていきたいと思います！Sublime Plugin作ってる人の記事とか日本語であまり見かけないので、またはまる人がいるかもなと思って、（あと社内のテスト文化活性化のために）長文のエントリーしました。

---

あと最近、機械学習の勉強を始めたいなと思って、Pythonの勉強をはじめました。[Python Tutorialの日本語訳](http://docs.python.jp/3/tutorial/index.html)を順にやってます。あとは[Udemyのこのコース](https://www.udemy.com/python-jp/learn/v4/content)。きっかけは、完全に[Rebuild #132](http://rebuild.fm/132/)です。ものになるのは来年以降になりそうですが、こちらも地道に頑張ります。



[^1]: このプラグイン、いつの間にか[10Kダウンロードまであと少し](https://packagecontrol.io/packages/MarkdownTOC)という感じにジワジワなってます。論文書くのにMarkdown使ってる人が多いらしく、学生さんや研究者っぽい人たちが使ってくれているようです。ただ、こいつのclone？と思われる[Atom用の同名のプラグイン](https://atom.io/packages/markdown-toc)がもっとダウンロードされているのが悔しいです。いや、Atom重くて使いたくないし、普段あまり触れないPythonの勉強にもなるからいんですけど…
[^2]: サンプルのテストのままでも、実行するとSublimeが立ち上がってそこで止まってしまう症状でエラー出力もなく謎

---

この記事は2015.3.27に[こちらのURL](http://dev.karappo.net/?p=147)で公開していた内容を移行しました。
.htpasswdファイルをCLIで簡単作成

BASIC認証をかける時に必要な「.htpasswd」ファイル。コマンドラインから簡単に作れることに今まで気づいてませんでした。（毎回、[.htaccessEditor](http://www.htaccesseditor.com/)にアクセスして作ってました…）

```	
htpasswd -cbm [filename] [username] [password]
```

で簡単につくれました。オプションの意味は下記の通り。

c: ファイル出力
b: ユーザー名とパスワードを引数にとる（対話形式にしない）
m: パスワードをMD5で暗号化して出力（デフォルトのままだと8文字以上が切り落とされるので注意）

以上！

・・・なんですが、オプションの意味を毎回忘れそうなのと、ファイル名もほぼ「.htpasswd」しか使わなそうなので、alias設定をしてもっと簡単にしました。

シェルの設定ファイル（Bashを使ってる人は「~/.bash_profile」、Zshの人は「~/.zshrc」）に下記を追加しておきます。

```	
alias htpasswd='htpasswd -cbm .htpasswd'
```

すると、下記のようにするだけでカレントディレクトリに.htpasswdが作成できます。

```	
htpasswd [username] [password]
```

今度こそ、以上です。

---

TODO: aliasを作ると、オプションやファイル名を変えたい場合に困ったことになるので、本当はもっと良い方法がありそうな気がする。コマンド毎のデフォルト設定を上書きするようなしくみ？CLI詳しい人に教えてほしいです。

---

この記事は2016.1.27に[こちらのURL](http://dev.karappo.net/?p=137)で公開していた内容を移行しました。
AndroidでFCMを実装してみた結果

2016/10/12時点の記事です。
# 結論
- GCMよりは簡単そう。
- アイコン設定がいまいち。
- データの受け渡しは、FCMのjsonには含めない方がいいかも。

# 導入について
導入については、色んなところで説明されているし、公式のサンプルが優秀なので、割愛します。
[公式ガイド](https://firebase.google.com/docs/cloud-messaging/android/client)を参照してください。

### つまづいたとことか、注意点とか
- app直下に、FCM管理画面で取得したgoogle-service.jsonを設置しとかないと、
`compile 'com.google.firebase:firebase-messaging:9.6.1'`を設定した段階でbuildが通らなくなる。
- なんでかbuildが通らない（エラー忘れちゃった）

app/build.gradleにいかを記述することで解決するかも。

```
android {
    .........
    packagingOptions {
        exclude 'META-INF/NOTICE'
        exclude 'META-INF/LICENSE'
    }
}
```
これでダメなら、AndroidStudioの再起動で通るようになるかも。

# イラついたところ
アイコンの設定です。
アプリがforegroundの時は、問題なく行えます。
FirebaseMessagingServiceをextendsしたクラスのonMessageReceivedが起動して、そこで通知を作成しています。

~~しかし、backgroundにいる場合、onMessageReceivedが動きません。
そもそも、このサービス自体呼び出されないっぽいです。~~
2017/03/01 どうやら呼び出されるようになったっぽい

何か方法があるのかと思ったら、公式の~~バグ~~仕様のようです。
そうすると、勝手に通知も作られるため、アイコンはデフォルト設定になってしまいます。
よくある角丸のアイコンにしてると、グレーの丸の中に角丸の四角で白抜きされた、よく分からないアイコンになります・・・・。

こんな感じ
<img width="55" alt="スクリーンショット 2016-10-12 11.35.52.png" src="https://qiita-image-store.s3.amazonaws.com/0/105843/fb8c5143-ae3a-e84b-225b-be93b044abaf.png">

ダメでしょ・・・。

# badgeについて
Push通知を飛ばすときって、メッセージがあったり、お知らせがあったりなので、badgeも更新したいですよね。
FCMのpushに送るjsonのフォーマットに、dataってのがあります。
何かデータを受け取りたい場合、notificationではなく、dataに入れるべきです。
dataは、ActivityのgetIntent().get("hoge")で受け取れますが、notificationは、OnMessageReceivedまでしか引き継がれないためです。
しかし、「これbadgeの更新に使えるじゃん！」って思ってたのですが、これは罠でした。

~~foregroundの時は、問題ないです。~~
~~受け取ったbadgeも更新できてますし、アプリの二重起動も起こらないようにできます（わざと起動させることもできます）。~~
~~しかし、backgroundの時が問題です。~~

~~状況としては以下のことが考えられます。~~

- ~~アプリが起動していない。~~
    - ~~通知から起動すれば問題無し > ◯~~
    - ~~通知以外から起動すると、データが受け取れない > ×~~

- ~~アプリは起動しているが、backgroundにいる~~
    - ~~通知から起動すれば問題無し > ◯~~
    - ~~起動中のアプリ一覧から動かすとデータが受け取れていない > ×~~

- ~~アプリは起動しているし、foregroundだけど、画面がスリープになっている~~
    - ~~background扱いになる > まぁ問題無し~~
    - ~~通知から起動すると、アプリが二重起動される > ×~~
    - ~~スリープから解除してもデータは受け取れていない > ×~~

~~まぁ、データの受け渡しに関しては、あまり使わない方が良さそうです。
~~これならいっそ、データの受け渡しはできない仕様にしてほしかった・・・。~~
2017/03/01 どうやら呼び出されるようになったっぽい

# まとめ
~~とりあえず現状は、通知だけを行うものとして考えて、合わせて送りたいデータがある場合は、別の方法を考えた方が良さそうです。~~
~~起動時とか復帰の時（onResume）とかでAPIで受け取るようにするとか。~~

導入については、ちょっとだけ躓いたものの、基本的にはそれほど苦労せず導入できました。
複数ページのFacebookのogデータを一括で更新するスクリプト

※ この記事には続編があります。
[サイト内の全ページのFacebookのogデータを一括で更新するスクリプト](http://qiita.com/naokazu_terada/items/efdb75b9aff10c2016a5)

---

今までは、[Debugger](https://developers.facebook.com/tools/debug/)からいちいちURLを入力して”Fetch new scrape information”してましたが、ページ数が10個を超えるともはややりたくありません。

探してみると、コマンドラインからもキャッシュクリア出来るみたいです。

[FacebookのOGPキャッシュを手動・自動でクリアする方法](http://blog.ko31.com/201411/facebook-ogp-cache/#i-3)

ちょっとアレンジして、オプションにURLを一気に渡すと、随時実行してくれるスクリプトを書いてみました。一回作っておくと、次回から楽できそうです。良かったら使ってみてください。

```og_scrape.sh
#!/bin/bash
# --------------------------------------
# Goal:
#   - bulk scraping facebook og data
# Usage:
#   ./og_scrape.sh {url} {url} {url} ...
# --------------------------------------
 
argv=("$@")
for i in `seq 1 $#`
do
  curl -d scrape=true -d id=${argv[$i-1]} https://graph.facebook.com/
done
```

上のコードをog_scrape.shという名前で保存したとすると、こんな感じで実行できます。実行すると、jsonがどさーっと出てきます。

```
# ファイルの場所まで移動
cd ~/Desktop
# 実行権限付与
chmod +x ./og_scrape.sh
# 実行
./og_scrape.sh http://karappo.net/ http://karappo.net/works http://karappo.net/profile http://karappo.net/news http://karappo.net/access http://karappo.net/contact
```

~~wgetか何かで全ページのURL取ってこれたら、ドメインだけ指定して実行できて、もっと便利ですね。いつか、また困ったら作ります。。。~~

特に困ってはいなかったのですが、いつか役立つかと思い、日曜プログラミングで続編書きました。
[サイト内の全ページのFacebookのogデータを一括で更新するスクリプト](http://qiita.com/naokazu_terada/items/efdb75b9aff10c2016a5)

---

この記事は2015.5.13に[こちらのURL](http://dev.karappo.net/?p=103)で公開していた内容を移行しました。
【MySQL Workbench】主キーのないテーブルをUPDATE/DELETEする方法

いつも忘れるのでメモ。

主キーがないテーブルはデフォルトでは、UPDATE/DELETEできないようになっている。
以下のコマンドを実行することで、UPDATE/DELETEできるようになる。

```
SET SQL_SAFE_UPDATES = 0;
```

※DB接続するたびに実行が必要。

追記：
Edit→Preference→SQLEditor→Other→"safe update" 
のチェックをはずすと毎回コマンド実行する必要はなくなるが、
ちょっと怖いのでやらない。
RailsでURL末尾のスラッシュ(trailing_slash)を個別に設定

Railsのルーティングで、末尾にスラッシュを付けたい時の話です（Rails4.x系はデフォルトではつかない）。

全部につけていい場合は、下記の様にしておしまいです。

```application.rb
config.action_controller.default_url_options = { :trailing_slash => true }
```

全部ではなく、パスによって付けたり付けなかったりしたい場合は下記のようにします。

```routes.rb
get '/item'  => 'item#index',   trailing_slash: true # スラッシュ付き
get '/item/hoge'  => 'item#hoge'  # スラッシュなし
```

これで、`/item`は`link_to`などで出力されるリンクに`/item/`のようにスラッシュが付きます。
`/item/hoge`の方はスラッシュが付きません。

最後に、ダイレクトに`/item`にリクエストがあった時に`/item/`へリダイレクトする処理もやっておきたいです（今のままだと`/item`もそのまま普通に表示されてしまいます）。Rack層でやるのが良いような記事も見かけましたが、できればRails内で処理したい…。

ちょっと見通しが悪くなるのですが、コントローラー内に書いてあげると実現できました。

複数コントローラーで同じことをしたいこともあると思うので、まずは下記。

```application_controller.rb
# trailing_slashがついてない場合、slash付きのパスにリダイレクトする
def force_trailing_slash
  redirect_to "#{request.original_url}/" unless request.original_url.match(/\/$/)
end
```

そして、夫々のコントローラーのリダイレクトしたいアクションにこのフィルタをかまします。

```item_controller.rb
before_filter :force_trailing_slash, only: 'index'
```

これで、`/item`が`/item/`にリダイレクトされるようになります。

---

この記事は2015.4.10に[こちらのURL](http://dev.karappo.net/?p=67)で公開していた内容を移行しました。
【テクニカルトピック】10月12日号

■レンタルサーバ・VPS・クラウドの違いについて
http://hikaku-server.com/rentalserver/entry481.html
現在はレンタルサーバ・VPS・クラウドの違いを知っている人は少ないと思います。みなさんはそれ全部をレンタルサーバーだと理解しているかと思います。そのため、この記事を読むと、それらの違いがわかるようになり、お客さんの課題に会ったサーバを提供することができるようになるのでしょう。

■Heek is a chatbot that can build you a website
https://techcrunch.com/2016/10/03/heek-is-a-chatbot-that-can-build-you-a-website/
chatboxとチャットするだけでウェブサイトが作れるようになりました。
今後このようなサービスが普及したら、ウェブ制作会社へのニーズが薄くなってしまいます。その時が来たら、ラソナは別のよりクリエティーブ事業を考えるべきです。

■How to Encrypt your facebook messages
https://techcrunch.com/gallery/how-to-encrypt-facebook-messenger/
現在は暗号化されたメッセージをfacebook messengerで送受信することができるようになりました。また、送ったものを一定期間後自動に削除することができます。

■IoT×コーヒーで見守りも? 日本一売れてるコーヒーマシンからIoTバージョンが登場
http://iottoday.jp/articles/-/619
「ネスカフェ ゴールドブレンド バリスタ」にIoT化したモデルが登場しました。
濃さ・水量・泡立ちなどがアレンジできたり、コーヒーの抽出時間を事前にセットできたりと便利です。

■待ち時間をもっと楽しく！コピペできるCSSローディングアニメーション38個まとめ
http://photoshopvip.net/95239
CSSローディングアニメーションをまとめた記事です。
いつもとは少し変えたい時など、流用できそうです。

■「自宅でもテザリング」が常識に!? 最新調査で分かったネット利用の実態とは
　全社向けの記事です。本記事は、今年7月に公表された「平成27年通信利用動向調査の結果」を分析しまとめたものです。

<記事のサマリー>
　音声映像コンテンツ視聴が、PCが5割を下回り、スマホからの利用が上昇した。
* スマホからの利用：7.7%上昇し、69.6%
* PCからの利用：6.9%減少し、48.5%

https://www.webprofessional.jp/the-reality-of-internet-use-that-was-found-in-the-latest-survey/

■あらゆる画像フォーマットを、最適化したjpegに変換してくれる「jpeg.io」
http://design-develop.net/web/jpeg.html
　デザイナーもしくは、デイレクター向けの記事です。
画像をWeb用に最適化してくれるサービスです。出力はJPEG固定ですが、入力は、JPEG、PNG、GIF、SVG、BMP、PSD、TIFF等ほとんどの形式に対応しています。

■知っていると少し幸せになれる、Chrome検証機能の小技まとめ
http://qiita.com/ykyk1218/items/89c0bb5f82ebe43176a8?utm_source=Qiita%E3%83%8B%E3%83%A5%E3%83%BC%E3%82%B9&utm_campaign=16bbd11328-Qiita_newsletter_229_10_12_2016&utm_medium=email&utm_term=0_e44feaa081-16bbd11328-32919589
5. hover状態を確認するなどもこのように確認できます。便利ですね。
また、CSSの値をchrome上で変更をすると、その変更履歴もみれたりします。
【テクニカルトピック】10月4日号

■IoT機器を踏み台にした史上最大規模のDDoS攻撃が続々発生
http://itpro.nikkeibp.co.jp/atcl/idg/14/481542/092800277/
IoTデバイスをハッキングして空前の規模で分散型サービス拒否（DDoS）攻撃を仕掛ける事例が相次いで発生しているという記事です。
IoTはこれから普及していくと思いますが、セキュリティ対策をきちんと行う必要があります。

■HTMLタグで本格VRコンテンツが作れる！
https://ics.media/entry/13401
Webのテクノロジーだけで、かつプログラムも使わずVRコンテンツの作成に挑戦する方法を紹介した記事です。
JavaScriptライブラリを使用して簡単なVRコンテンツを作ることができます。

■Google 純正AIが無料で診断＆アドバイスしてくれるAnalytics Appの新タブ『Assistant』
http://web-tan.forum.impressrd.jp/e/2016/09/28/23909
Google Analyticsの分析にAIサポート機能が追加されました。現在、英語表記に、変更すると利用可能になるみたいです、

■XSS（クロスサイトスクリプティング）対策に便利なFireFoxアドオンXSS Me
http://ameblo.jp/itboy/entry-10292215691.html
FireFox限定のXSSチェックアドオンです。
数十パターンのXSSチェックを自動で行いサマリーとして出力してくれます。
これを使うとテストにかける時間が大幅に削減できるのではないでしょうか？

■UIデザインがさらに捗る！Prottのワイヤーフレーム機能を使ってみました
https://liginc.co.jp/web/tool/app/163940
今までラソナ社員はワイヤフレームを作成する際、pptをよく利用しているようです。
しかし、prottを利用すれば、ワイヤフレームを簡単につくれます。
なぜなら、ウェブやアプリのウェブキットがあって、ドラグアンドヅロップだけでワイヤフレームが作成できる。
しかも、本当のアプリやウェブが起動している時のように使える。
Prottを利用するとプロトタイプ作成が非常に早くできます。

■Google検索のiOSアプリが匿名モードをサポート、おまけに閲覧再開の指紋認証までも
http://jp.techcrunch.com/2016/09/29/20160928googles-search-app-now-sports-an-incognito-mode/
今までスマホに匿名モードがあるということについて知っている人は少ないと思います。
この記事を読んで、初めて知りました。

■スマホで撮った写真をフリマ感覚で売れる「スナップマート」
http://jp.techcrunch.com/2016/06/02/snapmart/
スマホアプリでカメラロールから写真を選んで、タグやコメント、位置情報を指定するだけで、1枚100円で販売できる。
あなたのスマホに宝の山があるかもしれません。
【テクニカルトピック】9月28日号

■10分間で分かった気になれるXamarin概要
http://www.buildinsider.net/mobile/xamarin/01
モバイルアプリ開発に興味がある人向けの記事です。
Xamarinとは、iOS, Android, UWD(デスクトップアプリ)アプリを作成できるクロスプラットフォームな開発環境です。
去年にMSが買収したことで、無料で利用することができるようになりました。今まであればiOSはXcode（Swift/Obj-C）、Androidならば、Android Studio（JAVA）という選択肢でしたが、Xamarinは共通のソースコードでiOS版, Android版をビルドできるようになり、学習コストの削減になります

■プログレッシブウェブアプリ詳解 ─ 過去・現在・未来
https://html5experts.jp/agektmr/20527/
「プログレッシブウェブアプリ」とは、ウェブページとして使い始めたサービスが、ホーム画面に追加し、オフラインで動作し、プッシュ通知を送り始めるといった流れの中で、「徐々にアプリへと変化していく」様を指しています。
これは、Service Workerと呼ばれる中核技術を利用することで、ウェブページなのにオフライン閲覧、プッシュ通知、自動ログイン機能の実装が可能になります。

記事によるとプログレッシブウェブアプリGoogleから始まったムーブメントですが、現在ではMicrosoft、Mozilla、Opera、Samsungもカンファレンスに登壇するなど、ウェブ全体の流れだと指摘しています。

■「VRはゲーム業界“だけ”のものではない」開発者が語る課題と未来 (1/2)
http://www.itmedia.co.jp/business/articles/1609/21/news042.html
この記事はVRの現状、未来と課題を紹介します。
この記事を読んでいただき、VRの現状と未来が理解できます。

■UXデザインに余白が重要な4つの理由
http://blog.btrax.com/jp/2016/09/20/white-space-for-ux/
UXについての知識あまりない人は一般的に余白をできる限り少なくします。
この記事を読むと、余白が重要であることがわかりました。
今後UI/UXデザインの際、余白を入れることを意識します。

■UIデザインがさらに捗る！Prottのワイヤーフレーム機能を使ってみました
https://liginc.co.jp/web/tool/app/163940
今までラソナ社員はワイヤフレームを作成する際、pptをよく利用しているようです。
しかし、prottを利用すれば、ワイヤフレームを簡単につくれます。
なぜなら、ウェブやアプリのウェブキットがあって、ドラグアンドヅロップだけでワイヤフレームが作成できる。
しかも、本当のアプリやウェブが起動している時のように使える。
Prottを利用するとプロトタイプ作成が非常に早くできます。

■SEO：自分の未評価サイトを安全だと評価させる方法！
https://erikaaa.com/norton-hyouka/
ノートンのNorton セーフウェブという機能は、Webサイトにアクセスする前にそのサイトが安全かを一目で分りやすく教えてくれるものです。
メタタグに入れ評価されればNortonを入れているユーザに早く表示されるそうです。
表示が早いサイトでそのタグを見かけ、調べた際知りました。

■ハマり過ぎ注意！ブラウザでさくっと遊べるキャンペーンサイトまとめ
https://liginc.co.jp/293739
ブラウザ上で遊べるキャンペーンサイトです。
どれもよく作りこんでいて楽しく参考になります。

■現存しない城郭をVRで再現、凸版印刷が「ストリートミュージアムアプリ」公開
http://internet.watch.impress.co.jp/docs/news/1021252.html
VRとGPSを組み合わせた旅行者向け観光アプリ「ストリートミュージアムアプリ」の提供を開始したという記事です。
VRとGPSはとても相性がいいと思うので、これからもこういったサービスが増えそうです。

■DeepLearningで上司を認識して画面を隠す
http://qiita.com/Hironsan/items/8ad9b11bcc0c618ec5e2?utm_source=Qiita%E3%83%8B%E3%83%A5%E3%83%BC%E3%82%B9&utm_campaign=feca38a2b9-Qiita_newsletter_225_09_21_2016&utm_medium=email&utm_term=0_e44feaa081-feca38a2b9-32919521
ボスの顔を機械学習し、カメラを用いて近づいてきたことを認識して画面を切り替えるシステムを作ったという記事です。
結果的に認識精度はいまいちとのことですが、例えば指名手配犯の顔を機械学習させて防犯カメラに移ったら通報するといったようなことも将来できそうです。
【テクニカルトピック】9月21日号


■Facebookのニュースフィードは、どのように選ばれているのか
http://jp.techcrunch.com/2016/09/09/20160906ultimate-guide-to-the-news-feed/
この記事は、Facebookがあなたのニュースフィード（タイムライン）に表示するものをどのように選択しているかを説明し、どうすればあなたのコンテンツがより多くの人々によって見てもらえるようになるかに関しての究極のガイドである。

■iOS 10アップデートで一部のiPhone/iPadが文鎮化【解決済み】
http://jp.techcrunch.com/2016/09/14/20160913updating-to-ios-10-is-bricking-some-iphones-and-ipads/
iOS10に更新の際、ソフトウェアエラーが発生したが、Appleにより解決されたそうです。
そのため、iOS10に更新した方は心配なく、更新してください。

■乾電池で動く家電製品をIoT化、「MaBeee」開発のノバルスが1.2億円を調達
http://jp.techcrunch.com/2016/09/08/smart-battery-mabeee-novars-raises-120m-yen/
「MaBeee（マビー）」という、乾電池で動く電化製品にセットするだけで家電製品をIoT化できる製品の説明ページです。
既存の家電製品をIoT化できるというのはかなり大きいと思います。

■Google Mapsが地図の分析/視覚化スタートアップUrban Enginesを買収、‘人の動き’という要素を都市の地図に加える
http://jp.techcrunch.com/2016/09/17/20160916urban-engines-2/
Google Mapで地図まわりの計算処理の高速化、地図への拡張現実(AR)の導入などができるようになるとのこと。
渋滞状況が可視化できると便利です。

■macOS Sierraへアップグレードする前の注意点まとめ。
http://applech2.com/archives/macos-10-12-sierra-upgrade-check.html#
CS6シリーズがSierraに対応していないようですのでアップグレードする前によく確認しましょう。