OmniAICreator/Qiita-1.07M huggingface dataset:
KotlinでGsonでパースした時の挙動の調査

Kotlin書いてて、基本的にはvalで宣言してかつ書けるのであればnon-nullな形で書いていくのが良い書き方だなぁと考えている。

data classでGsonを使ってパースした時に、non-nullな形で書きたい。
しかし、Jsonはnullとか、そもそもキーが欠落していたりとか、Kotlinのnon-nullでは表せない状態を取る事が出来る。
そうなった時に一体どのような挙動するのか、どのように書くとそのような挙動を吸収できるのか？疑問に思ったので試してみた。



例えば、以下のような感じで書いた時にGsonでパースした結果がどうなるかについて調べた。

NonNullで定義しているケース

```
data class UserNonNull(
        val id: Int,
        val name: String,
        @SerializedName("has_family")
        val hasFamily: Boolean
)
```

Nullableで定義しているケース

```
data class UserNullable(
        val id: Int?,
        val name: String?,
        @SerializedName("has_family")
        val hasFamily: Boolean?
)
```

パースするJsonは正常系、すべてnullが入った場合、そもそもキーがない場合の３パターン。
合計６パターンでどうなるか調べた。

検証したテストケースはこの辺にアップしているのでご覧ください。
https://github.com/mapyo/GsonKotlinSample/blob/master/app/src/test/java/com/mapyo/gsonkotlinsample/GsonSampleUnitTest.kt


## 結果
調べてる途中にそりゃそうだわー。と思ってきたので詳細は↑に書いてたテストケースのURLを御覧ください。
KotlinのByteCodeを表示してJavaにデコンパイルするとよくわかる。

```
val id: Int
↓
int id;
```

```
val id: Int?
↓
Integer id;
```

という具合のjavaコードが生成されるからだ。Gsonでパースした結果は、Javaのそれと同じ。
intだとjsonがnullでも0になるし、Integerだとjsonがnullだとnullになる。

Stringの場合は違う。

```
val name: String
↓
@NotNull
String name;
```

```
val name: String?
↓
@Nullable
String name;
```

NotNullがついているとはいえ、jsonがnullの場合やキーがない場合は容赦なくnullになる。なので、`val name: String`で宣言してても、nullが入ってきて、それを使おうとするとぬるぽになる。


余談だが、AndroidのNullじゃないアノテーションは`@NonNull`で表されてるけど、
KotlinをJavaに変換した時は、`@NotNull`という名前がつけられてるんだなぁ。


## 僕の意見
Gsonでパースするときは、生成されるJavaコードを意識しつつ、
Jsonでnullが入ってくるのかどうか。キーが必ずあるのかどうか。
を意識して、NonNullにするか、Nullableにするか選択しましょう。

`val name: String`としていても、Jsonの内容によってはNullが返ってくるので注意。
これは、別のクラスや配列などをパースするようにしていても同じ事だと思う。
未検証だけど、生成されるJavaのコードの事を考えるとそうなるはず。

この辺をある程度わかった上でコードを書いてると厚みが出るかなぁと思った。そんな今日この頃。
さくらVPS再インストールしたらSSH接続できなくなった

## さくらVPSを再インストールしてSSH接続したら以下のエラーが出た
    @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
    @    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
    @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
    IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
    Someone could be eavesdropping on you right now (man-in-the-middle attack)!
    It is also possible that a host key has just been changed.
    The fingerprint for the ECDSA key sent by the remote host is
    xxxxxxxxxxxxxxxxxxxxxxx
    Please contact your system administrator.
    Add correct host key in /Users/ユーザー名/.ssh/known_hosts to get rid of this message.
    Offending ECDSA key in /Users/ユーザー名/.ssh/known_hosts:59
    ECDSA host key for サーバーIP has changed and you have requested strict checking.
    Host key verification failed.

これは、OS再インストール前に設定していた鍵認証が、残っている為に出る警告らしい。
なのでknown_hostsファイルから鍵を取り除く。
（ってか**WARNINZG**はホント心臓に悪い(>_<)汗）

## known_hostsから鍵をすべて取り除く
    $ ssh-keygen -R "サーバーIP"

その後はrootユーザーでSSH接続

    $ ssh root@サーバーIP

そうすると接続してもいいか聞かれるので、もちろん **yes**

    The authenticity of host 'サーバーIP (サーバーIP)' can't be established.
    ECDSA key fingerprint is xxxxxx.
    Are you sure you want to continue connecting (yes/no)? 

そしたら**さくらVPSの初期設定**作業に入ります。
おわり。
IEのconsole.logでのエラー防止

javascriptで開発しているとconsole.logでデータを確認することはよく有ります。
完了したら削除しますが、つい削除し忘れていると
IEでエラーが出て止まってしまうことがあります。

IE9以前だと開発ツールを起動していないとconsoleAPIが有効にならないため、
consoleがundefinedになるようです。

ついつい消し忘れてしまう人は以下を入れておくとIEユーザーに文句を言われません。

```js
// IEのconsole.logエラー防止
if(!window["console"]){window["console"]={};window["console"]["log"]=function(){}}
```
Python で学ぶ文字コード

Python 2.7 のドキュメントを読んだ学んだことまとめ

>Unicode HOWTO — Python 2.7.13 documentation
>https://docs.python.org/2/howto/unicode.html

> 7.8. codecs — Codec registry and base classes — Python 2.7.13 documentation
> https://docs.python.org/2/library/codecs.html#encodings-and-unicode

# 歴史的経緯
## 1968 年頃
ASCII(American Standard Code for Information Interchange) によって 0-127 の数字が文字に割り当てられていた。
例) a: 97

```
$ python -V
Python 2.7.10

>>> unichr(97)
u'a'

>>> ord('a')
97
```

[unichr(i) - 2. Built-in Functions — Python 2.7.13 documentation](https://docs.python.org/2.7/library/functions.html#unichr)
[ord(i) - 2. Built-in Functions — Python 2.7.13 documentation](https://docs.python.org/2.7/library/functions.html#ord)

だがヨーロッパで使われる é やロシアのキリル文字は表せなかった。
## 1980 年代
8bit (2^8 = 256) のコンピューターが主流になり、128-255 にそれぞれが独自の形式で文字が割り当てていた。

この違いを解消するために Unicode が開発されることになった。

# Unicode
## 定義
> The Unicode standard describes how characters are represented by code points.

Character: a
code points: 97 (0x61)

## 使用する数
当初、Unicode は 16bit (65,536)を使用していた。
現在は 0–1,114,111(0x10ffff) の幅を持っている。
> a Unicode string is a sequence of code points, which are numbers from 0 to 0x10ffff.

# Encodings
>  The rules for translating a Unicode string into a sequence of bytes are called an encoding.

```
>>> 'a'.encode('hex')
'61'
```

# Python コード
```
$ python -V
Python 2.7.10

>>> s = 'a b c x y z'
>>> s.encode('hex')
'612062206320782079207a'
```

# vim - Insert モード
`CTRL-v + u0061` で `a` が入力される。


# 参考
[Python Character Mapping Codec cp1252 generated from 'MAPPINGS/VENDORS/MICSFT/WINDOWS/CP1252.TXT' with gencodec.py.](http://svn.python.org/projects/python/branches/py3k/Lib/encodings/cp1252.py)
知っておきたい！PIEの原則

この記事では***具体的なコード***については触れません。
コードを書いていくのに使える原則について紹介します。

また、この記事では「[プリンシプル オブ プログラミング](https://www.amazon.co.jp/%E3%83%97%E3%83%AA%E3%83%B3%E3%82%B7%E3%83%97%E3%83%AB-%E3%82%AA%E3%83%96-%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B03%E5%B9%B4%E7%9B%AE%E3%81%BE%E3%81%A7%E3%81%AB%E8%BA%AB%E3%81%AB%E3%81%A4%E3%81%91%E3%81%9F%E3%81%84%E4%B8%80%E7%94%9F%E5%BD%B9%E7%AB%8B%E3%81%A4101%E3%81%AE%E5%8E%9F%E7%90%86%E5%8E%9F%E5%89%87-%E4%B8%8A%E7%94%B0-%E5%8B%B2/dp/4798046140)」という本を読んだ上で、
自分が特に重要と思った箇所を、備忘録も兼ねて、書いています。

# PIEとは
まず始めに、PIEを文章に直すと「Program Intently and Expressively」となり、
訳すと「意図を表現してプログラミングせよ。」という意味になります。
意図を表現してと言われてもどういうことかあまりわからないですよね。
なのでこの原則を簡単に以下にまとめてみました。

# PIEの原則
コードを書く時に大切なことは「このソフトウェアはどう動くものなのか」
ということを、コードの読み手に***伝わるように書きなさい***という原則です。

# なんで？
わざわざコードでとやかく言われるより、その時にドキュメントにまとめてれば良いのでは？と考える人も中にはいるかもしれませんが、
どんなに、様々な種類のドキュメントが作られたとしても、
ソフトウェアの動作を***正確***に、***完全***に、知ることのできるものは***コード***以外に***存在しない***ということです。

# コードは読みやすさを最優先に！
コード書くときは、「書きやすさ」よりも「読みやすさ」を選ぶようにしましょう！
コードは、基本的に書かれることよりも、読まれることの方がはるかに多いです。
書くのは1回ですが、その後たくさんの人が、たくさんの回数読むことになります。
そうなると結果的に、
***「書いていた時間」*** ＜ ***「読まれる時間」*** 
となり、長期的な目で見ても読みやすく書いておく方が、断然、お得なのです！

# 読みやすくする方法
コードは言語によって様々な記法になりますが、
共通で使える読みやすくする方法の一つに、「コメントを入れる」という方法があります。
コメントがなくてもわかるレベルで読みやすいのが理想ですが、
コードだけでは「What」と「How」までしか表現できないのも確かです。
なので、コメントでは見ればわかる、「What」と「How」よりも、
なぜそうしたのかといった***「Why」***を意識して書くようにしましょう。
そうすれば読みやすいコードに一歩近づくはずです。

# まとめ
***コードはPIEの原則に従い、読みやすさを最優先に実装しましょう！***
Aレコードとは

AwsのRoute53を設定した時に、分からなかったのでメモしておきます。

##DNSレコードとは
DNSは、ドメインとIPアドレスをマッピング（対応させる）する仕組み。
「DNSレコード」とは、その記述の仕方。


##Aレコードとは
もっとも基本的な、「ドメイン名 = IPアドレス」を対応させる書き方。
例：「apple.com. A 17.149.160.49」

この真ん中にある「A」は、DNSレコードの種類で「Aレコード」という意味。
「DNSレコード」にはいくつかの種類があり、それぞれ役割がある。

参考
http://server.change.jp/5-minibird/5-minibird_5/
Go言語でDockerコンテナを作成する

Go言語からDockerfileを使ってコンテナを作成するコードや情報があまり見受けられなかったのでまとめておきます。参考にしたサイトは下記
https://godoc.org/github.com/docker/docker/client
http://blog.hawksnowlog.cf/2017/02/control-docker-with-golang.html


#サンプルコード
```go
package main

import (
	"context"
	"os"

	"github.com/docker/docker/api/types"
	"github.com/docker/docker/api/types/container"
	"github.com/docker/docker/client"
)

func main() {
	dockerBuildContext, err := os.Open("images.tar")
	ctx := context.Background()

	defaultHeaders := map[string]string{"User-Agent": "engine-api-cli-1.0"}
	cli, err := client.NewClient("unix:///var/run/docker.sock", "v1.24", nil, defaultHeaders)

	if err != nil {
		panic(err)
	}

	defer dockerBuildContext.Close()

	buildOptions := types.ImageBuildOptions{
		Dockerfile:     "Dockerfile",
		SuppressOutput: true, 
		PullParent:     true,
		Tags:           []string{"hogehoge"},
	}

	buildResponse, err := cli.ImageBuild(ctx, dockerBuildContext, buildOptions)
	if err != nil {
		panic(err)
	}
	defer buildResponse.Body.Close()

	resp, err := cli.ContainerCreate(ctx,
		&container.Config{
			Image: "hogehoge",
		}, nil, nil, "")
	if err != nil {
		panic(err)
	}

	if err := cli.ContainerStart(ctx, resp.ID, types.ContainerStartOptions{}); err != nil {
		panic(err)
	}

}
```

このコードを実行して、下記エラーが出力された。
```
panic: Error response from daemon: {"message":"Cannot locate specified Dockerfile: Dockerfile"}
```
よくよく、tarファイルの中身を見てみると。。。

```shell
$tar tf images.tar
images/
images/Dockerfile
```

imagesフォルダの下にDockerfileがあることが原因だったようで、以下のように直下にするとエラーなく動作した。

```
tar tf images.tar.gz
Dockerfile
```

# 最後に
ImageBuildOptionsのSuppressOutputをtrueにしておかないとイメージが作成完了していないのに、次のコードを実行しようとする。trueにしておけば動作するのだが、気持ち悪い。。これについてはまた何か分かったらまとめておきます。
Perlでのダンプ処理

```perl
use strict;
use warnings;
use Data::Dumper;

:

# ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
# ■ デバッグ用
# ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

my $print_header = 0;

sub dump
{
	my $param = shift;
	my $exit  = shift;
	
	if( !$print_header )
	{
		print "Content-type: text/html\n\n";
		local $Data::Dumper::Deparse = 1;
		$print_header = 1;
	}
	
	print Data::Dumper::Dumper $param;
	
	# 第二引数があればそこで終了
	if( $exit ne undef )
	{
		exit;
	}
}
```

こうしておいて、ダンプしたくなったら。

```perl
&dump($self);
&dump($env);
```

一旦処理を止めたい場合

```perl
&dump($params, 1);
```
ubuntuのカーネルのバージョンを戻す

# ubuntuのカーネルのバージョンを戻す
## ukuuでカーネルのバージョンアップしたあと、不具合があってカーネルのバージョンを元に戻したい場合の手順

ex)ここでは、4.10.8から4.4.0.42に戻すと課程

### 前提

+ 古いバージョンのカーネルをまだuninstallしていない
+ もしかしてuninstallしている場合は、installしてからやれば同じ手順でいける気もする

### 手順

1. マシンを再起動し、起動時にESCを押してGRUBを表示する。
2. GRUBから「Advanced options for ubuntu」を選択する
3. 選択した先のメニューに複数のカーネルバージョンがある場合、4.4.0.42を選択する。選択するのは、(upstart) (recovery mode)がついていないもの
4. ubuntuが正常に起動したらカーネルのバージョンを確認する
5. ukuuでカーネルをインストールしている場合、一覧から4.10.8を選択し、removeを選択する。
6. 後は勝手にukuuが4.10.8のカーネルを削除してくれる
7. 削除が終わったら念の為に再起動する

これでカーネルのバージョンダウンができる。

※上記手順により、起動できなくなったとしても当方は責任を持てません
オフラインリアルタイムどう書く F03「トリオミノの分類」をRubyで解いてみた。

# 問題

http://nabetani.sakura.ne.jp/hena/ordf03triom/

５✕５の二次元のマス目（`a〜y`）がある。
入力は、３箇所のマスが文字列で指定される。
出力は、入力がリンク先の６種類の図形に該当するときは図形の識別子を、しないときは `-` を返す。

# 考え方

`a〜y`の二次元のマス目、入力値、JLTRIBの図形のすべてを二次元配列に変換して扱う。
JLTRIBの３つのマスを、二次元配列のindexの若いマス順に`x, y, z`と定義する。
`x`を原点として`y, z`を`x`からの相対的な位置関係で正規化する。

入力値をソートし、`x`の座標を決定した後、JLTRIBの６種類の図形の`x, y, z`と入力値が一致するかどうかを調べる。

# コード

```triom.rb
require 'test/unit'
require 'matrix'

# NOTE: PATTERNSは、パターンJLTRIBの [y - x, z - x] の値を格納
PATTERNS = [
  [[-1,  1], [ 0,  1]], # J
  [[ 0,  1], [ 1,  1]], # L
  [[ 1,  0], [ 1,  1]], # T
  [[ 1,  0], [ 0,  1]], # R
  [[ 0,  1], [ 0,  2]], # I
  [[ 1,  0], [ 2,  0]], # B
].freeze
# NOTE: PATTERNS_CHARは、パターンのCHARの順序を格納
PATTERNS_CHAR = %w(J L T R I B).freeze

class String
  IDX_CAHRS = [*"a".."y"].freeze

  # NOTE: 入力値を二次元配列に変換
  def to_dimension
    idx = IDX_CAHRS.find_index(self)
    [idx % 5, idx / 5]
  end
end

# メイン関数
def triom_pattern input
  splited = input.split("").sort.uniq

  # NOTE: 入力の要素に重複があった場合はtriomは形成されないため、該当パターンなし
  return "-" if splited.count < 3

  x, y, z = splited.map(&:to_dimension)

  idx = PATTERNS.find_index do |diff|
    dy, dz = diff
    next if y != (Vector[*x] + Vector[*dy]).to_a
    next if z != (Vector[*x] + Vector[*dz]).to_a
    true
  end
  # NOTE: パターンに該当あり
  return PATTERNS_CHAR[idx] if idx

  # NOTE: パターンに該当なし
  return "-"
end

class TestTriom < Test::Unit::TestCase
  def test_triom_pattern
    assert_equal triom_pattern("cba"), "B"
    assert_equal triom_pattern("yam"), "-"
    assert_equal triom_pattern("aaa"), "-"
    assert_equal triom_pattern("def"), "-"
    assert_equal triom_pattern("gga"), "-"
    assert_equal triom_pattern("bbf"), "-"
    assert_equal triom_pattern("gmh"), "T"
    assert_equal triom_pattern("mhn"), "L"
    assert_equal triom_pattern("dea"), "-"
    assert_equal triom_pattern("mrn"), "R"
    assert_equal triom_pattern("hcm"), "I"
    assert_equal triom_pattern("mno"), "B"
    assert_equal triom_pattern("snr"), "J"
    assert_equal triom_pattern("xnn"), "-"
    assert_equal triom_pattern("nnl"), "-"
    assert_equal triom_pattern("kop"), "-"
    assert_equal triom_pattern("ejd"), "T"
    assert_equal triom_pattern("txy"), "J"
    assert_equal triom_pattern("pvu"), "L"
    assert_equal triom_pattern("baf"), "R"
    assert_equal triom_pattern("hhc"), "-"
    assert_equal triom_pattern("ono"), "-"
    assert_equal triom_pattern("wxv"), "B"
    assert_equal triom_pattern("bdc"), "B"
    assert_equal triom_pattern("ojt"), "I"
    assert_equal triom_pattern("fkp"), "I"
  end
end
```

# 実行結果

```
% ruby triom.rb
Loaded suite triom
Started
.

Finished in 0.001545 seconds.
--------------------------------------------------------------------------------------
1 tests, 26 assertions, 0 failures, 0 errors, 0 pendings, 0 omissions, 0 notifications
100% passed
--------------------------------------------------------------------------------------
647.25 tests/s, 16828.48 assertions/s
```
Route53でサブドメインを作成する。

Route53でサブドメインを作成してみたが、その時だいぶ詰まったのでメモしておく。
今回は、example.comの、サブドメインwww.example.comを作成した。

##Route53

##手順
1.www.example.com 用のバケットを作成し、example.comにリダイレクト設定をしておく。
参考
http://docs.aws.amazon.com/ja_jp/AmazonS3/latest/dev/website-hosting-custom-domain-walkthrough.html

2.https://console.aws.amazon.com/route53/ を開く。

3。初めての場合は、 [DNS Management] の [Get Started Now] を選択。それ以外の場合は、ナビゲーションペインで [Hosted Zones] を選択。

4.[Create Hosted Zone] を選択。

5.[Domain Name] にexample.comを入力。

6.[Create] を選択します。

###ルートドメインのレコードセット作成
下の公式ドキュメント参照
###サブドメインのレコードセット作成
下の公式ドキュメント参照

Aws公式ドキュメント（ウェブサイトにドメイン名を関連付ける）
http://docs.aws.amazon.com/ja_jp/gettingstarted/latest/swh/getting-started-configure-route53.html#configure-records


##お名前.comで取ったドメインをRoute53を使って、s3で作った静的サイトに割り当てる方法

下記ドキュメント参照
http://qiita.com/HiroshiUyama/items/4eef62b4ef2d13f9234d
Swagger UI の Online Validator を消す方法

お前を消す方法
![スクリーンショット 2017-04-02 23.47.06.png](https://qiita-image-store.s3.amazonaws.com/0/15627/4ba9e916-1e04-b1e5-7716-a60e914bf493.png)

単なるバリデーションで [ソースも公開されている](https://github.com/swagger-api/validator-badge) とはいえ、 `online.swagger.io` に Internal な API 仕様（のURL）が送られるのは気分の良いものではないので、消します。

`src/standalone/layout.jsx` を編集します。

```diff
@@ -34,7 +34,6 @@
     const Schemes = getComponent("schemes")
 
     const Topbar = getComponent("Topbar", true)
-    const OnlineValidatorBadge = getComponent("onlineValidatorBadge", true)
     const loadingStatus = specSelectors.loadingStatus()
 
     return (
@@ -100,12 +99,6 @@
                 </Col>
               </Row>
           </div> }
-
-          <Row>
-            <Col>
-              <OnlineValidatorBadge />
-            </Col>
-          </Row>
       </Container>
     )
   }
```

webpackを入れて、初回なら `npm i` でいろいろと持ってきて、npmでビルド。

```
npm run build
```

v3のソースすごい見やすい。
jQueryでサイズ不定な画像ファイルを縦横どちらかの長辺で合わせてもらってお行儀よく並んでいただくjQueryプラグイン2。

# 開発の経緯

画像ファイルは縦撮りだったり横撮りだっりする上に、画像解像度もまちまち何ですけど、とりあえず長辺どっちかで自動的に表示する方法考えてください。

と言われたのでJavaScriptで組みたい私はちょっと考えてみた次第です。

# どっちかに合わせて見る

奥さんが晩御飯の生姜焼きを支度している傍ら、愛機MacBook Airを持ち込んでダイニングプログラミングを開始。

こんな風に組んでみました。

ちょっと忘れてたことがあって追加しました（汗）。

##### HTML

```HTML
<script src="https://code.jquery.com/jquery-3.2.0.min.js"></script>
<script src="./js/ImageStyleResizer.js"></script>
<script src="./js/sample.js"></script>

<img data-src="./img/images1.jpeg" class="test" />
<img data-src="./img/images2.jpeg" class="test" />
```

##### JavaScript
下記はX或いはYを320ピクセルか240ピクセルに、どちらか長い方を長辺とする指定をしています。

フェイドを指定しているのはチェーンメソッドが成功するか確認してるだけなので、皆さんは真似しないでください。

$('.test').ppImageStyleResizer(320,240);

にするだけで正解を得られます。

```Javascript
//sample.js
$(function ()
{
  $('.test').ppImageStyleResizer(320,240).fadeTo("slow", 0.33).fadeTo("slow", 1.00);
})
```

なんだよ、ImageStyleResizerって？

はい、今回組んだのはここです。


```Javascript
ImageStyleResizer.js
/**
 * [Image Tag Style Resizer V.1.00]
 * Copyright (c) [2017] [(fD)Pinchos.Ponchos]
 * http://qiita.com/fd2016ta
 * This software is released under the MIT License.
 * @param  {[type]} $
 * @return {[type]}
 */
(function( $ )
{

  /**
   * [Image Tag Style Resizer]
   * I will apply the style to the long side.
   * @param  {[type]} maxX [Max Width px]
   * @param  {[type]} maxY [Max Height px]
   */
  $.fn.ppImageStyleResizer = function(maxX, maxY)
  {
    var imageWidth;
    var imageHeight;

    var resultX;
    var resultY;

    this.hide();

    for(var indexElement = 0 ; indexElement < this.length ; ++indexElement ) {

      $(this[indexElement]).attr('src', $(this[indexElement]).attr('data-src'));

      imageWidth = $(this[indexElement]).width();
      imageHeight = $(this[indexElement]).height();

      if (imageWidth > imageHeight) {
        resultX = maxX;
        resultY = imageHeight * (maxX / imageWidth);
      } else {
        resultX = imageWidth * (maxY / imageHeight);
        resultY = maxY;
      }

      $(this[indexElement]).css({'width': resultX, 'height': resultY});
      $(this[indexElement]).show();
    }

    return (this);

  };
})(jQuery);
```
jQueryと組み合わせるといい感じになりました。
Rails5のproductionでrake db:dropはできない、普通には

## 概要
Rails5から、productionモードでは、db:dropなどのDBを破壊する系のコマンド実行を防止する機能が追加された。
下記はproductionで `rake db:drop` する時の手順。

## ar_internal_metadataテーブルのenvironmentをproductionにする
まずは、developmentやstagingなどの違う環境のDBをdumpして、productionのDBに入れたときなどに起こるエラーの対処法についてです。
**productionで`rake db:drop`する方法のみ知りたい方は、[次の項目](#productionでdb破壊系の処理を実行するとエラーになる)へ進んで下さい**

productionになっていないとこんなエラーが出る

```bash
$ RAILS_ENV=production bundle exec rake db:drop
rake aborted!
ActiveRecord::EnvironmentMismatchError: You are attempting to modify a database that was last run in `staging` environment.
You are running in `production` environment. If you are sure you want to continue, first set the environment using:

        bin/rails db:environment:set RAILS_ENV=production
```

### 原因

このエラーは、`ar_internal_metadata` テーブルにセットされているenvironmentと、実行しようとしているコマンドで指定されたものが一致していない場合に出る。
developmentやstagingなどの違う環境のDBをdumpして、productionのDBに入れたときなどに起こる。

```sql
mysql> select * from ar_internal_metadata;
+-------------+-------------+---------------------+---------------------+
| key         | value       | created_at          | updated_at          |
+-------------+-------------+---------------------+---------------------+
| environment | development | 2017-03-28 05:54:51 | 2017-03-28 05:54:51 |
+-------------+-------------+---------------------+---------------------+
1 row in set (0.00 sec)
```


### 対処法
下記のコマンドで、`ar_internal_metadata` のenvironmentをproductionに更新する。

```bash
$ bundle exec rails db:environment:set RAILS_ENV=production
```

## productionでdb破壊系の処理を実行するとエラーになる

こんなエラーが出る

```bash
$ RAILS_ENV=production bundle exec rake db:drop
rake aborted!
ActiveRecord::ProtectedEnvironmentError: You are attempting to run a destructive action against your 'production' database.
If you are sure you want to continue, run the same command with the environment variable:
DISABLE_DATABASE_ENVIRONMENT_CHECK=1
```


### 原因

#### 参考
> 意図的にproduction environmentのDBを破壊したい場合は、エラーメッセージにも表示されている通り、
> 環境変数 DISABLE_DATABASE_ENVIRONMENT_CHECK=1指定してあげればOKです。
> 防止処理の対象となるtaskは下記の通りです。
> 
> db:drop
> db:drop:all
> db:purge
> db:purge:all
> db:purge:test
> db:schema:load

[Rails 5に入ったDB破壊系taskの防止処理について](http://y-yagi.tumblr.com/post/142064773890/rails-5%E3%81%AB%E5%85%A5%E3%81%A3%E3%81%9Fdb%E7%A0%B4%E5%A3%8A%E7%B3%BBtask%E3%81%AE%E9%98%B2%E6%AD%A2%E5%87%A6%E7%90%86%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6)

Rails5では、DBを破壊する系のコマンドを防止する機能が追加されているようです。


### 対処法
参考記事の通り、環境変数に
`DISABLE_DATABASE_ENVIRONMENT_CHECK=1`
を付与すればよいので、下記のコマンドでdropできる。

```bash
$ RAILS_ENV=production DISABLE_DATABASE_ENVIRONMENT_CHECK=1 bundle exec rake db:drop
```

以上

## 参考
[Rails 5に入ったDB破壊系taskの防止処理について](http://y-yagi.tumblr.com/post/142064773890/rails-5%E3%81%AB%E5%85%A5%E3%81%A3%E3%81%9Fdb%E7%A0%B4%E5%A3%8A%E7%B3%BBtask%E3%81%AE%E9%98%B2%E6%AD%A2%E5%87%A6%E7%90%86%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6)
[Rails5にてrails db:dropを行う方法](http://shinshin86.hateblo.jp/entry/2017/01/15/200542)
[Rails5でDBに自動生成されるテーブル、"ar_internal_metadata" とは何なのか](http://qiita.com/EastResident/items/53c24340fd322758901f)
[Swift] 順序付き辞書、DictionaryLiteral

## 前置き: Swift5における変更点

コメントで頂きましたが、`DictionaryLiteral`という名称はSwift5でDeprecatedとなり、`KeyValuePairs`にRenameされました。（@imaizumeさんありがとうございます！）

[PR](https://github.com/apple/swift/pull/16577)を見た感じだと完全にRenameだけで機能は変わっていないようです。
`Dictionary`でも`Literal`でもないバッドネーミングだから変えたとのこと。

この記事はSwift3時点で書かれたものなので、以降`DictionaryLiteral`と古い呼称で記述しておりますがご容赦ください。

## DictionaryLiteralとは

SwiftのDictionaryはハッシュテーブルなので、素早いルックアップが可能ですが、**イテレートした際に順序が保証されません**。

```swift
let dict = ["0": 0, "1": 1, "2": 2, "3": 3]
for (key, value) in dict {
    print("\(key), \(value)")
}
```

出力はこうなります。

```
2, 2
1, 1
0, 0
3, 3
```

順番がバラバラになりました。

では、どうしても辞書の順序を保存しておきたいときはどうしたら良いでしょうか。実は、順序付きの辞書は用意されています。

**DictionaryLiteral**というのがそれです。ExpressibleByDictionaryLiteralに準拠しているため、**型を明示すれば辞書のリテラルをそのまま代入できます。**

```swift
let dict: DictionaryLiteral = ["0": 0, "1": 1, "2": 2, "3": 3]
for (key, value) in dict {
    print("\(key), \(value)")
}
```

```
0, 0
1, 1
2, 2
3, 3
```

順番が保たれています。また、DictionaryLiteralはRandomAccessCollectionなので、配列のように添え字アクセスすることも可能です。キーとバリューのタプルが返ってきます。

```swift
print(dict[1])
```

```swift
("1", 1)
```

ただし、DictionaryLiteralはDictionaryと同じように使えるわけではありません。残念ながら、少なくとも機能的な面では、DictionaryLiteralは`[(String, Int)]`のようにタプルの配列を書くのとほとんど変わりません。

例えば、**キーを指定して値を取得することはできません**。指定したキーに対応する値を取得するにはこのようにします。

```swift
let dict: DictionaryLiteral = ["0": 0, "1": 1, "2": 2, "3": 3]
if let index = dict.index(where: { $0.0 == "1" }) {
  let value = dict[index].1
  print("value: \(value)") // value: 1
}
```

また、同じキーが複数ある状態も許容してしまいます。

```swift
var dict: DictionaryLiteral = ["0": 0, "0": 1, "0": 2, "0": 3]
if let index = dict.index(where: { $0.0 == "1" }) {
  let value = dict[index].1
  print("value: \(value)") // value: 1
}
```

ではどういう時にDictionaryLiteralを使うと良いのでしょうか。ドキュメントにはこうあります。

> Use a Dictionary​Literal instance when you need an ordered collection of key-value pairs and don’t require the fast key lookup that the Dictionary type provides.

* 順序つき辞書が必要なとき
* 高速なルックアップが不要なとき

メリットとしては名前の通り、**Dictionaryのリテラルで書けて可読性が上がる**ということなどでしょうか。順序付きの辞書が欲しくなったときに、検討してみてはいかがでしょうか。

---
:whale2: Twitter: [@a_beco](https://twitter.com/a_beco)
:guitar: SoundCloud: [@beco](https://soundcloud.com/baron1_3) <- 作業用BGMにどうぞ！
WebAssembly Explorer の紹介

この記事はHacks blogの記事、"[Previewing the WebAssembly Explorer](https://hacks.mozilla.org/2017/03/previewing-the-webassembly-explorer/)"の抄訳です。

[WebAssembly](https://developer.mozilla.org/docs/WebAssembly)は、Webのためのクロスブラウザな、新しいプログラムのファイルフォーマットです。その性質については[Lin Clark](https://twitter.com/linclark)の連載、"[A aartoon intro to WebAssembly](https://hacks.mozilla.org/2017/02/a-cartoon-intro-to-webassembly/)"でお読みいただけます。JavaScriptと異なり、WebAssemblyはバイナリフォーマットです。つまり開発者がWebAssemblyについて学習する場合や、実験する場合は新しいツールが必要となります。そのようなツールの1つが、Mozillaの開発した[WebAssemlby Explorer](https://mbebenita.github.io/WasmExplorer/)です。

このビデオは、CやC++のプログラムをコンパイルして、WebAssemblyを出力するというWebAssembly Explorerの基本機能を解説しています。

[![Preview of the WebAssembly Explorer
](http://img.youtube.com/vi/3XrGjSnPHGY/0.jpg)](https://www.youtube.com/watch?v=3XrGjSnPHGY)

WebAssemblyとWebAssembly Explorerの長所の一つは、開発者がコードに対してなされた最適化処理の結果を見られることにあります。例えば、ビデオではWebAssemlbyコンパイラがC言語の型情報を利用して、除算とより効率的なビットシフトとを使い分けています。JavaScriptでは、ブラウザのJITコンパイラが偶然同じ最適化を行うことがあります。しかしそこには何の保証もありません。事前コンパイル（AOT）は同時に楽観的なJITコンパイラでは必要な観察とプロファイリングによるオーバヘッドを避けることもできます。

WebAssembly Explorerは学習ツールとしてはすばらしいのですが、まだ開発初期段階にあるため、複雑なプログラムには向いていません。製品レベルのコンパイラを必要とする方は、[Emscripten](http://emscripten.org/)を検討した方がいいでしょう。元々[asm.js](https://en.wikipedia.org/wiki/Asm.js)を出力するために作成されたコンパイラではありますが、拡張され、WebAssemblyも出力できるようになっています。

WebAssembly Explorerのソースコードは[GitHub](https://github.com/mbebenita/wasmexplorer)で公開されています。また今週後半（訳注：元記事が公開されたのは2017年3月6日）公開されるFirefox 52ではWebAssemblyを標準で利用できるようになっています。そちらを使えばWebAssemblyについて実験が行えます。

## [Dan Callahan](http://dancallahan.info/)について

Mozillaのディベロッパーリレーションチームのエンジニア。元Mozilla Personaの開発者

* Webサイト：[dancallahan.info](http://dancallahan.info/)
* Twitter：[@callahad](http://twitter.com/callahad)
Ansible ネットワーク情報をiptablesで指定できる形で取り出す

```yaml
- set_fact:
    interfaces: "{{ansible_interfaces | map('regex_search', 'en.+') | select('string') | list}}"

- set_fact:
    network: "{{vars['ansible_' + item]['ipv4']['network']}}/{{vars['ansible_' + item]['ipv4']['netmask']}}"
  with_items: "{{interfaces}}"
  register: networks

- set_fact:
    networks: "{{networks.results | map(attribute='ansible_facts.network') | list}}"

- debug:
    msg: "{{networks}}"

- shell: iptables -A INPUT -s {{item}} -j ACCEPT
  with_items: "{{networks}}"



TASK [set_fact] *******************************************************
ok: [127.0.0.1]

TASK [set_fact] *******************************************************
ok: [127.0.0.1] => (item=enp0s3)
ok: [127.0.0.1] => (item=enp0s8)

TASK [set_fact] *******************************************************
ok: [127.0.0.1]

TASK [debug] **********************************************************
ok: [127.0.0.1] => {
    "msg": [
        "192.168.1.0/255.255.255.0",
        "192.168.2.0/255.255.255.0"
    ]
}

TASK [command] ********************************************************
changed: [127.0.0.1] => (item=192.168.1.0/255.255.255.0)
changed: [127.0.0.1] => (item=192.168.2.0/255.255.255.0)
```

# ポイントは2つ

### 変数名が動的な変数を取得する
Ansibleのインターフェースの変数名は
ansible_enp0s3のように動的なので
ansible_interfacesからインターフェース名を取り出して
変数名を組み立てます。

```yaml
vars['ansible_' + 変数名]
```
で取り出せます。

### ループの実行結果を取得する
```yaml
- set_fact:
    network: "{{vars['ansible_' + item]['ipv4']['network']}}/{{vars['ansible_' + item]['ipv4']['netmask']}}"
  with_items: "{{interfaces}}"
  register: networks
```
registerを設定することで、set_factの実行結果を取得できます。

```yaml:registerした変数netwotkの中身
"changed": false,
"msg": "All items completed",
"results": [
    {
        "_ansible_item_result": true,
        "_ansible_no_log": false,
        "ansible_facts": {
            "network": "192.168.1.0/255.255.255.0"
        },
        "changed": false,
        "invocation": {
            "module_args": {
                "network": "192.168.1.0/255.255.255.0"
            },
            "module_name": "set_fact"
        },
        "item": "enp0s3"
    },
    {
        "_ansible_item_result": true,
        "_ansible_no_log": false,
        "ansible_facts": {
            "network": "192.168.2.0/255.255.255.0"
        },
        "changed": false,
        "invocation": {
            "module_args": {
                "network": "192.168.2.0/255.255.255.0"
            },
            "module_name": "set_fact"
        },
        "item": "enp0s8"
    }
]
```
resultsに各結果があります。
それをループで回して
ansible_factsのnetwork(set_factで指定した変数名)以下の内容をmapで抽出します。

```yaml
- set_fact:
    networks: "{{networks.results | map(attribute='ansible_facts.network') | list}}"
```

# 最終的に

```yaml
[
        "192.168.1.0/255.255.255.0",
        "192.168.2.0/255.255.255.0"
]
```

を得られます。
KotlinとSequence<T>と巨大なファイル

# 問題設定

　100万行の巨大なJSON Linesファイルがあります。

　これを1行ずつオブジェクトに変換し、ある条件を満たす最初の10件のオブジェクトを取得したいです。

# ダメな例

　まずはダメな例を示します。

```kotlin:
val lineList: List<String> = File("data.jsonlines").readLines()

val result = lineList
    .map { convertToData(it) } // 変換
    .filter { filterData(it) } // 選択
    .take(10) // 最初の10件のみ取得

result.forEach(::println)
```

　このコードは今回の問題設定ではよくないコードです。

　何がそしてどこがよくないかわかりますか？


# ダメな理由

　冒頭のコードはJSON Linesのファイルを読み込んでいる次の部分がよくありません。

```kotlin:
val lineList: List<String> = File("data.jsonlines").readLines()
```

　今回の問題設定では、読み込むファイルは100万行のファイルです。上記のコードでは、100万行のファイルすべてを読み込んでいます。

　100万行、すべてを読み込む必要があるのでしょうか？

　欲しいデータは10件でしたね。もしかしたら100万行の内、先頭1万行だけ読めば見つかるかもしれません。たかだか数10行読んだら見つかるってことだってあるかもしれません。

　巨大なファイルを最後まで読み切らずに、少しずつ必要な分だけファイルを読みこむことを検討しましょう。

# Sequence<T>そしてuseLinesを活用しよう

　少しずつ必要な分だけファイルを読みこむのは、次のコードで実現できます。

```kotlin:
// 次のコードもよくない点があります。
// このコードをそのまま使わないでください。

val lineSequence: Sequence<String> = File("data.jsonlines")
    .bufferedReader() // FileクラスのbufferedReader拡張関数、BufferedReaderを作成
    .lineSequence()

val result = lineSequence
	.map { convertToData(it) }
    .filter { filterData(it) }
    .take(10)

result.forEach(::println)
```

　このコードのポイントは、BufferedReaderクラスの拡張関数、[lineSequence](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.io/java.io.-buffered-reader/line-sequence.html)です。

　この関数は[Sequence<String>](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.sequences/-sequence/index.html)を返します。この関数を用いることで、100万行のファイルを最後まで読まず必要な分だけファイルを読み込み処理を行うことができます。

　コメントにも書きましたが、上のコードは良くない点があります。BufferedReaderのCloseable処理をしていないのです。

　`bufferedReader().lineSequence()`ではなくて、次のように`useLinesメソッド`をぜひ使ってください。

　[useLines](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.io/java.io.-reader/use-lines.html)メソッドは、Fileクラスの拡張関数で次のようなものです。

* `Sequence<String> -> T` 型の関数リテラルを引数に取る
* ファイルを1行ずつ読み込んだシーケンス`Sequence<String>`、これに引数で渡した関数リテラルを適用した結果が返り値
* 内部でCloseableの処理を行っている

```kotlin:
val result: List<PersonData> = File("data.jsonlines")
	.useLines { lineSequences: Sequence<String> ->
		lineSequences
			.map { convertToData(it) }
			.filter { filterData(it) }
			.take(10)
			.toList()
    }

result.forEach(::println)
```

# まとめ

　巨大なファイルを処理する際は、[File#useLines](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.io/java.io.-reader/use-lines.html)を活用しましょう。
ReactNativeのComponentをnpmで公開した


マテリアルデザインのCardコンポーネントに複数の画像を表示するコンポーネント。

[react-native-card-media](https://github.com/dondoko-susumu/react-native-card-media)

![five.png](https://qiita-image-store.s3.amazonaws.com/0/49022/6d782a5d-4407-87e0-9e89-4f947396338c.png "five.png")

## 目的
**OSSに参加してみたかった。**
**npmのライブラリを公開してみたかった。**

というのが主な目的だったので、とにかく初めはなるべく簡単なもので始めてみようと思って、Nativeは触れないJSで完結するReactコンポーネントにした。

## ライブラリ化のためにしたこと
元々は、仕事でやってるReactNativeアプリの中で実装したコンポーネントなので、基本的なレイアウトロジックはそのまま流用しているが、ライブラリ公開するにあたっていくつかの修正をしている。

- コンポーネント中で使っていた別のサードパーティのライブラリを使わないようにして、ピュアなReactNativeのコンポーネントに修正
- ESLintによるtest
- ドキュメントを作った
- サンプルアプリを作った

仕事ではESLintを使ってなかったため、ESLintのエラーを潰す作業が一番手間取ったが、世の中ではこういう書き方が推奨されているのか、ということがわかって勉強になった。

npmの公開ということで、心理的なハードルが高かったのだが、いざやってみると公開作業自体は難しいことはなく、公開までの一連の作業の経験が積めてよかった。
また、これぐらいの規模のライブラリを外に公開していきたい。

## 参考
[3分でできるnpmモジュール](http://qiita.com/fnobi/items/f6b1574fb9f4518ed520)
特定のチャットルームにメッセージが来たらパトランプを点滅させる

#困っていたこと
職場でHipChatを利用していますが、複数ルームからのメッセージがあるため、重要なルームメッセージを見逃す場合があり困っていました。

#考えたこと
重要なルームメッセージを見逃さないように、
HipChatの特定ルームにメッセージが来たらパトランプを一定時間点滅させることを考えました。

#実現方法
- RaspberryPiからHipChatのAPI(history)を呼び出しContentLengthを獲得する
- HipChatのAPI(history)は実行日を指定して獲得量が多くなりすぎないようにする
- ContentLength値の増加を検知してリレーのON/OFFを制御する
- リレーONに連動してパトランプ回路に電流を流す
- 点滅はパトランプ本体の機能をそのまま使う。

#動作条件
- インターネットに接続している
- HipChatのAPIアクセストークンを取得している


#ハードウエア
- Raspberry Pi
- リレー
- パトランプ
- 電源(5Vと12V)

![chat-relay.png](https://qiita-image-store.s3.amazonaws.com/0/146154/b9686e4e-e405-fd04-f8de-15880af5a835.png)


#プログラム仕様
- c言語で作成する
- リレー制御はGPIO17を使用
- WebAPI呼び出しインターバルは5秒とする
- 起動パラメータはチャットルーム名とパトランプを点滅させる秒数


[https通信はここを参考にさせていただきました](http://qiita.com/edo_m18/items/41770cba5c166f276a83)


#必要なライブラリをインストール

##wiringPi
git clone git://git.drogon.net/wiringPi
cd wiringPi
./build

##ssl
apt-get update
apt-get upgrade
apt-get install libssl-dev 


#コード

https://github.com/shigeru-yokochi/chat-relay


#実行方法

chat-reray [ルーム名] [点滅秒数] [パトランプ出力先ポート] [サウンド指定]
Microsoft Azureで課金制限したい

マイクロソフトのクラウドサービスである Microsoft Azure を従量課金で使う場合、
いつの間にか料金が高額になっていて真っ青、なんてことも。
なので、その対処方法を調べてみた。

結果的に、上限を設ける方法自体は無かったけど、課金が一定額に達したら通知してくれる仕組みが有ったので紹介。

[Azure](https://azure.microsoft.com/ja-jp/)トップページの一番下

![image](https://qiita-image-store.s3.amazonaws.com/0/120192/1e4b1118-6684-3313-37df-e064dbd05085.png)

「[サブスクリプション](https://account.windowsazure.com/Subscriptions)」を選ぶ。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/120192/cdc2bb51-4e1c-b76a-17ce-f9fe6d275f61.png)

「プレビュー機能」にて "Billing Alert Service"を有効("try it now"ボタンを押す)にする。
(有効にした図)

![image](https://qiita-image-store.s3.amazonaws.com/0/120192/49bc3c9e-2071-089f-f713-00ea8dd39fe1.png)
「サブスクリプション」から、課金通知を設定したいサブスクリプションを選択する。（ここでは「従量課金」）

![image](https://qiita-image-store.s3.amazonaws.com/0/120192/f8b9d6e5-654a-09a2-7f55-8cca8a45d616.png)
「アラート」を選択する。

![image](https://qiita-image-store.s3.amazonaws.com/0/120192/600a6c49-3d7d-e0fa-3690-beb6a48f2ddb.png)
アラート対象の金額と通知先のメールアドレスを設定する。
5段階まで設定出来るようだ。

VMを作ったのはいいけど、起動させたまま放置していたらいつのまにか課金が。。。なんてパターンが有るので。ぜひ設定しておきたい。
（ちなみにＶＭは停止させておけば課金が発生しなかったはず）
全くの初心者が１週間で小さなサイトを作った話

>更新
2017/4/10
Azureを利用できることを知ったのでそっちで公開しました。

私がそもそもHTML, CSSを学ぼうと思ったのはPythonでDjangoフレームワークを使ってみたいなぁとかなんとなく思ったときに、そもそも使うサイトが無ければ使う理由が無いじゃないか！てな感じでノリで勉強を始めたのでそれの一環としてサイトを作りました。
今回はHTMLとCSSのみで作りました。なので動的なサイトではありません。

<h1>私が作ったサイトの内容</h1>
サイト(FC2): [JUN's portfolio](http://junnetworks.web.fc2.com/)
サイト(Azure): [JUN's portfolio](http://junportfolio.azurewebsites.net/)
サイト内容としては軽いWebポートフォリオを目指して作りました。

<h2>使用したソフトやサイト</h2>
**サイト**
[ドットインストール](http://dotinstall.com/) HTML, CSSの基礎はここで勉強しました。
[optimizilla](http://optimizilla.com/ja/) サイトに画像を載せるに画像サイズを小さくする際にお世話になりました。
[HTMLクイックリファレンス](http://www.htmq.com/) わからないことがある際にはこのサイトを見てました。
[FC2ホームページ](http://web.fc2.com/)　このサイトを使って公開しました。

**ソフト**
[Atom](https://atom.io/) 私の愛用しているテキストエディタです。
[GIMP](https://www.gimp.org/) 画像の編集はすべてこれで事足ります。

<h1>苦労した点</h1>
*HTML*
HTMLは基本さえわかっていれば苦労する部分はさほど無かったです。
あえて挙げるとするなら特殊文字関連
空白("&nbsp"), &("&amp")等

*CSS*
要素を３等分にして配置(要素を全体横幅からの%指定にする)
要素の場所を合わす方法(marginやpaddingを使う)
背景画像の半透明化(rgbaを重ねる)

<h1>作り終えた感想や反省</h1>
本当はRaspberry piを使ってサーバーを作りたかったのですが時間がなかったのでFC2HPで妥協しました。またサイトを作る機会があればRaspberry piサーバーで公開したいです。

今回使用したのはHTMLとCSSだけでしたが次回作る際はJavaScriptも勉強して使っていきたいです。

反省は今回制作したサイトはスマホからだとレイアウトが崩れてしまうので次回はその辺をちゃんと崩れないようにしていきたいです。

ここまで見てくださりありがとうございました。
それではまた次の記事でお会いしましょう。
何日前より古いファイルを削除(自分メモ)

# 31日前より古いファイルを削除する

色んな現場に行くと不要なファイルがたまるため何日か経つと削除してほしいと依頼がよくある

「/opt/alfresco-community/tomcat/logs」直下の31日前より古いファイルを削除する
find /opt/alfresco-community/tomcat/logs/catalina.*.log -mtime +31 -exec rm -f {} \;

-mtime (+/-)n
最後にデータが修正されたのが n日前の file/dir を検索(+n：n日以上、-n：n日以下)

\
エスケープ記号
c がシェルのメタ・キャラクタである場合, \c は c の特別な意味を打ち消し, 単なる文字としての c にする.

 ; 
bashに解釈されるのでエスケープが必要

{} 
引数に展開されるので スペースで区切る

-exec コマンド {}(スペース)\;
 {} がファイル名に置換される。 \;で打ち止め。

テストをする際は以下のコマンドでタイムスタンプを変更する
touch -t 201703051200 test.txt
2017 年
03 月
05 日
12 時
00 分
Excel2010だとPointsToScreenPixelsXがZEROで返ってくる


#Excel2010だとPointsToScreenPixelsXがZEROで返ってくる

最近はまったこと、Excel2010だとPointsToScreenPixelsXがZEROで返ってくる

海外サイトで見つけたが Application.ScreenUpdating = false だと 必ず ZERO で帰ってくるバグらしい。

https://social.msdn.microsoft.com/Forums/office/en-US/645bc25d-1fbe-4324-839a-9f4f2b58f697/activewindowpointstoscreenpixelsx-pointstoscreenpixelsy-requires-pixels-not-points-and-requires?forum=exceldev
apkをコマンド一つでjavaにデコンパイルする

自分が作ったアプリを難読化した時に、どんな感じで難読化されるのか？というのを確認しないとちゃんと難読化出来てるのかわからないのでやってみる。

ぽちぽちコマンドもろもろ打って確認して。。というのをやるのめんどそうだなぁと思ったら、
コマンド一つでいい感じにやってるqiitaを見つけた。

http://qiita.com/GeneralD/items/a4af8d1ac2b13a8c0bc8

brew周りとか違ってたり、コマンド周りとか改善ポイントがあったのでちょっと手順をまとめてみる


## brewでインストール
dex2jar(名前の通りdexファイルからjarファイルを生成する)とjad(Javaにでコンパイルする)が必要なのでbrewで入れる

```
brew install dex2jar
brew cask install Caskroom/cask/jad
```

※ちょっとガチャガチャやりながら入れたので、他にもbrew周りで必要かもしれない

## スクリプト作る

`.zshrc`とかに以下のように追加する。bashは普段使ってないのでわかりません。。。

```
# Decompile Java classes recursively keeping hierarchy
jadr() {
  jad -8 -s java -d $2 -r $1/**/*.class
}

# Decompile Android application
deapk() {
  local dst=${${1##*/}%%.*}
  dst+=".depackaged.`date +"%Y%m%d%H%M"`"
  unzip $1 -d $dst
  d2j-dex2jar -o ${dst}/classes-dex2jar.jar ${dst}/classes.dex
  mkdir -p ${dst}/classes
  unzip ${dst}/classes-dex2jar.jar -d ${dst}/classes
  jadr ${dst} ${dst}/src
}
``` 

以下のコマンドで実行できるようになる

```
deapk app-release.apk
```

これを実行すると

```
app-release.depackaged.201704022234
```

このフォルダが出来て、srcフォルダ配下にjavaにデコンパイルされたコードが入ってる。
普段kotlinで書いてるのでkotlinバージョンとかあるのかなぁ。


参考元のqiitaとの変更点は以下の２つ

- コマンド実行する度にフォルダの最後に日付が入るようにした
- brewから入れた場合にコマンドが`dex2jar`→`d2j-dex2jar`になってたので修正


Gson周りで難読化するとどうなるか調べてみたかったのでこれでやりやすい感じになった。
そんな今日この頃。
導入してみる RxJava, RxAndroid, Lambda Expression（メモ）

既存の自作アプリに、RxJavaを一部導入した話です。
メモとして。

# 今回の範囲

* AndroidのプロジェクトにRxJavaを導入する
* ラムダ式を使えるようにする
* とりあえずなんかやってみる（リスト操作）

# RxJavaを導入する

RxJavaを導入すること自体は、そんなに大変ではありませんでした。
とりあえず、build.gradleに、RxJavaの依存を追加するだけです。

```
dependencies {
  compile 'io.reactivex.rxjava2:rxandroid:2.0.1'
  compile 'io.reactivex.rxjava2:rxjava:2.0.1
}
```

これで、RxJavaの機能が使えるようになります。

# ラムダ式を使えるようにする

ラムダ式を使えるようにするには、Java 8でコーディングする旨の記述が必要です。
こちらもbuild.gradleに追加します。

```
android {
  ...
  defaultConfig {
    ...
    jackOptions {
      enabled true
    }
  }
  compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_8
    targetCompatibility JavaVersion.VERSION_1_8
  }
}
```

こちらが参考になります。
[Java 8 の言語機能を使う | Android Developers](https://developer.android.com/guide/platform/j8-jack.html?hl=ja)

一方で、これを有効にするデメリットもありまして。。

> Instant Run 機能は、現段階では Jack と併用できません

とのこと。
Instant Run自体かなり便利な機能なので、レイアウトを実装中にはちょっと不便かも。

試してないけど、RetroLambdaを使うようにしたら、Jack使わなくてもいいのかな？

# とりあえずなんかやってみる（リスト操作）

## もとの実装

とりあえず、リスト操作をRxっぽく書いてみることにしました。
通信などを使用しないアプリなので、あんまりRxJavaの恩恵は受けられないのですが……。

もともとは、ざっくり以下のようなコードでした。

```java
class MyAdapter extends ArrayAdapter<Item> {
    public MyAdapter(Context context, List<Item> objects) {
        super(context, 0, objects);
    }

    public View getView(int position, View convertView, ViewGroup parent) {
        if (convertView == null) {
            ViewItemListBinding binding = DataBindingUtil.inflate(LayoutInflater.from(getContext()), R.layout.view_item_list, parent, false);
            convertView = binding.getRoot();
        }
        ViewItemListBinding binding = DataBindingUtil.getBinding(convertView);
        binding.setItem(getItem(position));

        return convertView;
    }
}
```

DataBindingを使用しているので、データをViewに当てる処理はここには書いていません。
しかしながら、`getItem(position)`のところで、
ItemデータをViewに当てようとしている意図は理解していただけるかと思います。
Itemクラスは、データそのもの、モデルクラスです。

## 導入後

以下のようになりました。

```java
class MyAdapter extends ArrayAdapter<Item> {

    // Item（リスト）のObservableを追加
    Observable<Item> itemObservable;

    public MyAdapter(Context context, List<Item> objects) {
        super(context, 0, objects);

        // ItemのリストでObservableを生成
        itemObservable = Observable.fromIterable(objects);
    }

    public View getView(int position, View convertView, ViewGroup parent) {
        if (convertView == null) {
            ViewItemListBinding binding = DataBindingUtil.inflate(LayoutInflater.from(getContext()), R.layout.view_item_list, parent, false);
            convertView = binding.getRoot();
        }
        ViewItemListBinding binding = DataBindingUtil.getBinding(convertView);

        // Itemのシーケンスから、ポジション(int)でfilterしてItemを抽出する
        binding.setItem(itemObservable.filter(item -> item.isEqualToPosition(position)).blockingFirst());

        return convertView;
    }
}
```

`item.isEqualToPosition()`は、boolを返すItemクラスのメソッドです（今回のために無理やり追加した)。
見ての通り、スーパークラスに渡したitemsを使用しない実装になるので、itemsの中身が変わるなどすると、不具合を起こすかもしれません。


しかしながら、練習にはちょうどよかったです。
今回の実装では、RxJavaの恩恵を受けにくい実装になりましたが、雰囲気はつかめたと思います。
ブラウザを終了してもDeviseのセッションが切れないようにする

Deviseで「セッション タイムアウト」とかで検索するとDeviseの`timeoutable`を有効にして`initializers`で`config.timeout_in`を設定したら良いという記事がたくさん出てきます。

ただこれを設定していても、Railsではデフォルトでセッションクッキー(ブラウザを終了すると消える)設定になっているので、ブラウザを終了してしまうとセッションが切れてしまい困りました。

## 結論
* `config/initializers/session_store.rb`に`expire_after`にセッションを維持したい期間を記入してサーバーを再起動すればOKです

```ruby
Rails.application.config.session_store :cookie_store, key: '_xxxx_session', expire_after: 1.week
```

Deviseの`timeoutable`と同じ期間にしていないとDevise側で強制ログアウトされてしまうと思われる(動作確認はしてない)ので`config.timeout_in`の期間も同じに設定しておきます。

## 参考にした記事
* Rails の session の有効期限を無期限にする - 9mのパソコン日記 https://blog.kksg.net/posts/rails-eternal-session

* Rails、deviseでブラウザを閉じたら、強制的にログアウトさせたい - スタック・オーバーフロー http://ja.stackoverflow.com/questions/10561/rails-devise%E3%81%A7%E3%83%96%E3%83%A9%E3%82%A6%E3%82%B6%E3%82%92%E9%96%89%E3%81%98%E3%81%9F%E3%82%89-%E5%BC%B7%E5%88%B6%E7%9A%84%E3%81%AB%E3%83%AD%E3%82%B0%E3%82%A2%E3%82%A6%E3%83%88%E3%81%95%E3%81%9B%E3%81%9F%E3%81%84
【初心者投稿-15】「HTML&CSS学習コース　上級編」クリア！

#昨日までのおさらい
Macを友人から借り、テンションが上がる上がる！
ただversionが古いのか、qiitaの投稿ができないわ、chromeダウンロードできないわで、sierraにアップデート必須状態。

#Macを使いこなし始める
1日で？と思う人もいると思いますが、早速カフェに連れ出し**エンジニアの休日**っぽい雰囲気も出してきました。

アップデートしたり、sublime textをインストールしたり、だいぶ環境が整ってきましたな。

[Mac Book Pro の設定・セットアップ](http://qiita.com/daigon/items/567657d11ed5a9ac62d8#google%E6%97%A5%E6%9C%AC%E8%AA%9E%E5%85%A5%E5%8A%9B)

アップデートの時に下記ページ参考にさせていただきました！

そして今日は時間があったので、ジムに行ってトレーニングのあと、ついに「HTML&CSS学習コース　上級編」クリアしました！

![上級クリア.png](https://qiita-image-store.s3.amazonaws.com/0/170536/6dfcf11a-77dc-eccb-0cf1-4effdaa719e5.png)

※Macで初スクリーンショットにつき、かなり雑なトリミングですいません

要するに、これで私は…事実上、Progate上では、上級者ということか…！
まだ全然できないのに(笑)

一旦一通り動かし方は分かったので、明日からは実際にページを作っていきます！

#学習の記録
* Progate13日目
* 今日の勉強時間：2時間(その他Macをいじくる)
総学習時間：15時間
今日嬉しかったこと：やっとまともにMacをいじくれたこと！すごく便利！やっぱり時代の並みに乗ってみるものですなw　ただ、Macに慣れてしまうと、会社のPC(Windows)が不便そうですな
CIVIC TECH FORUM 2017:ボランティア参加で見えたこと！

3月25日、永田町GRIDで行われたCIVIC TECH FORUMに、ボランティア枠で参戦してきました！
普段のエンジニア中心の集まりとはまた違った雰囲気で、ぜひ覗いてみるのをオススメします。
＆Twitter実況担当して気がついた、イベント実況のテクニック集（おまけ）

CIVIC TECH FORUM
http://civictechforum.jp

togetterまとめ
https://togetter.com/li/1094364

#目次
1. そもそもシビックテックとは？
2. 参加者との距離が近い！
3. Twitter実況テクニック集
4. まとめ

# 1.そもそもシビックテックとは？

civic(市民の)tech、行政だけに頼らず、身の回りの課題を自分たちで解決しよう！という考え方、運動のことです。

![IMG_3452.JPG](https://qiita-image-store.s3.amazonaws.com/0/96286/fdff9b8b-5afd-ea99-25a1-275838fac639.jpeg)


実際にアプリやWebサービスを発表している団体もあります。Code for XXX(地域名)という名前を聞いたことがある人も多いのでは。
（以下にもっと詳しい解説があります）
http://www.civicwave.jp/archives/52137327.html

今回は、そうしたCIVIC TECHの活動をしている市民団体・スタートアップ・行政の中の人が一堂に会し、
お互いの抱える課題などを話し合うイベントでした。


# 2.参加者との距離が近い！

![IMG_3767.JPG](https://qiita-image-store.s3.amazonaws.com/0/96286/d87a74c0-736b-1b3a-ec2a-7794ffa1091e.jpeg)


### どうして距離が近いのか？
* ボランティア参戦だから。やっぱり一番熱いのは中の人です。
  一緒にボランティアしている人や、何ヶ月もかけて準備してきた人と、講演や考えたことについて話すチャンスがあるのが良いです。
  （懇親会ではじめに話す相手に困る、みたいなあるあるを回避できるのも◎笑）

* 参加型のイベントになるような設計
  例えば「アンカンファレンス」事前に決まったテーマではなく、イベント中に募集したテーマに沿って、
  参加者同士て（登壇者、来場者は無関係に）ディスカッションするもの。

  また、談話スペースにも会話を促す工夫が。お茶とお菓子のスペースにはおしゃべり好きなスタッフさんが配置。
  変な形のオブジェがあったり、当日の講演をイラストで議事録化した「グラレコ」があったり...

### その結果

* エンジニア以外の人たちが何に悩んでいるか、直接お話しすることができます。
* どんなところでエンジニアが必要とされているのかわかります。（アプリ作成、データの整理etc...）

# 3.Twitter実況テクニック集

講演内容が記録に残るようにツイートする、とのことで、これが結構大変でした。
やって良かった工夫集。

### 事前準備編
* 登壇者の名前・講演タイトルをスタッフみんながコピペできる所に置いておく。
* タグを予測変換に入れる
  -> 例えば【CTF2017】を「しびっく」で変換できるようにしておく
* 無音カメラを導入する
  -> 例えば「Microsoft Pix」などのアプリでも良い。
  写真ツイート担当すると、気に入った構図が撮れるまで何枚も取りたいので、音量は気を使います。

### 当日編
* 「1枚目のスライド」の写真を逃さない
  講演タイトル、講演者氏名がまとまっており、見栄えも良いため。
  人によってはさっさと2枚目に行ってしまうので、多少雑でもまず1枚すぐ撮影すること。
* ハッシュタグ検索結果のページからつぶやく
  ハッシュタグを手打ち入力するのは大変だけど、検索結果からつぶやくとデフォルトでハッシュタグが入力されているため。
* 誰の発言か分かるようにする
  当然ながら。〇〇氏＞「〜〜」みたいな感じ。
* 空き時間にtogetterする
  あらかじめ細かくtogetterすることで、後から全体のまとめを作りやすくなるライフハック。

# 4.まとめ

これに限らず、イベントにボランティア側で参加するのは本当にオススメです。
ただ参加して食べ飲みして帰るより勉強になるし、顔見知りも増えますよ！
Macで有料アプリがやってることをコマンドで実行する

Macを使ってて、ちょっとしたツールを探してApp Storeを見るも、有料で、ひぃぃ、ってなる。
アプリ無しで、コマンドラインでできることをメモっていこうと思う。


## ZIP（暗号化含む）

```shell-session
# ファイル圧縮 （momo1.txt を圧縮して memos.zip を作る）
$ zip memos.zip memo1.txt

# 既存のzipファイルに追加 （単純に上と同じようにすればいい）
$ zip memos.zip memo2.txt

# 暗号化ファイル圧縮
$ zip -e memos_enc.zip memo1.txt

# ディレクトリ圧縮
$ zip -r books.zip books

# 特定のディレクトリやファイルを-xオプションで除く
# （このオプションは最後に指定する. また正規表現はエスケープする）
$ zip -r books.zip books -x \*/.git\*

# 暗号化してディレクトリ圧縮
$ zip -er books_enc.zip books

# 解凍はunzipコマンドで。そのディレクトリに解凍される。
$ unzip books_enc.zip

# -d オプションで ディレクトリを作って解凍もできる。
$ unzip -d hoge books_enc.zip
```

## SVGの確認

[QuickLook](https://ja.wikipedia.org/wiki/Quick_Look)を使います。Finderでファイルを選んでいる時にでる、あのプレビュー機能です。
注意点としては、大きい辺を元に正方形にするので、加工は別にする必要があるでしょう。

```
# svg ファイルを見るだけ
$ qlmanage -t TargetPicture.svg

# svg ファイルを png に変換 （-o で出力先ディレクトリを指定. ファイル名は指定できない）
$ qlmanage -t -o ./ TargetPicture.svg

# サイズも調整　（-s でサイズ指定, -f だと倍率指定）
$ qlmanage -t -s 512 -o ./ TargetPicture.svg
```

## 簡単な画像情報取得・加工

[sips](https://developer.apple.com/legacy/library/documentation/Darwin/Reference/ManPages/man1/sips.1.html)を使います。

```
# 横幅を得る（ピクセル）
$ sips -g pixelWidth target_pic.png | fgrep pixel | awk '{print $2}'

# 高さを得る（ピクセル）
$ sips -g pixelHeight target_pic.png | fgrep pixel | awk '{print $2}'

# フォーマット変換
$ sips -s format jpeg target_pic.png --out output_pic.jpg

# リサンプル（縦横比変わる）
$ sips -z 600 400 target_pic.png --out output_pic.png

# リサンプル（縦横比変わらず. 大きい方に合わせる）
$ sips -Z 600 target_pic.png --out output_pic.png

# リサンプル（縦横比変わらず.縦か横を指定）
$ sips --resampleWidth 400 target_pic.png --out output_pic.png
$ sips --resampleHeight 400 target_pic.png --out output_pic.png

# 中心からクロップ
$ sips -c 256 256 target_pic.png --out output_pic.png

# 回転（度で指定）
$ sips -r 30 target_pic.png --out output_pic.png

# 反転
$ sips -f horizontal target_pic.png --out output_pic.png
$ sips -r vertical target_pic.png --out output_pic.png

```

## MarkDown

ネイティブな環境だけではちょっと無理かもなので、無料の[PanDoc](http://pandoc.org/)をインストールして使います。HomeBrewなどでもインストールできるので[Macのインストール方法](http://pandoc.org/installing.html#mac-os-x)を確認してほしい。

```shell-session
$ pandoc target.md > target.html   # htmlで出力される。
$ open target.html                 # Safariで表示
```

[Lynx](http://lynx.browser.org/)とかのテキストブラウザがあれば、もっと便利かも。[^1]

[^1]: Lynx は HomeBrew でインストール可能。

```shell-session
$ pandoc target.md | lynx -stdin -dump
```

ターミナルだけで読むのであれば、`plain`フォーマットか`asciidoc`で出力でも良い。

```
$ pandoc -t plain target.md
```

```
$ pandoc -t asciidoc target.md
```

pandoc は、いろいろな形式に変換できるので、[デモページ](http://pandoc.org/demos.html)で確認してほしい。

## 辞書（そして発音やらリスニングの勉強やら英語の勉強）

標準で入っている辞書を、URLスキーマを使って呼び出す。

```
$ open dict://tips
```

発音を確認したかったら、`say`コマンドが使える。単語はもちろん、文章も読み上げてくれる。英語話者としてAlexやVictoriaがあなたのMacに入っているはず！[^2]

[^2]: `say -v ?` で、話者のリストがみれる。

```
$ say -v Alex Quick brown fox jumps over lazy dog.
$ say -v Samantha Quick brown fox jumps over lazy dog.
$ say -v Victoria --interactive Quick brown fox jumps over lazy dog.
$ cat usfirst.txt | say -v Fred --interactive
```


----
nvidiaのGPUが搭載されたPCでUbuntuのインストーラが失敗する場合

## 問題
Ubuntuのisoイメージが入ったDVDやUSBメモリを使って、NVIDIAの（割と新し目の）GPUが搭載されたPCにUbuntuをインストールしようとすると、"Nouveau: unknown device"みたいなエラーメッセージが出てインストーラの起動途中（おそらくUbuntuのスプラッシュ画面）で失敗する。

## 原因
Ubuntuのインストーラに入っているNouveauというドライバはNVIDIA純正のドライバではなくそれをハックして作られたフリーソフトなので最新のデバイスには対応していなかったりする。（そのせいでUbuntuのインストーラがディスプレイ信号の制御が出来なくてコケる）

## 対処法
NVIDIAのドライバをインストーラに入れる方法も無くはないようだが、グラボを使わずにマザーボードに搭載されている（つまりonboardの）グラフィックデバイスのほうでインストールしてUbuntuが入ってからNVIDIAのドライバを後で入れるほうが簡単。

具体的には、
PC起動時にBIOS設定画面に入り、Displayに使うGraphic chipをNVIDIAのグラボからonboardに変えて、PCとディスプレイをつなぐケーブルをGPUではなくオンボードのコネクタの方にさしてインストーラをブートする。onboardのグラフィックデバイスは仕様が比較的枯れてるのでNouveauが問題なく動く。

## 参考ページ
- http://askubuntu.com/questions/795547/ubuntu-16-04-unable-to-boot-with-gtx-1080

## 終わりに
ググったときにパッと解決策が出てこないので本記事を書きました。
新人の指導者 or 新人の方へ


新人の方向けにいくつか記事を書いたので公開したいと思います。
新人を教育する人や、新人の方の少しでも役に立てれば幸いです。

※急いで書いたので間違っている部分や分かりにくい部分がありますorz

##Slack入門

[Slack登録編](http://qiita.com/y_sekitoba/private/18790bb73408a5d525bd)
[Slack入門 ~使い方編~ Part1](http://qiita.com/y_sekitoba/private/3b7641b39b8ad8130ad8)



##Github入門

[GitHub入門 ~登録編~](http://qiita.com/y_sekitoba/private/68c20feb591ad6dab92a)
[GitHub入門 ~利用編~](http://qiita.com/y_sekitoba/private/d5d5108a48d1110ff0d4)
[SSHKeyの設定](http://qiita.com/y_sekitoba/private/370954a9aba2fe3da077)
[GitHubとgitコマンドを利用する](http://qiita.com/y_sekitoba/private/b732424bffd507d27e1a)
[git入門 ~入門編~](http://qiita.com/y_sekitoba/private/aad68a9aef91e50172a8)



##ターミナル入門

[初めてのコマンドライン=>npmの利用まで](http://qiita.com/y_sekitoba/private/f0d50afe3884bd22f6d5)
[初めてのGulp入門 ~インストール編~](http://qiita.com/y_sekitoba/private/ca8f582dbf437afdbf1d)
[初めてのGulp入門 ~gulpfile入門~](http://qiita.com/y_sekitoba/private/363eae906925ada83289)