HerokuでSchedulerを使ってPHPで10分おきにサイトにアクセスする

Herokuは無料だけど、1時間位アクセスがないとプロセスがスリープされちゃう。

スリープされたアプリ

スリープされたアプリ(画像下)

そこでSchedulerを使ってアクセスするのが一般的だけど、ググってもほとんどRubyでRakeみたいなことしか書いていないので、PHPでやる方法を調べた。

頻繁に仕様変更してるのか不明だけど、ググって出てくる情報ではタスクが実行されない。

こちらとか http://web-memo-jp.blogspot.jp/2013/01/herokuphplingrbot.html

原因はphpの実行パスとファイルの置き場所。

例では

$ ~/bin/php ~/www/YOURE_FILE_PATH

とあるけど、2014年8月の仕様では

$ php access.php

とターミナルライクな簡単な命令で実行できるようになっている。

ちなみに、自分のaccess.phpの中身はこんな感じ

<?php
$opts = array(
    'http' => array(
        'method' => "GET",
        'header' => "Accept-language: en\r\n"
    )
);
$context = stream_context_create($opts);

$file = file_get_contents('http://APPNAME.herokuapp.com/', false, $context);

?>

file_get_contentsの例文そのまま。

これでスリープされない。

また、

$ php access.php

みたいに実行するとどうなるかは、

$ heroku run php access.php

とすると、Heroku側のターミナルで動かした感じになる。

Advertisements

Digisparkを買って動かすまで

以下の記事

895円の超小型Ardunoクローン DigiSparkを買った(橋本商会)

に触発されてDigisparkを購入。

 

購入リスト

合計4200円(送料込み)

 

届くまで

4/16(水)1:01に注文して、4/17(木)5:07に出荷。

少なくとも4/24(木)18時頃までには(宅配物ではなく)ポストへ郵便物として到着。

内容物の欄には「Electronic Components」と書かれていた。

USPSのトラッキング番号がついて追跡できるけど、以下の状態から動かない。

届いた現在も同じ表示のままなので当てにはできない。

Image

 

内容物

何かステッカーが2枚入っていた。

Image

 

USBポートに挿すとLEDが光る。

Image

 

Disisparkとの通信

http://digistump.com/wiki/digispark/tutorials/connecting

にある通り、ソフトをインストールする。

自分はMac版だったが、同じページの下にある注意書きを見なかったのでハマった。

日本語での解説は以下のページを参考に。

“Minecraft”は壊れているため開けません。”ゴミ箱”に入れる必要があります。

(それにしたって、ゴミ箱に入れる必要がありますとまで言い切っちゃうのもな…)

 

 

IDEの設定

さぁ、通信。の前に設定。

アプリを起動したら以下の様なウィンドウが出るけど、Arduino用なので閉じる。

Image

 

設定箇所は以下の2箇所。

Image

 

Image

 

これで書き込めるようになる。

書き込みボタンを押すと次のようなメッセージが出るので、Digisparkを抜き差しする。Image

 

DigisparkのUSB部分に「rev 4」とあるが、LEDはPin 1にあった。

 

あとは895円の超小型Ardunoクローン DigiSparkを買った(橋本商会)さんのサンプルを参考に。

 

 

【永久保証付き】Arduino Uno

 

 

node.jsでTwitter認証を実現する

しゃもベントカレンダーの4回目くらい。
ネタは尽き気味。

 

今日はnode.jsでTwitter認証をやってみます。

何かしらのサービスを作るときに認証は必須と言っても

過言ではないのではないでしょうか?

それなりに記事は見つかるのですが、Expressのroutesに対応してる

記事があまり見当たらなかった & localhost以外で動いているサンプルが

無かったので書きます。

 

Twitter認証に使用するモジュールは、everyauthです。

対応サービスがめちゃくちゃ多いです。

とりあえず、Expressしましょう。

$ express twitterauth

必要モジュールのインストール。

$ cd twitterauth && npm install

Macだと

$ cd twitterauth && sudo npm install

ですかね?

 

everyauthもインストール。

た だ し !

一点注意!

導入しているExpressのバージョンが3系だとインストールするファイルが異なります。

こちら

にあるように、gitから直接ダウンロードします。

自分の環境ではうまくいかなかったので、git cloneしてからインストールしました。

 

gitが入ってないよ!という方は、ページ上部の

branchをmasterからexpress3に変更してからブランチの変更

ZIPをクリックしてダウンロードしてください。

ZIPからダウンロード

Expressが1または2系の方はいつも通り。

$ sudo npm install everyauth

 

app.jsを編集します。

基本的にはeveryauth内のサンプルを元に改造していきます。

改造元はnode_module > everyauth > example > server.jsです。

その前に、認証時に必要なコンシューマキーを発行します。

こちらから登録可能です。

ログインしたら右上のメニューからMy applicationsをクリックします。

My applications

それからCreate a new applicationで作成します。

名前、説明、Webサイト、コールバックURLを入力します。

名前にはTwitterという文字列は使えません。

Callback URLは開発用なら

http://127.0.0.1:3000/auth/twitter/callback

とでもしておきましょう。実のところ、なんでも良いようです。

ちなみに、localhost:3000だとURL形式じゃないよ、と怒られます。

登録が済んだら、Consumer keyとConsumer secretをメモしておきます。

キーをコピペ

では、app.jsを編集していきます。

早々とコメントを入れるのを諦めたのがバレバレですね

app.js


var express = require('express')
  , routes = require('./routes')
  , everyauth = require('everyauth')
  , everyauthRoot = __dirname
  , path = require('path');

// デバッグ情報がコンソールに流れる
everyauth.debug = true;

// 認証時に使う
var usersById = {};
var nextUserId = 0;

function addUser (source, sourceUser) {
  var user;
  user = usersById[++nextUserId] = {id: nextUserId};
  user = sourceUser;
  return user;
}

var usersByTwitId = {};

everyauth.everymodule
  .findUserById(function (id, callback) {
    callback(null, usersById[id]);
  });

// 認証部分
everyauth
  .twitter // ↓ここにホストネームを入れます ※1 末尾にスラッシュは入れてはいけません
  .myHostname('http://syamoji.gehirn.ne.jp')
    .consumerKey('メモしたキーを入力')
    .consumerSecret('メモしたキーを入力')
    .findOrCreateUser(function (sess, accessToken, accessSecret, twitUser) {
      return usersByTwitId[twitUser.id] || (usersByTwitId[twitUser.id] = addUser('twitter', twitUser));
    })
    .redirectPath('/');

var app = express();

app.use(express.static(__dirname + '/public'))
  .use(express.favicon())
  .use(express.bodyParser())
  .use(express.cookieParser('htuayreve'))
  .use(express.session())
  .use(everyauth.middleware(app));


app.configure(function(){
  app.set('views', everyauthRoot + '/views');
  app.set('view engine', 'jade');
  app.use(express.favicon());
  app.use(express.logger('dev'));
  app.use(express.bodyParser());
  app.use(express.methodOverride());
  app.use(app.router);
  app.use(express.static(path.join(__dirname, 'public')));
});

app.configure('development', function(){
  app.use(express.errorHandler());
});

app.get('/', routes.index);

// サーバの都合上、ポートをこの数値にしていますが、
// お好きな数字に変更してください
app.listen(61175);
console.log('Go to http://syamoji.gehirn.ne.jp');

module.exports = app;

途中で ※1 とした部分がlocalhost以外で実行するときに見逃しやすいポイントです。

続いて、routes/index.js …は編集せずデフォルトのままでOKです。

最後に、jadeファイルに手を加えます。

layout.jade


doctype 5
html
  head
    title  ツイッターで認証
    link(rel='stylesheet', href='/stylesheets/style.css')

  body(style='padding:0')
    block content

index.jade


extends layout

block content
  - if (!everyauth.loggedIn)
    ログインしていません   
    div(style='float:right', id='#twitter-login')
      a(href='/auth/twitter', style='border: 0px')
        img(style='border: 0px', src='https://si0.twimg.com/images/dev/buttons/sign-in-with-twitter-l.png')
    div(style='float:left')
    p コンテンツ
    p なんか色々

  - else

    - if (everyauth.twitter)
      div(style='float:right')
        ようこそ、
        a(href='http://twitter.com/#{everyauth.twitter.user.screen_name}')
          span= everyauth.twitter.user.name
        さん
        p(style='margin:0')
          a(href='/logout', style='float:right') Logout
      認証後にしか見せないコンテンツなど

      p やだ…この紹介文カッコいい…
      p= everyauth.twitter.user.description

      p アイコンもカッコいい…
      p
        img(src='#{everyauth.twitter.user.profile_image_url}')

ご覧いただくとわかると思いますが、

- if (!everyauth.loggedIn)

内がログイン前の処理、else以下がログイン後の処理です。

everyauth.twitter.user

の下にスクリーンネームや最新の発言、プロフィールページの
背景画像のURLなんかも入っているので色々使えると思います。

サンプルページはこちらです。

アクセスするとログイン前のページが見えています。

ログイン前

右上のアイコンをクリックするとTwitterの認証ページへ飛びます。

認証ページ

アプリの権限がRead Onlyなのでつぶやいたりすることはできません。

読み出しのみです。

Twitterのアカウント情報を入力すると…

ログイン後のページ

やりました!

なんかログインしたっぽいページに遷移します。

認証をTwitterに肩代わりしてもらうだけでなく、

Twitterのアイコンなども読み込めるので便利ですね。

 

ちなみにeveryauthでは、各種サービスの他に

独自でID/パスワードを設定して認証することも可能です。

長くなりましたが、どなたかのお役に立てれば幸いです。

npmでモジュールを手動でインストールする

しゃもベントカレンダー3回目。

間が開きに開きまくったけど、なんでいろんな人がリレー形式でやってるかわかった。

一人でやるとしんどいからだ…

 

気を取り直して、今日はnpmのモジュールを手動でインストールする方法。

前回でアーカイブがダウンロードできました。

何のことはない、アーカイブをダウンロードした場所でターミナルから

$ npm install ./express-3.0.3.tgz

とすれば良いだけです。

なぜこんな面倒くさい方法を取るかといえば、

Proxy環境下でnpmコマンドでダウンロードできなかったからです…

同様にEmacsのauto-installも出来ませんでした。

こちらの記事にあるように、

$ npm config set proxy='yourProxy:port'
$ npm config set https-proxy='yourProxy:port'

をやったり、

ユーザID:パスワード@Proxy:port

をやったりしたけどだめだった…

 

で、手動でインストールするのは良いけど、面倒なのが

依存モジュールのインストール…

これは深さ優先探索でこつこつインストールして行きましょう…

しかし、ときどき最新版をインストールしたのにも関わらず、

モジュールのページへアーカイブを取りに行こうとする場合があります。

これは、インストールしようとしているモジュールのpackage.json内で

依存モジュールの要求バージョンが

latest

になっているからです。

これを回避するためには、インストールするモジュールのアーカイブを

一度解凍/伸長し、package.jsonをテキストエディタ等で開いて

latest

となっている部分を、最新バージョンにでも書き換えた後に、

再びtgzで圧縮し直すとインストールすることができます。

 

さて、次からは実際にコードを書いて行きたいけど…

続くかな…

npmで落とすモジュールファイルの場所

しゃもベントカレンダー2回目

さっそく一日サボってしまった…

今日はnpmでダウンロードしてくるモジュールファイルがどこにあるかです。

と言っても、npm install モジュール名で出力されるログに書いてあるので

ただの手抜きです。

例えばexpressだとすれば

https://npmjs.org/

でexpressを検索すると

https://npmjs.org/package/express

にたどり着けます。

Versionの欄を見ると、 3.0.3です。(2012/12/04現在)

ですので、

https://registry.npmjs.org/express/-/express-3.0.3.tgz

にファイルがあることになります。

https://registry.npmjs.org/モジュール名/-/モジュール名-バージョン.tgz

がファイルの在処です。

ちなみに、alpha版、beta版、RC版などはそれぞれアドレスの末尾が

3.0.0alpha4.tgz

3.0.0beta4.tgz

3.0.0rc4.tgz

となります。

さらにちなみに、expressは2.5.9の次に3.0.0へと移行したので、存在しない2.6.0を指定する( https://registry.npmjs.org/express/-/express-2.6.0.tgz )と

{“error”:”not_found”,”reason”:”Document is missing attachment”}

ファイルが無いよ!というJSONが帰ってきます。

これを利用して、次回はnpmで配布されているモジュールを手動で

インストールする方法を紹介します。

しゃもベントカレンダー1

イルミネーションに無関係な世間はアドベントカレンダー一色なので

ネタが続く限り書いてみよう。ジャンルは自分がやったこと全般。

まずはWordPressについて。

アドレス欄を見てもらったらわかるけど、WordPress.comです。

サーバインストールのWordPressが有名だけど、実は

ライブドアブログとかはてなダイアリーのように、

レンタルのブログシステムもあるんです。

http://wordpress.com/

から登録可能。

登録にあたって必要な情報は

メールアドレス・ユーザネーム・パスワード・ブログのアドレス

の4つ。

無料版の制限は

  • ドメインが ユーザ名(変更可能).wordpress.com 固定
  • 容量は3GBまで
  • 広告が入る(しかし無料版でも広告が入っているように見えないが…)
  • フォントや色合いの変更、CSSの編集ができない
  • HD動画がアップロード出来ない

となっているようです。

サーバにWordPressをインストールする前にちょっと試してみる、

くらいの用途にはぴったりではないでしょうか?

自分で用意したサーバにインストールすれば、

上記の制限が無いWordPressが手に入ります。

 

なおサーバインストール版のWordPressは
http://ja.wordpress.org/
から入手できます。