OmniAICreator/Qiita-1.07M huggingface dataset:
Git を使って WordPress をサーバーにデプロイ


よくあるデプロイの方法だといろいろセットアップが多くてハードルが高いので（一度セットアップすれば簡単ですが）、ベアリポジトリをサーバー内に立ててそこに `git push` したらフックを蹴っ飛ばして自動的にデプロイする方法はどうかなと思って試した。

この方法ならインフラを構築するためのプロビジョナーにあらかじめ仕込んでおいてすぐに導入できる気がする。

## ベアリポジトリの作成

ウェブサーバーに以下のコマンドでベアリポジトリをつくる。

```bash
$ git init --bare --share ~/example.com.git
```

以上で空のベアリポジトリが出来上がる。

次に同じサーバー内の WordPress をこのベアリポジトリにコミットしてプッシュ。

```bash
$ git init
$ git remote add origin ~/example.com.git
$ git add .
$ git commit -m "first commit"
$ git push origin master
```

この時に `.gitignore` が適切じゃないと WordPress 側でファイルをアップロードした時とかにコンフリクト祭りになるので以下の URL の `.gitignore` をコミットしておく。

https://github.com/github/gitignore/blob/master/WordPress.gitignore

## フックの作成

Git でベアリポジトリに `push` した後で、ドキュメントルートから自動的に pull できるようにする必要がある。

上のベアリポジトリの例では `~/example.com.git/hooks/post-update` に以下のように記述する。

```
#!/usr/bin/env bash

cd /var/www/html
git --git-dir=.git pull origin master
```

このスクリプトにはブランチの名前等が引数で飛んで来るので、それを使って特定のブランチの時だけデプロイとかもできそう。

あとこの部分で CI 的なものをぶんまわすといいかも。

## 開発環境から pull する

たとえば別の開発環境から `pull` する時にそのディレクトリにすでに WordPress がある時は以下のコマンドで。

ローカル環境が VCCW の場合は以下の通り。

```bash
$ cd /var/www/html
$ git init
$ git remote add production example.com:~/example.com.git
$ git fetch production
$ git reset --hard FETCH_HEAD
```

あとは、以下のような感じでプラグインがデプロイされるかを確認。

```
$ wp plugin install jetpack
$ git add .
$ git commit -m "add jetpack"
$ git push production master
```

あえて `remote` の名前を `origin` ではなく、`production` にしているのは、`origin` にもっと信頼性が高いサーバー（たとえばGitHubなど）を設定して、そっちにプッシュすることを想定。

このあたりは好みで。
ユーザー・全社を巻き込んだ開発プロセス作り

アカウンティング・サース・ジャパンは、クラウド税務・会計・給与システム「A-SaaS（エーサース）」というプロダクトを開発している会社。

いわゆるB to Bサービス。

会計事務所や、中小企業で使われることを想定したプロダクト開発を行っている。

いま、プロダクトの品質を飛躍的に改善させるために、ユーザー・全社を巻き込んだ開発プロセスづくりに取り組んでいるので、どんなことをしているか書く。

目的は、ユーザーとの関係強化、社内の協力体制構築、そして良いプロダクトを作ること。

# ユーザーとのコミュニケーション

B to Bサービスをやっているので、ユーザーとのコミュニケーションは主に営業とサポートが担当している。

ユーザーからのご意見・ご要望はVoC（Voice of Customer）と呼ばれ、すべてRedmineにチケット化されて、社内に共有されている。

これは会社設立当初からやっていて、すでに何万件ものユーザーの声が記録されている、大切な資産。

だが、それだけではなく、開発部門の人もガンガンユーザーに会って話を聞ける環境を作ろうとしている。

月次でユーザーを招いてグループインタビューをする。

こちらから押しかけて話を聞く。

ここまでは、以前からやっていた。

それをさらに進化させ、「A-SaaSサポータークラブ」というユーザーコミュニティを作った。

30人程度のユーザーに参加してもらい、いつでも話を聞ける環境を作ろうとしている。

チケットを通じたバーチャルなコミュニケーションだけでは分からない、深い話が聞けるメリットがある。

B to Cだと、ユーザーコミュニティを作る動きは一般的だと思うが、B to Bだと珍しいかもしれない。

# 社内のコミュニケーション

全社員参加型のミーティング、その場限りのアドホックなミーティング、チャット上でのやり取りなど、毎日何かしら社内のコミュニケーションは発生している。

ただ、エンジニアが他部門の人とコミュニケーションする数はやや少なめで、どちらかというと部門内で話を済ませてしまっている。

ここは今後の課題。

会社負担でランチに行ける制度を作り、エンジニアと営業・サポートが一緒にランチに行くような取り組みをしている。

# コミュニケーション・ツール

全社公式のコミュニケーション・ツールはチャットワーク。

エンジニアはGitterも使っている。

ユーザーから受けた問い合わせのうち、エンジニアの対応が必要なものは、サポート部門がすぐにRedmineにチケットを切る。

優先度の高いチケットが切られると、自動的にチャットにも連携され、タイムリーに情報がシェアされるので、それを見てエンジニアが対応方針を決めている。

本題には関係ないが、最近、チャットワーク上に社員が仕込んだ謎のbotも登場してきており、疲れた時に話しかけて遊んでいる人もいる。これはこれで楽しい。

# 開発プロセス

開発部門とユーザー・全社とのコミュニケーションは、なかなか活性化しづらい。

なので、開発プロセスを見直して、開発のフェーズごとに、相互のコミュニケーションが強制的に発生するイベントを設定してみた。

不具合修正や小さな機能追加ではここまでやらないけど、大きめの開発をやるときは必ずこのプロセスを回すようにしている。

### 企画フェーズ
- ユーザーヒアリング
- サポート部門のメンバーアサイン
- 企画書レビュー
- 仕様書レビュー

### 開発フェーズ
- ユーザーヒアリング（開発環境を使って）
- サポート部門へのヒアリング
- リリース前の社内デモンストレーション

### 運用フェーズ
- 開発の種となるVoC（ご意見・ご要望）をくれたユーザーへのお礼連絡
- 新機能のプロモーションを兼ねたユーザーへの連絡
- ユーザーアンケート

開発プロセスを進めていくなかで、いろいろな変更・判断・妥協が入るので、タイムリーにユーザー・社内に情報共有して、理解を得ておくことが大事かなと。

# 最後に

理想的には、エンジニア一人ひとりがユーザーと同じ視点でプロダクトを見れる・評価できるようになるといいんだけど、そこに至るにはもっともっとユーザーとコミュニケーションして、ユーザーのことを学ばないといけないと感じている。

特にうちのように、業務システムを作っている会社では、お客様の業務に精通しておくことは必須。

マーケティング調査だけを行っていても、良いプロダクトは作れない。

もし皆さんの会社で「うちはこうしてる」みたいなのがあれば、ぜひ教えてください。
【iOS・GPU】Metalで画像をリサイズする

Metalを利用して**GPUで高速に画像をリサイズ**（拡大・縮小）する方法について書きます。

##要件

- 既に`MTLTexture`なので、いったん`UIImage`や`CGImage`にする、という野暮なことはしたくない
- `CIImage`も`imageByApplyingTransform`を利用して簡単にサイズを変換できるし、**Metalで処理するようにもできる**が、やはり MTLTexture -> CIImage -> (transform) -> CIImage -> MTLTexture というのは遠回りな気がする [^1]

[^1]: もしかしたらいい感じにひとつのパイプラインとして処理されたりして全然遠回りじゃないのかもしれません

- サイズ変更するようなシェーダを自分で書くのはめんどくさい...

→ **`MTLTexture`を直接拡大・縮小したい**　[^2]

[^2]: 画像ファイルから読み込んだデータやUIImageを`MTLTexture`オブジェクトに変換する方法は[こちらの記事](http://qiita.com/shu223/items/3301a1e64757c0bd73ef)に書いたので今回は省略します。


##Metal Performance Shadersを利用してMTLTextureをリサイズする

Metal Performance Shaders（以下MPS）フレームワークの `MPSImageLanczosScale`というクラスを利用します。

###Lanczosとは

「ランツォシュ」と読みます。

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">「ランツォシュ」って読むのか。 / Lanczos関数による画像の拡大縮小 <a href="https://t.co/uOcwM4DctI">https://t.co/uOcwM4DctI</a></p>&mdash; Shuichi Tsutsumi (@shu223) <a href="https://twitter.com/shu223/status/769798385901502464">2016年8月28日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

上のツイートにURLを貼っている記事によると、Lanczosはこのアルゴリズムを考えた人の名前で、**高品質な画像を得られる拡大縮小アルゴリズム**（関数？）とのことです。

###`MPSImageLanczosScale`を用いたリサイズ実装方法

こちらの回答を参考にしました。

http://stackoverflow.com/questions/40970644/crop-and-scale-mtltexture

```swift
let filter = MPSImageLanczosScale(device: device)
var transform = MPSScaleTransform(scaleX: scaleX, scaleY: scaleY, translateX: translateX, translateY: translateY)
let commandBuffer = commandQueue.makeCommandBuffer()
withUnsafePointer(to: &transform) { (transformPtr: UnsafePointer<MPSScaleTransform>) -> () in
    filter.scaleTransform = transformPtr
    filter.encode(commandBuffer: commandBuffer, sourceTexture: sourceTexture, destinationTexture: destTexture)
}
commandBuffer.commit()
commandBuffer.waitUntilCompleted()
```

要は、

- `MPSImageLanczosScale`を初期化して、
- その`scaleTransform`プロパティに、変換行列`MPSScaleTransform`のポインタを渡して、
- `encodeWithCommandBuffer:sourceTexture:destinationTexture`メソッドを呼んで、
- コマンドバッファをコマンドキューにプッシュしているだけ

です。

`withUnsafePointer`のあたりでパッと見ちょっと難しそうな気がしますが、`filter.scaleTransform = &transform`ってやりたいけど**Swiftがそうさせてくれない**のでこういうことになってるだけで、やりたいこととしてはすごくシンプルです。

`encode〜`のメソッドは、[前回記事](http://qiita.com/shu223/items/3301a1e64757c0bd73ef)でコマンドエンコーダを生成してシェーダで処理する入・出力テクスチャをセットしてendEncodingする一連の流れに相当するのかなと思います。

```swift
let encoder = commandBuffer.makeComputeCommandEncoder()
encoder.setComputePipelineState(pipeline)
encoder.setTexture(texture, at: 0)
encoder.setTexture(drawable.texture, at: 1)
encoder.dispatchThreadgroups(threadgroupsPerGrid, threadsPerThreadgroup: threadsPerThreadgroup)
encoder.endEncoding()
```

こうやってみると、**MPSフレームワークがシェーダまわりの処理を簡易化**してくれるものであることが実感できますね。もちろん、"Performance"とフレームワーク名についているぐらいなので、中身は**中の人がカリカリに最適化**したものと期待できます。



##MPS利用のデメリット?

使いやすくて速いなんてMPSが最高っぽいですが、MPSはMetalとはまた別のフレームワークでして、**MetalをサポートしていてもMPSをサポートしていないデバイス**というのもあります。（例： 5s）

詳しくは下記記事のMetal Feature Setsの項をご参照ください。

- [歴代iOSデバイスのGPUまとめ - Qiita](http://qiita.com/shu223/items/8027201e50c68288f0be)
Xcode8.xのメッセージウィンドウに表示されるシステムメッセージを非表示にする【Xcode8.x】

こういうやつ↓

```swift
2016-09-07 15:28:43.759998 App[7932:128675] subsystem: com.apple.UIKit,     
category: HIDEventFiltered, enable_level: 0, persist_level: 0, 
default_ttl:     0, info_ttl: 0, debug_ttl: 0, generate_symptoms: 0,
enable_oversize: 1,   privacy_setting: 2, enable_private_data: 0
2016-09-07 15:28:43.762544 App[7932:128675] subsystem: com.apple.UIKit,     
category: HIDEventIncoming, enable_level: 0, persist_level: 0, 
default_ttl: 0, info_ttl: 0, debug_ttl: 0, generate_symptoms: 0,    
enable_oversize: 1, privacy_setting: 2, enable_private_data: 0
2016-09-07 15:28:43.790817 App[7932:128648] subsystem:   
com.apple.BaseBoard, category: MachPort, enable_level: 1,   
persist_level: 0, default_ttl: 0, info_ttl: 0, debug_ttl: 0, 
generate_symptoms: 0, enable_oversize: 0, privacy_setting: 0,  
enable_private_data: 0
2016-09-07 15:28:43.827962 App[7932:128496] subsystem: com.apple.UIKit,   
category: StatusBar, enable_level: 0, persist_level: 0, default_ttl: 0, 
info_ttl: 0, debug_ttl: 0, generate_symptoms: 0, enable_oversize: 1, 
privacy_setting: 2, enable_private_data: 0
2016-09-07 15:28:43.998975 App[7932:128496] subsystem: 
com.apple.BackBoardServices.fence, category: App, enable_level: 1, 
persist_level: 0, default_ttl: 0, info_ttl: 0, debug_ttl: 0, 
generate_symptoms: 0, enable_oversize: 0, privacy_setting: 0,    
enable_private_data: 0
```

メニュー：Product → Schema → Edit Schemaと辿り、`Argument`を選択。`Enviroment Variables`の`+`をクリックして`OS_ACTIVITY_MODE`を追加してdisableを設定する。
<img width="894" alt="Common_swift.png" src="https://qiita-image-store.s3.amazonaws.com/0/151314/dacd313e-7532-cc9d-88a6-a2578830bd11.png">

これでメッセージが出力されなくなります。
[Linux][mount] LinuxでQNXのファイルシステムをマウントする

デフォルトでは対応しているファイルシステムの一覧にQNXがなかったので、マウントする方法のメモ

`QNX6` のファイルシステムは `Linux kernel 3.4` 以降にて対応しています。（ただし読み取り専用のみ可）
[Linux Kernel Driver DataBase: CONFIG_QNX6FS_FS: QNX6 file system support (read only)](http://cateee.net/lkddb/web-lkddb/QNX6FS_FS.html)

※検証は Ubuntu 16.04 (kernel 4.4.0-45) にて行っています。

# 有効な対応しているファイルシステムの確認

Linuxで有効になっている対応しているファイルシステムのタイプは以下で確認できます。

```console:有効なファイルシステムのタイプ一覧を取得
$ cat /proc/filesystems
```
[[Linux][mount] 対応しているファイルシステムの一覧を表示する - Qiita](http://qiita.com/koara-local/items/25c6eac7b96d3cc5d550)

# QNXのファイルシステムをマウントする

QNXのファイルシステムをマウントするには、以下のタイプ指定(`-t`オプション)で可能だが、有効になっていない場合があります。(KConfigの設定による？）

```console:qnx6のファイルシステムをマウントする
$ mount -tqnx6 <マウント元> <マウント先>
```

その場合は、`modprobe` で `qnx6` のドライバを読み込めば良いです。(`qnx4` も同様に存在する)

```console:qnx6の有効化
$ sudo modprobe qnx6
```

これで `qnx6` のファイルシステムが有効になっていることが確認できると思います。

```console:qnx6が有効になっていることを確認
$ cat /proc/filesystems 
nodev	sysfs
nodev	rootfs
nodev	ramfs
nodev	bdev
nodev	proc
nodev	cpuset
nodev	cgroup
nodev	tmpfs
nodev	devtmpfs
nodev	debugfs
nodev	tracefs
nodev	securityfs
nodev	sockfs
nodev	bpf
nodev	pipefs
nodev	devpts
	ext3
	ext2
	ext4
	squashfs
nodev	hugetlbfs
	vfat
nodev	ecryptfs
	fuseblk
nodev	fuse
nodev	fusectl
nodev	pstore
nodev	mqueue
nodev	autofs
nodev	vboxsf
	qnx6
```

# 参考
[Linux Kernel Driver DataBase: CONFIG_QNX6FS_FS: QNX6 file system support (read only)](http://cateee.net/lkddb/web-lkddb/QNX6FS_FS.html)
[Can you mount QNX from Linux?](http://www.linuxquestions.org/questions/linux-newbie-8/can-you-mount-qnx-from-linux-94209/)
【OpenCV】imreadでちゃんと読み込まれたか確認したいとき

TensorFlowで画像をnpy形式に変換する際にOpenCVを使ってましたが、エラーで完全にはまったのでメモ。

愚かなことに、ファイル入出力関連の関数は失敗したときの例外処理をきちんとしないと完全に詰むことを忘れてました。imread関数もその一種です。

以下はtensorflow用のデータセットを作る関数です。
imread関数を読んだ後の処理は、None判定をかませて行っています。
こうしないとNoneでコケるので必ずこれを行う必要があります。
（よくよく考えたら当たり前なんだよなあ...）

```python
import os, sys
import numpy as np
import tensorflow as tf
import cv2

# config
flags = tf.app.flags
FLAGS = flags.FLAGS
flags.DEFINE_string('imgdir', '/home/hoge/fuga/piyo', 'Image dataset path')
flags.DEFINE_string('imgclasses', 4, 'The num of image dataset classes')
IMAGE_SIZE = 84 # the size of image
TRAIN_IMG_DIRS = os.listdir(FLAGS.imgdir)

def main():
  train_image, train_label = cvGetImageAndLabel()
  #学習とかのコードは面倒なので略

def cvGetImageAndLabel():
  images = []
  labels = []
  for i, d in enumerate(TRAIN_IMG_DIRS):
    files = os.listdir(FLAGS.imgdir + '/' + d)
    for f in files:
      img = cv2.imread(FLAGS.imgdir + '/' + d + '/' + f)
      # この部分でNone判定
      if not img is None:
        img = cv2.resize(img, (IMAGE_SIZE, IMAGE_SIZE), interpolation = cv2.INTER_AREA)
        img = img.flatten().astype(np.float32)/255.0
        images.append(img)
        tmp = np.zeros(FLAGS.imgclasses)
        tmp[i] = 1
        labels.append(tmp)

  return np.asarray(images, dtype=np.float32), np.asarray(labels, dtype=np.float32)

if __name__ == '__main__':
  main()

```

コードの汚さはご愛敬です（？）

# 参考リンク
http://stackoverflow.com/questions/23628325/cv2-imread-checking-if-image-is-being-read
bitcoin環境構築メモ

[railsでbitcoinを用いた送金アプリの作成](http://qiita.com/kinzi0828/items/3bbe46cf754b5bfa3e6b)
の環境構築

環境:
ubuntu16.04LTS
ruby2.3.1
rails4.2.7.1
openassets-ruby0.5.9
bitcoin0.13.01

#Ruby,Railsインストール
http://qiita.com/kinzi0828/items/06fa7bb0a6d97cc1951a

#Bitcoindインストール
http://techmedia-think.hatenablog.com/entry/2015/04/02/181014
開発用なのでbitcoin.confの中は

```
rpcuser=sample
rpcpassword=samplepass
txindex=1
server=1
daemon=1
testnet=3
rpcport=18332

```
と適当なユーザ名PWを書いて
テストネット3にして、ぽーとも18332に変える


#OpenAssets-rubyのインストール
http://qiita.com/osada/items/50fc76959e6730603417

`cd`
`git clone https://github.com/haw-itn/openassets-ruby.git`
`cd openassets-ruby`
`gem install bundler`
(gemがなかったらこれを使う、sudo apt install bundleはダメ)
`bundle install`

#Railsで動作確認
`rails new sample`
`rails g scaffold Sample name:string`
`rails db:migrate`

##rails
さっきbitcoin.confで書いた名前とかをapp/controllerの中のsampleassets.rb(適当)に書いてbitcoin(rpcuser:sample rpcpw:samplepass rpcport18332)と同期させる

##確認
`rails s -b 0.0.0.0`（外部からみれる）
`rails server`（localhostのみ）
でサーバ起動してみる


##RailsのGemfileに追加を忘れずに
requireで見つからないよってエラー出たら
`bundle list`
`gem list`
とたたいてみると、さっき書いたbitcoinとかopenassets-rubyが、gem listにあってbundle listに入ってないのでGemfileに
`gem 'bitcoin','バージョン'`
`gem 'open assets-ruby','バージョン'`をgem listを見ながら追加し
`bundle update`
`gem update`

もう一度サーバを起動してみると正常に接続できると思う

てことでrailsにopenassets-rubyを使えるようになった！


#参考
http://techmedia-think.hatenablog.com/archive/category/Bitcoin?page=2
[Linux][mount] 対応しているファイルシステムの一覧を表示する

`mount -t<filesystem>` で指定できるファイルシステムのタイプの一覧を取得する方法メモ

# 確認方法

結論としては以下のように `/proc/filesystems` を確認すればよかった。

```bash:有効なファイルシステムのタイプ一覧を取得
$ cat /proc/filesystems
```

# 実行例

Ubuntu 16.04 (kernel 4.4.0-45) にて確認した結果は以下のようになった。

```console:ubuntu16.04で実行した例
$ cat /proc/filesystems 
nodev	sysfs
nodev	rootfs
nodev	ramfs
nodev	bdev
nodev	proc
nodev	cpuset
nodev	cgroup
nodev	tmpfs
nodev	devtmpfs
nodev	debugfs
nodev	tracefs
nodev	securityfs
nodev	sockfs
nodev	bpf
nodev	pipefs
nodev	devpts
	ext3
	ext2
	ext4
	squashfs
nodev	hugetlbfs
	vfat
nodev	ecryptfs
	fuseblk
nodev	fuse
nodev	fusectl
nodev	pstore
nodev	mqueue
nodev	autofs
nodev	vboxsf
```

KConfigの設定によって、有効になっているファイルシステムは変わる様子。
VirtualHostの謎

SITE.example.jp:80にアクセスすると、時々SITE2側のCGIが動作する（？）。

```ApacheConf
<VirtualHost 192.168.1.1:80>
    DocumentRoot /SITE/htdocs
    ServerName SITE.example.jp
</VirtualHost>
<VirtualHost 192.168.1.1:80>
    DocumentRoot /SITE2/htdocs
    ServerName SITE2.example.jp
</VirtualHost>
<VirtualHost 192.168.1.1:443>
    DocumentRoot /SITE2/htdocs
    ServerName SITE.example.jp  #←SITE2.example.jpの間違い
</VirtualHost>
```
下から2行目をSITE2に修正したら変な挙動が直った。
まだ良くわかってないので時間あったら検証。
Tensorflowで個人サービスにアップロードされた不適切なイラスト画像を検出する

# 要約
エロ・グロ・暴力などの不適切なイラスト画像を検出するための分類器をTensorflowを使って作っています。そのうち、男性器っぽいイラストだけを検出する機能を独立したwebアプリとして公開しました。

> Chinkoチェッカー
> http://chinko-checker.kenmaz.net

## 使い方
使い方を説明したいところですが、いかんせんアプリケーションの性質上、実際の画像を使った説明は困難なので、一部モザイクを掛けて説明します。

まずペンツールを使って以下のような画像を描いてみましょう。
![スクリーンショット 2016-12-13 14.41.01.png](https://qiita-image-store.s3.amazonaws.com/0/8399/8e2eff88-2e81-f2f7-9b56-28d9a1ac790c.png)
全然いやらしい絵ではないですね
もうちょっと修正してみましょう
↓
![スクリーンショット 2016-12-13 14.41.32.png](https://qiita-image-store.s3.amazonaws.com/0/8399/d4830e13-f7a2-1a00-9b52-8171bf381936.png)
ん？
↓
![スクリーンショット 2016-12-13 14.41.39.png](https://qiita-image-store.s3.amazonaws.com/0/8399/54682200-c886-dda1-5699-c25047c80d66.png)
んん！？

とか

これが
![スクリーンショット 2016-12-13 14.43.16.png](https://qiita-image-store.s3.amazonaws.com/0/8399/95e22762-6b7e-f6bc-e56e-e8dc9c8f696a.png)
↓
こうじゃ
![スクリーンショット 2016-12-13 14.42.39.png](https://qiita-image-store.s3.amazonaws.com/0/8399/95e50e63-5cb6-a17e-8508-df94b30604c4.png)

# 開発の背景

パラパラマンガを投稿できる「[AnimeMaker](https://itunes.apple.com/app/apple-store/id405622194?pt=27772&ct=qiita&mt=8)」というサービスを個人で運営していますが、最近エロや暴力的な作品をアップする人が増えてきており、それに伴い一般ユーザからの通報の件数も多くなってきました。多い日で100件を超える日もあります。

![スクリーンショット 2016-12-13 15.20.55.png](https://qiita-image-store.s3.amazonaws.com/0/8399/cfd315eb-6e6a-9fac-7a6b-69904d71b94f.png)

ユーザから通報があると私の携帯にメールが届くので、毎回ブラウザを開き画像が不適切かどうかを自分の目で判断し、NGなら非公開にする、、という作業をこれまでやってきましたが、件数が増えかなり大変な作業になってきました。また毎日毎日、お下品な画像を確認する、という作業をやっていると気分的にも滅入ってくる部分があります。

ということで、以前開発した「[TensorFlowによるももクロメンバー顔認識](http://qiita.com/kenmaz/items/4b60ea00b159b3e00100)」と同じように、投稿された画像を学習して不適切な画像を検出するアプリケーションを作ってみよう、と思い立ちました。

# 詳細

後編では、分類機を作る上で技術的に困難だった点について説明します。
またコードもアップしておく予定です。

# （2016/12/15 01:07追記）
集合知が得られたので貼っておきますね

![スクリーンショット 2016-12-15 1.04.10.png](https://qiita-image-store.s3.amazonaws.com/0/8399/36d22515-db32-addf-03be-03731e8142b3.png)

週末には後編を書きたいところ・・
【ポスグレ】スロークエリログを使わずにスロークエリを取得する方法

スロークエリログを使わずに、実行に時間がかかっているクエリの一覧を取得したい。以下のクエリで、実行に1秒以上かかっているクエリの一覧が取得できる。

```sql
SELECT pid, query 
FROM pg_stat_activity 
WHERE query != '<IDLE>'
  AND query NOT ILIKE '%pg_stat_activity%'
  AND age(query_start, clock_timestamp()) > '1 seconds'::interval; -- 1秒以上
```

上で調べたpidを使って、

```sql
SELECT pg_terminate_backend(pid);
```
でプロセスを止められる。
angularjs date input

// angular date process

````
.directive('date', function (dateFilter) {
	return {
		require:'ngModel',
		link:function (scope, elm, attrs, ctrl) {

			var dateFormat = attrs['date'] || 'yyyy-MM-dd';
		   
			ctrl.$formatters.unshift(function (modelValue) {
				return dateFilter(modelValue, dateFormat);
			});
		}
	};
});

<input type="date" date='yyyy/MM/dd' ng-model="secondDate" class="form-control" />
````
demo
http://codepen.io/giovani_araujo/pen/jPGXNo
j.u.c.Flowサンプルのシーケンス図を書いてみた

JDK9でjava.util.concurrent.Flowが導入予定となっています。
Flowは、非同期ストリーム処理の標準で、[Reactive Streams](http://www.reactive-streams.org/)で議論されています。

Observer/ObservableモデルはJDK1.0からありましたが、JDK9でFlowが導入されることにともない、以下はDeprecatedになる予定です。
  - java.util.Observer
  - java.util.Observable

[FlowのAPIドキュメント](http://download.java.net/java/jdk9/docs/api/java/util/concurrent/Flow.html)にサンプルプログラムが記載されています。
それほど複雑ではありませんが、３つのクラスを行ったり来たりするので、シーケンス図を書いてみました。


![jdk9flow.png](https://qiita-image-store.s3.amazonaws.com/0/139252/5b732d33-b425-519c-785d-14d5d249b07b.png)
SIerがMarkdownで資料を作ってみた時の備忘録

# これは何ですか？

[Markdown Advent Calendar 2016](http://qiita.com/advent-calendar/2016/markdown)の何日目かの記事です。閑古鳥が鳴いていますが…。
あと、@tenten0213 さんの[SIの現場のiOSアプリケーション開発](http://qiita.com/tenten0213/items/4099016c07ff99c93762) を読んで影響されて、Markdownで資料を作ってみたらはまったポイントとその妥協策のメモでもあります。

# やったこと
図付きの要件定義資料をMarkdownで書いてみた。

# 使ったツール
※2つとも色々カスタマイズしています。

- [Atom](https://atom.io/)
- [Sublime Text3](https://www.sublimetext.com/3)
- excel（差し込む図を書くため）
    - ~~やっぱり図は書き慣れたツールで書かないとね！~~

# 手順
1. excelで図を書く
2. 書いた図を画像形式でコピー
3. ペイント等に貼付けて、イメージファイルとして保存
4. markdownに差し込みたい図へのパスを書く
5. その他の文章を書く
6. pdfとして保存

## excelで書いた図を画像形式でコピーする手順は以下。

![imageSave.gif](https://qiita-image-store.s3.amazonaws.com/0/77910/e7dccea2-1877-4030-7f4a-1253bf6e94d6.gif)

# はまったところ
## Atomだと、イメージファイル名が記号始まりだとプレビューで出てくれない？
Sublime Text3にはブラウザを使ってプレビューできるプラグインがあり、これを使うと表示されたのでツールを乗り換えた。

## MarkdownをPDFに変換するツールとして、markdown-pdfがよく紹介されているが、別ディレクトリにファイルを置いているだけでは変換時にうまく取ってくれず、画像が表示されない。
- [markdown\-pdfで画像を挿入する \- uepon日々の備忘録](http://uepon.hatenadiary.com/entry/2016/03/25/075644) 
- Sublime Text3にある、ブラウザを使ってプレビュー出来るプラグインを使ってブラウザで開き、そのページをPDF変換した。
- てんてんさんの記事を読むと、Pandocを使うのがいいのかもしれない。
    - [MarkdownをWord形式\(docx\)に変換する \- Qiita](http://qiita.com/tenten0213/items/f67f5601cbed6ef86b3c) 


## 中途半端なところで改ページされてしまう。綺麗なところで改ページしたい。
改ページしたい位置に以下のコードを書いた。
[Markdown形式で書いた記事やレポートをPDF形式で配布する \- ジンジャー研究室](http://jinjor-labo.hatenablog.com/entry/2016/02/04/154126)

```
 <div style="page-break-before:always"></div> 
```

# まとめ
Markdownで資料作るの楽しい！✌('ω'✌ )三✌('ω')✌三( ✌'ω')✌
C++の仮想関数が抽象概念に基づくアルゴリズムの実装に役立った

## 概要
C++には**仮想関数**というポリモーフィズムの実現に極めて有用な機能があります．
理論研究として設計したアルゴリズムの有効性を計算機で実験する際，
仮想関数機能がプログラムの拡張性を高める上で役立ったので，メモを残します．
### 仮想関数のおさらい
C++には，クラスのデータメンバやメンバ関数の情報を引き継ぐ**継承機能**があります．
ここでは継承元を基底関数，継承先を派生関数と呼びます．
基底クラスのメンバ関数をvirtual宣言により**仮想関数**として定義することで，
派生クラスで同名のメンバ関数を**再定義**し，同名ながら別の動きをする関数として利用することが出来ます．

#### サンプルコード
```
#include<iostream>
#include<iomanip>

using namespace std;

class base{
protected:
	int data;
public:
	base() : data(0){};
	virtual int depend(){ // 派生クラスでの定義に動作が依存する仮想関数
				  // 基底クラスでは，何もせずdataを返すだけと定義
		return data;
	} 
};

class derivationPlus : public base{
public:
	int depend(){ // 仮想関数の再定義（dataをインクリメント）
		data++;
		return data;
	}
};

class derivationMinus : public base{
public:
	int depend(){ // 仮想関数の再定義（dataをデクリメント）
		data--;
		return data;
	}
};

class derivationNoDefine : public base{ // 仮想関数を再定義しない（基底クラスの定義をそのまま使う）
};

int main(){
	derivationPlus P;
	derivationMinus M;
	derivationNoDefine N;
	cout << "Output of derivationPlus    : " << setw(2) << P.depend() << endl;
	cout << "Output of derivationMinus   : " << setw(2) << M.depend() << endl;
	cout << "Output of derivationNoDefine: " << setw(2) << N.depend() << endl;
}
```

#### 出力結果
```
Output of derivationPlus    :  1
Output of derivationMinus   : -1
Output of derivationNoDefine:  0
```

### 仮想関数が役立った一つのケース：理論研究の計算機実験において

筆者は某大学院のOR系研究室に所属しており，修士論文の計算機実験用プログラムをC++で書こうという際に上記機能が必要となりました．
マトロイドと呼ばれる，グラフの無閉路性や線形代数の独立性などを抽象化した概念について研究しており，
多種多様なマトロイドをぶち込んでも動くような便利なオークションテーブルを設計したいと思っています．

マトロイドは前述の通り，高度な抽象概念のため具体例が様々考えられ，判定内容が多岐にわたります．

|マトロイドの種類|オブジェクトがもつ情報|独立性判定の内容|
|---|---|---|
|Uniform matroid|容量（整数値）|与えられた集合の要素数がキャパシティを超えないか|
|Graphic matroid|グラフ|与えられた枝集合が閉路（サイクル）をもつか|
|Transversal matroid|有限集合の部分集合族|与えられた要素集合から部分集合族への単射が存在するか|

マトロイドを表すオブジェクトについて，独立性判定を行う「independenceCheck」という関数を呼び出せば，その入札者のもつ個別のマトロイドについて独立性判定を行ってくれるというインタフェースを実現したいと考えました．
上記の実装法を使えば，以下のような設計が可能となります．

* 継承元クラスとしてのmatroidクラスにindependenceCheck関数を仮想関数として定義
* 個々のマトロイドはmatroidクラスを継承して定義し，個別具体的にindependenceCheck関数を定義する

こうすれば，別種のマトロイドを導入したいと思ったときも，independenceCheck関数を新たに定義するだけで済み，既存のマトロイドと綯い交ぜにしたオークションテーブルも容易に生成できます．
この場合，matroidオブジェクトそのものを生成することはなさそうなので，[純粋仮想関数](http://www.booran.com/menu/cplus/override.html)として定義するのがより適切かもしれません．
マトロイドの理論的な抽象性をC++の継承というかたちで表現することが出来ると分かり，嬉しく思いました．

### 疑問
実は上述のサンプルコードは，virtual宣言を外しても出力が変わらなかったのだけど，
その場合は基底クラスのdepend関数が呼び出されるはずで，下記の出力が正しいように思える．どうしてだろう？

```
Output of derivationPlus    :  0
Output of derivationMinus   :  0
Output of derivationNoDefine:  0
```
PostgreSQLでdate型同士の月の差を選択もしくは条件として指定する

PostgreSQLでdate型同士の差を日数で選択することは簡単だが、
月数で選択(条件指定)するのは案外手間どった為、備忘録としてメモ。

#選択する場合
```
SELECT EXTRACT(month from AGE(a_date, b_date)) 
FROM test_table;
```
全レコードについてそれぞれa_dateとb_dateの月の差が選択されます。



#条件指定する場合
```
SELECT COUNT(*) from test_table 
WHERE EXTRACT(month FROM age(a_date, b_date)) = 1
```
a_dateからb_dateを引いて1となるレコードの数が結果として返却されます。




両パターンで使用している「EXTRACT」は以下ご覧いただければと思いますが、
日付や時刻の値から特定のフィールドを抽出する関数です。
https://www.postgresql.jp/document/7.2/user/functions-datetime.html#FUNCTIONS-DATETIME-EXTRACT


EXTRACT(month ～)と指定することで月のみを抽出することができます。

age関数は第1引数から第2引数を減算し、「年」「月」「日」を返却する関数です。
ここではEXTRACT関数で「month」つまり「月」を指定しています。
null 安全が叫ばれるのを横目に nil の賢さを競う

# はじめに
近頃、null 安全とやらが流行しているようです。なんでも、null って危ないものだと思われているようです。そんな null について以前 [nilは悪か？](http://tomostavern.blogspot.jp/2011/10/nil.html)なるポエムを書きましたが、多勢に無勢、もう心が折れてしまいそうです。
こうなったらもう Smalltalk の世界にヒキコモるしかありません。そこで、Smalltalk の代表的な処理系で nil の賢さについて比較してみました。

# 比較する処理系

とりあえず、今元気がいい処理系として Pharo 5 と次バージョンとなるべく開発中の Pharo 6、総本山といっていい Squeak 5.1、PARC直系正統派の VisualWorks 7.10.1、そして GNU Smalltalk 3.2.5 を比較してみました。

# nilのクラスが定義しているメソッド数

nilがどんなに賢いか。プログラマとしてはコードがオブジェクトを賢くすると思いたい。つまり、メソッドがいっぱい定義されていれば賢いだろうということで、nilのクラスである UndefinedObject が定義しているメソッドの数を比較してみました。次のコードで確認できます。

```smalltalk
nil class selectors size
```

結果は以下の通りです。

| 処理系 | メソッド数 |
|:----------|------------:|
| Pharo5 | 62 |
| Pharo6 | 57 |
| GNU Smalltak 3.2.5 | 44 |
| Squeak5.1 | 40 |
| VisualWorks 7.10.1 | 38 |

[Pharo たん](http://www.itolab.com/pharo-tan)、賢い！
新旧Pharoのワンツーフィニッシュです。

# nilが応答できるメッセージセレクタの数
UndefinedObjectで定義されていなくてもいいじゃないか、Objectとかから継承されていてもいいじゃないか、応答できればいいんだい！というわけで、継承した分もあわせてセレクタ数を数えてみました。

```smalltalk
 nil class allSelectors size
```

結果は

| 処理系 | 応答可能セレクタ数 |
|:----------|------------:|
| Squeak5.1 | 511 |
| Pharo6 | 476 |
| Pharo5 | 468 |
| VisualWorks 7.10.1 | 278 |
| GNU Smalltak 3.2.5 | 157 |

さすが、Objectの分厚さでいえば Squeak ですね！
9bitの符号なし整数の最大値をマークしました。
Pharoも6が5を抜きました。
そして清く正しい GNU Smalltalk はやはり清く正しかった。

# コードの中で nil 判定をしている密度
null 安全どーたらでは、nil 判定はバグの元だそうです。よくわからんけど。
というわけで、標準ライブラリ中の1メソッド当たりの nil 判定の個数を計算して、どの処理系が一番 nil 判定が多いかを見てみましょう。

コードは

```smalltalk
 (#isNil senders size + 
  #notNil senders size + 
  #ifNil: senders size + 
  #ifNotNil: senders size + 
  #ifNil:ifNotNil: senders size + 
  #ifNotNil:ifNil: senders size) / 
(Object allSubclasses inject: 0 into: [ :sum :each | sum + each selectors size ]) asFloat
```

ただし、Squeak と VisualWorks と GNU Smalltalk には Symbol>>senders が定義されてないようなので、それぞれ Symbol に定義してみました。

```smalltalk:Squeak5.1
senders
	^ self systemNavigation allCallsOn: self
```

```smalltalk:VisualWorks7.10.1
senders
	| collector |
	collector := MethodCollector new.
	^ collector select: (collector referencesTo: self)
```

GNU Smalltalk は…ごめんなさい、どうしたもんか皆目見当もつきませんでしたわい…orz

さて、結果は…

| 処理系 | nil判定密度 |
|:----------|------------:|
| Squeak5.1 | 0.152 |
| Pharo5 | 0.107 |
| Pharo6 | 0.105 |
| VisualWorks 7.10.1 | 0.088 |
| GNU Smalltak 3.2.5 | - |

一番 nil 判定を頻繁にやっているのは Squeak 5.1 でした。VisualWorks、nil判定少ないですね。まあいずれにせよ、Smalltalk を書いたらこんぐらいの頻度で nil のことを気にしてみましょうね、ってことなのかな。よくわからないけど。まあ10個メソッドを書いて1回思い出すぐらいならオレにもできそうなので安心しました。

# おわりに
どの Smalltalk の nil が賢いか比べるつもりでしたが、どうもあまり大差ないというのが率直な感想です。
差が目立ったのは allSelectors でしたが、これは nil どうこうというよりも、Squeak の Object が肥大化していて、Squeak から派生した Pharo もやっぱり Object がメタボっている、という解釈が一番ピンとくるかなあという感じで、nil の賢さとはちょっと違うような気がします。

というわけで、結論は、 
**Smalltalkの nil はみんな賢いから、どんどん使おう！**
ということで、めでたしめでたし。

追記 (2016/12/19)
=
Юрий Мироненко さんによる 素敵な nil への対処法。
[Protego - smart way to manage nil in business calculation](https://pharoweekly.wordpress.com/2016/12/18/protego-smart-way-to-manage-nil-in-business-calculation/)
時間を自由自在に操る魔法使いになります

# こんにちは！
みなさん、こんにちは。
遅くなりましたが、インテリジェンスAdventCalender 12/10担当のきりぽんといいます。
普段は[dots.](https://eventdots.jp/)というサービスの開発をしています。

# 概要
今回は、TDのクエリを書いていて時間の扱いがどうにも苦手でなので、まとめてみました。
時間を扱う独自関数については
[Supported Hive UDFs (User Defined Functions) | Treasure Data](https://docs.treasuredata.com/articles/udfs)
を見れば一応書いてあるのですが、よく使う独自関数を後で自分で見直しやすいようにまとめなおしています。
MySQLでも時々データ取得をするので、MySQLの書き方もメモります。
自分なりに調べてやってる感じなので認識や使い方が間違ってたらごめんなさい(´・ω・｀)

# TD_TIME_RANGE()
時間の範囲を指定する関数。

```
boolean TD_TIME_RANGE(int/long unix_timestamp,
                      int/long/string start_time,
                      int/long/string end_time
                      [, string default_timezone = 'UTC'])
```

```
select * from users where TD_TIME_RANGE(created_at, '2016-01-01', '2017-01-01', 'JST')
```

みたいな感じで使います。

* 第1引数
 * チェックしたい日時
 * timestampを指定
 * 指定したいカラムがtimestampになってない時は後で出てくる`TD_TIME_PARSE`を使う
* 第２引数
 * 開始日時
  * `yyyy-MM-dd`みたいに日付だけの指定もできるし、`yyyy-MM-dd HH:mm:ss`みたいに時間までの指定もできます 
* 第３引数
 * 終了日時
 * `開始日時 <= date < 終了日時`で終了日時は含まれないようなので注意
 * 指定できるフォーマットは開始日時と同じ
* 第4引数
    * タイムゾーン
    * デフォルトは標準時間'UTC' 
    * 基本日本時間なので'JST'を指定 
    * たぶんこれ指定しないとUTCのその時間の範囲としてチェックされるっぽいので注意

開始、終了を指定しない時は第二、第三引数を`NULL`とすればOK！

MySQLだとたぶん↓

```
column_name BETWEEN start_time AND end_time
```
なんですが、 `BETWEEN start_time AND end_time` は 
`start_time <= date <= end_time` なので

```
select * from users where TD_TIME_RANGE(created_at, '2016-01-01', '2017-01-01', 'JST')
```
と同じ日付を指定したい場合は

```
BETWEEN '2016-01-01' AND '2016-12-31'
```
になる
# TD_TIME_PARSE
文字列になっている日付をtimestampに変換する関数。

```
long TD_TIME_PARSE(string time
                   [, string default_timezone = 'UTC'])
```
```
select * from users where TD_TIME_RANGE(TD_TIME_PARSE(birthday, 'JST'), '1988-04-02', '1989-04-02', 'JST')
```
birthdayカラムの型が'yyyy-MM-dd'というstringのフォーマットと考えた場合、こんな感じで使います

* 第１引数
 * 文字列になっている日付
* 第２引数
 * タイムゾーン
 * デフォルトは標準時間'UTC' 
 * 基本日本時間なので'JST'を指定 
 * これをしていしないとUTCのtimestampが返ってくるから頭がこんがらがる

MySQLだとこれ

```
UNIX_TIMESTAMP(time)
```

# TD_TIME_FORMAT
timestampを文字列に変換する時にフォーマット指定して変換できる関数。

```
string TD_TIME_FORMAT(long unix_timestamp,
                      string format
                      [, string timezone = 'UTC'])
```

```
select TD_TIME_FORMAT(created_at, 'yyyy-MM-dd'), count(id) from users group by TD_TIME_FORMAT(created_at, 'yyyy-MM-dd')
```

みたいな感じで、日次の集計などでよく使います。私は。

* 第１引数
    * timestampを指定
* 第２引数
    * 指定したいフォーマットの文字列？
        * 'yyyy-MM-dd'とか
        * 私はPHPerなので私は初め混乱しましたこれがこうなる
            * `"Y-m-d H:i:s" =>  "yyyy-MM-dd HH:mm:ss"`
* 第３引数
 * タイムゾーン
 * デフォルトは標準時間'UTC' 
 * 基本日本時間なので'JST'を指定 
 * これをしていしないとUTCの日次が返ってくるから気をつけて

# 頭がこんがらがる

タイムゾーンで私はなぜかハマって、データ取得するたびに「あれ、取得範囲違う？？？？」と泣いてたのですが・・
普段扱ってるサーバーはJSTに時間が合ってるので、タイムゾーンとか意識してなかったんですね。
TDを使う時はUTC時間のサーバーに向けて問い合わせてるので基準を'JST'に正すためにタイムゾーンを指定する頭を切り替えるのが大事。

# 今日は一旦ここまで
今日は一旦ここまでです。
もうちょっと時間のある時に他もまとめます。
【Swift3】【WatchKit】WKInterfaceSwitchの状態を取得する



##WKIntarfaceSwichの状態を取得したい
初めてWatch対応アプリに挑戦中の私がいきなり壁にぶち当たったのでまとめ。

watchOSにて、ボタンを押下した時にSwitchのon / offを取得して
何やかんやしたかったのにできませんでした。

![screenshot.png](https://qiita-image-store.s3.amazonaws.com/0/144427/2657c703-7b1c-66ab-5936-66d4f9476cba.png)

↑これのtapを押したらswitchがonなのかoffなのか取得したかった。

##やったこと

```swift:InterfaceController.swift
@IBOutlet var testSwitch: WKInterfaceSwitch!

@IBAction func tapped() {
     print(testPicker.isOn)  // エラー
}
```


UISwitchではisOnでSwitchの状態を取得できましたが、
WKInterfaceSwitchではダメっぽい。

そもそも**Switchの状態を取得するプロパティはない**っぽい。


参考：[check if switch is on boolean watchkit](http://stackoverflow.com/questions/30082566/check-if-switch-is-on-boolean-watchkit)（stackOverflowに飛びます）


Actionで取得はできるみたいなので、こうするしか今の私には無理でした。


```swift:InterfaceController.swift
//@IBOutlet var testSwitch: WKInterfaceSwitch!
var state = true

@IBAction func switchChanged(_ value: Bool) {
     if value {
          state = true
     }else {
          state = false
     }
}

@IBAction func tapped() {
     print(state)
}
```


##WKInterfacePickerでも同様っぽい

Switchと同じく、PickerもselectedRow()がダメでした。
こちらも取得するプロパティがないっぽい。

Actionでゴリゴリするしかないのかなあ。
windows .bat 学習まとめ

# 連番

```bat
rem n:ファイル数
rem x:開始する値(dirに10個ファイルが有り5を指定するとそこから繰り返し)
rem y:増やす値(1なら++1)
rem *.jpg を *1.jpg に変更
for /l %i in (x, y, n) do ren "*.jpg" "*%i.jpg"
```

# 全ディレクトリ（最下層まで）から該当拡張子を検索
- 参考：[マコトのおもちゃ箱　～ぼへぼへ自営業者の技術メモ～](http://piyopiyocs.blog115.fc2.com/blog-entry-872.html)

```bat
rem batが配置されたディレクトリにあるpdfファイルを全て表示
for /f "usebackq" %%i in (`dir /B /S *.pdf`) do (echo %%i)
```
bootstrapの薄いグレーがmacの画面に表示されない



#bootstrapがなぜか正常に表示されない！


「初心者あるある」かもしれないのですが、恥ずかしながらめちゃくちゃハマったのでメモ。

はじまりは、navbarでした。
なぜかグレーになるはずのバーが白になるという謎現象。ブラウザを変えても直らない。

コードは正常に動いているようだし、人のマシンや自分のiPhoneなどで見ると普通に表示するので、しばらく放置していました。

しばらくしてテーブルに縞模様をかける"table-striped"クラスを試してみたところ、やはりグレーの縞模様が入らない。

stackexchangeで、たとえば"bootstrap table-stripped color not working"など入れて必死に検索するのですが、同じ症例が出てこなくて悩みました。

##症状

同じ現象かどうかを知るためには、ブラウザで[bootstrap](http://v4-alpha.getbootstrap.com/content/tables/#striped-rows)の該当ページを開けて、navbarやtable-stripedが正常に表示されるかを確認するのが早いでしょう。


<img width="726" alt="スクリーンショット 2016-12-13 14.17.22.png" src="https://qiita-image-store.s3.amazonaws.com/0/151343/bf53c92d-4841-fd56-2ed7-5264d947fc1a.png">

この画面が下のように見えていたら、同じ現象の可能性があります。

<img width="726" alt="スクリーンショット 2016-12-13 14.17.22のコピー.png" src="https://qiita-image-store.s3.amazonaws.com/0/151343/1af79cf3-5bd1-8a6c-eed0-45eff9a2396d.png">
（↑は画像処理しています）

また、「あるはずのグレーが見えない領域」をキャプチャーして、他の人のマシンやiPhoneから確認する手もありますね。


##原因と対策

長旅の末、たどり着いたのがコントラスト設定。


<img width="670" alt="スクリーンショット 2016-12-13 14.08.06.png" src="https://qiita-image-store.s3.amazonaws.com/0/151343/98121737-5150-9cc8-3939-2bf127d40fb0.png">



[システム環境設定]→[アクセシビリティ]→[ディスプレイ]で、コントラスト設定画面にたどり着くことができます。

こんな奥深いところにあったとは！
（ついつい[システム環境設定]→[ディスプレイ]を探してしまうのが罠でした）

##bootstrapさまごめんなさい

結果としては、bootstrapは全く悪くありませんでした。

強いて言えば、bootstrapではコントラストの限界に挑むような薄いグレーを多用しているため、コントラスト設定を半ノッチでもあげるとグレーが白色と同一化してしまいます。


ということで、「なぜbootstarpのクラス設定が効かないのだ〜！（しかも私だけ）」と悩む子羊たちのお役に立てればと思い、恥ずかしながらメモを貼っておきます。
Swiftで円グラフを描画する - Swift3.0対応済み

# はじめに
まずはじめに、こちらはSwift3.0環境下で円グラフを生成することを想定して書かれたものです。Swift2.X環境下では、`.move(to:CGPoint(x:xxx,y:yyy))`をはじめ、幾つかのメソッドでコンパイルエラーが発生します。2.X環境の方は、その都度検索して修正してください。

# 実装完了後のイメージ
若干上に寄り過ぎていたりしますが、今回の目的は達成しているのでご愛嬌。

![スクリーンショット 2016-12-13 14.31.56.png](https://qiita-image-store.s3.amazonaws.com/0/98951/8d670ccf-36f2-f50f-9053-941fe5ce7261.png)


# 実装方法
## 円グラフのクラスを作成する
```PieChartView.swift
struct Segment {
    
    // MARK: セグメントの背景色
    var color : UIColor
    
    // MARK: セグメントの割合を設定する変数（比率）
    var value : CGFloat
}

class PieChartView: UIView {    
    var segments = [Segment]() {
        didSet {
            setNeedsDisplay()
        }
    }
    
    override init(frame: CGRect) {
        super.init(frame: frame)
        isOpaque = false 
    }
    
    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
    }
    
    override func draw(_ rect: CGRect) {

        // MARK: CGContextの初期化
        let ctx = UIGraphicsGetCurrentContext()
        
        // MARK: 円型にするためにradiusを設定
        let radius = min(frame.size.width, frame.size.height)/2
        
        // MARK: Viewの中心点を取得
        let viewCenter = CGPoint(x: bounds.size.width/2, y: bounds.size.height/2)
        
        // MARK: セグメントごとの比率に応じてグラフを変形するための定数
        let valueCount = segments.reduce(0) {$0 + $1.value}
        
        // MARK: 円グラフの起点を設定 [the starting angle is -90 degrees (top of the circle, as the context is flipped). By default, 0 is the right hand side of the circle, with the positive angle being in an anti-clockwise direction (same as a unit circle in maths).]
        var startAngle = -CGFloat(M_PI*0.5)
        
        // MARK: 初期化されたすべてのセグメントを描画するための処理
        for segment in segments { // loop through the values array            
            ctx?.setFillColor(segment.color.cgColor)
            let endAngle = startAngle+CGFloat(M_PI*2)*(segment.value/valueCount)
            ctx?.move(to: CGPoint(x:viewCenter.x, y: viewCenter.y))
            ctx?.addArc(center: CGPoint(x:viewCenter.x, y: viewCenter.y), radius: radius, startAngle: startAngle, endAngle: endAngle, clockwise: false)
            ctx?.fillPath()
            startAngle = endAngle
        }
    }
}
```

## 円グラフをViewControllerで描画する
```HogehogeViewController.swift
import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
    }

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(true)
        let pieChartView = PieChartView()
        pieChartView.frame = CGRect(x: 0, y: 0, width: view.frame.size.width, height: 400)
        pieChartView.segments = [
            Segment(color: UIColor.green, value: 100),
            Segment(color: UIColor.lightGray, value: 10)
        ]
        view.addSubview(pieChartView)
    }
}
```

# 参考資料
- [Making a pie chart using Core Graphics](http://stackoverflow.com/questions/35752762/making-a-pie-chart-using-core-graphics)
「見積もり」をスマートに

デジタルクエスト社のアドベントカレンダー１３日目担当の綿引です。

エンジニアの方々は避けて通れない「見積もり」という工程。
「見積もり」が楽しい！って思える方は少ないですよね。
工数を短くすれば自分の首が締まるし、長くすれば「こんなかかるの？」とお叱りを頂くし。
私なりのスマートに片付けて先に進めるためのポイントをまとめました。


## ポイント① 見積もりやすい粒度
要件・やりたいことなんかを洗い出していると、大きすぎるものや小さすぎるものが混じってきます。
大きすぎるものは、工数のブレ幅が大きくなりやすいですし、小さすぎるものは見積もり内に含まれないことが多く発生します。
見積もり時の最小単位をどこに設定するかでも変わってきますが、0.5人日程度までに留めておくことが無難です。
0.1や0.25程度で片付くタスクは、１つにまとめて見積もることをオススメします。

## ポイント② 不確定要件
初期の見積もり時には、決まりきっていないことが紛れ込んできます。
これはある程度仕方のないことなので、不確定を是として見積もりを提出するのが良いでしょう。
例えば、○○という仕様なら○人日、△△という仕様なら△人日、といった提案を付加するとなお良いと思います。

## ポイント③ 誰がやる基準に併せるか
エンジニアのスキルやレベルは当然ながら人それぞれ異なっています。
見積もりを行う際には、「誰がやるか」を念頭に置くのがベストですが、勝手に見積もられて押し付けられるメンバーからすると堪ったものではありません。
担当が決まっているのであれば、担当者に見積もりをしてもらいましょう。

## ポイント④ 見積もりの精度
③と似ていますが、人が行うことなので、機械的にやろうとしても余計なものが混ざり込んできます。
そこで、見積もり時にはできるだけ2人以上で相見積もりを行うのが良いです。
その分のコストがかかってはきてしまいますが、担当者間の認識をあわせる場や実装方針などの議論にも発展して、最終的に見積もりの精度が上がります。
コードレビューならぬ見積もりレビューとして弊社でも活用しています。

## ポイント⑤ お客様あっての見積もり
見積もりをしていると、「何のために」「誰のために」という観点が置いてきぼりになりがちです。
プロダクトだけに目を向けるのではなく、その背景までを含めて理解することでこちらから提案することも可能に。
スクラム開発でのトレードオフスライダーのように、優先度を整理することで要件もスッキリすると思います。

## ポイント⑥ 過去の経験を活かす
見積もりをする際は、過去の類似事例を思い出してください。
自分自身でなくとも技術は多少変わっていても経験した開発での工数感覚というのは大きくブレることはないでしょう。
潜んでいるリスクの検知にも役立つはずです。

## ポイント⑦ お金と工数は分けて考える
この業界、当然のように”人月”という単位でやりとりがなされますが、エンジニアは極力この人月単価には触れない方がよいでしょう。
自分の尺度と会社都合での値付けは常に乖離しています。
エンジニアの価値換算を自身で行ってしまうと、そこがモチベーションの起点にもなりますので、任せられる環境に身を置いたほうが冷静な判断が下せるハズです。

## ポイント⑧ バッファ
開発が終わってみると、見積もった工数よりも多かった・少なかったという話は当たり前のように出てきます。
少なかった場合は、さほど問題にはなりませんが、多かった場合は関係各位に迷惑をかけてしまいます。
期間に猶予が持てるようであれば、見積もり時点でスケジュールとお金のバッファを相談しておくと良いでしょう。
それが許されない状況であれば、優先度の低いタスクをスコープ外にすることをバッファとして相談しておくのをオススメします。
いずれにしても、エンジニア自身がバッファを各タスクに内包してしまうのは誰のためにもならない行為だと思いますので、事前相談推奨です。

## ポイント⑨ 説明責任
各タスクに予定工数を割り振っていったものは、すべてお金に換算される数字ですので、説明できなければなりません。
経験則で見積もった場合に、説明し難いケースが出てくることもありますが、いずれも①での適切な粒度が維持できていれば問題にはならないでしょう。
④での複数人での見積もりを行っておくと、全員の理解も深まり、誰でもタスクに割り振った工数の説明ができる状態になると思います。

## ポイント⑩ 契約形態
例えばお客様が「できたところを毎週確認したい」とアジャイル開発を希望された場合に一括請負契約は危険です。
プロダクトオーナーとしてお客様にも参加して頂くことを前提に、一部を準委任契約にしてもらう等の交渉をすることが無難です。
その他、”瑕疵”の考え方であったり、納品基準についてもトラブルの基となりますので、あらかじめ説明の上、理解してもらうことに努めましょう。

## ポイント⑪ テスト
品質担保で重要なテスト工程ですが、低予算の場合には優先度が低くなりがちです。
各タスク消化時に単体テストを内包、テスト期間にて結合テスト実施というケースが多いですが、テスト期間にも不足機能の開発を行っていては本末転倒です。
システムの規模 (画面数や機能数) を基におおよそのテスト期間とその間の人員を想定した工数割り出しをしましょう。
中規模以上のプロダクトであれば、外部のテスト請負をされている企業様にお手伝いいただくのがベストです。

## ポイント⑫ どうやって作るか
例えば、iOSアプリを作るといっても、多種多様な開発アプローチがあると思います。
お客様の都合 × 自社の都合 (経験とスキルセット) で最適な開発方針を定めるのが良いでしょう。
例にとったiOSアプリですと、Swift3,2,Objective-C,PhoneGapなど複数の方針があがりますが、エンジニアのエゴで決めることなく、作った後のことも考えて選定してください。

## ポイント⑬ 見積もり法の活用
代表的な見積もり手法して、以下のような見積もり法があります。
- トップダウン見積もり法
- ボトムアップ見積もり法
- ファンクションポイント法
- 係数モデル見積もり法
状況に応じた使い分けができれば有効な手法です。
④で挙げた複数人で別々の手法でアプローチするのも良いかと思います。

## ふりかえり
「見積もり」での当たり前を挙げてみました。
２０１６年は見積もることの多い年となりましたが、形となったモノの数を振り返ってみると、至らぬ点も多かったと自省しつつ、来年もまた、「見積もり」たいと思います。
PandasのDataFrameでカンマ区切りの数字文字列を数値にする

# はじめに

PandasのDataFrameで`25,000`のように、3桁ごとにカンマで区切られている文字列を、数値に変更したいとおもい調べました。

# コード
```
df.apply(lambda x: x.str.replace(',','')).astype(np.int)
```

# 参考ページ
[pandas – some ways to replace part of a string.](http://gappyfacets.com/2014/02/14/pandas-some-ways-to-replace-part-of-a-string/)


ありがとうございました。
他のやり方ありましたら、ご教授頂けるとありがたいです。
RustのOSSプロジェクトに参加する

みなさん，Rustを書いていますか？Rustの学習を一人で進めるのも良いですが，RustのOSSプロジェクトに参加してみるのも良い選択肢かもしれません．

例えば，10月末に[MozillaがQuantumプロジェクトを発表しました](https://medium.com/mozilla-tech/a-quantum-leap-for-the-web-a3b7174b3c12#.fg4pcefpy)．Quantumの[Wikiページ](https://wiki.mozilla.org/Quantum)には，IRCやメーリングリスト[^1]が載っていますが，その中でも注目したいのが[Servo Starters](https://starters.servo.org/)のページです．

RustのOSSプロジェクトは難易度ごとにIssueを分類する文化があり，Servo StartersはServo関連のIssuesで簡単な物を集めたサイトです．特にMentoredとラベルが付いたIssueでは，そのプロジェクトの開発者がメンターとして改善を手助けしてくれます．初めてのOSS活動でもこのようなIssueから始めれば一歩ずつステップアップしていくことができそうですね．

[Rust本体](https://github.com/rust-lang/rust)などの他のプロジェクトでもE-easyやE-mentoredといったラベルが付いたIssueが初心者向けとして用意されています．ぜひcontributeしてみましょう！

[^1]: メールの投稿は現在の所0件なので，利用されてはいないようです．また，パスワードが平文保存なので登録時は気をつける必要があります．
applique.css : 読み込むだけでAppleっぽいランディングページが作れるcssフレームワークを作った

[Demo](https://trkbt10.github.io/applique.css/)

リポジトリ：[https://github.com/trkbt10/applique.css](https://github.com/trkbt10/applique.css)

アップリケは、CSSファイルをページに張るだけでそれなりに見れるようになるCSSフレームワークです。
あとはクラス名など特に気にすることなくHTMLタグを書き連ねるだけで、適切なスタイルを当ててくれます。

下のサービスで作成したものを、単体のCSSで書き出したものです。
[Yosemite icon generator
](http://xn--9i8hku.ws/yosemite-icon/)


## サンプル

```html
<html>
<head>
  <link rel="stylesheet" href="applique.min.css"/>
</head>
<body>
  <section>
    <h2>
      あなたとApplique今すぐダウンロード
      <small>無料Appliqueのダウンロード</small>
    </h2>
    <p> Applique.css は、単純なコーディングのサイトにまるでリンゴを想起させるようなデザインを与えます。</p>
  </section>
  </body>
</html>
```
このように書くだけで、下のような見た目を生成します。
![Screenshot 2016-12-13 13.52.51.png](https://qiita-image-store.s3.amazonaws.com/0/74461/bf22c530-baad-9a5e-aa5e-c49bd6937a00.png)

守るべきルールはとても少なく、sectionタグで章を区切る、sectionタグの下にはヘディングをつけるだけです。

## 最後に
このCSSには拡張性が全くありませんので、より込み入ったデザインをしたい場合にはむきません。
ですが、簡単なアプリケーションの紹介ページなどには非常に向いていると思いますので、ぜひ使ってみてください。
備忘録_最低限必要なbrewコマンド一覧

※ フォーミュラ => パッケージのようなもの。brewではフォーミュラということが多いらしい。

## 必須コマンド

```
// Homebrewの環境診断
$ brew doctor

// インストール
$ brew install <フォーミュラ名>

// アンインストール
$ brew uninstall <フォーミュラ名>

// Homebrew自体を最新にする
$ brew update

// インストール済みのパッケージを最新にする
$ brew upgrade

// 古いバージョンのフォーミュラを削除
$ brew cleanup
```

## 覚えておきたいコマンド

```
// サブコマンド一覧の表示
$ brew help

// インストール済みのフォーミュラを表示
$ brew list

// フォーミュラの検索
$ brew serach <キーワード>

// 指定したフォーミュラを更新する
$ brew upgrade <フォーミュラ名>
```

## 知っていると便利

```
// インストールの際に指定できるオプションの表示
$ brew options <フォーミュラ名>

// フォーミュラのwebサイトを表示
$ brew home <フォーミュラ名>

// 最新ではないフォーミュラを一覧表示
$ brew outdated

// フォーミュラファイルの中身を表示
$ brew cat <フォーミュラ名>
```
PL/SQLのコレクション と 12c新機能のWITH句ファンクション で IN句1000個の壁(ORA-1795エラー)を回避／克服してみる。

Oracle Database では IN句に1000個以上の値を指定すると、ORA-1795エラーが発生してしまいます。

```sql
SQL> SELECT COUNT(*) FROM TBL_X T1
  2  WHERE C1 IN (
  3        1
  4    ,   2
  5    ,   3
:
(中略)
:
4001    ,3999
4002    ,4000
4003  );
  ,1001
   *
ERROR at line 1003:
ORA-01795: maximum number of expressions in a list is 1000

SQL>
```

このエラー(ORA-1795)を PL/SQLのコレクション と Oracle Database 12c新機能 の WITH句のファンクション で 回避／克服してみるやで彡(ﾟ)(ﾟ)

```sql
-- PL/SQL Collection Type
CREATE OR REPLACE TYPE tp_num_array IS TABLE OF NUMBER;
/

-- Select Query plus WITH FUNCTION
WITH
  FUNCTION fnc_num_array RETURN tp_num_array IS
    -- PL/SQL Collection
    arr_num_c1 tp_num_array := tp_num_array(NULL);
  BEGIN
    arr_num_c1.extend(3999);
    arr_num_c1(1) := 1;
    arr_num_c1(2) := 2;
    arr_num_c1(3) := 3;
--:
--(中略)
--:
    arr_num_c1(3999) := 3999;
    arr_num_c1(4000) := 4000;
    RETURN arr_num_c1;
  END;
SELECT COUNT(*) FROM TBL_X
WHERE C1 IN (
  -- TABLE Function
  SELECT * FROM TABLE(fnc_num_array)
)
/
```

結果は以下の通り。上手く行ったで。1000個の壁を越えたやで彡(^)(^)

```sql
SQL> -- PL/SQL Collection Type
SQL> CREATE OR REPLACE TYPE tp_num_array IS TABLE OF NUMBER;
  2  /

Type created.

SQL> -- Select Query plus WITH FUNCTION
SQL> WITH
  2    -- WITH FUNCTION
  3    FUNCTION fnc_num_array RETURN tp_num_array IS
  4      -- PL/SQL Collection
  5      arr_num_c1 tp_num_array := tp_num_array(NULL);
  6    BEGIN
  7      arr_num_c1.extend(3999);
  8      arr_num_c1(1) := 1;
  9      arr_num_c1(2) := 2;
 10      arr_num_c1(3) := 3;
:
(中略)
:
4006      arr_num_c1(3999) := 3999;
4007      arr_num_c1(4000) := 4000;
4008      RETURN arr_num_c1;
4009    END;
4010  -- Select Query Body
4011  SELECT COUNT(*) FROM TBL_X
4012  WHERE C1 IN (
4013    -- TABLE Function
4014    SELECT * FROM TABLE(fnc_num_array)
4015  )
4016  /

  COUNT(*)
----------
      4000

SQL>
```

トリッキー かつ かなり無理矢理なやり方 なんやけどね……彡(-)(-)
でも 12c新機能の WITH句ファンクション は結構使えるんやね。彡(ﾟ)(ﾟ)
SoftLayer カスタマーポータル ログインパスワード 変更 ( customer portal login password )

#2016年12月現在
ポータル・パスワード変更ボタンが追加されてました！！！
めでたし、めでたし。
![Slide1.PNG](https://qiita-image-store.s3.amazonaws.com/0/130492/f4a01af2-fbb2-6089-ba49-ba310c2a1f70.png)
)


#~~パスワードの変更通知が来たのだが………~~
（今すぐにパスワードの変更方法を知りたい方は、下の章まで読み飛ばしてください）



ある日、SoftLayerからパスワードの期限切れを通知する旨のメールがやってきました



![image](https://qiita-image-store.s3.amazonaws.com/0/130492/65ce6306-f952-c537-5d88-b500861e40fb.png)

<br>
<br>
<br>
それは今すぐにパスワードを変えてなくてと、リンクをすかさず押しました…
<br>
<br>
<br>

するとユーザーのプロファイル編集画面へ飛びました…



![image](https://qiita-image-store.s3.amazonaws.com/0/130492/b6f76caa-fedf-0bf0-fcc9-f772f5f4aecd.png)



<br>
<br>
<br>
ユーザーのパスワードを変更する項目はどれかなーと下へスクロールすると…



![image](https://qiita-image-store.s3.amazonaws.com/0/130492/19b25f73-3d21-ea15-70dc-233860f09d72.png)

<br>
<br>
<br>
<br>
<br>
<br>
項目がない………

<br>
<br>
<br>
<br>
<br>
<br>
どう見ても「VPN パスワードしかない」



どこにPassWord変更があるのだあああと右往左往

<br>
<br>
<br>
#PassWord変更はこちらから
![image](https://qiita-image-store.s3.amazonaws.com/0/130492/5f58162f-23e1-a784-485e-b72e072d1f56.png)

「アクション」からPassWordリセットを行うと…

<br>
![image](https://qiita-image-store.s3.amazonaws.com/0/130492/6b08c921-0759-ceb7-fab1-79e57fa4f1af.png)
PassWord変更のリンクがついたメールが飛んできて


<br>
![image](https://qiita-image-store.s3.amazonaws.com/0/130492/86e0ac70-7990-f653-528b-5f7aba87354c.png)
リンクをクリックするとPassWord変更画面に

<br>
<br>
<br>
分かりづらすぎ…(´・ω・`)
日々の仕事で疲れた心を癒す為。part2

こんにちは。ウサゲッティです。

今回のテーマは 「眼球疲労・疲れた心」を癒す方法を記事にします。
と言いたい所ですが、いきなり雑談です。

雑談：個人的に好きなので。
--------
皆さんはウサギの様な花が咲く植物って知ってます？

新緑の中に、小さな白いウサギが咲くんです。
**みんなのアイドル、サンダーソニアさん**
https://one-piece.com/anime/character/characters/Boa_Sandersonia
※ワンピースより

いいですよね。
かわいいですよね。

スミマセン・・。

実際はコチラ↓↓↓↓
**サンダーソニー (ウトリクラリア サンダーソニー 別名：ウサギゴケ)**
https://www.google.co.jp/search?safe=active&espv=2&biw=1769&bih=1152&tbm=isch&sa=1&q=%E3%82%A6%E3%82%B5%E3%82%AE%E3%82%B4%E3%82%B1
※google画像検索より

小さなウサギが生えるんですよね。
可愛く見えてこの子は「食中植物」だったりするんですけどね。
プログラムで徹夜すると寄ってくる"何か"を補食してくれたりと色々と頑張ってくれそうですね。

さて、眼精疲労を癒した所で本題へ。

疲れた心をリラックス
--------
おすすめの香りをご紹介。
精油やら用量やら細かい話を書く事は控えておきます。(クレームが・・来そうなので)
本格的に始めたい方は必ず専門家に聞いてくださいまし。
**柑橘系やら一部の精油は肌に塗って光が当てる(紫外線)とシミに・・・**
なんて怖い話もありますし、妊婦の方や、お子様もご注意を。
(市販の入浴剤やアロマキャンドルで香りを楽しむくらいな感じで。)

ではおすすめをご紹介。
疲れた心の癒しにおすすめの香りを3つ。
###■ジュニパーベリー
`スパイシーな香り`
多分、一度は嗅いだ匂いかも？と思うかもしれません。
洋酒「ジン」の香りづけに用いられる果実です。

疲れた心を回復させて、もやもやを整理できます。

###■ラベンダー
`ちょっぴりツンとしながらのさわやかな香り`
知らない人は居ないよね？有名ですね。
お風呂の入浴剤でもよくありますもの。

ストレス社会で緊張した心を緩和させリラックス。
寝付きが悪い時や眠りが浅い時に良いかも。

###■ローズアブソリュート
`濃厚でバラそのものを感じれる香り`
バラの香りっていいですよね。
濃厚な香りでバラそのものを感じれます。

なんか癒されますよ。
うんうん。
(香りだけで比べるとローズオットーよりもオススメ)


おすすめの香りはここまで。

##メモ帳・蛇足：パーティクルを調べてみた。
香りを可視化した演出出来るのかなと思って探してみました。
http://ics-web.jp/projects/particle-develop/
Xcode8.2でコマンドラインによるスクショ＆動画撮影

# Xcode 8.2のRelease Notes

> You can take videos and screenshots of Simulator using the xcrun Xcode command-line utility. To take a screenshot, run the command xcrun simctl io booted screenshot. To take a video, run the command xcrun simctl io booted recordVideo <filename>.<file extension>. (9887264)


コマンドラインでSimulatorのスクショや動画撮影ができるようになったとのこと。

# スクショ
```
xcrun simctl io booted screenshot /path/to/test.png
```

Release Notesには書いてありませんが、コマンドの最後に出力先とファイル名を指定するとその場所にファイルが生成されます。

# 動画
```
xcrun simctl io booted recordVideo /path/to/test.mov
```

動画撮影を終了するにはCTL+Cだそうです。
Hinemos5のシスログ監視でseverityを付与する方法、イベント履歴をCSVでエクスポートする方法

##シスログ監視でシスログのmsg部にsevirityを付与する
Hinemosのユーザマニュアルによるとシスログのフォーマットは下記となるため、シビリティ(errorとかwarningとか）が標準だと付与されない。

```
<PRI> HEADER MSG
```

このフォーマットに合っていないとHinemosのシスログ監視で拾えないので、hinemosに転送する際に以下のフォーマットに変換する。

```
<PRI>日時 ホスト名 <ファシリティ.シビリティ> [タグ]メッセージ
例：
# logger -p local0.err test
<131>Dec 13 11:49:07 server01 <local0.err> root:test
```

rsyslogのhinemos用コンフィグファイルを編集する。

```
# vi /etc/rsyslog.d/rsyslog_hinemos_manager.conf

...
$ActionResumeRetryCount -1
# 追加
$template mytemplate_hine,"\<%pri%\>%timegenerated% %hostname% \<%syslogfacility-text%.%syslogseverity-text%\> %syslogtag%%msg%\n"
# テンプレート定義を末尾に追加
*.info;mail.none;authpriv.none;cron.none        @127.0.0.1:24514;mytemplate_hine
```


##前日のイベント[履歴]をpsqlを使ってCSVで/var/log/hinemosにエクスポートする。
以下のようにhinemosディレクトリに入っているpsqlを使ってテーブルlog.cc_event_logをCSVでエクスポートすればそれっぽい結果が取得できる。

```
sudo -u hinemos /opt/hinemos/postgresql/bin/psql -h localhost -p 24001 -d hinemos -c  "COPY (SELECT * FROM log.cc_event_log WHERE generation_date BETWEEN date_trunc('day', current_timestamp+'-1 days') AND date_trunc('day', current_timestamp)) TO '/var/log/hinemos/event.log' (FORMAT csv, FORCE_QUOTE *)"
```

hinemosユーザのcrontabに登録するときには、必ず以下の設定をしないと、cron実行時のhinemosのログオフが原因でpgsqlが異常終了します。

参照：http://www.hinemos.info/news/201608_01

```

# vi /etc/systemd/logind.conf
RemoveIPC=no

```
Cloud9とGitHubとHerokuで開発・実行環境を構築する

プログラミングの勉強や課題に取り組む時などに使えるお手軽開発環境＋実行環境です[^1]。ほんの数分で開発環境を構築して実行確認まで出来ます。Cloud9+Herokuが一般的みたいですが、GitHubを前提とする事で打つコマンドがちょっと減ります。

- GitHubアカウント
- Cloud9アカウント
- Herokuアカウント

が必要になるので作成してログインしておきます。
  
## GitHubでリポジトリを作成
[https://github.com/new](https://github.com/new) にアクセスしてリポジトリ名や公開・非公開の設定、作成時に`README.md`を作成するかなど指定し、リポジトリを作成します。

このとき、`https://github.com/ユーザー名/リポジトリ名.git`という形式のURLが表示されると思うのでコピーしておきます。

## Cloud9でワークスペースを作成
[https://c9.io/new](https://c9.io/new) にアクセスしてワークスペースを作成します。ワークスペース名や公開・非公開の設定をした後、`Clone from Git or Mercurial URL`と書かれている部分にGitHubでコピーしたURLを入力します。最後に、ワークスペースで利用するテンプレートを指定しますが、自分で色々入れたいという人は`Blank`を指定します。

## Herokuでアプリケーションを作成
[https://dashboard.heroku.com/new](https://dashboard.heroku.com/new) にアクセスしてアプリケーションを作成します。この時、`アプリケーション名.herokuapp.com`となるのでアプリケーション名を設定しておきます。作成後、デプロイタブでデプロイする方法を指定出来る様になっているので、GitHubを選択してアカウントを連携後、先程作成したリポジトリを指定します[^1]。

## Cloud9でソースコード編集+α
Cloud9上のコンソールで`git commit`や`git push`が出来る様になっています。ソースコードを編集していきますが、`Procfile`を追加する事を忘れない様にしてください。Herokuが実行するためのコマンドやドキュメントルートを指定するなどの設定ファイルになります。記述内容についてはHeroku公式サイトの言語別にある『Define a Procfile』という項目を確認してください。[https://devcenter.heroku.com/start](https://devcenter.heroku.com/start)

Procfileを追加し、ソースコードの編集が終わったら`git push`します。すると、master[^1]に変更が加えられると同時に変更を検知したHerokuがコードをビルドした上でProcfileのコマンドを実行します。

## おわりに
これで`git push`後に`アプリケーション名.herokuapp.com`で動作が確認出来るという開発・実行環境が構築出来ます。不要になったら全てのサービス上でDelete的な事をすればOKなので、パパッと試すのにも便利だと思います。
 
[^1]: デプロイするブランチも指定出来るので設定次第になりますが初期ではmasterブランチです。
（メモ）xcrunでsdkが見つからないエラーが出る場合の対処

エラー内容
---

* MacのXcodeをインストール直後、コマンドラインから操作するxcrunコマンドを使おうとしたら下記のエラーがでて使えなかった

```
$ xcrun --sdk iphoneos --show-sdk-path
xcrun: error: SDK "iphoneos" cannot be located
```

これで解決
---

* パス解決の問題らしく下記のコマンドで動くようになりました

```
$ sudo xcode-select --switch /Applications/Xcode.app/Contents/Developer/
```