OmniAICreator/Qiita-1.07M huggingface dataset:
【CSS設計】合成コンポーネントを@extendで実装する

コンポーネントを作る際、別のコンポーネントをパーツとして使うことがあります。
例えば、以下のアンケートテーブルでは、「アンケート行」が１つのコンポーネントになっていて、その中で「ボタン」コンポーネントが使われています。

![component-composition-1.png](https://qiita-image-store.s3.amazonaws.com/0/27052/e1e7afb3-3b6f-d99c-661f-66ecc70fb2ee.png)

これを素直に実装すると、「アンケート行」と「ボタン」をそれぞれ独立したコンポーネントとして実装し、HTML 上で組み合わせる、という感じになるかと思います。

```scss
.action-btn {
  // ボタンのスタイル
}

.enquete {
  // アンケート行のスタイル
}
```

```html
<table class="enquete-table">
  <tr><th>アンケート名</th><th>回答</th></tr>
  <tr class="enquete">
    <td class="enquete__title">アンケート１</td>
    <td class="enquete__action"><button class="action-btn">回答する</button></td>
  </tr>
  <tr class="enquete">
    <td class="enquete__title">アンケート２</td>
    <td class="enquete__action"><button class="action-btn">回答する</button></td>
  </tr>
  <tr class="enquete">
    <td class="enquete__title">アンケート３</td>
    <td class="enquete__action"><button class="action-btn">回答する</button></td>
  </tr>
</table>
```

これでも悪くはないのですが、`.enquete` と `.action-btn` の関係を Sass 上で表現できないため、「この２つを組み合わせて使う」というルールをどこかに定めておかなければなりません。

また、「回答済み」のスタイルをつくる際も、

![component-composition-2.png](https://qiita-image-store.s3.amazonaws.com/0/27052/003949ee-f941-1841-589a-29d917ed1fe5.png)

```scss
.action-btn {
  // ボタンのスタイル

  &--disabled {
    // 利用できないボタンのスタイル
  }
}

.enquete {
  // アンケート行のスタイル

  &--done {
    // 回答済みのスタイル
  }
}
```

```html
  <tr class="enquete enquete--done">
    <td class="enquete__title">アンケート３</td>
    <td class="enquete__action"><button class="action-btn action-btn--disabled">回答済み</button></td>
  </tr>
```

というように、それぞれの Modifier を用意して HTML 上で組み合わせなければならず、伝えなければならないルールが増えてしまいます。

## コンポーネントの関係を Sass 上で表現する
`.enquete` の Element としてボタンクラスを用意し、`@extend` を使って `.action-btn` を適用します。

```scss
.enquete {
  // アンケート行のスタイル

  // 回答ボタン
  &__answer-btn {
    @extend .action-btn;
  }
}
```

```html
  <tr class="enquete">
    <td class="enquete__title">アンケート１</td>
    <td class="enquete__action"><button class="enquete__answer-btn">回答する</button></td>
  </tr>
```

このようにすると、回答ボタンに `.action-btn` を使っていることが Sass を見ただけで分かるようになり、HTML を書く際に「組み合わせのルール」を参照する必要もなくなります。

また、使うボタンを `.action-btn` から `.control-btn` に変更することになった場合、元の実装だと HTML の該当箇所をすべて見つけ出して修正しなければならず、手間がかかる上に修正漏れが発生する可能性もありますが、この方法なら `@extend` するクラスを変更するだけで済みます。

## 回答済みボタンの Modifier も Sass 側で吸収する
`.enquete--done` の `.enquete__answer-btn` に、`@extend` を使って `.action-btn--disabled` を適用します。

```scss
.enquete {
  // アンケート行のスタイル

  &--done {
    // 回答済みのスタイル

    // 回答ボタン
    .enquete__answer-btn {
      @extend .action-btn--disabled;
    }
  }
}
```

```html
  <tr class="enquete enquete--done">
    <td class="enquete__title">アンケート３</td>
    <td class="enquete__action"><button class="enquete__answer-btn">回答済み</button></td>
  </tr>
```

これで回答済みのボタンには `.action-btn--disabled` を使っていることが Sass を見ただけで分かるようになり、HTML 側も単に `.enquete--done` Modifier を使っているだけのように書くことができます。
Firefox Developer EditionでMacTypeを有効にする

Firefox Developer EditionでMacTypeが有効にならない
という事象に悩まされていました。

以下の記載を順番に試していったところ、
自分の環境でうまくMacTypeが有効になる設定が見つかりました。

- [MacType doesn't affect Firefox font rendering ](https://github.com/phamquy/mactype/issues/27)

# 設定

有効である設定は以下の２つでした。

## 1. Use Hardware acceleration when available

Optionの設定で([about:preferences#advanced](about:preferences#advanced))、
`Advanced` -> `Use Hardware acceleration when available` 
のチェックを外す。

## 2. gfx.content.azure.backends

[about:config](about:config)にて、
`gfx.content.azure.backends`の値を
`direct2d1.1,skia,cairo`
から
`direct2d1.1,cairo`
に変更する（`skia`を削除する）。

# 考察

上記２つの設定を両方するとMacTypeが有効になりました。
どちらか一方でもデフォルト値に戻すとMacTypeは無効になりました。

「`gfx.direct2d.disabled`を`true`にする」という記述を
よく見かけましたが、この設定は影響しないようでした。

# 環境

## Firefox Developer Edition

```
Firefox Developer Edition 52.0a2 (2017-01-17) (64-bit)
```

## MacType

```
Windows 7 Service Pack 1
解像度:	1920 x 1200
MacType バージョン:	1.2012.1022.0
MacTray バージョン:	1.0.5.1529
MacTuner バージョン:	1.0.2.284
Portions of this software are copyright (c) 2005-2012 The FreeType Project (www.freetype.org). All rights reserved.
スペシャルサンクス: GDI++ author, THEMEX, linshangwo, fonlan, maxchow, CrendKing, dipplum
```
破天荒なHTMLでもスクレイピングする


「破天荒な」というのは、文法的にめちゃくちゃなHTMLのことではあるのですが、閉じタグがないとかまあ、そういうHTMLですね。

めちゃくちゃなHTMLでもチェックツールはあるんだし、なにかモジュールでも使って正しく整形しちゃえばスクレイピングできちゃうんじゃないの？と思って、調べて見るとありました。

[tidy](http://php.net/manual/ja/book.tidy.php)

HTMLをチェックして、整形する機能なんですねー。

基本的にスクレイピング案件なんて、手をつけないので、利用する機会はないと思う。「他人の褌で…」というのが性に合わない…。ただ、被スクレイピング対策に破天荒なHTMLを書いて、パースしにくくするという対策は効かないんだな、ということはわかった。

#うまくいかない場合のサンプル

実際に破天荒なHTMLのサイトがあれば、それで実験して見たいとは思ったのですが、ググったところで見つかるわけはないだろうと思うので、以下のサンプルで。

```php
<?php

ini_set('display_errors', true);
error_reporting(E_ALL);

$html = <<<HTML
<!DOCTYPE HTML>
<html lang="ja">
	<head>
		<meta charset="UTF-8">
		<title>タイトル</title>
	</head>
	<body>
	<div>
	<ul>
		<span>span</span>
		<div>
			<li>li1</li>
			<li>li2
			<li>li3</li>
	</body>
</html>
HTML;

$res = simplexml_load_string($html);
var_dump($res);
```

#対策済みのサンプル

```php
<?php

ini_set('display_errors', true);
error_reporting(E_ALL);

$html = <<<HTML
<!DOCTYPE HTML>
<html lang="ja">
	<head>
		<meta charset="UTF-8">
		<title>タイトル</title>
	</head>
	<body>
	<div>
	<ul>
		<span>span</span>
		<div>
			<li>li1</li>
			<li>li2
			<li>li3</li>
	</body>
</html>
HTML;

$config = array(
	'drop-empty-elements' => false, // 空の要素を削除しない
	'hide-comments' => true, // コメントを削除
	'output-xhtml' => true, // xhtml に変換
);

$tidy = new tidy();
$tidy->parseString($html, $config, 'utf8');
$tidy->cleanRepair();

$res = simplexml_load_string($tidy);
var_dump($res);
```
Emmetの記述法メモ

Brackets + Emmetを使い始めたので、記述法のメモ。
HTMLで大量の連番要素を並べたページを作るときなど便利。

| 記号 | 意味 |
|:-:|:-:|
| Tab | 展開(実行) |
| > | 子要素を追加 |
| + | 兄弟要素を追加 |
| ^ | 一つ上の要素を追加 |
| * | 複数作成 |
| $ | 連番（複数記述で0埋め） |
| @ | 連番の開始番号 |
| () | グループ化 |
| {} | 要素の中身を追加 |
| [] | 属性の後に=で値を追加 |
| . | classセレクタ |
| # | IDセレクタ |


例）

```html:index.html
(div.wrapper>>div.inner>a[href=images/photo/photo$$$$$.jpg][title=photo$$$$$]>img[src=images/photo/booth/booth$$$$$.jpg][alt=photo]^br+{テキスト})*6
```
I18nでno: hogeって書いたらキーがfalseになったでござる

# ActiveRecordのカラム名をI18n使って多言語化する場合

ここにありますが、キーにyesとかno使うと意図した動作をしません
[https://makandracards.com/makandra/24809-yaml-keys-like-yes-or-no-evaluate-to-true-and-false]

      question:
        contents: 質問内容
        no: 表示順

こう書いていたのですが、どうにもビューに「表示順」と出てくれないで「No」と出ます
コンソールで調べてみたら

> I18n.t('activerecord.attributes.question')
 => {:contents=>"質問内容", false=>"表示順"}

あれ？？　:noというキーがない。。。falseってなんだよ

以下のように修正することで解決しました！ I18nというよりRubyでYAML使う時の注意ですね

      question:
        contents: 質問内容
        'no': 表示順
Windows(PowerShell) で wgetコマンドぽくファイルをダウンロード

小ネタです。

Invoke-WebRequest コマンドを使います。

[Invoke-WebRequest](https://msdn.microsoft.com/powershell/reference/5.1/microsoft.powershell.utility/Invoke-WebRequest)

```ps1
Invoke-WebRequest -Uri https://s3.amazonaws.com/aws-cli/AWSCLI64.msi -OutFile AWSCLI64.msi
```

こんな感じで使えます。
`--Proxy`オプションなどもあり、Proxy環境でも使えそうです（未確認）
Dockerについてもやっとした気持ち

# コンテナ型仮想化とDocker

コンテナ型仮想化は便利である。chrootの時代から、jailの時代から、LXCの時代を経て、Dockerへ。
docker pullしてdocker runすれば、面倒なインストールなくサービスが動き始めるなんて、実に簡単ではないか。
Dockerfileに導入手順を記載しているようなものなので、構成管理もばっちりである。

本当か？

Dockerは少しやりすぎじゃないのか？

dockerhubに転がっているイメージをベースに何かしようとすると、そのイメージのベースはCentOSだったりDebianだったりする。それを動かしているホストはUbuntuで動いていたりする。

これ、本当に構成管理といえるのか？
systemcallに何か変更があったらアウトよね。まあそれくらい枯れてきたってことなんだろうけど。

だから、Dockerは出来上がったアプリケーションをブラックボックス化するパッケージングシステムと考えるのがよい。
すでにDocker環境ができあがっているものを起点として、ソースをいじりながら何かしようとすると、さらにその環境がよく分からないことになっていたりすると、わりと地獄である。DevOpsといいつつ、DevもOpも地獄になる。つらい。

だけど、黒魔法がDockerfileに既述されるようになっただけでも、マシだとも考えられる。

# Dockerはサービスのパッケージである

割り切って考えてみよう。Dockerは「サービスをパックしたもの」である。

そう考えた時、docker runで走って欲しいのはサービスである。仮想環境で動くフルスペックのOSではない。

だから、コンテナ向け軽量distroなんてのも出てきているけど、アプリの実行環境が動けばよいと言って思い出すのが、OSvなどのライブラリOSである。

ライブラリOSが動けばいいんじゃねえの？
いやいや、あれは足回りをvirtioなど簡素なものにしてメモリ管理などをハイパーバイザに押し込んでいるわけで、コンテナからはLinuxカーネルが見えているわけで、全然違うだろ。

そうね、そうだよね。違うよね。

でもね、あたい、思うんだ。コンテナの中にLinuxカーネルは必要なのかしらって、ね。

たとえば、Dockerfileから、Linuxカーネルを必要としない何かしらの環境用のイメージを作る方法……無理だ。Dockerfileの中や、entrypointの中でごちゃごちゃできすぎている。
特にentrypointの中でgit cloneして最新版に更新するぜとかやってる奴いるからな。
どうしよう。

entrypoint云々を無視すると、できあがったイメージから、libcの部分をするっと抜いて別のライブラリに置き換えて……違うな。

問題意識をもう一度整理してみると、サービスのパッケージを動かすのに、足回りにでかいdistro、あるいはでかいカーネルを引きずる必要はないんじゃないのか？ということだ。

こういったことを以前からごちゃごちゃと考えていて、実はそれはDockerがどうのではなくて、セキュアな基盤をうまいこと作れないかという文脈でなのだが、なかなかまとまらない。
同時に、対話的shellと実行環境と開発環境が混在しているUNIXの世界が、ごちゃごちゃしつつも、実に面白い世界なのだよなと改めて実感していたりする。

多分その面白さとセキュリティをどう両立させるかというのは、ポイントのひとつなのだろうけれど。
[Linux][systemd] タイムスタンプを起動からの経過時間で表示

dmesg等と同じようにLinuxの起動時間でのタイムスタンプで表示したかったので方法をメモ
検証環境は VirtualBox 上の Ubuntu16.04 です。

# 実行方法

結論としては、出力フォーマットに `short-monotonic` を指定すればよいです。

```bash:タイムスタンプを起動からの経過時間で表示
$ journalctl -o short-monotonic
or
$ journalctl --output=short-monotonic
```

# 実行例

```console:実行例
$ journalctl --output=short-monotonic | tail
[  146.085046] koara-VirtualBox systemd[1080]: Stopped target Default.
[  146.085226] koara-VirtualBox systemd[1080]: Reached target Shutdown.
[  146.085373] koara-VirtualBox systemd[1080]: Starting Exit the Session...
[  146.085644] koara-VirtualBox systemd[1080]: Stopped target Basic System.
[  146.085778] koara-VirtualBox systemd[1080]: Stopped target Paths.
[  146.085921] koara-VirtualBox systemd[1080]: Stopped target Sockets.
[  146.086052] koara-VirtualBox systemd[1080]: Stopped target Timers.
[  146.095780] koara-VirtualBox systemd[1080]: Received SIGRTMIN+24 from PID 2264 (kill).
[  146.098459] koara-VirtualBox systemd[1]: Stopped User Manager for UID 108.
[  146.099075] koara-VirtualBox systemd[1]: Removed slice User Slice of lightdm.
```

# 参考
[systemd のログを確認する journalctl – 愛しく切ない1bed](http://1bed.saloon.jp/?p=684)
[systemd - ArchWiki](https://wiki.archlinuxjp.org/index.php/Systemd#Journal)
[man journalctl の訳 - kandamotohiro](https://sites.google.com/site/kandamotohiro/systemd/man-journalctl-no-yi)
Ruby on Rails | FactoryGirl で特定のフィールドに依存した別のフィールドを作る

# コード例

名前と名字を元に氏名を作りたい場合。

```rb
FactoryGirl.define do
  factory :person, class: 'Person' do
    first_name { 'Bill' }
    last_name  { 'Wyman' }
    full_name  { "#{self.person_first_name} #{self.person_last_name}" }
  end
end
```

# 動作例

## build でも

```rb
FactoryGirl.build :person

# => <Person:0x007ff1e2f53cd8
# first_name: "Bill",
 #last_name: "Wyman",
 #full_name: "Bill Wyman",
```

## create でも

```rb
FactoryGirl.create :person

# => <Person:0x007ff1e2fa4868
# first_name: "Bill",
# last_name: "Wyman",
# full_name: "Bill Wyman",
```

# 環境

- ruby 2.3.1
- factory_girl (4.7.0)
- factory_girl_rails (4.7.0)








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Webカメラ使ってreal timeにdetectionしてみる

##はじめに
最近、故あってdetectionしてるが、ついでにwebカメラ使ってリアルタイムに物体検出すると面白いだろうと思った。そこで簡易なシステムを組み立ててみる。
##パソコン環境
OS:Ubuntu14.04
GPU:GTX1070
CUDA:8.0 RC
cuDNN:5.1
python2.7.6
など
##使用するwebカメラ
Logicool HD c270
https://www.amazon.co.jp/LOGICOOL-%E3%82%A6%E3%82%A7%E3%83%96%E3%82%AB%E3%83%A0-HD%E7%94%BB%E8%B3%AA-120%E4%B8%87%E7%94%BB%E7%B4%A0-C270/dp/B003YUB660/ref=sr_1_1?s=books&ie=UTF8&qid=1484720653&sr=8-1&keywords=logicool+c270
![41RhjwRYBAL.jpg](https://qiita-image-store.s3.amazonaws.com/0/116706/66bb0386-bc52-2f84-5059-725145cec47b.jpeg)
amazonだと1,000円くらいで売っている。しかし評価が高い。Ubuntuでも使えるみたい。
##利用するdetectionモデル
YOLO v2
http://pjreddie.com/darknet/yolo/
論文はこちら
https://arxiv.org/pdf/1612.08242v1.pdf
v1のロジックに関しては私がこちらにまとめてます。
http://www.slideshare.net/ssuser07aa33/introduction-to-yolo-detection-model
##webカメラのインストール
こちらのサイト
http://nort-wmli.blogspot.jp/2013/11/logicool-hd-webcam-c270.html
を参考にして進める。

まず買ってきたカメラをUbuntuパソコンに繋いでみる。当然反応なし。そこでmotionとやらをインストールする。

```
sudo apt-get install motion
```

うまくいったみたい。次に起動する。

```
sudo motion
[0] Processing thread 0 - config file /etc/motion/motion.conf
[0] Motion 3.2.12 Started
......
......
......
[1] Using V4L2
[1] Resizing pre_capture buffer to 1 items
[1] Started stream webcam server in port 8081
[1] File of type 8 saved to: /tmp/motion/01-20170118154150.swf
[1] File of type 1 saved to: /tmp/motion/01-20170118154150-01.jpg
[1] File of type 1 saved to: /tmp/motion/01-20170118154151-00.jpg
[1] File of type 1 saved to: /tmp/motion/01-20170118154157-01.jpg
```

などと、`/tmp/motion/`下にめっちゃ写真が保存され始めた。動画もそのディレクトリにあるが、swfという変な形式なので確認できない。そこで以下のように`etc/motion/motion.conf`を変更する。

```motion.conf
snapshot_interval 3000
```

##yoloモデルでreal timeにdetectionする
webカメラをUSBにさした状態でyoloのディレクトリに行く。次に以下のコマンドでreal timeなdetectionを開始する。

```
cd <path to yolo_darknet directory>
./darknet detector demo cfg/coco.data cfg/yolo.cfg yolo.weights
```

cfgやweightsをいろいろ変えて試してみると面白い。

出力結果の例は以下。
https://youtu.be/aAP8osZB0Fs
Cyberduck の Bonjour 通知をオフにする

Mac の優秀な FTP クライアントであらせられる~~電脳アヒル~~ Cyberduck さん。
当方100人以上のフロアに席があり、誰かが Bonjour してくるたびに通知が来る羽目になっていた・・・。

あまりにもウザすぎるということで、オフる方法を調べたのでメモを置いておく。

```bash:ターミナルで
$ defaults write ch.sudo.cyberduck rendezvous.enable false
```

以上。
もとに戻すときは逆に

```bash:ターミナルで
$ defaults write ch.sudo.cyberduck rendezvous.enable true
```

ってしてあげればおそらく良いはず（試してない）。
短いけどおしまい。
Windowで開発環境を作る方法

# 概要
会社のPCがWindowsで使いにくかったため、使用したツールのメモ。
Windowsは嫌です。。

# エディタ
[Atom](https://atom.io/)

## Atomパッケージ

### [japanese-menu](https://atom.io/packages/japanese-menu)
メニューバーなどが日本語になる。便利。

### [file-icons](https://atom.io/packages/file-icons)
ファイルのアイコンが表示されるようになる。おしゃれ。

### [pigments](https://atom.io/packages/pigments)
色が視覚的にわかりやすくなる。

### [project-manager](https://atom.io/packages/project-manager)

### [minimap](https://atom.io/packages/minimap)
ソースコードの横にミニマップが表示される。

### [Highlight Selected](https://atom.io/packages/highlight-selected)
選択した単語が読みやすくなる。

### [atom-beautify](https://atom.io/packages/atom-beautify)
HTMLなどのソースを綺麗にしてくれる。たまに微妙な時があるが結構いい。

### [color-picker](https://atom.io/packages/color-picker)
「Ctrl-Alt-C」で色を選べる

### [atom-beautify](https://atom.io/packages/atom-beautify)
HTMLなどのソースを綺麗にしてくれる。たまに微妙な時があるが結構いい。

### [PlatformIO IDE Terminal](https://atom.io/packages/platformio-ide-terminal)
Atomでコマンドプロンプトができるパッケージ。色々試したがこれが一番使いやすかった。

### [sass-autocompile](https://atom.io/packages/sass-autocompile)
Sassを利用した際に自動でコンパイルしてくれる。
PuTTYでキャッシュされたキーを削除する方法(Windows7)

#はじめに
PuTTYでローカルにキャッシュされたRSA2 KEYを削除する機会があったのでメモ。

#手順
① Windowsキー+Rで regedit と入力しRegistry Editorを起動する。

② HKEY_CURRENT_USER\Software\SimonTatham\PuTTY\SshHostKeys に格納されている情報の中から対象のものを削除する。
sharpを使ってExifの回転情報を画像に適用

## 背景
カメラを回転させて撮影した画像データには、EXIFで回転情報が含まれている場合がよくあります。EXIFに沿って表示をしてくれるソフトなら問題ないのですが、imgタグ経由の表示等でEXIFが読み込まれない場合、画像が意図していない方向で表示されます。

たとえば、いま僕が使っているOSX + Safariの環境だと、画像だけを表示した場合には回転情報が適用され、imgタグからの参照では回転が適用されません。

画像アップロードを考える場合には、EXIFを読み込んでサーバ側で画像を回転させ、EXIFを削除しておくのが一番トラブルが少なくなります。

## 実装
通常はImageMagick等を使うことが多かったのですが、別ソフトのインストールは何かと面倒です。それで調べてみたところ、sharpを使うと簡単に画像回転ができました。
https://github.com/lovell/sharp

rotate()を引数なしで実行することで、EXIFから読み込んだ回転情報が適用されます。

```js
"use strict";
const sharp = require("sharp");
sharp(infile)
    .rotate()
    .toFile(outfile, (err, info) => {

    });
```

npm install一発で画像が処理できるのは非常に快適です。さらにパフォーマンス的にも有利なようです。自分で確認はしてないですが。

```text
Resizing an image is typically 4x-5x faster than using the quickest ImageMagick and GraphicsMagick settings.
```

おためしあれ。
【Python入門】今最も勢いのあるプログラミング言語Pythonとは?

※こちらの記事は、プロスタ編集部が現在大変人気の高いPythonの文法記事を公開することで、皆様の学習にお役に立ちたい意図で投稿しております。

参考サイト：[【Python入門】今最も勢いのあるプログラミング言語Pythonとは?](http://programming-study.com/technology/python-is/)

#【Python入門】今最も勢いのあるプログラミング言語Pythonとは?

プログラミング言語「Python」は世界では非常に高いシェアを誇りますが、日本では意外と知名度が低い言語です。日本語の情報もCやJavaと比べると少なく、少しとっつきにくい印象があるかもしれません。しかしPythonは平均年収ランキングで1位となるなど、非常に将来性のある言語で、学んでみたいという方も多いと思います。

ここでは、Pythonがどういった言語なのかについて、簡単に説明します。

Pythonは1991年に登場した汎用プログラミング言語です。日本ではCやJava、Rubyなどと比べると知名度が低く、あまり知らない方も多いかもしれません。しかし、世界では非常にメジャーな言語として知られ、GoogleやMicrosoft、Appleといった大手IT企業や研究の分野でも活用されています。

##Pythonの特徴

###初心者でも読みやすくキレイなコードが書きやすい

PythonはCやJavaと比べると文法が簡潔でコーディングがしやすいので、初心者でもとっつきやすい言語になっています。

また、Pythonはインデント（字下げ）によってブロック（プログラムのかたまり）を表現します。例えば、C言語のプログラムは以下のように中括弧{}でブロックを表現します。

```
void func(int x, int y){
    return x + y;
}
```

たいして、Pythonはインデントでブロックを表現します。

```
def test(x, y):
    return x + y
```

そのため、Pythonでは何も意識をしていなくてもキレイで見やすいコーディングが出来るようになります。さらに、適切なインデントをするクセが付くので、他の言語でもキレイにコーディングできるようになります。

###多彩なライブラリ

Pythonは豊富な外部ライブラリが用意されているのも、特徴の一つです。科学的な計算を行うライブラリや、画像や音楽といったメディアを扱うライブラリなど、多種多様なライブラリが用意されています。このようにライブラリがたくさん用意されているのも、Pythonが幅広いジャンルで利用されている理由でもあります。

###インタプリンタ言語である

Pythonはコードを逐次実行していく「インタプリンタ」という形式の言語です。Pythonにはプログラムを書きながら実行してすぐに結果を確認できる「インタラクティブシェル」が標準で付属しており、簡単なコードのテストを素早く行うことができます。

##Pythonの用途

前述の通り、Pythonには豊富なライブラリが用意されています。そのため、Pythonはあらゆる用途に使用されています。Webアプリケーションやデータベースを利用するアプリケーション、YouTubeやGoogleといったWebサービス、科学技術計算や分析、自然言語処理、近年流行の人工知能など….キリがありませんね。それだけ、Pythonは広い範囲で活用されている言語なのです。
Ubuntu に 最新のgoを入れる

# はじめに
2017/01/01 現在、Ubuntuリポジトリのgoは、Version1.6です。
このバージョンのgoを使用してビルドした場合に、エラーが発生することがあります。
https://github.com/docker/containerd/issues/337
この記事では、aptのリポジトリに追加して、goのバージョンをアップグレードします。

# 環境
- Ubuntu 

# 1.リポジトリの追加
```bash
sudo add-apt-repository ppa:jonathonf/golang-1.7
```

# 2.aptの更新
```bash
sudo apt-get update
```

# 3.goのアップグレード
```bash
sudo apt-get upgrade golang-1.7
```

# 4.不要になったパッケージを削除
```bash
sudo apt-get autoremove
```

# 5.goのバージョン確認
```bash
go version
```
SwiftのData内の任意の位置から数値を取り出す

例えばファイルから読み込んだデータの３バイト目からUInt16を取り出したい場合などに利用します。

本来であれば

```
let amount: UInt16 = data.getValue(offset: 3)
```

という感じで呼び出せるようにしたかったのですが、NSDataのgetBytes()を利用するにあたってgetBytes()に渡す変数を初期化しなければならず、その初期化方法がわからなかったため、初期化用の数値を引数で渡さなければいけないという汚いコードになってしまいました。

```
let amount: UInt16 = data.getValue(offset: 3, initialValue: 0)
```
以下、Dataの拡張宣言によりgetValue()を追加しています。

```
extension Data {
	func getValue<T>(offset: Int, initialValue: T) -> T? {
		
		var data: T		= initialValue
		let itemSize	= MemoryLayout.size(ofValue: data)
		
		let maxOffset = count - itemSize
		guard Range(0...maxOffset).contains(offset) else {
			return nil
		}

		let nsdata = self as NSData
		
		nsdata.getBytes(&data, range: NSMakeRange(offset, itemSize))
		
		return data
	}
}
```

使い方

```
let data = Data(bytes: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

let value16: UInt16? = data.getValue(offset: 1, initialValue: 0)
if let val = value16 {
	debugPrint(String(format: "value=0x%x", val))
} else {
	debugPrint("value is nil")
}

let value32: UInt32? = data.getValue(offset: 1, initialValue: 0)
if let val = value32 {
	debugPrint(String(format: "value=0x%x", val))
} else {
	debugPrint("value is nil")
}
```

initialValueを使わなくてもいい方法があれば教えてください！
githubと連携したCodeDeploy自動デプロイ設定で案の定ハマった

## IAMユーザ作成時にハマった

https://aws.amazon.com/jp/blogs/devops/automatically-deploy-from-github-using-aws-codedeploy/

~~~
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "codedeploy:GetDeploymentConfig",
      "Resource": "arn:aws:codedeploy:us-east-1:123ACCOUNTID:deploymentconfig:*"
    },
    {
      "Effect": "Allow",
      "Action": "codedeploy:RegisterApplicationRevision",
      "Resource": "arn:aws:codedeploy:us-east-1:123ACCOUNTID:application:DemoApplication"
    },
    {
      "Effect": "Allow",
      "Action": "codedeploy:GetApplicationRevision",
      "Resource": "arn:aws:codedeploy:us-east-1:123ACCOUNTID:application:DemoApplication"
    },
    {
      "Effect": "Allow",
      "Action": "codedeploy:CreateDeployment",
      "Resource": "arn:aws:codedeploy:us-east-1:123ACCOUNTID:deploymentgroup:DemoApplication/DemoFleet"
    }
  ]
}
~~~

codedeployのarnが見つからなくて、123ACCOUNTIDの文字列が残ったまま作成したら、「そんなユーザは存在しないよ」というエラーが返ってきてiamユーザのポリシーを作成できなかった。
つまり、

~~~
arn::aws:codedeploy:us-east-1:123ACCOUNTID:deploymentconfig:*
~~~

これを

~~~
arn::aws:codedeploy:[リージョン]:[アカウントID]:deploymentconfig:*
~~~

これに書き直したら作成できた。
arnの構成を始めて知った...

## 設定全部終ったのに自動でデプロイされない

全て設定が完了して、プルリク作成してmasterにマージしてみた。マージした直後にcodedeployのコンソールを見ると、デプロイが実行されていることを期待していたのに何も起こらなかった。デプロイ対象のインスタンスの中に入ってログを見てみても、特にエラーが発生していない・・一体どこの設定が間違って期待する挙動が出来てないんだ？
原因は、github側の設定の、Github Auto-Deploymentの設定が間違っていたからだった。
Environmentsは勝手に、description的なものかと勘違いしていて何も入力していなかったけど、それが原因みたい。
Environmentsにcode deployのデプロイ名を入力したら、masterマージでデプロイが実行されるようになった。

## おまけ

### デプロイが自動で走るのはmasterにマージされた時のみ？

そうらしい。Github Auto-Deployment の説明に、`
このフックを有効にすると、GitHubは、デフォルトのブランチがプッシュされるか、テストスイートが特定の基準を満たしたときにGitHubのデプロイメントをリクエストします。`と書いてあった。
![スクリーンショット 2016-12-19 11.50.07.png](https://qiita-image-store.s3.amazonaws.com/0/79577/67f45f83-f23b-fcc3-0338-48fa06975bfd.png)

挙動を確認してみたけど、適当なブランチをリモートリポジトリにpushしてもデプロイが実行されることはなかった。
Inspectorの配列のElementに固定の名前つける

# Inspectorの配列のElementのところをわかりやすくしたい
ことの発端は[Oculus OVRLipSync](https://developer3.oculus.com/downloads/audio/1.0.1-beta/Oculus_OVRLipSync_for_Unity_5/)を使って製作を行っているのですが、15種類の口形素（sil, PP, FF, TH, DD, kk, CH, SS, nn, RR, aa, E, ih, oh, ou）を配列のElementに入れていかないといけないが途中でわけがわからず、よく間違えるのでなんとかならないかなぁと
![74280c28d21d371e7a191ae0ca145461.png](https://qiita-image-store.s3.amazonaws.com/0/79067/f7cbd5a7-d22f-c401-6214-1d2ade5c2449.png)
※この15個のElementです

## EditorフォルダにPropertyDrawerの拡張を書く

Editorフォルダの中に以下のソースを入れる

```csharp:NamedArrayDrawer.cs
using UnityEngine;
using UnityEditor;

[CustomPropertyDrawer(typeof(NamedArrayAttribute))]
public class NamedArrayDrawer : PropertyDrawer
{
    public override void OnGUI(Rect rect, SerializedProperty property, GUIContent label)
    {
        try
        {
            int pos = int.Parse(property.propertyPath.Split('[', ']')[1]);
            EditorGUI.PropertyField(rect, property, new GUIContent(((NamedArrayAttribute)attribute).names[pos]));

        }
        catch
        {
            EditorGUI.PropertyField(rect, property, label);
        }
    }
}
```

※Unity 5.4だとこの書き方
5.3だと【EditorGUI.PropertyField】→【EditorGUI.ObjecField】な気がします（未検証）


## NamedArrayAttributeクラスの作成
適当なところにNamedArrayAttributeクラスを作成

```csharp:NamedArrayAttribute.cs
using UnityEngine;

public class NamedArrayAttribute : PropertyAttribute
{
    public readonly string[] names;
    public NamedArrayAttribute(string[] names) { this.names = names; }
}
```

## 実際に使う
OVRLipSyncContextMorphTarget.cs内で該当する配列の上に拡張したAttributeを置く

```csharp:OVRLipSyncContextMorphTarget.cs
    // Set the blendshape index to go to (-1 means there is not one assigned)
    [NamedArrayAttribute(new string[] { "sil", "PP", "FF", "TH", "DD", "kk", "CH", "SS", "nn", "RR", "aa", "E", "ih", "oh", "ou" })]  // ←追加
    public int[] VisemeToBlendTargets = new int[(int)OVRLipSync.ovrLipSyncViseme.Count];
```
## できたもの

![1af33868c190de938e7e9e350e749d2e.png](https://qiita-image-store.s3.amazonaws.com/0/79067/10cd8d94-b82e-8a3b-5e12-b9a83bcc3642.png)


うん、これで間違えなくなりそう！
Android Thingsのdoorbellアプリを試す

Android Thingsを載せたRaspberry Pi3のカメラで撮影した画像をFirebaseのDatabaseへ送り、Androidスマフォからリアルタイムで閲覧するAndroid Thingsの[doorbell](https://github.com/androidthings/doorbell)サンプルアプリを試してみました。撮影した画像にはCloud Vision APIを使ってアノテーションも表示しています。

## 前準備

### Android Things搭載ボード

Raspberry Pi3を使用してます。

[Raspberry Pi3によるAndroid Things入門](http://qiita.com/tatsu/items/dc98d600ff6c35832243)をご参照。

- Raspberry Pi3
- Raspberry Pi Camera Module V2
- ブレッドボード
- プッシュボタン（タクトスイッチ）1個
- 抵抗 1KΩ 1個
- ジャンパーワイヤー オスーオス2本、オス-メス3本

![schematics.png](https://qiita-image-store.s3.amazonaws.com/0/49088/09645b6f-eda8-ccd2-46f7-2087f87cefa2.png)

※GPIOピンはBCM21を使用してます。

### Google Cloud Platform

プロジェクトを作って、コンソールのAPI ManagerでCloud Vision APIを有効にし、API Keyを作成したら、ソースにコピペします。

```CloudVisionUtils.java
    private static final String CLOUD_VISION_API_KEY = "<ENTER VISION API KEY>";
```

### Firebase

プロジェクトを作ったらAndroidアプリを追加し、設定ファイルのgoogle-services.jsonをダウンロードし、AndroidThingsアプリのappディレクトリ直下と、AndroidアプリのcompanionAppディレクトリ直下に置いてビルドします。

設定ファイル内のapi_keyが空っぽでビルドエラーになることがあるようです。
http://stackoverflow.com/questions/37317295/missing-api-key-current-key-with-google-services-3-0-0

```google-services.json
      "api_key": []
```

コンソールからSDK設定手順を表示し、再度ダウンロードして設定されていれば、ビルドが通ります。

```google-services.json
      "api_key": [
        {
          "current_key": "encrypted-string"
        }
      ],
```

ちなみにこのapi_keyはCloud Vision APIのキーとは別ものです。

Databaseのルールは、認証なしで誰でも読み書きできるようにしておきます。

```
{
  "rules": {
    ".read": true,
    ".write": true
  }
}
```

## 実行

1. Raspberry Pi3に電源を入れてAndroidThingsを起動したらadb接続し、appアプリを実行します。

2. 対向のcompanionAppアプリもスマフォで起動しておきます。
3. ブレッドボード上のプッシュボタンを押すと撮影され、画像とアノテーションがFirebaseのDatabaseに登録されます。
4. companionAppアプリでリアルタイムに表示されます。（タイムラグはあります。）

> 自分は手順を行きつ戻りつしていたので起きていたか不明ですが、Developer Preview 1の[既知の不具合](https://developer.android.com/things/preview/releases.html#developer_preview_1)により、撮影できるようにするために、AndroidThingsのアプリを起動後に一旦ボードをリセットする必要があるようです。

![Screenshot_20170118-103658[1].png](https://qiita-image-store.s3.amazonaws.com/0/49088/5ab64dfe-0326-72fa-5e3c-140c75b959ed.png)

## おしまい

その名の通り、IoTはネットワークで（とりわけバックエンドと）つながると、いろいろな組み合わせと用途が広がる感じがしてワクワク感がありますね。
過去に使ってたvagrantがwindows10で使えなくなった時の対処メモ

結構前にinstallしたvagrant環境がwindows10で使えなくなりました。

#対処方法
初めに起きた問題は…
・**「virtualbox事体が起動しない！!」**→[参考サイト](http://qiita.com/shimon_haga/items/3c4113706d0dc33a384d)
vagrant以前の問題（笑）windows10では古いバージョンは使えないらしい。リンク先にはvagrantの関係で古いバージョンのvirtualboxをインストールしたと記述してありますが、現在ではvagrantとvirtualbox両方最新にすることで使用できます。
現在の最新バージョン

||version|
|:-:|:-:|
|virtualbox|5.1|
|vagrant|1.9.1|




##virtualbox更新
ということでvirtualboxのバージョンアップ…ちなみに現在(2017/1/18)のバージョンは5.1でした。
下記のリンクからインストーラーをダウンロードして更新
↓↓↓↓↓↓↓↓↓↓↓↓
[virtualboxダウンロード](http://www.oracle.com/technetwork/server-storage/virtualbox/downloads/index.html?ssSourceSiteId=otnjp)

更新確認　ヘルプからvirtualboxについてを開いてバージョン確認

![virtualbox.PNG](https://qiita-image-store.s3.amazonaws.com/0/134267/24943da7-7f33-07c5-a4ab-bf90d8411b35.png)

過去に使ってたvagrantのインスタンスが残ってるからこれを起動するために
`vagrant up`コマンドを入力
がまた問題が・・・


その問題とは
**使っていたvagrantのバージョンではvirtualbox5.1は対応していない**
とのこと…エラー文には5.0とか他のバージョン使いなって書いてあった（笑）

virtualboxのダウングレードじゃなくてvagrantのバージョンアップで5.1対応してるでしょと勝手な判断してとりあえずvagrantを更新してみる（結果、対応してました。）

##vagrant更新
下記のサイトからインストーラーをダウンロードして実行
[vagrantダウンロード](https://www.vagrantup.com/downloads.html)
（実行したときにcomputing spaces requirmentsとでてきてnextボタンが押せないですが数分待てば押せるようになります。最後にPCの再起動を求められるので再起動する。 ）

現在のバージョンは1.9.1です。`vagrant --version`コマンドで確認できます。

##インスタンスの起動（個人的な問題…）
ここは個人的なvagrantのプラグインの関係の問題ですので飛ばしてください（笑）

`vagrant up`をしてみましたが…エラーが…
`user requested vagrant teraterm (> 0)`…なにこれｗ
多分vagrantのプラグインが関係しているのかと予想。。。teraterm

`vagrant plugin install vagrant-teraterm`
ここでやらかしたのが、windowsのファイアーウォールが起動してびっくりしたので拒否しちゃっておかしくなってしまった。。。。

いろいろなvagrantコマンドができなくなってしまった。そのエラーが
`cannot load such file -- vagrant-teraterm`

プラグインが読み込めないとエラー…ということなので確認して消しました。

```
vagrant plugin list
vagrant plugin uninstall vagrant-teraterm
vagrant plugin list
```

##インスタンスの起動
vagrant up

起動してくれました。
Redmineのtextile記法のテーブル

## 見出し指定
### 列見出し
```
|_. 見出し1 |_. 見出し2 |_. 見出し3 |
| 列1 | 列2 | 列3 |
```
![1.png](https://qiita-image-store.s3.amazonaws.com/0/15175/d45f4f45-6810-b9e6-7ebd-6422de60bc52.png)

### 行見出し
```
|_. 見出し1 | 行1 |
|_. 見出し2 | 行2 |
|_. 見出し3 | 行3 |
```
![2.png](https://qiita-image-store.s3.amazonaws.com/0/15175/9fec5d7d-9b7b-6ec6-08cf-bb5bb8e9ab27.png)


## センタリング、右寄せ
```
|_. 配置 |
|=. センタリング |
|>. 右寄せ |
|<. 左寄せ |
```
![3.png](https://qiita-image-store.s3.amazonaws.com/0/15175/aa6bebdc-eb2f-9271-fff8-482bf74d57b6.png)


## セルの結合
### 横結合
```
|\2. 横結合 |
| 列1 | 列2 |
```
![4.png](https://qiita-image-store.s3.amazonaws.com/0/15175/756b015c-d1b6-7dbc-51e2-d37611479a68.png)

### 縦結合
```
|/2. センタリング | 行1 |
| 行2 |
|/2^. 上揃え | 行3 |
| 行4 |
|/2~. 下揃え | 行5 |
| 行6 |
```
![5.png](https://qiita-image-store.s3.amazonaws.com/0/15175/2d6e89de-49b5-bd38-a5db-a0725a16395c.png)


## 背景に色を付ける
### 列の背景色
```
{background:#CCC}. | 列1 | 列2 | 列3 |
| 列1 | 列2 | 列3 |
```
![6.png](https://qiita-image-store.s3.amazonaws.com/0/15175/2fdf4d99-68bd-b4ce-fd13-178864a1b820.png)

### テーブルの背景色
```
table{background:#CCC}.
| 列1 | 列2 | 列3 |
| 列1 | 列2 | 列3 |
```
![7.png](https://qiita-image-store.s3.amazonaws.com/0/15175/f2cecc02-57c8-8555-b2e7-2dfcab6e9db5.png)

### 列とテーブルの背景色
```
table{background:#CCC}.
{background:#999}. | 列1 | 列2 | 列3 |
| 列1 | 列2 | 列3 |
```
![8.png](https://qiita-image-store.s3.amazonaws.com/0/15175/d42c69ce-774b-0dbe-fcc9-c5d43af677df.png)

## 組合せ
```
table{background:#F5F5F5}.
{background:#999999}. |_. %{color:white}列1% |_. %{color:white}列2% |_. %{color:white}列3% |_. %{color:white}列4% |_. %{color:white}列5% |
|/4=. TEST |=. A |/2=. B |/3=. C |=. D |
|/3=. E |=. F |
|/2=. G |=. H |
|=. I |=. J |
```
![9.png](https://qiita-image-store.s3.amazonaws.com/0/15175/544afef4-8141-7fb8-e3a0-44bc267c56e0.png)

## Redmine 関連記事
* [Redmineのtextile記法のテーブル - Qiita](https://qiita.com/bezeklik/items/e821a2816041f73ebb1f)
* [CentOS 7 に Redmine 3.3 をインストールする - Qiita](https://qiita.com/bezeklik/items/483b61c637c805f2945f)
* [Redmine 3.4 を CentOS 7.4 にインストールする - Qiita](https://qiita.com/bezeklik/items/0b1b54bc944804420501)
* [CentOS 7.4 で Docker の Redmine を動かす - Qiita](https://qiita.com/bezeklik/items/d3c82926da104ef0c5a3)
* [Redmine を Docker 公式イメージで運用する - Qiita](https://qiita.com/bezeklik/items/b5c39136a8db23e2e81c)
Android Sutdioでファイルを作った時の「* Created by USER_NAME on yyyy/mm/dd」を任意に変える

Android StudioでJavaファイルを作ると下記のような文言が自動的に入るが、変えたいとき用のメモ。

```
/**
 * Created by ${USER} on ${DATE}.
 */
```

## 設定場所

Preference＞Editor＞File and Code Templates＞Includesタブ＞File Header
(Android Studio ver.2.2.3の場合）

<img width="1149" alt="スクリーンショット 2017-01-17 11.02.36.png" src="https://qiita-image-store.s3.amazonaws.com/0/84307/bae8e1d5-9e19-1154-8bc0-99c314889d0a.png">

ここを好きなようにカスタマイズできる。

## 使えるパラメータ
パラメータはこれらが入れられる。

| パラメータ | 内容 |
|:-:|:-:|
|${PACKAGE_NAME}|name of the package in which the new file is created|
|${USER}| current user system login name|
|${DATE}|current system date|
|${TIME}|current system time|
|${YEAR}|current year|
|${MONTH}|current month|
|${MONTH_NAME_SHORT}|first 3 letters of the current month name. Example: Jan, Feb, etc.|
|${MONTH_NAME_FULL}|full name of the current month. Example: January, February, etc.|
|${DAY}|current day of the month|
|${HOUR}|current hour|
|${MINUTE}|current minute|
|${PROJECT_NAME}|the name of the current project|
スレーブサーバを構築し直したらマスタサーバの lsyncd がうまく動作しなかった


[前回](http://qiita.com/shimon_haga/items/95d38e3440e77ae8f8d7)はマスタサーバ側を構築し直した時の不具合で、今回はそれの相方となるスレーブサーバを再構築した時の設定のお話。

## 症状
マスタサーバでは lsyncd は正常に動作しているようだが、一向にスレーブサーバにファイルを転送する気配がない。
マスターサーバ側でファイルを更新作成しても /var/log/messages にファイル転送の発生を知らせるログが出てこない。

## 原因
スレーブサーバで rsync をサービス化して待機させる必要があったのだが、それをしていなかった。
またしても基本的なことなんだけど、構築手順書に書いてなかったからすっかり見落としてた。
~~他人が作った資料を、別の他人に渡して構築を任せるとろくなことがない。~~

## 解決編
### インストールする
`yum -y install xinetd rsync`

### rsyncd のための設定ファイルを作る
下記のファイルはないので、自分で作成する。

```/etc/rsyncd.conf
uid = root
gid = root
log file = /var/log/rsyncd.log
pid file = /var/run/rsyncd.pid

[sync_dir]
    path = /home/to_dir
    hosts allow = 192.168.0.10
    read only = false
```

`uid`, `gid' は rsync を実行するユーザとユーザグループ。
`log file` はその名の通りログを書き出すファイル名。
`pid file` も見てわかる通りプロセスIDのためのファイル名。

`[sync_dir]` は マスタサーバ側の `lsyncd.conf` で指定したディレクトリのエイリアス([蛇足](#マスター側の設定例))。
もしマスタサーバでエイリアス名じゃなくて直接ディレクトリ名をしているのなら、ここから下は不要(`read only` は必ず残す)。

`path` は実際に同期するディレクトリのパス。

`hosts allow` はマスタサーバの IP アドレス。
逆に拒否設定をする場合は `hosts deny` を設定する。

`read only` は指定しないと `yes` なので `no` や `false` にする。
これをしないとファイル更新がされない、はず。

### xinetd で rsync を有効にする
`vim /etc/xinetd.d/rsync`
で `disable` の行を `no` に指定する。

### xinetd を起動し常駐させる
`service xinetd start`
`chkconfig xinetd on`

### rsync を常駐させる
`chkconfig rsync on`

### 念のため確認
`chkconfig --list rsync`
を発行し、
`rsync   on`
と出れば万が一再起動がかかってもまたスレーブとしてファイルを同期する。

### 最終チェック
実際にマスタサーバでファイルの更新や作成をしてみて、スレーブに転送されていれば完了。

## 蛇足
### マスター側の設定例

```/etc/lsyncd.conf
settings {
    logFile = "/var/log/lsyncd.log",
    statusFile = "/tmp/lsyncd.stat",
    maxProcesses = 2,
    statusInterval = 1,
    insist       = 1,
}

sync {
    default.rsync,
    source="/home/from_dir/",
    target="192.168.0.20::sync_dir",
    exclude="tmp/",
    rsync={
        owner = true,
        group = true,
        archive = true,
        links   = true,
        update  = true,
        verbose = false,
        _extra  = {
            "--bwlimit=10000",
        },
    },
}

```

細かい説明はどこかにお任せして、今回の件に絡んで重要なところだけ。
`settings` は、まぁ、こんなもんだと思って。
`sync` だけは重要。

`source` は同期するファイルがあるディレクトリを指定する。
ここで重要なのが最後のスラッシュ (`/`) の有無。
このスラッシュをつけないと `from_dir` がスレーブサーバ側の `/home/to_dir` の下にできて、 `/home/to_dir/from_dir` となってしまう。
今回は送信元と先でディレクトリ名が違うが、実際の Web システムなんかでは同名にすることが多いと思うので、そういう場合は最後のスラッシュを忘れないようにする。

`target` は送信先。
`::` の前がスレーブサーバの IP アドレスで、その後ろが送信先ディレクトリのエイリアス。
このエイリアスはスレーブサーバ側の `rsyncd.conf` の `[sync_dir]` と一致させる。

`exclude` はそのまま。除外するディレクトリ。
`source` からの相対パス。

`rsync` は `rsync` する際のオプションで、それぞれ `rsync` コマンドのオプションと対応する。
詳細は割愛。
[Linux][systemd] systemdの起動時間のボトルネックを解析する (systemd-analyzeの使用方法)

# TL;DR

systemd-analyzeで起動時のボトルネックを解析する方法メモ

# 実行方法
VirtualBox上のUbuntu 16.04で検証しました。

## `systemd-analyze` : kernelとuserspaceそれぞれの起動時間の表示
```bash
$ systemd-analyze
Startup finished in 4.604s (kernel) + 4min 19.644s (userspace) = 4min 24.249s
```
## `systemd-analyze blame` : 時間がかかっている順にサービスの起動時間を表示

```bash
$ systemd-analyze blame | head
    4min 12.385s apt-daily.service
         15.536s docker.service
          7.015s ModemManager.service
          4.008s apparmor.service
          3.843s networking.service
          3.618s NetworkManager.service
          3.391s dev-sda1.device
          2.811s thermald.service
          2.743s vboxadd.service
          2.693s avahi-daemon.service
```

## `systemd-analyze critical-chain` : 時間のかかっている呼び出しチェーンを表示

```bash
$ systemd-analyze critical-chain 
The time after the unit is active or started is printed after the "@" character.
The time the unit takes to start is printed after the "+" character.

graphical.target @29.149s
└─multi-user.target @29.149s
  └─docker.service @13.612s +15.536s
    └─network.target @13.602s
      └─NetworkManager.service @9.984s +3.618s
        └─dbus.service @7.349s
          └─basic.target @7.258s
            └─sockets.target @7.258s
              └─snapd.socket @7.170s +67ms
                └─sysinit.target @7.168s
                  └─apparmor.service @3.133s +4.008s
                    └─local-fs.target @3.132s
                      └─run-user-1000-gvfs.mount @54.632s
                        └─run-user-1000.mount @49.219s
                          └─local-fs-pre.target @3.132s
                            └─systemd-remount-fs.service @3.080s +37ms
                              └─system.slice @1.713s
                                └─-.slice @1.693s
```

## `systemd-analyze plot > plot.svg` : 起動時間のチャートをプロット

```bash:
$ systemd-analyze plot > plot.svg
```

![無題.png](https://qiita-image-store.s3.amazonaws.com/0/37721/c716fe91-d789-5b86-d73d-73c384688431.png)

# 参考
[起動が遅い原因は？そんな時はsystemd-analyzeでチェック | Simple blog @atani](https://atani.github.io/2015/06/%E8%B5%B7%E5%8B%95%E3%81%8C%E9%81%85%E3%81%84%E5%8E%9F%E5%9B%A0%E3%81%AF%EF%BC%9F%E3%81%9D%E3%82%93%E3%81%AA%E6%99%82%E3%81%AFsystemd-analyze%E3%81%A7%E3%83%81%E3%82%A7%E3%83%83%E3%82%AF/)
[ブートパフォーマンスの向上 - ArchWiki](https://wiki.archlinuxjp.org/index.php/%E3%83%96%E3%83%BC%E3%83%88%E3%83%91%E3%83%95%E3%82%A9%E3%83%BC%E3%83%9E%E3%83%B3%E3%82%B9%E3%81%AE%E5%90%91%E4%B8%8A)
[Improving performance/Boot process - ArchWiki](https://wiki.archlinux.org/index.php/Improving_performance/Boot_process)
BASHのwhile readで最終行が処理されない問題の解決方法


BASHでリストファイルなどを`while read`することはよくあると思う。
そんな時のハマりどころ、 **『ファイル最終行を処理する方法』** について、すぐ忘れるのでスニペットとしてメモしておく。

# 問題

BASHで巨大なファイルを読むときなど、こんなコードがメジャーだと思う。

```bash:よくあるコード
while read LINE; do
  echo "LINE: ${LINE}"
done < /tmp/test.txt
```

このコードだと、 **最終行に改行文字が付いていないと、最終行が処理されない。**
readは改行文字を期待しているからだ。

# 解決

`while read LINE`の返戻値が`false`のときでも、空行じゃない場合は処理するようなOR文を入れると良い。

```bash:うまく動くコード
while read LINE || [ -n "${LINE}" ]; do
  echo "LINE: ${LINE}"
done < /tmp/test.txt
```

こういう書き方のほうが読みやすいかもしれない。

```bash:うまく動くコードその2
cat /tmp/test.txt | while read LINE || [ -n "${LINE}" ]; do
  echo "LINE: ${LINE}"
done
```

# 補足： 試験用のテキストデータ作成
「最終行に改行がないファイル」は、IDEや高機能エディタを使っていると発生しやすい。

しかし`vi`だとうまく再現できないということがわかった。
どうやら最終行に改行を入れてくれる`vi`のお節介仕様のようだ。

```bash:ダメな例
$ vi /tmp/vi_test.txt

1
2
3 ⇐ここを改行せずに保存

### 確認 - 最終行が改行してしまっている
$ cat /tmp/vi_test.txt
1
2
3
$　 　⇐改行されてプロンプトが出る
```

`:set binary noeol`等をすれば改行文字を付けずに保存できるらしいけど・・・絶対忘れる。

ということでviについては深く追わず、手っ取り早く再現する方法を取ることにした。
`echo -n "xxxx"`あるいは`echo -e "xxxx\\c"`で、改行しない行を追記する方法だ。

```bash:再現方法
$ echo -n "4" >> /tmp/vi_test.txt

### 確認 - 追加行は改行していない
$ cat /tmp/vi_test.txt
1
2
3
4$　　⇐最終行にプロンプトが出る

### 上記の代わりにこれでも良い
$ echo -e "4\\c" >> /tmp/vi_test.txt

```

この応用でテスト用テキストデータを作れば良い。
Objective-Cで定義してswiftでextensionしたViewControllerをStoryboardでCustomClassとして指定する際の注意点

# はじめに

ややこしいタイトルになってしまいましたが・・・

objcで書かれたiOSアプリを段階的にSwift化していくために、既存のViewControllerをswiftでextensionして、swiftで追加機能を実装する、といったことはよく行われていると思います。

参考：
iOSレガシーコード改善ガイド - extensionパターン
http://www.slideshare.net/kenmaz/clipboards/extension-pattern?rftp=success_toast
![alt](https://image.slidesharecdn.com/denatechcon2016-160131150956/95/ios-74-638.jpg?cb=1454603175)

そのようなViewControllerをStoryboard上でCustomClassとして指定する際にハマったので、その問題と解決策を紹介します。

# 問題
以下のような状況があるとします。

- Objective-Cで`FooViewController`を定義
- `FooViewController`をSwiftのextensionで拡張
- StoryboardでViewControllerを定義して、そのCustomClassとして`FooViewController`を設定

実行時にStoryboardから`FooViewController`のインスタンスを生成しようとすると

```
Unknown class _TtC8MyApp14FooViewController in Interface Builder file.
```
のようなエラーが出て、FooViewControllerではなく、UIViewControllerのインスタンスが生成されてしまいます。

# 解決方法

objcで定義してSwiftでextensionしたクラスをStoryboardのCustomClassとして設定すると、InterfaceBuilderによって自動的に`Module`が設定されてしまうのが原因です。

![スクリーンショット 2017-01-18 12.53.13.png](https://qiita-image-store.s3.amazonaws.com/0/8399/0a3cf61f-4130-def4-200c-3d7155788b55.png)

StroyboardのSource Code Editorで開いて、以下のように該当の`<viewcontroller>`定義から`customModule`と`customModuleProvider`を削除します。

```
        <scene sceneID="fT9-Wy-Yne">
            <objects>
-                <viewController id="BHJ-B9-zCx" customClass="FooViewController" customModule="MyApp" customModuleProvider="target" sceneMemberID="viewController">
+                <viewController id="BHJ-B9-zCx" customClass="FooViewController" sceneMemberID="viewController">
                    <layoutGuides>
                        <viewControllerLayoutGuide type="top" id="8E8-X3-2Ex"/>
```

Moduleが以下のように`None`になれば正しく`FooViewController`をロードすることができます。

![スクリーンショット 2017-01-18 12.53.29.png](https://qiita-image-store.s3.amazonaws.com/0/8399/0a27379e-f556-4a73-1bf7-c88b51fdd8ad.png)

# 類似の問題との関係

類似のエラーケースとしては
http://qiita.com/eidera/items/f6fd3b1088d7bd6fe523
などがありますが、ちょうどこれと逆の問題が起きている、という感じのようです。

Storyboardでは、
- Objcで定義したクラス = Module名は指定してはいけない(=`None`)
- Swiftで定義したクラス = Module名は指定必須
のように設定しておかないと、正しくクラスがロードできない、ということのようです。

Objcで定義したクラスをswiftでextensionすると、それをSwiftで定義されたものだと誤認識してModule名を自動設定してしまう、というIBのバグなのかもしれません。一応Appleに報告しておこうかと思います。

# 検証環境
Xcode 8.2.1 (8C1002)
1を1億回足して1億にならない場合

- [C > 浮動小数点型変数はループカウンタとして使用しない](http://qiita.com/7of9/items/438a43bf53d60eab59e3)

まぁ浮動小数点型の仕様を知れば当たり前の話なのだが，面白そうなので「1を1億回足す」ってのを [Go 言語]でも書いてみる。

```go:loop1.go
package main

import "fmt"

func main() {
	var d float32 = 0.0
	for i := 0; i < 100000000; i++ {
		d += 1.0
	}
	fmt.Println(d)
}
```

実行結果は予想通り

```
$ go run loop1.go
1.6777216e+07
```

となる[^f32]。念のため `float64` でも試してみよう。

[^f32]: `float32` は32ビットサイズの浮動小数点数型で，符号部1ビット，指数部8ビット，仮数部23ビット，という内訳になっている（仮数部は仮数の小数点以下を表す）。つまり有効桁数が24ビット（10進数で約7桁）しかない。したがって今回のような「1づつ加算する動作を繰り返す」処理では16,777,216（`=0xffffff+1`）以降は「情報落ち」が発生する。ちなみに `float64` は64ビットサイズで仮数部は52ビットあり，10進数にして約15桁の有効桁数になる。

```go:loop2.go
package main

import "fmt"

func main() {
	var d float64 = 0.0
	for i := 0; i < 100000000; i++ {
		d += 1.0
	}
	fmt.Println(d)
}
```

結果は

```
$ go run loop2.go
1e+08
```

で，ちゃんと1億になる。 [Go 言語]では基本型のサイズが厳密に決まってるので，浮動小数点型の計算誤差についてもきちんと見積もれるはずである。

ちなみに

```go:loop3.go
package main

import "fmt"

func main() {
	for d := 0.0; d < 1.0; d += 0.1 {
		fmt.Println(d)
	}
}
```

とすると[^var]

[^var]: “`d := 0.0`” と記述した場合，変数 `d` は `float64` として宣言・初期化される。厳密には定数 “`0.0`” は，いったん「型付けなし」の浮動小数点数として評価された後，変数宣言時に `float64` に暗黙的に変換される。 [Go 言語]におけるこの定数の機能は何かと便利なので覚えておくとよいだろう。

```
$ go run loop3.go
0
0.1
0.2
0.30000000000000004
0.4
0.5
0.6
0.7
0.7999999999999999
0.8999999999999999
0.9999999999999999
```

ってなことになる[^r] ので浮動小数点型の変数をループカウンタにするのは止めましょうね。約束だよ！

[^r]: このような結果になるのは `float32`/`float64` の浮動小数点数型の内部表現が2進数になっているため。たとえば 0.1 を2進数で表すと「0.000110011...」と循環しキリのいい値にならない。このため 0.1 を加算していくと「丸め誤差」が蓄積していくのである。

[Go 言語]: https://golang.org/ "The Go Programming Language"

## ブックマーク

- [浮動小数点数型と誤差](http://www.cc.kyoto-su.ac.jp/~yamada/programming/float.html)
- [情報落ち、桁落ち、丸め誤差、打切り誤差の違い](http://tooljp.com/jyosho/docs/ketaochi-jyohoochi/ketaochi-jyohoochi.html)

----
Azureワークショップのまとめ

# TL;DR
Azureを使う上での前提知識を一通りレクチャーして貰ったので共有します。
AzureをIaaSとして使うにはどうしたら良いかという観点なので、Functionの話はありません。あしからず。

# Azureざっくり
セルフ構築なクラウドコンピューティングの一つ。

# リソースの利用率から見たクラウドの利点
* ワークロードに沿ったリソースの利用
* 使用時間で課金するので、使わない間は止めれば良い
* リソース拡張もボタンひとつで可能

# MSのクラウドサービス3種
* Office 365 (SaaS)
* アプリだけ使うAzure (PaaS)
* OSまで使うAzure (IaaS)

PaaS移行時はプラットフォーム内の各種ソフトのバージョンに注意。
PHPなど。

# Azureあれこれ
* Azureの料金計算ツール https://azure.microsoft.com/ja-jp/pricing/calculator/
* 起動停止はスケジュールバッチで予約実行できる
* AWSとは異なり、日本の法律を適用できる
* アウトバウンド通信のみ課金対象

＃ Azureポータル
* 主要ブラウザなら使える
* ダッシュボードはカスタマイズ可能(CPU使用率を表示したりできる)

# Azureのコマンドライン操作API
機能の差は無い
* コマンドラインインタフェース(Windows以外)
* Powershell(Windows + Linux / MacのPowershell使いたい人)
  * あとあとの使い回しを考えるとこちらがオススメ
* v1とv2があるが、今後始める人はv2だけ使うのがオススメ

# Azureのアカウント管理
* 管理者を必要に応じて立てられる
* 利用者も含めAzure ADで管理可能
* 課金が一定額を超えるとアラート通知を上げられる

# Azureで仮想マシンを作る
## OS選択
* Windows Server は2008R2以降のみ
## デプロイモデルの選択
* クラシック(サービスマネージャ)
* 新方式(リソースマネージャ)
  * JSON形式のテンプレートファイルを使って同じ構成のマシンを簡単に作れる(複数台まとめて作るのも可能)

# アクセス権限
## リソースグループ
* 仮想マシンや仮想ネットワークを管理する単位
* リソースグループに対して権限を設定できる
  * DBだけ固めて特定の人だけアクセス可能にするなど
## 仮想マシンごと
* アクセス権限を個別に設定できる
* 実用上は台数が多くなった際に、こちらだとツライ

# 可用性セット
* ラック単位で障害ドメインと呼ぶ
* 物理サーバ単位で更新ドメインと呼ぶ
* 障害ドメインも更新ドメインも異なる環境にVMを配置しておく
* 障害の起きていない障害ドメイン内で、更新ドメインが異なるサーバにデプロイできる

# Azure AD
* オンプレミスのADと連携できる
* オンプレミスのアカウントとAzure ADのアカウントを紐付けられる

# その他こまごま
* ストレージはデフォルトで3重化されてる
C#のメモ帳　dataGridViewへのデータ設定（DB ⇒ SqlDataAdapter ⇒ DataTable ⇒ dataGridView)

#### 環境　
Visual Studo 2015, Win7

#### 内容　
1.　DBへの問い合わせ結果を DataTableに格納して、dataGridViewへ渡す方法
2.　dataGridViewの細々とした表示の設定方法
3.　他のフォームのPublic変数を呼び出す方法

```csharp:C#　dataGridViewへのデータ設定
        private void 品目リスト表示()
        {

            //データをdataGridView品目リストにセットする--------------------------------------
            SqlConnection connection = new SqlConnection();
            SqlCommand command = new SqlCommand();
            //DataSet ds = new DataSet();        //データセットに格納する場合
            DataTable dt = new DataTable();

            // 接続文字列を設定します。
            Formメイン f = new Formメイン();     //他のフォームからPublic変数を呼び出し。
            connection.ConnectionString = f.DB接続文字列;
            f.Close();

            using (SqlDataAdapter adapter = new SqlDataAdapter())
            {
                command.Connection = connection;
                command.CommandText = "SELECT …それぞれ書いてね";

                adapter.SelectCommand = command;

                // SQLを実行し結果をdsの中に格納します。
　　　　　　　　　//【お勉強】Fill()でOpen/Closeを自動で行ってくれるので、記述不要。
　　　　　　　　　//　　　　　但し、Openしたら、Close要。
                //adapter.Fill(ds);             //データセット格納する場合
                adapter.Fill(dt);

            }

            dataGridView品目リスト.DataSource = dt;

            //dataGridView品目リストの設定----------------------------------------------------
            //ユーザの操作規制　←これはFormのLoadへ持って行っても良い
            dataGridView品目リスト.ReadOnly = true;                      //読取専用
            dataGridView品目リスト.AllowUserToDeleteRows = false;        //行削除禁止
            dataGridView品目リスト.AllowUserToAddRows = false;           //行挿入禁止
            dataGridView品目リスト.AllowUserToResizeRows = false;        //行の高さ変更禁止              
            dataGridView品目リスト.RowHeadersVisible = false;            //行ヘッダーを非表示にする
            dataGridView品目リスト.MultiSelect = false;                  //ル、行、列が複数選択禁止
            dataGridView品目リスト.SelectionMode = DataGridViewSelectionMode.FullRowSelect;      　//セルを選択すると行全体が選択されるようにする

            //ヘッダー名変更
            dataGridView品目リスト.Columns[0].HeaderText = "品目コード";
            dataGridView品目リスト.Columns[1].HeaderText = "品目名";
            dataGridView品目リスト.Columns[2].HeaderText = "包装形態";
            //カラム幅設定
            dataGridView品目リスト.Columns[0].Width = 60;
            dataGridView品目リスト.Columns[1].Width = 200;
            dataGridView品目リスト.Columns[2].Width = 60;

        }
```
#### 参考にさせて頂いたページ　感謝！
[猫のきままなC#日記](http://okwakatta.net/code/ado06.html)
VB[全ては時の中に…](http://blog.livedoor.jp/akf0/archives/51536291.html)
poem > 情報を得るためには膨大な時間がかかる / なくなるのは一瞬

利用していたブックマークサービスの閉鎖に伴い、8年前のブックマークを整理していた。200くらいのブックマークがあった。
9割5分のサイトがリンク切れだった。

また、ここ5年の間にUnicode、C++ Builder、C、linux関連など自分が有用と思ってブックマークしていた個人サイトが20件近く閉鎖していった。
それぞれのサイトには膨大な時間をかけて得られた知見が記載されていて、「参考になる！」と思って時々参照させていただいていたが、ある時突然なくなっていた。

blogという形で個々の人がそれぞれの場所で情報を掲載していった時、その環境の維持というのが難しいように思う。
古い環境から新しい環境に移行時に、新しい環境では勝手が違い、うまく移行できない例を見てきた。
(自分も１つのサービスで新しい環境に移行しない理由としては、望んでいる機能[検索性が高い]が考慮されていない、ということがある）。

Qiitaという１つのサイトにおいて、様々な人々が知見を集積していくサービスは素晴らしいと思う。

そして、そのサービスが今後10年、20年継続する(後継サービスが出てきた時には、データをきちんと移行していただく）となお素晴らしい。

***世界の進化を加速させ「続ける」***

加速度はわずかでも、加速し続けることで、その効果は大きい。
ホーキング博士らが加わる探査計画でも、加速は重要なキーワードである。

Qiita継続のために必要なことで、一利用者としてこちらでできそうなことはやっていきたいと考えています。
$_GET と $_POST は不適切な名前である

## 概要


HTTP GET と POST 以外のメソッドに対するスーパーグローバル変数の導入や `$_POST` を改善すべきかという PHP Internals の[議論](https://externals.io/thread/562)を読みました。以前の議論のリンクがまとまっているだけでなく、スーパーグローバル変数および HTTP 通信の仕様をどのように学ぶのかの情報がまとまっているので、記録に残しておくことにしました。同時に PSR-7 以降の議論についても記載しました。

## スーパーグローバル変数の名前
### `$_GET`

`$_GET` は名前だけでは HTTP GET メッセージをあらわすものとして考えてしまいがちですが、実際には URI クエリパラメーターであり、GET リクエスト以外にも使うことができます。

### `$_POST` 

`$_POST` はリクエストボディをあらわしますが、`Content-Type` ヘッダーの値が `x-www-form-urlencoded` もしくは `multipart/form-data` であるときにかぎられます。たとえば `Content-Type` ヘッダーの値が `application/json` である場合には読み込み専用のストリーム (`php://input`) を利用する必要があります。

apfd (Always Populate Form Data) エクステンションを導入すれば、HTTP メッセージの `Content-Type` の値が `multipart/form-data` もしくは `application/x-www-form-urlencoded` であれば、HTTP メソッドの種類に関わらず、スーパーグローバル変数に投入されるようになります。

json_post エクステンションを導入すれば、`Content-Type` の値が `application/json` と `text/json` の HTTP メッセージは `$_POST` に投入されます。

## スーパーグローバル変数の弊害

PSR-7 の[メタドキュメント](http://www.php-fig.org/psr/psr-7/meta/)にまとめられています。

## 規約よりも実装

Go のように Request、Response と Logger が PHP の標準クラスとして導入できないだろうかという Symfony の開発者の[ツイート](https://twitter.com/dunglas/status/814070032816898048)が共感を集めました。

相互運用性のために PSR-7 を採用するプロジェクトが増えてきているものの、PSR-7 以前から存在するプロジェクトの立場から見れば、後方互換性を捨てて PSR-7 を採用して得られるメリットが少ないからです。

Symfony の場合、HttpFoundation コンポーネントは Laravel や Drupal など大きなプロジェクトに採用されています。

以前 pecl_http を PHP の標準クラスとして採用するかの[投票](https://wiki.php.net/rfc/pecl_http)がありましたが、否決に終わりました。

なお、PSR のインターフェイスの PECL エクステンション ([php-psr](https://github.com/jbboehr/php-psr)) も公開されており、実装の学習教材になるでしょう。

## スーパーグローバル変数をラップしたクラスの標準化の提案

標準クラス導入の [RFC](https://wiki.php.net/rfc/request_response) (Server-Side Request and Response Objects) が2016年12月に公開されました。RFC の作者 (Paul M. Jones さん) は PSR-7 との違いについて[記事](http://paul-m-jones.com/archives/6498)を公開しています。記事によると、主要な関心はリクエスト関連のスーパーグローバル変数および、レスポンス関連のグローバル関数をオブジェクトにカプセル化して、オブジェクト指向のプログラミングスタイルで扱うことができないか？とのことです。
[RxSwift]一つ前の値を取ってくる

RxSwiftの流れに乗った一つ前の値を取ってきて比較したい時、


```swift
extension ObservableType where E : Equatable {
  typealias PreviousPairObserver = (previous: Self.E?, current: Self.E)
  func pickPrevious() -> RxSwift.Observable<PreviousPairObserver> {
    return scanCurrentAndPrevious().map({ PreviousPairObserver(previous: $0.first, current: $0.last!) })
  }
  
  private func scanCurrentAndPrevious() -> Observable<ArraySlice<Self.E>> {
    return scan([]) { (previous, current) in
      return Array(previous + [current]).suffix(2)
    }
  }
}
```

こんな感じのextensionを生やして取ってくれば


```swift
rx_index_receiver.pickPrevious().subscribe(onNext: { (previous: Int?, current: Int) in
      
}).addDisposableTo(rx_disposeBag)
```

こんな感じに使えて幸せ

RxSwift便利だけと何やっているか分からなくなるからこうやってまとめたほうがいいな…。
CocoaPodsで追加だけしたい


### 背景
既に導入済みのPodがあって、追加でPodを入れたい。
ただ導入済みのPodは、自前再コンパイルしたので、そこはUpdateとかしたくない。

### やり方
Podfileに追加したいライブラリを記述して以下のコマンドを実行する。


```
pod install --no-repo-update
```

### 参考
http://stackoverflow.com/questions/26351086/how-to-update-a-single-pod-without-touching-other-dependencies
Electronの導入方法


#Electronをインストールするための手順


##手順
[https://github.com/electron/electron/releases](https://github.com/electron/electron/releases)
ダウンロードはここからできる。

> windows 64 bit なら 今は 0.35.1 が最新版なので「electron-v0.35.1-win32-x64.zip 」です

ということらしいです。

今はelectron v1.4.14が最新版で、自分は32bitだったので
electron-v1.4.14-win32-ia32.zipを選びました。

解凍して起動すると、こんな感じ。
![2017-01-18_11h34_46.png](https://qiita-image-store.s3.amazonaws.com/0/147274/da8a392b-ff4c-bc98-0eb6-27856e00027b.png)