OmniAICreator/Qiita-1.07M huggingface dataset:
ちょっとずつ読むドメイン駆動設計 第四部 戦略的設計 結論

# エピローグ

> 最先端のプロジェクトに従事して、興味深いアイデアとツールを使って実験するのは非常にやりがいのあることだが、そのソフトウェアに生産的な使いみちがなければ、そうした経験も私にとっては空しいものにすぎない。実際、成功したかどうかの真の評価は、ソフトウェアが長期間にわたってどれだけ役立つかで決まる。(結論より)

残念ながら長期にわたって役にたってきたソフトウェアがイコール、複雑なビジネスの問題領域がソースコードに反映され、しなやかな設計で変更が容易なソフトウェアであるわけではないです。

KentBeckもこんなことを言っています。

> 読むに耐えないコードが大金を稼いでいる場面を何度も見てきた。(実装パターンより)

ただ、長期に渡って役に立つソフトウェアというのは、どこかで必ずビジネスの転換があり、機能が追加されたり、変更されたり、削除されたりします。

そのとき、ビジネスの転換に合わせてスムーズに変更ができるのは、当然しなやかな設計の方でしょう。
なぜなら、変更の動機は**ビジネス**から発生しているからです。

それにも関わらず読むに耐えないコードが、現在でも量産されているのは、どういった理由からでしょうか？
その理由のひとつとして自分が思い浮かぶのは、フレームワークの進化。

たとえば、DatabaseのマッピングにActiveRecordを採用しテーブルと同等のモデルを書けばDBのCRUDまでしてくれて、かつ規約に基づいたモデルを書けばViewとの接続も容易なRubyOnRails。
起動するだけで、CMSが動作し、多少複雑でもプラグインをインストールしたり、Viewをいじればある程度応用が効くWorｄPress。

こういったフレームワークの進化はエンジニアリングの敷居を低くしてくれました(自分もその恩恵を受けた一人)。
一方、**複雑なビジネスの領域は現在でも複雑なまま**です。
そんなアンマッチングの状況が、複雑なビジネスに立ち向かえないソフトウェアを量産してしまったのではないかと思います。

> 素人にもわかるフレームワークを作成してはならない。(17章より)

とEvansが言っているのはこういうことだと思います。
(さすがに「設計ができるほどには賢くないのなら、ソフトウェア開発を担当させてはならない。」(17章より)というのは厳しいと思いますが・・・)

> 実際に動く複雑なソフトウェアを、素人が作成できる時代にはなっていない。(結論より)

今でもこれは言えるのではないですかね。RailsもWordPressも敷居は低いが、DBやViewと密結合で、複雑なドメインを反映できるようなモデルを書けるようにはなってはいないです。だから、

> 複雑なドメインと格闘して、わかりやすいソフトウェア設計にすることは、優秀な技術者にとって刺激的な挑戦なのだ。(結論より)

> 優れたソフトウェアを作成することが学び考える活動であるという、中核的な事実を見失ってはならない。モデリングには想像力と自己規律が必要である。(結論より)


ということですよね。ドメイン駆動設計を学ぶのはまだまだ第一歩。ここから実際に複雑なドメインに関わって、関わって、関わって、ソースコードにすること。

１冊読み終わりましたが、学びはこれからです。

あっ!後、追加されたパターンがあるので、もう少し"ちょっとずつ読むドメイン駆動設計"は続きます。。。
アドベントカレンダーをやる1つの理由

2017年末、[会社で初めてQiitaアドベントカレンダーを作りました](https://qiita.com/advent-calendar/2017/ateam-lifestyle)。社内のデザイナー・エンジニアの有志25人で技術系の記事を書いて、社外に向けて公開しました。

アドベントカレンダーのように会社のブログとして情報を社外に向けて発信するのは弊社では初めての取り組みだった事もあり、「なぜやるのか？」を説明しました。そこで考えたことを書きます。

![wordpress-265132_640.jpg](https://qiita-image-store.s3.amazonaws.com/0/50391/20ce9c3f-db05-7c4b-fd30-2d2d3fe92c38.jpeg)


## やる前に考えたこと

### 採用

真っ先に考えた意義は**採用**です。ブログ記事を社外公開する事によって、それを見た人がうちの会社の面接に来てくれて入社に至ったならば、その採用はブログの成果と言えます。優秀なエンジニアを1人採用するのに何円かかるかを考えれば、ブログがどれくらいの成果だったのかは定量化できます。

しかし、果たして本当に採用が最大の意義なのかは私にとって疑問でした。

例えば[クラスメソッド株式会社のDevelopers.IO](https://dev.classmethod.jp/)には良質な記事が継続的に提供されていますが、これは会社の技術ブランドを向上することにより案件受注に繋げる意図があると思います。しかし、弊社のビジネスモデルにはそういう本業とのシナジーもありませんでした。

### インターナルコミュニケーション

ブログをやる事の意義として、対外的なメッセージ発信に加えて、ブログを通した**インターナルコミュニケーションの活性化**もあるかなと思っていました。実際に、社内でお伺いを立てた時には採用に加えてこの事も目的として明記しました。

会社が一定以上の規模になってきて、勤務地も複数個所で分かれて、社内のエンジニア同士でも顔が分からない人が出てきました。そこで「この人はこんな技術が得意なのか、今度聞いてみよう」みたいなゆるい繋がりを生むことができれば、それはブログが無かったら生まれないコミュニケーションであり、ブログをやる価値のひとつだと言えると思います。

このように**社外に情報発信することにより社内にも何らかのメリットがある事**は分かっていたものの、なかなか上手く言語化できないままアドベントカレンダーを終えてしまいました。

## 終わってみて改めて考えたこと

今になって色々考えてみて、ブログの意義は採用だけでなく、それを含めた**人事活動**にあるのではないかと思いました。

- 誰がどんな能力を持っているか明文化する
- 人が持っている暗黙知を、形式知として共有する
- アウトプットするために能力を伸ばす
- 優良な記事を書く事によって活躍する
- それらを見た人がこの会社に魅力を感じ、採用に繋がったり、会社に誇りを持てるようになる

このような**採用・成長・活躍**という人事の要素が、非連続ではあるものの「アドベントカレンダー」という1つの行事に詰まっていたと思います。

### 成長

たとえばアドベントカレンダーを書くにあたって、ものすごく色々な事を調べてきたり、社内チャットで「○○について知っている人いますか？」といった質問が生まれたりしていました。メンバーに成長の機会を少しでも作ることができたかなと思っています。

また、アドベントカレンダー自体をナレッジとして残すこともできます。後から同じような技術を使う時に、QiitaのURLを渡すだけで**個人の技術ナレッジをチームに還元**できます。弊社で使っている技術はオープンソースソフトウェアが多いので、込み入った内容であっても割と積極的にQiita等で情報公開する事ができます。

### 活躍

たとえレベルの高いノウハウを持っている人でも、毎日毎日の業務で必ずしも最高レベルの技術を求められ続け、最大のスキルを発揮し続けられるとは限りません。アドベントカレンダーは、そういったレベルの高さを思う存分に発揮して頂ける機会となりました。

また、アドベントカレンダーをやってみて意外だったのが**文章化して伝えるスキルの高さも発揮できる**という事です。たとえ技術レベルがめちゃくちゃ高い内容ではなくても、文章化が上手かった場合、その記事はみんなから必要とされます。

こういった、人が持っているタレントを少しでも引き出す機会を、アドベントカレンダーによって作ることができたと思っています。私は人を評価する役割ではありませんが、アドベントカレンダーに参加して記事を書いた事が上長からの評価に繋がったという声も執筆者から頂いたので、これも人事活動に含まれると思います。

正直、「成長」の機会を作るだけであれば社内ブログでも構わないと思います。ですが**社外に記事を公開することで、「活躍」の機会をより効果的に作ることができた**と感じています。

## まとめ

アドベントカレンダーのような会社ブログを作る意義は、**採用・成長・活躍の機会を作る、人事の活動**にあるのではないかと思いました。その中でも採用は定量的に評価しやすいという側面を持っているので、成果の指標としては使いやすいと思います。

弊社の名刺には、デザイナーでもエンジニアでも全員に「人事部」という肩書が付いています。「全員で協力して採用に取り組もう」という狙いによるものですが、意図せずしてより人事部らしい事をしていました。

### 参考

- [WEB\+DB PRESS Vol\.97 (特集3 マネジメント入門)｜技術評論社](http://gihyo.jp/magazine/wdpress/archive/2017/vol97)
- [アドベントカレンダーを4年間運営してきた中で学んだ4つのこと \- Qiita](https://qiita.com/masahixixi/items/3b0d8911977e4cef82e1)
- [アドベントカレンダーをやる意味を考える \- Qiita](https://qiita.com/shintani_works/items/24b90c39d487470b16b5)
AWS S3に静的ウェブサイトのホスティング

S3はAWSの中核となるストレージサービスとしてよく使われますが、静的なWebサイトをホストすることもできます。
S3の静的ホスティングは、サーバサイトのプログラム言語が使えないですが、html、javascript、css等クライアントサイドのスクリプトのみ、それなりのWebSiteが作れます。

##S3 Bucketを作成
バケット名がsample-web-site-001のバケットをまず作ります。
![image1.png](https://qiita-image-store.s3.amazonaws.com/0/191079/e6dea2c0-cd43-d97c-98b8-f8a3bd63c978.png)
バケットプロパティはそのままで次へ
![image2.png](https://qiita-image-store.s3.amazonaws.com/0/191079/cdece6ed-58d5-658b-c4d5-de11f0bbf106.png)
パーミッションもとりあえずいじらずCreate Bucketします。
![image3.png](https://qiita-image-store.s3.amazonaws.com/0/191079/3dd41966-9c39-8116-93f7-38287e91a065.png)
バケットにWebサイトの資材をデプロイ、ここでまずindex.htmlとエラー時のerror.htmlアップロードします。
![image4.png](https://qiita-image-store.s3.amazonaws.com/0/191079/8af5ef88-9671-fad5-e253-cb0afaed081f.png)


##Bucketを公開
作成されたバケットを選択して、Propertiesタブを開きます。
![image5.png](https://qiita-image-store.s3.amazonaws.com/0/191079/9387a4c2-d3f0-5512-65f7-20b8915e231f.png)
Static website hostingをクリックして、さきほどパップロードしたindex.htmlとerror.htmlをindexページとErrorページに設定して、Saveします。
![image6.png](https://qiita-image-store.s3.amazonaws.com/0/191079/37e3dd15-c787-e836-0e21-4516822b2c05.png)
最後にPermissionsタブのBucket Policyで以下のパケットポリシーを入れて完了します。

```json
{
    "Version": "2008-10-17",
    "Statement": [
        {
            "Sid": "samplesite",
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::sample-web-site-001/*"
        }
    ]
}
```
![image7.png](https://qiita-image-store.s3.amazonaws.com/0/191079/1fe0963e-0748-4006-ce00-21e82e85b6ac.png)

##WebSiteを開く
ウェブサイトを開くには、バケットの AWS リージョン固有のウェブサイトエンドポイントで使用できます。

```text
<bucket-name>.s3-website-<AWS-region>.amazonaws.com
```

http://sample-web-site-001.s3-website-ap-northeast-1.amazonaws.com

![image8.png](https://qiita-image-store.s3.amazonaws.com/0/191079/d29b6ad2-2322-b806-bd10-9744d01afd76.png)

##Error発生時
バケットのPropertiesタブで、Static website hostingのindexページを存在しないものに変更しますと、
![image9.png](https://qiita-image-store.s3.amazonaws.com/0/191079/0015272c-f47e-c847-dde6-b28cab2a3b2a.png)
今度はエラーページに遷移され、error.htmlの内容が表示されます。（いわゆるSorryページですね）
![image10.png](https://qiita-image-store.s3.amazonaws.com/0/191079/e5b9573b-fba4-b705-7e47-0c16604439b4.png)

##参考資料
[Amazon S3による静的Webサイトホスティング](https://www.slideshare.net/horiyasu/amazon-s3web-27138902)
LaravelでインサートしたデータのID値を確認する

方法としては、２通りある。

##Eloquentを利用している場合

Memoというモデルがあるとした場合、save()後に、インスタンスが更新されて、id値が記録される。

```php
$memo = new Memo;
$memo->content = "コンテンツ";
$memo->save();
```

よって、以下のコードでインサートしたデータのid値を確認することができる。

```php
$id $memo->id; 
```

##SQLをそのまま利用している場合

PDO経由で、lastInsertId()が利用できる。

```php
$param = ["content" => "コンテンツ"];
DB::insert('insert into memos (content) values (:content)', $param);
$id = DB::getPdo()->lastInsertId();
```
Excelを使って簡単に画像加工

# 画像加工の種類
- 背景の透過処理
- 画像の色調変更
- 透過処理した画像の保存

Excel 2016を利用しています。
また、「背景の透過処理」及び「画像の色調変更」は、PowerPointでも行うことができます。
画像の保存については、それぞれの方法を記述しています。

# 背景の透過処理
## 透過したい色を選択し透過処理する方法
透過処理を行いたい画像を選択し、タブから[書式]を選択し[色]の下三角をクリックし[透明色を指定(S)]をクリックします。その後、マウスポインタが変わるので透過したい部分をクリックすると同じ色の部分が透過処理されます。

![背景透過1.gif](https://qiita-image-store.s3.amazonaws.com/0/74437/6c3b9efa-f7bf-0bb8-42eb-b78029c4d412.gif)


※元とした画像の質が悪く点が少し残ってしまいました。

## 透過したくない色を選択し透過処理する方法
透過処理を行いたい画像を選択し、タブから[書式]を選択し[背景の削除]をクリックします。
その後、選択範囲が表示されるので、残したい部分を囲うように選択範囲を変更します。
範囲内に入れ、[保持する領域としてマーク]をクリックします。
マウスポインタが変わるので残したい部分の色を選択していき[変更を保持]をクリックすることで確定します。

![背景透過2.gif](https://qiita-image-store.s3.amazonaws.com/0/74437/e7e1a28f-f48e-7b33-e8e5-13d9ce8f2dc0.gif)


※白を削除した場合と異なり、黒色側の境界が汚くなってしまっています。
  極力画質のいいものを利用するようにしてください。

# 画像の色調変更
透過したい色を選択し透過処理する方法と同様に、タブから[書式]を選択し[色]の下三角をクリックし「色の彩度」や「色の変更」で色を変えることができます。
また、[アート効果]を選ぶことで、エッチングなど行うことができます。

![色調変更.PNG](https://qiita-image-store.s3.amazonaws.com/0/74437/85b9b5b1-36be-bd10-2a7b-4c6532b82f31.png)
![アート効果.PNG](https://qiita-image-store.s3.amazonaws.com/0/74437/b2e59da9-0cd1-0ac5-57ec-9afe9101573b.png)

# 透過処理した画像の保存
## Excelを利用する場合
[ファイル]-[名前を付けて保存]を選択します。
保存する際、[ファイルの種類(T)]で「Webページ(\*.htm;\*.html)」を選択します。
保存されたhtmlファイルと同じパスにfilesフォルダが作成され、
その中にブック内の画像が透過処理されたpngファイルとして保存されます。

PowerPointを利用する場合と比べ、セルのサイズをピクセル単位で調整し[Altキー]でセルに合わせることで
任意のピクセル単位での画像保存を行うことができます。

![ピクセル調整.PNG](https://qiita-image-store.s3.amazonaws.com/0/74437/d8e11ce6-0867-5024-aaca-e6216004c682.png)
![ピクセル単位結果.png](https://qiita-image-store.s3.amazonaws.com/0/74437/1073adde-b3fd-9fe5-69f7-946cd474139e.png)


## PowerPointを利用する場合
保存したい図を選択し、右クリックメニューから[図として保存(S)...]を選択し、
ファイルダイアログにて保存します。
Excelを利用する場合に比べ、複数の形式から選択し保存することができます。

![図として保存.PNG](https://qiita-image-store.s3.amazonaws.com/0/74437/5c315353-1d0f-3cf9-8326-3ea725fb4414.png)
![図として保存_保存画面.PNG](https://qiita-image-store.s3.amazonaws.com/0/74437/62f4aea9-3c3f-0633-1d84-7cd1138c828b.png)




# 参考
[Microsoft Office Support 図を透明にする](https://support.office.com/ja-jp/article/%E5%9B%B3%E3%82%92%E9%80%8F%E6%98%8E%E3%81%AB%E3%81%99%E3%82%8B-ce96ac80-5afc-436c-ae3f-0c78009bf704)
[Microsoft Office Support 図の背景の削除](https://support.office.com/ja-jp/article/%E5%9B%B3%E3%81%AE%E8%83%8C%E6%99%AF%E3%81%AE%E5%89%8A%E9%99%A4-c0819a62-6844-4190-8d67-6fb1713a12bf)
Dockerおさわり

Dockerにおさわりしたときのまとめ。
概念は置いといて、とりあえずコンテナを動かすだけ。

##環境
CentOS7.4
AmazonLinux2でも同じでした。

##Dockerインスコと起動

```
sudo yum install -y docker
sudo systemctl enable docker
sudo systemctl start docker
sudo systemctl status docker

```

##イメージ持ってくる
```
sudo docker pull centos
```

##とりあえずコンテナ起動して落とす
```
sudo docker run -it centos
```
- docker runだけで、-itを付与しないとコンテナを停止状態で作成するのみ
- 無事コンテナに入れたら、プロンプトが変化する

```
(プロンプトが変化した状態で）　exit
```
 - コンテナを__落としつつ__コンテナから抜ける

__※普段のexitと同じ感覚で使うと死ぬ。__

Ctrl + P -> Ctrl + Qでコンテナを__落とさずに__コンテナから抜ける

##いまあるコンテナを確認する
```

（host側で）sudo docker -ps

```

##起動中のコンテナにもう一回入る

```

docker attach [起動中コンテナのimageID]


```



exitで抜けてもコンテナ自体は停止したまま残り続ける。

```

docker ps -a

```

で停止中コンテナも含めた確認ができる。


_________

いったんここまで。
Docker-Comporseとかは今度触ります。
Pythonでサブディレクトリにある.pyファイルをよみこみたいとき

# 前提条件
たとえば`./pyfile/readfile.py`があって中で `class readdata`が定義してあるとき、./main.pyからよびだす方法
# 方法１

./main.pyでpathを追加

```python3
import sys,os
sys.path.append(os.path.dirname(os.path.abspath(__file__)) + '/pyfile')

from readfile import readdata
```
# 方法２

追記　コメントありがとうございます。こっちのほうがいい

空のファイル`./pyfile/__init__.py`を作成する。`./main.py`はこれだけ

```python3

from pyfile.readfile import readdata
```
InnoDB の DoubleWrite 技術をみる

## doublewrite とは？

InnoDB が備わっている「データ二重書き込み」によるデータ保護機能。最初から有効になっている。[^1] この機能はトランザクションログとは別なので混同しないように。

- MySQL Server での説明
  - https://dev.mysql.com/doc/refman/5.7/en/innodb-doublewrite-buffer.html
- MariaDB Server での説明
  - https://mariadb.com/kb/en/library/xtradbinnodb-doublewrite-buffer/
- Percona Server での説明
  - https://www.percona.com/doc/percona-server/5.5/performance/innodb_doublewrite_path.html
  - SSD/HDD 混在環境のために `doublewrite buffer` を個別に設定出来る機能を持ってる

## どういう仕組みなのか？

- テーブルスペースの `doublewrite buffer` 領域と呼ばれる場所に書き込む
  - 当該領域は [最低でも 100 ページ分が確保](https://github.com/mysql/mysql-server/blob/5.7/storage/innobase/buf/buf0dblwr.cc#L211)[^2] されており、連続追記に適した設計になっている
  - 使われなくなった領域は実データ書き込み後解放（再利用）される
- `fsync` 関数を呼び出し
- テーブルスペースのデータを書き込むページに書き込む
- `fsync` 関数を呼び出し

二重にデータを書き込む形だが、[Percona の説明](https://www.percona.com/doc/percona-server/5.5/performance/innodb_doublewrite_path.html#performance-impact-of-the-doublewrite-buffer) によると

  - 基本的には 5% 未満に収まる
  - ただしバッファプールに適合しない場合 30% の劣化が出る
    - ランダムアクセスが多発するため
  - 書き込み多発して `doublewrite buffer` が一杯の場合も解放待ちのため劣化幅が大きくなる

仕組み的に巨大な BLOB とは相性がとても悪いように思われる

## なんのために使われるのか？

瞬断等により中途半端にデータが書き込まれた状態になった場合 (half-write) に修復のために利用される

- 本来書き込まれるはずのデータが破損していた場合は `doublewrite buffer` 領域から修復
  - `doublewrite buffer` 領域が先に書き込まれてるため
- `doublewrite buffer` 領域のデータが破損していた場合当該データは無視
  - トランザクションログである redo ログから修復する

## ソースコード上はどこに存在するのか？

[`storage/innobase/buf/buf0dblwr.cc`](https://github.com/mysql/mysql-server/blob/5.7/storage/innobase/buf/buf0dblwr.cc) にある

## 無効にしてよいのか？

基本的には無効にすべきではない。が、以下に該当する場合は無効に出来る

- Fusion-IO を使用している場合
  - Fusion-IO が備わっている `Atomic Writes` で代替可能
  - そもそも Fusion-IO を使っている場合 MySQL では自動的に無効化される[^3]
- ファイルシステムに ZFS を使っている場合[^4][^5]
  - Atomic Writes に対応しているため

[^1]: ただし後述するように Fusion-IO 上の場合は無効になる
[^2]: https://www.percona.com/blog/2006/08/04/innodb-double-write/
[^3]: https://dev.mysql.com/doc/refman/5.7/en/innodb-doublewrite-buffer.html
[^4]: http://nippondanji.blogspot.jp/2010/01/mysqlinnodbzfs.html
[^5]: https://www.percona.com/forums/questions-discussions/percona-xtradb-cluster/47566-xtradb-5-7-cluster-zfs-on-linux-and-parallel-doublewrite-path-as-0_direct
Fuelphpのプロジェクトをherokuにデプロイする

## 環境
FuelPHP 1.8
PHP 5.6.3
すでにプロジェクトをgitにて管理しており、そのプロジェクトをherokuを活用して
デプロイする状態です。

ちなみに、ディレクトリ構成は以下の通り
Project
｜ー Fuel(FuelPHPのディレクトリ)
｜ー composer.json
｜ー composer.lock
｜ー Procfile (heroku上でapacheの設定をするファイル)

herokuへの登録などは済ませてあるものとします。
## 事前準備

### composerをmasterにpush
まずheroku createする前に、composerをremoteリポジトリで管理するようにします。
herokuでPHP環境を作るためにはcomposer.jsonとcomposer.lockが必須。
comoser.lockがignoreファイルに入っていたので、ignoreから外してgitにpush

※注意 
composer.jsonとcomposer.lockはプロジェクト直下に置いておかないと、
後々大変になります。

### プロジェクト直下にProcfileを作成
サーバーにapacheを使うように指定
public/と記述することで、プロジェクト内のpublicディレクトリをapacheさん見てくださいと
教えてあげるために以下の記述しProcfileという名前をつけて保存。
プロジェクト直下に置いておく

```
web: vendor/bin/heroku-php-apache2 public/
```

## herokuにデプロイ
### herokuにプロジェクトをcreate
準備が整ったらついに、heroku使っちゃいます。

`heroku create chousei`

### heroku masterにpush
`git push heroku master`

※注意
ドキュメントルートにindex.phpやcomposer.jsonがないと、PHPだと判別できないようなので、buildpackというものを指定しないと、そもそもherokuにpushできません。なので、こんなエラーや

```
remote:  !     No default language could be detected for this app.
remote: 			HINT: This occurs when Heroku cannot detect the buildpack to use for this application automatically.
```

こんなエラーが出てきた場合は

```
remote: -----> App not compatible with buildpack: https://github.com/heroku/heroku-buildpack-php
remote:        More info: https://devcenter.heroku.com/articles/buildpacks#detection-failure
remote:
```

空のindex.phpをプロジェクト直下に置いたり、
herokuのプロジェクト管理から、buildpackを指定したりしないといけ無くなります。

## Mysqlの設定
もともと、プロジェクトはMysqlを使っていたため、Mysqlをheroku上で
使えるようにします。

web上のプロジェクト管理で、clearDBというaddonを追加します。
その後、プロジェクト内のディレクトリで

`heroku addons:add cleardb`

これで、herokuでMysqlを使うことができます！
以下のコマンドでDBの情報を見ることができるので

`heroku config`

```
CLEARDB_DATABASE_URL:mysql://ユーザ名:パスワード@サーバ名/データベース?reconnect=true
```

上のユーザー名、パスワードなどを使ってDBに接続

今回はstaging環境として使用したいので、プロジェクトの
fuel/app/config/db/staging.phpに`heroku config`で参照した値を設定してあげる

あとは、以下のコマンドを打って、herokuがstaging環境だよというように設定

`heroku config:set FUEL_ENV=staging`

これで、DBへの接続はできるので、あとはmigrationだけ。
`heroku run`コマンドを使えば、heroku環境でmigrationできるので

`heroku run 'php oil r migrate'`

ここまでできてしまったら、

`heroku open`

と打てば、作った成果物を見ることができるはず！
自分は、git管理の仕方をミスっていたので大変だったが、
手順やルールさえ覚えてしまえば簡単にできてしまうので感動でした。

参照
[HerokuへFuelPHPプロジェクトをデプロイ](https://qiita.com/gigatune/items/2c98091badc36294b19f)
[heroku Meets FuelPHP](https://qiita.com/mikakane/items/a736112a8b68925d27a7)
[FuelPhpをHerokuで動かす](https://www.tenpu.me/blog/heroku-for-fuelphp/)
LaTeXでSETのカードを再現する

# はじめに
　LaTeXでSETのカードを描くパッケージを作ったので、それの使い方などを解説する記事を書きました。
　実はこれが一番最初に一から作ったパッケージであるので書き方が色々とアレかもしれませんが、指摘していただけるとありがたいです。余裕があればCTANにも上げるはずです。また、機能追加も余裕があればするはずです。

# 内容説明
　再現したのは形だけで、カードに関してはまだです。斜線の向きとか波型の形とかで厳密な再現はできていませんが許容してください。
　すべてTikZを使って描き、点対称な図形です。斜線部に関しては[この記事](https://tex.stackexchange.com/questions/54358/custom-and-built-in-tikz-fill-patterns)を参考にしました（実はこのマクロに関しては一部理解できていない部分があります。申し訳ありません。）。
　形は「マル」「ヒシ」「ニョロ」の3種類、模様は「ナシ」「ヌリ」「シマ」の3種類です。色は自由に変えることができ、指定しなければ黒です。
　パッケージ名は「setcard」です。
# コマンドについて
　形のhisi,hisi,nyoroと模様のnasi,nuri,simaを単純に組み合わせるだけです。色はオプションです。つまり、\hisinuri[red]とやれば、赤色で縞模様の菱形ができるわけです。
　\nyorosimaと書けば、黒色の波型で縞模様のものができます。
# 公開について
　GitHubにもCTANにも上げていないのでとりあえずドロップボックスにテスト用のtexファイルとパッケージ本体のstyファイルを上げておきます。GitHubの方にも登録して上げるはずですがお待ち下さい。
　マニュアルも作っていません。
　今日できたのだから仕方がないといえば仕方がないのですが……。
　ドロップボックスのURLは[こちら](https://www.dropbox.com/sh/ijrjwtp5hocwoeb/AABwkxesAIUDCqseoGCe7gZfa?dl=0)です。
# おわりに
　はじめての本格的なパッケージ作成なので指摘等あればよろしくお願いいたします。
　著作権関係が怖いので一応このパッケージの利用は個人的な活動にとどめお金を取るものに使うのでしたらSETを作っている会社の方へご相談を。
Pythonの仮想環境についてのまとめ（自分用メモ）

2018/01/30 @aodag さんからTwitterでご意見を頂いたので、venvとpyvenvを統合しました。ご指摘どうもありがとうございました。
2018/01/29 @driller さんから頂いたご意見を参考にvenvの部分を修正しました。情報提供どうもありがとうございました。
2018/01/29 @kashew_nuts さんから頂いた編集リクエストを採用しました。編集リクエストどうもありがとうございました！

# 本記事の趣旨
以前も[Qiitaの記事](https://qiita.com/nobolis/items/12a464557f2ae007e9a1)にまとめたのですが、相変わらずPythonの仮想環境まわりのツールが似たような名前で混乱するので自分のために整理しました。あくまで、仮想環境周りの用語としてどんなものがあるか、いま自分が持っている知識をでもって選択するとしたら自分自身はどれを選ぶか、ということについて書いている記事であり、特定の環境を推奨したり、仮想環境の利用を推奨するものではありません。「まだまだ腑に落ちないことがあり」と書いていましたが、 @uranusjr さん、　@kashew_nuts さん、 @driller さん、 @aodag さんのご教示により、概ね情報が整理できましたので、現時点（2018/02/02）では間違ったことは書いてないはずです。

# pyenv
* Python自体のバージョン管理ツール
* Windowsでは使えない

参考: 

* https://github.com/yyuu/pyenv/issues/62

# virtualenv
* Pythonの仮想環境作成ツール
* サードパーティ製パッケージ
* Python3.3以前のデファクトスタンダード

参考:  

* http://ymotongpoo.hatenablog.com/entry/2017/01/29/002039

# venv 
* virtualenvが標準モジュールとなったときのモジュールの名称 (Python3.3～）
* pyvenvはvenvを利用するためのスクリプト
* Python3.5からpyvenvを使わずvenvモジュールを実行することが推奨となった

参考: 

* https://docs.python.jp/3/library/venv.html
* [Python3.3のvenvを試す](http://ymotongpoo.hatenablog.com/entry/2012/09/03/002604)  
* https://docs.python.jp/3/library/venv.html  
* [Python の -m オプションについて](http://momijiame.tumblr.com/post/81062957117/python-%E3%81%AE-m-%E3%82%AA%E3%83%97%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6)

# pipenv
* virtualenvとpipの両方を連携して扱えるサードパーティ製パッケージ
* 仮想環境の管理とパッケージのインストール管理をおこなえる
* 今後主流のPythonパッケージングツールになると期待されている

参考: 

* http://pipenv-ja.readthedocs.io/ja/translate-ja/
* [Software Design 2018年1月号 24ページ](http://gihyo.jp/magazine/SD/archive/2018/201802)  

# conda
* Anacondaインストーラ、 minicondaインストーラによりインストールされるAnaconda/miniconda用のパッケージ管理ツール
* PyPIに登録されており、pipでインストールすることもできるが、使うことはできない（2018/01/28 現在）

参考: 

* https://pypi.python.org/pypi/conda


# どれを使うか

いま自分が誰かに「仮想環境使いたいんだけど」と相談されたら、現時点（2018/01/28）では以下のように回答します。あくまで「相談されたら」です。繰り返しになりますが、特定のツールや仮想環境の利用を勧める意図はありません。

* Python2系と3系のどちらも使う機会がある人 --> virtualenv or pipenv
* Python3系だけを使っている人 --> venv or pipenv
* Anaconda/miniconda --> conda
* pyvenv --> 使ってはいけない（記憶から抹消してもOK）

pyenvを使うか否かについては以下の記事に詳しく書かれているので、こちらを参照するのがよいと思われます:    
[pyenvが必要かどうかフローチャート](https://qiita.com/shibukawa/items/0daab479a2fd2cb8a0e7)


# 私見・頂いた意見等
* [pyenvが必要かどうかフローチャート](https://qiita.com/shibukawa/items/0daab479a2fd2cb8a0e7)ではAnacondaが非推奨ですが、個人的には、とりあえずデータ分析や機械学習のためにPythonを使いはじめたいという方はAnacondaではじめるのはありだと思います。
* 今日教えてもらった以下のサイトにより詳しくまとまっていますので、環境構築に困っている方は一読するとよさそうです。参考文献リストも充実しています:  
  [Pythonの環境構築を自分なりに整理してみる](https://medium.com/@chezou/python%E3%81%AE%E7%92%B0%E5%A2%83%E6%A7%8B%E7%AF%89%E3%82%92%E8%87%AA%E5%88%86%E3%81%AA%E3%82%8A%E3%81%AB%E6%95%B4%E7%90%86%E3%81%97%E3%81%A6%E3%81%BF%E3%82%8B-dc8d8f2fe989)
* [Python ユーザーのための Jupyter 実践入門 読書 & もくもく会 - 1枚目](https://jupyter.connpass.com/event/77036/)の会場でインタビューしつつ書いていたのですが、pyenv下にAnacondaを置くのはあまり意味がないというのが大方の意見でした
*
【覚書】Atom package自作①

# 背景
私はこれまでずーっとサクラエディタを使用して来たのだが、最近(半年前)macbook proを購入し面白いエディタは無いかと物色していました。
その際、Atomなるめっちゃカスタム出来る面白い無限の可能性を秘めたエディタがあると知り

これからの時代Atomっしょ

と考えAtomを使用してまいりました。

で自宅のエディタを全てAtomにしおおよそ操作に関して慣れ過ぎてマンネリする詰まらない日々を送っておりました。


もうそろそろ　パッケージの自作に入ってもよくね？

そんな誘惑に駆られ私はこの度パッケージ自作の第一歩を踏み出す事に至りました。

## スキル
パッケージの自作にあたり下記のスキルが必要っぽい事を知りました。
・node.js or coffee scrpt
・html css
・json

上記スキル。。。。html,cssは出来るが。。。node.js?javascriptなら多少。。。
位なスキルしかもっていない、、、どうしようやばいな、、、出来るかな？

まぁ調べながらやっていこう。。。。
。
。
。
atom自体の資料が全然ない、、、、
外国語ばっかり、、、そうですよねーアタリマエダヨネー
日本じゃまだまだマイナーだし、、てか色んな人が作ったパッケージが優秀で沢山あるしー
わざわざ作る必要ないよねー

作成済みのスクリプトを解読しながらやるか、、、、
てかcoffeeしかないやん。。。どないするぅ
今からcoffeeで作るー？

coffe調べたら私には合いそうに無かったです。。
高級すぎる、なんで文末のコロン必要ないの？なんでカッコ使わないの？カッコいいと思ってんの？
この文法ならカッコいるの？知らねぇよ
coffeeは却下デスネー。ぃえーい　茨の道決定。。。


そんな私ですが無い頭振り絞って作っていきたい、その過程を纏めていきたいとおもっています。

# 環境
そんなこんなで下記環境にて作成していきます。
OS：Windows7 
  ：MacOS Sierra

Atom:1.23.2
apm :1.18.12
npm :3.10.10

# 作りたいもの

　自宅サーバへssh接続しコマンドを実行その結果をGUI上にて表示
  ssh接続した対象サーバのカレントディレクトリのツリー表示
  ssh接続後対象ファイルの編集

初めてなのに　飛ばすねって感じですが、作りたい物を作る！業務に使えるツールを作りたい！
あわよくば公開し皆に称賛されたい！
そんな浅さましい事この上ないですが、、作っていきたいと思います。
3GIM > Arduino UNO R3 から3G通信 > 0. 3GIMとArduinoとの接続



以下の続きになります。
[3GIM > Arduino UNO R3 から3G通信 \- Qiita](https://qiita.com/sugasaki/items/6a0c76ef307eb9dd9a06)




# Arduino UNOと3GIMとの接続

## ピン配列

以下のような組み合わせで3GIMとArduinoを接続します。


|3GIMのPIN番号（上面から見て右側から）|説明|Arduino|補足|
|---|---|---|---|
|1|3GIM ON/OFF|D6|ライブラリのデフォルトはD6。任意番号で指定可能|
|2|RX (for Arduino TX)|D5|ライブラリのデフォルトはD5。任意番号に変更可能（IEM_RXD_PIN）|
|3|TX (for Arduino RX)|D4|ライブラリのデフォルトはD4。任意番号に変更可能（IEM_TXD_PIN）|
|4|5v|5vピンに刺す。|IOREF	PWR_ON,RX,TXのロジック電圧。(3GIMにIO電圧を供給用)
|5|3.3v|3.3v|5vピンに刺してはいけない！|
|6|GND|GNDピン|GNDであればどこでも|



![IMG_6828.jpg](https://qiita-image-store.s3.amazonaws.com/0/49910/7fce23d3-54c0-f2ea-0c2b-0dc2e04d8f00.jpeg "IMG_6828.jpg")
bxSlider slideTabs

bxSlider.jsのカルーセル機能を使用したスライドタブのテストです。

```html:html
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>Document</title>
<meta http-equiv="x-ua-compatible" content="ie=edge">
<style>
/* reset */
* {
  margin: 0;
  padding: 0;
  font-size: inherit;
  line-height: inherit;
}
*,
*::before,
*::after {
  box-sizing: inherit;
}
html {
  font-size: 62.5%;
}
body {
  box-sizing: border-box;
  padding: 50px;
  font-size: calc(1rem + 4px);
  line-height: calc(1em + 6px);
}
ul,li {
  list-style: none;
  margin: 0;
  padding: 0;
}
/* bxslider */
.bx-wrapper {
  position: relative;
  padding: 0;
  *zoom: 1;
  -ms-touch-action: pan-y;
  touch-action: pan-y;
}
.bx-wrapper img {
  max-width: 100%;
  display: block;
}
.bxslider {
  margin: 0;
  padding: 0;
}
ul.bxslider {
  list-style: none;
}
.bx-viewport {
  -webkit-transform: translateZ(0);
}
/* slidetabs */
.c-slidetabs-01 {
  position: relative;
}
.c-slidetabs-01 ul {
  width: 280px;
  margin: 0;
  padding: 0;
  border: 0 !important;
}
.c-slidetabs-01 ul a {
  display: block;
  width: 70px;
  border: 1px solid #ccc;
  text-align: center;
}
.c-slidetabs-01 .controls {
  position: absolute;
  top: 0;
  right: 0;
  width: 48px;
}
.c-slidetabs-01 .controls div {
  float: left;
}
.c-slidetabs-01 .controls a {
  display: block;
  width: 24px;
  height: 24px;
  overflow: hidden;
  text-indent: 100%;
  border: 1px solid #ccc;
}
.c-slidetabs-01 .controls a.disabled {
background: #eee;
  pointer-events: none;
}
</style>
<!--<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/bxslider/4.2.12/jquery.bxslider.css">-->
<script src="http://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/bxslider/4.2.12/jquery.bxslider.min.js"></script>
<script type="text/javascript">
$(function() {
    $('.js-bxSlider-slidetabs-01').bxSlider({
        infiniteLoop: false,
        pager: false,
        minSlides: 4,
        maxSlides: 4,
        moveSlides: 1,
        slideWidth: 70,
        prevSelector: '.prev',
        nextSelector: '.next',
        hideControlOnEnd: 'true'
    });
});
</script>
</head>
<body>
<div class="c-slidetabs-01">
  <ul class="js-bxSlider-slidetabs-01">
    <li><a href="#">hoge</a></li>
    <li><a href="">fuga</a></li>
    <li><a href="">piyo</a></li>
    <li><a href="#">foo</a></li>
    <li><a href="">bar</a></li>
    <li><a href="">baz</a></li>
  </ul>
  <div class="controls">
    <div class="prev"></div>
    <div class="next"></div>
  </div>
</div>
</body>
</html>
```

普通に実装しただけではnext/prevを連打したときフリーズしてしまいます。
この問題を解決するためにはオプションで用意されているCallbackを利用しスライド動作中のクリック無効化の処理を追加する必要がありそうです。

## 参考
- [bxSlider](https://bxslider.com/)
- [jquery.bxslider.jsを使ったサンプルいろいろ](http://cly7796.net/wp/javascript/examples-that-use-the-jquery-bxslider/)
- [【jQuery】超簡単jQueryスライダー［bxSlider］の使い方。](http://on-ze.com/archives/1658)
- [定番のスライドショーjQueryプラグイン「bxSlider」の Callback関数まとめ](https://webman-japan.com/webcreate/bxslider-callback/)


以上、ありがとうございました。
使ってみたい言葉

ソフトウェア業界に限った話ではありませんが、その世界でしか通じない言葉というものがあります。
隠語です。
スラングとかジャーゴンとも呼ばれます。

先日、Coding Horror というブログに面白い記事があるのを発見しました。
(かなり昔の記事なので有名かもしれませんが。)

[New Programming Jargon](https://blog.codinghorror.com/new-programming-jargon/)

このブログを書いてるのは [Jeff Atwood](https://en.wikipedia.org/wiki/Jeff_Atwood) というプログラマーで、Stack Overflow や Stack Exchange の設立者の１人です。

昔、Stack Overflow に「New programming jargon you coined? (あなたが作った新しいプログラミング業界の隠語は？)」という投稿あったらしいのですが、運営によって削除されました。
「この投稿は質問じゃない」というのが理由とのこと。
彼自身、この投稿に否定的な感情を持っていなかったので、投票数の多いトップ30を自分のブログに掲載したみたいです。

と、前置きはここまで。
個人的に「今後使いたいな〜」と思ったものをピックアップ。

-----

## ヨーダ記法

```cpp
if ( value == 0 )
```

ではなく

```cpp
if ( 0 == value )
```

と書く手法のことです。
```==``` を ```=``` とタイプミスした場合にコンパイルエラーになってくれるという利点があります。

ヨーダというのは、スターウォーズのヨーダです。
私はスターウォーズに詳しくないし、英語音声や英語字幕で見たこともありませんが、彼が使う文法に似た表現なのでヨーダ記法と呼ばれているらしいです。
例えば、日本人なら誰でも知ってる有名な "This is a pen" というフレーズですが、ヨーダは "A pen this is" と表現します(たぶん)。
```this == pen``` ではなく ```pen == this``` となるわけです。

[Wikipedia](https://ja.wikipedia.org/wiki/ヨーダ記法) にページがあるぐらい一般化してる隠語ですね。

個人的には、読みにくく感じるので、ヨーダ記法は好きではありません。
最近のコンパイラは、条件式で代入すると警告してくれる場合が多いですし。


## ポケモン例外処理

どんな例外も処理する方法のことです。
英語のキャッチフレーズが "Gotta Catch 'Em All" だから、「全部キャッチする」ってことで **ポケモン例外処理** です。

```c++
try {
    //  略
}
catch (...) {
    //  ポケモン例外処理！
}
```


## エジプト人波カッコ

波カッコを、行の末尾で始める書き方です。
壁画に描かれているエジプト人の手の位置と似ていることが元になっています。

![egyptian.jpg](https://qiita-image-store.s3.amazonaws.com/0/193644/c964438b-b02e-d1d6-4912-71970d72fb50.jpeg)

```c++
if ( value == 0 ) {
    //  略
}
```

私はエジプト人波カッコ派です。
たぶん、Xcode の影響。


## リファックタリング(Refuctoring)

リファクタリング (Refactoring) とはスペルが違います。
改善しようとリファクタリングしたら、むしろ悪化してしまった場合の表現です。
リファクタリングしようとして fuct = fucked (めちゃくちゃ) になってしまうからリファックタリングです。


## 恐怖駆動開発 (Fear Driven Developement)

テスト駆動開発(Test Driven Development)、ドメイン駆動開発(Domain Driven Development) などが有名ですが、実際には、この恐怖起動開発も多いのではないでしょうか？w
解雇、納期の前倒し、リソース削減などのプレッシャー(恐怖)をキッカケにして仕事に取り掛かることです。


## ヒドラコード

１つ不具合を直すと、新しい不具合が２つ出現するような恐ろしいコードのこと。
首を切ると、新たに２本の首が生えるというギリシャ神話の[ヒドラ](https://ja.wikipedia.org/wiki/ヒュドラー)が元。


## 怒った彼女バグ (Mad Girlfriend Bug)

明らかに問題が起きているのに、画面やログは問題ない振る舞いをするバグのこと。
明らかに怒ってるのに「別に怒ってない」って言うアレ。


## ジェンガコード

少し触るだけで全てが崩壊する危険なコード。
おもちゃのジェンガが元。

-----

**ヨーダ記法** と **ジェンガコード** は、この記事を知る前から普通に使っていました。

**ポケモン例外処理** と **怒った彼女バグ** は発想が良いですね。
こういうセンスが欲しい・・・。


## 参考

- [ブログ記事](https://blog.codinghorror.com/new-programming-jargon/)
- [日本語訳されたページ](http://postd.cc/new-programming-jargon/)
vscode メモ

# vscode メモ

## code コマンド

```sh
.
├── dir1
│   ├── index.html
│   ├── test1.md
│   └── test2.md
├── dir2
│   ├── index.html
│   └── test1.md
├── index.html
└── style.css
```

### ファイルとフォルダー

```sh
code index.html
code index.html style.css
# 指定したファイルが存在しない場合 VS Code はそのファイルを作成します
code dir1/ dir2/
code dir1/

# カレントディレクトリ
cd dir1/
code
code .
code ./
```

### ファイルの差分

```sh
code --diff dir1/test1.md dir2/test1.md
```

### ターミナル

> [ターミナルフォーカス](https://qiita.com/rai_suta/items/05e69f0b9065989b19c1)

ctrl+\ ターミナルを分割する
alt + left 前のターミナルフォーカス
alt + right 次のターミナルフォーカス
formにajaxでのpost機能を後付する

# はじめに
　formに入力されたデータをsubmitするという基本的な機能を備えたウェブアプリの制作に携わっています。
ここで、入力データを用いてサーバー側で実装済みの所定の計算を行い結果を画面に表示するという機能が追加されました。
本来であれば計算処理をフロントに持ってきてjavascriptを使ってデータの取得と計算を行うのが良いのですが

- 実装されている計算というのが非常に難解で、再実装するのに手間がかかる
- そもそも処理内容自体がフロント側という見ようと思えば見ることの出来るところに持ってくるべきでないもの

他にも事情はあるのですが大まかに上記二点によって、サーバー側に入力内容をpostし結果を表示するという形にせざるを得なくなりました。さらに、入力内容を変更して何度も計算結果を確認するだろうということから、一々ロードを挟まないようajaxも活用することになりました。

　以上から、「既存のformに後からajaxでpostし結果を受け取って何か処理する機能を付ける」という問題に対処しましたが、簡単にできるだろうと思っていたら少し苦労したので、シンプルな対応方法を調査しました。


# 方法
```javascript
$.post(
  $('.form-class').attr('action'),
  $('.form-class').serializeArray(),
  function(result) {
    //適当な処理
  },
  'json'
);
```
form-classは対象となるformに設定されているclassです。
# 参考
https://qiita.com/bami3/items/102d0748ed99658953c5
NerdTreeが遅かったので、解消してみた。

#概要
* [vimでatomのfile-iconsのような感じにする](https://qiita.com/tos-miyake/items/0cb4729c4d6a949bd480)

を参考にして、環境整えてみたのだが、Nerdtree上での移動が...遅い！遅すぎる!!

#原因
##特定
今回追加したプラグインに原因があると仮定

```
'ryanoasis/vim-devicons'　
'tiagofumo/vim-nerdtree-syntax-highlight'
```

片方だけアンイストールしてみて、NerdTreeの動作を確認してみると...

```
'tiagofumo/vim-nerdtree-syntax-highlight'
```

があると遅い！

##解決

まず公式ページに解決方法があるか探してみることに

[あった！！]
(https://github.com/tiagofumo/vim-nerdtree-syntax-highlight#mitigating-lag-issues)

```:.vimrc
let g:NERDTreeLimitedSyntax = 1
```
を追加すれば、lagは発生しない。
自作シェルスクリプト実行時に、Tabキーで補完する拡張子を制限する

#`Tab`キーでの補完
たとえば、ディレクトリ内のファイルが、

```bash:端末
$ls
a.aux a.dvi
a.log a.pdf
a.tex a.toc
compile_tex.sh
```

このような場合に、自作シェルスクリプト`compile_tex.sh`を実行することを考えます。
まず、`./c[Space][Tab]`と入力すると、

```bash:端末
$./compile_tex.sh
```

とうまく補完されて入力できます。

しかし、Texファイル「`a.tex`」を引数にするため、さらに`[Space]a[Tab]]`を入力すると、

```bash:端末
$./compile_tex.sh a.
```

と意図通りに補完できません。
これは、`a.`から始まるファイルが複数あるためです。

#ある拡張子だけを補完したい！
では、自作シェルスクリプト`compile_tex`の`Tab`キーによる補完候補を拡張子`.tex`のものだけにするにはどうしたらいいのでしょうか。

たとえば、`~/.bashrc`に次の関数、

```bash:.bashrc
_compile_tex(){
  local cur=${COMP_WORDS[COMP_CWORD]}
  COMPREPLY=( $(compgen -W "$(ls *.tex)" -- $cur) )
}
complete -F _compile_tex compile_tex.sh
```

を追加し、変更を反映させます。

```bash:端末
$bash
```
このようにすることで、`./compile_tex a[Tab]`を入力した時に

```bash:端末
$./compile_tex.sh a.tex
```

と、拡張子「`.tex`」のものだけを補完することができました。

また、上記の関数`_compile_tex()`において、`*.tex`の部分を変えることで、好みの補完ができるようになります。
poiを使って爆速でVue.jsを始める

# poiとは

Vue.js、React / Preactなどに対応した、設定ファイル不要のビルドツール。
特にVue.jsの場合は、vue本体のインストールすらなしに`index.js`1ファイルから開発を始めることができる。

https://poi.js.org

# 爆速で始める

```
$ mkdir poi-vue && cd poi-vue
$ touch index.js
```

エントリーポイントになるファイルを用意する

```js:index.js
import Vue from 'vue'

new Vue({
  el: '#app',
  render() {
    return <h1>Hello World!</h1>
  }
})
```

爆速感を出すために、npm 5.2以降で使えるnpxを使う

```
$ npx poi index.js
```

localhost:4000でDevServerが立ち上がる

![スクリーンショット 2018-01-28 22.33.31.png](https://qiita-image-store.s3.amazonaws.com/0/79414/2c361988-110e-0ddc-3166-c239f427584d.png)



# 所感

まだ、とりあえず触ってみたレベルなので、詳しいことは分からないが、単一ファイルで動くサンプルプロジェクトなどを誰かに渡したい場合とかにもってこいな気がしている。
作者のegoistさんが公開している[Awesome Poi](https://github.com/egoist/awesome-poi)を見ると、いろいろなフレームワークに対応したボイラープレートがあるみたいなので、覗いてみるとおもしろいです。

# 参考

[Guide -poi](https://poi.js.org/#/home?id=introduction)
[npxが結構良さそうな件について](https://qiita.com/vvakame/items/23b02e950ca307b9e674)
Excelでパスワードを「＊」で表示させる


Excelにパスワードを入力するときに、パスワードを「＊」で伏字にしたかったです。
こんな感じになりました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/185546/852fac48-f6c5-fb14-b93b-41873cce8bd5.png)

以下、その手順を書きます。

#テキストボックスの挿入
開発タブ-挿入-テキストボックス（ActiveXコントロール）を選択し、入力欄を持ってきたい場所に挿入します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/185546/3ab657de-7716-6f19-578c-e44e92efd102.png)

※ ActiveXとフォームコントロールの違いは？
大きな違いは以下の通りらしい。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/185546/c203c0e9-df47-f1da-7658-78b72c0fb04d.png)
→ ActiveXコントロールの方がいろいろできるんだなあ。。くらいの認識で止まっています。


参考：[エクセル（Excel）の技。知ってましたか・・・。](http://fanblogs.jp/yoshimatsuex/archive/142/0)


#プロパティの変更

* テキストボックスを選択して右クリック-プロパティ　を選択
![image.png](https://qiita-image-store.s3.amazonaws.com/0/185546/7584a15e-8bd1-0e89-604e-3a4400435c61.png)



* PasswordCharの横に「*」を入力
![image.png](https://qiita-image-store.s3.amazonaws.com/0/185546/bbd8cf64-52fe-1c18-4ffa-79fff05e1eba.png)

これで、テキストボックスへの入力時に、「*」が表示されるようになります。


#もうひと手間
上記手順を行い、これで「大丈夫でしょ！！」と思っていましたが、
入力しようとすると入力できない。。。。(　´・ω・`)


∑('＝'；)もしやここが日本語入力だから。。？

![image.png](https://qiita-image-store.s3.amazonaws.com/0/185546/8d981ad5-a168-dc50-31d2-3e6492d5c9d2.png)

と思って、半角入力にしてみたら入力できるようになりました。
自分で半角入力に変更してもよいけど、VBAで指定するようにします。

```
Private Sub TextBox3_Change()
    With TextBox3
        .IMEMode = fmIMEModeAlpha
        .MaxLength = 32
    End With
End Sub
```


ついでにMAX文字数も指定しました。
他の入力モードに変更したい場合は、以下を参照してください。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/185546/99431eda-6476-4292-eda8-e899c1be69ac.png)
参考：[Excel(エクセル) VBA入門：テキストボックスの使い方](http://www.eurus.dti.ne.jp/~yoneyama/Excel/vba/vba_userform02.html)

これで、完成です。


#疑問点

* ActiveXコントロールとフォームコントロールがあったけれど、とりあえずActiveXを使っていてもいいのか…（フォームコントロールじゃないといけない場合がある？）
* VBAにあるTextBox3_Change()というメソッド名は、テキストボックス挿入時に勝手に付けてくれるのだけど、どうやって変更するのだろう…

今後はこれを使って、Webサイトにログイン！といったことをやっていきたいです。
protectedフィールドに孫クラスからアクセス（Java/PHP）

## 発端
仕事でPHPを触るようになりました。

フィールドがprotected 属性の場合、Java のように孫クラスから親クラスを参照できるだろうと自然と考えていましたが、孫クラスについての言及はググっても（僕の調べ方が悪いのでなければ）なかなかなく、派生クラス、子クラスについての話題が多かったです。

そんな中、PHPでは一つ先の継承にしかprotectedは反映されないという記述を目にし、実際にやってみるかーというのが今回の投稿です。
 
## 環境
### PC
Windows 8.1

### Java
Eclipse Kepler Service Release 2
jre8

### PHP
XAMPP Version 7.0.24
PHP Version 7.0.24


## Javaで動作確認
【2018/01/28 追記】デフォルトパッケージに下記javaファイルを配置

```java
// 親クラス
abstract class Charactor {
    protected String name = "Charactor";
}

// 子クラス
class HumanCharactor extends Charactor {
}

// 孫クラス
class Wizard extends HumanCharactor {
    public Wizard (String name) {
        this.name = name;
    }
}

// テストコード
class Main {
    public static void main(String[] args) {
        System.out.println("Test Start...");
        
        Wizard wiz = new Wizard("Wizard");
        System.out.println(wiz.name);
        
        HumanCharactor human = new HumanCharactor();
        System.out.println(human.name);
        
        System.out.println("Test End...");
    }
}
```

### 結果
```
Test Start...
Wizard
Charactor
Test End...
```


## PHPで動作確認
【2018/01/28 動作確認コード差し替え】

```php
<?php
echo '<pre>';

// 親クラス
abstract class Charactor {
    protected $name = "Charactor";
}

// 子クラス
class HumanCharactor extends Charactor {
    public function printName() {
      var_dump($this->name);
    }
}

// 孫クラス
class Wizard extends HumanCharactor {
    public function __construct($name) {
        $this->name = $name;
    }
    
    //ここをcallするとFatal Error
    //public function printName() {
    //  var_dump($this->name);
    //}
}

// テストコード
new Test();
class Test {
    public function __construct() {
        var_dump("Test Start...");

        $wiz = new Wizard("Wizard");
        $wiz->printName();
        //var_dump($wiz->name); ←これだとFatal Error

        $human = new HumanCharactor();
        $human->printName();
        //var_dump($human->name); ←これだとFatal Error

        var_dump("Test End...");

        echo '</pre>';
    }
}
?>
```

### 結果
```
string(13) "Test Start..."
string(6) "Wizard"
string(9) "Charactor"
string(11) "Test End..."
```


## まとめ
【2018/01/28 記載修正】
PHPでもJavaと同じように、親の親クラスのprotectedフィールドを使用することはできた。
ただしPHPはJavaと違って、孫クラスのインスタンスから直接親の親フィールドを参照することはできないようだ。
for文を内包表記で実装してみた

ファイルは政府の統計情報から適当に取得
https://www.e-stat.go.jp/stat-search/files?page=1&layout=datalist&toukei=00200521&tstat=000001080615&cycle=0&tclass1=000001089055&tclass2=000001089056

```python
# for文で繰り返し
list1=[]       
with open("/python/001_01.csv", encoding="cp932") as f:
    for line in f:
        list1.append(line)

# 内包表記で繰り返し
# list2=[]  Dsuke-Kさんのコメント通り、内包では初期化は不用でした
with open("/python/001_01.csv", encoding="cp932") as f:
    list2=[line for line in f]

if list1 == list2:
    print("同じ")
else:
    print("異なる")
```
結果は"同じ"となった。


## for文で繰り返しと内包表記が同じ結果であることを確認
list2=[line for line in f]
はcsvファイルを読み込んだfから一行取り出し、2つ目のlineにセット、それをそのままlineとして、list2にセットしている。


少しわかりずらいので、ちょっと修正。

```python
# for文で繰り返し
# 内包表記で繰り返し
# list2=[]   Dsuke-Kさんのコメント通り、内包では初期化は不用でした
with open("/python/001_01.csv", encoding="cp932") as f:
    list2=[line+"++add++" for line in f]

ipdb> list2[0]
'1,"平成27年国勢調査人口等基本集計（総務省統計局）","","","","","","","","","","","","","","",""\n++add++'
```

list2=[line+"++add++" for line in f]
はcsvファイルを読み込んだfから一行取り出し、2つ目のlineにセット、それの後ろに"++add++"を追加してlineとして、list2にセットしている。
こちらのほうがわかりやすい。

普通にファイルを読み込んでリストに入れるだけなら、list2=[line for line in f]で良い。
Go のプログラム内で JSON を比較しやすくする

`MarshalJSON()` のテストを書くときに JSON 文字列同士を比較する際、どこが違うのかをわかりやすく表示するライブラリを作ってみた。

https://github.com/Cside/jsondiff

## 使用例

```go
import (
	"testing"
	"github.com/Cside/jsondiff"
)

a := []byte(`{ "foo":1, "bar":2 }`)
b := []byte(`{ "foo":1, "bar":3 }`)

if diff := jsondiff.Diff(a, b); diff != "" {
	t.Errorf("two jsons are not equal. diff:\n%s", diff)
}
```

出力：

```go
=== RUN   TestMain
--- FAIL: TestMain (0.00s)
        main_test.go:14: two jsons are not equal. diff:
                  {
                -   "bar": 2,
                +   "bar": 3,
                    "foo": 1
                  }
FAIL
exit status 1
```

## 特定の値を無視する

タイムスタンプとか、特定の値を比較の際に無視したくなることがある。その場合は `diffopts.IgnorePath(paths []string)` オプションを使う。

無視したい値はは [JSON Pointer](https://tools.ietf.org/html/rfc6901) で指定する。

下記のテストはパスする。

```go
import (
	"testing"
	"github.com/Cside/jsondiff"
	"github.com/Cside/jsondiff/diffopts"
)

a := []byte(`{ "foo": 1, "createdAt": 1517141881 }`)
b := []byte(`{ "foo": 1, "createdAt": 1528845681 }`)

if diff := jsondiff.Diff(a, b, diffopts.IgnorePaths([]string{"/createdAt"})); diff != "" {
	t.Errorf("two jsons are not equal. diff:\n%s", diff)
}
```

## 関連記事

- [データをJSONに変換するときに任意のフォーマットを設定する - Qiita](https://qiita.com/taizo/items/2c3a338f1aeea86ce9e2)
- [JSON PointerとJSON Patch - Qiita](https://qiita.com/taknuki/items/76d2fda912443b6854a4)
Wordでスペースの大きさを統一する

#アルファベットと日本語でスペースの幅が違う
ワードで参考文献を書こうとしたときのこと。
![キャプチャ4.PNG](https://qiita-image-store.s3.amazonaws.com/0/128431/0048e02e-17a1-a0b6-f99c-6d90c281e986.png)

「]」と「山」の間、２つめの「］」と「J」の間にはスペースを入力しています。
でも、なぜか幅が変わってしまいます。
英数字と日本語の間のスペースと、英数字と英数字の間のスペースは大きさが違うのでしょうか？

#同じ幅の「スペース」
そこで、Nと同じ幅のスペース「エンスペース(Enspace)」を使用します。
「エンスペース」のUnicode番号は「`Unicode U+2002`」なので、「2002」と入力してから`Alt`+`x`キーを押すことで入力できます。

##結果

![キャプチャ5.PNG](https://qiita-image-store.s3.amazonaws.com/0/128431/8994bff8-2b90-0d74-d846-9c7fae24a2af.png)

揃いました！
UnityChan.SpringManagerをVRIKに対応させる

ユニティちゃん付属の[SpringMananger](https://github.com/unity3d-jp/unitychan-crs/blob/master/Assets/UnityChan/Scripts/SpringManager.cs)が[VRIK](https://www.assetstore.unity3d.com/jp/#!/content/14290)と相性が悪かった問題の解決メモ。

ViveやVRIKに関してはこちらを
https://qiita.com/halne369/items/daadf0e00330a1019830

ユニティちゃんの髪揺れに関してはこちらを参照のこと
http://tsubakit1.hateblo.jp/entry/2014/11/08/233000

# ユニティちゃん+SpringBone+VRIK

`SpringBone`付きのユニティちゃんを動かすと

![](https://qiita-image-store.s3.amazonaws.com/0/77528/269c42d9-9553-a442-b011-78546c06d1af.gif)

こんな感じで髪が揺れる。

ところが、`VRIK`をアタッチした状態だと

![OnlyVRIK.gif](https://qiita-image-store.s3.amazonaws.com/0/77528/20acf7de-0aee-4bc8-c2f1-f67a3dc4f18d.gif)

このように`SpringBone`が動作しない。

# SpringManagerの修正

`SpringBone`の更新が`VRIK`の更新より前に行われてしまっているのが原因らしいので、`SpringManager`のScript Execution Orderを`VRIK`より後に設定すれば解決する。

![](https://qiita-image-store.s3.amazonaws.com/0/77528/59cb91aa-8428-c09e-c9c8-dde5f20a5b40.png)

結果

![SpringVRIK.gif](https://qiita-image-store.s3.amazonaws.com/0/77528/74c3a380-c521-a71b-a134-d0db33985bbe.gif)

もしくは`VRIK`の更新を自前で行なう。例えば`SpringManager`の`LateUpdate`で

```c#
		private void LateUpdate ()
		{
            var solver = GetComponent<RootMotion.FinalIK.VRIK > ();
            solver.UpdateSolverExternal();
            
            ...
       }
```

とすれば正常に動作する。

真面目に考えると[SpringBoneの更新前にtransformが上書きされるのが問題](https://docs.unity3d.com/jp/530/Manual/ExecutionOrder.html)っぽいので、`Update`で更新してしまっても良い。

```c#
		private void Update ()
		{
            var solver = GetComponent<RootMotion.FinalIK.VRIK > ();
            solver.UpdateSolverExternal();
       }
```
最新版のGitインストール方法メモ(Ubuntu14.04)


はじめにGitをパッケージインストールしてGitのソースをcloneしておく。
こうしておけば今後のアップデートはgit pullでmakeするだけでOK。

まずはパッケージからインストール。

```bash
$ apt-get install git
$ git --version
git version 1.9.1
```

依存モジュールのインストール。

```bash
$ apt-get install libcurl4-gnutls-dev libexpat1-dev libssl-dev gettext
```

Gitからソースを落としてきてビルド。

```bash
$ cd /usr/local/src
$ git clone git://git.kernel.org/pub/scm/git/git.git
$ cd git
$ make prefix=/usr/local/ all
$ make prefix=/usr/local/ install
```

パッケージからインストールしたGitの削除。

```bash
$ apt-get purge git
```

再ログインしてからコマンド実行。

```bash
$ git --version
git version 2.16.1.72.g5be1f00
```
ユニティちゃんをVRIKに対応させる

ユニティちゃんをVRIKに対応させる

![](https://qiita-image-store.s3.amazonaws.com/0/77528/ee2f6388-a03d-d51a-dd5f-33d60eb70477.png)

VRIK使用時にtargetになるtransformの回転を修正する必要があるためそのためのメモ。

Head

![](https://qiita-image-store.s3.amazonaws.com/0/77528/474a0328-0ac4-0073-e276-3cfaf6bd0631.png)

Right Arm

![](https://qiita-image-store.s3.amazonaws.com/0/77528/5565f723-bc32-b74a-21db-042ee246431c.png)

Left Arm

![](https://qiita-image-store.s3.amazonaws.com/0/77528/6d8bd7e2-8187-2452-4145-b13fc6b45e7b.png)

これでSteamVR pluginと整合性がとれる（はず）。

Headのpositionを多少ずらしたほうがいいかも。
The Little MongoDB Bookの最新版を翻訳しました

![title.png](https://qiita-image-store.s3.amazonaws.com/0/10290/158c9290-8dfe-612e-9b1a-414e1d897d64.png)

「MongoDBの薄い本」というタイトルで既に他の日本語訳が出ていますが、古いなど色々あったため、自分の学習がてら翻訳しました。

1/28時点の内容で翻訳しています。MongoDBは3.6.2で検証していて、原文の執筆当時(2.6、もしくは2.4)と状況が異なる箇所は、適宜訳注として補完してあります。

## 「MongoDBの手引き」配布ページ

https://github.com/Makopo/the-little-mongodb-book/wiki

PDFはまだ作れていません… Pandoc以外の方法を真剣に考えています…
どうしてもPDFにしたい方は、↓をChromeで表示してPDFで保存するなりしてください…

## 手っ取り早く本文を読みたい人向け(Markdown版)

https://github.com/Makopo/the-little-mongodb-book/blob/master/ja/mongodb.markdown

## 原文

The Little MongoDB Book by Karl Seguin

https://github.com/karlseguin/the-little-mongodb-book

1/28現在の内容で翻訳しました。
ここまでのマイクロQiitaをライブラリ化した「smallex」

この1週間くらいのマイクロQiitaでご紹介したテクニックを使って、小粒なライブラリ[「smallex」](https://github.com/data-maestro/smallex)を作ってみました

（なお、メッチャ発展途上中なので、使っているインタフェースが変わってしまったらスミマセンが追従してください）

使い方は、githubのREADME.mdに書いている通り、mix.exsのdepsに以下でライブラリ追加してください

```elixir:mix.exs
…
  def deps do
  [
    …
    { :smallex, "~> 0.1.0" }
  ]
  end
…
```

リファレンスおよびgithubは、[Hex](https://hex.pm/)で「smallex」と検索するか、下記画像をクリックした先のページから、リンクを辿ってください（リファレンスは未だ作成中のため、ところどころ抜けがありますがご容赦ください）

[![image.png](https://qiita-image-store.s3.amazonaws.com/0/155423/12d27849-254b-04cf-d16b-9e8c8cc20377.png)](https://hex.pm/packages/smallex)

各種モジュールのどれに、マイクロQiitaのどの内容が反映されているかを、楽しみながら、github内（/lib/配下）を探索してみてください

[![image.png](https://qiita-image-store.s3.amazonaws.com/0/155423/9a29204a-00d3-f8d2-a1ca-5861b836a25d.png)](https://github.com/data-maestro/smallex)

あと、complex_numやnimble_csv等は、これから追加するモジュール・関数に使うであろうライブラリのため、未だ呼び出す関数は無いのですが、スルーでお願いします

p.s.福岡でElixirプロダクション採用を推進するコミュニティ「fukuoka.ex」のMeetUp#8「2018年 春のElixir入学式」は、こんな感じで沢山の方が集まって賑やかにやっています（地味に女子率多し）

![image.png](https://qiita-image-store.s3.amazonaws.com/0/155423/70cf67b8-5cac-ada5-4062-58ae7f404460.png)
Wordで長いダッシュ・ハイフンを入力する

#長い線（ダッシュ？ハイフン？）を入力したい！
小説や論文などで使われている、引用を表す長いダッシュ（ハイフン）をワードで入力したい！
検索すると「ダッシュ」を２つ並べて間を狭めれば良いと出てくるけどこれじゃない感...。

##普通のダッシュ・ハイフン

![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/128431/c8c86098-82ee-4b81-754d-09b7f15658e7.png)

普通のダッシュやハイフンは日本語で入力して変換しても入力できます。
ただ、イメージする線よりも短い気がします。

#キーワードは「エムダッシュ」
引用に使える長い線には名前があるらしい。
キーワードは、Mの幅のダッシュ「エムダッシュ(Emdash)」とその半分の幅の「エンダッシュ(Endash)」です。
![キャプチャのコピー.PNG](https://qiita-image-store.s3.amazonaws.com/0/128431/2694a8f1-e719-9f32-42a0-0d7252b75119.png)
これが、求めていた線でした！

##入力方法１
ワードでは、`Alt`キーと`x`キーを同時に押すことで、Unicodeを文字に変換してくれます。
「エムダッシュ」のUnicodeの番号は`Unicode U+2014`なので、「2014」と入力してから、`Alt`キー+`x`キーを押せば「エムダッシュ」が入力されます。

##入力方法２
「挿入」タブ＞「記号と特殊文字」＞「記号と特殊文字」タブ
からも入力できます。
![キャプチャ3.PNG](https://qiita-image-store.s3.amazonaws.com/0/128431/a6ea04e1-3248-50ad-6da5-83864ab2c590.png)

※Windows向けのWord 2016で確認しました。
MySQL5.7で secure-file-priv が効いてファイル保存できない場合の対処法(windows環境)

MySQL 5.7 のデータをCSVファイルなどに保存したいときに「The MySQL server is running with the --secure-file-priv option so it cannot execute this statement」と出てファイル保存できない場合の対処法
(Windows環境を例に説明します)

# テーブル内容をファイルに書き出す

**test**テーブルの内容を **c:/temp/test.txt** に保存しようとすると、

```shell
mysql> SELECT * FROM test INTO OUTFILE 'c:/temp/test.txt';
```

以下のようなメッセージが出て、ファイル出力に失敗したときの対処法

```shell
ERROR 1290 (HY000): The MySQL server is running with the --secure-file-priv option so it cannot execute this statement
```

# my.iniを開いて、secure-file-priv を無効にする

**my.ini**はデフォルトのインストール状態だと
**C:\ProgramData\MySQL\MySQL Server 5.7**にある。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/170905/de9a35af-03d4-d1a3-70b7-438979966741.png)

以下のように**my.ini**を編集して**secure-file-priv=""**にする

![image.png](https://qiita-image-store.s3.amazonaws.com/0/170905/9f161b20-32c2-6ef1-8251-8bea1f88596b.png)


# MySQLを再起動する

まず、前提としてMySQL 5.7がWindowsサービスとして起動している環境を想定

1.管理者権限でコマンドプロンプトを起動する

2.MySQL 5.7のbinフォルダに移動する

```shell
cd "C:\Program Files\MySQL\MySQL Server 5.7\bin"
```

3.MySQL 5.7をshutdownする

(rootのパスワードは仮に"password"とする)

```shell
mysqladmin -u root shutdown -ppassword
```

これにより、MySQLサービスも **STOPPED** ステートになる

4.MySQL 5.7を起動する

MySQLサービスを起動する

```shell
NET START MYSQL57
```

**実行結果**
![image.png](https://qiita-image-store.s3.amazonaws.com/0/170905/9681f8a1-8862-cb80-04de-0cfdcb2961c9.png)

# テーブル内容をファイルに書き出す（リトライ）

```shell
mysql> SELECT * FROM exchange INTO OUTFILE 'c:/temp/test.txt';
Query OK, 86 rows affected (0.00 sec)
```

今度は無事成功！
MySQLの起動に失敗(fs.aio-max-nrが少ない)


```
2018-01-28T11:33:56.703532Z 0 [ERROR] InnoDB: io_setup() failed with EAGAIN after 5 attempts.
2018-01-28T11:33:56.703773Z 0 [ERROR] InnoDB: Cannot initialize AIO sub-system
2018-01-28T11:33:56.703833Z 0 [ERROR] InnoDB: Plugin initialization aborted with error Generic error
2018-01-28T11:33:56.703880Z 0 [ERROR] Plugin 'InnoDB' init function returned error.
2018-01-28T11:33:56.703923Z 0 [ERROR] Plugin 'InnoDB' registration as a STORAGE ENGINE failed.
2018-01-28T11:33:56.703963Z 0 [ERROR] Failed to initialize builtin plugins.
2018-01-28T11:33:56.703998Z 0 [ERROR] Aborting
```


my.cnfの[mysqld]のセクションに以下を追加
innodb_use_native_aio=0


※カーネルパラメータを書き換えようとしたがvpsではだめらしい。

```
$ sudo vi /etc/sysctl.conf
fs.aio-max-nr = 131072
$ sudo sysctl -p
error: permission denied on key 'fs.aio-max-nr'

```
WordやPowerPointの数式ツールでの筆記体のL（エル）の入力

#結論
数式ツール上で`\ell`と入力しスペースキーを押せば良い

数式ツール上でのただのエル（とその斜体）は、
![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/128431/cb396158-fd38-18ab-4951-ab41f75b7e3d.png)
ですが、Tex記法の「\ell」を入力することで、
![キャプチャのコピー.PNG](https://qiita-image-store.s3.amazonaws.com/0/128431/32d5cc03-3af9-2ab7-38e1-540b99a0a85b.png)
が入力できました。

※windows向けのWord 2016で確認しました。Mac向けのWord 2016ではそもそもTex記法が使えませんでした。（2018/01/28現在）
Ruby Mineでgem install時にパーミッションエラーが発生する時の対処

覚書です

#問題

RubyMine利用時に、gemを必要とする動作をするとパーミッションエラーが発生する時があります。
例えばデバッグモードとか、デバッグモードとか・・・・

#原因

そもそも、パーミッションエラーがでる原因は、管理者、もしくは持ち主以外が触れないデータに変更を加えようとしているから。

サンプルエラー↓

```
Error running 'something'
			Gem のインストールに失敗しました. 次の gem はインストールされていません:
			/Applications/RubyMine.app/Contents/rb/gems/ruby-debug-ide-0.6.1.beta12.gem:  Error installing ruby-debug-ide-0.6.1.beta12.gem:
			ERROR: Failed to build gem native extension.      current directory: /Users/unkoman/.gem/ruby/2.3.0/gems/ruby-debug-ide-0.6.1.beta12/ext /System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/bin/ruby mkrf_conf.rb Installing base gem You don't have write permissions for the /Library/Ruby/Gems/2.3.0 directory. /System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/lib/ruby/2.3.0/rubygems/installer.rb:692:in `verify_gem_home'   /System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/lib/ruby/2.3.0/rubygems/installer.rb:811:in `pre_install_checks'   /System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/lib/ruby/2.3.0/rubygems/installer.rb:278:in `install'   /System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/lib/ruby/2.3.0/rubygems/resolver/specification.rb:97:in `install'   /System/Library/Fra... (show balloon)

```

-今回は、管理者権限（ｓｕｄｏ）が必要なファイルへ書き込みしようとしている。
上の例で言うと`/Library/Ruby/Gems/2.3.0 directory`の中のgemフォルダーに書き込もうとして怒られています。

#解決策

現在ログイン中のユーザーがファイル変更の実行権限を得られれば回避できると言うことです。
しかし、管理者権限のファイルに変更をすると、予期せぬ不具合や、他のユーザーにまで影響してしまいます。

そこで、`rbenv`(RuByVersionManagement)と言われるRubyのバージョン管理アプリを使います。

このrbenvですが、作業中のユーザー管理下に管理者とは別の`Ruby`動作環境を用意してくれるので、今回のように管理者権限下のデータを触りたくない時にぴったりです。

また、名前どおりにRubyのバージョンを指定して利用することができるので非常に便利です。

#操作手順
1.homebrewでインストール
2.RubyMineの設定
3.実行

私の環境ではHOMEBREWを使ってインストールしました。

```bash

#何はともあれインストール
unkoman$brew install rbenv
#rbenvの面倒臭い作業をちょっと楽にしてくれるgemもついでにインストール
unkoman$brew install rbenv-gem-rehash

#rbenvでインストール可能なＲｕｂｙのバージョン一覧を取得
unkoman$rbenv install -l

#インストールしたいバージョンを指定してインストール
unkoman$rbenv install 2.5.0

```

RubyMineの設定(メニューから)

```
1.RubyMine→Preferences
2.左メニューからRuby SDK および Gemを選択
3.rbenv: 2.5.0を選択する
```

以上

#その他
今回の方法hではあくまでも、RubyMineで使うRubyの設定なのでRubyMineじゃないとき、Rubyはrbenv環境で動作しません。
システムのRubyのバージョンもついでにrbenvで使いたい位場合には、少しだけ別の作業が必要になります。

```bash

#現在のRubyのバージョンを確認
unkoman$ruby -v
ruby 2.3.3p222 (2016-11-21 revision 56859) [universal.x86_64-darwin17]
#bash(ターミナル)の設定ファイルを弄る。ホームディレクトリ直下に無い場合は作りましょう
unkoman$cd ~
unkoman$ls -a
Download    Desktop         Library 
Movies      Music           Applications
Something   Something       Some
.           .bash_sessions

#上記のような感じで一覧を出して.bash_profileが無い場合はファイルを作ります
unkoman$touch .bash_profile
#次に.bash_profileを編集します
unkoman$vim .bash_profile
```

vimエディターとかでさっき作った`.bash_profile`に以下を記述して保存

```vim

export PATH="$HOME/.rbenv/bin:$PATH"
eval "$(rbenv init -)"
```
```bash

#rbenvを普段から使います宣言
unkoman$rbenv global 2.5.0

#terminalを再起動
#ちゃんと普段使いのRubyがrbenvのバージョンになっているか確認
unkoman$ruby -v
ruby 2.5.0p0 (2017-12-25 revision 61468) [x86_64-darwin17]#バージョンが変わりました
```