OmniAICreator/Qiita-1.07M huggingface dataset:
ChromeOSにNode.jsをnvmでインストールする

# Node.jsをChromeOSにインストールしたい

ChromeOSで開発環境を整えるべく、開発者モードにしたりchromebrewを入れたりすると思いますが、それだけではNode.jsをインストールできません。

しかし、Node.jsのバージョン管理をするnvmを経由すれば、比較的簡単に環境を整えることができます。

バージョン切り替えができたほうが楽なので、nvmをインストールし、そこからNode.jsをインストールします。

## 下準備

* 開発者モード導入済み
* `/home/chronos/user/`をプログラム実行可能なように再マウント済み

前者は腐るほど資料があるので探してください。

後者は [Chromebookで開発環境を整えるためにしたこと](http://qiita.com/Hiroki_M/items/f72acbee69fcea2fa297) にも書いていますが、以下コマンドを実行したり、`.bashrc` に追加して毎回実行するように仕込んでおくことで実現可能です。

```
sudo mount -i -o remount,exec /home/chronos/user/
```

ここまで準備ができたらインストールです。

## nvmのインストール

nvmのインストールについては、リポジトリの説明に書いています。

https://github.com/creationix/nvm

今だと以下のようなコマンドでインストール可能です。

ターミナルを立ち上げ、`shell` コマンドを実行した後以下コマンドを実行します。

```
wget -qO- https://raw.githubusercontent.com/creationix/nvm/v0.32.1/install.sh | bash
```

自分の環境ではbashが何故か使えなくなったので、 `/bin/sh` で代用しました。

あとは再ログインをしろと言われるので、一度shellから `exit` で脱出後、再度 `shell` を実行してください。

## Node.jsのインストール

まずはインストール可能なバージョンを調べます。

```
nvm ls-remote
```

たくさん出てくると思います。
とりあえず `6.9.1` をインストールするものとします。

```
nvm install 6.9.1
```

これでインストール可能です。

nvmは環境変数 `NVM_DIR` を利用し、パスがデフォルトで `/home/chronos/user/.nvm` なので、プログラムが実行可能なように再マウントしていれば、ちゃんとインストールして使えるはずです（実行はできずとも、ここまでのインストール作業は成功します）。

## 試す

試しに実行します。

### ソース `hello.js`

```
console.log( 'Hello' );
```

### コマンド

```
node hello.js
```

これで `Hello` と表示できれば成功です。
VisualStudioに画像をコメントとして追加できる拡張機能。題してimage-comments。

####画像と文字をかんたんに混在させたい人なのです。
Qiitaで混在していないのはかんたんにできないためです。

そこで知ったのが、VisualStudioに画像をコメントとして追加できる拡張機能。題してimage-comments。
簡単なのかどうかは使ってみなければわからないけれど、
https://github.com/lukesdm/image-comments
で入手できます。

####早速ダウンロードしてみました。
わたしはVisualStudio2015communityを使っています。
image-commentsは標準では、Visual Studio 2015には未対応。
そこで、ImageCommentsPackage\source.extension.vsixmanifestをVisualStudio2015communityで開き(メモ帳で開くと改行コードが\nだけなのでつながってしまって読めない……読めなくはないが読みにくく、編集するとたぶん改行コードの問題がトラブルになりそう……)、

```
<SupportedProducts>
  <VisualStudio Version="10.0">
    <Edition>Ultimate</Edition>
    <Edition>Premium</Edition>
    <Edition>Pro</Edition>
  </VisualStudio>
  <VisualStudio Version="11.0">
    <Edition>Ultimate</Edition>
    <Edition>Premium</Edition>
    <Edition>Pro</Edition>
  </VisualStudio>
  <VisualStudio Version="14.0">
    <Edition>Pro</Edition>
    <Edition>Community</Edition>
  </VisualStudio>
</SupportedProducts>
```

のように14.0のProとCommunityを追記しました。

####Releaseコンパイルにしてビルド。
This solution contains an extensibility project. For complete tools support, install this Visual Studio Extensibility Tools.
というメッセージが出ていたら、拡張機能をインストールしてください。メッセージをクリックするとできます。

####保存してVisual Studioを終了したら、
image-comments-master\Output\ImageComments.vsixをダブルクリック。

####これで、csコード中に画像を貼れるようになるのです。

ツール-拡張機能と更新プログラムを見ると、ImageCommentsがあり動いているようです。
さて、どう使うものなのか。

```
/// <image url="C:\Users\KaoruHeart\Desktop\matrix.jpg"/>
```
みたいな書式です。
(Java)serializeされるときのバイトサイズを計算する

# 概要
Javaから利用するキャッシュのキャッシュサイズを検討する際にデータ量を計る方法を調べたので備忘録としてメモを残す。

# 方法1(ByteArrayOutputStreamの長さを計る)
こちらのほうが正しいらしい。

```java
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(baos);
oos.writeObject(target);
oos.flush();
oos.close();
baos.toByteArray().length // ここで取得される値がバイトサイズ
```

# 方法2(SerializationUtils.serializeして長さを計る)
```java
SerializationUtils.serialize((Serializable) target).length // ここで取得される値がバイトサイズ
```

# まとめ
ネットで調べるとこれらの2つの方法が見つかった。
私の環境で試す限りどちらで計測してもサイズは変わらなかったが、
方法2だと方法1より大きく値が出てしまい正しい値にならないという記述もあったため、
若干面倒ではあるが方法1を使用したほうがいい模様。
Ubuntu16.04のVagrant Boxを取得する



https://atlas.hashicorp.com/bento/boxes/ubuntu-16.04
上記のページから、Ubuntu16.04はAtlasに存在するっぽい。

[直接Vagrant用のBoxをatlasからダウンロードする - Qiita](http://qiita.com/liubin/items/a0765fc36bd87dcb4a5e)

この記事を参考に、BoxのダウンロードURLを作成する。

- box url: `https://atlas.hashicorp.com/bento/boxes/ubuntu-16.04`
- version: v2.3.0 => `/versions/2.3.0`
- provider: virtualbox => `/providers/virtualbox.box`

BoxのダウンロードURLは `{url}{version}{provider}` と組み立てれば良いとのことなので、これらの情報から以下のURLが生成できる。

```
https://atlas.hashicorp.com/bento/boxes/ubuntu-16.04/versions/2.3.0/providers/virtualbox.box
```

これで`box add`してみる。

```
$ vagrant box add ubuntu16.04 https://atlas.hashicorp.com/bento/boxes/ubuntu-16.04/versions/2.3.0/providers/virtualbox.box
==> box: Box file was not detected as metadata. Adding it directly...
==> box: Adding box 'ubuntu16.04' (v0) for provider:
    box: Downloading: https://atlas.hashicorp.com/bento/boxes/ubuntu-16.04/versions/2.3.0/providers/virtualbox.box
==> box: Successfully added box 'ubuntu16.04' (v0) for 'virtualbox'!
```

Boxをダウンロードできた。

--

（2016/11/25 追記）
上記Boxを利用して`vagrant up`で起動したところ、

```
$ vagrant up                                                                         (git)-[master]-
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Importing base box 'ubuntu16.04'...
==> default: Matching MAC address for NAT networking...
==> default: Setting the name of the VM: {{ vm.name }}
==> default: Clearing any previously set network interfaces...
==> default: Preparing network interfaces based on configuration...
    default: Adapter 1: nat
    default: Adapter 2: hostonly
==> default: Forwarding ports...
    default: 80 => 8888 (adapter 1)
    default: 22 => 2222 (adapter 1)
==> default: Running 'pre-boot' VM customizations...
==> default: Booting VM...
==> default: Waiting for machine to boot. This may take a few minutes...
    default: SSH address: 127.0.0.1:2222
    default: SSH username: vagrant
    default: SSH auth method: private key
    default: Warning: Connection timeout. Retrying...
    default: Warning: Connection timeout. Retrying...
    default: Warning: Connection timeout. Retrying...
    default: Warning: Connection timeout. Retrying...
    default: Warning: Connection timeout. Retrying...
    default: Warning: Connection timeout. Retrying...
    default: Warning: Connection timeout. Retrying...
    default: Warning: Connection timeout. Retrying...
    default: Warning: Connection timeout. Retrying...
    default: Warning: Connection timeout. Retrying...
...
```

のままssh接続できない状況になってしまっていました。この状況をググってみると、
[Vagrant で bento/ubuntu-16.04 を vagrant up すると Connection timeout になってしまう - Qiita](http://qiita.com/chatii0079/items/b60abd6ab2822b49290a)
と報告があり、試してみると無事ssh接続できました。ホント有り難いことです！

※確認環境

- OS: `OS X El Capitan`
- Vagrant: `1.8.7`
- VirtualBox: `5.0.30 r112061`
MESHとIFTTTを使ってみた


#MESH

##MESHとは
[MESH](http://meshprj.com/jp/)
センサーとBluetooth通信が一体となった小さなデバイス
専用のアプリで視覚的にプログラミングでき、手軽にIoTを楽しめる

##MESHの使い方
MESHアプリをダウンロードして起動すると、チュートリアルがある
使い方は単純なので、チュートリアルをこなせばわからないところはないと思う

#IFTTT
##IFTTTとは
[IFTTT](https://ifttt.com/)
様々なアプリとアプリを連携させるためのサービス
例えば、twitterに投稿するときに特定のハッシュタグを付けたツイートを、facebookに自動投稿したりできる
使いようによっては、メチャクチャ使えるやつだと思う

##IFTTTにアカウントを作る

[IFTTT](https://ifttt.com/)サイトにアクセスし、Sign up > メールアドレスなどを入力してアカウントを作る

##My Servicesの登録
右上のアカウント名横のVをクリックするとServicesというメニューがある
登録しているService一覧が出て、その下にAll servicesというリンクがあるのでクリックする
すると連携アプリの一覧が出てくる
使いたいサービスを選んでConnect
アプリごとに認証画面や設定画面が開くので、適当に認証と設定をする

##My Appletsの登録
MyApplets > Appletsタブ > New Applet
+thisにトリガーとなるアプリを、+thatにトリガーが実行されたら動作する方のアプリを選ぶ
アプリを選ぶと、それぞれ設定画面になるので、適当に設定し、Create Action > Finish で完成
設定を変えたり削除したりするときは、レシピ右上の歯車マークを押せばいい

My Servicesの登録はMy Applets登録時にもできる（未設定の場合はConnectが出る）ので、同時にしてもいい


##IFTTT×MESH

MESHをIFTTTに繋いで、センサーの前を人が通ったら、Twitterにつぶやくというシステムを作ってみる

###MESHアプリ側

1. 連携タグ > 追加 > IFTTT > セットアップ。IFTTT Key が表示されるのでメモして > OK

2. 連携タグリストにIFTTTタグが出るので、キャンバスに追加してタグをタップする

3. イベントID（英数字のみ可）を好きに決めて、入力し、メモしておく。送信データが必要なら追加しておく

###IFTTT側

1. +this > Search > MESHと入力

2. MESH > Edit connection > IFTTT Keyを入力

2. MESH > Event from MESH app received Event Key を入力 
 
3. Create Trigger
 
4. +that > Twitter > Connect Twitter
 
5. Connect > 認証画面が出るので、認証する

6. Choose action > Post a tweetを選ぶ

7. Tweet内容を入力して、Create action

8. 最後にAppletの説明を入力する > Finish

#MESHの良いところ、残念なところ
##良いところ

* 手軽さという点では最高   
* 視覚化されたプログラミングアプリ  
* 見た目がかわいい

プログラミングの知識も半田ごても必要なし。買ってきてすぐにアプリをダウンロードして即遊べるという点では、群を抜いて遊びやすい。
アプリは見た目で動きがイメージしやすく、ほぼ3ステップでそこそこの機能が実装できるので、子供でも一緒に楽しんで遊べる。
また、とかく見た目がアレになりがちなIoTだが、完成された製品であるがゆえに、とてもスマートで可愛いのはとてもいい。
 

##残念なところ

* 高い
* Bluetooth範囲内にスマホがないと動作しない
* スマホでMESHアプリを立ち上げていないと動作しない

センサータグ1つにつき7000円ほどするので、お手頃価格とは程遠い。アプリの開発費なんかも含めると仕方ないのかもしれないが...
Bluetooth通信を使っているので、当たり前だが近くにスマホがないといけない。しかも、バックグラウンドで常にアプリを動作させておく必要があるし、カメラなど、バックグラウンドでは動作しないデバイスもある（個人的にこれは痛いと思った。玄関を誰かが通ったらカメラを起動させたかったのだが）

#IFTTTの良いところ、残念なところ

##良いところ

* 連携アプリが多い
* 豊富なサンプルレシピ
* アプリごとのAPIを知らなくてもいい

MESHに負けず劣らず、設定が超簡単なので、難しいAPIなど全く知らなくても数分でアプリ連携ができる
また、連携しているアプリも多数あり、有名どころのサービスはほぼ網羅されているのではという感じ
サンプルレシピもたくさんあり、それらを試すだけでも面白い


##残念なところ

* 1つのサービスに対して、1つのアカウントしか設定できない
* 処理にそこそこ時間がかかるようなので、即時的な反応を要するものは厳しい
* 英語

サービスそのものを複数登録することはできない（複数のレシピにひとつのサービスを使いまわすことはできる）
また、1つのサービスには基本的に1つのアカウントしか紐付けられないため、Twitterなどは、複数のアカウントを持っている人も多いかと思うが、
どれか1つのアカウントのみでの運用を強いられる
今のところ、これを回避するには、複数のIFTTTアカウントを作るしかないようだ
また、処理はそこそこのタイムラグがあるので、例えばMESH人が通ったことを感知してIFTTTを通してライトをつけるなどは、ライトが付くのは人が通り過ぎてからになるかもしれない
サイトやアプリは英語なので、英語が苦手な人には少し辛いかもしれない
Static変数を$thisでアクセスしようとしたら__SETに引っかかった

以下コードのようなことをしていた


    <?php

    trait test {
        public static $test;
    }

    /**
    *
    */
    class tester
    {
        use test;

        public function __set($name, $val) {
            var_dump($name);//hoge
            $this->$name = $val;
        }

        function __construct($val)
        {
            $this->test = $val;

            return $this;
        }

        public function dumpTest()
        {
            echo $this->test;
        }
    }

    (new tester('hoge'))->dumpTest();

staticプロパティに$thisからアクセスしたことでエラーが発生するが,
これに__Setが反応する。
Elasticsearch 一目で分かるアーキテクチャ


## 全体像

![ElasticSearch アーキテクチャ](https://lh3.googleusercontent.com/26TLWjGdfFSJQ9onvPiOmf5cYPpSWhWlI73uk1QIR6tm36x29n_HfwD17qggoM8EdONrn6XYcLwRJw6LA97f1_icOzxPwJze-zAjVFmZROfSa8XbEyfGp0Nax3oCcWsvGZxypMhjoSUDZGvCK8f4w_Aqaa7SIl3Ch8ODWv5hX4_11-WUSQR52Jq53v298gl_eG8MSh42daSi55v43mmErcmvm3fys16QR3XuhC_sbnbX-A7db7cXxe246z_jPbkwXuGvPXmzIlbYvmfPQra5Rm9mrSsFmKUtHuD9OKnie4pn-2lKWVSFFEDdPrB4XJdAk4O8XmUtG1vIX2yygD1eq1Sa4JiOb8zMwIYyw_bGklLo6739fK6IX1zVyf7oyphm1fCqiUBs1Uyz64XN8Ldwoa2RJRu035ptZCAQdx7KND5t9UWyXBPElaVV-SAOYjpYq5VGgdRzXgIKuqqdZkevlfE_YNGXNILZbZOz2Tk2uZlp61AUK5Mj-J3pD-K4o8EJxwjYRmYHfZtRr6JgSWxb8wKKngbUmQmjj36iX0bbmFlABiE6ckKxh_cbXKa-fQLN2_gpfaGTE-3PYHxh5vfcfcfTNhTSVKtrH7PypO_7GQdhYstD=w618-h435-no)

## 物理的なインデックス

Elasticsearch の物理的なインデックスは、クラスタ、 ノード、シャードの 3 つの要素から構成されている。

### クラスタ ( ≒ ElasticSearch サーバー群 )

複数のノード ( ElasticSearch サーバー ) を一つの ElasticSearch として動作させることができます。クラスタ構成にすることで、大量のデータを複数のノードに分散して保持することが可能です。クラスタは同一のプロセス名 (デフォルトでは `elasticsearch` ) を指定することで構成できます。

### ノード ( ≒ ElasticSearch サーバー )

Elasticsearch の 1 プロセス ( ≒ サーバー ) に相当します。基本的には 1 サーバーに、1 プロセス動作しますが、複数のノードを起動することも可能です。

### シャード

各インデックスを分割したものです。シャードにはプライマリシャードとレプリカシャードが存在します。

#### プライマリシャード

インデックスの書き込みと参照処理で使用されます。プライマリシャードにデータを保存し、レプリカシャードにデータをコピーします。

#### レプリカシャード

プライマリシャードのコピーです。インデックスの参照処理で使用されます。プライマリシャードが消えてしまった場合は、該当の レプリカシャードが昇格されフェールオーバーに使用されます。

## 論理的なインデックス

Elasticsearch の論理的なインデックスは、インデックス、タイプ、ドキュメント の３つの要素から構成されています。

### インデックス ( ≒ データベース )

RDB のデータベースに相当します。インデックスはドキュメントの集合です。Elasticsearch はインデックス単位でドキュメントを管理することができます。各インデックスを横断して検索することもでき、任意のインデックスのみ検索対象にすることもできます。

### タイプ (  ≒ テーブル )

RDB のテーブルに相当します。インデックスに登録するドキュメントを分類するものです。各タイプを横断して検索することもでき、任意のタイプのみ検索対象にすることもできます。

### ドキュメント (  ≒ レコード )

ドキュメントは、RDBMS の 1 レコードに相当します。ドキュメントは複数のフィールドから構成され、各ドキュメント異なった構造を持つことができます。

## 参考文献

[Elasticsearch システム概要 – Hello! Elasticsearch. – Medium](https://medium.com/hello-elasticsearch/elasticsearch-afd52d72711#.qah18j4ta "Elasticsearch システム概要 – Hello! Elasticsearch. – Medium")
シングルページアプリケーション（SPA）でページ遷移せずにファイルアップロードをする際の注意

ページ遷移せずに２回目のファイルアップロードをしようとした場合、ブラウザによっては失敗することがある。

これは、input タグのvalue に既に値が入っていることが問題なので、以下のようにリセットすれば正常に動作する。

``document.getElementById("target_id").value = "";``

jQueryなら以下。

``$("#target_id").val("");``
JIRAのストーリーポイントの適用課題タイプをプロジェクトごとに設定する

スクリーンやフィールドのスキーマと異なり、ストーリーポイントのスキーマ設定場所が少しわかりづらいので説明します。

右上の歯車からIssuesメニューを選択
<img width="381" alt="Screen Shot 2016-11-22 at 11.56.41.png" src="https://qiita-image-store.s3.amazonaws.com/0/138322/e6c8718f-7731-3077-8bc0-0b351a2509d6.png">

FIELDSのCustom fieldsを開く
<img width="306" alt="Screen_Shot_2016-11-22_at_14_20_15.png" src="https://qiita-image-store.s3.amazonaws.com/0/138322/970ebc7b-a3ed-e09f-20cd-0fc6657ab9e1.png">

Story PointsのConfigureを開く
<img width="1175" alt="Screen Shot 2016-11-22 at 14.20.41.png" src="https://qiita-image-store.s3.amazonaws.com/0/138322/2011da0c-6b20-4c11-bb92-16c00dc70c4f.png">

Add new contextを開く
<img width="765" alt="Screen_Shot_2016-11-24_at_20_03_25.png" src="https://qiita-image-store.s3.amazonaws.com/0/138322/cc31f113-20b6-a360-19ba-c223ff64f44b.png">

①ストーリーポイントを設定可能にしたい課題タイプを選択。
②適用するプロジェクトを選択する。
<img width="891" alt="Screen_Shot_2016-11-24_at_20_04_04.png" src="https://qiita-image-store.s3.amazonaws.com/0/138322/28212bac-8657-1514-77e6-f9a9ca52f7c1.png">

これで、プロジェクトごとにストーリーポイントを設定できる課題タイプを設定できる。
EC-CUBE3 新規ページ作成

EC-CUBE3にてコラム専用の新規ページ作成を行いました。その備忘録。

参考URL: http://ec-cube.github.io/guideline/plugin-pageadd

基本的には上記URLの公式ガイドを参考に実装していけばよいです。
ページ作るのもプラグインなの？！っていう驚きはありましたが...

#### プラグイン作成
まずはガイドに沿ってプラグインジェネレータをインストールしてプラグインを作成します。
プラグインジェネレータを使ってプラグインを作成すると必要なファイル一式がapp/Plugin/配下に作成されます。
プラグイン名：おまかせ
code：ここでのcodeがapp/Plugin/配下でディレクトリ名として使用されます。
バージョン：1.0.0でいいと思います。
作成者：おまかせ。
![ローカルrubbermark   EC CUBE管理画面.png](https://qiita-image-store.s3.amazonaws.com/0/32957/e004dad5-4b78-cbea-fe67-1631fad17904.png)

#### Controllerの編集
自分の場合はcodeをBlogPageとしたので、app/Plugin/BlogPage/Controller/配下にBlogPageController.phpというものが作成されていました。
ここでテンプレート名を変更できます。
必要があれば変更してください。

#### テンプレートの編集
これもapp/Plugin/BlogPage/Resource配下にtemplateディレクトリが作られ、その中にindex.twigが自動で作成されています。
こちらも必要があれば変更してください。

#### ServiceProviderにてルーティング定義
app/Plugin/BlogPage/ServiceProvider/BlogPageServiceProvider.phpの32行目あたりに以下のような記述がありますので作成された名前に合わせて変更してください。

```php:app/Plugin/BlogPage/ServiceProvider/BlogPageServiceProvider.php
// デフォルトはこんなのが書いてありますので環境に合わせて以下のように変更
// $app->match('/plugin/[code_name]/hello', 'Plugin\BlogPage\Controller\BlogPageController::index')->bind('plugin_BlogPage_hello');

// 独自コントローラ
$app->match('/blogpage/index', 'Plugin\BlogPage\Controller\BlogPageController::index')->bind('plugin_BlogPage_index');
```

#### dtb_page_layoutへの登録

```sql
INSERT INTO dtb_page_layout(
device_type_id,
page_name,
url,
edit_flg,
create_date,
update_date
) VALUES (
10,
'ブログページ',
'plugin_blogpage_index', 
2,
CURRENT_TIMESTAMP,
CURRENT_TIMESTAMP
);
```
urlカラムですが、上のServiceProviderにてbindしているurlと同じものを入力してください。

これでEC-CUBEのURL/blogpage/indexへアクセスするとちゃんとページが表示されました。
あとはControllerとテンプレートを好きにいじりたおしてください。
symfony sqlite の使い方

基本的に記載通りやったらできる

http://symfony.com/doc/current/doctrine.html
sqliteで検索するのと

フォルダー内
symfonyfile/app/config/config.yml
sqliteの仕方が書いています。
原文のまま

# if using pdo_sqlite as your database driver:
        #   1. add the path in parameters.yml
        #     e.g. database_path: "%kernel.root_dir%/data/data.db3"
        #   2. Uncomment database_path in parameters.yml.dist
        #   3. Uncomment next line:

http://symfony.com/doc/current/doctrine.html

※dataフォルダーが無いとできないので注意してください。
django memo

##django　の最初で詰まった話
インストールして最初のファイル作成でこけてた。
```
bash-3.2$ django-admin startproject myapp
bash: django-admin: command not found
```
コマンドがないと怒られる。

##MacのOS Xのパーミッション

```
あなたは、Mac OS Xを使用している場合は、あなたが実行しようとするとメッセージ"アクセス許可が拒否されました」表示されることがありdjango-admin。これは、プログラムとして実行することができます前に、OS XのようなUnixベースのシステムでは、ファイルは「実行可能」としてマークされなければならないからです。この、オープンTerminal.appを行うと、（使用してナビゲートするにはcd、ディレクトリにコマンドを）ジャンゴ管理者がインストールされ、その後のコマンドを実行します。sudo chmod +x django-admin
```
マックではパーミッションエラーが出るそうなので
```
bash-3.2$ sudo chmod +x django-admin
chmod: django-admin: No such file or directory
```

うーん　いつの間にか使えるようになる。

```
bash-3.2$ django-admin.py startproject myapp
```
が正解のようです。動きました。
30分で名刺を作成したいときに参考にしたい名刺デザインテンプレサイト

「名刺作ってくれない？」って言われませんか？
ちょっとデザインをかじっている人の場合、周りから色々やってよって言われると思うんですけど。

簡単にランキング化しますね。
題して、
###【ちょっとデザインかじってる人がちょくちょく頼まれる頼まれごとランキング】
張り切っていきましょう。

#第３位　『メールが届かないんだけど』

いやもうそれ関係ないよね！？デザイン関係ないよね？
ただパソコンできる人に聞くやつだよね！？

でも、これよく言われますね。
どうせOutlookでしょ？Outlookって調べればいいよ？


#第２位　『ホームページ欲しいんだよね』

で？だから？だからなに？
ホームページなんて、手に入るなら誰でも欲しいよ、無料なら。

それ相応のお金をいただけるなら、見積もり出しますよ。
お友達価格でやりますよ。でも無料で簡単に作れるって思われるときついですわ。


#第１位　『名刺作ってくれない？』

はい、出た。今回のメインテーマです。
いや、いいよ？作るのはいいけど。

どんなデザインがいいかとか、どんなフォントが、とか。
せめてロゴもくれないとねえ？いや、そんなサイズちっちゃいやつじゃなくて、、

っていう諸々の問題があるんだけど、でもどうしても断れない、できるなら作ってあげたい、けど時間かけたくない、そんな時。
そんな時にピッタリな、名刺のデザインテンプレートサイトを紹介します！（導入が長い）


####①<格安でスピード作成！名刺印刷は完全データ入稿専門の名刺良品へ！>
https://www.meishiryohin.com/order/products/list.php?category_id=7

テンプレの量、質ともに充分満足できる内容だと思います。
奇抜なデザインはなし、ビジネス名刺の典型的な形を網羅しています。

そのままダウンロードして、内容だけ変えちゃえば名刺の完成！
相手を喜ばしたいのであれば、2~3個引っ張ってきて作ってあげてもいいのでは。
そんなことすら可能にするほど、簡単に名刺が作れます。横だけじゃなく、縦のテンプレも充実しています。

####②<名刺専科。>
http://business-card-info.com/

おしゃれなデザインがいっぱい。
ちょっと相手の度肝抜いてやろうって時はこのサイトを参考にするといいでしょう。

縦も横もかっこいい、思わず見入ってしまうレベルのデザインが落ちています。
デザインの参考が見たい場合にもオススメです。

簡単に言うと田舎なら1~2週間は話題をさらうレベルですよ。
くそかっこいいデザインを作成して、あなたのデザイナーとしての地位を確実にしましょう。
テンプレかどうかなんて言わなきゃわかんないって！

どうやって作ったの？って言われたら
「アイデアが浮かんでくるんですよね・・・才能かな」
って言っておけばOKです。

####③<フリーピックfreepik>
http://jp.freepik.com/free-photos-vectors/business-card

デザインをかじっている人なら一度は訪れたことがあるだろうfreepik。
ご多分にもれず、海外の人が作ったものが多く載っており、めちゃくちゃかっこいいっす。

これが著作権フリーってマジか！ってなります。
パクっていいそうなのでパクりましょう（パクっちゃダメなやつもあるかもです）

とにかく眺めているだけで楽しいですね。
何個かダウンロードして、相手にばらっと見せて選んでもらうのもいいかも。

「こんだけデザインありますから、選んでいいっすよ？」
って言えば、あなたのデザイナーとしての地位もガン上げ or 殴られる でしょうね！

とにかくかっこいいので、デザインの参考になること間違いなし。
制作前に一回覗いておくことをオススメします。


#【まとめ】
ネットにかっこいいデザインが腐るほど落ちているから、うまく利用して楽しちゃおう。
ネットをうまく使えない人に、かっこいいデザインを届けてあげよう！
それはきっと、あなたにしかできないことだから。。。

現場からは以上です。
rake db:migrate で ActiveRecord::StatementInvalid: Mysql2::Error: Table 'db.table' doesn't exist: SHOW FULL FIELDS FROM `table`

## 背景

rake db:migrate しようとしたら tableないっておこられる。
migrateなのにそりゃないぜ。
よくわからないけど、設定ごにょごにょしたら直った。
後で詳しく調べる。

## 対処法
GEMFILEのfactory girlの設定のrequireをfalseにして、spec_helperでfactory girlをrequireしてあげれば通る。

```:Gemfile
gem 'factory_girl_rails', :require => false
```

```:spec_helper.rb
require 'factory_girl_rails'
```

## 参考
http://stackoverflow.com/questions/12423273/factorygirl-screws-up-rake-dbmigrate-process
RESTAPIをLambda + API Gatewayで実装したい(serverlessで)

・serverless@1.2.1時点でのメモ
・Lambdaプロキシ統合を使用(LAMBDA_PROXY, Lambda Proxy)

# serverlessって
AWSのlambda関数とその他サービスの連携を
ローカルで設定して、簡単にアップ出来たりする。

slsコマンドを使う。

# インストール
```
npm install serverless -g
```

※npmコマンドがまだ入ってない時
[npm(Node.js) インストール メモ](http://qiita.com/tsuuuuu_san/items/8adb4b504fda4d31e009)


# プロバイダアカウントの設定
## AWSで：IAMユーザの作成
1. IAMユーザを「serverless-admin」という名前で作成。

2.
「serverless-admin」
→アクセス許可
→ポリシーのアタッチ
→「AdministratorAccess」を追加

## aws-cliのインストール
```
curl "https://bootstrap.pypa.io/get-pip.py" -o "get-pip.py"
python get-pip.py
pip install awscli

## 確認
aws --version
```

## aws-cliにIAMの資格情報を登録
```
aws configure

AWS Access Key ID [None]: IAMアクセスキーを入力
AWS Secret Access Key [None]: IAMシークレットキーを入力
Default region name [None]: ap-northeast-1
Default output format [None]:未入力でEnter
```

## serverlessがデフォルトのAWSプロファイルを見れるようにする
```
cp ~/.aws/config ~/.aws/credentials
```

# サービス作成
```
mkdir 名称 && cd 名称
sls create -t aws-nodejs
```

## createコマンドで作成されるファイル群
|ファイル|説明|
|:---|:--|
|event.json|作成した関数をテスト実行するときに使用するテストデータを格納。|
|handler.js|Lamdaにアップする関数を記載する。|
|serverless.yml|デプロイ先(API Gateway)のクラウドの設定<br>（プロバイダ、プラグイン、イベント)<br>を記載する。<br>環境変数も定義できる。|

# デプロイするまで
## アップする関数を作成
[APIGatewayで使うLambda用の関数を作る](http://qiita.com/tsuuuuu_san/items/7ac256b2290ea8d14ec5)

ローカルでテストしたくても、
まず↓のデプロイ設定をしなくちゃだめ！

## デプロイ設定
ymlファイルについては別ページにて記載。

とりあえず、ここで言えることはymlファイルは「半角スペースのインデントでネストを表現」するので、そこだけ注意。

```lang:例：serverless.yml
service: my-api

provider:
  name: aws
  runtime: nodejs4.3
  region: ap-northeast-1

functions:
  fn:
    handler: handler.hello
    memorySize: 128
    timeout: 10
    events:
      - http:
          path: index
          method: get
```

解説

|設定|説明|
|:---|:--|
|service|API Gatewayの名前を設定<br>(stage名-service名が登録される)|
|provider|下層にプロバイダの設定を記載|
|provider:name|aws固定でおｋ|
|provider:runtime|関数で使用する言語設定？デフォでおｋ|
|provider:region|ambdaとAPIGatewayを実装するリージョンを設定。東京なら「ap-northeast-1」|
|functions|下層に関数に関する設定を記載|
|functions:fn|fnは仮。<br><br>LambdaFunction名にしたいものをfn箇所に記載。<br>(service名-stage名-fnが登録される)|
|functions:fn:handler|実際に動作させるhandler.jsの関数を指定。js名.関数名|
|functions:fn:memorySize|Lambdaのメモリ設定|
|functions:fn:timeout|Lambdaのタイムアウト設定|
|functions:fn:events|下層にイベントの詳細を記載|
|functions:fn:events[http]|リクエストの詳細を下層に記載。|
|functions:fn:events[http:path]|APIのパスを指定|
|functions:fn:events[http:method]|リクエストメソッドを指定<br>(記載の際はインデント注意)|
|functions:fn:events[http:cors]|corsの有効化を指定<br><br>Lambdaプロキシ統合の場合、<br>OPTIONSメソッドのみの対応。<br>その他のメソッドはレスポンスヘッダ直書きになる。<br><br>(記載の際はインデント注意)|

## 作成した関数をローカルでテスト
```
sls invoke local -f Function名
sls invoke local -f Function名 -p jsonファイル名
※localを外せば本番のAPIを実行するよ(お金かかるはず)
```

|オプション|解説|
|:--|:--|
|-f Function名|serverless.ymlに記載したFunction名を記載|
|-p jsonファイル|Lambdaに渡すeventを定義したjsonファイルを指定<br>|

## サービスのデプロイ(再デプロイも一緒)
```
sls deploy
```
※
デプロイやサービス削除で、S3に対し、ログの作成や更新を行う。
そのログを履歴として、serverlessとの連携を実現している？
S3の料金どないすんねん！
とか後から言われても知らないんだからねっ

## サービスの削除
```
sls remove
```
Gitlab を StartSSLの証明書で HTTPS設定したこと


# 概要

AWSのEC2で立てている Gitlabサーバーを、HTTPS設定しました。
設定を一行（むしろ、1文字）書き換えるだけの、超絶簡単設定かと思いきや、証明書でハマりました。

**この記事では、StartSSLの証明書を利用していますが、認証局（StartCom)は 2016年10月に失効しています。**

そのうち、Let's Encryptへの乗り換えについて投稿するかもしれません。

## 環境など

Amazon Linux AMI 2016.03
Gitlab 8.10.5

# 上手くいった手順

## メールを受信できるようにする

証明書の発行のために、postmaster@server.domain.name.com みたいなメールを受信する必要があります。
EC2にメールサーバーを設定するとか、かなり面倒なので、SESを使います。
こちら参考に設定しました。

http://dev.classmethod.jp/cloud/aws/acm-verifydomain-ses/

## EC2のセキュリティグループ設定

HTTPS(Port 443)を許可します。


## StartSSLで証明書を取得する

こちら参考に取得しました。

http://qiita.com/paralleltree/items/56451c3eb240c7e95eca

CSRの作成は、StartSSLの画面に案内されている通り opensslコマンドで行いました。

Domain Validation のメール送信から code入力までが 1分以内というのがかなりタイトです。
以下を1分以内にやらなきゃいけません。

1. StartSSLの画面で送信
2. S3からメールをダウンロード
3. ダウンロードしたメールを開いて codeを探してコピー
4. StartSSLの画面で、codeをペーストして、Validate


ま、失敗したらリトライすれば良いのですが。

## 証明書をGitlabサーバーに仕込む

### 秘密鍵

秘密鍵は Decryptする必要があります。
Gitlabのデフォルトに合わせてファイル名も変えておきます。

```
$ openssl rsa -in keyname.key -out keyname-decrypted.key
$ mv keyname-decrypted.key server.domain.name.com.key
```


### 公開鍵

公開鍵は、StartSSLからダウンロードして来た中の nginx用を使います。
NginxServer.zip を解凍した中に入っているファイルです。
これも、Gitlabのデフォルトに合わせてファイル名を変えます。

```
mv 1_server.domain.name.com.jp_bundle.crt server.domain.name.com.crt
```

### Gitlabサーバーに置く

↑の 2ファイルを、Gitlabサーバーに転送し、/etc/gitlab/ssl/ へ保存します。

```
# cd /etc/gitlab
# mkdir /ssl
# chmod 700 ssl
# mv ~/server.domain.name.com.* /etc/gitlab/ssl
# cd ssl
# chmod 400 server.domain.name.com.key
```

### 設定変更して再起動

設定をhttpsに変更します

```/etc/gitlab/gitlab.rb
external_url "https://gitlab.domain.name.com" 

```

「https」と書くだけで良きに計らってくれるとは、Gitlab賢いですね。

最後に、gitlab-ctlコマンドで再構築をします。
reconfigure後に、statusコマンドで確認します。
全てのサービスが起動していれば成功です！

```
# gitlab-ctl reconfigure
# gitlab-ctl status
```

# はまったとこ

## 秘密鍵・公開鍵の形式

Decryptが必要なことや、公開鍵はどれを使えばいいのか判らず右往左往しました。
形式が違う鍵を入れていた場合、reconfigure後に nginxだけタイムアウトで落ちてしまいました。
こちらと同じかな？と試してみたら上手くいきました。

https://about.gitlab.com/2016/06/24/secure-gitlab-pages-with-startssl/


# Thanks a lot!!

https://gitlab.com/gitlab-org/omnibus-gitlab/blob/master/doc/settings/nginx.md
SQLServer: SQLServerProfiler, 動的管理ビュー, 利用状況モニタの閲覧に必要な権限を付与する

動的管理ビュー（DMV)やSQLServerProfilerが閲覧できると、有益な情報が沢山取得できて非常に強力な反面、sysadminロールを安易に割り当てるのは危険すぎますよね、、、
read権限しかなく、write権限は持たないまま（＝update/insertなど不可能なまま）、DMVのSELECTやProfilerの使用ができるような権限の付与方法が知りたい！！！と思って調査しました。

# 付与する権限と付与方法について
・目的は、SQLServerProfiler と 動的管理管理ビューを閲覧できる状態にすること。ただし、テーブルやストアドのALTER,INSERT,UPDATE,DROPなどはできない状態を保ちたい

・権限にはサーバーレベルのものと、データーベースレベルのものがある。今回付与したい権限は全てサーバーレベル。

・権限割り当てについては、「ロールに権限付与→ロールを各ログインに割り当て」という手順が望ましいが、
SQLServer2008までは、ユーザが作れるロールはデータベースロールのみ。サーバーロールは任意で作成したり、既存のロールを変更することができない。
※ユーザ定義サーバーロールが作れるのは2012以降　https://technet.microsoft.com/ja-jp/magazine/hh641407.aspx

そのため、今回の環境(SQLServer 2008以前）については、サーバーレベルの権限は、各ログインに対して個別に直接割り当てる必要がある。



# 各ログイン（＝ユーザー）に対して権限を付与するSQL
-- SQLServer Profilerが閲覧できる権限を付与する
USE [master]
GO
GRANT ALTER trace TO [ログイン名(例. emotu)]
GO

-- 動的管理ビューを閲覧できる権限を付与する
USE [master]
GO
GRANT VIEW SERVER STATE  TO [ログイン名(例. emotu)]
GO

-- 上記2権限を付与することにより、利用状況モニターから「プロセスの削除」ができるようになってしまうので、その権限だけ奪う
USE [master]
GO
REVOKE ALTER ANY CONNECTION  TO [ログイン名(例. emotu)]
GO


以上でwrite権限は付与しないまま、DMVのSELECTやProfilerの利用ができるようになります。最高っ！！
※ただし、VIEW SEVER STATE権限もかなり強力な機能なので、付与するときは慎重に、、、
※その他、何かしらの更新/削除が行えてしまう可能性も0ではないので、付与は慎重に行ってください。
JavaScriptでAmazon S3のディレクトリを空にするスクリプトを書いた(1000アイテムまで)


厳密にはディレクトリではないのですが、この書き方のほうがイメージ伝わるだろうということで便宜上「ディレクトリ」と称します。

バケット内に`/BUCKET_NAME/DIR_NAME/index.html`みたいな形でファイルを設置すること、よくありますよね。

少ないファイルであれば都度スクリプトや管理画面から指定して消せばいいのですが、StaticPressや絡新婦などのような別のプログラムからガンガンファイルを送ってこられるパターンだとどちらもかなりしんどいところがあります。

ということでJSで`DIR_NAME`ディレクトリの中身ををまるごと削除するスクリプトです。

```
var aws = require('aws-sdk');
aws.config.update({
	region:'us-east-1'
});
var s3 = new aws.S3({apiVersion: '2006-03-01'});

var bucket = 'YOUR_BUCKET_NAME';
var prefix = 'DIR_NAME';

var params = {
  Bucket: bucket,
  Prefix: prefix
};
s3.listObjectsV2(params).promise().then(
	function(data){
		console.log(data.Contents.length)
		var deleteList = []
		for (var i = 0; i < data.Contents.length; i++) {
			var deleteSite = {
				Key: data.Contents[i].Key
			}
			deleteList.push(deleteSite)
		}
		var params = {
		  Bucket: bucket,
		  Delete: {
		    Objects: deleteList
		  }
		};
		return s3.deleteObjects(params).promise()
	}
).then(
	function(data){
		console.log(data);
	}
).catch(
	function(err){
		console.log(err);
	}
)
```

## 利用上の注意
ListObjectsV2で一度に取れるファイル数が1000件までです。
ですので1001件目以降については、もう一度このスクリプトを実行してもらわないと削除できないのでご注意ください。

そのうち1001件以降のファイルについても、まとめて消していけるスクリプトも紹介します。
Vangrantの共有フォルダで静的ファイルが更新されない問題の　解決と原因の考察

# 概要
Vagrant＆Virtualboxで用意した仮想環境をWebサーバとして使う。
そして、フォルダの共有機能を使ってホスト側で編集しながら動作確認する・・・。ような使い方をしている方も多いとおもいます。

だが、htmlやcss,jsファイルを更新してもその内容が反映されない。だがPHPファイルは更新されるという謎現象が発生。


httpdを再起動させたりしてもダメ。
httpd.confの`EnableSendfile Off`を有効にしてもダメ。

Vagrantfileの設定変更で解決した。


## 参考
Vagrantのup時、httpdが自動起動しないとき
http://qiita.com/ooba1192/items/96b7ab25d2bda1676aaa

上記リンク先のVagrantfileの変更だけで解決した。

# 環境

ホスト側（Webエンジニアの環境にありがち）
- mac os X (El Capitan)
- Vagrant (1.8.6)
- VirtualBox (5.0.14)

ゲスト側（この件に関しては関係少なさそうだけど　これも定番か）
- Cent OS 6.7 （公式で公開されてるbento）
- Apache httpd (2.2系)
- PHP (5.6系)

# 設定例

下記抜粋のように、追記。
私の環境では、その後再起動で、無事更新されるようになりました。

```bash:Vagrantfileから抜粋
  # 共有設定

   config.vm.synced_folder "/Users/rojiuratech/Documents/workspace" , "/var/www/html" , owner: "apache", group: "apache"

# ここから追記
    config.vm.provision :shell, run: "always", :inline => <<-EOT

       sudo service httpd restart

    EOT
# ここまで追記
end
```

# 原因の考察

先に取り上げた記事　並びにそこからリンクされていた
下記ページを読んでみると・・・。

Vagrant上のCentOSでhttpd.confをVagrant共有ディレクトリのシンボリックリンクにしているとOSブート時にhttpdが自動起動しない #vagrant #apache

http://nori3tsu.hatenablog.com/entry/2014/03/22/123313

>これは、/etc/init.dの起動スクリプトが実行されるタイミングで/vagrantディレクトリがマウントされていないことが原因です。 

ゲストＯＳ側の起動スクリプトが作動する時点で、マウントがなされていないことが原因・・・のようです。

だったら、マウント状態をチェックしよう。
いやいや、Vagrantfileに　プロビジョニング時に強制的に（共有フォルダを扱う）httpdを再起動させよう！　というのが最初に取り上げたリンク先の考え方。

# 再起動時のログを確認

下記ログを読んでみると

1. ポート設定などを行った上で、ゲスト側ＯＳが起動
2. 共有ディレクトリをマウントする
3. インライン記述のスクリプトで、 httpdを再起動

といった流れになってます。

やっぱり、マウントされる前にhttpdが起動されるから・・・
認識されていないんだ。

```bash:プロビジョニング（再起動）時のログ
$ vagrant reload

==> default: Attempting graceful shutdown of VM...

==> default: Checking if box 'bento/centos-6.7' is up to date...

==> default: Clearing any previously set forwarded ports...

（中略）

==> default: Machine booted and ready!

（中略）

==> default: Mounting shared folders...

    default: /vagrant => /Users/rojiuratech/Documents/vagrant_folder

    default: /var/www/html => /Users/rojiuratech/Documents/workspace

==> default: Machine already provisioned. Run `vagrant provision` or use the `--provision`

==> default: flag to force provisioning. Provisioners marked to run always will still run.

==> default: Running provisioner: shell...

    default: Running: inline script

==> default: Stopping httpd: 

==> default: [  OK  ]

==> default: Starting httpd: 

==> default: [

==> default:   OK  

==> default: ]

```

# 理屈はわかったけど、疑問が・・・

起動した後とはいえ、httpdを手動で再起動ではダメなのですか？！
ビジネス戦略本のエンジニア的超速まとめ

## はじめに

諸事情によりビジネス戦略本をたくさん読みました。せっかくなのでそれぞれの書籍の特徴などをまとめておきます。ただし、要点をまとめるだけならネットにいくらでも情報があるので、エンジニア視点でポイントを抜き出してみました。この手の本はエンジニア向けの本と違ってわりと漠然とした内容が多く、最終的には自分なりに解釈して深掘りする必要がありますので興味を持ったら自分で調べたり読んだりしてみてください。

---

# [マネジメント[エッセンシャル版] - 基本と原則](http://amzn.asia/5FBQKbq) 

著者：ピーター・F・ドラッカー

- 現代社会は組織社会であり組織とマネジメントは互いの存在に必要な条件である
- マネジメントの使命
    - 組織特有の使命を果たす
    - 働く人達を活かす
    - 社会貢献

```
全ての経営理論の源泉だが、必ずしもマネージャの立場で理解する必要はない。
マネジメントされる側も組織としての成果に目を向けるならマネジメントとは何かを理解しておくと良い。
出世したいなら全部読んどけ（原著ならなお良し）。

対象読者：組織で働く人
```

---

## [リーダーシップ論](http://amzn.asia/4ybocfY)

著者：ジョン・Ｐ・コッター

- リーダーシップとマネジメントの違い
    - 変化への対処と複雑さへの対処
    - リーダーシップに重要なのはビジョン、動機づけ、戦略
- ボスマネジメント（上司を上手に管理する）
- 自分のアイデアを支持させる（批判への対処）

```
コッターによると変革とイノベーションを生むものがリーダーシップである。
エンジニア的には技術を推進する上で必要なった時に読むといいかもしれない。

対象読者：開発リーダー、技術・改善の推進者、チームメンバーや後輩の指導者
```

---

## [組織行動のマネジメント](http://amzn.asia/1Mg2hc9)

著者：スティーブン P.ロビンス

- 組織行動学に基づいた体系的理論
    - 組織の中の個人
    - 組織の中の集団
    - 組織のシステム
- 動機づけ、コミュニケーション、政治力、交渉力など

```
組織は合理性だけでは動かない。人間の行動を理解することが重要。

対象読者：開発リーダー、技術・改善の推進者、チームメンバーや後輩の指導者
```

---

## [競争優位の戦略](http://amzn.asia/0jCsi7n)

著者：M.E.ポーター

- 競争優位の基本戦略
    - コスト・リーダーシップ
    - 差別化
    - 集中（コストor製品差別化）
- 価値連鎖（バリューチェーン）
- 5つの競争要因（ファイブフォース）
- 技術と競争優位
    - どの戦略でも重要な技術をもれなく洗い出して活用すべし

```
マーケティングや経営戦略の元となる重要な理論。
戦略的に技術を選択したい時に役立つ理論だが、日本語訳が読みにくい…

対象読者：チームリーダー、要件定義や製品戦略に関わる人
```

---

## [マーケティング・マネジメント](http://amzn.asia/0fA1I8D)

著者：フィリップ・コトラー＆ケビン・レーン・ケラー

- 市場セグメントとターゲット
- ブランド・ポジショニング
    - 製品と市場のライフサイクル
- 新製品の開発
    - 6つのカテゴリ（改良、変更、リポジショニング、コスト削減など）

```
マーケティングの辞典みたいなもの（全1,000ページ！）
マーケティングの戦略を理解しておくことでエンジニアの活動の幅は広がる。

対象読者：製品の企画や営業に関わる開発者、提案型エンジニア
```

---

## [ビジネス・アカウンティング](http://amzn.asia/iurFfZd)

著者：山根 節,太田 康広,村上 裕太郎

- BS、PL、CF
- 財務諸表から事業の構造や戦略を読む
    - IT系は利益率が高め
- 財務諸表分析（ソシャゲ業界など）
- 損益分岐点

```
財務諸表から競合他社の戦略が読み取れる。
新技術などの投資効果の分析にも役立つ知識。
日本人が書いているので読みやすく分かりやすい。

対象読者：競合分析、自社のコスト分析などをする人、チームリーダー・マネージャ
```

---

## [企業戦略論](http://amzn.asia/al9xEe9)

著者：ジェイ・B・バーニー

- 上（基礎編）、中（事業戦略編）、下（会社戦略編）の3冊
- VRIOフレームワークに基づく戦略論
    - VRIO…価値、稀少性、模倣困難性、組織
- ポーターの競争優位の戦略がベース
- 上：SWOT、SCP、VRIO分析
- 中：垂直統合、コスト・リーダーシップ、製品差別化、リアルオプション
- 下：提携、M&A、多角化、国際化

```
製品戦略を考える時に上・中は読んでもいいかも。

対象読者：経営者、事業マネージャ
```

---

## まとめ

- これらの書籍の多くは1970〜90年代には初版が出ている点は重要
    - 大抵の場合はエンジニアの使う理論より古い
- 技術を追求する時に必要になることはないが、技術を浸透させる時に知っておくと仕事がスムーズに進むかもしれない
- 使い方には注意
    - エンジニアの付け焼き刃でマネージャーや経営者に挑んではダメ
    - 戦略や方針の理解を深めるための知識
    - 提案の視点を広げるための知識
Homebrewを'/usr/local' 以外に管理者権限なしでインストールする

# 環境
Mac OS X El Capitan
10.11.6

# 問題
- Homebrewをインストールしたい
- このバージョンから `/usr/local` の権限周りが変更されており、[本家サイト](http://brew.sh/index_ja.html)のスクリプトでは`permission denied`となりインストールできない

# 解決案
- 方法その1
 - 下記の記事に従って、`/usr/local` の権限を再帰的に変更する。
 - [【El Capitan】Mac OSX 10.11にHomebrewインストール](http://qiita.com/aoioooii/items/c14922eede6a83a750da)

- 方法その2 (今回はこちら)
 - Homebrewを `/usr/local` 以外にインストールする。

# 手順
権限周りを再帰的に変更したときの副作用が(無いのかもしれないですが)見積もれなかったので、今回は「方法その2」を試してみました。

以下のドキュメントにある通り、に任意の場所にインストールします。
[Alternative Installs](https://github.com/Homebrew/brew/blob/master/docs/Installation.md#alternative-installs)

```shell-session
 # インストール先のディレクトリを作成
$ mkdir -p ~/my_local/homebrew && cd ~/my_local
$ curl -L https://github.com/Homebrew/brew/tarball/master | tar xz --strip 1 -C homebrew									

# .bashrcで環境変数を設定
$ vi ~/.bashrc
 ↓ brew本体は homebrew/binにいるので、そこへのパスを通す
export PATH=$HOME/my_local/homebrew/bin:$PATH
 ↓ キャッシュの保存先の指定
export HOMEBREW_CACHE=$HOME/my_local/homebrew/cache

$ source ~/.bashrc
$ brew --version
```

# おまけ (rsyncのバージョンアップ)

Macのrsyncのバージョンが2系で、リモートのEC2とrsyncすると失敗する現象が起きたので、Mac側を早速Homebrewでバージョンアップしてみます。

```shell-session							
$ brew tap homebrew/dupes && brew install rsync				
$ rsync --version
rsync  version 3.1.2				
```

以上です。
Alamofire4でJsonをPOST、ファイルを multipart/form-data でPOST

# Alamofire 4.0 で HTTP POST する

ググって出てくる Alamofire のコードは古いバージョンのものが多く出てくるので、
Alamofire 4.0 での HTTP POSTのやり方を整理しました

ハンドリングが簡単でめっちゃ使いやすいです

## JSON を POST で送信

この例ではレスポンスをJsonオブジェクトとして受け取るために.responseJSON をレスポンスハンドラーにしてます

```swift:JSONをPOSTするサンプル
let url = "http://hoge/fuga"
let headers: HTTPHeaders = [
    "name": "value"
]
let parameters: Parameters = [
    "str_param": "str value",
    "num_param": 0,
    "nested": [
        "nested_param": "value"
    ]
]

Alamofire.request(url,
                  method: .post,
                  parameters: parameters,
                  encoding: JSONEncoding.default,
                  headers: headers)
    .authenticate(user: "user", password: "password")
    .responseJSON { response in
        
        if
            let json = response.result.value as? [String: Any],
            let prop1 = json["prop1"] as? String
        {
            debugPrint(prop1)
        }
        
        debugPrint(response)
}

```

レスポンスを文字列で受け取りたい時は、.responseStringを使いましょう

レスポンスを受け取りたい型に応じてハンドラーが用意されています
https://github.com/Alamofire/Alamofire#response-handling

複数のレスポンスハンドラーをチェーンさせて使うこともできます
https://github.com/Alamofire/Alamofire#chained-response-handlers


## ファイルを multipart/form-data で POST
upload を使った場合は、request と違って送信途中の progress を取得できます
それ以外は request とほぼ同じです

ベースはJSONをPOSTする時と似た感じですが、データを送信する処理の前にファイルをエンコードした結果をコールバックで受け取る処理を挟む必要があるので、初めてだとちょっとだけわかりにくいです

```swift:multipart/form-dataでファイルをPOSTするサンプル
let fileContent = "file content as string"
let url = "http://hoge/fuga"
let headers: HTTPHeaders = [
    "name": "value"
]

Alamofire.upload(
    multipartFormData: { (multipartFormData) in
        multipartFormData.append(fileContent.data(using: String.Encoding.utf8)!,
                                     withName: "param_name",
                                     fileName: "filename",
                                     mimeType: "multipart/form-data")},
    to: url,
    headers: headers,
    encodingCompletion: { encodingResult in
        // file をエンコードした後のコールバック
        switch encodingResult {
        case .success(let upload, _, _):
            // upload は request の戻り値の DataRequest を継承したオブジェクトなので
            // request と同様にメソッドチェーンしたい項目はこの中で指定できます
            upload
            .authenticate(user: "user", password: "password")
            .uploadProgress(closure: { (progress) in
                print("Upload Progress: \(progress.fractionCompleted)")
            })
            .responseString { response in
                debugPrint(response)
            }
        case .failure(let encodingError):
            print(encodingError)
        }
    }
)

```
windowsで余計なことをさせない設定をする

## 小さな親切 余計なお世話
windowsには、普通に使う上では便利でも、場合によっては余計なお世話な機能が結構沢山備わっています。なのでそれらを停止させて、マシンに余計なことをさせたくない場合に重宝する設定をこの記事では紹介していきます。


環境はwindows10 proを想定しています。

### ユーザーアカウント制御を切る
gpedit.mscにて
コンピュータの構成\Windowsの設定\セキュリティの設定\ローカルポリシー\セキュリティオプション\ユーザーアカウント制御:管理者承認モードですべての管理者を実行する
を**無効**

### ファイアーウォールを切る
gpedit.mscにて
管理用テンプレート\ネットワーク\ネットワーク接続\Windowsファイアウォール\標準プロファイル\すべてのネットワーク接続の保護
を**無効**
管理用テンプレート\ネットワーク\ネットワーク接続\Windowsファイアウォール\ドメインプロファイル\すべてのネットワーク接続の保護
を**無効**

### 隠しファイル、拡張子を表示
エクスプローラーにて、表示 > ファイル名拡張子, 隠しファイルをオンに

### SmartScreenを切る
gpedit.mscにて
コンピュータの構成\管理用テンプレート\エクスプローラー\Windows SmartScreenの構成
を**無効**

### アップデートを切る
gpedit.mscにて
コンピュータの構成\管理用テンプレート\Windowsコンポーネント\Windows Update\自動更新を構成する
を**無効**

コンピュータの構成\管理用テンプレート\Windowsコンポーネント\Windows Update\Windows Updateのすべての機能へのアクセスを削除する
を**有効**

### 電源オプション
コントロール パネル\システムとセキュリティ\電源オプション
で高パフォーマンスかつ、スリープなどを無効化
また、カバーを閉じたときの動作を、何もしないに設定

### スクリーンセーバーを無効化
gpedit.mscにて
ユーザーの構成\管理者用テンプレート\コントロールパネル\個人用設定\スクリーンセーバーを有効にする
を**無効**

### 休止やサスペンドが解除されたときにパスワードの入力を求めないように
ユーザーの構成\管理者用テンプレート\システム\休止やサスペンドが解除されたときにパスワードの入力を求める
を**無効**

### 自動ログイン
netplwizにて、
ユーザーがこのコンピューターを使うには、ユーザー名とパスワードの入力が必要
のチェックを外す。
自動サインインのダイアログが出てくるのでパスワードを入力

### Windows Defenderを無効化
通常の設定アプリからすべてオフに
（gpedit.mscになぜか出てこない）

### 通知をオフ
gpedit.mscにて、
ユーザーの構成\管理者用テンプレート\タスクバーと[スタート]メニュー\通知\
以下の

ネットワークを使用した通知をオフにする
ロック画面のトースト通知をオフにする
通知のミラーリングをオフにする
トースト通知をオフにする

をすべて**有効**

ユーザーの構成\管理者用テンプレート\タスクバーと[スタート]メニュー\バルーン通知をオフにする

を**有効**

ユーザーの構成\管理者用テンプレート\タスクバーと[スタート]メニュー\通知とアクションセンターを削除する

を**有効**

これで本当に全部消えるんだろうか・・・？

### システムサウンドを切る
mmsys.cplから、サウンドタブ、
サウンド設定を Windows標準から、なしにする

### Windowsを使用するためのヒントやおすすめの方法を取得
設定 > 通知とアクション
にて
Windowsを使用するためのヒントやおすすめの方法を取得
を**オフ**

### ウィンドウが画面の端に移動されたとき自動的に整列されないようにします
コントロール パネル\すべてのコントロール パネル項目\コンピューターの簡単操作センター\マウスを使いやすくします
にて、
ウィンドウが画面の端に移動されたとき自動的に整列されないようにします
に**チェック**

### スタートアップ
ファイル名を指定して実行
shell:startup
にショートカットを配置

## まとめ
まったく、煩わしいものです。
まだ抜けがあるかもしれませんので、ご指摘いただけると助かります。

## （追記）まだ不安定
どうにもまだ通知を消せきれていないようです。また、設定もとても面倒臭く、解決策を模索中です。
Sublime Text 3 + KotlinでHello!

JavaをSublimeTextでコンパイルできるというのを知って、Kotlinでもできるのではと思った...

Java版はこちら
[Sublime Text3で、Javaをビルド→実行する方法](http://qiita.com/Yoshitaka0922/items/c037cbfc4e78452e88f2)

## Kotlinをインストール
Homebrewを使います
（こちらを参考に[MacにHomebrewをインストールする](http://qiita.com/_daisuke/items/d3b2477d15ed2611a058)）

```
$ brew install kotlin
```

## Kotlin用BuildSystem作成

SublimeTextのメニューから`Tools -> Build System -> new Build System...`にアクセスします

```Kotlin.sublime-build
{
    "shell_cmd": "kotlinc -script $file_name",
    "selector": "source.kts",
}
```

これを `Kotlin.sublime-build`というタイトルで保存します
保存先は`Packages/User/`です

`Tools -> Build System`に`Kotlin`ができてると思いますので選択します

## 実行

```hello.kts
println("HELLO")
```

ファイル名は`**.kts`じゃないとダメなようです

保存したら、`command+b`または`command+shift+b`で実行です

## 結果
```
HELLO
[Finished in 3.1s]
```

## 参考
[sublime text 3 + kotlin で Hello World](http://qiita.com/zonene_ozimasa/items/ca21fcaa79fadc6413e0)
http://kotlinlang.org/docs/tutorials/command-line.html
http://y-anz-m.blogspot.jp/2012/11/sublime-text-2-typescript.html

## 追記
ちょこっとKotlinをためすだけならこちらも
http://try.kotlinlang.org/#/Examples/Hello,%20world!/Simplest%20version/Simplest%20version.kt
Bluemix：簡易ETLサービスDataConnect（データ出力先としてCSVなどフラットファイルがサポートされました）

だいぶ、わかりづらいオペレーションだったので備忘録的にメモ。

DataConnectはつい先日から、フラットファイルをinput/outputとして扱えるようになりましたが、outputしたあと結局どこに出力されるのかさっぱりだったのですが、ここにありました。

ジョブを実行したあとに、Refine&Copy ---> Files --->　でcsvが見えます。


![スクリーンショット 2016-11-19 23.53.10.png](https://qiita-image-store.s3.amazonaws.com/0/119378/7b6ac3d8-41a6-d882-e1c6-3e1bce3b3576.png)

（関連記事）
http://qiita.com/azzeten/items/43643b232a93358f6bfe
ActiveAdmin | register_page で textarea を作る

レールに載せようと色々やったけどうまくいかなかった。
仕方なく render することにした。

# コード

## View

```rb:app/admin/example.rb
ActiveAdmin.register_page 'examples' do
  content do
    render partial: 'admin/examples/form'
  end
end
```

## Partial

```rb:app/vies/examples/_form.html.slim
= form_tag admin_examples_path, method: :post do
  = field_set_tag 'てきすとえりあ？' do
    = text_area_tag :query
  = submit_tag t('active_admin.views.shared.sidebar.search')
```

# 画面

![image](https://qiita-image-store.s3.amazonaws.com/0/89618/155a7e0f-1295-7440-2080-3d3b345ef6e9.png)



# 環境

- activeadmin (1.0.0.pre2 f0243d4)








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
さくらのクラウドでロードバランサを使ってみる(1)

さくらの負荷分散は2種類ありますが、今回はリージョン内で利用するロードバランサを使ってみます。
さくらのロードバランサはDSR(Direct Server Return)方式と呼ばれるものです。
仕様や利用方法などはこちらにまとまっています([ロードバランサ &ndash; さくらのサポート情報](https://help.sakura.ad.jp/hc/ja/articles/206208781-%E3%83%AD%E3%83%BC%E3%83%89%E3%83%90%E3%83%A9%E3%83%B3%E3%82%B5))。
このページに記載されている内容と実際に使ってみた上で注意点を挙げるとすれば、

- 共有セグメントへの接続は不可(必ずスイッチが必要)
- IPv6は非対応
- 作成後に冗長構成へ変更することは不可(再作成が必要)
- 障害で停止することはほとんどないが、予告されたメンテナンスで停止することがあり得るので冗長化がお勧め
- 構成によってはグローバルIPアドレスを沢山使うことになるのでスケールの最大値をちゃんと見極める

といった感じです。

今回は以下の構成で作成してみます。

- ロードバランサの利用目的はWEBサーバの負荷分散
- ロードバランサの接続先は「スイッチ+ルータ(/28)」
- プランは「標準」
- IPv4アドレスはルータに割り当てられたものから適切に利用

##ロードバランサ追加前の準備
1. ルータ+スイッチの作成
[さくらのクラウドでルータ機能を利用してみる](http://qiita.com/sato-w-m/items/2f4f2bb1c80b6e5822e7)などを参考にスイッチ+ルータを作成しておきます。

2. 負荷分散対象の実サーバ作成(※今回は後回しにします)
実サーバを必要台数分だけ用意する必要があります。
今回はweb01とweb02という2台を作成しますが、IPアドレスをきれいに割り当てたいのでロードバランサ作成完了後に追加します。
これはロードバランサにグローバルIPを割り当て終わった後に実サーバにグローバルIPを割り当てた方がIPアドレスの管理がわかりやすいと思われるからです。

##ロードバランサの追加
ロードバランサの一覧から「+追加」をクリックします。

![ロードバランサ一覧.png](https://qiita-image-store.s3.amazonaws.com/0/140995/df8420a0-867d-782b-3f3a-f2344dfce946.png)

追加画面では接続先のスイッチを選択することが必須となります。
ここではあらかじめ作成しておいた「スイッチ+ルータ」を選択します。
今回は冗長化したいので「冗長化」もはいを選択しておきます。
すると「IPv4アドレス」が#1と#2の2つ現れます。

![ロードバランサ追加.png](https://qiita-image-store.s3.amazonaws.com/0/140995/5cd9f725-78f3-7620-966b-589c68a4b4e5.png)

スイッチを選択するとIPv4アドレスなどいくつかの項目が自動的に入力されます。

![ロードバランサ追加(スイッチ選択後).png](https://qiita-image-store.s3.amazonaws.com/0/140995/07743a4a-cd52-2294-6143-f036c3aeed46.png)

「プラン」は標準を選択していますが、必要な性能に応じて選択します。
一度作成してしまうと変更出来ないので予算が許せばハイスペックの選択をお勧めします。
コストは約2倍になりますがスペック上の差はそれ以上です。

「VRID」はゾーンでユニークに設定します。VPCルータでも設定が必要なので注意しましょう。
「IPv4アドスレス」はロードバランサ自体のIPですが、実際にサービス用として利用するものではありません。
スイッチ+ルータを接続先に選択すると自動的に入力されますが、すでに他のアプライアンスやサーバに割り当て済でないかちゃんと確認しましょう。
ルータ機能がないスイッチに接続する場合は「IPv4アドレス」、「ネットマスク」、「ゲートウェイ」は自分で任意に設定することになります。
「名前」に適切な名称を入力したら「+作成」をクリックして作成します。

##作成完了
入力内容に問題がなければすぐに作成が完了します。

![ロードバランサ一覧(コピー中).png](https://qiita-image-store.s3.amazonaws.com/0/140995/6deaa06d-55f4-1cf3-25cd-36ed8e61fa94.png)

ただ、VPCルータと同じようにコピーに多少の時間がかかります。
コピー状態が終わると起動状態で利用可能になります。
利用可能になったらダブルクリックして設定を行います。

![ロードバランサ(情報).png](https://qiita-image-store.s3.amazonaws.com/0/140995/6f34a1b0-bd3b-4874-3bac-0e7aee40c176.png)

ロードバランサは情報タブに表示されているIPv4アドレスでサービスが行われるわけではなく、これから設定するVIPでサービスが行われます。

![ロードバランサ(VIP設定).png](https://qiita-image-store.s3.amazonaws.com/0/140995/ee03b33a-51af-8b43-cabf-2458132b1a2b.png)

初期状態ではVIPの設定はありません。
実際に利用するIPとしてグローバルIPを追加していきます。

次に続きます。
Xcode の文字を細くする

iTerm の設定に *Use thin strokes for anti-aliased text* というのがあって普段はこれを有効にしていて、これはアンチエイリアスなフォントがちょっと細めにほんのちょっと暗めになってなんとなく目に優しいような気がする設定でして重宝してます。

Xcode 用としては [ThinStrokes](https://github.com/liscio/ThinStrokes/) っていうプラグインがあってこれまた重宝してましたが、ご存知のように Xcode8 からはプラグインまわりの環境が変わってかったるいので手を出していませんでした。

他に手段がないかなあと調べてみたら、Mac のシステム環境設定にある *使用可能な場合は LCD で滑らかな文字を使用* をオフにするといい感じになるということがわかりました。

だがしかし、この状態だとブラウザの背景の白とかがなんかめっちゃ輝きをはなってるみたいで目に痛いし激しく見にくくなるので特定のアプリだけで設定したいなと思ってたら `defaults` コマンドで普通に設定できました。

```sh
$ defaults write -app Xcode AppleFontSmoothing -int 0
```

しばらくこれで開発してますがなかなかいい感じです！多分 Xcode 以外にも普通にいけるんじゃ。

最後に、あんまわかりやすくないけど変更前後のスクショです。

|![スクリーンショット 2016-11-22 9.32.26 2.png](https://qiita-image-store.s3.amazonaws.com/0/3336/341b8bc4-a538-4102-5d52-f4ef079218cb.png "スクリーンショット 2016-11-22 9.32.26 2.png")|
|:---|
|▲ 変更前（左上）変更後（右下）|
MySQLのデータベース名にハイフンやバッククォート databaseを使用する方法

MySQLでデータベースを作成する際に `create database` を使用して作成していますが
データベース名にハイフンやバッククォートが含まれていたり、databaseという名前では作成出来なかったため、やり方を調べてみました。

## create databaseでの作成
まずは普通にデータベース名testを作成してみます。

```
mysql> create database test;
Query OK, 1 row affected (0.00 sec)
```

データベース名databaseで作成です。

```
mysql> create database database;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'database' at line 1
```

ハイフンとバッククォートが含まれているデータベース名です。

```
mysql> create database test-test;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '-test' at line 1

mysql> create database test`test;
    `>
```

## バッククォートを使用して作成
データベース名がdatabaseやハイフンなどが含まれる場合、バッククォートで囲むことで作成出来ます。

```
mysql> create database `database`;
Query OK, 1 row affected (0.00 sec)

mysql> create database `test-test@^`;
Query OK, 1 row affected (0.00 sec)
```

## バッククォートをデータベース名に入れたい場合
上記の通りバッククォートで囲むだけでは作成出来ませんでした。

```
mysql> create database `test``;
    `>
```

バッククォートを含めたい場合はバッククォートで囲み、その中にバッククォート2つ入れることで作成出来ました。

```
mysql> create database `test```;
Query OK, 1 row affected (0.00 sec)

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| test`              |
+--------------------+
```

## バックスラッシュをデータベース名に入れたい場合
バックスラッシュを入れる場合もバッククォートで囲んだだけでは作成出来ませんでした。

```
mysql> create database `test\`;
    `>

mysql> create database `test\/`;
Query OK, 1 row affected (0.00 sec)

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| test\/             |
+--------------------+
```
AssetDatabaseを使用してパッキングタグのあるテクスチャだけ列挙　メモ

下記ページを参考（助かりました）。
http://qiita.com/T_2/items/bbd03ad320fbc03595af

```
    [MenuItem("Assets/GetPackingAsset")]
    public static void GetPackingAsset()
    {
        var guids = AssetDatabase.FindAssets("t:texture2D", null);
        foreach (var guid in guids)
        {
            string path = AssetDatabase.GUIDToAssetPath(guid);
            var textureImporter = AssetImporter.GetAtPath(path) as TextureImporter;
            if (textureImporter != null)
            {
                if(textureImporter.spritePackingTag != "")
                {
                    Debug.Log("assetPath=" + textureImporter.assetPath);
                    Debug.Log("spritePackingTag=" + textureImporter.spritePackingTag);
                }
            }
        }
    }
```
Sugar.jsで翌日のDateオブジェクトを産む

# できなかった(そらそうよ)

```JavaScript
// 今日は11/24だよ。
var today = new Sugar.Date();
var tomorrow = today.addDays(1);

console.log(today.format("{M}/{d}")); // 11/25
console.log(tommorow.format("{M}/{d}")); // 11/25
```

※おっさんは何故かDateオブジェクトをオブジェクトじゃないと脳が誤解してる。


# できた(そらそうよ)

```JavaScript
// 今日は11/24だよ。
var today = new Sugar.Date();
var tomorrow = today.clone().addDays(1);

console.log(today.format("{M}/{d}")); // 11/24
console.log(tommorow.format("{M}/{d}")); // 11/25
```
npmの使い方

# -gオプションについて
-gをつけるとグローバルに配置

# よく使うコマンド
## インストール、アンインストール(実行する前に↓も先に読んで！)
```
npm install パッケージ
npm uninstall パッケージ

npm install -g パッケージ
npm uninstall -g パッケージ
```

## 管理ファイル(package.json)の作成
```
npm init
```

## package.jsonに追加しつつ、インストール
```
npm install パッケージ --save-dev
```

## package.jsonに記載されているパッケージをインストール
```
npm install
```

## インストール済みリストの確認
```
npm list
npm list -g
```

# package.jsonについて(まだちゃんとまとめてない)
```
{
  "name": "プロジェクト名",
  "version": "1.0.0",
  "description": "",
  "author": "",
  "license": "ISC",
  "devDependencies": {
    "babel": "^6.5.2",
    "babel-core": "^6.10.4",
    "babel-polyfill": "^6.9.1",
    "babel-preset-es2015": "^6.9.0",
    "babel-preset-react": "^6.11.1",
    "babelify": "^7.3.0",
    "browserify": "^13.0.1",
    "glob": "^7.0.5",
    "gulp": "^3.9.1",
    "gulp-util": "^3.0.7",
    "react": "^15.2.1",
    "react-dom": "^15.2.1",
    "vinyl-source-stream": "^1.1.0"
  }
}
```
npm(Node.js) インストール メモ

# 公式からファイルを落としてくる
https://nodejs.org/ja/
https://nodejs.org/ja/download/

## wgetで
```
wget https://nodejs.org/dist/v7.2.0/node-v7.2.0-linux-x64.tar.xz
```

※20161129時点でのLambdaを動かしたい場合は4.3をインスコ

```
https://nodejs.org/dist/v4.3.2/node-v4.3.2-linux-x64.tar.xz
```

# インストール
```lang:解凍
tar Jxfv node-v7.2.0-linux-x64.tar.xz
```

```lang:配置
chmod 777 node-v7.2.0-linux-x64
mv node-v7.2.0-linux-x64 /usr/bin/node-v7.2.0-linux-x64
```

```lang:シンボリックリンク作成(Version変えたくなった時用)
ln -s /usr/bin/node-v7.2.0-linux-x64 /usr/bin/node
```

```lang:PATH設定(rootで)
touch /etc/profile.d/node.sh

cat << EOS >> /etc/profile.d/node.sh
export NODE_HOME=/usr/bin/node
export NODE_PATH=$NODE_HOME/lib/node_modules
export PATH=$NODE_HOME/bin:$PATH
EOS

source /etc/profile
```

```lang:確認
node -v
npm -v
```

# npmのバージョンを上げる

```
npm install -g npm
```