OmniAICreator/Qiita-1.07M huggingface dataset:
Vagrantのファイル共有を良い感じに設定するVagrantfile

# 概要

タイトルの通り

Vagrantって、デフォでホストOSとゲストOSとのファイル共有機能「Synced Folders」なるものがあるんです。
でもそれ使うには設定必要なので、書いてみます。

# これだ

```:Vagrantfile
Vagrant.configure("2") do |config|
  config.vm.box = "centos/7"
  config.vm.network "forwarded_port", guest: 80, host: 8080
  config.vm.provider :virtualbox do |vb|
    vb.customize ["modifyvm", :id, "--memory", "2048"]
  end
  # ↑ここまでは今回関係ない

  # Sync folders↓ここから本題
  config.vm.synced_folder ".", "/vagrant",
  type: "nfs",
  rsync_auto: true
  # rsync__exclude: [".git/"]

  config.vm.network "private_network", ip: "192.168.33.10"
end
```

# 参考

https://stackoverflow.com/questions/40972345/vagrant-synced-folders-not-working-real-time-on-virtualbox#_=_

https://qiita.com/yashikawa7/items/b7a7d1a671106cd1a78a

https://teratail.com/questions/103825
Python3で作って理解するポートスキャン入門

#対象とする読者
+ nmapなどでport scanを試してみたはいいがいまいち実感がわかないっていう人

#この記事を読むのに必要な知識
+ pythonの基礎知識
+ pythonのsocketモジュールの使い方
+ ネットワークの基礎知識（必要に応じてわかんないとこを調べれば十分です。）

#この記事でやること
+ python3でシンプルなポートスキャナを作成してみること

#**警告!!!!**
絶対に他人のサーバーに対してポートスキャンをしてはなりません。このページのコードを実行して発生したいかなるトラブルにも責任は取りません。

#で、ポートスキャナとは何ぞや
インターネットでよく使われるプロトコルであるTCPやUDPは、ポートと呼ばれる仮想的な郵便ポストのようなものを使用しています。これによって、一つのPCで様々な通信を同時に行えるというわけです。このポートが開いているか（郵便ポストが手紙を投函できる状態か）を調べるのがポートスキャンです。

#シンプルなポートスキャナを作ってみよう
実際に簡単なポートスキャナを作ってみます。

```python3:simple-port-scanner.py
import socket

max_port = 6000
min_port = 1

target_host = input("Input target host name or address: ")

for port in range(min_port, max_port):
    #target_host のポート番号portに接続を試行
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    return_code = sock.connect_ex((target_host, port))
    sock.close()

    #socket.connect_ex は成功すると0を返す
    if return_code == 0:
        print("Port %d open!" % (port))

print("Complete!")
```
**警告**：必ず自分の管理するサーバor仮想マシンに対して実行してください。

注意：環境によっては実行にえらい時間がかかるので、必要に応じてmax_portをいじってください。あくまでポートスキャナについて理解するためのものなので悪しからず。

###解説
+ このコードを実行するとtarget_hostのmin_portからmax_portまでのポートに順に接続を試行して、接続が成功すれば（connect_ex()が成功すれば）そのポート番号を出力します。
+ このコードの実用上の問題点については補足で述べます。


#まとめ
+ 通常のポートスキャンでは普通に接続を試みることでポートが開いているか判断している。

#補足
上のサンプルコードの実用上の問題点は大きく分けて二つです。

### 実行に時間がかかる
このポートスキャナは１つ接続を試みてレスポンスを待ってそれから次のポート番号を試すので、非常に遅いです。localhostに向けて打つなら問題になりませんが、別のマシンに打つとすごい時間がかかります。この問題を解決には、マルチスレッド方式が一般的で、pythonでは、threadingモジュールを使います。詳しくはほかの素晴らしい解説サイトに譲りますので興味があればどうぞ。

### エラーハンドラが全くない　
socketモジュールのconnect_ex()メソッドはgaierror(ホストネームが解決不可の時発生)などを処理せずそのまま発生させます。なのでこれのエラーハンドラはあったほうがいいです。また、ポートスキャナは実行時間が長くなりがちなので、 KeyboardInterruptへのエラーハンドラも実装しておくと便利かもしれません。要は以下のようなコードを加えます。

```python3:改善例
import sys

#中略

try:
    for port in range(min_port, max_port):
        #中略


except KeyboardInterrupt:
    print("KeyboardInterruput.")

except gaierror:
    print("Error! host name or address is invalid.")

#以下略
```
フォーカスのあるメニューにactiveクラスを付加するヘルパーを作る

## やりたいこと
メニューの中で、自分が今いるページのメニュー名に"active"クラスをつけるヘルパーが欲しい。
よく忘れるのでメモです。今回はLaravel（Lumen）でやってます。

## 環境
・Laravel 5.5

## ヘルパーを作る
##### **１．app直下にファイルを作って、メソッドを追加**

```php:app/helpers.php
function isActiveUrl($url, $string = 'active')
{
    return \Illuminate\Support\Facades\Request::is($url) ? $string : '';
}
```

これだけ。


##### **２．autoloadしてくれるようにcomposer.jsonに書く**

```
"autoload": {
    "classmap": [
        "database"
    ],
    "psr-4": {
        "App\\": "app/"
    },
    "files": [
        "app/helpers.php" //追加
    ]
},
```


##### **３．dumpautoloadで読み込ませる**
コンソールでdumoautoloadを叩いて作ったファイルを読み込ませてあげます。

```
composer dumpautoload
```


##### **４．view側で使う**
" active " を吐き出させたい場所でメソッドを呼び出します。
渡すURLは * も使えます。

```
<li class="treeview {{ isActiveUrl('user*') }}">
    <a href="#">
        <span>ユーザ管理</span>
    </a>
    <ul class="treeview-menu">
        <li class="{{ isActiveUrl('user') }}"><a href="{{ url('user') }}"> ユーザ一覧</a></li>
        <li class="{{ isActiveUrl('user/create') }}"><a href="{{ url('user/create') }}"> ユーザ新規追加</a></li>
    </ul>
</li>
```
（↑で使ってるのはAdminLTE 2 のグローバルメニューです）


これがあれば意外に楽で助かってます。


## 余談
Lumenの場合はFacadeを読み込ませる設定を入れてあげないと動きませんので、あともう一手間かかります。
[LumenでFacade使う時に必要なおまじない](https://qiita.com/ishi8/items/5bb4dc4bd971de7d3a4c)
OpenFOAMのCavityチュートリアルのメッシュを台形にする

# PyGEM
* Python Geometrical Morphing.
* 1400万格子でも大丈夫！らしい
* MITライセンス
* ちょっとしたGUIもある

```bash
pip show PyGEM
```

```
Name: pygem
Version: 0.2
Summary: Tools to apply FFD.
Home-page: https://github.com/mathLab/PyGeM
Author: Filippo Salmoiraghi, Marco Tezzele
Author-email: filippo.salmoiraghi@gmail.com, marcotez@gmail.com
License: MIT
Location: /home/ubuntu/.pyenv/versions/anaconda3-4.3.1/envs/py35/lib/python3.5/site-packages
Requires: numpy, numpy-stl, scipy, matplotlib, enum34, Sphinx, sphinx-rtd-theme
```

Python3系利用する場合は2to3を使う

---
# メッシュモーフィングの準備
OpenFOAMのCavityケースでメッシュモーフィングを行う 
blockMeshコマンドを実行後、boundingBoxを見る

```bash
blockMesh|  grep boundingBox
```

```
boundingBox: (0 0 0) (0.1 0.1 0.01)
```

格子点データをコピーしておく。

```python

import shutil
from PyFoam.IPythonHelpers.Case import Case

case = Case("../cavity")
org_points_path = case.sol.polyMeshDir()+"/points_org"
points_path = case.sol.polyMeshDir()+"/points"
shutil.move(points_path, org_points_path)
```

---
# boundingBoxを定義する  

格子点が完全にコントロールボックス内に入るように少し大きめのコントロールボックスにする。

```python
import numpy as np
import pygem as pg
import pygem.affine as at

params = pg.params.FFDParameters()

e = 1.0e-6

params.rot_angle = np.array([0,0,0])
params.lenght_box =np.array([0.1,0.1,0.01]) + e
params.origin_box = np.array([0.,0.,0.]) -e

params.rotation_matrix = at.angles2matrix(
    params.rot_angle[2] * np.pi / 180,
    params.rot_angle[1] * np.pi / 180,
    params.rot_angle[0] * np.pi / 180)

params.position_vertex_0 = params.origin_box
params.position_vertex_1 = params.position_vertex_0 + np.dot(params.rotation_matrix, [params.lenght_box[0], 0, 0])
params.position_vertex_2 = params.position_vertex_0 + np.dot(params.rotation_matrix, [0, params.lenght_box[1], 0])
params.position_vertex_3 = params.position_vertex_0 + np.dot(params.rotation_matrix, [0, 0, params.lenght_box[2]])

params.psi_mapping  = np.diag(1. / params.lenght_box)
params.inv_psi_mapping = np.diag(params.lenght_box)
```

---
# 台形に変形するように設定する
cavityメッシュの正方形(xy平面)を台形にする
コントロールポイントと変形量をparamsに追加する

```python
params.n_control_points=np.array([2,2,2])
params.array_mu_x = np.zeros(params.n_control_points.cumprod()[-1]).reshape(params.n_control_points)
params.array_mu_y = np.zeros(params.n_control_points.cumprod()[-1]).reshape(params.n_control_points)
params.array_mu_z = np.zeros(params.n_control_points.cumprod()[-1]).reshape(params.n_control_points)

params.array_mu_x[0,1,:]  = 0.25
params.array_mu_x[1,1,:]  = -0.25
params.array_mu_x
```

```
array([[[ 0.  ,  0.  ],
        [ 0.25,  0.25]],

       [[ 0.  ,  0.  ],
        [-0.25, -0.25]]])
```

---
# 台形にする
格子点を書きこむ（元のファイルを上書きするような破壊的な使い方はできない）

```python
of_handler = pg.openfhandler.OpenFoamHandler()
points = of_handler.parse(org_points_path)

free_form = pg.freeform.FFD(params, points)
free_form.perform()
new_points = free_form.modified_mesh_points

of_handler.write(new_points, points_path)
```

---
# 台形になっていることをParaViewで確認する

<img src=https://qiita-image-store.s3.amazonaws.com/0/132571/f4640d1c-d38d-a689-5199-79cf2aaadb02.jpeg width=30% >


### 台形になった
量子コンピュータ Advent Calendar 2017 9日目


# 量子コンピュータについて思うこと

[量子コンピュータについて](https://drive.google.com/file/d/1ud0TQ--8w6WkT70ml5ruNj1pcxJjDC_a/view)

## 量子コンピュータの目的（めざすこと）
###１．アクセルワールド
ニューロリンカーの作成。ニューロリンカーとは、首輪型ウェラブルVR端末。脳細胞の１つ１つと量子結合し、脳に直接仮想現実を投影。
さらに、ブレインバーストプログラムにより脳を１０００倍に加速する。
つまり現実世界からVR空間に移動し、VR空間で約30分滞在後、現実世界にもどると１秒後の世界。
コンピュータの世界だけではなく、人間自体にイノベーションを起こす。そのために、量子コンピュータが必要。

[アクセルワールド](http://ascii.jp/elem/000/000/682/682512/)

なお、ブレインバーストプログラムには、量子コンピュータに加えて、脳解析が必要。脳解析は、全脳アーキテクチャ勉強会での研究に期待。

[第１９回全脳アーキテクチャ勉強会]https://wba-meetup.doorkeeper.jp/events/59985
田中先生の量子アニーリングのプレゼンと、計算限界の考察の資料がある。


###２．AI駆動型科学
量子コンピュータによって高速AIを可能にし、学習内容の設定だけで、コンピュータが自動的に科学研究を行う。新しい物理理論の発見や、新しいコンピュータアルゴリズムの開発がとてつもないスピードに加速される。

[AI駆動科学pdf](https://www.iias.or.jp/wp/wp-content/uploads/91f29d601636b593c6a5a61b02151486.pdf)
[AI駆動その１](http://itpro.nikkeibp.co.jp/atcl/column/17/011000004/011400003/?rt=nocnt)
[AI駆動その２](http://itpro.nikkeibp.co.jp/atcl/column/17/011000004/011400004/?itp_leaf_index)

## 量子コンピュータの今後

[究極の大規模光量子コンピュータ実現法を発明](https://www.jst.go.jp/pr/announce/20170922/index.html)

万能量子計算へ
[AQC 2016 - Avoiding Negative Sign Problem in Simulation of Quantum Annealilng](https://youtu.be/8dbfF9Y0-BE)

ライバルはDNAコンピュータ
[マンチェスター大学](https://news.mynavi.jp/article/20170308-a142/)
iOS11でカメラロールから写真が取得できない(PHImageManager)不具合の解決策

某Web系の会社の画像投稿系SNSサービスでエンジニアリングをしています。
今まで面倒でqiitaを書いてこなかったのですが、これから知見の整理として気が向いたら書いていこうと思います。

# カメラロールからPHImageManagerを使ってカメラロールの画像を取得できない場合がある。
iOS11がリリースされてから、カメラロールから画像が選択できないなどの声が多くなってきました。

iOS11のリリース以前もいくつかこういったユーザさんの声はあったのですが、iOS11から現象が多くなりました。

はじめは、カメラロールに大量に画像があることが問題なのか？と考えその線で調査していたのですが
PHImageManagerのロードをページングしたり、端末の空き容量がほぼないとアラートを出してストレージの残容量を確保していただいたりしていましたが、全くの的外れでした。

以下で、原因から解決策を解説していきます。

## 原因
iCloudフォトライブラリが原因でした。

<img width="220" alt="setting.png" src="https://qiita-image-store.s3.amazonaws.com/0/29037/e2ea4ec0-b548-2184-055e-7b41f1b458ac.png">

上のように、「iCloudフォトライブラリ」を有効にしていて、「iPhoneのストレージを最適化」を有効にしていると
起こりやすいです。

## 何が起きていたか
- iCloudフォトライブラリを有効にしている

この状態にすると、カメラロールの画像の実データが端末に存在せず、サムネイルのみ保持している状態が起こりうる状態になります。

ただ、これだけだとそんなにすぐに現象は発生しないので、以下のいずれかの状況が並行して起きている可能性が高いです。

- ストレージが圧迫気味
- 同じiCloudアカウントを複数の端末で使っている

ストレージが圧迫されていると、古いものから優先的に画像の実データをiCloudに飛ばされます。
また、同じiCloudアカウントを複数の端末で使っていて、別の端末で写真を撮影した場合にサムネイルだけ端末に存在する状況もあります。

### なんでiOS11からこの現象が増えたの？
おそらく、iOS11からiCloudフォトライブラリを有効にするようにiOSのガイドが仕向けているのでは？と言う結論に至りました。
困ったものですね...

実はこの現象なかなか再現させるのに苦労して、同じチームのデバッグ力がすんごい人に見つけてもらいました！
感謝！！

## 解決策

PHImageRequestOptionsのisNetworkAccessAllowedを有効にする。
これをしないと、端末に画像のオリジナルがない場合は取得することができません。
（今まで気づかなかったw）

```
let options = PHImageRequestOptions()
options.isNetworkAccessAllowed = true

// open var isNetworkAccessAllowed: Bool　// if necessary will download the image from iCloud (client can monitor or cancel using progressHandler). Defaults to NO (see start/stopCachingImagesForAssets)

PHImageManager.default().requestImage(for: asset, targetSize: imageSize, contentMode: .aspectFit, options: options, resultHandler: {
...
})
```


## おまけ
iCloudに画像の実データがある時は、画像取得に時間がかかるので、取得できるまではサムネイルを表示したりするといいですね。

```
PHImageManager.default().requestImage(for: asset, targetSize: imageSize, contentMode: .aspectFit, options: options, resultHandler: {

  if let degraded = info?[PHImageResultIsDegradedKey] as? NSNumber, !degraded.boolValue {
     // NOTE: - 指定したサイズの画像が取得できます
  } else {
     // NOTE: - サムネイルが取得できます。（呼ばれない時もある）
  }
})
```

requestIdなるものが帰ってくるので、非同期で実装していい感じなUXを提供したいところです。
LumenでFacade使う時に必要なおまじない

## やりたいこと
たいしたことがやりたかったわけじゃないんです……単純に、Facade使いたかっただけなんです……。
Laravelだったら何もせずに使えていたFacadeを、Lumenだと一手間いりますよ、というただそれだけの話。

## 環境
・Lumen 5.5

## 設定

```php:bootstrap/app.php
（省略）
$app->withFacades();
return $app;
```
なんのことはない、これだけです。
return される前に、

```
$app->withFacades();
```

入れるだけです。

これがないと、

```
A facade root has not been set
```

というエラーが出て怒られます。
……これに10分かけた。もったいない。
SWで出会った友達と一緒に細々とプロジェクトを続けている話

細々とプロジェクトを続けている話を書こうと思いましたが
最近では一緒にコードを書く回数より、お酒を飲みに行く回数のほうが多くなり
全く進んでません（笑）

とりあえずSWでの出会いから今までを書きます。

##SWでの出会い

今年の7月ぐらいにあったSWにて、自分は3日目だけのゲストとして参加。
たまたまそのとき発表をしていた友達（以下、S君としましょう）のアイデアに共感。

そのアイデアとは、
ピアノを演奏できるスペースを持っている人と
ピアノの演奏者および別の楽器だがピアノと合奏をしたい人を引き合わせるというものであり
演奏者が場所のレンタル代を払う際に、手数料を自分たちが取るビジネスモデルでした。

自分はピアノではないがギターを弾いていたこともあり、
家の近くとか外出先でレンタルスタジオよりも安く、
そして気軽に演奏できたら楽しそうだなぁと思い共感した。
ゆくゆくはピアノだけじゃなく、
ギターもあり（ギターのレンタルも可）にしてもらおうとこっそり思ってた。

ただ、S君は仕事もあるし、今は別にこのアイデアについてやる気はないとのこと。
ならしょうがないと思い連絡先だけ交換し、この日は帰った。


##プロジェクトスタート

それからもテキトーなやりとりが続いた後、
S君も自分も技術系で、営業やったことないからやっぱ新規事業は無理だよねぇみたいな話になった。
たまたま、営業ができる人を紹介したら、S君がやる気になってくれたのでプロジェクトがスタートした。

見込み客としてまず目を付けたのが、ピアノ教室の先生。
すでにピアノと場所を持っているし、レッスンでお金を稼いでいるので場所を貸すことも、
あまり抵抗なくやってくれるのではと思った。

ただ、さすがにサイトも何もない状態で営業するのはきついということになり、
自分とS君で最低限の機能を備えたサイトを作ることにした。

##プロジェクト停滞。。

自分は登録フォームとサービスの概要を説明するページだけ作ってとっとと営業してもらおうとしたが、
S君はまだ営業には踏ん切りがつかないということで、どんどんアプリの機能を作り込んでいく。

発案者のであるS君の踏ん切りが付くまで開発をしようと思っていたが
お客さんがゼロの状態でだんだんやる気が下がっていき、進まなくなっていった。。

##一応ここまでで作ったもの
https://github.com/strviola/muse_gate
イメージ
![IMG-2944.JPG](https://qiita-image-store.s3.amazonaws.com/0/208622/0b604767-9974-d950-01cd-6a2cf49784ab.jpeg)


##まとめ

書いてみて改めて気づいたが営業をするしないの決断や
営業活動自体について完全に人を頼りにしてしまっていたなと思う。

できないことでもいきなり人を頼ろうとせず、
できないなりにやってみるべきだった。

あとは例え悪い反応だとしても利用者からリアクションがあったほうが続くと思うので、怖がらずに利用者を見つけ出して話を聞かなきゃなと思う。が、やっぱり怖いw
【iPhoneX】FaceIDを実装してみた【iOS11】

#はじめに
こんにちは！
アドベントカレンダー初挑戦です！！
なんか共同で一つのものを作り上げている感じがして、
とても楽しくやっています！

さて本題ですが、今回はiPhoneXから新しい生体認証として導入された、
「FaceID」による認証をやってみようと思います。

まだまだSwift初心者ですので、間違っている部分があれば教えていただけると幸いです...！

#開発環境
- macOS High Sierra バージョン10.13.1
- Xcode9.2
- iPhoneX iOS11.2

#さっそくやってみよう

新しいプロジェクトを作成して始めていきたいと思います！

顔認証が成功すればテキストが変わる**超**無意味なアプリを作ってみますｗ
~~まあ生体認証の勉強なんでなんでもいいんですよ！~~

###必要な準備
FaceIDを使用する場合、ユーザー側に使用許諾を得る必要があります。

info.plistに下記項目を追加してください。
![スクリーンショット 2017-12-09 0.30.57.png](https://qiita-image-store.s3.amazonaws.com/0/206492/61597ded-dd4a-776c-235a-1047f58bde9d.png)

###FrameWorkのImport
iOS8から実装された、認証系のFrameWorkである**LocalAuthentication**をImportします。

```swift:ViewController.swift
import LocalAuthentication
```

###認証部分の実装
認証させるタイミング等、本来は考えないといけませんが、
今回は実験、かつとりあえず手を動かしてみようということで起動してすぐ認証させますｗ

```swift:ViewController.swift
    override func viewDidLoad() {
        super.viewDidLoad()
        
        let context = LAContext()
        var error: NSError?
        let description: String = "顔認証"
        
        // FaceIDが使用の使用可否を確認し、使用可能な場合のみ認証処理を行う
        if context.canEvaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, error: &error) {
            context.evaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, localizedReason: description, reply: {success, evaluateError in
                if (success) {
                    // 認証成功
                    print("顔見知りです。")
                } else {
                    // 認証失敗
                    print("初めまして。")
                }
            })
        }
    }
```

LocalAuthenticationのcanEvaluatePolicyで生体認証が可能かどうかを判定しています。

すごくシンプルですが、これだけで認証部分の実装は完了です。

#動かしてみた
起動と同時にこのアプリにFaceIDを使用していいかどうかが聞かれました。

![スクリーンショット 2017-12-09 1.10.07.png](https://qiita-image-store.s3.amazonaws.com/0/206492/24a99720-1556-af71-4a5e-cf3d5d0f95c8.png)

OKを押すとFaceIDの認証が始まります。

![スクリーンショット 2017-12-09 1.13.52.png](https://qiita-image-store.s3.amazonaws.com/0/206492/65f5eacd-daaf-af9f-1fe1-a8c22bcdf089.png)

今回はSimulatorで動かしたので、メニューからマッチングしなかった場合を確認してみました。

![スクリーンショット 2017-12-09 1.14.24.png](https://qiita-image-store.s3.amazonaws.com/0/206492/34cec3a9-6013-9a28-b775-12045d317fbf.png)

するとFaceIDをもう一度行うかキャンセルするかのダイアログが出てきました。

![スクリーンショット 2017-12-09 1.14.50.png](https://qiita-image-store.s3.amazonaws.com/0/206492/5366b483-728c-171e-7513-a8d649653533.png)

ここで認証をやめたり再実行したりとできるみたいです。

#最後に
こんな数行のコードで認証機能を実装できるとは思っていませんでした。
まあ簡潔に書きすぎたというのもありますが、生体認証を使用するハードルが高くないことが知れて良かったです！
iPhoneX...、まだまだ試してみたいことがいくつかあるので、次回以降記事にできればと思います！

最後までご覧いただきありがとうございました！

ではでは。
明るさ100%

デバイスドライバを初期導入後、
ディスプレイの明るさが５０％まで下がる事があります。
コマンド一発で戻らないかなと検索してみると
SCHEME と GUID の直書きばかりで呪文のようでした。
しかも GUID を「探して」なのでちょっと手間です。
そこで GUID をバッチで探して設定するようにしました。

現在の電源プランの明るさを100%に設定します。
※ バッテリ駆動、電源に接続の両方

明るさのスライドバーを動かすと即時反映されますが
バッチでの反映は再起動後になります。

```bat:BlightNoa.cmd
rem /;
rem /; 明るさ100%
rem /;

for /f "tokens=3" %%0 in ('Powercfg /query ^| findstr /i /r /c:"^電源設定の GUID:"')          do set 選択されたプラン=%%0
for /f "tokens=3" %%0 in ('Powercfg /query ^| findstr /i    /c:"(ディスプレイ)"')             do set     ディスプレイ=%%0
for /f "tokens=3" %%0 in ('Powercfg /query ^| findstr /i    /c:"(ディスプレイの明るさ)"')     do set     ディスプレイの明るさ=%%0

Powercfg  -SetACValueIndex  %選択されたプラン%  %ディスプレイ%  %ディスプレイの明るさ%    100
Powercfg  -SetDCValueIndex  %選択されたプラン%  %ディスプレイ%  %ディスプレイの明るさ%    100
```
【Java】エラーメッセージをちゃんと読んでいますか？【スタックトレースの読み方】

# はじめに
一生懸命書いたプログラムがエラーを吐いたとき、そのエラーメッセージをちゃんと読んでいますか？
「英語だからやだー:confounded:」って逃げていませんか？
そういえば、エラーの読み方って研修とかで教わらないような気がします。
エラーメッセージは全部英語ですが、ポイントさえ押さえればちゃんと解読できます。
（英語だからって）<font color="#FF3366"><b>逃げない、向き合うの</b></font>

# エラーメッセージを読む順序
以下のエラーサンプルを使って、順を追って読んでいきましょう:notebook_with_decorative_cover: 
※新人さん:beginner:向けの内容（のつもり）なので、ゆっくりペースでエラーを読んでいきますね。

```java:サンプルプログラム.java
package section01;

import java.util.Random;

/*
 * ランダム配列の生成
 * オーダー：2Nパターン
 */
public class practice4 {

	public static int NUM = 10;
	
	public static void main(String[] args) {
		int[] numArray = new int[0]; /* 要素数ゼロの配列を宣言している */
		Random random = new Random();
		
		int i, randomNum;
		for(i = 0 ; i < NUM ; i++) {
			numArray[i] = i; /* ここでexceptionが発生する */
		}
		
		for(i = NUM-1 ; i > 1 ; i--) {
			randomNum = random.nextInt(NUM-1);
			int tmp = numArray[randomNum];
			numArray[randomNum] = numArray[i];
			numArray[i] = tmp;
		}
		
		for(i = 0 ; i < NUM ; i++) {
			System.out.println(Integer.toString(numArray[i]));
		}
	}
}
```

```text:エラーサンプル
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 0
	at section01.practice4.main(practice4.java:20)★
```

## １）エラーメッセージのスタート地点までゆっくり戻る
エラーメッセージが一通り出力された状態では、カーソルが一番下まで下りています。
サンプルでいうと、`(practice4.java:20)`の次にある★の個所です。
なので、画面をスクロールして、エラーメッセージが出力されたスタート地点までゆっくり戻りましょう:arrow_left:慣れれば一気に戻れるようになります。
マウス:mouse_three_button:のホイールをぐりぐりしながら、全体像を見てください。
ちなみに、サンプルなので２行で終わってますが、フレームワークを使っているともっとたくさん出てきます:computer: 

## ２）一番先頭にある「Exception」や「Error」の文字を探す
サンプルでいうと`Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 0`の個所です。
他には、

- NullPointerException
- NumberFormatException
- OutOfMemoryError

などなど。
これが、エラーの内容になります。
意味不明で構わないので、まずはException / Errorを探してください。
大事なのは、「意味わかんないけど、NullPointerExceptionっていうエラーが発生しているんだな」と認識することです。

## ３）動かしたプログラムのクラス名を探す
Javaに限らず、たいていのプログラミング言語は、エラーが発生した場所を「どのファイルの何行目か」って出力してくれます。
なので、まずは自分が動かしたプログラムのクラス名を探しましょう :exclamation:
サンプルだと`at section01.practice4.main(practice4.java:20)`の個所です。
ここまでくれば、

- practice4.javaの20行目でエラーが発生している。
- エラーの内容は「ArrayIndexOutOfBoundsException」である。

の２つがわかったので、`practice4.java`の20行目で発生している、`ArrayIndexOutOfBoundsException`を解消するようにプログラムを修正してください:stuck_out_tongue:
わからなければ、「○○のn行目で△△というexceptionが発生したのですが、どうやって解消すればいいですか？」って聞いてしまいましょう。

# エラーメッセージの勘
毎回ググってると、だんだん覚えてくるので、毎回ググるようなことはなくなってきます。
そうすると、単語の一部を見ただけで「自分がどんな間違いをしているのか」という見当がつくようになってきます。
さらに、たいていのプログラミング言語 or SQLは、エラーメッセージに似たような英単語を使っていることが多いので、言語問わずある程度の推測が可能になります。

意味や読み方がわからなくてもエラーの内容がわかるようになりますよ:star:
Goのパッケージパスとパッケージ名は異なってもよいか？

# ふと疑問に

Goではパッケージパスの最後の要素は配下の（goファイルの）パッケージ名と同じにするのが慣例だが「異なっていてもよい」のでしょうか？

# では確認を

パスツリー

```
$GOPATH/
   +--src/
      +--japan/
         +--main.go
         +--area/
            +--chugoku.go
```

## 変更前：パッケージパスの最後の要素とパッケージ名が同じ

最後の要素：area
パッケージ名：area

```area/chugoku.go
// パッケージ名：area
package area

import "fmt"

func Okayama() {
	fmt.Println("ピーチ")
}
```

```main.go
package main

import (
	// パッケージパスの最後の要素：area
	"japan/area"
)

func main() {
	// パッケージ名：area
	area.Okayama()
}
```

実行結果

```
$ go run main.go 
ピーチ
```

## 変更後：パッケージパスの最後の要素とパッケージ名が異なる

最後の要素：area
パッケージ名：chugoku

```area/chugoku.go
// パッケージ名：area -> chukoku
package chugoku

import "fmt"

func Okayama() {
	fmt.Println("ピーチ")
}
```

```main.go
package main

import (
	// パッケージパスの最後の要素：変更なし
	"japan/area"
)

func main() {
	// パッケージ名：area -> chugoku
	chugoku.Okayama()
}
```

実行結果

```
$ go run main.go 
ピーチ
```

# 結論としては

import文ではパッケージでなくパス名（文字列なのも納得）を指定しているため、パッケージパスの最後の要素は配下の（goファイルの）パッケージ名と「異なっていてもよい」です。

直近で見ていた [mackerel-agent-plugins](https://github.com/mackerelio/mackerel-agent-plugins) でも使われていました。
速習 Java 「入門？」その3プログラミングから離れた話をするお

# コードを書くことは慣れたかな？
最初は、なんとか処理を書ければいいよ。
きれいに書くには様々なコードを読み、学習を積み重ねていって、
初めてできることだから。

# 書いてたら、ぐちゃぐちゃになってもとに戻したくなった
頭の中が整理できていない状態で、なんとなくで書き始めることはよくあることで
整理するために書いていたコードがぐちゃぐちゃになってしまった、もとに戻したい・・・
よくあること。

開発の現場では、ソースコードはバージョン管理が行われていて、
修正の履歴が常に残っている状態になっている。
仕事でコードを書く人は、必ずバージョン管理ソフトに慣れ親しんでいなければいけない。

# バージョン管理？
技術者じゃない人にはなんのことだろうと思う。
簡単に説明すると、コミットという単位で記録した結果を保存しておく仕組み。
コミットした単位で好きに戻したりすることもできるし、コミットの単位で比較して
修正内容を把握することもできる。

# 要するに、必須知識だ。
さて、どこから勉強するのがいいか以下のサイトが丁寧に解説されている。
https://www.backlog.jp/git-guide/

# 宿題 Github上でソースコードを管理できるようにしよう
以下のサイトに登録してサービスを利用できるようする
https://github.com/github

とりあえずはmasterをプッシュして管理できる状態まで持っていこう。
Githubっていうのは、ソースコードを公開しているなら無料で使えるGitサービスだ。
開発の現場でも使われている。

こんな感じで管理できるようになればOK
![git.PNG](https://qiita-image-store.s3.amazonaws.com/0/113470/7a57e58d-d7dd-0bb5-9065-cfc47357a90f.png)

# 宿題 IDEからcommit、pushできるようにしよう
EclipseなりIDE上から作ったGithub上のブランチにアクセスできるようにする。

# Gitクライアントについて

## SourceTree
https://ja.atlassian.com/software/sourcetree
グラフィカルで初心者にも扱いやすいが、Windowsだと動作が重い
Macでは軽快に動作する。

## Git
https://git-scm.com/
コマンドラインで操作を行うことになるが、本腰を入れて学習するなら
コマンドラインでの学習は必須といえる。
[bukuroswift] BUKURO.swift 2017-12

<p>017年12月6日（水）の夜間、東京都豊島区の<a title="池袋コワーキングスペース OpenOffice FOREST" href="http://co-forest.com/">池袋コワーキングスペース OpenOffice FOREST</a>において、「<a href="https://cocoa-kanto.connpass.com/event/71296/">BUKURO.swift 2017-12</a>」を開催致した。</p>

<p>発表は、以下の通り。</p>

<dl>
    <dt>ぼっち開発について</dt>
    <dd>今回からMAKERS関連の発表をしていこうとなったのだが、それに賛同して用意したのが『ぼっち開発について』。<br />
紹介しているのは日誌を書くこと。自分はこういう話を聞くと、直ぐに日誌をどう実装するかと脱線してしまうが、そんなことにならないように、来年こそは頑張らないと！という気持ちになった。</dd>
    <dt> Swiftリファレンスを作っています </dt>
    <dd>Swiftは仕様が複雑だ！書籍の説明は申し訳ないが冗長だ！だったら自分でリファレンスを作ればいい！githubで公開すれば、執筆手伝ってくれるかも！<br />
ということで、始めた。
<a href="https://github.com/murakami/Swift_in_a_Nutshell">Swift_in_a_Nutshell</a></dd>
    <dt>Swiftで線形代数</dt>
    <dd>自分の欠点は分かっている。目的があったのに、その手前で興味が赴くままに進んでしまう。神経回路網の数理をやりたいのに、その基礎となる線形代数から始めてしまう。BLASを使った例だ。</dd>
    <dt>TensorFlowについて</dt>
    <dd>GoogleのMachine Learning Developer Meetupに参加してきた。ただ、TensorFlowそのものより、登壇された伝説のJeff Dean氏の話題で盛り上がってしまった。<br />
彼のキーボードはキーが二つしかないそうだ。0と1！
gccの最適化オプション-o4を指定すると、彼にソースが送られ、最適化されて返ってくる！</dd>
    <dt>BUKURO.makers</dt>
    <dd>ものづくり関連として、昔販売されていた左手で操作するSmartScrollという機器をSwiftでI/O KitのUSB Device Interface使って利用する挑戦が発表された！</dd>
    <dt> 三次元グラフフィックスの相談 </dt>
    <dd>参加者からの相談で三次元グラフィックスについて、議論が白熱した。これについては、機械をみて、取り上げたいと考えている。</dd>
    <dt> Xcodeのバージョンをあげたら単体テストで警告が </dt>
    <dd>これも参加者からの相談。皆で解決策を探った。</dd>
</dl>

関連情報
<a href="https://qiita.com/advent-calendar/2017/cocoa">Cocoa Advent Calendar 2017</a><br />
<a href="https://cocoa-kanto.connpass.com">Cocoa勉強会 BUKURO.swift (connpass)</a><br />
<a href="https://atnd.org/groups/cocoa-study">Cocoa勉強会 BUKURO.swift (ATND)</a><br />
<a href="http://cocoa-study.peatix.com">Cocoa勉強会 BUKURO.swift (Peatix)</a><br />

【Cocoa練習帳】
<a href="http://www.bitz.co.jp/weblog/">http://www.bitz.co.jp/weblog/</a><br />
<a href="http://ameblo.jp/bitz/">http://ameblo.jp/bitz/</a>（ミラー・サイト）<br />
<a href="https://t.co/6P3h2jtbRk>note</a><br />
<a href="https://qiita.com/m_yukio>Qiita</a><br />
systemd-nspawnでレガシー(Not systemd)なコンテナを動かすには

[systemd-nspawn Advent Calendar 2017](https://qiita.com/advent-calendar/2017/systemd-nspawn) 6日目の記事です。

systemd-nspawnはsystemd採用のコンテナ以外でも動かせますというお話し

upstart採用のcentos6を動かしてみます
今回もDockerhubにあったcentos6のイメージをインポートしておきます

```bash
cd /var/lib/machines
# os-releaseが無いと起動しないので入れておきます
curl -L https://goo.gl/D6rtHR > centos6/etc/os-release
# 必要そうなやつ入れておく
yum install openssh-server
# initで処理したいものを書いておく
curl -L https://goo.gl/bvi8bq > centos6/sbin/init
chmod +x centos6/sbin/init
systemd-nspawn -D centos6 -b --network-bridge br0
```

yum install upstartしてからupstartから全部上げる方法もありますが、よくこんな方法で起動しています
要は/sbin/initに立ちあげたい処理を書いて、起動しっぱなしにしとけばいいだけです
ゲームデザイナーのための空間設計

# ゲームの教科書

日本語だとなかなか当たり外れの激しいゲームプランナー向けの教科書に良い本、
海外だと学問として体系だっているらしいこともあってか翻訳本で当たりを引いたので紹介

<a target="_blank"  href="https://www.amazon.co.jp/gp/product/4862462618/ref=as_li_tl?ie=UTF8&camp=247&creative=1211&creativeASIN=4862462618&linkCode=as2&tag=arvanista-22&linkId=1435a01df37e7504b9e55ec0b563b3e4"><img border="0" src="//ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&MarketPlace=JP&ASIN=4862462618&ServiceVersion=20070822&ID=AsinImage&WS=1&Format=_SL250_&tag=arvanista-22" ></a><img src="//ir-jp.amazon-adsystem.com/e/ir?t=arvanista-22&l=am2&o=9&a=4862462618" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />

# 書評
ゲームの作り方、というタイトルで本を書くと必要な技術から企画のやり方からキャラクターの制作、パブリッシングとすごく広くなりがち。本書はその中でも企画、特にユーザがゲーム内でどこを目指すか、どういう風に経験を積んでいくか(レベルデザイン)を、言葉に依らず空間の設計によって演出する方法に焦点をあてている。

例えばマリオは1-1より8-1のほうが断然難しい。
例えばドラクエは故郷の近場はスライムしかいないが、魔王城の近くは屈強なモンスターしかいない。
ゲームを始めたユーザはまずどちらからスタートするか？もちろん前者、簡単なところで戦い方、成長の仕方を学んで徐々にステップアップしていく。

おそらく今後の記事もこいつにちなんだようなものになっていく気がする。その初心ということでひとつ。
node-devを用いてVirtualBox上のNodeアプリを自動再起動する方法

# はじめに&結論
`node-dev`というツールがあります。

これを使えば、Node.js製のアプリのソースコードに変更があった際に自動再起動してくれる優れものです。`Express.js`や`Koa.js`を使ったAPIサーバー開発時に有用なツールです。
まぁ他にも`pm2`とか`nodemon`とかあるっぽいですが、とりあえずまずはこれを試してみようと思ったわけです。

簡単な使い方としては次のような感じです。

```bash
yarn add -D node-dev # ローカルにインストール
npx node-dev index.js # これ以降、ファイルを編集すると自動再起動する
```

このツールをVirtualBox上で動いているNode.js製サーバーに対して使って、ホスト側で編集をする！という開発スタイルを取ってみようかと思ったら、なんと自動再起動してくれないではありませんか。

ググったら、GitHubで次のようなIssueが見つかりました。

[Using node-dev in a shared folder in a virtualbox guest #87](https://github.com/fgnass/node-dev/issues/87)

ははーんなるほどね、VirtualBoxがファイルの更新イベントを発火してくれないわけね、なるほど（多分）。

下の方で`polling`がどうのって話をしているので、リポジトリのトップのREADMEを表示して`poll`で検索したら解決策が見つかりました。

`--poll`オプションをつければVirtualBox上でも自動再起動ができるようです。
2つ注意しないといけないのは、実行するファイル名より前に`--poll`オプションをつけないといけないというところと、`--poll`オプションはCPUを食うようです。

```
npx node-dev index.js --poll # NG
npx node-dev --poll index.js # OK
```

以上です。
fluentdのconfのDSL記法は通常のconfからinclude出来ない

古いサーバのリプレース作業中に、行数の多いfluentdのconfを見つけました。
中身はsource指定で多数のログファイルをtailしている部分が大部分を占めているため、
Ruby DSL記法で書くと良いかもしれない、と試してみました。
参考: [FluentdでRuby DSLを使う](https://qiita.com/toyama0919/items/10616cb9025cb9cecd69)
以下のようになりました（架空のものです）

```ruby:config.rb
sources = %w(device request response)

sources.each do |log_type|
    source {
        type :tail
        path "/var/log/game/#{log_type}.%Y%m%d"
        tag log_type
    }
end
```

書きつつコマンドラインから-cで指定して、読み込ませて想定通りのconfになっていることを確認し
いざ配置してみるとエラー、スタックトレースを見ると…
あれ？通常のconf用のv1_parserが動いてる？

実はこのサーバの大本のconfでは最低限の設定を記述し、各サーバで必要な部分については別ファイルに書いたものをincludeするようにされていました。
通常のconfを読み取るv1_parserのソースを見てみると

```ruby:v1_parser.rb
def eval_include(attrs, elems, uri)
  u = URI.parse(uri)
  if u.scheme == 'file' || (!u.scheme.nil? && u.scheme.length == 1) || u.path == uri # file path
    # When the Windows absolute path then u.scheme.length == 1
    # e.g. C:
    path = u.path
    if path[0] != ?/
      pattern = File.expand_path("#{@include_basepath}/#{path}")
    else
      pattern = path
    end
    Dir.glob(pattern).sort.each { |entry|
      basepath = File.dirname(entry)
      fname = File.basename(entry)
      data = File.read(entry)
      data.force_encoding('UTF-8')
      ss = StringScanner.new(data)
      V1Parser.new(ss, basepath, fname, @eval_context).parse_element(true, nil, attrs, elems)
    }
  else
    require 'open-uri'
    basepath = '/'
    fname = path
    data = open(uri) { |f| f.read }
    data.force_encoding('UTF-8')
    ss = StringScanner.new(data)
    V1Parser.new(ss, basepath, fname, @eval_context).parse_element(true, nil, attrs, elems)
end
```
https://github.com/fluent/fluentd/blob/master/lib/fluent/config/v1_parser.rb
と、includeされたファイルをV1Parserに渡していました。
一方DSLパーサのソースでは

```ruby:dsl.rb
def include(*args)
  ::Kernel.raise ::ArgumentError, "#{name} block requires arguments for include path" if args.nil? || args.size != 1
  if args.first =~ /\.rb$/
    path = File.expand_path(args.first)
    data = File.read(path)
    self.instance_eval(data, path)
  else
    ss = StringScanner.new('')
    Config::V1Parser.new(ss, @proxy.include_basepath, '', nil).eval_include(@attrs, @elements, args.first)
  end
end
```
https://github.com/fluent/fluentd/blob/master/lib/fluent/config/dsl.rb
のように、includeされるファイル名の末尾を見て、V1Parserに渡すかDSLに渡すかを分けていました。

今回のケースでは、ベースのconfから個別のconfをincludeする運用は変更したくなかったため、
DSL記法を止め、confの整理をすることとしました。
v1_parserのinclude部分を修正することも試してみたいと思います。
LottieアニメーションをTableViewCell内で動かしてみた

## はじめに
・<a href="https://qiita.com/advent-calendar/2017/love_swift">Swift愛好会 AdventCalendar 2017</a>の9日目の記事です。
・Airbnbが開発したアニメーションライブラリの<a href="https://www.lottiefiles.com">Lottie</a>を使って、TableViewのCell内でアニメーションさせるぞい！という趣旨です

・今回使ってみたのは<a href="https://www.lottiefiles.com/433-checked-done">こちら</a>

## 開発環境
・Xcode ver9.1
・Swift ver4.0.2
・lottie-ios ver2.1.0

## 作ったヤツ
![bbb.gif](https://qiita-image-store.s3.amazonaws.com/0/57541/b7f341f4-0605-6cf7-e35d-2b812134eec1.gif)


~~<b>※<a href= "https://itunes.apple.com/jp/app/日課メーター-for-三日坊主/id1172147993?mt=8">日課メーター</a>に鋭意実装中のためまだ公開できるソースはありません🙇 
今月中にはgithubにあげますゴメンなさい🙇 🙇 </b>~~
→上げました！ https://github.com/tony1224/LottieAnimationSample

## 処理抜粋
```HogeCell.swift

    var anim = LOTAnimationView!

    // 既存のチェックボックス部品
    @IBOutlet private weak var checkbox: UIImageView!

    override func awakeFromNib() {
        super.awakeFromNib()

        anim = LOTAnimationView(name: check_done)

        /**
         * サイズ設定事情
         * lottieファイルのサイズがでかかったため、既存の部品(checkbox)にねじ込んでます(暫定対応)
         */
        anim.frame = CGRect(x: 0, y: 0, width: 120, height: 120)
        anim.contentMode = .scaleAspectFit
        anim.center = checkbox.center

        checkbox.addSubview(anim)
    }

    // 表示処理(cellForRowで呼ばれる)
    func setData(fuga: Fuga) {
        titleLabel.text = data.title

        if fuga.isDone {
            // チェック済の場合、progress値を最大値にしてアニメーション後を表現
            anim.animationProgress = 1.0
        } else{
            // 未チェックの場合、明示的にアニメーションを停止状態にする
            anim.stop()
            }
        }
    }

    func animateCheckbox() {
        self.anim.play()
    }
    
    func stopAnimCheckbox() {
        self.anim.stop()
    }
```

```ViewController.swift

    // 各セルに表示したいデータのリスト
    private var todoList = [Todo]()

    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        let currentTodo = self.todoList[indexPath.row]
        let title = currentTodo.title
        let isDone = !currentTodo.isDone
        let newTodo = Todo(title: title, isDone: isDone, index: indexPath.row)
        
        // 対象のCellを取得しAnim実行
        let cell: LottieSampleCell = self.tableView.cellForRow(at: indexPath) as! LottieSampleCell
        if isDone {
            cell.animateCheckbox()
        } else {
            cell.stopAnimCheckbox()
        }
        
        self.todoList.remove(at: indexPath.row)
        self.todoList.insert(newTodo, at: indexPath.row)
    }
```

## 最後に 
<img src="https://qiita-image-store.s3.amazonaws.com/0/57541/9a5a0e2f-457c-17b7-6c77-bf4236a345d4.jpeg" width=50%>

・今年は夏に主催された<a href="https://togetter.com/li/1144840">海辺でもくもく in 茅ヶ崎</a>にお邪魔させて頂きました。
・台風を誘き寄せない愛好会パワー、もくもく会の合間に作って頂いた料理の美味さ、<b>カレーで乾杯は可能</b>であることを知ることができました。
・また来年も愛好会イベントに参加することが出来るよう~~PMを騙くらかし~~いつでも動ける準備をしたいと思います。

・メリークリスマス🎄🎅&良いお年を🌄🎍
アドベントカレンダーをやる意味を考える


どうも、おはこんばんちは。
福岡にある株式会社diffeasyでエンジニアをやっている新谷と言います。

弊社でもアドベントカレンダーなるものをノリでやってみようということになりました。

しかし、タイトルの通り、とりあえずやるとして、その意味や意図は何かまで自分を含め弊社メンバーも分かっていないので、今回はそこを考えてまとめていこうと思います。

# アドベントカレンダーとは？
[アドベント - Wikipedia](https://ja.wikipedia.org/wiki/%E3%82%A2%E3%83%89%E3%83%99%E3%83%B3%E3%83%88)
[アドベントカレンダー - Wikipedia](https://ja.wikipedia.org/wiki/%E3%82%A2%E3%83%89%E3%83%99%E3%83%B3%E3%83%88%E3%82%AB%E3%83%AC%E3%83%B3%E3%83%80%E3%83%BC)
Wikipediaにページがあるので詳細は↑へ。

そもそもアドベントとは、イエス様の降誕を待ち望む期間のことで、毎年12/1〜12/24(or25)あたりを差すそうです。
アドベントカレンダーはその期間中に一日づつ何かしらのアクションをするためのカレンダー。

# IT技術者界隈におけるアドベントカレンダーの起源
[日本における技術系アドベントカレンダーの歴史](http://yhara.jp/2016/12/01/history-adcal-jp)
アドベントカレンダーの歴史を知りたい方は↑へ。

起源としては、海外のPerlコミュニティがやっていた事を日本のPerlコミュニティが2008年にマネしてやり始めたのが日本における初めてのアドベントカレンダーみたいです。

# IT技術者界隈でアドベントカレンダーをやる意味
自分なりに考えてみました。

- 現在、自分が持っている知識を共有&披露。
- コミュニティor組織外の人に、どんな活動をしているか知ってもらう。
- 記事(ドキュメント)として残すことで、忘れたりした時に振り返れる。

[アドベントカレンダーとは？12月こそエンジニアが情報発信するチャンス【LIGも参戦中】](https://liginc.co.jp/212709)
この記事を読むと、広報的側面もあるみたいです。

# まとめ
現在持ってる知識をバンバン披露するもよし、期限までに勉強した内容を披露するもよし。
そうすることで、反省点が見えたりして次回(？)に向けてスキルアップするモチベーションになるのではないでしょうか。

アドベントカレンダーが、参加する皆にとって有意義なイベントになればいいですね( ´∀｀)
Power BIで米マップ

前回のPower BI 勉強会にて、地図についてお話したのですが、その中で手ごろな題材として、農産物の全国統計を使いました。ちょうど子供に社会の勉強を教えていて、「りんごの生産量一位は？」などと、覚えていたので、地図帳のようなイメージのマップが親しみやすいのではと思ったわけです。

# 米マップコンセプト

PowerBIファイルに農林水産省から提供される各種統計データを載せていたのですが、これが結構色々あって、探すのが大変でした。Shape Mapをやるときに旧国のマップを利用して、変わったポリゴンの地図を作ることも題材としていましたが、それを使っているうちに、これと都道府県のマップを混在したいと思いました。

Wikipediaにあった、江戸時代の旧国の石高統計とShape Mapを組み合わせ、以下のような石高マップを完成させました。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/146939/f9e86b5c-3507-cf68-f9e4-758a40794db2.png)

## 連続性

そして、農林水産省の水稲生産高データを用いて、時系列を見たところ、意外にも明治以降のデータと連続的に見ることができました。江戸時代の統計と明治以降では集計方法も違うだろうし、測り方も違うだろう、と思っていましたが、これは面白いと思いました。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/146939/98ec470c-dc3c-8442-0299-a22398ad1e09.png)

ざっくりいうと、江戸時代は飢饉などもなくはなかったが、石高自体は増加、明治以降、人口増加とともに急激に生産量を増やしたが、１９７０年代以降、減反や洋食化の影響で生産量を下げてきたという流れがよくわかります。


# シェイプマップの”消える”特性を利用して重ね合わせ

ここまできれいに出たなら、このマップを旧国と都道府県でシームレスに見えるようにと考えました。

明治以降は以下のように通常の塗分けマップ、
![image.png](https://qiita-image-store.s3.amazonaws.com/0/146939/721f6b52-e61c-675a-455a-9c7dd3bfd2ce.png)

江戸時代は以下のようにその上にシェイプマップが出るようにしました。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/146939/1a94dee0-921a-554a-87ad-c5ae0d6401e3.png)

シェイプマップにアサインされた値が何もない場合は、シェイプマップを消すことができます。設定で以下のように、既定の色を表示オフにすると透明色が選択され、データがない場合は何も表示されなくなります。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/146939/79f363b6-6417-081a-60ea-dad1eb2f6548.png)

旧国が選ばれている場合は表示、それ以外は非表示になるシェイプマップが完成しました。

# 完成系

これで完成形になります。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/146939/98c950d2-9515-1f3e-1032-d0359c3e2a1a.png)

各旧国時代と対応する県の比較などは、難しく、マップ上で二か所を選択するなど、煩雑な操作が必要になります。
以下はフィルタを使って群馬県と上野国を選択したものです。シースルータッチなどはできないので、今後に期待ですね。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/146939/d74efb6c-d546-052c-441a-acb2c7ab7412.png)

# ファイル

[pbixファイル](https://1drv.ms/u/s!Apl2RhES5hB9iIlDK3YJg3_8uv0MWQ)

[農林水産省 作況調査(水陸稲、麦類、豆類、かんしょ、飼肥料作物、工芸農作物) 長期累年](http://www.e-stat.go.jp/SG1/estat/List.do?bid=000001024932&cycode=0)
PeerCast プログラミング配信 Advent Calendar 2017 8日目

[昨日](https://qiita.com/fusuya/items/daedd01c09bb9aa3d91d)の続き

AI側作ろうと思ったがまずはAIに送るjsonデータの生成で躓いた。
jsonデータの作り方の仕様とかってあるんだろうか

AIひとつだけならちゃんと動いたが
AIを二つにしたらめちゃくちゃな動きになった。
次はこれを解決したい
Web Beacon で情弱を消し去りたい

この記事は私の所属する研究室,田胡研究室のアドベントカレンダー8日目の記事です.
[adventar.org](https://adventar.org/calendars/2429)

# はじめに
弊研では,情報の共有のツールとしてメーリングリストや Wiki を使用しています.
結構大事な情報を発信しているのですが悲しいことに見てないと言われることが多いんですよね...

そこで,どれくらいの人が情報をチェックしたかを調べる方法を求めてみました.(決して監視したいわけではありません!)
簡単にかけそうなものとして,**Web Beacon**を作って見ようと思います.

# Web Beacon とは
原理は簡単です.
Wiki などに imgタグを仕込み,その画像データを返すサーバ上でHTTPヘッダなどの情報を抜くだけです.
アクセス時刻,端末,IP など以外にも多くの情報が~~抜きとれ~~ 得られます.

# 実際に書いてみた
Rails アプリのコントローラー部分になります.Herokuで動かすとわりと一瞬で完成!!

```rb:beacon_controller.rb
require "json"

class BeaconController < ActionController::Base
  TRANSPARENT_GIF = "R0lGODlhAQABAPAAAAAAAAAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw=="

  def get_log
    logs = {}
    request.headers.sort.map { |k, v|
      logs.store("#{k}","#{v}") unless Settings.accepts_headers["#{k}"]
    }
    params.delete(:action)
    params.delete(:controller)
    logger.info("#{Time.zone.now} #{logs.to_json} #{params.to_json}")
  end

  def show_gif
    get_log
    send_data(Base64.decode64(TRANSPARENT_GIF), type: "image/gif", disposition: "inline")
  end
end
```

show_gif 関数の部分がgifを返す関数でその中で時刻,Railsのログ,クエリ を出力する処理をするget_log関数を呼ぶだけです.
もっといろいろイタズラできそうですね.

# 本当は実行画面貼りたかった
家ネットが死んで繋げない!!!!
そのうち追記します...すみません

# 最後に
内容がないよ〜〜〜
研究室で動かす際にはLDAP名とって,Slackへ通知する機構まで備えたいですね...
これでメール見ない人を撲滅したいです(本音)

明日は,よく学校へ帰って行く @namazu510 さんの記事になります.
乞うご期待!!
速習 Java 「入門？」その2 処理を書いてみるお

# さて、色々サンプルを書いてみよう
ここで、構文とかJavaの仕様についても述べてもいいのだが、
俺自身が書くより、遥かに優れた入門サイトがあるのでそれらを紹介するに留める。

大事なことだが、解らない事は時には読み飛ばしてしまってかまわない。
いきなり、全部を理解しようとしないことだ。

入門サイトはあちこちで紹介されているが、とっつきやすいのはこちら
https://manga.crocro.com/?cat=java&pg=index#

マンガ形式で読みやすい。
まず、6章まで読んでみてくれ。
非常にわかりやすい。

# 課題

## 問題１ Fizz Buzz
コンソール上に１から100までループを使って出力しなさい。
ただし、以下の仕様を満たすこと。
3で割り切れる場合は「Fizz」（Bizz Buzzの場合は「Bizz」）、5で割り切れる場合は「Buzz」、両者で割り切れる場合（すなわち15で割り切れる場合）は「Fizz Buzz」（Bizz Buzzの場合は「Bizz Buzz」）を数の代わりに発言しなければならない。

## 問題２ 

入門サイトの第7章を読み、Mainクラスにメソッドを追加せよ。
そのメソッドは以下の要件を満たすこと。

1.mainメソッドで一行で呼び出せること。
2.そのメソッドは引数を2つ受取り、問題1の処理を実行するものとする
3.引数はループの制御に使うこと、一つ目が１なら１から始まり、２つめが50なら５０まで出力するようにせよ
ArduinoでLEDテープを光らせて遊ぶ

チームの制作でArduinoを使ってLEDテープを制御する必要があったのでそれの備忘録。

とりあえず光らせるところまで。

## 今回買ったLEDテープ

LEDテープといっても色々あるのですが今回はスイッチサイエンスさんで販売しているフルカラーシリアルLEDテープを購入しました。
https://www.switch-science.com/catalog/1399/

Adafruit NeoPixel Libraryというライブラリを使うことで簡単にArduinoからLEDを制御することができるということなのでこれを使うことにしました。

配線などは今回は割愛します。

## ライブラリの準備
Githubにリポジトリが公開されているのでzipでDLします。
https://github.com/adafruit/Adafruit_NeoPixel

![スクリーンショット 2017-12-08 0.16.03.png](https://qiita-image-store.s3.amazonaws.com/0/159111/fc6c08a3-9f20-6a8f-3a28-d87be5400f06.png)

ダウンロードしたらArduinoIDEを立ち上げ、
スケッチ=>ライブラリをインクルードから.ZIP形式のライブラリをインクルードをクリックします。

ダウンロードしたzipを選択し、ライブラリを導入します

ここまでできたら準備完了です。

実際に光らせるコードを描いてみましょう。

##実装

```c:led.c
//ライブラリインクルード
#include <Adafruit_NeoPixel.h>

#define LED_COUNT ( 30 )
#define DIGITAL_PIN ( 6 )

Adafruit_NeoPixel led = Adafruit_NeoPixel( LED_COUNT,DIGITAL_PIN , NEO_GRB + NEO_KHZ800);
void setup() {
  //初期化処理
  led.begin();
  led.show();
}

void loop() {

  ///色を設定
  //第一引数：何個目のLEDを光らせるか
  //第二引数：色を設定(RGB)
  led.setPixelColor( 1, led.Color(255,255,255));

  ///設定した情報をテープに送る！
  led.show();

}
```

これだけです。とってもシンプルです。
これを書き込み実行するとテープから２番目のLEDが点灯します。

![IMG_4894.JPG](https://qiita-image-store.s3.amazonaws.com/0/159111/23611c95-e482-81cd-d136-6ac744a6f67a.jpeg)
眩しい。



とても簡単に扱うことができるので例えばこのように・・・


for(int i = 0 ; i < LED_COUNT ; i++ )
{
  led.setPixelColor(i-1,led.Color(0,0,0));
  led.setPixelColor(i,led.Color(255,0,0));
  led.show();
  delay(40);
}

forでちょっと待機を挟みながら色をセット＝＞表示を繰り返していくだけで
・・・
![IMG_1267.MOV.gif](https://qiita-image-store.s3.amazonaws.com/0/159111/03c25244-d53b-f65c-69fc-538bf3659f86.gif)

このようにアニメーションっぽいことが実装できちゃいます。

~~まぁこの書き方だとledの数が０以下のもの指定しちゃってたり最後消えなかったりと問題大有りなのですがサンプルコードなので許して~~

あと１０分で今日が終わってしまうのでとりあえず今回はここまでです。
なかなか使い道が見出しにくいアイテムではありますが興味ある方はぜひやってみてください。
GoでGoogle URL Shortener APIで短縮されたURLをデコードするライブラリ

とある理由があって
google の URL Shortener API を使って短縮されたURLを
デコードするライブラリを作りました。

[go-goo.gl-parser](https://github.com/smith-30/go-goo.gl-parser) です。

```
$ go get -u github.com/smith-30/go-goo.gl-parser
```

__使い方例__

```go
package main

import (
	"fmt"

	parser "github.com/smith-30/go-goo.gl-parser"
)

func main() {
	p := parser.NewParser("")
	d, err := p.DecodeURL("https://goo.gl/kMxDaw")
	if err != nil {
		fmt.Printf("%v\n", err)
	}

	fmt.Println(d) // https://github.com/smith-30/go-goo.gl-parser
}
```

__注意__

console.developers.google.comからURL Shortener APIを有効にして
api tokenを取得してライブラリに渡してあげてください。

くれぐれもトークンはリポジトリにあげないように。。
📚Reason/BuckleScriptを書くときに参考にする資料

過去に遡って、Reason ML Advent Calendar の2日目を書く。

初めのほうなので、参考になる資料をリストアップする。

## [Awesome ReasonML](https://github.com/vramana/awesome-reasonml/blob/master/README.md)
各プラットフォームにあるAwesome XXXのReason版。主要なサイトへのリンクやサンプルアプリケーションへのリンクがある。

発表資料へのリンクもあって参考になる。特に[Dawn of Reason](https://sanderspies.github.io/slides/dawn-of-reason.pdf)がReasonのモチベーションが簡潔にまとまっていてよかった。 が初期の資料らしく、紹介されているプロジェクトの一部はすでにdeprecatedになっていたりする。

<img width="987" alt="Screen Shot 2017-12-08 at 23.00.02.png" src="https://qiita-image-store.s3.amazonaws.com/0/5920/73aa6384-a32e-f5d3-34e7-302b24431b5d.png">

## [reasonml-community](https://github.com/reasonml-community/index)
各ライブラリのBuckleScriptのバインディングがまとめられている。 axiosやreactといったよく使うライブラリのバンディングが紹介されている。

reasonml-communityという名前なのに、Reasonの紹介がやたら雑でウケる。

<img width="870" alt="Screen Shot 2017-12-08 at 23.06.11.png" src="https://qiita-image-store.s3.amazonaws.com/0/5920/4041b97d-90d0-60e2-e343-562be7ee5960.png">

昔はBuckleTypesという謎の名前だったが、リネームされてだいぶ分かりやすくなった。

## [BuckleScript User Manual](http://bucklescript.github.io/bucklescript/Manual.html)
OCaml(BuckleScript)とJavaScriptのセマンティクスの差を埋めるために、アノテーションが用いられる。例えば、OCamlに存在しないプロパティアクセスを示すためには `@@bs.get` アノテーションが用る。

```ocaml
type textarea;

external get_name : textarea -> string = "name" [@@bs.get];
```

これらのアノテーションは[BuckleScript User Manual](http://bucklescript.github.io/bucklescript/Manual.html)に記載がある。 ただしBuckleScriptの文法なのでReasonへの変換は勘でやる必要がある。

## [BuckleScript API Manual](https://bucklescript.github.io/bucklescript/api/)
Reason/BuckleScriptで利用できるAPIについての解説がある。 基本的にJavaScript組込みの型へのバインディングとなっている。

OCamlでよく使われるodocで生成されている。OCamlに慣れている人はすんなり読めるが、そうでない人は違和感を覚えるかもしれない。 基本的に型しか書いてないので、慣れが必要。

[Js.Null](https://bucklescript.github.io/bucklescript/api/Js.Null.html)や[Js.Undefined](https://bucklescript.github.io/bucklescript/api/Js.Undefined.html)が`null`や`undefined`に対する操作を提供していておもしろい。モナドになっている。

## [ReasonML Discord](https://discordapp.com/invite/reasonml)
Discord。 活発で質問すると答えてくれる。

## まとめ
 * awesome reasonの資料で雰囲気を掴む
 * JSとのインタフェースはBuckleScript API Manualを読みながら書いていく。
 * JSライブラリのバインディングを書くときはBuckleScript User Manualを読みながら、アノテーションをつけていく。
 * つらくなったらDiscordで聞く

という流れで書くのがいいと思う。
No.11 新卒未経験エンジニアが開発プロセスを分解してみた〜第5章　リリース〜

いよいよリリースの時が来ました。
手塩にかけて開発してきた我が子のようなシステムを世の中に解き放つ瞬間です！
長かった開発を抜け、ようやくリリースです。

が、リリース直後にバグが発覚したらどうしますか？
本番環境で全く違う挙動をしてしまったら、、、

リリースする時には、きちんと準備しておくべき項目があります。
時間に追われてリリース準備が出来ておらず、リリース直後に大慌て。
なんてことにならないようにするにはどんなことに気をつければ良いのでしょうか？

では、見ていきましょう。

## 目次
[第1章　要件定義](https://qiita.com/kosuke_aizawa/items/90e6e97c56e0795568d6)
[第2章　設計](https://qiita.com/kosuke_aizawa/items/7a8639e71d6e11e0d4c5)
[第3章　開発（実装） ](https://qiita.com/drafts/a04ddd856b85eca99d72/edit)
[第4章　テスト・検証](https://qiita.com/kosuke_aizawa/items/595892040d808acd6123)
第5章　リリース 　←今回はココ！
[第6章　運用](https://qiita.com/kosuke_aizawa/items/0228e289958659cdcf87)

## リリース前の準備
リリース前に考えておくべき一番のポイントはズバリ！

**リリース直後の動き**

です。
開発環境と異なる本番環境にリリースするに当たって、予想もしないようなことが起きることがあります。
そうなった時にいかに早く復旧出来るかは、きちんと準備出来ているかによります。

考えてみれば当たり前の話かもしれませんが、意外と見落としがちな視点かと思います。

では具体的にどんなことに気をつければ良いのかポイントを絞ってまとめてみました。

### リスクの洗い出し
**リリース後にどんなことがおきうるか**あらかじめ予想しておきます。
こうなった時には、こうしよう、といった問答集のようなものを作っておくとリリース後の復帰までの時間が短くなります。
一度作ってしまえば虎の巻として会社の資産にもなるでしょう！

### 余裕を持つ
何を当たり前なことを！
と思うかもしれません。

リリースしてからすぐに全員が緊急対応出来る体制を作れていますか？

リリース前後にMTGや移動など入れてないでしょうか？
その機能を作った業務委託の方が当日いないなんてことないでしょうか？

**ある程度のリスクを見込んできちんと余裕を持って対応出来る体制を整えておく**のも準備の一つです。

また、リリースのタイミングも週末や夜間は避けるべきかと思います。
リリース直後に問題発覚でせっかくの休日吹っ飛ぶなんてこと嫌ですよね。。。

## リリース直後の動き
しっかりとした準備が出来、いよいよリリースの瞬間！
ドキドキですね！

さぁ、本番反映しました！！
いよっ！！
パチパチパチ（拍手）

いやー終わった終わった！！
さぁ解散！！

とはなりませんね笑

リリースした直後にはまず確認です。
2段階の確認手順を踏みます。
まずは単純にシステムが動いてるかどうかを確認するだけの、いわゆるスモークテスト的なことをします。
とりあえずアクセス出来るかどうか、きちんとページが表示されるかどうかなどを確認しましょう。

確認出来たらもう少し踏み込んだテストをしていきます。
ユーザーが正常な操作をした場合の動きを再現してみたり、追加した機能がきちんと動いているかを確認します。

**まずは簡単な動作確認を行い、その後きちんとリリース内容が正しいかどうかを確認する**という流れですね！！

## リリース時に問題発覚した場合
いざリリースしてみたらシステムが全く動きません！！
なんてことになったらゾッとしますが、現実にはアリエルことかと思います。

考えたくはないですが、考えておかないといけないことです。。。

答えはシンプルです。
そのままGoするかBackするかの二択です。

シンプルですがその答えを出すのには何が必要か。

**しっかりとした準備**に他ありません。

また準備かよ、と思うのですがリリース後の動きはリリース前でしか考えられないのです。

準備の項目には

・撤退ライン（リリースの続行、中止の判断基準）を決めておく
・（改修作業の場合）旧バージョンに戻す手順を定めているか
・変更前の環境の全てのバックアップは取得しているか

などが挙げられます。
この段階でも**依頼者（発注者）にとって本当に価値のある成果物を提供する**意識が重要だと思います。
無理やりリリースをして質の低いものを提供するか、一旦戻ることにはなりますが反省を活かしてよりよりものを作るか。

判断が難しいところがあると思います。
**そんな難しい判断だからこそ、事前にしっかり考えておく必要がある**んです！！

そして場合によってはリリースを延期する勇気も必要かと思います。

## まとめ
リリースに潜む危険は様々です。
もはやどれだけテストしても、リスクは潜んでいると言っても過言ではないでしょう。

ですが、そのリスクをどれだけ小さく出来るかは自分たち次第です。
リリースは手塩にかけて育てた我が子のようなサービスを世の中に解き放つ瞬間だからこそ、暖かく見守ってあげられるようにしっかり準備をすることが大事なんです。

ハートフルな感じで締められて良かったです笑

Google先生に聞くとリリース時のチェックポイントをまとめてくださっている下記のようなサイトを紹介してくれます。
参考にどうぞ！
[大きなリリースの際にチェックすべき34のこと](http://www.ryuzee.com/contents/blog/4620)
[業務でWebサービス開発をする際に気をつけたいこと（新卒向け）](https://qiita.com/zaru/items/71900d0e4b2afaaa955b#%E3%83%AA%E3%83%AA%E3%83%BC%E3%82%B9%E5%89%8D%E3%83%81%E3%82%A7%E3%83%83%E3%82%AF%E3%83%AA%E3%82%B9%E3%83%88)

## 新卒未経験エンジニアの「リリース」経験談
初めてのリリースの瞬間。
作ったのは単純なファイル共有システムです。
自分で確認した限りでは大丈夫そうだけど本当に大丈夫だろうか。。。
そんな不安がいつまでも拭えませんでした。
そしてリリース後。
無事、ファイルがアップロードされていきました。
いや、アップロードされているうように見えました、という言い方が正確です。
データベースにはファイルの情報は保存されていたのですが、肝心のファイルの中身を保存する処理をコメントアウトしており、
実際にはファイルが上がっていない事態になっていました。
死ぬかと思いました。
リリースは危険がいっぱいです。。
速習 Java 「入門？」その１ 環境構築するお

このページは私的な教育のために書かれています。

# いつまでもIT土方をするのか？
お前は、刺身の上にたんぽぽを乗せるような仕事をいつまでもやるのか？
希望を持ってIT業界に来たのに、やってることはただのルーチンワーク・・・
サーバー監視とか、テスターの仕事しかない。

それは、お前にスキルがないからだ。
お前の換えなんぞいくらでもいるからだ。

だから、換えの効かない人材にならなければいけない。
コードのかけないやつは、技術者ではない。
それはインフラだろうが開発だろうが、変わらない。

# 急いでJavaを覚えなければいけない
なんでJavaなのかは、割愛する。
まず、初学者はこれを読んでくれ。非常に有用な知見だ。

https://qiita.com/YudaiTsukamoto/items/42a8df22ca4c6b327dfd

読んだか？

# 開発環境を構築する

まず、開発環境を構築しよう。
最初に、JDKを入れる。

以下のサイトから、JavaSE9をダウンロードしてインストールする。
Standardでいい。
http://www.oracle.com/technetwork/java/javase/downloads/jdk9-downloads-3848520.html

![dauso.PNG](https://qiita-image-store.s3.amazonaws.com/0/113470/4c25958d-7a4c-b426-c97b-07924a527097.png)


次にEclipseの統合開発環境を用意する。
（エディタとコマンドラインでやってる場合ではない）
http://mergedoc.osdn.jp/

Eclipse 4.7 Oxygenをダウンロードする。
![Eclipse.PNG](https://qiita-image-store.s3.amazonaws.com/0/113470/88d1f0ef-b667-1e5a-a5ce-ca8c063d5429.png)

Javaのやつをダウンロードすること、あとでプラグインでいくらでも機能追加できるが、
それについて調べる時間はもったいない。

金があるなら、こっちもおすすめだ。
https://www.jetbrains.com/idea/

落として来たやつを、好きなマルチアーカイバで解凍するといい。

# 開発環境を起動して設定する
まず、コンソールプログラムを書いてすぐに実行できる環境を作ろう。

どの環境でやるかは知らないので、自分で調べて設定を行うこと。

Webアプリ作るか、Android作るか、どれをやりたいか俺はわからない。
でも、コードを書かなければ物ができないという事実は変わらないので、
まずはコンソールでやっていく、おいおい時間があればそのへんも書いておく。

# 宿題 コンソール上に文字を出力する

以下のコードを実行できるようにしてくれ

```java
public class Main {
    public static void main(String[] args) {
        System.out.println("Hello World!");
    }
}
ベンチャーに入ったのでPMBOKとの付き合いを見直してみた

# はじめに
こんにちは。株式会社ホワイトプラスのエンジニア@fuyamauchiです。
この記事は[WHITEPLUS Advent Calendar](http://qiita.com/advent-calendar/2017/whiteplus "")  2017 9日目になります。

ホワイトプラスにはつい最近ジョインしたばかりで、前職は独立系のSIerに勤めていました。典型的なプロジェクト型組織と、システムを内製している事業会社ではプロジェクトマネジメントのやり方ってだいぶかわるなぁと思っていたときにいい機会をもらったのでちょっとPMBOKについて書いてみようと思います。

# とりあえずPMBOKってなんだよ？
Project Management Body of Knowledge の略で「ぴんぼっく」と読みます。
簡単に言うと、プロジェクトをうまく進めていくための体系的な知識集です。
PMIという組織が監修していて、PMPという国際資格試験もこのPMBOKに沿って実施されます。

余談ですが、PMPというのがかなりハードルが高くて
- 4500〜7500時間の実務経験
- ３〜５年以上のPM経験
- ３５時間の研修

という応募資格のほか、トータル２０万円くらいの費用がかかります。

PMBOKでは「プロジェクトをうまく推進していくために何をやるべきか」が、５つのプロセス群と１０の知識エリアに分割して定義されています。
[こちら](https://qiita.com/futoase/items/caba152ba8f306c4a114)に一版前のものですがまとめてくださってますね。

# プロジェクトの流れ
PMBOKには以下の５つのプロセス群が定義されていています。
1. 立ち上げプロセス
- 計画プロセス
- 実行プロセス
- 監視・管理プロセス
- 終結プロセス

ざっくり上から下の流れで進めていきつつ、実行プロセスの合間に監視・管理をして計画通りに進んでいるかをコントロールします。うまく進んでいないときは計画プロセスと実行プロセスを見直します。
各プロセスの中で実施すべきことがアクティビティとしてまとめられていますが、これが結構な数があって全部きっちり実施するのは結構ムリなので普通は各プロジェクトごとの事情に合わせてカスタマイズします。

---------------
とまあこんな感じのぴんぼっくです。どちらかと言うと、規模の大きなプロジェクトをうまく回していくためのノウハウ集といった感じです。銀行さんのシステムみたいに数万人月を超えるプロジェクトとか。
とはいえ小規模なプロジェクトでも役に立つような知識もたくさんあります。そんなかでも特に大事だと考えているところをちょろっと書いておきます。

# どんな小規模なプロジェクトでも最低限やっておくべきだと思うこと３つ
### プロジェクトの目的と意義を明確にする
PMBOKではプロジェクトの最初に立ち上げプロセスの一環としてプロジェクト憲章というなんかすごそうなものを作れと言われています。
小規模プロジェクトでプロジェクト憲章をきっちり作る必要なないと思いますが、少なくともそのプロジェクトの目的と意義だけは明確にしてプロジェクトメンバー間で共有しておくべきです。
自分の経験上、小さなプロジェクトほどチームメンバーのモチベーションに成果が左右されやすいため、メンバーが納得した上で仕事を進めるのはプロジェクトの成否を分ける重要な要素だと考えています。


### WBSの作成
WBSとはWork Breakdown Structureの略で、プロジェクトの完了に必要なタスクがまとめられたものです。名前の通り、プロジェクトの目的からブレークダウンしていく形でタスクを洗い出していくのタスクの漏れや重複が防ぎやすいです。
PMBOKの計画プロセスの中にもWBSの作成は入っています。SIerとかだと新人研修で確実に習うやつですね。

- 工数見積もりがしやすくなる
- ガントチャートに展開すればスケジュール管理ができるようになる
- 抜け漏れや重複が出にくいため、タスクの分担がしやすい

といった計画上のメリットも多くありますが、一番のメリットはプロジェクトの完了条件が明確になることだと思っています。漏れていたタスクが後から後から見つかるような状況だとプロジェクトの終わりが見えずメンバーの精神衛生的にもよろしくないですが、完了条件が明確ならモチベーションも保ちやすいはずです。

### 振り返りと評価
PMBOKで言う所の終結プロセスの一環です。
かかった工数は次回プロジェクトの見積もりの最も有力な根拠になりますし、発生した問題は次回プロジェクトのリスクマネジメントのインプットになります。
プロジェクトの実績は企業にとって知的財産みたいなものなので、しっかりとデータ収集して蓄積しておくことは企業の成長にもつながります。
プロジェクトのどの点を評価すればいいかはPMBOKの知識体系を沿って考えると整理しやすく、異なるプロジェクト間でも比較できるようになるので、プロジェクト終了時には一度ざっと目を通して見るといい感じに振り返りポイントが明確になるのでおすすめです。

# まとめ
とりあえず「ぴんぼっく」ってのがあるんだっていうのだけ覚えてもらって、突然プロジェクトリーダーに抜擢されたけどとりあえず何から始めていいかわからない人のとっかかりとしてお役に立てば幸いです。

--------------------
ホワイトプラスではエンジニアを募集しています
ホワイトプラスでは、web×リアル領域で「新しい日常を創りたい」エンジニアWanted!!しております。