OmniAICreator/Qiita-1.07M huggingface dataset:
地理院標高タイルと Leaflet でつくるCS立体図

これは [FOSS4G Advent Calendar 2016](http://qiita.com/advent-calendar/2016/foss4g) の記事です。

# はじめに

CS立体図という地形図があります。地形がわかりやすくていいですね。
だれでも手軽に使えるように [国土地理院の標高タイル](http://maps.gsi.go.jp/development/demtile.html) を使って直接ブラウザ上でCS立体図を生成してみました。

> ![image](https://qiita-image-store.s3.amazonaws.com/0/82494/538cae97-551a-8f56-71d8-483ecc3ed83a.png)
> [長野県型立体地形図(CS立体図)](http://www.rincon.or.jp/sinrinseibikasokukaringyosaiseikyogikai/CS%8E%E8%8F%87%8F%91PDF/1-1P5%81%608.pdf) より引用


# できあがり

こんなかんじで動作するものができあがりました。スマホのブラウザでも動きます。

![image](https://qiita-image-store.s3.amazonaws.com/0/82494/23e798b9-1f9e-742d-e9f2-9e0465f723a0.png)


* デモ: <https://frogcat.github.io/csmap/> 
* ソース: <https://github.com/frogcat/csmap>

# 解説


## 標高タイルの画像化

標高タイルを XMLHttpRequest で持ってきてパース、canvas に描画する手法です。先人がやってらっしゃいますね。[地理院地図の標高タイル(CSV)を描画してみた](http://qiita.com/amay077/items/ef41e8feef3bafd15453) など。

昔は `context.fillRect` などを使って一ピクセルずつ矩形を描いて塗りつぶすしかなく、動作が重くて実用にならなかったと記憶しているのですが、最近(?)のブラウザでは `context.createImageData` で作ったrgba配列を直接操作して、`context.putImageData` で描画することができるようになったみたいですね。これを使うと結構軽快に画面が更新されます。

* 参考: [MDN: Pixel manipulation with canvas](https://developer.mozilla.org/en-US/docs/Web/API/Canvas_API/Tutorial/Pixel_manipulation_with_canvas)

## CS立体図

CS立体図自体は Curvature (曲率) と Slope (傾斜) を合成することで作成できます。計算式自体は以下を参考にしてなんとかなりました。詳しくはソースを参照してください、ちょこちょこ手を入れていくと思うので。

* 参考： [傾斜角 (Slope) の仕組み](https://pro.arcgis.com/ja/pro-app/tool-reference/3d-analyst/how-slope-works.htm)
* 参考： [曲率 (Curvature) の仕組み](https://pro.arcgis.com/ja/pro-app/tool-reference/3d-analyst/how-curvature-works.htm)

ただ、スマホで動かす場合には計算量を少なくしないといけません。曲率は足し算・掛け算しか出てこないのであんまりやることはないのですが、傾斜角は `atan` や `sqrt` が出てくるので比較的負荷が高いです。上のソースでは事前に `tan` の二乗を計算したものを用意しておいて、傾斜角の計算時には足し算・掛け算だけで済むように工夫しています。

## Leaflet GridLayer

実装は [Leaflet GridLayer](http://leafletjs.com/reference-1.0.2.html#gridlayer) を拡張して作っています。例題の CanvasLayer そのもの、といった感もありますが、オーバーズーミングに対応させたところが工夫です。実際の DEM は z=14 で打ち止めですが、z=15 でも z=16 でも z=14 の DEM を持ってきてCS立体図を合成してくれます。

## Leaflet Control Swipe

画面下部の三角形を左右にスワイプすることで左右の地図の領域をコントロールできるようにしています。拙作のプラグインを使っています。

* <https://github.com/frogcat/leaflet-control-swipe>

# まとめ

G空間情報センターの [静岡県CS立体図](https://www.geospatial.jp/ckan/dataset/shizuokakencsmap) を教えてもらったとき、これって地理院標高タイルで作れそうだなー、と思ったのがきっかけでした。さっと実装して PC で動いたので満足していたのですが、トレイルランナーの友人に見せたところ「これ、山でも使いたい」ということだったのでスマホで動くようにチューンしてみました。もともと CS 立体図は林業なんかの業務向けを想定しているとは思うのですが、山で迷子にならないために使いたい、という需要もあるみたいです。思わぬ収穫でした。

標高タイル、こんな風に用途が広がるので、自治体が高精度の標高タイルをオープンデータとして出す、みたいな展開になるといいなーと思います。

# 追記 (2016/12/23)

国土地理院より [標高タイル（地球地図全球版標高第2版）](http://maps.gsi.go.jp/development/ichiran.html#demgm) がリリースされ、ズームレベル0〜8のレンジで全世界の標高タイルが入手できるようになりました。デモアプリもズームレベルに応じてDEMソースを切り替えるように [変更](https://github.com/frogcat/csmap/commit/4275fe9382bc79859643f57f9be0dda9fe7733ae) したので、ズームレベル8以下であれば全世界のCS立体図をご覧いただけます。

![image](https://qiita-image-store.s3.amazonaws.com/0/82494/047a7f2e-478a-824d-a05b-41fc1a53a1e1.png)

<https://frogcat.github.io/csmap/#5/16.762/469.402>

# 追記 (2017/02/05)

2017-01-31「つくばFOSS4Gもくもく会・CS立体図勉強会」が開催されました。当日の模様が hackpad にまとめられています。CS立体図を実装してみたい開発者の方は必読です。

<https://hackpad.com/FOSS4GCS-XEObcZ90G35>
ディスク遅延とグループコミット

市販されているハードディスクは大半が7200rpmである。
これは毎分7200回転、つまり毎秒120回転する事を意味しており、ハードディスクのヘッドを目的の場所に合わせるランダムアクセスに1/120秒ほど掛かる見込みがあるとも言える。実際HDDのカタログスペックを見てもヘッドシークは10ms程度掛かると見て間違いない。
ざっくり言うと普通のハードディスクは1秒に120箇所以上に書き込む事はできない。(探せば15000rpmのハードディスクもあるけれど倍速くなるわけでもなさそう）

### ログを書くという事

毎秒120箇所を書き換えれないのに1つのトランザクションが120箇所を更新する内容をすべてそのままディスク上のデータに反映させていたら毎秒1トランザクションしか走らない。それではパフォーマンスが致命的に落ちるので、データベースは可能な限りHDDのヘッドシークを減らす方向に進化してきた。それが**ログ**である。

データベースの複数の箇所を書き換えたい時に、それぞれの箇所を直接書き換えるのではなく「このキーにこの値を保存する」というような情報(ログ)の羅列を直列に書き出す事で代用する。そうすれば一度に何百箇所を編集するトランザクションであっても1トランザクションあたりヘッドのシークは1回に収まる。ログを書き込んでもディスク上のデータベースは物理的に書き換わらないため、いずれデータベース内のデータそのものも書き換える必要があるが、ページ単位で更新を取りまとめて書きだす事でトランザクション数に対して書き出すページ数も抑える事ができる。そうやってスループットを稼いできたのがトランザクションの歴史である。ログの形にまとめる事で1秒あたりにコミットできるトランザクションの数は**トランザクションの大きさにおよそ関わらず**秒間100トランザクション程が見えてくる。

### ディスクの遅延とトランザクション

HDDの遅延は約10msと書いたが、例えば3GhzのCPUから見ると10msの待機とは30,000,000クロックの待ちを表している。1クロックを仮に1秒のタイムスケールに直すと30,000,000秒とは347日、ほぼ一年に近い待ち時間になる。先に**S2PL**で述べたようにDurabilityの為にはトランザクションのロック期間の中で永続化を行わなくてはならないが、ロックを10msも保持し続けるのは正気の沙汰ではないので何とかしてロック期間を短くするアルゴリズムはいくつか提案されている。どれも面白いので詳細は後日の記事にする。

### グループコミット

ハードディスクのヘッドは、動かすまでは10msかかるが、目的の所にシークした後は100MB/秒ほどの読み書き性能がでる、これをシーケンシャルリード・シーケンシャルライトと言う。ログを書く場合、次にログを書くべき場所は追記故に確定しておりシーケンシャルライト性能を存分に活かしきるためには複数のトランザクションのログを一度に書き出せるのが好ましい。
しかしながら、各トランザクションはいつ始まっていつ終わるのか予めはわからない。

そこで発明されたのがグループコミットである。IO命令の発行数を最小化するため、ログを書く専用のスレッド（ロガー）を用意して、トランザクションを行うスレッドはみんなそこにログの書き出しを依頼(エンキュー)し、ロガーが複数の依頼を一度のディスク書き込みで一括で完了させる。そして各トランザクションは**ログの書き込みが完了するまで待機する**。という方法でスループットを改善する。ロガーは

- 書かれたログ量が一定の閾値を超えた場合
- 前回の書き出しから一定の時間が経過した場合

のどちらかの条件が満たされた場合に、エンキューされたログをまとめてHDDに書き出してトランザクションを発行したスレッドに完了を報告する。これらの閾値や時間に関してはシステムの要件によって最適値が変わる。

この機能が最初に搭載された商用DBは1976年のIBMのIMS FastPathだと言われている。だが当時に論文の形とししては登場せず、1985年に[Varieties of Concurrency Control in IMS/VS Fast Path.](https://www.researchgate.net/publication/220283152_Varieties_of_Concurrency_Control_in_IMSVS_Fast_Path)の中で紹介された。これとは独立して[Group commit timers and high volume transaction systems](http://link.springer.com/chapter/10.1007%2F3-540-51085-0_52)が1984年に発明され登場した。この当時のDBは技術の核心は現代ほどおおっぴらに公開されない傾向があったと言えるかも知れない。

このグループコミットの面白い所は、個々のトランザクションがそれぞれでロックを取ってHDDのヘッドを握りしめて丁寧にS2PLした場合と完全に状況が一致することである。つまり並行性にも永続性にも機能レベルでは何の悪影響も出さずに性能だけを向上させることに成功している。
このアルゴリズムによってトランザクションのスループットはチューニング次第で1000トランザクション/秒を超えることも可能になった。

さらにこれを改良するアルゴリズムも提案されているが、そのうち1つは明日の記事にする。
Vim 8.0 Advent Calendar 9 日目 2 進数のサポート

この記事は [Vim 8.0 Advent Calendar](http://qiita.com/advent-calendar/2016/vim8) の 9 日目の記事です。

Vim 8.0 では 2 進数のサポートが強化されています。

## 2 進数の数値リテラル

`0b` もしくは `0B` で始まる 2 進数リテラルが追加されました。

```vim
echo 0b1010 == 10
" => 1
```

## `<C-a>` `<C-x>` の 2 進数サポート

`'nrformats'` オプションに指定できる値に `bin` が追加されました。
これはデフォルトで含まれているため、特に設定せずに利用可能です。
`0b` や `0B` で始まる 2 進数の数値の上で `<C-a>` や `<C-x>` を実行すると、数値を増減できます。

```
0b1000
↓<C-x>
0b0111
```

## printf() の 2 進数サポート

`printf()` 関数のフォーマットに `%b` が追加されました。
これを使うことで、数値を 2 進数の文字列に変換できます。

```vim
echo printf('0b%b', 10)
" => 0b1010
```

もちろんフラグにも対応しています。8 桁の 0 埋めパディングをするには以下のようにします。

```vim
echo printf('0b%08b', 10)
" => 0b00001010
```
【Android】Google Play Developer Consoleの段階的公開機能のススメ

【Android】Google Play Developer Consoleの段階的公開機能のススメ
Google Play Developer Consoleの機能の一つである段階的公開（Staged rollout）についての紹介です。

この投稿は [Android その３ Advent Calendar 2016 - Qiita]
(http://qiita.com/advent-calendar/2016/android_third) の9日目の記事です。

## 段階的公開（Staged rollout）とは

- 通常のリリースでは100%のユーザにバージョンアップしたアプリを公開しますが、段階的公開を使うと公開するユーザの割合を絞ってリリースすることができます。

:information_source: 2018/01/01追記（ここから）

結構前（半年くらい前？）から公開割合が自由に入力できるようになっています。
このやり方で何回もリリースしてたのですが、この記事を更新するの忘れてました。

以下の「段階的な公開の割合」のところに自由に入力できます。
試しに11.111%でリリースできたのは確認しました。
![](https://qiita-image-store.s3.amazonaws.com/0/123122/c90753f4-5bff-ad98-a7e2-f8b2ea1af8f6.png)

更新するときも同様のやり方で公開割合変更できます。
![](https://qiita-image-store.s3.amazonaws.com/0/123122/6389bf72-4db2-6fa3-29e7-111834b564b3.png)

:information_source: 2018/01/01追記（ここまで）

:warning: ここの項目は古い情報です。（ここから）

- 公開する割合は0.5%、1%、5%、10%、20%、50%、100%が選択できます。

↓公開範囲選択のイメージ
![staged_rollout.png](https://qiita-image-store.s3.amazonaws.com/0/123122/2a1999cc-5de9-9f3b-0f4d-5e51c0b9b4c6.png)

↓段階的公開後のGoogle Play Developer Consoleの表示
![Screen Shot 2016-12-05 at 09.10.36.png](https://qiita-image-store.s3.amazonaws.com/0/123122/3fa755b7-b008-7bca-27a5-f6d5b23987f3.png)

:warning: ここの項目は古い情報です。（ここまで）

## メリット、デメリット
- メリット
  - 致命的なバグがあったときに影響範囲を極小化できる
  - 特定の端末や条件下でクラッシュするような事象を早期発見できる
- デメリット
  - 段階的に公開するので全ユーザに反映するのに時間がかかる

## 公開割合と公開割合を上げるタイミング
私が携わっているアプリの場合、アップデート後のアクティブユーザに対する最新版アプリの浸透率は以下のような推移で浸透します。

経過日数|浸透率
---|---
1日|50%程度
2日|80%程度
3日|90%程度

この場合だと10%公開して1日経過後だと`公開割合（10%） * 浸透率（50%） = 5%`のユーザに段階的公開中のアプリがインストールされることになります。
上記数値、クラッシュ率、段階的公開中アプリの更新内容、などを考慮して公開割合と割合を上げるタイミングを決めるのがいいかと思われます。


ちなみに私の場合は色々なパターンで試して数ヶ月運用した後、結局以下に落ち着きました。

- 小規模なリリース: 初日10%、翌日100%
- 影響が大きいリリース: 初日10%、3日後100%（クラッシュ率などにより前後する）

## 段階的公開中のGoogle Play Storeの表示内容とレビュー

 |段階的公開中の割合に当たったユーザ|段階的公開中の割合に外れたユーザ
---|---|---
**段階的公開中アプリのリリースノート（更新内容）**|表示される|表示されない
**段階的公開中バージョンに対するレビュー**|書ける|書けない

## 参考
- [段階的な公開を利用したアプリのアップデートをリリースする - Google Play デベロッパー ヘルプ]
(https://support.google.com/googleplay/android-developer/answer/6346149?hl=ja)

## おわりに
なにか間違っていたらご指摘ください！
Excel のデータを LINQ で取得する

﻿
この記事では、[CData ADO.NET Data Provider for Excel](http://www.cdata.com/jp/drivers/excel/ado/) 経由で LINQ を使って Excel テーブルにアクセスする方法を説明します。これを行うには、Entity Framework に LINQ を使います。これにより接続を作成し、あらゆる CData ADO.NET Data Providers からLINQ を使ってデータにアクセスできるようになります。

１． Visual Studio 2015 の新規プロジェクトで、プロジェクトを右クリックし［追加］→［新しい項目］を選択します。［ADO.NET Entity Data Model］を追加します。
２．［データベースから EF Designers］を選択し、［次へ］をクリックします。
３．［新しい接続］をクリックし、 データソースを［CData Excel Data Source］に変更します。

４．データソースの接続情報を入力します。［Excel File］に対象のExcelファイルのパスを指定します。

![fig3_01.png](https://qiita-image-store.s3.amazonaws.com/0/141193/d47fe153-b858-4440-ff1f-d462111d404a.png)

５．エンティティ接続を App.config に保存する場合は、エンティティ名を設定します。この例では、ExcelEntities をエンティティ接続として App.config に設定しています。

６．モデル名を入力し、モデルに含めたいテーブルまたはビューを選択します。

![fig3_02.png](https://qiita-image-store.s3.amazonaws.com/0/141193/30786d88-373e-f371-2438-6ac70ab639cb.png)

作成したエンティティを使って、選択、更新、削除、および挿入コマンドが実行できます。例：

```csharp
ExcelEntities context = new ExcelEntities();
var sheetQuery = from sheet in context.Sheet  select sheet;
foreach (var result in sheetQuery) {
    Console.WriteLine("csharp {1} ", result.Id, result.Name);
}
```
真っ白いRubyプログラム

※面白いものが出来上がったので、Advent Calendarに書いていた当初の予定を変更してお送りします。

## まずは見た目のインパクトから

```:本当にプログラム？
require './masshiro_decode'
   
   
   
   
 　 
   
  　
 　 
 　 
 　 
   
   
  　
 　 
   
  　
 　 
   
   
 　 
   
  　
   
 　 
  　
    
   

```

`masshiro_decode`を用意した上で、このプログラムをRubyとして実行すると、「`Hello, world of white Ruby!`」という文字列を表示します。

## 作ったきっかけ

だいぶ前に書かれた[こちらの記事](http://qiita.com/scivola/items/d3506fd17a30e7dcadce)にあるように、RubyではASCII外の文字をなんでも識別子に使えます。そして、UnicodeにはASCII外のスペースが10種類以上あるので、「これを使って識別子を組み立てれば、真っ白いRubyプログラムも作れるんじゃないか？」とは思っていたのですが、ずっと放置していました。

カレンダーのねたになりそうなので、発掘して投下した次第です。

## 動作の仕組み
種明かしに、デコード部分を書いていきます。

```rb:masshiro_decode.rb
SPACE_CHARS = "\u00a0\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u3000".freeze
REPLACE_CHARS = '0123456789a'.freeze

def method_missing(name, *args)
  name_s = name.to_s
  super unless name_s.start_with?("\u00a0")
  val = name_s[1..-1]
  print val.tr(SPACE_CHARS, REPLACE_CHARS).to_i(SPACE_CHARS.length).chr
end
```

まずはASCII以外のスペースがあると、不明な識別子なので`method_missing`が発動します。そして、` `（U+00a0）で始まらないものであればデフォルト実装に流してしまいます[^1]。このスペースで始まる場合は、残りの11種類[^2]のスペースで文字がエンコードされているので、「ふつうの11進法に戻す→整数にする→`chr`で文字化」という流れで文字に戻して、文字が出力されます。

## エンコード部

もちろん、こんなコードを手で書くのは視認性も入力性も最悪なので、自動生成で作りました。

```rb:masshiro.rb
module Masshiro
  SPACE_CHARS = "\u00a0\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u3000".freeze
  REPLACE_CHARS = '0123456789a'.freeze

  module_function

  def encode_num(num)
    num.to_s(SPACE_CHARS.length).tr(REPLACE_CHARS, SPACE_CHARS)
  end

  def decode_num(str)
    str.tr(SPACE_CHARS, REPLACE_CHARS).to_i(SPACE_CHARS.length)
  end

  def encode_print(str)
    ret = "require './masshiro_decode'\n"
    str.each_char do |c|
      ord = c.ord
      ret << "\u00a0" << encode_num(ord) << "\n"
    end
    ret
  end

end
```

## さらに妄想
`eval`を組み込めば、どんなプログラムも驚きの白さになると思いますが…実装予定は未定です。

## おことわり
環境によっては、全部スペースに見えないことがありますので、その点はご了承ください。また、Ruby 2.2.4で実行しています。


[^1]: これ以外の文字で始まる命令は、将来のために予約されています（違）
[^2]: Unicodeのスペースはもう少し種類があるのですが、幅がゼロのものはコピペ漏れなどトラブルになりかねないので除外しています。
ビットコインの渋滞と対策

先日最近のブロックチェーンの状況についてお話する機会をいただき、ビットコインの渋滞についてお話させていただきました。今回はその内容の一部からビットコインの渋滞と対策について書き出してみようと思います。

# ビットコインの渋滞とは

実際にビットコインが渋滞するわけではありません。そもそも仮想通貨なので、現実の渋滞が起こるわけがありません。ビットコインでは、送金のリクエストがされ、マイナーによる確認作業が行われ、ナンスを見つけることにより、ブロックが確定できるようになり、承認済みとなります。そこで何が混み合うのかというと、送金をリクエストし承認されるまでに時間がかかると言ったことが起こります。

# 実際何が起きているのか

ビットコインの統計情報を公開している、https://blockchain.info/ というサイトが有ります。ここにあがっている統計情報を元に、今何が起こっているのかを解説していきます。

![transactions.png](https://qiita-image-store.s3.amazonaws.com/0/28426/f0d6351f-d32d-6a33-5644-1e9238f5ecac.png)

まずは取引数です。10月から12月にかけてうなぎ登りに増えているのがわかります。
これには、社会情勢が影響していることが考えられます。インドでは高額紙幣の廃止、アメリカではトランプ氏の大統領当選、人民元も対ドルで下がり続きていたりと、自国の通貨に対する不安要素が多く存在しています。自国の通貨に不安がある場合、ビットコインへ資産をシフトさせるため、ビットコインの価格が上がり、取引量も増えるという法則があります。

![avg-block-size.png](https://qiita-image-store.s3.amazonaws.com/0/28426/55d25a9f-5b6d-ca2a-e841-fa8ea3cbd6df.png)

平均ブロックサイズを見てみましょう。現在のビットコインのブロックサイズは最大1Mバイトです。この1Mバイトというキャパシティに対し、どれだけ取引が詰まっているかということを示しています。12月以降は850Kバイトを超え続けており、取引がどれだけ詰まっているかがよくわかります。これが1Mバイトに張り付くと、入り切らなかった取引は後に回されます。取引が触れるほど後に回る量が増えていきます。

![confirmation-time.png](https://qiita-image-store.s3.amazonaws.com/0/28426/abe382cb-6005-b54f-0862-0a2c10cb6436.png)

そして、一番の問題である、ブロックの承認時間のグラフです。12月以降のうなぎ登り具合がすごいです。平均して13～14分と、通常10分以内になるとこ1.4～1.5倍程度かかってしまっています。これが渋滞を示す指標になります。

# 対策は？

ビットコインでは、10分程度で承認作業ができるよう、2週間に1回程度承認の難易度を調整する機能があります。通常はそれで対策されます。Median Confirmation Timeのグラフが上がったとしても定期的に下がるのはこの機能が効いているからです。この難易度ですが、承認の難易度でもありながら、不正の難易度でも有ります。ゆえにセキュア度合いに直結してきます。難易度を下げてしまうと不正が起こる確率も上がってしまい、悩ましいトレードオフが発生します。

これに対し、3種類の対策が現在進行しています。

## Segwit

ビットコインのブロックには非効率な部分があります。一つのブロックの中に何度も同じ電子署名が書かれています。取引データの中から電子署名部分を切り出し重複排除をすることで、ブロックに空きスペースができます。この空いたスペースに更に取引データを入れることにより、1ブロックあたりに取り扱える取引の量が増えます。これにより、取引が増えても対応できるようにしています。

## サイドチェーン

ビットコインのブロックチェーンの仕様を変えることはとても大変な作業を伴います。そこで、一度取引を取り出して、サイドチェーンと呼ばれる別のブロックチェーンで取引を行い、確定してところでメインのブロックチェーに戻すという方法があります。また、サイドチェーンはブロックチェーンに機能を追加することも可能で、ブロックチェーンそのものの高機能化への期待も持たれています。
秒間7取引程度しか処理できないビットコインのブロックチェーンに対し、VISAの扱っている秒間数千回の取引を処理できるようにすべく、日々開発が続けられています。

## ブロックサイズ引き上げ

ブロックサイズの引き上げは、単純な解決手段の一つです。しかし、ブロックチェーンではマイナーはすべてのデータを持ち合っているので、マイナーのコンピューターのストレージへの負担が大きくなっていきます。また、ある時点から、プログラムの互換性がなくなるため、切り替えの難易度も高いという問題も有ります。このように、デメリットが有るため、常に議論が繰り返されているが、なかなか進まないのが現状になっています。

# まとめ

ビットコインのスケールの問題は、以前より議論されてきましたが、ここへ来てそのニーズの高まりを感じます。Segwitへの移行、サイドチェーンの開発など進んで、より使いやすいビットコイン、ブロックチェーンとなっていき、もっと世の中に変革を与えていくことに期待しています。

# あわせて読みたい

[Gaiax Blockchain](http://gaiax-blockchain.com) ガイアックスのブロックチェーンブログです。
[世界初の分散型の仮想通貨ビットコイン](http://gaiax-blockchain.com/bitcoin)
[2回目の半減期を迎える仮想通貨ビットコイン(bitcoin)](http://gaiax-blockchain.com/bitcoin-second-half-life)
Fess HTMLのタグを指定してインデックスする

Fess 10.3
HTMLの特定のタグをドキュメントのcontentに入れるようにします。

# 手順
1. app/WEB-INF/classes/fess_config.propertiesを変更
2. Fessを再起動
3. クロール実行

```properties:fess_config.properties
# html
crawler.document.html.content.xpath=//BODY
crawler.document.html.lang.xpath=//HTML/@lang
crawler.document.html.digest.xpath=//META[@name='description']/@content
crawler.document.html.cannonical.xpath=//LINK[@rel='canonical']/@href
crawler.document.html.pruned.tags=noscript,script,style
crawler.document.html.max.digest.length=200
```

## HTMLタグの指定
HTMLタグの指定はXPathで指定します。
[XML Path Language (XPath)](https://www.w3.org/TR/xpath/)

デフォルトでcontentに入れるタグは
`crawler.document.html.content.xpath=//BODY`
でbodyタグ指定しています。

#### 例： classとidを指定
`<div class="document" id="doc1">`をcontentに入れる

```properties:fess_config.properties
crawler.document.html.content.xpath=//DIV[@class='document'][@id='doc1']
```
に変更します。
Fess再起動後にHTMLをクロールすると
ドキュメントのcontentに指定したタグ内のデータが入るようになります。
わたしがPMをやるときに心がけていたこと

# はじめに
9日目は、（株）スマートテック・ベンチャーズの平山(@ohirayama)が担当します。

いろいろかんがえましたが、私ができることは、プロジェクトマネジメントなので、そのことについて書きます。

年々、プロジェクトの数が増え、規模も小さくなって来ているため、プロジェクトマネジメントをする場面がどんどん増えてきているので、そんなときに読んでもらえればと思います。

私はこれまで、BtoB、BtoC、インフラ、アプリ開発、コンサルティング、大中小規模・・・・など、
さまざまなプロジェクトのマネジメントの現場に携わらせていただきました。
その経験の中でプロジェクトマネージャー（PM）が大切にすべき心がけをまとめてみました。


# 心がけ


## PJ内で起きていることはすべて把握する。
　これは、以前の上司に言われたことです。
　業務に関連するトラブルはもちろんのこと、メンバー間の愛称、人間関係にいたるまですべて把握しとけということでした。
　

## あきらめない。
　これは、別の上司に言われたことです。
　開発の案件を請け負っていた時、スケジュール的に厳しい状況で、泊りがけで開発を進めていました。
　それでも間に合いそうにない。
　手戻りが多い。
　ゴールが見えなくて、もうどうしようもない状況に陥ったときに
　私は、PJルーム内で、
　「だめだー」
　と言ってしまったことがありました。
　それを聞いたメンバーは、どう思ったのか・・・
　今思い出すだけでも恥ずかしい気持ちになります。

　そのことを、当時の上司が、戒めてくださいました。

　PMは絶対弱音を吐くな。
　「だめだとかいうな！」
　ということです。
　
　なんか当たり前のことのようですが、当時の私に最も足りなかったことを端的に指摘してくれたと思い、
　今も大切にしています。


## 次の工程に持ち越さない。
　これも、「あきらめない」を教えてくださった上司の言葉です。
　
　スケジュール的にどうしようもなくて、単体テストのタスクを残して、結合テストに進むべきか相談しました。
　そのとき
　「今苦しいからといって、次に持ち越したらもっと苦しくなるよ。」
　と言われました。
　正直、当時はピンと来ていませんでしたが、今なら理解できます。
　
　当時は、単体テストが終わっていない（不良があるかもしれない）状態で、それらをつなぎ合わせたとして、不具合が見つかっても余計複雑な状況になる。
　という理解でした。
　
　でももっとシンプルでした。
　今できていない事を次に持ち越したところで問題は解決しない。
　問題がさらに大きくなる。
　ということでした。
　
　ではどうすればいいか？　
　単純に持ちこさずに、QCDのいずれかを調整して解決するという理解です。


## PMは交替しない。
　これは私が、PMOとかやっていたときの経験です。
　
　いろいろなPJを見ましたが、炎上もしくは失敗するPJのほとんどでPMが交代していました。
　PMが交代すると、PJ内の方針や判断基準に微妙な歪みがおきます。
　それだけではなく、「誰のPJなのか？」見たいな精神論の部分で微妙に士気が落ちます。
　（合戦で武将が負けた後の部隊のような感じですね。）
　
　なので、はじめてPMをやる人には、何かをすることをアドバイスするよりも、最後までやり遂げることをアドバイスするようにしていました。
　
　簡単なようですが経験上、大切なことだと思うのでそうしています。
　そして、途中でリタイヤしたり、心が折れないように、サポートすることを心がけていました。

　SE、PGなど、専門職の方には、甘い話に見えるかもしれませんが、意外とそんなことが大事だったりするのですね。　


# まとめ
いかがでしたでしょうか？

私も、10年近く前にPMPを取って、その後、維持しているので知識はあるつもりです。

でも、プロジェクトはヒトが動かしていくということなので大切なのは、運営知識よりも
みんなの気持ちをひとつにしていくということなんだと思います。

それには、PMがPJチームの誰よりもPJを成功したいという気持ちでPJに向き合うということだと思います。

# 最後に
最後までご覧いただき、ありがとうございました。

スマートテック・ベンチャーズでは、未経験だけどiOSの開発をやりたい！という人を募集しています。

Advent Calendarのスマートテック・ベンチャーズページに会社およびWantedlyのURLをのせていますので、興味のある方は是非ご覧ください。
https://www.wantedly.com/companies/st-ventures/info

明日は、@nnsnodnbさんです。
お楽しみに！
描画オブジェクトを管理するDrawableListを作った

[Siv3D Advent Calendar 2016](http://qiita.com/advent-calendar/2016/siv3d) 9日目の記事です．

# はじめに
これまでに何度かSiv3Dを使ってゲーム製作を行ってきましたが，製作を進めていくと毎回ある1つの問題に直面していました．

その問題とは**「画面に描画するオブジェクトの管理が大変」**ということです．

ゲームが複雑なものになればなるほど，シーン中に描画するオブジェクトが増えてきます．Siv3Dは描画周りが簡潔に書けるライブラリでとても助かっているのですが，それでもオブジェクトの量が増えてくると管理が大変になってきます．

そこで，描画するオブジェクトを一括管理できるDrawableListというものを作って，実際に導入してSiv3Dでゲームを作ってみました．

# DrawableListについて
DrawableListを使うことで，次のようなことが実現できます．

1. 描画順番をレイヤー風に指定可能
1. 描画の要否をオブジェクトごとに設定可能
1. シーンのdraw関数がスッキリする！

描画順番は，お絵かきソフトでよく見るレイヤーのようなイメージで設定することができます．レイヤー番号を指定することで，そのレイヤーにオブジェクトが描画されます．

# 実装と使い方
まずは描画するオブジェクトに実装させるDrawableクラスです．

```cpp:Drawable.h
#pragma once

class Drawable
{
private:
    bool m_isVisible;

public:
    Drawable() : m_isVisible(true) {};
    virtual ~Drawable() = default;

public:
    virtual void draw() const = 0;

    void show()
    {
        m_isVisible = true;
    }

    void hide()
    {
        m_isVisible = false;
    }

    bool isVisible() const
    {
        return m_isVisible;
    }
};
```

基本的に，描画するオブジェクトはこのクラスを継承して作成し，draw関数をオーバーライドします．こうして作られたDrawableなオブジェクトをDrawableListを使って管理します．

```cpp:DrawableList.h
#pragma once
#include <map>
#include <memory>
#include <algorithm>
#include "Drawable.h"

class DrawableList
{
private:
    std::multimap<int, std::shared_ptr<Drawable>> m_drawables;

public:
    DrawableList() = default;
    ~DrawableList() = default;

public:
    void add(std::shared_ptr<Drawable> drawable, int layer)
    {
        m_drawables.insert(std::make_pair(layer, drawable));
    }

    void drawAll() const
    {
        std::for_each(m_drawables.begin(), m_drawables.end(), [](auto p) {
            if(p.second->isVisible()) {
                p.second->draw();
            }
        });
    }
};
```

`DrawableList::add`関数にDrawableを実装したオブジェクトの`std::shared_ptr`とレイヤー番号を渡すことで，DrawableListに登録されます．あとは，描画したいときに`DrawableList::drawAll`関数を呼べば，レイヤー番号の順番に描画されます．また，multimapを使用しているので，複数のオブジェクトで同じレイヤー番号を指定することが可能です．

ここで載せているソースコードですが，コメントと動作例を追加したものをGistでも公開しています．
[DrawableListの実装例 - Gist](https://gist.github.com/Hatanas/7860928d72dd99630f5c3863e34b63cc)

# 導入してみた
このDrawableListを，実際に以下のプロジェクトで導入してみました．GitHubでソースコードを全て公開しているので，気になる方は読んでみるといいかもしれません．
[なんとなクエスト - IndistinQuest/Game - GitHub](https://github.com/IndistinQuest/Game)

実際に導入してみると，オブジェクトの管理がぐっと楽になりました．特にレイヤー機能がとても便利で，プロジェクトメンバーからの評判も上々でした．このDrawableListを拡張したGameObjectManager的なものがSiv3Dに導入されて，SceneManagerのような形で管理できればゲームがもっと作りやすくなるんじゃないかなぁとか思いました．

# まとめ
- 描画するオブジェクトの管理はDrawableListのようなものを使うと便利
- Siv3DにGameObjectManagerみたいな機能があったら便利かもしれない

-----
明日は @voidProc さんの記事です．
よろしくお願いします．
Unlimited HandのUnityデモを動かす

某ゲームジャムで触る機会があったのでメモ。
KIT Developer Advent Calendar 2016 9日目の記事です。

初めましての方は、はじめまして。
306_sanです。普段はWebやってますが多趣味？なため、色々やっております。
今回は多趣味なもののハンズオン資料を作りました。

# Unlimited Handとは
公式サイトを見よう。
http://unlimitedhand.com/ja/

ざっくり言えばフィードバック機能の付いた入力デバイス（感覚的には血圧計）
フィードバックはバイブとかじゃなく筋肉にダイレクトに反応を伝えるのが魅力
（言い方が良くないけど電気信号で筋肉動かして痩せるマシンと原理は一緒）

# とりあえず、デモアプリを動かす

## 用意すべきもの
+ Unity (5.4系がいいらしい。デモのプロジェクトは5.3系で作られてるけど・・・)
    + 今回は5.4.1f1を使用
+ Arduino IDE(ver 1.6.9 ~ 1.6.11が動作確認取れてるらしい)
    + 今回はZIP版のver.1.6.13を使用
    + README.txtが旧バージョンの内容しか書かれていないのが気になる
    + あと、READMEがメモ帳じゃ読みずらい（改行コード的問題）。
+ macOS(OS X)/WindowsのPC
    + 今回はWindows10 Proでやりました。    

#### なんでArduino IDEが必要なの？(詳しく知りたい人向け)
Unlimited Hand内部には、(おそらく)プログラミング可能なマイコンが内蔵されています。
このプログラミング可能なという部分がが厄介で、
Unityで動かしたい場合は、Unityで動くようにするプログラムを書き込まないといけません。
(これを発見するのに数時間費やした)
Unlimited Hand内部マイコンをプログラミングする際にArduino IDEを使う必要があります。

## Step1 Arduino IDE の導入
[公式サイト](https://www.arduino.cc/en/Main/Software)からダウンロード
ZIP版/インストーラー版はお好みで

## Step2 Unlimited Handのライブラリをインポート
[開発者向けサイト](http://dev.unlimitedhand.com/download.html)からLibrary for ArduinoのVer0.43α (2016/11/27現在: これ以外はコンパイルエラーが起きます) をダウンロードして、解凍します。
解答したフォルダーの中にあるUHフォルダを指定の場所へコピーします。

```windows:windows
C:\Users\hoge\Documents\Arduino\libraries
```

```macOS:macOS
/Users/hoge/Documents/Arduino/libraries/
```

```zip:zip版
[解凍したフォルダー]/libraries
```
これでArduino IDEを立ち上げたらライブラリーがインポートされています

## Step3 Unlimited HandのマイコンにUbnity連携用のプログラムを書き込み
Arduino IDEを立ち上げ[ファイル]→[スケッチの例]→[UH]→[Serial_Unity_Quaternion]を選択
![スクリーンショット (3).png](https://qiita-image-store.s3.amazonaws.com/0/79241/6967a181-0e2e-4195-9877-6a3e8190812d.png)

あとはポートを指定して書き込み。

## UnityプロジェクトのDL&起動
[開発者向けサイト](http://dev.unlimitedhand.com/UHDemo_Graph.zip) からダウンロードして、解凍します。
その後、Unityでプロジェクトを開きます(この時5.3系のデータだけど開いていいのか聞いてくるのでContinueをクリックしましょう)。
あとは、デバイスマネージャーからCOMポートを確認して、UHprefabのPort Nameを設定すれば、終わりです！
![スクリーンショット (5).png](https://qiita-image-store.s3.amazonaws.com/0/79241/95f56ea4-1ca9-71fd-09e0-09475812e8c6.png)

## まとめ
初期設定がめんどくさいが、あとは豊富なライブラリや関数があるので結構やれそう。
キャラクターの移動とかにどう持っていけばいいのかよくわかっていない・・・
しかし筋肉に来る感覚はやみつきになるので今後が楽しみなデバイスです！
Java Silverつまりどころ(その５)

# つまりどころ〜

　　
こんにちは。

Java Silver来年ほんきだす。



## abstract

abstractとはクラスやメソッドを定義する際に付与することで、それらを抽象化することができる。
具現化(クラスであればインスタンス生成、メソッドであれば具体的な処理)することができなくなるよ。

## クラスの場合
下記のようにabstract宣言されたクラスを直接インスタンス生成することはできない。

```java:
class Main {
    public static void main(String[] args) {
        Hoge hoge = new Hoge();
    }
}

abstract class Hoge {

}
```

以下のようにabstractクラスを継承して使うよ。

```java:
class Main {
    public static void main(String[] args) {
        Fuga fuga = new Fuga();
    }
}

abstract class Hoge {

}

class Fuga extends Hoge {

}
```

## メソッドの場合
abstractメソッドは、具体的な処理を書かずにメソッドを定義したい場合に利用する。

```java:
class Main {
    public static void main(String[] args) {
        Fuga fuga = new Fuga();
        fuga.run();
    }
}

abstract class Hoge {
    abstract public void run();
}

class Fuga extends Hoge {
    public void run() {
        // 処理
    }
}
```

Hogeクラスで定義されたrunメソッドはabstract宣言されているので、FugaクラスでHogeクラスを継承したのであればrunメソッドは必ずオーバーライドする必要がある。


　　　　
　　
アウトプットして、ちしき固めていくぞ〜。
OpenStreetMap M-eat-ingのこころみ

2015年から2016年の前半にかけて、OSM M-eat-ingという試みを行っていましたので、その記録です。

# 前段
日本では古事記の時代から[「飲みニケーション」](https://ja.wikipedia.org/wiki/%E9%A3%B2%E3%81%BF%E3%83%8B%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3)が人付き合いの基本であると言われていますが(要出典)、お酒を飲めない人もいるわけで、同じ額のお金を使うのなら、お酒を抜きにしてそのぶんよいご飯を食べたいなぁ、と思ったのがきっかけでした。

あと、お肉が食べたかったのです。肉が。

![niku1.png](https://qiita-image-store.s3.amazonaws.com/0/9928/22ccde1e-9344-fbb3-be43-ec54f54ff488.png "niku1.png")
> [Spanish Meat](https://www.flickr.com/photos/ornellopics/6344828894/) CC BY2.0

# 当初の目的
上記の通り、お酒を飲めないかたを中心にしていたり、単純に僕が肉を食べたかったり、とった動機が元々なのですが、もうひとつ、マッパーがリアルに集まる機会をもちたかった、というのもあります。

特に2016年の前半は、一時期に比べ、マッピングパーティの数がかなり減っていた感覚があったため、技術や動向の情報交換ができづらくなっているなぁ、という意識があったのです。

# どんなところに行ったのか
全部で3回実施しており、こんなあたりにゆきました。

* 第一回 1月22日 [秋葉原 肉の万世](https://connpass.com/event/24274/)
* 第二回 2月22日 [恵比寿 肉寿司](https://connpass.com/event/26042/)
* 第三回 6月09日 [池袋 シュラスコ＆ビアバー GOCCHI BATTA](https://connpass.com/event/32697/)


美味しゅうございました！

![niku2.png](https://qiita-image-store.s3.amazonaws.com/0/9928/4b3567fa-80b9-173f-99f5-71f0c6ef69bc.png "niku2.png")
> [Wagyu sushi](https://commons.wikimedia.org/wiki/File:Wagyu_sushi_01.jpg#mw-jump-to-license) 01 CC BY3.0 unported


# KPT
いろいろあるのですが、おもいつくままにKPTをしてみます。

## Keep
### リアルに集まる機会を作るのはよかった
直接会うことがすなわちよいことだ、とはいいませんが、やはり直接会う機会があるというのはよいことだと思います。
「最近のアレってどうなってるの？」という素朴な疑問も、すぐに聞くことができます。

### 肉が美味しかった
基本的に腹減りキャラなので、いつでもお腹が空いているのですが、欲を満たせるのはよいことです。

## Problem
### いいだが忙しくなりすぎた
ある意味、僕の仕事は季節労働なので仕方がないとは言え、年度末の仕事がちと多忙化しすぎました。
また、そこまで忙しくないときでも、育児の都合で可及的速やかな帰宅が求めらるようになってしまいました。

### 1回の参加費が高かった
飲み会と同じ値段くらいと考えると、定期的な会合の値段としてはちょっと高いです。
参加者への経済的な負担として、思った以上に響いたと思います。

### レストラン or 飲み屋でPCを広げるのが難しく、雑談中心になってしまった
気になるところがあっても、その場で対応を行うことが難しい状況でした。なので、話して終わり、ということになってしまい、その後の活動や理解まで進めることに困難がありました。

## Try
### より安価な参加費
今後開催する場合は、どこかカフェなどでもよいのかなー、と思っています。
スタバとかよりも、少し古めの喫茶店、というイメージです。
コーヒー飲んで500円ちょっと、くらいが理想。

参加費を安くできる選択肢としては、企業の会議室や、大学の教室、公共施設などを借りるのもよいのですが、夜という時間を考えると、都合をつけられない場合が多いのは困った感じです。
場所は都心のほうがよいでしょうし、難しさは感じます。

個人的には、会場費などよりも移動費のほうが厳しいと思っているのですが、それはまた別のお話です。

### 場所を固定してみる
毎回、ネタと場所を探すのに苦労していたので、特に肉にこだわらないのであれば、いっそ良い場所を探して、そこで場所を固定してしまうのはアリかもしれません。

僕の通勤経路であるのが（僕が気軽で）よいなぁ、と考えています。
交通の便が良い場所、というと目黒あたりでしょうか。

### 会の構成について
普通の勉強会っぽく、なにかを発表する場にするのもよいのかもなぁ、と思っています。
ただ、これを始めると、単純に開催のハードルがあがるのが困ったところです。（プレゼンなどの準備負担と、発表設備・施設の確保）

会の開催の際に、OSMの編集などに関連して、なにかテーマを決めるくらいはよいかな、と思いました。
例えば「橋の書き方」とかであれば、誰でも参加できるのじゃないかと思います（ホントかよ）。

個人的に、目標にしているのは、「家ではなかなか読む時間をとれないので、集まって本を読もう」というコンセプトで集まっている [book-a-thon](https://bookathon.connpass.com/)だったりします。
このくらい、ゆるやかに継続できるといいなぁ、と感じています。

## 今後について
どちらにしろ、マッパーや、OSMに興味をもってくれたかたがなにかしら気軽に集まる機会は作ってゆきたいと思っています。

アイデア考えて、声がけしてゆきたいな、と思っていますので、もし見かけたら、参加してみてくださいねｗ

![niku3.png](https://qiita-image-store.s3.amazonaws.com/0/9928/2ccfd9c9-3228-df70-d02a-8aa780d0f087.png "niku3.png")
> [Churrasco carioca.jpg](https://commons.wikimedia.org/wiki/File:Churrasco_carioca.jpg) CC BY-SA 2.5 Generic


## 蛇足
M-eat-ingという名前は、ISO国際標準の世界で切った張ったしてる米国人の同僚と、ゲラゲラ笑いながら策定しました。

個人的にはわりと気に入っている名称なので、なんかしらの機会に使ってゆきたいなぁ、という気はしています。
どなたか使いたいかたがいれば、適当に使ってやってくださいｗ

**M is for MAPS & MEAT!**
Jenkins GitLab Logo Plugin

# 前置き
GitLabではGitHubと違いリポジトリごとにアイコンを設定することができます。

例： https://gitlab.com/gitlab-org 

![image](https://qiita-image-store.s3.amazonaws.com/0/8059/b09d9791-c905-a4ec-ebff-242a53952a21.png)

Jenkins GitLab Logo PluginはGitLabのリポジトリに設定されているロゴをJenkins上で表示するためのJenkinsプラグインです。

* https://github.com/jenkinsci/gitlab-logo-plugin
* https://wiki.jenkins-ci.org/display/JENKINS/GitLab+Logo+Plugin

# 使い方
## Global Configuration
APIのエンドポイントとトークンを設定

![global-config.png](https://qiita-image-store.s3.amazonaws.com/0/8059/281f7709-ca33-121c-a629-e29d12a76cb0.png)

## Job Configuration
表示したいリポジトリを設定

![job-config.png](https://qiita-image-store.s3.amazonaws.com/0/8059/eb132f8f-f605-aa14-b8db-58b819528656.png)

# 外見
こんな風にダッシュボードにGitLabで設定してるリポジトリのロゴが表示されます。

![dashboard_1.0.2.png](https://qiita-image-store.s3.amazonaws.com/0/8059/9dcea663-a943-92a8-4b05-76cb0f9a6c60.png)

ロゴをクリックすればリポジトリに遷移します

# 思い出：GitLabにプルリクを送った
GitLabのロゴ（avatar）自体は結構前からあったのですが、APIから取得する術がありませんでした。

[Chrome GitLab Notifie](http://qiita.com/sue445/items/630003a5d617a4ea17bc) でリポジトリ固有のロゴを表示したかったのと、今回のGitLab Logo Pluginを作りたかったため、APIで取得できるようにするためのプルリクエストを投げました。

[Expose avatar_url in projects API by sue445 · Pull Request #8890 · gitlabhq/gitlabhq](https://github.com/gitlabhq/gitlabhq/pull/8890)

プルリクは無事にマージされてv7.9.0に取り込まれています :triumph:
Unityでテスト用にインスペクタ上にメソッドを実行してくれるボタンを作ろう

Unity2のアドベントカレンダー9日目です。

# Unityでインスペクタ上にメソッドを実行してくれるボタンを作ろう #

最近Rxとか流行ってて
っていうかMVVMやらMVPやらよく使いますよね。

例えばMVPパターンを例に上げると

V(View)いわゆるUI部分アクションを起こすと
P(Presenter)に変更されたという情報が伝播して
M(Model)部分でなんやかんや計算して
P(Presenter)に計算の結果の情報が伝播して
V(View)に情報が反映される

という手順なわけですが・・・

大体として開発するときにMのロジックが簡単でVは手間がかかる、なわけです。
特に分業してたりするとロジックのほうが先に出来てテストのために仮UIつくってUIできたらそれにVをくっつけて・・・あーめんどくさい

テスト書く前に色々試してから・・・
入力UIはできてないけど表示UIはできてるからチェックしたいの・・・？

ってわけでMだけでテストてきたら簡単ですよね。
そもそもMとVは独立してるはず、

なのでModelに簡易的にテストできるボタンがあればみんな幸せかな？

ついでにこの手法は実機確認用のテストメニューとか作るときも使えるので覚えておいて損はないです。

# サンプルコード #

ここからダウンロードしてね
あとは好きに使ってね
改造の余地は色々あると思います

https://github.com/Marimoiro/unity-executorbutton

Modelを継承したクラスのメソッドにExecutorButton属性を付けたメソッドを作ると実行時にインスペクタにボタンが表示されます。
ボタン押せばメソッドが走ります。
簡易的なものなので戻り値は握りつぶし、引数はなしのみと限定しています。

# 説明 #

あんまりやってることは難しくないです。
肝になるのはModelEditorの部分ですね。

```charp:ModelEditor


namespace Assets.ExecutorButton.Editor {

    [CustomEditor(typeof (Model),true)]
    public class ModelEditor : UnityEditor.Editor
    {
        public override void OnInspectorGUI()
        {
            base.OnInspectorGUI();
            
            if( !EditorApplication.isPlaying ) return;
            

            Type type = target.GetType();

            var methodInfos = type.GetMethods(BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance)
                .Where( m => Attribute.GetCustomAttribute(m,typeof(ExecutorButtonAttribute)) != null) // ExecutorButtonAttributeを持つものだけ抜き出し
                .Where( m => !m.GetParameters().Any()); //パラメータなしのみ

            foreach (var mi in methodInfos)
            {
                if (GUILayout.Button(mi.Name))
                {
                    mi.Invoke(target, new object[0]);
                }
            }
        }
    }
}

```

methodInfosでExecutorButtonAttribute属性を持っているメソッドだけを抜き出して、それを一つづつボタンで表示しています。
でボタンが押されたらメソッドを実行しているだけ、簡単でしょ？

ちなみにリストに要素があるかどうかを調べるのはAnyを使います。

# アイデアスケッチ #

## 属性つけるのめんどくせえ！ ##

属性じゃなくて例えばメソッドの名前に～Executeとか～CommandとかOn～とかあったらとかにするか
BindingFlags.DeclaredOnlyでみつかったもの全部引っ張ってくるとか
そのへんは実装者が楽な方法取ればいいと思います

## 引数つけたい！ ##

foreachの部分に引数入力UI入れてみたらどうでしょうか。


## デバッグメニュー ##

おんなじようにリフレクション使えば自動でデバッグメニュー作ることもできます。
SRDebuggerというAssetがあるから試してみてもいいかもしれません。
（個人的にはあのOptionタブはもう少し改良できると思ってる）

# おわりに #

こういうユーザーは使わないけど開発者が楽になるものを考えるのって楽しいですよね。
あと開発者の無駄なルーチンワークへらせるから精神的に楽になるしみんな繰り返しとか嫌いなタイプでしょ？
vim-jp/vimdoc-jaにコントリビューションした話

この記事は [Vim Advent Calendar 2016](http://qiita.com/advent-calendar/2016/vim) 9日目の記事です。
![vim-jp organization](https://qiita-image-store.s3.amazonaws.com/0/85959/055405e3-edd8-b15a-73f0-25c7b75008cc.png)

### この記事で言いたいこと
- 翻訳作業に是非参加を！
  - [vim\-jp/vimdoc\-ja\-working: vimdoc\-ja working repository](https://github.com/vim-jp/vimdoc-ja-working)
  - [vim\-jp/lang\-ja: Manage Japanese language files which distributed with vim\.](https://github.com/vim-jp/lang-ja)

以上です。以下はどうしてvimdoc-jaに翻訳参加することになったのか、やってみてどうだったか書いていきたいと思います。

### やったこと
- 未翻訳部分を翻訳。
  - repeat.jax
  - eval.jax(進行中)
- 英語版と日本語版とのバージョンが不一致な箇所修正、更新分を翻訳
  - autocmd.jax
  - cmdline.jax
  - filetype.jax

### 動機
- そういえば最新のVimでは`packages`というプラグイン管理の仕組みが導入されたらしいので試してみよう。
- まずはヘルプ見よう。`:help packages`…ってあれ、一部未翻訳な箇所がある。
- そういえば [@kaoriya](https://twitter.com/kaoriya) さんが [VimConf2016](http://vimconf.vim-jp.org/2016/) で「翻訳作業に是非参加を！」っていってたしやってみるか。

と、ふわっとした感じでやってみました。

### 前提条件
- 筆者の英語力はこんな感じです。特別英語が得意というわけではありません。
  - 英語で書かれた記事やドキュメントをGoogle翻訳や辞書を使いつつ読む
  - かんたんなEnglishで会話できる

### 実際の手順
- やり方は [Workflow](https://github.com/vim-jp/vimdoc-ja-working/wiki/Workflow) に書いてあるのでその通りに。
- [Guide](https://github.com/vim-jp/vimdoc-ja-working/wiki/Guide) に翻訳をするに当たっての注意点が書いてあるのでPRを投げる前にしっかり確認すること。
  - [autofmt](http://www.vim.org/scripts/script.php?script_id=1939) の設定は最初にやったほうがいい。
  - [koron/nvcheck](https://github.com/koron/nvcheck) を使ってローカルでチェックしておくとTravisCIさんに怒られなくて済む。
- PR投げた後はvim-jpの方々から随時レビューが入るので、指摘事項を反映しコミット。
- Merged!

### やってみてどうだったか。
- 気になるものはやってみようという意識が高まった。
  - 今まで「誰かがやるだろう」とか「また今度でいいや」と後回しにしていたのに、「ちょっとやってみるか」とトライすることが多くなってきた。

- Vim、Git(GitHub)の理解が深まった。
  - 「Vimのhelpってこうなっているんだ。」
  - 「Gitのブランチってそういえばあんまり使ってなかった。」
  - 「GitHubのレビュー機能ってこう使うのか。」

- vim-jp organizationのバッチをGETした。
  - これで自分もPRをMergeできるよ！(けどまだそこまでレビューできる自信はないのでいずれ)

翻訳についてもそうですが、一人でやってるとmasterでガシガシコミットしていく形式でやってた自分もGitやGitHubについても理解を深められたのは嬉しい誤算でした。

実はやる前は「適当な訳を投げるな！」とかフルボッコにされるのではないかと不安な気持ちもありましたが、「まあ何かあったらその時考えればいいや。」と自分に言い聞かせてやってみました。
完璧を目指すよりまず終わらせろ `Done is better than perfect.`とマーク・ザッカーバーグ氏も言ってますしね。
(実際にはフルボッコなんてもちろんないですよ！)

### 終わりに

- 翻訳作業にぜひ参加を!
  - 「どこから手をつけたらいいかわからない」という方は [Issues](https://github.com/vim-jp/vimdoc-ja-working/issues) や [Projects](https://github.com/vim-jp/vimdoc-ja-working/projects) に上がっているところから手を付けていくのがいいかも。
  - 2016/12/09現在だと、[eval.jax の未訳文を翻訳する・Issue #48](https://github.com/vim-jp/vimdoc-ja-working/issues/48) が進行中なので、少しずつ手を広げていくのがいいかも。
lsを間違えて（中略）コンパイル時にD言語くんが通り過ぎるコマンド

# 概要
この投稿は
[lsを間違えてdlと入力してしまったときに、D言語くんが通り過ぎるコマンド(ueshita氏)]
(http://qiita.com/ueshita/items/06befb8790736c7294ae)
[D言語くんのAAを作ったよ(simd_nyan氏)]
(https://gist.github.com/simdnyan/20e8fa2a2736c315e2c1)
にインスパイアされています。

D言語erたるもの、コンパイル時にD言語くんを動かしたいですよね。

# [Gistにアップしました](https://gist.github.com/dragoon2014/6f76ca4c93108b7a1efa9f6d3a3b5f75)

![ctdl-1.gif](https://qiita-image-store.s3.amazonaws.com/0/51482/2fb3b54f-1688-6cc3-d707-9180deb6c52b.gif)
もうすこし滑らかに動きます

# 問題点
- Windowsでは動かないと思います。
- 画面がちらつきます。
- ウェイトにコンパイル時用ビジーループを使っているので
  D言語くんの移動速度が環境依存です。
  最近のPCだとクロックを落とさないと一瞬で終わってしまうでしょう。
  ソース内のdelay値を増やすことでも重くできます

```
# クロックを下げる例
for p in `ls -d /sys/devices/system/cpu/cpu[0-9]*`; do cat $p/cpufreq/cpuinfo_min_freq > $p/cpufreq/scaling_max_freq; done
# クロックを戻す(上げる)例
for p in `ls -d /sys/devices/system/cpu/cpu[0-9]*`; do cat $p/cpufreq/cpuinfo_max_freq > $p/cpufreq/scaling_max_freq; done
```
//コンパイル時スリープとかないんだろうか
PythonでRiotGamesAPIを叩いて遊ぶ 前半

この記事は、[kstmアドベントカレンダー](http://qiita.com/advent-calendar/2016/kstm)の記事として書かれました

#Riot Games APIについて
オンラインゲーム「リーグ・オブ・レジェンド」(通称LoL)の運営会社であるRiot Gamesが提供するAPI
このAPIを使うと，個々人やチームの戦績やらなんやらがJSON形式で引っ張ってこれるので今回はこれを叩いて遊んでみようと思います．

#目標
ランク戦の戦績データを使って"なんかカッコイイ"プロフィール画像(Twitterのヘッダー画像みたいな）が作れたら良いなぁ．

- 実行環境
  - Windows 10
  - Python 3.5 (Anaconda)

#APIの呼び出し方
条件:Riot Gamesが運営しているサーバのLoLアカウントを持っている
https://developer.riotgames.com/
API DOCUMENTATION -> FULL API REFERENCE に飛ぶと色んなAPIがあって任意の引数を与えてやるとJSONを返してくれます．
叩く場合には個々のアカウントに割り振られているAPIキーが必要なのでダッシュボードで確認しましょう．


#実際に叩いてみる
##使用したライブラリ
```py:lib.py
import urllib.request as urllib2
import json
```
`urllib2`をそのまま`import`したらハマったので調べてみると`python3`では`urllib.request`を使えば同様の機能が得られるらしいのでこれを`urllib2`として`import`します

##まずはサモナーID取得から
```py:getSummID.py
SUM_NAME = "sumname" #サモナーネーム 好きなのに変えてね
SUMMONER_V14 = "https://jp.api.pvp.net/api/lol/jp/v1.4/summoner/by-name/"
API_KEY = "api_key=XXXXXXXXXXXXXXXX" #自分のAPIキーに変えてね
try:
    s = urllib2.urlopen(SUMMONER_V14 + SUM_NAME + '?' + API_KEY)
    summ = json.loads(s.read().decode('utf-8'))
    SUM_ID = summ[SUM_NAME.lower()]["id"]
    print(SUM_ID)
finally:
    s.close()
```
ここで使うAPIは`summoner-v1.4`  実際に取得してみると，小文字サモナーネーム型のオブジェクトを返してきます．このオブジェクトにはサモナーIDやプロフィールアイコンIDなどが格納されています．戦績データを取得するためにはサモナーIDが必要なので`root[SUM_NAME.lower()]["id"]`のようにしてidにアクセスして取得してみます．
私のサモナーネームを使用した場合は`6300501`が表示できたら成功です．

このサモナーIDというのが非常に大切で，戦績などプレイヤーに結び付けられているデータを取得するにはこのIDを使うことになります．

##ランク戦の戦績を取得してみよう
ここで使うAPIは`stats-v1.3` このAPIはマッチ1つ1つのデータが取得できるわけではなく，チャンピオンごとのデータを取得することが出来ます．ではチャンピオンごとの戦績を一覧にして表示してみましょう．

```py:getRankedStats.py
try:
    r = urllib2.urlopen(RANKED_STATS_V13 + '?' + SEASON + '&' +API_KEY)
    ranked = json.loads(r.read().decode('utf-8'))
    champions = ranked['champions']
    for champion in champions:
        stats = champion["stats"]
        print("チャンピオンid:" + str(champion["id"]) + "の戦績は" + str(stats["totalSessionsWon"]) + "勝" + str(stats["totalSessionsLost"]) + "敗です")
finally:
    r.close()
```
取得してみると，`summonerID`と`modifyData`と`championsリスト`を取得することが出来ます．前述の通り，このAPIはチャンピオンごとの戦績を取得することが出来，そのデータは`championsリスト`内の`statsオブジェクト`に格納されています．なので，for文使って個々の勝敗回数を取得して表示してみると以下のようになります．

`チャンピオンid:42の戦績は1勝1敗です
チャンピオンid:3の戦績は0勝1敗です
チャンピオンid:4の戦績は1勝6敗です
...
チャンピオンid:0の戦績は22勝28敗です`
このチャンピオンidはそれぞれのチャンピオンに割り振られているidで，次回説明するstatic-dataと紐付けさせることによってチャンピオン名も取得することが出来ます．
ちなみにこのチャンピオンid:0は，全てのチャンピオンの戦績の合計データです．



長くなりそうなので今回はここまで　後半に続く(続きたい)
PHPの帳票出力についてまとめ(CakePHP寄り)

# PHPの帳票出力についてまとめ

わりかし帳票と触れ合う機会が多いなーと思っているので、普段使っている帳票プラグインをまとめてみました。

## Excel
帳票で一番多いのがExcelですね。正直一番楽。

普通に[PHPExcel](https://github.com/PHPOffice/PHPExcel)使ってます。  
ただ、そのままだと関数名が~~無駄に~~長すぎるので[こんなの](https://github.com/satthi/PhpExcelWrapper)自分で整備して使ってたりします。

最近は文字コードの心配とかしなくてもいいので取り込みもCSVじゃなくてExcelまとめた方がいいんじゃないかと思い始めている今日この頃。

## PDF
PDFでの帳票出力も求められることもありますが、割とExcelでごり押ししていますｗ

必要な場合には[TCPDF](https://github.com/tecnickcom/TCPDF)を使っています。

こちらもそのままだと使いにくいので[こんなの](https://github.com/satthi/TcpdfWrapper)自分で整備してry

## CSV
CSVでの入出力もよくある話ですよね。

自分で作成した[こんなの](https://github.com/satthi/csv-combine-plugin-for-CakePHP)使ってます。（CakePHP専用）

あ、固定長の入出力も同じプラグイン内でこの間対応しました。

## Word
とりあえず、Wordで求められても、ExcelやPDFでごり押ししてm・・・

以前[記事](http://qiita.com/satthi/items/761f7d956e2e9ca76f53)にした通り、[PHPWord](https://github.com/PHPOffice/PHPWord)とかありますけど、案件では導入しきれていないですねー。。。

## PowerPoint
~~パワポで出せとか言われたことない~~

[PHPPresentation](https://github.com/PHPOffice/PHPPresentation)・・・

これを機に触ってみた・・・って記事にしたかったんですけど、まともに動かなかった。。。

READMEをそのままやってみても壊れて開けないって言われるし、テンプレートをそのまま読み込んでも読み込めないスライドが普通にあったり(sample内のpptxで！)、フォント部分が文字化けしてたり。。。

今も開発進んでるみたいですけど、まだ全然実用レベルじゃないんですかね？

また今度トライしてみます。。。

## まとめ
~~PowerPointで記事にしたかった~~
GolangでKey-Valueリソースのキャッシュと分散合意によるコミットをする

## 概要

Key-Valueの単純なリソースに透過的に様々な機能を付けて使うためのtransparentというライブラリを作りました。
単純というのはGet/Setくらいの操作しかしないことで、リソースのイメージとしてはAmazon S3やファイルシステムあたりを想定してしてもらえれば良いと思います。こういったリソースに対してメモリ上へのキャッシュや、分散システムのような値の複製の機能を簡単に追加できます。

https://github.com/juntaki/transparent

## 使い方

### インストール

~~~sh
go get github.com/juntaki/transparent
~~~

## 基本的な使い方

機能に対応するレイヤーを作って、Stackに積んでいきます。
この例では、ダミーソースに対してファイルシステム上のキャッシュとメモリ上のLRUキャッシュを通して値を操作します。

~~~go
   cacheLayer1, _ := lru.NewCache(10, 100)
   cacheLayer2 := filesystem.NewCache(10, "/tmp")
   sourceLayer := test.NewSource(10)

   stack := transparent.NewStack()
   stack.Stack(sourceLayer)
   stack.Stack(cacheLayer2)
   stack.Stack(cacheLayer1)

   stack.Start()
   defer stack.Stop()
~~~

あとは、Stackを操作するだけです。
値のSet, Syncなどが可能です。

~~~go
   stack.Set("key", []byte("value"))
   stack.Sync()
~~~

Getも可能です。

~~~go
   value, _ := stack.Get("key")
~~~

内部的にはSyncされた値はすべてのLayerから同じ値が取れるようになります。
Syncしない場合は、非同期に浸透していきます。

~~~go
   value, _ = cacheLayer1.Get("key")
   value, _ = cacheLayer2.Get("key")
   value, _ = sourceLayer.Get("key")
~~~

結果はもちろん、全部同じ値がとれます。

~~~go:result
value
value
value
value
~~~

詳細は[Godoc](https://godoc.org/github.com/juntaki/transparent)を参照してください。

## レイヤーの種類


### Source

最終的に値を書き込むリソースをラップしたレイヤーで、特に何か機能を追加するものではありません。何かアプリを作っている場合は、このあたりの処理はすでに関数化されていると思います。
リソースに対する`Get`/`Add`/`Remove`の関数があるなら、`custom.NewStorage`から新しいSourceレイヤーを簡単に作成することができます。
また、このレイヤーは最下層にしか`Stack()`できません。

### Cache

たとえば、`lru.NewCache()`はメモリ上のLRUキャッシュに値を覚えるレイヤーを返します。ディスクやネットワークの先に問い合わせるようなレイヤーの上に積むとリソースへのアクセスが高速化されます。一度キャッシュされてしまうと下層を見に行かないので複数のクライアントからSetされるようなリソースでは後述するConsensusレイヤーを使う必要があります。
Getは値が得られるまで、再帰的に下層に問い合わせていきます。Setはキャッシュにセットした段階で戻り、非同期で下層にセットしていきます。終了時など最下層まで伝わったことを確定したい場合はSync()すればOK。

~~~
App
 |
Cache -> Storage1
 |
Source -> Storage2
~~~

### Consensus

`twopc.NewConsensus()`ではTwo phase commitで複数ノードに対して同時にコミットするConsensusレイヤーを返します。このレイヤーを使うには別途リクエストをさばくCoodinatorノードが必要です。詳細な使い方は`consensus_test.go`を参照してください。
ConsensusレイヤーはSetだけしか見てないので、Getがほとんどのケースでは下層のCacheにヒットさせるとアクセスの高速化が期待できます。

障害発生から回復するコードを作ってないので、部分的にでも停止すると全体がブロックされます、ちゃんと使うには未完成です。この実装のために[encoding/gobでinterface{}をProtocol buffersに詰め込む話はこちら](http://qiita.com/juntaki/items/a75dfe7c8597557ed577)

~~~
App1                     App2 
  `--------.     .--------'
         Consensus
  .--------'     `--------.     
Cache1 -> Storage1       Cache2 -> Storage2
 |                        |
 |                        |
Source1 -> Storage3      Source2 -> Storage4
~~~


## 使用例

自宅で使っている[S3をバックエンドにしたWiki](https://github.com/juntaki/bucketwiki
)で使っています。DBのことを考えなくて良いので気楽なのですが、読み込みごとにAPIでリクエストするのも何なのでページの内容をキャッシュしています。
ちょっと強引に組み込んだので冗長なコードが多いですが、[cache.go](https://github.com/juntaki/bucketwiki/blob/master/cache.go)にtransparentのCacheを使った実装があります。

## おわりに

絶賛開発中ですが、[transparent](https://github.com/juntaki/transparent)使ってみてください！Githubにスター付けてもらえるとうれしいです。
Elixirの無名関数の中でreceiveをし続ける

[Elixirの無名関数で再帰する](http://niku.name/2016/10/07/Elixir%E3%81%AE%E7%84%A1%E5%90%8D%E9%96%A2%E6%95%B0%E3%81%A7%E5%86%8D%E5%B8%B0%E3%81%99%E3%82%8B.html)を再構成

新しいプロセスを作り，そのプロセスがメッセージを待ち続ける（`reveive`し続ける）ようにしたい．
わざわざ module と function を宣言する程のものではない．
といった時に便利な，無名関数で `receive` し続けるためのイディオムです．

# [できない] x という無名関数宣言の中で，宣言中の x という関数を指定する

ぱっと思いつくのはこんな書き方なのですけど，これはできないようです．

```iex
iex(1)> x = fn
...(1)>   n when n <= 0 -> exit(:normal)
...(1)>   n ->
...(1)>     IO.puts n
...(1)>     x.(n - 1) # <- これができない
...(1)> end

** (CompileError) iex:5: undefined function x/0
    (elixir) src/elixir_fn.erl:33: anonymous fn/3 in :elixir_fn.expand/3
    (stdlib) lists.erl:1239: :lists.map/2
    (stdlib) lists.erl:1239: :lists.map/2
iex(1)> 
```

# [できるが使いにくい] 関数を引数に取る無名関数 x を宣言しておき，x を呼び出すときに x を引数に渡す

読みにくさを競うようなタイトルになってしまいました．
`x.(5, x)` といったようなことができるような無名関数 `x` を作るということです．
これはできます．
でも第二引数に `x` を渡すことや，その理由の説明が大変で，ちょっと使いにくいですね．

```iex
iex(1)> x = fn
...(1)>   n, _ when n <= 0 -> exit(:normal)
...(1)>   n, f ->
...(1)>     IO.puts n
...(1)>     f.(n - 1, f)
...(1)> end
#Function<12.52032458/2 in :erl_eval.expr/5>
iex(2)> x.(5, x)
5
4
3
2
1
** (exit) normal

iex(2)> 
```

# [使いやすい] 無名関数 y を宣言し，その中で x を宣言．利用するときは x のことを意識せずに y のみを使う

使う人が中でどんなことが行われているかを気にせずに使えるようにラップします．
`y.(5)` のように使えるようになります．

```iex
iex(2)> y = fn m ->
...(2)>   x = fn
...(2)>     n, _ when n <= 0 -> exit(:normal)
...(2)>     n, f ->
...(2)>       IO.puts n
...(2)>       f.(n - 1, f)
...(2)>   end
...(2)>   x.(m, x)
...(2)> end
#Function<6.52032458/1 in :erl_eval.expr/5>
iex(3)> y.(5)
5
4
3
2
1
** (exit) normal
    
iex(3)> 
```

# 無名関数の中で receive する

再帰する無名関数が書けたので receive し続ける無名関数も書けるはずです．

```iex
iex(3)> receive_loop = fn to_pid ->
...(3)>   x = fn f ->
...(3)>     receive do
...(3)>       "bye" -> exit(:normal)
...(3)>       x -> send(to_pid, x)
...(3)>     after 10000 ->
...(3)>       send(to_pid, "any commands?")
...(3)>     end
...(3)>     f.(f)
...(3)>   end
...(3)>   x.(x)
...(3)> end
#Function<6.52032458/1 in :erl_eval.expr/5>
iex(4)> 
nil
iex(5)> me = self()
#PID<0.81.0>
iex(6)> {:ok, pid} = Task.start_link(fn -> receive_loop.(me) end)
iex(7)> send(pid, "hello~")
"hello~"
iex(8)> flush()
"hello~"
:ok
iex(9)> ## 10秒待つ
nil
iex(10)> flush()
"any commands?"
iex(11)> send(pid, "bye")
"bye"
iex(12)> ## 10秒待つ
nil
iex(13)> flush()
:ok
iex(14)>
```

- 複数回送っても反応してくれる
- タイムアウトしてくれる

ので完成としまーす．

# まとめ

最初に

> わざわざ module と function を宣言する程のものではない

とは書きましたが，無名関数で再帰するためのコードは知ってないと読みにくい面があるので普通に `module` と `function` でやった方がわかりやすいことが多いと思いました．

無名関数で再帰を書いてしまったら，名前のある関数へと変えた方が読みやすいのではないかと立ち止まって考えるとよいかもしれません :thinking:
Webサイト担当者に絶対やってほしいたった1つのこと。

[ベーシックAdventCalendar](http://qiita.com/advent-calendar/2016/basicinc)の9日目の記事になります。

今年で3年目になり、技術力も経験もたくさん得てエンジニアとして成長するぞ！
と意気込んでいたのですが、2016年の7月からマーケターにキャリアチェンジしました。

そこで、この記事ではエンジニアとマーケターで計5サイトを担当して気付いた、**サイト担当者に絶対にやってほしいたった1つのこと**を書きます。

※あくまでも私が気付いたことなので、他の意見ももちろんあると思います。

> 関係ないですが、タイトルを考える際に参考にしたのはコチラ↓
[成功者のみが知っているたった1つの真実、5選](http://manato-kumagai.hatenablog.jp/entry/2016/10/21/164109)
今年一番のお気に入りですw


それでは本題。
Webサイト担当者に絶対にやってほしいたった1つのことは…

# サイトマップ・構造図は絶対に作って！

サイトマップ・構造図は絶対に作って！
（大事なことなので2回言いました）

サイトマップ・構造図の例↓
![サイトマップ・構造図の例.png](https://qiita-image-store.s3.amazonaws.com/0/50898/ba5b91e0-d557-5b3c-59a0-983abc3e12a8.png)

※画像はわざと粗くしていますm(_ _)m

新サービスのリリースやリニューアルをする時は作る人も多いと思いますが、保守運用や成長する時にも絶対に作成したほうがいいです。



## サイトマップ・構造図を絶対に作って欲しい理由

- 担当者に交渉して無駄なカラムを増やさなくて済む
- ページの目的がはっきりしているからロジックの提案がシンプル
- 前任者の引き継ぎがなくてもサイトの全体像を簡単に把握できる
- 新しい情報を追加したい時にどこにどうやって追加したらいいか分かる
- サイト内にある無駄な情報・ページや孤独なページが見つかる
- どこのページに施策を打つべきか分かりやすい
- 関係者みんなが共通認識を持って取り組める
- 誰かに説明する時も簡単

などたくさんのいいことが待っています。

たとえばみなさんは、こんな風に思ったことはないでしょうか？

### ■ エンジニアの場合

「◯◯って新しいページを作りたい」
「××の情報を増やしたい」

みたいな話を担当者から言われ、素直にゴリゴリ作成。

しかし、ふと気づくわけです。

『DBのAカラムとBカラムに書いてある内容一緒だなー』
『とりあえず作ったけどなんか情報がごちゃごちゃしてるなー』

### ■ マーケターの場合

あまり引き継がないまま突然サイトを任された。
＿人人人人人人人人人＿
＞　突然の部署移動　＜
￣Y^Y^Y^Y^Y^Y^Y^Y^Y^￣

任されたからにはサイトを知ろうと思い、サイトを見てみると次々と疑問が湧き上がる…。

『CページとDページの違いってなに？』
『このページってなんのためにあるの？』
『半年経って初めて見るページを発見！こんなページあったんだ！』

　：
　：
こんな風に思ったら、それは**サイトの構造・情報・導線が把握できていないことが原因**なんです。

### もっとわかりやすく例えると

漫画やドラマ、映画などの説明をされる時、登場人物たちの相関図とか見ると分かりやすくないですか？

あーだこーだ説明されるより、相関図と一緒に「この人が主人公で…」と説明された方が100倍速いですよね。

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">松野家6兄弟の相関図をかきました <a href="https://t.co/ZZUZ5hT0Xt">pic.twitter.com/ZZUZ5hT0Xt</a></p>&mdash; ぽてち (@pttnrnr) <a href="https://twitter.com/pttnrnr/status/707799045901840390">2016年3月10日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

私はこれでおそまつくんを理解しました。笑

これは相関図だけの話ではなく、JRの路線図やインフォグラフィックも同じことで、文字や言葉で説明されるよりも図で可視化された方が、関係者や利用者は簡単に理解できるんですよね。


## サイトマップ・構造図があれば

- 担当者に交渉して無駄なカラムを増やさなくて済む
- ページの目的がはっきりしているからロジックの提案がシンプル
- 前任者の引き継ぎがなくてもサイトの全体像を簡単に把握できる
- 新しい情報を追加したい時にどこにどうやって追加したらいいか分かる
- サイト内にある無駄な情報・ページや孤独なページが見つかる
- どこのページに施策を打つべきか分かりやすい
- 関係者みんなが共通認識を持って取り組める
- 誰かに説明する時も簡単

などたくさんのいいことが**本当**に待っています。

構造・情報・導線を1つの図にまとめるのは大変だと思うので、別れててもOKです。
整理されて可視化された状態が重要なんです。

どうか担当者のみなさん。
サイトマップ・構造図を作成して、関係者みんなで幸せになりましょう。


## おわりに

本当はエンジニアからマーケターになって変わったことや変わらないこと、生かせること、大変なことなどを書こうと思ったのですが、それはまた今度にしようかなと思います。

ここまで読んでいただきありがとうございました。
みなさん良い週末をー。

### ☆おまけ

横浜市もサイトマップ・構造図で情報を整理してリニューアル頑張りましょう。。。がんばれ。
> [スマホで“超”見づらい横浜市のホームページ、リニューアルできない驚きの理由](http://hiyosi.net/2016/09/17/yokohama_city/)
新人ができる業務効率化

## はじめに
さて、のっけから何ですが[新人SE](http://qiita.com/advent-calendar/2016/freshman_engineer)の私ができる業務効率化には限界があります。
理由は簡単で、まだ半年弱しか現場経験がないからです。
知らないものは効率化できません。

でも、そんな私にもできることがあります。
日々の何気ない行動の時短です。

それでは日々の何気ない行動を振り返ってみましょう。

### タイピング
タイピングが遅い人には共通していることがあります。

***命をかけて(必死に)タイピングをしたことがない***

当然ですね、世界屈指の安全な国・日本で命をかけてタイピングする機会は多くありません。
でも、今の若者のほとんどは、その機会があったはずです。

思い出してください、**情報**の授業を。
闘争心をむき出しにして隣の席のクラスメイトとタイピングの競争をしてthunder, ninja, cometとレベルアップしてきたあの頃を。
人が上達するには達成感や競争心が必要です。

そんな無垢な心を忘れてしまいタイピング練習サイトが続かないと言う人にオススメなのはパソコンで遊ぶオンラインゲームです。
コミュニティに入り、チャットを楽しみながら一緒に魔物を倒します。あなたのタイピング速度に自分の命がかかっています。仲間の命もかかっています。キーボードを見ながらタイピングしてる場合ではないので、自然とシャドータイピングも身につきます。
そう、世界屈指の安全な国・日本で命をかけてタイピングする機会は意外と身近にあるものです。
話が逸れましたね。

とにかく、**楽しみ**を感じながらタイピングをする機会を設けてください。ブラウザでtwitterやslackを使うのも手です。流れてきたボケに誰よりも早く突っ込もうとして、自然とタイピングが身につきます。
話が逸れましたね。

**何より私がタイピングについて一番言いたいことは、指を置く位置は人それぞれで良いということです。**
「俺のオススメ」とか、「常識はこうだから」は糞食らえです。
そんなことに気を惑わせていたらタイピングが嫌いになります。
（言われた方はホントにイライラします。言いたがりの人はその半生を懺悔して心改めて欲しいものです）
遅いなぁ、指が疲れるなぁ、そう思ったら置く位置を自分で工夫すればいいんです。指の長さ・可動域はみんな違ってみんないいんです。
偉そうに指摘してくる人がいたら、自信を持って***黙ってください***と言い返しましょう！

パソコンを使う限りタイピングは切っても切り離せません。それにタイピングが早くなると、できることの量も幅も広がって楽しいものです。

## マウス
まだマウス、触ってますか？次のようなシーンでまだマウスを触っているようでしたら、改善の余地ありです。
Macユーザーはこの点は意識が高いので、ひよっこWindowsユーザー向けの内容になります。ご容赦ください。

- メモ帳／Microsoft Office／コマンドプロンプトを起動するためにスタートメニューを開く

マウスを持って左下に移動してクリックして…後は忘れました。今日からそんなことをする必要はありません。

[Windowsキー]+Rを押して「ファイルを指定して実行」を開きます。
そうしたら目的に応じて次のように入力してEnterを押して見ましょう。
notepad, winword, excel, powerpnt, cmd
起動しましたか？Officeが起動しない人はまずOfficeが入っているか確認しましょう。

コントロールパネルを開きたいですか？ならこうです。
control

[ファイルを指定して実行]、便利ですよね。もっと他にできることを知りたいですか？ならこうです。
iexplore, chrome, firefox

- いろんなエディタや業務で使うツールを入れて、起動するためにスタートメニューを開く

せっかく入れたツール達、早く使いたいですよね。
でも、毎回スタートメニューを開くのは愚かであると先ほど学びました。
そんなあなたにオススメの便利ツールを紹介します。**Launchy**です。
**Launchy**で検索して最新版を各自入れてください。

Launchyは、登録したフォルダの中身の名前で検索して開く・実行することができる便利ツールです。
画像を逐一貼るわけにいかないので簡単に説明しますが、Launchyの窓の右上にある歯車から設定画面を出せます。
オススメの設定は、
- スタートアップ
- スタートメニュー
- お気に入りフォルダ
です。
お気に入りフォルダというのはお気に入り画像ではなくて（入れてもいいんですけど）、お気に入りのツール達を入れてください。
Google Chrome, Light Table, Cmder, Git Bash, Jmeter, etc...

一つ注意点です。
Google ChromeをLaunchyで実行したいあなた、gと打つと違うアプリが出てきませんか？
設定からgcalcとかいうのをオフにしましょう。
これで、Alt+Space(人による) -> g -> Enterと打つだけでブラウザが開きます。
[ファイル名を指定して実行]より早いです。これだけのためでもLaunchyを入れることをおすすめします。

ところでMacユーザーの方はお気づきだろうか、これらの作業してやっと、Macの**spotlight**に似た機能をWindowsでも使えるようになったことに。

**ここで一番言いたいこと**
~~その点Macってすごいよね、最初から使えるんだもん。~~
**マウスは人間の手首を疲弊させます。使わないに越したことはありません。**


### 次は

エディタ…と言いたいところですが、~~疲れたので~~ ~~宗教の自由に触れると聞いたので~~ 長くなったので今回はやめておこうと思います。
私がもっと現場経験を積んで、少しは語れる頃にまたお会いできれば幸いです。

皆さんがパソコンに触れる時間が少しでも長くなりますように。