数学やプログラミングや映画など

新米SEがwebと数学と映画についてつらつら書きたいブログです。

ランサーズでタスクを(半)自動化した話【体験談】

クラウドソーシングサービス「ランサーズ」で、作業を(半)自動化した話です。

クラウドソーシングなら日本最大級の「ランサーズ」


他のランサーズの記事の続きなので、良ければこちらもどうぞ。

  ↓ ↓ ↓

math-it.hatenablog.com

math-it.hatenablog.com

概要

前回までの記事でタスクをひたすらこなしましたが、さすがに億劫になってきたので自動化しました。

対象のタスクは 検索結果の調査 で yahoo とか google で特定キーワードで検索した際、特定順位のURLかタイトルを取ってきてほしい、
というタスクです。

このタスクを行うのに、ブラウザでぽちぽちするのがものすごいめんどくさいので自動化する方法についてまとめました。

検索結果調査のタスクについて

検索結果調査のタスクは具体的に以下のような作業であることがほとんどです。

  • . ブラウザで yahoo か google のトップページを開く
  • . 特定キーワード で検索する
  • . 検索結果で 特定順位の Webサイトのタイトル、もしくはURLをメモする
  • . 2. と3. を10~20件ぐらい繰り返して、まとめて報告する

通信環境やPCのスペックにもよりますが、タスク1件こなすのに4分程度かかります。
それに対して支払われる報酬は5~10円程度です。

時給に換算すると75~150円程度であり、さすがに面倒です。
また、作業中は常にポチポチマウスとキーボードを操作しなくてはいけないので、他の作業を平行して行うことができません。

そこで私は楽して稼げるとはいえ、さすがに面倒で飽きるな、と思いました。
ここで考えたのが、何とかこの作業を自動化して他のタスクや作業と並行してこの検索結果調査の作業を行えないか、ということです。

自動化するのに利用したツール

タスクを提示する側の条件として、実際にブラウザを使って行え、という事が明記されていることが多くあります。
そこで、今回はブラウザを自動操作することでタスクの自動化を図ります。

ツールは以下を用いました。

Pythonは世に広く知られたプログラミング言語です。基本的にこの言語で自動化ツールを作成します。
Seleniumはブラウザの自動操作に用いられるツールです。Python用のSeleniumライブラリが公開されているのでこれを用います。
Chromedriver は Selenium を通して GoogleChromeブラウザ を操作するのに使います。

準備

まず、必要ツールを手元のPCにインストールします。

Pythonのインストールは以下のサイトから行います。
Downloads → Windows から 3.X.X 系のPythonを選んでダウンロード、インストールしましょう。

Welcome to Python.org

Pythonのインストールが終わったら、Seleniumライブラリのインストールをします。

コマンドプロンプトPowerShellを起動して以下のコマンドを実行します。

pip install selenium

最後にChromedriverのダウンロードをします。ダウンロードは以下のサイトから行います。
Google Chrome Driver の右にあるバージョンをクリックするとダウンロードページに飛べるので、自分のPCのOSに合わせたものをダウンロードします。

http://www.seleniumhq.org/download/

ここまでで準備は完了です。

スクリプトを作成する

はい、以下のスクリプトを作成しました。

import os
import time
import sys
import csv
from selenium import webdriver

DRIVER_PATH = os.path.join(os.path.dirname(__file__), 'chromedriver')

TARGETLIST = csv.reader(open("./target.csv"))

REQ = sys.argv[1]
ENGINE = sys.argv[2]
RANK = sys.argv[3]

if ENGINE == "google":
	URL = "http://www.google.com"
	SFORM = "q"
if ENGINE == "yahoo":
	URL = "http://www.yahoo.co.jp"
	SFORM = "p"
	NEXTXPATH = "//*[@id='Sp1']/p/a[1]"
if __name__ == '__main__':
	try:
		browser = webdriver.Chrome(DRIVER_PATH)
		browser.get(URL)
		browser.implicitly_wait(10)
		for TARGET in TARGETLIST:
			print(TARGET[0])
			if RANK == "des":
				[NUMBER, WORD] = TARGET[0].split("\t")
				if int(NUMBER) > 10:
					NEXT = 1
					PAGE = int(NUMBER)//10
					if ENGINE == "google":
						NEXTXPATH = "//*[@id='nav']/tbody/tr/td["+str(int(PAGE)+1)+"]/a"
					if ENGINE == "yahoo":
						NEXTXPATH = "//*[@id='Sp1']/p/a["+str(int(PAGE)-1)+"]"
					NUMBER = str(int(NUMBER) % 10)
				else: 
					NEXT = 0
			else:
				[NUMBER, WORD] = [str(1), TARGET[0]]
				NEXT = 0
			search_input = browser.find_element_by_name(SFORM)
			search_input.clear()
			search_input.send_keys(WORD)
			search_input.submit()
			browser.implicitly_wait(10)

			if NEXT == 1:
				browser.find_element_by_xpath(NEXTXPATH).click()
				browser.implicitly_wait(10)

			if ENGINE == "google":
				TAGT = browser.find_elements_by_xpath("//*[@id='rso']/div/div/div["+NUMBER+"]/div/div/h3")
				TAGL = browser.find_elements_by_xpath("//*[@id='rso']/div/div/div["+NUMBER+"]/div/div/h3/a")
			if ENGINE == "yahoo":
				TAGT = browser.find_elements_by_xpath("//*[@id='WS2m']/div["+NUMBER+"]/div[1]/h3/a")
				TAGL = browser.find_elements_by_xpath("//*[@id='WS2m']/div["+NUMBER+"]/div[1]/h3/a")

			if REQ == "title":
				print(TAGT[0].text)
			if REQ == "url":
				print(TAGL[0].get_attribute('href'))
	finally:
		browser.quit()

これを check.py という名前でChromedriverと同じフォルダに配置します。

簡単に解説すると、以下の動作をします。

ツールの使い方

キーワードと検索したい順位を書いたファイル target.csv を用意します。
ファイルを以下のように記述します。

${指定順位} ${タブ} ${指定キーワード}
...

例えば以下のようなタスクがあったとします。

  • python というキーワードで 検索結果 2位 のタイトル
  • selenium というキーワードで 検索結果 3位 のタイトル

これらを調べたい場合は以下のように記述します。
適当にコピペしてこのファイルを作ってください。

2    python
3    selenium

次にコマンドプロンプトPowerShellを起動します。
その後以下のコマンドでツールが置いてある場所まで移動します。

cd ${ツールが置いてある場所}

以下のコマンドを実行します。
なお、引数は 調べたい内容に合わせて指定します。
yahoo で検索したければ google を yahoo に変更するだけですし、URLを取得したければ title を url に変更するだけです。

python check.py title google des

これで targer.csv に記述された内容を取得してきてくれます。
具体的には以下のような結果が得られます。

PS C:\Users\nknsh\Desktop\form_check> python .\check.py title google des
2       python
Pythonとは - python.jp
3       selenium
オープンソースの自動テストツール/Seleniumとは - OSS×Cloud News

得られた結果をランサーズのタスクの作業結果に張り付けて提出すれば完了です。
簡単ですね!

まとめ

  • ランサーズのタスクを自動化するツールを作成しました
  • 稼ぐ効率が上がりました
  • 今後アイデアがあれば改良していく予定です

気が向いたら ランサーズ に登録して楽して稼いでみましょう。

クラウドソーシングなら日本最大級の「ランサーズ」

はてなブログがHTTPS対応していない話

概要

そろそろブログ更新するかと思ってこのブログにアクセスしてみたらHTTPでアクセスしていてびっくりした。

この記事ではHTTPSって何ぞや、という話とHTTPのままだとどうなるの?っていう話をまとめます。

世の中の流れ的にHTTPSになっていないのはまずいんじゃないのと思いつつ、まぁでもはてなブログさんが対応してくれるまでどうしようもないなー、と思うのでとりあえず記事を書く。

なぜHTTPSにするのか

HTTPではなくHTTPSにするべき理由は以下です。

  • 情報の流出を防ぐため
  • サーバの認証をするため

ざっくり言って上記がHTTPSを使うべき本来の理由です。

これに加えて最近の風潮として、以下の理由も出てきました。

  • 世の中の流れ

これらについて詳しく書きます。

HTTP/HTTPS って?

HTTPとはWebサーバとHTMLなどのWebサイトの情報をやり取りをする際に使われるプロトコル(通信手順)のことです。

目の前のパソコンでChromeとかのブラウザを開き、URLを入力してエンターキーを押したときに、パソコンとWebサーバの間でHTTPを使ったやり取りが行われます。

HTTPを使った際にインターネット上を流れるデータは以下のものが挙げられます。

  • Webサーバから送られるデータ
    • HTMLやCSSなどのWebサイトの表示に必要なデータ
  • クライアントPC(目の前のパソコン)からWebサーバに送られるデータ
    • リクエストしたURL
    • 使用しているブラウザや機器を識別できる情報
    • CookieなどのクライアントPCに保存されている情報
    • フォームに入力したデータ

他にもありますが、ざっくり言って上記の情報がインターネット上に流れます。


HTTPSはHTTPと同様に上記のデータをやり取りするための通信手段のことですが、HTTPより安全性を高めたものです。

具体的には、HTTPで行うことに加えてデータの暗号化サーバの認証を行います。

データの暗号化ができると嬉しいこと

インターネット経由でWebサイトを閲覧する際に、色々な経路で目的のWebサーバと通信を行います。

例えば自宅に回線を引いている人であればプロバイダが提供しているルータを通ってインターネットにデータが出ていくと想定できます。

HTTPでWebサイトにアクセスした際に、データは平文でインターネット上を流れます。

平文とは暗号化されていないデータの事を指していて、インターネット上を流れるデータを盗み見られた場合にすぐに内容が分かってしまいます。

HTMLやCSSなどの情報が見られても問題ないことが多いと考えられますが、フォームに入力したデータ、例えばログインIDパスワードクレジットカード情報などが見られてしまった場合、悪用されてしまいます。

盗み見る、ということがいまいちピンと来ないかもしれませんが、データを中継するルータなどの装置にアクセスすることが出来れば流れるデータを盗み見ることは容易にできてしまいます。

自宅のルータであれば少しは安心かもしれませんが、Wifiスポットなどの誰が管理しているか分からないものを使ってインターネットにアクセスする場合はデータが盗み見られている可能性があると考えてよいでしょう。


一方でHTTPSであれば、データが暗号化されます。

データを暗号化する、ということは元のデータがどのようなものか分からない状態にすることを指します。

WebサーバとクライアントPCのみそのデータを解析する方法を持っておりそれ以外の人には分からない、という状態でデータのやり取りを行います。

これであれば万が一データが盗み見られてしまった場合でも、盗み見た人にとってはそれがどのような内容なのかが分かりませんので安心です。


はてなブログを利用する上でインターネット上を流れる重要な情報としてログイン情報が挙げられ、これを守るためにHTTPSで通信を行うことが必要です。

サーバの認証ができると嬉しいこと

サーバの認証とは、アクセス先のサーバが正式なものであると確認することを指します。

HTTPSでWebサイトにアクセスした際にサーバの証明書の情報が送られてくるので、その情報をもとにクライアントPCはアクセスしているサーバは正式なものであることを判断します。

証明書を発行するには認証局(CA)と呼ばれる機関に申請を行う必要があるので、偽造は基本的に出来ないものと考えてよいです。

これにより、アクセス先のWebサーバが本当に正しいのか否かを判断することができるので、フィッシング詐欺などに引っかからずに済みますね。

はてなブログではこれがあったところでそんなに嬉しく無いかもしれませんね。

世の中の流れ

全てのWebサイトはHTTPSで通信を行うべきである、という流れがここ数年であります。

例えばGoogleですが、Google検索による検索結果はhttpsが有効であるWebサイトに対しては常にhttpsが表示されるようになっています。

Google ウェブマスター向け公式ブログ: HTTPS ページが優先的にインデックスに登録されるようになります


Chromeブラウザを使用してHTTPでWebサイトにアクセスした際に警告が出るようするかも?という発表をしたのは記憶に新しいですね。(実際はまだなっていませんが。)

ChromeはHTTPの死を早めている…1月からHTTPSでないページに警告を表示 | TechCrunch Japan


また、Mozilla FirefoxブラウザではFirefox 52から、HTTPでWebサイトにアクセスした際にフォームに入力しようとすると警告が出るようになっていますね。

このように海外の巨大な企業が全てのWebサイトをHTTPS化しよう、という動きになっています。


日本の企業でもyahooがサービスを全てHTTPS化しましたね。

Yahoo! JAPANサービスは常時SSL(AOSSL)に対応します - Yahoo! JAPAN


ブラウザを作っている企業や検索エンジンのサービスを提供している大きな企業がこのようにHTTPS化の動きを進めているので、恐らく近い将来にHTTPで通信するWebサイトは無くなると考えても良いのではないかと思います。
はてなブログもなるべく早く対応してほしいものですね。


※ 2017年7月17日時点での情報です。

AWSでWordPressによるWebサイトを構築する話

概要

AWSに登録したので、無料枠の範囲でWordPressを使ってWebサイトを構築しようと思って書いた記事です。

EC2 + RDS で構築します。

 

前提

AWSのアカウントが登録済みあること。

2017年4月時点の情報であり、AWSの仕様は今後変化する可能性は十分あります。

 

EC2インスタンスを作成する

まずコンソールにログインし、EC2をクリックしてEC2の管理画面に遷移します。

f:id:nknshmsk:20170402172131p:plain


インスタンスを作成ボタンをクリックし、インスタンス作成画面に移ります。

f:id:nknshmsk:20170402172127p:plain



今回の記事ではOSは無料枠の対象である Amazon Linux を選択して確認と作成ボタンをクリックします。

f:id:nknshmsk:20170402172213p:plain



確認画面の内容がこれでよい事を確認し、作成ボタンをクリックします。

f:id:nknshmsk:20170402172236p:plain




キーペアの作成画面が表示されるので、

[新しいキーペアの作成 ] を選択し、キーペア名を指定して 鍵ファイル(.pem形式) をダウンロードします。

このファイルは、作成したインスタンスにログインするための情報となるので、大事に保管しましょう。

f:id:nknshmsk:20170402172259p:plain




 [インスタンスの作成] ボタンをクリックすると、インスタンス作成中の画面に遷移するので[インスタンスの表示] ボタンをクリックします。

f:id:nknshmsk:20170402172346p:plain




しばらく経過後に、作成したインスタンスが running の状態になっていることが分かります。

また、グローバルIPアドレス 「54.245.145.33」 が作成完了時点ですでに振られています。

このIPアドレスは永続的なものではなく、インスタンス再起動の度に変更されてしまうものですので、固定のIPアドレスが欲しい場合はEIPというものを割り振ってあげる必要があります。

今回の記事では趣旨と外れてしまうので省略します。

最後にインスタンスを識別するために名前を振ってあげます。
インスタンス一覧の画面でインスタンスのName欄にマウスオーバーすると鉛筆のマークが出てくるので、そこをクリックことで名前の設定ができます。
今回は wp-test という名前を付けました。

ここまででインスタンスの作成が完了しました。

ほんの1,2分でサーバが作成できました、簡単ですね!

 

作成したインスタンスSSHクライアントでログインする

ここまでで作成したインスタンスにログインしてみます。

今回作成したインスタンスのOSは AmazonLinux なので、SSHでログインします。

また、SSHのクライアントはなんでも良いのですが、今回はPuTTYを使います。

PuTTYでは .pem 形式のファイルはサポートされていないので、PuTTYgenというソフトウェアを利用して .pem のファイルを .ppk ファイルに変換して、それをプライベートキーとしたSSHログインをします。

なお、他のSSHクライアントでは .pem をプライベートキーとしてログインすれば良い想定ですので、.pemファイルを変換する過程は省略します。

 

接続先IPアドレスは、作成完了時に確認したアドレス 54.245.145.33 にします。

f:id:nknshmsk:20170402172604p:plain



そして、プライベートキーファイルとして先ほど変換した .ppk ファイルを指定します。

f:id:nknshmsk:20170402172615p:plain



そして接続をするとログインユーザを聞かれるので、EC2インスタンスのデフォルトユーザである 「ec2-user」を指定するとログインができます。

f:id:nknshmsk:20170402172632p:plain

ミドルウェアをインストール・設定する

ログインができるようになりましたので、WordPressに必要なミドルウェアをインストールしていきます。

まず、基本的にパッケージは最新バージョンに保つ方が好ましいと考えるため、デフォルトでインストールされているパッケージのアップデートをします。
併せて今回必要な以下のミドルウェアをインストールします。

なお、Apacheは、PHP7をyumでインストールすると、関連パッケージとして一緒にインストールされます。

[ec2-user@ip-172-31-8-42 ~]$ sudo yum update
(略)
[ec2-user@ip-172-31-8-42 ~]$ sudo yum install php70
(略)
[ec2-user@ip-172-31-8-42 ~]$ sudo yum install php70-pdo
(略)
[ec2-user@ip-172-31-8-42 ~]$ sudo yum install php70-mysqlnd
(略)
[ec2-user@ip-172-31-8-42 ~]$ sudo yum install php70-mbstring
(略)
[ec2-user@ip-172-31-8-42 ~]$ sudo yum install mysql
(略)

次にWordPressをインストールし、 /var/www/www.wp-test.jp として設置します。

[ec2-user@ip-172-31-8-42 ~]$ wget https://ja.wordpress.org/latest-ja.tar.gz
--2017-04-02 05:47:21--  https://ja.wordpress.org/latest-ja.tar.gz
Resolving ja.wordpress.org (ja.wordpress.org)... 66.155.40.250, 66.155.40.249
Connecting to ja.wordpress.org (ja.wordpress.org)|66.155.40.250|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 8481247 (8.1M) [application/octet-stream]
Saving to: ?latest-ja.tar.gz?

latest-ja.tar.gz              100%[=================================================>]   8.09M  15.5MB/s    in 0.5s

2017-04-02 05:47:21 (15.5 MB/s) - ?latest-ja.tar.gz? saved [8481247/8481247]
[ec2-user@ip-172-31-8-42 ~]$ cd /var/www/
[ec2-user@ip-172-31-8-42 ~]$ sudo tar -xzvf ~/latest-ja.tar.gz 
(略)
[ec2-user@ip-172-31-8-42 www]$ ls
cgi-bin  error  html  icons  noindex  wordpress
[ec2-user@ip-172-31-8-42 www]$ sudo mv wordpress www.wp-test.jp

必要なもののインストールができたので、HTTPリクエストが来た時に www.wp-test.jp 以下を返すようApacheの設定をして、起動します。
なお、今回はインターネットに公開する予定はないのでセキュリティ周りの設定は今度します。

[ec2-user@ip-172-31-8-42 www]$ sudo cp /etc/httpd/conf/httpd.conf /etc/httpd/conf/httpd.conf.org
[ec2-user@ip-172-31-8-42 www]$ sudo vi /etc/httpd/conf/httpd.conf
[ec2-user@ip-172-31-8-42 www]$ diff /etc/httpd/conf/httpd.conf /etc/httpd/conf/httpd.conf.org
119c119
< DocumentRoot "/var/www/www.wp-test.jp"
---
> DocumentRoot "/var/www/html"
126c126
<     # Allow open access
---
>     # Allow open access:
131c131
< <Directory "/var/www/www.wp-test.jp">
---
> <Directory "/var/www/html">
[ec2-user@ip-172-31-8-42 www]$ sudo /etc/init.d/httpd start
Starting httpd:                                            [  OK  ]

RDS を作成する

ここまででEC2インスタンスの最低限の設定ができたので、次はWordPressのデータが格納されるデータベースの作成をします。
EC2インスタンスMySQLサーバをインストールしてそれを使ってもよいのですが、AWSにはRDSというデータベースのサービスがありますのでそれを使います。



まず、AWSコンソールからRDSの管理画面に遷移します。

f:id:nknshmsk:20170402172708p:plain



RDSの起動をクリックします。

f:id:nknshmsk:20170402172717p:plain



DBエンジンの選択画面に遷移するので、今回は無料枠の中で使用することができるMySQLを使用します。

f:id:nknshmsk:20170402172727p:plain



安定高速なものも選べますが(有料)どうですか?と聞かれますが、今回は無料枠の範囲でと決めているので 開発/テスト 用を選択。

f:id:nknshmsk:20170402172737p:plain



詳細設定の画面に遷移するので、まず 無料枠の範囲で使えるオプションのみ表示 のチェックを入れます。
そして、MySQLのバージョンを現在の時点での最新バージョンに設定し、以下の項目を設定します。

  • DB インスタンス識別子 : 今回作成するRDSに対して一意に振られる名前
  • マスターユーザの名前 : WordPress以外に使用する予定は無いので、wordpressユーザを作成
  • スターパスワード : wordpressユーザのパスワードを指定、後で使うので
  • パスワードの確認 : 忘れないようにね!

f:id:nknshmsk:20170402172753p:plain

ネットワークやセキュリティ、その他の設定に移ります。



まずVPCについてですが、これはAWS上に作成できる仮想ネットワークです。
EC2インスタンスは デフォルト vpc に属しているため、RDSも同じネットワークに属させます。

次にセキュリティグループですが、これは通信の許可を設定することが出来ます。
今回はDBへ接続のための通信のみ許可するグループを新しく作成します。

最後にデータベースの名前ですが、WordPress用のデータベースなので、wordpressと名前を付けます。

その他の設定に関してはデフォルトの状態で DBインスタンスの作成 をクリックします。

f:id:nknshmsk:20170402172821p:plain



その後作成中画面に遷移します。
また、インスタンス一覧の画面に遷移するとステータスが作成中のインスタンスがありますがしばらく待つとインスタンスが起動してきます。

f:id:nknshmsk:20170402172832p:plain


EC2からRDSに接続する

EC2 から RDS に接続するためにセキュリティグループを設定する必要があります。

RDSのセキュリティグループのインバウントの許可設定にEC2インスタンスが所属するセキュリティグループからのデータベースへの通信を加えます。



まずEC2インスタンスが所属するセキュリティグループを確認します。
EC2の管理画面から今回作成したEC2インスタンス wp-test を選択することでセキュリティグループを確認することが出来ます。

f:id:nknshmsk:20170402172959p:plain



launch-wizard-3 に属していることが分かりました。
次にEC2管理画面の左ペインからセキュリティグループをクリックして一覧を確認します。

f:id:nknshmsk:20170402173015p:plain



rds-launch-wizard はRDSが所属しているグループで launch-wizard-3 はEC2が所属しているグループです。

rds-launch-wizard をクリックして、編集をクリックします。
そして以下の設定を入力し、保存をクリックします。

  • タイプ : MYSQL/Aurora
  • 送信元 : カスタム / launch-wizard-3

f:id:nknshmsk:20170402173030p:plain



これでEC2からRDSへDB接続のための通信が許可されるようになるので、wordpressユーザでEC2から接続を試してみます。

なお、RDSはエンドポイントと呼ばれる接続先のIPアドレスに代わるものが割り振られているので、それを確認します。

RDSの管理画面 → 確認したいRDSを選択で確認することが出来ます。

f:id:nknshmsk:20170402173042p:plain



エンドポイントが分かったので、EC2にログインして以下のように接続をします。

[ec2-user@ip-172-31-8-42 ~]$ mysql -u wordpress -h wp-test.cbpgcqev4of6.us-west-2.rds.amazonaws.com -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 27
Server version: 5.7.16-log MySQL Community Server (GPL)

Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.


EC2からDBへの接続が出来るようになりました。

自分のPCからインターネット経由でHTTP接続できるようにする

もう終盤です。

WordPressが動作する環境は整ったので、EC2にインターネット経由で接続できるようにします。

デフォルトの状態ではセキュリティグループの設定がSSH接続のみ許可されている状態です。
これに、自分のPCからのHTTP接続を許可する設定を加えます。(公開する場合は全てのIPアドレスからの通信を許可)

EC2の管理画面 → セキュリティグループ に移動し、EC2が所属しているセキュリティグループを選択します。
そして 編集 をクリックして、以下の設定を加えます。

f:id:nknshmsk:20170402173621p:plain



これで自分のPCからEC2へHTTP接続が出来るようになったので、ブラウザにEC2のIPアドレスを入力して接続します。
そうすると、WordPressの仕様で 54.245.145.33/wp-admin/setup-config.php にリダイレクトされます。

f:id:nknshmsk:20170402173651p:plain


ブラウザからWordPressの設定をする

最後の仕上げに入ります。

ブラウザからWordPressの設定画面が表示できるようになったので、WordPressの設定を入れていきます。

WordPressのメッセージに従いながら。以下の項目を入力していきます。

  • データベース名: wordpress
  • ユーザ名: wordpress (RDS作成時に設定したユーザ)
  • パスワード: (RDS作成時に設定したパスワード)
  • データベースのホスト名: wp-test.cbpgcqev4of6.us-west-2.rds.amazonaws.com (RDSのエンドポイント)
  • テーブルの接頭辞: wp_

権限周りの設定をしていなかったので、wp-config.php に書き込めませんでした というメッセージが出ます。
なので、今回はEC2にログインして直接wp-config.phpを作成しましょう。

[ec2-user@ip-172-31-8-42 ~]$ vim /var/www/www.wp-test.jp/wp-config.php
[ec2-user@ip-172-31-8-42 ~]$ sudo chown apache.apache /var/www/www.wp-test.jp/wp-config.php

その後メッセージに従ってサイトのタイトルやメールアドレスなどを設定していけば完了です。

最後にもう一度 54.245.145.33(EC2のIPアドレス) にブラウザからアクセスして正しくサイトが表示されることを確認します。



f:id:nknshmsk:20170402173713p:plain

おわりに

AWSの無料枠を利用して、EC2 + RDSの構成でWordPressを構築しました。

現状では自分のPCから見れるだけのサイトなので、テスト環境としては使えそうです。

外部に公開するには少なくともセキュリティ周りの設定とドメインの取得などが必要ですね。
また今度にします。

初心者がnodejsでHTMLファイルを処理する話

はじめに

  • この記事はnode.jsでHTTPリクエストに対し、HTMLファイルを返す処理についてまとめる記事です
  • 前の記事ではターミナル上でnode.jsを用いたHello!world!を行いました
  • 前の記事↓

math-it.hatenablog.com

ディレクトリ構造

  • 以下の用なファイルを作成します
[@guestos nodejs]$ tree ./
./
├── html
│   ├── hellonode.html
│   └── notfound.html
└── index.js
1 directory, 3 files

正常なパスのリクエストが来た場合の静的ファイルを作成

  • 正しく存在する場合のHTMLファイルを作成します
  • html/hellonode.html
[@guestos nodejs]$ cat html/hellonode.html
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>Hello!node.js!</title>
</head>
<body>
<h1>Node.jsですよ!</h1>
</body>
</html>

それ以外のパスが指定されたリクエストが来た場合の静的ファイルを作成

  • 存在しないファイルが指定された場合のHTMLファイルを作成します
  • html/notfound.html
[nknsh@guestos nodejs]$ cat html/notfound.html
<!DOCCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>404 notfound!!</title>
</head>
<body>
<h1>ページが見つかりませんでした。</h1>
</body>
</html>

HTTPリクエストを処理するjsファイルを作成

  • 指定されたパスに対し処理を分岐
    • 指定されたパスが存在すれば対応するHTMLファイルを返す
    • そうでなければnotfound用ファイルを返す
    • notfound用ファイルすら存在しなかった場合にnotfound用テキストを返す
  • fsオブジェクトを生成することでHTMLファイルが呼び出せる
    • __dirnameはindex.jsが位置する絶対パスに対応する
    • readFileメソッドの引数
      • 第一引数は読み込むファイルのパス
      • 第二引数は文字コード
      • 第三引数はコールバック関数( エラー, 読み込んだファイル )
[@guestos nodejs]$ cat index.js
var http = require('http');
var server = http.createServer();

var filesystem = require('fs');

server.on('request', function(req, res){
        filesystem.readFile(__dirname + req.url, 'utf-8', function(error, data){
                if(error){
                        filesystem.readFile(__dirname + '/html/notfound.html', 'utf-8', function(notfoundError, notfoundData){
                                if(notfoundError){
                                        res.writeHead(404, {'Content-Type': 'text/plain'});
                                        res.write('notfound!!');
                                        return res.end();
                                }else{
                                        res.writeHead(404, {'Content-Type': 'text/html'});
                                        res.write(notfoundData);
                                        return res.end();
                                }
                        });
                }else{
                        res.writeHead(200, {'Contetnt-Type': 'text/html'});
                        res.write(data);
                        return res.end();
                }
        });
});

server.listen( 3000, '192.168.100.200');
console.log('server listening, port 3000');

実行結果

  • index.jsの実行
[@guestos nodejs]$ node index.js
server listening, port 3000
  • 存在するパスを指定した場合

f:id:nknshmsk:20160801233328p:plain

  • 存在しないパスを指定した場合

f:id:nknshmsk:20160801233242p:plain

まとめ

  • node.jsで静的なHTMLファイルを返すことをしました
  • これでnode.jsを用いたウェブサイト作成の第一歩と言えるかなと思います
  • おすすめの参考書
    • 筆者はこの本を使って勉強しています
    • 割と丁寧だと思うのでお勧めです

初心者がNode.jsの概要について解説する話

Node.jsとは?

  • 公式サイト https://nodejs.org/en/
  • バックエンド(サーバー側で動作する)Javascript
  • Javascript大量のHTTPリクエストを処理できるようにしたプラットフォームともいえる
  • ノンブロッキング(非同期)な処理を行えるのが特徴
  • javascriptの基本的な動作について知っておかないと初学者にはしんどい
    • 同期・非同期処理について
    • コールバック関数とか
    • イベントとか
  • httpについての知識も少しあったほうがいいかも
    • telnetでhttpリクエストを投げられるぐらいだったらOK!

Node.jsのインストール

  • CentOS6にnode.jsをインストールすることを考えます
  • yumでepelリポジトリからインストール可能です
[@guestos ~]$ sudo yum epel-release

~略~

[@guestos ~]$ sudo yum install nodejs

~略~

[nknsh@guestos ~]$ node -v
v0.10.42

Node.jsでHello!world!をする

  • nodeでnode.jsを起動し、対話的に行う
[@guestos nodejs]$ node
> console.log('hello!node!');
hello!node!
undefined
> .exit
  • .jsファイルを実行することも可能
[@guestos nodejs]$ cat hellonode.js
console.log('hello!node!');
[@guestos nodejs]$ node hellonode.js
hello!node!

HTTPリクエストを処理する

  • 以下のようにjsファイルを作成し、実行する
[@guestos nodejs]$ vim index.js
[@guestos nodejs]$ cat index.js
var http = require('http');
var server = http.createServer();

server.on('request', function(req, res){
        res.writeHead(200, {'Contetnt-Type': 'text/plain'});
        res.write('hello!node!');
        res.end();
});

server.listen(3000, '192.168.100.200');
console.log('server listening, port 3000');
[@guestos nodejs]$ node index.js
server listening, port 3000
  • httpモジュールにリクエスト処理などのHTTP周りの処理が書いてある
  • .createServer()メソッド でサーバーの役割を担うオブジェクトが生成できる
  • .on('イベント', コールバック関数) でオブジェクトに対してイベントを付与できる
    • 今回はサーバーhttpリクエストが来た場合のイベントを作成する
  • res.writeHead('ステータスコード', HTTPレスポンスヘッダ) でリクエストに対するレスポンスヘッダの記述が可能
  • res.write('コンテンツ') でリクエストに対しどのようなコンテンツを返すかの記述が可能
  • レスポンスの最後は res.end() で終わりましょう
  • server.listen(ポート番号, 'IPアドレス') でhttpリクエストを処理するサーバー起動
  • 結果
    • 192.168.100.100(同一セグメント)のwindowsマシンでchromeを使ってアクセス

f:id:nknshmsk:20160725214225p:plain

エラーが出てサーバーが起動しなかった場合

  • 以下のエラーが出た場合の対処
events.js:72
        throw er; // Unhandled 'error' event
              ^
Error: listen EADDRNOTAVAIL
    at errnoException (net.js:905:11)
    at Server._listen2 (net.js:1024:19)
    at listen (net.js:1065:10)
    at net.js:1147:9
    at dns.js:72:18
    at process._tickCallback (node.js:448:13)
    at Function.Module.runMain (module.js:499:11)
    at startup (node.js:119:16)
    at node.js:935:3
  • すでにnode.jsは起動していないか?
    • ps aux | grep node で確認
    • 起動していた場合 sudo kill -9 プロセス番号 で強制終了
  • 他のプロセスとポート番号はかぶっていないか
    • netstat -an でポート番号の確認
    • かぶっていた場合 server.listen(ポート番号, 'IPアドレス') のポート番号を変更
  • 正しいIPアドレスを設定してあるか

まとめ

  • node.jsのHello world!までについてを記しました
  • javascriptについて知識がある人なら理解は容易かもしれません
  • おすすめの参考書
    • 筆者はこの本を使って勉強しています
    • 割と丁寧だと思うのでお勧めです

VMwarePlayer上のOSにホストOSからSSH接続する話

概要

 

VMware上のゲストOS(今回はCentOS6)にホストOS(windows10)からSSHで接続したいな、

と思ったらわかっていないことが多く、苦労したので設定メモ。 

 

 

ゲストOS側(VMware上のCentOS6)の設定

ifcfg-eth0の設定

 

/etc/sysconfig/network-scripts/ifcfg-eth0の初期状態

 

# cat /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
HWADDR=00:00:00:00:00:00:00
TYPE=Ethernet
UUID=00000000-0000-0000-0000-000000000000
ONBOOT=no
NM_CONTROLLED=yes
BOOTPROTO=dhcp

 

 ※一部英数字を0に変えてます。

 

こいつをこうしてやります。

 

# cat /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
HWADDR=00:00:00:00:00:00:00
TYPE=Ethernet
UUID=00000000-0000-0000-0000-000000000000
ONBOOT=yes
NM_CONTROLLED=yes
BOOTPROTO=none
IPADDR=192.168.100.200
NETMASK=255.255.255.0

 

上記の変更した項目は

ONBOOT:起動時にONにするか否か

BOOTPROTO:プロトコルを設定し、IPアドレスを取得します。今回は無効に

IPADDR:IPアドレス、ホストと同じグループになるように設定します

NETMASK:サブネットマスク、ホストと同じものを設定します

 

ホストOS側(windows10)の設定

NATの設定ファイルを変更します。

C:\ProgramData\VMware\vmnetnat.conf を変更

[省略]

[incomingtcp]

22 = 192.168.100.200:22

 上記の項目では以下のような規則で設定を追加します。

ホストOSのポート番号 = ゲストOSのIPアドレス:ポート番号

SSHのポート番号のデフォルト値は基本的に22であるので今回はそのまま使用。

 

 NATの設定ファイルを変更したので、タスクマネージャからVMware NAT Serviceを探して再起動します。

 

 ゲストOS(CentOS6)のネットワークを再起動

# ifdown eth0

# ifup eth0

# ifconfig

eth0  -略- 
inet addr:192.168.100.200 Bcast:192.168.100.255 Mask:255.255.255.0
-略-

 ipアドレスがしっかり書き換わっているのを確認します。

 

 さてこれでいけるはずだが失敗

 はい、ホストOSからゲストOSへpingが通りません。

>ping 192.168.100.200

192.168.100.200 に ping を送信しています 32 バイトのデータ:
192.168.100.100 からの応答: 宛先ホストに到達できません。

 

SElinuxを切ってみる

SElinuxSSH接続を拒否してる可能性を考慮して、一応切ってみる。

/etc/sysconfig/selinux ファイルをvim編集

SELINUX=disabled

経験上と先人達の知恵から、とりあえず切っておく。

もちろんしっかりわかった上で設定できるならあったほうが良いが、

今回はとりあえず切る。(ごめんなさい)

 

でも残念ながらpingが通らず、

やってから思ったけどpingが通らないなら関係ない項目だよね。

 

VMwareの設定の再確認からの成功

そもそもゲストOSとホストOSが同一ネットワークに居ることを前提に進めていましたが、

そこから疑うことに。

参考

http://www.nslabs.jp/linux-nat-on-vmware.rhtml

 どうやらVMwareのネットワーク接続の設定によってネットワークの構成が変わるようです。

ブリッジ接続であればホストOSとゲストOSが同一LANに属してくれるようです。

(失敗したときはNATになっていたのでそれぞれ別のLANに属していました)

とりあえずブリッジ接続に変更し、ホストOSからゲストOSにpingを飛ばす。

>ping 192.168.100.200

192.168.100.200 に ping を送信しています 32 バイトのデータ:
192.168.100.200 からの応答: バイト数 =32 時間 <1ms TTL=64
192.168.100.200 からの応答: バイト数 =32 時間 <1ms TTL=64

 無事、同一LANに居るようです。

SSH接続も無事にすることができたので、とりあえず所望の動作はできるようになりました。

 

まとめ、今回のポイント

  • DHCPを切ることにより勝手なIPアドレスを振られることを防ぐ
  • IPアドレスとネットマスクを正しく設定し、論理的に同一LANに属するようにする
  • VMwareの設定で、物理的(仮想的?)に同一LANに属するようにする(今回はブリッジ接続で解決)

とりあえず同一LANに居ればSSHで接続はできますからねー

 

新人SEがデータベースとは何かについて解説する話

過去記事の続きになります。

新米SEがデータベーススペシャリストを目指す上での学習メモになります。

ちなみにSE(正確にはインフラエンジニア)になりました。 

math-it.hatenablog.com

 

 

 

データベースとは

データベース(DataBase)とは、その名の通りデータの基地を表します。

 

昔のシステム開発においては、一つのシステムに対してデータの集まりが一つありました。

 

この状態でシステムを管理すると、複数のシステムで重複するデータなどが存在することになり、更新の際やデータと受け渡しなどにおいて非常に非効率であるという問題がありました。

 

そこで考案されたものがデータベースになります。

 

データを保持しておく場所を一か所に定めることによりデータを独立させ、各システムはそこにデータを取りに行くという仕組みをとることにより上記の問題点を解消します。

 

この仕組みは現在まで利用されており、システム開発においてデータベースの構築は欠かせないものとなっています。

 

 

 

データモデル

データを保存しておく形式などの、データに対する決まり事を定めたデータモデルは複数存在します。よく知られているものとしては以下のものです。

 

  • 階層型データモデル
  • ネットワークデータモデル
  • 関係データモデル
  • オブジェクト指向データモデル

 

現在、最も多くのシステムで利用されているデータモデルは関係データモデル(リレーショナルデータモデル)になります。

 

リレーショナルデータモデルが正常に動作する(正常の定義についてはいつか別記事で。)根拠として数学の関係理論がベースとなっており、また直感的な理解が容易である点から世に浸透したモデルになります。

 

データベースを関係(リレーショナル)の集まりであるという考え方が根底にあります。

 

データを行と列で構成された表で表現することが可能であり、直感的な理解が可能です。

 

 

 

リレーショナルデータモデル

 

 リレーショナルデータモデルにおいて、データの集まりは関係を持っているという前提を置きます。

 

そしてデータは属性を持つとします。

 

例えば、80点というテストの点数が保持すべきデータであるとすれば、80という得点にはテストの点数という属性を持つことになります。

 

さらに、このテストの点数を取ったのは太郎君であるとします。この場合は太郎というデータは名前という属性を持ち、さらに80という得点の属性を持ったデータと関係(リレーション)を持ちます。

 

(太郎, 80)

 

また、花子さんのテストの点数は70点であったとしましょう。太郎君と同様に次のように表します。

 

(花子, 70)

 

これらを表に表したものが以下のものになります。

 

点数表

|  名前  |  点数  |

|  太郎  |  80  |

|  花子  |  70  |

 

このとき、この点数表をリレーションと呼び、各行のことをタプル、各列のことをカラムと呼びます。

 

また、この呼称は実際の運用の場では異なる場合があり、リレーションはテーブルタプルはレコード、カラムはフィールドと呼ばれます。

 

 

 

まとめ

  • データを独立するという考えによりデータベースが考案された
  • データモデルには複数種類があるが現在は関係データモデルが主流
  • リレーションにはタプルカラムがある

 

 

おすすめの参考書です。

amazonで立ち読みでもどうぞ。