<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-744605407212742108</id><updated>2012-02-17T08:02:25.797+09:00</updated><category term='Python'/><category term='コマンド'/><category term='Webサービス'/><category term='Game'/><category term='AmazonEC2'/><category term='twitterAPI'/><category term='XAMPP'/><category term='Ajax'/><category term='本'/><category term='Request'/><category term='JQuery'/><category term='経済'/><category term='Monster'/><category term='Mathematics'/><category term='Pydev'/><category term='物理'/><category term='Mac'/><category term='unicode'/><category term='eclipse'/><category term='Property'/><category term='Chart'/><category term='Datastore'/><category term='csv'/><category term='cron'/><category term='JSON'/><category term='Android'/><category term='ソーシャルメディア'/><category term='関数'/><category term='AmazonAPI'/><category term='HTML5'/><category term='プラットフォーム'/><category term='BeautifulSoup'/><category term='bulkloader'/><category term='phpMyAdmin'/><category term='Css'/><category term='MySQL'/><category term='Server'/><category term='GAE'/><category term='XML'/><category term='政治'/><category term='Session'/><category term='開発サーバ'/><category term='Java'/><category term='Search'/><category term='Blogger'/><category term='API'/><category term='アクセス権'/><category term='PHP'/><category term='Pac-Man'/><category term='ターミナル'/><category term='max'/><category term='Canvas'/><category term='OkWeb'/><category term='hatena'/><category term='Database'/><category term='Django'/><category term='pear'/><category term='Station'/><category term='国債'/><category term='音楽業界'/><category term='予算'/><category term='JavaScript'/><category term='cakePHP'/><category term='ERROR'/><category term='UGC'/><category term='Key'/><category term='Event'/><category term='消費税'/><category term='google'/><category term='rstrip'/><title type='text'>endo yuta blog</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://endoyuta.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/744605407212742108/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://endoyuta.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>endo yuta</name><uri>http://www.blogger.com/profile/05491646789675985410</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://1.bp.blogspot.com/-7dw9PlYIisc/TtuORirdBtI/AAAAAAAAAYc/kr_xs7ruXrU/s220/slime.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>99</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-744605407212742108.post-787943513627908925</id><published>2012-01-31T23:56:00.000+09:00</published><updated>2012-01-31T23:58:02.920+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='JQuery'/><category scheme='http://www.blogger.com/atom/ns#' term='Css'/><title type='text'>CSS - jQueryで垂直中央に配置する</title><content type='html'>jQueryを使ってボタンを親要素の高さの真ん中に配置したいと思います。単純なことですが、ちょっとはまったので、切り出して試しました。cssでheightを100%にするの忘れてたり、jQueryでtopを設定するときに'px'の２文字を入れ忘れたりしていただけでしたが、せっかく切り出して試したのでメモります。&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-lEChQdpKscs/Tyf_k4FR6NI/AAAAAAAAAhI/Bsi4whxaTBU/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%25882012-01-31%2B23.48.57%25EF%25BC%2589.png" imageanchor="1" style="margin-left:1em; margin-right:1em"&gt;&lt;img border="0" height="156" width="400" src="http://2.bp.blogspot.com/-lEChQdpKscs/Tyf_k4FR6NI/AAAAAAAAAhI/Bsi4whxaTBU/s400/%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%25882012-01-31%2B23.48.57%25EF%25BC%2589.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;下記のコードはブラウザで上記のような画面になります。まさしくボタンが中央に配置されています。&lt;br /&gt;&lt;h4&gt;Html&lt;/h4&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;&amp;lt;div id=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;     &amp;lt;ul&amp;gt;&lt;br /&gt;          &amp;lt;li class=&amp;quot;a&amp;quot;&amp;gt;aaaaaa&lt;br /&gt;          &amp;lt;li class=&amp;quot;b&amp;quot;&amp;gt;bbbbbb&lt;br /&gt;          &amp;lt;li class=&amp;quot;c&amp;quot;&amp;gt;&amp;lt;input id=&amp;quot;btn&amp;quot; type=&amp;quot;button&amp;quot; value=&amp;quot;cccccc&amp;quot; /&amp;gt;&lt;br /&gt;     &amp;lt;/ul&amp;gt;&lt;br /&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;h4&gt;css&lt;/h4&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;#box{&lt;br /&gt;     height:150px;&lt;br /&gt;     background-color:#333;&lt;br /&gt;     width:400px;&lt;br /&gt;}&lt;br /&gt;ul{&lt;br /&gt;     margin:0;&lt;br /&gt;     padding:0 10px;&lt;br /&gt;     list-style-type: none;&lt;br /&gt;     height:100%;&lt;br /&gt;}&lt;br /&gt;li{&lt;br /&gt;     float:left;&lt;br /&gt;}&lt;br /&gt;.a{&lt;br /&gt;     width:100px;&lt;br /&gt;     background-color:#f00;&lt;br /&gt;     height:100%;&lt;br /&gt;}&lt;br /&gt;.b{&lt;br /&gt;     width:150px;&lt;br /&gt;     background-color:#0f0;&lt;br /&gt;}&lt;br /&gt;.c{&lt;br /&gt;     width:100px;&lt;br /&gt;     background-color:#00f;&lt;br /&gt;     height:100%;&lt;br /&gt;     position:relative;&lt;br /&gt;}&lt;br /&gt;#btn{&lt;br /&gt;     position:absolute;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;h4&gt;javascript&lt;/h4&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;$(function(){&lt;br /&gt;     $(document).ready(function(){&lt;br /&gt;          var btnh = $('#btn').outerHeight(true);&lt;br /&gt;          var ch = $('.c').outerHeight(true);&lt;br /&gt;          $('#btn').css('top',(ch-btnh)/2+'px');&lt;br /&gt;     });&lt;br /&gt;});&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/744605407212742108-787943513627908925?l=endoyuta.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://endoyuta.blogspot.com/feeds/787943513627908925/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://endoyuta.blogspot.com/2012/01/css-jquery.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/744605407212742108/posts/default/787943513627908925'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/744605407212742108/posts/default/787943513627908925'/><link rel='alternate' type='text/html' href='http://endoyuta.blogspot.com/2012/01/css-jquery.html' title='CSS - jQueryで垂直中央に配置する'/><author><name>endo yuta</name><uri>http://www.blogger.com/profile/05491646789675985410</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://1.bp.blogspot.com/-7dw9PlYIisc/TtuORirdBtI/AAAAAAAAAYc/kr_xs7ruXrU/s220/slime.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-lEChQdpKscs/Tyf_k4FR6NI/AAAAAAAAAhI/Bsi4whxaTBU/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%25882012-01-31%2B23.48.57%25EF%25BC%2589.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-744605407212742108.post-1166609204653657206</id><published>2012-01-30T03:11:00.000+09:00</published><updated>2012-01-30T21:47:23.596+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='JQuery'/><category scheme='http://www.blogger.com/atom/ns#' term='Css'/><title type='text'>jQuery+CSS3サンプル</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-HxX08V78KwU/TyaLOeqzCCI/AAAAAAAAAg8/EmOptxNAIL8/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%25882012-01-30%2B21.19.53%25EF%25BC%2589.png" imageanchor="1" style="clear:left; float:left;margin-right:1em; margin-bottom:1em"&gt;&lt;img border="0" height="239" width="320" src="http://1.bp.blogspot.com/-HxX08V78KwU/TyaLOeqzCCI/AAAAAAAAAg8/EmOptxNAIL8/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%25882012-01-30%2B21.19.53%25EF%25BC%2589.png" /&gt;&lt;/a&gt;&lt;/div&gt;jQueryとCSS3を使ったサイトのサンプルを作ってみました。&lt;br /&gt;&lt;br /&gt;jQueryをちょっとばかにしてたけどかなり色々できて面白い。スマホだとIE対応等の為に重くなっているらしいので、もっと軽いjQueryみたいなやつが沢山でているそうです。同じような使い方であることを祈ります。&lt;br /&gt;&lt;br /&gt;このサンプルは、&lt;a href="http://endo-yuta.appspot.com/practice13" target="_blank"&gt;ここ&lt;/a&gt;で見られます。&lt;br /&gt;&lt;br /&gt;このサンプルは、画面がロードされるとメニューが横から飛んできます。メニューはアコーディオンになっていて、アクティブなメニューと非アクティブなメニューで色分けされます。後は、ローダーも&lt;a href="http://www.jqueryin.com/projects/spinner-jquery-preloader-plugin/" target="_blank"&gt;spinner&lt;/a&gt;というプラグインを使って入れてみました。このプラグインは分かり易いし便利です。あとは、ポップアップしてFacebookみたいに登録完了を告げてちょっとしたらポップアップが消えていくようにしました。インターネットが重い場合は、最初のメニューが横から飛んでくる前に画面に表示されちゃうかもしれません。最初は透明にするなりしておけばよかった。&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;h4&gt;html&lt;/h4&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;&amp;lt;!DOCTYPE html&amp;gt; &lt;br /&gt;&amp;lt;html&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;head&amp;gt;&lt;br /&gt;&amp;lt;meta http-equiv=&amp;quot;Content-Type&amp;quot; content=&amp;quot;text/html; charset=utf-8&amp;quot; /&amp;gt;&lt;br /&gt;&amp;lt;title&amp;gt;HTML5 Test&amp;lt;/title&amp;gt;&lt;br /&gt;&amp;lt;link href='http://fonts.googleapis.com/css?family=Fascinate|Sirin+Stencil|Walter+Turncoat|Medula+One|Coming+Soon|Sunshiney|Quantico' rel='stylesheet' type='text/css'&amp;gt;&lt;br /&gt;&amp;lt;link rel=&amp;quot;stylesheet&amp;quot; type=&amp;quot;text/css&amp;quot; href=&amp;quot;./css/p13.css&amp;quot; /&amp;gt;&lt;br /&gt;&amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;http://ajax.googleapis.com/ajax/libs/jquery/1.4.1/jquery.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;./js/jquery.spinner.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;./js/p13.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&amp;lt;/head&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;body&amp;gt;&lt;br /&gt;&amp;lt;div id=&amp;quot;box1&amp;quot;&amp;gt;&lt;br /&gt;&amp;lt;h1 id=&amp;quot;t&amp;quot;&amp;gt;&amp;lt;a href=&amp;quot;./&amp;quot;&amp;gt;TEST&amp;lt;/a&amp;gt;&amp;lt;/h1&amp;gt;&lt;br /&gt;&amp;lt;div id=&amp;quot;box2&amp;quot;&amp;gt;&lt;br /&gt;&amp;lt;div class=&amp;quot;m&amp;quot; id=&amp;quot;a&amp;quot;&amp;gt;aaaaaa&amp;lt;/div&amp;gt;&lt;br /&gt;&amp;lt;div class=&amp;quot;smb&amp;quot;&amp;gt;&lt;br /&gt;    &amp;lt;div class=&amp;quot;sm&amp;quot; id=&amp;quot;a1&amp;quot;&amp;gt;111111&amp;lt;/div&amp;gt;&lt;br /&gt;    &amp;lt;div id=&amp;quot;a1c&amp;quot;&amp;gt;&amp;lt;form action=&amp;quot;&amp;quot; method=&amp;quot;post&amp;quot;&amp;gt;&lt;br /&gt;        HogeWord &amp;lt;input type=&amp;quot;text&amp;quot; id=&amp;quot;a1t&amp;quot; /&amp;gt;&lt;br /&gt;        &amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;submit&amp;quot; id=&amp;quot;a1s&amp;quot; /&amp;gt;&amp;lt;/form&amp;gt;&lt;br /&gt;        &amp;lt;div id=&amp;quot;a1cc&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;    &amp;lt;/div&amp;gt;&lt;br /&gt;    &amp;lt;div class=&amp;quot;sm&amp;quot; id=&amp;quot;a2&amp;quot;&amp;gt;222222&amp;lt;/div&amp;gt;&lt;br /&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&amp;lt;div class=&amp;quot;m&amp;quot; id=&amp;quot;b&amp;quot;&amp;gt;bbbbbb&amp;lt;/div&amp;gt;&lt;br /&gt;&amp;lt;div class=&amp;quot;m&amp;quot; id=&amp;quot;c&amp;quot;&amp;gt;cccccc&amp;lt;/div&amp;gt;&lt;br /&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&amp;lt;/body&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/html&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;h4&gt;p13.css&lt;/h4&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;body {&lt;br /&gt;    background: #000;&lt;br /&gt;    color: #fff;&lt;br /&gt;    font-family: 'Quantico', cursive;&lt;br /&gt;    font-size:13px;&lt;br /&gt;    margin: 5px;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;a{&lt;br /&gt;    color:#fa0;&lt;br /&gt;    text-decoration:none;&lt;br /&gt;}&lt;br /&gt;h1, h2, h3, h4 {&lt;br /&gt;    font-weight: normal;&lt;br /&gt;    margin:0;&lt;br /&gt;}&lt;br /&gt;h1#t{&lt;br /&gt;    text-shadow:0 0 1px #fff,0 0 3px #0ac,0 0 5px #0ac,0 0 7px #0cf,0 0 9px #0cf;&lt;br /&gt;    margin:20px 0 10px 0;&lt;br /&gt;}&lt;br /&gt;h1#t a{color:#fff;}&lt;br /&gt;&lt;br /&gt;#box1{&lt;br /&gt;    margin:0 auto;&lt;br /&gt;    width:600px;&lt;br /&gt;    height:100%;&lt;br /&gt;    padding:0 0 5px 5px;&lt;br /&gt;    text-align:center;&lt;br /&gt;}&lt;br /&gt;#box2{&lt;br /&gt;    position:relative;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;.m{&lt;br /&gt;    color:#000;&lt;br /&gt;    background-color:#666;&lt;br /&gt;    padding:3px;&lt;br /&gt;    margin: 0 0 10px 0;&lt;br /&gt;    position:relative;&lt;br /&gt;    height:40px;&lt;br /&gt;    cursor:pointer;&lt;br /&gt;    border-top-left-radius:10px;&lt;br /&gt;    border-top-right-radius:10px;&lt;br /&gt;    border-bottom-left-radius:10px;&lt;br /&gt;    border-bottom-right-radius:10px;&lt;br /&gt;    background: -moz-linear-gradient(left top, #f0a,#fa0 50%,#0f0);&lt;br /&gt;    background: -webkit-gradient(linear,left top,right bottom,from(#f0a),color-stop(0.5,#fa0),to(#0f0));&lt;br /&gt;}&lt;br /&gt;.mn{&lt;br /&gt;    background: -moz-linear-gradient(left top, #111,#666 50%,#111);&lt;br /&gt;    background: -webkit-gradient(linear,left top,right bottom,from(#111),color-stop(0.5,#666),to(#111));&lt;br /&gt;    color:#999;&lt;br /&gt;}&lt;br /&gt;.mh{&lt;br /&gt;    background: -moz-linear-gradient(left top, #f3c,#fc3 50%,#3f3);&lt;br /&gt;    background: -webkit-gradient(linear,left top,right bottom,from(#f3c),color-stop(0.5,#fc3),to(#3f3));&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;.smb{&lt;br /&gt;    display:none;&lt;br /&gt;}&lt;br /&gt;.sm{&lt;br /&gt;    color:#000;&lt;br /&gt;    background-color:#666;&lt;br /&gt;    padding:3px;&lt;br /&gt;    margin: 0 0 10px 0;&lt;br /&gt;    position:relative;&lt;br /&gt;    height:20px;&lt;br /&gt;    cursor:pointer;&lt;br /&gt;    border-top-left-radius:10px;&lt;br /&gt;    border-top-right-radius:10px;&lt;br /&gt;    border-bottom-left-radius:10px;&lt;br /&gt;    border-bottom-right-radius:10px;&lt;br /&gt;    background: -moz-linear-gradient(left top, #345,#9dd 50%,#345);&lt;br /&gt;    background: -webkit-gradient(linear,left top,right bottom,from(#345),color-stop(0.5,#9dd),to(#345));&lt;br /&gt;}&lt;br /&gt;.smh{&lt;br /&gt;    background: -moz-linear-gradient(left top, #567,#bff 50%,#567);&lt;br /&gt;    background: -webkit-gradient(linear,left top,right bottom,from(#567),color-stop(0.5,#bff),to(#567));&lt;br /&gt;}&lt;br /&gt;#a1c{&lt;br /&gt;    display:none;&lt;br /&gt;}&lt;br /&gt;#a1c form{&lt;br /&gt;    margin:10px;&lt;br /&gt;}&lt;br /&gt;#a1cc{&lt;br /&gt;    text-align:left;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;.subox{&lt;br /&gt;    position:relative;&lt;br /&gt;    display:none;&lt;br /&gt;    margin:0 20px;&lt;br /&gt;    border-bottom:1px solid #ccc;&lt;br /&gt;    width:560px;&lt;br /&gt;}&lt;br /&gt;.subox ul{&lt;br /&gt;    margin:0;&lt;br /&gt;    padding:0 10px;&lt;br /&gt;    list-style-type: none;&lt;br /&gt;}&lt;br /&gt;.sbn{&lt;br /&gt;    float:left;&lt;br /&gt;    padding:0;margin:0;&lt;br /&gt;    width:450px;&lt;br /&gt;}&lt;br /&gt;.sbb{&lt;br /&gt;    float:left;&lt;br /&gt;    padding:0;margin:0;&lt;br /&gt;    width:90px;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;.popup{&lt;br /&gt;    font-size:12px;&lt;br /&gt;    color:#000;&lt;br /&gt;    background-color:#fff;&lt;br /&gt;    top:0px;&lt;br /&gt;    left:450px;&lt;br /&gt;    display:none;&lt;br /&gt;    position:absolute;&lt;br /&gt;    padding:2px;&lt;br /&gt;    border-top-left-radius:3px;&lt;br /&gt;    border-top-right-radius:3px;&lt;br /&gt;    border-bottom-left-radius:3px;&lt;br /&gt;    border-bottom-right-radius:3px;&lt;br /&gt;    background: -moz-linear-gradient(left top, #ccc,#fff 50%,#ccc);&lt;br /&gt;    background: -webkit-gradient(linear,left top,right bottom,from(#ccc),color-stop(0.5,#fff),to(#ccc));&lt;br /&gt;    z-index:10;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;.clearfix:after{display:block; clear:both; height:0; line-height:0; visibility:hidden;&lt;br /&gt;    content:&amp;quot;.&amp;quot;; font-size:0.1em;}&lt;br /&gt;.clearfix{display:inline-block;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;h4&gt;p13.js&lt;/h4&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;$(function(){&lt;br /&gt;    $(document).ready(function(){set_menu();});&lt;br /&gt;    $('.m').mouseover(function(){hover_menu($(this));})&lt;br /&gt;        .mouseout(function(){hover_menu($(this));});&lt;br /&gt;    $('.m').click(function(){open_menu($(this).attr('id'));});&lt;br /&gt;    $('.sm').live('mouseover',function(){hover_sm($(this));})&lt;br /&gt;        .live('mouseout',function(){hover_sm($(this));});&lt;br /&gt;    $('#a1').live('click',function(){a1();});&lt;br /&gt;    $('#a1s').live('click',function(){a1s();return false;});&lt;br /&gt;    $('.b').live('click',function(){b($(this).attr('name'));});&lt;br /&gt;});&lt;br /&gt;&lt;br /&gt;function set_menu(){&lt;br /&gt;    var x = getx($('.m'));&lt;br /&gt;    $('.m').css('left',x).show();&lt;br /&gt;    $('#a').animate({left:'0'},'first','swing',function(){&lt;br /&gt;        $('#b').animate({left:'0'},'first','swing',function(){&lt;br /&gt;            $('#c').animate({left:'0'},'first','swing');&lt;br /&gt;        });&lt;br /&gt;    });&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function hover_menu(th){&lt;br /&gt;    th.toggleClass('mh');&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function open_menu(id){&lt;br /&gt;    var num_mn = $('.mn').size();&lt;br /&gt;    var num_m = $('.m').size();&lt;br /&gt;    if(num_mn &amp;gt; 0) $('.m[id=&amp;quot;'+id+'&amp;quot;]').toggleClass('mn');&lt;br /&gt;    $('.m[id!=&amp;quot;'+id+'&amp;quot;]').addClass('mn');&lt;br /&gt;    num_mn = $('.mn').size();&lt;br /&gt;    if(num_mn==num_m) $('.m').removeClass('mn');&lt;br /&gt;    &lt;br /&gt;    $('.m[id=&amp;quot;'+id+'&amp;quot;]+.smb').slideToggle('first');&lt;br /&gt;    $('.m[id!=&amp;quot;'+id+'&amp;quot;]+.smb').slideUp('first');&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function hover_sm(th){&lt;br /&gt;    th.toggleClass('smh');&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function a1(){&lt;br /&gt;    $('#a1c').slideToggle('first');&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function a1s(){&lt;br /&gt;    if(!($('#a1t').val())) return;&lt;br /&gt;    var opts = {&lt;br /&gt;        position: 'center',&lt;br /&gt;        hide: true,&lt;br /&gt;        onFinish: function(){a1cc($('#a1t').val());}&lt;br /&gt;    };&lt;br /&gt;    $('#a1s').spinner(opts);&lt;br /&gt;    setTimeout(function() {&lt;br /&gt;        $('#a1s').spinner('remove');&lt;br /&gt;    }, 1000);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function a1cc(val){&lt;br /&gt;    $('#a1cc').empty();&lt;br /&gt;    for(var i=0;i&amp;lt;5;i++){&lt;br /&gt;        $('#a1cc').append('&amp;lt;div class=&amp;quot;subox clearfix&amp;quot;&amp;gt;&amp;lt;ul&amp;gt;&amp;lt;li class=&amp;quot;sbn&amp;quot;&amp;gt;'+val+i+'&amp;lt;li class=&amp;quot;sbb&amp;quot;&amp;gt;&amp;lt;input type=&amp;quot;button&amp;quot; class=&amp;quot;b&amp;quot; name=&amp;quot;'+i+'&amp;quot; value=&amp;quot;put&amp;quot; /&amp;gt;&amp;lt;/ul&amp;gt;&amp;lt;/div&amp;gt;');&lt;br /&gt;    }&lt;br /&gt;    var x = getx($('.subox'));&lt;br /&gt;    $('.subox').each(function(idx,ele){&lt;br /&gt;        $(this).css('left',x-100*idx).show().animate({left:'0'},'slow','swing');&lt;br /&gt;    });&lt;br /&gt;    &lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function b(name){&lt;br /&gt;    var opts = {&lt;br /&gt;        position: 'center',&lt;br /&gt;        hide: true,&lt;br /&gt;        onFinish: function(){popup($('.b[name=&amp;quot;'+name+'&amp;quot;]'));}&lt;br /&gt;    };&lt;br /&gt;    $('.b[name=&amp;quot;'+name+'&amp;quot;]').spinner(opts);&lt;br /&gt;    setTimeout(function() {&lt;br /&gt;        $('.b[name=&amp;quot;'+name+'&amp;quot;]').spinner('remove');&lt;br /&gt;    }, 1000);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function popup(th){&lt;br /&gt;    th.after('&amp;lt;div class=&amp;quot;popup&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;')&lt;br /&gt;        .next().append('登録しました')&lt;br /&gt;        .fadeIn('slow',function(){&lt;br /&gt;            setTimeout(function(){&lt;br /&gt;                th.next().fadeOut('slow');&lt;br /&gt;            },1000);&lt;br /&gt;        });&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function getx(ele){&lt;br /&gt;    var c = $('#container').outerWidth(true);&lt;br /&gt;    var w = getw();&lt;br /&gt;    if(w&amp;gt;c){&lt;br /&gt;        return (w-c)*-0.5-ele.outerWidth(true)-50;&lt;br /&gt;    }else{&lt;br /&gt;        return -ele.outerWidth(true)-50;&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function getw ( ) {&lt;br /&gt;    if ( window.innerWidth ) { return window.innerWidth; }&lt;br /&gt;    else if ( document.documentElement &amp;amp;&amp;amp; document.documentElement.clientWidth != 0 ) { return document.documentElement.clientWidth; }&lt;br /&gt;    else if ( document.body ) { return document.body.clientWidth; }&lt;br /&gt;    return 0;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/744605407212742108-1166609204653657206?l=endoyuta.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://endoyuta.blogspot.com/feeds/1166609204653657206/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://endoyuta.blogspot.com/2012/01/css3-jquery.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/744605407212742108/posts/default/1166609204653657206'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/744605407212742108/posts/default/1166609204653657206'/><link rel='alternate' type='text/html' href='http://endoyuta.blogspot.com/2012/01/css3-jquery.html' title='jQuery+CSS3サンプル'/><author><name>endo yuta</name><uri>http://www.blogger.com/profile/05491646789675985410</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://1.bp.blogspot.com/-7dw9PlYIisc/TtuORirdBtI/AAAAAAAAAYc/kr_xs7ruXrU/s220/slime.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-HxX08V78KwU/TyaLOeqzCCI/AAAAAAAAAg8/EmOptxNAIL8/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%25882012-01-30%2B21.19.53%25EF%25BC%2589.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-744605407212742108.post-5114216834848373471</id><published>2012-01-29T16:28:00.000+09:00</published><updated>2012-01-29T16:28:29.568+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='消費税'/><category scheme='http://www.blogger.com/atom/ns#' term='予算'/><category scheme='http://www.blogger.com/atom/ns#' term='国債'/><category scheme='http://www.blogger.com/atom/ns#' term='政治'/><title type='text'>消費税増税</title><content type='html'>国には予算があり、予算に基づいて僕らにいいことしてくれます。でも&lt;a href="http://jp.reuters.com/article/topNews/idJPTYE7BN00R20111224"&gt;予算が税収を大きく上回っております&lt;/a&gt;。&lt;blockquote&gt;１２年度予算案の一般会計総額は９０兆３３３９億円。新規国債発行額は４４兆２４４０億円と政府の財政健全化目標を守ったが、国債への依存度は４９．０％とほぼ半分に達し、当初予算ベースで過去最悪を更新した。過去に編成した補正予算も含めると、国債発行額が税収見通しを上回るのは４年連続。&lt;/blockquote&gt;税収が40兆円くらいしかないから、国債を予算の穴埋めをするために新規で44兆円発行したのかなと思ってるんだけどあってるかな？でも&lt;a href="http://www.nikkeibp.co.jp/article/column/20110216/260421/?ST=business&amp;P=1"&gt;これ&lt;/a&gt;見ると国は特別会計っていうのがあって、ひっくるめると１年間で２２０兆円使ってるらしい。なんだか分からなくなてきた。国債の利払いとかも特別会計なのかしら。もうちょい調べないと全然わからないや。なにしろ、金ないし、借金も限界やし、税金もっととらないとどうしようもないし、一番インパクトあるのは消費税やし、ということまでは分かったと言えるのだろうか？でも消費税増税しても、220兆円から考えるとまだインパクト少ないし、これから全体的にどうするのかは分からんし、ということだろうか？&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/744605407212742108-5114216834848373471?l=endoyuta.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://endoyuta.blogspot.com/feeds/5114216834848373471/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://endoyuta.blogspot.com/2012/01/blog-post_29.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/744605407212742108/posts/default/5114216834848373471'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/744605407212742108/posts/default/5114216834848373471'/><link rel='alternate' type='text/html' href='http://endoyuta.blogspot.com/2012/01/blog-post_29.html' title='消費税増税'/><author><name>endo yuta</name><uri>http://www.blogger.com/profile/05491646789675985410</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://1.bp.blogspot.com/-7dw9PlYIisc/TtuORirdBtI/AAAAAAAAAYc/kr_xs7ruXrU/s220/slime.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-744605407212742108.post-4379859912393324558</id><published>2012-01-22T14:41:00.000+09:00</published><updated>2012-01-22T14:46:13.586+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MySQL'/><category scheme='http://www.blogger.com/atom/ns#' term='PHP'/><category scheme='http://www.blogger.com/atom/ns#' term='cakePHP'/><category scheme='http://www.blogger.com/atom/ns#' term='Database'/><title type='text'>cakePHP1.3でデータベース操作の研究（MySQL）（２）</title><content type='html'>今回はまだ調べてないデータベース操作を試してみます。試したいのは、テーブルを検索するときにフィールドの条件にリストを使うこと。リストを使う場合に部分一致が可能かどうかというのも試したい。あと、日付関連のデータをテーブルに格納する最適な方法と、格納されたテーブルの最適な検索等の方法を調べたい。&lt;br /&gt;&lt;br /&gt;今回は、&lt;a href="http://endoyuta.blogspot.com/2012/01/cakephp13mysql.html"&gt;前回&lt;/a&gt;の英単語帳ではなく極めてシンプルなテーブル構成にしたい。テーブルは１つだけあり、名前はusersである。cakePHPのモデル名はよってUserになる。ちなみにモデルのファイル名は、user.phpである。フィールドは、id、name、have、wantの４フィールドを持つ。idはプライマリキーでauto_incrementにする。単なるテストなので、idは適当にmediumint(9)にしてある。nameはvarchar(50)で、haveとwantはtextにした。&lt;br /&gt;&lt;br /&gt;今回のお試し用に作成した、test_controller.phpの全文は下記のとおり。&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;&amp;lt;?php &lt;br /&gt;class TestController extends AppController{&lt;br /&gt;    public $name = 'test';&lt;br /&gt;    public $uses = array('User');&lt;br /&gt; &lt;br /&gt;    public function index(){&lt;br /&gt;        $this-&amp;gt;del();&lt;br /&gt;        $this-&amp;gt;put_user();&lt;br /&gt;        $result = $this-&amp;gt;search();&lt;br /&gt;        $this-&amp;gt;set('result',$result);&lt;br /&gt;    }&lt;br /&gt; &lt;br /&gt;    private function put_user(){&lt;br /&gt;        $put_cnt = 2;&lt;br /&gt;        for($i=0;$i&amp;lt;$put_cnt;$i++){&lt;br /&gt;            if($i==0){&lt;br /&gt;                $data = array('User' =&amp;gt; array(&lt;br /&gt;                    'name' =&amp;gt; $i,&lt;br /&gt;                    'have' =&amp;gt; '1,2,3,4',&lt;br /&gt;                    'want' =&amp;gt; '5,6,7,8'&lt;br /&gt;                ));&lt;br /&gt;            }else{&lt;br /&gt;                $data = array('User' =&amp;gt; array(&lt;br /&gt;                    'name' =&amp;gt; $i,&lt;br /&gt;                    'have' =&amp;gt; '5',&lt;br /&gt;                    'want' =&amp;gt; '1'&lt;br /&gt;                ));&lt;br /&gt;            }&lt;br /&gt;            $this-&amp;gt;User-&amp;gt;create();&lt;br /&gt;            $this-&amp;gt;User-&amp;gt;save($data);&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt; &lt;br /&gt;    private function del(){&lt;br /&gt;        $user = $this-&amp;gt;User-&amp;gt;find('all',null);&lt;br /&gt;        foreach($user as $u){&lt;br /&gt;            $this-&amp;gt;User-&amp;gt;delete($u['User']['id']);&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt; &lt;br /&gt;    private function search(){&lt;br /&gt;        $user = $this-&amp;gt;User-&amp;gt;findByName('0');&lt;br /&gt;        $list_h = $this-&amp;gt;str_to_list($user['User']['have']);&lt;br /&gt;        $list_w = $this-&amp;gt;str_to_list($user['User']['want']);&lt;br /&gt; &lt;br /&gt;        $params = array(&lt;br /&gt;            'conditions' =&amp;gt; array(&lt;br /&gt;                'User.have' =&amp;gt; $list_w,&lt;br /&gt;                'User.want' =&amp;gt; $list_h&lt;br /&gt;        ));&lt;br /&gt;        $user = $this-&amp;gt;User-&amp;gt;find('all',$params);&lt;br /&gt;        return $user;&lt;br /&gt;    }&lt;br /&gt; &lt;br /&gt;    private function str_to_list($str){&lt;br /&gt;        if($str == ''){&lt;br /&gt;            return array();&lt;br /&gt;        }else{&lt;br /&gt;            return split(&amp;quot;,&amp;quot;, $str);&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;?&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;indexにアクセスする度に全データが削除されて、put_userに指定されたとおりにユーザが作成される。上記だと２ユーザ作成される。haveとwantにそれぞれ指定の文字列を格納している。文字列は数字をカンマ区切りで繋げたものになっている。ユーザを作成したら、一番最初に作成されたユーザ（name==0)のhaveとwantを取り出し、それぞれ、カンマ区切り文字列をリストに変換している。変換したリストを使ってユーザデータを検索している。その検索結果をViewにセットして終了。&lt;br /&gt;&lt;br /&gt;上記はうまくいった。findのconditionsに、リストを使うこと自体は全く問題ないのだ。しかし、これは部分一致ではないようだ。リストの各要素と完全に一致する場合のみヒットしている。部分一致といえばLikeというのがあるが、試したところエラーになった。&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;SQL Error: 1064: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'IN ('5', '6', '7', '8') AND `User`.`want` LIKE IN ('1', '2', '3', '4')' at line 1 [CORE/cake/libs/model/datasources/dbo_source.php, line 684]&lt;/pre&gt;&lt;br /&gt;リストを使うとSQL的にはIN(1,2,3)というような文を使うことになるようだ。どうもこのINにはLikeは使えないらしい。INでなければLikeは使えた。あとは正規表現だなと思って調べたところ一応あるらしい。結構簡単そうだ。Likeよりも強力なRLIKEだ。REGEXPが正式名称っぽいがどっちでもいいらしいので、簡単なRLIKEにしたいと思う。とはいえこれも恐らくINには使えないだろう。一応試してみよう。&lt;br /&gt;&lt;br /&gt;やっぱり使えなかった。ということは、部分一致をリストで使う場合は、リストを使わずに正規表現だけでやらないといけないのだ。それならきっとできるだろう。正規表現にはこういう表記法がある。'abc|ab'これはabcかabにマッチするのだ。でもこれは連続して使えるのかな？使えなそうだ。どうしたらいいのだ！？まあ一応試してみよう。&lt;br /&gt;&lt;br /&gt;おお！エラーがでない！SQLではこうなってるようだ。どうやらこれでいいようだ。&lt;pre&gt;SELECT `User`.`id`, `User`.`name`, `User`.`have`, `User`.`want` FROM `users` AS `User` WHERE `User`.`have` REGEXP '5|6|7|8' AND `User`.`want` REGEXP '1|2|3|4'&lt;/pre&gt;&lt;br /&gt;ということは、ユーザのhaveとwantの文字列を最初からカンマ区切りではなくて、"|"区切りにしておけば実に効率的だろう。一応試してみよう。修正版のコントローラー全文は下記になります。&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;&amp;lt;?php &lt;br /&gt;class TestController extends AppController{&lt;br /&gt;    public $name = 'test';&lt;br /&gt;    public $uses = array('User');&lt;br /&gt;    &lt;br /&gt;    public function index(){&lt;br /&gt;        $this-&amp;gt;del();&lt;br /&gt;        $this-&amp;gt;put_user();&lt;br /&gt;        $result = $this-&amp;gt;search();&lt;br /&gt;        $this-&amp;gt;set('result',$result);&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    private function put_user(){&lt;br /&gt;        $put_cnt = 2;&lt;br /&gt;        for($i=0;$i&amp;lt;$put_cnt;$i++){&lt;br /&gt;            if($i==0){&lt;br /&gt;                $data = array('User' =&amp;gt; array(&lt;br /&gt;                    'name'    =&amp;gt; $i,&lt;br /&gt;                    'have'    =&amp;gt; '1|2|3|4',&lt;br /&gt;                    'want'    =&amp;gt; '5|6|7|8'&lt;br /&gt;                ));&lt;br /&gt;            }else{&lt;br /&gt;                $data = array('User' =&amp;gt; array(&lt;br /&gt;                    'name'    =&amp;gt; $i,&lt;br /&gt;                    'have'    =&amp;gt; '5|6',&lt;br /&gt;                    'want'    =&amp;gt; '7|8|1'&lt;br /&gt;                ));&lt;br /&gt;            }&lt;br /&gt;            $this-&amp;gt;User-&amp;gt;create();&lt;br /&gt;            $this-&amp;gt;User-&amp;gt;save($data);&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    private function del(){&lt;br /&gt;        $user = $this-&amp;gt;User-&amp;gt;find('all',null);&lt;br /&gt;        foreach($user as $u){&lt;br /&gt;            $this-&amp;gt;User-&amp;gt;delete($u['User']['id']);&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    private function search(){&lt;br /&gt;        $user = $this-&amp;gt;User-&amp;gt;findByName('0');&lt;br /&gt;        &lt;br /&gt;        $params = array(&lt;br /&gt;            'conditions' =&amp;gt; array(&lt;br /&gt;                'User.have REGEXP'    =&amp;gt; $user['User']['want'],&lt;br /&gt;                'User.want REGEXP'    =&amp;gt; $user['User']['have']&lt;br /&gt;        ));&lt;br /&gt;        $user = $this-&amp;gt;User-&amp;gt;find('all',$params);&lt;br /&gt;        return $user;&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;?&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;これもうまくいった。めでたい。とはいえこれにも問題はある。"|"で区切られた数字が何らかのidだとして、そのidに、"1"と"11"が存在しうるのであれば、これには問題がありんす。条件が'1|2|3'であれば、文字列'11|22|33'はマッチするのだ。桁数が統一のid等であれば使えるだろう。あと、ちなみにREGEXPだとうまくいったが、RLIKEだとエラーになった。REGEXPがいいらしい。&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;日付関連のデータ&lt;/h4&gt;次は日付関連のデータになります。テーブルを作成した日時とか更新した日時とかを入れておいて新しい順に表示するとか、古い順に削除するとかそういうことをしたい場合に使います。もちろん、作成日時とか更新日時とかを表示したい場合も使います。さて、いつかどこかのサイトで超簡単にやれる方法をちらっと見た気がするのでそれを探してきます。どこだったかなあ。&lt;br /&gt;&lt;br /&gt;ありました！&lt;a href="http://book.cakephp.org/1.3/ja/view/1015/created-%E3%81%A8-modified"&gt;3.7.2.3 created と modified&lt;/a&gt;にありました。このページに下記のように記載されています。&lt;blockquote&gt;データベースのテーブル内で datetime フィールドとして created または modified フィールドを定義すると、CakePHP はそれらのフィールドを認識し、レコードがデータベースに作成・更新されるときに自動的に埋め込まれます（保存されるデータが既にこれらのフィールドの値を含んでいる場合を除いて）。&lt;br /&gt;created や modified フィールドは、レコードが一番初めに追加されたときに、現在日時をセットします。modified フィールドは、すでに存在するレコードが保存されたときに、現在日時で更新されます。&lt;br /&gt;注意: フィールド名 updated は modified と同じ振る舞いをします。これらのフィールドは、datetime フィールドである必要があり、デフォルト値として CakePHP で認識される NULL をセットします。&lt;br /&gt;&lt;br /&gt;もしModel::save()の直前に$this-&gt;dataがupdated、created、modifiedなどの値を（Model::readやModel::setを経由して）保持しているなら、 これらは自動的に更新されることはなく、$this-&gt;dataから値をとってくることになります。&lt;/blockquote&gt;&lt;br /&gt;では、上記を参考にやってみたいと思う。まずは、usersテーブルにフィールドを追加しよう。まあusersしかないし、上のコードだとほぼ同時に２つのuserを作成するのだから、実質的な意味はないが、とりあえず自動的にcreatedにセットされるかを試してみて、うまくいったら終了としよう。usersにはcreatedフィールドを追加します。datetimeフィールドにし、初期値をnullにしておきます。&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/744605407212742108-4379859912393324558?l=endoyuta.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://endoyuta.blogspot.com/feeds/4379859912393324558/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://endoyuta.blogspot.com/2012/01/cakephp13mysql_22.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/744605407212742108/posts/default/4379859912393324558'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/744605407212742108/posts/default/4379859912393324558'/><link rel='alternate' type='text/html' href='http://endoyuta.blogspot.com/2012/01/cakephp13mysql_22.html' title='cakePHP1.3でデータベース操作の研究（MySQL）（２）'/><author><name>endo yuta</name><uri>http://www.blogger.com/profile/05491646789675985410</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://1.bp.blogspot.com/-7dw9PlYIisc/TtuORirdBtI/AAAAAAAAAYc/kr_xs7ruXrU/s220/slime.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-744605407212742108.post-8815179787541654279</id><published>2012-01-17T01:04:00.000+09:00</published><updated>2012-01-17T01:04:08.959+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MySQL'/><category scheme='http://www.blogger.com/atom/ns#' term='PHP'/><category scheme='http://www.blogger.com/atom/ns#' term='cakePHP'/><category scheme='http://www.blogger.com/atom/ns#' term='Database'/><title type='text'>cakePHP1.3でデータベース操作の研究（MySQL）</title><content type='html'>cakePHPのデータベース操作を研究します。データベースはMySQLです。cakePHPのバージョンは1.3を使ってます。cakePHPはバージョン毎に結構変化が色々あるようなので、cakePHP2.0との違いは早く調べておこうと思います。どんなデータをつくるかというと、分かり易いのがいいので英単語帳をイメージしてテーブルを作ってみます。&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;テーブル構成&lt;/h3&gt;テーブル構成は下記を想定してます。言葉遣いが間違っている可能性はありますが、iuwは、uwとiwを参照します。uwはuserとwordを参照します。cakePHPのJOINの構文を見ると、wordはuwを沢山持っていると言います。word hasmany uwとなります。逆にiuwはuwに属するといいます。iuw belongsTo uwとなります。&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-sGVVPeh46z0/TwxLeIfl1OI/AAAAAAAAAaM/X4slfVGQsEQ/s1600/database.png" imageanchor="1" style="margin-left:1em; margin-right:1em"&gt;&lt;img border="0" height="240" width="320" src="http://4.bp.blogspot.com/-sGVVPeh46z0/TwxLeIfl1OI/AAAAAAAAAaM/X4slfVGQsEQ/s320/database.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;各テーブルの項目&lt;/h3&gt;各テーブルのフィールドは下記を想定しています。テスト機能つけたり色々一応想定して項目をつけました。まあ全部つくるか分かりませんがモチベーションが続くまで研究してみます。&lt;br /&gt;&lt;br /&gt;&lt;table class="pretty"&gt;&lt;tr&gt;&lt;td&gt;users&lt;/td&gt;&lt;td&gt;id,name,image,discription&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;words&lt;/td&gt;&lt;td&gt;id,word&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;imis&lt;/td&gt;&lt;td&gt;id,imi&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;uws&lt;/td&gt;&lt;td&gt;id,user_id,word_id,count,seitouritsu,seigo&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;iws&lt;/td&gt;&lt;td&gt;id,imi_id,word_id,goodcnt,badcnt&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;iuws&lt;/td&gt;&lt;td&gt;id,uw_id,iw_id&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;h3&gt;トランザクション&lt;/h3&gt;トランザクションを使うための準備をします。app/models内にtransaction.phpを作ります。&lt;br /&gt;&lt;br /&gt;Transactionモデル&lt;pre class="prettyprint"&gt;&lt;br /&gt;&amp;lt;?php&lt;br /&gt;class Transaction extends AppModel {&lt;br /&gt;    var $useTable = false;&lt;br /&gt;&lt;br /&gt;    function begin () {&lt;br /&gt;        return $this-&amp;gt;getDataSource()-&amp;gt;begin($this);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    function commit () {&lt;br /&gt;        return $this-&amp;gt;getDataSource()-&amp;gt;commit($this);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    function rollback () {&lt;br /&gt;        return $this-&amp;gt;getDataSource()-&amp;gt;rollback($this);&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;?&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;トランザクションの動作確認をします。&lt;br /&gt;&lt;br /&gt;コントローラー&lt;pre class="prettyprint"&gt;&lt;br /&gt;//$usersにTransactionを入れるのを忘れないようにする&lt;br /&gt;public $uses = array('User','Word','Imi','Uw','Iw','Iuw','Transaction');&lt;br /&gt;&lt;br /&gt;//トランザクションの実験（動作確認）&lt;br /&gt;public function tora(){&lt;br /&gt; $word = 'hogehgoe';&lt;br /&gt; &lt;br /&gt; //トランザクション開始&lt;br /&gt; $this-&amp;gt;Transaction-&amp;gt;begin();&lt;br /&gt; &lt;br /&gt; //wordの登録&lt;br /&gt; $word_data = array('Word' =&amp;gt; array('word' =&amp;gt; $word));&lt;br /&gt; if(!($this-&amp;gt;Word-&amp;gt;save($word_data))){&lt;br /&gt;  $this-&amp;gt;_renderJson(0); return;&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; //$this-&amp;gt;Transaction-&amp;gt;commit();&lt;br /&gt; $this-&amp;gt;Transaction-&amp;gt;rollback();&lt;br /&gt; &lt;br /&gt; $this-&amp;gt;_renderJson(1);&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;動きました。上記はコミットをコメントアウトしてロールバックしているので、データは登録されませんでした。コミットすると登録されました。&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;データの検索&lt;/h3&gt;最もシンプルな検索方法&lt;pre class="prettyprint"&gt;&lt;br /&gt;$word_data = $this-&amp;gt;Word-&amp;gt;findByWord($word);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;二番目にシンプルな検索方法&lt;pre class="prettyprint"&gt;&lt;br /&gt;$conditions = array(&lt;br /&gt; 'Iw.imi_id' =&amp;gt; $imi_id,&lt;br /&gt; 'Iw.word_id' =&amp;gt; $word_id);&lt;br /&gt;$iw_data = $this-&amp;gt;Iw-&amp;gt;find($conditions);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;三番目にシンプルな検索方法&lt;pre class="prettyprint"&gt;&lt;br /&gt;$params = array('conditions' =&amp;gt; array(&lt;br /&gt; 'Uw.user_id' =&amp;gt; $user_data-&amp;gt;id,&lt;br /&gt; 'Uw.word_id' =&amp;gt; $word_id));&lt;br /&gt;$uw_data = $this-&amp;gt;Uw-&amp;gt;find('first',$params);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;高機能な検索方法&lt;pre class="prettyprint"&gt;&lt;br /&gt;//IwにIuwを持たせる（バインド設定）&lt;br /&gt;$this-&amp;gt;Iw-&amp;gt;bindModel(array('hasMany'=&amp;gt;array('Iuw')));&lt;br /&gt;$params = array(&lt;br /&gt; 'conditions'  =&amp;gt; array('Iw.word_id' =&amp;gt; $word_id),&lt;br /&gt; 'recursive'    =&amp;gt; 3,&lt;br /&gt; 'limit'     =&amp;gt; 20,&lt;br /&gt; 'order'     =&amp;gt; 'goodcnt DESC');&lt;br /&gt;//Iwデータ及びIuwデータの取得&lt;br /&gt;$data = $this-&amp;gt;Iw-&amp;gt;find('all',$params);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;recursiveは、検索するときの結合の深さになります。上記のケースですと、bindModelを使って、IwにIuwを持たせています。また、下記に記載しますが、モデル間のbelongsToの関係のみ、各モデル側で事前設定しています。よって、この検索結果は、下記のようになります。&lt;br /&gt;&lt;br /&gt;「該当する全てのIwには、(1)Iwが持っているIuwと、(2)Iuwが属しているIwとUwと、(3)Iwが属しているWordとImi、Uwが属しているUserとWordが付いてきます。」&lt;br /&gt;&lt;br /&gt;超分かりにくいですが、(1)-&gt;(2)-&gt;(3)の具合で階層が深くなっている様です。超分かりにくいです。&lt;br /&gt;&lt;br /&gt;ちなみに、belongsToについてのみ各モデル側で事前に下記のように設定しています。&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;&amp;lt;?php &lt;br /&gt;class Iuw extends AppModel{&lt;br /&gt; var $name = 'Iuw';&lt;br /&gt;    &lt;br /&gt;    var $belongsTo = array(&lt;br /&gt;        'Iw' =&amp;gt; array(&lt;br /&gt;            'className'     =&amp;gt; 'Iw',&lt;br /&gt;            'foreignKey'    =&amp;gt; 'iw_id',&lt;br /&gt;            'limit'        =&amp;gt; '5',&lt;br /&gt;        ),&lt;br /&gt;        'Uw' =&amp;gt; array(&lt;br /&gt;            'className'     =&amp;gt; 'Uw',&lt;br /&gt;            'foreignKey'    =&amp;gt; 'uw_id',&lt;br /&gt;            'limit'        =&amp;gt; '5',&lt;br /&gt;        )&lt;br /&gt;    );&lt;br /&gt;}&lt;br /&gt;?&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;上記はIuwモデルクラスです。iuw.phpの中身になります。iuwはuwとiwに属するので２つ$belongsToに設定しています。&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;データの削除&lt;/h3&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;//wordを削除&lt;br /&gt;if(!($this-&amp;gt;Word-&amp;gt;delete($word_id))){&lt;br /&gt; return 'error delete word';&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;h3&gt;データの更新&lt;/h3&gt;パターン１&lt;pre class="prettyprint"&gt;&lt;br /&gt;//ユーザーのword_countに登録&lt;br /&gt;$this-&amp;gt;User-&amp;gt;id = $user_id;&lt;br /&gt;$this-&amp;gt;User-&amp;gt;saveField('word_count',$word_count);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;パターン２&lt;pre class="prettyprint"&gt;&lt;br /&gt;//uwを更新&lt;br /&gt;$uw_data = array('Uw' =&amp;gt; array(&lt;br /&gt; 'id'  =&amp;gt; $uw_id,&lt;br /&gt; 'count'  =&amp;gt; $uw_count,&lt;br /&gt; 'right_count' =&amp;gt; $uw_right,&lt;br /&gt; 'seitouritsu' =&amp;gt; $uw_seitouritsu,&lt;br /&gt; 'seigo'  =&amp;gt; $uw_seigo));&lt;br /&gt;if(!($this-&amp;gt;Uw-&amp;gt;save($uw_data))){&lt;br /&gt; return 'error save Uw';&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;プライマリーキーが含まれていればsaveでも更新になる。&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;データの登録&lt;/h3&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;$iw_data = array('Iw' =&amp;gt; array(&lt;br /&gt; 'imi_id'  =&amp;gt; $imi_id,&lt;br /&gt; 'word_id' =&amp;gt; $word_id));&lt;br /&gt;if(!($this-&amp;gt;Iw-&amp;gt;save($iw_data))){&lt;br /&gt; return 'error save Iw';&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;h3&gt;order =&gt;rand()&lt;/h3&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;//テストの問題を出す（データをランダムに一つ返すだけ）&lt;br /&gt;public function test_get_word(){&lt;br /&gt; $user_data = $this-&amp;gt;_first_action();&lt;br /&gt; //バインド設定（UwにIuwを持たせる）&lt;br /&gt; $this-&amp;gt;Uw-&amp;gt;bindModel(array('hasMany'=&amp;gt;array('Iuw')));&lt;br /&gt; //uwを取得する&lt;br /&gt; $params = array(&lt;br /&gt;  'conditions' =&amp;gt; array('user_id' =&amp;gt; $user_data-&amp;gt;id),&lt;br /&gt;  'order' =&amp;gt; 'rand()',&lt;br /&gt;  'recursive'  =&amp;gt; 3);&lt;br /&gt; $uw_data = $this-&amp;gt;Uw-&amp;gt;find('first',$params);&lt;br /&gt; &lt;br /&gt; $this-&amp;gt;_renderJson($uw_data);&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;h3&gt;ランキング&lt;/h3&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;//ランキングを算出&lt;br /&gt;$params = array('conditions' =&amp;gt; array(&lt;br /&gt; 'User.word_count &amp;gt;' =&amp;gt; $word_count));&lt;br /&gt;$rank = $this-&amp;gt;User-&amp;gt;find('count',$params);&lt;br /&gt;$rank++;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;h3&gt;トランザクションを使っている様&lt;/h3&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;//単語登録（単語と意味を直接登録するパターン）&lt;br /&gt;public function submit_word(){&lt;br /&gt; $user_data = $this-&amp;gt;_first_action();&lt;br /&gt; //フォーム内容word,imiの有無チェック&lt;br /&gt; if(empty($this-&amp;gt;params['form']['word']) ||&lt;br /&gt;   empty($this-&amp;gt;params['form']['imi'])){&lt;br /&gt;  $this-&amp;gt;_renderJson('error param is empty'); return;&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; $word = $this-&amp;gt;params['form']['word'];&lt;br /&gt; //imiのタグを除去（無効化）&lt;br /&gt; $imi = htmlspecialchars($this-&amp;gt;params['form']['imi']);&lt;br /&gt; //wordの内容チェック(半角小文字の英単語1文字か？）&lt;br /&gt; if(preg_match(&amp;quot;/^[a-z]+$/&amp;quot;,$word) == 0){&lt;br /&gt;  $this-&amp;gt;_renderJson('error word is wrong'); return;&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; //トランザクション開始&lt;br /&gt; $this-&amp;gt;Transaction-&amp;gt;begin();&lt;br /&gt; &lt;br /&gt; //ワード登録処理&lt;br /&gt; $result = $this-&amp;gt;_submit_w($user_data-&amp;gt;id,$word,$imi);&lt;br /&gt; &lt;br /&gt; //登録処理が成功した場合&lt;br /&gt; if($result == true){&lt;br /&gt;  //トランザクションをコミット&lt;br /&gt;  $this-&amp;gt;Transaction-&amp;gt;commit();&lt;br /&gt;  //ユーザのワード数を登録&lt;br /&gt;  $this-&amp;gt;_put_word_count($user_data-&amp;gt;id);&lt;br /&gt; //登録処理が失敗した場合&lt;br /&gt; }else{&lt;br /&gt;  //トランザクション　ロールバック&lt;br /&gt;  $this-&amp;gt;Transaction-&amp;gt;rollback();&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; $this-&amp;gt;_renderJson($result);&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;h3&gt;AjaxでPagenation&lt;/h3&gt;コントローラー&lt;pre class="prettyprint"&gt;&lt;br /&gt;//Uwを取得（Ajaxでページネーションする想定）&lt;br /&gt;public function get_uw_pagenation(){&lt;br /&gt; $limit = 20; //1pageに何データ表示するか？&lt;br /&gt; &lt;br /&gt; $user_data = $this-&amp;gt;_first_action();&lt;br /&gt; &lt;br /&gt; //フォーム内容の有無チェック&lt;br /&gt; if(empty($this-&amp;gt;params['form']['page'])){&lt;br /&gt;  $this-&amp;gt;_renderJson('error page is empty'); return;&lt;br /&gt; }&lt;br /&gt; $page = $this-&amp;gt;params['form']['page'];&lt;br /&gt; //pageの内容チェック&lt;br /&gt; if(preg_match(&amp;quot;/^[0-9]+$/&amp;quot;,$page) == 0){&lt;br /&gt;  $this-&amp;gt;_renderJson('param &amp;quot;page&amp;quot; is wrong'); return;&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; $offset = $limit * $page;&lt;br /&gt; //バインド設定（UwにIuwを持たせる）&lt;br /&gt; $this-&amp;gt;Uw-&amp;gt;bindModel(array('hasMany'=&amp;gt;array('Iuw')));&lt;br /&gt; //Uwの取得&lt;br /&gt; $params = array(&lt;br /&gt;  'conditions'=&amp;gt; array('user_id' =&amp;gt; $user_data-&amp;gt;id),&lt;br /&gt;  'order'  =&amp;gt; 'seitouritsu DESC',&lt;br /&gt;  'limit'  =&amp;gt; $limit,&lt;br /&gt;  'offset' =&amp;gt; $offset,&lt;br /&gt;  'recursive' =&amp;gt; 3);&lt;br /&gt; $uw_data = $this-&amp;gt;Uw-&amp;gt;find('all',$params);&lt;br /&gt; &lt;br /&gt; $this-&amp;gt;_renderJson($uw_data);&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;View&lt;pre class="prettyprint"&gt;&lt;br /&gt;&amp;lt;?php echo $html-&amp;gt;script('index',array());?&amp;gt;&lt;br /&gt;&amp;lt;div id=&amp;quot;error&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&amp;lt;div id=&amp;quot;uw&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&amp;lt;div id=&amp;quot;pagenation&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&amp;lt;img id=&amp;quot;loading&amp;quot; src=&amp;quot;&amp;lt;?php echo $html-&amp;gt;url(&amp;quot;/img/loading.gif&amp;quot;);?&amp;gt;&amp;quot; /&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Javascript&lt;pre class="prettyprint"&gt;&lt;br /&gt;$(function(){&lt;br /&gt; $(document).ready(function(){get_uw();});&lt;br /&gt; $('#page').live('click',function(){get_uw();});&lt;br /&gt; $(&amp;quot;#loading&amp;quot;).bind(&amp;quot;ajaxSend&amp;quot;, function(){$(this).show();})&lt;br /&gt;  .bind(&amp;quot;ajaxComplete&amp;quot;, function(){$(this).hide();});&lt;br /&gt;});&lt;br /&gt;&lt;br /&gt;function get_uw(){&lt;br /&gt; $('#error').empty();&lt;br /&gt; var page = $('#page').attr('name');&lt;br /&gt; if(!page) page = '1'; &lt;br /&gt; if(!(page.match(/^[0-9]+$/))){&lt;br /&gt;  $('#error').append('page is wrong.'); return;&lt;br /&gt; }&lt;br /&gt; $.ajax({&lt;br /&gt;  type: &amp;quot;POST&amp;quot;,&lt;br /&gt;  dataType: &amp;quot;json&amp;quot;,&lt;br /&gt;  data: {'page':page},&lt;br /&gt;  url: &amp;quot;./get_uw_pagenation&amp;quot;,&lt;br /&gt;  success: function(data){&lt;br /&gt;   if(data != false){&lt;br /&gt;    write_uw(data);&lt;br /&gt;    write_page(page);&lt;br /&gt;   }&lt;br /&gt;  }&lt;br /&gt; });&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function write_uw(data){&lt;br /&gt; $('#pagenation').empty();&lt;br /&gt; var str = '';&lt;br /&gt; for(var i=0;i&amp;lt;data.length;i++){&lt;br /&gt;  str += '&amp;lt;div id=&amp;quot;wordset&amp;quot; class=&amp;quot;clearfix&amp;quot;&amp;gt;&amp;lt;ul&amp;gt;&amp;lt;li&amp;gt;';&lt;br /&gt;  str += data[i]['Word']['word'] + '&amp;lt;li&amp;gt;';&lt;br /&gt;  for(var j=0;j&amp;lt;data[i]['Iuw'].length;j++){&lt;br /&gt;   str += data[i]['Iuw'][j]['Iw']['Imi']['imi'];&lt;br /&gt;   if(!(j == data[i]['Iuw'].length - 1)){&lt;br /&gt;    str += ' | ';&lt;br /&gt;   }&lt;br /&gt;  }&lt;br /&gt;  str +=  '&amp;lt;li&amp;gt;';&lt;br /&gt;  str += data[i]['Uw']['seitouritsu'];&lt;br /&gt;  str += '&amp;lt;/ul&amp;gt;&amp;lt;/div&amp;gt;';&lt;br /&gt; }&lt;br /&gt; $('#uw').append(str);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function write_page(page){&lt;br /&gt; page++;&lt;br /&gt; var str = '&amp;lt;input id=&amp;quot;page&amp;quot; type=&amp;quot;button&amp;quot; value=&amp;quot;More?&amp;quot; name=&amp;quot;';&lt;br /&gt; str += page +  '&amp;quot; /&amp;gt;';&lt;br /&gt; $('#pagenation').append(str);&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/744605407212742108-8815179787541654279?l=endoyuta.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://endoyuta.blogspot.com/feeds/8815179787541654279/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://endoyuta.blogspot.com/2012/01/cakephp13mysql.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/744605407212742108/posts/default/8815179787541654279'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/744605407212742108/posts/default/8815179787541654279'/><link rel='alternate' type='text/html' href='http://endoyuta.blogspot.com/2012/01/cakephp13mysql.html' title='cakePHP1.3でデータベース操作の研究（MySQL）'/><author><name>endo yuta</name><uri>http://www.blogger.com/profile/05491646789675985410</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://1.bp.blogspot.com/-7dw9PlYIisc/TtuORirdBtI/AAAAAAAAAYc/kr_xs7ruXrU/s220/slime.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-sGVVPeh46z0/TwxLeIfl1OI/AAAAAAAAAaM/X4slfVGQsEQ/s72-c/database.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-744605407212742108.post-5477438894154161829</id><published>2012-01-11T01:33:00.000+09:00</published><updated>2012-01-17T01:10:21.361+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MySQL'/><category scheme='http://www.blogger.com/atom/ns#' term='PHP'/><category scheme='http://www.blogger.com/atom/ns#' term='cakePHP'/><category scheme='http://www.blogger.com/atom/ns#' term='Database'/><title type='text'>トランザクション</title><content type='html'>&lt;a href="http://e-words.jp/w/E38388E383A9E383B3E382B6E382AFE382B7E383A7E383B3.html"&gt;トランザクションとは、&lt;/a&gt;&lt;blockquote&gt;関連する複数の処理を一つの処理単位としてまとめたもの。金融機関のコンピュータシステムにおける入出金処理のように、一連の作業を全体として一つの処理として管理するために用いる。&lt;/blockquote&gt;GAEのデータベースは何でもトランザクションになっていたということだな。&lt;blockquote&gt;トランザクションを使うと複数のクエリをまとめて１つの処理として扱うことができる。処理の途中でエラーになって処理を取り消したいような場合はROLLBACKをすることで変更内容を元に戻すことができる。&lt;/blockquote&gt;と&lt;a href="http://wiki.bit-hive.com/tomizoo/pg/MySQL%20%A5%C8%A5%E9%A5%F3%A5%B6%A5%AF%A5%B7%A5%E7%A5%F3"&gt;とみぞーノート&lt;/a&gt;に書いてある。とみぞーノートを見ると、トランザクションを開始して、コミットするまでは、他の誰かがデータを参照してもトランザクション中の人が操作しているデータは見えないようだ。コミットするとトランザクションが終了するようだ。データを全部元に戻すには、ロールバックするらしい。単純な仕組みではある。確かinnoDBというのはトランザクションが使えるし、ロックが行単位の為、デッドロックになることは少ないとかなんかの雑誌に書いてあったな。&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;cakePHPでトランザクション&lt;/h3&gt;（※以下の情報は古かったのでcakePHP1.3の場合は&lt;a href="http://endoyuta.blogspot.com/2012/01/cakephp13mysql.html"&gt;ここ&lt;/a&gt;のやり方になります）&lt;br /&gt;&lt;br /&gt;cakePHPでのトランザクションの使い方が&lt;a href="http://www.ryuzee.com/contents/blog/1159"&gt;このページに&lt;/a&gt;書いてある。まずはapp/model/以下にあるapp_model.phpに以下を追加する必要があるらしい。&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;function begin()&lt;br /&gt;{&lt;br /&gt;    $db =&amp;amp; ConnectionManager::getDataSource($this-&amp;gt;useDbConfig);&lt;br /&gt;    $db-&amp;gt;begin($this);&lt;br /&gt;}&lt;br /&gt;    &lt;br /&gt;function commit()&lt;br /&gt;{&lt;br /&gt;    $db =&amp;amp; ConnectionManager::getDataSource($this-&amp;gt;useDbConfig);&lt;br /&gt;    $db-&amp;gt;commit($this);&lt;br /&gt;}&lt;br /&gt;    &lt;br /&gt;function rollback()&lt;br /&gt;{&lt;br /&gt;    $db =&amp;amp; ConnectionManager::getDataSource($this-&amp;gt;useDbConfig);&lt;br /&gt;    $db-&amp;gt;rollback($this);&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;そして、実際に使う様が&lt;a href="http://d.hatena.ne.jp/tetsuya_odaka/20110127/1296084773"&gt;このページ&lt;/a&gt;に載っている。cakePHP1.3の場合だそうだ。&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;$this-&amp;gt;Event-&amp;gt;begin(); // トランザクションの開始&lt;br /&gt;if($this-&amp;gt;Event-&amp;gt;save($this-&amp;gt;data)){&lt;br /&gt;    $this-&amp;gt;Event-&amp;gt;commit(); // コミット&lt;br /&gt;    // 登録できたらリダイレクト&lt;br /&gt;    $this-&amp;gt;redirect('.');&lt;br /&gt;}else{&lt;br /&gt;    $this-&amp;gt;Event-&amp;gt;rollback(); // ロールバック&lt;br /&gt;    $this-&amp;gt;Session-&amp;gt;setFlash('データの保存に失敗しました');&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;あとで試してみよう。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/744605407212742108-5477438894154161829?l=endoyuta.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://endoyuta.blogspot.com/feeds/5477438894154161829/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://endoyuta.blogspot.com/2012/01/blog-post_11.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/744605407212742108/posts/default/5477438894154161829'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/744605407212742108/posts/default/5477438894154161829'/><link rel='alternate' type='text/html' href='http://endoyuta.blogspot.com/2012/01/blog-post_11.html' title='トランザクション'/><author><name>endo yuta</name><uri>http://www.blogger.com/profile/05491646789675985410</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://1.bp.blogspot.com/-7dw9PlYIisc/TtuORirdBtI/AAAAAAAAAYc/kr_xs7ruXrU/s220/slime.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-744605407212742108.post-6832558866050291389</id><published>2012-01-09T18:05:00.001+09:00</published><updated>2012-01-09T18:05:44.926+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='cakePHP'/><title type='text'>cakePHPプロジェクト作成する際のファイル構成</title><content type='html'>そんなページありませんといわれないように、cakePHPプロジェクトを作成する際には、下記ファイルとフォルダを全部コピペしましょう。&lt;ul&gt;&lt;li&gt;appフォルダ&lt;li&gt;cakeフォルダ&lt;li&gt;pluginsフォルダ&lt;li&gt;vendorsフォルダ&lt;li&gt;.gitignore&lt;li&gt;.htaccess&lt;li&gt;index.php&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/744605407212742108-6832558866050291389?l=endoyuta.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://endoyuta.blogspot.com/feeds/6832558866050291389/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://endoyuta.blogspot.com/2012/01/cakephp.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/744605407212742108/posts/default/6832558866050291389'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/744605407212742108/posts/default/6832558866050291389'/><link rel='alternate' type='text/html' href='http://endoyuta.blogspot.com/2012/01/cakephp.html' title='cakePHPプロジェクト作成する際のファイル構成'/><author><name>endo yuta</name><uri>http://www.blogger.com/profile/05491646789675985410</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://1.bp.blogspot.com/-7dw9PlYIisc/TtuORirdBtI/AAAAAAAAAYc/kr_xs7ruXrU/s220/slime.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-744605407212742108.post-7947349961612017923</id><published>2012-01-02T23:42:00.001+09:00</published><updated>2012-01-02T23:58:24.168+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Css'/><title type='text'>Css - あふれた文字を「...」に変換する</title><content type='html'>下記のように、divの中に、長い文字列があるが、divの幅を固定したい場合、下記のようなcss設定によってあふれた文字を「...」に変換することができる。これによって、div幅を固定しながら文字列が続くことも表現できる為、スマートである。&lt;h4&gt;divの例&lt;/h4&gt;&lt;pre&gt;&lt;br /&gt;&amp;lt;div id=&amp;quot;afuretamoji&amp;quot;&amp;gt;ああああああああいいいいいいううううううううえええええええおおおおおおおお&amp;lt;/div&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;h4&gt;css設定例&lt;/h4&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;div#afuretamoji{&lt;br /&gt; font-size:10px;&lt;br /&gt; color: #06c;&lt;br /&gt; background-color: #def;&lt;br /&gt; border:1px solid #589;&lt;br /&gt; width:100px;&lt;br /&gt; max-width:100px;&lt;br /&gt; height:70px;&lt;br /&gt; overflow:hidden;&lt;br /&gt; white-space:nowrap;&lt;br /&gt; text-overflow:ellipsis;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;「max-width:100px;」でdivの最大幅を決めている。&lt;br /&gt;「overflow:hidden;」で、あふれた文字を表示しないようにしている。&lt;br /&gt;「white-space:nowrap;」で、複数行表示を禁止している。&lt;br /&gt;「text-overflow:ellipsis;」で、あふれた場合に、「...」を表示するようにしている。&lt;br /&gt;&lt;h4&gt;結果&lt;/h4&gt;&lt;div id="afuretamoji"&gt;ああああああああいいいいいいううううううううえええええええおおおおおおおお&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/744605407212742108-7947349961612017923?l=endoyuta.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://endoyuta.blogspot.com/feeds/7947349961612017923/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://endoyuta.blogspot.com/2012/01/css.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/744605407212742108/posts/default/7947349961612017923'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/744605407212742108/posts/default/7947349961612017923'/><link rel='alternate' type='text/html' href='http://endoyuta.blogspot.com/2012/01/css.html' title='Css - あふれた文字を「...」に変換する'/><author><name>endo yuta</name><uri>http://www.blogger.com/profile/05491646789675985410</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://1.bp.blogspot.com/-7dw9PlYIisc/TtuORirdBtI/AAAAAAAAAYc/kr_xs7ruXrU/s220/slime.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-744605407212742108.post-1787309109096679004</id><published>2012-01-02T22:20:00.000+09:00</published><updated>2012-01-02T22:29:00.836+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='JQuery'/><category scheme='http://www.blogger.com/atom/ns#' term='Css'/><title type='text'>jQuery - メニューをマウスオーバーしたら色変える</title><content type='html'>非常に簡単な話ですがメモ。大体jQueryも分かってきたのですが、cssの設定方法などもいくつかパターンがあるようで、あとbackground-colorという記載が通常のcssの表記法だと思うのですが、jQueryの場合は、backgroundColorだったりしてなんかややこしい。多分キャメル法で統一されたりしてるのかも。そうじゃなかったら一々確認するのめんどくさいですからね。下記は、ul#menuの子供にliが沢山あって、liにはそれぞれ固有のidが割り振られている状態を想定しています。&lt;br /&gt;&lt;br /&gt;&lt;ul id="menu"&gt;&lt;li id="a"&gt;あいうえお&lt;li id="b"&gt;かきくけこ&lt;/ul&gt;&lt;br /&gt;&lt;script type="text/javascript"&gt;$(function(){ $('ul#menu li').mouseover(function(){menu_mouseover($(this).attr('id'));}); $('ul#menu li').mouseout(function(){menu_mouseout($(this).attr('id'));});});function menu_mouseover(id){ $('ul#menu li#'+id).css('backgroundColor','#0cf');}function menu_mouseout(id){ $('ul#menu li#'+id).css('backgroundColor','#09c');}&lt;/script&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;$(function(){&lt;br /&gt; $('ul#menu li').mouseover(function(){menu_mouseover($(this).attr('id'));});&lt;br /&gt; $('ul#menu li').mouseout(function(){menu_mouseout($(this).attr('id'));});&lt;br /&gt;});&lt;br /&gt;&lt;br /&gt;function menu_mouseover(id){&lt;br /&gt; $('ul#menu li#'+id).css('backgroundColor','#0cf');&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function menu_mouseout(id){&lt;br /&gt; $('ul#menu li#'+id).css('backgroundColor','#09c');&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/744605407212742108-1787309109096679004?l=endoyuta.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://endoyuta.blogspot.com/feeds/1787309109096679004/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://endoyuta.blogspot.com/2012/01/jquery.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/744605407212742108/posts/default/1787309109096679004'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/744605407212742108/posts/default/1787309109096679004'/><link rel='alternate' type='text/html' href='http://endoyuta.blogspot.com/2012/01/jquery.html' title='jQuery - メニューをマウスオーバーしたら色変える'/><author><name>endo yuta</name><uri>http://www.blogger.com/profile/05491646789675985410</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://1.bp.blogspot.com/-7dw9PlYIisc/TtuORirdBtI/AAAAAAAAAYc/kr_xs7ruXrU/s220/slime.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-744605407212742108.post-7327241348668223326</id><published>2012-01-02T19:02:00.001+09:00</published><updated>2012-01-02T19:02:31.084+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><title type='text'>Javascript - GETリクエストパラメータを取得する</title><content type='html'>window.location.search.substringで取得できる。&lt;br /&gt;取得したものは正規表現やsplitで必要なところを取り出す必要がある。&lt;br /&gt;下記はidがキーのパラメータの値（数字）を取り出す様。&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;var query = window.location.search.substring(1); &lt;br /&gt;if(query.match(/id=(\d+)/)){&lt;br /&gt;    alert(RegExp.$1);&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/744605407212742108-7327241348668223326?l=endoyuta.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://endoyuta.blogspot.com/feeds/7327241348668223326/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://endoyuta.blogspot.com/2012/01/javascript-get.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/744605407212742108/posts/default/7327241348668223326'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/744605407212742108/posts/default/7327241348668223326'/><link rel='alternate' type='text/html' href='http://endoyuta.blogspot.com/2012/01/javascript-get.html' title='Javascript - GETリクエストパラメータを取得する'/><author><name>endo yuta</name><uri>http://www.blogger.com/profile/05491646789675985410</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://1.bp.blogspot.com/-7dw9PlYIisc/TtuORirdBtI/AAAAAAAAAYc/kr_xs7ruXrU/s220/slime.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-744605407212742108.post-7791930643764262963</id><published>2012-01-01T01:42:00.000+09:00</published><updated>2012-01-26T23:38:01.003+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='経済'/><category scheme='http://www.blogger.com/atom/ns#' term='Mathematics'/><category scheme='http://www.blogger.com/atom/ns#' term='本'/><title type='text'>ミクロ経済学</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a target="_blank" href="http://www.amazon.co.jp/%E3%81%93%E3%81%AE%E4%B8%96%E3%81%A7%E4%B8%80%E7%95%AA%E3%81%8A%E3%82%82%E3%81%97%E3%82%8D%E3%81%84%E3%83%9F%E3%82%AF%E3%83%AD%E7%B5%8C%E6%B8%88%E5%AD%A6%E2%80%95%E2%80%95%E8%AA%B0%E3%82%82%E3%81%8C%E3%80%8C%E5%90%88%E7%90%86%E7%9A%84%E3%81%AA%E4%BA%BA%E9%96%93%E3%80%8D%E3%81%AB%E3%81%AA%E3%82%8C%E3%82%8B%E3%81%8B%E3%82%82%E3%81%97%E3%82%8C%E3%81%AA%E3%81%8416%E8%AC%9B-%E3%83%A8%E3%83%A9%E3%83%A0%E3%83%BB%E3%83%90%E3%82%A6%E3%83%9E%E3%83%B3/dp/4478013241" imageanchor="1" style="clear:left; float:left;margin-right:1em; margin-bottom:1em"&gt;&lt;img border="0" height="300" width="210" src="http://2.bp.blogspot.com/-agEyNEYtYSg/Twcx-DPEs_I/AAAAAAAAAaA/3D1Tw_KiiZg/s320/61V5NNSmRxL._SL500_AA300_.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;a href="http://www.amazon.co.jp/%E3%81%93%E3%81%AE%E4%B8%96%E3%81%A7%E4%B8%80%E7%95%AA%E3%81%8A%E3%82%82%E3%81%97%E3%82%8D%E3%81%84%E3%83%9F%E3%82%AF%E3%83%AD%E7%B5%8C%E6%B8%88%E5%AD%A6%E2%80%95%E2%80%95%E8%AA%B0%E3%82%82%E3%81%8C%E3%80%8C%E5%90%88%E7%90%86%E7%9A%84%E3%81%AA%E4%BA%BA%E9%96%93%E3%80%8D%E3%81%AB%E3%81%AA%E3%82%8C%E3%82%8B%E3%81%8B%E3%82%82%E3%81%97%E3%82%8C%E3%81%AA%E3%81%8416%E8%AC%9B-%E3%83%A8%E3%83%A9%E3%83%A0%E3%83%BB%E3%83%90%E3%82%A6%E3%83%9E%E3%83%B3/dp/4478013241"&gt;『この世で一番おもしろいミクロ経済学』&lt;/a&gt;を読んだ。超分かり易かった。ただ広く浅くで超概要しかわからない。&lt;h4&gt;サンクコスト（sunk cost）&lt;/h4&gt;サンクコストは&lt;a href="http://ja.wikipedia.org/wiki/%E5%9F%8B%E6%B2%A1%E8%B2%BB%E7%94%A8"&gt;埋没費用&lt;/a&gt;ともよばれ、すでに投資済みのコストのことをいいます。あるいはすでにやってしまったことをいいます。既にやってしまっていることを理由に次の施策を決定することはおかしい。腹痛になったので、ビオフェルミン飲むか、トイレに行くかを検討した際に、腹痛なのでトイレに行くのではなく、ビオフェルミンを飲むことにする、というのはおかしい。&lt;h4&gt;お金の価値&lt;/h4&gt;お金は時間に伴い価値がかわります。利子により銀行に預けてるだけでその価値は1年後に上がるわけですから、今すぐにA円もらうのがいいか、１年後にB円貰うのがよいかを検討するには、利子率をもとにB円の現在価値を求めて、それをA円と比較します。&lt;br /&gt;&lt;br /&gt;利子率をrとし、将来のお金をXとし、経過年数をnとすれば、現在価値PVは、PV = X / (1 + r)^n となります。&lt;pre class="prettyprint"&gt;&lt;br /&gt;r = 0.05;&lt;br /&gt;X = 200000;&lt;br /&gt;n = 10;&lt;br /&gt;PV = X/Math.pow((1+r),n);&lt;br /&gt;document.write(PV);&lt;br /&gt;&lt;/pre&gt;&lt;script type="text/javascript"&gt;r = 0.05;X = 200000;n = 10;PV = X/Math.pow((1+r),n);document.write(PV);&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;毎年X円を、n年間貰える場合、この現在価値PVは、&lt;pre class="prettyprint"&gt;&lt;br /&gt;r = 0.05;&lt;br /&gt;X = 10000;&lt;br /&gt;n = 20;&lt;br /&gt;PV = 0;&lt;br /&gt;for(i=0;i&amp;lt;n;i++){&lt;br /&gt;    PV += X/Math.pow((1+r),i+1);&lt;br /&gt;}&lt;br /&gt;document.write(PV);&lt;br /&gt;&lt;/pre&gt;&lt;script type="text/javascript"&gt;r = 0.05;X = 10000;n = 20;PV = 0;for(i=0;i&lt;n;i++){    PV += X/Math.pow((1+r),i+1);}document.write(PV);&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;毎年一定額を貰えるようなケースを年賦（ねんふ）というらしい。年賦金の現在価値の公式がある。PV = X * (1 - (1 / (1 + n)^n)) / r が公式らしい。証明を今度探すか。&lt;pre class="prettyprint"&gt;&lt;br /&gt;r = 0.05;&lt;br /&gt;X = 10000;&lt;br /&gt;n = 20;&lt;br /&gt;PV = X*(1-(1/Math.pow(1+r,n)))/r;&lt;br /&gt;document.write(PV);&lt;br /&gt;&lt;/pre&gt;&lt;script type="text/javascript"&gt;r = 0.05;X = 10000;n = 20;PV = X*(1-(1/Math.pow(1+r,n)))/r;document.write(PV);&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;なんと、永遠に毎年一定額貰える場合も、現在価値を簡単に求められる。&lt;br /&gt;&lt;br /&gt;現在価値は下記のような式で表すことができる。&lt;br /&gt;[式a] PV = X / (1 + r)^1 + X / (1 + r)^2 + X / (1 + r)^3 ..........&lt;br /&gt;この式の両辺に、(1 + r)をかけると、下記のようになる。&lt;br /&gt;[式b] PV(1 + r) = X + X / (1 + r)^1 + X / (1 + r)^2 + X / (1 + r)^3 ..........&lt;br /&gt;[式b]から[式a]を引くと下記のようになる。&lt;br /&gt;PV * r = X&lt;br /&gt;よって、現在価値PVは、下記になる。&lt;br /&gt;PV = X / r&lt;br /&gt;&lt;h4&gt;その他&lt;/h4&gt;その他もろもろの超概要を説明してくれている。リスクの考え方、取引のメリット、取引の制約がなければ取引は双方の取引メリットがなくなるまで続くとか、ゲーム理論、パレート最適、パレート改善とか、オークションとか、需要曲線、供給曲線とか、税金とか。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/744605407212742108-7791930643764262963?l=endoyuta.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://endoyuta.blogspot.com/feeds/7791930643764262963/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://endoyuta.blogspot.com/2012/01/blog-post.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/744605407212742108/posts/default/7791930643764262963'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/744605407212742108/posts/default/7791930643764262963'/><link rel='alternate' type='text/html' href='http://endoyuta.blogspot.com/2012/01/blog-post.html' title='ミクロ経済学'/><author><name>endo yuta</name><uri>http://www.blogger.com/profile/05491646789675985410</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://1.bp.blogspot.com/-7dw9PlYIisc/TtuORirdBtI/AAAAAAAAAYc/kr_xs7ruXrU/s220/slime.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-agEyNEYtYSg/Twcx-DPEs_I/AAAAAAAAAaA/3D1Tw_KiiZg/s72-c/61V5NNSmRxL._SL500_AA300_.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-744605407212742108.post-6662914156148846493</id><published>2011-12-27T02:55:00.000+09:00</published><updated>2012-01-08T18:07:22.253+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='HTML5'/><category scheme='http://www.blogger.com/atom/ns#' term='Mathematics'/><category scheme='http://www.blogger.com/atom/ns#' term='Canvas'/><title type='text'>HTML5 - Canvas 円同士の衝突アニメーション</title><content type='html'>&lt;canvas class="waku" id="hoge" width="400" height="400"&gt;&lt;/canvas&gt;&lt;script type="text/javascript"&gt;var canvas = document.getElementById("hoge");var ctx = canvas.getContext("2d");var cw = canvas.width;var ch = canvas.height;var g = 0.1;var circles = [];var time = 0;var colorList = ['0','1','2','3','4','5','6','7',                 '8','9','a','b','c','d','e','f'];var tm;tm = setInterval(main,10);function main(){ ctx.clearRect(0,0,cw,ch); if(time&gt;100 || time==0){  time = 0;  circles.push(new Circle());  circles[circles.length-1].init(circles.length%2); } for(i=0;i&lt;circles.length;i++){  for(j=i+1;j&lt;circles.length;j++){   collisionCircleCircle(circles[i],circles[j]);  } } for(i=0;i&lt;circles.length;i++){  circles[i].move();  circles[i].collisionWall();  circles[i].view(); } time++;}function Circle(){ this.h = 0.9; this.x = 0; this.y = 100; this.vx = 0; this.vy = 0; this.r = 0; this.color = '#';  this.init = function(vec){  this.vx = Math.random()*9+1;  this.r = Math.random()*25+5;  if(vec){   this.x = cw+100;   this.vx *= -1;  }else{   this.x = -100;  }  this.color += colorList[Math.floor(Math.random()*0)+0];  this.color += colorList[Math.floor(Math.random()*6)+8];  this.color += colorList[Math.floor(Math.random()*6)+8]; }  this.move = function(){  this.x += this.vx;  this.y += this.vy;  this.vy += g; }  this.view = function(){  ctx.beginPath();  ctx.fillStyle = this.color;  ctx.arc(this.x, this.y, this.r, 0, 360,false);  ctx.fill(); }  this.collisionWall = function(){  if(this.x+this.r &gt; cw &amp;&amp; this.vx &gt; 0 ||     this.x-this.r &lt; 0 &amp;&amp; this.vx &lt; 0){   this.vx *= -this.h;  }else if(this.y+this.r &gt; ch &amp;&amp; this.vy &gt; 0 ||     this.y-this.r &lt; 0 &amp;&amp; this.vy &lt; 0){   this.vy *= -this.h;  } }}function collisionCircleCircle(a,b){ if((b.x-a.x)*(b.x-a.x)+(b.y-a.y)*(b.y-a.y) &lt; (a.r+b.r)*(a.r+b.r)){  var vx = a.x-b.x;  var vy = a.y-b.y;  var len = Math.sqrt(vx*vx+vy*vy);  var d = a.r+b.r-len;  if(len&gt;0) len =1/len;    vx *= len;  vy *= len;    d /= 2.0;  a.x += vx*d;  a.y += vy*d;  b.x -= vx*d;  b.y -= vy*d;    var t;  t = -(vx*a.vx+vy*a.vy)/(vx*vx+vy*vy);  var arx = a.vx+vx*t;  var ary = a.vy+vy*t;  t = -(-vy*a.vx+vx*a.vy)/(vy*vy+vx*vx);  var amx = a.vx-vy*t;  var amy = a.vy+vx*t;  t = -(vx*b.vx+vy*b.vy)/(vx*vx+vy*vy);  var brx = b.vx+vx*t;  var bry = b.vy+vy*t;  t = -(-vy*b.vx+vx*b.vy)/(vy*vy+vx*vx);  var bmx = b.vx-vy*t;  var bmy = b.vy+vx*t;    var e = 0.8;  var adx = (a.r*amx+b.r*bmx+bmx*e*b.r-amx*e*b.r)/(a.r+b.r);  var bdx = -e*(bmx-amx)+adx;  var ady = (a.r*amy+b.r*bmy+bmy*e*b.r-amy*e*b.r)/(a.r+b.r);  var bdy = -e*(bmy-amy)+ady;    a.vx = adx+arx;  a.vy = ady+ary;  b.vx = bdx+brx;  b.vy = bdy+bry; }}&lt;/script&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;&amp;lt;canvas id=&amp;quot;hoge&amp;quot; width=&amp;quot;400&amp;quot; height=&amp;quot;400&amp;quot;&amp;gt;&amp;lt;/canvas&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;var canvas = document.getElementById(&amp;quot;hoge&amp;quot;);&lt;br /&gt;var ctx = canvas.getContext(&amp;quot;2d&amp;quot;);&lt;br /&gt;var cw = canvas.width;&lt;br /&gt;var ch = canvas.height;&lt;br /&gt;&lt;br /&gt;var g = 0.1;&lt;br /&gt;var circles = [];&lt;br /&gt;var time = 0;&lt;br /&gt;var colorList = ['0','1','2','3','4','5','6','7',&lt;br /&gt;                 '8','9','a','b','c','d','e','f'];&lt;br /&gt;&lt;br /&gt;var tm;&lt;br /&gt;tm = setInterval(main,10);&lt;br /&gt;&lt;br /&gt;function main(){&lt;br /&gt; ctx.clearRect(0,0,cw,ch);&lt;br /&gt; if(time&amp;gt;100 || time==0){&lt;br /&gt;  time = 0;&lt;br /&gt;  circles.push(new Circle());&lt;br /&gt;  circles[circles.length-1].init(circles.length%2);&lt;br /&gt; }&lt;br /&gt; for(i=0;i&amp;lt;circles.length;i++){&lt;br /&gt;  for(j=i+1;j&amp;lt;circles.length;j++){&lt;br /&gt;   collisionCircleCircle(circles[i],circles[j]);&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt; for(i=0;i&amp;lt;circles.length;i++){&lt;br /&gt;  circles[i].move();&lt;br /&gt;  circles[i].collisionWall();&lt;br /&gt;  circles[i].view();&lt;br /&gt; }&lt;br /&gt; time++;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function Circle(){&lt;br /&gt; this.h = 0.9; this.x = 0; this.y = 100;&lt;br /&gt; this.vx = 0; this.vy = 0; this.r = 0;&lt;br /&gt; this.color = '#';&lt;br /&gt; &lt;br /&gt; this.init = function(vec){&lt;br /&gt;  this.vx = Math.random()*9+1;&lt;br /&gt;  this.r = Math.random()*25+5;&lt;br /&gt;  if(vec){&lt;br /&gt;   this.x = cw+100;&lt;br /&gt;   this.vx *= -1;&lt;br /&gt;  }else{&lt;br /&gt;   this.x = -100;&lt;br /&gt;  }&lt;br /&gt;  this.color += colorList[Math.floor(Math.random()*3)+3];&lt;br /&gt;  this.color += colorList[Math.floor(Math.random()*5)+5];&lt;br /&gt;  this.color += colorList[Math.floor(Math.random()*7)+9];&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; this.move = function(){&lt;br /&gt;  this.x += this.vx;&lt;br /&gt;  this.y += this.vy;&lt;br /&gt;  this.vy += g;&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; this.view = function(){&lt;br /&gt;  ctx.beginPath();&lt;br /&gt;  ctx.fillStyle = this.color;&lt;br /&gt;  ctx.arc(this.x, this.y, this.r, 0, 360,false);&lt;br /&gt;  ctx.fill();&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; this.collisionWall = function(){&lt;br /&gt;  if(this.x+this.r &amp;gt; cw &amp;amp;&amp;amp; this.vx &amp;gt; 0 || &lt;br /&gt;    this.x-this.r &amp;lt; 0 &amp;amp;&amp;amp; this.vx &amp;lt; 0){&lt;br /&gt;   this.vx *= -this.h;&lt;br /&gt;  }else if(this.y+this.r &amp;gt; ch &amp;amp;&amp;amp; this.vy &amp;gt; 0 || &lt;br /&gt;    this.y-this.r &amp;lt; 0 &amp;amp;&amp;amp; this.vy &amp;lt; 0){&lt;br /&gt;   this.vy *= -this.h;&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function collisionCircleCircle(a,b){&lt;br /&gt; if((b.x-a.x)*(b.x-a.x)+(b.y-a.y)*(b.y-a.y) &amp;lt; (a.r+b.r)*(a.r+b.r)){&lt;br /&gt;  var vx = a.x-b.x;&lt;br /&gt;  var vy = a.y-b.y;&lt;br /&gt;  var len = Math.sqrt(vx*vx+vy*vy);&lt;br /&gt;  var d = a.r+b.r-len;&lt;br /&gt;  if(len&amp;gt;0) len =1/len;&lt;br /&gt;  &lt;br /&gt;  vx *= len;&lt;br /&gt;  vy *= len;&lt;br /&gt;  &lt;br /&gt;  d /= 2.0;&lt;br /&gt;  a.x += vx*d;&lt;br /&gt;  a.y += vy*d;&lt;br /&gt;  b.x -= vx*d;&lt;br /&gt;  b.y -= vy*d;&lt;br /&gt;  &lt;br /&gt;  var t;&lt;br /&gt;  t = -(vx*a.vx+vy*a.vy)/(vx*vx+vy*vy);&lt;br /&gt;  var arx = a.vx+vx*t;&lt;br /&gt;  var ary = a.vy+vy*t;&lt;br /&gt;&lt;br /&gt;  t = -(-vy*a.vx+vx*a.vy)/(vy*vy+vx*vx);&lt;br /&gt;  var amx = a.vx-vy*t;&lt;br /&gt;  var amy = a.vy+vx*t;&lt;br /&gt;&lt;br /&gt;  t = -(vx*b.vx+vy*b.vy)/(vx*vx+vy*vy);&lt;br /&gt;  var brx = b.vx+vx*t;&lt;br /&gt;  var bry = b.vy+vy*t;&lt;br /&gt;&lt;br /&gt;  t = -(-vy*b.vx+vx*b.vy)/(vy*vy+vx*vx);&lt;br /&gt;  var bmx = b.vx-vy*t;&lt;br /&gt;  var bmy = b.vy+vx*t;&lt;br /&gt;  &lt;br /&gt;  var e = 0.8;&lt;br /&gt;  var adx = (a.r*amx+b.r*bmx+bmx*e*b.r-amx*e*b.r)/(a.r+b.r);&lt;br /&gt;  var bdx = -e*(bmx-amx)+adx;&lt;br /&gt;  var ady = (a.r*amy+b.r*bmy+bmy*e*b.r-amy*e*b.r)/(a.r+b.r);&lt;br /&gt;  var bdy = -e*(bmy-amy)+ady;&lt;br /&gt;  &lt;br /&gt;  a.vx = adx+arx;&lt;br /&gt;  a.vy = ady+ary;&lt;br /&gt;  b.vx = bdx+brx;&lt;br /&gt;  b.vy = bdy+bry;&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/744605407212742108-6662914156148846493?l=endoyuta.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://endoyuta.blogspot.com/feeds/6662914156148846493/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://endoyuta.blogspot.com/2011/12/html5-canvas.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/744605407212742108/posts/default/6662914156148846493'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/744605407212742108/posts/default/6662914156148846493'/><link rel='alternate' type='text/html' href='http://endoyuta.blogspot.com/2011/12/html5-canvas.html' title='HTML5 - Canvas 円同士の衝突アニメーション'/><author><name>endo yuta</name><uri>http://www.blogger.com/profile/05491646789675985410</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://1.bp.blogspot.com/-7dw9PlYIisc/TtuORirdBtI/AAAAAAAAAYc/kr_xs7ruXrU/s220/slime.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-744605407212742108.post-484583626171045853</id><published>2011-12-26T02:05:00.000+09:00</published><updated>2012-01-07T02:43:35.068+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ソーシャルメディア'/><category scheme='http://www.blogger.com/atom/ns#' term='UGC'/><category scheme='http://www.blogger.com/atom/ns#' term='本'/><category scheme='http://www.blogger.com/atom/ns#' term='プラットフォーム'/><category scheme='http://www.blogger.com/atom/ns#' term='音楽業界'/><title type='text'>一人レーベル</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://www.amazon.co.jp/%E6%9C%AA%E6%9D%A5%E5%9E%8B%E3%82%B5%E3%83%90%E3%82%A4%E3%83%90%E3%83%AB%E9%9F%B3%E6%A5%BD%E8%AB%96%E2%80%95USTREAM%E3%80%81twitter%E3%81%AF%E4%BD%95%E3%82%92%E5%A4%89%E3%81%88%E3%81%9F%E3%81%AE%E3%81%8B-%E4%B8%AD%E5%85%AC%E6%96%B0%E6%9B%B8%E3%83%A9%E3%82%AF%E3%83%AC-%E6%B4%A5%E7%94%B0-%E5%A4%A7%E4%BB%8B/dp/4121503708" target="_blank"  imageanchor="1" style="clear:left; float:left;margin-right:1em; margin-bottom:1em"&gt;&lt;img border="0" height="300" width="192" src="http://ec2.images-amazon.com/images/I/41NhJtMssOL.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;津田さんの音楽業界の本を読んだのでだらだらまとめておきます。読み返してないので間違ってるところもあると思います。&lt;br /&gt;&lt;br /&gt;音楽業界は、レコード会社が牛耳っていたが、最近はそうもいかなくなってきています。それも結構前からそうもいかなくなっております。昔はカセットテープでしたしもっと前はレコードでした。エジソンが発明したレコード再生機は非常に高価で宝石商などが扱う高級品でした。カセットテープになり、再生機のコモディティ化に伴い音楽産業が拡大しました。&lt;br /&gt;&lt;br /&gt;その後CDが出来まして、カラオケも流行りまして、CMタイアップも流行りまして、小室的な画一的なサビさえよけりゃどうでもいい的音楽が繁栄しました。音楽業界に絡む事業主体が増え、音楽を追求するというより儲かる音楽ありきのビジネスに音楽業界全体が突き進んだ時期です。このときレコード会社を主軸とする音楽業界の最盛期を迎えました。&lt;br /&gt;&lt;br /&gt;しかし今は、変わりました。CDからMP3に代わり、より簡単にコピーができるようになりました。インターネットの発展に伴い、グローバルに瞬時に音楽共有ができるようになりました。ナップスターの登場以降その交換は当たり前のものになり、CDの価値は低下し続けました。またエンターテインメントの種類や媒体も多様化され、DVDがあらゆるエンターテインメントを安価で提供することとなり、これらもCD消費を減退させる一因になりました。CD消費は急激に減退する中で、ライブの売り上げはフジロックなどのフェアの成功もあり増加傾向になっています。&lt;br /&gt;&lt;br /&gt;さて、レコード会社の機能は、音楽家の発掘、音楽の作成（CD化）、プロモーションの３機能がメインになりますが、MP3にせよCDーRにせよ非常に安価に作成出来る時代に今は来ています。またメジャーデビューして多大なプロモーションをうったとしても意外と儲からない時代になっています。また音楽家の発掘についても、そもそも儲からず、会社の成長が下降傾向にあるレコード会社は発掘するモチベーションも低下しています。そこで提案されているのが、一人レーベルというものです。&lt;br /&gt;&lt;br /&gt;発掘は主体的にインターネットのソーシャルメディアを活用することでファンと直接的コミュニケーションをとりながら、レコード会社という巨人一名に発掘してもらうのではなく、多数の一般ピープルから発掘してもらう方向にシフトすればいいのではということです。音楽作成はローコストで出来るし、プロモーションも発掘同様にソーシャルメディアの一員となりましょうということでした。ライブも重要な収入源としなければならないし、ライブ参加者限定のCD発売などメジャーからマイナーに指向をシフトしてファンクラブ的概念を音楽活動の主軸にしていこうぜということでした。&lt;br /&gt;&lt;br /&gt;ちなみに、音楽のレンタルは立教大学の３人の学生が始めたのですが、はやりました。瞬間的に全国でレンタルショップが出来上がり、レコード会社など既存の音楽産業既得権益者が裁判を起こしましたが、既存レンタルショップがすでに非常に多くの数になっていたこともあり、レンタルショップを潰さない妥協案が判決となりました。iTunseは全世界で流行ってますが、日本はレンタルショップの存在も大きく、メジャーレコードがiTuneseに存在しないといった状況もあることから、他国に比べるとiTunseの成功は控えめでした。&lt;br /&gt;&lt;br /&gt;この一人レーベルは当然ながら音楽だけにしか適用できない話ではなく、全てのUGCに適用できます。個人が表現し、そのアウトプットを商材にするような業界は全て当てはまります。電子書籍は上記の音楽の発展の経緯と類似しているといわれており、今比較しながら議論されるケースが多いです。自炊の裁判は、音楽レンタルと照らし合わせて、むやみに禁止しては行けないのでは？発展を阻害するのでは？といった議論があるのかなと思います。そしてその一人レーベル化を促すプラットフォームづくりがあらゆる分野で取り組まれている状況です。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/744605407212742108-484583626171045853?l=endoyuta.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://endoyuta.blogspot.com/feeds/484583626171045853/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://endoyuta.blogspot.com/2011/12/blog-post.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/744605407212742108/posts/default/484583626171045853'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/744605407212742108/posts/default/484583626171045853'/><link rel='alternate' type='text/html' href='http://endoyuta.blogspot.com/2011/12/blog-post.html' title='一人レーベル'/><author><name>endo yuta</name><uri>http://www.blogger.com/profile/05491646789675985410</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://1.bp.blogspot.com/-7dw9PlYIisc/TtuORirdBtI/AAAAAAAAAYc/kr_xs7ruXrU/s220/slime.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-744605407212742108.post-4331379316073458896</id><published>2011-12-25T20:05:00.001+09:00</published><updated>2011-12-25T20:16:11.289+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PHP'/><title type='text'>PHP - 集合に関する関数</title><content type='html'>&lt;p&gt;PHPで集合に関する操作をしたいので、関連する関数を調べます。今cakePHPでプログラムしているのでcakePHPを使います。&lt;/p&gt;&lt;p&gt;参考：&lt;a href="http://blog.justoneplanet.info/2009/04/21/php-arrays-as-stacks-queues-and-set%EF%BC%88%E3%82%B9%E3%82%BF%E3%83%83%E3%82%AF%E3%83%BB%E5%BE%85%E3%81%A1%E8%A1%8C%E5%88%97%E3%83%BB%E5%92%8C%E9%9B%86%E5%90%88%EF%BC%89/"&gt;PHP Arrays as Stacks, Queues and Set（スタック・待ち行列・和集合）&lt;/a&gt;&lt;/p&gt;&lt;h4&gt;Controller&lt;/h4&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;public function test(){&lt;br /&gt; $a = '1,2,3,4,5,6,7';&lt;br /&gt; $a = split(',',$a);&lt;br /&gt; $b = array(1,3,5,7,9,11,13);&lt;br /&gt;  &lt;br /&gt; $merge = array_merge($a,$b);&lt;br /&gt; $set = array_unique($merge);&lt;br /&gt; $diff = array_diff($a,$b);&lt;br /&gt; $diff_assoc = array_diff_assoc($a,$b);&lt;br /&gt; $intersect = array_intersect($a,$b);&lt;br /&gt;  &lt;br /&gt; $data = array(&lt;br /&gt;  'merge' =&amp;gt; $merge,&lt;br /&gt;  'set' =&amp;gt; $set,&lt;br /&gt;  'diff' =&amp;gt; $diff,&lt;br /&gt;  'diff_assoc' =&amp;gt; $diff_assoc,&lt;br /&gt;  'intersect' =&amp;gt; $intersect&lt;br /&gt; );&lt;br /&gt;  &lt;br /&gt; $this-&amp;gt;set('data',$data);&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;h4&gt;View&lt;/h4&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;&amp;lt;?php &lt;br /&gt; echo 'merge: ';&lt;br /&gt; foreach($data['merge'] as $a){&lt;br /&gt;  echo $a. ' , ';&lt;br /&gt; }&lt;br /&gt; echo '&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;';&lt;br /&gt; &lt;br /&gt; echo 'set: ';&lt;br /&gt; foreach($data['set'] as $a){&lt;br /&gt;  echo $a. ' , ';&lt;br /&gt; }&lt;br /&gt; echo '&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;';&lt;br /&gt; &lt;br /&gt; echo 'diff: ';&lt;br /&gt; foreach($data['diff'] as $a){&lt;br /&gt;  echo $a. ' , ';&lt;br /&gt; }&lt;br /&gt; echo '&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;';&lt;br /&gt; &lt;br /&gt; echo 'diff_assoc: ';&lt;br /&gt; foreach($data['diff_assoc'] as $a){&lt;br /&gt;  echo $a. ' , ';&lt;br /&gt; }&lt;br /&gt; echo '&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;';&lt;br /&gt; &lt;br /&gt; echo 'intersect: ';&lt;br /&gt; foreach($data['intersect'] as $a){&lt;br /&gt;  echo $a. ' , ';&lt;br /&gt; }&lt;br /&gt; echo '&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;';&lt;br /&gt;?&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;h4&gt;結果&lt;/h4&gt;&lt;pre&gt;merge: 1 , 2 , 3 , 4 , 5 , 6 , 7 , 1 , 3 , 5 , 7 , 9 , 11 , 13 , &lt;br /&gt;&lt;br /&gt;set: 1 , 2 , 3 , 4 , 5 , 6 , 7 , 9 , 11 , 13 , &lt;br /&gt;&lt;br /&gt;diff: 2 , 4 , 6 , &lt;br /&gt;&lt;br /&gt;diff_assoc: 2 , 3 , 4 , 5 , 6 , 7 , &lt;br /&gt;&lt;br /&gt;intersect: 1 , 3 , 5 , 7 , &lt;/pre&gt;&lt;h4&gt;まとめ&lt;/h4&gt;&lt;table class="pretty"&gt;&lt;tr&gt;&lt;td&gt;array_merge($a,$b)&lt;/td&gt;&lt;td&gt;単純に配列$aの後ろに配列$bをつなげて出力する&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;array_unique($merge)&lt;/td&gt;&lt;td&gt;配列の要素から重複を取り除いて出力する&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;array_diff($a,$b)&lt;/td&gt;&lt;td&gt;配列$aにあって、配列$bにない要素のみ出力する&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt; array_diff_assoc($a,$b)&lt;/td&gt;&lt;td&gt;array_diffと基本的に同じだが、配列$aと配列$bを比較する際に、キーの一致も確認する。今回の場合、キーと値のペアが一致するのは、1のみである為、配列$aの1以外の数字が出力された。&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;array_intersect($a,$b)&lt;/td&gt;&lt;td&gt;配列$aにも配列$bにもある要素のみ出力する。&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/744605407212742108-4331379316073458896?l=endoyuta.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://endoyuta.blogspot.com/feeds/4331379316073458896/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://endoyuta.blogspot.com/2011/12/php_25.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/744605407212742108/posts/default/4331379316073458896'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/744605407212742108/posts/default/4331379316073458896'/><link rel='alternate' type='text/html' href='http://endoyuta.blogspot.com/2011/12/php_25.html' title='PHP - 集合に関する関数'/><author><name>endo yuta</name><uri>http://www.blogger.com/profile/05491646789675985410</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://1.bp.blogspot.com/-7dw9PlYIisc/TtuORirdBtI/AAAAAAAAAYc/kr_xs7ruXrU/s220/slime.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-744605407212742108.post-4863884169719777321</id><published>2011-12-25T13:26:00.001+09:00</published><updated>2011-12-25T13:26:15.356+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='PHP'/><category scheme='http://www.blogger.com/atom/ns#' term='JSON'/><category scheme='http://www.blogger.com/atom/ns#' term='JQuery'/><category scheme='http://www.blogger.com/atom/ns#' term='cakePHP'/><category scheme='http://www.blogger.com/atom/ns#' term='Ajax'/><title type='text'>cakePHP - RequestHandlerとJSONレスポンス</title><content type='html'>&lt;h3&gt;RequestHandler&lt;/h3&gt;&lt;p&gt;&lt;a href="http://blogs.yahoo.co.jp/to_world_my_message/3584128.html"&gt;★RequestHandlerコンポーネント★&lt;/a&gt;&lt;/p&gt;&lt;p&gt;RequestHandlerコンポーネントを使うと、クライアントの状態をチェックできる。GETによるアクセスなのか、POSTによるアクセスなのか、Ajaxによるアクセスなのか、などが分かる。&lt;/p&gt;&lt;p&gt;RequestHandlerを使うには、コントローラの$componentsにRequestHandlerを追加する必要がある。&lt;/p&gt;&lt;pre class="prettyprint"&gt;public $components = array('RequestHandler');&lt;/pre&gt;&lt;blockquote&gt;$this-&gt;RequestHandler-&gt;isGet　→　GETによるアクセスかどうか&lt;br /&gt;$this-&gt;RequestHandler-&gt;isPost　→　POSTによるアクセスかどうか&lt;br /&gt;$this-&gt;RequestHandler-&gt;isSSL　→　SSL（HTTPS）アクセスかどうか&lt;br /&gt;$this-&gt;RequestHandler-&gt;isAjax　→　Ajaxによるアクセスかどうか&lt;br /&gt;$this-&gt;RequestHandler-&gt;isXml　→　XMLレスポンスを受け付けるかどうか&lt;br /&gt;$this-&gt;RequestHandler-&gt;isRss　→　RSSレスポンスを受け付けるかどうか&lt;br /&gt;$this-&gt;RequestHandler-&gt;isAtom　→　Atomレスポンスを受け付けるかどうか&lt;br /&gt;$this-&gt;RequestHandler-&gt;isMobile　→　モバイルからのアクセスかどうか&lt;/blockquote&gt;&lt;p&gt;クライアントの状態チェック以外にも使える。例えば、cakePHPのアクションがHTMLではなくJson形式でレスポンスしたいといった場合に、コンテンツの形式を変更できる。&lt;/p&gt;&lt;br /&gt;&lt;h3&gt;Ajax処理のJSON出力&lt;/h3&gt;&lt;p&gt;&lt;a href="http://c-brains.jp/blog/wsg/11/01/21-232435.php"&gt;[CakePHP]Ajax処理のJSON出力を共通化する&lt;/a&gt;&lt;/p&gt;&lt;p&gt;というページで、cakePHPでJSON出力する際の便利なコードが書いてある。これを使えば、Ajaxの仕組みを作る度にctpファイルを作るというめんどうな作業がなくなる。ちなみにこのページのコードでは下記でRequestHandlerを使っている。&lt;/p&gt;&lt;pre class="prettyprint"&gt;$this-&amp;gt;RequestHandler-&amp;gt;setContent('json');&lt;br /&gt;$this-&amp;gt;RequestHandler-&amp;gt;respondAs('application/json; charset=UTF-8');&lt;/pre&gt;&lt;p&gt;このページのコードを使えば、$this-&amp;gt;set($data);を使う代わりに、$this-&amp;gt;_renderJson($data);を使うだけで、JSON形式で出力できる。あとは、viewでjavascriptのコードを書いて、Ajaxでコントローラーのアクションにアクセスし、ゲットしたJSONを使えばいい。&lt;/p&gt;&lt;p&gt;下記はjavascriptのコード例。jQueryを使っている。#bookSearchをクリックしたらbooksearch()が起動して、#bookSearchTextの内容を./book_searchアクションに渡している。アクションのJSONレスポンスをもとに、#book_infosに本の情報やページ情報を記載している様。&lt;/p&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;$(function(){&lt;br /&gt;    $('#bookSearch').click(function(){booksearch();});&lt;br /&gt;});&lt;br /&gt;&lt;br /&gt;function booksearch_ajax(keyword,page){&lt;br /&gt;　$.ajax({&lt;br /&gt;　　type: &amp;quot;POST&amp;quot;,&lt;br /&gt;　　dataType: &amp;quot;json&amp;quot;,&lt;br /&gt;　　data: {&amp;quot;keyword&amp;quot;:keyword,'page':page},&lt;br /&gt;　　url: &amp;quot;./book_search&amp;quot;,&lt;br /&gt;　　success: function(data){&lt;br /&gt;　　　if(data != '') {&lt;br /&gt;       　　$('#book_infos').empty();&lt;br /&gt;        　　writeBookInfo(data);&lt;br /&gt;        　　writePage(data);&lt;br /&gt;　　　}&lt;br /&gt;　　}&lt;br /&gt;　});&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function booksearch(){&lt;br /&gt;　var keyword = $('#bookSearchText').val();&lt;br /&gt;　var page = 1;&lt;br /&gt;　booksearch_ajax(keyword,page);&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/744605407212742108-4863884169719777321?l=endoyuta.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://endoyuta.blogspot.com/feeds/4863884169719777321/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://endoyuta.blogspot.com/2011/12/cakephp-requesthandlerjson.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/744605407212742108/posts/default/4863884169719777321'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/744605407212742108/posts/default/4863884169719777321'/><link rel='alternate' type='text/html' href='http://endoyuta.blogspot.com/2011/12/cakephp-requesthandlerjson.html' title='cakePHP - RequestHandlerとJSONレスポンス'/><author><name>endo yuta</name><uri>http://www.blogger.com/profile/05491646789675985410</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://1.bp.blogspot.com/-7dw9PlYIisc/TtuORirdBtI/AAAAAAAAAYc/kr_xs7ruXrU/s220/slime.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-744605407212742108.post-9108039947279853788</id><published>2011-12-17T22:28:00.001+09:00</published><updated>2011-12-17T22:28:38.127+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='AmazonAPI'/><title type='text'>Amazon API ページ番号を指定する</title><content type='html'>&lt;a href="http://y-anz-m.blogspot.com/2009/12/amazon-api.html"&gt;http://y-anz-m.blogspot.com/2009/12/amazon-api.html&lt;/a&gt;&lt;pre&gt;ItemPage=N (N は ページ番号)&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/744605407212742108-9108039947279853788?l=endoyuta.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://endoyuta.blogspot.com/feeds/9108039947279853788/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://endoyuta.blogspot.com/2011/12/amazon-api.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/744605407212742108/posts/default/9108039947279853788'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/744605407212742108/posts/default/9108039947279853788'/><link rel='alternate' type='text/html' href='http://endoyuta.blogspot.com/2011/12/amazon-api.html' title='Amazon API ページ番号を指定する'/><author><name>endo yuta</name><uri>http://www.blogger.com/profile/05491646789675985410</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://1.bp.blogspot.com/-7dw9PlYIisc/TtuORirdBtI/AAAAAAAAAYc/kr_xs7ruXrU/s220/slime.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-744605407212742108.post-7186948436271191216</id><published>2011-12-13T00:46:00.000+09:00</published><updated>2011-12-13T00:57:28.775+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PHP'/><category scheme='http://www.blogger.com/atom/ns#' term='JSON'/><category scheme='http://www.blogger.com/atom/ns#' term='twitterAPI'/><category scheme='http://www.blogger.com/atom/ns#' term='API'/><category scheme='http://www.blogger.com/atom/ns#' term='cakePHP'/><category scheme='http://www.blogger.com/atom/ns#' term='Session'/><title type='text'>cakePHP - twitterAPIを使う</title><content type='html'>cakePHPでtwitterAPIを使う。超分かり易くて簡単なライブラリがあった。&lt;br /&gt;&lt;br /&gt;&lt;a href="http://code.42dh.com/oauth/"&gt;Consuming OAuth-enabled APIs with CakePHP&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;このページからライブラリをダウンロードして、vendorsに、OAuthフォルダをそのまま格納する。&lt;br /&gt;そして、controllerとviewにそれぞれ下記のようなコードを書く。&lt;br /&gt;※コールバック用URLとコンシューマーキー、コンシューマーシークレットは状況に合わせて入力する必要がある&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;hoge_controller.php&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;&amp;lt;?php &lt;br /&gt;App::import('Vendor', 'oauth', array('file' =&amp;gt; 'OAuth'.DS.'oauth_consumer.php'));&lt;br /&gt;&lt;br /&gt;class HogeController extends AppController{&lt;br /&gt;    public $name = 'Hoge';&lt;br /&gt;    public $uses = Null;&lt;br /&gt; &lt;br /&gt;    function index(){&lt;br /&gt;        //セッションからアクセストークンの取得&lt;br /&gt;        $accessToken = $this-&amp;gt;Session-&amp;gt;read('twitter_access_token');&lt;br /&gt;        if(!empty($accessToken)){&lt;br /&gt;            $consumer = $this-&amp;gt;createConsumer();&lt;br /&gt;            //認証情報の確認&lt;br /&gt;            $user_data = $consumer-&amp;gt;get($accessToken-&amp;gt;key, $accessToken-&amp;gt;secret,&lt;br /&gt;                'http://api.twitter.com/1/account/verify_credentials.json');&lt;br /&gt;            $user_data = json_decode($user_data);&lt;br /&gt;            if(!$user_data-&amp;gt;id){&lt;br /&gt;                $this-&amp;gt;redirect('./login');&lt;br /&gt;            }&lt;br /&gt;            $this-&amp;gt;set('user_data',$user_data);&lt;br /&gt;        }else{&lt;br /&gt;            $this-&amp;gt;redirect('./login');&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public function login(){&lt;br /&gt;  &lt;br /&gt;    }&lt;br /&gt; &lt;br /&gt;    public function logout(){&lt;br /&gt;        $this-&amp;gt;Session-&amp;gt;delete('twitter_access_token');&lt;br /&gt;        $this-&amp;gt;redirect('./login');&lt;br /&gt;    }&lt;br /&gt; &lt;br /&gt;    public function twitter() {&lt;br /&gt;        $consumer = $this-&amp;gt;createConsumer();&lt;br /&gt;        $requestToken = $consumer-&amp;gt;getRequestToken('https://api.twitter.com/oauth/request_token', 'http://コールバックURL');&lt;br /&gt;        $this-&amp;gt;Session-&amp;gt;write('twitter_request_token', $requestToken);&lt;br /&gt;        $this-&amp;gt;redirect('https://api.twitter.com/oauth/authorize?oauth_token=' . $requestToken-&amp;gt;key);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public function twitter_callback() {&lt;br /&gt;        $requestToken = $this-&amp;gt;Session-&amp;gt;read('twitter_request_token');&lt;br /&gt;        $consumer = $this-&amp;gt;createConsumer();&lt;br /&gt;        $accessToken = $consumer-&amp;gt;getAccessToken('https://api.twitter.com/oauth/access_token', $requestToken);&lt;br /&gt;        $this-&amp;gt;Session-&amp;gt;write('twitter_access_token', $accessToken);&lt;br /&gt;        $this-&amp;gt;redirect('./');&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    private function createConsumer() {&lt;br /&gt;        return new OAuth_Consumer('コンシューマーキー', 'コンシューマーシークレット');&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;?&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;index.ctp（index用のview）&lt;pre class="prettyprint"&gt;&lt;br /&gt;&amp;lt;h1&amp;gt;Hoge!&amp;lt;/h1&amp;gt;&lt;br /&gt;&amp;lt;img src=&amp;quot;&amp;lt;?php echo $user_data-&amp;gt;profile_image_url;?&amp;gt;&amp;quot; width=&amp;quot;24&amp;quot; height=&amp;quot;24&amp;quot; /&amp;gt;&lt;br /&gt;&amp;lt;?php echo $user_data-&amp;gt;screen_name; ?&amp;gt;&lt;br /&gt; ( &amp;lt;a href=&amp;quot;./logout&amp;quot;&amp;gt;Logout?&amp;lt;/a&amp;gt; )&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;login.ctp（login用のview）&lt;pre&gt;&lt;br /&gt;&amp;lt;h1&amp;gt;Hoge!&amp;lt;/h1&amp;gt;&lt;br /&gt;&amp;lt;h2&amp;gt;&amp;lt;a href=&amp;quot;./twitter&amp;quot;&amp;gt;Please Login!&amp;lt;/a&amp;gt;&amp;lt;/h2&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;これで、下記のようにtwitterAPIを使ってログインできるようになり、ログインすると、twitterアカウントのアイコンとscreen_nameが表示される。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;ログインしていないと、下記のログイン画面が表示される。&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/--Sf6qHIRUEU/TuYgH_2Bq-I/AAAAAAAAAZg/YMWJbFb9Km0/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-12-13%2B0.35.59%25EF%25BC%2589.png" imageanchor="1" style="margin-left:1em; margin-right:1em"&gt;&lt;img border="0" height="250" width="320" src="http://1.bp.blogspot.com/--Sf6qHIRUEU/TuYgH_2Bq-I/AAAAAAAAAZg/YMWJbFb9Km0/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-12-13%2B0.35.59%25EF%25BC%2589.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;ログインした後のindex画面&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-WvcJaw7Qado/TuYgrDUEGvI/AAAAAAAAAZs/0ghZ4RCWRSQ/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-12-13%2B0.35.37%25EF%25BC%2589.png" imageanchor="1" style="margin-left:1em; margin-right:1em"&gt;&lt;img border="0" height="238" width="320" src="http://1.bp.blogspot.com/-WvcJaw7Qado/TuYgrDUEGvI/AAAAAAAAAZs/0ghZ4RCWRSQ/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-12-13%2B0.35.37%25EF%25BC%2589.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/744605407212742108-7186948436271191216?l=endoyuta.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://endoyuta.blogspot.com/feeds/7186948436271191216/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://endoyuta.blogspot.com/2011/12/cakephp-twitterapi.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/744605407212742108/posts/default/7186948436271191216'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/744605407212742108/posts/default/7186948436271191216'/><link rel='alternate' type='text/html' href='http://endoyuta.blogspot.com/2011/12/cakephp-twitterapi.html' title='cakePHP - twitterAPIを使う'/><author><name>endo yuta</name><uri>http://www.blogger.com/profile/05491646789675985410</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://1.bp.blogspot.com/-7dw9PlYIisc/TtuORirdBtI/AAAAAAAAAYc/kr_xs7ruXrU/s220/slime.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/--Sf6qHIRUEU/TuYgH_2Bq-I/AAAAAAAAAZg/YMWJbFb9Km0/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-12-13%2B0.35.59%25EF%25BC%2589.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-744605407212742108.post-3774535885756536711</id><published>2011-12-12T23:44:00.001+09:00</published><updated>2011-12-12T23:44:49.028+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PHP'/><category scheme='http://www.blogger.com/atom/ns#' term='cakePHP'/><category scheme='http://www.blogger.com/atom/ns#' term='Session'/><title type='text'>cakePHP セッション</title><content type='html'>cakePHPでのセッションの取り扱いも超簡単だ。&lt;br /&gt;&lt;br /&gt;&lt;a href="http://d.hatena.ne.jp/theworldjp/20080312/1205288970"&gt;『CakePHP』を使ってみる ～11～ セッションの使い方確認&lt;/a&gt;に書いてある。以下引用。&lt;pre class="prettyprint"&gt;&lt;br /&gt;// Write&lt;br /&gt;$this-&amp;gt;Session-&amp;gt;write('myname', 'Yossy');&lt;br /&gt;echo 'Write: '.$this-&amp;gt;Session-&amp;gt;read('myname');&lt;br /&gt;&lt;br /&gt;// Delete&lt;br /&gt;$this-&amp;gt;Session-&amp;gt;delete('username');&lt;br /&gt;echo 'Delete: '.$this-&amp;gt;Session-&amp;gt;read('myname');&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/744605407212742108-3774535885756536711?l=endoyuta.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://endoyuta.blogspot.com/feeds/3774535885756536711/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://endoyuta.blogspot.com/2011/12/cakephp_12.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/744605407212742108/posts/default/3774535885756536711'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/744605407212742108/posts/default/3774535885756536711'/><link rel='alternate' type='text/html' href='http://endoyuta.blogspot.com/2011/12/cakephp_12.html' title='cakePHP セッション'/><author><name>endo yuta</name><uri>http://www.blogger.com/profile/05491646789675985410</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://1.bp.blogspot.com/-7dw9PlYIisc/TtuORirdBtI/AAAAAAAAAYc/kr_xs7ruXrU/s220/slime.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-744605407212742108.post-7270475658860307801</id><published>2011-12-12T23:38:00.000+09:00</published><updated>2011-12-12T23:38:19.425+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PHP'/><category scheme='http://www.blogger.com/atom/ns#' term='JSON'/><category scheme='http://www.blogger.com/atom/ns#' term='cakePHP'/><title type='text'>cakePHP JSONデコード</title><content type='html'>cakePHPでJSONデータをPHPで使えるようにデコードするには、下記で簡単にできる。&lt;pre class="prettyprint"&gt;json_decode('JSON形式のデータ');&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/744605407212742108-7270475658860307801?l=endoyuta.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://endoyuta.blogspot.com/feeds/7270475658860307801/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://endoyuta.blogspot.com/2011/12/cakephp-json.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/744605407212742108/posts/default/7270475658860307801'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/744605407212742108/posts/default/7270475658860307801'/><link rel='alternate' type='text/html' href='http://endoyuta.blogspot.com/2011/12/cakephp-json.html' title='cakePHP JSONデコード'/><author><name>endo yuta</name><uri>http://www.blogger.com/profile/05491646789675985410</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://1.bp.blogspot.com/-7dw9PlYIisc/TtuORirdBtI/AAAAAAAAAYc/kr_xs7ruXrU/s220/slime.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-744605407212742108.post-905693940080132934</id><published>2011-12-11T19:17:00.001+09:00</published><updated>2011-12-11T19:19:46.959+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MySQL'/><category scheme='http://www.blogger.com/atom/ns#' term='PHP'/><category scheme='http://www.blogger.com/atom/ns#' term='cakePHP'/><category scheme='http://www.blogger.com/atom/ns#' term='Database'/><title type='text'>cakePHP - データ更新</title><content type='html'>データ更新は、&lt;a href="http://endoyuta.blogspot.com/2011/12/cakephp_11.html"&gt;saveメソッド&lt;/a&gt;で実施できる。プライマリーキーが引数で与えられたデータに含まれない場合は、データを新規追加し、含まれる場合は与えられたデータ内容で更新する。&lt;br /&gt;&lt;br /&gt;特定のフィールドのみ更新する場合は下記のようになる。&lt;pre class="prettyprint"&gt;&lt;br /&gt;$this-&amp;gt;Board-&amp;gt;id = $this-&amp;gt;data['Board']['id'];&lt;br /&gt;$this-&amp;gt;Board-&amp;gt;saveField('content',$this-&amp;gt;data['Board']['content']);&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/744605407212742108-905693940080132934?l=endoyuta.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://endoyuta.blogspot.com/feeds/905693940080132934/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://endoyuta.blogspot.com/2011/12/cakephp_451.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/744605407212742108/posts/default/905693940080132934'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/744605407212742108/posts/default/905693940080132934'/><link rel='alternate' type='text/html' href='http://endoyuta.blogspot.com/2011/12/cakephp_451.html' title='cakePHP - データ更新'/><author><name>endo yuta</name><uri>http://www.blogger.com/profile/05491646789675985410</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://1.bp.blogspot.com/-7dw9PlYIisc/TtuORirdBtI/AAAAAAAAAYc/kr_xs7ruXrU/s220/slime.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-744605407212742108.post-2355912809775336708</id><published>2011-12-11T17:39:00.001+09:00</published><updated>2011-12-11T18:10:13.471+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MySQL'/><category scheme='http://www.blogger.com/atom/ns#' term='PHP'/><category scheme='http://www.blogger.com/atom/ns#' term='cakePHP'/><category scheme='http://www.blogger.com/atom/ns#' term='Database'/><title type='text'>cakePHP - データの削除</title><content type='html'>データの削除はidをもとに削除する場合は単純である。&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;$this-&amp;gt;Board-&amp;gt;delete($this-&amp;gt;data['Board']['id']);&lt;br /&gt;&lt;/pre&gt;delete('idの数字')だけで削除できる。上記は、Boardモデルのdeleteメソッドを使って、idフィールドが$this-&amp;gt;data['Board']['id']であるデータを、boardsテーブルから削除している。&lt;br /&gt;&lt;br /&gt;delete(id)以外の方法は下記である。&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;$this-&amp;gt;Board-&amp;gt;deleteAll(array('Board.name'=&amp;gt;&lt;br /&gt; $this-&amp;gt;data['Board']['name']));&lt;br /&gt;&lt;/pre&gt;これは、Board.nameが、$this-&gt;data['Board']['name']と等しいデータが全て削除される。&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;$this-&amp;gt;Board-&amp;gt;deleteAll(array('Board.name like ?'=&amp;gt;&lt;br /&gt; &amp;quot;%{$this-&amp;gt;data['Board']['name']}%&amp;quot;));&lt;br /&gt;&lt;/pre&gt;これは、&lt;a href="http://endoyuta.blogspot.com/2011/12/cakephp_7435.html"&gt;データ検索（２）&lt;/a&gt;で記載されているfindメソッドの「?」と同じことが行われている。cakePHPでは、内部でSQL構文を構築するにあたり、「?」に、その後与えられている配列の値が順に当てはめられる。すなわち上記は、Board.nameに、$this-&gt;data['Board']['name']の値が含まれるデータが全て削除される。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/744605407212742108-2355912809775336708?l=endoyuta.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://endoyuta.blogspot.com/feeds/2355912809775336708/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://endoyuta.blogspot.com/2011/12/cakephp_9120.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/744605407212742108/posts/default/2355912809775336708'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/744605407212742108/posts/default/2355912809775336708'/><link rel='alternate' type='text/html' href='http://endoyuta.blogspot.com/2011/12/cakephp_9120.html' title='cakePHP - データの削除'/><author><name>endo yuta</name><uri>http://www.blogger.com/profile/05491646789675985410</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://1.bp.blogspot.com/-7dw9PlYIisc/TtuORirdBtI/AAAAAAAAAYc/kr_xs7ruXrU/s220/slime.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-744605407212742108.post-1249862901208626893</id><published>2011-12-11T16:37:00.001+09:00</published><updated>2011-12-11T17:28:52.265+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MySQL'/><category scheme='http://www.blogger.com/atom/ns#' term='PHP'/><category scheme='http://www.blogger.com/atom/ns#' term='cakePHP'/><category scheme='http://www.blogger.com/atom/ns#' term='Database'/><title type='text'>cakePHP - データ検索（２）</title><content type='html'>&lt;a href="http://endoyuta.blogspot.com/2011/12/cakephp_9750.html"&gt;cakePHP - データ検索（１）&lt;/a&gt;&lt;br /&gt;上記でfindの概要がわかったが、もっと色々findの使い方がある。主にオプションであるconditionsの設定の仕方である。これを色々試す。&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;$data = $this-&amp;gt;Board-&amp;gt;find('all',array('conditions'=&amp;gt;&lt;br /&gt; array('Board.id'=&amp;gt;$this-&amp;gt;data['Board']['id'])));&lt;br /&gt;&lt;/pre&gt;これは&lt;a href="http://endoyuta.blogspot.com/2011/12/cakephp_9750.html"&gt;（１）&lt;/a&gt;で試したコードで、Board.idが、$this-&gt;data['Board']['id']の値と等しいものを取得する。&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;$data = $this-&amp;gt;Board-&amp;gt;find('all',array('conditions'=&amp;gt;&lt;br /&gt; array('Board.name like'=&amp;gt;&amp;quot;%{$this-&amp;gt;data['Board']['name']}%&amp;quot;)));&lt;br /&gt;&lt;/pre&gt;これは、Board.nameに、%演算子で囲まれたテキストが含まれるものを取得する。&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;$data = $this-&amp;gt;Board-&amp;gt;find('all',array('conditions'=&amp;gt;&lt;br /&gt; array('Board.name like ?'=&amp;gt;array(&lt;br /&gt; &amp;quot;%{$this-&amp;gt;data['Board']['name']}%&amp;quot;))));&lt;br /&gt;&lt;/pre&gt;これは、一つ上のコードと全く同じことが行われる。findメソッドは、キー名に含まれる「?」部分に、値として指定されている配列から順に要素を取り出しはめ込んでいく。SQL構文とこの?の仕組みを理解していれば、SQLのWHERE句で実施される全てが行えるようだ。&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;$data = $this-&amp;gt;Board-&amp;gt;find('all',array('conditions'=&amp;gt;&lt;br /&gt; array('Board.id between ? and ?'=&amp;gt;array(2,5))));&lt;br /&gt;&lt;/pre&gt;これは、最初の?に2を入れて、次の?に5を入れている。Board.idが2〜5の間のものを取得する。&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;$data = $this-&amp;gt;Board-&amp;gt;findAllById(1);&lt;br /&gt;&lt;/pre&gt;これは、○○=××であるといったシンプルな条件指定の際に利用できる、非常に簡便なメソッドである。findAllByの後にフィールド名をキャメル記法でつなげればよい。findAllById(1)というのは、idフィールドが1であるものを全て取得することになる。&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;$data = $this-&amp;gt;Board-&amp;gt;findById(1);&lt;br /&gt;&lt;/pre&gt;これは、findAllByと仕組みは同じだが、条件に合致する最初の一つを取得する。&lt;a href="http://endoyuta.blogspot.com/2011/12/cakephp_9750.html"&gt;（１）&lt;/a&gt;記載のallとfirstの関係と同じであり出力されるデータ構造もそれとおなじである。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/744605407212742108-1249862901208626893?l=endoyuta.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://endoyuta.blogspot.com/feeds/1249862901208626893/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://endoyuta.blogspot.com/2011/12/cakephp_7435.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/744605407212742108/posts/default/1249862901208626893'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/744605407212742108/posts/default/1249862901208626893'/><link rel='alternate' type='text/html' href='http://endoyuta.blogspot.com/2011/12/cakephp_7435.html' title='cakePHP - データ検索（２）'/><author><name>endo yuta</name><uri>http://www.blogger.com/profile/05491646789675985410</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://1.bp.blogspot.com/-7dw9PlYIisc/TtuORirdBtI/AAAAAAAAAYc/kr_xs7ruXrU/s220/slime.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-744605407212742108.post-2764277834582628933</id><published>2011-12-11T15:46:00.001+09:00</published><updated>2011-12-11T16:24:59.927+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MySQL'/><category scheme='http://www.blogger.com/atom/ns#' term='PHP'/><category scheme='http://www.blogger.com/atom/ns#' term='cakePHP'/><category scheme='http://www.blogger.com/atom/ns#' term='Database'/><title type='text'>cakePHP - データ検索</title><content type='html'>データの検索はこれでできる。&lt;pre class="prettyprint"&gt;&lt;br /&gt;$data = $this-&amp;gt;Board-&amp;gt;find('all',array('conditions'=&amp;gt;&lt;br /&gt; array('Board.id'=&amp;gt;$this-&amp;gt;data['Board']['id'])));&lt;br /&gt;&lt;/pre&gt;Boardモデルのfindメソッドを使って、テーブルboardsを検索している。find('検索仕様','オプション');のように引数を二つ要する。第一引数は、検索仕様の設定であり、all、first、list、countのいずれかを入力する。第二引数は、オプションの設定であり、conditions,fields,recursive,order,limit,pageを連想配列として入力する。&lt;h2 class="content"&gt;第一引数（検索仕様）&lt;/h2&gt;&lt;h3&gt;all&lt;/h3&gt;allは検索条件に合致する全てを返す。データ構造は下記のとおり。&lt;pre&gt;&lt;br /&gt;Array&lt;br /&gt;(&lt;br /&gt;    [0] =&amp;gt; Array&lt;br /&gt;        (&lt;br /&gt;            [Board] =&amp;gt; Array&lt;br /&gt;                (&lt;br /&gt;                    [id] =&amp;gt; 1&lt;br /&gt;                    [name] =&amp;gt; taro&lt;br /&gt;                    [title] =&amp;gt; test&lt;br /&gt;                    [content] =&amp;gt; hello every one. how are you today?&lt;br /&gt;                )&lt;br /&gt;&lt;br /&gt;        )&lt;br /&gt;&lt;br /&gt;)&lt;br /&gt;&lt;/pre&gt;&lt;h3&gt;first&lt;/h3&gt;firstは検索条件に合致する最初の一つを返す。データ構造は下記のとおり。&lt;pre&gt;&lt;br /&gt;Array&lt;br /&gt;(&lt;br /&gt;    [Board] =&amp;gt; Array&lt;br /&gt;        (&lt;br /&gt;            [id] =&amp;gt; 1&lt;br /&gt;            [name] =&amp;gt; taro&lt;br /&gt;            [title] =&amp;gt; test&lt;br /&gt;            [content] =&amp;gt; hello every one. how are you today?&lt;br /&gt;        )&lt;br /&gt;&lt;br /&gt;)&lt;br /&gt;&lt;/pre&gt;&lt;h3&gt;list&lt;/h3&gt;listは条件に合致する全てのデータの、キーとその次のフィールドを返す。データ構造は下記のとおり。&lt;pre&gt;&lt;br /&gt;Array&lt;br /&gt;(&lt;br /&gt;    [1] =&amp;gt; test&lt;br /&gt;)&lt;br /&gt;&lt;/pre&gt;&lt;h3&gt;count&lt;/h3&gt;countは条件に合致するデータの個数を返す。&lt;h2 class="content"&gt;第二引数（オプション）&lt;/h2&gt;&lt;h3&gt;conditions&lt;/h3&gt;条件の設定。条件をつけるフィールド名をキーに、検索する値を値とする連想配列として用意する&lt;h3&gt;fields&lt;/h3&gt;取得するフィールド名を配列として用意する&lt;h3&gt;recursive&lt;/h3&gt;再帰的に取得する深度&lt;h3&gt;order&lt;/h3&gt;取得順。順序を示す数字または名前を配列として用意する&lt;h3&gt;limit&lt;/h3&gt; 取得するレコード数&lt;h3&gt;page&lt;/h3&gt;取得するページ数&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/744605407212742108-2764277834582628933?l=endoyuta.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://endoyuta.blogspot.com/feeds/2764277834582628933/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://endoyuta.blogspot.com/2011/12/cakephp_9750.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/744605407212742108/posts/default/2764277834582628933'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/744605407212742108/posts/default/2764277834582628933'/><link rel='alternate' type='text/html' href='http://endoyuta.blogspot.com/2011/12/cakephp_9750.html' title='cakePHP - データ検索'/><author><name>endo yuta</name><uri>http://www.blogger.com/profile/05491646789675985410</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://1.bp.blogspot.com/-7dw9PlYIisc/TtuORirdBtI/AAAAAAAAAYc/kr_xs7ruXrU/s220/slime.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-744605407212742108.post-6258325481246918061</id><published>2011-12-11T14:29:00.001+09:00</published><updated>2011-12-11T14:30:10.907+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MySQL'/><category scheme='http://www.blogger.com/atom/ns#' term='phpMyAdmin'/><title type='text'>MySQL 照合順序 - 日本語を使えるようにする</title><content type='html'>照合順序を「utf8_unicode_ci」にすると、日本語使えるようになった。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/744605407212742108-6258325481246918061?l=endoyuta.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://endoyuta.blogspot.com/feeds/6258325481246918061/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://endoyuta.blogspot.com/2011/12/mysql.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/744605407212742108/posts/default/6258325481246918061'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/744605407212742108/posts/default/6258325481246918061'/><link rel='alternate' type='text/html' href='http://endoyuta.blogspot.com/2011/12/mysql.html' title='MySQL 照合順序 - 日本語を使えるようにする'/><author><name>endo yuta</name><uri>http://www.blogger.com/profile/05491646789675985410</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://1.bp.blogspot.com/-7dw9PlYIisc/TtuORirdBtI/AAAAAAAAAYc/kr_xs7ruXrU/s220/slime.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-744605407212742108.post-2968191764248257080</id><published>2011-12-11T13:41:00.001+09:00</published><updated>2011-12-11T14:08:11.820+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MySQL'/><category scheme='http://www.blogger.com/atom/ns#' term='PHP'/><category scheme='http://www.blogger.com/atom/ns#' term='cakePHP'/><category scheme='http://www.blogger.com/atom/ns#' term='Database'/><title type='text'>cakePHP - テーブルへのデータ追加</title><content type='html'>この一行でデータ追加ができる。&lt;pre class="prettyprint"&gt;$this-&gt;Board-&gt;save($this-&gt;data);&lt;/pre&gt;これは、Boardモデルのsaveメソッドによって$this-&gt;dataを登録している様だ。Boardモデルは、テーブルboardsの単数形をファイル名、クラス名に適用している。$this-&gt;dataも、テーブルboardsの構造に合致した配列構造になっている。&lt;br /&gt;&lt;br /&gt;例えば、テーブルboardsが、id,name,title,contentという４つのデータフィールドを持つとする。idはauto_incrementであるとすると、$this-&gt;dataに格納する必要があるのは、name,title,contentである。フォームからこれらのデータをユーザがインプットする場合、フォームに適用させるnameはそれぞれ、Board.name,Board.title,Board.contentである。つまり「テーブル名.データフィールド名」という形態にする必要がある。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/744605407212742108-2968191764248257080?l=endoyuta.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://endoyuta.blogspot.com/feeds/2968191764248257080/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://endoyuta.blogspot.com/2011/12/cakephp_11.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/744605407212742108/posts/default/2968191764248257080'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/744605407212742108/posts/default/2968191764248257080'/><link rel='alternate' type='text/html' href='http://endoyuta.blogspot.com/2011/12/cakephp_11.html' title='cakePHP - テーブルへのデータ追加'/><author><name>endo yuta</name><uri>http://www.blogger.com/profile/05491646789675985410</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://1.bp.blogspot.com/-7dw9PlYIisc/TtuORirdBtI/AAAAAAAAAYc/kr_xs7ruXrU/s220/slime.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-744605407212742108.post-2447293089295631520</id><published>2011-12-11T13:36:00.001+09:00</published><updated>2011-12-11T13:36:49.688+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PHP'/><category scheme='http://www.blogger.com/atom/ns#' term='cakePHP'/><title type='text'>cakePHP - リダイレクト(redirect)</title><content type='html'>cakePHPのリダイレクトは超お手軽だ。&lt;pre class="prettyprint"&gt;&lt;br /&gt;$this-&gt;redirect('.');&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/744605407212742108-2447293089295631520?l=endoyuta.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://endoyuta.blogspot.com/feeds/2447293089295631520/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://endoyuta.blogspot.com/2011/12/cakephp-redirect.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/744605407212742108/posts/default/2447293089295631520'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/744605407212742108/posts/default/2447293089295631520'/><link rel='alternate' type='text/html' href='http://endoyuta.blogspot.com/2011/12/cakephp-redirect.html' title='cakePHP - リダイレクト(redirect)'/><author><name>endo yuta</name><uri>http://www.blogger.com/profile/05491646789675985410</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://1.bp.blogspot.com/-7dw9PlYIisc/TtuORirdBtI/AAAAAAAAAYc/kr_xs7ruXrU/s220/slime.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-744605407212742108.post-3238546406064671598</id><published>2011-12-11T12:55:00.001+09:00</published><updated>2011-12-11T12:59:15.802+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PHP'/><category scheme='http://www.blogger.com/atom/ns#' term='cakePHP'/><title type='text'>cakePHP - scaffoldの使い方</title><content type='html'>テーブルを用意して、コントローラーに下記のように書くだけ。&lt;pre class="prettyprint"&gt;&lt;br /&gt;&amp;lt;?php &lt;br /&gt;class BoardsController extends AppController{&lt;br /&gt; public $name = 'Boards';&lt;br /&gt; public $scaffold;&lt;br /&gt;}&lt;br /&gt;?&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;ul&gt;&lt;li&gt;テーブル名：boards&lt;/li&gt;&lt;li&gt;コントローラファイル名：boards_controller.php&lt;/li&gt;&lt;li&gt;コントローラークラス名：BoardsController&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/744605407212742108-3238546406064671598?l=endoyuta.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://endoyuta.blogspot.com/feeds/3238546406064671598/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://endoyuta.blogspot.com/2011/12/cakephp-scaffold.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/744605407212742108/posts/default/3238546406064671598'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/744605407212742108/posts/default/3238546406064671598'/><link rel='alternate' type='text/html' href='http://endoyuta.blogspot.com/2011/12/cakephp-scaffold.html' title='cakePHP - scaffoldの使い方'/><author><name>endo yuta</name><uri>http://www.blogger.com/profile/05491646789675985410</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://1.bp.blogspot.com/-7dw9PlYIisc/TtuORirdBtI/AAAAAAAAAYc/kr_xs7ruXrU/s220/slime.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-744605407212742108.post-4613590410141524635</id><published>2011-12-11T11:03:00.001+09:00</published><updated>2011-12-11T11:07:43.715+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PHP'/><category scheme='http://www.blogger.com/atom/ns#' term='eclipse'/><category scheme='http://www.blogger.com/atom/ns#' term='cakePHP'/><title type='text'>CtpファイルをEclipseでPHPファイルとして表示する(CakePHP)</title><content type='html'>&lt;a href="http://www.yaunix.com/2011/01/03/ctp%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92eclipse%E3%81%A7php%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%A8%E3%81%97%E3%81%A6%E8%A1%A8%E7%A4%BA%E3%81%99%E3%82%8Bcakephp/"&gt;CtpファイルをEclipseでPHPファイルとして表示する(CakePHP)&lt;/a&gt;にやり方がのっているが、Eclipseの設定変更でctpファイルもPHPファイルとして表示されるようにした。&lt;blockquote&gt;Eclipseのメニューから Windows -&gt; Preferences をクリックし、 General -&gt; ContentTypesを選択します。&lt;/blockquote&gt;※macだと、メニューのEclipse-&gt;環境設定(Preferences)・・・になる。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/744605407212742108-4613590410141524635?l=endoyuta.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://endoyuta.blogspot.com/feeds/4613590410141524635/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://endoyuta.blogspot.com/2011/12/ctpeclipsephpcakephp.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/744605407212742108/posts/default/4613590410141524635'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/744605407212742108/posts/default/4613590410141524635'/><link rel='alternate' type='text/html' href='http://endoyuta.blogspot.com/2011/12/ctpeclipsephpcakephp.html' title='CtpファイルをEclipseでPHPファイルとして表示する(CakePHP)'/><author><name>endo yuta</name><uri>http://www.blogger.com/profile/05491646789675985410</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://1.bp.blogspot.com/-7dw9PlYIisc/TtuORirdBtI/AAAAAAAAAYc/kr_xs7ruXrU/s220/slime.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-744605407212742108.post-8796389932455446815</id><published>2011-12-11T02:44:00.001+09:00</published><updated>2011-12-11T02:47:52.780+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PHP'/><category scheme='http://www.blogger.com/atom/ns#' term='cakePHP'/><title type='text'>cakePHP モデルの規約</title><content type='html'>データベースのテーブル名を、usersにして、モデルファイルを、user.phpにして、モデルクラスをUserにすれば、コントローラーからUserモデルクラスにアクセスするだけで、テーブルusersにアクセスできる。つまりテーブル名は複数形、モデルファイル及びモデルクラス名は単数形で徹底する必要がある。複数形、単数形を管理している辞書がある。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/744605407212742108-8796389932455446815?l=endoyuta.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://endoyuta.blogspot.com/feeds/8796389932455446815/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://endoyuta.blogspot.com/2011/12/cakephp.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/744605407212742108/posts/default/8796389932455446815'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/744605407212742108/posts/default/8796389932455446815'/><link rel='alternate' type='text/html' href='http://endoyuta.blogspot.com/2011/12/cakephp.html' title='cakePHP モデルの規約'/><author><name>endo yuta</name><uri>http://www.blogger.com/profile/05491646789675985410</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://1.bp.blogspot.com/-7dw9PlYIisc/TtuORirdBtI/AAAAAAAAAYc/kr_xs7ruXrU/s220/slime.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-744605407212742108.post-4756735821267516103</id><published>2011-12-10T19:07:00.001+09:00</published><updated>2011-12-11T14:19:00.972+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='cakePHP'/><title type='text'>cakePHP - Appフォルダの構造</title><content type='html'>&lt;a href="http://book.cakephp.org/ja/view/899/CakePHP%E3%81%AE%E3%83%95%E3%82%A9%E3%83%AB%E3%83%80%E6%A7%8B%E9%80%A0"&gt;CakePHPのフォルダ構造&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;table border="1"&gt;&lt;tr&gt;&lt;th&gt;config&lt;/th&gt;&lt;td&gt;CakePHP が使用する（数個の）設定ファイルが入る場所です。データベース接続の詳細、ブートストラップ、コアの設定ファイルなどがここに入ります。&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;th&gt;controllers&lt;/th&gt;&lt;td&gt;アプリケーションのコントローラとコンポーネントが入ります。&lt;/td&gt;&lt;/tr&gt;  &lt;tr&gt;&lt;th&gt;libs&lt;/th&gt;  &lt;td&gt;サードパーティ、外部ベンダからのライブラリではなく、ファーストパーティのライブラリが入ります。これはベンダライブラリと内部ライブラリの構成を分割することを可能にします。&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;th&gt;locale&lt;/th&gt;&lt;td&gt;国際化のための文字ファイルが入ります。&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;th&gt;models&lt;/th&gt;&lt;td&gt;アプリケーションのモデル、ビヘイビア、データソースが入ります。&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;th&gt;plugins&lt;/th&gt;&lt;td&gt;プラグインパッケージが入ります。&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;th&gt;tmp&lt;/th&gt;&lt;td&gt;&lt;p&gt;CakePHP が一時的なデータを保管する場所です。保管される実際のデータは、CakePHP の設定しだいですが、このフォルダは通常、モデルの内容データや、ログの保管に使用されます。時にはセッション情報も入ります。&lt;/p&gt;&lt;p&gt;確実にこのフォルダが存在し、書き込み可能であるようにしてください。そうしないと、アプリケーションのパフォーマンスは激しく影響をうけることになります。デバッグモードでは、CakePHPがそうなっているかどうかを警告してくれます。&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;th&gt;vendors&lt;/th&gt;&lt;td&gt;外部（サードパーティ）で作成されたクラスやライブラリは、ここに置いてください。そうすることで、App::import('vendor', 'name') で簡単にアクセスできるようになります。注意して観察している人は、これは重複しているのではないか、と言うかもしれません。ディレクトリ構造のいちばん上にも vendors フォルダがあるからです。この二つのフォルダの違いは、複数のアプリケーションを動作させて、より複雑なシステムセットアップをする場合のことを考える際に扱いましょう。&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;th&gt;views&lt;/th&gt;&lt;td&gt;表示用のファイルはここに置きます。エレメント、エラーページ、ヘルパー、レイアウト、ビューのファイルなどです。&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;th&gt;webroot&lt;/th&gt;&lt;td&gt;運用時（production）用のセットアップでは、このフォルダがアプリケーションのドキュメントルートになります。CSS スタイルシートや画像、JavaScript を入れるためのフォルダもあります。&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/744605407212742108-4756735821267516103?l=endoyuta.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://endoyuta.blogspot.com/feeds/4756735821267516103/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://endoyuta.blogspot.com/2011/12/cakephp-app.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/744605407212742108/posts/default/4756735821267516103'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/744605407212742108/posts/default/4756735821267516103'/><link rel='alternate' type='text/html' href='http://endoyuta.blogspot.com/2011/12/cakephp-app.html' title='cakePHP - Appフォルダの構造'/><author><name>endo yuta</name><uri>http://www.blogger.com/profile/05491646789675985410</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://1.bp.blogspot.com/-7dw9PlYIisc/TtuORirdBtI/AAAAAAAAAYc/kr_xs7ruXrU/s220/slime.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-744605407212742108.post-1425342787948028821</id><published>2011-12-08T22:47:00.001+09:00</published><updated>2011-12-08T22:52:38.572+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ターミナル'/><category scheme='http://www.blogger.com/atom/ns#' term='PHP'/><category scheme='http://www.blogger.com/atom/ns#' term='cakePHP'/><category scheme='http://www.blogger.com/atom/ns#' term='XAMPP'/><category scheme='http://www.blogger.com/atom/ns#' term='ERROR'/><title type='text'>cakePHPの「・・・is not writable」エラー</title><content type='html'>xamppでcakePHPを使ってみているのですが、Warning (512): /var/www/html/cakephp/app/tmp/cache/ is not writable のようなエラーがでておりました。これまた権限の問題で、Finder上で権限変更しても直らず、念のためxamppのapatchを再起動してもダメでした。&lt;a href="http://cakephpdev.seesaa.net/article/118947821.html"&gt;CakePHPフレームワークで行こう&lt;/a&gt;にも同じエラーに関する記載があり、このブログのようにターミナル上で権限変更したら何故かオッケーでした。&lt;pre&gt;chmod -R 707 /Applications/XAMPP/xamppfiles/htdocs/cake/caketest/app/tmp&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/744605407212742108-1425342787948028821?l=endoyuta.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://endoyuta.blogspot.com/feeds/1425342787948028821/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://endoyuta.blogspot.com/2011/12/cakephpis-not-writable.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/744605407212742108/posts/default/1425342787948028821'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/744605407212742108/posts/default/1425342787948028821'/><link rel='alternate' type='text/html' href='http://endoyuta.blogspot.com/2011/12/cakephpis-not-writable.html' title='cakePHPの「・・・is not writable」エラー'/><author><name>endo yuta</name><uri>http://www.blogger.com/profile/05491646789675985410</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://1.bp.blogspot.com/-7dw9PlYIisc/TtuORirdBtI/AAAAAAAAAYc/kr_xs7ruXrU/s220/slime.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-744605407212742108.post-2712783537479139980</id><published>2011-12-08T01:29:00.001+09:00</published><updated>2011-12-08T01:36:33.629+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PHP'/><category scheme='http://www.blogger.com/atom/ns#' term='cakePHP'/><category scheme='http://www.blogger.com/atom/ns#' term='XAMPP'/><title type='text'>xamppでcakePHPを使うときの設定</title><content type='html'>xamppでcakePHP1.3を使う場合、プロジェクトを格納しているフォルダに、サーバ設定の上書きを許可する為に、/Applications/XAMPP/xamppfiles/etc/httpd.conf に下記を追記する必要がある。&lt;pre&gt;&lt;br /&gt;&amp;lt;Directory &amp;quot;/Applications/XAMPP/xamppfiles/htdocs/cake/&amp;quot;&amp;gt;&lt;br /&gt; Allow from all&lt;br /&gt;&amp;lt;/Directory&amp;gt;&lt;br /&gt;&lt;/pre&gt;上記パスはプロジェクトを格納しているフォルダのパスとなる。上記はxamppのhtdocsフォルダの配下にcakeというフォルダをつくり、そこにcakePHPプロジェクトを入れることを想定したパス。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/744605407212742108-2712783537479139980?l=endoyuta.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://endoyuta.blogspot.com/feeds/2712783537479139980/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://endoyuta.blogspot.com/2011/12/xamppcakephp.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/744605407212742108/posts/default/2712783537479139980'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/744605407212742108/posts/default/2712783537479139980'/><link rel='alternate' type='text/html' href='http://endoyuta.blogspot.com/2011/12/xamppcakephp.html' title='xamppでcakePHPを使うときの設定'/><author><name>endo yuta</name><uri>http://www.blogger.com/profile/05491646789675985410</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://1.bp.blogspot.com/-7dw9PlYIisc/TtuORirdBtI/AAAAAAAAAYc/kr_xs7ruXrU/s220/slime.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-744605407212742108.post-8790880790850669081</id><published>2011-12-08T01:06:00.001+09:00</published><updated>2011-12-08T01:15:25.560+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='XAMPP'/><category scheme='http://www.blogger.com/atom/ns#' term='アクセス権'/><category scheme='http://www.blogger.com/atom/ns#' term='max'/><title type='text'>macでxampp使う</title><content type='html'>macでxampp使うときは、最初xamppのhtdocsフォルダが読みのみOKという権限になっていて書き込めなかった。色々試したが、結局、/Applications/XAMPP/xamppfiles/htdocsフォルダのアクセス権限を読み／書き可に設定して、htdocsフォルダにサイトを置くのが一番分かり易かった。eclipseであれば、htdocsフォルダをワークスペースにして、localhost/プロジェクトフォルダという風にアクセスする。&lt;br /&gt;&lt;br /&gt;権限の変更は変更したいフォルダに、Finderで移動して、右クリックで情報をみるをクリックする。情報の一番したにアクセス権に関する内容が掲載されている。鍵マークをクリックして鍵を解除したら権限を変更できる。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/744605407212742108-8790880790850669081?l=endoyuta.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://endoyuta.blogspot.com/feeds/8790880790850669081/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://endoyuta.blogspot.com/2011/12/macxampp.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/744605407212742108/posts/default/8790880790850669081'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/744605407212742108/posts/default/8790880790850669081'/><link rel='alternate' type='text/html' href='http://endoyuta.blogspot.com/2011/12/macxampp.html' title='macでxampp使う'/><author><name>endo yuta</name><uri>http://www.blogger.com/profile/05491646789675985410</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://1.bp.blogspot.com/-7dw9PlYIisc/TtuORirdBtI/AAAAAAAAAYc/kr_xs7ruXrU/s220/slime.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-744605407212742108.post-1849680839620770565</id><published>2011-12-04T22:59:00.000+09:00</published><updated>2011-12-04T23:45:44.487+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MySQL'/><category scheme='http://www.blogger.com/atom/ns#' term='PHP'/><title type='text'>MySQL 数字データをINSERTしたら別の数字になっている件</title><content type='html'>SQL初心者です。PHPでMySQLを本日使い始めました。初めてのINSERTで衝撃を受けています。というのも、数字データをINSERTしたら、全く別の数字データがINSERTされているからです。原因不明なので調べていきます。&lt;br /&gt;&lt;br /&gt;現象はこうです。INSERTした数値データは、409312097であるにも関わらず、INSERTされた結果を確認すると、8388607になっている。&lt;br /&gt;&lt;br /&gt;すぐに原因が分かりました。。&lt;a href="http://pentan.info/sql/mysql/mysql_type_num.html"&gt;数値型(データ型)のまとめ&lt;/a&gt;に記載されていますが、数値データのデータ型を何も考えずにMEDIUMINTにしていました。しかし、これの最大値が8388607なのでした。最大値より大きい数値を登録しようとすると最大値になるんですね。勉強になりました。INTにしたら解決されました。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/744605407212742108-1849680839620770565?l=endoyuta.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://endoyuta.blogspot.com/feeds/1849680839620770565/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://endoyuta.blogspot.com/2011/12/mysql-insert.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/744605407212742108/posts/default/1849680839620770565'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/744605407212742108/posts/default/1849680839620770565'/><link rel='alternate' type='text/html' href='http://endoyuta.blogspot.com/2011/12/mysql-insert.html' title='MySQL 数字データをINSERTしたら別の数字になっている件'/><author><name>endo yuta</name><uri>http://www.blogger.com/profile/05491646789675985410</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://1.bp.blogspot.com/-7dw9PlYIisc/TtuORirdBtI/AAAAAAAAAYc/kr_xs7ruXrU/s220/slime.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-744605407212742108.post-2689735315537106094</id><published>2011-12-04T22:37:00.000+09:00</published><updated>2011-12-04T23:33:51.244+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PHP'/><title type='text'>PHP　文字列内での変数展開について</title><content type='html'>ダブルクオーテンションで囲った文字列内に変数が入っている場合、それは展開されます。しかし注意点があります。変数の後に半角スペースがない場合、その後の文字列まで変数名として扱われてしまいます。これを回避するには、シングルクオーテンションで囲った場合のように"."で文字列連結をするか、あるいは変数を{}で囲み変数名を明示するかのいずれかの方法があります。コード作成上は{}で囲む方が楽な気がしますが、文字列連結の方が若干高速であるらしいです。&lt;pre&gt;$a = 'aiueo';&lt;br /&gt;echo "これは、{$a}です。";&lt;/pre&gt;参考：&lt;a href="http://nyx.pu1.net/reference/variable/develop.html"&gt;文字列内での変数展開&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/744605407212742108-2689735315537106094?l=endoyuta.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://endoyuta.blogspot.com/feeds/2689735315537106094/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://endoyuta.blogspot.com/2011/12/php.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/744605407212742108/posts/default/2689735315537106094'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/744605407212742108/posts/default/2689735315537106094'/><link rel='alternate' type='text/html' href='http://endoyuta.blogspot.com/2011/12/php.html' title='PHP　文字列内での変数展開について'/><author><name>endo yuta</name><uri>http://www.blogger.com/profile/05491646789675985410</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://1.bp.blogspot.com/-7dw9PlYIisc/TtuORirdBtI/AAAAAAAAAYc/kr_xs7ruXrU/s220/slime.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-744605407212742108.post-3076470112391357406</id><published>2011-12-04T21:39:00.000+09:00</published><updated>2011-12-04T23:32:20.496+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MySQL'/><category scheme='http://www.blogger.com/atom/ns#' term='PHP'/><category scheme='http://www.blogger.com/atom/ns#' term='phpMyAdmin'/><category scheme='http://www.blogger.com/atom/ns#' term='XAMPP'/><title type='text'>xamppのMySQLのrootのパスワード設定が記載されているファイル</title><content type='html'>phpMyAdmin上でrootのパスワード設定をしたところ、phpMyAdminにアクセスできなくなり少しビビった。当然解決策は設定されているファイルを探して書き換えればよいとかそういうことなはずなので探した。たまたまphpMyAdmin上でパスワード生成したときのパスワードをコピーしていたのでそれをしかるべき箇所にペーストすれば復活するのではないかと思っている。&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.apachefriends.org/jp/faq-xampp-windows.html#password1"&gt;どのようにMySQL"root"ユーザのパスワードを設定するのですか？（方法2）&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;上記のページに、下記のような記載がある。&lt;blockquote&gt;次の手順で、phpMyAdmin設定を調整します。&lt;br /&gt;"\xampp\phpMyAdmin\config.inc.php"ファイル内にある以下の行を変更します：&lt;br /&gt;変更前：&lt;br /&gt;$cfg['Servers'][$i]['user'] = 'root';&lt;br /&gt;$cfg['Servers'][$i]['password'] = ''; &lt;br /&gt;変更後：&lt;br /&gt;$cfg['Servers'][$i]['user'] = 'root';&lt;br /&gt;$cfg['Servers'][$i]['password'] = 'secret';&lt;br /&gt; &lt;/blockquote&gt;早速上記のconfig.inc.phpファイルを探したところ確かに存在し、$cfg['Servers'][$i]['password']にコピーしておいたパスワードをペーストし保存したところ、phpMyAdminにアクセスできるようになった。しかしphpMyAdminのホームページでは依然としてエラーになる。。支障はないが。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/744605407212742108-3076470112391357406?l=endoyuta.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://endoyuta.blogspot.com/feeds/3076470112391357406/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://endoyuta.blogspot.com/2011/12/xamppmysqlroot.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/744605407212742108/posts/default/3076470112391357406'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/744605407212742108/posts/default/3076470112391357406'/><link rel='alternate' type='text/html' href='http://endoyuta.blogspot.com/2011/12/xamppmysqlroot.html' title='xamppのMySQLのrootのパスワード設定が記載されているファイル'/><author><name>endo yuta</name><uri>http://www.blogger.com/profile/05491646789675985410</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://1.bp.blogspot.com/-7dw9PlYIisc/TtuORirdBtI/AAAAAAAAAYc/kr_xs7ruXrU/s220/slime.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-744605407212742108.post-1119130553359177547</id><published>2011-12-04T19:54:00.000+09:00</published><updated>2011-12-04T23:32:20.475+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PHP'/><category scheme='http://www.blogger.com/atom/ns#' term='XAMPP'/><category scheme='http://www.blogger.com/atom/ns#' term='pear'/><title type='text'>XAMPPでpearコマンドを使う on mac</title><content type='html'>参照：&lt;a href="http://phpspot.org/blog/archives/2006/08/xampppear.html" target="_blank"&gt;XAMPPでpearコマンドを使う&lt;/a&gt;&lt;br /&gt;&lt;blockquote&gt;XAMPPディレクトリに移動して、pear install パッケージ名&lt;/blockquote&gt;&lt;br /&gt;僕のPCはmacです。XAMPPは最新版をインストールしたばかり。今2011年12月４日です。phpinfo()で、pearで検索すると、pear=/Applications/XAMPP/xamppfiles/lib/php/pearと書いてありました。ターミナルを起動して、cdで/Applications/XAMPP/xamppfiles/lib/php/に移動しました。&lt;br /&gt;&lt;br /&gt;今回はDB.phpを使えるようにしたいのです。&lt;br /&gt;&lt;a href="http://www.php-labo.net/tutorial/class/pear.html"&gt;PEAR::DBの利用&lt;/a&gt;というページがDB.phpに詳しいようです。これを見ながらセットアップしていきます。&lt;br /&gt;&lt;br /&gt;pear install DBを実行したところ、下記のエラーになりました。&lt;br /&gt;&lt;pre&gt;Warning: touch(): Unable to create file /usr/lib/php/.lock because Permission denied in PEAR/Registry.php on line 835&lt;br /&gt;&lt;br /&gt;Warning: touch(): Unable to create file /usr/lib/php/.lock because Permission denied in /usr/lib/php/PEAR/Registry.php on line 835&lt;br /&gt;could not create lock file: fopen(/usr/lib/php/.lock): failed to open stream: No such file or directory&lt;/pre&gt;権限がないエラーのようです。同じ状況が『&lt;a href="http://neec-is.g.hatena.ne.jp/is178/20091014/1255529767"&gt;snow leopardでPEARを使う&lt;/a&gt;』に書いてあります。sudo pear install DBを実行すると、インストールが完了しました。このDBをどうやってPHPファイル上でrequire出来るのでしょうか？単純にrequire 'DB.php';とやると存在しないとのエラーになります。どうもpearでインストールしたファイルは、/usr/lib/php/にいるようです。xamppのphp.iniのinclude_pathにこのパスを追加したところ、require 'DB.php'で起動するようになりました！ちなみに、xamppのphp.iniは/Applications/XAMPP/xamppfiles/etcにあります。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/744605407212742108-1119130553359177547?l=endoyuta.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://endoyuta.blogspot.com/feeds/1119130553359177547/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://endoyuta.blogspot.com/2011/12/xampppear-on-mac.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/744605407212742108/posts/default/1119130553359177547'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/744605407212742108/posts/default/1119130553359177547'/><link rel='alternate' type='text/html' href='http://endoyuta.blogspot.com/2011/12/xampppear-on-mac.html' title='XAMPPでpearコマンドを使う on mac'/><author><name>endo yuta</name><uri>http://www.blogger.com/profile/05491646789675985410</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://1.bp.blogspot.com/-7dw9PlYIisc/TtuORirdBtI/AAAAAAAAAYc/kr_xs7ruXrU/s220/slime.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-744605407212742108.post-1873595817032195004</id><published>2011-11-29T21:34:00.000+09:00</published><updated>2011-12-04T23:32:11.936+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='AmazonEC2'/><category scheme='http://www.blogger.com/atom/ns#' term='Server'/><category scheme='http://www.blogger.com/atom/ns#' term='GAE'/><category scheme='http://www.blogger.com/atom/ns#' term='Database'/><category scheme='http://www.blogger.com/atom/ns#' term='Webサービス'/><title type='text'>GAEなのか？</title><content type='html'>GAEは制限が多い。1000件までしかデータベースから取得できない。抽出条件を複雑化するのはindexをつくれば出来るが、いずれにしても1000件までしか取得できない。またエンティティの検索条件設定については部分一致はできない。1万件と１万件のデータをそれぞれ取得して、両方のデータに存在するデータを抽出したいとしても、それは1000件ずつしか取得できないので、残りのそれぞれ9000件にはアクセスできない。これは大いなる問題である。GAEを使わないのであればAmazonEC2なのか、はたまた昔ながらのレンタルサーバーが以外といいのか？という話がでてくる。Amazonは遅いが自由度は高いらしい。またもし大きなWEBサービスとなるのであればスケールアウトというやつで圧倒的なメリットをAmazonは提供してくれる。でももし大きくなる見込みが低いWEBサービスなのであれば、それは速い、安い、うまい昔ながらのレンタルサーバに軍配が上がる可能性が高い。&lt;br /&gt;&lt;br /&gt;さて、それでも尚GAEを使おうというのであれば、上記のデータベースの設計はよろしくない。クエリの複雑化はインデックスで対応するとして、データベースから取得したデータをいじるのではなく、可能な限りクエリによって最終的に取得したいデータを取得できるように設計する必要がある。が、どう考えてもいまつくろうとしているアプリケーションがGAEで作れるとは思えない。GAEはやめよう。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/744605407212742108-1873595817032195004?l=endoyuta.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://endoyuta.blogspot.com/feeds/1873595817032195004/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://endoyuta.blogspot.com/2011/11/gae.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/744605407212742108/posts/default/1873595817032195004'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/744605407212742108/posts/default/1873595817032195004'/><link rel='alternate' type='text/html' href='http://endoyuta.blogspot.com/2011/11/gae.html' title='GAEなのか？'/><author><name>endo yuta</name><uri>http://www.blogger.com/profile/05491646789675985410</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://1.bp.blogspot.com/-7dw9PlYIisc/TtuORirdBtI/AAAAAAAAAYc/kr_xs7ruXrU/s220/slime.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-744605407212742108.post-1967086498094369644</id><published>2011-11-29T00:36:00.000+09:00</published><updated>2011-12-04T23:30:51.979+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Python'/><title type='text'>python　リストの追加　append()</title><content type='html'>list = [1,2,3,4,5]&lt;br /&gt;list.append(6)&lt;br /&gt;これは list += [6] よりも効率的らしい&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/744605407212742108-1967086498094369644?l=endoyuta.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://endoyuta.blogspot.com/feeds/1967086498094369644/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://endoyuta.blogspot.com/2011/11/pythonappend.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/744605407212742108/posts/default/1967086498094369644'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/744605407212742108/posts/default/1967086498094369644'/><link rel='alternate' type='text/html' href='http://endoyuta.blogspot.com/2011/11/pythonappend.html' title='python　リストの追加　append()'/><author><name>endo yuta</name><uri>http://www.blogger.com/profile/05491646789675985410</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://1.bp.blogspot.com/-7dw9PlYIisc/TtuORirdBtI/AAAAAAAAAYc/kr_xs7ruXrU/s220/slime.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-744605407212742108.post-2095262246678436170</id><published>2011-11-27T22:33:00.001+09:00</published><updated>2011-11-28T00:35:22.013+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='JQuery'/><category scheme='http://www.blogger.com/atom/ns#' term='Ajax'/><title type='text'>めんどくさいjQueryを研究する</title><content type='html'>もうjQueryって色んな括弧がごちゃごちゃしてて見ていて腹立つよ。しかし、色んなブラウザの違いなども吸収してるらしいし、とりあえず使えるところはjQuery使った方がいい気がするし、そもそもDOMとかって大体分かるけどその使い方は全然勉強してないから、何しろjQuery勉強しないといけないと思ってるんです。最近WEBサービスつくるとき一番つまずくのがjQueryなもんで、一度研究して頭を整理しておかないといつまでたっても、遅々として先に進まないんだよね。いつも止まって適当に調べてなんとか出来たら次に行くっていうやり方が結局のところ最も非効率的なやり方だと思うんです。&lt;br /&gt;&lt;br /&gt;さて、はっきりいってjQueryでAjaxとかやってるわりには、全然基本すらわかってないので、基本から始めたいと思う。まずはjQeryで#homuに"homuhomu"とインプットしてみよう。ちなみに、このブログは最初からjQueryを読み込んでいたはず。あと、jQueryを学ぶならやはりきっとここは外せないだろう。&lt;a href="http://semooh.jp/jquery/"&gt;『jQuery日本語リファレンス』&lt;/a&gt;だ。&lt;br /&gt;&lt;br /&gt;↓これがdiv#homuです&lt;div id="homu" class="hoge"&gt;&lt;p&gt;homuhomuhomuhomuhomuhomuhomuhomu&lt;/p&gt;&lt;/div&gt;&lt;script type="text/javascript"&gt;$('#homu').empty();&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;empty&lt;/h3&gt;&lt;pre&gt;&lt;br /&gt;&amp;lt;div id=&amp;quot;homu&amp;quot;&amp;gt;&amp;lt;p&amp;gt;homuhomuhomuhomuhomuhomuhomuhomu&amp;lt;/p&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;$('#homu').empty();&lt;br /&gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;ちょっと最初に宣言したことと違うことをしているが、#homuのhomuhomu...という文字列をjQueryを使って削除した様だ。ところでブログに書くに当たりそもそもDOMとは&lt;a href="http://www.doraneko.org/misc/dom10/19981001/introduction.html"&gt;何を意味するのか&lt;/a&gt;について念のため確認したい。&lt;blockquote&gt;文書オブジェクトモデル(DOM)とは、HTML文書およびXML文書のためのアプリケーション=プログラミング=インターフェイス(API)である。これは、文書の論理的構造や、文書へのアクセスや操作の方法を定義するものである。&lt;/blockquote&gt;何言ってるのか分からん。文書を構成する個々のタグというかタグで構成される要素のことをDOMっていうのかなと思ったんだけどDOMはタグで文章を作ること自体をいうようだな。まあDOMの詳細は置いておいて、何しろDOMの構成要素を$('#homu')といった形で表すのだ。そして要素の選択方法については&lt;a href="http://semooh.jp/jquery/api/selectors/"&gt;Selectors/API/jQuery&lt;/a&gt;に書いてあるようだ。&lt;br /&gt;&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;さてそれでは、今度は最初に宣言したとおり、#homuに"homuhomu!!"をインプットしてみよう。そういう操作は&lt;a href="http://semooh.jp/jquery/api/manipulation/"&gt;ここ&lt;/a&gt;に書いてあるようだ。&lt;script type="text/javascript"&gt;$('#homu').append("&lt;b&gt;homuhomu!!&lt;/b&gt;");&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;append&lt;/h3&gt;&lt;pre&gt;&lt;br /&gt;&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;$('#homu').append(&amp;quot;&amp;lt;b&amp;gt;homuhomu!!&amp;lt;/b&amp;gt;&amp;quot;)&lt;br /&gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;これで太字でhomuhomu!!がインプットされた。なんて簡単なんだ。いったい俺は何が分からないのだ。今度は#homuにスタイルを設定してみよう。#homuの背景を青にして文字の色を白にしてみよう。&lt;script type="text/javascript"&gt;$('#homu').css({backgroundColor:"#00f",color:"#fff",padding:"3px"});&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;css&lt;/h3&gt;&lt;pre&gt;&lt;br /&gt;&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;$('#homu').css({backgroundColor:&amp;quot;#00f&amp;quot;,color:&amp;quot;#fff&amp;quot;,padding:&amp;quot;3px&amp;quot;});&lt;br /&gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;これで、#homuの背景が青くなり、文字が白くなり、paddingが3pxになった。なんでjQueryがめんどくさいのかが少し分かった。HTMLとかCSSとかの構文とほぼ同じであるにも関わらず、微妙にjQuery特有の表記ルールになっている箇所が多いからだ。どこが間違ってるか分からないんだよ。とはいえ、やっぱり結構簡単だな。&lt;br /&gt;&lt;br /&gt;今度は、eachというやつを覚えよう。これはjQuery的forみたいなやつや。該当する要素全てに対してコードを実行したいときに使うものだ。下にdiv#homu2をもう１個つくって、先程作成したdiv#homuと共に、class="hoge"を設定しておこう。&lt;br /&gt;&lt;br /&gt;↓これがdiv#homu2です&lt;div id="homu2" class="hoge"&gt;ホムホムホムホム&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;each&lt;/h3&gt;&lt;pre&gt;&lt;br /&gt;&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;$('div.hoge').each(function(idx,ele){&lt;br /&gt;    $(ele).css({backgroundColor:&amp;quot;red&amp;quot;,color:&amp;quot;#fcc&amp;quot;});&lt;br /&gt;});&lt;br /&gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;script type="text/javascript"&gt;$('div.hoge').each(function(idx,ele){    $(ele).css({backgroundColor:"red",color:"#fcc"});});&lt;/script&gt;これでdiv.hogeが全て背景赤、文字白になったのだ。functionのidx,eleはなしでもOKだ。idxは0から始まるインデックスになっており、eleというのは該当する要素そのものだ。引数名は適当な名前を設定すればよし。ちなみに、eleがエレメントそのものなので、$(ele)ではなく、$(this)でも同じことになる。&lt;br /&gt;&lt;br /&gt;さて、eachは配列に対して使うこともできる。&lt;script type="text/javascript"&gt;bookList = [["4774142298", "http://ecx.images-amazon.com/images/I/51KkpibMKqL._SL75_.jpg", "Python\u30b9\u30bf\u30fc\u30c8\u30d6\u30c3\u30af", "\u8fbb \u771f\u543e", "\u6280\u8853\u8a55\u8ad6\u793e"], ["4048686291", "http://ecx.images-amazon.com/images/I/51wSTTIQtgL._SL75_.jpg", "\u30a8\u30ad\u30b9\u30d1\u30fc\u30c8Python\u30d7\u30ed\u30b0\u30e9\u30df\u30f3\u30b0", "Tarek Ziade", "\u30a2\u30b9\u30ad\u30fc\u30fb\u30e1\u30c7\u30a3\u30a2\u30ef\u30fc\u30af\u30b9"], ["4797353953", "http://ecx.images-amazon.com/images/I/41lFEOVCepL._SL75_.jpg", "\u307f\u3093\u306a\u306ePython \u6539\u8a02\u7248", "\u67f4\u7530 \u6df3", "\u30bd\u30d5\u30c8\u30d0\u30f3\u30af\u30af\u30ea\u30a8\u30a4\u30c6\u30a3\u30d6"], ["4798026557", "http://ecx.images-amazon.com/images/I/41aeC4ZauwL._SL75_.jpg", "Python\u5165\u9580\u20152&amp;amp;3\u5bfe\u5fdc", "\u7d30\u7530 \u8b19\u4e8c", "\u79c0\u548c\u30b7\u30b9\u30c6\u30e0"], ["479733665X", "http://ecx.images-amazon.com/images/I/416wPnQ9tWL._SL75_.jpg", "\u307f\u3093\u306a\u306ePython", "\u67f4\u7530 \u6df3", "\u30bd\u30d5\u30c8\u30d0\u30f3\u30af\u30af\u30ea\u30a8\u30a4\u30c6\u30a3\u30d6"], ["4873113938", "http://ecx.images-amazon.com/images/I/41vF73wVaAL._SL75_.jpg", "\u521d\u3081\u3066\u306ePython \u7b2c3\u7248", "Mark Lutz", "\u30aa\u30e9\u30a4\u30ea\u30fc\u30b8\u30e3\u30d1\u30f3"], ["4873112761", "http://ecx.images-amazon.com/images/I/41XWUXpgeuL._SL75_.jpg", "Python \u30af\u30c3\u30af\u30d6\u30c3\u30af \u7b2c2\u7248", "Alex Martelli", "\u30aa\u30e9\u30a4\u30ea\u30fc\u30fb\u30b8\u30e3\u30d1\u30f3"], ["4774138053", "http://ecx.images-amazon.com/images/I/51WeqtvvDuL._SL75_.jpg", "Python \u30dd\u30b1\u30c3\u30c8\u30ea\u30d5\u30a1\u30ec\u30f3\u30b9 (Pocket Reference)", "\u67cf\u91ce \u96c4\u592a", "\u6280\u8853\u8a55\u8ad6\u793e"], ["487311442X", "http://ecx.images-amazon.com/images/I/51PD65oIzgL._SL75_.jpg", "Python\u30c1\u30e5\u30fc\u30c8\u30ea\u30a2\u30eb \u7b2c2\u7248", "Guido van Rossum", "\u30aa\u30e9\u30a4\u30ea\u30fc\u30b8\u30e3\u30d1\u30f3"], ["4048704397", "http://ecx.images-amazon.com/images/I/51e2zr5LubL._SL75_.jpg", "Python\u30b2\u30fc\u30e0\u30d7\u30ed\u30b0\u30e9\u30df\u30f3\u30b0\u5165\u9580", "Will McGugan", "\u30a2\u30b9\u30ad\u30fc\u30fb\u30e1\u30c7\u30a3\u30a2\u30ef\u30fc\u30af\u30b9"]];$('#homu2').empty();$('#homu2').css({backgroundColor:"white"});$.each(bookList,function(idx,book){    $('#homu2').append('&lt;img src="' + book[1] + '" /&gt;');});&lt;/script&gt;&lt;pre&gt;&lt;br /&gt;&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;bookList = [[&amp;quot;4774142298&amp;quot;, &amp;quot;http://ecx.images-amazon.com/images/I/51KkpibMKqL._SL75_.jpg&amp;quot;, &amp;quot;Python\u30b9\u30bf\u30fc\u30c8\u30d6\u30c3\u30af&amp;quot;, &amp;quot;\u8fbb \u771f\u543e&amp;quot;, &amp;quot;\u6280\u8853\u8a55\u8ad6\u793e&amp;quot;], [&amp;quot;4048686291&amp;quot;, &amp;quot;http://ecx.images-amazon.com/images/I/51wSTTIQtgL._SL75_.jpg&amp;quot;, &amp;quot;\u30a8\u30ad\u30b9\u30d1\u30fc\u30c8Python\u30d7\u30ed\u30b0\u30e9\u30df\u30f3\u30b0&amp;quot;, &amp;quot;Tarek Ziade&amp;quot;, &amp;quot;\u30a2\u30b9\u30ad\u30fc\u30fb\u30e1\u30c7\u30a3\u30a2\u30ef\u30fc\u30af\u30b9&amp;quot;], [&amp;quot;4797353953&amp;quot;, &amp;quot;http://ecx.images-amazon.com/images/I/41lFEOVCepL._SL75_.jpg&amp;quot;, &amp;quot;\u307f\u3093\u306a\u306ePython \u6539\u8a02\u7248&amp;quot;, &amp;quot;\u67f4\u7530 \u6df3&amp;quot;, &amp;quot;\u30bd\u30d5\u30c8\u30d0\u30f3\u30af\u30af\u30ea\u30a8\u30a4\u30c6\u30a3\u30d6&amp;quot;], [&amp;quot;4798026557&amp;quot;, &amp;quot;http://ecx.images-amazon.com/images/I/41aeC4ZauwL._SL75_.jpg&amp;quot;, &amp;quot;Python\u5165\u9580\u20152&amp;amp;amp;3\u5bfe\u5fdc&amp;quot;, &amp;quot;\u7d30\u7530 \u8b19\u4e8c&amp;quot;, &amp;quot;\u79c0\u548c\u30b7\u30b9\u30c6\u30e0&amp;quot;], [&amp;quot;479733665X&amp;quot;, &amp;quot;http://ecx.images-amazon.com/images/I/416wPnQ9tWL._SL75_.jpg&amp;quot;, &amp;quot;\u307f\u3093\u306a\u306ePython&amp;quot;, &amp;quot;\u67f4\u7530 \u6df3&amp;quot;, &amp;quot;\u30bd\u30d5\u30c8\u30d0\u30f3\u30af\u30af\u30ea\u30a8\u30a4\u30c6\u30a3\u30d6&amp;quot;], [&amp;quot;4873113938&amp;quot;, &amp;quot;http://ecx.images-amazon.com/images/I/41vF73wVaAL._SL75_.jpg&amp;quot;, &amp;quot;\u521d\u3081\u3066\u306ePython \u7b2c3\u7248&amp;quot;, &amp;quot;Mark Lutz&amp;quot;, &amp;quot;\u30aa\u30e9\u30a4\u30ea\u30fc\u30b8\u30e3\u30d1\u30f3&amp;quot;], [&amp;quot;4873112761&amp;quot;, &amp;quot;http://ecx.images-amazon.com/images/I/41XWUXpgeuL._SL75_.jpg&amp;quot;, &amp;quot;Python \u30af\u30c3\u30af\u30d6\u30c3\u30af \u7b2c2\u7248&amp;quot;, &amp;quot;Alex Martelli&amp;quot;, &amp;quot;\u30aa\u30e9\u30a4\u30ea\u30fc\u30fb\u30b8\u30e3\u30d1\u30f3&amp;quot;], [&amp;quot;4774138053&amp;quot;, &amp;quot;http://ecx.images-amazon.com/images/I/51WeqtvvDuL._SL75_.jpg&amp;quot;, &amp;quot;Python \u30dd\u30b1\u30c3\u30c8\u30ea\u30d5\u30a1\u30ec\u30f3\u30b9 (Pocket Reference)&amp;quot;, &amp;quot;\u67cf\u91ce \u96c4\u592a&amp;quot;, &amp;quot;\u6280\u8853\u8a55\u8ad6\u793e&amp;quot;], [&amp;quot;487311442X&amp;quot;, &amp;quot;http://ecx.images-amazon.com/images/I/51PD65oIzgL._SL75_.jpg&amp;quot;, &amp;quot;Python\u30c1\u30e5\u30fc\u30c8\u30ea\u30a2\u30eb \u7b2c2\u7248&amp;quot;, &amp;quot;Guido van Rossum&amp;quot;, &amp;quot;\u30aa\u30e9\u30a4\u30ea\u30fc\u30b8\u30e3\u30d1\u30f3&amp;quot;], [&amp;quot;4048704397&amp;quot;, &amp;quot;http://ecx.images-amazon.com/images/I/51e2zr5LubL._SL75_.jpg&amp;quot;, &amp;quot;Python\u30b2\u30fc\u30e0\u30d7\u30ed\u30b0\u30e9\u30df\u30f3\u30b0\u5165\u9580&amp;quot;, &amp;quot;Will McGugan&amp;quot;, &amp;quot;\u30a2\u30b9\u30ad\u30fc\u30fb\u30e1\u30c7\u30a3\u30a2\u30ef\u30fc\u30af\u30b9&amp;quot;]];&lt;br /&gt;$('#homu2').empty();&lt;br /&gt;$('#homu2').css({backgroundColor:&amp;quot;white&amp;quot;});&lt;br /&gt;$.each(bookList,function(idx,book){&lt;br /&gt;    $('#homu2').append('&amp;lt;img src=&amp;quot;' + book[1] + '&amp;quot; /&amp;gt;');&lt;br /&gt;});&lt;br /&gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;このように配列に対してeachをかけると便利に使えるのだ。booklistに格納しているのは、amazonから取り出したデータです。booklistの各要素がbookであり、bookも配列だから、book[1]などとやって画像のURLを取り出しているのだ。ということで、jQueryは難しいわけではなく、細かいルールがHTMLとかCSSと同じようでいて同じではないというのが最大のややこしい点であることがわかった。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/744605407212742108-2095262246678436170?l=endoyuta.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://endoyuta.blogspot.com/feeds/2095262246678436170/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://endoyuta.blogspot.com/2011/11/jquery.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/744605407212742108/posts/default/2095262246678436170'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/744605407212742108/posts/default/2095262246678436170'/><link rel='alternate' type='text/html' href='http://endoyuta.blogspot.com/2011/11/jquery.html' title='めんどくさいjQueryを研究する'/><author><name>endo yuta</name><uri>http://www.blogger.com/profile/05491646789675985410</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://1.bp.blogspot.com/-7dw9PlYIisc/TtuORirdBtI/AAAAAAAAAYc/kr_xs7ruXrU/s220/slime.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-744605407212742108.post-239643926572858102</id><published>2011-11-27T14:00:00.001+09:00</published><updated>2011-11-27T16:44:34.088+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Game'/><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='Android'/><title type='text'>Androidゲーム『Dodge Mouse』つくりました！</title><content type='html'>Androidゲーム&lt;a href="https://market.android.com/details?id=com.logicky.dodgemouse"&gt;『Dodge Mouse』&lt;/a&gt;をつくりました！第一弾目です。シューティングゲームの敵の弾を避ける要領で、敵をよけつづけるシンプルなゲームです。Pankiaをつかってスコア共有できるようになっていて、スコアはtwitterでつぶやけるようになってます。Pankiaの使い方はsuumo jumpを参考にしました。よかったら&lt;a href="https://market.android.com/details?id=com.logicky.dodgemouse"&gt;ダウンロード&lt;/a&gt;してください！&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-MWPh0kIjlCU/TtHEdCyWLcI/AAAAAAAAAU4/aiR_3R_Yli0/s1600/SC20111123-171904.png" imageanchor="1" style="margin-left:1em; margin-right:1em"&gt;&lt;img border="0" height="192" width="320" src="http://2.bp.blogspot.com/-MWPh0kIjlCU/TtHEdCyWLcI/AAAAAAAAAU4/aiR_3R_Yli0/s320/SC20111123-171904.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-e51AMpIenN4/TtHEMaKquuI/AAAAAAAAAUs/BpIr_p5RYCw/s1600/SC20111123-171917.png" imageanchor="1" style="margin-left:1em; margin-right:1em"&gt;&lt;img border="0" height="192" width="320" src="http://3.bp.blogspot.com/-e51AMpIenN4/TtHEMaKquuI/AAAAAAAAAUs/BpIr_p5RYCw/s320/SC20111123-171917.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="azapp"&gt;&lt;a href="http://www.androidzoom.com/test/android_games/arcade_and_action/dodge-mouse_bqxta.html"&gt;Dodge Mouse&lt;/a&gt;&lt;/div&gt;&lt;div class="az_w_powered"&gt;Discover more &lt;a href="http://www.androidzoom.com" target="_blank"&gt;Android apps&lt;/a&gt;&lt;/div&gt;&lt;script type="text/javascript" src="//www.androidzoom.com/js/widget.js"&gt;&lt;/script&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/744605407212742108-239643926572858102?l=endoyuta.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://endoyuta.blogspot.com/feeds/239643926572858102/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://endoyuta.blogspot.com/2011/11/androiddodge-mouse.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/744605407212742108/posts/default/239643926572858102'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/744605407212742108/posts/default/239643926572858102'/><link rel='alternate' type='text/html' href='http://endoyuta.blogspot.com/2011/11/androiddodge-mouse.html' title='Androidゲーム『Dodge Mouse』つくりました！'/><author><name>endo yuta</name><uri>http://www.blogger.com/profile/05491646789675985410</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://1.bp.blogspot.com/-7dw9PlYIisc/TtuORirdBtI/AAAAAAAAAYc/kr_xs7ruXrU/s220/slime.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-MWPh0kIjlCU/TtHEdCyWLcI/AAAAAAAAAU4/aiR_3R_Yli0/s72-c/SC20111123-171904.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-744605407212742108.post-706189418983444403</id><published>2011-11-13T01:28:00.000+09:00</published><updated>2011-11-13T21:09:10.046+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='Android'/><title type='text'>Android 開発 マルチ画面対応の研究</title><content type='html'>Androidは多種多様な端末があり、それらはそれぞれ画面サイズやDPIといったものが全然違います。マルチ画面に対応する為のルールや手法について研究します。&lt;br /&gt;&lt;br /&gt;研究の為の簡単なプロジェクトを作成しましました。DpiTestActivityとDpiTestViewの２つのクラスから構成されます。res/drawable-mdpiに、tw.pngを格納しています。tw.pngはtwitterのbirdのフリーのイメージで、サイズは幅70(px)x高さ85(px)です。&lt;br /&gt;&lt;h5&gt;DpiTestActivityクラス&lt;/h5&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;package com.homuhomu.dpitest;&lt;br /&gt;&lt;br /&gt;import android.app.Activity;&lt;br /&gt;import android.os.Bundle;&lt;br /&gt;&lt;br /&gt;public class DpiTestActivity extends Activity {&lt;br /&gt; private DpiTestView dView;&lt;br /&gt; &lt;br /&gt;    @Override&lt;br /&gt;    public void onCreate(Bundle savedInstanceState) {&lt;br /&gt;        super.onCreate(savedInstanceState);&lt;br /&gt;        dView = new DpiTestView(this);&lt;br /&gt;        setContentView(dView);&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;h5&gt;DpiTestViewクラス&lt;/h5&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;package com.homuhomu.dpitest;&lt;br /&gt;&lt;br /&gt;import android.content.Context;&lt;br /&gt;import android.content.res.Resources;&lt;br /&gt;import android.graphics.Bitmap;&lt;br /&gt;import android.graphics.BitmapFactory;&lt;br /&gt;import android.graphics.Canvas;&lt;br /&gt;import android.graphics.Paint;&lt;br /&gt;import android.view.View;&lt;br /&gt;&lt;br /&gt;public class DpiTestView extends View {&lt;br /&gt; private Bitmap img;&lt;br /&gt; private Paint paint;&lt;br /&gt; &lt;br /&gt; public DpiTestView(Context context) {&lt;br /&gt;  super(context);&lt;br /&gt;  //paintの設定&lt;br /&gt;  paint = new Paint();&lt;br /&gt;  paint.setAntiAlias(true);&lt;br /&gt;  paint.setTextSize(70);&lt;br /&gt;  paint.setARGB(255, 255, 255, 255);&lt;br /&gt;  //imgの登録&lt;br /&gt;  Resources res = context.getResources();&lt;br /&gt;  img = BitmapFactory.decodeResource(res, R.drawable.tw);&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; @Override&lt;br /&gt; protected void onDraw(Canvas c){&lt;br /&gt;  c.drawBitmap(img,0,0,null); //imgの描画&lt;br /&gt;  c.drawBitmap(img,70,0,null); //imgの描画&lt;br /&gt;  c.drawText("A", 70, 85, paint);&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;これを、AVDで起動してみます。AVDはDensity160のHVGAというやつで、これはDPIがmiddleだそうです。つまりres/drawable-mdpiのイメージがそのままのサイズで表示されることになると思います。結果は下記です。&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-r0RkC-lShAg/Tr6mM6PPoOI/AAAAAAAAAH0/7myrETp2Q2s/s1600/device-2011-11-13-015523.png" imageanchor="1" style="margin-left:1em; margin-right:1em"&gt;&lt;img border="0" height="214" width="320" src="http://3.bp.blogspot.com/-r0RkC-lShAg/Tr6mM6PPoOI/AAAAAAAAAH0/7myrETp2Q2s/s320/device-2011-11-13-015523.png" /&gt;&lt;/a&gt;&lt;/div&gt;70px横にずらして鳥を配置するようにプログラムしてますが、結果はしっかりとかぶらずに密接していますので、幅70pxの画像がスケールされずにそのまま配置されていることが分かります。一方dpiがhightのAVDでは、鳥が重なります。これはつまり70pxよりも鳥が大きくなっているということになります。また、lowのAVDでは、鳥が離れます。これはつまり70pxよりも鳥が小さくなっているということになります。つまりDPIがmiddle以外であれば、そのDPIに応じてイメージが勝手にスケールし、イメージ自体は物理的に同じ大きさに見えるようになるということです。しかし、画面配置をpxで設定すると、勝手にスケールするため全体的な構成が壊れることになります。&lt;br /&gt;&lt;br /&gt;さて、試しに今度は鳥の同じ画像をres/drawable-hdpiにのみ格納して、HVGAという同じAVDで起動してみます。予想としては鳥の画像は70pxよりも小さくなるため、鳥は離れるはずです。結果はこれです。&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-TbVnKIhSt4E/Tr6sJrcz82I/AAAAAAAAAIA/OT6JNu6Bs_c/s1600/device-2011-11-13-022224.png" imageanchor="1" style="margin-left:1em; margin-right:1em"&gt;&lt;img border="0" height="214" width="320" src="http://2.bp.blogspot.com/-TbVnKIhSt4E/Tr6sJrcz82I/AAAAAAAAAIA/OT6JNu6Bs_c/s320/device-2011-11-13-022224.png" /&gt;&lt;/a&gt;&lt;/div&gt;やはり小さくなって離れました。DPIとは1インチに何px入るか？という密度を表す単位のようです。1インチに5px入る画面の5pxは1インチですが、インチに10px入る画面の5pxは0.5インチです。つまり密度の高い画面の方が同じ画像が小さく表示されます。物理的に同じ大きさで表示するには、密度の高い画面でより大きな画像を使う必要があるわけです。このスケールをAndroidは自動的に実施してくれるわけです。せっかく自動的にスケールしてくれるのですから、画面構成も壊れないようにpxによる設定以外の方法で配置設定したいものです。&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;DPIに依存しない画面構成にする方法&lt;/h3&gt;&lt;br /&gt;そこで出てくるのが、&lt;a href="http://www.techdoctranslator.com/android/practices/screens_support#terms"&gt;密度非依存ピクセル (dp)&lt;/a&gt;です。&lt;blockquote&gt;密度非依存ピクセルは、160 dpi の画面の 1 物理ピクセルに相当し、"medium" 密度の画面に対しシステムにより想定される基底となります。実行時において、システムは必要に応じ画面の実際の密度を基に dp 単位によるすべてのスケーリングを透過的にハンドルします。dp の単位を画面のピクセルに変換するのは px = dp * (dpi / 160) とシンプルです。&lt;/blockquote&gt;ということです。まあこれは、c.drawBitmap(img,70,0,null); の中で使えるものではないです。つまり、c.drawBitmap(img,70dp,0dp,null); ってできるわけではないので、この概念を適用するようにプログラムしてみようと思います。プログラムする場合は、起動している端末の画面が何dpiなのかを確認する必要があります。ちなみに、hightが240dpi、middleが160dpi、lowが120dpiというのがそれぞれの標準値のようです。とはいえ、プログラム上でこれを動的に把握する必要がありますので、そのやり方を調べます。&lt;br /&gt;&lt;br /&gt;&lt;a href="http://labs.techfirm.co.jp/android/m_yamada/1668"&gt;画面の解像度やdensity（ピクセル密度）の取得方法&lt;/a&gt;というページに下記のように記載があります。&lt;pre class="prettyprint"&gt;DisplayMetrics metrics = new DisplayMetrics();  &lt;br /&gt;context.getWindowManager().getDefaultDisplay().getMetrics(metrics);  &lt;br /&gt;Log.d("test", "density=" + metrics.density);  &lt;br /&gt;Log.d("test", "densityDpi=" + metrics.densityDpi);  &lt;br /&gt;Log.d("test", "scaledDensity=" + metrics.scaledDensity);  &lt;br /&gt;Log.d("test", "widthPixels=" + metrics.widthPixels);  &lt;br /&gt;Log.d("test", "heightPixels=" + metrics.heightPixels);  &lt;br /&gt;Log.d("test", "xDpi=" + metrics.xdpi);  &lt;br /&gt;Log.d("test", "yDpi=" + metrics.ydpi);  &lt;/pre&gt;&lt;blockquote&gt;ここで、metrics.scaledDensityという値があります。これが、現在の1ピクセルに対する1dipの倍率になります。つまり、1ピクセル×scaledDensity＝1dipとなります。&lt;/blockquote&gt;とりあえずこのコードをActivityのonCreateに埋め込んで実行してみます。すると下記のようなログが出力されました。（実行環境は今までのHVGAというAVDになります）&lt;pre&gt;&lt;br /&gt;11-13 15:10:50.675: DEBUG/test(669): density=1.0&lt;br /&gt;11-13 15:10:50.675: DEBUG/test(669): densityDpi=160&lt;br /&gt;11-13 15:10:50.685: DEBUG/test(669): scaledDensity=1.0&lt;br /&gt;11-13 15:10:50.685: DEBUG/test(669): widthPixels=480&lt;br /&gt;11-13 15:10:50.696: DEBUG/test(669): heightPixels=320&lt;br /&gt;11-13 15:10:50.696: DEBUG/test(669): xDpi=160.0&lt;br /&gt;11-13 15:10:50.715: DEBUG/test(669): yDpi=160.0&lt;br /&gt;&lt;/pre&gt;続いて、WVGA800というAVDで実行すると、下記のようなログが出力されました。&lt;pre&gt;&lt;br /&gt;11-13 15:20:06.199: DEBUG/test(535): density=1.5&lt;br /&gt;11-13 15:20:06.199: DEBUG/test(535): densityDpi=240&lt;br /&gt;11-13 15:20:06.209: DEBUG/test(535): scaledDensity=1.5&lt;br /&gt;11-13 15:20:06.209: DEBUG/test(535): widthPixels=800&lt;br /&gt;11-13 15:20:06.209: DEBUG/test(535): heightPixels=480&lt;br /&gt;11-13 15:20:06.218: DEBUG/test(535): xDpi=240.0&lt;br /&gt;11-13 15:20:06.218: DEBUG/test(535): yDpi=240.0&lt;br /&gt;&lt;/pre&gt;しっかり機能しているようです。では、このコードを使ってdpの概念を実装してみます。考え方としては、dpi160のmdpiフォルダに 標準サイズのリソースを格納するとともに、そのリソースに合わせた配置構成の為のpx数値を定数として持ちます（これがdpに当たります）。コードで実行している画面のscaledDensityを取得し、dp x scaledDensityによって動的にpx数値を取得し、そのpx数値を使って画像を表示します。 鳥の画像をmdpiのみに格納し直して上記考え方でプログラムを修正したものが下記になります。&lt;h5&gt;DpiTestActivityクラス&lt;/h5&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;package com.homuhomu.dpitest;&lt;br /&gt;&lt;br /&gt;import android.app.Activity;&lt;br /&gt;import android.os.Bundle;&lt;br /&gt;import android.util.DisplayMetrics;&lt;br /&gt;&lt;br /&gt;public class DpiTestActivity extends Activity {&lt;br /&gt; private DpiTestView dView;&lt;br /&gt; private DisplayMetrics metrics;&lt;br /&gt; static float scaledDensity;&lt;br /&gt; static int widthPixels;&lt;br /&gt; static int heightPixels;&lt;br /&gt; &lt;br /&gt;    @Override&lt;br /&gt;    public void onCreate(Bundle savedInstanceState) {&lt;br /&gt;        super.onCreate(savedInstanceState);&lt;br /&gt;        dView = new DpiTestView(this);&lt;br /&gt;        setContentView(dView);&lt;br /&gt;        &lt;br /&gt;        metrics = new DisplayMetrics();  &lt;br /&gt;        getWindowManager().getDefaultDisplay().getMetrics(metrics);&lt;br /&gt;        scaledDensity = metrics.scaledDensity;&lt;br /&gt;        widthPixels = metrics.widthPixels;&lt;br /&gt;        heightPixels = metrics.heightPixels;&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;h5&gt;DpiTestViewクラス&lt;/h5&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;package com.homuhomu.dpitest;&lt;br /&gt;&lt;br /&gt;import android.content.Context;&lt;br /&gt;import android.content.res.Resources;&lt;br /&gt;import android.graphics.Bitmap;&lt;br /&gt;import android.graphics.BitmapFactory;&lt;br /&gt;import android.graphics.Canvas;&lt;br /&gt;import android.graphics.Paint;&lt;br /&gt;import android.view.View;&lt;br /&gt;&lt;br /&gt;public class DpiTestView extends View {&lt;br /&gt; private Bitmap img;&lt;br /&gt; private Paint paint;&lt;br /&gt; private final int twW = 70; //mdpiにおける鳥イメージの幅(px)&lt;br /&gt; private final int twH = 85; //mdpiにおける鳥イメージの高さ(px)&lt;br /&gt; &lt;br /&gt; &lt;br /&gt; public DpiTestView(Context context) {&lt;br /&gt;  super(context);&lt;br /&gt;  //paintの設定&lt;br /&gt;  paint = new Paint();&lt;br /&gt;  paint.setAntiAlias(true);&lt;br /&gt;  paint.setTextSize(70);&lt;br /&gt;  paint.setARGB(255, 255, 255, 255);&lt;br /&gt;  //imgの登録&lt;br /&gt;  Resources res = context.getResources();&lt;br /&gt;  img = BitmapFactory.decodeResource(res, R.drawable.tw);&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; @Override&lt;br /&gt; protected void onDraw(Canvas c){&lt;br /&gt;  c.drawBitmap(img,0,0,null); //imgの描画&lt;br /&gt;  c.drawBitmap(img,twW*DpiTestActivity.scaledDensity,0,null); //imgの描画&lt;br /&gt;  c.drawText(&amp;quot;A&amp;quot;, twW*DpiTestActivity.scaledDensity,&lt;br /&gt;    twH*DpiTestActivity.scaledDensity, paint);&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;これを各AVDで実行すると下記のように鳥はどのAVDでも重ならずに密接しました。これで画面構成もどの端末においても基本的に担保されるようになったといえると思います。（あまりに画面サイズが小さい場合などはアプリの対象外にするなどといった処置が必要にはなります）&lt;h5&gt;HVGA(dpi160)での実行結果&lt;/h5&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-8V5sCLPNdE0/Tr9tCRJozAI/AAAAAAAAAIM/91wF8e6ZB_E/s1600/device-2011-11-13-160418.png" imageanchor="1" style="margin-left:1em; margin-right:1em"&gt;&lt;img border="0" height="214" width="320" src="http://3.bp.blogspot.com/-8V5sCLPNdE0/Tr9tCRJozAI/AAAAAAAAAIM/91wF8e6ZB_E/s320/device-2011-11-13-160418.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;h5&gt;WVGA800(dpi240)での実行結果&lt;/h5&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-grOqGC8z4mY/Tr9tiJt0CPI/AAAAAAAAAIY/0KtCHaDZ7K0/s1600/device-2011-11-13-160354.png" imageanchor="1" style="margin-left:1em; margin-right:1em"&gt;&lt;img border="0" height="192" width="320" src="http://2.bp.blogspot.com/-grOqGC8z4mY/Tr9tiJt0CPI/AAAAAAAAAIY/0KtCHaDZ7K0/s320/device-2011-11-13-160354.png" /&gt;&lt;/a&gt;&lt;/div&gt;さて、これで画像の自動スケールと配置構成をどの画面でも担保できるようになりましたが、少なくとも後２つ対処が必要な点があると思っています。1つは、例えばゲームをつくっている場合、画面にタッチする関係上あまりに小さい画面ですと仮に同じ配置構成で画面が表示できたとしてもゲームとして成立し得ないケースがあります。あるいは、あまりに画面が大きい場合、想定しているゲームと異なる難易度になってしまうケースなどもあるかもしれません。作成しているアプリの特性を考慮し、対象外の画面を明確化する必要があります。もう1つは、背景画像についてです。背景画像は上記の研究によりほぼ検討がついていますが、同じdpiでも画面サイズが異なるケースがありますので、例えば幅800pxの背景画像をつくった場合、854pxの幅がある画面では右に空白ができてしまいます。これらの対処法を検討する必要があります。&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;対象外の画面の明確化の方法&lt;/h3&gt;&lt;br /&gt;&lt;a href="http://www.techdoctranslator.com/android/practices/screens_support#DeclaringScreenSizeSupport"&gt;このページ&lt;/a&gt;の画面サイズの宣言という項目に方法が書いてありますが英語です。残念です。ただ要するにmanifestに書けばいいだけのようです。あと、&lt;a href="http://developer.android.com/intl/ja/guide/topics/manifest/supports-screens-element.html"&gt;supports-screens&lt;/a&gt;というAndroidのリファレンスに詳細が記載されているようです。あと、&lt;a href="http://d.hatena.ne.jp/Kazzz/20101127/p1"&gt;画面にフィットしないアプリケーション&lt;/a&gt;にも解説が記載されています。何もしなければ全てtrueになるようですので、後はケースバイケースで設定する形になりますね。&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;背景画像のマルチ画面対応の方法&lt;/h3&gt;&lt;br /&gt;画面いっぱいに画像を表示する場合についてです。まあこれは色んな方法があると思いますので、一旦私の独断と偏見による一方法を試したいと思います。全てを明らかにするのは時間がかかりますし。仮説ですので、全然ベストプラクティスではない可能性が高いです。一旦前提として画面サイズsmallとxLargeは対象外にすることにします。&lt;a href="http://www.techdoctranslator.com/android/practices/screens_support#range"&gt;ここ&lt;/a&gt;に下記のような記載があります。&lt;blockquote&gt;xlarge 画面は 960dp x 720dp が最小large 画面は 640dp x 480dp が最小normal 画面は 470dp x 320dp が最小small 画面は 426dp x 320dp が最小&lt;/blockquote&gt;よって、xlargeの最小幅である960dpを基準に考えます。何を考えるかというと背景画像を表示しうる最大のサイズで格納し、実行時の画面サイズに応じて縮小して表示するという考えの基に、その最大サイズについて960dpを基準に考えようと思います。960dpってとは、mdpiであれば960pxなんですが、hdpiですと、基本的にmdpiの1.5倍になるようなので、1,440pxになります。よって背景画像のファイルサイズは1440pxにしようと思います。これres/drawable-nodpiに格納します。そして、実行時にmetrics.widthPixelsなどで幅、高さを取得し、そのサイズに合わせて画面をスケールさせます。修正版は下記になります。&lt;h5&gt;DpiTestActivityクラス&lt;/h5&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;package com.homuhomu.dpitest;&lt;br /&gt;&lt;br /&gt;import android.app.Activity;&lt;br /&gt;import android.os.Bundle;&lt;br /&gt;import android.util.DisplayMetrics;&lt;br /&gt;&lt;br /&gt;public class DpiTestActivity extends Activity {&lt;br /&gt; private DpiTestView dView;&lt;br /&gt; private DisplayMetrics metrics;&lt;br /&gt; static float scaledDensity;&lt;br /&gt; static int width;&lt;br /&gt; static int height;&lt;br /&gt; &lt;br /&gt;    @Override&lt;br /&gt;    public void onCreate(Bundle savedInstanceState) {&lt;br /&gt;        super.onCreate(savedInstanceState);&lt;br /&gt;        //画面サイズ関連データの取得&lt;br /&gt;        metrics = new DisplayMetrics();  &lt;br /&gt;        getWindowManager().getDefaultDisplay().getMetrics(metrics);&lt;br /&gt;        scaledDensity = metrics.scaledDensity;&lt;br /&gt;        width = metrics.widthPixels;&lt;br /&gt;        height = metrics.heightPixels;&lt;br /&gt;        //Viewの設定&lt;br /&gt;        dView = new DpiTestView(this);&lt;br /&gt;        setContentView(dView);    &lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;h5&gt;DpiTestViewクラス&lt;/h5&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;package com.homuhomu.dpitest;&lt;br /&gt;&lt;br /&gt;import android.content.Context;&lt;br /&gt;import android.content.res.Resources;&lt;br /&gt;import android.graphics.Bitmap;&lt;br /&gt;import android.graphics.BitmapFactory;&lt;br /&gt;import android.graphics.Canvas;&lt;br /&gt;import android.graphics.Paint;&lt;br /&gt;import android.graphics.Rect;&lt;br /&gt;import android.view.View;&lt;br /&gt;&lt;br /&gt;public class DpiTestView extends View {&lt;br /&gt; private Bitmap img,backImg;&lt;br /&gt; private Paint paint;&lt;br /&gt; private final int twW = 70; //mdpiにおける鳥イメージの幅(px)&lt;br /&gt; private final int twH = 85; //mdpiにおける鳥イメージの高さ(px)&lt;br /&gt; private final int backW = 1440; //nodpiにおける背景画像の幅（px）&lt;br /&gt; private final int backH = 864; //nodpiにおける背景画像の高さ（px）&lt;br /&gt; private Rect src,dst; //背景画像スケール用Rect&lt;br /&gt; &lt;br /&gt; &lt;br /&gt; public DpiTestView(Context context) {&lt;br /&gt;  super(context);&lt;br /&gt;  //paintの設定&lt;br /&gt;  paint = new Paint();&lt;br /&gt;  paint.setAntiAlias(true);&lt;br /&gt;  paint.setTextSize(70);&lt;br /&gt;  paint.setARGB(255, 0, 0, 0);&lt;br /&gt;  //imgの登録&lt;br /&gt;  Resources res = context.getResources();&lt;br /&gt;  img = BitmapFactory.decodeResource(res, R.drawable.tw);&lt;br /&gt;  backImg = BitmapFactory.decodeResource(res, R.drawable.back);&lt;br /&gt;  //背景画像のスケール&lt;br /&gt;  src = new Rect(0,0,backW,backH);&lt;br /&gt;  dst = new Rect(0,0,DpiTestActivity.width,DpiTestActivity.height);&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; @Override&lt;br /&gt; protected void onDraw(Canvas c){&lt;br /&gt;  c.drawBitmap(backImg, src, dst, null); //背景画像の表示&lt;br /&gt;  c.drawBitmap(img,0,0,null); //imgの描画&lt;br /&gt;  c.drawBitmap(img,twW*DpiTestActivity.scaledDensity,0,null); //imgの描画&lt;br /&gt;  c.drawText(&amp;quot;&amp;quot;+DpiTestActivity.width, twW*DpiTestActivity.scaledDensity,&lt;br /&gt;    twH*DpiTestActivity.scaledDensity, paint);&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;結果は下記のようになります。&lt;h5&gt;HVGA(dpi160)での実行結果&lt;/h5&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-ITiZyv2LuZk/Tr-v4CICbgI/AAAAAAAAAIk/hzsOsGsqQWE/s1600/device-2011-11-13-204242.png" imageanchor="1" style="margin-left:1em; margin-right:1em"&gt;&lt;img border="0" height="214" width="320" src="http://4.bp.blogspot.com/-ITiZyv2LuZk/Tr-v4CICbgI/AAAAAAAAAIk/hzsOsGsqQWE/s320/device-2011-11-13-204242.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;h5&gt;WVGA800(dpi240)での実行結果&lt;/h5&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-z0XPuzoIuzI/Tr-v985lraI/AAAAAAAAAIw/wnmeYKPNZE0/s1600/device-2011-11-13-204300.png" imageanchor="1" style="margin-left:1em; margin-right:1em"&gt;&lt;img border="0" height="192" width="320" src="http://2.bp.blogspot.com/-z0XPuzoIuzI/Tr-v985lraI/AAAAAAAAAIw/wnmeYKPNZE0/s320/device-2011-11-13-204300.png" /&gt;&lt;/a&gt;&lt;/div&gt;これで背景画像もマルチ画面対応になりました。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/744605407212742108-706189418983444403?l=endoyuta.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://endoyuta.blogspot.com/feeds/706189418983444403/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://endoyuta.blogspot.com/2011/11/android.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/744605407212742108/posts/default/706189418983444403'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/744605407212742108/posts/default/706189418983444403'/><link rel='alternate' type='text/html' href='http://endoyuta.blogspot.com/2011/11/android.html' title='Android 開発 マルチ画面対応の研究'/><author><name>endo yuta</name><uri>http://www.blogger.com/profile/05491646789675985410</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://1.bp.blogspot.com/-7dw9PlYIisc/TtuORirdBtI/AAAAAAAAAYc/kr_xs7ruXrU/s220/slime.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-r0RkC-lShAg/Tr6mM6PPoOI/AAAAAAAAAH0/7myrETp2Q2s/s72-c/device-2011-11-13-015523.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-744605407212742108.post-4976413204615768436</id><published>2011-09-11T18:12:00.003+09:00</published><updated>2011-09-11T18:12:41.863+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Mac'/><category scheme='http://www.blogger.com/atom/ns#' term='eclipse'/><title type='text'>mac eclipse クリーンモードでの起動</title><content type='html'>/Applications/eclipse/eclipse -clean&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/744605407212742108-4976413204615768436?l=endoyuta.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://endoyuta.blogspot.com/feeds/4976413204615768436/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://endoyuta.blogspot.com/2011/09/mac-eclipse.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/744605407212742108/posts/default/4976413204615768436'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/744605407212742108/posts/default/4976413204615768436'/><link rel='alternate' type='text/html' href='http://endoyuta.blogspot.com/2011/09/mac-eclipse.html' title='mac eclipse クリーンモードでの起動'/><author><name>endo yuta</name><uri>http://www.blogger.com/profile/05491646789675985410</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://1.bp.blogspot.com/-7dw9PlYIisc/TtuORirdBtI/AAAAAAAAAYc/kr_xs7ruXrU/s220/slime.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-744605407212742108.post-1022604647586452983</id><published>2011-09-06T23:00:00.002+09:00</published><updated>2011-09-07T22:08:25.544+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='Game'/><category scheme='http://www.blogger.com/atom/ns#' term='Mathematics'/><title type='text'>線分と線分の交差判定</title><content type='html'>線分と線分の交差判定をしたい。線分abと線分cdの交差判定をすることにしよう。交差判定には直線の方程式を使う。直線は、y=ax+bといった形になる。この直線よりも上に線分の一方の点があり、もう一方の点がこの直線よりも下にあればそれは、この直線と線分が交差するということだ。線分と線分の交差は、「ある線分ともう一方の線分を直線にしたものが交差し、かつ、もう一方の線分とある線分を直線にしたものが交差すれば」、それはすなわち線分と線分が交差することになるのだ。試してみたら分かるのだ。&lt;br /&gt;&lt;br /&gt;よって、直線の方程式を使って上記条件に合致するか計算すればよろしい。&lt;br /&gt;直線の方程式を変形しよう。y=ax+bをy-ax-b=0にする。この式に線分の各点のx,yを入れてみればよい。もし0になったらその点は既に直線にのっているということだ。交差というか接している状態だといえるだろう。大体の場合0よりも大きいか、0よりも小さいという結果になるだろう。0よりも大きければ、その点は直線よりも上にあるということだ。小さければその点は直線よりも下にあるということだ。要するに線分の端点である２点を上記式に当てはめたときの結果が、一方がマイナスで一方がプラスであれば交差するといえるわけだ。２つの結果を掛け合わせて、その結果がマイナスであれば一方のみがマイナスであったとことになる。これと同様にもう一方の線分と直線に対してもチェックして、両方とも結果がマイナスであれば、この線分と線分は交差していることになる。&lt;br /&gt;&lt;br /&gt;javascriptでやるとこうなる。&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;var ax = 3, ay = 10, bx = 10, by = 3, cx = 3, cy = 3, dx = 10, dy = 10;&lt;br /&gt;&lt;br /&gt;function lineCheck(ax,ay,bx,by,cx,cy){&lt;br /&gt;  return   (by-ay)/(bx-ax)*cx+(ay-(by-ay)/(bx-ax)*ax)-cy;&lt;br /&gt;} &lt;br /&gt;&lt;br /&gt;function lineCrossCheck(ax,ay,bx,by,cx,cy,dx,dy){&lt;br /&gt;    var a = lineCheck(ax,ay,bx,by,cx,cy);&lt;br /&gt;    var b = lineCheck(ax,ay,bx,by,dx,dy);&lt;br /&gt;    var c = lineCheck(cx,cy,dx,dy,ax,ay);&lt;br /&gt;    var d = lineCheck(cx,cy,dx,dy,bx,by);&lt;br /&gt;    if(a*b&amp;lt;0 &amp;amp;&amp;amp; c*d&amp;lt;0) return true;&lt;br /&gt;    else return false;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;document.write(lineCrossCheck(ax,ay,bx,by,cx,cy,dx,dy));&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;script type="text/javascript"&gt;var ax = 3, ay = 10, bx = 10, by = 3, cx = 3, cy = 3, dx = 10, dy = 10;function lineCheck(ax,ay,bx,by,cx,cy){  return   (by-ay)/(bx-ax)*cx+(ay-(by-ay)/(bx-ax)*ax)-cy;} function lineCrossCheck(ax,ay,bx,by,cx,cy,dx,dy){    var a = lineCheck(ax,ay,bx,by,cx,cy);    var b = lineCheck(ax,ay,bx,by,dx,dy);    var c = lineCheck(cx,cy,dx,dy,ax,ay);    var d = lineCheck(cx,cy,dx,dy,bx,by);    if(a*b&lt;0 &amp;&amp; c*d&lt;0) return true;    else return false;}document.write(lineCrossCheck(ax,ay,bx,by,cx,cy,dx,dy));&lt;/script&gt;trueなので交差している。そういえば、これだとx=5といったxが一定の直線との交差判定をしようとするとエラーになる。式のbx-axの部分が両方とも同じ値になるため0になるからだ。0で割るとjavascriptは結果がinfinityになるようなので、infinity様に何を足そうが引こうがきっと答えはinfinityになるのだろう。よって修正版をつくる。&lt;pre class="prettyprint"&gt;&lt;br /&gt;ffunction lineCheck(ax,ay,bx,by,cx,cy){&lt;br /&gt; if(ax==bx){&lt;br /&gt;  return cx - ax;&lt;br /&gt; }else{&lt;br /&gt;  return (by-ay)/(bx-ax)*cx+(ay-(by-ay)/(bx-ax)*ax)-cy;&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;これでどうだろう。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/744605407212742108-1022604647586452983?l=endoyuta.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://endoyuta.blogspot.com/feeds/1022604647586452983/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://endoyuta.blogspot.com/2011/09/blog-post_4533.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/744605407212742108/posts/default/1022604647586452983'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/744605407212742108/posts/default/1022604647586452983'/><link rel='alternate' type='text/html' href='http://endoyuta.blogspot.com/2011/09/blog-post_4533.html' title='線分と線分の交差判定'/><author><name>endo yuta</name><uri>http://www.blogger.com/profile/05491646789675985410</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://1.bp.blogspot.com/-7dw9PlYIisc/TtuORirdBtI/AAAAAAAAAYc/kr_xs7ruXrU/s220/slime.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-744605407212742108.post-3821412824996579600</id><published>2011-09-06T22:29:00.000+09:00</published><updated>2011-09-06T22:29:57.464+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='Game'/><category scheme='http://www.blogger.com/atom/ns#' term='Mathematics'/><title type='text'>点が長方形の内側にあるかチェックする</title><content type='html'>点が長方形の内側にあるか否かをチェックするには、外積を使えばよい。&lt;br /&gt;&lt;br /&gt;ある長方形(10,10),(30,10),(30,30),(10,30)と、ある点(20,20)があるとしよう。このある点がある長方形の内側にあるのか外側にあるのかを判定したい。このような長方形であれば、外積を使うまでもなくチェックが可能だが、長方形が回転している場合や、長方形以外の多角形の場合などになると、簡単ではなくなる。しかし、外積を使えば一発で分かる。外積は&lt;a href="http://endoyuta.blogspot.com/2011/09/blog-post.html"&gt;このように&lt;/a&gt;ベクトルAとベクトルBの外積を求めた場合、その値がマイナスであればベクトルBはベクトルAの右側にあることになるので、長方形の各辺とある点が全て右側にあることを外積によって確かめればよい。(HTML5のcanvasの場合、座標は左上が原点となるので注意が必要じゃ。一般的な一番左下を原点とする形態であれば、長方形の各辺を時計回りにベクトルにしていけば、点がベクトルの右側にある場合、外積の数値はマイナスになるが、canvasの場合は反時計回りにベクトルにしていくとよい。マイナスになればベクトルの左側にあることにあり、（全ての辺に対して左側にあるのであれば）それはすなわち内側にあるということだ。)&lt;br /&gt;&lt;br /&gt;まず、長方形の(30,10)-(10,10)の辺と点の位置関係を確認しよう。長方形の辺をベクトルにすると(-20,0)になる。長方形の辺の始点と点をベクトルにすると、(-10,10)となる。この２つのベクトルの外積を求めると、下記になる。&lt;br /&gt;-20*10-10*0 = -200&lt;br /&gt;&lt;br /&gt;マイナスなので点は辺の左側にあるということだ。これを全ての辺でチェックして、全ての結果がマイナスであれば内側にあるということになる。&lt;br /&gt;&lt;br /&gt;javascriptによって内側判定をするとこうなる。&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;var x = 10; //長方形の左上x&lt;br /&gt;var y = 10; //長方形の左上y&lt;br /&gt;var w = 20; //長方形のwidth&lt;br /&gt;var h = 20; //長方形のheight&lt;br /&gt;var px = 20; //点のx&lt;br /&gt;var py = 20; //点のy&lt;br /&gt;&lt;br /&gt;function gaiseki(ax,ay,bx,by){&lt;br /&gt;     return ax*by-bx*ay;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function pointInCheck(X,Y,W,H,PX,PY){&lt;br /&gt;    var a = gaiseki(-W,0,PX-W-X,PY-Y);&lt;br /&gt;    var b = gaiseki(0,H,PX-X,PY-Y);&lt;br /&gt;    var c = gaiseki(W,0,PX-X,PY-Y-H);&lt;br /&gt;    var d = gaiseki(0,-H,PX-W-X,PY-H-Y);&lt;br /&gt;    if(a&amp;lt;0&amp;amp;&amp;amp;b&amp;lt;0&amp;amp;&amp;amp;c&amp;lt;0&amp;amp;&amp;amp;d&amp;lt;0) return true;&lt;br /&gt;    else return false;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;document.write(pointInCheck(x,y,w,h,px,py)); &lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;script type="text/javascript"&gt;var x = 10; //長方形の左上xvar y = 10; //長方形の左上yvar w = 20; //長方形のwidthvar h = 20; //長方形のheightvar px = 20; //点のxvar py = 20; //点のyfunction gaiseki(ax,ay,bx,by){     return ax*by-bx*ay;}function pointInCheck(X,Y,W,H,PX,PY){    var a = gaiseki(-W,0,PX-W-X,PY-Y);    var b = gaiseki(0,H,PX-X,PY-Y);    var c = gaiseki(W,0,PX-X,PY-Y-H);    var d = gaiseki(0,-H,PX-W-X,PY-H-Y);    if(a&lt;0&amp;&amp;b&lt;0&amp;&amp;c&lt;0&amp;&amp;d&lt;0) return true;    else return false;}document.write(pointInCheck(x,y,w,h,px,py)); &lt;/script&gt;&lt;br /&gt;tureだから、内側にある。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/744605407212742108-3821412824996579600?l=endoyuta.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://endoyuta.blogspot.com/feeds/3821412824996579600/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://endoyuta.blogspot.com/2011/09/blog-post_06.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/744605407212742108/posts/default/3821412824996579600'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/744605407212742108/posts/default/3821412824996579600'/><link rel='alternate' type='text/html' href='http://endoyuta.blogspot.com/2011/09/blog-post_06.html' title='点が長方形の内側にあるかチェックする'/><author><name>endo yuta</name><uri>http://www.blogger.com/profile/05491646789675985410</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://1.bp.blogspot.com/-7dw9PlYIisc/TtuORirdBtI/AAAAAAAAAYc/kr_xs7ruXrU/s220/slime.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-744605407212742108.post-6476019390409137411</id><published>2011-09-05T23:07:00.001+09:00</published><updated>2011-09-06T06:43:54.414+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='Mathematics'/><title type='text'>ベクトルの外積</title><content type='html'>ベクトルの外積は便利だ。ベクトルAとベクトルBの外積を求めたときに値がマイナスであれば、ベクトルBはベクトルAの右側にいるということが分かる。&lt;br /&gt;&lt;br /&gt;試してみよう。&lt;br /&gt;&lt;br /&gt;ベクトルA(6,6)、ベクトルB(6,0)としよう。&lt;br /&gt;外積は下記の式になる。&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;Ax * By - Bx * Ay&lt;/pre&gt;&lt;br /&gt;よって、6*0-6*6 = -36 となる。&lt;br /&gt;確かにマイナスである。&lt;br /&gt;&lt;br /&gt;それでは、ベクトルA(6,0)、ベクトルB(6,6)としてみよう。&lt;br /&gt;6*6-6*0 = 36 となる。&lt;br /&gt;確かにプラスである。&lt;br /&gt;&lt;br /&gt;ベクトルにはもう一つの成立する式がある。&lt;br /&gt;&lt;pre&gt;|A| * |B| * sinθ&lt;/pre&gt;&lt;br /&gt;ベクトルA(6,0)、ベクトルB(6,6)だとすると、&lt;br /&gt;6 * 6ルート2 *sin(45度)になるはずなので、javascriptだと下記になる。&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;document.write(6*6*Math.sqrt(2)*Math.sin(45*Math.PI/180));&lt;/pre&gt;&lt;br /&gt;&lt;script type="text/javascript"&gt;document.write(6*6*Math.sqrt(2)*Math.sin(45*Math.PI/180));&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;確かに36で一致する。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/744605407212742108-6476019390409137411?l=endoyuta.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://endoyuta.blogspot.com/feeds/6476019390409137411/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://endoyuta.blogspot.com/2011/09/blog-post.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/744605407212742108/posts/default/6476019390409137411'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/744605407212742108/posts/default/6476019390409137411'/><link rel='alternate' type='text/html' href='http://endoyuta.blogspot.com/2011/09/blog-post.html' title='ベクトルの外積'/><author><name>endo yuta</name><uri>http://www.blogger.com/profile/05491646789675985410</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://1.bp.blogspot.com/-7dw9PlYIisc/TtuORirdBtI/AAAAAAAAAYc/kr_xs7ruXrU/s220/slime.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-744605407212742108.post-4447812412924470666</id><published>2011-09-05T01:28:00.000+09:00</published><updated>2011-09-05T01:28:04.997+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='Mathematics'/><title type='text'>cosθの値をグラフにしてみる</title><content type='html'>０度〜360度のcosθの値をグラフに出してみよう。HTML canvasを使おう。&lt;br /&gt;&lt;br /&gt;&lt;canvas id="cosCanvas" width="365" height="110"&gt;&lt;/canvas&gt;&lt;br /&gt;&lt;script type="text/javascript"&gt;var cosCanvas = document.getElementById("cosCanvas");var COSC = cosCanvas.getContext("2d");var CW = cosCanvas.width, CH = cosCanvas.height;var cos = 0;for(var deg=0;deg&lt;361;deg++){    cos = Math.cos(deg*Math.PI/180);    COSC.beginPath();    COSC.fillStyle = '#ff5500';    COSC.arc(deg,CH/2-cos*50, 1, 0, 360,false);    COSC.fill();}COSC.beginPath();COSC.strokeStyle = '#666666';COSC.moveTo(0,CH/2); COSC.lineTo(CW,CH/2); COSC.closePath();COSC.stroke();for(var i=0;i&lt;361;i+=45){    COSC.beginPath();    COSC.strokeStyle = '#666666';    COSC.moveTo(i,0);     COSC.lineTo(i,CH);     COSC.closePath();    COSC.stroke();}&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;一番上が１を表している。真ん中が0で、一番下が-1である。一番左が0を表していて縦の目盛線は、45ずつに引いているつまり、0度はcosは１。それから角度が拡大するにつれてcosは徐々に小さくなっていき、90度だとcosは0になる。90度を超えるとマイナス数値になり、180度でcosは−１になる。180度を超えると逆に大きくなり、270度で0に戻る。270度を超えるとプラス数値になり、360度で1に戻る。&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;&amp;lt;canvas id=&amp;quot;cosCanvas&amp;quot; width=&amp;quot;365&amp;quot; height=&amp;quot;110&amp;quot;&amp;gt;&amp;lt;/canvas&amp;gt;&lt;br /&gt;&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;var cosCanvas = document.getElementById(&amp;quot;cosCanvas&amp;quot;);&lt;br /&gt;var COSC = cosCanvas.getContext(&amp;quot;2d&amp;quot;);&lt;br /&gt;var CW = cosCanvas.width, CH = cosCanvas.height;&lt;br /&gt;&lt;br /&gt;var cos = 0;&lt;br /&gt;&lt;br /&gt;for(var deg=0;deg&amp;lt;361;deg++){&lt;br /&gt;    cos = Math.cos(deg*Math.PI/180);&lt;br /&gt;    COSC.beginPath();&lt;br /&gt;    COSC.fillStyle = '#ff5500';&lt;br /&gt;    COSC.arc(deg,CH/2-cos*50, 1, 0, 360,false);&lt;br /&gt;    COSC.fill();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;COSC.beginPath();&lt;br /&gt;COSC.strokeStyle = '#666666';&lt;br /&gt;COSC.moveTo(0,CH/2); &lt;br /&gt;COSC.lineTo(CW,CH/2); &lt;br /&gt;COSC.closePath();&lt;br /&gt;COSC.stroke();&lt;br /&gt;&lt;br /&gt;for(var i=0;i&amp;lt;361;i+=45){&lt;br /&gt;    COSC.beginPath();&lt;br /&gt;    COSC.strokeStyle = '#666666';&lt;br /&gt;    COSC.moveTo(i,0); &lt;br /&gt;    COSC.lineTo(i,CH); &lt;br /&gt;    COSC.closePath();&lt;br /&gt;    COSC.stroke();&lt;br /&gt;}&lt;br /&gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/744605407212742108-4447812412924470666?l=endoyuta.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://endoyuta.blogspot.com/feeds/4447812412924470666/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://endoyuta.blogspot.com/2011/09/cos.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/744605407212742108/posts/default/4447812412924470666'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/744605407212742108/posts/default/4447812412924470666'/><link rel='alternate' type='text/html' href='http://endoyuta.blogspot.com/2011/09/cos.html' title='cosθの値をグラフにしてみる'/><author><name>endo yuta</name><uri>http://www.blogger.com/profile/05491646789675985410</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://1.bp.blogspot.com/-7dw9PlYIisc/TtuORirdBtI/AAAAAAAAAYc/kr_xs7ruXrU/s220/slime.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-744605407212742108.post-3227852664687528263</id><published>2011-09-05T00:35:00.001+09:00</published><updated>2011-09-05T01:33:54.431+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='Mathematics'/><title type='text'>ベクトルの内積の研究（1）</title><content type='html'>ベクトルの内積を研究する。&lt;br /&gt;&lt;br /&gt;まずV,Uをそれぞれ、(3,5)、(6,3)としよう。&lt;br /&gt;ベクトルの内積は下記のようになるものをいうらしい。&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;V●U = Vx * Ux + Vy * Uy&lt;/pre&gt;&lt;br /&gt;よって、内積は、3*6+5*3=&lt;script type="text/javascript"&gt;document.write(3*6+5*3)&lt;/script&gt;となる。&lt;br /&gt;&lt;br /&gt;内積ではもう一つ成立する式があるらしい。&lt;br /&gt;&lt;pre&gt;V●U = |V|*|U|*cosθ&lt;/pre&gt;&lt;br /&gt;ベクトルの大きさは、三平方の定理で求められるので、下記のようになる。&lt;br /&gt;|V| = 3^2+5^2の平方根 = &lt;script type="text/javascript"&gt;document.write(Math.sqrt(3*3+5*5))&lt;/script&gt; &lt;br /&gt;|U| = 6^2+3^2の平方根 = &lt;script type="text/javascript"&gt;document.write(Math.sqrt(6*6+3*3))&lt;/script&gt; &lt;br /&gt;&lt;br /&gt;よって、cosθの値が求められる。javascriptでやると下記のようになる。&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;var vx = 3, vy = 5;&lt;br /&gt;var ux = 6, uy = 3;&lt;br /&gt;var VU = vx*ux+vy*uy;&lt;br /&gt;var valV = Math.sqrt(3*3+5*5);&lt;br /&gt;var valU = Math.sqrt(6*6+3*3);&lt;br /&gt;var cos = VU / valV / valU;&lt;br /&gt;document.write(cos); &lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;script type="text/javascript"&gt;var vx = 3, vy = 5;var ux = 6, uy = 3;var VU = vx*ux+vy*uy;var valV = Math.sqrt(3*3+5*5);var valU = Math.sqrt(6*6+3*3);var cos = VU / valV / valU;document.write(cos); &lt;/script&gt;　となる。&lt;br /&gt;&lt;br /&gt;javascriptのMath.acos(cos)という関数は、cosの値を入れると角度を返してくれるようなのでやってみよう。&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;var rad = Math.acos(cos);&lt;br /&gt;document.write(rad);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;script type="text/javascript"&gt;var rad = Math.acos(cos);document.write(rad);&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;これはラジアンだが、360 度表記にすると、&lt;script type="text/javascript"&gt;document.write(rad/Math.PI*180);&lt;/script&gt;度ということだ。&lt;br /&gt;&lt;br /&gt;これが合っているかをatan2関数を使って確認してみよう。&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;var radV = Math.atan2(vy, vx);&lt;br /&gt;var radU = Math.atan2(uy,ux);&lt;br /&gt;document.write(radV - radU);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;script type="text/javascript"&gt;var radV = Math.atan2(vy, vx);var radU = Math.atan2(uy,ux);document.write(radV - radU);&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;おお合っている。&lt;br /&gt;&lt;br /&gt;しかし、内積が便利に使えるシーンがまだよく分からない。atan2関数があれば不要だったりするのかのう。&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/744605407212742108-3227852664687528263?l=endoyuta.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://endoyuta.blogspot.com/feeds/3227852664687528263/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://endoyuta.blogspot.com/2011/09/1.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/744605407212742108/posts/default/3227852664687528263'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/744605407212742108/posts/default/3227852664687528263'/><link rel='alternate' type='text/html' href='http://endoyuta.blogspot.com/2011/09/1.html' title='ベクトルの内積の研究（1）'/><author><name>endo yuta</name><uri>http://www.blogger.com/profile/05491646789675985410</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://1.bp.blogspot.com/-7dw9PlYIisc/TtuORirdBtI/AAAAAAAAAYc/kr_xs7ruXrU/s220/slime.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-744605407212742108.post-944619115176095548</id><published>2011-09-04T16:32:00.001+09:00</published><updated>2011-09-04T16:33:14.753+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='Mathematics'/><title type='text'>Javascript Math.sin(rad) サインを求める</title><content type='html'>Math.sin(rad)でサインを求められる。引数のradはラジアン。ラジアンがよく分からない。&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.amazon.co.jp/%E3%82%B3%E3%83%B3%E3%83%94%E3%83%A5%E3%83%BC%E3%82%BF%E3%82%B2%E3%83%BC%E3%83%A0%E3%81%AE%E7%89%A9%E7%90%86-%E5%B1%B1%E5%8C%97-%E7%AF%A4/dp/4775303589"&gt;コンピュータゲームの物理&lt;/a&gt;という私のバイブルによると、ラジアンは角度を表す方法の１つのようだ。我々は360度で一周する方法をいつも使っているが、この360という中途半端な数字は、そもそも１年が360日だと思われていた頃の名残であること以外に理由はないそうだ。プログラム等で計算する場合もっと使い易い角度表記がないものかと、考えられたのがラジアンであるということだ。&lt;br /&gt;&lt;br /&gt;ラジアンは、半径1の円を基準にした角度表記であるそうだ。ラジアンは、半径1の場合に角度がθだった場合の円周の長さのことである。つまり、角度θを半径1の場合の円周の長さで表すのがラジアンである。ちなみに、π(約3.14)は円周の長さが直径の何倍になるかを表した数字である。例えば半径1であれば、直径は2なので円周は、2π（約6.28）である。&lt;br /&gt;&lt;br /&gt;つまり、360度をラジアンで表すと、2πということである。180度ならばπである。1度であれば、π／180ということだ。&lt;br /&gt;&lt;br /&gt;ラジアンのすごいところは、360度表記と比べて円周の長さという実際の値に対応しているところと、長さと角度が完全に完全に一対一になっているところだそうだ。あんまりすごさが分からないが、確かに360度の360という数字自体には何の意味もないことはよく分かった。コンピュータがラジアンを使いたくなる気持ちも分かる。&lt;br /&gt;&lt;br /&gt;さてこれでラジアンが分かったので、最初のMath.sin関数をみると、引数がラジアンなので、Math.sin(30度）ではいけない。これをラジアンに変えて引数に投入するので、Math.sin(30*&lt;a href="http://endoyuta.blogspot.com/2011/09/javascript-mathpi.html"&gt;Math.PI&lt;/a&gt;/180)となる。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/744605407212742108-944619115176095548?l=endoyuta.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://endoyuta.blogspot.com/feeds/944619115176095548/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://endoyuta.blogspot.com/2011/09/javascript-mathsinrad.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/744605407212742108/posts/default/944619115176095548'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/744605407212742108/posts/default/944619115176095548'/><link rel='alternate' type='text/html' href='http://endoyuta.blogspot.com/2011/09/javascript-mathsinrad.html' title='Javascript Math.sin(rad) サインを求める'/><author><name>endo yuta</name><uri>http://www.blogger.com/profile/05491646789675985410</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://1.bp.blogspot.com/-7dw9PlYIisc/TtuORirdBtI/AAAAAAAAAYc/kr_xs7ruXrU/s220/slime.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-744605407212742108.post-8663950319181440601</id><published>2011-09-04T16:05:00.002+09:00</published><updated>2011-09-04T16:05:57.869+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='Mathematics'/><title type='text'>Javascript Math.PI 円周率を求める関数</title><content type='html'>&lt;pre class="prettyprint"&gt;document.write(Math.PI);&lt;/pre&gt;&lt;br /&gt;&lt;script type="text/javascript"&gt;document.write(Math.PI);&lt;/script&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/744605407212742108-8663950319181440601?l=endoyuta.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://endoyuta.blogspot.com/feeds/8663950319181440601/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://endoyuta.blogspot.com/2011/09/javascript-mathpi.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/744605407212742108/posts/default/8663950319181440601'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/744605407212742108/posts/default/8663950319181440601'/><link rel='alternate' type='text/html' href='http://endoyuta.blogspot.com/2011/09/javascript-mathpi.html' title='Javascript Math.PI 円周率を求める関数'/><author><name>endo yuta</name><uri>http://www.blogger.com/profile/05491646789675985410</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://1.bp.blogspot.com/-7dw9PlYIisc/TtuORirdBtI/AAAAAAAAAYc/kr_xs7ruXrU/s220/slime.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-744605407212742108.post-8367454712939793992</id><published>2011-09-04T16:01:00.001+09:00</published><updated>2011-09-04T18:44:39.746+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='Mathematics'/><title type='text'>Javascript Math.atan2() X軸からポイントまでの角度を取得</title><content type='html'>Math.atan2(y, x)&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.ajaxtower.jp/js/math_class/index15.html"&gt;http://www.ajaxtower.jp/js/math_class/index15.html&lt;/a&gt;&lt;br /&gt;ここの説明が分かり易そうだ。&lt;br /&gt;&lt;blockquote&gt;atan2関数は座標の逆正接(アークタンジェント)を計算して返します。引数に指定した原点と座標(x, y)、そして座標からX座標へ降ろした点の3点からなる三角形を対象として逆正接(アークタンジェント)を計算します。引数がY座標からとなっていることに注意して下さい。&lt;br /&gt;&lt;br /&gt;例えば座標(1, 1)とした場合、角度は45度になりタンジェントはtan(45度) = 1 / 1 = 1となります。atan2関数はタンジェントの結果が1となるような角度を取得するために、タンジェントの結果ではなく座標を指定します。つまりこの関数は座標を指定することで、原点からその座標に引いた直線のX軸からの角度を取得することができます。&lt;/blockquote&gt;&lt;br /&gt;ちょっと試してみよう。&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;var x = 10, y = 10;&lt;br /&gt;document.write(Math.atan2(y,x));&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;script type="text/javascript"&gt;var x = 10, y = 10;document.write(Math.atan2(y,x));&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;結果はラジアンなので、360度表記に直してみよう。&lt;br /&gt;ラジアンπが180度なので、ラジアンをπで割って180で書ければいいだろう。&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;var x = 10, y = 10, rad, deg;&lt;br /&gt;rad = Math.atan2(y,x);&lt;br /&gt;deg = rad/Math.PI*180;&lt;br /&gt;document.write(deg);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;script type="text/javascript"&gt;var x = 10, y = 10, rad, deg;rad = Math.atan2(y,x);deg = rad/Math.PI*180;document.write(deg);&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;原点を0,0とすると、x,yが10,10なので、直角二等辺三角形になるということだな。&lt;br /&gt;&lt;br /&gt;では、x=1,y=ルート3にしてみよう。&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;var x = 1, y = Math.sqrt(3), rad, deg;&lt;br /&gt;rad = Math.atan2(y,x);&lt;br /&gt;deg = rad/Math.PI*180;&lt;br /&gt;document.write(deg);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;script type="text/javascript"&gt;var x = 1, y = Math.sqrt(3), rad, deg;rad = Math.atan2(y,x);deg = rad/Math.PI*180;document.write(deg);&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;やはり60度だな。HTML5 Canvasの場合は、左上を原点とするから、そこだけ気をつけないといけないな。&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/744605407212742108-8367454712939793992?l=endoyuta.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://endoyuta.blogspot.com/feeds/8367454712939793992/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://endoyuta.blogspot.com/2011/09/javascript-mathatan2-x.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/744605407212742108/posts/default/8367454712939793992'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/744605407212742108/posts/default/8367454712939793992'/><link rel='alternate' type='text/html' href='http://endoyuta.blogspot.com/2011/09/javascript-mathatan2-x.html' title='Javascript Math.atan2() X軸からポイントまでの角度を取得'/><author><name>endo yuta</name><uri>http://www.blogger.com/profile/05491646789675985410</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://1.bp.blogspot.com/-7dw9PlYIisc/TtuORirdBtI/AAAAAAAAAYc/kr_xs7ruXrU/s220/slime.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-744605407212742108.post-3292999752293901881</id><published>2011-08-28T23:29:00.003+09:00</published><updated>2011-08-28T23:50:18.269+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Game'/><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='Android'/><title type='text'>Java LinkedListのテスト（Android Game 敵と弾の当たり判定〜削除）</title><content type='html'>Androidでゲームを作っているのですが、敵も沢山いて、プレイヤーが撃った弾も沢山ある場合、敵毎に全ての弾と当たり判定を実施する必要があります。敵が弾に当たっている場合は、敵と当たっている弾を削除します。簡単に出来ると思っていたのですが、今これにハマっています。。よって頭を整理しながらまとめていきたいと思います。&lt;br /&gt;&lt;br /&gt;敵と弾は数が自在に調整できた方がいいので、今回のテスト対象であります、LinkedListに格納していきます。ArrayListかLinkedListかどちらを選択するかについてですが、&lt;a href="http://www.atmarkit.co.jp/fjava/javatips/136java026.html"&gt;このページ&lt;/a&gt;を見て、削除が多いのでLinkedListを使うことにします。敵はEnemyクラスのインスタンスになり、弾はBulletクラスのインスタンスになります。&lt;br /&gt;&lt;br /&gt;まず、Enemyクラスは下記とします。&lt;br /&gt;&lt;pre class="prettyprint"&gt;public class Enemy {&lt;br /&gt;	float x, y, w = 30, h = 30;&lt;br /&gt;	&lt;br /&gt;	public Enemy(float X, float Y){&lt;br /&gt;		x = X; y = Y;&lt;br /&gt;	}&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;次に、Bulletクラスは下記とします。（今回はテストなので分かり易くする為に弾の大きさを敵と同じにしました。）&lt;br /&gt;&lt;pre class="prettyprint"&gt;public class Bullet {&lt;br /&gt;	float x, y, w = 30, h = 30;&lt;br /&gt;	&lt;br /&gt;	public Bullet(float X, float Y){&lt;br /&gt;		x = X; y = Y;&lt;br /&gt;	}&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;次に、EnemyクラスとBulletクラスを格納するためのLinkedListを2つ作ります。&lt;br /&gt;&lt;pre class="prettyprint"&gt;private LinkedList&amp;lt;Enemy&amp;gt; enemys = new LinkedList&amp;lt;Enemy&amp;gt;();&lt;br /&gt;private LinkedList&amp;lt;Bullet&amp;gt; bullets = new LinkedList&amp;lt;Bullet&amp;gt;();&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;次に、敵と弾のインスタンスを3つずつ作成し、LinkedListに格納します。インスタンス作成時の引数はx座標とy座標になりますので、最初の敵と最初の弾はまさに同じ場所にいて、その他の敵と弾は全く別の場所にいることになります。つまり、後程のコードで、うまく最初の敵と最初の弾だけ消えればゴールになります。&lt;br /&gt;&lt;pre class="prettyprint"&gt;//敵の生成&lt;br /&gt;enemys.add(new Enemy(10,10));&lt;br /&gt;enemys.add(new Enemy(30,50));&lt;br /&gt;enemys.add(new Enemy(100,100));&lt;br /&gt;//弾の生成&lt;br /&gt;bullets.add(new Bullet(10,10));&lt;br /&gt;bullets.add(new Bullet(200,200));&lt;br /&gt;bullets.add(new Bullet(300,300));&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;それでは、実際に当たり判定処理と、当たっている場合の削除をしてみます。想定するコードは下記です。&lt;br /&gt;&lt;pre class="prettyprint"&gt;//敵と弾の衝突判定&lt;br /&gt;Enemy eNow; Bullet bNow;&lt;br /&gt;for(Iterator&amp;lt;Enemy&amp;gt; i = enemys.iterator(); i.hasNext();){&lt;br /&gt;	eNow = i.next();&lt;br /&gt;	for(Iterator&amp;lt;Bullet&amp;gt; j = bullets.iterator(); j.hasNext();){&lt;br /&gt;		bNow = j.next();&lt;br /&gt;		if(eNow.x&amp;lt;bNow.x+bNow.w &amp;amp;&amp;amp; bNow.x&amp;lt;eNow.x+eNow.w &amp;amp;&amp;amp;&lt;br /&gt;				eNow.y&amp;lt;bNow.y+bNow.h &amp;amp;&amp;amp; bNow.y&amp;lt;=eNow.y+eNow.h){&lt;br /&gt;			j.remove(); //弾を消す&lt;br /&gt;			i.remove(); //敵を消す&lt;br /&gt;		}&lt;br /&gt;	}&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;上記コードを通した結果を下記のコードで表示してみます。&lt;br /&gt;&lt;pre class="prettyprint"&gt;//結果の表示&lt;br /&gt;System.out.println(&amp;quot;実行結果&amp;quot;);&lt;br /&gt;for(Iterator&amp;lt;Enemy&amp;gt; i = enemys.iterator(); i.hasNext();){&lt;br /&gt;	eNow = i.next();&lt;br /&gt;	System.out.println(&amp;quot;敵は(&amp;quot;+(int)eNow.x+&amp;quot;,&amp;quot;+(int)eNow.y+&amp;quot;)にいます。&amp;quot;);&lt;br /&gt;}&lt;br /&gt;for(Iterator&amp;lt;Bullet&amp;gt; i = bullets.iterator(); i.hasNext();){&lt;br /&gt;	bNow = i.next();&lt;br /&gt;	System.out.println(&amp;quot;弾は(&amp;quot;+(int)bNow.x+&amp;quot;,&amp;quot;+(int)bNow.y+&amp;quot;)にあります。&amp;quot;);&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;さて結果は下記のようになりました。やはり問題ないようだな。しっかり想定どおり最初の敵と最初の弾のみ消えている。別の部分に問題があるってことだな。。&lt;br /&gt;&lt;pre&gt;実行結果&lt;br /&gt;敵は(30,50)にいます。&lt;br /&gt;敵は(100,100)にいます。&lt;br /&gt;弾は(200,200)にあります。&lt;br /&gt;弾は(300,300)にあります。&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;試しに弾の位置を少し変えて実行してみよう。最初の弾の位置をずらしました。&lt;br /&gt;&lt;pre class="prettyprint"&gt;//敵の生成&lt;br /&gt;enemys.add(new Enemy(10,10));&lt;br /&gt;enemys.add(new Enemy(30,50));&lt;br /&gt;enemys.add(new Enemy(100,100));&lt;br /&gt;//弾の生成&lt;br /&gt;bullets.add(new Bullet(30,40));&lt;br /&gt;bullets.add(new Bullet(200,200));&lt;br /&gt;bullets.add(new Bullet(300,300));&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;実行結果は下記のとおり。これは敵・弾ともに消えているけど、敵はもう一匹消えるべきだな。最初の敵と２番目の敵に両方当たっているはずだからね。まあでも今は敵同士は離れているので、これが問題ではないな。&lt;br /&gt;&lt;pre&gt;実行結果&lt;br /&gt;敵は(30,50)にいます。&lt;br /&gt;敵は(100,100)にいます。&lt;br /&gt;弾は(200,200)にあります。&lt;br /&gt;弾は(300,300)にあります。&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/744605407212742108-3292999752293901881?l=endoyuta.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://endoyuta.blogspot.com/feeds/3292999752293901881/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://endoyuta.blogspot.com/2011/08/java-linkedlistandroid-game.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/744605407212742108/posts/default/3292999752293901881'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/744605407212742108/posts/default/3292999752293901881'/><link rel='alternate' type='text/html' href='http://endoyuta.blogspot.com/2011/08/java-linkedlistandroid-game.html' title='Java LinkedListのテスト（Android Game 敵と弾の当たり判定〜削除）'/><author><name>endo yuta</name><uri>http://www.blogger.com/profile/05491646789675985410</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://1.bp.blogspot.com/-7dw9PlYIisc/TtuORirdBtI/AAAAAAAAAYc/kr_xs7ruXrU/s220/slime.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-744605407212742108.post-3246281782292863652</id><published>2011-08-22T21:30:00.130+09:00</published><updated>2011-08-27T00:47:08.484+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Game'/><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='物理'/><category scheme='http://www.blogger.com/atom/ns#' term='Android'/><title type='text'>Android 横スクロールゲームをつくってみる</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-vWmUZ-knLx8/TlJe6LTh5CI/AAAAAAAAACg/FJ70oFiixqc/s1600/SC20110822-213502.png" imageanchor="1" style="clear:left; float:left;margin-right:1em; margin-bottom:1em"&gt;&lt;img border="0" height="192" width="320" src="http://2.bp.blogspot.com/-vWmUZ-knLx8/TlJe6LTh5CI/AAAAAAAAACg/FJ70oFiixqc/s320/SC20110822-213502.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;地面とボールをつくりました。ボールは既にタッチするとジャンプするようになっています。&lt;a href="http://endoyuta.blogspot.com/2011/08/androidsdk-ontouchevent.html"&gt;このページ&lt;/a&gt;で作成したタッチするとジャンプし、ジャンプ中にタッチすると２段ジャンプする仕様です。ちなみに、タッチをし続けるとジャンプ力が増すようになっています。これからこれをベースに横スクロールゲームを作ってみます。&lt;br /&gt;&lt;hr style="clear:both;border:none;" /&gt;&lt;h3&gt;雲を表示する&lt;/h3&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-9IuTKa6Jy-M/TlJltzG5B6I/AAAAAAAAADI/EVao5CAQtDA/s1600/SC20110822-231056.png" imageanchor="1" style="clear:left; float:left;margin-right:1em; margin-bottom:1em"&gt;&lt;img border="0" height="192" width="320" src="http://1.bp.blogspot.com/-9IuTKa6Jy-M/TlJltzG5B6I/AAAAAAAAADI/EVao5CAQtDA/s320/SC20110822-231056.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;とりあえず適当に雲を作りました。現時点のコードを記載します。&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;//HellowWorld.java&lt;br /&gt;&lt;br /&gt;package net.npaka.helloworld;&lt;br /&gt;&lt;br /&gt;import android.app.Activity;&lt;br /&gt;import android.os.Bundle;&lt;br /&gt;import android.view.Window;&lt;br /&gt;&lt;br /&gt;public class HelloWorld extends Activity {&lt;br /&gt;    @Override&lt;br /&gt;    public void onCreate(Bundle bundle) {&lt;br /&gt;        super.onCreate(bundle);&lt;br /&gt;        requestWindowFeature(Window.FEATURE_NO_TITLE);&lt;br /&gt;        setContentView(new HellowView(this));&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;//HellowView.java&lt;br /&gt;&lt;br /&gt;package net.npaka.helloworld;&lt;br /&gt;&lt;br /&gt;import android.content.Context;&lt;br /&gt;import android.content.res.Resources;&lt;br /&gt;import android.graphics.Canvas;&lt;br /&gt;import android.graphics.Color;&lt;br /&gt;import android.graphics.Paint;&lt;br /&gt;import android.graphics.Rect;&lt;br /&gt;import android.graphics.Bitmap;&lt;br /&gt;import android.graphics.BitmapFactory;&lt;br /&gt;import android.view.SurfaceHolder;&lt;br /&gt;import android.view.SurfaceView;&lt;br /&gt;import android.view.MotionEvent;&lt;br /&gt;&lt;br /&gt;public class HellowView extends SurfaceView implements&lt;br /&gt;	SurfaceHolder.Callback,Runnable{&lt;br /&gt;	&lt;br /&gt;	private int ww = 762;&lt;br /&gt;	private int wh = 480;&lt;br /&gt;	private Thread thread;&lt;br /&gt;	private SurfaceHolder holder;&lt;br /&gt;	private Paint paint = new Paint();&lt;br /&gt;	private Ball ball = new Ball();&lt;br /&gt;	private Cloud cloud = new Cloud();&lt;br /&gt;	private Bitmap cloud_img;&lt;br /&gt;	&lt;br /&gt;	public HellowView(Context context){&lt;br /&gt;		super(context);&lt;br /&gt;		&lt;br /&gt;		holder = getHolder();&lt;br /&gt;		holder.addCallback(this);&lt;br /&gt;		holder.setFixedSize(ww,wh);&lt;br /&gt;		&lt;br /&gt;		Resources r = getResources();&lt;br /&gt;		cloud_img = BitmapFactory.decodeResource(r, R.drawable.cloud);&lt;br /&gt;		&lt;br /&gt;		paint.setAntiAlias(true);&lt;br /&gt;		paint.setStyle(Paint.Style.FILL);&lt;br /&gt;		paint.setColor(Color.argb(255,154,54,54));&lt;br /&gt;	}&lt;br /&gt;	&lt;br /&gt;	public void surfaceCreated(SurfaceHolder holder){&lt;br /&gt;		thread = new Thread(this);&lt;br /&gt;		thread.start();&lt;br /&gt;	}&lt;br /&gt;	&lt;br /&gt;	public void surfaceChanged(SurfaceHolder holder,&lt;br /&gt;			int format,int w,int h){&lt;br /&gt;	}&lt;br /&gt;	&lt;br /&gt;	public void surfaceDestroyed(SurfaceHolder holder){&lt;br /&gt;		thread = null;&lt;br /&gt;	}&lt;br /&gt;	&lt;br /&gt;	public void run(){&lt;br /&gt;		Canvas canvas;&lt;br /&gt;		while(thread!=null){&lt;br /&gt;			canvas = holder.lockCanvas();&lt;br /&gt;			canvas.drawColor(Color.BLACK);&lt;br /&gt;			cloud.view(canvas);&lt;br /&gt;			canvas.drawRect(new Rect(0,480-50,762,480),paint);&lt;br /&gt;			ball.view(canvas);&lt;br /&gt;			holder.unlockCanvasAndPost(canvas);&lt;br /&gt;			&lt;br /&gt;			try{&lt;br /&gt;				Thread.sleep(10);&lt;br /&gt;			}catch(Exception e){&lt;br /&gt;			}&lt;br /&gt;		}&lt;br /&gt;	}&lt;br /&gt;&lt;br /&gt;	@Override&lt;br /&gt;	public boolean onTouchEvent(MotionEvent event){&lt;br /&gt;		int action = event.getAction();&lt;br /&gt;		if(action == 0){&lt;br /&gt;			if(ball.jumpFlag == true){&lt;br /&gt;				ball.jumpFlag2 = true;&lt;br /&gt;			}else{&lt;br /&gt;				ball.jumpFlag = true;&lt;br /&gt;				ball.touchTime = 1;&lt;br /&gt;			}&lt;br /&gt;		}else if(action == 1){&lt;br /&gt;			ball.touchTime = 0;&lt;br /&gt;		}&lt;br /&gt;		return true;&lt;br /&gt;	}&lt;br /&gt;	&lt;br /&gt;	class Cloud{&lt;br /&gt;		int x1 = 50;&lt;br /&gt;		int y1 = 50;&lt;br /&gt;		int x2 = x1+350;&lt;br /&gt;		int y2 = y1+100;&lt;br /&gt;		int x3 = x2+300;&lt;br /&gt;		int y3 = y2-50;&lt;br /&gt;		&lt;br /&gt;		public void view(Canvas canvas){&lt;br /&gt;			canvas.drawBitmap(cloud_img, x1,y1, null);&lt;br /&gt;			canvas.drawBitmap(cloud_img, x2,y2, null);&lt;br /&gt;			canvas.drawBitmap(cloud_img, x3,y3, null);&lt;br /&gt;		}&lt;br /&gt;	}&lt;br /&gt;	&lt;br /&gt;	class Ball{&lt;br /&gt;		int r = 20;&lt;br /&gt;		int x = r*2+50;&lt;br /&gt;		float y_base = wh-r-50;&lt;br /&gt;		float y = y_base;&lt;br /&gt;		float vy = -8;&lt;br /&gt;		float g = 0.2F;&lt;br /&gt;		boolean jumpFlag = false;&lt;br /&gt;		boolean jumpFlag2 = false;&lt;br /&gt;		boolean jump2finFlag = false;&lt;br /&gt;		int touchTime = 0;&lt;br /&gt;		Paint paint = new Paint();&lt;br /&gt;		&lt;br /&gt;		public Ball(){&lt;br /&gt;			paint.setAntiAlias(true);&lt;br /&gt;			paint.setStyle(Paint.Style.FILL);&lt;br /&gt;			paint.setColor(Color.argb(255,255,255,255));&lt;br /&gt;		}&lt;br /&gt;		&lt;br /&gt;		public void view(Canvas canvas){&lt;br /&gt;			canvas.drawCircle(x, y, r, paint);&lt;br /&gt;			if(jumpFlag){&lt;br /&gt;				paint.setColor(Color.argb(255,0,255,255));&lt;br /&gt;				if(jumpFlag2){&lt;br /&gt;					paint.setColor(Color.argb(255,255,255,0));&lt;br /&gt;					if(!jump2finFlag){&lt;br /&gt;						vy = -6;&lt;br /&gt;						jump2finFlag = true;&lt;br /&gt;					}&lt;br /&gt;				}else if(touchTime &amp;gt; 0){&lt;br /&gt;					paint.setColor(Color.argb(255,0,255,0));&lt;br /&gt;					vy = -8;&lt;br /&gt;					touchTime ++;&lt;br /&gt;					if(touchTime &amp;gt;20){&lt;br /&gt;						touchTime = 0;&lt;br /&gt;					}&lt;br /&gt;				}&lt;br /&gt;				y += vy;&lt;br /&gt;				vy += g;&lt;br /&gt;				if(y&amp;gt;=y_base){&lt;br /&gt;					y = y_base;&lt;br /&gt;					vy = -8;&lt;br /&gt;					jumpFlag = false;&lt;br /&gt;					jumpFlag2 = false;&lt;br /&gt;					jump2finFlag = false;&lt;br /&gt;					paint.setColor(Color.argb(255,255,255,255));&lt;br /&gt;				}&lt;br /&gt;			}&lt;br /&gt;		}&lt;br /&gt;	}&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;今はこの２つのファイルで構成されています。今後は、HellowViewクラスを改良していきます。私は横スクロールについて全く一般論を知りませんので、まったくもって非効率なことをこれからする可能性があります。ご指摘いただければ幸いです。&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;雲を動かしてボールが動いているように見せる&lt;/h3&gt;&lt;br /&gt;修正版HellowView.javaは下記です。&lt;br /&gt;&lt;pre class="prettyprint"&gt;package net.npaka.helloworld;&lt;br /&gt;&lt;br /&gt;import java.util.ArrayList;&lt;br /&gt;&lt;br /&gt;import android.content.Context;&lt;br /&gt;import android.content.res.Resources;&lt;br /&gt;import android.graphics.Canvas;&lt;br /&gt;import android.graphics.Color;&lt;br /&gt;import android.graphics.Paint;&lt;br /&gt;import android.graphics.PointF;&lt;br /&gt;import android.graphics.Rect;&lt;br /&gt;import android.graphics.Bitmap;&lt;br /&gt;import android.graphics.BitmapFactory;&lt;br /&gt;import android.view.SurfaceHolder;&lt;br /&gt;import android.view.SurfaceView;&lt;br /&gt;import android.view.MotionEvent;&lt;br /&gt;&lt;br /&gt;public class HellowView extends SurfaceView implements&lt;br /&gt;	SurfaceHolder.Callback,Runnable{&lt;br /&gt;	&lt;br /&gt;	private int ww = 762;&lt;br /&gt;	private int wh = 480;&lt;br /&gt;	private Thread thread;&lt;br /&gt;	private SurfaceHolder holder;&lt;br /&gt;	private Paint paint = new Paint();&lt;br /&gt;	private Ball ball = new Ball();&lt;br /&gt;	private Cloud cloud  =new Cloud();&lt;br /&gt;	private Bitmap cloud_img;&lt;br /&gt;	&lt;br /&gt;	public HellowView(Context context){&lt;br /&gt;		super(context);&lt;br /&gt;		&lt;br /&gt;		holder = getHolder();&lt;br /&gt;		holder.addCallback(this);&lt;br /&gt;		holder.setFixedSize(ww,wh);&lt;br /&gt;		&lt;br /&gt;		Resources r = getResources();&lt;br /&gt;		cloud_img = BitmapFactory.decodeResource(r, R.drawable.cloud);&lt;br /&gt;		&lt;br /&gt;		paint.setAntiAlias(true);&lt;br /&gt;		paint.setStyle(Paint.Style.FILL);&lt;br /&gt;		paint.setColor(Color.argb(255,154,54,54));&lt;br /&gt;	}&lt;br /&gt;	&lt;br /&gt;	public void surfaceCreated(SurfaceHolder holder){&lt;br /&gt;		thread = new Thread(this);&lt;br /&gt;		thread.start();&lt;br /&gt;	}&lt;br /&gt;	&lt;br /&gt;	public void surfaceChanged(SurfaceHolder holder,&lt;br /&gt;			int format,int w,int h){&lt;br /&gt;	}&lt;br /&gt;	&lt;br /&gt;	public void surfaceDestroyed(SurfaceHolder holder){&lt;br /&gt;		thread = null;&lt;br /&gt;	}&lt;br /&gt;	&lt;br /&gt;	public void run(){&lt;br /&gt;		Canvas canvas;&lt;br /&gt;		while(thread!=null){&lt;br /&gt;			canvas = holder.lockCanvas();&lt;br /&gt;			canvas.drawColor(Color.BLACK);&lt;br /&gt;			cloud.view(canvas);&lt;br /&gt;			canvas.drawRect(new Rect(0,480-50,762,480),paint);&lt;br /&gt;			ball.view(canvas);&lt;br /&gt;			holder.unlockCanvasAndPost(canvas);&lt;br /&gt;			&lt;br /&gt;			try{&lt;br /&gt;				Thread.sleep(10);&lt;br /&gt;			}catch(Exception e){&lt;br /&gt;			}&lt;br /&gt;		}&lt;br /&gt;	}&lt;br /&gt;&lt;br /&gt;	@Override&lt;br /&gt;	public boolean onTouchEvent(MotionEvent event){&lt;br /&gt;		int action = event.getAction();&lt;br /&gt;		if(action == 0){&lt;br /&gt;			if(ball.jumpFlag == true){&lt;br /&gt;				ball.jumpFlag2 = true;&lt;br /&gt;			}else{&lt;br /&gt;				ball.jumpFlag = true;&lt;br /&gt;				ball.touchTime = 1;&lt;br /&gt;			}&lt;br /&gt;		}else if(action == 1){&lt;br /&gt;			ball.touchTime = 0;&lt;br /&gt;		}&lt;br /&gt;		return true;&lt;br /&gt;	}&lt;br /&gt;	&lt;br /&gt;	class Cloud{&lt;br /&gt;		ArrayList&amp;lt;PointF&amp;gt; cloudXY = new ArrayList&amp;lt;PointF&amp;gt;();&lt;br /&gt;		&lt;br /&gt;		public Cloud(){&lt;br /&gt;			float X = 50;&lt;br /&gt;			float Y = 50;&lt;br /&gt;			for(int i=0;i&amp;lt;5;i++){&lt;br /&gt;				cloudXY.add(new PointF(X,Y));&lt;br /&gt;				X += 300;&lt;br /&gt;				Y = nextY(Y);&lt;br /&gt;			}&lt;br /&gt;		}&lt;br /&gt;&lt;br /&gt;		public void view(Canvas canvas){&lt;br /&gt;			for(int i=0;i&amp;lt;cloudXY.size();i++){&lt;br /&gt;				canvas.drawBitmap(cloud_img, cloudXY.get(i).x,cloudXY.get(i).y, null);&lt;br /&gt;				cloudXY.get(i).x -= ball.vx;&lt;br /&gt;				if(cloudXY.get(i).x&amp;lt;-219){&lt;br /&gt;					cloudXY.add(new PointF(cloudXY.get(cloudXY.size()-1).x+300,&lt;br /&gt;							nextY(cloudXY.get(cloudXY.size()-1).y)));&lt;br /&gt;					cloudXY.remove(i);&lt;br /&gt;					i--;&lt;br /&gt;				}&lt;br /&gt;			}&lt;br /&gt;		}&lt;br /&gt;		&lt;br /&gt;		private float nextY(float Y){&lt;br /&gt;			if(Y==50) return 150;&lt;br /&gt;			if(Y==150) return 100;&lt;br /&gt;			if(Y==100) return 50;&lt;br /&gt;			return 0;&lt;br /&gt;		}&lt;br /&gt;	}&lt;br /&gt;	&lt;br /&gt;	class Ball{&lt;br /&gt;		float r = 20;&lt;br /&gt;		float x = r*2+50;&lt;br /&gt;		float y_base = wh-r-50;&lt;br /&gt;		float y = y_base;&lt;br /&gt;		float vx = 0.05f;&lt;br /&gt;		float ax = 0.01f;&lt;br /&gt;		float vy = -8;&lt;br /&gt;		float g = 0.2F;&lt;br /&gt;		boolean jumpFlag = false;&lt;br /&gt;		boolean jumpFlag2 = false;&lt;br /&gt;		boolean jump2finFlag = false;&lt;br /&gt;		int touchTime = 0;&lt;br /&gt;		Paint paint = new Paint();&lt;br /&gt;		&lt;br /&gt;		public Ball(){&lt;br /&gt;			paint.setAntiAlias(true);&lt;br /&gt;			paint.setStyle(Paint.Style.FILL);&lt;br /&gt;			paint.setColor(Color.argb(255,255,255,255));&lt;br /&gt;		}&lt;br /&gt;		&lt;br /&gt;		public void view(Canvas canvas){&lt;br /&gt;			canvas.drawCircle(x, y, r, paint);&lt;br /&gt;			if(jumpFlag){&lt;br /&gt;				paint.setColor(Color.argb(255,0,255,255));&lt;br /&gt;				if(jumpFlag2){&lt;br /&gt;					paint.setColor(Color.argb(255,255,255,0));&lt;br /&gt;					if(!jump2finFlag){&lt;br /&gt;						vy = -6;&lt;br /&gt;						jump2finFlag = true;&lt;br /&gt;					}&lt;br /&gt;				}else if(touchTime &amp;gt; 0){&lt;br /&gt;					paint.setColor(Color.argb(255,0,255,0));&lt;br /&gt;					vy = -8;&lt;br /&gt;					touchTime ++;&lt;br /&gt;					if(touchTime &amp;gt;20){&lt;br /&gt;						touchTime = 0;&lt;br /&gt;					}&lt;br /&gt;				}&lt;br /&gt;				y += vy;&lt;br /&gt;				vy += g;&lt;br /&gt;				if(y&amp;gt;=y_base){&lt;br /&gt;					y = y_base;&lt;br /&gt;					vy = -8;&lt;br /&gt;					jumpFlag = false;&lt;br /&gt;					jumpFlag2 = false;&lt;br /&gt;					jump2finFlag = false;&lt;br /&gt;					paint.setColor(Color.argb(255,255,255,255));&lt;br /&gt;				}&lt;br /&gt;			}&lt;br /&gt;			if(vx &amp;lt; 50){&lt;br /&gt;				vx += ax;&lt;br /&gt;			}else{&lt;br /&gt;				vx = 50;&lt;br /&gt;			}&lt;br /&gt;		}&lt;br /&gt;	}&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;スクリーンキャプチャは下記です。写真だと見た目は変わりません。&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-0tP_fmy3-WI/TlKBCY46RyI/AAAAAAAAADU/ZM_HaRshFDE/s1600/SC20110823-011232.png" imageanchor="1" style="clear:left; float:left;margin-right:1em; margin-bottom:1em"&gt;&lt;img border="0" height="192" width="320" src="http://4.bp.blogspot.com/-0tP_fmy3-WI/TlKBCY46RyI/AAAAAAAAADU/ZM_HaRshFDE/s320/SC20110823-011232.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;雲は高速で流れていきますが、ボールが動いているようには見えません。雲は現実世界でも勝ってに動くので、木とか動かないものを動かす必要がありそうです。&lt;br /&gt;&lt;hr style="clear:both;border:none;" /&gt;&lt;h3&gt;サボテンも動かして更にボールが動いて見えるようにする&lt;/h3&gt;&lt;br /&gt;サボテンを植えることにしました。&lt;br /&gt;修正版コードはこれです。&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;package net.npaka.helloworld;&lt;br /&gt;&lt;br /&gt;import java.util.ArrayList;&lt;br /&gt;import java.util.Random;&lt;br /&gt;&lt;br /&gt;import android.content.Context;&lt;br /&gt;import android.content.res.Resources;&lt;br /&gt;import android.graphics.Canvas;&lt;br /&gt;import android.graphics.Color;&lt;br /&gt;import android.graphics.Paint;&lt;br /&gt;import android.graphics.PointF;&lt;br /&gt;import android.graphics.Rect;&lt;br /&gt;import android.graphics.Bitmap;&lt;br /&gt;import android.graphics.BitmapFactory;&lt;br /&gt;import android.view.SurfaceHolder;&lt;br /&gt;import android.view.SurfaceView;&lt;br /&gt;import android.view.MotionEvent;&lt;br /&gt;&lt;br /&gt;public class HellowView extends SurfaceView implements&lt;br /&gt;	SurfaceHolder.Callback,Runnable{&lt;br /&gt;	&lt;br /&gt;	private int ww = 762;&lt;br /&gt;	private int wh = 480;&lt;br /&gt;	private Thread thread;&lt;br /&gt;	private SurfaceHolder holder;&lt;br /&gt;	private Paint paint = new Paint();&lt;br /&gt;	private Ball ball = new Ball();&lt;br /&gt;	private Cloud cloud  = new Cloud();&lt;br /&gt;	private Saboten saboten = new Saboten();&lt;br /&gt;	private Bitmap cloud_img;&lt;br /&gt;	private Bitmap sabo_img;&lt;br /&gt;	&lt;br /&gt;	public HellowView(Context context){&lt;br /&gt;		super(context);&lt;br /&gt;		&lt;br /&gt;		holder = getHolder();&lt;br /&gt;		holder.addCallback(this);&lt;br /&gt;		holder.setFixedSize(ww,wh);&lt;br /&gt;		&lt;br /&gt;		Resources r = getResources();&lt;br /&gt;		cloud_img = BitmapFactory.decodeResource(r, R.drawable.cloud);&lt;br /&gt;		sabo_img = BitmapFactory.decodeResource(r, R.drawable.saboten);&lt;br /&gt;		&lt;br /&gt;		paint.setAntiAlias(true);&lt;br /&gt;		paint.setStyle(Paint.Style.FILL);&lt;br /&gt;		paint.setColor(Color.argb(255,154,54,54));&lt;br /&gt;	}&lt;br /&gt;	&lt;br /&gt;	public void surfaceCreated(SurfaceHolder holder){&lt;br /&gt;		thread = new Thread(this);&lt;br /&gt;		thread.start();&lt;br /&gt;	}&lt;br /&gt;	&lt;br /&gt;	public void surfaceChanged(SurfaceHolder holder,&lt;br /&gt;			int format,int w,int h){&lt;br /&gt;	}&lt;br /&gt;	&lt;br /&gt;	public void surfaceDestroyed(SurfaceHolder holder){&lt;br /&gt;		thread = null;&lt;br /&gt;	}&lt;br /&gt;	&lt;br /&gt;	public void run(){&lt;br /&gt;		Canvas canvas;&lt;br /&gt;		while(thread!=null){&lt;br /&gt;			canvas = holder.lockCanvas();&lt;br /&gt;			canvas.drawColor(Color.argb(255,0,150,200));&lt;br /&gt;			cloud.view(canvas);&lt;br /&gt;			saboten.view(canvas);&lt;br /&gt;			canvas.drawRect(new Rect(0,480-50,762,480),paint);&lt;br /&gt;			ball.view(canvas);&lt;br /&gt;			holder.unlockCanvasAndPost(canvas);&lt;br /&gt;			&lt;br /&gt;			try{&lt;br /&gt;				Thread.sleep(10);&lt;br /&gt;			}catch(Exception e){&lt;br /&gt;			}&lt;br /&gt;		}&lt;br /&gt;	}&lt;br /&gt;&lt;br /&gt;	@Override&lt;br /&gt;	public boolean onTouchEvent(MotionEvent event){&lt;br /&gt;		int action = event.getAction();&lt;br /&gt;		if(action == 0){&lt;br /&gt;			if(ball.jumpFlag == true){&lt;br /&gt;				ball.jumpFlag2 = true;&lt;br /&gt;			}else{&lt;br /&gt;				ball.jumpFlag = true;&lt;br /&gt;				ball.touchTime = 1;&lt;br /&gt;			}&lt;br /&gt;		}else if(action == 1){&lt;br /&gt;			ball.touchTime = 0;&lt;br /&gt;		}&lt;br /&gt;		return true;&lt;br /&gt;	}&lt;br /&gt;	&lt;br /&gt;	class Cloud{&lt;br /&gt;		ArrayList&amp;lt;PointF&amp;gt; cloudXY = new ArrayList&amp;lt;PointF&amp;gt;();&lt;br /&gt;		&lt;br /&gt;		public Cloud(){&lt;br /&gt;			float X = 50;&lt;br /&gt;			float Y = 50;&lt;br /&gt;			for(int i=0;i&amp;lt;5;i++){&lt;br /&gt;				cloudXY.add(new PointF(X,Y));&lt;br /&gt;				X += 300;&lt;br /&gt;				Y = nextY(Y);&lt;br /&gt;			}&lt;br /&gt;		}&lt;br /&gt;&lt;br /&gt;		public void view(Canvas canvas){&lt;br /&gt;			for(int i=0;i&amp;lt;cloudXY.size();i++){&lt;br /&gt;				canvas.drawBitmap(cloud_img, cloudXY.get(i).x,cloudXY.get(i).y, null);&lt;br /&gt;				cloudXY.get(i).x -= ball.vx;&lt;br /&gt;				if(cloudXY.get(i).x&amp;lt;-219){&lt;br /&gt;					cloudXY.add(new PointF(cloudXY.get(cloudXY.size()-1).x+300,&lt;br /&gt;							nextY(cloudXY.get(cloudXY.size()-1).y)));&lt;br /&gt;					cloudXY.remove(i);&lt;br /&gt;					i--;&lt;br /&gt;				}&lt;br /&gt;			}&lt;br /&gt;		}&lt;br /&gt;		&lt;br /&gt;		private float nextY(float Y){&lt;br /&gt;			if(Y==50) return 150;&lt;br /&gt;			if(Y==150) return 100;&lt;br /&gt;			if(Y==100) return 50;&lt;br /&gt;			return 0;&lt;br /&gt;		}&lt;br /&gt;	}&lt;br /&gt;	&lt;br /&gt;	class Saboten{&lt;br /&gt;		ArrayList&amp;lt;PointF&amp;gt; saboXY = new ArrayList&amp;lt;PointF&amp;gt;();&lt;br /&gt;		float Y = wh-50-213;&lt;br /&gt;		Random rnd = new Random();&lt;br /&gt;		&lt;br /&gt;		public Saboten(){&lt;br /&gt;			float X = 400;&lt;br /&gt;			for(int i=0;i&amp;lt;4;i++){&lt;br /&gt;				saboXY.add(new PointF(X,Y));&lt;br /&gt;				X += (200+rnd.nextInt(300));&lt;br /&gt;			}&lt;br /&gt;		}&lt;br /&gt;		&lt;br /&gt;		public void view(Canvas canvas){&lt;br /&gt;			for(int i=0;i&amp;lt;saboXY.size();i++){&lt;br /&gt;				canvas.drawBitmap(sabo_img, saboXY.get(i).x,saboXY.get(i).y, null);&lt;br /&gt;				saboXY.get(i).x -= ball.vx;&lt;br /&gt;				if(saboXY.get(i).x&amp;lt;-194){&lt;br /&gt;					saboXY.add(new PointF(saboXY.get(saboXY.size()-1).x+200+rnd.nextInt(300),Y));&lt;br /&gt;					saboXY.remove(i);&lt;br /&gt;					i--;&lt;br /&gt;				}&lt;br /&gt;			}&lt;br /&gt;		}&lt;br /&gt;	}&lt;br /&gt;	&lt;br /&gt;	class Ball{&lt;br /&gt;		float r = 20;&lt;br /&gt;		float x = r*2+50;&lt;br /&gt;		float y_base = wh-r-50;&lt;br /&gt;		float y = y_base;&lt;br /&gt;		float vx = 0.05f;&lt;br /&gt;		float ax = 0.01f;&lt;br /&gt;		float vy = -8;&lt;br /&gt;		float g = 0.2F;&lt;br /&gt;		boolean jumpFlag = false;&lt;br /&gt;		boolean jumpFlag2 = false;&lt;br /&gt;		boolean jump2finFlag = false;&lt;br /&gt;		int touchTime = 0;&lt;br /&gt;		Paint paint = new Paint();&lt;br /&gt;		&lt;br /&gt;		public Ball(){&lt;br /&gt;			paint.setAntiAlias(true);&lt;br /&gt;			paint.setStyle(Paint.Style.FILL);&lt;br /&gt;			paint.setColor(Color.argb(255,255,255,255));&lt;br /&gt;		}&lt;br /&gt;		&lt;br /&gt;		public void view(Canvas canvas){&lt;br /&gt;			canvas.drawCircle(x, y, r, paint);&lt;br /&gt;			if(jumpFlag){&lt;br /&gt;				paint.setColor(Color.argb(255,0,255,255));&lt;br /&gt;				if(jumpFlag2){&lt;br /&gt;					paint.setColor(Color.argb(255,255,255,0));&lt;br /&gt;					if(!jump2finFlag){&lt;br /&gt;						vy = -6;&lt;br /&gt;						jump2finFlag = true;&lt;br /&gt;					}&lt;br /&gt;				}else if(touchTime &amp;gt; 0){&lt;br /&gt;					paint.setColor(Color.argb(255,0,255,0));&lt;br /&gt;					vy = -8;&lt;br /&gt;					touchTime ++;&lt;br /&gt;					if(touchTime &amp;gt;20){&lt;br /&gt;						touchTime = 0;&lt;br /&gt;					}&lt;br /&gt;				}&lt;br /&gt;				y += vy;&lt;br /&gt;				vy += g;&lt;br /&gt;				if(y&amp;gt;=y_base){&lt;br /&gt;					y = y_base;&lt;br /&gt;					vy = -8;&lt;br /&gt;					jumpFlag = false;&lt;br /&gt;					jumpFlag2 = false;&lt;br /&gt;					jump2finFlag = false;&lt;br /&gt;					paint.setColor(Color.argb(255,255,255,255));&lt;br /&gt;				}&lt;br /&gt;			}&lt;br /&gt;			if(vx &amp;lt; 10){&lt;br /&gt;				vx += ax;&lt;br /&gt;			}else{&lt;br /&gt;				vx = 10;&lt;br /&gt;			}&lt;br /&gt;		}&lt;br /&gt;	}&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;スクリーンキャプチャはこれです。&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-LloGB7GiNfA/TlKdPaWudgI/AAAAAAAAADg/zLPUTK-9nZA/s1600/SC20110823-031452.png" imageanchor="1" style="clear:left; float:left;margin-right:1em; margin-bottom:1em"&gt;&lt;img border="0" height="192" width="320" src="http://4.bp.blogspot.com/-LloGB7GiNfA/TlKdPaWudgI/AAAAAAAAADg/zLPUTK-9nZA/s320/SC20110823-031452.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;今度はボールが動いて見えます。ただ高速に動かすと見てるだけで酔って気持ち悪くなったので、最高速度を落としました。サボテンを等間隔に配置すると全く動いているように見えないので、ランダム配置にしました。&lt;br /&gt;&lt;hr style="clear:both;border:none;" /&gt;&lt;h3&gt;ボールを車の絵に変える&lt;/h3&gt;今回は車のゲームしてみることにしました。&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-X4aaTEG3rwY/TlPKQ9lHgiI/AAAAAAAAADw/puQMElItqak/s1600/SC20110824-003902.png" imageanchor="1" style="clear:left; float:left;margin-right:1em; margin-bottom:1em"&gt;&lt;img border="0" height="192" width="320" src="http://4.bp.blogspot.com/-X4aaTEG3rwY/TlPKQ9lHgiI/AAAAAAAAADw/puQMElItqak/s320/SC20110824-003902.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;車が走るようになりました。次に障害物をランダムに出現させます。&lt;br /&gt;&lt;hr style="clear:both;border:none;" /&gt;&lt;h3&gt;障害物をランダムに出現させる&lt;/h3&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-d50Xodejxf4/TlZdcjvXgGI/AAAAAAAAAD8/Bel-eddyn8o/s1600/SC20110825-233249.png" imageanchor="1" style="clear:left; float:left;margin-right:1em; margin-bottom:1em"&gt;&lt;img border="0" height="192" width="320" src="http://2.bp.blogspot.com/-d50Xodejxf4/TlZdcjvXgGI/AAAAAAAAAD8/Bel-eddyn8o/s320/SC20110825-233249.png" /&gt;&lt;/a&gt;&lt;/div&gt;まずは、障害物を１つずつサボテンと同じようにランダムに出現させてみます。下記の修正版コードにより、左のような岩が一つずつ出現しました。&lt;br /&gt;&lt;br /&gt;修正版コードです。&lt;br /&gt;&lt;pre class="prettyprint"&gt;package net.npaka.helloworld;&lt;br /&gt;&lt;br /&gt;import java.util.ArrayList;&lt;br /&gt;import java.util.Random;&lt;br /&gt;&lt;br /&gt;import android.content.Context;&lt;br /&gt;import android.content.res.Resources;&lt;br /&gt;import android.graphics.Canvas;&lt;br /&gt;import android.graphics.Color;&lt;br /&gt;import android.graphics.Paint;&lt;br /&gt;import android.graphics.PointF;&lt;br /&gt;import android.graphics.Rect;&lt;br /&gt;import android.graphics.Bitmap;&lt;br /&gt;import android.graphics.BitmapFactory;&lt;br /&gt;import android.view.SurfaceHolder;&lt;br /&gt;import android.view.SurfaceView;&lt;br /&gt;import android.view.MotionEvent;&lt;br /&gt;&lt;br /&gt;public class HellowView extends SurfaceView implements&lt;br /&gt;	SurfaceHolder.Callback,Runnable{&lt;br /&gt;	&lt;br /&gt;	private int ww = 762;&lt;br /&gt;	private int wh = 480;&lt;br /&gt;	private Thread thread;&lt;br /&gt;	private SurfaceHolder holder;&lt;br /&gt;	private Paint paint = new Paint();&lt;br /&gt;	private Car car = new Car();&lt;br /&gt;	private Cloud cloud  = new Cloud();&lt;br /&gt;	private Saboten saboten = new Saboten();&lt;br /&gt;	private Rock rock = new Rock();&lt;br /&gt;	private Bitmap cloud_img;&lt;br /&gt;	private Bitmap sabo_img;&lt;br /&gt;	private Bitmap car_img;&lt;br /&gt;	private Bitmap rock_img;&lt;br /&gt;	&lt;br /&gt;	public HellowView(Context context){&lt;br /&gt;		super(context);&lt;br /&gt;		&lt;br /&gt;		holder = getHolder();&lt;br /&gt;		holder.addCallback(this);&lt;br /&gt;		holder.setFixedSize(ww,wh);&lt;br /&gt;		&lt;br /&gt;		Resources r = getResources();&lt;br /&gt;		cloud_img = BitmapFactory.decodeResource(r, R.drawable.cloud);&lt;br /&gt;		sabo_img = BitmapFactory.decodeResource(r, R.drawable.saboten);&lt;br /&gt;		car_img = BitmapFactory.decodeResource(r, R.drawable.car);&lt;br /&gt;		rock_img = BitmapFactory.decodeResource(r, R.drawable.rock);&lt;br /&gt;		&lt;br /&gt;		paint.setAntiAlias(true);&lt;br /&gt;		paint.setStyle(Paint.Style.FILL);&lt;br /&gt;		paint.setColor(Color.argb(255,154,54,54));&lt;br /&gt;	}&lt;br /&gt;	&lt;br /&gt;	public void surfaceCreated(SurfaceHolder holder){&lt;br /&gt;		thread = new Thread(this);&lt;br /&gt;		thread.start();&lt;br /&gt;	}&lt;br /&gt;	&lt;br /&gt;	public void surfaceChanged(SurfaceHolder holder,&lt;br /&gt;			int format,int w,int h){&lt;br /&gt;	}&lt;br /&gt;	&lt;br /&gt;	public void surfaceDestroyed(SurfaceHolder holder){&lt;br /&gt;		thread = null;&lt;br /&gt;	}&lt;br /&gt;	&lt;br /&gt;	public void run(){&lt;br /&gt;		Canvas canvas;&lt;br /&gt;		while(thread!=null){&lt;br /&gt;			canvas = holder.lockCanvas();&lt;br /&gt;			canvas.drawColor(Color.argb(255,0,150,200));&lt;br /&gt;			cloud.view(canvas);&lt;br /&gt;			saboten.view(canvas);&lt;br /&gt;			canvas.drawRect(new Rect(0,480-50,762,480),paint);&lt;br /&gt;			rock.view(canvas);&lt;br /&gt;			car.view(canvas);&lt;br /&gt;			holder.unlockCanvasAndPost(canvas);&lt;br /&gt;			&lt;br /&gt;			try{&lt;br /&gt;				Thread.sleep(10);&lt;br /&gt;			}catch(Exception e){&lt;br /&gt;			}&lt;br /&gt;		}&lt;br /&gt;	}&lt;br /&gt;&lt;br /&gt;	@Override&lt;br /&gt;	public boolean onTouchEvent(MotionEvent event){&lt;br /&gt;		int action = event.getAction();&lt;br /&gt;		if(action == 0){&lt;br /&gt;			if(car.jumpFlag == true){&lt;br /&gt;				car.jumpFlag2 = true;&lt;br /&gt;			}else{&lt;br /&gt;				car.jumpFlag = true;&lt;br /&gt;				car.touchTime = 1;&lt;br /&gt;			}&lt;br /&gt;		}else if(action == 1){&lt;br /&gt;			car.touchTime = 0;&lt;br /&gt;		}&lt;br /&gt;		return true;&lt;br /&gt;	}&lt;br /&gt;	&lt;br /&gt;	class Cloud{&lt;br /&gt;		ArrayList&amp;lt;PointF&amp;gt; cloudXY = new ArrayList&amp;lt;PointF&amp;gt;();&lt;br /&gt;		&lt;br /&gt;		public Cloud(){&lt;br /&gt;			float X = 50;&lt;br /&gt;			float Y = 50;&lt;br /&gt;			for(int i=0;i&amp;lt;5;i++){&lt;br /&gt;				cloudXY.add(new PointF(X,Y));&lt;br /&gt;				X += 300;&lt;br /&gt;				Y = nextY(Y);&lt;br /&gt;			}&lt;br /&gt;		}&lt;br /&gt;&lt;br /&gt;		public void view(Canvas canvas){&lt;br /&gt;			for(int i=0;i&amp;lt;cloudXY.size();i++){&lt;br /&gt;				canvas.drawBitmap(cloud_img, cloudXY.get(i).x,cloudXY.get(i).y, null);&lt;br /&gt;				cloudXY.get(i).x -= car.vx;&lt;br /&gt;				if(cloudXY.get(i).x&amp;lt;-219){&lt;br /&gt;					cloudXY.add(new PointF(cloudXY.get(cloudXY.size()-1).x+300,&lt;br /&gt;							nextY(cloudXY.get(cloudXY.size()-1).y)));&lt;br /&gt;					cloudXY.remove(i);&lt;br /&gt;					i--;&lt;br /&gt;				}&lt;br /&gt;			}&lt;br /&gt;		}&lt;br /&gt;		&lt;br /&gt;		private float nextY(float Y){&lt;br /&gt;			if(Y==50) return 150;&lt;br /&gt;			if(Y==150) return 100;&lt;br /&gt;			if(Y==100) return 50;&lt;br /&gt;			return 0;&lt;br /&gt;		}&lt;br /&gt;	}&lt;br /&gt;	&lt;br /&gt;	class Saboten{&lt;br /&gt;		ArrayList&amp;lt;PointF&amp;gt; saboXY = new ArrayList&amp;lt;PointF&amp;gt;();&lt;br /&gt;		float Y = wh-50-213;&lt;br /&gt;		Random rnd = new Random();&lt;br /&gt;		&lt;br /&gt;		public Saboten(){&lt;br /&gt;			float X = 400;&lt;br /&gt;			for(int i=0;i&amp;lt;4;i++){&lt;br /&gt;				saboXY.add(new PointF(X,Y));&lt;br /&gt;				X += (200+rnd.nextInt(300));&lt;br /&gt;			}&lt;br /&gt;		}&lt;br /&gt;		&lt;br /&gt;		public void view(Canvas canvas){&lt;br /&gt;			for(int i=0;i&amp;lt;saboXY.size();i++){&lt;br /&gt;				canvas.drawBitmap(sabo_img, saboXY.get(i).x,saboXY.get(i).y, null);&lt;br /&gt;				saboXY.get(i).x -= car.vx;&lt;br /&gt;				if(saboXY.get(i).x&amp;lt;-194){&lt;br /&gt;					saboXY.add(new PointF(saboXY.get(saboXY.size()-1).x+200+rnd.nextInt(300),Y));&lt;br /&gt;					saboXY.remove(i);&lt;br /&gt;					i--;&lt;br /&gt;				}&lt;br /&gt;			}&lt;br /&gt;		}&lt;br /&gt;	}&lt;br /&gt;	&lt;br /&gt;	class Rock{&lt;br /&gt;		ArrayList&amp;lt;PointF&amp;gt; rockXY = new ArrayList&amp;lt;PointF&amp;gt;();&lt;br /&gt;		float Y = wh-50-85;&lt;br /&gt;		Random rnd = new Random();&lt;br /&gt;		&lt;br /&gt;		public Rock(){&lt;br /&gt;			float X = 1000;&lt;br /&gt;			for(int i=0;i&amp;lt;2;i++){&lt;br /&gt;				rockXY.add(new PointF(X,Y));&lt;br /&gt;				X += (500+rnd.nextInt(300));&lt;br /&gt;			}&lt;br /&gt;		}&lt;br /&gt;		&lt;br /&gt;		public void view(Canvas canvas){&lt;br /&gt;			for(int i=0;i&amp;lt;rockXY.size();i++){&lt;br /&gt;				canvas.drawBitmap(rock_img, rockXY.get(i).x,rockXY.get(i).y, null);&lt;br /&gt;				rockXY.get(i).x -= car.vx;&lt;br /&gt;				if(rockXY.get(i).x&amp;lt;-85){&lt;br /&gt;					rockXY.add(new PointF(rockXY.get(rockXY.size()-1).x+500+rnd.nextInt(300),Y));&lt;br /&gt;					rockXY.remove(i);&lt;br /&gt;					i--;&lt;br /&gt;				}&lt;br /&gt;			}&lt;br /&gt;		}&lt;br /&gt;		&lt;br /&gt;	}&lt;br /&gt;	&lt;br /&gt;	class Car{&lt;br /&gt;		float x = 150;&lt;br /&gt;		float y_base = wh-80-50;&lt;br /&gt;		float y = y_base;&lt;br /&gt;		float vx = 0.05f;&lt;br /&gt;		float ax = 0.01f;&lt;br /&gt;		float vy = -8;&lt;br /&gt;		float g = 0.2F;&lt;br /&gt;		boolean jumpFlag = false;&lt;br /&gt;		boolean jumpFlag2 = false;&lt;br /&gt;		boolean jump2finFlag = false;&lt;br /&gt;		int touchTime = 0;&lt;br /&gt;		&lt;br /&gt;		public void view(Canvas canvas){&lt;br /&gt;			canvas.drawBitmap(car_img, x,y, null);&lt;br /&gt;			if(jumpFlag){&lt;br /&gt;				if(jumpFlag2){&lt;br /&gt;					if(!jump2finFlag){&lt;br /&gt;						vy = -6;&lt;br /&gt;						jump2finFlag = true;&lt;br /&gt;					}&lt;br /&gt;				}else if(touchTime &amp;gt; 0){&lt;br /&gt;					vy = -8;&lt;br /&gt;					touchTime ++;&lt;br /&gt;					if(touchTime &amp;gt;20){&lt;br /&gt;						touchTime = 0;&lt;br /&gt;					}&lt;br /&gt;				}&lt;br /&gt;				y += vy;&lt;br /&gt;				vy += g;&lt;br /&gt;				if(y&amp;gt;=y_base){&lt;br /&gt;					y = y_base;&lt;br /&gt;					vy = -8;&lt;br /&gt;					jumpFlag = false;&lt;br /&gt;					jumpFlag2 = false;&lt;br /&gt;					jump2finFlag = false;&lt;br /&gt;				}&lt;br /&gt;			}&lt;br /&gt;			if(vx &amp;lt; 10){&lt;br /&gt;				vx += ax;&lt;br /&gt;			}else{&lt;br /&gt;				vx = 10;&lt;br /&gt;			}&lt;br /&gt;		}&lt;br /&gt;	}&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;h3&gt;衝突判定してみる&lt;/h3&gt;むお衝突判定しようとして気づきましたが、このコードじゃ全然だめだ。物理の世界を持ち込むんなら、共通的な物理の世界をコードの中で作っとかないと、たこ足コードになってしまうのう。修正するのがめんどくさいのでこれはここまでにしよう。今今のコードは下記です。衝突判定をして、衝突していた場合、車が岩の上の方にいた場合は岩にのっかり、そうじゃなければ車が跳ね返るようになっています。しかしこれは全然ダメダメコードです。&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;package net.npaka.helloworld;&lt;br /&gt;&lt;br /&gt;import java.util.ArrayList;&lt;br /&gt;import java.util.Random;&lt;br /&gt;&lt;br /&gt;import android.content.Context;&lt;br /&gt;import android.content.res.Resources;&lt;br /&gt;import android.graphics.Canvas;&lt;br /&gt;import android.graphics.Color;&lt;br /&gt;import android.graphics.Paint;&lt;br /&gt;import android.graphics.PointF;&lt;br /&gt;import android.graphics.Rect;&lt;br /&gt;import android.graphics.Bitmap;&lt;br /&gt;import android.graphics.BitmapFactory;&lt;br /&gt;import android.view.SurfaceHolder;&lt;br /&gt;import android.view.SurfaceView;&lt;br /&gt;import android.view.MotionEvent;&lt;br /&gt;&lt;br /&gt;public class HellowView extends SurfaceView implements&lt;br /&gt;	SurfaceHolder.Callback,Runnable{&lt;br /&gt;	&lt;br /&gt;	private int ww = 762;&lt;br /&gt;	private int wh = 480;&lt;br /&gt;	private Thread thread;&lt;br /&gt;	private SurfaceHolder holder;&lt;br /&gt;	private Paint paint = new Paint();&lt;br /&gt;	private Car car = new Car();&lt;br /&gt;	private Cloud cloud  = new Cloud();&lt;br /&gt;	private Saboten saboten = new Saboten();&lt;br /&gt;	private Rock rock = new Rock();&lt;br /&gt;	private Bitmap cloud_img;&lt;br /&gt;	private Bitmap sabo_img;&lt;br /&gt;	private Bitmap car_img;&lt;br /&gt;	private Bitmap rock_img;&lt;br /&gt;	&lt;br /&gt;	public HellowView(Context context){&lt;br /&gt;		super(context);&lt;br /&gt;		&lt;br /&gt;		holder = getHolder();&lt;br /&gt;		holder.addCallback(this);&lt;br /&gt;		holder.setFixedSize(ww,wh);&lt;br /&gt;		&lt;br /&gt;		Resources r = getResources();&lt;br /&gt;		cloud_img = BitmapFactory.decodeResource(r, R.drawable.cloud);&lt;br /&gt;		sabo_img = BitmapFactory.decodeResource(r, R.drawable.saboten);&lt;br /&gt;		car_img = BitmapFactory.decodeResource(r, R.drawable.car);&lt;br /&gt;		rock_img = BitmapFactory.decodeResource(r, R.drawable.rock);&lt;br /&gt;		&lt;br /&gt;		paint.setAntiAlias(true);&lt;br /&gt;		paint.setStyle(Paint.Style.FILL);&lt;br /&gt;		paint.setColor(Color.argb(255,154,54,54));&lt;br /&gt;	}&lt;br /&gt;	&lt;br /&gt;	public void surfaceCreated(SurfaceHolder holder){&lt;br /&gt;		thread = new Thread(this);&lt;br /&gt;		thread.start();&lt;br /&gt;	}&lt;br /&gt;	&lt;br /&gt;	public void surfaceChanged(SurfaceHolder holder,&lt;br /&gt;			int format,int w,int h){&lt;br /&gt;	}&lt;br /&gt;	&lt;br /&gt;	public void surfaceDestroyed(SurfaceHolder holder){&lt;br /&gt;		thread = null;&lt;br /&gt;	}&lt;br /&gt;	&lt;br /&gt;	public void run(){&lt;br /&gt;		Canvas canvas;&lt;br /&gt;		while(thread!=null){&lt;br /&gt;			canvas = holder.lockCanvas();&lt;br /&gt;			canvas.drawColor(Color.argb(255,0,150,200));&lt;br /&gt;			cloud.view(canvas);&lt;br /&gt;			saboten.view(canvas);&lt;br /&gt;			canvas.drawRect(new Rect(0,480-50,762,480),paint);&lt;br /&gt;			rock.view(canvas);&lt;br /&gt;			car.view(canvas);&lt;br /&gt;			holder.unlockCanvasAndPost(canvas);&lt;br /&gt;			&lt;br /&gt;			try{&lt;br /&gt;				Thread.sleep(10);&lt;br /&gt;			}catch(Exception e){&lt;br /&gt;			}&lt;br /&gt;		}&lt;br /&gt;	}&lt;br /&gt;&lt;br /&gt;	@Override&lt;br /&gt;	public boolean onTouchEvent(MotionEvent event){&lt;br /&gt;		int action = event.getAction();&lt;br /&gt;		if(action == 0){&lt;br /&gt;			if(car.jumpFlag == true){&lt;br /&gt;				car.jumpFlag2 = true;&lt;br /&gt;			}else{&lt;br /&gt;				car.jumpFlag = true;&lt;br /&gt;				car.touchTime = 1;&lt;br /&gt;			}&lt;br /&gt;		}else if(action == 1){&lt;br /&gt;			car.touchTime = 0;&lt;br /&gt;		}&lt;br /&gt;		return true;&lt;br /&gt;	}&lt;br /&gt;	&lt;br /&gt;	class Cloud{&lt;br /&gt;		ArrayList&amp;lt;PointF&amp;gt; cloudXY = new ArrayList&amp;lt;PointF&amp;gt;();&lt;br /&gt;		&lt;br /&gt;		public Cloud(){&lt;br /&gt;			float X = 50;&lt;br /&gt;			float Y = 50;&lt;br /&gt;			for(int i=0;i&amp;lt;5;i++){&lt;br /&gt;				cloudXY.add(new PointF(X,Y));&lt;br /&gt;				X += 300;&lt;br /&gt;				Y = nextY(Y);&lt;br /&gt;			}&lt;br /&gt;		}&lt;br /&gt;&lt;br /&gt;		public void view(Canvas canvas){&lt;br /&gt;			for(int i=0;i&amp;lt;cloudXY.size();i++){&lt;br /&gt;				canvas.drawBitmap(cloud_img, cloudXY.get(i).x,cloudXY.get(i).y, null);&lt;br /&gt;				cloudXY.get(i).x -= car.vx;&lt;br /&gt;				if(cloudXY.get(i).x&amp;lt;-219){&lt;br /&gt;					cloudXY.add(new PointF(cloudXY.get(cloudXY.size()-1).x+300,&lt;br /&gt;							nextY(cloudXY.get(cloudXY.size()-1).y)));&lt;br /&gt;					cloudXY.remove(i);&lt;br /&gt;					i--;&lt;br /&gt;				}&lt;br /&gt;			}&lt;br /&gt;		}&lt;br /&gt;		&lt;br /&gt;		private float nextY(float Y){&lt;br /&gt;			if(Y==50) return 150;&lt;br /&gt;			if(Y==150) return 100;&lt;br /&gt;			if(Y==100) return 50;&lt;br /&gt;			return 0;&lt;br /&gt;		}&lt;br /&gt;	}&lt;br /&gt;	&lt;br /&gt;	class Saboten{&lt;br /&gt;		ArrayList&amp;lt;PointF&amp;gt; saboXY = new ArrayList&amp;lt;PointF&amp;gt;();&lt;br /&gt;		float Y = wh-50-213;&lt;br /&gt;		Random rnd = new Random();&lt;br /&gt;		&lt;br /&gt;		public Saboten(){&lt;br /&gt;			float X = 400;&lt;br /&gt;			for(int i=0;i&amp;lt;4;i++){&lt;br /&gt;				saboXY.add(new PointF(X,Y));&lt;br /&gt;				X += (200+rnd.nextInt(300));&lt;br /&gt;			}&lt;br /&gt;		}&lt;br /&gt;		&lt;br /&gt;		public void view(Canvas canvas){&lt;br /&gt;			for(int i=0;i&amp;lt;saboXY.size();i++){&lt;br /&gt;				canvas.drawBitmap(sabo_img, saboXY.get(i).x,saboXY.get(i).y, null);&lt;br /&gt;				saboXY.get(i).x -= car.vx;&lt;br /&gt;				if(saboXY.get(i).x&amp;lt;-194){&lt;br /&gt;					saboXY.add(new PointF(saboXY.get(saboXY.size()-1).x+200+rnd.nextInt(300),Y));&lt;br /&gt;					saboXY.remove(i);&lt;br /&gt;					i--;&lt;br /&gt;				}&lt;br /&gt;			}&lt;br /&gt;		}&lt;br /&gt;	}&lt;br /&gt;	&lt;br /&gt;	class Rock{&lt;br /&gt;		ArrayList&amp;lt;PointF&amp;gt; rockXY = new ArrayList&amp;lt;PointF&amp;gt;();&lt;br /&gt;		float Y = wh-50-85;&lt;br /&gt;		Random rnd = new Random();&lt;br /&gt;		&lt;br /&gt;		public Rock(){&lt;br /&gt;			float X = 1000;&lt;br /&gt;			for(int i=0;i&amp;lt;2;i++){&lt;br /&gt;				rockXY.add(new PointF(X,Y));&lt;br /&gt;				X += (500+rnd.nextInt(300));&lt;br /&gt;			}&lt;br /&gt;		}&lt;br /&gt;		&lt;br /&gt;		public void view(Canvas canvas){&lt;br /&gt;			for(int i=0;i&amp;lt;rockXY.size();i++){&lt;br /&gt;				canvas.drawBitmap(rock_img, rockXY.get(i).x,rockXY.get(i).y, null);&lt;br /&gt;				rockXY.get(i).x -= car.vx;&lt;br /&gt;				if(rockXY.get(i).x&amp;lt;-85){&lt;br /&gt;					rockXY.add(new PointF(rockXY.get(rockXY.size()-1).x+500+rnd.nextInt(300),Y));&lt;br /&gt;					rockXY.remove(i);&lt;br /&gt;					i--;&lt;br /&gt;				}&lt;br /&gt;			}&lt;br /&gt;		}&lt;br /&gt;		&lt;br /&gt;	}&lt;br /&gt;	&lt;br /&gt;	class Car{&lt;br /&gt;		float x = 150;&lt;br /&gt;		float y_base = wh-80-50;&lt;br /&gt;		float y = y_base;&lt;br /&gt;		float vx = 0.1f;&lt;br /&gt;		float ax = 0.01f;&lt;br /&gt;		float vy = -8;&lt;br /&gt;		float g = 0.2F;&lt;br /&gt;		boolean jumpFlag = false;&lt;br /&gt;		boolean jumpFlag2 = false;&lt;br /&gt;		boolean jump2finFlag = false;&lt;br /&gt;		int touchTime = 0;&lt;br /&gt;		&lt;br /&gt;		public void view(Canvas canvas){&lt;br /&gt;			canvas.drawBitmap(car_img, x,y, null);&lt;br /&gt;			if(jumpFlag){&lt;br /&gt;				if(jumpFlag2){&lt;br /&gt;					if(!jump2finFlag){&lt;br /&gt;						vy = -6;&lt;br /&gt;						jump2finFlag = true;&lt;br /&gt;					}&lt;br /&gt;				}else if(touchTime &amp;gt; 0){&lt;br /&gt;					vy = -8;&lt;br /&gt;					touchTime ++;&lt;br /&gt;					if(touchTime &amp;gt;20){&lt;br /&gt;						touchTime = 0;&lt;br /&gt;					}&lt;br /&gt;				}&lt;br /&gt;				y += vy;&lt;br /&gt;				vy += g;&lt;br /&gt;				if(y&amp;gt;=y_base){&lt;br /&gt;					y = y_base;&lt;br /&gt;					vy = -8;&lt;br /&gt;					jumpFlag = false;&lt;br /&gt;					jumpFlag2 = false;&lt;br /&gt;					jump2finFlag = false;&lt;br /&gt;				}&lt;br /&gt;			}&lt;br /&gt;			if(vx &amp;lt; 10){&lt;br /&gt;				vx += ax;&lt;br /&gt;			}else{&lt;br /&gt;				vx = 10;&lt;br /&gt;			}&lt;br /&gt;			check_hit_rock();&lt;br /&gt;		}&lt;br /&gt;		&lt;br /&gt;		public void check_hit_rock(){&lt;br /&gt;			float rl;&lt;br /&gt;			float rr;&lt;br /&gt;			float rt;&lt;br /&gt;			float rb;&lt;br /&gt;			float cl;&lt;br /&gt;			float cr;&lt;br /&gt;			float ct;&lt;br /&gt;			float cb;&lt;br /&gt;			for(int i=0;i&amp;lt;2;i++){&lt;br /&gt;				rl = rock.rockXY.get(i).x;&lt;br /&gt;				rr = rl+85;&lt;br /&gt;				rt = rock.rockXY.get(i).y;&lt;br /&gt;				rb = rt+85;&lt;br /&gt;				cl = x;&lt;br /&gt;				cr = x+100;&lt;br /&gt;				ct = y;&lt;br /&gt;				cb = y+80;&lt;br /&gt;				if(cl&amp;lt;rr&amp;amp;&amp;amp;rl&amp;lt;cr&amp;amp;&amp;amp;ct&amp;lt;rb&amp;amp;&amp;amp;rt&amp;lt;cb){&lt;br /&gt;					if(20&amp;gt;cb-rt){&lt;br /&gt;						y = rt-80;&lt;br /&gt;						jumpFlag2 = false;&lt;br /&gt;						jump2finFlag = false;&lt;br /&gt;					}else{&lt;br /&gt;						vx = -1;&lt;br /&gt;					}&lt;br /&gt;				}&lt;br /&gt;				&lt;br /&gt;			}&lt;br /&gt;		}&lt;br /&gt;	}	&lt;br /&gt;}&lt;br /&gt;&lt;/pre&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/744605407212742108-3246281782292863652?l=endoyuta.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://endoyuta.blogspot.com/feeds/3246281782292863652/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://endoyuta.blogspot.com/2011/08/android.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/744605407212742108/posts/default/3246281782292863652'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/744605407212742108/posts/default/3246281782292863652'/><link rel='alternate' type='text/html' href='http://endoyuta.blogspot.com/2011/08/android.html' title='Android 横スクロールゲームをつくってみる'/><author><name>endo yuta</name><uri>http://www.blogger.com/profile/05491646789675985410</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://1.bp.blogspot.com/-7dw9PlYIisc/TtuORirdBtI/AAAAAAAAAYc/kr_xs7ruXrU/s220/slime.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-vWmUZ-knLx8/TlJe6LTh5CI/AAAAAAAAACg/FJ70oFiixqc/s72-c/SC20110822-213502.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-744605407212742108.post-1909599698105508065</id><published>2011-08-21T23:13:00.004+09:00</published><updated>2011-08-21T23:18:20.819+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Game'/><category scheme='http://www.blogger.com/atom/ns#' term='Android'/><title type='text'>Android SDK 横画面に固定する方法</title><content type='html'>AndroidManifest.xmlの&lt;activity&gt;タグのscreenOrientation属性にlandscapeを指定すればOK。&lt;br /&gt;尚、エミュレーターの向きを横に回転させるには、macの場合、fn+control+F11でOK。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/744605407212742108-1909599698105508065?l=endoyuta.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://endoyuta.blogspot.com/feeds/1909599698105508065/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://endoyuta.blogspot.com/2011/08/android-sdk.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/744605407212742108/posts/default/1909599698105508065'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/744605407212742108/posts/default/1909599698105508065'/><link rel='alternate' type='text/html' href='http://endoyuta.blogspot.com/2011/08/android-sdk.html' title='Android SDK 横画面に固定する方法'/><author><name>endo yuta</name><uri>http://www.blogger.com/profile/05491646789675985410</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://1.bp.blogspot.com/-7dw9PlYIisc/TtuORirdBtI/AAAAAAAAAYc/kr_xs7ruXrU/s220/slime.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-744605407212742108.post-1769682764793576607</id><published>2011-08-21T04:17:00.071+09:00</published><updated>2011-08-27T00:50:36.449+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Game'/><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='Android'/><title type='text'>AndroidSDK タッチイベント onTouchEventの研究</title><content type='html'>Androidアプリはタッチイベントによってことが進むので、タッチイベントの正確な把握は必須であり、基本中の基本だ。時間をかけてじっくり研究することは必要なことだ。まだ全体像がAndroidSDKはよく分かっていないので、間違った記載があると思いますので、ご指摘いただければ幸いです。&lt;br /&gt;&lt;br /&gt;&lt;a href="http://goo.gl/1AcZh"&gt;http://goo.gl/1AcZh&lt;/a&gt;&lt;br /&gt;この記事によると、&lt;blockquote&gt;タッチイベントを取得するには、ActivityクラスのonTouchEvent()をオーバーライドします。引数には、MotionEventのインスタンスが渡されます。&lt;/blockquote&gt;とある。&lt;br /&gt;また、&lt;blockquote&gt;MotionEventは、getAction()を呼び出すことで、タッチアクション（DOWN/UP/MOVE/CANCEL）、getEventTime()を呼び出すことで、イベント発生時刻（ms）、getX()、getY()を呼び出すことで、タッチされたx、y座標、を取得することができます。&lt;/blockquote&gt;とある。&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;指一本しか使わない場合&lt;/h3&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-pJKN1UmlbHk/Tk-5PtnId8I/AAAAAAAAABM/lqMxq9H8Ovo/s1600/jump1.png" imageanchor="1" style="clear:left; float:left;margin-right:1em; margin-bottom:1em"&gt;&lt;img border="0" height="320" width="192" src="http://4.bp.blogspot.com/-pJKN1UmlbHk/Tk-5PtnId8I/AAAAAAAAABM/lqMxq9H8Ovo/s320/jump1.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;指一本しか使わない場合はかなり単純に実装できそうだ。例えば、どこでもいいからユーザーがタッチすると、ジャンプするボールをつくることにしよう。長くタッチした場合にジャンプ力を増したりするケースが多いと思うが、今回はそのようなことは考慮しないことにしよう。タッチしたらジャンプするだけだ。&lt;br /&gt;&lt;br /&gt;サンプルコードは下記になります。黒い画面に白いボールが一つ表示され、タッチするとボールが跳ねます。&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;package net.npaka.helloworld;&lt;br /&gt;import android.content.Context;&lt;br /&gt;import android.graphics.Canvas;&lt;br /&gt;import android.graphics.Color;&lt;br /&gt;import android.graphics.Paint;&lt;br /&gt;import android.view.SurfaceHolder;&lt;br /&gt;import android.view.SurfaceView;&lt;br /&gt;import android.view.MotionEvent;&lt;br /&gt;&lt;br /&gt;public class HellowView extends SurfaceView implements&lt;br /&gt;	SurfaceHolder.Callback,Runnable{&lt;br /&gt;	&lt;br /&gt;	private int ww = 480;&lt;br /&gt;	private int wh = 762;&lt;br /&gt;	private Thread thread;&lt;br /&gt;	private SurfaceHolder holder;&lt;br /&gt;	private Paint paint = new Paint();&lt;br /&gt;	private Ball ball = new Ball();&lt;br /&gt;	&lt;br /&gt;	public HellowView(Context context){&lt;br /&gt;		super(context);&lt;br /&gt;		&lt;br /&gt;		holder = getHolder();&lt;br /&gt;		holder.addCallback(this);&lt;br /&gt;		holder.setFixedSize(ww,wh);&lt;br /&gt;		&lt;br /&gt;		paint.setAntiAlias(true);&lt;br /&gt;		paint.setStyle(Paint.Style.FILL);&lt;br /&gt;		paint.setColor(Color.argb(255,255,255,255));&lt;br /&gt;	}&lt;br /&gt;	&lt;br /&gt;	public void surfaceCreated(SurfaceHolder holder){&lt;br /&gt;		thread = new Thread(this);&lt;br /&gt;		thread.start();&lt;br /&gt;	}&lt;br /&gt;	&lt;br /&gt;	public void surfaceChanged(SurfaceHolder holder,&lt;br /&gt;			int format,int w,int h){&lt;br /&gt;	}&lt;br /&gt;	&lt;br /&gt;	public void surfaceDestroyed(SurfaceHolder holder){&lt;br /&gt;		thread = null;&lt;br /&gt;	}&lt;br /&gt;	&lt;br /&gt;	public void run(){&lt;br /&gt;		Canvas canvas;&lt;br /&gt;		while(thread!=null){&lt;br /&gt;			canvas = holder.lockCanvas();&lt;br /&gt;			canvas.drawColor(Color.BLACK);&lt;br /&gt;			ball.view(canvas);&lt;br /&gt;			holder.unlockCanvasAndPost(canvas);&lt;br /&gt;			&lt;br /&gt;			try{&lt;br /&gt;				Thread.sleep(10);&lt;br /&gt;			}catch(Exception e){&lt;br /&gt;			}&lt;br /&gt;		}&lt;br /&gt;	}&lt;br /&gt;&lt;br /&gt;	@Override&lt;br /&gt;	public boolean onTouchEvent(MotionEvent event){&lt;br /&gt;		ball.jumpFlag = true;&lt;br /&gt;		return true;&lt;br /&gt;	}&lt;br /&gt;	&lt;br /&gt;	class Ball{&lt;br /&gt;		int r = 20;&lt;br /&gt;		int x = r*2;&lt;br /&gt;		float y = wh-r;&lt;br /&gt;		float vy = -8;&lt;br /&gt;		float g = 0.2F;&lt;br /&gt;		boolean jumpFlag = false;&lt;br /&gt;		&lt;br /&gt;		public void view(Canvas canvas){&lt;br /&gt;			canvas.drawCircle(x, y, r, paint);&lt;br /&gt;			if(jumpFlag){&lt;br /&gt;				y += vy;&lt;br /&gt;				vy += g;&lt;br /&gt;				if(y&amp;gt;=wh-r){&lt;br /&gt;					y = wh-r;&lt;br /&gt;					vy = -8;&lt;br /&gt;					jumpFlag = false;&lt;br /&gt;				}&lt;br /&gt;			}&lt;br /&gt;		}&lt;br /&gt;	}&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;上記サンプルコードでタッチイベントを取得している部分は下記になります。&lt;br /&gt;&lt;pre class="prettyprint"&gt;@Override&lt;br /&gt;	public boolean onTouchEvent(MotionEvent event){&lt;br /&gt;		ball.jumpFlag = true;&lt;br /&gt;		return true;&lt;br /&gt;	}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;何らかのタッチイベントが発生したら、ball.jumpFlagをtrueにするようにしています。jumpFlagがtrueの場合にballはジャンプをするように設定されています。このような単純なタッチと動作の関連で問題ないようであれば、このような単純なコードで実装が可能です。但し、この場合、タッチした場合でも、ムーブした場合でも、タッチを離した場合でも、あるいは２本目の指でタッチした場合でも、何でもかんでもタッチイベントが発生した場合は全て反応することになります。すなわち、複数の指のタッチを別々に感知して動作を決定する場合や、タッチを離したときに別の動作をする（あるいは動作を中止する）場合などは、当然ながらもう少し複雑なコードを記載する必要があります。&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;タッチしたときのみジャンプし、タッチし続けるとジャンプ力が増す&lt;/h3&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-4OhV5j4Fk7s/Tk_B3U77U2I/AAAAAAAAABU/QUmi-S8yqKE/s1600/ss-320-1-3.jpeg" imageanchor="1" style="clear:left; float:left;margin-right:1em; margin-bottom:1em"&gt;&lt;img border="0" height="214" width="320" src="http://2.bp.blogspot.com/-4OhV5j4Fk7s/Tk_B3U77U2I/AAAAAAAAABU/QUmi-S8yqKE/s320/ss-320-1-3.jpeg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;a href="https://market.android.com/details?id=com.wuzla.game.ScooterHero_Paid&amp;feature=more_from_developer"&gt;Scooter Hero&lt;/a&gt;というゲームがあります。これはまさにタッチしたときのみジャンプし、タッチし続けるとジャンプ力が増します。あとジャンプ中にタッチすると、ジャンプ中の状態からさらに少しジャンプ（浮かぶ）します。このような場合は、上記のような超簡易的実装では難しくなります。タッチしたらジャンプし、タッチ中の時間に応じてジャンプの時間を調整します。タッチ中に別の指でタッチされてもそれは無視します。ジャンプ中に再度タッチした場合はそれを感知します。しかしジャンプ中ジャンプはタッチ中の時間にジャンプの時間が左右されることはないものとします。こういった実装が必要になります。&lt;br /&gt;&lt;br /&gt;&lt;a href="http://developer.android.com/intl/ja/reference/android/view/MotionEvent.html"&gt;AndroidリファレンスのMotionEvent&lt;/a&gt;を見ると、Eventの種類が載っています。onTouchEventの引数に渡されるMotionEventのインスタンスが保持している定数の種類になります。getActionで引っぱってこれる定数は、下記のようです。しかし、getAction()で引っぱってこれるのは、下記定数の数値(int)バージョンのようです。例えば、&lt;a href="http://developer.android.com/intl/ja/reference/android/view/MotionEvent.html#ACTION_DOWN"&gt;ACTION_DOWNは0&lt;/a&gt;です。&lt;br /&gt;&lt;br /&gt;ACTION_CANCEL&lt;br /&gt;ACTION_DOWN&lt;br /&gt;ACTION_HOVER_MOVE&lt;br /&gt;ACTION_MOVE&lt;br /&gt;ACTION_OUTSIDE&lt;br /&gt;ACTION_SCROLL&lt;br /&gt;ACTION_UP&lt;br /&gt;ACTION_POINTER_DOWN&lt;br /&gt;ACTION_POINTER_UP&lt;br /&gt;&lt;br /&gt;よって、最初の指でタッチしたときのみジャンプさせる場合は、下記のようなコードになります。&lt;br /&gt;&lt;pre class="prettyprint"&gt;@Override&lt;br /&gt;	public boolean onTouchEvent(MotionEvent event){&lt;br /&gt;		int action = event.getAction();&lt;br /&gt;		if(action == 0)	ball.jumpFlag = true;&lt;br /&gt;		return true;&lt;br /&gt;	}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;さらに、ジャンプ中に再度タッチした場合のジャンプ中ジャンプを実装すると下記になります。&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;	@Override&lt;br /&gt;	public boolean onTouchEvent(MotionEvent event){&lt;br /&gt;		int action = event.getAction();&lt;br /&gt;		if(action == 0){&lt;br /&gt;			if(ball.jumpFlag == true) ball.jumpFlag2 = true;&lt;br /&gt;			else ball.jumpFlag = true;&lt;br /&gt;		}&lt;br /&gt;		return true;&lt;br /&gt;	}&lt;br /&gt;	&lt;br /&gt;	class Ball{&lt;br /&gt;		int r = 20;&lt;br /&gt;		int x = r*2;&lt;br /&gt;		float y = wh-r;&lt;br /&gt;		float vy = -8;&lt;br /&gt;		float g = 0.2F;&lt;br /&gt;		boolean jumpFlag = false;&lt;br /&gt;		boolean jumpFlag2 = false;&lt;br /&gt;		boolean jump2finFlag = false;&lt;br /&gt;		&lt;br /&gt;		public void view(Canvas canvas){&lt;br /&gt;			canvas.drawCircle(x, y, r, paint);&lt;br /&gt;			if(jumpFlag){&lt;br /&gt;				if(jumpFlag2){&lt;br /&gt;					if(!jump2finFlag){&lt;br /&gt;						vy = -6;&lt;br /&gt;						jump2finFlag = true;&lt;br /&gt;					}&lt;br /&gt;				}&lt;br /&gt;				y += vy;&lt;br /&gt;				vy += g;&lt;br /&gt;				if(y&amp;gt;=wh-r){&lt;br /&gt;					y = wh-r;&lt;br /&gt;					vy = -8;&lt;br /&gt;					jumpFlag = false;&lt;br /&gt;					jumpFlag2 = false;&lt;br /&gt;					jump2finFlag = false;&lt;br /&gt;				}&lt;br /&gt;			}&lt;br /&gt;		}&lt;br /&gt;	}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;onTouchEventを修正して、jumpFlagがtrueの場合は、jumpFlag2をtrueにするようにしています。そして、Ballクラスを修正して、jumpFlag2とjump2finFlagを追加し、jumpFlag2がtrueの場合に一度だけ再度ジャンプするように設定しています。&lt;br /&gt;&lt;br /&gt;さて、次はタッチし続けることでジャンプ力を増すようにします。最初の指がタッチし続ける場合に、そのタッチし続ける時間に応じてジャンプ力が増すようにします。最初の指は、primary pointerということで明確にAndroid SDKが把握してくれるので、結構簡単に実装ができます。考え方としては、ACTION_DOWNが発生してから、ACTION_UPが発生するまでの時間を計測するというものです。ACTION_DOWNもACTION_UPもprimary pointerのdown,upのみで発生するActionになるので、最初の指がタッチしたら必ずACTION_DOWNが発生し、最初の指がタッチをやめたら必ずACTION_UPが発生するはずです。 但し、懸念としては、ACTION_CANCELとACTION_OUTSIDEというのが気になります。これらは後で確認するとして、とりあえず、上記考え方でサンプルコードを修正してみます。&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;	@Override&lt;br /&gt;	public boolean onTouchEvent(MotionEvent event){&lt;br /&gt;		int action = event.getAction();&lt;br /&gt;		if(action == 0){&lt;br /&gt;			if(ball.jumpFlag == true){&lt;br /&gt;				ball.jumpFlag2 = true;&lt;br /&gt;			}else{&lt;br /&gt;				ball.jumpFlag = true;&lt;br /&gt;				ball.touchTime = 1;&lt;br /&gt;			}&lt;br /&gt;		}else if(action == 1){&lt;br /&gt;			ball.touchTime = 0;&lt;br /&gt;		}&lt;br /&gt;		return true;&lt;br /&gt;	}&lt;br /&gt;	&lt;br /&gt;	class Ball{&lt;br /&gt;		int r = 20;&lt;br /&gt;		int x = r*2;&lt;br /&gt;		float y = wh-r;&lt;br /&gt;		float vy = -8;&lt;br /&gt;		float g = 0.2F;&lt;br /&gt;		boolean jumpFlag = false;&lt;br /&gt;		boolean jumpFlag2 = false;&lt;br /&gt;		boolean jump2finFlag = false;&lt;br /&gt;		int touchTime = 0;&lt;br /&gt;		&lt;br /&gt;		public void view(Canvas canvas){&lt;br /&gt;			canvas.drawCircle(x, y, r, paint);&lt;br /&gt;			if(jumpFlag){&lt;br /&gt;				paint.setColor(Color.argb(255,0,255,255));&lt;br /&gt;				if(jumpFlag2){&lt;br /&gt;					paint.setColor(Color.argb(255,255,255,0));&lt;br /&gt;					if(!jump2finFlag){&lt;br /&gt;						vy = -6;&lt;br /&gt;						jump2finFlag = true;&lt;br /&gt;					}&lt;br /&gt;				}else if(touchTime &amp;gt; 0){&lt;br /&gt;					paint.setColor(Color.argb(255,0,255,0));&lt;br /&gt;					vy = -8;&lt;br /&gt;					touchTime ++;&lt;br /&gt;					if(touchTime &amp;gt;30){&lt;br /&gt;						touchTime = 0;&lt;br /&gt;					}&lt;br /&gt;				}&lt;br /&gt;				y += vy;&lt;br /&gt;				vy += g;&lt;br /&gt;				if(y&amp;gt;=wh-r){&lt;br /&gt;					y = wh-r;&lt;br /&gt;					vy = -8;&lt;br /&gt;					jumpFlag = false;&lt;br /&gt;					jumpFlag2 = false;&lt;br /&gt;					jump2finFlag = false;&lt;br /&gt;					paint.setColor(Color.argb(255,255,255,255));&lt;br /&gt;				}&lt;br /&gt;			}&lt;br /&gt;		}&lt;br /&gt;	}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;これで操作を試した限りではうまくいっています。タッチをやめた（指を離した）ときに、なぜかACTION_UPが発生しなかった場合などは、永遠とタッチしている認識になってしまいますが、今回のサンプルコードでは、30フレーム以上タッチし続けた場合は、それ以降は意味をなさないので、特段の問題はありません。このサンプルコードの修正箇所のポイントとしては、タッチし続けている間は、タッチタイムが加算されていき、タッチタイムが1以上30未満の場合は、ずっと加速度-8をキープし続けるようにしています。よってタッチし続けるほど、一定期間はジャンプ力が増すことになります。ボールの色は、ジャンプ中が水色、加速度-8をキープ中が緑、二段ジャンプ中が黄色になるようにしています。&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;複数の指を使う場合&lt;/h3&gt;例えば、２本の指でWEBと同じように拡大縮小をしたりとか、あるいは画面にファミコンのコントローラーのボタンを表示して、タッチしたボタンに応じて上下左右に移動したり、ピストルを撃ったりする場合は、複数の指を使うことになります。これら機能を実装する場合は、各指のタッチしている座標などの取得も必要になります。&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;タッチ座標の取得&lt;/h4&gt;まずはタッチした座標の取得方法を研究します。&lt;br /&gt;getX(),getY()でタッチイベントが発生した座標を取得できるということなので、下記コードを試します。&lt;br /&gt;&lt;pre class="prettyprint"&gt;@Override&lt;br /&gt;	public boolean onTouchEvent(MotionEvent event){&lt;br /&gt;		int action = event.getAction();&lt;br /&gt;		touchX = event.getX();&lt;br /&gt;		touchY = event.getY();&lt;br /&gt;		return true;&lt;br /&gt;	}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;これで座標を取得できますが、あくまでプライマリポインターの座標になるようです。２本目の指をタッチしても２本目の指がタッチした座標は取得できません。１本目の指を離したときも１本目の指が離された座標が取得されるだけであり、１本目を離して２本目を動かして初めて２本目の指の座標が取得されます。&lt;br /&gt;&lt;br /&gt;&lt;a href="http://developer.android.com/intl/ja/reference/android/view/MotionEvent.html#getX(int)"&gt;getX(int pointerIndex)&lt;/a&gt;というのがあります。各指の座標はポインターインデックスを引数にとることでゲットできます。では、ポインターインデックスはどうやってゲットするかというと、下記のようになるようです。&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;//アクションインデックスの取得&lt;br /&gt;int index = (action&amp;MotionEvent.ACTION_POINTER_ID_MASK)&gt;&gt;&lt;br /&gt;	MotionEvent.ACTION_POINTER_ID_SHIFT;&lt;br /&gt;//int index=event.getActionIndex();//API Level 8以降&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;上記コードは、&lt;a href="http://www.amazon.co.jp/Android%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E3%83%90%E3%82%A4%E3%83%96%E3%83%AB%E2%80%95SDK3-0-2-3-2-2-2-1%E5%AF%BE%E5%BF%9C-%E5%B8%83%E7%95%99%E5%B7%9D/dp/4883377571"&gt;『Android プログラミングバイブル』&lt;/a&gt;に載っていました。&lt;br /&gt;&lt;img src="http://ecx.images-amazon.com/images/I/51qXhtnrc8L._SL500_AA300_.jpg" /&gt;&lt;br /&gt;&lt;br /&gt;とはいえ、例えばタッチしている各座標を全て取得するだけでよければ、アクションインデックス（ポインターインデックス）を上記のように取得する必要はありません。ポインターインデックスは下記のようになりますので、ポインターの数を把握してforで全部取得すればいいのであります。&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;pointerIndex =&gt; Raw index of pointer to retrieve. Value may be from 0 (the first pointer that is down) to getPointerCount()-1.&lt;/blockquote&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;@Override&lt;br /&gt;public boolean onTouchEvent(MotionEvent event){&lt;br /&gt;	int cnt = event.getPointerCount();&lt;br /&gt;	point = new PointF[cnt];&lt;br /&gt;	for(int i=0;i&amp;lt;cnt;i++){&lt;br /&gt;		point[i] = new PointF(event.getX(i),event.getY(i));&lt;br /&gt;	}&lt;br /&gt;	return true;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;上記は、getPointerCountでポインターの数を把握し、PointFの配列であるpointをポインターの数で初期化し、ポインターの数だけ、各ポインターインデックスの座標をpointに格納している様です。これで、各ポインターの座標を取得できました。しかし、問題があります。問題は、タッチイベントが発生したポインターの座標を全て取得することです。これはすなわち、ACTION_UPやACTION_POINTER_UPが発生したポインターの座標も取得します。よって、タッチをやめたポインターの座標まで取得してしまうということです。これはゲームを作る場合において、問題になるケースが多いはずです。よって、上記サンプルコードをタッチをやめた場合は、座標を取得しないように修正します。&lt;br /&gt;&lt;br /&gt;ACTION_POINTER_UPの数字は6（間違いでした）です。ACTION_UPの数字は1です。&lt;br /&gt;&lt;br /&gt;※よってこのコードも間違いです。&lt;br /&gt;&lt;pre class="prettyprint"&gt;@Override&lt;br /&gt;public boolean onTouchEvent(MotionEvent event){&lt;br /&gt;	int cnt = event.getPointerCount();&lt;br /&gt;	action = event.getAction();&lt;br /&gt;	int idx = 100;&lt;br /&gt;	point = new ArrayList&amp;lt;PointF&amp;gt;();&lt;br /&gt;	if(action == 1 || action == 6){&lt;br /&gt;		idx = (action&amp;amp;MotionEvent.ACTION_POINTER_ID_MASK)&amp;gt;&amp;gt;&lt;br /&gt;		MotionEvent.ACTION_POINTER_ID_SHIFT;	&lt;br /&gt;	}&lt;br /&gt;	for(int i=0;i&amp;lt;cnt;i++){&lt;br /&gt;		if(i != idx) point.add(new PointF(event.getX(i),event.getY(i)));&lt;br /&gt;	}&lt;br /&gt;	return true;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;これは間違いでした。なぜならgetAction()で取得できる数値は細かいからです。定数のACTION_POINTER_UPというのは、プライマリーではないポインターがアップする様を指すはずですが、actionは何本目のポインターかによって数値が違います。2本目は262、3本目は518といった具合で、全然6ではありませんでした。他の指が残っている状態の中でプライマリーポインターがアップすると、6になりました。よって上記コードですと結局１本目の指のアップしか検知しないことになります。指はせいぜい５本みておけばいいだろうという仮定の基に、検知するaction数を増やすのも手ですが、actionの数値を定数に変換する方法を探した方が良さそうです。&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;@Override&lt;br /&gt;public boolean onTouchEvent(MotionEvent event){&lt;br /&gt;	int action = event.getAction();&lt;br /&gt;	int cnt = event.getPointerCount();&lt;br /&gt;	int idx = 100;&lt;br /&gt;	point = new ArrayList&amp;lt;PointF&amp;gt;();&lt;br /&gt;	switch(action&amp;amp;MotionEvent.ACTION_MASK){&lt;br /&gt;	case MotionEvent.ACTION_UP:&lt;br /&gt;	case MotionEvent.ACTION_POINTER_UP:&lt;br /&gt;		idx = (action&amp;amp;MotionEvent.ACTION_POINTER_ID_MASK)&amp;gt;&amp;gt;&lt;br /&gt;		MotionEvent.ACTION_POINTER_ID_SHIFT;&lt;br /&gt;	}&lt;br /&gt;	for(int i=0;i&amp;lt;cnt;i++){&lt;br /&gt;		if(i != idx) point.add(new PointF(event.getX(i),event.getY(i)));&lt;br /&gt;	}&lt;br /&gt;	return true;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;これで、どの指でもアップの場合は座標取得をしなくなりました。しかし、何故かよく強制終了されます。なんでだろう？？angry birdでタッチ操作は激しくやっても全然強制終了にならないのに。。ちょっと激しくタッチ操作をやると割とすぐに強制終了されてしまう。。。なんででしょうか？&lt;br /&gt;&lt;br /&gt;一旦今作成しているコードを掲載ておこう。&lt;br /&gt;&lt;pre class="prettyprint"&gt;package net.npaka.touchtest;&lt;br /&gt;import java.util.ArrayList;&lt;br /&gt;import android.content.Context;&lt;br /&gt;import android.graphics.Canvas;&lt;br /&gt;import android.graphics.Color;&lt;br /&gt;import android.graphics.Paint;&lt;br /&gt;import android.graphics.PointF;&lt;br /&gt;import android.view.SurfaceHolder;&lt;br /&gt;import android.view.SurfaceView;&lt;br /&gt;import android.view.MotionEvent;&lt;br /&gt;&lt;br /&gt;public class TouchTestView extends SurfaceView implements&lt;br /&gt;		SurfaceHolder.Callback,Runnable{&lt;br /&gt;		&lt;br /&gt;		private int ww = 480;&lt;br /&gt;		private int wh = 762;&lt;br /&gt;		private Thread thread;&lt;br /&gt;		private SurfaceHolder holder;&lt;br /&gt;		private Paint paint = new Paint();&lt;br /&gt;		private ArrayList&amp;lt;PointF&amp;gt; point = new ArrayList&amp;lt;PointF&amp;gt;();&lt;br /&gt;		&lt;br /&gt;		public TouchTestView(Context context){&lt;br /&gt;			super(context);&lt;br /&gt;			&lt;br /&gt;			holder = getHolder();&lt;br /&gt;			holder.addCallback(this);&lt;br /&gt;			holder.setFixedSize(ww,wh);&lt;br /&gt;			&lt;br /&gt;			paint.setAntiAlias(true);&lt;br /&gt;			paint.setStyle(Paint.Style.FILL);&lt;br /&gt;			paint.setColor(Color.argb(255,0,255,255));&lt;br /&gt;			paint.setTextSize(32);&lt;br /&gt;		}&lt;br /&gt;		&lt;br /&gt;		public void surfaceCreated(SurfaceHolder holder){&lt;br /&gt;			thread = new Thread(this);&lt;br /&gt;			thread.start();&lt;br /&gt;		}&lt;br /&gt;		&lt;br /&gt;		public void surfaceChanged(SurfaceHolder holder,&lt;br /&gt;				int format,int w,int h){&lt;br /&gt;		}&lt;br /&gt;		&lt;br /&gt;		public void surfaceDestroyed(SurfaceHolder holder){&lt;br /&gt;			thread = null;&lt;br /&gt;		}&lt;br /&gt;		&lt;br /&gt;		public void run(){&lt;br /&gt;			Canvas canvas;&lt;br /&gt;			while(thread!=null){&lt;br /&gt;				canvas = holder.lockCanvas();&lt;br /&gt;				canvas.drawColor(Color.BLACK);&lt;br /&gt;				if(point.size()&amp;gt;0){&lt;br /&gt;					for(int i=0;i&amp;lt;point.size();i++){&lt;br /&gt;						canvas.drawText(&amp;quot;x:&amp;quot;+point.get(i).x+&amp;quot;y:&amp;quot;+point.get(i).y, 0, 50+30*(i+2), paint);&lt;br /&gt;						canvas.drawText(&amp;quot;&amp;quot;+point.size(), 0, 80, paint);&lt;br /&gt;					}&lt;br /&gt;				}&lt;br /&gt;				canvas.drawText(&amp;quot;test&amp;quot;, 0, 50, paint);&lt;br /&gt;				holder.unlockCanvasAndPost(canvas);&lt;br /&gt;				&lt;br /&gt;				try{&lt;br /&gt;					Thread.sleep(10);&lt;br /&gt;				}catch(Exception e){&lt;br /&gt;				}&lt;br /&gt;			}&lt;br /&gt;		}&lt;br /&gt;&lt;br /&gt;		@Override&lt;br /&gt;		public boolean onTouchEvent(MotionEvent event){&lt;br /&gt;			int action = event.getAction();&lt;br /&gt;			int cnt = event.getPointerCount();&lt;br /&gt;			int idx = 100;&lt;br /&gt;			point = new ArrayList&amp;lt;PointF&amp;gt;();&lt;br /&gt;			switch(action&amp;amp;MotionEvent.ACTION_MASK){&lt;br /&gt;			case MotionEvent.ACTION_UP:&lt;br /&gt;			case MotionEvent.ACTION_POINTER_UP:&lt;br /&gt;				idx = (action&amp;amp;MotionEvent.ACTION_POINTER_ID_MASK)&amp;gt;&amp;gt;&lt;br /&gt;				MotionEvent.ACTION_POINTER_ID_SHIFT;&lt;br /&gt;			}&lt;br /&gt;			for(int i=0;i&amp;lt;cnt;i++){&lt;br /&gt;				if(i != idx) point.add(new PointF(event.getX(i),event.getY(i)));&lt;br /&gt;			}&lt;br /&gt;			return true;&lt;br /&gt;		}&lt;br /&gt;}&lt;br /&gt;&lt;/pre&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/744605407212742108-1769682764793576607?l=endoyuta.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://endoyuta.blogspot.com/feeds/1769682764793576607/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://endoyuta.blogspot.com/2011/08/androidsdk-ontouchevent.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/744605407212742108/posts/default/1769682764793576607'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/744605407212742108/posts/default/1769682764793576607'/><link rel='alternate' type='text/html' href='http://endoyuta.blogspot.com/2011/08/androidsdk-ontouchevent.html' title='AndroidSDK タッチイベント onTouchEventの研究'/><author><name>endo yuta</name><uri>http://www.blogger.com/profile/05491646789675985410</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://1.bp.blogspot.com/-7dw9PlYIisc/TtuORirdBtI/AAAAAAAAAYc/kr_xs7ruXrU/s220/slime.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-pJKN1UmlbHk/Tk-5PtnId8I/AAAAAAAAABM/lqMxq9H8Ovo/s72-c/jump1.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-744605407212742108.post-397484860641002139</id><published>2011-08-04T00:37:00.000+09:00</published><updated>2011-08-04T00:37:08.512+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='HTML5'/><category scheme='http://www.blogger.com/atom/ns#' term='Canvas'/><title type='text'>HTML5 - Canvas アニメーション　Walk</title><content type='html'>&lt;canvas height="270" id="game_walk" width="500"&gt;&lt;/canvas&gt;&lt;br /&gt;&lt;script type="text/javascript"&gt;var canvas_walk = document.getElementById("game_walk");var ctx_walk = canvas_walk.getContext("2d");var cw = canvas_walk.width;var ch = canvas_walk.height;var img_jero = [];img_jero[0] = new Image();img_jero[0].src = 'http://endo-yuta.appspot.com/pic/jeronimo3.png';img_jero[1] = new Image();img_jero[1].src = 'http://endo-yuta.appspot.com/pic/jeronimo2.png';img_jero[2] = new Image();img_jero[2].src = 'http://endo-yuta.appspot.com/pic/jeronimo1.png';var tm;img_jero[2].onload = function() {         tm = setInterval(main,200);}var size_x = 50;var size_y = 80;var x = cw;var y = 0;var idx = 2;function main(){        ctx_walk.clearRect(0,0,cw,ch);        ctx_walk.drawImage(img_jero[idx],x+250,y+175,size_x,size_y);        ctx_walk.drawImage(img_jero[idx],x,y);        idx--;        if(idx==-1){idx=2;}        x=x-30;        if(x&lt;-300){x=cw;}       }&lt;/script&gt;&lt;pre class="prettyprint"&gt;&amp;lt;canvas id="game2" width="500" height="270"&amp;gt;&amp;lt;/canvas&amp;gt;&lt;br /&gt;&amp;lt;script type="text/javascript"&amp;gt;&lt;br /&gt;var canvas = document.getElementById("game2");&lt;br /&gt;var ctx = canvas.getContext("2d");&lt;br /&gt;var cw = canvas.width;&lt;br /&gt;var ch = canvas.height;&lt;br /&gt;&lt;br /&gt;var img_jero = [];&lt;br /&gt;img_jero[0] = new Image();&lt;br /&gt;img_jero[0].src = '/pic/jeronimo3.png';&lt;br /&gt;img_jero[1] = new Image();&lt;br /&gt;img_jero[1].src = '/pic/jeronimo2.png';&lt;br /&gt;img_jero[2] = new Image();&lt;br /&gt;img_jero[2].src = '/pic/jeronimo1.png';&lt;br /&gt;&lt;br /&gt;var tm;&lt;br /&gt;img_jero[2].onload = function() { &lt;br /&gt; tm = setInterval(main,200);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;var size_x = 50;&lt;br /&gt;var size_y = 80;&lt;br /&gt;var x = cw;&lt;br /&gt;var y = 0;&lt;br /&gt;var idx = 2;&lt;br /&gt;&lt;br /&gt;function main(){&lt;br /&gt; ctx.clearRect(0,0,cw,ch);&lt;br /&gt; ctx.drawImage(img_jero[idx],x+250,y+175,size_x,size_y);&lt;br /&gt; ctx.drawImage(img_jero[idx],x,y);&lt;br /&gt; idx--;&lt;br /&gt; if(idx==-1){idx=2;}&lt;br /&gt; x=x-30;&lt;br /&gt; if(x&amp;lt;-300){x=cw;} &lt;br /&gt;}&lt;br /&gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/744605407212742108-397484860641002139?l=endoyuta.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://endoyuta.blogspot.com/feeds/397484860641002139/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://endoyuta.blogspot.com/2011/08/html5-canvas-walk.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/744605407212742108/posts/default/397484860641002139'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/744605407212742108/posts/default/397484860641002139'/><link rel='alternate' type='text/html' href='http://endoyuta.blogspot.com/2011/08/html5-canvas-walk.html' title='HTML5 - Canvas アニメーション　Walk'/><author><name>endo yuta</name><uri>http://www.blogger.com/profile/05491646789675985410</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://1.bp.blogspot.com/-7dw9PlYIisc/TtuORirdBtI/AAAAAAAAAYc/kr_xs7ruXrU/s220/slime.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-744605407212742108.post-7154591349757080470</id><published>2011-07-23T23:04:00.004+09:00</published><updated>2011-07-25T23:26:05.843+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='Game'/><category scheme='http://www.blogger.com/atom/ns#' term='HTML5'/><category scheme='http://www.blogger.com/atom/ns#' term='Canvas'/><title type='text'>HTML5 - Canvas アニメーション - 陣取りゲーム</title><content type='html'>マウスドラッグの向きにプレイヤー（青いボール）が動きます。動いている途中のパスが敵か自分に当たったらプレイヤーが死にます。ボールを動かして陣地を80％以上確保したらステージクリアです。敵を閉じ込めたら敵を倒せてボーナス点数がもらえます。（キーボード入力がきかないです。）&lt;br /&gt;&lt;br /&gt;&lt;a href="http://endo-yuta.appspot.com/practice7"&gt;http://endo-yuta.appspot.com/practice7&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;script src="http://jsdo.it/blogparts/5WOF/js?view=design" type="text/javascript"&gt;&lt;/script&gt;&lt;br /&gt;&lt;div class="ttlBpJsdoit" style="font-size: 11px; margin: 0; text-align: right; width: 465px;"&gt;&lt;a href="http://jsdo.it/ye117/gintori" title="陣取りゲーム"&gt;陣取りゲーム - jsdo.it - share JavaScript, HTML5 and CSS&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;h3&gt;Code&lt;/h3&gt;&lt;pre class="prettyprint"&gt;&amp;lt;canvas id=&amp;quot;game2&amp;quot; width=&amp;quot;270&amp;quot; height=&amp;quot;400&amp;quot;&amp;gt;&amp;lt;/canvas&amp;gt;&lt;br /&gt;&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;var canvas = document.getElementById(&amp;quot;game2&amp;quot;);&lt;br /&gt;var ctx = canvas.getContext(&amp;quot;2d&amp;quot;);&lt;br /&gt;&lt;br /&gt;var w,p,f,pa,tm,e,st,t,l,score,game,area_anime,enemy_del_anime;&lt;br /&gt;var c_w = canvas.width;&lt;br /&gt;var c_h = canvas.height;&lt;br /&gt;var e = [];&lt;br /&gt;&lt;br /&gt;//Life用の画像&lt;br /&gt;var img_heart = new Image();&lt;br /&gt;img_heart.src = '/pic/heart_48.png';&lt;br /&gt;&lt;br /&gt;//初期化メソッド&lt;br /&gt;function init(){&lt;br /&gt; enemy_del_anime = [];&lt;br /&gt; area_anime = [];&lt;br /&gt; game = new Game();&lt;br /&gt; w = new Waku();&lt;br /&gt; t = new Timer();&lt;br /&gt; st = new Stage();&lt;br /&gt; l = new Life();&lt;br /&gt; s = new Status();&lt;br /&gt; s.init();&lt;br /&gt; p = new Player();&lt;br /&gt; pa = new Path();&lt;br /&gt; f = new Fix_path();&lt;br /&gt; f.init();&lt;br /&gt; e = new AllEnemy();&lt;br /&gt; e.init();&lt;br /&gt; score = new Score();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;init();&lt;br /&gt;&lt;br /&gt;tm = setInterval(main,10);&lt;br /&gt;&lt;br /&gt;function main(){&lt;br /&gt; ctx.clearRect(0,0,c_w,c_h); //画面のクリア&lt;br /&gt; w.view_waku(); //外枠の表示&lt;br /&gt; //start画面&lt;br /&gt; if(game.game_start){&lt;br /&gt;  game.game_start_animation();&lt;br /&gt;  return;&lt;br /&gt; }&lt;br /&gt; w.view_waku_fill();&lt;br /&gt; f.view_paths(); //枠パスの表示&lt;br /&gt; s.main();&lt;br /&gt; //ラウンド（ステージ）開始画面&lt;br /&gt; if(game.round_start &amp;amp;&amp;amp; !game.game_over){&lt;br /&gt;  game.round_start_animation();&lt;br /&gt;  return;&lt;br /&gt; }&lt;br /&gt; //プレイヤーがしんだとき&lt;br /&gt; if(game.player_death){&lt;br /&gt;  //敵は動かずに表示だけされる&lt;br /&gt;  e.all_enemys_view();&lt;br /&gt;  //プレイヤーのですあにめ&lt;br /&gt;  p.death_animation();&lt;br /&gt;  if(p.size == 0){&lt;br /&gt;   game.player_death = false;&lt;br /&gt;   //初期化&lt;br /&gt;   st.dead_init();&lt;br /&gt;  }&lt;br /&gt; }else if(game.game_over){&lt;br /&gt;  //敵は動かずに表示だけされる&lt;br /&gt;  e.all_enemys_view();&lt;br /&gt;  //GameOverあにめ&lt;br /&gt;  if(game.game_over_anim_sec&amp;gt;0){&lt;br /&gt;   game.game_over_animation();&lt;br /&gt;  }else if(game.game_score_sec&amp;gt;0){&lt;br /&gt;   //スコア・ランキングページ&lt;br /&gt;   game.game_score_animation();&lt;br /&gt;  }else{&lt;br /&gt;   //初期化&lt;br /&gt;   init(); &lt;br /&gt;  }&lt;br /&gt; }else if(game.game_clear){&lt;br /&gt;  //Clear!あにめ&lt;br /&gt;  if(game.game_clear_finish_sec&amp;gt;0){&lt;br /&gt;   game.clear_animation();&lt;br /&gt;  }else if(game.game_score_sec&amp;gt;0){&lt;br /&gt;   //スコアページ&lt;br /&gt;   game.game_clear_score_animation();&lt;br /&gt;  }else{&lt;br /&gt;   game.init();&lt;br /&gt;   st.next_stage_init();&lt;br /&gt;  }&lt;br /&gt;  //エリアスコアアニメあれば実施&lt;br /&gt;  for(var i=0;i&amp;lt;area_anime.length;i++){&lt;br /&gt;   area_anime[i].main();&lt;br /&gt;  }&lt;br /&gt;  //敵スコアアニメあれば実施&lt;br /&gt;  for(var i=0;i&amp;lt;enemy_del_anime.length;i++){&lt;br /&gt;   enemy_del_anime[i].main();&lt;br /&gt;  }&lt;br /&gt; }else{&lt;br /&gt;  p.main();&lt;br /&gt;  e.main_all();&lt;br /&gt;  t.main();&lt;br /&gt;  //エリアスコアアニメあれば実施&lt;br /&gt;  for(var i=0;i&amp;lt;area_anime.length;i++){&lt;br /&gt;   area_anime[i].main();&lt;br /&gt;  }&lt;br /&gt;  //敵スコアアニメあれば実施&lt;br /&gt;  for(var i=0;i&amp;lt;enemy_del_anime.length;i++){&lt;br /&gt;   enemy_del_anime[i].main();&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;//ゲームクラス&lt;br /&gt;function Game(){&lt;br /&gt; var obj = this;&lt;br /&gt; obj.font = 'verdana';&lt;br /&gt; obj.game_start = true;&lt;br /&gt; obj.round_start =false;&lt;br /&gt; obj.player_death = false;&lt;br /&gt; obj.game_over = false;&lt;br /&gt; obj.game_over_anim_sec = 100;&lt;br /&gt; obj.game_score_sec = 200;&lt;br /&gt; obj.game_clear = false;&lt;br /&gt; obj.game_clear_normal_sec = 100;&lt;br /&gt; obj.score_stage_bounus = 0;&lt;br /&gt; obj.game_clear_finish_sec = 150;&lt;br /&gt; obj.round_sec = 150;&lt;br /&gt; obj.area_make = false;&lt;br /&gt; &lt;br /&gt; //init&lt;br /&gt; obj.init = function(){&lt;br /&gt;  obj.player_death = false;&lt;br /&gt;  obj.game_over_anim_sec = 150;&lt;br /&gt;  obj.game_score_sec = 200;&lt;br /&gt;  obj.game_clear = false;&lt;br /&gt;  obj.game_clear_normal_sec = 150;&lt;br /&gt;  obj.score_stage_bounus = 0;&lt;br /&gt;  obj.game_clear_finish_sec = 150;&lt;br /&gt;  obj.round_sec = 150;&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; //ラウンドスタート&lt;br /&gt; obj.round_start_animation = function(){&lt;br /&gt;  if(obj.round_sec&amp;gt;0){&lt;br /&gt;   //背景表示&lt;br /&gt;   ctx.beginPath();&lt;br /&gt;   ctx.fillStyle = &amp;quot;rgba(0,153,204, 0.3)&amp;quot;;&lt;br /&gt;   ctx.moveTo(w.z[0][0],w.z[0][1]); //左上&lt;br /&gt;   ctx.lineTo(w.z[1][0],w.z[1][1]); //右上&lt;br /&gt;   ctx.lineTo(w.z[2][0],w.z[2][1]); //右下&lt;br /&gt;   ctx.lineTo(w.z[3][0],w.z[3][1]); //左下&lt;br /&gt;   ctx.closePath();&lt;br /&gt;   ctx.fill();&lt;br /&gt;   //文字表示&lt;br /&gt;   ctx.beginPath();&lt;br /&gt;   ctx.fillStyle = &amp;quot;#000000&amp;quot;;&lt;br /&gt;   ctx.font = &amp;quot;30px &amp;quot;+obj.font;&lt;br /&gt;   ctx.fillText('Round '+st.big_num+'-'+st.small_num,60, 200);&lt;br /&gt;   ctx.font = &amp;quot;16px &amp;quot;+obj.font;&lt;br /&gt;   ctx.fillText('Get 80% Area.',60, 250);&lt;br /&gt;   ctx.fill();&lt;br /&gt;   obj.round_sec--;&lt;br /&gt;  }else{&lt;br /&gt;   obj.round_start =false;&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; var c_r_a_no = 0;&lt;br /&gt; var blank_time = 5;&lt;br /&gt; var vec = 1;&lt;br /&gt; //スタートあにめ用色あにめ（色返すメソッド）&lt;br /&gt; obj.color_red_animation = function(){&lt;br /&gt;  var color_arr = ['#ff0000','#ff1111','#ff2222','#ff3333','#ff4444','#ff5555','#ff6666','#ff7777','#ff8888','#ff9999'];&lt;br /&gt;  if(blank_time&amp;lt;0){&lt;br /&gt;   if(vec == 1){&lt;br /&gt;    if(c_r_a_no == color_arr.length-1){&lt;br /&gt;     vec = -1;&lt;br /&gt;     c_r_a_no--;&lt;br /&gt;    }else c_r_a_no++;&lt;br /&gt;   }else{&lt;br /&gt;    if(c_r_a_no == 0){&lt;br /&gt;     vec = 1;&lt;br /&gt;     c_r_a_no++;&lt;br /&gt;    }else c_r_a_no--;&lt;br /&gt;   }&lt;br /&gt;   blank_time=5;&lt;br /&gt;  }&lt;br /&gt;  blank_time--;&lt;br /&gt;  return color_arr[c_r_a_no];&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; //スタートあにめ&lt;br /&gt; obj.game_start_animation = function(){&lt;br /&gt;  //クリックされたらアクション（スタート）&lt;br /&gt;  if(m.d_x&amp;gt;=95&amp;amp;&amp;amp;m.d_x&amp;lt;=160&amp;amp;&amp;amp;m.d_y&amp;gt;=230&amp;amp;&amp;amp;m.d_y&amp;lt;=258){&lt;br /&gt;   obj.game_start = false;&lt;br /&gt;   obj.round_start = true;&lt;br /&gt;   obj.init();&lt;br /&gt;  }&lt;br /&gt;  //クリックされたらアクション（ランク）&lt;br /&gt;  &lt;br /&gt;  //クリックされたらアクション（ハウツー）&lt;br /&gt;  &lt;br /&gt;  //マウスがのったら色あにめ&lt;br /&gt;  //$('#hoge').text(m.m[0]+','+m.m[1]);&lt;br /&gt;  if(m.m[0]&amp;gt;=95&amp;amp;&amp;amp;m.m[0]&amp;lt;=160&amp;amp;&amp;amp;m.m[1]&amp;gt;=230&amp;amp;&amp;amp;m.m[1]&amp;lt;=258){&lt;br /&gt;   var color_start = obj.color_red_animation(c_r_a_no);&lt;br /&gt;  }else{&lt;br /&gt;   var color_start = '#ffffff'; &lt;br /&gt;  }&lt;br /&gt;  if(m.m[0]&amp;gt;=95&amp;amp;&amp;amp;m.m[0]&amp;lt;=160&amp;amp;&amp;amp;m.m[1]&amp;gt;=270&amp;amp;&amp;amp;m.m[1]&amp;lt;=298){&lt;br /&gt;   var color_rank = obj.color_red_animation(c_r_a_no);&lt;br /&gt;  }else{&lt;br /&gt;   var color_rank = '#ffffff'; &lt;br /&gt;  }&lt;br /&gt;  if(m.m[0]&amp;gt;=73&amp;amp;&amp;amp;m.m[0]&amp;lt;=185&amp;amp;&amp;amp;m.m[1]&amp;gt;=310&amp;amp;&amp;amp;m.m[1]&amp;lt;=338){&lt;br /&gt;   var color_how = obj.color_red_animation(c_r_a_no);&lt;br /&gt;  }else{&lt;br /&gt;   var color_how = '#ffffff'; &lt;br /&gt;  }&lt;br /&gt;  //背景表示&lt;br /&gt;  ctx.beginPath();&lt;br /&gt;  ctx.fillStyle = &amp;quot;#0099cc&amp;quot;;&lt;br /&gt;  ctx.moveTo(w.z[0][0],w.z[0][1]); //左上&lt;br /&gt;  ctx.lineTo(w.z[1][0],w.z[1][1]); //右上&lt;br /&gt;  ctx.lineTo(w.z[2][0],w.z[2][1]); //右下&lt;br /&gt;  ctx.lineTo(w.z[3][0],w.z[3][1]); //左下&lt;br /&gt;  ctx.closePath();&lt;br /&gt;  ctx.fill();&lt;br /&gt;  //文字表示&lt;br /&gt;  ctx.beginPath();&lt;br /&gt;  ctx.fillStyle = &amp;quot;#ffffff&amp;quot;;&lt;br /&gt;  ctx.font = &amp;quot;40px &amp;quot;+obj.font;&lt;br /&gt;  ctx.fillText('GinTori',60, 200);&lt;br /&gt;  ctx.font = &amp;quot;20px &amp;quot;+obj.font;&lt;br /&gt;  ctx.fillStyle = color_start;&lt;br /&gt;  ctx.fillText('Start',100, 250);&lt;br /&gt;  ctx.fillStyle = color_rank;&lt;br /&gt;  ctx.fillText('Rank',100, 290);&lt;br /&gt;  ctx.font = &amp;quot;16px &amp;quot;+obj.font;&lt;br /&gt;  ctx.fillStyle = color_how;&lt;br /&gt;  ctx.fillText('How to Play?',75, 330);&lt;br /&gt;  ctx.fill();&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; //Game Overあにめ&lt;br /&gt; obj.game_over_animation = function(){&lt;br /&gt;  ctx.beginPath();&lt;br /&gt;  ctx.fillStyle = &amp;quot;#000000&amp;quot;;&lt;br /&gt;  ctx.font = &amp;quot;16px &amp;quot;+obj.font;&lt;br /&gt;  ctx.fillText('Game Over...', 90, 240);&lt;br /&gt;  ctx.fill();&lt;br /&gt;  obj.game_over_anim_sec--;&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; //スコアランキングページ（GameOver時用）&lt;br /&gt; obj.game_score_animation = function(){&lt;br /&gt;  //黒いページ&lt;br /&gt;  obj.black_page_view();&lt;br /&gt;  //スコア表示&lt;br /&gt;  ctx.beginPath();&lt;br /&gt;  ctx.fillStyle = &amp;quot;#ffffff&amp;quot;;&lt;br /&gt;  ctx.font = &amp;quot;16px &amp;quot;+obj.font;&lt;br /&gt;  ctx.fillText('Score: '+s.score, 90, 240);&lt;br /&gt;  ctx.fill();&lt;br /&gt;  obj.game_score_sec--; &lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; //クリア時のアニメーション&lt;br /&gt; obj.clear_animation = function(){&lt;br /&gt;  ctx.beginPath();&lt;br /&gt;  ctx.fillStyle = &amp;quot;#000000&amp;quot;;&lt;br /&gt;  ctx.font = &amp;quot;16px &amp;quot;+obj.font;&lt;br /&gt;  ctx.fillText('Clear!!!', 90, 240);&lt;br /&gt;  ctx.fill();&lt;br /&gt;  obj.game_clear_finish_sec --;&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; //スコアページ（クリア時用）&lt;br /&gt; obj.game_clear_score_animation  =function(){&lt;br /&gt;  //黒いページ表示&lt;br /&gt;  obj.black_page_view();&lt;br /&gt;  if(obj.game_clear_normal_sec&amp;gt;0){&lt;br /&gt;   //ステージボーナス（難しい程稼いだ点に応じてボーナスがもらえる）&lt;br /&gt;   var stage_sc = score.stage_score_bounus();&lt;br /&gt;   obj.clear_base_method(stage_sc);&lt;br /&gt;   obj.game_clear_normal_sec--;&lt;br /&gt;  //タイムボーナスあにめ&lt;br /&gt;  }else if(t.min&amp;gt;0||t.sec&amp;gt;0){&lt;br /&gt;   if(t.sec == 0){&lt;br /&gt;    t.min--;&lt;br /&gt;    t.sec = 59;&lt;br /&gt;   }else{&lt;br /&gt;    t.sec--;&lt;br /&gt;   }&lt;br /&gt;   s.score += 100;&lt;br /&gt;   score.this_stage_score += 100;&lt;br /&gt;   //ステージボーナス（難しい程稼いだ点に応じてボーナスがもらえる）&lt;br /&gt;   var stage_sc = score.stage_score_bounus();&lt;br /&gt;   obj.score_stage_bounus = stage_sc;&lt;br /&gt;   obj.clear_base_method(stage_sc);&lt;br /&gt;  //ステージボーナスあにめ&lt;br /&gt;  }else{&lt;br /&gt;   if(obj.score_stage_bounus&amp;gt;0){&lt;br /&gt;    s.score += 100;&lt;br /&gt;    obj.score_stage_bounus -=100;&lt;br /&gt;   }else{&lt;br /&gt;    obj.game_score_sec --;&lt;br /&gt;   }&lt;br /&gt;   obj.clear_base_method(obj.score_stage_bounus);&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt;  &lt;br /&gt; //クリア時スコアページ用の標準動作&lt;br /&gt; obj.clear_base_method = function(stage_sc){&lt;br /&gt;  //secの表示調整&lt;br /&gt;  var sec_t = s.sec_text();&lt;br /&gt;  //現在のスコア表示&lt;br /&gt;  ctx.beginPath();&lt;br /&gt;  ctx.fillStyle = &amp;quot;#ffffff&amp;quot;;&lt;br /&gt;  ctx.font = &amp;quot;16px &amp;quot;+obj.font;&lt;br /&gt;  ctx.fillText('Score: '+s.score, 50, 240);&lt;br /&gt;  ctx.fillText('Time Bounus: '+t.min+':'+sec_t, 50, 270);&lt;br /&gt;  ctx.fillText('Stage Bounus: '+stage_sc, 50, 300);&lt;br /&gt;  ctx.fill();&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; //黒いページ表示するメソッド&lt;br /&gt; obj.black_page_view = function(){&lt;br /&gt;  ctx.beginPath();&lt;br /&gt;  ctx.fillStyle = &amp;quot;black&amp;quot;;&lt;br /&gt;  ctx.moveTo(w.z[0][0],w.z[0][1]); //左上&lt;br /&gt;  ctx.lineTo(w.z[1][0],w.z[1][1]); //右上&lt;br /&gt;  ctx.lineTo(w.z[2][0],w.z[2][1]); //右下&lt;br /&gt;  ctx.lineTo(w.z[3][0],w.z[3][1]); //左下&lt;br /&gt;  ctx.closePath();&lt;br /&gt;  ctx.fill();&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;//ステータスクラス&lt;br /&gt;function Status(){&lt;br /&gt; var obj = this;&lt;br /&gt; var x = 0;&lt;br /&gt; var y = 0;&lt;br /&gt; var h = 40;&lt;br /&gt; var w = c_w;&lt;br /&gt; obj.score = 0;&lt;br /&gt; obj.sum = 0;&lt;br /&gt; &lt;br /&gt; obj.init = function(){&lt;br /&gt;  &lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; obj.main = function(){&lt;br /&gt;  obj.waku_view();&lt;br /&gt;  obj.status_view();&lt;br /&gt;  //面積クリアした場合&lt;br /&gt;  if(obj.check_area()){&lt;br /&gt;   st.clear();&lt;br /&gt;  }&lt;br /&gt;  &lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; //ステータスバーを表示&lt;br /&gt; obj.waku_view = function(){&lt;br /&gt;  ctx.beginPath();&lt;br /&gt;  ctx.fillStyle = &amp;quot;#ffffff&amp;quot;;&lt;br /&gt;  ctx.moveTo(x,y); //左上&lt;br /&gt;  ctx.lineTo(c_w,y); //右上&lt;br /&gt;  ctx.lineTo(c_w,h); //右下&lt;br /&gt;  ctx.lineTo(x,h); //左下&lt;br /&gt;  ctx.closePath();&lt;br /&gt;  ctx.fill();&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; //scoreを10桁のテキストにするメソッド&lt;br /&gt; obj.score_text = function(){&lt;br /&gt;  var st = '' + obj.score;&lt;br /&gt;  var zero_count = 10-st.length;&lt;br /&gt;  var zero = '';&lt;br /&gt;  for(var i=0;i&amp;lt;zero_count;i++){zero += '0';}&lt;br /&gt;  return zero + st;&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; //secを2桁のテキストにするメソッド&lt;br /&gt; obj.sec_text = function(){&lt;br /&gt;  var sec = ''+t.sec;&lt;br /&gt;  var zero_count = 2 - sec.length;&lt;br /&gt;  var zero = '';&lt;br /&gt;  for(var i=0; i&amp;lt;zero_count;i++){zero += 0;}&lt;br /&gt;  return zero + sec;&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; //ステータスの中身表示&lt;br /&gt; obj.status_view = function(){&lt;br /&gt;  var s = obj.score_text();&lt;br /&gt;  var sec = obj.sec_text();&lt;br /&gt;  ctx.beginPath();&lt;br /&gt;  ctx.fillStyle = &amp;quot;#000000&amp;quot;;&lt;br /&gt;  ctx.font = &amp;quot;12px &amp;quot;+game.font;&lt;br /&gt;  ctx.fillText('Score: '+s, 140, 10);&lt;br /&gt;  ctx.fillText('Area: '+obj.sum+'%', 140, 30);&lt;br /&gt;  ctx.fillText(st.big_num+'-'+st.small_num, 10, 10);&lt;br /&gt;  ctx.fillText('Time: '+t.min+':'+sec, 10, 30);&lt;br /&gt;  ctx.drawImage(img_heart,50,-3,16,16);&lt;br /&gt;  ctx.fillText('x '+l.count, 68, 10);&lt;br /&gt;  ctx.fill();&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; //取得した面積の割合を出すメソッド&lt;br /&gt; obj.get_sum = function(){&lt;br /&gt;  obj.sum = Math.floor((f.start_sum-f.now_sum)/f.start_sum*100);&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; //Areaチェク&lt;br /&gt; obj.check_area = function(){&lt;br /&gt;  if(obj.sum &amp;gt;= st.area) return true;&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;//Stageクラス&lt;br /&gt;function Stage(){&lt;br /&gt; var obj = this;&lt;br /&gt; obj.big_num =1;&lt;br /&gt; obj.small_num = 1;&lt;br /&gt; obj.enemy_cnt = 1;&lt;br /&gt; obj.enemy_v = 0.5;&lt;br /&gt; obj.area = 80; //何％でクリアか？&lt;br /&gt; &lt;br /&gt; //clear時に実施するメソッド&lt;br /&gt; obj.clear = function(){&lt;br /&gt;  game.game_clear = true;&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; //next stage用初期化&lt;br /&gt; obj.next_stage_init = function(){&lt;br /&gt;  obj.small_num ++;&lt;br /&gt;  if(obj.small_num == 6){&lt;br /&gt;   obj.small_num = 1;&lt;br /&gt;   obj.big_num ++;&lt;br /&gt;   obj.enemy_v += 0.1;&lt;br /&gt;  }&lt;br /&gt;  obj.enemy_cnt = obj.small_num;&lt;br /&gt;  e.init(); //敵の初期化&lt;br /&gt;  t.init(); //timerの初期化&lt;br /&gt;  f.init(); //pathの初期化&lt;br /&gt;  s.sum = 0; //エリアの初期化&lt;br /&gt;  p = new Player(); //プレイヤーの初期化&lt;br /&gt;  pa = new Path(); //パスの初期化&lt;br /&gt;  score.this_stage_score = 0; //ステージスコアの初期化&lt;br /&gt;  game.round_start = true;&lt;br /&gt;  game.init();&lt;br /&gt;  area_anime = [];&lt;br /&gt;  enemy_del_anime = [];&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; //dead時の実施メソッド&lt;br /&gt; obj.dead = function(){&lt;br /&gt;  game.player_death = true;&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; //dead時の初期化メソッド&lt;br /&gt; obj.dead_init = function(){&lt;br /&gt;  l.count --;&lt;br /&gt;  if(l.count == -1){&lt;br /&gt;   //Game Over&lt;br /&gt;   game.game_over = true;&lt;br /&gt;   l.count = 0;&lt;br /&gt;  }&lt;br /&gt;  e.init(); //敵の初期化&lt;br /&gt;  t.init(); //timerの初期化&lt;br /&gt;  f.init(); //pathの初期化&lt;br /&gt;  s.sum = 0; //エリアの初期化&lt;br /&gt;  p = new Player(); //プレイヤーの初期化&lt;br /&gt;  pa = new Path(); //パスの初期化&lt;br /&gt;  game.round_start = true;&lt;br /&gt;  game.init();&lt;br /&gt;  area_anime = [];&lt;br /&gt;  enemy_del_anime = [];&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;//Scoreクラス&lt;br /&gt;function Score(){&lt;br /&gt; var obj = this;&lt;br /&gt; obj.this_stage_score = 0;&lt;br /&gt; &lt;br /&gt; //path（エリア）作ったときのスコア算出(sumは割合%)&lt;br /&gt; obj.area_score = function(sum){&lt;br /&gt;   return sum*100*1.2^(sum/10);&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; //timer残数に応じたスコア算出&lt;br /&gt; obj.timer_score = function(sec){&lt;br /&gt;  return 100*sec;&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; //敵をたおしたときのスコア算出&lt;br /&gt; obj.enemy_score = function(death_enemy_cnt,alive_enemy_cnt){&lt;br /&gt;  var score = 0;&lt;br /&gt;  score += 4000*Math.pow(death_enemy_cnt,2);&lt;br /&gt;  if(alive_enemy_cnt == 0&amp;amp;&amp;amp;death_enemy_cnt&amp;gt;0) score += 20000;&lt;br /&gt;  return score;&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; //ステージボーナスの算出&lt;br /&gt; obj.stage_score_bounus = function(){&lt;br /&gt;  //ステージの算出&lt;br /&gt;  var k = st.big_num + 0.1*st.small_num;&lt;br /&gt;  return 10000*k;&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;//Lifeクラス&lt;br /&gt;function Life(){&lt;br /&gt; var obj = this;&lt;br /&gt; obj.count = 3;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;//Timerクラス&lt;br /&gt;function Timer(){&lt;br /&gt; var obj = this;&lt;br /&gt; obj.min = 2;&lt;br /&gt; obj.sec = 0;&lt;br /&gt; obj.msec = 0;&lt;br /&gt; &lt;br /&gt; obj.init = function(){&lt;br /&gt;  obj.min = 2;&lt;br /&gt;  obj.sec = 0;&lt;br /&gt;  obj.msec = 0;&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; //タイマーのメインメソッド&lt;br /&gt; obj.main = function(){&lt;br /&gt;  //時間切れの場合&lt;br /&gt;  if(obj.min==0 &amp;amp;&amp;amp; obj.sec==0){&lt;br /&gt;   st.dead();&lt;br /&gt;   return;&lt;br /&gt;  }&lt;br /&gt;  obj.msec += 10;&lt;br /&gt;  if(obj.msec==1000){&lt;br /&gt;   obj.msec = 0;&lt;br /&gt;   obj.sec--;&lt;br /&gt;   if(obj.sec==-1){&lt;br /&gt;    obj.min--;&lt;br /&gt;    obj.sec = 59;&lt;br /&gt;   }&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;//外枠クラス&lt;br /&gt;function Waku(){&lt;br /&gt; var obj = this;&lt;br /&gt; obj.w = c_w-10; //プレイヤーの大きさにあわせましょう&lt;br /&gt; obj.h = c_h-50; //-50はステータスの高さ+プレイヤの大きさにあわせましょう&lt;br /&gt; obj.x = (c_w-obj.w)/2;&lt;br /&gt; obj.y = (c_h-obj.h)-5; //-5はプレイヤーの大きさ÷２にあわせましょう&lt;br /&gt; obj.z = [[obj.x,obj.y],[obj.x+obj.w,obj.y],[obj.x+obj.w,obj.y+obj.h],[obj.x,obj.y+obj.h]]; //枠の座標４点の配列&lt;br /&gt;  &lt;br /&gt; //Waku表示メソッド(fill)&lt;br /&gt; obj.view_waku_fill = function(){&lt;br /&gt;  ctx.beginPath();&lt;br /&gt;  ctx.fillStyle = &amp;quot;white&amp;quot;;&lt;br /&gt;  ctx.moveTo(obj.z[0][0],obj.z[0][1]); //左上&lt;br /&gt;  ctx.lineTo(obj.z[1][0],obj.z[1][1]); //右上&lt;br /&gt;  ctx.lineTo(obj.z[2][0],obj.z[2][1]); //右下&lt;br /&gt;  ctx.lineTo(obj.z[3][0],obj.z[3][1]); //左下&lt;br /&gt;  ctx.closePath();&lt;br /&gt;  ctx.fill();&lt;br /&gt; }&lt;br /&gt; //Waku表示メソッド(storke)&lt;br /&gt; obj.view_waku = function(){&lt;br /&gt;  ctx.beginPath();&lt;br /&gt;  ctx.strokeStyle = &amp;quot;white&amp;quot;;&lt;br /&gt;  ctx.moveTo(obj.z[0][0],obj.z[0][1]); //左上&lt;br /&gt;  ctx.lineTo(obj.z[1][0],obj.z[1][1]); //右上&lt;br /&gt;  ctx.lineTo(obj.z[2][0],obj.z[2][1]); //右下&lt;br /&gt;  ctx.lineTo(obj.z[3][0],obj.z[3][1]); //左下&lt;br /&gt;  ctx.closePath();&lt;br /&gt;  ctx.stroke();&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;//確定パス保存クラス&lt;br /&gt;function Fix_path(){&lt;br /&gt; var obj = this;&lt;br /&gt; obj.path_count = 0;&lt;br /&gt; obj.before_sum = 0;&lt;br /&gt; obj.now_sum = 0;&lt;br /&gt; obj.start_sum = 0;&lt;br /&gt; obj.paths =[];&lt;br /&gt; &lt;br /&gt; //pathsを表示するメソッド&lt;br /&gt; obj.view_paths = function(){&lt;br /&gt;  ctx.strokeStyle = '#4682B4';&lt;br /&gt;  ctx.beginPath();&lt;br /&gt;  ctx.moveTo(obj.paths[0][0],obj.paths[0][1]);&lt;br /&gt;  for(var i=1; i&amp;lt;obj.paths.length; i++){&lt;br /&gt;   ctx.lineTo(obj.paths[i][0],obj.paths[i][1]);&lt;br /&gt;  }&lt;br /&gt;  ctx.closePath();&lt;br /&gt;  //ctx.fill();&lt;br /&gt;  ctx.stroke();&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; //pathを登録するメソッド&lt;br /&gt; obj.put_path = function(path,sum){&lt;br /&gt;  obj.paths = path;&lt;br /&gt;  obj.path_count ++;&lt;br /&gt;  obj.before_sum = obj.now_sum;&lt;br /&gt;  obj.now_sum = sum;&lt;br /&gt;  s.get_sum();&lt;br /&gt;  //スコア加算（エリア）&lt;br /&gt;  obj.add_score_area();&lt;br /&gt;  //エリア消したときのアニメーション&lt;br /&gt;  area_anime.push(new Area_animation(score.area_score((obj.before_sum -obj.now_sum)/obj.start_sum*100),[p.x,p.y]));&lt;br /&gt;  //敵を倒しているかチェック&lt;br /&gt;  e.check_hit_path_all_enemys();&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; /*&lt;br /&gt;  * 初期化メソッド&lt;br /&gt;  * 枠をpathsに登録する&lt;br /&gt;  * 枠の面積をstart_sumに登録する&lt;br /&gt;  */&lt;br /&gt; obj.init = function(){&lt;br /&gt;  obj.paths = [w.z[0],w.z[1],w.z[2],w.z[3]];&lt;br /&gt;  obj.start_sum = pa.area(obj.paths);&lt;br /&gt;  obj.now_sum = obj.start_sum;&lt;br /&gt;  obj.before_sum = 0;&lt;br /&gt;  obj.path_count = 0;&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; //点と点が作る辺にボールが存在するか否かを返すメソッド（汎用）&lt;br /&gt; //存在したらtrueを返す&lt;br /&gt; obj.is_ball_line =function(a,b,ball){&lt;br /&gt;  x1 = a[0];&lt;br /&gt;  y1 = a[1];&lt;br /&gt;  x2 = b[0];&lt;br /&gt;  y2 = b[1];&lt;br /&gt;  if(x1 == x2){&lt;br /&gt;   if(y1&amp;lt;y2){&lt;br /&gt;    if(y1&amp;lt;=ball[1] &amp;amp;&amp;amp; y2&amp;gt;=ball[1] &amp;amp;&amp;amp; x1 == ball[0]) return true;&lt;br /&gt;   }else{&lt;br /&gt;    if(y1&amp;gt;=ball[1] &amp;amp;&amp;amp; y2&amp;lt;=ball[1] &amp;amp;&amp;amp; x1 == ball[0]) return true;&lt;br /&gt;   }&lt;br /&gt;  }else if(y1 == y2){&lt;br /&gt;   if(x1&amp;lt;x2){&lt;br /&gt;    if(x1&amp;lt;=ball[0] &amp;amp;&amp;amp; x2&amp;gt;=ball[0] &amp;amp;&amp;amp; y1 == ball[1]) return true;&lt;br /&gt;   }else{&lt;br /&gt;    if(x1&amp;gt;=ball[0] &amp;amp;&amp;amp; x2&amp;lt;=ball[0] &amp;amp;&amp;amp; y1 == ball[1]) return true;&lt;br /&gt;   }&lt;br /&gt;  }else{&lt;br /&gt;   alert('ずれてます');&lt;br /&gt;  }&lt;br /&gt;  return false;&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; //点が多角形の中に存在するかをチェックするメソッド&lt;br /&gt; obj.check_in_path = function(dot){&lt;br /&gt;  var k,counter = 0;&lt;br /&gt;  //敵用dotの小数点を切り上げる&lt;br /&gt;  dot[0] = Math.ceil(dot[0]);&lt;br /&gt;  dot[1] = Math.ceil(dot[1]);&lt;br /&gt;  while(dot[1] &amp;lt; w.z[2][1]+1){&lt;br /&gt;   for(var i=0; i&amp;lt;obj.paths.length; i++){&lt;br /&gt;    k = i+1;&lt;br /&gt;    if(i == obj.paths.length-1) k = 0;&lt;br /&gt;    if(obj.is_ball_line(obj.paths[i],obj.paths[k],dot)) counter++;&lt;br /&gt;   }&lt;br /&gt;   dot[1]++;&lt;br /&gt;  }&lt;br /&gt;  //counterが奇数であれば中、counterが偶数あるいは0であれば外&lt;br /&gt;  if(counter % 2 != 0) return true;&lt;br /&gt;  else return false;&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; //エリア分のスコア追加&lt;br /&gt; obj.add_score_area = function(){&lt;br /&gt;  var sc = score.area_score((obj.before_sum -obj.now_sum)/obj.start_sum*100);&lt;br /&gt;  s.score += sc;&lt;br /&gt;  score.this_stage_score += sc;&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;//エリア消したときのアニメーションクラス&lt;br /&gt;function Area_animation(num,xy){&lt;br /&gt; var obj = this;&lt;br /&gt; obj.x = xy[0];&lt;br /&gt; obj.y = xy[1];&lt;br /&gt; obj.num = num;&lt;br /&gt; obj.view_sec = 100;&lt;br /&gt; &lt;br /&gt; //場所によって位置調整&lt;br /&gt; if(obj.x&amp;lt;w.w/2) obj.x += 25;&lt;br /&gt; if(obj.x&amp;gt;w.w/2) obj.x -= 40;&lt;br /&gt; if(obj.y&amp;lt;w.h/2) obj.y += 30;&lt;br /&gt; if(obj.y&amp;gt;w.h/2) obj.y -= 30;&lt;br /&gt; &lt;br /&gt; obj.main = function(){&lt;br /&gt;  if(obj.view_sec&amp;gt;0){  &lt;br /&gt;   //文字表示&lt;br /&gt;   ctx.beginPath();&lt;br /&gt;   ctx.fillStyle = &amp;quot;rgba(0,102,190,&amp;quot;+obj.view_sec/100+&amp;quot;)&amp;quot;;&lt;br /&gt;   ctx.font = &amp;quot;14px &amp;quot;+game.font;&lt;br /&gt;   ctx.fillText(obj.num,obj.x, obj.y);&lt;br /&gt;   ctx.fill();&lt;br /&gt;   obj.view_sec--;&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;//敵を消したときのアニメーションクラス&lt;br /&gt;function Enemy_animation(score,hit_count,xy){&lt;br /&gt; var obj = this;&lt;br /&gt; obj.x = xy[0];&lt;br /&gt; obj.y = xy[1];&lt;br /&gt; obj.num = score;&lt;br /&gt; obj.hc = hit_count;&lt;br /&gt; obj.view_sec = 100;&lt;br /&gt; &lt;br /&gt; //場所によって位置調整&lt;br /&gt; if(obj.x&amp;lt;w.w/2){obj.x += 10; obj.x2 = obj.x+10;}&lt;br /&gt; if(obj.x&amp;gt;w.w/2){obj.x -= 10; obj.x2 = obj.x-10;}&lt;br /&gt; if(obj.y&amp;lt;w.h/2){obj.y += 10; obj.y2 = obj.y+10;}&lt;br /&gt; if(obj.y&amp;gt;w.h/2){obj.y -= 10; obj.y2 = obj.y-10;}&lt;br /&gt; &lt;br /&gt; obj.main = function(){&lt;br /&gt;  if(obj.view_sec&amp;gt;0){  &lt;br /&gt;   //文字表示&lt;br /&gt;   ctx.beginPath();&lt;br /&gt;   ctx.fillStyle = &amp;quot;rgba(255,0,0,&amp;quot;+obj.view_sec/100+&amp;quot;)&amp;quot;;&lt;br /&gt;   ctx.font = &amp;quot;14px &amp;quot;+game.font;&lt;br /&gt;   ctx.fillText(obj.num,obj.x, obj.y);&lt;br /&gt;   ctx.fillText('x'+obj.hc,obj.x2, obj.y2);&lt;br /&gt;   ctx.fill();&lt;br /&gt;   obj.view_sec--;&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;//敵グループクラス&lt;br /&gt;function AllEnemy(){&lt;br /&gt; var obj = this;&lt;br /&gt; obj.v = 0; //enemyの速度&lt;br /&gt; obj.cnt = 0; // enemyの数&lt;br /&gt; obj.enemy = [];&lt;br /&gt; obj.enemy_cnt = 0;&lt;br /&gt; obj.dead_enemys = [];&lt;br /&gt; &lt;br /&gt; //初期化メソッド&lt;br /&gt; obj.init = function(){&lt;br /&gt;  obj.v = st.enemy_v;&lt;br /&gt;  obj.cnt = st.enemy_cnt;&lt;br /&gt;  obj.enemy = [];&lt;br /&gt;  obj.make_enemys();&lt;br /&gt;  obj.enemy_cnt = obj.enemy.length;&lt;br /&gt;  obj.dead_enemys = [];&lt;br /&gt; } &lt;br /&gt; &lt;br /&gt; //敵の配列作成メソッド&lt;br /&gt; obj.make_enemys = function(){&lt;br /&gt;  for(var i=0;i&amp;lt;obj.cnt;i++){&lt;br /&gt;   obj.enemy[i] = new Enemy();&lt;br /&gt;   obj.enemy[i].init(obj.v);&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; //全ての敵のメインメソッド実施&lt;br /&gt; obj.main_all = function(){&lt;br /&gt;  for(var i=0;i&amp;lt;obj.enemy.length;i++){&lt;br /&gt;   obj.enemy[i].main();&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; //全ての敵のcheck_hit_action_pathメソッド実施&lt;br /&gt; obj.check_hit_action_path = function(){&lt;br /&gt;  for(var i=0;i&amp;lt;obj.enemy.length;i++){&lt;br /&gt;   if(obj.enemy[i].check_hit_action_path()) return true;&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; //全ての敵がパス内にいるか調べる。いない場合はですあにめ&lt;br /&gt; obj.check_hit_path_all_enemys = function(){&lt;br /&gt;  var hit_enemys = [];&lt;br /&gt;  for(i=0;i&amp;lt;obj.enemy.length;i++){&lt;br /&gt;   if(!f.check_in_path([obj.enemy[i].x,obj.enemy[i].y])){&lt;br /&gt;    var flag = false;&lt;br /&gt;    for(var j=0;j&amp;lt;obj.dead_enemys.length;j++){&lt;br /&gt;     if(i==obj.dead_enemys[j]){flag = true;} &lt;br /&gt;    }&lt;br /&gt;    if(!flag){&lt;br /&gt;     hit_enemys.push([i]);&lt;br /&gt;     //ですあにめ&lt;br /&gt;     obj.enemy[i].death_animation();&lt;br /&gt;    }&lt;br /&gt;   }&lt;br /&gt;  }&lt;br /&gt;  obj.enemy_cnt -= hit_enemys.length;&lt;br /&gt;  //スコア加算（敵倒し用）&lt;br /&gt;  var sc = score.enemy_score(hit_enemys.length,obj.enemy_cnt);&lt;br /&gt;  s.score += sc;&lt;br /&gt;  score.this_stage_score += sc; //ステージスコアも加算&lt;br /&gt;  &lt;br /&gt;  //敵スコアアニメ&lt;br /&gt;  if(hit_enemys.length&amp;gt;0){&lt;br /&gt;   var idx = hit_enemys[0];&lt;br /&gt;   enemy_del_anime.push(new Enemy_animation(sc,hit_enemys.length,[obj.enemy[idx].x,obj.enemy[idx].y]));   &lt;br /&gt;  }&lt;br /&gt;  [].push.apply(obj.dead_enemys, hit_enemys);&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; //全ての敵を表示するだけのメソッド&lt;br /&gt; obj.all_enemys_view = function(){&lt;br /&gt;  for(var i=0;i&amp;lt;obj.enemy.length;i++){&lt;br /&gt;   obj.enemy[i].view();&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;//敵単体クラス&lt;br /&gt;function Enemy(){&lt;br /&gt; var obj = this;&lt;br /&gt; obj.size = 7;&lt;br /&gt; obj.x = 0;&lt;br /&gt; obj.y = 0;&lt;br /&gt; obj.vec = [];&lt;br /&gt; obj.death_flag = false;&lt;br /&gt; &lt;br /&gt; //初期化メソッド&lt;br /&gt; obj.init = function(total_v){&lt;br /&gt;  obj.x = Math.floor(Math.random()*(w.w-obj.size))+w.x;&lt;br /&gt;  obj.y = Math.floor(Math.random()*(w.h-obj.size))+w.y; &lt;br /&gt;  obj.vec = obj.make_vec(total_v);&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; //mainメソッド&lt;br /&gt; obj.main = function(){&lt;br /&gt;  if(obj.death_flag){&lt;br /&gt;   obj.death_animation();&lt;br /&gt;   return;&lt;br /&gt;  }&lt;br /&gt;  obj.view();&lt;br /&gt;  //1進む&lt;br /&gt;  obj.x += obj.vec[0];&lt;br /&gt;  obj.y += obj.vec[1];&lt;br /&gt;  //衝突チェック&lt;br /&gt;  obj.check_hit_path();&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; //enemyを表示するメソッド&lt;br /&gt; obj.view = function(){&lt;br /&gt;  ctx.beginPath();&lt;br /&gt;  ctx.fillStyle = &amp;quot;red&amp;quot;;&lt;br /&gt;  ctx.moveTo(obj.x,obj.y); //左上&lt;br /&gt;  ctx.lineTo(obj.x+obj.size,obj.y); //右上&lt;br /&gt;  ctx.lineTo(obj.x+obj.size,obj.y+obj.size); //右下&lt;br /&gt;  ctx.lineTo(obj.x,obj.y+obj.size); //左下&lt;br /&gt;  ctx.closePath();&lt;br /&gt;  ctx.fill();&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; //パスとの衝突判定メソッド&lt;br /&gt; obj.check_hit_path = function(){&lt;br /&gt;  var a1x,a1y,a2x,a2y,j,tmp=0;&lt;br /&gt;  var x = obj.x;&lt;br /&gt;  var y = obj.y;&lt;br /&gt;  var s = obj.size;&lt;br /&gt;  for(var i=0; i&amp;lt;f.paths.length; i++){&lt;br /&gt;   a1x = f.paths[i][0];&lt;br /&gt;   a1y = f.paths[i][1];&lt;br /&gt;   if(i==f.paths.length-1) j=0;&lt;br /&gt;   else j= i+1;&lt;br /&gt;   a2x = f.paths[j][0];&lt;br /&gt;   a2y = f.paths[j][1];&lt;br /&gt;   if(a1x==a2x&amp;amp;&amp;amp;a2y&amp;lt;a1y){tmp=a1y; a1y=a2y; a2y=tmp;}&lt;br /&gt;   if(a1y==a2y&amp;amp;&amp;amp;a2x&amp;lt;a1x){tmp=a1x; a1x=a2x; a2x=tmp;}&lt;br /&gt;   if(x&amp;lt;=a2x &amp;amp;&amp;amp; a1x&amp;lt;=x+s &amp;amp;&amp;amp; y&amp;lt;=a2y &amp;amp;&amp;amp; a1y&amp;lt;=y+s){&lt;br /&gt;    //衝突したのがxに垂直なのか、yに垂直なのか?&lt;br /&gt;    if(a1y==a2y){&lt;br /&gt;     //上からなのか、下からなのか？&lt;br /&gt;     if(obj.vec[1]&amp;lt;0) obj.y = a1y; //位置の調整&lt;br /&gt;     else obj.y = a1y-s; //位置の調整&lt;br /&gt;     obj.vec[1] = -obj.vec[1]; //向きを変える&lt;br /&gt;    }else if(a1x==a2x){&lt;br /&gt;     //右からか、左からか？&lt;br /&gt;     if(obj.vec[0]&amp;lt;0) obj.x = a1x;&lt;br /&gt;     else obj.x = a1x-s;&lt;br /&gt;     obj.vec[0] = -obj.vec[0];&lt;br /&gt;    }&lt;br /&gt;   } &lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; //向きと速さを決めるメソッド&lt;br /&gt; obj.make_vec = function(total_v){&lt;br /&gt;  var x = Math.random()*total_v;&lt;br /&gt;  if(Math.random()&amp;lt;0.5) x = -x;&lt;br /&gt;  var y = total_v-x;&lt;br /&gt;  if(Math.random()&amp;lt;0.5) y = -y;&lt;br /&gt;  return [x,y];&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; //アクション中のパスとの衝突判定メソッド&lt;br /&gt; obj.check_hit_action_path = function(){&lt;br /&gt;  var a1x,a1y,a2x,a2y,tmp=0;&lt;br /&gt;  var x = obj.x;&lt;br /&gt;  var y = obj.y;&lt;br /&gt;  var s = obj.size;&lt;br /&gt;  for(var i=0; i&amp;lt;pa.path.length; i++){   &lt;br /&gt;   a1x = pa.path[i][0];&lt;br /&gt;   a1y = pa.path[i][1];&lt;br /&gt;   if(i==pa.path.length-1){&lt;br /&gt;    a2x = p.x;&lt;br /&gt;    a2y = p.y;&lt;br /&gt;   }else{&lt;br /&gt;    a2x = pa.path[i+1][0];&lt;br /&gt;    a2y = pa.path[i+1][1];&lt;br /&gt;   }&lt;br /&gt;   if(a1x==a2x&amp;amp;&amp;amp;a2y&amp;lt;a1y){tmp=a1y; a1y=a2y; a2y=tmp;}&lt;br /&gt;   if(a1y==a2y&amp;amp;&amp;amp;a2x&amp;lt;a1x){tmp=a1x; a1x=a2x; a2x=tmp;}&lt;br /&gt;   if(x&amp;lt;=a2x &amp;amp;&amp;amp; a1x&amp;lt;=x+s &amp;amp;&amp;amp; y&amp;lt;=a2y &amp;amp;&amp;amp; a1y&amp;lt;=y+s){&lt;br /&gt;    return true;&lt;br /&gt;   }&lt;br /&gt;  }  &lt;br /&gt;  return false;&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; //ですあにめ　メソッド&lt;br /&gt; obj.death_animation =function(){&lt;br /&gt;  var color = 'gray'; &lt;br /&gt;  if(!obj.death_flag) obj.death_flag = 1;&lt;br /&gt;  if(obj.death_flag &amp;lt; 25)obj.size = obj.size *1.1;&lt;br /&gt;  if(obj.death_flag == 25){&lt;br /&gt;   obj.size = 3;&lt;br /&gt;  }&lt;br /&gt;  ctx.beginPath();&lt;br /&gt;  ctx.fillStyle = color;&lt;br /&gt;  ctx.moveTo(obj.x,obj.y); //左上&lt;br /&gt;  ctx.lineTo(obj.x+obj.size,obj.y); //右上&lt;br /&gt;  ctx.lineTo(obj.x+obj.size,obj.y+obj.size); //右下&lt;br /&gt;  ctx.lineTo(obj.x,obj.y+obj.size); //左下&lt;br /&gt;  ctx.closePath();&lt;br /&gt;  ctx.fill();&lt;br /&gt;  if(obj.death_flag == 25){&lt;br /&gt;   obj.size = 0; &lt;br /&gt;  }&lt;br /&gt;  obj.death_flag ++;&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function Player(){&lt;br /&gt; var obj = this;&lt;br /&gt; obj.size = 10;&lt;br /&gt; obj.x = w.z[3][0]; //円中心のx座標&lt;br /&gt; obj.y = w.z[3][1]; //円中心のy座標&lt;br /&gt; obj.mouseX = false;&lt;br /&gt; obj.mouseY = false;&lt;br /&gt; obj.action_mode = false; //action中（クリック座標に向かっている状態）（フラグ）&lt;br /&gt; var becs = [[0,-1],[1,0],[0,1],[-1,0]] //上右下左&lt;br /&gt; obj.bec = becs[0];&lt;br /&gt; obj.key_down = false;&lt;br /&gt; &lt;br /&gt; //main(最初に起動するメソッド)&lt;br /&gt; obj.main = function(){&lt;br /&gt;  obj.view_ball();&lt;br /&gt;  &lt;br /&gt;  //actionモード時&lt;br /&gt;  if(obj.action_mode){&lt;br /&gt;   obj.action();&lt;br /&gt;   return;&lt;br /&gt;  }&lt;br /&gt;  &lt;br /&gt;  //mouseイベント発生時&lt;br /&gt;  if((obj.mouseX &amp;amp;&amp;amp; obj.mouseY)|| obj.key_down) {&lt;br /&gt;   if(obj.mouse_bec()){&lt;br /&gt;    pa.path.push([obj.x,obj.y]); //パスの追加&lt;br /&gt;    obj.action_mode = true;&lt;br /&gt;   }&lt;br /&gt;   obj.key_down = false;&lt;br /&gt;   obj.go();&lt;br /&gt;   return;&lt;br /&gt;  }&lt;br /&gt;  &lt;br /&gt;  //ノーマルアクションを実行&lt;br /&gt;  obj.normal_action();&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; //actionモード&lt;br /&gt; obj.action = function(){&lt;br /&gt;  //パスの軌跡を表示&lt;br /&gt;  obj.view_path_stroke();&lt;br /&gt;  //アクションパスに衝突している場合&lt;br /&gt;  if(obj.check_hit_pass()){&lt;br /&gt;   st.dead();&lt;br /&gt;   return;&lt;br /&gt;  }&lt;br /&gt;  &lt;br /&gt;  //アクションパスに敵が衝突している場合&lt;br /&gt;  if(e.check_hit_action_path()){&lt;br /&gt;   st.dead();&lt;br /&gt;   return;&lt;br /&gt;  }&lt;br /&gt;  &lt;br /&gt;  //枠パスに到着した場合&lt;br /&gt;  if(obj.check_on_paths()){&lt;br /&gt;   obj.action_mode = false;&lt;br /&gt;   obj.go();&lt;br /&gt;   pa.path.push([obj.x,obj.y]); //パスの追加&lt;br /&gt;   obj.fix_path();&lt;br /&gt;   pa.path = []; //パスのクリア&lt;br /&gt;   return;&lt;br /&gt;  }&lt;br /&gt;  //マウスイベント時&lt;br /&gt;  if((obj.mouseX &amp;amp;&amp;amp; obj.mouseY) || obj.key_down){&lt;br /&gt;   if(obj.mouse_bec()) pa.path.push([obj.x,obj.y]); //パスの追加&lt;br /&gt;   obj.key_down = false;&lt;br /&gt;  }&lt;br /&gt;  obj.go();&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; /*&lt;br /&gt;  * パスのFIX&lt;br /&gt;  * 登録されたパスから枠パスの頂点を追加することでエリアが完成されるが、&lt;br /&gt;  * 作成しうるエリアは２通りある。どちらが大きいかを確認し、大きい方の&lt;br /&gt;  * エリアを作成するパスをFIXとし、枠パスを更新する&lt;br /&gt;  */&lt;br /&gt; obj.fix_path = function(){&lt;br /&gt;  var temp_path = [];&lt;br /&gt;  var x = obj.x;&lt;br /&gt;  var y = obj.y;&lt;br /&gt;  var v = obj.bec;&lt;br /&gt;  var counter_temp = 0;&lt;br /&gt;  temp_path = make_area(x,y,v,'r'); //右に進んでエリアをつくる&lt;br /&gt;  pa.sum = pa.area(pa.path.concat(temp_path)); //右に行った場合の面積を求める&lt;br /&gt;  //面積が大きいか確認&lt;br /&gt;  if(pa.sum &amp;gt; f.now_sum/2){&lt;br /&gt;   f.put_path(pa.path.concat(temp_path),pa.sum); //パスをFIX&lt;br /&gt;  }else{&lt;br /&gt;   temp_path = make_area(x,y,v,'l'); //小さい場合は、左に進んでエリアをつくる&lt;br /&gt;   pa.sum = pa.area(pa.path.concat(temp_path)); //左に行った場合の面積を求める&lt;br /&gt;   f.put_path(pa.path.concat(temp_path),pa.sum); //パスをFIX&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; //エリアを作成するメソッド(x,y,向き,右か左か)&lt;br /&gt; //追加パスを返す&lt;br /&gt; var make_area = function(x,y,v,rl){&lt;br /&gt;  var temp_path = [];&lt;br /&gt;  if(rl == 'r') obj.bec_next_r();&lt;br /&gt;  else obj.bec_next_l();&lt;br /&gt;  while(!array_compare([obj.x,obj.y],pa.path[0])){&lt;br /&gt;   //1進んだ場合枠からはみ出さないか確認&lt;br /&gt;   if(!obj.check_on_paths()){&lt;br /&gt;    temp_path.push([obj.x,obj.y]); //temp_pathに登録&lt;br /&gt;    obj.right_or_left();&lt;br /&gt;   }&lt;br /&gt;   obj.go();&lt;br /&gt;  }&lt;br /&gt;  obj.x = x; obj.y = y; obj.bec = v; //位置・向きを元に戻す&lt;br /&gt;  return temp_path;&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; //mouseX,mouseYをbecに変換&lt;br /&gt; //有効なドラッグであれば向きを変更しtrueを返す。無効ならfalseを返す。&lt;br /&gt; obj.mouse_bec = function(){  &lt;br /&gt;  if(obj.mouseX&amp;gt;0 &amp;amp;&amp;amp; obj.bec[0] == 0 &amp;amp;&amp;amp; f.check_in_path([obj.x+1,obj.y])){&lt;br /&gt;   obj.bec = [1,0];&lt;br /&gt;  }else if(obj.mouseX&amp;lt;0 &amp;amp;&amp;amp; obj.bec[0] == 0 &amp;amp;&amp;amp; f.check_in_path([obj.x-1,obj.y])){&lt;br /&gt;   obj.bec = [-1,0];&lt;br /&gt;  }else if(obj.mouseY&amp;gt;0 &amp;amp;&amp;amp; obj.bec[1] == 0 &amp;amp;&amp;amp; f.check_in_path([obj.x,obj.y+1])){&lt;br /&gt;   obj.bec = [0,1];&lt;br /&gt;  }else if(obj.mouseY&amp;lt;0 &amp;amp;&amp;amp; obj.bec[1] == 0 &amp;amp;&amp;amp; f.check_in_path([obj.x,obj.y-1])){&lt;br /&gt;   obj.bec = [0,-1];&lt;br /&gt;  }else{&lt;br /&gt;   obj.del_mouse();&lt;br /&gt;   return false;&lt;br /&gt;  }&lt;br /&gt;  obj.del_mouse();&lt;br /&gt;  return true;&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; //normal action&lt;br /&gt; obj.normal_action = function(){&lt;br /&gt;  //1進んだときにパスから出ないか調べる&lt;br /&gt;  if(!obj.check_on_paths()) obj.right_or_left();&lt;br /&gt;  obj.go();&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; //1進んだ場合にパスからはみ出さないか調べるメソッド&lt;br /&gt; //登録されているすべてのパス(f.paths)を調べる&lt;br /&gt; obj.check_on_paths = function(){&lt;br /&gt;  var x1 = obj.x + obj.bec[0];&lt;br /&gt;  var y1 = obj.y + obj.bec[1];&lt;br /&gt;  var k;&lt;br /&gt;  for(var i=0;i&amp;lt;f.paths.length;i++){&lt;br /&gt;   if(i==f.paths.length-1) k=0;&lt;br /&gt;   else k = i+1;&lt;br /&gt;   if(f.is_ball_line(f.paths[i],f.paths[k],[x1,y1])) return true;&lt;br /&gt;  }&lt;br /&gt;  return false;&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; //右に向きを変えてpathがなければ左に向きを変えるメソッド&lt;br /&gt; obj.right_or_left = function(){&lt;br /&gt;  //右に向きを変える&lt;br /&gt;  obj.bec_next_r();&lt;br /&gt;  //1進んだ場合に衝突中のパスからはみ出すか確認&lt;br /&gt;  if(!obj.check_on_paths()){&lt;br /&gt;   //右ではみ出すなら、左にする&lt;br /&gt;   obj.bec_next_l();&lt;br /&gt;   obj.bec_next_l();&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt; //mouseX,mouseYの消去メソッド&lt;br /&gt; obj.del_mouse = function(){&lt;br /&gt;  obj.mouseX = false;&lt;br /&gt;  obj.mouseY = false;&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; //ボールを表示するメソッド&lt;br /&gt; obj.view_ball = function(){&lt;br /&gt;  ctx.beginPath()&lt;br /&gt;  ctx.fillStyle = '#191970';&lt;br /&gt;  ctx.arc(obj.x, obj.y, obj.size/2, 0, 360,false);&lt;br /&gt;  ctx.fill();&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; //obj.becの次を決めるメソッド（右回り）&lt;br /&gt; obj.bec_next_r = function(){&lt;br /&gt;  for(var i=0; i&amp;lt;becs.length; i++){&lt;br /&gt;   if(array_compare(becs[i],obj.bec)){&lt;br /&gt;    if(i==becs.length-1) obj.bec = becs[0];&lt;br /&gt;    else obj.bec = becs[i+1];&lt;br /&gt;    break;&lt;br /&gt;   }&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; //obj.becの次を決めるメソッド（左回り）&lt;br /&gt; obj.bec_next_l = function(){&lt;br /&gt;  for(var i=0; i&amp;lt;becs.length; i++){&lt;br /&gt;   if(array_compare(becs[i],obj.bec)){&lt;br /&gt;    if(i==0) obj.bec = becs[becs.length-1];&lt;br /&gt;    else obj.bec = becs[i-1];&lt;br /&gt;    break;&lt;br /&gt;   }&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; //ボールを向きに１進めるメソッド&lt;br /&gt; obj.go = function(){&lt;br /&gt;  obj.x += obj.bec[0];&lt;br /&gt;  obj.y += obj.bec[1];&lt;br /&gt; } &lt;br /&gt;  &lt;br /&gt; //アクション中にボールがパスの軌跡に衝突していないか確認するメソッド&lt;br /&gt; obj.check_hit_pass = function(){&lt;br /&gt;  for(var i=0; i&amp;lt;pa.path.length-1; i++){&lt;br /&gt;   if(f.is_ball_line(pa.path[i],pa.path[i+1],[obj.x,obj.y])) return true;&lt;br /&gt;  }&lt;br /&gt;  return false;&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; //パスを軌跡を表示するメソッド&lt;br /&gt; obj.view_path_stroke = function(){&lt;br /&gt;  ctx.beginPath();&lt;br /&gt;  ctx.moveTo(pa.path[0][0],pa.path[0][1]);&lt;br /&gt;  for(var i=0; i &amp;lt; pa.path.length; i++){&lt;br /&gt;   ctx.lineTo(pa.path[i][0],pa.path[i][1]); &lt;br /&gt;  }&lt;br /&gt;  ctx.lineTo(obj.x,obj.y);&lt;br /&gt;  ctx.strokeStyle = 'red';&lt;br /&gt;  ctx.stroke();&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; //プレイヤーのですあにめ&lt;br /&gt; obj.death_animation = function(){&lt;br /&gt;  var color = 'gray'; &lt;br /&gt;  if(!obj.death_flag) obj.death_flag = 1;&lt;br /&gt;  if(obj.death_flag &amp;lt; 25)obj.size = obj.size *1.1;&lt;br /&gt;  if(obj.death_flag == 25){&lt;br /&gt;   obj.size = 3;&lt;br /&gt;  }&lt;br /&gt;  ctx.beginPath();&lt;br /&gt;  ctx.fillStyle = color;&lt;br /&gt;  ctx.moveTo(obj.x,obj.y); //左上&lt;br /&gt;  ctx.lineTo(obj.x+obj.size,obj.y); //右上&lt;br /&gt;  ctx.lineTo(obj.x+obj.size,obj.y+obj.size); //右下&lt;br /&gt;  ctx.lineTo(obj.x,obj.y+obj.size); //左下&lt;br /&gt;  ctx.closePath();&lt;br /&gt;  ctx.fill();&lt;br /&gt;  if(obj.death_flag == 25){&lt;br /&gt;   obj.size = 0; &lt;br /&gt;  }&lt;br /&gt;  obj.death_flag ++;&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;/*&lt;br /&gt;アクション中に曲がった点の集まり&lt;br /&gt;１アクションが終了したら完成させる&lt;br /&gt;*/&lt;br /&gt;function Path(){&lt;br /&gt; var obj = this;&lt;br /&gt; obj.path = [];&lt;br /&gt; obj.sum; //パスが作成する図形の面積&lt;br /&gt; &lt;br /&gt; //面積を求めるメソッド&lt;br /&gt; obj.area = function(paths){&lt;br /&gt;  var num = 0;&lt;br /&gt;  //座標法で求める&lt;br /&gt;  for(var i=0; i &amp;lt; paths.length; i++){&lt;br /&gt;   if(i+1 == paths.length){&lt;br /&gt;    num = num + paths[i][0]*paths[0][1]-paths[0][0]*paths[i][1];&lt;br /&gt;   }else{&lt;br /&gt;    num = num + paths[i][0]*paths[i+1][1]-paths[i+1][0]*paths[i][1];&lt;br /&gt;   }&lt;br /&gt;  }&lt;br /&gt;  return 0.5*Math.abs(num);&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;var m = new Mouse();&lt;br /&gt;&lt;br /&gt;//マウスイベント感知関連&lt;br /&gt;function Mouse(){&lt;br /&gt; var obj = this;&lt;br /&gt; obj.d_x = false;&lt;br /&gt; obj.d_y = false;&lt;br /&gt; obj.u_x = false;&lt;br /&gt; obj.u_y = false;&lt;br /&gt; obj.m = [];&lt;br /&gt; obj.vector = function(){&lt;br /&gt;  //d_x,d_yがfalseじゃないか確認&lt;br /&gt;  if(obj.d_x &amp;amp;&amp;amp; obj.d_y){&lt;br /&gt;   p.mouseX = obj.u_x - obj.d_x;&lt;br /&gt;   p.mouseY = obj.u_y - obj.d_y; &lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt; obj.d_init = function(){&lt;br /&gt;  obj.d_x = false;&lt;br /&gt;  obj.d_y = false;&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;//イベントリスナーの登録&lt;br /&gt;canvas.addEventListener(&amp;quot;mousedown&amp;quot;, mouseDownHandler, false);&lt;br /&gt;canvas.addEventListener(&amp;quot;mouseup&amp;quot;, mouseUpHandler, false);&lt;br /&gt;canvas.addEventListener(&amp;quot;mouseover&amp;quot;, mouseOverHandler, false);&lt;br /&gt;canvas.addEventListener(&amp;quot;mousemove&amp;quot;, mouseMoveHandler, false);&lt;br /&gt;&lt;br /&gt;function mouseDownHandler(e) {&lt;br /&gt; var rect = e.target.getBoundingClientRect();&lt;br /&gt; m.d_x =  Math.floor(e.clientX - rect.left);&lt;br /&gt; m.d_y =  Math.floor(e.clientY - rect.top);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function mouseUpHandler(e) {&lt;br /&gt; var rect = e.target.getBoundingClientRect();&lt;br /&gt; m.u_x =  Math.floor(e.clientX - rect.left);&lt;br /&gt; m.u_y =  Math.floor(e.clientY - rect.top);&lt;br /&gt; m.vector();&lt;br /&gt; m.d_init();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function mouseOverHandler(e) {&lt;br /&gt; var rect = e.target.getBoundingClientRect();&lt;br /&gt; //m.o[0] =  Math.floor(e.clientX - rect.left);&lt;br /&gt; //m.o[1] =  Math.floor(e.clientY - rect.top);&lt;br /&gt; //alert(2343);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function mouseMoveHandler(e) {&lt;br /&gt; var rect = e.target.getBoundingClientRect();&lt;br /&gt; m.m[0] =  Math.floor(e.clientX - rect.left);&lt;br /&gt; m.m[1] =  Math.floor(e.clientY - rect.top);&lt;br /&gt; //alert(2343);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;//キーコード&lt;br /&gt;var KEY_LEFT = 37;&lt;br /&gt;var KEY_RIGHT = 39;&lt;br /&gt;var KEY_UP = 38;&lt;br /&gt;var KEY_DOWN = 40;&lt;br /&gt;var KEY_SPACE = 32;&lt;br /&gt;var KEY_ENTER = 13;&lt;br /&gt;var KEY_ESC = 27;&lt;br /&gt;var KEY_A = 65;&lt;br /&gt;&lt;br /&gt;//キー入力検出&lt;br /&gt;$(window).keydown(function(e){&lt;br /&gt; //スペースか上を押したら...&lt;br /&gt; if(e.keyCode == KEY_UP){&lt;br /&gt;  p.key_down = true;&lt;br /&gt;  p.mouseX = 0;&lt;br /&gt;  p.mouseY = -1; &lt;br /&gt;  m.d_init();&lt;br /&gt;  return false;&lt;br /&gt; //左を押したら...&lt;br /&gt; }else if(e.keyCode == KEY_LEFT){&lt;br /&gt;  p.key_down = true;&lt;br /&gt;  p.mouseX = -1;&lt;br /&gt;  p.mouseY = 0; &lt;br /&gt;  m.d_init();&lt;br /&gt;  return false;&lt;br /&gt; //右を押したら...&lt;br /&gt; }else if(e.keyCode == KEY_RIGHT){&lt;br /&gt;  p.key_down = true;&lt;br /&gt;  p.mouseX = 1;&lt;br /&gt;  p.mouseY = 0; &lt;br /&gt;  m.d_init();&lt;br /&gt;  return false;&lt;br /&gt; //下を押したら...&lt;br /&gt; }else if(e.keyCode == KEY_DOWN){&lt;br /&gt;  p.key_down = true;&lt;br /&gt;  p.mouseX = 0;&lt;br /&gt;  p.mouseY = 1; &lt;br /&gt;  m.d_init();&lt;br /&gt;  return false;&lt;br /&gt; //Aを押したら...&lt;br /&gt; }else if(e.keyCode == KEY_A){&lt;br /&gt;  return false;&lt;br /&gt; }&lt;br /&gt;});&lt;br /&gt;&lt;br /&gt;//配列を比較する関数&lt;br /&gt;function array_compare(a1,a2){&lt;br /&gt; if(a1.length != a2.length) return false;&lt;br /&gt; else{&lt;br /&gt;  for(var i=0; i&amp;lt;a1.length; i++){&lt;br /&gt;   if(a1[i] != a2[i]) return false; &lt;br /&gt;  }&lt;br /&gt;  return true;&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/744605407212742108-7154591349757080470?l=endoyuta.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://endoyuta.blogspot.com/feeds/7154591349757080470/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://endoyuta.blogspot.com/2011/07/html5-canvas.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/744605407212742108/posts/default/7154591349757080470'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/744605407212742108/posts/default/7154591349757080470'/><link rel='alternate' type='text/html' href='http://endoyuta.blogspot.com/2011/07/html5-canvas.html' title='HTML5 - Canvas アニメーション - 陣取りゲーム'/><author><name>endo yuta</name><uri>http://www.blogger.com/profile/05491646789675985410</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://1.bp.blogspot.com/-7dw9PlYIisc/TtuORirdBtI/AAAAAAAAAYc/kr_xs7ruXrU/s220/slime.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-744605407212742108.post-1656539595816425938</id><published>2011-07-03T16:19:00.004+09:00</published><updated>2011-07-10T14:27:12.148+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><title type='text'>JavaScript 配列の比較（要素ごとにやらないといけないらしい）</title><content type='html'>Pythonだと余裕で出来た気がするんだけど、javascritpだと配列の比較は、要素ごとにやらないといけないんすかね。&lt;br /&gt;何かいい方法あったら教えてください。&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;&amp;lt;script type="text/javascript"&amp;gt;&lt;br /&gt;var a = [0,1];&lt;br /&gt;var b = [0,1];&lt;br /&gt;&lt;br /&gt;//これだと違うよになる。&lt;br /&gt;if(a == b)  alert('同じだよ');&lt;br /&gt;else alert('違うよ');&lt;br /&gt;&lt;br /&gt;//これなら同じだよになる。&lt;br /&gt;if(a[0] == b[0] &amp;amp;&amp;amp; a[1] == b[1])  alert('同じだよ');&lt;br /&gt;else alert('違うよ');&lt;br /&gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;配列の比較関数をつくるとしたらこんな感じでしょうか？&lt;br /&gt;&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;&amp;lt;script type="text/javascript"&amp;gt;&lt;br /&gt;var a = [0,1];&lt;br /&gt;var b = [0,1];&lt;br /&gt;var c = [0,1,2];&lt;br /&gt;&lt;br /&gt;var array_compare = function(a1,a2){&lt;br /&gt;  if(a1.length != a2.length) return false;&lt;br /&gt;  else{&lt;br /&gt;   for(var i=0; i&amp;lt;a1.length; i++){&lt;br /&gt;    if(a1[i] != a2[i]) return false; &lt;br /&gt;   }&lt;br /&gt;   return true;&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt;//同じだよになる&lt;br /&gt;if(array_compare(a,b)) alert('同じだよ');&lt;br /&gt;else alert('違うよ');&lt;br /&gt;&lt;br /&gt;//違うよになる&lt;br /&gt;if(array_compare(a,c)) alert('同じだよ');&lt;br /&gt;else alert('違うよ');&lt;br /&gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/744605407212742108-1656539595816425938?l=endoyuta.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://endoyuta.blogspot.com/feeds/1656539595816425938/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://endoyuta.blogspot.com/2011/07/javascript.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/744605407212742108/posts/default/1656539595816425938'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/744605407212742108/posts/default/1656539595816425938'/><link rel='alternate' type='text/html' href='http://endoyuta.blogspot.com/2011/07/javascript.html' title='JavaScript 配列の比較（要素ごとにやらないといけないらしい）'/><author><name>endo yuta</name><uri>http://www.blogger.com/profile/05491646789675985410</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://1.bp.blogspot.com/-7dw9PlYIisc/TtuORirdBtI/AAAAAAAAAYc/kr_xs7ruXrU/s220/slime.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-744605407212742108.post-5321934587142993066</id><published>2011-06-28T21:58:00.001+09:00</published><updated>2011-07-10T14:29:45.537+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='Event'/><category scheme='http://www.blogger.com/atom/ns#' term='HTML5'/><category scheme='http://www.blogger.com/atom/ns#' term='Canvas'/><title type='text'>HTML5 - Canvas マウスイベント時の座標取得について（座標は小数点以下があるらしい）</title><content type='html'>こんな感じでマウスクリック時の座標を検知する。&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;var mouseX;&lt;br /&gt;var mouseY;&lt;br /&gt;&lt;br /&gt;//イベントリスナーの登録&lt;br /&gt;canvas.addEventListener("mousedown", mouseDownHandler, false);&lt;br /&gt;&lt;br /&gt;function mouseDownHandler(e) {&lt;br /&gt; var rect = e.target.getBoundingClientRect();&lt;br /&gt; mouseX =  Math.floor(e.clientX - rect.left);&lt;br /&gt; mouseY =  Math.floor(e.clientY - rect.top);&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;Math.floor(x)は、xの小数点以下を切り捨てる関数ですが、これをつけないと、FirefoxでY軸が小数点付き座標が取得されて困ったのでつけました。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/744605407212742108-5321934587142993066?l=endoyuta.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://endoyuta.blogspot.com/feeds/5321934587142993066/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://endoyuta.blogspot.com/2011/06/html5-canvas_28.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/744605407212742108/posts/default/5321934587142993066'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/744605407212742108/posts/default/5321934587142993066'/><link rel='alternate' type='text/html' href='http://endoyuta.blogspot.com/2011/06/html5-canvas_28.html' title='HTML5 - Canvas マウスイベント時の座標取得について（座標は小数点以下があるらしい）'/><author><name>endo yuta</name><uri>http://www.blogger.com/profile/05491646789675985410</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://1.bp.blogspot.com/-7dw9PlYIisc/TtuORirdBtI/AAAAAAAAAYc/kr_xs7ruXrU/s220/slime.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-744605407212742108.post-1955092724304539989</id><published>2011-06-26T13:08:00.001+09:00</published><updated>2011-07-10T14:28:51.216+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='Game'/><category scheme='http://www.blogger.com/atom/ns#' term='HTML5'/><category scheme='http://www.blogger.com/atom/ns#' term='Canvas'/><title type='text'>HTML5 - Canvas アニメーション　ゲーム（２）</title><content type='html'>&lt;a href="http://endoyuta.blogspot.com/2011/06/html5-canvas_20.html"&gt;ゲーム（１）&lt;/a&gt;の改良版。右左で移動できて、上でジャンプできます。敵の熊達をよけながら、GUNで敵を全部倒せばクリアです。GUNはAボタンで撃てます。Blog上ではうまく動かないので、リンクはります。動作確認はパソコンのChrome,Firefoxで確認済みです。&lt;br /&gt;&lt;br /&gt;&lt;a href="http://endo-yuta.appspot.com/practice3"&gt;http://endo-yuta.appspot.com/practice3&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;code&lt;a name='more'&gt;&lt;/a&gt;&lt;/h3&gt;&lt;pre class="prettyprint"&gt;&amp;lt;canvas id="game" width="400" height="400"&amp;gt;&amp;lt;/canvas&amp;gt;&lt;br /&gt;&amp;lt;script type="text/javascript"&amp;gt;&lt;br /&gt;var canvas = document.getElementById("game");&lt;br /&gt;var ctx = canvas.getContext("2d");&lt;br /&gt;&lt;br /&gt;//敵の最大数&lt;br /&gt;var ENEMY_COUNT = 5;&lt;br /&gt;&lt;br /&gt;//画像の読み込み&lt;br /&gt;//プレイヤーの画像読み込み&lt;br /&gt;var img_player = new Image();&lt;br /&gt;img_player.src = '/pic/Emoticons.png';&lt;br /&gt;&lt;br /&gt;//敵画像の読み込み&lt;br /&gt;var imgs = new Array();&lt;br /&gt;imgs[0] = new Image();&lt;br /&gt;imgs[0].src = '/pic/BlueToy_48x48.png'&lt;br /&gt;imgs[1] = new Image();&lt;br /&gt;imgs[1].src = '/pic/YellowToy_48x48.png'&lt;br /&gt;imgs[2] = new Image();&lt;br /&gt;imgs[2].src = '/pic/FireToy_48x48.png'&lt;br /&gt;imgs[3] = new Image();&lt;br /&gt;imgs[3].src = '/pic/GreenToy_48x48.png'&lt;br /&gt;&lt;br /&gt;//プレイヤーのインスタンス作成&lt;br /&gt;var player = new Player(ctx,img_player,0,368);&lt;br /&gt;&lt;br /&gt;//最大数まで敵のインスタンスを作成&lt;br /&gt;var enemys = new Array();&lt;br /&gt;for(var i=0; i&amp;lt;ENEMY_COUNT; i++){&lt;br /&gt; //向きと早さをランダムに決める&lt;br /&gt; var vx = Math.random()*3; &lt;br /&gt; var vy = Math.random()*3;&lt;br /&gt; //イメージをランダムに決める&lt;br /&gt; var img_no = Math.floor(Math.random()*4);&lt;br /&gt; //インスタンス作成&lt;br /&gt; enemys[i] = new Enemy(ctx,imgs[img_no],0,0,vx,vy);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;//イメージロード後にメイン関数を繰り返し&lt;br /&gt;var tm;&lt;br /&gt;imgs[3].onload = function() { &lt;br /&gt; tm = setInterval(main,10);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;//メイン関数&lt;br /&gt;function  main(){&lt;br /&gt; //画面のクリア&lt;br /&gt; ctx.clearRect(0,0,400,400);&lt;br /&gt; //当たり判定&lt;br /&gt; if(player.hit_enemy(enemys)){&lt;br /&gt;  alert('GAME OVER...');&lt;br /&gt;  clearInterval(tm);&lt;br /&gt;  player.apear();&lt;br /&gt;  for(var i=0; i&amp;lt;enemys.length; i++){&lt;br /&gt;   enemys[i].apear();&lt;br /&gt;  }&lt;br /&gt; }else{&lt;br /&gt;  //プレイヤーのインスタンスの表示&lt;br /&gt;  player.apear(); &lt;br /&gt;  &lt;br /&gt;  //当たった弾のインデックス用&lt;br /&gt;  var bullet_i;&lt;br /&gt;  for(var i=0; i&amp;lt;enemys.length; i++){&lt;br /&gt;   //敵と弾の当たり判定&lt;br /&gt;   if(enemys.length -1 &amp;lt; i) break;&lt;br /&gt;   bullet_i = enemys[i].hit_bullet(player);&lt;br /&gt;   if(bullet_i == false){&lt;br /&gt;    //敵のインスタンスの表示&lt;br /&gt;    enemys[i].apear();    &lt;br /&gt;   }else{&lt;br /&gt;    //敵のパワーが1減る&lt;br /&gt;    enemys[i].power --;&lt;br /&gt;    if(enemys[i].power == 0) enemys.splice(i,1);&lt;br /&gt;    //弾を削除&lt;br /&gt;    player.bullet.splice(bullet_i-1,1);&lt;br /&gt;   }&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;//敵クラス&lt;br /&gt;function Enemy(ctx,img,x,y,vx,vy){&lt;br /&gt; var obj = this;&lt;br /&gt; obj.x = x ? x : 0;&lt;br /&gt; obj.y = y ? y : 0;&lt;br /&gt; obj.vx = vx ? vx : 2;&lt;br /&gt; obj.vy = vy ? vy : 1;&lt;br /&gt; obj.size = 32;&lt;br /&gt; &lt;br /&gt; //敵のパワー&lt;br /&gt; obj.power = 5;&lt;br /&gt;  &lt;br /&gt; //敵を表示するメソッド&lt;br /&gt; obj.apear = function(){&lt;br /&gt;  ctx.drawImage(img,obj.x,obj.y,obj.size,obj.size);&lt;br /&gt;  obj.x = obj.x + obj.vx;&lt;br /&gt;  obj.y = obj.y + obj.vy;&lt;br /&gt;  //枠に到達したら折り返させる(速度の符号を反転)&lt;br /&gt;  if(obj.x&amp;lt;=0||obj.x&amp;gt;=400-28) obj.vx = -obj.vx;&lt;br /&gt;  if(obj.y&amp;lt;=0||obj.y&amp;gt;=400-30) obj.vy = -obj.vy;&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; //敵と弾の当たり判定メソッド&lt;br /&gt; obj.hit_bullet = function(player){&lt;br /&gt;  var b_lx;&lt;br /&gt;  var b_ty;&lt;br /&gt;  var b_rx;&lt;br /&gt;  var b_by;&lt;br /&gt;  for(var i=0; i&amp;lt;player.bullet.length; i++){&lt;br /&gt;   b_lx = player.bullet[i].x;&lt;br /&gt;   b_ty = player.bullet[i].y;&lt;br /&gt;   b_rx = b_lx + 4;&lt;br /&gt;   b_by = b_ty + 4;&lt;br /&gt;   if(obj.x &amp;lt; b_rx &amp;amp;&amp;amp; b_lx &amp;lt; obj.x+20 &amp;amp;&amp;amp; obj.y &amp;lt; b_by &amp;amp;&amp;amp; b_ty &amp;lt;obj.y+26) return i+1;&lt;br /&gt;  }&lt;br /&gt;  return false;&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;//プレイヤークラス&lt;br /&gt;function Player(ctx,img,x,y){&lt;br /&gt; var obj = this;&lt;br /&gt; obj.x = x ? x : 0;&lt;br /&gt; obj.y = y ? y : 0;&lt;br /&gt; obj.vy = 5;&lt;br /&gt; obj.g = 0.1;&lt;br /&gt; obj.size = 32;&lt;br /&gt; &lt;br /&gt; //ジャンプ中か？フラグ&lt;br /&gt; obj.jump_status = false;&lt;br /&gt; //右移動中か？フラグ&lt;br /&gt; obj.right_status = false;&lt;br /&gt; //左移動中か？フラグ&lt;br /&gt; obj.left_status = false;&lt;br /&gt; //Gun撃っているか？フラグ&lt;br /&gt; obj.gun_status = false;&lt;br /&gt; //Gun制御フラグ（一定間隔で撃つためのカウンター）&lt;br /&gt; obj.gun_counter = 0;&lt;br /&gt; &lt;br /&gt; //Bulletインスタンスの配列の作成&lt;br /&gt; obj.bullet = new Array();&lt;br /&gt;  &lt;br /&gt; //プレイヤーを表示するメソッド&lt;br /&gt; obj.apear = function(){&lt;br /&gt;  ctx.drawImage(img,obj.x,obj.y,obj.size,obj.size);&lt;br /&gt;  //ジャンプ&lt;br /&gt;  if(obj.jump_status) obj.jump();&lt;br /&gt;  //右移動&lt;br /&gt;  if(obj.right_status) obj.right();&lt;br /&gt;  //左移動&lt;br /&gt;  if(obj.left_status) obj.left();&lt;br /&gt;  //Gun 撃っている状態&lt;br /&gt;  if(obj.gun_status){&lt;br /&gt;   if(obj.gun_counter == 0){&lt;br /&gt;    obj.bullet.push(new Bullet(obj));&lt;br /&gt;    obj.gun() ;&lt;br /&gt;    obj.gun_counter = 40;&lt;br /&gt;   }else{&lt;br /&gt;    obj.gun() ;&lt;br /&gt;    obj.gun_counter --;&lt;br /&gt;   }&lt;br /&gt;  }&lt;br /&gt;  //Gun 撃ち終わった状態&lt;br /&gt;  if(! obj.gun_status &amp;amp;&amp;amp; obj.bullet.length &amp;gt; 0){&lt;br /&gt;   obj.gun();&lt;br /&gt;   obj.gun_counter = 0;&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; //Gunメソッド&lt;br /&gt; obj.gun = function(){&lt;br /&gt;  for(var i = 0; i &amp;lt;obj.bullet.length; i++){&lt;br /&gt;   //弾の数だけ弾を表示する。と同時に弾が外に出ていないか確認する&lt;br /&gt;   if(obj.bullet.length -1 &amp;lt; i) break;&lt;br /&gt;   if(!obj.bullet[i].shot()){&lt;br /&gt;    //弾が外に出ている場合は、インタスタンスを削除する&lt;br /&gt;    obj.bullet.splice(i,1);&lt;br /&gt;   }&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; //ジャンプメソッド&lt;br /&gt; obj.jump = function(){&lt;br /&gt;  //jumpすると重力によって、-9.8m/s2速度が下がる&lt;br /&gt;  obj.vy = obj.vy - obj.g;&lt;br /&gt;  obj.y = obj.y - obj.vy;&lt;br /&gt;  if(obj.y&amp;gt;=400-obj.size){&lt;br /&gt;   obj.vy = 5;&lt;br /&gt;   obj.y = 400-obj.size;&lt;br /&gt;   obj.jump_status = false;&lt;br /&gt;  } &lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; //右移動メソッド&lt;br /&gt; obj.right = function(){&lt;br /&gt;  if(obj.x&amp;lt;400-32) obj.x = obj.x + 2.5;&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; //左移動メソッド&lt;br /&gt; obj.left = function(){&lt;br /&gt;  if(obj.x&amp;gt;0) obj.x = obj.x - 2.5;&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; //敵との当たり判定メソッド&lt;br /&gt; obj.hit_enemy = function(enemys){&lt;br /&gt;  var e_lx;&lt;br /&gt;  var e_ty;&lt;br /&gt;  var e_rx;&lt;br /&gt;  var e_by;&lt;br /&gt;  for(var i=0; i&amp;lt;enemys.length; i++){&lt;br /&gt;   e_lx = enemys[i].x;&lt;br /&gt;   e_ty = enemys[i].y;&lt;br /&gt;   e_rx = e_lx + 20;&lt;br /&gt;   e_by = e_ty + 26;&lt;br /&gt;   if(obj.x &amp;lt; e_rx &amp;amp;&amp;amp; e_lx &amp;lt; obj.x+28 &amp;amp;&amp;amp; obj.y &amp;lt; e_by &amp;amp;&amp;amp; e_ty &amp;lt;obj.y+28) return true;&lt;br /&gt;  }&lt;br /&gt;  return false;&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;//Bulletクラス&lt;br /&gt;function Bullet(player){&lt;br /&gt; var obj = this;&lt;br /&gt; obj.x = false;&lt;br /&gt; obj.y = false;&lt;br /&gt; obj.v = 5;&lt;br /&gt; &lt;br /&gt; //弾を表示するメソッド&lt;br /&gt; obj.shot = function(){&lt;br /&gt;  if(obj.x &amp;amp;&amp;amp; obj.y){&lt;br /&gt;   obj.x = obj.x + obj.v;&lt;br /&gt;   obj.y = obj.y - obj.v;&lt;br /&gt;   //外に出ていたらfalseを返す&lt;br /&gt;   if(obj.x&amp;lt;0 || obj.x&amp;gt;400 || obj.y &amp;lt;0 || obj.y &amp;gt;400){&lt;br /&gt;    return false;&lt;br /&gt;   }&lt;br /&gt;  }else{&lt;br /&gt;   obj.x = player.x+32;&lt;br /&gt;   obj.y = player.y+14;&lt;br /&gt;  }&lt;br /&gt;  ctx.beginPath()&lt;br /&gt;  ctx.fillStyle = 'orange';&lt;br /&gt;  ctx.arc(obj.x+2, obj.y+2, 2, 0, 360,false);&lt;br /&gt;  ctx.fill();&lt;br /&gt;  return true;&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;//キーコード&lt;br /&gt;var KEY_LEFT = 37;&lt;br /&gt;var KEY_RIGHT = 39;&lt;br /&gt;var KEY_UP = 38;&lt;br /&gt;var KEY_DOWN = 40;&lt;br /&gt;var KEY_SPACE = 32;&lt;br /&gt;var KEY_ENTER = 13;&lt;br /&gt;var KEY_ESC = 27;&lt;br /&gt;var KEY_A = 65;&lt;br /&gt;&lt;br /&gt;//キー入力検出&lt;br /&gt;$(window).keydown(function(e){&lt;br /&gt; //スペースか上を押したら...&lt;br /&gt; if(e.keyCode == KEY_SPACE || e.keyCode == KEY_UP){&lt;br /&gt;  player.jump_status = true;&lt;br /&gt;  return false;&lt;br /&gt; //左を押したら...&lt;br /&gt; }else if(e.keyCode == KEY_LEFT){&lt;br /&gt;  player.left_status = true;&lt;br /&gt;  player.right_status = false;&lt;br /&gt;  return false;&lt;br /&gt; //右を押したら...&lt;br /&gt; }else if(e.keyCode == KEY_RIGHT){&lt;br /&gt;  player.right_status = true;&lt;br /&gt;  player.left_status = false;&lt;br /&gt;  return true;&lt;br /&gt; //Aを押したら...&lt;br /&gt; }else if(e.keyCode == KEY_A){&lt;br /&gt;  player.gun_status = true;&lt;br /&gt;  return false;&lt;br /&gt; }&lt;br /&gt;});&lt;br /&gt;&lt;br /&gt;$(window).keyup(function(e){&lt;br /&gt; if(e.keyCode == KEY_LEFT){&lt;br /&gt;  if(!player.jump_status) player.left_status = false;&lt;br /&gt;  return false;&lt;br /&gt; }&lt;br /&gt; if(e.keyCode == KEY_RIGHT){&lt;br /&gt;  if(!player.jump_status) player.right_status = false;&lt;br /&gt;  return false;&lt;br /&gt; }&lt;br /&gt; if(e.keyCode == KEY_A){&lt;br /&gt;  player.gun_status = false;&lt;br /&gt;  return false;&lt;br /&gt; }&lt;br /&gt;});&lt;br /&gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/744605407212742108-1955092724304539989?l=endoyuta.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://endoyuta.blogspot.com/feeds/1955092724304539989/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://endoyuta.blogspot.com/2011/06/html5-canvas_8911.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/744605407212742108/posts/default/1955092724304539989'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/744605407212742108/posts/default/1955092724304539989'/><link rel='alternate' type='text/html' href='http://endoyuta.blogspot.com/2011/06/html5-canvas_8911.html' title='HTML5 - Canvas アニメーション　ゲーム（２）'/><author><name>endo yuta</name><uri>http://www.blogger.com/profile/05491646789675985410</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://1.bp.blogspot.com/-7dw9PlYIisc/TtuORirdBtI/AAAAAAAAAYc/kr_xs7ruXrU/s220/slime.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-744605407212742108.post-8036389015608804382</id><published>2011-06-26T12:59:00.002+09:00</published><updated>2011-07-10T14:30:31.331+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='物理'/><category scheme='http://www.blogger.com/atom/ns#' term='HTML5'/><category scheme='http://www.blogger.com/atom/ns#' term='Canvas'/><title type='text'>HTML5 Canvas - 上からボールを落として跳ね返る</title><content type='html'>上からボールを落として跳ね返る様。重力があり跳ね返り係数があるのだ。オランダの科学者が重力はないといっており、他の著名科学者、物理学者が一定の賛同をしているようだ。これが本当なら重力がある前提で全ての物理の教科書がつくられている現代において、コロンブス並みの大発見になるかもとのことだ。僕は今覚えたばかりの重力を前提に跳ね返らせているわけだが、それでも自然にみえるものだ。何が正しくて何が本質かなどということはわからないものじゃ。&lt;br /&gt;&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;跳ね返り係数は、衝突後の速度を衝突前の速度で割り算して出すのだ。たしか。基本的に衝突後にスピードが遅くなるのはエネルギーが吸収されるからなんだと思うんだけど、基本的に衝突後にスピードが遅くなるのであれば、衝突前の方が速度の値は大きくなるわけなので、割り算結果としての跳ね返り係数は０〜１の間に収まる。０だと全てのエネルギーが吸収されて全く跳ね返らないということだ。&lt;br /&gt;&lt;br /&gt;今知りたいのは、スーパーボールって係数はどの位なんだろう？というのと、斜め下から側面にぶつけたときって、やっぱ斜め上に行くって考え方であってるのか？っていうことだ。斜め上に行くものの重力の関係上放物線を描きながら下に行くイメージかなと思ってんだけどどうなんだろうか？&lt;br /&gt;&lt;br /&gt;(やはりブログトップページからは絵が見られませんので、&lt;a href="http://endoyuta.blogspot.com/2011/06/html5-canvas_26.html"&gt;単一ページ&lt;/a&gt;で見てください。)&lt;br /&gt;&lt;br /&gt;&lt;canvas class="waku" height="300" id="jump2" width="300"&gt;&lt;/canvas&gt;&lt;br /&gt;&lt;script type="text/javascript"&gt;var canvas = document.getElementById("jump2");var ctx = canvas.getContext("2d");var p;var c_w = canvas.width;var c_h = canvas.height;function init(){        p = new Player();       }init();var tm;tm = setInterval(main,10);function main(){        //画面のクリア        ctx.clearRect(0,0,400,400);        p.view();}function Player(){        var obj = this;        obj.size = 10;        obj.x = 10; //円中心のx座標        obj.y = 10; //円中心のy座標        obj.v = 0; //初速度        obj.g = 0.1; //重力加速度        obj.h = 0.8; //跳ね返り係数                obj.view = function(){                if(obj.y &gt;= c_h - obj.size/2){                        obj.y = c_h - obj.size/2;                        obj.v = -obj.v*obj.h + obj.g;                        if(obj.v &gt;= 0) obj.v = 0;                }else{                        obj.v = obj.v + obj.g;                  }                               obj.y = obj.y + obj.v;                 ctx.beginPath()                ctx.fillStyle = 'blue';                ctx.arc(obj.x, obj.y, obj.size/2, 0, 360,false);                ctx.font = "18px 'Monotype Corsiva'";                ctx . fillText(obj.v, 30, 30);                ctx.fill();        }}&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;code&lt;/h3&gt;&lt;pre class="prettyprint"&gt;&amp;lt;canvas id="game" width="300" height="300"&amp;gt;&amp;lt;/canvas&amp;gt;&lt;br /&gt;&amp;lt;script type="text/javascript"&amp;gt;&lt;br /&gt;var canvas = document.getElementById("game");&lt;br /&gt;var ctx = canvas.getContext("2d");&lt;br /&gt;&lt;br /&gt;var p;&lt;br /&gt;var c_w = canvas.width;&lt;br /&gt;var c_h = canvas.height;&lt;br /&gt;&lt;br /&gt;function init(){&lt;br /&gt; p = new Player(); &lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;init();&lt;br /&gt;&lt;br /&gt;var tm;&lt;br /&gt;tm = setInterval(main,10);&lt;br /&gt;&lt;br /&gt;function main(){&lt;br /&gt; //画面のクリア&lt;br /&gt; ctx.clearRect(0,0,400,400);&lt;br /&gt; p.view();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function Player(){&lt;br /&gt; var obj = this;&lt;br /&gt; obj.size = 10;&lt;br /&gt; obj.x = 10; //円中心のx座標&lt;br /&gt; obj.y = 10; //円中心のy座標&lt;br /&gt; obj.v = 0; //初速度&lt;br /&gt; obj.g = 0.1; //重力加速度&lt;br /&gt; obj.h = 0.8; //跳ね返り係数&lt;br /&gt; &lt;br /&gt; obj.view = function(){&lt;br /&gt;  if(obj.y &amp;gt;= c_h - obj.size/2){&lt;br /&gt;   obj.y = c_h - obj.size/2;&lt;br /&gt;   obj.v = -obj.v*obj.h + obj.g;&lt;br /&gt;   if(obj.v &amp;gt;= 0) obj.v = 0;&lt;br /&gt;  }else{&lt;br /&gt;   obj.v = obj.v + obj.g; &lt;br /&gt;  }  &lt;br /&gt;  obj.y = obj.y + obj.v; &lt;br /&gt;  ctx.beginPath()&lt;br /&gt;  ctx.fillStyle = 'blue';&lt;br /&gt;  ctx.arc(obj.x, obj.y, obj.size/2, 0, 360,false);&lt;br /&gt;  ctx.font = "18px 'Monotype Corsiva'";&lt;br /&gt;  ctx . fillText(obj.v, 30, 30);&lt;br /&gt;  ctx.fill();&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/744605407212742108-8036389015608804382?l=endoyuta.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://endoyuta.blogspot.com/feeds/8036389015608804382/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://endoyuta.blogspot.com/2011/06/html5-canvas_26.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/744605407212742108/posts/default/8036389015608804382'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/744605407212742108/posts/default/8036389015608804382'/><link rel='alternate' type='text/html' href='http://endoyuta.blogspot.com/2011/06/html5-canvas_26.html' title='HTML5 Canvas - 上からボールを落として跳ね返る'/><author><name>endo yuta</name><uri>http://www.blogger.com/profile/05491646789675985410</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://1.bp.blogspot.com/-7dw9PlYIisc/TtuORirdBtI/AAAAAAAAAYc/kr_xs7ruXrU/s220/slime.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-744605407212742108.post-6986171410275999998</id><published>2011-06-21T22:32:00.003+09:00</published><updated>2011-07-10T14:31:33.289+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='物理'/><category scheme='http://www.blogger.com/atom/ns#' term='HTML5'/><category scheme='http://www.blogger.com/atom/ns#' term='Canvas'/><title type='text'>HTML5 - Canvas 自然なジャンプをする四角形</title><content type='html'>地球には重力がありますので、飛んでもしまいには落ちます。飛ぶときは初速度がありますが、この速度は毎秒9.8m/s2重力によって減速します。当然落下中は毎秒9.8m/s2速度が増します。この9.8m/s2を重力加速度といいます。9.8m/s2というのは大体の数値で、場所や色々な条件によってこの速度は微妙に変わります。この自然界の掟をプログラムのジャンプに反映させると、いかにも自然なジャンプに見えるのであります。&lt;br /&gt;&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;やはりブログトップページからは絵が見られませんので、&lt;a href="http://endoyuta.blogspot.com/2011/06/html5-canvas_21.html"&gt;単一ページ&lt;/a&gt;で見てください。&lt;br /&gt;&lt;br /&gt;&lt;canvas class="waku" height="400" id="jump1" width="400"&gt;&lt;/canvas&gt;&lt;br /&gt;&lt;script type="text/javascript"&gt;var canvas = document.getElementById("jump1");var ctx = canvas.getContext("2d");ctx.fillStyle = 'green';var x = 0;var y = 370;var vy = 5;var g = 0.08;tm2 = setInterval(jump,10);function jump(){ //画面のクリア ctx.clearRect(0,0,400,400); ctx.fillRect(x,y,30,30); //jumpすると重力によって、-9.8m/s2速度が下がる vy = vy - g; y = y - vy; if(y&gt;370){  vy = 5;  y = 370; } }&lt;/script&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;&amp;lt;canvas id="jump1" width="400" height="400"&amp;gt;&amp;lt;/canvas&amp;gt;&lt;br /&gt;&amp;lt;script type="text/javascript"&amp;gt;&lt;br /&gt;var canvas = document.getElementById("jump1");&lt;br /&gt;var ctx = canvas.getContext("2d");&lt;br /&gt;ctx.fillStyle = 'green';&lt;br /&gt;&lt;br /&gt;var x = 0;&lt;br /&gt;var y = 370;&lt;br /&gt;var vy = 5;&lt;br /&gt;var g = 0.08;&lt;br /&gt;&lt;br /&gt;tm = setInterval(jump,10);&lt;br /&gt;&lt;br /&gt;function jump(){&lt;br /&gt; //画面のクリア&lt;br /&gt; ctx.clearRect(0,0,400,400);&lt;br /&gt; ctx.fillRect(x,y,30,30);&lt;br /&gt; //jumpすると重力によって、-9.8m/s2速度が下がる&lt;br /&gt; vy = vy - g;&lt;br /&gt; y = y - vy;&lt;br /&gt; if(y&amp;gt;370){&lt;br /&gt;  vy = 5;&lt;br /&gt;  y = 370;&lt;br /&gt; } &lt;br /&gt;}&lt;br /&gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/744605407212742108-6986171410275999998?l=endoyuta.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://endoyuta.blogspot.com/feeds/6986171410275999998/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://endoyuta.blogspot.com/2011/06/html5-canvas_21.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/744605407212742108/posts/default/6986171410275999998'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/744605407212742108/posts/default/6986171410275999998'/><link rel='alternate' type='text/html' href='http://endoyuta.blogspot.com/2011/06/html5-canvas_21.html' title='HTML5 - Canvas 自然なジャンプをする四角形'/><author><name>endo yuta</name><uri>http://www.blogger.com/profile/05491646789675985410</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://1.bp.blogspot.com/-7dw9PlYIisc/TtuORirdBtI/AAAAAAAAAYc/kr_xs7ruXrU/s220/slime.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-744605407212742108.post-6208684995351217669</id><published>2011-06-20T01:01:00.002+09:00</published><updated>2011-07-10T14:32:08.186+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='Game'/><category scheme='http://www.blogger.com/atom/ns#' term='HTML5'/><category scheme='http://www.blogger.com/atom/ns#' term='Canvas'/><title type='text'>HTML5 - Canvas アニメーション　ゲーム（１）</title><content type='html'>若干ゲームっぽくなってきたHTML5のCanvasアニメーションです。プレイヤーは青いボールに顔が書いてあるやつで、彼はカーソルキーで動かせます。上を押すとジャンプします。しかしジャンプしだしたら天井にぶつかって帰ってくるまで止まりません。右左を押すと右左に移動します。ジャンプ中も移動できます。敵はくま達です。くま達にぶつかった時点でゲームオーバーです。得点などはございません。ゲームオーバーになったらリロードするまでもはや動きません。&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;(やはりブログのトップページだと表示されない。。。見るときは&lt;a href="http://endoyuta.blogspot.com/2011/06/html5-canvas_20.html"&gt;単一ページ&lt;/a&gt;からお願いします。)&lt;br /&gt;&lt;br /&gt;&lt;canvas class="waku" height="400" id="kuma3" width="400"&gt;&lt;/canvas&gt;&lt;br /&gt;&lt;script type="text/javascript"&gt;var canvas = document.getElementById("kuma3");var ctx = canvas.getContext("2d");//敵の最大数var ENEMY_COUNT = 5;//画像の読み込み//プレイヤーの画像読み込みvar img_player = new Image();img_player.src = 'http://endo-yuta.appspot.com/pic/Emoticons.png';//敵画像の読み込みvar imgs = new Array();imgs[0] = new Image();imgs[0].src = 'http://endo-yuta.appspot.com/pic/BlueToy_48x48.png'imgs[1] = new Image();imgs[1].src = 'http://endo-yuta.appspot.com/pic/YellowToy_48x48.png'imgs[2] = new Image();imgs[2].src = 'http://endo-yuta.appspot.com/pic/FireToy_48x48.png'imgs[3] = new Image();imgs[3].src = 'http://endo-yuta.appspot.com/pic/GreenToy_48x48.png'//プレイヤーのインスタンス作成var player = new Player(ctx,img_player,0,368);//最大数まで敵のインスタンスを作成var enemys = new Array();for(var i=0; i&lt;ENEMY_COUNT; i++){ //向きと早さをランダムに決める var vx = Math.random()*3;  var vy = Math.random()*3; //イメージをランダムに決める var img_no = Math.floor(Math.random()*4); //インスタンス作成 enemys[i] = new Enemy(ctx,imgs[img_no],0,0,vx,vy);}//当たり判定インスタンスの作成var hit_p_e = new Hit_player_enemy(player,enemys,ENEMY_COUNT);//イメージロード後にメイン関数を繰り返しvar tm;imgs[3].onload = function() {  tm = setInterval(main,10);}//メイン関数function  main(){ //画面のクリア ctx.clearRect(0,0,400,400); //当たり判定 if(hit_p_e.hit()){  alert('GAME OVER...');  clearInterval(tm);  player.apear();  for(var i=0; i&lt;ENEMY_COUNT; i++){   enemys[i].apear();  } }else{  //プレイヤーのインスタンスの表示  player.apear();   //敵のインスタンスの表示  for(var i=0; i&lt;ENEMY_COUNT; i++){   enemys[i].apear();  } }}//敵クラスfunction Enemy(ctx,img,x,y,vx,vy){ var obj = this; obj.x = x ? x : 0; obj.y = y ? y : 0; obj.vx = vx ? vx : 2; obj.vy = vy ? vy : 1; obj.size = 32;   //敵を表示するメソッド obj.apear = function(){  ctx.drawImage(img,obj.x,obj.y,obj.size,obj.size);  obj.x = obj.x + obj.vx;  obj.y = obj.y + obj.vy;  //枠に到達したら折り返させる(速度の符号を反転)  if(obj.x&lt;=0||obj.x&gt;=400-28) obj.vx = -obj.vx;  if(obj.y&lt;=0||obj.y&gt;=400-30) obj.vy = -obj.vy; }}//プレイヤークラスfunction Player(ctx,img,x,y){ var obj = this; obj.x = x ? x : 0; obj.y = y ? y : 0; obj.vy = -3; obj.size = 32;  //ジャンプ中か？フラグ obj.jump_status = false; //右移動中か？フラグ obj.right_status = false; //左移動中か？フラグ obj.left_status = false;  //プレイヤーを表示するメソッド obj.apear = function(){  ctx.drawImage(img,obj.x,obj.y,obj.size,obj.size);  //ジャンプ  if(obj.jump_status) obj.jump();  //右移動  if(obj.right_status) obj.right();  //左移動  if(obj.left_status) obj.left(); }  //ジャンプメソッド obj.jump = function(){  obj.y  = obj.y + obj.vy;  if(obj.y&lt;=0) obj.vy = -obj.vy;  if(obj.y&gt;=400-32){   obj.jump_status = false;   obj.vy = -obj.vy;  }  }  //右移動メソッド obj.right = function(){  if(obj.x&lt;400-32) obj.x = obj.x + 3; }  //左移動メソッド obj.left = function(){  if(obj.x&gt;0) obj.x = obj.x - 3; }}//当たり判定クラス(プレイヤーと敵との当たり判定)function Hit_player_enemy(player,enemys,enemy_count){ var obj = this; //プレイヤーの位置の取得 var p_lx; var p_ty; var p_rx; var p_by; //敵の位置の取得と当たり判定を敵の数繰り返す var e_lx; var e_ty; var e_rx; var e_by;  //当たり判定メソッド obj.hit = function(){  for(var i=0; i&lt;enemy_count; i++){   p_lx = player.x;   p_ty = player.y;   p_rx = p_lx + 28;   p_by = p_ty +28;   e_lx = enemys[i].x;   //e_lx = enemys.x;   e_ty = enemys[i].y;   //e_ty = enemys.y;   e_rx = e_lx + 20;   e_by = e_ty + 26;   if(p_lx &lt; e_rx &amp;&amp; e_lx &lt; p_rx &amp;&amp; p_ty &lt; e_by &amp;&amp; e_ty &lt; p_by) return true;  }  return false; }}//キーコードvar KEY_LEFT = 37;var KEY_RIGHT = 39;var KEY_UP = 38;var KEY_DOWN = 40;var KEY_SPACE = 32;var KEY_ENTER = 13;var KEY_ESC = 27;//キー入力検出$(window).keydown(function(e){ //スペースか上を押したら... if(e.keyCode == KEY_SPACE || e.keyCode == KEY_UP){  player.jump_status = true;  return false; //左を押したら... }else if(e.keyCode == KEY_LEFT){  player.left_status = true;  player.right_status = false;  return false; //右を押したら... }else if(e.keyCode == KEY_RIGHT){  player.right_status = true;  player.left_status = false;  return true; }});&lt;/script&gt;&lt;pre class="prettyprint"&gt;&amp;lt;canvas id="kuma3" width="400" height="400"&amp;gt;&amp;lt;/canvas&amp;gt;&lt;br /&gt;&amp;lt;script type="text/javascript"&amp;gt;&lt;br /&gt;var canvas = document.getElementById("kuma3");&lt;br /&gt;var ctx = canvas.getContext("2d");&lt;br /&gt;&lt;br /&gt;//敵の最大数&lt;br /&gt;var ENEMY_COUNT = 5;&lt;br /&gt;&lt;br /&gt;//画像の読み込み&lt;br /&gt;//プレイヤーの画像読み込み&lt;br /&gt;var img_player = new Image();&lt;br /&gt;img_player.src = 'Emoticons.png';&lt;br /&gt;&lt;br /&gt;//敵画像の読み込み&lt;br /&gt;var imgs = new Array();&lt;br /&gt;imgs[0] = new Image();&lt;br /&gt;imgs[0].src = 'BlueToy_48x48.png'&lt;br /&gt;imgs[1] = new Image();&lt;br /&gt;imgs[1].src = 'YellowToy_48x48.png'&lt;br /&gt;imgs[2] = new Image();&lt;br /&gt;imgs[2].src = 'FireToy_48x48.png'&lt;br /&gt;imgs[3] = new Image();&lt;br /&gt;imgs[3].src = 'GreenToy_48x48.png'&lt;br /&gt;&lt;br /&gt;//プレイヤーのインスタンス作成&lt;br /&gt;var player = new Player(ctx,img_player,0,368);&lt;br /&gt;&lt;br /&gt;//最大数まで敵のインスタンスを作成&lt;br /&gt;var enemys = new Array();&lt;br /&gt;for(var i=0; i&amp;lt;ENEMY_COUNT; i++){&lt;br /&gt; //向きと早さをランダムに決める&lt;br /&gt; var vx = Math.random()*3; &lt;br /&gt; var vy = Math.random()*3;&lt;br /&gt; //イメージをランダムに決める&lt;br /&gt; var img_no = Math.floor(Math.random()*4);&lt;br /&gt; //インスタンス作成&lt;br /&gt; enemys[i] = new Enemy(ctx,imgs[img_no],0,0,vx,vy);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;//当たり判定インスタンスの作成&lt;br /&gt;var hit_p_e = new Hit_player_enemy(player,enemys,ENEMY_COUNT);&lt;br /&gt;&lt;br /&gt;//イメージロード後にメイン関数を繰り返し&lt;br /&gt;var tm;&lt;br /&gt;imgs[3].onload = function() { &lt;br /&gt; tm = setInterval(main,10);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;//メイン関数&lt;br /&gt;function  main(){&lt;br /&gt; //画面のクリア&lt;br /&gt; ctx.clearRect(0,0,400,400);&lt;br /&gt; //当たり判定&lt;br /&gt; if(hit_p_e.hit()){&lt;br /&gt;  alert('GAME OVER...');&lt;br /&gt;  clearInterval(tm);&lt;br /&gt;  player.apear();&lt;br /&gt;  for(var i=0; i&amp;lt;ENEMY_COUNT; i++){&lt;br /&gt;   enemys[i].apear();&lt;br /&gt;  }&lt;br /&gt; }else{&lt;br /&gt;  //プレイヤーのインスタンスの表示&lt;br /&gt;  player.apear(); &lt;br /&gt;  //敵のインスタンスの表示&lt;br /&gt;  for(var i=0; i&amp;lt;ENEMY_COUNT; i++){&lt;br /&gt;   enemys[i].apear();&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;//敵クラス&lt;br /&gt;function Enemy(ctx,img,x,y,vx,vy){&lt;br /&gt; var obj = this;&lt;br /&gt; obj.x = x ? x : 0;&lt;br /&gt; obj.y = y ? y : 0;&lt;br /&gt; obj.vx = vx ? vx : 2;&lt;br /&gt; obj.vy = vy ? vy : 1;&lt;br /&gt; obj.size = 32;&lt;br /&gt;  &lt;br /&gt; //敵を表示するメソッド&lt;br /&gt; obj.apear = function(){&lt;br /&gt;  ctx.drawImage(img,obj.x,obj.y,obj.size,obj.size);&lt;br /&gt;  obj.x = obj.x + obj.vx;&lt;br /&gt;  obj.y = obj.y + obj.vy;&lt;br /&gt;  //枠に到達したら折り返させる(速度の符号を反転)&lt;br /&gt;  if(obj.x&amp;lt;=0||obj.x&amp;gt;=400-28) obj.vx = -obj.vx;&lt;br /&gt;  if(obj.y&amp;lt;=0||obj.y&amp;gt;=400-30) obj.vy = -obj.vy;&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;//プレイヤークラス&lt;br /&gt;function Player(ctx,img,x,y){&lt;br /&gt; var obj = this;&lt;br /&gt; obj.x = x ? x : 0;&lt;br /&gt; obj.y = y ? y : 0;&lt;br /&gt; obj.vy = -3;&lt;br /&gt; obj.size = 32;&lt;br /&gt; &lt;br /&gt; //ジャンプ中か？フラグ&lt;br /&gt; obj.jump_status = false;&lt;br /&gt; //右移動中か？フラグ&lt;br /&gt; obj.right_status = false;&lt;br /&gt; //左移動中か？フラグ&lt;br /&gt; obj.left_status = false;&lt;br /&gt; &lt;br /&gt; //プレイヤーを表示するメソッド&lt;br /&gt; obj.apear = function(){&lt;br /&gt;  ctx.drawImage(img,obj.x,obj.y,obj.size,obj.size);&lt;br /&gt;  //ジャンプ&lt;br /&gt;  if(obj.jump_status) obj.jump();&lt;br /&gt;  //右移動&lt;br /&gt;  if(obj.right_status) obj.right();&lt;br /&gt;  //左移動&lt;br /&gt;  if(obj.left_status) obj.left();&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; //ジャンプメソッド&lt;br /&gt; obj.jump = function(){&lt;br /&gt;  obj.y  = obj.y + obj.vy;&lt;br /&gt;  if(obj.y&amp;lt;=0) obj.vy = -obj.vy;&lt;br /&gt;  if(obj.y&amp;gt;=400-32){&lt;br /&gt;   obj.jump_status = false;&lt;br /&gt;   obj.vy = -obj.vy;&lt;br /&gt;  } &lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; //右移動メソッド&lt;br /&gt; obj.right = function(){&lt;br /&gt;  if(obj.x&amp;lt;400-32) obj.x = obj.x + 3;&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; //左移動メソッド&lt;br /&gt; obj.left = function(){&lt;br /&gt;  if(obj.x&amp;gt;0) obj.x = obj.x - 3;&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;//当たり判定クラス(プレイヤーと敵との当たり判定)&lt;br /&gt;function Hit_player_enemy(player,enemys,enemy_count){&lt;br /&gt; var obj = this;&lt;br /&gt; //プレイヤーの位置の取得&lt;br /&gt; var p_lx;&lt;br /&gt; var p_ty;&lt;br /&gt; var p_rx;&lt;br /&gt; var p_by;&lt;br /&gt; //敵の位置の取得と当たり判定を敵の数繰り返す&lt;br /&gt; var e_lx;&lt;br /&gt; var e_ty;&lt;br /&gt; var e_rx;&lt;br /&gt; var e_by;&lt;br /&gt; &lt;br /&gt; //当たり判定メソッド&lt;br /&gt; obj.hit = function(){&lt;br /&gt;  for(var i=0; i&amp;lt;enemy_count; i++){&lt;br /&gt;   p_lx = player.x;&lt;br /&gt;   p_ty = player.y;&lt;br /&gt;   p_rx = p_lx + 28;&lt;br /&gt;   p_by = p_ty +28;&lt;br /&gt;   e_lx = enemys[i].x;&lt;br /&gt;   //e_lx = enemys.x;&lt;br /&gt;   e_ty = enemys[i].y;&lt;br /&gt;   //e_ty = enemys.y;&lt;br /&gt;   e_rx = e_lx + 20;&lt;br /&gt;   e_by = e_ty + 26;&lt;br /&gt;   if(p_lx &amp;lt; e_rx &amp;amp;&amp;amp; e_lx &amp;lt; p_rx &amp;amp;&amp;amp; p_ty &amp;lt; e_by &amp;amp;&amp;amp; e_ty &amp;lt; p_by) return true;&lt;br /&gt;  }&lt;br /&gt;  return false;&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;//キーコード&lt;br /&gt;var KEY_LEFT = 37;&lt;br /&gt;var KEY_RIGHT = 39;&lt;br /&gt;var KEY_UP = 38;&lt;br /&gt;var KEY_DOWN = 40;&lt;br /&gt;var KEY_SPACE = 32;&lt;br /&gt;var KEY_ENTER = 13;&lt;br /&gt;var KEY_ESC = 27;&lt;br /&gt;&lt;br /&gt;//キー入力検出&lt;br /&gt;$(window).keydown(function(e){&lt;br /&gt; //スペースか上を押したら...&lt;br /&gt; if(e.keyCode == KEY_SPACE || e.keyCode == KEY_UP){&lt;br /&gt;  player.jump_status = true;&lt;br /&gt;  return false;&lt;br /&gt; //左を押したら...&lt;br /&gt; }else if(e.keyCode == KEY_LEFT){&lt;br /&gt;  player.left_status = true;&lt;br /&gt;  player.right_status = false;&lt;br /&gt;  return false;&lt;br /&gt; //右を押したら...&lt;br /&gt; }else if(e.keyCode == KEY_RIGHT){&lt;br /&gt;  player.right_status = true;&lt;br /&gt;  player.left_status = false;&lt;br /&gt;  return true;&lt;br /&gt; }&lt;br /&gt;});&lt;br /&gt;&lt;br /&gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/744605407212742108-6208684995351217669?l=endoyuta.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://endoyuta.blogspot.com/feeds/6208684995351217669/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://endoyuta.blogspot.com/2011/06/html5-canvas_20.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/744605407212742108/posts/default/6208684995351217669'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/744605407212742108/posts/default/6208684995351217669'/><link rel='alternate' type='text/html' href='http://endoyuta.blogspot.com/2011/06/html5-canvas_20.html' title='HTML5 - Canvas アニメーション　ゲーム（１）'/><author><name>endo yuta</name><uri>http://www.blogger.com/profile/05491646789675985410</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://1.bp.blogspot.com/-7dw9PlYIisc/TtuORirdBtI/AAAAAAAAAYc/kr_xs7ruXrU/s220/slime.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-744605407212742108.post-2323512411513715701</id><published>2011-06-18T23:02:00.006+09:00</published><updated>2011-07-10T14:32:35.304+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='HTML5'/><category scheme='http://www.blogger.com/atom/ns#' term='Canvas'/><title type='text'>HTML5 - Canvas アニメーション　くま（２）</title><content type='html'>くまのアニメーション2。ランダムでキャラ選ぶ。ランダムで向きと速度決める。ブログのトップページだと表示されない。。。見るときは&lt;a href="http://endoyuta.blogspot.com/2011/06/html5-canvas_1028.html"&gt;単一ページ&lt;/a&gt;からお願いします。&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;canvas class="waku" height="400" id="kuma2" width="400"&gt;&lt;/canvas&gt;&lt;br /&gt;&lt;script type="text/javascript"&gt;var canvas2 = document.getElementById("kuma2");var ctx2 = canvas2.getContext("2d");//キャラクターの最大数var PLAYER_COUNT = 10; //キャラクター画像の読み込みvar imgs = new Array();imgs[0] = new Image();imgs[0].src = 'http://endo-yuta.appspot.com/pic/BlueToy_32x32.png'imgs[1] = new Image();imgs[1].src = 'http://endo-yuta.appspot.com/pic/YellowToy_48x48.png'imgs[2] = new Image();imgs[2].src = 'http://endo-yuta.appspot.com/pic/FireToy_48x48.png'imgs[3] = new Image();imgs[3].src = 'http://endo-yuta.appspot.com/pic/heart_48.png'//最大数までキャラクターのインスタンスを作成var players = new Array();for(var i=0; i&lt;PLAYER_COUNT; i++){ //向きと早さをランダムに決める var vx = Math.random()*5;  var vy = Math.random()*5; //イメージをランダムに決める var img_no = Math.floor(Math.random()*4); //インスタンス作成 players[i] = new Me(ctx2,imgs[img_no],0,0,vx,vy);}//イメージロード後にメイン関数を繰り返しimgs[3].onload = function() {    setInterval(main,10);} //メイン関数function  main(){ //画面のクリア ctx2.clearRect(0,0,400,400); //キャラクターのインスタンスの表示 for(var i=0; i&lt;PLAYER_COUNT; i++){  players[i].apear(); }}//主人公のオブジェクトをつくってみる//大きさ、位置、スピード、向きを持つfunction Me(ctx2,img,x,y,vx,vy){ var obj = this; obj.x = x ? x : 0; obj.y = y ? y : 0; obj.vx = vx ? vx : 2; obj.vy = vy ? vy : 1; obj.size = 32;  //主人公を表示するメソッド obj.apear = function(){  ctx2.drawImage(img,obj.x,obj.y,obj.size,obj.size);  obj.x = obj.x + obj.vx;  obj.y = obj.y + obj.vy;  //枠に到達したら折り返させる(速度の符号を反転)  if(obj.x&lt;=0||obj.x&gt;=400-28) obj.vx = -obj.vx;  if(obj.y&lt;=0||obj.y&gt;=400-30) obj.vy = -obj.vy; }}&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;&amp;lt;canvas id="kuma2" width="400" height="400"&amp;gt;&amp;lt;/canvas&amp;gt;&lt;br /&gt;&amp;lt;script type="text/javascript"&amp;gt;&lt;br /&gt;var canvas = document.getElementById("kuma2");&lt;br /&gt;var ctx = canvas.getContext("2d");&lt;br /&gt;&lt;br /&gt;//キャラクターの最大数&lt;br /&gt;var PLAYER_COUNT = 10;&lt;br /&gt; &lt;br /&gt;//キャラクター画像の読み込み&lt;br /&gt;var imgs = new Array();&lt;br /&gt;imgs[0] = new Image();&lt;br /&gt;imgs[0].src = 'BlueToy.png'&lt;br /&gt;imgs[1] = new Image();&lt;br /&gt;imgs[1].src = 'YellowToy.png'&lt;br /&gt;imgs[2] = new Image();&lt;br /&gt;imgs[2].src = 'FireToy.png'&lt;br /&gt;imgs[3] = new Image();&lt;br /&gt;imgs[3].src = 'heart.png'&lt;br /&gt;&lt;br /&gt;//最大数までキャラクターのインスタンスを作成&lt;br /&gt;var players = new Array();&lt;br /&gt;for(var i=0; i&amp;lt;PLAYER_COUNT; i++){&lt;br /&gt; //向きと早さをランダムに決める&lt;br /&gt; var vx = Math.random()*5; &lt;br /&gt; var vy = Math.random()*5;&lt;br /&gt; //イメージをランダムに決める&lt;br /&gt; var img_no = Math.floor(Math.random()*4);&lt;br /&gt; //インスタンス作成&lt;br /&gt; players[i] = new Me(ctx,imgs[img_no],0,0,vx,vy);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;//イメージロード後にメイン関数を繰り返し&lt;br /&gt;imgs[3].onload = function() { &lt;br /&gt; setInterval(main,10);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;//メイン関数&lt;br /&gt;function  main(){&lt;br /&gt; //画面のクリア&lt;br /&gt; ctx.clearRect(0,0,400,400);&lt;br /&gt; //キャラクターのインスタンスの表示&lt;br /&gt; for(var i=0; i&amp;lt;PLAYER_COUNT; i++){&lt;br /&gt;  players[i].apear();&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;//主人公のオブジェクトをつくってみる&lt;br /&gt;//大きさ、位置、スピード、向きを持つ&lt;br /&gt;function Me(ctx,img,x,y,vx,vy){&lt;br /&gt; var obj = this;&lt;br /&gt; obj.x = x ? x : 0;&lt;br /&gt; obj.y = y ? y : 0;&lt;br /&gt; obj.vx = vx ? vx : 2;&lt;br /&gt; obj.vy = vy ? vy : 1;&lt;br /&gt; obj.size = 32;&lt;br /&gt; &lt;br /&gt; //主人公を表示するメソッド&lt;br /&gt; obj.apear = function(){&lt;br /&gt;  ctx.drawImage(img,obj.x,obj.y,obj.size,obj.size);&lt;br /&gt;  obj.x = obj.x + obj.vx;&lt;br /&gt;  obj.y = obj.y + obj.vy;&lt;br /&gt;  //枠に到達したら折り返させる(速度の符号を反転)&lt;br /&gt;  if(obj.x&amp;lt;=0||obj.x&amp;gt;=400-28) obj.vx = -obj.vx;&lt;br /&gt;  if(obj.y&amp;lt;=0||obj.y&amp;gt;=400-30) obj.vy = -obj.vy;&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/744605407212742108-2323512411513715701?l=endoyuta.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://endoyuta.blogspot.com/feeds/2323512411513715701/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://endoyuta.blogspot.com/2011/06/html5-canvas_1028.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/744605407212742108/posts/default/2323512411513715701'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/744605407212742108/posts/default/2323512411513715701'/><link rel='alternate' type='text/html' href='http://endoyuta.blogspot.com/2011/06/html5-canvas_1028.html' title='HTML5 - Canvas アニメーション　くま（２）'/><author><name>endo yuta</name><uri>http://www.blogger.com/profile/05491646789675985410</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://1.bp.blogspot.com/-7dw9PlYIisc/TtuORirdBtI/AAAAAAAAAYc/kr_xs7ruXrU/s220/slime.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-744605407212742108.post-6226642226150822137</id><published>2011-06-18T01:13:00.006+09:00</published><updated>2011-07-10T14:33:18.222+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='HTML5'/><category scheme='http://www.blogger.com/atom/ns#' term='Canvas'/><title type='text'>HTML5 - Canvas アニメーション　くま（１）</title><content type='html'>くまのアニメーション。端までいったら跳ね返る。なぜかブログのトップページだと、くまが消えない。。見るときは&lt;a href="http://endoyuta.blogspot.com/2011/06/html5-canvas_18.html"&gt;単一ページ&lt;/a&gt;に飛んでください。&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;canvas class="waku" height="400" id="kuma" width="400"&gt;&lt;/canvas&gt;&lt;br /&gt;&lt;script type="text/javascript"&gt;var canvas = document.getElementById("kuma");var ctx = canvas.getContext("2d");//キャラクターの最大数var PLAYER_COUNT = 5;//キャラクター画像var img_i = new Image(); img_i.src = 'http://endo-yuta.appspot.com/pic/BlueToy_32x32.png';//最大数までキャラクターのインスタンスを作成var players = new Array();for(var i=0; i&lt;PLAYER_COUNT; i++){ players[i] = new Me(ctx,img_i,0,0,i,i);}//イメージロード後にメイン関数を繰り返しimg_i.onload = function() {  setInterval(main,10);}//メイン関数function  main(){ //画面のクリア ctx.clearRect(0,0,400,400); //キャラクターのインスタンスの表示 for(var i=0; i&lt;PLAYER_COUNT; i++){  players[i].apear(); }}//主人公のオブジェクトをつくってみる//大きさ、位置、スピード、向きを持つfunction Me(ctx,img,x,y,vx,vy){ var obj = this; obj.x = x ? x : 0; obj.y = y ? y : 0; obj.vx = vx ? vx : 2; obj.vy = vy ? vy : 1;  //主人公を表示するメソッド obj.apear = function(){  ctx.drawImage(img,obj.x,obj.y);  obj.x = obj.x + obj.vx;  obj.y = obj.y + obj.vy;  //枠に到達したら折り返させる(速度の符号を反転)  if(obj.x&lt;=0||obj.x&gt;=400-18) obj.vx = -obj.vx;  if(obj.y&lt;=0||obj.y&gt;=400-30) obj.vy = -obj.vy; }}&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;&amp;lt;canvas id="kuma" width="400" height="400"&amp;gt;&amp;lt;/canvas&amp;gt;&lt;br /&gt;&amp;lt;script type="text/javascript"&amp;gt;&lt;br /&gt;var canvas = document.getElementById("kuma");&lt;br /&gt;var ctx = canvas.getContext("2d");&lt;br /&gt;&lt;br /&gt;//キャラクターの最大数&lt;br /&gt;var PLAYER_COUNT = 5;&lt;br /&gt;&lt;br /&gt;//キャラクター画像&lt;br /&gt;var img_i = new Image();&lt;br /&gt; img_i.src = 'kuma.png';&lt;br /&gt;&lt;br /&gt;//最大数までキャラクターのインスタンスを作成&lt;br /&gt;var players = new Array();&lt;br /&gt;for(var i=0; i&amp;lt;PLAYER_COUNT; i++){&lt;br /&gt; players[i] = new Me(ctx,img_i,0,0,i,i);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;//イメージロード後にメイン関数を繰り返し&lt;br /&gt;img_i.onload = function() { &lt;br /&gt; setInterval(main,10);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;//メイン関数&lt;br /&gt;function  main(){&lt;br /&gt; //画面のクリア&lt;br /&gt; ctx.clearRect(0,0,400,400);&lt;br /&gt; //キャラクターのインスタンスの表示&lt;br /&gt; for(var i=0; i&amp;lt;PLAYER_COUNT; i++){&lt;br /&gt;  players[i].apear();&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;//主人公のオブジェクトをつくってみる&lt;br /&gt;//大きさ、位置、スピード、向きを持つ&lt;br /&gt;function Me(ctx,img,x,y,vx,vy){&lt;br /&gt; var obj = this;&lt;br /&gt; obj.x = x ? x : 0;&lt;br /&gt; obj.y = y ? y : 0;&lt;br /&gt; obj.vx = vx ? vx : 2;&lt;br /&gt; obj.vy = vy ? vy : 1;&lt;br /&gt; &lt;br /&gt; //主人公を表示するメソッド&lt;br /&gt; obj.apear = function(){&lt;br /&gt;  ctx.drawImage(img,obj.x,obj.y);&lt;br /&gt;  obj.x = obj.x + obj.vx;&lt;br /&gt;  obj.y = obj.y + obj.vy;&lt;br /&gt;  //枠に到達したら折り返させる(速度の符号を反転)&lt;br /&gt;  if(obj.x&amp;lt;=0||obj.x&amp;gt;=400-18) obj.vx = -obj.vx;&lt;br /&gt;  if(obj.y&amp;lt;=0||obj.y&amp;gt;=400-30) obj.vy = -obj.vy;&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/744605407212742108-6226642226150822137?l=endoyuta.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://endoyuta.blogspot.com/feeds/6226642226150822137/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://endoyuta.blogspot.com/2011/06/html5-canvas_18.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/744605407212742108/posts/default/6226642226150822137'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/744605407212742108/posts/default/6226642226150822137'/><link rel='alternate' type='text/html' href='http://endoyuta.blogspot.com/2011/06/html5-canvas_18.html' title='HTML5 - Canvas アニメーション　くま（１）'/><author><name>endo yuta</name><uri>http://www.blogger.com/profile/05491646789675985410</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://1.bp.blogspot.com/-7dw9PlYIisc/TtuORirdBtI/AAAAAAAAAYc/kr_xs7ruXrU/s220/slime.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-744605407212742108.post-6004248643231696522</id><published>2011-06-13T22:39:00.001+09:00</published><updated>2011-07-10T14:33:55.631+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='Pac-Man'/><category scheme='http://www.blogger.com/atom/ns#' term='HTML5'/><category scheme='http://www.blogger.com/atom/ns#' term='関数'/><category scheme='http://www.blogger.com/atom/ns#' term='Monster'/><category scheme='http://www.blogger.com/atom/ns#' term='Canvas'/><title type='text'>HTML5 - Canvas パックマンのモンスターを描くJavaScript関数(2)</title><content type='html'>x,y座標ともに指定できるモンスター関数です。&lt;br /&gt;&lt;br /&gt;サンプル&lt;br /&gt;&lt;canvas height="150" id="canvas8" width="150"&gt;&lt;/canvas&gt;&lt;br /&gt;&lt;script type="text/javascript"&gt;    var canvas = document.getElementById("canvas8");    var ctx = canvas.getContext("2d");        ctx.beginPath();    ctx.arc(37,37,13,Math.PI/7,-Math.PI/7,false);    ctx.lineTo(34,37); ctx.fillStyle = "yellow";    ctx.fill();  monster2(ctx,0,70,"red"); monster2(ctx,40,60,"blue"); monster2(ctx,90,80,"#0a3");    function monster2(ctx,x,y,collor){ y = y+28; ctx.fillStyle = collor;    ctx.beginPath();    ctx.moveTo(x,y);    ctx.lineTo(x,y-14);    ctx.bezierCurveTo(x,y-22,x+6,y-28,x+14,y-28);    ctx.bezierCurveTo(x+22,y-28,x+28,y-22,x+28,y-14);    ctx.lineTo(x+28,y);    ctx.lineTo(x+23.333,y-5+0.333);    ctx.lineTo(x+18.666,y);    ctx.lineTo(x+14,y-5+0.333);    ctx.lineTo(x+9.333,y);    ctx.lineTo(x+4.666,y-5+0.333);    ctx.lineTo(x,y);    ctx.fill();    ctx.fillStyle = "white";    ctx.beginPath();    ctx.moveTo(x+8,y-20);    ctx.bezierCurveTo(x+5,y-20,x+4,y-17,x+4,y-15);    ctx.bezierCurveTo(x+4,y-13,x+5,y-10,x+8,y-10);    ctx.bezierCurveTo(x+11,y-10,x+12,y-13,x+12,y-15);    ctx.bezierCurveTo(x+12,y-17,x+11,y-20,x+8,y-20);    ctx.moveTo(x+20,y-20);    ctx.bezierCurveTo(x+17,y-20,x+16,y-17,x+16,y-15);    ctx.bezierCurveTo(x+16,y-13,x+17,y-10,x+20,y-10);    ctx.bezierCurveTo(x+23,y-10,x+24,y-13,x+24,y-15);    ctx.bezierCurveTo(x+24,y-17,x+23,y-20,x+20,y-20);    ctx.fill();    ctx.fillStyle = "black";    ctx.beginPath();    ctx.arc(x+18,y-14,2,0,Math.PI*2,true);    ctx.fill();    ctx.beginPath();    ctx.arc(x+6,y-14,2,0,Math.PI*2,true);    ctx.fill();}&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;モンスター関数(2)の使い方&lt;br /&gt;&lt;pre class="prettyprint"&gt;monster2(ctx,90,80,"#0a3");&lt;/pre&gt;&lt;br /&gt;モンスター関数(2)&lt;br /&gt;&lt;pre class="prettyprint"&gt;function monster2(ctx,x,y,collor){&lt;br /&gt; y = y+28;&lt;br /&gt; ctx.fillStyle = collor;&lt;br /&gt;    ctx.beginPath();&lt;br /&gt;    ctx.moveTo(x,y);&lt;br /&gt;    ctx.lineTo(x,y-14);&lt;br /&gt;    ctx.bezierCurveTo(x,y-22,x+6,y-28,x+14,y-28);&lt;br /&gt;    ctx.bezierCurveTo(x+22,y-28,x+28,y-22,x+28,y-14);&lt;br /&gt;    ctx.lineTo(x+28,y);&lt;br /&gt;    ctx.lineTo(x+23.333,y-5+0.333);&lt;br /&gt;    ctx.lineTo(x+18.666,y);&lt;br /&gt;    ctx.lineTo(x+14,y-5+0.333);&lt;br /&gt;    ctx.lineTo(x+9.333,y);&lt;br /&gt;    ctx.lineTo(x+4.666,y-5+0.333);&lt;br /&gt;    ctx.lineTo(x,y);&lt;br /&gt;    ctx.fill();&lt;br /&gt;    ctx.fillStyle = "white";&lt;br /&gt;    ctx.beginPath();&lt;br /&gt;    ctx.moveTo(x+8,y-20);&lt;br /&gt;    ctx.bezierCurveTo(x+5,y-20,x+4,y-17,x+4,y-15);&lt;br /&gt;    ctx.bezierCurveTo(x+4,y-13,x+5,y-10,x+8,y-10);&lt;br /&gt;    ctx.bezierCurveTo(x+11,y-10,x+12,y-13,x+12,y-15);&lt;br /&gt;    ctx.bezierCurveTo(x+12,y-17,x+11,y-20,x+8,y-20);&lt;br /&gt;    ctx.moveTo(x+20,y-20);&lt;br /&gt;    ctx.bezierCurveTo(x+17,y-20,x+16,y-17,x+16,y-15);&lt;br /&gt;    ctx.bezierCurveTo(x+16,y-13,x+17,y-10,x+20,y-10);&lt;br /&gt;    ctx.bezierCurveTo(x+23,y-10,x+24,y-13,x+24,y-15);&lt;br /&gt;    ctx.bezierCurveTo(x+24,y-17,x+23,y-20,x+20,y-20);&lt;br /&gt;    ctx.fill();&lt;br /&gt;    ctx.fillStyle = "black";&lt;br /&gt;    ctx.beginPath();&lt;br /&gt;    ctx.arc(x+18,y-14,2,0,Math.PI*2,true);&lt;br /&gt;    ctx.fill();&lt;br /&gt;    ctx.beginPath();&lt;br /&gt;    ctx.arc(x+6,y-14,2,0,Math.PI*2,true);&lt;br /&gt;    ctx.fill();&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/744605407212742108-6004248643231696522?l=endoyuta.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://endoyuta.blogspot.com/feeds/6004248643231696522/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://endoyuta.blogspot.com/2011/06/html5-canvas-javascript2.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/744605407212742108/posts/default/6004248643231696522'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/744605407212742108/posts/default/6004248643231696522'/><link rel='alternate' type='text/html' href='http://endoyuta.blogspot.com/2011/06/html5-canvas-javascript2.html' title='HTML5 - Canvas パックマンのモンスターを描くJavaScript関数(2)'/><author><name>endo yuta</name><uri>http://www.blogger.com/profile/05491646789675985410</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://1.bp.blogspot.com/-7dw9PlYIisc/TtuORirdBtI/AAAAAAAAAYc/kr_xs7ruXrU/s220/slime.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-744605407212742108.post-7633619712800903717</id><published>2011-06-13T02:52:00.001+09:00</published><updated>2011-06-13T02:54:52.793+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='Pac-Man'/><category scheme='http://www.blogger.com/atom/ns#' term='HTML5'/><category scheme='http://www.blogger.com/atom/ns#' term='関数'/><category scheme='http://www.blogger.com/atom/ns#' term='Monster'/><category scheme='http://www.blogger.com/atom/ns#' term='Canvas'/><category scheme='http://www.blogger.com/atom/ns#' term='google'/><title type='text'>HTML5 - Canvas パックマンのモンスターを描くJavaScript関数(1)</title><content type='html'>パックマンを描くスクリプトを調べてモンスター関数を作成します。&lt;br /&gt;&lt;br /&gt;xだけをインプットして、yは勝ってに決まってしまういけていないモンスター関数です。&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;サンプル&lt;/h2&gt;&lt;canvas id="canvas7" width="80" height="80"&gt;&lt;/canvas&gt;&lt;br /&gt;&lt;script type="text/javascript"&gt;    var canvas = document.getElementById("canvas7");    var ctx = canvas.getContext("2d");        monster(ctx,0,"red");    monster(ctx,30,"blue");function monster(ctx,x,collor){    ctx.fillStyle = collor;    ctx.beginPath();    ctx.moveTo(x,x+33);    ctx.lineTo(x,x+19);    ctx.bezierCurveTo(x,x+11,x+6,x+5,x+14,x+5);    ctx.bezierCurveTo(x+22,x+5,x+28,x+11,x+28,x+19);    ctx.lineTo(x+28,x+33);    ctx.lineTo(x+23.333,x+28.333);    ctx.lineTo(x+18.666,x+33);    ctx.lineTo(x+14,x+28.333);    ctx.lineTo(x+9.333,x+33);    ctx.lineTo(x+4.666,x+28.333);    ctx.lineTo(x,x+33);    ctx.fill();    ctx.fillStyle = "white";    ctx.beginPath();    ctx.moveTo(x+8,x+13);    ctx.bezierCurveTo(x+5,x+13,x+4,x+16,x+4,x+18);    ctx.bezierCurveTo(x+4,x+20,x+5,x+23,x+8,x+23);    ctx.bezierCurveTo(x+11,x+23,x+12,x+20,x+12,x+18);    ctx.bezierCurveTo(x+12,x+16,x+11,x+13,x+8,x+13);    ctx.moveTo(x+20,x+13);    ctx.bezierCurveTo(x+17,x+13,x+16,x+16,x+16,x+18);    ctx.bezierCurveTo(x+16,x+20,x+17,x+23,x+20,x+23);    ctx.bezierCurveTo(x+23,x+23,x+24,x+20,x+24,x+18);    ctx.bezierCurveTo(x+24,x+16,x+23,x+13,x+20,x+13);    ctx.fill();    ctx.fillStyle = "black";    ctx.beginPath();    ctx.arc(x+18,x+19,2,0,Math.PI*2,true);    ctx.fill();    ctx.beginPath();    ctx.arc(x+6,x+19,2,0,Math.PI*2,true);    ctx.fill();}&lt;/script&gt;&lt;br /&gt;&lt;h2&gt;モンスター関数(1)の使い方&lt;/h2&gt;&lt;pre class="prettyprint"&gt;monster(ctx,x,collor)&lt;/pre&gt;&lt;br /&gt;&lt;h2&gt;モンスター関数(1)&lt;/h2&gt;&lt;pre class="prettyprint"&gt;function monster(ctx,x,collor){&lt;br /&gt;    ctx.fillStyle = collor;&lt;br /&gt;    ctx.beginPath();&lt;br /&gt;    ctx.moveTo(x,x+33);&lt;br /&gt;    ctx.lineTo(x,x+19);&lt;br /&gt;    ctx.bezierCurveTo(x,x+11,x+6,x+5,x+14,x+5);&lt;br /&gt;    ctx.bezierCurveTo(x+22,x+5,x+28,x+11,x+28,x+19);&lt;br /&gt;    ctx.lineTo(x+28,x+33);&lt;br /&gt;    ctx.lineTo(x+23.333,x+28.333);&lt;br /&gt;    ctx.lineTo(x+18.666,x+33);&lt;br /&gt;    ctx.lineTo(x+14,x+28.333);&lt;br /&gt;    ctx.lineTo(x+9.333,x+33);&lt;br /&gt;    ctx.lineTo(x+4.666,x+28.333);&lt;br /&gt;    ctx.lineTo(x,x+33);&lt;br /&gt;    ctx.fill();&lt;br /&gt;    ctx.fillStyle = &amp;quot;white&amp;quot;;&lt;br /&gt;    ctx.beginPath();&lt;br /&gt;    ctx.moveTo(x+8,x+13);&lt;br /&gt;    ctx.bezierCurveTo(x+5,x+13,x+4,x+16,x+4,x+18);&lt;br /&gt;    ctx.bezierCurveTo(x+4,x+20,x+5,x+23,x+8,x+23);&lt;br /&gt;    ctx.bezierCurveTo(x+11,x+23,x+12,x+20,x+12,x+18);&lt;br /&gt;    ctx.bezierCurveTo(x+12,x+16,x+11,x+13,x+8,x+13);&lt;br /&gt;    ctx.moveTo(x+20,x+13);&lt;br /&gt;    ctx.bezierCurveTo(x+17,x+13,x+16,x+16,x+16,x+18);&lt;br /&gt;    ctx.bezierCurveTo(x+16,x+20,x+17,x+23,x+20,x+23);&lt;br /&gt;    ctx.bezierCurveTo(x+23,x+23,x+24,x+20,x+24,x+18);&lt;br /&gt;    ctx.bezierCurveTo(x+24,x+16,x+23,x+13,x+20,x+13);&lt;br /&gt;    ctx.fill();&lt;br /&gt;    ctx.fillStyle = &amp;quot;black&amp;quot;;&lt;br /&gt;    ctx.beginPath();&lt;br /&gt;    ctx.arc(x+18,x+19,2,0,Math.PI*2,true);&lt;br /&gt;    ctx.fill();&lt;br /&gt;    ctx.beginPath();&lt;br /&gt;    ctx.arc(x+6,x+19,2,0,Math.PI*2,true);&lt;br /&gt;    ctx.fill();&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;ちなみに&lt;a href="http://www.google.com/pacman/"&gt;googleのPac-Man&lt;/a&gt;です。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/744605407212742108-7633619712800903717?l=endoyuta.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://endoyuta.blogspot.com/feeds/7633619712800903717/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://endoyuta.blogspot.com/2011/06/html5-canvas-javascript1.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/744605407212742108/posts/default/7633619712800903717'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/744605407212742108/posts/default/7633619712800903717'/><link rel='alternate' type='text/html' href='http://endoyuta.blogspot.com/2011/06/html5-canvas-javascript1.html' title='HTML5 - Canvas パックマンのモンスターを描くJavaScript関数(1)'/><author><name>endo yuta</name><uri>http://www.blogger.com/profile/05491646789675985410</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://1.bp.blogspot.com/-7dw9PlYIisc/TtuORirdBtI/AAAAAAAAAYc/kr_xs7ruXrU/s220/slime.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-744605407212742108.post-5382558183738807853</id><published>2011-06-12T22:25:00.002+09:00</published><updated>2012-01-07T02:26:47.724+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='HTML5'/><category scheme='http://www.blogger.com/atom/ns#' term='Canvas'/><title type='text'>HTML5 -  Canvasで色々な絵をかく（ハートマークからパックマンまで）</title><content type='html'>&lt;a href="http://www.html5.jp/canvas/ref.html"&gt;Canvasリファレンス&lt;/a&gt;や、&lt;a href="https://developer.mozilla.org/ja/Canvas_tutorial/Drawing_shapes"&gt;MDC Docsというやつのチュートリアル&lt;/a&gt;を参考に色々な絵をCanvasを使って書いてみよう。下の絵は全部他のサイトからパクってきたものだよ。ちゃんとパクリ先は明示しておきますよ。パクってきたのは、上2つのサイトですよ。HTML5 Canvasを使えば、ハートマークもマンガの吹き出しも、パックマンまでJavascript1つで描けるのだ。これでJavaScriptのTimer使えば、JavaScriptだけでアニメーションがつくれるのだ。もうFlashなんて不要だ。しかし、Canvasにはアニメーション機能がないので、Timerを使いながらすべてを消して全てを一から描写するというプロセスをアニメーションのコマ数分続けなくてはいけない為、あまり膨大なアニメーションをつくるのはお勧めできないらしい。膨大ってどのくらいなのかは分かりませんが、ゲームを作ろうと思ってもちょっと難しいのではないでしょうか？といっても、&lt;a href="http://www.benjoffe.com/code/demos/canvascape/"&gt;こんなこと&lt;/a&gt;や、&lt;a href="http://andrewwooldridge.com/canvas/canvasgame001/canvasgame002.html"&gt;こんなこと&lt;/a&gt;もできるらしい！すごい。&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;線を描く&lt;/h2&gt;&lt;canvas id="canvas2" width="50" height="50"&gt;&lt;/canvas&gt;&lt;br /&gt;&lt;script type="text/javascript"&gt;    var canvas = document.getElementById("canvas2");    var ctx = canvas.getContext("2d");    ctx.beginPath();    ctx.strokeStyle = "#ff0066";    ctx.moveTo(0, 0);    ctx.lineTo(0, 40);    ctx.lineTo(40, 40);    ctx.lineTo(40, 0);    ctx.closePath();    ctx.stroke();&lt;/script&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;&amp;lt;canvas id=&amp;quot;canvas2&amp;quot; width=&amp;quot;50&amp;quot; height=&amp;quot;50&amp;quot;&amp;gt;&amp;lt;/canvas&amp;gt;&lt;br /&gt;&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;    var canvas = document.getElementById(&amp;quot;canvas2&amp;quot;);&lt;br /&gt;    var ctx = canvas.getContext(&amp;quot;2d&amp;quot;);&lt;br /&gt;    ctx.beginPath();&lt;br /&gt;    ctx.moveTo(0, 0);&lt;br /&gt;    ctx.lineTo(0, 40);&lt;br /&gt;    ctx.lineTo(40, 40);&lt;br /&gt;    ctx.lineTo(40, 0);&lt;br /&gt;    ctx.closePath();&lt;br /&gt;    ctx.stroke();&lt;br /&gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;h2&gt;四角を描く&lt;/h2&gt;&lt;canvas id="canvas3" width="50" height="50"&gt;&lt;/canvas&gt;&lt;br /&gt;&lt;script type="text/javascript"&gt;    var canvas = document.getElementById("canvas3");    var ctx = canvas.getContext("2d");    ctx.fillStyle = "#ff0066";    ctx.fillRect(0,0,40,40);&lt;/script&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;&amp;lt;canvas id=&amp;quot;canvas3&amp;quot; width=&amp;quot;50&amp;quot; height=&amp;quot;50&amp;quot;&amp;gt;&amp;lt;/canvas&amp;gt;&lt;br /&gt;&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;    var canvas = document.getElementById(&amp;quot;canvas3&amp;quot;);&lt;br /&gt;    var ctx = canvas.getContext(&amp;quot;2d&amp;quot;);&lt;br /&gt;    ctx.fillRect(0,0,40,40);&lt;br /&gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;h2&gt;ハートマークを描く&lt;/h2&gt;&lt;canvas id="canvas4" width="140" height="140"&gt;&lt;/canvas&gt;&lt;br /&gt;&lt;script type="text/javascript"&gt;    var canvas = document.getElementById("canvas4");    var ctx = canvas.getContext("2d");    ctx.beginPath();    ctx.fillStyle = "#ff0066";    ctx.moveTo(75,40);    ctx.bezierCurveTo(75,37,70,25,50,25);    ctx.bezierCurveTo(20,25,20,62.5,20,62.5);    ctx.bezierCurveTo(20,80,40,102,75,120);    ctx.bezierCurveTo(110,102,130,80,130,62.5);    ctx.bezierCurveTo(130,62.5,130,25,100,25);    ctx.bezierCurveTo(85,25,75,37,75,40);    ctx.fill();&lt;/script&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;&amp;lt;canvas id=&amp;quot;canvas4&amp;quot; width=&amp;quot;140&amp;quot; height=&amp;quot;140&amp;quot;&amp;gt;&amp;lt;/canvas&amp;gt;&lt;br /&gt;&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;    var canvas = document.getElementById(&amp;quot;canvas4&amp;quot;);&lt;br /&gt;    var ctx = canvas.getContext(&amp;quot;2d&amp;quot;);&lt;br /&gt;    ctx.beginPath();&lt;br /&gt;    ctx.moveTo(75,40);&lt;br /&gt;    ctx.bezierCurveTo(75,37,70,25,50,25);&lt;br /&gt;    ctx.bezierCurveTo(20,25,20,62.5,20,62.5);&lt;br /&gt;    ctx.bezierCurveTo(20,80,40,102,75,120);&lt;br /&gt;    ctx.bezierCurveTo(110,102,130,80,130,62.5);&lt;br /&gt;    ctx.bezierCurveTo(130,62.5,130,25,100,25);&lt;br /&gt;    ctx.bezierCurveTo(85,25,75,37,75,40);&lt;br /&gt;    ctx.fill();&lt;br /&gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;h2&gt;マンガの吹き出しを描く&lt;/h2&gt;&lt;canvas id="canvas5" width="140" height="140"&gt;&lt;/canvas&gt;&lt;br /&gt;&lt;script type="text/javascript"&gt;    var canvas = document.getElementById("canvas5");    var ctx = canvas.getContext("2d");    ctx.beginPath();    ctx.strokeStyle = "#ff0066";    ctx.moveTo(75,25);    ctx.quadraticCurveTo(25,25,25,62.5);    ctx.quadraticCurveTo(25,100,50,100);    ctx.quadraticCurveTo(50,120,30,125);    ctx.quadraticCurveTo(60,120,65,100);    ctx.quadraticCurveTo(125,100,125,62.5);    ctx.quadraticCurveTo(125,25,75,25);    ctx.stroke();&lt;/script&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;&amp;lt;canvas id=&amp;quot;canvas5&amp;quot; width=&amp;quot;140&amp;quot; height=&amp;quot;140&amp;quot;&amp;gt;&amp;lt;/canvas&amp;gt;&lt;br /&gt;&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;    var canvas = document.getElementById(&amp;quot;canvas5&amp;quot;);&lt;br /&gt;    var ctx = canvas.getContext(&amp;quot;2d&amp;quot;);&lt;br /&gt;    ctx.beginPath();&lt;br /&gt;    ctx.moveTo(75,25);&lt;br /&gt;    ctx.quadraticCurveTo(25,25,25,62.5);&lt;br /&gt;    ctx.quadraticCurveTo(25,100,50,100);&lt;br /&gt;    ctx.quadraticCurveTo(50,120,30,125);&lt;br /&gt;    ctx.quadraticCurveTo(60,120,65,100);&lt;br /&gt;    ctx.quadraticCurveTo(125,100,125,62.5);&lt;br /&gt;    ctx.quadraticCurveTo(125,25,75,25);&lt;br /&gt;    ctx.stroke();&lt;br /&gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;h2&gt;パックマンを描く&lt;/h2&gt;&lt;canvas id="canvas6" width="150" height="150"&gt;&lt;/canvas&gt;&lt;br /&gt;&lt;script type="text/javascript"&gt;    var canvas = document.getElementById("canvas6");    var ctx = canvas.getContext("2d");    roundedRect(ctx,12,12,150,150,15);    roundedRect(ctx,19,19,150,150,9);    roundedRect(ctx,53,53,49,33,10);    roundedRect(ctx,53,119,49,16,6);    roundedRect(ctx,135,53,49,33,10);    roundedRect(ctx,135,119,25,49,10);    // Character 1    ctx.beginPath();    ctx.fillStyle = "#ff0066";    ctx.arc(37,37,13,Math.PI/7,-Math.PI/7,false);    ctx.lineTo(34,37);    ctx.fill();    // blocks    for(i=0;i&lt;8;i++){      ctx.fillRect(51+i*16,35,4,4);    }    for(i=0;i&lt;6;i++){      ctx.fillRect(115,51+i*16,4,4);    }    for(i=0;i&lt;8;i++){      ctx.fillRect(51+i*16,99,4,4);    }    // character 2    ctx.beginPath();    ctx.moveTo(83,116);    ctx.lineTo(83,102);    ctx.bezierCurveTo(83,94,89,88,97,88);    ctx.bezierCurveTo(105,88,111,94,111,102);    ctx.lineTo(111,116);    ctx.lineTo(106.333,111.333);    ctx.lineTo(101.666,116);    ctx.lineTo(97,111.333);    ctx.lineTo(92.333,116);    ctx.lineTo(87.666,111.333);    ctx.lineTo(83,116);    ctx.fill();    ctx.fillStyle = "white";    ctx.beginPath();    ctx.moveTo(91,96);    ctx.bezierCurveTo(88,96,87,99,87,101);    ctx.bezierCurveTo(87,103,88,106,91,106);    ctx.bezierCurveTo(94,106,95,103,95,101);    ctx.bezierCurveTo(95,99,94,96,91,96);    ctx.moveTo(103,96);    ctx.bezierCurveTo(100,96,99,99,99,101);    ctx.bezierCurveTo(99,103,100,106,103,106);    ctx.bezierCurveTo(106,106,107,103,107,101);    ctx.bezierCurveTo(107,99,106,96,103,96);    ctx.fill();    ctx.fillStyle = "#ff0066";    ctx.beginPath();    ctx.arc(101,102,2,0,Math.PI*2,true);    ctx.fill();    ctx.beginPath();    ctx.arc(89,102,2,0,Math.PI*2,true);    ctx.fill();function roundedRect(ctx,x,y,width,height,radius){  ctx.beginPath();  ctx.moveTo(x,y+radius);  ctx.lineTo(x,y+height-radius);  ctx.quadraticCurveTo(x,y+height,x+radius,y+height);  ctx.lineTo(x+width-radius,y+height);  ctx.quadraticCurveTo(x+width,y+height,x+width,y+height-radius);  ctx.lineTo(x+width,y+radius);  ctx.quadraticCurveTo(x+width,y,x+width-radius,y);  ctx.lineTo(x+radius,y);  ctx.quadraticCurveTo(x,y,x,y+radius);  ctx.stroke();}&lt;/script&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;&amp;lt;canvas id=&amp;quot;canvas6&amp;quot; width=&amp;quot;150&amp;quot; height=&amp;quot;150&amp;quot;&amp;gt;&amp;lt;/canvas&amp;gt;&lt;br /&gt;&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;    var canvas = document.getElementById(&amp;quot;canvas6&amp;quot;);&lt;br /&gt;    var ctx = canvas.getContext(&amp;quot;2d&amp;quot;);&lt;br /&gt;    roundedRect(ctx,12,12,150,150,15);&lt;br /&gt;    roundedRect(ctx,19,19,150,150,9);&lt;br /&gt;    roundedRect(ctx,53,53,49,33,10);&lt;br /&gt;    roundedRect(ctx,53,119,49,16,6);&lt;br /&gt;    roundedRect(ctx,135,53,49,33,10);&lt;br /&gt;    roundedRect(ctx,135,119,25,49,10);&lt;br /&gt;&lt;br /&gt;    // Character 1&lt;br /&gt;    ctx.beginPath();&lt;br /&gt;    ctx.arc(37,37,13,Math.PI/7,-Math.PI/7,false);&lt;br /&gt;    ctx.lineTo(34,37);&lt;br /&gt;    ctx.fill();&lt;br /&gt;&lt;br /&gt;    // blocks&lt;br /&gt;    for(i=0;i&amp;lt;8;i++){&lt;br /&gt;      ctx.fillRect(51+i*16,35,4,4);&lt;br /&gt;    }&lt;br /&gt;    for(i=0;i&amp;lt;6;i++){&lt;br /&gt;      ctx.fillRect(115,51+i*16,4,4);&lt;br /&gt;    }&lt;br /&gt;    for(i=0;i&amp;lt;8;i++){&lt;br /&gt;      ctx.fillRect(51+i*16,99,4,4);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    // character 2&lt;br /&gt;    ctx.beginPath();&lt;br /&gt;    ctx.moveTo(83,116);&lt;br /&gt;    ctx.lineTo(83,102);&lt;br /&gt;    ctx.bezierCurveTo(83,94,89,88,97,88);&lt;br /&gt;    ctx.bezierCurveTo(105,88,111,94,111,102);&lt;br /&gt;    ctx.lineTo(111,116);&lt;br /&gt;    ctx.lineTo(106.333,111.333);&lt;br /&gt;    ctx.lineTo(101.666,116);&lt;br /&gt;    ctx.lineTo(97,111.333);&lt;br /&gt;    ctx.lineTo(92.333,116);&lt;br /&gt;    ctx.lineTo(87.666,111.333);&lt;br /&gt;    ctx.lineTo(83,116);&lt;br /&gt;    ctx.fill();&lt;br /&gt;    ctx.fillStyle = &amp;quot;white&amp;quot;;&lt;br /&gt;    ctx.beginPath();&lt;br /&gt;    ctx.moveTo(91,96);&lt;br /&gt;    ctx.bezierCurveTo(88,96,87,99,87,101);&lt;br /&gt;    ctx.bezierCurveTo(87,103,88,106,91,106);&lt;br /&gt;    ctx.bezierCurveTo(94,106,95,103,95,101);&lt;br /&gt;    ctx.bezierCurveTo(95,99,94,96,91,96);&lt;br /&gt;    ctx.moveTo(103,96);&lt;br /&gt;    ctx.bezierCurveTo(100,96,99,99,99,101);&lt;br /&gt;    ctx.bezierCurveTo(99,103,100,106,103,106);&lt;br /&gt;    ctx.bezierCurveTo(106,106,107,103,107,101);&lt;br /&gt;    ctx.bezierCurveTo(107,99,106,96,103,96);&lt;br /&gt;    ctx.fill();&lt;br /&gt;    ctx.fillStyle = &amp;quot;black&amp;quot;;&lt;br /&gt;    ctx.beginPath();&lt;br /&gt;    ctx.arc(101,102,2,0,Math.PI*2,true);&lt;br /&gt;    ctx.fill();&lt;br /&gt;    ctx.beginPath();&lt;br /&gt;    ctx.arc(89,102,2,0,Math.PI*2,true);&lt;br /&gt;    ctx.fill();&lt;br /&gt;&lt;br /&gt;function roundedRect(ctx,x,y,width,height,radius){&lt;br /&gt;  ctx.beginPath();&lt;br /&gt;  ctx.moveTo(x,y+radius);&lt;br /&gt;  ctx.lineTo(x,y+height-radius);&lt;br /&gt;  ctx.quadraticCurveTo(x,y+height,x+radius,y+height);&lt;br /&gt;  ctx.lineTo(x+width-radius,y+height);&lt;br /&gt;  ctx.quadraticCurveTo(x+width,y+height,x+width,y+height-radius);&lt;br /&gt;  ctx.lineTo(x+width,y+radius);&lt;br /&gt;  ctx.quadraticCurveTo(x+width,y,x+width-radius,y);&lt;br /&gt;  ctx.lineTo(x+radius,y);&lt;br /&gt;  ctx.quadraticCurveTo(x,y,x,y+radius);&lt;br /&gt;  ctx.stroke();&lt;br /&gt;}&lt;br /&gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/744605407212742108-5382558183738807853?l=endoyuta.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://endoyuta.blogspot.com/feeds/5382558183738807853/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://endoyuta.blogspot.com/2011/06/html5-canvas.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/744605407212742108/posts/default/5382558183738807853'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/744605407212742108/posts/default/5382558183738807853'/><link rel='alternate' type='text/html' href='http://endoyuta.blogspot.com/2011/06/html5-canvas.html' title='HTML5 -  Canvasで色々な絵をかく（ハートマークからパックマンまで）'/><author><name>endo yuta</name><uri>http://www.blogger.com/profile/05491646789675985410</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://1.bp.blogspot.com/-7dw9PlYIisc/TtuORirdBtI/AAAAAAAAAYc/kr_xs7ruXrU/s220/slime.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-744605407212742108.post-6199225604670052327</id><published>2011-06-12T14:12:00.003+09:00</published><updated>2012-01-07T02:28:12.349+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='HTML5'/><category scheme='http://www.blogger.com/atom/ns#' term='Canvas'/><title type='text'>BloggerでHTML5のCanvasのテスト</title><content type='html'>bloggerはHTML５使えるようなので、Google Chart Apiだけでなく、HTML5のCanvasで絵を書いていこうと思う。CanvasならJavaScriptのTimerを使えば簡単にアニメーションも作れるようだ。&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;とりあえずHTML5 Canvasのテスト&lt;/h2&gt;&lt;br /&gt;&lt;canvas id="canvas1" width="50" height="50"&gt;&lt;/canvas&gt;&lt;br /&gt;&lt;script type="text/javascript"&gt;    var canvas = document.getElementById("canvas1");    var context = canvas.getContext("2d");    context.fillStyle = "#ff0066";    context.fillRect(0,0,40,40);&lt;/script&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;&amp;lt;canvas id=&amp;quot;canvas1&amp;quot; width=&amp;quot;50&amp;quot; height=&amp;quot;50&amp;quot;&amp;gt;&amp;lt;/canvas&amp;gt;&lt;br /&gt;&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;    var canvas = document.getElementById(&amp;quot;canvas1&amp;quot;);&lt;br /&gt;    var context = canvas.getContext(&amp;quot;2d&amp;quot;);&lt;br /&gt;    context.fillRect(0,0,40,40);&lt;br /&gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;h2&gt;Canvasを勉強するためのサイト&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="https://developer.mozilla.org/ja/Canvas_tutorial"&gt;Canvas チュートリアル(mozilla)&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.html5.jp/canvas/index.html"&gt;Canvas(HTML5.jp)&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/744605407212742108-6199225604670052327?l=endoyuta.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://endoyuta.blogspot.com/feeds/6199225604670052327/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://endoyuta.blogspot.com/2011/06/bloggerhtml5canvas.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/744605407212742108/posts/default/6199225604670052327'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/744605407212742108/posts/default/6199225604670052327'/><link rel='alternate' type='text/html' href='http://endoyuta.blogspot.com/2011/06/bloggerhtml5canvas.html' title='BloggerでHTML5のCanvasのテスト'/><author><name>endo yuta</name><uri>http://www.blogger.com/profile/05491646789675985410</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://1.bp.blogspot.com/-7dw9PlYIisc/TtuORirdBtI/AAAAAAAAAYc/kr_xs7ruXrU/s220/slime.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-744605407212742108.post-1773435533782844950</id><published>2011-06-06T23:50:00.007+09:00</published><updated>2011-06-07T01:28:10.985+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='Chart'/><category scheme='http://www.blogger.com/atom/ns#' term='API'/><category scheme='http://www.blogger.com/atom/ns#' term='Mathematics'/><category scheme='http://www.blogger.com/atom/ns#' term='google'/><title type='text'>google chart api Visualizationでフェルマー（2次関数の包絡線）</title><content type='html'>&lt;a href="http://endoyuta.blogspot.com/2011/06/blog-post.html"&gt;フェルマー&lt;/a&gt;でやりたかったのはこれだ。フェルマーは色々なことを発見したらしいが、これもフェルマーが発見したそうだ。下記グラフに描かれているのは、61本の直線ですが、全てy=x^2のグラフ上のある点の接線であります。結果的に、y=x^2のグラフが浮かび上がってくるのだ。こういうのを包絡線ともいうらしい。&lt;br /&gt;&lt;br /&gt;y=x^2のグラフ上のある点を(a,a^2)とすると、その点の接線のy切片は、(0,-a^2)となるのだ。これはどの点をとってもそうなっているのだ！とフェルマーが発見したそうだ。すごいですね。この接線の傾きは、(a^2+a^2)/a = 2a^2/a = 2a ということで、2aになるのだ。&lt;script type="text/javascript" src="https://www.google.com/jsapi"&gt;&lt;/script&gt;&lt;br /&gt;&lt;script type="text/javascript"&gt;      google.load("visualization", "1", {packages:["corechart"]});      google.setOnLoadCallback(drawChart);      function drawChart() {        var data = new google.visualization.DataTable();        var i ;        var x;        var y;        var z = 0;        var max = 61;        var a;        var c = 0;        for(i=0; i&lt;max;i++){            data.addColumn('number', i);        }        data.addRows(max);        for (a = -30; a &lt; 31; a = a +1){          for(x = -30; x &lt; 31; x = x +1){            y = 2*a*x-a*a;            data.setValue(z, c, y);            z = z+1;          }          z=0;          c= c+1;        }        new google.visualization.LineChart(document.getElementById('chart_div4')).      draw(data, {width: 500, height: 400,vAxis: {maxValue: 10},legend:'none'});}&lt;/script&gt;&lt;div id="chart_div4"&gt;&lt;/div&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;&amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;https://www.google.com/jsapi&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;      google.load(&amp;quot;visualization&amp;quot;, &amp;quot;1&amp;quot;, {packages:[&amp;quot;corechart&amp;quot;]});&lt;br /&gt;      google.setOnLoadCallback(drawChart);&lt;br /&gt;      function drawChart() {&lt;br /&gt;        var data = new google.visualization.DataTable();&lt;br /&gt;        &lt;br /&gt;        var i ;&lt;br /&gt;        var x;&lt;br /&gt;        var y;&lt;br /&gt;        var z = 0;&lt;br /&gt;        var max = 61;&lt;br /&gt;        var a;&lt;br /&gt;        var c = 0;&lt;br /&gt;&lt;br /&gt;        for(i=0; i&amp;lt;max;i++){&lt;br /&gt;            data.addColumn('number', i);&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        data.addRows(max);&lt;br /&gt;  &lt;br /&gt;        for (a = -30; a &amp;lt; 31; a = a +1){&lt;br /&gt;          for(x = -30; x &amp;lt; 31; x = x +1){&lt;br /&gt;            y = 2*a*x-a*a;&lt;br /&gt;            data.setValue(z, c, y);&lt;br /&gt;            z = z+1;&lt;br /&gt;          }&lt;br /&gt;          z=0;&lt;br /&gt;          c= c+1;&lt;br /&gt;        }  &lt;br /&gt; &lt;br /&gt;      new google.visualization.LineChart(document.getElementById('chart_div4')).&lt;br /&gt;      draw(data, {width: 500, height: 400,vAxis: {maxValue: 10},legend:'none'});&lt;br /&gt;}&lt;br /&gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&amp;lt;div id=&amp;quot;chart_div4&amp;quot;&amp;gt;&lt;br /&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/744605407212742108-1773435533782844950?l=endoyuta.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://endoyuta.blogspot.com/feeds/1773435533782844950/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://endoyuta.blogspot.com/2011/06/google.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/744605407212742108/posts/default/1773435533782844950'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/744605407212742108/posts/default/1773435533782844950'/><link rel='alternate' type='text/html' href='http://endoyuta.blogspot.com/2011/06/google.html' title='google chart api Visualizationでフェルマー（2次関数の包絡線）'/><author><name>endo yuta</name><uri>http://www.blogger.com/profile/05491646789675985410</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://1.bp.blogspot.com/-7dw9PlYIisc/TtuORirdBtI/AAAAAAAAAYc/kr_xs7ruXrU/s220/slime.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-744605407212742108.post-2201242466692829803</id><published>2011-06-06T00:15:00.005+09:00</published><updated>2011-06-06T01:46:54.144+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='Chart'/><category scheme='http://www.blogger.com/atom/ns#' term='API'/><category scheme='http://www.blogger.com/atom/ns#' term='Mathematics'/><category scheme='http://www.blogger.com/atom/ns#' term='google'/><title type='text'>google chart api Visualizationの使い方</title><content type='html'>&lt;a href="http://code.google.com/intl/ja/apis/chart/interactive/docs/gallery/linechart.html"&gt;Visualization&lt;/a&gt;を覚えよう。やはりjavascriptを使うようだが、若干複雑になっている。&lt;br /&gt;&lt;script type="text/javascript" src="https://www.google.com/jsapi"&gt;&lt;/script&gt;&lt;br /&gt;&lt;script type="text/javascript"&gt;      google.load("visualization", "1", {packages:["corechart"]});      google.setOnLoadCallback(drawChart);      function drawChart() {        var data = new google.visualization.DataTable();        data.addColumn('string', 'Year');        data.addColumn('number', 'Sales');        data.addColumn('number', 'Expenses');        data.addRows(4);        data.setValue(0, 0, '2004');        data.setValue(0, 1, 1000);        data.setValue(0, 2, 400);        data.setValue(1, 0, '2005');        data.setValue(1, 1, 1170);        data.setValue(1, 2, 460);        data.setValue(2, 0, '2006');        data.setValue(2, 1, 860);        data.setValue(2, 2, 580);        data.setValue(3, 0, '2007');        data.setValue(3, 1, 1030);        data.setValue(3, 2, 540);        var chart = new google.visualization.LineChart(document.getElementById('chart_div'));        chart.draw(data, {width: 400, height: 240, title: 'Company Performance'});      }&lt;/script&gt;&lt;br /&gt;&lt;div id="chart_div"&gt;&lt;/div&gt;上記は最初のサンプルになっている。普通のgoogle chart apiの最初のサンプルより、ちょっと奇麗で豪華になっている。ソースは下記だ。&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;&amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;https://www.google.com/jsapi&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;    &amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;      google.load(&amp;quot;visualization&amp;quot;, &amp;quot;1&amp;quot;, {packages:[&amp;quot;corechart&amp;quot;]});&lt;br /&gt;      google.setOnLoadCallback(drawChart);&lt;br /&gt;      function drawChart() {&lt;br /&gt;        var data = new google.visualization.DataTable();&lt;br /&gt;        data.addColumn('string', 'Year');&lt;br /&gt;        data.addColumn('number', 'Sales');&lt;br /&gt;        data.addColumn('number', 'Expenses');&lt;br /&gt;        data.addRows(4);&lt;br /&gt;        data.setValue(0, 0, '2004');&lt;br /&gt;        data.setValue(0, 1, 1000);&lt;br /&gt;        data.setValue(0, 2, 400);&lt;br /&gt;        data.setValue(1, 0, '2005');&lt;br /&gt;        data.setValue(1, 1, 1170);&lt;br /&gt;        data.setValue(1, 2, 460);&lt;br /&gt;        data.setValue(2, 0, '2006');&lt;br /&gt;        data.setValue(2, 1, 860);&lt;br /&gt;        data.setValue(2, 2, 580);&lt;br /&gt;        data.setValue(3, 0, '2007');&lt;br /&gt;        data.setValue(3, 1, 1030);&lt;br /&gt;        data.setValue(3, 2, 540);&lt;br /&gt;&lt;br /&gt;        var chart = new google.visualization.LineChart(document.getElementById('chart_div'));&lt;br /&gt;        chart.draw(data, {width: 400, height: 240, title: 'Company Performance'});&lt;br /&gt;      }&lt;br /&gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&amp;lt;div id=&amp;quot;chart_div&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;/pre&gt;&lt;br /&gt;シンプルにしてみよう。&lt;br /&gt;&lt;br /&gt;&lt;script type="text/javascript"&gt;      google.load("visualization", "1", {packages:["corechart"]});      google.setOnLoadCallback(drawChart);      function drawChart() {        var data = new google.visualization.DataTable();        data.addColumn('string', 'Year');        data.addColumn('number', 'Sales');        data.addRows(4);        data.setValue(0, 0, '2004');        data.setValue(0, 1, 1000);        data.setValue(1, 0, '2005');        data.setValue(1, 1, 1170);        data.setValue(2, 0, '2006');        data.setValue(2, 1, 860);        data.setValue(3, 0, '2007');        data.setValue(3, 1, 1030);        var chart = new google.visualization.LineChart(document.getElementById('chart_div2'));        chart.draw(data, {width: 400, height: 240, title: 'Company Performance'});      }&lt;/script&gt;&lt;br /&gt;&lt;div id="chart_div2"&gt;&lt;/div&gt;&lt;br /&gt;二次関数のグラフを作ってみよう&lt;br /&gt;&lt;img src='https://chart.googleapis.com/chart?cht=tx&amp;chl=y=x^2' /&gt;&lt;script type="text/javascript"&gt;      google.load("visualization", "1", {packages:["corechart"]});      google.setOnLoadCallback(drawChart);      function drawChart() {        var data = new google.visualization.DataTable();        data.addColumn('number', 'y');                var x;        var y;        var z = 0;        var max = 1001;        data.addRows(max);          for (x = -500; x &lt; 501; x = x +1){          y = x*x;          data.setValue(z, 0, y);          z = z+1;        }         new google.visualization.LineChart(document.getElementById('chart_div3')).      draw(data, {width: 500, height: 400,vAxis: {maxValue: 10}});}&lt;/script&gt;&lt;div id="chart_div3"&gt;&lt;/div&gt;できた！すばらしい。ソースはこれ。&lt;pre class="prettyprint"&gt;&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;      google.load(&amp;quot;visualization&amp;quot;, &amp;quot;1&amp;quot;, {packages:[&amp;quot;corechart&amp;quot;]});&lt;br /&gt;      google.setOnLoadCallback(drawChart);&lt;br /&gt;      function drawChart() {&lt;br /&gt;        var data = new google.visualization.DataTable();&lt;br /&gt;        data.addColumn('number', 'y');&lt;br /&gt;        &lt;br /&gt;        var x;&lt;br /&gt;        var y;&lt;br /&gt;        var z = 0;&lt;br /&gt;        var max = 1001;&lt;br /&gt;&lt;br /&gt;        data.addRows(max);&lt;br /&gt;  &lt;br /&gt;        for (x = -500; x &amp;lt; 501; x = x +1){&lt;br /&gt;          y = x*x;&lt;br /&gt;          data.setValue(z, 0, y);&lt;br /&gt;          z = z+1;&lt;br /&gt;        }  &lt;br /&gt; &lt;br /&gt;      new google.visualization.LineChart(document.getElementById('chart_div3')).&lt;br /&gt;      draw(data, {width: 500, height: 400,vAxis: {maxValue: 10}});&lt;br /&gt;}&lt;br /&gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&amp;lt;div id=&amp;quot;chart_div3&amp;quot;&amp;gt;&lt;br /&gt;&amp;lt;/div&amp;gt;&lt;/pre&gt;これで&lt;a href="http://endoyuta.blogspot.com/2011/06/blog-post.html"&gt;フェルマー&lt;/a&gt;も作れるはずだ。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/744605407212742108-2201242466692829803?l=endoyuta.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://endoyuta.blogspot.com/feeds/2201242466692829803/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://endoyuta.blogspot.com/2011/06/google-chart-api-visualization.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/744605407212742108/posts/default/2201242466692829803'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/744605407212742108/posts/default/2201242466692829803'/><link rel='alternate' type='text/html' href='http://endoyuta.blogspot.com/2011/06/google-chart-api-visualization.html' title='google chart api Visualizationの使い方'/><author><name>endo yuta</name><uri>http://www.blogger.com/profile/05491646789675985410</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://1.bp.blogspot.com/-7dw9PlYIisc/TtuORirdBtI/AAAAAAAAAYc/kr_xs7ruXrU/s220/slime.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-744605407212742108.post-5241122727256355303</id><published>2011-06-05T23:12:00.014+09:00</published><updated>2011-06-06T01:31:37.671+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='Chart'/><category scheme='http://www.blogger.com/atom/ns#' term='API'/><category scheme='http://www.blogger.com/atom/ns#' term='Mathematics'/><category scheme='http://www.blogger.com/atom/ns#' term='google'/><title type='text'>フェルマー</title><content type='html'>せっかくだからなんかグラフにしようと思う。フェルマーが発見したのは、y=xの2乗のグラフ上のある点(a,a2乗)の接線のy切片は、-a2乗になるということだ。これはどの点をとってもそうなるらしい。google chart apiの問題は数値を0〜100しか扱えないことだ。なんとマイナスが扱えないらしい。本当か。。。それじゃあそもそもフェルマーの確認ができないじゃないか。不便な世の中だ。&lt;br /&gt;&lt;br /&gt;念のためgoogle chart apiを試してみよう。y=-3x+10という数式のグラフを作ってみよう。xは1〜10まで１ずつアップさせることにしよう。そうするとyは、7,4,1,-2,-5,......という風になる。xが4以降は残念な全部0という結果を想定している。&lt;br /&gt;&lt;br /&gt;&lt;script type="text/javascript"&gt;&lt;!--var x;var y;var z = 0.04;var txt = '';for (x = 1; x &lt; 11; x = x +1){    y = -3*x+10;    if(txt == ''){txt = y;}    else{txt = txt+','+y;}}document.write('&lt;img src="https://chart.googleapis.com/chart?chxt=x,y&amp;chxr=0,0,10|1,0,100&amp;cht=lc&amp;chs=250x125&amp;chd=t:',txt,' "/&gt;');// --&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;なんとマイナスの数値は表示されないのだ。残念だ。念のため、マイナスにならない１次関数グラフを作ってみよう。y=3x+10だ。&lt;br /&gt;&lt;br /&gt;&lt;script type="text/javascript"&gt;&lt;!--var x;var y;var z = 0.04;var txt = '';for (x = 1; x &lt; 11; x = x +1){    y = 3*x+10;    if(txt == ''){txt = y;}    else{txt = txt+','+y;}}document.write('&lt;img src="https://chart.googleapis.com/chart?chxt=x,y&amp;chxr=0,0,10|1,0,100&amp;cht=lc&amp;chs=250x125&amp;chd=t:',txt,' "/&gt;');// --&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;でも、y=-3x+10をx=10までグラフ化するだけなら、擬似的に見せることは可能だ。x=10なら、y=-20だから、y=-3x+30のグラフをプロットして、目盛をいじればいいのだ。&lt;br /&gt;&lt;br /&gt;&lt;script type="text/javascript"&gt;&lt;!--var x;var y;var txt = '';for (x = 1; x &lt; 11; x = x +1){    y = -3*x+30;    if(txt == ''){txt = y;}    else{txt = txt+','+y;}}document.write('&lt;img src="https://chart.googleapis.com/chart?chxt=x,y&amp;chxr=0,0,10|1,-20,80&amp;cht=lc&amp;chs=250x125&amp;chd=t:',txt,' "/&gt;');// --&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;上記と同じように、全ての値に50を足して 、目盛で-50すりゃいいのだ。&lt;br /&gt;&lt;br /&gt;&lt;script type="text/javascript"&gt;&lt;!--var x;var y;var txt = '';for (x = 1; x &lt; 11; x = x +1){    y = x*x+50;    if(txt == ''){txt = y;}    else{txt = txt+','+y;}}document.write('&lt;img src="https://chart.googleapis.com/chart?chxt=x,y&amp;chxr=0,0,10|1,-50,50&amp;cht=lc&amp;chs=250x125&amp;chd=t:',txt,' "/&gt;');// --&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;・・・これじゃあx=7までしか表示できない。なんて使えないapiなんだ。。こうなったら、x=-3〜3までにしよう。そりゃそうだ。そうじゃないと放物線にならないし。&lt;br /&gt;&lt;br /&gt;&lt;script type="text/javascript"&gt;&lt;!--var x;var y;var txt = '';for (x = -3; x &lt; 4; x = x +1){    y = x*x+50;    if(txt == ''){txt = y;}    else{txt = txt+','+y;}}document.write('&lt;img src="https://chart.googleapis.com/chart?chxt=x,y&amp;chxr=0,-3,3|1,-10,10&amp;cht=lc&amp;chs=250x125&amp;chd=t:',txt,' "/&gt;');// --&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;google chart apiはおらをばかにしているのか？？あくまでy軸は内部的には0-100の範囲で表示するのか？人類が使用する数字は0-100でマイナスはないと思っているのか？それとも俺がその活用法をしらないだけなのか？あるいは、何か少しでもまともに使おうとすると、もう一ランク上の&lt;a href="http://code.google.com/intl/ja/apis/chart/interactive/docs/gallery/linechart.html"&gt;Visualization&lt;/a&gt;を使う必要があるのか？？&lt;br /&gt;&lt;br /&gt;google chart apiは0-100ではなく、0-4095まで扱えるそうだ。しかしマイナスは扱えないし、4095を扱おうとすれば独自表記を覚えないといけないし、変換するプログラムを書かないといけない。これはもう速やかにVisualizationというのを覚えよう。&lt;br /&gt;&lt;br /&gt;フェルマーは、Visualizationを覚えてからだな。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/744605407212742108-5241122727256355303?l=endoyuta.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://endoyuta.blogspot.com/feeds/5241122727256355303/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://endoyuta.blogspot.com/2011/06/blog-post.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/744605407212742108/posts/default/5241122727256355303'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/744605407212742108/posts/default/5241122727256355303'/><link rel='alternate' type='text/html' href='http://endoyuta.blogspot.com/2011/06/blog-post.html' title='フェルマー'/><author><name>endo yuta</name><uri>http://www.blogger.com/profile/05491646789675985410</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://1.bp.blogspot.com/-7dw9PlYIisc/TtuORirdBtI/AAAAAAAAAYc/kr_xs7ruXrU/s220/slime.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-744605407212742108.post-3265746848311954269</id><published>2011-06-05T17:36:00.011+09:00</published><updated>2011-06-05T20:48:32.443+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='GAE'/><category scheme='http://www.blogger.com/atom/ns#' term='Chart'/><category scheme='http://www.blogger.com/atom/ns#' term='API'/><category scheme='http://www.blogger.com/atom/ns#' term='Mathematics'/><category scheme='http://www.blogger.com/atom/ns#' term='google'/><category scheme='http://www.blogger.com/atom/ns#' term='Python'/><title type='text'>Google chart apiのURLを作るJavaScript</title><content type='html'>Google chart apiのURLを作るpythonスクリプトを今日中につくるぞ。やりたいのは、超低レベルなんだけど、本当に２次関数というのは放物線を描くのかを自分でデータをつくってグラフ化して試したいのだ。一次関数が一直線なのは当たり前に分かるからな。&lt;br /&gt;&lt;br /&gt;Google chart apiはURLを決められたルールで生成し、それにアクセスすることでグラフのイメージデータが返ってくる仕組みだ。グラフの種類、色、目盛、数値などをルールに沿っていれていけばいい。getだとURLの長さが結構制限が強いみたいだけど、Postで呼び出せばその制限は緩和されるようだ。postでどうやって呼び出すのかは、今のところわかっていない。getでどの程度の数の数値データを扱えるのかも分からない。&lt;br /&gt;&lt;br /&gt;y=2x+4というのは一次関数だべよ。これは単純だ。x=0のときy=4で後は正比例のまっすぐなグラフになるのは一目瞭然だ。y=2x2(二乗）+4というのは２次関数だべよ。これはx=0のときy=4だけど、その後の動きが分からないのだ。100〜1000個くらいのデータをぶち込んで滑らかな放物線を描いてみたい。&lt;br /&gt;&lt;br /&gt;どうやらGoogle chat apiには、数値データを一個一個ぶち込む方法と、数式をぶち込む方法の２種類あるように思える。&lt;br /&gt;&lt;br /&gt;https://chart.googleapis.com/chart?cht=lc&amp;chd=t:-1&amp;chs=250x150&amp;chco=FF0000&amp;chfd=0,x,0,11,0.1,sin(x)*50%2b50&amp;chxt=x,y&lt;br /&gt;&lt;br /&gt;これは非常に短いURLだが、sin(x)*・・・・という数式めいたものが入っており、イメージ出力するとこうなる。&lt;br /&gt;&lt;br /&gt;&lt;img src="https://chart.googleapis.com/chart?cht=lc&amp;chd=t:-1&amp;chs=250x150&amp;chco=FF0000&amp;chfd=0,x,0,11,0.1,sin(x)*50%2b50&amp;chxt=x,y" /&gt;&lt;br /&gt;&lt;br /&gt;なんて便利なツールなんだ。そして奇麗な曲線が一瞬で描かれるのだ。すばらしい。&lt;br /&gt;数式でグラフを作れるのは便利だけど、俺はその数式からくるグラフが本当なのかを実感したいので、数式をインプットするのは今の俺にとっては無意味だ。だから、数式のxをずらしながら、100ないし1000のyを出して、インプットしたxとアウトプットしたyの組み合わせを100ないし、1000作るのだ。その組み合わせを元にURLを自動生成するプログラムをpythonで作るのだ。&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Google Chart APIのURLの仕組み&lt;/h3&gt;仕組みを試しながらマスターしよう。https://chart.googleapis.com/chart?が基本URLのようだ。cht=lcはチャートの種類を指定しているようだ。２次関数にせよグラフはラインチャートでOKなんで、cht=lcでOKだ。円グラフや地図の国別の色の濃さで国別シェアなんかも可視化できるようだ。今度試そう。&lt;br /&gt;&lt;br /&gt;&lt;a href="http://code.google.com/intl/ja/apis/chart/image/docs/gallery/line_charts.html"&gt;http://code.google.com/intl/ja/apis/chart/image/docs/gallery/line_charts.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;このページにいろいろと詳しい説明がのっているようだ。&lt;br /&gt;&lt;br /&gt;https://chart.googleapis.com/chart?cht=lc&amp;chs=200x125&amp;chd=t:40,60,60,45,47,75,70,72&lt;br /&gt;&lt;br /&gt;これは恐らく最もシンプルなchartApiの使いかただろう。chs=200x125というのは、画像の大きさのようだ。イメージ出力するとこうなる。&lt;br /&gt;&lt;br /&gt;&lt;img src="https://chart.googleapis.com/chart?cht=lc&amp;chs=200x125&amp;chd=t:40,60,60,45,47,75,70,72" /&gt;&lt;br /&gt;&lt;br /&gt;ためしに、chs=500x250にするとこうなる。&lt;br /&gt;&lt;br /&gt;&lt;img src="https://chart.googleapis.com/chart?cht=lc&amp;chs=500x250&amp;chd=t:40,60,60,45,47,75,70,72" /&gt;&lt;br /&gt;&lt;br /&gt;chd=t:40,60,60,45,47,75,70,72というのは、数値データそのものだ。８個あるとおり、グラフの点も8個あるのだ。t:というのはよくわからないので後で調べよう。これはすなわちy軸の数値データであり、x軸の数値データは記載がない。xは一定間隔という前提で、yの値のみインプットしているのだ。二次関数のグラフの形を確認するにあたっては、xの値を明示する必要がないから、はっきりいって、このシンプルな形態にそって、データを1000個いれさえすれば終わりだ。なんて簡単なんだ。xが-500〜500まで（1刻み）のyをプロットすればいいのだ。こういうのをきっとプロットというのだろう。&lt;br /&gt;&lt;br /&gt;まあpythonで作るのは結構なことだけど、javascriptでつくっちゃえば、このBlog上で全てを完結できるので、せっかくだから、javascriptでやるか。まずはy=x２乗を出すぞ。&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;&amp;lt;!--&lt;br /&gt;var x;&lt;br /&gt;var y;&lt;br /&gt;var txt = '';&lt;br /&gt;&lt;br /&gt;for (x = -500; x &amp;lt; 501; x = x +1){&lt;br /&gt;    y = x*x;&lt;br /&gt;    if(txt == ''){txt = y;}&lt;br /&gt;    else{txt = txt+','+y;}&lt;br /&gt;}&lt;br /&gt;document.write('&amp;lt;img src=&amp;quot;https://chart.googleapis.com/chart?cht=lc&amp;amp;chs=500x250&amp;amp;chd=t:',txt,' &amp;quot;/&amp;gt;');&lt;br /&gt;// --&amp;gt;&lt;br /&gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;これで1000個のデータをプロットしてみたけど、エラーになった。&lt;br /&gt;too largeだそうだ。ということは数を減らしてみよう。そして、postでアクセスする方法も調べよう。&lt;br /&gt;&lt;br /&gt;&lt;script type="text/javascript"&gt;&lt;!--var x;var y;var txt = '';for (x = -150; x &lt; 151; x = x +1){    y = x*x;    if(txt == ''){txt = y;}    else{txt = txt+','+y;}}document.write('&lt;img src="https://chart.googleapis.com/chart?cht=lc&amp;chs=500x250&amp;chd=t:',txt,' "/&gt;');// --&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;300個のデータならいけるらしい。上記はxが-150〜150までの、y=x2乗のグラフだ。しかし、何か天井にひっかかっているようだ。嘘のグラフを表示するとは何事。。恐らく、目盛を明示しないとこういったバグが生じるんだろう。最大数値を150*150=22500を与えれば天井のつっかかりはなくなるはずだ。&lt;br /&gt;&lt;br /&gt;&lt;script type="text/javascript"&gt;&lt;!--var x;var y;var txt = '';for (x = -150; x &lt; 151; x = x +1){    y = x*x;    if(txt == ''){txt = y;}    else{txt = txt+','+y;}}document.write('&lt;img src="https://chart.googleapis.com/chart?chxt=x,y&amp;chxr=0,-150,150|1,0,22500&amp;cht=lc&amp;chs=500x250&amp;chd=t:',txt,' "/&gt;');// --&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;なくならない。理由が分かった。google chart apiは数字は0-100までしか扱えないらしい。100以上は100として扱うらしい。よって、天井ができるのだ。。。めんどうだ。扱う数値は、係数100/22500をかけることにしよう。&lt;br /&gt;&lt;br /&gt;100/22500の係数をかけると、数字１つ１つの文字列数が多くなるので、エラーになる。数字の数で制限してるわけではなく、URLの長さで制限しているからだ。POSTでどの程度緩和されるのか分からないけど、結構めんどうな仕組みだ。よって、-50〜50のxを元に、グラフを作った。yは、0.04 の係数をかけて出している。よって、x=50のときのy2500が100になるのだ。&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;&amp;lt;!--&lt;br /&gt;var x;&lt;br /&gt;var y;&lt;br /&gt;var z = 0.04;&lt;br /&gt;var txt = '';&lt;br /&gt;&lt;br /&gt;for (x = -50; x &amp;lt; 51; x = x +1){&lt;br /&gt;    y = x*x*z;&lt;br /&gt;    if(txt == ''){txt = y;}&lt;br /&gt;    else{txt = txt+','+y;}&lt;br /&gt;}&lt;br /&gt;document.write('&amp;lt;img src=&amp;quot;https://chart.googleapis.com/chart?chxt=x,y&amp;amp;chxr=0,-50,50|1,0,100&amp;amp;cht=lc&amp;amp;chs=500x250&amp;amp;chd=t:',txt,' &amp;quot;/&amp;gt;');&lt;br /&gt;// --&amp;gt;&lt;br /&gt;&amp;lt;/script&amp;gt;&lt;/pre&gt;&lt;br /&gt;&lt;img src='https://chart.googleapis.com/chart?cht=tx&amp;chl=y=0.04x^2' /&gt;&lt;br /&gt;&lt;script type="text/javascript"&gt;&lt;!--var x;var y;var z = 0.04;var txt = '';for (x = -50; x &lt; 51; x = x +1){    y = x*x*z;    if(txt == ''){txt = y;}    else{txt = txt+','+y;}}document.write('&lt;img src="https://chart.googleapis.com/chart?chxt=x,y&amp;chxr=0,-50,50|1,0,100&amp;cht=lc&amp;chs=500x250&amp;chd=t:',txt,' "/&gt;');// --&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Google Chart ApiをPOSTで使う&lt;/h3&gt;POSTで使う方法は&lt;a href="http://code.google.com/intl/ja/apis/chart/image/docs/post_requests.html"&gt;ここ&lt;/a&gt;に詳細が載っている。&lt;br /&gt;&lt;br /&gt;GETで使う場合は超お手軽だが、2kしか許されない。POSTは若干めんどくさいが、16Kまで許されるのだ。URLの長さが8倍までいいってことだろう。また数字を短縮する独自の表記法もあるようで、それを使えばもっとたくさんのデータを扱ってグラフを作ることができるだろう。ただ独自の表記を覚えるのがめんどくさそうだし、小数点以下にも対応していなそうだ。（多分）&lt;br /&gt;&lt;br /&gt;pythonでPNGを吐き出すchart.pyをつくって、htmlから&amp;lt;img src=&amp;quot;chart.py&amp;quot; /&amp;gt;というように使うのだ。&lt;br /&gt;これなら入力値に応じたグラフをリアルタイムに表示することも可能だ。データも8倍使えるしな。でもいずれにせよ制限があるから、使い方によっては、matplotlibのがやっぱりいいのかもしれない。ただ、GAEでmatplotlibが使えるのかは不明だ。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/744605407212742108-3265746848311954269?l=endoyuta.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://endoyuta.blogspot.com
