OmniAICreator/Qiita-1.07M huggingface dataset:
“`〜`”と“$(〜)”の挙動の違いまとめ

# “<code>&#x60;</code>〜<code>&#x60;</code>”と“`$(`〜`)`”は、単純には置き換えられない！

“<code>&#x60;</code>〜<code>&#x60;</code>”と“`$(`〜`)`”は、どちらも中の文字列をコマンドとして解釈し、その実行結果を返す文法であるが、必ずしも素直に置き換えることはできない。

その例をまとめることにした。


# “`$(`〜`)`”は素直に入れ子にできるが、“<code>&#x60;</code>〜<code>&#x60;</code>”は酷く複雑になる

例えば、“`$(`〜`)`”の中に“`$(`〜`)`”を用いて、次のようなコマンドを書いても正しく動作するが、

```sh:
$ $(echo $(echo echo x=)1)
x=1
$ 
```

単純に`$(`と`)`を<code>&#x60;</code>に置き換えると……、

```sh:
$ `echo `echo echo x=`1`
sh: 1: command not found
echo x=
$ 
```

というようにして失敗する。“<code>&#x60;</code>”は、始まりと終わりが区別できないため、次に出現したら終わりと解釈するしかないからである。

というわけで、入れ子にしたい場合は“<code>&#x60;</code>〜<code>&#x60;</code>”ではなく“`$(`〜`)`”を使うことを勧める。

が、一応POSIX文書には「“<code>&#x60;</code>〜<code>&#x60;</code>”も入れ子にできる」と明記されている。内側のものをバックスラッシュでエスケープすればいいというのだ。

そこで、例えば二重、三重、四重の入れ子を作ってみると、こんなふうになった。

```sh:
$ `echo \`echo \\\`echo \\\\\\\`echo echo HOGE\\\\\\\`\\\`\``
HOGE
$ 
```

この規則がわかるだろうか？$n$重にしたければ$n$重目のバッククォートは$2^{(n-1)}-1$個のバックスラッシュでエスケープすることになるのだ。いくらできるとはいえ、これはひどい。


# “`$(`〜`)`”は中のバックスラッシュも特別扱いしないが、“<code>&#x60;</code>〜<code>&#x60;</code>”はエスケープ文字として解釈する

両者は、その中にバックスラッシュを含む文字列があった場合に挙動がかわる。

まずは“`$(`〜`)`”で、試してみる。

```sh:
$ printf 'printf a\\nb' | $(sed 's/\\/<backslash>/g')
a<backslash>nb$ 
```

前半のprintfコマンドでは`printf a\nb`という文字列を標準出力に送り、後ろのsedコマンドでは`\`を`<backslash>`に変換して無効化するというものである。

ところがここで単純に`$(`と`)`を<code>&#x60;</code>に置き換えると……、

```sh:
$ printf 'printf a\\nb' | `sed 's/\\/<backslash>/g'`
sed: -e expression #1, char 17: unterminated `s' command
$ 
```

というふうにsedコマンドでエラーになってしまう。理由は、<code>&#x60;</code>〜<code>&#x60;</code>が、sedコマンドの引数にある“`\\`”を解釈し、“`\`”に変換してからsedコマンドに引数を渡すことにより、sedコマンドは“`'s/\/<backslash>/g'`”の“`\/`”を正規表現の区切り文字ではなく単純なスラッシュと見なしてしまって、誤動作してしまうことによる。

従って、“<code>&#x60;</code>〜<code>&#x60;</code>”を使う場合は、次のようにし“`\`”をエスケープして記述すること。

```sh:
$ printf 'printf a\\nb' | `sed 's/\\\\/<backslash>/g'`
a<backslash>nb$ 
```

# “<code>&#x60;</code>〜<code>&#x60;</code>”の中にcase文を書いても害はないが、“`$(`〜`)`”の中に書くとエラーになる場合がある

これは使っているシェルがbash（バージョン3）の場合に起こる。

そのような例を書いてbashのバージョン3で実行すると、

```sh:
$ echo $(case 1 in 1) echo OK;; esac)
-bash: syntax error near unexpected token `;;'
$ 
```

このようにエラーになる。これは、case文で条件指定に使う“`)`”が`$(`に対応する閉じ括弧であると誤認識されてしまうからだ。

bashバージョン3は、CentOS 5という2017/03までサポートすることが保証されているOSにおいて現役であるので、古いバージョンだからとはいえ無視するわけにはいかない。

従って、case文を中で使いたい場合は“`$(`〜`)`”ではなく、“<code>&#x60;</code>〜<code>&#x60;</code>”を使う方がよい。

# “<code>&#x60;</code>〜<code>&#x60;</code>”の中に`$$`を書いても害はないが、“`$(`〜`)`”の中に書くと無視される場合がある

これも使っているシェルがbashの場合に起こる。しかもこちらは、バージョン4でも起こるのでcase文以上に注意が必要だ。

論より証拠、次のようなコードをbash上で実行すると……、

```bash:
$ echo $(echo $$'')

$ 
```

表示されるはずのプロセスIDが表示されないのである。

これは悪条件が重なると起こるようだ。→[参考](http://qiita.com/richmikan@github/items/a250f4212f8c77ed9d14#%E3%81%AE%E4%B8%AD%E3%81%AE%E3%81%A8)

だが、発症する条件は推測に過ぎないのでやはり、変数“`$$`”を中で使いたい場合は“`$(`〜`)`”ではなく、“<code>&#x60;</code>〜<code>&#x60;</code>”を使う方がよい。
LINE BOT が チラシをくれた(2) 〜PUSH編

前回はオウム返しまではできた。
[LINE BOT が チラシをくれた(1) 〜おうむ返し編](http://qiita.com/kurouw/items/f00229e51818d80ae643)

#追記 
この記事は、LINE Messaging APIになる前のbot trialの内容である。


#内容
今回はメッセージなどをBOTから送ってくれるようにするところまで。
普通に家に来るチラシは寝て起きればポストに入ってるのが普通。
LINE BOT でも寝て起きれば来るようにしなければなんかダサいし実用的じゃない。
そのために何かの条件でBOTから自動的におくってくれるような仕様にすればいい。

#0.LINE BOT API 
| contentType  |  mean |
|:------------:|:-------:|
|　　　1　　　|　テキスト　|
|2|画像|
|3|動画|
|4|音楽|
|7|位置情報|
|8|スタンプ|
|10|連絡先|

今回は画像とテキストしか使わないので画像とテキストについて書いていくと思う。


#1.メッセージを返すために必要な情報

```:send_text.json
{
"to":["送る人のID"],
"toChannel":1383378250,
"eventType":"138311608800106203",
"content":{"contentType":1,
           "toType":1,
           "text":"おはよう"
           }
}
```

実際に送るのがテキストメッセージの場合、上記のように contentType は 1 にそして text というフィールドが必要になる。
(ちな、 toType はどのような人に送るか。 個人に送る場合1になる。)

#2.画像を送るとき
```:send_Image.json
{
"to":["送る人のID"],
"toChannel":1383378250,
"eventType":"138311608800106203",
"content":{"contentType":2,
           "toType":1,
           "originalContentUrl": "http://example.com/example.jpg",
           "previewImageUrl": "http://example.com/examplesamune.jpg"
           }
}
```

画像を送る場合 "originalContentUrl" と "previewImageUrl" というのが必要になる。
(この二つは同じでも可)

#3.PUSHする方法
LINE BOT は普通のwebアプリを作るのと似てると思う。
'linebot/callback/' が来たらそれに対して何かの処理をするのんだったら、 '/' が来たときの処理でPUSHしてやればいいんじゃないかと考えた。

Heroku には便利なアドオンがあって決めた時間にコマンドを実行みたいなのができるのでそれを使う。名前は Heroku scheduler という。

例えば 朝8時におはようっていうメッセージを自動的に送ってきて欲しかったら、

```ruby:config.ru
get '/' do
 if (Time.now.hour == 23 && Time.now.min == 0)
  toMe = ENV["MY_ID"]
  request_content = {
          to: [toMe],
          toChannel: 1383378250, # Fixed  value                                                                                                                 
          eventType: "138311608800106203", # Fixed value                                                                                                        
          content: {contentType: 1,
                    toType: 1,
                    text: "おはよう"
                   }
        }
  request_content_json = request_content.to_json
  RestClient.proxy = ENV["FIXIE_URL"]
  RestClient.post(@endpoint_uri,request_content_json,@request_header)
 end
end
```

っていうのを前回のコードに追記して
MY_ID を Heroku の環境変数に登録して Heroku に push する。
今回は自分に送るように開発してるので、to: の部分はあらかじめわかってる。

Heroku の Heroku Scheduler に 毎日23(UTC)に
$ curl https://myappname.herokuapp.com/
(myappnameには Heroku の アプリ名)
というコマンドを実行って設定すれば毎朝8時にメッセージが来るようになる。

画像を送信したければ、上のほうに書いてあるように request_content を変えるだけ。

#まとめ
これを自由自在に変えれば好きな事をBOTが送ってきてくれるようになる。
悪いところとかご指導してもらえると嬉しいです。

#次回
[LINE BOT が チラシをくれた(3)　〜最後まで](http://qiita.com/kurouw/items/1f86fbd32fdc1d1474f1)

#参考資料
[LINE BOT が チラシをくれた(1) 〜おうむ返し編]
(http://qiita.com/kurouw/items/f00229e51818d80ae643)
[API reference for BOT API](https://developers.line.me/bot-api/api-reference)
docker run --net=host を使ったら su すると su: System error がでてきたときの対処方法

# 概要

***docker run --net=host*** でコンテナを実行し、そのコンテナでsuを実行する必要があるときに

```
su: System error
```

というエラーがでたので、その対処方法をさがしたい

# 結論

```
--pid=host
```
もつけてみる

# 概要

Googleで調べてみたら、以下のようなものがみつかった。

* [docker host network model cause command "su" execute problem in container · Issue #5899 · docker/docker](https://github.com/docker/docker/issues/5899)


その中のコメントにあった

[docker host network model cause command "su" execute problem in container · Issue #5899 · docker/docker](https://github.com/docker/docker/issues/5899#issuecomment-43545713)

自分の手元で、実行してみると たしかに12.04では実行ができるが、14.04.4では実行ができなかった。

```
$ docker run -it --net=host ubuntu:12.04 /bin/bash -c 'su root -c ls'
bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  selinux  srv  sys  tmp  usr  var
$ docker run -it --net=host ubuntu:14.04.4 /bin/bash -c 'su root -c ls'
su: System error
```

であったが ***--pid=host*** をつけて実行すると

```
$ docker run -it --pid=host --net=host ubuntu:14.04.4 /bin/bash -c 'su root -c ls'
bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
```

このようにエラーがなくなった。


# なぜ、su するのか？

```
USER suしたいユーザー
```
をしたら？
というのが、上のissueでもあったかとおもう。
それで可能ならそれがよいとはおもうのだが、どうしてもしたいときがある。

いろいろ事情があると思うが、おそらくは、データベースなどのデータを自分の権限にしたいとか
なにかこのようなことをする必要があるときがあるのかもしれない。
CSSだけで凹むボタン（メモ）

# 押すとべこっとへこむボタン(ラジオボタン)


![01.jpg](https://qiita-image-store.s3.amazonaws.com/0/123344/92e32bce-e923-72cf-683a-2062ccb29df1.jpeg)


```ruby:html
<input id="btn01" type="radio" name="btn" checked value="">
<label for="btn01">ラーメン</label>
<input id="btn02" type="radio" name="btn" value="">
<label for="btn02">うどん</label>
```
```ruby:css
input[type=radio]{
display: none;
}

label{
display: block;
width: 150px;

padding: .5em;
margin:0 .5em .5em 0;
border-radius: 5px;
box-shadow: 0 0 0 2px rgba(0, 0, 0, 0.08), 0px -9px 2px -7px rgba(0, 0, 0, 0.5) #000000 inset;
-moz-box-shadow: 0 0 0 2px rgba(0, 0, 0, 0.08), 0px -9px 2px -7px rgba(0, 0, 0, 0.5) #000000 inset;
-webkit-box-shadow: 0 0 0 2px rgba(0, 0, 0, 0.08), 0px -9px 2px -7px rgba(0, 0, 0, 0.5) inset;
background-color: #f9f9f9;
text-align: center;
color: #333;
}

input[type="radio"]:checked + label {
  box-shadow: 0 0 0 2px rgba(0, 0, 0, 0.08), 0px 4px 10px -6px #000000 inset;
  -moz-box-shadow: 0 0 0 2px rgba(0, 0, 0, 0.08), 0px 4px 10px -6px #000000 inset;
  -webkit-box-shadow: 0 0 0 2px rgba(0, 0, 0, 0.08), 0px 4px 10px -6px #000000 inset;
background-color: #E66430;
color: #fff;
}
```

べこべこ
チェックボックスでも。
Railsでconfig(旧rails_ config)というgemを使って定数管理

## config(旧rails_config)とは
定数を一元管理する便利なgem

## Version
`gem 'config', '~> 1.2', '>= 1.2.1'`

## 環境
- ruby 2.2.3p173
- Rails 4.2.6


## Install

- Gemfile

```lang:Gemfile
gem 'config'
```

- bundle install

```
$ bundle install --path vendor/bundle
```

- install

```
$ bundle exec rails g config:install

      create  config/initializers/config.rb # 基本設定
      create  config/settings.yml # 全環境で使用する定数を設定
      create  config/settings.local.yml # ローカル環境でのみ使用する定数を設定
      create  config/settings
      create  config/settings/development.yml # development環境で使用する定数を設定
      create  config/settings/production.yml # production環境で使用する定数を設定
      create  config/settings/test.yml # test環境で使用する定数を設定
      append  .gitignore
```

.gitignoreに自動で下記が追記される。

```lang:.gitignore
config/settings.local.yml
config/settings/*.local.yml
config/environments/*.local.yml
```

## 定数をYAMLで定義

例えばdevelopment.ymlに下記のように定義して

```lang:config/settings/development.yml
company: 'my compnay'
server:
  url: 'http://myserver'
```

下記のように呼び出して使用することが可能。

```
puts Settings.company
puts Settings.server[:url]
```


[参考]
http://qiita.com/yumiyon/items/32c6afb5e2e5b7ff369e
https://blog.hello-world.jp.net/ruby/2268/
goでズンドコゲッター

#概要
paizaのgoでズンドコゲッターやってみた。
#実際
https://paiza.io/projects/1RO1z5aeQYpCX8zoZU-gDw
#サンプルコード
```
package main
import (
	"fmt"
	"io/ioutil"
    "net/http"
)
func zundoko() string {
    link := "http://ohijs0.paas.jp-e1.cloudn-service.com/zundoko"
    client := &http.Client{}
    response, err := client.Get(link)
    if err != nil {
        fmt.Println(err)
    }
    defer response.Body.Close()
    content, err := ioutil.ReadAll(response.Body)
    if err != nil {
        fmt.Println(err)
    }
    return string(content)
}
func main() {
    i := 0
    z := ""
    for true {
        z = zundoko()
        if z == "ドコ" {
            fmt.Print("ドコ　")
            if i == 4 {
                break
            }
            i = 0
        } else {
            fmt.Print("ズン　")
            i = i + 1
        }
    }
    fmt.Println("キ・ヨ・シ！")
}

```
凄くシンプルにバナー広告をローテーションする(コピペで使える)


ベタ張り広告のバナーパターンが2種類あって、それをローテで出したい。

Rails(viewはhaml)に実装しようと思っていて、特にインスタントに試したいときに使う。
未来永劫使うのであればちゃんと作ろう。

あくまでもローテーションを、ささっと試したいに特化しています。


# Javascriptで実装します。

rails(haml)内に直接Javascriptを入れる形で。


```rails(haml)
:javascript
  jmp = new Array();
  img = new Array();
  // ジャンプ先のアドレス(数字は画像と対応)
  jmp[0] = "[飛び先1]";
  jmp[1] = "[飛び先2]";
  // 画像のアドレス(数字はジャンプ先のアドレスと対応)
  img[0] = "#{asset_path '[画像ファイル]'}";
  img[1] = "#{asset_path '[画像ファイル]'}";
  n = Math.floor(Math.random()*jmp.length);
      document.write("<a href='"+jmp[n]+"'  target=\"_blank\">");
      document.write("<img src='"+img[n]+"' border='0'>");
      document.write("</a>");
```

```具体例
:javascript
  jmp = new Array();
  img = new Array();
  // ジャンプ先のアドレス(数字は画像と対応)
  jmp[0] = "http://www.google.co.jp";
  jmp[1] = "http://www.yahoo.co.jp";
  // 画像のアドレス(数字はジャンプ先のアドレスと対応)
  img[0] = "#{asset_path 'ad1.jpg'}";
  img[1] = "#{asset_path 'ad2.jpg'}";
  n = Math.floor(Math.random()*jmp.length);
      document.write("<a href='"+jmp[n]+"'  target=\"_blank\">");
      document.write("<img src='"+img[n]+"' border='0'>");
      document.write("</a>");
```

Javascriptをチョイスしたのは、既存のウェブページに入れる時等に問題になりづらいから。
コピペで使えます。


## 解説：ポイントは画像ファイルのパス

バナーのファイルパス を assets:precompile したときに得られる成果物は、

```rails3
/assets/images/ad1.jpg
/assets/images/ad1-XXXXXXXXXXX.jpg
```
と、どっちでもいけたけど、

```rails4
/assets/images/ad1-XXXXXXXXXXX.jpg
```
rails4からは乱数がついた(=precompileされたパス)しか使えなくなった。
precompileをしたときにXXXXXXXXXXXの部分は何が付与されるかわからないのでハードコーディングは無理。


なので、画像のパスを書く時に

```rails4
asset_path 'ad1-XXXXXXXXXXX.jpg'
```
と、枕詞を書くとよろしいでしょう。

なので、

```rails(haml)
〜中略〜
  img[0] = "#{asset_path 'ad1.jpg'}";
  img[1] = "#{asset_path 'ad2.jpg'}";
〜中略〜
```
と、なるわけでございます。
ビルド時にエラー発生 Problem: failed to create task or type copyfiles

```java:build-error
BookStore\nbproject\build-impl.xml:1009: Problem: failed to create task or type copyfiles
Cause: The name is undefined.
Action: Check the spelling.
Action: Check that any custom tasks/types have been declared.
```

ビルド時に上記のようなエラーが出た場合は、build-impl.xmlに何かの拍子で不要なCopy Taskが追加されている。そのCopy Taskを削除すると正常にビルドが実行されるようになる。

```xml:修正前のbuild-impl.xmlの該当部分
    <target depends="init" name="library-inclusion-in-archive" unless="dist.ear.dir">
        <copyfiles files="${libs.primefaces.classpath}" todir="${build.web.dir}//"/>
        <copyfiles files="${libs.javaee-api-7.0.classpath}" todir="${build.web.dir}//"/>
    </target>

```

```xml:修正後のbuild-impl.xmlの該当部分
    <target depends="init" name="library-inclusion-in-archive" unless="dist.ear.dir">
        
    </target>

```


##追記
そもそもの原因はCopy Taskが追加されることではなく、libs.primefaces.classpath で指定された primefaces.jar が指定のディレクトリに無いことが原因らしい。その primefaces.jar はNetBeansによって追加されるのでこういう現象は起こらないはず。何かのバグだろうか？
OSXでxamarinを使うにはyosemite以降必須な件

Marverics以前をお使いの人は気をつけてください :cold_sweat: 
また、osxのアップデートだけしても今度はxcodeのバージョンが古いままなのでこれも最新への入れ替えが必要。


#現象
インストールはすぐに終わる

![スクリーンショット 2016-05-30 15.31.58.jpg](https://qiita-image-store.s3.amazonaws.com/0/110257/fd290725-cb2c-2f50-9150-16dec91dfccb.jpeg)

が、、！！動かそうとするとエラーになる！！
![CjgYOUHVEAEYO_J.jpg](https://qiita-image-store.s3.amazonaws.com/0/110257/5caf2d29-b13f-16c6-b530-af429d53023c.jpeg)


ちなみに[公式](https://developer.xamarin.com/guides/cross-platform/getting_started/requirements/#mac)にもきちんと書かれてました :droplet: 

mac　xamarinで検索しても以外とでてこない情報だったので載せておきます
MySQL 接続テスト (CodeigniterのXserverに対する設定を含める)


XserverにてCodeigniter設置時、確認の必要にかられて作成。



```php
  $url = "mysqlxxxx.xserver.jp"; 	//mysqlサーバー名
  $user = "xxxxxx_wp1";				//ユーザーID
  $pass = "xxxxxxxx"; 				//パスワード
  $db = "xxxxxx_wp1"; 				//データベース名

  $mysqli = new mysqli($url, $user, $pass, $db);
  
  // 接続状況チェック
  // mysqli_connect_errno : 直近の接続コールに関するエラーコードを返す
  if(mysqli_connect_errno()){　　// 直近のエラー内容を文字列で返す
    die('Error: 接続失敗'.mysqli_connect_error());
  }

var_dump('Good!: 接続成功');
```

まぁ、結果PHP上からは上手くいくがCIからは失敗orz
⇓
わかりずらっ(；´Д｀)

```php:Codeigniter/database.php
$db['default'] = array(
  'dsn' => '',
  'hostname' => 'mysqlxxxx.xserver.jp',
  'username' => 'username_xxxxxx_wp1',
  'password' => 'xxxxxxxx',
  'database' => 'username_xxxxxx_wp1',
  'dbdriver' => 'mysqli',
  'dbprefix' => '',
  'pconnect' => FALSE,
  'db_debug' => (ENVIRONMENT !== 'production'),
  'cache_on' => FALSE,
  'cachedir' => '',
  'char_set' => 'utf8',
  'dbcollat' => 'utf8_general_ci',
  'swap_pre' => '',
  'encrypt' => FALSE,
  'compress' => FALSE,
  'stricton' => FALSE,
  'failover' => array(),
  'save_queries' => TRUE
);

```

prefixの捉え方が間違ってたみたい。

```php:間違い.php
  'username' => 'username_xxxxxx_wp1',
  'database' => 'xxxxxx_wp1',
  'dbprefix' => 'username_',
```
⇓

```php:正解.php
  'username' => 'username_xxxxxx_wp1',
  'database' => 'username_xxxxxx_wp1',
  'dbprefix' => '',
```

```php:Codeigniter/autoload.php
$autoload['libraries'] = array('database');
```
星でレーティング評価のinput要素を作る

![star.jpg](https://qiita-image-store.s3.amazonaws.com/0/62931/ccb089bc-d711-7ec7-9a44-d25c1c146424.jpeg)


1. レーティング表示させる領域を`<div class="range-group">`とします。
1. その中に、iレーティングinput要素`input[type=range]`を追加します。
2. `input[type=range]`をcssでデザインするのは難しいので、cssで`display:none;`にします。
3. jqueryで、星を表示させる為の`a`要素を、`<div class="range-group">`の子要素として追加します。
4. 星がクリックされたら、何番目の星がクリックされたかを判定し、`input[type=range]`のvalue属性に設定します。

```html:html
<div class="range-group">
	<input type="range" min="1" max="5" value="" class="input-range" />  
</div>
```

```css:css
.input-range {
  display: none;
}
.range-group {
  position: relative;
}
.range-group > a {
  display: inline-block;
  width: 20px;
  height: 20px;
}
.range-group > a:before {
  content: "\f3ae";
  font-family: "Ionicons";
  font-size: 20px;
  color: #aaa;
}
.range-group > a.on:before {
  content: "\f2fc";
  color: #fc3;
}
```
```javascript:jquery
$(function() {
  $('.range-group').each(function() {
    for (var i = 0; i < 5; i ++) {
      $(this).append('<a>');
    }
  }); 
  $('.range-group>a').on('click', function() {
     var index = $(this).index();
    $(this).siblings().removeClass('on');
     for (var i = 0; i < index; i++) {
        $(this).parent().find('a').eq(i).addClass('on'); 
     }
    $(this).parent().find('.input-range').attr('value', index);
  });
});
```
Android StudioでLombokを使う

# 動作環境
Android Studio 2.1.1
# 手順
1. メニューからFile→Settings...→Plugins→Browse repositories... とクリックする。
2. 「lombok」で検索し、「Lombok Plugin」を選択する。
3. 「Install」ボタンをクリックしてインストールする。
4. Android Studioを再起動する
5. build.gradle(Module: app)のdependenciesブロック内に以下を記述

```build.gradle
provided 'org.projectlombok:lombok:1.12.6'
```
※バージョン番号（上記1.12.6）が正しいか[Lombok公式サイト](https://projectlombok.org/setup/android.html)で確認すること

6. Javaコード内で「@Getter」や「@Setter」を記述し、エラーが出ないことを確認する。

```hoge.java
package com.example.foo.bar;

import lombok.Getter;

@Getter
public class Greeting {
    private String id;
    private String content;
}
```
Android Kotlin HttpURLConnection Postできなくて困った話


あち
> HttpURLConnectionを使用してHTTP通信を行う
http://techbooster.jpn.org/andriod/application/6812/

こち
> AndroidでPOSTリクエストを送付する（HttpURLConnection利用
http://qiita.com/kaikusakari/items/b1dd02803bb16956010a

に例が共有されているので楽勝だー、、と思っていたら予想外にハマったので共有


# ×な例
これだと接続されません。
なんでどぅわーー！


```Main.kt
val task = object : AsyncTask<Void, Void, Void>() {
    override fun doInBackground(vararg params: Void): Void? {
        var con: HttpURLConnection? = null
        try {
            val urlStr = "http://hogehoge.jp/hoge"
            val param = "hoge=foo"
            val url = URL(urlStr)
            con = url.openConnection() as HttpURLConnection
            con.requestMethod = "POST"
            con.instanceFollowRedirects = false
            con.doOutput = true
            con.connect()       // これでつながるんじゃないの？？

            val os = con.outputStream
            val ps = PrintStream(os)
            ps.print(param)
            ps.close()
        } catch (e: InterruptedException) {
        } finally {
            con?.disconnect()
        }

        return null
    }
}
task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR)
```



# ○な例

```Main.kt
val task = object : AsyncTask<Void, Void, Void>() {
    override fun doInBackground(vararg params: Void): Void? {
        var con: HttpURLConnection? = null
        try {
            val urlStr = "http://hogehoge.jp/hoge"
            val param = "hoge=foo"
            val url = URL(urlStr)
            con = url.openConnection() as HttpURLConnection
            con.requestMethod = "POST"
            con.instanceFollowRedirects = false
            con.doOutput = true
            con.connect()       // これでつながるんじゃないの？？

            val os = con.outputStream
            val ps = PrintStream(os)
            ps.print(param)
            ps.close()

            val responseCode = con.responseCode //ここで接続される
        } catch (e: InterruptedException) {
        } finally {
            con?.disconnect()
        }

        return null
    }
}
task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR)

```

というわけで投げっぱなしで良いとしても投げっぱなしはダメで、レスポンスを取得しないと接続されませんでした。
そういう仕様なんでしょうか？
情報持っている方いればプリーズ。


ちなみにAsyncTask#executeOnExecutorを使っているのは、executeだと複数のAsyncTaskがシングルスレッドで実行されるため、処理待ちでいつまで経っても実行順番が回ってこない事があるため。
AWS KMSのつかいかたメモ

```rb:enc-dec.rb
#!/usr/bin/env ruby

require 'aws-sdk'
require 'base64'

kms = Aws::KMS::Client.new(region: 'ap-northeast-1')

original = ARGV[0]
p "original = #{original}"

enc = kms.encrypt(key_id: 'alias/keyid', plaintext: original)
b64 = Base64.encode64(enc.ciphertext_blob)
p "encrypted = #{b64}"

dec = kms.decrypt(ciphertext_blob: Base64.decode64(b64))
plt = dec.plaintext
p "decrypted = #{plt}"
```

適切なIAMロールを付けたインスタンス上で実行

```shell-session
uraura@rosemary$ ./enc-dec.rb 123
"original = 123"
"encrypted = CiAp/x8z6BKqf6hq1uQ6JgnExample5Ozut87kS1Rr+4khKKAQEBAgB4Kf8f\nM+gSqn+oatbkExamplePSzjuTs7rfO5EtUa/uJIAAABhMF8GCSqGSIb3DQEH\nBqBSMFExamplewYJKoZIhvcNAQcBMB4GCWCGSAFlAwQBLjExampleTR5W1pt\nVBI9OpcCARCAHjh9hTHbUCqgNfhSj7HFYekExampleXI7+OaPUIaxw==\n"
"decrypted = 123"
```
Webサイトチェックツールまとめ

## dead-link-checker.com
![](http://viral-community.com/wp-content/uploads/2014/04/dead-link-check-tool-1.png)
http://www.dead-link-checker.com/ja/

特徴：サイト全体のリンクをチェックしてくれる。ローディングが長い

## Alt & Meta viewer
![Alt & Meta viewer](http://www.forest.impress.co.jp/img/wf/docs/718/516/image2_s.jpg)
https://chrome.google.com/webstore/detail/alt-meta-viewer/jjcjblcbnjhgjlnclhficglfjedhpjhl/

特徴：Chromeの拡張ツール。Web上にaltとmeta情報を表示することができる。チェックは1ページごと

## HTML Coding Checker
![](http://bashalog.c-brains.jp//images/150430_fujimori_06.png)
https://chrome.google.com/webstore/detail/html-coding-checker%EF%BC%88%CE%B2%E7%89%88%EF%BC%89/pjpdbehajmbnicjjdfclnenlcnnmgbog?hl=ja

特徴：Chromeの拡張ツール。リンクチェック、metaやaltのチェック、カンプとのなどができる。チェックは1ページごと

## Selenium
![](https://qiita-image-store.s3.amazonaws.com/0/5616/50c44142-52e7-d528-b8bd-da8b6abdcdbe.png)

http://www.seleniumhq.org/

特徴：主にFirfoxを通じてブラウザチェックを自動化できる。案件数が多いフロントオンリーの方には設定がめんどくさいかもしれない

<!-- 
## PerfectPixel by WellDoneCode
![](http://cdn.liginc.co.jp/wp-content/uploads/2014/11/d_tools_c.png)
https://chrome.google.com/webstore/detail/perfectpixel-by-welldonec/dkaagdgjmgdmbnecmcefdhjekcoceebi/related

特徴：Chromeの拡張ツール。デザイン画像とコーディングされたサイトを比較できる
-->
.bashrcでechoしてるとrsyncでshell not clean って怒られる時の対処

`echo`でどのファイルを読み込んだとか、aliasとかを`.bashrc`に書いたりしてると`rsync`が "is your shell clean?"と姑みたいな事を聞いてくるので、対話ログインじゃなければ`.bashrc`を読み込まないようにしときましょう。

```.bash
# If not running interactively, don't do anything
case $- in
    *i*) ;;
      *) return;;
esac
```

### 参考

http://www.ceus-now.com/rsync-seems-incompatible-with-bashrc-causes-is-your-shell-clean/
Oracle RDBMS に JSONデータを格納する

JSON within the Oracle Database

JSON形式のデータをOracle Database で扱うサンプル

- Oracle Database 12c (12.1.0.2)では JSON形式のデータを
  CLOB, BLOB,VARCHAR2 のデータ型に格納可能
 (格納サイズやアプリケーションによって選択）
- JSON形式のチェック制約が追加

例）JSON格納表の作成
CREATE TABLE JSON (doc CLOB CONSTRAINT valid_json CHECK (doc IS JSON));


JSON形式データの挿入
- Insert文で格納可能
INSERT INTO JSON VALUES (
   '{
      "firstName": "Gerald",
      "lastName": "Venzl",
      "location": {
        "country": "UK",
        "city": "London",
        "postCode": "EC2M"
      }
    }');
commit;

- チェック制約違反の例
INSERT INTO JSON VALUES ('Invalid Json');
INSERT INTO JSON VALUES ('Invalid Json')
*
ERROR at line 1:
ORA-02290: check constraint (TEST.VALID_JSON) violated Retrieving JSON data 


JSON形式で格納されたデータの検索
<table alias>.<JSON column>.<JSON property>.<JSON property> の形式で指定が可能
（大文字/小文字の区別があるので注意）

- 検索した例）
SELECT j.doc.firstName, j.doc.location.city FROM JSON j;

FIRSTNAME   LOCATION
---------   --------
Gerald      London

- 表示列名の制御は２つのパターンがある
a) JSON_TABLE関数を使用
b) AS 句でエイリアスを指定
例） SELECT j.doc.firstName as "First Name", j.doc.location.city as "City" FROM JSON j; 

別の例として JSONデータを格納
（前回とちがって postcode 属性は なしで、middleName属性を持っている）
 INSERT INTO JSON VALUES (
   '{
      "firstName": "Dominic",
      "middleName": "Patrick",
      "lastName": "Giles",
      "location": {
        "country": "UK",
        "city": "London"
      }
    }');
commit;

- middleName属性の検索例
SELECT j.doc.firstName, j.doc.middleName, j.doc.lastName FROM JSON j;

FIRSTNAME   MIDDLENAME   LASTNAME
---------   ----------   --------
Gerald                   Venzl
Dominic     Patrick      Giles

１行目のデータにはmiddleName属性値はないが検索はエラーとならずに
NULLとして返してくれる
属性が追加/削除されてもデータの変更なしでアプリ側で必要なデータのみ
アクセスすることが可能

SELECT j.doc.lastName,
           j.doc.location.city as "CITY",
           j.doc.location.postCode as "POST CODE"
      FROM JSON j;

LASTNAME   CITY     POST CODE
--------   ------   ---------
Venzl      London   EC2M
Giles      London

https://blogs.oracle.com/developer/entry/series_json_within_the_oracle
ホームページを作る時にSEOを最適化する。

## SEOについて

SEOは日々変動しているので一概に正解とは言えませんが、サイトを作成する上でまずはGoogleからエラーをもらわないようにしたいよね。という意図から以下を記載していますのでご理解ください。

# SEO とは検索エンジン最適化のことです。
略(Search Engine Optimization : サーチ・エンジン・オプティマイゼーション)

・要はGoogleとかで検索した時に検索結果が出てくると思うけど、
それをできるだけ上位に表示させるようにすること。

・検索にヒットさせるために良いサイト、閲覧者にとって有益なサイトだとgoogleさんに思わせることです。


# 色々必要なことはあるけれど、以下だけ気をつけてやっていければ大丈夫だと思います。


1. 必ず、title,description,keyword,h1が被らないようにする。（最悪先頭の部分だけでも違えば大丈夫だけれど、あまりよろしくないのでできるだけユニークな文章の方が良い。）

2. title, description,h1は極力ページ内の文言が含まれるようにする。
3. title, h1は３０文字程度、descriptionは６０文字程度９０文字以内
4. keywordsは３、４個がベスト
5. title, descriptionm h1の文言が絶対に被らないようにすること！
6. title,description,keyword,h1 は、そのページのキーワードが文章の先頭に来るようにする
7. 全く同じ内容のページが複数あるのはよろしくありません。(コピーサイトだと思われる）
たとえそれが同じホームページ内であってもページの複製はgoogleからスパム行為だと思われます。そんな時は一方にはno-indexを入れたり、してindexしなくていいよと伝えるのが良いでしょう。

これをヘッドタグにいれればOKです。
```<meta name="robots" content="nofollow">```




6の例：「ブラウン」というホームページで、ページのキーワードが「不動産」の場合

```
title: 不動産業界をより良くするブラウン
description: 不動産管理会社の皆様、空室率でお困りですか？ブラウンならそんな空室のお悩みを解決します！
keywords: 不動産, 空室率, ブラウン
```
一例ですがこんな感じかと思います。
psqlコマンドとsqlコマンドについて(違いも含む)　※自分用メモ

参考サイト
http://ja.stackoverflow.com/questions/25215/psql%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%81%A8sql%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6/25220#25220


**本文と回答よく読むこと！！**

参考サイト
https://teratail.com/questions/36175?whotofollow
非技術職のITリテラシー勉強会 00

#導入
　現代社会は「情報化社会」になりつつある、全くITに携わらない職種がむしろ「絶滅危惧種」になっている。しかし、IT技術の運用については、一般の学校教育はほとんど触る機会がない。それでIT技術についての学習は上司、先輩の行動をそばで覚えるか、検索エンジンで検索するかのがほとんど。
　仕事で勉強した知識は偏りがあり、しかも上司、先輩により勉強の効率はかなり差が出る。検索エンジンでの勉強は、情報が錯綜するため、効率は本人の空き時間とやる気に頼る。

#シリーズ一覧
|No.|記事|キーワード|
|:-----------|------------:|------------:|
|非技術職のITリテラシー勉強会 01|[非技術職のITリテラシー勉強会 00 (本記事)](https://qiita.com/jerrywdlee/items/2f512ec1a3b8cfe5a2b5)|コンピューターの構成|
|非技術職のITリテラシー勉強会 01|[非技術職のITリテラシー勉強会 01](https://qiita.com/jerrywdlee/items/15c1a163260a03cc7e76)|Webページの構成|
|非技術職のITリテラシー勉強会 01|[非技術職のITリテラシー勉強会 02](http://qiita.com/jerrywdlee/items/96efa42b35e9c9f72c91)|JavaScriptとは|
|非技術職のITリテラシー勉強会 02|[非技術職のITリテラシー勉強会 03](http://qiita.com/jerrywdlee/items/eb95d6bad4695dc7ba2a)|関数と変数|
|非技術職のITリテラシー勉強会 03|未定||

#コンピュータの基本
##コンピュータの構成

![Desctop screenshot.png](https://qiita-image-store.s3.amazonaws.com/0/87438/7b0b8a13-b9d2-bf15-6136-1241380ce432.png)

##メモリ等の単位
* K(キロ)  = 1000   = 千
* M(メガ)  = 1000*K = 百万
* G(ギガ)  = 1000*M = 十億　
* T(テラ)  = 1000*T = 一兆
* P(ペタ)  = 1000*P = 千兆

ただし、各単位は1000倍関係か1024倍関係かはその場によって違う

#Webシステム
##システムの処理形態
###集中か、分散か？
* 集中処理：大型の高性能コンピュータ(サーバー)一台が全ての処理を賄う
* 分散処理：性能のやや劣ったコンピュータをネットワークで繋いで、処理を行う

###一括か、リアルタイムか
* バッチ(一括)処理：特定の業務を特定のタイミングで一括処理
* リアルタイム処理：業務が来た都度、即座で処理を行う


<!-- コメント　
イーサネットとトックンリンク
POP3、Http、Ftp
アカウントシェアの弊害
-->
【MySQL】基礎。InnoDBのbuffer poolはページ単位（列ではなく）でキャッシュする

> 更新が多いテーブルはなるべくカラムを絞って InnoDB の buffer pool に乗るようにする

[ゲームエンジニアのためのデータベース設計 - SlideShare](http://www.slideshare.net/sairoutine/ss-62485460)

この論理の裏付けがイマイチわからなかったので調べた。
つまり、この言葉の裏には「buffer poolは行単位でキャッシュ管理している」という前提が存在するはず。

### バッファープール

結論から言うとバッファープールは「複数行を保持できるページに分割」され、「ページのリンクリストとして実装」される。

> テーブルとインデックスの両方のキャッシュされた InnoDB データを保持するメモリー領域。大容量読み取り操作の効率を高めるため、バッファープールは複数行を保持できるページに分割されます。キャッシュ管理の効率のために、バッファープールはページのリンクリストとして実装されます。まれにしか使用されないデータは、LRU アルゴリズムのバリエーションを使用してキャッシュからエージアウトされます。大容量メモリーを備えたシステムでは、バッファープールを複数のバッファープールインスタンスに分割することにより、並列性を改善できます。

[MySQL :: MySQL 5.6 リファレンスマニュアル :: MySQL 用語集](https://dev.mysql.com/doc/refman/5.6/ja/glossary.html#glos_buffer_pool)

### 内部の詳細

実装はもう少し複雑で、buffer poolは内部でさらに2つに分けられている。
ざっくり書くと、「新しめの領域」「古めの領域（全体の3/8のメモリ量が割り当てられる）」がそれで、LRU戦略によって削除されるデータは後者から選ぶ。

[MySQL :: MySQL 5.6 リファレンスマニュアル :: 8.9.1 InnoDB バッファープール](https://dev.mysql.com/doc/refman/5.6/ja/innodb-buffer-pool.html)

### ということは…

![employee table image](http://1.bp.blogspot.com/-H3VWHNyH8tA/ThgZU_tpFLI/AAAAAAAAAHc/fOpfgBCUMKM/s1600/Employees.png)

```sql
SELECT Name,Dept FROM Employees WHERE Id = 3;
```
上記のようなクエリを投げた際でも`Name = "Todd",Dept = "IT"`だけキャッシュされるのではなく、1行分まるまる（ページの一部として）キャッシュにのる。というイメージだろう
（間違っていたらツッコミ欲しい）

（そもそもPRIMARY条件なので実際にはINDEX参照だけで足りそうだが今回は無視）

### その他参考

> SELECT のとき
> バッファプール見る。あればそれを使う なければテーブルスペースファイルを読んで バッファプールに載せる
> INSERT, UPDATE, DELETE のとき
> バッファプールに書く。バッファプールに空きがなければ、古いページを押し出してから書く DELETE でさえも書く。 その後、ログファイルに書く

* [基本に戻ってInnoDBの話をします - SlideShare](http://www.slideshare.net/yoku0825/inno-db-28755870)
ActiveRecordでpostgresqlのjson typeのバリデーションを行う

ActiveRecordは4.2以降でPostgreSQLのJSON型をサポートしています。

```rb
# == Schema Information
#
# Table name: hoges
#
#  id       :integer          not null, primary key
#  name     :string
#  options  :json
#

class Hoge < ActiveRecord::Base
end
```

このHogeモデルの`options`にJSON形式の文字列を渡すと正しく保存されるのですが、もしJSON形式でない文字列が渡ると、値にnilが設定されただけで何もエラーが起きませんでした。

バリデーションをしようにも、不正なJSON文字列を渡した時点で既に`nil`になってしまうため、困ってしまいました。
pryを使って調べたところ、不正なJSON文字列は、`options_before_type_cast`という属性に保存されていました。今回はこれを使って、`JsonTypeValidator`を作ってみました。

## JsonTypeValidatorの定義

```rb:lib/validators/json_type_validator.rb
class JsonTypeValidator < ActiveModel::EachValidator

  def initialize(options)
    options.reverse_merge!(:message => :invalid)
    super(options)
  end

  def validate_each(record, attribute, value)
    value = record.try(:"#{attribute}_before_type_cast")
    value = value.strip if value.is_a?(String)
    return true if value.blank?
    if value.is_a? String
      ActiveSupport::JSON.decode(value)
    else
      true
    end
  rescue JSON::ParserError => exception
    record.errors.add(attribute, options[:message], exception_message: exception.message)
  end
end
```

指定された`attribute`に該当する`before_type_cast`の値を取得し、それが文字列であれば、`JSON.decode`を実行しています。パースに失敗したらエラーの原因を`exception_message`に渡しています。基本的には、エラーメッセージは`:invalid`で不正なデータとして扱っています。

## 使い方

`config/application.rb`で読み込むように設定します。

```rb:config/application.rb
config.autoload_paths += %W(#{config.root}/lib/validators)
```

次に、Modelに定義します。

```
# == Schema Information
#
# Table name: hoges
#
#  id       :integer          not null, primary key
#  name     :string
#  options  :json
#

class Hoge < ActiveRecord::Base
  validates :options, json_type: true
end
```

これで、不正なJSON文字列が渡った場合はエラーになるようになりました。

## gistで公開しています

今回のコードはgistでも公開しています。
https://gist.github.com/patorash/8f79c1dc9e271132a2152808b1bce477

また、以下のURLを参考にしました。
このURLは、カラムが文字列型でJSONを保存する場合の方法だったので、カラムの型がJSON型の場合はうまくいきませんでしたが、とても参考になりました。

参考にしたURL:
- http://stackoverflow.com/questions/6594257/how-to-validate-if-a-string-is-json-in-a-rails-model
- https://gist.github.com/joost/7ee5fbcc40e377369351
Swiftで固いアルバムのようなアニメーションを作る

iOSでのデフォルトのページビューはぺらぺらの紙のようなアニメーションですが、固いアニメーションをつくる方法を紹介します
#まずはデモ
![a.mov-compressor.gif](https://qiita-image-store.s3.amazonaws.com/0/32586/205d493a-cc53-fdd6-fe6f-fb55bec93810.gif)

#つくり方
基本的には、CATransform3DRotateを使ってLayerを回転させていきます
座標空間は図のようになっているため、今回はy軸を中心に回転させます
<img width="235" alt="スクリーンショット 2016-05-30 11.54.34.png" src="https://qiita-image-store.s3.amazonaws.com/0/32586/4961ee0f-d246-34b6-fb07-d4226bdd1d05.png">

```
view.layer.transform = CATransform3DRotate(transform2, CGFloat(M_PI), 0, 1, 0)
```

このままだと、下図のようにViewの中心で回転してしまい、片開きの本に見えなくなってしまいます
<img width="204" alt="スクリーンショット 2016-05-30 12.00.18.png" src="https://qiita-image-store.s3.amazonaws.com/0/32586/4b41cfd2-aabc-d650-7a29-baf77159afee.png">

左端を中心に回転させるには
```
 view.layer.anchorPoint = CGPoint(x:0, y:0.5)
```
を設定します。この設定を入れると、水平方向にViewの幅の1/2分右にずれて表示されるため、X軸に`CATransform3DTranslate(CATransform3DIdentity, -width/2, 0, 0)`をあらかじめ設定し修正します。

transformを設定した状態で、UIView.Animationを使い`CATransform3DRotate(transform2, CGFloat(M_PI), 0, 1, 0)`を使って回転させると、移動と回転が同時に起きてしまい、綺麗なアニメーションになりません。

<img width="413" alt="スクリーンショット 2016-05-30 12.08.55.png" src="https://qiita-image-store.s3.amazonaws.com/0/32586/bcc2e609-05b5-71e9-ebbe-b6044a222167.png">

対策として、ビューを入れ子にし、外側のビューをx軸で-width/2分offsetさせます。ここまでのコードで裏面のない、固いアニメーションは動くはずです。

#裏面を作る方法
あらかじめ、`CATransform3DRotate(CATransform3DIdentity, CGFloat(M_PI), 0, 1, 0)`として裏返すことで裏面を作ることができますが、この場合は、アンカーポイントが`CGPoint(x:0, y:0.5)`である必要があるため、さらに入れ子にします。

<img width="669" alt="スクリーンショット 2016-05-30 12.18.06.png" src="https://qiita-image-store.s3.amazonaws.com/0/32586/e456d8c4-792c-1acd-30f8-fcdef69b8271.png">
赤枠のビューをあらかじめ、裏返し、緑枠のビューをアニメーションさせることで裏面を作ることができますが、表面が裏返った時にも表示されてしまいます。裏返った時に自動的に非表示にするには、表面に対して`View?.layer.doubleSided = false`を指定します。

#カメラとの距離

Y軸回転させた場合、3D的な意味でのカメラは正面から撮影しますが、この時のViewとカメラの距離は
`transform.mc34`で設定します。3000を小さくすると近づき、大きくすると遠ざかります。
この値は微調整しながら、お好みの数字にしてください。
回転させる時のコードは下記のようになります。

```
 var transform = CATransform3DIdentity
 transform.m34 = 1/3000
 transform = CATransform3DRotate(transform, -CGFloat(M_PI), 0, 1, 0)
```
#まとめ
ビューの構造と初期値
<img width="570" alt="スクリーンショット 2016-05-30 12.28.49.png" src="https://qiita-image-store.s3.amazonaws.com/0/32586/4dd4d029-9973-42bf-8817-b63f5fd50b89.png">

緑のビューのアニメーションコード

```
UIView.animateWithDuration(0.8, animations: {
            var transform = CATransform3DIdentity
            transform.m34 = 1/3000
            transform = CATransform3DRotate(transform, -CGFloat(M_PI), 0, 1, 0)
            self.faceView?.layer.transform = transform

            var transform2 = CATransform3DIdentity
            transform2.m34 = 1/3000
            transform2 = CATransform3DRotate(transform2, CGFloat(M_PI), 0, 1, 0)
            self.backView?.layer.transform = transform2

        })
```
jqueryのattrとprop（とdataとvalとhtmlとかつまり属性とかの取得）の使い分け一覧

# 最初に

* `attr`と`prop`の使い分けがわからないと言われたので、誰でも使い分けができるようになる一覧を作りました。

* 基本的にはpropで取得できるものは`prop`で、そうじゃないものは`attr`で、と思っていたのですが、`data-*`や`value`までそれで取得していたので、思ったよりもが根が深いなと思った次第です。

#（追記）data属性に対する扱いについて

`data-*`属性には、用途が2種類あります。

* HTML5としてのカスタム属性（とそれを利用した関連技術）
* jQueryの`data()`メソッドのための初期値

前者はそれを利用した有名どころではBootstrap（TwitterBootstrap）がなどがありますが、
CSSの属性セレクタとしても使えるので、別にBootstrapに限った話ではなく、普通に使用している人もいるかと思います。

問題は後者の方で、ここで「初期値」と書いたり、追記前の記事で「取得しようとしているのは」と前置きしたことの理由にもなるのですが、`data()`ではgetで`attribute`から読みだすことはできても、setで`attribute`に対して変更することはできません。また、`attribute`から読みだすのも最初の1回のみです。

そのため、`data-*`だからと言って何でもかんでも`data()`で読みだしていると、動的な変更に追従できず、また、getができるんだからsetも`data()`でいいんだな、と思うと、HTML5としてのカスタム属性の動作に期待している場合は、期待通りの動作になりません。

# 判断一覧


## 取得しようとしているのは`data-*`ではありませんか？

### それはHTMLのカスタム属性として使用している属性ですか？

* `attr()`を使用してください。**getもsetもです。**
* 参照専用であればgetだけ`data()`を使うこともできますが、止めた方が良いです。なぜなら必要なのはattributeだからです。

### それはHTMLのカスタム属性として使用してない属性ですか？

* `data()`を使用してください。

## 取得しようとしているのは`class`ではありませんか？

* `hasClass()`で事足りませんか？
* その後やりたいことによっては`add/removeClass()`の方が適しているかもしれません。

## 特定クラス名がセットされているか、ではなく、クラス名そのものが欲しい場合は？

* そんな文字列を`class`で賄おうとするその思考を考え直してください。
* `data-xxx`で別属性として定義してください。

## 取得しようとしているのはvalueではありませんか？

* `val()`を使用してください。

## textareaに入力された値が必要ですか？

* その場合も`val()`を使用してください。
* タグの中だからって`text()`や`html()`を使う必要はありません。

## checkboxやradiobuttonがチェックされているかどうかを知りたいですか？

* `prop('checked')`を使ってください。`attr()`で`"checked"`と比較するのはギルティーです。

## checkboxやradiobuttonをチェックしたいor外したいですか？

* `prop('checked', true|false)`を使ってください。`attr()`や、ましてや`removeAttr()`などは論外です。

## disabledかどうかを知りたいですか？

* `prop('disabled')`を使ってください。`attr()`で`"disabled"`と比較するのはギルティーです。

## disabledにしたいor外したいですか？

* `prop('disabled', true|false)`を使ってください。`attr()`や、ましてや`removeAttr()`などは論外です。


## aタグにおけるhrefや、imgにおけるsrc等のアドレスのパスについて、
### 絶対パスが必要ですか？

* `prop()`を使ってください。

### 相対パスが必要ですか？

* `attr()`を使ってください。
* ただし、htmlに絶対パスとして記述されている場合は絶対パスになります。

## 上記以外の属性を取得したい

### それはHTML標準の属性ですか？

* `prop()`を使ってください。

### それはHTML標準ではない、勝手に命名した属性ですか？

* ~~`attr()`を使ってください。~~
* `data-xxxx`とした上で、`data()`を使ってください。


# そもそも

なんで、`attr`で`properties`を操作するサンプルコードが巷にあふれているかというと、昔はできたというか、昔は`attr`しか無かった（`propメソッド`が**存在しなかった**）んじゃよ、と思うjqueryおじさんであった。

昔々...
`prop`が実装されたのは`1.6`からで、それまでは`attribute`と`properties`はjquery上で明確に分かれてはいませんでした。
そのため、当時は皆`properties`を操作するためにも`attr`を使っていたのですが、やはり分けないとまずかろうということで、`1.6.0`リリースによって、`prop`が実装され、`attribute`と`properties`は明確に区別されるようになりました。ところが、`attr`で`properties`をどうのこうのしていた（するしかなかった）**巷にあふれる大半のソースは最新のjqueryでは正しく動作しなくなり大きな混乱を招いた結果**、後方互換を持った`1.6.1`がリリースされ、それからしばらくは`attr`で`disabled`等の設定を変更できました。

完全にできなくなったのは`1.9`からでした。
そのため、1.9より以前に書かれた説明では`attr`で`properties`を操作しているコードがあります。
それは当時では間違いではなかった、という話です。
乱暴な話、view（html）を自前で用意するのであれば、今では`attr`を使わなければいけない個所は1つもないはずです。
[Linux][開発] GNU GLOBALとvimで快適な開発環境を手に入れる

これまでソースコードを読む時に複数の端末を用意して、grepして定義を探したりしていたのですが、大きなコードになると検索量も多くなって嫌になってたところ、「GNU GLOBALを使うと幸せになれる」と聞いたので試しに使ってみました

# 準備: GNU GLOBALのインストール

以下の公式サイトから[Download]を開き、Source archiveにある最新のソースコードをダウンロードします

https://www.gnu.org/software/global/

この記事では、6.5.4 のバージョンを使用しています。また、システムを自由に変更できない環境を想定して、make installを行わない手順となっています。必要に応じて適宜読み替えてください

ダウンロードした圧縮ファイルを解凍し、configure と make を実行します

<pre>
$ tar xvf global-6.5.4.tar.gz
$ cd global-6.5.4
$ ./configure
$ make
</pre>

コンパイルした global と gtags をホームディレクトリに作成した bin ディレクトリにコピーします

<pre>
$ mkdir -p ~/bin
$ cp global/global ~/bin
$ cp gtags/gtags ~/bin
</pre>
※ GNU GLOBALをシステムにインストールしても構わないのであれば、コピーする代わりに make install を実行してください

vimのプラグインを ~/.vim/plugin にコピーします

<pre>
$ mkdir -p ~/.vim/plugin
$ cp gtags.vim ~/.vim/plugin
</pre>

~/.vimrc にgtagsの設定を追加します

```
map <C-h> :Gtags -f %<CR>
map <C-j> :GtagsCursor<CR>
map <C-n> :cn<CR>
map <C-p> :cp<CR>
```

# 準備: ソースコードを解析する

解析したいソースコードのディレクトリに入り、gtagsコマンドを実行します。"-v"オプションは処理中のメッセージを表示するためのものです

```
$ gtags -v
```

GPATH、GRTAGS、GTAGS という3つのファイルが作成され、これらのファイルにコードの解析結果が入っています。ソースコードに修正が入った場合は、再度gtagsコマンドを実行して解析しなおす必要があります

## 補足: バージョン管理を行っている場合

git や subversion などでバージョン管理を行っている場合、gtagsで作成された解析結果を間違ってcommitしないように注意しましょう。ignoreの条件(除外リスト)に入れておくのが良いかもしれません

gitの場合は .gitignore 、subversionの場合は .svnignore に以下を追加します
<pre>
GPATH
GRTAGS
GTAGS
</pre>

subversionの場合は加えて、条件を適用するために以下のコマンドを実行します (gitは .gitignore に追加するだけでよい)

```
$ svn propset svn:ignore -R -F .svnignore .
```

# globalコマンドの使い方

globalコマンドで主に次の事が行えます。また、各コマンドで "-x" オプションを付けるとヒットした場所の詳細(ファイル名と行数、行の内容)が表示されるようになります

## 関数が定義されているソースを調べる

### コマンド

```
global ${関数名}
```

### 実行例

<pre>
$ global Init_ext
dmyext.c
</pre>

## ソースの中に定義されている関数を調べる

### コマンド

```
global -f ${ソースファイル}
```

実行例

<pre>
$ global -f main.c
RUBY_EXPORT        12 main.c           #undef RUBY_EXPORT
main               23 main.c           main(int argc, char **argv)
</pre>

## 関数が呼び出されているソースを調べる

### コマンド

```
global -r ${関数名}
```

### 実行例

<pre>
$ global -r Init_ext
internal.h
nacl/pepper_main.c
ruby.c
</pre>

## grepして指定したキーワードが入っているソースを探す

### コマンド

```
global -g ${条件}
```

### 実行例

<pre>
$ global -g win32
dir.c
ext/fiddle/function.c
ext/fiddle/libffi-3.2.1/src/dlmalloc.c
ext/fiddle/libffi-3.2.1/src/x86/ffi.c
ext/fiddle/libffi-3.2.1/src/x86/win32.S
ext/io/console/console.c
ext/nkf/nkf-utf8/nkf.h
ext/tk/tcltklib.c
ext/win32ole/win32ole.c
ext/win32ole/win32ole.h
      : (略) :
</pre>

普通にgrepかけた時とは違い、ファイル名のみが出力されます

# vimエディタとの連携

上の準備の手順で、vimのプラグインを入れた状態で、ソースコードをvimで開いて以下の操作をします

## ソースコードの関数一覧

Ctrl + h を押すと、下部にそのソースの関数が表示されます

Ctrl + n でリストのカーソルを下に移動します
Ctrl + p でリストのカーソルを上に移動します

## カーソル位置の関数にジャンプ

調べたい関数にカーソルを合わせ Ctrl + j を押すと、その関数の中にジャンプします

ジャンプする前の位置に戻るには Ctrl + o を押します


調べると、他にも色々な使い方があるようですが、ここでは基本的な使い方までで留めておきます
めざせpythonライブラリマスター （２）vincenty

#【ライブラリ説明】
　2つの地点の距離を求める（直線距離かな？）
　1mm以内の正確さで求められるらしい

#【準備】
　求めたい2地点の座標を取得します。
　ここでは東京駅と大阪駅の距離を求めてみます。
　google mapで「東京駅」「大阪駅」をそれぞれ検索するとURLにそれぞれ
　　35.6813023,139.7640582
　　34.7024898,135.4937619
　という数字が@の後ろに記載されているので、それをコピーします。
　おそらく緯度、経度でしょう。

#【プログラム】
```py:vincenty.py
# -*- coding: utf-8 -*-

from vincenty import vincenty

tokyo_sta = (35.6813023, 139.7640582)
osaka_sta = (34.7024898, 135.4937619)

# 距離の単位はメートル
print vincenty(tokyo_sta, osaka_sta)
# 距離の単位にマイル指定
print vincenty(tokyo_sta, osaka_sta, miles=True)
```

#【結果】
　403.751385
　250.879402

#【感想】
　何に使えそうかな？('_')

#【参考サイト】
　[vincenty](https://pypi.python.org/pypi/vincenty/0.1.4)
　[github](https://github.com/maurycyp/vincenty)
GoogleAppEngineでFlaskアプリケーションをとりあえず動かすまで

GAEでFlaskのアプリケーションを動かす手順メモ。
正直勉強し始めたばかりなのでなにかバカやらかしてるかもしれないので指摘をよろしくおねがいします…。
# GoogleAppEngineとは
[Wikipedia](https://ja.wikipedia.org/wiki/Google_App_Engine)によると
>Google App Engine (GAE) は、Googleの提供するサービスの1つであり、ウェブアプリケーションをPHP・Python・Java・Go言語を使用して開発し、Googleのインフラストラクチャー上で実行し、バージョン管理することができる。Google Cloud Platformの一部。

とのこと。まぁよく分からないけどとってもすごい楽なサーバー。

# Flaskとは
FlaskはPythonのWebフレームワーク。djangoとかと違って、必要最低限の機能しか持ち合わせていないことからmicroframeworkなんて呼ばれていたりするらしい。ちょこっとWebアプリを開発したいときにうってつけ。
詳しくは[このへん](http://a2c.bitbucket.org/flask/index.html)をご覧ください。

# GAEでとりあえず動かすまで
## 使用環境
使用した環境はUbuntu14.04、Python2.7.6です。ちなみにUbuntuは今回ConohaのVPS上で稼働しているものを使用しました。

ここに書く方法で他のLinuxでも対応できると思いますが、Pythonは2.7.x系が必須です。

## 1.SDKを落とす
Python用のSDKをGoogleから落とします。リンクは[ここ](https://cloud.google.com/appengine/downloads?hl=ja#Google_App_Engine_SDK_for_Python)に。

Linux/OtherPlatformsの`google_appengine_1.9.38.zip`（執筆時点）のリンクをコピって
```bash
wget https://storage.googleapis.com/appengine-sdks/featured/google_appengine_1.9.38.zip
```
とかやってあげればいいと思います。
落としてきたzipはunzipあたりで展開して任意のディレクトリに移動してあげてください。
## 2.Pathを通す
1で落として展開したgoogle_appengineのディレクトリにpathを通しておくとのちのち楽です。`vim ~/.bash_profile`とかしてあげて、
```bash
export PATH=$PATH:/usr/local/bin/google_appengine
```
とか書いて保存した後に`sorce ~/.bash_profile`とかでOKです。

## 3.テストプロジェクトをcloneする
自分でイチから書いてもいいんですけど、今回は動かすところがゴールってことで[GoogleCloudPlatformのGithub](https://github.com/GoogleCloudPlatform)からサンプルをcloneしましょう。gitが入ってない方はgit入れておいてもらって、
```bash
git clone https://github.com/GoogleCloudPlatform/appengine-flask-skeleton.git
```
で落とせるかと思います。

## 4.実行する
テスト用のサーバーは、SDKのdev_appserver.pyですので、実行したいときは
```bash
dev_appserver.py /path/to/project
```
みたいな感じになります。(path/to/projectはプロジェクトのディレクトリまでのパスであって、main.pyとかではないことに注意。)

ちなみにVPSとかで実行している場合は上のコマンドではブラウザから見ることができないので
```bash
dev_appserver.py --host 0.0.0.0 /path/to/project
```
としてあげてから`http://example.com:8080`へアクセスしてみてください。

### エラーがでるとき
もしかしたらライブラリが足りないのかもしれません。その場合は、
```bash
pip install -r requirements.txt -t lib
```
としてあげてから実行するといいと思います。
Microsoft Azure + Ubuntu 14.04LTS + PredictionIO (1)

機械学習エンジン PredictionIO を試したくて環境を作ってみたので、自分用のメモとして記録しておきます。
あくまで自分の環境下なので、細かな違いは適宜読み替えてください。

(1) 環境作成・機械学習エンジンの準備 < ここ
(2) データの投入・学習環境の準備
(3) 学習結果の確認

#環境作成
Java / MySQL を使うので、先に環境を作っておきます。
その後、PredictionIO の環境を作る流れになります。

##Java
Azureのデフォルトではjdkがインストールされていないので、インストールしておきます。
インストール直後は openjdk-7 が対象だけど、今回は openjdk-8 を使います。

```
$ sudo add-apt-repository ppa:openjdk-r/ppa
$ sudo apt-get update
$ sudo apt-get install openjdk-8-jdk
```

##MySQL
MySQLは標準では5.5がインストールされるが、5.6以降がおすすめです。
mysql-apt-config のバージョンはMySQLのWEBサイトで調べて最新版を使います。

```
$ wget http://dev.mysql.com/get/mysql-apt-config_0.3.3-2ubuntu14.04_all.deb
$ sudo dpkg -i mysql-apt-config_0.3.3-2ubuntu14.04_all.deb
$ sudo apt-get update
$ sudo apt-get install mysql-server
$ mysql -uroot -p(rootパスワード)
mysql> create table pio;
mysql> grant all on pio.* to pio@'%' identified by '(パスワード)';
mysql> exit;
```
dpkgを実行すると、環境選択画面が表示されるので、Server > mysql-5.6 > Apply の順に選択。
(mysql-5.7-dmr も表示される。こちらはベータリリース。[2016/05/28現在])
mysql上での実行で、データベース名/ID/パスワード は任意に設定可能。
デフォルト(pio/pio/pio)から変更した場合は、設定内容を　PredictionIO インストール後に設定ファイルに反映させる必要があります。

##[PredictionIO](https://prediction.io/)
PredictionIOのページを参考に。

```
$ bash -c "$(curl -s https://install.prediction.io/install.sh)"
```
インストール中に入力を求められるので、
データベース: MYSQL
OS: Debian/Ubuntu
を選択。
インストールは少し時間がかかるけど待ちましょう。
完了すると、.bashrcに自動でパス設定が追記されるので、sourceで読み込んでおきます。

```
$ source ~/.bashrc
```

#機械学習エンジンの準備

##PredictionIOサーバーの実行
バックグラウンド実行しておきます。

```
$ pio eventserver &
```
実行後はステータスを確認して、動作を確認しておきます。

```
$ pio status
```
`Your system is all ready to go.`と表示されていれば大丈夫です。

##テンプレートの導入

テンプレート：[http://templates.prediction.io/](http://templates.prediction.io/)
機械学習用のテンプレートがすでに用意されているので、こちらから探して利用します。

```
$ pio template get PredictionIO/template-scala-parallel-recommendation 新エンジン名
$ cd 新エンジン名
```
導入したテンプレートを利用してアプリを登録します。
テンプレートを導入する際に以下のエラーがでたらjdk インストール時にSSL関連のリンクがおかしくなっているので修復しましょう。
*java.security.InvalidAlgorithmParameterException: the trustAnchors parameter must be non-empty*

```
$ sudo update-ca-certificates -f
```

##アプリの準備
アプrを準備する際、予め access-key を用意しておかないと処理が止まるようなので、別途 access-key を作っておきましょう。適当な長さ(32文字くらい？）のランダムな文字列で大丈夫なようです。

```
$ pio app new アプリ名 --access-key 作っておいたaccess-key
$ pio app list
```
データ投入をするために PythonSDK が必要なので、導入します。

```
$ pip install predictionio
```

##データ投入

Microsoft Azure + Ubuntu 14.04LTS + PredictionIO (2) へ続く。
AWS SDK for Go の CloudWatch を使ってみる


## AWS SDK for Go

[AWS SDK for GoのCloudWatchドキュメント]
(https://docs.aws.amazon.com/sdk-for-go/api/service/cloudwatch/CloudWatch.html#GetMetricStatistics-instance_method)
にあるサンプルコードをコピペしてもママでは動かなかったので、その時の修正メモ。

> go1.6 darwin/amd64 and the latest AWS GO SDK tagged as v1.1.31

## AWS CloudWatchの設定

EC2インスタンスを一つ起動し、CloudWatchから以下の設定をしておいてください。

* メトリックス CPUUtilization


![Screen Shot 2016-05-29 at 9.52.12 PM.png](https://qiita-image-store.s3.amazonaws.com/0/75231/fe3af162-1b85-ec1a-738f-405629e5aa48.png)

## コードです

```go:charge.go
package main

import (
	"fmt"
	"github.com/aws/aws-sdk-go/service/cloudwatch"
	"time"
	"github.com/aws/aws-sdk-go/aws"
	"github.com/aws/aws-sdk-go/aws/session"
)

func main() {

	svc := cloudwatch.New(session.New(), &aws.Config{Region: aws.String("us-east-1")})

	params := &cloudwatch.GetMetricStatisticsInput{
		EndTime:    aws.Time(time.Now()),     // Required
		MetricName: aws.String("CPUUtilization"), // Required
		Namespace:  aws.String("AWS/EC2"),  // Required
		Period:     aws.Int64(60),             // Required
		StartTime:  aws.Time(time.Now().Add(time.Duration(24) * time.Hour * -1)),
		Statistics: []*string{ // Required
			aws.String(cloudwatch.StatisticMaximum), // Required
			// More values...
		},
		Dimensions: []*cloudwatch.Dimension{
			{ // Required
				Name:  aws.String("InstanceId"),  // Required
				Value: aws.String("i-4b8f48d7"), // Required
			},
			// More values...
		},
		Unit: aws.String(cloudwatch.StandardUnitPercent),
	}

	resp, err := svc.GetMetricStatistics(params)

	if err != nil {
		// Print the error, cast err to awserr.Error to get the Code and
		// Message from an error.
		fmt.Println(err.Error())
		return
	}

	// Pretty-print the response data.
	fmt.Println(resp)

}
```

## 実行結果

![Screen Shot 2016-05-30 at 9.41.33 AM.png](https://qiita-image-store.s3.amazonaws.com/0/75231/c4da4124-3e33-3ed7-2ded-db233b76db76.png)


AWSコマンドならこんな感じ

```bash
aws cloudwatch get-metric-statistics --metric-name CPUUtilization --start-time 2016-05-29T23:18:00 --end-time 2016-05-30T23:18:00 --period 60 --namespace AWS/EC2 --statistics Maximum --dimensions Name=InstanceId,Value=i-4b8f48d7
```

## 説明

[GetMetricStatisticsInput タイプのプロパティ]
(https://docs.aws.amazon.com/sdk-for-go/api/service/cloudwatch.html#type-GetMetricStatisticsInput)を以下のように指定します。

| プロパティ | 説明 |
|:-----------|:------------|
| StartTime | 取得するデータの開始日(時間) |
| EndTime | 取得するデータの終了日(時間) |
| MetricName | メトリックス。例ではCPUの使用率。|
| Namespace | 例ではEC2インスタンス |
|Unit| データの単位。例ではパーセント|
|Dimensions|サンプリング対象のEC2インスタンスID|
|Period|サンプリングの粒度。例では６０秒ごとに丸める。|
| Statistics | Periodで指定した期間のデータをどのように集約するか。例では最大値。|

[プロパティの詳細はアマゾンのマニュアル]
(http://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/DeveloperGuide/cloudwatch_concepts.html)をご覧ください。
yumでPHP5.6をインストール


```bash
$ sudo rpm -Uvh http://ftp.iij.ad.jp/pub/linux/fedora/epel/6/x86_64/epel-release-6-8.noarch.rpm
$ sudo rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-6.rpm
$ sudo yum install --enablerepo=remi-php56 --disablerepo=base,updates php php-opcache php-devel php-mbstring php-mcrypt php-mysqlnd php-phpunit-PHPUnit php-pecl-xdebug php-pecl-xhprof
```

disableを指定しないとちゃんと5.6が入らなかったりする

```
$ ls /etc/httpd/modules/libphp*
/etc/httpd/modules/libphp56-php5.so
```

apacheの設定。 `/etc/httpd/conf/httpd.conf` に以下を追記

```
LoadModule php5_module modules/libphp56-php5.so
```

おわり