<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" gd:etag="W/&quot;C0IBQ3w9eCp7ImA9WhRVF0o.&quot;"><id>tag:blogger.com,1999:blog-57392424587537905</id><updated>2012-01-17T10:39:12.260+07:00</updated><category term="templates" /><category term="g" /><category term="libo" /><category term="quartz" /><category term="dollartext" /><category term="bug" /><category term="convert thai number" /><category term="registry" /><category term="form image" /><category term="drupal module" /><category term="convert file" /><category term="broadcom" /><category term="cookie" /><category term="เกาะช้าง" /><category term="bazaar" /><category term="restore" /><category term="module" /><category term="buddhist bug" /><category term="css" /><category term="แปลงเลข" /><category term="UNO function" /><category term="git" /><category term="js" /><category term="spring" /><category term="extension" /><category term="utf8" /><category term="function" /><category term="authen" /><category term="macro" /><category term="ตัวอักษรซ้อน" /><category term="redirect" /><category term="Menubar" /><category term="cron" /><category term="thai" /><category term="custom workflow" /><category term="exchange" /><category term="module login" /><category term="labellion" /><category term="mysql" /><category term="java" /><category term="jawt" /><category term="schedule" /><category term="bzr" /><category term="OpenOffice" /><category term="language" /><category term="first child" /><category term="แปลงเลขไทย" /><category term="ubuntu 9.10" /><category term="regular expression" /><category term="virtualhost redirect" /><category term="pdf" /><category term="bahteng" /><category term="เมนู" /><category term="css selector" /><category term="สัมนา" /><category term="first-child" /><category term="drupal hook" /><category term="moneytext" /><category term="drupal form" /><category term="not sync" /><category term="view" /><category term="html" /><category term="ubuntu 10.04" /><category term="gitorious" /><category term="change password" /><category term="configurations" /><category term="ubuntu" /><category term="Merging" /><category term="vista" /><category term="hover" /><category term="svn" /><category term="label" /><category term="openoffice.org build" /><category term="LibreOffice" /><category term="javascript" /><category term="dhas" /><category term="Notepad2" /><category term="hook form" /><category term="install openerp" /><category term="expunge" /><category term="not update" /><category term="locale" /><category term="7" /><category term="UNO" /><category term="Toolbar" /><category term="export" /><category term="sun java" /><category term="numbertext" /><category term="build LibreOffice" /><category term="ldap" /><category term="ลิเบอร์" /><category term="reads" /><category term="fgetcsv" /><category term="v2" /><category term="cms" /><category term="ireport" /><category term="OpenOffice.org Calc" /><category term="datedif" /><category term="windows" /><category term="jasper" /><category term="thunderbird" /><category term="java openoffice.org" /><category term="default" /><category term="embed" /><category term="database" /><category term="views count" /><category term="bahttext" /><category term="debug" /><category term="ภาษาไทย" /><category term="embedded" /><category term="Osdev" /><category term="Merge" /><category term="wireless driver" /><category term="extensions" /><category term="alfresco" /><category term="convert digit" /><category term="php" /><category term="ajax" /><category term="convert" /><category term="writer" /><category term="datediff" /><category term="first" /><category term="ie" /><category term="replace" /><category term="jodconverter" /><category term="compaq cq40" /><category term="bonita" /><category term="imap" /><category term="google adwords" /><category term="workflow engine" /><category term="search" /><category term="login module" /><category term="drupal" /><category term="OpenOffice.org" /><category term="MergePoint" /><category term="ooo" /><category term="add-in" /><category term="945GM" /><category term="read only" /><category term="warning" /><category term="DispatchHelper" /><category term="read-only" /><title>leknarm's blog</title><subtitle type="html" /><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://www.leknarm.com/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://www.leknarm.com/" /><link rel="next" type="application/atom+xml" href="http://www.blogger.com/feeds/57392424587537905/posts/default?start-index=26&amp;max-results=25&amp;redirect=false&amp;v=2" /><author><name>Tantai Thanakanok</name><uri>https://profiles.google.com/105761820717326472079</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-jkl-QXkcHk0/AAAAAAAAAAI/AAAAAAAAAAA/_z7XmYxSV_c/s512-c/photo.jpg" /></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>58</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/leknarm/DRyy" /><feedburner:info uri="leknarm/dryy" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><entry gd:etag="W/&quot;Ck8CRHo-fSp7ImA9WhRTGE8.&quot;"><id>tag:blogger.com,1999:blog-57392424587537905.post-1563432128524993777</id><published>2011-11-09T13:41:00.001+07:00</published><updated>2011-11-09T13:41:05.455+07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-11-09T13:41:05.455+07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="java" /><category scheme="http://www.blogger.com/atom/ns#" term="quartz" /><category scheme="http://www.blogger.com/atom/ns#" term="spring" /><category scheme="http://www.blogger.com/atom/ns#" term="cron" /><category scheme="http://www.blogger.com/atom/ns#" term="schedule" /><title>ทำ Cron บน Web Application ง่ายๆ ด้วย Spring + Quartz</title><content type="html">บน Linux เวลาต้องการที่จะรันโปรแกรม หรือ Script โดยตั้งเวลาให้รัน ทุกๆ เช้าหรือทุกๆ ชั่วโมงคงทำได้ไม่ยากเพราะบน Linux มี &lt;a href="http://en.wikipedia.org/wiki/Cron"&gt;Cron&lt;/a&gt; อยู่ แต่ถ้าต้องการ Schedule รันโปรแกรมบน Windows คงต้องใช้ &lt;a href="http://en.wikipedia.org/wiki/Windows_Task_Scheduler"&gt;Windows Task Scheduler&lt;/a&gt;&amp;nbsp;แต่ถ้าต้องการรัน Cron บน Web Application ล่ะจะต้องทำยังไง?&lt;br /&gt;
สำหรับ Java นั้นมี Library สำหรับจัดการ Schedule อยู่ชื่อว่า &lt;a href="http://quartz-scheduler.org/"&gt;Quartz&lt;/a&gt;&amp;nbsp;เอาไว้จัดการ Schedule ต่างๆ ใน Application ได้&lt;br /&gt;
แต่เนื่องด้วยถ้าใช้ Quartz อย่างเดียวมันคงไม่หล่อเท่าไร ดังนั้นเราจึงต้องเอามา Integrate กับ Spring ซะเพราะหลายคนส่วนใหญ่ก็ใช้งาน Spring กันอยู่แล้ว&lt;br /&gt;
ก่อนอื่นเรามาดู dependency กันก่อนครับว่าจะใช้ Quartz กับ Spring นั้นต้องใช้อะไรบ้าง&lt;br /&gt;
&lt;br /&gt;
pom.xml
&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush:xml"&gt;&amp;lt;dependencies&amp;gt;

 &amp;lt;dependency&amp;gt;
          &amp;lt;groupid&amp;gt;opensymphony&amp;lt;/groupid&amp;gt;
   &amp;lt;artifactid&amp;gt;quartz&amp;lt;/artifactid&amp;gt;
   &amp;lt;version&amp;gt;1.6.3&amp;lt;/version&amp;gt;
 &amp;lt;/dependency&amp;gt;
 
 &amp;lt;dependency&amp;gt;
   &amp;lt;groupid&amp;gt;commons-collections&amp;lt;/groupid&amp;gt;
   &amp;lt;artifactid&amp;gt;commons-collections&amp;lt;/artifactid&amp;gt;
   &amp;lt;version&amp;gt;3.2.1&amp;lt;/version&amp;gt;
 &amp;lt;/dependency&amp;gt;
 
 &amp;lt;dependency&amp;gt;
  &amp;lt;groupid&amp;gt;org.springframework&amp;lt;/groupid&amp;gt;
  &amp;lt;artifactid&amp;gt;spring&amp;lt;/artifactid&amp;gt;
  &amp;lt;version&amp;gt;3.0.5.RELEASE&amp;lt;/version&amp;gt;
 &amp;lt;/dependency&amp;gt;
 
 &amp;lt;dependency&amp;gt;
  &amp;lt;groupid&amp;gt;org.springframework&amp;lt;/groupid&amp;gt;
  &amp;lt;artifactid&amp;gt;spring-web&amp;lt;/artifactid&amp;gt;
  &amp;lt;version&amp;gt;3.0.5.RELEASE&amp;lt;/version&amp;gt;
 &amp;lt;/dependency&amp;gt;
 
  &amp;lt;/dependencies&amp;gt;
&lt;/pre&gt;
&lt;pre class="brush:xml"&gt;&lt;/pre&gt;
จากนั้นให้สร้างไฟล์ที่เราต้องการจะรันเป็น Schedule
&lt;br /&gt;
&lt;br /&gt;
HelloQuartz.java&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush:java"&gt;public class HelloQuartz {
    public void hello() {
        System.out.println("hello quartz");
    }
}
&lt;/pre&gt;
เมื่อมีองค์ประกอบครบแล้ว เราก็มา config applicationContext.xml กัน

applicationContext.xml

&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush:xml"&gt;&amp;lt;bean id="helloQuartz" class="com.example.scheduler.HelloQuartz" /&amp;gt;
 
 &amp;lt;bean id="helloJobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"&amp;gt;
  &amp;lt;property name="targetObject" ref="helloQuartz" /&amp;gt;
  &amp;lt;property name="targetMethod" value="hello" /&amp;gt;
 &amp;lt;/bean&amp;gt;
 
 &amp;lt;bean id="helloJob" class="org.springframework.scheduling.quartz.CronTriggerBean"&amp;gt;
  &amp;lt;property name="jobDetail" ref="helloJobDetail" /&amp;gt;
  &amp;lt;property name="cronExpression" value="0/5 * * * * ?" /&amp;gt;
 &amp;lt;/bean&amp;gt;
 
 &amp;lt;bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean"&amp;gt;
  &amp;lt;property name="triggers"&amp;gt;
   &amp;lt;list&amp;gt;
    &amp;lt;ref bean="helloJob" /&amp;gt;
   &amp;lt;/list&amp;gt;
  &amp;lt;/property&amp;gt;
 &amp;lt;/bean&amp;gt;
&lt;/pre&gt;
จาก code ด้านบน เรากำหนดให้ bean ที่ต้องการรันเป็น HelloQuartz และกำหนด method ที่จะรันให้เป็น hello แล้วสั่งรันทุกๆ 5 วินาที ซึ่งเราสามารถกำหนด expression ได้ตาม pattern ของ &lt;a href="http://en.wikipedia.org/wiki/Cron"&gt;Cron&lt;/a&gt;&amp;nbsp;ครับ&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/57392424587537905-1563432128524993777?l=www.leknarm.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/9kN_tfGjQxgLy52uVRcrdbX1u3Q/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/9kN_tfGjQxgLy52uVRcrdbX1u3Q/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/9kN_tfGjQxgLy52uVRcrdbX1u3Q/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/9kN_tfGjQxgLy52uVRcrdbX1u3Q/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/leknarm/DRyy/~4/F-K7NfmS4zc" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.leknarm.com/feeds/1563432128524993777/comments/default" title="ส่งความคิดเห็น" /><link rel="replies" type="text/html" href="http://www.leknarm.com/2011/11/cron-web-application-spring-quartz.html#comment-form" title="0 ความคิดเห็น" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/57392424587537905/posts/default/1563432128524993777?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/57392424587537905/posts/default/1563432128524993777?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/leknarm/DRyy/~3/F-K7NfmS4zc/cron-web-application-spring-quartz.html" title="ทำ Cron บน Web Application ง่ายๆ ด้วย Spring + Quartz" /><author><name>Tantai Thanakanok</name><uri>https://profiles.google.com/105761820717326472079</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-jkl-QXkcHk0/AAAAAAAAAAI/AAAAAAAAAAA/_z7XmYxSV_c/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://www.leknarm.com/2011/11/cron-web-application-spring-quartz.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DE4DSXczeSp7ImA9WhdaFkU.&quot;"><id>tag:blogger.com,1999:blog-57392424587537905.post-7629325313257580461</id><published>2011-10-27T10:42:00.000+07:00</published><updated>2011-10-27T10:42:58.981+07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-10-27T10:42:58.981+07:00</app:edited><title>แก้ปัญหา Failed to add the host to the list of known hosts ใน cygwin</title><content type="html">บน cygwin เวลาเราจะ ssh ไปที่อื่นแล้วเกิด warning "Failed to add the host to the list of known hosts (/home/[username]/.ssh/known_hosts)." นั้นเนื่องมาจากใน windows เราไม่มี folder home อยู่แต่ home ของเราจะอยู่ที่ /cygdrive/c/Users/[username] แทนครับ&lt;br /&gt;
&lt;br /&gt;
&lt;div&gt;
วิธีแก้ไข เราต้องไปแก้ไขไฟล์ที่บอก path ว่า home เราอยู่ที่ /cygdrive/c/Users/[username] โดยให้ไปแก้ไขที่ไฟล์
&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;code&gt;C:\path\to\cygwin\etc\passwd&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;
&lt;div&gt;
โดยเปลี่ยน text ภายในไฟล์จาก /home/[username]  เป็น /cygdrive/c/Users/[username] แทน จากนั้นให้ลอง ssh ใหม่จะเห็นว่าสามารถ ssh ได้แล้วโดยไม่เตือน warning ดังกล่าว
&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
ที่มา - &lt;a href="http://ekawas.blogspot.com/2007/03/solving-pesky-ssh-issues-in-cygwin.html"&gt;http://ekawas.blogspot.com&lt;/a&gt;
&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/57392424587537905-7629325313257580461?l=www.leknarm.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/HSrhnRpETL30qVGH91xsmskWRnU/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/HSrhnRpETL30qVGH91xsmskWRnU/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/HSrhnRpETL30qVGH91xsmskWRnU/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/HSrhnRpETL30qVGH91xsmskWRnU/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/leknarm/DRyy/~4/WvlRcawQSLw" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.leknarm.com/feeds/7629325313257580461/comments/default" title="ส่งความคิดเห็น" /><link rel="replies" type="text/html" href="http://www.leknarm.com/2011/10/failed-to-add-host-to-list-of-known.html#comment-form" title="0 ความคิดเห็น" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/57392424587537905/posts/default/7629325313257580461?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/57392424587537905/posts/default/7629325313257580461?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/leknarm/DRyy/~3/WvlRcawQSLw/failed-to-add-host-to-list-of-known.html" title="แก้ปัญหา Failed to add the host to the list of known hosts ใน cygwin" /><author><name>Tantai Thanakanok</name><uri>https://profiles.google.com/105761820717326472079</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-jkl-QXkcHk0/AAAAAAAAAAI/AAAAAAAAAAA/_z7XmYxSV_c/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://www.leknarm.com/2011/10/failed-to-add-host-to-list-of-known.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Ck8MRXw6eCp7ImA9WhdXGUo.&quot;"><id>tag:blogger.com,1999:blog-57392424587537905.post-7693639155756513954</id><published>2011-08-31T11:38:00.005+07:00</published><updated>2011-09-02T20:41:24.210+07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-09-02T20:41:24.210+07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="ubuntu 10.04" /><category scheme="http://www.blogger.com/atom/ns#" term="git" /><category scheme="http://www.blogger.com/atom/ns#" term="gitorious" /><title>Install Gitorious บน Ubuntu 10.04 LTS</title><content type="html">&lt;b&gt;ก่อนอื่นต้องติดตั้ง package ที่จำเป็นก่อน&lt;/b&gt;&lt;br /&gt;
&lt;pre class="brush:bash"&gt;apt-get install -y build-essential apache2 apache2-dev libapache2-mod-xsendfile git-core git-doc mysql-server mysql-client libmysqlclient15-dev phpmyadmin ruby-dev rubygems libopenssl-ruby libdbd-mysql-ruby libmysql-ruby libexpat-dev libcurl4-openssl-dev postfix apg geoip-bin libgeoip1 libgeoip-dev imagemagick libmagick++-dev libpcre3 libpcre3-dev zlib1g zlib1g-dev zip unzip libyaml-dev libonig-dev memcached irb aspell libaspell-dev aspell-en
&lt;/pre&gt;&lt;b&gt;update gem ให้เป็น version ล่าสุดเพราะว่ามี default gem version ต่ำเกินไป&lt;/b&gt;&lt;br /&gt;
&lt;pre class="brush:bash"&gt;gem install rubygems-update
cd /var/lib/gems/1.8/bin
./update_rubygems
&lt;/pre&gt;&lt;b&gt;ติดตั้ง ruby gems ที่ต้องจำเป็น&lt;/b&gt;&lt;br /&gt;
&lt;pre class="brush:bash"&gt;gem install -b --no-ri --no-rdoc rmagick chronic geoip daemons hoe echoe ruby-yadis ruby-openid mime-types diff-lcs json ruby-hmac rake stompserver passenger rails raspell
gem install -b --no-ri --no-rdoc -v 1.0.1 rack
gem install -b --no-ri --no-rdoc -v 1.3.1.1 rdiscount
gem install -b --no-ri --no-rdoc -v 1.1 stomp
&lt;/pre&gt;&lt;b&gt;ทำ symlinks ให้กับ ruby&lt;/b&gt;&lt;br /&gt;
&lt;pre class="brush:bash"&gt;ln -s /usr/bin/ruby1.8 /usr/bin/ruby
&lt;/pre&gt;&lt;b&gt;ติดตั้ง Sphinx&lt;/b&gt;&lt;br /&gt;
&lt;pre class="brush:bash"&gt;mkdir src
cd src
wget http://sphinxsearch.com/downloads/sphinx-0.9.8.1.tar.gz
tar -xvzf sphinx-0.9.8.1.tar.gz
cd sphinx-0.9.8.1/
./configure --prefix=/usr &amp;amp;&amp;amp; make all
sudo make install
&lt;/pre&gt;&lt;b&gt;clone Gitorious&lt;/b&gt;&lt;br /&gt;
&lt;pre class="brush:bash"&gt;mkdir -p /var/www/gitorious.osdev.co.th
chmod ugo+rwx /var/www/gitorious.osdev.co.th
cd /var/www/gitorious.osdev.co.th/
git clone git://gitorious.org/gitorious/mainline.git gitorious
&lt;/pre&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Configure Services&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;สร้าง init script ไฟล์ git-daemon&lt;/b&gt;&lt;br /&gt;
&lt;pre class="brush:bash"&gt;vim /etc/init.d/git-daemon
&lt;/pre&gt;&lt;pre class="brush:bash"&gt;#! /bin/sh
### BEGIN INIT INFO
# Provides:          Gitorious GIT-Daemon
# Required-Start:
# Required-Stop:
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: GIT-Daemon server daemon
# Description:       Starts the GIT-Daemon needed by Gitorious
### END INIT INFO

# Author: Fabio Akita fabioakita@gmail.com

RETVAL=0
PROG="git-daemon"
GITORIOUS_ROOT=/var/www/gitorious.osdev.co.th/gitorious
GIT_DAEMON="/usr/bin/ruby $GITORIOUS_ROOT/script/git-daemon -d"
LOCK_FILE=/var/lock/git-daemon
PID_FILE=$GITORIOUS_ROOT/tmp/pids/git-daemon.pid

do_check_pid() {
if [ -f $PID_FILE ]; then
PID=`cat $PID_FILE`
RUNNING=`ps --pid $PID | wc -l`
else
PID=0
RUNNING=0
fi
}

runlevel=`runlevel | awk '{print $2}'`

start()
{
do_check_pid
if [ $RUNNING != 2 ] ; then
echo -n "Starting $PROG: "
/bin/su - git -c "$GIT_DAEMON"
sleep 10
if [ -f $PID_FILE ] ; then
echo "success"
RETVAL=0
else
echo "failure"
RETVAL=1
fi
else
echo -n "$PROG already running"
RETVAL=1
fi
[ "$RETVAL" = 0 ] &amp;amp;&amp;amp; touch $LOCK_FILE
echo
}

stop()
{
do_check_pid
echo -n "Stopping $PROG: "
if [ $RUNNING != 2 ] ; then
echo -n "Stopping $PROG"
else
PROGPID=`cat $PID_FILE`
kill -TERM $PROGPID
fi
RETVAL=0
# if we are in halt or reboot runlevel kill all running sessions
# so the TCP connections are closed cleanly
if [ "x$runlevel" = x0 -o "x$runlevel" = x6 ] ; then
PROGPID=`cat $PID_FILE`
kill -9 $PROGPID &amp;gt; /dev/null
fi
[ "$RETVAL" = 0 ] &amp;amp;&amp;amp; rm -f $LOCK_FILE &amp;amp;&amp;amp; rm -f $PID_FILE
echo
}

case "$1" in
start)
start
;;
stop)
stop
;;
restart)
stop
start
;;
condrestart)
if [ -f $LOCK_FILE ] ; then
if [ "$RETVAL" = 0 ] ; then
stop
# avoid race
sleep 10
start
fi
fi
;;
*)
echo $"Usage: $0 {start|stop|restart|condrestart}"
RETVAL=1
esac
exit $RETVAL
&lt;/pre&gt;&lt;b&gt;สร้าง init script ไฟล์ git-ultrasphinx&lt;/b&gt;&lt;br /&gt;
&lt;pre class="brush:bash"&gt;vim /etc/init.d/git-ultrasphinx
&lt;/pre&gt;&lt;pre class="brush:bash"&gt;#! /bin/sh
### BEGIN INIT INFO
# Provides:          Gitorious Ultrasphinx
# Required-Start:
# Required-Stop:
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Ultrasphinx daemon
# Description:       Starts the Ultrasphinx daemons needed by Gitorious
### END INIT INFO

# Author: Fabio Akita fabioakita@gmail.com

RETVAL=0
GITORIOUS_ROOT=/var/www/gitorious.osdev.co.th/gitorious

START_CMD="cd $GITORIOUS_ROOT &amp;amp;&amp;amp; rake ultrasphinx:daemon:start RAILS_ENV=production"
STOP_CMD="cd $GITORIOUS_ROOT &amp;amp;&amp;amp; rake ultrasphinx:daemon:stop RAILS_ENV=production"
RESTART_CMD="cd $GITORIOUS_ROOT &amp;amp;&amp;amp; rake ultrasphinx:daemon:restart RAILS_ENV=production"
STATUS_CMD="cd $GITORIOUS_ROOT &amp;amp;&amp;amp; rake ultrasphinx:daemon:status RAILS_ENV=production"
LOCK_FILE=/var/lock/git-ultrasphinx
PID_FILE=$GITORIOUS_ROOT/db/sphinx/log/searchd.pid

case "$1" in
start)
echo `date` " Starting git-ultrasphinx" &amp;gt;&amp;gt; "$GITORIOUS_ROOT/log/git-ultrasphinx.log"
/bin/su -- git -c "$START_CMD"
;;
stop)
echo `date`" Stopping git-ultrasphinx" &amp;gt;&amp;gt; "$GITORIOUS_ROOT/log/git-ultrasphinx.log"
/bin/su -- git -c "$STOP_CMD"
;;
status)
echo `date`" Status For  git-ultrasphinx" &amp;gt;&amp;gt; "$GITORIOUS_ROOT/log/git-ultrasphinx.log"
/bin/su -- git -c "$STATUS_CMD"
;;
restart)
echo `date`" ReStarting git-ultrasphinx" &amp;gt;&amp;gt; "$GITORIOUS_ROOT/log/git-ultrasphinx.log"
/bin/su -- git -c "$RESTART_CMD"
;;
*)
echo $"Usage: $0 {start|stop|restart|status}"
RETVAL=1
esac
exit $RETVAL
&lt;/pre&gt;&lt;b&gt;สร้าง init script ไฟล์ git-poller&lt;/b&gt;&lt;br /&gt;
&lt;pre class="brush:bash"&gt;vim /etc/init.d/git-poller
&lt;/pre&gt;&lt;pre class="brush:bash"&gt;#!/bin/sh
# Start/stop the git poller
#
### BEGIN INIT INFO
# Provides: git-poller
# Required-Start: stomp
# Required-Stop:
# Default-Start: 2 3 4 5
# Default-Stop: 1
# Short-Description: Gitorious poller
# Description: Gitorious poller
### END INIT INFO

GITORIOUS_ROOT=/var/www/gitorious.osdev.co.th/gitorious
echo  `date` " Starting git-poller" &amp;gt;&amp;gt; "$GITORIOUS_ROOT/log/git-poller.log"
/bin/su -- git -c " cd $GITORIOUS_ROOT; RAILS_ENV=production script/poller $@"

&lt;/pre&gt;&lt;b&gt;สร้าง init script ไฟล์ stomp&lt;/b&gt;&lt;br /&gt;
&lt;pre class="brush:bash"&gt;vim /etc/init.d/stomp&lt;/pre&gt;&lt;pre class="brush:bash"&gt;#!/bin/sh
# Start/stop the stompserver
# WATCH THE LINE WRAPPING BELOW
### BEGIN INIT INFO
# Provides: stomp
# Required-Start: $local_fs $remote_fs $network $syslog
# Required-Stop:
# Default-Start: 2 3 4 5
# Default-Stop: 1
# Short-Description: Stomp
# Description: Stomp
### END INIT INFO
test -f /usr/bin/stompserver || exit 0
. /lib/lsb/init-functions
case $1 in
start) log_daemon_msg Starting stompserver stompserver
start-stop-daemon --start --name stompserver --startas /usr/bin/stompserver \
--background --user git
log_end_msg $?
;;
stop) log_daemon_msg Stopping stompserver stompserver
start-stop-daemon --stop --name stompserver
log_end_msg $?
;;
restart) log_daemon_msg Restarting stompserver stompserver
start-stop-daemon --stop --retry 5 --name stompserver
start-stop-daemon --start --name stompserver --startas /usr/bin/stompserver \
--background --user git
log_end_msg $?
;;
status)
status_of_proc /usr/bin/stompserver stompserver &amp;amp;&amp;amp; exit 0 || exit $?
;;
*) log_action_msg Usage: /etc/init.d/stomp {start|stop|restart|status}
exit 2
;;
esac
exit 0
&lt;/pre&gt;&lt;b&gt;copy ไฟล์จาก gitorious ultrasphinx plugin ไปไว้ที่ aspell library&lt;/b&gt;&lt;br /&gt;
&lt;pre class="brush:bash"&gt;cp /var/www/gitorious.osdev.co.th/gitorious/vendor/plugins/ultrasphinx/examples/ap.multi /usr/lib/aspell/
&lt;/pre&gt;&lt;b&gt;สร้าง gitorious logrotate file&lt;/b&gt;&lt;br /&gt;
&lt;pre class="brush:bash"&gt;vim /etc/logrotate.d/gitorious
&lt;/pre&gt;โดยมี content &lt;br /&gt;
&lt;pre class="brush:bash"&gt;/var/www/gitorious.osdev.co.th/gitorious/log/*log {
missingok
notifempty
sharedscripts
postrotate
/etc/init.d/git-daemon restart &amp;gt; /dev/null 2&amp;gt;/dev/null || true
/etc/init.d/git-ultrasphinx restart &amp;gt; /dev/null 2&amp;gt;/dev/null || true
/bin/touch /var/www/gitorious.osdev.co.th/gitorious/tmp/restart.txt &amp;gt; /dev/null 2&amp;gt;/dev/null || true
endscript
}
&lt;/pre&gt;&lt;b&gt;สร้าง git system user&lt;/b&gt;&lt;br /&gt;
&lt;pre class="brush:bash"&gt;adduser --system --home /home/git/ --group --shell /bin/bash g
chown -R git:git /home/git
passwd git #ใส่ password ตามต้องการ
sudo usermod -a -G git www-data
sudo chown -R git:git /var/www/gitorious.osdev.co.th
&lt;/pre&gt;&lt;b&gt;set init script ให้รันเมื่อ start up&lt;/b&gt;&lt;br /&gt;
&lt;pre class="brush:bash"&gt;cd /var/www/gitorious.osdev.co.th/gitorious
chown -R git:git config/environment.rb script/poller log tmp
chmod -R g+w config/environment.rb script/poller log tmp
chmod ug+x script/poller

chown git:git /etc/init.d/git-ultrasphinx
chown git:git /etc/init.d/git-daemon
chown git:git /etc/init.d/stomp
chown git:git /etc/init.d/git-poller
chmod 755 /etc/init.d/git-ultrasphinx
chmod 755 /etc/init.d/git-daemon
chmod 755 /etc/init.d/stomp
chmod 755 /etc/init.d/git-poller
update-rc.d stomp defaults
update-rc.d git-daemon defaults
update-rc.d git-ultrasphinx defaults
update-rc.d git-poller defaults
&lt;/pre&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt; Config Apache2&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt; ติดตั้ง passenger module สำหรับ apache&lt;/b&gt;&lt;br /&gt;
&lt;pre class="brush:bash"&gt;/var/lib/gems/1.8/bin/passenger-install-apache2-module
&lt;/pre&gt;&lt;b&gt;สร้างไฟล์ passenger.load สำหรับ module ของ apache&lt;/b&gt;&lt;br /&gt;
&lt;pre class="brush:bash"&gt;vim /etc/apache2/mods-available/passenger.load&lt;/pre&gt;โดยมี content (ส่วนนี้อาจเปลี่ยนไปตาม passenger version)&lt;br /&gt;
&lt;pre class="brush:bash"&gt;LoadModule passenger_module /usr/lib/ruby/gems/1.8/gems/passenger-3.0.8/ext/apache2/mod_passenger.so
PassengerRoot /usr/lib/ruby/gems/1.8/gems/passenger-3.0.8
PassengerRuby /usr/bin/ruby1.8
&lt;/pre&gt;&lt;b&gt;Enable module ที่จำเป็น&lt;/b&gt;&lt;br /&gt;
&lt;pre class="brush:bash"&gt;/usr/sbin/a2enmod passenger
/usr/sbin/a2enmod rewrite
/usr/sbin/a2enmod ssl
&lt;/pre&gt;&lt;b&gt;Enable SSL site&lt;/b&gt;&lt;br /&gt;
&lt;pre class="brush:bash"&gt;/usr/sbin/a2ensite default-ssl
&lt;/pre&gt;&lt;b&gt;Restart Apache&lt;/b&gt;&lt;br /&gt;
&lt;pre class="brush:bash"&gt;/etc/init.d/apache2 restart
&lt;/pre&gt;&lt;b&gt;สร้าง site gitorious&lt;/b&gt;&lt;br /&gt;
&lt;pre class="brush:bash"&gt;vim /etc/apache2/sites-available/gitorious&lt;/pre&gt;&lt;pre class="brush:bash"&gt;&lt;virtualhost *:80=""&gt;
ServerName gitorious.osdev.co.th
DocumentRoot /var/www/gitorious.bluequartz.net/gitorious/public

# Enable X-SendFile for gitorious repo archiving to work
XSendFile on
XSendFileAllowAbove on

# Possible values include: debug, info, notice, warn, error, crit,
# alert, emerg.
LogLevel warn
#
# The following directives define some format nicknames for use with
# a CustomLog directive (see below).
#
LogFormat "%h %l %u %t \"%r\" %&amp;gt;s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %&amp;gt;s %b" common
LogFormat "%{Referer}i -&amp;gt; %U" referer
LogFormat "%{User-agent}i" agent

CustomLog /var/log/apache2/gitorious_access.log combined
TransferLog /var/log/apache2/gitorious_access.log
ErrorLog /var/log/apache2/gitorious_error.log
&lt;/virtualhost&gt;
&lt;/pre&gt;&lt;b&gt;สร้าง site gitorious-ssl&lt;/b&gt;&lt;br /&gt;
&lt;pre class="brush:bash"&gt;vim /etc/apache2/sites-available/gitorious-ssl&lt;/pre&gt;&lt;pre class="brush:bash"&gt;&lt;ifmodule mod_ssl.c=""&gt;
&lt;virtualhost _default_:443=""&gt;
SSLEngine on
SSLCertificateFile /etc/ssl/certs/ssl-cert-snakeoil.pem
SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key
BrowserMatch ".*MSIE.*" nokeepalive ssl-unclean-shutdown downgrade-1.0 force-response-1.0
DocumentRoot /var/www/gitorious.osdev.co.th/gitorious/public

# Possible values include: debug, info, notice, warn, error, crit,
# alert, emerg.
LogLevel warn
#
# The following directives define some format nicknames for use with
# a CustomLog directive (see below).
#
LogFormat "%h %l %u %t \"%r\" %&amp;gt;s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %&amp;gt;s %b" common
LogFormat "%{Referer}i -&amp;gt; %U" referer
LogFormat "%{User-agent}i" agent

CustomLog /var/log/apache2/gitorious_ssl_access.log combined
TransferLog /var/log/apache2/gitorious_ssl_access.log
ErrorLog /var/log/apache2/gitorious_ssl_error.log&lt;/virtualhost&gt;&lt;/ifmodule&gt;
&lt;/pre&gt;&lt;b&gt;Disable default SSL site และ enable the Gitorious sites&lt;/b&gt;&lt;br /&gt;
&lt;pre class="brush:bash"&gt;/usr/sbin/a2dissite default
/usr/sbin/a2dissite default-ssl
/usr/sbin/a2ensite gitorious
/usr/sbin/a2ensite gitorious-ssl
&lt;/pre&gt;&lt;b&gt;สร้าง repository directory &lt;/b&gt;&lt;br /&gt;
&lt;pre class="brush:bash"&gt;su git
cd ~
mkdir .ssh
touch .ssh/authorized_keys
chmod 700 .ssh
chmod 600 .ssh/authorized_keys
mkdir repositories
mkdir tarballs
mkdir tarballs-work
chmod ug+rwx repositories
echo "export PATH=$PATH:/var/www/gitorious.osdev.co.th/gitorious/script" &amp;gt; ~/.bashrc
&lt;/pre&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;&lt;b&gt;Configure Gitorious&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;div&gt;&lt;pre class="brush:bash"&gt;cd /var/www/gitorious.osdev.co.th/gitorious
mkdir tmp/pids
cp config/database.sample.yml config/database.yml
cp config/gitorious.sample.yml config/gitorious.yml
cp config/broker.yml.example config/broker.yml
&lt;/pre&gt;&lt;b&gt;แก้ไขไฟล์ config/gitorious.yml&lt;/b&gt;&lt;br /&gt;
&lt;pre class="brush:bash"&gt;vim /var/www/gitorious.osdev.co.th/gitorious/config/gitorious.yml
&lt;/pre&gt;&lt;pre class="brush:bash"&gt;#  Remove every section but production
# Be sure if you paste a generated secret key using apg -m 64 that you clean up
# any line breaks. The secret key that is pasted should be on a SINGLE line.
production:

# ให้รันคำสั่ง apg -m 64 แล้วนำผลลัพธ์ที่ได้มา paste ที่ cookie_secret
cookie_secret: urbecpajicEvpigdiOlqueDracpevyerbEmDecetsendeehurEjShucJox8Ojit4WaWrinyienderdalyaifugNeahatdashyunnamFucwerdolfyedyeactEjEajIb5IksEytkurewsEetAiwirtEkfedtheebyatNoganyoofBabikOcyemEshvovHasojTropsyengyegidzyggEdamCasdijHegdeasfudCovmenpobdywajcycsuchDabr2NadUlHighEisyoilmojliawgOdAcyimpifCaiWumtangEvzueshjajOtFuciddEbWhoivedesjetockVemOdEvnooquoncoapCaQuavnelkoijfudcatfezUlreylbUd

# The path where git repositories are stored. The actual (bare) repositories resides
# in repository_base_path/#{project.slug}/#{repository.name}.git/:
repository_base_path: "/home/git/repositories"

# Stuff that's in the html . custom stats javascript code etc
extra_html_head_data:

# System message that will appear on all pages if present
system_message:

# Port the ./script/gitorious script should use which should be
# the same port that the web server is running on. In Some development
# environments you may see 3000 for the value. For production
# servers you should use the same port as your web server.
gitorious_client_port: 80

# Host the ./script/gitorious script should use:
gitorious_client_host: gitorious.bluequartz.net

# Host which is serving the gitorious app, eg "gitorious.org"
gitorious_host: gitorious.bluequartz.net

# System User which is running git daemon
gitorious_user: git

# Email spam on server errors to:
# You probably want this during development or when you are trying to debug
# an installation that is not working correctly.
exception_notification_emails: mike.jackson@bluequartz.net

# Mangle visible e-mail addresses (spam protection)
mangle_email_addresses: true

# Enable or Disable Public Mode (true) or Private Mode (false)
public_mode: true

# Define your locale
locale: en

# Where should we store generated tarballs?
# (should be readable by webserver, since we tell it to send the file using X-Sendfile)
archive_cache_dir: "/Users/git/tarballs"

# Which directory should we work in when we generate tarballs, before moving
# them to the above dir?
archive_work_dir: "/Users/git/tarballs-work"

# is it only site admins who can create new projects?
only_site_admins_can_create_projects: false

# Should we hide HTTP clone urls?
hide_http_clone_urls: false

# Is this gitorious.org? Read: should we have a very flashy homepage?
is_gitorious_dot_org: false

# Pick a default license
#default_license: GNU Affero General Public License (AGPLv3)
&lt;/pre&gt;&lt;b&gt;แก้ไขไฟล์ config/database.yml&lt;/b&gt;&lt;br /&gt;
&lt;pre class="brush:bash"&gt;vim /var/www/gitorious.osdev.co.th/gitorious/config/database.yml
&lt;/pre&gt;&lt;pre class="brush:bash"&gt;# Remove every section but production
# Make sure the 'production' section is the following
production:
adapter: mysql
database: gitorious
username: git
password: [secret]
host: localhost
encoding: utf8
reconnect = true
&lt;/pre&gt;&lt;b&gt;สร้าง SQL User&lt;/b&gt;&lt;br /&gt;
&lt;pre class="brush:bash"&gt;su git
mysql -uroot -p
mysql&amp;gt; CREATE USER 'git'@'localhost' IDENTIFIED BY '******';
mysql&amp;gt; GRANT ALL PRIVILEGES ON * . * TO  'git'@'localhost' IDENTIFIED BY  '******' WITH GRANT OPTION MAX_QUERIES_PER_HOUR 0 MAX_CONNECTIONS_PER_HOUR 0 MAX_UPDATES_PER_HOUR 0 MAX_USER_CONNECTIONS 0;
mysql&amp;gt; GRANT ALL PRIVILEGES ON `gitorious` .* TO 'git'@'localhost';
mysql&amp;gt; quit
&lt;/pre&gt;&lt;b&gt;Create the Gitorious Databases&lt;/b&gt;&lt;br /&gt;
ให้ใช้ user root ไปที่ cd /var/www/gitorious.osdev.co.th/gitorious แล้วรันคำสั่ง&lt;br /&gt;
&lt;pre class="brush:bash"&gt;bundle install
&lt;/pre&gt;จากนั้นให้ใช้ user git รันคำสั่ง&lt;br /&gt;
&lt;pre class="brush:bash"&gt;su git
cd /var/www/
chmod go-w gitorious.osdev.co.th
cd gitorious.osdev.co.th/gitorious
vim Rakefile
&lt;/pre&gt;ให้เพิ่ม require 'thread' เข้าไปด้านบนสุดของส่วน require&lt;br /&gt;
&lt;pre class="brush:bash"&gt;bundle exec rake db:create RAILS_ENV=production
bundle exec rake db:migrate RAILS_ENV=production
&lt;/pre&gt;&lt;b&gt;สร้าง Gitorious Admin User&lt;/b&gt;&lt;br /&gt;
&lt;pre class="brush:bash"&gt;cd /var/www/gitorious.osdev.co.th/gitorious
vim vendor/rails/activesupport/lib/active_support.rb
&lt;/pre&gt;ให้เพิ่มส่วน require 'thread' เข้าไปด้านบนสุดของส่วน require&lt;br /&gt;
&lt;pre class="brush:bash"&gt;env RAILS_ENV=production /usr/bin/ruby1.8 script/create_admin
&lt;/pre&gt;ให้ใส่ admin email และ password ที่ต้องการ&lt;br /&gt;
&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-size: large;"&gt;&lt;b&gt; Configure Sphinx Search Daemon&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;pre class="brush:bash"&gt;vim /var/www/gitorious.osdev.co.th/gitorious/config/ultrasphinx/default.base
&lt;/pre&gt;แก้ไขในส่วน&lt;br /&gt;
&lt;pre class="brush:bash"&gt;# Daemon options
searchd
{
# What interface the search daemon should listen on and where to store its logs
address = 0.0.0.0
port = 3312
.......
&lt;/pre&gt;ให้เป็น&lt;br /&gt;
&lt;pre class="brush:bash"&gt;# Daemon options
searchd
{
# What interface the search daemon should listen on and where to store its logs
address = localhost
port = 3312
.......
&lt;/pre&gt;&lt;b&gt;load configurations เข้าไปใน ruby files&lt;/b&gt;&lt;br /&gt;
&lt;pre class="brush:bash"&gt;cd /var/www/gitorious.osdev.co.th/gitorious
bundle exec rake ultrasphinx:bootstrap RAILS_ENV=production
bundle exec rake ultrasphinx:spelling:build RAILS_ENV=production
&lt;/pre&gt;&lt;b&gt;Set permissions อีกครั้งเพื่อความชัวร์&lt;/b&gt;&lt;br /&gt;
&lt;pre class="brush:bash"&gt;cd /var/www/gitorious.osdev.co.th/gitorious
chown -R git:git config/environment.rb script/poller log tmp
chmod -R g+w config/environment.rb script/poller log tmp
chmod ug+x script/poller
&lt;/pre&gt;&lt;b&gt;Setup Cron Job&lt;/b&gt;&lt;br /&gt;
&lt;pre class="brush:bash"&gt;su git
crontab -e
* */1 * * * cd /var/www/gitorious.bluequartz.net/gitorious &amp;amp;&amp;amp; rake ultrasphinx:index RAILS_ENV=production
&lt;/pre&gt;reference&amp;nbsp;&lt;a href="http://www.bluequartz.net/projects/EIM_Segmentation/SCMService/html/gitorious___ubuntu__setup.html"&gt;http://www.bluequartz.net/&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/57392424587537905-7693639155756513954?l=www.leknarm.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/6C-VC0x4QAZLn98I6duJsG4E1bM/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/6C-VC0x4QAZLn98I6duJsG4E1bM/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/6C-VC0x4QAZLn98I6duJsG4E1bM/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/6C-VC0x4QAZLn98I6duJsG4E1bM/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/leknarm/DRyy/~4/rE4x5G4n69s" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.leknarm.com/feeds/7693639155756513954/comments/default" title="ส่งความคิดเห็น" /><link rel="replies" type="text/html" href="http://www.leknarm.com/2011/08/install-gitorious-ubuntu-1004-lts.html#comment-form" title="0 ความคิดเห็น" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/57392424587537905/posts/default/7693639155756513954?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/57392424587537905/posts/default/7693639155756513954?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/leknarm/DRyy/~3/rE4x5G4n69s/install-gitorious-ubuntu-1004-lts.html" title="Install Gitorious บน Ubuntu 10.04 LTS" /><author><name>Tantai Thanakanok</name><uri>https://profiles.google.com/105761820717326472079</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-jkl-QXkcHk0/AAAAAAAAAAI/AAAAAAAAAAA/_z7XmYxSV_c/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://www.leknarm.com/2011/08/install-gitorious-ubuntu-1004-lts.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUYMQXkzeip7ImA9WhdSEE0.&quot;"><id>tag:blogger.com,1999:blog-57392424587537905.post-8967554828795370510</id><published>2011-07-18T22:33:00.000+07:00</published><updated>2011-07-18T22:33:00.782+07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-07-18T22:33:00.782+07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="thai" /><category scheme="http://www.blogger.com/atom/ns#" term="OpenOffice.org" /><category scheme="http://www.blogger.com/atom/ns#" term="แปลงเลขไทย" /><category scheme="http://www.blogger.com/atom/ns#" term="Osdev" /><category scheme="http://www.blogger.com/atom/ns#" term="OpenOffice" /><category scheme="http://www.blogger.com/atom/ns#" term="convert digit" /><category scheme="http://www.blogger.com/atom/ns#" term="แปลงเลข" /><category scheme="http://www.blogger.com/atom/ns#" term="convert thai number" /><category scheme="http://www.blogger.com/atom/ns#" term="LibreOffice" /><category scheme="http://www.blogger.com/atom/ns#" term="convert" /><title>แปลงเลขอาราบิกให้เป็นเลขไทยใน LibreOffice/OpenOffice.org</title><content type="html">จาก post &lt;a href="http://www.leknarm.com/2010/10/openofficeorg-writer.html%20"&gt;http://www.leknarm.com/2010/10/openofficeorg-writer.html&lt;/a&gt; ผมได้เขียนมาโครง่ายๆ และได้ทำเป็น extension ไว้ให้ลองเล่นกันแล้ว แต่ว่ามี bug อยู่จำนวนมาก และจากงาน OpenOffice.org Codefest#9 ก็ได้มีเพื่อนๆ ช่วยกันพัฒนา extension นี้จนสมบูรณ์ขึ้นมา&lt;br /&gt;
&lt;br /&gt;
แต่ระหว่างที่ผมกำลัง review และปรับปรุง extension อยู่นั้นก็ได้เกิดเหตุการที่ไม่คาดฝันขึ้น มีบุคคลนึงเอา extension จาก post ที่กล่าวมาเอาไป publish ที่ OpenOffice.org Extensions เฉยเลย &lt;br /&gt;
http://extensions.services.openoffice.org/en/project/thai-number-converter (ไม่ขอทำเป็น link นะครับเพราะ SEO) น่าเศร้าใจเป็นที่สุด&lt;br /&gt;
&lt;br /&gt;
แต่ตอนนี้ทางทีมก็ได้ publish extension ที่แก้ไขและปรับปรุงเรียบร้อยแล้วไว้ที่ &lt;a href="http://extensions.services.openoffice.org/project/convertdigit"&gt;http://extensions.services.openoffice.org/project/convertdigit&lt;/a&gt; ทุกท่านสามารถ download และทดลองใช้ได้เลยครับ หากมี bug หรือ comment ในส่วนไหนสามารถ comment ได้ที่ extension หรือที่ blog นี้ก็ได้ครับ&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/57392424587537905-8967554828795370510?l=www.leknarm.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/6MAE-EmOfRCUgJ9-aLYXirTkVe4/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/6MAE-EmOfRCUgJ9-aLYXirTkVe4/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/6MAE-EmOfRCUgJ9-aLYXirTkVe4/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/6MAE-EmOfRCUgJ9-aLYXirTkVe4/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/leknarm/DRyy/~4/3SzYPmJgdM4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.leknarm.com/feeds/8967554828795370510/comments/default" title="ส่งความคิดเห็น" /><link rel="replies" type="text/html" href="http://www.leknarm.com/2011/07/libreofficeopenofficeorg.html#comment-form" title="0 ความคิดเห็น" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/57392424587537905/posts/default/8967554828795370510?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/57392424587537905/posts/default/8967554828795370510?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/leknarm/DRyy/~3/3SzYPmJgdM4/libreofficeopenofficeorg.html" title="แปลงเลขอาราบิกให้เป็นเลขไทยใน LibreOffice/OpenOffice.org" /><author><name>Tantai Thanakanok</name><uri>https://profiles.google.com/105761820717326472079</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-jkl-QXkcHk0/AAAAAAAAAAI/AAAAAAAAAAA/_z7XmYxSV_c/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://www.leknarm.com/2011/07/libreofficeopenofficeorg.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkEEQXs_cSp7ImA9WhdXF0g.&quot;"><id>tag:blogger.com,1999:blog-57392424587537905.post-3866908081605744054</id><published>2011-05-19T15:59:00.003+07:00</published><updated>2011-08-31T09:43:20.549+07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-08-31T09:43:20.549+07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="embedded" /><category scheme="http://www.blogger.com/atom/ns#" term="drupal" /><category scheme="http://www.blogger.com/atom/ns#" term="embed" /><category scheme="http://www.blogger.com/atom/ns#" term="view" /><title>การ embedded view ลงใน content บน drupal</title><content type="html">โจทย์คือต้องการแสดงผลของ view หลายๆ view ในหน้าเดียวจะทำอย่างไร?&lt;br /&gt;
&lt;br /&gt;
ก่อนอื่นผมได้ลองหา module เกี่ยวกับการ embedded view แล้วหาเท่าไรก็หาไม่เจอ ที่เจอก็ใช้ยากหรือใช้ไม่ได้เลย คราวนี้ก็เลยต้องมาหา API ในการเรียกใช้มันแทน ปรากฏว่าง่ายกว่าที่คิดเยอะ ทำให้รู้เลยว่าทำไมเขาไม่ทำเป็น module กัน&lt;br /&gt;
&lt;br /&gt;
วิธีการ embedded มีดังนี้&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush: php"&gt;&amp;lt;?php
&amp;nbsp; $viewName = 'viewname';
&amp;nbsp; print views_embed_view($viewName);
?&amp;gt;&lt;/pre&gt;&lt;br /&gt;
แค่นี้เราก็สามารถ embedded view เข้าไปใน page หรือ story ได้แล้วครับ&lt;br /&gt;
&lt;br /&gt;
ที่มา - &lt;a href="http://thedrupalblog.com/embedding-view-drupal-6-using-views-embed-view"&gt;thedrupalblog.com&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/57392424587537905-3866908081605744054?l=www.leknarm.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/s4AYZ3JJDjDZ80FxOcyX5LN39mo/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/s4AYZ3JJDjDZ80FxOcyX5LN39mo/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/s4AYZ3JJDjDZ80FxOcyX5LN39mo/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/s4AYZ3JJDjDZ80FxOcyX5LN39mo/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/leknarm/DRyy/~4/94RyKvTw9vQ" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.leknarm.com/feeds/3866908081605744054/comments/default" title="ส่งความคิดเห็น" /><link rel="replies" type="text/html" href="http://www.leknarm.com/2011/05/embedded-view-content-drupal.html#comment-form" title="0 ความคิดเห็น" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/57392424587537905/posts/default/3866908081605744054?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/57392424587537905/posts/default/3866908081605744054?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/leknarm/DRyy/~3/94RyKvTw9vQ/embedded-view-content-drupal.html" title="การ embedded view ลงใน content บน drupal" /><author><name>Tantai Thanakanok</name><uri>https://profiles.google.com/105761820717326472079</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-jkl-QXkcHk0/AAAAAAAAAAI/AAAAAAAAAAA/_z7XmYxSV_c/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://www.leknarm.com/2011/05/embedded-view-content-drupal.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUEMQH8_fCp7ImA9WhZWEEU.&quot;"><id>tag:blogger.com,1999:blog-57392424587537905.post-1786756954032456727</id><published>2011-05-11T11:21:00.000+07:00</published><updated>2011-05-11T11:21:21.144+07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-05-11T11:21:21.144+07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="extension" /><category scheme="http://www.blogger.com/atom/ns#" term="Menubar" /><category scheme="http://www.blogger.com/atom/ns#" term="MergePoint" /><category scheme="http://www.blogger.com/atom/ns#" term="UNO function" /><category scheme="http://www.blogger.com/atom/ns#" term="extensions" /><category scheme="http://www.blogger.com/atom/ns#" term="DispatchHelper" /><category scheme="http://www.blogger.com/atom/ns#" term="เมนู" /><category scheme="http://www.blogger.com/atom/ns#" term="Merging" /><category scheme="http://www.blogger.com/atom/ns#" term="Toolbar" /><category scheme="http://www.blogger.com/atom/ns#" term="Merge" /><category scheme="http://www.blogger.com/atom/ns#" term="UNO" /><category scheme="http://www.blogger.com/atom/ns#" term="ลิเบอร์" /><category scheme="http://www.blogger.com/atom/ns#" term="LibreOffice" /><title>การทำ Menu/Toolbar Merging บน LibreOffice</title><content type="html">จาก&amp;nbsp;&lt;a href="http://www.leknarm.com/2009/07/openofficeorg-menubar-merging.html"&gt;http://www.leknarm.com/2009/07/openofficeorg-menubar-merging.html&lt;/a&gt;&amp;nbsp;ผมได้เขียนวิธีการทำ Menubar/Toolbar Merging ไว้แต่การที่จะกำหนด MergePoint ได้นั้นจะต้องรู้ก่อนว่า Menubar นั้นๆ หรือ Toolbar นั้นๆ มี UNO function ชื่อว่าอะไร&lt;br /&gt;
&lt;br /&gt;
แต่ document เกี่ยวกับ UNO function หรือ DispatchHelper นั้นหาได้ยากยิ่ง &lt;a href="http://sites.google.com/site/leknarm/files/HOW-TOUseDispatchHelper%28ru%29.odt?attredirects=0&amp;amp;d=1"&gt;UNO function Russian document&lt;/a&gt; (ยิ่งกว่าหา M$ เถื่อน) และถึงจะหามาได้ก็ไม่รู้อยู่ดีว่า UNO function ที่ได้มานั้นเป็นการทำงานส่วนไหน&lt;br /&gt;
&lt;br /&gt;
ถ้าการหา document นั้นมันยากเราก็เข้าไปดูใน LibreOffice เลยสิเพราะเนื่องจากโครงสร้างของ Menu/Toolbar ของ LibreOffice นั้นเป็นลักษณะ xml ที่ Override กันอยู่เป็นชั้นๆ ซึ่งลองหาดูก็พบ Menu/Toolbar configuration อยู่ที่ LibO_HOME/Basis/share/config/soffice.cfg/modules/[program]&lt;br /&gt;
&lt;br /&gt;
หากลองเข้าไปดูจะเห็นโครงสร้างของ Menu/Toolbar เป็นชั้นๆ ซึ่งเราสามารถนำ UNO function ที่กำหนดอยู่ในนั้นมากำหนดเป็น MergePoint ใน extensions เราได้เลยครับ&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/57392424587537905-1786756954032456727?l=www.leknarm.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/GdvYrJDDCS2bA9ASvapae1H3D4Q/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/GdvYrJDDCS2bA9ASvapae1H3D4Q/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/GdvYrJDDCS2bA9ASvapae1H3D4Q/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/GdvYrJDDCS2bA9ASvapae1H3D4Q/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/leknarm/DRyy/~4/D21DTjBncZc" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.leknarm.com/feeds/1786756954032456727/comments/default" title="ส่งความคิดเห็น" /><link rel="replies" type="text/html" href="http://www.leknarm.com/2011/05/menutoolbar-merging-libreoffice.html#comment-form" title="0 ความคิดเห็น" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/57392424587537905/posts/default/1786756954032456727?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/57392424587537905/posts/default/1786756954032456727?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/leknarm/DRyy/~3/D21DTjBncZc/menutoolbar-merging-libreoffice.html" title="การทำ Menu/Toolbar Merging บน LibreOffice" /><author><name>Tantai Thanakanok</name><uri>https://profiles.google.com/105761820717326472079</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-jkl-QXkcHk0/AAAAAAAAAAI/AAAAAAAAAAA/_z7XmYxSV_c/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://www.leknarm.com/2011/05/menutoolbar-merging-libreoffice.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkAFQ30_eCp7ImA9WhdXF0g.&quot;"><id>tag:blogger.com,1999:blog-57392424587537905.post-1213121652571491028</id><published>2011-04-18T15:34:00.001+07:00</published><updated>2011-08-31T09:45:12.340+07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-08-31T09:45:12.340+07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="mysql" /><category scheme="http://www.blogger.com/atom/ns#" term="search" /><category scheme="http://www.blogger.com/atom/ns#" term="replace" /><title>การ search &amp; replace ใน MySQL</title><content type="html">เผอิญต้อง search &amp;amp; replace ใน MySQL เลยไปค้นดูปรากฏว่าใช้แค่บรรทัดเดียวคือ&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush: sql"&gt;update [table_name] set [field_name] = replace([field_name],'[string_to_find]','[string_to_replace]');&lt;/pre&gt;&lt;br /&gt;
ที่มา &lt;a href="http://www.mediacollege.com/computer/database/mysql/find-replace.html"&gt;mediacollege&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/57392424587537905-1213121652571491028?l=www.leknarm.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/1I80xkDRMwsJApFxqL7RwDvFBNc/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/1I80xkDRMwsJApFxqL7RwDvFBNc/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/1I80xkDRMwsJApFxqL7RwDvFBNc/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/1I80xkDRMwsJApFxqL7RwDvFBNc/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/leknarm/DRyy/~4/uys0Xn8_U-Y" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.leknarm.com/feeds/1213121652571491028/comments/default" title="ส่งความคิดเห็น" /><link rel="replies" type="text/html" href="http://www.leknarm.com/2011/04/search-replace-mysql.html#comment-form" title="0 ความคิดเห็น" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/57392424587537905/posts/default/1213121652571491028?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/57392424587537905/posts/default/1213121652571491028?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/leknarm/DRyy/~3/uys0Xn8_U-Y/search-replace-mysql.html" title="การ search &amp; replace ใน MySQL" /><author><name>Tantai Thanakanok</name><uri>https://profiles.google.com/105761820717326472079</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-jkl-QXkcHk0/AAAAAAAAAAI/AAAAAAAAAAA/_z7XmYxSV_c/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://www.leknarm.com/2011/04/search-replace-mysql.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0YMSHw9cCp7ImA9Wx9bFU8.&quot;"><id>tag:blogger.com,1999:blog-57392424587537905.post-2428779795486886547</id><published>2011-02-24T12:26:00.000+07:00</published><updated>2011-02-24T12:26:29.268+07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-02-24T12:26:29.268+07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="thai" /><category scheme="http://www.blogger.com/atom/ns#" term="labellion" /><category scheme="http://www.blogger.com/atom/ns#" term="label" /><category scheme="http://www.blogger.com/atom/ns#" term="dhas" /><title>Thai labels for LibreOffice และ OpenOffice.org</title><content type="html">วันนี้ขอมาเขียนสั้นๆ ครับเนื่องจากได้เคยทำ extensions label ไว้นานแล้ว เป็น extensions ที่ติดตั้ง size กระดาษที่เป็น label ที่มีขายอยู่ในประเทศไทย สามารถ download ได้จาก&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://extensions.services.openoffice.org/project/thailabels"&gt;http://extensions.services.openoffice.org/project/thailabels&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
ซึ่งที่ได้ทำไปมีอยู่ 2 ยี่ห้อครับคือ labellion และตราช้างนะครับ&lt;br /&gt;
ลองเอาไป download ใช้กันดูนะครับ&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/57392424587537905-2428779795486886547?l=www.leknarm.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/AXHIezglk_ZMUu2kQJR9eXVxZSk/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/AXHIezglk_ZMUu2kQJR9eXVxZSk/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/AXHIezglk_ZMUu2kQJR9eXVxZSk/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/AXHIezglk_ZMUu2kQJR9eXVxZSk/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/leknarm/DRyy/~4/sf6T5Vs3Ipg" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.leknarm.com/feeds/2428779795486886547/comments/default" title="ส่งความคิดเห็น" /><link rel="replies" type="text/html" href="http://www.leknarm.com/2011/02/thai-labels-for-libreoffice.html#comment-form" title="0 ความคิดเห็น" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/57392424587537905/posts/default/2428779795486886547?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/57392424587537905/posts/default/2428779795486886547?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/leknarm/DRyy/~3/sf6T5Vs3Ipg/thai-labels-for-libreoffice.html" title="Thai labels for LibreOffice และ OpenOffice.org" /><author><name>Tantai Thanakanok</name><uri>https://profiles.google.com/105761820717326472079</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-jkl-QXkcHk0/AAAAAAAAAAI/AAAAAAAAAAA/_z7XmYxSV_c/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://www.leknarm.com/2011/02/thai-labels-for-libreoffice.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUcMRH4zfyp7ImA9Wx9UEEo.&quot;"><id>tag:blogger.com,1999:blog-57392424587537905.post-2495043267596631</id><published>2011-02-07T17:04:00.000+07:00</published><updated>2011-02-07T17:04:45.087+07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-02-07T17:04:45.087+07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="java openoffice.org" /><category scheme="http://www.blogger.com/atom/ns#" term="debug" /><category scheme="http://www.blogger.com/atom/ns#" term="ooo" /><category scheme="http://www.blogger.com/atom/ns#" term="libo" /><category scheme="http://www.blogger.com/atom/ns#" term="LibreOffice" /><title>วิธีการ debug LibreOffice/OpenOffice.org ด้วย Visual Studio</title><content type="html">การ debug LibO หรือ OOo บน Windows นั้นมีอยู่หลายวิธีด้วยกันแต่ผมจะขอนำวิธีการใช้ Visual Studio มาเล่าให้ฟังละกันครับ เพราะว่ามันสามารถตอบโจทย์การ debug ครั้งนี้ได้&lt;br /&gt;
&lt;br /&gt;
ขอเล่าวิธีการทั่วไปหากต้องการ debug ก่อนครับ ก่อนอื่นหากเราต้องการ debug code ในส่วนใดเราจำเป็นต้อง build module นั้นๆ ด้วย parameter debug=true ก่อนแล้ว copy output ไปไว้ที่ LibO/OOo Installation folder (copy &amp;lt;module name&amp;gt;/&amp;lt;output folder&amp;gt;/bin/*.dll ไปไว้ที่ &amp;lt;LibO Root&amp;gt;/program/)&lt;br /&gt;
&lt;br /&gt;
โจทย์ในครั้งนี้คือ ต้อง debug code ในส่วนตอนเริ่มโปรแกรม ซึ่งการ Attach to process ธรรมดาไม่สามารถใช้งานได้ เนื่องจากกว่าเราจะได้ Attach to process, program มันก็ถูกรันไปเรียบร้อยแล้ว&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
อีกทั้ง LibO และ OOo ตัว binary จริงๆ นั้นไม่ใช่ exe ไฟล์แต่เป็น bin(soffice.bin) ซึ่งตามปรกติแล้ว Visual Studio ไม่สามารถเปิดไฟล์ชนิดดังกล่าวได้ ดังนั้นเราจึงจำเป็นต้อง rename soffice.bin ให้กลายเป็น .exe ซะหรือจะใส่นามสกุลเพิ่มไปเลยก็ได้ (soffice.bin.exe)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
จากนั้นให้ไปเพิ่ม path ที่จำเป็นเข้าไปใน Windows ด้วยซึ่ง path ที่ต้องเพิ่มมีดังนี้&lt;br /&gt;
&lt;ol&gt;&lt;li&gt;&amp;lt;LibO Root&amp;gt;\URE\bin&lt;/li&gt;
&lt;li&gt;&amp;lt;LibO Root&amp;gt;\Basis\program&lt;/li&gt;
&lt;/ol&gt;เมื่อเพิ่ม path เรียบร้อยแล้ว ก็สามารถ debug ได้ตามปรกติเลยครับ&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/57392424587537905-2495043267596631?l=www.leknarm.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/5ZSYUJUcMt2-VVUb9RbyyCwNZbk/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/5ZSYUJUcMt2-VVUb9RbyyCwNZbk/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/5ZSYUJUcMt2-VVUb9RbyyCwNZbk/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/5ZSYUJUcMt2-VVUb9RbyyCwNZbk/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/leknarm/DRyy/~4/QEKMmNogoRI" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.leknarm.com/feeds/2495043267596631/comments/default" title="ส่งความคิดเห็น" /><link rel="replies" type="text/html" href="http://www.leknarm.com/2011/02/debug-libreofficeopenofficeorg-visual.html#comment-form" title="0 ความคิดเห็น" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/57392424587537905/posts/default/2495043267596631?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/57392424587537905/posts/default/2495043267596631?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/leknarm/DRyy/~3/QEKMmNogoRI/debug-libreofficeopenofficeorg-visual.html" title="วิธีการ debug LibreOffice/OpenOffice.org ด้วย Visual Studio" /><author><name>Tantai Thanakanok</name><uri>https://profiles.google.com/105761820717326472079</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-jkl-QXkcHk0/AAAAAAAAAAI/AAAAAAAAAAA/_z7XmYxSV_c/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://www.leknarm.com/2011/02/debug-libreofficeopenofficeorg-visual.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEUNSHYyeyp7ImA9Wx9VGE0.&quot;"><id>tag:blogger.com,1999:blog-57392424587537905.post-506367979304345872</id><published>2011-02-04T13:39:00.003+07:00</published><updated>2011-02-04T13:51:39.893+07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-02-04T13:51:39.893+07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="ตัวอักษรซ้อน" /><category scheme="http://www.blogger.com/atom/ns#" term="OpenOffice.org" /><category scheme="http://www.blogger.com/atom/ns#" term="vista" /><category scheme="http://www.blogger.com/atom/ns#" term="windows" /><category scheme="http://www.blogger.com/atom/ns#" term="LibreOffice" /><category scheme="http://www.blogger.com/atom/ns#" term="7" /><title>แก้ปัญหา Font ภาษาไทยซ้อนกันบน OpenOffice.org และ LibreOffice</title><content type="html">จากปัญหา &lt;a href="http://www.leknarm.com/2009/11/openofficeorg-calc-windows-7.html"&gt;http://www.leknarm.com/2009/11/openofficeorg-calc-windows-7.html&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
จากตอนแรกเดาปัญหาว่าเกิดจากการที่ตัว OpenOffice.org หรือ LibreOffice เมื่อใช้งาน UI font ของ Windows จะทำให้แสดงผลได้ผิดพลาดเนื่องจาก font ที่ใช้เป็น UI ของ Windows นั้นไม่มี gryph ไทยซึ่งก็จริงตามนั้น แต่หากใน OOo หรือ LibO ไม่ได้ใช้ Use system font for user interface มันควรจะใช้ได้แต่ดันไม่ได้&lt;br /&gt;
&lt;br /&gt;
ปัญหาที่แท้จริงนั้นเกิดจาก default font ที่ใช้เป็น UI ของ OOo และ LibO นั้นใช้เป็น Andale Sans UI ซึ่งเป็น font ของ StarOffice แต่เนื่องจากเราไม่ได้ใช้ version StarOffice จึงทำให้เราไม่มี font ดังกล่าว&lt;br /&gt;
&lt;br /&gt;
ปัญหานี่สามารถแก้ไขได้ 2 วิธีคือ&lt;br /&gt;
&lt;ol&gt;&lt;li&gt;ไปแก้ที่ default font ใน project officecfg โดยให้ default font นั้นเป็น font อื่นที่มี gryph ครบทุกภาษา&lt;/li&gt;
&lt;li&gt;แก้ replacement table ซึ่งมีขั้นตอนดังนี้&lt;/li&gt;
&lt;ol&gt;&lt;li&gt;ไปที่เมนู Tools &amp;gt; Option &amp;gt; LibreOffice(OpenOffice.org) &amp;gt; Fonts&amp;nbsp;&lt;/li&gt;
&lt;li&gt;เลือก Apply replacement table แล้ว replace font จาก Andale Sans UI ไปเป็น Tahoma หรือ font อื่นๆ ที่ชอบ&amp;nbsp;&lt;/li&gt;
&lt;li&gt;แล้วกดเครื่องหมายถูกด้านขวาจะได้ font replace ไปอยู่ในกล่องด้านล่าง&lt;/li&gt;
&lt;li&gt;คลิกเครื่องหมายถูกหน้า Always แล้วกด OK&lt;/li&gt;
&lt;/ol&gt;&lt;/ol&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_9yLMwL5LCkk/TUuf5edRRoI/AAAAAAAAA1Q/6HyZI6c8lEc/s1600/font-replacement-table.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="170" src="http://1.bp.blogspot.com/_9yLMwL5LCkk/TUuf5edRRoI/AAAAAAAAA1Q/6HyZI6c8lEc/s320/font-replacement-table.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&amp;nbsp; &lt;br /&gt;
แค่นี้เราก็สามารถใช้งานภาษาไทยบน LibO และ OOo ได้อย่างมีความสุขแล้ว&lt;br /&gt;
&lt;br /&gt;
อ่อลืมบอกไป ต้องไม่ใช้ Use system font for user interface ด้วยนะครับโดยปิดที่&lt;br /&gt;
Tools &amp;gt; Option &amp;gt; LibreOffice &amp;gt; View แล้วเลือกเครื่องหมาถูกหน้า Use system font for user interface ออกครับ&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/57392424587537905-506367979304345872?l=www.leknarm.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/zB1PrJRbsAulW3w9Nc_fXFC1tdU/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/zB1PrJRbsAulW3w9Nc_fXFC1tdU/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/zB1PrJRbsAulW3w9Nc_fXFC1tdU/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/zB1PrJRbsAulW3w9Nc_fXFC1tdU/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/leknarm/DRyy/~4/qs_XNQ1_zgY" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.leknarm.com/feeds/506367979304345872/comments/default" title="ส่งความคิดเห็น" /><link rel="replies" type="text/html" href="http://www.leknarm.com/2011/02/font-openofficeorg-libreoffice.html#comment-form" title="2 ความคิดเห็น" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/57392424587537905/posts/default/506367979304345872?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/57392424587537905/posts/default/506367979304345872?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/leknarm/DRyy/~3/qs_XNQ1_zgY/font-openofficeorg-libreoffice.html" title="แก้ปัญหา Font ภาษาไทยซ้อนกันบน OpenOffice.org และ LibreOffice" /><author><name>Tantai Thanakanok</name><uri>https://profiles.google.com/105761820717326472079</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-jkl-QXkcHk0/AAAAAAAAAAI/AAAAAAAAAAA/_z7XmYxSV_c/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/_9yLMwL5LCkk/TUuf5edRRoI/AAAAAAAAA1Q/6HyZI6c8lEc/s72-c/font-replacement-table.png" height="72" width="72" /><thr:total>2</thr:total><feedburner:origLink>http://www.leknarm.com/2011/02/font-openofficeorg-libreoffice.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Ak4HSXwyeip7ImA9WhdXF0g.&quot;"><id>tag:blogger.com,1999:blog-57392424587537905.post-4483535258242177602</id><published>2011-01-28T10:57:00.002+07:00</published><updated>2011-08-31T09:48:58.292+07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-08-31T09:48:58.292+07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="git" /><category scheme="http://www.blogger.com/atom/ns#" term="build LibreOffice" /><category scheme="http://www.blogger.com/atom/ns#" term="g" /><category scheme="http://www.blogger.com/atom/ns#" term="LibreOffice" /><title>ระบบ Build ของ LibreOffice</title><content type="html">เนื่องจากได้ปล้ำกับ LibreOffice มาสัปดาห์นึง เพิ่งจะเข้าใจมัน(ถึงจะไม่หมดก็เหอะ) ก็เลยเอามา blog ไว้เผื่อท่านอื่นๆ จะได้เข้าใจบ้าง&lt;br /&gt;
&lt;br /&gt;
ใน LibreOffice นั้นมี wiki บอกวิธีการ build อยู่ที่ &lt;a href="http://wiki.documentfoundation.org/Development/Native_Build"&gt;http://wiki.documentfoundation.org/Development/Native_Build&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
โดยในส่วน getting the source นั้นเขียนไว้ดังนี้&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush: bash"&gt;$ mkdir git
$ cd git
$ git clone git://anongit.freedesktop.org/libreoffice/bootstrap libo
Cloning into libo...
Remote: Counting objects: 76845, done.
remote: Compressing objects: 100% (17328/17328), done.
remote: Total 76845 (delta 60786), reused 74045 (delta 58579)
Receiving objects: 100% (76845/76845), 15.82 MiB | 1.17 MiB/s, done.
Resolving deltas: 100% (60786/60786), done.
$ cd libo&lt;/pre&gt;&lt;br /&gt;
ถ้าดูจาก file size ที่ได้มา 15.82 MiB นั้นดูเหมือนจะน้อยเกินไปสำหรับ source code ของ LibreOffice ซึ่งในส่วนที่ get มานั้นเป็นแค่ bootstrap ของ LibreOffice เท่านั้น&lt;br /&gt;
&lt;br /&gt;
LibreOffice นั้นเก็บ source code ทั้งหมดไว้เป็น 19 repository หรือ 20 ถ้ารวมส่วนของ l10n ไปด้วยซึ่งถ้าจะ git ออกมาทีละ repo ก็สามารถทำได้ แต่ว่า LibreOffice นั้นมี shell script ที่สามารถดึง source code ทั้งหมดออกมาได้ทีเดียว เรียกว่า g&lt;br /&gt;
&lt;br /&gt;
ซึ่ง g ที่ว่านั้นอยุ่ใน bootstrap ที่เพิ่ง git ออกมานั่นเอง ทั้งนี้เมื่อเรา ได้ bootstrap มาแล้วเราสั่ง ./autogen.sh มันจะ check environment ทั้งหมดของเครื่องเราว่าสามารถที่จะ build LibreOffice ได้หรือไม่ และถ้าผ่านส่วนนั้นมาแล้ว มันจะไปเรียก g เพื่อ clone repository ทั้ง 19 repo มาไว้ที่เครื่องเราต่อไป&lt;br /&gt;
&lt;br /&gt;
ดังนั้น source code ทั้งหมดนั้นเราจะใช้ git ในการ checkout หรือทำงานเฉยๆ ไม่ได้เพราะว่ามันต้องทำทีละ 19 repo แต่จากที่บอกไว้ทีแรก เราใช้ g ในการทำงานแทนได้ เพราะ g จะทำงานเหมือนกับคำสั่ง git แต่ว่าทำให้ทั้ง 19 repo เลยทีเดียว&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/57392424587537905-4483535258242177602?l=www.leknarm.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/-2hKit9BZFD76YMhRD7l6GgCk1c/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/-2hKit9BZFD76YMhRD7l6GgCk1c/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/-2hKit9BZFD76YMhRD7l6GgCk1c/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/-2hKit9BZFD76YMhRD7l6GgCk1c/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/leknarm/DRyy/~4/OcY2ebHqXSI" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.leknarm.com/feeds/4483535258242177602/comments/default" title="ส่งความคิดเห็น" /><link rel="replies" type="text/html" href="http://www.leknarm.com/2011/01/build-libreoffice.html#comment-form" title="1 ความคิดเห็น" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/57392424587537905/posts/default/4483535258242177602?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/57392424587537905/posts/default/4483535258242177602?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/leknarm/DRyy/~3/OcY2ebHqXSI/build-libreoffice.html" title="ระบบ Build ของ LibreOffice" /><author><name>Tantai Thanakanok</name><uri>https://profiles.google.com/105761820717326472079</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-jkl-QXkcHk0/AAAAAAAAAAI/AAAAAAAAAAA/_z7XmYxSV_c/s512-c/photo.jpg" /></author><thr:total>1</thr:total><feedburner:origLink>http://www.leknarm.com/2011/01/build-libreoffice.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0YCQXk9fCp7ImA9WhdXF0g.&quot;"><id>tag:blogger.com,1999:blog-57392424587537905.post-3893624076194647904</id><published>2011-01-14T13:27:00.001+07:00</published><updated>2011-08-31T09:52:40.764+07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-08-31T09:52:40.764+07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="first-child" /><category scheme="http://www.blogger.com/atom/ns#" term="first" /><category scheme="http://www.blogger.com/atom/ns#" term="css selector" /><category scheme="http://www.blogger.com/atom/ns#" term="first child" /><category scheme="http://www.blogger.com/atom/ns#" term="css" /><title>First child CSS Selector</title><content type="html">วันนี้จะมาเขียนเรื่องการใช้งาน CSS Selector ในส่วนของ First child element ซึ่งหมายถึงการระบุว่าจะทำงานกับ element แรกเท่านั้นดังตัวอย่าง&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush:html"&gt;&amp;lt;html&amp;gt;
  &amp;lt;head&amp;gt;
    &amp;lt;title&amp;gt;CSS Selector&amp;lt;/title&amp;gt;
  &amp;lt;/head&amp;gt;
  &amp;lt;body&amp;gt;
    &amp;lt;div&amp;gt;
      &amp;lt;p&amp;gt;div1 line1&amp;lt;/p&amp;gt;
      &amp;lt;p&amp;gt;div1 line2&amp;lt;/p&amp;gt;
      &amp;lt;p&amp;gt;div1 line3&amp;lt;/p&amp;gt;
    &amp;lt;/div&amp;gt;
    &amp;lt;div&amp;gt;
      &amp;lt;p&amp;gt;div2 line1&amp;lt;/p&amp;gt;
      &amp;lt;p&amp;gt;div2 line2&amp;lt;/p&amp;gt;
      &amp;lt;p&amp;gt;div2 line3&amp;lt;/p&amp;gt;
    &amp;lt;/div&amp;gt;
  &amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/pre&gt;&lt;br /&gt;
หากโจทย์ต้องการให้กำหนดสีให้กับ &amp;lt;p&amp;gt; แรกของแต่ละ div จะทำได้โดยใช้ :first-child ต่อหลัง tag ดังตัวอย่าง&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush:html"&gt;&amp;lt;style type="text/css"&amp;gt;
  div &amp;gt; p:first-child { color: red;}
&amp;lt;/style&amp;gt;&lt;/pre&gt;&lt;br /&gt;
เท่านั้น div1 line1 และ div2 line1 ก็จะมีตัวอักษรสีแดงแล้วครับ&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/57392424587537905-3893624076194647904?l=www.leknarm.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/VxWgvfuwT_Aa2Y4ewGfeVByPltE/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/VxWgvfuwT_Aa2Y4ewGfeVByPltE/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/VxWgvfuwT_Aa2Y4ewGfeVByPltE/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/VxWgvfuwT_Aa2Y4ewGfeVByPltE/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/leknarm/DRyy/~4/M3d2KLtWSVk" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.leknarm.com/feeds/3893624076194647904/comments/default" title="ส่งความคิดเห็น" /><link rel="replies" type="text/html" href="http://www.leknarm.com/2011/01/first-child-css-selector.html#comment-form" title="0 ความคิดเห็น" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/57392424587537905/posts/default/3893624076194647904?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/57392424587537905/posts/default/3893624076194647904?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/leknarm/DRyy/~3/M3d2KLtWSVk/first-child-css-selector.html" title="First child CSS Selector" /><author><name>Tantai Thanakanok</name><uri>https://profiles.google.com/105761820717326472079</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-jkl-QXkcHk0/AAAAAAAAAAI/AAAAAAAAAAA/_z7XmYxSV_c/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://www.leknarm.com/2011/01/first-child-css-selector.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUQASX06fyp7ImA9Wx9XGEw.&quot;"><id>tag:blogger.com,1999:blog-57392424587537905.post-2544287678712225957</id><published>2011-01-12T13:22:00.000+07:00</published><updated>2011-01-12T13:22:28.317+07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-01-12T13:22:28.317+07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="numbertext" /><category scheme="http://www.blogger.com/atom/ns#" term="moneytext" /><category scheme="http://www.blogger.com/atom/ns#" term="bahteng" /><category scheme="http://www.blogger.com/atom/ns#" term="bahttext" /><title>Function Bahteng บน OpenOffice.org Calc</title><content type="html">เห็นมีคนถามมาเยอะว่าใน OpenOffice.org Calc มีฟังก์ชัน bahttext แต่ไม่เห็นมีฟังก์ชัน bahteng เลย ใน excel ยังมีเลยทำไมใน OpenOffice.org ถึงไม่มี&lt;br /&gt;
&lt;br /&gt;
คำตอบคือใน excel นั้นฟังก์ชัน bahteng เป็น add-in function ที่มีคนทำขึ้นมาเสริมเข้าไปในตัวโปรแกรมซึ่งใน excel เพียวๆ นั้นไม่มีฟังก์ชัน bahteng&lt;br /&gt;
&lt;br /&gt;
ใน OpenOffice.org Calc ก็เหมือนกันกับ excel คือตัวโปรแกรมนั้นไม่ได้มีฟังก์ชัน bahteng แต่มี Extension ที่เสริมเข้าไปให้ใช้งาน bahteng ได้แต่ไม่ได้ใช้ชื่อ bahteng จะใช้ชื่อ moneytext แทน&lt;br /&gt;
&lt;br /&gt;
Extension ดังกล่าวมีชื่อว่า &lt;a href="http://www.blogger.com/"&gt;numbertext&lt;/a&gt;&amp;nbsp; ซึ่งเมื่อติดตั้ง extension แล้วจะมี function โผล่มาให้ใช้งาน 2 ฟังก์ชันคือ&lt;br /&gt;
&lt;ol&gt;&lt;li&gt;numbertext&lt;/li&gt;
&lt;li&gt;moneytext&lt;/li&gt;
&lt;/ol&gt;โดยในส่วน bahteng ที่เราจะใช้กันนั้นจะเป็นฟังก์ชัน moneytext ซึ่งถ้าจะใช้งานก็ให้พิมพ์ลงใน Cell ว่า&lt;br /&gt;
&lt;br /&gt;
&lt;code&gt;=MONEYTEXT(25;"THB";"en") &lt;/code&gt;&lt;br /&gt;
&lt;br /&gt;
ฟังก์ชันจะทำเลข 25 ให้กลายเป็นคำว่า twenty-five baht&lt;br /&gt;
&lt;br /&gt;
ฟังก์ชัน numbertext และ moneytext นั้นสามารถพิมพ์ออกมาเป็นตัวอักษรได้ถึง 40 กว่าภาษา ซึ่งนั่นก็เป็นสาเหตุที่ว่าทำไมต้องกำหนดภาษาและสกุลเงินในฟังก์ชันนั่นเอง&lt;br /&gt;
&lt;br /&gt;
numbertext นอกจากจะเป็น extension ของ OpenOffice.org ยังมีรูปแบบ อื่นๆ ให้ใช้กันได้อีกเช่น jar เป็นต้น สามารถดูรายละเอียดเพิ่มได้ที่ &lt;a href="http://numbertext.org/"&gt;http://numbertext.org&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/57392424587537905-2544287678712225957?l=www.leknarm.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/m7sVyUh4VJZh3rBZ-pKRQoi5f8I/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/m7sVyUh4VJZh3rBZ-pKRQoi5f8I/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/m7sVyUh4VJZh3rBZ-pKRQoi5f8I/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/m7sVyUh4VJZh3rBZ-pKRQoi5f8I/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/leknarm/DRyy/~4/szzfk5vHtqo" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.leknarm.com/feeds/2544287678712225957/comments/default" title="ส่งความคิดเห็น" /><link rel="replies" type="text/html" href="http://www.leknarm.com/2011/01/function-bahteng-openofficeorg-calc.html#comment-form" title="0 ความคิดเห็น" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/57392424587537905/posts/default/2544287678712225957?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/57392424587537905/posts/default/2544287678712225957?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/leknarm/DRyy/~3/szzfk5vHtqo/function-bahteng-openofficeorg-calc.html" title="Function Bahteng บน OpenOffice.org Calc" /><author><name>Tantai Thanakanok</name><uri>https://profiles.google.com/105761820717326472079</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-jkl-QXkcHk0/AAAAAAAAAAI/AAAAAAAAAAA/_z7XmYxSV_c/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://www.leknarm.com/2011/01/function-bahteng-openofficeorg-calc.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0UGQ3c6fCp7ImA9WhdXF0g.&quot;"><id>tag:blogger.com,1999:blog-57392424587537905.post-6462632363279931546</id><published>2011-01-07T14:40:00.001+07:00</published><updated>2011-08-31T09:53:42.914+07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-08-31T09:53:42.914+07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="javascript" /><category scheme="http://www.blogger.com/atom/ns#" term="utf8" /><category scheme="http://www.blogger.com/atom/ns#" term="cookie" /><category scheme="http://www.blogger.com/atom/ns#" term="regular expression" /><category scheme="http://www.blogger.com/atom/ns#" term="ภาษาไทย" /><title>ใช้งาน cookie บน javascript กับภาษาไทย</title><content type="html">เผอิญได้โจทย์มาว่าใน contact form user นั้นควรกรอกแค่ครั้งเดียว ครั้งต่อไปเข้ามาหน้า contact ก็ไม่ควรต้องกรอกอีก ซึ่งผู้ที่จะกรอกนั้นจะเป็น anonymous ดังนั้นวิธีการที่จะทำให้หน้า contact จำค่าได้ก็คงต้องใช้ cookie&lt;br /&gt;
&lt;br /&gt;
ปัญหาคือหน้า contact form นั้นอยู่ใน drupal ซึ่งเมื่อเปิด page cache แล้วมันจะทำให้ใช้งาน cookie สำหรับ anonymous ไม่ได้ ดังนั้นเลยต้องเลี่ยงไปใช้ cookie ของ javascript แทน&lt;br /&gt;
&lt;br /&gt;
จาก tutorial &lt;a href="http://www.w3schools.com/JS/js_cookies.asp"&gt;http://www.w3schools.com/JS/js_cookies.asp&lt;/a&gt; ก็ดูเหมือนจะทำงานได้ดีแต่พอเรานำไปใช้จริงและกรอกค่าใน form เป็นภาษาไทย ผลลัพธ์ก็คือ &lt;b&gt;ภาษาไทยเละ&lt;/b&gt; ดังนั้นเราจึงต้อง customize code กันนิดหน่อยเพื่อให้ใช้งานภาษาไทยได้&lt;br /&gt;
&lt;br /&gt;
original code&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush:js"&gt;function getCookie(c_name) {
  if (document.cookie.length &amp;gt; 0) {
    c_start = document.cookie.indexOf(c_name + "=");
    if (c_start != -1) {
      c_start = c_start + c_name.length+1;
      c_end = document.cookie.indexOf(";", c_start);
      if (c_end == -1) 
        c_end = document.cookie.length
      return unescape(document.cookie.substring(c_start,c_end));
    }
  }
  return "";
}

function setCookie(c_name, value,expiredays) {
  var exdate = new Date();
  exdate.setDate(exdate.getDate()+expiredays);
  document.cookie = c_name+ "=" +escape(value)+((expiredays==null) ? "" : ";expires="+exdate.toUTCString());
}&lt;/pre&gt;&lt;br /&gt;
customized code&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush:js"&gt;function getCookie(c_name) {
  if (document.cookie.length &amp;gt; 0) {
    c_start = document.cookie.indexOf(c_name + "=");
    if (c_start != -1) {
      c_start = c_start + c_name.length+1;
      c_end = document.cookie.indexOf(";", c_start);
      if (c_end == -1) 
        c_end = document.cookie.length
      return decodeURIComponent(document.cookie.substring(c_start,c_end));
    }
  }
  return "";
}

function setCookie(c_name, value,expiredays) {
  var exdate = new Date();
  exdate.setDate(exdate.getDate()+expiredays);
  document.cookie = c_name+ "=" +encodeURIComponent(value)+((expiredays==null) ? "" : ";expires="+exdate.toUTCString());
}&lt;/pre&gt;&lt;br /&gt;
เพื่อให้ใช้งานภาษาไทยได้ ต้องใช้ function encodeURIComponent แทน function escape แต่ปัญหายังไม่หมดแค่นี้ เมื่อเรา getCookie ที่ภายใน text นั้นมี space เข้ามาใช้งาน space ที่เคยพิมพ์เข้าไปจะกลายเป็นเครื่องหมาย + แทน ดังนั้นเราต้อง replace มันก่อนที่จะนำไปใช้งานด้วย&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush:js"&gt;getCookie('c_name').replace(/\+/g, " ")
&lt;/pre&gt;&lt;br /&gt;
ซึ่ง /\+/ นั้นหมายถึงเครื่องหมาย + และ g หมายถึงให้ replace ทั้ง string&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/57392424587537905-6462632363279931546?l=www.leknarm.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/wT2YMbwfzs7VZcIqZBaCnoTN0CM/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/wT2YMbwfzs7VZcIqZBaCnoTN0CM/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/wT2YMbwfzs7VZcIqZBaCnoTN0CM/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/wT2YMbwfzs7VZcIqZBaCnoTN0CM/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/leknarm/DRyy/~4/fWD4CKXxIZQ" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.leknarm.com/feeds/6462632363279931546/comments/default" title="ส่งความคิดเห็น" /><link rel="replies" type="text/html" href="http://www.leknarm.com/2011/01/cookie-javascript.html#comment-form" title="1 ความคิดเห็น" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/57392424587537905/posts/default/6462632363279931546?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/57392424587537905/posts/default/6462632363279931546?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/leknarm/DRyy/~3/fWD4CKXxIZQ/cookie-javascript.html" title="ใช้งาน cookie บน javascript กับภาษาไทย" /><author><name>Tantai Thanakanok</name><uri>https://profiles.google.com/105761820717326472079</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-jkl-QXkcHk0/AAAAAAAAAAI/AAAAAAAAAAA/_z7XmYxSV_c/s512-c/photo.jpg" /></author><thr:total>1</thr:total><feedburner:origLink>http://www.leknarm.com/2011/01/cookie-javascript.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0UCQX4yfSp7ImA9WhdXF0g.&quot;"><id>tag:blogger.com,1999:blog-57392424587537905.post-5260183807251417423</id><published>2011-01-06T17:33:00.001+07:00</published><updated>2011-08-31T09:54:20.095+07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-08-31T09:54:20.095+07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="google adwords" /><category scheme="http://www.blogger.com/atom/ns#" term="warning" /><category scheme="http://www.blogger.com/atom/ns#" term="drupal" /><category scheme="http://www.blogger.com/atom/ns#" term="module" /><title>แก้ปัญหา warning: Attempt to assign property of non-object ใน drupal เมื่อใช้งาน Google Adwords</title><content type="html">&amp;nbsp;เมื่อมีการเปิดการใช้งาน google adwords ในหน้าใดก็ตาม จะเกิด error&amp;nbsp; warning: Attempt to assign property of non-object in ...... theme.inc ขึ้นที่หน้าดังกล่าว พอลองไปดูที่ตำแหน่งดังกล่าวจะเป็นส่วนของ language ซึ่งไม่น่าจะเกิด error ได้เลย&lt;br /&gt;
&lt;br /&gt;
ปัญหาดังกล่าวจริงๆ แล้วเกิดขึ้นที่ module google adwords ซึ่งดันไปเรียกใช้งาน global variable ชื่อว่า language ตัวเดียวกันทำให้เกิด warning ขึ้น&lt;br /&gt;
&lt;br /&gt;
วิธีการแก้ไขคือให้ไปที่ module google_adwords แก้ไข google_adwords.module ใน function _google_adwords_view_adwords ให้แก้ไขตาม code ด้านล่าง โดยเปลี่ยนชื่อตัวแปร $language ให้เป็นตัวอื่นซะ&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush:php"&gt;if (arg(0) != 'admin' &amp;amp;&amp;amp; $track &amp;gt; 0) {
  if($node-&amp;gt;google_adwords['enabled'] &amp;lt;&amp;gt; 0) { 
   
    $label = $node-&amp;gt;google_adwords['label'];
    $id = variable_get('google_adwords_conversion_id', 0);
    $google_conversation_language = variable_get('google_adwords_conversion_language', $language-&amp;gt;language); //change variable from $language to $google_conversation_language
    $format = variable_get('google_adwords_conversion_format', '2');
    $color = variable_get('google_adwords_conversion_color', 'FFFFFF');
    $google_js = variable_get('google_adwords_external_script', 'https://www.googleadservices.com/pagead/conversion.js');
    
    $output = '';
    
    $output .= "\n" . '&amp;lt;!-- Google Code for Conversion Page --&amp;gt;' . "\n";
    $output .= '&amp;lt;script language="JavaScript" type="text/javascript"&amp;gt;' . "\n";
    $output .= '&amp;lt;!--' . "\n";
    $output .= '    var google_conversion_id = '. $id .';' . "\n";
    $output .= '    var google_conversion_language = "'. $google_conversation_language .'";' . "\n"; //change variable from $language to $google_conversation_language
    $output .= '    var google_conversion_format = "'. $format .'";' . "\n";
    $output .= '    var google_conversion_color = "'. $color .'";' . "\n";
    $output .= '    var google_conversion_label = "'. $label .'";' . "\n";
    $output .= '//--&amp;gt;' . "\n";
    $output .= '&amp;lt;/script&amp;gt;' . "\n";
    $output .= '&amp;lt;script language="JavaScript" src="' . $google_js . '"&amp;gt;&amp;lt;/script&amp;gt;' . "\n";
    $output .= '&amp;lt;noscript&amp;gt;' . "\n";
    $output .= '    &amp;lt;img height="1" width="1" border="0" src="https://www.googleadservices.com/pagead/conversion/' . $id . '/?label='. $label .'&amp;amp;amp;guid=ON&amp;amp;amp;script=0"/&amp;gt;' . "\n";
    $output .= '&amp;lt;/noscript&amp;gt;' . "\n";
       
    return $output;
    
  }
}&lt;/pre&gt;&lt;br /&gt;
ที่มา &lt;a href="http://goo.gl/EvPvO"&gt;http://goo.gl/EvPvO&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/57392424587537905-5260183807251417423?l=www.leknarm.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/3XjWkvSjtN51NHVSZjrkc74Qtd8/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/3XjWkvSjtN51NHVSZjrkc74Qtd8/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/3XjWkvSjtN51NHVSZjrkc74Qtd8/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/3XjWkvSjtN51NHVSZjrkc74Qtd8/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/leknarm/DRyy/~4/0TMFZhSJLLw" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.leknarm.com/feeds/5260183807251417423/comments/default" title="ส่งความคิดเห็น" /><link rel="replies" type="text/html" href="http://www.leknarm.com/2011/01/warning-attempt-to-assign-property-of.html#comment-form" title="0 ความคิดเห็น" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/57392424587537905/posts/default/5260183807251417423?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/57392424587537905/posts/default/5260183807251417423?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/leknarm/DRyy/~3/0TMFZhSJLLw/warning-attempt-to-assign-property-of.html" title="แก้ปัญหา warning: Attempt to assign property of non-object ใน drupal เมื่อใช้งาน Google Adwords" /><author><name>Tantai Thanakanok</name><uri>https://profiles.google.com/105761820717326472079</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-jkl-QXkcHk0/AAAAAAAAAAI/AAAAAAAAAAA/_z7XmYxSV_c/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://www.leknarm.com/2011/01/warning-attempt-to-assign-property-of.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkYDQX4-eyp7ImA9WhdWEk4.&quot;"><id>tag:blogger.com,1999:blog-57392424587537905.post-7075299658330341786</id><published>2011-01-05T11:27:00.004+07:00</published><updated>2011-09-05T21:49:30.053+07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-09-05T21:49:30.053+07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="ภาษาไทย" /><category scheme="http://www.blogger.com/atom/ns#" term="alfresco" /><title>แก้ปัญหาชื่อภาษาไทยบน Alfresco เละใน Version 3.4 บน Windows</title><content type="html">เมื่อลง Alfresco 3.4 บน Windows แล้วเมื่อสร้าง Space หรือไฟล์ที่มีชื่อภาษาไทยแล้ว ชื่อไฟล์ดังกล่าวจะกลายเป็น ???? &lt;br /&gt;
&lt;br /&gt;
ปัญหาดังกล่าวเกิดจาก default character set ใน MySQL ไม่ได้ถูกตั้งค่าให้เป็น UTF-8 เหมือน Version ก่อนๆ ทำให้ Table ที่สร้างขึ้นมาไม่ได้มี Collation เป็น UTF-8 เมื่อมีการ Insert ภาษาไทยเข้าไปใน Table จึงทำให้ภาษาไทยเละ&lt;br /&gt;
&lt;br /&gt;
วิธีการแก้ไขคือเราต้อง alter table ให้มันกลายเป็น UTF-8 ซะก่อนซึ่งจะให้ alter ที่ละ table มันก็จะเหนื่อยไปนิด ดังนั้นก็เลยเขียน php เพื่อที่จะ alter table ให้กลายเป็น UTF-8 ทั้งหมดซะ&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush:php"&gt;&amp;lt;?php
  $db = mysql_connect('localhost','username','password');
  if(!$db) echo "Cannot connect to the database - incorrect details";
  mysql_select_db('alfresco');
  mysql_query('ALTER DATABASE CHARACTER SET utf8');
  $result=mysql_query('show tables');
  while($tables = mysql_fetch_array($result)) {
    foreach ($tables as $key =&amp;gt; $value) {
      mysql_query("ALTER TABLE $value CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci");
    }
  }
?&amp;gt;&lt;/pre&gt;
&lt;br /&gt;
เมื่อรันแล้วให้ลอง restart alfresco ซักทีนึงแล้วก็ลองดูว่าภาษาไทยสามารถใช้งานได้หรือยัง ถ้ายังให้ไป set default character ใน MySQL ให้เป็น UTF-8 ตาม link นี้ครับ &lt;a href="http://www.leknarm.com/2010/01/set-mysql-utf8.html"&gt;http://www.leknarm.com/2010/01/set-mysql-utf8.html&lt;/a&gt;&lt;br /&gt;
--&lt;br /&gt;
Tantai Thanakanok. Open Source Development Co., Ltd.&lt;br /&gt;
Tel: +66 38 311816, Fax: +66 38 773128, &lt;a href="http://www.osdev.co.th/"&gt;http://www.osdev.co.th/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/57392424587537905-7075299658330341786?l=www.leknarm.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/FuwtUdhsGMnFcbZtiGme5KJbGgo/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/FuwtUdhsGMnFcbZtiGme5KJbGgo/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/FuwtUdhsGMnFcbZtiGme5KJbGgo/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/FuwtUdhsGMnFcbZtiGme5KJbGgo/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/leknarm/DRyy/~4/KEiHD-Kctp0" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.leknarm.com/feeds/7075299658330341786/comments/default" title="ส่งความคิดเห็น" /><link rel="replies" type="text/html" href="http://www.leknarm.com/2011/01/alfresco-version-34-windows.html#comment-form" title="1 ความคิดเห็น" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/57392424587537905/posts/default/7075299658330341786?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/57392424587537905/posts/default/7075299658330341786?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/leknarm/DRyy/~3/KEiHD-Kctp0/alfresco-version-34-windows.html" title="แก้ปัญหาชื่อภาษาไทยบน Alfresco เละใน Version 3.4 บน Windows" /><author><name>Tantai Thanakanok</name><uri>https://profiles.google.com/105761820717326472079</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-jkl-QXkcHk0/AAAAAAAAAAI/AAAAAAAAAAA/_z7XmYxSV_c/s512-c/photo.jpg" /></author><thr:total>1</thr:total><feedburner:origLink>http://www.leknarm.com/2011/01/alfresco-version-34-windows.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0IFRXw8cCp7ImA9WhdXF0g.&quot;"><id>tag:blogger.com,1999:blog-57392424587537905.post-2579571279873589576</id><published>2010-12-23T14:34:00.005+07:00</published><updated>2011-08-31T09:58:34.278+07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-08-31T09:58:34.278+07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="utf8" /><category scheme="http://www.blogger.com/atom/ns#" term="restore" /><category scheme="http://www.blogger.com/atom/ns#" term="mysql" /><category scheme="http://www.blogger.com/atom/ns#" term="database" /><title>วิธีการ restore database ที่มี character encoding utf-8</title><content type="html">เนื่องจากเวลา restore database ด้วย MySQL command โดยที่ไฟล์ sql ของเรานั้นมีภาษาไทยอยู่ และไฟล์ดังกล่าวมี encoding เป็น utf-8 การใช้ command ปกติจะทำให้เวลา restore เข้าไปภาษาไทยจะเละ&lt;br /&gt;
&lt;br /&gt;
ดังนั้นเวลาเรา restore เราควรจะต้องกำหนด default character set ให้กับ command ด้วย&lt;br /&gt;
&lt;pre class="brush:bash"&gt;mysql -u [username] -p --default_character_set utf8 [database_name] &amp;lt; [file.sql]
mysql -u root -p --default_character_set utf8 leknarm &amp;lt; leknarm.sql
&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/57392424587537905-2579571279873589576?l=www.leknarm.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/LzRJyI1p3gwrp1sA3mMT9LWFZ-k/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/LzRJyI1p3gwrp1sA3mMT9LWFZ-k/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/LzRJyI1p3gwrp1sA3mMT9LWFZ-k/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/LzRJyI1p3gwrp1sA3mMT9LWFZ-k/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/leknarm/DRyy/~4/XIt0KarT1ls" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.leknarm.com/feeds/2579571279873589576/comments/default" title="ส่งความคิดเห็น" /><link rel="replies" type="text/html" href="http://www.leknarm.com/2010/12/restore-database-character-encoding-utf.html#comment-form" title="0 ความคิดเห็น" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/57392424587537905/posts/default/2579571279873589576?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/57392424587537905/posts/default/2579571279873589576?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/leknarm/DRyy/~3/XIt0KarT1ls/restore-database-character-encoding-utf.html" title="วิธีการ restore database ที่มี character encoding utf-8" /><author><name>Tantai Thanakanok</name><uri>https://profiles.google.com/105761820717326472079</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-jkl-QXkcHk0/AAAAAAAAAAI/AAAAAAAAAAA/_z7XmYxSV_c/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://www.leknarm.com/2010/12/restore-database-character-encoding-utf.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0IASXk_eSp7ImA9WhdXF0g.&quot;"><id>tag:blogger.com,1999:blog-57392424587537905.post-8287704533896015237</id><published>2010-12-17T11:45:00.003+07:00</published><updated>2011-08-31T09:59:08.741+07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-08-31T09:59:08.741+07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="drupal module" /><category scheme="http://www.blogger.com/atom/ns#" term="drupal" /><category scheme="http://www.blogger.com/atom/ns#" term="hook form" /><category scheme="http://www.blogger.com/atom/ns#" term="drupal form" /><category scheme="http://www.blogger.com/atom/ns#" term="drupal hook" /><title>สร้าง module ใน drupal</title><content type="html">ถึง drupal จะยืดหยุ่นมากจนเราทำอะไรก็ได้ใน content จะเขียน php ลงใน content โดยใช้ php filter หรือจะทำ &lt;a href="http://drupal.org/project/cck"&gt;cck field&lt;/a&gt; สำหรับ download ไฟล์ แต่มันก็ยังไม่เพียงพอสำหรับการทำงานบางอย่างของ site ของเรา&lt;br /&gt;
&lt;br /&gt;
เช่นผมอยากจะ validate ข้อมูลบน form ซึ่ง &lt;a href="http://drupal.org/project/webform_validation"&gt;webfrom validation&lt;/a&gt; ไม่สามารถทำได้ เราจำเป็นต้องสร้าง custom module ขึ้นมาเพื่อจะทำงานนั้นๆ&lt;br /&gt;
&lt;br /&gt;
การสร้าง custom module นั้นมี tutorial อยู่ที่ &lt;a href="http://drupal.org/developing/modules"&gt;http://drupal.org/developing/modules&lt;/a&gt; หรือที่ &lt;a href="http://www.thaitux.info/node/426"&gt;ThaiTux&lt;/a&gt; ซึ่งได้แปลไว้เรียบร้อยแล้ว(อ่านแล้วงงนิดหน่อย) ซึ่งผมจะขออธิบายการสร้าง module ง่ายๆ คือ&lt;br /&gt;
&lt;br /&gt;
การสร้าง module จำเป็นต้องมีไฟล์สำคัญอยู่ 2 ไฟล์คือ&lt;br /&gt;
&lt;ol&gt;&lt;li&gt;&lt;span style="color: #6aa84f;"&gt;module_name&lt;/span&gt;.info&lt;/li&gt;
&lt;li&gt;&lt;span style="color: #6aa84f;"&gt;module_name&lt;/span&gt;.module&lt;/li&gt;
&lt;/ol&gt;ซึ่ง file info จะประกอบด้วยส่วนสำคัญคือ&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="xml" name="code"&gt;; $Id$
name = leknarm
description = leknarm hook module
package = "Other"
core = 6.x
&lt;/pre&gt;&lt;br /&gt;
โดยความหมายก็ตรงตัวเลยครับ&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;name คือชื่อ&lt;/li&gt;
&lt;li&gt;description คือรายละเอียด&lt;/li&gt;
&lt;li&gt;package คือให้มันอยู่ package ไหน ในที่นี้คือ Other&lt;/li&gt;
&lt;li&gt;และ core คือใช้ได้กับ version อะไร&lt;/li&gt;
&lt;/ul&gt;เมื่อสร้างไฟล์ info เสร็จแล้วเราก็มาสร้างไฟล์ module กัน &lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush:php"&gt;&amp;lt;?php
// $Id$

/**
 * Implementation of hook_form().
 */
function leknarm_form_alter(&amp;amp;$form, $form_state, $form_id) {
  if($form_id == 'webform_client_form_1') {
    $form['#submit'][] = 'leknarm_form1_submit';
  }
  if($form_id == 'webform_client_form_2') {
    $form['#submit'][] = 'leknarm_form2_submit';
  }
}
function leknarm_form1_submit($form, &amp;amp;$form_state) {
  // do anything 
}
function leknarm_form2_submit($form, &amp;amp;$form_state) {
  // do anything 
}
?&amp;gt; &lt;/pre&gt;จากด้านบน มีฟังก์ชัน&lt;code&gt;&lt;span style="color: blue;"&gt; &lt;/span&gt;leknarm_form_alter &lt;/code&gt;ซึ่งฟังก์ชันดังกล่าวเป็น hook ของ form โดยที่เมื่อมีการ request page ที่มี form ใดๆ มันจะไปเรียกฟังก์ชันดังกล่าวทันที ซึ่งในฟังก์ชันดังกล่าวเราเขียนไว้ว่า ถ้าเป็น form ที่มี id เป็น &lt;code&gt;webform_client_form_1&lt;/code&gt; มีการ submit ข้อมูลแล้วให้ไปเรียกฟังก์ชัน &lt;code&gt;leknarm_form1_submit&lt;/code&gt;&lt;br /&gt;
&lt;br /&gt;
นอกจากนี้เรายังสามารถทำ validation ได้โดยใช้คำสั่ง &lt;code&gt;&lt;span style="color: blue;"&gt;$form&lt;/span&gt;['#validate'][]&lt;/code&gt; แทนที่คำสั่ง &lt;code&gt;&lt;span style="color: blue;"&gt;$form&lt;/span&gt;['#submit'][]&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/57392424587537905-8287704533896015237?l=www.leknarm.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/N3d3iMAwP1sCs-9Tf23k3KtUP_o/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/N3d3iMAwP1sCs-9Tf23k3KtUP_o/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/N3d3iMAwP1sCs-9Tf23k3KtUP_o/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/N3d3iMAwP1sCs-9Tf23k3KtUP_o/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/leknarm/DRyy/~4/DDiEXNxImZQ" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.leknarm.com/feeds/8287704533896015237/comments/default" title="ส่งความคิดเห็น" /><link rel="replies" type="text/html" href="http://www.leknarm.com/2010/12/module-drupal.html#comment-form" title="0 ความคิดเห็น" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/57392424587537905/posts/default/8287704533896015237?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/57392424587537905/posts/default/8287704533896015237?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/leknarm/DRyy/~3/DDiEXNxImZQ/module-drupal.html" title="สร้าง module ใน drupal" /><author><name>Tantai Thanakanok</name><uri>https://profiles.google.com/105761820717326472079</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-jkl-QXkcHk0/AAAAAAAAAAI/AAAAAAAAAAA/_z7XmYxSV_c/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://www.leknarm.com/2010/12/module-drupal.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0IERH0-fCp7ImA9Wx9TEUg.&quot;"><id>tag:blogger.com,1999:blog-57392424587537905.post-3437714615507632698</id><published>2010-11-19T15:45:00.002+07:00</published><updated>2010-11-19T16:38:25.354+07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-11-19T16:38:25.354+07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="expunge" /><category scheme="http://www.blogger.com/atom/ns#" term="exchange" /><category scheme="http://www.blogger.com/atom/ns#" term="thunderbird" /><category scheme="http://www.blogger.com/atom/ns#" term="not sync" /><category scheme="http://www.blogger.com/atom/ns#" term="imap" /><category scheme="http://www.blogger.com/atom/ns#" term="not update" /><title>ตั้งค่าให้ Thunderbird delete mail ทันทีหลังจากกดปุ่ม delete เมื่อ connect กับ Microsoft Exchange</title><content type="html">อ่านหัวข้อแล้วอาจจะยังงงกันอยู่ว่ามันหมายความว่ายังไง ???&lt;br /&gt;
&lt;br /&gt;
จริงๆ แล้วเมื่อ Thunderbird มีการเชื่อมต่อกับ microsoft exchange แล้วหากลองใช้ web mail ของ exchange ลบ mail ใน inbox ของเรา บน thunderbird เมลก็จะถูกลบทันที&lt;br /&gt;
&lt;br /&gt;
ในทางกลับกัน ถ้าเราลบเมลบน thunderbird ที่เชื่อมต่อกับ exchange ลองไปดูบน web mail ของ exchange .... อ้าว !! ทำไมมันไม่ยอมลบล่ะเนี่ย&lt;br /&gt;
&lt;br /&gt;
ปัญหาดังกล่าวเกิดขึ้นจากใน Thunderbird เวลาลบเมลนั้น thunderbird จะทำแค่ mark as delete แต่ไม่ได้ลบจริงๆ ดังนั้นบน exchange server ก็จะยังมีเมลอยู่ ถึงแม้จะมีการเชื่อมต่อแบบ IMAP เมลก็ยังอยู่เหมือนเดิม&lt;br /&gt;
&lt;br /&gt;
คำถามเกิดขึ้น ? แล้วถ้าจะให้เมลมันลบจริงๆ จะทำยังไงล่ะ&lt;br /&gt;
คำตอบคือ ใน Thunderbirdให้ไปที่เมนู Tools &amp;gt; Account Settings &amp;gt; Server Settings &amp;gt; ให้คลิกเครื่องหมายถูกหน้า Clean up ("Expunge") Inbox on Exit ซึ่งหมายถึงบอกให้ Thunderbird ทำการ expunge เมื่อมีการปิด Thunderbird&lt;br /&gt;
&lt;br /&gt;
แค่นี้เมื่อปิด Thunderbird เมลที่เราเคย delete ไว้ก็จะไป sync กับ exchange แล้วครับ แต่ถ้าจะให้ expunge หรือ sync ทันทีจำเป็นต้องไป config ค่าเพิ่มนิดหน่อยครับ โดยไปที่&lt;br /&gt;
&lt;br /&gt;
Tools &amp;gt; Options &amp;gt; Advanced &amp;gt; General &amp;gt; คลิกที่ปุ่ม Config Editor &amp;gt; คลิกปุ่ม I'll be careful, I promise! จากนั้นในช่อง filter ให้พิมพ์คำว่า expunge ให้ double คลิกที่ mail.imap.expunge_after_delete ให้ค่า Value เป็น true&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_9yLMwL5LCkk/TOY6cLaE2SI/AAAAAAAAA0c/Ddd_mI1TNO0/s1600/expunge.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="213" src="http://1.bp.blogspot.com/_9yLMwL5LCkk/TOY6cLaE2SI/AAAAAAAAA0c/Ddd_mI1TNO0/s320/expunge.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
เท่านั้นเวลาเราลบเมล บน Exchange ก็จะ update ทันทีเลยครับ&lt;br /&gt;
&lt;br /&gt;
ที่มา &lt;a href="http://goo.gl/dxWO0"&gt;http://forums.mozillazine.org/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/57392424587537905-3437714615507632698?l=www.leknarm.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/Q_JuW5rjIdvqycX_T67Gjo143T0/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Q_JuW5rjIdvqycX_T67Gjo143T0/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/Q_JuW5rjIdvqycX_T67Gjo143T0/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Q_JuW5rjIdvqycX_T67Gjo143T0/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/leknarm/DRyy/~4/yip8qbkhPnw" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.leknarm.com/feeds/3437714615507632698/comments/default" title="ส่งความคิดเห็น" /><link rel="replies" type="text/html" href="http://www.leknarm.com/2010/11/thunderbird-delete-mail-delete-connect.html#comment-form" title="0 ความคิดเห็น" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/57392424587537905/posts/default/3437714615507632698?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/57392424587537905/posts/default/3437714615507632698?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/leknarm/DRyy/~3/yip8qbkhPnw/thunderbird-delete-mail-delete-connect.html" title="ตั้งค่าให้ Thunderbird delete mail ทันทีหลังจากกดปุ่ม delete เมื่อ connect กับ Microsoft Exchange" /><author><name>Tantai Thanakanok</name><uri>https://profiles.google.com/105761820717326472079</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-jkl-QXkcHk0/AAAAAAAAAAI/AAAAAAAAAAA/_z7XmYxSV_c/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/_9yLMwL5LCkk/TOY6cLaE2SI/AAAAAAAAA0c/Ddd_mI1TNO0/s72-c/expunge.jpg" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://www.leknarm.com/2010/11/thunderbird-delete-mail-delete-connect.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0EGQXo8eSp7ImA9WhdXF0g.&quot;"><id>tag:blogger.com,1999:blog-57392424587537905.post-7301989436871446234</id><published>2010-11-03T13:26:00.003+07:00</published><updated>2011-08-31T10:00:20.471+07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-08-31T10:00:20.471+07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="OpenOffice.org" /><category scheme="http://www.blogger.com/atom/ns#" term="macro" /><category scheme="http://www.blogger.com/atom/ns#" term="locale" /><title>get locale ของ openoffice.org ด้วย macro</title><content type="html">&lt;div&gt;ในบ้างครั้งการเขียนมาโครก็มีความจำเป็นต้องรู้ว่าเครื่องนั้นๆ มีการ settings อะไรไว้บ้างเช่น set ค่า locale ไว้เป็นอะไรเพื่อที่จะได้รู้ว่ามีการเขียนวันเดือนปีเป็นแบบไหน (ปี/เดือน/วัน, วัน/เดือน/ปี)&lt;/div&gt;&lt;div&gt;การเขียนมาโครบน OpenOffice.org เพื่อแสดงค่า locale ที่ตั้งค่าไว้สามารถเขียนได้ดังนี้&lt;/div&gt;&lt;br /&gt;
&lt;pre class="brush:vb"&gt;dim lang as string 
dim args(0) As new com.sun.star.beans.PropertyValue 

configprovider = createUnoService( "com.sun.star.configuration.ConfigurationProvider" ) 
args(0).name = "nodepath" 
args(0).value = "/org.openoffice.Setup/L10N" 
settings = configprovider.createInstanceWithArguments("com.sun.star.configuration.ConfigurationAccess", args() )
print settings.ooSetupSystemLocale
&lt;/pre&gt;&lt;br /&gt;
ค่า locale ของเราจะอยู่ที่ property ooSetupSystemLocale ซึ่งใน code ตัวอย่างเราจะได้ผลลัพธ์เป็น th-TH&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/57392424587537905-7301989436871446234?l=www.leknarm.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/c73GDWBvVhwhzkZ1SME-MgOY7bU/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/c73GDWBvVhwhzkZ1SME-MgOY7bU/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/c73GDWBvVhwhzkZ1SME-MgOY7bU/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/c73GDWBvVhwhzkZ1SME-MgOY7bU/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/leknarm/DRyy/~4/PuCoCC3BobI" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.leknarm.com/feeds/7301989436871446234/comments/default" title="ส่งความคิดเห็น" /><link rel="replies" type="text/html" href="http://www.leknarm.com/2010/11/get-locale-openofficeorg-macro.html#comment-form" title="0 ความคิดเห็น" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/57392424587537905/posts/default/7301989436871446234?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/57392424587537905/posts/default/7301989436871446234?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/leknarm/DRyy/~3/PuCoCC3BobI/get-locale-openofficeorg-macro.html" title="get locale ของ openoffice.org ด้วย macro" /><author><name>Tantai Thanakanok</name><uri>https://profiles.google.com/105761820717326472079</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-jkl-QXkcHk0/AAAAAAAAAAI/AAAAAAAAAAA/_z7XmYxSV_c/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://www.leknarm.com/2010/11/get-locale-openofficeorg-macro.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0IFSXoycCp7ImA9Wx5bE08.&quot;"><id>tag:blogger.com,1999:blog-57392424587537905.post-9200525058178500668</id><published>2010-10-29T10:04:00.001+07:00</published><updated>2010-10-29T10:05:18.498+07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-10-29T10:05:18.498+07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="OpenOffice.org Calc" /><category scheme="http://www.blogger.com/atom/ns#" term="buddhist bug" /><category scheme="http://www.blogger.com/atom/ns#" term="export" /><title>ช่วยกันทดสอบ patch แก้ bug วันที่พุทธศักราช export ไปยัง excel แล้วเสียหาย</title><content type="html">และแล้ว bug &lt;a href="http://www.openoffice.org/issues/show_bug.cgi?id=93503"&gt;http://www.openoffice.org/issues/show_bug.cgi?id=93503&lt;/a&gt; ก็แก้ไขเสร็จสิ้นเรียบร้อย แต่ไม่รู้เมื่อไร Oracle จะ approved ก็ไม่รู้ แต่ก่อนที่ทาง Oracle จะ approved ผมจึงอยากให้ลองช่วยกันทดสอบ patch ที่แก้ไข bug ดังกล่าวแล้ว&lt;br /&gt;
&lt;br /&gt;
สามารถดาวน์โหลดได้&amp;nbsp;&lt;a href="https://sites.google.com/site/leknarm/files/svtmi.dll.7z?attredirects=0&amp;amp;d=1"&gt;ที่นี่&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="Apple-style-span" style="color: #333333; font-family: Arial, Verdana, sans-serif; font-size: 13px; line-height: 18px;"&gt;&lt;/span&gt;&lt;br /&gt;
&lt;div&gt;โดยวิธีการ patch คือ&lt;/div&gt;&lt;ol&gt;&lt;li&gt;ปิดโปรแกรม OpenOffice.org ทั้งหมด รวมทั้ง quickstart ด้วย&lt;/li&gt;
&lt;li&gt;rename ไฟล์ svtmi.dll บนเครื่อง computer ของเราที่ c:\program files\openoffice.org3\program\svtmi.dll ให้เป็น svtmi.dll.bak (เพื่อ backup ข้อมูล)&lt;/li&gt;
&lt;li&gt;download และแตกไฟล์ (จะได้ไฟล์ svtmi.dll)&lt;/li&gt;
&lt;li&gt;copy ไฟล์ที่แตกออกมาไปที่ c:\program files\openoffice.org3\program\&lt;/li&gt;
&lt;/ol&gt;&lt;div&gt;ซึ่งส่ิงที่แก้ไขไปคือ&lt;/div&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;เมื่อ export วันที่ที่มี format เป็น [~buddhist], Microsoft Excel จะเปิดขึ้นมาได้ถูกต้อง&lt;/li&gt;
&lt;li&gt;เมื่อเปิดวันที่ที่มี LCID จาก Microsoft Office ที่บ่งบอกว่าเป็นปีพุทธศักราช OpenOffice.org Calc จะเปิดได้ถูกต้อง&lt;/li&gt;
&lt;li&gt;เมื่อ export วันที่ที่มีเลขไทย Microsoft Excel จะเปิดขึ้นมาได้ถูกต้อง&lt;/li&gt;
&lt;li&gt;เมื่อเปิดวันที่หรือตัวเลขที่มีเลขไทย OpenOffice.org จะเปิดได้อย่างถูกต้อง&lt;/li&gt;
&lt;/ol&gt;&lt;div&gt;ดูข่าวได้จาก &lt;a href="http://openoffice.in.th/blogs/%E0%B8%8A%E0%B9%88%E0%B8%A7%E0%B8%A2%E0%B8%81%E0%B8%B1%E0%B8%99%E0%B8%97%E0%B8%94%E0%B8%AA%E0%B8%AD%E0%B8%9A-patch-%E0%B9%81%E0%B8%81%E0%B9%89-bug-%E0%B8%A7%E0%B8%B1%E0%B8%99%E0%B8%97%E0%B8%B5%E0%B9%88%E0%B8%9E%E0%B8%B8%E0%B8%97%E0%B8%98%E0%B8%A8%E0%B8%B1%E0%B8%81%E0%B8%A3%E0%B8%B2%E0%B8%8A-export-%E0%B9%84%E0%B8%9B%E0%B8%A2%E0%B8%B1%E0%B8%87-excel-%E0%B9%81%E0%B8%A5%E0%B9%89%E0%B8%A7%E0%B9%80%E0%B8%AA%E0%B8%B5%E0%B8%A2%E0%B8%AB%E0%B8%B2%E0%B8%A2"&gt;http://openoffice.in.th/&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/57392424587537905-9200525058178500668?l=www.leknarm.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/fOqGvMoufJRpFaBvwCskWFEuO10/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/fOqGvMoufJRpFaBvwCskWFEuO10/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/fOqGvMoufJRpFaBvwCskWFEuO10/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/fOqGvMoufJRpFaBvwCskWFEuO10/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/leknarm/DRyy/~4/g0w1QrQyQ9k" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.leknarm.com/feeds/9200525058178500668/comments/default" title="ส่งความคิดเห็น" /><link rel="replies" type="text/html" href="http://www.leknarm.com/2010/10/patch-bug-export-excel.html#comment-form" title="0 ความคิดเห็น" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/57392424587537905/posts/default/9200525058178500668?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/57392424587537905/posts/default/9200525058178500668?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/leknarm/DRyy/~3/g0w1QrQyQ9k/patch-bug-export-excel.html" title="ช่วยกันทดสอบ patch แก้ bug วันที่พุทธศักราช export ไปยัง excel แล้วเสียหาย" /><author><name>Tantai Thanakanok</name><uri>https://profiles.google.com/105761820717326472079</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-jkl-QXkcHk0/AAAAAAAAAAI/AAAAAAAAAAA/_z7XmYxSV_c/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://www.leknarm.com/2010/10/patch-bug-export-excel.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0EBSHc4fSp7ImA9WhdXF0g.&quot;"><id>tag:blogger.com,1999:blog-57392424587537905.post-8742524891467331379</id><published>2010-10-22T15:39:00.006+07:00</published><updated>2011-08-31T10:00:59.935+07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-08-31T10:00:59.935+07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="macro" /><category scheme="http://www.blogger.com/atom/ns#" term="writer" /><category scheme="http://www.blogger.com/atom/ns#" term="convert thai number" /><title>เปลี่ยนตัวเลขอาราบิก ให้เป็นเลขไทยบน OpenOffice.org Writer ด้วยมาโคร</title><content type="html">เนื่องจาก @gumara ได้ฝากถามมาว่าบน OpenOffice.org สามารถกด keypad แล้วพิมพ์เป็นเลขไทยได้ไหม เพราะพวกหนังสือราชการนั้นจำเป็นต้องเป็นเลขไทย ให้คอยมากด shift + เลข ก็เสียเวลา&lt;br /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;ปัญหาดังกล่าวไม่สามารถทำได้บน OpenOffice.org เนื่องมาจาก key ที่ให้เราสามารถตั้งค่าการทำงานต่างๆ บน OpenOffice.org มีอยู่จำกัดและไม่สามารถเพิ่มเองได้เหมือนกับ Microsoft Office ดังนั้นผมจึงคิดว่าควรทำเป็น extension หรือ ง่ายกว่านั้นก็คือ macro&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;ดังนั้นผมจึงเขียนมาโครที่ทำการ convert ตัวเลขอาราบิกทั้งหมดภายในเอกสารให้กลายเป็นตัวเลขไทยซะดังนี้&lt;/div&gt;&lt;br /&gt;
&lt;div&gt;&lt;pre class="brush:vb"&gt;sub main
  dim descriptor
  dim foundall
  dim found
 
  descriptor = ThisComponent.createSearchDescriptor()
  thainum = array("๐", "๑", "๒", "๓", "๔", "๕", "๖", "๗", "๘", "๙")
  for num = 0 to 9
    with descriptor
      .SearchString = num
      .SearchCaseSensitive = False
    end with
  
    foundall = ThisComponent.findall(descriptor)
    for i = 0 to foundall.getcount() -1
      found = foundall.getbyindex(i)
      found.setstring(thainum(num))
    next
  next
end sub
&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;
แค่นี้ เมื่อกดรันมาโครดังกล่าว ตัวเลขภายในเอกสารของเราก็จะกลายเป็นเลขไทยแล้ว&lt;br /&gt;
&lt;br /&gt;
-----------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
เพิ่มเติมอีกนิด สำหรับการแก้ไขเลขไทยเฉพาะส่วนที่คลุมครับ&lt;br /&gt;
&lt;br /&gt;
&lt;div&gt;&lt;pre class="brush:vb"&gt;sub mainselected
  dim leftpos
  dim rightpos
  dim found
  dim descriptor

  descriptor = ThisComponent.createSearchDescriptor()
  thainum = array("๐", "๑", "๒", "๓", "๔", "๕", "๖", "๗", "๘", "๙")
  for num = 0 to 9
    with descriptor
      .SearchString = num
      .SearchCaseSensitive = False
    end with
    leftpos = thiscomponent.getcurrentcontroller().getviewcursor().getstart()
    rightpos = thiscomponent.getcurrentcontroller().getviewcursor().getend()

    found = thiscomponent.findnext(leftpos.getstart(), descriptor)
    do while not isnull(found)
      if -1 = thiscomponent.gettext().compareRegionEnds(found, rightpos) then exit do
      found.setstring(thainum(num))
      found = thiscomponent.findnext(found.end, descriptor)
    loop
  next
end sub
&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;
-----------------------------------------------------------&lt;br /&gt;
&lt;div style="color: red;"&gt;update&lt;/div&gt;&lt;br /&gt;
ทำเป็น extension เพื่อให้ติดตั้งแล้วใช้งานได้ทันทีครับ&lt;br /&gt;
&lt;a href="http://www.blogger.com/goog_1609737847"&gt;&lt;br /&gt;
&lt;/a&gt;&lt;br /&gt;
&lt;a href="https://sites.google.com/site/leknarm/files/ThaiNumberFormat-0.0.1.oxt?attredirects=0&amp;amp;d=1"&gt;download&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
เมื่อติดตั้งแล้วจะอยู่ที่เมนู format &amp;gt; convert to native number ครับโดยต้องคลุมก่อนแล้วเลือกใช้งานครับ&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/57392424587537905-8742524891467331379?l=www.leknarm.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/QS2PQeou03RHHu-HqvP6_NNyZMM/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/QS2PQeou03RHHu-HqvP6_NNyZMM/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/QS2PQeou03RHHu-HqvP6_NNyZMM/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/QS2PQeou03RHHu-HqvP6_NNyZMM/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/leknarm/DRyy/~4/oAk0qnPryb8" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.leknarm.com/feeds/8742524891467331379/comments/default" title="ส่งความคิดเห็น" /><link rel="replies" type="text/html" href="http://www.leknarm.com/2010/10/openofficeorg-writer.html#comment-form" title="6 ความคิดเห็น" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/57392424587537905/posts/default/8742524891467331379?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/57392424587537905/posts/default/8742524891467331379?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/leknarm/DRyy/~3/oAk0qnPryb8/openofficeorg-writer.html" title="เปลี่ยนตัวเลขอาราบิก ให้เป็นเลขไทยบน OpenOffice.org Writer ด้วยมาโคร" /><author><name>Tantai Thanakanok</name><uri>https://profiles.google.com/105761820717326472079</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-jkl-QXkcHk0/AAAAAAAAAAI/AAAAAAAAAAA/_z7XmYxSV_c/s512-c/photo.jpg" /></author><thr:total>6</thr:total><feedburner:origLink>http://www.leknarm.com/2010/10/openofficeorg-writer.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0AEQXY7fCp7ImA9WhdXF0g.&quot;"><id>tag:blogger.com,1999:blog-57392424587537905.post-8222567732510792860</id><published>2010-10-07T14:27:00.001+07:00</published><updated>2011-08-31T10:01:40.804+07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-08-31T10:01:40.804+07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="form image" /><category scheme="http://www.blogger.com/atom/ns#" term="drupal" /><category scheme="http://www.blogger.com/atom/ns#" term="drupal form" /><title>ทำ image ให้เป็น button ใน drupal from</title><content type="html">ห่างหายกับการเขียน blog ไปนาน วันนี้จะมาเขียนเรื่องการทำรูปให้เป็นปุ่ม button แต่ทำใน drupal กัน&lt;br /&gt;
&lt;br /&gt;
ก่อนอื่นต้องบอกก่อนว่าใน html นั้นเวลาทำ input ที่มี type เป็น image, image นั้นๆ จะทำหน้าที่เป็น submit button โดยอัตโนมัติ คราวนี้เราอยากจะใส่ &amp;lt;input type="image" src="/path/to/image" /&amp;gt; ใน drupal แต่ปัญหาดันเกิดขึ้นที่ต้องใช้ drupal api น่ะสิจะทำยังไง&lt;br /&gt;
&lt;br /&gt;
จากการ google ดูเราได้หน้า API Quickstart ของ drupal มาเป็นหน้านี้&lt;br /&gt;
&lt;br /&gt;
http://drupal.org/node/751826&lt;br /&gt;
&lt;br /&gt;
แต่ว่าดันไม่มี example ของ image เลย ก็เลยลองหาก็ไปเจอหน้า API Reference &lt;br /&gt;
&lt;br /&gt;
http://api.drupal.org/api/drupal/developer--topics--forms_api_reference.html/6&lt;br /&gt;
&lt;br /&gt;
ซึ่งบอกไว้ว่า type image นั้นใน drupal ต้องเขียนว่า image_button ซึ่งถ้าจะเขียนในรูปแบบ drupal form api จะเขียนได้ดังนี้&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush:php"&gt;&amp;lt;?php
$form['example'] = array(
&amp;nbsp; '#type' =&amp;gt; 'image_button',
&amp;nbsp; '#value' =&amp;gt; 'path/to/your/image',
);
?&amp;gt;
&lt;/pre&gt;&lt;br /&gt;
แค่นี้เราก็จะได้ form image button โดยใช้ drupal api แล้วครับ&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/57392424587537905-8222567732510792860?l=www.leknarm.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/ooMju5QK-x9mXbBLfUy_UmmgdwI/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ooMju5QK-x9mXbBLfUy_UmmgdwI/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/ooMju5QK-x9mXbBLfUy_UmmgdwI/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ooMju5QK-x9mXbBLfUy_UmmgdwI/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/leknarm/DRyy/~4/EZTF6zCfCJc" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.leknarm.com/feeds/8222567732510792860/comments/default" title="ส่งความคิดเห็น" /><link rel="replies" type="text/html" href="http://www.leknarm.com/2010/10/image-button-drupal-from.html#comment-form" title="0 ความคิดเห็น" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/57392424587537905/posts/default/8222567732510792860?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/57392424587537905/posts/default/8222567732510792860?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/leknarm/DRyy/~3/EZTF6zCfCJc/image-button-drupal-from.html" title="ทำ image ให้เป็น button ใน drupal from" /><author><name>Tantai Thanakanok</name><uri>https://profiles.google.com/105761820717326472079</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-jkl-QXkcHk0/AAAAAAAAAAI/AAAAAAAAAAA/_z7XmYxSV_c/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://www.leknarm.com/2010/10/image-button-drupal-from.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A08GQXs_fCp7ImA9WhdXF0g.&quot;"><id>tag:blogger.com,1999:blog-57392424587537905.post-9045858895575922838</id><published>2010-09-03T15:15:00.002+07:00</published><updated>2011-08-31T10:03:40.544+07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-08-31T10:03:40.544+07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="custom workflow" /><category scheme="http://www.blogger.com/atom/ns#" term="alfresco" /><title>สร้าง custom workflow บน alfresco</title><content type="html">ขั้นตอนการสร้าง custom workflow บน alfresco นั้นมีขั้นตอนหลักๆ อยู่ 4-5 ขั้นตอนครับ ที่บอกว่า 4-5 เพราะว่ามีอยู่ขั้นตอนนึงที่ทำแค่ครั้้งแรกครั้งเดียวเท่านั้นครับ&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;&amp;nbsp;ขั้นตอนที่ 1 : สร้าง Task Model&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;ปกติแล้วเราสามารถสร้าง Task Model ได้หลายวิธีเช้นแก้ไข file workflowModel.xml ใน server แต่การทำเช่นนี้เราจำเป็นต้อง restart server ก่อน Task Model ที่เราแก้ไขจึงจะใช้งานได้ แต่ถ้าเราต้องการสร้าง Task Model โดยที่ไม่จำเป็นต้อง restart server ให้เราไปแก้ที่ Alfresco Explorer แทนครับโดยให้ไปที่ Company Home &amp;gt; Data Dictionary &amp;gt; Models แล้วเลือก Create &amp;gt; Create Content แล้วใส่ค่าตามนี้&lt;br /&gt;
&lt;ol&gt;&lt;li&gt;Name: ใส่ชื่อของ Model เช่น leknarmModel&lt;/li&gt;
&lt;li&gt;Type: เลือกเป็น Content&lt;/li&gt;
&lt;li&gt;Content Type เลือกเป็น XML&lt;/li&gt;
&lt;/ol&gt;เสร็จแล้วกด OK &lt;br /&gt;
ในหน้า Enter Content ให้ใส่ค่า&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush:xml"&gt;&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;

&amp;lt;model name="osdev:reviewapprovemodel" xmlns="http://www.alfresco.org/model/dictionary/1.0"&amp;gt;
&amp;nbsp; &amp;lt;description&amp;gt;Approve 2 Step Model&amp;lt;/description&amp;gt;
&amp;nbsp; &amp;lt;author&amp;gt;Tantai Thanakanok&amp;lt;/author&amp;gt;
&amp;nbsp; &amp;lt;version&amp;gt;1.0&amp;lt;/version&amp;gt;

&amp;nbsp; &amp;lt;imports&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;import uri="http://www.alfresco.org/model/dictionary/1.0" prefix="d"/&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;import uri="http://www.alfresco.org/model/content/1.0" prefix="cm"/&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;import uri="http://www.alfresco.org/model/bpm/1.0" prefix="bpm"/&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;import uri="http://www.alfresco.org/model/system/1.0" prefix="sys" /&amp;gt;
&amp;nbsp; &amp;lt;/imports&amp;gt;

&amp;nbsp; &amp;lt;namespaces&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;namespace uri="th.co.osdev.model" prefix="osdev"/&amp;gt;
&amp;nbsp; &amp;lt;/namespaces&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp; &amp;lt;types&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;type name="osdev:submitReviewTask"&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;parent&amp;gt;bpm:startTask&amp;lt;/parent&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;properties&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;property name="osdev:expiredate"&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;title&amp;gt;Expired date.&amp;lt;/title&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;type&amp;gt;d:date&amp;lt;/type&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/property&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/properties&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;mandatory-aspects&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;aspect&amp;gt;bpm:assignee&amp;lt;/aspect&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/mandatory-aspects&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/type&amp;gt;&amp;nbsp; 

&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;type name="osdev:reviewTask"&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;parent&amp;gt;osdev:submitReviewTask&amp;lt;/parent&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;overrides&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;property name="osdev:expiredate"&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/property&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/overrides&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;mandatory-aspects&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;aspect&amp;gt;bpm:assignee&amp;lt;/aspect&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/mandatory-aspects&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/type&amp;gt;

&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;type name="osdev:approveTask"&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;parent&amp;gt;osdev:reviewTask&amp;lt;/parent&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;overrides&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;property name="osdev:expiredate"&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/property&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/overrides&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/type&amp;gt;

&amp;nbsp; &amp;lt;/types&amp;gt;&amp;nbsp; 
&amp;lt;/model&amp;gt;&amp;nbsp;&lt;/pre&gt;&lt;div style="color: red;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="color: red;"&gt;&lt;span style="font-size: x-small;"&gt;code ด้านบนนี้เป็นแค่ตัวอย่างเท่านั้น โดย code ดังกล่าวจะไป map กับ jPDL ที่เราวาดหลังจากนี้&lt;/span&gt;&lt;/div&gt;&lt;span style="font-size: x-small;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-size: x-small;"&gt;&lt;span style="font-size: small;"&gt;เมื่อใส่ code ด้านบนนี้เสร็จแล้วให้กด Finish เพื่อไปยังหน้าถัดไป&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-size: x-small;"&gt;&lt;span style="font-size: small;"&gt;ในหน้า Modify Content Properties ให้เลือก Model Activate ด้วยจากนั้นกด OK &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;ขั้นตอนที่ 2 : สร้าง Workflow Resource Bundle&lt;/li&gt;
&lt;/ul&gt;ให้ไปสร้างไฟล์ที่ Company Home &amp;gt; Data Dictionary &amp;gt; Messages โดยใส่ค่าดังนี้&lt;br /&gt;
&lt;ol&gt;&lt;li&gt; Name: ชื่อของไฟล์.properties เช่น leknarm-messages.properties&lt;/li&gt;
&lt;li&gt;Type: เลือกเป็น Content&lt;/li&gt;
&lt;li&gt;Content Type: เลือกเป็น Plain Text&lt;/li&gt;
&lt;/ol&gt;ในหน้า Enter Content ให้ใส่ค่า&lt;br /&gt;
&lt;pre class="brush:xml"&gt;osdev_reviewApprove.workflow.title= Osdev Review , Approval of content
osdev_reviewApprove.workflow.description= Osdev Review , Approval of content
osdev_reviewapprovemodel.type.osdev_submitReviewTask.title=Start&amp;nbsp; Review
osdev_reviewapprovemodel.type.osdev_submitReviewTask.description=Submit documents for review &amp;amp; approval
osdev_reviewapprovemodel.type.osdev_reviewTask.title=Review
osdev_reviewapprovemodel.type.osdev_reviewTask.description=Review Documents to Approve or Reject them
osdev_reviewapprovemodel.type.osdev_approveTask.title=Approve
osdev_reviewapprovemodel.type.osdev_apporveTask.description=Approve to Finishing Documents 
&lt;/pre&gt;เมื่อใส่ค่าเสร็จแล้วให้กดปุ่ม Finish&lt;br /&gt;
ใน่ส่วนของ ไฟล์ Resource Bundle นั้นเราจำเป็นต้อง deploy ด้วยมือ ไม่มี option ที่จะ deploy อัตโนมัติ ดังนั้นให้เราไปที่ url &lt;br /&gt;
&lt;pre class="brush:xml"&gt;http://&amp;lt;host&amp;gt;:&amp;lt;port&amp;gt;/alfresco/faces/jsp/admin/repoadmin-console.jsp 
&lt;/pre&gt;แล้วพิมพ์&lt;br /&gt;
&lt;pre class="brush:xml"&gt;reload messages leknarm-messages
&lt;/pre&gt;&lt;ul&gt;&lt;li&gt;ขั้นตอนที่ 3 : สร้าง Process Definition&lt;/li&gt;
&lt;/ul&gt;โดยปกติแล้ว การสร้าง Process Definition เท่าที่ทราบ จะสามารถสร้างได้ 2 วิธีคือ 1 สร้างโดยการ import ไฟล์ process definition แล้ว deploy แบบ manual แต่วิธีที่ผมจะใช้นั้นคือการ deploy โดยใช้งาน eclipse ครับ&lt;br /&gt;
&lt;br /&gt;
&lt;div style="color: red;"&gt;&lt;span style="font-size: x-small;"&gt;ใน part นี้ผมขอยกตัวอย่าง การสร้าง jPDL ครับเนื่องจากถ้าลากยาวไปถึงการติดตั้งจะทำให้ยาวเกินไป ขอแยกการติดตั้งไปเป็นอีก part ละกันครับ&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;
ให้สร้างไฟล์ process definition ที่มีรูปแบบดังตัวอย่างด้านล่างนี้&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_9yLMwL5LCkk/TICo0hOlTgI/AAAAAAAAAzg/E61lq9J_k4o/s1600/processdefinition.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="158" src="http://2.bp.blogspot.com/_9yLMwL5LCkk/TICo0hOlTgI/AAAAAAAAAzg/E61lq9J_k4o/s320/processdefinition.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
จากนั้นในส่วน code ให้ใส่ค่าตามนี้ครับ&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush:xml"&gt;&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;

&amp;lt;process-definition&amp;nbsp; xmlns="urn:jbpm.org:jpdl-3.2"&amp;nbsp; name="osdev:reviewApprove"&amp;gt;

&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;swimlane name="initiator"&amp;gt;&amp;lt;/swimlane&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;swimlane name="reviewer"&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;assignment class="org.alfresco.repo.workflow.jbpm.AlfrescoAssignment"&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;actor&amp;gt;#{bpm_assignee}&amp;lt;/actor&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/assignment&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/swimlane&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;swimlane name="approver"&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;assignment class="org.alfresco.repo.workflow.jbpm.AlfrescoAssignment"&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;actor&amp;gt;#{bpm_assignee}&amp;lt;/actor&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/assignment&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/swimlane&amp;gt;

&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;start-state name="start"&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;task name="osdev:submitReviewTask" swimlane="initiator"&amp;gt;&amp;lt;/task&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;transition to="review"&amp;gt;&amp;lt;/transition&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/start-state&amp;gt;


&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;task-node name="review"&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;task name="osdev:reviewTask" swimlane="reviewer"&amp;gt;&amp;lt;/task&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;transition to="approve"&amp;gt;&amp;lt;/transition&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/task-node&amp;gt;

&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;task-node name="approve"&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;task name="osdev:approveTask" swimlane="approver"&amp;gt;&amp;lt;/task&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;transition to="end"&amp;gt;&amp;lt;/transition&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/task-node&amp;gt;


&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;end-state name="end"&amp;gt;&amp;lt;/end-state&amp;gt;

&amp;lt;/process-definition&amp;gt;
&lt;/pre&gt;&lt;br /&gt;
เมื่อวาด diagram และใส่ code เรียบร้อย ให้ไปที่ Tab Deployment ในส่วนของ Deployment Server Setting ให้ใส่ค่าตามนี้&lt;br /&gt;
&lt;ol&gt;&lt;li&gt;Server Name: server ของท่านเช่น localhost&lt;/li&gt;
&lt;li&gt;Server Port: ให้ใส่ 8080 หรือว่า port ที่ตั้งค่าไว้&lt;/li&gt;
&lt;li&gt;Server Deployer: ให้ใส่เป็น /alfresco/jbpm/deployprocess&lt;/li&gt;
&lt;/ol&gt;จากนั้นให้ลองกด Test Connection... ดูว่า connection เราเปิดไว้หรือยัง หาก error ให้ตรวจสอบดูว่าเรา start alfresco หรือยังหรือว่ามีการใส่ค่าอะไรผิดพลาดหรือไม่ จากนั้นกด Deploy Process Archive&lt;br /&gt;
&lt;ul&gt;&lt;li&gt; ขั้นตอนที่ 4 : แก้ไข config ให้ display workflow image&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;ขั้นตอนนี้ ทำแค่ครั้งแรกครั้งเดียวเท่านั้นครับ โดยให้ไปที &lt;br /&gt;
&lt;pre class="xml" name="code"&gt;$ALF_ROOT/tomcat/webapps/alfresco/jsp/workflow/start-workflow-wizard/workflow-options.jsp
&lt;/pre&gt;และ &lt;br /&gt;
&lt;pre class="brush:xml"&gt;$ALF_ROOT/tomcat/webapps/alfresco/jsp/workflow/manage-task-dialog.jsp
&lt;/pre&gt;ให้แก้ไข code จาก&lt;br /&gt;
&lt;pre class="brush:xml"&gt;&amp;lt;a:panel rendered="false" id="workflow-outline" label="#{msg.workflow_outline}" progressive="true" expanded="false"
border="white" bgcolor="white" titleBorder="lbgrey" expandedTitleBorder="dotted" titleBgcolor="white" styleClass="mainSubTitle"&amp;gt;
&lt;/pre&gt;เป็น&lt;br /&gt;
&lt;pre class="brush:xml"&gt;&amp;lt;a:panel rendered="true" id="workflow-outline" label="#{msg.workflow_outline}" progressive="true" expanded="true"
border="white" bgcolor="white" titleBorder="lbgrey" expandedTitleBorder="dotted" titleBgcolor="white" styleClass="mainSubTitle"&amp;gt;
&lt;/pre&gt;&lt;ul&gt;&lt;li&gt;ขั้นตอนที่ 5 : สร้าง Alfresco Exploror Task Dialog&lt;/li&gt;
&lt;/ul&gt;ให้สร้างไฟล์ web-client-config-custom.xml ไว้บนเครื่องของเราโดยมี code ดังนี้&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush:xml"&gt;&amp;lt;alfresco-config&amp;gt;

&amp;lt;config evaluator="node-type" condition="osdev:submitReviewTask" replace="true"&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;property-sheet&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;show-property name="osdev:expiredate" display-label="Expired Date"/&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;show-association name="bpm:assignee" display-label-id="wf_reviewers" /&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/property-sheet&amp;gt;
&amp;lt;/config&amp;gt;

&amp;lt;config evaluator="node-type" condition="osdev:reviewTask" replace="true"&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;property-sheet&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;show-property name="osdev:expiredate" display-label="Expired Date"/&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;show-association name="bpm:assignee" display-label-id="wf_approver" /&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/property-sheet&amp;gt;
&amp;lt;/config&amp;gt; 

&amp;lt;config evaluator="node-type" condition="osdev:approveTask" replace="true"&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;property-sheet&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;show-property name="osdev:expiredate" display-label="Expired Date"/&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/property-sheet&amp;gt;
&amp;lt;/config&amp;gt; 

&amp;lt;/alfresco-config&amp;gt;
&lt;/pre&gt;เมื่อใส่ code เสร็จเรียบร้อยให้ไปที่ Company Home &amp;gt; Data Dictionary &amp;gt; Web Client Extension จากนั้นให้&amp;nbsp; Add Content โดยเลือกไฟล์ที่เราเพิ่งสร้าง แล้วกด Next จน Finish&lt;br /&gt;
&lt;br /&gt;
จากนั้นเราต้อง deploy Web Client Extension เองโดยไปที่ url&lt;br /&gt;
&lt;pre class="brush:xml"&gt;http://&amp;lt;host&amp;gt;:&amp;lt;port&amp;gt;/alfresco/faces/jsp/admin/webclientconfig-console.jsp
&lt;/pre&gt;แล้วพิมพ์คำว่า reload&lt;br /&gt;
&lt;br /&gt;
เมื่อเสร็จขั้นตอนที่หมดแล้ว ให้ลอง logout ออกมาครั้งนึงก่อน จากนั้น login เข้าไปใหม่และให้ลอง test โดยการรัน workflow จากไฟล์ หรือจากที่ใดก็ได้ จะสังเกตุว่ามี custom workflow ที่เราเพิ่งสร้างเกิดขึ้นมาครับ&lt;br /&gt;
&lt;br /&gt;
ที่มา - หนังสือ &lt;a href="https://www.packtpub.com/alfresco-3-enterprise-content-management-implementation/book"&gt;Alfresco 3 Enterprise Implementation &lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/57392424587537905-9045858895575922838?l=www.leknarm.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/07Wg8EYWc-W75TMJVzF-e2kpFRY/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/07Wg8EYWc-W75TMJVzF-e2kpFRY/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/07Wg8EYWc-W75TMJVzF-e2kpFRY/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/07Wg8EYWc-W75TMJVzF-e2kpFRY/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/leknarm/DRyy/~4/7p3TbNDT-VY" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.leknarm.com/feeds/9045858895575922838/comments/default" title="ส่งความคิดเห็น" /><link rel="replies" type="text/html" href="http://www.leknarm.com/2010/09/custom-workflow-alfresco.html#comment-form" title="0 ความคิดเห็น" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/57392424587537905/posts/default/9045858895575922838?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/57392424587537905/posts/default/9045858895575922838?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/leknarm/DRyy/~3/7p3TbNDT-VY/custom-workflow-alfresco.html" title="สร้าง custom workflow บน alfresco" /><author><name>Tantai Thanakanok</name><uri>https://profiles.google.com/105761820717326472079</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-jkl-QXkcHk0/AAAAAAAAAAI/AAAAAAAAAAA/_z7XmYxSV_c/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/_9yLMwL5LCkk/TICo0hOlTgI/AAAAAAAAAzg/E61lq9J_k4o/s72-c/processdefinition.jpg" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://www.leknarm.com/2010/09/custom-workflow-alfresco.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A08MQXo7eip7ImA9WhdXF0g.&quot;"><id>tag:blogger.com,1999:blog-57392424587537905.post-527562538689848153</id><published>2010-08-27T13:48:00.001+07:00</published><updated>2011-08-31T10:04:40.402+07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-08-31T10:04:40.402+07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="default" /><category scheme="http://www.blogger.com/atom/ns#" term="language" /><category scheme="http://www.blogger.com/atom/ns#" term="alfresco" /><title>แก้ไข default language ของ alfresco</title><content type="html">หากใครทำ full text search ภาษาไทยบน alfresco เรียบร้อยแล้ว คงสังเกตุกันว่าการ login ต้องเลือกภาษาเป็นภาษาไทย แต่ว่า login language ดันมีให้เลือก 2 ภาษาหรือหลายภาษา แต่ยังไง default ก็เป็นภาษาอังกฤษอยู่ดี&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
คราวนี้หากเราต้องการ set ค่า default language ของหน้า login นี้จะต้องไป set ค่าที่&lt;br /&gt;
&lt;pre class="brush:text"&gt;tomcat/shared/classes/alfresco/extension/web-client-config-custom.xml&lt;/pre&gt;โดยในส่วน config ของ language ให้แก้ค่าจาก&lt;br /&gt;
&lt;pre class="brush:xml"&gt;&amp;lt;config evaluator="string-compare" condition="Languages"&amp;gt;&lt;/pre&gt;เป็น&lt;br /&gt;
&lt;pre class="brush:xml"&gt;&amp;lt;config evaluator="string-compare" condition="Languages" replace="true"&amp;gt;&lt;/pre&gt;ซึ่งการใส่ replace="true" นั้นหมายความว่า ให้นำ config ดังกล่าว replace config default แทนครับ&lt;br /&gt;
&lt;br /&gt;
ที่มา &lt;a href="http://forums.alfresco.com/en/viewtopic.php?t=11775"&gt;alfresco forum&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/57392424587537905-527562538689848153?l=www.leknarm.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/mrRqsL8YQ3_dE7vvBUvli3TVSdM/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/mrRqsL8YQ3_dE7vvBUvli3TVSdM/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/mrRqsL8YQ3_dE7vvBUvli3TVSdM/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/mrRqsL8YQ3_dE7vvBUvli3TVSdM/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/leknarm/DRyy/~4/82bLQkm56YI" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.leknarm.com/feeds/527562538689848153/comments/default" title="ส่งความคิดเห็น" /><link rel="replies" type="text/html" href="http://www.leknarm.com/2010/08/default-language-alfresco.html#comment-form" title="0 ความคิดเห็น" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/57392424587537905/posts/default/527562538689848153?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/57392424587537905/posts/default/527562538689848153?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/leknarm/DRyy/~3/82bLQkm56YI/default-language-alfresco.html" title="แก้ไข default language ของ alfresco" /><author><name>Tantai Thanakanok</name><uri>https://profiles.google.com/105761820717326472079</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-jkl-QXkcHk0/AAAAAAAAAAI/AAAAAAAAAAA/_z7XmYxSV_c/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://www.leknarm.com/2010/08/default-language-alfresco.html</feedburner:origLink></entry></feed>

