Entertainer Engineering

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

画像処理ライブラリRCairoをインストールした話

こんにちは、かびさん@あおかびんです。

PCをお引越ししたので、まえのPCに入っていた設定が使えなくなりました。
学校の課題(?)で画像を自動生成するためにRCairoというツールを使っていたのですが
引越しで使えなくなったので、再インストールすることにしました。

以下が手順です。

まず、xquartzをインストールする必要があるので、brewでインストールします。

brew install Caskroom/cask/xquartz

その後、brewでcairoをインストールします。

brew install cairo

そして最後にGemでcairoをインストールします。

sudo gem install cairo

これでRCairoが使えると思うので、
rcairoサイトで提供しているhinomaru.rbをコピーして使ってみましょう。

require 'cairo'

format = Cairo::FORMAT_ARGB32
width = 300
height = 200
radius = height / 3 # 半径

surface = Cairo::ImageSurface.new(format, width, height)
context = Cairo::Context.new(surface)

 # 背景
context.set_source_rgb(1, 1, 1) # 白
context.rectangle(0, 0, width, height)
context.fill

# 赤丸
context.set_source_rgb(1, 0, 0) # 赤
context.arc(width / 2, height / 2, radius, 0, 2 * Math::PI)
context.fill

surface.write_to_png("hinomaru.png")

ファイルを保存したら、

ruby hinomaru.rb | open hinomaru.png

で実行後に日の丸画像が開いたらOK!

rcairoは気軽に画像扱えるからいいですよね、僕のPCだと重かったけど。

以上、あおかびんでした。

C言語で探索用のランダムな数列を作った話

こんばんは、かびさん@あおかびんです。

学校の課題で並列分散処理を行うために、
数列の探索をしようという話になりました。

そのために、100万のランダムな数列を作り出す必要があったので
その数列を最初にNode.jsで書こうと思ったらすごく遅い・・・。

アルゴリズムが良くないのかもしれませんが、5時間かかっても終わりませんでした。

そこでC言語で100万のランダムな数列を作ったらすぐ終わったので
その方法を書いておきたいと思います。

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define N 1000000

void shuffle(int ary[], int size);

int main(void)
{
	int i = 0;
	int j = 0;
	int arr[N];
	int shf[N];
	int index;
	int length = 0;
	srand((unsigned)time(NULL));
	
	for(i = 0; i < N; i++) {
		arr[i] = i;	
	}

	shuffle(arr, N);

	for(i = 0; i < N; i++) {
		printf("%d\n", arr[i]);
	}

	return (0);
}

void shuffle(int ary[], int size) {
	int i;
	for(i = 0; i < size; i++) {
		int j = rand()%size;
		int t = ary[i];
		ary[i] = ary[j];
		ary[j] = t;
	}
}

shuffle関数の中で、
先頭から順にランダムな位置にある数字とスワップしている感じですね。

400万でやろうとしたら、スタック領域が足りず、実行できませんでした。。。
何かいい解決方法があるといいんですが。。。

ちなみに標準出力をcsvファイルに書き込むと、改行でわかれたデータを書き込めます。
svファイルかな?(知らんが)

以上、あおかびんでした。

ParseでMoment.jsとMoment-timezone.jsを使った話

こんばんは、aokabinです。

Parse使うときに、タイムゾーン合わせたりしたいですよね。

そんな時にMoment.jsとMoment-timezone.js使おうとしたのですが
なんかちょっとうまく行かなかったのでその対処法を残しておきます。

以下はMoment.jsとMoment-timezone.jsへのリンクです。

Moment.js | Home
Moment Timezone | Home

まず、上の2つをDLしましょう、念のため大きなサイズのファイルをとってきました。

DLしたらcloudディレクトリに入れました。

その後main.jsで、requireしましょう。

var moment = require("cloud/moment-timezone.js");

多分このままではバージョンが古いと怒られるので

moment-timezone.jsで

require('moment');

と書かれているところを

require('cloud/moment.js');

に変更しましょう。
これで準備OKです。

やってみましょう。

Parse.Cloud.define("momentTest", function (request, response) {
  var moment = require("cloud/moment-timezone.js");
  response.success(moment().tz("Asia/Tokyo").format());
});

として、curlで確認。
ちなみにcurlでプロキシサーバーを通したいときは

--proxy http://プロキシサーバー:ポート

とするとプロキシサーバーを経由させることができます。

というわけで、curlしてみてください、多分出来ると思います。

Parseで自作のUserクラスを参照できなかった話

どうも、aokabinです。

Parseという便利なサービスがあるのですが、
その中のCloud Codeという機能の中で、自作のUserクラスを参照できなかったので
その対策↓

Parse.User.allowCustomUserClass(true);

これで、カスタムUserClassが使えるようになります!

見つけるのに3時間くらいかかった。

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

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

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