ラベル 電子書籍 の投稿を表示しています。 すべての投稿を表示
ラベル 電子書籍 の投稿を表示しています。 すべての投稿を表示

2010年9月6日月曜日

[Programming] ActiBookコンテンツをFlash無しで読むためのブックマークレット



先日こんなのを作りまして、その後、いろんなところでActiBookコンテンツが利用されており、また、いくつかのバリエーションがあるというのがわかりましたんでちまちまと改良しておりました。

ActiBookコンテンツは通常、_SWF_Window.htmlでラップされており、ググると結構な数がヒットするんですが、たいがいのものはこのブックマークレットで読めるようです。動作はiPadと、Mac OSX上のFirefoxおよびSafariで確認済ですが、IEではたぶん動かないでしょう(setIntervalに3つ目の引数を渡すコードが含まれてますんで)。ChromeとOperaは未確認です。というか確認する気もないんですがw
javascript:var%20_G04={prefs:{zoom:1.6,indicatorWait:2000,mode:"two-facing-pages"},imageList:[],ix:0,baseHeight:undefined,baseWidth:undefined,drawerTimer:[],t2:undefined,serviceType:"",part:[],direction:"left",zoom:[],curZoom:1,mode:"",init:function(){var%20u=document.baseURI;if(u.match(/view\.swf/)||u.match(/ActiBook\.swf/)){document.location=u.slice(0,u.lastIndexOf("/"))+"/_SWF_Window.html";return;}if(!u.match(/_SWF_Window\.html/)){return;}document.body.bgColor="#eeeeee";document.body.style.overflow="auto";document.body.innerHTML="<div%20id='buttonL'%20style='opacity:0;background-color:#000;position:absolute;left:0px;top:0x;width:100px;z-index:2;'></div>"+"<div%20id='buttonR'%20style='opacity:0;background-color:#000;position:absolute;top:0x;width:100px;z-index:2;'></div>"+"<div%20id='picture'%20style='position:absolute;left:0px;top:0px;z-index:1;'><canvas%20id='tc'></canvas></div>"+"<div%20id='indicator'%20style='position:absolute;-moz-border-radius:16px;-webkit-border-radius:16px;top:160px;width:300px;z-index:2;opacity:0.9;background-color:#aaaaaa;font-family:Copperplate,sans-serif;font-size:48px;font-style:bold;color:white;text-align:center;vertical-align:middle;'></div>"+"<div%20id='cp'%20onMouseOver='_G04.showCP()'%20onMouseOut='_G04.hideCP()'%20ongesturestart='_G04.showCP()'%20style='font-size:20px;font-style:bold;color:white;margin:12px;padding:12px;-moz-border-radius:16px;-webkit-border-radius:16px;background-color:#aaaaaa;align:center;position:absolute;left:100px;top:0px;height:100px;z-index:2;opacity:0.0;'>"+"page&nbsp;<select%20id='page'%20onchange='_G04.jumpTo()'></select>&nbsp;"+"zoom&nbsp;<select%20id='zoom'%20onchange='_G04.changeZoom()'></select>&nbsp;"+"mode&nbsp;<select%20id='mode'%20onchange='_G04.changeMode()'><option%20value='single-page'>single%20page</option><option%20value='two-facing-pages'>two%20facing%20pages</option></select>&nbsp;"+"&nbsp;&nbsp;<a%20onclick='_G04.hideCP()'><font%20color='red'>[close]</font></a>"+"</div>";var%20x=u.slice(0,u.lastIndexOf("/"))+"/books/db/book.xml";var%20r=new%20XMLHttpRequest();r.open("GET",x,false);r.send(null);var%20d=(new%20DOMParser()).parseFromString(r.responseText,"text/xml");var%20z=d.getElementsByTagName("PageSize");if(z.length){for(var%20i=0;i<z.length;i++){_G04.zoom.push(z[i].getAttribute("zoom"));}}else{var%20x2=u.slice(0,u.lastIndexOf("/"))+"/books/db/viewer.xml";var%20r2=new%20XMLHttpRequest();r2.open("GET",x2,false);r2.send(null);var%20d2=(new%20DOMParser()).parseFromString(r2.responseText,"text/xml");_G04.zoom=d2.getElementsByTagName("zoom_s")[0].firstChild.nodeValue.split(",");}_G04.zoom.sort();_G04.curZoom=_G04.zoom[0];for(var%20i=1;i<_G04.zoom.length;i++){if(Math.abs(_G04.prefs.zoom-_G04.zoom[i])<Math.abs(_G04.prefs.zoom-_G04.curZoom)){_G04.curZoom=_G04.zoom[i];}}if(u.split("?")[1]){var%20p=u.split("?")[1].split("&");for(var%20i=0;i<p.length;i++){if(p[i].split("=")[0]=="pagecode"){_G04.ix=parseInt(p[i].split("=")[1])-1;}}}_G04.mode=_G04.prefs.mode;var%20o=document.getElementById("mode").options;for(var%20i=0;i<o.length;i++){o[i].selected=(o[i].value==_G04.mode);}_G04.direction=d.getElementsByTagName("to_open")[0].firstChild.nodeValue;if(_G04.direction=="only"){document.getElementById("mode").value="single-page";document.getElementById("mode").disabled=true;_G04.mode="single-page";_G04.direction="right";}if(_G04.direction=="right"){document.getElementById("buttonL").onclick=_G04.forward;document.getElementById("buttonR").onclick=_G04.backward;}else{document.getElementById("buttonL").onclick=_G04.backward;document.getElementById("buttonR").onclick=_G04.forward;}_G04.serviceType=_G04.getServiceType(u);var%20p=d.getElementsByTagName("page");for(var%20zs=0;zs<_G04.zoom.length;zs++){_G04.imageList[_G04.zoom[zs]]=[];for(var%20i=0;i<p.length;i++){var%20cover="";if(p[i].getElementsByTagName("cover")[0]){cover=p[i].getElementsByTagName("cover")[0].firstChild.nodeValue;}switch(_G04.serviceType){case%20"actibook1":var%20n=p[i].getElementsByTagName("number")[0].firstChild.nodeValue;var%20ext=p[i].getElementsByTagName("type")[0]?p[i].getElementsByTagName("type")[0].firstChild.nodeValue:"jpg";if(n>=0){_G04.imageList[_G04.zoom[zs]].push({cover:cover,url:x.match(/(.*books\/)/)[1]+"images/"+_G04.zoom[zs].toString()+"/"+n+"."+ext});}break;case%20"actibook2":_G04.imageList[_G04.zoom[zs]].push({cover:cover,url:x.match(/(.*books\/)/)[1]+"images/"+_G04.zoom[zs].toString()+"/"+p[i].getElementsByTagName("image")[0].firstChild.nodeValue+"/"});break;}}}_G04.baseHeight=d.getElementsByTagName("h")[0].firstChild.nodeValue;_G04.baseWidth=d.getElementsByTagName("w")[0].firstChild.nodeValue;var%20ops="";for(var%20i=0;i<_G04.imageList[_G04.curZoom].length;i++){ops+="<option%20value='"+i+"'>"+(i+1).toString()+"</option>";}document.getElementById("page").innerHTML=ops;ops="";for(var%20i=0;i<_G04.zoom.length;i++){ops+="<option%20value='"+_G04.zoom[i]+"'%20"+((_G04.curZoom==_G04.zoom[i])?"selected":"")+">x"+_G04.zoom[i].toString()+"</option>";}document.getElementById("zoom").innerHTML=ops;_G04.draw();},buildFrame:function(){var%20h=_G04.baseHeight*_G04.curZoom;var%20w=_G04.baseWidth*_G04.curZoom;if(_G04.mode=="two-facing-pages"){if(!_G04.imageList[_G04.curZoom][_G04.ix].cover){w*=2;}}document.getElementById("picture").style.height=h+"px";document.getElementById("picture").style.width=w+"px";document.getElementById("buttonL").style.height=h+"px";document.getElementById("buttonR").style.left=w-100+"px";document.getElementById("buttonR").style.height=h+"px";document.getElementById("indicator").style.left=w/2-150+"px";document.getElementById("cp").style.width=w-200+"px";document.getElementById("tc").width=w;document.getElementById("tc").height=h;},getServiceType:function(url){var%20u=url.slice(0,url.lastIndexOf("/"))+"/books/images/"+_G04.zoom[0]+"/1.jpg";var%20r=new%20XMLHttpRequest();r.open("GET",u,false);r.send(null);if(r.status==200){if(r.getResponseHeader("Content-Type")!="image/jpeg"){return%20"actibook2";}else{return%20"actibook1";}}return%20"actibook2";},forward:function(){if(_G04.mode=="single-page"){if(_G04.ix==_G04.imageList[_G04.curZoom].length-1){return;}else{_G04.ix++;}}else{if(_G04.ix>=_G04.imageList[_G04.curZoom].length-2){return;}else{_G04.ix+=(_G04.imageList[_G04.curZoom][_G04.ix].cover)?1:2;}}_G04.draw();},backward:function(){if(_G04.ix==0){return;}_G04.ix-=((_G04.mode=="single-page")?1:2);if(_G04.ix<0){_G04.ix=0;}_G04.draw();},draw:function(){_G04.hideCP();_G04.buildFrame();var%20num=(_G04.mode=="single-page")?1:((_G04.imageList[_G04.curZoom][_G04.ix].cover)?1:2);for(var%20pix=0;pix<num;pix++){if(!_G04.imageList[_G04.curZoom][_G04.ix+pix]){break;}var%20xdiff=0;if(_G04.mode=="two-facing-pages"){xdiff=((_G04.direction=="right"&&!pix)||(_G04.direction=="left"&&pix))?_G04.baseWidth*_G04.curZoom:0;if(_G04.imageList[_G04.curZoom][_G04.ix].cover){xdiff=0;}}var%20ctx=document.getElementById("tc").getContext("2d");ctx.clearRect(0,0,document.getElementById("tc").width,document.getElementById("tc").height);switch(_G04.serviceType){case%20"actibook1":if(_G04.ix+i>=_G04.imageList[_G04.curZoom].length){break;}var%20img=new%20Image();img.src=_G04.imageList[_G04.curZoom][_G04.ix+pix].url;img.onload=function(){var%20xdiff=arguments[0];return%20function(){ctx.drawImage(this,xdiff,0);};}(xdiff);break;case%20"actibook2":var%20numParts=64;_G04.part[pix]=new%20Array(numParts);for(var%20i=0;i<_G04.part[pix].length;i++){var%20img=new%20Image();var%20fn="x"+Math.floor(i/Math.sqrt(numParts)+1)+"y"+(i%Math.sqrt(numParts)+1)+".jpg";img.src=_G04.imageList[_G04.curZoom][_G04.ix+pix].url+fn;img.onload=function(){var%20pix=arguments[0];var%20i=arguments[1];return%20function(){_G04.part[pix][i]={img:this,completed:true};};}(pix,i);img.onerror=function(){var%20pix=arguments[0];var%20i=arguments[1];return%20function(){_G04.part[pix][i]={img:undefined,completed:true};};}(pix,i);}if(_G04.drawerTimer[pix]){clearInterval(_G04.drawerTimer[pix]);_G04.drawerTimer[pix]=null;}_G04.drawerTimer[pix]=setInterval(function(pix,xdiff){var%20done=true;for(var%20i=0;i<_G04.part[pix].length;i++){if(!_G04.part[pix][i]){done=false;break;}}if(done){clearInterval(_G04.drawerTimer[pix]);_G04.drawerTimer[pix]=null;var%20dx=0,dy;for(var%20i=0;i<Math.sqrt(numParts);i++){dy=0;for(var%20j=0;j<Math.sqrt(numParts);j++){var%20img=_G04.part[pix][i*Math.sqrt(numParts)+j].img;if(img){ctx.drawImage(img,Math.floor(dx+xdiff),Math.floor(dy));}dy+=_G04.part[pix][j].img?_G04.part[pix][j].img.height:0;}dx+=_G04.part[pix][i*Math.sqrt(numParts)].img?_G04.part[pix][i*Math.sqrt(numParts)].img.width:0;}}},10,pix,xdiff);break;}}window.scroll((_G04.mode=="single-page")?0:((_G04.direction=="right")?_G04.baseWidth*_G04.curZoom:0),0);document.getElementById("indicator").innerHTML=_G04.ix+1+"&nbsp;/&nbsp;"+_G04.imageList[_G04.curZoom].length;document.getElementById((_G04.direction=="right")?"buttonL":"buttonR").style.opacity=0.1;if(_G04.t2){clearTimeout(_G04.t2);}_G04.t2=setTimeout(function(){clearTimeout(_G04.t2);document.getElementById("indicator").innerHTML="";document.getElementById((_G04.direction=="right")?"buttonL":"buttonR").style.opacity=0;},_G04.prefs.indicatorWait);},showCP:function(){var%20o=document.getElementById("page").options;for(var%20i=0;i<o.length;i++){o[i].selected=(o[i].value==_G04.ix);}document.getElementById("cp").style.opacity="0.9";},hideCP:function(){document.getElementById("cp").style.opacity="0.0";},jumpTo:function(){_G04.ix=parseInt(document.getElementById("page").value);_G04.hideCP();_G04.draw();},changeZoom:function(){_G04.curZoom=document.getElementById("zoom").value;_G04.draw();},changeMode:function(){_G04.mode=document.getElementById("mode").value;_G04.draw();}};_G04.init();
ActiBookコンテンツページ(URLが_SWF_Window.html)でブックマークレットを呼び出す事で動作が開始します。

画像の左右端をタップ(PCならクリック)でページ送り/戻しです。コンテンツによって右開きと左開きがあるようなので、画像表示時に進行方向を画像の左端or右端をハイライトさせて表示しています。

画像上端を2本指タップ(PCならマウスオーバー)で、ページ指定・ズーム設定・表示モード選択を行うコントローラが表示されます。



毎度の事ながら無保証・無責任なので、転んでも泣かないかたのみご利用ください。

以下にいくつか、作業中に見付けたActiBookコンテンツサイトを列挙しておきます。ちなみに各サイトとも、ActiBookコンテンツだけでなくActionBrowserその他のコンテンツも混在していますが、URLやページデザインで違いがわかりますんで、何回か見ているうちに「これは見れる、これは見れない」がわかってくるでしょう。また、リンク先にはヲタや腐れの嗜好に耐性を持たない方々にとって不適切なコンテンツが含まれている可能性がありますので御注意くださいw他にもE☆2コミハグの立ち読みコンテンツがActiBook形式になっていますが、この2つについてはコンテンツURLが_SWF_Window.htmlではなくActiBook.swfもしくはview.swfへの直リンクになっています。そのためブックマークレットは、一旦、document.locationを_SWF_Window.htmlに書き換えて飛ばすようにしています。飛んだ後にもう一度ブックマークレットを呼び出せばOKです。iPadでは飛ばす事すら出来ない(「ダウンロードに失敗しました」メッセージが出る)ので、私は別途、ページのリンク自体を書き換えるブックマークレットをiPadに入れています。
javascript:(function(){
var as=document.evaluate("//a[@onclick]|//area[@onclick]",document,null,7,null);
for(var i=0;i<as.snapshotLength;i++){
var t=as.snapshotItem(i).getAttribute("onclick").replace("view.swf","_SWF_Window.html").replace("ActiBook.swf","_SWF_Window.html");
as.snapshotItem(i).setAttribute("onclick",t);
}
})();
それにしてもActiBook開発元のスターティアラボさんは実に良い仕事をしておられます。きちんとデータモデルをアプリケーションから分離しておけばコンテンツの再利用が容易になるという良い見本です。物販リンクに関してもbook.xmlに表示位置を含めた全情報がそろっているのでHTML5化もラクチンということなんですね。今回はまだ対応出来ていませんが、時間を見付けてちゃっちゃと実装したいところです。

おかげさまで楽しませていただいたのですが、ここのところ書籍費がえらいことになっております。欲しいものリストもがんがん増えています。ActiBook系はもちろん、他の立ち読みサイトでも「こんだけ美味しそうなところ見せられたら、もー、辛抱たまらんっす」というわけで、まさに思う壷状態になっております。『つぐもも』なんてもう、速攻で「ポチッとな」ですよ。プラグインフリーという心意気が、これまた素晴らしいじゃありませんか。これこそが「オープン」というものですよ。ウィンドウ最大化処理でバグッてるという点がちょっぴり鬱陶しいけど、そんなの気にしないのが真のギークってもんですw

それにひきかえ、FlashベースのくせにデフォのままだとMacでは見れないうえにコンテンツが暗号化されている某Y社なんかはさっさと悔い改めやがっちゃってくださいませと思うわけです。というわけで竹本先生におかれましては、こんな逸失利益産みまくりな間抜けとは早々に手をお切りになることを、衷心からお願い申し上げる次第であります。

2010年8月15日日曜日

[メモ] 世間に顔向け出来ないとかですかw

[オリ★スタ] 8月16・23日号

表紙も凄いのですが中味がこれまたエラいことになっとります。一体これでどうしろと。ていうか、このレベルで公開する意味ってあんの?

この手のメディアには全然縁のないわたくしでありますが、先日こんなブックマークレットを作ったのをきっかけに、ActiBook系とでも言うべき系統が存在することを知って調べているうちに見つけたのがこのシロモノ。

zoomが3.5倍にまで対応しているので、ガンガンONLINEやweb KADOKAWAといった他のActiBook系サイトでは目にする事の無い1705x2154ピクセルの高品位画像が得られる半面、肝心の内容がこれでは非常にがっかりさんであります。

肖像権とか著作隣接権とかに関しましては良く存じ上げませんが「電子書籍の夜明けは遠い」ということだけはよくわかりました。

(一応、現状のブックマークレットを貼っておきます。ガンガンONLINEとweb KADOKAWAの新しめの立ち読みコンテンツに対応してます。あと、オリ★スタもw)
javascript:var%20_G04={imageList:[],ix:0,serviceType:"",part:[{u:"x1y1.jpg",dx:0,dy:0},{u:"x1y2.jpg",dx:0},{u:"x2y1.jpg",dy:0},{u:"x2y2.jpg"}],init:function(){document.body.bgColor="#eeeeee";document.body.innerHTML="<div%20id='fwd'%20onclick='_G04.forward()'%20ongesturestart='_G04.last()'%20style='position:absolute;left:0px;top:0x;width:100px;z-index:99;'></div><div%20id='bwd'%20onclick='_G04.backward()'%20ongesturestart='_G04.top()'%20style='position:absolute;top:0x;width:100px;z-index:99;'></div><div%20id='picture'%20style='position:absolute;left:0px;top:0px;width:768px;height:1024px;z-index:1;'></div><div%20id='indicator'%20style='position:absolute;-webkit-border-radius:16px;top:16px;width:200px;z-index:99;opacity:0.8;background-color:#aaaaaa;font-family:Copperplate,sans-serif;font-size:48px;font-style:bold;color:white;text-align:center;vertical-align:middle;'></div>";var%20u=document.baseURI;_G04.serviceType=_G04.getServiceType(u);if(_G04.serviceType=="unknown"){return;}var%20x=u.match(/(.*)_SWF_Window\.html.*/)[1]+"books/db/book.xml";var%20r=new%20XMLHttpRequest();r.open("GET",x,false);r.send(null);var%20d=(new%20DOMParser()).parseFromString(r.responseText,"text/xml");var%20z=d.getElementsByTagName("PageSize");var%20zoom=1;if(z.length){for(var%20i=0;i<z.length;i++){var%20v=z[i].getAttribute("zoom");if(v>zoom){zoom=v;}}}else{if(_G04.serviceType=="actibook1"){zoom=2;}else%20if(_G04.serviceType=="actibook2"){zoom=1.45;}}var%20p=d.getElementsByTagName("page");for(var%20i=0;i<p.length;i++){switch(_G04.serviceType){case%20"actibook1":case%20"actibook2":_G04.imageList.push(x.match(/(.*books\/)/)[1]+"images/"+zoom.toString()+"/"+p[i].getElementsByTagName("number")[0].firstChild.nodeValue+"."+p[i].getElementsByTagName("type")[0].firstChild.nodeValue);break;case%20"actibook3":_G04.imageList.push(x.match(/(.*books\/)/)[1]+"images/1/"+p[i].getElementsByTagName("image")[0].firstChild.nodeValue+"/");break;}}var%20h=d.getElementsByTagName("h")[0].firstChild.nodeValue*zoom;var%20w=d.getElementsByTagName("w")[0].firstChild.nodeValue*zoom;document.getElementById("picture").style.height=h+"px";document.getElementById("picture").style.width=w+"px";document.getElementById("fwd").style.height=h+"px";document.getElementById("bwd").style.left=w-100+"px";document.getElementById("bwd").style.height=h+"px";document.getElementById("indicator").style.left=w/2-100+"px";if(_G04.serviceType=="actibook3"){var%20c=document.createElement("canvas");c.width=w;c.height=h;c.id="tc";document.getElementById("picture").appendChild(c);}_G04.draw();},getServiceType:function(url){if(url.match(/_SWF_Window\.html.*$/)){var%20m=url.match(/\/\/(.+?)\/.+\/_SWF_Window\.html(.*)/);if(m[1].match("square-enix")){return%20"actibook1";}else%20if(m[1].match("kadokawa")){if(m[2]){return%20"actibook2";}else{return%20"actibook3";}}else{return%20"actibook1";}}return%20"unknown";},forward:function(){if(_G04.ix<_G04.imageList.length-1){_G04.ix++;_G04.draw();}},backward:function(){if(_G04.ix>0){_G04.ix--;_G04.draw();}},top:function(){_G04.ix=0;_G04.draw();},last:function(){_G04.ix=_G04.imageList.length-1;_G04.draw();},draw:function(){switch(_G04.serviceType){case%20"actibook1":case%20"actibook2":document.getElementById("picture").innerHTML="<img%20src="+_G04.imageList[_G04.ix]+">";break;case%20"actibook3":var%20ctx=document.getElementById("tc").getContext("2d");var%20img=new%20Image();img.src=_G04.imageList[_G04.ix]+_G04.part[0].u;img.onload=function(){ctx.drawImage(img,0,0);var%20dx=img.width;var%20dy=img.height;for(var%20i=1;i<4;i++){_G04.part[i].dx=(_G04.part[i].dx!=undefined)?_G04.part[i].dx:dx;_G04.part[i].dy=(_G04.part[i].dy!=undefined)?_G04.part[i].dy:dy;var%20aimg=new%20Image();aimg.src=_G04.imageList[_G04.ix]+_G04.part[i].u;aimg.onload=function(){var%20ci=arguments[0];return%20function(){ctx.drawImage(this,_G04.part[ci].dx,_G04.part[ci].dy);};}(i);}};break;}window.scroll(0,0);document.getElementById("indicator").innerHTML=_G04.ix+1+"%20/%20"+_G04.imageList.length;setTimeout(function(){document.getElementById("indicator").innerHTML="";},2000);}};_G04.init();

2010年8月8日日曜日

[Programming] Mobile SafariでガンガンONLINEのFlashコンテンツを読むためのブックマークレット

先日、ガンガンONLINEのコンテンツ画像をZIPで保存するFirefox add-onを作ったんですが、画像を見るだけならブックマークレットでも出来そうだというのがわかりましたんで、とりあえず作ってみましたよ。
javascript:var%20_G04={imageList:[],ix:0,serviceType:"",part:[{u:"x1y1.jpg",dx:0,dy:0},{u:"x1y2.jpg",dx:0},{u:"x2y1.jpg",dy:0},{u:"x2y2.jpg"}],init:function(){document.body.bgColor="#eeeeee";document.body.innerHTML="<div%20id='fwd'%20onclick='_G04.forward()'%20ongesturestart='_G04.last()'%20style='position:absolute;left:0px;top:0x;width:100px;z-index:99;'></div><div%20id='bwd'%20onclick='_G04.backward()'%20ongesturestart='_G04.top()'%20style='position:absolute;top:0x;width:100px;z-index:99;'></div><div%20id='picture'%20style='position:absolute;left:0px;top:0px;width:768px;height:1024px;z-index:1;'></div><div%20id='indicator'%20style='position:absolute;-webkit-border-radius:16px;top:16px;width:200px;z-index:99;opacity:0.8;background-color:#aaaaaa;font-family:Copperplate,sans-serif;font-size:48px;font-style:bold;color:white;text-align:center;vertical-align:middle;'></div>";var%20u=document.baseURI;_G04.serviceType=_G04.getServiceType(u);if(_G04.serviceType=="unknown"){return;}var%20x=u.match(/(.*)_SWF_Window\.html.*/)[1]+"books/db/book.xml";var%20r=new%20XMLHttpRequest();r.open("GET",x,false);r.send(null);var%20d=(new%20DOMParser()).parseFromString(r.responseText,"text/xml");var%20z=d.getElementsByTagName("PageSize");var%20zoom=1;if(z.length){for(var%20i=0;i<z.length;i++){var%20v=z[i].getAttribute("zoom");if(v>zoom){zoom=v;}}}else{if(_G04.serviceType=="actibook1"){zoom=2;}else%20if(_G04.serviceType=="actibook2"){zoom=1.45;}}var%20p=d.getElementsByTagName("page");for(var%20i=0;i<p.length;i++){switch(_G04.serviceType){case%20"actibook1":case%20"actibook2":_G04.imageList.push(x.match(/(.*books\/)/)[1]+"images/"+zoom.toString()+"/"+p[i].getElementsByTagName("number")[0].firstChild.nodeValue+"."+p[i].getElementsByTagName("type")[0].firstChild.nodeValue);break;case%20"actibook3":_G04.imageList.push(x.match(/(.*books\/)/)[1]+"images/1/"+p[i].getElementsByTagName("image")[0].firstChild.nodeValue+"/");break;}}var%20h=d.getElementsByTagName("h")[0].firstChild.nodeValue*zoom;var%20w=d.getElementsByTagName("w")[0].firstChild.nodeValue*zoom;document.getElementById("picture").style.height=h+"px";document.getElementById("picture").style.width=w+"px";document.getElementById("fwd").style.height=h+"px";document.getElementById("bwd").style.left=w-100+"px";document.getElementById("bwd").style.height=h+"px";document.getElementById("indicator").style.left=w/2-100+"px";if(_G04.serviceType=="actibook3"){var%20c=document.createElement("canvas");c.width=w;c.height=h;c.id="tc";document.getElementById("picture").appendChild(c);}_G04.draw();},getServiceType:function(url){if(url.match(/_SWF_Window\.html.*$/)){var%20m=url.match(/\/\/(.+?)\/.+\/_SWF_Window\.html(.*)/);if(m[1].match("square-enix")){return%20"actibook1";}else%20if(m[1].match("kadokawa")){if(m[2]){return%20"actibook2";}else{return%20"actibook3";}}else{return%20"actibook1";}}return%20"unknown";},forward:function(){if(_G04.ix<_G04.imageList.length-1){_G04.ix++;_G04.draw();}},backward:function(){if(_G04.ix>0){_G04.ix--;_G04.draw();}},top:function(){_G04.ix=0;_G04.draw();},last:function(){_G04.ix=_G04.imageList.length-1;_G04.draw();},draw:function(){switch(_G04.serviceType){case%20"actibook1":case%20"actibook2":document.getElementById("picture").innerHTML="<img%20src="+_G04.imageList[_G04.ix]+">";break;case%20"actibook3":var%20ctx=document.getElementById("tc").getContext("2d");var%20img=new%20Image();img.src=_G04.imageList[_G04.ix]+_G04.part[0].u;img.onload=function(){ctx.drawImage(img,0,0);var%20dx=img.width;var%20dy=img.height;for(var%20i=1;i<4;i++){_G04.part[i].dx=(_G04.part[i].dx!=undefined)?_G04.part[i].dx:dx;_G04.part[i].dy=(_G04.part[i].dy!=undefined)?_G04.part[i].dy:dy;var%20aimg=new%20Image();aimg.src=_G04.imageList[_G04.ix]+_G04.part[i].u;aimg.onload=function(){var%20ci=arguments[0];return%20function(){ctx.drawImage(this,_G04.part[ci].dx,_G04.part[ci].dy);};}(i);}};break;}window.scroll(0,0);document.getElementById("indicator").innerHTML=_G04.ix+1+"%20/%20"+_G04.imageList.length;setTimeout(function(){document.getElementById("indicator").innerHTML="";},2000);}};_G04.init();

コンテンツビューワが呼び出されるページ(URLが_SWF_Window.htmlで終わる)は、Flashが動かないので当然画面が真っ白なままなのですが、そこでこのブックマークレットを呼び出すとページ情報(book.xml)を取得して各ページの画像を表示出来るようになります。画像の左端をクリックすると次のページが、右端だと前のページが表示されます。スワイプだとイベントハンドラ書くだけでコードが膨れ上がるんで普通にonclickにしましたわw

Mobile Safariへのブックマークレット導入法はググればいくつか出て来ますんでそちらを参照してください。それにしても、もっと簡単に導入できんもんですかね。簡単な導入法がsyncだけってのは、あまりにも御無体ってもんですわ。


2010/08/10 追記:若干修正しました
・画像の左端をタップ→次のページ
・画像の左端を2本指でタップ→最後のページ
・画像の右端をタップ→前のページ
・画像の右端を2本指でタップ→最初のページ

2010年8月5日木曜日

[Programming] ガンガンONLINE用の画像zipperを作ったんだけど...

先日、Firefox add-onでGoogle Books用の画像zipperを作ったわけですが、同様にiPadでは見れないからってことでガンガンONLINE用の画像zipperを作ったんですよ。ビューワがFlashなだけで、画像は別途jpgで取得出来ますんでね。やっぱり、PCの前で座って読むよりiPadに入れて寝転がって読むほうが、UX的に見て優れていると思いますわ。

ということなんですが、このadd-onは流石に公開出来ませんな。あからさまに「複製は法律により禁じられています」と来られちゃね。複製が駄目ということならば「ブックマークレットでdocumentをクリアして画像だけを表示する」という手もありなんでしょうが、流石に処理内容的にボリュームが大きいので手を出しづらいところです。mobile Safariにもユーザスクリプティング環境があればなぁと。

ということで本件に関しましては、個人でこっそりと楽しませていただく事にいたします。

2010年7月22日木曜日

[Programming] Google Books の画像を ZIP でまとめる Firefox アドオン

寝転がって iPad で本や楽譜を読む日々なのであります。そんな中、Google Books で公開されている LIFE や Popular Science 等のアーカイブはまさに宝の山なのですが、Mobile Safari ではスクロールバーが表示されないので読めないという状態になっています(正確に言えば←→ボタンがあるので、これで読み進めることは可能なんですけど、これがまたエラく小さいんで押しづらいんですわ)

なんらかの手段によりダウンロードして読むしか無いというわけですが、Google Book Downloader はWindows 専用ですし、グリモンの Google Book Downloader スクリプト+ FlashGot もダウンロードの自動化は可能なものの、ZIPにまとめる作業が要ります。

幸いなことに Firefox アドオンでは nsIZipWriter が使えますので、ここはひとつ作ったれということで作ってみました。グーグル先生に怒られそうな機能ですし、Mozillaのアドオンギャラリーに登録するのは結構ダルいので、野良 XPI として Dropbox の公開フォルダに入れておきます → googleBooksZipper.xpi

なお、手許に Windows 環境が無いので動作検証はしていないのですが、OS の違いを吸収する処理(パスデリミタの切替くらいしか無いんですけどね)は行っているので、多分、Windowsでも動作するでしょう。

単機能なアドオンなので説明は不要でしょうが、一応、取説的なものを以下に書いておきます。

googleBooksZipper.xpiをインストールすると、コンテキストメニューに


と、現在開いている本を ZIP で保存するという項目が追加されます。この項目を選ぶと
と、ZIPファイルの保存先を聞いて来ますので、お好みの場所を選んで「保存」ボタンを押すと、

と、小さなウィンドウが開きます。このウィンドウでは出力する画像の横幅(ピクセル数)が設定出来ます。デフォルトとして1024が設定されていますので、お好みで変えてください。"close this dialog when completed" というチェックボックスがありますが、これにチェックを入れておくと、処理終了後にこのウィンドウを自動的に閉じるようになります。

設定後、ZIP ボタンを押すと処理が開始され、進捗が表示されます。処理の手順としては、まず各ページの画像URLをGoogleに問い合わせます。

続いて、各画像をダウンロードしテンポラリファイルに保存します。

各画像のダウンロードが終わると ZIP 処理が行われ、完了すると

と、その旨が表示されます。これで ZIP ファイルが所定の場所に出来ているはずなので、あとは CloudReaders など、ZIPファイルに対応したリーダーに放り込んで読みましょう。

なお、私は books.google.com を利用しているのですが、books.google.co.jp だと画像のダウンロードが中断してしまうことが多々あるようです。原因は不明なのですが、中断した場合はいったん close して最初からやり直すしか今のところ手がありません。一見したところアクセス制限してるぽいので、ウェイトを入れる必要があるのかもしれませんね。

2010年6月22日火曜日

[メモ] ビットは撒き餌

早速買ったわけですよ『リューシカ・リューシカ(1)』と『男子高校生の日常(2)』

両者ともに素晴らしいという点につきましては、わたくしごときが申し上げるまでもないのでありますが、特にリューシカについては、これはもう万人が読むべき珠玉の一冊だと申し上げてよろしいかと存じます。読む人が何を意識しているかに応じて、ふさわしいシニフィエがページから立ち上がってくるのです。「わからない時はとにかくしゃべれ」という一節から、プログラマーならばコードレビュー、UIデザイナーならばスケッチやモックといった「アウトプット」を通じて新たなインプットを得るというフィードバック的・円環的開発姿勢に思い至ることでしょう。

で、内容についてもさることながら、IT托鉢たるわたくしといたしましては、電子書籍と従来型書籍の幸福な結婚により産まれたこの素晴らしいUXを褒め讃えずにはいられないのであります。ビットメディアで購入モチベーションを高め、紙メディアで通して読んで自らの血肉とするという、ある意味では昔から綿々と続いている黄金のパターンをガンガンONLINEは定着させたんだなという感がわたくしにはございます。ガンガンONLINEに限らず、『千夜千冊』然り『REWORK』然りでありまして、consumerにとってはもちろん、providerにとっても、まさに一粒で二度おいしいウハウハ状態だと申せましょう。

紙メディア全滅とか言ってる間抜けも居るようですが、アーカイビング・推敲・コンテキスト付与・校正といった紙メディアが培って来た編集的土壌は、ビットメディアが持つ低コスト・即時生といった価値とはまた別の価値を持ち、それはビットメディアだけではそう簡単に実現出来ないものであります。よって、紙メディアはビットメディアという良きパートナーを得て飛躍する可能性を掴んだと捉えるのが妥当であります。

逆に、紙メディアのコアコンピタンスである編集的土壌を持たないところはお役御免となるわけで、屍累々阿鼻叫喚はここしばらく続くのでしょう。S学館のアレとか見てるともうね、この内容でどうやって購入モチベーションを高めろと?としか言い様の無い状態ですしね。まぁ、淘汰されるべきはさっさと淘汰されるべしということかと存じます。

2010年5月30日日曜日

[Apple] 譜面台にiPad



ウケ狙いでやってみたのですが、結構使えるんですわコレが。譜面として使うだけでなく、マイナスワンコンテンツなんかもiPadに入れときゃそのまま使えるわけで、機材が非常にすっきりしましたよ。この写真ではパート譜を出しているわけですが、オケ聴くときなんかは、当然、膝の上に置いてスコアを表示するわけです。「うは、これハース版やった。オレ耳悪過ぎw」といった痛し痒しもあって、なかなか楽しめました。

バランスと利便性のことを考えるならば、こりゃもうあれですな、もう1台追加で買うしかないですな。でもって、iPad#1には偶数ページ、#2には奇数ページを表示し、ページ送りイベントは Bluetooth経由でやりとりするということでどうでしょう?。うは、仕様書書きたくなって来た。嘘ですw。見開きタイプのデバイスはずっと前からコンセプトレベルで存在していたわけですから、その登場を待つというのが得策ですね。今やこんなのもあるわけですから、A4・B5といったサイズバリエーションのある汎用譜面というか汎用リーダーが出てくるのもそう遠くないでしょう。あとは書き込みへの対応ですな。紙と鉛筆のユーザビリティに追いつくまで、あと何十年かかりますかね。アルファベット文化圏限定だったら、気合い入れりゃ1年で追いつけそうですけどねw。

「家電のコンピュータ化」「コンピュータの家電化」どっち?というのは前世紀から議論が続いているテーマなわけですが、結局のところこの2つは車の両輪であり、家電(というかコモディティ)がコンピュータ面をするフェーズとコンピュータがコモディティ面をするフェーズがある、というだけのことです。ちなみに今どっちのフェーズなの?という点については単純にコストを見ればわかります。コンピュータががんがん安くなる時期は「コンピュータのコモディティ化」フェーズだってことですね。久夛良木氏は「家電のコンピュータ化」しか考えていなかったのでコケたわけですが、iPodからこのかたコモディティ面をしたコンピュータが大挙して押し寄せて来た時期に、その逆を行ったわけですから、当然っちゃ当然なのであります。コモディティの一典型である「譜面」という顏をしたiPadをいま目の前にして、IT小作をやっていた頃に考えていたそんな諸々の妄想が蘇り、感慨深いものがございます。

以上、電子書籍には活字や漫画だけじゃなくこういったジャンルもあるんすよ、ということで、関連各社の皆様方におかれましては是非一度ご検討いただきたく存じま す。

2010年5月11日火曜日

[メモ] ミソもクソも一緒かよw

フローとしてのメディアは全てビットに移行するが、ストックとしての、アーカイブとしての、そして語り部としてのメディアは絶対に無くならない。部分の総和が必ずしも全体を意味しないのと同様、フローをいくら積み上げてもストックにならないのが現実というものだ。フローをストックにするには、編集が、悪く言えば抽象捨象という改竄が必要である。我々は恣意性という害毒なしには、個人レベルでも社会レベルでも、現実を認識する事は出来ない。神ならぬ、我ら死すべき人の身は、現実を現実のままに認識出来るほど上等な生命体ではないのだから。

これは恐らく、人間におけるDACの精度の問題とかじゃなくて、方法論の問題だ。現状のハード・ソフト構成手法に拘り続ける限り、我々は量子化誤差から逃げられないし、現実の帯域を前に、いつまでたっても折り返しノイズという幽霊に悩まされ続けることになる。

面白いのは、ビットの世界では人が語り部になるという点だ。つまり、情報が主で人が従ということである。これは一種の先祖還りであり、メディアというものが、ぐるっと一周してアルタミラ以前に戻ったのだとも言える。人そのものがメディアになるということであり、プレヒストリーへの回帰なのだ。ヒストリーにおいてはフィクションが、恣意性が作り出したフィクションが社会を繋ぎ止めて来た。それが無くなるという事は、つまり、身も蓋もない社会がまたやってくるということなのだろう。それは楽しみであり、同時に、恐怖である。

関連記事:[メモ] 結局こういう事です

2010年4月5日月曜日

[メモ] 結局こういうことです

ハレの読書は紙の本でします。ケの読書はiPadでします。「瓦」版の延長線上にあるものは全て、文字通り、画面を持った "slate" で読まれるようになるってことです。えぇ、買いましたよ、『ばらかもん』も『男子高校生の日常』も。これぞ『FREE』の思う壺ってヤツですな。『リューシカ・リューシカ』はやく出ないかな。

2010年2月2日火曜日

[Apple] iPad が書籍を越えるのはいつか?

もちろん電子書籍リーダがすぐに代替品として役割を果たしうる分野はある。重たい辞書や山ほどの教科書を置き換えるものとして、というのがそれにあたる。だが、現行の紙媒体にはまだまだアドバンテージが有る。
  • 文庫本なんかは、そのモビリティの高さ・UI 完成度の高さ・解像度の高さ・消費電力の低さ等から言って、ほぼ最強である。少なくとも解像度で言えば、とりあえず一般的なカラー印刷品質であれば 350dpi は必要なわけで、iPad の 132dpi 程度では話にならない。
  • 書き込みが出来ないうちは「自分の本」とは言えない。書き込み(マーキング)とは、コンテンツに対する個々人のコンテキスト付与であり、その名の通り「匂い付け」であり、それが出来ないうちは自分の本と呼ぶに値しない。
前者については機器スペックの向上によりカバー出来る部分が多いが、後者については読書という行為の根本に関わることであり、ビジネスチャンスはここにこそある。書き込みには豊富で多様なメタデータが含まれているからだ。コンテンツビジネスを越えてコンテキストビジネスを産むチャンスなのだ。ディスプレイ(出力デバイス)としての書籍だけでなく、入力デバイス、つまり注釈やツッコミを入れる等のインタラクションをするためのデバイスとしての書籍に思い至らない限り、電子書籍は紙媒体の壁を越えられないのだろう。

ということで今回の iPad に関しては、Audio/Video 視聴におけるテキスト・ビジュアル要素(CDのオペラ対訳なんかにはぴったりだ)に関する UX 改善をメインとして直近のネタを消化しつつ、次世代書籍への踏み台として、本体だけでなくサーバサイドも含めた新たな読書 UX というものを考えていく素材としたい。やっとハイパーテキスト環境の本命が出てきた感じで、オラわくわくしてきたぞw

関連記事: [メモ] 電子書籍リーダーが花盛り

2009年10月27日火曜日

[メモ] 電子書籍リーダーが花盛り

[Technologizer] The E-Reader Explosion: A Cheat Sheet

Daring Fireball 経由で知った記事なのだが、この件については John Gruber が言及している通り、製品カテゴリそのものの寿命について不透明な部分が多い。私もこういった電子書籍リーダーは1980年代の日本におけるワープロ専用機的な位置付けにとどまると考える。つまりは昔ながらの「専用機器 vs. 汎用機器」の図式であり、iPhone や Android といった汎用機器が全て飲み込んでしまうだろうというありがちな予想だ。

ただ、電子書籍リーダーに関してはあちらとこちらの温度差のようなものを確かに感じる。ASCIIコード圏ではもともとタイプライターという清書機器があったので、早々に PC 上のワードプロセッサソフトとへ移行したが、日本ではそういった機器がなかったのでワープロ専用機が長いこと幅を利かせていた。これと似た様な事があちらでは電子書籍リーダーというジャンルで起こっているようで、どうやらあちらでは電子書籍リーダーが、日本におけるワープロ専用機のようにある程度は生き長らえるのではなかろうか。

あちらでは汎用機器の解像度やmobilityが向上するのを待つくらいなら既に実用レベルに達している専用機器を買うという選択肢を採った。日本では、コンテンツの充実度や文字表示に必要な解像度の違いという点で現段階の電子書籍リーダーはあまり魅力的にうつらないだけで、実用レベルになればこのジャンルも熱くなる、というのが一般的見解だろう。

だが私は、そういったスペック上の問題が解決されたとしても、日本においては電子書籍リーダーというジャンルは寒い状況が続くのではないかと考える。この温度差を産む原因として「本を読む」という行為そのものについて東洋と西洋には決定的な違いがあり、その根っこにはおそらく「意味」というものに対する姿勢の違いがあると見ているからだ。

西洋の「意味こそ重要」という一神教的(つまり自然科学的)文化に対し、東洋(特に近世より前の日本)では「意味なんて飾りです、偉い人にはそれがわからんのです」とばかりに、意味からはみ出し滲み出た響や姿や佇まい、そして意味の背後に隠れているものを重んじた。いわゆるセマンティックWEBが、東洋では使い物にならないお粗末なレベルの代物でしかない理由はここにある。多分、チューリングマシンでは駄目なのだろう。抽象化により削ぎ落とされる部分にこそ日本語の旨味があるからだ。

もちろん西洋が一枚岩であるわけなどない。ダンセイニやイェイツあたりを嚆矢と言って良いと思うのだが、カトリック的合理主義以前(というかグレコローマン以前?)の「古い」Celtic な世界が「新しい」科学として取り込まれる動きがある。おそらくこれによりチューリングマシンやノイマンアーキテクチャを越えるコンピュータサイエンスの成果が産まれてくるのだろう。西洋と東洋は、その時点でようやく出会えるのかもしれない。

白洲正子先生が『私の百人一首』新潮選書版あとがきで「言葉には言魂(ことたま)というものがあり、意味だけわかっても、それこそ何の意味も無い」とおっしゃっていたことを思い出す。もしかすると semantics をいったん捨ててかからないことには日本におけるコンピューティングの未来は開けないのではないか。

2009年2月13日金曜日

[BB Gadgets] アメリカの作家協会がテキスト読み上げソフトを違法だと主張

(原文: Author's Guild claims text-to-speech software is illegal)

Kindle 2 の目玉であるテキスト読み上げ機能は、既にデスクトップPCやスティーブン・ホーキング博士が使用している事で知られるボイスボックスに組み込まれているソフトウェアと同じ手法で実現されている。この機能が「動揺」を引き起こしている。作家協会事務長である Paul Aiken は WSJ 紙上で、読者にはテキスト読み上げ機能を利用する権利は無いと述べたのだ。それでは無料のオーディオブックになってしまうじゃないか、というわけだ。
「読者に本を音声で読み上げる権利は無い」と作家協会事務長のPaul Aiken は語った。「それは著作権管理下にある二次著作物であるオーディオの利用権にあたるからだ」
Amazonのスポークスマンは、読み上げ機能はテキストの音声化技術に依存しているので、聞く人がオーディオブックと混同することは無いだろうと述べた。オーディオブック大手である Audible はAmazon の傘下にある。
テキストの音声化は既存作品のコピーには当たらないという点についてはひとまず置いておこう。人工的に音声合成されたテキストの読み上げと生身の人間によるニュアンスや感情の込められた読み上げが同じ物であるという馬鹿げた考え方についてもひとまず置いておこう。問題は作家協会が、声に出して読むという行為すらも違法コピーであり公衆送信権の侵害であると主張しているという点にある。

機械が声を出して本を読むのが二次著作にあたるのだとしたら、人間が声を出して本を読む事はなぜそれに該当しないというのだろう?

考え方というものは自身の意図に基づいて器を満たすべく成長するが、悪しき考え方のもたらす問題は、その器に漏れがあり歪んでいるという点にある。たとえ諸君が広範なる著作権法にゆるぎない信頼を置いているとしても、知財という考え方は、己の哲学を正当化するために法という装置を作り直すという理由から、悪しき考え方なのだ。この、功利主義に始まり不磨の大典へと至る道のりは、途方も無いモンスターを産む。このモンスターは複製行為を管理するのみならず、あらゆる表現や文化の持つ意義を管理するモンスターにならざるを得ないのだ。


訳者コメント:
Daring Fireball でこの件を知ったんだけど、ネタとしか思えん。エイプリルフールにはまだちょっと早いんじゃね?

まぁ「知財」なるものがフィクションでしかないというのはもう誰の目にも明らかなのだから、こういったネタを投下して炎上を早めようと言う意図が作家協会側にはあるのかもしれぬ。

んなわけねーw

2008年11月2日日曜日

[Google] Book Search に関する出版界との和解

[Official Google Blog] New chapter for Google Book Search

・ブックサーチに関して作家/出版社との合意に達した、とのオフィシャルブログでの発表。3つの点が大きいとしている。第1に、読者が著作権コンテンツにデジタルでアクセス出来るようになる事。第2に、これにより作家/出版社に新たな市場を提供出来るようになる事。第3に、これによりパートナーは出版に精を出せるようになる事。

BBC NEWSをはじめ、大半は好意的な反応を示しているが、techdirtでは「原則より目先の利益をとるのか?出版界の屁理屈に屈するのか?法的な議論については全く未解決じゃないか」と否定的な反応だ。

・それにしてもこの件に限らず、出版側のクリコモへの流れが見出せないのは私の寡聞によるものであろうか。