tag:blogger.com,1999:blog-76936750761075885412024-02-26T14:02:49.122+07:00Mr.TUM's BlogChagridsada BoonthusUnknownnoreply@blogger.comBlogger23125tag:blogger.com,1999:blog-7693675076107588541.post-64854467773879828062012-06-15T09:53:00.002+07:002012-06-22T10:14:39.445+07:00OpenVPN System Based On User/Password Authentication with mysql & Day Control (lib-pam mysql) - Debian<span class="main_title f14 b">OpenVPN System Based On User/Password Authentication with mysql &<br />Day Control (lib-pam mysql) - Debian</span>
<span class="title f14 b blue">System detail:</span>
<span class="br0 f12 green b" style="padding-left: 10px;">
<label class="br0">- OpenVPN Server, MySQL Server, IP = <b class="red">1.1.1.1</b></label>
<label class="br0">- lib-pam MySQL</label>
<label class="br0">- 1 user - many connections</label>
</span>
<span class="title f12 b red"><u>I. Install MySQL Server for User/Pass Authentication</u></span>
<div style="padding-left: 10px;">
<span class="title f12 b">1. Install MySQL Server</span>
<pre class="brush: shell;">
apt-get install mysql-server
</pre>
<span class="title f12 b">2. Log in MySQL as <b class="red">root</b></span>
<pre class="brush: shell;">
mysql -uroot -p
</pre>
<span class="title f12 b">3. Create the database 'openvpn'</span>
<pre class="brush: sql;">
CREATE DATABASE openvpn;
</pre>
<span class="title f12 b">4. Create a MySQL user with username 'USERNAME' and password 'PASSWORD'</span>
<pre class="brush: sql;">
GRANT ALL ON openvpn.* TO 'USERNAME'@"%" IDENTIFIED BY 'PASSWORD';
</pre>
<span class="title f12 b">5. Log out <b class="red">root</b> user</span>
<pre class="brush: sql;">
exit;
</pre>
<span class="title f12 b">6. Log in MySQL as new user <b class="red">'USERNAME'</b></span>
<pre class="brush: sql;">
mysql -uUSERNAME -pPASSWORD
</pre>
<span class="title f12 b">7. Switch database</span>
<pre class="brush: sql;">
USE openvpn;
</pre>
<span class="title f12 b">8. Create user, log table and insert user data</span>
<span class="br f12">- user table</span>
<pre class="brush: sql;">
CREATE TABLE IF NOT EXISTS `user` (
`user_id` varchar(32) COLLATE utf8_unicode_ci NOT NULL,
`user_pass` varchar(32) COLLATE utf8_unicode_ci NOT NULL DEFAULT '1234',
`user_mail` varchar(64) COLLATE utf8_unicode_ci DEFAULT NULL,
`user_phone` varchar(16) COLLATE utf8_unicode_ci DEFAULT NULL,
`user_online` tinyint(1) NOT NULL DEFAULT '0',
`user_enable` tinyint(1) NOT NULL DEFAULT '1',
`user_start_date` date NOT NULL,
`user_end_date` date NOT NULL,
PRIMARY KEY (`user_id`),
KEY `user_pass` (`user_pass`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
</pre>
<span class="br f12">- log table</span>
<pre class="brush: sql;">
CREATE TABLE IF NOT EXISTS `log` (
`log_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`user_id` varchar(32) COLLATE utf8_unicode_ci NOT NULL,
`log_trusted_ip` varchar(32) COLLATE utf8_unicode_ci DEFAULT NULL,
`log_trusted_port` varchar(16) COLLATE utf8_unicode_ci DEFAULT NULL,
`log_remote_ip` varchar(32) COLLATE utf8_unicode_ci DEFAULT NULL,
`log_remote_port` varchar(16) COLLATE utf8_unicode_ci DEFAULT NULL,
`log_start_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`log_end_time` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
`log_received` float NOT NULL DEFAULT '0',
`log_send` float NOT NULL DEFAULT '0',
PRIMARY KEY (`log_id`),
KEY `user_id` (`user_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
</pre>
<span class="br f12">- user data</span>
<pre class="brush: sql;">
INSERT INTO `user` (
`user_id`, `user_pass`, `user_mail`, `user_phone`,
`user_online`, `user_enable`, `user_start_date`, `user_end_date`
)
VALUES (
'test', '1234', 'mr.tumcpe@gmail.com',
'+66815447514', 0, 1, '2012-01-01', '0000-00-00'
);
</pre>
<span class="title f12 b">9. Show tables</span>
<pre class="brush: sql; highlight: [1];">
show tables;
+-------------------+
| Tables_in_openvpn |
+-------------------+
| log |
| user |
+-------------------+
</pre>
<span class="title f12 b">10. Show user data</span>
<pre class="brush: sql; highlight: [1];">
select * from user;
+---------+-----------+---------------------+--------------+-------------+-------------+-----------------+---------------+
| user_id | user_pass | user_mail | user_phone | user_online | user_enable | user_start_date | user_end_date |
+---------+-----------+---------------------+--------------+-------------+-------------+-----------------+---------------+
| test | 1234 | mr.tumcpe@gmail.com | +66815447514 | 0 | 1 | 2012-01-01 | 0000-00-00 |
+---------+-----------+---------------------+--------------+-------------+-------------+-----------------+---------------+
</pre>
<span class="title f12 b">11. Log out</span>
<pre class="brush: sql;">
exit;
</pre>
</div>
<span class="title f12 b red"><u>II. Install OpenVPN Server and generation of certificate</u></span>
<div style="padding-left: 10px;">
<span class="title f12 b">1. Install OpenVPN</span>
<pre class="brush: shell;">
apt-get install openvpn
</pre>
<span class="title f12 b">2. Generate the certificate Copy the certificate generator scripts from OpenVPN docs</span>
<pre class="brush: shell;">
cp -R /usr/share/doc/openvpn/examples/easy-rsa /etc/openvpn/.
cd /etc/openvpn/easy-rsa/2.0/
</pre>
<span class="title f12 b">3. Modify certificate variables</span>
<pre class="brush: shell;">
vi vars
</pre>
<span class="br f12">Edit this file and change the following lines into your case</span>
<pre class="brush: shell;">
export KEY_COUNTRY="TH"
export KEY_PROVINCE="BKK"
export KEY_CITY="Bangkok"
export KEY_ORG="Chtunnel-VPN"
export KEY_EMAIL="support@chtunnel.com"
</pre>
<span class="title f12 b">4. Save and exit. Run the variable script and clean</span>
<pre class="brush: shell;">
source ./vars
./clean-all
</pre>
<span class="title f12 b">5. Generate the public and private certificates. Just press ENTER or YES by default</span>
<pre class="brush: shell;">
./build-ca
./build-key-server server
./build-key client
./build-dh
mv keys /etc/openvpn/.
</pre>
<span class="br f12">In fact, generation of client is not necessary for a User/Pass authentication approach.</span>
</div>
<span class="title f12 b red"><u>III. Install lib-pam MySQL</u></span>
<div style="padding-left: 10px;">
<span class="title f12 b">1. Install pam_mysql module</span>
<pre class="brush: shell;">
apt-get install libpam-mysql
</pre>
<span class="title f12 b">2. Configure PAM for OpenVPN <b class="red">Create</b> file <b class="blue">'/etc/pam.d/openvpn'</b></span>
<pre class="brush: shell;">
auth sufficient pam_mysql.so \
user=USERNAME passwd=PASSWORD host=localhost db=openvpn \
[table=user] usercolumn=user.user_id passwdcolumn=user.user_pass \
[where=user.user_enable=1 AND user.user_start_date!=user.user_end_date \
AND TO_DAYS(now()) >= TO_DAYS(user.user_start_date) \
AND (TO_DAYS(now()) <= TO_DAYS(user.user_end_date) OR user.user_end_date='0000-00-00')] sqllog=0 crypt=0
account required pam_mysql.so \
user=USERNAME passwd=PASSWORD host=localhost db=openvpn \
[table=user] usercolumn=user.user_id passwdcolumn=user.user_pass \
[where=user.user_enable=1 AND user.user_start_date!=user.user_end_date \
AND TO_DAYS(now()) >= TO_DAYS(user.user_start_date) \
AND (TO_DAYS(now()) <= TO_DAYS(user.user_end_date) OR user.user_end_date='0000-00-00')] sqllog=0 crypt=0
</pre>
<span class="br f12">Detail</span>
<pre class="brush: shell;">
# Set db, user, passwd to your own values.
# Here crypt is the method to encrypt password in the database, which means
# 0 (or "plain") = No encryption.
# Passwords stored in plaintext. HIGHLY DISCOURAGED.
# 1 (or "Y") = Use crypt(3) function.
# 2 (or "mysql") = Use MySQL PASSWORD() function. It is possible
# that the encryption function used by PAM-MySQL
# is different from that of the MySQL server, as
# PAM-MySQL uses the function defined in MySQL's
# C-client API instead of using PASSWORD()
# SQL function in the query.
# 3 (or "md5") = Use plain hex MD5.
# 4 (or "sha1") = Use plain hex SHA1.
</pre>
<span class="title f12 b">3. Install saslauthd</span>
<pre class="brush: shell;">
apt-get install sasl2-bin
/etc/init.d/saslauthd restart
</pre>
<span class="br f12">
<label>If you get this message,</label><br />
<label class="br0 green">To enable saslauthd, edit /etc/default/saslauthd and set START=yes</label>
<label class="br0 green">(warning).</label>
<label class="br0">it means that saslauthd is not configured as automatically start.</label>
<label class="br0 b">Edit file <b class="blue">/etc/default/saslauthd</b>,</label>
<label class="br0">and change START=<b class="red">no</b> to START=<b class="red">yes</b>, then restart saslauthd.</label>
</span>
<pre class="brush: shell;">
/etc/init.d/saslauthd restart
</pre>
<span class="title f12 b">4. Test saslauthd config</span>
<pre class="brush: shell;">
testsaslauthd -u test -p 1234 -s openvpn
</pre>
<span class="br f12">
<label class="br0">If you get the message</label>
<label class="br0 green">0: OK "Success."</label>
<label class="br0">then your configuration is successful. Otherwise,</label>
<label class="br0">refer to log <b class="red">/var/log/auth.log</b> and find the reason.</label>
</span>
<span class="title f12 b">5. Copy OpenVPN PAM module</span>
<pre class="brush: shell;">
cp /usr/lib/openvpn/openvpn-auth-pam.so /etc/openvpn/
</pre>
</div>
<span class="title f12 b red"><u>IV. Compose OpenVPN configuration files</u></span>
<div style="padding-left: 10px;">
<span class="title f12 b">1. Create file config.sh <b class="blue">'/etc/openvpn/script/config.sh'</b></span>
<pre class="brush: shell;">
#!/bin/bash
##Dababase Server
HOST='127.0.0.1'
#Default port = 3306
PORT='3306'
#Username
USER='USERNAME'
#Password
PASS='PASSWORD'
#database name
DB='openvpn'
</pre>
<span class="title f12 b">2. Create file connect.sh <b class="blue">'/etc/openvpn/script/connect.sh'</b></span>
<pre class="brush: shell;">
#!/bin/bash
. /etc/openvpn/script/config.sh
##insert data connection to table log
mysql -h$HOST -P$PORT -u$USER -p$PASS $DB -e "INSERT INTO log (log_id,user_id,log_trusted_ip,log_trusted_port,log_remote_ip,log_remote_port,log_start_time,log_end_time,log_received,log_send) VALUES(NULL,'$common_name','$trusted_ip','$trusted_port','$ifconfig_pool_remote_ip','$remote_port_1',now(),'0000-00-00 00:00:00','$bytes_received','$bytes_sent')"
##set status online to user connected
mysql -h$HOST -P$PORT -u$USER -p$PASS $DB -e "UPDATE user SET user_online=1 WHERE user_id='$common_name'"
</pre>
<span class="title f12 b">3. Create file disconnect.sh <b class="blue">'/etc/openvpn/script/disconnect.sh'</b></span>
<pre class="brush: shell;">
#!/bin/bash
. /etc/openvpn/script/config.sh
##set status offline to user disconnected
mysql -h$HOST -P$PORT -u$USER -p$PASS $DB -e "UPDATE user SET user_online=0 WHERE user_id='$common_name'"
##insert data disconnected to table log
mysql -h$HOST -P$PORT -u$USER -p$PASS $DB -e "UPDATE log SET log_end_time=now(),log_received='$bytes_received',log_send='$bytes_sent' WHERE log_trusted_ip='$trusted_ip' AND log_trusted_port='$trusted_port' AND user_id='$common_name' AND log_end_time='0000-00-00 00:00:00'"
</pre>
<span class="title f12 b">OpenVPN server will scan .conf files in <b class="red">/etc/openvpn</b> when it starts.<br />For each file, it forks a daemon. In this system,<br />we need both UDP and TCP support. I created two configuration files for two daemons in charge of UDP and TCP respectively.</span>
<span class="title f12 b">4. Create file server-tcp-443.conf <b class="blue">'/etc/openvpn/server-tcp-443.conf'</b> for Server Port:<b class="red">443</b></span>
<pre class="brush: shell;">
##protocol port
port 443
proto tcp
dev tun
##ip server client
server 10.4.0.0 255.255.255.0
##key
ca /etc/openvpn/keys/ca.crt
cert /etc/openvpn/keys/server.crt
key /etc/openvpn/keys/server.key
dh /etc/openvpn/keys/dh1024.pem
##option
persist-key
persist-tun
keepalive 5 60
reneg-sec 432000
##option authen.
comp-lzo
user nobody
#group nogroup
client-to-client
username-as-common-name
client-cert-not-required
##user/pass auth from mysql
plugin /etc/openvpn/openvpn-auth-pam.so openvpn
##push to client
max-clients 50
push "persist-key"
push "persist-tun"
push "redirect-gateway def1"
#push "explicit-exit-notify 1"
##DNS-Server
push "dhcp-option DNS 8.8.8.8"
push "dhcp-option DNS 8.8.4.4"
##script connect-disconnect
script-security 3 system
client-connect /etc/openvpn/script/connect.sh
client-disconnect /etc/openvpn/script/disconnect.sh
##log-status
status /etc/openvpn/log/tcp_443.log
log-append /etc/openvpn/log/openvpn.log
verb 3
</pre>
<span class="title f12 b">5. Create file server-udp-53.conf <b class="blue">'/etc/openvpn/server-udp-53.conf'</b> for Server Port:<b class="red">53</b></span>
<pre class="brush: shell;">
##protocol port
port 53
proto udp
dev tun
##ip server client
server 10.5.0.0 255.255.255.0
##key
ca /etc/openvpn/keys/ca.crt
cert /etc/openvpn/keys/server.crt
key /etc/openvpn/keys/server.key
dh /etc/openvpn/keys/dh1024.pem
##option
persist-key
persist-tun
keepalive 5 60
reneg-sec 432000
##option authen.
comp-lzo
user nobody
#group nogroup
client-to-client
username-as-common-name
client-cert-not-required
##user/pass auth from mysql
plugin /etc/openvpn/openvpn-auth-pam.so openvpn
##push to client
max-clients 50
push "persist-key"
push "persist-tun"
push "redirect-gateway def1"
push "explicit-exit-notify 1"
##DNS-Server
push "dhcp-option DNS 8.8.8.8"
push "dhcp-option DNS 8.8.4.4"
##script connect-disconnect
script-security 3 system
client-connect /etc/openvpn/script/connect.sh
client-disconnect /etc/openvpn/script/disconnect.sh
##log-status
status /etc/openvpn/log/udp_53.log
log-append /etc/openvpn/log/openvpn.log
verb 3
</pre>
<span class="title f12 b">6. Create directory for log <b class="blue">'/etc/openvpn/log'</b></span>
<pre class="brush: shell;">
mkdir /etc/openvpn/log
touch /etc/openvpn/log/openvpn.log
touch /etc/openvpn/log/tcp_443.log
touch /etc/openvpn/log/udp_53.log
</pre>
<span class="title f12 b">7. Changes the permission of files</span>
<pre class="brush: shell;">
chmod -R 755 /etc/openvpn
</pre>
<span class="title f12 b">8. Start serviece OpenVPN</span>
<pre class="brush: shell;">
/etc/init.d/openvpn start
</pre>
</div>
<span class="title f12 b red"><u>V. Share Internet to Client</u></span>
<div style="padding-left: 10px;">
<span class="title f12 b">1. Edit file <b class="blue">/etc/sysctl.conf</b> Remove <b class="red">#</b> In line : #net.ipv4.ip_forward=1</span>
<pre class="brush: shell;">
net.ipv4.ip_forward=1
</pre>
<span class="title f12 b">3. Edit file <b class="blue">/etc/rc.local</b> Add before <b class="red">exit 0;</b></span>
<pre class="brush: shell;">
echo "1" > /proc/sys/net/ipv4/ip_forward
echo "1" > /proc/sys/net/ipv4/ip_dynaddr
iptables -A INPUT -i tun0 -j ACCEPT
iptables -A FORWARD -i tun0 -j ACCEPT
iptables -A INPUT -i tun1 -j ACCEPT
iptables -A FORWARD -i tun1 -j ACCEPT
iptables -A INPUT -p udp --dport 53 -j ACCEPT
iptables -t nat -A POSTROUTING -s 10.4.0.0/24 -o eth0 -j MASQUERADE
iptables -t nat -A POSTROUTING -s 10.5.0.0/24 -o eth0 -j MASQUERADE
</pre>
<span class="title f12 b">4. Run Script Iptables Share Internet</span>
<pre class="brush: shell;">
/etc/rc.local
iptables-save
</pre>
</div>
<span class="title f12 b red"><u>VI. Config for Client</u></span>
<div style="padding-left: 10px;">
<span class="title f12 b">1. Config for port <b class="blue">TCP</b> port <b class="red">443</b></span>
<pre class="brush: shell; highlight: [4,5];">
client
dev tun
proto tcp
remote 1.1.1.1 443
nobind
auth-user-pass
reneg-sec 432000
resolv-retry infinite
ca ca.crt
comp-lzo
verb 1
</pre>
<span class="title f12 b">2. Config for port <b class="blue">UDP</b> port <b class="red">53</b></span>
<pre class="brush: shell; highlight: [4,5];">
client
dev tun
proto udp
remote 1.1.1.1 53
nobind
auth-user-pass
reneg-sec 432000
resolv-retry infinite
ca ca.crt
comp-lzo
verb 1
</pre>
<span class="title f12 b">3. Copy file <b class="blue">ca.crt</b> from <b class="red">/etc/openvpn/keys/ca.crt</b> to same config path in client</span>
</div>
<span class="title f12 b blue">Day of user in database</span>
<pre class="brush: shell;">
# If today = '2012-01-01'
# day = user_start_date | user_end_date
# 0 = 0000-00-00 | 0000-00-00
# 0 = 2012-01-01 | 2012-01-01
# 0 = 2012-01-02 | 2012-01-01
# 1 = 2012-01-01 | 2012-01-02
# unlimited = 2012-01-01 | 0000-00-00
</pre>
<span class="title f14 b green">Install finish.</span>
<br />Unknownnoreply@blogger.com5tag:blogger.com,1999:blog-7693675076107588541.post-75322646744568473422012-06-15T08:00:00.000+07:002012-06-22T10:14:52.099+07:00OpenVPN System Based On User/Password Authentication with mysql & Day Control (shell script)- Debian<span class="main_title f14 b">OpenVPN System Based On User/Password Authentication with mysql &<br />Day Control (shell script) - Debian</span>
<span class="title f14 b blue">System detail:</span>
<span class="br0 f12 green b" style="padding-left: 10px;">
<label class="br0">- OpenVPN Server, IP = <b class="red">1.1.1.1</b></label>
<label class="br0">- MySQL Server, IP = <b class="red">2.2.2.2</b></label>
<label class="br0">- Shell script <b class="red">(Customize)</b></label>
<label class="br0">- 1 user - many connections</label>
</span>
<span class="title f12 b red"><u>I. Install MySQL Server for User/Pass Authentication, IP = 2.2.2.2</u></span>
<div style="padding-left: 10px;">
<span class="title f12 b">1. Install MySQL Server</span>
<pre class="brush: shell;">
apt-get install mysql-server
</pre>
<span class="title f12 b">2. Log in MySQL as <b class="red">root</b></span>
<pre class="brush: shell;">
mysql -uroot -p
</pre>
<span class="title f12 b">3. Create the database 'openvpn'</span>
<pre class="brush: sql;">
CREATE DATABASE openvpn;
</pre>
<span class="title f12 b">4. Create a MySQL user with username 'USERNAME' and password 'PASSWORD'</span>
<pre class="brush: sql;">
GRANT ALL ON openvpn.* TO 'USERNAME'@"%" IDENTIFIED BY 'PASSWORD';
</pre>
<span class="title f12 b">5. Log out <b class="red">root</b> user</span>
<pre class="brush: sql;">
exit;
</pre>
<span class="title f12 b">6. Log in MySQL as new user <b class="red">'USERNAME'</b></span>
<pre class="brush: sql;">
mysql -uUSERNAME -pPASSWORD
</pre>
<span class="title f12 b">7. Switch database</span>
<pre class="brush: sql;">
USE openvpn;
</pre>
<span class="title f12 b">8. Create user, log table and insert user data</span>
<span class="br f12">- user table</span>
<pre class="brush: sql;">
CREATE TABLE IF NOT EXISTS `user` (
`user_id` varchar(32) COLLATE utf8_unicode_ci NOT NULL,
`user_pass` varchar(32) COLLATE utf8_unicode_ci NOT NULL DEFAULT '1234',
`user_mail` varchar(64) COLLATE utf8_unicode_ci DEFAULT NULL,
`user_phone` varchar(16) COLLATE utf8_unicode_ci DEFAULT NULL,
`user_online` tinyint(1) NOT NULL DEFAULT '0',
`user_enable` tinyint(1) NOT NULL DEFAULT '1',
`user_start_date` date NOT NULL,
`user_end_date` date NOT NULL,
PRIMARY KEY (`user_id`),
KEY `user_pass` (`user_pass`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
</pre>
<span class="br f12">- log table</span>
<pre class="brush: sql;">
CREATE TABLE IF NOT EXISTS `log` (
`log_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`user_id` varchar(32) COLLATE utf8_unicode_ci NOT NULL,
`log_trusted_ip` varchar(32) COLLATE utf8_unicode_ci DEFAULT NULL,
`log_trusted_port` varchar(16) COLLATE utf8_unicode_ci DEFAULT NULL,
`log_remote_ip` varchar(32) COLLATE utf8_unicode_ci DEFAULT NULL,
`log_remote_port` varchar(16) COLLATE utf8_unicode_ci DEFAULT NULL,
`log_start_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`log_end_time` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
`log_received` float NOT NULL DEFAULT '0',
`log_send` float NOT NULL DEFAULT '0',
PRIMARY KEY (`log_id`),
KEY `user_id` (`user_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
</pre>
<span class="br f12">- user data</span>
<pre class="brush: sql;">
INSERT INTO `user` (
`user_id`, `user_pass`, `user_mail`, `user_phone`,
`user_online`, `user_enable`, `user_start_date`, `user_end_date`
)
VALUES (
'test', '1234', 'mr.tumcpe@gmail.com',
'+66815447514', 0, 1, '2012-01-01', '0000-00-00'
);
</pre>
<span class="title f12 b">9. Show tables</span>
<pre class="brush: sql; highlight: [1];">
show tables;
+-------------------+
| Tables_in_openvpn |
+-------------------+
| log |
| user |
+-------------------+
</pre>
<span class="title f12 b">10. Show user data</span>
<pre class="brush: sql; highlight: [1];">
select * from user;
+---------+-----------+---------------------+--------------+-------------+-------------+-----------------+---------------+
| user_id | user_pass | user_mail | user_phone | user_online | user_enable | user_start_date | user_end_date |
+---------+-----------+---------------------+--------------+-------------+-------------+-----------------+---------------+
| test | 1234 | mr.tumcpe@gmail.com | +66815447514 | 0 | 1 | 2012-01-01 | 0000-00-00 |
+---------+-----------+---------------------+--------------+-------------+-------------+-----------------+---------------+
</pre>
<span class="title f12 b">11. Log out</span>
<pre class="brush: sql;">
exit;
</pre>
<span class="title f12 b">12. Edit file <b class="red">/etc/mysql/my.cnf</b> insert <b class="red">#</b> to line</span>
<pre class="brush: shell;">
bind-address = 127.0.0.1
</pre>
<span class="br f12">success</span>
<pre class="brush: shell;">
#bind-address = 127.0.0.1
</pre>
<span class="title f12 b">13. Edit file <b class="blue">/etc/rc.local</b> Add before <b class="red">exit 0;</b></span>
<pre class="brush: shell;">
iptables -A INPUT -i eth0 -p tcp -m tcp --dport 3306 -j ACCEPT
</pre>
<span class="title f12 b">14. Run Script Iptables</span>
<pre class="brush: shell;">
/etc/rc.local
iptables-save
</pre>
</div>
<span class="title f12 b red"><u>II. Install OpenVPN Server and generation of certificate, IP = 1.1.1.1</u></span>
<div style="padding-left: 10px;">
<span class="title f12 b">1. Install OpenVPN</span>
<pre class="brush: shell;">
apt-get install openvpn
</pre>
<span class="title f12 b">2. Generate the certificate Copy the certificate generator scripts from OpenVPN docs</span>
<pre class="brush: shell;">
cp -R /usr/share/doc/openvpn/examples/easy-rsa /etc/openvpn/.
cd /etc/openvpn/easy-rsa/2.0/
</pre>
<span class="title f12 b">3. Modify certificate variables</span>
<pre class="brush: shell;">
vi vars
</pre>
<span class="br f12">Edit this file and change the following lines into your case</span>
<pre class="brush: shell;">
export KEY_COUNTRY="TH"
export KEY_PROVINCE="BKK"
export KEY_CITY="Bangkok"
export KEY_ORG="Chtunnel-VPN"
export KEY_EMAIL="support@chtunnel.com"
</pre>
<span class="title f12 b">4. Save and exit. Run the variable script and clean</span>
<pre class="brush: shell;">
source ./vars
./clean-all
</pre>
<span class="title f12 b">5. Generate the public and private certificates. Just press ENTER or YES by default</span>
<pre class="brush: shell;">
./build-ca
./build-key-server server
./build-key client
./build-dh
mv keys /etc/openvpn/.
</pre>
<span class="br f12">In fact, generation of client is not necessary for a User/Pass authentication approach.</span>
</div>
<span class="title f12 b red"><u>III. Customize shell script, IP = 1.1.1.1</u></span>
<div style="padding-left: 10px;">
<span class="title f12 b">1. Create directory for script <b class="blue">'/etc/openvpn/script'</b></span>
<pre class="brush: shell;">
mkdir /etc/openvpn/script
cd /etc/openvpn/script
</pre>
<span class="title f12 b">2. Create file config.sh <b class="blue">'/etc/openvpn/script/config.sh'</b></span>
<pre class="brush: shell;">
#!/bin/bash
##Dababase Server
HOST='2.2.2.2'
#Default port = 3306
PORT='3306'
#Username
USER='USERNAME'
#Password
PASS='PASSWORD'
#database name
DB='openvpn'
</pre>
<span class="title f12 b">3. Create file test_connect_db.sh<b class="blue">'/etc/openvpn/script/test_connect_db.sh'</b></span>
<pre class="brush: shell;">
#!/bin/bash
. /etc/openvpn/script/config.sh
##Test Authentication
username=$1
password=$2
user_id=$(mysql -h$HOST -P$PORT -u$USER -p$PASS $DB -sN -e "select user_id from user where user_id = '$username' AND user_pass = '$password' AND user_enable=1 AND user_start_date != user_end_date AND TO_DAYS(now()) >= TO_DAYS(user_start_date) AND (TO_DAYS(now()) <= TO_DAYS(user_end_date) OR user_end_date='0000-00-00')")
##Check user
[ "$user_id" != '' ] && [ "$user_id" = "$username" ] && echo "user : $username" && echo 'authentication ok.' && exit 0 || echo 'authentication failed.'; exit 1
</pre>
<span class="title f12 b">4. Create file login.sh <b class="blue">'/etc/openvpn/script/login.sh'</b></span>
<pre class="brush: shell;">
#!/bin/bash
. /etc/openvpn/script/config.sh
##Authentication
user_id=$(mysql -h$HOST -P$PORT -u$USER -p$PASS $DB -sN -e "select user_id from user where user_id = '$username' AND user_pass = '$password' AND user_enable=1 AND user_start_date != user_end_date AND TO_DAYS(now()) >= TO_DAYS(user_start_date) AND (TO_DAYS(now()) <= TO_DAYS(user_end_date) OR user_end_date='0000-00-00')")
##Check user
[ "$user_id" != '' ] && [ "$user_id" = "$username" ] && echo "user : $username" && echo 'authentication ok.' && exit 0 || echo 'authentication failed.'; exit 1
</pre>
<span class="title f12 b">5. Create file connect.sh <b class="blue">'/etc/openvpn/script/connect.sh'</b></span>
<pre class="brush: shell;">
#!/bin/bash
. /etc/openvpn/script/config.sh
##insert data connection to table log
mysql -h$HOST -P$PORT -u$USER -p$PASS $DB -e "INSERT INTO log (log_id,user_id,log_trusted_ip,log_trusted_port,log_remote_ip,log_remote_port,log_start_time,log_end_time,log_received,log_send) VALUES(NULL,'$common_name','$trusted_ip','$trusted_port','$ifconfig_pool_remote_ip','$remote_port_1',now(),'0000-00-00 00:00:00','$bytes_received','$bytes_sent')"
##set status online to user connected
mysql -h$HOST -P$PORT -u$USER -p$PASS $DB -e "UPDATE user SET user_online=1 WHERE user_id='$common_name'"
</pre>
<span class="title f12 b">6. Create file disconnect.sh <b class="blue">'/etc/openvpn/script/disconnect.sh'</b></span>
<pre class="brush: shell;">
#!/bin/bash
. /etc/openvpn/script/config.sh
##set status offline to user disconnected
mysql -h$HOST -P$PORT -u$USER -p$PASS $DB -e "UPDATE user SET user_online=0 WHERE user_id='$common_name'"
##insert data disconnected to table log
mysql -h$HOST -P$PORT -u$USER -p$PASS $DB -e "UPDATE log SET log_end_time=now(),log_received='$bytes_received',log_send='$bytes_sent' WHERE log_trusted_ip='$trusted_ip' AND log_trusted_port='$trusted_port' AND user_id='$common_name' AND log_end_time='0000-00-00 00:00:00'"
</pre>
<span class="title f12 b">Compose OpenVPN configuration files, OpenVPN server will scan .conf files in <b class="red">/etc/openvpn</b> when it starts.<br />For each file, it forks a daemon. In this system,<br />we need both UDP and TCP support. I created two configuration files for two daemons in charge of UDP and TCP respectively.</span>
<span class="title f12 b">7. Create file server-tcp-443.conf <b class="blue">'/etc/openvpn/server-tcp-443.conf'</b> for Server Port:<b class="red">443</b></span>
<pre class="brush: shell;">
##protocol port
port 443
proto tcp
dev tun
##ip server client
server 10.4.0.0 255.255.255.0
##key
ca /etc/openvpn/keys/ca.crt
cert /etc/openvpn/keys/server.crt
key /etc/openvpn/keys/server.key
dh /etc/openvpn/keys/dh1024.pem
##option
persist-key
persist-tun
keepalive 5 60
reneg-sec 432000
##option authen.
comp-lzo
user nobody
#group nogroup
client-to-client
username-as-common-name
client-cert-not-required
auth-user-pass-verify /etc/openvpn/script/login.sh via-env
##push to client
max-clients 50
push "persist-key"
push "persist-tun"
push "redirect-gateway def1"
#push "explicit-exit-notify 1"
##DNS-Server
push "dhcp-option DNS 8.8.8.8"
push "dhcp-option DNS 8.8.4.4"
##script connect-disconnect
script-security 3 system
client-connect /etc/openvpn/script/connect.sh
client-disconnect /etc/openvpn/script/disconnect.sh
##log-status
status /etc/openvpn/log/tcp_443.log
log-append /etc/openvpn/log/openvpn.log
verb 3
</pre>
<span class="title f12 b">8. Create file server-udp-53.conf <b class="blue">'/etc/openvpn/server-udp-53.conf'</b> for Server Port:<b class="red">53</b></span>
<pre class="brush: shell;">
##protocol port
port 53
proto udp
dev tun
##ip server client
server 10.5.0.0 255.255.255.0
##key
ca /etc/openvpn/keys/ca.crt
cert /etc/openvpn/keys/server.crt
key /etc/openvpn/keys/server.key
dh /etc/openvpn/keys/dh1024.pem
##option
persist-key
persist-tun
keepalive 5 60
reneg-sec 432000
##option authen.
comp-lzo
user nobody
#group nogroup
client-to-client
username-as-common-name
client-cert-not-required
auth-user-pass-verify /etc/openvpn/script/login.sh via-env
##push to client
max-clients 50
push "persist-key"
push "persist-tun"
push "redirect-gateway def1"
push "explicit-exit-notify 1"
##DNS-Server
push "dhcp-option DNS 8.8.8.8"
push "dhcp-option DNS 8.8.4.4"
##script connect-disconnect
script-security 3 system
client-connect /etc/openvpn/script/connect.sh
client-disconnect /etc/openvpn/script/disconnect.sh
##log-status
status /etc/openvpn/log/udp_53.log
log-append /etc/openvpn/log/openvpn.log
verb 3
</pre>
<span class="title f12 b">9. Create directory for log <b class="blue">'/etc/openvpn/log'</b></span>
<pre class="brush: shell;">
mkdir /etc/openvpn/log
touch /etc/openvpn/log/openvpn.log
touch /etc/openvpn/log/tcp_443.log
touch /etc/openvpn/log/udp_53.log
</pre>
<span class="title f12 b">10. Changes the permission of files</span>
<pre class="brush: shell;">
chmod -R 755 /etc/openvpn
</pre>
<span class="title f12 b">11. Test authentication username <b class="red">'test'</b> and password <b class="red">'1234'</b></span>
<pre class="brush: shell; highlight: [1];">
/etc/openvpn/script/test_connect_db.sh test 1234
# user : test
# authentication ok.
# if authentication failed. check user and password in database
# or detail database server in /etc/openvpn/script/config.sh
</pre>
<span class="title f12 b">12. Start serviece OpenVPN</span>
<pre class="brush: shell;">
/etc/init.d/openvpn start
</pre>
</div>
<span class="title f12 b red"><u>IV. Share Internet to Client</u></span>
<div style="padding-left: 10px;">
<span class="title f12 b">1. Edit file <b class="blue">/etc/sysctl.conf</b> Remove <b class="red">#</b> In line : #net.ipv4.ip_forward=1</span>
<pre class="brush: shell;">
net.ipv4.ip_forward=1
</pre>
<span class="title f12 b">3. Edit file <b class="blue">/etc/rc.local</b> Add before <b class="red">exit 0;</b></span>
<pre class="brush: shell;">
echo "1" > /proc/sys/net/ipv4/ip_forward
echo "1" > /proc/sys/net/ipv4/ip_dynaddr
iptables -A INPUT -i tun0 -j ACCEPT
iptables -A FORWARD -i tun0 -j ACCEPT
iptables -A INPUT -i tun1 -j ACCEPT
iptables -A FORWARD -i tun1 -j ACCEPT
iptables -A INPUT -p udp --dport 53 -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -m tcp --dport 3306 -j ACCEPT
iptables -t nat -A POSTROUTING -s 10.4.0.0/24 -o eth0 -j MASQUERADE
iptables -t nat -A POSTROUTING -s 10.5.0.0/24 -o eth0 -j MASQUERADE
</pre>
<span class="title f12 b">4. Run Script Iptables Share Internet</span>
<pre class="brush: shell;">
/etc/rc.local
iptables-save
</pre>
</div>
<span class="title f12 b red"><u>V. Config for Client</u></span>
<div style="padding-left: 10px;">
<span class="title f12 b">1. Config for port <b class="blue">TCP</b> port <b class="red">443</b></span>
<pre class="brush: shell; highlight: [4,5];">
client
dev tun
proto tcp
remote 1.1.1.1 443
nobind
auth-user-pass
reneg-sec 432000
resolv-retry infinite
ca ca.crt
comp-lzo
verb 1
</pre>
<span class="title f12 b">2. Config for port <b class="blue">UDP</b> port <b class="red">53</b></span>
<pre class="brush: shell; highlight: [4,5];">
client
dev tun
proto udp
remote 1.1.1.1 53
nobind
auth-user-pass
reneg-sec 432000
resolv-retry infinite
ca ca.crt
comp-lzo
verb 1
</pre>
<span class="title f12 b">3. Copy file <b class="blue">ca.crt</b> from <b class="red">/etc/openvpn/keys/ca.crt</b> to same config path in client</span>
</div>
<span class="title f12 b blue">Day of user in database</span>
<pre class="brush: shell;">
# If today = '2012-01-01'
# day = user_start_date | user_end_date
# 0 = 0000-00-00 | 0000-00-00
# 0 = 2012-01-01 | 2012-01-01
# 0 = 2012-01-02 | 2012-01-01
# 1 = 2012-01-01 | 2012-01-02
# unlimited = 2012-01-01 | 0000-00-00
</pre>
<span class="title f14 b green">Install finish.</span>
<br />Unknownnoreply@blogger.com39tag:blogger.com,1999:blog-7693675076107588541.post-68305238956096911862012-06-14T09:52:00.002+07:002012-06-14T10:11:20.155+07:00MySQL update update more than one table<span class="main_title f14 b">MySQL update update more than one table</span>
<span class="title f12 b">In a MySQL update statement you can update more than one table like this</span>
<pre class="brush: sql;">
UPDATE tableA A
JOIN tableB B ON A.ID = B.ID
SET B.status = '1', B.status = '1'
WHERE A.ID = 'ID'
</pre>
<span class="f12 b">Or</span>
<pre class="brush: sql;">
UPDATE C
JOIN tableB B ON B.ID = C.ID
JOIN tableA A ON A.ID = B.ID
SET C.status = '1', A.status = '1'
WHERE A.ID = '1' OR A.ID = '2' OR A.ID = '3'
</pre>
<br />Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-7693675076107588541.post-67138889736275741882012-06-11T18:06:00.001+07:002012-06-12T15:13:10.111+07:00SQL query : count and result in MySQL<span class="main_title f14 b">SQL query : count and result one query in MySQL</span>
<span class="title f12 b">Table: banks</span>
<table class="tb_border">
<tr>
<th>bank_id</th>
<th>bank_name</th>
<th>bank_abbrev</th>
</tr>
<tr>
<td>1</td>
<td>Bangkok</td>
<td>BBL</td>
</tr>
<tr>
<td>2</td>
<td>Kasikornthai</td>
<td>KBANK</td>
</tr>
<tr>
<td>3</td>
<td>Siam Commercial</td>
<td>SCB</td>
</tr>
<tr>
<td>4</td>
<td>Krungthai</td>
<td>KTB</td>
</tr>
<tr>
<td>5</td>
<td>Krungsri</td>
<td>BAY</td>
</tr>
</table>
<span class="title f12 b">SQL query:</span>
<pre class="brush: sql">
SELECT b.*, t.total
FROM banks b
LEFT JOIN (
SELECT count(*) AS total
FROM banks
) AS t ON b.bank_id != -1
LIMIT 0, 3
</pre>
<span class="title f12 b">Query results:</span>
<table class="tb_border">
<tr>
<th>bank_id</th>
<th>bank_name</th>
<th>bank_abbrev</th>
<th>total</th>
</tr>
<tr>
<td>1</td>
<td>Bangkok</td>
<td>BBL</td>
<td>5</td>
</tr>
<tr>
<td>2</td>
<td>Kasikornthai</td>
<td>KBANK</td>
<td>5</td>
</tr>
<tr>
<td>3</td>
<td>Siam Commercial</td>
<td>SCB</td>
<td>5</td>
</tr>
</table>
<br />Unknownnoreply@blogger.com1tag:blogger.com,1999:blog-7693675076107588541.post-51664155681344808602012-02-01T11:53:00.003+07:002012-06-13T12:16:21.503+07:00VirtualHost on Linux<span class="main_title f14 b">VirtualHost on Linux</span>
<span class="title f12 b">Create file : <label class="red">/etc/apache2/sites-available/project</label></span>
<pre class="brush: xml">
<VirtualHost *:80>
ServerAdmin admin@project
ServerName project.dev
DocumentRoot /home/Workspace/project
<Directory /home/Workspace/project/>
Options Indexes FollowSymLinks
AllowOverride All
Order allow,deny
allow from all
</Directory>
ErrorLog "|/usr/sbin/rotatelogs /home/log/apache_logs/project/error.log.%Y-%m-%d-%H_%M_%S 86400"
CustomLog "|/usr/sbin/rotatelogs /home/log/apache_logs/project/access.log.%Y-%m-%d-%H_%M_%S 86400" combined
</VirtualHost>
</pre>
<span class="title f12 b">Make link</span>
<pre class="brush: shell;">
ln -s /etc/apache2/sites-available/project /etc/apache2/sites-enabled/.
</pre>
<span class="title f12 b">Insert to file <label class="red">/etc/hosts</label></span>
<pre class="brush: shell;">
127.0.0.1 project.dev
</pre>
<span class="title f12 b">Create dir for log</span>
<pre class="brush: shell;">
mkdir /home/log/apache_logs/project
</pre>
<span class="title f12 b">Restart Apache</span>
<pre class="brush: shell;">
/etc/init.d/apache2 restart
</pre>
<br />Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-7693675076107588541.post-14573563852348083842012-02-01T11:32:00.000+07:002012-06-11T23:40:13.265+07:00.htacceess: Invalid command 'RewriteEngine'<span class="main_title f14 b">.htacceess: Invalid command 'RewriteEngine'</span>
<span class="title f12 b">You haven't loaded mod_rewrite. (as a superuser)</span>
<pre class="brush: shell">
a2enmod rewrite
apache2ctl restart
</pre>
<br />Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-7693675076107588541.post-32761201073656566592011-12-13T12:40:00.000+07:002012-06-13T11:43:37.876+07:00sudoers command in root user<span class="main_title f14 b">sudoers command in root user</span>
<span class="title f12 b">file : <label class="red">/etc/sudoers</label></span>
<pre class="brush: shell;">
user_group ALL=(ALL) NOPASSWD: /usr/local/bin/command.sh
#Cmnd_Alias COMMAND_USER = /usr/local/bin/command.sh
#user_group ALL=(ALL) NOPASSWD: COMMAND_USER
</pre>
<br />Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-7693675076107588541.post-55643628061826933782011-07-06T11:46:00.001+07:002012-06-13T11:35:21.721+07:00ASP.NET Error The conversion of a nvarchar data type to a smalldatetime data type resulted in an out-of-range value.<span class="main_title f14 b">ASP.NET Error The conversion of a nvarchar data type to a smalldatetime data type resulted in an out-of-range value.</span>
<span class="title f12 b">Can fix:</span>
<pre class="brush: c;">
userQuizDataSource.InsertParameters.Add(
"DateTimeComplete",
TypeCode.DateTime,
DateTime.Now.ToString()
);
</pre>
<br />Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-7693675076107588541.post-17591829956373451232011-03-28T21:31:00.000+07:002012-06-13T11:15:41.695+07:00ReadFile Encoding UTF-8 - java<span class="main_title f14 b">ReadFile Encoding UTF-8 - java</span>
<pre class="brush: java;">
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
public class ReadUTF8Data {
private static final String FILE_ENCODE = "UTF-8";
public static void main(String[] args) {
String data = null;
BufferedReader dataIns = null;
String file = "";
try {
dataIns = new BufferedReader(new InputStreamReader(
new FileInputStream(file), FILE_ENCODE));
while ((data = dataIns.readLine()) != null) {
System.out.println("Line 1 :" + data);
}
dataIns.close();
dataIns = null;
} catch (IOException e) {
e.printStackTrace();
}
}
}
</pre>
<br />Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-7693675076107588541.post-68185637563774729702011-03-15T02:41:00.001+07:002012-06-13T10:37:46.205+07:00mysql server เข้าใช้ได้จากเครื่องอื่น<span class="main_title f14 b">mysql server เข้าใช้ได้จากเครื่องอื่น</span>
<span class="title f12 b">แก้ไฟล์ /etc/mysql/my.cnf</span>
<pre class="brush: shell;">
bind-address = 127.0.0.1
</pre>
<span class="br f12">เป็น</span>
<pre class="brush: shell;">
#bind-address = 127.0.0.1
</pre>
<span class="title f12 b">กำหนดสิทธิ์การเข้าใช้ Database</span>
<pre class="brush: sql;">
mysql> GRANT ALL ON DB_NAME.* TO 'USERNAME'@"%" IDENTIFIED BY 'NEW_PASSWORD';
</pre>
<br />Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-7693675076107588541.post-34731944028045453942011-03-08T01:12:00.001+07:002012-06-13T10:24:08.537+07:00Turn on Bash Smart Completion<span class="main_title f14 b">Turn on Bash Smart Completion</span>
<span class="title f12 b">The Bash shell has this sweet feature where you can use the TAB key to auto-complete certain things. For example, when I am in my home directory, the following command:</span>
<pre class="brush: shell;">
cd Do[TAB-key]
</pre>
<span class="title f12 b">will automatically yield:</span>
<pre class="brush: shell;">
cd Documents
</pre>
<span class="br f12">If you are an absolute novice, like I was, not so long ago, discovering tab completion in the terminal can make you go “Wow!”. Wait till you hear the rest now</span>
<span class="title f12 b">Though you can use the TAB key to complete the names of files and directories, by default the completion is pretty “dumb”. If you have already typed</span>
<pre class="brush: shell;">
cd D
</pre>
<span class="br f12">you would expect that the tab key would cause only the directory names to be completed, but if I try it on my machine, the tab completion tool uses filenames too.</span>
<span class="br f12">Now, don’t despair! There is now a smart bash tab completion trick you can use. Smart completion even complete the arguments to commands!!</span>
<span class="title f12 b">To enable smart completion, edit your</span>
<pre class="brush: shell;">
/etc/bash.bashrc
</pre>
<span class="title f12 b">file. Uncomment the following lines, by removing the # in the beginning of the lines:</span>
<pre class="brush: shell;">
#if [ -f /etc/bash_completion ]; then
# . /etc/bash_completion
#fi
</pre>
<span class="br f12">Now you can use tab completion to power your way through commands.</span>
<span class="title f12 b">You can even extend bash smart completion to your own favourite commands<br />by using <label class="green">/etc/bash_completion</label>, the “complete” utility and <label class="green">/etc/bash_completion.d</label><br />Explaining the nitty-gritty is beyond me. I refer you to <a href="http://www.debian-administration.org/articles/316" target="_blank">the Debian Administration gurus for more information regarding smarter bash completion.</a></span>
<br />Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-7693675076107588541.post-73448460515894476872011-02-25T15:17:00.001+07:002012-06-13T00:46:06.061+07:00ป้องกันการโดนโจมตีเครื่องเซิร์ฟเวอร์ด้วย iptable<span class="main_title f14 b">ป้องกันการโดนโจมตีเครื่องเซิร์ฟเวอร์ด้วย iptable</span>
<span class="br f12">IPTABLES เป็น Firewall พื้นฐานของ Linux เกือบทุก Distro และให้ประสิทธิภาพที่สูงมากในการ Filtering Traffic และ การป้องกันการ Attack ต่างๆ โดยที่จะมีตัวอย่างพอสังเขป ดังนี้</span>
<span class="title f12 b">เปิดการใช้งาน IP Forward ป้องกัน Syn Flood และ อนุญาติให้มีการใช้งานแบบ Dynamic IP (ต่อเนต DSL ทั่วไป)</span>
<pre class="brush: shell;">
echo 1 > /proc/sys/net/ipv4/ip_forward
echo 1 > /proc/sys/net/ipv4/tcp_syncookies
echo 1 > /proc/sys/net/ipv4/ip_dynaddr
</pre>
<span class="title f12 b">Drop Packet ก่อนหน้านี้ทั้งหมด</span>
<pre class="brush: shell;">
iptables -F INPUT
iptables -F FORWARD
iptables -F OUTPUT
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
iptables -A INPUT -i lo -j ACCEPT
</pre>
<span class="title f12 b">อนุญาติเฉพาะ SSH, SMTP, DNS, Web Services, SSL และ POP3 ให้ผ่านเข้าออก</span>
<pre class="brush: shell;">
iptables -A INPUT -p tcp -m state –state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -p tcp –dport 22 –syn -j ACCEPT
iptables -A INPUT -p tcp –dport 25 –syn -j ACCEPT
iptables -A INPUT -p tcp –dport 53 –syn -j ACCEPT
iptables -A INPUT -p udp –dport 53 –syn -j ACCEPT
iptables -A INPUT -p tcp –dport 80 –syn -j ACCEPT
iptables -A INPUT -p tcp –dport 443 –syn -j ACCEPT
iptables -A INPUT -p tcp –dport 110 –syn -j ACCEPT
</pre>
<span class="title f12 b">ป้องกันการ scan ports</span>
<pre class="brush: shell;">
iptables -N check-flags
iptables -F check-flags
iptables -A check-flags -p tcp –tcp-flags ALL FIN,URG,PSH -m limit –limit 5/minute -j LOG –log-level alert –log-prefix "NMAP:"
iptables -A check-flags -p tcp –tcp-flags ALL FIN,URG,PSH -j DROP
iptables -A check-flags -p tcp –tcp-flags ALL ALL -m limit –limit 5/minute -j LOG –log-level 1 –log-prefix "XMAS:"
iptables -A check-flags -p tcp –tcp-flags ALL ALL -j DROP
iptables -A check-flags -p tcp –tcp-flags ALL SYN,RST,ACK,FIN,URG -m limit –limit 5/minute -j LOG –log-level 1 –log-prefix "XMAS-PSH:"
iptables -A check-flags -p tcp –tcp-flags ALL SYN,RST,ACK,FIN,URG -j DROP
iptables -A check-flags -p tcp –tcp-flags ALL NONE -m limit –limit 5/minute -j LOG –log-level 1 –log-prefix "NULL_SCAN:"
iptables -A check-flags -p tcp –tcp-flags ALL NONE -j DROP
iptables -A check-flags -p tcp –tcp-flags SYN,RST SYN,RST -m limit –limit 5/minute -j LOG –log-level 5 –log-prefix "SYN/RST:"
iptables -A check-flags -p tcp –tcp-flags SYN,RST SYN,RST -j DROP
iptables -A check-flags -p tcp –tcp-flags SYN,FIN SYN,FIN -m limit –limit 5/minute -j LOG –log-level 5 –log-prefix "SYN/FIN:"
iptables -A check-flags -p tcp –tcp-flags SYN,FIN SYN,FIN -j DROP
</pre>
<span class="title f12 b">ป้องกันการ flood SSH (SSH Brute Force)</span>
<pre class="brush: shell;">
iptables -I INPUT -p tcp –dport 22 -i eth0 -m state –state NEW -m recent –set
iptables -I INPUT -p tcp –dport 22 -i eth0 -m state –state NEW -m recent –update –seconds 600 –hitcount 2 -j DROP
</pre>
<span class="title f12 b">ห้าม ping</span>
<pre class="brush: shell;">
iptables -A INPUT -p ICMP -i eth0 –icmp-type 8 -j DROP
</pre>
<span class="title f12 b">ห้าม traceroute</span>
<pre class="brush: shell;">
iptables -A INPUT -p ICMP -i eth0 –icmp-type 11 -j DROP
</pre>
<span class="title f12 b">Protect Syn Flood</span>
<pre class="brush: shell;">
iptables -N syn-flood
iptables -A syn-flood -i eth0 -m limit –limit 75/s –limit-burst 100 -j RETURN
iptables -A syn-flood -j LOG –log-prefix "SYN-FLOOD: "
iptables -A syn-flood -j DROP
</pre>
<span class="title f12 b">REDIRECT PORT 10080 to 80 (192.168.xxx.xxx = ip ของเรา)</span>
<pre class="brush: shell;">
iptables -t nat -A PREROUTING -i eth0 -p tcp –dport 80 -j DNAT –to 192.168.xxx.xxx:10080
iptables -A FORWARD -p tcp -i eth0 -d 192.168.xxx.xxx –dport 80 -j ACCEPT
iptables -A FORWARD -p tcp -i eth0 -d 192.168.xxx.xxx –sport 80 -j ACCEPT
</pre>
<span class="title f12 b">Transparent Proxy</span>
<pre class="brush: shell;">
iptables -t nat -A PREROUTING -p TCP –dport 80 -j REDIRECT -to-ports 3128
</pre>
<br />Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-7693675076107588541.post-57235916752853674342011-02-14T01:38:00.002+07:002012-06-13T00:25:08.401+07:00DNS Thailand<span class="main_title f14 b">DNS Thailand</span>
<span class="title f12 b">Dns in thailand and other</span>
<pre class="brush: shell;">
#true-old
203.144.255.71
203.144.255.72
#true-new
203.144.207.29
203.144.207.49
#A-net
Primary Domain Name Server (DNS) : 203.148.255.70
Secondary Domain Name Server (DNS) : 203.148.255.80
#Asia Access
Primary Domain Name Server (DNS) : 203.145.0.1
Secondary Domain Name Server (DNS) : 203.145.0.2
#Asia Infonet
Primary Domain Name Server (DNS) : 203.144.255.71
Secondary Domain Name Server (DNS) : 203.144.255.72
#Assumption University ABAC
Primary Domain Name Server (DNS) : 202.6.100.1
Secondary Domain Name Server (DNS) : 202.6.100.2
#CS Internet
Primary Domain Name Server (DNS) : 202.183.255.20
Secondary Domain Name Server (DNS) : 202.183.255.21
#CWN internet ( Chomanan Worldnet )
Primary Domain Name Server (DNS) : 202.74.32.3
Secondary Domain Name Server (DNS) : 202.74.32.4
#DataLine Thai
Primary Domain Name Server (DNS) : 202.80.252.1
Secondary Domain Name Server (DNS) : 202.80.252.2
#Internet Thailand
Primary Domain Name Server (DNS) : 202.44.202.2
Secondary Domain Name Server (DNS) : 202.44.202.3
Proxy Cache Server : proxy.inet.co.th Port : 8080
#Jasmine Internet ( Ji-Net )
Primary Domain Name Server (DNS) : 203.147.0.2
Secondary Domain Name Server (DNS) : 203.147.0.3
#KSC
Primary Domain Name Server (DNS) : 203.155.33.1
Secondary Domain Name Server (DNS) : 202.44.144.33
Incoming mail (POP3) : ksc.th.com or 203.155.33.38
Outgoing mail (SMTP) : ksc.th.com or 203.155.33.38
#Loxinfo
Primary Domain Name Server (DNS) : 203.146.0.20
Secondary Domain Name Server (DNS) : 203.146.0.30
#MWEB
Primary Domain Name Server (DNS) : 203.155.33.1
Secondary Domain Name Server (DNS) : 202.44.144.33
#Samart Infonet
Primary Domain Name Server (DNS) : 203.149.0.2
Secondary Domain Name Server (DNS) : 203.149.0.3
#Siam Global Access
Primary Domain Name Server (DNS) : 202.51.128.65
Secondary Domain Name Server (DNS) : 202.51.128.66
#TOT online
Primary Domain Name Server (DNS) : 203.113.93.1
Secondary Domain Name Server (DNS) : 203.113.93.2
#บริษัท เค เอส ซี คอมเมอร์เชียล อินเตอร์เนต จำกัด
203.155.33.1
202.44.144.33
203.155.33.3
203.155.33.44
#บริษัท ทรู อินเทอร์เน็ต จำกัด
203.144.255.71
203.144.207.29
203.144.207.49
#บริษัท กสท โทรคมนาคม จำกัด (มหาชน)
202.129.27.135
202.129.27.133
#บริษัท ทีโอที จำกัด (มหาชน)
203.113.24.199
203.113.127.199
203.113.15.99
203.113.15.100
203.113.15.133
203.113.15.143
#บริษัท อินเทอร์เน็ตประเทศไทย จำกัด (มหาชน) หรือไอเน็ต
203.150.213.1
203.150.218.161
202.44.202.2
202.44.202.3
#บริษัท ซีเอส ล็อกซอินโฟ จำกัด (มหาชน)
203.146.237.237
203.146.237.222
203.146.0.30
203.146.0.20
#บริษัท จัสมิน อินเตอร์เนต จำกัด
203.147.0.3
203.147.0.2
203.130.159.20
203.130.159.21
#บริษัท ทีทีแอนด์ที จำกัด (มหาชน)
202.69.137.131
202.69.137.132
202.69.137.83
202.69.137.84
##OpenDns
208.67.220.220
208.67.222.222
##GoogleDns
8.8.4.4
8.8.8.8
server=202.69.137.137 # Triple T Global Net 41
server=202.69.137.138 # Triple T Global Net 45
server=203.146.237.237 # csloxinfo 39
server=203.121.130.40 # Pacific 39.9
server=203.144.255.72 # asianet 40.9
server=202.44.144.33 # KSC 41.5
server=203.146.102.231 # truefaster 42.5
server=203.144.255.71 # asianet 42.8
server=202.129.27.134 # cattelecom 43.6
server=203.146.237.222 # csloxinfo 48.5
server=202.57.160.129 # Issp 48.9
server=202.6.100.1 # ABAC 50
server=203.121.130.39 # Pacific 51.5
server=203.155.33.1 # KSC 51.9
server=202.44.68.3 # Sripatum 52.7
server=203.144.207.49 # asianet (True) 54.5
server=203.144.207.29 # asianet (True) 58.1
server=202.57.128.71 # SGA 62
server=203.147.0.3 # Jasmine Internet 62.4
server=61.19.245.246 # cattelecom *
server=61.19.254.134 # cattelecom *
server=202.47.249.4 # cattelecom *
server=203.148.255.70 # A-Net *
server=203.148.255.78 # A-Net *
server=203.149.0.2 # Samart *
server=203.149.0.3 # Samart *
server=203.146.222.3 # buddybb *
server=203.158.144.1 # Rmutp *
server=203.146.64.33 # Tnet *
server=202.182.0.1 # FarEast *
server=202.182.0.2 # FarEast *
server=192.150.249.11 # Thammasat *
server=208.67.222.222 # OpenDNS 277.8
server=208.67.220.220 # OpenDNS 285.1
</pre>
<br />Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-7693675076107588541.post-12163667933439703382011-01-21T17:31:00.002+07:002012-06-13T00:18:01.421+07:00Set Zone Time in Debian<span class="main_title f14 b">Set Zone Time in Debian</span>
<span class="title f12 b">Set Zeone Time</span>
<pre class="brush: shell;">
dpkg-reconfigure tzdata
</pre>
<span class="title f12 b">Check</span>
<pre class="brush: shell;">
date
</pre>
<br />Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-7693675076107588541.post-68395686776412514672011-01-21T14:25:00.000+07:002012-06-13T00:13:20.215+07:00How to kill a thread in delphi?<span class="main_title f14 b">How to kill a thread in delphi?</span>
<span class="title f12 b">TMyThread Execute</span>
<pre class="brush: cpp;">
procedure TMyThread.Execute;
begin
while not Terminated do begin
//Here you do a chunk of your work.
//It's important to have chunks small enough so that "while not Terminated"
//gets checked often enough.
end;
//Here you finalize everything before thread terminates
end;
</pre>
<span class="title f12 b">With this, you can call</span>
<pre class="brush: cpp;">
MyThread.Terminate;
</pre>
<span class="title f12 b">There is another method, called 'forced termination'. You can call</span>
<pre class="brush: cpp;">
TerminateThread(MyThread.ThreadId);
</pre>
<br />Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-7693675076107588541.post-45333769589012050702010-12-13T23:54:00.000+07:002012-06-13T00:02:06.413+07:00java JDBC MySQL Connect<span class="main_title f14 b">java JDBC MySQL Connect</span>
<span class="title f12 b">Table: test</span>
<table class="tb_border">
<tr>
<th>ID</th>
<th>Name</th>
</tr>
<tr>
<td>1</td>
<td>A</td>
</tr>
<tr>
<td>2</td>
<td>B</td>
</tr>
<tr>
<td>3</td>
<td>C</td>
</tr>
</table>
<br />
<pre class="brush: cpp;">
import java.io.File;
import java.sql.*;
import java.sql.DriverManager;
import java.sql.SQLException;
public class Main {
public static void main(String args[]) {
Connection con = null;
try {
Class.forName("com.mysql.jdbc.Driver");
con = DriverManager.getConnection("jdbc:mysql://localhost","USERNAME", "PASSWORD");
Statement st = con.createStatement();
ResultSet rs = st.executeQuery("select * from test");
int count = 0;
while(rs.next())
{
System.out.println("ID : " + rs.getString(0));
System.out.println("NAME : " + rs.getString(1));
count++;
}
System.out.println("sum = "+count);
} catch(Exception e) {
e.printStackTrace();
System.out.println("Exception: " + e.getMessage());
} finally {
try {
if(con != null)
con.close();
} catch(SQLException e) {}
}
}
}
</pre>
<br />Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-7693675076107588541.post-17281716660185693142010-12-11T06:46:00.021+07:002012-06-13T11:28:23.366+07:00List ชื่อไฟล์ใน Directory - java<span class="main_title f14 b">List ชื่อไฟล์ใน Directory ด้วย java</span>
<span class="title f12 b">อ่านชื่อไฟล์ทั้งหมดใน Directory ตัวอย่าง แสดงเฉพาะ .txt และ .TXT</span>
<pre class="brush: java;">
import java.io.File;
public class ListFiles
{
public static void main(String[] args)
{
// Directory path here
String path = ".";
String files_name;
File folder = new File(path);
File[] listOfFiles = folder.listFiles();
for (int i = 0; i < listOfFiles.length; i++)
{
if (listOfFiles[i].isFile())
{
files_name = listOfFiles[i].getName();
if (files_name.endsWith(".txt") || files_name.endsWith(".TXT"))
{
System.out.println(files_name);
}
}
}
}
}
</pre>
<br />Unknownnoreply@blogger.com1tag:blogger.com,1999:blog-7693675076107588541.post-11267524886026423902010-11-23T11:52:00.000+07:002012-06-13T11:18:38.238+07:00URLReader - java<span class="main_title f14 b">URLReader ด้วย java</span>
<span class="title f12 b">อ่าน HTML code จากเว็บ <label class="red">http://www.google.com </label></span>
<pre class="brush: java;">
import java.net.*;
import java.io.*;
public class URLReader {
public static void main(String[] args) throws Exception {
URL url = new URL("http://www.google.com");
BufferedReader in = new BufferedReader(
new InputStreamReader(
url.openStream()));
String inputLine;
while ((inputLine = in.readLine()) != null)
System.out.println(inputLine);
in.close();
}
}
</pre>
<br />Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-7693675076107588541.post-5332718793302618542010-10-16T10:54:00.003+07:002012-06-12T21:54:30.733+07:00การใช้งาน และ config github เบื้องต้น<span class="main_title f14 b">การใช้งาน และ config github เบื้องต้น</span>
<span class="title f12 b">- สมัครสมาชิก github ที่ <label class="red">http://www.github.com/</label><br />- สร้าง Github Repository โดยเลือกที่ <label class="green">New repository</label></span>
<span class="f12 br">กรอกรายละเอียดให้ครบ หลังจากนั้นจะเห็นการแนะนำขั้นตอนการใช้งาน</span>
<pre class="brush: shell; highlight: [3,4,7,8,9,10,11,12,13,14,17,18,19,23,24]">
#Global setup:
#Set up git
git config --global user.name "Chagridsada Boonthus"
git config --global user.email mr.tumcpe@gmail.com
#Next steps:
mkdir chagridsada-blog
cd chagridsada-blog
git init
touch README
git add README
git commit -m 'first commit'
git remote add origin https://github.com/chagridsada/chagridsada-blog.git
git push -u origin master
#Existing Git Repo?
cd existing_git_repo
git remote add origin https://github.com/chagridsada/chagridsada-blog.git
git push -u origin master
#Importing a Subversion Repo?
#Push the repo
git remote add origin git@github.com:chagridsada/chagridsada-blog.git
git push origin master
#When you're done:
#Continue
</pre>
<span class="title f12 b">- Download และ ติดตั้ง Git ได้ที่ <label class="b red">http://git-scm.com/downloads</label><br />- เพิ่ม public key เพื่อให้สามารถติดต่อกับ Github ได้โดย</span>
<span class="f12 br">1.สร้าง public key โดยดูขั้นตอนจาก <label class="b red">https://help.github.com/articles/generating-ssh-keys</label></span>
<span class="f12 br">2.ไปที่หน้า profile เลือก <label class="b blue">Edit Your Profile</label></span>
<span class="f12 br">3.เลือกที่ <label class="b blue">SSH keys</label></span>
<span class="f12 br">4.นำ public key ที่ได้มาใส่ แล้วบันทึก</span>
<span class="title f12 b">- ทดสอบสร้าง project ตามขั้นตอนที่ได้มาตอนแรกเป็นอันเสร็จ.</span>
<br />Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-7693675076107588541.post-53919212095028994262010-10-13T09:51:00.000+07:002012-06-12T15:09:37.499+07:00การติดตั้ง Apache, PHP, MySQL และ phpMyAdmin บน Ubuntu<span class="main_title f14 b">การติดตั้ง Apache, PHP, MySQL และ phpMyAdmin บน Ubuntu</span>
<span class="title f12 b">การติดตั้ง Apache</span>
<div style="padding-left: 20px;">
<span class="title f12 b">1. เปิด Terminal จาก Applications/Utilities/Terminal จากนั้นให้พิมพ์คำสั่งนี้</span>
<pre class="brush: shell">sudo apt-get install apache2</pre>
<span class="title f12 b">2. หากใน Terminal เห็นข้อความว่า
<label class="br" style="color:red;">apache2: Could not reliably determine the server's fully qualified domain name, using 127.0.1.1 for ServerName</label>
<label class="br"> : สามารถแก้ไขได้โดยใช้พิมพ์คำสั่งนี้</label>
</span>
<pre class="brush: shell">gksu vi /etc/apache2/conf.d fqdn</pre>
<span class="br f12">เมื่อเปิดเสร็จแล้ว ให้พิมพ์ <b>ServerName localhost</b> ลงไปในไฟล์และบันทึก จากนั้นก็ปิดไฟล์</span>
<span class="title f12 b">3. เมื่อติดตั้งเสร็จแล้ว ทดสอบโดยใฃ้เบราว์เซอร์ และเปิด <b>http://localhost</b><br />หากใช้งานได้จะพบข้อความว่า <b style="color:red;">It works!</b></span>
</div>
<span class="title f12 b">การติดตั้ง PHP5</span>
<div style="padding-left: 20px;">
<span class="title f12 b">1. พิมพ์คำสั่ง</span>
<pre class="brush: shell">sudo apt-get install php5 libapache2-mod-php5</pre>
<span class="title f12 b">2. เมื่อลง PHP5 เสร็จแล้วจำเป็นต้องเริ่มการทำงานของ Apache อีกครั้ง ด้วยการใช้คำสั่ง</span>
<pre class="brush: shell">sudo /etc/init.d/apache2 restart</pre>
<span class="title f12 b">3. ทดสอบการใช้งาน PHP โดยพิมพ์คำสั่ง</span>
<pre class="brush: shell">sudo vi /var/www/info.php</pre>
<span class="br f12">- เมื่อไฟล์ถูกเปิดขึ้นมาแล้ว ให้พิมพ์โค้ด PHP ดังนี้</span>
<pre class="brush: php; highlight: [2]; html-script: true">
<?php
phpinfo();
?>
</pre>
<span class="br f12 ">- จากนั้นให้บันทึกไฟล์และปิดไฟล์นี้</span>
<span class="title f12 b">4. ทดสอบโดยใฃ้เบราว์เซอร์ และเปิด http://localhost/info.php หากใช้งานได้จะผลดังนี้</span>
<div align="center"><img alt="Display PHP Info" src="http://www.kiterminal.com/blog/sites/default/files/node-53/phpinfo.png" width="400" /></div>
</div>
<span class="title f12 b">การติดตั้ง MySQL</span>
<div style="padding-left: 20px;">
<span class="title f12 b">1. พิมพ์คำสั่ง</span>
<pre class="brush: shell">sudo apt-get install mysql-server</pre>
<span class="title f12 b">2. เมื่อเห็นภาพดังด้านล่างนี้ ให้กรอกรหัสผ่านสำหรับผู้ใช้ root ฃอง MySQL</span>
<div align="center"><img alt="Configuring mysql-server-5.0" src="http://www.kiterminal.com/blog/sites/default/files/node-53/mysql-config.png" width="400" /></div>
<span class="title f12 b">3. หลังจากติดตั้งเสร็จ จะต้องให้ PHP ทำงานร่วมกับ MySQL ได้โดยเปิดไฟล์ php.ini ด้วยคำสั่งนี้</span>
<pre class="brush: shell">gksudo vi /etc/php5/apache2/php.ini</pre>
<span class="br f12">- จากนั้นแก้ไขบรรทัดที่มี</span>
<pre class="brush: shell">;extension=msql.so</pre>
<span class="br f12">เป็น</span>
<pre class="brush: shell">extension=msql.so</pre>
<span class="br f12">- ต่อไปก็เริ่มการทำงาน Apache อีกครั้งด้วยคำสั่ง</span>
<pre class="brush: shell">sudo /etc/init.d/apache2 restart</pre>
</div>
<span class="title f12 b">การติดตั้ง phpMyAdmin</span>
<div style="padding-left: 20px;">
<span class="title f12 b">1. พิมพ์คำสั่ง</span>
<pre class="brush: shell">sudo apt-get install libapache2-mod-auth-mysql php5-mysql phpmyadmin</pre>
<span class="title f12 b">2. เมื่อเห็นภาพดังด้านล่างนี้ ให้เลือก Apache2</span>
<div align="center"><img alt="Configuring phpmyadmin" src="http://www.kiterminal.com/blog/sites/default/files/node-53/phpmyadmin-config.png" width="400" /> </div>
<span class="title f12 b">3. สร้างทางลัดใน /var/www</span>
<pre class="brush: shell">sudo ln -s /usr/share/phpmyadmin/ /var/www/phpmyadmin</pre>
<span class="title f12 b">4. เมื่อติดตั้งเสร็จแล้ว ให้ทดสอบโดยใฃ้เบราว์เซอร์ และเปิด http://localhost/phpmyadmin จะได้ผลดังนี้</span>
<div align="center"><img alt="Display phpMyAdmin" src="http://www.kiterminal.com/blog/sites/default/files/node-53/phpmyadmin.png" width="400" /> </div>
</div>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-7693675076107588541.post-11350942357252047292010-10-09T21:05:00.000+07:002012-06-12T22:09:36.755+07:00CodeFese2010#8 กิจกรรมเขียนโปรแกรมมาราธอน ครั้งที่ 8<div style="text-align: center;"></div><div style="text-align: center;"></div><div style="text-align: center;"></div><div style="text-align: center;"></div><div style="text-align: center;"></div><div style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhpdxzjiAvFT_owtkl4A9dKeCpg0ht8I8xHASxKn4gfxkBC1BTMXTvbTp8_Gq2lvqfCX6waJBfsFLHIz8_kY_Nil4ZC6ko1ffJoKYfaewpLd6yzsx1XsM7QIPgVfjaeVk10elMhqW8p-eQ/s1600/title.jpg" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="113" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhpdxzjiAvFT_owtkl4A9dKeCpg0ht8I8xHASxKn4gfxkBC1BTMXTvbTp8_Gq2lvqfCX6waJBfsFLHIz8_kY_Nil4ZC6ko1ffJoKYfaewpLd6yzsx1XsM7QIPgVfjaeVk10elMhqW8p-eQ/s320/title.jpg" width="320" /> </a> </div><div style="text-align: left;"></div><div style="text-align: left;"><table align="center" border="0"><tbody>
<tr bgcolor="#336699"><td><span style="color: white;"><span style="font-size: x-small;">สถานที่จัดกิจกรรม</span></span></td></tr>
<tr style="color: red;"><td><b><span style="font-size: small;"> ณ </span><span style="font-size: small;">มหาวิทยาลัยพายัพ จังหวัดเชียงใหม่ </span></b></td></tr>
<tr bgcolor="#336699"><td><span style="color: white; font-size: x-small;"> วัตถุประสงค์ </span></td></tr>
<tr><td><span style="font-size: x-small;"> <ol><li>เพิ่มจำนวนซอฟต์แวร์โอเพนซอร์สที่พัฒนาในประเทศ และยกระดับความสามารถของนักพัฒนาไทยให้ทัดเทียมกับนานาประเทศ</li>
<li>เปิดโอกาสให้ผู้ที่สนใจได้เพิ่มความรู้และทักษะในการพัฒนาโปรแกรมแบบโอเพนซอร์ส ซี่งเป็นการเพิ่มศักยภาพด้านวิชาชีพ</li>
<li>เป็นสื่อกลางของนักพัฒนาที่มีความสนใจร่วมกัน และมีส่วนสร้างชุมชนนักพัฒนาโอเพนซอร์สให้เกิดขึ้นใน</li>
</ol></span></td></tr>
<tr bgcolor="#336699"><td><span style="color: white; font-size: x-small;"> ลักษณะกิจกรรม </span></td></tr>
<tr><td><span style="font-size: x-small;"> <big>จั</big>ดกิจกรรมในรูปแบบการเข้าค่ายเขียนโปรแกรมมาราธอนแบบโอเพนซอร์ส เพื่อให้ผู้เข้าร่วมกิจกรรมได้เรียนรู้วิธีการและสิ่งแวดล้อมในการพัฒนา ซอฟต์แวร์จากทีมนักวิจัยโอเพนซอร์ส ของศูนย์เทคโนโลยีอิเล็กทรอนิกส์และคอมพิวเตอร์แห่งชาติ ซึ่งจะให้คำแนะนำกระบวนการพัฒนาซอฟต์แวร์โอเพนซอร์ส ตลอดโครงการ รวม 2 วัน 1 คืน (ผู้เข้าร่วมกิจกรรมต้องพักค้างคืนในค่าย) รายละเอียดดังนี้ <ul type="disc"><li> รับสมัครผู้เข้าร่วมกิจกรรม 30 คน (พิจารณาคัดเลือกจากความสนใจ) โดยเปิดโอกาสกว้างแก่นักเรียน นักศึกษา และ บุคคลทั่วไปที่มีความสนใจจากทั่วประเทศ</li>
<li>เงื่อนไขการสมัคร ผู้สมัครต้องมีความสามารถในการเขียนโปรแกรมมาก่อน และมีความสนใจเรียนรู้การพัฒนาโปรแกรมแบบโอเพนซอร์ส และต้องสามารถร่วมกิจกรรมได้ตลอดโครงการ</li>
<li>ในระหว่างการเข้าค่าย ผู้ร่วมกิจกรรมเข้ากลุ่มตามความสนใจ กลุ่มละ 5-7 คน ตามโจทย์หัวข้อโปรแกรมที่ระบุในขั้นตอนรับสมัคร</li>
<li>ระดมสมองเพื่อกำหนดรูปแบบ และผลลัพธ์ของกิจกรรม</li>
<li>แบ่งหน้าที่กันทำงาน เพื่อให้แต่ละกลุ่มได้ผลลัพธ์ที่ต้องการ</li>
<li>นำเสนอผลงาน และ เป้าหมายในการดำเนินงานของกลุ่ม</li>
<li>ผลลัพธ์ที่ได้จากกิจกรรม จะเผยแพร่ในรูปแบบของโอเพนซอร์ส ทั้งซอฟต์แวร์ และ รายงานต่าง ๆ</li>
</ul></span></td></tr>
<tr bgcolor="#336699"><td><span style="color: white; font-size: x-small;"> หัวข้อกิจกรรม </span></td></tr>
<tr><td><span style="font-size: x-small;"> <table><tbody>
<tr valign="top"><td align="right"><img hspace="5" src="http://cs.payap.ac.th/codefest/images/twitter_logo.jpg" /></td> <td><span style="font-size: x-small;"><span style="color: #ff6600;"><b>TwitterTalk v.2</b></span> โดยใช้ภาษา Java <br />
<br />
</span></td></tr>
<tr valign="top"><td align="right"><img hspace="5" src="http://cs.payap.ac.th/codefest/images/linux_logo.jpg" /></td> <td><span style="font-size: x-small;"><span style="color: #ff6600;"><b>Linux Kiosk </b></span> โดยใช้ Linux shell <br />
<br />
</span></td></tr>
<tr valign="top"><td align="right"><img hspace="5" src="http://cs.payap.ac.th/codefest/images/distance_control.jpg" /></td> <td><span style="font-size: x-small;"><span style="color: #ff6600;"><b>การควบคุมอุปกรณ์ระยะไกลผ่านเครือข่ายโทรศัพท์ </b></span> โดยใช้ภาษา C และ PHP <br />
</span></td></tr>
</tbody></table></span></td></tr>
<tr bgcolor="#336699"><td><span style="color: white; font-size: x-small;"> กำหนดการ </span></td></tr>
<tr><td><span style="font-size: x-small;"> <span style="color: #336699;"><b>วันศุกร์ที่ 8 ตุลาคม 2553</b></span> <dd>08.00น.-09.00น. ลงทะเบียนผู้เข้าร่วมกิจกรรม </dd><dd>09.00น.-09.30น. พิธีเปิด </dd><dd>09.30น.-10.30น. บรรยายรายละเอียด เงื่อนไข และภารกิจ </dd><dd>10.30น.-12.00น. บรรยายเทคนิค แนะนำตัวผู้เข้าร่วมกิจกรรม และแบ่งกลุ่ม </dd><dd>12.00น.-13.00น. รับประทานอาหารกลางวัน </dd><dd>13.00น.-15.00น. ประชุมกลุ่มและวางแผนการทำงาน </dd><dd>15.00น.-18.00น. พัฒนาโปรแกรม </dd><dd>18.00น.-19.00น. รับประทานอาหารเย็น </dd><dd>19.00น. เป็นต้นไป พัฒนาโปรแกรม หรือพักผ่อน </dd> </span> <span style="font-size: x-small;"><span style="color: #336699;"><b>วันเสาร์ที่ 9 ตุลาคม 2553</b></span> <dd>07.30น.-08.30น. รับประทานอาหารเช้า </dd><dd>08.30น.-12.00น. พัฒนาโปรแกรม </dd><dd>12.00น.-13.00น. รับประทานอาหารกลางวัน </dd><dd>13.00น.-15.00น. เตรียมสรุปผลและเตรียมนำเสนอผลงาน </dd><dd>15.00น.-16.30น. นำเสนอผลงาน </dd><dd>16.30น.-17.00น. พิธีปิด </dd></span></td></tr>
<tr bgcolor="#336699"><td><span style="color: white; font-size: x-small;"> ภาพกิจกรรม</span></td></tr>
<tr align="center"><td><span style="font-size: x-small;"> </span><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgDna9fqs7t2_Av5U7skn32lnmpk8xHNs2fDqMptVqmRkTjk42NXF6B8JZYgIt-oLO-esvgMuQPZsZ-FayznCTYnpt0x21mMqSN_LHuqezs2JhFiw6JrS4Xu3AOfyUL8lER37v3aeLvdDo/s1600/DSC_5829.JPG" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="212" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgDna9fqs7t2_Av5U7skn32lnmpk8xHNs2fDqMptVqmRkTjk42NXF6B8JZYgIt-oLO-esvgMuQPZsZ-FayznCTYnpt0x21mMqSN_LHuqezs2JhFiw6JrS4Xu3AOfyUL8lER37v3aeLvdDo/s320/DSC_5829.JPG" width="320" /></a><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjH6ioSeh_hcqSeKJWtQbNFG7R28yQ-LZT_AlRlOF-Z8sVC6OBAml8vJRjrFzj9sacjQOPgPQyrWITsLHHyi033YBYW3rZiugMtnUBpo0GEuc4G2Y1UHIINA9u5s7kALwyZJZ5GJXSO0Vs/s1600/DSC_5981.JPG" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="212" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjH6ioSeh_hcqSeKJWtQbNFG7R28yQ-LZT_AlRlOF-Z8sVC6OBAml8vJRjrFzj9sacjQOPgPQyrWITsLHHyi033YBYW3rZiugMtnUBpo0GEuc4G2Y1UHIINA9u5s7kALwyZJZ5GJXSO0Vs/s320/DSC_5981.JPG" width="320" /></a><br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiicHwdK3IpmhVaCR05cxO-QA2BBWvj5OK2Uh4UsN4R6NHEd7ruMSa8djllkG3V_ylnC3EDnaVhBKjWFjwqMq4r6ogia0h1HCx7ZMBSisH5Aw9c2ueyQoOkLz7COEGtx2xEhN-QR0DlX4g/s1600/DSC_5881.JPG" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="212" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiicHwdK3IpmhVaCR05cxO-QA2BBWvj5OK2Uh4UsN4R6NHEd7ruMSa8djllkG3V_ylnC3EDnaVhBKjWFjwqMq4r6ogia0h1HCx7ZMBSisH5Aw9c2ueyQoOkLz7COEGtx2xEhN-QR0DlX4g/s320/DSC_5881.JPG" width="320" /> </a><br />
<div style="color: red;">...............................................................................................</div><a href="http://gallery.opentle.org/v/2010108_09_CodeFest8/" style="color: red;">http://gallery.opentle.org/v/2010108_09_CodeFest8/</a></td></tr>
</tbody></table></div>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-7693675076107588541.post-82670360904301557892010-10-08T22:10:00.000+07:002012-06-12T22:09:16.761+07:00CodeFese2010#8 โคดโปรแกรม Embed<span class="main_title f14 b">CodeFese2010#8 โคดโปรแกรม Embed</span>
<span class="title f12 b">embed.c</span>
<pre class="brush: cpp">
#include "stdio.h"
#include "fcntl.h"
#include "getopt.h"
#include "unistd.h"
#include "stdlib.h"
#include "errno.h"
#include "string.h"
#include "sys types.h"
#include "sys stat.h"
#include "24cXX.h"
#include "sys socket.h"
#include "netinet in.h"
#include "netdb.h"
#define VERSION "0.7.6"
#define ENV_DEV "EEPROG_DEV"
#define ENV_I2C_ADDR "EEPROG_I2C_ADDR"
int g_quiet;
#define usage_if(a) do { do_usage_if( a , __LINE__); } while(0);
void do_usage_if(int b, int line)
{
const static char *eeprog_usage =
"eeprog " VERSION ", a 24Cxx EEPROM reader/writer\n"
"Copyright (c) 2003-2004 by Stefano Barbato - All rights reserved.\n"
"Usage: eeprog [-fqxdh] [-16|-8] [ -r addr[:count] | -w addr ] /dev/i2c-N i2c-address\n"
"\n"
" Address modes: \n"
" -8 Use 8bit address mode for 24c0x...24C16 [default]\n"
" -16 Use 16bit address mode for 24c32...24C256\n"
" Actions: \n"
" -r addr[:count] Read [count] (1 if omitted) bytes from [addr]\n"
" and print them to the standard output\n"
" -w addr Write input (stdin) at address [addr] of the EEPROM\n"
" -h Print this help\n"
" Options: \n"
" -x Set hex output mode\n"
" -d Dummy mode, display what *would* have been done\n"
" -f Disable warnings and don't ask confirmation\n"
" -q Quiet mode\n"
"\n"
"The following environment variables could be set instead of the command\n"
"line arguments:\n"
" EEPROG_DEV device name(/dev/i2c-N)\n"
" EEPROG_I2C_ADDR i2c-address\n"
"\n"
" Examples\n"
" 1- read 64 bytes from the EEPROM at address 0x54 on bus 0 starting\n"
" at address 123 (decimal)\n"
" eeprog /dev/i2c-0 0x54 -r 123:64\n"
" 2- prints the hex codes of the first 32 bytes read from bus 1 \n"
" at address 0x22\n"
" eeprog /dev/i2c-1 0x51 -x -r 0x22:0x20\n"
" 3- write the current timestamp at address 0x200 of the EEPROM on \n"
" bus 0 at address 0x33 \n"
" date | eeprog /dev/i2c-0 0x33 -w 0x200\n";
if(!b)
return;
fprintf(stderr, "%s\n[line %d]\n", eeprog_usage, line);
exit(1);
}
#define die_if(a, msg) do { do_die_if( a , msg, __LINE__); } while(0);
void do_die_if(int b, char* msg, int line)
{
if(!b)
return;
fprintf(stderr, "Error at line %d: %s\n", line, msg);
//fprintf(stderr, " sysmsg: %s\n", strerror(errno));
exit(1);
}
#define print_info(args...) do { if(!g_quiet) fprintf(stderr, args); } while(0);
void parse_arg(char *arg, int* paddr, int *psize)
{
char *end;
*paddr = strtoul(arg, &end, 0);
if(*end == ':')
*psize = strtoul(++end, 0, 0);
}
int confirm_action()
{
fprintf(stderr,
"\n"
"____________________________WARNING____________________________\n"
"Erroneously writing to a system EEPROM (like DIMM SPD modules)\n"
"can break your system. It will NOT boot anymore so you'll not\n"
"be able to fix it.\n"
"\n"
"Reading from 8bit EEPROMs (like that in your DIMM) without using\n"
"the -8 switch can also UNEXPECTEDLY write to them, so be sure to\n"
"use the -8 command param when required.\n"
"\n"
"Use -f to disable this warning message\n"
"\n"
"Press ENTER to continue or hit CTRL-C to exit\n"
"\n"
);
getchar();
return 1;
}
int read_from_eeprom(struct eeprom *e, int addr, int size, int hex ,int *ar)
{
int ch, i,arr=0;
for(i = 0; i < size; ++i, ++addr)
{
die_if((ch = eeprom_read_byte(e, addr)) < 0, "read error");
if(hex)
{
if( (i % 16) == 0 )
printf("\n %.4x| ", addr);
else if( (i % 8) == 0 )
printf(" ");
if(!(i%2==1)){
ar[arr]= ch;
arr++;
}
} else
putchar(ch);
}
if(hex)
printf("\n");
fflush(stdout);
return 0;
}
int write_to_eeprom(struct eeprom *e, int addr)
{
int c;
while((c = getchar()) != EOF)
{
print_info(".");
fflush(stdout);
die_if(eeprom_write_byte(e, addr++, c), "write error");
}
print_info("\n");
return 0;
}
int main(int argc, char** argv)
{
struct eeprom e;
int ret, op, i2c_addr, memaddr, size, want_hex, dummy, force, sixteen;
char *device, *arg = 0, *i2c_addr_s;
struct stat st;
int eeprom_type = 0;
op = want_hex = dummy = force = sixteen = 0;
g_quiet = 0;
while((ret = getopt(argc, argv, "1:8fr:qhw:xd")) != -1)
{
switch(ret)
{
case '1':
usage_if(*optarg != '6' || strlen(optarg) != 1);
die_if(eeprom_type, "EEPROM type switch (-8 or -16) used twice");
eeprom_type = EEPROM_TYPE_16BIT_ADDR;
break;
case 'x':
want_hex++;
break;
case 'd':
dummy++;
break;
case '8':
die_if(eeprom_type, "EEPROM type switch (-8 or -16) used twice");
eeprom_type = EEPROM_TYPE_8BIT_ADDR;
break;
case 'f':
force++;
break;
case 'q':
g_quiet++;
break;
case 'h':
usage_if(1);
break;
default:
die_if(op != 0, "Both read and write requested");
arg = optarg;
op = ret;
}
}
if(!eeprom_type)
eeprom_type = EEPROM_TYPE_8BIT_ADDR; // default
usage_if(op == 0); // no switches
// set device and i2c_addr reading from cmdline or env
device = i2c_addr_s = 0;
switch(argc - optind)
{
case 0:
device = getenv(ENV_DEV);
i2c_addr_s = getenv(ENV_I2C_ADDR);
break;
case 1:
if(stat(argv[optind], &st) != -1)
{
device = argv[optind];
i2c_addr_s = getenv(ENV_I2C_ADDR);
} else {
device = getenv(ENV_DEV);
i2c_addr_s = argv[optind];
}
break;
case 2:
device = argv[optind++];
i2c_addr_s = argv[optind];
break;
default:
usage_if(1);
}
usage_if(!device || !i2c_addr_s);
i2c_addr = strtoul(i2c_addr_s, 0, 0);
print_info("eeprog %s, a 24Cxx EEPROM reader/writer\n", VERSION);
print_info("Copyright (c) 2003-2004 by Stefano Barbato - All rights reserved.\n");
print_info(" Bus: %s, Address: 0x%x, Mode: %dbit\n",
device, i2c_addr,
(eeprom_type == EEPROM_TYPE_8BIT_ADDR ? 8 : 16) );
if(dummy)
{
fprintf(stderr, "Dummy mode selected, nothing done.\n");
return 0;
}
die_if(eeprom_open(device, i2c_addr, eeprom_type, &e) < 0,
"unable to open eeprom device file "
"(check that the file exists and that it's readable)");
switch(op)
{
case 'r':
if(force == 0)
confirm_action();
size = 1; // default
parse_arg(arg, &memaddr, &size);
print_info(" Reading %d bytes from 0x%x\n", size, memaddr);
int ar[3],i,j,x[2],y[2],z[2];
while(1){
for(i=0;i<2;i++){
read_from_eeprom(&e, memaddr, size, want_hex,ar);
x[i]=ar[0]; y[i]=ar[1]; z[i]=ar[2];
printf(" P[%d] = %d %d %d",i,x[i],y[i],z[i]);
}
printf("\n\n");
int ac = 15,ac1 = 230;
if(((abs(z[0]-z[1]) > ac)&&(abs(z[0]-z[1]) < ac 1))||
((abs(y[0]-y[1]) > ac)&&(abs(y[0]-y[1]) < ac 1))||
((abs(x[0]-x[1])="">ac)&&(abs(x[0]-x[1]) < ac 1))){
if(((z[0]-z[1]="" > ac)&&(z[0]-z[1] < ac 1))){
printf("error="" in="" z="" val="%d" and="" %d="" <-=""> %d.\n",z[0],z[1],abs(z[0]-z[1]));
SendToServer(z,'Z');
break;
}else if (((y[0]-y[1]>ac)&&(y[0]-y[1] < ac 1))){
printf("error="" in="" y="" val="%d" and="" %d="" <-=""> %d.\n",y[0],y[1],abs(y[0]-y[1]));
SendToServer(y,'Y');
}else{
printf("Error in X val = %d and %d <-> %d.\n",x[0],x[1],abs(x[0]-x[1]));
SendToServer(x,'X');
break;
}
}
}
break;
case 'w':
if(force == 0)
confirm_action();
parse_arg(arg, &memaddr, &size);
print_info(" Writing stdin starting at address 0x%x\n",
memaddr);
write_to_eeprom(&e, memaddr);
break;
default:
usage_if(1);
exit(1);
}
eeprom_close(&e);
return 0;
}
int SendToServer(int acc[],char ch[]){
int sockfd, portno, n;
struct sockaddr_in serv_addr;
struct hostent *server;
char buffer[1024];
portno = atoi("80");
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd < 0)
error("ERROR opening socket");
server = gethostbyname("192.168.1.9");
if (server == NULL) {
fprintf(stderr,"ERROR, no such host\n");
exit(0);
}
bzero((char *) &serv_addr, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
bcopy((char *)server->h_addr,
(char *)&serv_addr.sin_addr.s_addr,
server->h_length);
serv_addr.sin_port = htons(portno);
if (connect(sockfd,&serv_addr,sizeof(serv_addr)) < 0) {
error("ERROR connecting");
}
bzero(buffer,1024);
// sprintf(buffer,"GET /g-Box/index.php?act=%c&val=%d HTTP/1.0\n\n",ch,abs(acc[0]-acc[1]));
sprintf(buffer,"Error in %c val = %d and %d <-> %d.\n",ch,acc[0],acc[1],abs(acc[0]-acc[1]));
n = write(sockfd,buffer,strlen(buffer));
if (n < 0)
error("ERROR writing to socket");
bzero(buffer,1024);
n = read(sockfd,buffer,1024);
if (n < 0)
error("ERROR reading from socket");
printf("%s\n",buffer);
return 0;
}
int error(char *msg)
{
perror(msg);
exit(0);
return 0;
}
</pre>
<br />Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-7693675076107588541.post-86394904990061756792010-09-03T12:07:00.000+07:002012-06-12T23:37:23.653+07:00ภาพกิจกรรม CodeFest ครั้งที่ 7 ม.วลัยลักษณ์<div style="color: red;">
ระหว่างวันที่ 3 – 4 กันยายน พ.ศ. 2553</div>
<div style="color: red;">
</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgplyQBCkQ-M_B7K7pfzFpwiW8m-LWC_M0FnUnae-GhEqZ48M1MNWerhMK-43BcWdAw5iODGhylmLPytgw-aFQw9tvEIM0_2BfqOq9PPH2V5wywXejWMm84SWkVL2oj9kZux4V3zAH3PRo/s1600/CH7_5339.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="212" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgplyQBCkQ-M_B7K7pfzFpwiW8m-LWC_M0FnUnae-GhEqZ48M1MNWerhMK-43BcWdAw5iODGhylmLPytgw-aFQw9tvEIM0_2BfqOq9PPH2V5wywXejWMm84SWkVL2oj9kZux4V3zAH3PRo/s320/CH7_5339.JPG" width="320" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhW08wQmPpOuLtF9E7o0SE2pyKpTZBO6HIlQjFnJ9ZqcH7QShNL0KYWft3dO-NT_oqaBgWhXLNQ9Ct_ZE4VlG9mXueJdcbd-mT4jb_FwTm6yn7m3nssSVMFu70QCeSp9fwoXARn89qEdd8/s1600/CH7_5495.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="212" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhW08wQmPpOuLtF9E7o0SE2pyKpTZBO6HIlQjFnJ9ZqcH7QShNL0KYWft3dO-NT_oqaBgWhXLNQ9Ct_ZE4VlG9mXueJdcbd-mT4jb_FwTm6yn7m3nssSVMFu70QCeSp9fwoXARn89qEdd8/s320/CH7_5495.JPG" width="320" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhzKp_59Kr-NsTM1n3qK5poNwX9hPm9-_JDJ10_MxgbuUHniyeiI_vdbjwZ_XqmscuvuCXVAtl-zB30PSVNRr7nCo-yb_9teaKbTBTLg60OUpNEOz0rF-bWZ2FdmLWoTJlXSeMQ3G6qIQ8/s1600/CH7_5534.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="212" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhzKp_59Kr-NsTM1n3qK5poNwX9hPm9-_JDJ10_MxgbuUHniyeiI_vdbjwZ_XqmscuvuCXVAtl-zB30PSVNRr7nCo-yb_9teaKbTBTLg60OUpNEOz0rF-bWZ2FdmLWoTJlXSeMQ3G6qIQ8/s320/CH7_5534.JPG" width="320" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjNR_QvzHAW8N64olMPUfPOCiNUgCFONx4_IbOhxHjxCgJbgMzrcSwqCXVkFIjlIJbe7nq49g8iEBaskyvnd9XwJ0kVMl1xdZqQbZWjYJJBi4uNKzhX22yCibn6YuHQz10YpfrA1y3KScU/s1600/CH7_5537.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="212" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjNR_QvzHAW8N64olMPUfPOCiNUgCFONx4_IbOhxHjxCgJbgMzrcSwqCXVkFIjlIJbe7nq49g8iEBaskyvnd9XwJ0kVMl1xdZqQbZWjYJJBi4uNKzhX22yCibn6YuHQz10YpfrA1y3KScU/s320/CH7_5537.JPG" width="320" /></a></div>
<div style="color: red; text-align: center;">
<span style="color: red;">ภาพกิจกรรม </span><a href="http://gallery.opentle.org/v/CodeFest7/" style="color: red;">http://gallery.opentle.org/v/CodeFest7/</a></div>
<div style="color: red; text-align: center;">
</div>Unknownnoreply@blogger.com0