OmniAICreator/Qiita-1.07M huggingface dataset:
Vagrant+VirtualBoxでUbuntu環境構築

#1. VirtualBoxのインストール

### Homebrewを利用する場合（Macユーザにおすすめ）

```
$ brew install --cask virtualbox
```

### インストーラを利用する場合
[https://www.virtualbox.org/wiki/Downloads](https://www.virtualbox.org/wiki/Downloads) 
上記から自分の端末にあったパッケージをダウンロード＆インストールする。

#2. Vagrantのインストール

### Homebrewを利用する場合（Macユーザにおすすめ）

```
$ brew install --cask vagrant
```

### インストーラを利用する場合
[https://www.vagrantup.com/downloads.html](https://www.vagrantup.com/downloads.html) 
上記から自分の端末にあったパッケージをダウンロード＆インストールする。

#3. Boxの選択
[https://app.vagrantup.com/boxes/search](https://app.vagrantup.com/boxes/search)
上記からインストールするOSを探す。
※ProviderがVirtualBoxであるものを選択すること。

今回は、[bento/ubuntu-18.04](https://app.vagrantup.com/bento/boxes/ubuntu-18.04)を選択する。

#4. インスタンスの作成

インスタンスの内容は`Vagrantfile`に定義します。
`vagrant init` コマンドで初期状態の定義ファイルを作成できます。

```
$ vagrant init bento/ubuntu-18.04
$ vagrant up
```

#5. インスタンスへ接続

```
$ vagrant ssh
Welcome to Ubuntu 18.04 LTS (GNU/Linux 4.15.0-20-generic x86_64)

vagrant@vagrant:~$ 
```

#6. ポートフォワードの設定
`Vagrantfile`を編集し、再起動を行う。
（例）ホスト側8080ポートをゲスト側80ポートにフォワードする

```
$ vim ~/Vagrant/ubuntu-18.04/Vagrantfile
$ vagrant reload
```

```text:Vagrantfile
# config.vm.network "forwarded_port", guest: 80, host: 8080
config.vm.network "forwarded_port", guest: 80, host: 8080
```

#7. Vagrantのコマンド集
### 起動

```
$ vagrant up
```

### シャットダウン

```
$ vagrant halt
```

### 再起動

```
$ vagrant reload
```

### 状態確認

```
$ vagrant status
```

### 一時停止

```
$ vagrant suspend
```

### 復帰
一時停止中から復帰する。

--

(2021/09/27) 記事を更新しました。
- brewコマンドの体系が変わったため、virtual boxとvagrantのインストールコマンドを変更

(2020/11/2) お久しぶりです！以下の通り最新化しました！

- VirtualBox/VagrantをHomebrew Caskでインストールする場合の方法を記載
- その他、記載を見直し

(2018/9/11) 以下の通り最新化しました!

- vagrant initで指定するbox名を修正（@wdhappy_sさんコメントありがとうございます！）

(2018/8/25) 以下の通り最新化しました!

- Boxの取得先を[Vagrant Cloud](https://app.vagrantup.com/boxes/search)へ変更
- Ubuntuのバージョンを15.04から18.04へ変更

```
$ vagrant resume
```
keymap.csonに頼らずキーバインドを削除する


## キーマップの削除

通常、Atomのキーバインドを削除するには`keymap.cson`にて`unset!`と書く。

```coffeescript:keymap.cson
"atom-text-editor:not([mini])":
  "tab": "unset!"
```

この場合、ユーザー自身でCoreのキーバインドを削除する分にはいいが、パッケージでCoreのキーバインドを変更したい場合、`keymaps/[package].cson`に書いてしまうと顰蹙もののように思える。
`README.md`に書いてユーザーに設定を促すのもひとつの方法だと思うが、プログラムで制御してオプションのオン/オフでキーバインドの変更が出来ると便利ではないだろうか。

## キーマップを扱うには？

キーマップを扱う`KeymapManager`オブジェクトには`atom.keymaps`でアクセスできる。
キーマップを追加するには`atom.keymaps.add`メソッドを利用するが、削除はどうするのだろうか？
例のごとくAtomのソースコードを彷徨っていると[menu-manager-spec.coffee](https://github.com/atom/atom/blob/master/spec/menu-manager-spec.coffee)にこのような記載があった。

```coffeescript:menu-manager-spec.coffee
atom.keymaps.add 'test', 'atom-text-editor': 'ctrl-b': 'unset!'
```

`keymap.cson`に書くときと同じように`unset!`を渡せばよいようだ。
試しにデベロッパーツールのコンソールから下記の通り実行してテキストエディターでタブキーを押すと`editor:indent`ではなく`core:focus-next`が実行されてフォーカスがどこかに飛んでいった。

```javascript
atom.keymaps.add("Core", {"atom-text-editor:not([mini])": {"tab": "unset!"}});
```
【concrete5】属性一覧

構築時にどの属性を使うべきか検討する時、毎回管理画面を見て確認するのが面倒なので一覧を作りました。
抜けや間違いがありましたら指摘ください……。

# concrete5の属性一覧

## ページ属性
- テキスト
- テキストエリア（複数行）
- チェックボックス
- 日付／時刻
- 画像／ファイル
- 数字
- 評価
- 選択
- トピック

## ファイル属性
- テキスト
- テキストエリア（複数行）
- チェックボックス
- 日付／時刻
- 数字
- 評価
- 選択
- トピック

## ユーザー属性
- テキスト
- テキストエリア（複数行）
- チェックボックス
- 日付／時刻
- 数字
- 選択
- 住所
- トピック
- ソーシャルリンク
Groongaをmroonga経由でSQL利用したい

# Groongaをmroonga経由でSQL利用したい

## install mroonga 
```
brew install https://raw.github.com/mroonga/homebrew/master/mroonga.rb --use-homebrew-mysql
```  
mecabを使う場合は「--with-mecab」を付ける


### check install
```
SHOW PLUGINS;
```
| Name       | Status      | Type             | Library      | License     |
|:-----------|:------------|:-----------------|:-------------|:------------|
|            |             |                  |              |             |
| Mroonga    | ACTIVE      | STORAGE ENGINE   | ha_mroonga.so| GPL         |


入っていない場合は下記を実行

```
INSTALL PLUGIN mroonga SONAME 'ha_mroonga.so';
```

あるいは

```
mysql -uroot < /usr/local/.../share/mroonga/install.sql
```

## Sequel Proでの接続でエラーになる場合
```
mysql_upgrade -u[user] -p[password]
mysql.server restart
```

### Mac上で存在する5.6系に戻す場合は
```
brew switch mysql 5.6.27
```
CentOS6 の yum で kernel-header を install しようとしたらエラーになった場合の確認事項

# CentOS6 の yum で kernel-headers を install しようとしたら怒られた場合の確認事項

/etc/yum.conf を開く

```text
exclude=kernel*
```

となっていたらコメントアウトする

```text
# exclude=kernel*
```

これで、kernel-headers やら、kernel-devel を Install できるようになる。

Installした後は、元に戻しておきましょう。
電話番号のダミーデータを作成する


メモ

```sql
UPDATE table SET `mobile` = concat(
	IF(MOD(floor(10 * rand()), 2), '080', '090')
	, '-'
	, lpad(floor(10000*rand()),4,'0')
	, '-'
	, lpad(floor(10000*rand()),4,'0')
)
```
Xcodeのライセンス同意をコマンドラインだけで切り抜ける

Xcodeをアップデートした後、Homebrewを使おうとしたら、ライセンスに同意してないやんけボケェと怒られた。

毎度毎度、同意するためだけにXcodeを立ち上げるという苦行を強いられてきてウンザリしていたので、もうちょっと楽できないかな〜と調べたら、コンソール上でできることを知ったのでメモ。

## 作業手順

コンソールでおもむろにコマンドを叩く。

```bash
$ sudo xcodebuild -license


You have not agreed to the Xcode license agreements. 
You must agree to both license agreements below in order to use Xcode.

Hit the Enter key to view the license agreements at 
'/Applications/Xcode.app/Contents/Resources/English.lproj/License.rtf'
```

Enterを押せと言ってくるので、素直に押す。

すると長い規約が出てくる。スペースを押しながら読み進める。

あんまり良くないが、手を抜きたければ、```q``` を押せばいきなり同意するか聞いてくれる。

```bash
Apple Inc.

Xcode and Apple SDKs Agreement

PLEASE SCROLL DOWN AND READ ALL OF THE FOLLOWING TERMS AND 
CONDITIONS CAREFULLY BEFORE USING THE APPLE SOFTWARE OR APPLE SERVICES.  
THIS IS A LEGAL AGREEMENT BETWEEN YOU AND APPLE.  
IF YOU AGREE TO BE BOUND BY ALL OF THE TERMS AND CONDITIONS, 
CLICK THE “AGREE” BUTTON. 

・・・・・・

Software License Agreements Press 'space' for more, or 'q' to quit
```

で、 ```agree``` と入力。

```bash
・・・・・・

By typing 'agree' you are agreeing to the terms of the software license agreements. 
Type 'print' to print them or anything else to cancel, 
[agree, print, cancel] agree

You can view the license agreements in Xcode's About Box, or at 
/Applications/Xcode.app/Contents/Resources/English.lproj/Licens.rtf
```

これで無事、Homebrewが使えるようになった。

まったく、やれやれだぜ。
GNUPLOT COMMAND REFERENCE

#Gnuplot コマンド集　(メモ用)

# フォント
`set terminal pngcairo font "Times-Roman,12"`
`set ylabel "RMSD (\305)"`
↑オングストロームの表記。

## pm3d
set style data pm3d
set pm3d interpolate 10,10  # The two numbers 10,10 are the number of additional points along the x- and y-axis.
splot "out_pmf.dat" u 1:2:3

## label 
Placing label over mapped 3D graph in Gnuplot
set label "label in front" at 2.5,0.5 tc rgb "white" font ",30" front
set label 1 point pt 2 ps 3  at 4.90432, 3.14662 front

## transparent
set term png transparent truecolor

## set size (window size)
set size square
set size ratio 1 1

## set grid
set xtics 45
set ytics 45
set grid

## palette color
set palette rgbformulae 33,13,10
set palette defined (-1"black",0"blue",3.3"cyan",6.6"orange",10"red",11 "white")

## boxplot  #箱ひげ図
set key off  #hide labels
set style boxplot nooutliers  #hide outliers (point of out of range)
p 'all.dat' every 100 using (1.0):2:(0.3):1 with boxplot

## PAUSE
pause -1  #keep graph window from script

#座標のプロット
`set label 1 point pt 2 ps 3  at 7.8,-2.1 front # pt: pattern of shape, ps: point size`
↑frontって入れておくとカラーマップとか散布図のときに、下に埋もれずに図の最前面にラベルが表示される。 

## set style 
set style data lines  #plot data with lines
[ElasticBeanstalk] eb deployでTomcatにwarファイルのみをデプロイ


AWS ElasticBeanstalk + Tomcatの環境にgit管理下に無いwarファイルのみをデプロイするのに手間取ったので手順をメモ。
ebコマンドの実行環境を構築済みとします。

# eb initコマンドを実行
デプロイ対象のgitプロジェクトでeb initコマンドを実行すると.elasticbeanstalkディレクトリ配下にconfig.ymlが作成される。
# config.ymlを編集してコミット
.elasticbeanstalk/config.ymlにデプロイ対象のwarファイルを指定してコミット。
ここでのwarファイル名は何にしてもROOT.warとしてデプロイされる。
<pre>
deploy:
  artifact: fileName.war
</pre>
# warファイルを取得
デプロイサーバでgit cloneした後にプロジェクトのルートディレクトリにデプロイ対象のwarファイルを配置。
wget等を使うと一連の流れを自動化できるのでなお良し。
<pre>
wget http://hostname/path/to/warfile
</pre>
# eb deployコマンドを実行
eb deployコマンドを実行後しばらく待つとElasticBeanstalkにデプロイされる。

参考
[プロジェクトフォルダの代わりに圧縮ファイルをデプロイする][link1]
[link1]:http://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/eb-cli3-configuration.html#eb-cli3-artifact
Unityで画像をプリンター印刷するだけ。

#Unityから保存した画像をそのまま印刷したかったので。
アス比等は引き伸ばされます。印刷するやり方だけ。

1.Pluginsフォルダに『System.drawing.dll』を配置
:::note info
※突っ込みが入ってたので追加。
　unityインストールフォルダ内のSystem.drawing.dllを使ってください
:::
2.以下のスクリプト動かすだけ


```lang:print.cs
using UnityEngine;
using System.Collections;
using System.Drawing;

public class Print : MonoBehaviour {

	// Use this for initialization
	void Start () {
        //PrintDocumentオブジェクトの作成
        System.Drawing.Printing.PrintDocument pd =
            new System.Drawing.Printing.PrintDocument();

        //PrintPageイベントハンドラの追加
        pd.PrintPage +=
            new System.Drawing.Printing.PrintPageEventHandler(pd_PrintPage);
        //印刷を開始する
        pd.Print();
    }

    private void pd_PrintPage(object sender,System.Drawing.Printing.PrintPageEventArgs e)
    {
        //画像を読み込む
        Image img = Image.FromFile("ファイルパス");
        //画像を描画する
        e.Graphics.DrawImage(img, e.MarginBounds);
        //次のページがないことを通知する
        e.HasMorePages = false;
        //後始末をする
        img.Dispose();
    }
}
```

コードはこちらから引用
>http://dobon.net/vb/dotnet/graphics/printdocument.html 

プリンターは通常使うプリンターに設定されているもの
また印刷用紙サイズに引き伸ばされます。
Scalaでファイルの内容を１行にまとめる


複数行に分かれている内容をカンマ区切りで１行にまとめる。

```
import scala.io.Source

object read {
  def main(args: Array[String]):Unit = {
    val filename= args(0)
    val s = Source.fromFile(filename)
    try {
      println(s.getLines.toList.mkString(","))
    } finally {
      s.close
    }
  }
}
```
【Swift2.x】指定した長さのランダムな文字列を出力する



Swift 2.xで指定した長さのランダムな文字列を出力する（メモ）

# サンプルメソッド #

```lang:
    func randomStringWithLength(length: Int) -> String {
        let alphabet = "-_1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
        let upperBound = UInt32(alphabet.characters.count)
        return String((0..<length).map { _ -> Character in
            return alphabet[alphabet.startIndex.advancedBy(Int(arc4random_uniform(upperBound)))]
            })
    }
```

# 実行例 #

```lang:
        let str = randomStringWithLength(30)
        print(str)
```

# 実行結果 #

```lang:
        V4B6ODMLAWnTIhTKS4OoPtprYs91uE
```
rails 2 系を bundler で動かしてみる


古いプロジェクトのデバッグで、rails2 系 を修正しないと行けなくなり、
プロジェクト毎に入れたくて(システムグローバルの gem にも、rbenv の gem にも入れたくない)
bundler で悪戦苦闘した時の備忘録です。

### rack のバージョンが合致しない

rails2.3.8 は rack 1.1.6 を要求するのに、
ruby script/console すると actionpack/lib/action_controller.rb が rack <~1.0.1 を要求してくる。

通常の gem なら複数バージョンインストールすれば解決するのですが、bundler 経由のため複数バージョンいれられません。
そこで action_controller.rb の 36行目に `~> 1.0.1` と書かれるているので、下記の様に書き換える。

```vendor/rails/actionpack/lib/action_controller.rb
gem 'rack', '~> 1.1.0'
```

#### その時のエラーログ

```
[root $] bundler exec ruby script/console development
Loading development environment (Rails 2.3.5)
/var/www/rails_project/config/../vendor/rails/railties/lib/initializer.rb:271:in `require_frameworks':RuntimeError: can't activate rack (~> 1.0.1, runtime), already activated rack-1.1.6. Make sure all dependencies are added to Gemfile.
/usr/local/rbenv/versions/1.8.7-p371/lib/ruby/gems/1.8/gems/bundler-1.6.2/lib/bundler/rubygems_integration.rb:262:in `gem': can't activate rack (~> 1.0.1, runtime), already activated rack-1.1.6. Make sure all dependencies are added to Gemfile. (Gem::LoadError)
	from /var/www/rails_project/vendor/rails/actionpack/lib/action_controller.rb:34
	from /var/www/rails_project/vendor/rails/activesupport/lib/active_support/dependencies.rb:156:in `require'
	from /var/www/rails_project/vendor/rails/activesupport/lib/active_support/dependencies.rb:156:in `require'
	from /var/www/rails_project/vendor/rails/activesupport/lib/active_support/dependencies.rb:521:in `new_constants_in'
	from /var/www/rails_project/vendor/rails/activesupport/lib/active_support/dependencies.rb:156:in `require'
	from /var/www/rails_project/vendor/rails/railties/lib/console_app.rb:2
	from /var/www/rails_project/vendor/rails/activesupport/lib/active_support/dependencies.rb:156:in `require'
	from /var/www/rails_project/vendor/rails/activesupport/lib/active_support/dependencies.rb:156:in `require'
	from /var/www/rails_project/vendor/rails/activesupport/lib/active_support/dependencies.rb:521:in `new_constants_in'
	from /var/www/rails_project/vendor/rails/activesupport/lib/active_support/dependencies.rb:156:in `require'
	from /usr/local/rbenv/versions/1.8.7-p371/lib/ruby/1.8/irb/init.rb:254:in `load_modules'
	from /usr/local/rbenv/versions/1.8.7-p371/lib/ruby/1.8/irb/init.rb:252:in `each'
	from /usr/local/rbenv/versions/1.8.7-p371/lib/ruby/1.8/irb/init.rb:252:in `load_modules'
	from /usr/local/rbenv/versions/1.8.7-p371/lib/ruby/1.8/irb/init.rb:21:in `setup'
	from /usr/local/rbenv/versions/1.8.7-p371/lib/ruby/1.8/irb.rb:54:in `start'
	from /usr/local/rbenv/versions/1.8.7-p371/bin/irb:13 
```
ペラ系WebのJavascriptヨハプラクティス


QiitaではjavascriptはSPAやフレームワークありきのサービス志向が多いけれど、そうじゃないWebサイトの作り方はあまり載っていない説。

サービス系じゃないペラのWebサイトなどを作るJavascriptの考え方をまとめてみます。

最近のjsはMVCとかFLUXとかいって複雑化しすぎていっているので、そのへん捨てて、かつての気楽なフロントエンドJSを取り戻しましょう。

## ビルドシステム

特別なことが無い限り`gulp`+`browserify`+`babel`でビルドします。

## 設計

ペラのサイトではOOPなんてコストなだけ。
結局jQueryでゴネるのを重ねるのにOOPはあまりにも高級すぎでは？。

jQueryでゴネる部分は、関数型プログラミングっぽく処理を連結していって、
部分部分で、OOPで作ったプラグインを入れ込んでいくのがスマートな気がする。

```js:processes.js
//処理をパーツに分けてObjectに格納。
export const cue = {
  getApi(){
    return new Promise((resolve, reject)=>{
      $.get("/api.json")
        .done(resolve)
        .fail(reject)
    })
    console.log(1)
  },
  firstProcess(){
  	//直列でjqueryなりプラグインなり
    console.log(2)
  },
  asyncProcess(){
  	//api受け取って反映ごにょ
    console.log(3)
  },
};
```

こんなかんじでプロセス書いていって。

```js:main.js
import {cue} from "processes.js"

(function(){
  cue.getApi()
    .then(cue.asyncProcess)
    .catch(console.error)
    
  cue.firstProcess()
})()

```
こんな感じで実行。
処理のフローだけを書くことに集中する。
複雑な値の受け渡しはしないように注意。あくまでも直列に考える。

ちょっとでもめんどくさい処理はすぐに、classに分割してプラグイン化



※こうすることにより、処理のフローとロジックを分ける事ができる。
※単体テストもやろうと思えば簡単。
※結局ペラサイトはいかにjQueryを繋げるか芸なので、極端な話インラインでつらつら書いてもなんとかなる。



## New featuresの使いドコロ

### class


classのskeltonです

```js:class.js

import {Vector3} from "vector"

exports default class Point extends Vector3{
  constructor({x,y,z}){
    super(x,y,z)
    /* code */
  }
}

```

ポイント
1. class定義ファイルはdefault一個だけexportする。
2. 引数は、Object matchingで受け取る。
3. モジュールだよ！モジュール！




### async/awaitどうするか。

ペラサイトにおいてのasync/awaitは, ajaxじゃなくてtween。
このへんの処理の流れを綺麗に書ける人はイケてるエンジニア。

じゃあ、TimelineMaxでってなるかもしれんけど、そんなにアニメーション連結させてどうすんだって。Webサイトじゃなくてアニメーション作品じゃねーか。

ってなるので、そこは `async.js` / `Promise` / `Generator` を使いこなすのがナウい。


```js:tweens.js
import {Tween} from TWEEN

//Tweenを分けてObjectに格納。
const tweenCue = {
  tw11(){ return new Promise(resolve=>{
    // なんかTweenのアニメーション1
    // onUpdate = resolve
  })},
  tw12(){ return new Promise(resolve=>{
    //なんかアニメーション2
  })},
  tw21(){
    //なんかアニメーション3
  },

  //generator
  *start(){
  	// 一回目
  	this.tw11()
  	  .then(this.tw12)
  	
  	yield //一回目はココで止まる

  	//二回目はここからスタート
  	this.tw21()
  },
};

//とある箇所で
tweenCue.start().next()

```

作るときはちょっとめんどくさいけど、呼び出す側がシンプルに。
アニメーションは、パラメーター調整のしやすさが鍵なのでちょっとコードが面倒でも我慢しよう。あとで楽になるはず。

アニメーションのパラメーターは後で動的に変えられるように、別ファイルに格納すると調整が効きやすい。もちろん、こだわりたいのであればの話だけど。


# 余談

processingやoFを書くときに近い。
あれに近いことやればいいじゃんってのが、発想のもと。

意外とやってる人いない。（ようなきがする。）

あと、THREE.JSとかPIXI.JSとかはフルフルでOOPしないときつい。

上で書いた話ってjqueryありきの考え方なんかなー。
とおもうけど、とても楽ちん。
Xcodeで開発速度を1.4倍くらい上げるスニペットは今すぐ使うべき

#Before

![sample.gif](https://qiita-image-store.s3.amazonaws.com/0/24979/755c7481-5927-e0d0-5f66-6973961109bf.gif)


#After
![sample2.gif](https://qiita-image-store.s3.amazonaws.com/0/24979/c216a54c-dcf6-91eb-e8bb-f04e2d53e6d9.gif)


#よく使うのは全部突っ込んでおくと吉
UITableViewのdelegateとかUIBarbuttonとかUIAlertControllerとか
スニペットを作っておくと補完に出てくる

#スニペットの作り方
スニペット化したいコードを範囲選択して長押しクリック
そのままXcodeの右下(Storyboardとかでパーツが置いてあるところの{}をクリックして)のスニペットがあるところに入れる

#Completion Shortcut
スニペットのEditでこれを指定しておくと、この文字を入れた時に補完に出てくる

#とはいえ
基本はクラスを作って冗長にならないようにするのが基本
GitBucketのrootパスワードが分からなくなった時


GitBucketはデータの保存先としてJava製のRDBであるH2データベースを使用しています。

GitBucketにログインするアカウントの情報もH2データベースで管理されているので、rootのパスワードが分からなくなった時などでも、データベースを直接操作することでパスワードをリセットすることができます。

先日そんなことがあったのでメモ。

## GitBucketの停止

GitBucketが起動している間はH2データベースのファイルはロックされているため、まずGitBucketを停止します。

```
$ service gitbucket stop
```

## H2データベースコンソールの起動

H2データベースに含まれているデータベースコンソールを起動します。
H2データベースのJARファイルはGitBucketのWARファイル中にあります。

```
$ java -cp 【gitbucket.warファイルを展開したディレクトリー】/WEB-INF/lib/h2-1.4.180.jar org.h2.tools.Shell -url jdbc:h2:【GitBucketのデータが保管されているディレクトリー】/data -user sa -password sa
```

## パスワードのリセット

GitBucketのユーザー情報はACCOUNTテーブルで管理されており、パスワードはPASSWORDフィールドにSHA1ハッシュとして格納されています。新しいパスワードの文字列からSHA1ハッシュを生成し、PASSWORDフィールドを更新することでパスワードがリセットできます。

```
sql> UPDATE ACCOUNT SET PASSWORD='【SHA1ハッシュ】' WHERE USER_NAME='root';
```

## GitBucketの再開

最後にGitBucketを再開するのを忘れずに。

```
$ service gitbucket start
```
List<T>をArrayListに変換する拡張メソッド

# はじめに
自作クラスのListの内容をCSVにはきだしたいという事案が発生した。
いちいちメンバを１つ１つ書いていくのは面倒ですよね。
てことでList<T>をArrayListに変換する拡張メソッドを作成した。
正確にはLINQ to Objectも受け入れたかったのでIEnumerableの拡張にしました。
これでいちいちClassの内容を取り出さなくても大丈夫。。。かも。

# 拡張メソッド本体
```csharp
/// <summary>
/// List<T>拡張メソッド
/// </summary>
static class ListExtensions
{
	/// <summary>
	/// Listに格納されたClassデータをArrayListに変換
	/// </summary>
	/// <typeparam name="T">型</typeparam>
	/// <param name="list">コレクションデータ</param>
	/// <returns>
	/// ArrayListデータ
	/// </returns>
	public static ArrayList ToArrayList<T>(this IEnumerable<T> list)
	{
		// null または データがない場合
		if (list == null || list.Count() == 0) return new ArrayList();

		ArrayList result = new ArrayList();

		foreach (T data in list)
		{
			// PropertyInfoを取得
			PropertyInfo[] props = data.GetType().GetProperties();
			// MemberTypeで絞らない場合SelectだけでOK
			var q = props.Where(x => x.MemberType == MemberTypes.Property).Select(x => x.GetValue(data)).ToArray();
			// 配列に追加
			result.Add(q);
		}

		return result;
	}
}
```

# 使い方
```csharp
List<Employee> empList = new Employee();
ArrayList array = empList.ToArrayList<Employee>();
```
Swiftで配列内のクラスと構造体の値を変更してみる

Swiftのクラスのインスタンスは参照型、構造体のインスタンスは値型だというのは、ご存じでしょう。
クラスは実態が1つ、構造体は都度実態が生成されるといった感じです。
ではその理屈でいくと、配列の値がクラスだったり構造体だったりした場合に、配列内に入れたオブジェクトをいじる時、構造体だと参照型だから一度変数に入れてその後差し替えなくちゃいけないの？となりますよね。
意外と混乱しやすいポイントかと思って、検証コードを書いてみました。

## クラスの場合

```swift:class
class Hoge {
    var fuga = 0
}
let array = [Hoge(), Hoge()] // letでOK
// forEachで配列データをいじる
array.forEach { $0.fuga = 1 }
array // [{fuga 1}, {fuga 1}]

// mapで配列のデータをいじる
let _ = array.map { $0.fuga = 2 }
array // [{fuga 2}, {fuga 2}]

// 直接いじる
array[1].fuga = 3
array // [{fuga 2}, {fuga 3}]
```
forEach、mapとも取得したインスタンスの変数に直接値を入れても、参照型なので元のデータが変わるのが確認できます。
array自体もletで問題ありません。

## 構造体の場合


```swift:struct
struct Hoge {
    var fuga = 0
}
var array = [Hoge(), Hoge()] // varにして配列自体を変更可能にしておく
// forEachで配列データをいじる (元の値は変わらない)
array.forEach { (var data) in
    data.fuga = 1
}
array // [{fuga 0}, {fuga 0}]
// mapで配列のデータをいじる (入れ替える形になる)
array = array.map { (var data) in
    data.fuga = 2
    return data
}
array // [{fuga 2}, {fuga 2}]
// 直接いじる
array[1].fuga = 3
array // [{fuga 2}, {fuga 3}]
```

構造体の場合、まずarrayをvarで宣言します。letだと配列の中身が構造体の場合なにも変更できません。
forEachでは、渡されるデータの変更はエラーになりできません。では渡されるデータをvarにしたらどうなるかというと、そのキャプチャーのみ変更できるだけで、元のデータには影響しません。
mapでも同様で渡されたデータをいじっても元のデータには影響しません。上記のコードでは値を変更した構造体を返しているので、あらたに配列が生成されているのと同じことになります。
最後に配列を直接いじってみましょう。直接元の構造体のインスタンスをいじるのと同じなので、変更は反映されました。
forEachもmapもクロージャに入ってくる値はコピーされた値だということですね。

どちらも一長一短です。
クラスのほうが楽にみえますが、意図せずmapのクロージャ内でデータをいじってしまい、元の値が変わったのに気がつかないというパターンも考えられます。
この特性を覚えておいて、適材適所で使い分けるようにしましょう。
DateTimeFormatterなんか使い方間違ってる？？

```
groovy> import java.time.LocalDate; 
groovy> import java.time.ZoneId; 
groovy> import java.time.format.DateTimeFormatter; 
groovy> def date = LocalDate.of(2015,12,29) 
groovy> println date 
groovy> date.format(DateTimeFormatter.ofPattern("YYYY.MM", Locale.getDefault())) 
 
2015-12-29
Result: 2016.12
```

2015.12って表示してほしいんだけど。。。

追記）わかった。。。

https://docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatter.html

大文字のYはその週が何年かってのを出すらしい。

```誤）
date.format(DateTimeFormatter.ofPattern("YYYY.MM", Locale.getDefault()))
```

```正）
date.format(DateTimeFormatter.ofPattern("yyyy.MM", Locale.getDefault()))
```
Play Framework 2.4でURLの末尾スラッシュに対応


### やりたいこと

`http://hogehoge/login`
`http://hogehoge/login/`

上記のパターン両方アクセスしたい。

### 解決策
http://stackoverflow.com/questions/13189095/play-framework2-remove-trailing-slash-from-urls

上記のリンクの通りやればできた。

ただし`play2.4`の場合はactionがstaticではアクセスできないので注意。

```
GET  /*path/  controllers.Application.untrail(path: String)
```

`java`

```
public Result untrail(String path) {
   return movedPermanently("/" + path);
}
```

これでスラッシュなしに転送される（301）
PropelのCriteriaの闇

情報があるうちにまとめとく

適宜追記

特定のカラムを選択
http://ameblo.jp/akaminemaru/entry-10860270182.html

```php
$c = new Criteria();
//select columnsを空にする。
//なぜ空にしないといけないかは知らんｗ
$c->clearSelectColumns();
//ここでカラム指定
$c->addSelectColumn(HogePeer::HOGE_ID);
//doSelectではエラーになるので注意
$rs = HogePeer::doSelectRS($c);
//こいつやらないと、getString('NAME')で取得できない。
$rs->setFetchMode(ResultSet::FETCHMODE_ASSOC);
$result;
while($rs->next()){
$result= $rs->getString('NAME');
}
```
PHPで文字列からクラスのインスタンスを生成

前提として`stdClass`というクラスが定義済みです。

```php
$Class = 'stdClass';
$obj = new $Class;
```

注意:文字列から直接生成することはできない

```php
new 'stdClass'; // エラー
new ('stdClass');//でも同じ
```
Macのopenコマンドっぽくgitのリポジトリからgithubのページを開く

※追記
`hub browse`の方が便利

----

.zshrc的なファイルにこんな感じで書くとはかどります

```zsh
:open() { open https://github.com/`git config --get remote.origin.url | gsed "s/^.*://" | gsed "s/.git//"` }
```


```zsh
:open
```

開発がんばろう
簡単にCentOS タイムゾーンの設定をする

# タイムゾーンを日本時間に変更する。

動作確認は CentOS release 6.4 (Final)で行いました。

## タイムゾーンを指定します
```sudo vim /etc/sysconfig/clock
ZONE="Asia/Tokyo"#タイムゾーンを指定します```

## localtimeというファイルを作成します
```sudo cp /usr/share/zoneinfo/Asia/Tokyo /etc/localtime```

## 本当に変わったか確認します
```date 2016年  1月  8日 金曜日 16:41:21 JST ```
想定通りに日本時間になりました。
Scala:ドメインイベントのバージョンを型で表現するアイディア

イベントソーシングでAggregate Rootを再構築するようなアーキテクチャだと、イベントの進化(Evolving events)がどうしても問題になってくる。Domain Eventの属性が増減したり、リファクタリングでリネームされたり等。

イベントソーシングでは、イベントストアは不変ということで、一度登録したイベントは書き換えない[^1]。Event Upgraderなどをアプリ側に組み込んで、イベントを最新のバージョンに上げていくような実装になってくる。

前提として、イベントが最新かどうかを判断するためには、イベントのバージョンもイベントストアに記録されてないといけない。

真っ先に思いついたのが、Domain Eventの属性に持たせてしまうというもの。

```scala
case class AccountCreated(
  userId: UserId,
  username: Username,
  password: Password,
  occurredOn: Date,
  occurredBy: UserId,
  eventVersion: Int = 1
) extends DomainEvent
```

これでもいいのだけれど、

* Aggregate RootでDomain Eventを作るときに、うっかり`eventVersion`を上書きしてしまう危険性がある
* ドメインモデルの属性と、インフラレイヤーの属性が混ざってしまい好ましくない
* イベントバージョンの指定漏れがあった

といった課題があった。

こういった課題を解決するためのアイディアとして、イベントバージョンを型で表現する方法を検討している。

```scala
// define your own Domain Event common interface
sealed trait EventVersion
trait Version1 extends EventVersion
trait Version2 extends EventVersion
trait DomainEvent {
  val occurredOn: Date
  val occurredBy: UserId
}

// Domain Event
case class AccountCreated(
  userId: UserId,
  username: Username,
  password: Password,
  occurredOn: Date,
  occurredBy: UserId
) extends DomainEvent with Version1

// Value Objects
case class UserId(id: Int) extends AnyVal
case class Username(username: String) extends AnyVal
case class Password(password: String) extends AnyVal
```

Domain Eventインスタンスのイベントバージョン確認方法

```scala
val event = AccountCreated(
  UserId(91),
  Username("alice"),
  Password("p@ssW0rd"),
  new Date,
  UserId(1)
)

def getEventVersion(event: EventVersion) = event match {
  case _: Version1 => "v1"
  case _: Version2 => "v2"
}

println(getEventVersion(event)) // v1
```



[^1]: 変えずにこしたことはないが、業務上やむを得ないときはイベントストアを改ざんするのもありだというのが個人的な考え。
ViewPagerで，アイテムが選択されたときにコールバックを受ける

# ViewPager#OnPageChangeListenerではダメなことが

一番最初に思いつくのが， `ViewPager#OnPageChangeListener.onPageSelected(int position)` なんですが， **setAdapter直後** は呼ばれません．
[StackOverFlow - onPageSelected doesn't work for first page](http://stackoverflow.com/questions/16074058/onpageselected-doesnt-work-for-first-page)

そのため，setAdapterしたら，カレントのアイテムを確認して操作したいとか，表示を変更したいということができません．

# Adapter側にコールバックを作る

`PagerAdapter` に `setPrimaryItem(ViewGroup container, int position, Object object)` がありますので，これを用いるようにします．

```java:MyPagerAdapter.java
private int mLastActionedPrimaryItemPosition = -1;
public class MyPagerAdapter extends PagerAdapter {
   @Override
    public void setPrimaryItem(ViewGroup container, int position, Object object) {
        if (mLastActionedPrimaryItemPosition != position) {
            if (mListener != null) {
                mListener.onPageSelected(container, object, position);
            }
            mLastActionedPrimaryItemPosition = position;
        }
    }

    public interface OnCurrentItemChangeListener {
        void onPageSelected(@NonNull ViewGroup container, @NonNull Object object,
                int position);
    }
}
```

```java:MyActivity.java
@Override
public void onCreate(~) {
  final ViewPager viewPager = ~;
  viewPager.setAdapter(new MyPagerAdapter(new OnCurrentItemChangeListener() {
    @Override
    void onPageSelected(@NonNull ViewGroup container, @NonNull Object object,
                int position) {
      // ここに処理を書く
  }));
}
```

ただ，この `setPrimaryItem` は，レイアウト計算が走るたびに呼ばれますので， **1度だけ呼ばれるとは限りません．**
そのため，setPrimaryItemでは，メンバでキャッシュしている `mLastActionedPrimaryItemPosition` の値が変わったらコールバックを呼び出すようにします．

# Thanks!

[Android Slackグループ](https://android-jp.slack.com/messages/general/team/kuchinashi/) のみなさま
知恵を貸して頂きありがとうございました．
CoreOSをインストールしてから接続するまで

前提
==============================
* systemdを採用している。サービス管理はすべて`systemctl`から。ログを見たいときは`journalctl`を使用する。
* パッケージマネージャーは存在しない。サービスはDockerで賄う。
* システムファイルは原則として上書きできない。設定変更は[cloud-config.yml](https://coreos.com/os/docs/latest/cloud-config.html)を通じて行う。
* ローリングアップデートで自動的にOSアップデートがかかる。


インストール
==============================
いくつかやり方があり、CoreOSを立てる環境に応じて適切なものを選ぶ。

* [ISOからブートして、スクリプトでインストールする方法。](https://coreos.com/os/docs/latest/installing-to-disk.html)
* VMwareだとCoreOS側で配布している[ovaイメージ](https://coreos.com/os/docs/latest/booting-on-vmware.html)があるので、これを利用してデプロイする。Thin Provisioning推奨。
* [さくら](http://cloud-news.sakura.ad.jp/2014/07/17/public-archives-and-iso-images-update/)、[ConoHa](https://www.conoha.jp/conoben/archives/2071)、[DigitalOcean](https://www.digitalocean.com/community/tutorial_series/getting-started-with-coreos-2)などメジャーなVPSやクラウドであればイメージが準備されている（特にDigitalOceanのチュートリアルがすごい）。EC2に至っては[CoreOS側でドキュメントを用意している](https://coreos.com/os/docs/latest/booting-on-ec2.html)。

ネットワーキング
==============================
原則としてDHCPによりIPを自動取得して、SSHで繋がせることを前提としているが、固定IPで使用したい場合は`cloud-config.yml`を使用する。

```yaml:cloud-config.yml
coreos:
  units:
    - name: static.network
      content: |
        [Match]
        Name=ens*
        [Network]
        Address=192.168.1.1/24
        Gateway=192.168.1.250
        DNS=192.168.1.50
```

秘密鍵認証以外でのログイン
==============================

## 認証回避

あまりないとは思うが、ローカルから入る場合。まず認証を外して入る方法。

1. GRUBのboot menuで矢印キーでdefaultでの起動を選択し、`e`を押下してboot optionを開く。
2. `load_coreos mout.usr=PARTUUID=$usr_uuid coreos.autologin`になるよう修正して`C-x`でbootする。

## パスワード認証

パスワード認証でsshしたい場合には、やはり`cloud-config.yml`での設定となる。

```yaml:cloud-config.yml
users:
  - name: yourname
    passwd: hashed password
    ssh-authorized-keys:
      - "ssh-rsa AAAA..."
```

自動アップデートの停止
==============================
まだ運用開始して間もないので自分はいまいちわかってないのだが、どうも自動アップデートのときに（当然ではあるが）勝手に再起動もかかるようなので、嫌であれば自動アップデートは停めた方が無難。

```yaml:cloud-config.yml
coreos:
  update:
    reboot-strategy: "off"
```

cloud-config.yml
==============================
書き方に関しては公式を見ておけば困らない。

[coreos-cloudinit/cloud-config.md at master · coreos/coreos-cloudinit](https://github.com/coreos/coreos-cloudinit/blob/master/Documentation/cloud-config.md)

起動時に自動で読み込まれて反映されるが、手動で再読込したいときは下記コマンド。

```bash
$ sudo coreos-cloudinit --from-file /usr/share/oem/cloud-config.yml
```
c++ builder > [未解決] SetLocalTime()実行のための設定 > 失敗

```txt:動作確認
C++ Builder XE4
```

SetLocalTime()を実行する場合、administratorでないとうまく実行できないのは知っていた。

以下を見つけた。
http://ryo021021.hatenablog.com/entry/2014/01/16/151809

[コントロールパネル]-[管理ツール]-[ローカルセキュリティポリシー]-[ローカルポリシー]-[ユーザ権限の割り当て]-[システム時刻の変更]
にてユーザを追加する。

上記を設定しPCを再起動後にSetLocaltime()をやってみたが、失敗する。

ドメインユーザが問題かどうか未解決。

別途、以下の情報も見つけた。
http://d.hatena.ne.jp/s-kita/20110409/1302342240
Rundeck でローカルコマンドを実行する際に sudo パスワードを指定する


Rundeck には [Secondary Sudo Password Authentication](http://rundeck.org/docs/plugins-user-guide/ssh-plugins.html#secondary-sudo-password-authentication) というのがあって、
リモートノードに SSH した後の sudo で必要になるパスワードを設定することができます。
*"sudo -u otheruser /sbin/some-command"* ってやつです。

ローカルコマンドを実行する際にもココに書かれている方法で sudo のパスワードが指定できるかと思ったのですが、、、
*secondary* ぢゃないから無理のようです。
試行錯誤の末、なんとかやり方は見つけたのでメモを残しておきます。

## 環境

* Rundeck 2.6.1
* CentOS 6.6

## sudo のための準備

RPM パッケージからインストールすると、Rundeck の実行ユーザーは `rundeck` になります。

まずは  `rundeck` ユーザーを *sudoers* へ追加し、
（このユーザーアカウントには [パスワードが設定されていませんので・・・](https://github.com/rundeck/rundeck/blob/v2.6.1/packaging/rundeck.spec#L31L33) ）パスワードを設定します。
とりあえずパスワードは *hogemoge-2828* にしたとしましょう。

また、環境によっては以下の設定などが必要になったりします。

```
Defaults:rundeck !requiretty
```

## Job Option で sudo パスワードを設定

こんな感じで Job Option を追加します。

* Job Name - 任意の名前（`sudoPassword` である必要はありません）
* Default Value - `rundeck` ユーザーアカウントに設定したパスワード（省略すると Job 実行のたびにパスワード入力が必要になります）
* Input Type - *Secure* を選択
* Required - 必須なので *Yes* を選択

![rundeck-execute_locally_a_command_with_sudo_password-job_option.png](https://qiita-image-store.s3.amazonaws.com/0/23886/2a3a4d7c-c5e7-2cfc-35d7-570460462562.png "rundeck-execute_locally_a_command_with_sudo_password-job_option.png")

最下部 **Usage** がポイントです。

## Workflow で sudo パスワードを指定

前述の *Usage* で、追加した Job Option の値を参照することができます。
`root` ユーザーとして *whoami* するだけのサンプルで試してみます。

### Command

*Node Steps* で *Command* を選択した場合は以下の通りです。

**Bash:**

```
echo $RD_OPTION_SUDOPASSWORD_HOGEMOGE_2828 | sudo -S whoami
```

**Commandline Arguments:**

```
echo ${option.sudoPassword_hogemoge-2828} | sudo -S whoami
```

### Script / Script file or URL

*Script* もしくは *Script file or URL* を選択した場合もほぼ同じです。

**Script Content:**

```
echo @option.sudoPassword_hogemoge-2828@ | sudo -S whoami
```

### 実行結果

こんな感じです。
![rundeck-execute_locally_a_command_with_sudo_password-log_output.png](https://qiita-image-store.s3.amazonaws.com/0/23886/8fc8d1b1-db6c-3437-e37d-cdf33ed720a7.png "rundeck-execute_locally_a_command_with_sudo_password-log_output.png")

### その他

*Local Command* だとダメです。
Job Option の参照は `${option.sudoPassword_hogemoge-2828}` でイケますが、パイプラインなどが解釈されず、以下のようなログが出力されてしまいました。
単なる *echo* になってますね・・・。

```
rundeck | sudo -S whoami
```

*LocalExecNodeStepPlugin* では対応していないんですかね。
ソースコードを読めばわかるかもしれません。

## うむ。イマイチですな・・・

無理やり sudo パスワードを指定できるようにしましたが、
`rundeck` ユーザーのパスワードを Job ごとに設定 or 変更しなければならないなんて苦痛でしかありません。
**NOPASSWD** はチョットドウナンダロウ・・・とか思っていたのに、むしろコッチのほうがセキュリティリスク高くないですかね。
*Key Storage* が使えないのはかなり痛いです。
これならパスワードなしでもいいかなー
RubyでCSVのURLから画像をダウンロードする

## Ruby標準ライブラリCSVを使用
> [リファレンス](http://docs.ruby-lang.org/ja/2.2.0/library/csv.html)
>要約
>>CSV (Comma Separated Values) を扱うライブラリです。

投入用のサンプルCSV

```data.csv
id,url
1,http/example.com/foo.png
2,http/example.com/bar.png
3,http/example.com/foobar.png
```

CSVファイルと同じディレクトリにsave_image.rbを配置して実行

```save_image.rb
require 'CSV'
require 'open-uri'

def save_image
  table = CSV.table('data.csv')
  save_dir = 'path/to/images/'

  # create directory,if not exist.
  FileUtils.mkdir_p(save_dir) unless FileTest.exist?(save_dir)

  table.each do |row|
    @url = row.field(:url)
    file_name = File.basename(@url).chomp
    file_path = save_dir + file_name
    
    open(file_path,'wb') do |output|
      open(@url) do |data|
        output.write(data.read)
      end
    end
  end
end
```

保存先に指定したディレクトリに画像がダウンロードされてたら完了です
CSVライブラリ最高です
MAMPの設定(SSIや複数のローカルホスト)

```
この記事ではMac OSX(10.10.5)をつかっています。
OSX 10.10.5（14F27）
MAMP バージョン 3.0.7.3 (3.0.7.3)
```

複数人で複数のサイトの保守を担当しているのですが、共有しているMAMPの設定です。
この記事では以下のことについて説明しています。
(1)インクルードファイルを表示できるようにする
(2)複数のローカルホストを立てる



## (1)インクルードファイルを表示できるようにする
SSIを採用してるとMAMPでは初期状態ではそれらの共通パーツが読み込まれないままなので、httpd.confファイルを編集して表示されるようにします。

編集するファイルは以下
/Applications/MAMP/conf/apache/httpd.conf

200行目辺り

```lang:オリジナルのソース
<Directory />
Options Indexes FollowSymLinks
AllowOverride None
</Directory>
```
```lang:変更後のソース
<Directory />
Options Indexes FollowSymLinks ExecCGI Includes
AllowOverride All
</Directory>
```

501行目辺り

```lang:オリジナルのソース
#AddType text/html .shtml
#AddOutputFilter INCLUDES .shtml
</IfModule>
```
```lang:変更後のソース
AddType text/html .shtml
AddOutputFilter INCLUDES .shtml .html .htm .php
</IfModule>
```
インクルードファイルの表示のために必要な変更は以上です。

## (2)MAMPで複数のローカルホストを立てる
MAMPではローカルの複数のディレクトリを起点としてサーバたてられるようです。
↓作業ごとに、いちいちこのウィンドウでルートの設定をし直すのめんどくさいですよね。
![45a15f8a-db48-99b5-079b-cfea9bbb936b.png](https://qiita-image-store.s3.amazonaws.com/0/95896/bc6ac42b-fad6-6d38-9135-3e3e2702f1fd.png)



編集するファイルは2つあります。
一方はインクルードの時と同じです。
/Applications/MAMP/conf/apache/httpd.conf
/Applications/MAMP/conf/apache/extra/httpd-vhosts.conf

**[/Applications/MAMP/conf/apache/httpd.conf]**

```lang:オリジナルのソース
# Virtual hosts
#Include /Applications/MAMP/conf/apache/extra/httpd-vhosts.conf
```
```lang:変更後のソース
# Virtual hosts
Include /Applications/MAMP/conf/apache/extra/httpd-vhosts.conf
```


**[/Applications/MAMP/conf/apache/extra/httpd-vhosts.conf]**
ファイルの末尾にローカルホストの数だけ以下のようなブロックを記述していきます。
記述するパスはどちらも同じ(ローカルホストに指定したい場所)でOKです。

```lang:8001ポートを使ってローカルホストを立てる
Listen 8001

<VirtualHost *:8001>
    DocumentRoot "/Users/UserName/XXXX/XXXX"
    <Directory "/Users/UserName/XXXX/XXXX">
        AllowOverride All
    </Directory>
</VirtualHost>

```
デフォルトでは8888になるポート番号をそれとは別に指定するので、
チームでポート番号を合わせると便利そうです。例えば
8001:サイトA
8002:サイトB
8003:サイトC
8004:サイトD
にするなど。

![unnamed.jpg](https://qiita-image-store.s3.amazonaws.com/0/95896/192faba4-80c6-54fe-cb71-3b2817febe9b.jpeg)

設定ができたらMAMPを再起動して指定したポートにアクセスしてみましょう

```
http://localhost:8001/
```
ポート番号を連番にしておくなどすると便利そうですね。




参考にさせていただいたサイト
http://qiita.com/tsukishimaao/items/cab4caa065d901608856
http://blog.sakurachiro.com/2011/11/mamp-vhosts-ssi/
[Linux]cron設定する時


いつもcron設定するときにさまようので、さまよう事のないためのレシピ。


## 設定内容

```
#Auto Data Update
0 6 * * * /home/bohe/shell/auto_update.sh > /home/bohe/logs/auto_`date +"\%Y\%m\%d"`.log
```
### 時間設定

```
分　時　日　月　曜日　コマンド
```

* 曜日	0～7 [0,7は日曜日] 

### ログ設定

* 上書き

```
> 
```
  
* 追加書き込み

```
 >>
``` 

### 出力ログに日付をつける

```
`date +"\%Y\%m\%d"`
```


設定したら、動作しているかどうかをログで確認しよう

### ログ

```
/var/log/cron

```

## 動いていない場合

* crondは動いていますか？

```
# /etc/rc.d/init.d/crond status
crond (pid xxx) を実行中...
```

* 動いていない場合は起動

```
# /etc/rc.d/init.d/crond start
```

* runlevel 2,3,4,5 で cron を起動させていること

```
# chkconfig --level 2345 crond on


# chkconfig --list crond
crond           0:off   1:off   2:on    3:on    4:on    5:on    6:off
```

* （参考）ランレベル

Linux では、ランレベルと呼ばれる動作モードを指定する事によって、サーバーの動作を変える事が可能になります

　0	システムの停止
　1	シングルユーザーモード
　2	マルチユーザーモード（NFSなし）
　3	マルチユーザーモード（テキストログイン）
　4	未使用
　5	マルチユーザーモード（グラフィカルログイン）
　6	システムの再起動
　

## 監視を考えて

* Kazuho@Cybozu Labs: crontab を使って効率的にサービス監視する方法 
http://developer.cybozu.co.jp/archives/kazuho/2010/01/crontab-f131.html

小規模なお客さんのサーバなどの運用をしている場合には、cronlogでできますね。
これは使えます。

* cron で > /dev/null して椅子を投げられないための3つの方法 - 酒日記 はてな支店 http://sfujiwara.hatenablog.com/entry/20120613/1339547638

ログファイルは蓄積されてしまうので、logger(1) コマンドを使用して syslog に送って記録するのがおすすめという例がかかれてあります。
これでOKですね。


* 多重起動を防ぐシェルスクリプト - zenpouの日記 
http://d.hatena.ne.jp/zenpou/20080715/1216133151

多重起動を回避するためのスクリプトです。
Redmine 0.8.3.stable(mysql)のデータをRedmine 3.2.0.stableへ移行する。

# はじめに

現在稼動しているRedmine 0.8.3のデータを、Redmine 3.2.0へデータ移行を行います。
今回はRedmine 3.2.0サーバはこちらで構築したものを使います。

# 1.移行準備
この作業は現在稼動しているサーバで行います。

##### 1-1.データベースのバックアップ
mysqldumpコマンドでファイルをバックアップします。

```cmd:コマンド
# mysqldump --user root —password=[パスワード] --single-transaction --opt --default-character-set=binary [DB名] > ./redmine_backup.sql
```

##### 1-2.添付ファイルのバックアップ
redmineをインストールしたディレクトリにfilesというディレクトリがあるので、その配下のファイルをtarなどでまとめます。

```cmd:コマンド
# tar czvf redline-file.tar.gz /var/www/redmine/files
```

##### 1-3.設定内容の確認
redmineをインストールしたディレクトリにconfigというディレクトリがあるので、その配下にあるymlファイルの情報をメモしておきます。
例.
・database.ml
・email.yml
・settings.yml
etc...


# 2.移行作業
この作業は移行先となる新サーバで作業を行います。

##### 2-1.データベースの作成
DBへ接続し、新規データベースを作成します。

```cmd:コマンド
mysql> create database redminedb default character set utf8;
```

##### 2-2.リストア
データベースを作成したら、旧サーバでバックアップしたデータをリストアします。

```cmd:コマンド
# mysql -h [DBホスト名] -P 3306 -u dbuser -p[パスワード] redminedb < redmine_backup.sql
```

##### 2-3.設定ファイルの修正
旧サーバでメモしたymlファイルの情報を反映させます。
注意点としては旧サーバでemail.ymlに記載していた内容はconfiguration.ymlに記載されます。
また、DBの接続先ホスト名が変わる場合はdatabase.ymlを修正も必要です。

##### 2-4.マイグレーション
redmineを置いたディレクトリへ移動し、rakeコマンドでマイグレーションを実行します。

```cmd:コマンド
# cd /var/www/redmine/

# rake db:migrate RAILS_ENV="production"
-----
StandardError: An error has occurred, all later migrations canceled:

undefined method `inherit_members?' for #<Project:0x00000005368260>/var/www/redmine/vendor/bundle/ruby/2.0/gems/activemodel-4.2.5/lib/active_model/attribute_methods.rb:433:in `method_missing'
-----
```

エラーが発生しました。どうやら_inherit_members_が定義されていないということのようなので作成します。

```cmd:コマンド
# mysql -h [DBホスト名] -P 3306 -u dbuser -p

mysql> use redminedb;

mysql> alter table projects add column inherit_members boolean default false;
```

##### 2-5.再度マイグレーション

```cmd:コマンド
# rake db:migrate RAILS_ENV="production"
-----
StandardError: An error has occurred, all later migrations canceled:

Mysql2::Error: Duplicate column name 'inherit_members': ALTER TABLE `projects` ADD `inherit_members` tinyint(1) DEFAULT 0 NOT
-----
```

またエラーが発生しました。次はinherit_membersが重複してるという内容です。先ほど作成しろと言われて作成したのですが。。。
とりあえず、今度は先ほど作成したinherit_membersを削除します。

```cmd:コマンド
# mysql -h [DBホスト名] -P 3306 -u dbuser -p

mysql> use redminedb;

mysql> alter table projects drop column inherit_members;
```

##### 2-6.再々度マイグレーション
気を取り直してもう一度マイグレーションを実行。

```cmd:コマンド
# rake db:migrate RAILS_ENV="production"
```

無事マイグレーションが完了しました。

##### 2-7.クリーンナップ
キャッシュとセッションファイルをクリアします。

```cmd:コマンド
# rake tmp:cache:clear
# rake tmp:sessions:clear
```

##### 2-8.Apacheの起動
最後にApacheを起動します。

```cmd:コマンド
# /etc/init.d/httpd start
```

以上で移行が完了です。


# 3.最後に

基本はDBで扱う情報の持ち方を修正することなんだろうなと作業していて思いました。なのでどのバージョンへの移行も、この手順で対応できるのではないかなと思います。
ポイントは「rakeコマンドでマイグレーションを行った際に出力されるエラーをよく見て、columnの追加や削除を行う。」だと思います。
docker-machineでvirtualboxに仮想マシンを作って再起動したらデータが消えたなとおもったら

# 結論

***/がtmpfs(RAMディスク)なので、再起動すると消える***

# 概要

[docker-machine upgradeするときの注意点 vagrant と busybox を使用している場合 - Qiita](http://qiita.com/manabuishiirb/items/7c1b2d1bf43ae3c36a4f)

上の記事を書いた時に、docker-machine upgrade したあとに、/home以下などが消えたように思ったので、調べてみた。

/home/docker 以下や、/usr/local/bin の下などが消えたが、作成したコンテナが残っていたので、何が消えるのか気になった。


## 確認

### docker-machine create で仮想マシンから作る
以下のコマンドで仮想マシンを作成

```
docker-machine create -d virtualbox disktestremove
```

実際のログ

```
$ docker-machine create -d virtualbox disktestremove
Running pre-create checks...
Creating machine...
Waiting for machine to be running, this may take a few minutes...
Machine is running, waiting for SSH to be available...
Detecting operating system of created instance...
Provisioning created instance...
Copying certs to the local machine directory...
Copying certs to the remote machine...
Setting Docker configuration on the remote daemon...
To see how to connect Docker to this machine, run: docker-machine env disktestremove
```

### docker-machine stop start

作成後sshしてみた

```
docker-machine ssh disktestremove
```

適当なファイルを、/home/docker以下に作る

```
docker@disktestremove:~$ touch create.txt
docker@disktestremove:~$ ls -l
total 4
-rw-r--r--    1 docker   staff            0 Jan  8 03:30 create.txt
-rw-r--r--    1 docker   staff           69 Jan  8 03:28 log.log
docker@disktestremove:~$
```

exitでぬけたあと、
docker-machine で stop start してみる。

```
docker-machine stop disktestremove
docker-machine start disktestremove
```

ファイルがない

```
docker@disktestremove:~$ ls -l
total 0
```

### マシンの中から再起動
ファイルを作る

```
docker@disktestremove:~$ touch sudoreboot.txt
docker@disktestremove:~$ ls -l
total 0
-rw-r--r--    1 docker   staff            0 Jan  8 03:33 sudoreboot.txt
```

再起動

ファイルがない

```
docker@disktestremove:~$ ls -l
total 0
```


### ファイルシステムを確認
/  以下がどのようなファイルシステムか確認する。
tmpfs であることがわかる。

```
docker@disktestremove:~$ df -h
Filesystem                Size      Used Available Use% Mounted on
tmpfs                   896.6M    123.8M    772.8M  14% /
tmpfs                   498.1M         0    498.1M   0% /dev/shm
/dev/sda1                18.2G     44.5M     17.2G   0% /mnt/sda1
cgroup                  498.1M         0    498.1M   0% /sys/fs/cgroup
/dev/sda1                18.2G     44.5M     17.2G   0% /mnt/sda1/var/lib/docker/aufs
```

tmpfs であることがわかる。

### /etc/fstab を確認

/ のファイルシステムは、/etc/fstabに書かれているわけではないようだ。
カーネルのオプションとか、コンパイル時組み込まれているのかは調べていない。

```
docker@disktestremove:~$ cat /etc/fstab
# /etc/fstab
proc            /proc        proc    defaults          0       0
sysfs           /sys         sysfs   defaults          0       0
devpts          /dev/pts     devpts  defaults          0       0
tmpfs           /dev/shm     tmpfs   defaults          0       0
/dev/zram0  swap         swap    defaults,noauto   0       0
/dev/sda1       /mnt/sda1       ext4     noauto,users,exec    0 0 # Added by TC
/dev/sda2       none            swap     defaults             0 0 # Added by TC
/dev/sr0        /mnt/sr0        auto     noauto,users,exec    0 0 # Added by TC
```
C# と　X++ の違い

X++とは、Dyanamics AX といういわゆる「もしもマイクロソフトが会計ソフトをつくったら」というものの専用言語です。
雰囲気的には C# に似ていて、C#を知っていたら、１日ほどで吸収できます。

●そもそも論として、なぜそんな言語を使っているの？
　Dyanamics AX はもともと、IBM のアプリケーションで、Javaで作成されていて、データアクセスに関して、
　Dyanamics AXのデータを扱いやすいようにJavaのスーパーセットとしてつくられていました。
　で、なんだかんだで、MSさんに買収されて今に至ると・・・

参考リンク
　　[X++ プログラム言語の概要](http://www.infoq.com/jp/news/2011/08/X-Plus-Plus)

前ふりはさておき、違いは以下にまとまっています

[X++, C# Comparisons \[AX 2012\]] (https://msdn.microsoft.com/ja-jp/library/cc967357.aspx)
--------------------------------------------------------------------------------
[X++ と C# の違い: Hello World](https://msdn.microsoft.com/ja-jp/library/cc967415.aspx)
[X++ と C# の違い: ループ](https://msdn.microsoft.com/ja-jp/library/cc967439.aspx)
[X++ と C# の違い: Switch](https://msdn.microsoft.com/ja-jp/library/cc967402.aspx)
[X++ と C# の違い: 文字列Caseとデリミタ](https://msdn.microsoft.com/ja-jp/library/cc967424.aspx)
[X++ と C# の違い: 配列の構文](https://msdn.microsoft.com/ja-jp/library/cc967423.aspx)
[X++ と C# の違い: コレクション](https://msdn.microsoft.com/ja-jp/library/cc967436.aspx)
[X++ と C# の違い: キー・バリューのコレクション](https://msdn.microsoft.com/ja-jp/library/cc967409.aspx)
[X++ と C# の違い: 例外](https://msdn.microsoft.com/ja-jp/library/cc967369.aspx)
[X++ と C# の違い: 例外後の再試行の自動化](https://msdn.microsoft.com/ja-jp/library/cc967407.aspx)
[X++ と C# の違い: オペレーター](https://msdn.microsoft.com/ja-jp/library/cc967420.aspx)
[X++ と C# の違い: プリコンパイラ命令](https://msdn.microsoft.com/ja-jp/library/dd252587.aspx)
[X++ と C# の違い: クラス](https://msdn.microsoft.com/ja-jp/library/cc967413.aspx)
[X++ と ANSI SQLの違い: SQL Select文](https://msdn.microsoft.com/ja-jp/library/dd261457.aspx)
整数配列の連続区間をグループ化するやつやってみた

[整数配列の連続区間をグループ化するアレをScalaでやってみた](http://qiita.com/YukiAsu/items/126adaeaa471eea665cc)

を読んで面白そうだったので自分も書いてみた。  
元の記事の方ではワンラインで書いてるけど、自分は普通(?)に書いてみた。


```scala
object Main extends App {
  val sample = Seq(1, 2, 3, 4, 5, 8, 9, 10, 13, 14, 20, 22)

  def group_mini(seq: Seq[Int], s: Int, e: Int): Seq[(Int, Int)] = seq match {
    case Nil => Seq((s, e))
    case h+:t =>
      if(h == e+1)
        group_mini(t, s, h)
      else
        (s, e) +: group_mini(t, h, h)
  }

  def group(seq: Seq[Int]) = seq match {
    case Nil => Nil
    case h+:t => group_mini(t, h, h)
  }

  println(group(sample))
}
```

実行結果

```scala
List((1,5), (8,10), (13,14), (20,20), (22,22))
```

# 追記
文字列の出力までやるの忘れてたけど、書かなくてもいいかな。
SwiftでViewなどを遅延生成する

UIViewはオブジェクトのなかでも比較的重いため、メモリ節約のために遅延生成をすることがあります。
Objective-Cではこんな記述をしてました。こうすることで `titleLabel` に初めてアクセスがあったときにUILabelが生成され、すでに生成済みの場合は保持しているものを返すという処理になっています。

```objc

@interface ViewController

@property (nonatomic) UILabel *titleLabel;

@end


@implementation ViewController

- (UILabel *)titleLabel {
    if (_titleLabel) {
        return _titleLabel;
    }

    _titleLabel = [UILabel new];
    _titleLabel.text = @"タイトル";
    _titleLabel.textColor = [UIColor greenColor];
    _titleLabel.font = [UIFont boldSystemFontOfSize:14];
    return _titleLabel;
}

@end

```

これのSwift版を調べていて、こういう書き方に落ち着きました。
クロージャを作って即時実行しています。さらに `lazy` キーワードをつけることでアクセスがあったときにクロージャが実行されるようになります。

```swift
class ViewController {

    lazy var titleLabel: UILabel = {
        let label = UILabel()
        label.text = "タイトル"
        label.textColor = UIColor.greenColor()
        label.font = UIFont.boldSystemFontOfSize(14)
        return label
    }()

}
```
keychain access の許可が何回も要求される

検索してもよく分からなかったし、ターミナルは怖くて使わなかったけど解決したのでメモ。いいやり方かどうかは分からないけども。

#　あらすじ
### Macのパスワードを忘れてキーチェーンを初めからにしてしまった。
いや。アホですね。
### 困ったこと
キーチェーンをリセットすると沢山アクセス許可を要求されるんです。(ごめんなさい。理由はまだ調べてないです.)
以前もMacのパスワードを忘れてキーチェーンをリセットしてしまったことはあるのですが、その時はChrome, Safariやmailの時だけだったのですが、私は今xcodeで完成が近いアプリを開発していてビルドしようとしたら何回も、"osxが変更を加えようとしています......"というポップアップ表示されて、自分のパスワードとユーザーネームをどれだけ繰り返して入力した事か！！！！！！
この時スタバで作業していたのですが、３０分くらいはずっと繰り返してました笑
指が炎症起こすかと思いました。
### どうしたか。
さすがに、これは他に解決する方法があるはずだと思い検索をしたり、キーチェーンをいじいじしていたのですが、分からずでした。

で、キーチェーンをいじいじいじいじry) していたら
なんとですね。
![スクリーンショット 2016-01-08 14.34.11.png](https://qiita-image-store.s3.amazonaws.com/0/81795/a0ac0eb7-07cc-67c8-c2d0-2cdc1332902d.png)

一番下の"ℹ︎"をクリックしてみたらですね、、、
![スクリーンショット 2016-01-08 14.34.37.png](https://qiita-image-store.s3.amazonaws.com/0/81795/60e58796-6a56-96f9-ff0d-33b028d230cc.png)

こんなものがあってです。※画像は加工してあります。
このアクセス制御が、初めは
"アクセスを許可する前に確認"になっていたのですが、
"この項目の使用を全てのアプリケーションに許可"に変更したら、すんなりビルドできました。
多分表示されていた項目がその対象だったのかなぁ？？

なんどもパスワードを入力していたあの努力が......なんて。

##最後に。
この方法が正しいとか本人は分かってないです。とりあえず"動いた。"と思っているばかりです。
しかし、ターミナルの方で解決を試みてググってる時にも、アクセス権のことだったのでこれでいいのかなとか考えていますが。

この記事は、この事のすぐ後に書いてるので今非常に指が痛いです。
Gitプッシュ時にブランチ名やメッセージ、差分ファイル等をJSONでcurlするスクリプトを晒す

post-update

```bash
REPOS="リポジトリ名"

BRANCH=$(git rev-parse --symbolic --abbrev-ref $1)
RIVISION=$(git log -1 --no-merges --pretty=format:"%h" $BRANCH)
USER=$(git log -1 --no-merges --pretty=format:"%an" $BRANCH)
MSG=$(git log -1 --no-merges --pretty=format:"%s" $BRANCH | awk -F\n -v ORS='\\n'  '{print}' | sed "s/\//\\\\\\//g" | sed "s/\"/\\\\\"/g" | sed "s/\\\\n$//g")
FILE_STATUS=$(git log -1 --no-merges --pretty=oneline --name-only $BRANCH | awk 'NR>1 {print}' | awk -F\n -v ORS='\\n'  '{print}' | sed "s/\//\\\\\\//g" | sed "s/\"/\\\\\"/g" | sed "s/\\\\n$//g")

BODY="{\"repository\": \"${REPOS}\", \"branch\": \"${BRANCH}\", \"rivision\": \"${RIVISION}\", \"user\": \"${USER}\", \"commitMessage\": \"${MSG}\", \"fileStatus\": \"${FILE_STATUS}\"}"
echo "${BODY}"

curl -v -H "Accept: application/json" -H "Content-type: application/json" -X POST -d "${BODY}" http://hoge.hoge.com
```
[導入]DoxygenをMacでコマンドラインから実行する[MacOSX]

Doxygenを公式サイトからDLしてMacに導入するときに、コマンドライン実行ができなかったのでやり方をメモ。
（※Doxygenの導入のみで、使い方は解説していません）

環境：MacOS X(10.10.5)

# 手順
## 公式サイトからダウンロード
* http://www.stack.nl/~dimitri/doxygen/download.html#latestsrc
* MacOS向けのdmgファイルを選択してDL（Doxygen-1.8.11.dmgみたいな）
* 展開してインストール

これでDoxygen.appはインストールできた。起動するとGUI版doxygenが立ち上がる。
この状態だとターミナルでdocxgenコマンドはまだ使えないので、パスを通す必要がある。

## Doxygenコマンドを使えるようにする
### 実行ファイルを探す
terminalを起動して、

```bash
$ cd /Applications/Doxygen.app/Contents/Resources/
$ ls -la
total 99768
drwxr-xr-x@ 7 user.name  admin       238 12 30 18:27 .
drwxr-xr-x@ 7 user.name  admin       238 12 30 18:27 ..
-rw-r--r--@ 1 user.name  admin     52567  1 26  2004 Doxygen.icns
-rwxr-xr-x@ 1 user.name  admin  34549672 12 30 18:27 doxygen
-rwxr-xr-x@ 1 user.name  admin   9231160 12 30 18:27 doxyindexer
-rwxr-xr-x@ 1 user.name  admin   7239588 12 30 18:27 doxysearch.cgi
-rw-r--r--@ 1 user.name  admin        26 12 30 18:27 qt.conf
```
doxygen本体を発見。
### パスを通す
```$ vi ~/.bash_profile```なりで環境設定ファイルを開き下記を追記

```bash
# Doxygen
export PATH=/Applications/Doxygen.app/Contents/Resources:$PATH
```
（※iキーで入力モードに切り替え→入力→Esc→:wqで上書き保存）

あとはターミナルを再起動すればdoxygenコマンドが使えるようになる。

```bash
$ doxygen -v
1.8.11
```
めでたし。

このあとの実際の使い方は、ググるなりこのへん（http://www.doxygen.jp/starting.html） とか参考にするなりしてみてください。