さくらVPS CentOS 7でMongoDBを試してみる手順書2

さくらVPSにMongoDB ver3.4を試しにインストールしてみた際の手順書1
さくらVPSにMongoDB ver3.4を試しにインストールしてみた際の手順書2

さくらVPSにMongoDB ver3.4を試しにインストールしてみた際の手順書1のつづきです。

  1. 前提
  2. MongoDBのインストール
  3. MongoDBの起動と終了
  4. MongoDBを動かしてみる ☆今回
  5. MongoDBをNode.jsから呼び出してみる

4. MongoDBを動かしてみる ☆今回

4.1. MongoDBを動かす前の最低限の知識 - MongoDBのレコードは、JSON記法に似たドキュメント
- ドキュメントは、フィールド名とその値で構成(例:"name" : "hogehoge")
- ドキュメントにはarrayも含めることが可能
- SQLの基本操作で言うところのSelectがFind、DeleteがRemove

4.2. MongoDB Shellにテストデータを取り込む

ダウンロード用のディレクトリを作成し、
その中に公式ドキュメントで用意されている、テストデータをダウンロードします。

$cd ~
$mkdir downloads
$curl https://raw.githubusercontent.com/mongodb/docs-assets/primer-dataset/primer-dataset.json > ~/downloads/primer-dataset.json

/home/hogehoge/downloads/primer-dataset.jsonが作成されました。

中身を確認すると、{}で囲まれたとても長いファイルであることが確認できます。

内容は、たくさんのレストランの情報です。

$ tail -n 5 ~/downloads/primer-dataset.json ★後ろから5行分を表示
(以下表示内容)

{"address": {"building": "971", "coord": [-73.964618, 40.801388], "street": "Ams
terdam Ave", "zipcode": "10025"}, "borough": "Manhattan", "cuisine": "Other", "g
rades": [], "name": "Subway", "restaurant_id": "50018987"}                      
{"address": {"building": "325", "coord": [-73.99514429999999, 40.7521509], "stre
et": "W 33Rd St", "zipcode": "10001"}, "borough": "Manhattan", "cuisine": "Other
", "grades": [], "name": "Fairfield Inn Suites Penn Station", "restaurant_id": "
50018989"}                                                                      
{"address": {"building": "399", "coord": [-73.906438, 40.669367], "street": "Mot
her Gaston Blvd", "zipcode": "11212"}, "borough": "Brooklyn", "cuisine": "Other"
, "grades": [], "name": "", "restaurant_id": "50018993"}                        
{"address": {"building": "461", "coord": [-74.138492, 40.631136], "street": "Por
t Richmond Ave", "zipcode": "10302"}, "borough": "Staten Island", "cuisine": "Ot
her", "grades": [], "name": "Indian Oven", "restaurant_id": "50018994"}         
{"address": {"building": "921", "coord": [-73.9691347, 40.6389857], "street": "C
ortelyou Rd", "zipcode": "11218"}, "borough": "Brooklyn", "cuisine": "Other", "g
rades": [], "name": "Cold Press'D", "restaurant_id": "50018995"}     

このレストランのテストデータをmongodbにインポートします。
まず、MongoDBを起動します。

$sudo service mongod start

データをMongoDBにインポートします。

$ mongoimport --db test --collection restaurants --drop --file ~/download/primer-dataset.json
2017-01-17T14:40:14.567+0900    connected to: localhost
2017-01-17T14:40:14.568+0900    dropping: test.restaurants
2017-01-17T14:40:16.155+0900    imported 25359 documents

mongoimportコマンドは、読み込みが可能な規則で書かれたJSON(MongoDB用に拡張したJSONを含む)、CSV、TSVファイルを取り込むコマンドです。

MongoDBの構造はDBに紐づくCollectionにJSONのようなデータが格納されていますが、
DB
.Collection
.Document
.Document
.Document
.Document
.Collection
.Document
DB
.Collection
.Document

上記のimportコマンドでは、testというDBのrestaurantsというCollectionに取り込みを行いました。
Collectionは、RDBで言うところのTableに似た単位となります。

4.3. MongoDB Shell(mongo)の起動と終了 MongoDBを操作するのには、mongoというシェルを使います。
mongoにコマンドを打ち込むことでMongoDBを操作します。

mongoを起動します。

$mongo

すると、カーソルの一番左が「 > 」になり、mongoシェルが起動したことがわかります。

mongoシェルを終了するには、

Ctrl + C

を押下します。

4.4. Find mongoを再度起動します。

$mongo

「test」という名前がついたDBに移動します。

>use test

先程レストランのテストデータを取り込んだrestaurants Collectionから、borought(区)がManhattanのレストランを探します。

>db.restaurants.find( { "borough" : "Manhattan" } )

(とても見にくいが、よく見るとboroughがManhattanのDocumentが出力)

4.5. Insert

restaurants Collectionに、港区にあるレストランhogehogeを追加します。

> db.restaurants.insert( { "name" : "hogehoge", "borough" : "Minato-Ku" } )
WriteResult({ "nInserted" : 1 })  

Findを使って、Insertが完了したかを調べてみます。
港区で検索してみます。

> db.restaurants.find({"borough" : "Minato-Ku"})
{ "_id" : ObjectId("587db78e08cd7086ba0d6a33"), "name" : "hogehoge", "borough" : "Minato-Ku" }

ANDやOR等を使った検索はここでは扱いません。

4.6. Update

港区にあったレストランhogehogeをレストランfugaに改名させます。

>db.restaurants.update({"name":"hogehoge"},{$set:{"name":"fuga"}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

4.7. Remove

レストランfugaは日本のレストランなので、このCollectionにあるのは間違っています。 fugaレストランのデータを削除します。

>db.restaurants.remove({"name":"fuga"})

以上がMongoDBの最低限の一番簡単な触りの操作です。

もう少し詳しいチュートリアルのためには、例えば公式ドキュメントがあります。

JavascriptのUnexpected token : { の例

var hoge = 1;

If (hoge === 1 ){
  fnc();
}

これで If (hoge === 1 ){この部分の{にUnexpected tokenエラーがでる。

お分りいただけただろうか・・・

原因:Javascriptのifのiは小文字です。

本当にくだらないとです。 何時間無駄にしたか分りません。 私みたいな残念な人は少ないとは思いますが、同じ悲しみを背負わないように書き記します。

ifを小文字で書いてしまう理由ですが、VBAが原因だと思い当たりました。 最近まで仕事でVBAを使っていたのですが、なにかと大文字始まりです。

みても全く違和感がないので、なかなか私は気づきません。

VBAバージョン

DIm hoge As Long

If hoge = 1 Then
  fnc
End If

VBAの経験があってJavascriptを触る方は、他にもNewやらElse、比較演算子について気をつけなければいけません。 そもそもセミコロンがないところからもう・・・ VBAを触っていた頃から思っていましたが、なぜこうVBAは、なぜこうもはっちゃけた文法をしているのでしょうか。 他のメジャーな言語に寄せることは難しかったのでしょうか・・・ もしくは、ExcelJavascriptをOKにして、APIの形でExcelやらのオブジェクトを扱えるようにしてもいいのではないでしょうか。

軽くググってみたところ、COBOLも大文字ですね。というか、見つけた例は全部大文字で書かれていましたが、COBOLは小文字を書いてはいけないのでしょうか・・・

と思って調べたら、大文字と小文字の区別がなく、昔の慣習で大文字で全てコーディングする人が多いということでした。

思い返すと、ダラダラコードを眺めてミスを見つけようとしていたのが悪かったと思っています。 そのせいで無駄に時間が流れました。 次回からは、しっかり別ファイル作って切り分けを行うなどして、もっと早く見つけられるようにします。

最高に勿体無い時間でしたが、きっと成長に繋がったと信じています。 はぁ

ちなみに、Unexpected token は、「なんか理解できないのが急に出て来てるよ」ということみたいです。 分りにくい原因でよくあるのが、大文字が文字列以外の場所に混じっているパターンみたいです。 次回このエラーが出た際には、全角スペース、やエラーで表示された記号や文字列の全角文字は検索するようにしようと思います。

さくらVPS CentOS 7でMongoDBを試してみる手順書1

さくらVPSにMongoDB ver3.4を試しにインストールしてみた際の手順書です。

インストールはMongoDB ver3.4の公式ドキュメントが参考になっています。

  1. 前提
  2. MongoDBのインストール ☆今回
  3. MongoDBの起動と終了 ☆今回
  4. MongoDBを動かしてみる
  5. MongoDBをNode.jsから呼び出してみる

0. 前提

  • さくらVPSの標準OS CentOS 7を使用
  • ユーザhogehogeで操作
  • SELinuxは停止済み

1. MongoDBのインストール

1.1. yumのためのrepoファイルを作成
yum:
パッケージを管理するシステムです。パッケージは、アプリケーションのためのファイルの集まりのことです。yumを使ってアプリケーションのインストールやアップデート等を行うことができます。

yumでインストールできるソフトウェアがWEB上のリポジトリに登録されています。
MongoDBについては、repoファイルを指定の場所に追加してあげることでMongoDBもyumを使ってインストールができるようにします。

$sudo touch /etc/yum.repos.d/mongodb-org-3.4.repo

作成したrepoファイルを編集します。

sudo vim /etc/yum.repos.d/mongodb-org-3.4.repo

以下のように編集します。

[mongodb-org-3.4]
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/3.4/x86_64/
gpgcheck=1
enabled=1
gpgkey=https://www.mongodb.org/static/pgp/server-3.4.asc

vimの上書き保存と終了は、コマンドモードで:wqです。

1.2. MongoDBのインストール

yumを使用してMongoDBと関連ツールをインストールします。

sudo yum install -y mongodb-org

2. MongoDBの起動と終了

MongoDBを起動してみます。

$sudo service mongod start

MongoDBが正しく起動できたかは、ログファイルで確認できます。
今回は、最新の5行分ログを見てみます。

$sudo tail -n 10 /var/log/mongodb/mongod.log
(以下表示結果)

2017-01-17T12:45:20.302+0900 I INDEX    [initandlisten] build index on: admin.sy
stem.version properties: { v: 2, key: { version: 1 }, name: "incompatible_with_v
ersion_32", ns: "admin.system.version" }                                        
2017-01-17T12:45:20.302+0900 I INDEX    [initandlisten]          building index 
using bulk method; build may temporarily use up to 500 megabytes of RAM         
2017-01-17T12:45:20.304+0900 I INDEX    [initandlisten] build index done.  scann
ed 0 total records. 0 secs                                                      
2017-01-17T12:45:20.304+0900 I COMMAND  [initandlisten] setting featureCompatibi
lityVersion to 3.4                                                              
2017-01-17T12:45:20.305+0900 I NETWORK  [thread1] waiting for connections on por
t 27017

ログの最後の行を見てみると、27017番のポートでMongoDBが受け付けていることがわかります。

デフォルトでは27017番ポートが設定されています。
変更したい場合は、/etc/mongod.confファイルを編集してください。

MongoDBを停止します。
$sudo service mongod stop

さくらVPS CentOS 7 Node.jsのサンプルページを公開してみる手引 その3

さくらVPS CentOS 7 Node.jsのサンプルページを公開してみる手引 その1

さくらVPS CentOS 7 Node.jsのサンプルページを公開してみる手引 その2

さくらVPS CentOS 7 Node.jsのサンプルページを公開してみる手引 その3

作業全体図

  1. 前提
  2. さくらVPSの初期設定
  3. ポート開放
  4. node.jsをインストール
  5. 一番簡単なサンプルサーバの作成 ☆ここ

前回までで、さくらVPS CentOS 7 環境に、node.jsをインストールすることができました。

今回は、hogehogeユーザのホームディレクトリ(/home/hogehoge)に、myappディレクトリを作成し、そこでExpressのチュートリアルの通りに簡単なサーバを作成します。

コマンドやコードの内容はほぼExpressjs.comのとおりとなっています。

より単純にわかりやすく変えてあります。

4. 一番簡単なサンプルサーバの作成

4.1. ディレクトリの作成

hogehogeユーザでホームディレクトリに移動します。

$cd ~

myappディレクトリを作成し、作成したmyappディレクトリに移動します。

$mkdir myapp
$cd myapp

4.2. プロジェクトの設定

プロジェクトの初期設定を行います。

$npm init

いくつも質問されますが、全てEnterキーを押してください。

次に、node.jsの一番普及しているフレームワークであるexpressをプロジェクトにインストールします。

npm install express

4.3. Hello worldのコーディング

index.jsファイルを作成します。

$touch index.js

作成したindex.jsにコーディングを行います。 今回は、コーディングの量も多くないため、vimを使用します。

vimの最低限の入力についてはさくらVPS CentOS7の最低限のvi操作を参照してください。

$vim index.js

以下をindex.jsに入力してください。

    var express = require('express');
    var app = express();
    
    app.get('/', function(req,res){
      res.send('Hello World!!');
    });
    
    app.listen(3000, function(){
      console.log('Example app listening on port 3000!!');
    });

上書き保存と終了はvi(vim)のコマンドモードで

:wq

です。

4.3. 動かしてみる

さくらVPSipアドレスを先に確認しておきます。

$ifconfig
(以下実行結果)
eth0: flags....................................
      inet ***.***.***.*** netmask ..................

(以下略)

eth0の欄にある、inetの値を確認しておいてください。

作成したindex.jsを起動します。

$node index.js

お手元のスマホやパソコンでブラウザを開き、サンプルページにアクセスします。

アドレスは

http://(確認したipアドレス):3000/

です。

Hello World!!と表示されるかと思います。

終わりに

実行していると、コンソールが使えないと思います。 Ctrl + C同時押しで停止することができます。

今回作成したのはサンプルページなので、動かした後は必ず止めてください。

また、3000番ポートを開放しましたが、セキュリティ上あまりいいことではありません。 テストの必要がなくなりましたら、ポートを閉じてください。

(適宜sudoを先頭につける)
$firewall-cmd --remove-port=3000/tcp
success
$firewall-cmd --permanent --remove-port=3000/tcp
success

加えて、今回はHelloWorldページをWeb上から閲覧可能な状態にしましたが、より進んだサンプルページで同じことをするのは大変危険な場合があります。

さくらVPS CentOS 7 Node.jsのサンプルページを公開してみる手引 その2

さくらVPS CentOS 7 Node.jsのサンプルページを公開してみる手引 その1

さくらVPS CentOS 7 Node.jsのサンプルページを公開してみる手引 その2

さくらVPS CentOS 7 Node.jsのサンプルページを公開してみる手引 その3

作業全体図

  1. 前提
  2. さくらVPSの初期設定
  3. ポート開放 ☆ここ
  4. node.jsをインストール ☆ここ
  5. 一番簡単なサンプルサーバの作成

2. ポート開放

※rootユーザでの作業を行わない場合は、適宜コマンドのはじめにsudoを付け加えてください。

3000番ポートをnode.jsのサンプルページ用に解放します。 そのために、CentOS7のfirewallを設定します。

2.1. ポートの現状確認

$firewall-cmd --list-services
dhcpv6-client ★IPv6に必要なサービスが許可されています

$firewall-cmd --list-ports
33331/tcp ★[1.4.](http://noboreni.hatenablog.com/entry/2017/01/16/180753)で設定したssh用ポートが解放されています

2.2. 3000番ポート解放

3000番ポートを開放します。

$firewall-cmd --add-port=3000/tcp
success
$firewall-cmd --permanent --add-port=3000/tcp
success

このコマンドでは、再起動後も3000番ポートが解放され続ける設定となります。 ページを公開する必要がなくなった場合には、ポートは閉じてください。

$firewall-cmd --remove-port=3000/tcp
success
$firewall-cmd --permanent --remove-port=3000/tcp
success
$firewall-cmd --list-ports
33331/tcp ★ssh用のポートのみ解放

3. node.jsをインストール

node.jsのバージョンを管理するnvmをインストールし、nvmを使ってnode.jsをインストールします。

ここでは、hogehogeユーザのホームにnvmをインストールを行います。

hogehogeユーザでログインしていない場合は、hogehogeユーザに変更してください。

su hogehoge

3.1. nvmのインストール

nvmでは、インストール用のスクリプトを用意していますので、それを使用します。

curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.0/install.sh | bash

curl:HTTPで対象のコンテンツを取得する うまくいかない場合、最新のurlをgithubで確認してください。

結果、hogehogeユーザのホームディレクトリ(/home/hogehoge)に、.nvmというディレクトリが作成されます。

$cd ~ ★hogehogeユーザのホームディレクトリに移動
$ls -la
(.nvmが存在することが確認できます)

bashの設定ファイルを更新します。

$ source ~/.bashrc

nvmのインストールを確認します。

$nvm --version
0.33.0

3.2. node.jsのインストール

ここでは、特に指定をせずに、最新バージョンをインストールします。

$nvm install node

もし、安定バージョンをインストールしたい場合は、

$nvm install stable

としてください。

もし、後々別のバージョンにしたい場合も、nvmを使えば簡単に変更や管理ができますので、ここではどちらでもよいとおもいます 。

さくらVPS CentOS 7 Node.jsのサンプルページを公開してみる手引 その1

さくらVPS CentOS 7 Node.jsのサンプルページを公開してみる手引 その1

さくらVPS CentOS 7 Node.jsのサンプルページを公開してみる手引 その2

さくらVPS CentOS 7 Node.jsのサンプルページを公開してみる手引 その3

さくらVPSを使用して、Node.jsと、フレームワークのExpressを使用した一番簡単なHelloWorldページを作成する手順書です。 初心者がつまずかないで走りきることを第一目標としています。 また、実際にipアドレスを使って別端末からアクセスできることを確認することで、イメージを掴みます。

注意として、DB等が絡んだより複雑なサンプルページなどを本記事で行ったように公開することはより危険です。 「どんなアクセスに対してもHello Worldを返すページを一時的に公開し、確認した後は開放したポートまで閉じる」のは安全だろう、と考えています。 sshへの接続についても、サーバの一時公開を目的としているため、パスワード認証を許可しています。 本格的な使用にあたっては、公開鍵認証の使用とパスワード認証の禁止をおすすめします。

作業全体図

  1. 前提 ☆ここ
  2. さくらVPSの初期設定 ☆ここ
  3. ポート開放
  4. node.jsをインストール
  5. 一番簡単なサンプルサーバの作成

0. 前提

  • さくらVPSに申し込みが完了している
  • 標準OSの CentOS7 x86_64でOSをインストール済み
  • さくらVPSのコンソールからログイン済み

1. さくらVPSの初期設定

1.1. CentOS のアップデート

$yum update -y

-y : すべての確認にyesで返答するオプション

1.2. ユーザの追加

ユーザの追加

$useradd hogehoge

※hogehoge : 好きなユーザ名

追加したユーザのパスワードの設定

$passwd hogehoge

sudoコマンドが使えるwheelグループにユーザhogehogeを追加する

usermod -G wheel hogehoge

1.3. SELinuxをOFFにする
SELinuxとは

※2016.1.16現在、SELinuxはデフォルトで無効になっているようです Linuxのセキュリティを強化してくれる機能です。 設定が大変みたいなので、一旦OFFにします。

現在のSELinuxの状態を確認

$getenforce

enforcing : SELinuxがON

permissive : SELinuxによるアクセス制限は無効

disable : SELinuxがOFF

SELinuxがONだった場合にはOFFに変更

$setenforce 0

VPSを再起動したときもSELinuxがONにならないように設定

$ vi /etc/sysconfig/selinux

~中略~
SELINUX=enforcing ★こうなっていた場合は
SELINUX=disabled ★このように治す
~中略~

※viの操作については さくらVPS CentOS7の最低限のvi操作

1.3. SSHのポート設定

SSHがデフォルトで使用するポート番号は22番ですが、 セキュリティのため、33000番~60999番の間の適当な番号に変更します。

今回は33331番でSSHのポート番号を設定します。

設定ファイルを編集します。

$vi /etc/ssh/sshd_config

~中略~
#Port 22 ★コメントアウトされたポートを
Port 33331 ★このように修正⇒SSHのポート変更
~中略~
#Protocol 2 ☆コメントアウトされた行を
Protocol 2 ☆有効化⇒SSHの新しいプロトコルのみ許可
~中略~
#PermitEmptyPasswords no ◆コメントアウトされた行を
PermitEmptyPasswords no ◆有効化⇒パスワードなしでのログインを無効化
~中略~
1.4. ファイアーウォールの設定

行うことは以下の2つです 1.4.1. SSHの標準ポート22番を閉じる 1.4.2. SSHの新しいポート33331番を開く

1.4.1. SSHの標準ポート22番を閉じる

$firewall-cmd --remove-service=ssh

$firewall-cmd --permanent --remove-service=ssh

1.4.2. SSHの新しいポート33331番を開く

$firewall-cmd --add-port=33331/tcp

$firewall-cmd --permanent --add-port=33331/tcp

設定を確認します

$firewall-cmd --list-services
dhcpv6-client
$firewall-cmd --list-ports
33331/tcp
1.5. 言語jの設定

localectl set-locale LANG=ja_JP.utf8

上記のコマンド後、設定結果を確認します。

$localectl
  SystemLocale: LANG=ja_JP.utf8
  VC Keymap: jp106
  X11 Layout:jp
1.6. 外部からのssh接続確認

今まで、ブラウザでさくらVPSのコントロールパネルにあるコンソールを使用していたと思います。 ここで、ssh接続の確認を兼ねて、外部からVPSに接続を試してみます。 Windowsでの操作を想定して、TeraTermを使用します。 1.6.1. TeraTermをインストールしてください。

1.6.2. さくらVPSのコントロールパネルの「ネットワーク情報」のIPv4の「アドレス」欄を確認

1.6.3. TeraTermを開き、   ホスト:1.6.2.で確認したIPアドレス   サービス:SSH   TCPポート:33331   SSHバージョン:SSH2   プロトコル:UNSPEC   としてOK    1.6.4. 1.2.で新規追加したユーザ名とパスワードでログイン

以上で、最低限のCentOS7の初期設定は終了です。

考慮漏れや改善案等ございましたら、 ぜひコメントください。

さくらVPS CentOS7の最低限のvi操作

さくらVPS CentOS7の最低限のvi操作について

・困ったらEsc ・コマンドモードと、編集モードを意識する

想定:

  • さくらVPSのCentOS7をいじるのに、今までviを触ったことがない人が最低限の操作を行う

  • 編集モードでカーソルキーで移動できるviを対象(さくらvps CentOS7のvi)

目標:

  • 設定ファイルの一連の更新ができる

  • よくわからなくなったときに、viから脱出できる

  • ファイルを開く

$vi 開きたいファイルパス

・ファイルパスについて、途中まで入力してTabキーを押すと、入力が楽にできます

  1. 編集モードに移行する

キーボードIキー

開いた直後は、コマンドモードです。

コマンドモードはファイルを編集することができません。 Iキーを押すと、下に、「-- INSERT--」が表示されます。

  1. ファイルを編集する

メモ帳の要領で編集できます。

  1. コマンドモードに移行する

キーボードEscキー

編集モードから、上書き保存やviを終了することができません。 一度コマンドモードに戻る必要があります。

  1. 上書き保存

コマンドモードで

:w

でEnterキー

  1. ファイルを閉じる

コマンドモードで

:q

でEnterキー

もしくは、上書き保存をしつつファイルを閉じるには

:wq

でEnterキー

以上で終了です。

以下は編集中によくわからなくなってしまった場合です。

  1. 間違えて消してはいけない行を消してしまった

上書き保存をしていなければ

キーボードEscキー

でコマンドモードに移行する動作を行った後、

:q!

でEnterキー

で、保存をせずにviを終了してください。

その後、再度開くことで、再度編集することができます。

  1. なんかviが終了できない

キーボードEscキー

を2回くらい連打した後、

:q!

でEnterキー で保存せずにviを終了することができます

以上が本当に最低限かつ一番簡単なviの操作です。

「なんでモードが別れてるの!?」と思うのですが、

viを慣れた手つきで触れるとカッコイイですよね。

viを拡張したvimというエディタがありますが、

vimを使いこなすと、vimmerなる称号が手に入り、

もれなくデキるプログラマっぽく見えるようになるらしいです。

以下、viやvimのより詳しい操作方法の参考例

vi入門 http://www.onetwo.jp/proginfo/pub/unix/vi.htm

名無しのvim使い http://nanasi.jp/