ツタンラーメンの忘備録

プログラミングや精神疾患、ラーメンについて書いていきます。たぶん。

node.jsでmongodbを使ってherokuにデプロイした

激しく苦戦したのでメモがてらに書いておく

まずはheroku上でmongodbが使えるようにする。
ためにクレジットカードをherokuに登録する必要がある。いやだね、これ。

そしたら

heroku addons:create mongolab:sandbox

コマンドを打ち込む。
公式だと手順が一つ前にあるけど、最初なのですっ飛ばす。

heroku config

でMONGOLAB_URIがゲットできる。

あとはこれをmongoのconnectのところに書けばいい。

krdlab.hatenablog.com
ここがわかりやすかったので、丸コピする。動いているか確認するためにちょっとだけ、createServerする。コード全体は下記

var mongoose = require('mongoose');
var Schema   = mongoose.Schema;
var UserSchema = new Schema({
  name:  String,
  point: Number
});
mongoose.model('User', UserSchema);
//var db_uri = 'mongodb://localhost/hogehoge';
var db_uri = "さっき得たやつ";
mongoose.connect(db_uri);
var http = require('http');
http.createServer(function (req, res) {
  res.writeHead(200, {'Content-Type': 'text/plain'});
  res.end('Hello World\n');
}).listen(process.env.PORT || 8000);
console.log('Server running');

var User = mongoose.model('User');
var user = new User();
user.name  = 'Hungry';
user.point = 2586;
user.save(function(err) {
  if (err) { console.log(err); }
});

User.find({}, function(err, docs) {
  if(!err) {
    console.log("num of item => " + docs.length)
    for (var i = 0; i < docs.length; i++ ) {
      console.log(docs[i]);
    }
    mongoose.disconnect()
    process.exit()
  } else {
    console.log("find error")
  }
});

うーん、まさに何も考えていない。とりあえず、
Procfileを作ったら、とりあえずデプロイ。
usernameとpasswordを聞かれて、正しいのを入力しているのに、ちゃんと通らなかったらぐぐれば出た。(URL忘れたけどheroku authみたいなので出てきたキーをusernameを空欄にしてパスワードに入れれば、できる)

たまにProcfileをpushし忘れて動かなくなったりする。そういうのにすぐ気づけるようになりたい。


さて、これで当然heroku openすればサイトに飛ぶと思った。

Application Error

logを見るとどうやら、データベースにはちゃんと保存できているらしい。
すごいなやんだすえ

process.exit()
process.exit()

process.exit()

このコードは探索が終わると、落ちるようになっているのである。
人のコードを丸コピするのではなく、ちゃんと考えて使えというよい教訓になった。

javascriptについて

qiita.com

これを読むとけっこう衝撃的なことが書いてある。
javascriptはなんとなく曖昧な感じでとっつきやすいが共同開発に向かない印象がある。
一人で書く分にはいいが、人と共同で書くと

var functionName = function(data){
  console.log('hogehoge');
};

function functionName(data){
  console.log("hogehoge");
}

みたいに違いが出てきて腹が立ちそうなところである。
予め意思統一をしておいた方がいい。

初心者がopenframeworksでclassを使う時の話

openframeworksでclassを使いたいことが当然あるわけだが、そんなときは下の記事に従って作っていけばいい。

openFrameworks.jp


ただちょっと賢くなった気がして、ヘッダファイルの中で一部をprivateに入れると動かなくなります。上の例だと

class ofBall{
  private:
    ofBall();
};

当たり前ですね。
ちなみに新しく作ったclassの中で

w = ofGetWidth();

とやっても1024が代入されます。
おそらく初期値なのではないかと思います。これこまった…。

node-oscでopenframeworksと通信した

iOSとnode.jsからデスクトップのopenframeworksにosc通信しました。普通に何の特別なことはなくて、資料も無限に転がっているのでここで書くこともないんだけど、前に少し気になったのでメモがてらに。

receiver1.setup(PORT);
receiver2.setup(PORT);

みたいに別のところからくるデータを同じポートで受信すると、うまくいかない。少なくともうまくいかなかった。

あと
node-oscにおいて、一つのアドレスに対して複数の数値を送るには

oscclient.send('/node/raw', this.raw.x, this.raw.y, this.raw.z);

みたくする。

しかし、node-oscは三行でデータが送れて便利だ。というかosc通信が便利。

johnny-fiveでコンパスの生データを得る(get raw data of compass)

普通には得られなさそうだったので、ライブラリの方を書き換えました。
今本家にはissueしています。できたのに、自分の調べが甘いだけだったら申し訳ないのだけど…。

とりあえず、johhy-fiveとは
node.jsでArduinoを制御できるライブラリです。
github.com
これね。使い方は簡単なんだけどarduinoに慣れていると、けっこう使い方にとまどうかもしれません。普通にarduinoでやればいい内容だったんだけど、ちょっと試してみたくなったので。

で、使い方は他のところのほうが詳しいので省略します。
JavaScriptとArduinoではじめるIoT入門 〜Johnny-Fiveを使ってみる〜 | 電子工作部
node.jsとjohnny-fiveを使って、JavaScriptでarduinoを操作してみる - 株式会社ネクスト エンジニアBlog
Johnny-Fiveでマイコン制御21 - コンパス・ジャイロ・GPS - 電子部
かなり簡単。

使い方は

npm install johnny-five

で使える。

どんなコードを書いたかというと

var five = require('johnny-five');
var board = new five.Board();

board.on("ready", function(){
   var magnetometer = new five.Magnetometer({
     controller: "HMC5883L",
   });
   magnetometer.on("data", function(){
     console.log('heading', Math.floor(this.heading));
     console.log(this.raw);
   });
});

Magnetometer使わなくてもCompassを使えるし、そっちの方がスッキリするかもしれない。
とにかく

console.log(this.raw)

はundefindedとなる。悲しい。公式には得られそうな感じに書いてあるのに。
で、かなり調べた挙句、結局得られなさそうだなと思ったので、ライブラリ(モジュール)を書き換える。
currentDirectory\node_modules\johnny-five\lib

compass.js
を開いて

    heading: {
      get: function() {
        return this.toScaledHeading(raw);
      }
    }

こんな感じのが真ん中より下の方に有る。
それの上くらいに

      raw: {
          get: function () {
              return raw;
          }
      },

これを挿入する。

そうすると得られるようになる。
やったー!

node.jsとnode-twitterでオウム返しボットを作る

この記事は16/12/27に書かれています。
いろいろ調べたんだけど記事が古くて、若干そのままだと動かないので。

tips.hecomi.com
基本的にはこの記事のコード。

var twitter = require('twitter');
const BOT_ID = 'MY_BOT_ID';

var bot = new twitter({
	consumer_key        : 'xxxxxxxxxx',
	consumer_secret     : 'xxxxxxxxxx',
	access_token_key    : 'xxxxxxxxxx',
	access_token_secret : 'xxxxxxxxxx'
});

bot.stream('user', function(stream) {
	stream.on('data', function(data) {
		var id        = ('user' in data && 'screen_name' in data.user) ? data.user.screen_name : null;
		var text      = ('text' in data) ? data.text.replace(new RegExp('^@' + BOT_ID + ' '), '') : '';
		var ifMention = ('in_reply_to_user_id' in data) ? (data.in_reply_to_user_id !== null) : false;

		if (!ifMention || id == BOT_ID) return;
		var msg = {
                  status: '@' + id + ' ' + text,
                }; //ここがちょっと違う
		bot.post('statuses/update', msg , function (error, tweet, response) { //ここもちょっと違う
			console.log(tweet);
		});
	});
});

だいたいそのままで動くのですが、ちょっと違っているので、メモとして。