<?xml version="1.0" encoding="UTF-8" ?>
<feed xml:lang="ja" xmlns="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:thr="http://purl.org/syndication/thread/1.0">
  <title type="text">WEBプログラミング</title>
  <subtitle type="html">適当に調べたことを適当に書きます。</subtitle>
  <link rel="self" type="application/atom+xml" href="https://echophp.blog.shinobi.jp/atom"/>
  <link rel="alternate" type="text/html" href="https://echophp.blog.shinobi.jp/"/>
  <updated>2007-06-02T03:26:53+09:00</updated>
  <author><name>0</name></author>
  <generator uri="//www.ninja.co.jp/blog/" version="0.9">忍者ブログ</generator>
  <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" />
  <entry>
    <id>echophp.blog.shinobi.jp://entry/6</id>
    <link rel="alternate" type="text/html" href="https://echophp.blog.shinobi.jp/php/php%E3%81%AE%E3%83%A1%E3%83%A2%E3%83%AA%E8%A7%A3%E6%94%BE%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6" />
    <published>2007-07-15T03:18:49+09:00</published> 
    <updated>2007-07-15T03:18:49+09:00</updated> 
    <category term="PHP" label="PHP" />
    <title>PHPのメモリ解放について</title>
    <content mode="escaped" type="text/html" xml:lang="utf-8"> 
      <![CDATA[<pre><br />
&lt;?php<br />
class a {<br />
    public function __construct() {<br />
        <span style="color:#DD0000">//局所変数はメソッドが終わったらメモリが解放される</span><br />
        $var = str_repeat("1234567890", 1024);<br />
        <span style="color:#DD0000">//メンバ変数に10KBセット</span><br />
        $this->var1 = str_repeat("1234567890", 1024);<br />
        <span style="color:#DD0000">//メンバ変数に10KBセット</span><br />
        $this->var2 = str_repeat("1234567890", 1024);<br />
<br />
        <span style="color:#DD0000">//2行目（30KB+αが増えている）</span><br />
        echo memory_get_usage() . "\n";<br />
<br />
        <span style="color:#DD0000">//$this->var2の値を$this->var3に参照渡し</span><br />
        $this->var3 =& $this->var2;<br />
        <span style="color:#DD0000">//3行目（リファレンス渡しの為メモリ使用量が少ない）</span><br />
        echo memory_get_usage() . "\n";<br />
<br />
        <span style="color:#DD0000">//$this->var2の値を$this->var4にコピー</span><br />
        $this->var4 = $this->var2;<br />
        <span style="color:#DD0000">//4行目（コピーの場合はメモリが10KB増える）</span><br />
        echo memory_get_usage() . "\n";<br />
    }<br />
<br />
    public function set() {<br />
        $this->var1 .= str_repeat("1234567890", 1024);<br />
    }<br />
<br />
    public function sub() {<br />
        $this->var1 = str_repeat("1234567890", 1024);<br />
    }<br />
}<br />
<br />
<span style="color:#DD0000">//1行目 (メモリの初期値)</span><br />
echo memory_get_usage() . "\n";<br />
<br />
<span style="color:#DD0000">//5行目 (局所変数分のメモリが解放されている）</span><br />
$a = new a;<br />
echo memory_get_usage() . "\n";<br />
<br />
<span style="color:#DD0000">//6行目 (増やした分だけ増える)</span><br />
$a->set();<br />
echo memory_get_usage() . "\n";<br />
<br />
<span style="color:#DD0000">//7行目（減った分だけ解放する）</span><br />
$a->sub();<br />
echo memory_get_usage() . "\n";<br />
<br />
<span style="color:#DD0000">//8行目（$this->var1のメモリが解放される）</span><br />
unset($a->var1);<br />
echo memory_get_usage() . "\n";<br />
<br />
<span style="color:#DD0000">//9行目（var3があるためメモリは解放されない)</span><br />
unset($a->var2);<br />
echo memory_get_usage() . "\n";<br />
<br />
<span style="color:#DD0000">//10行目（参照元がなくなった為メモリが解放される)</span><br />
unset($a->var3);<br />
echo memory_get_usage() . "\n";<br />
</pre><br />
<br />
出力結果：<br />
<br />
60216<br />
91776<br />
91840<br />
102144<br />
91472<br />
101736<br />
91496<br />
81240<br />
81240<br />
70984<br />
]]> 
    </content>
    <author>
            <name>0</name>
        </author>
  </entry>
  <entry>
    <id>echophp.blog.shinobi.jp://entry/5</id>
    <link rel="alternate" type="text/html" href="https://echophp.blog.shinobi.jp/php/%E5%85%B1%E6%9C%89%E3%83%A1%E3%83%A2%E3%83%AA%E9%96%A2%E6%95%B0-shmop-%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%BF%E3%82%8B" />
    <published>2007-07-04T03:01:12+09:00</published> 
    <updated>2007-07-04T03:01:12+09:00</updated> 
    <category term="PHP" label="PHP" />
    <title>共有メモリ関数(shmop)を使ってみる</title>
    <content mode="escaped" type="text/html" xml:lang="utf-8"> 
      <![CDATA[最近ではmemcachedなどが持て囃されているが、共有メモリもなかなか扱いやすい。<br />
memcachedと違うところはIDにstringではなくintが必要なところでしょうか。<br />
また、cache_limitのような設定もない。<br />
<br />
今回は共有メモリ関数、shmopを使って簡単なカウンターを作ってみた。<br />
<br />
<a href="//echophp.blog.shinobi.jp/File/shm.php">カウンタープログラム</a><br />
<a href="//echophp.blog.shinobi.jp/File/shm.inc">カウンタークラス</a><br />
<a href="//echophp.blog.shinobi.jp/File/shm_f.inc">カウンタークラス（ファイル版）</a><br />
<br />
簡単にファイル版も作成して比べたところでは倍ほど早くなるようだ。<br />
思ったよりは遅かった。<br />
<br />
#当然メモリなのでどこかでファイル保存させる処理が必要になる。<br />
<br />
tmpデータやsessionデータなど、上手く使えば高速で簡単な処理が可能になりそう？<br />
<br />
ちなみにこのshmop系はデフォルトでは使えない。<br />
コンフィギュアオプションを設定する必要がある。(PHP5.2.x）<br /><a href="https://echophp.blog.shinobi.jp/php/%E5%85%B1%E6%9C%89%E3%83%A1%E3%83%A2%E3%83%AA%E9%96%A2%E6%95%B0-shmop-%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%BF%E3%82%8B" target="_blank">つづきはこちら</a>]]> 
    </content>
    <author>
            <name>0</name>
        </author>
  </entry>
  <entry>
    <id>echophp.blog.shinobi.jp://entry/4</id>
    <link rel="alternate" type="text/html" href="https://echophp.blog.shinobi.jp/%E6%9C%AA%E9%81%B8%E6%8A%9E/%E5%90%84%E8%A8%80%E8%AA%9E%E3%81%AE%E9%80%9F%E5%BA%A6%E3%81%AA%E3%81%A9%E3%81%AE%E3%83%99%E3%83%B3%E3%83%81%E3%83%9E%E3%83%BC%E3%82%AF" />
    <published>2007-06-30T03:32:31+09:00</published> 
    <updated>2007-06-30T03:32:31+09:00</updated> 
    <category term="未選択" label="未選択" />
    <title>各言語の速度などのベンチマーク</title>
    <content mode="escaped" type="text/html" xml:lang="utf-8"> 
      <![CDATA[<a href="http://module.jp/blog/cgi_php_servlet_modeprl_benchmark.html">http://module.jp/blog/cgi_php_servlet_modeprl_benchmark.html</a><br />
<a href="http://memo.blogdns.net/abench.html">http://memo.blogdns.net/abench.html</a><br />
<a href="http://ryuichi.jp/computer_memo/etc/template_time_match/">http://ryuichi.jp/computer_memo/etc/template_time_match/</a><br />
<a href="http://homepage3.nifty.com/hippo2000/perltips/phpperl.htm">http://homepage3.nifty.com/hippo2000/perltips/phpperl.htm</a><br />
<a href="http://homepage3.nifty.com/hippo2000/perltips/javaperl.htm">http://homepage3.nifty.com/hippo2000/perltips/javaperl.htm</a><br />
<br />
いろんな場面でPHPかperlかJAVAかRubyか・・・・なんて疑問が沸いてきますよね。<br />
うちの会社にはPHP perl ApacheModule C　の４タイプでしょうか。<br />
どれにも一長一短があるように思えます。<br />
<br />
例えばPHPは取り扱いが容易です。<br />
また、必要になりそうな機能の多くがネイティブ関数で用意されているのが魅力の一つです。<br />
<br />
PerlもCPANを利用するなどで簡素に書くことが出来ますが、汎用的なものを多く使うほど重くなってしまうように思えます。（個人的に）<br />
<br />
ApacheModuleは超高速ではありますが、拡張性がPHPやPerlに比べれば格段に落ちます。<br />
Cも同じですね。<br />
<br />
私は普段PHPを主に使っていますし、Perlはここ数年書いてもいません。<br />
ちょっとmod_perl2で書いてみたいなーと思ってはいるのですが、ブランクがアレで。<br />
次回のプロジェクトは久しぶりにperlで書いてみようかな。<br />
<br />
そんな訳で、用途に合わせて使い分けるのが一番いいかなと思います。<br />
<br />
まあ、どちらかに精通することが大切なのかも知れませんね。<br />
更に突き詰めればCだとかアセンブラだとか、キリがないですし。<br />
そんな話をしていると、FileSystemを作ろうとか、CPUを数百個並列に・・・なんて話になっていきます。<br />]]> 
    </content>
    <author>
            <name>0</name>
        </author>
  </entry>
  <entry>
    <id>echophp.blog.shinobi.jp://entry/3</id>
    <link rel="alternate" type="text/html" href="https://echophp.blog.shinobi.jp/php/php%E3%81%AE%E9%80%A3%E6%83%B3%E9%85%8D%E5%88%97" />
    <published>2007-06-30T03:07:42+09:00</published> 
    <updated>2007-06-30T03:07:42+09:00</updated> 
    <category term="PHP" label="PHP" />
    <title>PHPの連想配列</title>
    <content mode="escaped" type="text/html" xml:lang="utf-8"> 
      <![CDATA[PHPの連想配列は、順序リストを持つと言う特性があります。<br />
ハッシュデータは順序について意識しないという言語が多いと思いますので、結構珍しいのです。<br />
<br />
%a = ('A'=&gt;1.'B'=&gt;2);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //順番はわからない(perl)<br />
$a&nbsp; = array('A'=&gt;1,'B'=&gt;2);//左から順番に<br />
<br />
なので、each関数などを使うと順序どおりに出てきます。<br />
個人的にこの法則を使ったことはないですが、処理的にはライトウェイトになりそうな予感です。]]> 
    </content>
    <author>
            <name>0</name>
        </author>
  </entry>
  <entry>
    <id>echophp.blog.shinobi.jp://entry/2</id>
    <link rel="alternate" type="text/html" href="https://echophp.blog.shinobi.jp/javascript/%E3%83%89%E3%83%A9%E3%82%B0%E3%82%A2%E3%83%B3%E3%83%89%E3%83%89%E3%83%AD%E3%83%83%E3%83%97%E3%80%80d-d%E3%80%80%E3%83%89%E3%83%A9%E3%83%83%E3%82%B0-%E3%83%89%E3%83%AD%E3%83%83%E3%83%97" />
    <published>2007-06-04T03:29:11+09:00</published> 
    <updated>2007-06-04T03:29:11+09:00</updated> 
    <category term="javascript" label="javascript" />
    <title>ドラグアンドドロップ　D&amp;D　ドラッグ&amp;ドロップ</title>
    <content mode="escaped" type="text/html" xml:lang="utf-8"> 
      <![CDATA[<p>こんなのを書いてみた。<br />
------------------------------------------------------<br />
var startDD = function(targetObj) {<br />
&nbsp;DDFunctions.start(targetObj);<br />
};</p>
<p>DragAndDropClass = function() {};</p>
<p>DragAndDropClass.prototype = {<br />
&nbsp;targetObj&nbsp;: null,</p>
<p>&nbsp;start&nbsp;&nbsp;: function(targetObj) {<br />
&nbsp;&nbsp;if (!targetObj) {<br />
&nbsp;&nbsp;&nbsp;return;<br />
&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;var w = StyleFunctions.setWidth(targetObj);</p>
<p>&nbsp;&nbsp;//ターゲットをbody直下に変更<br />
&nbsp;&nbsp;var tmpObj = document.createElement(targetObj.tagName);<br />
&nbsp;&nbsp;tmpObj = targetObj;<br />
&nbsp;&nbsp;tmpObj.id = Math.floor(Math.random() * 9999999999);<br />
&nbsp;&nbsp;document.body.appendChild(tmpObj);</p>
<p>&nbsp;&nbsp;//元のオブジェクトは削除<br />
&nbsp;&nbsp;delete targetObj;</p>
<p>&nbsp;&nbsp;this.targetObj&nbsp;= document.getElementById(tmpObj.id);<br />
&nbsp;&nbsp;this.targetObj.style.width = w;</p>
<p>&nbsp;&nbsp;StyleFunctions.setAlpha(40, this.targetObj);<br />
&nbsp;&nbsp;//IEのselectを非表示にする<br />
&nbsp;&nbsp;StyleFunctions.hiddenSelect('hidden');</p>
<p>&nbsp;&nbsp;if(window.attachEvent){<br />
&nbsp;&nbsp;&nbsp;document.onmousemove&nbsp;= this.drag;<br />
&nbsp;&nbsp;&nbsp;document.onmouseup&nbsp;&nbsp;= this.drop;<br />
&nbsp;&nbsp;} else {<br />
&nbsp;&nbsp;&nbsp;document.addEventListener(&quot;mousemove&quot;, this.drag,&nbsp; false);<br />
&nbsp;&nbsp;&nbsp;document.addEventListener(&quot;mouseup&quot;,&nbsp;&nbsp; this.drop,&nbsp; false);<br />
&nbsp;&nbsp;}<br />
&nbsp;},</p>
<p>&nbsp;drag&nbsp;&nbsp;: function(e) {<br />
&nbsp;&nbsp;e = e || window.event;<br />
&nbsp;&nbsp;if(DDFunctions.targetObj){<br />
&nbsp;&nbsp;&nbsp;DDFunctions.targetObj.style.position&nbsp;= &quot;absolute&quot;;<br />
&nbsp;&nbsp;&nbsp;DDFunctions.targetObj.style.left&nbsp;&nbsp;= e.clientX + MouseFunctions.getX(DDFunctions.targetObj) + &quot;px&quot;;<br />
&nbsp;&nbsp;&nbsp;DDFunctions.targetObj.style.top&nbsp;&nbsp;= e.clientY + MouseFunctions.getY(DDFunctions.targetObj) + &quot;px&quot;;<br />
&nbsp;&nbsp;} else {<br />
&nbsp;&nbsp;&nbsp;DDFunctions.drop();<br />
&nbsp;&nbsp;}<br />
&nbsp;},</p>
<p>&nbsp;drop&nbsp;&nbsp;: function() {<br />
&nbsp;&nbsp;StyleFunctions.setAlpha(100, DDFunctions.targetObj);<br />
&nbsp;&nbsp;DDFunctions.targetObj&nbsp;= null;<br />
&nbsp;&nbsp;StyleFunctions.hiddenSelect('visible');</p>
<p>&nbsp;&nbsp;//重いから消す<br />
&nbsp;&nbsp;if(window.attachEvent){<br />
&nbsp;&nbsp;&nbsp;document.onmousemove&nbsp;= null;<br />
&nbsp;&nbsp;&nbsp;document.onmouseup&nbsp;&nbsp;= null;<br />
&nbsp;&nbsp;} else {<br />
&nbsp;&nbsp;&nbsp;document.removeEventListener(&quot;mousemove&quot;, DDFunctions.drag,&nbsp; false);<br />
&nbsp;&nbsp;&nbsp;document.removeEventListener(&quot;mouseup&quot;,&nbsp;&nbsp; DDFunctions.drop,&nbsp; false);<br />
&nbsp;&nbsp;}<br />
&nbsp;}<br />
};</p>
<p><br />
var MouseClass = function(){};</p>
<p>MouseClass.prototype = {<br />
&nbsp;getX&nbsp;&nbsp;: function(obj) {<br />
&nbsp;&nbsp;//親と子がどちらも動く場合。でもちょっとおかしいか。<br />
&nbsp;&nbsp;var x = obj.parentNode.style.left;<br />
&nbsp;&nbsp;//pxなどの単位を消す。<br />
&nbsp;&nbsp;x = (x) ? x.replace(/[^0-9]/,'') : 0;<br />
&nbsp;&nbsp;x= MouseFunctions.getScrollX() - parseInt(x);<br />
&nbsp;&nbsp;return x;<br />
&nbsp;},</p>
<p>&nbsp;getY&nbsp;&nbsp;: function(obj) {<br />
&nbsp;&nbsp;//親と子がどちらも動く場合。でもちょっとおかしいか。<br />
&nbsp;&nbsp;var y = obj.parentNode.style.top;<br />
&nbsp;&nbsp;//pxなどの単位を消す。<br />
&nbsp;&nbsp;y = (y) ? y.replace(/[^0-9]/,'') : 0;<br />
&nbsp;&nbsp;return MouseFunctions.getScrollY() - parseInt(y);<br />
&nbsp;},</p>
<p>&nbsp;getScrollX&nbsp;&nbsp;: function(){<br />
&nbsp;&nbsp;var x;<br />
&nbsp;&nbsp;try{<br />
&nbsp;&nbsp;&nbsp;x = document.body.scrollLeft || document.documentElement.scrollLeft;<br />
&nbsp;&nbsp;}catch(e) {<br />
&nbsp;&nbsp;&nbsp;x = self.pageXOffset;<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;return x;<br />
&nbsp;},</p>
<p>&nbsp;getScrollY&nbsp;&nbsp;: function(){<br />
&nbsp;&nbsp;var y;<br />
&nbsp;&nbsp;try{<br />
&nbsp;&nbsp;&nbsp;y = document.body.scrollTop || document.documentElement.scrollTop;<br />
&nbsp;&nbsp;} catch(e) {<br />
&nbsp;&nbsp;&nbsp;y = self.pageYOffset;<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;return y;<br />
&nbsp;}<br />
};</p>
<p>var StyleClass = function(){};</p>
<p>StyleClass.prototype = {<br />
&nbsp;setWidth&nbsp;: function(targetObj) {<br />
&nbsp;&nbsp;var width = '';<br />
&nbsp;&nbsp;//IE<br />
&nbsp;&nbsp;if (targetObj.currentStyle) {<br />
&nbsp;&nbsp;&nbsp;width = targetObj.currentStyle['width'];<br />
&nbsp;&nbsp;//FF<br />
&nbsp;&nbsp;} else if(document.defaultView) {<br />
&nbsp;&nbsp;&nbsp;width = document.defaultView.getComputedStyle(targetObj, '').getPropertyValue('width');<br />
&nbsp;&nbsp;//最上位<br />
&nbsp;&nbsp;} else {<br />
&nbsp;&nbsp;&nbsp;return 'auto';<br />
&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;//widthが設定されていなければ再帰<br />
&nbsp;&nbsp;if ((!width || width == 'auto')) {<br />
&nbsp;&nbsp;&nbsp;return this.setWidth(targetObj.parentNode);<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;return width;<br />
&nbsp;},<br />
&nbsp;hiddenSelect&nbsp;: function(value) {<br />
&nbsp;&nbsp;return;<br />
&nbsp;&nbsp;is_ie = 0;<br />
&nbsp;&nbsp;ie_version = 7;<br />
&nbsp;&nbsp;//IE6以下はSELECTタグがおかしいからこれが必要になりそう<br />
&nbsp;&nbsp;if (is_ie &amp;&amp; ie_version &lt; 7){<br />
&nbsp;&nbsp;&nbsp;var selectLists = document.getElementsByTagName('select');<br />
&nbsp;&nbsp;&nbsp;var selectLen&nbsp;&nbsp; = selectLists.length;<br />
&nbsp;&nbsp;&nbsp;for (var i = 0; i &lt; selectLen; i++) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; selectLists[i].style.visibility = value;<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;}<br />
&nbsp;},</p>
<p>&nbsp;setAlpha&nbsp;&nbsp;: function(n, obj) {<br />
&nbsp;&nbsp;try {<br />
&nbsp;&nbsp;&nbsp;obj.style.filter&nbsp;&nbsp;&nbsp;&nbsp;= 'alpha(opacity=' + n + ')';<br />
&nbsp;&nbsp;&nbsp;obj.targetObj.style.MozOpacity&nbsp;= n / 100;<br />
&nbsp;&nbsp;&nbsp;obj.targetObj.style.opacity&nbsp;&nbsp;= n / 100;<br />
&nbsp;&nbsp;} catch(e){}<br />
&nbsp;}<br />
};</p>
<p><br />
var DDFunctions&nbsp;= new DragAndDropClass();<br />
var MouseFunctions&nbsp;= new MouseClass();<br />
var StyleFunctions&nbsp;= new StyleClass();<br />
------------------------------------------------------<br />
<br />
うーん。あまりよろしくない。<br />
Javascriptのオブジェクトをもっと勉強しようと思った。<br />
<br />
上のを&lt;script src=&quot;&quot;&gt;&lt;/script&gt;で読んで動かしたいタグに onmousedown=&quot;startDD (this)&quot;と書けば動く。<br />
うーん。</p>]]> 
    </content>
    <author>
            <name>0</name>
        </author>
  </entry>
  <entry>
    <id>echophp.blog.shinobi.jp://entry/1</id>
    <link rel="alternate" type="text/html" href="https://echophp.blog.shinobi.jp/php/%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E5%86%85%E3%81%AE%E8%A1%8C%E6%95%B0%E3%82%92%E8%AA%BF%E3%81%B9%E3%82%8B" />
    <published>2007-06-02T03:27:13+09:00</published> 
    <updated>2007-06-02T03:27:13+09:00</updated> 
    <category term="PHP" label="PHP" />
    <title>ファイル内の行数を調べる</title>
    <content mode="escaped" type="text/html" xml:lang="utf-8"> 
      <![CDATA[<br />
---------------------------------------------------&nbsp;<br />
$c=0;<br />
&nbsp;$fp = fopen(&quot;index.html&quot;,&quot;r&quot;);<br />
&nbsp;while($d = fgets($fp,1)){$c++;}<br />
&nbsp;fclose($fp);<br />
---------------------------------------------------&nbsp;<br />
<br />
---------------------------------------------------&nbsp;<br />
$c = count(file('index.html'));<br />
---------------------------------------------------&nbsp;<br />
<br />
---------------------------------------------------&nbsp;<br />
exec(&quot;wc -l index.html&quot;,$c);<br />
---------------------------------------------------&nbsp;<br />
<br />
どれが早い？<br />
<br />
<br />]]> 
    </content>
    <author>
            <name>0</name>
        </author>
  </entry>
</feed>