Entertainer Engineering

人を楽しませられる技術者を目指すあおかびんのブログ

Node.jsのExpressの中でPOSTリクエストを受け取ろうと詰まった話

こんばんは、毎度おなじみaokabinです。
なかなかブログ読んでくれる人増えないですねー、周知していないからだと思いますが。

さて、タイトルにあるように、Node.jsのExpressを使って開発を進めているのですが
POSTリクエストがどうもうまく通らなくて3時間くらい使っちゃったので
忘れないうちにメモを取りたいと思います。

最近使い始めたのでExpress自体よくわかっていないのですが、まぁなあなあで。

流れとしては以下の様な感じ
1.app.js内部に書くもの
2.routes/以下のjsファイルに書くもの

1.app.js内部に書くもの
expressコマンドでテンプレートを書き出した際にapp.jsはできていると思うのですが、そこに幾つかの項目を書いていきましょう。
今回はroutes/test.jsというファイルがある事を想定して書いていきたいと思います。

app.jsの中のroutesとかusersとかの下に、以下を記述しましょう。

var test = require('./routes/test');

続いて、POSTリクエストを受け取るのに必要なのがコレ

app.use(bodyParser.urlencoded({extended : false}));

コレを記述する事で、2で書く書き方で取り出す事ができます。

そして、忘れないように

app.post('/test', test.post_test);

これは/testにアクセスしたときにtestのpost_testというfunctionが呼び出されるという記述になります(多分)

続いて2では、このpost_testメソッドを作っていきましょう。

2.routes/test.jsに書くもの
POSTデータの受け取りは以下のような感じになります。
例えば、name=aokabinというようにデータをPOSTしている場合

exports.post_test = function(req, res){
 console.log(req.param('name'));
 res.send(true);
};

というように記述すると、nameに入ったaokabinというデータが出力されると思います。

コレを探すのに時間がかかったというのはちょいと苦労がありましたが、何とかなってよかった…。
今度はasyncについて書いとかないと忘れそう。

何かコメントがありましたら、随時募集しておりますので、気軽にどうぞー。

追記
これ最近のはデフォルトで入っているんですね、知らなかった…

Rails4.1.6でbootswatchを導入したときにSSLエラーで詰まった話

こんばんは、aokabinです。

現在卒業研究でRails4.1.6を使ったアプリケーションを作ろうと思っているときに、bootswatchのcosmoを導入しようとしたのですが、importをするときに謎のSSLエラーに巻き込まれていました…


Ruby on rails4系でBootstrap系のthemeを使うときに詰まった - Entertainer Engineering

こちらに書いてあるように、importって何やねん…となっていました。
実は上の記事でもcosmoを導入していたつもりだったのですが、デフォルトのbootstrapしか適用できていない事が判明しまして…申し訳ありません。

さて、上記の記事にも書いてあるようにimportをしていた際にエラーが吐かれていました。

エラーログは割愛しますが、

OpenSSL::SSL::SSLError SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed

こんな感じのエラーが吐かれました。
ショックがハンパじゃなかったですね。

という訳で対策を書いていきます。

CA証明書を参照できるようにする

SSLエラーで言われているのは、とにかく”証明書が参照できねえよ!”ということらしいので、参照できるようにしてあげればいいわけです。

irbコマンドで、opensslが参照している証明書の場所を確認してみましょう!

irb
> require 'openssl'
> p OpenSSL::X509::DEFAULT_CERT_FILE
"/opt/local/etc/openssl/cert.pem"

すると、cert.pemへのパス情報が表示されると思います。(今回のパス情報は一例です)
そのパスをコピーしておきましょう。

そして、証明書がちゃんと存在しているかをcatコマンドで確認してみましょう。

cat /opt/local/etc/openssl/cert.pem

もし何もなければ、それは証明書を参照できていないので、cert.pemを用意してあげる必要があります。(それ以外の問題でしたら、ちょっとわかりません、ごめんなさい)

先ほどのパス(上記の場合/opt/local/etc/openssl)へと移動して、cert.pemをDLしましょう。

cd /opt/local/etc/openssl
sudo wget http://curl.haxx.se/ca/cacert.pem
sudo mv cacert.pem cert.pem

もしwgetでDLできなければ、curlやらscpやらを使ってなんとか/opt/local/etc/openssl/の中にcert.pemを入れこんであげましょう。

ねんのためcatでファイルの存在を確認

cat /opt/local/etc/openssl/cert.pem

コマンドを実行した後に、暗号化された文字列が表示されたらおそらくopensslから証明書を参照する事ができていると思います。
できていなければもう一度手順をやり直してみてください。

さて、この状態でbootswatchを試してみましょう。

rails new cosmo
cd cosmo/
vim Gemfile

Gemfileをエディタで開いたら

gem 'libv8', '~>3.11.8.13'
gem 'twitter-bootswatch-rails', '~> 3.2.0'
gem 'twitter-bootswatch-rails-helpers'
gem 'execjs'
gem 'less-rails'

これらを書き込んで上書き保存。(vimなら :wq)

bundle install #エラーがでない事を確認
rails g bootswatch:install cosmo
rails g bootswatch:import cosmo
rails g bootswatch:layout cosmo

これでテンプレートが出来上がったかと思います。

実際に出来上がっているかを確認するため、
app/views/layouts/のcosmo.html.erbをindex.html.erbに改名、そして

rails g controller layouts

を実行
config/routes.rbファイルを開いて

resources :layouts

を記述、最後に

rake routes
rails s

これでhttp://localhost:3000/layoutsにアクセスしてみましょう。
f:id:aokabin:20140918112246j:plain
このような画面が表示されていればおkです!

しかしこの間は間違った記事を出してしまった事を深く反省しております。

これでうまくいったり行かなかったりしたらコメントいただければ幸いです!

Ubuntu(多分Linuxも)サーバー起動時にShell Scriptを動かす話

こんばんは、aokabinです。

この記事が移設1号目の記事でございます。
閲覧ありがとうございます!

さて、Ubuntuサーバーを起動したと同時にShellScriptを実行したい時ってありますよね。
そんな時に使える方法を見つけたのでこちらに書いていきます。

まずはvimemacsといったエディタを使って

vim /etc/rc.local

のファイルの中身を見てみましょう!

このrc.localというファイルは、サーバー起動時に実行されるスクリプトになります。
このファイルのなかには普通にShellScriptを書く事ができますので好きなように記述してください。
このファイルの末尾にあるexit 0(だったかな)の上に書くようにしてくださいね。

で、僕は毎回毎回チェックの旅にサーバーをリブートさせてたのですが
どうやら

sh /etc/rc.local

で実行確認できるみたいですね…中で別のShell Scriptだけが起動確認できなくて苦労しました。

シェルスクリプトのchmodも忘れないようにしてください。

あと、rc.localで起動するプログラムはchmodなら

/bin/chmod +x hogehoge.sh

というように起動しないと、ちゃんと起動しない事があるみたいです。

今日はこれで結構時間取られたので、忘備録的に残しておきます。

Ruby on rails4系でBootstrap系のthemeを使うときに詰まった

どうも、こんにちはaokabinです。

二日間位railsにCosmoのデザインテンプレートを導入するのに苦労したので、備忘録として残しておきます。

事前準備として、

rails new testapp --skip-bundle
cd testapp/

というようにrailsアプリケーションを作って、作業ディレクトリに移動しておきましょう。
加えて、Gemfileの下の方に

gem 'twitter-bootswatch-rails', '~> 3.2.0'
gem 'twitter-bootswatch-rails-helpers'

の2つを記述しておきましょう。

詰まった点
1.therubyracerとlibv8のバージョンのいざこざ
2.bootswatch:importで毎回転ける

1.
gemでtwitter-bootswatch-railsとかhelperとか書いていると、作ったばかりのrails appではbundle installで転けてしまいます。
なんかtherubyracerがねえよ!とか言われるので、Gemfileに

gem 'therubyracer', platforms: :ruby

コメントアウトを外して再bundle install

bundle install

すると今度はlibv8がねえよ!このバージョンな!と怒られました。

gem 'libv8', 'そのバージョン'

と書いてbundle installすると

libv8がねえよ!このバージョンな!

は?いや、指定しとるやんけ!

こちらのサイトによると

therubyracer 0.11.0 問題まとめ - 自称すーじー。

どうやらtherubyracerとlibv8には互換性が微妙なところがあるらしく、どちらかのバージョンをちゃんと指定しないといけないらしい。

しかも、railsのエラーで言われたバージョンじゃダメらしい、頼むぜぃ。

今回はlibv8のバージョンをそろえるようにしましょう。

gem 'therubyracer', platforms: :ruby
gem 'libv8', '~>; 3.11.8.13'

ということでbundle installするとエラー無く通りました!
本当はもっといい方法があると思うんですがね…
いい方法あったらおしえてください。。。

別のパターンでnokogiriがねえよとか色々と怒られた覚えがあるけど、何かあればコメントでも残して頂ければ幸いです。

とりあえずbundleのエラーは解消されたという風にしておきましょう。

2.
さて、bundle installが通ったのでbootstrapデザインテンプレートを導入していきたいと思います。
次のサイトの2番を参考にして書いていきましょう。


ひと味ちがうTwitter Bootstrapの18個の無料テンプレート&有料まとめサイト - 酒と泪とRubyとRailsと

rails g bootswatch:install readable
rails g bootswatch:import readable
rails g bootswatch:layout readable

すると、bootswatch:importで謎のSSLエラーが発生します。
僕もこのSSLエラーを解消しようと色々調べたのですが、もうimportいいやという結論に至りました。
これもまたいいやり方あったら教えてください。

というわけで手順(使用するテンプレートはCosmo)

rails g bootswatch:install cosmo
rails g bootswatch:layout cosmo

layoutを実行してconflictが出てくるかもしれませんが、そういう時はとりあえずyとEnterの交互連打でなんとかなりました。

これで testapp/app/views/layoutsの中に
application.html.erbとcosmo.html.erbが出来上がるかと思います。
cosmo.html.erbはindex.html.erbにリネームしておいてください。

コレをちょっと検証するために、scaffoldを使って適当なアプリケーションページを作りましょう

まず最初にconfig/initializers/assets.rbに次の1文を追記してください。

Rails.application.config.assets.precompile += %w( cosmo.* )

そして次にlayoutsのcontrollerを作りましょう。

rails g controller layouts

そして最後にconfig/routes.rbにルーティング情報を書き込みます。

resources :layouts

rake routesも忘れないようにしておきましょう。

rake routes

さて、rake routesが終わったら実際に動かしてみましょう。

rails s

http://localhost:3000/layoutsにアクセスして

f:id:aokabin:20140912231727p:plain


このような画面が出てきたら成功です!

いやー疲れた。importって一体何だったんだろう…?

therubyracerとimportの問題について知っている人が居ましたら教えて頂けると幸いです。

AWSでなんとかASP.NETを動かそうと奮闘した話

こんばんは、aokabinです。

今回はAWS使って何とかASP.NETを動かそうと奮闘しておりました。

えー結果から言いますと、AWSLinuxではなくUbuntuを使う事にしました。

サイトで書いてあるCentOSのパッケージリポジトリのURI404だもんで…
こればかりはどうしようもありませんでした…

最初は此方のサイトを参考にしていたのですが
Mono×LinuxASP.NET MVCを動かすまで
AzureのCentOSだとAST.NETの起動でつまり
AWS Linuxだとそもそもmakeが通らなかったりと
よくわからない問題がありましたので、やめました。すみません。

というわけでUbuntuで実行した話を進めていきたいと思います。
とはいえUbuntuでの進め方は公式サイト(http://www.mono-project.com/docs/getting-started/install/linux/)に書いてあるので、そちらを参考にしても全然できると思います。

まずは環境を整えるために
1.AWSUbuntuインスタンスを起動
2.建てたUbuntuサーバーにSSHで接続
というところまでやっておいてください。

入力するコマンドはこんな感じ

sudo su
wget http://download.mono-project.com/repo/xamarin.gpg
apt-key add xamarin.gpg
echo "deb http://download.mono-project.com/repo/debian wheezy main" > /etc/apt/sources.list.d/mono-xamarin.list
apt-get install mono-devel mono-complete

1.管理者権限でログインして
2.xamarin.gpgファイルをダウンロード
3.そしてapt-keyでxamarinのパッケージを認証
4.mono系のパッケージダウンロード先をmono-xamarin.listに登録(多分)
5.mono実行に必要なmono-develとmono-completeをインストール

これでできると思います。

確認のために、ASP.NETのファイルを適当に作成して、ファイルがあるところでxsp4を実行してみてください。

テスト用ファイル

<%@ Page Language="C#" %>
<html>
    <head>
        <title>Test Page</title>
    </head>
    <body>
        <h1>Hello aokabin!</h1>
    </body>

実行コマンドライン

xsp4

実行できましたら、ブラウザでhttp://DNS:8080/ファイル名.aspxにアクセスすると、画面にHello aokabin!の文字が表示されているかと思います!
ちなみにこのとき、AWSでセキュリティグループに8080ポートの開放をするようにしてください!

明日はMVCの方で実行してみます。うまく動くといいんだけどなぁ。

うーん、CentOSで実行できないのがなぁ…
うまく動かせるようであれば教えてください!!

以上aokabinでした!

XamarinのASP.NET MVCフレームワークを使ってWeb APIサーバーを作った話

どうもこんにちは、aokabinです。

今回はXamarinのASP.NET MVCフレームワークを使ってWeb APIサーバーを作った話をしたいと思います。(タイトルのまんま)

しかし資料が少なすぎて非常に困った。

Xamarinをインストールして、開発環境が整っている事前提で話を進めていきたいと思います。

手順としてはこんな感じ↓
1.XamarinでASP.NET MVC を選択してプロジェクトを作る
2.ハンドラーの作り方というか付け方と言うか
3.POSTで受け取ったデータをJson形式でデータを返す

1.
これはそのまま描いてあるように、

Xamarinのファイル>新規>ソリューション

にてC#の欄からASP.NETの「ASP.NET MVC Project」を選択してプロジェクトをクリエイト。
すると色々なファイルやらフォルダやらがまとめて出て来るかと思います。
とりあえず、この時点で一回実行してみましょう。

もし、System.Web.Mvcがうんたらというエラーが出てきたら、
Project名(master)>Project名>参照>From Packages>System.Web.Mvcのところにカーソルを持っていき、パッケージの左側にある歯車ボタンをおして、「最新の状態に更新」を選んでおきましょう。

他のでエラーが出ているならそれを更新してみましょう。
更新してもダメならもう一回だけプロジェクトを作り直して更新し直して見てください。
それでは次に再生ボタンを押して実行してみましょう。

うまく実行できたらブラウザが立ち上がって、簡単なHTMLが表示されるはずです。
ここまできたら次にいきましょう!

2.
ハンドラーというのは、URIでリクエストを送るときに使われる
http://hogehoge.com/こことか/そのまたこことか/index.html
のことですね、多分。

その辺りを設定するために、一度確認しておきましょう。

Xamarinのソリューションビュー部分から「Views」というものを探し出してみてください。その中に「Home」というフォルダがあって、「Index.aspx」というファイルがあるはずです。
それでは、プログラムを実行して、立ち上がったページのURIに/Home/Indexと追記してみてください。(http://127.0.0.1:8080/Home/Index)

すると、遷移する前と同じ画面が表示されたかと思います。

どうなっているのかを説明するために、次はソリューションビューの中から「Controllers」というフォルダを探してください。
そこには「HomeController.cs」というファイルがあるかと思います。その中身を見てみると、次のようなソースコードが見つかるかと思います。

public ActionResult Index () {
    var mvcName = typeof(Controller).Assembly.GetName ();
    var isMono = Type.GetType ("Mono.Runtime") != null;
    ViewData ["Version"] = mvcName.Version.Major;
    ViewData ["Runtime"] = isMono ? "Mono" : ".NET";
    return View ();
}

実は、このIndex()という関数がHome/Indexで呼ばれるハンドラーとなっていた訳です。
ちなみに、このHomeというのは、ControllerのクラスであるHomeControllerクラスに属するという意味(たぶん)です。

それでは今回はこのIndex関数をPostリクエストからJsonデータを返すようにいじってみましょう。

3.
先ほどのIndex関数の上に[HttpPost]を追記してみましょう。
続いてActionResult→JsonResultに変更。
POSTリクエストで受け取った値は、次のような関数で受け取る事ができます。

string name = Request.Form.Get("name");

これはname変数の中に、POSTリクエストで受け取ったinputのnameが"name"のものの値を入れる、という意味です。(ややこしい)
ここでaokabinは、一度string型でJSON形式っぽく書いてreturnさせています。しかし、絶対もっといいやり方があると思う。

string returnJson = "{name : " + name + "}";
return Json(returnJson);

こんな感じのコードになります。

[HttpPost]
public JsonResult Index () {
    string name = Request.Form.Get ("name");
    string returnJson = "{name:" + name + "}";
    return Json(returnJson);
}

最後のJson(returnJson)は、結果をJson形式にキャストするという関数になります。たしか、Json.NETとかのパッケージを入れなきゃいけなかったかもしれない。

パッケージの入れ方は調べれば出てくるんですが、プロジェクト>Add Packagesを選んで、トグルがOfficial NuGet Galleryになっていれば、検索ボックスから検索してAdd Packageできると思います。

そんなトグルがなければ、一番したまでスクロールして、パッケージ>Sourcesを選択して、追加:名前「Official NuGet Gallery」、URL「https://www.nuget.org/api/v2」にしてAdd Sourceして、念のためXamarinを再起動してください。うまくいっていればプロジェクト>Add Packagesを選ぶとOfficial NuGet Galleryが出てきているはずです。

うまくいってなければググってくだされ。

Viewsが無いからPostできないじゃん!
という方のために、以下のコマンドをご用意致しました!

curl -F "name=YourName" http://localhost:8080/Home/Index

よかったらterminal開いて打ち込んでみてください。
いい結果が得られる事を期待しています!
というわけで、ASPAPIサーバー作りでした。

それではまた。

bundle installが通らなくて困った話

どうもこんにちはaokabinです。

railsを使ってドットインストールのチュートリアルをやろうと思ったところ

rails new myapp

を実行したところ

To eliminate this warning, please install libyaml and reinstall your ruby.

こんなエラーが出てきました。

libyamlがないならinstallしてやろうと思い、

brew install libyaml

を実行したところ

Warning: libyaml-0.1.6 already installed

おいお前入っとるやないけ!!

ふとrubyのバージョンが悪いのかとおもいrbenvで入っているモノを色々いじっていると、チュートリアルで使っている2.0.0-p247をinstallしたときにyamlをinstallするような動きを始めました。

んで、installが終わったところでバージョンを変えずに(使用時のバージョンは2.0.0-p451)でbundle installしたところ動きました…。

さっきまで入ってたyamlは一体…?

とりあえずメモ