OmniAICreator/Qiita-1.07M huggingface dataset:
mod_deflate の効果を tcpdump で分析してみた

# 背景
ネットワーク通信料削減のため、Apache サーバーに通信圧縮設定を入れました。
入れたモジュールは [mod_deflate](https://httpd.apache.org/docs/2.2/ja/mod/mod_deflate.html) です。
DeflateFilterNote ディレクティブを使えば、apache ログにて圧縮前のレスポンスボディサイズが取れるとネット上で触れ込みはあるものの、[公式サイト](https://httpd.apache.org/docs/2.2/ja/mod/mod_deflate.html#deflatefilternote)にはレスポンスボディサイズが取れるとは明記されていませんでした。
そこで本当に DeflateFilterNote ディレクティブで圧縮前のレスポンスボディサイズが取れるのかを、apache ログ、tcpdump から検証した話です。
# apache ログ書式

```/etc/httpd/conf/httpd.conf
DeflateFilterNote Input instream

LogFormat '%t request:%r response_total:%O response_body:%B input:%{instream}n' deflate
CustomLog logs/deflate_log deflate
```

instream...フィルタの入力ストリームのバイトカウントのメモ
%t...タイムスタンプ
%r...リクエストURI
%O...圧縮後のレスポンスサイズ
%B...圧縮後のレスポンスボディサイズ
[詳細はこちら](https://httpd.apache.org/docs/2.2/ja/logs.html#accesslog)
# 圧縮設定ありの apache ログ
/hoge/fuga に対して圧縮設定あり時にリクエストしました。
圧縮前のレスポンスボディサイズは input より40バイトになります。

```

$ tail -f /etc/httpd/logs/deflate_log

[18/Dec/2015:10:39:30 +0000] 
request:/hoge/fuga 
response_total:295
response_body:58  
input:40

```

# 圧縮設定なしの tcpdump
/hoge/fuga に対して圧縮設定なし時にリクエストしました。
レスポンスボディサイズは Content-Length より40バイトになります。

```
$ sudo tcpdump
10:09:54.797870 IP 送信元 > 送信先: 
Flags [P.], seq 1:231, ack 919, win 155, options [nop,nop,TS val 1067968672 ecr 1692520408], length 230
E.....@.@...
..
....P..j...v.rv...........
?...d...
HTTP/1.1 200 OK
Date: Fri, 18 Dec 2015 10:09:54 GMT
Content-Type: application/json
Content-Length: 40
Connection: close

{"hoge":xxx,"fuga":"xxxx"}
```

# 結論
「圧縮設定ありの input ＝ 圧縮設定なしの Content-Length」になりました。
よって、巷で言われていた「apache ログにて圧縮前のレスポンスボディサイズが取れる」は正しいことがわかりました。
Xcode で Target を削除する


作成した Target を削除する場合、プロジェクトを選択してサイドバーボタンを押した後、削除したいターゲットを選択して、右クリック delete で消す。


![kobito.1450998523.939967.png](https://qiita-image-store.s3.amazonaws.com/0/10012/aae09ae7-18d2-e35c-4cd3-f4251eb849a2.png "kobito.1450998523.939967.png")
git > 案 > 自分の作業時間の積算見積もり



1. git logで指定の年月日以降のリストを取得
2. コミットの間の時間を計算して積算する
  - 時間が長く飛ぶ場合はその間は無視する(0とする)

前提

- 頻繁にコミットしていること
- コミットの間で違う作業をしていないこと

google analysisからのアナロジーでgit log analysis

複数プロジェクトを短い間隔で切り替えながら実装している場合は精度が悪そう。
技術英語 > Perhaps, chip's malfunctioning. > I think it's working perfectly.

@ Star Trek movie > Generations

emotion chipに馴染んできたというアンドロイドのデータ少佐。

突然のうれしい出来事が起きて涙を流してしまったことについて

データ少佐 「Perhaps, chip's malfunctioning.」
カウンセラートロイ「I think it's working perfectly.」


chipの前にtheがあるのかもしれない。
頑シミュ for MHX におけるお守りのソート

#はじめに
　初投稿です。至らないところがあれば教えてください。Python の練習がてらプログラムを作成したので公開します。

#頑シミュ for MHX とは
　知らない人のために説明すると、頑シミュ for MHX とは先日発売されたモンスターハンタークロスのスキルシミュレーターです。本来、自分であれこれ考えながら装備を考えなければいけないところを自動で計算してくれるすばらしいシミュレーターです。([製作者様のHP](http://mh.websimu.mydns.jp/))
　このシミュレーターに自分の持っているお守りを登録できるのですが、今のところ順番は手作業で揃える必要があります。
　そこで今回自動でソートできるプログラムを作成しました。以下がそのプログラムです。

```py:sort_mhx.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import numpy as np
import pandas as pd

if __name__ == "__main__":
	input_name = "CHARM.csv"
	output_name = "CHARM_.csv"
	# 入出力名

	col = ["omamori","slot","s1","v1","s2","v2"]
	cate_omamori = [u"兵士の護石",u"闘士の護石",u"騎士の護石",\
		u"城塞の護石",u"女王の護石",u"王の護石",u"龍の護石"]
	cate_skill = [u"毒",u"麻痺",u"睡眠",u"気絶",u"聴覚保護",u"風圧",u"耐震",\
		u"だるま",u"耐暑",u"耐寒",u"寒冷適応",u"炎熱適応",u"盗み無効",u"対防御DOWN",\
		u"狂撃耐性",u"細菌学",u"裂傷",u"攻撃",u"防御",u"体力",u"火耐性",u"水耐性",\
		u"雷耐性",u"氷耐性",u"龍耐性",u"属性耐性",u"火属性攻撃",u"水属性攻撃",\
		u"雷属性攻撃",u"氷属性攻撃",u"龍属性攻撃",u"属性攻撃",u"特殊攻撃",\
		u"研ぎ師",u"匠",u"斬れ味",u"剣術",u"研磨術",u"鈍器",u"抜刀会心",u"抜刀減気",\
		u"納刀",u"装填速度",u"反動",u"精密射撃",u"通常弾強化",u"貫通弾強化",\
		u"散弾強化",u"重撃弾強化",u"通常弾追加",u"貫通弾追加",u"散弾追加",u"榴弾追加",\
		u"拡散弾追加",u"毒瓶追加",u"麻痺瓶追加",u"睡眠瓶追加",u"強撃瓶追加",\
		u"属強瓶追加",u"接撃瓶追加",u"減気瓶追加",u"爆破瓶追加",u"速射",u"射法",\
		u"装填数",u"変則射撃",u"弾薬節約",u"達人",u"痛撃",u"連撃",u"特殊会心",\
		u"属性会心",u"会心強化",u"溜め短縮",u"スタミナ",u"体術",u"気力回復",u"回避性能",\
		u"回避距離",u"泡沫",u"ガード性能",u"ガード強化",u"KO",u"減気攻撃",u"笛",u"砲術",\
		u"重撃",u"爆弾強化",u"本気",u"闘魂",u"無傷",u"チャンス",u"底力",u"逆境",u"逆上",\
		u"窮地",u"根性",u"気配",u"采配",u"号令",u"乗り",u"跳躍",u"無心",u"千里眼",\
		u"観察眼",u"狩人",u"運搬",u"加護",u"英雄の盾",u"回復量",u"回復速度",u"効果持続",\
		u"広域",u"腹減り",u"食いしん坊",u"食事",u"節食",u"肉食",u"茸食",u"野草知識",\
		u"調合成功率",u"調合数",u"高速設置",u"採取",u"ハチミツ",u"護石王",u"気まぐれ",\
		u"運気",u"剥ぎ取り",u"捕獲",u"ベルナ",u"ココット",u"ポッケ",u"ユクモ",u"紅兜",u"大雪主",\
		u"矛砕",u"岩穿",u"紫毒姫",u"宝纏",u"白疾風",u"隻眼",u"黒炎王",u"金雷公",\
		u"荒鉤爪",u"燼滅刃",u"北辰納豆流"]
	# ソートの並び順

	tbl = pd.read_csv(input_name,encoding="shift-jis",header=-1,names=col)
	tbl["v2"] = tbl["v2"].fillna(0).astype(np.int64)
	tbl["omamori"] = pd.Categorical(tbl["omamori"],cate_omamori)
	tbl["s1"] = pd.Categorical(tbl["s1"],cate_skill)
	tbl["s2"] = pd.Categorical(tbl["s2"],cate_skill)

	tbl = tbl.sort_values(by=["omamori","s1","v1","s2","v2","slot"],\
		ascending=[False,True,False,True,False,False])
	
	tbl.to_csv(output_name,encoding="shift-jis"\
		,index=False,header=False)
	# ファイルのアウトプット
```

```py
	tbl2 = tbl.sort_values(by=["omamori","s1","v1","s2","v2","slot"],\
		ascending=[False,True,False,True,False,False])# 1
```
部分をいじるとソートの条件を変更できる。`by=[]`の部分で優先度、`ascending=[]`の部分で`by`に対応するところの昇順降順を設定。このソースではゲーム内でのデフォルト順に多分揃う。

##問題点
- 2つ目のスキルがない場合にfloat型からint型にするため便宜的にスキル値に0を代入しているのでソートのときにおかしくなる。(直面する機会はあまりないかも)
- 同様に出力ファイルに0が残ってしまう。(シミュレーターは問題なく動く)
















#おわりに
pandas を使ってみたかったからやった。おそらく需要はない。
node環境下で .jade ファイルを react-jadeとして読み込む


何度かやったのでメモがてら。

```js
const fs = require("fs");
const jade = require("react-jade");
require.extensions['.jade'] = (module, filename) => {
  const code = fs.readFileSync(filename).toString();
  const transformed = "module.exports =" + jade.compileClient(code, {globalReact: true});
  module._compile(transformed);
}
```
Xojoでキーボードレイアウトを判別

Xojoでキーボードレイアウトを判別するメソッドです。
OS Xデスクトップアプリ専用。

```vbnet
Function GetKeyboardLayout() As String
  
  declare function LMGetKbdType lib "Carbon" () as Integer
  declare function KBGetLayoutType lib "Carbon" (iKeyboardType as Integer) as OSType
  
  dim v as Variant = KBGetLayoutType(LMGetKbdType)
  
  Select case v.StringValue
    
  case "JIS "
    Return "JIS"
    
  case "ANSI"
    Return "US"
    
  case "ISO "
    Return "International"
    
  case "????"
    Return "Unknown"
    
  End Select
  
End Function
```
Carbonですけど、Cocoaビルドでも大丈夫。
Windows Server 2016 Technical Preview 4でStorage Spaces Directを試す 

**この記事は[高知工科大 Advent Calendar 2015](http://www.adventar.org/calendars/965)の24日目の記事です。**
# はじめに
Windows Server 2016ではStorage Spaces Direct (記憶域スペースダイレクト) がサポートされます。
個人的に気になっているので、紹介したいと思います。

#Storage Spaces Directとは？
Storage Spaces DirectとはSoftware Defined Storage（ソフトウェアによって定義されるストレージ）の一種です。
誤解を恐れずに言えばSANやNASといったストレージ専用のハードウェアを使わず、汎用的なサーバを束ねてスゴイストレージを作ろうぜ！な感じです。
#とりま構築してみる
- 今回は実験なので、Hyper-V上ですべての仮想マシンを構築します。構築する仮想マシンは以下のようにします。
- またクラスタストレージ用として100GBのVHDを各ノード3台、計9台をマウントします。 
- またStorage Spaces Directを利用するにあたりWSFCを用いますが、これにはActive Directory環境が必要なので同時に構築します。

|OS|用途|ホスト名|IPアドレス|
|:--:|:--:|:--:|:--:|
|Windows Server 2016 TP4|Active Directoryドメインコントローラ用|dc.765pro.com|192.168.0.1|
|Windows Server 2016 TP4|Storage Spaces Direct用クラスタノード 1|haruka.765pro.com|192.168.0.2|
|Windows Server 2016 TP4|Storage Spaces Direct用クラスタノード 2|makoto.765pro.com|192.168.0.3|
|Windows Server 2016 TP4|Storage Spaces Direct用クラスタノード 3|yukiho.765pro.com|192.168.0.4|


- 各マシンに固定IPとコンピュータ名を振っておく。各クラスタノードのDNSは192.168.0.1を指定します。


- まずActive Directoryを構築する。
    - 役割と機能の追加のウィザードからActive Directoryドメインサービスをインストールする。
    - インストールが終わったら、「このサーバーをドメインコントローラーに昇格する」を選択。
    - 新しいフォレストを追加するを選択し、適当なルートドメイン名を入力。今回はドメイン名を「765pro.com」とした。
    - あとは指示に従ってポチポチ進める。  
![1.JPG](https://qiita-image-store.s3.amazonaws.com/0/106927/9023cfce-1145-a158-46d8-96359b46a82c.jpeg)


- クラスタノード3台分の構築
    - 各クラスタノードの**PowerShell**で
```
Add-Computer -DomainName 765pro.com -Restart
```
を実行し、ユーザー名とパスワードを入力。これでクラスタノード用仮想マシンのドメイン参加が完了です。
    - 各ノードに役割と機能の追加のウィザードからフェールオーバークラスタリングをインストールします。
    - 次に各クラスタノードの**PowerShell**で
```
Enable-ClusterStorageSpacesDirect
```
を実行。
    - また、計9台のVHDをGPTで初期化しておきます。
    - これで下準備が完了です。次にクラスタを作成します。
- フェールオーバークラスターマネージャーを開き、クラスターの作成を選択、3つのクラスタノードを入力し、テストを実行する。
![2.JPG](https://qiita-image-store.s3.amazonaws.com/0/106927/d1898a35-516f-39dd-a2b1-9645ce8ccb1f.jpeg)

    - 次にクラスターの名前とIPアドレスを設定する。ここではCSSD、192.168.0.20とします。
    - サーバーマネージャに仮想のサーバーインタフェース「CSSD」が出現するので、そこから記憶域プールの作成を行います。
    - 名前はここでは「Pool」とします。ここではすべてのディスクを選択しPoolを作成します。  
![5.JPG](https://qiita-image-store.s3.amazonaws.com/0/106927/7fe099b2-e43b-3208-ffc4-d9a45fd1cd43.jpeg)

    - 次にPoolに仮想ディスクを作成します。名前を「Disk」とします。今回は3方向ミラーで作成します。
    - フェールオーバークラスターマネージャーに戻り、メンテナンスモードを有効にし、所有者ノードでフォーマットを行います。
    - フォーマット出来たら、メンテナンスモードを解除します。
- 最後にクラスタストレージを用いてファイルサーバーを作成したいと思います。
      - フェールオーバークラスターマネージャーの役割の構成からファイルサーバーの汎用ファイルサーバーを選択します。
      - 名前とIPアドレスは「FS」と192.168.0.21とします。
      - 作成後FSを右クリック、ファイル共有の追加を選択し通常の手順でファイル共有を作成します。ここでエラーが出る場合は、しばらく時間を置いてみてください。フォルダ名は「CSSDShare」としました。
      - 最後「**\\FS\CSSDShare**」で共有フォルダにアクセスできれば成功です。これでStorage Spaces Directを用いた共有フォルダが作成できました。
![12.JPG](https://qiita-image-store.s3.amazonaws.com/0/106927/24075331-a4df-8343-abe1-cd21fd09ebfb.jpeg)

#結局何がうれしいのか?
従来はShared SASと呼ばれる装置が必要だったのですが、Storage Spaces Directを用いることで普通のSATAディスクでもクラスタストレージを容易に構築できるようになりました。
websearch.vimpr でサービス別コンテンツを即検索

vimperator の検索コマンド追加する便利なプラグインを作られていたので紹介

# プラグイン概要

コンテンツの検索があるサービスの検索結果ページに一発で飛べるコマンドの追加

## 元祖様
vimperator pluginのwebsearch.jsを拡張（キーワードが無いときの挙動を追加） - sugilogのブログ
http://sugilog.hatenablog.com/entry/20110417/1302991616


default でいろいろ quickmark とか追加されてしまうのでその辺を省いた fork リポジトリを使っている
https://github.com/elzzup/websearch.vimpr

# vimperator と Firefox のカスタム検索エンジン
　「カスタム検索エンジンあるやん」と思った人もいるかもしれないがその通りで、Firefox カスタム検索エンジンを登録すると vimperator でもopen コマンドとかと合わせて使えるようになる、便利
　しかも親切なことにカスタム検索エンジンが登録されているサイトを開いている状態では検索バーにしっかり推薦されるようになっている
<img width="297" alt="Screen Shot 2015-12-25 at 03.08.50.png" src="https://qiita-image-store.s3.amazonaws.com/0/40717/eaf8bb78-238c-2e5e-8b79-0858a3cba6ca.png">

カスタム検索エンジンが公式で存在するサービスではもちろん**こちらを使ったほうがいい**と思う
メジャーなサイトではほとんどあるので、今回紹介するプラグインはそれ以外の場合での使用しよう


# 自分の設定
liiberator.globalVariables.webSearchTemplates に追加で自分のよく使うサービスを登録する

```vim:.vimperatorrc
source ~/.vimperator/rc/js/websearch.rc.js

nnoremap sty :wsyahootweet<Space>
nnoremap sc :wsgooglescholar<Space>
nnoremap sn :wsnico<Space>
nnoremap stl :wstwilog<Space>

```

```js:websearch.rc.js
liberator.globalVariables.webSearchTemplates = [
    {
        names: ['wsgooglescholar'],
        description: 'search google scholar',
        url: 'https://scholar.google.co.jp/scholar?q=%KEYWORD%'
    }, {
        names: ['wstwilog'],
        description: 'search twilog',
        url: 'http://twilog.org/Arzzup/search?word=%KEYWORD%&ao=a'
    }, {
        names: ['wsnico'],
        description: 'search niconico video',
        url: 'http://www.nicovideo.jp/search/%KEYWORD%?track=nicouni_search_keyword'
    }, {
        names: ['wsyahootweet'],
        description: 'search yahoo リアルタイム検索',
        url: 'http://realtime.search.yahoo.co.jp/search?p=%KEYWORD%&ei=UTF-8'
    }];

```


あとは好みだが nmap にマッピングすると楽に検索できる
自分は nmap の s~~ にカスタム検索含め検索マッピングを使っている

```vim:.vimperator
nnoremap sg :tabopen<Space>github<Space>
nnoremap sy :tabopen<Space>youtube<Space>
nnoremap sw :tabopen<Space>wikipedia<Space>
```
カタログからどんどんアセットが出てくる

　これまで、若干の名前負け感があった Asset Catalog ですが、iOS 9 より Image Sets に加え Data Sets も持てるようになりました。つまり、画像以外のアセットも全て Assets.xcassets に放り込むことができます。

テキストファイルはもちろんのこと、

![sugoi-text-file](https://qiita-image-store.s3.amazonaws.com/0/4250/13b578c2-eba2-e56f-4589-b2e55165e255.png)

音楽ファイルもいけるし

![sugoi-music-file](https://qiita-image-store.s3.amazonaws.com/0/4250/4c9198fe-a722-2bff-0bb5-71a2fc6ffcb3.png)

動画ファイルもいけるし

![sugoi-movie-file](https://qiita-image-store.s3.amazonaws.com/0/4250/b194a0ee-ad52-c68d-69e3-7b04e1f24499.png)

あとは何でしょう。画像は画像でも、Animated GIF や SVG などが便利そうですね。

　アセットを取り出すときは、これまた iOS 9 より追加された `NSDataAsset` を使います。

```swift
if let asset = NSDataAsset(name: "sugoi-text-file") {
    let text = String(data: asset.data, encoding: .utf8)
}
```

```swift
if let asset = NSDataAsset(name: "sugoi-music-file") {
  self.audioPlayer = try! AVAudioPlayer(data: asset.data)
  self.audioPlayer.play()
}
```

```swift
if let asset = NSDataAsset(name: "sugoi-movie-file") {
  let videoUrl = URL(string: "\(NSHomeDirectory())/Documents/sugoi-movie-file")!
  try! asset.data.write(to: videoUrl, options: [.atomic])

  let playerItem = AVPlayerItem(url: videoUrl)
  self.videoPlayer = AVPlayer(playerItem: playerItem)

  ...

  // この例だとかえって手間が増えている疑惑
}
```

　こうしてエンジニアは、アセットを追加する度に心を濁らせてくる[^1] .xcodeproj や、使い方を覚えられない[^2] `NSBundle` から解放されるのでした。楽しい！₍₍ (ง╹◡╹)ว ⁾⁾

- [Xcode Overview: Adding Data Sets - Apple Developer Documentation](https://developer.apple.com/library/content/documentation/ToolsLanguages/Conceptual/Xcode_Overview/AddingDataSets.html)

- [NSDataAsset Class Reference - Apple Developer Documentation](https://developer.apple.com/library/ios/documentation/UIKit/Reference/NSDataAsset_Class/)

[^1]: 主に私の

[^2]: 主に私が
動的にパイプラインを切り替える方法


動的にパイプラインを切り替える方法はいくつかありますが、１つの方法として、`output-selector`, `input-selector`というものがあります。

- [input-selector](http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer-plugins/html/gstreamer-plugins-input-selector.html)
- [output-selector](http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer-plugins/html/gstreamer-plugins-output-selector.html)

output-selector でなにか簡単なアプリケーションを書こうと思い調べていたのですが、あまりにもいいサンプルコードが見つかったので書かないことにしました笑

こちらの [output-selector-test.c](https://github.com/jojva/gst-plugins-base/blob/master/tests/icles/output-selector-test.c) が非常に良いのです。

このプログラムでは以下のようなパイプラインを作っています。

```text
                                c1 --> sink1
                               /
src --> c0 --> toverlay --> osel 
                               \
                                c2 --> sink2
```

videotestsrc から絵を取って、timeoverlay で時間を映像に入れ、
その後、output-selector で出力先を切り替えます。
切り替えのトリガーには `g_timeout_add_seconds()` を使っていて
このトリガーに対応する処理で `active-pad` をスイッチする処理が書かれています。
こうすることで出力先が1秒ごとにパタパタしています。

---

このような output-selector を使ったプログラムを書く上でのポイントを、先ほど紹介したコードの中からピックアップして紹介します。

### gst_element_get_request_pad()

該当する箇所: [127行目](https://github.com/jojva/gst-plugins-base/blob/master/tests/icles/output-selector-test.c#L127)

このプログラムにおいて最も大切な関数と呼んで過言はないでしょう。

[gst_element_get_request_pad()](http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html#gst-element-get-request-pad)は Element に対して「Pad をくれ！」と要求する関数です。引数には要求する Element と、要求する Pad の名前を書きます。

この要求を行わなければ、output-selector は src の Pad を持っていません。つまり、下流にデータを流してくれないのです。なので、必ず行う必要があります。

### gst_element_get_static_pad()

該当する箇所: [140行目](https://github.com/jojva/gst-plugins-base/blob/master/tests/icles/output-selector-test.c#L140)

これは、inspect で以下のように表示される Element に対して行う関数です。
```
Pad Templates:
  SINK template: 'sink'
    Availability: Always
```
`gst_element_get_request_pad()`で得た Pad の繋げ先を取得するために、
このプログラムでは使われているで、これも大切な処理と言えます。

ただ、`gst_element_get_static_pad()`についてはすでに [Day 10](http://hellolibraryworld.blogspot.jp/2015/12/gstreamer-5-pad-event.html) で解説されているので詳細な説明は省きます。

### g_object_set()

該当する箇所: [58行目](https://github.com/jojva/gst-plugins-base/blob/master/tests/icles/output-selector-test.c#L58)

`g_object_set()` は Element のプロパティを設定する時にしばしば登場しますが、output-selector においては「出力先の決定」という大きな役目を持っています。(プロパティであることに変わりはありませんが...)

引数には、プロパティを設定したいエレメント、プロパティ名、設定する値、NULL の順番に入れます。

また、*設定する値*の **型** は inspect で表示されるものに従ってください。
output-selector の active-pad の場合は `GstPad` を入れますが、name の場合はもちろん `gchar *`です。
エレメントによって、プロパティによって違うことを忘れずに

### g_object_get()

該当する箇所: [51行目](https://github.com/jojva/gst-plugins-base/blob/master/tests/icles/output-selector-test.c#L51)

`g_object_get()` で、Element のプロパティの値を確認できます。
いま、output-selector が「どの Pad に出力しているのか」がこの関数でわかるので、これも重要な関数です。

---

このほかにの link 関連など 「GStreamer アプリケーションとして」重要な関数はいくつかありますが、またの機会に...


さて、output-selector のプログラムいかがだったでしょうか? ちょっと可能性が広がりそうですね。
また、input-selector を使えば1つの画面に複数のカメラからの映像を切り替えて表示する。なんてこともできるので是非やってみてください :)
「golang は多値返却できるが、いくつまで可能なのかな？」をもっと調べてみた

## はじめに

twitter を眺めていると、[golang は多値返却できるが、いくつまで可能なのかな？](http://qiita.com/amanoiverse/items/52d56f2039f87c2013b8) という記事が流れてきました。
タイトルに興味をそそられて読んでみましたが、「10000 まではいけた。もっといけそうだ!」という中途半端な結論で締められていてややモヤッとしたので、もっと詳しく調べてみました。

## 方法

n 個の返り値を持つ関数が定義し、それを main 関数から呼び出すプログラムを自動生成するプログラムを書きました。

コードは github にあるので、詳しくはそちらを見てください。

[zakuro9715/golang-max-count-of-multiple-return-values](https://github.com/zakuro9715/golang-max-count-of-multiple-return-values)

## 結果

返り値が多くなるにつれ、コンパイルの実行時間とメモリ使用量が増えていきます。

Core i5-6600K(3.50GHz) 上に構築した 1Core RAM 4GB の仮想マシンで go run してみると、10000 個で 1.2s/73MB, 50000 個で 51.1s/243MB でした。100000 個だとしばらく待ってみましたが終了しませんでした。

ということで、golang の返り値の個数の上限はマシンに依存しそうです。また、強力なマシンを使用してビルドしても、一定以上になるとスタックがあふれるのは想像に難くないので、そのあたりが上限と言えるのではないでしょうか。
Dart x Umiuni2D : Flutter と WebGL上で動作する2Dゲームエンジンを作ってみた

Flutter と WebGL上で動作する2Dゲームエンジンを作ってみました。
紹介します。

*Umiumi2D (海ウニ2D)*
http://kyorohiro.github.io/umiuni2d/web/index.html

※ iOS と Android と 手持ちの端末のブラウザーで動作する事を確認しています。



<br>

# [きっかけ] 作ったゲームを、Windowsでも動作できるようにしたい。

Flutterを利用して何かを作りたいなぁと考えていました。ちょうど、ビデオゲームの歴史を調べていたので、2Dゲーム用のライブラリを作る事にしました。

しかし、FlutterではWindowsに対応できません。近々で、Flutter のブラウザー版は開発の予定がなかったのと、Windows向けの実装がほとんどありませんでした。

せっかく、サーバサイド、ブラウザー、モバイル、組み込みLinuxまで利用用途を広げているDartでロジックを書いているのに、利用用途がモバイルだけなのはもったいないです。

そこで、Flutter と ブラウザーの両方で動作するゲームエンジンを作る事にしました。
※ Flutter がダメになっても、Dart x Chrome Mobile で動作させる事もできるので、保険にもなります。


# [機能] 基本機能は揃ってきたかな

ミニゲームを作成するのに必要なのは、SpriteとPrimiveを表示する機能ではないかと、考えました。そこから実装を始めました。　
また、実際に、落ち物パズルゲームを作成しながら、必要な機能を洗いだしていきました。


#### (丸) たくさんのSpriteを同時に表示する
![about.jpg](https://qiita-image-store.s3.amazonaws.com/0/54192/3c78eae5-b550-f7fc-0024-e91f6686d08e.jpeg)

http://kyorohiro.github.io/umiuni2d/web/example/draw_snow/main.html


#### (丸) Primitiveを表示する
![about.png](https://qiita-image-store.s3.amazonaws.com/0/54192/31d2c6ec-6eeb-a073-38c3-309e63bec8f7.png)

http://kyorohiro.github.io/umiuni2d/web/example/draw_primitive/main.html

#### (丸) タッチ操作
![about.png](https://qiita-image-store.s3.amazonaws.com/0/54192/eb69ecf5-4fd6-9402-6510-bcd6e340750e.png)

http://kyorohiro.github.io/umiuni2d/web/example/touch_test/main.html

#### (丸) 効果音の再生
![about.png](https://qiita-image-store.s3.amazonaws.com/0/54192/0fe72613-e3d5-f4a5-644f-5e943d67f958.png)

http://kyorohiro.github.io/umiuni2d/web/example/sound_test/main.html

#### (丸) 物理
![about.png](https://qiita-image-store.s3.amazonaws.com/0/54192/43008483-5f22-7f71-2971-4aee48c4bbd7.png)

http://kyorohiro.github.io/umiuni2d/web/example/physics_test/main.html

#### (丸) Spriteシート
![about.png](https://qiita-image-store.s3.amazonaws.com/0/54192/00c1b020-ec08-c217-157f-cdea5926ba0d.png)

http://kyorohiro.github.io/umiuni2d/web/example/draw_chara/main.html

#### (丸) Bitmapフォント
![about.png](https://qiita-image-store.s3.amazonaws.com/0/54192/8e8f8463-b15d-8f30-c9c9-6e8bbff9ed7c.png)

http://kyorohiro.github.io/umiuni2d/web/example/draw_bitmapfont/main.html

#### (丸) 画像の貼り付け方法の指定
![about.png](https://qiita-image-store.s3.amazonaws.com/0/54192/6e054315-4c1f-4208-b3c9-a006cc869e19.png)

http://kyorohiro.github.io/umiuni2d/web/example/image_trans/main.html

#### (丸) clipRect
![about.png](https://qiita-image-store.s3.amazonaws.com/0/54192/66b39889-a87f-9087-858f-77b239082446.png)

http://kyorohiro.github.io/umiuni2d/web/example/clip_rect/main.html

# デモアプリも作成してみた
ひとつ前のバージョンについて、iOSでも動作確認しました。ファイル関連の処理以外は期待した通りに動いています。

![wonder_minon_AB01.png](https://qiita-image-store.s3.amazonaws.com/0/54192/59ab06f8-f176-58d8-fa9a-4a689f846f39.png)

* HTML5 
 http://kyorohiro.github.io/umiuni2d/web/demo/wonderminon/main.html
* Google Play
 https://play.google.com/store/apps/details?id=info.kyorohiro.umiuni2d.demo.mino


<br>
<br>
-------
Kyorohiro Work
http://kyorohiro.strikingly.com/
フェルミ推定を使って婚活サイトの利用者数を推定してみる

# はじめに

「シカゴにはピアノの調律師は何人いるか？」「東京都内にマンホールはいくつあるか？」といった、
実際に調査したり正確な数字を把握したりすることが難しいような内容を、何らかのロジックを用いて
短時間で概算を出すことをフェルミ推定といいます。
最近では、Googleやコンサルティング会社の入社試験にも出題されたりするそうです。

# フェルミ推定とは

フェルミ推定の考え方として、以下の特徴が挙げられます。

- 正確な数字を算出することを目的としない。
- どんなに少ない情報からでも仮説を立て、結論を導き出す。
- 結論を出す時間を限定する。

# 婚活サイトの利用者数を推定してみる

それでは、このフェルミ推定を使って婚活サイトの利用者数を推定してみます。

## 前提条件

・ある特定のサイトの利用者数ではなく、婚活サイト市場全体の利用者数を対象とする。
・カジュアルなマッチングサイトではなく、結婚を前提に考えている人を対象とする。

## アプローチ 

婚活サイト利用者数算出のアプローチはいくつか存在すると考えられますが、
例えば以下の式によって算出されると思います。

```
婚活サイト利用者数 = 年代別人口 x 未婚率 x 婚活サイト利用率
```
この式にそって、それぞれの概算を計算します。

## 年代別人口

婚活サイトの主な利用者を男女とも20歳〜50歳と仮定します。

日本の人口ピラミッドはつぼ型の傾向がありますので、
人口約1億2000万人に対して、以下のようなセグメントと割合を考えます。

|セグメント|割合|人口|
|:---:|:---:|:---:|
|0〜20歳|20%|240万人|
|20〜40歳|30%|360万人|
|40〜60歳|30%|360万人|
|60歳〜|20%|240万人|

そして、それぞれのセグメントを単純に2で割ると、年代別では以下のようになります。

|年代|割合|人口|
|:---:|:---:|:---:|
|20代|15%|180万人|
|30代|15%|180万人|
|40代|15%|180万人|
また、男女比を1:1とすると、各年代男女とも90万人と考えることができます。

|年代|男性|女性|
|:---:|:---:|:---:|
|20代|90万人|90万人|
|30代|90万人|90万人|
|40代|90万人|90万人|

## 未婚率

次に各世代別の未婚率を考えてみます。
男性の方がやや婚期が遅いと考えられますので、男性の方を多めに設定しました。

|年代|男性|女性|
|:---:|:---:|:---:|
|20代|70%|60%|
|30代|50%|40%|
|40代|30%|20%|

## 婚活サイト利用率

まず、婚活手段として考えられるものを挙げてみると、

- 婚活サイト
- 婚活パーティ
- 友達の紹介
- 職場
- お見合い
- 結婚相談所　　　　　・・・などがあると思います。

もちろん複数の手段で活動されている人も多いと思いますので、
全て足して100%になることはありませんが、
ここでは婚活サイトを利用している人を30%と仮定します。

## 計算する

以上の結果から、アプローチの式に当てはめて計算します。

```
婚活サイト利用者数 = 年代別人口 x 未婚率 x 婚活サイト利用率
```

### 男性

|年代|人口 x 未婚率 x 利用率|利用者数|
|:---:|:---:|:---:|:---:|---:|
|20代|90万人 x 70% x 30%|18.9万人|
|30代|90万人 x 50% x 30%|13.5万人|
|40代|90万人 x 30% x 30%|8.1万人|
|||40.5万人|

### 女性

|年代|人口 x 未婚率 x 利用率|利用者数|
|:---:|:---:|:---:|:---:|---:|
|20代|90万人 x 60% x 30%|16.2万人|
|30代|90万人 x 40% x 30%|10.8万人|
|40代|90万人 x 20% x 30%|5.4万人|
|||32.4万人|

合計で **約73万人** という概算が算出されました。

ところで、Diverse社の運営する youbride は先日、利用者数が100万人を突破しました。
また、他社の同様のサイトが10サイト程度は存在すると考えられます。

その中でいくつかのサイトを掛け持ちで利用している人を考慮しても、
婚活サイト市場全体としては100万人以上は利用しているのではないかと思われます。

概算が少なかった原因としては、

- 50代も含めるべきではなかったか？
- 婚活手段が性別、年代、地域によって差があるのではないだろうか？

といったことが考えられます。

また、年代別人口や未婚率については、総務省の統計データから正しい数字が公開されていますので、
それらを用いることでより精度の高い数字に近づくでしょう。

# さいごに

近年はビッグデータ解析の手法や環境も整い、以前と比べて大量のデータを早く正確ににデータを
分析できるようになりました。とは言っても、何らかの調査を行う際にとりあえずデータを集めてみたり
分析してみたりということを先に始めてしまうと、時間はかかる、使われないデータになるかもしれない、
そして本来の目的を見失ってしまうということも往々にしてあると思います。

そこで、例えばフェルミ推定のようなツールを使って、数字は不明だとしても仮置きし、まず全体像を
捉えてからそれを分解して仮説検証（分析）を繰り返していくことの大切さを学んだので投稿しました。
PHPとバージョン

こんにちは! PHPとバージョンの話をします!

まじめな話は[モダンPHPアンチパターン](http://qiita.com/tadsan/items/157969b338fd8b782b21)とか[Functoolsを作った](http://qiita.com/tadsan/items/abc52f0739ab5b4e781b)とか[健全なpixivは健康なPHPに宿る〜モダンPHPを保つ7つの鍵](http://inside.pixiv.net/entry/2015/12/18/210721)に書いたので疲れました！

バージョンの話と言ってもPHP7は主役ではありません。

![スクリーンショット 2015-12-24 午後11.34.35.png](https://qiita-image-store.s3.amazonaws.com/0/4121/4894c622-0d14-2863-5739-425ef8b74ec9.png)

みなさん大好き、php.netのマニュアルに載ってるやつです。

## 函数をリストアップしよう

ところでphp.netに載ってる函数一覧は http://doc.php.net/downloads/json/php_manual_en.json で取得することができます。`php_manual_ja.json`はありません。

これを解釈してやれば、バージョンごとのPHPの函数一覧が作れるんじゃないかな?? 特に[ベンダー固有のモジュール](http://php.net/manual/refs.database.vendors.php)に載ってる謎DBとかほとんど不要だし、PHP 5.5よりも廃止された函数を視界に入れてやる必要がない。

……そう思った時代が僕にもありました。

https://gist.github.com/zonuexe/80107b7d1d924d3948b7

```
0.0.1
0.2.0
None
PHP 4 >= 4.0.2, PHP 5, PHP 7
PHP 4 >= 4.0.6, PECL pdflib >= 1.0.0
PHP 4 >= 4.0.6, PHP 5
PHP 4 >= 4.0.6, PHP 5 <= 5.0.5
PHP 4 >= 4.0.6, PHP 5 <= 5.0.5, PECL mnogosearch >= 1.0.0
PHP 5 < 5.4.0
PHP 5 < 5.4.0, PECL sqlite >= 1.0.3
PHP 5 < 5.4.0, sqlite >= 1.0.0
PHP 5 <= 5.0.5, PECL dbx >= 1.1.0
PHP 5 >= 5.0.2, PHP 7
PHP 5.6
PHP 7, PECL zip >= 1.13.0
PHP >= 5.3.0
PHP >= 5.3.0, PECL fileinfo >= 0.1.0
Unknown
^
```

こんなんパースできるか馬鹿野郎…！

`0.0.1`とか`0.2.0`とか`None`とか`Unknown`とか`^`とかお前らは何者だよ

ちゃんとバージョンが付いてるかに見えるやつでも不等号の方向とか`>`とか`<=`とか、現状有効なはずの機能でも`PHP 7`って付いてたり付いてなかったり、滅茶苦茶です。

## 仕分け

やりたいのは現在有効なPHP函数を抽出したいだけなので、以下のような分類をしてみます。

* `PHP 4`
* `PHP 5`
* `PHP 5.4`
* `PHP 5.5`
* `PHP 5.6`
* `PHP 7`
* `PECL xxxxx` (PECLモジュール)
* `xxxxx` (DB系とかデフォルトでインストールされないモジュール)
* `obsolete PHP 4` (PHP 4時代に廃止されたやつ)
* `obsolete PHP 5` (PHP 5時代に廃止されたやつ)
* `obsolete PHP 7` (PHP 7で廃止されたやつ)

モダンPHPに廃止済み機能は不要なので、綺麗に弾いていきます。

PHP 7で有効な函数にきちんと`PHP 7`って書いてあれば良いのですが、残念ながら書いてないものが大半です。`obsolete PHP 7`を判定するために、[下位互換性のない変更点](http://php.net/manual/migration70.incompatible.php)を参考に自前で廃止函数リストを持つことにしました。ううっ…

[ベンダー固有のモジュール](http://php.net/manual/refs.database.vendors.php)みたいなのはベンダーから提供されてるライブラリがないと動かないので、標準構成ではインストールされません。バージョンとは別個に仕分けしていきます。

めんどいのが[JSON](http://php.net/manual/book.json.php)とか[Phar](http://php.net/manual/ja/book.phar.php)とかPECL上がりの標準モジュールで、こいつらも個別対応してます。

ImageMagickは「バージョン情報なし。おそらくSVN版にしか存在しないでしょう」とか意味不明で投げやりな記述があります。

![スクリーンショット 2015-12-25 午前1.57.24.png](https://qiita-image-store.s3.amazonaws.com/0/4121/b5c14b3b-a42d-0add-3cb9-3b03d34ea1b5.png)


## 成果物

なんかまだ遺漏いっぱいありそうだけどGistに置きました。

* [`phpnet_version_parse.php`](https://gist.github.com/zonuexe/e35355d686d501322cd3) JSON吐き出すやつ
* [`functions.json`](https://gist.github.com/zonuexe/65e784d9ca8b305d0561) 個人的に利用しなさそうなモジュール外した
* [`functions-all.json`](https://gist.github.com/zonuexe/42851c11500326784ab6) ぜんぶ

年末年始のうちに、もうちょっときちんとした成果物としてまとめたいですね ヾ(〃＞＜)ﾉﾞ☆

## まとめ

なんかphp.netも浮かれてやがりますね！ めりーくりすます。

![スクリーンショット 2015-12-24 午後11.36.33.png](https://qiita-image-store.s3.amazonaws.com/0/4121/c60fad47-0b44-a13b-3356-5c388749aa22.png)
[iOS] Realm メモリ関連の例外対策


Realm Advent Calendar2015最後を担当させていただく@dekatotoroです:santa: 

[AWA](https://itunes.apple.com/jp/app/awa-music-yin-le-tingki-fang/id980578855?mt=8)という音楽ストリーミングサービスのiOSアプリをつくっています。

[AWA](https://itunes.apple.com/jp/app/awa-music-yin-le-tingki-fang/id980578855?mt=8)では、楽曲のメタデータからお気に入り情報、細かい設定情報など様々なデータをRealmに保存しています。[Realm meetup #4](http://www.slideshare.net/yuujihato/awa-with-realmpdf)でRealmを使ったアプリケーション設計の話もさせていただいたりして、2015年5月27日のリリースから約半年ほど運用してきました。

[issue2269](https://github.com/realm/realm-cocoa/issues/2269), [issue2589](https://github.com/realm/realm-cocoa/issues/2589)あたりでも議論されたりしていますが、
今回はメモリ関連の例外に対してとっている対策をいくつか紹介します。

※ 2015/12/25日現在のStoreのversionではRealm-cocoa(0.96.2)を使用しています



## Realmファイルの最適化
Realmのファイルサイズを確認すると思ったより大きくなっていることがあります。
ドキュメントの[現バージョンにおける制限事項](https://realm.io/jp/docs/objc/latest/#section-43)の「ファイルサイズと中間データについて」に記載がありますが、履歴データが残っていることが原因で肥大化していきます。Realmファイルが肥大化するとメモリー関連のクラッシュが増加する傾向があるため、できるだけ最適化する対策を行っています。

具体的には [writeCopyToPath:error: ](https://realm.io/docs/objc/latest/api/Classes/RLMRealm.html#//api/name/writeCopyToPath:error:)を使ってアプリ起動時にRealmファイルのサイズを最適化を行っています。

起動が遅くなることを懸念して1日経っていたらなど条件を調整していましたが、ほとんどコストもかからないため現在は起動時に毎回実行しています。数十メガまで肥大化したファイルが数メガ程度になったりと履歴データが肥大化している場合はかなりの効果があります。

以前[issue1243](https://github.com/realm/realm-cocoa/issues/1243)でも議論されていましたが、defaultで起動時のauto-compactはまだ組み込まれてないようです。



## トランザクションの分割
トランザクションは分割するより一括で実行した方が高速ですが、大きなトランザクションを大量に実行するとメモリ枯渇の要因となります。大量のデータの書き込みの場合はトランザクションを分割して実行しています。閾値を決めて下記のように自動でcommitする関数を作ると便利です。

```swift
    AppRealm.commitAuto { (transaction: AppRealmTransaction) -> Void in
        transaction.addArray([RLMObject]!)
    }
```

```swift
    AppRealm.commitAuto { (transaction: AppRealmTransaction) -> Void in
        for condition {
            transaction.add(RLMObject)
        }
    }
```

## Realmファイルの分割
Realmファイルの分割はCompactionとも関連しますが、Realmファイルが大きくなりすぎるとopen時にメモリ関連の例外が発生する可能性があります。端末やOSにより様々で一概に言えませんが、200Mを超えると発生頻度が増えてくるように思います。

Realmのデータが溜まっていくような設計の場合は、`RLMRealmConfiguration`でpathが指定できるので、データ設計上可能であれば分割することをおすすめします。FabricやGoogle AnalyticsなどでRealmファイルのサイズを送って分析してみると判断できると思います。


## まとめ
クライアントでDBを使用するのは、Cacheや履歴などの用途が多いと思います。
Realmは非常に高速で扱いやすいですが、サーバのようにscaleできるわけではないので、データが増えてきた時にどうするか設計時に留意しておく必要があります。

また、クライアントではおろそかになりがちですがサーバの負荷試験のように相当数のデータを保存してテストしてみることも大事だと感じました。

年内には1.0にcoreもオープン化されるのかなーと思っていましたが、もう少し先になりそうですね。Realm の今後に期待しています :santa:
クリスマスなのでprocessingで夜の森を書く

ﾒﾘｰｸﾙｼﾐﾏｽ

# 元ネタ

参考にさせていただきました！

[processingで木を描く](http://qiita.com/v_ohji/items/628a972a3f138cc09427)


# ウックリスマス...

![0058.png](https://qiita-image-store.s3.amazonaws.com/0/73240/9ee307c1-7400-281b-8818-aba2eb2fe53d.png)

https://youtu.be/gnfiEO1cXqA

```java
int step = 12;
int count = 0;
int lightNum = 200;

float tr_scale;
float tr_angle;
float tr_length;
float tr_startd;
float tr_startx;
float tr_starty;
float offset = -90;
float triangle = 30;


Light[] lights = {};

PGraphics backPg;
PGraphics frontPg;


void setup(){
  size (1366, 768);
  colorMode(RGB, 256);
  background(255);
  
  frontPg = createGraphics(width, height);
  backPg  = createGraphics(width, height);

  createLayer(backPg, 40, false);
  createLayer(frontPg, 20, true);

  for (int i = 0; i < lightNum; i++) {
    lights = (Light[])append(lights, new Light());
  }
}

void draw() {
  image(backPg, 0, 0);

  for (int i = 0; i < lightNum; i++) {
    lights[i].draw();
  }

  image(frontPg, 0, 0);
}


void createLayer(PGraphics context, int num, boolean hasBg) {
  tr_scale  = 0.99;
  tr_angle  = 24.0;
  tr_length = 180.0;
  tr_startd = 0.0;
  tr_startx = width / 2;
  tr_starty = height;
  
  context.beginDraw();

  if (hasBg == true) {
    backDraw(context);
  }

  
  createTree (context, tr_startx, tr_starty, tr_length, tr_startd, step);

  for (int i = 0; i < num; i++) {
    if (hasBg == true) {
      backDraw(context);
    }

    if (count == step) {
      count = 0;
      createTree(context, random (0, width), tr_starty, random(tr_length), tr_startd, step);
    }
  }
  
  context.endDraw();
}

void createTree (PGraphics context, float x01, float y01, float len, float deg, int n){
  context.stroke(color(#00695C, float(5 / (n + 1))));

  context.strokeWeight(int ((n + 1) / 4));

  float x02 = x01 + len * cos(radians(deg + offset));
  float y02 = y01 + len * sin(radians(deg + offset));
  
  context.line(x01, y01, x02, y02);
  
  if (n > 0) {
    float deg01 = random(-tr_angle, triangle);
    float scl01 = random(random(10, 20), len * tr_scale);
    createTree(context, x02, y02, scl01, deg + deg01, n - 1);

    float deg02 = random(-tr_angle, triangle);
    float scl02 = random(random(10, 20), len * tr_scale);
    createTree(context, x02, y02, scl02, deg + deg02, n - 1);
  }
  
  count = n;
}
  
void backDraw(PGraphics context) {
  context.noStroke();
  context.fill(#2a2f47, 9.5);
  
  context.rectMode(CORNER);
  
  context.rect(0, 0, width, height);
}

class Light {
  float x, y, brightness;
  float cnt;
  float v;
  
  Light() {
    x = random(width);
    y = random(height);
    cnt = 0;
    v = 0.6;
  }
  
  void draw() {
    noStroke();

    fill(color(#FFFF00, round(cnt -0.5)));
    ellipse(x + random(-1, 1), y + random(-1, 1), 8 + round(cnt / 10), 8 + round(cnt / 10));

    fill(color(#FFFF00, round(cnt)));
    ellipse(x, y, 5, 5);

    cnt += (v + random(-0.1, 0.5));

    if (cnt > 20.0) {
      v = -0.4;
    }
    
    if (cnt < 1.0) {
      v = 0.4;
    }
  }
}

```

ディスプレイによって出る色が違うのでアレで悩みます...
JavaScript版のprocessingに移植すると崩れる...

動かすと蛍みたいに光が揺れてちょっと綺麗
クリスマスそっちのけで乱数と向き合う方が楽し(ry
IP Messagingと通話を使ったソリューション "Waiting Room" の紹介

# まだ書いてる途中です！

　**もう少しで公開できる、かな。**

　IP Messagingが使えるようになったので、早速デモを作ってみました。[名前の由来はこちら](https://itun.es/jp/1437c?i=49249816)。

# Waiting Roomとは

　待合室向けのソリューションです。行列ができる店舗（銀行、病院、回転寿しなどなど）によく設置されている、タッチパネルを操作して自分の順番を予約する仕組みを作ってみました。もちろんプリンタなどハードウェアの制限はどうしようもないので、とりあえずタッチパネルと管理者向けPCやタブレット、ネットワーク環境があるという前提で話を進めます。

　もちろん、Twilioならではの機能も用意しましたのでお楽しみください。

## 機能その１　順番を予約する

![client0.png](https://qiita-image-store.s3.amazonaws.com/0/1782/232853e8-9adc-3e54-b004-85fff2ca806b.png)


　これでもかというくらいデザインのセンスがないですね。はい、まずは基本の機能です。タブレット機などの端末からタッチパネルを操作して順番を予約します。大きな「受付」ボタンをタップすると、順番が予約されます。現在待機中の人数も表示されます。

![client1.png](https://qiita-image-store.s3.amazonaws.com/0/1782/fc2f52ea-b312-347c-ac75-c138741f4d7b.png)

　クリックするとサーバは並び順を設定して返します。その際IP Messagingを通じて全てのクライアントに更新が通知されます。

![client3.png](https://qiita-image-store.s3.amazonaws.com/0/1782/8b098d5c-c7d8-dad5-fdad-c59573c4bda9.png)

　いつの間にかいっぱいクリックしていましたね。意味もなく占いも追加しました。

　連番を利用するのにRedisのINCRを使って番号の発行処理を行っています。また順番を保証するために（ほら、番号札が最初に戻ったりするでしょ？）同じくRedisのLISTを使った実装になっています。

　こちらの表示はIP Messagingの機能で全ての端末で同期しています。つまり、これって実際に店舗に出向かなくても順番を予約することができるんですよね。待ち人数も表示されますので、ユーザーは手元の端末から予約だけして適当な時間に店舗に出向くこともできます。

　ええ、勘のいい人なら、それRedisのPub/Subでついでにやればいいんじゃない？って思ったかもしれませんが、もちろん可能です。ただ、IP Messagingに備え付けのREST APIの開発やRedisのサーバの運用が必要になるので、電話機能があるならこちらを使う方が便利ではあります。

　また、今回のデモはReact.jsを利用しているのですが、最初にサーバからトークンを発行してもらい、IP Messagingの初期設定が完了したところで各種コンポーネントがロードされるようになっています。一旦起動したら、あとはサーバとクライアント、管理画面がそれぞれ通信しながら、IP Messagingで同期し合うようになっています。

## 機能その２　呼び出し電話を予約する

![client4.png](https://qiita-image-store.s3.amazonaws.com/0/1782/0bd25ab5-6053-3d86-302b-96d5d3616d5b.png)

　Twilioならではの機能の登場です。ユーザーは端末で予約してから電話番号を登録して自分の順番が近づいたら電話で呼び出してもらうことができます。電話番号を登録するとSMSが送信されるので、URLをタップすれば登録が完了します。これで間違い電話を防ぐことができます。

![IMG_5741.png](https://qiita-image-store.s3.amazonaws.com/0/1782/d1a3aa1a-a09a-f9a0-a8ed-8caa84a3ee65.png)

![client5.png](https://qiita-image-store.s3.amazonaws.com/0/1782/d391a0a9-ea3a-a682-04f6-878f8f7ee826.png)


　もっともSMSの到達率を考えると、ここはユーザーに特定の番号に電話してもらうソリューションもいいかもしれませんが、時間がないのでとりあえずデモはこれでいきます。

## 機能その３　呼び出す

　管理画面からは待機中のユーザーを順番に呼び出すことができます。通常、店舗ではマイクや大声でお客さんを呼び出すわけですが、機能その２で電話を登録している場合は音声通話で呼び出すことも可能です。また呼び出し電話を予約したユーザーの順番が近づいてきたら（初期の閾値はあと３人）自動的に通話が開始されます。

![admin.png](https://qiita-image-store.s3.amazonaws.com/0/1782/e18364a5-e510-e61d-9ff5-2964a3897896.png)


# 開発の動機

　待合室から離れて順番を待つことができる機能は、例えば病院などでは実際とても役に立つはずです。というのも、例えばちょっとした用事で内科に子供を連れて行くと、そこにはインフルエンザに罹患した患者さんが待っているなんてことは割とよく経験します。また、逆に風邪やインルエンザのように空気感染する病気になって病院に行くと、そこには免疫力の弱い高齢者や幼児、妊婦や免疫不全の方がいらっしゃることもありえます。こうした二次感染のリスクを低減するためには待合室を利用する時間を減らすのが効率的ですが、現在の仕組みではせいぜいネットで予約したら待機人数をチェックすることができるくらいが関の山で、メールでお知らせが届けばまだマシな方、でもメールを見落としてしまえばもうどうしようもありません。

　他にも、例えばショッピングモールの飲食店などでは、もっと時間を有効活用したいので行列に並ぶのを躊躇しているお客様にアピールするでしょう。欲を言えばきりがないかもしれませんが、ディズニーランドだってこんな仕組みがあればあのとんでもない行列がなくなり、みんなもっと効率的に園内を回遊するので、さらにもっとたくさんのお金を落としてくれるようになるんじゃないかと思います。

## ソースコード

　簡単なデモですが、~~こちらに公開してあります~~鋭意準備中です。

　もし「こんな機能は実現できないか」「こんな機能があれば是非導入したい」などのご提案があればおしらせください。
Git 入門 バージョン管理

dotinstallより引用
http://dotinstall.com/lessons/basic_git

#03 Gitの設定

以下3つの設定を行う

```
git init
git config --global user.name "tanaka"
git config --global user.email "tanaka@gmail.com"
git config --global color.ui true
git config --l　#設定の一覧が観れる
git config --help #helpが観れる　qでquit

```

#04 初めてのコミットをしてみよう

```
mkdir myweb
git init
vim index.html #ファイルの新規作成、編集　:wqで保存、編集終了
cat index.html #ファイル中身の表示
git add index.html #作業ディレクトリ＝＞インデックス
git commit indesx.html #インデックス＝＞レポジトリ　コメントを記入 initial commit
git log #履歴表示

```


#05 gitのログを見てみよう

```
git log --oneline #一行で変更履歴を確認
git log -p #変更箇所を確認
git log --stat #どのファイルがどの程度変更が加えられたか確認

```

#06 現在の状態を把握しよう

```
git status #ファイルがどの状態（作業ディレクトリ、インデックス、レポジトリ）か確認
modified …変更された
Changes not staged for commit : ステージにも上がってないしコミットもされていない
=>use git add : インデックスにあげるか
=>use git checkout :キャンセルするか

use git checkout -- index.html #以前の状態に元に戻す

```

#07 差分を確認してみよう


```
git diff #どこが変更されたか確認　ステージングエリアにあげる前のものに限る
git add index.html 
git status 
=> changes to be commited :まだコミットされてないよ
git diff --chached : ステージングエリアにあげた後にどこが変更されたか確認

```

#08 gitでのファイル操作について

```
git add . : 配下にあるファイルを全部ステージングエリアにあげる
git rm  index.html :git管理にあるファイルの削除!!勝手にFinderから消さない
```


#09 git管理に含めない設定について

```
vim .gitignore
=> *.log :wq
履歴を取ることに意味がない、サイズが大きく管理する必要がないファイルを管理外にする
```

#10 直前のコミットを変更する

```
git commit -m "xx" :コメントを１行でいい場合に-mをつける
git log :確認

git commit --amend :前回のcommitを適用する。新しくcommitするまでもない場合。

```


#11 過去のバージョンに戻ってみよう (1)
いつでも過去に戻れることができるメリットを活用する方法

```
git reset --hard HEAD:直前のcommitに戻す HEAD・・・直前のコミットに戻す
git reset --hard HEAD^ :直前よりも１個前のzommitに戻す
git reset --hard xxxxxxxx :最低７桁のidをつけることでそのcommitに戻る

```


#12 過去のバージョンに戻ってみよう (2)

```

git reset --hard ORIG_HEAD :直前resetしたcommitのファイルを記憶しているので戻すことが可能

```


#13 ブランチを使ってみよう

別々のverを並行して開発する場合

```
git branch :ブランチの一覧が見ることが可能
git branch hoge :新しくブランチを作成
git checkout hoge ;hogeブランチに移動

```


#14 ブランチをマージしてみよう
ちょっとした機能を試すときはbranchで作って、うまくいったらmergeで取り込む

```
git branch
=>hoge
*master
git merge hoge :masterにhogeをマージ

git branch -d  hoge :margeしたhogeをbranchから削除

```

#15 マージの衝突を解決してみよう (1)

```
git checkout -b hogehoge :branchを作成した後にhogehogeに移動

```

#16 マージの衝突を解決してみよう (2)
コンフリクトが起きた場合に解決する方法

```
vim index :編集画面を開いて修正する
=>削除したいところを消すだけ
```


#17 タグを使ってみよう
コミットidにわかりやすい名前を作る

```
git tag v1.0 :直近のcommitに名前をつける
git tag :tag名を表示
git show v1.0 :idを使わなくても、タグを入れるだけで変更内容が確認できる
git reset v1.0も可能

git tag v0.9 xxxxxxx(id): 任意のidにtag名を設定 
git tag -d tag名 :tagを削除
```

#18 エイリアスを使ってみよう
命令にショートカットを行う

```
git config --global alias.co checkout :checkout をcoで短縮
git config --global alias.st status 


git config --global alias.br branch
git config --global alias.ci commit
git config -l :設定の確認
```


#19 はじめての共同作業
複数名とgitの編集をする場合・・・割愛
SwiftでArrayの要素を振り分けたい

Advent Calendar 書くの遅れてゴメンなさい(´・ω・`)

SwiftでRubyの`partition`メソッドみたいな、
条件を満たす配列と満たさない配列に分割する関数が欲しかったので実装しました。
[partition/Module: Enumerable (Ruby 2.2.3)](http://ruby-doc.org/core-2.2.3/Enumerable.html#method-i-partition)

[ankurp/Dollar.swift](https://github.com/ankurp/Dollar.swift)の[partition](https://github.com/ankurp/Dollar.swift/blob/master/Dollar%2FDollar%2FDollar.swift#L854-L944)は分割数やステップ数を細く決められるが、
今回シンプルに条件で二分割したいだけ。

### implement
extensionでArrayに直接追加します。

Rubyの`partition`は[[真の要素...], [偽の要素...]]を二重配列で返していますが、
今回はScalaの`partition`に習ってtupleで返却するようにします。
[Scalaコレクションメソッドメモ(Hishidama's Scala collection method Memo)](http://www.ne.jp/asahi/hishidama/home/tech/scala/collection/method.html#partition)

また、Swiftのtupleは「要素に名前を付けられる + パターンマッチで取り扱いやすい[^1]」
ので配列ではなくtupleを採用しました。
[^1]: [Swiftでhead、tailにパターンマッチできる遅延リスト](http://qiita.com/koher/items/ad6ce3624cbb529d9197)の、List型の`head`/`tail`パターンマッチも考えましたが、今回の用途ではtupleが適切かと。

以下、実装です。

```swift
extension Array {
    public func partition(@noescape predicate: Element -> Bool) -> (include: [Element], exclude: [Element]) {
        return reduce(([], [])) { (acc, x) in
            if predicate(x) {
                return (acc.0 + [x], acc.1)
            } else {
                return (acc.0, acc.1 + [x])
            }
        }
    }
}
```

クロージャを受け取って即時評価するのが決まっているので、
引数で受け取る条件関数predicateにnoescapeアノテーションを指定しています。
[Swiftの @noescape をもっと使おう - Qiita](http://qiita.com/mishimay/items/a09c0e4a8063bf16e064)

> すぐに評価することが決まっている関数の場合はどうでしょう。そういうときはキャプチャする必要が無いし、self.も不要です。キャプチャしない方がパフォーマンス上でも有利でしょうし、最適化しやすいかもしれません。このようにすぐに評価され> ることがわかっているクロージャのために追加された新しいアノテーションがnoescapeです。
[Swift 1.2 - cockscomblog?](http://cockscomb.hatenablog.com/entry/2015/04/30/095612)

### sample

```swift
let isEven: Int -> Bool = { $0 % 2 == 0 }

Array(1...5).partition(isEven) // ([2, 4], [1, 3, 5])
```

戻り値のtupleの要素に名前を定義しているので、名前指定で直感的に取り出せます。
またtupleのパターンマッチングで分割代入も行えるので便利!!

```swift
let result = Array(1...5).partition(isEven)
result.includes // [2, 4]
result.excludes // [1, 3, 5]

// パターンマッチで簡単に取り出せる
let (trueAry, falseAry) = Array(1...5).partition(isEven)
trueAry // [2, 4]
falseAry // [1, 3, 5]
```

#### おまけ

`partition`関数を使って[クイックソート](https://ja.wikipedia.org/wiki/%E3%82%AF%E3%82%A4%E3%83%83%E3%82%AF%E3%82%BD%E3%83%BC%E3%83%88)を書いてみます。
++ 配列のhead/tail分割用のcomputed-properties `decompose`[^2]をArrayに追加しています。

```swift
extension Array {
    // 先頭とそれ以外に分割したtuple?を返す
    public var decompose: (head: Element, tail: [Element])? {
        return (count > 0) ? (self[0], Array(self[1..<count])) : nil
    }
}

func quickSort(ns: [Int]) -> [Int] {
    if let (pivot, rest) = ns.decompose {
        let (l, g) = rest.partition { $0 < pivot }
        return quickSort(l) + [pivot] + quickSort(g)
    } else {
        return []
    }
}

quickSort([8, 3, 5, 6, 10, 1, 9, 4, 2, 7]) // [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
```

すっきりと書けた。
tupleのパターンマッチ便利ですね! 

[^2]: [Functional Snippet #1: Decomposing Arrays · objc.io](https://www.objc.io/blog/2014/10/06/functional-snippet-1-decomposing-arrays/)
MacでAndroid開発中にsqliteの中身を見る

# MacでAndroid開発中にsqliteの中身を見る

開発中にアプリ内のデータを読みたい時がある。
`adb pull`では直接pullできないが、以下のように run-as で catすれば大体のファイルは見られるはず。
```
adb shell run-as [package name] cat /data/data/[package name]/databases/[database name] > ~/Desktop/[database name]
```

しかしデータがこわれていて読めない。
そこで以下のようにCRLFをLFに置換するとよいらしい。

```
adb shell run-as [package name] cat /data/data/[package name]/databases/[database name] | perl -pe 's/\x0D\x0A/\x0A/g' > ~/Desktop/[database name]
```
## 参考
http://stackoverflow.com/questions/13578416/read-binary-stdout-data-from-adb-shell
テンプレートが手招きしているよ

#テンプレートが手招きしているよ
本記事は「初心者 C++er Advent Calendar 2015」
最終日の記事です！
毎度おなじみ（？）、C++とテンプレートが大好き
いなむ先生です

C++のテンプレートで型を変数にすることについて書きます
「使いなさい」と言うつもりはありません
テンプレートとは__コンパイル時に型や値を引数として渡す機能__である
ということが言いたいだけです

<font color="#ffb000">__実際、怖くない！__</font>


よくわからない？
とりあえず、読んでみてよ！
<font color="#ffb000">__さあ、楽しいテンプレートの世界へ！れっつらごー！__</font>



##関数テンプレート

C++にはオーバーロードという機能があります
引数の型が異なる同じ名前の関数を定義できます
以下のmax関数は`int`と`double`でオーバーロードされています

同じ処理を行っているにも関わらず、関数を2つも書いています
同じことを書くのは面倒で、バグのもとです

```cpp
int max( int a, int b ) // #1
{
    return a < b ? b : a ;
}

double max( double a, double b ) // #2
{
    return a < b ? b : a ;
}

int main(){
    max( 1, 2 ) ; // 1,2はintなので#1が呼ばれる
    max( 1.5, 2.3 ) ; // 1.5,2.3はdoubleなので#2が呼ばれる
}

```

そこでC++ではテンプレートを用いて

```cpp
template < typename T >
T max( T a, T b )
{
    return a < b ? b : a ;
}
```

と書くことができる
これは、

```cpp
max( 1, 2 ) ;
```

のように呼び出すと、引数からテンプレート仮引数（`T`）を推測する
上の例の場合は`T`は`int`となる
これをテンプレート仮引数の推測（Template Argument Deduction）と呼ぶ

難しいことはおいておいて、
ここで、テンプレートの宣言をよく見てみよう

```cpp
template < typename T >
T max( T a, T b )
```

`template < typename T >`

`template`：テンプレートであることの宣言、一番最初に書く
`<>`：この中に変数化する型の変数名（テンプレート仮引数）を書く
`typename, class`：これに続くのはテンプレート仮引数だよ、という合図（ふつうはどっちでも良い）

この後に続けて関数を書きます
そして型名をテンプレート仮引数にします
`T max( T a, T b )`



<font color="#ffb000">要するに、使うまで__型を変数化__しておいて、__呼び出しから型を推測__する</font>



__ちなみに__
型を推測させずに、自分で指定することもできます
その場合は関数名と呼び出しの`()`の間に`<>`を書いてその中に型を指定します

```cpp
max< int >( 1, 2 );
```


##クラステンプレート

クラスをテンプレートにできる
初心者はクラスを書かないと思われるので紹介だけ

例えば、クラスのメンバ変数の型をテンプレートをテンプレートにできる
2次元の座標を表すクラスを作るとする


```cpp
template < typename T >
struct pos_2d{
    T x = T{} ;
    T y = T{} ;
} ;
```

座標が`int`型なのか`double`型なのか
使うまでわからなくても、使うときに指定できる

```cpp
auto&& pos = pos_2d<int>{ 20, 20 } ;
```

<font color="#ffb000">要するに、__型を変数化__しておいて、__使うときに指定__する</font>


##変数テンプレート
C++14からは変数もテンプレートにできます
例えば、円周率を定数として定義したいことはよくあります
`int`や`double`について、いちいち定義するのはばからしいです
そこで、テンプレート！
こんな風にするよ！

```cpp
template < typename T >
constexpr T PI = static_cast<T>(3.14159265358979323846L) ;

int main(){
    std::cout << PI<int> << std::endl;; // 3
    std::cout << PI<double> << std::endl; // 3.14159
}
```
<font color="#ffb000">要するに、__型を変数化__しておいて、__使うときに指定__する</font>

##ダークサイド
何をもってダークサイドというのか定かではありませんが
テンプレートのダークサイドを使うと楽しいです
三へ( へ՞ਊ ՞)へ ﾊｯﾊｯ
いなむ先生は最近Expression Templateというちょっとしたテクニックを使っていますが
~~二度と書きたく~~ とっても楽しいです
画像はExpression Template が生成した型名をVisual Studio2015の機能で表示してみたもの（プロ生ちゃんカ・ワ・イ・イ）
Oh, Gosh...型名が...とっても長いです(´・ω・`)
![ET.png](https://qiita-image-store.s3.amazonaws.com/0/100319/5ff936bb-80b8-90ae-6048-ef190e3cb3ca.png)


##おわりに
くどいくらいに
<font color="#ffb000">__型を変数化__しておいて、...</font>
と言いましたが、言いたいことはそれだけです
「テンプレートとは何か？」ときかれたら
「なんか怖いやつ」等と言わずに
<font color="#ffb000">__「コンパイル時に型や値を引数として渡す機能」__</font>といいましょう

##跋文
テンプレートは楽しいし
C++の真のパワーを開花させる機能です
しかし、ご利用は計画的に

最後まで付き合って読んでくれた方、ありがとうございました
ミスの指摘や質問はコメントか
[|いなむ先生|Twitter](https://twitter.com/_EnumHack)
までお願いします
MATLABで画像取り込み・グレースケール・保存

## 画像を読み込み・表示する
画像の読み込みには**imread**、画像の表示には**imtool**もしくは**imshow**を使います。両者の違いはそれぞれのToolでできる処理が異なってくることでしょうか。
imshowは異なるタイプの画像を表示させたい時に使います（グレースケール・トゥルーカラー等）。
imtoolはimshowで使える機能に加えて、ピクセル数や画像の情報を表示するなどの機能も仕様可能です。
[リファレンス](http://www.mathworks.com/help/images/image-display-and-exploration-overview.html)参照を推奨します。

pwd・lsコマンド等が使えるので、imreadに画像の置いてある場所を確認してパスを指定します。
**e.g.**

```matlab
>> img = imread('bear.png'); %% load image file :)
>> imtool(img);
```
![s_imtool.png](https://qiita-image-store.s3.amazonaws.com/0/63732/18a4e1de-35d0-5d46-6eb8-501af2deec96.png)

## RGB画像の構成
RGB画像は三枚の二次元画像から成ります。文字通りR、G、Bが重なって一枚のRGB画像として表示されます。
sizeで確認してみました。
640x480(row x col)の二次元行列がz方向に3つあります。

```matlab
>> size(img)

ans =

   640   480     3
```
各帯を取り出してみると以下のようになります。
左からRGB、R、G、Bです。それぞれでグレーの色合いが違うことがわかります。

```matlab
>> redBand = img(:,:,1);
>> greenBand = img(:,:,2);
>> blueBand = img(:,:,3);
>> imtool(redBand), imtool(greenBand), imtool(blueBand);
```
![s_threeBands.png](https://qiita-image-store.s3.amazonaws.com/0/63732/2c8f6455-6240-21c1-87d3-321aa7470ba2.png)

### グレースケール
じゃあグレースケール化するには単にRGBを平均すればいいの？というとそういうわけではないそうです。
**rgb2gray**という関数が用意されています。
下の画像はそれぞれ、左が単に平均したもの、右がrgb2grayを使ったものです。
ちなみにuint8は8bit符号なし整数に変換・doubleはそのまま倍精度です。
整数クラスのままでは数値演算に不向きのためdoubleにキャストし直します。

```matlab
>> avg = uint8((double(redBand)+double(greenBand)+double(blueBand))/3);
>> gray = rgb2gray(img);
>> imtool(avg), imtool(gray);
```
![s_avg_gray.png](https://qiita-image-store.s3.amazonaws.com/0/63732/4e5a54b2-562a-5ebe-b2c3-6dc3652356ca.png)

||白|黒|
|:-:|:-:|:-:|
|uint8|255|0|
|double|1|0|

> more realistic approximation of grayscale is given by the formula
**gray = 0.3R + 0.59G + 0.11B**

つまり**rgb2gray**は、よりリアルなグレースケールを上記の公式から導いて作ってくれます。

## 画像書き出し
加工した・作った画像を保存するには**imwrite**を使います。
第一引数に画像の変数、第二引数に保存したい名前をあてます。

```matlab
>> imwrite(gray, 'gray_bear.png');
```
Smalltalk でバブルソートを組んでみた

　ちょっと訳あって Smalltalk らしくなくしょうもないプログラムを作る必要があったので、書いてみました。

　一度は書いたことがあるはずなのに、いざ改めて書くとなると「あれ？これで合ってるんだっけ？」となったりしませんか？

```smalltalk
| arr length |
arr := #(8 4 3 7 6 5 2 1).
length := arr size.
Transcript clear.
1 to: length - 1 do: [ :i |
	1 to: length - i do: [ :j | | current next |
		current := arr at: j.
		next := arr at: j + 1.
		(current > next) ifTrue: [ 
			arr at: j put: next.
			arr at: j + 1 put: current.
		].
	].
	Transcript cr; show: arr.
].
```

出力はこんな感じ。

```
#(4 3 7 6 5 2 1 8)
#(3 4 6 5 2 1 7 8)
#(3 4 5 2 1 6 7 8)
#(3 4 2 1 5 6 7 8)
#(3 2 1 4 5 6 7 8)
#(2 1 3 4 5 6 7 8)
#(1 2 3 4 5 6 7 8)
```

入力値は Wikipedia の「バブルソート」の項から拝借しました。
マネジメントとしている意識している3つのこと


# tl;dr

メリークリスマス！
[オールアバウト Advent Calendar 2015](http://qiita.com/advent-calendar/2015/allabout)の最終日です！

今回、11月頃に新卒3〜4年目のメンバー達からなんか書いてくれと言われ、

- メンバーA：「できれば最終日になんか書いて欲しいです」
- 自分：「イヤだ」
- メンバーA：「ツラいです」
- 自分：「分かった」
- メンバーB：「去年のやつをチャチャッと変えて出せばいいんですよ！」
- 自分：「それはダメだろ」

という流れで最終日に書くことになりました。自由な部下を持って幸せです。
誰か一人くらい脱落するだろうと油断してたら、誰一人脱落することもなく24日まで来ました。
そういうわけで焦りながら書いている次第です。


# はじめに

さて、この記事では自分がやっていることを書こうと思います。

オールアバウトには現在35名ほどのエンジニアがいて、自分はそのマネジメントを担当しています。
（自分の上に担当役員がいます）

自分が普段考えていることを整理するいい機会だとも思いましたので、マネジメントで意識している所をいくつかピックアップしました。


この記事の対象読者は、

- マネジメントを目指している人
- 来年なることが決まっている人
- マネジメントになりたての人
- マネジメントとして苦悩している人
- マネジメントが何を考えてるか知りたい人

といった辺りの人達です。

## ゴールや目的を見失わない

さて、早速一個目です。
ひとつ目は「ゴールや目的を見失わない」事。

良くも悪くも、組織はマネジメントが向いてる方向に向かいます。
マネジメントが目的を定めてブレないようにしていると、たとえ時間はかかってもその方向に組織が進んでいく。
逆に、マネジメントが上司や部下の方を向いて仕事をしていると、その組織は向かうべき方向を見失います。
（その結果、自分自身をも見失うことに）

向かう方向がブレないようにするには、自分の中に軸を作りそれを守っていく事。
でもこれは"言うは易く行うは難し"で、ちょっと気を抜くとすぐにブレるので、あらゆる場面で常に意識することが重要だと考えています。

ちなみに自分が大事にしている軸はこの2つ。

- 提供しているサービスの価値向上（間接的なものも含め）
- 底上げに繋がること

これらをさらに掘り下げていくと、会社やサービスの成長に行き着く。
サービスの提供価値を高めた結果、会社が成長する、ということを忘れないようにしましょう。順番を間違えては行けません。


## 自分がやること・やらないことを決める

まず、自分自身の限られたリソースを何に振り向けるべきか、マネジメントは真剣に考えるべきだと思います。
その上でやること・やらないことを決め、やると決めたこと以外はできるだけ部下に任せる。

ちなみに、いま自分の中でやるべきことは「長期的なことを考える」事としています。
この中には、例えば底上げに繋がることや、採用なども含まれる。
逆にごく短期間で完結することは、たとえ重要であっても自分自身はそれほど関与しないようにしています。

もちろん、短期的な事を無視するという意味ではありません。
どのくらい短期的な事を重視するか（あるいはその逆か）は、その時の会社の状況によって判断するべきと考えています。


## 全体を薄く見る

マネジメントの規模が大きくなっていくと、自分自身の思いとは関係なく個別の案件に深く関わることは難しくなります（俺だってまだまだプログラミングやりたい）。
中途半端に関わると逆効果になったり、他のことが見えなくなって本来の役割が果たせなくなる。

そういう状況の中で意識している事は、

- 日常の意志決定は部下に任せていき、自分自身が直接関与する割合を減らす
  - 部下の成長も期待する
- リスクを把握し、やばそうな事が起こったら対応する
  - 多少であれば放っておく。トラブルは成長の糧

という辺りです。
全体を薄く見ておき、何が起こっているかを把握し、自分の軸は持ちつつも大半は部下に任せる・・・、といったことを今は意識しています。


# まとめ

ということで、結局役に立つか立たないんだかわからないけど自分が意識しているところをまとめました。
参考になれば幸いです。

偉そうに書きましたが、これらは自分がちゃんとやり切れているというものではなくて、意識しているものです。
決まった正解が少ない仕事なので、常に試行錯誤をしつつ、一歩一歩進んでいくしかありません。

そして、マネジメントは人や組織と向き合う仕事です。
プレッシャーがかかったり、それこそ文句言われたり・・・と、苦しい事も沢山あります。
と同時に、組織の中で限られた人しか与えられないステージでもあります。
そういう意味で、自分は普通の人より多くのチャンスを与えられているともやはり思うのです。

まだまだ未熟ではありますが、それを改めて認識し、来年も頑張っていこうと思います。

# 最後に

今年も1年間お疲れ様でした！！
QiitaでAdvent Calendarを書いた皆さんもお疲れ様でした。

それでは良いお年を〜〜〜！

（なんとか書ききった。というか技術情報でもなんでもないけど大丈夫だろうか・・）
fortranで配列の平均値計算を高速化


# 普通の書き方（昔ながらの書き方）
`real(4) :: data(N)`
のように，N個のデータが入った配列の平均値を求めるには，昔ながらの書き方だと，

```fortran
function mean(data) result(out)
    real(4), intent(in) :: data(:)
    real(4) :: out
    integer(4) :: i

    out = 0
    do i = 1, size(data)
        out = out + data(i)
    end do
    out = out / size(data)
end function mean
```

こんな物が真っ先に浮かぶだろう．
もしも`data`に欠損値があるのなら，

```fortran
function mean(data, undef) result(out)
    real(4), intent(in) :: data(:), undef
    real(4) :: out
    integer(4) :: i, N

    out = 0
    N = 0
    do i = 1, size(data)
        if(data(i) /= undef) then
            out = out + data(i)
            N = N + 1
        end if
    end do
    out = out / N
end function mean
```

こんな風に書ける．
しかし，これだと，いちいち`data`のメモリにアクセスするためあまり高速ではない．
fortranプログラムの高速化は，いかに組み込み関数や配列演算を駆使するかというのが基本らしいので，ちょこっとメモ．

# 欠損値のなしのデータの場合


```fortran
function mean(data) result(out)
    real(4), intent(in) :: data(:)
    real(4) :: out
    
    out = sum(data) / size(data)
end program mean
```

これは，簡単ですね．

# 欠損値ありのデータの場合

```fortran
function mean(data, undef) result(out)
    real(4), intent(in) :: data(:), undef
    real(4) :: out
    
    out = sum( data, mask = data /= undef ) / count( mask = data /= undef )
end function mean
```

組み込み関数のマスクを利用すれば，コードも短く，速度も速いらしい