OmniAICreator/Qiita-1.07M huggingface dataset:
【.NET】ボタンにラベルを重ねて表示する

# はじめに
これは、[Visual Basic Advent Calendar 2016](http://qiita.com/advent-calendar/2016/vb)の12/1日の記事。

お仕事でメニューとして4つボタンがあり、各ボタンをクリックすると別画面が起動するというよくある仕様書をいただきました。その内の２つのメニューのボタン上には表示名とは別に注釈コメントも一緒に書かれていました。
仕様書はExcel方眼紙で画面が作成されており、ボタンの表示名と注釈コメントのフォントの大きさが違っています。

# 実現方法
ボタンのテキスト(Text)プロパティに表示名と注釈コメントを改行文字を含めて一緒に表示する方法も考えたのですが、注釈コメントが無い他のボタンと比べると見た目が良くありません。
やはり見た目を考慮すると、ボタンの上に注釈コメントのラベルコントロールを重ねる方法を思いつきました。これなら注釈コメントだけフォントを小さくして表示することができます。

これを実現する上で３つ問題が発生しましたが、無事解決することが出来ました。

![ButtonOnLabel.png](https://qiita-image-store.s3.amazonaws.com/0/14053/9786be32-9302-7eac-ec3a-9f7b0efd3ee4.png)

## 問題点１
ボタンの上にラベルを貼り付けることは出来ましたが、ラベルの背景色(BackColor)を透明(Transparent)にしても透明にならない。

## 解決方法１
>PictureBoxコントロールの上に配置したLabelコントロールはBackColorプロパティをTransparentにしても透明になったようには見えません。これはLabelコントロールの親コントロールがフォームであり、フォームにあわせてLabelコントロールの背景が設定されるためです。
よってこの問題を解決するには、Labelの親コントロールをPictureBoxにすればよい訳です。
出展：[PictureBox上のLabelの背景が透明にならない問題の解決法](http://dobon.net/vb/dotnet/control/labelonpicturebox.html)

PictureBoxの例でしたが、Buttonでも同じ方法で解決することが出来ました。

``` vb
' ラベルの親コントロールをボタンにする
Me.btnTest.Controls.Add(Me.lblComment)
' 表示位置を調整
Me.lblComment.Top = Me.lblComment.Top - Me.btnTest.Top
Me.lblComment.Left = Me.lblComment.Left - Me.btnTest.Left
```

## 問題点２
注釈コメントの部分をクリックしても何も反応しない。

## 解決方法２
これは単純に、注釈コメントであるラベルコントロールのクリックイベントを設定して、ボタンのクリックと同じ処理を呼ぶようにします。

## 問題点３
ボタンはマウスオーバー時にデフォルトで背景色とボーダーが青っぽく変わるのですが、注釈コメントの部分にマウスに合わせてもボタンの背景色は何も変わらない。

## 解決方法３
注釈コメントはラベルコントロールであるため、マウスオーバー時は何もしません。
これを実現するには、注釈コメントのラベルコントロールのマウスエンターイベントでボタンのマウスエンター処理を呼んであげればいいのですが、OnMouseEnterメソッドは、プロテクト(Protected)メソッドになっていて、通常では外部クラスからは呼び出すことができません。
Buttonクラスの派生クラスを作ればできるのですが、また面倒だな思っていたところで下記サイトを見つけました。
>リフレクションを使用して、DoClickメソッドを呼び出す
「隠蔽されている非パブリックメンバを呼び出す」で紹介している方法を使えば、プロテクトメソッドであるDoClickメソッドも外部から呼び出すことができます。しかしこの方法はかなり強引な方法ですので、できれば避けた方が良いです。
出展：[Buttonのクリックイベントを発生させる](http://dobon.net/vb/dotnet/control/performclick.html)

Clickの例でしたがMouseEnterでも同じ方法で解決することが出来ました。
ラベルコントロールのマウスエンターイベントで下記処理を実行しています。

``` vb
Me.btnTest.GetType().InvokeMember("OnMouseEnter",
                    System.Reflection.BindingFlags.InvokeMethod Or
                    System.Reflection.BindingFlags.NonPublic Or
                    System.Reflection.BindingFlags.Instance,
                    Nothing,
                    Me.btnTest,
                    New Object() {EventArgs.Empty})
```

# 最後に
参考にしたサイトは目的のものとは違う内容でしたが、中身を理解していれば他にも応用が出来るわけです。
「Unityのサービス is 何」を3行でまとめてみた

# 承前

これ↓で全部チェックつけられなかった方向け（含む自分）に**3行以下で**まとめました。

<img src="https://qiita-image-store.s3.amazonaws.com/0/151668/8d993ed1-00f4-566c-3200-d9689a4c6482.png" width=250>

# 組み込みサービス

|Unityのサービス                |is 何|備考|
|------------------------------|-----|-------|
|Unity Ads|Unityアカウントに連動した広告配信サービス。<br>広告IDさえ発行されれば15秒ビデオ広告とインタースティシャル広告が数行で組み込める。|スキップ可否などはUnity Adsの管理画面から設定する。iOS v4.0 以上、Android v2.3 以上。|
|Unity Analytics|ユーザー動向解析ツール兼クラッシュレポーター。Unity5.2以降には組み込まれてて設定オンにすれば動くよ。カスタムイベント設定もできるよ。|年代推計とかコホートとかマーケティング性能を高めたければGAのほうがいいかも。クラッシュ関連は弱いけど。http://www.slideshare.net/MakotoIto2/unity-analytics|
|Unity Everyplay|録画開始・停止・投稿の今北3行で組み込める録画＆共有サービス。iOSとAndroidでしか動かないっぽい。投稿されたものを見るには[サイト](https://everyplay.com/explore)にいくかスマホアプリが必要。|http://japan.unity3d.com/blog/?p=1479|
|Unity Multiplayer|簡単ってほど簡単じゃないけど簡単にマルチプレイヤーゲームが作れるコンポーネントがそろってるよ！追加料金なしでPersonal版は同時接続20人、Professional版は同時接続200人。|Personalの人は[Photon Realtimeの無料](http://photonengine.jp/pricing/)とおなじ同時接続数。また接続人数ふやすならまずProfessionalライセンスが必要。Unity5.1以上 http://freelyapps.blog.jp/archives/1046384066.html|

# 開発支援サービス

|Unityのサービス                |is 何|備考|
|------------------------------|-----|-------|
|Unity Cloud Build|コミットなどをトリガに勝手にビルドしてくれるかんたんCIサービス。Git,SVN，さらにUnity5.4からは↓のCollaborateへのコミットがトリガになるよ。タイミングはProfessional版じゃないと自由にならないよ|最近完了通知を直接Slackにしてくれるようになった。べんり。|
|Unity Collaborate|共有リポジトリを提供してくれるサービスで ~~（2016/11/30現在要申請のベータテスト中）~~ 12/1に出た5.5でオープンβになりました。Unity Editorにインテグレートされているのでリポジトリ設定とかGitの所作とかでエンジニアが消耗しなくて済むよ！|最新の情報で一発上書きになるので、ブランチ運用は無理|
|Unity Performance Reporting|要Professional版だけど、クラッシュやエラーを収集できるよ。5.4からプラグインいらなくなったよ。今はエディタだけだけど[5.5からiOSもエラー収集できるようになる予定](https://blogs.unity3d.com/jp/2016/06/23/the-state-of-performance-reporting-ii/)。|サービス開発のくだりがサーバエンジニアさんに興味深いとおもうRailsからGoにいったとか。https://blogs.unity3d.com/jp/2015/12/02/the-state-of-game-performance-reporting/|
|Unity Asset Store|モデルやモーションからAIのエンジンまでゲームづくりに必要な部品がなんでも売ってるんだ！||
|Unity Affiliate Programs|上のAsset Storeでアフィできるよ！報酬は売上の5%だよ！(アフィリンク経由で24時間以内に購入された場合)|申し込みが必要 https://unity3d.com/jp/affiliates|

# その他のサービス

|Unityのサービス                |is 何|備考|
|------------------------------|-----|-------|
|Unity Certification|Unity認定試験。日本版はまだ準備中だよ。|http://japan.unity3d.com/certification/|
|Unity Connect|Unityに特化したLinkedInみたいな。企業なりプロダクトオーナーは仕事の募集ができるし、エンジニアはプロフィールを掲載したり応募したりできる。|https://connect.unity.com/|

# まとめ

皆さんはいくつご存知でしたか？意外とProfessional版じゃないと使えないのPerformance Reportingだけですね。
自分もUnity Performance Reportingとか使ったことないので、間違ってたら教えてください…
Amazon Lightsailを触ってみた #reinvent


英語だけですが、ブログ来てました。
https://aws.amazon.com/jp/blogs/aws/amazon-lightsail-the-power-of-aws-the-simplicity-of-a-vps/

管理画面は以下のURLです。マネージコンソールからはまだ行けないっぽい。
https://amazonlightsail.com/
![スクリーンショット 2016-11-30 9.21.44.png](https://qiita-image-store.s3.amazonaws.com/0/23936/030e5075-8f9f-1426-d657-c229b0ab447c.png "スクリーンショット 2016-11-30 9.21.44.png")

チュートリアル画面
![スクリーンショット 2016-11-30 9.22.00.png](https://qiita-image-store.s3.amazonaws.com/0/23936/1fa57023-a8dc-538b-2224-7728bc7fcdc3.png "スクリーンショット 2016-11-30 9.22.00.png")

WordPressなど、つくりたいアプリを選択
![スクリーンショット 2016-11-30 9.22.12.png](https://qiita-image-store.s3.amazonaws.com/0/23936/5388b2ef-71fc-6ad8-df7f-3f7ce9e09e38.png "スクリーンショット 2016-11-30 9.22.12.png")

プラン選択画面。$5はt2.nanoと思われる
![スクリーンショット 2016-11-30 9.22.19.png](https://qiita-image-store.s3.amazonaws.com/0/23936/91c9991e-e0a2-603e-f5ff-056f848223cb.png "スクリーンショット 2016-11-30 9.22.19.png")

起動するインスタンス名を設定
![スクリーンショット 2016-11-30 9.22.32.png](https://qiita-image-store.s3.amazonaws.com/0/23936/13e0cf9f-a188-6a1e-11dd-a86c0dd7dea2.png "スクリーンショット 2016-11-30 9.22.32.png")

起動した状態。ここにインスタンスが並ぶっぽい？
![スクリーンショット 2016-11-30 9.22.44.png](https://qiita-image-store.s3.amazonaws.com/0/23936/778f9aa3-8e68-c2d6-33b4-555ee4237355.png "スクリーンショット 2016-11-30 9.22.44.png")
削除とか再起動などの操作ナビ
![スクリーンショット 2016-11-30 9.23.16.png](https://qiita-image-store.s3.amazonaws.com/0/23936/39da32fc-3f25-f540-38a3-b9a3a125f535.png "スクリーンショット 2016-11-30 9.23.16.png")
Manageを押すとこうなる。bitnamiのAMIっぽい。
![スクリーンショット 2016-11-30 9.25.19.png](https://qiita-image-store.s3.amazonaws.com/0/23936/6fbe5daf-08e7-a206-25a3-9e88ba25b880.png "スクリーンショット 2016-11-30 9.25.19.png")

ブラウザ上からSSHも可能な様子。
![スクリーンショット 2016-11-30 9.23.43.png](https://qiita-image-store.s3.amazonaws.com/0/23936/3af4d1da-8275-c7f5-c9c7-4a5c4f67db59.png "スクリーンショット 2016-11-30 9.23.43.png")


##所感
- AWSのリソースをレンサバ的にマネージできるサービスっぽい
- 起動したリソースは自分のアカウントに出てこないので、専用のアカウントに起動してる説
- 多分裏側はCloudFormation
- 
AMIMOTOはどうやったらLightsailに掲載できますか？
何故僕たちはポエムを書くのか

この記事は「[ポエム Advent Calendar 2016](http://qiita.com/advent-calendar/2016/poet)」の 1 日目の記事です。
初日ということもあるので、ポエムとは一体何か、何故ポエムが必要なのかといった内容のポエムを書こうかと思います。

## ポエムとは一体何か

ポエムとは日本語で言うと「詩」ですが、ソフトウェア開発の分野ではより狭義に「表現の厳密性や定性・定量データを必ずしも重視せず、個人の思いや価値観をその人自身が適していると思った表現でそのまま文章化したもの」といった意味合いで使われます。

僕の観測範囲内でも多くの人がポエムを書いたり、それを通してチームビルディングや開発プロセスのマネジメントをしています。「ポエム駆動開発」などという言葉もあったり、このポエム Advent Calendar もあったりして、ある程度広く浸透しているように思えます。

その性質から明らかですが、ポエムは当然仕様書でも作業依頼書でもありません。そもそもドキュメントと呼ばれる代物ですらありません。普通に考えればチラシの裏にでも書いておけよと言われてもおかしくないようなものです。

何故そのようなものが多くのチームで受け入れられ、開発チームやプロセスの改善に用いられているのでしょうか。

## 人は正しさによって動くのではなく納得によって動く

「人は正しさによって動くのではなく納得によって動く」

これは何かのマネジメント本の受け売りですが、何故ポエムが必要なのか、何故僕がポエムを書き続けるのかと問われれば、僕はこの一言に尽きると思っています。

ソフトウェア開発の現場では要件を正しく伝えるためのドキュメントも必要ですし、それをもとにした仕様書や設計書ももちろん必要です。

しかし、それと同じかそれ以上に

- どうしてその技術を選定したのか
- その要件は誰のどういった想いに由来するのか
- チームのメンバーはそのプロジェクトに何を求めているのか

といったことを各メンバーがちゃんと知る、あるいは伝えることも重要です。

こういったことを共有するために必要なのは正確性ではなく、個人の経験からくる温度感や熱意などであり、そういった場面でこそポエムが有効に働くのです。

## 多様性と統一性をチームに共存させる

チームには多様性と統一性の両方が必要であると僕は考えています。

チームメンバーに「違い」が生じることはそれ自体は決して悪いことではありません。得意不得意、好き嫌い、スタイルや流儀、そういったことが異なる様々なメンバーがいるからこそ生まれるものもあるのであり、すべてのメンバーに共通の価値観やスタイルを強いることがマイナスに働くこともあります。

しかしその一方で、そのチームやプロジェクトの根幹をなす基本的な価値認識がずれていたり、大前提とするスキルや意識に対する認識が異なっていてチームのパフォーマンスは決して向上しません。

よいチームとは、目指している方向性や大前提の知識やスキルや意識といった部分には統一性があり、局所的な専門スキルやその領域に対する嗜好性に対しては多様である、そういった人たちの集団なのだと考えています。

そういった各々の「違い」とその結果生じる「多様性」を認識したり、逆に大前提となる方向性や理想のチーム像を広く伝え「統一性」を形成していくためにも、それぞれの想い、熱意を表現するということは重要であり、こういった点でもポエムという形での情報発信は大変有効に機能するのです。

## さあ、みんなポエムを書こう

1 日目の今日は、そもそもポエムとは何か、何故書くのか、何が嬉しいのかというをお伝えするためのポエムをお届けましました。
みなさんも積極的にポエムを書いて多くの人に熱意を伝え、よりよいチームやコミュニティの実現を目指していきましょう。

翌日はいつも僕にマサカリを投げてくる @nobkz さんです。さすがにポエムでマサカリを被弾することはないと思いますが油断は禁物ですね！
Elixirのスーパーバイザーについて

#スーパーバイザー

Elixirの方針としてエラーハンドリングをするのではなく, 死んだプロセスを監視しておき
再起動, するという方針である。

[プログラミングElixir](https://www.amazon.co.jp/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0Elixir-Dave-Thomas/dp/4274219151)にスーパーバイザーについてわかりやすく書いてあった。

##監視しているプロセスが死んだ際にどうなるのか

###コード

<strong>スーパーバイザー側のコード</strong>

```Elixir
defmodule Sequence do
  use Application
  def start(_type, _args) do
    import Supervisor.Spec, warn: false
    children = [
      worker(Sequence.Server, [123])
    ]
    opts = [strategy: :one_for_one, name: Sequence.Supervisor]
    {:ok, _pid} = Supervisor.start_link(children, opts)
  end
end
```

<strong>worker</strong>

```Elixir
defmodule Sequence.Server do
  use GenServer

  def start_link(current_number) do
    GenServer.start_link(__MODULE__, current_number, name: __MODULE__)
  end

  def next_number do
    GenServer.call __MODULE__, :next_number
  end

  def increment_number(delta) do
    GenServer.cast __MODULE__, {:increment_number, delta}
  end

  def handle_call(:next_number, _from, current_number) do
    { :reply, current_number, current_number+1 }
  end

  def handle_cast({:increment_number, delta}, current_number) do
    { :noreply, current_number + delta}
  end

  def format_status(_reason, [ _pdict, state ]) do
    [data: [{'State', "My current state is '#{inspect state}', and I’m happy"}]]
  end
end
```

**イベントの流れとして**

1. スーパバイザー側のstart関数が呼ばれる
2. `children`に監視対象となる`Sequence.Server`を開始し、123の引数を渡す
3. `Supervisor.start(children, opts)`子サーバのリストを渡し, オプションを設定する。

###実行してみる

```Elixir
Takuya@Takuya-no-MacBook-Air:~/sequence iex -S mix
Erlang/OTP 19 [erts-8.0.2] [source] [64-bit] [smp:4:4] [async-threads:10] [hipe] [kernel-poll:false] [dtrace]

Interactive Elixir (1.3.2) - press Ctrl+C to exit (type h() ENTER for help)

iex(1)> Sequence.Server.increment_number 3
:ok
iex(2)> Sequence.Server.next_number
iex(3)> Sequence.Server.increment_number "cat"
:ok
iex(4)>
02:03:33.524 [error] GenServer Sequence.Server terminating
** (ArithmeticError) bad argument in arithmetic expression
    (sequence) lib/sequence/server.ex:21: Sequence.Server.handle_cast/2
    (stdlib) gen_server.erl:601: :gen_server.try_dispatch/4
    (stdlib) gen_server.erl:667: :gen_server.handle_msg/5
    (stdlib) proc_lib.erl:247: :proc_lib.init_p_do_apply/3
Last message: {:"$gen_cast", {:increment_number, "cat"}}
State: [data: [{'State', "My current state is '127', and I’m happy"}]]

Sequence.Server.next_number
123
iex(5)> Sequence.Server.next_number
124
```

###結果

`Sequence.Server.increment_number`に文字列を与えていると
エラーレポートを表示している。
そして次に呼び出した際には, `Sequence.Server.next_number 123`が帰ってきている。

これはプロセスのエラーレポートを表示し, スーパーバイザーがプロセスを再起動しているからである。

**プロセスが死んだ場合, 再起動していることはわかった**

しかし 123が帰ってきたのは前のプロセスの状態を持てず, 再起動前の記憶を持てないからである。


このままではエラーが起きた場合は, 以前の状態の記憶がない状態になっている。

それを防ぐために, 状態をstashしておくことが必要になる。
次は**再起動をまたいだプロセスの状態の管理**を見ていく。
Macのオーディオインターフェースをメニューから切り替える

##### 通常、オーディオインターフェースを切り替える場合はコントロールパネルからおこないますが、オプションボタンを押しながらメニューバーのボリュームをクリックすることでもオーディオインタースの切り替えが可能です。


#### オプション＋クリック
![vol2.png](https://qiita-image-store.s3.amazonaws.com/0/151314/74af23d2-209b-f8f1-d5ed-e77cb16ae0c2.png)


なんてことないのですが、知っているとちょっと便利かも。
Perl6を学ぶ時に参考になるページ 2016

こんにちは、Perl 6アドベントカレンダーの一日目の投稿になります。

去年のアドベントカレンダーでも [Perl6を学ぶ時に参考になるページ](http://qiita.com/B73W56H84/items/54bb7de2f3183d8c49ba) という投稿がありました。

ただ、１年経てばなにかしら差分があると思うので、前回紹介されなかったページも含めて、今回は新たに2016年版の参考になるページを書いていきたいと思います。

# チュートリアル

## [Perl 6 Introduction](https://github.com/hankache/perl6intro)

+ 複数言語用意してありますが、英語版が最新です。その他の言語は英語版の更新後に各担当の人が翻訳するという流れになっています。現在のところ、日本語版は私が不定期で翻訳しています。
+ 非公式なチュートリアルではありますが、内容についてはPerl6のコア開発メンバーの一人であるlizamat氏のチェックが入っています。（※上記リポジトリのコラボレーターの一人です)

## [rakudo-and-nqp-internals-course](https://github.com/edumentab/rakudo-and-nqp-internals-course)

+ RakudoやNQPの内部実装に関するチュートリアルです。
+ 著者はPerl6のコア開発メンバーのJonathan Worthington氏です。

# 公式ドキュメント

## [Perl 6 Documentation](https://docs.perl6.org)

+ 公式ドキュメントです。開発メンバーによってメンテナンスされています。
+ クエリによっては公式ドキュメント内をうまく検索できないこともあるかもしれません。実は、上記公式ドキュメントのすべての内容を一つにまとめたページも存在します。そういうときは、このまとめページに対してブラウザの機能を使ってページ内検索をかけるとよいでしょう。
   + https://docs.perl6.org/perl6.xhtml

## [Perl6 Design Document](http://design.perl6.org)

+ 実はこのページに書いてある内容はPerl 6の現在の仕様ではありません。ただ、後述のircの #perl6 で現在でも会話の中で言及されることのあるページなので覚えておくとよいでしょう。

# ソースコード

## [roast](https://github.com/perl6/roast)

+ roastはPerl 6のテストケースであり、仕様です。公式ドキュメントを探しても情報がみつからないときはroastのソースコードを読むとよいでしょう。

## [rakudo](https://github.com/rakudo)

+ Perl 6の一番メインの実装です。(※この表現は正確じゃないかもしれないので、詳しくは公式ドキュメントを読んでください。)
+ 公式ドキュメントやroastでは物足りない場合はこちらを読むとよいでしょう。

## [perl6-all-modules](https://github.com/moritz/perl6-all-modules)

+ perl6のすべてのモジュールをまとめたリポジトリです。これも公式ドキュメントやroastを探しても情報がみつからないときに読むとよいでしょう。

# その他

## [R6 Ticket Tracker](http://fail.rakudo.party)

+ Request Tracker(a.k.a. RT) に送られたバグ報告をタグごとにまとめたページです。ブラウザのページ内検索機能を使えば、[公式のページ](https://rt.perl.org/Public/) よりもこちらの方が検索のしやすさは上だと思います。
+ バグっぽい挙動にあたってしまったときはこのページを参照するとよいでしょう。
+ ちなみに、新しいバグを発見してしまった場合は、`rakudobug [at] perl.org` にメールを送ればバグ報告することができます。タイトルへのタグの付け方などは https://github.com/rakudo/rakudo/wiki/rt-introduction を参照すると良いでしょう。

## [Weekly changes in and around Perl 6](https://p6weekly.wordpress.com)

+ Perl6界隈の今週のダイジェストを伝えるブログです。ちなみに、ecosystemにモジュールを登録すると紹介してもらえます！Perl6の文法を学んだらどんどんモジュールを登録していきましょう。
+ ちなみにだいたい書いているのは上の方でも出てきたlizmat氏です。

## [perl6 irclog](https://irclog.perlgeek.de/perl6/)

+ ircの #perl6 のログです。
+ ちなみに、ircの #perl6 ではたくさんのbotプログラムが用意されています。例えば、cameliaとトークして、`m: <Perl6のプログラム>` と打つと、最新のPerl 6を使ってプログラムを実行することができます。興味のある方はログを見るだけでなく実際に入ってみて試してみるとよいでしょう。
+ また、ircでは開発メンバーが常駐しているので、何か困ったことがあれば気軽に質問すればよいと思います。ちなみに、私は今まで4,5回ぐらい質問しました。

以上、Perl6を学ぶ時に参考になるページ 2016　でした。
~~あまり去年と差分がなかったかも。~~
Amazon Athena触ってみた


Blogで紹介もされてましたので触ってみた。
https://aws.amazon.com/jp/blogs/aws/


こちらがTOPページ
![スクリーンショット 2016-11-30 9.05.10.png](https://qiita-image-store.s3.amazonaws.com/0/23936/15a67fe8-f607-4ebf-36f2-5aa04080c32d.png "スクリーンショット 2016-11-30 9.05.10.png")
https://console.aws.amazon.com/athena/home


Get Started押すとこんな画面。
![スクリーンショット 2016-11-30 9.05.24.png](https://qiita-image-store.s3.amazonaws.com/0/23936/86cdcf0e-8a78-5039-4d6b-a3d0d1ed3c38.png "スクリーンショット 2016-11-30 9.05.24.png")

elb_logsというサンプルが用意されています。

![スクリーンショット 2016-11-30 9.06.27.png](https://qiita-image-store.s3.amazonaws.com/0/23936/ba96dc7a-61ff-d2cf-0093-871be6c0875d.png "スクリーンショット 2016-11-30 9.06.27.png")

テーブルの詳細はこちら

![スクリーンショット 2016-11-30 9.06.05.png](https://qiita-image-store.s3.amazonaws.com/0/23936/528f946c-74cb-2cc5-cda9-7fc322dfd91f.png "スクリーンショット 2016-11-30 9.06.05.png")

実行結果。

![スクリーンショット 2016-11-30 9.06.05.png](https://qiita-image-store.s3.amazonaws.com/0/23936/9e2e8c18-0551-3996-3ad3-4363371643ca.png "スクリーンショット 2016-11-30 9.06.05.png")

S3のものをなんでも検索するというよりは、S3にDB作れるサービスっぽいです。

現場からは以上です。
ページのレイアウトについて

#ページ全体をセンター寄せにする方法

HTMLでブラウザに表示される部分を「div」タグで囲みidを「page」とする。
CSSで「page」に対して横幅を指定し、左右のマージンをautoに指定する。

```css:filename.css
#page { 
    width: 980;
    margin: 0 auto;
} 
```

そうすることにより、ブラウザの横幅に対して自動的に計算されたマージンの値が挿入され、コンテンツ部分を中央に配置することができる。


#2段組みレイアウトの方法

ページに「Main」と「Sub」2つの要素があり、「Main」を右寄せ「Sub」を左寄せの2段組みにする。
まずMainとSubの横幅を指定。
ここでは仮にMainが720px、Subが220pxとする。
floatプロパティを利用しそれぞれ左右に寄せる。

```css:filename.css
#Main { 
    width: 720;
    float: left;
} 
#Sub {
    width: 220;
    float: right;
}
```

これで2段組みにはなるがSubより後続の要素も右に回り込んでしまうため注意が必要。
後続の要素を回り込ませたくない場合は、後続の要素に「clear」プロパティで回り込みを解除してあげたり、「clearfix」というテクニックを用いれば解消できる。

なお、floatした要素は、他の要素と上下マージンが相殺されなくなるため意図しない余白が生まれる可能性もあるため注意が必要。
C2x Charter(C2x 憲章)

時は2016年、プログラミング言語Cの言語仕様は2度のメジャーバージョンアップを経て、"ISO/IEC 9899:2011"（通称 C11）にたどり着きました。<del>ところで誰か使ってるの？</del>

もちろん、これでC言語の進化が止まったわけではありません。**次世代標準 C2x** に向けた検討が始まっているのです。C2xリリーススケジュールとして、2021年末までの検討作業、2022年末までの国際標準(IS)発行が予定されています。

# C2x憲章
ISO/IEC [JTC1/SC22/WG14 N2086](http://www.open-std.org/jtc1/sc22/wg14/www/docs/n2086.htm) "Programming Language C - C2x Charter"より、プログラミング言語Cの **次世代標準 C2x** に向けて、基本原則として考慮される15項目のリストを訳出しました。各項目では冒頭の要約文のみを訳出しているため、詳細について知りたければ原文を参照ください。

## オリジナル原則
> １. Existing code is important, existing implementations are not.

１. 既存コードは重要だが、既存の処理系は重要でない。

> ２. C code can be portable.

２. Cコードはポータブルであるべき。

> ３. C code can be non-portable.

３. Cコードはポータブルでなくてもよい。

> ４. Avoid “quiet changes.”

４.「静かなる変更」は避ける。

> ５. A standard is a treaty between implementor and programmer.

５. 標準とは処理系[^1]実装者とプログラマ間の約定である。

[^1]: CコンパイラやC標準ライブラリを指す。

> ６. Keep the spirit of C.

６. 「Cの精神[^2]」を維持する。

[^2]: http://d.hatena.ne.jp/yohhoy/20120612/p1 参照

## C99で追加された原則
> ７. Support international programming.

７. 国際化プログラミングをサポートする。

> ８. Codify existing practice to address evident deficiencies.

８. 明白な欠陥を扱う既存プラクティスを成文化する。

> ９. Minimize incompatibilities with C90 (ISO/IEC 9899:1990).

９. C90(ISO/IEC 9899:1990)との非互換性を最小化する。

> １０. Minimize incompatibilities with C++.

１０. C++との非互換性を最小化する。

> １１. Maintain conceptual simplicity.

１１. 概念の単純さを維持する。

## C11で追加された原則
> １２. _Trust the programmer_, as a goal, is outdated in respect to the security and safety programming communities.

１２. セキュリティと安全なプログラミング・コミュニティに関して、目的としての「プログラマを信頼する[^3]」は時代遅れである。

[^3]: 「Cの精神」で挙げられる項目の一つ。

> １３. Unlike for C99, the consensus at the London meeting was that there should be no invention, without exception.

１３. C99とは異なり、ロンドン会合[^4]の総意として発明をすべきでない。例外はない。

[^4]: C11に向けた規格策定中、2007年に行われたWG14 London meetingを指す。

> １４. Migration of an existing code base is an issue.

１４. 既存コードベースのマイグレーションは争点となる。

## C2xで追加された原則
> １５. Application Programming Interfaces (APIs) should be self-documenting when possible.

１５．アプリケーション・プログラミング・インタフェース(API)は可能な限り自己記述的であるべき。

----
Elixirを使ってみよう

# TL;DR
インストール〜REPL立ち上げまで。

# インストール
## 大まかな流れ
* Erlangの依存パッケージ入れる(Javaなど)
* Erlang入れる(OTP 18以降が良い)
* Elixir入れる

## Linux
参考：http://qiita.com/Nappa723/items/1e5b5f961754dc79dbe6
　　　http://qiita.com/voluntas/items/a39cf3ec1a385e612f2a

### Java(Cent OS)
既にインストール済みならば飛ばしてOK

```shell-session
sudo yum install java-1.8.0-openjdk-devel
```

### Others(Cent OS)

```shell-session
sudo yum install gcc gcc-c++ wxGTK wxGTK-devel \
fop ncurses ncurses-devel \
openssl openssl-devel \
mariadb-server mariadb unixODBC unixODBC-devel
```

### Erlang

バージョン管理ツールのkerl( https://github.com/kerl/kerl )を利用する。

```shell-session
curl -O https://raw.githubusercontent.com/kerl/kerl/master/kerl
chmod a+x kerl
```

パス通っているところに置く。

```shell-session:example
sudo mv kerl /bin/
```

利用可能なパッケージを探す

```shell-session
kerl update releases
kerl list releases
```

ビルド

```shell-session
kerl build 19.1 19.1
```
2つ目の19.1はビルドに付ける名称。



## Mac

### Java
既にインストール済みならば飛ばしてOK

参考：http://qiita.com/yanap/items/186d5bd1118f68f725d8

```shell-session
brew cask install java
```

```bash:~/.bashrc
export JAVA_HOME=`/usr/libexec/java_home -v 1.8`
```

### Elixir

```shell-session
brew install elixir
```

## Windows

### chocolatelyインストール
macでいうhomebrew。

コマンドプロンプトを管理者で開く

```bat
@powershell -NoProfile -ExecutionPolicy Bypass -Command "iex ((new-object net.webclient).DownloadString('https://chocolatey.org/install.ps1'))" && SET PATH=%PATH%;%ALLUSERSPROFILE%\chocolatey\bin
```

### Elixir
コマンドプロンプトを管理者で再起動して

```bat
cinst elixir
```

# REPL
## 起動

```shell-session
iex
```

## print

```shell-session
iex(1)> IO.puts "Hello"
```

```shell-session:output
Hello
:ok
```

## bind variable

```shell-session
iex(2)> a = 1
iex(3)> i a
```

```shell-session:output
Term
  1
Data type
  Integer
Reference modules
  Integer
```

## その他の機能は公式ドキュメントを参照

http://elixir-lang.org/docs/stable/iex/IEx.Helpers.html#content
RubyPico - スマホで楽しくプログラミングできるRuby開発環境 

この記事は[個人開発者 Advent Calendar 2016 - Qiita](http://qiita.com/advent-calendar/2016/individual-developer)の1日目の記事です。今日は私(おんがえし)が趣味で開発しているスマホ専用のプログラミングアプリ[RubyPico](http://rubypico.ongaeshi.me/)を紹介します！


> 個人開発者 Advent Calendarは、個人(数人でもOK)が趣味で作っているものを発表していくアドベントカレンダーです。制作物の規模、言語やジャンルは問いませんのでお気軽にご参加ください。(まだまだ空きがありますので引き続き参加者募集中です！)

## RubyPicoとは？
http://rubypico.ongaeshi.me/

スマホで楽しくプログラミングできるRuby開発環境。ファイルビューワ、エディタ、実行環境を含みます。(無料です)

PC環境がなくてもRubyを使ったプログラムが書けるようになります。便利なツールやゲームを作ったり、他のアプリの起動、Web APIなど用途はさまざまです。まずはRubyを学習してみたい人にも最適です。

## インストール
[App Store](http://rubypico.ongaeshi.me/ja/download.html)からダウンロードできます。

## irb
![rubypico-advent-01.png](https://qiita-image-store.s3.amazonaws.com/0/3885/1f36ff22-24f0-6f26-6ccd-a0e0683eb050.png "rubypico-advent-01.png")

Rubyを対話的に実行することができます。Rubyの機能をちょっと確認してみたり、便利な電卓としても使えます。irbを使うためにRubyPicoをインストールしている人もいるようです。

## Rubyのコードがそのまま動く
RubyPicoは[mruby](http://mruby.org/)というRubyの兄弟を使って作られているため、世の中にたくさんあるRubyのサンプルコードがそのまま(もしくは少しの修正で)動かすことができます。

以下は[初めてのRuby](https://www.amazon.co.jp/exec/obidos/ASIN/4873113679/)(Rubyのために書かれた本です)という書籍内で紹介されていた素数を求めるプログラムです。

```ruby
(2..100).each do |candidate|
  sqrt = Math.sqrt(candidate)
  factor_found = (2..sqrt).any? {|i| candidate % i == 0}
  if factor_found then
    print "#{candidate} は合成数\n"
  else
    print "#{candidate} は素数\n"
  end
end
```

RubyPico向けに少し調整してありますが、以下のようにちゃんと動きます。

![rubypico-advent-02.png](https://qiita-image-store.s3.amazonaws.com/0/3885/d1e59fe9-1e0b-e574-9abc-3589ca9413f5.png "rubypico-advent-02.png")

RubyPicoが使えるようになればRubyも書けるようになる(かもしれない)、ということでもあります。

Rubyは[GitHub](https://github.com/)や[クックパッド](http://cookpad.com/)といったたくさんの人達に使われているサービスを作るために世界中で使われているプログラミング言語です。RubyPicoをきっかけにRubyに興味が沸いたら是非[Ruby](https://www.ruby-lang.org/)にもチャレンジしてみてください。

## もっと知りたい
RubyPicoはまだまだ開発中のアプリケーションです。最新情報は私のブログに投稿されますのでそちらをご覧ください。

- [RubyPico 0.9.2 リリース - Appタブ、irb、Browser.post、choise](http://ongaeshi.hatenablog.com/entry/rubypico-0.9.2)

- [rubypico カテゴリーの記事一覧 - ブログのおんがえし](http://ongaeshi.hatenablog.com/archive/category/rubypico)

チュートリアルとして20分ではじめるRubyをRubyPicoを使ってやるのもよいかもしれません。

- [20分ではじめるRubyPico](http://rubypico.ongaeshi.me/ja/doc/quickstart/)

最新版ではこんなこともできます。

- [LINE Notifyの送信](http://ongaeshi.hatenablog.com/entry/2016/11/14/235638)
- [Gistに自分の書いたコードを保存](http://ongaeshi.hatenablog.com/entry/2016/11/13/005602)
Hack U 京都工芸繊維大学 2016 チューターしてきた

`ファーストサーバ Advent Calendar 2016` の 3日目を担当させていただきます。 `tono0123` です。
今日は、 `Hack U 京都工芸繊維大学 2016` にチューターとして参加してきたレポートを紹介させていただきたいと思います！

### Hack Uとは？

世界中のYahoo!で開催されている開発コンテスト"Hack Day"をベースに、Yahoo! JAPANと教育機関が共同開催しているのが"Hack U"です。
[公式サイト](http://hacku.yahoo.co.jp/kit2016/)
私たち社会人が、学生さんのものづくりの場をサポートします。

### Hack Uの概要

3,4名で1チームに分かれ、それぞれにチューターがつきます。
学生さんはアイディアを自分で考え、発表会までにモノを作り、発表します。
私たちチューターはアイディア出しのヘルプや、随時質問に答えたり、
中間報告の場を設け、相談に乗ったりします。

最初に説明会があり、チームビルディングとチューターの紹介があります。
ここで、[myThings](https://mythings.yahoo.co.jp)、[myThings Developers](https://mythings-developers.yahoo.co.jp/)を使ったアイディアソンもありました。

今回のHack Uは

* Music × IoT
* Sport × IoT

というテーマで、学生さんがそれぞれ考えたアイディアを
モノにし、発表します。

審査基準は、

```
新規性（技術や組み合わせのオリジナリティがあるか）
技術性（利用している技術は高度か）
発展性（将来どの程度の波及効果が期待できるか）
再現性（アイデア、プレゼンテーションだけではなく実際に動くものがあるか）
```

を総合的に見て、審査員が判断します。

学生さんは、大学の授業、アルバイトをしながらなので、大変です。
さて、3週間後の発表はどうなるのか！？

### 担当したチーム

私がチューターをさせていただいたチームは、
「Untilet」(アンティレット)というチームでした。

それぞれコンセプトを考え、発表の仕方などを随時アドバイスしました。
連絡方法はFacebookやSlackです。

なかなか社会人に対して発表する場はないので、
発表の仕方やプレゼンの方法、
デモがちゃんとできるようになど、様々なことをアドバイスしました。


### 発表

1チーム 発表3分、質疑応答2分で発表が始まりました。
全チームの発表の後、みんなで作ったモノのデモを行います。

簡単に各チームの概要を紹介したいと思います。

1. Untilet(アンティレット)

```
Sports × IoT

うんちのにおいから犬の健康状態を知らせてくれる
```

![Slack for iOS Upload (3).jpg](https://qiita-image-store.s3.amazonaws.com/0/85603/1c14679e-cca9-05e0-ed44-2a0716ff9efb.jpeg "Slack for iOS Upload (3).jpg")



2.ツナ缶

```
Music「ツナガルバム」 × IoT

誰かのおすすめの曲を知ることができる
ユーザがツナガルバムを持っていたら音楽を交換できる。ユーザIDを交換
```

![Slack for iOS Upload (2).jpg](https://qiita-image-store.s3.amazonaws.com/0/85603/9affd3d7-db49-b0ad-5c1a-17cd7781d213.jpeg "Slack for iOS Upload (2).jpg")


3.Team23

```
Sports × IoT

アマゴルファー傘
傘にとりつけてスイングすると、飛距離やコースを計算して出してくれる
```

4.Indigo

```
Music × IoT
Synchoronicity

エンジニアがいなかったチーム
ヘッドフォンをつけていると、自分の感情が高まった時に
流れていた曲を貯めることができる
```

5.ACBALL

```
Sports × IoT

正確に回転数、球種のキレなどを数値化する
消耗品であることを利用したビジネスモデル
```

各チームみんな素晴らしいものを作っていました。

構成としては、

* Raspberry Pi
* Python

を使っているチームが多かったです。

`その後のビジネスモデル、競合他社` など
作ることだけではなく、プラスで考えられているところが
賞に結びついたかなと思いました。

ちなみに担当チーム「Untilet」は賞をもらっていました！
優勝賞品はドローン

![Slack for iOS Upload (1).jpg](https://qiita-image-store.s3.amazonaws.com/0/85603/a55e141b-b535-6318-c52c-a33d77acc55b.jpeg "Slack for iOS Upload (1).jpg")


みんなで遊びました!

発表後は懇親会
お酒やジュースでお互いの健闘を称え合います


### まとめ

学生さんにとっては就活にも役立つ良い機会ですし、社会人とのつながりも出来ます。
社会人にとっては、学生さんから良い刺激がもらえて素晴らしい場だと思いました！
生まれてきた子供のためにWebサービスを作ったった話

子育て AdventCalender2016 の1日目ということで
2日目以降の方々の記事を書くハードルを極限まで下げる記事を書いていきたいと思います　笑

## 作ったサービス
姓名判断 - HITOKOE - パパ、ママの名前から赤ちゃんの名前を考える姓名判断サービス
http://www.hitokoe.link

## 何ができるの？
親の漢字を一文字使った上で、組み合わせの良い子供の名前をリスト化するサービスです。

## 何故作ったか？
2015年3月に子供が生まれまして、子供の名前に自分の名前を一文字使いたかったので、作ってみました（笑）

## ハマったところ、苦労したところ
- 常用漢字がMySQLのUTF8だと入らない。

詳しくはここで。
http://itpro.nikkeibp.co.jp/article/COLUMN/20091209/341831/

MySQLの文字コードをutf8 => utf8mb4 に変更する事で対応。

## 今後の方針
- 良い命名の組み合わせを行うロジックは共通化できるので、gemにしようか考え中。
- 旧字体の対応

ネタサービスなので、そこまで真剣にならずに、こんな名前もあるのかーくらいの参考に使っていただければ幸いです。
Boostnoteで授業ノートを取る利点

# 自己紹介

今回は多分初？の試みで団体として「HAL Advent Calender」を作ってみました。

HAL大阪2回生IT学部Web開発学科(IW)のじゅんじゅんです。

普段は、学校とアルバイトで毎日を過ごしています。

よくイベントに出てるのでもしご一緒になることがあればお話ししましょう！


# なぜHALのアドベントカレンダーを作ったのか。

僕は去年からこのエンジニアの世界へ入ってきて、たくさんのことを学んでいく上でQiitaの存在はかなり大きく、そのQiitaが12月は毎年、Qiitaアドベントカレンダーとかいうものやってるらしい。ということで、去年（2015）はMilkcocoaで[milkcocoaを使って、誕生日サイトを作った話](http://qiita.com/konojunya/items/2fda9cf6d9e6e5b7c430)を書きました。

結局今の段階（2016/11/12）では12ストックされていて、自分の記事を見てくれてる人がいるのが感じれたのが嬉しくてQiitaにハマった感じです。

その喜びから今年も何かは書こうと思っていたんですが、せっかくなのでHALでアドベントカレンダー作っちゃお！って気分で作りました。

他にも、普通の言語のアドベントカレンダーだとちょっと恥ずかしい..とか思う人もいるかもしれないのでHALっていう身内のカレンダーを作るとこにより記事を書きやすくする効果も狙っています。

# 一発目は...

そんな話はもう早々に置いておいて。

今回その一発目なのでゆる〜く自分が普段使ってるノートの紹介でもしようかなと思います。

しかし、ただのノートではなく**プログラマー向けのノート**です。

その名も**[Boostnote](https://b00st.io/)**

ロゴもイケメンです。

![boostnote logo](https://b00st.io/assets/img/logo.png)

ノートはこんな感じです。（公式サイトの画像を引用）

![boostnote](https://b00st.io/assets/img/ui.png)

これで授業のノートをとってるんですが、利点がいくつかあるので共有しておきます

## 欠点

欠点は本当にないんですが、強いて言うなら図形は書くのは難しいと思います。

どこか外部のサービスで書いて、画像化して貼るぐらいしかできないと思います。

## 利点

- markdownでかけるので直感的にノートを取ることができる。
- 言語の授業でも、シンタックスがあるのでサンプルコードが綺麗に見える。
- 簡単にシェアできる。
- 科目ごとに分けれるので、一気に探すことができる。
- オフラインでも書けるので、アプリだからといってオンラインでなくていい

そして何よりこのBoostnoteはオープンソースだということです！！！！！

Electronで動いてるんですが、じゃんじゃんissueください！とCTOはおっしゃってたので、ガンガンissueに欲しい機能を書いていきましょう（？）

もしくは自分で実装して、pullreqを出すのもOSSの楽しみ方としていいと思います！

他とは違ったエンジニアの学科だからこその楽しみでとてもオススメです！

# あとがき

Boostnoteはonline shopもあって、いけてるTシャツとかもあるのでチェックしていきたいですね！！

いつか開発侍のTシャツ着てHALにいきたいと思います（）

[Boostnote Shop](https://boostnote.paintory.com/)


twitter [@konojunya](https://twitter.com/konojunya/)
Cocoa State of the Union

今年も懲りずにCocoa Advent Calendarを立ち上げました。
今回は、第1日目ということで、自分自身のことを含めて、Cocoa関連について投稿いたします。

* 諸事情で今年からCocoa勉強会の開催方式が変わり、自分が幹事の勉強会は池袋で、ほぼ毎月開催するようになりましたが、逆にこれが活性化に繋がったのではないかと思います。他の勉強会へも積極的に参加するようになり、得るものが大きかったです。
* 以前より、CocoaはmacOS向けという位置付けが強くなったように感じます。
* Carbonとの対比の必要がなくなり、Cocoaと呼ばれなくなったように思えます。
* Apple関連のアプリケーション開発のテクノロジーの興味の流れが、フレームワークから言語、具体的にはSwiftに移ってきましたが、その分、薄くなったように感じます。
* iMessage App Storeのように、新たなビジナスチャンスが現れてきました。
* サーバサイドSwiftが立ち上がろうとしています。ただ、Cocoaのフレームワークがない環境で言語だけ存在して、どういうことになるのか？

二日目以降は、より具体的な内容について投稿していきたいと思います。

【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</a>note<br />
プロパティが変更されたことをBus messageから知る (GStreamer 1.10)

アドベントカレンダー1日目 ~ 3日目までは、私が GStreamer 1.10 で実装された
新APIのハンズオン?使ってみた?をやろうと思います。

1日目は[リリースノート](https://gstreamer.freedesktop.org/releases/1.10/)先頭に書かれている、こちら(↓)の機能


> **Receive property change notifications via bus messages**
>
> New API was added to receive element ... (長いので省略)
>

Bus message経由でプロパティの変更通知を受け取るというものです。

今まではプロパティの値が変わったことを知るために、GObject APIの`signal`を使ったcallbackを書く必要があったわけです。
しかし、この方法はGStreamerとしてはあまりきれいではないものでした。

それは、Pipeline(Element)→Applicationの通知は、Elementの状態遷移(GST_STATE)を伝える時のように、「ElementがBusにMessageを流し、Applicationがこれをフックする」というの流れが基本だからです。

![communication](https://gstreamer.freedesktop.org/documentation/application-development/introduction/images/communication.png)

新しく実装されたこのAPIによって Element -> Bus -> Application の正しい?(理想的な?)流れで通知を渡せるようになりました。

## サンプルコード

そこで、[gst-element-add-property-notify-watch](https://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html#gst-element-add-property-notify-watch) を使ったサンプルを書いてみました。

[![実行画面](http://img.youtube.com/vi/ShBsh4zNllA/0.jpg)](https://youtu.be/ShBsh4zNllA)

`Ctrl-C`のSIGINTにより、`videorate`の`max-rate`を10<->30と切り替えるものです。
アプリケーションスレッドからプロパティを書き換えと、Bus経由で変わったことが伝わってくるのが見えます。

ソースコードは Gist に貼ってます。
https://gist.github.com/shocrunch/a764b64adb52c47751b1c1114c503e15ｂ
選択範囲をコピーしてもコピーモードを終わらせない方法

tmuxで，ひとまずviモードでの話しかしませんが，プレフィックスキー入力からの `C-[` でコピーモードに入った場合，`Space` で範囲選択を開始し，`Enter` で選択範囲をコピーすることが出来るのはよく知られていることだと思います．

tmux使ったことない人は何のことか分からないかもしれませんが，これが出来ると，ターミナル上に表示されている出力を，マウスを触ること無く，コピーしてペーストすることが可能です．詳しいことはtmuxの紹介記事などを参考にしてみて下さい．

※ちなみにこの機能は死ぬほど便利なので全てのターミナル(黒い画面)ユーザは今すぐtmuxを使うべきです．似たソフトにscreenというのもあります．screenをキレイに使うためのbyobuというのもあります．どれでもいいですがtmuxがナウなヤング向けです．

※もしかしたらこういうことが出来るターミナルエミュレータソフトもあるのかもしれません．そういうのを使ってる人は気にしないで下さい．VimやEmacsでなんとか出来るぜ！という人もいるかもしれません．そういう人も気にしないで下さい．

さてそのコピーモードで私が長年不満に感じていたことが，コピーを終えるとコピーモードが終了してしまい，カーソルも普通のプロンプトの場所まで戻ってしまうことでした．遠いところまでスクロールした後や，検索機能でやっと見つけた場所で，複数ヶ所のコピーをしなければならないとき，コピーモードでのカーソルの移動をコピーの度に行わなければなりませんでした．

出来るものなら，範囲選択をしてコピーをしても，コピーモードが終了せず，カーソルがそのままの位置にいてくれればいいのに…と思っていました．

それ，`-x` オプションで出来ます．

tmuxの設定ファイルであるところの `~/.tmux.conf` に例えば以下の行を加えます．

```
bind-key -t vi-copy y copy-selection -x
```

追記: tmux 2.4からこの設定の仕方ではダメで以下のようにする必要があります

```
bind-key -Tcopy-mode-vi y send -X copy-selection
```

そもそも従来の `copy-selection` が `copy-selection-and-cancel` という名前に変更されており，`copy-selection` だけで(`-x`オプションとかなしで)望みの挙動が実現されています．

参考

- 
 https://raw.githubusercontent.com/tmux/tmux/master/CHANGES

追記おわり

こうしておいて，普段 `Enter` でコピーをしていた代わりに，`y` を入力します．そうすると，tmuxのバッファにはコピーした情報が入りますがコピーモードは終わらずカーソル位置もそのままです．精神の健康を保ったまま，次の場所のコピーが出来ます．

※もちろん，コピーした内容を都度別のウィンドウなりペインなりで開いているテキストエディタなどにペーストしていく動作は忘れないようにして下さい．ただ，もしかしたらこういう不便も解消する，Vimのレジスタみたいな，名前付きのバッファ機能があったりするかもしれません．何か知ってる方居ましたら教えて頂けると幸いです．

※追記です．プレフィックスキーからの `#` で，コピーした履歴が見られます．なので，コピーした都度ペーストして回らなくてもなんとかなるっぽいですね．

参考

- https://twitter.com/kariya_mitsuru/status/803986146896117760
- https://twitter.com/kariya_mitsuru/status/803987120561917952

`y` 以外に割り当てたい人は，見たまんま，`... vi-copy y copy-sel...` と書かれている部分の `y` を好きなキーに変えて下さい．

ちなみにtmuxのバージョンは2.3で私は確認しました(`tmux -V` コマンドで確認)．もっと古いバージョンでも大丈夫かもしれませんし大丈夫じゃないかもしれません．将来のバージョンでは大丈夫じゃないかもしれません．

あと，これだけドヤ顔して書いておいて，「実はデフォルトのキーバインドで出来るよ」ってのがあれば，むしろ教えて下さい．助かります．

## References

- [tmux での1行コピー または man tmux に載っていないコマンド - @m4i's blog](http://m4i.hatenablog.com/entry/2012/02/13/155233)
- `man tmux` して `selection-copy` で検索してると出てくる `-x` オプションの説明

## 検索用キーワード

tmux コピー コピーモード 終わらせない 継続
ImageViewにランダムな画像を表示する

## はじめに

今回のエントリでは、AndroidのImageViewの中にランダムな画像を表示するための手順を説明していきます。
以下は、音楽のアルバムリストにアルバムアートがない場合にランダムな画像を表示するような処理を想定して記入しています。

## フォルダ構成

今回の内容を説明していくにあたり、Androidのソースコードのフォルダ構成を以下のようにしています。

> /main
　├ java  # AndroidのJavaソースファイル
　├ res   # リソースファイル
　　　├ ...
　　　├ layout    # レイアウトファイル
　　　├ drawable  # 画像ファイルを配置
　　　├ values    # 画像ファイルの配列を追加

## 1. layoutファイルにImageViewを追加

まず、初めにlayoutファイルにランダムな画像を表示するためのImageViewを宣言します。

```xml:sample.xml
    .
    .
    <ImageView
        android:id="@+id/list_album_art"
        android:layout_width="70dp"
        android:layout_height="70dp"
        android:padding="3dp" />
    .
    .
```

## 2. リソースのdrawableフォルダ配下にランダムに表示させる画像素材を配置

続いて、ランダムに表示させる画像の素材を上記のフォルダ構成の drawableフォルダ配下に配置することで、リソースとして利用できるようにします。

> ├ drawable  # ここにファイルを配置
　　├ albumart_blue.png
　　├ albumart_lightblue.png
　　├ albumart_purple.png
　　├ albumart_red.png
　　├ albumart_yellow.png


## 3. リソースのvaluesフォルダ配下に画像素材の arrayを追加

次に、valuesフォルダ配下に arrays.xmlを追加し、先程の手順2で追加した画像素材を配列のリソースとしてまとめます。

> ├ values
　　├ arrays.xml  # 追加

arrays.xmlは以下のような内容にします。

```xml:arrays.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <array name="default_albumart">
        <item>@drawable/albumart_lightblue</item>
        <item>@drawable/albumart_blue</item>
        <item>@drawable/albumart_purple</item>
        <item>@drawable/albumart_red</item>
        <item>@drawable/albumart_yellow</item>
    </array>
</resources>
```

# 4. Javaコード内に画像をランダムで選択する処理を追加

最後に、手順3のarrays.xmlに記入した要素 default_albumartを利用して、ImageView(list_album_art)にランダムな画像を表示する処理を以下のように記入します。

```Java
.
.
// ImageViewを変数化
ImageView albumArt = (ImageView) view.findViewById(R.id.list_album_art);

// ランダム画像のリソースの配列を宣言
TypedArray typedArray = getContext().getResources().obtainTypedArray(R.array.default_albumart);

// ランダムな数値を設定（※今回は配列の長さが5のため、5を指定）
int rand = (int)(Math.floor(Math.random() * 5));

// ランダムで画像を選択する
Drawable drawable = typedArray.getDrawable(rand);

// ImageViewの画像の値を設定
albumArt.setImageDrawable(drawable);
.
.
```

## 5. 出力結果

上記の内容を実装することで、以下のファイルのようにランダムに画像を表示できるようになります。
以下の画像のようにリスト表示する場合、同じ画像が連続して表示されてしまう場合があるので、連続表示を防ぐ場合は前の状態を見て判断するなどの工夫が必要になりそうです。

![album_list.png](https://qiita-image-store.s3.amazonaws.com/0/69983/23a2064f-c83e-ebca-9527-7aebeb2d2039.png)


## 参考文献

1. 画像をランダムに表示する。 - ふわふわぷかぷか, http://fuwafuwapukapuka.hatenablog.com/entry/2014/03/06/214525, Online; accessed 30-November-2016.
2. android：ランダムに画像とテキストを切り替える(重複なし) _ Activity _ asky, http://asky.sakura.ne.jp/wp/2015/08/20/15082001/, Online; accessed 30-November-2016.
iPhoneの連絡先をバックアップ

iPhone上の連絡先には多くの情報が含まれています。失われたら、大変ですね。でも、ご心配なく、今回はみなさんにiPhoneから連絡先をバックアップする方法を2つご紹介します。

その前に、まずは必要なツール-AnyTransご説明します。
AnyTransとはiPhone＆iPod＆iPad専用のデータバックアップ＆転送ツールです。このツールを使えば、iPhoneのデータを簡単にパソコン・iTunes・他のデバイスに転送できます。また、サポートされたデータも連絡先、通話履歴、写真、音楽などの25種類に達しました。

詳細な情報は以下のリンク先をクリックして確認してください。

参照元:
https://www.imobie.jp/support/backup-contact-from-iphone.htm
フリーランスとは？

まずは、一年ぶりのご無沙汰でした。
何とか生きていました。生活が苦しかったけど。。。

# フリーランスの定義

>   フリーランス（英: freelance）は、特定の企業や団体、組織に専従しておらず、
    自らの才覚や技能を提供することにより社会的に独立した個人事業主もしくは
    個人企業法人である。略してフリーと呼ばれる。企業から請け負った業務を実
    際に遂行する本人をフリーランサーと呼ぶ。日本語では自由契約（ただし、プ
    ロスポーツでの選手契約を更新しないことを指す「自由契約」が有名なため、
    フリーランスを指して自由契約と呼ぶことはほとんどない）。一般的な職業分
    類では個人事業主や自由業に該当する。　(ウィキペディアより）

https://ja.wikipedia.org/wiki/%E3%83%95%E3%83%AA%E3%83%BC%E3%83%A9%E3%83%B3%E3%82%B9

まあ、IT系でフリーランスと言えば、下請けの業務委託や準委任委託業務を指すわけで、上司がいたり、リーダーがいたりするけど、部下がいたりすることは希。

準委任委託業務なんかは、成果物を要求しない作業時間を提供するSES型か、成果物を要求される下請け（協力会社とも言う会社もある）。

どちらにしても、雇用保険などないので、契約が切れればそれで終わりだし、酷い場合には、瑕疵担保責任を負えと言って、タダ働きさせる悪徳な企業もあるので注意。

初心者は、Ｃ社かＬ社なんかの大手派遣会社経由で、業務を契約すると担当営業やコンサルタントが、何かあったとき守ってくれるし、代理でその請負先にクレームを付けて交渉してくれる。

直接、請負先の企業と契約を結ぶ場合は、契約条件とか支払条件、責任範囲などに注意する必要があるので、初心者にはおすすめできない。

こう見えて、私はフリーランス７年目なので、楽しさも苦渋も味わっている。

こんな感じで、最近フリーランスになることを国も推進しているので、
騙されて人生を無駄にしないように、自分の持っている経験を晒して行こうと思う。

では、また明日。
RStudioのGUIからデータ読み込み

この記事は[RStudio Advent Calendar 2016](http://qiita.com/advent-calendar/2016/rstudio-ide)の1日目の記事です。

Rによるデータの読み込み
-----------------------

Rでデータを読み込むには様々な方法があります。一般的によく使われるのがCSVファイルに対して`read.csv()`を実行するものがあります。

最近では読み込みのためのパッケージも色々開発されており，高速にCSVファイルを読み込む`readr`パッケージや，Excelのファイル(.xlsや.xlsx)を読みむ`readxl`パッケージ，あるいはSASやSPSS，Stataなどのデータを読み込む`haven`パッケージなどを利用して読み込むこともできます。

RStudioのGUIによる読み込み
--------------------------

RStudioにはGUIによるデータ読み込み機能がついています。これまでは.csvぐらいしか読み込めませんでしたが，**RStudio v1.0では`readr`パッケージ・`readxl`パッケージ，`haven`パッケージを利用して各種データセットを読み込めるようになりました**。今回はこれをご紹介します。

### Import Datasetボタン

RStudioの**Environment**タブをクリックし，**ImportDataset**をクリックします。

![Import_Dataset_menu.png](https://qiita-image-store.s3.amazonaws.com/0/35118/bd602eff-0680-4ae6-c577-f5f3431f219d.png)

展開されたメニューから，読み込ませたいファイル形式を選択してください。この時，`readr`・`readxl`・`haven`パッケージのどれかがインストールされていない場合，パッケージをインストールするかどうかを尋ねてきます。問題がなければそのままインストールしてください。

### From CSV

CSVファイルを読み込む際には，`readr`パッケージが利用されます。

"From CSV..."を選択するとダイアログウィンドウが開くので，まずは読み込むファイルを指定します。すると以下のような画面となります:

![Import_Dataset_from_CSV.png](https://qiita-image-store.s3.amazonaws.com/0/35118/2d6d01c4-e6e5-5053-1fa2-84a7f44c8757.png)

ファイルを指定すると，**Data Preview**にデータが表示されます。なお，このPreviewのところで列名をクリックすると，以下のようにデータ型を変更したり除外したりできます:

![Import_Dataset_select_class.png](https://qiita-image-store.s3.amazonaws.com/0/35118/16055533-fce2-93e2-42f1-84809eb6d8e8.png)

このData Previewの下にある**Import Options**で，格納するオブジェクト名(Name:)など各種設定が可能です。大抵のことはこれでカバーできるはずです。

そして最大の特徴は，**Code Preview**の箇所です。これは**読み込み設定した内容を実行するコードを表示**しています。よく「GUIだと読み込みのコードが残らなくて不都合が多い。だからダメだ。」という意見を聞きますし，私もそう思います。でもこれなら**あまり慣れていないユーザーでも読み込みのためのコードを生成できます**。ぜひ活用してもらいたいです。

### From Excel

Excelファイルを読み込む際には，`readxl`パッケージが利用されます。

"From Excel..."を選択するとダイアログウィンドウが開くので，まずは読み込むファイルを指定します。すると以下のような画面となります:

![Import_Dataset_From_Excel.png](https://qiita-image-store.s3.amazonaws.com/0/35118/55d8fa63-3cb9-299c-e7ab-ed49c4eee300.png)

基本的な見方・考え方は考え方は同一で，こちらにもCode Previewが表示されます。また`readxl`パッケージは「どのSheetから読み込むか」を指定することが可能で，そのためのオプションもついています。地味に便利です。

### SAS, SPSS, Stataのファイルについて

SAS, SPSS, Stataを選択すると，`haven`パッケージを利用して読み込みます。例えば，"From SPSS..."を選択すると，以下のようなダイアログボックスが表示されます:

![Import_Dataset_From_SPSS.png](https://qiita-image-store.s3.amazonaws.com/0/35118/16dddeee-0e3e-1e1c-c0a5-3772006b4f8f.png)

使い方はこれまでのパターンと同様です。

以上です。せっかくの機能なので，試しに使ってみてください。**Enjoy!**
D言語でウェブアプリ開発ができるか (2016年版)

2016年時点にD言語でもウェブアプリが書きたいと思い至って試してみた記録みたいなものです。ここに書いている内容はあくまで自分個人が調査した中で構成してみたウェブアプリ開発であり一般的な開発として推奨するものではないのでご注意ください。

## 所感

D言語でウェブアプリケーションを書くことはできなくはないと思いますが、まだまだライブラリの練度が足りなかったりドキュメントが整備されていなかったりしてるので覚悟をもってやる必要があります。

## パッケージ管理システム

多くのD言語使いはすでにご存知と思いますが、 [DUB](http://code.dlang.org/) があります。以下に紹介するライブラリはいずれもここに登録されています。

設定ファイルはJSON/SDLang形式で書くことができます。( [JSONフォーマットへのリンク](http://code.dlang.org/package-format?lang=json) ) 基本的に困ることはないのですが、[github urlへの指定のような形を提供したくないらしく](https://github.com/dlang/dub/issues/50) dubに登録されていないものは手元にもってくることが推奨されています。

## WAF

D言語にもWAFはいくつか存在しますが、デファクトと呼べるのは [vibe.d](http://vibed.org/) でしょう。

vibe.dはRejectedSoftwareが開発しているNon-Blocking I/O+ 協調スレッドをベースとしたWAFおよびネットワークライブラリです。コアのイベントドリブンのエンジン(バックエンドは選択可能で、デフォルトだと `libevent2` が選択されています)、やDBドライバ(Redis/MongoDBがレポジトリに同梱)、dietテンプレートエンジン、さらにメールクライアントなどから構成されています。

認証などは物足りなさを感じますが、最低限ウェブアプリを作成できそうな部品は揃っている印象です。ただしSessionStoreの実装がnull参照を簡単に掴めてしまったり、仮引数のデフォルト値にnullをカジュアルに入れてくる仕様になっているので雑に実装しているとしょっちゅうSEGVに遭遇します。ウェッブ開発にはgdbは必須ですね！！

## テンプレートエンジン

WAFの項で出てきたJavaScriptのjadeに影響をうけたdietの後継、 [diet-ng](https://github.com/rejectedsoftware/diet-ng) が現在のデファクトになると思われます。これはvibe.dに標準でbundleされています。他にmustache-dなどがありますが、今回はdiet-ngを使ってみました。

dietの記法は[ドキュメント](http://vibed.org/templates/diet) に詳しい記載がありますが2016/11/19時点ではString interpolationsで古い記法が紹介されていたりするので注意が必要です。ん？と思った時は[githubのレポジトリ](https://github.com/rejectedsoftware/diet-ng)を確認するとよいかもしれません。

オフサイドルールやclass/idの指定方法、 `include` など、基本的にjadeと同じような感じで書けると思います。一応semverのメジャーは1になっているんですがSPECみるとTODOのオンパレードだったりして一抹の不安はありますが今のところこれができなくてとても困る！といったことはありません。

## データベースドライバ

世の中データベースは星の数ほどあり、Dから使うことのできるものもたくさんあるのですべてを網羅することは大変です。ここでは私が慣れていること、非常に広く使われていることからMySQLドライバに絞って話をすすめさせてもらいます。

dubに登録されているパッケージの中では主だったものとして [mysql-native](https://github.com/mysql-d/mysql-native) と [mysql-lited](https://github.com/eBookingServices/mysql-lited) の2つがあげられます。どちらもvibe.dと一緒に扱えるように設計・実装されています。

ここではより機能が揃っている `mysql-lited` について取り上げます。

便利な機能でいえば、例えば MySQLRowオブジェクトから構造体へのmappingのときに `Strict.yes` / `Strict.no` の選択でカラムとの対応を厳密にチェックするか否かなどを選ぶことができます。

```d
Comment[] comments;
conn.execute("select * from comments where post_id = ? order by created_at desc", post.id, (MySQLRow row) {
        comments ~= row.toStruct!(Comment, Strict.no);  // Comment構造体とレコードの厳密なmappingを要求しない
    });
```

ただしこのライブラリ0.3.15時点ではupdateクエリを発行するとassertで例外を吐いた後にSegmentation Faultで落ちます。

完全に余談なのですが、D言語のMySQLドライバは他に [mysql-d](http://code.dlang.org/packages/mysql-d) というCのライブラリであるlibmysqlclientをラップしたものが存在します。これを検討に入れなかった理由というのはlibmysqlclient はブロッキングI/Oしか対応しておらず、vibe.dのようなイベントドリブンなネットワークライブラリとの相性が悪いということがあります。

## One More Thing...

`body` がD言語の予約語なのでカラムにbodyがあるときに困りました。どうも消される動きがあるみたいですがどうなるんですかね。
さよなら OpenSSL 1.0.1

SSL/TLS 通信のデファクト OpenSSL ですが、お使いのバージョンをご存知ですか。
もし 1.0.1 ならサポートが今月末までですよ。

# OpenSSL とは

Webブラウザでショッピングしたりする時など、https:// にアクセスしている時は SSL/TLS 暗号化通信をしています。このような暗号化された通信を行っている場合、SSL/TLS 通信モジュールとして OpenSSL が使われていることが多いです。それは、自分が選んでそうしているというよりなんとなくそうなっているのではないでしょうか。

OpenSSL は広く普及して様々なソフトウェアで利用されています。商用のソフトウェアやネットワーク機器なんかに組み込まれていることもあります。

その OpenSSL にはバージョンがあって、サポート期限があることをご存知でしょうか？

# OpenSSL の バージョン と リリース方針

現在の OpenSSL の [Release Strategy](https://www.openssl.org/policies/releasestrat.html) を見てみると以下のように書かれてます。

- バージョン 1.1.0 は 2018-08-31 までサポート
- バージョン 1.0.2 は 2019-12-31 までサポート (LTS)
- **バージョン 1.0.1 のサポートは 2016-12-31 で終了**
- バージョン 1.0.0 はもうサポートされていません
- バージョン 0.9.8 はもうサポートされていません

サポートが終了すると、セキュリティ脆弱性が発見されても修正版が出されなくなります。

# OpenSSL のセキュリティ脆弱性

OpenSSL プロジェクト は脆弱性を発見すると、以下のメーリングリストでアナウンスを出し、修正版をリリースします。
http://marc.info/?l=openssl-announce&r=1&w=2
2016年は大体３～４ヶ月に一度くらいの修正版リリースがありました。

# OpenSSL 修正版の適用

OpenSSL の修正版がリリースされた後には、Linux等のディストリビューションがその修正のパッケージをリリースします。
ソフトウェアで OpenSSL を組み込んでいるものは、修正を適用したバージョンをリリースしたりもするでしょう。
商用製品のパッチがリリースされたりすることもあります。

ユーザはこれらの修正版を適用していけばセキュリティ脆弱性を放置しなくて済むわけですが、OpenSSL のバージョンが古くて修正版がリリースされなければセキュリティ脆弱性を排除できなくなってしまいます。

修正版を適用せず古い環境のまま稼動しているコンピュータやネットワーク機器の OpenSSL バージョンいくつなのでしょう。
例えば一時期非常に騒がれた [Heartbleed](http://heartbleed.com/) が放置されたりしていないでしょうか。

# まとめ

OpenSSL 1.0.1 のサポートが今月末の 2016/12/31 までというお話でした。

LTS の 1.0.2 や最新の 1.1.0 より 1.0.1 は広く普及してると思われるので、このバージョンのサポート終了は多くの方への影響があると考え、この文章を書いてみました。

OpenSSL のバージョンは次のコマンドで確認できます。

```shell-session
$ openssl version
```

一度、自分の環境の OpenSSL のバージョンを確認してみてはいかがでしょうか？
Windows の Visual Studio から Mac に接続して Xamarin の iOS プロジェクトをビルドして実行する

実は長い間ほったらかしにしていたのですが、最近 Windows の Visual Studio から Mac に接続して Xamarin の iOS プロジェクトをビルドできるようにしましたので、そのときのメモを残しておきます。

## 公式ドキュメント

公式ドキュメントはこのあたりになると思います。

- [Introduction to Xamarin.iOS for Visual Studio](https://developer.xamarin.com/guides/ios/getting_started/installation/windows/introduction_to_xamarin_ios_for_visual_studio/) - [Developer Center - Xamarin](https://developer.xamarin.com/)

## 手順

前提です。

- Windows の Visual Studio でビルドできる。
- Mac の Xamarin Studio でビルドできる。

接続します。

1. Mac の System Preferences で Sharing > Remote Login を許可する。
1. Windows の Visual Studio で ツール > iOS > Xamarin Mac Aagent を起動し、 Add Mac する。コンピュータ名を入力。名前とパスワードを入力。

ビルドします。

1. iOS プロジェクトをスタートアップ プロジェクトに設定すると、デバッグ実行の候補に Mac 側のデバイスが出現する。
1. デバイスを選択してデバッグ実行。

![Device.png](https://qiita-image-store.s3.amazonaws.com/0/25692/2f9bcf2c-5d3e-7a0e-8a18-fddb3a47cf3c.png)

以上、簡単です:)

## 見覚えのあるダイアログ

Remote Login の設定は、 Visual Studio 起動時に表示されるダイアログ Xamarin Mac Agent Instructions で案内されていました。また、このダイアログに続いて Add Mac... ボタンのあるダイアログも表示されます。これをずっと無視してたんですよね、 Don't show this again はチェックせずに。

![XamarinMacAgentInstructions.PNG](https://qiita-image-store.s3.amazonaws.com/0/25692/494a8aad-624a-cd78-e725-96164bcdcfea.png)

## トラブルシューティング

### 【解消】 Finger print 云々で Mac に接続できない

この問題は 11/17 に 4.2.1.62 が出てから 11/22 に 4.2.1.64 で修正されるまでの短い間だけ発生していたバグのようです *1。11/16～17 に開催された [Connect(); // 2016](https://connectevent.microsoft.com/) で盛り上がって Xamarin を触っていた人たちが（私も）踏みました:D *2

*1 [Connect(); Keynote Releases](https://releases.xamarin.com/connect-keynote-releases/) | [Xamarin Releases](https://releases.xamarin.com/)
*2 [Xamarin for VS 4.2.1.62とAzure SDK 2.9.6でMac Agentに繋がらない問題の対策方法 ](http://www.nuits.jp/entry/2016/11/23/090429) - [nuits.jp blog](http://www.nuits.jp/)

### Invalid credentials. で Mac に接続できない

ユーザー名かパスワードが間違っています。

![InvalidCredentials.PNG](https://qiita-image-store.s3.amazonaws.com/0/25692/cc0dfe62-b046-8c8a-7be6-7d1b40f3cb58.png)

### Couldn't connect to (hostname). で Mac に接続できない

Mac にログインした状態で Mac と接続してください。

![CouldntConnectToHostname.PNG](https://qiita-image-store.s3.amazonaws.com/0/25692/1f597ccc-809f-7674-393c-2f3a03f86dec.png)

### ビルドの後の launch で失敗する

Windows 側と Mac 側とで Xamarin のバージョンを合わせてください。とりあえず最新にしてください。

### エラーは特に出ていないのにシミュレーターの画面が表示されない

Windows 側に画面を表示する Remoted iOS Simulator は Visual Studio **Enterprise** Edition 限定です。**Professional** や **Community** の場合は Mac 側で見てください。

---
API とは？

API という言葉は、ODBC、JDBC が出てきた頃から、エンジニアの方には馴染みのある言葉だったと思います。 「API=Application Programming Interface」 が正式な名前です。今回はAPI でも「Web API」 について説明します。 JDBC, ODBC などのRDB のAPI については別の記事で説明します。

API とはアプリケーションとアプリケーションの間でデータをやり取りする方法です。皆さんはすでにいろいろなところでAPI を利用しています。 モバイルを中心としたアプリケーションの地図情報の多くは、自分では地図情報を持たずGoogle map やBing map などのAPI から情報を取得しています。 アプリケーションから、検索エンジンからの検索結果や楽天商品検索などを参照しているときにもAPI が使われています。 モバイルアプリケーションでFacebook などの「いいね」ボタンが付いていて、それを押すとFacebook にログインもしていないのにFacebook で「いいね」が押される仕組みもAPI です。

##ウェブの仕組み##
API の仕組みの前に、ウェブ(WWW, World Wide Web)はどういった仕組みになっているかを簡単に説明します。

世界のどこかにWeb サーバーがあって、そこにウェブページやデータが存在しています。それをHTTP (HyperText Transfer Protocol)というプロトコルで呼び出しています。 ブラウザからHTTP リクエストを出す（URL をブラウザに入力する）ことで、別の場所にあるWeb サーバーがリクエストを受け付け、リクエストされたページのHTTPを返します。 ブラウザは帰ってきたHTTPをページという形で表示します。これがインターネットの仕組みです。

Web API は、ウェブページと同じように、HTTP でリクエストを送受信する仕組みですが、ウェブページ全体ではなく、データだけをやり取りします。 データをリクエストしてもウェブページ全体の情報が来るわけではありません。Web API では、同じHTTP を使ってデータだけのやり取りをしています。 データは一般的にJSON やXML といった形式が使われます。この仕組みが特にSaaS（Software as a Service）からデータのやり取りをする際にとても重要です。

![図1.png](https://qiita-image-store.s3.amazonaws.com/0/116843/ccc3edd1-e042-2b49-738d-bd8b9d9e985b.png)

##SaaS とカスタムアプリケーションのデータ利用における違い##
ここで、カスタムのアプリケーションとSaaS アプリケーションでデータを扱う場合を比較してみます。

カスタムアプリケーションは、UIがあって、ビジネスロジックがあって、データベースがあります。ユーザーはUI からアクセスしてアプリケーションを使います。 SaaS ではUI だけがあって、ビジネスロジックやデータベースはユーザーからは見えなくなっています。ただしユーザーとしてはUI を通じてアプリケーションを使っているという点では カスタムアプリケーションとSaaS では差がありません。
![図2.png](https://qiita-image-store.s3.amazonaws.com/0/116843/68ea4723-1266-0509-5510-e8f5552ae30e.png)
次に、ほかのシステムがアプリケーションを使う場合を考えてみましょう。カスタムアプリケーションでは、UI を通さずに他のシステムは直接DBにデータを取りに行きます。 ところがSaaS では、DB が見えなくなっているため、外部からDB に直接アクセスすることができません。そこでAPI （Web API）というデータだけをHTTP 経由でやり取りする仕組みを 使ってSaaS 内のデータを他のシステムから呼び出したり、データを書き込んだりしています。
![図3.png](https://qiita-image-store.s3.amazonaws.com/0/116843/650b16e6-3746-54b7-9225-5a169f7ee0f0.png)

##API のニーズの急激な拡大##
現在、アプリケーションの多くがSaaS として提供される中、API はとても重要になっています。公開されているAPI （Public API）の数は急増しています。 図より後の2016年8月時点では15,000を超えるAPI が公開されています（出展ProgrammableWeb）。日々新しいAPI が公開され、今後もさらにAPIの数は増加すると考えられます。 今後数年でAPI の数は100万を突破するとする予測も出ています。そしてAPI のユーザーは、エンジニアだけでなく、非エンジニアも含まれていくといわれています。

![図5.png](https://qiita-image-store.s3.amazonaws.com/0/116843/70c48075-d54f-fa67-9f2f-99647c822d20.png)
clock_gettime() で高精度なタイムスタンプを取得して表示する

katokenです。
本記事はACCESS Advent Calendar 2016の1日目の記事です。

# あらまし

株式会社ACCESSでは、PC以外の環境に主にPC向けのOSS Browser製品(WebKit, Chromium)をポートする[ソリューション](https://jp.access-company.com/products/browser/nx/)を提供しています。

これらの製品をポートする際、よくパフォーマンスが問題になるのですが、プロファイラやデバッガ等は使えない場合が多いです。
その場合、泥臭く根気よく`fprintf()`で頑張ります。

パフォーマンス測定にはタイムスタンプが必要ですが、遅いとはいえmicro sec 程度の精度のタイムスタンプがほしいですね。
また、画面やファイルに出力する方法も必要です。

そこでタイムスタンプの取得とその表示方法を紹介します。

# タイムスタンプの取得

Chromium にあったコードを参考にしました。 `struct timespec` を `uint64_t` に変換しています。

```c
#include <stdint.h>
#include <time.h>

uint64_t getTimestamp()
{
    struct timespec ts;
    clock_gettime(CLOCK_MONOTONIC, &ts);
    uint64_t absolute_micro = static_cast<uint64_t>(ts.tv_sec) * 1000000 +
                              static_cast<uint64_t>(ts.tv_nsec) / 1000;
    return absolute_micro;
}
```

64ビット型、便利ですねえ。
最近は気軽に使えるようになりましたが、昔は対応していないプラットフォームがあるために、ソリューションでの使用は禁止されていました。

64ビット型が使えない時はみんなこんなことをしていました。ちょっと面倒ですね。

Quoted from: [Calculate diff of two struct timespec](https://gist.github.com/diabloneo/9619917)

```
#include <time.h>

void timespec_diff(struct timespec *start, struct timespec *stop,
                   struct timespec *result)
{
    if ((stop->tv_nsec - start->tv_nsec) < 0) {
        result->tv_sec = stop->tv_sec - start->tv_sec - 1;
        result->tv_nsec = stop->tv_nsec - start->tv_nsec + 1000000000;
    } else {
        result->tv_sec = stop->tv_sec - start->tv_sec;
        result->tv_nsec = stop->tv_nsec - start->tv_nsec;
    }

    return;
}
```

# タイムスタンプの表示

`fprintf()` 系関数で値を表示するには、`%d`などのフォーマット文字列が必要ですね。

しかし、`uint64_t`に対応するフォーマット文字列は`man fprintf`には出てきてくれません。
じゃあどうするかというと、`stdtypes.h` で定義されるマクロを使います。

※ このへんは一本記事がかけるのですが、諸事情でまだ書けずにいます。

`uint64_t` に対応するフォーマット文字列は`PRIu64`で定義されおり、以下のように書くことで画面にタイムスタンプを出力可能です。

```c
fprintf(stderr, "timestamp: %" PRIu64 "\n", getTimestamp());
```

# 終わりに

プロファイラやデバッガがない状況下でタイムスタンプの取得と表示をする方法を紹介しました。
これを任意のポイントに配置することで、区間ごとのパフォーマンスを測定することができるようになります。

（ホントはGoについて書こうと思ったんだけど、時間が取れなくて今やっている業務のテクニック書いちゃいました）

明日もkatokenです。
こんどこそGoネタで行きたいと思います。

# 参考文献

[How to print a int64_t type in C](http://stackoverflow.com/questions/9225567/how-to-print-a-int64-t-type-in-c)
[Calculate diff of two struct timespec](https://gist.github.com/diabloneo/9619917)
[Chromium logging.cc TickCount()](https://chromium.googlesource.com/chromium/chromium/+/master/base/logging.cc#145)