2007年頃に初めて作ったWebサービス「5つ星ミニブログ・ライフログ Staaaaar!(スター!)」ですが、
一旦、サービス終了とさせて頂くことにしました。

最近は仕事、プライベートともに忙しく、かなりの間、放置してしまっていたのですが、
管理者不在のまま放置をしておくことは知らないところで、誰かの迷惑になってしまうことも
あると考え、一旦、サービスを終了させて頂きます。

当時から比べると、ずいぶん様々なWebサービスが提供されるようになってきていますので、
充電期間をおいて、また面白いWebサービスを思い付いたら日曜大工的に作れたらなと思います。

それでは、今まで利用頂いた皆様、ありがとうございました!

Posted by admin, filed under 活動記録. Date: 11月 7, 2015, 1:54 pm | No Comments »


VERY GOOD SERVICEの鬼塚です。
久々にウェブサービスをリリースしました!

■honnobutai β – 本の舞台をマッピング
http://honnobutai.org/

本の舞台をマップして楽しむウェブサービスです。
まだβ版なので、ところどころ不思議なとこもありますが、
一通りのことは出来るので、ぜひぜひ使ってみてくださいね♪

使い方は簡単。

まず、ユーザ登録。(当たり前か)

あとは、好きな本の舞台をhonnobutaiで探して、登録するだけ!

【本の舞台を探す】
まず、「舞台を投稿する」をクリック。
地図上にマーカーが出てくるので、バルーンの中に場所を入力して検索するか、
マーカーをドラッグして場所を決めて「確定」をクリック。

【本を選ぶ】
場所を確定したら、「本を探す」をクリック。
本のタイトルや著者を入力して、「検索」をクリック。
出てきたリストから読んでた本を探して、タイトルをクリックして完了。

【本の舞台が出てくるページを引用】
本を選んだら、バルーンの中にテキストボックスに本の舞台が
出てくるページを引用。(100文字以内くらいにしてくださいね)
引用した頁数を入力したら、「保存」をクリック。

使い方で分からないこととかあったら、気軽に連絡くださいませ♪
mixiのコミュもあるよ!
http://mixi.jp/view_community.pl?id=3416886

今回はVERY GOOD SERVICEのメンバーでもある内沼くんが代表をしている
numabooksによる企画・デザインです。

ちなみに、内沼くんが『ecocolo』で紹介してくれてます。(あがるっ)
http://www.ecocolo.com/editorial/modules/pukiwiki/514.html

気がつけば、VERY GOOD SERVICEって名前で活動を
始めてから、もう1年弱。

これからはnumabooksと一緒に活動していくことが多くなりそうです。

そして、本業である業務コンサルタントという仕事も続けていきます。
次は名古屋で会計システムの企画をしてくる予定です。

明日は最終提案。
受注すれば、来週からはプロジェクト開始です。

お客さんは名古屋だし、忙しくなるかもだけど、週の半分くらいは
東京で仕事だし、週末も東京にいるので、面白いことがあったら、
いつでも声かけてくださいね。

ではでは。

Posted by admin, filed under 活動記録. Date: 6月 26, 2008, 3:15 pm | No Comments »

VERY GOOD SERVICEです。
実はEAT TOKYOのメンバーだったりもします。

■EAT TOKYO
 http://www.precook.jp/

ってことで、EAT TOKYO向けのウェブサービスをアップデート。
イベントの告知をメール配信するウェブサービスなので、一般公開はしてませんが、
興味がある人はご連絡ください。(とりあえずは知り合いの方のみでお願いしています)

これだけだと、何の記事か意味が分からないので、参考にしたページを紹介します。

■Zend Framework関連
Google CalendarのAPIはZend Frameworkを使うと簡単にアクセスできます

・Zend Framework Download
http://framework.zend.com/download

・Programmer’s Reference Guide
http://framework.zend.com/manual/ja/zend.gdata.calendar.html

基本的には、ダウンロードファイルにあるデモとReference Guideを見れば分かりますが、
若干、苦労した点を補足しておきます。

(1) デフォルト以外のカレンダーのイベント一覧を取得
イベント一覧を取得する時は、Zend_Gdata_Calendar->getCalendarEventFeedを使うのですが、
getCalendarEventFeedの引数にEventQueryを渡す必要があります。
デフォルト以外のカレンダーを指定する場合は、setUser()でカレンダーIDを指定します。

(サンプル)
  // Googleカレンダーにログイン
  $service = Zend_Gdata_Calendar::AUTH_SERVICE_NAME;
  $client = Zend_Gdata_ClientLogin::getHttpClient($user, $pass, $service);

  // カレンダーIDを指定してイベントを取得
  $gdataCal = new Zend_Gdata_Calendar($client);
  $query = $gdataCal->newEventQuery();
  $query->setUser(カレンダーID);
  $query->setVisibility(‘private’);
  $query->setProjection(‘full’);
  $query->setOrderby(‘starttime’);
  $query->setStartMin($startDate);
  $query->setStartMax($endDate);
  $eventFeed = $gdataCal->getCalendarEventFeed($query);

(2) カレンダーIDの取得方法
カレンダーIDは、getCalendarListFeed()の戻り値(オブジェクト)のid->textでカレンダーのURLが
取得できるので、そこから抽出しています。

(サンプル)
  // Googleカレンダーにログイン
  $service = Zend_Gdata_Calendar::AUTH_SERVICE_NAME;
  $client = Zend_Gdata_ClientLogin::getHttpClient($user, $pass, $service);

  // カレンダーリストからカレンダーIDを取得
  $gdataCal = new Zend_Gdata_Calendar($client);
  $calFeed = $gdataCal->getCalendarListFeed();
  foreach ($calFeed as $calendar) {
    preg_match("/\/([^\/]+)$/i",$calendar->id->text,$match);
    echo $calendar->title->text . "のカレンダーID:" . $match[1] . "\n";
  }

(3) 個別イベントの取得方法
イベントIDがURLで分かっている場合は、EventQueryオブジェクトを作らなくても
Eventオブジェクトを取得することができます。

ただし、 繰り返しのイベントの扱いには注意が必要です。
(1)のイベントのリストを取得する時は検索対象期間に含まれる日はwhenプロパティに入れてくれるのに対して、
個別イベントを取得する時はのwhenプロパティはNullになってしまいます。ご注意ください。

    (サンプル)
    $gdataCal = new Zend_Gdata_Calendar($client);
    $event = $gdataCal->getCalendarEventEntry($event_id); 

■ポップアップカレンダー(日付の入力支援)
http://fdays.blogspot.com/2008/02/javascript-22-window-yahho-calendar-yui.html

PAAAAARTYでは、Yahho Calendarを使ってます。
Yahoo Calendarは、ポップアップさせるために、テキストボックスの直後に自動でDIVタグを挿入しています。
テキストボックスの真下にカレンダーを出したい場合は以下のようにするとよいと思います。

<table>
<td>
<input type="text" name="start" id="start_id" onclick="YahhoCal.render(this.id);" \>
</td>
<td>?</td>
<td>
<input type="text" name="end" id="end_id" onclick="YahhoCal.render(this.id);" \>
</td>
</tr>
</table>

■ checkboxで複数チェックした場合にPHPでチェック結果を見る方法
inputタグのnameを「~[]」にするとよいみたいです。
http://d.hatena.ne.jp/bonlife/20060210/1139591861

ではでは。

Posted by admin, filed under 活動記録. Date: 4月 23, 2008, 2:06 am | No Comments »

今日はmixiのカレンダーをiCalender形式に変換して、
Googleカレンダーに取り込む実験。

どうも色々調べて見ると、カレンダー情報のフォーマットはRFCで標準化しようとしてるらしいです。
前回の日記(http://verygoodservice.jp/wp/?p=44)と同じようにmixiPHPをカスマイズして、使って見ました。

■mixiiiiical – mixiカレンダーをiCalender形式で配信
 http://verygoodservice.jp/mixical/

使い方はmixxxxxirss!とほぼ同じ。

ユーザ名、パスワードと配信したい年を入力して「フィードURLを作成」ボタンをクリックすると、
iCalendarファイルのURLが出力されます。

あとはこのURLをiCalendarに対応したスケジューラ(MacのiCal、Googleカレンダーなど)に
このURLを登録するだけです!

iCalendarファイルは動的に作ってるので、mixiで更新するとスケジューラ側にも反映
されるはずです。(試してないけど)

iCalendar形式でイベント情報を配信してるサービスは他にもあって、
http://www.apple.com/jp/ical/library/index.html
とかと組み合わせると面白いかもしれません。

東京アートビート(http://www.tokyoartbeat.com/)が配信してるRSSもiCalendarに変換する
ウェブサービスを作ろうかなぁと思ってます。

世の中にあふれるイベント情報を収集する仕組みとかあったら便利だよね。

さて、今日のmixiPHPの修正点。
必要なとこしか直してないので、そこだけ公開。

    /**
     * カレンダーを取得
     * 
     * @param int $year 年
     * @param int $month 月
     * @return array 
     */
    function parse_show_calendar($year = 0, $month = 0)
    {
        if (empty($year) || empty($month)) {
            $url = "show_calendar.pl";
        } else {
            $url = "show_calendar.pl?year=" . intval($year) . "&month=" . intval($month);
        } 
        $content = $this->fetch($url);
        $term = $this->get_cal_term("", $content);

        //return $content;
        $content = mb_convert_encoding($content,"UTF-8","EUC-JP");
       
        preg_match(‘/<table width="670" border="0" cellspacing="1" cellpadding="3" class="calendarTable01">(.*?)<\/table>/s’, $content, $match);
        $content = preg_replace(‘/<tr align="center" bgcolor="#fff1c4">.*?<\/tr>/is’, ”, $match[1]);
        preg_match_all(‘/<td bgcolor="[^<>]+" align="left" valign="top"><font style="[^<>]+">(\S*?)<\/font>(.*?)<\/td>/is’, $content, $result, PREG_SET_ORDER);
        foreach($result as $myrow) {
            // $date = array("year" => $term[‘year’], "month" => $term[‘month’], "day" => intval($myrow[1]));
            $date = $this->mktime(0, 0, 0, $month, $myrow[1], $year);
            $schedule = explode("<br />", $myrow[2]);
            foreach($schedule as $desc) {
                if (preg_match(‘/<img src="(.*?)" width="16" height="16" align="middle" \/><a href=(\S*?)>(.*?)<\/a>/i’, $desc, $ret)) {
                    $icon = pathinfo($ret[1]);
                    $ret[2] = preg_replace(‘/"/i’,"",$ret[2]);
                    $item[] = array(‘title’ => $ret[3], ‘link’ => $this->base_url . $ret[2], ‘date’ => $date , "category" => $this->mixi_cal_icon[$icon[‘basename’]]);
                } else if (preg_match(‘/<a href=".*?" onClick="MM_openBrWindow\(\'(view_schedule\.pl\?id=\d+)\’.*?\)"><img src="(\S*?)".*?>(.*?)<\/a>/i’, $desc, $ret)) {
                    $icon = pathinfo($ret[2]);
                    $item[] = array(‘title’ => $ret[3], ‘link’ => $this->base_url . $ret[1], ‘date’ => $date , "category" => $this->mixi_cal_icon[$icon[‘basename’]]);
                } 
            } 
        } 
        return $item;
    } 

    function &get_cal_term($act = "", &$content)
    {
        $result = array();
        switch ($act) {
            case ‘next’:
                preg_match(‘/<a href="(show_calendar\.pl\?.*?)">([^<>]+?)&nbsp;&gt;&gt;/’, $content, $match);
                $result = array("link" => $match[1], "title" => $match[2]);
                break;

            case ‘prev’:
                preg_match(‘/<a href="(show_calendar\.pl\?.*?)">&lt;&lt;&nbsp;([^<>]+)/’, $content, $match);
                $result = array("link" => $match[1], "title" => $match[2]);
                break;

            default:
                preg_match(‘/<a href="show_calendar\.pl\?year=(\d+)&month=(\d+).*?">[^&]*?<\/a>/’, $content, $match);
                $result = array("year" => intval($match[1]), "month" => intval($match[2]));
                //echo $content;
                //var_dump($result);
        } 
        return $result;
    } 

Posted by admin, filed under 活動記録. Date: 4月 19, 2008, 4:40 pm | 2 Comments »

mixiのAPIってなかなか公開されないですね。
待ってられないので、非公開API+mixiPHPで作ってみました。

■mixxxxxirss!

使い方は簡単で、上記URLにアクセスして、
メールアドレス、パスワード、ミクシィIDを入力するだけです。

「フィードURL発行」をクリックすると、専用のURLが発行されるので
それをRSSリーダに登録すればOK!

これらの個人情報はサーバ側に全く保存せず、URLに暗号化して
埋め込んでいるので、安心して使ってください(笑)

Special Thanks!

■mixiステーション2.2.1で追加されたAPIの発掘
 http://ido.nu/kuma/2007/08/01/two-more-api-found-in-mixi-station-221/

■mixiPHP
 http://trac.riaf.org/phpmixi/
 (注) mixiのデザインが変わっているので、このままだと動きませんでした。
とりあえず、以下の修正をすれば日記の取得だけはできます。
時刻のフォーマットはオリジナルから変更してます。

・345?346行目
        $pattern = ‘/<div class="listDiaryTitle">.*?<dt>(.*?)\n.*?<dd>(\d{4})年(\d{2})月(\d{2})日(\d{1,2}):(\d{2})<\/dd>’;
        $pattern .= ‘.*?<div id="diary_body">(.*?)<\/div>(.*?)$/is’;
 
・355?356行目
        $item[‘subject’] = $match[1];
        $item[‘date’] = sprintf("%04d/%02d/%02d %02d:%02d", $match[2], $match[3], $match[4], $match[5], $match[6]);
        $item[‘content’] = $match[7];

・358?365行目
        preg_match_all(‘/<span class="commentTitleName"><a href="(.*?)">(.*?)<\/a>.*?<span class="commentTitleDate">(\d{4})年(\d{2})月(\d{2})日&nbsp;(\d{1,2}):(\d{2})<\/span>.*?<dd>\n(.+?)<\/dd>/is’, $match[8], $comment, PREG_SET_ORDER);
        foreach($comment as $res) {
            $item[‘comment’][] = array(
                ‘date’ => sprintf("%04d/%02d/%02d %02d:%02d", $res[3], $res[4], $res[5], $res[6], $res[7]),
                ‘poster’ => $res[1],
                ‘name’ => $res[2],
                ‘content’ => $res[8]
                );
        }

Posted by admin, filed under 活動記録. Date: 4月 19, 2008, 3:06 am | No Comments »

wordpressってすごい簡単に設置できるんですね。
こんな素晴らしいソフトウェアがGPLなんて。。 すごい!!

(THIS IS)VERY GOOD SERVICEの活動記録や
ちょっと役立つ情報を発信して行こうかと思いますので
よろしくお願いします。

Posted by admin, filed under 活動記録. Date: 4月 19, 2008, 2:34 am | No Comments »