OmniAICreator/Qiita-1.07M huggingface dataset:
Path が消える．．．


#### PATHを設定したんだ，したんだよ確かに，でもな．．．ないんだ

調べると結構同じ問題にあたっている人がいたので，あえて記事にするまでもない気がしましたが，自分のための備忘録として．

# TL;DR
デフォルトの設定ファイルが
なかなかどうして
おクソであらせられるので気をつけよう


# $HOME/.zshenv に PATH の設定とかが書いてあったそうな
意気揚々と archLinux のインストールから設定までを終え，いつものように細々とした設定ファイルなどを Github から落とし，いつものように anyenv をインストールした．
そしておもむろに`exec $(SHELL) -l`を叩き，NeoVim のために`anyenv install pyenv`と打った時，事件は起きた．

SH「 **そんなコマンドねーよハゲ** 」
俺「え．．．？　いや，あるし．．．打ち間違えたかな？」
（再度コマンドを打つ）
SH「 **そんなコマンドねーよハゲ** 」
俺「(゜д゜)」← 本当にこんな顔してたと思う
俺「これは？ `if [ -d $HOME/.anyenv/bin ] ; then echo "ハゲじゃねーし"; fi`」
SH「 **ハゲじゃねーし** 」
俺「えぇ．．．」

そしてハッとして`echo $PATH`をして全てを知る．「パス通ってないじゃん」と．

いやいやいやいや，入れたよ？　確かに入れたよ？ **.zshenv で入れたよ？** ← これが原因の一つだったわけだが


# 解決法の模索とあっけない結末
### 疑惑１：（まさかの）.zshenv が読み込まれていない
`source $HOME/.zshenv`すると確かにパスが通る．うん，怪しい．

```sh:$HOME/.zshenv
# 細々した設定がありましてな．．．

if [ -d $HOME/.anyenv ] ; then
	typeset -Tx ANYENV_ROOT anyenv_root
	anyenv_root = $HOME/.anyenv
	path=(
		${anyenv_root}/bin(N-/)
		${path}
	)
	eval "$(anyenv init - --no-rehash)"
	echo "ヅラじゃねーし"
fi
```

気合を入れて，念のためにログアウト → ログイン

SH「 **ヅラじゃねーし**　」

．．．どうやら .zshenv はきちんと読み込まれているらしい．．．


### 疑惑２：（Macでも厄介者だった）デフォルト設定ファイル

```sh:/etc/zsh/zprofile
emulate sh -c 'source /etc/profile'
```

お．．．？

```sh:/etc/profile
umask 022
PATH="/usr/local/sbin:/usr/local/bin:/usr/bin"
export PATH

# 他いろいろ．．．
```

あ．．．

呼び出し順序って，\$HOME/.zshenv → /etc/zsh/zprofile → \$HOME/.zshrc だものね．．．
そら（そこに書いたら），そう（上書きされて消える）よ．．．

やはり前科者の仕業か．．．


### 解決策
`eval "$(anyenv init - --no-rehash)"` を \$HOME/.zshrc に移してもいいけどなぁ．．．
なんかその方が Vim の起動早くなるっぽいし．．．それが推奨設定らしいし．．．
<small>参考記事 > [anyenvの設定を正しい位置に書いたらVimの起動が爆速になった](http://blog.hifumi.info/2015/04/19/eval-to-zshrc-for-faster-vim/)</small>

でもそしたら vimrc の方にも書かないとダメだよね．．．
デフォルトで .zshenv しか読み込まないはずだし，Vim から Ruby とか Python 実行できないと困るし．

面倒だなぁ．．．この環境でしか起こらない問題だしなぁ．．．
．．．夜も更けてきたしなぁ．．．

```sh:$HOME/.zprofile
source $HOME/.zshenv
```

とりあえずだから，とりあえずね，とりあえずこうしておきましょう．
そのうち直すし．直すよ．うん，直す直す．．．そのうちね．．．


# まとめ

- \$HOME/.zshenv のあとに /etc/zsh/profile が呼ばれるので注意しよう．
- \$PATHの初期化を回避するには，\$HOME/.zprofile か $HOME/.zshrc に設定を移しましょう．
- 深夜で眠くて，やけくそになっているときは，.zprofile から .zshenv 読み込んで解決したことにしましょう．
- 実際問題，\$PATH の設定って env より profile に書くべきなのだろうか？
- これ，Ubuntu とか CentOS では特に問題にならなかったんだけど，archLinux 特有なのかな？
第9話 迷子になって...

**そして、伝説へ...（謎）**

前回発見したダンジョンを徘徊しているうちに、家に帰れなくなっている状態をコード化しました。

今回は、HTML5ゲームフレームワークであるPhaserを使ってThreeで描画するダンジョンを徘徊する感じのコードを実装します。
せっかくなので、バーチャルジョイスティックで徘徊してみたいと思います...というか、PhaserのJoyStickプラグインは有償ジャマイカ！

[デモ](http://tkymgr.o0o0.jp/demo/)![final.png](https://qiita-image-store.s3.amazonaws.com/0/105644/f8614f1e-01f1-2a6b-ae60-23c7c737f37c.png)

行動は、前進・右向く・左向くの３通りとします。
まずは、向きを変える行動ですが、方角は以下の様に定義してますので、

```js:poge.js
// 方角
var direction = {
  north : 0,
  west  : 1,
  south : 2,
  east  : 3
};
```
左向く場合は、こんな感じになります。

```js:poge.js
Player.direction += 1;
if (Player.direction > 3) Player.direction = 0;
```
この動きに合わせて、カメラの向きを変えないと画面が変化しないので
y軸方向に回転します。

```js:poge.js
// 方角に対する回転角度
var rotationAngle = [
  0,
  Math.PI/2,
  Math.PI,
  -Math.PI/2
];
camera.rotation.y = rotationAngle[Player.direction];
```
次に、前進ですが、これは壁があると進めないとか、扉は通り抜けるとか判断が必要です。今回、Phaserを利用する前提なので、衝突判定とか使えそうな気もしますが、がっちりコード化してみますｗ
![map.png](https://qiita-image-store.s3.amazonaws.com/0/105644/30d12f07-280f-8235-ea87-c8a3c3a84ec0.png)
上図の様に、碁盤の目になってますが、前進と行っても、向いている方向でｘが変化するのか、ｙが変化するのかが決まります。

```js:poge.js
// 移動変移係数
var moveTransition = [
  { x :  0, y : -1 }, // 北向いてるとき
  { x : -1, y :  0 }, // 西　　〃
  { x :  0, y :  1 }, // 南　　〃
  { x :  1, y :  0 }, // 東　　〃
];
```
今から前進しようとしている方向は、果たして進めるのかどうか？がわかればいいので、

```js:poge.js
var getMap = function(x, y){
  return mapData.wall[y].charAt(x);
};

if (getMap(Player.x + moveTransition[Player.direction].x, Player.y + moveTransition[Player.direction].y) == "■") {
  // 壁で進めません。
  return;
}
Player.x += moveTransition[Player.direction].x;
Player.y += moveTransition[Player.direction].y;
if (getMap(Player.x + moveTransition[Player.direction].x, Player.y + moveTransition[Player.direction].y) == "□") {
  // 扉なので、もう一歩進みます。
  Player.x += moveTransition[Player.direction].x;
  Player.y += moveTransition[Player.direction].y;
}
```
前進できた場合は、更にカメラも移動しないと駄目です。

```js:poge.js
var calcPos= function(x){
  return x * blockSize;
};
camera.position.set( calcPos(Player.x), 0, calcPos(Player.y) );
```
これだけなんですけどねｗ

ほんと最終回にしようと思ったんですが、Phaser関連(Three描画の合成、アニメーション、デバイス入力)で長くなりそうなので、1クールぐらいに分割しますｗ
Xcodeにつないだら落ちなくなるクラッシュ[iOS]

iOSアプリにiTunesConnect上からzipを入れて、手動アセットっぽくできるコードを作っていた時、
スプラッシュで落ちる現象にぶち当たった。
zipが重たくなればなるほど、発生していた。

Xcodeにつなぐと落ちなくなるという特徴もあった。

私の上司が、数日かかって、原因を突き止めたが、
原因は、スプラッシュの状態から20秒以上ViewControllerに移動しなければ、
iOS側が、このアプリはおかしいものだと判断して、強制終了させるということらしい。

試しに、didFinishLaunchingWithOptionsでsleep(25)などとすると、確かに落ちた。。
applicationDidBecomeActiveでもダメなようだ。


かなり見つけるのに困難なバグであったので、注意してほしい！

参考記事 http://cocoadays.blogspot.jp/2011/02/ios.html



viewDidAppearなどで呼ぶようにすれば直るらしいが、Androidとコードを共通化したい場合、
ネイティブ部分よりも共通化したコードの部分に移動するのが良い！
Swift - 构造方法


####使用规则：
1. 派生类的构造方法只能向上调用父类的指定构造方法(不能是父类的便利构造方法)。
2. 便利构造方法只能同向调用本类的其他构造方法(既能是指定构造方法，也能是便利构造方法)。
3. 便利构造方法只能以一个指定构造方法调用结束。

-

```Swift
//  Created by Kxx.xxQ 一生相伴 on 16/2/23.
//  Copyright © 2016年 Asahi_Kuang. All rights reserved.
//

import Foundation

// Swift - 继承

// 父类构造方法
class Student {
    var name: String
    var stuID: String
    var age: Int?
    
    // 指定构造方法 ps. 如果加上前缀required表示必须构造方法，在子类必须实现该构造
    required init(_ name: String, _ stuID: String, _ age: Int?) {
        self.name = name
        self.stuID = stuID
        self.age = age
    }
    
    // 便利构造方法
    convenience init() { self.init("kuang", "19910923", 25) }
}

let xiaoMing = Student()
print(xiaoMing.name, "\n\n\n")

// 子类构造方法
class StudentInClassOne: Student {
    var nickName: String
    
    // 指定构造
    init(_ name: String, _ stuID: String, _ age: Int?, _ nickName: String) {
        // 先把子类新的属性赋值
        self.nickName = nickName
        // 然后通过super调用父类构造方法
        super.init(name, stuID, age)
    }
    
    // 便利构造
    convenience init() { self.init("邝清旭", "19910923", 24, "邝大爷") }

    required init(_ name: String, _ stuID: String, _ age: Int?) {
        fatalError("init has not been implemented")
    }
}

let me = StudentInClassOne()
print(me.name, me.stuID, me.age!, me.nickName, separator: "\n", terminator: "\n")

class Test: StudentInClassOne {
    var test: String
    
    init(_ name: String, _ stuID: String, _ age: Int?, _ nickName: String, _ test: String) {
        self.test = test
        super.init(name, stuID, age, nickName)
    }
    
    required init(_ name: String, _ stuID: String, _ age: Int?) {
        fatalError("init has not been implemented")
    }
}
```
htmlでMarkdown記述 + Base64エンコードでドキュメント作成(marked.js)

# 簡単な内容(今北産業)  
* 文章体裁にはMarkdown記述が使えて、画像などではタグを使うハイブリッド記述
* HTMLにBase64エンコードで画像も放り込んで1ファイル化
* ファイル自体はテキストエディタを使って書く(Markdownエディタを使わない)

# はじめに  
この記事は何らかのソフトのマニュアルやREADMEにPDFを使ってて、更新のたびにPDFを作り直す羽目になってうんざりしている人向けの内容です。
PDFを作成するソフトは数多くありますが、一度作ったPDFを上書きするソフトはまずないので、作り直す場合はpdfをアウトプットする前の作業データを引っ張りだす必要がありました。
少し前からMarkdown -> HTML -> PDF という流れでドキュメントを作る事が多くなったので、必要でない限り、PDF出力の手間も省きたいと思っていました。
今回はテキストエディタ以外はほぼソフトレスでファイルを上書き更新ができる環境を目指しました。

# HTML内の基本構成  

marked.jsを使うのですが、いろいろなサンプルではjQueryありきで書かれたものが多かったので、この部分を無くし、JavascriptからDOMを直接操作するようにしました。
英語のマニュアルで使ってるので、lang="en"になってますが、日本語ならlang="jp"に直します。
jQueryを使わないのでwindow.onloadから呼び出すようにしています。
GitHubから[marked.min.js](https://github.com/chjj/marked/blob/master/marked.min.js)をDLして、下記のコードの張り付け箇所にペーストすると動作するようになります。

```base.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
</head>
<body>

<!-- スタイルシート定義部 -->
<style>
/* preタグに折り返しをつける */
pre {
white-space: pre-wrap;
word-wrap: break-word;
overflow: auto;
}
</style>

<div id="container">
<div id="mdrender">
<noscript><!-- Javascriptが無い場合の内容 --></noscript>
<!-- ここにレンダリング後の内容が入る -->
</div>
<pre id="mdraw">
ここにMarkdownの記述で本文を書いていく  
画像を使うときは<img>タグを使う
</pre>
</div>

<script>
/* marked.min.jsのコードをここに貼付 */
</script>

<script>
window.onload = function() {
//"mdraw"の内容を取得
var raw = document.getElementById("mdraw");
//"mdraw"の内容をパースして"mdrender"内に表示する
document.getElementById("mdrender").innerHTML=marked(raw.innerHTML);
//"mdraw"そのものを削除
raw.parentNode.removeChild(raw);
}
</script>
</body>
</html>
```

# 画像の入れ方

Base64でエンコードしたものを使います。
下は元画像とBase64エンコードした後のコードです。
![pngtest.png](https://qiita-image-store.s3.amazonaws.com/0/58376/345c1297-441d-09bf-6181-1ee1762cf523.png)

```
<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAeCAMAAABdem3zAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAAxQTFRF/PwzJiUB//9Mg4QVvFpThAAAARBJREFUeNq0VIuOwzAIA/v///l4hMCqbL2ebpGiAo2xIbSCh0sgj9YfAVSlkG6544a5jEguC7IB5hmCKrCtqoHQMtym2xgAwEGEvwBs57GlQjXecjI4hZ3zB7BELAanDUcHwD16xLenypyeBaIHQAldL5mqozCkH7JGDSk5MGW5UEYuf1QHXhgQYSt6A5SZgKUoAWlryGWcFs1eywRca6A1ejUkb4GlO6lGDYeVKVfWvMebWQIw5uft8LHPH4IXwFYQ9fQg7RH5IIn7nla/3wHIzWEtbuoToNqy6TsvR3QwMFKVB3bauIaTJGw9EiOKmxrAeZ6871IT+LcE9gd6BjRBTSN/fQ///1/6MuDh+hFgAOSdBCCVGQFAAAAAAElFTkSuQmCC" />
```

# 使用例

実際にUnityのアセットで使用しているマニュアルを使用例として公開しています。
[Dropboxへのリンク](https://dl.dropboxusercontent.com/u/22995097/readme.html)

# 今後の課題：CSSを使って印刷向け設定をする

いまのところ印刷物への配慮をしていないので、画像サイズが大きめになるので、この辺の処理をちゃんと書いていきたいです。
RecordをbuildしようとしたらNoMethodErrorで怒られた人へ

# TL;DR
`has_one` 関連のモデルに対しては `build` は使えないので `build_xxx` を使う。

# 実例
Rails 4.2にて

``` shop.rb
class Shop < ActiveRecord::Base
  has_one  :owner
  has_many :products
end
```

``` ruby
[1] pry(main)> shop = Shop.last
[2] pry(main)> shop.products.build
=> #<Product:0x007fbc9a1468e8 id: nil, name: nil, price: nil, created_at: nil, updated_at: nil>
[3] pry(main)> shop.owner.build
NoMethodError: undefined method 'build' for nil:NilClass
[4] pry(main)> shop.build_owner
=> #<Owner:0x007fbc7a8da840 id: nil, name: nil, created_at: nil, updated_at: nil>
```

# 原因
`has_many` 関連のModelに対してRecordを呼び出した場合、Recordがなくても、空の `ActiveRecord_Associations_CollectionProxy` が返る。そこには `build` が定義されている。(http://api.rubyonrails.org/classes/ActiveRecord/Associations/CollectionProxy.html#method-i-build)
しかし、 `has_one` 関連のModelに対してRecordを呼び出した場合、Recordがないと返ってくるのは `nil` であり、当然 `build` の定義はない。

``` ruby
[8] pry(main)> shop.products
=> []
[9] pry(main)> shop.products.class
=> Product::ActiveRecord_Associations_CollectionProxy
[10] pry(main)> shop.owner
=> nil
```
 
一回通った方法を機械的にリピートしてると思わぬところでコケたりするんだなぁ。
Draft.jsを取り敢えずElectronに放り込んでみる（最小構成）メモ

Facebookさん謹製のreactのためのリッチテキストエディタフレームワークDraft.jsが出たというニュースがあったので、取り敢えず試しにElectronに入れてみました。

公式サイト見ながらやったら結構手こずったので入れ方メモっておきます。

# Draft.js公式サイト

https://facebook.github.io/draft-js/


# 準備

一旦空っぽのelectronアプリを用意して、必要なライブラリをnpmで入れまくります。

```bash
$ npm i -S react react-dom
$ npm i -D babel babel-register babel-preset-react babel-preset-es2015
```

で、本題のdraftjsを入れます

```bash
$ npm i draft-js
```

# 早速入れてみる

babel使うのに必要な設定をpackage.jsonに書きます。

```json:package.json
"babel": {
  "sourceMaps": "inline",
  "presets": [
    "react",
    "es2015"
  ]
}
```

index.htmlは必要最低限

```html:index.html
<html>
  <head>
  </head>
  <body>
    <div id="container"></div>
    <script>
      window.onload = function() {
        require('babel-register')();
        require('./main.jsx');
      }
    </script>
  </body>
</html>
```

で、index.htmlに読ませてるmain.jsxに、Draft.jsを使う部分を記述します。

```js:main.jsx
import React from 'react';
import ReactDOM from 'react-dom';
import {Editor, EditorState} from 'draft-js';

class MyEditor extends React.Component {
  constructor(props) {
    super(props);

    this.focus = () => this.refs.editor.focus();
    this.state = {editorState: EditorState.createEmpty()};
    this.onChange = (editorState) => this.setState({editorState});
  }

  render() {
    return  (
      <Editor
        editorState={this.state.editorState}
        onChange={this.onChange}
        ref="editor"
      />
    );
  }
};

ReactDOM.render(
  <MyEditor />,
  document.getElementById('container')
);
```

取り敢えず最小構成で非常にシンプルなエディタができあがります。
この時点だとtextareaとなんら変わらないレベルですが、いろいろ機能持ってるみたいなんで、作り込めばリッチになるはず！！

公式丸写しすると、constructor部分について全く書いてなくて、editorStateが初期化されなくて死ぬのでお気をつけて！
.vimrcに設定しておく内容

# 目的
どの環境になっても最初に設定すべき.vimrcの内容をメモとして残しておく

# 内容
```
NeoBundle 'Shougo/neocomplcache'
NeoBundle 'https://github.com/t9md/vim-quickhl'

call neobundle#end()

filetype plugin indent on

" タブ、空白、改行の可視化
set list
set listchars=tab:>.,trail:_,eol:↲,extends:>,precedes:<,nbsp:%
" インデントの半角スペース4対応
set tabstop=4
set autoindent
set expandtab
set shiftwidth=4


"" neocomplcache
" Disable AutoComplPop.
let g:acp_enableAtStartup = 0
" Use neocomplcache.
let g:neocomplcache_enable_at_startup = 1
" Use smartcase.
let g:neocomplcache_enable_smart_case = 1
" Set minimum syntax keyword length.
let g:neocomplcache_min_syntax_length = 3
let g:neocomplcache_lock_buffer_name_pattern = '\*ku\*' " " " "
" Define dictionary.
let g:neocomplcache_dictionary_filetype_lists = {
    \ 'default' : ''
    \ } "

" Plugin key-mappings.
inoremap <expr><C-g>     neocomplcache#undo_completion()
inoremap <expr><C-l>     neocomplcache#complete_common_string() "
inoremap <expr><CR>      pumvisible() ? neocomplcache#close_popup() : "<CR>"

" Recommended key-mappings.
" <CR>: close popup and save indent.
" inoremap <silent> <CR> <C-r>=<SID>my_cr_function()<CR>
function! s:my_cr_function()
  return neocomplcache#smart_close_popup() . "\<CR>"
endfunction
" <TAB>: completion.
inoremap <expr><TAB>  pumvisible() ? "\<C-n>" : "\<TAB>"
" <C-h>, <BS>: close popup and delete backword char.
inoremap <expr><C-h> neocomplcache#smart_close_popup()."\<C-h>"
inoremap <expr><BS> neocomplcache#smart_close_popup()."\<C-h>"
inoremap <expr><C-y>  neocomplcache#close_popup()
inoremap <expr><C-e>  neocomplcache#cancel_popup()


" quick highlight key-mappings
nmap <Space>hl <Plug>(quickhl-manual-this)
xmap <Space>hl <Plug>(quickhl-manual-this)
nmap <Space>hr <Plug>(quickhl-manual-reset)
xmap <Space>hr <Plug>(quickhl-manual-reset)
```

導入している設定や機能の詳細については、後日かければ書く
0.5から始めるAWS CLI入門 - ④EC2

AWS CLI勉強中の内容をまとめていきます。
PREV：**[0.5から始めるAWS CLI入門 - ③VPCの構築](http://qiita.com/yarakaki/items/39c035d3d66918726c61)**
* * *

[hiroshik1985](http://qiita.com/hiroshik1985)さんの[0から始めるAWS入門②：EC2編](http://qiita.com/hiroshik1985/items/f078a6a017d092a541cf)の内容をAWS CLIで行います（若干違うとこもあります）。
#事前準備
キーペアの作成、セキュリティグループの作成
##キーペアの作成
~/.ssh/にキーペア作成

```:
$ aws ec2 create-key-pair --key-name Test-key --query 'KeyMaterial' --output text > ~/.ssh/Test-key.pem
```

そのままだと使用するときに怒られるので権限の変更

```:
$ chmod 400 ~/.ssh/Test-key.pem
```

##セキュリティグループの作成
vpc-idは[前回](http://qiita.com/yarakaki/items/39c035d3d66918726c61)作成したVPCを使用

セキュリティグループの作成

```
$ aws ec2 create-security-group --group-name Test-SG --description "Test-SG" --vpc-id vpc-@@@@@@@@
{
   "GroupId": "sg-GGGGGGGG"
}
```

ネームタグをつける

```:
$ aws ec2 create-tags --resources sg-GGGGGGGG --tags Key=Name,Value=Test-SG
```

このままだとインバウンドの通信が全て拒否されている。
自身のIPの確認と、自身からのSSHとVPC内のHTTP(HTTPS)通信のみ許可する。

IPの確認

```:
$ curl http://checkip.amazonaws.com/
***.***.***.***
```

ホワイトリスト登録

```:
$ aws ec2 authorize-security-group-ingress --group-id sg-GGGGGGGG --protocol tcp --port 22 --cidr ***.***.***.***/32

$ aws ec2 authorize-security-group-ingress --group-id sg-GGGGGGGG --protocol tcp --port 80 --cidr 10.0.0.0/16

$ aws ec2 authorize-security-group-ingress --group-id sg-GGGGGGGG --protocol tcp --port 443 --cidr 10.0.0.0/16
```

#EC2インスタンス作成・接続

いよいよインスタンスの作成

##EC2インスタンス作成

今回使うのはAmazon Linux AMI 2015.09.2 (HVM), SSD Volume Type
image-idを確認しておく
![ami-id.png](https://qiita-image-store.s3.amazonaws.com/0/113901/33462a2e-18fa-bec0-4916-d6bcfded36a2.png)


subnet-idは[前回](http://qiita.com/yarakaki/items/39c035d3d66918726c61)作成したsubnetを使用

```:
$ aws ec2 run-instances --image-id ami-59bdb937 --count 1 --instance-type t2.micro --key-name Test-key --security-group-ids sg-GGGGGGGG --subnet-id subnet-AAAAAAAA --associate-public-ip-address

################出力略################

           "VpcId": "vpc-@@@@@@@@",
           "StateTransitionReason": "",
           "InstanceId": "i-HHHHHHHH",

######################################
```

ネームタグをつける

```:
$ aws ec2 create-tags --resources i-HHHHHHHH --tags Key=Name,Value=Test-Server01
```

##EC2インスタンス接続

[前々回](http://qiita.com/yarakaki/items/dbd1c8a4feed2936107e)で触れた--queryを使ってパブリックIPアドレスを調べてみます。

```:
$ aws ec2 describe-instances --instance-id i-HHHHHHHH --query 'Reservations[].Instances[].PublicIpAddress'
[
   "***.***.***.***"
]
```

上記のIPで接続

```:
ssh -i ~/.ssh/Test-key.pem ec2-user@***.***.***.***
```

***

間違い、改善点等ありましたらご指摘お願いします。

Next：**[0.5から始めるAWS CLI入門 - ⑤ELB](http://qiita.com/yarakaki/items/912de594faf5cdbe0946)**
NetBeans でのカバレッジ測定


ローカル開発中に手早くカバレッジを見る際には` NetBeans `上でカバレッジレポートを見ると便利である。
 
プロジェクトを右クリック > コードカバレッジ > レポートを表示
出てきた画面下方の「テストを全て実行」でテスト完了するとカバレッジが見られる

`NetBeans`上でカバレッジレポートを見る際に` fail `しているものがある場合カバレッジレポートが見られないことがある。
その場合は `jacoco:report` ゴールを実行すれば見られるようになる。
singleton_classを使ってActiveRecordのvalidatorをオブジェクトに追加する

Railsでアプリを作ると、必ず困ることの一つにActiveRecordのvalidatorがあります。

一般のユーザ登録の時はnameが必須だけど、管理画面からはなくても登録できるようにしたい、というケースが良くあります。

その場合、`validates :name, presence: true, if: :require_name?` という風に`if`オプションで対応することになります。

しかし、すべての`validates`にこれを追加するのはちょっと違うなぁとも思います。

`validates`に`scope`オプションを追加して、`save_with(:name)`みたいメソッドを定義し、そこで使うvalidatorを選択すればいいかなとか考えましたが、もっとシンプルにobjectにvalidatorをmix-inで追加できるようにしてみました。

Ruby 1.9.2からある[Object#singleton_class](http://docs.ruby-lang.org/ja/1.9.3/class/Object.html#I_SINGLETON_CLASS)を使うと下記のようにしてオブジェクトにvalidatorを追加できます。

```rb
user = User.new
user.singleton_class.class_eval do
  validates :name, presence: true
end
```

これをcontrollerに書くのはダメなので、moduleにして読み込めるようにする、[object_extender gem](https://rubygems.org/gems/object_extender)を作ってみました。

https://github.com/masuidrive/object_extender_rb

```rb
require 'object_extender'
class User < ActiveRecord::Base; end

module RequireName
  extend ObjectExtender
  extended_class do
    validates :name, presence: true
  end
end

me = User.new(params)
me.save! # OK

# nameを必須にする
me.extend(RequireName)
me.save! # Failed
```

このように使うシーンに合わせて`validates`を追加したり、データの正規化を行うために`before_validation`を追加することができます。

Railsで使うときは、`app/models/user/require_name.rb`に`module User::RequireName`という形で置けばいいかなーと思っています。

週末に思いつきでお風呂で作ったので、コメントをお待ちしています。

ソースは短くて、30行程度です。
https://github.com/masuidrive/object_extender_rb/blob/develop/lib/object_extender.rb

こういう問題をスマートに解決する方法を一緒に考えてくれる人いないかなぁということで、考えてくれる人は、[3,000万人の予約を支えるRailsエンジニア募集！](https://www.wantedly.com/projects/13055)でお待ちしています。

よければ、[トレタメンバーのQiita](http://qiita.com/organizations/toreta)も見ていって下さい。
ブラウザの表示領域を差分でスクロール

例えば、縦スクロールする場合：

```js
var deltaY = 100;  // 差分
window.scroll(window.pageXOffset, window.pageYOffset + deltaY);
```


## Refs

- https://github.com/jquery/jquery/blob/49833f7795d665ff1d543c4f71f29fca95b567e9/src/offset.js#L181-L204
- https://developer.mozilla.org/ja/docs/Web/API/Window/scrollY
gitで管理している資材が編集してないのにeclipseで編集マークが付く

#ハマった

いつも作業するのにWindowsOSでcygwinを使っていた。
いつも通りGitBucketでリポジトリを作成し、ローカル資材をpushして、eclipseでインポートしたら、リポジトリ内の資材のすべてに `>` が付与された。

え、なんで！？

さっき`git init`して`add` -> `commit` -> `push`したばかりの資材。
ファイルを個別に開くことなんてしてないし、ローカルの履歴にももちろん何もない。
cygwinで`git diff`してもなにもない。
これが気持ち悪くてかなり解消するのに少し嵌りました。

#試行錯誤する

##Eclipseからコミットしてみる
最初は環境が壊れたか！？とか思ってテンパっててgoogleで
　"編集してないのにEclipseで編集マークがつく"
とかセンスのない検索をしてましたが、冷静になってみた。
まず、Eclipseが"これ編集されてるよ！"って言ってるくらいだからEclipseからだと変更がコミットできるのか？と思い、プロジェクトルートで`Team -> Commit`を実行してみた。

できた！
大量のファイルがcommit -> pushされたらしい。
そしてEclipse上の `>` は消えた。
何が起きた？？

これをGitBucketのほうでHistoryを確認してみると、

`File renamed without changes`

なんでー
差分がわからないよー

##Cygwinでdiffを確認する
ここで気づく。
あれ？EclipseからcommitしたからCygwinのほうのでpullする？
（ほんとはEclipseでインポートしてるから必要ない。。。）
しかしCygwinで`git diff`を実行すると大量の差分が！！

```
old mode 100644
new mode 100755
```

これだけ。
ファイル内の差分はなし。
うしろ３ケタは権限か？？
Eclipseでファイルの権限が書き換わってる？？？
よくわからないけどCygwinから再度`add -> commit -> push`
当然Eclipseのほうで `>` が復活。

よくわからないけどこれをキーワードにググる

#たどり着いた解決策
cygwinのほうで

`git config core.filemode false`

を実行。
ファイルモードをgitとしては無視するようなconfigなのかな。
（調べてない）

しかしこれを実行してEclipseのほうで資材をRefreshしたら `>` は消えてくれた。

#謎
今までもいろいろとCygwinでcloneしてEclipseでインポートはやってきたけど、なぜ今になってこんなことになったのか。。。
謎。。。

##参考
http://qiita.com/hishida/items/35d929845c0ac824b1c0
Force maven to update local-central

When run `maven clean package` and with pom.xml using a new released package, it will not take place immediately, you will get this error:

```
[ERROR] Failed to execute goal on project
...
...
... resolution will not be reattempted until the update interval of local-central has elapsed or updates are forced -> [Help 1]

```

You can wait and then run `mvn package` again, or force maven to update local central with the `-U` option:

```
mvn clean package -U
```

It will work.
TypeScriptでのイベント名をclickで指定するのはもう辞めよう

TypeScript(またはJavaScript)でイベント名を扱う場合は、`"load"`や`"click"`等、イベント名を直書きにすることが多いと思います。しかし、このようにイベント名を直書きしたコーディングを行うと、プロジェクトが大きくなるほど**タイピングミスに気づきにくく、バグの誘発につながります**。これを防ぐために、**[String enums](https://www.typescriptlang.org/docs/handbook/enums.html)を作り、一元管理することをお薦めします**。

# イベント名を直書きした処理
まずよく見受けられるプログラミング方法です。ウインドウをクリックした時にアラートを出す処理はTypeScriptで下記のように記述します。

```ts
// ウインドウをクリックした時の処理
window.addEventListener("load", () => alert("ウィンドウのロードが完了しました。"));
window.addEventListener("click", () => alert("clickされました。"));
window.addEventListener("mousemove", () => console.log("マウス移動しています。"));
```

`addEventListener()`メソッドの第一引数は、`"load"`・`"click"`のようにイベント名を直接文字列で記述しています。例えば複数の処理で`"click"`という文字列を使用すれば、その分だけタイピングミスとバグの危険性が上がります。

# String enumsを使った処理
上記と同じ処理を、イベント名を列挙したEnum「`EventName`」を使ったものが下記です。


```ts
/**
 * イベント名の列挙型
 */
const enum EventName {
  LOAD = "load",
  CLICK = "click",
  MOUSE_MOVE = "mousemove"
}

// EventNameクラスを使用してイベント名を指定する。
window.addEventListener(EventName.LOAD, () => alert("ウィンドウのロードが完了しました。"));
window.addEventListener(EventName.CLICK, () => alert("clickされました。"));
window.addEventListener(EventName.MOUSE_MOVE, () => console.log("マウス移動しています。"));
```

`addEventListener()`メソッドの第一引数では、`EventName.CLICK`という風に`EventName`を経由してイベント名を指定しています。文字列に誤りがあっても`EventName`の変数の値を１箇所だけ修正すればよいです。
Arduino M0 Proで赤外線LEDを使いたいときdelayMicroseconds()は絶対に信じてはいけない

# delayMicroseconds()
> パラメータで指定した時間(マイクロ秒単位)だけプログラムを一時停止する。1秒は1,000,000マイクロ秒である。
> [Arduinoリファレンス delayMicroseconds()](http://garretlab.web.fc2.com/arduino_reference/language/functions/time/delayMicroseconds.html)

# 赤外線LEDとArduino M0 Proで学習リモコンをつくりかたかった
家にあるリモコンの赤外線信号をArduino M0 Proに接続した[赤外線受信モジュール](http://akizukidenshi.com/catalog/g/gI-04169/)(動作電源3.3Vで使えるやつ)で読み取り、その情報をそのまま[赤外線LED](http://akizukidenshi.com/catalog/g/gI-03261/)で出力して学習リモコンを作ることにしました。
が、受信をうまくいっても送信がうまく行かず、、、試しに手元にあったArduino UNOで出力するとうまくいく。念のため、赤外線受信モジュールで赤外線LEDの信号をキャッチして調べてみると、Arduino UNOではほぼ近い値だったのに対し、Arduino M0 Proでは信号が凸凹と数値がずれていました。

# 原因はdelayMicroseconds()の精度
途方に暮れているときに出会った記事「[Intel Edison for Arduino の delayMicrosecondsの精度が悪い件](http://light-of-moe.ddo.jp/~sakura/diary/?p=184)」が解決のヒントに。なんと、Arduinoのモデルによって`delayMicroseconds()`の精度が変わってくるらしい。。。

# 対処法
先ほどの記事「[Intel Edison for Arduino の delayMicrosecondsの精度が悪い件](http://light-of-moe.ddo.jp/~sakura/diary/?p=184)」を参考に独自でwait()を実装。`delayMicroseconds()`と差し替えると無事動作しました。

```
int ledPin = 13;

// 赤外線信号
unsigned int data[] = {▲▲,▲▲,▲▲,▲▲,▲▲,▲▲...};

void setup() {
  pinMode(ledPin, OUTPUT);
}
 
void loop() {
  sendSignal();
  delay(3000);
}

/*
 dataからリモコン信号を送信
*/
void sendSignal() {
  int dataSize = sizeof(data) / sizeof(data[0]);
  for (int cnt = 0; cnt < dataSize; cnt++) {
    unsigned long len = data[cnt]*10;
    unsigned long us = micros();
    
    do {
      // cntが偶数なら赤外線ON、奇数ならOFFのまま
      digitalWrite(ledPin, 1 - (cnt&1));
      // キャリア周波数38kHzでON/OFFするよう時間調整
      wait(8);
      digitalWrite(ledPin, 0);
      wait(7);
      // 送信時間に達するまでループ
    } while (long(us + len - micros()) > 0); 
  }
}

/*
 マイクロ秒単位で待つ
*/
void wait(signed long wait_time) {
   signed long start_time = micros();
   while ( micros() - start_time < wait_time) {};
}
```

# おまけ
Arduino M0 Proは動作電源が3.3Vなため、そのままデジタルピンの出力で光らせようとすると電流が弱く全然家電が反応しません。そういうときはトランジスタを使って5Vから電源を確保するようにします。その辺りはまた改めてまとめたいと思います。

# 参考サイト
- [Arduinoリファレンス delayMicroseconds()](http://garretlab.web.fc2.com/arduino_reference/language/functions/time/delayMicroseconds.html)
- [Intel Edison for Arduino の delayMicrosecondsの精度が悪い件](http://light-of-moe.ddo.jp/~sakura/diary/?p=184)
- [Arduinoでリモコン作成](http://eikatou.net/blog/2012/07/1796/)
BrowserStackでブラウザのローカルテストをする

# 概要

[BrowserStack](https://www.browserstack.com)のローカルテスト環境を構築して、[Live](https://www.browserstack.com/start)を試すところまで。ローカルのテストや社内からしかアクセスできないWebページのテストを行うことができます。大体は[Test private, local or internal servers and local HTML, CSS & JavaScript folders instantly.](https://www.browserstack.com/local-testing)に書いてありますのでこちらも参照して下さい。

# アカウント作る

作ってない人は作りましょう。

# Chrome Extensionのインストール

[BrowserStackが提供するChrome Extension](https://chrome.google.com/webstore/detail/browserstack-local/mfiddfehmfdojjfdpfngagldgaaafcfo?hl=en)をインストールします。

# BrowserStackLocalのインストールと起動

https://www.browserstack.com/local-testing のDownload the appropriate binary辺りにバイナリが置いてあるのでダウンロードします。アクセスキー(上記ページのバイナリが置いてあるリンクのちょっと下か[設定ページ](https://www.browserstack.com/accounts/settings)を参照)を指定して起動します。

```
path/to/BrowserStack your-access-key
```

# Live画面での設定
https://www.browserstack.com/start で適当に機種を選んでLive画面を開きます。SETTINGSからServer TestingのResolve all URLs through my networkをチェックします。
<img width="798" alt="live画面での設定" src="https://qiita-image-store.s3.amazonaws.com/0/380/6c861918-0ed5-ba1e-2502-46903b723b23.png">

# 試してみる

index.htmlを作って、

```html:index.html
<!doctype html>
<html>
  <head><title>Hello world!</title></head>
  <body>
    <section>
      <h1>Hello world!</h1>
      <p>
        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
      </p>
    </section>
    <script>alert('hello world!');</script>
  </body>
</html>
```

こうします(これは各自お好きなようにしてください)。

```
python -m SimpleHTTPServer 8888
```

Liveで見てみます(それっぽいのが出た)。
<img width="804" alt="liveで見てみた" src="https://qiita-image-store.s3.amazonaws.com/0/380/e0cf09dd-b4d0-08d9-bbfa-551e71974e34.png">

DEVTOOLSを使ってみます。下に出ているChrome DevtoolsっぽいものはChrome自身のものではなくて、BrowserStack側で用意しているものです。ここからリモートで開いているブラウザのelementを操作したり、ConsoleからJavaScriptを実行することができます(凄すぎる)。
<img width="884" alt="DEVTOOLS開いた" src="https://qiita-image-store.s3.amazonaws.com/0/380/a84cde6d-bb7c-1d94-c164-bdb5929db0bd.png">

内容を書き換えてみる。
<img width="868" alt="内容を書き換えてみる" src="https://qiita-image-store.s3.amazonaws.com/0/380/64a85c8c-bf22-c625-dc19-eb2e5ac5f04e.png">

Consoleを使ってみる。
<img width="888" alt="Consoleを使ってみる" src="https://qiita-image-store.s3.amazonaws.com/0/380/c8e4e20f-0148-046f-4c2e-60cac1861a3e.png">

# まとめ
BrowserStackのローカルテストについて紹介しました。正直DEVTOOLSには驚愕しました。一つ注意としては、同時接続数に制限があり、複数タブで開いてたりすると繋がらないことがあります。

# 参考リンク

* [BrowserStack 公式](https://www.browserstack.com)
* [Test private, local or internal servers and local HTML, CSS & JavaScript folders instantly.](https://www.browserstack.com/local-testing)
JavaのYAMLライブラリ比較

|項目|JYaml|YamlBeans|SnakeYAML|jackson-dataformat-yaml|
|----|----|----|----|----|
|公式サイトURL|http://jyaml.sourceforge.net/index.html|https://github.com/EsotericSoftware/yamlbeans|https://bitbucket.org/asomov/snakeyaml/wiki/Documentation|https://github.com/FasterXML/jackson-dataformat-yaml|
|使用しているArtifacts一覧|http://mvnrepository.com/artifact/org.jyaml/jyaml/1.3/usages|http://mvnrepository.com/artifact/com.esotericsoftware.yamlbeans/yamlbeans/1.09/usages|http://mvnrepository.com/artifact/org.yaml/snakeyaml/1.16/usages|http://mvnrepository.com/artifact/com.fasterxml.jackson.dataformat/jackson-dataformat-yaml/2.6.2/usages|
|ソフトウェアライセンス|Creative Commons Attribution 2.0 License |https://github.com/EsotericSoftware/yamlbeans/blob/master/LICENSE|APL 2.0| Apache License 2.0|
|ドキュメトのわかりやすさ|○|◎|◎|△|
|機能の豊富さ|||○||
|ファイルからオブジェクト|○|○|○|○|
|オブジェクトからファイル|○|○|○|○|
|ストリーム|○||○|||
|アンカー|○|○|○||
|Transfer Mapping, Tag Shortcuts|○|○|○||
|ObjectWrappers|○||||
|Multiple Objects||○|○||
|yamlファイルのある階層以下だけ抽出||○|||
|Type Safe|||○||
|タグのカスタマイズ|||○||

ドキュメントわかりやすいし、機能豊富だし、Spring BeansやSpring Boot、PlayといったJavaやScalaの有名なフレームワークが使っているので、SnakeYAML使うことにしました！
実行された関数の内容を取得してみる。

何に使うのかはこれから考えるんですが、実行された関数の内容を取得する方法です。
下記のようにするとメソッドの記述をまるっと取得することができます。

```js
var test = function(){
   var txt1 = "テスト1だよー";
   console.log(arguments.callee+"");
}
test();//関数の内容がコンソールに出力される。
```

本当は関数を格納しているオブジェクト名を取得できないか調査していたのですが、
それは厳しそうです。

使い道はいまいちぴんとこないのですが、メソッドの内容に応じて処理をわけるようなものをつくるにはいいかなーと思いメモです。

参考)

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Functions_and_function_scope/arguments/callee

正直このたりまだ知識整理ができていないので、
つっこみ大歓迎です。（むしろいただきたいです。）
Cygwinのvimでctags

# Cygwinでctagsを利用する
割と昔にやったことなので、バージョンとかは適宜読み替えて下さい。

### ctagsのインストール

```
$ mkdir -p $HOME/local/bin
$ mkdir -p $HOME/local/src

$ cd $HOME/local/src/

$ wget http://prdownloads.sourceforge.net/ctags/ctags-5.8.tar.gz
$ tar zxf ctags-5.8.tar.gz
$ cd ctags-5.8

$ ./configure --prefix=$HOME/local
$ make
$ make install
$ echo $? (0ならコマンドが成功)
```

### .zshrcや.bashrcにパスを記述

```
export PATH=$HOME/local/bin:$PATH
```

### $HOME/.ctagsに設定を記述

```
--append=yes
--recurse=yes
--langmap=PHP:+.inc
--php-kinds=cfd
```

### ctagsの実行

コマンドの詳しくはここを参照
http://qiita.com/lazynick/items/6934341f135b1a8d2fe2

タグを作成したいフォルダで

```
ctags -R . 
```

でタグの生成

| コマンド            | 説明                                         |
|:-------------------|---------------------------------------------:|
| ctrl-]             | 関数・メンバの定義へ移動                       |
| g + Ctrl-]         | 複数関数の定義がある場合、どれに行くか選択できる |

### 参考
http://qiita.com/soramugi/items/7014c866b705e2cd0b95
swiftバグ取りメモ：追加したオブジェクトが表示されない

ボタンやラベルを追加したはずなのに、なぜか画面に表示されない…
そんな時のチェックポイントメモ。

# addSubviewをしていない
作ったボタンやラベルを、ビューに追加し忘れていたため、表示されない…

- [x] 対処方法：addSubviewする


```lang:swift
self.view.addSubview(myLabel)
```

# ボタンやラベルの色が薄い・小さいなど
作ったボタンやラベルの色が薄かったり、サイズが小さすぎたりして、どこにあるのか見つけられない…

- [x] 対処方法：ボタンやラベルに仮の色をつけて、どこにあるか確認

```lang:swift
myLabel.backgroundColor = UIColor.greenColor()
```

# 画面外に配置
作ったボタンやラベルを、画面外に配置しているため、表示されない…
（配置するx,yの値が、画面サイズからはみ出す値になっている…）

- [x] 対処方法：一旦、画面の真ん中に配置してみる

```lang:swift
myLabel.frame = CGRectMake(self.view.bounds.height/2, self.view.bounds.width/2, 100, 100)
```

# 後ろの方にひっそりある
作ったボタンやラベルの上に、他の画像やボタンなどが置かれているため、隠れて見えない…

- [x] 対処方法：前の方に持ってくる

```lang:swift
//ラベルを最前面に移動
self.view.bringSubviewToFront(myLabel)
```
data-params で POSTリクエストパラメタをいい感じに設定する

Stack overflow で発見したので、備忘のためにメモ。

http://stackoverflow.com/questions/4373022/rails-3-ujs-passing-in-params-when-using-link-to


```rb
link_to "Add to cart", cart_path, 
    data: { method: :post, remote: true, params: { product_id: 123 }.to_param }
```

と書いておくと、下記HTMLが生成される。


```html
<a data-params="product_id=123" data-remote="true" data-method="post" 
    href="/cart" rel="nofollow">Add to cart</a>
```

「Add to cart」をクリックすると、product_id=123 をパラメタとして /cart に xhr で POST リクエストされる。

芸が細かい。
sessionの中に何があるか知りたい。そんな時はto_hashメソッドを使おう。 Rails

sessionの中に何があるか知りたい。
そんな時は`to_hash`メソッドで簡単に取得できる。

```rb
session.to_hash
=> {"session_id"=>"id id id id id id id id id",
"warden.user.user.key"=>[[4319], "key key key key key key"],
"_csrf_token"=>"token token token token token token token token"}
```

`keys`メソッドを使えばこれらのkeyだけを配列で取り出せる。

```
session.keys
=> ["session_id", "warden.user.user.key", "_csrf_token"]
```
carrierwaveでundefined method `resize_to_fill'を怒られた時の対応


carrierwaveを使っている時にundefined method `resize_to_fill'と怒られる時は以下を確認してください。

- MiniMagickかRmagickがインストールされているかGemfile.lockを確認する
- 作成したuploaderファイルで上記のGemをインクルードしているか確認する

もし、インストールされていない場合はインストールを。
uploaderファイルでインクルードされていない場合は以下を参考にインクルードしてみてください。

```hoge_uploader.rb
class HogeUploader < CarrierWave::Uploader::Base
  # Include RMagick or MiniMagick support:
  # include CarrierWave::RMagick
  # include CarrierWave::MiniMagick
  
  # 上記の２行のインクルードの内、インストール済みのどちらかのコメントアウトを外してください。
```
mongodbのコマンド、クエリーメモ

最近、mongodbを触る機会があったので、使うことが多そうなmongodbのコマンド、クエリーについてまとめました。

###データベース一覧 
```
show dbs
```

###使うデータベースの選択、データベース作成 
```
use dbname
```
データベースがなければ作られます。

###データベース削除 
```
db.dropDatabase()
```

###コレクション一覧 
```
show collections
```

###コレクションコピー 
```
db.collectionname.copyTo("collectionname2")
```

###コレクション作成
```
db.createCollection("collectionname")
```

###コレクション削除
```
db.collectionname.drop()
```

###検索結果表示
```
db.collectionname.find({}).orderBy({col1: 1}).limit(10).skip(10).toArray()
db.collectionname.find({col1: "aaa", col2: {$ne: "bbb"}, col3: {$lt: 10}}, {col1: true}).sort({col1: 1, col2: -1}).limit(10).skip(10).toArray()
```
findの2つ目の引数は、表示、非表示にするカラムの指定です。
sortの値は1がasc昇順、-1はdesc降順になります。
skipはMySQL等のoffsetに該当します。

###データ作成
```
db.collectionname.insert({col1: "aaa", col2: "bbb", col3: "ccc"})
```

###データ更新
```
db.collectionname.update({col1: "aaa"}, {$set: {col1: "aaaa", col2: "bbbbb", col4: {a: 1, b: 2} }})
```
$setつけないとデータが丸ごと指定したものに更新されるので、要注意です。

```
db.collectionname.update({col1: "aaaa"}, {$unset: {col2: 1, col4.a: 1}})
```
$unsetで指定する値は影響しません。col4.aのように、入れ子になっている特定の値だけunsetすることもできます。

```
db.collectionname.update({col1: "aaaa"}, {$unset: {col2: 1, col4.a: 1}, {upsert: false, multi: true}})
```
updateは、デフォルトではデータ1つしか更新されません。複数のデータを更新したい場合は引数を追加してmulti: trueを指定します。
upsertオプションをtrueにすると、該当データがなければ作成されるようになります。

###データベースダンプ 
```
mongodump --db databasename --out dirname
```

指定したディレクトリが作成され、その中に データベース名のディレクトリ/各ファイル
という形でjson、bsonファイルが作成されます。

###データベースリストア
```
mongorestore --db databasename dirname
```
dirnameは、ダンプしたファイルやファイルの入っているディレクトリ名を指定します。
存在しないDB名を指定すれば、そのDBが作成されます。
Sun Grid Engine のコマンドの備忘録

- `qsub`
    - ジョブの投入
- `qdel`
    - ジョブの削除依頼
- `qstat`
    - ジョブの状態の一覧を見る
- `qstat -j #ID`
    - ジョブの詳しい状態を見る
- `qacct -j #ID`
    - 過去のジョブの詳しい状態を見る
- `qstat -g c`
    - キューの空き状況を見る
crontabのエラー、(CRON) bad minuteはただの改行の場合でも出る

タイトルでもうほぼ終了なのですが、
crontabを更新した後に、cronのエラーログ/var/log/cronを確認すると下記のエラー

```bash
Feb 23 13:29:01 localhost crond[4436]: (xxxxxx) RELOAD (/var/spool/cron/xxxxxx)
Feb 23 13:29:01 localhost crond[4436]: (CRON) bad minute (/var/spool/cron/xxxxxx)
Feb 23 13:29:01 localhost crond[4436]: (CRON) bad minute (/var/spool/cron/xxxxxx)
```

書式間違っちゃったかなと思い、確認するも明らかに正しいはず・・・
試しに全てコメントアウトしても上記のエラーが出る始末

よくよく見るとエラーの数と改行の数が一緒
crontabを改行なしにしてみると、エラーは出なくなりました


もうちょっとそれっぽいエラーにして欲しかった感。。。
CygwinでNeoBundleInstallした際のvimproc関連のエラー

新しい環境でCygwinがあったのでgithubから.vimrcをひっぱてっきて、NeoBundleInstallすると、vimproc関連の大量のエラーで画面が真っ赤に・・・

原因はCygwinにmakeとgccが入っておらず、vimprocのmakeができていないためだった
Playでバッチ処理をpluginで実装する

# きっかけ
バッチなど、バックグラウンドの処理をAkkaでスケジュールに登録した形で実装するのがplayでよくあると思います。そういった処理は、開発中やテスト中は止めておきたく、on/offを簡単にできるようにしたくなります。

そこで、playのplugin機能を使います。2.4からmoduleとなっていますが、pluginの方がわかりやすい面もあるのと、今使っているplayのバージョンが古いので、それで紹介してみます。

# play.Pluginの実装

自前のpluginをつくるにはplay.Pluginを実装します。

```lang:BatchPlugin.java

import play.Application;
import play.Configuration;
import play.Plugin;

public class BatchPlugin extends Plugin {

    private Logger logger;

    private Configuration conf;

   public BatchPlugin (Application app) {
       this.logger = LoggerFactory.getLogger(BatchPlugin.class);
       this.configuration = app.configuration();
   }

   /**
    * プラグインが有効かの判定.
    */ 
   @Override
   public boolean enabled() {
        return !"disabled".equals(conf.getString("batchPlugin"));
   }

   /**
     * アプリ起動時の処理.
     */
    @Override
    public void onStart() {
        logger.info("start batch");

        ActorRef actorRef =  Akka.system().actorOf(Props.create(BatchActor.class));
        Akka.system().scheduler().schedule(
                        FiniteDuration.Zero,
                        FiniteDuration.create(1, TimeUnit.DAYS),
                        actorRef,
                        "batch",
                        Akka.system().dispatcher(),
                        ActorRef.noSender());
        
    }

    /**
     * アプリ停止時の処理
     */
    @Override
    public void onStop() {
        logger.info("stop batch");
    }


}

```

play.Applicationだけを引数とするコンストラクタの定義と、enabled(),onStart(),onStop()を実装すればよいです。

enabled()の実装は、evolutionsと同じです。これでapplication.confに`batchPlugin=disabled`を追記すれば、Akkaでのスケジュール登録を止められます。

ActorRefのインスタンス生成はコンストラクタでやろうと思ったのですが、play.Akka.system()がそのタイミングでは起動していないようです。onStartでやらないと無限ループしました...

# まとめ

公式サイトにありますが、plugin機能は、他のアプリでも再利用できるようにするよりも、ひとつのアプリで内部的に使うのにも便利です。本番環境のときで動いて欲しいなど、特定のケースのみの機能はpluginに切り出すと、コード的にも運用的にも管理しやすくなります。

2.4から[DI](https://www.playframework.com/documentation/2.4.x/JavaDependencyInjection)で、moduleを注入するやり方がよいでしょう。`play.modules.enabled`と`play.modules.disabled`で、moduleを使うかどうかをコントロールできます。

[pluginからmoduleへの移行方法](https://www.playframework.com/documentation/ja/2.4.x/PluginsToModules)も公式で用意されています。

# 参考サイト

https://www.playframework.com/documentation/2.3.x/JavaPlugins

http://d.hatena.ne.jp/kamekoopa/20130306/1362561242

http://tototoshi.hatenablog.com/entry/2014/12/14/170745
GitHubがデフォルトで用意しているIssueラベルの意味

GitHubがデフォルトで用意している以下のIssueのラベルの意味

ラベル       | 意味
------------|------------------------------------------------------
help wanted | 助けを求める場合
bug         | バグの場合
duplicate   | すでに内容の重複したIssueが存在する場合
enhancement | 機能強化の場合
invalid     | 間違い、勘違い、実現不可の場合。対応しない内容を書いてクローズ
question    | 疑問がある場合
wontfix     | 対応しないバグ等がある場合。対応しない理由を書いてクローズ
Android logcatでスタックトレースが切り詰められるときのtips

自分でなんとかするしかないっぽい。

```java
public static void largeLogE(String tag, String content) {
    if (content.length() > 2000) {
        Log.e(tag, content.substring(0, 2000));
        largeLogE(tag, content.substring(2000));
    } else {
        Log.e(tag, content);
    }
}
```
コミット時にIssueをCloseする

コミット時に指定のフォーマットで記述すると自動的に、IssesがCloseされる

フォーマット一覧    |記載方法
-------------------|-------------------
fix                |fix #8
fixes              |This commit fixes #8 
fixed              |We have finally fixed #8 
close              |close #8
closes             |This closes #8 
resolve            |resolve #8
resolves           |resolves #8 
resolved           |resolved #8 

※#8 には、Issueの対応する番号を入れてください。

複数同時に、記載する場合は、カンマでつなげて記載する
#####記載例
This commit fix #8, fix #9, fix #10

どのフォーマットを使用しても、効果に違いはない。
ただ、コミットで残すものなので、意味の合うフォーマットでコミットしたほうが良い。

fix, fixes, fixed は、時制によって使う場面が異なる。しかしコミットタイトルは命令形・本文は現在形で書くのが普通なので、基本的には fix(es) を使用していればよい。

##参考資料
[公式ドキュメント(英語)](https://help.github.com/articles/closing-issues-via-commit-messages/#closing-multiple-issues)
Mac OS X,homebrewでインストールしたredisが自動起動出来ない問題

色んな方がredisのインストール方法は書いてくれているので、概ねその通りやればいけるはずなのですが、なぜか自動起動しなかった。

手順は単純にこれ。ちなみにtmux上でlaunchctlを使うとうまくいかないので注意(前にどハマりした)。

```
$ brew install redis
$ ln -sfv /usr/local/opt/redis/*.plist ~/Library/LaunchAgents
$ launchctl load -w ~/Library/LaunchAgents/homebrew.mxcl.redis.plist
```

こんな感じのログが出力されていた。

```
Feb 23 12:21:34 mac-mini com.apple.xpc.launchd[1] (homebrew.mxcl.redis): Service only ran for 0 seconds. Pushing respawn out by 10 seconds.
Feb 23 12:21:44 mac-mini com.apple.xpc.launchd[1] (homebrew.mxcl.redis[1959]): Service could not initialize: 15D21: xpcproxy + 12644 [1472][13E77DA5-3602-31BF-B074-49D4EE27E9D8]: 0xd
Feb 23 12:21:44 mac-mini com.apple.xpc.launchd[1] (homebrew.mxcl.redis): Service only ran for 0 seconds. Pushing respawn out by 10 seconds.
Feb 23 12:21:54 mac-mini com.apple.xpc.launchd[1] (homebrew.mxcl.redis[1961]): Service could not initialize: 15D21: xpcproxy + 12644 [1472][13E77DA5-3602-31BF-B074-49D4EE27E9D8]: 0xd
Feb 23 12:21:54 mac-mini com.apple.xpc.launchd[1] (homebrew.mxcl.redis): Service only ran for 0 seconds. Pushing respawn out by 10 seconds.
```

原因はこれ。ログファイルがroot権限になってた。

```
$ ls -l /usr/local/var/log/redis.log
-rw-r--r--  1 root  admin  46336  2 23 12:31 /usr/local/var/log/redis.log
```

一般ユーザーに権限を戻して再度lanchctl loadをかけたらちゃんと起動しました。

```
$ sudo chown username /usr/local/var/log/redis.log
```

lanchctlが全然原因のログを出してくれないのでちょっと手間取ってしまった。
ベトナムでオフショア開発をしてみる(5) 拳じゃなくてスナップショットで語る

GYAOの窓際エンジニア　玉利です。

日本で協力会社にお願いするのも嫌だと思う内製主義の会社はありませんか？GYAOもその手でした。思った通りのものが出来てこないからですね。

お店で注文したら、俺の食べたかったのはコレジャナイ的なものが出てきたことってありませんか？GYAOは赤坂付近にあるのですが、ちゃんとした麻婆豆腐が食べたくなり、付近の店を新規開拓に片っ端から回っているのですが毎回がっかりしっぱなしです。
 
![スクリーンショット 2016-02-23 12.28.05.png](https://qiita-image-store.s3.amazonaws.com/0/113049/909ddce0-d7ab-2cf2-b5d1-7e2b91fd8368.png)

 
ちゃんとした麻婆豆腐ってのは、こういうやつです。上に乗っかってるのは葉ニンニクでなければいけません。郫縣豆瓣醬  永川豆豉 漢源花椒と言わないまでも、似たような味の材料を使って欲しいです。その辺の店の新華僑系中華はだいたい、中国の高中（日本の高校）の調理科で習うレシピそのままの店ばっかりなんですよね。
 
そんな、俺の欲しいのはコレジャナイを防ぐためのテクニックを紹介します。
 
# スカイプMTGは実は時間の無駄
 
開発を進めるにあたり細かい部分は、直接会って指差ししながら進めないといけないのですが、日本とベトナムではそういうわけにも行きません。だいたい問題なんていうのは、発生したらすぐに解決しないと開発の流れが止まってしまい人件費コストが無駄になるので、すぐに電話でもなんでも話をして解決しなければいけないのです。

弊社でも国内業務委託さんにお願いすることがよくありますが、現場からは10m離れるだけで「やりにくい」とクレームが来ます。

そして、私の同僚は数千キロ離れたベトナムにいるのです。ついでに日本語が通じません。10mや別フロアに居るくらいでガタガタいう人、私が ~~シベリア~~ ベトナム送りにしてやります。
 
オフショアでよく使うスカイプMTGは有効な方法の一つですが、通訳さんの時間をおさえて、さらに画面の共有が難しいので想像させながら話をしなければいけないため、伝言ゲームの原因になります。出席者はなんとなく話をしたので気分的には満足するのですが、修正が上がってくると斜め上の実装がされていたりして「ちがう！直ってない！」と言われて困るのです。

それは、あなたの伝え方が悪いのです。エンジニアのせいではありません。

そしてこの問題は、伝え方のテクニックで回避することができます。

# 正しいIssue解決要望の方法

言語を超えてして誤解しようの無い、ひと目でわかる図面を作るに限ります。
 
スナップショットを撮る
パワポに貼る
直接赤字でここだと書く（日本語でおK）サンプルコードをかけると尚更良し

英語だったら：メッセンジャー、Github Issueなどに貼る
日本語だったら：通訳さんに渡し、ベトナム語にパワポ上で翻訳して伝えてもらう

ひたすらコレを繰り返すことで、ちゃんとモノができます。

![スクリーンショット 2016-02-23 12.21.08.png](https://qiita-image-store.s3.amazonaws.com/0/113049/37eac066-3d47-e6b1-5bdf-1277d48d7319.png)


 
# 企画さんにお願いする、正しいオフショア向け要望書の書き方
 
企画職人は、エクセルで飯を食ってます。例に違わず、エクセルに貼られた箇条書きで要望が出てくるものです。

それをそのまま現地に送ると「お前は何が言いたいんだ(How does it mean?)」とプーチン首相のように強烈な視線でベトナム人エンジニアから睨まれます。（コピペ画像は省略）

ついでに向こうから質問攻めをくらって、そんなことなら自分でやったほうが早いということになるのがオチです。更に「お前仕事が遅いよ」って企画職人から詰められるのです。
 
あなたの言いたいことはエクセルで1行かもしれないけど、その1行を確認するのにソース確認して画面取り込んで。。。3時間くらいザラにかかるんですけど。と言いたい。
 
解決策は、企画サイドにしっかりした資料を作ってもらうことです。逆に不十分な資料だったら、仕事を受けられないと正直に言いましょう。

ゴネられたら、「無理ムリ、あなたがコード書くならマージしてあげます」と言うようにしています。ついでにロジックが明らかにおかしいものに関しては、「それは醤油ラーメンにアイスクリームを乗っけるようなもので、あなたがコードを書いたとしてもマージできません」とはっきり伝えます。喧嘩腰ではないですよ。
 
# すべてパワポにしてもらう

これが慣れ親しんだパワポであれば、だいたいどんな企画さんでもできます。パワポ書けない企画さんは、企画じゃないでしょう。

* 画面を取り込んで、吹き出しや枠を囲ったりしながら要望を書いていってもらう
* エンジニアが、実現可能かどうかの確認をして、優先度の高いものから順番を並び替える。
* 趣味直しみたいなものは、レイアウトなど案外細かくて時間かかるので優先度を落とす
* 追加情報を書き込み終わったら、ベトナムチームの通訳さんに渡す
 
最初からできる人なんていないので、こうと決めたらひたすら赤ペン先生です。ここで、自分でやったほうが早いと思ってしまったら永遠に不毛な作業を押し付けられる構図が続いてしまうので、がんばって教え続けます。


* 良くない例
** 返却予定日が表示されていない 

* 良い例
** 現状で返却日予定日が表示できていない。
** 返却予定日は Column:Sendback_estimatedの値をとる。空の場合は納品予定日の2日後に設定する 

ちゃんとした資料は、言語を超えます。いままで誰かが見えない所で被ってた作業を可視化するというマネジメントができるようになるのが、オフショア成功のコツだと思います。
s3に定期的にあがるcsvファイルをrdsにロード。lambdaとdatapipelineで。

ちなみに、この構成はdatapipelineの値段が高くつくのでまったくおすすめしません。
普通にlambdaだけで実装したほうがよいです。
"s3にあがったら"みたいなイベント駆動のジョブは、datapipeline使うべきではないみたいです。
が、一応動くもの作ったのでメモ。


## 仕様をざっくり
30分に一回s3にアップされるcsvファイルをRDSにインサートする 
※csvファイル名は毎回異なる

## だいたいの流れ
1. s3にcsvファイルがputされてlambda発火
2. lambdaでdatapipelineを定義・作成・実行 
3. datapipelineがs3データをrdsにロード

#手順
## 0. 新規のdatapipelineのテンプレートとなるcomponentを作っておく
- s3データをrdsにロードするdatapipelineを作成
- 1日1回実行設定
- activateしないでおく
- lambdaこの定義をテンプレートとして利用して、新規datapipelineを作成する

## 1. s3の作成で発火するlambdaを定義する
## 2. lambdaでdatapipelineを定義・作成・実行するスクリプトを設定

node.jsを利用。datapipelineのaws-sdkを使う。

```js
console.log('Loading function');

var aws = require('aws-sdk');
var s3 = new aws.S3({ apiVersion: '2006-03-01' });

var dp = new aws.DataPipeline();

exports.handler = function(event, context) {
    // putされたs3ファイルパス
    var path = event['Records'][0]['s3']['object']['key'];
    
    var params = {
        name: 'test1',
        uniqueId: '1'
    }
    
    // DP設定を新規作成
    dp.createPipeline(params, function(err, createResult) {
        if (err) {
            console.log(err);
            throw true;
        }
        
        // 新規作成されたpipelineId
        var pipelineId = createResult['pipelineId'];
    
        var params = {
            pipelineId: 'template-pipeline-id' // テンプレートのid
        }
        
        // テンプレートから定義を取得
        dp.getPipelineDefinition(params, function(err, def) {
             if (err) {
                console.log(err);
                throw true;
            }
            
            // テンプレート定義を変更
            def['pipelineId'] = pipelineId;
            
            var p_values = def['parameterValues'];
            
            // s3のファイルパスをputされたs3ファイルに変更
            for (var i = 0; i < p_values.length; i++) {
                if (p_values[i]['id'] == 'myInputS3Loc') {
                    // s3の場所
                    p_values[i]['stringValue'] = 's3://backet/' + path;
                }
            }
            
            // 新規作成したDatapipeline項目に、変更した定義を登録する
            dp.putPipelineDefinition(def, function(err) {
                if (err) {
                    console.log(err);
                    throw true;
                }
                
                // 実行
                dp.activatePipeline({pipelineId: pipelineId}, function(err){
                    if (err) {
                        console.log(err);
                        throw true;
                    }
                        context.succeed(true);
                })
            });
        });
    });
};
```

これで、対象s3バケットにcsvファイルが上がると、pipelineが作成されてrdsにロードされた。
30分に一回だと1ヶ月に 720USD = (48times * 0.5USD * 30days) くらいかかりそうなので、全然意味わからない構成です。
activateされたdatapipelineの定義を変更できると安く済むのになぁと思いました。

ちなみに、この処理結局バッチサーバーで普通にcron実装することにしました。lambdaだとエラー時にアラート送れないので。
Goのバージョンを1.4.3→1.6にアップグレードできなかった

# 概要

[Goのバージョンを1.6rc2にアップデートしてみた](http://qiita.com/kanuma1984/items/245f7efafeaee5728523)の記事を参考にGo1.6をビルドしたが、エラーとなった。

# 環境

```bash
uname -m
amd64
```

```bash
uname -sr
FreeBSD 9.1-RELEASE-p22
```

# 手順

1. Go1.4.3をダウンロード
2. Go1.4.3をビルド
3. Go1.6をダウンロード
4. GOROOT_BOOTSTRAPをセット
5. Go1.6をビルド **←ここでエラー**


## 発生するエラー

```bash
##### Building packages and commands for freebsd/amd64.
（中略...）
cmd/pprof/internal/driver
cmd/pprof
cmd/yacc

run.bash: line 8: /home/mydomain/local/go/bin/go: cannot execute binary file: 無効な実行形式です
run.bash: line 38: /home/mydomain/local/go/bin/go: cannot execute binary file: 無効な実行形式です
run.bash: line 38: /home/mydomain/local/go/bin/go: No error: 0
```

エラー発生箇所の `run.bash：line 8` は、`eval $(go env)` でした。

ビルド失敗後、`$HOME/local/go/bin` にある `go` を実行してみましたが、おなじ実行形式エラーとなりました。


- <a href="http://golanghome.com/post/775" target="_blank">FreeBSD 上 1.5不能运行？ - Go友团</a>

自分が直面した問題に非常に似たケースの質問を見つけましたが、回答なし。。。:innocent: 

FreeBSD特有の問題なのでしょうか。
google日本語入力の変換候補に出てくる単語を削除（Mac）

メニューから「環境設定」を選びます
![スクリーンショット 2016-02-23 11.56.32.png](https://qiita-image-store.s3.amazonaws.com/0/7039/9d6c3761-7103-c4e3-60eb-b7c2ec74ad86.png)


「環境設定」の「サジェスト」タブを選択。
「全入力履歴を削除」をクリック
![スクリーンショット 2016-02-23 12.00.16.png](https://qiita-image-store.s3.amazonaws.com/0/7039/fc4eda5b-9d03-6fe9-2cea-fb813f1b58ec.png)

-----

※ ピンポイントで「この変換だけ削除したい〜」っていうのが出来るといいなあ。。。
[runstant] runstant lite のプロジェクトのデータをエクスポート、インポートするツール　作った


# これ

http://goo.gl/jS1WEW
[![image](https://qiita-image-store.s3.amazonaws.com/0/60690/090f66b7-6aa8-149b-f048-9f98e29f3863.png)](http://goo.gl/jS1WEW)

# 使い方

エクスポートするボタンでデータがダウンロードされます。

ここにドロップでインポートと書いてあるところに同じ形式のファイルを入れるとインポートされます。
完全に上書きするので、現時点でのプロジェクトのデータは消えます。

関係ないファイルを入れても、インポートされますが、runstant自体が使えなくなる可能性がありますので、やめましょう。

# ちなみに

プロジェクトのデータはタイトルごとに保存されていて、
http://lite.runstant.com/user
のPROJECTSタブで見ることができます。
Atomパッケージの作成と公開のメモ

# Atomのパッケージを開発する

```lang:shell
# 例えば~/githubあたりでパッケージを開発する
cd ~/github
cp <template_dir> <my_package_dir>

(もしくは、AtomのPackages->Package Generatorを使用する)
```

# gitで管理する

```lang:shell
# 管理する場合、gitリポジトリにする
git init

# （公開する場合）リモートを追加
git remote add origin <github's SSH URL>

# 最初はすべてのファイルをリポジトリの管理下にする
git add .

# コミットする
git commit -m "first commit"

# push = リモートを更新する
git push -u origin master

# -uオプション指定の為、次回以降はgit pushのみでOK
```

# 開発モード用にリンクを貼る
```lang:shell
# パッケージのディレクトリをカレントにして、下記コマンドを入力。
apm link --dev
```
開発モードではこのパッケージが優先されるようになる。

# 開発する
```lang:shell
# 開発モードでatomを起動する
atom -d <test_dir>
```

パッケージ更新時はAtomのリロードを行うこと。
Ctrl+Shift+F5(Windowsの場合)

# 開発オプション(-d)の挙動
~/.atom/dev/packagesにあるパッケージが読み出され、優先的に使用される。
このオプションを利用しない場合は、~/.atom/packagesのみが読み出される


# 開発パッケージとして登録
```lang:shell
# パッケージを開発パッケージとして登録する
apm develop <my_package_dir>

```
# (gitによる管理と公開が前提条件)公開する場合
```lang:shell
# atom.ioにログイン、トークンを入力し、ログインする
apm login

# バージョンが0.1.0、加算されてタグが作成、公開される
apm publish minor

# バージョンが0.0.1、加算されてタグが作成、公開される
apm publish patch
```
NetBeansで小文字から大文字に変換する(大文字から小文字)

メモ書き程度に案外使うショートカット

NetBeans
Ctrl-U then U Convert selection to uppercase
Ctrl-U then L Convert selection to lowercase

範囲選択して、Ctrl-U

ショートカットをEclipsに設定しているのなら
Ctrl+Shift+X 大文字変換
Ctrl+Shift+Y 小文字変換

定数とか作るときに役に立ってたりする。
Visio 2013のシェイプシートでハマって抜け出せなかった話

# 参考
http://ken-etsu-tech.blogspot.jp/2007/10/visio.html
ちょっと古いんですけど、Visio 2013でも概ねこの通り動きます。
しかし、ちょっとだけ文字を変えるともう動かない……

# OKケース
### 図形データ
ラベル　なんでもOK
種類　固定リスト
書式　10M;100M
値　どちらでもOK

### シェイプシート
=IF(Prop.Row_1="10M",0.25 pt,3 pt)

参考サイトはLANの線の太さをビットレートで変えるというサンプルです。

# NGケース
### 図形データ
ラベル　なんでもOK
種類　固定リスト
書式　OK;NG
値　どちらでもOK

### シェイプシート
=IF(Prop.Row_1="OK",0.25 pt,3 pt)

それを、OKとNGという文字に変えるともう動きません……
結局、投げ出しました……

# 結局何なのか？
色々調べてみたのですが、なかなか分からない。
固定リストって数字＋単位じゃないとだめなのかなとか……
種類を文字列に変えても効果なし。
エラーも出ないので時間の無駄すぎるなあ……