初心者がnodejsでHTMLファイルを処理する話
はじめに
- この記事はnode.jsでHTTPリクエストに対し、HTMLファイルを返す処理についてまとめる記事です
- 前の記事ではターミナル上でnode.jsを用いたHello!world!を行いました
- 前の記事↓
ディレクトリ構造
- 以下の用なファイルを作成します
[@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ファイルが呼び出せる
[@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
- 存在するパスを指定した場合
- 存在しないパスを指定した場合
まとめ
- node.jsで静的なHTMLファイルを返すことをしました
- これでnode.jsを用いたウェブサイト作成の第一歩と言えるかなと思います
- おすすめの参考書
- 筆者はこの本を使って勉強しています
- 割と丁寧だと思うのでお勧めです
初心者がNode.jsの概要について解説する話
Node.jsとは?
- 公式サイト https://nodejs.org/en/
- バックエンド(サーバー側で動作する)Javascript
- Javascriptが大量のHTTPリクエストを処理できるようにしたプラットフォームともいえる
- ノンブロッキング(非同期)な処理を行えるのが特徴
- javascriptの基本的な動作について知っておかないと初学者にはしんどい
- 同期・非同期処理について
- コールバック関数とか
- イベントとか
- httpについての知識も少しあったほうがいいかも
- telnetでhttpリクエストを投げられるぐらいだったらOK!
Node.jsのインストール
[@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リクエストを処理するサーバー起動
- 結果
エラーが出てサーバーが起動しなかった場合
- 以下のエラーが出た場合の対処
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の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を切ってみる
SElinuxがSSH接続を拒否してる可能性を考慮して、一応切ってみる。
/etc/sysconfig/selinux ファイルをvim編集
SELINUX=disabled
経験上と先人達の知恵から、とりあえず切っておく。
もちろんしっかりわかった上で設定できるならあったほうが良いが、
今回はとりあえず切る。(ごめんなさい)
でも残念ながらpingが通らず、
やってから思ったけどpingが通らないなら関係ない項目だよね。
VMwareの設定の再確認からの成功
そもそもゲストOSとホストOSが同一ネットワークに居ることを前提に進めていましたが、
そこから疑うことに。
参考
どうやら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(正確にはインフラエンジニア)になりました。
データベースとは
データベース(DataBase)とは、その名の通りデータの基地を表します。
昔のシステム開発においては、一つのシステムに対してデータの集まりが一つありました。
この状態でシステムを管理すると、複数のシステムで重複するデータなどが存在することになり、更新の際やデータと受け渡しなどにおいて非常に非効率であるという問題がありました。
そこで考案されたものがデータベースになります。
データを保持しておく場所を一か所に定めることによりデータを独立させ、各システムはそこにデータを取りに行くという仕組みをとることにより上記の問題点を解消します。
この仕組みは現在まで利用されており、システム開発においてデータベースの構築は欠かせないものとなっています。
データモデル
データを保存しておく形式などの、データに対する決まり事を定めたデータモデルは複数存在します。よく知られているものとしては以下のものです。
- 階層型データモデル
- ネットワークデータモデル
- 関係データモデル
- オブジェクト指向データモデル
現在、最も多くのシステムで利用されているデータモデルは関係データモデル(リレーショナルデータモデル)になります。
リレーショナルデータモデルが正常に動作する(正常の定義についてはいつか別記事で。)根拠として数学の関係理論がベースとなっており、また直感的な理解が容易である点から世に浸透したモデルになります。
データベースを関係(リレーショナル)の集まりであるという考え方が根底にあります。
データを行と列で構成された表で表現することが可能であり、直感的な理解が可能です。
リレーショナルデータモデル
リレーショナルデータモデルにおいて、データの集まりは関係を持っているという前提を置きます。
そしてデータは属性を持つとします。
例えば、80点というテストの点数が保持すべきデータであるとすれば、80という得点にはテストの点数という属性を持つことになります。
さらに、このテストの点数を取ったのは太郎君であるとします。この場合は太郎というデータは名前という属性を持ち、さらに80という得点の属性を持ったデータと関係(リレーション)を持ちます。
(太郎, 80)
また、花子さんのテストの点数は70点であったとしましょう。太郎君と同様に次のように表します。
(花子, 70)
これらを表に表したものが以下のものになります。
点数表
| 名前 | 点数 |
| 太郎 | 80 |
| 花子 | 70 |
このとき、この点数表をリレーションと呼び、各行のことをタプル、各列のことをカラムと呼びます。
また、この呼称は実際の運用の場では異なる場合があり、リレーションはテーブル、タプルはレコード、カラムはフィールドと呼ばれます。
まとめ
- データを独立するという考えによりデータベースが考案された
- データモデルには複数種類があるが現在は関係データモデルが主流
- リレーションにはタプルとカラムがある
おすすめの参考書です。
amazonで立ち読みでもどうぞ。
学生がデータベーススペシャリストを目指す話
データベーススペシャリストを目指す学生の話と学習メモになります。
筆者のスペック
- 理系大学院生(専攻は数学系)
- 応用情報を取得済み
- SEのバイトでDB設計の経験が有り
という感じで頑張っていきます。
データベーススペシャリストとは?
高度IT人材として確立した専門分野をもち、データベースに関係する固有技術を活用し、最適な情報システム基盤の企画・要件定義・開発・運用・保守において中心的な役割を果たすとともに、固有技術の専門家として、情報システムの企画・要件定義・開発・運用・保守への技術支援を行う者
引用:
要するにデータベースを扱うプロであることを示す資格になりますね。
現在、データベースを利用しないシステムはほとんど無いと言っても過言ではありません。
今後も需要は望める技術でしょう。
学生のうちに合格し、今のうちに実力をつけておきたいものです。
学生が取るメリット
- 技術が身につく?
- 周囲と差をつけられる
- 就職活動で無双できる
実務の話に近い試験内容になりますが、実際に動かしてみるのと机の上で学ぶのではものすごい差があります。
技術を身に着けたいのであれば、実際に動かしながら勉強するのがよいでしょう。
学生がこの試験に合格できれば就職活動では敵なしと言っても過言ではないでしょう。
筆者の友人は、サークルなし、実績なし、コミュ力なしのスペックでしたが、この資格を持っており、そのエピソードを押すだけで就職活動で無双してました。
試験について
IPAの資格の中では最高レベルとなる試験となります。
合格率はどの年度の試験においても約15%前後となっており、ある程度学習コストをかけないとならないことが見込まれます。
また、15%合格するといっても、基本的にこの試験を受験する人は、応用情報を取得済みかつ受験者の平均年齢が35歳前後である実務経験が豊富な人間が占めていると言っても過言ではありません。
勉強方法
基本的に以下の流れでこの試験の勉強を進めます。
- テキストを一読
- 問題演習
- 間違った個所の復習
- 過去問
- (暇を見つけて勉強の進捗や内容のまとめの記事を更新)
普通です、要領よくなどと言わずに地道に行きます。
ブログの更新により内容の理解や記憶の定着を狙います。
利用する参考書
こちらを利用して勉強を進めます。
周囲の勧めと問題演習の豊富さを基準にして選択しました。
おわりに
とりあえずデータベーススペシャリストについてざっくりと書いたものになります。
今後はデータベースについて少し詳しく記事を書きます。
学生がランサーズを2週間使って小銭を稼ぐ話【体験談】
クラウドソーシングサービス「ランサーズ」を利用して、ネットのみの在宅ワークで小銭を稼いだ感想です。
前回の記事の続きになるので、前回の記事を読んでいない方はこちらからどうぞ。
↓ ↓ ↓
今回はタスクを合計120件以上こなした結果の感想と評価、稼いだ額の記録になります。
また、前回の記事で認証状況が皆無だったのですが、4件とも全て認証しました。
思っていたより効果(?)があったのでそれについても軽くコメントをしたいと思います。
まず現在の私のランサーズにおける実績とプロフィールはこちらになります。
実績とプロフィール
はい、プロフィールは相変わらず空っぽです!!←
まず実績について着目してみましょう。
実績
2週間(正確には15日間)で128件のタスクをこなしました。
ちなみに一件のタスクをこなすのに対して平均3~4分程かかっているので、費やした時間は約450分程度(7時間半)になります。
気が向いたら1時間ぐらい作業しますし、気が向かなければ1件やって寝るみたいな生活をしていました←
そして稼いだ金額はなんと2,277円!!
実際はまだ作業してから承認されていない作業が30件程あるので、2500円は稼いでいると思います。
やったね金麦がたくさん飲めるよ!!!!
時給に換算するとなんと・・・
333円/時!!
小学生の小遣いかよ!!
まぁやっている作業自体は誰でもできる単調作業で、
2画面でyoutubeを見ながらやっていましたので、その作業に対してこれだけの金額を貰えるのはかなり嬉しいところです。
かるく評価
-思っていたより美味しい仕事
-寝る前の空き時間を使って2週間で2500円はちょっとうれしい
-金麦飲めるぜわーい!
-やっぱりプロフィールを記入するのはめんどくさい・・・
次に認証状況について見てみましょう。
認証状況
項目4つの認証を全て完了させました。
なんかめんどくさいと感じていたのですが、実際に行うことは非常に簡単でした。
本人確認は身分証の写真をwebで送るだけでした。
スキャナが無いと駄目かなと思ったのですが、スマホのカメラで保険証を撮った写真を送ったら大丈夫でした。
文字が確認出来れば問題ないようです。
機密保持確認は、本人確認が済んだ後にいくつか確認事項を読み、同意をするだけでした。
ランサーズチェックはすでに済んでおり、簡単な質問にwebで回答するだけでした。
電話確認は、指定された電話番号に電話して音声ガイドに従ってダイヤルを押すだけでした。
ちなみに20秒ぐらいで終わりました(笑)
さて、これら4つの項目が完了しての感想です。
明らかに作業を行える仕事が増えました。
今までは、認証が済んでいないので作業できないというものが全体の1/3程度ありました。
1日にタスクの仕事は70件前後追加されますので、実際作業可能なものは50件強、
さらにそのうちの半分ぐらいは特定の人物がターゲットのものです。(性別や年齢など)。
また、作業が出来る人数は上限が定められており、早いもの勝ちで埋まってしまいます。
なので、一日に最大でも15件前後ぐらいしか作業が行えませんでした。
それぐらいでしたら1時間弱で終わってしまいます。
そこで認証を4項目行ったことにより、明らかに仕事の量が増えて、
少なくとも1時間じゃ終わらないぐらいにはなりました。
また、認証が済んでいないとできない作業は他の作業と比べ、同じ作業量でも若干単価が高い印象にあります。
これらのことから、かける労力は変わらずに明らかに稼ぐ効率が上がりました。
認証について感想と評価
-思ったより簡単なプロセスだった
-認証を済ませると稼げる額が上がる
-もっと早くやればよかった・・・
以上が前回の記事から1週間ちょっとたっての感想になります。
まだ使いこなせてない感満載ですね。
やっぱり情報交換できる人が居たらうれしいですね。
暇を持て余してる人が居たらどうぞ!
次の記事は今度こそプロフィールの充実と、
タスクの仕事内容(具体的なものではなくざっくりと抽象的に紹介)か、
タスク以外の仕事にチャレンジしてみた記事について書いてみたいなと思います。
タスクを自動化した記事書きました!
学生がランサーズを5日間使ってみた話【体験談】
クラウドソーシングサービス「ランサーズ」を利用して、ネットのみの在宅ワークで小銭を稼いだ感想です。
クラウドソーシング「ランサーズ」
まず私の簡単のスペックを。
スペック
-20代前半
-某理系私立大学院生
-スキルは研究で用いるプログラミングを少々とウェブサイトの作成を少々(どっちかっていうとバックエンドより)
-スキルがお金になった経験はほぼ無し←
ランサーズを利用したきっかけ
-一日に暇な時間が平均1~2時間程ある
-ブログを書けるようになりたい
-いつかフリーランスになりたい
-金がない←
貧乏大学生がランサーズを使ってみて一週間がたったので記事にしてみます。
ランサーズとは?
-今流行り(?)のクラウドソーシングサービス
-クラウドソーシングとは仕事を依頼する企業と仕事をしたい個人をマッチングするサービス
-このクラウドソーシングサービスの業界では国内最大級
-学生からガチなフリーのSE、専業主婦まで様々
-仕事の受け方に種類ある
仕事の受け方として、「プロジェクト」「コンペ」「タスク」の3種類があります・
プロジェクトは、
企業の人が募集→見積もりや計画の提案→採用→直接やり取りをし仕事をこなす
の流れになります。ウェブサイト制作などの仕事が多い印象にあります。単価は高いものから低いものまであり、数万円から数百万円の仕事があります。
コンペは、
企業の人が募集→制作物を送る→多くの制作物から自分のものが選ばれたら報酬
の流れになります。デザイン系(ロゴの作成など)の仕事が多い印象になります。単価は、プロジェクトと比べたら低くはなりますが、数千円から数万円といったところでしょうか。
タスクは、
企業の人募集→web上でテキストの送信→承認されたら報酬
の流れになります。文章作成やSEO調査、音声の文字起こしなどの仕事が多い印象にあります。単価は低く、数円のものから数千円のものまでになります。
今回はタスクを50件程こなした結果の感想・評価になります。
学生目線では
-小銭が稼げる
-スキルを活かした仕事を受けれる(プログラミング、デザインなど)
-スキルが無くても単純作業の仕事も多い(SEO調査やライティング)
私の目的
-小銭を稼ぐ(あわよくば大銭←)
-一日1~2時間で、さらに在宅で
-ライティング(文章作成)の仕事で文章力を磨き、ブログをたくさん書けるようになりたい!(ここ大事!)
主に上記の三つを頑張ろうとランサーズを利用することを決めました。
ここから実際に5日間利用してみた結果と感想になります。
まず現在の私のランサーズにおける実績とプロフィールはこんな感じです。
はい、意識低すぎですね!プロフィールの入力など全くしておりません!←
まずここで注目したいのが、認証状況です。
4項目あるのですが、ランサーズチェックのみしか行っておりません。
ランサーズチェックは簡単に言えばパソコンは安全に使ってるか、とかメールはちゃんと確認するかとかの項目に回答するものになります。
こちらはweb上で10項目ぐらい回答するだけなのでチェックは済んでおります。
他三つに関しては見ての通り手間が若干かかりそうなので、とりあえず1週間様子を見てから行うことにしました。
ちなみにこの4項目を行わないと、受けることが出来ない仕事がありますので今後行う予定です。
これらを見ると私がランサーズで如何に自分をアピールしていないかわかります(笑)
次に実績になります。
はい、5日間(一日1~2時間弱)で275円稼げました!←
というのはとりあえずの実績上の話で、まだ反映されていない仕事が多くあります。
上の図だと大体15件ぐらいの仕事が承認されて反映されています。
今のところ承認率は100%なので、今終えた仕事がすべて反映されたとしたら大体1000円ぐらいの稼ぎになります。
とりあえずここまでが5日間行った状況です。
かるく評価
-思ったよりタスクの仕事は楽
-空き時間で片手間に出来たので楽
-稼ぎは時給換算したら微妙
-5日間、空いた少しの時間を使って1000円もらえるのは嬉しい
-プロフィールを全く充実させていない割に稼げる(ここ大事!)
思っていたより楽な仕事もたくさんありました。
タスクの仕事は誰でも出来る単純作業がメインなので、youtubeやニコニコ動画を見ながらでもミスさえなければ全く問題ありません。
私の場合、とりあえず承認率100%なのでミスは無いと信じたいです←
また、プロフィールを全く書いておらず、さらに誰にも評価をしてもらっていないにも関わらず作業をこなせて稼げるのは大きいです。
私の場合プロフィールを埋めるだけで疲れてしまいますし、早く作業をしてみたいという気持ちがありました。
ここまでが5日間使ってみての感想です。
まだ割とシステムがわからない部分もあるので、情報交換できる人が居たら嬉しいです。
クラウドソーシング「ランサーズ」
次の記事は2週間ぐらい使ってタスクを増やして、プロフィールを充実させてみて変わったことについて書いてみようと思います。
続きは以下です!