OmniAICreator/Qiita-1.07M huggingface dataset:
Elmでやってみようシリーズ1

[elm](http://elm-lang.org/)でやってみるシリーズ1: ●を動かす。

```haskell
import Window

pos : Signal Int
pos =let f = \tmp -> (tmp `mod` 30) - 10
        in f <~ foldp (\it acc-> acc + 1) 0 (fps 50)

drawCircle : Float -> Float -> Form
drawCircle x y = move (x,y) <| filled red (circle 20)

drawMatrix : [Form]
drawMatrix = map (\x -> drawLine <| x*10) [-10..10]

drawLine : Float -> Form
drawLine x = traced (solid blue) ( segment (x,-100) (x,100) )

main : Signal Element
main=let f = \w h p-> collage w h ([drawCircle ((toFloat p)*10) 10]++drawMatrix)
     in f <~ Window.width ~ Window.height ~ pos

```

<iframe width="100%" src="http://share-elm.com/sprout/53c8a01ee4b07afa6f983053/stable/view">
</iframe>
# 実行する

[こちら](http://share-elm.com/sprout/53c8a01ee4b07afa6f983053/stable/view)で実行できます。

# 感想

- foldpは好き。
- inputに対応するSignalってグローバル変数じゃね?まあ「マウスがクリックされる」とか「時間が経過する」という事実はグローバルなんだが、それによって引き起こされるイベントもそうなる…。プログラムからその値を能動的に制御できないから変数とは呼べない…のかな。でもユーザがフィールドに値を入力したり、ラジオボタンをクリックしたり、という操作によって設定項目をリアクティブに変更したその結果の、Signalである設定項目って、どう見てもグローバル変数だよね。まだよくわからない。

# 関連エントリ
- http://uehaj.hatenablog.com/entry/2014/07/03/023808
Google Drive for Work と Google Apps Unlimitedの違いについて

# 名称について
Google Drive for Work という呼称はGoogleのマーケティング施策の一環でつけられた名称。
「Google Apps Unlimited」 が本サービスの SKU（型番） 名です。


#違い
## Google Apps for Business

Google Apps Vault ： 無し
容量制限：有り

## Google Apps Unlimited

Google Apps Vault ： 有り
容量制限：無し（5 ユーザー未満の場合はユーザーあたり 1 TB）
縦横無尽に駆け回るvim(移動の話)

# これは一番最初に覚えます

キー|動作
---+---
h|←
j|↓
k|↑
l|→

# ここら辺は初級レベルです。

キー|動作
---+---
w|単語の先頭へ進む
b|単語の先頭へ戻る
0|行の先頭へ
$|行の末尾へ
\<CR\>|次行にある最初の非空白文字へ
\<C-f\>|次ページへ
\<C-b\>|前ページへ
gg|文書の先頭行へ(最初の非空白文字)
G|文書の最終行へ(最初の非空白文字)
I|行内最初の非空白文字でインサートモードとなる
A|行末でインサートモードとなる
*|カーソル下の単語を後方検索
\#|カーソル下の単語を前方検索
n|検索を進める
N|検索を戻る
%|括弧間の移動

`*`や`#`は単語検索となるので部分一致で検索したい場合は`/[keyword]`としよう。
> Ex:ススメを`*`で検索してもヤマノススメは検索に引っかからない。

## オススメの設定

```vim:vimrc
" matchit {{{
source $VIMRUNTIME/macros/matchit.vim
let b:match_ignorecase = 1
" }}}
nmap <Tab> %
vmap <Tab> %
```

`if`/`end`なども`%`で移動できるようになる`matchit`の読み込みです。
個人的に`%`が押しづらいため`<Tab>`にも割り当ています。

# 中級

キー|動作
---+---
\<C-d\>|半ページ次へ
\<C-u\>|半ページ前へ
'{a-zA-Z}|m{a-zA-Z}でマークしたポジションへジャンプ
gi|最後に編集した位置でインサートモードとなる
ge|単語の末尾へ
W|単語の先頭へ進む(_:.などで繋がっているものも単語と見なす*1)
B|単語の先頭に戻る(*1)
E|単語の末尾へ(*1)
gE|単語の末尾に戻る(*1)
f{*}|行の末尾に向かってキーを検索
F{*}|行の先頭に向かってキーを検索
t{*}|行の末尾に向かってキーを検索(カーソルが検索文字の手前*2)
T{*}|行の先頭に向かってキーを検索(*2)
;|先頭に向かって繰り返して検索
,|末尾に向かって繰り返して検索
\<C-o\>|ジャンプした部分に戻る
\<C-i\>|ジャンプした部分に戻る
g;|変更履歴に戻る
g,|変更履歴に進む

半ページ次へとか半ページ前へはあまり使ってないけど...
`g,`は私の設定上[qfixhowm](https://github.com/fuenor/qfixhowm)と競合していて使えないです。
というより変更履歴は[gundo](https://github.com/sjl/gundo.vim)を使うので必要ないです。
`f`や`t`はこの後述する`EasyMotion`がNOTります。

# プラグインを使う

```vim:.vimrc
NeoBundle 'Lokaltog/vim-easymotion'
" vim-easymotion {{{
let g:EasyMotion_do_mapping = 0
nmap s <Plug>(easymotion-s2)
xmap s <Plug>(easymotion-s2)
omap z <Plug>(easymotion-s2)
nmap g/ <Plug>(easymotion-sn)
xmap g/ <Plug>(easymotion-sn)
omap g/ <Plug>(easymotion-tn)
let g:EasyMotion_smartcase = 1
map <Leader>j <Plug>(easymotion-j)
map <Leader>k <Plug>(easymotion-k)
let g:EasyMotion_startofline = 0
let g:EasyMotion_keys = 'QZASDFGHJKL;'
let g:EasyMotion_use_upper = 1
let g:EasyMotion_enter_jump_first = 1
let g:EasyMotion_space_jump_first = 1
hi EasyMotionTarget guifg=#80a0ff ctermfg=81
" }}}
```

例によって`NeoBundle`を使います。
`EasyMotion_keys`は自分の押しやすいキーを指定します。
私がホームポジションあたり(+qz)しか自信がないことが露呈しましたww
`EasyMotion_keys`のキーが少ない場合、移動先の候補が多数あると２文字打たなければいけなかったりします。
個人的に打ち間違えて変なとこにジャンプしてイラッとするよりはいいかなと思います。
`hi`ハイライトを変えている部分は何も設定しないと蛍光赤みたいな色だったので非常に見づらいため変えています。
なお`hi`は`colorscheme`より後に書く必要があるようです。

## ちなみに動作はこんな感じ

![easymotion1.gif](https://qiita-image-store.s3.amazonaws.com/0/38647/3bd1887c-3139-85a2-d720-8a63c557bd7c.gif)

s[AnyKey][AnyKey][EasyMotion_key]\([EasyMotion_key]\)

![easymotion2.gif](https://qiita-image-store.s3.amazonaws.com/0/38647/8fdb31d8-0159-4db9-897b-ddb63276fc5a.gif)

g/[Keyword][EasyMotion_key]\([EasyMotion_key]\)

`EasyMotion_key`は`<CR>`や`<Space>`を押すと最寄りの検索語にジャンプします。
画面内の移動は移動したいところの２文字を見て、`s`[key][key]と打ち、表示された[EasyMotion_key]でジャンプします。
また`g/`は[Keyword]を打っている間に検索で引っかかった単語の位置にジャンプするため、うろ覚えでも明確に検索できるので便利です。

# まとめ

最終的に`EasyMotion`が最高すぎます。
初級編を覚えておけばvimライフで困ることはあまりないと思います。
上級がないのは仕様です。
なお赤が見づらいのは私が軽く色盲だからです。麻雀の赤ドラもたまに黒く見えます。
CoreOS で cAdvisor を試してみた

https://github.com/google/cadvisor
Analyzes resource usage and performance characteristics of running containers.

```ruby:Vagrantfile
VAGRANTFILE_API_VERSION = "2"

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  config.vm.define "cadvisor"

  config.vm.box = "yungsang/coreos-alpha"

  config.vm.network :forwarded_port, guest: 2375, host: 2375

  config.vm.network :forwarded_port, guest: 8080, host: 8080

  config.vm.provision :docker do |d|
    d.run "cadvisor",
      image: "google/cadvisor",
      args: "-v /var/run:/var/run:rw -v /sys/fs/cgroup/:/sys/fs/cgroup:ro -v /var/lib/docker/:/var/lib/docker:ro -p 8080:8080"
  end

  config.vm.network :forwarded_port, guest: 8081, host: 8081

  config.vm.provision :docker do |d|
    d.run "hello-world",
      image: "yungsang/busybox",
      args: "-p 8081:8080",
      cmd: "nc -p 8080 -l -l -e echo hello world!"
  end
end
```

```
$ vagrant up
$ open http://localhost:8080
```

![](http://37.media.tumblr.com/bd90ea937acca460a02d188f2f8e59e5/tumblr_n8w5shc8zL1qz4hvyo1_1280.png)
暇だからGCEインスタンスで世界旅行

# なんとなく・・・
gsutilのlistzonesコマンド実行したらzoneが７つあったんで・・・moveinstancesコマンドで世界旅行に行ってきます。listzonesコマンドで表示されるzone順で旅をします。

`$ gcutil listzones
+----------------+--------+-------------------------------+
| name           | status | next-maintenance              |
+----------------+--------+-------------------------------+
| asia-east1-a   | UP     | None scheduled                |
+----------------+--------+-------------------------------+
| asia-east1-b   | UP     | None scheduled                |
+----------------+--------+-------------------------------+
| europe-west1-a | UP     | 2014-08-15T12:00:00.000-07:00 |
+----------------+--------+-------------------------------+
| europe-west1-b | UP     | None scheduled                |
+----------------+--------+-------------------------------+
| us-central1-a  | UP     | None scheduled                |
+----------------+--------+-------------------------------+
| us-central1-b  | UP     | None scheduled                |
+----------------+--------+-------------------------------+
| us-central1-f  | UP     | None scheduled                |
+----------------+--------+-------------------------------+`

# 旅の支度
まずは支度をします。スタートは台湾です。
`$ gcutil addinstance travel --zone=asia-east1-a`

# アジア旅行
-移動手段
`$ time gcutil moveinstances --source_zone=asia-east1-a --destination_zone=asia-east1-b travel`
-移動時間
`real	2m51.861s
user	0m0.936s
sys	0m0.329s`

# アジア→ヨーロッパ間移動
-移動手段
`$ time gcutil moveinstances --source_zone=asia-east1-b --destination_zone=europe-west1-a travel`
-移動時間
`real	3m10.157s
user	0m0.969s
sys	0m0.376s`

# ヨーロッパ旅行
-移動手段
`$ time gcutil moveinstances --source_zone=europe-west1-a --destination_zone=europe-west1-b travel`
-移動時間
`real	2m28.262s
user	0m0.934s
sys	0m0.302s`

# ヨーロッパ→アメリカ間移動
-移動手段
`$ time gcutil moveinstances --source_zone=europe-west1-b --destination_zone=us-central1-a travel`
-移動時間
`real	2m40.895s
user	0m1.051s
sys	0m0.391s`

# アメリカ旅行
-移動手段(1)
`$ time gcutil moveinstances --source_zone=us-central1-a --destination_zone=us-central1-b travel`
-移動時間(1)
`real	3m48.060s
user	0m0.991s
sys	0m0.356s`

-移動手段(2)
`$ time gcutil moveinstances --source_zone=us-central1-b --destination_zone=us-central1-f travel`
-移動時間(2)
`real	2m43.992s
user	0m1.176s
sys	0m0.432s`

# アメリカ→台湾(出発地点)
-移動手段
`$ time gcutil moveinstances --source_zone=us-central1-f --destination_zone=asia-east1-a travel`
-移動時間
`real	2m40.353s
user	0m1.030s
sys	0m0.371s`

# 帰ってきました
-どんな旅でしたか？
`あっという間でした。20分くらいです。`

-つらかったことは？
`us-central1-aとus-central1-b間の移動が大変でした。やけに時間がかかりました。もう一度移動したらまた違う結果になるとは思います。`


以上です。
gitでリモートブランチをcheckout


コードレビューを行ったり、他の人の作業を動作確認するときに、gitのリモートレポジトリのbブランチを持ってくるときに今までこんなことをやっていました。

```bash:
$ git checkout -b branch_name origin/branch_name
```

これがけっこうめんどくさくてなんかないかなーと思ってたら、ありました！

```bash:
$ git checkout -t origin/branch_name 
```

これだと、ブランチ名は一回入力するだけでオッケーです！これでgit生活捗ります。

[参考サイト](http://qa.atmarkit.co.jp/q/19)
GCEインスタンスにPersistent Diskを割り当てる手順


(1)まずはインスタンス作成
`$ gcutil addinstance myinstance --zone=us-central1-a`

(2)次にディスク作成
インスタンスと同一zoneに作る。デフォルトサイズは500GB。
`$ gcutil adddisk mydisk  —size_gb=500 --zone=us-central1-a`

(3)インスタンスにディスクをAttachする
`$ gcutil attachdisk --disk=mydisk --zone=us-central1-a myinstance`

(4)作ったインスタンスにSSH接続
`$ gcutil ssh myinstance`

(5)ディスク使用量調べる
現状はこんな感じです。
`$ df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda1       9.9G  1.1G  8.3G  12% /
tmpfs           296M     0  296M   0% /dev/shm`

(6)割り当てるディレクトリ作成
`$ sudo mkdir /mydisk`

(7)Attachされたディスクがちゃんとあるか確認
`$ ls -l /dev/disk/by-id/google-*
lrwxrwxrwx. 1 root root  9  7月 18 02:56 2014 /dev/disk/by-id/google-mydisk -> ../../sdb
lrwxrwxrwx. 1 root root  9  7月 18 02:46 2014 /dev/disk/by-id/google-myinstance -> ../../sda
lrwxrwxrwx. 1 root root 10  7月 18 02:46 2014 /dev/disk/by-id/google-myinstance-part1 -> ../../sda1`

(8)フォーマット＆マウントをしてみる
`$ sudo /usr/share/google/safe_format_and_mount -m "mkfs.ext4 -F" /dev/sdb /mydisk`

(9)もう一度df -h
`$ df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda1       9.9G  1.1G  8.3G  12% /
tmpfs           296M     0  296M   0% /dev/shm
/dev/sdb        493G  198M  467G   1% /mydisk`

無事割り当てられたっぽいです。
シェアするURLまとめ

メモ。

#Facebook
`http://www.facebook.com/sharer.php?u=【URL】`
デモ：[QiitaをFacebookでシェア](http://www.facebook.com/sharer.php?u=http://qiita.com/)

## シェアをチェック ※要ログイン
https://developers.facebook.com/tools/debug/?locale=ja_JP

#Twitter
`https://x.com/share?url=【URL】`
デモ：[QiitaをTweet](https://x.com/share?url=http://qiita.com/)

##　タグ付きでシェア
`https://x.com/share?url=【URL】&hashtags=【タグ】`
デモ：[Qiitaをタグ付きでTweet](https://x.com/share?url=http://qiita.com/&hashtags=qiita)

##フォローする
`https://twitter.com/intent/follow?screen_name=【ユーザID】`
デモ：[QiitaをTwitterでフォロー](https://twitter.com/intent/follow?screen_name=qiita)

## シェアをチェック ※要ログイン
https://cards-dev.twitter.com/validator

#Google+
<del>`https://plus.google.com/share?url=【URL】`
デモ：[QiitaをGoogle+でシェア](https://plus.google.com/share?url=http://qiita.com/)</del>
なくなったので削除

#LINE
`https://social-plugins.line.me/lineit/share?url=【URL】`
デモ：[QiitaをLINEでシェア](https://social-plugins.line.me/lineit/share?url=https://qiita.com)

## シェアをチェック
https://poker.line.naver.jp/

#Youtube　チャンネル登録をする
`http://www.youtube.com/channel/【ID】?sub_confirmation=1`

デモ：[Platina Jazzをチャンネル登録](http://www.youtube.com/channel/UCTKiZj1VBXI6K4fGWzfISqg?sub_confirmation=1)

※チャンネルのIDはURLの`https://www.youtube.com/channel/【ID】`

# はてブ
`http://b.hatena.ne.jp/add?mode=confirm&url=【URL】&title=【タイトル】`
デモ：[はてブ](http://b.hatena.ne.jp/add?mode=confirm&url=https://qiita.com&title=Qiita)

# note
`https://note.mu/intent/post?url=【URL】`
デモ：[note](https://note.mu/intent/post?url=https://qiita.com)

参考：
https://webdesign-trends.net/entry/3632
https://kmgt-system.work/2019/05/30/note-button/
AmazonAppstore対応時のまとめ

#【目次】
　０．概要
　１．アプリへのリンク
　まだ、これだけ

# 【０．概要】
　自分が、GoogelPlayStore用のアプリをAmazonAppstore用に対応させた際の、
　対応個所などをまとめて行こうかと思っています。

　　Amazonスマホ【Fire Phone】も発表されたことですし＾＾
　　・[POSTS TAGGED FIRE PHONE](http://japanese.engadget.com/tag/fire+phone/)
　　・[Amazonスマホ「Fire Phone」発表、Amazonは何を狙う？](http://ascii.jp/elem/000/000/907/907538/)
　　・[無双！ Fire Phone発表に見るAmazonの強さ (1/3)](http://www.atmarkit.co.jp/ait/articles/1407/04/news017.html)
　　・[アマゾン初のスマホFire Phone、ついに発表されました](http://www.gizmodo.jp/2014/06/fire_phone.html)


# 【１．アプリへのリンク】
  **「Links to Google Play.」** と、
　GooglePlayにリンクしてるから駄目よって言われた場合の対応です。

## スマホから
　パッケージ名を利用して
　GoolgePlayStoreページへ飛ばすには、下記の様に書いていますが～。
　（※getPackageName()部分に、任意のパッケージ名を設定。）

```java:スマホからGoolgePlayStoreへ
	// GooglePlayStore
	Uri uri = Uri.parse("market://details?id=" + getPackageName());
	Intent intent = new Intent(Intent.ACTION_VIEW, uri);
	startActivity(intent);
```

　AmazonAppstoreに対応する場合は、下記こんな感じ。
　 **「market://details?id=」⇒ 「amzn://apps/android?p=」** に変更するだけ。

```java:スマホからAmazonAppstoreへ
	// AmazonAppstore
	Uri uri = Uri.parse("amzn://apps/android?p=" + getPackageName());
	Intent intent = new Intent(Intent.ACTION_VIEW, uri);
	startActivity(intent);
```

[Amazonの参考ページ](https://developer.amazon.com/public/ja/apis/earn/in-app-purchasing/docs/deeplink)

## ※補足としてブラウザから
　ブラウザから（PCから）の場合、短縮URLだと飛ばない罠。
　（端末にインストール済みのブラウザからも飛ばない。）

　なので、ブラウザからの場合、「http://～」を使う。

```java:ブラウザからGoolgePlayStoreへ
	// GooglePlayStore
	Uri uri = Uri.parse("http://play.google.com/store/apps/details?id=" + getPackageName());
	Intent intent = new Intent(Intent.ACTION_VIEW, uri);
	startActivity(intent);
```

　AmazonAppstoreに対応する場合は、

```java:ブラウザからAmazonAppstoreへ
	// AmazonAppStore
	Uri uri = Uri.parse("http://www.amazon.co.jp/gp/mas/dl/android?p=" + getPackageName());
	Intent intent = new Intent(Intent.ACTION_VIEW, uri);
	startActivity(intent);
```

　　という事で、下記のリンク開くかな～実験。

　　[amzn://apps/android?p=jp.gr.java_conf.KateroseAndroid.amz.mbr.u0006.v001](amzn://apps/android?p=jp.gr.java_conf.KateroseAndroid.amz.mbr.u0006.v001)

　　[http://www.amazon.co.jp/gp/mas/dl/android?p=jp.gr.java_conf.KateroseAndroid.amz.mbr.u0006.v001](http://www.amazon.co.jp/gp/mas/dl/android?p=jp.gr.java_conf.KateroseAndroid.amz.mbr.u0006.v001)
自作Ansibleモジュールをライブラリ化するときのディレクトリ構成

[Best Practices — Ansible Documentation](http://docs.ansible.com/playbooks_best_practices.html#bundling-ansible-modules-with-playbooks "Best Practices — Ansible Documentation")によると、Ansibleモジュールを自作した場合、`./library/`以下に置けば自動でロードされる様です。しかし、自動でロードされるのは一階層下までとなります。

```bash
./library/
├── my_module # ロードされる
└── hoge/
    ├── my_module # ロードされる
    └── fuga/
        └── my_module # ロードされない
```

つまり、自作モジュールをライブラリ化するときは、以下のようなディレクトリ構成にするとよさそうです。

```bash
my_ansible_modules/
├── README.md
├── LICENSE
├── module1
├── module2
└── test/
    ├── units/
    └── integration/
        ├── inventory.ini
        ├── library -> ../../ # プロジェクトルートへのシンボリックリンク
        ├── roles/
        │   ├── test_module1/
        │   │   └── tasks/
        │   │       └── main.yml
        │   └── test_module2/
        │       └── tasks/
        │           └── main.yml
        └── site.yml
```

こうしておけば、使用する側は外部ライブラリを`./library/`以下に置くだけで利用できます。

```bash
./
├── library/
│   └── my_ansible_modules/
├── inventory.ini
└── site.yml
```

```yaml:site.yml
---
- hosts: all
  tasks:
    - module1: option1=value1 option2=value2
    - module2: option3=value3 option4=value4
```
CentOS (RHEL Redhat Enterprise Linux) にProxyの設定をする（http,https）

# CentOS (RHEL) にProxyの設定をするには（http,https）

#### /etc/profile を開く
    # vi /etc/profile

#### 以下の行を追記
    PROXY='proxy.server.path:8080' # proxyサーバのドメインとポートを指定
    export http_proxy=$PROXY
    export HTTP_PROXY=$PROXY
    export https_proxy=$PROXY
    export HTTPS_PROXY=$PROXY

#### ファイルを保存し以下を実行して設定を反映
    # source /etc/profile

# もしくは
`/etc/profile`に追加せずに、`/etc/profile.d/proxy.sh`などのファイルを作成してその中に上記のproxy設定を記述するのも良いと思います。（私はこちら派）
Bundlerを捨ててBowerを入れよう

Bundlerを捨てようは嘘です。
フロント周りをBowerで管理しようってだけです

Why?
``` bundle update ```かけるたびにjsもupdateされて壊れるから

ということでフロントの管理はbowerに移しました。

導入方法はこちら http://yosuke-furukawa.hatenablog.com/entry/2013/06/01/173308 を参考にしています

```
[?] May bower anonymously report usage statistics to improve the tool over time? 
```

記述はなかったけど、上の質問がありました
ほかにも```what types of modules does this package expose?```とかあってわからん、わからんが、あとからbower.json書き換えればいいだけだしまあいいか
SQL 合計値からランキングを取得する例

SQLが苦手な自分向けのメモ

# 遅い版

ユーザー毎user_idに合計値はtotal_score順にランキングを出力する例です。

```sql
SELECT user_id, total_score, (select count(total_score) FROM total_scores b WHERE a.total_score < b.total_score) + 1 rank FROM total_scores a ORDER BY rank ASC
```

... 動作検証した結果、一レコードずつcountするため凄く遅いです汗.
計算量ではO(N^2)的な？

# count(total_score)の場合の結果

|user_id|total_score|rank|
|-------|-----------|----|
|1191|10000|1|
|1|9555|2|
|5235|9555|2|
|62|9553|4|
|987|2222|5|


```sql
SELECT user_id, total_score, (select count(DISTINCT total_score) FROM total_scores b WHERE a.total_score < b.total_score) + 1 rank FROM total_scores a ORDER BY rank ASC
```

# count(DISTINCT total_score)の場合の結果

|user_id|total_score|rank|
|-------|-----------|----|
|1191|10000|1|
|1|9555|2|
|5235|9555|2|
|62|9553|3|
|987|2222|4|

# 参考

http://oshiete.goo.ne.jp/qa/8135897.html

# 余談

最初total_scoreをSUM(score)で求めてたけど、あきらめてtotal_score_viewを作成しました(ビューの中でユーザー毎の合計値を算出)。

イマイチ合計値をビューで表現すべきなのか、（処理負荷的に）テーブルに格納して良いのか今のところ判断ツキマセヌ...が遅くなるのが目に見えます。処理負荷を検証してみたいところです。
（追記。自分の環境で、数千件で1秒を超える程度の遅さでした.4万レコードでは7分まっても結果がでませんでした汗）

# おまけ

特定のランキングの範囲を指定する例

```sql
SELECT user_id, total_score, (select count(DISTINCT total_score) FROM total_scores b WHERE a.total_score < b.total_score) + 1 rank FROM total_scores a having rank Between 70 and 80
ORDER BY rank
```

# 早い版

コメントして頂いたSQLを参考にしたバージョンです。
（コメントして頂いたものは同順位を考慮していますが、ここでは考慮していません。）

どの程度早いかというと、自分の環境で4万レコードで50ms以下程度。
計算量でいうとO(N)っいう比較的早いやつ？

## 全順位取得

```sql
set @c=0;
select @c:=@c+1 as rank, user_id, @p:=total_score as total_score 
from total_scores
order by total_score desc;
```

## 指定ユーザーの順位を取得する
```sql
set @c:=0; 
SELECT tmp.user_id, tmp.total_score, tmp.rank rank FROM 
(SELECT user_id, total_score, @c:=@c+1 rank FROM total_scores ORDER BY total_score DESC) tmp 
WHERE user_id=100
```

## 指定した順位を取得する

3000〜3010位を取得

```sql
set @c:=0;
SELECT tmp.user_id user_id, tmp.total_score total_score, tmp.rank rank FROM 
(SELECT user_id, total_score, @c:=@c+1 rank FROM total_scores ORDER BY total_score DESC) tmp
ORDER BY rank asc
LIMIT 3000, 10;
```

※　LIMITではなくてbetweenでもいける気がしてきたけど、現在検証できないため、後日検証して差し替えます。
Swiftで配列をNSUserDefaultsを使って保存・読み込み

#Objective-Cとの大きな違い
Objective-Cでは、UserDefaultsで配列を保存した場合でも、保存と読み込みが１行で済む簡単なお仕事でした。
しかし、Swiftでは、型推定が実装されているため、配列の中身は何じゃろな？状態（AnyObject）では格納できませんよーというErrorではじかれてしまいました。
そこで、試行錯誤の末に解決できた方法を今回は紹介します。

#NSUserDefaultsでの配列の保存

まずは配列の生成をする

```swift:Swift
//配列を生成
var names:[String] = ["カネキ", "トーカ", "リゼ", "ニシキ"]

//空の配列ならこのように生成
var names: [String] = []
```

次にNSUserDefaultsで保存してみる
保存はObjective-Cと同じように使える

```swift:Swift
//NSUserDefaultsのインスタンスを生成
let defaults = NSUserDefaults.standardUserDefaults()

//"NAME"というキーで配列namesを保存
defaults.setObject(names, forKey:"NAME")

// シンクロを入れないとうまく動作しないときがあります
defaults.synchronize()
```

#NSUserDefaultsでの配列の読み込み

そして、ここからが本題
これが大変でした
ちなみに、あんまり美しい書き方ではなさそうなので、もっと良い書き方あるよ！って方は教えてください

```swift:Swift
//空の配列を用意
var names: [String] = []

//前回の保存内容があるかどうかを判定
if(defaults.objectForKey("NAME")){
            
    //objectsを配列として確定させ、前回の保存内容を格納
    let objects = defaults.objectForKey("NAME") as? NSArray

    //各名前を格納するための変数を宣言
    var nameString:AnyObject

    //前回の保存内容が格納された配列の中身を一つずつ取り出す
    for nameString in objects!{
        //配列に追加していく
        names.append(nameString as NSString)
    }
}

```
初めてのJavaScript ~コナミコマンドをやってみた~


初めてのJavaScriptということで、コナミコマンドを入力するとテキストのサイズが大きくなるという機能を実装しなさいという課題に取り組みました。

そもそもコナミコマンドってなんぞや。

コナミコマンドとは、いわるゆゲームでは定番の隠しコマンドの俗称です。代表的なコマンド「↑↑↓↓←→←→BA」というのがあり、今回はこのコマンドを使用しました。

以下がソースコードです。

```HTML:konami.html
<html>
  <head>
    <script src="http://code.jquery.com.jquery-1.11.1.min.js"></script>
  </head>
  <body>
    <div id="target">Target!!</div>
    <script type="text/javascript">
     var input = [];
        konami = [38,38,40,40,37,39,37,39,66,65];
     
     $(window).keyup(function(e){
	   input.push(e.keyCode);

	   if (input.toString().indexOf(konami) >= 0)
	   {
	   	  $("div#target").css("fontSize","500%")
	   	  input = [];
	   }
     });
    </script>
  </body>
</html>
```

入力されたキーのコードをinputという変数に格納し、inputの配列とkonamiというコナミコマンドのキーコードを格納している配列を比較し、合致したらdiv内の”Target!!”のフォントサイズが５倍になるようにしました。

```konami.html
 konami = [38,38,40,40,37,39,37,39,66,65];
```
コナミコマンドを各キーに割り振られているキーコードで表示するとこのようになります。

今回、はじめてのJavascriptというのもそうなのですが、はじめてjQueryも書きました。（本当に少しですが、、、笑）

そもそも当初、アクション部分もJavescriptで以下のように書いていました。

```konami.html
var target = document.getElementById("text").innerHTML;
target.style.fontSize = "500%";
```

がしかし、せっかく関数が始まるところで$つかってるので、ここもjQueryで書いてみました。

```konami.html
$("div#target").css("fontSize","500%")
```

一行にすっきりとまとまりました。笑

自分のやり方以外にも様々なやり方があり、いまではCheet.jsやkonami.jsといった簡単にコナミコマンドを実装できるプラグインもありますので、試してみてはいかがでしょう？

最後にコナミコマンドが実装されているサイトをご紹介します。
・[Twitter](https://twitter.com/) 
・[Facebook](https://www.facebook.com/home.php)
・[Digg](http://digg.com/)
・[Geek & Hype](http://www.geekandhype.com/)（面白かったです笑）
・[konamicodesite](http://konamicodesites.com/)(コナミコードのまとめサイトです。)
bigVideo.jsを使ったときの左上コントロールパネルの消し方

原因はbigVideo.jsではなく、内部で利用しているVideo.jsのコントロールパネルです。

bigVideo.jsをどのタイミングで実行するかによりますが、下記のようにページがリロードされたタイミングで実行される場合はdocument.readyで対応できると思います。

```js
$(function() {
 var BV = new $.BigVideo();
 BV.init();
 if (Modernizr.touch) {
  BV.show('代替画像');
 } else {
  BV.show('動画のパス',{ambient:true});
 }
});

$(document).ready(function() {
 $(".vjs-control-bar").css({display: "none"}); // ここ！
});
新人エンジニアがはまるかもしれないrubyの浅いコピーと深いコピーともろもろ背景

先日新人エンジニアと話をしていてちょっと面白かった話。

rubyの代入って

```
a = 1
b = a
a = 2
```

ってやったらbの値はもちろん

```
b
=> 1
```

じゃないですか。一方で、

```
a = User.new
b = a
a.name = "sample"
```

ってやったらb.nameは

```
b.name
=> "sample"
```

となりますね。b.nameの値は変更してないのになんでsampleになったの？と。

## なんでか

各変数のobject_idを見てみると分かりやすいです。

```
a = User.new
b = a
```

とした時点で、

```
a.object_id
=> 70352858783920 
b.object_id
=> 70352858783920
```

同じ値なんですね。aのオブジェクトとbのオブジェクトは一緒。rubyは基本参照型なんですよね。aが参照してる先とbが参照してる先は一緒で、aが参照してる先の値を帰ればbが参照してる先の値ももちろん変わります。~~これを浅いコピーと言います。~~←[追記]これは浅いコピーとは言いませんでした。浅いコピーは本記事下部にて説明します。

## a=2の例で値が変わらなかったのはなんで？

こんな疑問が上がってきました。
これもobject_idの値を見てみると分かりやすいです。

```
a = 1
b = a
```

とした時点で、

```
a.object_id
=> 3
b.object_id
=> 3
```

object_idは一緒です。ここで、

```
a = 2
```

としました。このとき、

```
a.object_id
=> 5
```

と切り替わったんですね。でもbがaのオブジェクトを参照しているのであれば、bの値も2になるんじゃないの？ってなるかもしれないですが、bが参照してるのはaのオブジェクトじゃないんですね。

```
1.objec_id
=> 3
2.object_id
=> 5
```

つまり、最初に```a=1```の時点でaは「1」のオブジェクトを参照してて、```b=a```した時点でbが参照したのはaが参照していた「1」のオブジェクト。ここで```a=2```としても、bが指してるのはaのオブジェクトじゃなくて「1」のオブジェクトなのでaを変更してもbの値は変わらないと。

## userオブジェクトをコピーして別のものとして使いたい

さて長くなりましたが本題で、userオブジェクトをコピーして全く別のものとして使いたいというのがこれ書いたきっかけでした。
その場合、Marshalを使います。

```
a = User.new
b = Marshal.load(Marshal.dump(a))
```

これでbにはaのデータがそのままコピーされて、aの値を変化してもbには影響しないオブジェクトを作成できました。これを深いコピーと言います。

```
a.object_id
=> 70352782085540
b.object_id
=> 70352819525260
```

object_idも変わりました。

## [追記]浅いコピーと深いコピーについて

浅いコピーと深いコピーについてコメントいただいた@harukasanさんが詳しくまとめてくれました。
http://qiita.com/harukasan/items/80523509b446b5033ba9

簡単に言うと、浅いコピーも深いコピーもオブジェクトを複製してobject_idの異なるオブジェクトを作ります。ただ、浅いコピーの場合はコピーしたオブジェクトが配列で、中にさらにオブジェクトを持つ場合に、その要素は複製しないんですね。値を変えると元のオブジェクトも変更されてしまいます。

#### 浅いコピー
```
a = [User.new, User.new]
b = a.dup

# aとbのobject_idは異なる。
a.object_id
=> 70249309167760
b.object_id
=> 70249318096940

# aとbの要素のobject_idは一緒。なので値を変えると相互に影響する。
a[0].object_id
=> 70249265135020
b[0].object_id
=> 70249265135020
```

#### 深いコピー
```
a = [User.new, User.new]
b = Marshal.load(Marshal.dump(a))

# aとbのobject_idは異なる。
a.object_id
=> 70249318635740
b.object_id
=> 70249318761240

# aとbの要素のobject_idも異なる
a[0].object_id
=> 70249318618160
b[0].object_id
=> 70249318761200
```

まとめると、それぞれの参照、コピーの仕方で下記覚えておくと良いと思います。

```
# ただの参照
b = a

# 浅いコピー
b = a.dup

# 深いコピー
b = Marshal.load(Marshal.dump(a))
```
SwiftでNSNotificationCenterを使う

登録時のselectorの指定方法で迷ったのでメモ。

### 登録
```swift
NSNotificationCenter.defaultCenter().addObserver(self, selector: "update:", name: MyNotification, object: nil)
```

### 削除
```swift
NSNotificationCenter.defaultCenter().removeObserver(self)
```

### 通知を受けた時に実行するメソッド
```swift
func update(notification: NSNotification?) {
    // 何かする
}
```

### 通知
```swift
NSNotificationCenter.defaultCenter().postNotificationName(MyNotification, object: nil)
```

### 通知名の定義
```swift
let MyNotification = "MyNotification"
```


## その他、注意点(追記:15/03/30)
NSObjectを継承していないクラスで使用する場合は
実行するメソッドに`@objc`を指定する必要があるようです。
### 通知を受けた時に実行するメソッド(NSObject非継承時)
```swift
@objc
func update(notification: NSNotification?) {
    // 何かする
}
```

### サンプル
NSObjectを継承している場合

```swift
import UIKit

let MyNotification = "MyNotification"

class Hoge : NSObject {
    override init() {
        super.init()
        NSNotificationCenter.defaultCenter().addObserver(self, selector: "update:", name: MyNotification, object: nil)
    }
    
    func update(notification: NSNotification?) {
        // 何かする
        print("Notification!")
    }
}

var hoge = Hoge()

// 通知してみる
NSNotificationCenter.defaultCenter().postNotificationName(MyNotification, object: nil)
```

NSObjectを継承していない場合

```swift
import UIKit

let MyNotification = "MyNotification"

class Hoge {
    init() {
        NSNotificationCenter.defaultCenter().addObserver(self, selector: "update:", name: MyNotification, object: nil)
    }
    
    @objc
    func update(notification: NSNotification?) {
        // 何かする
        print("Notification!")
    }
}

var hoge = Hoge()

// 通知してみる
NSNotificationCenter.defaultCenter().postNotificationName(MyNotification, object: nil)
```
自前でログローテートする

何らかの理由で手動でログローテートをするときのスクリプト

```bash
#!/bin/sh
#Log Rotation Script AM 0:00

# ログファイルが置かれているフォルダ
LOGDIR="/usr/local/nginx/logs"
# ログファイルを保管するフォルダ(今は同じフォルダに保管してる)
OLDLOGDIR="/usr/local/nginx/logs"

sleep 1

DATE=`date +%Y%m%d --date '1 day ago'`

for file in access.log
do
    sudo -u root /bin/cp ${LOGDIR}/${file} ${OLDLOGDIR}/${file}.$DATE

    if [ $? = 0 ];then
        sudo -u root /bin/cp /dev/null ${LOGDIR}/${file}
        # 必要なら個々でgzipなどする
    fi

    # delete log file before 6 days
    # 削除対象が存在しない時のために --no-run-if-empty オプションを指定
    /usr/bin/find ${OLDLOGDIR}/${file}.* -mtime +5 | xargs --no-run-if-empty /bin/rm

   echo "finish rotate ${file}"
done
```

# 複数のファイルが対象の時

対象ファイル名をリストで持って、forで回す

```bash
targets="access.log error.log"

for file in $targets
do
  # 上記と同じでOK
done
```
Commonly forgotten tasks in creating very simple command line applications in Javascript/Node.JS with npm


A friend of mine asked me the other day how to make a CLI application using JS/Node and was running into some issues. I think these are things that are simple to forget about, so I hope it helps anyone else get a jump start.


### 1. Forgetting to provide a "bin" attribute in `package.json`

Without this, there's no telling what to actually expose in module binaries. [example](https://github.com/kimagure/json-file-stub-api/blob/ff12f03763893ebdf2813fade632f85b62547723/package.json#L5)

### 2. Forgetting to set the #! shebang

How is your system going to know what executable needs to be used to execute a script otherwise? [example](https://github.com/kimagure/json-file-stub-api/blob/ff12f03763893ebdf2813fade632f85b62547723/bin/json-file-stub-api#L1)

### 3. Forgetting to use __dirname to access files

If you try to use normal relative pathing, you'll just get the path relative to where the host executed the program from. To get the path relative to your program, you're going to have to use __dirname. [example](https://github.com/Samangan/owLint-node-app/blob/583a11d4e28be65ec781a600f80c6dd167c62c29/bin/owlint#L16)

-----

If you clear up these three things, you should have a working minimal CLI in no time.

If you want to test that your application works while you're developing it, use [npm link](http://qiita.com/kimagure/items/9b370ac2fb970562215a) in order to symlink your package to your local module repository.
Groupを確認したり、追加したりする方法まとめ

## groupの一覧を確認する

```
cat /etc/group
```

* 結果の例
<pre>
apache:x:48:
webadmin:x:501:
web:x:502:
mysql:x:27:
</pre>

* 表の見方

| group名 | パスワード | グループID | サブグループとして所属しているアカウント |
|:-----------|------------:|------------:| :------------:|
| apache       |        x |     48     | 無し |
| webadmin     |      x |    501    | 無し |
| web       |        x |     502     | 無し |
| mysql        |          x |      27      | 無し |

パスワードは暗号化されてる事を意味します。
xというのはシャドウパスワードを使用してるという意味。


## グループの種類

* プライマリグループ
* イニシャルグループ

これらは、ユーザを作って一番最初に属するグループ。

* サブグループ

それ以外で所属するグループの事

## 新しいグループを作る。新しいユーザをグループに追加する

```
groupadd test　← 新しく`test`というグループを作る
useradd test_user -g test　← 新しく`test_user`というユーザを作って、`test`グループに所属させる
id test_user

uid=502(test001) gid=503(test) 所属グループ=503(test)
```

## 既存ユーザをグループに追加する

`gpasswd`コマンドを作る。

試しに、apacheユーザをwebadminグループに追加してみる。
```
[root@***]#gpasswd -a apache webadmin
Adding user apache to group webadmin

[root@***]# id apache
uid=48(apache) gid=48(apache) 所属グループ=48(apache),501(webadmin)
```


## おまけ. ディレクトリの所属グループを変更する

```
chgrp  グループ名 ファイル/ディレクトリ
```
CoreOSのトラブル対応

CoreOSの設定は`/var/lib/coreos-install/user_data`だけです。
他はそれから作り出されたものです。

# ISOでインストール後cloud-config.ymlが適用されない!?

既知のバグ

参考: 
[Cloud Init Seems Broken · Issue #77 · coreos/init](https://github.com/coreos/init/issues/77)


## 一度自動ログインすると適用される

```bash:
boot: boot_kernel coreos.autologin
```

![スクリーンショット 2014-07-18 9.27.03.png](https://qiita-image-store.s3.amazonaws.com/0/25728/18df7b95-57b5-f94e-2c26-c6eb695577ef.png)

## cloud-config.yml

`coreos-install`は`cloud-config.yml`を`/var/lib/coreos-install/user_data`として保存するだけです。

ymlを解析してインストーラがいい感じにするものではありません。

* syntax checkは https://coreos.com/validate/ で確認できる。


# CoreOSの設定変更方法

```bash:
vi /var/lib/coreos-install/user_data
```

# HDDイメージを他で使う

```bash:DISKの存在確認
fdisk -l
gdisk -l /dev/vda
```

```bash:
mount -o subvol=root /dev/vda9 /mnt
```

# ssh方法

```bash:
ssh core@ipaddress
```

# update頻度を変更する

* [CoreOS とその関連技術に関するここ半年間の私の活動まとめ](https://gist.github.com/YungSang/73148282c1a081adb2ba)
* [CoreOS を手動でアップデートする - Qiita](http://qiita.com/spesnova/items/ef6adcae6c63cee18637)
* [Switching Release Channels](https://coreos.com/os/docs/latest/switching-channels.html)

```diff:/etc/coreos/update.conf
- GROUP=alpha
+ GROUP=stable
+ REBOOT_STRATEGY=off
```

* REBOOT_STRATEGY=off で自動再起動が防げる

```bash:
sudo systemctl restart update-engine
```

ログイン時、以下のように`No Reboots`と表示されれば成功。

![スクリーンショット_2017-12-08_08-49-36.png](https://qiita-image-store.s3.amazonaws.com/0/25728/1c0acd5c-5e4f-c468-632b-7c9963614156.png)


## update自体を停止する

```sh:
sudo systemctl stop update-engine
```

## 起動パーティション確認、変更

```bash:
# cgpt show -v /dev/vda3
       start        size    part  contents
      264192     2097152       3  Label: "USR-A"
                                  Type: Alias for coreos-rootfs
                                  UUID: 7130C94A-213A-4E5A-8E26-6CCE9662F132
                                  Attr: priority=2 tries=0 successful=1
# cgpt show -v /dev/vda4
       start        size    part  contents
     2365440     2097152       4  Label: "USR-B"
                                  Type: Alias for coreos-rootfs
                                  UUID: E03DD35C-7C2D-4A47-B3FE-27F15780A57C
                                  Attr: priority=1 tries=0 successful=1
# findmnt -n --raw --output=source --target=/usr
/dev/vda3
```

## 手動アップデート

```
sudo update_engine_client -update
```

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

```bash:
cat /etc/os-release
```
CloudFlashの便利な使い方/設定方法

[Cloud Flash](http://cloudflash.jp)とは、無線LAN内蔵micro SDカードアダプタのこと。Eye-FiやFlashAirのストレージ部分が別売りになったようなSDカードです。内部ではLinuxが動いているため、色々と遊ぶ事が出来ます。

備忘録も兼ねて、CloudFlashを便利に使うための設定方法等も紹介していきたいと思います。

# telnetログイン方法

CloudFlashはデフォルトで23ポートがopen状態なので、普通にshellログインする事が出来る。

1. CloudFlashのAccessPointに接続する。下記の画像では、CLOUD_STORAGEがCloudFlashのAP名。（デフォルトはCloud Flash）  
    ![cloudflash_ap.png](https://qiita-image-store.s3.amazonaws.com/0/27086/75f16e8e-a298-1303-0344-b0bc430cabc0.png)
2. APに接続したら、telnetコマンドを使い、Cloud Flashのデフォルト設定のIPアドレス192.168.1.1、23ポートにログインする。
ID, passwordは不要。

        telnet 192.168.1.1  
        # 

# 便利な設定

## DNS

CloudFlashはブラウザから各種設定をする事が出来る。しかし、その際、指定するアドレスは http://192.168.1.1/ となり、入力が少々面倒くさい。そこで、CloudFlash内部のDNS設定を変更し、http://cloud.local/ のように名前で解決できるようにする。

1. CloudFlashにtelnetログインする。
2. 下記のコマンドを実行する。

        # echo 'cloud.local 192.168.1.1' >> /mnt/mtd/dnsd.conf
        # sync

3. CloudFlashの電源をOFF/ONする（カードを抜き差しする）

### メモ

* busybox DNS serverは/etc/dnsd.confの設定を読み出す。
* CloudFlashはram上のinitrdで動作するため、/etcの上記ファイルを直接編集しても、次回電源ON時には設定内容が消えてしまう。
* 起動時に/etc/init.d/rcSが/mnt/mtd/dnsd.confを/etcにコピーするため、次回電源ON時は/mnt/mtd/dnsd.confの内容が反映される。
ローレンツアトラクタをPOV-Rayで動画にする

# はじめに

ツイッターでpovrayで検索すると、学校の課題でヒーヒー行っている学生さんらしきツイートを多々目にするため、POV-Rayをあまり知らないと悪いイメージがあるかもしれません。

しかし、Qiitaの住人の方々の様にコードがスラスラかければ、色々おもしろいことが出来ます。

今回は微分方程式の解のプロットを各座標を球に置き換えて、[POV-Ray](http://www.povray.org/)でそれらの周りを回るアニメーションを作ってみます。

# Maximaでローレンツアトラクタのデータをつくる

```text:lorenz.txt
load("dynamics");
f(x,y,z):=-10*(x-y);
g(x,y,z):=-y-x*z+28*x;
h(x,y,z):=x*y-8/3*z;
rkdat:rk([f(x,y,z),g(x,y,z),h(x,y,z)],[x,y,z],[1,1,1],[t,0,50,0.01]);
system("pwd");
write_data(rkdat,"rk.dat");
```

# プロットデータをPOV-Rayのファイルにする

今回は、[Perl](http://www.perl.org/)で出力された各プロットを球として表示するようにしてみました。

```pl
#!/usr/bin/env perl

print<<'EOF';
#include "colors.inc"
#include "skies.inc"
#include "glass.inc"
camera{ 
	location <sin(clock*pi*2)*600,0,cos(clock*2*pi)*600>
	up <0,1,0>
	look_at <0,0,0>
} 
light_source { 
	<100,100,-100> 
	color rgb <1,1,1>
} 
EOF
    
while(<>) {
    @dat=split(/ /);
    @dat = map {$_ * 10} @dat;
print<<"EOF";
object {
    sphere {<$dat[1] , $dat[2] , $dat[3]>,1}
    material {
	texture {
	    pigment{color Clear}  
	    finish{ F_Glass1 }
	}
interior { 
I_Glass1
fade_color Col_Emerald_03
}
    }
}
EOF
}

print << 'EOT';
sky_sphere {
  S_Cloud5
}
EOT
```

```
chmod +x plot3d.pl
cat rk.dat |./plot3d.pl >test.pov
```

# POV-Rayでレンダリングする

以下のコマンドで、レンダリングして、結果を複数のPNGファイルに書き出せます。

```
povray +A +H768 +W1024 +KFF60 test.pov 
```

# 静止画から動画に変換する

ffmpegでOSXのQuikTime Playerで開くことの出来るフォーマットで出力してみます。

```bash
ffmpeg -r 30 -i test%02d.png -vcodec libx264 -pix_fmt yuv420p lorenz.mp4
```

# まとめ

微分方程式の解をPOV-Rayでレンダリングして表示することが出来ました。
![lorenz_mp4.png](https://qiita-image-store.s3.amazonaws.com/0/3458/5edd2378-7068-00e3-d27b-665c6194dddb.png)

# 関連投稿

- [Maximaでマンデルブロ集合のGIFアニメーション作成 - Qiita](https://qiita.com/kjunichi/items/fc37ba9ee0007bc52352)
- [Maximaで複数のグラフをPDFに書く - Qiita](https://qiita.com/kjunichi/items/1da06540b059381e7930#_reference-5288fbe5233aed6d8dc7)

# 関連記事

- [「プログラムでシダを描画する」をMaximaで描画する](https://abrakatabura.hatenablog.com/entry/2014/07/18/061534)
- [Maximaでリーマン予想のゼータ関数をプロットした](https://abrakatabura.hatenablog.com/entry/2012/10/12/112958)
- [ffmpegで静止画からQuickTime Playerで再生できる動画を作る](http://abrakatabura.hatenablog.com/entry/2014/07/19/110000)
- [BlenderでPython使って最速降下曲線を描いてみる](https://abrakatabura.hatenablog.com/entry/2016/05/26/070858)
- [1/7がつくる楕円をJulia言語でプロットする](https://abrakatabura.hatenablog.com/entry/2016/10/29/075535)
- [Maximaで2018年のセンター試験、数学I・数学Ａの第1問を解いてみた](https://abrakatabura.hatenablog.com/entry/2018/01/30/204125)
- [陰関数の仮想3D空間へのプロットあるいは、ラズパイ版マインクラフト(mcpi)にたけのこの里を出す](https://abrakatabura.hatenablog.com/entry/2018/04/21/080947)
- [Fortran実装のゼータ関数をWASMにして動かしたかった件](https://abrakatabura.hatenablog.com/entry/2018/06/13/204136)
JSONから、もっともプロパティの多い要素を取得する

やりたい事の説明が難しい。

```js

var list = [
    {id:1, name:"test", address:"tokyo"},
    {id:2, name:"hoge"},
    {id:3, name:"hello", address:"kyoto", tel:"090-1234"},
    {id:4, name:"world", address:"saitama", tel:"090-5678", fax:"03-0000"},
    {id:5, name:"shimizu", address:"gunma"},    
];

```

上記の様な配列から、もっともプロパティの多い要素(この場合なら、id:4のデータ)を取り出す。
あまり必要となる場面は無いかも知れないが、次の一行で取得できる。

```js
list.reduce(function(a, b){ return Object.keys(a).length > Object.keys(b).length ? a : b });

->{id: 4, name: "world", address: "saitama", tel: "090-5678", fax: "03-0000"}
```

Object.keysに渡せばキーの一覧が取得できる。

```js
Object.keys(
	list.reduce(function(a, b){ 
		return Object.keys(a).length > Object.keys(b).length ? a : b;
	})
)
->["id", "name", "address", "tel", "fax"]
```
Gradle SDKManagerPluginによるSDKパッケージの依存関係解決


他者に自分の作ったアプリをビルドして試してもらいたい、というケースは公私ともに割とよくあるケースであり、そんな時にはできる限り手間がかからずに試せるようにしたいもの。

その点を考えると、Android Studioのビルド管理ツールに採用されているGradleは非常に便利だと感じる。

- 依存関係の解決が非常に楽かつ強力: Mavenリポジトリ+libs以下にjarを置く従来の方法に加え、以前はライブラリプロジェクトとしてimportする必要があったコンポーネント(GooglePlayServiceなど)まで解決できる。それらを設定ファイル(`build.gradle`)でほぼ同じように指定できる。
- Gradle自体のインストールを利用者に求めない。Gradleラッパーにより、Gradleがなければ自動的にダウンロードする。 (ref. http://www.gradle.org/docs/current/userguide/gradle_wrapper.html)


# Gradleによるビルドでも残る問題

しかし、これで全てが解決かというとそうでもない。Android Studioにより自動生成される設定でアプリケーションのビルドを行うと、得てして以下のようにSDKパッケージ回りの依存関係でエラーが発生する。

```
> failed to find Build Tools revision 19.1.0 (設定で指定したバージョンのSDKビルドツールがインストールされていない)

> failed to find target android-19 (設定で指定したAPIレベルのSDKプラットフォームがインストールされていない)
```

ここらへんはまだ分かりやすいが、以下のように直接の原因が分かりづらい時もある。これは対応するリポジトリをあらかじめインストールしていないために起こるが、エラーメッセージからそれを読み取るのはなかなか難しい。

```
A problem occurred configuring project ':app'.
> Could not resolve all dependencies for configuration ':app:_debugCompile'.
   > Could not find any version that matches com.android.support:support-v4:19.+.
     Required by:
         NeoPushSample:app:unspecified
   > Could not find any version that matches com.google.android.gms:play-services:4.4.+.
     Required by:
         NeoPushSample:app:unspecified


(サポートライブラリ(上記では"support-v4:19.+.")の依存関係解決には"Android Support Repository"が、
GooglePlayServiceの依存関係解決には"Google Repository"が、それぞれ必要。)
```

これらの依存関係もGradle側で解決できると楽だと思っていたところ、既に同じようなことは考えられていた。感謝しつつ使用させてもらうことにした。

https://github.com/JakeWharton/sdk-manager-plugin

# Gradle SDKManagerPlugin

Githubに丁寧に書いてあるが、一応このプラグインが行うことを整理したのが以下。

- SDKがインストールされていない場合、インストールする。
- Gradleの設定で指定したバージョンのビルドツールがインストールされていない場合、インストールする。
- Gradleの設定で指定したAPIレベルのプラットフォームがインストールされていない場合、インストールする。
- サポートライブラリ/GooglePlayServiceへの依存関係が存在して、かつ対応するリポジトリがインストールされていない場合、インストールする。

設定も非常に簡単で、プロジェクトルートの`build.gradle`とappディレクトリの`build.gradle`を少し書きかえるだけで良い。

```
(プロジェクトルートのbuild.gradle)
buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:0.11.+'
        // 追記
        classpath 'com.jakewharton.sdkmanager:gradle-plugin:0.12.+'
    }
}
...


(appディレクトリのbuild.gradle)
// 追記: "apply plugin: 'android'"より前で設定する
apply plugin: 'android-sdk-manager'
apply plugin: 'android'
...


```

これでビルドを実行した際に、インストールしていないコンポーネントが自動でインストールされる。

```bash
$ ./gradlew clean build
...
Android SDK not found. Downloading... // SDKがインストールされていない時
...
```

# 注意点

SDKがもともとインストールされていない場合は問題ないが、古いSDKがインストールされている場合には少し注意が必要。

SDKManagerPluginは、SDKがインストールされている場合(環境変数ANDROID_HOMEでインストール先が指定されているものとする)、そのSDKを使用して依存関係を解決しようとする。しかし、SDKのバージョンによっては要求されているパッケージが入っていない場合(ex. Google Repositoryが入っていない)があり、その際はエラーが発生する。

そのため既に開発環境が整備されている(=SDKインストール済み)人に試してもらう場合には、事前にSDKのアップデートをお願いする必要が出てくるかもしれない。homebrewなど別途パッケージ管理ツールを使っていればupdate自体は楽に行えるだろう。
storyboardを使ってUITableViewのセルをタップしたときに詳細画面に遷移させる方法

1. TableViewControllerオブジェクトを配置する
2. MasterのTableviewcontrollerとDetailのTableviewcontrollerをSegueで繋ぐ(セルからひっぱる)
3. SegueのIdentifirを設定する
4. [非storyboard]UITableViewControllerクラスを継承したDetailViewControllerを作成
5. storyboardでTableViewControllerオブジェクトのCustom Classに上記のクラスを指定
Android4.4のWebViewがChromiumになったことによる、ただひとつの弊害

Android4.4のwebviewがChromiumになったことによる、ただひとつの弊害
もしくは、Android4.4からChromeのUAを正しく判定する方法

「ただひとつの」は盛りすぎたかもしんない(；・∀・)


# 困ってたこと
アプリが入ってたらアプリを表示して,
入ってなかったらストアに飛ばす実装がしたい

AndroidのChromeでのみ使えるIntentを使う方法↓
https://developer.chrome.com/multidevice/android/intents
を使ったりして、モダンに実装してやったぞ！

えっアプリ内ブラウザで
`Google Chrome では intent://hogehuga が見つかりませんでした`
って出ちゃうΣ(ﾟдﾟlll)ｶﾞｰﾝ

# 結論
UserAgentをみてChromeかどうかを判定するときは、
`Chrome`という文字列だけで判定するのでは不十分で、
`Version/`という文字列が入って**いない**ことも確認すること。

# どうしてこうなった？
Android4.4(KitKat)から、AndroidのWebviewがChromiumベースになった。
（参考：https://developer.chrome.com/multidevice/webview/overview ）

それにより、WebViewのUAに`Chrome`と書かれるようになった。
つまり、従来通りのUA判定では、ChromeアプリとWebViewを区別することができなくなった。

そんなことが、
ここ（https://developer.chrome.com/multidevice/user-agent#webview_user_agent）
の一番下にうすーく太字で書いてあった。

Versionって汎用的すぎてちょっと不安だけど、公式がそうアナウンスしてるんだから仕方ないよね！


## 追記
AUのUserAgent情報　（http://www.au.kddi.com/developer/android/kishu/ua/ ）見たら、
Xperia ZL2 SOL25とか、AQUOS SERIE SHL25とか、標準ブラウザにも
`Chrome`の文字列が入ってるので、誤判定してるかもですね。
実機持ってないので確かなことはわからないですが。。。(/ω・＼)ﾁﾗｯ
capistrano3 で config/deploy.rb のパスを変える

Dedicated to @tohae

# TL; DR

Capfile の**先頭**で

```rb
set :deploy_config_path, 'oreno/deploy.rb'
set :stage_config_path, 'oreno/deploy'
```

のように `deploy_config_path` と `stage_config_path` を設定すれば良い。二度言いますが、**先頭**で。

# 詳細

[capistrano/setup.rb](https://github.com/capistrano/capistrano/blob/master/lib/capistrano/setup.rb) のコードを読むと、`deploy_config_path` という変数と `stage_config_path` という変数を設定すれば良い事がわかった。

ただし、Capfile で cap install のテンプレ通りに、

```rb
# Load DSL and Setup Up Stages
require 'capistrano/setup'
```

が先頭にあると、ここで config/deploy.rb が load されてしまって、時すでに遅しになる。なので、

```rb
set :deploy_config_path, 'oreno/deploy.rb'
set :stage_config_path, 'oreno/deploy'

# Load DSL and Setup Up Stages
require 'capistrano/setup'
```

のように `require 'capistrano/setup'` の前に差し込む必要があるようだ。

ちなみに require してないのに、set はどこで生えたのか、と思うかもしれないが、cap コマンド内部で `require 'capistrano/all'` してしまっているので、その時に生えているようだ。
Swift の Array の基本的な覚え書き



Swiftでの`Array`や`Dictionary`が、`Mutable`か`Immutable`なのかが話題になっているが、自分なりの覚え書き。

**var変数の初期化の方法と配列の追加について その1**
![スクリーンショット 2014-07-18 0.40.17.png](https://qiita-image-store.s3.amazonaws.com/0/3184/c8fc7576-9226-8531-c5f7-325f3387c1d2.png "スクリーンショット 2014-07-18 0.40.17.png")


**var変数の初期化の方法と配列の追加について その2**

`append`が可能であっても`Mutable`と呼ぶのか、`Immutable`と呼べるのかはわかりませんが、とりあえず var変数であれば、`append`できます。

![スクリーンショット 2014-07-18 0.40.48.png](https://qiita-image-store.s3.amazonaws.com/0/3184/17a1c8c7-0292-bc06-90fc-1a6c675e52e4.png "スクリーンショット 2014-07-18 0.40.48.png")


**let変数の初期化の方法と配列の追加について**
![スクリーンショット 2014-07-18 0.41.09.png](https://qiita-image-store.s3.amazonaws.com/0/3184/efb1f02a-6b24-a4d1-1101-4e2813ce8953.png "スクリーンショット 2014-07-18 0.41.09.png")

いくつもの言語に携わっていると、混乱してきます。
Vagrant Tips

# Vagrantとは
最近は、Vagrantという仮想環境のセットアップを自動化してくれるツールが流行しています。
私も最近触り始めたのですが、これからの開発環境にはなくてはならないと断言できるようなポテンシャルを秘めているツールだと思いました。
昔のようにApacheとMySQLだけがあれば開発できるような時代であれば、そこまで有用ではなかったのかもしれません。しかしながら、昨今では開発を行う上で、DBサーバの選択肢もWebサーバの選択肢もアプリケーションサーバの選択肢も、さまざまなものがあり複雑化しています。
大規模なチーム開発を行う場合、それらの開発環境を構築する手順を各個人にやってもらうと、ちょっとした手順のミスなどにより、プログラムが動かなくなったりします。
さらに、無意識的にプラグインなどを投入するなどして、「私の環境だと動くのに。。。」といった不具合も発生します。
このような問題を、美しく解決してくれるためのツールがVagrantです。

# 本稿の目的
Vagrantの入門的な内容は、さまざまな記事がありますので、本稿では触れません。
本稿では、「Vagrantでこんなことしたいんだけど？」といったピンポイントな目標に対して、実際に動作するサンプルを記述することで、同じ内容で困っている人の助力になることを目的としています。思いつきベースですが、VagrantのちょっとしたTipsをどんどん追加していきたいと思います。

# Tips

## [Vagrant Tips#1 ローカルにあるboxをVagrantfileから自動的に読み込む ](http://qiita.com/yukimura1227/items/b9a0e682581a6d55e397)
Vagrantfileにて、http経由でboxを取得するのではなく、ローカルに存在するboxや共有サーバなどにあるboxを自動的に取り込む場合のサンプルを記述しました。
[詳細はコチラ](http://qiita.com/yukimura1227/items/b9a0e682581a6d55e397)

## [Vagrant Tips#2 Oracleのjdkをインストールさせる](http://qiita.com/yukimura1227/items/4c30ceef01ddc6ac2da4)
Vagrantにopen-jdkではなく、Oracle純正のjdkを自動的にセットアップしたい場合のサンプルを記述しました。
[詳細はコチラ](http://qiita.com/yukimura1227/items/4c30ceef01ddc6ac2da4)

## [Vagrant Tips#2’ Oracleのjdkをインストールさせる(jdk8系)](http://qiita.com/yukimura1227/items/7703bfc9a0abc07c3088)
jdk8をセットアップしたい方はコチラ

## [Vagrant Tips#3 rbenvを使ったRuby環境をセットアップする(centos)](http://qiita.com/yukimura1227/items/740be1aaff186baf7e42)
いろんなバージョンのRubyを使う必要がある場合には、rbenvが便利です。Vagrantにrbenv&Ruby 2.1.2のインストールを自動的にさせるサンプルを記述しました。
[詳細はコチラ](http://qiita.com/yukimura1227/items/740be1aaff186baf7e42)

## [Vagrant Tips#4 puppetのmanifestファイルを階層的に読み込む](http://qiita.com/yukimura1227/items/374a329ee0898b47ce82)
vagrantのプロビジョニングにpuppetを利用している場合、default.ppに全てを書くのは嫌ですよね。。。そんな場合には、puppetのmanifestファイルを階層化して目的ごとに管理してしまいましょう。
[詳細はコチラ](http://qiita.com/yukimura1227/items/374a329ee0898b47ce82)

## [Vagrant Tips#5 boxのメモリをVagrantfileで変更する(VirtualBox限定) ](http://qiita.com/yukimura1227/items/0737d9683e1068721e29)
ProvisionerとしてVirtualBoxを利用している場合限定ですが、VagrantfileにてVMのメモリーをチューニングしたいという場合のサンプルを記述しました。
[詳細はコチラ](http://qiita.com/yukimura1227/items/0737d9683e1068721e29)

## [Vagrant Tips#6 JavaのWebアプリ実行用にTomcat7環境をセットアップする](http://qiita.com/yukimura1227/items/43782c765939da9c9699)
Vagrant環境にjdkとTomcat7を自動的にセットアップするサンプルを記述しました。
[詳細はコチラ](http://qiita.com/yukimura1227/items/43782c765939da9c9699)

## [Vagrant Tips#7 Javaのビルド環境としてmaven3の環境をセットアップする](http://qiita.com/yukimura1227/items/68b02375c56af346e095)
自動的にgitやSVNからプログラムを取得してコンパイルしたいというケースがあるかと思います。Javaではmavenでコンパイルすることがトレンドになっていますので、maven環境を自動的にセットアップするサンプルを記述しました。
[詳細はコチラ](http://qiita.com/yukimura1227/items/68b02375c56af346e095)


## [Vagrant Tips#8 gitをソースからコンパイルして利用する(centos) ](http://qiita.com/yukimura1227/items/48905238a89790abc6cf)
gitの最新版は、yumではインストールすることができないため、ソースから自動的にコンパイルするようなサンプルを記述しました。
[詳細はコチラ](http://qiita.com/yukimura1227/items/48905238a89790abc6cf)

## [Vagrant Tips#9 スクラップ＆ビルドできるmysql5.6を構築する(centos)](http://qiita.com/yukimura1227/items/c43b752a03ac915c38ed)
そろそろ安心して使えるようになってきたMySQL5.6を勉強したい人のために、MySQL5.6を自動的にセットアップするサンプルを記述しました。
ホストマシンからアクセスできるように、MySQLの接続ユーザも作成するようにしています。
備忘: Go言語のsyscall.Sysctl()で配列を返すmibを読む

##概要
sysfsの無いFreeBSD環境の現在のCPU時間をGo言語から取得したい...けど、syscall.Sysctl()ではすんなりとできない。
なんとかしたいから、文字列→Byte列→数値の変換でなんとか読みだしてみた。


##解説
sysctl()システムコールをGo言語から使用する場合、標準ライブラリのsyscall.Sysctl()かsyscall.SysctlUint32()を使用します。

ただし、取得できるデータ形式が文字列と符号なし32bit整数のみで“kern.cp_time"等、配列を返すmibにはすんなりと対応できません。

syscall.Sysctl()の結果を以下のように変換して結果を取り出します。

```go:sysctl_go.go
package main

import (
        "bytes"
        "encoding/binary"
        "fmt"
        "syscall"
)

func main() {
        val, err := syscall.Sysctl("kern.cp_time")
        if err != nil {
                return
        }
        buf := bytes.NewBufferString(val)
        buf.Write([]byte{0})
        fmt.Println("buf len=", buf.Len())

        b := buf.Bytes()
        fmt.Println("result:", len(b), b)

        var i1 uint64
        var i2 uint64
        var i3 uint64
        var i4 uint64
        var i5 uint64

        binary.Read(buf, binary.LittleEndian, &i1)
        binary.Read(buf, binary.LittleEndian, &i2)
        binary.Read(buf, binary.LittleEndian, &i3)
        binary.Read(buf, binary.LittleEndian, &i4)
        binary.Read(buf, binary.LittleEndian, &i5)
        println(i1, i2, i3, i4, i5)
}
```

実行結果は

```
% ./sysctl_go && echo && sysctl kern.cp_time
buf len= 40
result: 40 [35 147 0 0 0 0 0 0 234 0 0 0 0 0 0 0 30 42 2 0 0 0 0 0 221 11 2 0 0 0 0 0 165 170 242 9 0 0 0 0]
37667 234 141854 134109 166898341

kern.cp_time: 37667 234 141855 134109 166898341
```

sysctlコマンドの結果と一致しているようです。

##課題
とりあえず、それっぽい結果にするために数値のサイズを64bitと決め打ち＆バッファに1Byte足して8Byte境界になるようにしてしまっています。
AMD64アーキテクチャなのでそれっぽいですが、sysctlの仕様としてあっているのか要確認です。

4時間ほどsyscallパッケージのソースコードとにらめっこしてこの結果に。
まじめな自前実装もやってみようと思いましたが却下。
アーキテクチャの差をせっかくsyscallパッケージで吸収してくれているのが無駄になってしまう。
タイムアップ...ということで続きは次回(あるのかな？)