OmniAICreator/Qiita-1.07M huggingface dataset:
TypeScriptでNode.jsアプリを開発する

いい加減TypeScriptをきちんと使えるようになろうと思ったので、TypeScriptでNode.jsアプリ開発をするための方法を調べました。やることは**Node.js用の型定義を使用する**ことと、tsconfig.jsonの`compilerOptions`に`"module": "commonjs"`を指定することです。ついでに`node_modules`以下のディレクトリを無視するように設定します。

## 前提条件

* Node.jsがインストールされている
* TypeScriptがインストールされている
* typingsコマンドが使えるようになっている

Node.jsは[公式サイト](https://nodejs.org)からインストールしてください。
TypeScriptとtypingsはNode.jsをインストールした後に下記コマンドを実行すればインストールされます。

```bash:セットアップ
npm install -g typescript
npm install -g typings
```

## アプリケーションフォルダの準備

準備ができたらアプリケーションフォルダを作成します。場所はどこでも良いです。
作成できたら、下記ファイルを作成します。

* MyApp.ts
* app.ts
* tsconfig.json

中身はそれぞれ以下のような感じにしてみました。

```ts:MyApp.ts
export class MyApp {
  private name: string;
  constructor() {
    console.log('MyApp constructor');
    console.log(`Node version : ${process.version}`);
    this.name = 'MyApp';
  }

  exec() {
    console.log(`Hello World! My name is ${this.name}.`);
  }
}
```

```ts:app.ts
import {MyApp} from './MyApp'

let app = new MyApp();
app.exec();
```

```json:tsconfig.json
{
  "compilerOptions": {
    "module": "commonjs"
  },
  "exclude": [
    "node_modules"
  ]
}
```

## Node.js型定義を追加

このままではNode.jsのグローバル変数`process`などをコンパイラーが解釈できないので、下記コマンドでNode.jsの型定義を追加します。

```bash:セットアップ
typings install dt~node --global
```

## TypeScriptをJavaScriptにコンパイル

Node.jsで実行できるようにTypeScriptをJavaScriptにコンパイルします。

```bash
tsc
```

※ちなみにコンパイルはソースコードから機械語（またはそれに準ずるコード）を生成するという意味で使われてきたため、TypeScriptのようにある言語のソースコードから別の言語のソースコードを生成することをコンパイルと区別してトランスパイルということもあります。

## 実行

JavaScriptのファイルができたら、通常のNode.jsアプリケーションと同じように実行します。

```bash
node app.js
```

```:出力結果
MyApp constructor
Node version : v6.1.0
Hello World! My name is MyApp.
```

これでNode.jsでもTypeScriptの静的型チェックを使った安心なアプリケーション開発ができますね！


## 補足

`typings install dt~node --global`するときに`--save`オプションも一緒に指定すると、typings.jsonというファイルが作成されます。このtypings.jsonファイルがあると単に`typings install`とするだけで必要な型定義を全て追加することができます。
この方法だとtypingsディレクトリ以下は`typings install`というコマンド一つで簡単に生成できるため、gitなどでソースコードのバージョン管理する場合にtypingsディレクトリを管理対象から外すことができます。
Watson IoT Platform - MQTT - MessagingTesterを使ってみる

初めてWatson IoT Platformを使ってみよう、というかたのためのガイドです。
[Watson IoT Platformを使ってみる](http://qiita.com/egplnt/items/af867711a7191923b2ff)でIoTアプリを準備しました。
[MessageSightを動かす](http://qiita.com/egplnt/items/246205f6574cde268712)でMQTTブローカーとしてMessageSightを準備しました。

#MessagingTesterを使ってみる
1. MessageSightにログインします。
2. 「メッセージング」タブの「サンプル・アプリケーション」を開きます。
![スクリーンショット 2016-05-24 14.45.55.png](https://qiita-image-store.s3.amazonaws.com/0/125842/262bfc32-e02a-95c7-af62-042c573de3da.png)

3. 「1.エンドポイントDemoMqttEndpointを使用可能にします」を「使用可能」にします。
4. 「2.MessagingTesterサンプル・アプリケーションをダウンロードして実行します」からMessagingTester.zipをダウンロードしてunzipします。
5. MessagingTester/MessagingTest/index.htmlをブラウザで開きます。
6. 画面左下の「IP」欄にMessageSightのアドレスを指定し、「Connect」を押します。ポートはデフォルトで`1883`が指定されています。
![スクリーンショット 2016-05-24 14.46.39.png](https://qiita-image-store.s3.amazonaws.com/0/125842/948f9eef-433e-93cf-5d77-255cbfd14759.png)

7. Web Client 1から5をそれぞれ「Connect」させ、Topic AからCをそれぞれPublish/SubscribeさせてMQTTのpub/subの使い方を確認します。 
![スクリーンショット 2016-05-24 14.47.16.png](https://qiita-image-store.s3.amazonaws.com/0/125842/4061a64d-179d-dab9-13ae-075c5b9f0d32.png)
【MySQL】 SQLをファイルから実行する方法

５月に入ってからこっち、
ずーっと定時までの時間つぶしの方法を考える毎日です。

RDBをoracleしか触ったことがなく、
しかもユーザ管理やらチューニングというレベルでは全く触ったことがないので、
なにかしらで１からRDBを勉強してみようと思い立ちました。

で、MySQLをちょこちょこ触りだしたので、
メモを残しておこうと思ったものはココに上げていこうと思います。

というワケで、本来なら第１弾は"導入"から入るべきだったのでしょうが、
そこは別サイトを見ながらサーっと済ませてしまったので割愛します。
(他のPCでまた改めて作業する機会がある・・・はず。)


###◆前提(ここまでは準備済。)

・MySQLはインストール済。
・専用クライアントを使って実行。

![image](https://qiita-image-store.s3.amazonaws.com/0/126315/4c373a4f-73cc-b0f3-9f5c-12cc625dd8a4.png)


「show databases」の最後の"s"を忘れがち。(自分だけ？)

####◇"reading"データベースの"sample"テーブル情報
![image](https://qiita-image-store.s3.amazonaws.com/0/126315/49aed8d0-18fc-0c64-b821-0367649f0024.png)



###◆入力ファイル(sample_ins.txt)
ただのinsert文ですが。

```SQL:sample_ins.txt
insert into sample values(
    '1234',
    'samplename',
    '2016-01-01',
    '2016-01-01',
    '2016-01-01'
);
```



###◆やり方①("source"コマンド)

![image](https://qiita-image-store.s3.amazonaws.com/0/126315/6e29ee72-0f19-1fc3-e755-a96fa7f4364b.png)

sourceコマンドを入力したら、実行するファイルのパスはドラッグ＆ドロップで自動入力。
エンターキーを押したらクエリ実行。
「Query OK」となっているので正常に処理されたらしい。

![image](https://qiita-image-store.s3.amazonaws.com/0/126315/57500fac-d2c8-ce28-9e8b-d373783e6c68.png)

select文を実行して行追加されていることを確認。


###◆やり方②("\\."コマンド)

流れは①と同じ。

![image](https://qiita-image-store.s3.amazonaws.com/0/126315/dcc022e4-73cc-5357-b529-66494e9aba88.png)




まとまったような、まとまってないような。
長いわりに、情報量はそんなにないですが、ひとまずここまで。
またいろいろ触っていくうちに他の記事と相互補完していきます。
Windowsホスト上でvagrant box add に失敗する

# はじめに
先日、とある理由で32bit版Windowsホスト向けに32bit版CentOS6のVagrant Boxファイルを自作することになったのですが、
Windowsホスト上でのvagrant box add コマンドがエラーとなり、
少々ハマリましたので自分用のメモも兼ねて記事を書きます。
Windowsホスト上でのvagrant利用は初めてだったので、
当初はpackageファイルの作成失敗を疑いましたが、原因は違うところにありました。

## 環境

|種別|Ver.|
|:-:|:-:|
|ホストOS|Windows7　/　windows2012|
|VirtualBox|5.0.20 r106931|
|Vagrant|1.8.1|

## 事象
Windowsホスト上で作成したCentoS6のpackage.boxファイルより
vagrant box addをしようとしたところ、以下エラーにより失敗します。

```
C:\Users\vagrant\Desktop\winenv>vagrant box add Centos67-32 package.box
==> box: Box file was not detected as metadata. Adding it directly...
==> box: Adding box 'Centos67-32' (v0) for provider:
    box: Unpacking necessary files from: file://C:/Users/vagrant/Desktop/winenv/
package.box
    box:
An error occurred while downloading the remote file. The error
message, if any, is reproduced below. Please fix this error and try
again.
```

## 原因
VC++の再頒布可能パッケージ が不足しているため、boxファイルのダウンロード（ローカル環境でも）に失敗しているようです。

## 対応
[vcredist_x86.exe：Microsoft Visual C++ 2010 再頒布可能パッケージ (x86)](https://www.microsoft.com/ja-jp/download/details.aspx?id=5555)をリンク先からダウンロードして
インストールしてから、再度vagrant box add コマンドを実行します。

試していませんが、64bitの場合は[Microsoft Visual C++ 2010 再頒布可能パッケージ (x64) ](https://www.microsoft.com/ja-jp/download/details.aspx?id=14632)のようです。
また、こちらも試していませんがOS種類によっては[Visual Studio 2013 の Visual C++ 再頒布可能パッケージ](https://www.microsoft.com/ja-jp/download/details.aspx?id=40784)が正解かもしれません。

## 実行結果

```
C:\Users\vagrant\Desktop\winenv>vagrant box add Centos67-32 package.box
==> box: Box file was not detected as metadata. Adding it directly...
==> box: Adding box 'Centos67-32' (v0) for provider:
    box: Unpacking necessary files from: file://C:/Users/vagrant/Desktop/winenv/package.box
    box: Progress: 100% (Rate: 118M/s, Estimated time remaining: --:--:--)
==> box: Successfully added box 'Centos67-32' (v0) for 'virtualbox'!

C:\Users\vagrant\Desktop\winenv>vagrant box list
Centos67-32  (virtualbox, 0)
C:\Users\vagrant\Desktop\winenv>
```

## おわりに
今までLinuxやOSX版のVagrantはさわっていたのですが、Windows版Vagrantは今回が初めてでした。
一部vagrant sshコマンドがそのままでは通らないなど、Linux系とは異なるところもありますが、
思った以上にそのままの操作性で使えたのはびっくりでした。やっぱりVagrantすごいですね。
zipを解凍するとcpgzになり、無限ループしてしまった時やったこと(Mac OSX)

windowsの仮想マシンを解凍すると、「zip→cpgz→zip」と無限ループに陥りました。
その時解決した方法です。

方法としては、単純に7zipと言う解凍ツールをターミナルにインストールしました。
以下にコマンドを記載します。
[関連記事：macでwin環境を試す](http://qiita.com/tak74/items/cbe0a5ab2e76795e1d40)
<hr>

```
1 $ brew install p7zip
2 $ 7z x IE11.Win8.1.For.Windows.VirtualBox.zip

3 $ 7z -h
```

1)7zipをターミナルからインストールします。
brew install p7zip

2)対象ファイルを解凍します。
7z x IE11.Win8.1.For.Windows.VirtualBox.zip

3)7zipのヘルプは以下です。
7z -h
visual studioのC++のincludeパスのintellisense補完が円マーク(バックスラッシュ)をスラッシュに変更

#Visual Studioでオートコンプリートされる円マークをスラッシュに変更
![2016-05-23_18h43_19.png](https://qiita-image-store.s3.amazonaws.com/0/70435/752ae8fe-c8c2-ec5a-f55e-e6462c1c0c0f.png)
円マークがソースコードに含まれていると死んでしまう病患者のための処方箋
インテリセンスは便利だが，includeパスの補完が円マーク(バックスラッシュ)になる。
マルチプラットフォーム対応のためにスラッシュにしたい。

#対処法
![2016-05-23_18h54_21.png](https://qiita-image-store.s3.amazonaws.com/0/70435/c77319b7-913f-ae09-f637-e988b1ada682.png)
ツール→オプション→テキストエディタ→C/C++→詳細→#include のオートコンプリートにスラッシュを使用:Trueにする

#なんでwindowsはスラッシュじゃないの？
Linux,Unixはオプションにハイフンを使うことにした。
で，ファイルパス区切りもじにはスラッシュを使うことにした。
/Sugoi/tuyoi -a hoge.txt

windowsはオプションにスラッシュを使うことにした。
スラッシュ使ってるのでファイルパス区切り文字にはバックスラッシュを使うことにした。
C:\Sugoi\tuyoi.exe /a hoge.txt

記号文字にどんな意味を持たせたかで変わってしまったんだね
AWS Inspectorを使ってみる


##使ったAMI
たまたま別件で起動させていたMautic AMIを使用
https://aws.amazon.com/marketplace/pp/B00YAY9OX6


##設定
http://blog.serverworks.co.jp/tech/2016/04/21/amazon-inspector-tutorial/

##Rule Package
診断に使うパッケージが複数存在する。

- Common Vulnerabilities and Exposures
- CIS Operating System Security Configuration Benchmarks
- Security Best Practices
- Runtime Behavior Analysis
https://docs.aws.amazon.com/inspector/latest/userguide/inspector_rule-packages.html

とりあえず全部回す

##結果

![スクリーンショット 2016-05-24 13.38.21.png](https://qiita-image-store.s3.amazonaws.com/0/23936/983e7dae-bc0b-124d-e4a6-edbea84b2b71.png "スクリーンショット 2016-05-24 13.38.21.png")

|スコア|説明|
|:--|:--|
|High|Describes a security issue that can result in a compromise of the information confidentiality, integrity, and availability within your assessment target. We recommend that you treat this security issue as an emergency and implement an immediate remediation.|
|Medium|Describes a security issue that can result in a compromise of the information confidentiality, integrity, and availability within your assessment target. We recommend that you fix this issue at the next possible opportunity, for example, during your next service update.|
|Low|Describes a security issue that can result in a compromise of the information confidentiality, integrity, and availability within your assessment target. We recommend that you fix this issue as part of one of your future service updates.|
|Informational|Describes a particular security configuration detail of your assessment target. Based on your business and organization goals, you can either simply make note of this information or use it to improve the security of your assessment target.|

From:https://docs.aws.amazon.com/inspector/latest/userguide/inspector_rule-packages.html

Highになっているものは即時対応が必要、Mediumは次回リリースまでに対応しておこう、Lowは将来的に対応しておいたほうがいいというところでしょうか。

Mediumが出てたので詳細確認。

|Label|Result|
|:--|:--|
|ターゲット名|TEST|
|テンプレート名|TEST|
|開始|Yesterday at 4:34 PM (GMT+9)
|終了|Yesterday at 5:35 PM (GMT+9)
|ステータス|分析完了
|ルールパッケージ|Security Best Practices-1.0
|AWS エージェント ID|i-83da6819
|結果|Instance i-83da6819 is configured to allow users to log in with root credentials over SSH. This increases the likelihood of a successful brute-force attack.
|重要度| Medium 
|説明|This rule helps determine whether the SSH daemon is configured to permit logging in to your EC2 instance as root.
|推奨事項|It is recommended that you configure your EC2 instance to prevent root logins over SSH. Instead, log in as a non-root user and use sudo to escalate privileges when necessary. To disable SSH root logins, set PermitRootLogin to "no" in /etc/ssh/sshd_config and restart sshd.
標準エラー出力にだけ色を付ける

概念としては別のものですが、標準出力と標準エラー出力は通常同じ端末の画面に出ます。

「標準エラー出力、色分けくらいしてくれれば便利なのに」と思っていましたが、以下のように **プロセス置換 (Process Substitution)** を使うことで一行に収めることができます。

まず標準入力に色を付けて標準出力に流すスクリプトを用意します。書かずとも既にあるという場合はそれを使っても :ok: です。

```pl:colorize
#!/usr/bin/perl

use strict;
use warnings;

use Term::ANSIColor qw(colored);

my $color = shift || "red";

while (<>) {
    print colored($_, $color);
}
```

標準出力と標準エラー出力の両方にデータを流すプログラムを想定します。ここでは簡単のため、丸括弧でサブシェルを作り、中で両方の出力を行うワンライナーとしましょう。

```shell-session
$ ( echo foo ; echo bar >&2 )
foo
bar
```

foo が標準出力、bar が標準エラー出力です。この段階ではどちらも見分けがつきません。

標準エラー出力だけを先ほど用意した `colorize` に流したいのですが、標準出力の場所を変えずに標準エラー出力だけをこちらに流すための方法の一つとしてプロセス置換の方法があります。仕組み的には**名前付きパイプ**と同等です。

```shell-session
$ ( echo foo ; echo bar >&2 ) 2> >(colorize >&2)
foo
bar
```

* 標準エラー出力のリダイレクト記号 `2>` で、左側の標準エラー出力を右側の「ファイル」出力へリダイレクトするよう変更
* 右側の「ファイル」は通常のファイルではなく `>(...)` 構文になっている。これは丸括弧内のプロセスに対する名前付きパイプとなっており、結果的に `colorize` の標準入力となる。
* `colorize` で赤く色付けをして `>&2` で標準エラー出力へ戻す。

もともと標準出力と標準エラー出力で出力バッファリングの効き方が異なるので、この「標準エラー出力色付けフィルタ」があると、当初と出力の順序やタイミングが微妙に異なってくることがあります。

記号をたくさん書くのは大変なので、工夫するとすればシェル関数にまとめたりすることでしょうか。

```bash
function colorize-stderr {
    "$@" 2> >(colorize >&2)
}
```

```shell-session
$ cat errok.sh
#!/bin/bash
echo foo
echo bar >&2
$ colorize-stderr ./errok.sh
foo
bar
```

参考：

* [bashのプロセス置換機能を活用して、シェル作業やスクリプト書きを効率化する - 双六工場日誌](http://sechiro.hatenablog.com/entry/2013/08/15/bash%E3%81%AE%E3%83%97%E3%83%AD%E3%82%BB%E3%82%B9%E7%BD%AE%E6%8F%9B%E6%A9%9F%E8%83%BD%E3%82%92%E6%B4%BB%E7%94%A8%E3%81%97%E3%81%A6%E3%80%81%E3%82%B7%E3%82%A7%E3%83%AB%E4%BD%9C%E6%A5%AD%E3%82%84%E3%82%B9)
Homebrewを取り囲むセットアップシェル界隈の情勢（2016年5月版）


2年くらい前までは、brewdleが行方不明になったり、そのせいでBrewfileはオワコン扱いされたりといろいろありましたが、 Homebrew CaskがHomebrewに取り込まれたことでセットアップ界はだいぶ落ち着いたと思われます（自分調べ）。

というわけでHomebrew関連のセットアップツールについて現在の状況をまとめました。
なお、AnsibleとかBoxenとかについては触れません。ご了承ください。

## Homebrew Cask

[Homebrew Cask](https://caskroom.github.io/)は簡単に言うとその辺に転がっているパッケージをインストールできるツールです。
もともとは後述するbrewdleで有名になったと記憶しているんですが、便利すぎたので本家に吸収されちゃっています。

```bash
$ brew cask install alfred
$ brew cask install android-studio
$ brew cask install atom
$ brew cask install genymotion
$ brew cask install google-chrome
・
・
・
```

これだけでChromeとかAndroidStudioとかがインストールできます。
今では `brew tap` もいらなくなりました（Homebrewはさすがに必要）。

デフォルトのダウンロード先は `/Applications` になっているので、Alfredで検索する場合も気にしないで大丈夫です（ご指摘ありがとうございます！）。
なお、ダウンロード先を変えたい場合は、こんな感じで環境変数を設定するとインストール先を指定できます。

```bash:.bashrc
export HOMEBREW_CASK_OPTS="--appdir=/some/path/bar"
```

インストールが終わった後に`brew cask cleanup`を実行すると、使ったzipを削除してくれるので、容量が気になる人は一緒に実行するとよいです。

## mascli

[mascli](https://github.com/argon/mas)はAppStore上のアプリをインストールできるツールです。
Homebrew Caskがカバーできない領域を埋める形で勢力を拡大していってます。

使い方ですが、たったこれだけでアプリがインストールされます。

```bash
$ brew install mas

$ mas install 803453959 # Slack
$ mas install 896624060 # Kobito
$ mas install 497799835 # Xcode
```

この並んでいる数字はAppStoreのURL中にある `https://itunes.apple.com/us/app/slack/id803453959` みたいなID番号です。

インストール済みのMacで下記コマンドを叩くとIDが見れるので、別PCから持ってくる場合はあらかじめ調べておくといいでしょう。

```bash
$ mas list
944960179 AnyDo
405843582 Alfred
497799835 Xcode
・
・
・
```

なお、無料アプリをインストールする場合は、`システム環境設定 -> App Store -> パスワードの設定` から、 **無料ダウンロードの項目を「パスワードは不要」にしておかないとエラーになる** のでご注意を。

## homebrew-bundle

[homebrew-bundle](https://github.com/Homebrew/homebrew-bundle)は、Rubyのbundlerのように、1ファイルでHomebrewのパッケージを管理したいという思想から始まった？ツールです。

もともとはbrewdlerという名前で、Rubyに依存していました。
[いろいろあった結果](http://rcmdnk.github.io/blog/2015/03/24/computer-mac/)、現在はRubyに依存せず、さらにHomebrew Caskもmascliも書けるようになりました。

使い方ですが、まずはBrewfileを作ります。

```bash:Brewfile
cask_args appdir: '/Applications'

brew 'vim', args: ['with-lua']
cask 'google-chrome'
mas '1Password', id: 443987910
```

で、この2行を実行すればOK。

```bash
$ brew tap Homebrew/bundle
$ brew bundle
```

ただ、ファイルに書かれたパッケージをインストールするだけなので、Homebrew Caskが本家に取り込まれてしまっている現状では、中途半端な存在になっています。

## まとめ
2016年5月の時点では、Homebrew Caskとmascliを使っておけばなんとかなるという感じでしょうか（defaults使えばMacの設定も変更できます）。
brewdleがいろいろあった時に止めてしまった人も今なら大丈夫そうなので、是非セットアップシェルを作ってみてはいかがでしょうか。
Docker + Serverspec を使ってCircleCI 上でインフラのテストを実行する

# TL;DR

- Itamae レシピを Docker + Serverspec でテストする
- テストのためにDocker コンテナ上で `sshd` を実行したくない
- CircleCI は `docker exec` 使えないので `lxc-attach` を使う

# ローカル環境 (OS X) からテストを実行する

## 必要なモノをインストールする

- docker
- docker-machine
- docker-machine-driver-xhyve

Homebrew などで適宜インストールしておいてください。
既にVirtualBox などを使っている場合は xhyve じゃなくても良いです。

_cf. [OS XのネイティブHypervisorを使うxhyveと、ネイティブDockerを立ち上げるdocker-machine-driver-xhyveを作った話](http://qiita.com/zchee/items/cb4bb68a0aab12dfa2c1)_

## Docker コンテナを作成する

Docker Machine を作成して、コンテナを使う準備をします。スペックは適宜調整してください。

```
docker-machine create ci\
  --driver xhyve\
  --xhyve-memory-size 2048\
  --xhyve-disk-size 5120\
  --xhyve-cpu-count 1\
  --xhyve-experimental-nfs-share;
```

Docker イメージをダウンロードする際にDNS が欲しいので適当に突っ込みます。

```
docker-machine ssh ci "sudo echo 'nameserver 8.8.8.8' > /etc/resolv.conf"
```

あとは、Docker コマンドを扱えるように `docker-machine env ci` を確認して環境変数を設定してください。

## コンテナを使ってテストを実行する

プロビジョニングのためにSSH サーバーを立てる場合、プロビジョニング用のSSH ユーザや鍵の追加でサーバー構成に差分が出るため、コンテナ内でローカルホストに向けて Itamae を実行しています。

SSH サーバーの構成差分が特に気にならなければ、SSH サーバーを立てる方法でも良いと思います。[Docker コンテナ的にはSSH サーバー立てるな](http://postd.cc/docker-ssh-considered-evil/)ということもありますが、テストのためのコンテナなら良いと思います。

SSH 経由で動かすなら下記の記事などを参考にすると良いと思います。
[CircleCI + Docker による Itamaeレシピの継続的インテグレーション](http://qiita.com/kotaroito/items/e5490b4188c41c07bba0)

### コンテナを定義する

コンテナ内で Itamae とServerspec を動かすため、Ruby と合わせてインストールします。Itamae のレシピは `COPY` でコンテナ内に配置します。

```:Dockerfile
FROM alpine

RUN apk update && apk upgrade
RUN apk add --no-cache ruby ruby-io-console ruby-json
RUN gem install itamae rake serverspec --no-ri --no-rdoc

COPY . /usr/local/provisioning

CMD ["tail", "-f", "/dev/null"]
```

コンテナ自体は特にプロセスを実行する必要が無いので、代わりに `tail -f /dev/null` を実行させてテスト実行まで待機させています。 `RUN` はなるべく1行にまとめて実行したほうが良いですが、読みづらいので分けて書いておきます。

_cf. [Alpine Linux で軽量な Docker イメージを作る](http://qiita.com/pottava/items/970d7b5cda565b995fe7)_

### Itamae + Serverspec を実行する

イメージをビルドして動かした後、 `docker exec` を使ってコンテナ上で Itamae とServerspec を動かすだけです。

```
docker build -t spec -f Dockerfile --no-cache .
docker run --name ci -it -d spec
docker exec -it ci /bin/sh -c 'cd /usr/local/provisioning && itamae local roles/ci.rb'
docker exec -it ci /bin/sh -c 'cd /usr/local/provisioning && rake spec'
```

# CircleCI でテストを実行する

CircleCI は `docker exec` に対応していないので、 `lxc-attach` を使います。ローカルで構築した構成はそのまま使えるので、コマンドだけ置き換えればOK です。

_cf. [Docker Exec - CircleCI](https://circleci.com/docs/docker/#docker-exec)_

```:circle.yml
machine:
  services:
    - docker

dependencies:
  pre:
    - docker build -t spec -f Dockerfile --no-cache .
    - docker run --name ci -it -d spec
test:
  pre:
    - sudo lxc-attach -n "$(docker inspect --format '{{.Id}}' ci)" -- /bin/sh -c 'cd /usr/local/provisioning && itamae local roles/ci.rb'
  override:
    - sudo lxc-attach -n "$(docker inspect --format '{{.Id}}' ci)" -- /bin/sh -c 'cd /usr/local/provisioning && rake spec'
```

# 気になるところ

Docker コンテナに Ruby 環境 (Itamae と Serverspec) を作らなくて良いように、`itamae` を `lxc-attach` 経由で実行できると良さそう。今のDocker イメージだとビルドに30秒くらいかかる。

## 追記

[Infrataster も試しにCircleCI で動かしてみました](https://yulii.github.io/infrastructure-testing-20160608.html)
Grails3プロファイル: Mavenリポジトリ設定と参照の補足

# Grails3プロファイル: Mavenリポジトリ設定と参照の補足

[Grails3 アプリケーションプロファイル(意訳版)](http://qiita.com/tyama/items/d35b450209545cf2c2cb)でわかりにくかったリポジトリ指定部分の補足。

## .grails/settings.groovyへの設定
独自のリポジトリを追加する場合ドキュメントに従うと、Grailsセントラルが見えなくなりエラーが出る場合があります。その場合は、repositoriesにGrailsセントラルリポジトリを追加で対応できます。
`~/.grails/settings.groovy`、profiles.repositoriesの内容を以下のように:

```
grails {
  profiles {
    repositories {
      myRepo {
        url = "http://repo.my-company.jp/snapshots"
        snapshotsEnabled = true
      }
      grailsCentral {
        url = "http://repo.grails.org/grails/core"
        snapshotsEnabled = true
      }
    }
  }
}
```

上記`grailsCentral{}`の部分が無いと以下のエラーがでます:

```
% grails create-app myapp --profile org.grails.profiles:myprofile:1.0.0-SNAPSHOT
| Error Error occurred running Grails CLI: Could not find artifact org.grails.profiles:web:jar:3.1.6 in myRepo
```


## .m2/settings.xmlへの設定
認証はドキュメントにもあるとおりAetherを使用しているので、`~/.m2/settings.xml`にusernameとpasswordを設定します。プロキシ等も必要な場合も設定:

```
<?xml version="1.0" encoding="UTF-8"?>
<settings xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.1.0 http://maven.apache.org/xsd/settings-1.1.0.xsd" xmlns="http://maven.apache.org/SETTINGS/1.1.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <servers>
    <server>
      <username>taro</username>
      <password>secret</password>
      <id>myRepo</id>
    </server>
</settings>
```

## プロファイルの指定方法
単純に名称指定のみの場合は実行しているGrailsのバージョンと同じ物を探しに行くのでプロファイルのバージョンが違う場合はフルで依存ライブラリ指定する必要があります:

名称指定の場合以下のようにエラーがでます:

```
# grails create-app myapp --profile myprofile
| Error Error occurred running Grails CLI: Could not find artifact org.grails.profiles:myprofile:jar:3.1.6
```

フルで依存ライブラリ指定:

```
grails create-app myapp --profile org.grails.profiles:myprofile:1.0.0-SNAPSHOT
```
Xcode7.3 & SwiftでつくるCocoaTouch Framework（使用編）


<img src="https://qiita-image-store.s3.amazonaws.com/0/25250/5f317328-27ed-4a99-085b-a132bc34d1d6.png" width="250">

# はじめに

[前回の投稿](http://qiita.com/mfks17/private/b1ae615744e311a7f9eb)で作成したFrameworkを今回は使用する過程をメモしたいと思います。方針としては、workspaceを作成しFramework、それを使用するプロジェクトを1つのXcode上で編集できるようにしたいと思います。

# 環境

- OS X El Captian 10.11.4
- Xcode 7.3
- Swift 2.0

# 使用方法

## Xcodeの起動

- File -> New -> Workspaceを選択

<img src="https://qiita-image-store.s3.amazonaws.com/0/25250/a60746ce-883b-8ab7-6192-d60905b305ea.png" width="480">

- 今回はDittoとしました。

## WorkspaceにFrameworkのプロジェクトを追加

- Navigator areaで右クリック

<img src="https://qiita-image-store.s3.amazonaws.com/0/25250/5c23ebc5-8243-016e-895e-b187755098dd.png" width="480">

- 作成したFrameworkのプロジェクトを追加します（.xcodeproj拡張子）

<img src="https://qiita-image-store.s3.amazonaws.com/0/25250/1dc8f630-9b44-8d3c-7fd8-1948720a5f9a.png" width="480">

- 追加すると上記のようになります。次にこのFrameworkを使用するプロジェクトを作成し、同様にWorkspaceに追加します。

<img src="https://qiita-image-store.s3.amazonaws.com/0/25250/ca298142-cc47-df5d-2d55-00bdf8cbd83a.png" width="480">

- 今回は、Single Page Applicationを選択しました。

<img src="https://qiita-image-store.s3.amazonaws.com/0/25250/aee2a762-f477-c3dc-5063-aa5bfeab1f9b.png" width="480">

- DittoSampleというプロジェクトを作成しました。

<img src="https://qiita-image-store.s3.amazonaws.com/0/25250/86509781-b527-3d4c-13dc-492f6de73caf.png" width="480">

- 最終的にはこのようになると思います。

## サンプルから、Frameworkを使えるようにする

- サンプルプロジェクトを選択し、"Genaral"タブの"Linked Framework and Libraries"の"+"をクリックします。

<img src="https://qiita-image-store.s3.amazonaws.com/0/25250/294a1e0e-09ad-1fec-063a-0051ab85cf65.png" width="480">

- そうすると、内包されているFrameworkと一緒にWorkspace内のFrameworkも表示されます。

<img src="https://qiita-image-store.s3.amazonaws.com/0/25250/603db2f4-5b0b-ab6d-2814-cc9e6617c457.png" width="200">

- 追加したFrameworkを選択して"Add"します。

<img src="https://qiita-image-store.s3.amazonaws.com/0/25250/48a19807-4aff-b790-47a6-a48fcb17c0cb.png" width="480">

- こんな感じになると思います。

## WorkspaceのFrameworkプロジェクトをビルドする

- ここまで来たら、もう少しです。さきほど、追加したFrameworkをユニバーサルビルドします。

- あとは、```import Ditto```すると、自分で作ったFrameworkを使用する事ができます。Frameworkのソースも編集する事ができ（その際は、ビルドが必要）とても捗る感じになります。


# 感想

- 一度Frameworkを作ってしまえば、部品として使う事ができてとても便利ですね。機会があれば、是非挑戦したいと思います。

# 謝辞

- [[Xcode6] iOSアプリプロジェクト内にframeworkプロジェクト | MUSHIKAGO APPS MEMO](http://mushikago.com/i/?p=5671)
もっとC言語とSwiftを一つのプロジェクトで混在させてみる(OS X, Linux)

# 概要
* [前回](http://qiita.com/YOCKOW/items/3b56f546f2bf9bbce5f6)はSwiftからCの関数を呼んだだけだったけど、今回はCからもSwiftの関数を呼んでみる。

# 要約
* だいたい前回と一緒。
* Swiftの関数はマングリングされてしまうので、Cから呼びたかったら…どっちか：
  1. Swiftでマングリングを抑止
  2. CからSwiftのマングリングされた関数を呼び出す
* 今回は1.を採用。理由は次の通り：
  * 1.が簡単だから。
  * SwiftのABIはまだまだunstableだから[^要約-1]。

[^要約-1]: Swift 3.0からABIが安定する…はずだったのに、さらに先送りとなった[^要約-1-注釈-1]。
[^要約-1-注釈-1]: [Winding down the Swift 3 release](http://thread.gmane.org/gmane.comp.lang.swift.evolution/17276)

# 環境
前回と同じ。

* OS X = OS X El Capitan + Xcode 7.3 (Swift 2.2)
* Linux = CentOS 7 + Swift 2.2.1

```console:OS&#x0020;X
$ clang --version
Apple LLVM version 7.3.0 (clang-703.0.29)
Target: x86_64-apple-darwin15.5.0
Thread model: posix
InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin

$ swift --version
Apple Swift version 2.2 (swiftlang-703.0.18.1 clang-703.0.29)
Target: x86_64-apple-macosx10.9
```

```console:Linux
$ clang --version
clang version 3.8.0 (tags/RELEASE_380/final)
Target: x86_64-unknown-linux-gnu
Thread model: posix
InstalledDir: /usr/local/bin

$ swift --version
Swift version 2.2.1 (swift-2.2.1-RELEASE)
Target: x86_64-unknown-linux-gnu
```

# ソースファイル
今回は4つファイルを用意してみた。

```console
$ ls
c.c  c.h  swift.h  swift.swift
```

```c:c.h
#include <stdio.h>
void c_function(const char *string);
void call_swift_function(void);
```

```c:swift.h
void swift_function(const char *string);
```

```c:c.c
#include "c.h"
#include "swift.h"
void c_function(const char *string) {
  printf("%s", string);
}
void call_swift_function(void) {
  swift_function("Hello, I'm C.\n");
}
```

```swift:swift.swift
@_silgen_name("swift_function")
func swift_function(cString:UnsafePointer<CChar>) {
  print(String.fromCString(cString)!) 
}
c_function("Hello, I'm Swift.\n")
call_swift_function()
```
※Swift 2.2未満では`@_silgen_name`ではなく`@asmname`を使いましょう。

# コンパイル手順

## C言語ソースからオブジェクトファイルを作成

```console:OS&#x0020;X,&#x0020;Linux共通
$ clang -c c.c -oc.o
$ ls
c.c  c.h  c.o  swift.h  swift.swift
```

## オブジェクトファイルと一緒にSwiftソースをコンパイル

```console:OS&#x0020;X
$ xcrun --sdk macosx swiftc swift.swift c.o -import-objc-header c.h
ld: warning: object file (c.o) was built for newer OSX version (10.11) than being linked (10.9)
$ ls
c.c		c.h		c.o		main		swift.h		swift.swift
$ ./main
Hello, I'm Swift.
Hello, I'm C.
```

```console:Linux
$ swiftc swift.swift c.o -import-objc-header c.h
$ ls
c.c  c.h  c.o  main  swift.h  swift.swift
$ ./main
Hello, I'm Swift.
Hello, I'm C.
```

できた。これでおわり。
ね、簡単でしょう？

# そういえば
関数ポインタを受け渡すという手もあるけど、それはまた[別の話](http://qiita.com/YOCKOW/items/9239e65995b8c4f8b14f)。
考察 > 屋外計測 > センサーの検討

センサーシステムを作るにおいて、どういう測定をしたいだろうか。
屋外の色々な場所で測定して面白いものを探してみる。

CPUボードとしてはESP8266を使う予定。

- 温度湿度
  - 自宅と遠方で同時測定をして比較する
  - その場合、RTCが必要
  - 感雨センサー [RS-1] http://www.aitendo.com/product/11953
- 可視光、近赤外の測定
  - 特にアイデアなし
- 距離計
  - あの2頭のライオンの彫像のスキャンをいつか実現したい
  - その場合、ローカルの位置情報 + 9軸 + 距離計のコンボが必要だろうか
  - 接近センサーモジュール [ST178H-M] > http://www.aitendo.com/product/3213
  - https://www.switch-science.com/catalog/139/ : 電源電圧2.5Vから5.5V (3.3V駆動できそう) > http://www.maxbotix.com/Ultrasonic_Sensors/MB1010.htm によるとMaximum Range of 254 inches (645 cm)
- 高度測定
  - 自転車で移動しながら高低差を測定できれば面白そうだ
  - GPSと組合せた方がなお良い
  - 以下のリンク先など参考に高度測定を検討してみる。
  - http://www.geocities.jp/zattouka/GarageHouse/micon/Arduino/Pressure/Pressure2.htm
  - 秋月で扱っている http://akizukidenshi.com/catalog/g/gI-04596/
  - 自転車への基板マウントは、かごの部分につけるなり工夫が必要 http://redketchup.blog113.fc2.com/blog-entry-27.html
- CO2計
  - 5V駆動が課題
- GPS
  - 1万円で買ったがっかりなGPS計より精度を上げられるかどうか
  - https://www.adafruit.com/products/746 > Position Accuracy: < 3 meters (all GPS technology has about 3m accuracy)
- 風速計
  - http://akizukidenshi.com/catalog/g/gM-00945/
  - 回転運動を電圧に変換するものがあればAD取込みできる
  - その場合、風速の校正は難しいだろう
- 音
  - http://akizukidenshi.com/catalog/c/cmic/
  - 音の強弱程度は測定できるだろうか
- 傾斜
  - 傾斜センサモジュール [SHAKE-LM393-M2] > http://www.aitendo.com/product/13297
  - 高度と傾斜の測定?
- 振動
  - 振動センサーモジュール [SHK393-20-4P] > http://www.aitendo.com/product/10163
  - 道路のでこぼこ具合の測定しか思いつかない
  - 酷道の測定?
LaravelでDBテーブルの値をビューに埋め込んで表示する


#スマートなコードにするポイント

- データはまとめて`$members`として渡す
- foreachはビュー側でまわす

#DBの全データを取得

```php:Controller.php
public function getMemberList() {

    $members = Member::all();	// Eloquent"Member"で全データ取得
    return view('list', [
        "members" => $members
    ]);
}
```

#埋め込む

```
<tbody>
    @foreach($members as $member)
        <tr>
            <td>{{ $member->email }}</td>
            <td>{{ $member->name }}</td>
            <td>{{ $member->kana }}</td>
        </tr>
    @endforeach
</tbody>

```

#追記：日付を表示するとき

Carbonのフォーマットが使える

```
@foreach($contents as $content)
  	 <p>{{ $contents->end_date->format('y/m/d') }}</p>
@endforeach
```

DBに入ってる日付データが文字列になってたせいでうまくとりだせなかったので、

- 日付データをdateTime等にする
- Eloquentに `protected $dates = "end_date"` を追加

といったことを忘れずに。
unity > git > ignore ファイル > ProjectSettingsフォルダはignoreしない

http://qiita.com/7of9/items/4e90277b1305f7171188
において、Mac上でビルドした場合は問題ないが、githubにアップロードして、そのファイルを取得したWindows上でビルドした場合、正常動作しなくなっていた。

どうもgitignoreにおいて以下のようにしてしまっていたのが問題のようだ。タグ関連の情報が消失して、正常動作しなくなっていた。

```
ProjectSettings/*.asset
```

下記のリンクでも ProjectSettings はignoreしないほうが良いとの記載あり。

http://naichilab.blogspot.jp/2014/01/git-6sourcetreegitunitygit.html
> gitignore で ProjectSettings 消したら設定が全て死ぬのではないでしょうか？

githubのおすすめのignoreは以下。

https://github.com/github/gitignore/blob/master/Unity.gitignore
foreachの全データを返す


phpのforeachの全データを取得するのに手間取ったので。

#公式サイトより

サイトは[ここです](http://php.net/manual/ja/control-structures.foreach.php "ここです")。

```
<?php
$arr = array(1, 2, 3, 4);
foreach ($arr as &$value) {
    $value = $value * 2;
}
// $arr は array(2, 4, 6, 8) となります
unset($value); // 最後の要素への参照を解除します
?>
```

#使ってみた
Eloquentクラス`Account`を使ってテーブルから値を取得。

##最後のデータしか表示されない・・・。

```
$accounts = Account::all();

foreach ($accounts as $account) {
    $name = $account->name;
}
dd($name);
```

これで返ってきたのは以下の値。

```
"たけだ"
```


７つある全データのうちの最後だけ。
理由は **foreachを回すたびに$nameが上書きされる**から。

##配列にする

そこで、一つ終わるたびに配列に突っ込むようにする。
1. 配列をつくる
2. 配列に突っ込む

```
$accounts = Account::all();

$names = [];
foreach ($accounts as $account) {
    $names[] = $account->name;
}
dd($names);
```

以下が返ってきた値。

```
array:7 [▼
  0 => "やまだ"
  1 => "すずき"
  2 => "まえだ"
  3 => "やました"
  4 => "たなか"
  5 => "くぼ"
  6 => "たけだ"
]
```
vagrant upすると落ちて再起動する

vagrant upで起動させている数分間の最中に、落ちて再起動してしまいます。
メモリには余裕があると思います。
どうすれば解決できるでしょうか。
補足：Mac OSX Yosemite ver 10.10.3 でvagrant ver 1.8.1 を使用しています。
VirtualBoxはもういらない？Docker社が開発中のDockerForMacの紹介


# はじめに

DockerをはじめてMacで使った時、VirtualBoxをインストールして、その上にDockerを立ち上げないとDockerは動かないということを知って、深く落胆しました。

だったら、VirtualBoxだけでもいいじゃん！って少し思いながら今日まで使ってきました。

そんな時、`Docker for Mac` `Docker for Windows`という、MacとWindowsでVirtualBoxを使わずにDockerを利用できるアプリをDocker本社が作っているという情報を入手し、早速Beta版を入手したので、試してみたいと思います！

# Docker for Macとは

![スクリーンショット 2016-05-24 10.33.16.png](https://qiita-image-store.s3.amazonaws.com/0/55672/e971b396-ffd1-26f3-1d48-30d6e622d666.png "スクリーンショット 2016-05-24 10.33.16.png")

[公式Document](https://beta.docker.com/docs/)

公式Documentで書かれている、従来のDockerとの違いは以下のようになります。

- Faster and more reliable
  - VirtulaBoxが必要無い！したがって、docker-machineはもう使わなくてもいい！
  - Macはxhyveを利用し、WindowsはHyper-V（windows10以降）を利用する
- Native apps for better tools integration
  - 使いやすいNativeアプリになるよ！
- Use with Docker Toolbox and Docker Machine
  - 今まで使っていたdocker環境と共存できるよ！
-  Volume mounting for your code and data
  -  ボリュームマウントが速くて、正確だよ！
-  Support for multiple architectures out-of-the-box
 - マルチプラットフォーム対応しているよ！

# Docker for Macを使うには

[Beta版専用ページ](https://beta.docker.com/) で事前登録が必要です。
ここで申し込むとTokenが送られてきます。
※Tokenはアプリ起動時に必要


# 実際に使ってみた

## ダウンロード

- [Downloadページ](https://beta.docker.com/docs/) から `Docker for Mac`をダウンロード

- ダウンロードした Docker.dmgを実行

## 起動

- アプリケーションに入った`Docker`を起動
- Token入力
  - ![スクリーンショット 2016-05-24 11.01.45.png](https://qiita-image-store.s3.amazonaws.com/0/55672/fdba13b7-9250-dc4c-a615-34beb7343640.png "スクリーンショット 2016-05-24 11.01.45.png")
- Docker Machineのデータ（イメージとコンテナ）をコピーするか決める
  - ![スクリーンショット 2016-05-24 11.03.53.png](https://qiita-image-store.s3.amazonaws.com/0/55672/536528ae-508f-d23d-ac37-7e39c5aa5701.png "スクリーンショット 2016-05-24 11.03.53.png")
※ きちんと移行できているか確認したいので今回はCopyを押す。
- 終了確認（アイコンが設置される）
  - ![スクリーンショット 2016-05-24 11.06.18.png](https://qiita-image-store.s3.amazonaws.com/0/55672/780852a9-531f-dd3d-03a0-f91c86bfe63f.png "スクリーンショット 2016-05-24 11.06.18.png")

## データ確認

- データ移行がうまくいったのか確認する
  - ![スクリーンショット 2016-05-24 11.20.14.png](https://qiita-image-store.s3.amazonaws.com/0/55672/6e35a512-c3f6-8155-b7bc-1aecef2b3004.png "スクリーンショット 2016-05-24 11.20.14.png")

Docker Machineが止まっている状態で`docker images`コマンドが使えること、さらに以前、Docker-machineで利用していたイメージとコンテナが移行されたことを確認できた。

※注意点
Docker MachineからDocker for Macに移行できるイメージとコンテナは、`Default`に登録されているものに限る。
他のDocker-Machineに登録されているものはどうやら移行できないらしい。

## はまったところ

- `docker run -p 80:80 nginx` が終わらなかった。
他の人の記事を見ていると、すんなりできている人もいるので、私のローカルの問題なのかもしれません。

## さいごに

dockerをVirtulaBoxなしで起動できるのはとてもありがたいですね！
Linuxと同じ環境になるし、ポートフォワーディングも簡単だし、ホストディレクトリのマウントも簡単なので！
安定したら、これを積極的に使いたいですね。

- 他の方の記事
 - [Docker for Mac by paiza](http://paiza.hatenablog.com/entry/docker_for_mac)
 - [Docker for Windows by @zembutsu](http://qiita.com/zembutsu/items/c281ffc4481e2f2873ae)
beamerのスライドにフレーム番号を挿入する


## 環境

- TeX Live/MacTeX 2015
- Beamer 3.36

Beamerのバージョンが多少古くても大丈夫(だと思う)．

## outerthemeとして`infolines`を使う場合

デフォルトでフレーム番号が右下に表示されるので特に何もする必要はありません．

## それ以外の場合

プリアンブルに以下を挿入すると，フレームの右下に`current frame / total frame`の形でフレーム番号が表示される．

```tex
\setbeamertemplate{footline}[frame number]
```

注意:
outerthemeとして`split`を使用する場合，フレームの下部に`short author | short title`が表示されなくなります．

### フレーム番号の色を変更する

例えば*赤色*にしたい場合，プリアンブルに以下を挿入する．
(`bg`を指定しても反映されません)

```tex
\setbeamercolor{page number in head/foot}{fg=red}
```

### フレーム番号のフォントを変更

例えば大きい(`\large`)タイプライター体(`\ttfamily`)を指定する場合，プリアンブルに以下を挿入する．

```tex
\setbeamerfont{page number in head/foot}{family=\ttfamily,size=\large}
```

## 参考文献

- The BEAMER class User Guide for version 3.36 - §8.2.1
Androidで便利なライブラリ一覧


#[android-maps-utils](https://github.com/googlemaps/android-maps-utils)

マーカークラスター、ヒートマップなど容易に実装可能。
>
Marker clustering — handles the display of a large number of points
Heat maps — display a large number of points as a heat map
IconGenerator — display text on your Markers (see screenshot to the right)
Poly decoding and encoding — compact encoding for paths, interoperability with Maps API web services
Spherical geometry — for example: computeDistance, computeHeading, computeArea
KML — displays KML data (Caution: Beta!)
GeoJSON — displays and styles GeoJSON data

参考
http://googlemaps.github.io/android-maps-utils/
![](http://googlemaps.github.io/android-maps-utils/bubblemarker.png)

#[greenrobot/EventBus](https://github.com/greenrobot/EventBus)
非同期処理やオブジェクト間のやりとりを容易に実装可能。
インタフェースを使ったコールバックを実装する作業からおさらば。
とっ散らからないように注意。

#[JakeWharton/butterknife](https://github.com/JakeWharton/butterknife)
findViewById、setOnClickListerを楽に書ける。これなしでは考えられない。

#[JakeWharton/DiskLruCache](https://github.com/JakeWharton/DiskLruCache)
ディスクキャッシュ・メモリキャッシュ管理。

#[wdullaer/MaterialDateTimePicker](https://github.com/wdullaer/MaterialDateTimePicker)
マテリアルなDate Picker、DateTime Picker。
![](https://camo.githubusercontent.com/1467c2b5d209d68aef8ac96cc6bdc28a6c2b1f3d/68747470733a2f2f7261772e6769746875622e636f6d2f7764756c6c6165722f4d6174657269616c4461746554696d655069636b65722f67682d70616765732f696d616765732f646174655f7069636b65722e706e67)

#[amlcurran/ShowcaseView](https://github.com/amlcurran/ShowcaseView)
画面全体にオーバーレイ、またはボタンなどを指定して意味を伝える。
簡単にコーチマークを作成できる。
![](https://github.com/amlcurran/ShowcaseView/raw/master/example2@2x.png)

#[johnkil/Android-AppMsg](https://github.com/johnkil/Android-AppMsg)
いけてるToast。
![](https://camo.githubusercontent.com/2e5c9d7b6239afb43ade3e52e5156e33bf63dbc5/687474703a2f2f6934362e74696e797069632e636f6d2f32316b797769742e706e67)

#[futuresimple/android-floating-action-button](https://github.com/futuresimple/android-floating-action-button)
複数のFloatingActionButtonを表示可能。
![](https://github.com/futuresimple/android-floating-action-button/raw/master/screenshots/labels.png)

#[pedant/sweet-alert-dialog](https://github.com/pedant/sweet-alert-dialog)
いけてるダイアログ。DialogFragmentで実装されていない。
![](https://github.com/pedant/sweet-alert-dialog/raw/master/change_type.gif)
MKMapViewに全てのピンを表示させる。

## はじめに
とても簡単にできたのに`GitHub`とかを読み漁ってしまった・・・。

```swift
            // 最低限の地図の大きさ
            let MINIMUM_MAP_SPAN = MKCoordinateSpanMake(0.002, 0.002)
            
            var topLeftCoord = CLLocationCoordinate2D(latitude: -90, longitude: 180)
            var bottomRightCoord = CLLocationCoordinate2D(latitude: 90, longitude: -180)
            
            // 2点間の計算を行う。
            // 現在地
            topLeftCoord.longitude = fmin(topLeftCoord.longitude, localCoordinate.longitude)
            topLeftCoord.latitude = fmax(topLeftCoord.latitude, localCoordinate.latitude)
            bottomRightCoord.longitude = fmax(bottomRightCoord.longitude, localCoordinate.longitude)
            bottomRightCoord.latitude = fmin(bottomRightCoord.latitude, localCoordinate.latitude)
            
            // ピンの位置
            topLeftCoord.longitude = fmin(topLeftCoord.longitude, pinCoordinate.longitude)
            topLeftCoord.latitude = fmax(topLeftCoord.latitude, pinCoordinate.latitude)
            bottomRightCoord.longitude = fmax(bottomRightCoord.longitude, pinCoordinate.longitude)
            bottomRightCoord.latitude = fmin(bottomRightCoord.latitude, pinCoordinate.latitude)
            
            var region = MKCoordinateRegion()
            region.center.latitude = topLeftCoord.latitude - (topLeftCoord.latitude - bottomRightCoord.latitude) * 0.5
            region.center.longitude = topLeftCoord.longitude + (bottomRightCoord.longitude - topLeftCoord.longitude) * 0.5
            
            // 端ギリギリにピンが立つのを避けるため少し広げる
            region.span.latitudeDelta = fabs(topLeftCoord.latitude - bottomRightCoord.latitude) * 1.1;
            region.span.longitudeDelta = fabs(bottomRightCoord.longitude - topLeftCoord.longitude) * 1.1;
            // 拡大しすぎの場合は最低限の縮尺にする
            region.span.latitudeDelta = fmax(MINIMUM_MAP_SPAN.latitudeDelta, region.span.latitudeDelta);
            region.span.longitudeDelta = fmax(MINIMUM_MAP_SPAN.longitudeDelta, region.span.longitudeDelta);
            
            self.mapView.setRegion(self.mapView.regionThatFits(region), animated: true)
```

ではなくて

```swift
self.mapView.showAnnotations(self.mapView.annotations, animated: true)
```

これで現在地も含め、全てのピンが表示される地図の倍率を出してくれた・・・。
2時間も探し求めたのに・・・・（初めに見つけた文献は間違ってて余計にはまった。）

でも、緯度経度の考え方を見直すときに使いそうなのでメモっておく。

参考

シンプルな回答
[http://p-l-us-creative.com/%E3%82%A2%E3%83%97%E3%83%AA/mkmapview%E3%81%A7%E3%82%A2%E3%83%8E%E3%83%86%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%84%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E3%81%AE%E4%BD%8D%E7%BD%AE%E3%82%92%E3%81%99%E3%81%B9%E3%81%A6%E8%A1%A8](http://p-l-us-creative.com/%E3%82%A2%E3%83%97%E3%83%AA/mkmapview%E3%81%A7%E3%82%A2%E3%83%8E%E3%83%86%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%84%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E3%81%AE%E4%BD%8D%E7%BD%AE%E3%82%92%E3%81%99%E3%81%B9%E3%81%A6%E8%A1%A8)

がんばって計算しているコード
[https://gist.github.com/ttsubono/2988074](https://gist.github.com/ttsubono/2988074)

アメリカなどを含めると以下の計算式だと途中で落ちる。
[http://kesin.hatenablog.com/entry/20120915/1347726989](http://kesin.hatenablog.com/entry/20120915/1347726989)
N進数の復習（10進数との変換、負数の表現）

#N進数の小数と10進数の小数の変換
**10進数(整数) -> N進数(整数)**
10進数をNで割り続けて、 余りを下から読むとN進数

**10進数(小数) -> N進数(小数)**
10進数にNを掛け続けて、整数部分を順に読むとN進数

**N進数 -> 10進数**
N進数の各桁の数字にN^(桁数)を掛けてあげる

##プログラム上では...
例えば10進数の0.3は、
2進数で表すと循環小数になってしまうため、
有限なメモリを使う以上は、
その部分で誤差が生じてしまう。
(JavaではBigDecimal型なら誤差が生じない)

#負数の表現(8桁の2進数を例に)
**a. 符号付き絶対値表現**
2進数の場合、最も大きな位が0なら+、1なら-。
それ以降の7桁が絶対値を示す。
01111111 = +127 ~ 11111111 = -127
00000000 = +0, 10000000 = -0 で重複。

**b. 1の補数**
ある数 + その数の1の補数 = 11111111
として、それらを10進数に変換した際、
ある数(10) + 1の補数(10) = 0
となるように、1の補数と負数を対応づける。
00000000 = +127 ~ 11111111 = -127
01111111 = +0, 10000000 = -0 で重複。

**c. 2の補数(完全補数)**
ある数 + その数の2の補数 = 100000000(9桁)
として、それらを10進数に変換した際、
ある数(10) + 2の補数(10) = 0
となるように、1の補数と負数を対応づける。
01111111 = +127 ~ 10000000 = -128
00000000 = 0 と１つに定まるので、
a, bに比べ、表現できる数が１つ増える。
(Javaのbyte型はこの例と同じ)
dd()で返ってくるEloquentの値


Eloquentを使ってDBの値を取得、`dd()`で表示してみた。

#DB

テーブルの名前は`account`。
項目は`id` `accountcode` `mail` `name` `createddate`。

#Eloquent

名前は`Account`。

```
<?php

namespace App\Http\Model;

use Illuminate\Database\Eloquent\Model;
class Account extends Model
{
    protected $table = 'account';

}
```

#Controller

名前は`AccountController`。
中身は以下のとおり。

```
<?php

namespace App\Http\Controllers;

use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use App\Http\Model\Account;
use Carbon\Carbon;

class AccountController extends Controller
{
    protected $request;

    public function __construct(
        Request $request
    ){
        $this->request = $request;
    }

    public function getAccountList() {
        $accounts = Account::orderBy("accountcode__c", "asc")->get();
        dd($accounts);
        return view('list');
    }
}
```

#ビュー
名前は`list.blade.php`。
Collectionという配列みたいな感じで返ってきます。

```
Collection {#265 ▼
  #items: array:7 [▼
    0 => Account {#266 ▶}
    1 => Account {#267 ▶}
    2 => Account {#268 ▶}
    3 => Account {#269 ▶}
    4 => Account {#270 ▶}
    5 => Account {#271 ▶}
    6 => Account {#272 ▶}
  ]
}
```

テストデータでアカウントは７つ入っていたのでOK。
一つめを開いてみると

```
Collection {#265 ▼
  #items: array:7 [▼
    0 => Account {#266 ▼
      #table: "account"
      #connection: null
      #primaryKey: "id"
      #perPage: 15
      +incrementing: true
      +timestamps: true
      #attributes: array:23 [▶]
      #original: array:23 [▶]
      #relations: []
      #hidden: []
      #visible: []
      #appends: []
      #fillable: []
      #guarded: array:1 [▶]
      #dates: []
      #dateFormat: null
      #casts: []
      #touches: []
      #observables: []
      #with: []
      #morphClass: null
      +exists: true
      +wasRecentlyCreated: false
    }
    1 => Account {#267 ▶}
    2 => Account {#268 ▶}
    3 => Account {#269 ▶}
    4 => Account {#270 ▶}
    5 => Account {#271 ▶}
    6 => Account {#272 ▶}
  ]
}
```

で、この中の`#attributes`の中にテーブル値が入ってる。

```
Collection {#265 ▼
  #items: array:7 [▼
    0 => Account {#266 ▼
      #table: "account"
      #connection: null
      #primaryKey: "id"
      #perPage: 15
      +incrementing: true
      +timestamps: true
      #attributes: array:23 [▼
　      "id" => 5
        "accountcode__c" => "100"
        "mail" => "test@tmail.com"
        "name" => "テスト"
        "createddate" => "2016-04-06 01:00:13"
      ]
      #original: array:23 [▶]
      #relations: []
      #hidden: []
      #visible: []
      #appends: []
      #fillable: []
      #guarded: array:1 [▶]
      #dates: []
      #dateFormat: null
      #casts: []
      #touches: []
      #observables: []
      #with: []
      #morphClass: null
      +exists: true
      +wasRecentlyCreated: false
    }
    1 => Account {#267 ▶}
    2 => Account {#268 ▶}
    3 => Account {#269 ▶}
    4 => Account {#270 ▶}
    5 => Account {#271 ▶}
    6 => Account {#272 ▶}
  ]
}
```
AndroidStudioでデバッグ中に変数が見れなくなった際の対処方法

#問題
Android Studioでデバッグ中に値が見える変数と見えない変数が混在する。

#対処方法
テストカバレッジを出力する設定をOFFにする

```java:変更前
buildTypes {
    debug {
        testCoverageEnabled = true
    }
}
```

```java:変更後
buildTypes {
    debug {
        testCoverageEnabled = false
    }
}
```
#参考
[Issue 78045:	Debugger stop working when using testCoverageEnabled = true (Cannot find local variable)](https://code.google.com/p/android/issues/detail?id=78045)
EspressoでSeekBarを操作する方法

#やりたいこと
SeekBarのプログレスを任意に設定し、OnSeekBarChangeListenerを発生させる。

```
onProgressChanged(SeekBar seekBar, int progress, boolean fromUser);
onStartTrackingTouch(SeekBar seekBar);
onStopTrackingTouch(SeekBar seekBar);
```
#ハマったこと
```
SeekBar.setProgress(int progress);
```
setProgressではOnSeekBarChangeListenerが発生しない。

#解決方法
新たにSeekBar操作用のViewActionを定義する。

```
onView(isAssignableFrom(SeekBar.class)).perform(clickSeekBar(i));
```

```
public static ViewAction clickSeekBar(final int pos) {
    return new GeneralClickAction(
            Tap.SINGLE,
            new CoordinatesProvider() {
                @Override
                public float[] calculateCoordinates(View view) {
                    SeekBar seekBar = (SeekBar) view;
                    final int[] screenPos = new int[2];
                    seekBar.getLocationOnScreen(screenPos);

                    int trueWidth = seekBar.getWidth()
                            - seekBar.getPaddingLeft() - seekBar.getPaddingRight();

                    float relativePos = (0.3f + pos) / (float) seekBar.getMax();
                    if (relativePos > 1.0f)
                        relativePos = 1.0f;

                    final float screenX = trueWidth * relativePos + screenPos[0]
                            + seekBar.getPaddingLeft();
                    final float screenY = seekBar.getHeight() / 2f + screenPos[1];
                    float[] coordinates = {screenX, screenY};

                    return coordinates;
                }
            },
            Press.FINGER);
}
```
無印良品の鳩時計を黙らせる電子工作


* 無印の鳩時計を買った
* かわいくて基本的に気に入っている
* 鳴き声もかわいいが、こんな感じで時間の数だけ鳴くから、12時には 12回鳴く

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">無印の鳩時計 <a href="https://t.co/AgaWGZfLl8">https://t.co/AgaWGZfLl8</a></p>&mdash; まさるんこ (@masarunco) <a href="https://twitter.com/masarunco/status/734987236479926273">2016年5月24日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

* つまり夜のくつろいでる時間ほどよく鳴く
* 普段はいいけど、夜中に一人でリビングにいる時に鳴かれるとビクッとなる
* 黙らせたい

## 黙らせた

ハトは許可された時間内であれば鳴いても良い

### 黙らせ方
<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">鳩の口をふさぐ <a href="https://t.co/jmyFn5PHgY">https://t.co/jmyFn5PHgY</a></p>&mdash; まさるんこ (@masarunco) <a href="https://twitter.com/masarunco/status/734987156234477568">2016年5月24日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

* 吸気口からいい感じに空気を吸って鳴いているようだ
* 電子音じゃないのがまたすばらしい
* この吸気口を塞ぐとハトは相変わらず元気に飛び出してくるが、鳴かなくなる
* サーボモータに割り箸で作った吸気口を塞ぐリンク機構を付けて指定時間に自動で開閉するようにした

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">鳩を黙らせるためのリンク機構 <a href="https://t.co/lapxlZUV4Y">https://t.co/lapxlZUV4Y</a></p>&mdash; まさるんこ (@masarunco) <a href="https://twitter.com/masarunco/status/734987057756413953">2016年5月24日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

### 構成
* RTC: DS1307
* マイクロサーボ: SG92R
* Arduino Duemilanove (押入れから出てきたやつ)

RTC モジュールから時間を取得、指定時間になったらサーボモータを動かして吸気口を塞ぐ



### 動作の様子
<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">鳩ぐつわ動作の様子 <a href="https://t.co/5G2T83oUSy">https://t.co/5G2T83oUSy</a></p>&mdash; まさるんこ (@masarunco) <a href="https://twitter.com/masarunco/status/734986568025276416">2016年5月24日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

### ソース
https://github.com/pm11op/shutUpPigeon

鳴いても良い時間を指定して Arduino に書き込めば OK

## 今回できなかったこと
* 光センサー対応
 * この鳩時計には光センサーが付いている
 * 光センサーに回路を挟んで、指定した時間以外は常に偽の値が流れるようにすればもうちょっとスマートになりそう
 * 初めての電子工作で鳩時計壊すの嫌だったからやってない
* RTC のアラーム対応
 * 適当に買った RTC モジュールにアラーム機能が付いてなかった
 * アラーム使用すればもうちょっと電力の節約になりそう
【質問】ペッパーの音声認識について

音声認識で質問です。

u:({＊}[なわとび]{＊})ピョンピョン
u:({＊}[ドア]{＊})指をはさまないようにねっ！
u:({＊}[ゴミ箱]{＊})こちらですよっ！

上記のように入力し、接続したところ言葉通り返答してくれるのですが、
色んな言葉に反応してしまいます。（「こんにちは」→ピョンピョン　「ペッパー」→指をはさまないようにねっ！　など）
Speech Reco.のように音声認識の数値設定ができるコマンドなどがあれば教えていただけると幸いです。
EspressoでListViewのitem内にあるviewを選択する方法

ListView(R.id.listview)の0行目のButton(R.id.button)を選択する。

```
onData(anything()).inAdapterView(withId(R.id.listview))
        .atPosition(0)
        .onChildView(withId(R.id.button))
        .perform(click());
```
No Flashでクリップボードにコピーできるclipboard.jsのメモ


遊びで無駄にコピーできるものを作ったのでそのメモ。

##clipboard.jsの使い方

公式サイト
https://clipboardjs.com/

使い方は公式サイトに載っていますが、
GithubにDEMOがあったので、それを見たほうが分かりやすかったです。
https://github.com/zenorocha/clipboard.js/tree/master/demo

###npmでインストール

```ターミナル
npm install clipboard --save-dev
```

###インストールしてきたファイルにdistフォルダがあるので、そこから読み込み

```
<script src="dist/clipboard.min.js"></script>
```

###記述

ライブラリを最初に使い方をみるのは、
DEMOの通りに書いてみるのが鉄則なので、DEMOの通りに
HTML→clipboard.min.js読み込み→script
の順で記述したらうまくいきました。以下完成形。

```
<body>
<input id="foo" type="text" value="hello">
<button class="btn" data-clipboard-action="copy" data-clipboard-target="#foo">Copy</button>
	
<script src="node_modules/clipboard/dist/clipboard.min.js"></script>
<script>
	var clipboard = new Clipboard('.btn');
	clipboard.on('success', function(e) {
		console.log(e);
	});
	clipboard.on('error', function(e) {
		console.log(e);
	});
</script>
</body>

```

上記完成形を細かく分けると...

コピーしたいテキストのinputタグにID=fooを設定して、

```
<input id="foo" type="text" value="hello">
```

クリックする<button>タグに
var clipboard = new Clipboard('.btn');
で設定したclass="btn"を設定

```
<button class="btn">Copy</button>
```


data-clipboard-action属性でcopyするかcutするかを選んで設定して、

```
data-clipboard-action="copy"
data-clipboard-action="cut"
```

data-clipboard-target属性でコピーしたいinputタグのid名fooを指定する。

```
data-clipboard-target="#foo"
```


---------------------------------------

:octocat: Github Pageにこれを使ったものをアップしてみました。

Markdownコピペ（Qiita用）
http://sararilfy.github.io/qiita-markdown-copy-paste/

リンクをクリックすると、Qiitaのマークダウン記法がコピペできます。
遊びで作ったのでデザインがまだ。。。
JavaScriptの論理OR、論理ANDの特性、便利な応用方法

# 初めに
JavaScriptでは論理OR(||)、論理AND(&&)を用いた時に、その式が返す値は真偽値ではなく、その評価された値自身が返される特性があります。
どういうことか実際に見てみましょう。

```js
"left" || "center" || "right"
// left

"left" && "center" && "right"
// right
```

```js
0 || "" || "last"
// last

0 && "" && "last"
// 0

```

論理ORはtrueと評価される値が無い場合は最後の値を返し、trueと評価される値がある場合は最初にtrueと評価された値を返します。
それに対して、論理ANDはfalseと評価される値が無い場合は最後の値を返し、falseと評価される値がある場合は最初にfalseと評価された値を返します。
全て左の値から評価されていき、値が返された時点で、それよりも右の式は評価されません。
また、**真偽値ではなく値**が返されます。

# この特性を利用する
この特性を利用すると以下のようなことが簡単に書くことができます。

- 変数への初期値の設定
- ある条件のときに関数、メソッドの実行

## 変数への初期値の設定
変数に初期値を設定する時に論理ORを使うと便利です。
優先順位の高いものから左に配置していき、最後に全ての変数に値がなかった場合に設定する初期値を書くことで、確実にその変数に値を入れることができます。

```js
var a, b, c = 1;

var x = a || b || 0; // 0
var y = c || 0; // 1
```
上記のコードの場合、xはa、b、と左から評価していますがどちらもundefinedなためfalseと判断され、最後の0が代入されます。
0はfalseと判断されますが、最後の値のため、そのまま値が返されます。
yはcが1でtrueと評価される値のため、そのまま1が代入されます。
※評価する式の値が0だった場合、0はfalseとして評価されるため右の式を評価していくことになるので注意


## ある条件のときに関数、メソッドの実行
左側の条件を満たす時に、関数やメソッドの実行を行うことができます。
左の式が評価された場合のみ、その右側の式が評価されます。

```js
var a = "aaa";

a === "aaa" && alert("aはaaaですよ！");
```
上記のコードの場合、aは"aaa"なのでtrueと評価され、右側の式が評価され、alertが実行されます。

これを応用すると以下のようなコードも簡単に書けます。

```js
// どちらも同じ動き
if (a === b) {
    alert("aとbは同じ");
}

a === b && alert("aとbは同じ");
```

# 最後に
知らないと、コードの意味を全く汲み取れないですが、応用させることによってコードが簡潔に見やすいものにすることができます。
積極的に使っていきましょう。