« 2007年09月 | メイン | 2007年11月 »



2007年10月 アーカイブ

2007年10月01日

大東京トイボックス2巻がないっ!

DSCF6973.jpg

「東京トイボックス」っていう漫画が昔モーニングに載っていたんです。載っていたと言うのは、モーニング版では物語は完結していて、今は新しく「大東京トイボックス」というタイトルでコミックバーズという雑誌で連載されているのです。
この大東京トイボックスの2巻を探し回っているのですが、なかなか見つからない。で最近やっと見つけた!と思って買ったら、『新訂版』の東京トイボックスの2巻だったorz
なんという商売上手・・・ちょっと色が違う装訂みただけで即買してしまった。

東京トイボックスは1~2巻まで出ていて完結しているんです。すぐに完結しちゃったため、単行本は1巻しか買いませんでした。そしたらいつの間にか「大東京トイボックス」で連載開始したらしく、こっちを集めようと思って1巻を買っておいたのですが、東京トイボックスの2巻買っちゃったじゃんか。いいけど。

ワタシはこの主人公の「太陽」というオトコと年もそれほど離れていないですし、ゲーム業界ではありませんが、ソフトウェア関係の仕事をしているため、感情移入しながら見ています。昔ドルアーガにはまったエピソードもなかなか面白かったです。ワタシの場合はファミコンだけど。

ワタシがプログラマになるきっかけを作ってくれた友人は、今任天堂で働いているって同窓会のときいってました。ゲーム業界のことはよくわからないんだけど、ホントにこんな感じなのかな。
出演するキャラクター紹介のページで、システム開発系のプログラムソースは「硬い」って表現があったけど、なにそれwwって思いました。携帯向けにjavaでゲーム描いたことあるけど、硬いとか柔いってのはないぞ。
なんて食って掛っちゃいけません。エンターテイメントですのでそんなことをいちいち気にしていたら面白い漫画はかけないですよね。リアリティは総合演出の一部です。

うめさん、これからも頑張って連載してくれ!と思っていたら、ちょwwwwまたしても2巻まででおあずけktkr
おめでたと言うことで、めでたい連載おやすみです。無事に赤ちゃん生まれることを祈ってます!

というわけで、今日は大東京トイボックス2巻を買いに行って復活待ちです。

via:難民チャンプ 月刊コミックバーズ

続きを読む "大東京トイボックス2巻がないっ!" »

★このコンテンツに目的の情報はありませんでしたか?


[ 最近のエントリーとその関連エントリー ]


[ スポンサードリンク ]

2007年10月30日

ユニコーンのトリビュートアルバムが出たようです。

ユニコーンのトリビュートアルバムが出たようです!
曲目リストはこんな感じ。

  1. キャプテンストライダム/ペケペケ
  2. GRAPEVINE/ニッポンへ行くの巻
  3. CHEMISTRY/自転車泥棒
  4. シュノーケル/おかしな2人
  5. SPARKS GO GO/ケダモノの嵐
  6. つじあやの/ミルク
  7. 東京スカパラダイスオーケストラ/I'm a Loser
  8. DOPING PANDA/ターボ意味無し
  9. TRICERATOPS/ヒゲとボイン
  10. PUFFY/働く男
  11. PUSHIM/珍しく寝覚めの良い木曜日
  12. フジファブリック/開店休業
  13. 星グランマニエと東京シュガー・ボーイズ(from氣志團)/SUGAR BOY
  14. 真心ブラザーズ/エレジー
  15. 宮沢和史in GANGA ZUMBA/すばらしい日々
  16. MONGOL800/大迷惑
  17. 吉井和哉/与える男

ユニコーン世代だけあってすげー注目です。
(つд⊂)
(;゚ Д゚)
スパゴーだ!高校の頃、「鉛の朝」学園祭でやったなぁw
チャーツク♪チャーツク♪チャーツク♪チャーツク♪ゴンゴンガンスカスカドンガンスカ♪
ナツカシス。。。
ほかにもMONGL800が大迷惑。コレも聴きたいですね。民生がオケの前で歌ってるのすげぇかっこよかったなぁ。コレもコピーしたんですけど、手島のソロのところで挫折したwてか、スコアに書いてなかった気がする。手島ショーとか落書きがかいてあったような。
真心ブラザーズは拝啓ジョンレノンの人たちだよね。アレはめちゃくちゃかっこよかったですよね。今もって無いけど。売ってるのかな。と思ったらyoutubeにあった!やべぇすげぇ泣ける。。。エレジーもいいけど、スプリングマンのテーマか、甘い乳房が聴きたかったかも。
というわけで明日買ってくる。


[ 最近のエントリーとその関連エントリー ]


2007年10月29日

ニコウゴコメントフォームを簡単設置!ブログパーツにしてみたよ

ニコウゴコメントフォームを簡単に設置できるようにしたよ!
もちろんニコニコ風なただ流れるコメントにもできます。いろいろカスタマイズしたい場合は、コッチを参照して、スクリプトをカスタマイズしてください。

<script src="http://labs.mojalog.com/mojascript/nicougo/nicougo.js" type=text/javascript></script>
<input type="text" id="nicougosendmsg">
<input type="button" onclick='initJsr();' value="ニコウゴする!" id="nicougobtn">
<!-- ユーザセッティングタグがない場合はデフォルトの値(以下のとおり)になります。環境に合わせてご利用ください //-->
<!-- ポップするウィンドウの幅指定 //-->
<input type="hidden" id="nicougowidth" value="360">
<!-- ポップするウィンドウの高さ指定 //-->
<input type="hidden" id="nicougoheight" value="240">
<!-- ポップするウィンドウの色指定 //-->
<input type="hidden" id="nicougobgcolor" value="#FFFFFF">
<!-- ポップするウィンドウの縦位置指定 //-->
<input type="hidden" id="nicougovpos" value="240">
<!-- ポップするウィンドウの横位置指定 //-->
<input type="hidden" id="nicougohpos" value="120">
<!-- メッセージのフォントサイズ指定 //-->
<input type="hidden" id="nicougofontsize" value="14">
<!-- ポップするウィンドウの透明度指定 //-->
<input type="hidden" id="nicougoopc" value="80">
<!-- コメントの流れるスピード指定 //-->
<input type="hidden" id="nicougospd" value="8">
<!-- コメントの揺れ幅指定 //-->
<input type="hidden" id="nicougoshake" value="8">
<!-- コメントの表示間隔指定 //-->
<input type="hidden" id="nicougoemgspan" value="80">
<!-- コメントの揺れ表示指定 0 無効 / 1 有効 //-->
<input type="hidden" id="isugougo" value="0">
<!--以下のdivタグはbodyタグを閉じる直前あたりに入れてください //-->
<div id="nicougowrap"></div>

[ 最近のエントリーとその関連エントリー ]


2007年10月28日

僕の小規模な生活が後3回って言ってるよ!(´A`)

DSCF7025.jpg

モーニング連載中の「僕の小規模な生活」著:福満しげゆきが後3回で終わるっていってます。
以前のエントリにも書いたんですけど、すごいおもしろいのに。続けろといわれたら続けるらしいので続けて欲しいです。メールもしておきます。(メールしておきました)モーニングのアンケートも送ります。
なんかネタフルさんも同じ内容のエントリを書いていましたよ。やっぱり人気あるんですね。

DSCF7026.jpg

で、今日たまたま本屋さんに、福満さんが「僕の小規模な失敗」で昔連載していた(らしい)"アックス"が売ってたので買いました。
"福満しげゆき"って小さく描いてあったので、「あー。漫画の中でモーニング以外で連載してるってのはやっぱりアックスかぁ」って思いまして。
したら漫画は載ってなかった(´A`)なんだよー
で、よく調べてみると「生活」っていうタイトルで連載してるみたい。オレもどんだけ好きなんだよって感じですね。


[ 最近のエントリーとその関連エントリー ]


2007年10月27日

ニコウゴコメントフォームをあなたのブログやサイトに設置する方法

nicougo.PNG

mojaラボ ニコウゴコメントフォームをJSONPでクロスドメイン対応にしました!
トップページにフォームがおいてあります

GET URLの構築

送信するURLはコチラです。
http://labs.mojalog.com/mojascript/nicougo/nicougo.php

リクエストURL例

http://labs.mojalog.com/mojascript/nicougo/nicougo.php?url=http%3a%2f%2fmojalog%2ecom%2f&msg=&fmt=nicougoload

リクエストパラメータ例

url=http%3a%2f%2fmojalog%2ecom%2f【URL】(document.URLをencodeURIしたもの)
msg=【投稿メッセージ】(空だと投稿は行いません)
fmt=nicougoload【nicougoloadというメソッド名で実装する】

パラメータ説明
urlstring(URLエンコード)利用者のURLです。URL(http/https)形式かどうかをサーバ側で判定しています。
msgstring(URLエンコード)送信するメッセージです。空だと投稿はされません。
fmtstring(コールバックメソッド名)実装するスクリプトのコールバック関数名を与えます

レスポンスフィールド例

nicougoload ([{"datetime" : "2007/10/27 22:50:25", "item" : "キタ――――(゚∀゚)――――"},{"datetime" : "2007/10/27 22:00:53", "item" : "32文字以上ですとサーバ側で切り落とします。"},{"datetime" : "2007/10/27 22:00:25", "item" : "投稿できる文字数は32文字になっています。32文字以上ですとサー…"},{"datetime" : "2007/10/27 21:58:31", "item" : "こんにちは"},{"datetime" : "2007/10/27 13:16:06", "item" : "firefoxだと妙に重い"},{"datetime" : "2007/10/27 13:06:12", "item" : "ニコウゴニコウゴ"},{"datetime" : "2007/10/27 13:04:30", "item" : "ニッコウゴにしてやんよ"},{"datetime" : "2007/10/27 13:04:10", "item" : "(゚∀゚)にこうご"},{"datetime" : "2007/10/27 13:03:35", "item" : "firefoxでも一応動くように…"},{"datetime" : "", "item" : "END"}]);

パラメータのfmtを省略した場合RESTで結果を返却します。

<?xml version="1.0" encoding="UTF-8" ?> 
<elems>
  <elem datetime="2007/10/27 22:50:25">キタ――――(゚∀゚)――――</elem> 
  <elem datetime="2007/10/27 22:00:53">32文字以上ですとサーバ側で切り落とします。</elem> 
  <elem datetime="2007/10/27 22:00:25">投稿できる文字数は32文字になっています。32文字以上ですとサー…</elem> 
  <elem datetime="2007/10/27 21:58:31">こんにちは</elem> 
  <elem datetime="2007/10/27 13:16:06">firefoxだと妙に重い</elem> 
  <elem datetime="2007/10/27 13:06:12">ニコウゴニコウゴ</elem> 
  <elem datetime="2007/10/27 13:04:30">ニッコウゴにしてやんよ</elem> 
  <elem datetime="2007/10/27 13:04:10">(゚∀゚)にこうご</elem> 
  <elem datetime="2007/10/27 13:03:35">firefoxでも一応動くように…</elem> 
</elems>

注意点

  • mojaラボ ニコウゴウェブサービスは、パラメータのurlが正しく解決できれば、サーバ側で持っているメッセージをすべて閲覧することが可能です。ある掲示板に、URL名でスレッドがたっているだけというイメージでご利用ください。
  • つまり、ニコウゴフォームを設置したサイトからでなくとも投稿や閲覧が可能です。何らかのパスワードや機密情報、個人情報などの投稿はお控えください。
  • ブログやサイトに設置する方は、エンドユーザに上記内容をお知らせすることをオススメします
  • 投稿されたメッセージはURL毎に30件保管します。それ以上のメッセージが送られると古いものから削除されます。(サーバの負荷などを見て変更されることがあります)
  • 投稿されたすべてのメッセージは、ご利用される方に通知連絡なしで削除されることがあります。
  • mojalog管理人は、ユーザが本サービスを利用して、損害や不利益を被った場合でも、一切の責任を負わず、一切の損害賠償の義務を負わないものとします

HTMLサンプル

サンプルhtmlはエントリ下部に記します。このhtmlサンプルは3つのjavascriptライブラリを利用しています。
1.JSONscriptRequestというライブラリを使用しています。
JSON and the Dynamic Script Tag: Easy, XML-less Web Services for JavaScript
こちらからダウンロードしてきてください。「1.My JSONscriptRequest class」ってとこにアンカされてます。

2.firefoxブラウザを判定するためのスクリプト
as flash as flexさん■[AJAX/JavaScript] UserAgentからブラウザを判定するオールマイティなJavaScript(browsercheck.js)を利用させてもらっています。

3.ニコニコでウゴウゴな表示をするためのスクリプト
nicougo.zip
dynamicdriveにあったドラッグ&ドロップスクリプトを利用しています。 via : dynamicdrive
nicougo.jsの中身は表示方法などを記述したスクリプトです。ご自由にいじってくださっても構いません。といいますか、いい感じな見せ方ができたら教えて欲しいです。ワタシscriptいじるの下手なんで。

htmlに必要なのは以下のコードです。タグのidがご自身のページで競合した場合は、スクリプトのほうも合わせて変更してください。
最後のdivタグ(id=nicougowrap)はbodyタグを閉じる直前あたりに書いたほうがいいかもしれません。

<input type="text" id="nicougosendmsg">
<input type="button" onclick='initJsr();' value="ニコウゴする!" id="nicougobtn">
<div id="nicougowrap"></div>

nicougo.jsはご自由にいじってください。一応 user setting に適当なコンフィグを用意しておきました。

// user setting.
var NICOUGOWIDTH    = 360;       // display width.
var NICOUGOHEIGHT   = 240;       // display height.
var NICOUGOBGCOLOR  = "#FFFFFF"; // display color.
var NICOUGOVPOS     = "240px";   // display vertical position.
var NICOUGOHPOS     = "120px";   // display horizonal position.
var NICOUGOFONTSIZE = 14;        // font size.
var NICOUGOOPC      = 80;        // opacity.
var NICOUGOSPD      = 16;        // speed.
var NICOUGOSHAKE    = 8;         // ugougo shakes.
var NICOUGOEMGSPAN  = 80;        // emerge span.
// user setting.

var itemList;
var topBlurList;
var leftBlurList;
var jsrInst;
var dataSize     = 0;
var nowRendering = false;

var Drag = {

    obj : null,
    init : function( o, oRoot, minX, maxX, minY, maxY, bSwapHorzRef, bSwapVertRef, fXMapper, fYMapper )
    {
        o.onmousedown = Drag.start;
        o.onmouseover = Drag.over;
        o.onmouseout  = Drag.out;
        o.hmode       = bSwapHorzRef ? false : true ;
        o.vmode       = bSwapVertRef ? false : true ;
        o.root = oRoot && oRoot != null ? oRoot : o ;
        if ( o.hmode  && isNaN( parseInt( o.root.style.left   ) ) ) o.root.style.left   = "0px";
        if ( o.vmode  && isNaN( parseInt( o.root.style.top    ) ) ) o.root.style.top    = "0px";
        if ( !o.hmode && isNaN( parseInt( o.root.style.right  ) ) ) o.root.style.right  = "0px";
        if ( !o.vmode && isNaN( parseInt( o.root.style.bottom ) ) ) o.root.style.bottom = "0px";
        o.minX    = typeof minX != 'undefined' ? minX : null;
        o.minY    = typeof minY != 'undefined' ? minY : null;
        o.maxX    = typeof maxX != 'undefined' ? maxX : null;
        o.maxY    = typeof maxY != 'undefined' ? maxY : null;
        o.xMapper = fXMapper ? fXMapper : null;
        o.yMapper = fYMapper ? fYMapper : null;
        o.root.onDragStart = new Function();
        o.root.onDragEnd   = new Function();
        o.root.onDrag      = new Function();
    },

    start : function( e )
    {
        var o = Drag.obj = this;
        e = Drag.fixE( e );
        var y = parseInt( o.vmode ? o.root.style.top  : o.root.style.bottom );
        var x = parseInt( o.hmode ? o.root.style.left : o.root.style.right  );
        o.root.onDragStart( x, y );

        o.lastMouseX = e.clientX;
        o.lastMouseY = e.clientY;

        if ( o.hmode ) {
            if ( o.minX != null ) o.minMouseX = e.clientX - x + o.minX;
            if ( o.maxX != null ) o.maxMouseX = o.minMouseX + o.maxX - o.minX;
        } 
        else {
            if ( o.minX != null ) o.maxMouseX = -o.minX + e.clientX + x;
            if ( o.maxX != null ) o.minMouseX = -o.maxX + e.clientX + x;
        }

        if ( o.vmode ) {
            if ( o.minY != null ) o.minMouseY = e.clientY - y + o.minY;
            if ( o.maxY != null ) o.maxMouseY = o.minMouseY + o.maxY - o.minY;
        } 
        else {
            if ( o.minY != null ) o.maxMouseY = -o.minY + e.clientY + y;
            if ( o.maxY != null ) o.minMouseY = -o.maxY + e.clientY + y;
        }

        document.onmousemove = Drag.drag;
        document.onmouseup   = Drag.end;

        return false;
    },

    drag : function( e )
    {
        e = Drag.fixE( e );
        var o = Drag.obj;

        var ey = e.clientY;
        var ex = e.clientX;
        var y = parseInt( o.vmode ? o.root.style.top  : o.root.style.bottom );
        var x = parseInt( o.hmode ? o.root.style.left : o.root.style.right  );
        var nx, ny;

        if ( o.minX != null ) ex = o.hmode ? Math.max( ex, o.minMouseX ) : Math.min( ex, o.maxMouseX );
        if ( o.maxX != null ) ex = o.hmode ? Math.min( ex, o.maxMouseX ) : Math.max( ex, o.minMouseX );
        if ( o.minY != null ) ey = o.vmode ? Math.max( ey, o.minMouseY ) : Math.min( ey, o.maxMouseY );
        if ( o.maxY != null ) ey = o.vmode ? Math.min( ey, o.maxMouseY ) : Math.max( ey, o.minMouseY );

        nx = x + ( ( ex - o.lastMouseX ) * ( o.hmode ? 1 : -1 ) );
        ny = y + ( ( ey - o.lastMouseY ) * ( o.vmode ? 1 : -1 ) );

        if ( o.xMapper )      nx = o.xMapper( y )
        else if ( o.yMapper ) ny = o.yMapper( x )

        Drag.obj.root.style[ o.hmode ? "left" : "right" ] = nx + "px";
        Drag.obj.root.style[ o.vmode ? "top" : "bottom" ] = ny + "px";
        Drag.obj.lastMouseX = ex;
        Drag.obj.lastMouseY = ey;

        Drag.obj.root.onDrag( nx, ny );
        return false;
    },

    end : function()
    {
        document.onmousemove = null;
        document.onmouseup   = null;
        Drag.obj.root.onDragEnd( parseInt( Drag.obj.root.style[ Drag.obj.hmode ? "left" : "right" ] ), 
                                 parseInt( Drag.obj.root.style[ Drag.obj.vmode ? "top" : "bottom" ] ) );
        Drag.obj = null;
    },

    over : function( e )
    {
        nowRendering = true;
        return false;
    },

    out : function( e )
    {
        nowRendering = false;
        rendering();
        return false;
    },

    fixE : function( e )
    {
        if ( typeof e        == 'undefined' ) e = window.event;
        if ( typeof e.layerX == 'undefined' ) e.layerX = e.offsetX;
        if ( typeof e.layerY == 'undefined' ) e.layerY = e.offsetY;
        return e;
    }
};

// setup json script request.
function initJsr()
{
    // ローカルでテストする場合は encodeURI( document.URL ) を'http%3a%2f%2fexample%2ecom%2f'など実URLに変更する必要があります
    jsrInst = new JSONscriptRequest( 'http://labs.mojalog.com/mojascript/nicougo/nicougo.php?url=' 
                                    + encodeURI( document.URL ) + '&msg=' 
                                    + encodeURI( document.getElementById( "nicougosendmsg" ).value ) 
                                    + '&fmt=nicougoload' );
    jsrInst.buildScriptTag();
    jsrInst.addScriptTag();
}

function nicougoload( param ){
	var nicougoItem = "";
	dataSize = param.length;
    for( idx = 0; idx < dataSize; idx++ ){
        nicougoItem = nicougoItem + '<div id="nicougomsg' + idx 
                                  + '" style="position:absolute; top:0px; left:' + NICOUGOWIDTH 
                                  + 'px; font-size:' + NICOUGOFONTSIZE 
                                  + 'px;"><Nobr><ruby><rb>' + param[ idx ].item 
                                  + '</rb><rp>(</rp><rt>' + param[ idx ].datetime 
                                  + '</rt><rp>)</rp></ruby></Nobr></div>';
    }
    isRender = true;

    var browserInf = new BrowserInfo();
    var inf = 'filter:Alpha( opacity=' + NICOUGOOPC + ' );';
    if( browserInf.firefox ){
        inf = '-moz-opacity:' + NICOUGOOPC / 100 + ';';
    }
    else if( browserInf.opera ){
        inf = 'opacity:' + NICOUGOOPC / 100 + ';';
    }

    document.getElementById( "nicougowrap" ).innerHTML = '<div id="nicougo" style="position:absolute; top:' + NICOUGOVPOS
                                                       + '; left:' + NICOUGOHPOS
                                                       + '; width:' + NICOUGOWIDTH
                                                       + 'px; height:' + NICOUGOHEIGHT
                                                       + 'px; padding: 5px; cursor:move; background-color:#ffffff;' 
                                                       + inf
                                                       + '"><span style="cursor:pointer;" onclick="unload()">'
                                                       + '<img alt="閉じる" src="close.PNG" /></span>' 
                                                       + nicougoItem + '</div>';

    jsrInst.removeScriptTag();
    Drag.init( document.getElementById( "nicougo" ) );
    setupItem();
    rendering();
}

function setupItem()
{
    itemList     = new Array();
    topBlurList  = new Array();
    leftBlurList = new Array();

    for( idx = 0; idx < dataSize; idx++ ){
        itemList.push( document.getElementById( "nicougomsg" + idx ) );
        itemList[ idx ].style.top = 20 + ( Math.random() * ( NICOUGOHEIGHT - 60 ) );
        topBlurList.push( parseInt( itemList[ idx ].style.top ) );
        leftBlurList.push( parseInt( itemList[ idx ].style.left ) + ( idx * NICOUGOEMGSPAN ) );
    }

    nowRendering = false;
}

function rendering(){
    document.getElementById( "nicougobtn" ).disabled = true;
    if( nowRendering ) return false;

    for( idx = 0; idx < dataSize; idx++ ){
        itemList[ idx ].style.position = 'absolute';
        leftBlurList[ idx ] = leftBlurList[ idx ] - NICOUGOSPD;

        if( leftBlurList[ idx ] <= NICOUGOWIDTH ){
            itemList[ idx ].style.display = "";
            itemList[ idx ].style.left = parseInt( itemList[ idx ].style.left ) - NICOUGOSPD + "px";
        }
        else {
            itemList[ idx ].style.display = "none";
        }
        var browserInf = new BrowserInfo();
        var vanishPoint = 0;
        if( browserInf.firefox ){
            vanishPoint = 0;
        }
        else {
            vanishPoint = itemList[ idx ].innerText.length * parseInt( itemList[ idx ].style.fontSize );
        }

        if( leftBlurList[ idx ] + ( vanishPoint ) <= 0 ){
            itemList[ idx ].innerHTML = "";
        }
        itemList[ idx ].style.top = topBlurList[ idx ] + ( Math.random() * NICOUGOSHAKE ) + "px";
    }
    if( itemList[ dataSize -1 ].innerHTML == "" ){
        unload();
    }
    else {
        setTimeout( 'rendering()', 100 );
    }
}

function unload(){
    nowRendering = false;
    document.getElementById( "nicougobtn" ).disabled = false;
    document.getElementById( "nicougowrap" ).innerHTML = "";
}

[ 最近のエントリーとその関連エントリー ]


ニコウゴコメントフォームについて

ニコウゴコメントフォームは、あなただけに見えている情報ではありません。普通の掲示板などと同じで、投稿した内容はもちろんみんなに見えていますので、個人情報を投稿したりしないようにご注意ください。
嫁さんがなんか勘違いしてました。
「え?あたしの投稿はあたしにしか見えないんじゃないの?」だって。ちがいますよ。

ちなみに、フォームになにも入力しないでニコウゴボタンを押下すると、投稿はしないでニコウゴウィンドウがポップします。


[ 最近のエントリーとその関連エントリー ]


2007年10月25日

ニコニコでウゴウゴなサービス作ったよ!

nicougo.PNG

ニコウゴウェブサービスを作りました!ニコニコ動画みたいな流れるメッセージにウゴウゴルーガみたいな動きをプラスしたコメントフォームです。
トップページの上部にフォームがありますのでなにかコメントしてみてください。ニコニコでウゴウゴな窓っぽいのがあがります。
一応、これもクロスドメイン対応ですのでご自身のブログに設定したければできます。そのうち仕様と、導入方法をお知らせします


[ 最近のエントリーとその関連エントリー ]


2007年10月24日

mojaラボ成分解析もJSONP対応であなたのページに使えます!

mojaラボ成分解析もJSONPでクロスドメインで使えるようにしました!

GET URLの構築

送信するURLはコチラです。
http://labs.mojalog.com/mojascript/elemanalysis/crtPie.php

リクエストURL例

http://labs.mojalog.com/mojascript/elemanalysis/crtPie.php?item=%E3%81%AA%E3%81%BE%E3%81%88&userdict=%E3%83%96%E3%83%AD%E3%82%B0%0D%0A%E7%94%9F%E6%B4%BB&fmt=callback

リクエストパラメータ例

item=%E3%81%AA%E3%81%BE%E3%81%88【なまえ】
userdict=%E3%83%96%E3%83%AD%E3%82%B0%0D%0A%E7%94%9F%E6%B4%BB【ブログ(改行)生活】
fmt=callback【callbackというメソッド名で実装する】

パラメータ説明
itemstring(URLエンコード)解析対象テキストです
userdictstring(URLエンコード)※解析マッピングシードです。改行で区切って複数のシードが設定可能です。(最大20個)
fmtstring(コールバックメソッド名)実装するスクリプトのコールバック関数名を与えます

※解析マッピングシードとは、「××」が○パーセントという結果の、「××」を生成するワードです。
このワード1つ1つを連想検索エンジンに送信し、受信に成功した場合、1件当たり50個の関連ワードを受信します。
(例:「ブログ」を送信した結果)
http://labs.preferred.jp/reflexa/api.php?q=%E3%83%96%E3%83%AD%E3%82%B0&format=xml
この結果の総数(最大1000個)から成分解析を行います。

レスポンスフィールド例

callback ([{"title" : "ブロガー", "value" : "93"},{"title" : "申し入れ", "value" : "6"},{"title" : "Blogger", "value" : "1"}]);

パラメータのfmtを省略した場合RESTで結果を返却します。

<?xml version="1.0" encoding="UTF-8" ?>
<pie>
    <slice title="ブロガー">93</slice>
    <slice title="申し入れ">6</slice>
    <slice title="Blogger">1</slice>
</pie>

HTMLサンプル

サンプルhtmlはコチラになります。このhtmlサンプルはJSONscriptRequestというライブラリを使用しています。
javascriptのライブラリは、
JSON and the Dynamic Script Tag: Easy, XML-less Web Services for JavaScript
こちらからダウンロードしてきてください。「1.My JSONscriptRequest class」ってとこにアンカされてます。

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=uft-8" />
<title>sample html</title>
<script type="text/javascript" src="jsr_class.js"></script>
<script type="text/javascript">
var jsrInst;
function getItems(){
    jsrInst = new JSONscriptRequest('http://labs.mojalog.com/mojascript/elemanalysis/crtPie.php?item=' + encodeURI( document.getElementById( 'item' ).value ) + '&userdict=' + encodeURI( document.getElementById( 'userdict' ).value ) + '&fmt=json');
    jsrInst.buildScriptTag();
    jsrInst.addScriptTag();
}
// コールバックがjsonなのでjsonというメソッド。
function json( data ) {
    var html = "";
    for( idx = 0; idx < data.length; idx++ ){
        html = html + data[ idx ].title + ":" + data[ idx ].value + "%<br />";
    }
    // スライスしたリファラはご自由に使ってください
    document.getElementById('result').innerHTML = document.getElementById( 'item' ).value + "を構成する成分の分析結果<br />" + html;
    jsrInst.removeScriptTag();
}
</script>
</head>
<body>
<input type="text" id="item">
<!--ユーザに解析マッピングシードを変更させたくない場合は非表示にする-->
<span style="display:none">
<textarea id="userdict">成分
原料
</textarea>
</span>
<input type="button" onclick="getItems()" value="解析">
<div id="result"></div>
</body>
</html>

HTMLサンプルamCharts適用版

ampiedir.PNG

コチラのサンプルは、amChartsのPIE & DONUT CHARTを使用したものです。ダウンロードページにリンクを張っておきます。

  1. まず、(現在のバージョン)ampie_1.2.5.zipというアーカイブをダウンロードして解凍します。
  2. 解凍したディレクトリを開くと、「examples」というディレクトリがあるかと思います。そこに、コチラからダウンロードしたexamples.zipを解凍し、そのままかぶせてください。
  3. さらに、JSON and the Dynamic Script Tag: Easy, XML-less Web Services for JavaScriptをダウンロードして解凍します
  4. jsr_class.jsというファイルをexamplesディレクトリの中に放り込みます

ampiedir2.PNG

それぞれのファイルをかぶせると、ディレクトリはこんな感じの状態(画像参照)になるかと思います。test.htmlを開いてデータを送信し、受信した内容がレンダリングされることを確認してください。ブラウザのフラッシュのバージョンによっては、グラフが正しく表示されない可能性があります。
一応、受信したJSON形式のデータをフラッシュに食わせて表示されるところまで確認が取れています。

  • IE
  • fire fox
  • sleipnir
  • bugbrowser

ちなみに、examples.zip内のampie_data.xmlは初期化データが入っています。これは、initPieメソッドで表示されるデータが空であって欲しいためです。もっといい方法があれば適宜変更するなどしてください。
ampie_settings.xmlはフラッシュのコンフィグファイルです。グラフのカラーや大きさ、タイトルヘッダなどはここで変更を加えます。

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=uft-8" />
<title>sample</title>
<script type="text/javascript" src="../ampie/swfobject.js"></script>
<script type="text/javascript" src="jsr_class.js"></script>
<script type="text/javascript">
function initPie(){
    var so = new SWFObject("../ampie/ampie.swf", "ampie", "520", "400", "7", "#FFFFFF");
    so.addVariable("path", "../ampie/");
    so.addVariable("chart_id", "ampie");
    // グラフのコンフィグセッティング
    so.addVariable("settings_file", escape("ampie_settings.xml"));
    // 空のグラフデータ
    so.addVariable("data_file", escape("ampie_data.xml"));
    so.addVariable("preloader_color", "#999999");
    so.write("flashcontent");
}

var jsrInst;
function getItems(){
    jsrInst = new JSONscriptRequest( 'http://labs.mojalog.com/mojascript/elemanalysis/crtPie.php?item=' + encodeURI( document.getElementById( 'item' ).value ) + '&userdict=' + encodeURI( document.getElementById( 'userdict' ).value ) + '&fmt=json' );
    jsrInst.buildScriptTag();
    jsrInst.addScriptTag();
}
// コールバックがjsonなのでjsonというメソッド。
function json( data ) {
    var html = "";
    
    // 0件返却時のampie.swfエラー抑止
    var xml = "<slice title=\"\">0</slice>";
    for( idx = 0; idx < data.length; idx++ ){
        html = html + data[ idx ].title + ":" + data[ idx ].value + "%<br />";
        xml = xml + "<slice title=\"" + data[ idx ].title + "\">" + data[ idx ].value + "</slice>";
    }
    // 分析結果のレンダリングはご自由に
    document.getElementById( 'result' ).innerHTML = document.getElementById( 'item' ).value + "を構成する成分の分析結果<br />" + html;
    jsrInst.removeScriptTag();
    var flashMovie = document.getElementById("ampie");
    flashMovie.setData('<pie>' + xml + '</pie>');
}
</script>
</head>
<body>
<input type="text" id="item">
<!--ユーザに解析マッピングシードを変更させたくない場合は非表示にする-->
<span style="display:none">
<textarea id="userdict"></textarea>
</span>
<input type="button" onclick="initPie();getItems()" value="解析">
<div id="result"></div>
<div id="flashcontent"></div>
</body>
</html>

ざっくりですが、こんな感じです。これでご自身のページにも簡単(では無いかもしれませんが)に成分解析ページがつくれますね!適宜、ファイルのアップロードパスなどを調整してご自身のブログやホームページに使ってみてください。ほいでわ


[ 最近のエントリーとその関連エントリー ]


2007年10月23日

検索ワードの有効利用エントリのお詫びと訂正

リファラをスライスするサービス作ったよ!なんてココココで鼻息を荒くしながら紹介したのですが、あのままですと他のドメイン(mojalog.com以外)からjavascriptで呼ぶことが出来ないじゃんかってことが調べていたら判ったので(ブフー)呼べるようにしました。みて下さった方にお詫びいたします。すみませんでした。

特に当該エントリに引用いただいたコマネタ帳のネタ帳さん。申し訳ございません。
コマネタ帳:コチラがメインブログでしょうか

このクロスドメインの問題はウェブサービスをいくつか作っているうちに判っていたことなのですが、放置していました。重ねてすみません。

というわけで、テスト用のhtml(エントリ下部参照)と、javascriptのライブラリをご自身のサイトにアップロードして、正しく動けばいろいろいじくれるかと思います。一応、labs.mojalog.comのサブドメインで試してみたので大丈夫かと思います。
javascriptのライブラリは、
JSON and the Dynamic Script Tag: Easy, XML-less Web Services for JavaScript
こちらからダウンロードしてきてください。「1.My JSONscriptRequest class」ってとこにアンカされてます。

このクロスドメイン版は、JSONPという技術で実現しているのですが、JSONのデータフォーマットにコールバック関数なる記述を加えることによってクロスドメインの制約を解決しているわけです。判りにくいですね。
判りやすい説明がありましたので引用させていただきます。といいますか、ほとんどこちらの戯言++さんでいろいろ調べさせていただきました。

via : 戯言++さん
JavaScript でリモートのデータを呼び込む際に2通りの方法があると説明しました。ひとつは XMLHttpRequest クラスを使う方法,もうひとつは JavaScript ソースとしてインクルードする方法です。「クロスドメインの制約」からXMLHttpRequest を使う方法では読込先が他ドメインの場合は使えません。そこでデータを JSONP の形式にして JavaScript のソースとしてインクルードしてしまうわけです。また JSONP は関数呼び出しの形式になっているので,その関数の処理を別に記述することでコールバック関数のように機能します。

リモートのデータをjavascriptのソースとしてインクルードするということみたいですね。すごいね。
リファラのスライスサービス・サーバ側は、json([{"idx":"0","item","hoge"}]);というコールバックをしますので、script側の実装はお好きな方法でどうぞ。
サンプルソースはこんな感じです。上記のjsr_class.jsというライブラリを使用させていただいています。

<html>
<head>
<script type="text/javascript" src="jsr_class.js"></script>
<script type="text/javascript">
var jsrInst;
function getItems(){
    // google でjavascript jsonという検索を行ったと仮定します。
    jsrInst = new JSONscriptRequest('http://mojalog.com/mojascript/gsajax/refrxml.php?refr=http%3A//www.google.co.jp/search%3Fhl%3Dja%26q%3Djavascript+json%26lr%3D&fmt=json');
    // 実際にはこう使う
    // var jsrInst = new JSONscriptRequest('http://mojalog.com/mojascript/gsajax/refrxml.php?refr=' + escape( top.document.referrer ) + '&fmt=json');
    jsrInst.buildScriptTag();
    jsrInst.addScriptTag();
}

// コールバックがjsonなのでjsonというメソッド。変えちゃだめっぽい
function json( data ) {
    var html = "";
    for( idx = 0; idx < data.length; idx++ ){
        alert( data[ idx ].item );
        alert( data[ idx ].idx );
        html = html + data[ idx ].item + ",";
    }
    // スライスしたリファラはご自身の検索フォームにおくなど、ご自由に使ってください
    document.getElementById('result').innerHTML = html;
    jsrInst.removeScriptTag();
}
</script>
</head>
<body>
<input type="button" onclick="getItems()" value="send">
<div id="result"></div>
</body>
</html>

[ 最近のエントリーとその関連エントリー ]


2007年10月22日

mojaラボ 気になる成分解析をつくったよ!

elemanalysis.PNG

昨日、受け攻め度チェックをやってみたのですが、こういう占いみたいのって結構おもしろいなぁと思ってmojaラボ気になる成分解析を作ってみました!

成分解析って、「××」が「○○」パーセントの、「××」の部分の列挙が結構しんどいんですね。で、グッと来るワードってなんだろうなぁなんて考えていたのですが、途中でめんどくさくなって、これを連想検索エンジンに任せることにしました。
連想検索エンジンとは、あるワードに対して、(検索エンジンの上でかな?)連想されるワードを50個返してくれるもので、適当な言葉をたくさん列挙したい場合にはとても便利です。
というわけで、成分解析の「××」が「○○」パーセントの「××」の部分を連想検索エンジンに任せて成分解析apiに通すと、自分も予期していなかった変な言葉が返ってきて意外と面白かったです。
今日、10/22にmojalogを解析してみましたら

  • word press:65.3%
  • スポ根:21.3%
  • さきっちょ:8%
  • 溜息:5.3%

ってでました。なにこれ。どっちかっていうとword pressより、movable typeが65.3%なんだけど。しかもさきっちょて。なんのだ。

ちなみに、成分解析結果は日ごとに変わるように出来ています。
デフォルトで連想検索に飛ばすワードがなんとなく恣意的なのは、面白い解析を得たかったからです。へへへ。

尚、ψ(プサイ)の興味関心空間さんでロジックを参考にさせていただきました。また、gigazineさんのエントリでamchartsの適用を参考にさせていただきました。(amchartsすげー)
via :amCharts, ψ(プサイ)の興味関心空間, gigazine


[ 最近のエントリーとその関連エントリー ]


受け攻め度チェックやってみた。

uranai.JPG

受け攻め度チェックというのがあったのでやってみました
○○○○は実名を使ったので、伏せています。(キャプチャのほうも)

○○○○さんは自己中攻 です!

● 自己中攻の貴方は
★性格★
実直で義理人情に厚いタイプでとても円満な人格者。
他人と争うことが嫌いで、自分が傷つくことはもちろん、相手が痛手を受けることも苦手。
人との調和をとったり、お互いに楽しく気分良く過ごせることが何より大切だと考えてます。
どんな環境にも順応できる、たくましさと適応力を持っている人です。

>インライン
>バランス感覚はいいほうかなーなんて思ったりしてます。
>環境適応能力もそんなにわるくないかなと。ほう。結構あってそうだ。

★夜の性格★
ヤリたいと思ったら相手の都合を考えずに盛ります。
自分が満足する為に快楽を追い求める、まさに自己中心。
相手を支配したい欲求が強いのでバックの体勢が一番のお気に入り。
自分ひとりがスッキリしてしまうことも多々あります。
もう少し相手のコトも考えてみましょう。

>インライン
>なんか全体的にしかられました。。。

★相性★
天然受・誘い受

>インライン
>「天然受」「誘い受」をダレカ説明してくれ

● ○○○○さんは一生のあいだに、500人の異性を好きになります。

>インライン
>もうずっと人大杉(´∀`)


[ 最近のエントリーとその関連エントリー ]


2007年10月21日