The blog of Wenbin Wu
2018-04-25T19:03:08+00:00
http://wenbinwu.com
Wenbin Wu
admin@wenbinwu.com
Raspberry Pi 树莓派收短信,转发至Telegram
2018-04-25T18:44:08+00:00
http://wenbinwu.com/%E7%82%B9%E7%82%B9%E6%BB%B4%E6%BB%B4/2018/04/25/raspberry-pi-sms
<p>我有一个sim卡专门用来收短信,但是平时用的手机是iPhone,不能双卡,带两个手机又麻烦,
所以想通过树莓派收短信,然后转发到手机上。</p>
<p>这里用到的是<a href="https://wammu.eu/smsd/">Gammu SMSD</a>,专门负责收发短信的服务</p>
<p>需要用的有硬件当然有树莓派,此外,需要一个usb网卡</p>
<p>关于usb网卡,提前在<a href="https://wammu.eu/phones/">这里</a>查一下哪个型号可以支持</p>
<p>我用的是华为<a href="https://wammu.eu/phones/huawei/3135/">E160E</a></p>
<p>将usb网卡连上树莓派,打开命令行里</p>
<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="o">></span> lsusb
Bus 001 Device 010: ID 12d1:1003 Huawei Technologies Co., Ltd. E220 HSDPA Modem / E230/E270/E870 HSDPA/HSUPA Modem
Bus 001 Device 004: ID 0424:7800 Standard Microsystems Corp.
Bus 001 Device 003: ID 0424:2514 Standard Microsystems Corp. USB 2.0 Hub
Bus 001 Device 002: ID 0424:2514 Standard Microsystems Corp. USB 2.0 Hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
<span class="c">### 第一行Huawei就是我的网卡</span>
<span class="o">></span> <span class="nb">ls</span> /dev/ttyUSB<span class="k">*</span>
/dev/ttyUSB0 /dev/ttyUSB1
<span class="c">### 我用到的是1</span>
<span class="o">></span> <span class="nb">sudo </span>apt-get install gammu
<span class="o">></span> gammu-config
<span class="c"># 设备号填/dev/ttyUSB1 ,根据你的配置适当调整</span>
<span class="c"># port at19200 , 不同网卡可能有不同设置</span>
<span class="o">></span> gammu identify
这里可以再次确定设备号
<span class="o">></span> <span class="nb">sudo </span>apt-get install gammu-smsd
<span class="o">></span> <span class="nb">sudo </span>vim /etc/gammu-smsdrc
<span class="c"># 这里是我的配置,service是null,不对消息进行存储</span>
<span class="c"># 如果需要存储,可以配置file, mysql等,详见官方文档</span>
<span class="c"># RunOnReceive定义收到短信后执行的脚本</span>
<span class="c"># https://wammu.eu/docs/manual/smsd/run.html</span>
<span class="c"># Configuration file for Gammu SMS Daemon</span>
<span class="c"># Gammu library configuration, see gammurc(5)</span>
<span class="o">[</span>gammu]
<span class="c"># Please configure this!</span>
port <span class="o">=</span> /dev/ttyUSB1
connection <span class="o">=</span> at19200
<span class="c"># Debugging</span>
<span class="c">#logformat = textall</span>
<span class="c"># SMSD configuration, see gammu-smsdrc(5)</span>
<span class="o">[</span>smsd]
RunOnReceive <span class="o">=</span> /home/pi/receive-sms.sh
service <span class="o">=</span> null
logfile <span class="o">=</span> syslog
<span class="c"># Increase for debugging information</span>
debuglevel <span class="o">=</span> 0
</code></pre></div></div>
<p>以下是<code class="highlighter-rouge">/home/pi/receive-sms.sh</code>:</p>
<div class="highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c">#!/bin/sh</span>
<span class="nv">TOKEN</span><span class="o">=</span>“XXXXX<span class="s2">"
CHAT_ID=XXXX
URL="</span>https://api.telegram.org/bot<span class="nv">$TOKEN</span>/sendMessage<span class="s2">"
for i in </span><span class="sb">`</span>seq <span class="nv">$SMS_MESSAGES</span><span class="sb">`</span><span class="s2"> ; do
eval "</span>curl <span class="nt">-s</span> <span class="nt">-X</span> POST <span class="nv">$URL</span> <span class="nt">-d</span> <span class="nv">chat_id</span><span class="o">=</span><span class="nv">$CHAT_ID</span> <span class="nt">-d</span> <span class="nv">text</span><span class="o">=</span><span class="se">\"\$</span><span class="o">{</span>SMS_<span class="k">${</span><span class="nv">i</span><span class="k">}</span>_TEXT<span class="o">}</span><span class="se">\"</span><span class="s2">"
done
</span></code></pre></div></div>
<p>我在这里将短信发送到Telegram,需要用到TOKEN和CHAT_ID两个变量</p>
<p>打开<a href="https://telegram.me/botfather">BotFather</a>
一步一步创建自己的bot,然后就可以找到TOKEN</p>
<p><img src="http://ww1.sinaimg.cn/large/6b38e7d5gy1fqphf5mc0kj20da06jgm9.jpg" alt="botfather" /></p>
<p>在telegram里找到刚刚创建的bot,发送一个消息
然后浏览器打开
<code class="highlighter-rouge">https://api.telegram.org/bot{TOKEN}/getUpdates</code>
把TOKEN替换成你的TOKEN
这个链接会返回聊天列表,找到你自己的username就可以看到CHAT_ID</p>
<p>直接运行<code class="highlighter-rouge">gammu-smsd</code>测试一下,随便找个网站验证一下手机号就行</p>
<p>想每次启动自动运行的话
<code class="highlighter-rouge">systemctl start gammu-smsd.service</code></p>
Mac 下 packer build 卡死
2015-09-01T11:52:08+00:00
http://wenbinwu.com/%E7%BC%96%E7%A8%8B%E6%8A%80%E6%9C%AF/2015/09/01/mac-packer-build
<blockquote>
<p>Packer is a tool for creating machine and container images for multiple platforms from a single source configuration.</p>
</blockquote>
<p>通过一个配置文件,Packer可以生成Amazon EC2,Docker,DigitalOcean的image,非常实用。工作中很多项目都是用Packer生成ec2 ami,确实很方便。但是最近在生成Docker时出现一个问题。</p>
<script src="https://gist.github.com/kylewu/c9f93df5f3cc1d55b51e.js"></script>
<p>这里的上传操作是在packer.json的inline脚本中配置的。这条命令就卡死在这里,不能继续了。</p>
<p>如果你也有同样的问题,说明你也是在使用Mac OSX。原因非常简单,mac下的docker是运行在虚拟机里的。也就是说如果要上传文件,需要从mac,传到虚拟机,再到docker。</p>
<p>上面的命令行输出中可以看到我们要上传的文件在<code class="highlighter-rouge">/var/folders/</code>目录下,但是这个目录并没有在虚拟机的设置中同步。默认情况下,只有 <code class="highlighter-rouge">/Users</code>目录设置了同步,所以解决方案就是设置一个<code class="highlighter-rouge">TMPDIR</code>变量,并且指向<code class="highlighter-rouge">/Users</code>目录下的一个文件夹。</p>
<p><code class="highlighter-rouge">$ TMPDIR=~/tmp packer build packer.json</code></p>
Gaia Dev Env
2012-05-08T22:00:00+00:00
http://wenbinwu.com/%E7%BC%96%E7%A8%8B%E6%8A%80%E6%9C%AF/2012/05/08/gaia-dev-env
<h1 id="vagrant">Vagrant</h1>
<p>Personally, I prefer working with <a href="http://vagrantup.com/">Vagrant</a>. Thanks to @rhelmer, here is his repo <a href="https://github.com/rhelmer/b2g-vagrant/">b2g-vagrant</a>. It contains a vagrant configure file and puppet file. The README file is quite comprehensive, but please notice, it will download a box file over 10G when you run <code class="highlighter-rouge">vagrant up</code> the first time.</p>
<h1 id="ssh-directly-to-vm">SSH directly to VM</h1>
<p>Vagrant provides a clean way to develop, however, it is not convenient to connect to VM. I have to go to the vagrant folder and <code class="highlighter-rouge">vagrant ssh</code>.</p>
<p><a href="https://github.com/kvs/vagrant-proxyssh">vagrant-proxyssh</a> is a hack to use <code class="highlighter-rouge">ssh</code> directly from command line. If you do not like to install it, copy and paste the following words into your <code class="highlighter-rouge">~/.ssh/config</code></p>
<script src="https://gist.github.com/kylewu/2641244.js"></script>
<h1 id="sshfs">SSHFS</h1>
<p>Now, I can use <code class="highlighter-rouge">ssh vagrant</code> to connect to VM directly. I also would like to mount remote folder to local machine using <a href="http://fuse.sourceforge.net/sshfs.html">sshfs</a>.</p>
<p>The command is quite simple:
<code class="highlighter-rouge">*sshfs vagrant:/home/vagrant/src/B2G/gaia ~/gaia -oauto_cache,reconnect,defer_permissions,negative_vncache,volname=gaia*</code></p>
<h1 id="host-gaia-in-apache">Host Gaia in Apache</h1>
<p>Next, let us see how to host gaia in Apache (All the code in this part comes from <a href="https://wiki.mozilla.org/Gaia/Hacking">gaia-hacking</a>, I just make it short)</p>
<h1 id="install-apache2-in-vm">Install apache2 in VM</h1>
<p><code class="highlighter-rouge">sudo apt-get install apache2</code></p>
<p>Create host config file <code class="highlighter-rouge">/etc/apache2/sites-available/gaiamobile.org</code></p>
<script src="https://gist.github.com/kylewu/2641287.js"></script>
<p>Run the following commands in order</p>
<div class="highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sudo a2enmod expires
sudo a2enmod vhost_alias
sudo a2ensite gaiamobile.org
sudo apache2ctl graceful
</code></pre></div></div>
<p>We need to modify Vagrant configure file to visit apache from local machine. Add the next line in Vagrant configure file</p>
<div class="highlighter-rouge"><div class="highlight"><pre class="highlight"><code>config.vm.forward_port 80, 4567
</code></pre></div></div>
<p>And run <code class="highlighter-rouge">vagrant reload</code>. Then we can visit 127.0.0.1:4567.</p>
<p>To see real gaia interface, add following lines in <code class="highlighter-rouge">/etc/hosts</code>, and open <code class="highlighter-rouge">homescreen.gaiamobile.org</code></p>
<div class="highlighter-rouge"><div class="highlight"><pre class="highlight"><code>127.0.0.1 gaiamobile.org
127.0.0.1 homescreen.gaiamobile.org
127.0.0.1 dialer.gaiamobile.org
127.0.0.1 sms.gaiamobile.org
127.0.0.1 browser.gaiamobile.org
127.0.0.1 maps.gaiamobile.org
127.0.0.1 camera.gaiamobile.org
127.0.0.1 gallery.gaiamobile.org
127.0.0.1 video.gaiamobile.org
127.0.0.1 market.gaiamobile.org
127.0.0.1 music.gaiamobile.org
127.0.0.1 settings.gaiamobile.org
127.0.0.1 clock.gaiamobile.org
127.0.0.1 crystalskull.gaiamobile.org
127.0.0.1 penguinpop.gaiamobile.org
127.0.0.1 towerjelly.gaiamobile.org
127.0.0.1 wikipedia.gaiamobile.org
127.0.0.1 cnn.gaiamobile.org
127.0.0.1 bbc.gaiamobile.org
127.0.0.1 nytimes.gaiamobile.org
127.0.0.1 calculator.gaiamobile.org
127.0.0.1 system.gaiamobile.org
</code></pre></div></div>
<p>For more detail about hacking Gaia, please go to <a href="https://wiki.mozilla.org/Gaia/Hacking">gaia-hacking</a>.</p>
<h1 id="mac-b2g-desktop">Mac-B2G-Desktop</h1>
<p>If you are a lazy man like me and you are using Mac, maybe you like to have a working B2G browser. @pauljt provides a build of b2g desktop for Mac OS in <a href="https://github.com/pauljt/mac-b2g-desktop">mac-b2g-desktop</a>.</p>
<h1 id="gaia">Gaia</h1>
<p>All previous work is to prepare the dev env. It is time to meet Gaia.</p>
<p>Go to Gaia folder and modify Makefile. Set <code class="highlighter-rouge">DEBUG</code> to 1 and <code class="highlighter-rouge">Port</code> to 4567. Then run <code class="highlighter-rouge">make</code>. It will do a lot of work and what we need is the profile it generates.</p>
<p>That’s all. Open your browser with the profile we just get
<code class="highlighter-rouge">/Applications/B2G.app/Contents/MacOS/b2g -profile ~/gaia/profile</code></p>
<p>We will get the window just like the image in the beginning in this post.</p>
Gaia
2012-04-27T22:00:00+00:00
http://wenbinwu.com/%E7%BC%96%E7%A8%8B%E6%8A%80%E6%9C%AF/2012/04/27/gaia
<p>I am gonna start to work for <a href="https://github.com/andreasgal/gaia">gaia</a> next month. It is so exciting.</p>
<blockquote>
<p>Gaia is the user interface for b2g,
and it is a Web application that runs locally on a B2G device, emulator, desktop build, or Firefox build.</p>
</blockquote>
<p>There are lots of knowledge I need to learn, such as <a href="https://developer.mozilla.org/en/Mozilla/Boot_to_Gecko">b2g</a> and jQueryMobile.</p>
Add footnote in ModernCV template
2012-04-07T22:00:00+00:00
http://wenbinwu.com/%E6%9D%82%E4%B8%83%E6%9D%82%E5%85%AB/2012/04/07/add-footnote-in-moderncv-template
<p>Today, I was updating my CV. The CV is writtern in Latex, using ModernCVtemplate. For some reason, I need to use footnote. However, it seems<code class="highlighter-rouge">\footnote</code> does not work properly in the template.</p>
<p>My solution is to add <code class="highlighter-rouge">\usepackage{footmisc}</code> under the first line of the texfile. Then add <code class="highlighter-rouge">\footnotemark[num]</code> whereever you like. Put <code class="highlighter-rouge">\footnotetext[num]{sometext}</code> in the outer level of your source file. With <code class="highlighter-rouge">[num]</code>, we can have samemarks in different places which fits my need pretty well.</p>
Beer and Coder
2012-03-29T22:00:00+00:00
http://wenbinwu.com/%E6%9D%82%E4%B8%83%E6%9D%82%E5%85%AB/2012/03/29/beer-and-coder
<p><img src="/assets/beer-icon.png" alt="beer" /></p>
<p>Beer is the world’s most widely consumed alcoholic beverage; it is the third most popular drink overall, after water and tea.[[wiki:beer]]</p>
<p>In a word, I like beer as I always say in front of new friends. For coder, there is even a conception called ‘Beerware’ [[wiki:beerware]]. Beer makes me feel comfortable and focus on one thing.</p>
<p>See the photo above? Quite cool, is it? It is the beer glass from Github. I bought a set of it and really enjoy it when I code.</p>
<p>Drink a beer and let’s code.</p>
Handle mail log
2012-03-27T22:00:00+00:00
http://wenbinwu.com/%E7%BC%96%E7%A8%8B%E6%8A%80%E6%9C%AF/2012/03/27/handle-mail-log
<p>It is the end of March today, so I am going to send mass mails to my users. One big problem to send tons of email is to avoid being recognized as a spammer.</p>
<p>However, this is not the topic of this post. I am gonna use one line to handle mail log, and update status in database.</p>
<p>Some users may use unavailable email account, which is quite a waste to send to them. So when I get one error in mail log, I should update database in order to avoid to send to this address in the next time.</p>
<p>The command is as below:</p>
<p><code class="highlighter-rouge">cat /var/log/mail.log | grep "User unknown" | grep -v "postmaster" | awk {'print $7'} | cut -d "=" -f 2 | tr -d "&lt;&gt;,"| xargs -i mysql -uxxxx -pxxxx xxxx -e 'update mail_subscriber set status=-1 where email="{}";'</code></p>
<p>It is quite straightforward. First it get lines I am interested in. Then get email address from these lines. At last, execute one update sql clause. Please notice, there are many different error message in the log and this command only takes care of ‘User unknow’ error.</p>
Several useful linux commands
2011-03-18T23:00:00+00:00
http://wenbinwu.com/%E6%9D%82%E4%B8%83%E6%9D%82%E5%85%AB/2011/03/18/several-useful-linux-commands
<ul>
<li><code class="highlighter-rouge">$ sudo !!</code> - run the previous command with superuser privileges.</li>
<li><code class="highlighter-rouge">$ cd !$</code> - the “!$” is a shortcut for the argument used in the last command. So if you create a directory in one like using mkdir, you can type this command to change to that directory without needing to type out the whole directory name. Handy!</li>
<li><code class="highlighter-rouge">$ !cd</code> - re-run the most recent command starting with “cd”.</li>
<li><code class="highlighter-rouge">$ ^save^dave^</code> - re-run the previous command, replacing the first instance of “save” with “dave”.</li>
<li><code class="highlighter-rouge">$ CTRL-r</code> - search backwards through your commands (great for re-running a recent command).</li>
</ul>
Install Erlang on Mac
2010-08-26T22:00:00+00:00
http://wenbinwu.com/%E7%BC%96%E7%A8%8B%E6%8A%80%E6%9C%AF/2010/08/26/install-erlang-on-mac
<p>Before install Erlang, please make sure GCC is installed.</p>
<ul>
<li>Download Erlang source code from <a href="http://www.erlang.org/download.html">http://www.erlang.org/download.html</a></li>
<li>Unarchive the file</li>
<li>run Terminal and follow the steps</li>
</ul>
<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code> <span class="nb">cd </span>otp_src_R14A
./configure
make
<span class="nb">sudo </span>make install
</code></pre></div></div>
<ul>
<li>type erl in Terminal, it should be ok now.</li>
</ul>
<p>There is a plugin for XCode to use Erlang.</p>
<p>Download from <a href="http://sourceforge.net/projects/quickconnect/">http://sourceforge.net/projects/quickconnect/</a> , and run it.</p>
Quickly turn off the screen in Mac
2010-08-13T22:00:00+00:00
http://wenbinwu.com/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/2010/08/13/quickly-turn-off-the-screen-in-mac
<p>Did you turn off the screen by pressing Fn + F1 several times?</p>
<p>Try to use Ctrl + Shift + power button.</p>
<p>Don’t forget that cmd + opt + power button can make mac sleep.</p>
Illinois Multicore Summer Course
2010-07-23T22:00:00+00:00
http://wenbinwu.com/%E7%BC%96%E7%A8%8B%E6%8A%80%E6%9C%AF/2010/07/23/illinois-multicore-summer-course
<p>The course of multicore is one week long (5 days actually).</p>
<p>Here is some key word during the course:</p>
<ul>
<li>shared memory</li>
<li>OpenMP</li>
<li>PThreads</li>
<li>TBB (intel)</li>
<li>VS2010</li>
<li>Vectorization</li>
<li>GPU</li>
<li>java parallelism</li>
</ul>
<p>Both TBB and VS2010 are very good tools to develop multicore programme. There are many websites about these topics.</p>
Fix 'Taglist: Failed to generate tags' in Vim
2010-07-12T22:00:00+00:00
http://wenbinwu.com/%E7%BC%96%E7%A8%8B%E6%8A%80%E6%9C%AF/2010/07/12/fix-taglist-failed-to-generate-tags-in-vim
<p>When open taglist in vim, it may says:</p>
<blockquote>
<p>Taglist: Failed to generate tags for /my/path/to/file</p>
<p>ctags: illegal option – -^@usage: ctags [-BFadtuwvx] [-f tagsfile] file …</p>
</blockquote>
<p>Solution is quite easy, open .vimrc and add the following line</p>
<p><code class="highlighter-rouge">let Tlist_Ctags_Cmd='/location/ctags'</code></p>
<p>In my mbp, Snow Leopard, it is <code class="highlighter-rouge">/opt/local/var/macports/software/ctags/5.8_0/opt/local/bin/ctags</code></p>
2010 World Cup Souch Africa
2010-06-15T22:00:00+00:00
http://wenbinwu.com/%E7%94%9F%E6%B4%BB%E7%82%B9%E6%BB%B4/2010/06/15/2010-world-cup-souch-africa
<p><img src="/assets/wc2010logo.png" alt="fifa" /></p>
<p>Brazil and North Korea, good luck.</p>
Implementation of matrix multiplication fox algorithm using MPI
2010-05-04T22:00:00+00:00
http://wenbinwu.com/%E7%BC%96%E7%A8%8B%E6%8A%80%E6%9C%AF/2010/05/04/implementation-of-matrix-multiplication-fox-algorithm-using-mpi
<p>Software efficiency always improves a lot by parallelizing. Here is an implementation of fox algorithm, which is one of the algorithms calculating matrix multiplication, using MPI.</p>
<blockquote>
<p><a href="http://en.wikipedia.org/wiki/Message_Passing_Interface" title="MPI">Message Passing Interface</a> is a specification for an API that allows many computers to communicate with one another.</p>
</blockquote>
<p>MPI is an parallel library to help programming. Its main idea is transferring messages between processes, which are paralleling running in different cores or even CPUs. About fox algorithm, I recommend everyone read this <a href="http://facultyfp.salisbury.edu/taanastasio/COSC490/Fall03/Lectures/FoxMM/example.pdf" title="fox algorithm">pdf file</a>.</p>
Advertisement in streaming tv
2010-03-03T23:00:00+00:00
http://wenbinwu.com/%E4%BA%92%E8%81%94%E7%BD%91/2010/03/03/advertisement-in-streaming-tv
<p><img src="/assets/4362449294_fd9ea1423d_s.jpg" alt="Pancake Day" /> There was a international friendly football match yesterday, that was China vs Portugal. Obviously, the result is pretty easy to guess. However, I, as a chinese football fan, would like to watch this game.</p>
<p>For some reason, CCTV didn’t broadcast. I searched in google, and found a great website.</p>
<p>In the first several minutes, the speed was very very good. Suddenly, it stopped.</p>
<p><img src="/assets/4407220242_0236c89792.jpg" alt="vshare_ad" /></p>
<p>You see, I should click the advertisement to continue watching the game. Great idea, ha?</p>
<p>I think this is not a bad idea. For one thing, when the advertisement appears, people need some time to response. It’s helpful for those slow internet connection to buffer. For another, advertisement gives tv provider great profit to support this great work.</p>
High performance machine
2010-02-16T23:00:00+00:00
http://wenbinwu.com/%E7%BC%96%E7%A8%8B%E6%8A%80%E6%9C%AF/2010/02/16/high-performance-machine
<p>This is my first time using high performance machine. Although the machine is only for student, and of course, it is not good as those pro machines, it is still a good experience for me. ssh remote machin, returns:</p>
<div class="highlighter-rouge"><div class="highlight"><pre class="highlight"><code>## Last login: Wed Feb 17 15:02:15 2010 from nl103-144-35.student.uu.se
Interactive cluster at Uppmax, Uppsala Universitet
Access node; os1
* * *
**Hardware:
IBM X3455 dual Opteron 2220SE, 2.8GHz nodes. 4*10=40 cores
8GB RAM, Infiniband and Gigabit interconnect**
Infiniband is not available for MPI programming due to system problems\n Software:
Scientific Linux SL release 5.2, kernel 2.6.18-92.1.18.el5
SGE version 6.2, Grid Engine queue system
"man sge_intro" for an overview.
GCC version 4.3 c,c++,fortran and java
module load gcc
PGI version 7.2 & 8.0, 64 bit compilers (C,C++,F77,F95,HPF)
module load pgi
Intel version 10.1 & 11.1, 64 bit compilers (C,C++,Fortran)
module load intel
MPI, OpenMPI libraries, default 1.2.9, 1.3 available
module load pgi openmpi
module load gcc openmpi
mpicc or mpif90 to compile
mpirun to execute.
qsub -pe dmp8 16, to submit a 16 slot mpi job
openMP is available in pgi, intel and gcc
QUEUES and PEs:
os: 160 slots main queue (overbooked)
-pe dmp NN, distributed on nodes, 16 slots per node (4 cores)
-pe smp NN, shared memory, 1 single node for up to 16 threads (4 cores)
User Limits:
The login nodes are intended for short test runs only, max cputime is 30min
INTERACTIVE:
Use qsh to request a interactive job and recive a xterm.
e.g. qsh -l h_rt=01:00:20
**NB qlogin dont work at the moment use qsh**
(Use qlogin to execute an interactive session without starting a xterm. )
NB X-forwarding is working!
(If you have logged in with "ssh -X os.uppmax.uu.se" !!!)
Dont forget to request h_rt
* * *
News:
2009-11-20 os6 restarted due to system problems
2009-10-7/8 Service stop
New file server "bubo" introduced for all uppmax storage.
Your home directory is now in /bubo/home/h?/user.
Refer to this using "$HOME" in your programs.
To ease the transition we have defined symbolic links so that the old
directory names are usable for a short time.
2009-07-07 Compilers: PGI is updated to 9.0, default is kept as 8.0
If you want the latest version use "module load pgi/9.0"
Intel is updated to 11.1 (build 038), 11.0 (build 084) is kept as default
If you want the latest version use "module load intel/11.1"
2009-03-17 Infiniband removed from openmpi due to stability problems\n 2008-11-28 OS-kluster is reinstalled with SL 5.2
R is now a module to run R please load the module first
"module load R"
Sun Grid Engine updated to 6.2
I use bold font to indicate hardware.
</code></pre></div></div>
Display Gnu Grub screen after my upgrading my Ubuntu
2010-01-21T23:00:00+00:00
http://wenbinwu.com/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/2010/01/21/display-gnu-grub-screen-after-my-upgrading-my-ubuntu
<p><img src="/assets/4294645799_c7940bd8a2.jpg" alt="GRUB_screenshot" /></p>
<p><a href="http://wubi-installer.org/">Wubi</a> is a great tool which can help you install Ubuntu in Windows without changing partition. I installed Ubuntu by using Wubi. Really easy!</p>
<p>But, after I upgraded Ubuntu and rebooted, there was no Ubuntu login windows. What I saw is a black screen. It said GNU Grub, Minimal Bash-like shell blabla. I have to say I don’t like it, and you won’t, either.</p>
<p>Luckily, it is easy to find a solution. I searched ‘wubi ubuntu gnu grub’ in Google. The author of Wubi showed his <a href="https://bugs.launchpad.net/ubuntu/+source/lupin/+bug/477169/comments/210">solution</a>:</p>
<blockquote>
<p>For a patch/workaround:</p>
<p>A) get the wubildr in <a href="https://bugs.edge.launchpad.net/ubuntu/+source/grub2/+bug/477104/comments/90">https://bugs.edge.launchpad.net/ubuntu/+source/grub2/+bug/477104/comments/90</a> and copy it over <code class="highlighter-rouge">C:wubildr</code></p>
<p>B) ensure that when you boot there is no command “insmod ntfs”. Press “e” at the grub boot menu to edit the relevant entry and remove “insmod ntfs” before proceeding</p>
<p>New ubuntu/wubi installations do not contain the patch yet. The patch will only be applied once there is a clear confirmation (from you) that it actually solves the problem. Hence your feedback is appreciated.</p>
</blockquote>
<p>Right, that’s it, download that file and copy it over. There are also some other solutions in which you need to type lots of commands in command line. I think, the solution of his, the author of Wubi, is better :)</p>
ailurus, wonderful tool for linux beginner
2010-01-14T23:00:00+00:00
http://wenbinwu.com/%E5%AE%9E%E7%94%A8%E8%BD%AF%E4%BB%B6/2010/01/14/ailurus-wonderful-tool-for-linux-beginner
<p><img src="/assets/4276343982_28426d486c_s.jpg" alt="ailuruslogo" /></p>
<p>If you are a beginner of Linux, especially, Ubuntu, this software is what you need. <a href="http://code.google.com/p/ailurus/" title="ailurus">Ailurus</a> is a great tool which can help you “Install software”, “Configure Linux” and “Study Linux skills”.</p>
<p><a href="http://code.google.com/p/ailurus/" title="ailurus">Ailurus</a> is an open source software, located in Google Code, here is the <a href="http://code.google.com/p/ailurus/" title="ailurus">link</a>. You can find download address from right side of <a href="http://code.google.com/p/ailurus/" title="ailurus">ailurus</a> homepage. Let’s see what <a href="http://code.google.com/p/ailurus/" title="ailurus">ailurus</a> looks like.</p>
<p><img src="/assets/4276329002_c97a001bbb.jpg" alt="ailurus" /></p>
<p>It looks like Add/Remove Application in Ubuntu 9.04 and before, right? Install software is its main job. Besides that, you can make enhancements, and also install Firefox extensions.</p>
<p><img src="/assets/4276329806_43745efc80.jpg" alt="ailurus install software" /></p>
<p>You can also see your computer or system information. Linux beginner can learn a lot of useful tips from ailurus. Just click the buttons in the bar.</p>
<p><img src="/assets/4276329004_b4f7394e32.jpg" alt="ailurus bar" /></p>
<p><img src="/assets/4275584873_7e59455d30.jpg" alt="ailurus Tip of the Day" /></p>
<p>There are many more great functionalities in <a href="http://code.google.com/p/ailurus/" title="ailurus">ailurus</a>. Download and try it, i’m sure you’ll love it.</p>
用Google Chrome代替Firefox
2009-12-09T23:00:00+00:00
http://wenbinwu.com/%E4%BA%92%E8%81%94%E7%BD%91/2009/12/09/google-chrome-firefox
<p><img src="/assets/4270880393_df4e270ed2.jpg" alt="chrome" /></p>
<p>自Google Chrome推出以来,受到很多人的喜爱。但是以前仅有Windows版本的,不过现在,Google Chrome for Linux终于出现了。<a href="http://www.google.com/chrome">这里</a>可以下载到。感觉速度真的很快,比Firefox强很多。之前我已经使用过Chromium一段时间,不过苦于没有扩展,所以一直没有放弃firefox。但是现在,有相当多扩展可以下载和使用,是时候放弃Firefox了。</p>
<p><a href="http://lifehacker.com/5421752/18-extensions-worth-downloading-from-google-chromes-gallery">LifeHacker</a>介绍了<a href="http://lifehacker.com/5421752/18-extensions-worth-downloading-from-google-chromes-gallery">18款扩展</a>,我没有全部使用,只使用了一部分,这里做个简要介绍。</p>
<p><a href="https://chrome.google.com/extensions/detail/ajpgkpeckebdhofmmjfgcjjiiejpodla"><strong>Xmarks for Chrome Beta</strong></a>, 这款扩展我不多说了,我一直没有放弃Firefox的主要原因就是它。它可以同步书签到网络上,免去了备份书签的困扰。</p>
<p><a href="https://chrome.google.com/extensions/detail/ikefielkhonlbnjjfhcjmepanaeajkbh"><strong>Google Alerter</strong></a>,提示GMail, Google Wave和Google Reader的未读数目。代替了Firefox下GMail Notifier等扩展。</p>
<p><a href="https://chrome.google.com/extensions/detail/chieodlkhimccchlojdmiondhiggkhmf"><strong>ChromeMilk</strong></a>,专门针对Remember the milk的扩展,Remember the milk是一个GTD网站。</p>
<p>主要是这三个插件,当然还有针对twitter,flickr, delicious等的插件,具体请到LifeHacker上自行查找,链接在<a href="http://lifehacker.com/5421752/18-extensions-worth-downloading-from-google-chromes-gallery">这里</a>。</p>
VeryCD消失后,我该怎么办?
2009-12-08T23:00:00+00:00
http://wenbinwu.com/%E4%BA%92%E8%81%94%E7%BD%91/2009/12/08/verycd-gone
<p><img src="/assets/emule.png" alt="" title="VeryCD" /></p>
<p>最近国内的各个bt站点相继出现了问题,verycd也在今天不能访问,表面原因众所周知。很多知名博客都对此做了报道和分析。迅雷,土豆等类似提供在线视频的网站必定也会有所影响。</p>
<p>海盗湾的消失并没有将bt消灭,准确点说,这些网站是信息发布的平台,你可以在上面找到各种信息。正如google的作用,你可以在google进行搜索,如果没有google,这些信息就消失了么?不会。这些网站从视野中消失后,一方面,一定会有后继网站出现,二,这种封杀不会是长久的。所以,没必要过于紧张。</p>
<p>关键的问题是以现在的形式,如何在浩瀚的网络中找寻想要的信息,主要指影视,音乐,游戏等方面。相对于国外,国内可能暂时性不容易找到解决方案,不过迅雷暂时还没有出问题,所以这应该给迅雷带去相当多的流量。别忘了emule的搜索功能,虽然自我感觉不是很准确,但比没有要强一些。喜欢看美剧的同学也不用急,用英文google一搜一大把。同时,也别忘了直接HTTP,FTP下载,有时候也是不错的。这里,我没有细致介绍如何找下载资源,但我相信,用百度和Google已经足够了。</p>
<p>总之,同学们不要着急,网络是开放的,不可能由于某几个网站的消失就造成网络的瘫痪。</p>
<p>ps. 正好趁这个机会少下点东西,好好复习,迎接圣诞假期。</p>
在瑞典查询国内的邮件
2009-11-22T23:00:00+00:00
http://wenbinwu.com/%E7%94%9F%E6%B4%BB%E7%82%B9%E6%BB%B4/2009/11/22/sweden-track-mail
<p>在国内向国外寄信的时候,会得到一个邮件编号,利用这个编号就可以查询到邮件现在的位置。</p>
<p>国内的部分可以在183查到,链接在<a href="http://intmail.183.com.cn/item/trace/itemTraceAction.do?action=Enter">这里</a>。把编号填进去就可以追踪到邮件在国内的位置。</p>
<p>国外的部分需要在瑞典的邮政网上查询,链接在<a href="http://www.posten.se">这里</a>,是瑞典文的,如果看不懂可以用Google Translate翻译。</p>
<p>不过有一段时间是查询不到,也就是从国内到国外的过程,这里只能等了。</p>
<p>至于邮寄到其他国家的邮件,一样可以查询,只不过国外的网站需要查询。在google.com上以国家和post为关键词搜索,一般第一条就是了。</p>
Failed to load module "globalmenu-gnome"
2009-11-22T23:00:00+00:00
http://wenbinwu.com/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/2009/11/22/failed-to-load-module-globalmenu-gnome
<p><img src="/assets/4125268091_88e3b40a34_s.jpg" alt="globalmenu" /></p>
<p>Global Menu是Mac OS系统的一个基本功能,用过Mac的肯定都知道。使用Gnome的Linux一样可以做到,<a href="http://code.google.com/p/gnome2-globalmenu/">这里</a>是gnome2-globalmenu的项目主页,有兴趣的可以看一下,里面的wiki挺全,有安装方法介绍。这篇文章不是介绍如何安装global menu,而是解决卸载后出现的一个小问题。</p>
<p>在卸载global menu后,如果你从命令行启动程序,就会发现往往都会提示如下的错误</p>
<blockquote>
<p>Gtk-Message: Failed to load module “globalmenu-gnome”: libglobalmenu-gnome.so: cannot open shared object file: No such file or directory</p>
</blockquote>
<p>说明在启动程序时,依然去调用globalmenu-gnome模块,但是由于已经卸载,所以提示没有找到。</p>
<p>解决方法很简单,运行<code class="highlighter-rouge">gconf-editor</code>,然后找到app -> gnome_setting_daemon -> gtk-modules,在右方可以看到global menu还是选中状态,取消选中或者删除就可以了。这样子再次运行程序就不会出现错误了。</p>
zz让 Karmic 启动再快 5 秒
2009-11-02T23:00:00+00:00
http://wenbinwu.com/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/2009/11/02/zz-karmic-5-seconds-faster
<blockquote>
<p>真的很管用,几乎瞬间就看到了桌面,太棒了。 – Kyle Wu</p>
</blockquote>
<p>是真的! Karmic 开机已经很快了,可是还可以再快 5 秒! 5 秒当然只是大约大部分人得到的结果~ 可能已经习惯了 Karmic 启动的快速吧~ 我自己就感觉不太明显~ 我升级前也忘记了先把启动时间记下~ 不过既然<a href="http://www.omgubuntu.co.uk/2009/10/get-dramatically-faster-boot-times-in.html">原文</a>的评论这么多人都得到了 5 秒的结果,也不会假吧~</p>
<p>好吧~ 方法就是加入一个 ppa 源,然后更换内核~</p>
<p>请注意哦~ 我不保证这一内核能在你的电脑上稳定使用哦~ 系统挂掉了可不要找我算账哦~ 我是一个负责人的人</p>
<p>这毕竟有风险哦~ 如果你是很新手或不想折腾的话~ 还是劝告你不要尝试了~ 因为就提升那一点启动速度,对你实际使用没有太明显,毕竟 5 秒,喝口水,白日梦还没法完就过去了~ 况且,用电脑也不是整天重启的啊~</p>
<p>Step1:</p>
<div class="highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sudo add-apt-repository ppa:ubuntu-boot/ppa
</code></pre></div></div>
<p>或者</p>
<div class="highlighter-rouge"><div class="highlight"><pre class="highlight"><code>ppa:ubuntu-boot/ppa
</code></pre></div></div>
<p>Step2:</p>
<div class="highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sudo apt-get update && sudo apt-get dist-upgrade
</code></pre></div></div>
<p>完成后重启,据说第一次启动是感觉不出的~ 可能是因为要 readahead 需要 profile 一下吧~ 不过,如果真是 profile 的话,貌似时间和以前 9.04 相比,耗时也太短了~ 了解真相的朋友请相告知哦~</p>
<p>Hope you guys enjoy it!!</p>
<p>源在<a href="http://kwanlife.yo2.cn/articles/karmic-boot-up-reduce-5sec.html">这里</a>。</p>
解决VLC Media Player 中文字幕乱码的问题
2009-10-10T22:00:00+00:00
http://wenbinwu.com/%E5%AE%9E%E7%94%A8%E8%BD%AF%E4%BB%B6/2009/10/10/vlc-media-player
<p><img src="/assets/3998103185_4b9b2ebd08.jpg" alt="vlc" /></p>
<p>重装了一次Ubuntu,带来一个问题。本来VLC Player放电影时字幕没有问题,改成GTK就可以正常显示。但是这次重装以后,仅修改encoding不起作用。搜了很多网页,主要就是修改encoding,并且把字体改为中文字体。不过最后通过Ubuntu Wiki搞定了。</p>
<p>方法就是进入<code class="highlighter-rouge">/etc/fonts/conf.d/</code>文件夹,修改<code class="highlighter-rouge">49-sansserif.conf</code>这个文件。将最后一个看到的字体改为一个中文字体,我改为了WenQuanYi Zen Hei。就是这么简单。Wiki的地址在<a href="http://wiki.ubuntu.org.cn/Vlc">这里</a>。</p>
成功Ubuntu下安装TP-Link TL-WN821N无线网卡的驱动
2009-10-02T22:00:00+00:00
http://wenbinwu.com/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/2009/10/02/ubuntu-tp-link-tl-wn821n
<p>我的笔记本没有无线网卡,出国前特意买了一个无线网卡,以备不时之需。我买的无线网卡是TP-Link TL-WN821N,只有Windows的驱动,不支持Linux。今天搜索了一下,找到了解决方案。</p>
<p>其实方法十分简单:</p>
<ul>
<li>安装ndiswrapper,尝试apt-cache search搜索一下,我9.04Ubuntu可以找到,Sweden的源。
接下来就可以找到System -> Administration -> Windows Wireless Drivers。</li>
<li>这时候需要无线网卡的驱动,从<a href="http://www.iogear.com/support/driver/GWU623.zip">这里</a>下载。
然后Install这个驱动。</li>
<li>安装wicd,我可以从源中直接安装,找不到的同学自己搜索一下官网吧。</li>
</ul>
<p>安装以后重启一下,就可以发现wicd network manager已经代替了原来的Network Manager。</p>
<p>还是很简单的,这个方法我只测试了我自己的TP-Link TL-WN821N无线网卡,不知道其他TP-Link的可不可行。</p>
<p>最后提供两个网址,我也是从这里找到解决办法的,<a href="http://forum.ubuntu.org.cn/viewtopic.php?f=116&t=147947">Link1</a>,<a href="http://www.paoto.com/2009/08/11/ubuntu-904-%E6%97%A0%E7%BA%BF%E7%BD%91%E5%8D%A1%E4%B8%8D%E8%83%BD%E6%AD%A3%E7%A1%AE%E4%BD%BF%E7%94%A8%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88/">Link2</a>。</p>
将Ubuntu美化为Mac
2009-09-26T22:00:00+00:00
http://wenbinwu.com/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/2009/09/26/ubuntu-beauty-mac
<p><img src="/assets/3957540769_49b215598d.jpg" alt="Screenshot-awn_elements.png" /></p>
<p>很早以前就听说过Mac4Lin这个美化包,今天尝试了一下,效果很不错,先上张图同学们看看效果。</p>
<p><img src="/assets/3957547363_62fd364490.jpg" alt="Mac4Lin Screenshot" title="Mac4Win" /></p>
<p>ok,感觉还是不错的吧,下面介绍一下如何安装。</p>
<p>从Mac4Lin的<a href="http://sourceforge.net/projects/mac4lin/" title="Mac4Lin">主页</a>上下载到最新的包,我下载的还是1.0,32.9MB。下载好后解压,然后cd到解压目录,执行
<code class="highlighter-rouge">sh Mac4Lin_Install_v1.0.sh</code>。安装过程中会有提示,请按照提示操作。</p>
<p>安装完以后就很明显看到效果了。希望使用Dock的同学可以再安装AWN Dock。</p>
<div class="highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sudo apt-get install avant-window-navigator
</code></pre></div></div>
<p><img src="/assets/3957540769_49b215598d.jpg" alt="Mac4lin dock" title="Mac4Win Dock" /></p>
<p>我很想在Dock上添加RTM的item,Google上搜索了一下,AWN Dock有这个applet,但是默认的包没有包含,需要再安装extra包。</p>
<div class="highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sudo apt-get install awn-applets-python-extras
</code></pre></div></div>
<p>然后,为了运行RTM的applet,还需要有gtkmozembed的python module,没有的同学执行下面的命令。</p>
<div class="highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sudo apt-get install python-gnome2-extras-dev
</code></pre></div></div>
<p>这样RTM applet就可以使用了。</p>
<p><img src="/assets/3958316400_f9ceab61e5.jpg" alt="Mac4lin rtm" title="Mac4Win RTM" /></p>
<p>这里不多说细节的美化了,想进一步的同学请移步<a href="http://maketecheasier.com/turn-your-ubuntu-hardy-to-mac-osx-leopard/2008/07/23">这里</a>。</p>
How to Think Like a Computer Scientist
2009-09-17T22:00:00+00:00
http://wenbinwu.com/%E7%BC%96%E7%A8%8B%E6%8A%80%E6%9C%AF/2009/09/17/how-to-think-like-a-computer-scientist
<p><a href="http://openbookproject.net//thinkCSpy/index.html">How to Think Like a Computer Scientist</a>,我已经读完了,由于时间紧迫,没有继续写笔记,对不起各位同学。</p>
<p>有一个好消息是,<a href="http://diveintopython3.org/installing-python.html">Dive into Python 3</a>,已经可以看到了,希望学习Python的同学可以去看一下。</p>
强烈推荐Linux用户使用Gnome-Do
2009-09-16T22:00:00+00:00
http://wenbinwu.com/%E5%AE%9E%E7%94%A8%E8%BD%AF%E4%BB%B6/2009/09/16/gnome-do
<p><img src="/assets/3929102202_89893db287_s.jpg" alt="GNOME Do Preview.png" /></p>
<p>Gnome-Do, 一款快速启动软件,专为Gnome开发的,与Windows下很多软件相比,我最喜欢它的插件功能。通过激活相应插件,可以实现很多功能。</p>
<p>安装Gnome-Do很简单,在Ubuntu源中已经有了,当然,也可以自己去官方站点上下载。</p>
<p>装好以后先设置一下快捷键,我设置的<super>+Space。每次按下快捷键就可以看见Gnome-Do的窗口了。</super></p>
<p><img src="/assets/3929105384_c4e043e085.jpg" alt="GnomeDO" /></p>
<p>在窗口中输入需要的操作,最简单的是运行程序,如果我希望打开Eclipse,直接敲入eclipse回车就可以,当然也可以不用输入eclipse全名,Gnome-Do会自动匹配输入的字符串,如果经常打开Eclipse,可能仅仅输入e就可以看到Eclipse了。</p>
<p><img src="/assets/3928321583_05827d5ccb.jpg" alt="GnomeDO-eclipse.png" />]</p>
<p>Gnome-Do有Google Calendar和Remember the milk的插件,可以很方便的添加Event和Task。</p>
<p>还可以快速上传照片到Flickr,TinyURL,甚至发送Twitter,不过我不清楚现在国内可不可以登录Twitter。至于如何使用,可以在选项的插件标签下点击About,会打开相应插件的网页,里面有使用说明。</p>
<p>总之,Gnome-Do还是很强大的,同学们可以自己去试试它提供的插件,别忘了在插件的地方选择‘所有插件’,这样就可以看到更多的功能。</p>
<p><img src="/assets/3928323747_0834d97bec.jpg" alt="GnomeDO-preferences-plugin.png" /></p>
How to Think Like a Computer Scientist
2009-08-11T22:00:00+00:00
http://wenbinwu.com/%E7%BC%96%E7%A8%8B%E6%8A%80%E6%9C%AF/2009/08/11/how-to-think-like-a-computer-scientist-a
<p><a href="http://openbookproject.net//thinkCSpy/ch02.html" title="Variables, expressions and statements">Chapter 2. Variables, expressions and statements</a></p>
<h4 id="值value与类型type">值(Value)与类型(Type)</h4>
<p>每个值属于不同的类型,如整形(<strong>int</strong>),字符串(<strong>str</strong>),浮点型(<strong>float</strong>)</p>
<h4 id="变量variable">变量(Variable)</h4>
<p>变量是代表一个值的名称。(<strong>assignment statement</strong>)新建了一个变量,并为其赋值。(assignment operator)即“=”</p>
<h4 id="变量名与关键字keyword">变量名与关键字(Keyword)</h4>
<p>变量名有一定的要求,并不是每个名称都可用。</p>
<p>关键字是编程语言用来表述规则或结构的名称,变量名不能是关键字。</p>
<p>python有31个关键字。</p>
<h4 id="声明statement">声明(Statement)</h4>
<p>声明是python可以解释执行的一条指令。</p>
<h4 id="操作符operator">操作符(Operator)</h4>
<p>包括+ - * / **以及括号。一般的编程语言在计算时采用普通的计算顺序,括号>成方>乘除>加减。</p>
<h4 id="其他">其他</h4>
<p>python的输入函数</p>
<div class="highlighter-rouge"><div class="highlight"><pre class="highlight"><code>raw_input("Please enter your name: ")
input("Enter a numerical expression: ")
</code></pre></div></div>
<p>注释(<strong>Comment</strong>)
用#进行注释</p>
How to Think Like a Computer Scientist
2009-08-06T22:00:00+00:00
http://wenbinwu.com/%E7%BC%96%E7%A8%8B%E6%8A%80%E6%9C%AF/2009/08/06/how-to-think-like-a-computer-scientist-b
<p><img src="/assets/3798515670_4ac9f30808_s.jpg" alt="gasp_lessons" /></p>
<p><a href="http://openbookproject.net//thinkCSpy/index.html" title="How to Think Like a Computer Scientist: Learning with Python v2nd Edition">How to think like a computer scientist : Learning with Python v2nd edition</a>很不错的一个教程,不仅仅从头讲解了Python,更重要的是帮助我把计算机编程知识进行了一次梳理。</p>
<p>学习笔记(一)针对的是第一章 <a href="http://openbookproject.net//thinkCSpy/ch01.html#the-first-program" title="The way of the program">The way of the program</a></p>
<p>作为一名计算机科学家,最重要的是解决问题的能力。(<strong>Problem solving</strong>)</p>
<h4 id="python">Python</h4>
<p>编程语言可以分为高层语言(<strong>High-level language</strong>)和低层语言(<strong>Low-level language</strong>)。高层语言,比如c++,java,python,需要先转换成低层语言,比如汇编,因此会花费一些时间,这也是高层语言的缺陷。但是高层语言有很大优势</p>
<ol>
<li>编程方便,容易理解</li>
<li>更加轻便(<strong>portable</strong>),可移植性更好,底层语言需要针对不同平台进行修改</li>
</ol>
<p>高层语言转换为地层语言的程序有两种:解释器(<strong>interpreter</strong>)和编译器(<strong>compiler</strong>)。解释器读取代码,一步步执行代码。编译器把源代码 (<strong>Source cod</strong>e)编译为对象码(<strong>Object code</strong>),然后再执行。\n 现代的编程语言普遍采用了这两种方式,先把源代码编译为字节码(<strong>Byte code</strong>),然后在虚拟机(<strong>Virtual machine</strong>)中解释执行。</p>
<p>Python也采用了这两种方式,但是由于程序员编程的方式,一般把python看做解释性语言。Python有两种解释方式:<strong>shell mode</strong>和<strong>script mode</strong>。</p>
<h4 id="什么是程序">什么是程序</h4>
<p>程序是顺序的计算指令。它包含了input, output, math, conditional execution, repetition,任何程序都是由这几个要素组成的。</p>
<h4 id="什么是debug">什么是Debug</h4>
<p>程序的错误就是<strong>bug</strong>,解决bug就是<strong>debug</strong>。</p>
<p>程序的错误分为三种:语法错误(<strong>syntax error</strong>),运行时错误(<strong>runtime error</strong>),语意错误(<strong>semantic error</strong>)。</p>
<p>对于一些人,编程和debug是同时进行的,可以保证程序的可运行性。</p>
<h4 id="形式语言和自然语言">形式语言和自然语言</h4>
<p>自然语言(<strong>Natural language</strong>)就是世界上的语言,英语法语等</p>
<p>形式语言(<strong>Formal language</strong>)是人们为了某个目的设计的,比如数学和化学中语言</p>
<p>形式语言有两个要素:<strong>token</strong>和<strong>structure</strong>。分析语言的过程就是<strong>parsing</strong>。</p>
<p>相比于形式语言,自然语言不明确(ambiguity),重复(redundancy),literalness。</p>
如何在Windows下添加瑞典语输入法
2009-07-28T22:00:00+00:00
http://wenbinwu.com/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/2009/07/28/win-swedish
<p><img src="/assets/3767664513_0916128662_s.jpg" alt="thumbnail_sweden_input" /></p>
<p>即将迈向瑞典国土的我,对瑞典语也产生了兴趣。虽然用英语也可以应付大多数场合,但是会瑞典语还是有不少好处的。今天在UU群里又一次有人提出如何在计算机里输入瑞典语,这里要讲一下,瑞典语和英语有很大的相似度,但是多了几个字母:öÖ,äÄ,åÅ。看到了么,这几个字母在英文输入法下可是不能够打出来的。</p>
<p>安装瑞典语的输入法也很简单的,只需如下几步: 打开“控制面板”,找到“区域和语言选项”,选择“语言”标签,点击“详细信息”,弹出如下窗口。</p>
<p><img src="/assets/3767653415_5d4efe29fc.jpg" alt="sweden_lang_input" /></p>
<p>我已经添加了瑞典语,没有的同学不用着急,点击右方的添加按钮,选择“瑞典语”即可。</p>
<p><img src="/assets/3767683151_1dac07df25.jpg" alt="add_sweden_input" /></p>
<p>一般我们熟悉的切换输入法的快捷键可以修改一下,使之支持跨语种的切换。点击“键设置”按钮,找到“在不同的输入语言切换”,修改一下快捷键,我选择的是左边的Alt+Shift,当然自己习惯就好。</p>
<p>这样就可以输入瑞典语了。Hej då!</p>
<h2 id="几个特殊字母的键位">几个特殊字母的键位</h2>
<blockquote>
<p>; -> ö</p>
<p>’ -> ä</p>
<p>[ -> å</p>
</blockquote>
为Pidgin添加Twitter支持
2009-07-26T22:00:00+00:00
http://wenbinwu.com/%E5%AE%9E%E7%94%A8%E8%BD%AF%E4%BB%B6/2009/07/26/pidgin-twitter
<p><img src="/assets/3761176077_9079e159ce_o.jpg" alt="" title="Pidgin" /></p>
<p>最初知道Pidgin是开始使用Ubuntu,很喜欢这种IM集成的软件,可以同时登陆GTalk,MSN等主流的即时通讯。今天碰巧在网上看到Pidgin可以支持Twitter,于是搜到了这款Pidgin插件,<a href="http://code.google.com/p/microblog-purple/" title="microblog-purple">Microblog-Purple</a>。</p>
<p><a href="http://code.google.com/p/microblog-purple/" title="microblog-purple">Microblog-Purple</a>是针对LibPurple开发的软件(如Pidgin,Finch)开发的插件,使用Google Code提供的SVN服务进行版本控制。</p>
<p>我使用的是Pidgin Portable的版本,也就是PortableApp.com开发的版本,绿色版本。这款插件也提供了针对Pidgin Portable的安装包,在Microblog-Purple主页的右方,可以找到下载链接,我所下载到的是[microblog_.0.2.2<em>for_pidgin_portable_2.5.x-1.exe](http://microblog-purple.googlecode.com/files/microblog</em>.0.2.2_for_pidgin_portable_2.5.x-1.exe “microblog-purple”)。运行后选择Pidgin的安装目录即可。</p>
<p><a href="http://farm4.static.flickr.com/3423/3761977172_11e89ca745_o.png"><img src="/assets/3761977172_11e89ca745_o.png" alt="" title="microblog_purple" /></a></p>
<p><a href="http://farm3.static.flickr.com/2423/3761977386_f97cddee9c_o.png"><img src="/assets/3761977386_f97cddee9c_o.png" alt="" title="microblog_purple" /></a></p>
<p>运行Pidgin就可以在新建的窗口找到Twitter选项了,同时,插件也提供了很多设置选项,最好将Use HTTPS的勾选上。</p>
<p><a href="http://farm4.static.flickr.com/3457/3761176135_4037a6958f_o.png"><img src="/assets/3761176135_4037a6958f_o.png" alt="" title="Pidgin_Twitter" /></a></p>
<p><a href="http://farm4.static.flickr.com/3480/3761977500_e8fbb07e40_o.png"><img src="/assets/3761977500_e8fbb07e40_o.png" alt="" title="Pidgin_Twitter" /></a></p>
<p>现在Twitter被墙掉了,所以要连接上Twitter,需要简单的修改一下Host文件。在Host文件中添加如下内容</p>
<div class="highlighter-rouge"><div class="highlight"><pre class="highlight"><code>128.121.146.228 twitter.com
128.121.146.228 www.twitter.com
128.121.146.101 assets0.twitter.com
128.121.146.101 assets1.twitter.com
128.121.146.101 static.twitter.com
128.121.146.229 assets2.twitter.com
128.121.146.229 assets3.twitter.com
65.74.185.41 twitter.zendesk.com
65.74.185.41 help.twitter.com
</code></pre></div></div>
<p>Twitter账户设置好后,每隔60s(默认设置),就会抓取一次Twitter消息,如果有新消息,将自动弹出。 Pidgin真的是款很好的软件,市面上已经有很多类似软件了,但我感觉,Pidgin还是最好的一款。</p>
Dom4j 中文问题
2009-07-17T22:00:00+00:00
http://wenbinwu.com/%E7%BC%96%E7%A8%8B%E6%8A%80%E6%9C%AF/2009/07/17/dom4j-cn
<p>第一次使用dom4j进行xml文件的处理,使用很简单,开发很高效。</p>
<p>测试中中文会出现乱码,看了一下生成的文件,默认为utf-8存储,这样乱码必然会出现。</p>
<p>解决方法也很简单,见如下代码</p>
<div class="language-java highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">OutputFormat</span> <span class="n">format</span> <span class="o">=</span> <span class="n">OutputFormat</span><span class="o">.</span><span class="na">createPrettyPrint</span><span class="o">();</span>
<span class="n">format</span><span class="o">.</span><span class="na">setEncoding</span><span class="o">(</span><span class="s">"gbk"</span><span class="o">);</span>
<span class="n">XMLWriter</span> <span class="n">writer</span> <span class="o">=</span> <span class="k">new</span> <span class="n">XMLWriter</span><span class="o">(</span><span class="k">new</span> <span class="n">FileWriter</span><span class="o">(</span><span class="s">"commands.xml"</span><span class="o">),</span> <span class="n">format</span><span class="o">);</span>
<span class="n">Document</span> <span class="n">document</span> <span class="o">=</span> <span class="n">reader</span><span class="o">.</span><span class="na">read</span><span class="o">(</span><span class="s">"commands.xml"</span><span class="o">);</span>
<span class="n">writer</span><span class="o">.</span><span class="na">write</span><span class="o">(</span><span class="n">document</span><span class="o">);</span>
<span class="n">writer</span><span class="o">.</span><span class="na">close</span><span class="o">();</span>
</code></pre></div></div>
<p>也就是在写入文件时设置一下编码格式就可以解决乱码问题。</p>
<p><img src="/assets/3728273509_6088773511_o.png" alt="Dom4j" /></p>
TortoiseHg and Mercurial Eclipse
2009-07-16T22:00:00+00:00
http://wenbinwu.com/%E5%AE%9E%E7%94%A8%E8%BD%AF%E4%BB%B6/2009/07/16/tortoisehg-and-mercurial-eclipse
<p>近期在做一个小项目,使用Google Code存储代码,这才发现Google Code 已经支持Mercurial了。于是赶紧把Mercurial装入了机器,并安装了Eclipse的插件,下面简要介绍一下过程。</p>
<p>用过cvs和svn的同学们肯定了解这个小乌龟,不过针对Mercurial的版本TortoiseHg的小乌龟在后背上多了Hg两个字母。</p>
<p><a href="http://farm3.static.flickr.com/2548/3726156014_ec9b032f86_o.png"><img src="/assets/3726156014_ec9b032f86_o.png" alt="" title="TortoiseHg" /></a></p>
<p>这里是TortoiseHg的<a href="http://bitbucket.org/tortoisehg/stable/downloads/" title="TortoiseHg">下载网页</a>。选择所用系统的响应版本即可。安装过程与TortoiseSVN大概相同,装好后重新启动就可以了。在右键菜单中多了TortoiseHg的一个菜单项。</p>
<p>与SVN和CVS相比,由于是分布式概念的版本控制系统,所以使用上与他们不完全一样。至于有何不同,可以参考我之前的两篇转帖。</p>
<p>至此,TortoiseHg安装完毕,有repo的同学们可是尝试使用一下。</p>
<p><a href="http://www.vectrace.com/mercurialeclipse/" title="Mercurial Eclipse">Mercurial Eclipse</a>是一款Eclipse插件,它使Eclipse拥有了对Mercurial的支持。安装可以根据自己喜好,是自定义文件夹还是直接Software Updates(这个的地址是http://www.vectrace.com/eclipse-update/) Eclipse一个工程上右键选Team,然后选Share Project,弹出如下的对话框,然后下一步,选择工程文件夹,完成就可以了。</p>
<p><a href="http://farm3.static.flickr.com/2539/3725349343_16ec59804e_o.png"><img src="/assets/3725349343_16ec59804e_o.png" alt="" title="MercurialEclipse" /></a></p>
<p>再次右键选Team就可以看见这样的菜单了,包含了各种Mercurial的操作。</p>
<p><a href="http://farm3.static.flickr.com/2523/3725349385_92ab6f83b9_o.png"><img src="/assets/3725349385_92ab6f83b9_o.png" alt="" title="MercurialEclipse" /></a></p>
<p>这里没有介绍Mercurial的用法,其实对于版本控制的概念有所了解,那么使用也就是很简单的事情了。</p>
Uppsala University Library Toolbar
2009-07-13T22:00:00+00:00
http://wenbinwu.com/%E4%BA%92%E8%81%94%E7%BD%91/2009/07/13/uppsala-university-library-toolbar
<p>今天在Uppsala University的主页上闲逛,发现了一个好东西Uppsala University Library Toolbar。顾名思义,是一个浏览器中的工具条,现在支持IE和Firefox。</p>
<p>Uppsala University Library Toolbar的英文页面在<a href="http://www.ub.uu.se/toolbar/english.cfm" title="Library Toolbar">这里</a>。我使用Firefox进行安装,过程和普通插件是一样的,装好后重启Firefox就可以看到工具栏工作了。</p>
<p><a href="http://farm3.static.flickr.com/2620/3718976017_78ee9501ae.jpg"><img src="/assets/3718976017_78ee9501ae.jpg" alt="" title="UU-library-toolbar" /></a></p>
<p>与Google Toolbar很像,包含了</p>
<ul>
<li>搜索框</li>
<li>一些Uppsala University Library的常用链接</li>
<li>Uppsala University的rss</li>
<li>邮件检查</li>
<li>在线广播</li>
<li>本地天气</li>
</ul>
<p>其实真的很实用,而其还支持扩展,在最右面有个加号按钮,点击就可以进入一个扩展网页,在喜欢的东西后面有添加按钮。</p>
<p><a href="http://farm3.static.flickr.com/2502/3718976067_ec7e32de26_o.png"><img src="/assets/3718976067_ec7e32de26_o.png" alt="" title="UU-library-toolbar" /></a></p>
<p>Toolbar的设置也很丰富,可以有选择的现实组件,这样不是Uppsala Uviersity的同学也可以使用这个toolbar了。</p>
<p><a href="http://farm3.static.flickr.com/2452/3719789784_fd80005060_o.png"><img src="/assets/3719789784_fd80005060_o.png" alt="" title="UU-library-toolbar" /></a></p>
<p>Email Notifier支持多账户,内建支持包括GMail,HotMail,Yahoo邮箱,还可以自己设置POP3,相当实用。没想到Uppsala University的服务还挺不错的,连toolbar都搞了。记得在南开大学读本科的时候,几位学长做了Firefox南开版,内建了许多针对南开的快速链接,真的很好。</p>
<p>希望一些需要的朋友能够发现这个toolbar,方便自己的工作。</p>
Getting Started with Parallel Programming
2009-07-06T22:00:00+00:00
http://wenbinwu.com/%E7%BC%96%E7%A8%8B%E6%8A%80%E6%9C%AF/2009/07/06/getting-started-with-parallel-programming
<p>自我感觉很不错的一篇文章,介绍并行计算的。</p>
<p>Multi-core computers have shifted the burden of software performance from chip designers to software architects and developers. In order to gain the full benefits of this new hardware, we need to parallelize our code. The goal of this article is to introduce you to parallelism, its different types and to help you understand when to parallelize your code - and when not to. We will also examine some of the tool options developers have today for building parallel applications.</p>
<h3 id="introduction-to-parallelism">Introduction to parallelism</h3>
<p>Traditionally, computer systems have consisted of a processor, a memory system, and various other subsystems. The processor would execute instructions sequentially, which meant that the vast majority of software was typically written for serial computation.</p>
<p>While we were able to improve the speed of our processors by increasing the frequency and transistor count, it was only when computer scientists realized that they had reached the processor frequency limitation that they started to explore new methods for improving processor performance. These included the use of the germanium instead of silicon, co-locating many low frequency and power consuming cores together, adding specialized cores, 3D transistors, and others.</p>
<p>Now we live in the era of multi-core processors. Exploiting large-scale parallel hardware will be essential for improving application performance and its capabilities in terms of executing speed and power consumption.</p>
<h3 id="parallelism-from-a-software-perspective">Parallelism from a software perspective</h3>
<p>Parallelism is a form of computation in which many calculations are carried out simultaneously, operating on the principle that large problems can often be divided into smaller ones, which are then solved concurrently, or ‘in parallel’. Parallelism is all about decomposing a single task into smaller ones to enable concurrent execution.</p>
<p><strong>Parallelism vs. Multithreading</strong> - You can have multithreading on a single-processor machine, but parallelism can only occur on a multi-processor machine. In other words, simply creating more threads will not change your application architecture into a parallel architecture. Today, mainstream developers are comfortable with multithreading and they usually use it for three kinds of scenarios:</p>
<ul>
<li>Background work for better UI response</li>
<li>Asynchronous I/O operation</li>
<li>Event-Based, asynchronous patterns</li>
</ul>
<p><strong>Parallelism vs. Concurrency</strong> - You can refer to multiple running threads as being concurrent but not parallel. Concurrency is often used in servers that operate multiple threads to process requests. However, parallelism is about decomposing a single task into smaller ones to enable execution on multiple processors in a collaborative manner to complete one task.</p>
<p><strong>Parallelism vs. Distributed Systems</strong> - Distributed systems are a form of parallel computing; however, in distributed computing, a program is split up into parts that run simultaneously on multiple computers communicating and sharing data over a network. By their very nature, distributed systems must deal with heterogeneous environments, network links of varying latencies, and unpredictable failures in the network and the computers.</p>
<h3 id="types-of-parallelism">Types of parallelism*</h3>
<p>There are two primary types of parallelism:</p>
<ul>
<li>Task Parallelism</li>
<li>Data Parallelism (a.k.a. Loop-Level parallelism)</li>
</ul>
<p><strong>Task Parallelism</strong></p>
<p>When your application can be thought of as a group of tasks that can execute simultaneously on multiple processors, you have Task Parallelism. Tasks are assigned to threads and may execute on the same or different data. The threads may execute the same or different code.</p>
<p>For example, Task Parallelism can be used when:</p>
<ul>
<li>You need to execute four computations, but you don’t care which one will finish first</li>
<li>You want to load, process, and save many different image files, so you process individual files in parallel</li>
</ul>
<p><strong>Data parallelism</strong></p>
<p>Data Parallelism applies the same instruction to each data element in a thread safe way. It is also known as loop-level parallelism and is similar to SIMD (Single Instruction, Multiple Data). On the other hand, MIMD (Mutiple Instruction, Multiple Data) applies different instructions to different data. SIMD and vectorization are techniques employed by modern processors to achieve data parallelism.</p>
<p>Data parallelism can be used when:</p>
<ul>
<li>You have a large bitmap image and the processing of each pixel is independent</li>
<li>You need to search through a large, unsorted collection of data</li>
</ul>
<p>There are two types of data parallelism:</p>
<ul>
<li>Explicitly Data Parallel</li>
<li>Implicitly Data Parallel</li>
</ul>
<p>In Explicitly Data Parallel you just write a loop that executes in parallel, as I mentioned earlier. This can be done by adding OpenMP pragmas around the loop code, or using a parallel algorithm from <a href="http://library.dzone.com/assets/request/sponsored_link/11287"><strong>Intel® Threading Building Blocks (TBB)</strong></a> (See the ‘Additional Resources’ section below).</p>
<p>In Implicitly Data Parallel you just call some method that manipulates the data and the infrastructure (i.e. a compiler, a framework, or the runtime) and is responsible for parallelizing the work. For instance, the .NET platform provides LINQ (Language Integrated Query) that allows you to use the extension methods, and lambda expressions to manipulate the data like dynamic languages.</p>
<p>The following figure demonstrates implicit data manipulation and parallelism:</p>
<p><img src="/assets/Parallelism_Figure1.png" alt="" /></p>
<p>A: C# implicit data manipulation using LINQ</p>
<p>B: C# parallel implicit data manipulation using LINQ (Note the AsParallel method)</p>
<p><strong>Libraries and compiler-based parallelism</strong></p>
<p>There are two primary types of parallelism frameworks and infrastructure:</p>
<ul>
<li>Language extensions and compiler-based parallelism</li>
<li>Library-based parallelism</li>
</ul>
<p>In language and compiler-based parallelism, the compiler understands some special keywords to parallelize part of the code; for example, in OpenMP you can write the following to parallelize a loop:</p>
<p><img src="/assets/Parallelism_Figure2.png" alt="" /></p>
<p>Language and compiler-based parallelism is easy to use because the majority of the work falls on the compiler.</p>
<p>In library-based parallelism, the programmer should call the exposed parallel APIs. For example, if you want to parallelize a for loop in .NET 4 (C#, or VB) you should call a For method from the System.Thread.Parallel class:</p>
<p><img src="/assets/Parallelism_Figure3.png" alt="" /></p>
<p>This method accepts two integers (from, to) and delegates to the loop body.</p>
<h3 id="parallelism-challenges">Parallelism challenges</h3>
<p>In order to take advantage of multi-core machines, programs must be parallelized. Multiple paths of execution have to work together to complete the tasks the program has to perform, and that needs to happen concurrently, wherever possible. Only then is it possible to speed up the program (i.e., reduce the total runtime). Amdahl’s law expresses this as:</p>
<p><img src="/assets/AmdalLawp.png" alt="" /></p>
<p>Where P is the percentage of the program that can be parallelized, (1-P) is the percentage of serial execution, and S is the number of execution units. This is the theory. Making it a reality is another issue.</p>
<p>Parallelism is hard. If you decide to modify your application to a parallel architecture, you will need to address several issues, such as: Which part of your application should you parallelize and how? How significantly should you alter your application? What should you avoid parallelizing? Answering these questions requires not only technical expertise but also strategic thinking that evaluates the benefits and costs.</p>
<p><strong>When to parallelize your code</strong>
Parallelism won’t benefit the entire application, so you should ask yourself first: do I even need to move to a parallel architecture in the first place? You probably don’t need to parallelize:</p>
<ul>
<li>Really simple applications</li>
<li>Unoptimized serial code</li>
<li>Serial code that is running fast enough already</li>
</ul>
<p>Which part of your application to parallelize is another critical question you need to ask. Parallelism by nature has overhead to start and manage the threads and the tasks, so you should choose the part of your application that really stands to benefit from a parallel architecture. From my experience, this comprises 20% of the application code, but this can be 60% or more if you application is a high-performance computing application, or a 3D game, etc. Here are some guidelines on how to identify the right part of your application to parallelize:</p>
<ul>
<li>Use a profiler. A profiler can help you identify the hot spots of your application, the spots that consume a lot of processing time. In the profiler report focus on the algorithms that take a significant amount of execution time and might benefit from parallel processing: sorting algorithms, code for filtering or processing chunks of data, etc.</li>
<li>Don’t parallelize I/O reading, or writing code except if you know that your target machine has fast I/O components such as RAID HDD.</li>
<li>Be sure that your parallel tasks contain enough computations to make the parallel execution worthwhile. For example, parallelism will not speed up sorting 100 elements (in fact, it might slow this down); however, if you sort 100,000 elements, parallelism could make a difference.</li>
</ul>
<p><strong>The technical challenges</strong>
Dealing with shared data is perhaps one of the first challenges you will face when you start to write parallel code. In my opinion, I think this is really the main parallelism challenge.</p>
<p>To understand the shared data challenge, imagine having two threads that update a shared variable in parallel:</p>
<p><img src="/assets/Parallelism_Figure5.png" alt="" /></p>
<p>The middle column shows the status of the shared data , and the other columns show the threads instructions. When the threads load the initial value of X to increment it, it will be the same ‘0’, which means that the finial value will be 1 instead of 2 (i.e. both threads don’t know that X has been fetched into another CPU registry to increment).</p>
<p>So we need some kind of atomic operations, or lock to control the shared data modification. However, use of locks add overhead and minimize the performance benefits. They can also lead you to deadlocks. Still, they may be necessary to ensure that the correct answers are computed. Managing locks and minimizing their impact is another major challenge to writing parallel applications.</p>
<h3 id="parallelism-in-the-real-world">Parallelism in the real world</h3>
<p>Regardless of the challenges, parallelism is being used to solve some very real business problems in various application domains: server applications, high performance computing environments, and in the gaming industry. Today, parallelism continues to enter into the world of mainstream software development.</p>
<p>Servers have long been the main types of parallel and concurrent systems that have enjoyed commercial success. Their main workload consists of mostly independent requests that require little or no coordination and share little data. As such, it is relatively easy to build a parallel Web server application, since the programming model treats each request as an independent sequential computation. Building a Web site that scales well is an art; scale comes from replicating machines, which breaks the sequential abstraction, exposes parallelism, and requires coordinating and communicating across machine boundaries.</p>
<p>High-Performance Computing followed a different path to using parallel hardware and parallel software because there is no alternative with comparable performance. Commonly HPC relies on distributed systems that are designed to work in parallel to achieve satisfactory performance.</p>
<p>Today, popular programming models such as MPI and POSIX Threads are performance focused, error-prone abstractions that many developers find difficult to use. To address this shortcoming, OpenMP and TBB attempt to further abstract the details from the programmer to make parallel programming easier and less error-prone.</p>
<p>So what about the mainstream?
Today, there is a big trend to make parallel computing more deterministic, and easy. There are many parallelism frameworks, and debugging tools aimed at simplifying the task of parallel programming, such as:</p>
<ul>
<li>Intel Parallel Studio</li>
<li>Microsoft CCR and DSS</li>
<li>MS PPL - Microsoft Parallel Pattern Library (will released in 2009 Q4)</li>
<li>MS .NET 4 - Microsoft .NET Framework 4 (will released in 2009 Q4)</li>
<li>Java 7 (will release in 2009)</li>
<li>PRL - Parallel Runtime Library (Beta 1 released in June 2009)</li>
</ul>
<p>In the following table I have compared the above frameworks: <img src="/assets/Parallelism_Figure6.png" alt="" /> The parallel framework you choose should depend on your platform, and your application. For example, the Parallel Runtime Library is designed to work with high-performance computing environments. The Microsoft .NET Framework 4.0 parallelism API however, is designed to support extensibility, and a wide range of different applications.</p>
<h3 id="what-you-could-find-in-a-parallel-framework">What you could find in a Parallel Framework</h3>
<p>There are a number of key tools you may find in your parallel framework of choice. These include:</p>
<ul>
<li>Parallel APIs</li>
<li>Concurrency Enabled Data Structures - Data structures designed to be thread-safe, which means they will not fault if multiple threads try to access, or manipulate their values at the same time. Examples include: Queue, Stack, Blocking Collection, Hash Table, Linked List.</li>
<li>Other useful stuff such as event objects that make it easier to manage shared data. Examples include: Countdown Event, Waiting objects, and Mutex.</li>
</ul>
<h3 id="conclusion">Conclusion</h3>
<p>The number of cores on processor chips could potentially double every two to three years – in fact, by 2020, we may very well have microprocessors that have 64, 96, or even 128 cores. The challenge that faces us today is how to leverage the power of all these extra cores, without requiring a tremendous amount of programming effort.</p>
<p>Today, it’s clear that parallelism is an important consideration for applications requiring high performance and scalability, but the reality is that implementing a parallel application poses many challenges. Debugging tools and frameworks for parallel programming are maturing though, and promise to make parallel programming much easier for us in the near future.</p>
DUbuntu Jaunty Ctrl+Alt+Backspace
2009-06-03T22:00:00+00:00
http://wenbinwu.com/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/2009/06/03/ubuntu-jauntya-restart-desktop
<p>很多同学应该已经习惯了Ctrl+Alt+Backspace来重启X桌面。但是在Ubuntu Jaunty中,这个快捷键不起作用了。Ubuntu此举是为了避免用户误操作。从我个人来讲,没有了Ctrl+Alt+Backspace十分不方便。</p>
<p>恢复快捷键很方便:</p>
<p>安装dontzap</p>
<div class="highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sudo apt-get dontzap
</code></pre></div></div>
<p>Disable dontzap</p>
<div class="highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sudo dontzap --disable
</code></pre></div></div>
<p>重启电脑。</p>
<p>好了,你可以使用Ctrl+Alt+Backspace了。</p>
Ubuntu下Code----Blocks的GTK+设置
2009-05-31T22:00:00+00:00
http://wenbinwu.com/%E5%AE%9E%E7%94%A8%E8%BD%AF%E4%BB%B6/2009/05/31/ubuntu-bcode-blocks-gtk-plus
<p>在Windows下,Code::Blocks的设置很简单,找到GTK+所在的文件夹,将include,lib文件夹分别写入就可以了。但是在Ubuntu下没有一个单独的文件夹保存所有这些文件,所以配置要麻烦一些。</p>
<p>不过使用pkg-config就很简单了。pkg-config可以帮助我们找到include和lib路径。</p>
<p>命令行下直接键入:</p>
<div class="highlighter-rouge"><div class="highlight"><pre class="highlight"><code>pkg-config --cflags gtk+-2.0
pkg-config --libs gtk+-2.0
</code></pre></div></div>
<p>可以看一下效果。打开Code::Blocks,在Global variable选项里,将include和lib中分别填入如下配置:</p>
<div class="highlighter-rouge"><div class="highlight"><pre class="highlight"><code>pkg-config --cflags gtk+-2.0
pkg-config --libs gtk+-2.0
</code></pre></div></div>
<p><img src="/assets/3583949494_4192c8f8f2_o.png" alt="" title="Code::Blocks" /></p>
<p>这样就可以了,写一个示例程序直接跑就可以了,不会再报找不到头文件的错误了。</p>
<p><img src="/assets/3583141723_1b13c89451_o.png" alt="" title="GTK+" /></p>
<p>这里补充几个可能用到的内容</p>
<div class="highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sudo apt-get install build-essential #这将安装gcc/g++/gdb/make等基本编程工具
sudo apt-get install gnome-core-devel #这将安装 libgtk2.0-dev libglib2.0-dev 等开发相关的库文件
sudo apt-get install pkg-config #用于在编译GTK程序时自动找出头文件及库文件位置
sudo apt-get install devhelp #这将安装 devhelp GTK文档查看程序
sudo apt-get install libglib2.0-doc libgtk2.0-doc #这将安装 gtk/glib 的API参考手册及其它帮助文档
sudo apt-get instal glade libglade2-dev #这将安装基于GTK的界面构造程序
</code></pre></div></div>
TiddlyWiki - 单一网页文件的wiki
2009-05-30T22:00:00+00:00
http://wenbinwu.com/%E5%AE%9E%E7%94%A8%E8%BD%AF%E4%BB%B6/2009/05/30/tiddlywiki
<p>在实习的时候,公司有很多新的技术需要我去学习。而我这人忘性大,总是忘记东西。所以想弄个自己的wiki来记录一下我学到的知识要点。</p>
<p>于是乎我在网上搜了很久,很多wiki,无论是使用何种语言的,多是需要建立服务器,仅为自己记录wiki而开服务器进程是很浪费的。</p>
<p><a href="http://www.tiddlywiki.com/" title="Tiddlywiki">TiddlyWiki</a>仅仅需要一个html网页文件就可以了。它利用css,javascript实现了显示修改,保存等功能,很简单却很强大。</p>
<p><img src="/assets/3577880485_fc7d60e066_o.jpg" alt="" title="TiddlyWiki" /></p>
<p>由于只有一个html文件,所以可以很方便的放入U盘随身携带。另外,TiddlyWiki支持插件,有兴趣的同学可以去TiddlyWiki的站点上去查看。</p>
百度之星astar2009程序设计大赛
2009-05-29T22:00:00+00:00
http://wenbinwu.com/%E7%94%9F%E6%B4%BB%E7%82%B9%E6%BB%B4/2009/05/29/baidu-astar-2009
<p>去年的此时,我参加了百度之星2008的比赛,最终得到一件T-shirt。</p>
<p>今年,百度之星比赛依旧。</p>
<p>今晚将有第一场初赛,需要承认,这一年我没有去看算法的东西,尽我能力吧。</p>
通过U盘安装Gentoo
2009-05-20T22:00:00+00:00
http://wenbinwu.com/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/2009/05/20/udisk-install-gentoo
<p>刚刚将毕业答辩的ppt完成初稿,突然想试一下通过U盘安装Gentoo,所以尝试了一下</p>
<p>在Gentoo的官网上下载minimal的<a href="http://gentoo.ussg.indiana.edu//releases/x86/2008.0/installcd/install-x86-minimal-2008.0.iso" title="download gentoo">iso</a>文件。</p>
<p>下载UltraISO。我使用的是9.1.2版本,链接就不写了,同学们自己搜一下。将U盘插入,启动UltraISO,菜单选择“启动光盘” –> “写入硬盘映像”。</p>
<p><img src="/assets/3549448085_2a07270d8d_o.png" alt="" title="UltroISO" /></p>
<p>格式化后,写入U盘</p>
<p><img src="/assets/3549448091_a347beecc1_o.png" alt="" title="UltraISO" /></p>
<p>重启时,进入BIOS,调整启动顺序,我这里需要把硬盘改为我的U盘,有些机器似乎可以直接选择移动设备。这时就应该可以从U盘启动了。现在大容量U盘比比皆是,而且价格便宜,以后面对iso文件不用再刻盘安装了,也不用麻烦的硬盘安装了,直接通过U盘就可以了。</p>
<p>P.S. 别忘了把U盘内的资料备份,否则资料丢失可就得不偿失了。</p>
Windows 7 RC 尝鲜
2009-05-04T22:00:00+00:00
http://wenbinwu.com/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/2009/05/04/windows-7-rc
<p>Windows 7 已经出了几个版本了,这次带来的可是RC哦。 这个是<a href="http://www.microsoft.com/windows/windows-7/download.aspx">下载地址</a></p>
<p>点进去后,在页面的下方找到Download 32-bit version,选择English,然后点GO按钮 可能需要Live ID登陆,我用的是MSN账号,然后填写一张表格就好了,接下来会看到如下图的页面</p>
<p><img src="/assets/3503181783_1645f69f51_o.png" alt="" title="Download Page" /></p>
<p>记住这个Product key,安装时要用到的(这个Key可以用到7月份)</p>
<p>点击Download Now,就会开始下载了,安装文件为2.36G,需要一段时间下载。</p>
<p>经过漫长的等待,终于把iso下下来了。我使用虚拟机进行安装,配置就不多讲了。 直接给同学们看截图吧:</p>
<p><img src="/assets/3503173667_05149e8808_o.png" alt="" title="Kyle Wu Blog" /></p>
<p><img src="/assets/3503984842_1f64dbaa78_o.png" alt="" title="Task manager" /></p>
<p>任务管理器显示的进程并不多,但是看底下的状态栏,一共32个进程。</p>
<p><img src="/assets/3503984790_f98ed526c0_o.png" alt="" title="Start" /></p>
<p>开始键,旁边是IE,媒体库和WMP的按钮兼任务栏图标,呵呵,没明白什么意思?快去下个Windows 7 看看吧。</p>
<p><img src="/assets/3503984652_be7c8230d4_o.png" alt="" title="WMP" /></p>
<p>自带的WMP版本是12</p>
<p><img src="/assets/3503173569_73bd70a880_o.png" alt="" title="paint" /></p>
<p>画图,比xp的强大了不少,不过我已经爱上GIMP了。</p>
<p><img src="/assets/3503173581_60ff049bf0_o.png" alt="" title="note" /></p>
<p>Windows 7 提供了Note便签,很方便呢。</p>
<p><img src="/assets/3503984724_49e98f5bce_o.png" alt="" title="calculator" /></p>
<p>计算器,出了标准和科学计算,又添加了程序员和统计模式,对程序员还真好啊,哈哈。</p>
<p><img src="/assets/3503984794_b465f3cb20_o.png" alt="" title="bar" /></p>
<p>Tablet PC Input Panel,这是什么?看下图。</p>
<p><img src="/assets/3503173733_a6b3bd806a_o.png" alt="" title="Input Panel" /></p>
<p>一个手写程序,不要小看哦,很强大的,支持删除,分割,合并字串(见图片右上方)。</p>
<p>总的来讲,也许是Vista让我十分失望的原因,Windows 7 给我的感觉非常好。我是在虚拟机内安装的,用了1G内存,使用时没有一点卡的感觉。安装过程没有过多的用户交互,直接就到桌面了,新手也能顺利的安装。</p>
<p>很快国内应该就有bt下载了,当然在我提供的链接处下载也是可以的,我的速度一直在500k/s,下了不到2小时。</p>
<p>推荐喜欢尝鲜的同学尝试一下。</p>
Dropbox -- 实用的网络同步备份工具
2009-04-29T22:00:00+00:00
http://wenbinwu.com/%E5%AE%9E%E7%94%A8%E8%BD%AF%E4%BB%B6/2009/04/29/dropbox
<p><a href="http://www.getdropbox.com/" title="dropbox"><img src="/assets/3485729772_ed1967f559_o.png" alt="" title="Dropbox" /></a></p>
<p><a href="http://www.getdropbox.com/" title="dropbox">Dropbox</a> ,非常好用的同步工具。扇面的图是Dropbox网站首页的截图,同学们所要做的就是点击Download,下载客户端,按照说明一步步就可以安装成功了。</p>
<p>推荐Dropbox的原因最主要的是他支持Windows和Linux,在我将Win下的文件移动到Ubuntu的过程中给与了我极大的帮助。</p>
<p><img src="/assets/3485729784_863cec2dff_o.png" alt="" title="Windows" /></p>
<p>这是我在windows下的目录结构,每个文件夹的左下角都有一个绿色的钩钩,代表已经同步到服务器。下面我启动Ubuntu。</p>
<p><img src="/assets/3485729798_5ff6469484_o.png" alt="" title="Dropbox doing ubuntu" /></p>
<p>看到文件夹右上角的蓝色循环标志么,Dropbox正在为我同步文件。</p>
<p><img src="/assets/3484915755_169b5bf125_o.png" alt="" title="Dropbox complete ubuntu" /></p>
<p>OK,已经同步好了,完全不需要我去操作,所有的同步操作Dropbox都为你做了。</p>
<p>免费的Dropbox提供了2G的存储空间,如果想扩大的话就需要交费了,对于大多数同学来说,如果太大的话通过网络同步会比较慢,所以2G的大小也差不多了。有一点要主意的是,自己的一些私密文件和重要文件还是不要放到这上面了,毕竟网上存储还是有一定的不确定性。</p>
Ubuntu 9.04安装试用
2009-04-27T22:00:00+00:00
http://wenbinwu.com/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/2009/04/27/ubuntu-9-04
<p>Ubuntu 9.04在大家的期待中隆重release,还没下载的同学快去Ubuntu的网站<a href="http://www.ubuntu.com/getubuntu/download" title="Ubuntu">下载</a>一个安装镜像吧。</p>
<p>与Ubuntu 8.10 一样,在9.04版中自带了wubi,这样,使用windows的同学可以直接在windows中安装Ubuntu了。稍微介绍一下windows下安装ubuntu的方法:</p>
<p>用一个虚拟光驱载入安装的iso,然后在根目录下找到wubi.exe,双击之。然后稍微填入几个安装的相关参数,比如硬盘大小,系统密码等,很简单的。最后确定重启即可。Ubuntu会自动安装的。</p>
<p>Ubuntu的启动画面不会截取,这里就不贴图了,感觉比前几个版本要好看很多。填入用户名和密码,登录。感觉有以下几点变化:</p>
<ul>
<li>桌面背景又更新了,感觉还不错。</li>
<li>对中文的支持有了很大进步,当然,想要完全的中文菜单还是要更新语言支持。</li>
<li>如果使用中文安装Ubuntu,那么home下的默认文件夹是中文,其实我不是很喜欢这种设置,在控制台下操作不是很方便。8.10已经是这样了,看来Ubuntu还是希望这样的设置能够多吸引新的用户。</li>
</ul>
<p><img src="/assets/3483016078_56e020a9c1_o.png" alt="" title="Home Folder" /></p>
<p>细心的用户会发现,在系统菜单,系统管理中有一个小工具Computer Janitor,这个小工具能够帮助你清理一些安装包,还是挺实用的。</p>
<p><img src="/assets/3483016084_c9d38b56c7_o.png" alt="" title="Janitor" /></p>
<p>接下来让我们装一些软件。首先要改一下sourcelist,我使用的是163的源。</p>
<p>网易163更新服务器:</p>
<div class="highlighter-rouge"><div class="highlight"><pre class="highlight"><code>deb http://mirrors.163.com/Ubuntu/ jaunty main restricted universe multiverse
deb http://mirrors.163.com/Ubuntu/ jaunty-security main restricted universe multiverse
deb http://mirrors.163.com/Ubuntu/ jaunty-updates main restricted universe multiverse
deb http://mirrors.163.com/Ubuntu/ jaunty-proposed main restricted universe multiverse
deb http://mirrors.163.com/Ubuntu/ jaunty-backports main restricted universe multiverse
deb-src http://mirrors.163.com/Ubuntu/ jaunty main restricted universe multiverse
deb-src http://mirrors.163.com/Ubuntu/ jaunty-security main restricted universe multiverse
deb-src http://mirrors.163.com/Ubuntu/ jaunty-updates main restricted universe multiverse
deb-src http://mirrors.163.com/Ubuntu/ jaunty-proposed main restricted universe multiverse
deb-src http://mirrors.163.com/Ubuntu/ jaunty-backports main restricted universe multiverse
</code></pre></div></div>
<p><code class="highlighter-rouge">apt-get update</code>后,安装一下常用软件。</p>
<p>QQ可以正常的安装和使用。但是LibFetion不行,点击后没有反应,十分需要飞信的朋友可以去下载<a href="http://www.libfetion.cn/Linux_demoapp_download.html" title="LibFetion">源代码</a>,自己编译一下,方法见<a href="http://www.libfetion.cn/Docs-dve%5CBuild-LibFx-on-ubuntu.txt" title="LibFetion">这里</a>。有图有真相,上图两张。</p>
<p><img src="/assets/3483016070_a8b4bf1dc0_o.png" alt="" title="Linux QQ" /><img src="/assets/3483018422_968d5b0f17_o.png" alt="" title="Linux Fetion" /></p>
<p>我又装了一个Geany,一个很不错的ide,有兴趣的同学可以玩一玩。</p>
<p><img src="/assets/3483016076_2a37fb9284_m.jpg" alt="" title="Geany" /></p>
<p>当然还要看看我的博客嘛</p>
<p><img src="/assets/3483016096_6f6bdf2fb8_b.jpg" alt="" title="Ubuntu Kylewu" /></p>
<p>哈哈,是的,我安装了Compiz来感受一下令人晕眩的桌面。如何安装Compiz不是今天的主题,不过希望这样能够吸引更多的同学加入Ubuntu。</p>
收到Uppsala University的AD
2009-04-24T22:00:00+00:00
http://wenbinwu.com/%E7%94%9F%E6%B4%BB%E7%82%B9%E6%BB%B4/2009/04/24/uppsala-university-ad
<p><a href="http://www.uu.se/en/" title="Uppsala University">Uppsala University</a>,瑞典的一所大学,全球排名100以内,大概在70-90之间 (根据不同的排名) 。我报的志愿是Computer Science,今天收到系里老师的EMAIL,给了我AD。</p>
<p>出国是一件令人兴奋的事情,不过考虑到家人和朋友,又有些不舍。先不考虑这些了,还要在在淘宝网实习两周,同时要完成毕业论文,至于最终会不会去瑞典,还是跟家里人商量后再决定吧。</p>
Google Web Toolkit 和 Google App Engine 综合教程 交互篇
2009-04-22T22:00:00+00:00
http://wenbinwu.com/%E7%BC%96%E7%A8%8B%E6%8A%80%E6%9C%AF/2009/04/22/google-web-toolkit-google-app-engine-tutorial-interaction
<p>前面几篇教程已经把Google Web Toolkit 和 Google App Engine 两方面的代码完成了很大部分,这篇教程将让Google Web Toolkit 的客户端代码与 Google App Engine 的服务器端代码联合起来,实现客户端和服务器端的交互。</p>
<h2 id="google-web-toolkit-如何与服务器交互">Google Web Toolkit 如何与服务器交互?</h2>
<p>Google Web Toolkit 的程序最终会以JavaScript代码的形式在用户的浏览器上运行。所以,如果要与服务器交互,要使用JavaScript支持的方法。Google Web Toolkit 为我们提供了3种方法。</p>
<h3 id="远程过程调用-remote-procedure-calls-gwt-rpc">远程过程调用 (Remote Procedure Calls, GWT RPC)</h3>
<p>如果项目的服务器端使用Java,并且为服务器端的操作都使用了各种接口,那么 GWT RPC是最好的选择。因为我们使用 Google App Engine 作为服务器端,使用Java编码,所以接下来将使用 GWT RPC来完成我们接下来的教程。
更详细的有关 Remote Procedure Calls 的介绍,请看<a href="http://code.google.com/webtoolkit/tutorials/1.6/RPC.html">这里</a>。</p>
<h3 id="http-取回-json">HTTP 取回 JSON</h3>
<p>如果项目的服务器端没有使用Java,亦或是已经使用了JSON 或 XML,那么就可以通过HTTP来取得JSON来实现与服务器端的交互。
更详细的有关 JSON 的介绍,请看<a href="http://code.google.com/webtoolkit/tutorials/1.6/JSON.html">这里</a>。</p>
<h3 id="利用-jsonp-协议">利用 JSONP 协议</h3>
<p>如果你对 mashup 很感兴趣,那么一定不能错过 Google Web Toolkit 提供的这种方法。
更详细的有关 JSONP 的介绍,请看<a href="http://code.google.com/webtoolkit/tutorials/1.6/Xsite.html">这里</a>。</p>
<h2 id="定义-service-interface">定义 Service Interface</h2>
<p>RPC Service 要由一个 继承自 RemoteService 的接口来定义。这里我们在 <code class="highlighter-rouge">net.kylewu.myideastorm.client.service</code>包下面新建一个名为 DBWorkerService 的接口。</p>
<div class="highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">package</span> <span class="n">net</span><span class="p">.</span><span class="n">kylewu</span><span class="p">.</span><span class="n">idea</span><span class="p">.</span><span class="n">client</span><span class="p">.</span><span class="n">service</span><span class="p">;</span>
<span class="n">import</span> <span class="n">com</span><span class="p">.</span><span class="n">google</span><span class="p">.</span><span class="n">gwt</span><span class="p">.</span><span class="n">user</span><span class="p">.</span><span class="n">client</span><span class="p">.</span><span class="n">rpc</span><span class="p">.</span><span class="n">RemoteService</span><span class="p">;</span>
<span class="n">import</span> <span class="n">com</span><span class="p">.</span><span class="n">google</span><span class="p">.</span><span class="n">gwt</span><span class="p">.</span><span class="n">user</span><span class="p">.</span><span class="n">client</span><span class="p">.</span><span class="n">rpc</span><span class="p">.</span><span class="n">RemoteServiceRelativePath</span><span class="p">;</span>
<span class="p">/*</span>
<span class="p">*</span> <span class="n">The</span> <span class="n">client</span> <span class="n">side</span> <span class="n">stub</span> <span class="n">for</span> <span class="n">the</span> <span class="n">RPC</span> <span class="n">service</span><span class="p">.</span>
<span class="p">*/</span>
<span class="p">@</span><span class="n">RemoteServiceRelativePath</span><span class="p">(</span><span class="s2">"myidea"</span><span class="p">)</span>
<span class="k">public</span> <span class="n">interface</span> <span class="n">DBWorkerService</span> <span class="n">extends</span> <span class="n">RemoteService</span> <span class="p">{</span>
<span class="p">//</span> <span class="n">Remove</span> <span class="n">one</span> <span class="n">idea</span>
<span class="k">Boolean</span> <span class="n">delete</span><span class="p">(</span><span class="n">Long</span> <span class="n">id</span><span class="p">);</span>
<span class="k">String</span> <span class="n">getIdeaBySubject</span><span class="p">(</span><span class="k">String</span> <span class="n">subject</span><span class="p">);</span>
<span class="p">//</span> <span class="n">Read</span> <span class="k">from</span> <span class="n">db</span>
<span class="k">String</span><span class="p">[]</span> <span class="n">getIdeas</span><span class="p">();</span>
<span class="p">//</span> <span class="n">Add</span> <span class="n">a</span> <span class="n">new</span> <span class="n">idea</span>
<span class="k">String</span> <span class="n">save</span><span class="p">(</span><span class="k">String</span> <span class="n">subject</span><span class="p">,</span> <span class="k">String</span> <span class="n">detail</span><span class="p">,</span> <span class="k">String</span> <span class="n">progress</span><span class="p">);</span>
<span class="p">//</span> <span class="n">Update</span> <span class="n">one</span> <span class="n">idea</span>
<span class="k">String</span> <span class="n">update</span><span class="p">(</span><span class="k">String</span> <span class="n">id</span><span class="p">,</span> <span class="k">String</span> <span class="n">subject</span><span class="p">,</span> <span class="k">String</span> <span class="n">detail</span><span class="p">,</span> <span class="k">String</span> <span class="n">progress</span><span class="p">);</span>
<span class="p">}</span>
</code></pre></div></div>
<p>肯定有人注意到了,这里方法返回的值都是String,为什么不使用我们之前定义过的Idea呢。这里我只能说很抱歉了,我测试过返回Idea对象,但是在运行时会出现 “did you forget to inherit a required module?”的错误,搜索了很久也没有搞定,希望知道的同学联系我,谢谢。</p>
<h2 id="定义服务器端service实现">定义服务器端Service实现</h2>
<p>服务器端的类要实现刚才写过的 DBWorkerService接口,在这里实现我们具体的操作。</p>
<div class="highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">package</span> <span class="n">net</span><span class="p">.</span><span class="n">kylewu</span><span class="p">.</span><span class="n">idea</span><span class="p">.</span><span class="n">server</span><span class="p">;</span>
<span class="n">import</span> <span class="n">java</span><span class="p">.</span><span class="n">text</span><span class="p">.</span><span class="n">SimpleDateFormat</span><span class="p">;</span>
<span class="n">import</span> <span class="n">java</span><span class="p">.</span><span class="n">util</span><span class="p">.</span><span class="n">Date</span><span class="p">;</span>
<span class="n">import</span> <span class="n">java</span><span class="p">.</span><span class="n">util</span><span class="p">.</span><span class="k">List</span><span class="p">;</span>
<span class="n">import</span> <span class="n">javax</span><span class="p">.</span><span class="n">jdo</span><span class="p">.</span><span class="n">PersistenceManager</span><span class="p">;</span>
<span class="n">import</span> <span class="n">javax</span><span class="p">.</span><span class="n">jdo</span><span class="p">.</span><span class="n">Query</span><span class="p">;</span>
<span class="n">import</span> <span class="n">net</span><span class="p">.</span><span class="n">kylewu</span><span class="p">.</span><span class="n">idea</span><span class="p">.</span><span class="n">client</span><span class="p">.</span><span class="n">service</span><span class="p">.</span><span class="n">DBWorkerService</span><span class="p">;</span>
<span class="n">import</span> <span class="n">com</span><span class="p">.</span><span class="n">google</span><span class="p">.</span><span class="n">gwt</span><span class="p">.</span><span class="n">user</span><span class="p">.</span><span class="n">server</span><span class="p">.</span><span class="n">rpc</span><span class="p">.</span><span class="n">RemoteServiceServlet</span><span class="p">;</span>
<span class="k">public</span> <span class="n">class</span> <span class="n">DBWorkerServiceImpl</span> <span class="n">extends</span> <span class="n">RemoteServiceServlet</span> <span class="n">implements</span>
<span class="n">DBWorkerService</span> <span class="p">{</span>
<span class="n">private</span> <span class="n">static</span> <span class="n">final</span> <span class="n">long</span> <span class="n">serialVersionUID</span> <span class="p">=</span> <span class="m">6183858098728558886L</span><span class="p">;</span>
<span class="p">@</span><span class="n">Override</span>
<span class="k">public</span> <span class="k">Boolean</span> <span class="n">delete</span><span class="p">(</span><span class="n">Long</span> <span class="n">id</span><span class="p">)</span> <span class="p">{</span>
<span class="n">PersistenceManager</span> <span class="n">pm</span> <span class="p">=</span> <span class="n">PMF</span><span class="p">.</span><span class="n">get</span><span class="p">().</span><span class="n">getPersistenceManager</span><span class="p">();</span>
<span class="n">Idea</span> <span class="n">idea</span> <span class="p">=</span> <span class="p">(</span><span class="n">Idea</span><span class="p">)</span> <span class="n">pm</span><span class="p">.</span><span class="n">getObjectById</span><span class="p">(</span><span class="n">Idea</span><span class="p">.</span><span class="n">class</span><span class="p">,</span> <span class="n">id</span><span class="p">);</span>
<span class="n">pm</span><span class="p">.</span><span class="n">deletePersistent</span><span class="p">(</span><span class="n">idea</span><span class="p">);</span>
<span class="n">pm</span><span class="p">.</span><span class="n">close</span><span class="p">();</span>
<span class="n">return</span> <span class="nb">true</span><span class="p">;</span>
<span class="p">}</span>
<span class="p">@</span><span class="n">SuppressWarnings</span><span class="p">(</span><span class="s2">"unchecked"</span><span class="p">)</span>
<span class="p">@</span><span class="n">Override</span>
<span class="k">public</span> <span class="k">String</span><span class="p">[]</span> <span class="n">getIdeas</span><span class="p">()</span> <span class="p">{</span>
<span class="n">PersistenceManager</span> <span class="n">pm</span> <span class="p">=</span> <span class="n">PMF</span><span class="p">.</span><span class="n">get</span><span class="p">().</span><span class="n">getPersistenceManager</span><span class="p">();</span>
<span class="k">String</span> <span class="n">query</span> <span class="p">=</span> <span class="s2">"select from "</span> <span class="p">+</span> <span class="n">Idea</span><span class="p">.</span><span class="n">class</span><span class="p">.</span><span class="n">getName</span><span class="p">();</span>
<span class="k">List</span> <span class="n">ideas</span> <span class="p">=</span> <span class="p">(</span><span class="k">List</span><span class="p">)</span> <span class="n">pm</span><span class="p">.</span><span class="n">newQuery</span><span class="p">(</span><span class="n">query</span><span class="p">).</span><span class="n">execute</span><span class="p">();</span>
<span class="k">String</span><span class="p">[]</span> <span class="n">rtn</span> <span class="p">=</span> <span class="n">new</span> <span class="k">String</span><span class="p">[</span><span class="n">ideas</span><span class="p">.</span><span class="n">size</span><span class="p">()];</span>
<span class="n">for</span> <span class="p">(</span><span class="n">int</span> <span class="n">i</span> <span class="p">=</span> <span class="m">0</span><span class="p">;</span> <span class="n">i</span> <span class="p"><</span> <span class="n">ideas</span><span class="p">.</span><span class="n">size</span><span class="p">();</span> <span class="n">i</span><span class="p">++)</span> <span class="p">{</span>
<span class="n">Idea</span> <span class="n">idea</span> <span class="p">=</span> <span class="n">ideas</span><span class="p">.</span><span class="n">get</span><span class="p">(</span><span class="n">i</span><span class="p">);</span>
<span class="n">rtn</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="p">=</span> <span class="n">idea</span><span class="p">.</span><span class="n">toString</span><span class="p">();</span>
<span class="p">}</span>
<span class="n">return</span> <span class="n">rtn</span><span class="p">;</span>
<span class="p">}</span>
<span class="p">@</span><span class="n">Override</span>
<span class="k">public</span> <span class="k">String</span> <span class="n">save</span><span class="p">(</span><span class="k">String</span> <span class="n">subject</span><span class="p">,</span> <span class="k">String</span> <span class="n">detail</span><span class="p">,</span> <span class="k">String</span> <span class="n">progress</span><span class="p">)</span> <span class="p">{</span>
<span class="n">Idea</span> <span class="n">idea</span> <span class="p">=</span> <span class="n">new</span> <span class="n">Idea</span><span class="p">(</span><span class="n">subject</span><span class="p">,</span> <span class="n">detail</span><span class="p">,</span> <span class="n">progress</span><span class="p">,</span>
<span class="n">progress</span><span class="p">.</span><span class="n">compareTo</span><span class="p">(</span><span class="s2">"100%"</span><span class="p">)</span> <span class="p">==</span> <span class="m">0</span> <span class="p">?</span> <span class="n">new</span> <span class="n">SimpleDateFormat</span><span class="p">(</span><span class="s2">"yyyy-mm-dd"</span><span class="p">)</span>
<span class="p">.</span><span class="n">format</span><span class="p">(</span><span class="n">new</span> <span class="n">Date</span><span class="p">())</span> <span class="p">:</span> <span class="s2">"null"</span><span class="p">);</span>
<span class="n">PersistenceManager</span> <span class="n">pm</span> <span class="p">=</span> <span class="n">PMF</span><span class="p">.</span><span class="n">get</span><span class="p">().</span><span class="n">getPersistenceManager</span><span class="p">();</span>
<span class="n">try</span> <span class="p">{</span>
<span class="n">pm</span><span class="p">.</span><span class="n">makePersistent</span><span class="p">(</span><span class="n">idea</span><span class="p">);</span>
<span class="p">}</span> <span class="n">finally</span> <span class="p">{</span>
<span class="n">pm</span><span class="p">.</span><span class="n">close</span><span class="p">();</span>
<span class="p">}</span>
<span class="k">String</span> <span class="n">str</span> <span class="p">=</span> <span class="n">getIdeaBySubject</span><span class="p">(</span><span class="n">subject</span><span class="p">);</span>
<span class="n">return</span> <span class="n">str</span><span class="p">;</span>
<span class="p">}</span>
<span class="p">@</span><span class="n">Override</span>
<span class="k">public</span> <span class="k">String</span> <span class="n">update</span><span class="p">(</span><span class="k">String</span> <span class="n">id</span><span class="p">,</span> <span class="k">String</span> <span class="n">subject</span><span class="p">,</span> <span class="k">String</span> <span class="n">detail</span><span class="p">,</span>
<span class="k">String</span> <span class="n">progress</span><span class="p">)</span> <span class="p">{</span>
<span class="n">PersistenceManager</span> <span class="n">pm</span> <span class="p">=</span> <span class="n">PMF</span><span class="p">.</span><span class="n">get</span><span class="p">().</span><span class="n">getPersistenceManager</span><span class="p">();</span>
<span class="n">Idea</span> <span class="n">idea</span> <span class="p">=</span> <span class="p">(</span><span class="n">Idea</span><span class="p">)</span> <span class="n">pm</span><span class="p">.</span><span class="n">getObjectById</span><span class="p">(</span><span class="n">Idea</span><span class="p">.</span><span class="n">class</span><span class="p">,</span> <span class="n">Long</span><span class="p">.</span><span class="n">valueOf</span><span class="p">(</span><span class="n">id</span><span class="p">));</span>
<span class="n">idea</span><span class="p">.</span><span class="n">setSubject</span><span class="p">(</span><span class="n">subject</span><span class="p">);</span>
<span class="n">idea</span><span class="p">.</span><span class="n">setDetail</span><span class="p">(</span><span class="n">detail</span><span class="p">);</span>
<span class="n">idea</span><span class="p">.</span><span class="n">setProgress</span><span class="p">(</span><span class="n">progress</span><span class="p">);</span>
<span class="k">if</span> <span class="p">(</span><span class="n">progress</span><span class="p">.</span><span class="n">compareTo</span><span class="p">(</span><span class="s2">"100%"</span><span class="p">)</span> <span class="p">==</span> <span class="m">0</span>
<span class="p">&&</span> <span class="n">idea</span><span class="p">.</span><span class="nf">getDate</span><span class="p">().</span><span class="n">compareTo</span><span class="p">(</span><span class="s2">"null"</span><span class="p">)</span> <span class="p">==</span> <span class="m">0</span><span class="p">)</span> <span class="p">{</span>
<span class="n">idea</span><span class="p">.</span><span class="nf">setDate</span><span class="p">(</span><span class="n">new</span> <span class="n">SimpleDateFormat</span><span class="p">(</span><span class="s2">"yyyy-mm-dd"</span><span class="p">).</span><span class="n">format</span><span class="p">(</span><span class="n">new</span> <span class="n">Date</span><span class="p">()));</span>
<span class="p">}</span>
<span class="n">pm</span><span class="p">.</span><span class="n">makePersistent</span><span class="p">(</span><span class="n">idea</span><span class="p">);</span>
<span class="k">String</span> <span class="n">rtn</span> <span class="p">=</span> <span class="p">((</span><span class="n">Idea</span><span class="p">)</span> <span class="n">pm</span><span class="p">.</span><span class="n">getObjectById</span><span class="p">(</span><span class="n">Idea</span><span class="p">.</span><span class="n">class</span><span class="p">,</span> <span class="n">Long</span><span class="p">.</span><span class="n">valueOf</span><span class="p">(</span><span class="n">id</span><span class="p">)))</span>
<span class="p">.</span><span class="n">toString</span><span class="p">();</span>
<span class="n">pm</span><span class="p">.</span><span class="n">close</span><span class="p">();</span>
<span class="n">return</span> <span class="n">rtn</span><span class="p">;</span>
<span class="p">}</span>
<span class="p">@</span><span class="n">SuppressWarnings</span><span class="p">(</span><span class="s2">"unchecked"</span><span class="p">)</span>
<span class="p">@</span><span class="n">Override</span>
<span class="k">public</span> <span class="k">String</span> <span class="n">getIdeaBySubject</span><span class="p">(</span><span class="k">String</span> <span class="n">subject</span><span class="p">)</span> <span class="p">{</span>
<span class="n">PersistenceManager</span> <span class="n">pm</span> <span class="p">=</span> <span class="n">PMF</span><span class="p">.</span><span class="n">get</span><span class="p">().</span><span class="n">getPersistenceManager</span><span class="p">();</span>
<span class="n">Query</span> <span class="n">query</span> <span class="p">=</span> <span class="n">pm</span><span class="p">.</span><span class="n">newQuery</span><span class="p">(</span><span class="s2">"select from "</span> <span class="p">+</span> <span class="n">Idea</span><span class="p">.</span><span class="n">class</span><span class="p">.</span><span class="n">getName</span><span class="p">()</span>
<span class="p">+</span> <span class="s2">" where subject == subjectParm "</span>
<span class="p">+</span> <span class="s2">"parameters String subjectParm"</span><span class="p">);</span>
<span class="k">List</span> <span class="n">ids</span> <span class="p">=</span> <span class="p">(</span><span class="k">List</span><span class="p">)</span> <span class="n">query</span><span class="p">.</span><span class="n">execute</span><span class="p">(</span><span class="n">subject</span><span class="p">);</span>
<span class="k">if</span> <span class="p">(</span><span class="n">ids</span><span class="p">.</span><span class="n">isEmpty</span><span class="p">()</span> <span class="p">==</span> <span class="nb">false</span><span class="p">)</span> <span class="p">{</span>
<span class="n">pm</span><span class="p">.</span><span class="n">close</span><span class="p">();</span>
<span class="n">return</span> <span class="n">ids</span><span class="p">.</span><span class="n">get</span><span class="p">(</span><span class="m">0</span><span class="p">).</span><span class="n">toString</span><span class="p">();</span>
<span class="p">}</span>
<span class="n">pm</span><span class="p">.</span><span class="n">close</span><span class="p">();</span>
<span class="n">return</span> <span class="s2">""</span><span class="p">;</span>
<span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>
<p>如上一篇教程最后部分提到的,这里通过PMF得到PersistenceManager,进而进行数据库的增删改查。</p>
<h2 id="定义-rpc-interface">定义 RPC Interface</h2>
<p>代码很简单,在我们的DBWorkerService接口中的方法的参数最后添加一个AsyncCallback参数,并且这些方法都是void。</p>
<div class="highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">package</span> <span class="n">net</span><span class="p">.</span><span class="n">kylewu</span><span class="p">.</span><span class="n">idea</span><span class="p">.</span><span class="n">client</span><span class="p">.</span><span class="n">service</span><span class="p">;</span>
<span class="n">import</span> <span class="n">com</span><span class="p">.</span><span class="n">google</span><span class="p">.</span><span class="n">gwt</span><span class="p">.</span><span class="n">user</span><span class="p">.</span><span class="n">client</span><span class="p">.</span><span class="n">rpc</span><span class="p">.</span><span class="n">AsyncCallback</span><span class="p">;</span>
<span class="p">/*</span>
<span class="p">*</span> <span class="n">The</span> <span class="n">async</span> <span class="n">counterpart</span> <span class="k">of</span> <span class="n">DBWorker</span><span class="p">.</span>
<span class="p">*/</span>
<span class="k">public</span> <span class="n">interface</span> <span class="n">DBWorkerServiceAsync</span> <span class="p">{</span>
<span class="p">//</span> <span class="n">Remove</span> <span class="n">one</span> <span class="n">idea</span>
<span class="n">void</span> <span class="n">delete</span><span class="p">(</span><span class="n">Long</span> <span class="n">id</span><span class="p">,</span> <span class="n">AsyncCallback</span> <span class="n">callback</span><span class="p">);</span>
<span class="p">//</span> <span class="n">Read</span> <span class="k">from</span> <span class="n">db</span>
<span class="n">void</span> <span class="n">getIdeas</span><span class="p">(</span><span class="n">AsyncCallback</span> <span class="n">callback</span><span class="p">);</span>
<span class="p">//</span> <span class="n">Add</span> <span class="n">a</span> <span class="n">new</span> <span class="n">idea</span>
<span class="n">void</span> <span class="n">save</span><span class="p">(</span><span class="k">String</span> <span class="n">subject</span><span class="p">,</span> <span class="k">String</span> <span class="n">summary</span><span class="p">,</span> <span class="k">String</span> <span class="n">progress</span><span class="p">,</span> <span class="n">AsyncCallback</span> <span class="n">callback</span><span class="p">);</span>
<span class="p">//</span> <span class="n">Update</span> <span class="n">one</span> <span class="n">idea</span>
<span class="n">void</span> <span class="n">update</span><span class="p">(</span><span class="k">String</span> <span class="n">id</span><span class="p">,</span> <span class="k">String</span> <span class="n">summary</span><span class="p">,</span> <span class="k">String</span> <span class="n">subject</span><span class="p">,</span> <span class="k">String</span> <span class="n">progress</span><span class="p">,</span> <span class="n">AsyncCallback</span> <span class="n">callback</span><span class="p">);</span>
<span class="n">void</span> <span class="n">getIdeaBySubject</span><span class="p">(</span><span class="k">String</span> <span class="n">subject</span><span class="p">,</span> <span class="n">AsyncCallback</span> <span class="n">callback</span><span class="p">);</span>
<span class="p">}</span>
</code></pre></div></div>
<p>好了,到这里,就可以调用 RPC 接口了。</p>
<h2 id="调用-rpc-interface">调用 RPC Interface</h2>
<p>重新打开EntryPoint,在类中添加一段如下代码,然后在需要数据库操作的地方添加代码。</p>
<div class="highlighter-rouge"><div class="highlight"><pre class="highlight"><code>private DBWorkerServiceAsync dbWorker = GWT.create(DBWorkerService.class);
</code></pre></div></div>
<p>这里是最后完整的Kylewuidea类。</p>
<div class="highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">package</span> <span class="n">net</span><span class="p">.</span><span class="n">kylewu</span><span class="p">.</span><span class="n">idea</span><span class="p">.</span><span class="n">client</span><span class="p">;</span>
<span class="n">import</span> <span class="n">java</span><span class="p">.</span><span class="n">util</span><span class="p">.</span><span class="n">ArrayList</span><span class="p">;</span>
<span class="n">import</span> <span class="n">java</span><span class="p">.</span><span class="n">util</span><span class="p">.</span><span class="n">HashMap</span><span class="p">;</span>
<span class="n">import</span> <span class="n">java</span><span class="p">.</span><span class="n">util</span><span class="p">.</span><span class="n">Map</span><span class="p">;</span>
<span class="n">import</span> <span class="n">net</span><span class="p">.</span><span class="n">kylewu</span><span class="p">.</span><span class="n">idea</span><span class="p">.</span><span class="n">client</span><span class="p">.</span><span class="n">service</span><span class="p">.</span><span class="n">DBWorkerService</span><span class="p">;</span>
<span class="n">import</span> <span class="n">net</span><span class="p">.</span><span class="n">kylewu</span><span class="p">.</span><span class="n">idea</span><span class="p">.</span><span class="n">client</span><span class="p">.</span><span class="n">service</span><span class="p">.</span><span class="n">DBWorkerServiceAsync</span><span class="p">;</span>
<span class="n">import</span> <span class="n">com</span><span class="p">.</span><span class="n">google</span><span class="p">.</span><span class="n">gwt</span><span class="p">.</span><span class="n">core</span><span class="p">.</span><span class="n">client</span><span class="p">.</span><span class="n">EntryPoint</span><span class="p">;</span>
<span class="n">import</span> <span class="n">com</span><span class="p">.</span><span class="n">google</span><span class="p">.</span><span class="n">gwt</span><span class="p">.</span><span class="n">core</span><span class="p">.</span><span class="n">client</span><span class="p">.</span><span class="n">GWT</span><span class="p">;</span>
<span class="n">import</span> <span class="n">com</span><span class="p">.</span><span class="n">google</span><span class="p">.</span><span class="n">gwt</span><span class="p">.</span><span class="n">event</span><span class="p">.</span><span class="n">dom</span><span class="p">.</span><span class="n">client</span><span class="p">.</span><span class="n">ClickEvent</span><span class="p">;</span>
<span class="n">import</span> <span class="n">com</span><span class="p">.</span><span class="n">google</span><span class="p">.</span><span class="n">gwt</span><span class="p">.</span><span class="n">event</span><span class="p">.</span><span class="n">dom</span><span class="p">.</span><span class="n">client</span><span class="p">.</span><span class="n">ClickHandler</span><span class="p">;</span>
<span class="n">import</span> <span class="n">com</span><span class="p">.</span><span class="n">google</span><span class="p">.</span><span class="n">gwt</span><span class="p">.</span><span class="n">user</span><span class="p">.</span><span class="n">client</span><span class="p">.</span><span class="n">rpc</span><span class="p">.</span><span class="n">AsyncCallback</span><span class="p">;</span>
<span class="n">import</span> <span class="n">com</span><span class="p">.</span><span class="n">google</span><span class="p">.</span><span class="n">gwt</span><span class="p">.</span><span class="n">user</span><span class="p">.</span><span class="n">client</span><span class="p">.</span><span class="n">ui</span><span class="p">.</span><span class="n">Button</span><span class="p">;</span>
<span class="n">import</span> <span class="n">com</span><span class="p">.</span><span class="n">google</span><span class="p">.</span><span class="n">gwt</span><span class="p">.</span><span class="n">user</span><span class="p">.</span><span class="n">client</span><span class="p">.</span><span class="n">ui</span><span class="p">.</span><span class="n">DialogBox</span><span class="p">;</span>
<span class="n">import</span> <span class="n">com</span><span class="p">.</span><span class="n">google</span><span class="p">.</span><span class="n">gwt</span><span class="p">.</span><span class="n">user</span><span class="p">.</span><span class="n">client</span><span class="p">.</span><span class="n">ui</span><span class="p">.</span><span class="n">FlexTable</span><span class="p">;</span>
<span class="n">import</span> <span class="n">com</span><span class="p">.</span><span class="n">google</span><span class="p">.</span><span class="n">gwt</span><span class="p">.</span><span class="n">user</span><span class="p">.</span><span class="n">client</span><span class="p">.</span><span class="n">ui</span><span class="p">.</span><span class="n">HasHorizontalAlignment</span><span class="p">;</span>
<span class="n">import</span> <span class="n">com</span><span class="p">.</span><span class="n">google</span><span class="p">.</span><span class="n">gwt</span><span class="p">.</span><span class="n">user</span><span class="p">.</span><span class="n">client</span><span class="p">.</span><span class="n">ui</span><span class="p">.</span><span class="n">HasVerticalAlignment</span><span class="p">;</span>
<span class="n">import</span> <span class="n">com</span><span class="p">.</span><span class="n">google</span><span class="p">.</span><span class="n">gwt</span><span class="p">.</span><span class="n">user</span><span class="p">.</span><span class="n">client</span><span class="p">.</span><span class="n">ui</span><span class="p">.</span><span class="n">HorizontalPanel</span><span class="p">;</span>
<span class="n">import</span> <span class="n">com</span><span class="p">.</span><span class="n">google</span><span class="p">.</span><span class="n">gwt</span><span class="p">.</span><span class="n">user</span><span class="p">.</span><span class="n">client</span><span class="p">.</span><span class="n">ui</span><span class="p">.</span><span class="n">ListBox</span><span class="p">;</span>
<span class="n">import</span> <span class="n">com</span><span class="p">.</span><span class="n">google</span><span class="p">.</span><span class="n">gwt</span><span class="p">.</span><span class="n">user</span><span class="p">.</span><span class="n">client</span><span class="p">.</span><span class="n">ui</span><span class="p">.</span><span class="n">Panel</span><span class="p">;</span>
<span class="n">import</span> <span class="n">com</span><span class="p">.</span><span class="n">google</span><span class="p">.</span><span class="n">gwt</span><span class="p">.</span><span class="n">user</span><span class="p">.</span><span class="n">client</span><span class="p">.</span><span class="n">ui</span><span class="p">.</span><span class="n">RootPanel</span><span class="p">;</span>
<span class="n">import</span> <span class="n">com</span><span class="p">.</span><span class="n">google</span><span class="p">.</span><span class="n">gwt</span><span class="p">.</span><span class="n">user</span><span class="p">.</span><span class="n">client</span><span class="p">.</span><span class="n">ui</span><span class="p">.</span><span class="n">TextArea</span><span class="p">;</span>
<span class="n">import</span> <span class="n">com</span><span class="p">.</span><span class="n">google</span><span class="p">.</span><span class="n">gwt</span><span class="p">.</span><span class="n">user</span><span class="p">.</span><span class="n">client</span><span class="p">.</span><span class="n">ui</span><span class="p">.</span><span class="n">TextBox</span><span class="p">;</span>
<span class="n">import</span> <span class="n">com</span><span class="p">.</span><span class="n">google</span><span class="p">.</span><span class="n">gwt</span><span class="p">.</span><span class="n">user</span><span class="p">.</span><span class="n">client</span><span class="p">.</span><span class="n">ui</span><span class="p">.</span><span class="n">VerticalPanel</span><span class="p">;</span>
<span class="p">/*</span>
<span class="p">*</span> <span class="n">Entry</span> <span class="n">point</span> <span class="n">classes</span> <span class="n">define</span> <span class="n">onModuleLoad</span><span class="p">().</span>
<span class="p">*/</span>
<span class="k">public</span> <span class="n">class</span> <span class="n">Kylewuidea</span> <span class="n">implements</span> <span class="n">EntryPoint</span> <span class="p">{</span>
<span class="n">private</span> <span class="n">final</span> <span class="n">int</span> <span class="n">COL_ID</span> <span class="p">=</span> <span class="m">0</span><span class="p">;</span>
<span class="n">private</span> <span class="n">final</span> <span class="n">int</span> <span class="n">COL_SUBJECT</span> <span class="p">=</span> <span class="m">1</span><span class="p">;</span>
<span class="n">private</span> <span class="n">final</span> <span class="n">int</span> <span class="n">COL_DETAIL</span> <span class="p">=</span> <span class="m">2</span><span class="p">;</span>
<span class="n">private</span> <span class="n">final</span> <span class="n">int</span> <span class="n">COL_PROGRESS</span> <span class="p">=</span> <span class="m">3</span><span class="p">;</span>
<span class="n">private</span> <span class="n">final</span> <span class="n">int</span> <span class="n">COL_TIME</span> <span class="p">=</span> <span class="m">4</span><span class="p">;</span>
<span class="n">private</span> <span class="n">final</span> <span class="n">int</span> <span class="n">COL_OPERATION</span> <span class="p">=</span> <span class="m">5</span><span class="p">;</span>
<span class="n">private</span> <span class="n">FlexTable</span> <span class="n">table</span> <span class="p">=</span> <span class="n">new</span> <span class="n">FlexTable</span><span class="p">();</span>
<span class="n">private</span> <span class="n">ArrayList</span> <span class="n">subjectList</span> <span class="p">=</span> <span class="n">new</span> <span class="n">ArrayList</span><span class="p">();</span>
<span class="n">private</span> <span class="n">Map</span> <span class="n">mapStrToInt</span> <span class="p">=</span> <span class="n">new</span> <span class="n">HashMap</span><span class="p">();</span>
<span class="n">private</span> <span class="n">Map</span> <span class="n">mapIntToStr</span> <span class="p">=</span> <span class="n">new</span> <span class="n">HashMap</span><span class="p">();</span>
<span class="n">private</span> <span class="n">DBWorkerServiceAsync</span> <span class="n">dbWorker</span> <span class="p">=</span> <span class="n">GWT</span><span class="p">.</span><span class="nb">create</span><span class="p">(</span><span class="n">DBWorkerService</span><span class="p">.</span><span class="n">class</span><span class="p">);</span>
<span class="p">/**</span>
<span class="p">*</span> <span class="n">This</span> <span class="n">is</span> <span class="n">the</span> <span class="n">entry</span> <span class="n">point</span> <span class="n">method</span><span class="p">.</span>
<span class="p">*/</span>
<span class="k">public</span> <span class="n">void</span> <span class="n">onModuleLoad</span><span class="p">()</span> <span class="p">{</span>
<span class="p">//</span> <span class="n">Initial</span> <span class="n">all</span> <span class="n">items</span><span class="p">.</span>
<span class="n">init</span><span class="p">();</span>
<span class="p">//</span> <span class="n">Add</span> <span class="n">table</span> <span class="k">to</span> <span class="n">html</span> <span class="n">page</span><span class="p">.</span>
<span class="n">RootPanel</span><span class="p">.</span><span class="n">get</span><span class="p">(</span><span class="s2">"ideastorm"</span><span class="p">).</span><span class="n">add</span><span class="p">(</span><span class="n">createBasePanel</span><span class="p">());</span>
<span class="p">//</span> <span class="n">Initial</span> <span class="n">table</span><span class="p">.</span>
<span class="n">importFromDatabase</span><span class="p">();</span>
<span class="p">}</span>
<span class="n">private</span> <span class="n">void</span> <span class="n">init</span><span class="p">()</span> <span class="p">{</span>
<span class="n">mapStrToInt</span><span class="p">.</span><span class="n">put</span><span class="p">(</span><span class="s2">"0%"</span><span class="p">,</span> <span class="m">0</span><span class="p">);</span>
<span class="n">mapStrToInt</span><span class="p">.</span><span class="n">put</span><span class="p">(</span><span class="s2">"25%"</span><span class="p">,</span> <span class="m">1</span><span class="p">);</span>
<span class="n">mapStrToInt</span><span class="p">.</span><span class="n">put</span><span class="p">(</span><span class="s2">"50%"</span><span class="p">,</span> <span class="m">2</span><span class="p">);</span>
<span class="n">mapStrToInt</span><span class="p">.</span><span class="n">put</span><span class="p">(</span><span class="s2">"75%"</span><span class="p">,</span> <span class="m">3</span><span class="p">);</span>
<span class="n">mapStrToInt</span><span class="p">.</span><span class="n">put</span><span class="p">(</span><span class="s2">"100%"</span><span class="p">,</span> <span class="m">4</span><span class="p">);</span>
<span class="n">mapIntToStr</span><span class="p">.</span><span class="n">put</span><span class="p">(</span><span class="m">0</span><span class="p">,</span> <span class="s2">"0%"</span><span class="p">);</span>
<span class="n">mapIntToStr</span><span class="p">.</span><span class="n">put</span><span class="p">(</span><span class="m">1</span><span class="p">,</span> <span class="s2">"25%"</span><span class="p">);</span>
<span class="n">mapIntToStr</span><span class="p">.</span><span class="n">put</span><span class="p">(</span><span class="m">2</span><span class="p">,</span> <span class="s2">"50%"</span><span class="p">);</span>
<span class="n">mapIntToStr</span><span class="p">.</span><span class="n">put</span><span class="p">(</span><span class="m">3</span><span class="p">,</span> <span class="s2">"75"</span><span class="p">);</span>
<span class="n">mapIntToStr</span><span class="p">.</span><span class="n">put</span><span class="p">(</span><span class="m">4</span><span class="p">,</span> <span class="s2">"100%"</span><span class="p">);</span>
<span class="p">//</span> <span class="n">Initial</span> <span class="n">table</span> <span class="n">structure</span><span class="p">.</span>
<span class="n">table</span><span class="p">.</span><span class="n">setText</span><span class="p">(</span><span class="m">0</span><span class="p">,</span> <span class="n">COL_ID</span><span class="p">,</span> <span class="s2">"ID"</span><span class="p">);</span>
<span class="n">table</span><span class="p">.</span><span class="n">setText</span><span class="p">(</span><span class="m">0</span><span class="p">,</span> <span class="n">COL_SUBJECT</span><span class="p">,</span> <span class="s2">"Subject"</span><span class="p">);</span>
<span class="n">table</span><span class="p">.</span><span class="n">setText</span><span class="p">(</span><span class="m">0</span><span class="p">,</span> <span class="n">COL_DETAIL</span><span class="p">,</span> <span class="s2">"Detail"</span><span class="p">);</span>
<span class="n">table</span><span class="p">.</span><span class="n">setText</span><span class="p">(</span><span class="m">0</span><span class="p">,</span> <span class="n">COL_PROGRESS</span><span class="p">,</span> <span class="s2">"Progress"</span><span class="p">);</span>
<span class="n">table</span><span class="p">.</span><span class="n">setText</span><span class="p">(</span><span class="m">0</span><span class="p">,</span> <span class="n">COL_OPERATION</span><span class="p">,</span> <span class="s2">"Operation"</span><span class="p">);</span>
<span class="n">table</span><span class="p">.</span><span class="n">setText</span><span class="p">(</span><span class="m">0</span><span class="p">,</span> <span class="n">COL_TIME</span><span class="p">,</span> <span class="s2">"Time"</span><span class="p">);</span>
<span class="p">//</span> <span class="k">Set</span> <span class="n">table</span> <span class="n">attribute</span><span class="p">.</span>
<span class="n">table</span><span class="p">.</span><span class="n">setCellPadding</span><span class="p">(</span><span class="m">5</span><span class="p">);</span>
<span class="n">table</span><span class="p">.</span><span class="n">getColumnFormatter</span><span class="p">().</span><span class="n">setWidth</span><span class="p">(</span><span class="m">0</span><span class="p">,</span> <span class="s2">"10"</span><span class="p">);</span>
<span class="n">table</span><span class="p">.</span><span class="n">getColumnFormatter</span><span class="p">().</span><span class="n">setWidth</span><span class="p">(</span><span class="m">1</span><span class="p">,</span> <span class="s2">"200"</span><span class="p">);</span>
<span class="n">table</span><span class="p">.</span><span class="n">getColumnFormatter</span><span class="p">().</span><span class="n">setWidth</span><span class="p">(</span><span class="m">2</span><span class="p">,</span> <span class="s2">"400"</span><span class="p">);</span>
<span class="n">table</span><span class="p">.</span><span class="n">getColumnFormatter</span><span class="p">().</span><span class="n">setWidth</span><span class="p">(</span><span class="m">3</span><span class="p">,</span> <span class="s2">"150"</span><span class="p">);</span>
<span class="n">table</span><span class="p">.</span><span class="n">getColumnFormatter</span><span class="p">().</span><span class="n">setWidth</span><span class="p">(</span><span class="m">4</span><span class="p">,</span> <span class="s2">"100"</span><span class="p">);</span>
<span class="p">}</span>
<span class="p">/**</span>
<span class="p">*</span> <span class="n">Initial</span> <span class="n">table</span> <span class="n">data</span>
<span class="p">*/</span>
<span class="n">private</span> <span class="n">void</span> <span class="n">importFromDatabase</span><span class="p">()</span> <span class="p">{</span>
<span class="p">//</span> <span class="n">Get</span> <span class="n">exist</span> <span class="n">ideas</span> <span class="k">from</span> <span class="n">db</span>
<span class="n">dbWorker</span><span class="p">.</span><span class="n">getIdeas</span><span class="p">(</span><span class="n">new</span> <span class="n">AsyncCallback</span><span class="p">()</span> <span class="p">{</span>
<span class="p">@</span><span class="n">Override</span>
<span class="k">public</span> <span class="n">void</span> <span class="n">onFailure</span><span class="p">(</span><span class="n">Throwable</span> <span class="n">caught</span><span class="p">)</span> <span class="p">{</span>
<span class="p">//</span> <span class="n">TODO</span> <span class="n">Exception</span>
<span class="p">}</span>
<span class="p">@</span><span class="n">Override</span>
<span class="k">public</span> <span class="n">void</span> <span class="n">onSuccess</span><span class="p">(</span><span class="k">String</span><span class="p">[]</span> <span class="n">result</span><span class="p">)</span> <span class="p">{</span>
<span class="n">for</span> <span class="p">(</span><span class="k">String</span> <span class="n">idea</span> <span class="p">:</span> <span class="n">result</span><span class="p">)</span> <span class="p">{</span>
<span class="k">String</span><span class="p">[]</span> <span class="n">parts</span> <span class="p">=</span> <span class="n">idea</span><span class="p">.</span><span class="n">split</span><span class="p">(</span><span class="s2">"\|"</span><span class="p">);</span>
<span class="n">insertIdeaIntoTable</span><span class="p">(-</span><span class="m">1</span><span class="p">,</span> <span class="n">parts</span><span class="p">[</span><span class="m">0</span><span class="p">],</span> <span class="n">parts</span><span class="p">[</span><span class="m">1</span><span class="p">],</span> <span class="n">parts</span><span class="p">[</span><span class="m">2</span><span class="p">],</span>
<span class="n">parts</span><span class="p">[</span><span class="m">3</span><span class="p">],</span> <span class="n">parts</span><span class="p">[</span><span class="m">4</span><span class="p">]);</span>
<span class="p">}</span>
<span class="p">}</span>
<span class="p">});</span>
<span class="p">}</span>
<span class="p">/**</span>
<span class="p">*</span> <span class="n">Create</span> <span class="n">base</span> <span class="n">panel</span>
<span class="p">*</span>
<span class="p">*</span> <span class="p">@</span><span class="n">return</span>
<span class="p">*/</span>
<span class="n">private</span> <span class="n">Panel</span> <span class="n">createBasePanel</span><span class="p">()</span> <span class="p">{</span>
<span class="p">//</span> <span class="n">Base</span> <span class="n">Panel</span> <span class="k">of</span> <span class="n">this</span> <span class="n">project</span><span class="p">.</span>
<span class="n">VerticalPanel</span> <span class="n">mainPanel</span> <span class="p">=</span> <span class="n">new</span> <span class="n">VerticalPanel</span><span class="p">();</span>
<span class="n">Button</span> <span class="n">btnAdd</span> <span class="p">=</span> <span class="n">new</span> <span class="n">Button</span><span class="p">(</span><span class="s2">"Add Idea"</span><span class="p">);</span>
<span class="p">//</span> <span class="n">Add</span> <span class="n">click</span> <span class="n">handler</span> <span class="k">to</span> <span class="n">add</span> <span class="n">button</span><span class="p">.</span>
<span class="n">btnAdd</span><span class="p">.</span><span class="n">addClickHandler</span><span class="p">(</span><span class="n">new</span> <span class="n">ClickHandler</span><span class="p">()</span> <span class="p">{</span>
<span class="k">public</span> <span class="n">void</span> <span class="n">onClick</span><span class="p">(</span><span class="n">ClickEvent</span> <span class="n">event</span><span class="p">)</span> <span class="p">{</span>
<span class="p">//</span> <span class="n">Show</span> <span class="n">Add</span> <span class="n">Idea</span> <span class="n">Dialog</span>
<span class="n">showIdeaEditDialog</span><span class="p">(</span><span class="nb">true</span><span class="p">,</span> <span class="p">-</span><span class="m">1</span><span class="p">);</span>
<span class="p">}</span>
<span class="p">});</span>
<span class="p">//</span> <span class="n">Assemble</span> <span class="n">the</span> <span class="n">panel</span><span class="p">.</span>
<span class="n">mainPanel</span><span class="p">.</span><span class="n">setHorizontalAlignment</span><span class="p">(</span><span class="n">HasHorizontalAlignment</span><span class="p">.</span><span class="n">ALIGN_CENTER</span><span class="p">);</span>
<span class="n">mainPanel</span><span class="p">.</span><span class="n">add</span><span class="p">(</span><span class="n">table</span><span class="p">);</span>
<span class="n">mainPanel</span><span class="p">.</span><span class="n">add</span><span class="p">(</span><span class="n">btnAdd</span><span class="p">);</span>
<span class="n">return</span> <span class="n">mainPanel</span><span class="p">;</span>
<span class="p">}</span>
<span class="p">/**</span>
<span class="p">*</span> <span class="n">Show</span> <span class="n">Add</span> <span class="n">Idea</span> <span class="n">Dialog</span>
<span class="p">*/</span>
<span class="n">private</span> <span class="n">void</span> <span class="n">showIdeaEditDialog</span><span class="p">(</span><span class="n">final</span> <span class="k">boolean</span> <span class="n">isNew</span><span class="p">,</span> <span class="n">final</span> <span class="n">int</span> <span class="n">index</span><span class="p">)</span> <span class="p">{</span>
<span class="p">//</span> <span class="n">Initial</span> <span class="n">Add</span> <span class="n">Idea</span> <span class="n">Dialog</span><span class="p">.</span>
<span class="n">final</span> <span class="n">DialogBox</span> <span class="n">dialog</span> <span class="p">=</span> <span class="n">new</span> <span class="n">DialogBox</span><span class="p">();</span>
<span class="n">final</span> <span class="n">TextBox</span> <span class="n">txtBoxSubject</span> <span class="p">=</span> <span class="n">new</span> <span class="n">TextBox</span><span class="p">();</span>
<span class="n">final</span> <span class="n">TextArea</span> <span class="n">txtAreaDetail</span> <span class="p">=</span> <span class="n">new</span> <span class="n">TextArea</span><span class="p">();</span>
<span class="n">final</span> <span class="n">ListBox</span> <span class="n">listBox</span> <span class="p">=</span> <span class="n">new</span> <span class="n">ListBox</span><span class="p">();</span>
<span class="n">VerticalPanel</span> <span class="n">dialogPanel</span> <span class="p">=</span> <span class="n">new</span> <span class="n">VerticalPanel</span><span class="p">();</span>
<span class="n">HorizontalPanel</span> <span class="n">itemPanel</span> <span class="p">=</span> <span class="n">new</span> <span class="n">HorizontalPanel</span><span class="p">();</span>
<span class="n">Button</span> <span class="n">btnInsert</span> <span class="p">=</span> <span class="n">new</span> <span class="n">Button</span><span class="p">();</span>
<span class="n">Button</span> <span class="n">btnClose</span> <span class="p">=</span> <span class="n">new</span> <span class="n">Button</span><span class="p">(</span><span class="s2">"Close"</span><span class="p">);</span>
<span class="p">//</span> <span class="k">Set</span> <span class="n">attribute</span><span class="p">.</span>
<span class="n">dialog</span><span class="p">.</span><span class="n">setText</span><span class="p">(</span><span class="s2">"Input your idea"</span><span class="p">);</span>
<span class="n">dialog</span><span class="p">.</span><span class="n">setAnimationEnabled</span><span class="p">(</span><span class="nb">true</span><span class="p">);</span>
<span class="n">txtAreaDetail</span><span class="p">.</span><span class="n">setSize</span><span class="p">(</span><span class="s2">"300"</span><span class="p">,</span> <span class="s2">"380"</span><span class="p">);</span>
<span class="n">listBox</span><span class="p">.</span><span class="n">clear</span><span class="p">();</span>
<span class="n">listBox</span><span class="p">.</span><span class="n">addItem</span><span class="p">(</span><span class="s2">"0%"</span><span class="p">);</span>
<span class="n">listBox</span><span class="p">.</span><span class="n">addItem</span><span class="p">(</span><span class="s2">"25%"</span><span class="p">);</span>
<span class="n">listBox</span><span class="p">.</span><span class="n">addItem</span><span class="p">(</span><span class="s2">"50%"</span><span class="p">);</span>
<span class="n">listBox</span><span class="p">.</span><span class="n">addItem</span><span class="p">(</span><span class="s2">"75%"</span><span class="p">);</span>
<span class="n">listBox</span><span class="p">.</span><span class="n">addItem</span><span class="p">(</span><span class="s2">"100%"</span><span class="p">);</span>
<span class="n">listBox</span><span class="p">.</span><span class="n">setVisibleItemCount</span><span class="p">(</span><span class="m">5</span><span class="p">);</span>
<span class="k">if</span> <span class="p">(</span><span class="n">isNew</span><span class="p">)</span> <span class="p">{</span>
<span class="n">btnInsert</span><span class="p">.</span><span class="n">setText</span><span class="p">(</span><span class="s2">"Insert"</span><span class="p">);</span>
<span class="n">txtBoxSubject</span><span class="p">.</span><span class="n">setText</span><span class="p">(</span><span class="s2">"Input your indea"</span><span class="p">);</span>
<span class="n">listBox</span><span class="p">.</span><span class="n">setSelectedIndex</span><span class="p">(</span><span class="m">0</span><span class="p">);</span>
<span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
<span class="n">btnInsert</span><span class="p">.</span><span class="n">setText</span><span class="p">(</span><span class="s2">"Update"</span><span class="p">);</span>
<span class="n">txtBoxSubject</span><span class="p">.</span><span class="n">setText</span><span class="p">(</span><span class="n">table</span><span class="p">.</span><span class="n">getText</span><span class="p">(</span><span class="n">index</span><span class="p">,</span> <span class="n">COL_SUBJECT</span><span class="p">));</span>
<span class="n">txtAreaDetail</span><span class="p">.</span><span class="n">setText</span><span class="p">(</span><span class="n">table</span><span class="p">.</span><span class="n">getText</span><span class="p">(</span><span class="n">index</span><span class="p">,</span> <span class="n">COL_DETAIL</span><span class="p">));</span>
<span class="n">listBox</span><span class="p">.</span><span class="n">setSelectedIndex</span><span class="p">(</span><span class="n">mapStrToInt</span><span class="p">.</span><span class="n">get</span><span class="p">(</span><span class="n">table</span><span class="p">.</span><span class="n">getText</span><span class="p">(</span><span class="n">index</span><span class="p">,</span>
<span class="n">COL_PROGRESS</span><span class="p">)));</span>
<span class="k">if</span> <span class="p">(</span><span class="n">table</span><span class="p">.</span><span class="n">getText</span><span class="p">(</span><span class="n">index</span><span class="p">,</span> <span class="n">COL_PROGRESS</span><span class="p">).</span><span class="n">compareTo</span><span class="p">(</span><span class="s2">"100%"</span><span class="p">)</span> <span class="p">==</span> <span class="m">0</span> <span class="p">)</span>
<span class="n">listBox</span><span class="p">.</span><span class="n">setEnabled</span><span class="p">(</span><span class="nb">false</span><span class="p">);</span>
<span class="p">}</span>
<span class="p">//</span> <span class="n">Add</span> <span class="n">ClickHandler</span> <span class="k">to</span> <span class="n">Insert</span> <span class="n">button</span>
<span class="n">btnInsert</span><span class="p">.</span><span class="n">addClickHandler</span><span class="p">(</span><span class="n">new</span> <span class="n">ClickHandler</span><span class="p">()</span> <span class="p">{</span>
<span class="k">public</span> <span class="n">void</span> <span class="n">onClick</span><span class="p">(</span><span class="n">ClickEvent</span> <span class="n">event</span><span class="p">)</span> <span class="p">{</span>
<span class="p">//</span> <span class="n">Check</span> <span class="n">empty</span>
<span class="k">if</span> <span class="p">(</span><span class="n">txtBoxSubject</span><span class="p">.</span><span class="n">getText</span><span class="p">().</span><span class="n">length</span><span class="p">()</span> <span class="p">==</span> <span class="m">0</span>
<span class="p">||</span> <span class="n">txtAreaDetail</span><span class="p">.</span><span class="n">getText</span><span class="p">().</span><span class="n">length</span><span class="p">()</span> <span class="p">==</span> <span class="m">0</span><span class="p">)</span>
<span class="n">return</span><span class="p">;</span>
<span class="p">//</span> <span class="n">Check</span> <span class="n">exist</span>
<span class="k">if</span> <span class="p">(</span><span class="n">subjectList</span><span class="p">.</span><span class="n">contains</span><span class="p">(</span><span class="n">txtBoxSubject</span><span class="p">.</span><span class="n">getText</span><span class="p">())</span> <span class="p">==</span> <span class="nb">true</span>
<span class="p">&&</span> <span class="n">isNew</span><span class="p">)</span> <span class="p">{</span>
<span class="n">return</span><span class="p">;</span>
<span class="p">}</span>
<span class="n">insert</span><span class="p">(</span><span class="n">index</span><span class="p">,</span> <span class="n">txtBoxSubject</span><span class="p">.</span><span class="n">getText</span><span class="p">(),</span> <span class="n">txtAreaDetail</span><span class="p">.</span><span class="n">getText</span><span class="p">(),</span>
<span class="n">mapIntToStr</span><span class="p">.</span><span class="n">get</span><span class="p">(</span><span class="n">listBox</span><span class="p">.</span><span class="n">getSelectedIndex</span><span class="p">()));</span>
<span class="n">dialog</span><span class="p">.</span><span class="n">hide</span><span class="p">();</span>
<span class="p">}</span>
<span class="p">});</span>
<span class="p">//</span> <span class="n">Add</span> <span class="n">ClickHandler</span> <span class="k">to</span> <span class="n">Close</span> <span class="n">button</span>
<span class="n">btnClose</span><span class="p">.</span><span class="n">addClickHandler</span><span class="p">(</span><span class="n">new</span> <span class="n">ClickHandler</span><span class="p">()</span> <span class="p">{</span>
<span class="k">public</span> <span class="n">void</span> <span class="n">onClick</span><span class="p">(</span><span class="n">ClickEvent</span> <span class="n">event</span><span class="p">)</span> <span class="p">{</span>
<span class="n">dialog</span><span class="p">.</span><span class="n">hide</span><span class="p">();</span>
<span class="p">}</span>
<span class="p">});</span>
<span class="p">//</span> <span class="n">Assemble</span> <span class="n">dialog</span> <span class="n">panel</span><span class="p">.</span>
<span class="n">itemPanel</span><span class="p">.</span><span class="n">setWidth</span><span class="p">(</span><span class="s2">"100%"</span><span class="p">);</span>
<span class="n">itemPanel</span><span class="p">.</span><span class="n">setVerticalAlignment</span><span class="p">(</span><span class="n">HasVerticalAlignment</span><span class="p">.</span><span class="n">ALIGN_MIDDLE</span><span class="p">);</span>
<span class="n">itemPanel</span><span class="p">.</span><span class="n">add</span><span class="p">(</span><span class="n">listBox</span><span class="p">);</span>
<span class="n">itemPanel</span><span class="p">.</span><span class="n">add</span><span class="p">(</span><span class="n">btnInsert</span><span class="p">);</span>
<span class="n">itemPanel</span><span class="p">.</span><span class="n">add</span><span class="p">(</span><span class="n">btnClose</span><span class="p">);</span>
<span class="n">dialogPanel</span><span class="p">.</span><span class="n">add</span><span class="p">(</span><span class="n">txtBoxSubject</span><span class="p">);</span>
<span class="n">dialogPanel</span><span class="p">.</span><span class="n">add</span><span class="p">(</span><span class="n">txtAreaDetail</span><span class="p">);</span>
<span class="n">dialogPanel</span><span class="p">.</span><span class="n">add</span><span class="p">(</span><span class="n">itemPanel</span><span class="p">);</span>
<span class="p">//</span> <span class="n">Associate</span> <span class="n">the</span> <span class="n">dialog</span> <span class="k">with</span> <span class="n">the</span> <span class="n">panel</span><span class="p">.</span>
<span class="n">dialog</span><span class="p">.</span><span class="n">setWidget</span><span class="p">(</span><span class="n">dialogPanel</span><span class="p">);</span>
<span class="p">//</span> <span class="n">Show</span> <span class="n">dialog</span><span class="p">.</span>
<span class="n">dialog</span><span class="p">.</span><span class="n">center</span><span class="p">();</span>
<span class="p">}</span>
<span class="n">private</span> <span class="n">void</span> <span class="n">insert</span><span class="p">(</span><span class="n">final</span> <span class="n">int</span> <span class="n">index</span><span class="p">,</span> <span class="n">final</span> <span class="k">String</span> <span class="n">subject</span><span class="p">,</span>
<span class="n">final</span> <span class="k">String</span> <span class="n">detail</span><span class="p">,</span> <span class="n">final</span> <span class="k">String</span> <span class="n">progress</span><span class="p">)</span> <span class="p">{</span>
<span class="k">if</span> <span class="p">(</span><span class="n">index</span> <span class="p">==</span> <span class="p">-</span><span class="m">1</span><span class="p">)</span> <span class="p">{</span>
<span class="p">//</span> <span class="n">new</span> <span class="n">idea</span>
<span class="n">dbWorker</span><span class="p">.</span><span class="n">save</span><span class="p">(</span><span class="n">subject</span><span class="p">,</span> <span class="n">detail</span><span class="p">,</span> <span class="n">progress</span><span class="p">,</span>
<span class="n">new</span> <span class="n">AsyncCallback</span><span class="p">()</span> <span class="p">{</span>
<span class="p">@</span><span class="n">Override</span>
<span class="k">public</span> <span class="n">void</span> <span class="n">onFailure</span><span class="p">(</span><span class="n">Throwable</span> <span class="n">caught</span><span class="p">)</span> <span class="p">{</span>
<span class="p">//</span> <span class="n">TODO</span> <span class="n">Auto</span><span class="p">-</span><span class="n">generated</span> <span class="n">method</span> <span class="n">stub</span>
<span class="p">}</span>
<span class="p">@</span><span class="n">Override</span>
<span class="k">public</span> <span class="n">void</span> <span class="n">onSuccess</span><span class="p">(</span><span class="k">String</span> <span class="n">idea</span><span class="p">)</span> <span class="p">{</span>
<span class="k">if</span> <span class="p">(</span><span class="n">idea</span><span class="p">.</span><span class="n">length</span><span class="p">()</span> <span class="c1">!= 0) {
</span> <span class="k">String</span><span class="p">[]</span> <span class="n">parts</span> <span class="p">=</span> <span class="n">idea</span><span class="p">.</span><span class="n">split</span><span class="p">(</span><span class="s2">"\|"</span><span class="p">);</span>
<span class="n">insertIdeaIntoTable</span><span class="p">(</span><span class="n">index</span><span class="p">,</span> <span class="n">parts</span><span class="p">[</span><span class="m">0</span><span class="p">],</span> <span class="n">parts</span><span class="p">[</span><span class="m">1</span><span class="p">],</span>
<span class="n">parts</span><span class="p">[</span><span class="m">2</span><span class="p">],</span> <span class="n">parts</span><span class="p">[</span><span class="m">3</span><span class="p">],</span>
<span class="n">parts</span><span class="p">[</span><span class="m">4</span><span class="p">]</span> <span class="p">==</span> <span class="s2">"null"</span> <span class="p">?</span> <span class="s2">""</span> <span class="p">:</span> <span class="n">parts</span><span class="p">[</span><span class="m">4</span><span class="p">]);</span>
<span class="p">}</span>
<span class="p">}</span>
<span class="p">});</span>
<span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
<span class="n">dbWorker</span><span class="p">.</span><span class="n">update</span><span class="p">(</span><span class="n">table</span><span class="p">.</span><span class="n">getText</span><span class="p">(</span><span class="n">index</span><span class="p">,</span> <span class="n">COL_ID</span><span class="p">),</span> <span class="n">subject</span><span class="p">,</span> <span class="n">detail</span><span class="p">,</span>
<span class="n">progress</span><span class="p">,</span> <span class="n">new</span> <span class="n">AsyncCallback</span><span class="p">()</span> <span class="p">{</span>
<span class="p">@</span><span class="n">Override</span>
<span class="k">public</span> <span class="n">void</span> <span class="n">onFailure</span><span class="p">(</span><span class="n">Throwable</span> <span class="n">caught</span><span class="p">)</span> <span class="p">{</span>
<span class="p">//</span> <span class="n">TODO</span> <span class="n">Auto</span><span class="p">-</span><span class="n">generated</span> <span class="n">method</span> <span class="n">stub</span>
<span class="p">}</span>
<span class="p">@</span><span class="n">Override</span>
<span class="k">public</span> <span class="n">void</span> <span class="n">onSuccess</span><span class="p">(</span><span class="k">String</span> <span class="n">idea</span><span class="p">)</span> <span class="p">{</span>
<span class="k">if</span> <span class="p">(</span><span class="n">idea</span><span class="p">.</span><span class="n">length</span><span class="p">()</span> <span class="c1">!= 0) {
</span> <span class="k">String</span><span class="p">[]</span> <span class="n">parts</span> <span class="p">=</span> <span class="n">idea</span><span class="p">.</span><span class="n">split</span><span class="p">(</span><span class="s2">"\|"</span><span class="p">);</span>
<span class="n">insertIdeaIntoTable</span><span class="p">(</span><span class="n">index</span><span class="p">,</span> <span class="n">parts</span><span class="p">[</span><span class="m">0</span><span class="p">],</span> <span class="n">parts</span><span class="p">[</span><span class="m">1</span><span class="p">],</span>
<span class="n">parts</span><span class="p">[</span><span class="m">2</span><span class="p">],</span> <span class="n">parts</span><span class="p">[</span><span class="m">3</span><span class="p">],</span>
<span class="n">parts</span><span class="p">[</span><span class="m">4</span><span class="p">].</span><span class="n">compareTo</span><span class="p">(</span><span class="s2">"null"</span><span class="p">)==</span><span class="m">0</span> <span class="p">?</span> <span class="s2">""</span> <span class="p">:</span> <span class="n">parts</span><span class="p">[</span><span class="m">4</span><span class="p">]);</span>
<span class="p">}</span>
<span class="p">}</span>
<span class="p">});</span>
<span class="p">}</span>
<span class="p">}</span>
<span class="n">private</span> <span class="n">void</span> <span class="n">insertIdeaIntoTable</span><span class="p">(</span><span class="n">int</span> <span class="n">index</span><span class="p">,</span> <span class="n">final</span> <span class="k">String</span> <span class="n">id</span><span class="p">,</span>
<span class="n">final</span> <span class="k">String</span> <span class="n">subject</span><span class="p">,</span> <span class="k">String</span> <span class="n">detail</span><span class="p">,</span> <span class="k">String</span> <span class="n">progress</span><span class="p">,</span> <span class="k">String</span> <span class="n">date</span><span class="p">)</span> <span class="p">{</span>
<span class="p">//</span>
<span class="k">if</span> <span class="p">(</span><span class="n">index</span> <span class="p">==</span> <span class="p">-</span><span class="m">1</span><span class="p">)</span> <span class="p">{</span>
<span class="n">index</span> <span class="p">=</span> <span class="n">table</span><span class="p">.</span><span class="n">getRowCount</span><span class="p">();</span>
<span class="n">subjectList</span><span class="p">.</span><span class="n">add</span><span class="p">(</span><span class="n">subject</span><span class="p">);</span>
<span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
<span class="n">subjectList</span><span class="p">.</span><span class="k">set</span><span class="p">(</span><span class="n">index</span> <span class="p">-</span> <span class="m">1</span><span class="p">,</span> <span class="n">subject</span><span class="p">);</span>
<span class="p">}</span>
<span class="n">HorizontalPanel</span> <span class="n">panel</span> <span class="p">=</span> <span class="n">new</span> <span class="n">HorizontalPanel</span><span class="p">();</span>
<span class="n">Button</span> <span class="n">btnUpdate</span> <span class="p">=</span> <span class="n">new</span> <span class="n">Button</span><span class="p">(</span><span class="s2">"Update"</span><span class="p">);</span>
<span class="n">Button</span> <span class="n">btnRemove</span> <span class="p">=</span> <span class="n">new</span> <span class="n">Button</span><span class="p">(</span><span class="s2">"Remove"</span><span class="p">);</span>
<span class="p">//</span> <span class="n">Add</span> <span class="n">handler</span> <span class="k">to</span> <span class="n">buttons</span>
<span class="n">btnUpdate</span><span class="p">.</span><span class="n">addClickHandler</span><span class="p">(</span><span class="n">new</span> <span class="n">ClickHandler</span><span class="p">()</span> <span class="p">{</span>
<span class="p">@</span><span class="n">Override</span>
<span class="k">public</span> <span class="n">void</span> <span class="n">onClick</span><span class="p">(</span><span class="n">ClickEvent</span> <span class="n">event</span><span class="p">)</span> <span class="p">{</span>
<span class="n">int</span> <span class="n">i</span> <span class="p">=</span> <span class="n">subjectList</span><span class="p">.</span><span class="n">indexOf</span><span class="p">(</span><span class="n">subject</span><span class="p">);</span>
<span class="n">showIdeaEditDialog</span><span class="p">(</span><span class="nb">false</span><span class="p">,</span> <span class="n">i</span> <span class="p">+</span> <span class="m">1</span><span class="p">);</span>
<span class="p">}</span>
<span class="p">});</span>
<span class="n">btnRemove</span><span class="p">.</span><span class="n">addClickHandler</span><span class="p">(</span><span class="n">new</span> <span class="n">ClickHandler</span><span class="p">()</span> <span class="p">{</span>
<span class="p">@</span><span class="n">Override</span>
<span class="k">public</span> <span class="n">void</span> <span class="n">onClick</span><span class="p">(</span><span class="n">ClickEvent</span> <span class="n">event</span><span class="p">)</span> <span class="p">{</span>
<span class="n">dbWorker</span><span class="p">.</span><span class="n">delete</span><span class="p">(</span><span class="n">Long</span><span class="p">.</span><span class="n">valueOf</span><span class="p">(</span><span class="n">id</span><span class="p">),</span> <span class="n">new</span> <span class="n">AsyncCallback</span><span class="p">()</span> <span class="p">{</span>
<span class="p">@</span><span class="n">Override</span>
<span class="k">public</span> <span class="n">void</span> <span class="n">onFailure</span><span class="p">(</span><span class="n">Throwable</span> <span class="n">caught</span><span class="p">)</span> <span class="p">{</span>
<span class="p">//</span> <span class="n">TODO</span> <span class="n">Auto</span><span class="p">-</span><span class="n">generated</span> <span class="n">method</span> <span class="n">stub</span>
<span class="p">}</span>
<span class="p">@</span><span class="n">Override</span>
<span class="k">public</span> <span class="n">void</span> <span class="n">onSuccess</span><span class="p">(</span><span class="k">Boolean</span> <span class="n">result</span><span class="p">)</span> <span class="p">{</span>
<span class="n">int</span> <span class="n">i</span> <span class="p">=</span> <span class="n">subjectList</span><span class="p">.</span><span class="n">indexOf</span><span class="p">(</span><span class="n">subject</span><span class="p">);</span>
<span class="n">table</span><span class="p">.</span><span class="n">removeRow</span><span class="p">(</span><span class="n">i</span> <span class="p">+</span> <span class="m">1</span><span class="p">);</span>
<span class="n">subjectList</span><span class="p">.</span><span class="n">remove</span><span class="p">(</span><span class="n">subject</span><span class="p">);</span>
<span class="p">}</span>
<span class="p">});</span>
<span class="p">}</span>
<span class="p">});</span>
<span class="n">panel</span><span class="p">.</span><span class="n">add</span><span class="p">(</span><span class="n">btnUpdate</span><span class="p">);</span>
<span class="n">panel</span><span class="p">.</span><span class="n">add</span><span class="p">(</span><span class="n">btnRemove</span><span class="p">);</span>
<span class="n">table</span><span class="p">.</span><span class="n">setWidget</span><span class="p">(</span><span class="n">index</span><span class="p">,</span> <span class="n">COL_OPERATION</span><span class="p">,</span> <span class="n">panel</span><span class="p">);</span>
<span class="n">table</span><span class="p">.</span><span class="n">setText</span><span class="p">(</span><span class="n">index</span><span class="p">,</span> <span class="n">COL_ID</span><span class="p">,</span> <span class="n">id</span><span class="p">);</span>
<span class="n">table</span><span class="p">.</span><span class="n">setText</span><span class="p">(</span><span class="n">index</span><span class="p">,</span> <span class="n">COL_SUBJECT</span><span class="p">,</span> <span class="n">subject</span><span class="p">);</span>
<span class="n">table</span><span class="p">.</span><span class="n">setText</span><span class="p">(</span><span class="n">index</span><span class="p">,</span> <span class="n">COL_DETAIL</span><span class="p">,</span> <span class="n">detail</span><span class="p">);</span>
<span class="n">table</span><span class="p">.</span><span class="n">setText</span><span class="p">(</span><span class="n">index</span><span class="p">,</span> <span class="n">COL_PROGRESS</span><span class="p">,</span> <span class="n">progress</span><span class="p">);</span>
<span class="k">if</span> <span class="p">(</span><span class="n">progress</span><span class="p">.</span><span class="n">compareTo</span><span class="p">(</span><span class="s2">"100%"</span><span class="p">)</span> <span class="p">==</span> <span class="m">0</span> <span class="p">&&</span> <span class="n">table</span><span class="p">.</span><span class="n">getText</span><span class="p">(</span><span class="n">index</span><span class="p">,</span> <span class="n">COL_TIME</span><span class="p">).</span><span class="n">length</span><span class="p">()</span> <span class="p">==</span> <span class="m">0</span><span class="p">)</span> <span class="p">{</span>
<span class="n">table</span><span class="p">.</span><span class="n">setText</span><span class="p">(</span><span class="n">index</span><span class="p">,</span> <span class="n">COL_TIME</span><span class="p">,</span> <span class="n">date</span><span class="p">);</span>
<span class="p">}</span>
<span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>
<p>Well done,来运行一下看效果吧。点击Add弹出对话框,填入新的idea,这样在table中就出现了这个idea,同时,会把idea插入服务器端的数据库。重新刷新一下界面,会再次从数据库读取信息,显示在table中。</p>
<p>演示地址 :<a href="http://kylewuidea.appspot.com" title="Kyle Wu Idea">http://kylewuidea.appspot.com</a></p>
<p><img src="/assets/3465334900_5fb4c6e66e.jpg" alt="" title="Kyle Wu Idea" /></p>
<h2 id="总结">总结</h2>
<p>好了,就写到这里了,稍微回顾一下,在熟悉了Google Web Toolkit 和 Google App Engine 后,我们先制作了界面,然后实现了服务器端的数据存储,今天把前后台结合起来。难度很低,因为是一个入门教程,也是自我学习的一个记录。还有很多东西没有去实现,比如现在任何人都可以Add Idea ( 这个其实只要在server端判断一下user就可以了 ),对重复的idea没有进行检查,样式上几乎没做任何操作……
希望诸位同学多多指导,大家都来做些好的应用。</p>
Google Web Toolkit 和 Google App Engine 综合教程 存储篇
2009-04-16T22:00:00+00:00
http://wenbinwu.com/%E7%BC%96%E7%A8%8B%E6%8A%80%E6%9C%AF/2009/04/16/google-web-toolkit-google-app-engine-tutorial-storage
<p>前面已经向同学们简要介绍了Google Web Toolkit 和 Google App Engine ,并且做出了一个初步的界面。在这篇教程里,我们将一起学习如何使用Google App Engine 的数据库。</p>
<h2 id="简单介绍google-app-engine-的数据库">简单介绍Google App Engine 的数据库</h2>
<p>Google App Engine 的数据库提供了健壮的可扩展的分布式数据存储,我们不必考虑连接哪一个数据库,也不需要配置连接参数。我们需要做的是调用简单的API来进行各种操作。</p>
<p>Google App Engine 的数据库提供了两套API : 标准API和底层API。标准API是与App Engine解耦的,所以使用标准API你可以很方便的将你的应用移植到其他环境中;而是用底层API,你可以让你的应用拥有更好的性能。</p>
<p>Google App Engine 支持两种连接数据库的标准: Java Data Objects (JDO) 和 Java Persistence API (JPA)。从Google App Engine 的网站中可以看到,它们都是由<a href="http://www.datanucleus.org/">DataNucleus Access Platform</a>提供的,不过我没有细看,有兴趣的同学可以自己点进去学习。</p>
<h2 id="什么是jdo-">什么是JDO ?</h2>
<p>Java Data Objects (JDO) 是存储对象的标准接口。使用了JDO的应用程序不需要关心数据库类型,不论是关系数据库,层次数据库还是对象数据库,这样在我们更换数据源的时候会非常的方便。</p>
<p>要在Google App Engine项目中支持JDO,需要进行配置,不过Eclipse的插件已经帮我们做好了,再次请有兴趣的同学移步<a href="http://code.google.com/appengine/docs/java/datastore/usingjdo.html#Setting_Up_JDO">这里</a>仔细学习。</p>
<p>Java Persistence API (JPA) 和JDO的作用相似,我现在使用的JDO,所以就不多做介绍了,<a href="http://code.google.com/appengine/docs/java/datastore/usingjpa.html">链接</a>补上。</p>
<h2 id="建立数据库的pojo类">建立数据库的POJO类</h2>
<p>前面进行了简单介绍,下面来实际操作一下。新建一个net.kylewu.idea.db.dataobject.Idea类。</p>
<div class="highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">package</span> <span class="n">net</span><span class="p">.</span><span class="n">kylewu</span><span class="p">.</span><span class="n">idea</span><span class="p">.</span><span class="n">server</span><span class="p">;</span>
<span class="n">import</span> <span class="n">java</span><span class="p">.</span><span class="n">io</span><span class="p">.</span><span class="n">Serializable</span><span class="p">;</span>
<span class="n">import</span> <span class="n">javax</span><span class="p">.</span><span class="n">jdo</span><span class="p">.</span><span class="n">annotations</span><span class="p">.</span><span class="n">IdGeneratorStrategy</span><span class="p">;</span>
<span class="n">import</span> <span class="n">javax</span><span class="p">.</span><span class="n">jdo</span><span class="p">.</span><span class="n">annotations</span><span class="p">.</span><span class="n">IdentityType</span><span class="p">;</span>
<span class="n">import</span> <span class="n">javax</span><span class="p">.</span><span class="n">jdo</span><span class="p">.</span><span class="n">annotations</span><span class="p">.</span><span class="n">PersistenceCapable</span><span class="p">;</span>
<span class="n">import</span> <span class="n">javax</span><span class="p">.</span><span class="n">jdo</span><span class="p">.</span><span class="n">annotations</span><span class="p">.</span><span class="n">Persistent</span><span class="p">;</span>
<span class="n">import</span> <span class="n">javax</span><span class="p">.</span><span class="n">jdo</span><span class="p">.</span><span class="n">annotations</span><span class="p">.</span><span class="n">PrimaryKey</span><span class="p">;</span>
<span class="p">@</span><span class="n">PersistenceCapable</span><span class="p">(</span><span class="n">identityType</span> <span class="p">=</span> <span class="n">IdentityType</span><span class="p">.</span><span class="n">APPLICATION</span><span class="p">)</span>
<span class="k">public</span> <span class="n">class</span> <span class="n">Idea</span> <span class="n">implements</span> <span class="n">Serializable</span> <span class="p">{</span>
<span class="p">/**</span>
<span class="p">*</span>
<span class="p">*/</span>
<span class="n">private</span> <span class="n">static</span> <span class="n">final</span> <span class="n">long</span> <span class="n">serialVersionUID</span> <span class="p">=</span> <span class="m">1083036616443527590L</span><span class="p">;</span>
<span class="p">@</span><span class="n">PrimaryKey</span>
<span class="p">@</span><span class="n">Persistent</span><span class="p">(</span><span class="n">valueStrategy</span> <span class="p">=</span> <span class="n">IdGeneratorStrategy</span><span class="p">.</span><span class="n">IDENTITY</span><span class="p">)</span>
<span class="n">private</span> <span class="n">Long</span> <span class="n">id</span><span class="p">;</span>
<span class="p">@</span><span class="n">Persistent</span>
<span class="n">private</span> <span class="k">String</span> <span class="n">subject</span><span class="p">;</span>
<span class="p">@</span><span class="n">Persistent</span>
<span class="n">private</span> <span class="k">String</span> <span class="n">detail</span><span class="p">;</span>
<span class="p">@</span><span class="n">Persistent</span>
<span class="n">private</span> <span class="k">String</span> <span class="n">progress</span><span class="p">;</span>
<span class="p">@</span><span class="n">Persistent</span>
<span class="n">private</span> <span class="k">String</span> <span class="n">date</span><span class="p">;</span>
<span class="k">public</span> <span class="n">Idea</span><span class="p">(</span><span class="n">Long</span> <span class="n">id</span><span class="p">,</span> <span class="k">String</span> <span class="n">subject</span><span class="p">,</span> <span class="k">String</span> <span class="n">detail</span><span class="p">,</span> <span class="k">String</span> <span class="n">progress</span><span class="p">,</span>
<span class="k">String</span> <span class="n">date</span><span class="p">)</span> <span class="p">{</span>
<span class="n">super</span><span class="p">();</span>
<span class="n">this</span><span class="p">.</span><span class="n">id</span> <span class="p">=</span> <span class="n">id</span><span class="p">;</span>
<span class="n">this</span><span class="p">.</span><span class="n">subject</span> <span class="p">=</span> <span class="n">subject</span><span class="p">;</span>
<span class="n">this</span><span class="p">.</span><span class="n">detail</span> <span class="p">=</span> <span class="n">detail</span><span class="p">;</span>
<span class="n">this</span><span class="p">.</span><span class="n">progress</span> <span class="p">=</span> <span class="n">progress</span><span class="p">;</span>
<span class="n">this</span><span class="p">.</span><span class="n">date</span> <span class="p">=</span> <span class="n">date</span><span class="p">;</span>
<span class="p">}</span>
<span class="k">public</span> <span class="n">Idea</span><span class="p">(</span><span class="k">String</span> <span class="n">subject</span><span class="p">,</span> <span class="k">String</span> <span class="n">detail</span><span class="p">,</span> <span class="k">String</span> <span class="n">progress</span><span class="p">,</span> <span class="k">String</span> <span class="n">date</span><span class="p">)</span> <span class="p">{</span>
<span class="n">this</span><span class="p">.</span><span class="n">subject</span> <span class="p">=</span> <span class="n">subject</span><span class="p">;</span>
<span class="n">this</span><span class="p">.</span><span class="n">detail</span> <span class="p">=</span> <span class="n">detail</span><span class="p">;</span>
<span class="n">this</span><span class="p">.</span><span class="n">progress</span> <span class="p">=</span> <span class="n">progress</span><span class="p">;</span>
<span class="n">this</span><span class="p">.</span><span class="n">date</span> <span class="p">=</span> <span class="n">date</span><span class="p">;</span>
<span class="p">}</span>
<span class="k">public</span> <span class="n">Long</span> <span class="nf">getId</span><span class="p">()</span> <span class="p">{</span>
<span class="n">return</span> <span class="n">id</span><span class="p">;</span>
<span class="p">}</span>
<span class="k">public</span> <span class="n">void</span> <span class="n">setId</span><span class="p">(</span><span class="n">Long</span> <span class="n">id</span><span class="p">)</span> <span class="p">{</span>
<span class="n">this</span><span class="p">.</span><span class="n">id</span> <span class="p">=</span> <span class="n">id</span><span class="p">;</span>
<span class="p">}</span>
<span class="k">public</span> <span class="k">String</span> <span class="n">getSubject</span><span class="p">()</span> <span class="p">{</span>
<span class="n">return</span> <span class="n">subject</span><span class="p">;</span>
<span class="p">}</span>
<span class="k">public</span> <span class="n">void</span> <span class="n">setSubject</span><span class="p">(</span><span class="k">String</span> <span class="n">subject</span><span class="p">)</span> <span class="p">{</span>
<span class="n">this</span><span class="p">.</span><span class="n">subject</span> <span class="p">=</span> <span class="n">subject</span><span class="p">;</span>
<span class="p">}</span>
<span class="k">public</span> <span class="k">String</span> <span class="n">getDetail</span><span class="p">()</span> <span class="p">{</span>
<span class="n">return</span> <span class="n">detail</span><span class="p">;</span>
<span class="p">}</span>
<span class="k">public</span> <span class="n">void</span> <span class="n">setDetail</span><span class="p">(</span><span class="k">String</span> <span class="n">detail</span><span class="p">)</span> <span class="p">{</span>
<span class="n">this</span><span class="p">.</span><span class="n">detail</span> <span class="p">=</span> <span class="n">detail</span><span class="p">;</span>
<span class="p">}</span>
<span class="k">public</span> <span class="k">String</span> <span class="n">getProgress</span><span class="p">()</span> <span class="p">{</span>
<span class="n">return</span> <span class="n">progress</span><span class="p">;</span>
<span class="p">}</span>
<span class="k">public</span> <span class="n">void</span> <span class="n">setProgress</span><span class="p">(</span><span class="k">String</span> <span class="n">progress</span><span class="p">)</span> <span class="p">{</span>
<span class="n">this</span><span class="p">.</span><span class="n">progress</span> <span class="p">=</span> <span class="n">progress</span><span class="p">;</span>
<span class="p">}</span>
<span class="k">public</span> <span class="k">String</span> <span class="nf">getDate</span><span class="p">()</span> <span class="p">{</span>
<span class="n">return</span> <span class="n">date</span><span class="p">;</span>
<span class="p">}</span>
<span class="k">public</span> <span class="n">void</span> <span class="nf">setDate</span><span class="p">(</span><span class="k">String</span> <span class="n">date</span><span class="p">)</span> <span class="p">{</span>
<span class="n">this</span><span class="p">.</span><span class="n">date</span> <span class="p">=</span> <span class="n">date</span><span class="p">;</span>
<span class="p">}</span>
<span class="k">public</span> <span class="k">String</span> <span class="n">toString</span><span class="p">(){</span>
<span class="n">return</span> <span class="k">String</span><span class="p">.</span><span class="n">valueOf</span><span class="p">(</span><span class="n">id</span><span class="p">)+</span><span class="s2">"|"</span><span class="p">+</span><span class="n">subject</span><span class="p">+</span><span class="s2">"|"</span><span class="p">+</span><span class="n">detail</span><span class="p">+</span><span class="s2">"|"</span><span class="p">+</span><span class="n">progress</span><span class="p">+</span><span class="s2">"|"</span><span class="p">+</span><span class="n">date</span><span class="p">;</span>
<span class="p">}</span> <span class="p">}</span>
</code></pre></div></div>
<p>JDO使用annotations来表示数据如何在数据库中存储。这里我们把id设置为主键。</p>
<p>与数据库交互需要用到PersistenceManager对象,它是由PersistenceManagerFactory中获得的,为了免去重复创建factory的开销,使用singleton模式来实现这个类。Google App Engine 上提供了一个很好的例子,我直接拿来用了。</p>
<div class="highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">package</span> <span class="n">net</span><span class="p">.</span><span class="n">kylewu</span><span class="p">.</span><span class="n">idea</span><span class="p">.</span><span class="n">db</span><span class="p">;</span>
<span class="n">import</span> <span class="n">javax</span><span class="p">.</span><span class="n">jdo</span><span class="p">.</span><span class="n">JDOHelper</span><span class="p">;</span>
<span class="n">import</span> <span class="n">javax</span><span class="p">.</span><span class="n">jdo</span><span class="p">.</span><span class="n">PersistenceManagerFactory</span><span class="p">;</span>
<span class="k">public</span> <span class="n">final</span> <span class="n">class</span> <span class="n">PMF</span> <span class="p">{</span>
<span class="n">private</span> <span class="n">static</span> <span class="n">final</span> <span class="n">PersistenceManagerFactory</span> <span class="n">pmfInstance</span> <span class="p">=</span> <span class="n">JDOHelper</span>
<span class="p">.</span><span class="n">getPersistenceManagerFactory</span><span class="p">(</span><span class="s2">"transactions-optional"</span><span class="p">);</span>
<span class="n">private</span> <span class="n">PMF</span><span class="p">()</span> <span class="p">{</span>
<span class="p">}</span>
<span class="k">public</span> <span class="n">static</span> <span class="n">PersistenceManagerFactory</span> <span class="n">get</span><span class="p">()</span> <span class="p">{</span>
<span class="n">return</span> <span class="n">pmfInstance</span><span class="p">;</span>
<span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>
<p>好了,这样就可以get到PersistenceManager对象了,那么该如何存储查询对象呢?代码很简单。</p>
<div class="highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Idea idea = new Idea ("Kylewu Idea", "This is Kyle Wu's idea.", "75%", "");
PersistenceManager pm = PMF.get().getPersistenceManager();
pm.makePersistent(idea);
String query = "select from " + Idea.class.getName();
(List) list = pm.newQuery(query).execute();
</code></pre></div></div>
<p>同学们要问了,我们怎么让他跑起来呢?这个涉及到Google Web Toolkit 与服务器端的交互了,下一篇教程将详细介绍。</p>
收到Google Developer Day 2009 的确认函
2009-04-16T22:00:00+00:00
http://wenbinwu.com/%E4%BA%92%E8%81%94%E7%BD%91/2009/04/16/google-developer-day-2009
<p>前几天在这里我介绍了Google Developer Day 2009 的活动,同时自己也进行了注册申请。今天中午收到了来自Google Developer Day 2009 的确认邮件。2009年6月5日在北京国际会议中心,趁机再游览一下北京城吧。</p>
<p>再给一次链接,没申请的同学快去<a href="http://code.google.com/intl/zh-CN/events/developerday/2009/home.html">申请</a>吧。</p>
Google Web Toolkit 和 Google App Engine 综合教程 界面篇
2009-04-14T22:00:00+00:00
http://wenbinwu.com/%E7%BC%96%E7%A8%8B%E6%8A%80%E6%9C%AF/2009/04/14/google-web-toolkit-google-app-engine-ui
<p>诸位还不清楚Google Web Toolkit 和 Google App Engine是什么的同学,请移步这里,看我的综合教程 启蒙篇。 请装好Eclipse的插件,后面的程序都是以插件为准,用命令行的同学请自己注意。</p>
<h2 id="创建eclipse工程">创建Eclipse工程</h2>
<p><img src="/assets/3445125282_b4c2cde5bd_o.png" alt="" title="Eclipse plugin button" /></p>
<p>点击最左面的小图标就开始创建新的Web应用。我这里创建了一个名为kylewuidea的Project,包设为net.kylewu.idea,我们这里要同时使用Google Web Toolkit 和 Google App Engine,所以两个都要选择支持。确认后可以看到Eclipse为我们创建好了整个Project,结构见图。</p>
<p><img src="/assets/3444307627_1b0ab58861_o.png" alt="" title="New Eclipse Project" /></p>
<p><img src="/assets/3444307657_86ab8b604b_o.png" alt="" title="Project structure" /></p>
<h2 id="google-web-toolkit-部分">Google Web Toolkit 部分</h2>
<p>打开Kylewuidea.java,里面已经写好了一个事例程序,有兴趣的同学可以先熟悉一下。接下来删除这个文件里多余的代码,仅保留下面这些。</p>
<div class="highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">package</span> <span class="n">net</span><span class="p">.</span><span class="n">kylewu</span><span class="p">.</span><span class="n">idea</span><span class="p">.</span><span class="n">client</span><span class="p">;</span>
<span class="n">import</span> <span class="n">com</span><span class="p">.</span><span class="n">google</span><span class="p">.</span><span class="n">gwt</span><span class="p">.</span><span class="n">core</span><span class="p">.</span><span class="n">client</span><span class="p">.</span><span class="n">EntryPoint</span><span class="p">;</span>
<span class="p">/*</span>
<span class="p">*</span> <span class="n">Entry</span> <span class="n">point</span> <span class="n">classes</span> <span class="n">define</span> <span class="n">onModuleLoad</span><span class="p">().</span>
<span class="p">*/</span>
<span class="k">public</span> <span class="n">class</span> <span class="n">Kylewuidea</span> <span class="n">implements</span> <span class="n">EntryPoint</span> <span class="p">{</span>
<span class="p">/**</span>
<span class="p">*</span> <span class="n">This</span> <span class="n">is</span> <span class="n">the</span> <span class="n">entry</span> <span class="n">point</span> <span class="n">method</span><span class="p">.</span>
<span class="p">*/</span>
<span class="k">public</span> <span class="n">void</span> <span class="n">onModuleLoad</span><span class="p">()</span> <span class="p">{</span>
<span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>
<p>下面我们就要往里面填东西了,同学们来看一下页面的结构,一个表格,包括了IdeaId,Idea主题,Idea详情,Idea完成进度及完成时间,按钮,备注。最后有一个添加Idea按钮,用来加入Idea。结构清晰了,就来写代码吧。</p>
<div class="highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">package</span> <span class="n">net</span><span class="p">.</span><span class="n">kylewu</span><span class="p">.</span><span class="n">idea</span><span class="p">.</span><span class="n">client</span><span class="p">;</span>
<span class="n">import</span> <span class="n">com</span><span class="p">.</span><span class="n">google</span><span class="p">.</span><span class="n">gwt</span><span class="p">.</span><span class="n">core</span><span class="p">.</span><span class="n">client</span><span class="p">.</span><span class="n">EntryPoint</span><span class="p">;</span>
<span class="n">import</span> <span class="n">com</span><span class="p">.</span><span class="n">google</span><span class="p">.</span><span class="n">gwt</span><span class="p">.</span><span class="n">user</span><span class="p">.</span><span class="n">client</span><span class="p">.</span><span class="n">ui</span><span class="p">.</span><span class="n">Button</span><span class="p">;</span>
<span class="n">import</span> <span class="n">com</span><span class="p">.</span><span class="n">google</span><span class="p">.</span><span class="n">gwt</span><span class="p">.</span><span class="n">user</span><span class="p">.</span><span class="n">client</span><span class="p">.</span><span class="n">ui</span><span class="p">.</span><span class="n">DialogBox</span><span class="p">;</span>
<span class="n">import</span> <span class="n">com</span><span class="p">.</span><span class="n">google</span><span class="p">.</span><span class="n">gwt</span><span class="p">.</span><span class="n">user</span><span class="p">.</span><span class="n">client</span><span class="p">.</span><span class="n">ui</span><span class="p">.</span><span class="n">FlexTable</span><span class="p">;</span>
<span class="n">import</span> <span class="n">com</span><span class="p">.</span><span class="n">google</span><span class="p">.</span><span class="n">gwt</span><span class="p">.</span><span class="n">user</span><span class="p">.</span><span class="n">client</span><span class="p">.</span><span class="n">ui</span><span class="p">.</span><span class="n">ListBox</span><span class="p">;</span>
<span class="n">import</span> <span class="n">com</span><span class="p">.</span><span class="n">google</span><span class="p">.</span><span class="n">gwt</span><span class="p">.</span><span class="n">user</span><span class="p">.</span><span class="n">client</span><span class="p">.</span><span class="n">ui</span><span class="p">.</span><span class="n">Panel</span><span class="p">;</span>
<span class="n">import</span> <span class="n">com</span><span class="p">.</span><span class="n">google</span><span class="p">.</span><span class="n">gwt</span><span class="p">.</span><span class="n">user</span><span class="p">.</span><span class="n">client</span><span class="p">.</span><span class="n">ui</span><span class="p">.</span><span class="n">RootPanel</span><span class="p">;</span>
<span class="n">import</span> <span class="n">com</span><span class="p">.</span><span class="n">google</span><span class="p">.</span><span class="n">gwt</span><span class="p">.</span><span class="n">user</span><span class="p">.</span><span class="n">client</span><span class="p">.</span><span class="n">ui</span><span class="p">.</span><span class="n">TextArea</span><span class="p">;</span>
<span class="n">import</span> <span class="n">com</span><span class="p">.</span><span class="n">google</span><span class="p">.</span><span class="n">gwt</span><span class="p">.</span><span class="n">user</span><span class="p">.</span><span class="n">client</span><span class="p">.</span><span class="n">ui</span><span class="p">.</span><span class="n">TextBox</span><span class="p">;</span>
<span class="n">import</span> <span class="n">com</span><span class="p">.</span><span class="n">google</span><span class="p">.</span><span class="n">gwt</span><span class="p">.</span><span class="n">user</span><span class="p">.</span><span class="n">client</span><span class="p">.</span><span class="n">ui</span><span class="p">.</span><span class="n">VerticalPanel</span><span class="p">;</span>
<span class="p">/*</span>
<span class="p">*</span> <span class="n">Entry</span> <span class="n">point</span> <span class="n">classes</span> <span class="n">define</span> <span class="n">onModuleLoad</span><span class="p">().</span>
<span class="p">*/</span>
<span class="k">public</span> <span class="n">class</span> <span class="n">Kylewuidea</span> <span class="n">implements</span> <span class="n">EntryPoint</span> <span class="p">{</span>
<span class="n">private</span> <span class="n">FlexTable</span> <span class="n">table</span> <span class="p">=</span> <span class="n">new</span> <span class="n">FlexTable</span><span class="p">();</span>
<span class="p">/**</span>
<span class="p">*</span> <span class="n">This</span> <span class="n">is</span> <span class="n">the</span> <span class="n">entry</span> <span class="n">point</span> <span class="n">method</span><span class="p">.</span>
<span class="p">*/</span>
<span class="k">public</span> <span class="n">void</span> <span class="n">onModuleLoad</span><span class="p">()</span> <span class="p">{</span>
<span class="p">//</span> <span class="n">Initial</span> <span class="n">all</span> <span class="n">items</span><span class="p">.</span>
<span class="n">init</span><span class="p">();</span>
<span class="p">//</span> <span class="n">Add</span> <span class="n">table</span> <span class="k">to</span> <span class="n">html</span> <span class="n">page</span><span class="p">.</span>
<span class="n">RootPanel</span><span class="p">.</span><span class="n">get</span><span class="p">(</span><span class="s2">"idea"</span><span class="p">).</span><span class="n">add</span><span class="p">(</span><span class="n">createBasePanel</span><span class="p">());</span>
<span class="p">//</span> <span class="n">Initial</span> <span class="n">table</span><span class="p">.</span>
<span class="n">importFromDatabase</span><span class="p">();</span>
<span class="p">}</span>
<span class="n">private</span> <span class="n">void</span> <span class="n">init</span><span class="p">()</span> <span class="p">{</span>
<span class="p">//</span> <span class="n">TODO</span> <span class="n">Initial</span> <span class="n">table</span> <span class="n">structure</span><span class="p">.</span>
<span class="p">//</span> <span class="n">TODO</span> <span class="k">Set</span> <span class="n">table</span> <span class="n">attribute</span><span class="p">.</span>
<span class="p">}</span>
<span class="n">private</span> <span class="n">void</span> <span class="n">importFromDatabase</span><span class="p">()</span> <span class="p">{</span>
<span class="p">//</span> <span class="n">TODO</span> <span class="n">Add</span> <span class="n">initial</span> <span class="n">data</span> <span class="k">to</span> <span class="n">table</span> <span class="k">or</span> <span class="n">get</span> <span class="k">from</span> <span class="n">database</span><span class="p">.</span>
<span class="p">}</span>
<span class="n">private</span> <span class="n">Panel</span> <span class="n">createBasePanel</span><span class="p">()</span> <span class="p">{</span>
<span class="p">//</span> <span class="n">Base</span> <span class="n">Panel</span> <span class="k">of</span> <span class="n">this</span> <span class="n">project</span><span class="p">.</span>
<span class="n">VerticalPanel</span> <span class="n">mainPanel</span> <span class="p">=</span> <span class="n">new</span> <span class="n">VerticalPanel</span><span class="p">();</span>
<span class="p">//</span> <span class="n">TODO</span> <span class="n">Add</span> <span class="n">click</span> <span class="n">handler</span> <span class="k">to</span> <span class="n">add</span> <span class="n">button</span><span class="p">.</span>
<span class="p">//</span> <span class="n">TODO</span> <span class="n">Assemble</span> <span class="n">the</span> <span class="n">panel</span><span class="p">.</span>
<span class="n">return</span> <span class="n">mainPanel</span><span class="p">;</span>
<span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>
<p>onModuleLoad()方法就是程序的入口,这里我们写了一下初始化的代码。我在这里是直接写成方法了,这样看入口感觉清爽一些。</p>
<p>写Google Web Toolkit的代码与写普通Java界面很相似,在Panel里加入一些组件。这里要注意,RootPanel.get()方法得到的就是HTML页面中的某个元素,也就是我们的最上级容器。在这里我get名为idea的panel,那么它到底在什么地方呢?</p>
<p>打开war/Kylewuidea.html,删除body内除iframe的所有内容。</p>
<p>我们将一个div命名为idea,这样我们Project都会在这个div标签下,当然,你也可以get到其他的元素。</p>
<p>到这里页面中还没有任何元素,下面任务很简单了。点击添加Idea的按钮,弹出一个对话框,可以填入主题和详情等。当我们点击添加Idea的时候,一条新的Idea将显示在表格中。对于每条idea,都需要更新或者删除,功能应该不难了吧,同学们可以自己写写看。</p>
<p>Google Web Toolkit 的任务差不多了,让我们看看最后的代码。</p>
<div class="highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">package</span> <span class="n">net</span><span class="p">.</span><span class="n">kylewu</span><span class="p">.</span><span class="n">idea</span><span class="p">.</span><span class="n">client</span><span class="p">;</span>
<span class="n">import</span> <span class="n">java</span><span class="p">.</span><span class="n">util</span><span class="p">.</span><span class="n">ArrayList</span><span class="p">;</span>
<span class="n">import</span> <span class="n">java</span><span class="p">.</span><span class="n">util</span><span class="p">.</span><span class="n">HashMap</span><span class="p">;</span>
<span class="n">import</span> <span class="n">java</span><span class="p">.</span><span class="n">util</span><span class="p">.</span><span class="n">Map</span><span class="p">;</span>
<span class="n">import</span> <span class="n">net</span><span class="p">.</span><span class="n">kylewu</span><span class="p">.</span><span class="n">idea</span><span class="p">.</span><span class="n">client</span><span class="p">.</span><span class="n">service</span><span class="p">.</span><span class="n">DBWorkerService</span><span class="p">;</span>
<span class="n">import</span> <span class="n">net</span><span class="p">.</span><span class="n">kylewu</span><span class="p">.</span><span class="n">idea</span><span class="p">.</span><span class="n">client</span><span class="p">.</span><span class="n">service</span><span class="p">.</span><span class="n">DBWorkerServiceAsync</span><span class="p">;</span>
<span class="n">import</span> <span class="n">com</span><span class="p">.</span><span class="n">google</span><span class="p">.</span><span class="n">gwt</span><span class="p">.</span><span class="n">core</span><span class="p">.</span><span class="n">client</span><span class="p">.</span><span class="n">EntryPoint</span><span class="p">;</span>
<span class="n">import</span> <span class="n">com</span><span class="p">.</span><span class="n">google</span><span class="p">.</span><span class="n">gwt</span><span class="p">.</span><span class="n">core</span><span class="p">.</span><span class="n">client</span><span class="p">.</span><span class="n">GWT</span><span class="p">;</span>
<span class="n">import</span> <span class="n">com</span><span class="p">.</span><span class="n">google</span><span class="p">.</span><span class="n">gwt</span><span class="p">.</span><span class="n">event</span><span class="p">.</span><span class="n">dom</span><span class="p">.</span><span class="n">client</span><span class="p">.</span><span class="n">ClickEvent</span><span class="p">;</span>
<span class="n">import</span> <span class="n">com</span><span class="p">.</span><span class="n">google</span><span class="p">.</span><span class="n">gwt</span><span class="p">.</span><span class="n">event</span><span class="p">.</span><span class="n">dom</span><span class="p">.</span><span class="n">client</span><span class="p">.</span><span class="n">ClickHandler</span><span class="p">;</span>
<span class="n">import</span> <span class="n">com</span><span class="p">.</span><span class="n">google</span><span class="p">.</span><span class="n">gwt</span><span class="p">.</span><span class="n">user</span><span class="p">.</span><span class="n">client</span><span class="p">.</span><span class="n">rpc</span><span class="p">.</span><span class="n">AsyncCallback</span><span class="p">;</span>
<span class="n">import</span> <span class="n">com</span><span class="p">.</span><span class="n">google</span><span class="p">.</span><span class="n">gwt</span><span class="p">.</span><span class="n">user</span><span class="p">.</span><span class="n">client</span><span class="p">.</span><span class="n">ui</span><span class="p">.</span><span class="n">Button</span><span class="p">;</span>
<span class="n">import</span> <span class="n">com</span><span class="p">.</span><span class="n">google</span><span class="p">.</span><span class="n">gwt</span><span class="p">.</span><span class="n">user</span><span class="p">.</span><span class="n">client</span><span class="p">.</span><span class="n">ui</span><span class="p">.</span><span class="n">DialogBox</span><span class="p">;</span>
<span class="n">import</span> <span class="n">com</span><span class="p">.</span><span class="n">google</span><span class="p">.</span><span class="n">gwt</span><span class="p">.</span><span class="n">user</span><span class="p">.</span><span class="n">client</span><span class="p">.</span><span class="n">ui</span><span class="p">.</span><span class="n">FlexTable</span><span class="p">;</span>
<span class="n">import</span> <span class="n">com</span><span class="p">.</span><span class="n">google</span><span class="p">.</span><span class="n">gwt</span><span class="p">.</span><span class="n">user</span><span class="p">.</span><span class="n">client</span><span class="p">.</span><span class="n">ui</span><span class="p">.</span><span class="n">HasHorizontalAlignment</span><span class="p">;</span>
<span class="n">import</span> <span class="n">com</span><span class="p">.</span><span class="n">google</span><span class="p">.</span><span class="n">gwt</span><span class="p">.</span><span class="n">user</span><span class="p">.</span><span class="n">client</span><span class="p">.</span><span class="n">ui</span><span class="p">.</span><span class="n">HasVerticalAlignment</span><span class="p">;</span>
<span class="n">import</span> <span class="n">com</span><span class="p">.</span><span class="n">google</span><span class="p">.</span><span class="n">gwt</span><span class="p">.</span><span class="n">user</span><span class="p">.</span><span class="n">client</span><span class="p">.</span><span class="n">ui</span><span class="p">.</span><span class="n">HorizontalPanel</span><span class="p">;</span>
<span class="n">import</span> <span class="n">com</span><span class="p">.</span><span class="n">google</span><span class="p">.</span><span class="n">gwt</span><span class="p">.</span><span class="n">user</span><span class="p">.</span><span class="n">client</span><span class="p">.</span><span class="n">ui</span><span class="p">.</span><span class="n">ListBox</span><span class="p">;</span>
<span class="n">import</span> <span class="n">com</span><span class="p">.</span><span class="n">google</span><span class="p">.</span><span class="n">gwt</span><span class="p">.</span><span class="n">user</span><span class="p">.</span><span class="n">client</span><span class="p">.</span><span class="n">ui</span><span class="p">.</span><span class="n">Panel</span><span class="p">;</span>
<span class="n">import</span> <span class="n">com</span><span class="p">.</span><span class="n">google</span><span class="p">.</span><span class="n">gwt</span><span class="p">.</span><span class="n">user</span><span class="p">.</span><span class="n">client</span><span class="p">.</span><span class="n">ui</span><span class="p">.</span><span class="n">RootPanel</span><span class="p">;</span>
<span class="n">import</span> <span class="n">com</span><span class="p">.</span><span class="n">google</span><span class="p">.</span><span class="n">gwt</span><span class="p">.</span><span class="n">user</span><span class="p">.</span><span class="n">client</span><span class="p">.</span><span class="n">ui</span><span class="p">.</span><span class="n">TextArea</span><span class="p">;</span>
<span class="n">import</span> <span class="n">com</span><span class="p">.</span><span class="n">google</span><span class="p">.</span><span class="n">gwt</span><span class="p">.</span><span class="n">user</span><span class="p">.</span><span class="n">client</span><span class="p">.</span><span class="n">ui</span><span class="p">.</span><span class="n">TextBox</span><span class="p">;</span>
<span class="n">import</span> <span class="n">com</span><span class="p">.</span><span class="n">google</span><span class="p">.</span><span class="n">gwt</span><span class="p">.</span><span class="n">user</span><span class="p">.</span><span class="n">client</span><span class="p">.</span><span class="n">ui</span><span class="p">.</span><span class="n">VerticalPanel</span><span class="p">;</span>
<span class="p">/*</span>
<span class="p">*</span> <span class="n">Entry</span> <span class="n">point</span> <span class="n">classes</span> <span class="n">define</span> <span class="n">onModuleLoad</span><span class="p">().</span>
<span class="p">*/</span>
<span class="k">public</span> <span class="n">class</span> <span class="n">Kylewuidea</span> <span class="n">implements</span> <span class="n">EntryPoint</span> <span class="p">{</span>
<span class="n">private</span> <span class="n">final</span> <span class="n">int</span> <span class="n">COL_ID</span> <span class="p">=</span> <span class="m">0</span><span class="p">;</span>
<span class="n">private</span> <span class="n">final</span> <span class="n">int</span> <span class="n">COL_SUBJECT</span> <span class="p">=</span> <span class="m">1</span><span class="p">;</span>
<span class="n">private</span> <span class="n">final</span> <span class="n">int</span> <span class="n">COL_DETAIL</span> <span class="p">=</span> <span class="m">2</span><span class="p">;</span>
<span class="n">private</span> <span class="n">final</span> <span class="n">int</span> <span class="n">COL_PROGRESS</span> <span class="p">=</span> <span class="m">3</span><span class="p">;</span>
<span class="n">private</span> <span class="n">final</span> <span class="n">int</span> <span class="n">COL_TIME</span> <span class="p">=</span> <span class="m">4</span><span class="p">;</span>
<span class="n">private</span> <span class="n">final</span> <span class="n">int</span> <span class="n">COL_OPERATION</span> <span class="p">=</span> <span class="m">5</span><span class="p">;</span>
<span class="n">private</span> <span class="n">FlexTable</span> <span class="n">table</span> <span class="p">=</span> <span class="n">new</span> <span class="n">FlexTable</span><span class="p">();</span>
<span class="n">private</span> <span class="n">ArrayList</span> <span class="n">subjectList</span> <span class="p">=</span> <span class="n">new</span> <span class="n">ArrayList</span><span class="p">();</span>
<span class="n">private</span> <span class="n">Map</span> <span class="n">mapStrToInt</span> <span class="p">=</span> <span class="n">new</span> <span class="n">HashMap</span><span class="p">();</span>
<span class="n">private</span> <span class="n">Map</span> <span class="n">mapIntToStr</span> <span class="p">=</span> <span class="n">new</span> <span class="n">HashMap</span><span class="p">();</span>
<span class="p">/**</span>
<span class="p">*</span> <span class="n">This</span> <span class="n">is</span> <span class="n">the</span> <span class="n">entry</span> <span class="n">point</span> <span class="n">method</span><span class="p">.</span>
<span class="p">*/</span>
<span class="k">public</span> <span class="n">void</span> <span class="n">onModuleLoad</span><span class="p">()</span> <span class="p">{</span>
<span class="p">//</span> <span class="n">Initial</span> <span class="n">all</span> <span class="n">items</span><span class="p">.</span>
<span class="n">init</span><span class="p">();</span>
<span class="p">//</span> <span class="n">Add</span> <span class="n">table</span> <span class="k">to</span> <span class="n">html</span> <span class="n">page</span><span class="p">.</span>
<span class="n">RootPanel</span><span class="p">.</span><span class="n">get</span><span class="p">(</span><span class="s2">"ideastorm"</span><span class="p">).</span><span class="n">add</span><span class="p">(</span><span class="n">createBasePanel</span><span class="p">());</span>
<span class="p">//</span> <span class="n">Initial</span> <span class="n">table</span><span class="p">.</span>
<span class="n">importFromDatabase</span><span class="p">();</span>
<span class="p">}</span>
<span class="n">private</span> <span class="n">void</span> <span class="n">init</span><span class="p">()</span> <span class="p">{</span>
<span class="n">mapStrToInt</span><span class="p">.</span><span class="n">put</span><span class="p">(</span><span class="s2">"0%"</span><span class="p">,</span> <span class="m">0</span><span class="p">);</span>
<span class="n">mapStrToInt</span><span class="p">.</span><span class="n">put</span><span class="p">(</span><span class="s2">"25%"</span><span class="p">,</span> <span class="m">1</span><span class="p">);</span>
<span class="n">mapStrToInt</span><span class="p">.</span><span class="n">put</span><span class="p">(</span><span class="s2">"50%"</span><span class="p">,</span> <span class="m">2</span><span class="p">);</span>
<span class="n">mapStrToInt</span><span class="p">.</span><span class="n">put</span><span class="p">(</span><span class="s2">"75%"</span><span class="p">,</span> <span class="m">3</span><span class="p">);</span>
<span class="n">mapStrToInt</span><span class="p">.</span><span class="n">put</span><span class="p">(</span><span class="s2">"100%"</span><span class="p">,</span> <span class="m">4</span><span class="p">);</span>
<span class="n">mapIntToStr</span><span class="p">.</span><span class="n">put</span><span class="p">(</span><span class="m">0</span><span class="p">,</span> <span class="s2">"0%"</span><span class="p">);</span>
<span class="n">mapIntToStr</span><span class="p">.</span><span class="n">put</span><span class="p">(</span><span class="m">1</span><span class="p">,</span> <span class="s2">"25%"</span><span class="p">);</span>
<span class="n">mapIntToStr</span><span class="p">.</span><span class="n">put</span><span class="p">(</span><span class="m">2</span><span class="p">,</span> <span class="s2">"50%"</span><span class="p">);</span>
<span class="n">mapIntToStr</span><span class="p">.</span><span class="n">put</span><span class="p">(</span><span class="m">3</span><span class="p">,</span> <span class="s2">"75"</span><span class="p">);</span>
<span class="n">mapIntToStr</span><span class="p">.</span><span class="n">put</span><span class="p">(</span><span class="m">4</span><span class="p">,</span> <span class="s2">"100%"</span><span class="p">);</span>
<span class="p">//</span> <span class="n">Initial</span> <span class="n">table</span> <span class="n">structure</span><span class="p">.</span>
<span class="n">table</span><span class="p">.</span><span class="n">setText</span><span class="p">(</span><span class="m">0</span><span class="p">,</span> <span class="n">COL_ID</span><span class="p">,</span> <span class="s2">"ID"</span><span class="p">);</span>
<span class="n">table</span><span class="p">.</span><span class="n">setText</span><span class="p">(</span><span class="m">0</span><span class="p">,</span> <span class="n">COL_SUBJECT</span><span class="p">,</span> <span class="s2">"Subject"</span><span class="p">);</span>
<span class="n">table</span><span class="p">.</span><span class="n">setText</span><span class="p">(</span><span class="m">0</span><span class="p">,</span> <span class="n">COL_DETAIL</span><span class="p">,</span> <span class="s2">"Detail"</span><span class="p">);</span>
<span class="n">table</span><span class="p">.</span><span class="n">setText</span><span class="p">(</span><span class="m">0</span><span class="p">,</span> <span class="n">COL_PROGRESS</span><span class="p">,</span> <span class="s2">"Progress"</span><span class="p">);</span>
<span class="n">table</span><span class="p">.</span><span class="n">setText</span><span class="p">(</span><span class="m">0</span><span class="p">,</span> <span class="n">COL_OPERATION</span><span class="p">,</span> <span class="s2">"Operation"</span><span class="p">);</span>
<span class="n">table</span><span class="p">.</span><span class="n">setText</span><span class="p">(</span><span class="m">0</span><span class="p">,</span> <span class="n">COL_TIME</span><span class="p">,</span> <span class="s2">"Time"</span><span class="p">);</span>
<span class="p">//</span> <span class="k">Set</span> <span class="n">table</span> <span class="n">attribute</span><span class="p">.</span>
<span class="n">table</span><span class="p">.</span><span class="n">setCellPadding</span><span class="p">(</span><span class="m">5</span><span class="p">);</span>
<span class="n">table</span><span class="p">.</span><span class="n">getColumnFormatter</span><span class="p">().</span><span class="n">setWidth</span><span class="p">(</span><span class="m">0</span><span class="p">,</span> <span class="s2">"10"</span><span class="p">);</span>
<span class="n">table</span><span class="p">.</span><span class="n">getColumnFormatter</span><span class="p">().</span><span class="n">setWidth</span><span class="p">(</span><span class="m">1</span><span class="p">,</span> <span class="s2">"200"</span><span class="p">);</span>
<span class="n">table</span><span class="p">.</span><span class="n">getColumnFormatter</span><span class="p">().</span><span class="n">setWidth</span><span class="p">(</span><span class="m">2</span><span class="p">,</span> <span class="s2">"400"</span><span class="p">);</span>
<span class="n">table</span><span class="p">.</span><span class="n">getColumnFormatter</span><span class="p">().</span><span class="n">setWidth</span><span class="p">(</span><span class="m">3</span><span class="p">,</span> <span class="s2">"150"</span><span class="p">);</span>
<span class="n">table</span><span class="p">.</span><span class="n">getColumnFormatter</span><span class="p">().</span><span class="n">setWidth</span><span class="p">(</span><span class="m">4</span><span class="p">,</span> <span class="s2">"100"</span><span class="p">);</span>
<span class="p">}</span>
<span class="p">/**</span>
<span class="p">*</span> <span class="n">Initial</span> <span class="n">table</span> <span class="n">data</span>
<span class="p">*/</span>
<span class="n">private</span> <span class="n">void</span> <span class="n">importFromDatabase</span><span class="p">()</span> <span class="p">{</span>
<span class="p">//</span> <span class="n">Get</span> <span class="n">exist</span> <span class="n">ideas</span> <span class="k">from</span> <span class="n">db</span>
<span class="p">}</span>
<span class="p">/**</span>
<span class="p">*</span> <span class="n">Create</span> <span class="n">base</span> <span class="n">panel</span>
<span class="p">*</span>
<span class="p">*</span> <span class="p">@</span><span class="n">return</span>
<span class="p">*/</span>
<span class="n">private</span> <span class="n">Panel</span> <span class="n">createBasePanel</span><span class="p">()</span> <span class="p">{</span>
<span class="p">//</span> <span class="n">Base</span> <span class="n">Panel</span> <span class="k">of</span> <span class="n">this</span> <span class="n">project</span><span class="p">.</span>
<span class="n">VerticalPanel</span> <span class="n">mainPanel</span> <span class="p">=</span> <span class="n">new</span> <span class="n">VerticalPanel</span><span class="p">();</span>
<span class="n">Button</span> <span class="n">btnAdd</span> <span class="p">=</span> <span class="n">new</span> <span class="n">Button</span><span class="p">(</span><span class="s2">"Add Idea"</span><span class="p">);</span>
<span class="p">//</span> <span class="n">Add</span> <span class="n">click</span> <span class="n">handler</span> <span class="k">to</span> <span class="n">add</span> <span class="n">button</span><span class="p">.</span>
<span class="n">btnAdd</span><span class="p">.</span><span class="n">addClickHandler</span><span class="p">(</span><span class="n">new</span> <span class="n">ClickHandler</span><span class="p">()</span> <span class="p">{</span>
<span class="k">public</span> <span class="n">void</span> <span class="n">onClick</span><span class="p">(</span><span class="n">ClickEvent</span> <span class="n">event</span><span class="p">)</span> <span class="p">{</span>
<span class="p">//</span> <span class="n">Show</span> <span class="n">Add</span> <span class="n">Idea</span> <span class="n">Dialog</span>
<span class="n">showIdeaEditDialog</span><span class="p">(</span><span class="nb">true</span><span class="p">,</span> <span class="p">-</span><span class="m">1</span><span class="p">);</span>
<span class="p">}</span>
<span class="p">});</span>
<span class="p">//</span> <span class="n">Assemble</span> <span class="n">the</span> <span class="n">panel</span><span class="p">.</span>
<span class="n">mainPanel</span><span class="p">.</span><span class="n">setHorizontalAlignment</span><span class="p">(</span><span class="n">HasHorizontalAlignment</span><span class="p">.</span><span class="n">ALIGN_CENTER</span><span class="p">);</span>
<span class="n">mainPanel</span><span class="p">.</span><span class="n">add</span><span class="p">(</span><span class="n">table</span><span class="p">);</span>
<span class="n">mainPanel</span><span class="p">.</span><span class="n">add</span><span class="p">(</span><span class="n">btnAdd</span><span class="p">);</span>
<span class="n">return</span> <span class="n">mainPanel</span><span class="p">;</span>
<span class="p">}</span>
<span class="p">/**</span>
<span class="p">*</span> <span class="n">Show</span> <span class="n">Add</span> <span class="n">Idea</span> <span class="n">Dialog</span>
<span class="p">*/</span>
<span class="n">private</span> <span class="n">void</span> <span class="n">showIdeaEditDialog</span><span class="p">(</span><span class="n">final</span> <span class="k">boolean</span> <span class="n">isNew</span><span class="p">,</span> <span class="n">final</span> <span class="n">int</span> <span class="n">index</span><span class="p">)</span> <span class="p">{</span>
<span class="p">//</span> <span class="n">Initial</span> <span class="n">Add</span> <span class="n">Idea</span> <span class="n">Dialog</span><span class="p">.</span>
<span class="n">final</span> <span class="n">DialogBox</span> <span class="n">dialog</span> <span class="p">=</span> <span class="n">new</span> <span class="n">DialogBox</span><span class="p">();</span>
<span class="n">final</span> <span class="n">TextBox</span> <span class="n">txtBoxSubject</span> <span class="p">=</span> <span class="n">new</span> <span class="n">TextBox</span><span class="p">();</span>
<span class="n">final</span> <span class="n">TextArea</span> <span class="n">txtAreaDetail</span> <span class="p">=</span> <span class="n">new</span> <span class="n">TextArea</span><span class="p">();</span>
<span class="n">final</span> <span class="n">ListBox</span> <span class="n">listBox</span> <span class="p">=</span> <span class="n">new</span> <span class="n">ListBox</span><span class="p">();</span>
<span class="n">VerticalPanel</span> <span class="n">dialogPanel</span> <span class="p">=</span> <span class="n">new</span> <span class="n">VerticalPanel</span><span class="p">();</span>
<span class="n">HorizontalPanel</span> <span class="n">itemPanel</span> <span class="p">=</span> <span class="n">new</span> <span class="n">HorizontalPanel</span><span class="p">();</span>
<span class="n">Button</span> <span class="n">btnInsert</span> <span class="p">=</span> <span class="n">new</span> <span class="n">Button</span><span class="p">();</span>
<span class="n">Button</span> <span class="n">btnClose</span> <span class="p">=</span> <span class="n">new</span> <span class="n">Button</span><span class="p">(</span><span class="s2">"Close"</span><span class="p">);</span>
<span class="p">//</span> <span class="k">Set</span> <span class="n">attribute</span><span class="p">.</span>
<span class="n">dialog</span><span class="p">.</span><span class="n">setText</span><span class="p">(</span><span class="s2">"Input your idea"</span><span class="p">);</span>
<span class="n">dialog</span><span class="p">.</span><span class="n">setAnimationEnabled</span><span class="p">(</span><span class="nb">true</span><span class="p">);</span>
<span class="n">txtAreaDetail</span><span class="p">.</span><span class="n">setSize</span><span class="p">(</span><span class="s2">"300"</span><span class="p">,</span> <span class="s2">"380"</span><span class="p">);</span>
<span class="n">listBox</span><span class="p">.</span><span class="n">clear</span><span class="p">();</span>
<span class="n">listBox</span><span class="p">.</span><span class="n">addItem</span><span class="p">(</span><span class="s2">"0%"</span><span class="p">);</span>
<span class="n">listBox</span><span class="p">.</span><span class="n">addItem</span><span class="p">(</span><span class="s2">"25%"</span><span class="p">);</span>
<span class="n">listBox</span><span class="p">.</span><span class="n">addItem</span><span class="p">(</span><span class="s2">"50%"</span><span class="p">);</span>
<span class="n">listBox</span><span class="p">.</span><span class="n">addItem</span><span class="p">(</span><span class="s2">"75%"</span><span class="p">);</span>
<span class="n">listBox</span><span class="p">.</span><span class="n">addItem</span><span class="p">(</span><span class="s2">"100%"</span><span class="p">);</span>
<span class="n">listBox</span><span class="p">.</span><span class="n">setVisibleItemCount</span><span class="p">(</span><span class="m">5</span><span class="p">);</span>
<span class="k">if</span> <span class="p">(</span><span class="n">isNew</span><span class="p">)</span> <span class="p">{</span>
<span class="n">btnInsert</span><span class="p">.</span><span class="n">setText</span><span class="p">(</span><span class="s2">"Insert"</span><span class="p">);</span>
<span class="n">txtBoxSubject</span><span class="p">.</span><span class="n">setText</span><span class="p">(</span><span class="s2">"Input your indea"</span><span class="p">);</span>
<span class="n">listBox</span><span class="p">.</span><span class="n">setSelectedIndex</span><span class="p">(</span><span class="m">0</span><span class="p">);</span>
<span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
<span class="n">btnInsert</span><span class="p">.</span><span class="n">setText</span><span class="p">(</span><span class="s2">"Update"</span><span class="p">);</span>
<span class="n">txtBoxSubject</span><span class="p">.</span><span class="n">setText</span><span class="p">(</span><span class="n">table</span><span class="p">.</span><span class="n">getText</span><span class="p">(</span><span class="n">index</span><span class="p">,</span> <span class="n">COL_SUBJECT</span><span class="p">));</span>
<span class="n">txtAreaDetail</span><span class="p">.</span><span class="n">setText</span><span class="p">(</span><span class="n">table</span><span class="p">.</span><span class="n">getText</span><span class="p">(</span><span class="n">index</span><span class="p">,</span> <span class="n">COL_DETAIL</span><span class="p">));</span>
<span class="n">listBox</span><span class="p">.</span><span class="n">setSelectedIndex</span><span class="p">(</span><span class="n">mapStrToInt</span><span class="p">.</span><span class="n">get</span><span class="p">(</span><span class="n">table</span><span class="p">.</span><span class="n">getText</span><span class="p">(</span><span class="n">index</span><span class="p">,</span>
<span class="n">COL_PROGRESS</span><span class="p">)));</span>
<span class="k">if</span> <span class="p">(</span><span class="n">table</span><span class="p">.</span><span class="n">getText</span><span class="p">(</span><span class="n">index</span><span class="p">,</span> <span class="n">COL_PROGRESS</span><span class="p">).</span><span class="n">compareTo</span><span class="p">(</span><span class="s2">"100%"</span><span class="p">)</span> <span class="p">==</span> <span class="m">0</span> <span class="p">)</span>
<span class="n">listBox</span><span class="p">.</span><span class="n">setEnabled</span><span class="p">(</span><span class="nb">false</span><span class="p">);</span>
<span class="p">}</span>
<span class="p">//</span> <span class="n">Add</span> <span class="n">ClickHandler</span> <span class="k">to</span> <span class="n">Insert</span> <span class="n">button</span>
<span class="n">btnInsert</span><span class="p">.</span><span class="n">addClickHandler</span><span class="p">(</span><span class="n">new</span> <span class="n">ClickHandler</span><span class="p">()</span> <span class="p">{</span>
<span class="k">public</span> <span class="n">void</span> <span class="n">onClick</span><span class="p">(</span><span class="n">ClickEvent</span> <span class="n">event</span><span class="p">)</span> <span class="p">{</span>
<span class="p">//</span> <span class="n">Check</span> <span class="n">empty</span>
<span class="k">if</span> <span class="p">(</span><span class="n">txtBoxSubject</span><span class="p">.</span><span class="n">getText</span><span class="p">().</span><span class="n">length</span><span class="p">()</span> <span class="p">==</span> <span class="m">0</span>
<span class="p">||</span> <span class="n">txtAreaDetail</span><span class="p">.</span><span class="n">getText</span><span class="p">().</span><span class="n">length</span><span class="p">()</span> <span class="p">==</span> <span class="m">0</span><span class="p">)</span>
<span class="n">return</span><span class="p">;</span>
<span class="p">//</span> <span class="n">Check</span> <span class="n">exist</span>
<span class="k">if</span> <span class="p">(</span><span class="n">subjectList</span><span class="p">.</span><span class="n">contains</span><span class="p">(</span><span class="n">txtBoxSubject</span><span class="p">.</span><span class="n">getText</span><span class="p">())</span> <span class="p">==</span> <span class="nb">true</span>
<span class="p">&&</span> <span class="n">isNew</span><span class="p">)</span> <span class="p">{</span>
<span class="n">return</span><span class="p">;</span>
<span class="p">}</span>
<span class="n">insertIdeaIntoTable</span><span class="p">(</span><span class="n">index</span><span class="p">,</span> <span class="s2">""</span><span class="p">,</span> <span class="n">txtBoxSubject</span><span class="p">.</span><span class="n">getText</span><span class="p">(),</span> <span class="n">txtAreaDetail</span><span class="p">.</span><span class="n">getText</span><span class="p">(),</span>
<span class="n">mapIntToStr</span><span class="p">.</span><span class="n">get</span><span class="p">(</span><span class="n">listBox</span><span class="p">.</span><span class="n">getSelectedIndex</span><span class="p">()),</span> <span class="s2">""</span><span class="p">);</span>
<span class="n">dialog</span><span class="p">.</span><span class="n">hide</span><span class="p">();</span>
<span class="p">}</span>
<span class="p">});</span>
<span class="p">//</span> <span class="n">Add</span> <span class="n">ClickHandler</span> <span class="k">to</span> <span class="n">Close</span> <span class="n">button</span>
<span class="n">btnClose</span><span class="p">.</span><span class="n">addClickHandler</span><span class="p">(</span><span class="n">new</span> <span class="n">ClickHandler</span><span class="p">()</span> <span class="p">{</span>
<span class="k">public</span> <span class="n">void</span> <span class="n">onClick</span><span class="p">(</span><span class="n">ClickEvent</span> <span class="n">event</span><span class="p">)</span> <span class="p">{</span>
<span class="n">dialog</span><span class="p">.</span><span class="n">hide</span><span class="p">();</span>
<span class="p">}</span>
<span class="p">});</span>
<span class="p">//</span> <span class="n">Assemble</span> <span class="n">dialog</span> <span class="n">panel</span><span class="p">.</span>
<span class="n">itemPanel</span><span class="p">.</span><span class="n">setWidth</span><span class="p">(</span><span class="s2">"100%"</span><span class="p">);</span>
<span class="n">itemPanel</span><span class="p">.</span><span class="n">setVerticalAlignment</span><span class="p">(</span><span class="n">HasVerticalAlignment</span><span class="p">.</span><span class="n">ALIGN_MIDDLE</span><span class="p">);</span>
<span class="n">itemPanel</span><span class="p">.</span><span class="n">add</span><span class="p">(</span><span class="n">listBox</span><span class="p">);</span>
<span class="n">itemPanel</span><span class="p">.</span><span class="n">add</span><span class="p">(</span><span class="n">btnInsert</span><span class="p">);</span>
<span class="n">itemPanel</span><span class="p">.</span><span class="n">add</span><span class="p">(</span><span class="n">btnClose</span><span class="p">);</span>
<span class="n">dialogPanel</span><span class="p">.</span><span class="n">add</span><span class="p">(</span><span class="n">txtBoxSubject</span><span class="p">);</span>
<span class="n">dialogPanel</span><span class="p">.</span><span class="n">add</span><span class="p">(</span><span class="n">txtAreaDetail</span><span class="p">);</span>
<span class="n">dialogPanel</span><span class="p">.</span><span class="n">add</span><span class="p">(</span><span class="n">itemPanel</span><span class="p">);</span>
<span class="p">//</span> <span class="n">Associate</span> <span class="n">the</span> <span class="n">dialog</span> <span class="k">with</span> <span class="n">the</span> <span class="n">panel</span><span class="p">.</span>
<span class="n">dialog</span><span class="p">.</span><span class="n">setWidget</span><span class="p">(</span><span class="n">dialogPanel</span><span class="p">);</span>
<span class="p">//</span> <span class="n">Show</span> <span class="n">dialog</span><span class="p">.</span>
<span class="n">dialog</span><span class="p">.</span><span class="n">center</span><span class="p">();</span>
<span class="p">}</span>
<span class="n">private</span> <span class="n">void</span> <span class="n">insertIdeaIntoTable</span><span class="p">(</span><span class="n">int</span> <span class="n">index</span><span class="p">,</span> <span class="n">final</span> <span class="k">String</span> <span class="n">id</span><span class="p">,</span>
<span class="n">final</span> <span class="k">String</span> <span class="n">subject</span><span class="p">,</span> <span class="k">String</span> <span class="n">detail</span><span class="p">,</span> <span class="k">String</span> <span class="n">progress</span><span class="p">,</span> <span class="k">String</span> <span class="n">date</span><span class="p">)</span> <span class="p">{</span>
<span class="p">//</span>
<span class="k">if</span> <span class="p">(</span><span class="n">index</span> <span class="p">==</span> <span class="p">-</span><span class="m">1</span><span class="p">)</span> <span class="p">{</span>
<span class="n">index</span> <span class="p">=</span> <span class="n">table</span><span class="p">.</span><span class="n">getRowCount</span><span class="p">();</span>
<span class="n">subjectList</span><span class="p">.</span><span class="n">add</span><span class="p">(</span><span class="n">subject</span><span class="p">);</span>
<span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
<span class="n">subjectList</span><span class="p">.</span><span class="k">set</span><span class="p">(</span><span class="n">index</span> <span class="p">-</span> <span class="m">1</span><span class="p">,</span> <span class="n">subject</span><span class="p">);</span>
<span class="p">}</span>
<span class="n">HorizontalPanel</span> <span class="n">panel</span> <span class="p">=</span> <span class="n">new</span> <span class="n">HorizontalPanel</span><span class="p">();</span>
<span class="n">Button</span> <span class="n">btnUpdate</span> <span class="p">=</span> <span class="n">new</span> <span class="n">Button</span><span class="p">(</span><span class="s2">"Update"</span><span class="p">);</span>
<span class="n">Button</span> <span class="n">btnRemove</span> <span class="p">=</span> <span class="n">new</span> <span class="n">Button</span><span class="p">(</span><span class="s2">"Remove"</span><span class="p">);</span>
<span class="p">//</span> <span class="n">Add</span> <span class="n">handler</span> <span class="k">to</span> <span class="n">buttons</span>
<span class="n">btnUpdate</span><span class="p">.</span><span class="n">addClickHandler</span><span class="p">(</span><span class="n">new</span> <span class="n">ClickHandler</span><span class="p">()</span> <span class="p">{</span>
<span class="p">@</span><span class="n">Override</span>
<span class="k">public</span> <span class="n">void</span> <span class="n">onClick</span><span class="p">(</span><span class="n">ClickEvent</span> <span class="n">event</span><span class="p">)</span> <span class="p">{</span>
<span class="n">int</span> <span class="n">i</span> <span class="p">=</span> <span class="n">subjectList</span><span class="p">.</span><span class="n">indexOf</span><span class="p">(</span><span class="n">subject</span><span class="p">);</span>
<span class="n">showIdeaEditDialog</span><span class="p">(</span><span class="nb">false</span><span class="p">,</span> <span class="n">i</span> <span class="p">+</span> <span class="m">1</span><span class="p">);</span>
<span class="p">}</span>
<span class="p">});</span>
<span class="n">btnRemove</span><span class="p">.</span><span class="n">addClickHandler</span><span class="p">(</span><span class="n">new</span> <span class="n">ClickHandler</span><span class="p">()</span> <span class="p">{</span>
<span class="p">@</span><span class="n">Override</span>
<span class="k">public</span> <span class="n">void</span> <span class="n">onClick</span><span class="p">(</span><span class="n">ClickEvent</span> <span class="n">event</span><span class="p">)</span> <span class="p">{</span>
<span class="p">//</span> <span class="n">Remove</span>
<span class="p">}</span>
<span class="p">});</span>
<span class="n">panel</span><span class="p">.</span><span class="n">add</span><span class="p">(</span><span class="n">btnUpdate</span><span class="p">);</span>
<span class="n">panel</span><span class="p">.</span><span class="n">add</span><span class="p">(</span><span class="n">btnRemove</span><span class="p">);</span>
<span class="n">table</span><span class="p">.</span><span class="n">setWidget</span><span class="p">(</span><span class="n">index</span><span class="p">,</span> <span class="n">COL_OPERATION</span><span class="p">,</span> <span class="n">panel</span><span class="p">);</span>
<span class="n">table</span><span class="p">.</span><span class="n">setText</span><span class="p">(</span><span class="n">index</span><span class="p">,</span> <span class="n">COL_ID</span><span class="p">,</span> <span class="n">id</span><span class="p">);</span>
<span class="n">table</span><span class="p">.</span><span class="n">setText</span><span class="p">(</span><span class="n">index</span><span class="p">,</span> <span class="n">COL_SUBJECT</span><span class="p">,</span> <span class="n">subject</span><span class="p">);</span>
<span class="n">table</span><span class="p">.</span><span class="n">setText</span><span class="p">(</span><span class="n">index</span><span class="p">,</span> <span class="n">COL_DETAIL</span><span class="p">,</span> <span class="n">detail</span><span class="p">);</span>
<span class="n">table</span><span class="p">.</span><span class="n">setText</span><span class="p">(</span><span class="n">index</span><span class="p">,</span> <span class="n">COL_PROGRESS</span><span class="p">,</span> <span class="n">progress</span><span class="p">);</span>
<span class="k">if</span> <span class="p">(</span><span class="n">progress</span><span class="p">.</span><span class="n">compareTo</span><span class="p">(</span><span class="s2">"100%"</span><span class="p">)</span> <span class="p">==</span> <span class="m">0</span> <span class="p">&&</span> <span class="n">table</span><span class="p">.</span><span class="n">getText</span><span class="p">(</span><span class="n">index</span><span class="p">,</span> <span class="n">COL_TIME</span><span class="p">).</span><span class="n">length</span><span class="p">()</span> <span class="p">==</span> <span class="m">0</span><span class="p">)</span> <span class="p">{</span>
<span class="n">table</span><span class="p">.</span><span class="n">setText</span><span class="p">(</span><span class="n">index</span><span class="p">,</span> <span class="n">COL_TIME</span><span class="p">,</span> <span class="n">date</span><span class="p">);</span>
<span class="p">}</span>
<span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>
<p>好奇的同学肯定会问,光写Google Web Toolkit 的东西了,怎么不见Google App Engine 呢?呵呵,不要着急,休息,休息一下:)</p>
<p>在下一篇里将介绍Google App Engine 在我们这个应用里如何帮助诸位同学把idea存储起来。</p>
Google Web Toolkit 和 Google App Engine 综合教程 启蒙篇
2009-04-14T22:00:00+00:00
http://wenbinwu.com/%E7%BC%96%E7%A8%8B%E6%8A%80%E6%9C%AF/2009/04/14/google-web-toolkit-google-app-engine-start
<h2 id="什么是google-web-toolkit-和-google-app-engine">什么是Google Web Toolkit 和 Google App Engine?</h2>
<blockquote>
<p>Google Web Toolkit : 如今,编写网络应用程序是一个单调乏味且易于出错的过程。开发人员可能要花费 90% 的时间来处理浏览器行话。此外,构建、重复使用以及维护大量 JavaScript 代码库和 AJAX 组件可能困难且不可靠。Google Web 工具包 (GWT) 通过允许开发人员用 Java 编程语言快速构建和维护复杂但高性能的 JavaScript 前端应用程序来减轻该负担。
Google App Engine : Google App Engine 使您可以在支持 Google 应用程序的同一可扩展系统上构建网络应用程序。</p>
</blockquote>
<p>上面是直接摘自<a href="http://code.google.com/intl/zh-CN/webtoolkit/">Google Web Toolkit</a> 和 <a href="http://code.google.com/intl/zh-CN/appengine/">Google App Engine</a> 的主页。总的来说,前者提供一个用Java编写Javascript的工具,后者提供一个网络平台,用户可以在上面搭建自己的应用。</p>
<h2 id="为什么要使用google-web-toolkit-和-google-app-engine">为什么要使用Google Web Toolkit 和 Google App Engine?</h2>
<p>首先,如Google一贯作风,两者都是免费的,是code.google.com下的项目。
其次,Google App Engine开始支持Java,这样,两个工具在一起使用更加方便了。
当然,熟悉了Google Web Toolkit有助于开发JavaScript,了解Google App Engine可以在网上搭建自己的应用。
最后,学习新技术是提升自己的途径,能够开阔自己的眼界,锻炼自己的思想。</p>
<h2 id="如何获得google-web-toolkit-和-google-app-engine">如何获得Google Web Toolkit 和 Google App Engine?</h2>
<p>我推荐最简单的方法就是去下载Eclipse插件。具体的方法请Google或者baidu,有空的话我会再写一篇介绍的文章。</p>
<h2 id="如何使用google-web-toolkit-和-google-app-engine">如何使用Google Web Toolkit 和 Google App Engine?</h2>
<p><a href="http://code.google.com/intl/zh-CN/webtoolkit/">Google Web Toolkit</a> 和 <a href="http://code.google.com/intl/zh-CN/appengine/">Google App Engine</a> 都有各自的教程,喜欢看的可以看一下。当然在这里就不是仅仅翻译一下教程了,我将带领大家来构建一个<a href="http://code.google.com/intl/zh-CN/webtoolkit/">Google Web Toolkit</a> 和 <a href="http://code.google.com/intl/zh-CN/appengine/">Google App Engine</a> 整合的应用。</p>
<p>最近我总是有一些想法或者创意,可总是没时间实现,这样时间一长,就忘记了,所以我想写一个列表,这样,每当我有新的想法,那么我就可以记录下来,以后就可以回顾,看看自己都想了什么都做了什么</p>
<p>上面就是我问什么做这个应用的原因,东西十分的简单,其实主要还是希望能够与大家一同入门,熟悉<a href="http://code.google.com/intl/zh-CN/webtoolkit/">Google Web Toolkit</a> 和 <a href="http://code.google.com/intl/zh-CN/appengine/">Google App Engine</a> 的开发。</p>
<p>好了废话不多说了,开始吧,这个教程最终的结果见<a href="http://kylewuidea.appspot.com/" title="kylewu">这里</a>。</p>
serialVersionUID
2009-04-13T22:00:00+00:00
http://wenbinwu.com/%E7%BC%96%E7%A8%8B%E6%8A%80%E6%9C%AF/2009/04/13/serialversionuid
<h2 id="what-is-serialversionuid">What is serialVersionUID?</h2>
<p>serialVersionUID是Serializable类的验证器。也就是说,在序列化时,通过判断serialVersionUID来验证版本的一致性。如果没有匹配,将会抛出<a href="http://java.sun.com/javase/6/docs/api/java/io/InvalidClassException.html">InvalidClassException</a>异常。</p>
<h2 id="guidelines-for-serialversionuid">Guidelines for serialVersionUID</h2>
<p>serialVersionUID的几条注意事项</p>
<ul>
<li>在类中要加入serialVersionUID字段,即使这是该类的第一个版本</li>
<li>在未来的版本中不要去修改serialVersionUID的值,除非你了解修改以后将导致新旧版本不兼容</li>
<li>即使保持serialVersionUID的值不变,序列化类的新版本也有可能与旧版本不兼容</li>
</ul>
<h2 id="generate-serialversionuid-using-eclipse">Generate serialVersionUID using Eclipse</h2>
<p><img src="/assets/3440486099_d67cb84e27_o.png" alt="" /></p>
<p>这里有两种添加方式:
默认的serialVersionUID和生成serialVersionUID。
选择默认的话将设为<code class="highlighter-rouge">private static final long serialVersionUID = 1L;</code>
而生成的话将生成一个随机值(其实是根据类名、接口名、成员方法及属性等来生成一个64位的哈希字段)</p>
<h2 id="summary">Summary</h2>
<p>Java序列化是一个简单而又高深的部分,在实践中要慢慢学习。</p>
GMail Tasks 在GMail中管理你的任务
2009-04-12T22:00:00+00:00
http://wenbinwu.com/%E4%BA%92%E8%81%94%E7%BD%91/2009/04/12/gmail-tasks
<h2 id="what-is-gmail-tasks">What is GMail Tasks?</h2>
<p>GTD已经为人所熟知,通过GTD能够让我们高效的完成任务。<a href="http://www.rememberthemilk.com/">Remember The Milk</a>, <a href="https://www.google.com/calendar">Google Canlendar</a>都拥有相当大的使用人群。GMail Tasks是一个轻量级的Todo List,是GMail Labs的产品。</p>
<h2 id="how-to-get-gmail-tasks">How to get GMail Tasks?</h2>
<p>GMail Tasks作为GMail Labs的产品,当然是在Labs里启用。进入GMail,点击页面右上方的Settings,在Labs标签就可以找到Tasks。</p>
<p><img src="/assets/3438182852_436c9c143c_o.png" alt="GMail Tasks" /></p>
<p>启动Tasks就可以了。这时候在SideBar里就出现了Tasks选项。</p>
<p><img src="/assets/3438183672_c7debb188a_o.png" alt="GMail Tasks" /></p>
<h2 id="how-to-use-gmail-tasks">How to use GMail Tasks?</h2>
<p>让我们看看Tasks的真面目,点击Tasks连接。</p>
<p><img src="/assets/3438184910_8cd12b916d_o.png" alt="GMail Tasks" /></p>
<p>很简洁是不是?但是功能可不弱。可以对Task进行分级,如上图。如果完成了First Task,点击一下First Task左边的方框,看看出现了什么结果。</p>
<p><img src="/assets/3437374727_6c82850820_o.png" alt="GMail Tasks" /></p>
<p>哈哈,First Task下的所有task都被自动选成完成,很贴心很方便啊。</p>
<p>左下角的Actions中是几个针对task的功能。</p>
<blockquote>
<p>缩进 : Tab</p>
<p>撤销缩进 : Shift+Tab</p>
<p>向上移动 : Ctrl+Up</p>
<p>先下移动 : Ctrl+Down</p>
<p>修改 : Shift+Enter</p>
</blockquote>
<p>记住这些快捷键,很好记,可以大大方便我们的操作。最后是右下角的list按钮,我们可以建立多个list,把不同的task分开,便于管理。</p>
<h2 id="summary">Summary</h2>
<p>GMail Labs真是有很多超级棒的工具,GMail Tasks就很典型。功能并没有那些专业网站强大,但是其使用方便,可以满足普通的需求,并且是随着GMail同时打开,免去了我们打开多个窗口或工具的麻烦。还等什么,快去开启GMail Tasks功能吧。</p>
Google Developer Day 2009
2009-04-07T22:00:00+00:00
http://wenbinwu.com/%E4%BA%92%E8%81%94%E7%BD%91/2009/04/07/google-developer-day-2009
<p><a href="http://code.google.com/intl/zh-CN/events/developerday/2009/home.html">Google Developer Day</a> 开始报名了,如果你还不知道Google Developer Day是什么,那么快登陆<a href="http://code.google.com/intl/zh-CN/events/developerday/2009/home.html">Google Developer Day</a>的网站吧。</p>
<p>在谷歌每年最大的技术分享盛会上,充分了解Google开发者产品和技术的最新发展,学习如何更好地利用谷歌开发者技术来帮助您更有效地开发构建网上社交 和社区的应用、移动设备的应用、地理和地图的应用、网站和网页设计、以及搜索应用等等多项网络应用和服务的开发,以及听取业界其它领先企业分享他们在这些 网络技术开发上的经验与体会。</p>
<p>今年的一些主题:</p>
<ul>
<li>Google 地理产品(Google 地图和 Google 地球)</li>
<li>OpenSocial</li>
<li>网络和谷歌浏览器</li>
<li>AppEngine</li>
<li>Google Data API</li>
<li>Google AJAX 搜索</li>
<li>AdWords</li>
<li>Android和移动设备</li>
<li>其他网络技术</li>
</ul>
<p>怎么样,心动了么?快去报名吧</p>
如何备份Firefox Profile
2009-04-05T22:00:00+00:00
http://wenbinwu.com/%E4%BA%92%E8%81%94%E7%BD%91/2009/04/05/backup-firefox-profile
<p>关于什么是Firefox Profile以及为什么要使用Firefox Profile,请参考上一篇文章。</p>
<h1 id="备份firefox-profile">备份Firefox Profile</h1>
<p>为了帮助我们方便的备份Firefox Profile,我们需要一个非常棒的工具:<a href="http://mozbackup.jasnapaka.com/download.php">MozBackup</a>。下载安装版还是zip版的就随意啦。</p>
<p>使用MozBackup非常的简单,运行MozBackup后,将出现一个向导,只要一步步跟着走就可以了。记得运行前要把Firefox关掉。</p>
<p><img src="/assets/3416589505_1e18c383a5_o.png" alt="" /></p>
<p>简单吧,在上面这步选择想要备份的profile,改一下备份文件的文件夹就好了。</p>
<p>OK,关于Firefox Profile的一些简单用处和使用就介绍到这里,有好方法的同学记得发信给我。</p>
创建和管理多个Firefox Profile
2009-04-04T22:00:00+00:00
http://wenbinwu.com/%E4%BA%92%E8%81%94%E7%BD%91/2009/04/04/create-maintain-multiple-firefox-profile
<h1 id="what-is-firefox-profile">What is Firefox Profile?</h1>
<p>Mozilla的官方定义:</p>
<blockquote>
<p>Any changes you make while using Firefox are stored in files so that they can be used the next time you run Firefox. These changes can be obvious, like your home page, or changes you’ve made to the toolbar, but also include things like your history, what sites you’ve visited, and text you’ve entered into forms like search fields. They’re all stored in the same location, called a profile folder.</p>
<p>These files are kept separately from the program files that Firefox uses to run, which don’t change. This means that you can uninstall Firefox without losing your settings, and that if something goes wrong with an update your information will still be there. It also means you don’t have to reinstall Firefox in order to clear your information, or troubleshoot a problem.</p>
</blockquote>
<p>意思就是说,profile是一组Firefox为你建立的文件,其中包含了你的个人信息,比如书签,密码等。profile没有放在Firefox的安装目录,即使你卸载Firefox,你的信息都不会丢失的,当然,如果想清除你的信息,也不需要重新安装Firefox,只需要把profile删除就可以了。</p>
<h1 id="why-need-firefox-profile">Why need Firefox Profile?</h1>
<p>比如我作为一名大学生,在宿舍中生活,有时就可能和室友共享一台电脑,有些信息是不想和别人分享的(密码,历史记录之类的)。又或者是我们自己有一些特殊的原因,比如工作,游戏需要不同的Firefox设置。碰到这些情况,通过配置不同的profile,让我们启动Firefox后进入不同的环境。使用profile保证了私密性,也让Firefox更加简洁,专注某一项任务。同时,将不同用途的插件分开也有利于Firefox的启动和使用速度。</p>
<h1 id="how-to-use-firefox-profile">How to use Firefox Profile?</h1>
<p>正常情况下,我们启动Firefox时采用默认的profile(default)。Firefox’s profile manager能够帮助我们管理Firefox Profile。为了启动Firefox profile manager,需要从命令行启动。简单一点可以从开始–运行启动,在运行中键入<code class="highlighter-rouge">firefox.exe --profilemanager</code>。就像这样:</p>
<p><img src="/assets/3413018171_18c37eb96a_o.png" alt="" /></p>
<p>这样我们会看到Firefox’s profile manager。可以创建,重命名,删除profile文件。</p>
<p><img src="/assets/3413018139_b7832edb53_o.png" alt="" /></p>
<p>注意“启动时不询问”选项,不选中的话,每次启动Firefox都将弹出这个窗口让你选择profile。</p>
<p>看到这里,我们就该看看如何利用profile帮助我们管理Firefox了。
桌面上找到Firefox的快捷方式,在末尾加上<code class="highlighter-rouge">-P profilename</code>:</p>
<p><img src="/assets/3413813910_7bfe75a527_o.png" alt="" /></p>
<p>这是我专门为开发Firefox插件建立的profile。</p>
<p>先写到这里,明天会有关于如何备份profile的介绍。</p>
学习使用Twitter4J
2009-04-03T22:00:00+00:00
http://wenbinwu.com/%E7%BC%96%E7%A8%8B%E6%8A%80%E6%9C%AF/2009/04/03/twitter4j
<h1 id="what-is-twitter4j">What is Twitter4J?</h1>
<p><a href="http://yusuke.homeip.net/twitter4j/en/index.html">Twitter4</a>是TwitterAPI的一个Java库。使用Twitter4J,你可以方便的将你的应用程序与Twitter服务结合。</p>
<h1 id="how-to-use-twitter4j">How to use Twitter4J?</h1>
<p>首先,从<a href="http://yusuke.homeip.net/twitter4j/en/index.html">Twitter4J</a>的网站上下载最新的Twitter4J的jar包。</p>
<p>下载完成后,让我们打开Eclipse,新建一个Java工程,不要忘记将Twitter4J的jar包加入Library中,见下图。</p>
<p><img src="/assets/3411419232_b67a10f6df_o.jpg" alt="Eclipse" /></p>
<p>接下来我们可以创建一个<code class="highlighter-rouge">net.kylewu.twitter.TwitterMain</code>类,用来程序主流程。代码如下。</p>
<div class="highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">package</span> <span class="n">net</span><span class="p">.</span><span class="n">kylewu</span><span class="p">.</span><span class="n">twitter</span><span class="p">;</span>
<span class="n">import</span> <span class="n">java</span><span class="p">.</span><span class="n">util</span><span class="p">.</span><span class="k">List</span><span class="p">;</span>
<span class="n">import</span> <span class="n">java</span><span class="p">.</span><span class="n">util</span><span class="p">.</span><span class="n">Scanner</span><span class="p">;</span>
<span class="n">import</span> <span class="n">twitter4j</span><span class="p">.</span><span class="n">DirectMessage</span><span class="p">;</span>
<span class="n">import</span> <span class="n">twitter4j</span><span class="p">.</span><span class="n">Query</span><span class="p">;</span>
<span class="n">import</span> <span class="n">twitter4j</span><span class="p">.</span><span class="n">QueryResult</span><span class="p">;</span>
<span class="n">import</span> <span class="n">twitter4j</span><span class="p">.</span><span class="n">Status</span><span class="p">;</span>
<span class="n">import</span> <span class="n">twitter4j</span><span class="p">.</span><span class="n">Tweet</span><span class="p">;</span>
<span class="n">import</span> <span class="n">twitter4j</span><span class="p">.</span><span class="n">Twitter</span><span class="p">;</span>
<span class="n">import</span> <span class="n">twitter4j</span><span class="p">.</span><span class="n">TwitterException</span><span class="p">;</span>
<span class="p">/*</span> <span class="n">The</span> <span class="n">main</span> <span class="n">class</span> <span class="k">of</span> <span class="n">twitter</span> <span class="n">client</span>
<span class="p">*</span> <span class="p">@</span><span class="n">author</span> <span class="n">Kyle</span> <span class="n">Wu</span>
<span class="p">*/</span>
<span class="k">public</span> <span class="n">class</span> <span class="n">TwitterMain</span> <span class="p">{</span>
<span class="k">public</span> <span class="n">static</span> <span class="n">void</span> <span class="n">print</span><span class="p">(</span><span class="k">String</span> <span class="k">string</span><span class="p">)</span> <span class="p">{</span>
<span class="nf">System</span><span class="p">.</span><span class="n">out</span><span class="p">.</span><span class="n">println</span><span class="p">(</span><span class="k">string</span><span class="p">);</span>
<span class="p">}</span>
<span class="k">public</span> <span class="n">static</span> <span class="n">void</span> <span class="n">main</span><span class="p">(</span><span class="k">String</span><span class="p">[]</span> <span class="n">args</span><span class="p">)</span> <span class="p">{</span>
<span class="k">if</span> <span class="p">(</span><span class="n">args</span><span class="p">.</span><span class="n">length</span> <span class="p">&</span><span class="n">lt</span><span class="p">;</span> <span class="m">2</span><span class="p">)</span> <span class="p">{</span>
<span class="n">print</span><span class="p">(</span><span class="s2">"Usage: java net.kylewu.twitter.TwitterMain ID Password"</span><span class="p">);</span>
<span class="nf">System</span><span class="p">.</span><span class="k">exit</span><span class="p">(-</span><span class="m">1</span><span class="p">);</span>
<span class="p">}</span>
<span class="k">String</span> <span class="n">strTip</span> <span class="p">=</span> <span class="s2">"=========================n"</span>
<span class="p">+</span> <span class="s2">"Please select what you want to do:n"</span>
<span class="p">+</span> <span class="s2">"1. Updating statusn"</span> <span class="p">+</span> <span class="s2">"2. Getting Timelinen"</span>
<span class="p">+</span> <span class="s2">"3. Sending Direct Messagesn"</span>
<span class="p">+</span> <span class="s2">"4. Receiving Direct Messagesn"</span> <span class="p">+</span> <span class="s2">"5. Search for Tweetsn"</span>
<span class="p">+</span> <span class="s2">"6. Asynchronous APIn"</span>
<span class="p">+</span> <span class="s2">"0. Exitn"</span> <span class="p">+</span>
<span class="s2">"========================="</span><span class="p">;</span>
<span class="p">//</span> <span class="n">Twitter</span> <span class="n">class</span> <span class="n">is</span> <span class="n">the</span> <span class="n">one</span> <span class="n">you</span> <span class="n">may</span> <span class="n">want</span> <span class="k">to</span> <span class="n">look</span> <span class="n">first</span>
<span class="n">Twitter</span> <span class="n">twitter</span> <span class="p">=</span> <span class="n">new</span> <span class="n">Twitter</span><span class="p">(</span><span class="n">args</span><span class="p">[</span><span class="m">0</span><span class="p">],</span> <span class="n">args</span><span class="p">[</span><span class="m">1</span><span class="p">]);</span>
<span class="n">Scanner</span> <span class="n">scanner</span> <span class="p">=</span> <span class="n">new</span> <span class="n">Scanner</span><span class="p">(</span><span class="nf">System</span><span class="p">.</span><span class="k">in</span><span class="p">);</span>
<span class="k">while</span> <span class="p">(</span><span class="nb">true</span><span class="p">)</span> <span class="p">{</span>
<span class="n">print</span><span class="p">(</span><span class="n">strTip</span><span class="p">);</span>
<span class="k">String</span> <span class="n">select</span> <span class="p">=</span> <span class="n">scanner</span><span class="p">.</span><span class="n">nextLine</span><span class="p">();</span>
<span class="k">if</span> <span class="p">(</span><span class="n">select</span><span class="p">.</span><span class="n">compareTo</span><span class="p">(</span><span class="n">TwitterAction</span><span class="p">.</span><span class="n">UPDATE</span><span class="p">.</span><span class="n">toString</span><span class="p">())</span> <span class="p">==</span> <span class="m">0</span><span class="p">)</span> <span class="p">{</span>
<span class="p">//</span> <span class="n">get</span> <span class="n">message</span>
<span class="n">print</span><span class="p">(</span><span class="s2">"Please input message you want to update:"</span><span class="p">);</span>
<span class="k">String</span> <span class="n">message</span> <span class="p">=</span> <span class="n">scanner</span><span class="p">.</span><span class="n">nextLine</span><span class="p">();</span>
<span class="n">try</span> <span class="p">{</span>
<span class="p">//</span> <span class="n">update</span> <span class="n">here</span>
<span class="n">Status</span> <span class="n">status</span> <span class="p">=</span> <span class="n">twitter</span><span class="p">.</span><span class="n">update</span><span class="p">(</span><span class="n">message</span><span class="p">);</span>
<span class="n">print</span><span class="p">(</span><span class="s2">"Successfully updated the status to ["</span>
<span class="p">+</span> <span class="n">status</span><span class="p">.</span><span class="n">getText</span><span class="p">()</span> <span class="p">+</span> <span class="s2">"]."</span><span class="p">);</span>
<span class="p">}</span> <span class="n">catch</span> <span class="p">(</span><span class="n">TwitterException</span> <span class="n">e</span><span class="p">)</span> <span class="p">{</span>
<span class="n">print</span><span class="p">(</span><span class="s2">"Error occured when updating"</span><span class="p">);</span>
<span class="n">e</span><span class="p">.</span><span class="n">printStackTrace</span><span class="p">();</span>
<span class="p">}</span>
<span class="p">}</span> <span class="k">else</span> <span class="k">if</span> <span class="p">(</span><span class="n">select</span><span class="p">.</span><span class="n">compareTo</span><span class="p">(</span><span class="n">TwitterAction</span><span class="p">.</span><span class="n">GETTIMELINE</span><span class="p">.</span><span class="n">toString</span><span class="p">())</span> <span class="p">==</span> <span class="m">0</span><span class="p">)</span> <span class="p">{</span>
<span class="n">try</span> <span class="p">{</span>
<span class="p">//</span> <span class="n">get</span> <span class="n">friend</span> <span class="n">time</span> <span class="n">line</span> <span class="n">here</span>
<span class="k">List</span> <span class="n">statuses</span> <span class="p">=</span> <span class="n">twitter</span><span class="p">.</span><span class="n">getFriendsTimeline</span><span class="p">();</span>
<span class="n">print</span><span class="p">(</span><span class="s2">"Showing friends timeline."</span><span class="p">);</span>
<span class="n">for</span> <span class="p">(</span><span class="n">Status</span> <span class="n">status</span> <span class="p">:</span> <span class="n">statuses</span><span class="p">)</span> <span class="p">{</span>
<span class="n">print</span><span class="p">(</span><span class="n">status</span><span class="p">.</span><span class="n">getUser</span><span class="p">().</span><span class="n">getName</span><span class="p">()</span> <span class="p">+</span> <span class="s2">":"</span>
<span class="p">+</span> <span class="n">status</span><span class="p">.</span><span class="n">getText</span><span class="p">());</span>
<span class="p">}</span>
<span class="p">}</span> <span class="n">catch</span> <span class="p">(</span><span class="n">TwitterException</span> <span class="n">e</span><span class="p">)</span> <span class="p">{</span>
<span class="n">print</span><span class="p">(</span><span class="s2">"Error occured when getting friends timeline"</span><span class="p">);</span>
<span class="n">e</span><span class="p">.</span><span class="n">printStackTrace</span><span class="p">();</span>
<span class="p">}</span>
<span class="p">}</span> <span class="k">else</span> <span class="k">if</span> <span class="p">(</span><span class="n">select</span><span class="p">.</span><span class="n">compareTo</span><span class="p">(</span><span class="n">TwitterAction</span><span class="p">.</span><span class="n">SENDDIRECTMSG</span><span class="p">.</span><span class="n">toString</span><span class="p">())</span> <span class="p">==</span> <span class="m">0</span><span class="p">)</span> <span class="p">{</span>
<span class="n">print</span><span class="p">(</span><span class="s2">"Please input id you want to send to :"</span><span class="p">);</span>
<span class="k">String</span> <span class="n">id</span> <span class="p">=</span> <span class="n">scanner</span><span class="p">.</span><span class="n">nextLine</span><span class="p">();</span>
<span class="n">print</span><span class="p">(</span><span class="s2">"Please input message you want to send to :"</span><span class="p">);</span>
<span class="k">String</span> <span class="n">message</span> <span class="p">=</span> <span class="n">scanner</span><span class="p">.</span><span class="n">nextLine</span><span class="p">();</span>
<span class="n">try</span> <span class="p">{</span>
<span class="p">//</span> <span class="nf">send</span> <span class="n">direct</span> <span class="n">message</span> <span class="n">here</span>
<span class="n">twitter</span><span class="p">.</span><span class="n">sendDirectMessage</span><span class="p">(</span><span class="n">id</span><span class="p">,</span> <span class="n">message</span><span class="p">);</span>
<span class="n">print</span><span class="p">(</span><span class="s2">"Successfully send message to "</span> <span class="p">+</span> <span class="n">id</span> <span class="p">+</span> <span class="s2">"."</span><span class="p">);</span>
<span class="p">}</span> <span class="n">catch</span> <span class="p">(</span><span class="n">Exception</span> <span class="n">e</span><span class="p">)</span> <span class="p">{</span>
<span class="n">print</span><span class="p">(</span><span class="s2">"Error occured when sending direct message"</span><span class="p">);</span>
<span class="n">e</span><span class="p">.</span><span class="n">printStackTrace</span><span class="p">();</span>
<span class="p">}</span>
<span class="p">}</span> <span class="k">else</span> <span class="k">if</span> <span class="p">(</span><span class="n">select</span><span class="p">.</span><span class="n">compareTo</span><span class="p">(</span><span class="n">TwitterAction</span><span class="p">.</span><span class="n">RECVDIRECTMSG</span><span class="p">.</span><span class="n">toString</span><span class="p">())</span> <span class="p">==</span> <span class="m">0</span><span class="p">)</span> <span class="p">{</span>
<span class="n">try</span> <span class="p">{</span>
<span class="p">//</span> <span class="n">receive</span> <span class="n">direct</span> <span class="n">message</span> <span class="n">here</span>
<span class="k">List</span> <span class="k">list</span> <span class="p">=</span> <span class="n">twitter</span><span class="p">.</span><span class="n">getDirectMessages</span><span class="p">();</span>
<span class="n">print</span><span class="p">(</span><span class="s2">"There are "</span> <span class="p">+</span> <span class="k">list</span><span class="p">.</span><span class="n">size</span><span class="p">()</span> <span class="p">+</span> <span class="s2">" messages"</span><span class="p">);</span>
<span class="n">for</span> <span class="p">(</span><span class="n">DirectMessage</span> <span class="n">dm</span> <span class="p">:</span> <span class="k">list</span><span class="p">)</span> <span class="p">{</span>
<span class="n">print</span><span class="p">(</span><span class="s2">"Sender:"</span> <span class="p">+</span> <span class="n">dm</span><span class="p">.</span><span class="n">getSenderScreenName</span><span class="p">());</span>
<span class="n">print</span><span class="p">(</span><span class="s2">"Text:"</span> <span class="p">+</span> <span class="n">dm</span><span class="p">.</span><span class="n">getText</span><span class="p">()</span> <span class="p">+</span> <span class="s2">"n"</span><span class="p">);</span>
<span class="p">}</span>
<span class="p">}</span> <span class="n">catch</span> <span class="p">(</span><span class="n">Exception</span> <span class="n">e</span><span class="p">)</span> <span class="p">{</span>
<span class="n">print</span><span class="p">(</span><span class="s2">"Error occured when receiving direct message"</span><span class="p">);</span>
<span class="n">e</span><span class="p">.</span><span class="n">printStackTrace</span><span class="p">();</span>
<span class="p">}</span>
<span class="p">}</span> <span class="k">else</span> <span class="k">if</span> <span class="p">(</span><span class="n">select</span><span class="p">.</span><span class="n">compareTo</span><span class="p">(</span><span class="n">TwitterAction</span><span class="p">.</span><span class="n">SEARCHFORTWEETS</span>
<span class="p">.</span><span class="n">toString</span><span class="p">())</span> <span class="p">==</span> <span class="m">0</span><span class="p">)</span> <span class="p">{</span>
<span class="n">try</span> <span class="p">{</span>
<span class="p">//</span> <span class="n">search</span> <span class="n">for</span> <span class="n">tweets</span>
<span class="n">Query</span> <span class="n">query</span> <span class="p">=</span> <span class="n">new</span> <span class="n">Query</span><span class="p">(</span><span class="s2">"wenwu"</span><span class="p">);</span>
<span class="n">QueryResult</span> <span class="n">result</span> <span class="p">=</span> <span class="n">twitter</span><span class="p">.</span><span class="n">search</span><span class="p">(</span><span class="n">query</span><span class="p">);</span>
<span class="n">print</span><span class="p">(</span><span class="s2">"hits:"</span> <span class="p">+</span> <span class="n">result</span><span class="p">.</span><span class="n">getTotal</span><span class="p">());</span>
<span class="n">for</span> <span class="p">(</span><span class="n">Tweet</span> <span class="n">tweet</span> <span class="p">:</span> <span class="n">result</span><span class="p">.</span><span class="n">getTweets</span><span class="p">())</span> <span class="p">{</span>
<span class="n">print</span><span class="p">(</span><span class="n">tweet</span><span class="p">.</span><span class="n">getFromUser</span><span class="p">()</span> <span class="p">+</span> <span class="s2">":"</span> <span class="p">+</span> <span class="n">tweet</span><span class="p">.</span><span class="n">getText</span><span class="p">());</span>
<span class="p">}</span>
<span class="p">}</span> <span class="n">catch</span> <span class="p">(</span><span class="n">Exception</span> <span class="n">e</span><span class="p">)</span> <span class="p">{</span>
<span class="n">print</span><span class="p">(</span><span class="s2">"Error occured when searching for tweets"</span><span class="p">);</span>
<span class="n">e</span><span class="p">.</span><span class="n">printStackTrace</span><span class="p">();</span>
<span class="p">}</span>
<span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
<span class="p">//</span> <span class="k">exit</span>
<span class="nf">System</span><span class="p">.</span><span class="k">exit</span><span class="p">(</span><span class="m">0</span><span class="p">);</span>
<span class="p">}</span>
<span class="p">}</span>
<span class="p">}</span> <span class="p">}</span>
</code></pre></div></div>
<p>接下来创建一个net.kylewu.twitter.TwitterAction的Enum,主要是对各种消息进行枚举。代码如下。</p>
<div class="highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">package</span> <span class="n">net</span><span class="p">.</span><span class="n">kylewu</span><span class="p">.</span><span class="n">twitter</span><span class="p">;</span>
<span class="k">public</span> <span class="n">enum</span> <span class="n">TwitterAction</span> <span class="p">{</span>
<span class="n">UPDATE</span><span class="p">(</span><span class="m">1</span><span class="p">),</span>
<span class="n">GETTIMELINE</span><span class="p">(</span><span class="m">2</span><span class="p">),</span>
<span class="n">SENDDIRECTMSG</span><span class="p">(</span><span class="m">3</span><span class="p">),</span>
<span class="n">RECVDIRECTMSG</span><span class="p">(</span><span class="m">4</span><span class="p">),</span>
<span class="n">SEARCHFORTWEETS</span><span class="p">(</span><span class="m">5</span><span class="p">);</span>
<span class="n">final</span> <span class="n">private</span> <span class="n">int</span> <span class="n">type</span><span class="p">;</span>
<span class="n">private</span> <span class="n">TwitterAction</span><span class="p">(</span><span class="n">int</span> <span class="n">type</span><span class="p">)</span> <span class="p">{</span>
<span class="n">this</span><span class="p">.</span><span class="n">type</span> <span class="p">=</span> <span class="n">type</span><span class="p">;</span>
<span class="p">}</span>
<span class="p">@</span><span class="n">Override</span>
<span class="k">public</span> <span class="k">String</span> <span class="n">toString</span><span class="p">()</span> <span class="p">{</span>
<span class="n">return</span> <span class="k">String</span><span class="p">.</span><span class="n">valueOf</span><span class="p">(</span><span class="n">this</span><span class="p">.</span><span class="n">type</span><span class="p">);</span>
<span class="p">}</span>
<span class="k">public</span> <span class="n">int</span> <span class="n">getType</span><span class="p">()</span> <span class="p">{</span>
<span class="n">return</span> <span class="n">this</span><span class="p">.</span><span class="n">type</span><span class="p">;</span>
<span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>
<p>好了,我们运行一下,功能很简单是吧,当然代码也很简单。Twitter4J已经为我们做了很多事情,我们所要做的仅仅是调用Twitter类提供的一些方法。后面我还会发布一篇Twitter4J探秘,让我们从内部看看Twitter4J是如何帮助我们的:-)</p>
<p>哪位朋友用Twitter4J做了好的应用,别忘记告诉我一声哦。</p>
TwitPic -- 方便的与Twitter好友分享照片
2009-04-02T22:00:00+00:00
http://wenbinwu.com/%E4%BA%92%E8%81%94%E7%BD%91/2009/04/02/twitpic
<h1 id="what-is-twitpic">What is Twitpic?</h1>
<p><a href="http://twitpic.com/">Twitpic</a>是一个利用Twitter网络的图片分享网站。</p>
<h1 id="how-to-use-twitpic">How to use Twitpic?</h1>
<p>使用你的Twitter账号登陆Twitpic。界面很清爽,不是么?点击页面上方的Upload photo就可以上传图片了,同时也可以随同图片发布一下信息。</p>
<p>Twitpic支持在线上传,同时也支持手机上传(点击页面上方Settings便可以看到使用方法),并提供API供用户使用。作为开发者,只需要关注<a href="http://twitpic.com/api.do">API</a>页面,Twitpic提供的功能非常简单,但很实用。</p>
<p>Twitpic作为一个依托于Twitter的具有优秀创意的应用,具有很好的前景,喜欢同好友分享图片的同学不要忘记Twitpic。</p>
jQuery Content Gallery GalleryView
2009-04-01T22:00:00+00:00
http://wenbinwu.com/%E7%BC%96%E7%A8%8B%E6%8A%80%E6%9C%AF/2009/04/01/jquery-content-gallery-galleryview
<p>GalleryView是jQuery的一款插件,用其可以完成任意类型的content gallery,包括图片或HTML。</p>
<p>它提供了从宽度/高度到配色的大量配置选项。</p>
<p><img src="/assets/jquery-content-gallery.jpg" alt="GalleryView" /></p>
<p>这款插件简单的将无序的列表转换为gallery。你可以打开/关闭从alt属性得到的captions选项。</p>
<p>通过上传一些图片,可以很容易的建立新的主题。希望看到其他一些demo,请看<a href="http://www.spaceforaname.com/jquery/galleryview/gallery-light.html">这里</a>,<a href="http://www.spaceforaname.com/jquery/galleryview/polaroid.html">这里</a> 和<a href="http://www.spaceforaname.com/jquery/galleryview/gallery-customized.html">这里</a>。</p>
<p>翻译: Kyle Wu</p>
<p>EMAIL:imkylewu [at] gmail.com</p>
<p>文章源地址请看<a href="http://www.webresourcesdepot.com/jquery-content-gallery-galleryview/">这里</a></p>
Gmail Labs又添加新功能
2009-04-01T22:00:00+00:00
http://wenbinwu.com/%E4%BA%92%E8%81%94%E7%BD%91/2009/04/01/gmail-labs-new-feature
<p>在Gmail小组中,我们相信从上千封邮件中找到想要的邮件同从数十亿个网页中找到想要的网页是同样的重要。为了在使Gmail中搜索更加的容易,我们在Gmail Labs中添加了新的特性:搜索自动补全(Search Autocomplete)。</p>
<p>在Gmail Setting中的<a href="http://mail.google.com/mail/?ui=2&fs=1&view=pu&st=labs">Labs标签</a>打开搜索自动补全(Search Autocomplete),这样你就会在搜索框中打字时得到提示。在Gmail中一个最重要的搜索是对名字或email地址的搜索,所以你首先看到的一类提示是联系人的提示。有些名字不是很容易记忆(我的last name就是一个绝好的列子!)–通过这个新的Labs特性,你可以键入几个字母,进而在下拉菜单中选择希望的联系人。就是这样简单和快捷。</p>
<p><img src="/assets/3408172813_1e78478b4f_o.jpg" alt="Gmail Labs" /></p>
<p>Gmail同时也提供了许多<a href="http://mail.google.com/support/bin/answer.py?answer=7190&topic=12796">高级搜索操作</a>(advanced search operators),为你找到想要的信息提供了强大的支持。你可以在一个明确的位置搜索(比如在聊天记录或者附件) ,也可以搜索一个带有确定类型附件的信息(比如docs或photos)。假使我希望搜索我发送给我朋友Chris的照片。正常情况下,我必须键入Chris的邮箱地址,后面跟上文件名(jpg或png),我承认这很让我厌烦。通过使用搜索自动补全(Search Autocomplete),我键入”photos” 或 “pictures” ,在下拉菜单中选择 “has photos” (如下图), 然后搜索语句 (<code class="highlighter-rouge">filename:(jpg OR png)</code>) 就为我自动插入了。同样的,你键入 “attachment” ,搜索自动补全(Search Autocomplete)会列出最常用的附件类型。</p>
<p><img src="/assets/3408172829_5e57e97808_o.jpg" alt="Gmail Labs" /></p>
<p>仍然显示搜索查询是为了适应你的特殊需求。举个例子,如果你想要在搜索结果中包括tiff文件,你可以手动的改变查询语句为 filename:(jpg OR png OR tiff).</p>
<p>就到这里。好好享受,利用节省下来的时间<a href="http://groups.google.com/group/gmail-labs-help-search-autocomplete">让我们知道</a>你的想法。</p>
<p>翻译: Kyle Wu</p>
<p>EMAIL:imkylewu [at] gmail.com</p>
<p>文章源地址请看<a href="http://gmailblog.blogspot.com/2009/04/new-in-labs-gmail-search-made-easier.html">这里</a></p>