<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>laobubu博客</title>
	<atom:link href="http://blog.laobubu.net/feed" rel="self" type="application/rss+xml" />
	<link>http://blog.laobubu.net</link>
	<description>自己的博客，写自己的东西</description>
	<lastBuildDate>Mon, 30 Apr 2012 15:10:52 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>简单J2ME起步.E01+E02.编程环境的准备以及一个示例程序</title>
		<link>http://blog.laobubu.net/600</link>
		<comments>http://blog.laobubu.net/600#comments</comments>
		<pubDate>Mon, 30 Apr 2012 15:10:52 +0000</pubDate>
		<dc:creator>laobubu</dc:creator>
				<category><![CDATA[代码笔记和片段]]></category>
		<category><![CDATA[其他作品]]></category>
		<category><![CDATA[自己动手教程]]></category>
		<category><![CDATA[J2ME]]></category>
		<category><![CDATA[简单J2ME起步]]></category>

		<guid isPermaLink="false">http://blog.laobubu.net/?p=600</guid>
		<description><![CDATA[这次我试试看使用图片做教程，当然某些图片下面也有一些注释或链接。手机读者就先加个书签或记得 blog.laobubu.net 以后再看吧。 E01 编程环境的准备 先准备好工具和测试环境再开始编程。 用到的东西有： WTK （http://www.oracle.com/technetwork/java/download-135801.html ） JDK（Windows x86 或者访问 这里有其他版本） Eclipse IDE 给Java开发者的版本 （Windows 32-bit Indigo 或者 查看Indigo其他版本） EclipseME （http://sourceforge.net/projects/eclipseme/files/latest/download） 下面内容会有点儿啰嗦，抱歉哈 E02 一个示例程序 先准备好工具和测试环境再开始编程。 要下载的东西有： 示例工程A01_HelloWorld源代码包（A01_HelloWorld.zip ） 可以参考看看的东西： 良葛格學習筆記（靜態語言 Java 那里 ） 这里就靠大家先摸索了。]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;"><img src="http://static1.laobubu.net/images/j2meinto/title.png" alt="program with J2ME 起步（简单版）" width="500" height="200" /><br />
这次我试试看使用图片做教程，当然某些图片下面也有一些注释或链接。手机读者就先加个书签或记得 blog.laobubu.net 以后再看吧。<br />
<span id="more-600"></span></p>
<h3>E01 编程环境的准备</h3>
<blockquote><p>先准备好工具和测试环境再开始编程。</p>
<p>用到的东西有：</p>
<ul>
<li>WTK （<a href="http://www.oracle.com/technetwork/java/download-135801.html">http://www.oracle.com/technetwork/java/download-135801.html</a> ）</li>
<li>JDK（<a href="http://download.oracle.com/otn-pub/java/jdk/7u3-b05/jdk-7u3-windows-i586.exe" target="_blank">Windows x86</a> 或者访问 <a href="http://www.oracle.com/technetwork/java/javase/downloads/jdk-7u3-download-1501626.html">这里有其他版本</a>）</li>
<li>Eclipse IDE 给Java开发者的版本 （<a href="http://www.eclipse.org/downloads/download.php?file=/technology/epp/downloads/release/indigo/SR2/eclipse-java-indigo-SR2-win32.zip">Windows 32-bit Indigo</a> 或者 <a href="http://www.eclipse.org/downloads/packages/eclipse-ide-java-developers/indigosr2">查看Indigo其他版本</a>）</li>
<li>EclipseME （<a href="http://sourceforge.net/projects/eclipseme/files/latest/download">http://sourceforge.net/projects/eclipseme/files/latest/download</a>）</li>
</ul>
<div>下面内容会有点儿啰嗦，抱歉哈</div>
</blockquote>
<p><img src="http://static1.laobubu.net/images/j2meinto/install/1.png" alt="" /></p>
<p><img src="http://static1.laobubu.net/images/j2meinto/install/2.png" alt="" /></p>
<p><img src="http://static1.laobubu.net/images/j2meinto/install/3.png" alt="" /></p>
<p><img src="http://static1.laobubu.net/images/j2meinto/install/4.png" alt="" /></p>
<p><img src="http://static1.laobubu.net/images/j2meinto/install/5.png" alt="" /></p>
<p><img src="http://static1.laobubu.net/images/j2meinto/install/6.png" alt="" /></p>
<h3>E02 一个示例程序</h3>
<blockquote><p>先准备好工具和测试环境再开始编程。</p>
<p>要下载的东西有：</p>
<ul>
<li>示例工程A01_HelloWorld源代码包（<a href="static1.laobubu.net/images/j2meinto/preparation/A01_HelloWorld.zip">A01_HelloWorld.zip</a> ）</li>
</ul>
<p>可以参考看看的东西：</p>
<ul>
<li><a href="http://caterpillar.onlyfun.net/Gossip/index.html">良葛格學習筆記</a>（靜態語言 Java 那里 ）</li>
</ul>
<p>这里就靠大家先摸索了。</p></blockquote>
<p><img src="http://static1.laobubu.net/images/j2meinto/preparation/1.png" alt="" /></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.laobubu.net/600/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>[发布][AIR]Voice Inputer(语音输入)测试版</title>
		<link>http://blog.laobubu.net/595</link>
		<comments>http://blog.laobubu.net/595#comments</comments>
		<pubDate>Sun, 29 Apr 2012 17:59:04 +0000</pubDate>
		<dc:creator>laobubu</dc:creator>
				<category><![CDATA[代码笔记和片段]]></category>
		<category><![CDATA[发布]]></category>
		<category><![CDATA[程序实验室]]></category>
		<category><![CDATA[Flash制作的]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[TTS]]></category>
		<category><![CDATA[VoiceInputer]]></category>
		<category><![CDATA[云]]></category>
		<category><![CDATA[程序自动化]]></category>

		<guid isPermaLink="false">http://blog.laobubu.net/?p=595</guid>
		<description><![CDATA[上周pyramid网友提出了一个相当有挑战性的计划：在Flash中使用Google的语音识别API来识别，同时还给出了一个视频（vimeo），在那个视频里某人只需要对着电脑说一句“open”就打开文件夹了，再说出文件名就打开对应文件了，还有说出“zoom in”就放大了……总之相当神奇。不过最猛的问题是：那个视频的语音控制系统是使用flash制作的！！ 好了，废话不多说，先看看我的这个倒霉东西：Voice Inputer(语音输入)！ 项目主页&#38;下载地址 点击这里进入 http://lab.laobubu.net/voiceinputer/ 注意：欲使用此软件，您的操作系统需要Adobe AIR，如果没有，可以点击这里下载AIR» 使用方法 对着麦克风说出你要输入的话（不用按什么按钮，直接打开软件就可以对着麦克风开始用了），然后停顿片刻…… 当屏幕上出现文字时，你便可以接着说话，或者通过键盘↑和↓键选择其他的识别结果。 如果要暂停或继续输入，按下键盘的ESC键。 如果要设置有关输入音量的选项，请使用操作系统的音量控制面板进行修改。 有关Google语音识别API的若干补充信息 我在 http://blog.laobubu.net/546 已经写了不少，不过里面有一个错误：这个API不仅仅支持flac格式编码的数据。我到网络上搜索了一下，加上自己摸索，总结出这个API支持的content-type有以下三种mime： audio/x-flac （采用FLAC压缩） audio/x-speex-with-header-byte 或者 audio/speex （采用speex编码） audio/L16 （采用PCM16编码wav，也就是未压缩的格式） 然后在MIME后面还要加上【; rate=码率】，一般的码率都是16000（电话标准？），经过测试Google的API最高支持到32000Hz，再向上就出问题了。 虽然flash支持的码率里没有32000，但是有22050（Microphone类变量的rate属性设置为22时取得此值），所以还是可用于flash的。（不过最后测试发现还要搞定跨域安全问题，这个我失败了，求高手指导！） 如果要在Flash里录音，可以试试看 http://code.google.com/p/micrecorder/ 上面的源代码，只要把代码里有关rate的44改成22，44100改成22050即可。 &#160; Flash AS3里面如何在没有回放的情况下得到Microphone.activityLevel 在AS3里面我们要得到当前麦克风电平（声音越大电平越高），一般都是用activityLevel()来获取，但是如果直接调用它，音响里会同时放出声音来。要屏蔽音响的回放，需要【setLoopBack(false);】，但是这样子activityLevel()就失效了。 比较损的方法是直接对原始数据动手。 //可能需要导入 &#160; import flash.media.Microphone; import flash.events.SampleDataEvent; import flash.utils.getTimer; &#160; //首先需要为mic（你的麦克风对象）加上自己的listener mic.addEventListener&#40;SampleDataEvent.SAMPLE_DATA,mySampler&#41;; &#160; //然后准备一个变量来存储无声持续的时间 var mute_timer:Number=getTimer&#40;&#41;; &#160; //开始动手 private function mySampler&#40;event:SampleDataEvent&#41;:void &#123; if &#40;event.data.readFloat&#40;&#41;500&#41; [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://lab.laobubu.net/voiceinputer/icon.png" alt="" align="right" />上周pyramid网友<a href="http://blog.laobubu.net/546/comment-page-1#comment-444">提出了一个相当有挑战性的计划</a>：在Flash中<a href="http://blog.laobubu.net/546">使用Google的语音识别API</a>来识别，同时还给出了一个视频（<a href="http://vimeo.com/8203323">vimeo</a>），在那个视频里某人只需要对着电脑说一句“open”就打开文件夹了，再说出文件名就打开对应文件了，还有说出“zoom in”就放大了……总之相当神奇。不过最猛的问题是：那个视频的语音控制系统是使用flash制作的！！</p>
<p>好了，废话不多说，先看看我的这个倒霉东西：Voice Inputer(语音输入)！</p>
<h3>项目主页&amp;下载地址</h3>
<blockquote><p><span style="font-size: x-large;"><strong><a href="http://lab.laobubu.net/voiceinputer/">点击这里进入</a></strong></span></p>
<p>http://lab.laobubu.net/voiceinputer/</p>
<p>注意：欲使用此软件，您的操作系统需要Adobe AIR，如果没有，可以<a href="http://get.adobe.com/cn/air/">点击这里下载AIR»</a></p></blockquote>
<p><span id="more-595"></span></p>
<h3>使用方法</h3>
<blockquote>
<ul>
<li>对着麦克风说出你要输入的话（不用按什么按钮，直接打开软件就可以对着麦克风开始用了），然后停顿片刻……</li>
<li>当屏幕上出现文字时，你便可以接着说话，或者通过键盘↑和↓键选择其他的识别结果。</li>
<li>如果要暂停或继续输入，按下键盘的ESC键。</li>
<li>如果要设置有关输入音量的选项，请使用操作系统的音量控制面板进行修改。</li>
</ul>
</blockquote>
<h3>有关Google语音识别API的若干补充信息</h3>
<blockquote><p>我在 <a href="http://blog.laobubu.net/546">http://blog.laobubu.net/546</a> 已经写了不少，不过里面有一个错误：这个API不仅仅支持flac格式编码的数据。我到网络上搜索了一下，加上自己摸索，总结出这个API支持的content-type有以下三种mime：</p>
<ul>
<li>audio/x-flac （采用FLAC压缩）</li>
<li>audio/x-speex-with-header-byte 或者 audio/speex （采用<a href="http://www.speex.org/">speex</a>编码）</li>
<li>audio/L16 （采用PCM16编码wav，也就是未压缩的格式）</li>
</ul>
<p>然后在MIME后面还要加上【; rate=码率】，一般的码率都是16000（电话标准？），经过测试Google的API最高支持到32000Hz，再向上就出问题了。</p>
<p>虽然flash支持的码率里没有32000，但是有22050（Microphone类变量的rate属性设置为22时取得此值），所以还是可用于flash的。（不过最后测试发现还要搞定跨域安全问题，这个我失败了，求高手指导！）</p>
<p>如果要在Flash里录音，可以试试看 <a href="http://code.google.com/p/micrecorder/">http://code.google.com/p/micrecorder/</a> 上面的源代码，只要把代码里有关rate的44改成22，44100改成22050即可。</p>
<p>&nbsp;</p></blockquote>
<h3>Flash AS3里面如何在没有回放的情况下得到Microphone.activityLevel</h3>
<blockquote><p>在AS3里面我们要得到当前麦克风电平（声音越大电平越高），一般都是用activityLevel()来获取，但是如果直接调用它，音响里会同时放出声音来。要屏蔽音响的回放，需要【setLoopBack(false);】，但是这样子activityLevel()就失效了。</p>
<p>比较损的方法是直接对原始数据动手。</p>
<div class="geshi no java">
<div class="head">//可能需要导入</div>
<ol>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co2">import flash.media.Microphone;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co2">import flash.events.SampleDataEvent;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co2">import flash.utils.getTimer;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">//首先需要为mic（你的麦克风对象）加上自己的listener</span></div>
</li>
<li class="li1">
<div class="de1">mic.<span class="me1">addEventListener</span><span class="br0">&#40;</span>SampleDataEvent.<span class="me1">SAMPLE_DATA</span>,mySampler<span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">//然后准备一个变量来存储无声持续的时间</span></div>
</li>
<li class="li1">
<div class="de1">var mute_timer:<span class="kw3">Number</span>=getTimer<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">//开始动手</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">private</span> function mySampler<span class="br0">&#40;</span>event:SampleDataEvent<span class="br0">&#41;</span>:<span class="kw4">void</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">if</span> <span class="br0">&#40;</span>event.<span class="me1">data</span>.<span class="me1">readFloat</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="nu0">500</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><span class="co1">//安静500ms</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; trace<span class="br0">&#40;</span><span class="st0">&quot;已经没声音0.5秒了&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; mute_timer = getTimer<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span> <span class="kw1">else</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;mute_timer = getTimer<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span> <span class="co1">//安静被打断，重新开始记安静时间</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>然后就可以针对安静一定时长做一定事情了。</p></blockquote>
<h3>最后牢骚话</h3>
<blockquote>
<ul>
<li>期中考要开始了，感觉我死定了！</li>
<li>Flash AS3各种大杂烩嘛，各种import蛋疼啊，各种addEventListener蛋疼啊！</li>
<li>本来要制作成Flash的SWF版本，但是测试下来在跨域上有问题，所以最后改为AIR版本了。</li>
<li>pyramid没上线了？</li>
</ul>
</blockquote>
]]></content:encoded>
			<wfw:commentRss>http://blog.laobubu.net/595/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>[HTML5实验]函数之音（js生成wav以及HTML5初探）（附初中声学大揭秘）</title>
		<link>http://blog.laobubu.net/587</link>
		<comments>http://blog.laobubu.net/587#comments</comments>
		<pubDate>Sun, 22 Apr 2012 07:56:31 +0000</pubDate>
		<dc:creator>laobubu</dc:creator>
				<category><![CDATA[发布]]></category>
		<category><![CDATA[程序实验室]]></category>
		<category><![CDATA[Chrome]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[js]]></category>
		<category><![CDATA[音乐]]></category>

		<guid isPermaLink="false">http://blog.laobubu.net/?p=587</guid>
		<description><![CDATA[不得不说，HTML5的推出是相当振奋人心的。其带来的大量好玩新东西几乎使得Flash站不住脚了。比如canvas就是一个好玩的例子，网络上已经有不少用这类东西做的玩意儿了。 废话不多讲，这次我为了测试了一下HTML5的Canvas和Audio标签（以及搞定上次的计划），写了一个小程序。此程序可以让你输入一个函数然后得到对应的音频（不是TTS，就是你的函数表示的音波！）。现在已经在chrome和firefox测试过，可以使用。 开始试玩 点击这里进入 http://lab.laobubu.net/soundimg/（暂不支持手机） 成功记录 之前实际上我是想把这个功能的东西单独写成一个app的，但是我没有触摸屏设备（现在手机仍然symbian，而且是S60v3FP2），所以也就放弃了。某天突然想到，可以试试看base64编码生成的音频，这样子就不要服务器和app的支持了！ 说干就干，结果刚开始对canvas不熟悉，去网络上查找大量资料才稍微知道…… Canvas简单用法 首先在网页里写上一个canvas标签，给一个id，还有width、height参数（不用写单位）。 忘记说了，canvas的绘制是在js里完成的。。。 开始写JS,然后var d=document.getElementById('你的canvas的ID').getContext("2d"); 就可以得到Graphics了，这个有点像JAVA的，不过方法上几乎不相干。 以下为若干简单的用法： /* from laobubu.net */ d.clearRect&#40;x,y,宽,高&#41;; //清空（使用透明色填充） d.drawImage&#40;image,x,y&#91;,宽,高&#93;&#41;; //绘图（image可以直接用HTML的img） d.strokeStyle=&#34;rgba(255,255,255,0.5)&#34;; //设置画笔颜色 为半透明的白色 d.beginPath&#40;&#41;; //准备画线 d.moveTo&#40;x,y&#41;; //将笔移动到指定位置 d.lineTo&#40;x,y&#41;; //从上一步位置开始画线到另外一个位置 d.stroke&#40;&#41;; //结束画线 d.strokeText&#40;&#34;HELLO WORLD&#34;,0,0&#41;; //写字，使用的颜色和strokeStyle一样 d.fillStyle=&#39;#FF0000&#39;; //设置填充色 d.fillRect&#40;x,y,宽,高&#41;; //填矩形 /* end */ 还有就是声音。这里我用的是 http://codebase.es/riffwave/ 的JS代码，可以生成base64格式的路径。用法在上面那个链接里了，不过这东西默认是搞出来PCM8的，如果你想upsample（搞出更清晰的音频），这里主要讲一下： 将RIFFWAVE从PCM8升级为PCM16 先复习一下初中物理，如果你觉得可以省略就跳过： 声音是靠不断震动才产生的，当东西停止了震动，它就不发出声音了。 不同的震动会产生不同的声响。 震动不同的原因有许多，比如快慢（频率）、幅度（振幅）和音色。 注意了！这里的“音色”是逗初中小娃娃的说法，实际上就是震动的方式（书上说是因为泛音的振动导致音色不同的，不过最后各种振动，包括泛音的，叠加起来就会成为一个新的声波振动，也就是你最后听到的有特殊音色的声），你可以让喇叭里的那个薄膜以像正弦函数图象的方式一样前后震动（然后你得到正弦波），也可以突然最前突然又最后（方波），也可以匀速向前运动到某个位置突然跳到最后再匀速向前（锯齿波）啥的。 虽然这样说，但是你一般看不清楚震动，因为物体要震动得相当快才可以产生你听得到的声音。 人可以听到的震动的速度在一秒钟震动20次到20000次之间（实际上每秒震动80次我个人倒还不怎么听得见），如果那么快的震动你还看得清，好吧，算你强。 [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://lab.laobubu.net/soundimg/res/logo.png" alt="" align="right" />不得不说，HTML5的推出是相当振奋人心的。其带来的大量好玩新东西几乎使得Flash站不住脚了。比如canvas就是一个好玩的例子，网络上已经有不少用这类东西做的玩意儿了。</p>
<p>废话不多讲，这次我为了测试了一下HTML5的Canvas和Audio标签（以及搞定<a href="https://twitter.com/laobubu/status/192515312359448576" target="_blank">上次的计划</a>），写了一个小程序。此程序可以让你输入一个函数然后得到对应的音频（不是TTS，就是你的函数表示的音波！）。现在已经在chrome和firefox测试过，可以使用。</p>
<h3>开始试玩</h3>
<blockquote><p><span style="font-size: x-large;"><strong><a href="http://lab.laobubu.net/soundimg/" target="_blank">点击这里进入</a></strong></span></p>
<p>http://lab.laobubu.net/soundimg/（暂不支持手机）</p></blockquote>
<p><span id="more-587"></span></p>
<h3>成功记录</h3>
<blockquote><p>之前实际上我是想把这个功能的东西单独写成一个app的，但是我没有触摸屏设备（现在手机仍然symbian，而且是S60v3FP2），所以也就放弃了。某天突然想到，可以试试看base64编码生成的音频，这样子就不要服务器和app的支持了！</p>
<p>说干就干，结果刚开始对canvas不熟悉，去网络上查找大量资料才稍微知道……</p>
<h4>Canvas简单用法</h4>
<p>首先在网页里写上一个canvas标签，给一个id，还有width、height参数（不用写单位）。</p>
<p>忘记说了，canvas的绘制是在js里完成的。。。</p>
<p>开始写JS,然后<span style="text-decoration: underline;">var d=document.getElementById('你的canvas的ID').getContext("2d");</span> 就可以得到Graphics了，这个有点像JAVA的，不过方法上几乎不相干。</p>
<p>以下为若干简单的用法：</p>
<div class="geshi no java">
<div class="head">/* from laobubu.net */</div>
<ol>
<li class="li1">
<div class="de1">d.<span class="me1">clearRect</span><span class="br0">&#40;</span>x,y,宽,高<span class="br0">&#41;</span><span class="sy0">;</span> <span class="co1">//清空（使用透明色填充）</span></div>
</li>
<li class="li1">
<div class="de1">d.<span class="me1">drawImage</span><span class="br0">&#40;</span>image,x,y<span class="br0">&#91;</span>,宽,高<span class="br0">&#93;</span><span class="br0">&#41;</span><span class="sy0">;</span> <span class="co1">//绘图（image可以直接用HTML的img）</span></div>
</li>
<li class="li1">
<div class="de1">d.<span class="me1">strokeStyle</span>=<span class="st0">&quot;rgba(255,255,255,0.5)&quot;</span><span class="sy0">;</span> <span class="co1">//设置画笔颜色 为半透明的白色</span></div>
</li>
<li class="li1">
<div class="de1">d.<span class="me1">beginPath</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span> <span class="co1">//准备画线</span></div>
</li>
<li class="li1">
<div class="de1">d.<span class="me1">moveTo</span><span class="br0">&#40;</span>x,y<span class="br0">&#41;</span><span class="sy0">;</span> <span class="co1">//将笔移动到指定位置</span></div>
</li>
<li class="li1">
<div class="de1">d.<span class="me1">lineTo</span><span class="br0">&#40;</span>x,y<span class="br0">&#41;</span><span class="sy0">;</span> <span class="co1">//从上一步位置开始画线到另外一个位置</span></div>
</li>
<li class="li1">
<div class="de1">d.<span class="me1">stroke</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span> <span class="co1">//结束画线</span></div>
</li>
<li class="li1">
<div class="de1">d.<span class="me1">strokeText</span><span class="br0">&#40;</span><span class="st0">&quot;HELLO WORLD&quot;</span>,<span class="nu0">0</span>,<span class="nu0">0</span><span class="br0">&#41;</span><span class="sy0">;</span> <span class="co1">//写字，使用的颜色和strokeStyle一样</span></div>
</li>
<li class="li1">
<div class="de1">d.<span class="me1">fillStyle</span>=<span class="st0">&#39;#FF0000&#39;</span><span class="sy0">;</span> <span class="co1">//设置填充色</span></div>
</li>
<li class="li1">
<div class="de1">d.<span class="me1">fillRect</span><span class="br0">&#40;</span>x,y,宽,高<span class="br0">&#41;</span><span class="sy0">;</span> <span class="co1">//填矩形</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">/* end */</span></div>
</li>
</ol>
</div>
<p>还有就是声音。这里我用的是 <a href="http://codebase.es/riffwave/" target="_blank">http://codebase.es/riffwave/</a> 的JS代码，可以生成base64格式的路径。用法在上面那个链接里了，不过这东西默认是搞出来PCM8的，如果你想upsample（搞出更清晰的音频），这里主要讲一下：</p>
<h4>将RIFFWAVE从PCM8升级为PCM16</h4>
<p>先复习一下初中物理，如果你觉得可以省略就跳过：</p>
<ul>
<li>声音是靠不断震动才产生的，当东西停止了震动，它就不发出声音了。</li>
<li>不同的震动会产生不同的声响。</li>
<li>震动不同的原因有许多，比如快慢（频率）、幅度（振幅）和音色。</li>
<li>注意了！这里的“音色”是逗初中小娃娃的说法，实际上就是震动的方式（书上说是因为泛音的振动导致音色不同的，不过最后各种振动，包括泛音的，叠加起来就会成为一个新的声波振动，也就是你最后听到的有特殊音色的声），你可以让喇叭里的那个薄膜以像正弦函数图象的方式一样前后震动（然后你得到正弦波），也可以突然最前突然又最后（方波），也可以匀速向前运动到某个位置突然跳到最后再匀速向前（锯齿波）啥的。</li>
<li>虽然这样说，但是你一般看不清楚震动，因为物体要震动得相当快才可以产生你听得到的声音。</li>
<li>人可以听到的震动的速度在一秒钟震动20次到20000次之间（实际上每秒震动80次我个人倒还不怎么听得见），如果那么快的震动你还看得清，好吧，算你强。</li>
<li>C4（中音的哆）频率为261Hz，即每秒震动261次。震动越快音越高。</li>
</ul>
<p>好了，先看一下PCM8和PCM16的相同和不同。</p>
<ul>
<li>【同】两者都是使用若干字节来一一对应地保存震动信息的。（废话！）</li>
<li>【异】每一步震动位置使用字节数不同：PCM8里用1字节，PCM16用2字节。（单声道）</li>
<li>所以PCM16可以存储清晰度比PCM8更高的音频（废话！震动位置精确度上去了，音频肯定可以更清晰啊！）</li>
</ul>
<div>接下来在你生成音频的时候就要用这种代码了</div>
<div class="geshi no java">
<div class="head">/* from laobubu.net */</div>
<ol>
<li class="li1">
<div class="de1">var sampleo = <span class="br0">&#91;</span><span class="br0">&#93;</span><span class="sy0">;</span> <span class="co1">//震动的数据</span></div>
</li>
<li class="li1">
<div class="de1">var samples = <span class="br0">&#91;</span><span class="br0">&#93;</span><span class="sy0">;</span> <span class="co1">//upsample后的数据</span></div>
</li>
<li class="li1">
<div class="de1">var seconds=<span class="nu0">1</span><span class="sy0">;</span> <span class="co1">//一秒</span></div>
</li>
<li class="li1">
<div class="de1">var samples_length = <span class="nu0">44100</span><span class="sy0">*</span>seconds<span class="sy0">;</span> <span class="co1">//震动的数据的长度（和时间有关）</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">for</span> <span class="br0">&#40;</span>var i=<span class="nu0">0</span><span class="sy0">;</span> i<span class="sy0">&lt;</span>samples_length<span class="sy0">;</span> i++<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;var t = i/<span class="nu0">44100</span>/scalet<span class="sy0">;</span> <span class="co1">// t=秒数（sec.）</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;sampleo<span class="br0">&#91;</span>i<span class="br0">&#93;</span> = <span class="kw3">Math</span>.<span class="me1">round</span><span class="br0">&#40;</span><span class="nu0">32767</span><span class="sy0">*</span>sin<span class="br0">&#40;</span>t<span class="sy0">*</span><span class="nu0">440</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span> <span class="co1">//填写震动的数据。PCM16每一步震动位置范围是-32767到32767，而且是整数！</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;samples<span class="br0">&#91;</span>i<span class="sy0">*</span><span class="nu0">2</span><span class="nu0">+1</span><span class="br0">&#93;</span> =<span class="br0">&#40;</span><span class="br0">&#40;</span>sampleo<span class="br0">&#91;</span>i<span class="br0">&#93;</span> <span class="sy0">&gt;&gt;</span> <span class="nu0">8</span><span class="br0">&#41;</span> <span class="sy0">&amp;</span> 0xFF<span class="br0">&#41;</span><span class="sy0">;</span> <span class="co1">//将这一步震动的数据从整数转换为byte</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;samples<span class="br0">&#91;</span>i<span class="sy0">*</span><span class="nu0">2</span><span class="br0">&#93;</span> = <span class="br0">&#40;</span>sampleo<span class="br0">&#91;</span>i<span class="br0">&#93;</span> <span class="sy0">&amp;</span> 0xFF<span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">var wave = <span class="kw2">new</span> RIFFWAVE<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><span class="co1">//开始创建WAV</span></div>
</li>
<li class="li1">
<div class="de1">var audio = <span class="kw2">new</span> Audio<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span> <span class="co1">//准备播放器</span></div>
</li>
<li class="li1">
<div class="de1">wave.<span class="me1">header</span>.<span class="me1">sampleRate</span> = <span class="nu0">44100</span><span class="sy0">;</span> <span class="co1">// 支持的最高震动频率，一般都是44100hz</span></div>
</li>
<li class="li1">
<div class="de1">wave.<span class="me1">header</span>.<span class="me1">numChannels</span> = <span class="nu0">1</span><span class="sy0">;</span><span class="co1">// 单声道</span></div>
</li>
<li class="li1">
<div class="de1">wave.<span class="me1">header</span>.<span class="me1">bitsPerSample</span> = <span class="nu0">16</span><span class="sy0">;</span><span class="co1">// PCM8→PCM16</span></div>
</li>
<li class="li1">
<div class="de1">wave.<span class="me1">Make</span><span class="br0">&#40;</span>samples<span class="br0">&#41;</span><span class="sy0">;</span> <span class="co1">//创建wav</span></div>
</li>
<li class="li1">
<div class="de1">audio.<span class="me1">src</span>=wave.<span class="me1">dataURI</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">audio.<span class="me1">play</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span> <span class="co1">//播放</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">/* end */</span></div>
</li>
</ol>
</div>
</blockquote>
<h3>失败记录</h3>
<blockquote><p>我打了一个没有准备的战。后来测试才发现移动设备不支持base64来表示音频数据！擦！</p></blockquote>
<h3>题后话</h3>
<blockquote>
<ul>
<li>实际上这个app是为纳某的某某行为搞的。</li>
<li>感谢<a href="http://blog.cnbang.net/" target="_blank">@bang590（推特中文圈作者）博客</a>的信息了。</li>
<li>失败的成功，哎。</li>
</ul>
</blockquote>
]]></content:encoded>
			<wfw:commentRss>http://blog.laobubu.net/587/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>假期结束！送上这个假期鼓捣的一堆诡异物</title>
		<link>http://blog.laobubu.net/581</link>
		<comments>http://blog.laobubu.net/581#comments</comments>
		<pubDate>Sat, 18 Feb 2012 14:35:19 +0000</pubDate>
		<dc:creator>laobubu</dc:creator>
				<category><![CDATA[Just for FUN]]></category>
		<category><![CDATA[其他作品]]></category>
		<category><![CDATA[发布]]></category>
		<category><![CDATA[小笔记]]></category>
		<category><![CDATA[心情与牢骚]]></category>
		<category><![CDATA[无聊乱做]]></category>
		<category><![CDATA[生活中的事情]]></category>
		<category><![CDATA[J2ME]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[天才]]></category>
		<category><![CDATA[游戏]]></category>
		<category><![CDATA[视频]]></category>
		<category><![CDATA[音乐]]></category>

		<guid isPermaLink="false">http://blog.laobubu.net/?p=581</guid>
		<description><![CDATA[这些是这个假期的无聊东西堆，有兴趣自己看看吧。 我的第一个Symbian软件：TestNote 下载地址：static1.laobubu.net/lab1/TestNote_S60_3_X_v_1_0_0.sis 程序语言：Symbian C++ 结果我还是接着搞Symbian这个悲剧东西了。这个是我的第一个原生Symbian程序，会调用手机麦克风并且实时显示声音频谱情况。其中使用了开源的FFTReal，特此说明。 对了，①需要自己签名②这个东西会导致内存溢出，小心使用 移植作品，Java版的手机GBA模拟器 这次的针对对象是YahGBA，感谢@rzxt_提供这个模拟器。 程序语言：Java( J2ME ) 从电脑版移植出来的：GameLady 下载地址：static1.laobubu.net/lab1/GameLady.jar 这个就是直接从YahGBA 0.9移植过来的，按键什么的都可以使用，感觉速度很慢。按键说明在程序里，自己看 从DoCoMo版移植出来的：YGBALite 下载地址：static1.laobubu.net/lab1/YGBALite.jar 我对我自己也无语了，居然移植了两次。这个是从YGBAPlus移植过来的，原作是DoCoMo手机的java软件，感觉移植起来还是有点儿麻烦的，而且结果现在按键似乎没反应。这个速度比gameLady的快一点儿。以下是按键对应表： 手机按键 GBA按键 3 A 2 B 5 选择 6 开始 上 上 下 下 左 左 右 右 8 L 9 R 强哥的歌Let's Fly 我只做了里面的那个《Let's Fly》，各种扯淡嘛！其他交给纳赛阳做了。 【下载】《Let's Fly》 带唱的版本 vs 纯音乐版 一般都是人跟着伴奏走的，这个家伙要的是伴奏跟着他走，所以……各种裁剪了。 啊呀呀，被你发现了！你说我会告诉你纳赛阳做的版本下载地址是 http://www.fileupyours.com/view/319197/ChaoYue_clip.mp3 么？ 学习3DSMAX 3DSMax的确是个好玩东西。这个假期简单学习了建模、骨骼蒙皮、Havok全真物理模拟……我建的模太难看了就不分享了，下面是我的第一个蒙皮作品，模型是互联网上下载的： 学习AE blueset同学你太神奇了，制作了一个叫《初音未来的消失·中文版》(youtube)。各种羡慕技术。 [...]]]></description>
			<content:encoded><![CDATA[<p>这些是这个假期的无聊东西堆，有兴趣自己看看吧。<span id="more-581"></span></p>
<h3>我的第一个Symbian软件：TestNote</h3>
<p>下载地址：<a href="http://static1.laobubu.net/lab1/TestNote_S60_3_X_v_1_0_0.sis">static1.laobubu.net/lab1/TestNote_S60_3_X_v_1_0_0.sis</a></p>
<p>程序语言：Symbian C++</p>
<p>结果我还是接着搞Symbian这个悲剧东西了。这个是我的第一个原生Symbian程序，会调用手机麦克风并且实时显示声音频谱情况。其中使用了开源的FFTReal，特此说明。</p>
<p>对了，①需要自己签名②这个东西会导致内存溢出，小心使用</p>
<h3>移植作品，Java版的手机GBA模拟器</h3>
<p>这次的针对对象是YahGBA，感谢@rzxt_提供这个模拟器。</p>
<p>程序语言：Java( J2ME )</p>
<h4>从电脑版移植出来的：GameLady</h4>
<p>下载地址：<a href="http://static1.laobubu.net/lab1/GameLady.jar">static1.laobubu.net/lab1/GameLady.jar</a></p>
<p>这个就是直接从YahGBA 0.9移植过来的，按键什么的都可以使用，感觉速度很慢。按键说明在程序里，自己看</p>
<h4>从DoCoMo版移植出来的：YGBALite</h4>
<p>下载地址：<a href="http://static1.laobubu.net/lab1/YGBALite.jar">static1.laobubu.net/lab1/YGBALite.jar</a></p>
<p>我对我自己也无语了，居然移植了两次。这个是从YGBAPlus移植过来的，原作是DoCoMo手机的java软件，感觉移植起来还是有点儿麻烦的，而且结果现在按键似乎没反应。这个速度比gameLady的快一点儿。以下是按键对应表：</p>
<table border="1">
<tbody>
<tr>
<th scope="col">手机按键</th>
<th scope="col">GBA按键</th>
</tr>
<tr>
<td>3</td>
<td>A</td>
</tr>
<tr>
<td>2</td>
<td>B</td>
</tr>
<tr>
<td>5</td>
<td>选择</td>
</tr>
<tr>
<td>6</td>
<td>开始</td>
</tr>
<tr>
<td>上</td>
<td>上</td>
</tr>
<tr>
<td>下</td>
<td>下</td>
</tr>
<tr>
<td>左</td>
<td>左</td>
</tr>
<tr>
<td>右</td>
<td>右</td>
</tr>
<tr>
<td>8</td>
<td>L</td>
</tr>
<tr>
<td>9</td>
<td>R</td>
</tr>
</tbody>
</table>
<h3>强哥的歌Let's Fly</h3>
<p>我只做了里面的那个《Let's Fly》，各种扯淡嘛！其他交给纳赛阳做了。</p>
<h4>【下载】《Let's Fly》 <a href="http://www.fileupyours.com/view/319197/FLY2.1_w.mp3">带唱的版本</a> vs <a href="http://www.fileupyours.com/view/319197/FLY2.1.mp3">纯音乐版</a></h4>
<p>一般都是人跟着伴奏走的，这个家伙要的是伴奏跟着他走，所以……各种裁剪了。</p>
<p><img src="http://static1.laobubu.net/sh1t/thumb_album1.jpg" alt="" /></p>
<p>啊呀呀，被你发现了！你说我会告诉你纳赛阳做的版本下载地址是 <a href="http://www.fileupyours.com/view/319197/ChaoYue_clip.mp3">http://www.fileupyours.com/view/319197/ChaoYue_clip.mp3</a> 么？</p>
<h3>学习3DSMAX</h3>
<p>3DSMax的确是个好玩东西。这个假期简单学习了建模、骨骼蒙皮、Havok全真物理模拟……我建的模太难看了就不分享了，下面是我的第一个蒙皮作品，模型是互联网上下载的：<br />
<object width="480" height="400" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="src" value="http://player.youku.com/player.php/sid/XMzQ4MjUzMTI0/v.swf" /><param name="quality" value="high" /><param name="allowscriptaccess" value="sameDomain" /><embed width="480" height="400" type="application/x-shockwave-flash" src="http://player.youku.com/player.php/sid/XMzQ4MjUzMTI0/v.swf" quality="high" allowscriptaccess="sameDomain" /></object></p>
<h3>学习AE</h3>
<p>blueset同学你太神奇了，制作了一个叫<a href="http://www.youtube.com/watch?v=PJHAK4SGzdY">《初音未来的消失·中文版》</a>(youtube)。各种羡慕技术。</p>
<p>而我还是不会玩AE，现在只会玩玩里面的运动跟踪和抠图……</p>
<p><object width="480" height="400" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="src" value="http://player.youku.com/player.php/sid/XMzQ4MzIzNTEy/v.swf" /><param name="quality" value="high" /><param name="allowscriptaccess" value="sameDomain" /><embed width="480" height="400" type="application/x-shockwave-flash" src="http://player.youku.com/player.php/sid/XMzQ4MzIzNTEy/v.swf" quality="high" allowscriptaccess="sameDomain" /></object></p>
<p><a href="http://v.youku.com/v_show/id_XMzQ4MzIzNTEy.html">就是这样的</a>(youku)</p>
<h3>玩FL Studio</h3>
<p>FL Studio是个好东西！<br />
<object width="480" height="400" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="src" value="http://player.youku.com/player.php/sid/XMzUxNDYyMDc2/v.swf" /><param name="quality" value="high" /><param name="allowscriptaccess" value="sameDomain" /><embed width="480" height="400" type="application/x-shockwave-flash" src="http://player.youku.com/player.php/sid/XMzUxNDYyMDc2/v.swf" quality="high" allowscriptaccess="sameDomain" /></object></p>
<p>&nbsp;</p>
<h3>一个字也没有动的作业</h3>
<p>好吧，我明天悲剧了</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.laobubu.net/581/feed</wfw:commentRss>
		<slash:comments>9</slash:comments>
<enclosure url="http://www.fileupyours.com/view/319197/FLY2.1_w.mp3" length="0" type="audio/mpeg" />
<enclosure url="http://www.fileupyours.com/view/319197/FLY2.1.mp3" length="0" type="audio/mpeg" />
<enclosure url="http://www.fileupyours.com/view/319197/ChaoYue_clip.mp3" length="0" type="audio/mpeg" />
		</item>
		<item>
		<title>假期最后一作发布，你管索引同类作品！NICO！PHP版本的OCIN在线代理</title>
		<link>http://blog.laobubu.net/575</link>
		<comments>http://blog.laobubu.net/575#comments</comments>
		<pubDate>Sat, 18 Feb 2012 13:59:11 +0000</pubDate>
		<dc:creator>laobubu</dc:creator>
				<category><![CDATA[发布]]></category>
		<category><![CDATA[程序实验室]]></category>
		<category><![CDATA[ocin]]></category>
		<category><![CDATA[php制作的]]></category>
		<category><![CDATA[你管索引]]></category>
		<category><![CDATA[外交]]></category>

		<guid isPermaLink="false">http://blog.laobubu.net/?p=575</guid>
		<description><![CDATA[俗话说标题要长，所以标题长了点。 这个东西和你管索引类似，不过目的地不是YouTube了，而是来自日本的一个神奇视频网站：nicovideo（微笑视频）。 以下就是摘自百度百科对Niconico动画的介绍 NICONICO动画（日文：ニコニコ动画）是NIWANGO公司所提供的线上影片分享网站，常被简称为niconico或nico等。与YouTube等影片共享网站相似，但NICONICO动画提供观赏者可在影片上留言的功能，而留言会以字幕的形式出现在影片上。原本因为设备、带宽负荷等因素，NICONICO动画规定观赏影片者必须注册，并根据注册顺序开放使用者可于全天（24小时）或限制时间（日本时间2:00-19:00）登入，但现在NICONICO动画的使用者可于全天（24小时），另外也提供付费帐号。截至9月已有超过845万人注册，付费会员超过50万人。 还有就是在网络上，Niconico和Acfun、bilibili都是宅人宝物，称是N站、A站、B站……好了，你可以下载看看了。 【访问OCIN的Google Code主页】 http://code.google.com/p/ocin/ 下面是拷贝自上面那个连接的页面的内容。学习一下吧： A php website helps you play nicovideo on China mainisland. 默认密码：123456 相关说明（使用者必须同意） 此程序仅用于娱乐和打发无聊时光，禁止用于非法方面，否则后果全由使用者承担，作者(laobubu)不负其责任。 播放的视频版权请参考nico里面的对应视频说明，其版权不属于ocin 不提供播放器源程序 laobubu仅是程序的开发者，并非内容的提供者 禁止用于商业！ 禁止将laobubu的程序版权声明移除！ 不建议公开使用 合法使用！ 安装说明 上传压缩包内的文件到服务器 设置所有文件及其所在文件夹的权限为755（或者777） 访问上传后地址 登陆后台，使用默认密码123456 登陆nico 完成 一些问题 为什么视频不能播放？ 因为nico视频需要一个nico账号。请登陆后台（管理页），然后在后台登陆你的nico账号 如何修改管理密码？ 使用记事本编辑config.php，你会看见第四行就是密码所在位置。 有没有在线程序演示？ http://ngsy.tk/sys 但是不保证程序版本最新，也不保证稳定性。 我可以修改程序吗？ 此程序采用Apache许可证，因此你可以修改，且没必要开源，但是你不能将laobubu的标识移除。]]></description>
			<content:encoded><![CDATA[<p><img src="http://code.google.com/p/ocin/logo" alt="" width="55" height="55" align="left" />俗话说标题要长，所以标题长了点。</p>
<p>这个东西和你管索引类似，不过目的地不是YouTube了，而是来自日本的一个神奇视频网站：nicovideo（微笑视频）。</p>
<p>以下就是摘自<a title="" href="http://baike.baidu.com/view/1898804.htm" target="_blank">百度百科对Niconico动画的介绍</a></p>
<blockquote><p>NICONICO动画（日文：ニコニコ动画）是NIWANGO公司所提供的线上影片分享网站，常被简称为niconico或nico等。与YouTube等影片共享网站相似，但NICONICO动画提供观赏者可在影片上留言的功能，而留言会以字幕的形式出现在影片上。原本因为设备、带宽负荷等因素，NICONICO动画规定观赏影片者必须注册，并根据注册顺序开放使用者可于全天（24小时）或限制时间（日本时间2:00-19:00）登入，但现在NICONICO动画的使用者可于全天（24小时），另外也提供付费帐号。截至9月已有超过845万人注册，付费会员超过50万人。</p></blockquote>
<p>还有就是在网络上，Niconico和Acfun、bilibili都是宅人宝物，称是N站、A站、B站……好了，你可以下载看看了。</p>
<h3>【访问OCIN的Google Code主页】</h3>
<blockquote><p><strong><a href="http://code.google.com/p/ocin/">http://code.google.com/p/ocin/</a></strong></p></blockquote>
<p><span id="more-575"></span></p>
<p>下面是拷贝自上面那个连接的页面的内容。学习一下吧：</p>
<p>A php website helps you play nicovideo on China mainisland.</p>
<p>默认密码：123456</p>
<h3><a name="相关说明（使用者必须同意）"></a>相关说明（使用者必须同意）</h3>
<ul>
<li>此程序仅用于娱乐和打发无聊时光，禁止用于非法方面，否则后果全由使用者承担，作者(laobubu)不负其责任。</li>
<li>播放的视频版权请参考nico里面的对应视频说明，其版权不属于ocin</li>
<li>不提供播放器源程序</li>
<li>laobubu仅是程序的开发者，并非内容的提供者</li>
<li>禁止用于商业！</li>
<li>禁止将laobubu的<strong>程序版权</strong>声明移除！</li>
<li>不建议公开使用</li>
<li>合法使用！</li>
</ul>
<h3><a name="安装说明"></a>安装说明</h3>
<ol>
<li>上传压缩包内的文件到服务器</li>
<li>设置所有文件及其所在文件夹的权限为755（或者777）</li>
<li>访问上传后地址</li>
<li>登陆后台，使用默认密码123456</li>
<li>登陆nico</li>
<li>完成</li>
</ol>
<h3><a name="一些问题"></a>一些问题</h3>
<ul>
<li><strong>为什么视频不能播放？<br />
</strong><em>因为nico视频需要一个nico账号。请登陆后台（管理页），然后在后台登陆你的nico账号</em></li>
<li><strong>如何修改管理密码？<br />
</strong><em>使用记事本编辑config.php，你会看见第四行就是密码所在位置。</em></li>
<li><strong>有没有在线程序演示？<br />
</strong><em>http://ngsy.tk/sys 但是不保证程序版本最新，也不保证稳定性。</em></li>
<li><strong>我可以修改程序吗？<br />
</strong><em>此程序采用Apache许可证，因此你可以修改，且没必要开源，但是你不能将laobubu的标识移除。</em></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blog.laobubu.net/575/feed</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>[发布][Symbian60+Python]AirPiano v1.0</title>
		<link>http://blog.laobubu.net/570</link>
		<comments>http://blog.laobubu.net/570#comments</comments>
		<pubDate>Sun, 29 Jan 2012 06:50:12 +0000</pubDate>
		<dc:creator>laobubu</dc:creator>
				<category><![CDATA[其他作品]]></category>
		<category><![CDATA[发布]]></category>
		<category><![CDATA[程序实验室]]></category>
		<category><![CDATA[Bandari]]></category>
		<category><![CDATA[C]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[S60]]></category>
		<category><![CDATA[音乐]]></category>

		<guid isPermaLink="false">http://blog.laobubu.net/?p=570</guid>
		<description><![CDATA[(第一次写C++程序就送给Symbian60了……) 这是一个有点儿无聊但也有点儿意思的小程序，可以调用手机前置摄像头来感应你的动作，你只需要将手指头或者其他什么东西伸到屏幕上所指示的位置即可弹出对应的音符。 要求 S60v3 + 前置摄像头 + Python 1.4 + DirectMidi (laobubu.net已经打包) + 一个明亮且固定不动的地方 下载地址 未签名： 完整版 &#124; 仅DirectMIDI组件 BiNPDA证书签名： 完整版 &#124; 仅程序 &#124; 仅DirectMIDI组件 建议自己下载下来去签名，似乎BinPDA证书有问题 简单入门 下载并安装此软件到手机上。此软件需要Python1.4的平台，你可以去http://sourceforge.net/projects/pys60/files/pys60/1.4.5/下载到对应的版本，比如S60v3版本的 找到一个明亮的地方，将手机稳定地放在桌子或者其他稳定的东西上。启动软件，载入过程不要去看手机，否则会干扰到背景检测。 可以开始玩了 （给PyS60开发人员的）DirectMIDI模块 来自laobubu实验室的DirectMIDI可以使Python拥有直接访问S60底层midi接口(cMda啥的来着，忘记了)的能力，进而使Python即时播放MIDI音符的效率提高数十倍(几乎一发出命令就出声了)。我才接触C++ 编程，很多东西还不明白，因此这个模块暂时还是alpha版本，有待完善。以后新版会在laobubu.net发布! 简单入门 import pydirectmidi 和各种操作系统的MIDI模块一样，首先你需要启动midi功能。你可以简单调用pydirectmidi.open()即可打开。 别认为打开就完事了。打开，稍微延迟一点儿（比如e32.ao_sleep(0.1)）后调用instrument(0,1)设置1号通道音色为0号音色，也就是钢琴。MIDI标准里有16个通道可以同时播放音符(就像邀请了16个演奏家)，有128种音色(每一个演奏家都是全能乐器演奏天才!)。在DirectMIDI里，通道从1开始计，但是乐器从0开始计。如果不设置音色，那个通道就无法发音(你不告诉演奏家用什么乐器，他怎么知道?)。 现在你可以发出音了。DirectMIDI提供了一个简单的方法播放音符，就是【note(音高,毫秒数,通道编号)】。根据MIDI标准，音高是一个数字，60就是最标准的“中音哆”(C5，注意不是手机型号，是音乐上的C5)，然后就像吉他的品一样，升哆是61，“瑞”便被推到了62……依次类推。简单总结:哆是60，相邻两个全音音高相差2，当然有例外，由于“咪”和“发”，“嘻”和“哆”之间没有半音，因此这两组的音高差都是1。 音量调节应该是有用的，系统默认音量为10，即最大。音量可以用mastervol(新音量)来调节全部通道音量，也可以单独针对某一通道进行，比如vol(5,1)就可以把通道1的音量变成5。 演奏会结束后记得pydirectmidi.close()，否则系统还会等待你不会再发出的MIDI信号，会很费电，同时如果凑近喇叭可以听见细微电流声。 模块的所有方法都有帮助文档，你可以像这样查看 &#62;&#62; pydirectmidi.note.__doc__ 还有许多功能待补全，有建议发邮箱，我用Gmail的，laobubu@gmail.com。 也欢迎到我的站点，在我的博客留言我一样会即时收到。laobubu.net &#160; 注意：部分函数尚未实现，调用会导致Python崩溃。测试代码前记得保存！ 心情后记 这是高中最后一个长假了，以后博客可能会暂停更新，不过留言我可能还是会在周末看看的。 第一次写C++程序就败在Symbian上了，要多恶心有多恶心的代码，完全乱不来。 但是为什么还要Python平台呢？我受不了Symbian C++的界面处理方式，感觉还是Python来得快，而且我还可以在手机上维护。所以这次C++程序我写成了一个DLL…… 总之Symbian山河日下了，以后也不打算继续。不过我的第一个智能手机就是S60v3的，也算是完成了一个计划：给自己的手机编一个软件（以前我用S40时候编写过一个叫LPlayer的软件，可惜现在源代码杯具了。那是一个神奇初三时光，别人在学习我却在玩Eclipse和J2ME……） 希望有一个Android……好吧各种废话了。 [...]]]></description>
			<content:encoded><![CDATA[<div align="center"><img src="http://blog.laobubu.net/wp-content/uploads/2012/01/AP.jpg" alt="" /></div>
<p>(第一次写C++程序就送给Symbian60了……)<br />
<span id="more-570"></span><br />
这是一个有点儿无聊但也有点儿意思的小程序，可以调用手机前置摄像头来感应你的动作，你只需要将手指头或者其他什么东西伸到屏幕上所指示的位置即可弹出对应的音符。</p>
<h3>要求</h3>
<blockquote><p>S60v3 + 前置摄像头 + Python 1.4 + DirectMidi (laobubu.net已经打包) + 一个明亮且固定不动的地方</p></blockquote>
<h3>下载地址</h3>
<ul>
<li>未签名： <a href="http://commondatastorage.googleapis.com/datastorage.laobubu.net/softwares/My/AirPiano_Unsigned.sis" target="_blank">完整版</a> | <a href="http://commondatastorage.googleapis.com/datastorage.laobubu.net/softwares/My/DirectMIDI_Module_Signed.sis" target="_blank">仅DirectMIDI组件</a></li>
<li>BiNPDA证书签名： <a href="http://commondatastorage.googleapis.com/datastorage.laobubu.net/softwares/My/AirPiano_Signed.sis" target="_blank">完整版</a> | <a href="http://commondatastorage.googleapis.com/datastorage.laobubu.net/softwares/My/AirPiano_NoModule_Signed.sis">仅程序</a> | <a href="http://commondatastorage.googleapis.com/datastorage.laobubu.net/softwares/My/DirectMIDI_Module_Signed.sis" target="_blank">仅DirectMIDI组件</a></li>
<li>建议自己下载下来去签名，似乎BinPDA证书有问题</li>
</ul>
<h3>简单入门</h3>
<ol>
<li>下载并安装此软件到手机上。此软件需要Python1.4的平台，你可以去<a href="http://sourceforge.net/projects/pys60/files/pys60/1.4.5/">http://sourceforge.net/projects/pys60/files/pys60/1.4.5/</a>下载到对应的版本，比如<a href="http://sourceforge.net/projects/pys60/files/pys60/1.4.5/PythonForS60_1_4_5_3rdEd.sis/download" target="_blank">S60v3版本的</a></li>
<li>找到一个明亮的地方，将手机稳定地放在桌子或者其他稳定的东西上。启动软件，载入过程不要去看手机，否则会干扰到背景检测。</li>
<li>可以开始玩了</li>
</ol>
<h3>（给PyS60开发人员的）DirectMIDI模块</h3>
<blockquote><p>来自laobubu实验室的DirectMIDI可以使Python拥有直接访问S60底层midi接口(cMda啥的来着，忘记了)的能力，进而使Python即时播放MIDI音符的效率提高数十倍(几乎一发出命令就出声了)。我才接触C++ 编程，很多东西还不明白，因此这个模块暂时还是alpha版本，有待完善。以后新版会在laobubu.net发布!</p>
<p>简单入门<br />
import pydirectmidi</p>
<ol>
<li>和各种操作系统的MIDI模块一样，首先你需要启动midi功能。你可以简单调用pydirectmidi.open()即可打开。</li>
<li>别认为打开就完事了。打开，稍微延迟一点儿（比如e32.ao_sleep(0.1)）后调用instrument(0,1)设置1号通道音色为0号音色，也就是钢琴。MIDI标准里有16个通道可以同时播放音符(就像邀请了16个演奏家)，有128种音色(每一个演奏家都是全能乐器演奏天才!)。在DirectMIDI里，通道从1开始计，但是乐器从0开始计。如果不设置音色，那个通道就无法发音(你不告诉演奏家用什么乐器，他怎么知道?)。</li>
<li>现在你可以发出音了。DirectMIDI提供了一个简单的方法播放音符，就是【note(音高,毫秒数,通道编号)】。根据MIDI标准，音高是一个数字，60就是最标准的“中音哆”(C5，注意不是手机型号，是音乐上的C5)，然后就像吉他的品一样，升哆是61，“瑞”便被推到了62……依次类推。简单总结:哆是60，相邻两个全音音高相差2，当然有例外，由于“咪”和“发”，“嘻”和“哆”之间没有半音，因此这两组的音高差都是1。</li>
<li>音量调节应该是有用的，系统默认音量为10，即最大。音量可以用mastervol(新音量)来调节全部通道音量，也可以单独针对某一通道进行，比如vol(5,1)就可以把通道1的音量变成5。</li>
<li>演奏会结束后记得pydirectmidi.close()，否则系统还会等待你不会再发出的MIDI信号，会很费电，同时如果凑近喇叭可以听见细微电流声。</li>
</ol>
<p>模块的所有方法都有帮助文档，你可以像这样查看<br />
&gt;&gt; pydirectmidi.note.__doc__</p>
<p>还有许多功能待补全，有建议发邮箱，我用Gmail的，laobubu@gmail.com。<br />
也欢迎到我的站点，在我的博客留言我一样会即时收到。laobubu.net</p>
<p>&nbsp;</p>
<p>注意：部分函数尚未实现，调用会导致Python崩溃。测试代码前记得保存！</p></blockquote>
<h3>心情后记</h3>
<ul>
<li>这是高中最后一个长假了，以后博客可能会暂停更新，不过留言我可能还是会在周末看看的。</li>
<li>第一次写C++程序就败在Symbian上了，要多恶心有多恶心的代码，完全乱不来。</li>
<li>但是为什么还要Python平台呢？我受不了Symbian C++的界面处理方式，感觉还是Python来得快，而且我还可以在手机上维护。所以这次C++程序我写成了一个DLL……</li>
<li>总之Symbian山河日下了，以后也不打算继续。不过我的第一个智能手机就是S60v3的，也算是完成了一个计划：给自己的手机编一个软件（以前我用S40时候编写过一个叫LPlayer的软件，可惜现在源代码杯具了。那是一个神奇初三时光，别人在学习我却在玩Eclipse和J2ME……）</li>
<li>希望有一个Android……好吧各种废话了。</li>
<li>如果有Android我还要编写个神马呢？想想先。据说Android是基于JAVA的，很好入手，呵呵。（除了价格）</li>
<li>原本我还想，像<a href="/525">LOLWindow那篇</a>一样制作一个短片，曲子是《Oh Du Fröhliche (Oh Santissima)》，山寨班得瑞的版本！后来没精力了。</li>
<li>假期要结束了，本来想学3D结果报废了，矮油……以后再见！</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blog.laobubu.net/570/feed</wfw:commentRss>
		<slash:comments>16</slash:comments>
		</item>
		<item>
		<title>[更新]类图搜索、HTTP请求头修改器、教科书生成器</title>
		<link>http://blog.laobubu.net/567</link>
		<comments>http://blog.laobubu.net/567#comments</comments>
		<pubDate>Fri, 20 Jan 2012 07:34:58 +0000</pubDate>
		<dc:creator>laobubu</dc:creator>
				<category><![CDATA[更新]]></category>
		<category><![CDATA[程序实验室]]></category>
		<category><![CDATA[Chrome]]></category>
		<category><![CDATA[js]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[程序自动化]]></category>

		<guid isPermaLink="false">http://blog.laobubu.net/?p=567</guid>
		<description><![CDATA[同标题，这次更新三个东西：类图搜索、HTTP请求头修改器（这两个都是Chrome扩展程序）和教科书生成器 类图搜索 之前有许多人都反映说是点击一次就失灵的问题，我还想着如果找不到问题就重写，结果发现在代码的“点击”事件里面居然神奇地出现了window.close()。这个东西可以直接枪毙对右键菜单做出反应的能力。也不清楚是什么时候添加的了，总之看见这个我很是抓狂。删之！ 然后就是选项界面修改了一下，添加若干CSS3元素（你可以在我的博客里发现CSS3的好玩东西哦）。 最后把这个扩展程序制作成了真正的多语言版本。现在支持英文和中文，由Chrome自动选择。 【点击这里去Chrome Web Store下载】 HTTP请求头修改 老版本的用户们收到更新了么？没有？没有就对了。老版本已经被我抛弃了。 之前在GR上看过一个有关新老程序员的差别的，其中有一条就是老程序员经历过失败，知道怎么做。结果现在我就遭遇大败了。 老版本已经遭遇各种炮轰，随便看看发现各路用户的评分都是只有一颗星。现在随便摘抄一点评论过来看看： Svend Ole Nielsen如是说：呃……没指出怎么配置，浪费时间，垃圾设计……（Well - did not figure out how to configure it within a minute so out it went. Bad design..） Stephan Hoyer愤怒了：鸟用都没有！界面还很乱！（Does not work for me, UI is not clear） Bob Rayner很不爽：界面诡异！浪费时间！翻译垃圾！折腾十分钟了还用不成！（Bizarre user-interface. Wasted 10 minutes trying to make it work. Maybe [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://lab.laobubu.net/chromeheaderedit/3.png" alt="" /></p>
<p>同标题，这次更新三个东西：类图搜索、HTTP请求头修改器（这两个都是Chrome扩展程序）和教科书生成器<br />
<span id="more-567"></span></p>
<h3>类图搜索</h3>
<p><img src="https://lh3.googleusercontent.com/RYcqPKcmLqQkIUYZPrJygpxrou-yL63VoCjN_O-Df4bUnx4_U2XiY0nRQrrtM-dSPyhx5kQ2UA" alt="" align="right" />之前有许多人都反映说是点击一次就失灵的问题，我还想着如果找不到问题就重写，结果发现在代码的“点击”事件里面居然神奇地出现了window.close()。这个东西可以直接枪毙对右键菜单做出反应的能力。也不清楚是什么时候添加的了，总之看见这个我很是抓狂。删之！</p>
<p>然后就是选项界面修改了一下，添加若干CSS3元素（你可以在我的博客里发现CSS3的好玩东西哦）。</p>
<p>最后把这个扩展程序制作成了真正的多语言版本。现在支持英文和中文，由Chrome自动选择。</p>
<p><a href="https://chrome.google.com/webstore/detail/akckflgbfaeopcknodkjjjokacionlkk" target="_blank">【点击这里去Chrome Web Store下载】</a></p>
<hr />
<h3>HTTP请求头修改</h3>
<p><img src="http://lab.laobubu.net/chromeheaderedit/logo.png" alt="" align="right" />老版本的用户们收到更新了么？没有？没有就对了。老版本已经被我抛弃了。</p>
<p>之前在GR上看过一个有关新老程序员的差别的，其中有一条就是老程序员经历过失败，知道怎么做。结果现在我就遭遇大败了。</p>
<p><a href="https://chrome.google.com/webstore/detail/ifjodhmkegeoijhdkndcpacnmijpfgam" target="_blank">老版本</a>已经遭遇各种炮轰，随便看看发现各路用户的评分都是只有一颗星。现在随便摘抄一点评论过来看看：</p>
<ul>
<li><a href="https://profiles.google.com/100188103725170544930">Svend Ole Nielsen</a>如是说：呃……没指出怎么配置，浪费时间，垃圾设计……（Well - did not figure out how to configure it within a minute so out it went. Bad design..）</li>
<li><a href="https://plus.google.com/110580991801747434649">Stephan Hoyer</a>愤怒了：鸟用都没有！界面还很乱！（Does not work for me, UI is not clear）</li>
<li><a href="https://plus.google.com/116589317470856421043">Bob Rayner</a>很不爽：界面诡异！浪费时间！翻译垃圾！折腾十分钟了还用不成！（Bizarre user-interface. Wasted 10 minutes trying to make it work. Maybe some things got mangled by autotranslate...）</li>
<li><a href="https://plus.google.com/107518190538080144030">Azat Sattarov</a>咆哮道：根本用不成，界面还一点儿也不直观。（Doesn't work at all. Very unintuitive UI design.）</li>
</ul>
<p>所以说杯具了呗。然后我浪费了三天时间重新写了一份，速度应该会好一点儿，顺带<a href="http://lab.laobubu.net/chromeheaderedit/#help" target="_blank">还有帮助手册</a>。</p>
<p>如果你有什么好建议，请留言。谢谢。</p>
<p><a href="https://chrome.google.com/webstore/detail/ppmibgfeefcglejjlpeihfdimbkfbbnm" target="_blank">【点击这里去Chrome Web Store下载新版本】</a></p>
<hr />
<h3>教科书生成器</h3>
<p><img src="http://lab.laobubu.net/textbuk/ge.jpg" alt="" align="right" />我估计没有多少人知道这个东西的存在，但是它真的存在，就如我在茫茫人海中大家不知道一样。</p>
<p>只要提交一副图片，设置相关参数就可以打造出类似右边图片的东西。试试看吧。</p>
<p><a href="http://lab.laobubu.net/textbuk" target="_blank">http://lab.laobubu.net/textbuk</a></p>
<p>此次更新添加了三个配色方案</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.laobubu.net/567/feed</wfw:commentRss>
		<slash:comments>13</slash:comments>
		</item>
		<item>
		<title>[Chrome]HTTP请求头修改工具 1.1</title>
		<link>http://blog.laobubu.net/561</link>
		<comments>http://blog.laobubu.net/561#comments</comments>
		<pubDate>Sat, 17 Dec 2011 18:28:21 +0000</pubDate>
		<dc:creator>laobubu</dc:creator>
				<category><![CDATA[更新]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[js]]></category>

		<guid isPermaLink="false">http://blog.laobubu.net/?p=561</guid>
		<description><![CDATA[此工具用于解决Chrome不能任意修改请求头的问题。通过此工具，你可以将你的浏览器身份伪装成Firefox、IE甚至iPhone、Android等等浏览器。 Chrome的webRequest系列API终于从实验API里面毕业了，撒花~\(≧▽≦)/~ 同时应之前网友leungxh的建议，添加自动切换功能的设置。 注意：你的Chrome版本至少应该是17版，否则安装后无法使用！ 下载地址 Chrome在线应用店下载（老地址已经删除）(新地址一般都是最新版本) min.us下载 1.1.0(不推荐) 一点问题 因为Chrome会缓存请求，因此有时候修改不起作用。此时使用Ctrl+F5强制刷新就可以了。 要测效果可以访问 whatsmyuseragent.com 看看你的User-Agent信息。 如果需要修改其他的请求头，或者需要设置自动切换，访问选项页吧。 有什么想法就留言吧。 现在自动切换（情景模式）通配符只支持*，抱歉。 重要更新内容 由原来的实验性API更改为正式API 添加自动切换功能 部分语言上面的问题]]></description>
			<content:encoded><![CDATA[<p><img class="aligncenter" src="http://datastorage.laobubu.net/images/Big.jpg" alt="" width="250" /></p>
<p>此工具用于解决Chrome不能任意修改请求头的问题。通过此工具，你可以将你的浏览器身份伪装成Firefox、IE甚至iPhone、Android等等浏览器。</p>
<p>Chrome的webRequest系列API终于从实验API里面毕业了，撒花~\(≧▽≦)/~</p>
<p>同时应之前网友<a title="leungxh" href="http://www.leungxh.info/">leungxh</a>的建议，添加自动切换功能的设置。 <span id="more-561"></span></p>
<p><strong>注意：你的Chrome版本至少应该是17版，否则安装后无法使用！</strong></p>
<h3>下载地址</h3>
<blockquote><p><a href="https://chrome.google.com/webstore/detail/ppmibgfeefcglejjlpeihfdimbkfbbnm">Chrome在线应用店下载</a><a href="https://chrome.google.com/webstore/detail/ifjodhmkegeoijhdkndcpacnmijpfgam/details?hl=zh-cn&amp;gl=CN">（老地址已经删除）</a>(新地址一般都是最新版本)</p>
<p><a href="http://minus.com/muafOPJLg#2">min.us下载 1.1.0</a>(不推荐)</p></blockquote>
<h3>一点问题</h3>
<blockquote><p>因为Chrome会缓存请求，因此有时候修改不起作用。此时使用Ctrl+F5强制刷新就可以了。</p>
<p>要测效果可以访问 <a href="//whatsmyuseragent.com">whatsmyuseragent.com</a> 看看你的User-Agent信息。</p>
<p>如果需要修改其他的请求头，或者需要设置自动切换，访问选项页吧。</p>
<p>有什么想法就留言吧。</p>
<p>现在自动切换（情景模式）通配符只支持*，抱歉。</p></blockquote>
<h3>重要更新内容</h3>
<blockquote>
<ul>
<li>由原来的实验性API更改为正式API</li>
<li>添加自动切换功能</li>
<li>部分语言上面的问题</li>
</ul>
</blockquote>
]]></content:encoded>
			<wfw:commentRss>http://blog.laobubu.net/561/feed</wfw:commentRss>
		<slash:comments>17</slash:comments>
		</item>
		<item>
		<title>[Chrome扩展]HTTP请求头修改工具</title>
		<link>http://blog.laobubu.net/555</link>
		<comments>http://blog.laobubu.net/555#comments</comments>
		<pubDate>Sat, 24 Sep 2011 08:52:44 +0000</pubDate>
		<dc:creator>laobubu</dc:creator>
				<category><![CDATA[发布]]></category>
		<category><![CDATA[程序实验室]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[js]]></category>

		<guid isPermaLink="false">http://blog.laobubu.net/?p=555</guid>
		<description><![CDATA[新版本已经可以在Chrome网上应用店下载了！赶快去看看吧» 此工具用于解决Chrome不能任意修改请求头的问题。通过此工具，你可以将你的浏览器身份伪装成Firefox、IE甚至iPhone、Android等等浏览器。 抱歉图片太大了，本来是因为Chrome应用中心要求做大图的，结果做好了上传扩展它又说不支持那些实验性API了……擦！不过不能阻止大家来这里下载…… 下载地址 Box.net : 1.0 min.us : 1.0 Google Storage : 1.0 新浪微博 : 1.0 一点问题 因为Chrome会缓存请求，因此有时候修改不起作用。此时使用Ctrl+F5强制刷新就可以了。 要测效果可以访问 whatsmyuseragent.com 看看你的User-Agent信息。 如果需要修改其他的请求头，访问选项页吧。 计划过后加入自动切换功能，到时候在http://blog.laobubu.net/发布更新。 有什么想法就留言吧。 一些User-Agent字符串 FireFox 6.0=Mozilla/5.0 (Windows NT 5.1; rv:6.0.2) Gecko/20100101 Firefox/6.0.2 IE8(Windows XP)=Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; CIBA; .NET4.0C; .NET4.0E; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729) [...]]]></description>
			<content:encoded><![CDATA[<p><img style="width: 100%;" src="http://datastorage.laobubu.net/images/Big.jpg" alt="" align="center" /></p>
<p><span style="font-size: large;"><strong>新版本已经可以在Chrome网上应用店下载了！<a href="https://chrome.google.com/webstore/detail/ppmibgfeefcglejjlpeihfdimbkfbbnm">赶快去看看吧»</a></strong></span></p>
<p>此工具用于解决Chrome不能任意修改请求头的问题。通过此工具，你可以将你的浏览器身份伪装成Firefox、IE甚至iPhone、Android等等浏览器。</p>
<p>抱歉图片太大了，本来是因为Chrome应用中心要求做大图的，结果做好了上传扩展它又说不支持那些实验性API了……擦！不过不能阻止大家来这里下载……</p>
<h3>下载地址</h3>
<blockquote>
<ul>
<li>Box.net : <a href="http://www.box.net/shared/vehjerb44kokt9fugh67">1.0</a></li>
<li>min.us : <a href="http://minus.com/dEz0PyMy3L3YM.crx">1.0</a></li>
<li>Google Storage : <a href="http://datastorage.laobubu.net/letusrich/Chrome%E7%9A%84HTTP%E8%AF%B7%E6%B1%82%E5%A4%B4%E4%BF%AE%E6%94%B9%E6%89%A9%E5%B1%95.crx">1.0</a></li>
<li>新浪微博 : <a href="http://vdisk.weibo.com/s/Gwts">1.0</a></li>
</ul>
</blockquote>
<p><span id="more-555"></span></p>
<h3>一点问题</h3>
<blockquote><p>因为Chrome会缓存请求，因此有时候修改不起作用。此时使用Ctrl+F5强制刷新就可以了。</p>
<p>要测效果可以访问 <a href="http://whatsmyuseragent.com">whatsmyuseragent.com</a> 看看你的User-Agent信息。</p>
<p>如果需要修改其他的请求头，访问选项页吧。</p>
<p>计划过后加入自动切换功能，到时候在<a href="http://blog.laobubu.net/">http://blog.laobubu.net/</a>发布更新。</p>
<p>有什么想法就留言吧。</p></blockquote>
<h3>一些User-Agent字符串</h3>
<pre>FireFox 6.0=Mozilla/5.0 (Windows NT 5.1; rv:6.0.2) Gecko/20100101 Firefox/6.0.2
IE8(Windows XP)=Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; CIBA; .NET4.0C; .NET4.0E; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)
IE6=Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)
Mac Safari 4=Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_8; en-us) AppleWebKit/531.21.8 (KHTML, like Gecko) Version/4.0.4 Safari/5
Google Bot=Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)
iPhone 3.0=Mozilla/5.0 (iPhone; U; CPU iPhone OS 3_0 like Mac OS X; en-us) AppleWebKit/528.18 (KHTML, like Gecko) Version/4.0 Mobile/7A341 Safari/528.16
Nokia E52 (Symbian)=Mozilla/5.0 (SymbianOS/9.3; Series60/3.2 NokiaE52-1/052.003; Profile/MIDP-2.1 Configuration/CLDC-1.1 ) AppleWebKit/525 (KHTML, like Gecko) Version/3.0 BrowserNG/7.2.6.2 3gpp-gba
HTC(Android)=Mozilla/5.0 (Linux; U; Android 2.2; zh-cn; HTC Legend Build/FRF91) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1</pre>
]]></content:encoded>
			<wfw:commentRss>http://blog.laobubu.net/555/feed</wfw:commentRss>
		<slash:comments>13</slash:comments>
		</item>
		<item>
		<title>[API]Google的语音识别API，支持各种语言</title>
		<link>http://blog.laobubu.net/546</link>
		<comments>http://blog.laobubu.net/546#comments</comments>
		<pubDate>Sun, 21 Aug 2011 15:18:23 +0000</pubDate>
		<dc:creator>laobubu</dc:creator>
				<category><![CDATA[互联网资源]]></category>
		<category><![CDATA[代码笔记和片段]]></category>
		<category><![CDATA[免费资源]]></category>
		<category><![CDATA[发布]]></category>
		<category><![CDATA[无聊乱做]]></category>
		<category><![CDATA[程序和代码]]></category>
		<category><![CDATA[程序实验室]]></category>
		<category><![CDATA[程序资源]]></category>
		<category><![CDATA[自己动手教程]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[TTS]]></category>
		<category><![CDATA[云]]></category>

		<guid isPermaLink="false">http://blog.laobubu.net/?p=546</guid>
		<description><![CDATA[没好用的智能机的孩子你伤不起啊有木有！成天都是倒霉Symbian60啊有木有！上次超流量下载了Google Search for S60，里面神奇的有“语音搜索”……然后就是今天碰到android手机了，自带一个语音输入法啊！这准确率杆杆地！不过根据我多秒经验，S60的废柴API库绝对没有这么完美的语音识别（玩过诺基亚的应该都知道，待机状态长按右软件那个出来的是自带的识别功能），所以肯定Google留了一手！ （软件见http://www.google.com/intl/zh-CN_ALL/mobile/google-mobile-app/） 废话多了，现在看看Google的猥琐API之STT！（属于speech-api v1的recognize） http://www.google.com/speech-api/v1/recognize?xjerr=1&#38;client=chromium&#38;lang=zh-CN 不过使用不是那么简单的哦…… 如何调用 要使用这个API，你得先有一些心理素质：面对倒霉的FLAC格式，因为这个API只支持FLAC格式的数据，杯具啊。 不过你找到了我的博客，那么你是幸福的，因为我已经为你准备了不少好东西了。（顺便说一句，如果要转载记得清楚地标注“来自http://blog.laobubu.net”，我信任你。） 现在看看如何请求数据： 【URL】http://www.google.com/speech-api/v1/recognize?xjerr=1&#38;client=chromium&#38;lang=zh-CN 【方式】POST 【请求头】Content-Type:audio/x-flac; rate=16000 【POST】flac文件的数据 【URL里可选参数】&#038;maxresults=返回结果数 如果你人品大爆发，你成功了，可以得到类似这个的结果 {"status":0,"id":"54e1babccaa58682ffbb02ceb42aa47c-1", "hypotheses":[{"utterance":"测试程序","confidence":0.8556527}]} 或者你的请求URL里设置了maxresults（比如 http://www.google.com/speech-api/v1/recognize?xjerr=1&#038;client=chromium&#038;lang=zh-CN&#038;maxresults=10 ）你就会得到： {"status":0,"id":"fbf23a887b9ac2bfb630aa40dd1a776c-1","hypotheses": [ {"utterance":"欢迎访问过的网址","confidence":0.7275984}, {"utterance":"欢迎访问我的网站"}, {"utterance":"欢迎访问我的网址"}, {"utterance":"欢迎访问过的网站"}, {"utterance":"白云访问过的网址"}, {"utterance":"怀孕访问过的网址"}, {"utterance":"欢迎访问有的网址"}, {"utterance":"欢迎访问过的网址哦"}, {"utterance":"白云访问我的网站"}, {"utterance":"怀孕访问我的网站"} ] } 不过不简单哦 实例 Python代码 #By laobubu.net import urllib2 FILE=&#39;1.flac&#39; #这里假设在当前文件夹下有一个叫1.flac的文件被识别 url = &#39;http://www.google.com/speech-api/v1/recognize?xjerr=1&#38;client=chromium&#38;lang=zh-CN&#39; audio=open&#40;FILE,&#39;rb&#39;&#41;.read&#40;&#41; headers = &#123;&#39;Content-Type&#39; [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.google.com/intl/zh-CN_ALL/mobile/google-mobile-app/crop-voice.png" alt="" align="right" />没好用的智能机的孩子你伤不起啊有木有！成天都是倒霉Symbian60啊有木有！上次超流量下载了Google Search for S60，里面神奇的有“语音搜索”……然后就是今天碰到android手机了，自带一个语音输入法啊！这准确率杆杆地！不过根据我多秒经验，S60的废柴API库绝对没有这么完美的语音识别（玩过诺基亚的应该都知道，待机状态长按右软件那个出来的是自带的识别功能），所以肯定Google留了一手！</p>
<p><object width="480" height="400" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="src" value="http://player.youku.com/player.php/sid/XMjI1Njk2NzM2/v.swf" /><param name="allowfullscreen" value="true" /><param name="quality" value="high" /><param name="allowscriptaccess" value="always" /><embed width="480" height="400" type="application/x-shockwave-flash" src="http://player.youku.com/player.php/sid/XMjI1Njk2NzM2/v.swf" allowfullscreen="true" quality="high" allowscriptaccess="always" /></object><br />
（软件见<a href="http://www.google.com/intl/zh-CN_ALL/mobile/google-mobile-app/">http://www.google.com/intl/zh-CN_ALL/mobile/google-mobile-app/</a>）</p>
<p>废话多了，现在看看Google的猥琐API之STT！（属于speech-api v1的recognize）</p>
<blockquote><p><strong>http://www.google.com/speech-api/v1/recognize?xjerr=1&amp;client=chromium&amp;lang=zh-CN</strong></p></blockquote>
<p>不过使用不是那么简单的哦……<span id="more-546"></span></p>
<h3>如何调用</h3>
<blockquote><p>要使用这个API，你得先有一些心理素质：面对倒霉的FLAC格式，因为这个API<strong>只支持FLAC格式的数据</strong>，杯具啊。</p>
<p>不过你找到了<a href="http://blog.laobubu.net">我的博客</a>，那么你是幸福的，因为我已经为你准备了不少好东西了。（顺便说一句，如果要转载记得清楚地标注“来自<a href="http://blog.laobubu.net/">http://blog.laobubu.net</a>”，我信任你。）</p>
<p>现在看看如何请求数据：</p>
<ul>
<li>【URL】http://www.google.com/speech-api/v1/recognize?xjerr=1&amp;client=chromium&amp;lang=zh-CN</li>
<li>【方式】POST</li>
<li>【请求头】Content-Type:audio/x-flac; rate=16000</li>
<li>【POST】flac文件的数据</li>
<li>【URL里可选参数】&#038;maxresults=返回结果数</li>
</ul>
<p>如果你人品大爆发，你成功了，可以得到类似这个的结果</p>
<pre>{"status":0,"id":"54e1babccaa58682ffbb02ceb42aa47c-1",
"hypotheses":[{"utterance":"测试程序","confidence":0.8556527}]}</pre>
<p>或者你的请求URL里设置了maxresults（比如 http://www.google.com/speech-api/v1/recognize?xjerr=1&#038;client=chromium&#038;lang=zh-CN&#038;maxresults=10 ）你就会得到：</p>
<pre>{"status":0,"id":"fbf23a887b9ac2bfb630aa40dd1a776c-1","hypotheses":
[
{"utterance":"欢迎访问过的网址","confidence":0.7275984},
{"utterance":"欢迎访问我的网站"},
{"utterance":"欢迎访问我的网址"},
{"utterance":"欢迎访问过的网站"},
{"utterance":"白云访问过的网址"},
{"utterance":"怀孕访问过的网址"},
{"utterance":"欢迎访问有的网址"},
{"utterance":"欢迎访问过的网址哦"},
{"utterance":"白云访问我的网站"},
{"utterance":"怀孕访问我的网站"}
]
}</pre>
<p>不过不简单哦</p></blockquote>
<h3>实例</h3>
<blockquote>
<h4>Python代码</h4>
<div class="geshi no python">
<ol>
<li class="li1">
<div class="de1"><span class="co1">#By laobubu.net</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">import</span> <span class="kw3">urllib2</span></div>
</li>
<li class="li1">
<div class="de1">FILE=<span class="st0">&#39;1.flac&#39;</span> <span class="co1">#这里假设在当前文件夹下有一个叫1.flac的文件被识别</span></div>
</li>
<li class="li1">
<div class="de1">url = <span class="st0">&#39;http://www.google.com/speech-api/v1/recognize?xjerr=1&amp;client=chromium&amp;lang=zh-CN&#39;</span></div>
</li>
<li class="li1">
<div class="de1">audio=<span class="kw2">open</span><span class="br0">&#40;</span>FILE,<span class="st0">&#39;rb&#39;</span><span class="br0">&#41;</span>.<span class="me1">read</span><span class="br0">&#40;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">headers = <span class="br0">&#123;</span><span class="st0">&#39;Content-Type&#39;</span> : <span class="st0">&#39;audio/x-flac; rate=16000&#39;</span><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">req = <span class="kw3">urllib2</span>.<span class="me1">Request</span><span class="br0">&#40;</span>url, audio, headers<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">response = <span class="kw3">urllib2</span>.<span class="me1">urlopen</span><span class="br0">&#40;</span>req<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">print</span> response.<span class="me1">read</span><span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">decode</span><span class="br0">&#40;</span><span class="st0">&#39;UTF-8&#39;</span><span class="br0">&#41;</span></div>
</li>
</ol>
</div>
<h4>PHP代码</h4>
<div class="geshi no php">
<ol>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">&lt;?php</span> </div>
</li>
<li class="li1">
<div class="de1"><span class="re1">$ch</span> <span class="sy0">=</span> curl_init<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span> </div>
</li>
<li class="li1">
<div class="de1">curl_setopt<span class="br0">&#40;</span><span class="re1">$ch</span><span class="sy0">,</span> CURLOPT_URL<span class="sy0">,</span> <span class="st0">&quot;http://www.google.com/speech-api/v1/recognize?xjerr=1&amp;client=chromium&amp;lang=zh-CN&amp;maxresults=10&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span> </div>
</li>
<li class="li1">
<div class="de1">curl_setopt<span class="br0">&#40;</span><span class="re1">$ch</span><span class="sy0">,</span> CURLOPT_VERBOSE<span class="sy0">,</span> <span class="nu0">0</span><span class="br0">&#41;</span><span class="sy0">;</span> </div>
</li>
<li class="li1">
<div class="de1">curl_setopt<span class="br0">&#40;</span><span class="re1">$ch</span><span class="sy0">,</span> CURLOPT_HEADER<span class="sy0">,</span> <span class="nu0">0</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">curl_setopt<span class="br0">&#40;</span><span class="re1">$ch</span><span class="sy0">,</span> CURLOPT_POST<span class="sy0">,</span> <span class="nu0">1</span><span class="br0">&#41;</span><span class="sy0">;</span> </div>
</li>
<li class="li1">
<div class="de1">curl_setopt<span class="br0">&#40;</span><span class="re1">$ch</span><span class="sy0">,</span> CURLOPT_RETURNTRANSFER<span class="sy0">,</span> <span class="nu0">1</span><span class="br0">&#41;</span><span class="sy0">;</span> </div>
</li>
<li class="li1">
<div class="de1">curl_setopt<span class="br0">&#40;</span><span class="re1">$ch</span><span class="sy0">,</span> CURLOPT_POSTFIELDS<span class="sy0">,</span> <span class="kw3">file_get_contents</span><span class="br0">&#40;</span><span class="st0">&#39;1.flac&#39;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">curl_setopt<span class="br0">&#40;</span><span class="re1">$ch</span><span class="sy0">,</span> CURLOPT_HTTPHEADER<span class="sy0">,</span> <span class="kw3">array</span><span class="br0">&#40;</span><span class="st0">&quot;Content-Type: audio/x-flac; rate=16000&quot;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span> </div>
</li>
<li class="li1">
<div class="de1"><span class="re1">$data</span> <span class="sy0">=</span> curl_exec<span class="br0">&#40;</span><span class="re1">$ch</span><span class="br0">&#41;</span><span class="sy0">;</span> </div>
</li>
<li class="li1">
<div class="de1">curl_close<span class="br0">&#40;</span><span class="re1">$ch</span><span class="br0">&#41;</span><span class="sy0">;</span> </div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">if</span> <span class="br0">&#40;</span><span class="re1">$data</span><span class="sy0">=</span>json_decode<span class="br0">&#40;</span><span class="re1">$data</span><span class="sy0">,</span><span class="kw2">true</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw3">echo</span> <span class="st0">&quot;&lt;ul&gt;&quot;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw1">foreach</span><span class="br0">&#40;</span><span class="re1">$data</span><span class="br0">&#91;</span><span class="st0">&#39;hypotheses&#39;</span><span class="br0">&#93;</span> <span class="kw1">as</span> <span class="re1">$i</span><span class="br0">&#41;</span> <span class="kw3">echo</span> <span class="st0">&quot;&lt;li&gt;&quot;</span><span class="sy0">.</span><span class="re1">$i</span><span class="br0">&#91;</span><span class="st0">&#39;utterance&#39;</span><span class="br0">&#93;</span><span class="sy0">.</span><span class="st0">&quot;&lt;/li&gt;&quot;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw3">echo</span> <span class="st0">&quot;&lt;/ul&gt;&quot;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span> <span class="kw1">else</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw3">echo</span> <span class="st0">&quot;&lt;i&gt;识别出错&lt;/i&gt;&quot;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">?&gt;</span></div>
</li>
</ol>
</div>
</blockquote>
<h3>头疼：FLAC文件格式</h3>
<blockquote><p>这里我长话短说，google的flac也有限制，22050 Hz+201kbps还正常，如果比这个大多了就不对了。</p>
<p>不过还有最要命的问题，怎么生成FLAC文件？</p>
<p>没关系，这里有救星：flac.exe包下载</p>
<p><a href="http://datastorage.laobubu.net/FLAC.zip">http://datastorage.laobubu.net/FLAC.zip</a> </p>
<p>具体使用方法是【flac.exe 文件.wav】这样在命令行调用即可，测试得知：不支持MP3等格式，但是支持基本的wav格式。</p>
<p>至于其他环境下（如linux里）也有对应的flac下载。我没有怎么用过linux就不说啥了。</p>
<p>好了，你可以去制造你的app了，哈哈。</p></blockquote>
<h3>来自laobubu实验室自动转换API</h3>
<blockquote><p>为了方便，我写了一个python程序，放在Google App Engine上面，只要提交一个音频文件的URL(支持MP3、wav等常见格式)，且文件不大，就可以得到结果了哦。</p>
<p>API入口：<a href="http://laobubumf.appspot.com/stt/">http://laobubumf.appspot.com/stt/</a><br />
备用入口：<a href="http://glab.laobubu.net/stt/">http://glab.laobubu.net/stt/</a></p>
<p>喜欢的话记得+1哦，当然<a href="http://laobubu.net/donate.html?from=stt">捐赠</a>我最不介意 <img src='http://blog.laobubu.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://blog.laobubu.net/546/feed</wfw:commentRss>
		<slash:comments>44</slash:comments>
		</item>
	</channel>
</rss>

