OmniAICreator/Qiita-1.07M huggingface dataset:
ぼくがかんがえた、さいきょうのMarkdown拡張記法


Markdownにこんな機能があればいいのに、という**妄想**です。いや、正確に言うと、ここに書いたような**DSLを現在実装中なので、何か意見・アドバイスとかあったらお願いします**っていう趣旨の記事です。

イメージとしては、Markdown以上slim以下みたいな。最も、Markdownはシンプルだからこそ使いやすいのですが・・・

# 拡張する機能

1. divタグによるインデントを実現する記法
2. インライン要素にspanタグを挿入する記法
3. htmlテンプレートと組み合わせて簡単に独自記法を定義する

## 拡張1: divタグによるインデントを実現する記法

### 趣旨
divでシンプルな階層構造作れるといいよねっていう。変換後のhtmlにcssでスタイル当てたい場合に便利かも。

### 解説
基本的に`word:`の形式で入力した文字列は、class付きのdivとして展開される

```md:変換前
checkpoint:
  title:
    タイトル
  description
    説明文
  list:
    - 項目1
    - 項目2
```

```html:変換後
<div class="checkpoint">
  <div class="title">
    <p>タイトル</p>
  </div>
  <div class="description">
    <p>説明文</p>
  </div>
  <div class="list">
    <ul>
      <li>項目1</li>
      <li>項目2</li>
    </ul>
  </div>
</div>
```
インデントは半角スペース2個で固定としたいが、ある程度自由マージンを設けるのももいいかも(2~4個なら有効みたいな)。

## 拡張2: インライン要素にspanタグを挿入する記法

### 趣旨
特定の文字だけ色を変えたいとか、標準のMarkdownで提供されていないインライン要素の装飾をしたい。これもcss前提。

### 解説

`{classname: テキスト}`の形式はspanタグに変換される。

例

```md:変換前
title:
  これが{red: タイトル}です

list:
  - {blue: リスト1}だよ
  - {yellow: リスト2}だよ
```

```html:変換後
<div class="title">
  <p>これが<span class="red">タイトル</span>です</p>
</div>
<div class="list">
  <ul>
    <li><span class="blue">リスト1</span>だよ</li>
    <li><span class="yellow">リスト2</span>だよ</li>
  </ul>
</div>
```

クラス名や`{}`の前後には、一つまでのスペース挿入が許可されるとする。

以下はいずれも有効

```md
{classname: テキスト}
{ classname: テキスト }
{classname : テキスト}
{classname:テキスト }
```

## 拡張3: htmlテンプレートと組み合わせて簡単に独自記法を定義する

### 趣旨
汎用的でない独自の記法を、各々で簡単に定義できたら便利。今回は例としてRubyの機能として拡張する場合を紹介。

### 解説

`拡張1`で前述したクラス付きのdivが特定の条件に当てはまった場合に、そのdiv以下のタグを独自記法に置換する。

例えば、`templates/`フォルダ以下にテンプレートファイルが存在する場合はdivを置き換えるとする。

`mylink`という独自記法を新たに定義する場合、`templates/mylink.html.erb`を作成する。

```erb:mylink.html.erb
<a href="<%= @href %>" rel="<%= @rel %>" target="<%= @target %>">
  <p><%= @title %></p>
  <p>
    <div>
      <p><%= @description %></p>
    </div>
  </p>
</a>
```

そして、`option: value`の形式で、Ruby側に値を渡すことができる。

以下はmylinkの変換例

```md:変換前
mylink:
  title: ヤフー
  href: http://www.yahoo.co.jp/
  description: ヤフーのトップページ
  rel: nofollow
  target: _blank
```

```html:変換後
<a href="http://www.yahoo.co.jp/" rel="nofollow" target="_blank">
  <p>ヤフー</p>
  <p>
    <div>
      <p>ヤフーのトップページ</p>
    </div>
  </p>
</a>
```

このように、タイトル・説明文・rel・target属性を指定できる独自のリンク記法を定義した。これなら、フロントエンジニアやコーダーでも比較的簡単に独自記法を追加することができる。

# まとめ
いかがでしょうか。ここまで来ると、もはやMarkdownである意味がない気もしてきますが・・・
というか、**これってほぼhamlとかslimでいいんじゃ**と、感じてきました。

冒頭でも書きましたが、現在ここに書いたようなDSLを開発中です。なにかご意見・アドバイス等ありましたらぜひお願いします。ほぼ出来てはいるのですが、細かい仕様の部分で迷走中なので・・・
seam carving (画像切り抜き) 試してみた

# seam carving?
![japan.gif](https://qiita-image-store.s3.amazonaws.com/0/132984/b4ef64dd-ebcf-7ce9-0ce7-dc50033c3149.gif)

seam carving とは、画像のリサイズをおこなうときに*単純な縮小*ではなく、
「いい感じ」に画像のいらない部分をつぶしてくれるアルゴリズムです。
[この動画](https://www.youtube.com/watch?v=qadw0BRKeMk) をみると、一体何が起こるのかがわかりやすいと思います。
初めて見るときはまるで魔法のように見えてしまいます。

SigGraph2007 で提案された方法なので、結構昔からある方法です。[^1]


# やってみる
IPython Notebook 上で試していたので、notebook上でないと動かないと思います

```python
import matplotlib.pyplot as plt
from skimage import transform
from skimage import filters
import cv2

%matplotlib inline


def carve(image, num, mode='vertical'):
    """「切り取り」をする関数"""
    # 画像をグレイスケールに変換し、Sobel gradient magnitude representation を計算します。
    # これは "energy map" として、seam carving アルゴリズムに必要な情報となります。
    # energy map には、必ずしも Sobel を使う必要はありません。
    gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    mag = filters.sobel(gray.astype("float"))
    
    carved = transform.seam_carve(image, mag, mode=mode, num=num)  # 切り取り！
    carved = (carved * 255).astype('uint8')
    return carved


# 元画像を読み込みます
original_image_path = 'images/original/japan.jpg'

# load the image
image = cv2.imread(original_image_path)
# show the original image
plt.imshow(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))


# 少しずつ切り取り
carved = image
for i in range(21):
    carved = carve(carved, num=10, mode='vertical')
    plt.imsave('images/carved/japan_v_{}.jpg'.format(10*i), cv2.cvtColor(carved, cv2.COLOR_BGR2RGB))
```


# で、seam carving ってどういうアルゴリズム？
"seam" とは「縫い目」、"carving" とは「彫刻」という意味です。
ここで、「縫い目」とは、画像に対して「上から下」または「左から右」に引かれた線を意味します。
この縫い目が、画像の「どうでもいい部分」を横切るように設定してあげます。
(例えば、下の図 [^2] の赤い線が「縫い目」です)
![image](https://qiita-image-store.s3.amazonaws.com/0/132984/86ba3ff7-45c5-a812-29ab-c0d5d9f3bee0.png)

縫い目に沿って画像を切り取り、うまいこと重ね合わせることで、冒頭の gif のような画像のリサイズを可能にします。
energy map 上での変化が小さくなるように画像を横切る線を計算したものが縫い目、seam です[^3]。

今回の例では、横方向にしか縮めていませんが、もちろん縦方向へも縮めることが可能です。
また、縮めるだけではなく、拡大することも可能です。[^4]

# Deep Learning？
seam carving は Deep Learning ではありません。
が、energy map として Deep Learning で抽出した注目領域を使う等の工夫は今後出てくるかも知れません。

# ギャラリー
うまくいかない画像も多いです。以下にはうまくいった例を載せます。

画像中に注目したい部分が分散して出現しているとうまくいきやすいです。
(例えばタージマハルでは尖塔が左右にうまく分散して写り、途中の何もない部分を切り取ることができる)
注目したい部分が一箇所だけしかない画像の場合、左端と右端を順番に切り取っていくような、あまりおもしろくない結果が得られることが多いです。

また、そもそも切り取る余地のない画像 (例えば画像いっぱいに猫が写っている写真など) も苦手でした。(これはそもそも切り取れないのだから仕方ない気がします)

## タージマハル
![taj.gif](https://qiita-image-store.s3.amazonaws.com/0/132984/c7f16054-6d2c-bb0c-4af4-ded685c9ecf8.gif)
うまく隙間をつぶしています。

## 九龍城
![kuron.gif](https://qiita-image-store.s3.amazonaws.com/0/132984/43bd4772-6381-d924-7d88-637c1adedf82.gif)
画像全体は横方向に縮んでいるのに、左側に見える赤い看板の文字は縮んだりしていないことが見えます。(看板自体は段々縮んでいます)




# 参考文献
- 紹介ブログ
    - http://www.pyimagesearch.com/2017/01/23/seam-carving-with-opencv-python-and-scikit-image/
- 論文
    - http://perso.crans.org/frenoy/matlab2012/seamcarving.pdf
- Scikit-Image による実装
    - http://scikit-image.org/docs/dev/api/skimage.transform.html#seam-carve



[^1]: 三菱電機の研究所が発表したものらしいです
[^2]: 出典：参考文献の論文：Figure1
[^3]: 不勉強ゆえ、energy map にどんな種類があるのかのリストはまとめられませんでした
[^4]: 拡大に関しては、 scikit-image に実装がないため自分で実装する必要があります
[Julia] ... (splat, slurp) 

Julia ミニパターン。Julia 独特の構文を、不定期に紹介したいと思います。
初回は `...` について。


# 可変長の仮引数 (slurp)

参照: 
* http://docs.julialang.org/en/stable/manual/functions/#varargs-functions
* http://docs.julialang.org/en/stable/manual/faq/#combines-many-arguments-into-one-argument-in-function-definitions

関数定義で、仮引数の名前に `...` を続けると、任意の数の実引数を受け取れます。仮引数は tuple になります。 


```Julia
julia> function foo(v...)
         @show v
       end
foo (generic function with 1 method)

julia> methods(foo)
# 1 method for generic function "foo":
foo(v...) at REPL[1]:2

julia> foo(1)
v = (1,)
(1,)

julia> foo(1,"a")
v = (1,"a")
(1,"a")

julia> foo(1,"a", [3,4])
v = (1,"a",[3,4])
(1,"a",[3,4])
```

Python, Ruby では、可変長仮引数の前に `*` をつけますね。この構文は slurp (音を立てて飲食する) と呼ばれます。

参考
* https://hydrocul.github.io/wiki/programming_languages_diff/function/var-args.html

# 実引数のリストを、複数に展開する (splat)

参照: 
* http://docs.julialang.org/en/stable/manual/faq/#combines-many-arguments-into-one-argument-in-function-definitions

関数呼び出しで、実引数のリストやタプルを、複数の実引数に展開してから、呼び出します。

```Julia
julia> function bar(x,y,z)
         @show x
         @show y
         @show z
       end
bar (generic function with 1 method)

julia> bar(1,2,3)
x = 1
y = 2
z = 3

julia> bar([1,2,3]...)
x = 1
y = 2
z = 3

julia> bar((1,2,3)...)
x = 1
y = 2
z = 3
```

`bar([1,2,3]...)` と `bar((1,2,3)...)` は、`bar(1,2,3)` と同じです。

こちらの機能は splat と呼ばれています。splat 「ピシャ」(濡れた物を床にたたきつけるときの擬音語)


## 例: 任意の数のベクトルから、行列を作る。

私が書いた例を紹介します。
ベクトルを値とする辞書を作っておきます。(Dictでは、キーの並び順は決まっていません)

```
julia> vdict = Dict(
         "a" => [1,1,0],
         "b" => [1,0,1], 
         "c" => [0,1,1], 
         "d" => [2,1,1] )
Dict{String,Any} with 4 entries:
  "c" => [0,1,1]
  "b" => [1,0,1]
  "a" => [1,1,0]
  "d" => [2,1,1]
```

キーを用いて、ベクトルをいくつか選びます。Comprehension `[ ___ ]` で、ベクトルのリストを作ります。

```Julia
julia> [ vdict[k] for k in ["d","a", "c"] ]
3-element Array{Array{Int64,1},1}:
 [2,1,1]
 [1,1,0]
 [0,1,1]
```

これらの列ベクトルを並べて、行列を作りましょう。`hcat` を用いたいのですが、リストを引数にとれません。そこで、上のリストを `...` で展開します。

```Julia
julia> hcat( [ vdict[k] for k in ["d","a", "c"] ]... )
3×3 Array{Int64,2}:
 2  1  0
 1  1  1
 1  0  1
```

ワンラインで大満足です。ベクトルの数によらず、同じ構文で OK です。
※ この件に限れば　`reshape` で可能ですが、要素を数えないといけません。Fortran や C なら、行列を用意して、要素毎にコピーするのでしょうが、もう面倒です。


[追記 2017/01/30]
本記事直下のコメントの通り、comprehension (リスト内包表記) `[ ___ ]`より、generator `( ___ )` を使う方が、上の例の性能が改善します。 Julia 0.5 の generator の紹介は、コメント主 @antimon2 さんの記事をご覧ください。→ http://qiita.com/antimon2/items/89562cf7c1115c500f02
MASCHINE test  Linear Regression with Multiple Variables

package samples.string.japanese;
public class ZenkakuAlphabetToHankakuAlphabet {
public static String zenkakuAlphabetToHankaku(String s) {
StringBuffer sb = new StringBuffer(s);
for (int i = 0; i < sb.length(); i++) {
char c = sb.charAt(i);
if (c >= 'ａ' && c <= 'ｚ') {
sb.setCharAt(i, (char) (c - 'ａ' + 'a'));
} else if (c >= 'Ａ' && c <= 'Ｚ') {
sb.setCharAt(i, (char) (c - 'Ａ' + 'A'));
}
}
return sb.toString();
}
public static void main(String[] args) {
System.out.println(zenkakuAlphabetToHankaku("☆Ｊａｖａプログラミング☆"));
}
}![00.png](https://qiita-image-store.s3.amazonaws.com/0/121250/4bab1325-8e5b-a3d5-b5f3-aaa9491d014b.png)
Emacs + ENSIME でScalaの開発環境を作る

Emacs + ENSIME
==============
Windowsでは動かないScalaのコードがあって、VirtualBoxにLubuntuを入れ、そこにIntelliJをインストールしてScalaのコードを書いてきた。しかし、IntelliJの動作が重くてツラいのでEmacs + [ENSIME](http://melpa.milkbox.net/#/ensime)を試してみることにした。

scala-mode
==========
githubの[scala-mode2](https://github.com/hvesalai/scala-mode2)のページを見ると以下のようになっており、[ENSIME](http://melpa.milkbox.net/#/ensime)のdependenciesに含まれている為、別途インストールする必要は無くなっている。
> Development of scala-mode2 has moved to https://github.com/ensime/emacs-scala-mode

Install
========
stable-mepla
------------
[stable-mepla](https://stable.melpa.org/#/)をinit.elに以下を登録しておく。

```el:~/.emacs.d/init.el
(add-to-list 'package-archives '("melpa-stable" . "https://stable.melpa.org/packages/") t)
```

use-package
-----------
Emacsにuse-packageをインストールしておく。

```text
M-x package-install use-package
```

inits
-----
init-loaderを使っているので、ENSIMEの設定は`~/.emacs.d/inits/90-scala.el`に書いておくことにした。

```el:~/.emacs.d/inits/90-scala.el
(use-package ensime
  :ensure t
  :pin melpa-stable)
```
以上でEmacs起動時にENSIMEがインストールされる。

.ensimeファイルの作成
====================
プロジェクトフォルダの直下に.ensimeファイルが必要になる。今回はこのファイルを生成する為に、sbt-ensimeプラグインを使う。[sbt以下のビルドツールにも対応している](http://ensime.org/build_tools/)ので、自分の好みのビルドツールのインストラクションに沿って作成する。

sbtのpluginsフォルダが無ければ作成する。

```shell-session
mkdir ~/.sbt/0.13/plugins
```

sbt-ensimeプラグインを利用する為に、以下のように記述する。

```text:~/.sbt/0.13/plugins/plugins.sbt
addSbtPlugin("org.ensime" % "sbt-ensime" % "1.12.5")
```

あとは以下のコマンドを実行すれば、.ensimeファイルが作成される。

```shell-session
sbt ensimeConfig
```

ENSIMEの起動
===========
.ensimeファイルを作成したプロジェクトフォルダに移動し、以下のコマンドでENSIMEを起動する。"ENSIME server starting..."と出た後に、"ENSIME ready."となればOK。

```text
M-x ensime
```

また、`C-c C-v s`でsbtが起動するので、sbtの操作はそのバッファで行う。

![Screenshot from 2017-01-30 00-34-37.png](https://qiita-image-store.s3.amazonaws.com/0/20617/7e5db95c-0d5d-edc8-f91a-44846feb7863.png)

その他
======
よく使うコマンド
--------------

- `C-c C-c e` エラーを表示
- `C-c C-v r` 呼び出し元を表示

参考
====

- [Installation - ENSIME](http://ensime.org/editors/emacs/install/)
- [Cheat Sheet - ENSIME](http://ensime.org/editors/emacs/cheat_sheet/)
Apacheの設定から$_SERVER変数の値を付与する方法

PHPの`$_SERVER`変数とは、サーバや実行環境に関する情報を扱う配列です。

> $_SERVER は、ヘッダ、パス、スクリプトの位置のような 情報を有する配列です。この配列のエントリは、Web サーバーにより 生成されます。全ての Web サーバーがこれら全てを提供する保障はありません。 サーバーは、これらのいくつかを省略したり、この一覧にない他のものを 定義する可能性があります。これらの変数の多くは、 » CGI/1.1 specification で定義されています。したがって、これらについては定義されていることを 期待することができます。
http://php.net/manual/ja/reserved.variables.server.php

開発サーバ上で`$_SERVER`変数の値を用いた処理の動作確認をしたい時、本番サーバで付与される環境変数が開発サーバだと付与されないため動作確認できない、というのがありました。

このとき、Apacheの設定ファイルで以下のように記述することで、環境変数を定義することができます。
どうしても開発サーバ上でテストしたいときは、この方法で対応することができました。

```/etc/httpd/conf.d/httpd.conf
<VirtualHost *:80>
　　　（中略）
  SetEnv HTTP_X_CLIENT_IP "127.0.0.1"
</VirtualHost>
```

参考記事：
Apache の環境変数
http://httpd.apache.org/docs/2.0/ja/env.html

開発環境と本番環境で設定が違うときはSetEnvが便利ですね
http://www.ideaxidea.com/archives/2010/04/setenv.html
LINE bot と Annict API を使用してアニメ情報をお知らせする Bot を作成する

# LINE bot と Annict API を使用してアニメ情報をお知らせする Bot を作成する

* お題 : LINE bot と Annict API を使って今期のアニメ一覧を取得する

# LINE BOT 作成までの流れ

## LINE Bussiness Center のアカウントを取得
* https://business.line.me/ja/
    * いわゆる LINE のアカウント

## Messaging API を Developer Trial で始める
* https://business.line.me/ja/companies/1278093/services/bot
* LINE@ が Developer 運用で使用できるようになる
    * LINE@ MANAGER で bot の設定が可能になる

### LINE@ MANAGER

* 下記のような管理画面が使用可能になる
<img width="1430" alt="LINE_MANAGER.png" src="https://qiita-image-store.s3.amazonaws.com/0/28573/debecad1-6bc8-c49f-d884-d06d142fdccf.png">


* Bot 設定から「Webhook送信:利用する」と「自動応答メッセージ:利用しない」に変更しておく必要がある
<img width="1367" alt="setting.png" src="https://qiita-image-store.s3.amazonaws.com/0/28573/d0a3e315-d581-8439-5285-3a32b7032a3f.png">

## システムの用意

* Messaging API を使用した Bot の構成は以下のようになるのでシステム側を用意する必要がある(公式より)
![LINE_API_Arch.png](https://qiita-image-store.s3.amazonaws.com/0/28573/3d23a0c8-918f-faa1-6821-678086bd6f01.png)

* 今回はシステムを Heroku に用意
* Messaging API のドキュメントは下記にある
    * https://devdocs.line.me/ja/?ruby#messaging-api
* メッセージのやりとりには channel secret と channel access token が必要になるので LINE Developer のページから確認する

<img width="1440" alt="developer.png" src="https://qiita-image-store.s3.amazonaws.com/0/28573/7bc1ad3b-aa9a-1cdb-df9e-b5e32df58661.png">

* heroku の環境変数に登録しておくことで下記のように情報を取得可能
* システムを用意したら LINE Developer ページから 「Webhook URL」 を登録しておく

```rb
message = {
  type: 'text',
  text: 'hello'
}
client = Line::Bot::Client.new { |config|
    config.channel_secret = ENV["LINE_CHANNEL_SECRET"]
    config.channel_token = ENV["LINE_CHANNEL_TOKEN"]
}
response = client.reply_message("<replyToken>", message)
p response
```

# Annict API を使うまでの流れ

* Annict API を使用するために認証をする
    * https://annict.com/oauth/applications
* 認証をすると「アプリケーションID」と「シークレットキー」が発行されるので、下記 API で token を発行
    * https://annict.wikihub.io/wiki/api/authentication#post-oauth-token
* token を使用して今期のアニメ一覧を取得

```rb
uri = URI.parse("https://api.annict.com/v1/works?fields=title&per_page=50&filter_season=2017-winter&sort_watchers_count=desc&access_token=#{ENV["ANNICT_ACCESS_TOKEN"]}")
```

# LINE bot で試す

* 「アニメ一覧」に反応して、上記 API を叩くようにする
<img width="341" alt="anime_list.png" src="https://qiita-image-store.s3.amazonaws.com/0/28573/4f93e80a-29d9-1f81-2252-81a45729e944.png">

* これで録画漏れを防げる！！

# 参考リンク
* http://www.indetail.co.jp/blog/13006/
* https://annict.com/
* http://nukosuke.hatenablog.jp/entry/annict/hubot
Railsでフォロー／フォロワー機能を実装する

## はじめに
RailsでTwitterのようなフォロー／フォロワーの機能を実装する方法を紹介します。

## 環境
Ruby 2.3.1
Rails 5.0.0.1
Mac OS X Yosemite 10.10.5

## 扱うモデル
今回は`User`というモデルに対して、フォロー／フォロワーの関係を実装します。

```user.rb
class User < ApplicationRecord
end
```

## Gem
`acts_as_follower`というGemを使用します。
https://github.com/tcocca/acts_as_follower

### Rails5

```rb:Gemfile
gem "acts_as_follower", github: "tcocca/acts_as_follower"
```

※Rails5だと現時点のリリースではエラーが起きるため、githubから取得するようにしています。

### Rails4

```rb:Gemfile
gem 'acts_as_follower'
```
※Rails3以前だと方法が異なりますので、公式を参照して下さい。

### bundle install
```
bundle install
```

## Followモデルとテーブルを作成

```
rails generate acts_as_follower
```

これにより、以下のファイルが生成されます

```
create  db/migrate/{日時}_acts_as_follower_migration.rb
create  app/models/follow.rb
```

マイグレーションを実行します。

```
rails db:migrate
```

## Userモデルへフォロー／フォロワーの関係を実装

以下をUserモデルへ追記します。

```user.rb
class User < ApplicationRecord
  acts_as_followable # フォロワー機能
  acts_as_follower   # フォロー機能
end

```

これでモデルへの実装は完了です。
早速、実行していきましょう。

## フォロー／フォロワー機能を使用する

### フォローする
```rb
taro = User.find(1)
jiro = User.find(2)
taro.follow(jiro) # taroがjiroをfollowする
```

### フォローしているユーザを取得する
```rb
taro.all_following # フォローしているUserの配列が返る
```

### フォローされているユーザ（フォロワー）を取得する
```rb
jiro.followers # フォローされているUserの配列が返る
```

### フォローしているかを確認する
```rb
taro.following? jiro # true
```

### フォローされているかを確認する
```rb
taro.followed_by? jiro # false
```

### フォロー数を取得する
```rb
taro.follow_count # 1
```

### フォロワー数を取得する
```rb
jiro.followers_count # 1
```

### フォローを取り消す
```rb
taro.stop_following(jiro) # taroからjiroへのフォローを削除する
```

## おわりに
同じモデル同士でない場合のフォロー／フォロワー（例えば、User⇔Bookなど）も簡単に実装することができますので、
興味を持たれた方は、公式のREADMEを読むとより便利そうです。
https://github.com/tcocca/acts_as_follower
【Debian 8 Jessie】iptablesの設定をこれだけはやっておく

この記事は、下記の記事を構成している記事のひとつです。
[さくらのVPS と Debian 8 Jessie で独自ドメインのWebサイトを立ち上げる手順](http://qiita.com/osktak/items/7224bd263288b40b4b98)

・さくらのVPS（プラン512）
・Debian 8 Jessie（さくらのVPS カスタムインストール）
の環境を前提にしています。

# インストール直後のiptablesの設定を確認する

```tarminal:[hoge]$
sudo iptables -L
```
```
Chain INPUT (policy ACCEPT)
target     prot opt source               destination

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination
```

つまり、すべて許可しますよー。って設定になっている。インターネット上に公開サーバを立てる以上、最低限の設定はしておくべきです。

# iptables-persistent をインストールする
iptablesを管理する、iptables-persistentをインストールします。

```tarminal:[hoge]$
sudo aptitude -y install iptables-persistent
```

インストール中に、IPv4と、IPv6の設定ファイルを作成するか聞かれるので、どっちもYesを選択します。

![iptables01.png](https://qiita-image-store.s3.amazonaws.com/0/162149/0af3f97f-84d9-307c-a91c-d6f5b793738a.png)

![iptables02.png](https://qiita-image-store.s3.amazonaws.com/0/162149/10e64af3-85f3-f401-a153-073657dca82c.png)

# iptables(IPv4)のルールを設定する
IPv4用の設定ファイルを、下記の内容ですべて書き換える。

```tarminal:[hoge]$
sudo cp /etc/iptables/rules.v4 /etc/iptables/rules.v4.backup
sudo vi /etc/iptables/rules.v4
```
```Bash:/etc/iptables/rules.v4
*filter

# ループバックは許可する。
# ループバック以外の127.0.0.0/8への接続は拒否する。
-A INPUT -i lo -j ACCEPT
-A INPUT ! -i lo -d 127.0.0.0/8 -j REJECT

# 確立済の外部から内部への接続を許可する
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# 内部から外部への接続はすべて許可する
-A OUTPUT -j ACCEPT

# 外部から内部へのHTTP(80)とHTTPS(443)の接続を許可する
-A INPUT -p tcp --dport 80 -j ACCEPT
-A INPUT -p tcp --dport 443 -j ACCEPT

# 外部から内部へのSSHの接続を許可する
# ポート番号は、/etc/ssh/sshd_config で設定したものと同じにする
-A INPUT -p tcp -m state --state NEW --dport 1234 -j ACCEPT

# 外部から内部へのpingの接続を許可する
-A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT

# log iptables denied calls (access via 'dmesg' command)
-A INPUT -m limit --limit 5/min -j LOG --log-prefix "iptables denied: " --log-level 7

# その他の接続を拒否する
-A INPUT -j REJECT
-A FORWARD -j REJECT

COMMIT
```

設定したファイルを再読み込みする。

```tarminal:[hoge]$
sudo netfilter-persistent reload
```

# iptables(IPv6)のルールを設定する
IPv6用の設定ファイルを、下記の内容ですべて書き換える。
IPv6での接続は、すべて拒否する設定にします。

```tarminal:[hoge]$
sudo cp /etc/iptables/rules.v6 /etc/iptables/rules.v6.backup
sudo vi /etc/iptables/rules.v6
```
```Bash:/etc/iptables/rules.v6
*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT DROP [0:0]
COMMIT
```

設定したファイルを再読み込みする。

```tarminal:[hoge]$
sudo netfilter-persistent reload
```
Raspberry Pi 防犯赤外線カメラ(PHP編)

[前回](http://qiita.com/Naoki-Takamatsu/items/3ef4f04b36e4be21dbdc)、簡易的な防犯カメラシステムを構築し
Pythonから単純な動作確認を行えるようにしました。

今回は出先からスマホで色々行うための
前準備として、PHPにてカメラを制御します。

#＜注意＞
WEBサーバーを外部公開した状態で
カメラをハンドリングすると映像が漏洩する
可能性があるので取り扱いに注意！
セキュリティを考慮しましょう。

# 【使用する物】
※[前回](http://qiita.com/Naoki-Takamatsu/items/3ef4f04b36e4be21dbdc)と同じ

# 【前提条件】
※[前回](http://qiita.com/Naoki-Takamatsu/items/3ef4f04b36e4be21dbdc)と同じ
※「vchiq」のパーミッションが変更済みである事
　$ ls -l /dev/ | grep vch
　$ sudo chmod a+rw /dev/vchiq
　$ ls -l /dev/ | grep vch
私のブログで以前構築したWEBの環境を導入済み
（Apache、PHP、MySQL辺り）
[リンク](http://schwarzfalke.net/2016/08/18/post-34/)

# 【PHP単体の静止画テスト】
```PHP:StillTest.php
<?php

$results = shell_exec('gpio -g mode 6 out');
echo "<pre>$results</pre>";

$results = shell_exec('gpio -g write 6 1');
echo "<pre>$results</pre>";

$results = exec('/usr/bin/raspistill -o php_test.jpg');
echo "<pre>$results</pre>";

$results = shell_exec('gpio -g write 6 0');
echo "<pre>$results</pre>";

echo "<img src=\"php_test.jpg\">";
?>


```

「http://アドレス/StillTest.php」にて静止画の撮影と
GPIOに接続されたLEDを動作させます。

くどいですが外部公開したサーバーでは気をつけましょう。
Apache Wicketを使ってみた

# Apache Wicketをつかってみた

他の事業部が作ったWeb Applicationの機能改修をしつつ、その後の運用保守もするってことに。
で、とりあえずどんなフレームワーク使っているのかソースを見てみると、Apache Wicketというもの。知らない。
画面モックと思っていたHTMLファイルが実は本番用のHTMLを兼ねている（正式には本番用のHTMLファイルがモックを兼ねている）のをみて俄然興味がわきました。
知らないフレームワークが出ると、いつもはとりあえず本を一冊買って読んでみるのでamazonで検索。2009年の本が、7198円…だと…？他に日本語の書籍はなさそうだ。諦めよう。
ということでwebの情報をもとに、作りながら学んでいきます。
とりあえず勉強がてら何かしらのサンプルを作ってみました。

:one: Eclipse上にPJの作成
とりあえず、何はともあれ環境を。
Eclipseでmaven projectを作ろうとすると、Apache wicket quickstartなるものが。

https://wicket.apache.org/start/quickstart.html
最初からここ見ればよかったのだけど、作ってから気が付きました。
projectを作るとサンプルコードらしきものが。
とりあえず、サンプルは動いた。
versionは古いけど1.4.23でやってみた。

:two:htmlとjavaの対応について　その①

サンプルのhtmlに1つ追加してみる。

```HomePage.html
<span wicket:id="footer">This is footer message.</span>
```
Unable to find component with id 'footer'...
みたいなエラーになってしまった。
なるほど、これが公式サイトにあった*Web pages are objects*ってことなのか。
htmlとJavaのオブジェクトが対応付けられているので、htmlにあるものは、Java側にも必要なのね。

```HomePage.java
add(new Label("footer", "This is fotter."));
```

HomePageメソッド内にfooterに対応するクラスを追加すると、footerが表示されました。
どういう仕組みでこんなことになっているのか、これから調べてみよう。
cloud9とgithubとherokuでアプリをスクラップアンドビルド

ネットにさえつながっていれば、どんなPCからでも開発できる環境が、すぐに作れてしまう今ってすばらしい。

>###cloud9で開発して、githubでバージョン管理して、herokuで公開する。

そんなすばらしい時代

ためしに作ったはいいが、ためしにたくさん作るとそれぞれのサービスでダッシュボードが汚れるので、それぞれのプロジェクトを削除したくなる。

スクラップ（削除）もビルド（新しく作る）もすばやくできるとよいので忘れないように、すぐ参照できるように。

#ビルド（新しいのを作る）

####1.cloud9　～ワークスペース上にリポジトリを作る
・新しいワークスペースを作る 
・bashから下記コマンドを入力
`git init`
`git add .`
`git commit -m "first commit"`


####2.github　～githubにもリポジトリを作る
・新しいリポジトリを作る
・新しくできたリポジトリの解説ページの下から２個目のやつをコピー
`git remote add origin https://github.com/ｘｘｘｘｘｘｘｘｘｘｘ.git `
`git push -u origin master`
みたいなやつ


####3.cloud9　～二つのリポジトリを関連付ける 
・さっきのやつをペーストして実行


####4.github　～反映されているかな？ 
・(ちゃんとプッシュされてるか確認）


####5.heroku　～herokuにもリポジトリ作る＆関連付け＆反映確認
・新しいプロジェクトを作る
・連携するサービスにgithubを選択
・searchから任意のリポジトリ（連携させたりリポジトリ）を選択（connect)
・Enable Automatic Deploys　ボタンを押す
・Deploy Branch　ボタンを押す
・（画面右上の）Open app ボタンからちゃんと反映されているか確認

以上。

#スクラップ（削除）

####cloud9のワークスペースの削除のやり方
・サインインして該当ワークスペースの概要欄（？）に入る（囲みの中のopenでもcloneでもない部分でクリックする）
・右上の歯車アイコンをクリック
・下部にdelete workspaceボタンあり


####githubのリポジトリの削除のやり方
・リポジトリを選択
・setting　タグを開く
・下部にdelete this repositoryボタンあり


####herokuのプロジェクトの削除のやり方
・プロジェクトを選択
・setting　タグを開く
・下部にdelete app..ボタンあり

以上。


参考にさしてもらったのは
http://qiita.com/HideakiSaito/items/5be1a45870a4c3d1a3c7

※ものすごくいい記事だけど、一箇所だけうまくいかなかったので、下記URLの参照は必須か
http://stackoverflow.com/questions/30173172/postgres-wont-connect-to-server-in-ruby-on-rails-app-using-c9-io

記事ではrailsの例が載っているけれども、ほかのプロジェクトでもうまくいくはず。

cloud9のワークスペースの削除のやり方
http://okwave.jp/qa/q9032658.html

githubのリポジトリの削除のやり方
http://qiita.com/PlanetMeron/items/4d164eff7bff2243cf06

herokuのプロジェクトの削除のやり方
???????????

**とこれでもう、好きなだけ作って（ビルド）して好きなだけ壊して（スクラップ）トライアンドエラーを繰り返せるので大変にうれしい。**
社内Slackでどんな絵文字リアクションがよく使われているかをGoで集計してみた


皆さん絵文字が好きですか？
私は好きです。
とくにSlackのカスタム絵文字を作成するのに日々情熱を傾けています。

というわけで、自分が作ったカスタム絵文字が社内でどれぐらい使われているのかが、気になったので、Goの勉強もかねてスクリプトを作りました。

## 概要
1. Slack APIでチャンネル一覧を取得（取得できるチャンネルはアカウントの権限による）
2. チャンネルの投稿を取得（MAX1000件）
3. 投稿のリアクションについた絵文字を集計
4. 降順に並べて結果を`#general`に投稿

## GOのスクリプト
2.の投稿を取得する処理はGoルーチンを使ってみました。
あと、集計をストアしておくマップの更新は排他制御を入れました。
↓詳細はここに
https://github.com/dondoko-susumu/slack-emoji-ranking


## ランキング結果
スクリプト実行するとgeneralに結果が投稿されます。
以下は、我が社のランク上位の結果です。
![ScreenShot.png](https://qiita-image-store.s3.amazonaws.com/0/49022/d1424215-3cd8-41a7-a141-ed137d45d9e9.png "ScreenShot.png")

我が社では、承知スタンプがダントツの１位でした。

![shochi_120new.png](https://qiita-image-store.s3.amazonaws.com/0/49022/4b70f372-6eff-a8dc-3d31-26bf531911c1.png "shochi_120new.png")

ちなみに、この承知スタンプは私が今の会社に入って間もない時にGIMPで作りました。
カジュアルにコミュニケーションができるSlackですが、やはりそこは会社なので上下関係もあるし気軽に:+1:と、返答するのも気がひけるので、礼節を欠くことがないような絵文字が欲しいなと思い作りました。
こうやってみんなに使われているのをみると、嬉しいですね。
著作権ドフリーですので、皆さんもよかったら使ってみてください。

## 参考
* [API TOKEN 取得方法](https://api.slack.com/docs/oauth-test-tokens)
* [channels.history](https://api.slack.com/methods/channels.history)
* [channels.list](https://api.slack.com/methods/channels.list)
* [chat.postMessage](https://api.slack.com/methods/chat.postMessage)
* [github.com/pastjean/slackapi](https://github.com/pastjean/slackapi)
* [github.com/nlopes/slack](https://github.com/nlopes/slack)
* [SlackのAPI、webhookをgolangで試した](http://qiita.com/xuj/items/4c45185bb3b3862cd7f1)
* [Go net/httpパッケージの概要とHTTPクライアント実装例](http://qiita.com/jpshadowapps/items/463b2623209479adcd88)
* [golangのenconding/jsonのタグについて](http://qiita.com/pside/items/0fc7f85746211371b23e)
* [マップを値で降順、値が等しい場合キーで昇順にソートする](http://ashitani.jp/golangtips/tips_map.html#map_Sort)
* [Slackの各チャンネルの利用頻度を可視化してみた](http://blog.serverworks.co.jp/tech/2016/04/08/slack-viz/)
CTF4b 2016 FINAL@TOKYO write up①

産まれて初めてのCTFはCTF4b2015@長野。

気合入れて長野まで行って満足してしまい、それ以降何もしてなかったが、本日FINAL@TOKYOに参戦。

今後は活動していきたいと思うので、Qiitaでwrite upを見よう見まねで書いていこうかなと。



#**Forensics　あけてみよう**

ダウンロードしたpcapを展開し、とりあえず、http通信をTCP stream

![image.png](https://qiita-image-store.s3.amazonaws.com/0/162316/f301b1e4-9bd2-195d-f6ec-3c726e75456d.png)


PKで始まる文字列があるのでzipファイルがあるんだなと。

教えてもらった「ファイル」-「オブジェクトを保存」を実行

transfer.zipたるファイルが出現。解答すると2.pcapが

開くとFTPが。問答無用でstream!!!

![image.png](https://qiita-image-store.s3.amazonaws.com/0/162316/7c0744b9-ee63-ee04-3bdd-161a2f7df318.png)

またしても「zip」の文字が。もう一度「オブジェクトを保存」したいところだが、選択できず

教えてもらったコマンド
``$ binwalk -e 2.pcap``
を実行

![image.png](https://qiita-image-store.s3.amazonaws.com/0/162316/0a863147-549b-cbf2-ff57-85b199f826d4.png)

flagが出たと思いきや、0byte・・・

ここから地獄にハマる

最終的にwindows上で　2.pcap を 7zip で解凍するとあっさり画像が表示


![image.png](https://qiita-image-store.s3.amazonaws.com/0/162316/0f7fea1c-fed3-22b0-e588-b1303679056e.png)

なぜ　binwalkで出来ないんだ！？
Visual Studio Code Intro


Visual Studio Code の Intro Videos を見たのでそのまとめです。

[Intro Videos](https://code.visualstudio.com/docs/introvideos/overview)

## Basis

* Quick Open: [command] + [p]
* Command Palette: [command] + [shift] + [p] or [F1]
* IntelliSense: [control] + [space]
* Go to Definition: [command] + [click]
* Side by Side Editing: [command] + [click file]

## User Setting
* Change Setting: [command] + [shift] + [p]: Preferences: Open User Settings
* Change Keyboard Shortcuts: [command] + [shift] + [p]: Preferences: Open Keyboard Shortcuts
* Create New Snippet: [control] + [space] + [p]: Preferences: Open User Snippet

## HTML

* Emmet syntax + [Tab]
* [Ref.](http://docs.emmet.io/cheat-sheet/)

## Git

* Create Branch: [command] + [shift] + [p]: Git Branch
* Checkout: [command] + [shift] + [p]: Git Checkout

## Tasks

* Setup: [control] + [space] + [p]: Tasks: Configure Task Runner
* Run: [control] + [space] + [p]: Tasks: Run Task

## Multi Cursor

* Start Multi Cursor: [option] + [click]
* Start Multi Cursor: [option] + [shift] + [click]
* Exit Multi Cursor: [esc]

## Reorder

* Start: [command] + [i]
* Go up: [option] + [up]
* Go down: [option] + [down]

## Debug

* Configure debugging by creating a launch.json file
* Press [F9] to set break point
* Press [F5] to start debugging
エアコン リモコン (K-1028E) を W-ROOM02 で WiFiリモコン化してみた (ハード編)

# Overview

[K-1028E](https://www.amazon.co.jp/s/field-keywords=K-1028E) という ユニバーサルリモコン があります。特筆すべきは300円ほどで買えてしまうことです。

というわけで、W-ROOM02とリモコンを繋いで、WiFi経由でコントロールできるようにします。

https://github.com/hidenorly/ESP8266_WiFiRemoteController
にソースコードはおいてあります。

![IMG_9449.JPG](https://qiita-image-store.s3.amazonaws.com/0/100425/4b1ef18a-e97f-1316-d3f5-502508434896.jpeg)

ESP8266(WROOM-02)は瞬発的な電力を多く消費するのと、継続動作させたいので、電池駆動ではなく、microUSB経由で電源共有できるようにしました。写真のように平均では40mA程度しか消費していません。

![IMG_9435.JPG](https://qiita-image-store.s3.amazonaws.com/0/100425/7e1d3d05-180f-fdec-a413-e14b3def584a.jpeg)

このように、単4のバッテリーケース部分に、WROOM02を内蔵させてみました。
(配線をしやすくするために裏返したのでわかりにくいですね)

![IMG_9439.JPG](https://qiita-image-store.s3.amazonaws.com/0/100425/97ca29f9-f753-b8e2-1a48-f79c982cf7c5.jpeg)

これが全体像です。

上側は、もともとのK-1028Eの基板で、見ての通り、エアコンの電源ボタンのパターンのレジストを削って、結線しています。

下側は右から

* microUSBのコネクタをつけている基板
  * 安定的に挿せるようにするために基板経由にしたのですが、このせいで蓋が半開きになりました^^;
* 電池ボックスのあった場所がメインの WROOM02 が入っている場所です。
  * WROOM02単体にしていますが、もう幅的にぎりぎりです。電池ボックスの仕切りを切り取ればもう少し余裕ができるのですが。
* 電源基板 (DC-DC の dropperで、5->3.3V max 1Aです)
  * 先の写真の通り、平均的には3-40mAしか消費しません.
* DHT11 (温度、湿度センサー)基板です。
  * 5V駆動にしてあります。DATAは2N3904 1石で5-3.3V変換をして接続しています。
  * しかし、このセンサーモジュールは何個も買ってますが、手持ちの在庫の2個はハズレで、誤差がひどいです。また、parity errorが頻発します。。。というわけで、 BME280に変更する予定です（取り寄せ中。。。）

つづく。
はじめてのgdb

linux環境でC言語のデバッグを行う方にむけて、gdbの使い方を説明します。
初心者向けです。

## gdbとは

デバッガです。ブレークポイントを張ったり、ステップ実行したり、
変数の中身を覗いたり、書き換えたり...そういうことが出来ます。
gccと同様、linuxには標準でインストールされています。

昔からあるツールであり、コマンドラインでの操作を行います。
IDEのデバッガがどうしても使えない環境でのデバッグに役立ちます。

## メリット、デメリット

メリット：
・たいていのlinux環境で使える
・実行中のプログラムにattachしてデバッグ可能

デメリット:
・GUI画面がない。コマンドを覚える必要がある

## 使い方1:gdbから直接起動

①ソースファイルを、デバッグ可能な方式でコンパイルする
gcc -g3 test.c
→a.outが生成
※-g3とするとマクロの展開が可能となります。

②生成したオブジェクトファイルをgdbコマンドから実行
gdb a.out
→以後、gdbよりコマンドの入力を求められる
※この状態では、プログラムは実行されません。

③実行前にブレークポイントを設定
b test.c:256  # test.cの256行目にブレークを張る
b main        # 関数main先頭にブレークを張る

④実行
run
※引数つきで実行したい場合は、run aaa bbb ccc  と実行。

## 使い方2:既に稼動しているプログラムをデバッグ
①デバッグしたいプログラムのプロセスID(PID)を確認
ps -ef | grep a.out
※一番左端のフィールドに出てくる数字がPID

②attachする
gdb   #引数無しで実行
attach 12345(↑で確認したpid)
※gdb attach $(pgrep a.out) とすれば、①、②を一行で実施できます。

以後、gdbを使ってブレークポイントを貼ったり変数を覗いたり出来ます。
プロセスを変えたいときはdetachしてから別のプロセスをアタッチできます。

## コマンド集

主要なコマンドを紹介します。
すべて省略系で書いています。(ex. break -> b)

・ブレーク関連

|コマンド|効果|
|:--|:--|
|b func1       | 関数func1にブレークポイントを貼る|
|b test.c:123  | test.cの123行目にブレークポイントを貼る|
|w var1         | 変数var1にウォッチポイントを設定|
|i b           | ブレークポイント一覧を表示|
|d no          | 番号に対応するブレークポイントを削除|

・実行関連

|コマンド|効果|
|:--|:--|
|n             |ステップ実行(1行ずつ実行/関数は飛ばす)|
|s             |ステップ実行(1行ずつ実行/関数の中に入る)|
|c             |次のブレークポイントまで処理を実行|
|f             |現在の関数を抜けるまで処理を実行|
|u             |現在のループを抜けるまで処理を実行|
|ret -1        |現在の関数を戻り値-1として強制的に抜ける ※以降の処理は実行されない|

・参照

|コマンド|効果|
|:--|:--|
|p var1            |変数var1の値を見る<br>(構造体ならa.bでメンバ変数を参照可能。ポインタなら*fpなどで中身を見れる。p strlen(buf)、p buf[3]、p a->bなど結構柔軟に見れます)|
|bt                 |バックトレース(現在の関数が呼び出されるまでの経路)を表示|
|l                  |ソースコードを表示|
|info macro マクロ名 |マクロの定義を確認|
|i lo|ローカル変数を全部見る|

・値の書き換え

|コマンド|効果|
|:--|:--|
|p var1=-1|変数var1の値を-1に変更|

## その他TIPS

* bash等で使用しているショートカットを使用可能です。
(例：Ctrl+aでカーソルを行頭に移動。[参考: readlineの使い方](http://x68000.q-e-d.net/~68user/unix/pickup?readline))
また、Tabキーによる変数名やgdb内コマンドの補完もしてくれます。
(古い環境だとできないこともあります)

* `set print elements 0`を実行するとメモリや構造体の全情報を表示してくれます。
(サイズの大きい配列や構造体は、デフォルトだと途中までしか表示されません)

* Ctrl-xを押した後、1または2を押すとTUIモードに移行します。
画面が2分割され、ソースコードを見ながら上記コマンドを実行できるようになります。
http://d.hatena.ne.jp/murase_syuka/20150912/1442021005

* 子プロセスを生むプログラムの場合、以下のコマンドで子プロセスのデバッグが可能になります。
`set follow-fork-mode child`

## より詳細な情報
http://flex.phys.tohoku.ac.jp/texi/gdb-j/gdb-j_toc.html
http://sourceware.org/gdb/current/onlinedocs/gdb/
さくらレンタルサーバーに独自SSL「Let's Encrypt」導入(Windows10編)

※2017年10月 追記
さくらレンタルサーバーがLet's Encryptに標準で対応しました！
https://www.sakura.ne.jp/function/freessl.html
下記のようなことをしなくてもコントロールパネルから設定可能です。
(嬉しいけど少し切ない)
※追記終わり

---
無料SSL証明書のLet's Encryptをさくらレンタルサーバーに導入してみたのでメモ。

root権限がないため、自分のPCで証明書を取得しサーバーに登録するという作業。
Linux環境が必要だが、Windows10でBashが使えるようになったのでWindowsのみでできた。

# 環境
- さくらのレンタルサーバ（スタンダードプラン以上）
- Windows10 「Bash on Ubuntu on Windows」

# Bash on Ubuntu on Windowsをインストール
この記事がわかりやすい。初期設定もこの通りに。
[Bash on Ubuntu on Windowsをインストールしてみよう！
](http://qiita.com/Aruneko/items/c79810b0b015bebf30bb)

#Let's Encryptクライアントをインストール
公式から使用OSの手順通りにクライアントをインストールする
https://letsencrypt.jp/usage/install-certbot.html

早速Bashを起動してOSを確認

```bash
lsb_release -d
```

Ubuntu 14.04だった。

公式にあるコマンドを打ってしばらく待つ

```bash
wget https://dl.eff.org/certbot-auto
chmod a+x certbot-auto
./certbot-auto
```

apacheがない！というエラーが出たけどスルー。
使うのはレンタルサーバーだし。

#SSL証明書取得
いよいよ証明書を取得する

```bash
./certbot-auto certonly --manual
```
以下流れ

メールアドレスを入力(色々な通知受信用)
↓
規約に同意する
↓
ドメイン名を入力
↓
IPログ取得に同意する
↓
するとこんな画面になる

![キャプチャ.gif](https://qiita-image-store.s3.amazonaws.com/0/96444/011c3a99-cf87-73e1-acd0-df40490feb73.gif)
①は、先ほど入力したドメイン名
②③はランダムな英数字

一旦Bashから離れる
↓
サーバーにフォルダを作る

> ドキュメントルート/.well-known/acme-challenge/

テキストファイルを作り「acme-challenge」フォルダに保存

>ファイル名→②の英数字
ファイルの中身→③の英数字

↓
Bashに戻り、エンターを押す。
無事に完了すると、その旨のメッセージとともに証明書の保存先が表示される。

```bash
IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at
   /etc/letsencrypt/live/ドメイン名/fullchain.pem.
```

確認してみる

```bash
sudo su
ls /etc/letsencrypt/live/ドメイン名/
```
cert.pem  chain.pem  fullchain.pem  privkey.pem
の4ファイルが確認できる。


※エクスプローラで確認する場合は下記の場所を見る

`C:\Users\ユーザー名\AppData\Local\lxss\rootfs\etc\letsencrypt\live\ドメイン名`

デフォルトで表示されないので、フォルダーオプションにて

- 「隠しファイル、隠しフォルダー、および隠しドライブを表示する」にチェック
- 「保護されたオペレーティングシステムファイルを表示しない(推奨)」のチェックを外す

#さくらのレンタルサーバにSSL証明書を登録
さくらのコントロールパネルへ。

以下流れ

ドメイン設定
↓
SSL証明書欄の登録を押す
↓
「SNI SSL を使用する」の横にある「証明書インストール」
↓
秘密鍵をアップロードする。
「参照」から「privkey.pem」を選択してアップロード

…と思ったら秘密鍵が間違っていますと。Windowsだからシンボリックリンクきかないのね…

ということで、元ファイルを直接選択。無事いけた。
`C:\Users\ユーザー名\AppData\Local\lxss\rootfs\etc\letsencrypt\archive\ドメイン名\privkey1.pem`

↓
証明書のインストール
「cert.pem(cert1.pem)」の内容を全部コピペ。
↓
中間証明書のインストール
「chain.pem(chain1.pem)」の内容を全部コピペ

これで登録は完了！

#SSLを有効にする
ドメイン設定へ戻る
↓
4. SSLの利用をお選びください
「SNI SSLを利用する」にチェック

完了！
https://〜でアクセスできるようになる。
ブラウザのURLバーに鍵マークが無事表示された。

#証明書の更新
証明書の有効期限は90日。
期限が切れる前に更新する必要がある。
残念ながら自動更新ができない。（さくらが対応してくれたらなー。）
更新するときは、再度SSL証明書取得から登録（更新）まで手動でやる。少し面倒だが、無料で手軽に独自SSLが使えるのは嬉しい。

シェルとタスクスケジューラで途中まで自動化できるような…
詳しくないのでわからないが更新するときチャレンジしてみる。


#参考サイト
- [さくらのレンタルサーバにLet’s EncryptのSSL環境を導入してみた](http://www.chatarou.net/2016/02/09/sakura_lets_encrypt_ssl/)
- [さくらインターネット（共用レンタルサーバー）のサイトをLet’s EncryptでSSL化してみる](https://webcrip.jp/264)
- [Let’s encryptのSSL証明書をMacで作成！さくらレンタルサーバーに導入する方法](https://webtatan.com/blog/webcreate/letsencrypt-create)
collection_check_boxesメソッドの構造確認

# はじめに
フォーム関連のビューヘルパーであるcollection_check_boxesメソッドの働きと構造を確認します。
本記事は[こちらのQiita記事](http://qiita.com/rojiuratech/items/0487105994d9281221d4)を元に、collection_check_boxesメソッドで自分が気になった点を調べ加筆したような形で執筆しています。
メソッドの構文確認に主眼を置いているので、ModelやControllerの記述に関する詳細は、上記の記事をご参照ください（細かいところまで説明がされており非常にわかりやすいです）。

# Version
Ruby: 2.3.1
Rails: 5.0.1

# やりたいこと
<img width="782" alt="スクリーンショット 2017-01-29 21.19.34.png" src="https://qiita-image-store.s3.amazonaws.com/0/158026/25a8443e-d7bc-9489-6318-13f788d17610.png">
Userを選択して新規にGroupを作成するためのコレクションボックスを作成する。

# collection_check_boxes基本構文
```views/groups/new.html.erb
<div class="check_box" >
  <%= form_for @group do |f| %>
    <%= f.collection_check_boxes(:user_ids, User.all, :id, :name) do |b| %>
      <%= b.label { b.check_box + b.text } %>
    <% end %>
  <% end %>
</div>
```
この構文で
<img width="324" alt="スクリーンショット 2017-01-29 20.43.54.png" src="https://qiita-image-store.s3.amazonaws.com/0/158026/73f58637-4047-20cb-c0d8-8beecf2a2267.png">
こんな感じのコレクションチェックボックスが作成されます。

以下、コードの意味を一つ一つ確認していきます。

```
<%= form_for @group do |f| %>
```
純粋なform_forの記述。"f"="@group"。

```
<%= collection_check_boxes(:group, :user_ids, User.all, :id, :name) do |b| %>
```
collection_check_boxesの中には、5つ引数がセットされている。
`:group　　 　 （第1引数）`：オブジェクト（form_forブロック配下では省略可能。詳細は下記）
`:user_ids　（第2引数）`：メソッド（プロパティ？）
`:User.all　　　（第3引数）`：inputタグの元となるオブジェクト配列。配列の数だけinputタグが作成される
`:id　　　　　　 　　　　（第4引数）`：作成されたinputタグのvalueとなる値を指定。今回の場合、各userのidが入力される
`:name　　　　（第5引数）`：作成されたinputタグのテキストとなる値を指定。今回の場合、各userのnameが入力される

`|b|`:　後述するbuilderに関係するもの？

第2引数がなぜ存在するのか、まだぼやっとしか理解できていませんが、イメージとしては
`:user_ids　（第2引数）`：チェックされたUserのidを処理するのに必要？
`:User.all　　　（第3引数）`：存在するUser全てのチェックボックスを作成するために必要。
こんな感じでしょうか。

```
<%= b.label { b.check_box + b.text } %>
```
次にこの部分。正直よくわからない。API dockによると、

> The argument passed to the block is a special kind of builder for this collection, which has the ability to generate the label and check box for the current item in the collection, with proper text and value. Using it, you can change the label and check box display order or even use the label as wrapper, as in the example above.
 引用元：[Api dock](http://apidock.com/rails/v4.0.2/ActionView/Helpers/FormOptionsHelper/collection_check_boxes "Api dock")

つまりは、ラベルとチェックボックス（今回の場合は＋テキスト）を作成してくれる特別なbuilderとやらだそう。知識不足で現段階でよくわからないのだが、[builder](https://github.com/jimweirich/builder "builder")とやらが何かをしているみたい。

余談だが、このcollection_check_boxはいろんな部分が省略できる。

__① collection_check_boxの第1引数は省略可能__
 `<%= f.collection_check_boxes(:user_ids, User.all, :id, :name) do |b| %>`
f = @groupのように考えられるので、fを先頭につける場合はオブジェクト（今回はgroup）を省略可能
` <%= collection_check_boxes(：group, :user_ids, User.all, :id, :name) do |b| %>`
fをつけない場合は第1引数にセットしてあげる

__②<%= b.label { b.check_box + b.text } %>は丸ごと省略可能__
省略しても自動で補ってくれる模様。ちなみに省略する場合は、`do |b|`を削除するのを忘れずに。

#参考記事
・[railsで多対多な関係を実装する時のポイント（加筆修正するかも）](http://qiita.com/rojiuratech/items/0487105994d9281221d4)
・[Rails4でcollection_check_boxesを使って、多対多の関連をチェックボックスで設定する](http://qiita.com/hamichamp/items/8cf980e6d5ca9fd7e96f)
PowerShellでコード内に書いた複数行のテキストを手っ取り早く配列にする


PowerShellでコード内に複数行のテキストを書いて、
1行1要素のリストに変換したい場合のコードです。
わざわざテキストファイルに書き出したり、
配列の書式で書くのが手間なときに便利です。

```ps1:textlist.ps1
# 定義
$textlist  = @"
手っ取り早く
複数行のテキストを
リストにしたい。
ここにテキストを
貼り付けるイメージです。
"@ -split "`r`n"

# 1要素数ずつ表示
foreach($t in $textlist){
  echo("text: " + $t)
} 

# タイプを表示
echo($textlist.GetType())

# 要素数を表示
echo("Length: " + $textlist.Length)
```

```text:実行結果
text: 手っ取り早く
text: 複数行のテキストを
text: リストにしたい。
text: ここにテキストを
text: 貼り付けるイメージです。

IsPublic IsSerial Name                                     BaseType                   
-------- -------- ----                                     --------                   
True     True     String[]                                 System.Array               
Length: 5
```

# 参考
 - Python版: [コード内に書いた複数行のテキストを手っ取り早くリストにする](http://qiita.com/akira6592/items/aaf3c1310779d1586466)
javascriptの練習（自分用）

# 中かっこは省略できる

```js
var hogee = 10

if (hogee > 9){

	console.log('大かっこは省略できる');
    }
    
```

↓

```js
var hogee = 10

if (hogee > 9)

	console.log('大かっこは省略できる');
```

でも、このような書き方は、ブロックの範囲が不透明になるバグの温床になりかねないので危険です。さらに、中括弧を省略した場合、else文は直近のif文に対するelse文になってしまいます。例えば二つのelse文のあるネストがあるif文の場合、一番上のif文に呼応しているのは一番下のelse文ですが、中括弧を書かないと直近のif文に対してelse文が呼応する形になってしまうので注意が必要です。

# 式の値によって処理をも分岐するSwich文

swich文を使うのは、if文がたくさんネストしてスパゲティコードになってしまうかもしれない状況を想定して短く保守性の高いコードを書くためです。swich文は同地演算子による多岐分岐に最適な演算子です。

swich文の使い方は、まずは変数に値を入れます。例えば文字列だったら `var lank = 'B' `みたいな感じです。そして、switch文の引数に、この変数を引数として入れcaseに  `case 'B' `と打ちます。そうすると、それが実行されます。ちなみに、breakで終わらなければ、それ以下の処理も続きます。

if文と違って、case文は、合致したcase句に応じて処理を移行するだけなので、その句を終えてもその下の処理が停止するわけではありません。だから、breakを使いましょう


```js

var rank = 'B'

switch(rank){

	case 'A' :
	console.log('ケースAダヨ');
	break;

	case 'B' :
	console.log('ケースBダヨ');
	break;

	case 'C' :
	console.log('ケースCダヨ');
	break;

};

//実行結果は「ケースBダヨ」

```

# フォールスルーという書き方

breakを意図的に書かずに処理を下へ流す書き方のこと。基本的にこういう書き方はしないけれど、以下のような条件下においては、フォークスルーで書くことが推奨される場合もある。例えば、テストの赤点ラインを６０点にして、６０点以上は合格でそれ以外は不合格にしたい場合です。



```php

var point = 50;

switch (point){

case 100 :
case 90 :
case 80 :
case 70 :
case 60 :

console.log('合格');
break;

case 50 :
console.log('不合格');
break;

}
```


switch文では、比較演算子` ＝＝`は厳密比較演算子 `＝＝＝ `で比較が行われます。なので、変数に`'1'`と入れてcase式で`case 1 :` とやっても実行されません。

# 反復処理

Javascriptでは様々な反復処理を行うことができます。while dowhile fo-in fo-ofなどです。条件式を用いてループを制御してみましょう。また、それぞれの違いもちゃんと頭に入れましょう

while文は条件式の結果がtrueのときに処理を走らせます。dowhile文は一度処理を走らせた後に条件式を査定して、trueだったら再度処理を繰り返します。そして、注意点は、dowhile文は、文の最後にセミコロンが必要なことを注意しましょう。

## while 

```php

var point = 50;

switch (point){

case 100 :
case 90 :
case 80 :
case 70 :
case 60 :

console.log('合格');
break;

case 50 :
console.log('不合格');
break;

};

var x = 1;

while (x < 10) {

	console.log(x)
	x++;

}

```
普通のHTMLページにコメントフォームを追加する

普通のHTMLページにチョコチョコっと書き足すだけでブログのようにコメントを投稿してもらえるようなページは作れないものかと思っていたのだが、余計な機能を省いた簡潔なサンプルコードが掲載されたサイトがあったので、これをもとに、見よう見まねで自分にとって最小限の変更と機能追加したものを作ってみた。

参照サイト：
http://www.confrage.com/ajax/sample/ajax_bbs/ajax_bbs.html

参照コードは、ajaxとphpで画面遷移することなく、投稿されたコメントが反映される仕組みの一行掲示板掲示板である。自分が最低限変更・追加したかったのは、

1. 新しいコメントが上に表示される。
2. 一行でなく複数行のコメントが扱える。
3. コメント投稿があったらメールで知らせてくれる。
4. phpやjavaスクリプトはサイトに１つだけ用意しておけば複数のページで使いまわせる。

http://qitailang.small.jp/webtech/commentbox/

サンプル
http://qitailang.small.jp/webtech/commentbox/sample_hanyo.html
`vagrant global-status` で Vagrant の状態が表示されないとき

## 環境

macOS Sierra 10.12.1
Vagrant 1.8.6

## 対応

Vagrantfile のあるディレクトリの名前を変更したところ、`vagrant global-status` で Vagrant の状態が表示されなくなりました。
このような場合、`vagrant global-status` の一覧は

```bash
~/.vagrant.d/data/machine-index/index
```

にキャッシュされているので、このファイルに次のような JSON を追加することで表示されるようになります。

```json:example
"a1bb980eb36a4a73a74a724794f201f8": {
    "local_data_path": "/path/to/foo/.vagrant",
    "name": "default",
    "provider": "virtualbox",
    "state": "poweroff",
    "vagrantfile_name": null,
    "vagrantfile_path": "/path/to/foo",
    "updated_at": null,
    "extra_data": {
        "box": {
            "name": "bento/centos-6.7",
            "provider": "virtualbox",
            "version": "2.2.7"
        }
    }
}
```

`"a1bb980eb36a4a73a74a724794f201f8"` の部分は

```
/path/to/foo/.vagrant/machines/default/virtualbox/index_uuid
```

に書かれた文字列をコピペすれば OK です。
dotoマクロ in CommonLisp


ClojureのdotoマクロをCommonLispに移植してみた。

実装

```cl
(defmacro doto (x &rest forms)
  (let ((gx (gensym)))
    `(let ((,gx ,x))
      ,@(mapcar (lambda (f)
                  (if (listp f)
                    `(,(first f) ,gx ,@(rest f))
                    `(,f ,gx)))
                forms)
      ,gx)))
```

使ってみる

```cl
(defclass foo () ())
                                                                                
(defmethod baz ((this foo) x y)
  (print (+ x y)))

(doto (make-instance 'foo) (baz 1 2) (baz 2 3)) 
; 3 
; 5
```
私が開発したWordpressテーマのご紹介

##概要
私は、サイト制作の勉強も兼ねてブログ運営をしています。その中で、その時の自分のモードに合わせて、テーマをつくってきました。以下が、そのテーマ達です。

* 2015-by-wkwkrnht
* 2016-by-wkwkrnht
* 2017-by-wkwkrnht

それぞれが、それぞれの特徴をもっています。
###2015-by-wkwkrnht
これは、処女作で、twentyfifteenをだいぶ意識して作った作品です。もともと、そのコードだいぶ流用していましたが、2016-by-wkwkrnht完成とともに、ベースをスイッチしました。それでも、2コラム(メイン+メニュー)で、なんちゃってマテリアルデザインなどの跡があります。
###2016-by-wkwkrnht
事実上、これが初めてのフルスクラッチ製作のテーマです。ここから、1カラム+フロートメニューにスイッチしました。そして、異常なまでの種類のSNSシェアボタンが付きました。さらに、根ログさんで紹介されていた、便利系装飾ボックスやシンプルなボックス、目次も付きました。先ほどの移植で感じたことは、カスタマイズ性の高いです。ぜひともこれで遊んでやってください。たぶん、ブログ向けなら、非常にいい素材だと思います。一部謎なスタイルの効き方しますけど。
###2017-by-wkwkrnht
2016-by-wkwkrnhtの近代化版です。無理なSNSシェアボタンの設置法を止めた形です(メニュー統合型→ウィジェット)。一覧ページの、一覧性も上がって非常に満足です(長方形→正方形)。フォローウィジェット追加やGoogle先生のCookie施策対応も果たしました。16進数の色表記をRGBの3つに分割したり、色の明度をいじったりできます。このテーマだけ、WordPressの更新ページ内で更新できます。なぜか、バージョン比較が動いていませんけれども。ライブラリ側の問題ですかね……。
##まとめ
全て、[私のGithubアカウント上](https://github.com/wkwkrnht)で公開されています。詳しくは、そこで確認してください。AMP対応をしていきたいのですけれども、ある程度のページが登録されている方で、ここがアウトそうなところをコメントしていただけると助かります。
twitterのツイートボタンを作るためのリンクshareとintent/tweet

#オリジナルツイートボタンを作りたい
突如「指定のテキストとハッシュタグ入りのツイートのウィンドウが出るボタン」を作ることになった。

指定の形でaタグを作れば、いつものtweetボタンが作れるらしい。

##参考文献
さっくり作るならここ
http://blog.yuhiisk.com/archive/2015/10/12/twitter-share.html

パラメーターの触り方はここ
http://kiteretsu-world.info/blog/2015/07/05/how-to-make-tweet-button/

##コード
参考文献を読む前に、拝借してきたコードを使ったら「シェアじゃなくてツイートで」とクライアントから言われた。
###shareの方
```html
<a href="https://twitter.com/share?text=テキストテキスト%0a改行もできるし%20スペースも&url=https://www.url.url/&hashtags=タグ,二つ目" onClick="window.open(encodeURI(decodeURI(this.href)), 'tweetwindow', 'width=650, height=470, personalbar=0, toolbar=0, scrollbars=1, sizable=1'); return false;" rel="nofollow" class="twitter-link">
twitterでshare
</a>
```

###intent/tweetの方
```html
<a href="https://twitter.com/intent/tweet?text=テキストテキスト%0a改行もできるし%20スペースも&url=https://www.url.url/&hashtags=タグ,二つ目" onClick="window.open(encodeURI(decodeURI(this.href)), 'tweetwindow', 'width=650, height=470, personalbar=0, toolbar=0, scrollbars=1, sizable=1'); return false;" rel="nofollow" class="twitter-link">
tweet
</a>
```

URLが違うだけで、とりあえずツイートボタンの挙動としては大差ない。
パラメーターの使い方も一緒。

使って便利↓↓
改行：%0a
空白：%20
hashtagsは,（カンマ）で区切れば複数指定可能


そしてもって、shareとintent/tweetですが……intentの方はいろいろできるみたい。
[Web Intents](https://dev.twitter.com/web/intents)

機会があれば。
10進数のUnicodeをiOSのいつもの絵文字に変換する

# はじめに

つい最近、
「APIから受け取った絵文字のHTMLエンティティUnicode(10進数)を**iOSででてくるいつもの**絵文字として出力する。」

ということをやり、めちゃめちゃ悩んで色んな人に教えてもらって解決ました。
その内容をメモとして残しておきます。

ちなみにサーバー側からもらう内容は以下、

```
&#9742;
```

表示したいのは以下の絵文字とします。

```
☎️
```


# 出力方法

解説は次の章から書きますが、まずやり方だけ先に書きます。

```swift
// サーバーから受け取ったUnicode
let responseCodeString = "&#9742;"

// おまじない、後ほど解説します。
let emojiVariationSequence = 65039

var scalarView =  String.UnicodeScalarView()

// 記号の部分はいらないので適当に置き換える
let codeString = responseCodeString.replacingOccurrences(of: "&#", with: "").replacingOccurrences(of: ";", with: "")

let code = Int(codeString)

scalarView.append(UnicodeScalar(code)!)
scalarView.append(UnicodeScalar(emojiVariationSequence)!)

print(scalarView)
```

# 準備(HTML EntitiyをIntのUnicodeに)

"&"などの記号はいらないので削除してしまいましょう。

```swift

// サーバーから受け取ったUnicode
let responseCodeString = "&#9742;"

// いらないプレフィックスとサフィックスを削除
let codeString = responseCodeString.replacingOccurrences(of: "&#", with: "").replacingOccurrences(of: ";", with: "")

let code = Int(codeString)
```

# 10進数Unicodeを絵文字に変換する

Unicodeから文字列を生成するにはIntのUnicodeを引数に
UnicodeScalarを生成します。

これをUnicodeScalarViewとして生成したインスタンスに
先ほどのUnicodeScalarのインスタンスをappendしてやりprintすると...

```swift
// code = 9742
let code = Int(codeString)
let codeScalar = UnicodeScalar(code!)


var scalarView =  String.UnicodeScalarView()

scalarView.append(codeScalar!)
print(scalarView)
```

以下の絵文字が得られます。

```
☎
```

iOSのいつもの電話の絵文字のこれ「☎️」を想像してたのに
なにかちがいますよね。

# なぜ違うのか

絵文字バリエーション・シーケンスなるものが関係しています。

> iPhoneではそれが絵文字の赤電話として表示されてびっくり。というような経験をしたことがある人は、たぶん少なくないと思う。こういうことが起きるのは、「絵文字じゃない文字」と「絵文字」がUnicodeでは同じ符号位置に包摂されていて、どちらが表示されるかはフォント（の優先順位）次第だからだ。

絵文字バリエーション・シーケンスとは何か
http://d.hatena.ne.jp/NAOI/20120802/1343876603

つまり電話の絵文字の情報はあるけど
どの電話の絵文字かは指定されてないので違う文字になってたということみたいです。

# 絵文字バリエーション・シーケンスを追加する

ここで冒頭のおまじないを使います。
先ほどの電話のUnicodeScalarViewにバリエーションシーケンスをappendしてみましょう。

```swift
// バリエーションシーケンス
let emojiVariationSequence = 65039
let evs = UnicodeScalar(emojiVariationSequence)

// code = 9742
let code = Int(codeString)
let codeScalar = UnicodeScalar(code!)

var scalarView =  String.UnicodeScalarView()

scalarView.append(codeScalar!)
scalarView.append(evs!)

print(scalarView)
```

これをprintするとあの電話の絵文字が表示できるようになります。

```
☎️
```

# おまけ・絵文字のバリエーションシーケンスの調べ方

表示させたい絵文字のバリエーションシケーンスがわからない。
そんなときは以下のやり方でUnicodeが出力できます。

```swift
let phone = "☎️"

for scalar in phone.unicodeScalars {
    print(scalar.hashValue)
}
```

結果

```
9742
65039
```

役に立つかわかりませんがご参考までに
Hiveで複数の要素を行として抽出する

例えば次のような param 列だけを持つテーブルがあるとします。
param は string として user_id と複数の要素からなる user_chars を持っています。

| param |
| --- |
| `{"user_id":1,"user_chars":[{"id":1,"char_id":1},{"id":2,"char_id":2}]}` |
| `{"user_id":2,"user_chars":[...]}` |

今、あなたはユーザ毎の user_char_id (id), char_id を集計することになりました。いったいどうすれば良いでしょうか？

## 指定したパターンで文字列を分割する split

組み込み関数の split を使えば指定したパターンで文字列を分割し、分割された要素を array として受け取ることができます。
次の文字列を例に split で user_chars の要素を分割してみましょう。

```json
{"user_id":1,"user_chars":[{"id":1,"char_id":1},{"id":2,"char_id":2}]}
```

user_chars 部分を抜き出すには regexp_extract を用います。抜き出した文字列に対して split で分割します。次のようになるでしょう。

```sql
split(regexp_extract(param, '"user_chars":(.*)$', 1), '[^0-9],')
```

regexp_extract は第2引数にパターンを、第3引数にグループのインデックスを渡します。この例ではグループは1つしかないので1となります。
JSONの場合、もっと良い例として regexp_extract の代わりに get_json_object を利用すべきです。get_json_object を使うと次のようになります。

```sql
get_json_object(param, '$.user_chars')
```

split のパターンは「直前が整数でないカンマ」としています。単純にカンマだけだと4つに分割されてしまうためです。

## array を受け取り要素を行にして返す explode

split で分割した array の要素を行として返すには explode を使います。

```sql
SELECT
  explode(split(get_json_object(param, '$.user_chars'), '[^0-9],')) AS user_char
FROM t1
```

これだけで `},` で分割された歪な user_chars の要素を行として抽出することができますが、user_id も欲しいし user_char_id, char_id も列として欲しいところでしょう。
そのためには既存テーブルに横付けで仮想テーブル付け加える LATERAL VIEW を使います。LATERAL VIEW を使うと次のようになります。


```sql
SELECT
  get_json_object(param, '$.user_id') AS user_id,
  regexp_extract(user_char, '"id":([0-9]*)', 1) AS user_char_id,
  regexp_extract(user_char, '"char_id":([0-9]*)', 1) AS char_id
FROM t
LATERAL VIEW
  explode(split(get_json_object(param, '$.user_chars'), '[^0-9],')) a AS user_char
```

split し explode した歪な user_char を LATERAL VIEW で横付けしています。これは下記のようなイメージです。

| param | user_char |
| --- | --- |
| `{"user_id":1,"user_chars":[...]}` | `[{"id":1,"char_id":3` |
| `{"user_id":1,"user_chars":[...]}` | `{"id":2,"char_id":5}]` |

"lateral" が表す「横の」や「側面の」といった意味を知ればイメージしやすいかもしれませんね。

さらに歪な user_char から regexp_extract を使って user_char_id (id), char_id を抽出しています。最終的に得られる結果は次のようになります。

| user_id | user_char_id | char_id |
| --- | --- | --- |
| 1 | 1 | 3 |
| 1 | 2 | 5 |

今回紹介した関数は全て下記の Hive マニュアルに載っています。
[Apache Hive LanguageManual UDF](https://cwiki.apache.org/confluence/display/Hive/LanguageManual+UDF)

## おわりに

Hive で split, explode, LATERAL VIEW を使って複数の要素を行として抽出する方法について説明しました。
今回は説明を省きましたが、サブクエリや WHERE と組み合わせることでさらに複雑な条件にも対応できるようになります。
ぜひこれらの関数を使いこなして楽しい Hive ライフを送ってください！Have a nice Hive!