OmniAICreator/Qiita-1.07M huggingface dataset:
awkコマンドの基本

## bashにおけるawkコマンドの基本

awkについて調べながら勉強したので、個人的にまとめてみました

awkは入力として受け取った文字列に対して、フィールド区切り文字やレコード区切り文字を指定して、  
「列」に対する処理を行うためのコマンドです。また、awk単体としても、1つのプログラムです。  

</br>


## awkの基本書式

```sh
awk -F'[フィールド区切り文字(複数可能)]' -v '変数=xx' '{awkコマンド}' file

```

* 今回は標準出力を行うawkコマンド「print」を利用し、awkで指定したフィールドを取得します

#### awkで1フィールド目を取り出すコマンドは、「print $1」です

# 1フィールド目を出力 print $1
オプションである -F'[フィールド区切り文字]'　を指定しない場合、
区切り文字には、タブまたは半角スペースが選択されます
echo からパイプで渡してみます


```sh
echo 1 2 3 4 |awk '{print $1}'
1

```

## 2フィールド目を出力 print $2

```sh
echo 1 2 3 4 |awk '{print $2}'
2

```

## $0は「パイプやファイルから渡された、文字列全て」という意味です print $0
printのみも、一緒

```sh
echo 1 2 3 4 |awk '{print $0}'
1 2 3 4

echo 1 2 3 4 |awk '{print}'
1 2 3 4

```

## フィールド区切り文字に「:」を指定してみます
1フィールド目を出力

```sh
echo 1:2:3:4 |awk -F'[:]' '{print $1}'
1

```

2フィールド目を出力

```sh
echo 1:2:3:4 |awk -F'[:]' '{print $2}'
2

```

## フィールド区切り文字は複数指定できます

フィールド区切り文字に「:」と「/」を指定
ならべて書くことで、「:」と「/」の1つ1つがフィールド区切り文字として扱われます

```sh
echo 1:2/3:4 |awk -F'[:/]' '{print $3}'
3

```

##複数フィールドの出力 print $1,$2
#### print $1,$2 のようにカンマで区切って記述します
複数フィールドの出力は、半角スペースで区切られます
これは、OFSを指定していないため ※OFSについては後述します

```sh
echo 1:2/3:4 |awk -F'[:/]' '{print $1,$2}'
1 2

```

## OFS
「OFS」は、Output Field Separatorの略で、awkの組み込み変数であり、「出力のフィールド区切り文字」を指定します
下記では「#」を指定し、フィールドの出力を「#」で区切ります
また、「-v」 はvariable(変数)を指定する、という意味のオプションです

-v '変数=xx'
という形式で記述します

-F'[フィールド区切り文字]'で、「入力のフィールド区切り文字」については指定しますが、これは、処理で一番よく使われるためオプション化されているだけ、という違いです。

```sh
echo 1:2/3:4 |awk -F'[:/]' -v 'OFS=#' '{print $1,$3}'
1#3

```

## RS
RSはRecord Separatorの略で、awkの組み込み変数です
「入力のレコード区切り文字」を指定、下記では「/」を指定します
レコードは「/」を区切り文字にして、「1:2」と「3:4」に分けられます
「/」をレコード区切り文字にして、各々のレコードから1フィールド目を取得します
出力は改行で区切って出力されます　※これはORSが指定されていないため ORSは下述

```sh
echo 1:2/3:4 |awk -F'[:]' -v 'RS=/' '{print $1}'
1
3
echo 1:2/3:4 |awk -F'[:]' -v 'RS=/' '{print $1,$2}'
1 2
3 4
# フィールド区切り文字とレコード区切り文字で同じ文字がある場合、レコード区切り文字が優先されます
echo 1:2/3:4 |awk -F'[:/]' -v 'RS=/' '{print $1,$2}'
1 2
3 4

```

## ORS
「ORS」は、Output Record Separatorの略で、awkの組み込み変数であり、「出力のレコード区切り文字」を指定します
下記では「This is ORS」を指定し、レコードの出力を区切ります

```sh
echo 1:2/3:4 |awk -F'[:/]' -v 'RS=/' -v 'ORS=This is ORS' '{print $1,$2}'
1 2This is ORS3 4

```

## OFSとORSを明示します
OFSは空白4つ、ORSは改行2つにしてみます
\n は改行

```sh
echo 1:2/3:4 |awk -F'[:/]' -v 'OFS=    ' -v 'RS=/' -v 'ORS=\n\n' '{print $1,$2}'
1    2

3    4


```

## 最終フィールドを取り出す変数として$NFが用意されています

```sh
echo 1:2/3:4 |awk -F'[:/]' '{print $NF}'
4

echo 1:2/3:4 |awk -F'[:/]' '{print $NF-1}'
3

```

## printの他に、printfもつかえます

```sh
echo 1:2/3:4 |awk -F'[:/]' '{printf "%s\n%s\n",$NF,$NF-1}'
4
3

```

## 他にも、csv形式を扱う時などに利用する"FPAT"変数などがあります
参考：http://codezine.jp/article/detail/8323
Railsアプリにマークダウン&シンタックスハイライトを実装する

railsアプリにマークダウンをhtml変換して表示&シンタックスハイライトでコードに色をつける機能の実装をする。

## Gemfile
```
gem "redcarpet", "~> 2.3.0"
gem 'coderay'
```
追加してbundle install
## helper
```rb:app/helpers/applecation_helper.rb
module ApplicationHelper
    require "redcarpet"
    require "coderay"

    class HTMLwithCoderay < Redcarpet::Render::HTML
        def block_code(code, language)
            case language.to_s
            when 'rb'
                lang = 'ruby'
            when 'yml'
                lang = 'yaml'
            when 'css'
                lang = 'css'
            when 'html'
                lang = 'html'
            when ''
                lang = 'md'
            else
                lang = language
            end

            CodeRay.scan(code, lang).div
        end
    end

    def markdown(text)
        html_render = HTMLwithCoderay.new(filter_html: true, hard_wrap: true)
        options = {
            autolink: true,
            space_after_headers: true,
            no_intra_emphasis: true,
            fenced_code_blocks: true,
            tables: true,
            hard_wrap: true,
            xhtml: true,
            lax_html_blocks: true,
            strikethrough: true
        }
        markdown = Redcarpet::Markdown.new(html_render, options)
        markdown.render(text)
    end
end
```
requireを忘れずに

## view
```html:app/views/articles/show.html.erb
<p><%= markdown(@article.content).html_safe %></p>
```
## まとめ
* html_safeはview側でもhelper側(markdown.render(text).html_safe)でもどっちでもいいのか？
* バッククオート＋言語名でシンタックスハイライトになるが、コロン＋ファイル名を付けるとエラーになる
Hugoで日本語URLが404になってしまう問題のとりあえずの解決方法

Mac上で静的サイトジェネレーターの[Hugo](https://gohugo.io/)を使って日本語のファイル名のマークダウンからHTMLを生成したときに、パーマリンクのエンコーディングがうまくいきません。

例：

```
$ hugo new test_site // プロジェクトの生成
$ cd test_site
$ hugo new post/ダミー.md
$ vi content/post/ダミー.md // draft = trueを削除
$ hugo // HTML生成
```

すると、以下のようなファイルが生成されます

```public/sitemap.xml

<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
  
  <url>
    <loc>http://replace-this-with-your-hugo-site.com/</loc>
    <lastmod>2016-03-06T19:03:05+09:00</lastmod>
    <priority>0</priority>
  </url>
  
  <url>
    <loc>http://replace-this-with-your-hugo-site.com/post/%E3%82%BF%E3%82%99%E3%83%9F%E3%83%BC/</loc>
    <lastmod>2016-03-06T19:03:05+09:00</lastmod>
  </url>
  
</urlset>
```

ここで問題なのが```%E3%82%BF%E3%82%99%E3%83%9F%E3%83%BC```です。[このサイト](http://www.tagindex.com/cgi-lib/encode/url.cgi)でURLのエンコードをしてみると、```タ†ミー```となってしまいます。

この原因は、Hugoがパーマリンクを生成する際、デフォルトでは```content/```以下のファイル構成をそのまま使うことです。このときのエンコーディングが使っているファイルシステムに依存しているため、Macの場合、[濁音問題](http://d.hatena.ne.jp/miau/20110805/1312555736)が起きてしまいます。

とりあえずの回避方法として、以下のようにパーマリンクをファイル名ではなく、記事タイトルから生成するように設定すれば、ファイルの本文自体はUTF-8なので、ちゃんとUTF-8でURLエンコードされるようになります。（その他の命名規則については[こちら](https://gohugo.io/extras/permalinks/) ）

```config.toml
[permalinks]
  post= "/:section/:title"
```

どなたか直接的な解決方法をご存知でしたら教えてください。
docker build でyumに失敗した場合の対処

次のような条件で同じような失敗をしている人のための備忘録です。
・dockerfile 内でyumの記述をしている。
・Dockerホスト（CentOS7）上では名前解決が正しく行われる。
・Dockerホスト（CentOS7）上ではIPv6を止めている。
・firewalld は、53, 80を開放している。

・・・にも関わらず、次のエラーが発生する人。

```
# docker build -t ****:** ./
   ・
   ・
（省略）
   ・
   ・
Could not retrieve mirrorlist http://mirrorlist.centos.org/?release=7&arch=x86_64&repo=os&infra=stock error was
14: curl#6 - "Could not resolve host: mirrorlist.centos.org; Unknown error"


 One of the configured repositories failed (Unknown),
 and yum doesn't have enough cached data to continue. At this point the only
 safe thing yum can do is fail. There are a few ways to work "fix" this:

     1. Contact the upstream for the repository and get them to fix the problem.

     2. Reconfigure the baseurl/etc. for the repository, to point to a working
        upstream. This is most often useful if you are using a newer
        distribution release than is supported by the repository (and the
        packages for the previous distribution release still work).

     3. Disable the repository, so yum won't use it by default. Yum will then
        just ignore the repository until you permanently enable it again or use
        --enablerepo for temporary usage:

            yum-config-manager --disable <repoid>

     4. Configure the failing repository to be skipped, if it is unavailable.
        Note that yum will try to contact the repo. when it runs most commands,
        so will have to try and fail each time (and thus. yum will be be much
        slower). If it is a very temporary problem though, this is often a nice
        compromise:

            yum-config-manager --save --setopt=<repoid>.skip_if_unavailable=true

Cannot find a valid baseurl for repo: base/7/x86_64
The command '/bin/sh -c yum -y install gcc gcc-c++ wget
```

■ 解決方法
<ul>
<li><p>1．docker起動ファイルを編集。DNSサーバの指定を行います。ここでは、8.8.8.8を指定しています。</p></li>

    # vi /usr/lib/systemd/system/docker.service
    （変更前）：ExecStart=/usr/bin/docker daemon -H fd://
         ↓    ↓
    （変更後）：ExecStart=/usr/bin/docker daemon -H fd:// -dns=8.8.8.8

<li><p>2.Dockerデーモンのリロードと再起動</p></li>

    # systemctl daemon-reload
    # systemctl restart docker

</ul>

これで解決です。 ps でdocker の起動オプションにdnsも追加され、エラーも解決です。

■ 解決方法（その２）
<ul>
<li><p>1．firewalld の再起動</p>
    # systemctl restart firewalld</li>
<li><p>2. Dockerデーモンの再起動</p>
    # systemctl restart docker</li>

</ul>
iOSOpenDevをXcode7にインストールする



まず
http://iosopendev.com
からインストーラーをダウンロード

macportsとgitを入れておく。

インストーラーがXCodeを探せるように、使っているXcodeに向けて

`$ sudo xcode-select --switch /Applications/Xcode.app/`

を行う。

次に

`/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/Library/Xcode/Specifications`

と

`/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/Xcode/Specifications`

のディレクトリを作成（自分のXCodeの位置に合わせること）

`iPhoneOSPackageTypes.xcspec`と`iPhoneOSProductTypes.xcspec`を
`/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/Xcode/Specifications`へ、

`iPhone Simulator ProductTypes.xcspec`と`iPhone Simulator PackageTypes.xcspec`を
`/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/Library/Xcode/Specifications`へ

コピーする。（xcspecは https://github.com/ddeville/Dynamic-iOS/tree/master/Xcode%20Specifications などからダウンロード出来る。著作物かもしれないのでここには掲載しない）

最後に
`/Applications/Xcode.app/Contents/Developer/usr/bin/`を作り、（usrとbinを作る)
iosodを`/Applications/Xcode.app/Contents/Developer/usr/bin/`へコピーする

iosodは https://github.com/kokoabim/iOSOpenDev/blob/master/bin/iosod のものをコピー

終わったらインストーラーからiOSOpenDevをインストールすればOK


追記：
インストールが終わっているものの、ProductTypes/PackageTypesをちゃんと書く必要がありそう

追記２：
thoes系はインストールされないっぽいので手動でインストールする
React + material-uiのPopoverで詰まったこと


# 概要
Popoverを使ってメニューを実装しようとした時に、
メニューを開くタイミングで同時にPopoverのonRequestCloseが走ってしまい、
開いて一瞬で閉じてしまうという事象を解決した話
※ スマホ対応

# 内容

---↓ ここのメニューアイコン部分を作ってるソース

![スクリーンショット 2016-03-06 18.29.56.png](https://qiita-image-store.s3.amazonaws.com/0/11673/11afdf08-9d86-2a8f-3425-e87fb65b8494.png "スクリーンショット 2016-03-06 18.29.56.png")


```:menu.jsx
var MainMenu = React.createClass({
  getInitialState: function() {
    return {
      is_open: false,
      anchorEl: null
    }
  },
  render: function() {
    return (
      <div>
        <IconButton
          className="menu-button"
          onTouchEnd={function() {
            this.setState({
              is_open:true,
              anchorEl:document.getElementsByClassName("menu-button")[0]
            });
          }.bind(this)}
        >
          <MoreVertIcon />
        </IconButton>
        <Popover
          className="popover"
          open={this.state.is_open}
          anchorOrigin={{horizontal: 'left', vertical: 'bottom'}}
          targetOrigin={{horizontal: 'left', vertical: 'top'}}
          style={{
            width:"100px",
            height:"100px",
            padding:"5px"
          }}
          anchorEl={this.state.anchorEl}
          onRequestClose={function() {
            this.setState({is_open:false});
          }.bind(this)}
        >
          <a
            href="http://www.amazon.co.jp/gp/registry/wishlist/"
            target="_blank"
            style={{
              textDecoration:"none",
              margin:"5px"
            }}
          >
            WishList
          </a>
        </Popover>
      </div>
    );
  }
});
```

こんな風にアイコンを置いて、アイコンをタップするとPopoverでメニューが開くようにしたかったが、
メニューを開こうとするとonRequestCloseが動いてしまう。
原因調査のためにPopoverのonRequestCloseとIconButtonのonTouchEndで event.typeの値がどうなってるのかを見てみる。
ChromeのDevelopperConsoleで見た結果、

メニューが閉じている時

* IconButton.onTouchEnd: react-touchend
* PopOver.onRequestClose: click

メニューが開いている時(onRequestCloseのstate変更処理を外して確認)

* PopOver.onRequestClose: touchstart
* PopOver.onRequestClose: click

のようにeventが走ってることを確認。
なので、Popover.onRequestCloseを以下のように変更

```Popover.onRequestClose.jsx
onRequestClose={function() {
  if (event.type !== "touchstart") return ;
  this.setState({is_open:false});
}.bind(this)}

```

clickを無視するようにtouchstartのみを見るように変更。
これで想定通りに挙動ができるようになりました。
※ スマホのみを想定してるのでこの形にしましたが、PC等を考慮すると別のやり方が必要になります。

# まとめ

想定通りに挙動が噛み合わない時はどんなeventが走っているのかを見ると良さそう。
React+Material-UIはさくっと組み上げるにはかなりいい組み合わせなんじゃないかと思います。
Easingアニメーションさせながら図形を変形する

# Demo
![スクリーンショット 2016-03-05 12.24.51.png](https://qiita-image-store.s3.amazonaws.com/0/26043/c2ddb0b2-2233-58f5-4173-072a19526761.png)

Easingの練習に作成。
https://vine.co/v/iXqIBummBxK
https://github.com/naoyashiga/p5/blob/master/Theme/Easing/vertexRotating/vertexRotating.pde

# 円周上に点を描画
多数の頂点(vertex)を結ぶことで曲線に見えるようにしている。

```java
for (int i = 0; i < verticeLength; i++) {
	// 半径をsinカーブ
	float fuzzyRadius = 50 * (float)Math.sin(baseAngle * i * 3);
	
	// 円周上の点
	float vx = (float)Math.cos(baseAngle * i);
	float vy = (float)Math.sin(baseAngle * i);

	PVector baseVertice = new PVector(vx, vy);
	// 半径分だけベクトルを伸ばす
	PVector vertice = PVector.mult(baseVertice, radius + fuzzyRadius);

	// 頂点のインスタンス
	FuzzyVertice f = new FuzzyVertice();
	f.location = vertice;
	// 頂点を配列を追加
	fuzzyVertex.add(f);
}
```

# Easing関数を使う
Easingはライブラリを用いている。
https://gist.github.com/cocopon/1ec025bcffb3fd7995db

```java
float t = EASING_FUNC.get(time);
```

## Easingして次の頂点へ移動
mapを使うのがポイント。
https://processing.org/reference/map_.html

```java
for (int i = 0; i < fuzzyVertex.size(); i++) {
	FuzzyVertice f = fuzzyVertex.get(i);
	FuzzyVertice pre_f;

	// 移動後の頂点のindex
	int index = (int)(fuzzyVertex.size() / 10);

	// 移動後の頂点を配列リストから取得
	pre_f = fuzzyVertex.get((i + index) % fuzzyVertex.size());

	// Easing move vertice to other vertice
	// 頂点から頂点へEasingして移動
	vertex(
		map(t, 0, 1.0, pre_f.location.x, f.location.x),
		map(t, 0, 1.0, pre_f.location.y, f.location.y)
	);
}
```
Yo-Yo Attack Vulnerability in auto-scaling mechanism

SIGCOMM2015のポスターで発表されていたものです．
リンク：http://conferences.sigcomm.org/sigcomm/2015/postersessions.php

# この論文は何？
* オートスケール可能なシステムの脆弱性をつく攻撃の提案と実演．
* Yo-Yo Attackというらしい
* 単純にトラフィックを生成し続けるよりも3倍近く効率的にダメージを与えられるらしい．

# 背景
クラウド環境などにおいて，自動的にリソースを拡張できる．これによって単純なDDoS攻撃に対処できるが，一方で利用者はその分のコストを支払う状況に置かれる(EDoS攻撃:Economic Denial of Sustainability)．


# オートスケーリング機能
後で追記
でも多分思ってるのそのまんま

# YO-YO Attack 
リソースの一時的な追加割り当てが収まるのを狙って，再度大量のトラフィックを流す．on-attack とoff-attack を繰り返すだけ．
単純だけども，攻撃者にとっては3倍近く効率的に攻撃できるらしい，

# まとめ
単純な仕組みだけど，だからこそこういう攻撃って対処が難しいのかもしれない．
というかこういう脆弱性を明らかにして終わりっていう論文もあるんだっていう感想がでかい．
Mac OS で大量の、スペースがファイル名に含まれるファイルも含めて全てrmする

## TL;DR
`find . -type f -print0 | xargs -0 rm`で解決

## はじめに
私は毎日画像収集をしていて、ポンポン画像をDLしてはGoogleフォトに自動アップロードされるよう設定をしています。
Googleフォト、大きい画像は容量が抑えられちゃうけれど、容量無制限なのは嬉しいですね!

で、画像が貯まってきたので**全削除**しようとしたら**Finderがフリーズ**……
ターミナルから消そうか。と実行してみたけれど、エラーが何度か出たので共有です。

## 削除してみる
削除したいフォルダに移動して

```console
$ cd ~/Downlowds
```

全削除

```console
$ rm *.*
zsh: argument list too long: rm
```
……どうも削除対象が多すぎたみたいです。

気を取り直して`find`から`rm`に渡して実行します。

```console
$ find . -type f -print | xargs rm
xargs: unterminated quote
```
今度はスペースが入っているファイルがあるからダメとのこと。

以下で解決

```console
$ find . -type f -print0 | xargs -0 rm
>>> elapsed time 1m49s
```

## 結論
`find . -type f -print0 | xargs -0 rm`で解決!
`find`は`-print0`オプションで`スペース`を`\0`にして、`xargs`は`-0`オプションで`スペース`を`\0`にして処理してくれるみたいです。

今回は`rm`コマンドでディレクトリ下のファイルを**全削除**しています。
**全削除**したくない場合は`find`の部分で削除したいものを指定するようにお願いします。
バケツソート

#バケツソートとは？
世の中には様々なソート方法があります。
例として、

- 選択ソート
- バブルソート
- 挿入ソート
- シェルソート
- マージソート
- クイックソート
- ヒープソート

などがあります。
処理の複雑さ、計算量等それぞれのソート方法に長所、短所があり、状況によって使い分ける必要があるそうです。

ここで、「0～99の範囲の整数が格納された要素数100の配列をソートする」場合を考えてみます。
この場合に有効といわれているのが「バケツソート」と呼ばれるソート方法です。

その方法は、

1.データの値を要素番号とした受け皿（以後バケツ）を100個用意する
2.バケツのなかに該当要素番号が出現した回数を入れる

です。
バケツの要素番号を中身の回数分繰り返し表示したら、ソート後の内容を確認することができます。

#具体例
スケールの小さな具体例を示したいと思います。
「0～5の範囲の整数が格納された要素数6の配列をソートする」
ことを考えるとして、ソート前の元データを
{３，４，１，１，１，３}
とします。
この時、１番目のバケツには、０のデータは一つもないので、０が入ります。
１番目のバケツには、１が３つあるので、３が入ります。
この操作を繰り返していくと、バケツ配列の中身は、
{０，３，０，２，１，０}
となります。

#Java実装
このバケツソートをJavaで実装したものが以下になります。


```
public class BucketSort {
	// データの数
	private static final int DATA_NUM = 100;

	public static void main(String[] args) {
		int[] data = new int[DATA_NUM];
		int[] bucket = new int[DATA_NUM];
		// データにランダムな数入れる（０～１００）
		for (int i = 0; i < DATA_NUM; i++) {
			data[i] = (int) Math.floor(Math.random() * 100);
		}
		showData(data);
		sort(data, bucket, DATA_NUM);
		// 見やすいよう改行
		System.out.println();
		showBucket(bucket, DATA_NUM);
	}

	// 元のデータ表示
	private static void showData(int[] data) {
		for (int ele : data) {
			System.out.print("[" + ele + "]");
		}
	}

	// ソート後のバケツの中身表示
	private static void showBucket(int[] bucket, int length) {
		for (int i = 0; i < length; i++) {
			if (bucket[i] > 0) {
				for (int j = 0; j < bucket[i]; j++) {
					System.out.print("[" + i + "]");
				}
			}
		}
	}

	// バケツソートロジック
	private static void sort(int[] data, int[] bucket, int length) {
		for (int i = 0; i < length; i++) {
			bucket[data[i]]++;
		}
	}
}
```

[text](url)https://github.com/nannany/bucket-sort/blob/master/src/main/java/bucketsort/BucketSort.java

以上です。
R言語で散布図行列

R言語で散布図行列を書くサンプルプログラムです。
右上に相関係数、対角線はヒストグラムの代わりに確立密度を書いています。

```r:05_Liner_regression_by_lm.R
#-------Making data------------------------------ 
data_iris<-iris

#-----------Draw Scatterplot Matrix Function------------------------------------
ScatterplotMatrix <- function(DataMatrix) {
  panel.cor<-function(x,y,digits=2,prefix="",cex.cor,...){
    usr<-par("usr")
    on.exit(par(usr))
    par(usr=c(0,1,0,1))
    #r<-abs(cor(x,y,use="complete.obs"))
    r<-cor(x, y)
    txt<-format(c(r,0.123456789),digits=2)[1]
    if(missing(cex.cor))
      cex.cor<-0.8/strwidth(txt)
    text(0.5,0.5,txt,cex=1.5)
  }
  
  #Set histogram panel
  panel.hist.density<-function(x,...) {
    usr <- par("usr")
    on.exit(par(usr))
    par(usr = c(usr[1:2], 0, 1.5) )
    h <- hist(x, plot = FALSE)
    breaks <- h$breaks
    nB <- length(breaks)
    y <- h$counts
    y <- y/max(y)
    
    #draw histgram
    #rect(breaks[-nB],0,breaks[-1],y,col="green",...)
    
    #draw density
    tryd <- try( d <- density(x,na.rm=TRUE,bw="nrd",adjust=1.2),silent=TRUE)
    if(class(tryd) != "try-error") {
      d$y <- d$y/max(d$y)
      lines(d,col="blue",lwd=1.5)
    }
  }
  
  
  #Set lower panel
  panel.lower <- function(x, y, ...){
    points(x, y, pch = 20, col = "darkgreen")
  }
  
  pairs(DataMatrix,upper.panel=panel.cor,diag.panel=panel.hist.density,lower.panel=panel.lower)
  
  return
}

png("06_output.png") #Open device
ScatterplotMatrix(data_iris[,1:4])
dev.off() #Close device
```

結果
![06_output.png](https://qiita-image-store.s3.amazonaws.com/0/111514/1e429daa-f9e3-87ab-5473-66943793fc80.png)
OOP と FP の比較・対応 ニャ!!


# tl;dr

OOP（ObjectOrientedPrograming）,FP(FunctoinalPrograming) の解釈と対応付けをつらつらと書いていくヤーツです。

※ いまいま思うことで、正しいとかそういう話では無いです。

# 取り上げること

 * 再利用
 * 多相性
 * モジュラリティー

 作者の視点だとWeb周りが読者がいた場合のカバレッジが効くと思うのでそれを採用します。

 説明用の構成

```
  【面倒なのでViewとか省略してます】
  +---------------+
  | Browser       |
  +---------------+
    |          A
    V          |
  +--- WebFrameWork -------------+
  |[Router]    |                 |
  |  +-> [Controller] <--> [ORM] |
  +------------------------------+

```

## pseudo-code(疑似コード)で書いてみる

疑似コードベースに三つの事を見ていきます。

### OOP で書いてみる

```

@path('/hoge')
HogeController {
  @GET
  hoge(@param("name") name): hoge[] {
     hoge_orm.list(name)
  }
}

@path, @GET <- Routingのつもり
@param <-
hoge_orm <- ORM の操作をおこなる何か
```

### FP で書いてみる

```
route(r Request) : Response
case /hoge hoge GET

hoge(r Request) : Response
 = to_response . select . to_query(r)
// 関数合成したつもり
```


## 再利用

 基本的に再利用可能なものは、OOP/FPともに下記の事かなと思います。
 どちらのプログラミング手法でもおおよそ一緒かと思っています。

 * 再利用可能なもの
     - WebFrameWork  -> Aサイト,BWebサービスのAPI として再利用されている
        - Router, Controller, ORM の抽象化部品で構成した枠はいろんなサイトで利用されている
     - データそのものとして扱うもの(ORMのオブジェクト)
        - user など共通的なものは、そのサイト内で再利用されているはず
 * 再利用できないもの
     - Router で定義された url
        - 同じURLで意味レベルで内容が違うものを返すことってあるんでしょうね・・・わかりかねますが・・・
     - Controller で記述された処理内容
        - url と 1対１で大体結びついて、他で再利用とかないっすよね
        hoge() メソッド、関数 再利用はない

## 多相性

  プログラミング手法に依存せずに、A,B,Cのサイトを表現できますね

## モジュラリティ

  * OOPの粒度はカプセル化の範囲でモジュラリティが保たれます
  * FPの粒度は関数の範囲でモジュラリティが保たれます

# まとめ

表に起こすと、下表のようになります。
私の視点ではどちらの手法でも構わないと思いますが、
開発チームいろいろだと思うので、

* ある程度スキルあるなら FP
* スキルが無く、動くものを出さないといけないのなら OOP
* リテラシーがまったく無い 手法とか気にせずに書いてください

と思う今日この頃だニャ

<table>
<tr><th>項目</th><th>OOP</th><th>FP</th><th>備考</th></tr>
<tr><td>再利用</td><td>互角</td><td>互角</td><td>WebFrameWorkがしてくるので考える必要は無いはず</td></tr>
<tr><td>多相性</td><td>互角</td><td>互角</td><td>再利用と同じ</td></tr>
<tr><td>モジュラリティ</td><td>負</td><td>勝</td><td>OOPではカプセル化と言う謎の範囲を選択可能のため自由度が高いのです。コードを汚くすることは簡単なので注意が必要です</td></tr>
</table>
Clojureの束縛いろいろ

関数の束縛にはいろいろあるので、まとめておく。
ちなみに引数に使うのはユーザーのモデリングをした以下のmapです。

```clj
(def user {:first-name "Tarou" :last-name "Yamada" :age 19})
```

# 通常の束縛
よくあるやつです。

```clj
(defn greeting [fname lname]
    (str "Hello, "  fname " " lname))

(greeting (:first-name user) (:last-name user))
-> "Hello, Tarou Yamada"

```

# キーによる分配束縛
引数に与えたマップから特定のキーの値だけを必要とする場合、それだけを束縛することができる。

```clj
(defn greeting [{fname :first-name lname :last-name}]
    (str "Hello, "  fname " " lname))

(greeting user)
-> "Hello, Tarou Yamada"

```

# 分配束縛してかつ引数全体も束縛
キーによる分配束縛をしつつ、引数に与えられた値全体も取得したい場合は :as キーワードで束縛できる。

```clj
(defn greeting [{fname :first-name lname :last-name :as user}]
    (str "Hello, "  fname " " lname ", user is " user))

(greeting user)
-> "Hello, Yuji Arakaki, user is {:first-name \"Yuji\", :last-name \"Arakaki\", :age 19}"
```

# 順番による分配束縛
分配束縛はキーだけでなく、順番でも束縛できる。束縛する必要が無い場合はその位置に_(アンダーバー)を入れる。

```clj
(defn check-last-name [[_ key _] [_ val _]]
    (str key " is " val))

(check-last-name (keys user) (vals user))
-> ":last-name is Yamada"

```


# 追記
コメントで頂いたリンク先により有用な記事があるので、そちらも参考にしてください。
はじめてのNode-RED Node Context編


基本的にはNode-REDのドキュメントベースで動かした内容を公開していこうと思います。

## Node Contextを使う

Node-REDでは簡単なデータの永続化の方法としてNode Contextを使用する事ができます。
スコープを理解して上手く使っていけると良いでしょう。

### context
この後の流れからするとlocal contextなんて呼んだ方がいいのかもしれません。
Node-REDが再起動するまでは値が残ります。使用できるスコープはNode内のみになります。

### flow context
スコープはFlow内になりますので、Node間でデータを共有することができます。

### global context
スコープは全てのNodeになりますので、Flow外のNodeとデータを共有することができます。

## サンプル
わかりやすいようにサンプルを上げておきます。
https://github.com/tamaki-shingo/Node-RED_ContextSample.git

実行結果(Injectノードを何回かタップしてログを出してみてください)

```
14 Mar 00:06:04 - [info] Starting flows
14 Mar 00:06:04 - [info] Started flows
14 Mar 00:07:06 - [info] [function:node1] flow1-node1    count :1
14 Mar 00:07:06 - [info] [function:node1] flow1-node1    fcount:1
14 Mar 00:07:06 - [info] [function:node1] flow1-node1    gcount:1
14 Mar 00:07:06 - [info] [function:node2] flow1-node2    count :0
14 Mar 00:07:06 - [info] [function:node2] flow1-node2    fcount:1
14 Mar 00:07:06 - [info] [function:node2] flow1-node2    gcount:1
14 Mar 00:07:06 - [info] [function:node1] Subflow1-node2 count :0
14 Mar 00:07:06 - [info] [function:node1] Subflow1-node2 fcount:0
14 Mar 00:07:06 - [info] [function:node1] Subflow1-node2 gcount:1
14 Mar 00:07:09 - [info] [function:node1] flow1-node1    count :2
14 Mar 00:07:09 - [info] [function:node1] flow1-node1    fcount:2
14 Mar 00:07:09 - [info] [function:node1] flow1-node1    gcount:2
14 Mar 00:07:09 - [info] [function:node2] flow1-node2    count :0
14 Mar 00:07:09 - [info] [function:node2] flow1-node2    fcount:2
14 Mar 00:07:09 - [info] [function:node2] flow1-node2    gcount:2
14 Mar 00:07:09 - [info] [function:node1] Subflow1-node2 count :0
14 Mar 00:07:09 - [info] [function:node1] Subflow1-node2 fcount:0
14 Mar 00:07:09 - [info] [function:node1] Subflow1-node2 gcount:2
14 Mar 00:07:10 - [info] [function:node1] flow1-node1    count :3
14 Mar 00:07:10 - [info] [function:node1] flow1-node1    fcount:3
14 Mar 00:07:10 - [info] [function:node1] flow1-node1    gcount:3
14 Mar 00:07:10 - [info] [function:node2] flow1-node2    count :0
14 Mar 00:07:10 - [info] [function:node2] flow1-node2    fcount:3
14 Mar 00:07:10 - [info] [function:node2] flow1-node2    gcount:3
14 Mar 00:07:10 - [info] [function:node1] Subflow1-node2 count :0
14 Mar 00:07:10 - [info] [function:node1] Subflow1-node2 fcount:0
14 Mar 00:07:10 - [info] [function:node1] Subflow1-node2 gcount:3
```
パーミッションやオーナーを一括で変更する

こんにちは :whale2: 
たとえばなしですが、若者がドキュメントルート以下のディレクトリやファイルのオーナーやパーミッションをゆるくしてしまった[^cf]ので、何とかするのです。

## オーナー変更

(例) `/usr/share/nginx/html` ディレクトリ以下のファイル/ディレクトリを全て
`nginx` ユーザ、`nginx` グループのものに変更。

```bash
$ chown -R nginx:nginx /usr/share/nginx/html
```

## パーミッション変更

(例) `/usr/share/nginx/html` ディレクトリ以下の、ディレクトリを`755`、ファイルを`644`に変更。

```bash:findの-execオプションで処理する方式
$ find /usr/share/nginx/html -type d -exec chmod 755 {} \;
$ find /usr/share/nginx/html -type f -exec chmod 644 {} \;
```

```bash:findの結果をパイプでxargsに与える方式
$ find /usr/share/nginx/html -type d -print0 | xargs -0 chmod 755
$ find /usr/share/nginx/html -type f -print0 | xargs -0 chmod 644
```

おわりです。


## 参考と注釈

* [unix - permissionあれこれ - 404 Blog Not Found](http://blog.livedoor.jp/dankogai/archives/50777535.html)
* [カレント以下のフォルダ/ファイルのパーミッションを変更したい - Qiita](http://qiita.com/hiroakisan@github/items/544db984dc03ded3341d)
* [ファイルやディレクトリのパーミッションを一括で置換したい - Qiita](http://qiita.com/takeshi81/items/48ea62eae2fc7f1cb2f0)
* [UNIX findとxargsコマンドで-print0オプションを使う理由 - 薫のHack](http://kaworu.jpn.org/kaworu/2008-12-08-1.php)
* [chmod(1) - Linux man page](http://linux.die.net/man/1/chmod)

[^cf]: オーナーがファイルアップロード用ユーザで、パーミッションが全部777とか
Raspberry pi Model 2Bで、HDMIから画像を出力する設定

#はじめに
Ubuntu MateをRaspberry pi Model2Bにインストール。デフォルトではHDMI映りませんでした。
設定を見つけたのでメモ。

# 環境
公式サイトのUbuntu Mate 15で試しました。以下のようにインストール。

```
hoge@hoge:~/work$ sudo ddrescue -d -D --force ubuntu-mate-15.04-desktop-armhf-raspberry-pi-2.img /dev/sdb
```

# 設定
config.txtファイルを以下書き換えないとHDMI出力できません。本来、ディスプレイの出せる最高の解像度を自動出力するはずですが、これがなぜか上手く動かないので固定にしてあげないといけないようです。

```
#1280x1024 60Hz表示
hdmi_group=2
hdmi_mode=35  

#電流値を最高に設定
config_hdmi_boost=4
```

なお、`hdmi_safe=1`の設定でセーフモードとなりますが、解像度が極端に悪くなります。

# 参考
モニタと環境によって解像度を以下の表から選び、hdmi_groupとhdmi_modeに設定すればよいです。
[Raspberrypi公式:hdmi設定の意味] https://www.raspberrypi.org/documentation/configuration/config-txt.md
ユニバーサルC基板用アクリルパネルをレーザーカッターで作る


![20160306-DSC04885.jpg](https://qiita-image-store.s3.amazonaws.com/0/5330/29ed4b56-06c9-201c-0648-bd1a34c85ee2.jpeg "20160306-DSC04885.jpg")

秋月で取り扱い始めたC基板用アクリルパネルが良かったので作ってみた。

- http://akizukidenshi.com/catalog/g/gP-09853/

寸法図が公開されてるので、それを元にレーザーカッター出力用の .ai ファイルを作る。

- [C基板用アクリルパネル.ai](https://dl.dropboxusercontent.com/u/980764/tmp/C%E5%9F%BA%E7%9B%A4%E3%82%A2%E3%82%AF%E3%83%AA%E3%83%AB.ai)

![スクリーンショット 2016-03-06 16.51.01.png](https://qiita-image-store.s3.amazonaws.com/0/5330/00de13a8-272c-d2d7-fd88-37baf8468d63.png "スクリーンショット 2016-03-06 16.51.01.png")

切断の線は 0.001mm、赤色(RGB 255,0,0)になってるので、使う人が居たら適宜利用するレーザーカッターにあわせて変えればOK。

アクリルは東急ハンズではがきサイズ、厚さ3mmを。100円。秋月のは 2mm で、3mm だとちょっと厚い気がする。

あとはレーザーすれば完成〜。

![20160306-DSC04878.jpg](https://qiita-image-store.s3.amazonaws.com/0/5330/14f8db28-3596-d33c-ed89-8dbfe4b06366.jpeg "20160306-DSC04878.jpg")

![20160306-DSC04881.jpg](https://qiita-image-store.s3.amazonaws.com/0/5330/bfc10fe2-7dd2-14b2-c288-ebe74258278b.jpeg "20160306-DSC04881.jpg")

簡単に作れて便利。ただ普通は秋月で120円で買った方が手間等々を考えると、だいぶお安いと思います！
gulpで出来ること


自分用の備忘です。
gulpで出来ることが多すぎて、まとめが欲しかったので作りました。

| プラグイン名 | 内容 | 備考 |
|:-----------|------------:|:------------:|
|gulp-imagemin|画像の軽量化|gif,jpeg,png,svgのみ？|
|gulp-uglify|jsの軽量化||
|gulp-minify-html|htmlの軽量化||
| gulp-cssmin|cssの圧縮||
| gulp-csso|cssの軽量化 ||
|gulp-csslint|cssの構文チェック|
| gulp-autoprefixer|ベンダープレフィックスを自動で付加してくれる||
| browser-sync   | 自動ブラウザリロード||
|gulp-useref|css,jsをまとめて1つの物を読み込むようにする||
|gulp-jshint|JSの構文チェック||
|gulp-exec|コマンドを実行||
|gulp-gzip|gzip圧縮||
|gulp-zip|zip圧縮||
|gulp-tar||
|gulp-rename|ファイル名変更||
|gulp-if|gulpの処理の中で分岐ができる||
|gulp-watch|ファイル監視||
|gulp-load-plugins|gulp-xxx系のプラグインをまとめてロード||

随時更新していきます。
もし、何か他にオススメのプラグインとかあれば教えて下さい。
node-env note


# nodenv
https://github.com/nodenv/nodenv#installing-node-versions
rbenv series

## install
brew!
install with node-build plugin

## global installed commands not found...
`nodenv rehash`

## build from src & compile
`nodenv install vx.x.x -c`
and patch
`nodenv install vx.x.x -cp < patchfile`

# nvm
https://github.com/creationix/nvm

## install (for all users)
Linux:

```bash:
export NVM_DIR=/opt/nvm
curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.31.0/install.sh | bash
```
`.bashrc` already edited by install script. Of cource, exec-install-script user only! To apply it, append bellow at `/etc/profile` or any other way.

```
export NVM_DIR="/opt/nvm"
[ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh"  # This loads nvm
```

## list available versions (remote)

`nvm ls remote`

## Upgrade nvm
No command. Rerun install step. Preserve node.js bins that install via prev versions nvm.   
Recomend: `nvm use xxx` or `nvm alias default xxx`  after updgrade nvm


# nodebrew

## install (for all users)
Linux:
1st, edit profile. I guess, you have to set `NODEBREW_ROOT` @ profile, because nodebrew ref this var not only at 1st install, but also at normal operations.

```bash:
export NODEBREW_ROOT=/opt/nodebrew
export PATH=/opt/nodebrew/current/bin:$PATH
```

```bash:
. .bashrc
curl -L git.io/nodebrew | perl - setup
```

## other ops
See it https://github.com/hokaccha/nodebrew
AWS - Amazon Linuxにh2oをインストール

Amazon Linuxに[h2o](https://github.com/h2o/h2o)をインストールする手順です。
*EC2インスタンスの作成〜h2o起動〜index.html表示まで
*EC2インスタンスの作成は割愛


- h2oのバージョン（2016/03/06　時点）

```bash:
# h2o --version
h2o version 2.0.0-DEV
OpenSSL: LibreSSL 2.2.6
```

# 事前作業（EC2の通信許可）
tcp:20(SSH)
tcp:80(HTTP)
tcp:443(HTTPS)

# SSH接続->rootに変更
```bash:
$ sudo su
```

# 必要なものをインストール
```bash:
$ yum -y groupinstall "Development Tools"
$ yum -y install curl curl-devel
$ yum -y install libarchive libarchive-devel
$ yum -y install expat expat-devel
$ yum -y install libyaml-devel
$ yum -y install zlib zlib-devel
$ yum -y install openssl
```

# cmake3.0.2をインストール
```bash:
$ cd /usr/local/src
$ wget http://www.cmake.org/files/v3.0/cmake-3.0.2.tar.gz
$ tar -xvf cmake-3.0.2.tar.gz
$ cd cmake-3.0.2
./bootstrap --prefix=/usr       \
        --system-libs       \
        --mandir=/share/man \
        --docdir=/share/doc/cmake-3.0.2   &&
$ make
$ make install
```

# h2oをインストール
```bash:
$ cd /usr/local/src
$ git clone https://github.com/h2o/h2o.git
$ cd h2o/
$ cmake -DWITH_BUNDLED_SSL=on .
$ make h2o
$ make install
```

# 自己証明書の作成（3650日有効）
```bash
$ cd /usr/local/src/h2o
$ mkdir conf
$ cd conf
$ openssl genrsa 2048 > cert.key
$ openssl req -new -key cert.key  > cert.csr
$ openssl x509 -days 3650 -req -signkey cert.key < cert.csr > cert.pem
```

# 設定ファイル作成
logファイル作成

```bash
$ touch /usr/local/src/h2o/access-log
$ touch /usr/local/src/h2o/error-log
$ touch /usr/local/src/h2o/pid-file
```

設定ファイル作成

```bash:
$ cd /usr/local/src/h2o/conf
$ vi h2o.conf
```

h2o.confに以下を記述

```bash:
user: root
hosts:
  "*":
    listen:
      port: 443
      ssl:
        certificate-file: /usr/local/src/h2o/conf/cert.pem
        key-file:  /usr/local/src/h2o/conf/cert.key
    paths:
      "/":
        file.dir: /usr/local/src/h2o/doc

access-log: /usr/local/src/h2o/access-log
error-log: /usr/local/src/h2o/error-log
pid-file: /usr/local/src/h2o/pid-file
```

# h2o起動
起動前のチェック

```bash:
$ /usr/local/src/h2o/h2o -m test -c /usr/local/src/h2o/conf/h2o.conf
```
起動

```bash:
$ /usr/local/src/h2o/h2o -m daemon -c /usr/local/src/h2o/conf/h2o.conf
```
停止

```bash:
$ kill -TERM `cat /usr/local/src/h2o/pid-file`
```

# ブラウザから接続して確認
https://<YOUR DOMAIN>/index.html

# 参考
- [h2o構築作業メモ](http://nk-kungfu.hatenablog.com/entry/2016/02/13/170251)
- [H2OでWebSocketを試してみた](http://bulbulpaul.com/blog/posts/2015/05/websocket-h2o/)
- [オレオレ証明書をopensslで作る（詳細版）](http://d.hatena.ne.jp/ozuma/20130511/1368284304)
Botkitで作ったAmazon検索Slackボットを公開してみる

#はじめに
みなさん、[Slack](https://slack.com/)使っていますか？ コードを書くか、ブラウジングか、Slackか、みたいな感じで１日が過ぎていくのではないでしょうか。

さて、2015年末に、Slack App Directoryの発表とともに、SlackのBotを作るためのフレームワークBotkitが公開されました。これまでもGitHub社制のHubotがありましたが、「Botkitは公式ということで格段に開発がしやすくなった」という噂を聞いていました。そこで、「APIを使って普段使うサービスをSlackで叩ける用にして、一般に公開する」ということをやってみました。

[Botkit](https://github.com/howdyai/botkit)
[Slack App DIrectory](https://slack.com/apps)

# Amazon検索Botを作ってみた

普段もっとも良く使うサービスの１つにAmazonがあります。SlackでBotに話しかけるとAmazonで検索してくれたら手間が省けるのでは？と思い、ノリと勢いで作ってみることに。

## AmazonBotはこちら

[AmazonBot | SlackでAmazon検索Bot](https://abotapp.herokuapp.com/)

半日でできたものがこちらになります。使い方はシンプルで

`@amazonbot: search おむつ`　と**search**をつけてボットにメンションを飛ばすと、下記のように最大5件の検索結果を表示します。

![sample.png](https://qiita-image-store.s3.amazonaws.com/0/18165/185811f4-4f78-643c-b3a9-72ce4dd737d9.png)

# 使った技術

`Node.js` BotkitはNode.jsで作られています
`Express` Node.jsのWEBアプリケーションフレームワークです
※今回はBotkitをExpressで使えるようにしている人がいたので、それを使いました　[https://github.com/mvaragnat/botkit-express-demo](https://github.com/mvaragnat/botkit-express-demo)
`heroku` 公開するためにはサーバーが必要なので、お手軽なherokuを
`Amazon Product Advertising API` Amazon商品を検索るための公式APIです

# 最後に

Botkitを使うと手軽にSlack上で動くBotを作り、公開することができます。みなさんもぜひ作ってみて下さい！

# 技術的なところについて

詳しく解説しようかと思ったのですが、
[BotkitでSlackのBotをサクッと作る方法](http://toach.click/2016/01/10/slack-botkit/)
[Slackの新しいフレームワークBotkitを試してみる](http://qiita.com/icb54615/items/af08862dfaefbf2bbcbe)

素晴らしい記事がありますので、割愛します。

コメントを頂ければ具体的にお答えします。今回はあくまでも、Botkitを使うと半日くらいで公開までできますので！という実例紹介とさせてください....
React.jsとCycle.js、Polymer俯瞰、そしてどれがいいのか

現在のプロジェクトではVueを使っています。他のフレームワークを調査した結果のメモです。

#用語とか一般的な話とか
##用語
* データ 情報を表現したもの
* Model 加工したいデータ
* ViewModel 描画したいデータ
* DOM ブラウザが解釈する表示データ
* Event 外界から入力されたデータ

##一般的な話
情報処理の本質はデータを他のデータに変換することです。
フロント、バック、ゲーム、なんであろうがそこは変わりません。

フロントにおいて、プログラムは、

Event+Model -> DOM

の変換を行うものです。

ですが、この問題は一気に解くには大きすぎます。よって中間データを導入します。

Event+Model -> Model+ViewModel -> ViewModel+DOM -> DOM

これが情報を処理するという観点から見た、フロントの構造です。

#フレームワーク俯瞰
## React.js
React.jsはViewModelからDOMへの単方向の変換を行うためのフレームワークです。
DOMから情報を読み込まないようにデザインされているため、必然的にDOM構築に必要な情報を **全て書き出してDOMに適用する** 必要があります。ですが、これを真面目にやったらDOMのレイアウト再計算がゴリゴリ走ってえらいことになります。

これを解決するのがVirtual DOMになります。
また、ViewModelの分割は、Componentという単位です。これがツリー構造を成します。
構造を俯瞰すると、

Event+Model -> Model+ViewModel(Component Tree) -> ViewModel+DOM(Virtual DOM) -> DOM

です。

## Cycle.js
Cycle.jsはEvent+ModelからViewModel+DOMへの変換を直感的に書けるようにデザインされたフレームワークです。
ViewModel+DOMはReact.jsと同じVirtual DOMです。 **ViewModelの分割はプログラマの責務** です。いくらでもつないだり分割したり分岐したりできます。ここはRxJSの機能です。

構造は以下です。

Event+Model(Sources) -> 
Model+ViewModel0 -> Model+ViewModel1 ... -> Model+ViewModelN 
-> ViewModel+DOM(Virtual DOM、Sinksに含まれる)+Model(Sinks)

## Polymer
PolymerはWebComponentsの上に乗っかった、Component志向のフレームワークです。
React.jsやCycle.jsとは趣が違い、ModelとViewModelの分割を強くフレームワークが規定します。
変わりに、Componentは更新に必要な全データにアクセスできる（るように分割し）ます。

Component0
Event+PartialModel0+ViewModel0 <-> DOM

Component1
Event+PartialModel1+ViewModel1 <-> DOM

...

ComponentN
Event+PartialModelN+ViewModelN <-> DOM


## 番外 jQuery
jQueryはEvent+Modelを直感的にDOMへ変換するためのライブラリです。Modelが複雑なSPAではむちゃくちゃになりますというかやめてください死んでします 

#結局何が欲しいのか
Cycle.jsからPolymer Driverが使えれば最強じゃないでしょうか。

##理由
###Cycle.jsは副作用を全てドライバに丸投げする
設計上そうなっています。ドライバが出揃わないと厳しいです。
現状のDOMドライバは、現実問題に対する解としてはプリミティブすぎます。

###PolymerはModelがバラバラになる
ViewModelに引きずられて、解決したい問題を表現するModelがバラバラになります。それを嫌ってModelを分割しないと、今度は解くべき問題が大きすぎて苦しいです。

###ともに使えれば解決
Cycle.jsに足りないのはDriverを書くためのフレームワークです。
Polymerに足りないのはModelからViewModelへ変換するための分かりやすい仕組みです。
ここで両者の利害が一致しました。高いシナジーが生み出されそうです。

時間があれば作りたいです！！

### React.jsは……？
いくつかの問題点が指摘されています。

* JSXという特殊構文
* 既存のフレームワークに対する親和性の低さ
* テンプレート不在による、デザイナ・コーダとの連携の難しさ
* etc...

この辺り全てはReact.jsが **プラットフォームを志向しているため** 起こります。
このせいで、React.jsのエコシステムから飛び出すのが難しいのです。
この欠点は利点でもあるので、利点と思えるのでしたら使ったら良いかと思います。
kafkaのトピック一覧を表示する

`kafka-topics.sh --list --zookeeper localhost`

kafka-topics.sh --list --zookeeper [zookeeperのホスト]

```
Siori@Siori-no-MacBook-Air:~/code/git_akb428/mikasa_ol (master *)$ kafka-topics.sh --list --zookeeper localhost
ikazuchi.reccomend_data
ikazuchi.tweet_data
ikazuchi.tweet_datad
ikazuchi0
ikazuchi0.view
ikazuchi0_2
test
```
再帰を末尾再帰に変換する基本ステップ


*すごい H 本で何かに目覚めた俺達は、偶然にもすごい E 本を手にしていた。*

*〜関数型言語殺人事件序文〜*

# はじめに
再帰を末尾再帰に変換する際に、頭がこんがらがってキツかったので、もしや何か基本手順があるのではないかと思い、考えてまとめてみました。

再帰と末尾再帰を変換する少数例をボケっと眺めてて思いついた自己流の基本ステップなので、おかしな箇所がありましたら指摘をお願いします。

# 基本ステップ
1. アキュムレータの初期値を考える
    * 元の再帰の終了条件の右辺から決定する
2. 終了条件を考える
    * アキュムレータの初期値と元の再帰の終了条件を照らし合わせる
3. 一般式を考える
    * アキュムレータの値の計算は元の再帰の一般式を参考にする

# サンプル
2つの簡単な問題で再帰を末尾再帰に変換してみたいと思います。

## リストの長さを取得する関数
まずは通常の再帰で書いてみます。

```erlang
len([]) -> 0;
len([_|T]) -> 1 + len(T).
```

では、変換していきます。

### 1. アキュムレータの初期値を考える
元の再帰の終了条件の右辺を見たところ、0ですね。

```erlang
tail_len(L) -> tail_len(L, 0).
```

`tail_len/1`が外側に公開するインタフェースです。
`tail_len/2`が実際にアキュムレータを導入して末尾再帰化された`len/1`になります。

### 2. 終了条件を考える
リストのサイズが0になったときに終了します。
この時に返される値は`len([]) -> 0;`より、0とわかります。

```erlang
tail_len([], Acc) -> Acc;
```

アキュムレータの初期値が0ですので、それをそのまま返せば OK です。

### 3. 一般式を考える
`len([_|T]) -> 1 + len(T).`を元に一般式を考えます。
今回は、アキュムレータの次の値は元のロジックをそのまま適用すれば大丈夫です。

```erlang
tail_len([_|T], Acc) -> tail_len(T, 1 + Acc).
```

次に受け取るリストは、元のリストから1つ減らしたものを渡せば良いので、T をそのまま渡します。

### 最終形
以上、3ステップで末尾再帰化は完了です。

```erlang
tail_len(L) -> tail_len(L, 0).

tail_len([], Acc) -> Acc;
tail_len([_|T], Acc) -> tail_len(T, 1 + Acc).
```

## みんな大好きフィボナッチ数列
みんな大好きフィボナッチ数列の定義をそのまま書き下してみます。

```erlang
fib(1) -> 0;
fib(2) -> 1;
fib(N) -> fib(N-1) + fib(N-2).
```

見慣れたアレですね。

### 1. アキュムレータの初期値を考える
まず、元の再帰の一般式を見たところ、2つ再帰呼び出しがあります。
というわけで、アキュムレータは2個準備しておきます。

```erlang
tail_fib(N) -> tail_fib(N, 0, 1).
```

初期値は元の終了条件の右辺からそのまま持ってきています。

### 2. 終了条件を考える
元の終了条件からそのまま、末尾再帰での終了条件を書いてみます。

```erlang
tail_fib(1, Acc1, _) -> Acc1;
tail_fib(2, _, Acc2) -> Acc2; % 実は不要
```

ホントにこれでいいのかよって気がしますが、多分大丈夫です。多分。
そして2つ目の終了条件は実は不要ですが、ここでは放置します。

### 3. 一般式を考える
混乱を防ぐために、それぞれのアキュムレータが何を意味しているのか抑えておきます。今回は`Acc1 = fib(N-2)`と`Acc2 = fib(N-1)`という意味になっています。

すなわち次のアキュムレータは、元の一般式の`fib(N) -> fib(N-1) + fib(N-2).`から考えると、

* NextAcc1 = fib(N-1) = Acc2
* NextAcc2 = fib(N) = Acc1 + Acc2

となります。

よって、一般式は、

```erlang
tail_fib(N, Acc1, Acc2) -> tail_fib(N-1, Acc2, Acc1+Acc2).
```

となります。

### 最終形
以下の通りになりますが、 まだ *実は不要* と書いたものが残っています。

```erlang
tail_fib(N) -> tail_fib(N, 0, 1).

tail_fib(1, Acc1, _) -> Acc1;
tail_fib(2, _, Acc2) -> Acc2; % 実は不要
tail_fib(N, Acc1, Acc2) -> tail_fib(N-1, Acc2, Acc1+Acc2).
```

`tail_fib(2, _, Acc2) -> Acc2;`が何故不要かについては、`tail_fib(N, Acc1, Acc2)`に`N=2`を代入して見ればわかるかと思います。

試しに入れてみると`tail_fib(2, Acc1, Acc2) -> tail_fib(1, Acc2, Acc1+Acc2)`となり、結局`Acc2`が返ってくることがわかります。

というわけで、

```erlang
tail_fib(N) -> tail_fib(N, 0, 1).

tail_fib(1, Acc1, _) -> Acc1;
tail_fib(N, Acc1, Acc2) -> tail_fib(N-1, Acc2, Acc1+Acc2).
```

これで完成です。

# まとめ
末尾再帰をいきなり考えるのではなく、再帰から考えたほうが良さそうです。
元の再帰を元に、初期値、終了条件、一般式と考えると混乱が少ないように思います。
また、元の再帰を考える際も、終了条件から考えると考えやすい気がします。
シェルスクリプトのwhile readループが悪いのか？回避策は？

# 以下の投稿、根本的な間違いがあったのであとで直します。（shと思ってたものが、実はbashだったとは、、）

# シェルスクリプトのwhile readループ問題
シェルスクリプトの鬼門とも言うべきwhile readループの問題を少しまとめたい。
たとえばpsコマンドの結果を画面に表示して、最後に個数を表示したとする。

```bash:root_process.sh
#!/bin/sh
declare -i COUNTER=0
ps -ef|awk '$1=="root"'| while read LINE
do
    COUNTER+=1
    set -- $LINE
    echo $COUNTER : $8
done
echo COUNTER=$COUNTER
```
これを実行すると、最後の個数表示が`COUNTER=0`となってしまう。
同じように、while do ~ doneループ内でexitしてもうまく動いてくれないなど、whileループには問題がいくつかある。

# 悪いのは誰？
上記の例の場合にwhileループを避けてawkなどで書き直せばうまく行くのだが、この問題の原因はwhileループなのではなく、**シェルのパイプライン処理は子プロセスで実行する**という仕様によるものである。
（ksh,zshの場合にはパイプラインの末尾は親シェルの一部として実行する。bashでは`shopt -s lastpipe`とすることで同様のことが可能。）

# 回避策
whileループを使って、うまく避ける方法がないかと考えて試行錯誤したが、どうやらBourne Shellでも動く方法があったので紹介する。

```bash:root_process_2.sh
#!/bin/sh
declare -i COUNTER=0
while read LINE
do
    COUNTER+=1
    set -- $LINE
    echo $COUNTER : $8
done <<EOF
$(ps -ef|awk '$1=="root"')
EOF
echo COUNTER=$COUNTER
```

書いてしまえば何でもないのだが、少しだけコツがあった。
１．パイプラインでwhileに渡さずに、ヒアドキュメントにする。
２．ヒアドキュメント内で子プロセス実行（$()まはた\`\`）で実行してやる。
これでBourne Shellでも動く。bash特有の書き方は[stack over flowページ](http://stackoverflow.com/questions/19570413/bash-how-to-pipe-input-to-while-loop-and-preserve-variables-after-loop-ends)にいくつかあるが、いずれも少し特殊な書き方のように思う。
El Capitan で gem install mysql2 が文字化けでエラー


## 現象

```
> gem install mysql

Building native extensions.  This could take a while...
Successfully installed mysql2-0.4.3
Parsing documentation for mysql2-0.4.3
unable to convert "\xCA" from ASCII-8BIT to UTF-8 for /Library/Ruby/Gems/2.0.0/extensions/universal-darwin-15/2.0.0/mysql2-0.4.3/mysql2/mysql2.bundle, skipping
unable to convert "\xCA" from ASCII-8BIT to UTF-8 for lib/mysql2/mysql2.bundle, skipping
Installing ri documentation for mysql2-0.4.3
1 gem installed
``=

## 対処
oh-my-zshでの文字化けが原因だった。.zshrcの冒頭に以下を追加で解決。現在の環境変数はenvコマンドで確認。

```.zshrc
export LANG=ja_JP.UTF-8
export LC_CTYPE=UTF-8
```

## 参考
* [oh-my-zshで文字化け - Qiita](http://qiita.com/tokutake@github/items/a03ddad0327429a470cb)
* [oh-my-zshで日本語が文字化けする時の対処 - 面白コンテンツ探求日記](http://blog.horimisli.me/entry/2014/06/22/135304)
Backlogで添付画像やGyazoの画像・アニメーションを表示する方法などまとめ

#Backlogで添付画像やGyazoの画像やアニメーションを表示する方法などまとめ
##■Backlogで画像URLを直接表示させる方法
`#image(http://hogehoge.hoge.jpg)`

##■Backlogで添付の画像ファイルを直接表示させる方法
**□Wiki**
　・添付ファイルのURLの末尾IDを#image()に含める
　　例)
　　NG・・・`#image(https://hogehoge.backlog.jp/ViewAttachment.action?attachmentId=1073950837)`
　　OK・・・`#image(1073950837)`

**□タスクコメント**
　・添付ファイルのURLのViewAttachmentをViewAttachmentImageに置換して#image()に含める
　　NG・・・`#image(https://hogehoge.backlog.jp/ViewAttachment.action?attachmentId=1073950837)`
　　OK・・・`#image(https://hogehoge.backlog.jp/ViewAttachmentImage.action?attachmentId=1073950837)`

##■BacklogでGyazoの画像やアニメーションを直接表示する方法
　・URLの末尾に/rawを追加して#image()に含める
　　NG・・・`#image(https://gyazo.com/976917aca9a3d76fabbc352b0453458d)`
　　OK・・・`#image(https://gyazo.com/976917aca9a3d76fabbc352b0453458d/raw)`

![alt](https://gyazo.com/acb0820bdbceec4628c03fecc1712c21/raw)
LabVIEW Tips: LabVIEW でJSON

#LabVIEW でJSON

LabVIEW2014からJSON文字列への変換がサポートされました。
（他の言語を使っている方からは「なにを今さら」といわれそうですが。）
とはいっても、任意のデータをJSON文字列に変換と、その逆変換の関数が用意されただけなんですが、Webサービスとの絡みもあって、今後はLabVIEW界隈でも使う機会が増えるかもしれません。

##JSON文字列への変換・逆変換
LabVIEWのJSON変換は、
項目と値をひとつずつJSONオブジェクトにセットしていく、というやりかたではなく、パラメータで渡されたクラスタなどのデータを、そのままJSON形式文字列に変換するものです。
逆変換する場合は、データ型を指定してJSON文字列から指定されたデータ型に変換します。なので、文字列からパースする場合は、あらかじめデータ型がわかってないと使えません。
項目の名前だけでなく、順番や個数も合致している必要があります。

また、配列はLabVIEW独自拡張したフォーマットになるようです。

###JSON文字列に変換(Flatten To JSON String)
![ToJSON.png](https://qiita-image-store.s3.amazonaws.com/0/43526/a0e1ca7d-6116-753f-42e0-682ead5f64e8.png)


###JSON文字列から変換(Unflatten From JSON)
![FromJSON.png](https://qiita-image-store.s3.amazonaws.com/0/43526/153df642-aae0-2cd3-0164-54f383acf879.png)


##欠点
###1.文字コードがUTF-8
JSON文字列の文字コードはUTF-8なので、日本語が混ざっている場合は注意。

###2.クラスタメンバーの並び
LabVIEWのUnFlatten JSON関数は、JSON文字列から逆変換する時に、クラスタ（構造体）の項目の順序とJSON文字列の項目の並びが一致させないと、エラーになります。
他の言語で、JSONデータをdumpして文字列出力する時の並びは、ランダムかもしくはソートされて出力されてきますので、これをLabVIEW側で受け取って変換しようとするとエラーになります。
面倒でも、LabVIEW側のクラスタ（構造体）の項目の順序に合うように並べてあげる必要があります。
もしくは、LabVIEW側のクラスタ（構造体）の各項目の順序をラベルテキストの昇順になるようにする？

##用途
おもな用途として、WebサービスAPIのPOSTパラメータや応答の出力にJSON形式を使うことが多いようです。
LabVIEWでもWebServiceAPIの応答の出力形式にJSON形式を指定できます。
それ以外に、ログ出力メッセージや設定ファイルやなどにも使えると思います。

###ログメッセージ出力
LabVIEWのJSON変換は、１行出力なので、これを逆に利用してエラークラスタなど複雑な構造（クラスタ）のデータを、逐一書式指定すること無しに１行の文字列に変換してログに出力できます。
以下の例はエラークラスタの文字列変換例です。
![Sample_ToJSON.png](https://qiita-image-store.s3.amazonaws.com/0/43526/d2ff3e13-c6ea-3cc1-3730-54b7cbfc48b9.png)

###設定ファイル
たいてい、INI形式を使っていると思いますが、
LabVIEW2014　のcRIO(RealTimeLinux)ではINI形式保存・読み込みに不具合があって使えなかったりするので、その代用にできます。
LabVIEW XML形式でもいいのですが、JSONの方が簡潔なので見やすいです。項目が少ない場合は、JSONで十分ことたりると思います。
難点は、JSON文字列に変換した文字列が折り返しの１行出力なので、項目が多いと、だらだらと長い1行になって可読性にかけることです。出力した文字列のフォーマット(4タブでインデントなど)が指定できるといいんですが。
*)文字列がUTF8なのでエディタで編集する場合は要注意です。


##関連記事
[LabVIEW SJIS <-> UTF-8 文字コード変換](http://qiita.com/alucky4416/items/64d4557d74b730c36e40)
[LabVIEW Tips: デバッグログ](http://qiita.com/alucky4416/items/ebe2cbc3b0722aa5851e)
[メモ]AWS CLIを使ってバケットのファイルを一括ダウンロード


設定

```
$ brew install aws
$ aws configure
AWS Access Key ID [None]: {acesskey入れる}
AWS Secret Access Key [None]: {パスワード入れる}
Default region name [None]: ap-northeast-1
Default output format [None]:
```

実行


```
$ aws s3 cp s3://{バケット名}/ . --recursive
```
Xcodeからアップロードできないときは、Application Loaderを使おう

# Application Loaderを使う

* 原因不明で、アップロードできないことがあります。（エラーコード -22421 と出る）
* また、Xcode9 では、アップロード先のアカウントを選択することができなくなってしまったため、複数アカウントを使用している場合、正しいアカウントでアップロードできずにエラーになる場合があります（エラーコード：ITMS-4088)

そんな時でも、Application Loaderを使うとアップロードができます。


## ipaファイルを作成

XcodeのメニューバーのWindow->Organizer を選択。

Exportを選択。
Save for iOS App Store Deployment を選択。
![スクリーンショット 2016-03-06 14.36.25.png](https://qiita-image-store.s3.amazonaws.com/0/98954/52fdd2b7-c69e-15ea-81c2-5b4b7424894b.png)

これでipaファイルが作成できます。


## Application Loaderの作業

Xcode→Open Developer Tool→Application Loaderを選択。
![スクリーンショット 2016-03-06 14.30.21.png](https://qiita-image-store.s3.amazonaws.com/0/98954/a6cfeb83-bc2a-51e4-565e-b11eb1828c91.png)

初回の場合は、iTunesアカウントを聞かれるので、
アカウント名とパスワードを入力しましょう。

次いで、「Appをデリバリ」を選択。先ほど作成したipaファイルを選択します。
なお、画面左上はサインインしたアカウント情報です。こちらから変更・サインアウトできます
![スクリーンショット 2017-10-02 11.28.15＿z.png](https://qiita-image-store.s3.amazonaws.com/0/98954/1f8ef570-afe6-f686-50d3-f8109f115c17.png)

すると、以下のような確認画面が出ますので、問題なければ「次へ」！
![スクリーンショット 2017-10-02 11.30.00＿z.png](https://qiita-image-store.s3.amazonaws.com/0/98954/dd314c96-8b4e-005d-5254-95a1b43cc6a9.png)

これでアップロードできます！
OracleJetインストール方法


OracleJetとは
--
OracleJetはオラクルが開発したエンタープライズアプリケーション向けのJavaScriptライブラリです。
SPAのサポートや「Alta UI」のほか、JQuery、KnockoutJS、RequireJS、Hammerなども含まれた統合的なライブラリのようなのでとりあえずインストールしてみました。

#インストール手順
基本的には公式の手順([OracleJet](http://www.oracle.com/webfolder/technetwork/jet/globalGetStarted.html "OracleJet"))に従っていれば行います。
備忘のために幾つか必要なとこも書いておきます。

環境構築
--
まずは、npmの最新化を行っておきます。
`npm install -g npm`


続いて下記コマンドでインストールします。
公式には書いてありませんが、bower,load-grunt-config,jit-grunt,grunt-cliについても必要なようなのでインストールしておきます。

`npm -g install yo grunt generator-oraclejet load-grunt-config jit-grunt grunt-cli`

また、この時点で`bower install`も行いOracleJetのコンポーネントをインストールしておきます。


OracleJet環境作成
--
下記、コマンドを実行
`yo oraclejet oracle_jet_sample --template=basic`

ビルド、起動
--
以下のコマンドを実行すればブラウザが勝手に起動しデモ画面が表示されるはずです。
`cd oracle_jet_sample
grunt build
grunt serve`

何ができて、何ができないかは
公式の[CookBook](http://www.oracle.com/webfolder/technetwork/jet/uiComponents-formControls.html "CookBook")を参照してください。
TensorFlowを使いたいだけなのに、なんかすごいコケてはまったのでメモしておく。

## 追記

※結局home brew のpythonを捨てて、macのpython使ったらコケずにいけました。なので、以下の投稿は洋なしです。


結局Vagrantの中にUbuntu入れて、Python3でやりました。
pipをapt-getでいれなければ、いけました。

```bash
vagrant init ubuntu/trusty64
vagrant up
vagrant ssh
```

参考
http://phpy.readthedocs.org/en/latest/install.html

```bash
python3 -V
# Python 3.4.0

sudo apt-get update
sudo apt-get upgrade

python3 -V
# Python 3.4.3


# これだとエラー
# wget https://raw.github.com/pypa/pip/master/contrib/get-pip.py
# sudo /usr/bin/python3 get-pip.py
# You're using an outdated location for the get-pip.py script, 
# please use the one available from https://bootstrap.pypa.io/get-pip.py

wget https://bootstrap.pypa.io/get-pip.py
sudo /usr/bin/python3 get-pip.py
pip3 list

sudo apt-get install python3-dev

sudo pip3 install --upgrade https://storage.googleapis.com/tensorflow/linux/cpu/tensorflow-0.7.1-cp34-none-linux_x86_64.whl

pip3 list
# command-not-found (0.3)
# language-selector (0.1)
# numpy (1.10.4)
# pip (8.1.0)
# protobuf (3.0.0b2)
# pycurl (7.19.3)
# pygobject (3.12.0)
# python-apt (0.9.3.5ubuntu2)
# setuptools (20.2.2)
# six (1.10.0)
# tensorflow (0.7.1)
# ufw (0.34-rc-0ubuntu2)
# unattended-upgrades (0.1)
# wheel (0.29.0)
```
GoogleBooksAPIを使う

Googleでは多くのAPIが公開されています。
今回はGoogleBooksAPIを使って、本の情報を取得する方法についてまとめてみます。

#URL
GoogleBooksAPIは以下のURLで公開されています。

>https://www.googleapis.com/books/v1/volumes

ただし、このURLにアクセスしただけではエラーが返ってくるので、実際にデータを取得するときはパラメータを指定する必要があります。
例えば、qパラメータで森博嗣さんの本を探したいときは

>https://www.googleapis.com/books/v1/volumes?q=森+博嗣

こんなふうに指定します。

#パラメータ
パラメータに関するドキュメントは[ここ](https://developers.google.com/books/docs/v1/using)にありますが、よく使いそうなものについて紹介します。

|パラメータ名|意味|
|:-----------|:------------|
|q|検索キーワードの指定|
|startIndex|取得開始Index(いわゆるOFFSET)|
|maxResults|取得数(いわゆるLIMIT)、最大40まで|
|callback|JSONPのコールバック関数名|
|key|APIキー|

とりあえず、これだけあれば、キーワード検索結果をページングで表示したりはできるかと思います。
maxResultsの指定は最大40までなので、それ以上の結果を表示したい場合は複数回リクエストを投げる必要があります。

#取得結果
結果はJSON形式で戻ってきます。
戻ってくるJSONのキーとデータ内容について書くと(ごく一部です)

```
{
    "kind":本の種類,
    "totalItems":条件に一致したデータ数,
    "items"[条件に一致したデータの配列
            {
                 "id":GoogleBooksAPI上でのID,
                 "volumeInfo":[本の情報
                               "title":タイトル,
                               "subtitle":サブタイトル,
                               "authors":[著者名配列],
                               "publishedDate":出版日
                               "description":概要
                              ]
            },{},…]
}
```

volumeInfoの中身は登録されていない情報もあるようなので、使用するときは要注意です。

totalItemsは同じ検索条件でもstartIndexやmaxResultsの指定で変化することもあるようなので、信頼性は低いです。
しかし、もしもstartIndexを結果数を超える値に指定したとしてもajaxリクエストすると、勝手に最後のアイテムを取得してきてくれるようなので、ページング時の不都合はないのではないかと思います(URLでリクエストした場合は帰ってこないようですがページャを実装した検索処理を作ってみたら、そういう動きになりました。詳細は不明)。

### ※4/30追記
totalItemsを超えたときの情報取得については、ページャのほうで最大数が変化することにより、現在参照中のページが切り替わり、そのタイミングで再度検索処理が実行されることによるものでした。


#アクセス制限
このように本の情報を取得することができるGoogleBooksAPIですが、1つのAPIキーに対して、1000リクエスト/1日の制限がかけられています。
一応、申請すれば上限を増やすこともできるようですので、もし1000リクエストで足りないような場合は考えてみてはいかがでしょうか？
InDesignつかってみた

[参考：InDesign ヘルプ / フレームとオブジェクトを使用した作業](https://helpx.adobe.com/jp/indesign/using/frames-objects.html)

#見た目は知ってるんだけど名前がわからないあれ


1.  原稿用紙みたいな薄い線=【レイアウトグリッド】
+ 画像挿入した時の真ん中に手が出てくるやつ=【コンテンツグラバー】
+ 画像入れた時の画像のトリミングするための線=たぶん、【フレーム】
+ 右側に出てくるページ一覧のようなもの=【ページパネル】
+ カスタマイズした文字を保存できるあのパネル=【オブジェクトスタイル】

#よく使うショートカット

+ option+command+a
=レイアウトグリッドの出し入れ

+ v
=選択ツール
+ esc
=イラレでいうcommand+enter(ちなみにcommand+enterは使えない。)
+ command+れ
=ガイドの出し入れ

##リンク集

[インデント取り方](http://www.adobe.com/jp/print/tips/indesign/category9/page3_1.html)