OmniAICreator/Qiita-1.07M huggingface dataset:
Cygwinでjuliaちゃんを使う　其の2

# 前回まで

前回の記事では、
Windows環境でJuliaのダウンロードとインストールについての
方法を説明しました。

今回は、インストールしたJuliaをCygwinで使えるようにします。

前回までの記事を読んでいない方はここからどうぞ！
http://qiita.com/angel_katayoku/items/ba94d54c15f094e0b73f

# JuliaをWindowsパスで通す
コントロールパネルを開き"システムとセキュリティ"を押します。
![ct.PNG](https://qiita-image-store.s3.amazonaws.com/0/130670/c31c39ac-9c00-6d5f-6a31-7bc58a0873fd.png)

<hr>

"システム"を選択します。
![ct2.PNG](https://qiita-image-store.s3.amazonaws.com/0/130670/f3972a42-254e-f7f5-7ed1-5c9a92150b43.png)

<hr>

"システムの詳細設定"を選択します。
![ct3.PNG](https://qiita-image-store.s3.amazonaws.com/0/130670/27affc2a-ad9c-5476-b474-63d81666c612.png)

<hr>

"環境変数"を選択します。

![ct4.PNG](https://qiita-image-store.s3.amazonaws.com/0/130670/0cb90b04-f6e8-cd45-9731-442dfb1c5855.png)

<hr>

"Path"をダブルクリックして編集します。

![ct5.PNG](https://qiita-image-store.s3.amazonaws.com/0/130670/743e66f8-91c1-3fb6-48fd-89cfb6376f44.png)

<hr>

変数値に
C:\Julia\bin;
を追加します。
そして、OKを押して完了です。

![ct7.PNG](https://qiita-image-store.s3.amazonaws.com/0/130670/f1fac4fb-81cb-5948-1752-96f9680b0fda.png)

# CygwinでJuliaを起動してみよう

Cygwinのターミナルを開き
Juliaが動くか確認して見ましょう。

コマンドは
julia -ver
でバージョンが確認できればOKです。

![ct8.PNG](https://qiita-image-store.s3.amazonaws.com/0/130670/e66cd19e-5167-f478-71cb-e8ab11a82014.png)

<hr>

Juliaを起動してみましょう。
コマンドで
julia
と入力すると起動します。

![ct9.PNG](https://qiita-image-store.s3.amazonaws.com/0/130670/a1752ceb-f0f5-9a51-2103-9ccadae169f0.png)

このように表示されれば成功です。
webpackでjQueryを別ファイルに分けたい

## なんで？

1ページですむSingle Page Application ではなく今までやってきたような複数ページにまたがる場合、共通部分を別ファイルに分けておくことでDLサイズを減らします。

例えばjQueryのCDNはこれをサイト間で使いまわすことで、重複をなるべく減らしましょう。ということなんですが、複数のCDNがあってその中に各バージョンがあるので本当にしょっちゅうブラウザキャッシュにヒットするのでしょうか？
サイト内の話であればほぼほぼキャッシュ使うと思いますが。

## jQueryCDNを使いたい

jQueryについてトラフィックを別サーバーへ逃すために使いたい場合有効です。
webpackへは「jQueryは出力せず自分で読み込ませる」という設定にして自分でCDNのタグを追加します。そのためjQueryはnpmのバージョン管理から外れます。

### 設定

```js:webpack.config.babel.js
import path from 'path';
import webpack from 'webpack';

export default {
    entry: {
	  app: './js/main.js'
    },
    output: {
        path: path.join(__dirname, 'www/js'),
        filename: 'bundle.js',
    },
    externals: {
        jquery: 'jQuery'
    },

    target: 'web'
}
```

HTMLには以下のタグを挿入

```html

<script src="//code.jquery.com/jquery-2.2.4.min.js" charset="utf-8"></script>
<script src="js/bundle.js" charset="utf-8"></script>

```

## バージョン管理したjQueryをサイト内で共用する

jquery関連をjqueryというnameでグルーピング。
それをwebpack.optimize.CommonsChunkPluginで設定します。
この方法だとnpmでinstallされたjQueryが出力されるためバージョン管理内です。
minifyされる方はpluginsに追加してください。

### 設定

```js:webpack.config.babel.js
import path from 'path';
import webpack from 'webpack';

export default {
    entry: {
	  jquery: ['jquery'],
	  app: './js/main.js'
    },
    output: {
        path: path.join(__dirname, 'www/js'),
        filename: 'bundle.js',
    },

    target: 'web',
    plugins: [
        new webpack.optimize.CommonsChunkPlugin({
            name: "jquery",
            filename: "jquery.js",
            minChunks: Infinity
        }),
    ],
}
```

HTMLには以下のタグを挿入

```html

<script src="js/jquery.js" charset="utf-8"></script>
<script src="js/bundle.js" charset="utf-8"></script>

```
Cygwinでjuliaちゃんを使う　其の１

# Juliaちゃん
最近R言語からJuliaに乗り換える人が増えているみたいです。
JuliaはRに比べて速度が早いので使ってみたい人も多いのでは？

そこで今回CygwinでJuliaを使えるようにしてみましょう。

# Cygwinのインストール
Cygwinのインストールは以下のサイトが参考になります。
今回はここでは割愛します。
http://www.sw.it.aoyama.ac.jp/2011/CP1/cygwin/

# Juliaをダウンロード
早速Juliaをダウンロードしてみましょう
[Juliaの公式](http://julialang.org/downloads/)へ飛びdownloadを選択します。

![download.PNG](https://qiita-image-store.s3.amazonaws.com/0/130670/d1f1f140-d80c-d374-8357-f2fe814ec646.png)
<hr>


次に、Windows Self-Extracting Archiveの64-bitを選択しダウンロードします。

![download2.PNG](https://qiita-image-store.s3.amazonaws.com/0/130670/185ffcac-b903-569f-ad7c-07d08a962ca7.png)

<hr>

好きなフォルダーにダウンロードします。
![exe.PNG](https://qiita-image-store.s3.amazonaws.com/0/130670/ff3f4e9d-cc2f-80ec-bba2-2bb267decb28.png)

# Juliaのインストール

次は、ダウンロードしたJuliaをインストールします。

インストーラをクリックするとこのようにJuliaをどこに置くか尋ねられるので、
C直下に置くことにします。
なので、Destination FolderはC:\Juliaになります。
そして、Installを押せば開始されます。
![install.PNG](https://qiita-image-store.s3.amazonaws.com/0/130670/a8e5f428-fd70-310b-d795-0efb8ebad428.png)
<hr>
チェックを外してFinishを押せばインストール完了です。

![finish.PNG](https://qiita-image-store.s3.amazonaws.com/0/130670/77a5e2b2-9b46-ea16-95b1-4160099f5822.png)

これでJuliaのダウンロードとインストールが完了しました。

画像のアップロード上限の関係上記事を2枚にしましたので、
Cygwinで使う方法は以下のサイトに飛んでください。
http://qiita.com/angel_katayoku/items/d1171d4ce2cf22c6db24
PHP7へアップデートをする方法（MAMP）

PHPから離れている間に、PHP7.0がリリースされたためアップデートをしました（今さら）。
以前PHP5.6を使用していた際にインストールしていたMAMP3.4も、3.5がリリースされていたのでアップデートした際の手順と設定を以下に記述します。使用OSはOS X 10.10.5です。

# 現在のPHPのバージョンを確認する
ターミナルを起動して以下のコマンドを実行します。
`php -v`
すると現在のPHPのバージョンが表示されます。
![php_v_old.png](https://qiita-image-store.s3.amazonaws.com/0/44446/dafdd644-8cb4-4016-6c72-1e9c8d9e29be.png "php_v_old.png")

# MAMPのアップデート
※ 事前に古いバージョンのMAMPは「MAMP_OLD」などの名前に変更してバックアップをとっておくことをおすすめします。

アプリケーションからMAMPを起動します。
MAMPの最新バージョンがあるかを真ん中のアイコンをクリックします。

![open_startpage.png](https://qiita-image-store.s3.amazonaws.com/0/44446/cdac37f6-d369-c198-89db-0063bd0b995a.png "open_startpage.png")

すると以下のページがブラウザで開かれます。

![start_page.png](https://qiita-image-store.s3.amazonaws.com/0/44446/2141b0bc-ac3f-3e62-6981-fa7558c7d53b.png "start_page.png")

四角で囲んだ部分を確認すると、アップデート可能であることが確認できます。
このリンクをクリックし、アップデートページに行きます。

![update_page.png](https://qiita-image-store.s3.amazonaws.com/0/44446/d47827e2-b15a-1aa4-4f67-6f6b434428fc.png "update_page.png")

このページの左下のダウンロードボタンをクリックし、アップデートを行うための`.pkg`ファイルをダウンロードします。

ダウンロードが完了したら`.pkg`ファイルを実行しインストーラを実行します。

![installer.png](https://qiita-image-store.s3.amazonaws.com/0/44446/8ac5d135-dac6-d4a6-814a-c26ede737630.png "installer.png")

このようにインストーラが実行されたら、手順にしたがってインストールをします。

# php.iniの設定
インストールが完了したら`/Application/MAMP/bin/php/php7.0.0/conf/php.ini`をテキストエディタで開いて変更します。php.iniはそれぞれ使用に合わせて変更をしてください。

### タイムゾーンの変更
変更前 `date.timezone = "Europe/Berlin"`
変更後 `date.timezone = "Asia/Tokyo"`

###日本語まわりの設定
変更前 `;default_charset = "iso-8859-1"`
変更後 `default_charset = "UTF-8"`

変更前 `;mbstring.language = Japanese`
変更後 `mbstring.language = Japanese`

変更前 `;mbstring.internal_encoding = EUC-JP`
変更後 `mbstring.internal_encoding = UTF-8`

### エラーをブラウザに表示させる
変更前 `display_errors = Off`
変更後 `display_errors = On`

変更前 `display_startup_errors = Off`
変更後 `display_startup_errors = On`

### Xdebugを有効にする
変更前 `;zend_extension="/Applications/MAMP/bin/php/php7.0.0/lib/php/extensions/no-debug-non-zts-20151012/xdebug.so"`
変更後 `zend_extension="/Applications/MAMP/bin/php/php7.0.0/lib/php/extensions/no-debug-non-zts-20151012/xdebug.so"`

最後尾に追加 `xdebug.remote_enable = 1`

# パスを通す
PHP7のパスを設定します。パスを通す前に`php -v`でバージョンを確認しても古いままです。
`Users/ユーザ名/.bash_profile`に以下を追加します。

``` export PATH="/Applications/MAMP/bin/php/php7.0.0/bin:$PATH" ```

追加後、再度バージョンを確認すると
![php_v.png](https://qiita-image-store.s3.amazonaws.com/0/44446/ab1ae407-7346-de40-4d9d-908604f34f5a.png "php_v.png")

このように表示され、パスが通っていることが確認できます。
要素の個数に応じてスタイルを出し分けるCSSメモ

JSを使わずにCSSだけで、
「要素の個数に応じてスタイルを出し分ける」やり方の紹介です。
前にどこかのサイトで紹介されてたのですがブックマークなかったのでメモです。

## Demo

"個数に応じたスタイルの出し分け"
http://codepen.io/skwbr/pen/JKbNMP

![cap_ 2016-06-22 15.15.35.png](https://qiita-image-store.s3.amazonaws.com/0/48396/0b911c5c-bf00-adfe-5b4b-6532d938971e.png)


## 説明

個数に応じてスタイルを変える場合、下記を組み合わせて使います。

* `:nth-last-child` 擬似クラス … 最後から数えて何番目か
* 間接セレクタ `~` … それ以降の後続する弟要素(同階層)


```html
<ul>
  <li class="item"></li>
  <li class="item"></li>
  <li class="item"></li>
    :
</ul>
```

という作りと想定したとき、

```css

.item:first-child:nth-last-child(5),
.item:first-child:nth-last-child(5) ~ .item {
}

```

と書くと、`.item` の合計5つの時のスタイルを定義できます。
最初の１つめが、最後から数えて５つめになるためです。
`~` を使って、後続する2番目〜5番目の要素にも同じスタイルを適応します。


## コード

```css:css

/* 1つの場合 */
.item:only-child {
}

/* 2つの場合 */
li:first-child:nth-last-child(2),
li:first-child:nth-last-child(2) ~ li {
}

/* 3つの場合 */
.item:first-child:nth-last-child(3),
.item:first-child:nth-last-child(3) ~ .item {
}

/* 4つの場合 */
.item:first-child:nth-last-child(4),
.item:first-child:nth-last-child(4) ~ .item {
}

/* 5つの場合 */
.item:first-child:nth-last-child(5),
.item:first-child:nth-last-child(5) ~ .item {
}

/*   以下略    */

```

## Sass の for文で書く

定義スタイルが個数と相関があって機械的に書けるなら、SCSSの for 文でスマートにかけると思います。例えば…

```scss:scss

.item {
  &:first-child {

    @for $i from 1 through 12 {
      &:nth-last-child(#{$i}) {
        &,
        & ~ .item {
          width: percentage(1/$i);
        }
      }
    }

  }
}

```

と書けば、個数に応じて横幅を均等割りする記述を1個〜12個版まで書けますね。
また、`-child` ではなく `-of-type` でも良いと思います。

レガシーブラウザで使いたい場合は、
IE8以前で `:nth-last-child` が使えないので注意です。
http://caniuse.com/#search=~
draft.jsでリッチなテキストエディタを簡単に組み込むための基本まとめ


仕事でWebアプリにマークダウン的なエディタを組み込もうかと思って、いろいろ探していたんだけど、文字色とかも変えられるようにしたいなと思い、マークダウンだと足りないのでReactでエディタを１からつくろうかと思ったら、すでにdraft.jsというものがありました。しかもfacebook製ということで期待できます。


draft.jsはリッチなテキストエディタを簡単に作ることのできるReactで実装されたフレームワークです。

この記事は、draft.jsの公式ドキュメントをベースに、自分への備忘録含めて内容をかいつまんで和訳したものです。

公式ドキュメント: https://facebook.github.io/draft-js/
デモも含まれているので、どんなものかはこちらで試せます。

## インストール
npmからインストールできます。

```
npm install --save draft-js react react-dom
```

## 使い方

Draft.jsはunicodeをサポートしているため、HTMLのheadタグにはいかのメタタグを必ず入れてください。

```
<meta charset="utf-8" />
```

``` サンプル.html
import React from 'react';
import ReactDOM from 'react-dom';
import {Editor, EditorState} from 'draft-js';

class MyEditor extends React.Component {
  constructor(props) {
    super(props);
    this.state = {editorState: EditorState.createEmpty()};
    this.onChange = (editorState) => this.setState({editorState});
  }
  render() {
    const {editorState} = this.state;
    return <Editor editorState={editorState} onChange={this.onChange} />;
  }
}

ReactDOM.render(
  <MyEditor />,
  document.getElementById('container')
);

```


Editorコンポーネントは、HTML5のContentEditable属性を持つコンポーネントが作られます。Editorでの状態は「EditorState」ですべて表され、onChangeから取得することができます。

##EditorState

EditorStateは現在のEditorのStateのスナップショットであったり、コンテンツ、カーソル、undo/redoの履歴などをふくんでいます。内部で変更があるごとに新しいEditorStateは生成され、onChangeに設定したハンドラーから新しく生成されたEditorStateが取得することができます。

EditorStateに変更を加えたい場合には「RichUtils」が提供されています。似たようなものに「Modifier」もあります。こちらもテキストやスタイルを変更するための機能を適用するためのモジュールです。

## RichUtilsとキーコマンド
RichUilsはCmd+B(ボールド)のようなキーコマンドの情報を持っています。EditorでhandleKeyCommandのpropでキーコマンドを内容を監視できるので、RichUtilsを通して内容をキーコマンドの内容を適用することができます。

```
import {Editor, EditorState, RichUtils} from 'draft-js';

class MyEditor extends React.Component {
  constructor(props) {
    super(props);
    this.state = {editorState: EditorState.createEmpty()};
    this.onChange = (editorState) => this.setState({editorState});
    this.handleKeyCommand = this.handleKeyCommand.bind(this);
  }
  handleKeyCommand(command) {
    const newState = RichUtils.handleKeyCommand(this.state.editorState, command);
    if (newState) {
      this.onChange(newState);
      return true;
    }
    return false;
  }
  render() {
    return (
      <Editor
        editorState={this.state.editorState}
        handleKeyCommand={this.handleKeyCommand}
        onChange={this.onChange}
      />
    );
  }
}
```

## UIボタン

キーコマンドからスタイルを変更するを上で紹介しましたが、ボタンを配置して押されたスタイルを変更させたい場合の例です。ボタンを押すとボールドになります。

```
class MyEditor extends React.Component {
  // …

  _onBoldClick() {
    this.onChange(RichUtils.toggleInlineStyle(this.state.editorState, 'BOLD'));
  }

  render() {
    return (
      <div>
        <button onClick={this._onBoldClick.bind(this)}>Bold</button>
        <Editor
          editorState={this.state.editorState}
          handleKeyCommand={this.handleKeyCommand}
          onChange={this.onChange}
        />
      </div>
    );
  }
}
```
Swift 2.2のプロジェクトをSwift 3.0に書き換えるタスクリスト

以下の記事は、APIを叩いて表示する普通のiOSアプリケーションを想定しています。

Swift 2.2のプロジェクトをSwift 3.0に移行する際のタスクリストです。
Xcode 8にConverterが付いたので、だいたいは自動でやってくれます。

細かい部分は[Migration Guide](https://swift.org/migration-guide/)を参照してください。

# Swift 2.2 -> Swift 3.0のタスクリスト
* メソッドの呼び出し時にArgumentLabelを付ける
* NSPrefixのクラスをSwift 3.0のFoundationクラスに移行
 * NSDate -> Date
 * NSURL -> URL
 * NSURLRequest -> URLRequest
 * NSIndexPath -> IndexPath
 * NSNotificationCenter -> NotificationCenter
 * NSNotification -> Notification
 * NSOperation -> Operation
 * NSBundle -> Bundle
 * NSCalendar -> Calendar
 * NSTimer -> Timer
* GCDをDispatchQueueに移行
* [API Guideline](https://swift.org/documentation/api-design-guidelines/)に合わせる
 * ~~Boolのpropertyにはisを付ける~~
 * enumのcaseをlowerCamelCaseにする

**※ 追記**
「Boolのpropertyにはisを付ける」というのは私の誤解でした。
「Boolのimmutableなメソッドもしくはpropertyはreceiverに対するassertionとして書く」というのが正しいです。

`Uses of Boolean methods and properties should read as assertions about the receiver when the use is nonmutating, e.g. x.isEmpty, line1.intersects(line2).`
https://swift.org/documentation/api-design-guidelines/

`is` を付けるようになったのはObjective-C由来のメソッドとPropertyのみのようです。
https://github.com/apple/swift-evolution/blob/master/proposals/0005-objective-c-name-translation.md

# ArgumentLabelの仕様変更
一番対応が大変です。

## Swift 2.2
メソッドの呼び出し時、1つ目のパラメータはデフォルトではargument labelが付きません。
2つ目以降のパラメータはデフォルトでパラメータ名がargument labelとして付きます。

```swift
func someFunction(firstParameterName: Int, secondParameterName: Int) {
}

someFunction(1, secondParameterName: 2)
```

## Swift 3.0
すべてのパラメータにはデフォルトでパラメータ名がargument labelとして付きます。

```swift
func someFunction(firstParameterName: Int, secondParameterName: Int) {
}

someFunction(firstParameterName: 1, secondParameterName: 2)
```

パラメータ名の前に `_` をつけることでargument labelを消すこともできます。
Xcode 8のConverterを使うとこちらに変換されます。特に消したい理由がない限りargument labelは付けるのをおすすめします。

```swift
func someFunction(_ firstParameterName: Int, secondParameterName: Int) {
}

someFunction(1, secondParameterName: 2)
```
ASP.NET Web API事始め[VB.Net]

Visual Studio 2013でASP.Net Web APIを始めました。

が、すでに終わることが決まっているようです。

開発言語は都合によりVB.Netです。よいこはC#を使いましょう。

# 名前（用語）は大事だよー

Microsoftは同じものに違う名前を付けたり、違うものに同じ名前を付けたり、そんなことがしょっちゅうなので、まずは整理したいと思います。

## ASP.NET

.Net Frameworkを使用してASPアプリを作るためのフレームワーク。
2016年時点の最新バージョンは4.6。

## ASP.NET Core

.Net Frameworkからプラットホーム依存部分を取り除いた.Net Coreで動くASP.NET。
.Net Framework 4.6でも動く。

## ASP.NET 5

ASP.NET Core 1.0のこと。

## ASP.NET vNext

ASP.NET 5のこと。

## ASP.NET Web API

Restfulなアプリケーションを作るためのフレームワーク。
ASP.NET MVC 4と共に登場した。
2016年時点の最新バージョンは2.2。
ASP.NET MVC 6に統合されディスコン予定。

## ASP.NET MVC

MVCなアプリケーションを作るためのフレームワーク。
2016年時点の最新バージョンは5.2。

## OWIN

Open Web Interface for .NET
IIS非依存を目指して作られた規格。
ASP.NET 5で捨てられた。

## Katana

OWINの実装。
ディスコン。


# リンク集

## ASP.NET Web APIのHTTPメッセージライフサイクル

http://www.asp.net/media/4071077/aspnet-web-api-poster.pdf

HTTPメッセージの入力がどこを通ってどのように出ていくかの表です。
最初にこれを見るとよいかも。

## ASP.NETのソースコードリポジトリ

何かうまくいかないことがあるとき、ドキュメントを探すのが大変なとき、ソースを見るのが手っ取り早いです。

- ASP.NET MVC / ASP.NET Web API https://aspnetwebstack.codeplex.com/
- ASP.NET Core https://github.com/aspnet/home
- ASP.NET Identity V3 https://github.com/aspnet/Identity/
- ASP.NET Identity V2 https://aspnetidentity.codeplex.com/

## Introduction to ASP.NET Identity

認証フレームワークであるところのASP.NET Identityの説明です。

http://www.asp.net/identity/overview/getting-started/introduction-to-aspnet-identity

## Dependency Injection関係

### Unity DI 3 で追加された ASP.NET MVC と Web API 向けライブラリ

ASP.NET MVCとASP.NET Web APIにUnityを絡めるライブラリの説明です。

http://blog.shibayan.jp/entry/20130428/1367120130

### ASP.NET MVC 5 で DI する - その3「VBで利用する」 #aspnetjp 

上記ライブラリはC#向けなので、VBで使う方法です。

http://katsuyuzu.hatenablog.jp/entry/2014/11/21/001129

### Unity bootstrap ASP.NET Web API

上記リンク先で使用しているライブラリです。

http://unity.codeplex.com/

# こんな環境で始めました

- Visual Studio ~~2013~~ 2015
- ASP.Net Web API 2.2 (インストール時の指定バージョンは5.2.3)
Node.jsがどのバージョンのV8を使っているかを調べる方法


公式にも記載されている
[ECMAScript 2015 (ES6) and beyond | Node.js](https://nodejs.org/en/docs/es6/)


```
$ node -p process.versions.v8
```

他のライブラリのバージョンも一緒に調べる場合は

```
$ node -p process.versions
```
乾淨的移除 Xcode

由於太手癢裝了 Xcode 8 beta ，導致開發環境各種崩潰不太能工作

於是決定重新安裝他

先是很天真地把 Xcode 從應用程式資料裡面刪除、垃圾桶也清除，不知道 Xcode 專案為什麼還能開起來 ...

這時候不管他，重新安裝了一次 Xcode ，一樣有問題

於是就去查了怎麼樣乾淨的移除掉 Xcode 

## 移除 app 及各種設定檔和快取

做完這幾步之後，就能乾淨的重新安裝 Xcode ，再來一次了：

這些指令都要在終端機執行，我是用 iTerms 。

因為東西是在 / 下面，並不是在自己的資料目錄中，所以最前面要加上 sudo 。再刪除主程式 `Xcode.app` 的時候會稍微多花一點時間，等他刪完就好。

``` bash
sudo rm -rf /Applications/Xcode.app
```

``` bash
sudo rm -rf /Library/Preferences/com.apple.dt.Xcode.plist
```

接著就都是刪除自己目錄下有關 Xcode 的東西

``` bash
rm -rf ~/Library/Preferences/com.apple.dt.Xcode.plist
rm -rf ~/Library/Caches/com.apple.dt.Xcode
rm -rf ~/Library/Application\ Support/Xcode
```

和開發者相關工具

``` bash
rm -rf ~/Library/Developer/Xcode
rm -rf ~/Library/Developer/CoreSimulator
rm -rf ~/Library/Developer/XCPGDevices
```

這樣子就可以完整乾淨的解除安裝了
ChatOps. Hubot, Subot. #shinjukurb 新宿rb 38th

## 自己紹介

- Koichiro Sumi(@sumyapp)
- コードレビューのためのCIサービス、SideCI を運営
- SideCIのGitHub Enterprise Support始まりました

---

## 最近の悩み

- GitHub Enterprise(GHE)を使っていると使えないSaaSが多い。※SideCIは使えます
- 「Enterpriseならこれぐらいは払えるでしょう？」
    - 「GHEを使っている = お金持ち」と各SaaS Providerが考えているっぽい料金プラン
    - [waffle.io `$2,000 for up to 50 users`](http://blog.waffle.io/waffle-takeout-for-america/)
        - ※waffleは例外で、15人以下は「払いたいだけ払ってね」プランがあるので優しい

---

## アジェンダ

1. Hubotと私たち
- Subotと私たち
- 私たちとHubot×Subot
- ディスカス

---

## Hubotと私たち

---
## Hubotの役割

- デプロイはHubotから
- 結合レベルのEtoEテスト
- Dockerイメージの更新

---
### デプロイはHubotから
![スクリーンショット 2016-06-22 14.20.42.png](https://qiita-image-store.s3.amazonaws.com/0/1676/e401b0ad-2691-9068-359f-eae7976647d9.png)

---
### 結合レベルのEtoEテスト

- 擬似ユーザ行動をGitHubに対し行うコードをHubot経由で実施
- 目視でその結果をGitHub上で確認

![スクリーンショット 2016-06-22 14.22.16.png](https://qiita-image-store.s3.amazonaws.com/0/1676/d5e431be-a009-678f-8e0a-a72a006401a2.png)

![スクリーンショット 2016-06-22 14.26.13.png](https://qiita-image-store.s3.amazonaws.com/0/1676/7a110bf6-77fc-6bc5-1f58-b1a9fd89f2b3.png)

---

### Dockerイメージの更新

- SideCIのバックエンドに利用しているOSSのバージョンが頻繁に上がる
- Hubot経由でアップデートの存在を確認、チャットで通知
- Botに声をかけると、Dockerfileを修正、コミット、ビルド。問題がなければ手動マージ

---

#### イメージ画像
![スクリーンショット 2016-06-22 14.34.40.png](https://qiita-image-store.s3.amazonaws.com/0/1676/c93bd532-37f6-fc72-1f49-0766940693d3.png)
![スクリーンショット 2016-06-22 14.34.54.png](https://qiita-image-store.s3.amazonaws.com/0/1676/7cc6427c-fffa-693f-17f9-088403e423c2.png)

詳細は[SideCIで最新ツールバージョンでの解析を提供し続けるための仕組みづくり](http://tech.sideci.com/entry/2016/05/18/103238)

---

## Subotと私たち

---

### Subotがやっていること

- 定期業務連絡(リマインダー的な)
    - 例えば、月末の勤怠、経費精算のリマインド

![スクリーンショット 2016-06-22 14.30.38.png](https://qiita-image-store.s3.amazonaws.com/0/1676/4b5c0400-a795-e86d-884a-5f2643395909.png)

---

## 私たちとHubot×Subot

---

### GitHub Enterpriseのインフラ代節約

- GitHub EnterpriseのAWSインスタンスは要求スペックが高く高額
- 使わない期間は止めて、節約したい
- Hubotで簡単にダウンさせたりアップさせることで節約

---

### Subot x Hubot

- 最後の退社した人がダウンさせる、とかは非現実的
- cronでまわすと、強制的にダウンされてしまい、業務作業中だった場合にアップさせるのが面倒
- SubotがHubotに話しかけると楽チン！

![スクリーンショット 2016-06-22 14.41.14.png](https://qiita-image-store.s3.amazonaws.com/0/1676/2f28fedd-d698-8561-3db7-0805b36aba3d.png)

---

## QA
質問やご提案あればご遠慮なく！

---

## ディスカス

- ChatOps, DevOps環境を30秒LT大会(max10人)
- ちょっとでもうちはこういうの工夫してるなーというのが思い浮かんだ方、挙手
    - TODO: ここにハンドルネームを書いていく。あとでメモしてアップする。アップして欲しくない方のは消す
SSLについて【メモ】

# 公開鍵暗号方式
**秘密鍵**と**公開鍵**を使用した方式。

* **秘密鍵**：自分だけが知っている鍵
* **公開鍵**：みんなに配る鍵

## 特徴
* **公開鍵**を使って暗号化したデータは**秘密鍵**で復号化できる
* **秘密鍵**を使って暗号化したデータは**公開鍵**で復号化できる

## 使い方
1. データ受信側(サーバ等)が**公開鍵**を配布
2. データ送信側(クライアント等)は**配布された公開鍵**を使って暗号化い、送信
3. データ受信側が持っている自分の**秘密鍵**で復号化


## 暗号化方式
### ■RSA方式
素因数分解を使った方式。
1024ビットの鍵(SHA-1というハッシュ関数を使用)が使われていたが、最近では解読される恐れがでてきたため、2048ビットの鍵(SHA-2というハッシュ関数を使用)が使われるようになっった。

### EC-DSA方式
楕円曲線を使った方式。

# 認証局と証明書
公開鍵が正しいことを証明するため、**認証局**の公開鍵をくっつける必要がある。
それらの公開鍵はそれぞれの端末に予めインストールされている。(Webブラウザとか)

## やりかた
1. 自分たちの公開鍵を認証局の秘密鍵で暗号化してもらう→**証明書**
2. 証明書を使用して通信を行う
3. 内蔵された秘密鍵で証明書を復号化する

復号化できなかった場合は偽装されているってことになる。

# 共通鍵暗号方式
公開鍵暗号方式が遅いため、暗号と復号で同じ鍵を使用する**共通鍵暗号方式**が使われることがある。
鍵のやり取りだけ公開鍵暗号方式、他の通信は共通鍵暗号方式が使われることがある。

# TLS
## POODOLE
2014年に起きたSSLの脆弱性問題。
プロトコル自体に問題があるので、SSLではなくTLSが使用することが勧告された。
TLSはSSLの後継であるため、基本的には同じ。今ではほぼTLSへ移行が完了しているハズ……。
(TLSの方が古いと思っていてすまんな)

# 実際の使用方法
1. 秘密鍵を作成
2. 証明書生成のための依頼データ(CSR)を作成
3. 証明書の発行依頼をする
4. 証明書をインストールする

自分メモ：もしかしたら前にやったことがあるので、もう少し詳しくまとめる…かもしれない。
pyenv 利用のまとめ


最近、pyenv を利用してpythonを使っているけど、 pyenv / pyenv-virtualenv の利用方法を毎回調べるのが大変だったので、メモ。

## pyenv インストール for mac
パッケージインストール

```
$ brew install pyenv
$ brew install pyenv-virtualenv
```

設定の追加

```
$ echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bash_profile
$ echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bash_profile
```

## pyenv 利用方法まとめ

#### インストール可能なバージョン一覧の確認

```
 $ pyenv install --list
```

#### インストール

```
$ pyenv install 3.5.1
```

#### 現在のバージョン確認

```
$ pyenv version
```


#### インストール済みのバージョン一覧確認

```
$ pyenv versions
```

#### 全体で利用するバージョンの設定

```
$ pyenv global 3.5.1
```

#### 特定のディレクトリ配下のみ利用するバージョンの設定

```
$ cd PROJECT_DIR
$ pyenv local 2.7.11
$ pyenv version
Python 2.7.11
$ cd ..
$ pyenv version
Python 3.5.1
```

## pyenv-virtualenv 利用方法まとめ

#### バージョン指定で virtualenv 作成

```
$ pyenv virtualenv 2.7.11 sandbox27
```

#### current のバージョンで virtualenv 作成

```
$ pyenv version
Python 3.5.1
$ pyenv virtualenv sandbox35
```

#### 存在している virtualenv の確認

```
$ pyenv virtualenvs
```

#### virtualenv の有効化

```
$ pyenv activate <name>
```

#### virtualenv の無効化

```
$ pyenv deactivate
```
Django 1.9 で国際化対応

#環境
Ubuntu 14.04.4 LTS
Python 3.5.1
Django 1.9.7

#前提条件
- Djangoが日本語環境で動いていること

以下の手順を行うことで、翻訳ファイルを用意すればブラウザの言語環境に合わせて、言語が自動選択されるようになります。

*追記：[Django1.9 で表示される言語を切り替える](http://qiita.com/gsd/items/909fc239f4cbf7bdb9ec)
こちらの手順を行うことで、言語をpathで切り替えることができるようになります。*

#手順

##settings.pyの変更

- MIDDLEWARE_CLASSES に 
    ```
    'django.middleware.locale.LocaleMiddleware',
    ``` 
  を追記
- ファイルに以下を追記

    ```python:settings.py
    LOCALE_PATHS = (
        os.path.join(BASE_DIR, 'locale'),
    )
    ```

##templateの変更
- `{% load i18n %}` を追記
- 翻訳したい箇所を `{% trans 'hoge' %}` のように変更
    - 翻訳データがない場合には`hoge`が表示されます


##翻訳リストファイルの作成
- コマンドラインで以下を実行（英語から日本語の場合）

    ```
    mkdir /DJANGO_BASE_DIR/locale
    django-admin.py makemessages -l ja
    ```
    - 実行すると `/DJANGO_BASE_DIR/locale/ja/LC_MESSAGES/django.po` が作成される

- 生成されたdjango.po の編集

    ```python:django.po
    #: path/to/template/index.html:4
    msgid "hoge"
    msgstr ""
    ```

    このようにtemplateで ` {% trans 'hoge' %}` 等と指定した箇所のファイル名と行番号を含めたファイルが用意されるので、 msgstrに翻訳後の文字列を指定します。

##翻訳ファイルのコンパイル
- コマンドラインで以下を実行

    ```
    python manage.py compilemessages
    ```
    - 実行するとコンパイル済みの `/DJANGO_BASE_DIR/locale/ja/LC_MESSAGES/django.mo` が作成される

##追記：言語設定検出の優先順位（公式ドキュメントの内容を転記）

1. はじめに、リクエストされた URL に言語プレフィックスを探します。これはルート `URLconf` で `i18n_patterns` 関数を使った場合だけ行われます。 参照：[Django1.9 で表示される言語を切り替える](http://qiita.com/gsd/items/909fc239f4cbf7bdb9ec)

2. 現在のユーザのセッションに `django_language` キーがない か探します。

3. クッキーを探します。クッキーの名前は `LANGUAGE_COOKIE_NAME` 設定の値がセットされます。 (デフォルトの名前は `django_language` です。)

4. Accept-Language HTTP ヘッダを見ます。このヘッダは ブラウザから送られ、ユーザの望む言語を優先度順に伝えます。 Djangoは利用可能な翻訳が見つかるまで、渡された全ての言語を調べます。

5. それも失敗したら、グローバルな `LANGUAGE_CODE` 設定を使います。
【メモ】FFMPEGのIOSライブラリビルド

#GOOGLEで検索した結果、なかなかBUILDできなかったのでメモっておく(ただし使えるかは未確認)。

######[gas-preprocessor.pl](https://sourceforge.net/p/libjpeg-turbo/bugs/73/)を参照してgas-preprocessor.plをダウンードする。

```bash:console
wget https://raw.githubusercontent.com/libav/gas-preprocessor/master/gas-preprocessor.pl
```

######[gitで公開されているFFmpeg-iOS-build-script](https://github.com/kewlbear/FFmpeg-iOS-build-script)からbuild用のスクリプトを取得する。

```bash:console
git clone https://github.com/kewlbear/FFmpeg-iOS-build-script.git
```
ruby JSON.parse

https://www.driftingruby.com/episodes/playing-with-json

```rb
require 'net/http'
require 'json'

url = 'http://jsonplaceholder.typicode.com/posts/1'
uri = URI(url)
response = Net::HTTP.get(uri)
standard = JSON.parse(response)
symbol =  JSON.parse(response, symbolize_names: true) #让key为symbol类型的,默认是string
struct = JSON.parse(response, object_class: OpenStruct) #默认是hash,转为openstruct,ruby2.0以后才可以

symbol[:name] = 'kobaltz'
struct.name = 'kobaltz'
struct.marshal_dump

require 'httparty'
require 'json'
url = 'http://jsonplaceholder.typicode.com/posts/1'
response = HTTParty.get(url)

standard = JSON.parse(response.to_json)
struct = JSON.parse(response.to_json, object_class: OpenStruct)
symbol =  JSON.parse(response.to_json, symbolize_names: true)
struct.marshal_dump #把openstruct重新转为hash
```

让ruby可以parse empty的json

http://stackoverflow.com/questions/3552328/nil-to-json-cannot-be-parsed-back-to-nil

带上这个参数就不会报错了

```rb
>> nil.to_json
=> "null"
>> JSON.parse("null", {:quirks_mode => true})
=> nil
```

ActiveSupport::JSON.decode实现就是这样的 http://api.rubyonrails.org/classes/ActiveSupport/JSON.html#method-c-decode
mock-local-storage を使って Web Storage のテストをちゃちゃっと書く


Web Storage すなわち、 localStorage / sessionStorage を用いた機能のテストを手軽に書く話です。
Web Storage 自体はブラウザネイティブな機能なので動いて当たり前なんだけど、「Web Storage を用いる」という実装仕様はテストに書いておきたいのです。  
すぐに思い付くのは Sinon.js で spy したり、ヘッドレスブラウザで環境を再現する、などの方法でしょうか。  
しかし今回は、より手軽に Web Storage をモックしてくれるパッケージを使います。  

## mock-local-storage
使用するパッケージはこちら。
mocha で利用できます。
https://github.com/letsrock-today/mock-local-storage
> Mock lodcalStorage for headless unit tests
> Inspired by StackOverflow answers and wrapped into rpm package to be used with mocha.


### インストール
```Bash
npm install mocha mock-local-storage babel-register --save-dev
```
※ mocha 本体と babel 関連は環境に応じて適切に。

### テストコマンド
```Bash
mocha --compilers js:babel-register -r mock-local-storage
```
※ 上記インストールコマンドのように mocha をローカルインストールした場合は ```npm run-script``` 経由などで起動させる。

### mocha.opts
自分の場合はテストを WebStorm から立ち上げたいので、 mocha の起動オプションは ```mocha.opts``` に書き出しています。

```ini:mocha.opts
--compilers js:babel-register --require mock-local-storage
```

## モジュールとテストコード
良くある Web Storage を用いる機能といえば localStorage からデータを呼び出す処理を Promise でラップしてあるものでしょうか。
例えば以下のようなモジュールです。

```JavaScript:src/storage.js
export function loadDataFromLocalStorage(key = '') {
  return new Promise((resolve, reject) => {
    const loaded = localStorage.getItem(key);
    if (loaded !== null) {
      resolve(loaded);
    } else {
      reject(new Error('Not Found'));
    }
  });
}
```

このモジュールに対するテストコードは以下のようになります。

```JavaScript:test/test.js
const assert = require("power-assert");
import { loadDataFromLocalStorage } from '../src/storage.js';

describe('loadDataFromLocalStorage', () => {
  const KEY   = 'knownKey';
  const VALUE = 'value';

  beforeEach(() => {
    localStorage.setItem(KEY, VALUE);
  });

  afterEach(() => {
    localStorage.clear();
  });

  it('should be DONE when load data from localStorage by KNOWN-KEY', () => {
    return loadDataFromLocalStorage(KEY)
      .then((response) => {
        assert.equal(response, VALUE);
      });
  });

  it('should be FAILED when load data from localStorage by UNKNOWN-KEY', () => {
    return loadDataFromLocalStorage('unknownKey')
      .catch((error) => {
        assert.equal(error.message, 'Not Found');
      });
  });
});
```

Promise と localStorage を使っているのでテストを書くのはちょっと面倒に思えますが、 mocha と mock-local-storage を用いればとても簡単です。
mock-local-storage は mocha の起動オプションで依存注入させているので、テストファイルを複数に分けたとしてもどこからでも Web Storage のモックを利用することができます。
わざわざ自前でモックを書かなくて良いのでちゃちゃっとテストを書くことができました！
TCPとかそのへんについて【メモ】

メモ

# TCP
相手にデータが届いたかどうかを確認しながら送信する。
エラーが出たら再送。

# UDP
相手にデータが届いたどうかを確認しないで送信する。
エラーが出ても再送しない。
エラーチェックがないので高速。
1対多の通信(ブロードキャスト通信)に向いている。

# ポート
通信が混ざらないように使用する。
同じポートで通信できにように、同ポートで使用できないように排他制御する。

## ウェルノウンポート
80がHTTPとか、決められたポート番号のこと。
(別に必ずそれを使うときにはポートが固定化されるとか、そういうことではない)

## エフェメラルポート
未使用のランダムなポート番号。よくクライアント側で使われる。
A列やB列のようなアルファベットを数値に変換する

こんにちは。
昨日は夏至だったようですね。ずっと会社にいたので関係ないですけどw


さて、今回は「列番号を数値に直す」という機能をご紹介いたします。

具体的にどういうことかと言いますと、
エクセルやhandsontableなどの「列」は「A」や「DU」のように英語で表示されますよね。
その「A」や「DU」を数値に変換する。ということです。

これにより、表を参照せずに、DBなどに登録してあるデータから参照することが可能になる気がします。

コードは下記のものになります。

```php
function conversion_column($column)
{
  //文字列を反転する
  $column = strrev($column);
  //1文字ずつ切ったものを配列に格納
  $arr_column = str_split($column);
  for($i = 0; $i < count($arr_column); $i++) {
    //ord関数を使い数値にし、-64することで列番号になる
    //26進数なので26の累乗をかける
    $column_num += (ord($arr_column[$i]) -64) * pow(26, $i);
  }
  return $column_num;
}
```


補足
ちなみに、handsontableならほんの少しだけ改良が必要です。

```php
function conversion_column($column)
{
  //文字列を反転する
  $column = strrev($column);
  //1文字ずつ切ったものを配列に格納
  $arr_column = str_split($column);
  for($i = 0; $i < count($arr_column); $i++) {
    //ord関数を使い数値にし、-64することで列番号になる
    //26進数なので26の累乗をかける
    $column_num += (ord($arr_column[$i]) -64) * pow(26, $i);
  }
  return $column_num -1;
}
```

違いがお分かりになりますでしょうか。
最後の「return $column_num -1;」の箇所です。
handsontableは0番目から始まるため「-1」が必要となります。


ご質問・ご指摘・感想等ございましたら、コメントください。
linuxにMPLAB-Xをセットアップ

ひさびさにPICを使おうと思い立ったけど、前はWINDOWSでやっておりました
今は自由に使えるPCがlinuxなので出来るのかどうか調べると出来そうなのでメモ。

本家（ http://www.microchip.com/mplab/mplab-x-ide ）からlinux用のMPLAB-Xを
ダウンロード

MPLABX-v3.30-linux-installer.tarがダウンロードされるので、

tar -xf MPLABX-v3.30-linux-installer.tar

で展開。MPLABX-v3.30-linux-installer.shが出来ます

sudo sh MPLABX-v3.30-linux-installer.shでインストラーが起動してインストール開始。（/optに入ります）

次にここから（ http://www.microchip.com/mplab/compilers ）コンパイラを
ダウンロード（勝手にブラウザが開いたような・・）。

XC8,XC16,XC32とありますが、PICの種類によって選べばいいのかな。。

ちなみにXC8を選ぶと下記のファイルがダウンロードされます

xc8-v1.37b-part-support-linux-installer.run

sudo ./xc8-v1.37b-part-support-linux-installer.runでインストーラーが起動してインストール開始。

（※sh xc8-v1.37b-part-support-linux-installer.runとするという記事も見ましたが
　　")"が変なとこにあるよというエラーが出て動きませんでした。）

これでとりあえず起動は出来ました。手持ちのライターが秋月のやつなので実際に書けるかどうか試していません
DNSについて【メモ】

DNSについてメモ。

# ドメインの階層化

こんな感じのドメインがあった場合。

```
www.XXXXXXX.co.jp
```

第１セグメント：`jp`
第２セグメント：`co`
第３セグメント：`XXXXXXX`
第４セグメント：`www`

となる。
第１セグメントを**TLD**(**T**op **L**vel **D**omain)といい、ドメイン名を管理する団体(レジストラ、ドメイン事業者)を表している
どの団体が管理しているかはIANA(IPアドレス管理してるとこ)のサイトで確認できる。
使用する場合はその団体に申し込む(未使用でないと申し込んでも使用できない)。
お名前.comとかで申し込むのが簡単だと思いマッスルマッスル。

第４セグメントの`www`は慣例であり、なんでも使ってOK。

# DNSサーバ
サーバなどの名称としてドメイン名を使う場合、そのドメイン名を**ホスト名(hostname)**と呼ぶ。

所有ドメインが`aaaa.co.jp`の場合、`www.aaaa.co.jp`というサーバ名をつけると、`www`が**ホスト名**、`www.aaaa.co.jp`を**完全修飾ドメイン名(FQDN)**という。

完全修飾ドメイン名を使ってサーバにアクセスするには、それに対応するIPアドレスを返す**DNSサーバ**が必要。


※ドメイン名はサーバだけじゃなくメールアドレスでも使えるらしい。
※1台のWebサーバで複数ドメインを設定することができる。この構成をバーチャルドメインという。(クライアントからGETメソッドで送信されたHostヘッダで振り分け)

## 仕組み

インターネットにある**ルートDNSサーバ**には「TLD(coとかjpとか)を担当するDNSサーバがどれか」という情報が入っている。インターネットにDNSサーバを立てる場合は、TLDの担当しているDNSサーバに登録する必要がある。
参照するときは、最寄りのDNSサーバ→ルートDNSサーバへと参照する。
DNSサーバにはキャッシュがされているので、最寄りのDNSにキャッシュした内容がない場合に、ルートDNSサーバへ参照しにいく。(あればしない)


# ドメイン運用の仕方
1. ドメイン名の取得。
2. DNSサーバ構築。
3. ルートDNSサーバから辿れるようにする。
Android Studioのビルドを少し早く出来た

# 背景
Android Studioのビルド時間を少し改善出来たので、メモ書き。

# 確認環境
* プロジェクト
    * Multi-Dexしないとビルド出来ない位のソースコード量
* PC
    * Macbook Air
        * CPU：Core i5 1.6GHz
        * RAM：8GB

# Gradleについて
## DexOptions
仕事だとあまりtoolやpluginのアップデートを積極的に行えなかったりする(のに甘えて)ものでそんなに[Android Plugin DSL Reference](http://google.github.io/android-gradle-dsl/current/)を見ていなかったのですが、DexOptionsを見たらこんなのが用意されてました。

* [dexInProcess](http://google.github.io/android-gradle-dsl/current/com.android.build.gradle.internal.dsl.DexOptions.html#com.android.build.gradle.internal.dsl.DexOptions:dexInProcess)

要するに時間の掛かるdex compileを別プロセスで実行することでgreatな感じにパフォーマンスが良くなる、ってことと理解しました。まだ試験段階ってことらしいですが、今回はこちらを試してみました。

## 試した設定
dexInProcessを有効にしてあります。ビルドしているとXmx8192mに設定しなさいって怒られたので、gradle.propertiesの設定も合わせて設定してます。

```groovy:{module}/build.gradle
dexOptions {
    javaMaxHeapSize "2g"
    dexInProcess true
}
```
```groovy:{project_root}/build.gradle
dependencies {
    classpath 'com.android.tools.build:gradle:2.1.2'
}
```
```text:gradle.properties
org.gradle.jvmargs=-Xmx8192m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8
```
## 試したtask
普段開発してるときに一番使ってるであろうflavorのdebug assembleで試しました。
1回目は少し時間かかるので、何回か実行してみて慣らしが効いた状態での効果を確認しました。

```text:実行コマンド
gradlew clean assemble{Flavor}Debug
```

# 結果(と所感)
ビルドした結果今まで1分は確実に掛かっていたビルドが40秒程度まで早くなりました。
この辺りはjavaMaxHeapSizeやmaxProcessCountとか、そもそものPCスペックも影響すると思うので、探り探りで環境に合った設定をしてあげる必要がありそうです。
配列初期化～追加のいろいろ？


## はじめに
Javaで**メモリを無駄にしない**リストの初期化および追加方法を
学んだので、メモとして残します！

## 様々な初期化のやり方
調べてみると初期化～追加のやり方って様々な方法があるんですね。
ちょっと抜粋して３つほど記載します。

#### １．一般的(よく見る)
```java
List<String> list = new ArrayList<String>();
list.add("No.1");
list.add("No.2");
list.add("No.3");
```

#### ２．初期値を入れる(インスタンスイニシャライザを使う)
```java
List<String> list = new ArrayList<String>(){
    {
        add("No.1");
        add("No.2");
        add("No.3");
    }
};
```

#### ３．初期値を入れる(asList)
これは、注意が必要なやつですね。
指定された配列に連動する固定サイズのリストを返します。
そのため、要素の追加や削除ができません。(UnsupportedOperationException)
addとか書いてもコンパイルは通るので、落とし穴になりがちです。

```java
List<String> list = Arrays.asList("No.1", "No.2", "No.3");
```
なので、以下のようにすることで１・２同様のリストが作れます。
```java
List<String> list = new ArrayList<String>(Arrays.asList("No.1", "No.2", "No.3"));
```


## メモリの無駄がないのはどれだ？
メモリ効率に注目して見ましょう。

#### 引数なしの場合
```java
List<String> list = new ArrayList<String>();
```
上記のようにした場合、デフォルトで初期容量10の配列を作ります。

#### 引数ありの場合(initialCapacity)
コンストラクタにサイズ(initialCapacity)を渡すことができます。
```java
List<String> list = new ArrayList<String>(3);
```
これで必要な数の初期容量を持ったリストが作成されます。

#### 引数ありの場合(配列を渡した場合)
```java
List<String> list = new ArrayList<String>(Arrays.asList("No.1", "No.2", "No.3"));
```
この場合は引数で渡された要素数を利用して、
必要な数の容量を持ったリストが作成されます。

## まとめ
無駄がないのは、以下２点だと思います。
1. 引数ありの場合(initialCapacity)
2. 引数ありの場合(配列を渡した場合)

私は、
```java
List<String> list = new ArrayList<String>(Arrays.asList("No.1", "No.2", "No.3"));
```
を使うことにしました＼(^o^)／
Node.jsでEcmaScript6に手を出した話

ブラウザの対応状況などから手を出すのを控えていたECMA Script6ですが、
「Node.jsだったらクライアントのこと気にせず使えるし、v6.0以降ならほぼ対応してるしいけるやん!」と思ったらいきなり躓いたお話です。

# ECMA Script6の対応状況
まずはこちらを
[ECMA SCriptの対応状況](https://kangax.github.io/compat-table/es6/)
各ブラウザの対応はだいぶ進んでるようです。
IEはあきらめたほうがいいでしょう。

# Node.jsをECMA Script6で動かしてみる


## Node.jsのバージョン
nodistを使ってるので、まずはNode.jsのバージョンを上げておきます。
`nodist v6.2.1`

## テスト用のアプリ作成
テスト用のアプリはexpressでサクッと用意することにします。
`express ecma6`
我ながら非常にシンプルで素敵なネーミングです。

自動で作成されたコードをECMA Script6に書き換えてみます

```js:bin/www
#!/usr/bin/env node
'use strict';

/**
 * Module dependencies.
 */

import app from '../app';
import debugServer from 'debug';
const debug = debugServer('ecma6:server');
import http from 'http';

/**
 * Get port from environment and store in Express.
 */

const port = normalizePort(process.env.PORT || '3000');
app.set('port', port);

/**
 * Create HTTP server.
 */

const server = http.createServer(app);

/**
 * Listen on provided port, on all network interfaces.
 */

server.listen(port);
server.on('error', onError);
server.on('listening', onListening);

/**
 * Normalize a port into a number, string, or false.
 */

function normalizePort(val) {
  let port = parseInt(val, 10);

  if (isNaN(port)) {
    // named pipe
    return val;
  }

  if (port >= 0) {
    // port number
    return port;
  }

  return false;
}

/**
 * Event listener for HTTP server "error" event.
 */

function onError(error) {
  if (error.syscall !== 'listen') {
    throw error;
  }

  let bind = typeof port === 'string'
    ? 'Pipe ' + port
    : 'Port ' + port;

  // handle specific listen errors with friendly messages
  switch (error.code) {
    case 'EACCES':
      console.error(bind + ' requires elevated privileges');
      process.exit(1);
      break;
    case 'EADDRINUSE':
      console.error(bind + ' is already in use');
      process.exit(1);
      break;
    default:
      throw error;
  }
}

/**
 * Event listener for HTTP server "listening" event.
 */

function onListening() {
  let addr = server.address();
  let bind = typeof addr === 'string'
    ? 'pipe ' + addr
    : 'port ' + addr.port;
  debug('Listening on ' + bind);
}

```

他のjsも同様に書き換えます。

そして実行
`npm start`

すると、
![キャプチャ.JPG](https://qiita-image-store.s3.amazonaws.com/0/116434/b0c18ebb-715c-04fc-b69e-ac833a01b726.jpeg)

ファッ!?
importに対応してないの!?

## 聳え立つBabelの塔
途方に暮れてググッてみると[このサイト](http://blog.shaunxu.me/2016-05-20-import-export-in-es6-with-babel/)に行き着きました。
こちらではBabelを使ってこの問題に対処したということで、倣ってBabelを導入してみます。

無事に動くようにはなりましたが、
「ん？BabelってES6をES5に変換するんだから、NodeがV6.0以降である必要なくね？」

案の定、v5系に落としてみても動作に変わりなし。
なんとも煮え切らない結果ですが、Babelはすごいということがわかりました。
BigQuery | TABLE_DATE_RANGE テーブルに対して JOIN 出来ない

# 問題

TABLE_DATE_RANGE はそのままじゃ JOIN できないっぽい。

```sql
SELECT
  *
FROM
  TABLE_DATE_RANGE(single.woman, TIMESTAMP('2016-12-24'), TIMESTAMP('2016-12-25') ) AS woman
LEFT JOIN
  [single.man] AS man
ON
  woman.left_hand = man.right_hand
```

`Error: Field 'woman.left_hand' not found.`

# 解決

サブクエリの内側に TABLE_DATE_RANGE を置く。

```sql
SELECT
  *
FROM (
  SELECT
    *
  FROM
    TABLE_DATE_RANGE(single.woman, TIMESTAMP('2016-12-24'), TIMESTAMP('2016-12-25') ) AS woman
LEFT JOIN
  [single.man] AS man
ON
  woman.left_hand = man.right_hand
```








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
【Facebook】Graph API アップグレードのお知らせ（8月8日まで）

今朝、Facebook から管理人宛に、「2016年8月8日で Graph API v2.0
までの期限が切れるので、v2.1 以上にアップグレードしてねー」という旨のメールが届きました。

メール内には「アップグレードツール」のリンクも。~~あり、HTML を触らなくても手軽に対応できるようです。~~
https://developers.facebook.com/tools/api_versioning/【アプリID】

![facebook160622.jpg](https://qiita-image-store.s3.amazonaws.com/0/6168/72eddb0c-cb6c-6cd8-b22e-73c7bc603ec1.jpeg)

（連絡があった Facebookページは、すべて v2.1 以上で設定していたため、対応する必要がありませんでした。）
~~（対応が必要な場合、「アップグレード」ボタンなどが表示されるのでしょうか？ ※未確認）~~
「簡単にチェックできるよ！」というツールなので、自分で書き直す必要があります。


2014年4月30日に「v2.0」がリリースされた前後に設置されたページは v2.0 以下の可能性が高いので、長く更新していない・設置だけをお手伝いして先方が運用されているなどのページをお持ちの方は、ご確認されるとよいのではないかと思います。

　
※ちなみに、現在の最新版は ~~「v2.6」~~「v2.7」だそうです。（いつの間にー！）
https://developers.facebook.com/docs/graph-api?locale=ja_JP


###（2016.06.28追記）
『v2.1以上だから大丈夫』って安心してたけど、
調べてみたら「v2.1」も実は使用期限が迫っているので、チェックしといた方がよさそう。
v2.1 ： 2014年8月7日リリース / 使用期限 2016年10月30日


###（2016.07.28追記）
今、たまたま新しいアプリ作ったら、新しいバージョンがリリースされてたので更新。
v2.7 ： 2016年7月13日リリース / 使用期限 At least until July 2018


###（2016.07.29追記）
改めて調べ直して記事にまとめました。（諸々間違ってた...）

●Facebook Graph API アップグレードのお知らせ
　（v2.0の使用期限：2016年8月7日まで） ｜ Tips Note by TAM
http://www.tam-tam.co.jp/tipsnote/html_css/post10435.html

###（2016.08.03追記）
社内の複数の方から質問を受けたり、ツッコミをいただきました。
「Facebookページ」だけでなく、以下のものも対応が必要では？ とのこと。
これは...結構、影響範囲大きい...。

- 「いいね！ボタン」
- page plugin（元likebox）

※「シェアボタン」と、一部の「いいね！ボタン」は記述方法によっては対応不要です。


###（2016.08.04追記）
毎回毎回、細かいアップグレードに対応するのは現実的ではないので、今までの流れから対応方法を整理してみた。（何も問題が起こりませんように...）
　
【8/7までにすること】
8/8に何か変化があった場合にすぐ対応できるように、あらかじめ対象となるデータをまとめておく。

【8/8に何もなければ...】
通常 90日間の移行期間があるはずなので、11月までに対応する。

【11月上旬を過ぎても問題なければ...】
2015年4月30日有効期限終了前の「v1.0」もまだ動いているので（※アプリは未確認）、このまま何もしなくても大丈夫かも。。。
（「v1.0」→「v2.0」対応をしないと「いいね！ボタンが動作しなくなる！」と言われていた。）

【次回メジャーアップグレード時に対応する】
だいたい 3ヶ月おきにマイナーバージョンがリリースされるので、「v3.0」は 2017年4月頃の予定。大幅にリニューアルされることも予想されるので、そこで一気に対応する。
指定されたディレクトリ以下の*.h *.cppファイルをUTF-8 BOMあり・CRLFで統一する

外部のソースコードを自分のプロジェクトに取り込む際にUTF-8 BOM追加と改行コードをCRLFで統一する必要があったので書いてみました。
[nkf32.exe](http://www.vector.co.jp/soft/win95/util/se295331.html) にパスが通っている cygwin 上で動作確認しています。

```bash:add-UTF8BOM-CRLF-to-h-cpp.sh
#!/bin/bash

if [ $# -ne 1 ]; then
	echo "Adds UTF-8 BOM to *.h and *.cpp below the specified dir." 1>&2
	echo "Usage: add-UTF8BOM-CRLF-to-h-cpp.sh [dir]" 1>&2
	exit 1
fi

find $1 \( -name '*.h' -or -name '*.cpp' \) | while read -r d;
	do nkf32 -w8OLw $d $d.hoge && mv -v $d.hoge $d;
done;

exit 0
```

逆にBOMを削除したい場合は nkfwin32 のコマンドラインオプションを以下のように"0"を追加します。
> 変更前: ``-w8OLw``
> 変更後: ``-w80OLw``

なお、上記スクリプト作成の際には、[こちら](http://ameblo.jp/pclindesk/entry-10131168430.html)の記事と[こちら](http://shellscript.sunone.me/parameter.html)を参考にさせて頂きました。ありがとうございます。
ruby ObjectSpace define_finalizer

ObjectSpace also provides support for object finalizers, procs that will be called when a specific object is about to be destroyed by garbage collection.

当被垃圾回收销毁时就执行这个proc
http://ruby-doc.org/core-2.2.0/ObjectSpace.html#method-c-define_finalizer

```rb
a = "A"
b = "B"

ObjectSpace.define_finalizer(a, proc {|id| puts "Finalizer one on #{id}" })
ObjectSpace.define_finalizer(b, proc {|id| puts "Finalizer two on #{id}" })
```

```rb
Finalizer two on 537763470
Finalizer one on 537763480
```

必需要是嵌套proc

```rb
a = "A"
b = "B"

c = proc do |id|
	proc do
		puts "Finalizer one on #{id}"
	end
end

ObjectSpace.define_finalizer(a, c[a.object_id])
ObjectSpace.define_finalizer(b, c[b.object_id])
```

```rb
a = proc do |b|
	puts b
end

a[12]
```

http://strugglingwithruby.blogspot.com/2009/02/ruby-proc.html

```text
Instead of using call, you can invoke the code using square brackets notation. The following are equivalent:
multiply.call(4, 3)
multiply[4, 3]
```

https://github.com/rails/rails/blob/52ce6ece8c8f74064bb64e0a0b1ddd83092718e1/actionview/lib/action_view/template.rb#L117-L125

https://github.com/rails/rails/blob/52ce6ece8c8f74064bb64e0a0b1ddd83092718e1/actionview/lib/action_view/template.rb#L310
パラメータクエリで同じ値を複数回使用したい

## はじめに

~~毎度おなじみのダサダサ Tips です。~~

※追記：ダサいと思ったのですが、デバッグに便利だったため多用しています。

- パラメータクエリ内で同じ値を複数回使用するのに、同じ値を複数回引数で渡すのはバカバカしい。
- クエリ内から ```?``` を探すのがたいへん。
- 渡す順番を間違えそうなくらい [^1] クエリが複雑になってしまった。

そんなときは~~設計しなおしたほうが...~~以下のように共通テーブル式で変数みたいなものを作って使います。

[^1]: これだけなら「名前付き」で解決できますが...。

## サンプル

```sql

WITH Params AS (
    SELECT
        ? AS keyDate -- <- パラメータクエリに渡す引数はこれだけ
    FROM DUAL
)
SELECT
    EventName
FROM EventsSchedule, Params
WHERE 1=1
    AND StartDate <= Params.keyDate -- <- ここと...
    AND Params.keyDate <= EndDate   -- <- ここで使っています

```

## おわりに

.NET + Oracle のハナシです。
絶対になんか他のやり方があるような気がしていろいろ試したのですがうまくいかなかったので...。ご存知のかた、いらっしゃいますか？

PHP + PostgreSQL はこんなことしなくても良かったです。同じプレイスホルダを使えば同じ引数が渡っていきました。
トランザクション内での考え方

トランザクションは不可分な処理をまとめるので、

```rb
ActiveRecord::Base.transaction do
  A.save!
  B.save!
  C.save!
end
```

は、順番を変えて

```rb
ActiveRecord::Base.transaction do
  C.save!
  B.save!
  A.save! # <= save!と書いたがロングラニング特有のWeb　API操作と考える
end
```

としても最終的に同じことである。本当のソースはこれほど簡略化できないので同じことではないことも多いが、入れ替えても同じである場合、柔軟に入れ替えることで、エラーになりそうな所を早めに`save!`で確認して無駄な後続処理をしなくて済むようにしたり、その逆に、エラーになりそうなところは最後まで処理をしないで、失敗したら巻き戻すなどのテクニックが使える。後者は、ロングラニングトランザクションで有効といえそうである。
erb result with binding

http://stackoverflow.com/questions/1338960/ruby-templates-how-to-pass-variables-into-inlined-erb

```rb
require 'erb'
require 'ostruct'

namespace = OpenStruct.new(name: 'Joan', last: "Maragall")
template = "Name: <%= name %> <%= last %>"
result = ERB.new(template).result(namespace.instance_eval { binding } )
puts result
```

```rb
require 'erb'

class Namespace
  def initialize(hash)
    hash.each do |key, value|
      singleton_class.send(:define_method, key) { value }
    end 
  end

  def get_binding
    binding
  end
end

template = 'Name: <%= name %> <%= last %>'
ns = Namespace.new(name: 'Joan', last: 'Maragall')
puts ERB.new(template).result(ns.get_binding)
```

rails里面
https://github.com/rails/rails/blob/7f6af4b6274f2816ee8aa1dda7863b7d7f93d02f/activerecord/lib/active_record/fixtures.rb#L1040

https://github.com/rails/rails/blob/a26a3a075637215c9028308436ca89cba8da2ed5/activerecord/lib/active_record/fixture_set/file.rb#L63

https://github.com/rails/rails/pull/13022
mysqlコマンドのpagerの利用



# 利用方法

MySQL利用している時に、lessなどのLinuxのコマンド取り入れると、効率を大幅に向上になるでしょう！下記の例でみてみましょう

```
mysql> pager less 
PAGER set to 'less' 
mysql> show engine innodb status\G
```
---

大規模なデータselectの結果をprintしたい場合

```
mysql> pager cat > /tmp/test.log
PAGER set to 'cat > /tmp/test.log'
```
---
checksumを利用して、SQLの変化あるかどうか、確認可能

```
mysql> pager md5sum 
PAGER set to 'md5sum' 

mysql> SELECT ... 
d1036606f00f07b96c7c141bd41576bd  -
```
---

selectの実行時間のみ知りたい場合

```
mysql> pager cat > /dev/null 
PAGER set to 'cat > /dev/null'

mysql> SELECT ... 
1000 rows in set (0.91 sec) 
 
mysql> SELECT ... 
1000 rows in set (1.63 sec)  
```
---

集計したい場合も可能

```
mysql> pager awk -F '|' '{print $6}' | sort | uniq -c | sort -r
PAGER set to 'awk -F '|' '{print $6}' | sort | uniq -c | sort -r'

mysql> select ... 
      9  vodu0508
      8  vt002010
      6  vt002007
      6  vt002003
      5  vt002008
      5  vt002006
      4  12345678
      3  vt002005
      3  vodu0226
       ... 
```
[C++11] Use auto to bind a reference.

In the c++11, there is a new feature `auto`. With `auto` we could avoid type names that are clutter. The basic usage of `auto` just like this.

```cpp
vector<ClutterName> data; 
auto a = data[0];
```

Usually we use `auto` to initialize a variable by copying as described before. But if we want to bind a reference. We can do something like this:

```cpp
const auto& a = data[0];
```
OSXでExtended Attributesを除外してディレクトリ全体をコピーする

OSXでExtended Attributesを除外してディレクトリ全体をコピーするには、環境変数 **COPYFILE_DISABLE=1** をつけて tarを通して処理することで可能です。

	$ COPYFILE_DISABLE=1 tar cC '/Volumes/data' file.txt | tar xv

TimeMachineやなんかのディスクから直接コピーすると、EAがたくさんついている影響なのか普通のファイルのように扱うことができないようです。パーミッションなどが正しいのになぜか書き込み禁止のメッセージが出るときなどは、EAを消してみるとうまくいくかもしれません。

ls -al で最後に@がついているのは、Extended Attributesがついています。を確認するためには、xattrコマンドを使えばよいです。

	$ xattr file.txt

-l で詳細、-d で1つづつ消せます。
Javaは初期設定ではJITが停止して負荷が倍増する可能性がある

面白そうな記事を見つけたのでリンクだけ紹介させて下さい。
>Javaのパフォーマンスが劣化する謎の現象
CodeCacheの容量限界に近づくとJITコンパイラを停止してコンパイルしたコードを捨てる機能が原因だった 

Javaの謎のパフォーマンス劣化現象との戦い
http://blog.cybozu.io/entry/2016/04/13/080000
多段SSHでscp,rsync,gitを使う

# 多段SSHでscp,rsync,gitを使う

ファイアーウォールの中のSSHサーバに接続したい場合、ゲートウェイとなるSSHサーバを経由して接続することがよくあります。

その場合、ProxyCommandを使った多段SSHスクリプトを用意しておくといろいろなコマンドから利用できるのでとても便利です。

以下の例は、~/bin (ホーム直下のbinディレクトリ) にPATHが通っている前提です。

## 多段SSHスクリプト
小さなシェルスクリプトを書きます。

ゲートウェイとなるSSHの情報を設定します。以下の例はusername: username, host: gatewayの例です。

ProxyCommand ssh の後にはsshコマンドのオプションが使えますので、ポート番号が違う場合などは -p で指定できます。 

	$ vim ~/bin/hogessh

以下の内容を作成

	#!/bin/sh
	exec ssh -o "ProxyCommand ssh username@gateway -W %h:%p 2> /dev/null" $@

実行権限をつけます

	$ chmod 755 ~/bin/hogessh

## SSH接続

内側のネットワークで動作しているサーバへSSH接続します

	$ hogessh user@192.168.0.12

ゲートウェイとなるSSHサーバで名前解決できれば、クライアント側で名前解決できなくても独自の名前のホストに接続することができます。/etc/hostsにかくもよし、dnsmasqをつかうもよし。クライアント側の ~/.ssh/config をすっきりさせることができるかもしません。

	$ hogessh user@special-server

agent forwarding(-A)を使うと内部のサーバから手元のマシンの自分のSSHキーを使って直接GitHubにPushできたりするので便利です

	$ hogessh -A user@192.168.0.12
	$ cd very_nice_project
	$ vim README.md
	$ git commit -a "message" --author "user <email@address>"
	$ git push origin master

## scpを使う

**-S** に多段SSHスクリプトを指定します

	$ scp -S ~/bin/hogessh user@192.168.0.12:/home/user/thefile.txt .

## rsyncを使う

環境変数 **RSYNC_RSH** に多段SSHスクリプトを指定します

	$ RSYNC_RSH=~/bin/hogessh rsync -av user@192.168.0.12:/home/user .

または

	$ export RSYNC_RSH=~/bin/hogessh
	$ rsync -av user@192.168.0.12:/home/user .

## gitを使う

環境変数 **GIT_SSH** に多段SSHスクリプトを指定します

	$ GIT_SSH=~/bin/hogessh git clone user@192.168.0.12:/home/user/very_nice_project .

または

	$ export GIT_SSH=~/bin/hogessh
	$ git clone user@192.168.0.12:/home/user/very_nice_project .
ICカードの認証方式と耐タンパ性


# 耐タンパ性

耐タンパ性とは「所有者以外が許可無くいじろうとしても失敗する」性質

パスポートや運転免許証は耐タンパ性が高いと言われる（写真があったり、透かしがあったりなど）

一方で保険証は写真がないため耐タンパ性は低い

# ICカード

FeliCaとか

## ICカードの認証プロセス

基本的には公開鍵暗号の技術が使われている

* ICカード内に秘密鍵が入っている
* サーバーに公開鍵がある
* サーバーから暗号化して送られてきたデータをICカードの秘密鍵で復号
PHP isset, empty, is_null の違い早見表

# PHP isset, empty, is_null の違い早見表

|値|if($var)|isset|empty|is_null|
|:--|:--:|:--:|:--:|:--:|
|$var=1|**true**|**true**|*false*|*false*|
|$var="";|*false*|**true**|**true**|*false*|
|$var="0";|*false*|**true**|**true**|*false*|
|$var=0;|*false*|**true**|**true**|*false*|
|$var=NULL;|*false*|*false*|**true**|**true**|
|$var|*false*|*false*|**true**|**true**|
|$var=array()|*false*|**true**|**true**|*false*|
|$var=array(1)|**true**|**true**|*false*|*false*|

# 引用
http://d.hatena.ne.jp/sngmr/20080209/1202520832

# 参考リンク
http://qiita.com/mpyw/items/51bf42fe1ad8a7e535aa
SST/TLS


# SSL

## SSLとは

* 暗号化と認証の機能を提供しているセキュリティ通信のプロトコル
* トランスポート層〜セッション層において動作する
* TCPを利用したプログラムは殆どの場合はSSL通信に置き換えることができる

![ネットワーク層](http://kogures.com/hitoshi/webtext/nw-ip/taikei.gif)
（図: [http://kogures.com/hitoshi/webtext/nw-ip/index.html](http://kogures.com/hitoshi/webtext/nw-ip/index.html)）

* もとはネットスケープ社が設計したもの
* その後TLSとして標準化され普及した

## SSLと非SSLの区別

SSLと非SSL方法を区別する方法はいくつかある。例えばポート番号。

* httpはTCP80番
* httpsはTCP443番

# SSLの通信手段

SSLはハンドシェイクとデータ伝送の2ステップに分けることができる

## ハンドシェイク

サーバーを認証して暗号鍵を作るためのステップ

### ハンドシェイクの目的

* サーバーを認証する
* 暗号化アルゴリズムを決める
* 暗号化鍵とMAC鍵を作る

### 暗号化アルゴリズム

* SSLでは複数の暗号化アルゴリズムの使用が許可されている
* クライアントが候補を定時し、その中からサーバーが暗号化アルゴリズムを決定する

### 暗号化鍵とMAC鍵

* 互いに送り合った乱数とプレマスターシークレットと呼ばれるデタラメな文字列から作られる

## データの伝送

基本的にIPと同じシンプルなプロトコル
Aligned Bottomなレイアウトをソフトキーボードと一緒に上がらないようにする

# 
Bottom navigationがGoogle公認になっていました。

[Bottom navigation](https://www.google.com/design/spec/components/bottom-navigation.html?utm_content=bufferd574e&utm_medium=social&utm_source=twitter.com&utm_campaign=buffer#bottom-navigation-usage)

こういうViewを実現するとき、たとえば[この記事](http://qiita.com/numa08/items/1b6c3bf9d8377a7d7352)のようにTabLayoutなどを`android:layout_alignParentBottom="true"`としたりすると思います。

## キーボードが表示されると一緒に上がってきてしまう

しかし、そんなAligned Bottomなタブがあるレイアウトに、EditTextなどを配置していてソフトキーが表示されると、ソフトキーの上にタブが表示されてしまったりします！


そんな時は、この記事の回答にあるように

[Showing keyboard moves my components Overlay, i want to hide Bottom](http://stackoverflow.com/questions/22762490/showing-keyboard-moves-my-components-overlay-i-want-to-hide-bottom)

```:java
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);
```

とするだけで解決しました！
Windowに対する設定なのでActivityなどに記述すれば良さそうです。

何か他のレイアウトや挙動に影響があるかもしれませんが、その場合は追記します。