OmniAICreator/Qiita-1.07M huggingface dataset:
Docker for macを入れてMacのディスク容量が足りなくなったら、それは古いDockerが原因の可能性アリ。Docker Toolbox削除の手引


Docker for mac がパブリックベータで公開された。Docker for macをインストールする際に、
Docker ToolBoxからインストールしたものがある場合は、自動でマイグレーションが実行されほぼ同等の大きさのディスク容量を食うため古い方のDockerを削除する必要がある

ひとことで言うと、基本的にMac版のDockerのアンインストール手順をとればよいが、コマンドのシンボリックリンクは削除したらダメよということである。

### Docker machineの削除

現状のDocker Machineの確認

```
> docker-machine ls
default                      virtualbox   Stopped
dinghy                       virtualbox   Stopped
```

Docker Machineの削除
lsでみたdocker-machineをすべて削除する

```
> docker-machine rm default
Successfully removed default
```

~/.docker/machine/machines
ディレクトリが空になったら、OK

### Docker Quickstart TerminalとKitematicをアプリケーションディレクトリから削除する

Finderからアプリケーションを開き、Docker Quickstart TerminalとKitematicを削除する

### .dockerディレクトリを削除する

```
rm -Rf ~/.docker
```

### 注意：Dockerコマンドのシンボリックリンクを削除してはいけない

Docker(v1.11)削除手順
https://docs.docker.com/v1.11/engine/installation/mac/#uninstall-docker-toolbox

上記リンクのようにDockerの削除順をそのまま踏襲すると下記コマンドをシンボリックリンクを
/usr/local/binから削除するように、指示があるが **削除してはいけない**

各コマンドのシンボリックリンクはDocker for macの方に置き換わっている

* docker
* docker-compose
* docker-machine commands


Docker for macのコマンドにシンボリックリンクが置き換わっていることの確認

```
>  ls -l /usr/local/bin/docker
lrwxr-xr-x  1 kon_yu  staff  66  6 28 20:12 /usr/local/bin/docker -> /Users/user_name/Library/Group Containers/group.com.docker/bin/docker
```


ref: https://docs.docker.com/v1.11/engine/installation/mac/#uninstall-docker-toolbox
Power8 on SoftLayer & オンプレ 価格比較

インテルCPUよりもハイパフォーマンスでHPC用途などにも定評のあるPowerの価格を、
SoftLayer上のOpen Power8とオンプレミスのPowerの価格を比較してみました!!
#POWER8 on SoftLayerとは
2016年3月29日よりSoftLayerでOpenPOWERベースのPOWER8 C800Lシリーズが[利用可能](http://www.softlayer.com/jp/bare-metal-search?datacenters=8&hourlyBilling=1&startingMonthlyPrice[min]=100&startingMonthlyPrice[max]=2600&maximumRamCapacity[min]=2&maximumRamCapacity[max]=3072&processorModel[]=8&processorSpeed[min]=)になりました。データセンターはダラス(2016年3月29日現在)のみで、今後は他のデータセンターでも利用可能となる予定。

![poweronsoftlayer.png](https://qiita-image-store.s3.amazonaws.com/0/130492/d9c01263-1686-bacf-4136-2803b46f7954.png)
#OpenPOWERとは
台湾のTyan社が製造したものでIBMのPowerよりはお手ごろなお値段。
IBMが独自に製造していたPowerをオープンソース化したもので、[OpenPowerFoundation](http://www.srchack.org/article.php?story=20140928125659369)にはTyan・
Google・Mellanox・NVIDIA・サムスン電子・日立製作所などなどが参加しております。
#Power8 on SoftLayerとIBM Power System S812Lの価格比較
価格比較を行ったのは2016年6月、最新の情報は別途ご確認下さい。

|SoftLayerのOpenPower|POWER8 C812L-S|POWER8 C812L-M|POWER8 C812L-L|POWER8 C812L- SSD|
|:------------------:|:------------:|:------------:|:------------:|:---------------:|
|月額                |    12万円    |   18万円     |   23万円     |  24万円         |

上記と同程度のスペックでオンプレPowerで購入した場合

|IBM Power System S812L|  Sくらい   |  Mくらい     |  Lくらい     |  SSDくらい      |
|:------------------:|:------------:|:------------:|:------------:|:---------------:|
|初期購入費用        |    350万円   |   660万円    |   970万円    |  1200万円       |ｂｂ
![Slide1.JPG](https://qiita-image-store.s3.amazonaws.com/0/130492/a1c8d6d5-68de-3577-8c62-8bfb1724a0b8.jpeg)
![Slide2.JPG](https://qiita-image-store.s3.amazonaws.com/0/130492/6a129146-9bba-e499-cf41-371fd0fdf49e.jpeg)
※ハードに対して初期構築費用を10%、年間の保守・運用費用を20%として計上
![Presentation1.jpg](https://qiita-image-store.s3.amazonaws.com/0/130492/36325b4b-65fa-c039-0e57-ec5a65bbf8cb.jpeg)
※初期費用がある方がIBM Power System S812L(オンプレ)
#価格比較の感想
**SoftLayerのOpenPowerが安い！！！**
実際に比較してみると、予想していたより大分安かったです。
一般的にクラウドは初期費用が抑えられるが、オンプレと比較すると2～3年で分岐点がくると言われている。
しかし、今回の比較では終始クラウドのSoftLayerのほうが安いという結果となりました。
SoftLayerはOpenPowerでオンプレはIBMのPower、という条件の違いはあるものの、スペックはほぼ揃えております。
よっぽど大規模にしてハードの割引や保守運用費用を抑えないと、オンプレのほうが高くつきそうですね。
#なんと無料で…!?
（ここまで記事を書いたからには、最後にはきっちりと番宣を行いたいと思います(｀・ω・´)ｷﾘｯ）
**POWER8 on SoftLayer が無料で最長1ヶ月使えるキャンペーン2016年7月31日まで!!**
http://blog.softlayer.com/2016/limited-time-only-free-power8-servers
http://static.softlayer.com/sites/default/files/freepower8_promo_faq.pdf
（英語の文書で読むのが嫌になるかと思いますが…）

要するに、
期限：　　　　　2016年7月31日まで
Promo Code：　FREEPOWER8
無料の上限額：　US$2,238(サーチャージや税込みで)
注意事項：　　　一回の注文に限り割引される

これを機に是非Powerにトライしてみましょう！！
#関連記事
POWER8 on SoftLayer ベンチマークテスト
http://qiita.com/asasaki4github/items/bd60da919db426e8bbc7
http://qiita.com/osonoi/items/9a3a4b3e644da21d3486
PHPのプログラム内から外部サーバに接続できなくなった

# 現象
PHPから外部のSMTPサーバに接続して送信する処理が、ある日できなくなっていた。

# 調査
PHPサーバとSMTPサーバ間の疎通が取れなくなったのかなあ？
SSHでPHPサーバにログインして、pingを投げるとSMTPサーバから応答が返ってきた。
では、PHPサーバからtelnetでSMTPサーバに接続してメール送信してみる。
→送信できた。PHPサーバとSMTPサーバ間の接続は保たれている様子。

# ということは、PHPだと外部サーバに接続できていない？？

接続試験用プログラムを簡単に組んでみる。

```php
<?php
// mail.hoge.comに接続できるか確認。
$fp = fsockopen("mail.hoge.com", 25, $errno, $errstr, 30);
if (!$fp) {
    echo "$errstr ($errno)<br />\n";
} else {
    echo "I'm connected!<br />\n";
    fclose($fp);
}
```

あれ？エラーになった。接続できていないみたいだ。

mail.hoge.comをIPアドレスに変えてみる。

あれ、接続できた。え？PHPからだと名前解決が出来ていないのか？


# Apache再起動で解決

思い返してみると、このサーバは最近グローバルIPアドレスを変更した。
そのときに、resolv.confも変更している。
色々調べると、resolv.conf変更後はApache再起動しないといけないらしい。

再起動すると、名前解決が出来るようになった。
pingやnslookupでは名前解決できるのに、PHPからでは名前解決できない今現象。
ハマった。ハマった。
Resultを使ってAlamofireっぽい関数を作る

以外と使い方がわかんないことがお多いのでメモ

```swift

import Foundation
import Result

class TeacherDataStore{
    
    class func fetchAll(handler:Result<[TeacherModel], NSError>->Void){
        var res = [TeacherModel]()
        
        handler(.Success(res))
    }
}

```

こんな感じのメソッドを用意しておけば以下のように呼べる


```swift
        TeacherDataStore.fetchAll{ result in
            switch result{
            case .Success(let response):
                print("")
            case .Failure(let error):
                print("")
            }
        }

```

ドキュメントには書いてないのでちょっと迷った
MKMapViewでズームや移動の制限をする

MKMapViewで表示する地図で、ズームやスクロールを許可したくない場合の設定。

```
mapView.scrollEnabled = false //スクロール
mapView.rotateEnabled = false //回転
mapView.zoomEnabled = false //ズーム
mapView.pitchEnabled = false //3D表示
```

[Accessing Map Properties - MKMapView Class Reference](https://developer.apple.com/library/mac/documentation/MapKit/Reference/MKMapView_Class/#//apple_ref/doc/uid/TP40008205-CH3-SW11)
[VB.NET] ユニットテストにおけるモック作成を楽にするmoqの使い方まとめ

[moqの使い方](https://github.com/Moq/moq4/wiki/Quickstart)はばっちり書いてあるも、使われている言語はC#。当然ですよね。 :kissing_heart: 

今回の現場ではほんとぉおおおおーーーに仕方なく:cold_sweat:不慣れなVB.NETを使わなければいけないので、VB.NETにおける書き方をまとめます。  

とりあえず、今まで使ったところです。随時追加していきます。 :smile: 


# モック化対象インターフェース

このインターフェースをモック化します。

```vbnet:IFoo.vb
Public Interface IFoo
   Function DoSomething(value As String) As Boolean
   Function DoSomethingStringy(value As String) As String
   Function TryParse(src As String, ByRef dst As String) As Boolean
   Function Submit(bar As Bar) As Boolean
   Function GetCount() As Integer
   Function GetCountThing() As Integer
   Property Name As String
End Interface
```

```vbnet:Bar.vb
Public Class Bar
End Class
```

# モックの作成

```vbnet
Dim mock As new Mock(Of IFoo)()
```

# メソッド呼び出し時の戻り値

ByRefで返す値と戻り値を設定

```vbnet
Dim outString = "ack"
mock.Setup(Function(foo) foo.TryParse("ping", outString).Returns(True)
```

# メソッド呼び出し時に期待する引数

任意の値でもOk

```vbnet
mock.Setup(Function(foo) foo.DoSomething(It.IsAny(Of String)).Returns(True)
```

正規表現にマッチすることを期待

```vbnet
mock.Setup(Function(foo) foo.DoSomethingStringy(It.IsRegex("[a-d]+", RegexOptions.IgnoreCase)).Returns("foo")
```

# プロパティへのアクセス

```vbnet
mock.Setup(Function(foo) foo.Name).Returns("bar")
```

# メソッドが呼ばれたか

テスト対象を実行した後に書きます。

```vbnet
mock.Verify(Sub(foo) foo.DoSomething("expect"))
```

呼ばれていないことを期待

```vbnet
mock.Verify(Sub(foo) foo.DoSomething("expect"), Times.Never)
```

1度だけ呼ばれる

```vbnet
mock.Verify(Sub(foo) foo.DoSomething("expect"), Times.Once)
```
【Zabbix3.0】vSphereAPIを使用した VMware ESX / ESXi / vCenter の監視について

# **概要**
- vSphere APIを利用した監視
- vSphere APIのURLを登録し、監視設定を自動化
- ESX / ESXi / vCenter 配下ホストのローレベルディスカバリとプロトタイプの作成

# **環境**
- zabbix_server (Zabbix) 3.0.3
- VMware ESXi 5.5

# **できること**
- HyperVisorのリソース監視
- ゲストVMのリソース監視

# **できないこと**
- Zabbixエージェント機能を利用した監視<br>※別途ホスト登録してZabbixエージェントをインストールする必要がある

# **やりかた**
## **ESXiホストの登録**
### [設定] - [ホスト] - [ホストの作成] を選択
![WS000620.png](https://qiita-image-store.s3.amazonaws.com/0/79134/8d2257d0-62e9-6c37-3956-f06d53d4ba14.png)

### ホストの設定
- ホスト名、所属グループを設定する
- IPアドレスの情報は使用しないため、そのままでもOK

![WS000621.png](https://qiita-image-store.s3.amazonaws.com/0/79134/3245a9ad-23f5-755a-8fe1-534bdf4b577a.png)

### テンプレートの設定
- `Template Virt VMware`と`Template Virt VMware Hypervisor`をリンクさせる

![WS000622.png](https://qiita-image-store.s3.amazonaws.com/0/79134/d1fd4757-1c9d-d475-42c2-499288b6f5bd.png)


### マクロの登録
- ホストにマクロを登録する

| 項目 | 説明 |
|:--|:--|
| {$URL} | vSphere APIのURL<br>https://{ipaddress}/sdk |
| {$USERNAME} | ESX / ESXi / vCenter のログインアカウント |
| {$PASSWORD} | ログインアカウントのパスワード |

![WS000625.png](https://qiita-image-store.s3.amazonaws.com/0/79134/170d1cf6-7be0-ee89-d7bd-af09b184bf05.png)


### ホストの追加
- ホストが追加されたことを確認

![WS000624.png](https://qiita-image-store.s3.amazonaws.com/0/79134/d41f1dec-d37d-02fd-a797-2b27fb82dcf9.png)

## **Zabbixサーバの設定**
### `zabbix_server.conf`の下記パラメータを設定
```text:/etc/zabbix/zabbix_server.conf
StartVMwareCollectors=2
VMwareFrequency=60
VMwarePerfFrequency=60
VMwareCacheSize=8M
VMwareTimeout=10

※変更後zabbix-serverプロセスの再起動を実施すること
```

### VMware監視専用パラメータ詳細
| パラメータ | 説明 |
|:--|:--|
| StartVMwareCollectors | vSphere APIと通信するプロセスの起動数 |
| VMwareFrequency | vSphere APIから取得した情報をメモリ上にキャッシュする領域のサイズ |
| VMwarePerfFrequency | vSphere APIからデータを取得する間隔 |
| VMwareCacheSize | vSphere APIからパフォーマンスカウンタのデータを取得する間隔 |
| VMwareTimeout | vSphere APIとの無通信タイムアウト時間 |


## **ホスト追加確認**
### しばらくするとこんな感じで自動でVMが追加されます
![WS000626.png](https://qiita-image-store.s3.amazonaws.com/0/79134/11f70f00-4c95-612b-3080-01045b4870f7.png)



## **VMware監視における注意事項**
### **StartVMwareCollectorsは監視するHyperVisorの倍の値を設定する**
vSphere APIからデータを取得する際、`VMwareFrequency`と`VMwarePerfFrequency`のパラメータの特性により、処理がつまる場合がある
`VMwarePerfFrequency`の間隔で取得されるデータをすぐ取得できるが`VMwareFrequency`の間隔で取得されるデータは取得に時間がかかるため、HyperVisor1台につき、`StartVMwareCollectors`は倍の値を設定した方が遅延が発生しない・・・、らしい！

### **アイテムの更新間隔は`VMwareFrequency`と`VMwarePerfFrequency`の値より長く設定する**


### **vSphere APIからデータを収集するLLD設定が正しくないと、データ収集アイテムは正しく動作しない**


# **疑問**
Zabbixエージェントでのデータ収集を行いたい場合、別でホスト登録しないといけないのであまりメリットがない感じということなのでしょうか？？

別でLLD設定してvSphereAPI使う必要なし？？

（20160630追記）
@qryuuさんに疑問解決していただきました！

<blockquote class="twitter-tweet" data-conversation="none" data-lang="ja"><p lang="ja" dir="ltr">.<a href="https://twitter.com/Tocyuki">@Tocyuki</a> vSphereAPIによる登録はVMとしての外部監視になります。<br>エージェントによる監視は内部監視なので、<br>値の視点が異なります。 <a href="https://twitter.com/hashtag/zabbix?src=hash">#zabbix</a></p>&mdash; 九龍真乙 (@qryuu) <a href="https://twitter.com/qryuu/status/748065317688049664">2016年6月29日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>
ExcelVBAでこういう感じのことをよくやってたなと懐かしむ

# Excel超すげぇ
一時期ExcelVBAをよく触っておりました。Macユーザーではありますが、Numbersには絶対に真似できないExcelの偉大さというものを知ったのはこのときです。勉強してたときのファイルをたまたま見つけて結構いろいろ使えそうなものがあったのでメモしておきます。

# データが存在する最終行を取得
`A1`セルから下に探します。空のセルがあるとそこでヒットします。

```vbnet
Sub データが存在する最終行を取得()

Dim maxrow as Long
maxrow = Range("A1").End(xldown).Row

End Sub
```

# シートの一部分を配列化
左上が`B2`セル、右下はデータが存在する最終行と最終列を探して配列化します。長方形範囲の中に空欄がある場合は考慮していません。ExcelVBAの配列ではインデックスが1から始まります。

```vbnet
Sub シートの一部分を配列化()

'配列化する部分の最終行、最終列
Dim endrow As Long, endcolumn As Long
endrow = range("b2").End(xldown).Row
endcolumn = range("b2").End(xlToRight).Column

'配列化する範囲を指定
Dim myrange As range
Set myrange = Sheet1.range("B2", Cells(endrow, endcolumn))

'Variant型にrangeを代入するとそのまま配列になります
Dim result As Variant
result = myrange

End Sub
```

# Rangeオブジェクトの書き方
セル範囲や単一のセルを表す`Range`オブジェクトですが、場面によって書き方を使い分けると便利です。

```vbnet
Sub Rangeオブジェクトの書き方()

'単一のセルの場合
Range("A1")
Range(Cells(1, 1), Cells(1, 1))

'長方形範囲の場合
Range("A1:B10")
Range(Cells(1, 1), Cells(10, 2))

End Sub
```

# ルールに従って並び替え
`A3`セルから`F100`の長方形範囲を`Sort`メソッドで並び替えます。Rangeオブジェクトの表記をいろいろ変えてみます。操作対象を指定できる`With`ステートメントも同時に使います。

```vbnet
Sub ルールに従って並び替え()

'With〜End Withの間では操作対象を明示しなくてもいいので記述が簡潔になります
With Sheet1
Range("A3:F100").Sort _
'並び替えのルールはkeyを並び替えたい列の最上段のRangeオブジェクト、昇順から降順かを表すorderで与えていきます。最大で3つまでのようです。
'xlAscending(昇順)が既定値です
key1:=Range("B3"), order1:=xlAscending, _
key2:=Range("C3"), order2:=xlAscending, _
key3:=Range(Cells(3, 4), Cells(3, 4)), order3:=xlDescending, _
'最上段の行をタイトル行とみなすかどうかを指定します
'xlNoが既定値です
Header:=xlNo
End With

End Sub
```


ひまがあったらまた追記します。
RubyでEC2インスタンスに設定したIAM Roleからaccess_key_idとsecret_access_keyを取得


開発中のrailsプロジェクトでAWSサービスとの連携を行う箇所があり、環境変数にaccess_key_id, secret_access_keyを設定せずにS3との接続ができないか調べてたらAWS SDK for Rubyを使えると判明しました


環境
---

* AWS SDK for Ruby v2


取得方法
---

~~~
role  = Aws::InstanceProfileCredentials.new
credential = role.credentials
# access_key_id
credential.access_key_id
=> "xxxxxxxxxxxxxx"
# secret_access_key
credential.secret_access_key
=> "xxxxxxxx"
~~~


追記
---

上記で取得した、access_key_id, secret_access_keyをそのまま利用したら、だめでした（涙

~~~

db = Aws::DynamoDB::Client.new(
  access_key_id: access_key_id,
  secret_access_key: secret_access_key,
  region: ENV["AWS_REGION"],
)

db.put_item(略
~~~

でたエラー

~~~
Aws::DynamoDB::Errors::UnrecognizedClientException: The security token included in the request is invalid.
~~~

正確には

~~~
Aws::DynamoDB::Client.new(
        credentials: Aws::InstanceProfileCredentials.new.credentials,
        region: ENV["AWS_REGION"].nil? ? "ap-northeast-1" : ENV["AWS_REGION"]
      )

~~~
c++ builder / indy > MIMEタイプを取得する実装 > GetFileMIMEType()使用

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

関連 http://qiita.com/7of9/items/6e88b5c8549fadd3b5f1

http://www.kyoto-su.ac.jp/ccinfo/use_web/mine_contenttype/
にあるMIMEのcontenttypeをファイル名から取得したい。

以下にあるDelphiコードのうち、Indy使用の実装が簡単だ。
http://mrxray.on.coocan.jp/Delphi/plSamples/728_File_MimeType.htm

## 実装

C++ Builderで実装した。

`#include <IdGlobalProtocols.hpp>`を追加してGetFileMIMEType()を使う。


```Unit1.cpp
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include <IdGlobalProtocols.hpp>

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
	: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
	String filepath = L"tmp.jpg";
	String res;

	TIdMimeTable *mimInst = new TIdMimeTable(/* AutoFill=*/false);
	res = mimInst->GetFileMIMEType(filepath);

	delete mimInst;
	mimInst = NULL;

	ShowMessage(res);
}
//---------------------------------------------------------------------------
```

クラスの静的関数ではなく、インスタンスを作成してそのメンバ関数を使うようだ。

上記の場合resには"image/pjpeg"となった。
vSphere上の仮想マシンにNMI信号を送る

# 概要

対象として仮想マシンを選択し、HungVMオプションを有効にして診断ログバンドルのエクスポートを行うと、ゲストOSをNMI信号によりクラッシュさせることができる。

# 詳細

vSphere上のゲストOSに、NMI信号を送ってクラッシュ（Windowsでいえばブルースクリーンを発生）させたいという状況がある。例えば、無応答になったOSをクラッシュさせてメモリダンプを取得したいというケースがこれにあたる。

KB 2005715に紹介されている5つの方法のうち、ここでは「vSphere Web ClientでHungVMオプションを有効にして仮想マシンの診断ログバンドルを取得する」を紹介する。

## 主な方法

NMI信号によりゲストOSをクラッシュさせる方法は、以下のKBに説明されている。

* [KB 2005715:Crashing a virtual machine on ESX/ESXi to collect diagnostic information](https://kb.vmware.com/kb/2005715)
* [KB 2094454:ESX/ESXi 上で仮想マシンをクラッシュさせて診断情報を収集する](https://kb.vmware.com/kb/2094454)

以下の方法が挙げられている。

* vSphere Clientで、HungVMオプションを有効にして仮想マシンの診断ログバンドルを取得する（vSphere 5.x）
* vSphere Web Clientで、HungVMオプションを有効にして仮想マシンの診断ログバンドルを取得する（vSphere 5.x）
* ESXi Shellまたはsshから、vm-supportコマンドで、HungVMオプションを有効にして仮想マシンの診断ログバンドルを取得する（vSphere 3.x～5.x）
* ESXi Shellまたはsshから、vmdumperコマンドで、コアダンプを取得する（vSphere 3.x～5.x）
* `https://username:password@ESXiHostnameOrIP/cgi-bin/vm-support.cgi`からHungVMオプションを有効にして仮想マシンの診断ログバンドルを取得する

## vSphere Web ClientでHungVMオプションを有効にして仮想マシンの診断ログバンドルを取得する

vSphere 5.xでは、HungVMオプションを有効にした仮想マシンの診断ログバンドルを取得が最も簡単だと思う。上記KBから、vSphere Web Clientでの実施方法を紹介する。

<ol>
<li>vSphere Web Client にログインします。
<li>左側のパネルから vCenter を選択します。
<li>仮想マシンおよびテンプレート を選択します。
<li>仮想マシン > すべての vCenter アクション > 診断データのエクスポート をクリックします。
<li>HungVM を選択して、ログ バンドルの生成 をクリックします。
<li>次のようなメッセージが表示されます。<pre>仮想マシンをログにエクスポートすると仮想マシンがサスペンドする可能性があります。</pre>
<li>ログ バンドルのダウンロード をクリックします。バンドルのダウンロードが完了すると次のメッセージが表示されます。<pre>ダウンロードが完了しました。指定したダウンロード先を確認してください。</pre>
</ol>

# 参考

複数の方法があり、vSphereの版数によっても適した方法が変わる。実施環境に合わせ、また実施時期に新しい方法が提示されていないか確認するために、実施時には以下のナレッジを確認するとよい。

* [KB 2005715:Crashing a virtual machine on ESX/ESXi to collect diagnostic information](https://kb.vmware.com/kb/2005715)
* [KB 2094454:ESX/ESXi 上で仮想マシンをクラッシュさせて診断情報を収集する](https://kb.vmware.com/kb/2094454)

----
本ページ内容は筆者が参照の便のためにある持点でまとめた個人的なメモです。内容を保証するものではなく、また筆者の所属組織等とは一切かかわりがありません。
HimotokiとObjectMapperをAPIKitで使おうと思っている話

最初からHimotokiの想定でAPIKitをベースにクライアントを作ったけど、結局Realmを使いたくてObjectMapperにしておけばよかった！となった私です。

結局共存の必要はなく。Himotokiだけでなんとかした。

最初はRequestTypeで

```
extension RJAuthRequestType where Response: Decodable  {
    func responseFromObject(object: AnyObject, URLResponse: NSHTTPURLResponse) throws -> Response {
        return try decodeValue(object)
    }
}

extension RJAuthRequestType where Response: Mappable{
    
    func responseFromObject(object: AnyObject, URLResponse: NSHTTPURLResponse) -> Self.Response? {
        guard let dictionary = object as? [String: AnyObject] else {
            return nil
        }
        
        let mapper = Mapper<Response>()
        guard let object = mapper.map(dictionary) else {
            return nil
        }
        
        return object
    }
}

```

こんな感じで書いておけばResponseがMappableだろうとDecodableだろうといけると思っていたけどずっと does not conform to protocol って怒られていて、結局himotoki一本にした。

ただ保存するModelの形式をstructのままではRMLObjectは使えないので、

```
final class TeacherModel:RLMObject{
...
}

extension TeacherModel:Decodable{
    static func decode(e: Extractor) throws -> TeacherModel {
        var teacher = TeacherModel()
            teacher.tutorId =       try   e <|  "tutor_id"
        return teacher
    }
}

```

こんな感じにしてみた。これでビルドもパースも無事できた、でもちょっとHimotokiの恩恵が・・・
OpenFOAMのメッシュ記述方法の説明

# 参考リンク

[OpenFOAM User Guide: 5.1 Mesh description](http://cfd.direct/openfoam/user-guide/mesh-description/)
[OpenFOAM 空間の離散化と係数行列の取り扱い by Fumiya Nozaki](http://www.slideshare.net/fumiyanozaki96/openfoam-32087641)
[Dynamic Mesh in OpenFOAM by Fumiya Nozaki](http://www.slideshare.net/fumiyanozaki96/openfoam)
[The OpenFOAM Technology Primer （本）](http://www.sourceflux.de/book/)

# 基本構造

OpenFOAM User Guideに図とともにわかりやすく記載されています。要約しますと、OpenFOAMのメッシュを構成する基本要素は

- Points（点）
- Faces（面）
- Cells（セル）

の3つで、それぞれ次のように定義され、かつ条件が設けられています。

## Points（点）

点の座標はベクトル（`Vector`)で定義されます。各点には番号が振られ（`label`）、まとめてリスト（`labelList`）として管理されます。チュートリアルの各ケースの`constant/polyMesh/points`を開いて見てください。

```cpp:points
// 点の数
624
// 点のリスト
// 点番号  (x y z)
(
0 (0 0 0)
1 (0.5 0.1 0.1)
2 (0.5 -0.1 1.0)
...
)
```

## Faces（面）

各面は面を構成する点のリスト（`labelList`）で定義されます。点は必ず面の周りを一定の向きで周るように順番づけられており、面の法線ベクトルの正の方向は、面に向かって点の順番が反時計回りならば自分の方向を正、時計回りならば自分とは反対方向を正として定義されます。

面にはinternal facesとboundary facesがあり、internal facesは必ず隣り合う2つのセルを持ちますが、boundary facesは片側のみにセルがあります。OpenFOAMでは、faceを共有する2つのセルのうちセル番号の小さいほうをowner cell、セル番号の大きい方をneighbour cellと定義しています。boundary facesは、owner cellのみを持つ面とも言い換えられます。

面は`constant/polyMesh/faces`において以下のように点の番号のリストとして表されています。面のリストの上から順に面番号（labelList）が0, 1, 2, ...と振られます。

```cpp:constant/polyMesh/faces
// 面の数
500
// 面のリスト
// 面を構成する点の数 (点番号リスト = labelList)
(
3 (0 1 2)     // face label = 0
3 (1 3 5)     // face label = 1
3 (1 2 4)     // face label = 2
4 (0 6 5 2)   // face label = 3
...
)
```

一方、境界について表している`constant/polyMesh/boundary`を見ると

```cpp:constant/polyMesh/boundary
// patchの数
8
(
    // patchの名前
    zPos
    {
        type        empty;    // patch type
        nFaces      42;       // patchを構成する面の数
        startFace   368;      // 面のリストにおけるpatchが始まる面番号
    }
    zNeg
    {
    ...
    }
    ...
)
```

のようになっているはずです。OpenFOAMでは、面のリストは必ずinternal faces → boundary facesの順に面の番号が並べられます。したがって、`constant/polyMesh/boundary`と`constant/polyMesh/faces`を比較すれば

```cpp:constant/polyMesh/faces
// 面の数
500
// 面のリスト
// 面を構成する点の数 (点番号リスト = labelList)
(
// internal faces
3 (0 1 2)     // face label = 0
3 (1 3 5)     // face label = 1
3 (1 2 4)     // face label = 2
4 (0 6 5 2)   // face label = 3
...
// boundary faces
//- zPos
3 (298 345 103)  // face label = 368
...
//- zNeg
3 (387 408 299)  // face label = 410 (= 368 + 42)
...
)
```

のように、internal facesとboundary faces（あるいは各patchを構成する面）を読み取ることができます。

## Cells（セル）

セルは面のリスト（`faceList`）で定義されます。また次の性質を満たしていなければなりません。

- Contiguous: セルは計算領域を隙間なく埋め、かつ重なってはならない。
- Convex: セルは凸であり、セルの中心はセルの内部になければならない。
- Closed: セルは幾何学的にもトポロジー的にも「閉じて」いなければならない。

前節で述べたように、セルはownerとneighbourに分けられ、それぞれ`constant/polyMesh/owner`および`constant/polyMesh/neighbour`に保存されています。

```cpp:constant/polyMesh/owner
// owner cellを持つ面の数
500
(
3   // face 0のowner cell番号
1   // face 1のowner cell番号
...
)
```

```cpp:constant/polyMesh/neighbour
// neighbour cellを持つ面の数
368  // boundary face listの最初の面の番号と等しい
(
47   // face 0のneighbour cell番号
49   // face 1のneighbour cell番号
...
)
```
CloudFormationからElasticFileSytemをとりあえず立ち上げる（随時更新）


## 夢叶ふ
ついにきましたね、EFS。



## とりあえずFileSystemを立ち上げる

画面からだと面白くないので、かねてからずっと「あるけど使えないなー」と思っていたCloudFormationから立ち上げてみました。

AWS::EFS::FileSystem:https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-resource-efs-filesystem.html

```efs.json
{
  "AWSTemplateFormatVersion": "2010-09-09",
  "Description": "EFS Demo\n",
  "Resources": {
    "EFSFileSystem": {
      "Type": "AWS::EFS::FileSystem",
      "Properties": {
        "FileSystemTags": [
          {
            "Key": "Name",
            "Value": "EFSTest"
          }
        ]
      }
    }
  }
}
```

kumogataだとこんな感じです。

```efs.rb
AWSTemplateFormatVersion "2010-09-09"
Description (<<-EOS).undent
  EFS Demo
EOS

Resources do
	EFSFileSystem do
		Type "AWS::EFS::FileSystem"
		Properties do
			FileSystemTags [
				_{
					Key "Name"
					Value "EFSTest"
				}
			]
		end
	end
end
```


### 実行結果
```
Stack Resource Summaries:
[
  {
    "LogicalResourceId": "EFSFileSystem",
    "PhysicalResourceId": "fs-XXXXXX",
    "ResourceType": "AWS::EFS::FileSystem",
    "ResourceStatus": "CREATE_COMPLETE",
    "ResourceStatusReason": null,
    "LastUpdatedTimestamp": "2016-06-29 04:39:16 UTC"
  }
]

Outputs:
{
}

```
![スクリーンショット 2016-06-29 13.44.44.png](https://qiita-image-store.s3.amazonaws.com/0/23936/81b1abd7-4cbd-c031-2463-641e462583c9.png "スクリーンショット 2016-06-29 13.44.44.png")


これだけだとEC2へのマウントも何もしていない「ただのファイルシステム」ですが、勢いは大事ということで一旦シェアします。

引き続きマウントとかやっていきますね。
リリース直前のTypeScript 2.0をインストールして新機能を先取りする方法

Microsoft社製の人気のAltJS「[TypeScript](https://www.typescriptlang.org/)」は現在1.8系が最新バージョンですが、2.0へのメジャーアップデートを控えています。本エントリーでは、**リリース前のTypeScript 2.0を安全に試す方法を紹介します**。

# TypeScript 2.0をインストールする
TypeScript 2.0はリリース前の為、グローバル環境にインストールすると他のプロジェクトに影響を与える可能性があります。**他プロジェクトに影響を与えないよう、グローバルではなくテスト用フォルダの範囲内のみでTypeScript 2.0を使えるようにします**。

任意のフォルダを作成し、`npm init -y`を実行しておきます。

```bash:コマンド
cd myproject
npm init -y
```

現在開発中のTypeScript 2系をインストールするには、次のコマンドを実行します。

```bash:コマンド
npm install --save-dev typescript@beta
```

`--save-dev`を指定することで、プロジェクトフォルダ内の`node_modules`フォルダにTypeScript 2.0がインストールされます。

![image](https://qiita-image-store.s3.amazonaws.com/0/67884/f7b252cc-a5c3-f970-44d6-8d6d5b8d5da7.png)

# TypeScript 2.0コードをコンパイルする
TypeScript 2.0の動作を確かめるため、TypeScript 2.0の新機能の一つであるprivateなconstructorを使ったコードを書きます。ファイル名は`hoge.ts`とします。

```ts:hoge.ts(TypeScript2のコード)
class Hoge {
	private constructor() {
	}
}
```

TypeScript 1.8系ではこのコードをコンパイルするとエラーになります。`node_modules`にインストールされたTypeScript 2.0でコードをコンパイルするには、2つの方法があります。

## 1. コマンドを直接指定してコンパイルする
`node_modules`内のTypeScript 2.0は`./node_modules/.bin/tsc`で実行できます。

```bash:TypeScript2のコンパイル
./node_modules/.bin/tsc hoge.ts 
```

実行すると、`hoge.ts`がJavaScriptファイル`hoge.js`ファイルにコンパイルされます。

```js:hoge.js
var Hoge = (function () {
    function Hoge() {
    }
    return Hoge;
}());
```

## 2. npm-scriptsを使ってコンパイルする

package.jsonファイルにシェルスクリプト（のエイリアス）を記述することで、npmモジュールを使う方法です。**直接コマンドを叩くよりも完結に記述でき、かつ他のタスクとも連携しやすいので、お薦めの方法です**。npm-scriptsについては、記事「[Node.jsユーザーなら押さえておきたいnpm-scriptsのタスク実行方法まとめ - ICS MEDIA](https://ics.media/entry/12226)」を参照ください。

以下は、`compile`というタスクを作成した例です。

```bash:package.json
{
  "scripts": {
    "compile": "tsc hoge.ts"
  }
}
```

`compile`を実行するには、次のコマンドを実行します。

```bash:package.json
npm run compile
```

`compile`は、コマンド`./node_modules/.bin/tsc hoge.ts`と同じ意味になる為、実行すると「1. コマンドを直接指定して使う」と同じようにJavaScriptファイル`hoge.js`へコンパイルされます。

```js:hoge.js
var Hoge = (function () {
    function Hoge() {
    }
    return Hoge;
}());
```

# TypeScript 2.0を先取りしよう
**TypeScript 2.0のロードマップは記事「[Roadmap · Microsoft/TypeScript Wiki](https://github.com/Microsoft/TypeScript/wiki/Roadmap)」より確認できます**。個人的には「[async/await and generators support for ES5/ES3](https://github.com/Microsoft/TypeScript/issues/1564)」が楽しみです。リリースは近々と噂されていますので、TypeScript 2.0をインストールして、一足早く新機能を試してみましょう。

次のエントリーでは、TypeScript 2.0で、npmのみで型定義ファイルを管理する方法を紹介します。
シェルスクリプトで単純に並列実行・直列実行を行う

## 実行環境
MacのBash

```
$ bash --version
GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin15)
Copyright (C) 2007 Free Software Foundation, Inc.
```

## 単純な直列実行
```bash
$ sleep 2
$ sleep 4
$ sleep 1
$ sleep 4 #　合計で2+4+1+4=11秒かかる
```

## バックグラウンドプロセスを用いた単純な並列実行
```bash
$ sleep 2 & # コマンド末尾に&をつけて呼び出すとバックグラウンドプロセスになり、並列で実行される
$ sleep 4 &
$ sleep 1 &
$ sleep 4 &
$ wait # 上記のバックグラウンドプロセスたちを待機。もっともかかるもので4秒なため、合計で4秒かかる
[1] 38498
[2] 38499
[3] 38500
[4] 38501
[3]  - 38500 done       sleep 1  # 1秒後([1]のプロセスより先に終了)
[1]    38498 done       sleep 2  # 2秒後
[4]  + 38501 done       sleep 4  # 4秒後([2]のプロセスとほぼ同時に終了)
[2]  + 38499 done       sleep 4  # 4秒後([4]のプロセスとほぼ同時に終了)
```

### バックグラウンドプロセスを用いて直列実行がしたい場合
```bash
echo "hogehoge.shを実行します"
./hogehoge.sh & # バックグラウンドプロセスとして起動
wait $! # $!で直前のバックグラウンドのプロセスIDが得られるため、それが終わるまで待機
echo $? # hogehoge.shの終了ステータス
echo "fugafuga.shを実行します"
./fugafuga.sh & # hogehoge.shが終了してから実行されるバックグラウンドプロセス
wait $!
echo $? # fugafuga.shの終了ステータス
```

そもそもバックグラウンドプロセスにしている時点で直列実行する必要がないだろうが、上記のようにプロセスIDを`$!`で取得し指定すれば可能


## xargsを用いた並列実行
xargsに`-P (--max-procs)`というオプションがあって、それで指定してやれば指定のプロセス数まで並列実行してくれます。
`xargs -P （並列プロセス数） (実行したいコマンド)`だけなので簡単。

参照: [xargs を使ってカジュアルに並列処理](http://tagomoris.hatenablog.com/entry/20110513/1305267021)


### 普通にxargsで実行(上から順に実行される)
```bash
$ time seq 1 5 | xargs -I ZZ -P 1 sleep 1
seq 1 5  0.00s user 0.00s system 49% cpu 0.006 total
xargs -I ZZ -P 1 sleep 1  0.01s user 0.01s system 0% cpu 5.034 total # 5.034秒かかった
```
1秒かかるプロセスを5つ実行すると5秒かかる

### 並列実行(`-P 5` で5プロセスまでの並列実行)

```bash
$ time seq 1 5 | xargs -I ZZ -P 5 sleep 1
seq 1 5  0.00s user 0.00s system 60% cpu 0.009 total
xargs -I ZZ -P 5 sleep 1  0.01s user 0.01s system 1% cpu 1.015 total # 1.015秒かかった
```
5プロセスまで並行実行する設定で
1秒かかるプロセスを5つ実行すると1秒かかる

```bash
$ time seq 1 7 | xargs -I ZZ -P 5 sleep 1
seq 1 7  0.00s user 0.00s system 65% cpu 0.006 total
xargs -I ZZ -P 5 sleep 1  0.01s user 0.02s system 1% cpu 2.032 total # 2.032秒かかった
```
5プロセスまで並行実行する設定で
1秒かかるプロセスを7つ実行すると2秒かかる

## 他の手法
GNU Parallelというものもあるらしい。とりあえず `brew install parallel` でインストールすることが出来た。
xargsの例を真似て

```bash
time seq 1 100 | parallel -j 100%  sleep 1
```

ということもしてみた。こちらのほうが高機能そう。

参照： [GNU Parallelがすごすぎて生きるのがつらい](https://blog.riywo.com/2011/04/19/022802/)
単体では動くCGI が「500 Internal Server Error」

単体では動作確認したCGIをjavascriptから実行したら
「500 Internal Server Error」となった。

パーミッションとか、CGIのエラーとの情報はあっても、
さっきまで動いていたのに、Rubyのバージョンを上げたら
動かなくなった。

まず、apacheのログを見る

```
sudo tail /var/log/httpd/error_log
(2)No such file or directory: exec of '/home/hoge/public_html/hoge.cgi' failed
```


hoge.cgiは動作を確認していた。


原因
hoge.cgiの1行目のrubyのパスがローカルとサーバで異なっていた

```rb
#!/usr/local/bin/ruby
###!/usr/bin/ruby  
```

cgiの1行目を変更したがまた同じことがあると慌てるので
シンボリックリンクを作成しておいた

```
sudo ln -si /usr/local/bin/ruby ruby
```

rubyのバージョンを2.2.5に上げる時に、2.2.1と1.8があってそのときなにかやってしまったことが原因？

感想　　ログは基本ですね。
Kernel.#loopにEnumerator#with_indexを付けるときの注意点

#結論
ブロックパラメータには `Kernel.#loop` のパラメータも用意すること。
というか、**`Enumerator#with_index` がレシーバに対応するブロックパラメータをも必要とする**、ということ。

#例
```rb
pry(main)> loop.with_index { |_, i| puts i; sleep 1 }
0
1
2
3
^CInterrupt: 
```
`_` が `Kernel.#loop` のパラメータ、`i` が `Enumerator#with_index` のパラメータです。
#経緯
ループしながら待ち時間を徐々に長くするにはどうすれば良いかな、と思ったのがきっかけです[^1]。
[^1]: 結論としては、例えば `loop.with_index { |_, i| do_something; break if break_condition; sleep 10 * i }` となります。
さて、試しに

```rb
loop.with_index do |i|
  p i
  sleep 1
end
```
を実行してみると `nil` しか返ってきません。
`Kernel.#loop` は `Enumerator` を返すはずなのになあ、と思いつついろいろいじくりました。

最終的に、次のようにしたときに気付きました。

```rb
pry(main)> l = loop.with_index
#=> #<Enumerator: ...>
pry(main)> l.next
#=> [nil, 0]
pry(main)> l.next
#=> [nil, 1]
pry(main)> l.next
#=> [nil, 2]
pry(main)> l.next
#=> [nil, 3]
```
ああ、なるほど `Enumerator#with_index` のレシーバである `Kernel.#loop` に対応するブロックパラメータ（ここではブロックを付けていないので `nil`）も必要なんだ、と分かったわけです。

#るりま
>##module function `Kernel.#loop`
`loop` -> `Enumerator`
`loop { ... }` -> `object` | `nil`
(中断されない限り)永遠にブロックの評価を繰り返します。 ブロックが指定されなければ、代わりに `Enumerator` を返します。
[module function Kernel.#loop (Ruby 2.3.0)](http://docs.ruby-lang.org/ja/2.3.0/method/Kernel/m/loop.html)

<p />
>##instance method `Enumerator#with_index`
`with_index(offset = 0) {|(*args), idx| ... }` -> `object`
`with_index(offset = 0)` -> `Enumerator`
生成時のパラメータに従って、要素にインデックスを添えて繰り返します。 インデックスは `offset` から始まります。
ブロックを指定した場合の戻り値は生成時に指定したレシーバ自身です。
生成時のパラメータに従って、要素にインデックスを添えてブロックを繰り返します。 インデックスは 0 から始まります。
[instance method Enumerator#with_index (Ruby 2.3.0)](http://docs.ruby-lang.org/ja/2.3.0/method/Enumerator/i/with_index.html)
0以上n未満のランダムな配列をつくる

さくっと作れないくらいのレベルなのでメモ。



## [0, n)までのランダムなn個の配列を作成する

```js:randomArray.js
function randomArray(n) {
    var arr = [];
    var num;
    var i = 0;
    while(i < n) {
        num = Math.floor(Math.random() * n);
        if(~arr.indexOf(num)) continue;
        arr.push(num);
        i++;
    }

    return arr;
}

// [0, 10)のランダム配列
randomArray(10);
```

```js:出力結果
[5, 9, 8, 3, 2, 1, 0, 4, 7, 6]
```



## [0, n)の中からランダムでm個取得する

`nCm`です。
実は上のとほぼ同じで、ループ部分の上限を`m`にすればかんせい。

```js:combination.js
function combination(n, m) {
    var arr = [];
    var num;
    var i = 0;
    while(i < m) {
        num = Math.floor(Math.random() * n);
        if(~arr.indexOf(num)) continue;
        arr.push(num);
        i++;
    }

    return arr;
}

// [0, 100)から10個ランダムに取った数値の配列
combination(100, 10);
```

```js:出力結果
[48, 86, 17, 19, 79, 21, 76, 4, 37, 27]
```


## その他

`[1, n]` ( あるいは`(0, n]` )にしたいときはMath.floor => Math.ceilにかえればいけるはず。
concrete5 のグローバルエリア・スタックあるある：ログインと非ログインで表示が違う時の対処法


concrete5 あるある TIPS の紹介です。

**グローバルエリアやスタックの承認し忘れ注意です。**

## ハマってしまう現象

concrete5 サイトで、ヘッダーやフッターが、ログインしているときは正常な表示なんだけど、ログアウトしている一般ユーザーは内容が違ったもの・・・特に古い情報が表示され続けている。

## 本当の原因

- 編集権限のあるユーザーがログインしているときは、最新のグローバルエリアやスタックの情報が表示される。
- 非ログインユーザーは、承認されている最新バージョンが表示されています。
- **グローバルエリアやスタックの最新バージョンが公開承認されていない**

### よくある原因

編集をしたまましばらく放っておくと、編集の有効期限が切れてしまいます。その際は、間違って公開されないよう最新のバージョンは承認されずに非承認状態で終了します。

なので、自分で非承認状態で終了した自覚がなくても起こってしまう可能性があります。


## 解決方法

- 管理画面 - スタックとブロック から該当するグローバルエリアやスタックに訪問する
- 「バージョン履歴」より最新バージョンにマウスカーソルを持って行くと右矢印「→」アイコンが表示される
- 右矢印「→」アイコンクリックするとメニューが現れる
- 「承認」を押して、編集が公開される。

これで、非ログインユーザーでも、グローバルエリアの最新状態が表示されるようにしました。

## ポイント

**グローバルエリア、スタックで、編集のログイン・ログアウトユーザーの表示の差異がないか、最終チェックを行おう。**

Sarafi や Chrome などでも、プライベートブラウジング機能というものがあります。

通常のブラウザは、ログインしたまま。

そして、プライベートブラウジングをオンにしているウインドウを立ち上げることによって、非ログインユーザーがどのように表示されるのかを確認できます。

最終的なチェックを行う際に、この Chrome の Incognito モードや Safari のプライベートウィンドウ (Private Window) などを活用してサイトの表示を確認しましょう。

## 宣伝 & クレジット

この記事が役に立ったら、「 **CMS は concrete5 が一番**」と頭の中で10回唱えてください。

CMS は断然 [concrete5](https://concrete5-japan.org/)で決まり。[コンクリートファイブジャパン株式会社](https://concrete5.co.jp)がサポートできます。

以上
Linuxサーバのbashプロンプトがおかしくなった

稼働中のLinuxサーバにある日突然sshログインできなくなり、急遽強制再起動。
再起動後は正常にログインできたが、何故かbashプロンプトがおかしくなってしまった…。

普段は以下の様な感じ。

```
Mintos-MacBook:~ minto$ ssh nantoka-server
Last login: Wed Jun 29 11:42:20 2016 from xxx.xxx.xxx.xxx
[minto@nantoka-server ~]$
```

それがこうなった。（最後の行に注目）

```
Mintos-MacBook:~ minto$ ssh nantoka-server
Last login: Wed Jun 29 11:42:20 2016 from xxx.xxx.xxx.xxx
 ~]$ o@nantoka-server
```

実際は『o』の位置にカーソルが来ている。カーソルに被さる感じで『ログインユーザ名@ホスト名』の先頭4文字が抜けた状態のものが常に表示される。エンターキー押しても状況は変わらず。気持ち悪いし読みづらい…。

コマンドを入力しようとした際もガンガン崩れるし、rootを含め他のユーザに切り替えても状態は変わらず。なんなんだこれ…。

# 【前提】 bashプロンプトの表記は環境変数に定義されている

bashでは環境変数『PS1』によってプロンプトを定義している。

参考） [bashのプロンプトを変更するには - @IT](http://www.atmarkit.co.jp/flinux/rensai/linuxtips/002cngprmpt.html)

PS1を置き換えることによって、特殊文字を用いながらプロンプトをカスタマイズできる。
例えば以下の設定を行うと、シンプルに『$ 』だけのプロンプトに変更される。

```
$ export PS1="$ "
```

標準的なプロンプトでは、『ユーザ名』『ホスト名』『カレントディレクトリ』が表示されるくらいだが、『現在日時』『シェル名』『シェルバージョン』『コマンドの履歴番号』などを表示できるほか、色やbold・下線・点滅などの文字装飾もできる。

参考） [Bash カラープロンプト - ArchWiki](https://wiki.archlinuxjp.org/index.php/Bash_%E3%82%AB%E3%83%A9%E3%83%BC%E3%83%97%E3%83%AD%E3%83%B3%E3%83%97%E3%83%88)

このようなコマンドを ~/.bashrc などに記述することで、ログインする度にカスタマイズしたプロンプトを適用できる。

# 原因はホスト名の設定値不具合

確認してみたところ、PS1は以下の様な感じ。従来の設定から書き換わっているわけではなかった。

```
 ~]$ echo $PS1
[\u@\h \W]\$
```

PS1をいじってみたところ、『\h』（ホスト名）を含めた時だけプロンプトが崩れることが判明。どうやらホスト名が異常な状態らしい。

ただ、現状のホスト名を確認したところ、特におかしなところは無い。これはどういうことなんだろう…。

```
 ~]$ hostname
nantoka-server
 ~]$ cat /etc/sysconfig/network | grep HOSTNAME
HOSTNAME=nantoka-server
```

とりあえず値は変わらないはずだけど、ホスト名を再設定してみた。

```
 ~]$ sudo hostname nantoka-server
```

再ログイン。

```
Mintos-MacBook:~ minto$ ssh nantoka-server
Last login: Wed Jun 29 11:43:40 2016 from xxx.xxx.xxx.xxx
[minto@nantoka-server ~]$
```

直ってる…。なんでこれで直るんだ…。仕組みが分からないんだけど、中間ファイル（中間設定値？？）的な部分が壊れてたのか？

どうすることも出来なかったら、とりあえずPS1には『\h』（ホスト名）を除いた設定値にして過ごそうと思っていたんだけど、直ってしまったのでこれで解決。なんだったんだろ。
Slimとは？

![3170032.png](https://qiita-image-store.s3.amazonaws.com/0/20635/ac47af78-0c5c-254b-5ae4-8a66a6978563.png)

## Slimとは？
Ruby製の[テンプレートエンジン](https://app.codegrid.net/entry/template-engine-intro)
> データとテンプレートを合体させ、文字列を作る仕組み

## 何が良いの？
高速/軽量

## 用途
HTMLの代替などなど

## 使い方
・[速習テンプレートSlim(HTML作成編)](http://qiita.com/yterajima/items/53fd0387279510ff082a)
・[早い、簡単、生産的!? RailsのHTMLテンプレートエンジン Slim入門](http://ruby-rails.hatenadiary.com/entry/20140929/1411997071)
・[マークアッパー的 Slim 入門21の手引き](http://blogged.e2esound.com/2013/07/22/21_tips_to_use_slim_for_markup_engineer/)
Apache2.2.29をCentOS6.5にソースからインストール

1. ソースダウンロード
`# cd /usr/local/src/`
`# wget https://archive.apache.org/dist/httpd/httpd-2.2.29.tar.gz`

2. インストール
`# tar xzf httpd-2.2.29.tar.gz && cd httpd-2.2.29`
`# ./configure --prefix=/usr/local/apache-2.2.29 \
--with-included-apr \
--with-expat=builtin \
--enable-so \
--enable-rewrite \
--enable-ssl \
--enable-proxy \
--enable-headers \
--enable-status \
--enable-setenvif \
--enable-mods-shared=all`
`# make`
`# make install`

3. シンボリックリンク作成
`# ln -s /usr/local/apache{-2.2.29,}`

4. 起動スクリプト作成
`# cp -p /usr/local/src/httpd-2.2.29/build/rpm/httpd.init /etc/rc.d/init.d/apache`
`httpd=${HTTPD-/usr/local/apache/bin/httpd}
pidfile=${PIDFILE-/usr/local/apache/logs/httpd.pid}
CONFFILE=/usr/local/apache/conf/httpd.conf`

5. 自動起動設定
`# chkconfig --add apache`
`# chkconfig apache on`
`# chkconfig --list apache
apache           0:off   1:off   2:on    3:on    4:on    5:on    6:off`

6. 確認
`# /usr/local/apache/bin/httpd -M`
`Loaded Modules:
 core_module (static)
 mpm_prefork_module (static)
 http_module (static)
 so_module (static)
 authn_file_module (shared)
 authn_dbm_module (shared)
 authn_anon_module (shared)
 authn_dbd_module (shared)
 authn_default_module (shared)
 authz_host_module (shared)
 authz_groupfile_module (shared)
 authz_user_module (shared)
 authz_dbm_module (shared)
 authz_owner_module (shared)
 authz_default_module (shared)
 auth_basic_module (shared)
 auth_digest_module (shared)
 dbd_module (shared)
 dumpio_module (shared)
 reqtimeout_module (shared)
 ext_filter_module (shared)
 include_module (shared)
 filter_module (shared)
 substitute_module (shared)
 deflate_module (shared)
 log_config_module (shared)
 log_forensic_module (shared)
 logio_module (shared)
 env_module (shared)
 mime_magic_module (shared)
 cern_meta_module (shared)
 expires_module (shared)
 headers_module (shared)
 ident_module (shared)
 usertrack_module (shared)
 unique_id_module (shared)
 setenvif_module (shared)
 version_module (shared)
 proxy_module (shared)
 proxy_connect_module (shared)
 proxy_ftp_module (shared)
 proxy_http_module (shared)
 proxy_scgi_module (shared)
 proxy_ajp_module (shared)
 proxy_balancer_module (shared)
 ssl_module (shared)
 mime_module (shared)
 dav_module (shared)
 status_module (shared)
 autoindex_module (shared)
 asis_module (shared)
 info_module (shared)
 cgi_module (shared)
 dav_fs_module (shared)
 vhost_alias_module (shared)
 negotiation_module (shared)
 dir_module (shared)
 imagemap_module (shared)
 actions_module (shared)
 speling_module (shared)
 userdir_module (shared)
 alias_module (shared)
 rewrite_module (shared)
Syntax OK`

終わり
Gitの最初のコミットは空コミットにしよう

# 結論
**最初のコミットはrebase等がやりづらいので空コミット(`--allow-empty`)が良い**

```sh:例
# リポジトリ作成
git init
# 最初のコミット
git commit --allow-empty -m "first commit"
```
# 解説

Gitの最初のコミットを修正したいとなると以下のようなことをする必要がある

- `git commit --amend` で最初のコミットを修正する([コメント](https://qiita.com/NorsteinBekkler/items/b2418cd5e14a52189d19#comment-39f60397427ba8aeacdf)で教えてもらいました!)
    - この方法なら楽にできますね
- `git rebase -i --root`でrebaseする
- `git update-ref -d`で参照を更新する

**参照**

- [First commit が git rebase -i できない問題 → git rebase -i --root でできる](http://d.hatena.ne.jp/ken_c_lo/20130421/1366558065)
- [初回のコミットを取り消したいときにはgit update-refを使う](http://suzuken.hatenablog.jp/entry/2014/03/28/100311)

上記のよう面倒くさいので **first commit** は空コミットにしておくと良い。
こうすることで2回目以降が本質的に意味のあるコミットとなり、修正する場合は通常通り`git rebase`や`git commit --amend`等を利用すれば良くなる。

### 追記

[コメント](https://qiita.com/NorsteinBekkler/items/b2418cd5e14a52189d19#comment-39f60397427ba8aeacdf)で教えてもらったように

```
git rm 最初にコミットしたもの
git add 本当に追加したかったもの
git commit --amend -m "最初のコミット"
```

とすれば最初のコミットも簡単に変更できました。

## 良くある例

下記のようにfirst commitに意味のあるコミットが入ってしまうと修正したいときに困る。
(**7/3に例を修正しました**)

```sh:困る例
# Xcodeにて何か簡単なプロジェクトを作成
# (少し実装をしたもの)
# 作ったプロジェクトのディレクトリにてgit init(初期化)
git init
# 現状を追加してコミット
git add .
git commit -m "Xcodeのプロジェクト追加"
# あー、しまった.gitignoreを追加し忘れた！
# 理想的には以下みたいなコミットにしたかった！
# [1] .gitignore追加
# [2] Xcodeプロジェクト追加
# どうしよう:(
```

# 追記

## GitHubの場合

GitHubのリポジトリ作った後のフローを見ると、最初のコミットはほぼ空のREADMEの追加になっている

```shell-session
echo "# xxx" >> README.md
git init
git add README.md
git commit -m "first commit"
git remote add origin git@github.com:XXX/xxx.git
git push -u origin master
```

## `--allow-empty`で最初のコミットを作ることに対して

知り合いから

>`--allow-empty` って、わりと小ネタ機能みたいなもんだし、
履歴を綺麗に保ちたい勢的には、最初に謎に意味のないコミットがあるのはキモいし
別に綺麗じゃなくて良い勢的には、カジュアルに `rm -r .git;` していけばいい
わりと、**感情的な部分の提案**だと思う

との意見をもらった。
確かにそうかもしれない。
SoXコマンドをCentOS6.5にインストール

# Sox
音声ファイルを加工、変換できるコマンド

1. RPMforgeリポジトリ導入して必要なパッケージをインストール
`# rpm -Uhv http://packages.sw.be/rpmforge-release/rpmforge-release-0.5.2-2.el6.rf.x86_64.rpm`
`# yum -y install lame lame-devel libmad libmad-devel`

2. ソースダウンロード
`# wget http://sourceforge.net/projects/sox/files/sox/14.4.1/sox-14.4.1.tar.gz`

3. インストール
`tar zxvf sox-14.4.1.tar.gz && cd sox-14.4.1`
`# ./configure`
`# make all`
`# make install`

4. パスを通すためシンボリックリンク作成
`# ln -s /usr/local/bin/sox /usr/bin/sox`

5. 確認
`# which sox
/usr/bin/sox`
`# sox --version
/usr/local/bin/sox:      SoX v14.4.1`

終わり
Swiftで小さく始めるProtocol Extension

大したことじゃないんですが、Protocol Extensionって便利だねってなったのでメモ

```
protocol TestProtocol{
    func call()
}

extension TestProtocol where Self: NSObject{
    func call(){
        print("Call 2")
    }
}
```

こういうのを書いておくと、Protocolを実装した先がNSObjectを継承していればcallが実装されるようになります。


```
class TestClass:NSObject, TestProtocol{
}

class TestClass2:TestProtocol{
}
TestClass().call() // Call 2
TestClass2().call() // error
```

いいね。
bash自分用メモ

# 変数中のコロン

- お菓子がなければパンを選択すればいいじゃない
 `${お菓子:-パン}`

- お菓子があったらパンを選択するよ
  `${お菓子:+パン}`

- お菓子がなければパンを標準エラー出力に出すよ
  `${お菓子:?パン}`

- お菓子の一部をsubstringするよ(0オリジン)
  `${お菓子:n:m}`



参考：[@IT](http://www.atmarkit.co.jp/ait/articles/0010/19/news003.html)
pssh-2.3.1をCentOS6.5にインストール

# pssh(Parallel ssh)
複数のホストに対して同じ処理が実行できる並行処理型のSSHツール。

1. ソースダウンロード
`# cd /usr/local/src`
`# wget https://parallel-ssh.googlecode.com/files/pssh-2.3.1.tar.gz`
`# tar xzf pssh-2.3.1.tar.gz`
`# cd pssh-2.3.1`

2. インストール
`# python setup.py build`
`# python setup.py install`
`# pssh --version
2.3.1`

3. シンボリックリンク作成
`# ln -s /usr/local/src/pssh-2.3.1 /usr/local/pssh`
 
4. ノードリスト作成
`# mkdir -p /usr/local/pssh/nodelist`
`# touch /usr/local/pssh/nodelist/{test_app, test_api}`
`# vi /usr/local/pssh/nodelist/test_app
192.168.0.1
192.168.0.2`
`# vi /usr/local/pssh/nodelist/test_api
192.168.0.3
192.168.0.4`

終わり
VideoJsをコンパイルしてみる。

## はじめに
VideoJSをコンパイルしなくてはならなくなったのでそのメモです。
CDNあるみたいだからいらないのですが。。Gitから直接ダウンロードしてコンパイルしました。

## 概要
1. gruntの準備
2. gitからダウンロード
3. 必要なライブラリをインストール
4. コンパイル

## 詳細
----
#### 1. gruntの準備

gruntが動くようにインストールしときます。

```
$ sudo npm install -g grunt-cli
```

----
#### 2. gitからダウンロード

Gitからソースをダウンロードします。

```
$ git clone https://github.com/videojs/video.js.git
Cloning into 'video.js'...
remote: Counting objects: 19039, done.
remote: Compressing objects: 100% (100/100), done.
remote: Total 19039 (delta 51), reused 0 (delta 0), pack-reused 18939
Receiving objects: 100% (19039/19039), 96.30 MiB | 457.00 KiB/s, done.
Resolving deltas: 100% (12473/12473), done.
$ cd video.js/
```

----
#### 3. 必要なライブラリをインストール

必要なライブラリをインストールします。WARNが大量にでましたが関係なさそうだったので無視しました・・・

```
$npm install
```

----
#### 4. コンパイル
最後にコンパイルする。

```
$grunt dist
:
Done, without errors.


Execution Time (2016-06-29 02:25:44 UTC)
loading tasks     1.7s  ▇▇▇ 6%
jshint:src        3.5s  ▇▇▇▇▇▇ 12%
browserify:dist   7.4s  ▇▇▇▇▇▇▇▇▇▇▇ 24%
uglify:build     15.8s  ▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇ 52%
zip:dist          1.3s  ▇▇ 4%
Total 30.2s

```


## あとがき
特に問題なくコンパイルできました。まぁドキュメントにのっている通りで行っているだけなので。。

## その他
参考：[videojs/contributing-code](https://github.com/videojs/video.js/blob/master/CONTRIBUTING.md#contributing-code)
XtextGenerator で外部 EMF を追加する

結論
----

XtextGeneratorStandaloneSetup を継承するクラスを含む jar バンドルを作り、XtextGenerator に与える。

背景
----

新し目の Xtext は XtextGenerator でコード生成を行う。
そのため、2.7.x 辺りで使われていた手法(以下、従来手法)は使えない。でも、web には 2.7.x での手法を記録したブログが溢れている。困った。

追跡メモ
----

従来手法では、モデルは StandaloneSetup で追加していた。

XtextGenerator は内部に standaloneSetup というプロパティを持つ。
型は XtextGeneratorStandaloneSetup 。

よって、下記のような Xtend コードを書くことで、EMF パッケージを追加できる。

```
import org.eclipse.xtext.xtext.generator.XtextGeneratorStandaloneSetup
import com.google.inject.Injector
import org.eclipse.emf.ecore.EPackage
import autosar40.autosartoplevelstructure.AutosartoplevelstructurePackage

class ExtendedXtextGeneratorStandaloneSetup extends XtextGeneratorStandaloneSetup {
	
	override initialize(Injector injector) {
		super.initialize(injector)
		EPackage.Registry.INSTANCE.put("http://autosar.org/schema/r4.0/autosar40/atls", AutosartoplevelstructurePackage.eINSTANCE)
	}
}
```

これを読むように MWE2 ファイルを修正する。

```
import org.eclipse.xtext.xtext.generator.*
import org.eclipse.xtext.xtext.generator.model.project.*

var rootPath = ".."

Workflow {
	
	component = XtextGenerator {
		configuration = {
			project = StandardProjectConfig {
// 中略
		}

		// この行追加
		standaloneSetup = build.ExtendedXtextGeneratorStandaloneSetup {}

		language = StandardLanguage {
			
// 後略
```

クラスロードに関するハマりどころ
----------------------------

以上は、順当に考えれば行き着く。実は本当のハマりどころは下記だった。

Eclipse プラグインは過去の互換性問題もあって、jar にパックされていないバンドル形式をサポートしている。

一方、MWE2 は OSGi とは無関係に動作するよう考慮されたエンジン [^1] で、独自の jar 解釈機構を持っており、jar にパックされていない OSGi バンドルは読めない。

[^1]: Xtext の IntelliJ IDEA 対応など、Eclipse 以外へも手を伸ばしたがっているのと、たぶん関係がある。

つまり、workspace に上記 `ExtendedXtextGeneratorStandaloneSetup` を置いていても、Mwe2Launcher はクラスロードしてくれない。jar バンドルとして export してから、何らかの形で読めるようにする必要がある。[^2]

[^2]: dropins/ フォルダに入れるなり、p2 update site を立てるなり。

ちなみに、unpack されたバンドルを読めないのは、EMF バンドルでも同様である。
今どきの配布形態では、特別な理由がない限り jar バンドルにするはずであるが、その辺りの意識がおかしい製品も稀にあるので注意が必要である。[^3]

[^3]: たとえば車載ツールの事実上の標準パッケージである Artop とか Artop とか Artop とか…(まあそのおかげで MWE2 の最下層まで読む機会を得たので、いいけど)
Visual Studio Code　ショートカットキー　(Linux)

Visual Studio Code のショートカットキーの一覧です。OSはWindowsにVMをたてて入れた**Linux(CentOS)**となります。

# 環境
Windows7上のCentOS7
Visual Studio Code　0.10.11

# ショートカットキー

コードフォーマット：Ctrl　+　Shift　+　i

ページ内検索フォームフォーカス：Ctrl　+　f
(検索結果)次へ：F3
(検索結果)前へ：Shift　+　F3
プロジェクト内検索フォームフォーカス：Ctrl　+　Shift　+　f

置換フォームフォーカス：Ctrl　+　h
(検索結果を置換内容に)置き換える：Ctrl　+　Shift　+　1
(検索結果を置換内容に)一括置き換え：Ctrl　+　Alt　+　Enter

行指定移動：Ctrl　+　g

行削除：Shift　+　Ctrl　+　k

1行コメントアウト：Ctrl　+　/
複数行コメントアウト：Ctrl　+　k　⇒　c
複数行コメントアウト解除：Ctrl　+　k　⇒　u

左のファイルツリー表示/非表示：Ctrl　+　b

カーソル動作を一つ前に戻す：Ctrl　+　u

(エディタを1枚表示時)2枚目のエディタを表示：Ctrl　+　2
(エディタを2枚表示時)3枚目のエディタを表示：Ctrl　+　3
(エディタを複数枚表示時)エディタにフォーカス：Ctrl　+　数字　(一番左のエディタが1、右に行くにつれて大きくなる)

カーソルを動かさずに画面をスクロール：Ctrl　+　↑(↓)

Gitビューへ移動：Ctrl　+　Shift　+　g
[Lumen][Slim][Silex][Wave][Phalcon] PHPマイクロフレームワーク比較

PerlのAmon2みたいな、手軽なフレームワークが欲しくて探してみました。

https://blog.appdynamics.com/php/php-microframework-vs-full-stack-framework/ からの引用です。

|  | PHPバージョン | PHP 7サポート |プロジェクトWebページ | requireパッケージ | クラス数 |
|:-:|:-:|:-:|:-:|:--|--:| 
| Lumen  | 5.5.9～ | :o: | https://lumen.laravel.com/  | symfony/process<br>symfony/polyfill-mbstring<br>symfony/console<br>guzzlehttp/promises<br>psr/http-message<br>guzzlehttp/psr7<br>guzzlehttp/guzzle | 11[^1] |
| Slim 3 | 5.5～ | :o: | http://www.slimframework.com/  | pimple/pimple<br>psr/http-message<br>nikic/fast-route<br>container-interop/container-interop | 34 |
| Slim 2 | 5.3～  | :x: なし？ | http://docs.slimframework.com/  | | |
| Silex 2| 5.5～ | :o: （2016年6月時点では作業中？）| http://silex.sensiolabs.org/ | symfony/routing<br>symfony/polyfill-mbstring<br>symfony/http-foundation<br>symfony/event-dispatcher<br>psr/log<br>symfony/debug<br>symfony/http-kernel<br>pimple/pimple | 46 |
| Wave | 5.3～ | :x: なし？| http://www.waveframework.com/ | | |
| Phalcon | 5.3～ | :o: （2016年6月時点ではベータ扱い） | https://phalconphp.com/en/ | - | - |

[^1]: アプリケーション作成後のvendor/laravel/lumen-frameworkにあるクラス数

# インストール方法

## Lumen

composerを使います。

```
php composer.phar require laravel/lumen-installer
```

## Slim 3

composerを使います。

```
php composer.phar require slim/slim "^3.0"
```
## Slim 2

composerを使います。

```
php composer.phar require slim/slim "~2.0"
```

## Silex

composerを使います。

```
php composer.phar require silex/silex "~2.0"
```

## Phalcon

PHP Extentionなので、OSによりインストール方法が違います。

https://phalconphp.com/en/download


# 最小のHello World的なもの

## Slim 3

```php:index.php
<?php
use \Psr\Http\Message\ServerRequestInterface as Request;
use \Psr\Http\Message\ResponseInterface as Response;

require 'vendor/autoload.php';

$app = new \Slim\App;
$app->get('/hello/{name}', function (Request $request, Response $response) {
    $name = $request->getAttribute('name');
    $response->getBody()->write("Hello, $name");

    return $response;
});
$app->run();
```

# 考察

Lumen単独では小さいのですが、いろいろ外部のものを使用しているので、あまりマイクロフレームワークっぽくないかもです。

Waveは開発終了したのでしょうか？更新されていません。

CentOS 6のようなPHP 5.3環境では、Slimi 2がよさそうです。
Redmine 3.3.0 新機能のご紹介(3)

#Redmine 3.3.0 新機能のご紹介(3)

##11.チケットのステータスを変更しても「前」「次」リンクを表示 (#14462)
Previous/next links may be lost after editing the issue

以前のバージョンでは、チケットのステータスを「終了したチケット」に変更すると、「前」「次」リンクが表示されなくなりました。3.3.0バージョンからはこれを表示するようになりました。
<img width="521" alt="WS000012.JPG" src="https://qiita-image-store.s3.amazonaws.com/0/94912/588b5522-41e1-ea39-c761-3f156488b622.jpeg">

##12.「自分自身による変更の通知は不要」をデフォルトでオンにする(#14574)
I don’t want to be notified of changes that I make myself as Default for all User

「管理」->「ユーザー」->「新しいユーザー」をクリック時、以前のバージョンでは「自分自身による変更の通知は不要」のデフォルト値がオフでしたが、3.3.0バージョンからはオンになりました。
<img width="524" alt="WS000013.JPG" src="https://qiita-image-store.s3.amazonaws.com/0/94912/19a8f7c9-dc24-8a30-e429-8f2fc8a7504d.jpeg">
 
##13.プログラム言語別にハイライト表示機能(#14937)
Code highlighting toolbar button

エディターで下図のように をクリックするとプログラム言語を選べるメニュが表示されます。任意の言語を選択するとエディターに該当プログラム言語をハイライト表示させるタグが挿入され、そのタグ内で該当プログラムソースを記述するとハイライト表示をします。
下図で赤枠と青枠には同じプログラムソースが記述されていますが、赤枠はハイライト表示させるタグ内に記述したため、該当プログラムソースがハイライト表示されていますが、青枠はハイライト表示させるタグ内に記述していないため、ハイライト表示されていません。
<img width="422" alt="WS000014.JPG" src="https://qiita-image-store.s3.amazonaws.com/0/94912/dad511cd-8ca8-1565-9de5-659f1ff8430e.jpeg">

##14.Redmineで画像ファイルをプレビュー機能 (#22058)
Show image attachments and repo entries instead of downloading them

以前のバージョンでは、添付されたテキストファイルは アイコンをクリックすることにより、Redmineでプレビューすることができましたが、画像ファイルはプレビューすることができませんでした。3.3.0バージョンからは画像ファイルもプレビューすることができます。
<img width="510" alt="WS000015.JPG" src="https://qiita-image-store.s3.amazonaws.com/0/94912/67cc30fb-e5c0-e0c4-3573-1c72494a72df.jpeg">

15.フィルタの追加で「関連するチケット」を「関係」に変更 (#22147)
Change “Related issues” label for generic grouped query filters

以前のバージョンではフィルタの追加のドロップダウンリストで「関連するチケット」と表示されましたが、3.3.0バージョンからは「関係」に変更されました。
<img width="487" alt="WS000016.JPG" src="https://qiita-image-store.s3.amazonaws.com/0/94912/ca1079dc-658a-7b26-4472-69d60ced4d2f.jpeg">

##16.インポートでトラッカーとステータスをマッピングする機能(#22951)
Make Tracker and Status map-able for CSV import

インポートで以前のバージョンではトラッカーをCSVの項目名から選択するのではなく、Redmineの値を参照してユーザーが事前に選択する必要がありました。また、ステータスはインポート後に設定をする必要がありました。
<img width="526" alt="WS000017.JPG" src="https://qiita-image-store.s3.amazonaws.com/0/94912/bfc6ddb3-b8d2-1140-ee0a-40f69b13d427.jpeg">

3.3.0バージョンからはトラッカーとステータスをCSVの項目名から選択してマッピングすることが可能になりました。
<img width="526" alt="WS000017_2.JPG" src="https://qiita-image-store.s3.amazonaws.com/0/94912/14a453fa-1a2c-a483-30fd-1c99d2b01ab5.jpeg">

##[関連リンク] 出典・参考情報
本資料は、[Ankosoft社](http://www.ankosoft.co.jp/)の資料を元に作成しました。
出典URL：http://www.ankosoft.co.jp/redmine3-3-0-3/
PDF資料は[こちらから](http://www.ankosoft.co.jp/wp-content/uploads/2015/09/Redmine_3.3.0.pdf)