OmniAICreator/Qiita-1.07M huggingface dataset:
VBAでファイルの読み込みとシート数の取得のサンプル

自分でよく使用する書き方のメモ

```vbnet:VBA
Sub main()
    Set st = ActiveSheet
    row_max = st.Range("a1").SpecialCells(xlLastCell).Row

    ' 2行目から処理を開始する
    For i = 2 To row_max
        Application.ScreenUpdating = False

        ' 処理済みの判断
        If st.Range("A" & i) <> 1 Then
            GoTo Continue:
        End If

        ' Excelを開く
        Set wb = Workbooks.Open(st.Range("B" & i))
        wb.Close SaveChanges:=False

        ' 完了済み
        st.Range("A" & i) = 0

        Application.ScreenUpdating = False
Continue:
        ActiveWindow.ScrollRow = i
        ActiveWindow.ScrollColumn = 1
    Next i
End Sub

```
homebrewインストール時にリンクが貼られない問題

2016/03/1追記
---
- homebrewは推奨通りにインストールするとusr/localを利用する
- usr/localに管理者権限でインストールを行おうとするため権限の問題でリンクを貼れないことがあるとのこと

以下の設定を行って解決した
```
sudo chmod -R 777 /usr/local/
```

参考
[homebrewインストールができない](http://qiita.com/eXegatya/items/63238b15ec34ac954722)

追記ここまで

---

macのhomebrewでwgetをインストールしようとしたところエラーに

```
Error: The `brew link` step did not complete successfully
The formula built, but is not symlinked into /usr/local
Could not symlink share/info/wget.info
/usr/local/share/info is not writable.

You can try again using:
  brew link wget
```
以下ディレクトリにおいてパーミッションがないことが原因
```
/usr/local/share/info
```
該当ディレクトリの権限を変更し、再度インストールしたところ成功した
-Rオプションをつけることで再帰的にパーミッションの変更が可能

```
chmod -R 755 /usr/local/share/info
brew link wget
Linking /usr/local/Cellar/wget/1.17.1... 3 symlinks created
```
### 参考
[Linux：chmodでファイル、ディレクトリのパーミッションを変更](http://raining.bear-life.com/linux/chmod%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%80%81%E3%83%87%E3%82%A3%E3%83%AC%E3%82%AF%E3%83%88%E3%83%AA%E3%81%AE%E3%83%91%E3%83%BC%E3%83%9F%E3%83%83%E3%82%B7%E3%83%A7%E3%83%B3%E5%A4%89%E6%9B%B4)
[UNIX入門 > Linuxコマンド一覧 > chmod](http://www.k4.dion.ne.jp/~mms/unix/linux_com/chmod.html)
PHP & Phake で同一メソッドが異なる引数で複数回呼び出されるケースをテストする方法

例えば API を呼び出すメソッドをテストするケースなど、同一メソッドを異なる引数で複数回呼び出したい場合。PHP の OSS のモックフレームワークの [Phake](https://github.com/mlively/Phake) で実現する方法を説明します。


# 説明の前提条件
- モックを適用する対象は、`API`クラスの`request()`メソッドとします。
- `request()`メソッドの引数には、任意の値を指定できることとします。


# 1. メソッドの戻り値を、呼び出し毎に変更する
`thenReturn()`メソッドを連続して呼び出すことで、実現することができます。

```php
$mock = Phake::mock('API');

// 引数が毎回異なる前提なので、Phake::anyParameters() メソッドを使用しています。
// また、戻り値の変数 $return1-3 は、予め定義してあるものとします。
Phake::when($mock)->request(Phake::anyParameters())
    ->thenReturn($return1)
    ->thenReturn($return2)
    ->thenReturn($return3);

// request() メソッドがキチンと3回呼び出せていることの検証です。
Phake::verify($mock, Phake::times(3))->request(Phake::anyParameters());
```



# 2. メソッドの引数を検証する
`Phake::capture()`メソッドを呼び出すことで、実現することができます。

```php
// Phake::capture() の引数 $params に、メソッドの引数が配列でセットされます。
Phake::verify($mock)->request(Phake::capture($params));

// １回目の呼び出し時の引数を取得・検証する例です。
$param1 = $params[0];
$this->assertEquals('foo', $param1);
```


# 参考資料
- [Phake の GitHub リポジトリ](https://github.com/mlively/Phake)
- [Phake の公式ドキュメント（英語）](http://phake.readthedocs.org/en/latest/)
- [Phake.php](https://github.com/mlively/Phake/blob/master/src/Phake.php)
 - Phake の提供しているメソッド一覧を調べたい場合にどうぞ。
- [PhakeTest.php](https://github.com/mlively/Phake/blob/master/tests/PhakeTest.php)
 - 公式ドキュメントだけでは分かりづらい、Phake の提供しているメソッドの具体的な使い方が提示されているため、非常に有益です。
Java+TomcatでのWebアプリケーション開発環境構築の流れ

Java SE 8とTomcat 8をインストールしてWeb開発環境を構築するまでの流れ（メモ）。

#Javaのインストール
最新版（2015/03/19時点）のJava SE 8をインストールする。

まずは、作業ディレクトリに移動。

```
$ cd /usr/local/src
```

Java SEダウンロードページよりダウンロードするrpmのリンクをコピー。
（右クリックの「リンクのアドレス先をコピー」でOK）

http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
<img width="1364" alt="スクリーンショット 2016-03-19 12.45.11.png" src="https://qiita-image-store.s3.amazonaws.com/0/70681/e040c0c1-5f42-be4b-2b07-0a4798ad3e53.png">

wgetを使ってrpmをダウンロード。

```
$ wget --no-check-certificate --no-cookies - --header "Cookie: oraclelicense=accept-securebackup-cookie" http://download.oracle.com/otn-pub/java/jdk/8u73-b02/jdk-8u73-linux-x64.rpm
```

rpmコマンドでインストール。

```
$ rpm -ivh jdk-8u73-linux-x64.rpm
```

javaコマンドでインストールされていることを確認し、完了。

```
$ java -version
java version "1.8.0_73"
Java(TM) SE Runtime Environment (build 1.8.0_73-b02)
Java HotSpot(TM) 64-Bit Server VM (build 25.73-b02, mixed mode)
```

#Tomcatのインストール

Tomcatのページより同じくtar.gzファイルのアドレスをコピー。
（記事執筆当時で8.0.32が最新）

http://tomcat.apache.org/download-80.cgi
<img width="1365" alt="スクリーンショット 2016-03-19 12.47.22.png" src="https://qiita-image-store.s3.amazonaws.com/0/70681/a133cab0-0bdd-ac6b-89ed-5a06a2e252ca.png">

前述、javaと同じくwgetでファイルを取得。

```
$ wget http://ftp.yz.yamagata-u.ac.jp/pub/network/apache/tomcat/tomcat-8/v8.0.32/bin/apache-tomcat-8.0.32.tar.gz
```

解凍（いつもの）。

```
$ tar -xvzf apache-tomcat-8.0.32.tar.gz
```

Tomcatのファイルを配置するディレクトリを/opt以下に作成し、移動。

```
$ mkdir /opt/tomcat
$ mv apache-tomcat-8.0.32 /opt/tomcat
```

ユーザ環境設定ファイルの修正。
（下記三行を追加でOK）

```
$ vi /etc/profile
JRE_HOME=/usr/java/default
CATALINA_HOME=/opt/tomcat/apache-tomcat-8.0.32
export JRE_HOME CATALINA_HOME
```

Tomcatを起動。

```
$ /opt/tomcat/apache-tomcat-8.0.32/bin/startup.sh 
Using CATALINA_BASE:   /opt/tomcat/apache-tomcat-8.0.32
Using CATALINA_HOME:   /opt/tomcat/apache-tomcat-8.0.32
Using CATALINA_TMPDIR: /opt/tomcat/apache-tomcat-8.0.32/temp
Using JRE_HOME:        /usr/java/default
Using CLASSPATH:       /opt/tomcat/apache-tomcat-8.0.32/bin/bootstrap.jar:/opt/tomcat/apache-tomcat-8.0.32/bin/tomcat-juli.jar
Tomcat started.
```

ブラウザよりポート8080を指定し、下掲画面が表示されれば完了。
とても簡単。

http://localhost:8080/
<img width="1363" alt="スクリーンショット 2016-03-19 12.55.28.png" src="https://qiita-image-store.s3.amazonaws.com/0/70681/44aedc49-40de-0091-510f-488591528833.png">
CodeIgniterメモ

OracleのQuery発行問題
CodeIgniterのoci8のDBドライバは、テーブル名やカラム名にダブルクォートで囲む。
DB_driver.phpの
$_escape_char='"'
を
$_escape_char=''に直す。

index.phpをなくす
httpd.confのmodule_rewriteをアンコメント
htdocsの下に.htaccessを作成
httpd.confのAllowOverride Allを設定

logが出力されないのはapplication/logフォルダの権限の問題

CodeIgniterには開発中に便利なデバッグ機能として
出力クラスに「アプリケーションのプロファイリング」結果を出力する機能があります。
やり方はcontrollerクラス内に下記の一文を追記するだけ。
$this->output->enable_profiler(TRUE);
ActiveDirectoryの日本語ユーザ名(DisplayName)をRailsのDeviseで扱う

GYAOの窓際エンジニア　玉利です。

弊社、いままで独自のログオンシステムをつかっており、ActiveDirectoryに関するノウハウがありません。こんなADがらみの仕事をしているのは社内システムの人だけなので、製品開発側の組織の私は毎回地雷を踏むのがお仕事です。

今週は、ちょうどベトナムで作業してました。日本側のユーザーインタビューは日本にいるベテランNさんにお任せです。

私「Nさん、今度のシステム、名前は社内のログイン名でいいですよねー」
Nさん「今使ってる入稿のほうもログイン名だから、いいんじゃないっすかー？」
私「りょーかいっす、前例どおりで」

半日後

Nさん「やっぱり、企画サイドから名前を日本語にしてと言われてしまいました」
私「えー、めんどくさい。。。。言う方は簡単だけどさ。。。。社内的にだれもやってないじゃん」

仕方ないので、資料をあたってみました。コードを製造するのはベトナム人なので、やりかたをこちらであたりを付けてあげるのが私の仕事です。自分で書いたほうが早いとか言ったら、その担当者はインドかベトナム送りにしてあげます。

# Deviseだったら日本語名は結構簡単

調べていたら、DisplayNameというパラメーターに日本語の名前が格納されている感じがしました。弊社だけでなくて他所の会社もたぶんここにお名前を入れてるのではないでしょうか？

チケットをこんなふうに書きました。

```
**[Add] Please show User's JapaneseName(DisplayName) ユーザの日本語化対応** 

Please add User.display_name column.
We will add/store Japanese name here

We try to get ActiveDirectory's DisplayName and set here

https://github.com/cschiewek/devise_ldap_authenticatable
```


# DeviseでLDAP:DisplayNameを拾う

出てきたコードがこちらです。

```
# User Model
class User < ActiveRecord::Base
  before_save :ldap_email, :ldap_display_name

  # Include default devise modules. Others available are:
  # :confirmable, :lockable, :timeoutable and :omniauthable
  devise :ldap_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable # , :validatable

#中略

  private

  def ldap_email
    ldap_email = Devise::LDAP::Adapter.get_ldap_param(username, 'mail')
    self.email = ldap_email.first unless ldap_email.nil?
  end

  def ldap_display_name
    ldap_display_name = Devise::LDAP::Adapter.get_ldap_param(username, 'displayname')
    self.display_name = ldap_display_name.first.force_encoding('UTF-8') unless ldap_display_name.nil?
  end
end
```

これで、User.display_nameに日本語の社員名が自動で拾えるようになりました。Railsで業務アプリを作ってる例ってあんまり出てないと思うので、皆様のお役にたてればと思います。

このコードとI18Nの仕組みがあれば、海外オフショアでも普通に日本語ビジネスアプリの開発ができますね。
Sigil - コマンドラインベースのテンプレートエンジン

# Sigil
https://github.com/gliderlabs/sigil

環境変数を元に設定ファイルを展開してくれるツールないかなと思って調べてて見つけた。
Docker で使うなら Entrykit も便利（Entrykit 内で Sigil を使ってる）。

インストール
　ダウンロードする
　解凍する
　パスの通った場所に置く

使い方
　export WORKER_PROCESSES=123
　sigil -p -f nginx.conf.tmpl > nginx.conf

テンプレートの書き方
　必須
　　{{ ${WORKER_PROCESSES:?} }};
　デフォルト値
　　{{ ${WORKER_PROCESSES:-“default"} }};
　　{{ var "DEMO" | default "demo" }}
　if 文
　　export IS_OUTPUT=True
　　{{ if var "IS_OUTPUT" }} a {{ end }}
　　※ if 文は値が存在するかのみ判定できます。== 演算子などは使えません
デスクネッツNEOからの「スケジュール予約状況」メールからGoogleカレンダーにイベントを登録する「なでしこ」のソース

## きっかけ

　desknet's NEOでは、自分を含む予定が登録されるとメールで通知が届く。グループウェアのカレンダーはセキュリティポリシーのため社内でしか見られないので、個人のカレンダー（Google Calendar）に登録するのを手動でやっていたが、結構頻度が有るので自動化しようとした。
　WSH も試したが、日本語プログラミング言語「なでしこ」が、結構強力で簡単に記述することができたので、それを紹介する。

## 「スケジュール予約状況案内」メールについて
　グループウェアの「desknet's NEO」では、打合せの予約などで自分以外の人が、自分のスケジュールに予定を登録することができ、その際、メール通知をするように設定しておくと、自分宛てのメールとしてその内容が通知されます。

　そのメール本文は次のような内容になっています。
> 下記の内容で予定を追加しました。
> 
> 日付：2016/03/dd 10:00 ～ 2016/03/dd 11:00
> 登録日：2016/03/xx
> 登録者：((予定を登録した人の名前))
> 登録先：((予定が登録された人の羅列))
> 予定：((予定の件名))
> 場所：--((未記入だと--になる))
> 利用設備：((会議室等の名前。未記入は--))
> 内容：((コメント。未記入はブランク))

## ソースコードの説明

　メール本文から必要な情報を抜き出して、それぞれの変数に形式を合わせてセットするソースコード。

　メール本文のデータを「なでしこ」に渡す方法は、メール本文をクリップボードにコピーして行っている。

　GoogleCalendar用のURLスキームも参考にどうぞ。

## 「なでしこ」のソース

```なでしこ:setGoogleCal.naco
クリップボード取得
それを反復
	一時はそれ
	もし、一時から3文字左部分が「日付：」ならば
		開始日時は一時の4から16文字抜き出す
		開始日時は開始日時の「 」を「T」に置換
		開始日時は開始日時の「/」を「」に置換
		開始日時は開始日時の「:」を「」に置換
		終了日時は一時の16文字右部分
		終了日時は終了日時の「 」を「T」に置換
		終了日時は終了日時の「/」を「」に置換
		終了日時は終了日時の「:」を「」に置換
	もし、一時から3文字左部分が「予定：」ならば
		予定は一時の4から100文字抜き出す
	もし、一時から3文字左部分が「場所：」ならば
		もし、一時の4から2文字抜き出すが「--」でないならば
			場所は一時の4から100文字抜き出す。
	もし、一時から5文字左部分が「利用設備：」ならば
		もし、一時の6から2文字抜き出すが「--」でないならば
			場所は一時の6から100文字抜き出す。

URLヘッダは「http://www.google.com/calendar/event?action=TEMPLATE&src=」

# 　↓登録先GoogleカレンダーのURLをセット
URLカレンダーは「<ここは自分が登録したいカレンダー固有のもの>@group.calendar.google.com」

# メールソフトの日本語はSJISなので、UTF8に変換し更にURLエンコードする
URL予定は「&text=｛（予定をSJIS_UTF8N変換）をURLエンコード｝」

# 開始日時・終了日時は「yyyymmddThhmmss/yyyymmddThhmmss」
# メールで通知される日時は秒を含まないので、「00」を付加する
URL日時は「&dates=｛開始日時}00/{終了日時}00」
URL場所は「&location=｛（場所をSJIS_UTF8N変換）をURLエンコード｝」

# 揃ったデータを一行にまとめてURLスキームを完成する
URL全体はURLヘッダ&URLカレンダー&URL予定&URL日時&URL場所

# URLスキームでブラウザを開く
URL全体を起動

```
AWSのELBとNginxでhttpアクセスをhttpsにリダイレクトしたい

# はじめに
ELB上でSSL証明書の設定をしている状態で、http(80)で来たアクセスをhttps(443)に転送したい話しです。

# 困った事
httpsでサービスを展開したいので、httpアクセスはhttpsにリダイレクトしようと思って、[こちら](http://qiita.com/kga/items/e30d668ec1ac5e30025b)を参考にNginxのconfに`` return 301 https://$host$request_uri;``を書いてみました。

しかし、ELBで443を80に転送される設定がある状態でこれを書くと、当たり前の話しですがリダイレクトループが発生します。

**状況として**
①80で待ってるNginxにアクセスが来る
②``return``の設定に従ってhttps(443)に転送 (つまりELBに戻る)
③また①に戻る
これが繰り返されます

# やった事
ELBでリダイレクトされると``X-Forwarded-Proto``というヘッダーを持ってNginxに到達します。

例

```
X-Forwarded-Proto: https
```

詳細はこちら↓
[Elastic Load Balancing の X-Forwarded ヘッダーの詳細](http://docs.aws.amazon.com/ja_jp/ElasticLoadBalancing/latest/DeveloperGuide/x-forwarded-headers.html#x-forwarded-proto)

これを使ってhttpかhttpsか？を判断して、httpの時だけリダイレクトするようにしました。

```
server {
    listen       *:80;
    server_name  aaa.com;
    root   /var/www/;
    index  index.php index.html;

    # ここの部分で判定！！
    if ($http_x_forwarded_proto != https) {
      return 301 https://$host$request_uri;
    }
}
```
Googleカレンダー、カレンダーアプリにイベントを登録する AppleScript

## きっかけ
 グループウェアで、自分を含む予定が登録されるとメールで通知が届く。グループウェアのカレンダーはセキュリティポリシーのため社内でしか見られないので、個人のカレンダー（Google Calendar や OS X のカレンダーアプリ）に登録するのを手動でやっていたが、結構頻度が有るので自動化しようと、AppleScriptを書いた。

## スクリプトの説明
　メール本文から必要な情報を抜き出して、それぞれの変数に形式を合わせてセットする。<br>
　メール本文のデータをスクリプトに渡す方法は、クリップボードにコピーして行っているが、メールの形態はグループウェア毎に違うので、ここでは紹介しない。　参考として、ソースの冒頭のコメントで変数名とデータ形式を書いておく。

## Googleカレンダーに登録するソース
　Googleカレンダーには、標準のブラウザを使って直接Googleカレンダーのイベント登録画面を表示して入力フィールドにデータをセットするスクリプト。

```AppleScript:SetGoogleCal.scpt
-- Googleカレンダーにイベントを登録する AppleScript
-- イベント名： Summ （SJIS）
-- 場所： Loc (SJIS)
-- 開始時刻と終了時刻：Datetime (yyyymmddThhmmss/yyyymmddThhmmss）
--
on urlEncode(inData) -- URLエンコード（%エンコード）
    -- 文字コードを utf8 としてエンコードしたい場合は、「as «class utf8»」で変換したものを渡すこと。
    set scpt to "php -r 'echo rawurlencode(" & quote & inData & quote & ");'"
    return (do shell script scpt) as string
end urlEncode

set escSumm to urlEncode(Summ as «class utf8»)
set escLoc to urlEncode(Loc as «class utf8»)
set CalURL to "http://www.google.com/calendar/event?action=TEMPLATE&src="
set CalURL to CalURL & "＜＜登録するカレンダーID＞＞@group.calendar.google.com"
set CalURL to CalURL & "&text=" & escSumm
set CalURL to CalURL & "&dates=" & Datetime
set CalURL to CalURL & "&location=" & escLoc
open location CalURL

```

## カレンダーアプリ（Calendar）に登録するアプリ
　カレンダーアプリにイベントを登録して、そのウインドウを表に表示するスクリプト。

```applescript:SetCal.scpt
-- イベント名： Summ （SJIS）
-- 場所： Loc (SJIS)
-- 開始時刻：sDate (yyyy/mm/dd hh:mm:ss）
-- 終了時刻：eDate (yyyy/mm/dd hh:mm:ss）
--
set sDate to date sDate -- 日時データの文字列（yyyy/mm/dd hh:mm:ss）を dateクラスに変換
set eDate to date eDate
tell application "Calendar"
    set newEvent to make new event at end of events of calendar "＜＜登録するカレンダーの名前＞＞" with properties {summary:Summ, location:Loc, start date:sDate, end date:eDate}
    activate
end tell

```
ファイヤーウォールを設定する

## インストール&設定前の準備

```
$ apt-get install ufw
$ ufw status
```

ファイヤーウォールを有効にする。
SSHで接続している場合は以下のメッセージが出るので有効にする。

```
$ ufw enable
```

> Command may disrupt existing ssh connections. Proceed with operation (y|n)?

ファイヤーウォールを無効にして設定をリセットする

```
$ ufw disable
$ ufw reset
```

> Resetting all rules to installed defaults. This may disrupt existing ssh
connections. Proceed with operation (y|n)?

---
## ファイヤーウォール設定例
以下の順で設定
1. 外部からの接続をすべて受け付けない
2. 必要なポートだけを許可する

```
$ ufw default deny
$ ufw allow proto tcp from 192.168.10.0/24 to any port 22
$ ufw allow 80
$ ufw enable
```

状態を確認

```
$ ufw status
```

> Status: active
>   
> To                         Action      From
> 
> 22/tcp                     ALLOW       192.168.10.0/24
> 8080                       ALLOW       Anywhere
> 80                         ALLOW       Anywhere
dockerで立ち上げたアプリケーションにアクセスできない

久々にdockerを触ると毎回やってしまうウッカリがあるので、自戒のためメモ。

まずは試しにnginxを立ち上げる。

```
$ docker run -dit -p 8080:80 nginx
Unable to find image 'nginx:latest' locally
latest: Pulling from library/nginx
fdd5d7827f33: Pull complete
a3ed95caeb02: Pull complete
716f7a5f3082: Pull complete
7b10f03a0309: Pull complete
Digest: sha256:f6a001272d5d324c4c9f3f183e1b69e9e0ff12debeb7a092730d638c33e0de3e
Status: Downloaded newer image for nginx:latest
d601ae7d19e3c643b6c0806347b717557fc2da98dcd82968a870247f82fea370
```

その後、URL http://localhost:8080 にアクセス...
しようとしたものの、ブラウザには ```このサイトにアクセスできません``` という表示が。。。

そういえば、dockerのアドレスにアクセスしないといけないんだった。
ということで、以下のコマンドのどれかでIPを確認。

```
$ docker-machine env
export DOCKER_TLS_VERIFY="1"
export DOCKER_HOST="tcp://192.168.99.100:2376"
export DOCKER_CERT_PATH="/Users/yukofeb/.docker/machine/machines/default"
export DOCKER_MACHINE_NAME="default"
# Run this command to configure your shell:
# eval $(docker-machine env)

$ docker-machine ip
192.168.99.100

$ echo $DOCKER_HOST
tcp://192.168.99.100:2376
```

ということで、 http://192.168.99.100:8080 で無事に表示される。
考えてみれば当たり前だけど、毎回やってしまうので気をつけよう。
Elixir v1.2.2 ではdialyzerが動かないらしいぞ

[ブログ](http://moccosblue.blogspot.jp/)は一応あるんだけども、時限性のあるものはQiitaに残すかーと思い使い始め。

Elixirは(というかErlangは)動的型付けであるものの、静的解析ツールである[dialyzer](http://erlang.org/doc/man/dialyzer.html)である程度チェックができて、[dialyxir](https://github.com/jeremyjh/dialyxir)を使うと手間もいりません。これが、Elixirのバージョンを1.2.2に上げたら動かないことに気づきました。

```
% mix dialyzer.plt
Starting PLT Core Build ... this will take awhile
(略)
dialyzer: Could not get abstract code for file: d:/bin/elixir/lib/elixir/../elixir/ebin/Elixir.String.Graphemes.beam (please recompile it with +debug_info)

** (FunctionClauseError) no function clause matching in Keyword.get/3
    (elixir) lib/keyword.ex:150: Keyword.get(:no_such_file, :files, nil)
    lib/mix/tasks/dialyzer.plt.ex:132: Mix.Tasks.Dialyzer.Plt.core_plt_contains?/2
    lib/mix/tasks/dialyzer.plt.ex:123: anonymous fn/1 in Mix.Tasks.Dialyzer.Plt.missing_apps/0
    (elixir) lib/enum.ex:738: anonymous fn/3 in Enum.filter/2
    (elixir) lib/enum.ex:1473: Enum."-reduce/3-lists^foldl/2-0-"/3
    (elixir) lib/enum.ex:738: Enum.filter/2
    lib/mix/tasks/dialyzer.plt.ex:106: Mix.Tasks.Dialyzer.Plt.need_add?/0
    lib/mix/tasks/dialyzer.plt.ex:57: Mix.Tasks.Dialyzer.Plt.run/1
```

dialyxirのissuesを見に行くと、この問題も挙がっていました( https://github.com/jeremyjh/dialyxir/issues/42 )。dializerの問題ではなく、Elixirの~~(デフォルトの)~~ビルド設定の問題のようで、議論の中で[Elixir本体のissue](https://github.com/elixir-lang/elixir/issues/4250)にリンクされています。"Fixed in master and v1.2 (which will have a new release soon-ish)." で、修正済みとしてclose。

[v1.2.3で直った](https://github.com/elixir-lang/elixir/releases/tag/v1.2.3)ので、このエラーを見てしまった人はバージョン上げましょう。
ホーチミンでオススメの路地裏仕事スペース GEEK Hub

今週1週間はホーチミンで作業でした。朝から晩まで日本側とのブリッジ作業があるので、へろへろです。

ついでに日本側の個人担当作業もあったりして、もちろんそんなのやってるヒマは無いのです。今日は土曜日なので、ようやく自分の仕事ができる時間が取れました。

ホーチミンには「ベトナム人仕事しろよ」と思うほどあちこちにカフェがあります。朝昼晩、ほとんど仕事してないでコーヒーを飲んでる疑惑を持つほどです。そして、だいたいのんびりするためのカフェで、仕事するにはあまり向いてないんですね

今日やってきたのは、GEEK HUBというカフェです。ホーチミン中心部から歩いて20分ほど、タクシーなら一瞬です。

**GEEK Hub**
27B/9 Nguyen Dinh Chieu, Da Kao Ward, District 1
Ho Chi Minh City, Vietnam
+84 93 470 26 08

https://www.facebook.com/GEEKHubVN/

<iframe src="https://www.google.com/maps/embed?pb=!1m18!1m12!1m3!1d3919.3106638503764!2d106.69749799057209!3d10.787501265315594!2m3!1f0!2f0!3f0!3m2!1i1024!2i768!4f13.1!3m3!1m2!1s0x31752f356677fc75%3A0x5b47ded4e83e4216!2zMjcvOCBOZ3V54buFbiDEkMOsbmggQ2hp4buDdSwgxJBhIEthbywgUXXhuq1uIDEsIEjhu5MgQ2jDrSBNaW5oLCDjg5njg4jjg4rjg6A!5e0!3m2!1sja!2sjp!4v1458360934337" width="600" height="450" frameborder="0" style="border:0" allowfullscreen></iframe>


![IMG_0262.JPG](https://qiita-image-store.s3.amazonaws.com/0/113049/d0f0bb31-170c-2245-fcf1-17422b764b63.jpeg)

![IMG_0263.JPG](https://qiita-image-store.s3.amazonaws.com/0/113049/903f1b3b-762c-6e81-cde6-17db5c618ce4.jpeg)


店員までドヤリングしながらカッコつけてますので、仕事するにはもってこいです。電源がしっかり全席用意されてるのがいいですね。

場所は、通りから路地を入った奥のほうにあります。BIA SAIGONの看板のある、さらに右手の路地裏です。
３行で出来るnpmパッケージ公開


自分でつくったhubotスクリプトをnpmで公開してみました。使ったnpmコマンドは３つです。

* npm init
* npm adduser
* npm publish

# npm init

```shell-session
npm init
```

対話形式でpackage.jsonを作ります。

# パッケージ作成

ソースコードはGithubで管理します。npmパッケージ用のレポジトリを作成し、あらかじめ作っていたhubotスクリプトをsrcディレクトリに配置します。

index.coffeeから読み込みます。

```coffeescript:index.coffee
Fs   = require 'fs'
Path = require 'path'

module.exports = (robot) ->
  path = Path.resolve __dirname, 'src'
  Fs.exists path, (exists) ->
    if exists
      for file in Fs.readdirSync(path)
        robot.loadFile path, file
```

```shell-session:directory structure
LICENSE
README.md
index.coffee
package.json
src/[your-script]
```

# npm adduser

[npm](https://www.npmjs.com/)でアカウントを作っておきます。

```shell-session
npm adduser
```

アカウント作成時に入力したユーザー名、パスワード、メールアドレスを入力します。

# npm publish

Githubへのpushがおわったら、

```shell-session
npm publish
```

これだけで公開完了！
READMEがnpmの画面に表示されます。

更新する際は、package.json内のversionを上げてからpublishです。

# 実際に作ったもの

一度つくったスクリプトをあちこちで利用できて便利でした。

* [npm - hubot-97-tepsk](https://www.npmjs.com/package/hubot-97-tepsk)
* [Github - hubot-97-tepsk](https://github.com/kei-xoox/hubot-97-tepsk)
Apache FlexでHelloWorldアプリを作り、配布できるようにパッケージングするところまで（AIR for Android）

# はじめに

Apache Flex を使って、Hello Worldを表示するAndroidアプリを作成します。
また、配布できるようにパッケージングするところまでの手順を書きます。
今回は、IDEは利用せずに、コマンドプロンプトにてコンパイル等を行います。

Apache Flex を使う場合は、Android SDKのインストールは不要です。

## アプリの完成イメージ

![q.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102121/da014c6f-50db-95d6-1b65-a3ea3dee32d6.png)

## 試した環境/バージョン

Apache Flex 4.16.1
Adobe AIR 32.0.0.116
Android 13

# 環境作成

環境作成の手順は以下を参照
[Apache FlexでAdobe AIRアプリを作るための環境作成（zipを利用する場合）](https://qiita.com/lune1122/items/67dc781aa66fb4391736)

# Hello World アプリの作成、実行

## 作業用フォルダーの作成

任意の場所にフォルダーを作成する
（今回は、MyApplicationというフォルダー名でフォルダーを作成）

## mxmlの作成

srcフォルダーを作成し、その下に以下のMain.mxmlを作成する
（Apache Flexでは、アプリの画面デザインをMXMLで、処理をActionScriptで記述する）

```mxml:Main.mxml
<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
                       xmlns:s="library://ns.adobe.com/flex/spark"
                       xmlns:mx="library://ns.adobe.com/flex/mx"
                       applicationDPI="120" fontFamily="Meiryo">

    <fx:Script>
        <![CDATA[

            /**
             * メッセージを表示する処理
             */
            private function showMessage():void {

                label1.text = "Hello World";
            }

        ]]>
    </fx:Script>

    <!-- ラベル -->
    <s:Label id="label1" left="10" top="10" text="Click the button."/>

    <!-- ボタン -->
    <s:Button left="10" top="40" label="Click Me" 
        click="showMessage();" />

</s:Application>
```

## コンパイル

コマンドプロンプトで以下を実行するとMain.swfが作成される

```
> amxmlc src/Main.mxml -output Main.swf
```

## application.xmlの作成

以下のxmlを作成する

```application.xml
<?xml version="1.0" encoding="utf-8" ?> 
<application xmlns="http://ns.adobe.com/air/application/32.0">
    <id>MyApplication</id>
    <versionNumber>1.0</versionNumber>
    <filename>MyApplication</filename>
    <supportedProfiles>mobileDevice</supportedProfiles>

    <initialWindow>
        <content>Main.swf</content>
        <requestedDisplayResolution>high</requestedDisplayResolution>
    </initialWindow>
</application>
```

## アプリの実行

コマンドプロンプトで以下を実行するとアプリが起動する

```
> adl -screensize 300x400:300x400 application.xml
```

# 配布できるようにパッケージング

## 証明書の作成

コマンドプロンプトで以下を実行
※最初に作成するときの１回のみ実行する

```
> adt -certificate -cn "TestCert" 2048-RSA "TestCert.p12" pass
```

TestCert.p12が作成される

## パッケージング

コマンドプロンプトで以下を実行

```
> adt -package -target apk-captive-runtime -storetype pkcs12 -keystore "TestCert.p12" -storepass pass MyApplication.apk application.xml Main.swf
```

MyApplication.apkが作成される

このMyApplication.apkをAndroidにて実行することで作成したアプリをインストールすることができる

とりあえず今回はここまで
Object initializerはインスタンスを返す前にメンバを初期化する

Object initializerの挙動が気になったので調べてみたメモ。

次のコードを考える。

```csharp
this.Foo = new MyObj();
this.Foo.Prop = 1;
```

このとき、生成された `MyObj` インスタンスが `Foo` プロパティにセットされてから、`MyObj` インスタンスの `Prop`　プロパティがセットされるまでの間に、ほかのスレッドから `Foo` プロパティ経由で `MyObj` インスタンスに触ることができる。`MyObj.Prop` が設定されるまでは `MyObj` インスタンスに触ってほしくないのだが、諸事情でコンストラクタの引数を増やしたくないという場面があった。もちろん直接プロパティにセットせずに変数に入れても良いのだけれども、なにかスマートな方法はないものかと思い、調べてみた。

結論から先に言うと、オブジェクト初期化子付のコンストラクタ呼び出しをすることで、この目標は達成できる。

```csharp
this.Foo = new MyObj() { Prop = 1 };
```

いくつかの記事では「オブジェクト初期化子とコンストラクト後のプロパティセット（以下プロパティセット）は同義である」と記述されているが、以下の記事では生成されるILコードは異なると主張している。

http://qiita.com/kuchikios/items/48209b5a614e5fa63d63

重要な点を以下に引用する（カッコ内は著者注）。

>MethodA（プロパティセット） と MethodB（オブジェクト初期化子） は同じ処理　　　と　思いきや　全然違いました。
>Member プロパティの set である set_Member を実行するタイミングが、
> 　MethodA では　”参照を value に代入した後”　になっていますが、
> 　MethodB では　”参照を value に代入する前”　になっています。

この記事ではILを取り上げて挙動の違いを説明しているが、これがドキュメンテッドな挙動なのかどうかが気になったので、仕様書を読むことにした。

C#の言語仕様書はMSDNからダウンロードできる（恐ろしいことにWordドキュメントの形式で配布されている。C#6.0のspecはいつ公開されるのだろうか）。読むべき項目は「7.6.10.2 Object initializers」だ。

以下に当該箇所を抜粋する。

>An instance of Point can be created and initialized as follows:
>Pointインスタンスは次のように生成・初期化できる:

>```csharp
Point a = new Point { X = 0, Y = 1 };
```

>which has the same effect as
>これは以下のコードと同じ効果を持つ

>```csharp
Point __a = new Point();
__a.X = 0;
__a.Y = 1; 
Point a = __a;
```

>where `__a` is an otherwise invisible and inaccessible temporary variable. 
>ここで `__a`　は不可視でアクセスできない一時的な変数である。

つまり、Object initializer内に記述した初期化が行われたあとでオブジェクトへの参照が返ることが仕様書にも明記されている。

# 結論
インスタンス生成とメンバ初期化をアトミックに行いたいときはObject initializerを使う。
ラベル・画像・ボタンを縦に並べてみる（UIKit::UIStackView）

# 縦向きスタックビューを1つだけ使って、ラベル、画像ビュー、ボタンをレイアウト
[元ネタ](https://developer.apple.com/jp/documentation/UserExperience/Conceptual/AutoLayoutGuide/LayoutUsingStackViews/LayoutUsingStackViews.html#//apple_ref/doc/uid/TP40010853-CH11-SW1)

## 事前準備
[サンプルコード](https://developer.apple.com/sample-code/xcode/downloads/Auto-Layout-Cookbook.zip)をダウンロードして解凍

## Single View Applicationでプロジェクトを作成
Project Nameは適当に

## 必要なファイルのインポート
1. プロジェクト名の書かれたフォルダアイコンを右クリックして、『Add Files to "プロジェクト名"』を選択
2. ダウンロードして解凍しておいたフォルダから、Auto Layout Cookbook->Assets.xcassets->flowers.imagesetの中にあるflowers.pngとflowers@2x.pngを選択（適当なGroupを作ってまとめておくと良い）

## View Controller内のViewにVertical Stack Viewを配置
普通に画面にドラッグ＆ドロップでViewに配置される

## Stack ViewにFlowers Labelを配置
1. Stack ViewにLabelを配置
2. LabelのAttribute InspectorからLabel Text（初期値はLabel）をFlowersにする

## Stack ViewにImage Viewを配置
Flowers Labelの下に来るように

## Stack ViewにButtonを配置
Image Viewの下に来るように

## Stack Viewに制約（Constraints）を設定
Stack Viewを選択して、Pinから

 - Top（上）はTop Layout GuideとUse Standard Valueを選択（Stack View.Top = Top Layout Guide.Bottom + Standard）
 - Leading（左）はViewを選択して、Constrain to Marginsにチェックを入れ値を0に（Stack View.Leading = Superview.LeadingMargin）
 - Trailing（右）はViewを選択して、Constrain to Marginsにチェックを入れ値を0に（Stack View.Trailing = Superview.TrailingMargin）
 - Bottom（下）はBottom Layout GuideとUse Standard Valueを選択（Bottom Layout Guide.Top = Stack View.Bottom + Standard）

*Constraintsは4つ同時でも、1つずつでも設定できるが、Add Constraintsを押さないと設定されない*
*Constraintsが正しく設定されているかどうかは、View Controller Sceneのツリーを展開したり、Stack ViewのSize Inspectorを開いたりして確認できる*

## Stack Viewの属性を設定
Stack ViewのAttributes Inspectorで

 - Axis（軸）をVertical
 - Alignment（整列）をFill
 - Distribution（配分）をFill
 - Spacing（間隔）を8

に設定

## Image Viewの属性を設定
Image ViewのAttributes Inspectorで

 - Imageをflowers.png
 - ModeをAspect Fill

に設定

Image ViewのSize Inspectorで

 - Content Hugging Priority（収縮性の優先度）
  - Horizontalを250
  - Verticalを249
 - Content Compression Resistence Priority（膨張性の優先度）
  - Horizontalを750
  - Verticalを749

に設定
Storyboardだけで縦スクロール画面を作る

一部で有名なCheese AcademyというページをStoryboardで作ってみるという挑戦。

コードは[Github](https://github.com/33-Nagata/cheese_academy_with_xcode)に上げてあります。

結論としては、実機・シミュレータ共にスクロールできませんでした。

原因はまだよくわかりません。

今回参考にしたのは以下のサイト。

[縦スクロールするUIScrollViewをXcode6のAutolayout,Size Classes付きStoryboardで実現する](http://qiita.com/hirobe/items/2baf629b7807b4c0d10f)

[UIScrollViewにおけるAutoLayoutについてまとめる](http://qiita.com/malt/items/6468921e57a30594d037)

[iOS Scroll Viewプログラミングガイド](https://developer.apple.com/jp/documentation/UIScrollView_pg.pdf)

[Scroll View Programming Guide for iOS](https://developer.apple.com/library/ios/documentation/WindowsViews/Conceptual/UIScrollView_pg/Introduction/Introduction.html)

[超簡単！Storyboardだけで少し凝ったすりガラス効果を実現する方法](http://yuu.1000quu.com/realize_a_frosted_glass_effect_that_elaborate_only_storyboard)

[Xcode7で1円も払わずに自作iOSアプリを実機確認する](http://qiita.com/FumihikoSHIROYAMA/items/a754f77c41b585c90329)
API GatewayでCookieを扱う

# はじめに
API GatewayではCookieをはじめHTTPヘッダーをLambdaのパラメータなどに設定できます。ただ、具体的にどうすればよいかのサンプルが見当たらなかったので備忘録としてまとめておきます。

# Method Request

まず、Method RequestのHTTP Request Headersに取得したHTTPヘッダーの項目名を設定します。ここれは、Cookieをサンプルにしているので、Cookieを設定します。

![2016-03-19 (1).png](https://qiita-image-store.s3.amazonaws.com/0/112407/c256a197-aa96-f37a-a9e8-bc9e37726776.png)

# Integration Request

続けてIntegration RequestのMapping TemplateにMethod Requestで設定した値を設定します。ここで留意するのはCookieはURLエンコードされているので、まず`$util.urlDecode`でデコードしておくと便利という点です。また、Cookieの値にJSONが設定されている場合には、さらに`$util.escapeJavaScript`でエスケープする必要があります。これは、API Gatewayで扱えるのはCookieというHTTPヘッダーの値までですので、JSONを含んだCookieの場合には`aaa={"bbb":"cccc"};bbb={ddd:eee}"という値をLambda等に渡す必要があるため、文字列としてエスケープしておかないとエラーとなってしまいます。

![2016-03-19 (2).png](https://qiita-image-store.s3.amazonaws.com/0/112407/8df9bcd3-fd3e-e048-2aa2-c25bb0837866.png)
明示的に実装されたインターフェースのメンバーはリフレクションからどう見えるか

ググっても直球の答えが出てこなかったのでついカッとなって書いた。今は反省している。

```csharp
namespace TypeTest {
	namespace Impl {
		class Program {
			static void Main(string[] args)
			{
				DumpMember<ImplicitTest>();
				DumpMember<ExplicitTest>();
				Console.ReadKey();
			}

			private static void DumpMember<T>()
			{
				Console.WriteLine($"== {typeof(T).Name} ==");
				foreach (var p in typeof(T).GetProperties(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance)) {
					var accessibility = p.GetMethod.IsPublic ? "+"
						: p.GetMethod.IsPrivate ? "-"
						: p.GetMethod.IsAssembly ? "~"
						: p.GetMethod.IsAbstract ? "/"
						: "#";
					Console.WriteLine($"{accessibility} {p.Name} : {p.PropertyType}");
				}
			}
		}

		public interface ITest {
			string Member { get; set; }
		}

		public class ExplicitTest : ITest {
			protected string MemberImpl { get; private set; } = "Explicit";
			string ITest.Member
			{
				get { return MemberImpl; }
				set { MemberImpl = value; }
			}

			public override string ToString()
			{
				return MemberImpl;
			}
		}

		public class ImplicitTest : ITest {
			public string Member { get; set; } = "Implicit";

			public override string ToString()
			{
				return Member;
			}
		}
	}
}
```

## 結果

```
== ImplicitTest ==
+ Member : System.String
== ExplicitTest ==
# MemberImpl : System.String
- TypeTest.Impl.ITest.Member : System.String
```
社会を羽ばたく２年目PGが、新人PGにお勧めする本を書いてみた

# 社会を羽ばたく２年目PGが、新人PGにお勧めする本を書いてみた

タグの「新人プログラマ応援」とかめちゃくちゃ興味あるタグだったので書いてみました。
新人PGが読んだ方がいいなーって個人的に思っている本を書いていきます。
## 技術系
### 1. [リーダブルコード](https://www.oreilly.co.jp/books/9784873115658/)
言わずもがな、な本。
ソースコードを書く時の基本的な概念を学びました。
確かにソースコードって書く時間より、読む時間の方が多いですね。
この先の未来の誰かに優しいソースコードを目指そうと思わせてくれました。
人がソースコードを書いている限り、受け継がれていく本でしょう。

ソースコードは作文ですね。

今も憧れ、尊敬している方から頂いた宝物です。

### 2. [プログラマのサバイバルマニュアル](http://www.oreilly.co.jp/books/9784873115719/)

プログラマとしての行く道を学びました。
具体的には技術的なことだけでなく、プログラマ人生でハマりそうな箇所について書かれてありました。

リーダブルコードと違い、少し読みにくい本でしたが
プログラマとして人生を歩んでいくためなら、読んでおいて損はないと思います。

### 3. [Ｗｅｂエンジニアが知っておきたいインフラの基本　インフラの設計から構成、監視、チューニングまで] (http://www.amazon.co.jp/Web%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%81%8C%E7%9F%A5%E3%81%A3%E3%81%A6%E3%81%8A%E3%81%8D%E3%81%9F%E3%81%84%E3%82%A4%E3%83%B3%E3%83%95%E3%83%A9%E3%81%AE%E5%9F%BA%E6%9C%AC-~%E3%82%A4%E3%83%B3%E3%83%95%E3%83%A9%E3%81%AE%E8%A8%AD%E8%A8%88%E3%81%8B%E3%82%89%E6%A7%8B%E6%88%90%E3%80%81%E7%9B%A3%E8%A6%96%E3%80%81%E3%83%81%E3%83%A5%E3%83%BC%E3%83%8B%E3%83%B3%E3%82%B0%E3%81%BE%E3%81%A7~-%E9%A6%AC%E5%A0%B4-%E4%BF%8A%E5%BD%B0/dp/4839953554)
アプリエンジニアだから、「インフラ、サーバーとか関係ないでしょー」とは行かず、
ちょうど勉強したいなと思った時にお勧めしていただいた本でした。
今の私がインフラ部分も少し見れるようになっているのは、この本のおかげです。
おかげさまで、私が進めている[グロンギ語変換アプリ](http://qiita.com/UltraBirdTech/items/e049448f73d424872c05)もサーバー乗っけて公開しております。
サーバー、インフラできるとエンジニアとしての幅が広がりますね。

### 4. [webエンジニアの教科書](http://www.amazon.co.jp/Web%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%81%AE%E6%95%99%E7%A7%91%E6%9B%B8-%E4%BD%90%E3%80%85%E6%9C%A8-%E9%81%94%E4%B9%9F/dp/toc/4863541686)
書店で、ふと気になって手に取った本。
１年も働いていればある程度は聞いたことのある技術が広く浅く書かれていました。

今、改めて読む本ではないですが、
右も左もわからない新人時代にこの本に出会っていれば
「なるほどー、こういうのを勉強していく必要があるのかー！！」という道標にはなったかもしれません。
この業界、最初は技術の幅が広すぎて「何があるのか」が分からないの辛いっす。

※この本はおそらく時代とともに古くなっていく系なので、毎年20×× .verとして出して欲しいという願望

## その他
### 1. [社会人1年目の教科書](http://www.amazon.co.jp/%E5%85%A5%E7%A4%BE1%E5%B9%B4%E7%9B%AE%E3%81%AE%E6%95%99%E7%A7%91%E6%9B%B8-%E5%B2%A9%E7%80%AC-%E5%A4%A7%E8%BC%94/dp/4478015422)
流石、売れている本だなという印象。
私が社会人になる２週間前に自主的に買ったのですが、
少なからず社会人としての動きに影響を与えてくれています。
（周りから意識高いと言われる原因？）

「社会人はアウトプットがゴール」なんて、今この記事を書いているのがその証拠です笑

## 最後に
ここに書いた本はプレゼントされたり、お勧めされたり、個人的に気になって手に取ったものだったりします。

ただ、本って人によって合う合わないとかあるので、
しっかりと自分の目で見て買う、買わない判断して欲しいなとも思います。

iPhoneアプリの参考書や応用情報の参考書、買いなおそうかなー
Golangで標準入力がパイプで渡されたものか判定する

一般的な手法の`fmt.Scan`や`bufio`の`scanner`の場合、パイプで標準入力が渡されなかった時は入力待ちになる。

```go
package main

import (
	"fmt"
)

func main() {
	var stdin string
	fmt.Scan(&stdin)
	fmt.Println("渡された標準入力を出力:", stdin)
}
```

実行結果(パイプなし)

```bash
$ go run scan.go
ここで入力待ち
渡された標準入力を出力: ここで入力待ち
```

実行結果(パイプあり)

```bash
$ echo "パイプの場合は待たずにすぐ出力" | go run scan.go
渡された標準入力を出力: パイプの場合は待たずにすぐ出力
```

# パイプで渡された時だけ処理する

入力待ちにしたくない。パイプで渡された時だけ標準入力を取れれば良い、という時は`terminal.IsTerminal`を使う。
パイプが無い場合はFD値が0(stdin)、パイプがある場合はFD値が0以外で判定。

[https://godoc.org/golang.org/x/crypto/ssh/terminal#IsTerminal](https://godoc.org/golang.org/x/crypto/ssh/terminal#IsTerminal)

```go
package main

import (
	"fmt"
	"golang.org/x/crypto/ssh/terminal"
	"io/ioutil"
	"os"
)

func main() {
	fmt.Println(terminal.IsTerminal(0))
	if terminal.IsTerminal(0) {
		fmt.Println("パイプ無し(FD値0)")
	} else {
		b, _ := ioutil.ReadAll(os.Stdin)
		fmt.Println("パイプで渡された内容(FD値0以外):", string(b))
	}
}
```

実行結果(パイプなし)

```bash
$ go run stdin.go
true
パイプ無し(FD値0)
```

実行結果(パイプあり)

```bash
$ echo -n "パイプで渡す" | go run stdin.go
false
パイプで渡された内容(FD値0以外): パイプで渡す
```
JavaScript入門のメモ

JavaScript (JS) 入門でメモしたものです。主に、O'REILLYのJavaScript（第5版）読書のまとめです。

# 文字コード

- 2バイト

# 大小文字

- 区別してる
- JS のオブジェクトとプロパティーは、HTMLのタグや属性と同じ名前が使用されてるものがたくさんある。ただし、HTMLで大小文字を区別しない。（XHTMLでは区別する）

# 空白スペースと改行

- 空白、タブ、改行を無視

# セミコロン

- それぞれの文が別の行で記述すれば、セミコロンをなくしてもいい。ただし、入れるほうが。

```js
// これも正しく動く
x = 1
y = 2;
```

# リテラル

- ES3 では、配列リテラルとオブジェクトリテラルもサポートされてる

```js
// オブジェクトリテラル
{x:1, y:2} 

// 配列リテラル
[1,2,3] 
```

# 識別子

- 先頭の文字：Unicode文字、アンダースコア_、ドル記号$（数字はできない）
- その後：Unicode文字、数字、アンダースコア、ドル記号
- Unicodeエスケープシーケンス（\uという文字に続いて、文字に対応する16ビット文字コードを表す4桁の16進数文字を記述する）を使用可能→この記述のおかげで、Unicode文字を使用するJSプログラムを、Unicode文字をサポートしないテキストエディタなどで扱えるようになる。例えば、
- 予約語（固有の意味を持つキーワード）を識別子として使用不可

# 数値

- 整数と浮動小数点を区別しない
- 64ビット
- マイナス記号は、数値リテラルの一部ではなく、単行演算子とみなされる

# 16進数と8進数の整数リテラル

- 整数を16進数で指定可能：先頭が0x また0X、その後に一連の16進数値
- ECMAScript標準では、8進数リテラルはサポートしない。しかし、実装によってサポートされた場合もある。先頭が0、その後に一連の数値（0-7)

# 浮動小数点リテラル

- 書式：[数値][.数値][(E|e)[(+|-)]数値]

# 数値の操作

- 複雑な数学演算を行う関数は、`Math` という名前のオブジェクトのプロバティとしてコア言語に組み込まれてる。

```js
sine_of_x = Math.sin(x);
hypot = Math.sqrt(x * x + y * y); 
```

# 関数

- JS での関数はデータ型の一つ。コードから操作できる
    - 関数を値として扱える。例えば、変数や配列、オブジェクトに関数を格納したり、関数を引数として他の関数に渡したりできる。

# 関数リテラル

- 名前を省略できる
- 関数定義と同じ記述形式

```js
var square = function(x) {return x * x;}
```

# オブジェクト

- JSのオブジェクトは連想配列として使用可能

```js
image.width;
image.height;
image["width"];
image["height"];
```

# オブジェクトリテラル

- オブジェクトリテラルも使用可能
- 定義形式：

```js
{プロパティ名:値, プロパティ名:値, ...}
```

- 入れ子にしても可能
- プロパティ値に：
    - 定数指定
    - 任意のJS式
 
- プロパティ名には、識別子の代わりに文字列も指定可能

```js
var point = {x:2.3, y:1,2};

var rectangle = {upperLeft: {x:2, y:2}, lowerRight: {x:4, y:4}};

var square = {"upperLeft": {x:point.x, y:point.y}, 'lowerRight': {x:(point.x + side), y:(point.y + side)}};
```

# 配列

- インデックスは0を起点にして数える
- Array()コンストラクタ関数に引数を1つだけ指定すると、配列の大きさを指定したことになる

```js
var a = new Array();
a[0] = 1,2;
a[1] = "JavaScript";
a[2] = true;
a[3] = {x:1, y:2};

var a = new Array(1.2, "JavaScript", true, {x:1, y:2});

var a = new Array(10)
```

- 配列リテラル

```js
[値, 値, ...]
```

```js
var a = [1,2,3];

var matrix = [[1,2,3],[4,5,6],[7,8,9]];

var base = 1024;
var table = [base, base+1, base+2];

var sparseArray = [1,,,,5];

```

# 変数の宣言

- var 文で宣言されていない変数は、グローバル変数とみなさる
- 関数の中にグローバル変数と同じ名前のローカル変数があった場合、ローカル変数が優先される

# ブロックレベルのスコープはない

- どのブロックで宣言されたのかにかかわらず「関数全体」で有効
- ［お勧めな書き方］変数を関数先頭でまとめて宣言すること

# JS でのfinally 文の理解

- try ブロックのコードが一部でも実行されると、finally句のコードも必ず実行される。つまり、tryブロック中のコードがどのような理由で数量したかにはかからず、いつもfinally区のコードが実行されること。
- 通常、try ブロックの最後まで処理が進み、finallyブロックに処理が移り後始末処理が実行。
- return文、continue文、break文で処理がtryブロックから移動する場合は、処理が移動する前にfinallyブロックが実行される

```js
var a = [1,2,3];
var i = 0, total = 0;
while(i < a.length) {
 try {
  if((typeof a[i] != "number") || isNaN(a[i])) {// 数字ではない場合
   continue; // 次のループに処理を移動する
  }
  total += a[i];
 }
 finally{
  i++;// continue 文が使われた場合でも必ず変数iが増加するようにする
 }
}
```
Intelij IDEAのMacroでコードのsave時に自動的にコードフォーマッティングする



実践している人も多いだろうけど一応ポストしておく。

コードのsave時に自動的にコードフォーマッティングしてほしいが、Reformat CodeとSave Allのショートカットキーがバッティングするため、その一連の操作をマクロにして、そのショートカットキーを登録することで実現している。

# 方法

やり方は[Stackoverflow](http://stackoverflow.com/questions/946993/intellij-reformat-on-file-save)に書いてあるとおり。

> 1. Edit -> Macros -> Start Macro Recording
2. Code -> Reformat Code
3. File -> Save all
4. Edit -> Macros -> Stop Macro Recording
5. マクロに名前をつける ("formatted save"とか)
6. Preferences -> Keymap
7. そのマクロを検索し、キーボードショートカットを追加する(CMD+Sなど。`Save All`を上書きしてしまうと良い)。


個人的にはコミットするコードは全てフォーマットされていて欲しいし、コードのSave操作時に自動的にそうなるのが一番手間がかからないのでこうしている。
ただ、minifyされた既存のJSなどのコードでうっかりCMD+Sしてしまうとせっかくminifyされたコードが嬉しくないフォーマッティングになってしまうのでそこだけ注意する。npmなどのパッケージ管理ツールを使っていればほぼ気にする必要はないだろう。

# dartfmtを組み込む

さらに、Dartにおいてはdartfmtという標準のフォーマッティングツールがある。gofmtのDart版であり、Dartのコードはこのツールを使って統一されたスタイルになっているべきである。dartfmtは改善が重ねられ、リーズナブルで信頼できるので最近は必ずこれを走らせるようにしている。WebStormにおいては`Reformat with Dart Sytle`および`Sort Members in Dart Style`がデフォルトでメニューに存在しているので、それもsave時のマクロに組み込むといい。(Update: `Sort Members in Dart Style`は鬱陶しかったら外したらいいかもしれない。まは、まだbugがあるかもしれない)


最終的には

1. Reformat Code
2. Reformat with Dart Sytle
3. Sort Members in Dart Style
4. Save All

の4つのコマンドをマクロにし、`reformat_code_then_dart_fmt_then_save`とでも名前をつけ、CMD+Sのショートカットキーを割り当てている。.html、.(s)css、.js、.dart等々、intelijが対応しているコードならばsave時に自動的にフォーマッティングがかかるようになる。便利。応答速度の低下も特に気にならないレベル。それが気になるレベルならばコードの行数が長すぎる疑いがありファイルを分割するべきか検討するタイミングかと思う。
電子工作 > ヒートクリップ

参照 ハンダの達人 by 福多利夫さん

この本で掲載されていた「ヒートクリップ」なるものを初めて知った。

検索してみると
http://www.ne.jp/asahi/shared/o-family/ElecRoom/ElecHint/ElecHint.html

> 熱に弱い部品や、リード線の予備ハンダを行う際に、このヒートクリップを挟んでおけば、クリップから先に熱が伝わりにくくなり、部品や被覆を保護できます。

ストレートピンヘッダにハンダを当てすぎてプラスチック部分が多少歪んだことがあった。ハンダを当てる時間を短くすれば済むのだが、ヒートクリップを使うというのもいいのだろうか。
background-size: cover; の挙動を自前で実装する



Youtube動画を埋め込む場合や、canvas要素を使う場合など、
background-size プロパティを使うことは出来ないけれど background-size: cover; 的な挙動をさせたいときはしばしばあるかと思います。

そんなときに使える計算式をスニペットとして残しておこうと思います。

```sample.html
<div class="wrapper">
  <video class="video"> <!-- 表示要素の例として、videoタグを利用します。 -->
</div>
```

```backgroundCover.js

// $('.wrapper') は表示要素を囲う箱を表します。
var wrapper_width = $('.wrapper').width();
var wrapper_height = $('.wrapper').height();

// content_width, content_heightは、表示する要素のオリジナルの幅と高さを表します。
var content_width = 1280;
var content_height = 720;

// target_width, target_heightは実際に表示されるときの幅と高さが代入されます。
var target_width;
var target_height;

// target_offset_topとtarget_offset_leftは表示される要素をセンタリングさせるためのオフセット値が代入されます。
var target_offset_top;
var target_offset_left;

if(wrapper_height / wrapper_width > content_height / content_width){
	// 囲う箱のほうが、表示する要素よりも縦長だった場合
    target_height = wrapper_height;
    target_width = wrapper_height * (content_width / content_height);
    target_offset_top = 0;
    target_offset_left = (wrapper_width - target_width) / 2;
}
else{
	// 表示する要素のほうが、囲う箱よりも縦長だった場合
    target_width = wrapper_width;
    target_height = wrapper_width * (content_height / content_width);
    target_offset_top = (wrapper_height - target_height) / 2;
    target_offset_left = 0;
}

$('.video').attr({
	width: target_width,
	height: target_height
}).css({
	transform: `translate(${target_offset_left}px, ${target_offset_top}px)`
});

```
gitをコマンドで使う方法


## gitの単語帳
* 自分のパソコンのフォルダ : ローカルリポジトリ
* ネットに上げてあるフォルダ : リモートリポジトリ
* 自分のパソコン上のあるフォルダをgit対応にするコマンド : git init
* 自分と他人で同じファイルの同じ箇所を変更してしまった時の状況 : コンフリクト


## 実際にgitを使う時の順序
### 他人が作ったリモートリポジトリをローカルに持ってくる場合
1. 自分がこれから開発をしたいフォルダに移動する。その場合、```git init```をターミナルから打つ
2. そのフォルダにリモートリポジトリをクローンする
  ```git clone <リモートリポジトリのURL>```

3. ローカルのmasterから自分のブランチを切る
  ```git branch dev_◯◯```

4. 3番で切ったブランチに入る
  ```git checkout dev_◯◯```
3番と4番の処理をまとめるコマンド
git checkout -b dev_◯◯
これはブランチを切った後にチェックアウトまでを行うコマンドである
git branch で自分のブランチを確認すると、作ったブランチに入っていることが分かる  

5. 変更した点を記録する
```git commit -m "変更した内容"```
6. 変更した点をみんなに共有する(リモートリポジトリにローカルブランチをアップロードする)
```git push origin dev_◯◯```
これを行うことで、リモート上に「origin/dev_◯◯」が生成される

7. 変更したことをみんなに伝え、リモートのmasterにマージする
  * gitのwebサイトからプルリクエストを送る
  * これによって、メンバーがそのコードを確認し、よければマージを行ってくれる
  
``` 
注意点
   間違ってもリモートのmasterにpushしてはいけない
   これをやってしまうと、ファイルをぐちゃぐちゃにしてしまう可能性がある
   そのため、pushするときは必ず、自分のdev_◯◯を指定する
```

### マージのやり方
1. マージをしたいブランチをチェックアウトする
```git checkout dev_◯◯```

2. マージ元のブランチを指定して、マージする
  * git merge master(など）
 
### 自分がリモートリポジトリを作成するとき
1. gitのwebサイトからリポジトリを作成する
2. 自分のPCの開発を行いたいフォルダで、
```git init```を行う
  
3. 自分のPCに存在するフォルダをリモートリポジトリと連携させる
```git remote add origin <リモートリポジトリのURL>```

4. ファイルをgitの管理下に置く
```git add .```
addはコミットする前に必ず行う必要がある。
指定のファイルのみをgitの管理下に置くときは以下のコマンドを打つ
```git add <対象のファイル名>```
5. 変更点を記録する
```git commit -m "変更内容"```
6. ファイル類をリモートリポジトリにアップロードする
```git push -u origin main```
1番始めのpushではmainを指定して良い。
これから後は、ブランチを切って作業する
方法は上記で記したとおり.

#### コンフリクトを起こした場合
* コンフリクトはマージした時に起こる

#### コンフリクトの解消方法
1. 相手の変更点を優先するとき
  * git checkout --theirs <コンフリクトを起こしたファイル名>
2. 自分の変更点を優先するとき
  * git checkout --ours <コンフリクトを起こしたファイル名>
3. 両方の変更点を確認しながら、手動で解消するとき
 * 実際にコンフリクトしたファイルを開く
 * その際に、ファイルに以下のマークが出現する

```
<<<<<<<<<HEAD

//ここがマージされる側のコード

==============

//ここがマージをする側のコード

>>>>>>>>>>>>>>>


コンフリクトを解消した後は「<<< HEAD」や「===」「 >>> 」はすべて消す。  
```
FileMakerでCODE128バーコードフォントを印字する

# FileMakerでCODE128バーコードフォントを印字する
CODE128は扱える文字も多くて、情報密度が高く小スペースなので、バーコードリーダーが対応しているなら選択したいバーコードだと思います。
## 利用するフォント
今回はCODE128のバーコードを無料で配布いただいている下記のサイトからCODE128のバーコードフォントをダウンロードしました。
https://www.technical.jp/barcode/font/
## 作成するカスタム関数
CODE128のバーコードで文字を印字する時の壁は、複雑なチェックディジットでした。
チェックディジットには上記のサイトに書いてあるとおりモジュラス103を利用します。
今回は以下のページで紹介されているカスタム関数を利用します。
https://www.briandunning.com/cf/957
## 計算式
上記のカスタム関数を利用すると、スタートコードはÌ、ストップコードはÎになっていますが、今回のバーコードフォントでは、スタートコードは{、ストップコードは}にする必要があります。
そのため、Substitute関数で置き換えをします。
```:計算式例
Substitute ( cfCode128 (コード; "B");["Ì";"{"];["Î";"}"])
```
あとは、印字するフィールドの表示フォントにCODE128を選べばOKです。
電子工作 / AD2 > Hum noise reduction > Band Elimination Filter > 電解コンデンサ | セラミックコンデンサ

ハムノイズ対策

関連 http://qiita.com/7of9/items/19a7540b4ea0f43c8215
関連 [LTSpice計算](http://qiita.com/7of9/items/87501078665981bb1e58)

使用するコンデンサの極性について調べているうちに、電解コンデンサとセラミックコンデンサに関する以下の情報を見つけた。

http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1222123192
> また、電解コンデンサは低域(AF信号など)には適しますが、一般的に数百kHzより上の高い周波数には適さないので、電解コンデンサと0.1μFなどのセラミックコンデンサを並列にして特性改善をはかる場合もあります。電源や中点のバイパスコンデンサは、広帯域にするために必ずそうします。

とりあえずは電解コンデンサだけで試して、問題があった時にセラミックコンデンサを試してみる。
Nefryの情報まとめ

#Nefryって？？？
[Ligさんのサイトにて記事を公開しております](http://liginc.co.jp/236620)
![http://liginc.co.jp/236620](http://cdn.liginc.co.jp/wp-content/uploads/2016/02/0a1a099a-6e42-6f96-185e-6506b4149036-1310x976.jpeg)
[**自作したオリジナルIoTデバイス「Nefry」とインターネットを繋いでみた**](http://liginc.co.jp/236620)

#Nefryの購入先

購入は**[こちら](https://dotstud.io/projects/nefry-connect-internet/)**から！！！

現在**dotStudio**さんからのみ購入可能となっております。

#Nefryの開発環境を整えてみる

[Ligさんのサイトにて記事を公開しております](http://liginc.co.jp/298161)
![](http://cdn.liginc.co.jp/wp-content/uploads/2016/07/20160728-nefry.png)
[**さくっと生活を便利にする！FRISKサイズのIoT向けデバイス「Nefry」を使ってみよう【環境構築編】**](http://liginc.co.jp/298161)



#Milkcocoaを使う方法

[Ligさんのサイトにて記事を公開しております](http://liginc.co.jp/282918)
![](http://cdn.liginc.co.jp/wp-content/uploads/2016/06/eyecatch_160608_03_m.png)
[**NefryとMilkcocoaを連携させて、WebサイトにリアルタイムでPush通知してみる**](http://liginc.co.jp/282918)


#IFTTTを使う方法

[Ligさんのサイトにて記事を公開しております](http://liginc.co.jp/263899)
![http://liginc.co.jp/263899](http://cdn.liginc.co.jp/wp-content/uploads/2016/04/eyecatch181-2-1310x874.png)
[**Webサービス同士を連携できる「IFTTT」と自作IoTデバイスを繋いで生活を便利にしてみた**](http://liginc.co.jp/263899)

#Nefryをプログラムするときに便利なライブラリ関数

http://qiita.com/wamisnet/private/e44812eb6d6fded7af26

#ドキュメント

https://wamisnet.github.io/Nefry_manual.pdf

#ケースの組み立て方

http://fabble.cc/wamisnet/nefry-case

#ピンアサイン

![Nefry_Pin.png](https://qiita-image-store.s3.amazonaws.com/0/97208/ba4a18a9-c793-bca0-5d3a-da47eea8ef71.png)
Qiita > Chromeでの表示が遅くなっている / Safariでは早い

```txt:動作確認
Mac OS X 10.8.5
Chrome バージョン 49.0.2623.87 (64-bit)
Safari バージョン 6.2.8 (8537.85.17.9.1)
```

ずっとChromeでQiitaを利用してきたが、最近、トップページの表示やストック選択後の表示に１０秒かかるようになっている。
キャッシュがきかない状況で顕著に遅いように思われる。

こちらのネット回線の問題か検討したが、そうではないようだ。Safariだと同じページは３秒もかからない。

ネットの速度は60.70Mbps。とくにパケット落ちの様相はないのだが。

~~Windows 8.1 pro(64bit)上のChromeでも同じように遅いように思われる。~~ Windows 8.1pro(64bit)でも速い環境があった。よくわからない。

どうすればChromeでいつも通りの早い表示になるだろうか。
キャッシュなどクリアしたが改善していないので、Safariで接続している。

<hr>
(追記 2016/03/24)

この件については解決のめどが立たない。仕方なくSafariを使っている。

ConfluenceからQiitaへ移行した一つの理由は「すぐに閲覧できる」ことだった。Confluenceは検索が遅く、情報閲覧性が悪かった。Qiita + Chromeで同じようになるのは残念なことだ。

<hr>
(追記 2016/04/03)

Windows 7では別の症状が出ている。
左側の一覧とTwitterの中身が読込まれないまま20秒たっても表示されない。

トップページの表示機能をもっと軽いものにしていただきたい。
義兄弟が教える！ markdown 習得者が Word を使い、武勲を得る方法


少林寺にて `markdown` を修めた者なら否が応にも知ることであろうが、下界では `Word` が使われている。特にオフィスでは `Word` は、必須の武術と言っても過言ではない。

また、江湖では、北に `markdown` あらば、南に `Word` ありとも言われる。 `markdown` がいかに優れた拳法であろうとも、`Word` を知らない、使えないと言っていては武勲も立てられぬ。

しかし安心してほしい。義兄弟のために、対応表を用意した。貴兄のような `markdown` の達人とあらば、`Word` を使いこなすに半時も必要なかろう。

# Markdown , Word 対応表

項目     | markdown    | Word (Windows) | Word (Mac OS X) 
--------+--------------+---------------+------------------
**見出し1** | `#`          | `Ctrl+Alt+1` | `⌘+Option+1` 
**見出し2** | `##`         | `Ctrl+Alt+2` | `⌘+Option+2`
**見出し3** | `###`        | `Ctrl+Alt+3` | `⌘+Option+3`
**見出し解除** |  | `Ctrl+Shift+N` | `⌘+Shift+N`
**太字**    | `**Foobar**` | `Ctrl+B` | `⌘ + B`
**リスト**  | `* Foobar`   | `*` 入力後、スペース(又は 、 `Ctrl+Shift+L`)| `⌘+Shift+L`
**順序付きリスト**  | `1. Foobar`   | `1.` 入力後、スペース |
**リンク** | `[テキスト](http://...)`  | `Ctrl+K` |
**引用** | `> Foobar` | タブ、もしくはスタイルの「引用文」 |
**水平線** | `---` , `***` | `----` 入力後、エンター |

> :memo: Inline code記法, code記法の実現は、`Word` では期待してはならない(「スタイル」の定義、あるいは、highlightされたテキストエディタからのコピペなどで、ある程度は実現できるかもしれない)。 

# 終わりに

いかがであっただろうか。`markdown` と `Word` の双方を修めれば、まさに「武林に敵なし」である。多少の労はあると思うが、ぜひ参考にしてほしい。

# 参考
* [Keyboard shortcuts for Microsoft Word](https://support.microsoft.com/en-us/kb/290938)
* Mac OS X : [Word keyboard shortcuts](https://support.office.com/en-us/article/Word-keyboard-shortcuts-C0CA851F-3D58-4CE0-9867-799DF73666A7)
(メモ)mattn/go-sqlite3を使ってみた

## 準備

* [mattn/go-sqlite3](https://github.com/mattn/go-sqlite3)

```
go get github.com/mattn/go-sqlite3 
```

## サンプル

* [sqlite3 - Instantiating an sqlite database with go? - Stack Overflow](http://stackoverflow.com/questions/36020664/instantiating-an-sqlite-database-with-go)
* [90H Tech: SQLiteでTIMESTAMP列のデフォルト値のタイムゾーンをJSTにする](http://90h-tech.blogspot.jp/2012/04/sqlitetimestampjst.html)

```go:memo.go
package main

import (
	"database/sql"
	"log"

	_ "github.com/mattn/go-sqlite3"
)

func execDB(db *sql.DB, q string) {
	if _, err := db.Exec(q); err != nil {
		log.Fatal(err)
	}
}

func main() {

	db, err := sql.Open("sqlite3", "./data.db")
	if err != nil {
		log.Fatal(err)
	}

	q := `
        CREATE TABLE memo (
          id INTEGER PRIMARY KEY AUTOINCREMENT,
          body VARCHAR(255) NOT NULL,
          created_at TIMESTAMP DEFAULT (DATETIME('now','localtime'))
        )
    `
	execDB(db, q)

	q = `
        INSERT INTO memo(body)
        VALUES ('body1'), ('body2')
    `
	execDB(db, q)

	db.Close()
}
```

## 実行

```bash:
$ go run memo.go
$ echo "SELECT * FROM memo;" | sqlite3 ./data.db
1|body1|2016-03-19 08:00:51
2|body2|2016-03-19 08:00:51
```

## (メモ)型情報を調べる

* [Golangで型情報を調べる - 雑記](http://d.hatena.ne.jp/yuheiomori0718/20140413/1397397593)

```go:hogeの型を調べたい場合
package main
import (
	"fmt"
	"reflect"
)
func main() {
	fmt.Println(reflect.TypeOf(hoge))

}
```