<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" gd:etag="W/&quot;A0IAQHk_fCp7ImA9WhRUGEk.&quot;"><id>tag:blogger.com,1999:blog-4629086917523851821</id><updated>2012-01-30T00:05:41.744+09:00</updated><category term="SPARQL" /><category term="OpenGL Shader Builder" /><category term="GWT" /><category term="SproutCore" /><category term="Xcode" /><category term="swing" /><category term="4store" /><category term="OpenCV" /><category term="WiiRemoteJ" /><category term="Quartz Composer" /><category term="technique" /><category term="MMD" /><category term="NXT2.0" /><category term="WebKit" /><category term="twitter+fusen" /><category term="ARTK_MMD" /><category term="grwolstyle" /><category term="scratch" /><category term="GWT-Ext" /><category term="bluecove" /><category term="BazAR" /><category term="english homework" /><category term="apache felix" /><category term="hadoop" /><category term="Bullet" /><category term="applescript" /><category term="grails" /><category term="Dashcode" /><category term="WiiRemoteFramework" /><category term="Arduino" /><category term="OAuthConsumer.framework" /><category term="ARQ" /><category term="CoGe" /><category term="apache tomcat" /><category term="GWT on Rails" /><category term="CoreImage" /><category term="ust" /><category term="jogl" /><category term="CoreLocation" /><category term="LegNXTframework" /><category term="eclipse" /><category term="Ruby on Rails" /><category term="GSL" /><category term="NyARToolkit" /><category term="fastcgi" /><category term="Project Management" /><category term="OSGi" /><category term="RDF" /><category term="small talk" /><category term="java" /><category term="AIR" /><category term="apache axis" /><category term="NSArrayController" /><category term="libdecodeqr" /><category term="XML" /><category term="Cocoa-Ruby" /><category term="NSBezierPath" /><category term="Automator" /><category term="MMD_DM" /><category term="MeCab" /><category term="ARToolkit" /><category term="iPhone" /><category term="NyMmd" /><category term="WebGL" /><category term="XBee" /><category term="Cocoa" /><category term="GLSL" /><category term="MobileSafari" /><category term="Soundflower" /><category term="COLLADA" /><category term="Ustream Producer" /><category term="Core Image Fun House" /><title>いー ドット ぷりんとすたっくとれーす</title><subtitle type="html">高確率で思い込みによる説明．間違っていることが多い．/「無知だったり、勘違いしていたり、底意を押しつけたり、いいかげんだったり、噂や疑惑を信じていたりして、狂気じみてさえいるかもしれません」( http://bit.ly/gs23zg )</subtitle><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://edotprintstacktrace.blogspot.com/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://edotprintstacktrace.blogspot.com/" /><link rel="next" type="application/atom+xml" href="http://www.blogger.com/feeds/4629086917523851821/posts/default?start-index=26&amp;max-results=25&amp;redirect=false&amp;v=2" /><author><name>p_g_</name><uri>http://www.blogger.com/profile/15389208108068935129</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://4.bp.blogspot.com/_BA-iUzxIQks/SfAmPKs5kxI/AAAAAAAAAEw/ie6H2TZGF-M/S220/_____1.png" /></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>438</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/blogspot/KsjdY" /><feedburner:info uri="blogspot/ksjdy" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><entry gd:etag="W/&quot;A0IAQHk9eSp7ImA9WhRUGEk.&quot;"><id>tag:blogger.com,1999:blog-4629086917523851821.post-9048139743412967816</id><published>2012-01-28T23:09:00.007+09:00</published><updated>2012-01-30T00:05:41.761+09:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-01-30T00:05:41.761+09:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="WebGL" /><title>HTML5 Canvas 2D Context で描いた内容を WebGL の テクスチャにする</title><content type="html">一応まとめておく．&lt;br /&gt;&lt;blockquote class=myInsert&gt;&lt;span style="font-weight:bold;"&gt;やってみた&lt;/span&gt;．&lt;br /&gt;&lt;a href="http://www.khronos.org/webgl/wiki/Tutorial"&gt;ここ&lt;/a&gt;の&lt;a href="https://cvs.khronos.org/svn/repos/registry/trunk/public/webgl/sdk/demos/webkit/SpiritBox.html"&gt;こちら&lt;/a&gt;をベースにする．&lt;br /&gt;&lt;blockquote class=myInsert1&gt;&lt;span style="font-weight:bold;"&gt;０．他のjsファイルの呼び出しをどうにかしておく&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;downloadして配置した場合はパスを変えておく．以下の3種が必要となる．&lt;br /&gt;&lt;blockquote class=myInsert2&gt;&lt;pre&gt;&lt;dt&gt;&lt;br /&gt;&amp;lt;script type="text/javascript" src="./webgl-utils.js"&gt;&amp;lt;/script&gt;&lt;br /&gt;&amp;lt;script type="text/javascript" src="./J3DI.js"&gt; &amp;lt;/script&gt;&lt;br /&gt;&amp;lt;script type="text/javascript" src="./J3DIMath.js"&gt; &amp;lt;/script&gt;&lt;br /&gt;&lt;/dt&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;li&gt;webgl-utils.js &lt;a href="https://cvs.khronos.org/svn/repos/registry/trunk/public/webgl/sdk/demos/common/webgl-utils.js"&gt;link&lt;/a&gt;&lt;br /&gt;&lt;li&gt;J3DI.js &lt;a href="https://cvs.khronos.org/svn/repos/registry/trunk/public/webgl/sdk/demos/webkit/resources/J3DI.js"&gt;link&lt;/a&gt;&lt;br /&gt;&lt;li&gt;J3DIMath.js &lt;a href="https://cvs.khronos.org/svn/repos/registry/trunk/public/webgl/sdk/demos/webkit/resources/J3DIMath.js"&gt;link&lt;/a&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote class=myInsert1&gt;&lt;span style="font-weight:bold;"&gt;１．追加Javascriptコード&lt;/span&gt;&lt;br /&gt;&lt;blockquote class=myInsert2&gt;&lt;pre&gt;&lt;dt&gt;&lt;br /&gt;&amp;lt;script type="text/javascript"&gt;&lt;br /&gt;    var imageData;&lt;br /&gt;    var spiritTexture;&lt;br /&gt;&lt;br /&gt;    function updateCanvas() {&lt;br /&gt;        if (!spiritTexture) {&lt;br /&gt;            spiritTexture= gl.createTexture(512, 512);&lt;br /&gt;        }&lt;br /&gt;        var canvas = document.getElementById('canvas');&lt;br /&gt;        if ( ! canvas || ! canvas.getContext ) { return false; }&lt;br /&gt;        var ctx = canvas.getContext('2d');&lt;br /&gt;        ctx.fillStyle = "rgba(255, 255, 255, 255)";&lt;br /&gt;        ctx.fillRect(0, 0, canvas.width, canvas.height);&lt;br /&gt;&lt;br /&gt;        ctx.fillStyle= "rgba(0,0,0,255)";&lt;br /&gt;        ctx.font = "italic bold 52px 'HiraMinProN-W3'";&lt;br /&gt;        ctx.fillText("itailc bold 52px", 10, 64);&lt;br /&gt;        ctx.fillText("ヒラギノ明朝ProN", 10, 128);&lt;br /&gt;        ctx.fillText("(canvas 512x512)", 10, 192);&lt;br /&gt;        &lt;br /&gt;        ctx.save();&lt;br /&gt;        var gradient = ctx.createLinearGradient(0, 0, 150, 100);&lt;br /&gt;        gradient.addColorStop(0, "rgb(255, 255, 0)");&lt;br /&gt;        gradient.addColorStop(1, "rgb(255, 0, 0)");&lt;br /&gt;        ctx.fillStyle = gradient;&lt;br /&gt;        ctx.translate(0, 0);&lt;br /&gt;        ctx.rotate(Math.PI/4.0);&lt;br /&gt;        ctx.fillText((new Date()).toLocaleString(), 0, 0);&lt;br /&gt;        ctx.restore();&lt;br /&gt;        &lt;br /&gt;        imageData= ctx.getImageData(0, 0, 512, 512);&lt;br /&gt;    };&lt;br /&gt;&lt;br /&gt;    function updateTexture() {&lt;br /&gt;        gl.bindTexture(gl.TEXTURE_2D, spiritTexture);&lt;br /&gt;&lt;br /&gt;        gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, imageData);&lt;br /&gt;&lt;br /&gt;        gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);&lt;br /&gt;        gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR_MIPMAP_NEAREST);&lt;br /&gt;        gl.generateMipmap(gl.TEXTURE_2D);&lt;br /&gt;        gl.bindTexture(gl.TEXTURE_2D, null);&lt;br /&gt;    }&lt;br /&gt;&amp;lt;/script&gt;&lt;br /&gt;&lt;/dt&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote class=myInsert1&gt;&lt;span style="font-weight:bold;"&gt;２．追加HTMLコード(Javascriptで動的でもできるかも)&lt;/span&gt;&lt;br /&gt;'body'タグの閉じる前に追加．&lt;br /&gt;&lt;blockquote class=myInsert2&gt;&lt;pre&gt;&lt;dt&gt;&lt;br /&gt;&amp;lt;canvas style='visibility:hidden;' id='canvas' width='512' height='512'&gt;&amp;lt;/canvas&gt;&lt;br /&gt;&lt;/dt&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote class=myInsert1&gt;&lt;span style="font-weight:bold;"&gt;３．追加したJavascriptの関数を呼び出させる&lt;/span&gt;&lt;br /&gt;繰り返し呼ばれるdrawPicture関数の先頭に追加コードのCanvasの更新, Textureの更新の関数を呼びださせる．&lt;br /&gt;&lt;blockquote class=myInsert2&gt;&lt;pre&gt;&lt;dt&gt;&lt;br /&gt;    function drawPicture(gl)&lt;br /&gt;    {&lt;br /&gt;        updateCanvas();&lt;br /&gt;        updateTexture();&lt;br /&gt;        &lt;br /&gt;        …&lt;br /&gt;        &lt;br /&gt;    }&lt;br /&gt;&lt;/dt&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote class=myInsert&gt;&lt;span style="font-weight:bold;"&gt;結果&lt;/span&gt;&lt;br /&gt;&lt;blockquote class=myInsert1&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/-3OiXDpDDuP4/TyQF-Ye2cWI/AAAAAAAAAsY/19yK2yvNBU0/s1600/%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25B3%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%2583%25E3%2583%2588%2B2012-01-28%2B23.27.40.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 306px; height: 320px;" src="http://2.bp.blogspot.com/-3OiXDpDDuP4/TyQF-Ye2cWI/AAAAAAAAAsY/19yK2yvNBU0/s320/%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25B3%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%2583%25E3%2583%2588%2B2012-01-28%2B23.27.40.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5702689597439766882" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote class=myInsert1&gt;toDataURLを利用した際のだが，動画．(上記のやってみたはgetImageDataでImageDataを利用している)&lt;br /&gt;&lt;iframe src="http://www.ustream.tv/embed/recorded/20057626" width="608" height="368" scrolling="no" frameborder="0" style="border: 0px none transparent;"&gt;&lt;/iframe&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;これはgetImageDataを利用した場合&lt;iframe src="http://www.ustream.tv/embed/recorded/20090028" width="608" height="368" scrolling="no" frameborder="0" style="border: 0px none transparent;"&gt;&lt;/iframe&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4629086917523851821-9048139743412967816?l=edotprintstacktrace.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/4LZlJAY2rtJFnuHVGT9utch1Qvs/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/4LZlJAY2rtJFnuHVGT9utch1Qvs/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/4LZlJAY2rtJFnuHVGT9utch1Qvs/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/4LZlJAY2rtJFnuHVGT9utch1Qvs/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/KsjdY/~4/dmYRpBguOPk" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://edotprintstacktrace.blogspot.com/feeds/9048139743412967816/comments/default" title="コメントの投稿" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=4629086917523851821&amp;postID=9048139743412967816" title="0 件のコメント" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4629086917523851821/posts/default/9048139743412967816?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4629086917523851821/posts/default/9048139743412967816?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/KsjdY/~3/dmYRpBguOPk/html5-canvas-2d-context-webgl.html" title="HTML5 Canvas 2D Context で描いた内容を WebGL の テクスチャにする" /><author><name>p_g_</name><uri>http://www.blogger.com/profile/15389208108068935129</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://4.bp.blogspot.com/_BA-iUzxIQks/SfAmPKs5kxI/AAAAAAAAAEw/ie6H2TZGF-M/S220/_____1.png" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/-3OiXDpDDuP4/TyQF-Ye2cWI/AAAAAAAAAsY/19yK2yvNBU0/s72-c/%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25B3%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%2583%25E3%2583%2588%2B2012-01-28%2B23.27.40.png" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://edotprintstacktrace.blogspot.com/2012/01/html5-canvas-2d-context-webgl.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Ck8ASH49eip7ImA9WhRSEkQ.&quot;"><id>tag:blogger.com,1999:blog-4629086917523851821.post-4931182679897783977</id><published>2011-11-15T00:01:00.010+09:00</published><updated>2011-11-15T02:14:09.062+09:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-11-15T02:14:09.062+09:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="MMD_DM" /><category scheme="http://www.blogger.com/atom/ns#" term="MMD" /><category scheme="http://www.blogger.com/atom/ns#" term="Quartz Composer" /><category scheme="http://www.blogger.com/atom/ns#" term="GLSL" /><title>Quartz Composer / Crosshatch shader をやってみた (あとiPod CMを思い出して)</title><content type="html">&lt;blockquote class=myInsert&gt;&lt;span style="font-weight:bold;"&gt;動機&lt;/span&gt;&lt;br /&gt;&lt;a href="http://twitter.com/#!/yone80"&gt;@yone80&lt;/a&gt;さんが&lt;a href="http://twitter.com/#!/yone80/status/135728475582644225"&gt;POSTした&lt;/a&gt; &lt;a href="http://learningwebgl.com/blog/?p=2858"&gt;こちらの記事&lt;/a&gt;を参考にGLSL Shader パッチでやってみた．&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote class=myInsert&gt;&lt;span style="font-weight:bold;"&gt;結果&lt;/span&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/-k17pULYp8s0/TsEt8ALpspI/AAAAAAAAArc/Bm-55q8O0NI/s1600/%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25B3%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%2583%25E3%2583%2588%2B2011-11-14%2B22.12.27.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 294px;" src="http://1.bp.blogspot.com/-k17pULYp8s0/TsEt8ALpspI/AAAAAAAAArc/Bm-55q8O0NI/s320/%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25B3%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%2583%25E3%2583%2588%2B2011-11-14%2B22.12.27.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5674867514327806610" /&gt;&lt;/a&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote class=myInsert&gt;&lt;span style="font-weight:bold;"&gt;iPod CM&lt;/span&gt;&lt;br /&gt;で，ふと古いiPod CMを思い出してMMD_DM_Renderパッチに白黒反転したこのGLSL Shaderパッチをかぶせてみた．&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/-tmy1EggLq0g/TsEug0hCk0I/AAAAAAAAAsE/ugWfJ2gdHUg/s1600/%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25B3%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%2583%25E3%2583%2588%2B2011-11-14%2B23.51.57.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 200px;" src="http://1.bp.blogspot.com/-tmy1EggLq0g/TsEug0hCk0I/AAAAAAAAAsE/ugWfJ2gdHUg/s320/%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25B3%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%2583%25E3%2583%2588%2B2011-11-14%2B23.51.57.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5674868146851451714" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/-rN-QCkks0CI/TsEugmcQW6I/AAAAAAAAAr0/G6udyOX7Ac4/s1600/%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25B3%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%2583%25E3%2583%2588%2B2011-11-14%2B23.52.05.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 200px;" src="http://2.bp.blogspot.com/-rN-QCkks0CI/TsEugmcQW6I/AAAAAAAAAr0/G6udyOX7Ac4/s320/%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25B3%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%2583%25E3%2583%2588%2B2011-11-14%2B23.52.05.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5674868143073287074" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/-AwiUxvt-IRY/TsEugQbfwoI/AAAAAAAAAro/JkVwJlK7Fis/s1600/%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25B3%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%2583%25E3%2583%2588%2B2011-11-14%2B23.52.13.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 200px;" src="http://4.bp.blogspot.com/-AwiUxvt-IRY/TsEugQbfwoI/AAAAAAAAAro/JkVwJlK7Fis/s320/%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25B3%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%2583%25E3%2583%2588%2B2011-11-14%2B23.52.13.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5674868137164522114" /&gt;&lt;/a&gt;&lt;br /&gt;（&lt;br /&gt;pmd: 'Lat式ミクVer2.3_Normal.pmd'(Lat様)('VPVP wiki - モデルデータ/VOCALOID関連'より)，&lt;br /&gt;vmd: '恋愛サーキュレーション-ミク.vmd'(せっけんP様)('VPVP wiki - モーションデータ/ダンス'より) &lt;br /&gt;感謝 ）&lt;br /&gt;※Clickすると拡大します．&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;っぽい？&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4629086917523851821-4931182679897783977?l=edotprintstacktrace.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/_IsFDLZkuFJsNFXozTob0rzNIoE/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/_IsFDLZkuFJsNFXozTob0rzNIoE/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/_IsFDLZkuFJsNFXozTob0rzNIoE/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/_IsFDLZkuFJsNFXozTob0rzNIoE/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/KsjdY/~4/V-YPmS55PE0" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://edotprintstacktrace.blogspot.com/feeds/4931182679897783977/comments/default" title="コメントの投稿" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=4629086917523851821&amp;postID=4931182679897783977" title="0 件のコメント" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4629086917523851821/posts/default/4931182679897783977?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4629086917523851821/posts/default/4931182679897783977?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/KsjdY/~3/V-YPmS55PE0/quartz-composer-crosshatch-shader-ipod.html" title="Quartz Composer / Crosshatch shader をやってみた (あとiPod CMを思い出して)" /><author><name>p_g_</name><uri>http://www.blogger.com/profile/15389208108068935129</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://4.bp.blogspot.com/_BA-iUzxIQks/SfAmPKs5kxI/AAAAAAAAAEw/ie6H2TZGF-M/S220/_____1.png" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/-k17pULYp8s0/TsEt8ALpspI/AAAAAAAAArc/Bm-55q8O0NI/s72-c/%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25B3%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%2583%25E3%2583%2588%2B2011-11-14%2B22.12.27.png" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://edotprintstacktrace.blogspot.com/2011/11/quartz-composer-crosshatch-shader-ipod.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUANSHw8cSp7ImA9WhRTE08.&quot;"><id>tag:blogger.com,1999:blog-4629086917523851821.post-5567991910074410087</id><published>2011-11-03T16:37:00.012+09:00</published><updated>2011-11-03T21:36:39.279+09:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-11-03T21:36:39.279+09:00</app:edited><title>メモ: iPhone(iOS5)のカレンダー(iCal)にGoogle Calendarのサブカレンダーを設定する方法 (CalDav)</title><content type="html">色々な所で記事が書かれていますが一応作業記録としてメモっておきます．&lt;br /&gt;サブカレンダーと言ってみたのはGoogle Calendearで追加によって作られる２つ目以降のカレンダー(別の色)のコトです．&lt;br /&gt;&lt;br /&gt;&lt;blockquote class=myInsert&gt;カレンダーIDの取得方法&lt;br /&gt;&lt;blockquote class=myInsert2&gt;&lt;ol&gt;&lt;br /&gt;&lt;li&gt;Googleカレンダーの画面を出します．&lt;br /&gt;&lt;li&gt;モバイル用の表示の場合，フッター部にある表示選択でデスクトップを選びます．&lt;br /&gt;&lt;li&gt;左ペイン中のマイカレンダー表示横にあるボタンでリストアイテムを表示させ，設定を選びます．&lt;br /&gt;&lt;li&gt;「表示，変更できるカレンダー」の「カレンダー」リストから対象とするサブカレンダーを選びます．&lt;br /&gt;&lt;li&gt;「＜対象としたサブカレンダー＞の詳細」画面が表示されます．この画面の下側に「カレンダーのアドレス」という項目があります．&lt;br /&gt;ここに「(カレンダーID: &lt;span style="font-weight:bold;"&gt;zzzz@group.calendar.google.com&lt;/span&gt; )」と書いてあるのでこれを利用します(以下で使うのでコピーしておくと便利)．&lt;/ol&gt;&lt;/blockquote&gt;&lt;br /&gt;ここまでをPC上で実行してカレンダーIDの文字列をなんらかで送っておいてもよいかもしれない．&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote class=myInsert&gt;設定&lt;br /&gt;&lt;blockquote class=myInsert2&gt;&lt;ol&gt;&lt;br /&gt;&lt;li&gt;「設定」&lt;br /&gt;&lt;li&gt;「メール/連絡先/カレンダー」&lt;br /&gt;&lt;li&gt;「アカウント/アカウントを追加」&lt;br /&gt;&lt;li&gt;「その他」&lt;br /&gt;&lt;li&gt;「CalDavアカウントを追加」&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;&lt;span style="font-weight:bold;"&gt;サーバー名&lt;/span&gt; www.google.com&lt;br /&gt;&lt;li&gt;&lt;span style="font-weight:bold;"&gt;ユーザー名&lt;/span&gt; xxxxxx@xxxxx.xxx(@以降も)&lt;br /&gt;&lt;li&gt;&lt;span style="font-weight:bold;"&gt;パスワード&lt;/span&gt; xxxxxxxxxx&lt;br /&gt;&lt;li&gt;&lt;span style="font-weight:bold;"&gt;説明&lt;/span&gt; 任意文字列(サーバー名が入っているので好きに変更．これでアカウントのリストに表示される．また，ログインできなかった時のダイアログにはこの文字列がでる)&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;li&gt;「次へ」　（確認が入る → 成功すると「メール/連絡先/カレンダー」の画面に戻る)&lt;br /&gt;&lt;/ol&gt;&lt;br /&gt;&lt;ol&gt;&lt;br /&gt;&lt;li&gt;「アカウント/任意文字列(上で説明に入れた文字列)」&lt;br /&gt;&lt;li&gt;「詳細設定」&lt;br /&gt;&lt;li&gt;「アカウントURL」&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;&lt;span style="font-weight:bold;"&gt;デフォルトカレンダー用の設定になっている&lt;/span&gt;．'https://ユーザー名@www.google.com:443/calendar/dav/ユーザ名/user' (SSLを使用している場合)&lt;br /&gt;&lt;li&gt;&lt;span style="font-weight:bold;"&gt;サブカレンダー用に設定する(ここでカレンダーIDを利用する)&lt;/span&gt;．'https://ユーザー名@www.google.com:443/calendar/dav/&lt;span style="font-weight:bold;"&gt;zzzz@group.calendar.google.com&lt;/span&gt;&lt;span style="font-weight:bold;color:red;"&gt;/user&lt;/span&gt;' (SSLを使用している場合)最後の'/user'を忘れると認証で引っかかる&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;li&gt;左上のナビゲーションボタン(任意文字列のボタン)でアカウント設定にもどります．&lt;br /&gt;&lt;li&gt;右上の終了ボタンで終了します．この時，認証処理がされ成功すれば完了です．&lt;br /&gt;&lt;/ol&gt;&lt;/blockquote&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;カレンダー(iCal)でイベントの追加などを行い動作を確認してください．&lt;br /&gt;（メインカレンダーだけならGMailの設定の中にあるカレンダーのチエックを入れるだけですみます．）&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4629086917523851821-5567991910074410087?l=edotprintstacktrace.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/uMAm00vsPG8fOAfHY3d5rebacSo/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/uMAm00vsPG8fOAfHY3d5rebacSo/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/uMAm00vsPG8fOAfHY3d5rebacSo/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/uMAm00vsPG8fOAfHY3d5rebacSo/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/KsjdY/~4/NJ8TOCZeVzk" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://edotprintstacktrace.blogspot.com/feeds/5567991910074410087/comments/default" title="コメントの投稿" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=4629086917523851821&amp;postID=5567991910074410087" title="0 件のコメント" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4629086917523851821/posts/default/5567991910074410087?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4629086917523851821/posts/default/5567991910074410087?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/KsjdY/~3/NJ8TOCZeVzk/iphoneios5icalgoogle-calendar-caldav.html" title="メモ: iPhone(iOS5)のカレンダー(iCal)にGoogle Calendarのサブカレンダーを設定する方法 (CalDav)" /><author><name>p_g_</name><uri>http://www.blogger.com/profile/15389208108068935129</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://4.bp.blogspot.com/_BA-iUzxIQks/SfAmPKs5kxI/AAAAAAAAAEw/ie6H2TZGF-M/S220/_____1.png" /></author><thr:total>0</thr:total><feedburner:origLink>http://edotprintstacktrace.blogspot.com/2011/11/iphoneios5icalgoogle-calendar-caldav.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEQMSXo6eSp7ImA9WhRTE00.&quot;"><id>tag:blogger.com,1999:blog-4629086917523851821.post-8607021978219347962</id><published>2011-10-29T22:50:00.005+09:00</published><updated>2011-11-03T15:39:48.411+09:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-11-03T15:39:48.411+09:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="WebKit" /><category scheme="http://www.blogger.com/atom/ns#" term="Cocoa" /><title>Sample: Nest of 'WebScriptObject ( Javascript associative array ) to NSDictionary'  or 'WebScriptObject ( Javascript array ) to NSArray ) '</title><content type="html">&lt;blockquote class=myInsert&gt;&lt;span style="font-weight:bold;"&gt;SampleAppDelegate.h&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;#import &amp;lt;Cocoa/Cocoa.h&gt;&lt;br /&gt;#import &amp;lt;WebKit/WebKit.h&gt;&lt;br /&gt;@interface SampleAppDelegate : NSObject &amp;lt;NSApplicationDelegate&gt; {&lt;br /&gt;    NSWindow *window;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;@property (assign) IBOutlet NSWindow *window;&lt;br /&gt;&lt;br /&gt;+ (id)structueWithWebScriptObject:(WebScriptObject *)obj&lt;br /&gt;                  webScriptObject:(WebScriptObject *)scriptObj;&lt;br /&gt;&lt;br /&gt;@end&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;blockquote class=myInsert&gt;&lt;span style="font-weight:bold;"&gt;SampleAppDelegate.m&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;#import "SampleAppDelegate.h"&lt;br /&gt;@implementation SampleAppDelegate&lt;br /&gt;@synthesize window;&lt;br /&gt;+ (NSDictionary *)dictionaryWithWebScriptObject:(WebScriptObject *)obj&lt;br /&gt;                                webScriptObject:(WebScriptObject *)scriptObj&lt;br /&gt;{&lt;br /&gt;    NSMutableDictionary *ret= [NSMutableDictionary dictionary];&lt;br /&gt;    id keys= [scriptObj callWebScriptMethod:@"_f0_"&lt;br /&gt;                              withArguments:[NSArray arrayWithObjects:obj, nil]];&lt;br /&gt;    NSArray *keyAry= [SampleAppDelegate structueWithWebScriptObject:keys&lt;br /&gt;                                                    webScriptObject:scriptObj];&lt;br /&gt;    unsigned i;&lt;br /&gt;    for(i= 0; i&amp;lt;[keyAry count]; i++) {&lt;br /&gt;        NSString *key= [keyAry objectAtIndex:i]; &lt;br /&gt;        id val= [obj valueForKey:key];&lt;br /&gt;        if ([val isMemberOfClass:[WebScriptObject class]]) {&lt;br /&gt;            val= [SampleAppDelegate structueWithWebScriptObject:val&lt;br /&gt;                                                webScriptObject:scriptObj];&lt;br /&gt;        }&lt;br /&gt;        [ret setObject:val forKey:key];&lt;br /&gt;    }&lt;br /&gt;    return [[ret retain] autorelease];&lt;br /&gt;}&lt;br /&gt;+ (id)structueWithWebScriptObject:(WebScriptObject *)obj&lt;br /&gt;                  webScriptObject:(WebScriptObject *)scriptObj&lt;br /&gt;{    &lt;br /&gt;    @try{&lt;br /&gt;        NSMutableArray *ret = [NSMutableArray array];&lt;br /&gt;        NSUInteger count = [[obj valueForKey:@"length"] integerValue]; //exception occure if associative array&lt;br /&gt;        unsigned i;&lt;br /&gt;        for (i = 0; i &amp;lt; count; i++) {&lt;br /&gt;            id val= [obj webScriptValueAtIndex:i];&lt;br /&gt;            if ([val isMemberOfClass:[WebScriptObject class]]) {&lt;br /&gt;                val= [SampleAppDelegate structueWithWebScriptObject:val&lt;br /&gt;                                                    webScriptObject:scriptObj];&lt;br /&gt;            }&lt;br /&gt;            [ret addObject:val];&lt;br /&gt;        }&lt;br /&gt;        return [[ret retain] autorelease];        &lt;br /&gt;    }&lt;br /&gt;    @catch (NSException *e) {&lt;br /&gt;        return [SampleAppDelegate dictionaryWithWebScriptObject:obj&lt;br /&gt;                                                webScriptObject:scriptObj];&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;- (void)applicationDidFinishLaunching:(NSNotification *)aNotification&lt;br /&gt;{&lt;br /&gt;    WebView *webView = [[WebView alloc] init];&lt;br /&gt;    [[webView mainFrame] loadHTMLString:@"" baseURL:NULL];&lt;br /&gt;    WebScriptObject *scriptObject = [webView windowScriptObject];&lt;br /&gt;&lt;br /&gt;    NSString *_f0_= @"function _f0_(hash){var ret=[];for(var key in hash){ret.push(key);}return ret;}";&lt;br /&gt;&lt;br /&gt;    NSString *returnValue= &lt;span style="font-weight:bold;color:red;"&gt;@"[{'key0':['val000', 'val001'], 'key1':'val01'}, {'key0':'val10', 'key1':['val110', 'val111']}]"&lt;/span&gt;;&lt;br /&gt;    NSString *code= [NSString stringWithFormat:@"function main(){return %@;}", returnValue];&lt;br /&gt;    NSString *script = [NSString stringWithFormat:@"try { %@ %@ } catch (e) { e.toString() }", code, _f0_];&lt;br /&gt;&lt;br /&gt;    id ret0= [scriptObject evaluateWebScript:script];&lt;br /&gt;    if (![ret0 isMemberOfClass:[WebUndefined class]]) {&lt;br /&gt;        NSLog(@"ret(main): %@", ret0);&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    id ret= [scriptObject callWebScriptMethod:@"main" withArguments:nil];&lt;br /&gt;    if (ret &amp;&amp; [ret isMemberOfClass:[WebScriptObject class]]) {&lt;br /&gt;        WebScriptObject *obj= (WebScriptObject *)ret;&lt;br /&gt;        NSArray *nsRet= [SampleAppDelegate structueWithWebScriptObject:obj &lt;br /&gt;                                                       webScriptObject:scriptObject];&lt;br /&gt;        NSLog(@"%@", nsRet);&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;@end&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote class=myInsert&gt;&lt;span style="font-weight:bold;"&gt;Result&lt;/span&gt;&lt;br /&gt;&lt;blockquote class=myInsert2&gt;Javascript&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;[{'key0':['val000', 'val001'], 'key1':'val01'}, {'key0':'val10', 'key1':['val110', 'val111']}]&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;blockquote class=myInsert2&gt;Cocoa&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;(&lt;br /&gt;        {&lt;br /&gt;        key0 =         (&lt;br /&gt;            val000,&lt;br /&gt;            val001&lt;br /&gt;        );&lt;br /&gt;        key1 = val01;&lt;br /&gt;    },&lt;br /&gt;        {&lt;br /&gt;        key0 = val10;&lt;br /&gt;        key1 =         (&lt;br /&gt;            val110,&lt;br /&gt;            val111&lt;br /&gt;        );&lt;br /&gt;    }&lt;br /&gt;)&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4629086917523851821-8607021978219347962?l=edotprintstacktrace.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/ngHothy6to9wNTzzNy7eXKJbsmc/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ngHothy6to9wNTzzNy7eXKJbsmc/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/ngHothy6to9wNTzzNy7eXKJbsmc/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ngHothy6to9wNTzzNy7eXKJbsmc/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/KsjdY/~4/Bp653qGnqrY" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://edotprintstacktrace.blogspot.com/feeds/8607021978219347962/comments/default" title="コメントの投稿" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=4629086917523851821&amp;postID=8607021978219347962" title="0 件のコメント" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4629086917523851821/posts/default/8607021978219347962?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4629086917523851821/posts/default/8607021978219347962?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/KsjdY/~3/Bp653qGnqrY/sample-nest-of-webscriptobject.html" title="Sample: Nest of 'WebScriptObject ( Javascript associative array ) to NSDictionary'  or 'WebScriptObject ( Javascript array ) to NSArray ) '" /><author><name>p_g_</name><uri>http://www.blogger.com/profile/15389208108068935129</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://4.bp.blogspot.com/_BA-iUzxIQks/SfAmPKs5kxI/AAAAAAAAAEw/ie6H2TZGF-M/S220/_____1.png" /></author><thr:total>0</thr:total><feedburner:origLink>http://edotprintstacktrace.blogspot.com/2011/10/sample-nest-of-webscriptobject.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUMHSX0-eSp7ImA9WhRTEEo.&quot;"><id>tag:blogger.com,1999:blog-4629086917523851821.post-5361367959168618611</id><published>2011-10-29T04:10:00.009+09:00</published><updated>2011-11-01T01:10:38.351+09:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-11-01T01:10:38.351+09:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="WebKit" /><category scheme="http://www.blogger.com/atom/ns#" term="Quartz Composer" /><title>Quartz Composer / Box2DJSをCustom Javascript Patch内で動かすことでQCで物理エンジンしてみた</title><content type="html">&lt;blockquote class=myInsert&gt;&lt;span style="font-weight:bold;"&gt;追記(20111101)&lt;/span&gt;: この記事のままだと姿勢（回転）の値がとれていません．姿勢を反映した版( Box2DJS_Demo_Stack_With_Rotate.qtz&lt;br /&gt; )を&lt;a href="https://sites.google.com/site/pgtwitter/qtz-zhiki-chang"&gt;こちら&lt;/a&gt;からdownloadしていただきコードを確認してください．&lt;/blockquote&gt;&lt;br /&gt;&lt;hr/&gt;&lt;br /&gt;&lt;blockquote class=myInsert&gt;&lt;span style="font-weight:bold;"&gt;結果&lt;/span&gt;&lt;br /&gt;&lt;object width="480" height="296" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000"&gt;&lt;br /&gt;  &lt;param name="flashvars" value="vid=18165291&amp;amp;autoplay=false&amp;amp;locale=ja_JP"/&gt;&lt;br /&gt;  &lt;param name="allowfullscreen" value="true"/&gt;&lt;br /&gt;  &lt;param name="allowscriptaccess" value="always"/&gt;&lt;br /&gt;  &lt;param name="src" value="http://www.ustream.tv/flash/viewer.swf"/&gt;&lt;br /&gt;  &lt;embed flashvars="vid=18165291&amp;amp;autoplay=false&amp;amp;locale=ja_JP" width="480" height="296" allowfullscreen="true" allowscriptaccess="always" src="http://www.ustream.tv/flash/viewer.swf" type="application/x-shockwave-flash"&gt;&lt;/embed&gt;&lt;br /&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.ustream.tv/" style="padding: 2px 0px 4px; width: 400px; background: #ffffff; display: block; color: #000000; font-weight: normal; font-size: 10px; text-decoration: underline; text-align: center;" target="_blank"&gt;Video streaming by Ustream&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://box2d-js.sourceforge.net/"&gt;Box2DJS - Physics Engine for JavaScript&lt;/a&gt; &lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote class=myInsert&gt;&lt;span style="font-weight:bold;"&gt;Custom Javascriptの中身&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;//import /Users/work/Desktop/box2d-js_0.1.0/lib/prototype-1.6.0.2.js&lt;br /&gt;&lt;br /&gt;//import /Users/work/Desktop/box2d-js_0.1.0/js/box2d/common/b2Settings.js&lt;br /&gt;//import /Users/work/Desktop/box2d-js_0.1.0/js/box2d/common/math/b2Vec2.js&lt;br /&gt;//import /Users/work/Desktop/box2d-js_0.1.0/js/box2d/common/math/b2Mat22.js&lt;br /&gt;//import /Users/work/Desktop/box2d-js_0.1.0/js/box2d/common/math/b2Math.js&lt;br /&gt;//import /Users/work/Desktop/box2d-js_0.1.0/js/box2d/collision/b2AABB.js&lt;br /&gt;//import /Users/work/Desktop/box2d-js_0.1.0/js/box2d/collision/b2Bound.js&lt;br /&gt;//import /Users/work/Desktop/box2d-js_0.1.0/js/box2d/collision/b2BoundValues.js&lt;br /&gt;//import /Users/work/Desktop/box2d-js_0.1.0/js/box2d/collision/b2Pair.js&lt;br /&gt;//import /Users/work/Desktop/box2d-js_0.1.0/js/box2d/collision/b2PairCallback.js&lt;br /&gt;//import /Users/work/Desktop/box2d-js_0.1.0/js/box2d/collision/b2BufferedPair.js&lt;br /&gt;//import /Users/work/Desktop/box2d-js_0.1.0/js/box2d/collision/b2PairManager.js&lt;br /&gt;//import /Users/work/Desktop/box2d-js_0.1.0/js/box2d/collision/b2BroadPhase.js&lt;br /&gt;//import /Users/work/Desktop/box2d-js_0.1.0/js/box2d/collision/b2Collision.js&lt;br /&gt;//import /Users/work/Desktop/box2d-js_0.1.0/js/box2d/collision/Features.js&lt;br /&gt;//import /Users/work/Desktop/box2d-js_0.1.0/js/box2d/collision/b2ContactID.js&lt;br /&gt;//import /Users/work/Desktop/box2d-js_0.1.0/js/box2d/collision/b2ContactPoint.js&lt;br /&gt;//import /Users/work/Desktop/box2d-js_0.1.0/js/box2d/collision/b2Distance.js&lt;br /&gt;//import /Users/work/Desktop/box2d-js_0.1.0/js/box2d/collision/b2Manifold.js&lt;br /&gt;//import /Users/work/Desktop/box2d-js_0.1.0/js/box2d/collision/b2OBB.js&lt;br /&gt;//import /Users/work/Desktop/box2d-js_0.1.0/js/box2d/collision/b2Proxy.js&lt;br /&gt;//import /Users/work/Desktop/box2d-js_0.1.0/js/box2d/collision/ClipVertex.js&lt;br /&gt;//import /Users/work/Desktop/box2d-js_0.1.0/js/box2d/collision/shapes/b2Shape.js&lt;br /&gt;//import /Users/work/Desktop/box2d-js_0.1.0/js/box2d/collision/shapes/b2ShapeDef.js&lt;br /&gt;//import /Users/work/Desktop/box2d-js_0.1.0/js/box2d/collision/shapes/b2BoxDef.js&lt;br /&gt;//import /Users/work/Desktop/box2d-js_0.1.0/js/box2d/collision/shapes/b2CircleDef.js&lt;br /&gt;//import /Users/work/Desktop/box2d-js_0.1.0/js/box2d/collision/shapes/b2CircleShape.js&lt;br /&gt;//import /Users/work/Desktop/box2d-js_0.1.0/js/box2d/collision/shapes/b2MassData.js&lt;br /&gt;//import /Users/work/Desktop/box2d-js_0.1.0/js/box2d/collision/shapes/b2PolyDef.js&lt;br /&gt;//import /Users/work/Desktop/box2d-js_0.1.0/js/box2d/collision/shapes/b2PolyShape.js&lt;br /&gt;//import /Users/work/Desktop/box2d-js_0.1.0/js/box2d/dynamics/b2Body.js&lt;br /&gt;//import /Users/work/Desktop/box2d-js_0.1.0/js/box2d/dynamics/b2BodyDef.js&lt;br /&gt;//import /Users/work/Desktop/box2d-js_0.1.0/js/box2d/dynamics/b2CollisionFilter.js&lt;br /&gt;//import /Users/work/Desktop/box2d-js_0.1.0/js/box2d/dynamics/b2Island.js&lt;br /&gt;//import /Users/work/Desktop/box2d-js_0.1.0/js/box2d/dynamics/b2TimeStep.js&lt;br /&gt;//import /Users/work/Desktop/box2d-js_0.1.0/js/box2d/dynamics/contacts/b2ContactNode.js&lt;br /&gt;//import /Users/work/Desktop/box2d-js_0.1.0/js/box2d/dynamics/contacts/b2Contact.js&lt;br /&gt;//import /Users/work/Desktop/box2d-js_0.1.0/js/box2d/dynamics/contacts/b2ContactConstraint.js&lt;br /&gt;//import /Users/work/Desktop/box2d-js_0.1.0/js/box2d/dynamics/contacts/b2ContactConstraintPoint.js&lt;br /&gt;//import /Users/work/Desktop/box2d-js_0.1.0/js/box2d/dynamics/contacts/b2ContactRegister.js&lt;br /&gt;//import /Users/work/Desktop/box2d-js_0.1.0/js/box2d/dynamics/contacts/b2ContactSolver.js&lt;br /&gt;//import /Users/work/Desktop/box2d-js_0.1.0/js/box2d/dynamics/contacts/b2CircleContact.js&lt;br /&gt;//import /Users/work/Desktop/box2d-js_0.1.0/js/box2d/dynamics/contacts/b2Conservative.js&lt;br /&gt;//import /Users/work/Desktop/box2d-js_0.1.0/js/box2d/dynamics/contacts/b2NullContact.js&lt;br /&gt;//import /Users/work/Desktop/box2d-js_0.1.0/js/box2d/dynamics/contacts/b2PolyAndCircleContact.js&lt;br /&gt;//import /Users/work/Desktop/box2d-js_0.1.0/js/box2d/dynamics/contacts/b2PolyContact.js&lt;br /&gt;//import /Users/work/Desktop/box2d-js_0.1.0/js/box2d/dynamics/b2ContactManager.js&lt;br /&gt;//import /Users/work/Desktop/box2d-js_0.1.0/js/box2d/dynamics/b2World.js&lt;br /&gt;//import /Users/work/Desktop/box2d-js_0.1.0/js/box2d/dynamics/b2WorldListener.js&lt;br /&gt;//import /Users/work/Desktop/box2d-js_0.1.0/js/box2d/dynamics/joints/b2JointNode.js&lt;br /&gt;//import /Users/work/Desktop/box2d-js_0.1.0/js/box2d/dynamics/joints/b2Joint.js&lt;br /&gt;//import /Users/work/Desktop/box2d-js_0.1.0/js/box2d/dynamics/joints/b2JointDef.js&lt;br /&gt;//import /Users/work/Desktop/box2d-js_0.1.0/js/box2d/dynamics/joints/b2DistanceJoint.js&lt;br /&gt;//import /Users/work/Desktop/box2d-js_0.1.0/js/box2d/dynamics/joints/b2DistanceJointDef.js&lt;br /&gt;//import /Users/work/Desktop/box2d-js_0.1.0/js/box2d/dynamics/joints/b2Jacobian.js&lt;br /&gt;//import /Users/work/Desktop/box2d-js_0.1.0/js/box2d/dynamics/joints/b2GearJoint.js&lt;br /&gt;//import /Users/work/Desktop/box2d-js_0.1.0/js/box2d/dynamics/joints/b2GearJointDef.js&lt;br /&gt;//import /Users/work/Desktop/box2d-js_0.1.0/js/box2d/dynamics/joints/b2MouseJoint.js&lt;br /&gt;//import /Users/work/Desktop/box2d-js_0.1.0/js/box2d/dynamics/joints/b2MouseJointDef.js&lt;br /&gt;//import /Users/work/Desktop/box2d-js_0.1.0/js/box2d/dynamics/joints/b2PrismaticJoint.js&lt;br /&gt;//import /Users/work/Desktop/box2d-js_0.1.0/js/box2d/dynamics/joints/b2PrismaticJointDef.js&lt;br /&gt;//import /Users/work/Desktop/box2d-js_0.1.0/js/box2d/dynamics/joints/b2PulleyJoint.js&lt;br /&gt;//import /Users/work/Desktop/box2d-js_0.1.0/js/box2d/dynamics/joints/b2PulleyJointDef.js&lt;br /&gt;//import /Users/work/Desktop/box2d-js_0.1.0/js/box2d/dynamics/joints/b2RevoluteJoint.js&lt;br /&gt;//import /Users/work/Desktop/box2d-js_0.1.0/js/box2d/dynamics/joints/b2RevoluteJointDef.js&lt;br /&gt;&lt;br /&gt;//import /Users/work/Desktop/box2d-js_0.1.0/demos/demo_base.js&lt;br /&gt;//import /Users/work/Desktop/box2d-js_0.1.0/demos/stack.js&lt;br /&gt;&lt;br /&gt;//output QCPortTypeStructure posYs&lt;br /&gt;//output QCPortTypeStructure posXs&lt;br /&gt;&lt;br /&gt;//input QCPortTypeNumber foo&lt;br /&gt;//input QCPortTypeBoolean init&lt;br /&gt;//output QCPortTypeNumber dummy&lt;br /&gt;&lt;br /&gt;var world = createWorld();&lt;br /&gt;demos.InitWorlds[0](world);&lt;br /&gt;&lt;br /&gt;function main(foo, init) {&lt;br /&gt; if (init) {&lt;br /&gt;  world = createWorld();&lt;br /&gt;  demos.InitWorlds[0](world);&lt;br /&gt; }&lt;br /&gt; world.Step(1.0/60, 1);&lt;br /&gt; var aryX= new Array();&lt;br /&gt; var aryY= new Array();&lt;br /&gt; for (var b = world.m_bodyList; b; b = b.m_next) {&lt;br /&gt;  for (var s = b.GetShapeList(); s != null; s = s.GetNext()) {&lt;br /&gt;   var pos= s.m_position;&lt;br /&gt;   aryX.push(pos.x);&lt;br /&gt;   aryY.push(pos.y);&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt; var ret= new Object();&lt;br /&gt; ret.posXs= aryX;&lt;br /&gt; ret.posYs= aryY;&lt;br /&gt; ret.dummy= foo;&lt;br /&gt; return ret;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote class=myInsert&gt;&lt;span style="font-weight:bold;"&gt;QC&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;描画部&lt;/span&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/-P1n3CqgGYpE/Tqr-78O1eII/AAAAAAAAArQ/BcQcQB12D7Q/s1600/%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25B3%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%2583%25E3%2583%2588%2B2011-10-29%2B4.12.22.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 143px;" src="http://1.bp.blogspot.com/-P1n3CqgGYpE/Tqr-78O1eII/AAAAAAAAArQ/BcQcQB12D7Q/s320/%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25B3%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%2583%25E3%2583%2588%2B2011-10-29%2B4.12.22.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5668623386733279362" /&gt;&lt;/a&gt;&lt;br /&gt;fooはCustom JavaScriptを動かし続けるため(時刻で処理するパッチにしてないので)．&lt;br /&gt;CountはposXs等のCountで良いのだがDemoのデータに動かない要素が入っていたのでそのあたりを使わないため．&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;描画部(Iteratorの中)&lt;/span&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/-oqw5Oqan7gE/Tqr-70-3j3I/AAAAAAAAArE/4o6lbsL-df0/s1600/%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25B3%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%2583%25E3%2583%2588%2B2011-10-29%2B4.13.08.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 150px;" src="http://3.bp.blogspot.com/-oqw5Oqan7gE/Tqr-70-3j3I/AAAAAAAAArE/4o6lbsL-df0/s320/%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25B3%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%2583%25E3%2583%2588%2B2011-10-29%2B4.13.08.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5668623384787259250" /&gt;&lt;/a&gt;&lt;br /&gt;割り算はスケール合わせ用&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Box2DJS: &lt;a href="http://box2d-js.sourceforge.net/"&gt;Box2DJS - Physics Engine for JavaScript&lt;/a&gt; &lt;br /&gt;&lt;br /&gt;Custom Javascript Patch: &lt;a href="https://sites.google.com/site/pgtwitter/qc_patch/custom-javascript-pat"&gt;Custom Javascript Patch - quartz composerのパッチとか&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4629086917523851821-5361367959168618611?l=edotprintstacktrace.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/DCv_0olmemEvcWYsjfO6LZABBzQ/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/DCv_0olmemEvcWYsjfO6LZABBzQ/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/DCv_0olmemEvcWYsjfO6LZABBzQ/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/DCv_0olmemEvcWYsjfO6LZABBzQ/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/KsjdY/~4/mwXijlF844Y" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://edotprintstacktrace.blogspot.com/feeds/5361367959168618611/comments/default" title="コメントの投稿" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=4629086917523851821&amp;postID=5361367959168618611" title="0 件のコメント" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4629086917523851821/posts/default/5361367959168618611?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4629086917523851821/posts/default/5361367959168618611?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/KsjdY/~3/mwXijlF844Y/box2djscustom-javascript-patchqcni.html" title="Quartz Composer / Box2DJSをCustom Javascript Patch内で動かすことでQCで物理エンジンしてみた" /><author><name>p_g_</name><uri>http://www.blogger.com/profile/15389208108068935129</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://4.bp.blogspot.com/_BA-iUzxIQks/SfAmPKs5kxI/AAAAAAAAAEw/ie6H2TZGF-M/S220/_____1.png" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/-P1n3CqgGYpE/Tqr-78O1eII/AAAAAAAAArQ/BcQcQB12D7Q/s72-c/%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25B3%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%2583%25E3%2583%2588%2B2011-10-29%2B4.12.22.png" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://edotprintstacktrace.blogspot.com/2011/10/box2djscustom-javascript-patchqcni.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEAHRX4zeyp7ImA9WhdaGEQ.&quot;"><id>tag:blogger.com,1999:blog-4629086917523851821.post-3804952888480146183</id><published>2011-10-29T03:30:00.007+09:00</published><updated>2011-10-29T22:58:54.083+09:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-10-29T22:58:54.083+09:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="WebKit" /><category scheme="http://www.blogger.com/atom/ns#" term="Cocoa" /><title>Sample: WebScriptObject ( Javascript associative array ) to NSDictionary (  WebScriptObject ( Javascript array ) to NSArray )</title><content type="html">&lt;blockquote class=myInsert&gt;&lt;span style="font-weight:bold;"&gt;Addtion(20111029T2300)&lt;/span&gt;: &lt;a href="http://edotprintstacktrace.blogspot.com/2011/10/sample-nest-of-webscriptobject.html"&gt;Nest Version&lt;/a&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;hr/&gt;&lt;br /&gt;&lt;blockquote class=myInsert&gt;SampleAppDelegate.h&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;#import &amp;lt;Cocoa/Cocoa.h&gt;&lt;br /&gt;#import &amp;lt;WebKit/WebKit.h&gt;&lt;br /&gt;@interface SampleAppDelegate : NSObject &amp;lt;NSApplicationDelegate&gt; {&lt;br /&gt;    NSWindow *window;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;@property (assign) IBOutlet NSWindow *window;&lt;br /&gt;&lt;br /&gt;@end&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;blockquote class=myInsert&gt;SampleAppDelegate.m&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;#import "SampleAppDelegate.h"&lt;br /&gt;@implementation SampleAppDelegate&lt;br /&gt;@synthesize window;&lt;br /&gt;+ (NSArray *)arrayWithWebScriptObject:(WebScriptObject *)obj&lt;br /&gt;{    &lt;br /&gt;    NSMutableArray *ret = [NSMutableArray array];&lt;br /&gt;    NSUInteger count = [[obj valueForKey:@"length"] integerValue]; //exception occurs if it is associative array.&lt;br /&gt;    unsigned i;&lt;br /&gt;    for (i = 0; i &amp;lt; count; i++) {&lt;br /&gt;        [ret addObject:[obj webScriptValueAtIndex:i]];&lt;br /&gt;    }&lt;br /&gt;    return [[ret retain] autorelease];&lt;br /&gt;}&lt;br /&gt;+ (NSDictionary *)dictionaryWithWebScriptObject:(WebScriptObject *)obj&lt;br /&gt;                                webScriptObject:(WebScriptObject *)scriptObj&lt;br /&gt;{&lt;br /&gt;    NSMutableDictionary *ret= [NSMutableDictionary dictionary];&lt;br /&gt;    id keys= [scriptObj callWebScriptMethod:@"_f0_"&lt;br /&gt;                              withArguments:[NSArray arrayWithObjects:obj, nil]];&lt;br /&gt;    NSArray *keyAry= [SampleAppDelegate arrayWithWebScriptObject:keys];&lt;br /&gt;    unsigned i;&lt;br /&gt;    for(i= 0; i&amp;lt;[keyAry count]; i++) {&lt;br /&gt;        NSString *key= [keyAry objectAtIndex:i]; &lt;br /&gt;        [ret setObject:[obj valueForKey:key] forKey:key];&lt;br /&gt;    }&lt;br /&gt;    return [[ret retain] autorelease];&lt;br /&gt;}&lt;br /&gt;- (void)applicationDidFinishLaunching:(NSNotification *)aNotification&lt;br /&gt;{&lt;br /&gt;    WebView *webView = [[WebView alloc] init];&lt;br /&gt;    [[webView mainFrame] loadHTMLString:@"" baseURL:NULL];&lt;br /&gt;    WebScriptObject *scriptObject = [webView windowScriptObject];&lt;br /&gt;&lt;br /&gt;    NSString *_f0_= @"function _f0_(hash){var ret=[];for(var key in hash){ret.push(key);}return ret;}";&lt;br /&gt;    NSString *code= @"function main(){return {'key0':'val0', 'key1':'val1'};}";&lt;br /&gt;    NSString *script = [NSString stringWithFormat:@"try { %@ %@ } catch (e) { e.toString() }", code, _f0_];&lt;br /&gt;    id ret0= [scriptObject evaluateWebScript:script];&lt;br /&gt;    if (![ret0 isMemberOfClass:[WebUndefined class]]) {&lt;br /&gt;        NSLog(@"ret(main): %@", ret0);&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    id ret= [scriptObject callWebScriptMethod:@"main" withArguments:nil];&lt;br /&gt;    if (ret &amp;&amp; [ret isMemberOfClass:[WebScriptObject class]]) {&lt;br /&gt;        WebScriptObject *obj= (WebScriptObject *)ret;&lt;br /&gt;        NSDictionary *dict= [SampleAppDelegate dictionaryWithWebScriptObject:obj&lt;br /&gt;                                                             webScriptObject:scriptObject];&lt;br /&gt;        NSLog(@"%@", dict);&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;@end&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;reference: &lt;a href="http://cocoa.zonble.net/post/1015037990/convert-a-javascript-array-to-an-nsarray"&gt;"Notes on Cocoa - Convert a Javascript array to an NSArray"&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4629086917523851821-3804952888480146183?l=edotprintstacktrace.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/kG3q8jtztClQ9ZRlc6f3S1DpHe0/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/kG3q8jtztClQ9ZRlc6f3S1DpHe0/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/kG3q8jtztClQ9ZRlc6f3S1DpHe0/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/kG3q8jtztClQ9ZRlc6f3S1DpHe0/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/KsjdY/~4/VXC5On1W5ZE" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://edotprintstacktrace.blogspot.com/feeds/3804952888480146183/comments/default" title="コメントの投稿" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=4629086917523851821&amp;postID=3804952888480146183" title="0 件のコメント" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4629086917523851821/posts/default/3804952888480146183?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4629086917523851821/posts/default/3804952888480146183?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/KsjdY/~3/VXC5On1W5ZE/sample-webscriptobject-javascript.html" title="Sample: WebScriptObject ( Javascript associative array ) to NSDictionary (  WebScriptObject ( Javascript array ) to NSArray )" /><author><name>p_g_</name><uri>http://www.blogger.com/profile/15389208108068935129</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://4.bp.blogspot.com/_BA-iUzxIQks/SfAmPKs5kxI/AAAAAAAAAEw/ie6H2TZGF-M/S220/_____1.png" /></author><thr:total>0</thr:total><feedburner:origLink>http://edotprintstacktrace.blogspot.com/2011/10/sample-webscriptobject-javascript.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0cBRnsyfyp7ImA9WhdUGEk.&quot;"><id>tag:blogger.com,1999:blog-4629086917523851821.post-1755820081065535167</id><published>2011-10-06T03:52:00.007+09:00</published><updated>2011-10-06T03:57:37.597+09:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-10-06T03:57:37.597+09:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Cocoa" /><title>NSTableViewのカラムのValueに対してプログラム中でBindingをする</title><content type="html">&lt;blockquote class=myInsert&gt;&lt;pre&gt;&lt;br /&gt;            NSTableView *tableView;&lt;br /&gt;            NSArrayController *arrayController;&lt;br /&gt;            NSString *key;&lt;br /&gt;&lt;br /&gt;            NSTableColumn *tc= [[[NSTableColumn alloc] init] autorelease];&lt;br /&gt;            [[tc headerCell] setStringValue:key];&lt;br /&gt;            NSString *modelKey= [NSString stringWithFormat:@"arrangedObjects.%@", key];&lt;br /&gt;            [tc bind:@"value" toObject:arrayController withKeyPath:modelKey options:nil];&lt;br /&gt;            [tableView addTableColumn:tc];&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;tableViewからtableColumnを取得してもよいはず．&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4629086917523851821-1755820081065535167?l=edotprintstacktrace.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/LSpjDoPy7nozhhA84OcXmhdVVmU/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/LSpjDoPy7nozhhA84OcXmhdVVmU/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/LSpjDoPy7nozhhA84OcXmhdVVmU/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/LSpjDoPy7nozhhA84OcXmhdVVmU/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/KsjdY/~4/zZT1urXhn6A" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://edotprintstacktrace.blogspot.com/feeds/1755820081065535167/comments/default" title="コメントの投稿" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=4629086917523851821&amp;postID=1755820081065535167" title="0 件のコメント" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4629086917523851821/posts/default/1755820081065535167?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4629086917523851821/posts/default/1755820081065535167?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/KsjdY/~3/zZT1urXhn6A/nstableviewvaluebinding.html" title="NSTableViewのカラムのValueに対してプログラム中でBindingをする" /><author><name>p_g_</name><uri>http://www.blogger.com/profile/15389208108068935129</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://4.bp.blogspot.com/_BA-iUzxIQks/SfAmPKs5kxI/AAAAAAAAAEw/ie6H2TZGF-M/S220/_____1.png" /></author><thr:total>0</thr:total><feedburner:origLink>http://edotprintstacktrace.blogspot.com/2011/10/nstableviewvaluebinding.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkEDQ3c-eSp7ImA9WhdUGE4.&quot;"><id>tag:blogger.com,1999:blog-4629086917523851821.post-7431495455430178016</id><published>2011-10-06T00:26:00.009+09:00</published><updated>2011-10-06T02:11:12.951+09:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-10-06T02:11:12.951+09:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="NSBezierPath" /><category scheme="http://www.blogger.com/atom/ns#" term="Cocoa" /><title>円弧のNSBezierPath</title><content type="html">- (void) appendBezierPathWithArcWithCenter:radius:startAngle:endAngle:でいいじゃんとか言わない． &lt;br /&gt;&lt;blockquote class=myInsert&gt;&lt;pre&gt;&lt;br /&gt;    double CX= &lt;span style="font-weight:bold;"&gt;__CENTER_X_&lt;/span&gt;; &lt;br /&gt;    double CY= &lt;span style="font-weight:bold;"&gt;__CENTER_X_&lt;/span&gt;; &lt;br /&gt;    double r= &lt;span style="font-weight:bold;"&gt;__RADIUS__&lt;/span&gt;&lt;br /&gt;    double b= &lt;span style="font-weight:bold;"&gt;__RATIO__0_TO_1_&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;    NSBezierPath *path= [NSBezierPath bezierPath];    &lt;br /&gt;    double a= 4.0/3.0 * (sqrt(2)-1) * r;&lt;br /&gt;    double c= 0.0;&lt;br /&gt;    [path moveToPoint:NSMakePoint(+r, 0)];&lt;br /&gt;    if (b&gt;0.25) {&lt;br /&gt;     [path curveToPoint:NSMakePoint(0, +r) &lt;br /&gt;       controlPoint1:NSMakePoint(+r, +a) &lt;br /&gt;       controlPoint2:NSMakePoint(+a, +r)];&lt;br /&gt;     b-= 0.25;&lt;br /&gt;     c+= 90.0;&lt;br /&gt;    }&lt;br /&gt;    if (b&gt;0.25) {&lt;br /&gt;     [path curveToPoint:NSMakePoint(-r, 0) &lt;br /&gt;       controlPoint1:NSMakePoint(-a, +r) &lt;br /&gt;       controlPoint2:NSMakePoint(-r, +a)];&lt;br /&gt;     b-= 0.25;&lt;br /&gt;     c+= 90.0;&lt;br /&gt;    }&lt;br /&gt;    if (b&gt;0.25) {&lt;br /&gt;     [path curveToPoint:NSMakePoint(0, -r) &lt;br /&gt;       controlPoint1:NSMakePoint(-r, -a) &lt;br /&gt;       controlPoint2:NSMakePoint(-a, -r)];&lt;br /&gt;     b-= 0.25;&lt;br /&gt;     c+= 90.0;&lt;br /&gt;    }&lt;br /&gt;    if(b==0.25) {&lt;br /&gt;     [path curveToPoint:NSMakePoint(+r, 0)&lt;br /&gt;       controlPoint1:NSMakePoint(+a, -r) &lt;br /&gt;       controlPoint2:NSMakePoint(+r, -a)];    &lt;br /&gt;     //b-= 0.25;&lt;br /&gt;     //c+= 90.0;&lt;br /&gt;    }&lt;br /&gt;    else &lt;del&gt;if (b&amp;lt;0.25)&lt;/del&gt; {&lt;br /&gt;     NSAffineTransform *affine= [NSAffineTransform transform];&lt;br /&gt;     [affine rotateByDegrees:c];&lt;br /&gt;     double t= b/0.25;&lt;br /&gt;     double it= (1.-t);&lt;br /&gt;     [path curveToPoint:[affine transformPoint:NSMakePoint(+cos(t*M_PI_2)*r, +sin(t*M_PI_2)*r)] &lt;br /&gt;       controlPoint1:[affine transformPoint:NSMakePoint(+r, +a*t)] &lt;br /&gt;       controlPoint2:[affine transformPoint:NSMakePoint(+(it*it*r+2*it*t*r+t*t*a), +(it*it*0+2*it*t*a+t*t*r))]&lt;br /&gt;      ];&lt;br /&gt;    }&lt;br /&gt;    NSAffineTransform *affine= [NSAffineTransform transform];&lt;br /&gt;    [affine translateXBy:CX yBy:CY];&lt;br /&gt;    &lt;span style="font-weight:bold;color:green;"&gt;//[affine rotateByDegrees:45];&lt;/span&gt;&lt;br /&gt;    [path transformUsingAffineTransform:affine];&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;開始点を変更したい場合は最後の平行移動前(書く時は後ろ)にて回転させればよい．(コメント部)&lt;br /&gt;描画ならCGContextAddArcか．&lt;br /&gt;&lt;br /&gt;&lt;blockquote class=myInsert&gt;&lt;span style="font-weight:bold;"&gt;参考&lt;/span&gt;: &lt;a href="http://park12.wakwak.com/~shp/cgi-bin/wiki.cgi/view/bezier_curve"&gt;s.h's page - [graphic] ベジエ曲線&lt;/a&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4629086917523851821-7431495455430178016?l=edotprintstacktrace.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/YV59Dy9qCIqEfccKqEcPsJspF6M/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/YV59Dy9qCIqEfccKqEcPsJspF6M/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/YV59Dy9qCIqEfccKqEcPsJspF6M/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/YV59Dy9qCIqEfccKqEcPsJspF6M/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/KsjdY/~4/UedHikT7MFc" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://edotprintstacktrace.blogspot.com/feeds/7431495455430178016/comments/default" title="コメントの投稿" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=4629086917523851821&amp;postID=7431495455430178016" title="0 件のコメント" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4629086917523851821/posts/default/7431495455430178016?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4629086917523851821/posts/default/7431495455430178016?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/KsjdY/~3/UedHikT7MFc/nsbezierpath.html" title="円弧のNSBezierPath" /><author><name>p_g_</name><uri>http://www.blogger.com/profile/15389208108068935129</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://4.bp.blogspot.com/_BA-iUzxIQks/SfAmPKs5kxI/AAAAAAAAAEw/ie6H2TZGF-M/S220/_____1.png" /></author><thr:total>0</thr:total><feedburner:origLink>http://edotprintstacktrace.blogspot.com/2011/10/nsbezierpath.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0IFQHk7fCp7ImA9WhdWGUo.&quot;"><id>tag:blogger.com,1999:blog-4629086917523851821.post-5601201206048920109</id><published>2011-09-14T04:29:00.011+09:00</published><updated>2011-09-14T13:45:11.704+09:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-09-14T13:45:11.704+09:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="4store" /><category scheme="http://www.blogger.com/atom/ns#" term="SPARQL" /><category scheme="http://www.blogger.com/atom/ns#" term="OAuthConsumer.framework" /><category scheme="http://www.blogger.com/atom/ns#" term="Cocoa" /><category scheme="http://www.blogger.com/atom/ns#" term="RDF" /><title>メモ的: Twitterのhome_timelineの情報を無理矢理4storeに入れてみる（いろんな意味でいろいろ間違ってるとは思う）</title><content type="html">&lt;li&gt;OAuthConsumerフレームワーク('#import &amp;lt;OAuthConsumer/OAuthConsumer.h&gt;')については&lt;a href="http://edotprintstacktrace.blogspot.com/2011/08/oauthconsumerframeworktwitterpost.html"&gt;こちら&lt;/a&gt;．&lt;br /&gt;&lt;li&gt;4storeのクライアントライブラリ(っぽいなにか)('#import "FourStore.h"')については&lt;a href="http://edotprintstacktrace.blogspot.com/2011/09/cocoaobjective-c4storeclient-library.html"&gt;こちら&lt;/a&gt;．&lt;br /&gt;&lt;blockquote class=myInsert&gt;&lt;br /&gt;&lt;pre&gt;#import "TwTurtleAppDelegate.h"&lt;br /&gt;&lt;span style="color:green;"&gt;#import &amp;lt;OAuthConsumer/OAuthConsumer.h&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:red;"&gt;#import "FourStore.h"&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;@implementation TwTurtleAppDelegate&lt;br /&gt;&lt;br /&gt;@synthesize window;&lt;br /&gt;&lt;br /&gt;- (void)applicationDidFinishLaunching:(NSNotification *)aNotification&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color:green;"&gt;OAConsumer *consumer = [[OAConsumer alloc] initWithKey:@"XXXXXXXXXXXXXXXXXXXXXX"&lt;br /&gt;                                                    secret:@"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"];&lt;br /&gt;    &lt;br /&gt;    OAToken *accessToken= [[OAToken alloc] initWithKey:@"XXXXXXX-XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"&lt;br /&gt;                                                secret:@"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"];&lt;br /&gt;        &lt;br /&gt;    NSURL *url= [NSURL URLWithString:@"http://api.twitter.com/1/statuses/home_timeline.xml"];&lt;br /&gt;    OAMutableURLRequest *requestWithBodyParams = [[[OAMutableURLRequest alloc] initWithURL:url&lt;br /&gt;                                                                                  consumer:consumer&lt;br /&gt;                                                                                     token:accessToken   &lt;br /&gt;                                                                                     realm:nil   &lt;br /&gt;                                                                         signatureProvider:nil] autorelease];&lt;br /&gt;    &lt;br /&gt;    OADataFetcher *fetcher = [[[OADataFetcher alloc] init] autorelease];&lt;br /&gt;    &lt;br /&gt;    [fetcher fetchDataWithRequest:requestWithBodyParams &lt;br /&gt;                         delegate:self&lt;br /&gt;                didFinishSelector:@selector(apiTicket:didFinishWithData:)&lt;br /&gt;                  didFailSelector:@selector(apiTicket:didFailWithError:)];&lt;/span&gt;&lt;br /&gt;}&lt;br /&gt;- (void)fourstoreWithTurtle:(NSString *)turtle&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color:red;"&gt;FourStore *store= [[FourStore alloc] initWithEndpoint:@"http://localhost:8000/sparql/"];&lt;br /&gt;    [store addPrefix:@"tsp" uri:@"http://example.org/twitter/status/predicate/"];&lt;br /&gt;    [store addPrefix:@"tu" uri:@"http://example.org/twitter/users/"];&lt;br /&gt;    &lt;br /&gt;    NSString *message0= [store deleteWithGraph:@"http://example.org/twitter/status/"];&lt;br /&gt;    NSLog(@"message0 %@", message0);&lt;br /&gt;    &lt;br /&gt;    &lt;br /&gt;    NSString *message1= [store addTurtle:turtle graph:@"http://example.org/twitter/status/"];&lt;br /&gt;    NSLog(@"message1 %@", message1);&lt;br /&gt;    &lt;br /&gt;    NSString *message2= [store queryWithString:&lt;br /&gt;                         @"SELECT ?s ?p ?o \nWHERE {\nGRAPH &amp;lt;http://example.org/twitter/status/&gt; {\n?s ?p ?o .\n}\n}\n"];&lt;br /&gt;    NSLog(@"message2 \n%@", message2);&lt;/span&gt;&lt;br /&gt;}&lt;br /&gt;- (NSString *)createTurtleWithXMLData:(NSData *)data&lt;br /&gt;{&lt;br /&gt;    NSMutableString *turtle= [NSMutableString string];&lt;br /&gt;    &lt;br /&gt;    &lt;span style="color:blue;"&gt;NSXMLDocument *document = [[[NSXMLDocument alloc] initWithData:data &lt;br /&gt;                                                           options:NSXMLDocumentTidyHTML &lt;br /&gt;                                                             error:NULL] autorelease];&lt;br /&gt;    NSError *error= nil; &lt;br /&gt;    NSArray *nodes = [document nodesForXPath:@"//status" error:&amp;error];&lt;br /&gt;    NSEnumerator *nodesEnum= [nodes objectEnumerator];&lt;br /&gt;    NSXMLNode *node= nil;&lt;br /&gt;    while(node= [nodesEnum nextObject]) {&lt;br /&gt;        NSArray *idnodes= [node nodesForXPath:@"id" error:&amp;error];&lt;br /&gt;        if ([idnodes count]==0) continue;&lt;br /&gt;        NSString *idString= [[idnodes objectAtIndex:0] stringValue];&lt;br /&gt;        NSEnumerator *childrenEnum= [[node children] objectEnumerator];&lt;br /&gt;        NSXMLNode *child=nil;&lt;br /&gt;        while(child= [childrenEnum nextObject]) {&lt;br /&gt;            NSString *name= [child name];&lt;br /&gt;            if ([name isEqualToString:@"id"])&lt;br /&gt;                continue;&lt;br /&gt;            NSString *value= nil;&lt;br /&gt;            if ([name isEqualToString:@"retweeted_status"]){&lt;br /&gt;                NSArray *cidnodes= [child nodesForXPath:@"id" error:&amp;error];&lt;br /&gt;                if ([cidnodes count]==0) continue;&lt;br /&gt;                NSString *cidString= [[cidnodes objectAtIndex:0] stringValue];&lt;br /&gt;                value= [NSString stringWithFormat:@"&amp;lt;%@&gt;", cidString];&lt;br /&gt;            } else if ([name isEqualToString:@"user"]){&lt;br /&gt;                NSArray *cidnodes= [child nodesForXPath:@"id" error:&amp;error];&lt;br /&gt;                if ([cidnodes count]==0) continue;&lt;br /&gt;                NSString *cidString= [[cidnodes objectAtIndex:0] stringValue];&lt;br /&gt;                value= [NSString stringWithFormat:@"&amp;lt;tu:%@&gt;", cidString];&lt;br /&gt;            } else {&lt;br /&gt;                if ([[child stringValue] length]==0) continue;&lt;br /&gt;                value= [child stringValue];&lt;br /&gt;                value= [value stringByReplacingOccurrencesOfString:@"\"" withString:@"\\\""];&lt;br /&gt;                value= [value stringByReplacingOccurrencesOfString:@"\n" withString:@"\\n"];&lt;br /&gt;                value= [NSString stringWithFormat:@"\"%@\"", value];&lt;br /&gt;            }&lt;br /&gt;            &lt;br /&gt;            [turtle appendFormat:@"&amp;lt;%@&gt; tsp:%@ %@ .\n", idString, name, value];&lt;br /&gt;        }&lt;br /&gt;    }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;    return turtle;&lt;br /&gt;}&lt;br /&gt;&lt;span style="color:green;"&gt;- (void)apiTicket:(OAServiceTicket *)ticket &lt;br /&gt;didFinishWithData:(NSData *)data &lt;br /&gt;{&lt;/span&gt;&lt;br /&gt;    if (0)&lt;br /&gt;        NSLog(@"didFinish %@", [[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding] autorelease]);&lt;br /&gt;    &lt;br /&gt;    NSString *turtle= [self createTurtleWithXMLData:data];&lt;br /&gt;    &lt;br /&gt;    if (0)&lt;br /&gt;        NSLog(@"\n%@", turtle);&lt;br /&gt;    &lt;br /&gt;    [self fourstoreWithTurtle:turtle];&lt;br /&gt;&lt;span style="color:green;"&gt;}&lt;br /&gt;- (void)apiTicket:(OAServiceTicket *)ticket &lt;br /&gt; didFailWithError:(NSError *)error &lt;br /&gt;{&lt;/span&gt;&lt;br /&gt;    NSLog(@"%@", error);&lt;br /&gt;&lt;span style="color:green;"&gt;}&lt;/span&gt;&lt;br /&gt;@end&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;やってみてアレコレ悩んだ足跡．&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4629086917523851821-5601201206048920109?l=edotprintstacktrace.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/9ETnP_eFJvLXJ2HlQv-8EzZOLXA/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/9ETnP_eFJvLXJ2HlQv-8EzZOLXA/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/9ETnP_eFJvLXJ2HlQv-8EzZOLXA/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/9ETnP_eFJvLXJ2HlQv-8EzZOLXA/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/KsjdY/~4/DY8ma42TGG0" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://edotprintstacktrace.blogspot.com/feeds/5601201206048920109/comments/default" title="コメントの投稿" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=4629086917523851821&amp;postID=5601201206048920109" title="0 件のコメント" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4629086917523851821/posts/default/5601201206048920109?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4629086917523851821/posts/default/5601201206048920109?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/KsjdY/~3/DY8ma42TGG0/twitterhometimeline4store.html" title="メモ的: Twitterのhome_timelineの情報を無理矢理4storeに入れてみる（いろんな意味でいろいろ間違ってるとは思う）" /><author><name>p_g_</name><uri>http://www.blogger.com/profile/15389208108068935129</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://4.bp.blogspot.com/_BA-iUzxIQks/SfAmPKs5kxI/AAAAAAAAAEw/ie6H2TZGF-M/S220/_____1.png" /></author><thr:total>0</thr:total><feedburner:origLink>http://edotprintstacktrace.blogspot.com/2011/09/twitterhometimeline4store.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D04CRn8_cCp7ImA9WhdWGUo.&quot;"><id>tag:blogger.com,1999:blog-4629086917523851821.post-202881026613469974</id><published>2011-09-12T03:15:00.015+09:00</published><updated>2011-09-14T13:52:47.148+09:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-09-14T13:52:47.148+09:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="4store" /><category scheme="http://www.blogger.com/atom/ns#" term="SPARQL" /><category scheme="http://www.blogger.com/atom/ns#" term="Cocoa" /><category scheme="http://www.blogger.com/atom/ns#" term="RDF" /><title>Cocoa ( Objective-C )での 4store の Client Library (?)</title><content type="html">&lt;blockquote class=myInsert&gt;&lt;span style="font-weight:bold;"&gt;動機&lt;/span&gt;&lt;br /&gt;&lt;a href="http://4store.org/"&gt;4store&lt;/a&gt;を入れてみた．&lt;a href="https://github.com/moustaki/4store-ruby/"&gt;rubyのclient用ライブラリ&lt;/a&gt;をみて，似たものをcocoaでやってみようと思った(たぶん既にどこかにあるだろうけど)．&lt;br /&gt;&lt;blockquote class=myInsert2&gt;入れる際(環境: MacOSX10.7)にハマった点&lt;br /&gt;&lt;li&gt;MacPortsでraptorとrasqalを入れたのだがraptorに1.x(www/raptor)と2.x(www/raptor2)があり, rasqal0.9.26がraptor2.xを利用して入っているのにraptor 1.xが入ったままだと4storeのmake時にエラーがでたこと．&lt;br /&gt;&lt;li&gt;"git clone https://github.com/garlik/4store.git"でとってきたらconfigureがなかったので(そういうものなのかな?), "sh autogen.sh"から始めたこと．&lt;/blockquote&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote  class=myInsert&gt;&lt;span style="font-weight:bold;"&gt;やってみた(rubyにあるload作ってないしsetもマネの途中)&lt;/span&gt;&lt;br /&gt;&lt;blockquote class=myInsert2&gt;FourStore.h&lt;pre&gt;&lt;br /&gt;@interface FourStore : NSObject&lt;br /&gt;{&lt;br /&gt;    NSURL *_urlSPARQL;&lt;br /&gt;    NSURL *_urlDATA;&lt;br /&gt;    NSMutableArray *_prefixs;&lt;br /&gt;}&lt;br /&gt;- (id)initWithEndpoint:(NSString *)endpoint;&lt;br /&gt;- (void)addPrefix:(NSString *)prefix uri:(NSString *)uri;&lt;br /&gt;- (NSString *)addTurtle:(NSString *)turtle graph:(NSString *)graph;&lt;br /&gt;//- (NSString *)setTurtle:(NSString *)turtle graph:(NSString *)graph;&lt;br /&gt;- (NSString *)queryWithString:(NSString *)query;&lt;br /&gt;- (NSString *)deleteWithGraph:(NSString *)graph;&lt;br /&gt;@end&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;blockquote class=myInsert2&gt;FourStore.m&lt;pre&gt;&lt;br /&gt;#import "FourStore.h"&lt;br /&gt;&lt;br /&gt;@implementation FourStore&lt;br /&gt;&lt;br /&gt;- (id)init&lt;br /&gt;{&lt;br /&gt;    self = [super init];&lt;br /&gt;    if (self) {&lt;br /&gt;    }&lt;br /&gt;    return self;&lt;br /&gt;}&lt;br /&gt;- (id)initWithEndpoint:(NSString *)endpoint&lt;br /&gt;{&lt;br /&gt;    if (![endpoint hasSuffix:@"/sparql/"]) {&lt;br /&gt;        return nil;&lt;br /&gt;    }&lt;br /&gt;    self = [self init];&lt;br /&gt;    if (self) {&lt;br /&gt;        _urlSPARQL= [[NSURL URLWithString:endpoint] retain];&lt;br /&gt;        NSArray *ary= [endpoint componentsSeparatedByString:@"/sparql/"];&lt;br /&gt;        _urlDATA= [[NSURL URLWithString:[NSString stringWithFormat:@"%@/data/", [ary objectAtIndex:0]]] retain];&lt;br /&gt;        _prefixs= [[NSMutableArray array] retain];&lt;br /&gt;    }&lt;br /&gt;    return self;&lt;br /&gt;}&lt;br /&gt;- (void)dealloc&lt;br /&gt;{&lt;br /&gt;    [_urlSPARQL release];&lt;br /&gt;    [_urlDATA release];&lt;br /&gt;    [super dealloc];&lt;br /&gt;}&lt;br /&gt;+ (NSString *)sendRequest:(NSURLRequest *)request&lt;br /&gt;{&lt;br /&gt;    NSURLResponse *response=nil;&lt;br /&gt;    NSError *error= nil;&lt;br /&gt;    NSData *data= [NSURLConnection sendSynchronousRequest:request&lt;br /&gt;                                        returningResponse:&amp;response&lt;br /&gt;                                                    error:&amp;error];&lt;br /&gt;    if (error) {&lt;br /&gt;        NSLog(@"statusCode %ld", [response statusCode]);&lt;br /&gt;        NSLog(@"error code %ld", [error code]);&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    NSString *message= [[NSString alloc] initWithData:data&lt;br /&gt;                                             encoding:NSUTF8StringEncoding];&lt;br /&gt;    return [message autorelease];&lt;br /&gt;}&lt;br /&gt;+ (NSString *)send:(NSString *)request url:(NSURL *)url method:(NSString *)method&lt;br /&gt;{&lt;br /&gt;    NSMutableURLRequest *requestWithBodyParams = [[NSMutableURLRequest alloc] initWithURL:url];&lt;br /&gt;    NSData *requestData = [request dataUsingEncoding:NSASCIIStringEncoding &lt;br /&gt;                                allowLossyConversion:YES];&lt;br /&gt;    [requestWithBodyParams setHTTPBody:requestData];&lt;br /&gt;    [requestWithBodyParams setValue:[NSString stringWithFormat:@"%d", [requestData length]]&lt;br /&gt;                 forHTTPHeaderField:@"Content-Length"];   &lt;br /&gt;    [requestWithBodyParams setValue:@"application/x-www-form-urlencoded"&lt;br /&gt;                 forHTTPHeaderField:@"Content-Type"];  &lt;br /&gt;    [requestWithBodyParams setHTTPMethod:method];&lt;br /&gt;    &lt;br /&gt;    NSString *msg=  [FourStore sendRequest:requestWithBodyParams];&lt;br /&gt;    [requestWithBodyParams release];&lt;br /&gt;    &lt;br /&gt;    return msg;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;- (void)addPrefix:(NSString *)prefix uri:(NSString *)uri&lt;br /&gt;{&lt;br /&gt;    [_prefixs addObject:[NSDictionary dictionaryWithObjectsAndKeys:&lt;br /&gt;                         prefix, @"p", uri, @"u", nil]];&lt;br /&gt;}&lt;br /&gt;- (NSString *)prefixsOfQuery&lt;br /&gt;{&lt;br /&gt;    NSMutableString *ret= [NSMutableString string];&lt;br /&gt;    NSEnumerator *prefixsEnum= [_prefixs objectEnumerator];&lt;br /&gt;    NSDictionary *dic;&lt;br /&gt;    while(dic= [prefixsEnum nextObject]) {&lt;br /&gt;        [ret appendFormat:@"PREFIX %@: &amp;lt;%@&gt;\n", [dic objectForKey:@"p"], [dic objectForKey:@"u"]];&lt;br /&gt;    }&lt;br /&gt;    return [[ret retain] autorelease];&lt;br /&gt;}&lt;br /&gt;- (NSString *)prefixsOfTurtle&lt;br /&gt;{&lt;br /&gt;    NSMutableString *ret= [NSMutableString string];&lt;br /&gt;    NSEnumerator *prefixsEnum= [_prefixs objectEnumerator];&lt;br /&gt;    NSDictionary *dic;&lt;br /&gt;    while(dic= [prefixsEnum nextObject]) {&lt;br /&gt;        [ret appendFormat:@"@prefix %@: &amp;lt;%@&gt; .\n", [dic objectForKey:@"p"], [dic objectForKey:@"u"]];&lt;br /&gt;    }&lt;br /&gt;    return [[ret retain] autorelease];&lt;br /&gt;}&lt;br /&gt;- (NSString *)queryWithString:(NSString *)query&lt;br /&gt;{&lt;br /&gt;    NSString *fullquery= [NSString stringWithFormat:@"%@%@", [self prefixsOfQuery], query];&lt;br /&gt;    &lt;br /&gt;    NSString *request= [NSString stringWithFormat:@"query=%@&amp;soft-limit=%@", &lt;br /&gt;                        [fullquery stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding], @""];&lt;br /&gt;    &lt;br /&gt;    return [FourStore send:request url:_urlSPARQL method:@"POST"];&lt;br /&gt;}&lt;br /&gt;- (NSString *)addTurtle:(NSString *)turtle graph:(NSString *)graph&lt;br /&gt;{&lt;br /&gt;    NSString *fullturtle= [NSString stringWithFormat:@"%@%@", [self prefixsOfTurtle], turtle];&lt;br /&gt;    &lt;br /&gt;    NSString *request= [NSString stringWithFormat:@"mime-type=%@&amp;data=%@&amp;graph=%@", &lt;br /&gt;                        [@"application/x-turtle" stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding],&lt;br /&gt;                        [fullturtle stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding],&lt;br /&gt;                        [graph stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];&lt;br /&gt;    &lt;br /&gt;    return [FourStore send:request url:_urlDATA method:@"POST"];&lt;br /&gt;}&lt;br /&gt;//- (NSString *)setTurtle:(NSString *)turtle graph:(NSString *)graph&lt;br /&gt;//{&lt;br /&gt;//    NSString *fullturtle= [NSString stringWithFormat:@"%@%@", [self prefixsOfTurtle], turtle];&lt;br /&gt;//&lt;br /&gt;//    NSString *request= [fullturtle stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];&lt;br /&gt;//&lt;br /&gt;//    NSURL *url= [NSURL URLWithString:[NSString stringWithFormat:@"%@%@", [_urlDATA absoluteString], graph]];&lt;br /&gt;//    &lt;br /&gt;//    return [FourStore send:request url:url method:@"PUT"];&lt;br /&gt;//}&lt;br /&gt;- (NSString *)deleteWithGraph:(NSString *)graph&lt;br /&gt;{&lt;br /&gt;    NSURL *url= [NSURL URLWithString:[NSString stringWithFormat:@"%@%@", [_urlDATA absoluteString], graph]];&lt;br /&gt;&lt;br /&gt;    return [FourStore send:@"" url:url method:@"DELETE"];&lt;br /&gt;}&lt;br /&gt;@end&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote class=myInsert&gt;使い方(?)&lt;pre&gt;&lt;br /&gt;    FourStore *store= [[FourStore alloc] initWithEndpoint:@"http://localhost:8000/sparql/"];&lt;br /&gt;    [store addPrefix:@"dc" uri:@"http://purl.org/dc/elements/1.1/"];&lt;br /&gt;    &lt;br /&gt;    if (1) {&lt;br /&gt;        NSString *msg= [store addTurtle:@"&amp;lt;http://example.org/book/book1&gt; dc:title \"SPARQL Tutorial\" ." &lt;br /&gt;                                  graph:@"http://example.org/book"];  &lt;br /&gt;        NSLog(@"%@", msg);&lt;br /&gt;    }&lt;br /&gt;    if (1) {&lt;br /&gt;        NSString *msg= [store queryWithString:&lt;br /&gt;                        @"SELECT ?title \nWHERE {\nGRAPH &amp;lt;http://example.org/book&gt; {\n&amp;lt;http://example.org/book/book1&gt; &amp;lt;http://purl.org/dc/elements/1.1/title&gt; ?title .\n}\n}\n"];&lt;br /&gt;        NSLog(@"%@", msg);&lt;br /&gt;&lt;br /&gt;    }&lt;br /&gt;    if (1) {&lt;br /&gt;        NSString *msg= [store queryWithString:&lt;br /&gt;                        @"SELECT ?title \nWHERE {\nGRAPH &amp;lt;http://example.org/book&gt; {\n&amp;lt;http://example.org/book/book1&gt; dc:title ?title .\n}\n}\n"];&lt;br /&gt;        NSLog(@"%@", msg);&lt;br /&gt;        &lt;br /&gt;    }&lt;br /&gt;    if (1) {&lt;br /&gt;        NSString *msg= [store deleteWithGraph:@"http://example.org/book"];&lt;br /&gt;        NSLog(@"%@", msg);&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    [store release];&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote class=myInsert&gt;結果&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;&lt;br /&gt;(&gt; 4s-backend-setup [KB])&lt;br /&gt;&gt; 4s-backend [KB]&lt;br /&gt;&gt; 4s-httpd -p 8000 -U [KB]&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;blockquote class=myInsert2&gt;&lt;pre&gt;&lt;br /&gt;&gt; 200 added successfully&lt;br /&gt;This is a 4store SPARQL server v1.1.3-54-gd8008fc&lt;br /&gt;&lt;br /&gt;&gt; &amp;lt;?xml version="1.0"?&gt;&lt;br /&gt;&amp;lt;sparql xmlns="http://www.w3.org/2005/sparql-results#"&gt;&lt;br /&gt;  &amp;lt;head&gt;&lt;br /&gt;    &amp;lt;variable name="title"/&gt;&lt;br /&gt;  &amp;lt;/head&gt;&lt;br /&gt;  &amp;lt;results&gt;&lt;br /&gt;    &amp;lt;result&gt;&lt;br /&gt;      &amp;lt;binding name="title"&gt;&amp;lt;literal&gt;SPARQL Tutorial&amp;lt;/literal&gt;&amp;lt;/binding&gt;&lt;br /&gt;    &amp;lt;/result&gt;&lt;br /&gt;  &amp;lt;/results&gt;&lt;br /&gt;&amp;lt;/sparql&gt;&lt;br /&gt;&lt;br /&gt;&gt; &amp;lt;?xml version="1.0"?&gt;&lt;br /&gt;&amp;lt;sparql xmlns="http://www.w3.org/2005/sparql-results#"&gt;&lt;br /&gt;  &amp;lt;head&gt;&lt;br /&gt;    &amp;lt;variable name="title"/&gt;&lt;br /&gt;  &amp;lt;/head&gt;&lt;br /&gt;  &amp;lt;results&gt;&lt;br /&gt;    &amp;lt;result&gt;&lt;br /&gt;      &amp;lt;binding name="title"&gt;&amp;lt;literal&gt;SPARQL Tutorial&amp;lt;/literal&gt;&amp;lt;/binding&gt;&lt;br /&gt;    &amp;lt;/result&gt;&lt;br /&gt;  &amp;lt;/results&gt;&lt;br /&gt;&amp;lt;/sparql&gt;&lt;br /&gt;&lt;br /&gt;&gt; 200 deleted successfully&lt;br /&gt;This is a 4store SPARQL server v1.1.3-54-gd8008fc&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4629086917523851821-202881026613469974?l=edotprintstacktrace.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/Aj9-IMKJuJJFmNxXm_ghckXOwZw/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Aj9-IMKJuJJFmNxXm_ghckXOwZw/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/Aj9-IMKJuJJFmNxXm_ghckXOwZw/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Aj9-IMKJuJJFmNxXm_ghckXOwZw/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/KsjdY/~4/P6BfzA7sesU" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://edotprintstacktrace.blogspot.com/feeds/202881026613469974/comments/default" title="コメントの投稿" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=4629086917523851821&amp;postID=202881026613469974" title="0 件のコメント" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4629086917523851821/posts/default/202881026613469974?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4629086917523851821/posts/default/202881026613469974?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/KsjdY/~3/P6BfzA7sesU/cocoaobjective-c4storeclient-library.html" title="Cocoa ( Objective-C )での 4store の Client Library (?)" /><author><name>p_g_</name><uri>http://www.blogger.com/profile/15389208108068935129</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://4.bp.blogspot.com/_BA-iUzxIQks/SfAmPKs5kxI/AAAAAAAAAEw/ie6H2TZGF-M/S220/_____1.png" /></author><thr:total>0</thr:total><feedburner:origLink>http://edotprintstacktrace.blogspot.com/2011/09/cocoaobjective-c4storeclient-library.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEIBRns7cSp7ImA9WhdQGE8.&quot;"><id>tag:blogger.com,1999:blog-4629086917523851821.post-4134870051030685790</id><published>2011-08-20T15:25:00.005+09:00</published><updated>2011-08-20T15:42:37.509+09:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-08-20T15:42:37.509+09:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Cocoa" /><title>Cocoa / nsAlert setAccessoryView:でJOptionPane.showInputDialog(Java)っぽいこと</title><content type="html">&lt;blockquote class=myInsert&gt;&lt;pre&gt;
&lt;br /&gt;    NSTextField *textField= [[NSTextField alloc] initWithFrame:NSMakeRect(0, 0, 100, 20)];
&lt;br /&gt;    
&lt;br /&gt;    NSAlert *alert = [[NSAlert alloc] init];
&lt;br /&gt;    [alert setMessageText:@"Message text"];
&lt;br /&gt;    [alert setInformativeText:@"Informative text"];
&lt;br /&gt;    [alert setAccessoryView:textField];
&lt;br /&gt;    [alert runModal];
&lt;br /&gt;    
&lt;br /&gt;    NSLog(@"DONE: %@", [textField stringValue]);
&lt;br /&gt;
&lt;br /&gt;    [textField release];
&lt;br /&gt;    [alert release];
&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;
&lt;br /&gt;
&lt;br /&gt;IBにてCustomViewにNSFormくっつけてaccessoryViewを用意する方がカッコイイかも．
&lt;br /&gt;（NSFormの入力フィールドにBindingするときはForm CellのValueになるように．）&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4629086917523851821-4134870051030685790?l=edotprintstacktrace.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/B4j1u_3lNnwF_56zA_Z7tG5J9ko/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/B4j1u_3lNnwF_56zA_Z7tG5J9ko/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/B4j1u_3lNnwF_56zA_Z7tG5J9ko/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/B4j1u_3lNnwF_56zA_Z7tG5J9ko/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/KsjdY/~4/qqyGokDob1E" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://edotprintstacktrace.blogspot.com/feeds/4134870051030685790/comments/default" title="コメントの投稿" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=4629086917523851821&amp;postID=4134870051030685790" title="0 件のコメント" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4629086917523851821/posts/default/4134870051030685790?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4629086917523851821/posts/default/4134870051030685790?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/KsjdY/~3/qqyGokDob1E/cocoa-setaccessoryviewjoptionpaneshowin.html" title="Cocoa / nsAlert setAccessoryView:でJOptionPane.showInputDialog(Java)っぽいこと" /><author><name>p_g_</name><uri>http://www.blogger.com/profile/15389208108068935129</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://4.bp.blogspot.com/_BA-iUzxIQks/SfAmPKs5kxI/AAAAAAAAAEw/ie6H2TZGF-M/S220/_____1.png" /></author><thr:total>0</thr:total><feedburner:origLink>http://edotprintstacktrace.blogspot.com/2011/08/cocoa-setaccessoryviewjoptionpaneshowin.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEEGQ348eip7ImA9WhdQF0o.&quot;"><id>tag:blogger.com,1999:blog-4629086917523851821.post-1541047657376231893</id><published>2011-08-20T01:11:00.010+09:00</published><updated>2011-08-20T01:50:22.072+09:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-08-20T01:50:22.072+09:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Quartz Composer" /><category scheme="http://www.blogger.com/atom/ns#" term="Cocoa" /><category scheme="http://www.blogger.com/atom/ns#" term="Automator" /><title>Quartz Composer / Automator / AutomatorのパッチでQCRender関連のナンカを実装してみた</title><content type="html">&lt;blockquote class=myInsert&gt;&lt;span style="font-weight:bold;"&gt;動機&lt;/span&gt;
&lt;br /&gt;&lt;a href="https://sites.google.com/site/pgtwitter/twclient#am"&gt;これ&lt;/a&gt;をやったので&lt;a href="http://edotprintstacktrace.blogspot.com/2011/07/quartz-composer-qcrenderercomposite.html"&gt;これ&lt;/a&gt;的なQCRenderネタをやってみようかと安易に思った（'Quartz コンポジションフィルタをイメージに適用'ってパッチが既にありますが）．&lt;/blockquote&gt;
&lt;br /&gt;
&lt;br /&gt;&lt;blockquote class=myInsert&gt;&lt;span style="font-weight:bold;"&gt;やってみた&lt;/span&gt;
&lt;br /&gt;&lt;blockquote class=myInsert2&gt;&lt;span style="font-weight:bold;"&gt;０．プロジェクトの作成&lt;/span&gt;
&lt;br /&gt;&lt;a href="http://edotprintstacktrace.blogspot.com/2011/08/xcode41automatorplugin-projectcocoa.html"&gt;プロジェクトの修正等はこちらを参照下さい&lt;/a&gt;．
&lt;br /&gt;xibのFile's Ownerのクラスも上記と同じクラス名で修正する（&lt;a href="http://edotprintstacktrace.blogspot.com/2011/08/quartz-composer-settings-view.html"&gt;こちら&lt;/a&gt;の3.xibを編集を参照のこと）．
&lt;br /&gt;OpenGLとQuartzのframeworkを追加した．&lt;/blockquote&gt;
&lt;br /&gt;
&lt;br /&gt;&lt;blockquote class=myInsert2&gt;&lt;span style="font-weight:bold;"&gt;１．コード&lt;/span&gt;
&lt;br /&gt;&lt;blockquote class=myInsert3&gt;&lt;pre&gt;
&lt;br /&gt;#import &amp;lt;Automator/AMBundleAction.h&gt;
&lt;br /&gt;#import &amp;lt;Quartz/Quartz.h&gt;
&lt;br /&gt;
&lt;br /&gt;@interface QuartzComposer : AMBundleAction
&lt;br /&gt;
&lt;br /&gt;- (id)runWithInput:(id)input fromAction:(AMAction *)anAction error:(NSDictionary **)errorInfo;
&lt;br /&gt;
&lt;br /&gt;- (IBAction)openQTZ:(id)sender;
&lt;br /&gt;
&lt;br /&gt;@end
&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;
&lt;br /&gt;
&lt;br /&gt;&lt;blockquote class=myInsert3&gt;&lt;pre&gt;
&lt;br /&gt;#import "QuartzComposer.h"
&lt;br /&gt;
&lt;br /&gt;@implementation QuartzComposer
&lt;br /&gt;- (IBAction)openQTZ:(id)sender
&lt;br /&gt;{
&lt;br /&gt;	NSString *compositionPath= [&lt;span style="font-weight:bold;color:red;"&gt;[NSBundle bundleForClass:[self class]]&lt;/span&gt; pathForResource:@"composition" ofType:@"qtz"];
&lt;br /&gt;    [[NSWorkspace sharedWorkspace] openFile:compositionPath withApplication:@"Quartz Composer"];
&lt;br /&gt;}
&lt;br /&gt;
&lt;br /&gt;- (id)runWithInput:(id)input fromAction:(AMAction *)anAction error:(NSDictionary **)errorInfo
&lt;br /&gt;{
&lt;br /&gt;	NSUInteger width= 16;
&lt;br /&gt;	NSUInteger height= 16;
&lt;br /&gt;	NSString *compositionPath= [[NSBundle bundleForClass:[self class]] pathForResource:@"composition" ofType:@"qtz"];
&lt;br /&gt;
&lt;br /&gt;    QCRenderer *renderer= nil;
&lt;br /&gt;    {
&lt;br /&gt;        NSOpenGLPixelFormatAttribute    attributes[]= {
&lt;br /&gt;            NSOpenGLPFAPixelBuffer,
&lt;br /&gt;            NSOpenGLPFANoRecovery,
&lt;br /&gt;            NSOpenGLPFAAccelerated,
&lt;br /&gt;            NSOpenGLPFADepthSize,		(NSOpenGLPixelFormatAttribute)24,
&lt;br /&gt;            NSOpenGLPFASampleBuffers,	(NSOpenGLPixelFormatAttribute)1,
&lt;br /&gt;            NSOpenGLPFASamples,			(NSOpenGLPixelFormatAttribute)16,
&lt;br /&gt;            (NSOpenGLPixelFormatAttribute)0
&lt;br /&gt;        };
&lt;br /&gt;        NSOpenGLPixelFormat *format= [[[NSOpenGLPixelFormat alloc] initWithAttributes:attributes] autorelease];
&lt;br /&gt;        NSOpenGLPixelBuffer *pixelBuffer= [[NSOpenGLPixelBuffer alloc] initWithTextureTarget:GL_TEXTURE_RECTANGLE_EXT
&lt;br /&gt;                                                                       textureInternalFormat:GL_RGBA
&lt;br /&gt;                                                                       textureMaxMipMapLevel:0
&lt;br /&gt;                                                                                  pixelsWide:width
&lt;br /&gt;                                                                                  pixelsHigh:height];
&lt;br /&gt;        
&lt;br /&gt;        NSOpenGLContext *openGLContext= [[NSOpenGLContext alloc] initWithFormat:format shareContext:nil];
&lt;br /&gt;        if(pixelBuffer == nil || openGLContext == nil) {
&lt;br /&gt;            NSLog(@"no buffer or no context");
&lt;br /&gt;            return nil;
&lt;br /&gt;        }
&lt;br /&gt;        
&lt;br /&gt;        [openGLContext setPixelBuffer:pixelBuffer
&lt;br /&gt;                          cubeMapFace:0
&lt;br /&gt;                          mipMapLevel:0
&lt;br /&gt;                 currentVirtualScreen:[openGLContext currentVirtualScreen]];
&lt;br /&gt;        
&lt;br /&gt;        renderer= [[QCRenderer alloc] initWithOpenGLContext:openGLContext pixelFormat:format file:compositionPath];
&lt;br /&gt;    }
&lt;br /&gt;    
&lt;br /&gt;    NSMutableArray *outputPaths= [NSMutableArray array];
&lt;br /&gt;	if(renderer) {
&lt;br /&gt;        NSMutableArray *inputPaths= [NSMutableArray array];
&lt;br /&gt;        if ([input isKindOfClass:[NSArray class]]) {
&lt;br /&gt;            [inputPaths addObjectsFromArray:input];
&lt;br /&gt;        }
&lt;br /&gt;        else if ([input isKindOfClass:[NSString class]]) {
&lt;br /&gt;            [inputPaths addObject:input];
&lt;br /&gt;        }
&lt;br /&gt;        int i;
&lt;br /&gt;        for(i=0;i&amp;lt;[inputPaths count];i++) {
&lt;br /&gt;            NSString *inputPath= [inputPaths objectAtIndex:i];
&lt;br /&gt;            NSImage *inputImage= [[[NSImage alloc] initWithContentsOfFile:inputPath] autorelease];
&lt;br /&gt;            [renderer setValue:inputImage forInputKey:@"InputImage"];
&lt;br /&gt;            
&lt;br /&gt;            if(![renderer renderAtTime:0.0 arguments:nil]) {
&lt;br /&gt;                NSLog(@"no rendering");
&lt;br /&gt;                return nil;
&lt;br /&gt;            }
&lt;br /&gt;            [renderer createSnapshotImageOfType:@"NSBitmapImageRep"];
&lt;br /&gt;            
&lt;br /&gt;            NSImage *image= (NSImage *)[renderer valueForOutputKey:@"OutputImage"];
&lt;br /&gt;            NSBitmapImageRep *bitmapImage= [NSBitmapImageRep imageRepWithData:[image TIFFRepresentation]];
&lt;br /&gt;            if(bitmapImage) {	
&lt;br /&gt;                &lt;span style="font-weight:bold; color:red;"&gt;char *tempNameBytes = tempnam([NSTemporaryDirectory() fileSystemRepresentation], "QCComposition_Result_");
&lt;br /&gt;                NSString *tempName = [[[NSString alloc] initWithBytesNoCopy:tempNameBytes
&lt;br /&gt;                                                                     length:strlen(tempNameBytes) 
&lt;br /&gt;                                                                   encoding:NSUTF8StringEncoding 
&lt;br /&gt;                                                               freeWhenDone:YES] autorelease];
&lt;br /&gt;                NSString *outputPath= [tempName stringByAppendingPathExtension:@"png"];&lt;/span&gt;
&lt;br /&gt;                
&lt;br /&gt;                NSDictionary *properties= [NSDictionary dictionaryWithObjectsAndKeys:
&lt;br /&gt;                                           [NSNumber numberWithFloat:1.0], NSImageCompressionFactor,
&lt;br /&gt;                                           nil];
&lt;br /&gt;                NSData *pngImageData= [bitmapImage representationUsingType:NSPNGFileType 
&lt;br /&gt;                                                                properties:properties];
&lt;br /&gt;
&lt;br /&gt;                [pngImageData writeToFile:outputPath
&lt;br /&gt;                               atomically:YES];
&lt;br /&gt;                [outputPaths addObject:outputPath];
&lt;br /&gt;            }
&lt;br /&gt;        }
&lt;br /&gt;	}
&lt;br /&gt;    else {
&lt;br /&gt;        NSLog(@"no render");
&lt;br /&gt;    }
&lt;br /&gt;	
&lt;br /&gt;	return outputPaths;
&lt;br /&gt;}
&lt;br /&gt;
&lt;br /&gt;@end
&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;
&lt;br /&gt;&lt;/blockquote&gt;
&lt;br /&gt;&lt;blockquote class=myInsert2&gt;&lt;span style="font-weight:bold;"&gt;２．composition.qtzを作成する&lt;/span&gt;
&lt;br /&gt;Quartz Composerで作成する．この際にInputImageというPublished InputとOutputImageというPublished Outputを用意する．
&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/-hvTOQ2dvI_A/Tk6PzPQtrwI/AAAAAAAAAqg/g8NkGojCbLc/s1600/%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25B3%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%2583%25E3%2583%2588%2B2011-08-20%2B1.30.39.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 241px;" src="http://2.bp.blogspot.com/-hvTOQ2dvI_A/Tk6PzPQtrwI/AAAAAAAAAqg/g8NkGojCbLc/s320/%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25B3%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%2583%25E3%2583%2588%2B2011-08-20%2B1.30.39.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5642605493574545154" /&gt;&lt;/a&gt;
&lt;br /&gt;&lt;/blockquote&gt;
&lt;br /&gt;&lt;blockquote class=myInsert2&gt;&lt;span style="font-weight:bold;"&gt;３．Supporting Files(リソース)にコンポジション(composition.qtz)を加える&lt;/span&gt;
&lt;br /&gt;Build PhasesのCopy Bundle Resourcesに含まれていること．
&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/-bygNJPEuzMA/Tk6QACEgPfI/AAAAAAAAAqo/PNLKVJzz0og/s1600/%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25B3%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%2583%25E3%2583%2588%2B2011-08-20%2B1.20.19.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 150px;" src="http://1.bp.blogspot.com/-bygNJPEuzMA/Tk6QACEgPfI/AAAAAAAAAqo/PNLKVJzz0og/s320/%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25B3%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%2583%25E3%2583%2588%2B2011-08-20%2B1.20.19.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5642605713371971058" /&gt;&lt;/a&gt;
&lt;br /&gt;&lt;/blockquote&gt;
&lt;br /&gt;&lt;blockquote class=myInsert2&gt;&lt;span style="font-weight:bold;"&gt;４．Viewまわり&lt;/span&gt;
&lt;br /&gt;xlbにボタンを配置して(IBAction)openQTZ:に繋ぐ．
&lt;br /&gt;&lt;/blockquote&gt;
&lt;br /&gt;
&lt;br /&gt;あとはBuildして配置(~/Library/Automator/下)．
&lt;br /&gt;&lt;/blockquote&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;&lt;blockquote class=myInsert&gt;&lt;span style="font-weight:bold;"&gt;結果&lt;/span&gt;
&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/-rT9n8PVQx5E/Tk6PhuiPycI/AAAAAAAAAqY/ghXnxG0C03U/s1600/%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25B3%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%2583%25E3%2583%2588%2B2011-08-20%2B1.28.16.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 269px;" src="http://2.bp.blogspot.com/-rT9n8PVQx5E/Tk6PhuiPycI/AAAAAAAAAqY/ghXnxG0C03U/s320/%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25B3%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%2583%25E3%2583%2588%2B2011-08-20%2B1.28.16.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5642605192731937218" /&gt;&lt;/a&gt;
&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/-Ok22ZikxzRU/Tk6PhRyAcEI/AAAAAAAAAqQ/kOO4cgOsyuI/s1600/QCComposition_Result_kDGUGN.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 187px;" src="http://2.bp.blogspot.com/-Ok22ZikxzRU/Tk6PhRyAcEI/AAAAAAAAAqQ/kOO4cgOsyuI/s320/QCComposition_Result_kDGUGN.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5642605185013411906" /&gt;&lt;/a&gt;
&lt;br /&gt;Motion Blurなのでこんな感じ．
&lt;br /&gt;&lt;/blockquote&gt;
&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4629086917523851821-1541047657376231893?l=edotprintstacktrace.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/u836YHbUDAeagGP8Uus7bVOIg2E/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/u836YHbUDAeagGP8Uus7bVOIg2E/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/u836YHbUDAeagGP8Uus7bVOIg2E/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/u836YHbUDAeagGP8Uus7bVOIg2E/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/KsjdY/~4/sr64pAlg8R8" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://edotprintstacktrace.blogspot.com/feeds/1541047657376231893/comments/default" title="コメントの投稿" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=4629086917523851821&amp;postID=1541047657376231893" title="0 件のコメント" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4629086917523851821/posts/default/1541047657376231893?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4629086917523851821/posts/default/1541047657376231893?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/KsjdY/~3/sr64pAlg8R8/quartz-composer-automator.html" title="Quartz Composer / Automator / AutomatorのパッチでQCRender関連のナンカを実装してみた" /><author><name>p_g_</name><uri>http://www.blogger.com/profile/15389208108068935129</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://4.bp.blogspot.com/_BA-iUzxIQks/SfAmPKs5kxI/AAAAAAAAAEw/ie6H2TZGF-M/S220/_____1.png" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/-hvTOQ2dvI_A/Tk6PzPQtrwI/AAAAAAAAAqg/g8NkGojCbLc/s72-c/%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25B3%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%2583%25E3%2583%2588%2B2011-08-20%2B1.30.39.png" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://edotprintstacktrace.blogspot.com/2011/08/quartz-composer-automator.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkEBRHg8fyp7ImA9WhdQEk8.&quot;"><id>tag:blogger.com,1999:blog-4629086917523851821.post-7773691610249768676</id><published>2011-08-13T16:59:00.005+09:00</published><updated>2011-08-13T17:37:35.677+09:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-08-13T17:37:35.677+09:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Cocoa" /><category scheme="http://www.blogger.com/atom/ns#" term="Automator" /><title>Xcode4.1のAutomator Plugin ProjectをCocoaでつくる際のテンプレートの修正点</title><content type="html">&lt;blockquote class=myInsert&gt;&lt;span style="font-weight:bold;"&gt;Automator Plugin Projectを作成&lt;/span&gt;
&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/-QO-tRa1-P8I/TkYvJ6l_vGI/AAAAAAAAAqI/TEDF89KC2f0/s1600/%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25B3%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%2583%25E3%2583%2588%2B2011-08-13%2B16.56.48.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 217px;" src="http://3.bp.blogspot.com/-QO-tRa1-P8I/TkYvJ6l_vGI/AAAAAAAAAqI/TEDF89KC2f0/s320/%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25B3%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%2583%25E3%2583%2588%2B2011-08-13%2B16.56.48.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5640247430722075746" /&gt;&lt;/a&gt;
&lt;br /&gt;&lt;/blockquote&gt;
&lt;br /&gt;&lt;blockquote class=myInsert&gt;&lt;span style="font-weight:bold;"&gt;Cocoa の指定を確認&lt;/span&gt;
&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/-zEkDRyAiOiE/TkYvJkmqNFI/AAAAAAAAAqA/AN62wNHi_gs/s1600/%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25B3%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%2583%25E3%2583%2588%2B2011-08-13%2B16.56.58.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 218px;" src="http://1.bp.blogspot.com/-zEkDRyAiOiE/TkYvJkmqNFI/AAAAAAAAAqA/AN62wNHi_gs/s320/%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25B3%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%2583%25E3%2583%2588%2B2011-08-13%2B16.56.58.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5640247424819278930" /&gt;&lt;/a&gt;&lt;/blockquote&gt;
&lt;br /&gt;
&lt;br /&gt;&lt;blockquote class=myInsert&gt;&lt;span style="font-weight:bold;"&gt;プロジェクトの設定(Infoタブ)を確認&lt;/span&gt;
&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/-UOKqoknExe0/TkYvJk2o1BI/AAAAAAAAAp4/CLJb0NVzZLg/s1600/%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25B3%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%2583%25E3%2583%2588%2B2011-08-13%2B16.57.12.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 209px;" src="http://3.bp.blogspot.com/-UOKqoknExe0/TkYvJk2o1BI/AAAAAAAAAp4/CLJb0NVzZLg/s320/%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25B3%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%2583%25E3%2583%2588%2B2011-08-13%2B16.57.12.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5640247424886297618" /&gt;&lt;/a&gt;
&lt;br /&gt;Principal classがAMShellScriptActionになぜかなってる．
&lt;br /&gt;このまま作成し配置. AMで利用すると実行時に"launch path not accessible"って言われて終了しちゃう．
&lt;br /&gt;&lt;/blockquote&gt;
&lt;br /&gt;
&lt;br /&gt;&lt;blockquote class=myInsert&gt;&lt;span style="font-weight:bold;"&gt;修正&lt;/span&gt;
&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/-5lHOyFIVkhk/TkYvJWZcBPI/AAAAAAAAApw/_-9n7qgsNAg/s1600/%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25B3%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%2583%25E3%2583%2588%2B2011-08-13%2B16.57.24.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 209px;" src="http://2.bp.blogspot.com/-5lHOyFIVkhk/TkYvJWZcBPI/AAAAAAAAApw/_-9n7qgsNAg/s320/%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25B3%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%2583%25E3%2583%2588%2B2011-08-13%2B16.57.24.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5640247421005726962" /&gt;&lt;/a&gt;
&lt;br /&gt;プロジェクト作成でできるObjective-C class("- (id)runWithInput:(id)input fromAction:(AMAction *)anAction error:(NSDictionary **)errorInfo"の実装を書くオブジェクト．AMBundleActionの派生)名（テンプレートではファイル名と同じ）に修正．&lt;/blockquote&gt;
&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4629086917523851821-7773691610249768676?l=edotprintstacktrace.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/Nmflx-4HxxcOH0_osZ-1KuyAQ1Q/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Nmflx-4HxxcOH0_osZ-1KuyAQ1Q/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/Nmflx-4HxxcOH0_osZ-1KuyAQ1Q/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Nmflx-4HxxcOH0_osZ-1KuyAQ1Q/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/KsjdY/~4/678EatsjL3E" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://edotprintstacktrace.blogspot.com/feeds/7773691610249768676/comments/default" title="コメントの投稿" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=4629086917523851821&amp;postID=7773691610249768676" title="0 件のコメント" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4629086917523851821/posts/default/7773691610249768676?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4629086917523851821/posts/default/7773691610249768676?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/KsjdY/~3/678EatsjL3E/xcode41automatorplugin-projectcocoa.html" title="Xcode4.1のAutomator Plugin ProjectをCocoaでつくる際のテンプレートの修正点" /><author><name>p_g_</name><uri>http://www.blogger.com/profile/15389208108068935129</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://4.bp.blogspot.com/_BA-iUzxIQks/SfAmPKs5kxI/AAAAAAAAAEw/ie6H2TZGF-M/S220/_____1.png" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/-QO-tRa1-P8I/TkYvJ6l_vGI/AAAAAAAAAqI/TEDF89KC2f0/s72-c/%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25B3%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%2583%25E3%2583%2588%2B2011-08-13%2B16.56.48.png" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://edotprintstacktrace.blogspot.com/2011/08/xcode41automatorplugin-projectcocoa.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkEBQH05fSp7ImA9WhdQEE8.&quot;"><id>tag:blogger.com,1999:blog-4629086917523851821.post-845780887676777004</id><published>2011-08-09T21:45:00.020+09:00</published><updated>2011-08-11T08:57:31.325+09:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-08-11T08:57:31.325+09:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="OAuthConsumer.framework" /><category scheme="http://www.blogger.com/atom/ns#" term="Cocoa" /><title>OAuthConsumer.frameworkを使う(TwitterへPOST)</title><content type="html">&lt;blockquote class=myInsert&gt;&lt;span style="font-weight:bold;"&gt;動機&lt;/span&gt;
&lt;br /&gt;&lt;a href="http://edotprintstacktrace.blogspot.com/2011/08/oauthconsumerframework.html"&gt;前回&lt;/a&gt;の物を使ってみるため，あちらこちらのサンプルを継ぎ接ぎして（&lt;a href="http://code.google.com/p/oauthconsumer/wiki/UsingOAuthConsumer"&gt;例えば&lt;/a&gt;）以下の様にしたら動いた．．
&lt;br /&gt;&lt;/blockquote&gt;
&lt;br /&gt;&lt;blockquote class=myInsert&gt;やってみた．
&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;フレームワークの追加&lt;/span&gt;
&lt;br /&gt;&lt;blockquote class=myInsert2&gt;
&lt;br /&gt;~/Library/Frameworks/のOAuthConsumer.frameworkを追加
&lt;br /&gt;&lt;del&gt;/System/Library/Framewokrs/のSecurity.frameworkを追加&lt;/del&gt;
&lt;br /&gt;&lt;/blockquote&gt;
&lt;br /&gt;
&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;フレームワークの利用のためのHeader&lt;/span&gt;
&lt;br /&gt;&lt;blockquote class=myInsert2&gt;&lt;pre&gt;&lt;tt&gt;
&lt;br /&gt;#import &amp;lt;OAuthConsumer/OAuthConsumer.h&gt;
&lt;br /&gt;&lt;/tt&gt;&lt;/pre&gt;&lt;/blockquote&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;インスタンス変数&lt;/span&gt;
&lt;br /&gt;&lt;blockquote class=myInsert2&gt;&lt;pre&gt;&lt;tt&gt;
&lt;br /&gt;    OAConsumer *consumer;
&lt;br /&gt;    OAToken *accessToken;
&lt;br /&gt;&lt;/tt&gt;&lt;/pre&gt;&lt;/blockquote&gt;
&lt;br /&gt;
&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;インスタンス変数の初期化&lt;/span&gt;
&lt;br /&gt;&lt;blockquote class=myInsert2&gt;&lt;pre&gt;&lt;tt&gt;
&lt;br /&gt;        consumer = [[OAConsumer alloc] initWithKey:@"[Consumer Key]"
&lt;br /&gt;                                            secret:@"[Consumer Secret Key]"];
&lt;br /&gt;        accessToken= nil;
&lt;br /&gt;&lt;/tt&gt;&lt;/pre&gt;&lt;/blockquote&gt;
&lt;br /&gt;Consumer Key/Consumer Secret KeyはTwitterの開発者サイトで登録し取得する．
&lt;br /&gt;
&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;ConsumerKey/ConsumerSecretKeyからRequestTokenを取得へ&lt;/span&gt;
&lt;br /&gt;&lt;blockquote class=myInsert2&gt;&lt;pre&gt;&lt;tt&gt;
&lt;br /&gt;- (void)requestRequestToken
&lt;br /&gt;{    
&lt;br /&gt;    NSURL *url = [NSURL URLWithString:@"https://api.twitter.com/oauth/request_token"];
&lt;br /&gt;    
&lt;br /&gt;    OAMutableURLRequest *request = [[OAMutableURLRequest alloc] initWithURL:url
&lt;br /&gt;                                                                   consumer:consumer
&lt;br /&gt;                                                                      token:nil
&lt;br /&gt;                                                                      realm:nil
&lt;br /&gt;                                                          signatureProvider:nil]; 
&lt;br /&gt;    
&lt;br /&gt;    [request setHTTPMethod:@"POST"];
&lt;br /&gt;    
&lt;br /&gt;    OADataFetcher *fetcher = [[[OADataFetcher alloc] init] autorelease];
&lt;br /&gt;    
&lt;br /&gt;    [fetcher fetchDataWithRequest:request
&lt;br /&gt;                         delegate:self
&lt;br /&gt;                didFinishSelector:@selector(requestTokenTicket:didFinishWithData:)
&lt;br /&gt;                  didFailSelector:@selector(requestTokenTicket:didFailWithError:)];
&lt;br /&gt;}
&lt;br /&gt;- (void)requestTokenTicket:(OAServiceTicket *)ticket 
&lt;br /&gt;         didFinishWithData:(NSData *)data 
&lt;br /&gt;{
&lt;br /&gt;    if (ticket.didSucceed) {
&lt;br /&gt;      …
&lt;br /&gt;    }
&lt;br /&gt;}
&lt;br /&gt;- (void)requestTokenTicket:(OAServiceTicket *)ticket 
&lt;br /&gt;          didFailWithError:(NSError *)error
&lt;br /&gt;{
&lt;br /&gt;    NSLog(@"%@", error);
&lt;br /&gt;}
&lt;br /&gt;&lt;/tt&gt;&lt;/pre&gt;&lt;/blockquote&gt;
&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;RequestTokenから認証のWebページ(PIN)の取得へ&lt;/span&gt;
&lt;br /&gt;&lt;blockquote class=myInsert2&gt;&lt;pre&gt;&lt;tt&gt;
&lt;br /&gt;- (void)requestTokenTicket:(OAServiceTicket *)ticket 
&lt;br /&gt;         didFinishWithData:(NSData *)data 
&lt;br /&gt;{
&lt;br /&gt;    if (ticket.didSucceed) {
&lt;br /&gt;        OAMutableURLRequest *request;
&lt;br /&gt;        NSString *responseBody = [[NSString alloc] initWithData:data
&lt;br /&gt;                                                       encoding:NSUTF8StringEncoding];
&lt;br /&gt;        
&lt;br /&gt;        if (accessToken != nil) {
&lt;br /&gt;            [accessToken release];
&lt;br /&gt;            accessToken = nil;
&lt;br /&gt;        }
&lt;br /&gt;        
&lt;br /&gt;        accessToken = [[OAToken alloc] initWithHTTPResponseBody:responseBody];
&lt;br /&gt;        [responseBody release];
&lt;br /&gt;        
&lt;br /&gt;        NSURL *url = [NSURL URLWithString:@"https://api.twitter.com/oauth/authorize"];
&lt;br /&gt;        
&lt;br /&gt;        request = [[[OAMutableURLRequest alloc] initWithURL:url
&lt;br /&gt;                                                   consumer:consumer
&lt;br /&gt;                                                      token:accessToken
&lt;br /&gt;                                                      realm:nil
&lt;br /&gt;                                          signatureProvider:nil] autorelease];
&lt;br /&gt;        
&lt;br /&gt;        
&lt;br /&gt;        OARequestParameter *p0 = [[OARequestParameter alloc] initWithName:@"oauth_token"
&lt;br /&gt;                                                                    value:accessToken.key];
&lt;br /&gt;        NSArray *params = [NSArray arrayWithObject:p0];
&lt;br /&gt;        [request setParameters:params];
&lt;br /&gt;        
&lt;br /&gt;        [[NSWorkspace sharedWorkspace] openURL:[request URL]];
&lt;br /&gt;        
&lt;br /&gt;        [p0 release];
&lt;br /&gt;    }
&lt;br /&gt;    else {
&lt;br /&gt;        
&lt;br /&gt;    }
&lt;br /&gt;
&lt;br /&gt;}
&lt;br /&gt;&lt;/tt&gt;&lt;/pre&gt;&lt;/blockquote&gt;
&lt;br /&gt;
&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;(デフォルトブラウザでURLが開かれる．ここではTwitterサイトでの認証であり数字キー(PIN)が手に入る&lt;/span&gt;
&lt;br /&gt;
&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;PINからAccessTokenの取得へ&lt;/span&gt;
&lt;br /&gt;&lt;blockquote class=myInsert2&gt;&lt;pre&gt;&lt;tt&gt;
&lt;br /&gt;- (void)authorizationWithPin:(NSString *)pin
&lt;br /&gt;{
&lt;br /&gt;    OAMutableURLRequest *request;
&lt;br /&gt;    OADataFetcher *fetcher;
&lt;br /&gt;    
&lt;br /&gt;    NSURL *url = [NSURL URLWithString:@"https://api.twitter.com/oauth/access_token"];
&lt;br /&gt;    
&lt;br /&gt;    request = [[[OAMutableURLRequest alloc] initWithURL:url
&lt;br /&gt;                                               consumer:consumer
&lt;br /&gt;                                                  token:accessToken
&lt;br /&gt;                                                  realm:nil
&lt;br /&gt;                                      signatureProvider:nil] autorelease];
&lt;br /&gt;    
&lt;br /&gt;    
&lt;br /&gt;    OARequestParameter *p0 = [[OARequestParameter alloc] initWithName:@"oauth_token"
&lt;br /&gt;                                                                value:accessToken.key];
&lt;br /&gt;    OARequestParameter *p1 = [[OARequestParameter alloc] initWithName:@"oauth_verifier"
&lt;br /&gt;                                                                value:pin];
&lt;br /&gt;    NSArray *params = [NSArray arrayWithObjects:p0, p1, nil];
&lt;br /&gt;    [request setParameters:params];
&lt;br /&gt;    
&lt;br /&gt;    fetcher = [[[OADataFetcher alloc] init] autorelease];
&lt;br /&gt;    
&lt;br /&gt;    [fetcher fetchDataWithRequest:request
&lt;br /&gt;                         delegate:self
&lt;br /&gt;                didFinishSelector:@selector(accessTokenTicket:didFinishWithData:)
&lt;br /&gt;                  didFailSelector:@selector(accessTokenTicket:didFailWithError:)];
&lt;br /&gt;    
&lt;br /&gt;    [p0 release];
&lt;br /&gt;    [p1 release];
&lt;br /&gt;}
&lt;br /&gt;- (void)accessTokenTicket:(OAServiceTicket *)ticket 
&lt;br /&gt;        didFinishWithData:(NSData *)data 
&lt;br /&gt;{
&lt;br /&gt;    if (ticket.didSucceed) {        
&lt;br /&gt;    …
&lt;br /&gt;    }
&lt;br /&gt;}
&lt;br /&gt;- (void)accessTokenTicket:(OAServiceTicket *)ticket 
&lt;br /&gt;         didFailWithError:(NSError *)error
&lt;br /&gt;{
&lt;br /&gt;    NSLog(@"%@", error);
&lt;br /&gt;}
&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;
&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;accessTokenを生成してDefaultUserInfoへ保存&lt;/span&gt;
&lt;br /&gt;&lt;blockquote class=myInsert2&gt;&lt;pre&gt;&lt;tt&gt;
&lt;br /&gt;- (void)accessTokenTicket:(OAServiceTicket *)ticket 
&lt;br /&gt;        didFinishWithData:(NSData *)data 
&lt;br /&gt;{
&lt;br /&gt;    if (ticket.didSucceed) {        
&lt;br /&gt;        NSString *responseBody = [[NSString alloc] initWithData:data
&lt;br /&gt;                                                       encoding:NSUTF8StringEncoding];
&lt;br /&gt;        
&lt;br /&gt;        if (accessToken != nil) {
&lt;br /&gt;            [accessToken release];
&lt;br /&gt;            accessToken = nil;
&lt;br /&gt;        }
&lt;br /&gt;        
&lt;br /&gt;        accessToken = [[OAToken alloc] initWithHTTPResponseBody:responseBody];
&lt;br /&gt;        [responseBody release];
&lt;br /&gt;        
&lt;br /&gt;        [accessToken storeInUserDefaultsWithServiceProviderName:@"NAME"
&lt;br /&gt;                                                         prefix:@"KEY"];
&lt;br /&gt;        
&lt;br /&gt;    }
&lt;br /&gt;}
&lt;br /&gt;&lt;/tt&gt;&lt;/pre&gt;&lt;/blockquote&gt;
&lt;br /&gt;
&lt;br /&gt;（ちなみにDeaultUserInfoから取り出すときは
&lt;br /&gt;&lt;blockquote class=myInsert2&gt;&lt;pre&gt;
&lt;br /&gt;	accessToken= [[OAToken alloc] initWithUserDefaultsUsingServiceProviderName:@"NAME"
&lt;br /&gt;                                                                        prefix:@"KEY"];
&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;)
&lt;br /&gt;
&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;accessTokenを使ってPOSTしてみる&lt;/span&gt;
&lt;br /&gt;&lt;blockquote class=myInsert2&gt;&lt;pre&gt;
&lt;br /&gt;　NSString *message= @"Hello World!";
&lt;br /&gt;
&lt;br /&gt;    NSURL *url= [NSURL URLWithString:@"http://api.twitter.com/1/statuses/update.xml"];
&lt;br /&gt;    OAMutableURLRequest *requestWithBodyParams = [[[OAMutableURLRequest alloc] initWithURL:url
&lt;br /&gt;                                                                                 consumer:consumer
&lt;br /&gt;                                                                                    token:accessToken   
&lt;br /&gt;                                                                                    realm:nil   
&lt;br /&gt;                                                                        signatureProvider:nil] autorelease];
&lt;br /&gt;    NSString *encodedParameterPairs= [NSString stringWithFormat:@"status=%@", [message URLEncodedString]];
&lt;br /&gt;    NSData *requestData = [encodedParameterPairs dataUsingEncoding:NSASCIIStringEncoding 
&lt;br /&gt;                                              allowLossyConversion:YES];
&lt;br /&gt;    [requestWithBodyParams setHTTPBody:requestData];
&lt;br /&gt;    [requestWithBodyParams setValue:[NSString stringWithFormat:@"%d", [requestData length]] 
&lt;br /&gt;                 forHTTPHeaderField:@"Content-Length"];
&lt;br /&gt;    [requestWithBodyParams setValue:@"application/x-www-form-urlencoded"
&lt;br /&gt;                 forHTTPHeaderField:@"Content-Type"];    
&lt;br /&gt;    [requestWithBodyParams setHTTPMethod:@"POST"];
&lt;br /&gt;
&lt;br /&gt;    OADataFetcher *fetcher = [[[OADataFetcher alloc] init] autorelease];
&lt;br /&gt;
&lt;br /&gt;    [fetcher fetchDataWithRequest:requestWithBodyParams 
&lt;br /&gt;                         delegate:self
&lt;br /&gt;                didFinishSelector:@selector(apiTicket:didFinishWithData:)
&lt;br /&gt;                  didFailSelector:@selector(apiTicket:didFailWithError:)];
&lt;br /&gt;- (void)apiTicket:(OAServiceTicket *)ticket 
&lt;br /&gt;didFinishWithData:(NSData *)data 
&lt;br /&gt;{
&lt;br /&gt;    …
&lt;br /&gt;}
&lt;br /&gt;- (void)apiTicket:(OAServiceTicket *)ticket 
&lt;br /&gt; didFailWithError:(NSError *)error 
&lt;br /&gt;{
&lt;br /&gt;    NSLog(@"%@", error);
&lt;br /&gt;}
&lt;br /&gt;&lt;/tt&gt;&lt;/pre&gt;&lt;/blockquote&gt;
&lt;br /&gt;&lt;/blockquote&gt;
&lt;br /&gt;&lt;blockquote class=myInsert&gt;&lt;span style="font-weight:bold;"&gt;結果&lt;/span&gt;
&lt;br /&gt;&lt;a href="http://twitter.com/#!/p_g_/status/100810688833912833"&gt;http://twitter.com/#!/p_g_/status/100810688833912833&lt;/a&gt;
&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/-PkZPSLRy7wU/TkE0U92mB8I/AAAAAAAAApo/YA4fBGcLsTo/s1600/%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25B3%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%2583%25E3%2583%2588%2B2011-08-09%2B22.20.34.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 147px;" src="http://1.bp.blogspot.com/-PkZPSLRy7wU/TkE0U92mB8I/AAAAAAAAApo/YA4fBGcLsTo/s320/%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25B3%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%2583%25E3%2583%2588%2B2011-08-09%2B22.20.34.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5638845743250147266" /&gt;&lt;/a&gt;
&lt;br /&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4629086917523851821-845780887676777004?l=edotprintstacktrace.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/HXHqOve3Ruw0a4k86OCJjDcR1lc/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/HXHqOve3Ruw0a4k86OCJjDcR1lc/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/HXHqOve3Ruw0a4k86OCJjDcR1lc/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/HXHqOve3Ruw0a4k86OCJjDcR1lc/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/KsjdY/~4/_-C1gDAXTtU" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://edotprintstacktrace.blogspot.com/feeds/845780887676777004/comments/default" title="コメントの投稿" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=4629086917523851821&amp;postID=845780887676777004" title="0 件のコメント" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4629086917523851821/posts/default/845780887676777004?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4629086917523851821/posts/default/845780887676777004?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/KsjdY/~3/_-C1gDAXTtU/oauthconsumerframeworktwitterpost.html" title="OAuthConsumer.frameworkを使う(TwitterへPOST)" /><author><name>p_g_</name><uri>http://www.blogger.com/profile/15389208108068935129</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://4.bp.blogspot.com/_BA-iUzxIQks/SfAmPKs5kxI/AAAAAAAAAEw/ie6H2TZGF-M/S220/_____1.png" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/-PkZPSLRy7wU/TkE0U92mB8I/AAAAAAAAApo/YA4fBGcLsTo/s72-c/%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25B3%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%2583%25E3%2583%2588%2B2011-08-09%2B22.20.34.png" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://edotprintstacktrace.blogspot.com/2011/08/oauthconsumerframeworktwitterpost.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEQMRXs_eyp7ImA9WhdRGEQ.&quot;"><id>tag:blogger.com,1999:blog-4629086917523851821.post-6483674982769612994</id><published>2011-08-09T20:45:00.005+09:00</published><updated>2011-08-09T22:26:24.543+09:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-08-09T22:26:24.543+09:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="OAuthConsumer.framework" /><category scheme="http://www.blogger.com/atom/ns#" term="Cocoa" /><title>OAuthConsumer.frameworkを設置（インストール）してみる</title><content type="html">&lt;blockquote class=myInsert&gt;&lt;span style="font-weight:bold;"&gt;動機&lt;/span&gt;
&lt;br /&gt;OAuth周りのCocoaの実装である&lt;a href="http://code.google.com/p/oauthconsumer/"&gt;OAuthConsumer.framework&lt;/a&gt;というのを知ったのでインストールしてみる．
&lt;br /&gt;&lt;/blockquote&gt;
&lt;br /&gt;&lt;blockquote class=myInsert&gt;&lt;span style="font-weight:bold;"&gt;やってみた&lt;/span&gt;
&lt;br /&gt;&lt;blockquote class=myInsert2&gt;&lt;span style="font-weight:bold;"&gt;コンソールで以下を実行．obj-cフォルダが出来上がる．&lt;/span&gt;
&lt;br /&gt;&lt;blockquote class=myInsert3&gt;&gt; svn checkout http://oauth.googlecode.com/svn/code/obj-c&lt;/blockquote&gt;
&lt;br /&gt;&lt;/blockquote&gt;
&lt;br /&gt;
&lt;br /&gt;&lt;blockquote class=myInsert2&gt;&lt;span style="font-weight:bold;"&gt;checkoutしたフォルダ内の以下を開く(Xcode)．&lt;/span&gt;
&lt;br /&gt;&lt;blockquote class=myInsert3&gt;obj-c/OAuthConsumer/OAuthConsumer.xcodeproj &lt;/blockquote&gt;
&lt;br /&gt;&lt;/blockquote&gt;
&lt;br /&gt;
&lt;br /&gt;&lt;blockquote class=myInsert2&gt;&lt;span style="font-weight:bold;"&gt;コンパイル&lt;/span&gt;
&lt;br /&gt;Build for Running
&lt;br /&gt;&lt;/blockquote&gt;
&lt;br /&gt;
&lt;br /&gt;&lt;blockquote class=myInsert2&gt;&lt;span style="font-weight:bold;"&gt;OAuthConsumer.frameworkを確認&lt;/span&gt;
&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/-2sXW7mAnqt8/TkEgsQExdEI/AAAAAAAAApY/ubY54aMVaNQ/s1600/%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25B3%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%2583%25E3%2583%2588%2B2011-08-09%2B20.56.42.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 320px;" src="http://2.bp.blogspot.com/-2sXW7mAnqt8/TkEgsQExdEI/AAAAAAAAApY/ubY54aMVaNQ/s320/%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25B3%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%2583%25E3%2583%2588%2B2011-08-09%2B20.56.42.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5638824153045890114" /&gt;&lt;/a&gt;
&lt;br /&gt;Finderでの表示．
&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/-YzIn1J4N1Do/TkEg0tqXriI/AAAAAAAAApg/TlISStDddIc/s1600/%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25B3%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%2583%25E3%2583%2588%2B2011-08-09%2B20.53.26.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 109px;" src="http://1.bp.blogspot.com/-YzIn1J4N1Do/TkEg0tqXriI/AAAAAAAAApg/TlISStDddIc/s320/%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25B3%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%2583%25E3%2583%2588%2B2011-08-09%2B20.53.26.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5638824298427166242" /&gt;&lt;/a&gt;
&lt;br /&gt;&lt;/blockquote&gt;
&lt;br /&gt;
&lt;br /&gt;&lt;blockquote class=myInsert2&gt;&lt;span style="font-weight:bold;"&gt;インストール先をターミナルで開く&lt;/span&gt;
&lt;br /&gt;&lt;blockquote class=myInsert3&gt;&gt; mkdir -p ~/Library/Frameworks
&lt;br /&gt;&gt; open ~/Library/Frameworks/
&lt;br /&gt;&lt;/blockquote&gt;
&lt;br /&gt;&lt;/blockquote&gt;
&lt;br /&gt;
&lt;br /&gt;&lt;blockquote class=myInsert2&gt;&lt;span style="font-weight:bold;"&gt;OAuthConsumer.framework をドラッグして ~/Library/Frameworks/ へドロップ&lt;/span&gt;
&lt;br /&gt;&lt;/blockquote&gt;
&lt;br /&gt;&lt;/blockquote&gt;
&lt;br /&gt;
&lt;br /&gt;できた．&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4629086917523851821-6483674982769612994?l=edotprintstacktrace.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/QlbJBdnojfI9mENVSrYBOayUI-U/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/QlbJBdnojfI9mENVSrYBOayUI-U/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/QlbJBdnojfI9mENVSrYBOayUI-U/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/QlbJBdnojfI9mENVSrYBOayUI-U/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/KsjdY/~4/eUwd_Ke94LM" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://edotprintstacktrace.blogspot.com/feeds/6483674982769612994/comments/default" title="コメントの投稿" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=4629086917523851821&amp;postID=6483674982769612994" title="0 件のコメント" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4629086917523851821/posts/default/6483674982769612994?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4629086917523851821/posts/default/6483674982769612994?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/KsjdY/~3/eUwd_Ke94LM/oauthconsumerframework.html" title="OAuthConsumer.frameworkを設置（インストール）してみる" /><author><name>p_g_</name><uri>http://www.blogger.com/profile/15389208108068935129</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://4.bp.blogspot.com/_BA-iUzxIQks/SfAmPKs5kxI/AAAAAAAAAEw/ie6H2TZGF-M/S220/_____1.png" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/-2sXW7mAnqt8/TkEgsQExdEI/AAAAAAAAApY/ubY54aMVaNQ/s72-c/%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25B3%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%2583%25E3%2583%2588%2B2011-08-09%2B20.56.42.png" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://edotprintstacktrace.blogspot.com/2011/08/oauthconsumerframework.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUMGQ306fyp7ImA9WhdRGUk.&quot;"><id>tag:blogger.com,1999:blog-4629086917523851821.post-6299303315210541345</id><published>2011-08-09T19:23:00.013+09:00</published><updated>2011-08-10T11:30:22.317+09:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-08-10T11:30:22.317+09:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Quartz Composer" /><title>Quartz Composer / Settings の Viewをプロジェクトに追加する方法のメモ</title><content type="html">&lt;blockquote class=myInsert&gt;&lt;span style="font-weight:bold;"&gt;動機&lt;/span&gt;
&lt;br /&gt;しばらく前からXcodeのプロジェクトテンプレートにQuartz Composer Plug-in(Patch) プロジェクト 「Settings View有り」が選べなくなってた．未来の自分の為に追加の仕方（正しいかわからないが）をまとめておく（既にどこかにある?）．&lt;/blockquote&gt;
&lt;br /&gt;
&lt;br /&gt;&lt;blockquote class=myInsert&gt;&lt;span style="font-weight:bold;"&gt;やってみた&lt;/span&gt;
&lt;br /&gt;&lt;blockquote class=myInsert2&gt;&lt;span style="font-weight:bold;"&gt;１．プロジェクトを作る．&lt;/span&gt;
&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/-h7cupuDLj84/TkEM3M-nYaI/AAAAAAAAAoQ/vLIUVAXSOIE/s1600/%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25B3%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%2583%25E3%2583%2588%2B2011-08-09%2B19.05.51.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 216px;" src="http://3.bp.blogspot.com/-h7cupuDLj84/TkEM3M-nYaI/AAAAAAAAAoQ/vLIUVAXSOIE/s320/%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25B3%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%2583%25E3%2583%2588%2B2011-08-09%2B19.05.51.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5638802350960763298" /&gt;&lt;/a&gt;
&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/-VDcOTuT8qR0/TkEM3MtrnnI/AAAAAAAAAoI/V8j17QQThxE/s1600/%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25B3%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%2583%25E3%2583%2588%2B2011-08-09%2B19.06.22.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 218px;" src="http://3.bp.blogspot.com/-VDcOTuT8qR0/TkEM3MtrnnI/AAAAAAAAAoI/V8j17QQThxE/s320/%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25B3%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%2583%25E3%2583%2588%2B2011-08-09%2B19.06.22.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5638802350889737842" /&gt;&lt;/a&gt;
&lt;br /&gt;名前をSettngViewDemoとした（Settingsだったね…。）．
&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/-U38z84SJfgc/TkEM2w-FLdI/AAAAAAAAAoA/EpP-KrFhe-M/s1600/%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25B3%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%2583%25E3%2583%2588%2B2011-08-09%2B19.06.56.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 265px; height: 253px;" src="http://4.bp.blogspot.com/-U38z84SJfgc/TkEM2w-FLdI/AAAAAAAAAoA/EpP-KrFhe-M/s320/%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25B3%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%2583%25E3%2583%2588%2B2011-08-09%2B19.06.56.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5638802343442329042" /&gt;&lt;/a&gt;
&lt;br /&gt;xibはない．
&lt;br /&gt;&lt;/blockquote&gt;
&lt;br /&gt;
&lt;br /&gt;&lt;blockquote class=myInsert2&gt;&lt;span style="font-weight:bold;"&gt;２．xibを追加&lt;/span&gt;
&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/-aYPRB4alBJU/TkENLd-D_yI/AAAAAAAAAoY/V1a6iQ839lI/s1600/%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25B3%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%2583%25E3%2583%2588%2B2011-08-09%2B19.09.53.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 254px;" src="http://4.bp.blogspot.com/-aYPRB4alBJU/TkENLd-D_yI/AAAAAAAAAoY/V1a6iQ839lI/s320/%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25B3%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%2583%25E3%2583%2588%2B2011-08-09%2B19.09.53.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5638802699119230754" /&gt;&lt;/a&gt;
&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/-ZBvgCCI-j8c/TkENi4RJpDI/AAAAAAAAAoo/IuEqonILUIs/s1600/%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25B3%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%2583%25E3%2583%2588%2B2011-08-09%2B19.10.12.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 217px;" src="http://4.bp.blogspot.com/-ZBvgCCI-j8c/TkENi4RJpDI/AAAAAAAAAoo/IuEqonILUIs/s320/%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25B3%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%2583%25E3%2583%2588%2B2011-08-09%2B19.10.12.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5638803101315605554" /&gt;&lt;/a&gt;
&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/-m6BsLk6XdkQ/TkENi2OQHrI/AAAAAAAAAog/TUg3xGfeUUQ/s1600/%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25B3%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%2583%25E3%2583%2588%2B2011-08-09%2B19.10.35.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 232px;" src="http://3.bp.blogspot.com/-m6BsLk6XdkQ/TkENi2OQHrI/AAAAAAAAAog/TUg3xGfeUUQ/s320/%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25B3%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%2583%25E3%2583%2588%2B2011-08-09%2B19.10.35.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5638803100766576306" /&gt;&lt;/a&gt;
&lt;br /&gt;名前をSettingとした（Settingsだったね…。）．
&lt;br /&gt;&lt;/blockquote&gt;
&lt;br /&gt;
&lt;br /&gt;&lt;blockquote class=myInsert2&gt;&lt;span style="font-weight:bold;"&gt;３．xibを編集&lt;/span&gt;
&lt;br /&gt;File's OwnerのClassを変更("QCPlugInViewController")
&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/-e6fc4lHIHK0/TkEOviAhZcI/AAAAAAAAAow/0uHEPZXG5rY/s1600/%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25B3%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%2583%25E3%2583%2588%2B2011-08-09%2B19.13.12.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 177px;" src="http://3.bp.blogspot.com/-e6fc4lHIHK0/TkEOviAhZcI/AAAAAAAAAow/0uHEPZXG5rY/s320/%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25B3%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%2583%25E3%2583%2588%2B2011-08-09%2B19.13.12.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5638804418190206402" /&gt;&lt;/a&gt;
&lt;br /&gt;
&lt;br /&gt;とりあえず確認用にButtonを置いてみた．
&lt;br /&gt;
&lt;br /&gt;File's OwnerからCustom Viewを繋いで…
&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/-GJdXT0tV5bY/TkEQ2NWQ9iI/AAAAAAAAApI/hDgl_GtAVaU/s1600/%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25B3%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%2583%25E3%2583%2588%2B2011-08-09%2B19.47.39.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 158px;" src="http://4.bp.blogspot.com/-GJdXT0tV5bY/TkEQ2NWQ9iI/AAAAAAAAApI/hDgl_GtAVaU/s320/%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25B3%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%2583%25E3%2583%2588%2B2011-08-09%2B19.47.39.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5638806731926599202" /&gt;&lt;/a&gt;
&lt;br /&gt;
&lt;br /&gt;(File's Ownerの)view OutletへCustom Viewを接続．
&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/-qXnPh44YZ7o/TkEQ2CQWsYI/AAAAAAAAApA/_o5k7ZKNgw0/s1600/%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25B3%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%2583%25E3%2583%2588%2B2011-08-09%2B19.47.52.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 154px;" src="http://2.bp.blogspot.com/-qXnPh44YZ7o/TkEQ2CQWsYI/AAAAAAAAApA/_o5k7ZKNgw0/s320/%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25B3%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%2583%25E3%2583%2588%2B2011-08-09%2B19.47.52.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5638806728949019010" /&gt;&lt;/a&gt;
&lt;br /&gt;
&lt;br /&gt;確認．
&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/-CIez9cJMy4M/TkEQ15jxECI/AAAAAAAAAo4/Nw1bKPsogKY/s1600/%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25B3%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%2583%25E3%2583%2588%2B2011-08-09%2B19.46.56.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 162px;" src="http://4.bp.blogspot.com/-CIez9cJMy4M/TkEQ15jxECI/AAAAAAAAAo4/Nw1bKPsogKY/s320/%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25B3%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%2583%25E3%2583%2588%2B2011-08-09%2B19.46.56.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5638806726614519842" /&gt;&lt;/a&gt;
&lt;br /&gt;&lt;/blockquote&gt;
&lt;br /&gt;
&lt;br /&gt;&lt;blockquote class=myInsert2&gt;&lt;span style="font-weight:bold;"&gt;４．コードに追加&lt;/span&gt;
&lt;br /&gt;&lt;blockquote class=myInsert3&gt;&lt;pre&gt;@implementation SettingViewDemoPlugIn
&lt;br /&gt;…
&lt;br /&gt;- (QCPlugInViewController*) createViewController
&lt;br /&gt;{
&lt;br /&gt;    return [[QCPlugInViewController alloc] initWithPlugIn:self
&lt;br /&gt;                                              viewNibName:&lt;span style="font-weight:bold;color:red;"&gt;@"Setting"&lt;/span&gt;];
&lt;br /&gt;}
&lt;br /&gt;…
&lt;br /&gt;@end&lt;/pre&gt;&lt;/blockquote&gt;
&lt;br /&gt;Settingはxibのファイル名
&lt;br /&gt;&lt;/blockquote&gt;
&lt;br /&gt;&lt;blockquote class=myInsert2&gt;&lt;span style="font-weight:bold;"&gt;５．コンパイル/インストール&lt;/span&gt;
&lt;br /&gt;Build for Running
&lt;br /&gt;&lt;/blockquote&gt;
&lt;br /&gt;&lt;/blockquote&gt;
&lt;br /&gt;
&lt;br /&gt;&lt;blockquote class=myInsert2&gt;&lt;span style="font-weight:bold;"&gt;確認&lt;/span&gt;
&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/-JmIfTGuaHRw/TkES_vDbCiI/AAAAAAAAApQ/vyv_jou_i-k/s1600/%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25B3%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%2583%25E3%2583%2588%2B2011-08-09%2B19.54.24.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 239px;" src="http://1.bp.blogspot.com/-JmIfTGuaHRw/TkES_vDbCiI/AAAAAAAAApQ/vyv_jou_i-k/s320/%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25B3%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%2583%25E3%2583%2588%2B2011-08-09%2B19.54.24.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5638809094616451618" /&gt;&lt;/a&gt;
&lt;br /&gt;&lt;/blockquote&gt;
&lt;br /&gt;
&lt;br /&gt;利用する時は“File's Owner”の“plugIn.XXXXX”にバインドしてつかう．これがQCPlugInのプロパティ(getter/detter)に繋がる．&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4629086917523851821-6299303315210541345?l=edotprintstacktrace.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/CeuASiroYIYZkpqomzLSnCUeDmA/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/CeuASiroYIYZkpqomzLSnCUeDmA/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/CeuASiroYIYZkpqomzLSnCUeDmA/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/CeuASiroYIYZkpqomzLSnCUeDmA/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/KsjdY/~4/hNadHSonDsQ" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://edotprintstacktrace.blogspot.com/feeds/6299303315210541345/comments/default" title="コメントの投稿" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=4629086917523851821&amp;postID=6299303315210541345" title="0 件のコメント" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4629086917523851821/posts/default/6299303315210541345?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4629086917523851821/posts/default/6299303315210541345?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/KsjdY/~3/hNadHSonDsQ/quartz-composer-settings-view.html" title="Quartz Composer / Settings の Viewをプロジェクトに追加する方法のメモ" /><author><name>p_g_</name><uri>http://www.blogger.com/profile/15389208108068935129</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://4.bp.blogspot.com/_BA-iUzxIQks/SfAmPKs5kxI/AAAAAAAAAEw/ie6H2TZGF-M/S220/_____1.png" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/-h7cupuDLj84/TkEM3M-nYaI/AAAAAAAAAoQ/vLIUVAXSOIE/s72-c/%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25B3%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%2583%25E3%2583%2588%2B2011-08-09%2B19.05.51.png" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://edotprintstacktrace.blogspot.com/2011/08/quartz-composer-settings-view.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkMNQH86fSp7ImA9WhdRFE4.&quot;"><id>tag:blogger.com,1999:blog-4629086917523851821.post-6832014697432642759</id><published>2011-07-31T23:41:00.010+09:00</published><updated>2011-08-04T15:14:51.115+09:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-08-04T15:14:51.115+09:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Quartz Composer" /><title>Quartz Composer / WebViewの画像を取得するパッチ 修正版</title><content type="html">&lt;blockquote class=myInsert&gt;&lt;span style="font-weight:bold;"&gt;前提&lt;/span&gt;&lt;br /&gt;&lt;a href="http://edotprintstacktrace.blogspot.com/2011/07/quartz-composer-webview.html"&gt;前の版&lt;/a&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;blockquote class=myInsert&gt;&lt;span style="font-weight:bold;"&gt;問題や課題(?)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;問題&lt;/span&gt;&lt;br /&gt;&lt;li&gt;色が合わない(赤と青が入れ替わっている RGBA(BitmapImageRep)→BGRA(OutputImageProvider))&lt;br /&gt;&lt;li&gt;大きい画像から小さい画像に切り替えた際に以前の画像サイズのままになることがある&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;課題&lt;/span&gt;&lt;br /&gt;&lt;li&gt;Download終了時の画像のみでアニメーションしない&lt;br /&gt;ということで修正してみた．&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote class=myInsert&gt;&lt;span style="font-weight:bold;"&gt;やってみた&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;WebViewPlugIn.h&lt;/span&gt;&lt;br /&gt;&lt;blockquote class=myInsert2&gt;&lt;pre&gt;&lt;br /&gt;#import &amp;lt;Quartz/Quartz.h&gt;&lt;br /&gt;#import &amp;lt;Webkit/WebKit.h&gt;&lt;br /&gt;&lt;br /&gt;@interface WebViewPlugIn : QCPlugIn {&lt;br /&gt;@private&lt;br /&gt;    WebView *aWebView;&lt;br /&gt;    WebFrameView *aWebFrameView;&lt;br /&gt;    NSString *oldURL;&lt;br /&gt;    NSBitmapImageRep    *aBitmapImageRep;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;@property(assign) NSString *inputURL; &lt;br /&gt;@property(assign) id&amp;lt;QCPlugInOutputImageProvider&gt; outputImage; &lt;br /&gt;@end&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;WebViewPlugIn.m&lt;/span&gt;&lt;br /&gt;&lt;blockquote class=myInsert2&gt;&lt;pre&gt;&lt;br /&gt;#import &amp;lt;OpenGL/CGLMacro.h&gt;&lt;br /&gt;#import "WebViewPlugIn.h"&lt;br /&gt;&lt;br /&gt;#define    kQCPlugIn_Name                @"WebView"&lt;br /&gt;#define    kQCPlugIn_Description        @"WebView description"&lt;br /&gt;&lt;br /&gt;@implementation WebViewPlugIn&lt;br /&gt;@dynamic inputURL;&lt;br /&gt;@dynamic outputImage;&lt;br /&gt;+ (NSDictionary *)attributes&lt;br /&gt;{&lt;br /&gt;    return [NSDictionary dictionaryWithObjectsAndKeys:&lt;br /&gt;            kQCPlugIn_Name, QCPlugInAttributeNameKey,&lt;br /&gt;            kQCPlugIn_Description, QCPlugInAttributeDescriptionKey,&lt;br /&gt;            nil];&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;+ (NSDictionary *)attributesForPropertyPortWithKey:(NSString *)key&lt;br /&gt;{&lt;br /&gt;    return nil;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;+ (QCPlugInExecutionMode)executionMode&lt;br /&gt;{&lt;br /&gt;    return kQCPlugInExecutionModeProvider;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;+ (QCPlugInTimeMode)timeMode&lt;br /&gt;{&lt;br /&gt;    return kQCPlugInTimeModeIdle;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;- (id)init&lt;br /&gt;{&lt;br /&gt;    self = [super init];&lt;br /&gt;    if (self) {&lt;br /&gt;        NSRect r= NSMakeRect(0,0, 16, 16);&lt;br /&gt;        aWebView= [[WebView alloc] initWithFrame:r&lt;br /&gt;                                       frameName:nil&lt;br /&gt;                                       groupName:nil];&lt;br /&gt;        NSWindow *w= [[NSWindow alloc] init];&lt;br /&gt;        [w setContentView:aWebView];&lt;br /&gt;        [w setFrame:r display:YES];&lt;br /&gt;        [aWebView setFrameLoadDelegate:self];  &lt;br /&gt;        aWebFrameView= [[aWebView mainFrame] frameView];&lt;br /&gt;    }    &lt;br /&gt;    return self;&lt;br /&gt;}&lt;br /&gt;- (void)finalize&lt;br /&gt;{&lt;br /&gt;    [super finalize];&lt;br /&gt;}&lt;br /&gt;- (void)dealloc&lt;br /&gt;{&lt;br /&gt;    [aWebView release];&lt;br /&gt;    [oldURL release];&lt;br /&gt;    [super dealloc];&lt;br /&gt;}&lt;br /&gt;@end&lt;br /&gt;@implementation WebViewPlugIn (Execution)&lt;br /&gt;- (BOOL)startExecution:(id &amp;lt;QCPlugInContext&gt;)context&lt;br /&gt;{&lt;br /&gt;    return YES;&lt;br /&gt;}&lt;br /&gt;- (void)enableExecution:(id &amp;lt;QCPlugInContext&gt;)context&lt;br /&gt;{&lt;br /&gt;}&lt;br /&gt;static void _BufferReleaseCallback(const void* address, void* info)&lt;br /&gt;{&lt;br /&gt;    CGContextRelease(info);&lt;br /&gt;}&lt;br /&gt;- (BOOL)execute:(id &amp;lt;QCPlugInContext&gt;)context atTime:(NSTimeInterval)time withArguments:(NSDictionary *)arguments&lt;br /&gt;{&lt;br /&gt;    if (![oldURL isEqualToString:self.inputURL]) {&lt;br /&gt;        &lt;span style="font-weight:bold;color:blue;"&gt;[[aWebView window] setContentSize:NSMakeSize(16,16)];&lt;br /&gt;        [aWebView setMainFrameURL:self.inputURL];&lt;/span&gt;&lt;br /&gt;        [oldURL release];&lt;br /&gt;        oldURL= [self.inputURL retain];&lt;br /&gt;        [aBitmapImageRep release];&lt;br /&gt;        aBitmapImageRep= nil;&lt;br /&gt;    }&lt;br /&gt;        &lt;br /&gt;    if (aBitmapImageRep!=nil) {&lt;br /&gt;        &lt;span style="font-weight:bold;color:red;"&gt;[aWebFrameView lockFocus];&lt;br /&gt;        [aWebFrameView cacheDisplayInRect:[aWebFrameView bounds] toBitmapImageRep:aBitmapImageRep]; &lt;br /&gt;        [aWebFrameView unlockFocus];&lt;/span&gt;&lt;br /&gt;        NSSize aSize= [aBitmapImageRep size];&lt;br /&gt;        &lt;br /&gt;        &lt;span style="font-weight:bold;color:blue;"&gt;NSUInteger i;&lt;br /&gt;        char *p= (char *)[aBitmapImageRep bitmapData];&lt;br /&gt;        for(i= 0; i&amp;lt;[aBitmapImageRep bytesPerRow]*aSize.height;i+=4){&lt;br /&gt;            char cr= p[i];&lt;br /&gt;            char cb= p[i+2];&lt;br /&gt;            p[i]= cb;&lt;br /&gt;            p[i+2]= cr;&lt;br /&gt;        }&lt;/span&gt;&lt;br /&gt;        &lt;br /&gt;        id provider= [[context outputImageProviderFromBufferWithPixelFormat:QCPlugInPixelFormatBGRA8             &lt;br /&gt;                                                                 pixelsWide:aSize.width&lt;br /&gt;                                                                 pixelsHigh:aSize.height&lt;br /&gt;                                                                baseAddress:[aBitmapImageRep bitmapData]&lt;br /&gt;                                                                bytesPerRow:[aBitmapImageRep bytesPerRow]&lt;br /&gt;                                                            releaseCallback:_BufferReleaseCallback&lt;br /&gt;                                                             releaseContext:NULL&lt;br /&gt;                                                                 colorSpace:[[aBitmapImageRep colorSpace] CGColorSpace]&lt;br /&gt;                                                           shouldColorMatch:YES]&lt;br /&gt;                      retain];&lt;br /&gt;        if(provider == nil) &lt;br /&gt;            return NO; &lt;br /&gt;        self.outputImage = provider; &lt;br /&gt;    }&lt;br /&gt;    else {&lt;br /&gt;        self.outputImage= nil;&lt;br /&gt;    }&lt;br /&gt;    return YES;&lt;br /&gt;}&lt;br /&gt;- (void)disableExecution:(id &amp;lt;QCPlugInContext&gt;)context&lt;br /&gt;{&lt;br /&gt;}&lt;br /&gt;- (void)stopExecution:(id &amp;lt;QCPlugInContext&gt;)context&lt;br /&gt;{&lt;br /&gt;}&lt;br /&gt;@end&lt;br /&gt;@implementation WebViewPlugIn (WebView)&lt;br /&gt;- (void)webView:(WebView *)sender didFinishLoadForFrame:(WebFrame *)frame &lt;br /&gt;{      &lt;br /&gt;    NSSize size= [[aWebFrameView documentView] bounds].size;&lt;br /&gt;    NSUInteger i= ((NSUInteger)size.width)%4;&lt;br /&gt;    if (i!=0) {&lt;br /&gt;        size.width+= 4-i;&lt;br /&gt;    }   &lt;br /&gt;    [[aWebView window] setContentSize:size];&lt;br /&gt;&lt;br /&gt;    [aBitmapImageRep release];&lt;br /&gt;    &lt;span style="font-weight:bold;color:red;"&gt;[aWebFrameView lockFocus];&lt;br /&gt;    aBitmapImageRep= [[aWebFrameView bitmapImageRepForCachingDisplayInRect:[aWebFrameView bounds]] retain];&lt;br /&gt;    [aWebFrameView unlockFocus];&lt;/span&gt;&lt;br /&gt;}  &lt;br /&gt;@end&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote class=myInsert&gt;&lt;span style="font-weight:bold;"&gt;結果&lt;/span&gt;&lt;br /&gt;&lt;a href="http://x.dtott.com/clock/"&gt;こちら&lt;/a&gt;を表示．&lt;br /&gt;&lt;iframe width="425" height="349" src="http://www.youtube.com/embed/Xd2ECpVDbtA" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;&lt;br /&gt;動画のページで横スクロールバーがでてる…documentViewのサイズもだめなのかなぁ…。&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4629086917523851821-6832014697432642759?l=edotprintstacktrace.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/3zvjvwLu7HFHn3YTuC2UQ8uvdFM/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/3zvjvwLu7HFHn3YTuC2UQ8uvdFM/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/3zvjvwLu7HFHn3YTuC2UQ8uvdFM/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/3zvjvwLu7HFHn3YTuC2UQ8uvdFM/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/KsjdY/~4/lzpXw3rlTfc" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://edotprintstacktrace.blogspot.com/feeds/6832014697432642759/comments/default" title="コメントの投稿" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=4629086917523851821&amp;postID=6832014697432642759" title="0 件のコメント" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4629086917523851821/posts/default/6832014697432642759?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4629086917523851821/posts/default/6832014697432642759?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/KsjdY/~3/lzpXw3rlTfc/quartz-composer-webview_31.html" title="Quartz Composer / WebViewの画像を取得するパッチ 修正版" /><author><name>p_g_</name><uri>http://www.blogger.com/profile/15389208108068935129</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://4.bp.blogspot.com/_BA-iUzxIQks/SfAmPKs5kxI/AAAAAAAAAEw/ie6H2TZGF-M/S220/_____1.png" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://img.youtube.com/vi/Xd2ECpVDbtA/default.jpg" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://edotprintstacktrace.blogspot.com/2011/07/quartz-composer-webview_31.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkMDR3w5eip7ImA9WhdREU8.&quot;"><id>tag:blogger.com,1999:blog-4629086917523851821.post-3830746196215375994</id><published>2011-07-29T04:34:00.009+09:00</published><updated>2011-08-01T00:01:16.222+09:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-08-01T00:01:16.222+09:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Quartz Composer" /><title>Quartz Composer / WebViewの画像を取得するパッチ</title><content type="html">&lt;blockquote class=myInsert&gt;&lt;span style="font-weight:bold;"&gt;追記(2011/07/31)&lt;/span&gt;: &lt;a href="http://edotprintstacktrace.blogspot.com/2011/07/quartz-composer-webview_31.html"&gt;修正版を書きました&lt;/a&gt;．&lt;/blockquote&gt;&lt;br /&gt;&lt;hr/&gt;&lt;br /&gt;&lt;blockquote class=myInsert&gt;やってみた&lt;br /&gt;&lt;blockquote class=myInsert2&gt;WebKit.frameworkを追加&lt;/blockquote&gt;&lt;br /&gt;WebViewPlugIn.h&lt;br /&gt;&lt;blockquote class=myInsert2&gt;&lt;pre&gt;&lt;br /&gt;#import &amp;lt;Quartz/Quartz.h&gt;&lt;br /&gt;#import &amp;lt;Webkit/WebKit.h&gt;&lt;br /&gt;&lt;br /&gt;@interface WebViewPlugIn : QCPlugIn {&lt;br /&gt;@private&lt;br /&gt;    WebView *aWebView;&lt;br /&gt;    NSString *oldURL;&lt;br /&gt;    NSBitmapImageRep    *aBitmapImageRep;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;@property(assign) NSString *inputURL; &lt;br /&gt;@property(assign) id&lt;QCPlugInOutputImageProvider&gt; outputImage; &lt;br /&gt;@end&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;WebViewPlugIn.m&lt;br /&gt;&lt;blockquote class=myInsert2&gt;&lt;pre&gt;&lt;br /&gt;#import &amp;lt;OpenGL/CGLMacro.h&gt;&lt;br /&gt;#import "WebViewPlugIn.h"&lt;br /&gt;&lt;br /&gt;#define    kQCPlugIn_Name                @"WebView"&lt;br /&gt;#define    kQCPlugIn_Description        @"WebView description"&lt;br /&gt;&lt;br /&gt;@implementation WebViewPlugIn&lt;br /&gt;@dynamic inputURL;&lt;br /&gt;@dynamic outputImage;&lt;br /&gt;+ (NSDictionary *)attributes&lt;br /&gt;{&lt;br /&gt;    return [NSDictionary dictionaryWithObjectsAndKeys:&lt;br /&gt;            kQCPlugIn_Name, QCPlugInAttributeNameKey,&lt;br /&gt;            kQCPlugIn_Description, QCPlugInAttributeDescriptionKey,&lt;br /&gt;            nil];&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;+ (NSDictionary *)attributesForPropertyPortWithKey:(NSString *)key&lt;br /&gt;{&lt;br /&gt;    return nil;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;+ (QCPlugInExecutionMode)executionMode&lt;br /&gt;{&lt;br /&gt;    return kQCPlugInExecutionModeProvider;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;+ (QCPlugInTimeMode)timeMode&lt;br /&gt;{&lt;br /&gt;    return kQCPlugInTimeModeIdle;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;- (id)init&lt;br /&gt;{&lt;br /&gt;    self = [super init];&lt;br /&gt;    if (self) {&lt;br /&gt;        NSRect r= NSMakeRect(0,0, 16, 16);&lt;br /&gt;        aWebView= [[WebView alloc] initWithFrame:r&lt;br /&gt;                                       frameName:nil&lt;br /&gt;                                       groupName:nil];&lt;br /&gt;        NSWindow *w= [[NSWindow alloc] init];&lt;br /&gt;        [w setContentView:aWebView];&lt;br /&gt;        [w setFrame:r display:YES];&lt;br /&gt;        [aWebView setFrameLoadDelegate:self];  &lt;br /&gt;    }    &lt;br /&gt;    return self;&lt;br /&gt;}&lt;br /&gt;- (void)finalize&lt;br /&gt;{&lt;br /&gt;    [super finalize];&lt;br /&gt;}&lt;br /&gt;- (void)dealloc&lt;br /&gt;{&lt;br /&gt;    [aWebView release];&lt;br /&gt;    [oldURL release];&lt;br /&gt;    [super dealloc];&lt;br /&gt;}&lt;br /&gt;@end&lt;br /&gt;@implementation WebViewPlugIn (Execution)&lt;br /&gt;- (BOOL)startExecution:(id &amp;lt;QCPlugInContext&gt;)context&lt;br /&gt;{&lt;br /&gt;    return YES;&lt;br /&gt;}&lt;br /&gt;- (void)enableExecution:(id &amp;lt;QCPlugInContext&gt;)context&lt;br /&gt;{&lt;br /&gt;}&lt;br /&gt;static void _BufferReleaseCallback(const void* address, void* info)&lt;br /&gt;{&lt;br /&gt;    free(CGBitmapContextGetData((CGContextRef)info));&lt;br /&gt;    CGContextRelease(info);&lt;br /&gt;}&lt;br /&gt;- (BOOL)execute:(id &amp;lt;QCPlugInContext&gt;)context atTime:(NSTimeInterval)time withArguments:(NSDictionary *)arguments&lt;br /&gt;{&lt;br /&gt;    if (![oldURL isEqualToString:self.inputURL]) {&lt;br /&gt;        [aWebView setMainFrameURL:self.inputURL];&lt;br /&gt;        [oldURL release];&lt;br /&gt;        oldURL= [self.inputURL retain];&lt;br /&gt;    }&lt;br /&gt;    if (aBitmapImageRep!=nil) {&lt;br /&gt;        NSSize size= [aBitmapImageRep size];&lt;br /&gt;        id provider= [[context outputImageProviderFromBufferWithPixelFormat:QCPlugInPixelFormatBGRA8             &lt;br /&gt;                                                                 pixelsWide:size.width&lt;br /&gt;                                                                 pixelsHigh:size.height&lt;br /&gt;                                                                baseAddress:[aBitmapImageRep bitmapData]&lt;br /&gt;                                                                bytesPerRow:[aBitmapImageRep bytesPerRow]&lt;br /&gt;                                                            releaseCallback:_BufferReleaseCallback&lt;br /&gt;                                                             releaseContext:NULL&lt;br /&gt;                                                                 colorSpace:[context colorSpace]&lt;br /&gt;                                                           shouldColorMatch:YES]&lt;br /&gt;                      retain];&lt;br /&gt;        if(provider == nil) &lt;br /&gt;            return NO; &lt;br /&gt;        self.outputImage = provider; &lt;br /&gt;    }&lt;br /&gt;    else {&lt;br /&gt;        self.outputImage= nil;&lt;br /&gt;    }&lt;br /&gt;    return YES;&lt;br /&gt;}&lt;br /&gt;- (void)disableExecution:(id &amp;lt;QCPlugInContext&gt;)context&lt;br /&gt;{&lt;br /&gt;}&lt;br /&gt;- (void)stopExecution:(id &amp;lt;QCPlugInContext&gt;)context&lt;br /&gt;{&lt;br /&gt;}&lt;br /&gt;@end&lt;br /&gt;@implementation WebViewPlugIn (WebView)&lt;br /&gt;- (void)webView:(WebView *)sender didFinishLoadForFrame:(WebFrame *)frame &lt;br /&gt;{      &lt;br /&gt;    NSView *view = [[[aWebView mainFrame] frameView] documentView];&lt;br /&gt;    NSSize size= [view bounds].size;&lt;br /&gt;    size.width+= (4-((NSUInteger)size.width)%4);&lt;br /&gt;    [[view window] setContentSize:size];  &lt;br /&gt;    [aBitmapImageRep release];&lt;br /&gt;    [view lockFocus];&lt;br /&gt;    aBitmapImageRep = [[NSBitmapImageRep alloc] initWithFocusedViewRect:[view bounds]];  &lt;br /&gt;    [view unlockFocus];  &lt;br /&gt;}  &lt;br /&gt;@end&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;bytesPerRowの値は16で割り切れないと駄目なんだって．&lt;br /&gt;1pixelで4byte(QCPlugInPixelFormatBGRA8)だから'4-(width%4)'を加えてみた．&lt;br /&gt;これだと4で割り切れたとしても無駄に4pixel増えちゃうけど．&lt;/blockquote&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;blockquote class=myInsert&gt;結果&lt;br /&gt;&lt;blockquote class=myInsert2&gt;Editor&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/-XVAZrZREUlE/TjG6jtreFsI/AAAAAAAAAno/jePLqY8wWCs/s1600/%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25B3%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%2583%25E3%2583%2588%25EF%25BC%25882011-07-29%2B4.37.20%25EF%25BC%2589.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 236px;" src="http://4.bp.blogspot.com/-XVAZrZREUlE/TjG6jtreFsI/AAAAAAAAAno/jePLqY8wWCs/s320/%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25B3%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%2583%25E3%2583%2588%25EF%25BC%25882011-07-29%2B4.37.20%25EF%25BC%2589.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5634489731537311426" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote class=myInsert2&gt;View( &lt;a href="http://www.w3.org/TR/XHTMLplusMathMLplusSVG/sample.xhtml"&gt;ここ&lt;/a&gt;を表示したもの ）&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/-yfZRBe4bYJw/TjG6jTVpFXI/AAAAAAAAAng/fovV9rHp-M4/s1600/%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25B3%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%2583%25E3%2583%2588%25EF%25BC%25882011-07-29%2B4.32.39%25EF%25BC%2589.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 209px; height: 320px;" src="http://2.bp.blogspot.com/-yfZRBe4bYJw/TjG6jTVpFXI/AAAAAAAAAng/fovV9rHp-M4/s320/%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25B3%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%2583%25E3%2583%2588%25EF%25BC%25882011-07-29%2B4.32.39%25EF%25BC%2589.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5634489724466435442" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4629086917523851821-3830746196215375994?l=edotprintstacktrace.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/Iv3nuXJ8GRpaW4eWGsmRwOQFCyA/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Iv3nuXJ8GRpaW4eWGsmRwOQFCyA/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/Iv3nuXJ8GRpaW4eWGsmRwOQFCyA/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Iv3nuXJ8GRpaW4eWGsmRwOQFCyA/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/KsjdY/~4/2UUokKKh_KI" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://edotprintstacktrace.blogspot.com/feeds/3830746196215375994/comments/default" title="コメントの投稿" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=4629086917523851821&amp;postID=3830746196215375994" title="0 件のコメント" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4629086917523851821/posts/default/3830746196215375994?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4629086917523851821/posts/default/3830746196215375994?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/KsjdY/~3/2UUokKKh_KI/quartz-composer-webview.html" title="Quartz Composer / WebViewの画像を取得するパッチ" /><author><name>p_g_</name><uri>http://www.blogger.com/profile/15389208108068935129</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://4.bp.blogspot.com/_BA-iUzxIQks/SfAmPKs5kxI/AAAAAAAAAEw/ie6H2TZGF-M/S220/_____1.png" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/-XVAZrZREUlE/TjG6jtreFsI/AAAAAAAAAno/jePLqY8wWCs/s72-c/%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25B3%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%2583%25E3%2583%2588%25EF%25BC%25882011-07-29%2B4.37.20%25EF%25BC%2589.png" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://edotprintstacktrace.blogspot.com/2011/07/quartz-composer-webview.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CU4MRng5eip7ImA9WhdSF0o.&quot;"><id>tag:blogger.com,1999:blog-4629086917523851821.post-462044267219091136</id><published>2011-07-27T20:53:00.018+09:00</published><updated>2011-07-27T22:39:47.622+09:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-07-27T22:39:47.622+09:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Quartz Composer" /><title>Quartz Composer / QCRendererを用いてコマンドラインで画像の差分をとってみる(composite)</title><content type="html">&lt;blockquote class=myInsert&gt;&lt;span style="font-weight:bold;"&gt;動機&lt;/span&gt;&lt;br /&gt;画像の差分をとりたいなと思い，GoogleReaderに貯め込んだ記事を探してみた．&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://d.hatena.ne.jp/shokai/20110623/1308836719"&gt;ネットワークカメラの画像を監視 - 橋本詳解&lt;/a&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://d.hatena.ne.jp/mirakui/20110326/1301111196"&gt;2枚の画像のdiff（差分）を超簡単に調べる方法 - 床のトルストイ、ゲイとするとのこと&lt;/a&gt;&lt;/ul&gt;&lt;br /&gt;ImageMagickという文字をみて，インストールするのめんどくさいなぁ…って逃げ出した．&lt;br /&gt;Quartz Composerでならすぐつくれるのにって思い，以前みつけた&lt;a href="http://developer.apple.com/library/mac/#samplecode/Offline/Introduction/Intro.html"&gt;Quartz Composer Offline&lt;/a&gt;を応用すれば画像も書き出せるな．ってことでこれを参考にやってみた．（既に有名な記事がありそうだけどやってみたw）&lt;/blockquote&gt;&lt;br /&gt;&lt;blockquote class=myInsert&gt;&lt;span style="font-weight:bold;"&gt;やってみた&lt;/span&gt;&lt;br /&gt;&lt;blockquote class=myInsert2&gt;１．Command Line Toolプロジェクト&lt;/blockquote&gt;&lt;br /&gt;&lt;blockquote class=myInsert2&gt;２．Cocoa.framework, OpenGL.framework, Quartz.frameworkを追加&lt;/blockquote&gt;&lt;br /&gt;&lt;blockquote class=myInsert2&gt;３．コード&lt;br /&gt;&lt;blockquote class=myInsert3&gt;&lt;pre&gt;&lt;br /&gt;#import &amp;lt;Foundation/Foundation.h&gt;&lt;br /&gt;#import &amp;lt;Quartz/Quartz.h&gt;&lt;br /&gt;&lt;br /&gt;int main (int argc, const char * argv[]) {&lt;br /&gt;    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];&lt;br /&gt;    &lt;br /&gt;    if (argc != 3) {&lt;br /&gt;        [pool drain];&lt;br /&gt;        return 1;&lt;br /&gt;    }&lt;br /&gt;    NSString *filepath1= [NSString stringWithCString:argv[1] encoding:NSUTF8StringEncoding];&lt;br /&gt;    NSString *filepath2= [NSString stringWithCString:argv[2] encoding:NSUTF8StringEncoding];    &lt;br /&gt;    NSImage *image1= [[NSImage alloc] initWithContentsOfFile:filepath1];&lt;br /&gt;    NSImage *image2= [[NSImage alloc] initWithContentsOfFile:filepath2];&lt;br /&gt;    &lt;br /&gt;    NSUInteger width= 16;&lt;br /&gt;    NSUInteger height= 16;&lt;br /&gt;    NSString *compositionPath= &lt;span style="font-weight:bold;color:red;"&gt;@"./composition.qtz"&lt;/span&gt;;&lt;br /&gt;    QCRenderer *renderer= nil;&lt;br /&gt;    {&lt;br /&gt;        NSOpenGLPixelFormatAttribute    attributes[]= {&lt;br /&gt;            NSOpenGLPFAPixelBuffer,&lt;br /&gt;            NSOpenGLPFANoRecovery,&lt;br /&gt;            NSOpenGLPFAAccelerated,&lt;br /&gt;            NSOpenGLPFADepthSize,        (NSOpenGLPixelFormatAttribute)24,&lt;br /&gt;            NSOpenGLPFASampleBuffers,    (NSOpenGLPixelFormatAttribute)1,&lt;br /&gt;            NSOpenGLPFASamples,            (NSOpenGLPixelFormatAttribute)16,&lt;br /&gt;            (NSOpenGLPixelFormatAttribute)0&lt;br /&gt;        };&lt;br /&gt;        NSOpenGLPixelFormat *format= [[[NSOpenGLPixelFormat alloc] initWithAttributes:attributes] autorelease];&lt;br /&gt;        NSOpenGLPixelBuffer *pixelBuffer= [[NSOpenGLPixelBuffer alloc] initWithTextureTarget:GL_TEXTURE_RECTANGLE_EXT&lt;br /&gt;                                                                       textureInternalFormat:GL_RGBA&lt;br /&gt;                                                                       textureMaxMipMapLevel:0&lt;br /&gt;                                                                                  pixelsWide:width&lt;br /&gt;                                                                                  pixelsHigh:height];&lt;br /&gt;        &lt;br /&gt;        NSOpenGLContext *openGLContext= [[NSOpenGLContext alloc] initWithFormat:format shareContext:nil];&lt;br /&gt;        if(pixelBuffer == nil || openGLContext == nil) {&lt;br /&gt;            [pool drain];&lt;br /&gt;            return 1;&lt;br /&gt;        }&lt;br /&gt;        &lt;br /&gt;        [openGLContext setPixelBuffer:pixelBuffer&lt;br /&gt;                          cubeMapFace:0&lt;br /&gt;                          mipMapLevel:0&lt;br /&gt;                 currentVirtualScreen:[openGLContext currentVirtualScreen]];&lt;br /&gt;        &lt;br /&gt;        renderer= [[QCRenderer alloc] initWithOpenGLContext:openGLContext pixelFormat:format file:compositionPath];&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    if(renderer) {&lt;br /&gt;        [renderer setValue:image1 forInputKey:@"Image1"];&lt;br /&gt;        [renderer setValue:image2 forInputKey:@"Image2"];&lt;br /&gt;        &lt;br /&gt;        if(![renderer renderAtTime:&lt;span style="font-weight:bold;color:green;"&gt;0.0&lt;/span&gt; arguments:nil]) {&lt;br /&gt;            [pool drain];&lt;br /&gt;            return 1;&lt;br /&gt;        }&lt;br /&gt;        NSBitmapImageRep *bitmapImage = [renderer createSnapshotImageOfType:@"NSBitmapImageRep"];&lt;br /&gt;        &lt;br /&gt;        &lt;span style="font-weight:bold;color:blue;"&gt;if (1){&lt;/span&gt;&lt;br /&gt;            NSImage *image= (NSImage *)[renderer valueForOutputKey:@"Image"];&lt;br /&gt;            if (image) {&lt;br /&gt;                bitmapImage= [NSBitmapImageRep imageRepWithData:[image TIFFRepresentation]];&lt;br /&gt;            }&lt;br /&gt;        &lt;span style="font-weight:bold;color:blue;"&gt;}&lt;/span&gt;&lt;br /&gt;        &lt;br /&gt;        if(bitmapImage) {            &lt;br /&gt;            NSDictionary *properties= [NSDictionary dictionaryWithObjectsAndKeys:&lt;br /&gt;                                       [NSNumber numberWithFloat:1.0], NSImageCompressionFactor,&lt;br /&gt;                                       nil];&lt;br /&gt;            NSData *pngImageData= [bitmapImage representationUsingType:NSPNGFileType &lt;br /&gt;                                                            properties:properties];&lt;br /&gt;            [pngImageData writeToFile:@"&lt;span style="font-weight:bold;color:red;"&gt;./output.png&lt;/span&gt;"&lt;br /&gt;                           atomically:YES];&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    [pool drain];&lt;br /&gt;    return 0;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;ちなみに青いif分を"if(0){…}"で通らなければViewの画像を出力画像にします．(その際はwidht, heightの値で画像サイズがきまる）&lt;br /&gt;&lt;li&gt;ちなみにrenderAtTimeの引数で経過時間を指定しています．&lt;/ul&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote class=myInsert2&gt;４．composition.qtz（実行時はコマンドと同じフォルダに）&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/-c0g7SkzUqSY/Ti_9aiw5dlI/AAAAAAAAAnA/fFKpqcvQBkg/s1600/%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25B3%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%2583%25E3%2583%2588%25EF%25BC%25882011-07-27%2B20.57.02%25EF%25BC%2589.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 150px;" src="http://1.bp.blogspot.com/-c0g7SkzUqSY/Ti_9aiw5dlI/AAAAAAAAAnA/fFKpqcvQBkg/s320/%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25B3%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%2583%25E3%2583%2588%25EF%25BC%25882011-07-27%2B20.57.02%25EF%25BC%2589.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5634000291314103890" /&gt;&lt;/a&gt;&lt;br /&gt;publishしてあるキーについて&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/--kcCw8njefs/Ti_9aqMuFYI/AAAAAAAAAm4/TaUvJqgGJPc/s1600/%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25B3%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%2583%25E3%2583%2588%25EF%25BC%25882011-07-27%2B20.57.19%25EF%25BC%2589.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 218px; height: 320px;" src="http://2.bp.blogspot.com/--kcCw8njefs/Ti_9aqMuFYI/AAAAAAAAAm4/TaUvJqgGJPc/s320/%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25B3%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%2583%25E3%2583%2588%25EF%25BC%25882011-07-27%2B20.57.19%25EF%25BC%2589.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5634000293309846914" /&gt;&lt;/a&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote class=myInsert&gt;&lt;span style="font-weight:bold;"&gt;結果&lt;/span&gt;&lt;br /&gt;&lt;blockquote class=myInsert2&gt;&gt; ./commandName imageFilePath1 imageFilePath2&lt;/blockquote&gt;&lt;br /&gt;&lt;blockquote class=myInsert2&gt;１．入力ファイル(第一, 第二引数)&lt;br /&gt;出力画像サイズをQCRendererの初期化時のサイズに依存しないという点からQuarz Composer Offlineと異なりOutputのPublishで画像を取得してみた．&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/-fxD1zeee81E/Ti__cFdDFsI/AAAAAAAAAnY/U87EN1U4OWw/s1600/t0.jpeg"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 240px; height: 320px;" src="http://1.bp.blogspot.com/-fxD1zeee81E/Ti__cFdDFsI/AAAAAAAAAnY/U87EN1U4OWw/s320/t0.jpeg" border="0" alt=""id="BLOGGER_PHOTO_ID_5634002516829214402" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/-0bMkpmN6Osw/Ti__b5nhjeI/AAAAAAAAAnQ/8L9-pd0D8i8/s1600/t1.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 240px; height: 320px;" src="http://2.bp.blogspot.com/-0bMkpmN6Osw/Ti__b5nhjeI/AAAAAAAAAnQ/8L9-pd0D8i8/s320/t1.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5634002513651928546" /&gt;&lt;/a&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;blockquote class=myInsert2&gt;２．出力ファイル(output.png)&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/-dLVuC1j609o/Ti__bu5ITCI/AAAAAAAAAnI/PLxRws996sw/s1600/output.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 240px; height: 320px;" src="http://4.bp.blogspot.com/-dLVuC1j609o/Ti__bu5ITCI/AAAAAAAAAnI/PLxRws996sw/s320/output.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5634002510772980770" /&gt;&lt;/a&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;composition.qtzの中身を変えれば当然出力も変わる（変えられる）．&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4629086917523851821-462044267219091136?l=edotprintstacktrace.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/DpITeuBMj6g71JqmxsNYIG0TsSY/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/DpITeuBMj6g71JqmxsNYIG0TsSY/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/DpITeuBMj6g71JqmxsNYIG0TsSY/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/DpITeuBMj6g71JqmxsNYIG0TsSY/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/KsjdY/~4/uxXrp57wY2Y" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://edotprintstacktrace.blogspot.com/feeds/462044267219091136/comments/default" title="コメントの投稿" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=4629086917523851821&amp;postID=462044267219091136" title="0 件のコメント" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4629086917523851821/posts/default/462044267219091136?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4629086917523851821/posts/default/462044267219091136?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/KsjdY/~3/uxXrp57wY2Y/quartz-composer-qcrenderercomposite.html" title="Quartz Composer / QCRendererを用いてコマンドラインで画像の差分をとってみる(composite)" /><author><name>p_g_</name><uri>http://www.blogger.com/profile/15389208108068935129</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://4.bp.blogspot.com/_BA-iUzxIQks/SfAmPKs5kxI/AAAAAAAAAEw/ie6H2TZGF-M/S220/_____1.png" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/-c0g7SkzUqSY/Ti_9aiw5dlI/AAAAAAAAAnA/fFKpqcvQBkg/s72-c/%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25B3%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%2583%25E3%2583%2588%25EF%25BC%25882011-07-27%2B20.57.02%25EF%25BC%2589.png" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://edotprintstacktrace.blogspot.com/2011/07/quartz-composer-qcrenderercomposite.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkQNQH8zcCp7ImA9WhZbFkU.&quot;"><id>tag:blogger.com,1999:blog-4629086917523851821.post-5346490686106222870</id><published>2011-06-22T03:03:00.009+09:00</published><updated>2011-06-22T03:19:51.188+09:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-06-22T03:19:51.188+09:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Quartz Composer" /><category scheme="http://www.blogger.com/atom/ns#" term="GLSL" /><title>Quartz Composer / Fragment Shader(GLSL Shaderパッチ)をいじってみた</title><content type="html">&lt;blockquote class=myInsert&gt;&lt;span style="font-weight:bold;"&gt;動機:&lt;/span&gt;&lt;br /&gt;&lt;a href="http://twitter.com/#!/noboko"&gt;nobokoさん&lt;/a&gt;の&lt;a href="http://twitter.com/#!/noboko/status/83221464123326464"&gt;このpost&lt;/a&gt;をみて&lt;a href="http://vimeo.com/9821817"&gt;こちらの動画(FORTUNE - Staring At The Ice Melt (album teaser BULLY))&lt;/a&gt;を見て，「GLSL ShaderパッチのFragment Shaderでそれっぽくできないかしら?」と思いちょっとやってみた．&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote class=myInsert&gt;&lt;span style="font-weight:bold;"&gt;やってみた:&lt;/span&gt;&lt;br /&gt;Fragment Shaderのコードとしてはこんなかんじ．&lt;br /&gt;Vertex Shaderはそのまま．&lt;br /&gt;&lt;blockquote class=myInsert2&gt;&lt;pre&gt;uniform sampler2D texture;&lt;br /&gt;uniform float i;&lt;br /&gt;uniform float direction;&lt;br /&gt;void main()&lt;br /&gt;{&lt;br /&gt; vec4 c= texture2D(texture, gl_TexCoord[0].xy);&lt;br /&gt;&lt;br /&gt; if (direction&amp;lt;0.5) {&lt;br /&gt;  if (i &gt; gl_TexCoord[0].x) {&lt;br /&gt;    c= texture2D(texture, vec2(i, gl_TexCoord[0].y));&lt;br /&gt;   }&lt;br /&gt; }&lt;br /&gt; else {&lt;br /&gt;  if (i &gt; gl_TexCoord[0].y) {&lt;br /&gt;   c= texture2D(texture, vec2(gl_TexCoord[0].x, i));&lt;br /&gt;  }&lt;br /&gt; } &lt;br /&gt; gl_FragColor= c;&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;float iは0-1の間の値&lt;br /&gt;float directionは0.5を境界に縦と横の切り替え(boolでよかったのでは…。）&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote class=myInsert&gt;&lt;span style="font-weight:bold;"&gt;結果:&lt;/span&gt;&lt;br /&gt;っぽい?&lt;br /&gt;&lt;object width="425" height="344"&gt;&lt;param name="movie" value="http://www.youtube.com/v/aKMD7G1nacs?hl=ja&amp;fs=1"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/aKMD7G1nacs?hl=ja&amp;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4629086917523851821-5346490686106222870?l=edotprintstacktrace.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/kvDUt4gLaeooO6Dre4VceJy09p8/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/kvDUt4gLaeooO6Dre4VceJy09p8/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/kvDUt4gLaeooO6Dre4VceJy09p8/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/kvDUt4gLaeooO6Dre4VceJy09p8/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/KsjdY/~4/t4BK0X1-weE" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://edotprintstacktrace.blogspot.com/feeds/5346490686106222870/comments/default" title="コメントの投稿" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=4629086917523851821&amp;postID=5346490686106222870" title="0 件のコメント" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4629086917523851821/posts/default/5346490686106222870?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4629086917523851821/posts/default/5346490686106222870?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/KsjdY/~3/t4BK0X1-weE/quartz-composer-fragment-shaderglsl.html" title="Quartz Composer / Fragment Shader(GLSL Shaderパッチ)をいじってみた" /><author><name>p_g_</name><uri>http://www.blogger.com/profile/15389208108068935129</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://4.bp.blogspot.com/_BA-iUzxIQks/SfAmPKs5kxI/AAAAAAAAAEw/ie6H2TZGF-M/S220/_____1.png" /></author><thr:total>0</thr:total><feedburner:origLink>http://edotprintstacktrace.blogspot.com/2011/06/quartz-composer-fragment-shaderglsl.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUUARHo-eSp7ImA9WhZbFEQ.&quot;"><id>tag:blogger.com,1999:blog-4629086917523851821.post-1467492355473668101</id><published>2011-06-20T00:16:00.007+09:00</published><updated>2011-06-20T00:27:25.451+09:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-06-20T00:27:25.451+09:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Quartz Composer" /><title>Quartz Composer / IteratorのIndexの総和を求める (IteratorのPublish Outputは最後の値だけ</title><content type="html">&lt;blockquote class=myInsert&gt;&lt;span style="font-weight:bold;"&gt;動機&lt;/span&gt;&lt;br /&gt;&lt;a href="http://twitter.com/noboko/status/82151112781742080"&gt;nobokoさんのサンプルをみて&lt;/a&gt;，そうなのか！と思ったので（世の中の常識なのかもしれませんが）．&lt;/blockquote&gt;&lt;br /&gt;&lt;blockquote class=myInsert&gt;&lt;span style="font-weight:bold;"&gt;やったこと&lt;/span&gt;&lt;br /&gt;全体(0-9の和なので45)&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/-HhnP64b_sd8/Tf4TJ6drBaI/AAAAAAAAAmg/cTo8Kar82r4/s1600/%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25B3%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%2583%25E3%2583%2588%25EF%25BC%25882011-06-20%2B0.14.41%25EF%25BC%2589.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 241px;" src="http://3.bp.blogspot.com/-HhnP64b_sd8/Tf4TJ6drBaI/AAAAAAAAAmg/cTo8Kar82r4/s320/%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25B3%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%2583%25E3%2583%2588%25EF%25BC%25882011-06-20%2B0.14.41%25EF%25BC%2589.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5619950446038418850" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Iterator内&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/-1GJ7jGiB4bw/Tf4TJtJNOhI/AAAAAAAAAmY/XRAqOfO6kOI/s1600/%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25B3%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%2583%25E3%2583%2588%25EF%25BC%25882011-06-20%2B0.15.00%25EF%25BC%2589.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 245px;" src="http://4.bp.blogspot.com/-1GJ7jGiB4bw/Tf4TJtJNOhI/AAAAAAAAAmY/XRAqOfO6kOI/s320/%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25B3%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%2583%25E3%2583%2588%25EF%25BC%25882011-06-20%2B0.15.00%25EF%25BC%2589.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5619950442462919186" /&gt;&lt;/a&gt;&lt;br /&gt;'Source #0'の値は'0'&lt;br /&gt;&lt;br /&gt;パッチ処理が上流から下流に流れ，繰り返す直前の演算状態で次のIterator内処理が行われるためか値が保持されてrecurrentな状態になるらしい．&lt;br /&gt;Publish Outputなら全てというわけでなく，最後の演算状態だけが保持されるので，下流で要求されてしまえば上流の値は計算させるので保持されない．&lt;br /&gt;そういうケースは素直にFeedbackを使えば良いんだと思う．&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4629086917523851821-1467492355473668101?l=edotprintstacktrace.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/WhkdyE1Hlr-_EjB37Eid-vP8ut4/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/WhkdyE1Hlr-_EjB37Eid-vP8ut4/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/WhkdyE1Hlr-_EjB37Eid-vP8ut4/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/WhkdyE1Hlr-_EjB37Eid-vP8ut4/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/KsjdY/~4/ljns-X778gU" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://edotprintstacktrace.blogspot.com/feeds/1467492355473668101/comments/default" title="コメントの投稿" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=4629086917523851821&amp;postID=1467492355473668101" title="0 件のコメント" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4629086917523851821/posts/default/1467492355473668101?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4629086917523851821/posts/default/1467492355473668101?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/KsjdY/~3/ljns-X778gU/quartz-composer-iteratorindex.html" title="Quartz Composer / IteratorのIndexの総和を求める (IteratorのPublish Outputは最後の値だけ" /><author><name>p_g_</name><uri>http://www.blogger.com/profile/15389208108068935129</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://4.bp.blogspot.com/_BA-iUzxIQks/SfAmPKs5kxI/AAAAAAAAAEw/ie6H2TZGF-M/S220/_____1.png" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/-HhnP64b_sd8/Tf4TJ6drBaI/AAAAAAAAAmg/cTo8Kar82r4/s72-c/%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25B3%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%2583%25E3%2583%2588%25EF%25BC%25882011-06-20%2B0.14.41%25EF%25BC%2589.png" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://edotprintstacktrace.blogspot.com/2011/06/quartz-composer-iteratorindex.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CU4CRno_cCp7ImA9WhZaEUs.&quot;"><id>tag:blogger.com,1999:blog-4629086917523851821.post-7272064047681141812</id><published>2011-06-19T17:48:00.010+09:00</published><updated>2011-06-27T17:39:27.448+09:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-06-27T17:39:27.448+09:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="SPARQL" /><category scheme="http://www.blogger.com/atom/ns#" term="RDF" /><category scheme="http://www.blogger.com/atom/ns#" term="ARQ" /><title>ARQを使ってSPARQLをやってみた2(FROMとFROM NAMEDの結合)</title><content type="html">&lt;blockquote class=myInsert&gt;&lt;a href="http://www.asahi-net.or.jp/~ax2s-kmtn/internet/rdf/rdf-sparql-query.html#specDataset"&gt;これ('RDF用クエリ言語SPARQL/8.2.3 FROMとFROM NAMEDの結合')&lt;/a&gt;をやってみた．&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote class=myInsert&gt;&lt;span style="font-weight:bold;"&gt;やってみた&lt;/span&gt;&lt;br /&gt;&lt;blockquote class=myInsert2&gt;０．環境&lt;br /&gt;&lt;a href="http://edotprintstacktrace.blogspot.com/2011/06/arqsparql.html"&gt;前回&lt;/a&gt;環境を参考&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;blockquote class=myInsert2&gt;１．データファイル&lt;br /&gt;data_8.2.1_1.ttl&lt;br /&gt;&lt;blockquote class=myInsert3&gt;&lt;pre&gt;# Default graph (stored at http://example.org/dft.ttl)&lt;br /&gt;@prefix dc: &amp;lt;http://purl.org/dc/elements/1.1/&gt; .&lt;br /&gt;&lt;br /&gt;&amp;lt;http://example.org/bob&gt;    dc:publisher  "Bob Hacker" .&lt;br /&gt;&amp;lt;http://example.org/alice&gt;  dc:publisher  "Alice Hacker" .&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;data_8.2.1_2.ttl&lt;br /&gt;&lt;blockquote class=myInsert3&gt;&lt;pre&gt;# Named graph: http://example.org/bob&lt;br /&gt;@prefix foaf: &amp;lt;http://xmlns.com/foaf/0.1/&gt; .&lt;br /&gt;&lt;br /&gt;_:a foaf:name "Bob" .&lt;br /&gt;_:a foaf:mbox &amp;lt;mailto:bob@oldcorp.example.org&gt; .&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;data_8.2.1_3.ttl&lt;br /&gt;&lt;blockquote class=myInsert3&gt;&lt;pre&gt;# Named graph: http://example.org/alice&lt;br /&gt;@prefix foaf: &amp;lt;http://xmlns.com/foaf/0.1/&gt; .&lt;br /&gt;&lt;br /&gt;_:a foaf:name "Alice" .&lt;br /&gt;_:a foaf:mbox &amp;lt;mailto:alice@work.example.org&gt; .&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;各ファイルの'#'行はコメントなのでこれでナニカを定義しているわけではない．&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;blockquote class=myInsert2&gt;２．コード&lt;br /&gt;Test_8_2_3.java&lt;br /&gt;&lt;blockquote class=myInsert3&gt;&lt;pre&gt;package sample;&lt;br /&gt;&lt;br /&gt;import org.openjena.atlas.lib.StrUtils;&lt;br /&gt;&lt;br /&gt;import com.hp.hpl.jena.query.DataSource;&lt;br /&gt;import com.hp.hpl.jena.query.DatasetFactory;&lt;br /&gt;import com.hp.hpl.jena.query.Query;&lt;br /&gt;import com.hp.hpl.jena.query.QueryExecution;&lt;br /&gt;import com.hp.hpl.jena.query.QueryExecutionFactory;&lt;br /&gt;import com.hp.hpl.jena.query.QueryFactory;&lt;br /&gt;import com.hp.hpl.jena.query.ResultSetFormatter;&lt;br /&gt;import com.hp.hpl.jena.rdf.model.Model;&lt;br /&gt;import com.hp.hpl.jena.rdf.model.ModelFactory;&lt;br /&gt;import com.hp.hpl.jena.util.FileManager;&lt;br /&gt;&lt;br /&gt;public class Test_8_2_3 {&lt;br /&gt; public static void main(String[] args) {&lt;br /&gt;  Model model1 = ModelFactory.createDefaultModel();&lt;br /&gt;  FileManager.get().readModel(model1, "data_8.2.3_1.ttl");&lt;br /&gt;  Model model2 = ModelFactory.createDefaultModel();&lt;br /&gt;  FileManager.get().readModel(model2, "data_8.2.3_2.ttl");&lt;br /&gt;  Model model3 = ModelFactory.createDefaultModel();&lt;br /&gt;  FileManager.get().readModel(model3, "data_8.2.3_3.ttl");&lt;br /&gt;  &lt;br /&gt;  DataSource dataSource= DatasetFactory.create();&lt;br /&gt;  dataSource.setDefaultModel(model1);&lt;br /&gt;  dataSource.addNamedModel("http://example.org/bob", model2);&lt;br /&gt;  dataSource.addNamedModel("http://example.org/alice", model3);&lt;br /&gt;  &lt;span style="font-weight:bold;color:red;"&gt;System.out.println(dataSource.asDatasetGraph().toString());&lt;br /&gt;  System.out.println();&lt;/span&gt;&lt;br /&gt;  &lt;br /&gt;  String queryString = StrUtils.strjoin("\n",&lt;br /&gt;    "PREFIX foaf: &amp;lt;http://xmlns.com/foaf/0.1/&gt;",&lt;br /&gt;    "PREFIX dc: &amp;lt;http://purl.org/dc/elements/1.1/&gt;",&lt;br /&gt;    "",&lt;br /&gt;    "SELECT ?who ?g ?mbox",&lt;br /&gt;    "FROM &amp;lt;http://example.org/dft.ttl&gt;",&lt;br /&gt;    "FROM NAMED &amp;lt;http://example.org/alice&gt;",&lt;br /&gt;    "FROM NAMED &amp;lt;http://example.org/bob&gt;",&lt;br /&gt;    "WHERE",&lt;br /&gt;    "{",&lt;br /&gt;    "   ?g dc:publisher ?who .",&lt;br /&gt;    "   GRAPH ?g { ?x foaf:mbox ?mbox }",&lt;br /&gt;    "}");&lt;br /&gt;  Query query = QueryFactory.create(queryString);&lt;br /&gt;&lt;br /&gt;  QueryExecution qExec = QueryExecutionFactory.create(query, dataSource);&lt;br /&gt;  &lt;span style="font-weight:bold;color:blue;"&gt;ResultSetFormatter.out(System.out, qExec.execSelect(), query);&lt;/span&gt;&lt;br /&gt;  qExec.close();&lt;br /&gt; }&lt;br /&gt;}&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;（'addNamedModelの第一引数の値で関連づけている）&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;blockquote class=myInsert2&gt;３．実行&lt;br /&gt;&lt;blockquote class=myInsert3&gt;&lt;tt&gt;&lt;pre&gt;(dataset&lt;br /&gt;  &lt;span style="font-weight:bold;color:red;"&gt;(graph&lt;br /&gt;    (triple &amp;lt;http://example.org/alice&gt; &amp;lt;http://purl.org/dc/elements/1.1/publisher&gt; "Alice Hacker")&lt;br /&gt;    (triple &amp;lt;http://example.org/bob&gt; &amp;lt;http://purl.org/dc/elements/1.1/publisher&gt; "Bob Hacker")&lt;br /&gt;  )&lt;br /&gt;  (graph &amp;lt;http://example.org/bob&gt;&lt;br /&gt;    (triple _:-335a33de:130a7151814:-7fff &amp;lt;http://xmlns.com/foaf/0.1/mbox&gt; &amp;lt;mailto:bob@oldcorp.example.org&gt;)&lt;br /&gt;    (triple _:-335a33de:130a7151814:-7fff &amp;lt;http://xmlns.com/foaf/0.1/name&gt; "Bob")&lt;br /&gt;  )&lt;br /&gt;  (graph &amp;lt;http://example.org/alice&gt;&lt;br /&gt;    (triple _:-335a33de:130a7151814:-7ffe &amp;lt;http://xmlns.com/foaf/0.1/mbox&gt; &amp;lt;mailto:alice@work.example.org&gt;)&lt;br /&gt;    (triple _:-335a33de:130a7151814:-7ffe &amp;lt;http://xmlns.com/foaf/0.1/name&gt; "Alice")&lt;br /&gt;  ))&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;color:blue;"&gt;----------------------------------------------------------------------------------&lt;br /&gt;| who            | g                          | mbox                             |&lt;br /&gt;==================================================================================&lt;br /&gt;| "Alice Hacker" | &amp;lt;http://example.org/alice&gt; | &amp;lt;mailto:alice@work.example.org&gt;  |&lt;br /&gt;| "Bob Hacker"   | &amp;lt;http://example.org/bob&gt;   | &amp;lt;mailto:bob@oldcorp.example.org&gt; |&lt;br /&gt;----------------------------------------------------------------------------------&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/tt&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4629086917523851821-7272064047681141812?l=edotprintstacktrace.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/K21iTNA30R7B-hYvWqUGgXz9Tyk/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/K21iTNA30R7B-hYvWqUGgXz9Tyk/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/K21iTNA30R7B-hYvWqUGgXz9Tyk/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/K21iTNA30R7B-hYvWqUGgXz9Tyk/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/KsjdY/~4/8rq8e6IiLaU" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://edotprintstacktrace.blogspot.com/feeds/7272064047681141812/comments/default" title="コメントの投稿" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=4629086917523851821&amp;postID=7272064047681141812" title="0 件のコメント" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4629086917523851821/posts/default/7272064047681141812?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4629086917523851821/posts/default/7272064047681141812?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/KsjdY/~3/8rq8e6IiLaU/arqsparql2fromfrom-named.html" title="ARQを使ってSPARQLをやってみた2(FROMとFROM NAMEDの結合)" /><author><name>p_g_</name><uri>http://www.blogger.com/profile/15389208108068935129</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://4.bp.blogspot.com/_BA-iUzxIQks/SfAmPKs5kxI/AAAAAAAAAEw/ie6H2TZGF-M/S220/_____1.png" /></author><thr:total>0</thr:total><feedburner:origLink>http://edotprintstacktrace.blogspot.com/2011/06/arqsparql2fromfrom-named.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0cDRnYzeCp7ImA9WhZbFEw.&quot;"><id>tag:blogger.com,1999:blog-4629086917523851821.post-9086052055456804750</id><published>2011-06-19T01:09:00.011+09:00</published><updated>2011-06-19T02:44:37.880+09:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-06-19T02:44:37.880+09:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="SPARQL" /><category scheme="http://www.blogger.com/atom/ns#" term="RDF" /><category scheme="http://www.blogger.com/atom/ns#" term="ARQ" /><title>ARQを使ってSPARQLをやってみた</title><content type="html">&lt;blockquote class="myInsert"&gt;&lt;a href="http://www.asahi-net.or.jp/~ax2s-kmtn/internet/rdf/rdf-sparql-query.html#WritingSimpleQueries"&gt;これ('RDF用クエリ言語SPARQL/2.1 シンプルなクエリの記述')&lt;/a&gt;をやってみた．&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;blockquote class="myInsert"&gt;やってみた．&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;０．ARQ&lt;/span&gt;&lt;br /&gt;ARQは&lt;a href="http://jena.sourceforge.net/ARQ/"&gt;こちらのページ&lt;/a&gt;から取得(ARQ-2.8.8)．&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;１．Eclipseプロジェクト&lt;/span&gt;&lt;br /&gt;Eclipseのプロジェクトにまるごと入れてlib中のjar上のコンテクストメニューにてBuild Path/Add to Build Pathにてパスを通す．&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;２．コードを書く&lt;/span&gt;&lt;br /&gt;&lt;blockquote class="myInsert2"&gt;&lt;pre&gt;package sample;&lt;br /&gt;&lt;br /&gt;import org.openjena.atlas.lib.StrUtils;&lt;br /&gt;&lt;br /&gt;import com.hp.hpl.jena.query.Query;&lt;br /&gt;import com.hp.hpl.jena.query.QueryExecution;&lt;br /&gt;import com.hp.hpl.jena.query.QueryExecutionFactory;&lt;br /&gt;import com.hp.hpl.jena.query.QueryFactory;&lt;br /&gt;import com.hp.hpl.jena.query.ResultSetFormatter;&lt;br /&gt;import com.hp.hpl.jena.rdf.model.Model;&lt;br /&gt;import com.hp.hpl.jena.rdf.model.ModelFactory;&lt;br /&gt;import com.hp.hpl.jena.rdf.model.Resource;&lt;br /&gt;import com.hp.hpl.jena.vocabulary.DC;&lt;br /&gt;&lt;br /&gt;public class Test {&lt;br /&gt; public static void main(String[] args) {&lt;br /&gt;  Model model = ModelFactory.createDefaultModel() ;&lt;br /&gt;  Resource resource = model.createResource("http://example.org/book/book1");&lt;br /&gt;  resource.addProperty(DC.title, "SPARQL Tutorial");&lt;br /&gt;&lt;br /&gt;  String queryString = StrUtils.strjoin("\n",&lt;br /&gt;    "SELECT ?title",&lt;br /&gt;    "WHERE{",&lt;br /&gt;    "  &amp;lt;http://example.org/book/book1&gt; &amp;lt;http://purl.org/dc/elements/1.1/title&gt; ?title .",&lt;br /&gt;    "}");&lt;br /&gt;  Query query = QueryFactory.create(queryString);&lt;br /&gt;  &lt;br /&gt;  QueryExecution qExec = QueryExecutionFactory.create(query, model);&lt;br /&gt;  ResultSetFormatter.out(System.out, qExec.execSelect(), query);&lt;br /&gt;  qExec.close();&lt;br /&gt; }&lt;br /&gt;}&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;データをファイルで与える場合:&lt;br /&gt;&lt;blockquote class=myInsert2&gt;&lt;pre&gt;package sample;&lt;br /&gt;&lt;br /&gt;import org.openjena.atlas.lib.StrUtils;&lt;br /&gt;&lt;br /&gt;import com.hp.hpl.jena.query.Query;&lt;br /&gt;import com.hp.hpl.jena.query.QueryExecution;&lt;br /&gt;import com.hp.hpl.jena.query.QueryExecutionFactory;&lt;br /&gt;import com.hp.hpl.jena.query.QueryFactory;&lt;br /&gt;import com.hp.hpl.jena.query.ResultSetFormatter;&lt;br /&gt;import com.hp.hpl.jena.rdf.model.Model;&lt;br /&gt;import com.hp.hpl.jena.rdf.model.ModelFactory;&lt;br /&gt;import com.hp.hpl.jena.util.FileManager;&lt;br /&gt;&lt;br /&gt;public class Test {&lt;br /&gt; public static void main(String[] args) {&lt;br /&gt;  &lt;span style="font-weight:bold; color:red;"&gt;Model model = ModelFactory.createDefaultModel();&lt;br /&gt;  FileManager.get().readModel(model, "data.ttl");&lt;/span&gt;&lt;br /&gt;  &lt;br /&gt;  String queryString = StrUtils.strjoin("\n",&lt;br /&gt;    "SELECT ?title",&lt;br /&gt;    "WHERE{",&lt;br /&gt;    "  &amp;lt;http://example.org/book/book1&gt; &amp;lt;http://purl.org/dc/elements/1.1/title&gt; ?title .",&lt;br /&gt;    "}");&lt;br /&gt;  Query query = QueryFactory.create(queryString);&lt;br /&gt;  &lt;br /&gt;  QueryExecution qExec = QueryExecutionFactory.create(query, model);&lt;br /&gt;  ResultSetFormatter.out(System.out, qExec.execSelect(), query);&lt;br /&gt;  qExec.close();&lt;br /&gt; }&lt;br /&gt;}&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;'data.ttl'ファイル．拡張子はttlである必要があるみたい(?).&lt;br /&gt;&lt;blockquote class=myInsert2&gt;&lt;pre&gt;&amp;lt;http://example.org/book/book1&gt; &amp;lt;http://purl.org/dc/elements/1.1/title&gt; "SPARQL Tutorial" .&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;３．実行(画像をクリックで拡大）&lt;br /&gt;&lt;/span&gt;&lt;a href="http://1.bp.blogspot.com/-oYnyF2nkWwA/TfzPsUh5YYI/AAAAAAAAAmA/zdvttrOiU1Y/s1600/%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25B3%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%2583%25E3%2583%2588%25EF%25BC%25882011-06-19%2B1.09.11%25EF%25BC%2589.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 200px;" src="http://1.bp.blogspot.com/-oYnyF2nkWwA/TfzPsUh5YYI/AAAAAAAAAmA/zdvttrOiU1Y/s320/%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25B3%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%2583%25E3%2583%2588%25EF%25BC%25882011-06-19%2B1.09.11%25EF%25BC%2589.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5619594795383611778" /&gt;&lt;/a&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote class=myInsert&gt;&lt;span style="font-weight:bold;"&gt;追記&lt;/span&gt;&lt;br /&gt;&lt;a href="http://www.asahi-net.or.jp/~ax2s-kmtn/internet/rdf/rdf-sparql-query.html#MultipleMatches"&gt;'RDF用クエリ言語SPARQL/2.2 複数マッチ'&lt;/a&gt;の実行（画像をクリックで拡大）&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/-ZM-FHfXhvD8/TfzWOxIGxcI/AAAAAAAAAmI/CjTDd7YIBrM/s1600/%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25B3%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%2583%25E3%2583%2588%25EF%25BC%25882011-06-19%2B1.43.09%25EF%25BC%2589.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 200px;" src="http://4.bp.blogspot.com/-ZM-FHfXhvD8/TfzWOxIGxcI/AAAAAAAAAmI/CjTDd7YIBrM/s320/%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25B3%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%2583%25E3%2583%2588%25EF%25BC%25882011-06-19%2B1.43.09%25EF%25BC%2589.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5619601984245384642" /&gt;&lt;/a&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote class=myInsert&gt;&lt;span style="font-weight:bold;"&gt;追記2&lt;/span&gt;&lt;br /&gt;&lt;a href="http://www.asahi-net.or.jp/~ax2s-kmtn/internet/rdf/rdf-sparql-query.html#matchingRDFLiterals"&gt;'RDF用クエリ言語SPARQL/2.3 RDFリテラルのマッチング'&lt;/a&gt;の実行（画像をクリックで拡大）&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/-_TbfmuNS0W8/Tfzj737Pt4I/AAAAAAAAAmQ/GIpbl7tWRrM/s1600/%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25B3%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%2583%25E3%2583%2588%25EF%25BC%25882011-06-19%2B2.42.32%25EF%25BC%2589.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 200px;" src="http://1.bp.blogspot.com/-_TbfmuNS0W8/Tfzj737Pt4I/AAAAAAAAAmQ/GIpbl7tWRrM/s320/%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25B3%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%2583%25E3%2583%2588%25EF%25BC%25882011-06-19%2B2.42.32%25EF%25BC%2589.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5619617052815767426" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4629086917523851821-9086052055456804750?l=edotprintstacktrace.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/kwaRgd0e8gwVZ3kN2vmDDeNBUVg/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/kwaRgd0e8gwVZ3kN2vmDDeNBUVg/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/kwaRgd0e8gwVZ3kN2vmDDeNBUVg/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/kwaRgd0e8gwVZ3kN2vmDDeNBUVg/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/KsjdY/~4/97pYXXvMeUY" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://edotprintstacktrace.blogspot.com/feeds/9086052055456804750/comments/default" title="コメントの投稿" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=4629086917523851821&amp;postID=9086052055456804750" title="0 件のコメント" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4629086917523851821/posts/default/9086052055456804750?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4629086917523851821/posts/default/9086052055456804750?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/KsjdY/~3/97pYXXvMeUY/arqsparql.html" title="ARQを使ってSPARQLをやってみた" /><author><name>p_g_</name><uri>http://www.blogger.com/profile/15389208108068935129</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://4.bp.blogspot.com/_BA-iUzxIQks/SfAmPKs5kxI/AAAAAAAAAEw/ie6H2TZGF-M/S220/_____1.png" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/-oYnyF2nkWwA/TfzPsUh5YYI/AAAAAAAAAmA/zdvttrOiU1Y/s72-c/%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25B3%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%2583%25E3%2583%2588%25EF%25BC%25882011-06-19%2B1.09.11%25EF%25BC%2589.png" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://edotprintstacktrace.blogspot.com/2011/06/arqsparql.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0YNQn4_fSp7ImA9WhZaEUU.&quot;"><id>tag:blogger.com,1999:blog-4629086917523851821.post-7584105143960058407</id><published>2011-06-18T22:16:00.013+09:00</published><updated>2011-06-27T23:33:13.045+09:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-06-27T23:33:13.045+09:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Quartz Composer" /><title>Quartz Composer / Google SketchUpで作ったMeshの頂点を動かしてみた</title><content type="html">&lt;blockquote class=myInsert&gt;&lt;span style="font-weight:bold;"&gt;動機&lt;/span&gt;：&lt;br /&gt;まぁタイトルをみて全容がわかってしまうような人しか興味がないだろうという無駄さ加減なのですが，一応タイトルの通りな感じでやってみたのでメモ．&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote class=myInsert&gt;&lt;span style="font-weight:bold;"&gt;やってみた&lt;/span&gt;：&lt;br /&gt;&lt;blockquote class=myInsert2&gt;１．Google SketchUpでMeshを描く&lt;br /&gt;1-1 正方形を描く(正方形になったときはpopupで'正方形'って出る)&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/-fJ6sNRFUh40/TfynTFwnk9I/AAAAAAAAAko/258Mf4krRL0/s1600/1-1.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 258px;" src="http://2.bp.blogspot.com/-fJ6sNRFUh40/TfynTFwnk9I/AAAAAAAAAko/258Mf4krRL0/s320/1-1.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5619550381456987090"&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;1-2 押し出す&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/-tYd-Tp1g20s/TfynRuhxX4I/AAAAAAAAAkg/VpIP1iLAr1Q/s1600/1-2.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 258px;" src="http://2.bp.blogspot.com/-tYd-Tp1g20s/TfynRuhxX4I/AAAAAAAAAkg/VpIP1iLAr1Q/s320/1-2.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5619550358040829826"&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;1-3 全体を選択する&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/-txIxqOY1fBA/TfynQOjr1KI/AAAAAAAAAkY/HYQovFxNaV8/s1600/1-3.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 261px;" src="http://2.bp.blogspot.com/-txIxqOY1fBA/TfynQOjr1KI/AAAAAAAAAkY/HYQovFxNaV8/s320/1-3.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5619550332279051426"&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;1-4 コピー&amp;amp;ペーストして動かす(端点が合うと'端点'とpopupされ合わさった頂点が緑色にハイライトされる)&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/-PvLaJrzWD28/TfynPJTMJyI/AAAAAAAAAkQ/kK26YmE6lzA/s1600/1-4.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 259px;" src="http://3.bp.blogspot.com/-PvLaJrzWD28/TfynPJTMJyI/AAAAAAAAAkQ/kK26YmE6lzA/s320/1-4.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5619550313687820066"&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;1-5 繰り返す(今回は8個並べた)&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/-6x6jVTyg3a8/TfynC8-uKQI/AAAAAAAAAkI/GWZPCTBExTI/s1600/1-5.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 261px;" src="http://4.bp.blogspot.com/-6x6jVTyg3a8/TfynC8-uKQI/AAAAAAAAAkI/GWZPCTBExTI/s320/1-5.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5619550104222312706"&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;1-6 ファイル/エクスポート/3Dモデルで書き出す&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/-3QP4lzuth9s/Tfym_uqWVbI/AAAAAAAAAkA/azEHknKm1lg/s1600/1-6.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 245px;" src="http://3.bp.blogspot.com/-3QP4lzuth9s/Tfym_uqWVbI/AAAAAAAAAkA/azEHknKm1lg/s320/1-6.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5619550048839161266"&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;1-7 COLLADA形式を選択して書き出す&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/-zdveMsOO87o/Tfym9ucFRXI/AAAAAAAAAj4/ZXsK1W2RMRI/s1600/1-7.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 262px;" src="http://2.bp.blogspot.com/-zdveMsOO87o/Tfym9ucFRXI/AAAAAAAAAj4/ZXsK1W2RMRI/s320/1-7.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5619550014419584370"&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;1-8 プレビューでみてみる(出来上がった拡張子daeのファイルをダブルクリックで起動する)&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/-Kwnu87t_7NA/Tfym7LzL4UI/AAAAAAAAAjw/hUbCyTliBM8/s1600/1-8.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 220px;" src="http://2.bp.blogspot.com/-Kwnu87t_7NA/Tfym7LzL4UI/AAAAAAAAAjw/hUbCyTliBM8/s320/1-8.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5619549970761507138"&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;1-9 マウスでグリグリまわしてみる(そんなこともできる)&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/-ZMPqqbV4D3Y/Tfym5XeSSEI/AAAAAAAAAjo/rsFNDJYF3vE/s1600/1-9.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 220px;" src="http://2.bp.blogspot.com/-ZMPqqbV4D3Y/Tfym5XeSSEI/AAAAAAAAAjo/rsFNDJYF3vE/s320/1-9.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5619549939535333442"&gt;&lt;/a&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;blockquote class=myInsert2&gt;２．Quartz Composerで表示していく&lt;br /&gt;2-1 テンプレートから'Mesh Filter'を選ぶ&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/-Fjz_Xw7EE2c/TfypQqLCW3I/AAAAAAAAAlI/d4ma6G-SQJo/s1600/2-1.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 205px;" src="http://3.bp.blogspot.com/-Fjz_Xw7EE2c/TfypQqLCW3I/AAAAAAAAAlI/d4ma6G-SQJo/s320/2-1.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5619552538715118450"&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;2-2 テンプレートのEditorはこんな感じ&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/-wf60RldaOrU/TfypO4j3osI/AAAAAAAAAlA/yscNDyz-wuk/s1600/2-2.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 245px;" src="http://1.bp.blogspot.com/-wf60RldaOrU/TfypO4j3osI/AAAAAAAAAlA/yscNDyz-wuk/s320/2-2.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5619552508217631426"&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;2-3 1-7のファイルをドラッグ&amp;amp;ドロップでImportして繋ぐ&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/-o3nLVwT0b9E/TfypMascbjI/AAAAAAAAAk4/5F22CZ-nu2g/s1600/2-3.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 245px;" src="http://4.bp.blogspot.com/-o3nLVwT0b9E/TfypMascbjI/AAAAAAAAAk4/5F22CZ-nu2g/s320/2-3.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5619552465840795186"&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;2-4 Interpolationで位相を与えてみる&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/-ilIRPHMk4qg/TfypKty_acI/AAAAAAAAAkw/Ru-yD2AZU3c/s1600/2-4.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 245px;" src="http://4.bp.blogspot.com/-ilIRPHMk4qg/TfypKty_acI/AAAAAAAAAkw/Ru-yD2AZU3c/s320/2-4.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5619552436608788930"&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;2-5 Viewはこんな感じ&lt;br /&gt;&lt;object width="425" height="344"&gt;&lt;param name="movie" value="http://www.youtube.com/v/G_aInixWmtk?hl=ja&amp;fs=1"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/G_aInixWmtk?hl=ja&amp;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;blockquote class=myInsert2&gt;３．動かす軸を変えてみる&lt;br /&gt;3-1 OpenCL Kernelパッチである'SinWave'パッチのインスペクタを開く&lt;br /&gt;&lt;!--&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/-8mmEiDotub8/TfysBkmc8DI/AAAAAAAAAlg/Vv94CFDzC3E/s1600/3-1.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 238px;" src="http://1.bp.blogspot.com/-8mmEiDotub8/TfysBkmc8DI/AAAAAAAAAlg/Vv94CFDzC3E/s320/3-1.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5619555578056339506" /&gt;&lt;/a&gt;--&gt;&lt;br /&gt;&lt;br /&gt;3-2 選択してある所を修正('x'を'z'へ)&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/-em9r1CjTo40/TfyqtGxH3VI/AAAAAAAAAlQ/DlGrlCK7xMg/s1600/3-2.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 259px; height: 320px;" src="http://2.bp.blogspot.com/-em9r1CjTo40/TfyqtGxH3VI/AAAAAAAAAlQ/DlGrlCK7xMg/s320/3-2.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5619554126939020626" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;3-3 Viewはこんな感じ&lt;br /&gt;&lt;object width="425" height="344"&gt;&lt;param name="movie" value="http://www.youtube.com/v/ATyzBdp_8LA?hl=ja&amp;fs=1"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/ATyzBdp_8LA?hl=ja&amp;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4629086917523851821-7584105143960058407?l=edotprintstacktrace.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/vTPEFsuKc4zmgHhBiiMWF70tz7c/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/vTPEFsuKc4zmgHhBiiMWF70tz7c/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/vTPEFsuKc4zmgHhBiiMWF70tz7c/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/vTPEFsuKc4zmgHhBiiMWF70tz7c/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/KsjdY/~4/hUDhBLyqPMo" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://edotprintstacktrace.blogspot.com/feeds/7584105143960058407/comments/default" title="コメントの投稿" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=4629086917523851821&amp;postID=7584105143960058407" title="0 件のコメント" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4629086917523851821/posts/default/7584105143960058407?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4629086917523851821/posts/default/7584105143960058407?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/KsjdY/~3/hUDhBLyqPMo/quartz-composer-google-sketchupmesh.html" title="Quartz Composer / Google SketchUpで作ったMeshの頂点を動かしてみた" /><author><name>p_g_</name><uri>http://www.blogger.com/profile/15389208108068935129</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://4.bp.blogspot.com/_BA-iUzxIQks/SfAmPKs5kxI/AAAAAAAAAEw/ie6H2TZGF-M/S220/_____1.png" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/-fJ6sNRFUh40/TfynTFwnk9I/AAAAAAAAAko/258Mf4krRL0/s72-c/1-1.png" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://edotprintstacktrace.blogspot.com/2011/06/quartz-composer-google-sketchupmesh.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkQGRXY8cCp7ImA9WhZVE04.&quot;"><id>tag:blogger.com,1999:blog-4629086917523851821.post-4804325863327318323</id><published>2011-05-26T00:37:00.004+09:00</published><updated>2011-05-26T00:45:24.878+09:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-05-26T00:45:24.878+09:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Quartz Composer" /><category scheme="http://www.blogger.com/atom/ns#" term="Cocoa" /><title>Quartz Composer / QCViewからのスナップショット</title><content type="html">&lt;blockquote class=myInsert&gt;&lt;span style="font-weight:bold;"&gt;メモ&lt;/span&gt;&lt;br /&gt;[nsBitmapImageRep initWithFocusedViewRect:]や[nsView cacheDisplayInRect:toBitmapImageRep:]では背景色の四角形(QCViewサイズの)が出てくるだけだったので?と思ったら専用のメソッドがQCViewにあったのでメモ．&lt;br /&gt;&lt;blockquote class=myInsert2&gt;&lt;pre&gt;NSBitmapImageRep *imgRep= [qcView createSnapshotImageOfType:@"NSBitmapImageRep"];&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;引数の文字列はNSBitmapImageRep, NSImage, CIImage, CGImage, CVOpenGLBuffer, CVPixelBufferのどれかで返り値もそのインスタンスとなる．そうだ．&lt;/blockquote&gt;&lt;br /&gt;&lt;blockquote class=myInsert&gt;&lt;span style="font-weight:bold;"&gt;参考&lt;/span&gt;&lt;br /&gt;&lt;a href="http://developer.apple.com/library/mac/#documentation/graphicsimaging/Reference/QuartzFramework/Classes/QCView_Class/Reference/Reference.html"&gt;QCView Class Reference / createSnapshotImageOfType:&lt;/a&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4629086917523851821-4804325863327318323?l=edotprintstacktrace.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/YhEfEEfUpQrq0WWVyJpTyALlOvY/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/YhEfEEfUpQrq0WWVyJpTyALlOvY/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/YhEfEEfUpQrq0WWVyJpTyALlOvY/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/YhEfEEfUpQrq0WWVyJpTyALlOvY/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/KsjdY/~4/OTYczBut240" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://edotprintstacktrace.blogspot.com/feeds/4804325863327318323/comments/default" title="コメントの投稿" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=4629086917523851821&amp;postID=4804325863327318323" title="0 件のコメント" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4629086917523851821/posts/default/4804325863327318323?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4629086917523851821/posts/default/4804325863327318323?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/KsjdY/~3/OTYczBut240/quartz-composer-qcview.html" title="Quartz Composer / QCViewからのスナップショット" /><author><name>p_g_</name><uri>http://www.blogger.com/profile/15389208108068935129</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://4.bp.blogspot.com/_BA-iUzxIQks/SfAmPKs5kxI/AAAAAAAAAEw/ie6H2TZGF-M/S220/_____1.png" /></author><thr:total>0</thr:total><feedburner:origLink>http://edotprintstacktrace.blogspot.com/2011/05/quartz-composer-qcview.html</feedburner:origLink></entry></feed>

