月別アーカイブ: 2014年4月

Perl入学式 #1 に参加してきました #Perl入学式

おがた (@xtetsuji) です。

2014年4月26日(土曜日)に行われた「Perl入学式in東京#1」に参加してきました。サポーターや講師側での参加です。

カレンダーを見ると、昨年度(2013年度)の「in東京#2」からサポーターとして参加していたのですが、今まで参加したというブログ記事を書いていなかったなーと思って、ちょっとでも感想を書いてみようと思った次第です。

昨年度のPerl入学式もサポーターとしてだいたい毎回参加していて、そこで得られた様々な人との貴重な出会いや知見などもまとめたいと思ってはいるのですが、それはまたの機会にします。長くなりそうだから。昨年度は本当に貴重な体験でした。

今回はサポーターだけでなく、より運営側に近い側で作業させてもらい、資料作成や後半の講義まで行いました。特に資料作成は想像以上に大変で、これを前2年間、校長を含む数人だけで回していたことを考えると、もっと運営側にコミットして助けていかないとなーと思った次第です。

Perl入学式の歴史

適当なことを書いているかもしれませんが、だいたいこんな感じです。

  • 2012年度に大阪で @__papix__ 校長がプログラミング初心者向け勉強会として開始。当時は毎月合計12回のペースだったらしい。
  • 2013年度は大阪の他に東京でも行われる。毎月から隔月合計6回のペースになり、in東京では各月の次月は同じ内容を話す「補講」が行われて、用事で来られない人向けの体制となった。当時大学院生である @__papix__ 校長が自腹で毎月大阪から上京していたというのは結構驚かれる話。
  • 2014年度はJPAの支援も受けつつ、福岡でも開催され、東京・大阪・福岡という三大都市での開催となる。この最初の「Perl入学式 in東京 #1」が先日2014年4月26日にありました。

そういえば今回、Perl入学式とは…といった部分のスライドも自分が書いたんでした。途中からサポーターで入った自分が書いてもいいものかなと思いながら書きましたが、校長チェックは通ったので、大きく間違ったことは書いていなかったと思います。

Perl入学式の体制

前年度までを踏襲して、今年度も以下のような感じになっています。

  • 講師:in東京であれば、だいたい @__papix__ 「校長」。他の都市は別途校長に依頼された人が担当する
  • 運営:グループウェア上で開催日時や会場の議論をしたり、資料を書いたりする人達
  • サポーター:当日会場内をまわって分からない人の個別サポートをする人達
  • 受講生:来てくださる方々

講師も運営もサポーターも有志で結成されていて、原則的に手弁当でやっています。また、パソコンを持ち込んでもらう必要がありますが、受講者(生徒)の皆さんの参加費は無料です(懇親会費は有料です)。パソコンを持ち込んでもらうのは、パソコンの貸出の手間やコストというよりも、学習環境を持ち帰って自習してもらいたいという考えのほうが先立っています。

運営・サポーターは何を目的に毎月手弁当で無料勉強会をやっているのか疑問に思う人もいるかもしれませんが、だいたいの人達がPerlコミュニティの促進だったり、Perlプログラマの育成といったことに大きな興味を持って集まっているわけです。とかくPerlは古いと揶揄されることも多い中、学びやすい言語であることも確かで、そういうことを伝えていきつつ、Perlの雇用促進までつなげていければいいなという感じ。これは私が思っていることで、運営・サポーターの人によって若干の考え方の違いはあるかもしれないけど、だいたい似たようなものでしょう。

今回私が担当したこと

前述ですが、今回は前年度のサポーター以上に踏み込んだ活動をさせてもらいました

  • 資料作成:後半部分を担当
  • 講義:後半部分の一部を担当
  • サポーター

後半の資料、半分くらいは昨年の資料をベースに2014年版として書きなおしただけなのですが、新たに書き起こす部分が校長から指示されていて、それを書き過ぎないように気をつけながら書いたものの、結構書きすぎて当日(4月26日)は30分オーバーしてしまったという感じです。

時間は常に気にしていたのですが、私の壇上でトークする経験って長くてせいぜい20分程度で、2時間の長丁場の時間見積もりができていなかったのは反省点ですね。

当日のお話

例年、1回目は環境構築から入ります。後々システムPerlを汚さないようにユーザPerlを作ることと、そのためにMac/Linuxでビルド環境を用意することを教えます。

だいたい人の集まりを待つので、13時を少し過ぎたあたりから開始。

自分は前年度の1回目を知らなかったのですが(顔を出し始めたのは2回目から)、これがなかなか大変。一歩間違えると、生徒さんの私物のパソコンの環境を壊したりしかねないのでハラハラものです。

MavericksからのMacは環境構築が楽なほうですが、それでもみんなが一斉にXcodeのダウンロードをしたらネットワークが詰まるということで、ここは次回の補講での課題となりました。

Windowsの人にLinux環境を作ってもらうという部分、今年度はUSBメモリによるブートできるUbuntuを使った方法も紹介したのですが、前年度同様にVMwareを使った方法も一緒に解説して、サポートコストが倍近くになったのは大変でした。結局、USBメモリによるブートの方法は、慣れていなくて会場で対応が疎かになってしまったのは反省点でした。

会場であるガイアックスさんの会場が先日最新鋭になったことで、環境構築の部分では、最初は1つの内容を投影していた2つのスクリーンを突然分けて、Mac編とLinux/Windows編で別進行となって、Mac側は急遽@tsucchiさんが壇上に立って講義をするという校長の無茶ぶりが面白かったです。そのために校長は、Macの人とLinux/WIndowsの人を最初から会場の真ん中で二分して座らせていたというのには、会場の設備を最大限に利用した良いアイデアだなぁと思った次第です。

2時間かけて環境構築を完了。15時からの後半は、校長が冒頭に話をしたあとは私のターンです。

とはいえ、スライドのビルドの方法を聴いていなかったのは段取りが悪かったと反省しています。Perl入学式用に魔改造(?)されたImpress.jsとは…。これも補講までになるべくプレーンな環境に近づけたいなと思いました。

私の書いた資料で私が壇上に立って、Perlの歴史やPerlでできること、そしてワンライナーからエディタを立ち上げて最初のプログラムを書くところまで話したのですが、資料の盛り込み過ぎだったり、講義の段取りが悪かったりで、結局30分オーバーとなってしまいました。色々反省点多い…。

運営・サポーターの人達と、懇親会に参加するために残った受講生の皆さんと会場の片付けをして、18時前に会場を後にしました。

懇親会

五反田のガイアックスさんでPerl入学式を開催したときのお約束 「居酒屋北海道 五反田店」。今回もそこでした。

色々と大変だった分、ビールがうまい。そして居酒屋北海道、食事もうまい。

今回初参加の受講生の方々や、いつものサポーターの方々と歓談をして、22時前には解散しました。

参考

「校長」として日々手弁当で講師をしている@__papix__さん、そしてJPAの理事として2014年度からPerl入学式の事業化に向けて尽力している@yusukebeさんが参加されている回のポッドキャスト「職質テックトーク」(by @moznion)を聴いてみると、Perl入学式についての思い、そしてPerlの様々な話題を聴くことができます。時間があればどうぞ。

今後の開催日程など

今回と同じ内容を行う「in東京 #1 補講」は、5月最終土曜日である2014年5月31日の予定です。また、in福岡#1が2014年5月10日、in大阪#1が2014年5月17日の開催となっています。

開催日程や詳細は公式ウェブサイトやTwitter @Perl_Entranceでアナウンスされるので、興味のある方はぜひチェックしてみてください。

Perlや他のプログラム言語、それを使ったテキスト処理やウェブ開発に興味があるけれど、プログラム言語を学ぶ取っ掛かりが見つからなくて…といった皆さんの参加を、運営・サポーター一同、お待ちしています。

MacBookやLinuxノートパソコンのバッテリー残量をウォッチしてImKayacでiPhoneに通知を送るPerlプログラムを作ったら地味に便利だった

仕事と個人で合計MacBook Air 3台に囲まれている おがた (@xtetsuji) です。

最近は複数のMacBook Airに囲まれている生活をしているのですが、現状バッテリーは自宅も会社も一つしかコンセントに繋いでいないという状況でなんとかなっています。ひとえにMacBook Airのバッテリーが持つから。一方の充電が完了したら、もう一方に充電ケーブルをつなぎ替えるだけで良いんです。当然ながら製品購入時に付いてくるものや予備で買ったものも含めて、ACアダプタは複数持ってはいますが、電源を挿す口が近くに足りていなかったり、会社に予備を置くのが面倒とか、そんな背景があります。

とはいえズボラな性格なので、こっちのバッテリーに充電してそのまま放置していたら、あっちのバッテリー残量がピンチということも結構あります。そこでMacBook Airのバッテリー残量を定期的に監視して、必要に応じて手元のiPhoneにプッシュ通知してくれるプログラムが欲しいと思って、思うままにサッと書いてみました。それが思いのほか便利だったので、せっかくなのでブログでご紹介してみようと思って記事を書いてみた次第です。

必要なのはPerlです。できればシステムPerlではなくユーザPerlが良いでしょう。モジュールはコアモジュール以外ではAnyEvent、Cocoa::Growl (存在する場合) 、WebService::ImKayac::Simple に依存します。Cocoa::GrowlはMacにしか対応していないし、WebService::ImKayac::Simple は最近登場したモジュールなので、Debian/Ubuntu のパッケージにもなっていません。そういうことを考えるとやはりユーザPerlを作る必要がありますが、そのあたりはPerlbrewやplenvの記事に譲りたいと思います。

やっていること自体は単純なので、最近のPerlのコアのみでも、もしくはシェルスクリプトでも頑張れば書くことはできると思います。

デーモン化とかは全然考えていないプログラムで、”&” でバックグラウンドに回して使う系のコマンドです。個人ユースのプログラムは面倒なので無闇にデーモン化しないというのが個人的な趣味なだけです。デーモン化が好きな方はApp::Daemonなどを使って改造していただくか、nohup や disown などを使ってください。詳細はプログラム内のPODを見てみてください。

標準ではホームディレクトリに WebService::ImKayac::Simple の設定ファイルが “.imkayac.yml” という名前で存在する必要があります。当然ながらiPhoneでImKayacのアプリをダウンロードして登録している必要があります。設定ファイルの書式は WebService::ImKayac::Simple のドキュメントを参考にして下さい。

上記のようなお膳立てでバックグランドジョブとして起動すると、バッテリー残量を10分おきにウォッチして、20% 50% 80% を上回ったり下回ったりした場合にImKayacで通知を送信します。また現在のバージョンでは、Cocoa::GrowlがインストールされていればGrowlでの通知も行い、要らないかもしれませんがお節介にも標準出力にも出してくれます。また充電が100%になったときに満充電になったこともお知らせしてくれます。監視のインターバルやバッテリー残量のしきい値の数々は、コマンドライン引数で変更可能です。詳細はプログラム内ドキュメントを参照してください。

こんな感じで通知が来ます。便利。

battery-watchdの通知の様子

適切なGitHubのリポジトリがあれば入れようかと思ったんですが、どこに入れてよいかわからない書き捨てプログラムとなってしまったので、とりあえず現状のものを $VERSION = “0.01” としてGistに貼りました。

Linuxラップトップでも acpi コマンドでバッテリー残量を取得することが可能なので、それにも対応してみたつもりですが、現状Linuxラップトップが手元になかったので、この部分のコードはテストしていません。レポートお待ちしています。

まだ作りたてなので、色々と不具合のようなものがあるでしょう。レポートお待ちしています。

適切なリポジトリやパッケージ化の続報があれば、随時追記しています。要望ありましたら、Twitter @xtetsuji などにお気軽にお知らせください。

#!/usr/bin/env perl
# xtetsuji by 2014/04/19

our $VERSION = "0.01";

use strict;
use warnings;
use utf8;

use AnyEvent;
use Config;
#use Cocoa::Growl ':all';
use File::Basename qw(basename);
use Getopt::Long ();
use WebService::ImKayac::Simple;

use constant HAVE_COCOA_GROWL => eval {
    require Cocoa::Growl;
    import  Cocoa::Growl ':all';
    1;
};

if ( !HAVE_COCOA_GROWL ) {
    # Cocoa::Growl の無い環境ではとりあえず何もしないコマンドとして定義しておく
    *growl_register = sub {};
    *growl_notify   = sub {};
}

use constant APPLICATION_NAME => basename($0);
use constant GRAPH_DOWN       => -1;
use constant GRAPH_UP         =>  1;
use constant GRAPH_RELAX      =>  0;
use constant OSNAME           => $Config{osname};

my $p = Getopt::Long::Parser->new(
    config => [qw(posix_default no_ignore_case auto_help)]
);
$p->getoptions(
    'watch-percents=s'        => \my $watch_percents,
    'imkayac-config=s'        => \my $imkayac_config,
    'interval=i'              => \my $interval,
);

our $DEFAULT_INTERVAL = 600;

growl_register(
    app => APPLICATION_NAME,
    #icon => '',
    notifications => [qw/info/],
);

my $IMKAYAC_CONFIG_FILE = $imkayac_config || "$ENV{HOME}/.imkayac.yml";

if ( !-f $IMKAYAC_CONFIG_FILE ) {
    die qq(ImKayac config file "$IMKAYAC_CONFIG_FILE" is not found\n);
}

binmode STDOUT, ':utf8';

my @watch_percents = (20, 50, 80);

if ( $watch_percents ) {
    @watch_percents = split /,/, $watch_percents;
    if ( grep { !/^\d+$/ } @watch_percents ) {
        die "watch-percent option specify comma separated digits.\n";
    }
}

#chomp(my $hostname = `hostname`);
my $hostname = $Config{myhostname};

my $previous_percent = get_remaining(); # initialize

my $cv = AnyEvent->condvar;

my $im = WebService::ImKayac::Simple->new($IMKAYAC_CONFIG_FILE);

my $notify_callback = sub {
    my $response = shift;
    print $response . "\n"; # DEBUG?
    growl_notify(
        name => 'info',
        title => APPLICATION_NAME,
        description => $response,
    );
    $im->send(APPLICATION_NAME . ": " . $response . " ($hostname)"); # ok either flagged utf-8 or not.
};

my $timer = AnyEvent->timer(
    after    => 10,
    interval => $interval || $DEFAULT_INTERVAL,
    cb       => sub {
        my $current_percent = get_remaining();
        my $response = '';
        # process...
        for my $key (@watch_percents) {
            if ( my $res = graph_direction( $previous_percent => $current_percent, $key ) ) {
                if ( $res == GRAPH_UP ) {
                    $response = "${key}% を上回りました。現在${current_percent}%です。";
                }
                elsif ( $res == GRAPH_DOWN ) {
                    $response = "${key}% を下回りました。現在${current_percent}%です。";
                }
            }
        }
        if ( $previous_percent != 100 && $current_percent == 100 ) {
            $response = "満充電されました。";
        }

        if ( $response ) {
            $notify_callback->($response);
        }

        # reinitialize
        $previous_percent = $current_percent;
    },
);

$cv->recv();

sub get_remaining {
    if ( OSNAME eq 'darwin' ) {
        return get_remaining_mac()
    } elsif ( OSNAME eq 'linux' ) {
        return get_remaining_linux();
    } else {
        die "Unsupported your architecture yet\nPlease contact to \@xtetsuji by Twitter if you want to use this program!\n";
    }
}

sub get_remaining_mac {
    my $pmset = `pmset -g ps`;
    my ($percent) = $pmset =~ /(\d+)%; /;
    return $percent;
}

# 追加してみたけどまだ試していない
sub get_remaining_linux {
    my $acpi = `acpi -b`;
    my ($percent) = $acpi =~ /(\d+)%, /;
    return $percent;
}
# see: http://polamjag.hatenablog.jp/entry/2013/10/23/125843

sub graph_direction {
    my ($prev, $cur, $thr) = @_;
    if ( grep { !/^\d+$/ } ($prev, $cur, $thr)  ) {
        require Carp;
        Carp::croak "graph_direction error. ($prev, $cur, $thr)";
    }
    if ( $cur < $thr && $thr < $prev ) {
        return GRAPH_DOWN;
    }
    elsif ( $prev < $thr && $thr < $cur ) {
        return GRAPH_UP;
    }
    else {
        return GRAPH_RELAX;
    }
}

=pod

=head1 NAME

battery-watchd - battery watcher and observer for Mac and Linux laptop

=head1 SYNOPSIS

 battery-watchd &

=head1 OPTIONS

=head2 --watch-percents

 battery-watchd --watch-percents=5,10,15,20

Specify watch percents separated by comma.

=head2 --imkayac-config

 battery-watchd --imkayac-config=/path/to/config.yml

Specify your ImKayac config file path.

Default path is "$ENV{HOME}/.imkayac.yml".

This file format is YAML format. See below CONFIG FILE SYNTAX section.

=head2 --interval

 battery-watchd --interval=600

Specify watching interval seconds.

Default may be 600 seconds. You confirm it by following command.

 grep DEFAULT_INTERAVAL `which battery-watched`

=head1 CONFIG FILE SYNTAX

You can give a battery state by ImKayac.
So you have to tell this program ImKayac setting.
This program gives ImKayac setting file of YAML file.
It syntax is same as L<WebService::ImKayac::Simle>'s format.

Setting file's path is below "--imkayac-config" section.

=head1 DEPENDENCIES

L<AnyEvent>,
L<Cocoa::Growl>,
L<WebService::ImKayac::Simple>,
and some Perl5 core modules.

=head1 COPYRIGHT AND LICENSE

Copyright (C) 2014 by OGATA Tetsuji

This library is free software; you can redistribute it and/or modify
it under the same terms as Perl itself.

=cut

WWW::PushoverをCPANで公開しました

おがた (@xtetsuji / PAUSE: OGATA) です。

WWW::Pushover というモジュールを CPAN で公開しました。2014年4月15日現在のバージョンは、初期バージョンの0.01です。Mac OS X のクリップボード監視モジュールAnyEvent::Mac::Pasteboard以降、久々にCPANにモジュールをアップロードしました。

これはPushoverという海外のスマートフォン向けプッシュ通知サービスへのインターフェースです。もともとWebService::Pushoverというモジュールがあったのですが、重量級のモジュールをいくつも使っていたのと、PushoverにあるAPIでサポートしていないAPIが一部あったので、Perl5.14以降のコアモジュールだけで事足りるようなものを作りたくて、ずいぶん以前に作ったものをアップロードした次第です。

今回は Minilla の minil コマンドでひな形を作って作業していたのですが、念のためと FAKE_RELEASE=1 minil release をした後からおかしな状況になってしまい、結局 minil build したものを PAUSE の管理画面からアップロードするなど、混乱してしまいました。そのせいか、2014年4月15日時点でsearch.cpan.org/~ogata/metacpan.org/author/OGATA の一覧に WWW::Pushover が出てこないとか色々あってどうしたものかなと思ってはいるのですが、ひとまず cpanm WWW::Pushover と打つことでインストールはできるようです。このあたりは、次にPerlの勉強会に行った時にでもCPAN Authorの方に質問してみようかと思っています。頼れる人がいるの大事。

CPANにアップロードしたいものの色々な理由で踏ん切りがつかずGitHub止まりになっているモジュールはいくつもあるのですが、今後多くの人に有用なものは少しずつCPANにアップロードしていきたいと考えています。まだまだCPANへのアップロードは不慣れな点が多いのは、場数を踏んで解消していきたいところです。

英語ですが、ドキュメントにも書いてある通りいくつかの注意点があります。

  • Pushoverのスマートフォンアプリは、買い切りの有料アプリ
  • WWW::Pushoverを使うためには現状ログインをして自分専用の「アプリ」を作ってAPIキーを発行する必要がある

後者に関しては利用者の利便性のためにAPIキーを同梱しようか結構悩んだのですが、現時点では同梱していません。そのあたりはドキュメントにも書いてある通りです。

「日本だとImKayacがあるだろう」という意見もあるのですが、さすが有料のPushoverは高機能で、例えば以下の点がImKayacより優れているポイントでしょう。

  • Pushoverは通知のサウンドを選べる
  • Pushoverは通知の優先度を選べる
  • PushoverにはiOS版だけでなくAndroid版もあるし、iPadにもユニバーサルアプリ対応している
  • …その他色々

ImKayacは無料です(有料版もあります)が、ちょっと通知ごとにサウンドを替えてみようかなとか、AndroidユーザでImKayacを使えなかったユーザへの、もう一つの選択肢になるのではないでしょうか。

ちなみにAndroidには他にもプッシュ通知系アプリもあってAPI公開されているものもあるので、そのAPIラッパーも暇があったら書いてみたいと思っています。

Foursquareの本質とは何なのか

Foursquare大好き、ロケーションベースサービス大好きな おがた (@xtetsuji) です。

ここ最近、私の周囲ではGoogleからリリースされたAndroidアプリ「Ingress」が少しずつブームになってきています。いわゆる位置情報が取れるようになってから定期的に出てきた「陣取りゲーム」のようなものなのですが、グラフィックの秀逸さなどから、一部に熱狂的なファンを生み出しつつあるようです。 そんな中、「IngressはFoursquareより面白い」といった声も聞かれるようになりました。ただ、なんだか違和感を感じます。「Ingressってゲームだよな。FoursquareってIngressと比較されるようなゲームだったっけ?」と。

Foursquareは今や世界でも有数の位置情報のビッグデータを持った企業でありサービスです。FoursquareユーザがFoursquareでチェックインし続ける目的はそれぞれあるでしょう。そんなことを考察していき、私が考えるFoursquareの本質と、今後の展望について文章の形で考えてみることにしました。

とりとめもない長文になってしまったので、最初に結論を書きます。あとは興味と時間のある人だけ読んでいただければ満足です。また、太字だけを流し読みしていただいても嬉しいです。

結論としては

長文を読むのが面倒(いわゆる tl;dr)という人向けに結論だけ書いておきます。

  • 私が考える上でFoursquareの本質はゲームではない。新規ユーザを取り込むためにバッジといった「ゲーミフィケーション」を設けているのは呼びこみの一つに過ぎない。バッジ目的でFoursquareをしても、早晩頭打ちになる。
  • Foursquareは位置情報のビックデータを持つ有数の企業になった。今後はこの情報を使って、O2Oを仕掛けてくる。また、位置情報を欲する企業や団体と連携して音頭をとって収益モデルを築いていく。
  • ユーザがFoursquareを使う大きなメリットの一つは、ライフログであり、それは個人のビッグデータである。また、Foursquareが仕掛けてきつつあるO2Oの情報を使うことで、いわゆる食べログよりももっと汎用的なべニューランキングツールとしてユーザにメリットをもたらす。
  • 実際に興味のある人は、熱心なFoursquareユーザ(4sqer)と顔を合わせて語ると良い。4月16日のFoursquareの日に、全世界で4sqDay Meetupが行われる。2014年も東京でも行われる予定。私も行く予定です。

Foursquareはゲームではない

Foursquare自体、仕組みとして「バッジ」などといったコレクション要素のあるゲーミフィケーションの仕掛けを用意していますが、Foursquareの本質はここにはないと思います。 バッジを集めるためにわざわざ外出するという動機付けのもとに頑張っている人もいることは確かですが、多くの人はそうではないでしょう。後述の「位置ゲー」企業の中の一部は、自治体などとタイアップして観光誘導などで成功している例もありますが、Foursquareはそういうことを直近では行わないと思います。不正チェックインは論外です。

そうなると普段の生活圏内でチェックインをしてどれだけバッジが収集できるかといった話になるわけですが、一通り数十種類のバッジが集まったら、あとはほとんど手に入らなくなってしまうでしょう。 またメイヤーについてもゲーミフィケーション的要素ですが、これは「ユーザの中でも最も常連である」的意味合いしかなく、奪い合うものではないと思います。これも普段の生活圏内でチェックインしている限りは、それほど増えるものではありません。

要するにバッジやメイヤーといったゲーミフィケーション要素は、Foursquareの本質ではないと私は考えています。 もちろん、Foursquareユーザの中には様々な場所に足げく通い、バッジやメイヤーの収集に楽しみを覚えている人もいます。当然ながら、楽しみ方や活用方法は人それぞれではありますが、それがFoursquareユーザの大多数かと言われると私は否定的な方です。

位置情報とその実用と遊びの前史

いわゆるガラケー、ドコモなどでは基地局によるキロ単位の位置情報が取れる機能がありました(オープンiエリアなど)。その頃から、地図などを表示するという実用アプリが徐々に出てき始めました。まだ、精度的にもゲームに利用するには早い時期でした。 その後、多くのガラケーがGPS機能を搭載して、地図アプリなどが高機能化します。ガラケーにもGoogleマップといったPCでお馴染みの「実用アプリ」がガラケー向けにブラッシュアップして登場します。 そのなかでGPSの位置情報が、「実用」と対比される「遊び」(=非実用)に利用される事例が現れ始めました。スマートフォンの前の時代は、世界的には日本のケータイ(ガラケー)が性能的にも最高峰の携帯電話でした。この点でも日本が先行していたと言えるでしょう。特に「位置ゲー」という登録商標をひっさげて市場に切りこんできたコロプラはよく知られた企業です。このころ、コロプラという企業の前身である「コロニーな生活」が作られた頃から、企業や個人が多くの位置情報を活用したゲームを公開します。 しばらくは日本のガラケーによる位置情報を活用したゲームが先進していました。

その状況を塗り替えることになるのがスマートフォン、特にiPhoneの登場です。このころから、Foursquareのような位置情報サービス・ロケーションベースサービスと呼ばれる毛色の違うものが登場するのですが、その詳細は後述します。

Foursquareに至るまでのロケーションベースサービスの歴史、そしてGoogleの戦略

スマートフォンが登場する前後に、アメリカで「Dodgeball」というサービスが生まれました。これは実は今のFoursquareを作った人達によって作られた位置情報サービス・ロケーションベースサービスなのですが、ほどなくしてGoogleに買収されてしまい、そしてサービスが終了してしまいます。

Googleはというと、買収したDodgeballを無駄にしたというよりも、そのノウハウなどを利用して新しいものを作ったと想像しています。それが記憶にある人もいるだろう「Google Latitude」です。これはスマートフォンの位置情報を送信し続け、仲間達の間で位置情報を共有しあうというサービスだったのですが、セキュリティ上の懸念が優先してしまい、いまいち流行らず、そして数年ののち終了してしまいました。

Dodgeballを作った人達は、GoogleにDodgeballを売却した後、新しいロケーションベースサービスを作ります。それが今のFoursquareです。ちょうど高機能なスマートフォンが出てきた時代であったり、Gooogleにサービスを売却した人達が再度類似サービスを作ったという状況などが話題となり、Foursquareは一気に有名になっていきます。

当初は、日本も世界もスマートフォンをゲームに活用しようという機運が非常に高く、その括りでFoursquareも位置情報ゲームとし捉えられることが多かったように思います。ちょうど日本でのガラケー時代からのコロプラ勢などの影響もあるでしょう。ただ、当時のFoursquareの経営陣はゲーミフィケーション的要素はユーザ獲得の入口に過ぎないとしていたのだと思います。当時のFoursquareは収益モデルも確立しておらず、多くの人が先行きを不安視したりしましたが、現在は位置情報のビッグデータを持つ有数の企業として、対企業向けにそれを元に商売をしていることは知る人ぞ知るFoursquareの顔です。

ここで話を戻して、Googleはせっかく買収したDodgeballを閉鎖し、その後のLatitudeもサービス終了して、位置情報サービスの負け組となったのかというと、そうでもないようです。ユーザ数ではTwitterやFacebookに大きく水を開けられているGoogle+ではGoogleマップと連携したチェックインの概念を持ち込み、最新のAndroid端末のウリとなっている「Google Now」でLatitudeのような機能を持ち込み、そこそこの好評を得ています。また、冒頭に出てきた「Ingress」などにも経験が生きているのかもしれません。

Googleくらいの大きな企業ともなると、位置情報への投資と失敗は些細な出費なのでしょう。Googleがここまで失敗を繰り返してもロケーションベースサービスに興味をもったのは、一つはソーシャルメディアへの強いあこがれと、もう一つは自社のメインサービスとなったGoogleマップやGoogle Earthの進化といった理由があるのではないかと私は見ています。

FoursquareとGoogleは仲が良いかと言われると、そうでは無いように見えるところが面白いです。Googleマップの企業向けの利用料が格段に上がったときにいち早くGoogleマップの使用をやめた企業の一つがFoursquareです。FoursquareはOpenStreetMapを使う選択をしました。Foursquare自身も自分たちが作ったサービスを潰されて、しかもFoursquareの対抗サービスを定期的に出してくるGoogleに、あまり良い気分をしなかったことは大いに想像できるところです。

またFoursquareはGoogleのライバルとも言えるAppleとの接触を何度か図っています。記憶に新しいところでは、新しいiOSで採用されて大不評となったAppleマップのデータ改善にFoursquareが情報提供をしたという報道。これが事実であるかは不明ではありますが、FoursquareはどちらかというとGoogleよりもAppleに寄っているという見方は正しいのではないかと思います。

GoogleとFoursquareという軸で話をしてきましたが、私の想像なども入っているので、全て事実であるという保証は無いところはご注意ください。また、日本語のWikipediaの以下の記事を参考にさせていただきました。

今もFoursquareに熱心なユーザは何を目的に使っているのか

どの無料サービスにも言えることですが、サービスを何年も継続していると、登録はしたものの使わなくなったユーザと熱心に使い続けるユーザの二通りに分かれるのは常といえます。

では今もFoursquareをしているユーザのモチベーションとはなんなんでしょうか。

少なくともゲーミフィケーション要素は、何年もFoursquareを続けていくと薄れてきます。バッジも取れなくなるし、メイヤーも取れなくなる。

ユーザの目的の一つは「同報通信」的目的があるでしょう。Twitterの「○○なう」の代わりにFoursquareを使う人です。私もそれを実践して、カフェにいたら私に会いたい後輩がやってきたという出会いがありました。位置情報を公開する事のリスクばかりが取り沙汰されますが、一定のプライバシールールを意識することで、有用な出会いのツールになるのではないかと思います。

もう一つ、これが重要なのですが、ライフログ的使い方があります。FoursquareはiCalなどのフィードもしていて、いつどこに行ったのかという情報を後から振り返る機能をいくつも提供しています。GoogleカレンダーにiCalファイルを登録すると、何年も前のチェックイン情報を振り返ることができます。これが数年分たまると、とても興味深い自分のライフログ・個人版ビッグデータとなるのです。

今後のFoursquareはどこに向かうのか

Foursquareの本質が、少なくとも多くの人にとってゲームではないことは前述した通りです。

ではFoursquareの本質は何なんでしょうか。いったいFoursquareは今後どういった方向に向かうのでしょうか。

一つは位置情報のビッグデータを使って対企業に商売をするという方向性があります。これは純粋に位置情報が欲しい企業への情報提供というものでしょう。あまり一般ユーザには関係ない話かもしれませんが、AppleマップやOpenStreetMapが改善するかもしれないことを考えると、我々に無関係な話でもなさそうです。

また、日本でいうところの「食べログ」的な情報発信源になろうという目論見も垣間見えます。つまり、いまどきの言葉で説明すればO2O事業への参入です。既にFoursquareは、飲食店などのビジネスパートナー向けのアプリケーションをリリースしています。今後、日本での活動が活発化した際には、この分野での攻めもあることでしょう。以前からアメリカでは「Yelp」と競合すると言われてきました。2014年春、ついに日本にもYelpが遅れて上陸したわけで、Foursquareの動向には注目が集まります。Foursquareの経営陣は「世界で一番多いチェックインは新宿駅」などといった、日本を注目しているといった発言もたびたびしており、日本でのFoursquareの本格的な活動が楽しみであるというのが、Foursquareの一ファンである私の意見です。

飲食店に限らず、全世界の全ての場所「ベニュー」を包括的にレーティングし、それを一時発信元として発信できるのは、Foursquareなど一部の限られた企業だけでしょう。また、一連のステマ騒動や星3つ収斂問題を抱えている食べログの牙城が誰によって切り崩されるのかといった興味もあります。それはYelpかもしれないし、Foursquareかもしれません。外来のO2Oプレイヤーの活動から今後も目が離せません。

Foursquareのユーザと交流することでFoursquareの色々な面が見えてくる

既に周囲でFoursquareをやっているユーザがいないけど、なんとなく好きだからやっているというユーザは、FoursquareのMeetupなどに参加してみるとよいでしょう。

4月16日は4の2乗(square)が16であることから「Foursquareの日」とされており、その日に全世界でMeetupイベントが行われます。今年2014年も東京でイベントが行われます。

私も2012年に参加して、様々な目的でFoursquareをプレイする人達の様々な意見を聴き、非常に興味の持てる、幅の広いサービスだという印象を持ち、さらにFoursquareが好きになりました。

もしFoursquareに漠然とした興味はあるけど、その本質が何か分からないという人は、FoursquareのMeetupに顔を出すなどして、実際にFoursquareのコアユーザと話をしてみることで新たな視点が得られることは間違いないでしょう。初心者から開発者まで、様々な人達が集まった過去の4sqDay Meetupでしたが、みなさん非常に楽しんでいました。

上述の、2014年東京のFoursquare Meetupには私も参加します。後日レポートを書く予定ではいますので、もし興味があるけど出られないという方は、楽しみに待っていてくださると嬉しいです。

過去の4sqDay Meetupのまとめなどを引用して、この文章を締めくくりたいと思います。

皆さんのFoursquareライフが充実したものになることを願っています。

MacBook Air でハズレのLG製ディスプレイを引いた場合の対処方法

おがた (@xtetsuji) です。

2014年4月、個人でも会社でも「MacBook Air 13インチ 2013年モデル」を使っています。中のSSDのサイズが違うくらいで、あとはほとんど同じスペック。2014年1月に会社で使いたい機種を選ばせてもらえることになったとき、個人で使っているものと違うのがいいかなぁと一瞬思ったけど、まぁ同じ方が色々と無難かなと思った結果です。個人で買ったのは2013年6月、発売すぐです。

とはいえ最近気づいたのですが、会社で2台並べてみると、ディスプレイの色合いがぜんぜん違う。最初は会社のMacBook Airは外部ディスプレイに接続しているからカラープロファイルが違うのかなとか適当なことを思っていたのですが、個人で使っているMacBook Airの色合いの悪さが日に日に気になっていたので検索してみたら、見事にそういう記事がありました。

この記事は2012年モデルについての解説ですが、2013年モデルでも同様です。

Macでディスプレイの製造メーカーを調べる方法

ターミナルで以下のコマンドを実行すると、ディスプレイの製造メーカーが分かります。

ioreg -lw0 | grep IODisplayEDID | sed "/[^<]*</s///" | xxd -p -r | strings -6

もし「stringsコマンドが無い」といったメッセージが出てXcodeを入れるのに抵抗のある方は、システムに標準で入っている perl が使えます (2014/04/09 追記)。

ioreg -lw0 | grep IODisplayEDID | sed "/[^<]*</s///" | xxd -p -r | perl -E '$str = do { local $/; <>; }; say for $str =~/([x20-x6f]{6,})/g'

stringsコマンドはXcode Command Line Toolsが必要なようです。

stringsにはXcodeが必要

出力される結果は以下のパターンがあります。

  • LPから始まる文字列 → LG製造 → ハズレ
  • LTH、LSNから始まる文字列 → Samsung製造
  • Bから始まる文字列 → AU Optronics製造

自分個人のMacBook Airで実行したら以下の結果になりました。

LP133WP1-TJA7
Color LCD

見事にハズレorz。

会社のディスプレイは以下の結果になりました。

LSN133BT01A02
Color LCD

Sumsung製。やはり発色が良いのはこの違いだったか…。

具体的に言うと、LG製のディスプレイは白も黒もしまりがない感じになります。Sumsung製のディスプレイを見慣れると、薄ぼけた感じになるというか…。

ありがたい事に、LG製のハズレのディスプレイの発色をマトモにする方法があるということで、早速やってみました。

ハズレのLGディスプレイで発色をマトモにする方法

以下の方法はLG製のハズレのディスプレイへの方法です。他のアタリのディスプレイに施す必要はありません。逆に色が濃くなりすぎて見づらくなるのでやめたほうがよいでしょう。

  1. 有志が補正したプロファイルをダウンロードします。
  2. Finder で “/Library/ColorSync/Profiles/Displays/” を開く。さっきターミナルを開いているなら、open /Library/ColorSync/Profiles/Displays/ というコマンドを打てばOK。
  3. ターミナルで開いた Displays フォルダに、先ほどダウンロードした CustomMacRumors.icc をコピー。ここで認証が求められますが、適切なものなので承認します。
  4. システム環境設定 → ディスプレイ、と進みます。
  5. 「カラー」タブを開き、「このディスプレイのプロファイルのみを表示」のチェックを外します。表示項目が増えますが、下にあるほうの「カラー LCD」を選択します。
  6. 選択した途端に色鮮やかになったら成功です。黒色のしまり具合を見てみると違いがよくわかります。

チェックボックスを外して増えたカラープロファイル群

認証ダイアログが出た場合には「認証」を押して、管理者パスワードを入れて進めましょう。

Displayには認証が必要

これでLGのハズレディスプレイでも色鮮やかなMacBook Air 13インチ 2013年モデルになりました。Sumsung製のディスプレイと並べても遜色の無い色合いになりました。

その他

AppleがSumsungと喧嘩をしていることは有名で、今後はSumsung製ディスプレイの供給は減っていくのかもしれませんが、そこのところどうなんだろう…。

LGといえばNexus 5を作ったところとして記憶に新しいです。ただ、Nexus 5 の液晶ディスプレイには特に不満を覚えないのですが、これはLGが製造していないということなんでしょうか。それとも比較対象が無いから分からないだけとか?

参考

その他にも、検索をしてみると世界中で話題になっているようです。

比較対象が無くて、特にLG製でもいいやと思っているMacBook Airユーザの方、面倒がらずにカラープロファイルを入れ替えてみたら、見違えるほどMacBook Airの向こうに広がる世界が良くなりますよ。

最近の私とmod_perlとの関わり

おがた (@xtetsuji) です。

以前からこのブログにも書いていますが、2011年からコミュニティ活動を始めて、各地のPerlの勉強会や、2012年と2013年のYAPC::Asia Tokyoでmod_perlのトークを頻繁にしてきたからか、今も「mod_perlといえば@xtetsuji」とか「モドパール神」とかたまに言われます。恐れ多い。

新年度になって振り返りの余裕もできたので、最近の私とmod_perlとの関わりを書いてみたいと思っています。

今の業務でmod_perlは全然使っていないし使う予定もない

1月末に退職して2月初めに転職したことをご報告したのですが、現在の職場はPerlの会社ではあるものの、mod_perlは使っていません。それなのに、よく採用していただけたなと、ありがたい限りです。

前職でも案件が入れば必要に応じて書くという感じだったので、年がら年中mod_perlのコードを書いていたというわけではありませんでしたが、今の会社では入社から今まで2ヶ月の間、mod_perlとの接点は当然ながら全くありません。

以前のエントリにも書きましたが、数社面接を受けて、mod_perlを使っている会社から不採用で、mod_perlを使っていない会社から内定をもらうという事実が人生のネタみたいなものでした。

今の職場で配属された部署では、以前からの案件ではCGI(SpeedyCGI)上に乗った独自フレームワーク(OSSにもなっているけど、ほぼほぼ自社フレームワーク)。新しい案件ではモダンにNginxをリバースプロキシ役として前面に立たせて、Plack+Starletに載せたAmon2改造フレームワークを使って開発しています。

エンジニアの上司や偉い人もしばしば「mod_perlは使う予定もないからねー」と言っています。適材適所なので、使わせてくれと言ったことはないし、現状うまくいっているので良い感じなんですが、なんか私がmod_perlの人と思われているようで、mod_perlの話が出るとそんなことを言われます。

個人的な開発環境ではApacheとmod_perlは現役

個人ではというと、借りているVPS(さくらのVPS)では、ウェブサーバはApache2.2+mod_perl2という構成で動かしていて、何か込み入ったことをやりたいと思ったときには、時々mod_perlハンドラを書いたりしています。

OAuthを使ったサービスを作るためのスクラッチはmod_perlハンドラだと面倒だったので、Mojolicious::Liteを使ったりしています(面倒だったのでApacheのmod_proxyでリバースプロキシさせました)。会社がAmon2寄りとはいえ、Mojoliciousも使ったりしているのは、Mojoliciousの可搬性を個人的に気に入っているからです。

自宅サーバでは今もApache1.3が動作しています。過去の環境を意図的に残す意味で、わざとやっている部分もあるんですが、そこでmod_perl1のハンドラを書いたりすることもあります。

実際に個人的に作りたいサービスもあるのですが、MojoliciousとAmon2を作る対象物に応じて分けて使って、小さいものはmod_perl (PlackのPlack::Handler::Apache2) で動かしたいと考えています。なぜって、ログを見るのが簡単だから。

先日業務で、NginxからPlack+Starletへリバースプロキシして、plackupはSupervisorで起動するっていうのをやったんですが、もうデバッグ時にログを見るのが大変でした。何かあったときに、Nginxのログ、Plackのログ、Supervisorのログがあって、どれを見ていいものかとか、なかなか戸惑いました。慣れの問題だったり、あとアプリケーション仕様のURL設計が難儀だった(これは私が設計したものではないです)ってのもあるんですが、ミドルウェアが増えるとログも増えて大変だなーと思った次第です。個人レベルで小さなウェブサービスを作るのであれば、ミドルウェアを不必要に・扱いきれないほど多くする必要はないかなと感じています。Apacheなら堅牢だし。

前職でmod_perlを突き詰めていた理由

前職でmod_perlを劇推ししていたのは、自分がmod_perlが好きという他にも、インフラ部署がほとんどのミドルウェアの使用を許可しないという理由があったからでした。それは退職エントリにも書いたのですが、彼らの言い分は「ミドルウェアが多くなればなるほど監視対象が増えて自分らの仕事が増える」ということらしい。まぁごもっともではあるのですが、memcachedとか既に市民権を得ているようなミドルウェアまで危険視されて入れさせてくれなかったのは、自分のキャリア的に多様な経験を積む機会を奪われたとしか言いようがありません。結局memcachedのようなものもmod_perlで書きました。それならOK!

世間でmod_perlを必要としている人もいる

先日PerlBeginners#12に参加したときに、「会社でインフラを担当している」という方からmod_perlの質問を受けました。やはりmod_perlにもまだ一定の需要はあるんだと感じました。

私だって転職活動時にmod_perlを使っている会社を聞きつけたりもしたくらいですから、好きか嫌いかは別として、使っている会社や使おうとしている会社があるというのはわかります。

前述の通り「ミドルウェアが集約されて簡潔な構成になる」「監視対象のデーモンや永続プロセスの類が減る」といったことをメリットとして捉えてApache+mod_perl構成を取る会社もあるだろうし、そういう選択もあるんじゃないかなーと思います。静的ファイルはフロントエンドに立たせたNginxが出力して、動的な画面はバックエンドのPlackが…といった構成は、中小規模の開発(漠然としていますが)であれば、それほど求められないと思います。古いもの=悪、新しいもの=善、の構図は全ての文脈で当てはまるとは言えないでしょう。

私にできることはmod_perlの活きた知識を残すこと

幸か不幸か、mod_perlの活きた知識だけは頭の中にたまっているので、そういったmod_perlをこれから使っていく人のために情報を出していったりコンサルタントをしていったりしたいと考えています。

Twitterアカウント @mod_perl_info がありますが、あまり活動をしていません…。とりあえずその辺りから活動を初めて、mod_perl関連の文章の翻訳などをしていければと思っています。英語が得意なわけではないのですが、mod_perl自体の知識があるので、翻訳兼監訳的な立ち位置で翻訳作業ができるかなと考えています。とはいえ今は時間がない。

なんとなくまとめ

前職で10年間Perlをやっていた半分以上はApacheのmod_perlを突き詰めて研究して、それ以外のサーバやミドルウェアはほとんど(少なくとも)業務では触りませんでした。というか最後のほうは触らせてすらくれませんでした。

なので「Perl歴10年くらいです」といっても、mod_perl以外の知識が全然無いというある種面白いPerlプログラマーなのですが、そういった私を重宝してくれるPerlの勉強会や職場があることに本当に感謝しています。

今の環境で学んでいる「新しいこと」も伸ばしていきつつ、それもまたブログやトークの形などでフィードバックしていければと思っています。それと同時に、mod_perlの知識も「生き証人」として、後世の人に分かりやすい形で残していければいいなと、強く願って実行に移そうとしています。

こんな私に要望などがありましたら、遠慮無くどんどんリクエストしてくださると嬉しいです。