Thursday, September 27, 2018

HikariCP pooling

If you are going to crate connections pools you have many options:


Why shoud I HikariCP? It's just very fast and stable!














Let's create configuration with Spring boot:

And our database configuration property

Our Persisntence Configuration

Ah I know  packagesToScan is ugly. We have Lambdas in Java. Generally this method is craeted to scan components in different modules.

public List <String> packagesToScan() { 
   return scanPackages.stream()
            .map(ScanPersistencePackage::asStrings)
            .flatMap(Collection::stream)
            .collect(Collectors.toList());
}
And concrete persistence configuration for our module:

JPA + Oracle procedures


Due the Oracle's license agreement there is no public repository with the Oracle Driver JAR. So first off all download  oracle  jdbc driver and install to local maven repository (or publish to your artifactory server).


Let's create simple procedures:


Create repository and call procedure using entity manager:


Friday, September 7, 2018

How to make your servers properly secure - Why agent forwarding is dangerous

In this article, I'll show you how to hack server if is bastion host is compromised.  let's talk for about bastion host...

What is the bastion host?

On Wikipedia, you may read that  "bastion host is a special purpose computer on a network specifically designed and configured to withstand attacks."  but it's more important to make correct server configuration otherwise bastion host can be a weapon for an attacker.



How to configure bastion server?
Let's configure Linux servers and then we can start hacking.  Imagine that we have N number of Linux instances and one bastion server. We will use private key ssh authentification for our Linux instances. For testing purpose, we will use user/password authentification for the bastion server. Let's start the configuration.
  • Create a user for the server
adduser bastion
passwd bastion
  •  open sshd_config and edit configuration. Change PermitRootLogin yes to PermitRootLogin no
vim /etc/ssh/sshd_config
  • Restart sshd and check the status
systemctl restart ssh
systemctl status sshd

You should see something like that:
[vq@localhost~]# systemctl status sshd
● sshd.service - OpenSSH server daemon
   Loaded: loaded (/usr/lib/systemd/system/sshd.service; 

 enabled; vendor preset: enabled)
   Active: active (running) 
 
since Wed 2018-07-04 10:02:06 UTC; 32s ago
     Docs: man:sshd(8)
           man:sshd_config(5)
 Main PID: 11595 (sshd)
   CGroup: /system.slice/sshd.service
           └─11595 /usr/sbin/sshd -D
Jul 04 10:02:06 systemd[1]:Starting OpenSSH server daemon...
Jul 04 10:02:06 sshd[11595]: Server listening on 0.0.0.0 port 22
Jul 04 10:02:06 sshd[11595]: Server listening on :: port 22
Jul 04 10:02:06 *** systemd[1]: 
  Started OpenSSH server daemon.
Now you can't log in via the root user. You can see if this configuration checks out.
vq@localhost:~> ssh root@X.X.X.X
root@X.X.X.X's password:
Permission denied, please try again.
  •  Let's block user if he/she tries to log in with incorrect user/password. For example we can give him/her three chances to log in - otherwise, we can block permanently or temporarily. So we can use  fail2ban.
sudo yum install epel-release
sudo yum install fail2ban
  • Duplicate fail2ban configure to create override config file:
cp /etc/fail2ban/fail2ban.conf /etc/fail2ban/fail2ban.local
cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
vim jail.local
  •  If you use CentOS you need to change backend variable in the configuration. Just open  jail.local file and change auto to systemd.
 [DEFAULT] 
 backend = systemd  
  • Now enable SSH daemon jail in the jail.local file (anyway it's necessary for CentOS 7)
[sshd]
enabled = true
  • Set bantime, findtime, and maxretry values. For example:
bantime  = 1000
findtime = 1000
maxretry = 3
  • Enable fail2ban and restart service
sudo systemctl enable fail2ban
sudo systemctl start fail2ban

Now if you try authentification with incorrect user/password you will be blocked.
 



How to configure ssh private key authentification on Linux?
  • Crate user in the server
adduser usr
passwd usr
  • Generate ssh keys
     ssh-keygen
  • Copy public key to the server
    ssh-copy-id -i ~/.ssh/name.pub usr@IP
  • Login using private key:
 
    ssh -i name usr@IP
  • Disable root login and password authentification to the following file:
 
    vim /etc/ssh/sshd_config
    PasswordAuthentication no
    PermitRootLogin no
  • hmm... why not to change SSH port? Let's tell SELinux that we need to change it. Let's use just random number 2597
   
    yum -y install policycoreutils-python
    semanage port -a -t ssh_port_t -p tcp 2597
  • Now change port in sshd_config.  
vim /etc/ssh/sshd_config
    Check configuration file
    sshd -t
  • Restart services
 
    sudo systemctl restart sshd
  • Check what port is LITESENING
 
    sudo netstat -lntp | grep ssh
  • Allow ssh login only from bastion. So open 2597 port only for bastion. If you use firewalld run the following command:
 
 firewall-cmd  
 --permanent   
 --zone=public  
 --add-rich-rule='rule family="ipv4" 
 source address="BASTION_IP/32"   
 port protocol="tcp" 
 port="2597" accept'

If this is not your server just check your default zone.
 
firewall-cmd --get-default-zone
 

And check your rules:
  
firewall-cmd --list-all

But maybe you prefer to use iptables instead of firewald:
iptables -I INPUT -p tcp -s BASTION_IP  --dport 2597 -j ACCEPT
iptables -I INPUT -p tcp -s 0.0.0.0/0 --dport 2597 -j DROP

if this is not your own server just check iptable rules and remove some of them if necessary:

iptables -L --line-numbers
sudo iptables -D INPUT {line}

How to access my server via the Bastion? Generally, there are many ways but some of them are not secure. Let's talk for about them.

 
How to use AgentForwarding
  • Create config in ~/.ssh/config
    Host bast
        Hostname BASTION_IP
        ForwardAgent yes
        User bastion

  • Add your authentification key to ssh agent
ssh-add ~/.ssh/name_rsa
  • Connect to bastion host using username/password
    ssh bast
  • Connect application server
    ssh app@IP -p PORT

As you see you should connect your remote servers via the bastion server.  The same scenario is if you want to upload/download files:
  • Download file from remote server to BASTION. Run the command in Bastion server
    scp -P PORT app@IP:/src_path  /dest_path
  • Download file from BASTION to LOCA machine. Run the command in LOCAL machine:
    scp  -P PORT bastion@ip:/src_path /dest_path 
or
   scp  -P PORT bast:/src_path /dest_path
  • Upload file to BASTION
scp   /src_path bastion:/dest_path 

You may, well, ask me the question: Is my server secure?  And the answer is quite simple:
- Le't me tell you: NO!
 - Why?
 - Because you are using SSH Agent forwarding?
 - And where is the problem?
 - Because Agent forwarding is dangerous and it's consider considered harmful.

Let's explain everything inside out:  When you connect bastion host your glorious ssh agent is forwarded. It means that the socket will be set up so that someone may use this socket data to access your servers. Imagine that your bastion server is compromised, If someone has sufficient permissions on your Linux server he/she will just use your socket info. As a result, all your server can be accessed. I know window of compromise is very small because it depends on how much time you are connected to the bastion host. But do you really want to the risk when you have other options like ProxyCommand? Hence, just use ProxyCommand!

How to hack servers if you compromised bastion host?

In /tmp directory you may see something like that:
[root@localhost tmp]# ll
total 12
drwx------  2 bastion bastion 4096 Sep  7 17:35 ssh-mKX88v0Vlo
let's open the temporary file
[root@localhost tmp]# cd ssh-mKX88v0Vlo/
[root@localhost ssh-mKX88v0Vlo]# ll
total 0
srwxr-xr-x 1 bastion bastion 0 Sep  7 17:35 agent.10507
Let's see connections to this process id.
netstat -nxp | grep  10507
result:
unix  [ ]   STREAM     CONNECTED     501384   10507/sshd: bastion
and who is connected?
lsof -i -a -p 10507
result:
COMMAND  PID   USER  FD  TYPE DEVICE SIZE/OFF NODE NAME
sshd    10507 bastion  3u  IPv4 501301  0t0  TCP *IP*:ssh->*IP*:8279 (ESTABLISHED)
We can also see socket files:
cd /proc/10507/fd/
ls
result:
lrwx------ 1 root root 64 Sep  7 17:46 0 -> /dev/null
lrwx------ 1 root root 64 Sep  7 17:46 1 -> /dev/null
lrwx------ 1 root root 64 Sep  7 17:46 10 -> /dev/ptmx
lrwx------ 1 root root 64 Sep  7 17:46 14 -> /dev/ptmx
lrwx------ 1 root root 64 Sep  7 17:46 15 -> /dev/ptmx
lrwx------ 1 root root 64 Sep  7 17:46 2 -> /dev/null
lrwx------ 1 root root 64 Sep  7 17:46 3 -> socket:[501994]
lrwx------ 1 root root 64 Sep  7 17:46 4 -> socket:[502069]
lrwx------ 1 root root 64 Sep  7 17:46 5 -> socket:[502072]
l-wx------ 1 root root 64 Sep  7 17:46 6 -> /run/systemd/sessions/1836.ref
lr-x------ 1 root root 64 Sep  7 17:46 7 -> pipe:[502079]
l-wx------ 1 root root 64 Sep  7 17:46 8 -> pipe:[502079]
lrwx------ 1 root root 64 Sep  7 17:46 9 -> socket:[502080]
And what happens when client will be connected to remote server? let's see:
lrwx------ 1 root root 64 Sep  7 17:46 0 -> /dev/null
lrwx------ 1 root root 64 Sep  7 17:46 1 -> /dev/null
lrwx------ 1 root root 64 Sep  7 17:46 10 -> /dev/ptmx
lrwx------ 1 root root 64 Sep  7 17:48 11 -> socket:[502267]
lrwx------ 1 root root 64 Sep  7 17:46 14 -> /dev/ptmx
lrwx------ 1 root root 64 Sep  7 17:46 15 -> /dev/ptmx
lrwx------ 1 root root 64 Sep  7 17:46 2 -> /dev/null
lrwx------ 1 root root 64 Sep  7 17:46 3 -> socket:[501994]
lrwx------ 1 root root 64 Sep  7 17:46 4 -> socket:[502069]
lrwx------ 1 root root 64 Sep  7 17:46 5 -> socket:[502072]
l-wx------ 1 root root 64 Sep  7 17:46 6 -> /run/systemd/sessions/1836.ref
lr-x------ 1 root root 64 Sep  7 17:46 7 -> pipe:[502079]
l-wx------ 1 root root 64 Sep  7 17:46 8 -> pipe:[502079]
lrwx------ 1 root root 64 Sep  7 17:46 9 -> socket:[502080]
We can even see if socket file is used using netstat:
unix  3 [ ]  STREAM  CONNECTED  502267  10561/sshd: 
                     bastion  /tmp/ssh-oVoMXC6vb8/agent.10561
unix  3  [ ] STREAM     CONNECTED     502072   10561/sshd:  bastion 
but wait we need to steal the socket information while the session of bastion host is open. Oh, we also need destination server IP, so just use netstat It's funny but you might find something like that on the internet.:
netstat -tn 2>/dev/null 
grep :22  | awk '{print $5}' | cut -d: -f1 | 
sort | uniq -c | sort -nr | head
Sometimes people try to demonstrate their knowledge  but just make everything simple.
netstat -tn
The final step to use the forwarded socket file
eval "$(ssh-agent -s)"
SSH_AUTH_SOCK=/tmp/ssh-EAKxOdL4fl/agent.10507
Check if the key is loaded.
ssh-add -l
result should be something like that:
2048 SHA256:2Psdl..B5KQ /home/usr/.ssh/name_rsa (RSA)
Ok. We have seen that Agent Forwarding is a problem. But where is the solution? Fortunately, we can just use a proxy command. So let's rewrite our configuration:
Host app
    Hostname *.*.*.*
    IdentityFile ~/.ssh/your_rsa
    User *******
    Port ****
    ProxyCommand ssh -W %h:%p bast

Host bast
     Hostname *.*.*.*
     ForwardAgent no
     User ******
Now  it's very simple to connect your server
ssh app
Do you want to download something from bastion?
scp bast:/home/bastion/sh ~/
Maybe you want to download something from the remote server via the bastion tunnel:
scp -P **** app:/src_path  /dest_path
Maybe you want to ypload something to remote server via the bastion tunel:
scp -P **** app:/src_path  /dest_path

Conclusion
  • If you use bastion host, don't use AgentForwarding but use ProxyCommand
  • Always use non root user for authentification
  • Use firewall and block all unnecessary connections.
  • Use SELinux
  • Block the IP address who  tries to login  several time with incorrect credentials
  • If it's not necessery don't give sudo permission to the user
  • Monitor your server
  • Update your server for security patches

Tuesday, August 14, 2018

How to create your own system.d service


If you explore latest Red Hat linux, you will see that the  traditional init scripts are gone. It's much easier to use rather then SysVinit, it reduces system startup time because the processes are running in parallel. It has also very nice logging mechanism. Let's write simple examples for CentOS7

Create a bash file:
 touch /usr/local/sbin/{launcher_name}.sh

It's a simple bash file that launches java application.
#!/bin/bash
java -jar /root/{name}.jar

Add execution permission
chmod +x {launcher_name}.sh

Create service:
touch /etc/systemd/system/{service_name}.service

Configuration:
[Unit]
Description=Application launcher service

[Service]
Type=simple
ExecStart=/usr/local/sbin/{launcher_name}.sh
TimeoutStartSec=0

[Install]
WantedBy=default.target

Set permissions:
chmod 664  {service_name}.service

Reload daemon
 systemctl daemon-reload 

Usage:
systemctl enable {service_name}
systemctl start {service_name}

We can create the same using init instead of sytstem.d. We shiuld just create configuration to the following locataion: /etc/init.d


#! /bin/sh
# /etc/init.d/{service_name}
### BEGIN INIT INFO
# Provides:           {service_name}
# Default-Start:      2 3 4 5
# Default-Stop:       0 1 6
# Short-Description:  Example of init service.
### END INIT INFO
# Actions provided to make it LSB-compliant
case "$1" in
  start)
    export DISPLAY=:0
    sh {launcher_name}.sh
    ;;
  stop)
    echo "Stopping"
    ...
    ;;
  restart)
    echo "Restarting"
    ;;
  force-reload)
    echo "Reloading"
    ...
    ;;
  status)
    echo "Status"
    ...
    ;;
  *)
    echo "Usage: /etc/init.d/{service_name} 
        {start|stop|restart|force-reload|status}"
    exit 1
    ;;
esac
exit 0 



How to allow non-root users to control system.d services/utilities that needs root permissions.

How to allow non-root users to control system.d services/utilities that needs root permissions.

By default sudo is not installed on debian. So, install sudo
apt-get install sudo -y

Add current user to sodoers list
usermod -a -G sudo vq

Change editor for visudo (I love vim).
update-alternatives --config editor

Let's give user perrmision to reboot without password. First off all we should change configuration in /etc/sudoers file. In order to edit the fiole  use visudo:
vq ALL=NOPASSWD:/sbin/reboot

Usage (password is not required)
sudo reboot

Now let's allow user to access concrete system.d service without password. For example let's do it for firewalld service.

Create file
cd /etc/sudoers.d
touch vq
vim vq

Add the following configuration
%vq ALL= NOPASSWD: /bin/systemctl start firewalld
%vq ALL= NOPASSWD: /bin/systemctl stop firewalld
%vq ALL= NOPASSWD: /bin/systemctl status firewalld

Usage (password is not required)
sudo systemctl start firewalld
sudo systemctl stop firewalld
sudo systemctl status firewalld

Note that my user and group is called vq

.

Friday, July 27, 2018

synchronise time using ntpd and timesyncd

Imagine that you have many servers. It's important to have synchronized time between our servers - at least the log files should have same time in order to find out the correct sequence of the processes. We can use the following tools for time synchronization
  • ntpd - powerfull Network Time Protocol Daemon. Full implementation of  NTP protocol
  • systemd-timesyncd - it is lightweight daemon for synchronizing the system clock. This client implements an SNTP.  if we  have ntpd daemon we can use ntpdc - utility program used to monitor NTP daemo (now it's deprecated and we use ntpq).  If we have systemd-timesyncd we can use  timedatectl - it has very beautiful configurations and controls the system time/date very well.
  • chrony is also full implementation of NTP. it has really great performance because It quickly detects sudden time changes like ntpd.   
  • OpenNTPD - It's part of the Open BSD project that also implements NTP protocol.
There are another implementations too but know let's talk for about ntpd and timedatectl.

 How to Configure ntpd

  • Install and enable ntpd for CentOS:
yum install ntpd
systemctl enable ntpd
firewall-cmd --add-service=ntp --permanent
  • Install and enable ntpd for Debian:
apt-get install ntpd
apt-get install ntpdate
  • Add pools in  /etc/ntp.conf  server configuration
server 0.[YOUR_POOLl]
server 1.[YOUR_POOLl]
  • Add local clock in  /etc/ntp.conf  server configuration.  For example, we can add local clock as a stratum 10  server or we  can set up to stratum 15 - so that it will never be used unless internet access is lost.
server  127.127.1.0 
fudge   127.127.1.0 stratum 10
  • Add pool adress in /etc/ntp.conf client configuration
server  X.X.X.X
  • Force update time, we can create crontab too (optional)
ntpdate -u X.X.X.X
  • Start ntpd service for CentOS:
systemctl start ntpd
  • Start ntpd service for Debian:
service ntp start  or systemctl start ntp

Let's check if everything works well and print all the peers of the servers
[vq@centos etc]# ntpq -p
 remote   refid  st t when poll reach delay  offset jitter
===========================================================
*LOCAL(0) .LOCL. 10 l 40  64   17     0.000  0.000  0.000

 How to Configure timesyncd

Because of we have installed ntpd we can't use systemd-timesyncd. Even if you try to use systemd-timesyncd service you will have the follolwing error:

vq@debian:/var/log# systemctl status 
systemd-timesyncd.service
● systemd-timesyncd.service - Network Time Synchronization
   Loaded: loaded 
(/lib/systemd/system/systemd-timesyncd.service;
 enabled; vendor preset: enabled)
  Drop-In: /lib/systemd/system/systemd-timesyncd.service.d
           └─disable-with-time-daemon.conf
   Active: inactive (dead)
Condition: start condition failed at 
Fri 2018-07-27 13:31:23 +04; 35s ago
           └─ ConditionFileIsExecutable=
!/usr/sbin/ntpd was not met
     Docs: man:systemd-timesyncd.service(8)


So we should remove ntpd if we want to use  timesyncd and timedatectl. You can find  timesyncd configuration to the following URL:

/etc/systemd/timesyncd.conf

[Time]
NTP= ${URLS}
FallbackNTP=${URLS}
#RootDistanceMaxSec=5
#PollIntervalMinSec=32
#PollIntervalMaxSec=2048
  • check if NTP synchronization is enabled 
 
vq@debian:/etc# timedatectl
      Local time: Fri 2018-07-27 13:27:36 +04
  Universal time: Fri 2018-07-27 09:27:36 UTC
        RTC time: Fri 2018-07-27 09:46:02
       Time zone: Asia/Tbilisi (+04, +0400)
 Network time on: YES
NTP synchronized: YES
 RTC in local TZ: YES

Friday, July 13, 2018

How to install JDK on linux and how it really works?

How to install JDK on linux and how it really works?

You may , well, ask me the question - which installation file should you download for your Linux. You know, you have many options: prm or deb or tar.gz


What is difference between rpm and deb file formats?

  • RPM and DEB files files provide an easy way for software to be distributed, installed, upgraded, and removed 
  • tag.gz is g-zipped tar file. You should download it if you are going to install JDK manually.

What is difference between deb and rpm file formats?

To be honest, therey are both archive files, with some metadata. In order to install deb file you need dpkg - this is package manager for Debian-based systems like Ubuntu, Debian etc. For rpm file format we use RPM Package Manager.

What about dependency problem?

Everything seems great but sometimes we have dependency problems.  In the other words, we had better install all dependencies for our program to work correctly.  Therefor RPM and dpkg  is unable to automatically do it.   Fortunately we have many tools in order to sole the problem:

  • APT (the Advanced Packaging Tool) to install, update and remove software  on Debian-based systems. 
  • YUM  package-management utility that uses the RPM Package Manager.
  • Zypper this is my favorite  package manager for installing, updating and removing packages as well as for managing repositories.  

How To install RPM format JDK on linux?


This method is suitable for SUSE/Arch/Fedora/CentOS/RedHat etc. You should just have RPM package manager.
 

  •  Download oracle jdk RPM package
  • To install using terminal type: `rpm -ivh {jdk-name-version}.rpm`
  • Run the following commands
update-alternatives --install /usr/bin/java java /usr/java/latest/bin/java 100
update-alternatives --install /usr/bin/javac javac /usr/java/latest/bin/javac 100
view raw update_java_path.sh hosted with ❤ by GitHub
  • Set default Java for in system

update-alternatives --config java
update-alternatives --config javac
view raw default_java.sh hosted with ❤ by GitHub



  

How to install  tar.gz format zypped JDK on linux?


  •  Download oracle jdk tar.gz
  •  mkdir /opt/jdk
  •  tar -zxf {jdk-name-version}.tar.gz -C /opt/jdk
  • update-alternatives --install /usr/bin/java java /opt/jdk/{jdk-name-version}/bin/java 100
  • update-alternatives --install /usr/bin/javac javac /opt/jdk/{jdk-name-version}/bin/javac 100
Check if java is installed

  •  update-alternatives --display java
  •  update-alternatives --display javac
 Set default Java for in System
  •  update-alternatives --config java
  •  update-alternatives --config javac


how to change shceduler times in spring

How to change scheduler times in Spring

 

Imagine that you have scheduler but you want to change time at runtime. What Can you do? Off-course there are ways do solve the problem. So In this article I will write how to implement Trigger interface that is located to the following package: org.springframework.scheduling in the spring-context project.

1. First off all, let's create interface for our logic:

























2. In Spring we have org.springframework.scheduling.Trigger interface:
























So we can write our own implementation. It's very simple. We should just overwrite nextExecutionTime(_) method.  Something like that:



3. Now we can write configuration.





In this example we just choose ThreadPoolTaskScheduler that is child ofTaskScheduler interface.


4. So what is the next? Let's see how to use our scheduler. Everything is simple:



That's it!

Goodbye!
Have good day!

Tuesday, January 16, 2018

Running rsync as a daemon



rsync is a very flexible utility for  transferring and synchronizing files across computer systems. For example, when we want to run updates to the remote devices, we can just update some files in the rsync server and another remote devices will receive the updated files automatically.







Rsync has three ways to decide if a file is outdated:
  1. Compare size of files
  2. Compare timestamps
  3. Compare static checksums

So we can choose   --size-only, --ignore-times or ---checksum option in order to decide how to compare files.


Let's write little example

  • Let's create some directory and write some files in it. The idea is the following: if we add any files in the directory , remote devices will revieve that files (any devices who have rsync client)

mkdir /opt/{my_app_settings}/dev/
  •  Edit rsyncd.conf file and write configurations. I have created 2 configuration. But before editing the file imagine that some remote devices mught need to revieve files from different directory. We have already created directory named "dev" but we can also can create another directory. For example let's create another directory named "prod". So rsync client will decide which directory to use  - in the other words where to get files. So our configuration looks like that:

[dev] 
path = /opt/{my_app_settings}/dev 
read only = true
uid = root
gid = root


[prod]
path = /opt/{my_app_settings}/prod 
read only = true 
uid = root 
gid = root 

  • Run rsync daemon

 rsync --daemon 

  • Run rsync client in order to retrieve new files:

  rsync -rtv root@IP::dev {destionation_directory} 


Also we can create sheduler in order to execute auto synchronization.

 crontab -e 

If you want to run cron job every 1 minute, write the following  cron config




  • Cron examples


Every 1 minute     * * * * * 
Every 15 minutea   */15 * * * * 
Every 30 minutes   */30 * * * * 
Every 1 hour       0 * * * * 
Every 6 hours      0 */6 * * * 
Every 12 hours     0 */12 * * * 
Once a day         4 0 * * *
Once a week        4 0 * * 0 
Once a month       4 0 1 * * 


Now just verify your cron job

 crontab -l 
Results should be something like that:

Tuesday, October 3, 2017

Debian 9 touch screen calibration (ENG)


Touchscreen mouse calibration is tested for the following OS:


  • Description: Debian GNU/Linux 9.1 (stretch)
  • Release: 9.1
  • ernel: Linux 4.9.0-3-686-pae
  • Architecture: x86


For touch screen we can use libinput or evdev driver. Libinput replaces the evdev driver. The configuration below is created for evdev. In the other words We use evdev.


  • Get information about xserver-xorg-input.


dpkg -l | grep xserver-xorg-input


Result:




As we see there is no evdev driver.


  • Let's install evdev driver.

apt-get install xserver-xorg-input-evdev


  • Check if evdev driver is installed


dpkg -l | grep xserver-xorg-input


Result:







  • Check if configuration files are in /usr/share/X11/xorg.conf.d directory.


cd /usr/share/X11/xorg.conf.d ls

result:

 
10-amdgpu.conf 10-evdev.conf 10-quirks.conf 40-libinput.conf 70-wacom.conf


  • now remove libinput driver or we can just remove touch screen section from libinput driver configuration file.


in order to remove libinput driver with dependent packages:


 
apt-get remove --auto-remove xserver-xorg-input-libinput


in order to disable libinput touch scree:

open 40-libinput.conf and remove a touchscreen InputClass Section that is shown in image below.




  • now install xinput-calibrator



sudo apt-get install xinput-calibrator


  • Check if you need to swap axes. if you need to swap just run:


xinit set-int-prop "eGalax Inc." "Evdev Axes Swap" 8 1


  • Run calibrator to get correct x,y positions.

 
xinput_calibrator --output-type xinput

The result will be like this:





Now everything should be fine, but if we want to make calibration permanent (after system restart),  open 10-evdev.conf config, find touch screen section and add "Calibration" and "SwapAxes" entries.





If we don't want to touch evdev configuration we can run the folloing command after X11 load:


xinput set-prop "eGalax Inc." "Evdev Axis Calibration" 1543, 222, 409, 1582 xinput set-prop "eGalax Inc." "Evdev Axes Swap" 1
if you want to configure libinput instead of evdev, remove evdev driver and install lib input if the last one is removed:
dpkg -P xserver-xorg-input-evdev apt-get install xserver-xorg-input-libinput

Wednesday, May 24, 2017

dnsmasq in Gnu/Linux



dnsmasq แƒแƒ แƒ˜แƒก DNS forwarder แƒ“แƒ แƒแƒกแƒ”แƒ•แƒ” แƒจแƒ”แƒ’แƒ•แƒ˜แƒซแƒšแƒ˜แƒ แƒ’แƒแƒ›แƒแƒ•แƒ˜แƒงแƒ”แƒœแƒแƒ— แƒ แƒแƒ’แƒแƒ แƒช DCHP แƒกแƒ”แƒ แƒ•แƒ”แƒ แƒแƒ“. แƒกแƒฎแƒ•แƒ แƒกแƒ˜แƒขแƒงแƒ•แƒ”แƒ‘แƒ˜แƒ— แƒ แƒแƒ› แƒ•แƒ—แƒฅแƒ•แƒแƒ— dnsmasq แƒกแƒแƒจแƒฃแƒแƒšแƒ”แƒ‘แƒ˜แƒ— แƒฉแƒ•แƒ”แƒœ แƒจแƒ”แƒ’แƒ•แƒ˜แƒซแƒšแƒ˜แƒ DNS แƒ˜แƒก แƒฅแƒ”แƒจแƒ˜แƒ แƒ”แƒ‘แƒ/แƒฉแƒ•แƒ”แƒœ แƒ’แƒ”แƒ›แƒแƒ–แƒ” แƒ™แƒแƒœแƒคแƒ˜แƒ’แƒฃแƒ แƒแƒชแƒ˜แƒ แƒกแƒ˜แƒฉแƒฅแƒแƒ แƒ˜แƒก แƒ’แƒแƒกแƒแƒ–แƒ แƒ“แƒ”แƒšแƒแƒ“,  แƒแƒกแƒ”แƒ•แƒ”  แƒ แƒแƒฃแƒขแƒ”แƒ‘แƒ˜แƒก,  internal IP แƒ’แƒแƒกแƒแƒฌแƒ”แƒ แƒแƒ“.

แƒ›แƒ˜แƒฃแƒฎแƒ”แƒ“แƒแƒ•แƒแƒ“ แƒ˜แƒ›แƒ˜แƒกแƒ, แƒ แƒแƒ› แƒžแƒ˜แƒ แƒแƒ“แƒแƒ“ Open Suse Leap แƒ–แƒ” แƒ•แƒ›แƒฃแƒจแƒแƒแƒ‘, แƒฃแƒœแƒ“แƒ แƒ•แƒแƒฆแƒ˜แƒแƒ แƒ,   แƒ”แƒ แƒ—แƒ”แƒ แƒ—แƒ˜ แƒงแƒ•แƒ”แƒšแƒแƒ–แƒ” แƒ™แƒแƒ แƒ’แƒ˜ แƒ“แƒแƒ™แƒฃแƒ›แƒ”แƒœแƒขแƒแƒชแƒ˜แƒ  archlinux แƒแƒฅแƒ•แƒก.  แƒจแƒ”แƒกแƒแƒ‘แƒแƒ›แƒ˜แƒกแƒแƒ“,  แƒ–แƒแƒ’แƒฏแƒ”แƒ , arch แƒ˜แƒก แƒ“แƒแƒ™แƒฃแƒ›แƒ”แƒœแƒขแƒแƒชแƒ˜แƒแƒจแƒ˜แƒช แƒ•แƒ˜แƒฎแƒ”แƒ“แƒ”แƒ‘แƒ˜. แƒฎแƒจแƒ˜แƒ แƒแƒ“ แƒ‘แƒ”แƒ•แƒ แƒ˜ แƒ แƒแƒ›แƒ” แƒžแƒ˜แƒ แƒ“แƒแƒžแƒ˜แƒ  แƒ”แƒ›แƒ—แƒฎแƒ•แƒ”แƒ•แƒ.  แƒ›แƒแƒ™แƒšแƒ”แƒ“, แƒ“แƒ”แƒขแƒแƒšแƒ”แƒ‘แƒจแƒ˜ แƒ—แƒฃ แƒ“แƒแƒ’แƒแƒ˜แƒœแƒขแƒ”แƒ แƒ”แƒ‘แƒ— แƒ˜แƒฎแƒ˜แƒšแƒ”แƒ— แƒจแƒ”แƒ›แƒ“แƒ”แƒ’แƒ˜ แƒšแƒ˜แƒœแƒ™แƒ˜.




แƒžแƒแƒขแƒแƒ แƒ แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒ˜ แƒ›แƒแƒ•แƒ˜แƒงแƒ•แƒแƒœแƒแƒ—:

แƒฌแƒแƒ แƒ›แƒแƒ˜แƒ“แƒ’แƒ˜แƒœแƒ”แƒ— แƒ›แƒฃแƒจแƒแƒแƒ‘แƒ— แƒ™แƒแƒ›แƒžแƒแƒœแƒ˜แƒแƒจแƒ˜ แƒกแƒแƒ“แƒแƒช แƒ’แƒแƒฅแƒ•แƒ— แƒจแƒ˜แƒ“แƒ DNS แƒกแƒ”แƒ แƒ•แƒ”แƒ แƒ˜.  แƒ แƒแƒ’แƒแƒ แƒช Google-แƒก แƒ›แƒแƒงแƒ•แƒแƒ แƒฃแƒšแƒ˜ แƒฉแƒ”แƒ›แƒ—แƒ•แƒ˜แƒก แƒžแƒ แƒ˜แƒแƒ แƒ˜แƒขแƒ”แƒขแƒ˜ แƒงแƒแƒ•แƒ”แƒšแƒ—แƒ•แƒ˜แƒก 8.8.8.8 แƒแƒ แƒ˜แƒก, แƒ’แƒแƒ›แƒแƒ›แƒ“แƒ˜แƒœแƒแƒ แƒ” แƒ˜แƒฅแƒ˜แƒ“แƒแƒœ, แƒ แƒแƒ› แƒฎแƒจแƒ˜แƒ แƒแƒ“ แƒ•แƒแƒฌแƒงแƒ“แƒ”แƒ‘แƒ˜ แƒ˜แƒกแƒ”แƒ— แƒกแƒ˜แƒขแƒฃแƒแƒชแƒ˜แƒแƒก, แƒ แƒแƒ“แƒ”แƒกแƒแƒช แƒจแƒ˜แƒ“แƒ DNS แƒกแƒ”แƒ แƒ•แƒ”แƒ แƒ˜ แƒชแƒฃแƒ“แƒแƒ“ แƒ›แƒฃแƒจแƒแƒแƒ‘แƒก.

แƒ’แƒแƒ›แƒแƒกแƒแƒ•แƒแƒšแƒ˜:

1. แƒ›แƒแƒ•แƒแƒฎแƒ“แƒ˜แƒœแƒ แƒฅแƒ”แƒจแƒ˜แƒ แƒ”แƒ‘แƒ.
2. แƒ—แƒฃ แƒจแƒ˜แƒ“แƒ แƒกแƒ”แƒ แƒ•แƒ”แƒ แƒ˜ แƒแƒ แƒแƒ, แƒ’แƒแƒ•แƒ˜แƒ“แƒ” แƒ’แƒฃแƒ’แƒšแƒ˜แƒก DNS แƒ›แƒ”แƒจแƒ•แƒ”แƒแƒ‘แƒ˜แƒ—.


 แƒžแƒ˜แƒ แƒ•แƒ”แƒš แƒ แƒ˜แƒ’แƒจแƒ˜ แƒ•แƒœแƒแƒฎแƒแƒ—, dnsmasq แƒ—แƒฃ แƒ’แƒ•แƒ˜แƒงแƒ”แƒœแƒ˜แƒ.  แƒ“แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ˜แƒก แƒ˜แƒœแƒกแƒขแƒ แƒฃแƒฅแƒชแƒ˜แƒ just google (แƒ’แƒแƒแƒฉแƒœแƒ˜แƒ แƒ“แƒ˜แƒกแƒขแƒ แƒแƒก  zypper, apt-get, yast, etc...)

 แƒกแƒขแƒแƒขแƒฃแƒกแƒ˜:

vq@local:/etc/NetworkManager> sudo systemctl status dnsmasq.service 
root's password:
dnsmasq.service - DNS caching server.
   Loaded: loaded (/usr/lib/systemd/system/dnsmasq.service; enabled; 
 vendor preset: disabled)
  Drop-In: /run/systemd/generator/dnsmasq.service.d
           └─50-insserv.conf-$named.conf
   Active: active (running) since Wed 2017-05-24 11:22:19 +04;  
 34min ago
  Process: 5341 ExecStartPre=/usr/sbin/dnsmasq --test 
 (code=exited, status=0/SUCCESS)
 Main PID: 5344 (dnsmasq)
    Tasks: 1 (limit: 512)
   Memory: 464.0K
      CPU: 244ms
   CGroup: /system.slice/dnsmasq.service
           └─5344 /usr/sbin/dnsmasq --log-async 
 --enable-dbus --keep-in-foreground


แƒจแƒ”แƒ›แƒ“แƒ”แƒ’แƒ˜ แƒœแƒแƒ‘แƒ˜แƒฏแƒ˜ (แƒกแƒแƒญแƒ˜แƒ แƒแƒ แƒ™แƒแƒ›แƒ”แƒœแƒขแƒแƒ แƒ”แƒ‘แƒ˜แƒก แƒ›แƒแƒฎแƒกแƒœแƒ แƒ™แƒแƒœแƒคแƒ˜แƒ’แƒฃแƒ แƒแƒชแƒ˜แƒ˜แƒก แƒคแƒแƒ˜แƒšแƒจแƒ˜ แƒ“แƒ แƒ’แƒแƒ“แƒแƒ™แƒ”แƒ—แƒ”แƒ‘แƒ แƒ—แƒฅแƒ•แƒ”แƒœแƒก แƒ’แƒ”แƒ›แƒแƒ–แƒ”):

vim /etc/dnsmasq.conf 
resolv-file=/etc/resolv.dnsmasq.conf
strict-order
server=/แƒ“แƒแƒ›แƒ”แƒ˜แƒœแƒ˜ /DNS แƒ›แƒ˜แƒกแƒแƒ›แƒแƒ แƒ—แƒ˜
listen-address=127.0.0.1
bind-interfaces
vim /etc/resolv.dnsmasq.conf
nameserver 8.8.4.4
nameserver 8.8.8.8
แƒ˜แƒ›แƒ˜แƒก แƒจแƒ”แƒ›แƒ“แƒ”แƒ’, แƒ แƒแƒช NetworkManager - แƒก แƒ•แƒ”แƒขแƒงแƒ•แƒ˜แƒ— แƒ แƒแƒ› 127.0.0.1-แƒก แƒ›แƒแƒฃแƒกแƒ›แƒ˜แƒœแƒแƒก, แƒจแƒ”แƒ•แƒแƒ›แƒแƒฌแƒ›แƒแƒ—, แƒ แƒแƒ› แƒ›แƒแƒ แƒ—แƒšแƒแƒช 127.0.0.1 -แƒก แƒฃแƒกแƒ›แƒ”แƒœแƒก:

vim /etc/resolv.conf  nameserver 127.0.0.1 
vq@local:/etc> nmcli dev show | grep DNS
IP4.DNS[1]:                             127.0.0.1 

vq@local:/etc> nslookup domain
Server:        127.0.0.1



Sunday, April 17, 2016

English to Georgian Dictionary for Kindle FREE




แƒฅแƒ˜แƒœแƒ“แƒšแƒ˜แƒกแƒ•แƒ˜แƒก แƒ’แƒแƒ•แƒแƒ™แƒ”แƒ—แƒ” แƒšแƒ”แƒฅแƒกแƒ˜แƒ™แƒแƒœแƒ˜. แƒฌแƒ˜แƒ’แƒœแƒ˜แƒก แƒ™แƒ˜แƒ—แƒฎแƒ•แƒ˜แƒก แƒ“แƒ แƒแƒก แƒ›แƒแƒœแƒ˜แƒจแƒœแƒแƒ•แƒ— แƒกแƒ˜แƒขแƒงแƒ•แƒแƒก แƒ“แƒ แƒแƒ•แƒขแƒแƒ›แƒแƒขแƒฃแƒ แƒแƒ“ แƒ’แƒแƒ˜แƒฎแƒกแƒœแƒ”แƒ‘แƒ แƒคแƒแƒœแƒฏแƒแƒ แƒ, แƒกแƒแƒ“แƒแƒช แƒ›แƒแƒœแƒ˜แƒจแƒœแƒฃแƒšแƒ˜ แƒกแƒ˜แƒขแƒงแƒ•แƒ˜แƒก แƒ’แƒแƒœแƒ›แƒแƒ แƒขแƒ”แƒ‘แƒแƒก แƒœแƒแƒฎแƒแƒ•แƒ—.


Google drive แƒ“แƒแƒœ แƒคแƒแƒ˜แƒšแƒ˜แƒก แƒ’แƒแƒ“แƒ›แƒแƒกแƒแƒฌแƒ”แƒ แƒ˜ แƒšแƒ˜แƒœแƒ™แƒ˜

แƒ”แƒกแƒ”แƒช แƒšแƒ˜แƒœแƒ™แƒ˜ แƒแƒ›แƒแƒ–แƒแƒœแƒ–แƒ”

แƒ˜แƒ›แƒ”แƒ“แƒ˜แƒ แƒ›แƒแƒ’แƒ”แƒฌแƒแƒœแƒ”แƒ‘แƒแƒ— :) 






Friday, January 15, 2016

JNA & JNI Intro

JNA & JNI


แƒแƒกแƒ” 1 แƒฌแƒ”แƒšแƒ˜แƒฌแƒแƒ“แƒ˜ แƒ˜แƒฅแƒœแƒ”แƒ‘แƒ แƒ แƒแƒช แƒแƒ แƒแƒคแƒ”แƒ แƒ˜ แƒ“แƒแƒ›แƒ˜แƒฌแƒ”แƒ แƒ˜แƒ แƒ‘แƒšแƒแƒ’แƒ–แƒ”. แƒ›แƒ”แƒ’แƒแƒ‘แƒ แƒ˜แƒก แƒ—แƒฎแƒแƒ•แƒœแƒ˜แƒ— แƒžแƒแƒขแƒแƒ แƒ แƒกแƒขแƒแƒขแƒ˜แƒ แƒ›แƒ˜แƒ•แƒฃแƒซแƒฆแƒ•แƒ”แƒœแƒ˜ JNA-แƒก.

Java Native Access  แƒ“แƒ Java Native Interface แƒ‘แƒ˜แƒ‘แƒšแƒ˜แƒแƒ—แƒ”แƒ™แƒ”แƒ‘แƒ˜ แƒ’แƒแƒ›แƒแƒ˜แƒงแƒ”แƒœแƒ”แƒ‘แƒ C , C++, assembly แƒ–แƒ” แƒ“แƒแƒฌแƒ”แƒ แƒ˜แƒšแƒ˜ แƒ™แƒแƒ“แƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒ›แƒแƒกแƒแƒซแƒแƒฎแƒ”แƒ‘แƒšแƒแƒ“ (C++ แƒ•แƒ แƒแƒคแƒ”แƒ แƒ˜ JNA แƒแƒ  แƒแƒฅแƒ•แƒก, แƒฎแƒ”แƒšแƒ˜แƒ— แƒฃแƒœแƒ“แƒ แƒ“แƒแƒฌแƒ”แƒ แƒแƒ— แƒแƒœ แƒจแƒ”แƒ’แƒ˜แƒซแƒšแƒ˜แƒแƒ— แƒ’แƒแƒ›แƒแƒ˜แƒงแƒ”แƒœแƒแƒ— JNA-แƒก แƒจแƒ•แƒ˜แƒšแƒแƒ‘แƒ˜แƒšแƒ˜ แƒžแƒ แƒแƒ”แƒฅแƒขแƒ”แƒ‘แƒ˜, แƒ แƒแƒ’แƒแƒ แƒ˜แƒชแƒแƒ แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒแƒ“ BridJ แƒ“แƒ แƒกแƒฎแƒ•แƒ แƒ›แƒ แƒแƒ•แƒแƒšแƒ˜).  C/C++ แƒ”แƒœแƒแƒ–แƒ” แƒ›แƒ˜แƒฉแƒ•แƒ”แƒฃแƒšแƒ˜ แƒ“แƒ”แƒ•แƒ”แƒšแƒแƒžแƒ”แƒ แƒ˜ JNI-แƒก แƒแƒ˜แƒ แƒฉแƒ”แƒ•แƒก, แƒ แƒแƒ“แƒ’แƒแƒœ แƒ™แƒแƒœแƒ•แƒ”แƒ แƒขแƒแƒชแƒ˜แƒ”แƒ‘แƒ˜ Native แƒ›แƒฎแƒแƒ แƒ”แƒก แƒแƒ แƒ˜แƒก แƒ˜แƒ›แƒšแƒ”แƒ›แƒ”แƒœแƒขแƒ˜แƒ แƒ”แƒ‘แƒฃแƒšแƒ˜, แƒ•แƒ˜แƒกแƒ—แƒ•แƒ˜แƒกแƒแƒช Java แƒ”แƒœแƒแƒ แƒฃแƒคแƒ แƒ แƒแƒฎแƒšแƒแƒก, แƒ˜แƒก JNA แƒแƒ˜แƒ แƒฉแƒ”แƒ•แƒก, แƒ แƒแƒ“แƒ’แƒแƒœแƒแƒช แƒ™แƒแƒœแƒ•แƒ”แƒ แƒขแƒแƒชแƒ˜แƒ”แƒ‘แƒ˜ Java แƒ›แƒฎแƒแƒ แƒ”แƒก แƒฎแƒ“แƒ”แƒ‘แƒ. แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ˜แƒก แƒแƒ แƒ”แƒแƒšแƒ˜ แƒแƒ แƒ˜แƒ•แƒ”แƒก แƒ“แƒ˜แƒ“แƒ˜ แƒแƒฅแƒ•แƒก, แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒแƒ“ JNA-แƒก แƒ˜แƒงแƒ”แƒœแƒ”แƒ‘แƒก Apache Cassandra แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒแƒ แƒ˜แƒก แƒ”แƒ แƒ—แƒ”แƒ แƒ—แƒ˜ แƒกแƒแƒฃแƒ™แƒ”แƒ—แƒ”แƒกแƒ NoSQL แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ—แƒ แƒ‘แƒแƒ–แƒ , แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช CAP  Theorem แƒ˜แƒก แƒ›แƒ˜แƒฎแƒ”แƒ“แƒ•แƒ˜แƒ— Availability แƒกแƒ แƒ“แƒ Partition Tolerance -แƒก แƒจแƒแƒ แƒ˜แƒก แƒ–แƒ˜แƒก. แƒแƒกแƒ”แƒ•แƒ” JetBrains แƒ˜แƒก แƒ›แƒ˜แƒ”แƒ  แƒจแƒ”แƒฅแƒ›แƒœแƒ˜แƒšแƒ˜ แƒชแƒœแƒแƒ‘แƒ˜แƒšแƒ˜ InteliJ IDEA, Netbeans IDE แƒ“แƒ แƒแƒกแƒ” แƒจแƒ”แƒ›แƒ“แƒ”แƒ’.

JNA แƒ–แƒ” แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒ”แƒ‘แƒ˜ , แƒ‘แƒ˜แƒ‘แƒšแƒ˜แƒแƒ—แƒ”แƒ™แƒแƒกแƒ—แƒแƒœ แƒ”แƒ แƒ—แƒแƒ“, แƒจแƒ”แƒ’แƒ˜แƒซแƒšแƒ˜แƒแƒ— แƒœแƒแƒฎแƒแƒ— แƒจแƒ”แƒ›แƒ“แƒ”แƒ’ แƒšแƒ˜แƒœแƒ™แƒ–แƒ”:
https://github.com/java-native-access/jna.git


แƒ—แƒ•แƒแƒšแƒกแƒแƒฉแƒ˜แƒœแƒแƒ”แƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก แƒ“แƒแƒ•แƒฌแƒ”แƒ แƒแƒ— แƒ›แƒแƒ แƒขแƒ˜แƒ•แƒ˜ แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒ˜.

header.h
#ifndef HEADER_H_INCLUDED
#define HEADER_H_INCLUDED 

int  buildRequest(char * input, char * answer, int inputLenth);  

typedef void(*NotificationListener)(char *, int);
void callbackTriger(const NotificationListener l); 
void getDeviceRandomStatus(char *answer, int sizeOfChars); 
int randNum( int min,  int max); 

#endif // HEADER_H_INCLUDED



header.c
#include<stdio.h>
#include "header.h"
#include <stdlib.h>
#include <time.h>


int buildRequest(char * input, char * answer, int inputLenth) {
  printf("C: log passed params from java to C: ");
  int i = 0;
  for (; *input; ++input) {
    i++;
    if (i > inputLenth) {
          break;
    }
    char c = *input;
    int i = (int) c;
    printf("%d ", i);
  }
  printf("\n");
  answer[0] = 0xFE;
  answer[1] = 0x81;
  return i - 1;
}

void callbackTriger(const NotificationListener l) {
  int size = randNum(1, 20);
  char answer[size];
  getDeviceRandomStatus(answer, size);
  (*l)(answer, sizeof(answer));
}

void getDeviceRandomStatus(char *answer, int sizeOfChars) {
  int i;
  for (i = 0; i < sizeOfChars; i++) {
        int i = randNum(0, 255);
        answer[i] = i + '0';
  }
}

int randNum(int min, int max) {
  srand(time(NULL));
  double scaled = (double) rand() / RAND_MAX;
  int val = (max - min + 1) * scaled + min;
  return val;
} 




mainc.c    แƒ’แƒแƒ›แƒแƒ•แƒ˜แƒงแƒ”แƒœแƒ”แƒ‘แƒ— แƒ‘แƒ˜แƒ‘แƒšแƒ˜แƒแƒ—แƒ”แƒ™แƒ˜แƒก แƒ’แƒแƒกแƒแƒขแƒ”แƒกแƒขแƒแƒ“ (แƒ˜แƒก Shared Library แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒจแƒ”แƒ›แƒ“แƒ’แƒแƒ› แƒฃแƒœแƒ“แƒ แƒฉแƒแƒ‘แƒแƒ›แƒแƒ— Java แƒ™แƒแƒ“แƒจแƒ˜ แƒจแƒ˜ JNA แƒ“แƒแƒฎแƒ›แƒแƒ แƒ”แƒ‘แƒ˜แƒ—)
#include<stdio.h>
#include <limits.h>
#include <stdlib.h>

int main(void)
{
     char ch [] = {0x01, 0x07, 0x09 ,0xA, 0xB,0xC, 0xD,0xE ,0xF };
     char answer[2];
     int r=buildRequest(ch, answer, 5);
     printf("Returned params: ");

     int i;
     for (i = 0; i < sizeof(answer); ++i){
           printf("%d ", answer[i]);
     }

    return 0; 


}


แƒจแƒ”แƒ•แƒฅแƒ›แƒœแƒแƒ— Shared แƒ‘แƒ˜แƒ‘แƒšแƒ˜แƒแƒ—แƒ”แƒ™แƒ แƒ“แƒ แƒ’แƒแƒ•แƒขแƒ”แƒกแƒขแƒแƒ—. แƒแƒ› แƒกแƒ™แƒ แƒ˜แƒžแƒขแƒ”แƒ‘แƒ˜แƒ— แƒจแƒ”แƒฅแƒ˜แƒ›แƒœแƒ”แƒ‘แƒ header.o แƒ“แƒ libHeader.so, แƒจแƒ”แƒ›แƒ“แƒ”แƒ’ main แƒก แƒ›แƒ˜แƒ•แƒแƒ‘แƒแƒ›แƒ— แƒ“แƒ แƒ’แƒแƒ•แƒขแƒ”แƒกแƒขแƒแƒ•แƒ—:
gcc -c -Wall -Werror -fpic header.c 
gcc -shared -o libHeader.so header.o
gcc main.c -o main -lHeader -L/home/vq/Desktop -Wl,-rpath=/home/vq/Desktop
./main



แƒแƒฎแƒšแƒ แƒ“แƒแƒ•แƒฌแƒ”แƒ แƒแƒ— แƒ แƒแƒ›แƒ“แƒ”แƒœแƒ˜แƒ›แƒ” แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒ˜, แƒ”แƒ แƒ—แƒ˜ แƒฃแƒ‘แƒ แƒแƒšแƒแƒ“ Java แƒ“แƒแƒœ C แƒ™แƒแƒ“แƒ˜แƒก แƒ’แƒแƒ›แƒแƒซแƒแƒฎแƒ”แƒ‘แƒ, แƒ›แƒ”แƒแƒ แƒ” แƒ™แƒ˜ แƒžแƒ˜แƒ แƒ˜แƒฅแƒ˜แƒ— แƒแƒœแƒฃ callback. แƒ’แƒแƒœแƒ•แƒ˜แƒฎแƒ˜แƒšแƒแƒ— buildRequest แƒคแƒฃแƒœแƒฅแƒชแƒ˜แƒ˜แƒก แƒ’แƒแƒ›แƒแƒซแƒแƒฎแƒ”แƒ‘แƒ˜แƒก แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒ˜ -  แƒ‘แƒแƒ˜แƒขแƒ”แƒ‘แƒ˜แƒก แƒ›แƒแƒกแƒ˜แƒ•แƒ˜ แƒฌแƒแƒ แƒ›แƒแƒ“แƒ’แƒ”แƒœแƒ˜แƒšแƒ˜ แƒ’แƒ•แƒแƒฅแƒ•แƒก แƒ แƒแƒ’แƒแƒ แƒช char *, แƒ แƒแƒ’แƒแƒ แƒช input แƒ˜แƒกแƒ” output แƒ แƒแƒช แƒฃแƒœแƒ“แƒ แƒ“แƒแƒ‘แƒ แƒฃแƒœแƒ“แƒ”แƒก, แƒแƒกแƒ”แƒ•แƒ” แƒแƒฅ แƒ’แƒ•แƒญแƒ˜แƒ แƒ“แƒ”แƒ‘แƒ แƒ”แƒ แƒ—แƒ˜ แƒ“แƒแƒ›แƒฎแƒแƒ แƒ” แƒžแƒ แƒ˜แƒ›แƒ˜แƒขแƒ˜แƒ•แƒ˜ แƒ‘แƒแƒ˜แƒขแƒ”แƒ‘แƒ˜แƒก แƒ›แƒแƒกแƒ˜แƒ•แƒ˜แƒก แƒ–แƒแƒ›แƒ˜แƒก แƒ’แƒแƒœแƒกแƒแƒกแƒแƒ–แƒฆแƒ•แƒ แƒแƒ“. callbackTriger -แƒ˜แƒก แƒจแƒ”แƒ›แƒ—แƒฎแƒ•แƒ”แƒ•แƒแƒจแƒ˜ แƒžแƒแƒ˜แƒœแƒขแƒ”แƒ แƒ˜ แƒ’แƒ•แƒแƒฅแƒ•แƒก แƒžแƒแƒ แƒแƒ›แƒ”แƒขแƒ แƒแƒ“ NotificationListener แƒ˜แƒก แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒฐแƒ”แƒ“แƒ”แƒ แƒจแƒ˜แƒ แƒ’แƒแƒ›แƒแƒชแƒฎแƒแƒ“แƒ”แƒ‘แƒฃแƒšแƒ˜, pointer-to-function แƒขแƒ˜แƒžแƒ˜. แƒ แƒแƒช แƒจแƒ”แƒ”แƒฎแƒ”แƒ‘แƒ randNum แƒ“แƒ getDeviceRundomStatus, แƒ”แƒกแƒ”แƒœแƒ˜ แƒฃแƒ‘แƒ แƒแƒšแƒ แƒ›แƒ”แƒ—แƒ“แƒ”แƒ‘แƒ˜แƒ แƒจแƒ”แƒ›แƒ—แƒฎแƒ•แƒ”แƒ•แƒ˜แƒ—แƒ˜ แƒ–แƒแƒ›แƒ˜แƒก แƒ“แƒ แƒ›แƒœแƒ˜แƒจแƒ•แƒœแƒ”แƒšแƒแƒ‘แƒ”แƒ‘แƒ˜แƒก แƒ‘แƒแƒ˜แƒขแƒ”แƒ‘แƒ˜แƒก แƒ›แƒแƒกแƒ˜แƒ•แƒ˜แƒก แƒ“แƒแƒกแƒแƒ‘แƒ แƒฃแƒœแƒ”แƒ‘แƒšแƒแƒ“.



import java.util.Arrays;
import java.util.logging.Logger;

import com.sun.jna.Callback;
import com.sun.jna.Library;
import com.sun.jna.Memory;
import com.sun.jna.Native;
import com.sun.jna.Pointer;

/**
 * 
 * @author vakhtang Koroghlishvili
 * 
 */
public class BuildRequestMaker {

public static Logger log = Logger.getLogger(CallBack.class
  .getSimpleName());

public interface CLibrary extends Library {

 public int buildRequest(Pointer input, Pointer output,
   int inputLenth);
}

public interface CLibraryCallBack extends Library {

 public interface NotificationListener extends Callback {
  void invoke(Pointer val, int lenth);
 }

 public static class NotificationListenerImpl implements
   NotificationListener {
  @Override
  public void invoke(Pointer val, int lenth) {
   log.info("java mehtod, callback: "
     + Arrays.toString(val.getByteArray(0, lenth)));
  }
 }

 public void callbackTriger(NotificationListener callback);
}

public byte[] buildRequest(byte[] inputArr) {

 CLibrary clib = (CLibrary) Native.loadLibrary(
   "/home/vq/Desktop/libHeader.so", CLibrary.class);

 Pointer input = new Memory(inputArr.length
   * Native.getNativeSize(Byte.TYPE));
 Pointer answer = new Memory(inputArr.length
   * Native.getNativeSize(Byte.TYPE));

 for (int i = 0; i < inputArr.length; i++) {
  input.setByte(i * Native.getNativeSize(Byte.TYPE),
    inputArr[i]);
 }

 int resultSize = clib.buildRequest(input, answer,
   inputArr.length);

 log.info("returned value from c lib is: " + resultSize);
 byte[] resultByte = answer.getByteArray(0, resultSize);

 log.info("returned value array from c lib is: "
   + Arrays.toString(resultByte));

 return resultByte;

}

public void callBackListener() {

 CLibraryCallBack clib = (CLibraryCallBack) Native
   .loadLibrary("/home/vq/Desktop/libHeader.so",
     CLibraryCallBack.class);

 // instantiate a callback wrapper instance
 CLibraryCallBack.NotificationListenerImpl callbackImpl = new CLibraryCallBack.NotificationListenerImpl();

 // pass the callback wrapper to the C library
 clib.callbackTriger(callbackImpl);

 }

}


แƒ“แƒ แƒขแƒ”แƒกแƒขแƒ”แƒ‘แƒ˜:


import org.junit.Assert;
import org.junit.Test;

public class JNATests {

 @Test
 public void buildRequestTest() {
  BuildRequestMaker m = new BuildRequestMaker();
  byte[] input = { (byte) 0x81, (byte) 0xFE };
  byte[] expect = { (byte) 0xFE, (byte) 0x81 };
  Assert.assertArrayEquals(expect, m.buildRequest(input));
 }

 @Test
 public void callBacklTest() {
  BuildRequestMaker m = new BuildRequestMaker();
  Exception ex = null;
  try {
   m.callBackListener();
  } catch (Exception e) {
   ex = e;
  }
  Assert.assertEquals(null, ex);
 }
แƒจแƒ”แƒ“แƒ”แƒ’แƒ”แƒ‘แƒ˜:
INFO: started call back listener
INFO: java mehtod, callback: [-64, -28, 119, 124, 84, 127, 0, 0]
...
INFO: started building request
INFO: returned value from c lib is: 2
INFO: returned value array from c lib is: [-2, -127]
C: log passed params from java to C: -127 -2 


แƒ”แƒก แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒ˜, แƒ˜แƒกแƒ”, แƒ“แƒแƒ›แƒแƒขแƒ”แƒ‘แƒ˜แƒ—แƒ˜ แƒ“แƒ”แƒขแƒแƒšแƒ”แƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก Just Google 

Wednesday, November 5, 2014

Spring, Pooling - tomcat, ORA

Connection Pool

แƒฅแƒแƒœแƒ”แƒฅแƒจแƒ”แƒœ แƒคแƒฃแƒšแƒ˜ แƒแƒฃแƒชแƒ˜แƒšแƒ”แƒ‘แƒšแƒแƒ“ แƒ’แƒ•แƒญแƒ˜แƒ แƒ“แƒ”แƒ‘แƒ แƒ›แƒแƒจแƒ˜แƒœ, แƒ แƒแƒ“แƒ”แƒกแƒแƒช แƒกแƒแƒฅแƒ›แƒ” แƒ’แƒ•แƒแƒฅแƒ•แƒก แƒ˜แƒกแƒ”แƒ— แƒแƒžแƒšแƒ˜แƒ™แƒแƒชแƒ˜แƒแƒกแƒ—แƒแƒœ, แƒ แƒแƒ›แƒ”แƒšแƒกแƒแƒช แƒ‘แƒ”แƒ•แƒ แƒ˜ แƒ›แƒแƒ›แƒฎแƒ›แƒแƒ แƒ”แƒ‘แƒ”แƒšแƒ˜ แƒ˜แƒงแƒ”แƒœแƒ”แƒ‘แƒก - แƒฌแƒ˜แƒœแƒแƒกแƒฌแƒแƒ  แƒ•แƒแƒ›แƒงแƒแƒ แƒ”แƒ‘แƒ— แƒ™แƒแƒ›แƒœแƒ˜แƒ™แƒแƒชแƒ˜แƒแƒก แƒ‘แƒแƒ–แƒแƒกแƒ—แƒแƒœ, แƒฌแƒ˜แƒœแƒแƒกแƒฌแƒแƒ  แƒ’แƒแƒ›แƒแƒ•แƒงแƒแƒคแƒ— แƒแƒ› แƒฃแƒ™แƒแƒœแƒแƒกแƒ™แƒœแƒ”แƒšแƒ˜แƒกแƒ—แƒ•แƒ˜แƒก แƒ แƒ”แƒกแƒฃแƒ แƒกแƒ”แƒ‘แƒก แƒ“แƒ แƒแƒกแƒ” แƒจแƒ”แƒ›แƒ“แƒ”แƒ’.

แƒแƒšแƒขแƒ”แƒ แƒœแƒแƒขแƒ˜แƒ•แƒ”แƒ‘แƒ˜ แƒ‘แƒ”แƒ•แƒ แƒ˜ แƒ’แƒ•แƒแƒฅแƒ•แƒก, แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒแƒ“ Apache commons DBCP, Tomcat DBCP, C3PO  แƒ“แƒ แƒแƒกแƒ” แƒจแƒ”แƒ›แƒ“แƒ”แƒ’. แƒแƒ› แƒกแƒขแƒแƒขแƒ˜แƒแƒจแƒ˜ แƒ™แƒ˜ tomcat แƒ˜แƒก DBCP แƒ–แƒ” แƒ›แƒ˜แƒœแƒ“แƒ แƒ•แƒ˜แƒกแƒแƒฃแƒ‘แƒ แƒ - แƒ”แƒก tomcat แƒกแƒ”แƒ แƒ•แƒ”แƒ แƒ˜แƒช แƒซแƒแƒšแƒ˜แƒแƒœ แƒ›แƒแƒ›แƒฌแƒแƒœแƒก แƒ“แƒ แƒ›แƒ˜แƒกแƒ˜ แƒคแƒฃแƒšแƒ˜แƒœแƒ’แƒ˜แƒก แƒกแƒ˜แƒกแƒขแƒ”แƒ›แƒแƒช. แƒขแƒแƒ›แƒ™แƒแƒขแƒจแƒ˜ dbcp แƒ˜แƒกแƒขแƒแƒ แƒ˜แƒ แƒ˜แƒฌแƒงแƒ”แƒ‘แƒ แƒ˜แƒ›แƒ˜แƒ— แƒ แƒแƒ›, แƒ›แƒแƒ— แƒ’แƒแƒแƒ’แƒ แƒซแƒ”แƒšแƒ”แƒก  commons DBCP แƒ˜แƒก แƒ“แƒ”แƒ•แƒ”แƒšแƒแƒžแƒ›แƒ”แƒœแƒขแƒ˜.. แƒแƒ›แƒ˜แƒก แƒ›แƒ˜แƒ–แƒ”แƒ–แƒ˜ แƒ™แƒ˜ แƒ˜แƒก แƒ˜แƒงแƒ แƒ แƒแƒ› commons -แƒก  แƒกแƒแƒจแƒ˜แƒœแƒ”แƒšแƒ˜ thread-safety แƒžแƒ แƒแƒ‘แƒšแƒ”แƒ›แƒ”แƒ‘แƒ˜ แƒฅแƒแƒœแƒ“แƒ (แƒ”แƒก แƒ˜แƒฎแƒ”แƒ‘แƒ 1.0, 1.2 แƒ•แƒ”แƒ แƒกแƒ˜แƒ”แƒ‘แƒก แƒ›แƒแƒ’แƒแƒšแƒ—แƒแƒ“).. แƒจแƒ”แƒกแƒแƒ‘แƒแƒ›แƒ˜แƒกแƒแƒ“ แƒขแƒแƒ›แƒ™แƒแƒขแƒ›แƒ แƒ—แƒแƒ•แƒ˜แƒกแƒ˜ แƒ“แƒ”แƒ•แƒ”แƒšแƒแƒžแƒ›แƒ”แƒœแƒขแƒ˜ แƒ“แƒแƒ˜แƒฌแƒงแƒ, แƒ’แƒแƒ“แƒแƒแƒ™แƒ”แƒ—แƒ” แƒงแƒ•แƒ”แƒšแƒแƒคแƒ”แƒ แƒ˜ แƒ—แƒแƒ•แƒ˜แƒก แƒ’แƒ”แƒ›แƒแƒ–แƒ”, common แƒ˜แƒก แƒžแƒ แƒแƒ‘แƒšแƒ”แƒ›แƒ”แƒ‘แƒ˜แƒช แƒ’แƒแƒแƒกแƒฌแƒแƒ แƒ.. แƒ“แƒฆแƒ” แƒ“แƒฆแƒ”แƒก แƒ›แƒ˜แƒกแƒ“แƒ”แƒ•แƒ“แƒ, แƒ“แƒ แƒ แƒ™แƒ˜ แƒแƒ  แƒฉแƒ”แƒ แƒ“แƒ”แƒ‘แƒแƒ“แƒ  - แƒขแƒแƒ›แƒ™แƒแƒขแƒ˜ แƒงแƒ•แƒ”แƒšแƒแƒœแƒแƒ˜แƒ แƒแƒ“ แƒชแƒ“แƒ˜แƒšแƒแƒ‘แƒ“แƒ แƒ›แƒแƒฅแƒกแƒ˜แƒ›แƒแƒšแƒฃแƒ แƒแƒ“ แƒฉแƒฅแƒแƒ แƒ˜ แƒคแƒฃแƒšแƒ˜แƒœแƒ’แƒ˜ แƒ’แƒแƒ”แƒ™แƒ”แƒ—แƒ”แƒ‘แƒ˜แƒœแƒ แƒ“แƒ แƒแƒ›แƒแƒกแƒแƒช แƒ›แƒ˜แƒแƒฆแƒฌแƒ˜แƒ, แƒแƒ›แƒแƒกแƒแƒ‘แƒแƒจแƒ˜ Commons แƒ›แƒแƒช แƒ’แƒแƒแƒกแƒฌแƒแƒ แƒ แƒ—แƒแƒ•แƒ˜แƒกแƒ˜ แƒžแƒ แƒแƒ‘แƒšแƒ”แƒ›แƒ”แƒ‘แƒ˜ แƒ“แƒ แƒ“แƒแƒแƒคแƒแƒ‘แƒšแƒ˜แƒจแƒ แƒแƒฎแƒแƒšแƒ˜ แƒ•แƒ”แƒ แƒกแƒ˜แƒ...  แƒกแƒแƒ‘แƒแƒšแƒแƒแƒ“ แƒแƒกแƒ” แƒ›แƒ˜แƒ•แƒ˜แƒฆแƒ”แƒ— tomcat แƒ˜แƒก แƒแƒšแƒขแƒ”แƒ แƒœแƒแƒขแƒ˜แƒฃแƒšแƒ˜ แƒคแƒฃแƒšแƒ˜แƒœแƒ’ แƒกแƒ˜แƒกแƒขแƒ”แƒ›แƒ, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒก แƒฌแƒ˜แƒœแƒ แƒžแƒ˜แƒ แƒแƒ‘แƒ แƒ แƒแƒ—แƒฅแƒ›แƒแƒฃแƒœแƒ“แƒ common แƒ˜แƒก dbcp แƒ˜แƒงแƒ... แƒแƒฎแƒแƒšแƒ˜ แƒ“แƒ แƒ’แƒแƒœแƒกแƒฎแƒ•แƒแƒ•แƒ”แƒ‘แƒฃแƒšแƒ˜, แƒ›แƒแƒ แƒ’แƒ”แƒ‘แƒฃแƒšแƒ˜ แƒงแƒ•แƒ”แƒšแƒแƒœแƒแƒ”แƒ แƒแƒ“ แƒกแƒ”แƒ แƒ•แƒ”แƒ ...


Spring แƒจแƒ˜ แƒ แƒแƒ›แƒ“แƒ”แƒœแƒ˜แƒ›แƒ” แƒขแƒ˜แƒžแƒ˜แƒก data source แƒจแƒ”แƒ’แƒ•แƒ˜แƒซแƒšแƒ˜แƒ แƒแƒ•แƒฆแƒฌแƒ”แƒ แƒแƒ—, แƒงแƒ•แƒ”แƒšแƒ org.springframework.jdbc.datasource แƒžแƒแƒ™แƒ”แƒขแƒจแƒ˜แƒ.

1. DriverManagerDataSource - แƒงแƒแƒ•แƒ”แƒš แƒฏแƒ”แƒ แƒ–แƒ”, แƒ แƒแƒ“แƒ”แƒกแƒแƒช แƒฅแƒแƒœแƒ”แƒฅแƒจแƒ”แƒœแƒ˜แƒก แƒ›แƒแƒ—แƒฎแƒแƒ•แƒœแƒ แƒ›แƒแƒฃแƒ•แƒ, แƒแƒ‘แƒ แƒฃแƒœแƒ”แƒ‘แƒก แƒแƒฎแƒแƒš แƒฅแƒแƒœแƒ”แƒฅแƒจแƒ”แƒœแƒก. แƒกแƒแƒ›แƒฌแƒฃแƒฎแƒแƒ แƒแƒ“, pool แƒ˜แƒœแƒ’แƒ˜ แƒแƒ  แƒแƒฅแƒ•แƒก แƒ’แƒแƒ™แƒ”แƒ—แƒ”แƒ‘แƒฃแƒšแƒ˜.

2. SingleConnectionDataSource  - แƒงแƒแƒ•แƒ”แƒš แƒฏแƒ”แƒ แƒ–แƒ” แƒ”แƒ แƒ—แƒ“แƒแƒ˜แƒ’แƒ˜แƒ•แƒ” แƒฅแƒแƒœแƒ”แƒฅแƒจแƒ”แƒœแƒก แƒแƒ‘แƒ แƒฃแƒœแƒ”แƒ‘แƒก.

แƒแƒ แƒ˜แƒ•แƒ”, แƒ–แƒ”แƒ›แƒแƒ— แƒแƒฆแƒฌแƒ”แƒ แƒ˜แƒšแƒ˜, แƒžแƒแƒขแƒแƒ แƒ แƒแƒžแƒšแƒ˜แƒ™แƒแƒชแƒ˜แƒ”แƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก แƒแƒ แƒ˜แƒก แƒ’แƒแƒ—แƒ•แƒšแƒ˜แƒšแƒ˜.

แƒ›แƒแƒ•แƒ˜แƒงแƒ•แƒแƒœแƒแƒ—  แƒ™แƒแƒœแƒคแƒ˜แƒ’แƒฃแƒ แƒแƒชแƒ˜แƒ˜แƒก แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒ˜:

 
     <bean id="dataSource"  class=
      "org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value=
      "oracle.jdbc.driver.OracleDriver" />
        <property name="url" value="${database.url}" /> 
        <property name="username" value="${database.username}" />
        <property name="password" value="${database.password}" />
    </bean> 


 
แƒแƒฎแƒšแƒ แƒ™แƒ˜ แƒขแƒแƒ›แƒ™แƒแƒขแƒ˜แƒก แƒคแƒฃแƒšแƒ˜แƒœแƒ’ แƒ›แƒ”แƒฅแƒแƒœแƒ˜แƒ–แƒ›แƒ–แƒ” แƒ’แƒแƒ“แƒแƒ•แƒ˜แƒ“แƒ”แƒ—, แƒ แƒแƒ›แƒ”แƒšแƒ–แƒ”แƒช แƒ–แƒ”แƒ›แƒแƒ— แƒ•แƒกแƒแƒฃแƒ‘แƒ แƒแƒ‘แƒ“แƒ˜แƒ—. แƒ›แƒ” แƒ™แƒแƒœแƒ™แƒ แƒ”แƒขแƒฃแƒšแƒแƒ“ Oracle-แƒก แƒ•แƒฃแƒ™แƒแƒ•แƒจแƒ˜แƒ แƒ“แƒ”แƒ‘แƒ˜, แƒ“แƒ แƒ™แƒแƒœแƒ™แƒ แƒ”แƒขแƒฃแƒšแƒ˜ แƒ™แƒแƒœแƒคแƒ˜แƒ’แƒฃแƒ แƒแƒชแƒ˜แƒ”แƒ‘แƒ˜แƒก แƒ›แƒœแƒ˜แƒจแƒ•แƒœแƒ”แƒšแƒแƒ‘แƒ”แƒ‘แƒ˜ .properties แƒคแƒแƒ˜แƒšแƒจแƒ˜ แƒ›แƒแƒฅแƒ•แƒก แƒ’แƒแƒฌแƒ”แƒ แƒ˜แƒšแƒ˜.

     <bean id="dataSource" class=
      "org.apache.tomcat.jdbc.pool.DataSource" 
      destroy-method="close">
        <property name="initialSize" value="${database.initialSize}" />
        <property name="maxActive" value="${database.maxActive}" />
        <property name="maxIdle" value="${database.maxIdle}" />
        <property name="minIdle" value="${database.minIdlel}" />
         <property name="driverClassName" 
      value="oracle.jdbc.driver.OracleDriver" />
        <property name="url" value="${database.url}" /> 
        <property name="username" value="${database.username}" />
        <property name="password" value="${database.password}" />
     </bean>





แƒงแƒ•แƒ”แƒšแƒแƒ”แƒคแƒ แƒ˜ แƒซแƒแƒšแƒ˜แƒแƒœ แƒ™แƒแƒ แƒ’แƒแƒ“แƒแƒ, แƒ—แƒฃแƒ›แƒชแƒ แƒแƒ  แƒ“แƒแƒ’แƒแƒ•แƒ˜แƒฌแƒงแƒ“แƒ”แƒ— แƒ‘แƒแƒ–แƒ˜แƒก แƒ˜แƒก แƒ™แƒแƒœแƒคแƒ˜แƒ’แƒฃแƒ แƒแƒชแƒ˜แƒ. Pool แƒ˜แƒก แƒ’แƒแƒ™แƒ”แƒ—แƒ”แƒ‘แƒ แƒ™แƒแƒ แƒ’แƒ˜แƒ แƒ›แƒแƒ’แƒ แƒแƒ› แƒ‘แƒแƒ–แƒแƒกแƒแƒช แƒฃแƒœแƒ“แƒ แƒจแƒ”แƒ”แƒซแƒšแƒแƒก แƒ แƒ”แƒฅแƒฃแƒ”แƒกแƒ—แƒ”แƒ‘แƒ˜แƒก แƒ›แƒ˜แƒฆแƒ”แƒ‘แƒ.

แƒžแƒ แƒ˜แƒ›แƒ˜แƒขแƒ˜แƒฃแƒš แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒก แƒ›แƒแƒ•แƒ˜แƒงแƒ•แƒแƒœ, Oracle-แƒก แƒจแƒ”แƒ›แƒ—แƒฎแƒ•แƒ”แƒ•แƒแƒจแƒ˜.  แƒจแƒ”แƒแƒ›แƒแƒฌแƒ›แƒ”แƒ— แƒ‘แƒแƒ–แƒแƒก แƒ แƒแƒ›แƒ“แƒ”แƒœแƒ˜ แƒžแƒ แƒแƒชแƒ”แƒกแƒ˜แƒก แƒ“แƒแƒ›แƒฃแƒจแƒแƒ•แƒ”แƒ‘แƒ แƒจแƒ”แƒฃแƒซแƒšแƒ˜แƒ แƒแƒœ job_queue_processes แƒ แƒแƒ›แƒ“แƒ”แƒœแƒ˜ แƒ’แƒแƒฅแƒ•แƒ— แƒ›แƒ˜แƒ—แƒ˜แƒ—แƒ”แƒ‘แƒฃแƒšแƒ˜.

show parameter processes;

NAME                       TYPE        VALUE      
------------------------------------------- 
aq_tm_processes            integer     0          
db_writer_processes        integer     1          
gcs_server_processes       integer     0          
global_txn_processes       integer     1          
job_queue_processes        integer     5       
log_archive_max_processes  integer     4          
processes                  integer     10       



แƒจแƒ”แƒ’แƒ˜แƒซแƒšแƒ˜แƒแƒ— แƒจแƒ”แƒชแƒ•แƒแƒšแƒแƒ— แƒ›แƒœแƒ˜แƒจแƒ•แƒœแƒ”แƒšแƒแƒ‘แƒ”แƒ‘แƒ˜ (แƒ”แƒก แƒ“แƒแƒ›แƒแƒ™แƒ˜แƒ“แƒ”แƒ‘แƒฃแƒšแƒ˜แƒ แƒ—แƒฅแƒ•แƒ”แƒœแƒ˜ แƒแƒžแƒšแƒ˜แƒ™แƒแƒชแƒ˜แƒ˜แƒก แƒขแƒ˜แƒžแƒ–แƒ”, แƒ—แƒฃ แƒ แƒแƒ’แƒแƒ แƒ˜ แƒ“แƒแƒขแƒ•แƒ˜แƒ แƒขแƒ•แƒ แƒ”แƒฅแƒœแƒ”แƒ‘แƒ แƒ‘แƒแƒ–แƒแƒกแƒ—แƒแƒœ แƒ›แƒ˜แƒ›แƒแƒ แƒ—แƒ”แƒ‘แƒแƒจแƒ˜):
ALTER SYSTEM SET processes=2000 SCOPE=SPFILE;

ALTER SYSTEM SET job_queue_processes=1000 scope=both;

แƒž.แƒก แƒ‘แƒแƒšแƒ แƒแƒ แƒ˜ ALTER แƒ˜แƒก แƒจแƒ”แƒ›แƒ“แƒ”แƒ’ แƒกแƒ”แƒ แƒ•แƒ”แƒ แƒ˜แƒก แƒ แƒ”แƒกแƒขแƒแƒ แƒขแƒ˜ แƒแƒ  แƒ“แƒแƒ’แƒแƒ•แƒ˜แƒฌแƒงแƒ“แƒ”แƒ— :)

Monday, October 27, 2014

JIT -server || -client

แƒฃแƒ™แƒ•แƒ” แƒฆแƒแƒ›แƒ˜แƒก แƒแƒ—แƒฎแƒ˜ แƒกแƒแƒแƒ—แƒ แƒ“แƒ แƒแƒ‘แƒ˜แƒ”แƒฅแƒขแƒฃแƒ แƒ˜ แƒ›แƒ˜แƒ–แƒ”แƒ–แƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒ›แƒ แƒฏแƒ”แƒ แƒแƒช แƒแƒ  แƒ›แƒซแƒ˜แƒœแƒแƒ•แƒก. แƒกแƒแƒœแƒแƒ› แƒฉแƒ”แƒ› แƒคแƒฃแƒ›แƒคแƒฃแƒšแƒ แƒ‘แƒแƒšแƒ˜แƒจแƒ–แƒ” แƒ—แƒแƒ•แƒก แƒ“แƒแƒ•แƒ“แƒ”แƒ‘แƒ“แƒ˜,  แƒ’แƒแƒ“แƒแƒ•แƒฌแƒงแƒ•แƒ˜แƒขแƒ”, แƒแƒ แƒช แƒ›แƒ”แƒขแƒ˜ แƒแƒ แƒช แƒœแƒแƒ™แƒšแƒ”แƒ‘แƒ˜ 2-3 แƒฌแƒฃแƒ—แƒ˜ แƒ“แƒแƒ›แƒ”แƒ—แƒ›แƒ แƒแƒ› แƒกแƒขแƒแƒขแƒ˜แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก. แƒฃแƒซแƒ˜แƒœแƒแƒ แƒ˜แƒก แƒ™แƒ•แƒแƒšแƒแƒ‘แƒแƒ–แƒ”, แƒ’แƒ แƒแƒ›แƒแƒขแƒ˜แƒ™แƒฃแƒš แƒจแƒ”แƒชแƒ“แƒแƒ›แƒ”แƒ‘แƒก แƒ—แƒฃ แƒจแƒ”แƒแƒ›แƒฉแƒœแƒ”แƒ•แƒ—, แƒแƒ  แƒ’แƒแƒ˜แƒ™แƒ•แƒ˜แƒ แƒ•แƒแƒ—. :)

แƒแƒšแƒ‘แƒแƒ— แƒ’แƒ”แƒฅแƒœแƒ”แƒ‘แƒแƒ— แƒœแƒแƒœแƒแƒฎแƒ˜ แƒแƒžแƒšแƒ˜แƒ™แƒแƒชแƒ˜แƒ”แƒ‘แƒ˜, แƒ แƒแƒ›แƒšแƒ”แƒ‘แƒ˜แƒช แƒ’แƒแƒจแƒ•แƒ”แƒ‘แƒฃแƒšแƒ˜ แƒแƒ แƒ˜แƒแƒœ JVM แƒ˜แƒก แƒจแƒ”แƒ›แƒ“แƒ”แƒ’แƒ˜ แƒžแƒแƒ แƒแƒ›แƒ”แƒขแƒ แƒ˜แƒ—: "-server" แƒแƒœ "-client".



แƒแƒ แƒ˜แƒ•แƒ” แƒจแƒ”แƒ›แƒ—แƒฎแƒ•แƒ”แƒ•แƒแƒจแƒ˜, แƒ•แƒ˜แƒงแƒ”แƒœแƒ”แƒ‘แƒ— แƒฉแƒ•แƒ”แƒœ -server  แƒ—แƒฃ client แƒžแƒแƒ แƒแƒ›แƒ”แƒขแƒ แƒก,  JVM แƒ˜แƒฅแƒชแƒ”แƒ•แƒ แƒกแƒฎแƒ•แƒแƒ“แƒแƒกแƒฎแƒ•แƒแƒœแƒแƒ’แƒ•แƒแƒ แƒแƒ“. -server แƒ˜แƒก แƒ“แƒ แƒแƒก JVM แƒ›แƒ”แƒข แƒแƒžแƒขแƒ˜แƒ›แƒ˜แƒ–แƒแƒชแƒ˜แƒแƒก แƒแƒœแƒฎแƒแƒ แƒชแƒ˜แƒ”แƒšแƒ”แƒ‘แƒก (JIT แƒ–แƒ” แƒ•แƒกแƒแƒฃแƒ‘แƒ แƒแƒ‘ แƒแƒฅ), แƒแƒžแƒšแƒ˜แƒ™แƒแƒชแƒ˜แƒ˜แƒก แƒ“แƒแƒกแƒขแƒแƒ แƒขแƒ•แƒ˜แƒก แƒ“แƒ แƒ แƒชแƒแƒขแƒ แƒœแƒ”แƒšแƒ˜แƒ แƒ—แƒฃแƒ›แƒชแƒ แƒกแƒแƒ‘แƒแƒšแƒแƒ แƒฏแƒแƒ›แƒจแƒ˜ แƒ›แƒ”แƒขแƒแƒ“ แƒแƒžแƒขแƒ˜แƒ›แƒ˜แƒ–แƒ˜แƒ แƒ”แƒ‘แƒฃแƒšแƒ˜ แƒจแƒ”แƒ“แƒ”แƒ’แƒ˜ แƒ›แƒ˜แƒ˜แƒฆแƒ”แƒ‘แƒ. -client แƒจแƒ”แƒ›แƒ—แƒฎแƒ•แƒ”แƒ•แƒแƒจแƒ˜ แƒ™แƒ˜ แƒ›แƒกแƒฃแƒ‘แƒฃแƒฅแƒแƒ“ แƒฃแƒ™แƒ”แƒ—แƒ”แƒ‘แƒก แƒแƒžแƒขแƒ˜แƒ›แƒ˜แƒ–แƒแƒชแƒ˜แƒแƒก แƒ™แƒแƒ“แƒ˜แƒก แƒ˜แƒกแƒ”แƒ— แƒœแƒแƒฌแƒ˜แƒšแƒ”แƒ‘แƒก แƒกแƒแƒ“แƒแƒช JVM-แƒก แƒ›แƒ”แƒขแƒแƒ“  แƒ›แƒซแƒ˜แƒ›แƒ”, แƒ“แƒแƒขแƒ•แƒฃแƒ แƒ—แƒฃแƒšแƒ˜, แƒ›แƒฃแƒจแƒแƒแƒ‘แƒ แƒญแƒ˜แƒ แƒ“แƒ”แƒ‘แƒ.

แƒแƒ แƒ˜แƒ•แƒ”แƒก แƒคแƒšแƒแƒ’แƒก แƒ—แƒแƒ•แƒ˜แƒกแƒ˜ แƒแƒ“แƒ’แƒ˜แƒšแƒ˜ แƒ“แƒ แƒ›แƒ˜แƒ–แƒแƒœแƒ˜ แƒแƒฅแƒ•แƒก. แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒแƒ“, แƒ แƒแƒ“แƒ”แƒกแƒแƒช แƒ แƒแƒ˜แƒ›แƒ” แƒกแƒ”แƒ แƒ•แƒ”แƒ แƒก แƒ•แƒกแƒขแƒแƒ แƒขแƒแƒ•แƒ—, แƒแƒฃแƒชแƒ˜แƒšแƒ”แƒ‘แƒšแƒแƒ“ -server แƒžแƒแƒ แƒแƒ›แƒ”แƒขแƒ แƒ˜ แƒฃแƒœแƒ“แƒ แƒ’แƒแƒ›แƒแƒ•แƒ˜แƒงแƒ”แƒœแƒแƒ—. แƒแƒ›แƒแƒก แƒ‘แƒ”แƒ•แƒ แƒ˜ แƒ›แƒ˜แƒ–แƒ”แƒ–แƒ˜ แƒแƒฅแƒ•แƒก. แƒ”แƒ แƒ—แƒ”แƒ แƒ—แƒ แƒ˜แƒก, แƒ แƒแƒ› แƒกแƒ”แƒ แƒ•แƒ”แƒ แƒ˜แƒก แƒ“แƒแƒกแƒขแƒแƒ แƒขแƒ•แƒ˜แƒก แƒ“แƒ แƒแƒ–แƒ” แƒ›แƒ”แƒขแƒแƒ“, แƒฉแƒ•แƒ”แƒœแƒ—แƒ•แƒ˜แƒก แƒ›แƒœแƒ˜แƒจแƒ•แƒœแƒ”แƒšแƒแƒ•แƒแƒœแƒ˜แƒ แƒกแƒ”แƒ แƒ•แƒ”แƒ แƒ˜แƒก แƒกแƒแƒ‘แƒแƒšแƒแƒ แƒฉแƒฅแƒแƒ แƒ˜ แƒ›แƒฃแƒจแƒแƒแƒ‘แƒ. แƒ แƒแƒช แƒจแƒ”แƒ”แƒฎแƒ”แƒ‘แƒ -client-แƒก แƒ˜แƒก แƒจแƒ”แƒ˜แƒšแƒ”แƒ‘แƒ แƒ’แƒแƒ›แƒแƒ•แƒ˜แƒงแƒ”แƒœแƒแƒ—, แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒแƒ“ GUI แƒแƒžแƒšแƒ˜แƒ™แƒแƒชแƒ˜แƒ˜แƒก แƒ’แƒแƒกแƒแƒจแƒ•แƒ”แƒ‘แƒแƒ“ - แƒ”แƒจแƒ•แƒ”แƒ‘แƒ แƒกแƒฌแƒ แƒแƒคแƒแƒ“ แƒ“แƒ แƒกแƒแƒ›แƒฃแƒ“แƒแƒ›แƒแƒ“แƒแƒช แƒแƒ  แƒ˜แƒฅแƒœแƒ”แƒ‘แƒ แƒ“แƒแƒกแƒขแƒแƒ แƒขแƒฃแƒšแƒ˜.

แƒจแƒ”แƒœแƒ˜แƒจแƒ•แƒœแƒ Thread Visibility -แƒ–แƒ”  แƒฌแƒ˜แƒœแƒ แƒ”แƒ แƒ—แƒ”แƒ แƒ— แƒกแƒขแƒแƒขแƒ˜แƒแƒจแƒ˜ (แƒจแƒ”แƒ’แƒ˜แƒซแƒšแƒ˜แƒแƒ— แƒ’แƒแƒฎแƒกแƒแƒ— lazy init, dc locking, volatile) แƒ“แƒแƒ•แƒฌแƒ”แƒ แƒ” Volatile-แƒชแƒ•แƒšแƒแƒ“แƒ”แƒ‘แƒ˜แƒก แƒกแƒžแƒ”แƒชแƒ˜แƒคแƒ˜แƒฃแƒ  แƒฅแƒชแƒ”แƒ•แƒแƒ–แƒ”.  แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒ˜ แƒ˜แƒงแƒ แƒจแƒ”แƒ›แƒ“แƒ”แƒ’แƒ˜: แƒ’แƒ•แƒแƒฅแƒ•แƒก 2 แƒกแƒ แƒ”แƒ“แƒ˜, แƒžแƒ˜แƒ แƒ•แƒ”แƒšแƒ˜ แƒœแƒแƒ™แƒแƒ“แƒ˜ แƒฃแƒงแƒฃแƒ แƒ”แƒ‘แƒก whilte(flag){}-แƒก แƒ›แƒ”แƒแƒ แƒ” แƒ™แƒ˜ flag แƒ–แƒ” แƒแƒฎแƒ“แƒ”แƒœแƒก แƒ›แƒแƒ“แƒ˜แƒคแƒ˜แƒชแƒ˜แƒ แƒ”แƒ‘แƒแƒก -แƒ›แƒœแƒ˜แƒจแƒ•แƒœแƒ”แƒšแƒแƒ‘แƒแƒก แƒฃแƒชแƒ•แƒšแƒ˜แƒก แƒ˜แƒกแƒ” แƒ แƒแƒ› แƒชแƒ˜แƒ™แƒšแƒ˜ แƒ’แƒแƒแƒฉแƒ”แƒ แƒแƒก.  แƒ”แƒ แƒ— แƒจแƒ”แƒ›แƒ—แƒฎแƒ•แƒ”แƒ•แƒแƒจแƒ˜ flag แƒแƒ แƒ˜แƒก volatile แƒ›แƒ”แƒแƒ แƒ”แƒจแƒ˜ แƒ™แƒ˜ แƒฃแƒ‘แƒ แƒแƒšแƒแƒ“ แƒ›แƒแƒ แƒขแƒ˜แƒ•แƒ˜, แƒ™แƒแƒขแƒฎแƒขแƒ, แƒšแƒแƒ›แƒแƒ–แƒ˜ แƒ“แƒ แƒ›แƒจแƒ•แƒ”แƒœแƒ˜แƒ”แƒ แƒ˜ boolean - แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒ—แƒแƒ•แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก แƒแƒ แƒ˜แƒก แƒ“แƒ แƒแƒ แƒ˜แƒก, แƒชแƒฎแƒแƒ•แƒ แƒแƒ‘แƒก แƒ—แƒแƒ•แƒ˜แƒก แƒ—แƒ‘แƒ˜แƒš แƒกแƒแƒฎแƒšแƒจแƒ˜, heap แƒแƒ“ แƒฌแƒแƒ“แƒ”แƒ‘แƒฃแƒšแƒจแƒ˜.

แƒฌแƒแƒ แƒ›แƒแƒ•แƒ˜แƒ“แƒ’แƒ˜แƒœแƒแƒ—,  แƒ–แƒ”แƒ›แƒแƒ— แƒแƒฆแƒœแƒ˜แƒจแƒœแƒฃแƒšแƒ˜ แƒ™แƒแƒ“แƒ˜ แƒฌแƒ”แƒ แƒ˜แƒ แƒ”แƒ แƒ—แƒ”แƒ แƒ— แƒแƒžแƒšแƒ˜แƒ™แƒแƒชแƒ˜แƒแƒจแƒ˜ แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒ’แƒแƒจแƒ•แƒ”แƒ‘แƒฃแƒšแƒ˜แƒ แƒกแƒ”แƒ แƒ•แƒ”แƒ แƒ–แƒ” - Tomcat แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒแƒ“, แƒแƒœ Jetty (แƒ”แƒก แƒฃแƒ™แƒแƒœแƒแƒกแƒ™แƒœแƒ”แƒšแƒ˜ แƒซแƒแƒšแƒ˜แƒแƒœ แƒ™แƒแƒ แƒ’แƒ˜ แƒ‘แƒ˜แƒญแƒ˜แƒ asynchronous แƒ แƒ”แƒฅแƒฃแƒ”แƒกแƒ—แƒ”แƒ‘แƒ˜แƒก แƒ“แƒแƒ›แƒฃแƒจแƒแƒ•แƒ”แƒ‘แƒแƒจแƒ˜). แƒฉแƒ•แƒ”แƒœ แƒฃแƒ™แƒ•แƒ” แƒ•แƒ˜แƒชแƒ˜แƒ— แƒ แƒแƒ›, แƒ แƒแƒ› แƒกแƒ”แƒ แƒ•แƒ”แƒ  แƒแƒžแƒšแƒ˜แƒ™แƒแƒชแƒ˜แƒ”แƒ‘แƒ˜ แƒงแƒแƒ•แƒ”แƒšแƒ—แƒ•แƒ˜แƒก แƒฃแƒœแƒ“แƒ แƒ˜แƒงแƒ•แƒœแƒ”แƒœ แƒ“แƒแƒกแƒขแƒแƒ แƒขแƒฃแƒšแƒ”แƒ‘แƒ˜  -server แƒ‘แƒ แƒซแƒแƒœแƒ”แƒ‘แƒ˜แƒ—. แƒ›แƒแƒ’แƒ แƒแƒ› Oops! -server  แƒ˜แƒก แƒฌแƒงแƒแƒšแƒแƒ‘แƒ˜แƒ— , แƒฃแƒคแƒ แƒ แƒ™แƒ˜ แƒ›แƒ˜แƒกแƒ˜ แƒแƒžแƒขแƒ˜แƒ›แƒ˜แƒ–แƒแƒชแƒ—, JVM แƒ›แƒ แƒจแƒ”แƒกแƒแƒซแƒšแƒแƒ แƒชแƒ˜แƒ™แƒšแƒจแƒ˜ แƒแƒ แƒกแƒ”แƒ‘แƒฃแƒšแƒ˜ แƒแƒ แƒแƒ›แƒแƒ“แƒ˜แƒคแƒ˜แƒชแƒ˜แƒ แƒ”แƒ‘แƒแƒ“แƒ˜ แƒชแƒ•แƒšแƒแƒ“แƒ”แƒ‘แƒ˜แƒกแƒแƒ“แƒ›แƒ˜ แƒฎแƒ”แƒ“แƒ•แƒ˜แƒก แƒแƒ แƒ˜แƒแƒšแƒ˜ แƒ’แƒแƒ“แƒแƒ˜แƒขแƒแƒœแƒแƒก แƒชแƒ˜แƒ™แƒšแƒ˜แƒก แƒ’แƒแƒ แƒ”แƒ— - แƒฃแƒคแƒ แƒ แƒ’แƒแƒกแƒแƒ’แƒ”แƒ‘แƒ˜ แƒ แƒแƒ› แƒ˜แƒงแƒแƒก, แƒชแƒ˜แƒ™แƒšแƒ˜แƒก แƒจแƒ˜แƒ’แƒœแƒ˜แƒ— แƒแƒ  แƒฎแƒ“แƒ”แƒ‘แƒ flag แƒ›แƒœแƒ˜แƒจแƒ•แƒœแƒ”แƒšแƒแƒ‘แƒ˜แƒก แƒจแƒ”แƒชแƒ•แƒšแƒ, แƒแƒ›แƒแƒœ แƒ™แƒ˜ แƒจแƒ”แƒกแƒแƒซแƒšแƒแƒ JVM แƒ“แƒแƒแƒ แƒฌแƒ›แƒฃแƒœแƒ˜แƒก, แƒ แƒแƒ› แƒแƒžแƒขแƒ˜แƒ›แƒ˜แƒ–แƒแƒชแƒ˜แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก แƒฎแƒ”แƒ“แƒ•แƒ˜แƒก แƒแƒ แƒ”แƒแƒšแƒ˜ แƒจแƒ”แƒชแƒ•แƒแƒšแƒแƒก. แƒ’แƒ˜แƒšแƒแƒชแƒแƒ•แƒ—, แƒ”แƒก แƒแƒ แƒ˜แƒก แƒฃแƒกแƒแƒกแƒ แƒฃแƒšแƒ แƒชแƒ˜แƒ™แƒšแƒ˜!  แƒจแƒ”แƒ“แƒ”แƒ’แƒแƒ“,   แƒจแƒ”แƒกแƒแƒซแƒšแƒแƒ แƒ™แƒแƒ“แƒ›แƒ แƒ˜แƒ›แƒฃแƒจแƒแƒแƒก -client แƒ’แƒแƒ แƒ”แƒ›แƒแƒจแƒ˜, แƒ“แƒ แƒแƒ  แƒ˜แƒ›แƒฃแƒจแƒแƒแƒก -server แƒจแƒ˜. แƒ“แƒ”แƒ‘แƒแƒ’แƒ˜แƒ แƒ”แƒ‘แƒ˜แƒก แƒ“แƒ แƒแƒกแƒแƒช แƒ—แƒฃ  -server-แƒก แƒ’แƒแƒ›แƒแƒ•แƒ˜แƒงแƒ”แƒœแƒ”แƒ‘แƒ—, แƒžแƒ แƒแƒ“แƒแƒฅแƒจแƒ”แƒœแƒ–แƒ” แƒ“แƒแƒ“แƒ”แƒ‘แƒแƒ›แƒ“แƒ”, แƒแƒ›แƒ˜แƒ— แƒจแƒ”แƒ›แƒ“แƒ”แƒ’แƒ˜ แƒขแƒ˜แƒžแƒ˜แƒก แƒ’แƒแƒŸแƒแƒœแƒ•แƒ”แƒ‘แƒก แƒ—แƒแƒ•แƒ˜แƒ“แƒแƒœ แƒแƒ•แƒ˜แƒชแƒ˜แƒšแƒ”แƒ‘แƒ— - แƒขแƒ”แƒกแƒขแƒ˜แƒ แƒ”แƒ‘แƒ˜แƒก แƒ“แƒ แƒแƒกแƒ•แƒ” แƒ“แƒแƒ•แƒ˜แƒญแƒ”แƒ แƒ— แƒจแƒ”แƒชแƒ“แƒแƒ›แƒแƒก.


แƒแƒžแƒขแƒ˜แƒ›แƒ˜แƒ–แƒแƒชแƒ˜แƒ แƒแƒ›แƒแƒกแƒ—แƒแƒœ แƒ’แƒฃแƒšแƒ˜แƒกแƒฎแƒ›แƒแƒ‘แƒก แƒแƒ แƒแƒ›แƒแƒ แƒขแƒ แƒกแƒฎแƒ•แƒแƒ“แƒแƒกแƒฎแƒ•แƒ แƒแƒšแƒ’แƒแƒ แƒ˜แƒ—แƒ›แƒ˜แƒก แƒ—แƒ•แƒแƒšแƒ˜แƒ— แƒ“แƒแƒ›แƒฃแƒจแƒแƒ•แƒ”แƒ‘แƒฃแƒš แƒ™แƒแƒ“แƒ˜แƒก แƒœแƒแƒฌแƒ˜แƒšแƒ”แƒ‘แƒก, แƒแƒ แƒแƒ›แƒ”แƒ“ แƒ›แƒ”แƒฎแƒกแƒ˜แƒแƒ แƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒ›แƒแƒงแƒแƒคแƒ˜แƒก แƒกแƒฎแƒ•แƒแƒ“แƒแƒกแƒฎแƒ•แƒ แƒ›แƒ”แƒฅแƒแƒœแƒ˜แƒ–แƒ›แƒ”แƒ‘แƒกแƒแƒช, JVM แƒ˜แƒก แƒ›แƒ˜แƒ”แƒ  แƒ’แƒแƒœแƒกแƒฎแƒ•แƒแƒ•แƒ”แƒ‘แƒฃแƒš แƒ“แƒแƒ›แƒแƒ™แƒ˜แƒ“แƒ”แƒ‘แƒฃแƒšแƒ”แƒ‘แƒแƒก gc-แƒก แƒ›แƒ˜แƒ›แƒแƒ แƒ—, แƒ“แƒ แƒแƒกแƒ” แƒจแƒ”แƒ›แƒ“แƒ”แƒ’.


Friday, October 10, 2014

NoSQL 'n CAP


 NoSQL แƒ›แƒแƒ˜แƒชแƒแƒ•แƒก แƒ˜แƒกแƒ”แƒ— แƒ‘แƒแƒ–แƒ”แƒ‘แƒก แƒ แƒแƒ’แƒแƒ แƒ”แƒ‘แƒ˜แƒชแƒแƒ: Mongo, Neoj4, Cassandra, Riak, Hadoop (HDFS แƒฎแƒแƒšแƒ แƒ แƒ”แƒแƒš แƒ—แƒแƒ˜แƒ› แƒ‘แƒแƒ–แƒ HBase) แƒ“แƒ แƒแƒกแƒ” แƒจแƒ”แƒ›แƒ“แƒ”แƒ’, แƒ˜แƒกแƒ˜แƒœแƒ˜ แƒ”แƒ แƒ—แƒ›แƒแƒœแƒ”แƒ—แƒ˜แƒกแƒ’แƒแƒœ แƒกแƒขแƒ แƒฃแƒฅแƒขแƒฃแƒ แƒฃแƒšแƒแƒ“ แƒ’แƒแƒœแƒกแƒฎแƒ•แƒแƒ•แƒ“แƒ”แƒ‘แƒ˜แƒแƒœ (แƒฐแƒแƒ“แƒฃแƒžแƒ˜แƒก แƒ”แƒ™แƒ แƒกแƒ˜แƒกแƒขแƒ”แƒ›แƒแƒ–แƒ” แƒกแƒฎแƒ•แƒ แƒ“แƒ แƒแƒก แƒ“แƒ”แƒขแƒแƒšแƒฃแƒ แƒแƒ“ แƒ•แƒ˜แƒกแƒแƒฃแƒ‘แƒ แƒ”แƒ‘). แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒแƒ“ แƒแƒ แƒกแƒ”แƒ‘แƒแƒ‘แƒก, แƒ’แƒ แƒแƒคแƒ”แƒ‘แƒ–แƒ” แƒแƒ’แƒ”แƒ‘แƒฃแƒšแƒ˜ แƒ‘แƒแƒ–แƒ”แƒ‘แƒ˜ (Neo4j), Key Value แƒกแƒขแƒ แƒฃแƒฅแƒขแƒฃแƒ แƒ˜แƒก แƒ›แƒฅแƒแƒœแƒ”แƒœแƒ˜ (Cassandra, Redis), Mongo แƒกแƒ แƒ“แƒ CouchDB– แƒจแƒ˜ แƒ“แƒแƒ™แƒฃแƒ›แƒ”แƒœแƒขแƒ”แƒ‘แƒ˜แƒก แƒจแƒ”แƒœแƒแƒฎแƒ•แƒ JSON แƒแƒ‘แƒ˜แƒ”แƒฅแƒขแƒ”แƒ‘แƒ˜แƒ— แƒฎแƒ“แƒ”แƒ‘แƒ

แƒกแƒแƒ‘แƒแƒšแƒแƒแƒ“, แƒ›แƒแƒ—แƒจแƒ˜ แƒ˜แƒœแƒแƒฎแƒ”แƒ‘แƒ แƒฃแƒกแƒฅแƒ”แƒ›แƒ แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ”แƒ‘แƒ˜*, แƒแƒ“แƒ•แƒ˜แƒšแƒ˜แƒ แƒ›แƒแƒ—แƒ˜ แƒ“แƒแƒ™แƒšแƒแƒกแƒขแƒ”แƒ แƒ”แƒ‘แƒ, แƒ”แƒก แƒกแƒ˜แƒกแƒขแƒ”แƒ›แƒ”แƒ‘แƒ˜ แƒ’แƒแƒ›แƒแƒ˜แƒ แƒฉแƒ”แƒ•แƒ˜แƒแƒœ แƒ“แƒ˜แƒ“แƒ˜ แƒกแƒ˜แƒกแƒฌแƒ แƒแƒคแƒ˜แƒ— แƒ“แƒ แƒแƒ›แƒแƒ แƒขแƒ˜แƒ•แƒ”แƒ‘แƒ”แƒœ แƒแƒ›แƒแƒชแƒแƒœแƒ˜แƒก แƒ’แƒแƒ“แƒแƒญแƒ แƒแƒก. NoSQL แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ—แƒ แƒ‘แƒแƒ–แƒ แƒแƒ  แƒ˜แƒงแƒ”แƒœแƒ”แƒ‘แƒก SQL–แƒก, แƒ—แƒฃแƒ›แƒชแƒ แƒ–แƒแƒ’แƒ˜ แƒ›แƒแƒ—แƒ’แƒแƒœแƒ˜ query แƒ”แƒœแƒแƒก แƒ’แƒ•แƒแƒซแƒšแƒ”แƒ•แƒก – แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒแƒ“ Cassandra CQL.

*แƒกแƒ˜แƒขแƒงแƒ•แƒ „แƒฃแƒกแƒฅแƒ”แƒ›แƒ“ แƒฎแƒจแƒ˜แƒ แƒแƒ“ แƒ“แƒแƒ›แƒแƒ‘แƒœแƒ”แƒ•แƒ”แƒšแƒ˜แƒ, แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒแƒ“, แƒ แƒแƒ“แƒ”แƒกแƒแƒช แƒ˜แƒ’แƒ”แƒ‘แƒ”แƒœ, แƒ แƒแƒ› แƒ›แƒแƒœแƒ’แƒแƒก แƒแƒฅแƒ•แƒก แƒ“แƒ˜แƒแƒ›แƒ˜แƒฃแƒ แƒ˜ แƒกแƒฅแƒ”แƒ›แƒ- แƒ›แƒแƒกแƒจแƒ˜ แƒจแƒ”แƒ’แƒ•แƒ˜แƒซแƒšแƒ˜แƒ แƒจแƒ”แƒ•แƒฅแƒ›แƒœแƒแƒ— แƒฅแƒแƒšแƒ”แƒฅแƒจแƒ”แƒœแƒ”แƒ‘แƒ˜ แƒ˜แƒกแƒ” แƒ แƒแƒ› แƒฌแƒ˜แƒœแƒแƒกแƒฌแƒแƒ  แƒกแƒขแƒ แƒฃแƒฅแƒขแƒฃแƒ แƒ แƒแƒ  แƒ’แƒ•แƒฅแƒแƒœแƒ“แƒ”แƒก แƒแƒฆแƒฌแƒ”แƒ แƒšแƒ˜.



แƒ‘แƒแƒ–แƒ”แƒ‘แƒ—แƒแƒœ แƒ›แƒฃแƒจแƒแƒแƒ‘แƒ˜แƒกแƒแƒก แƒจแƒ”แƒกแƒแƒซแƒšแƒแƒ แƒ’แƒ•แƒฅแƒแƒœแƒ“แƒ”แƒก“ network partition”–แƒ”แƒ‘แƒ˜, แƒ แƒแƒ›แƒšแƒ”แƒ‘แƒ˜แƒช แƒ’แƒฃแƒšแƒกแƒ˜แƒฎแƒ›แƒแƒ‘แƒ”แƒœ แƒ™แƒšแƒแƒกแƒขแƒ”แƒ แƒจแƒ˜ แƒœแƒแƒฃแƒ“แƒ”แƒ‘แƒก แƒจแƒแƒ แƒ˜แƒก แƒ™แƒแƒ›แƒฃแƒœแƒ˜แƒ™แƒแƒชแƒ˜แƒ˜แƒก แƒ“แƒแƒ™แƒแƒ แƒ’แƒ•แƒแƒก แƒ“แƒ แƒจแƒ”แƒกแƒแƒ‘แƒแƒ›แƒ˜แƒกแƒแƒ“ แƒ˜แƒœแƒคแƒแƒ แƒ›แƒแƒชแƒ˜แƒ˜แƒก แƒแƒ แƒแƒกแƒ˜แƒœแƒฅแƒ แƒแƒœแƒฃแƒšแƒแƒ‘แƒแƒก.




แƒจแƒ”แƒกแƒแƒ‘แƒแƒ›แƒ˜แƒกแƒแƒ“ แƒ‘แƒแƒ–แƒแƒก แƒงแƒแƒคแƒ”แƒœ แƒจแƒ”แƒ›แƒ“แƒ”แƒ’แƒ˜ แƒขแƒ˜แƒžแƒ”แƒ‘แƒแƒ“, แƒ แƒแƒ›แƒ”แƒšแƒ—แƒแƒ’แƒแƒœ แƒ›แƒฎแƒแƒšแƒแƒ“ 2 แƒจแƒ”แƒ’แƒ•แƒ˜แƒซแƒšแƒ˜แƒ แƒจแƒ”แƒ•แƒ˜แƒœแƒแƒ แƒฉแƒฃแƒœแƒแƒ—.



Consistency (แƒ›แƒฃแƒ“แƒ›แƒ˜แƒ•แƒแƒ‘แƒ) - แƒฉแƒแƒœแƒแƒฌแƒ”แƒ แƒ”แƒ‘แƒ˜ แƒ˜แƒ’แƒ˜แƒ•แƒ”แƒ แƒ™แƒšแƒแƒกแƒขแƒ”แƒ แƒ˜แƒก แƒงแƒ•แƒ”แƒšแƒ node แƒจแƒ˜.
Availability – แƒ—แƒฃ แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒ›แƒ” Node แƒแƒ แƒ˜แƒก แƒฉแƒแƒ•แƒแƒ แƒ“แƒœแƒ˜แƒšแƒ˜, แƒ›แƒแƒ˜แƒœแƒช แƒจแƒ”แƒกแƒแƒซแƒšแƒ”แƒ‘แƒ”แƒšแƒ˜แƒ แƒ™แƒšแƒแƒกแƒขแƒ”แƒ แƒ—แƒแƒœ แƒฌแƒ•แƒ“แƒแƒ›แƒ.
Partition Tolerance – แƒ™แƒšแƒแƒกแƒขแƒ”แƒ แƒ˜ แƒ’แƒแƒœแƒแƒ’แƒ แƒซแƒแƒ‘แƒก แƒคแƒฃแƒœแƒฅแƒชแƒ˜แƒแƒœแƒแƒšแƒแƒ‘แƒแƒก แƒ›แƒแƒจแƒ˜แƒœแƒแƒช แƒ™แƒ˜ แƒ แƒแƒ“แƒ”แƒกแƒแƒช node แƒ”แƒ‘แƒก แƒจแƒแƒ แƒ˜แƒก แƒแƒ แƒ˜แƒก แƒ™แƒแƒ›แƒฃแƒœแƒ˜แƒ™แƒแƒชแƒ˜แƒ˜แƒก แƒžแƒ แƒแƒ‘แƒšแƒ”แƒ›แƒ.

แƒแƒ› แƒกแƒแƒ›แƒ–แƒ” (CAP) แƒ“แƒ”แƒขแƒแƒšแƒฃแƒ  แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒ”แƒ‘แƒก, แƒฅแƒ•แƒ”แƒ›แƒแƒ— แƒ›แƒแƒ•แƒ˜แƒงแƒ•แƒแƒœ.




แƒ แƒแƒ“แƒ”แƒกแƒแƒช แƒ™แƒแƒ›แƒฃแƒœแƒ˜แƒ™แƒแƒชแƒ˜แƒ˜แƒก แƒžแƒ แƒแƒ‘แƒšแƒ”แƒ›แƒแƒ, แƒแƒ แƒฉแƒ”แƒ•แƒแƒœแƒ˜ แƒ’แƒ•แƒแƒฅแƒ•แƒก:

1. แƒแƒœ แƒ“แƒแƒ•แƒฃแƒจแƒ•แƒแƒ— แƒ แƒแƒ› แƒแƒ แƒแƒกแƒ˜แƒœแƒฅแƒ แƒแƒœแƒ˜แƒ แƒ”แƒ‘แƒฃแƒšแƒ˜ แƒ›แƒœแƒแƒชแƒ”แƒ›แƒ”แƒ‘แƒ˜ แƒ˜แƒงแƒ•แƒœแƒ”แƒœ แƒ‘แƒแƒ–แƒแƒจแƒ˜ (แƒ“แƒแƒ•แƒ˜แƒ•แƒ˜แƒฌแƒงแƒแƒ— Consistency)
2. แƒฉแƒแƒ•แƒ—แƒ•แƒแƒšแƒแƒ— แƒ แƒแƒ› แƒ™แƒšแƒแƒกแƒขแƒ”แƒ แƒ˜ แƒ“แƒแƒ–แƒ˜แƒแƒœแƒ“แƒ, แƒแƒœแƒฃ แƒ“แƒแƒ•แƒ˜แƒ•แƒ˜แƒฌแƒงแƒแƒ— Availability

แƒงแƒ•แƒ”แƒšแƒ แƒ™แƒแƒ›แƒ‘แƒ˜แƒœแƒแƒชแƒ˜แƒ แƒแƒกแƒ” แƒ’แƒแƒ›แƒแƒ˜แƒงแƒฃแƒ แƒ”แƒ‘แƒ:
CA แƒ”แƒ แƒ—แƒ˜แƒ“แƒแƒ˜แƒ’แƒ˜แƒ•แƒ” แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ”แƒ‘แƒ˜แƒ แƒงแƒ•แƒ”แƒšแƒ node แƒจแƒ˜. แƒ—แƒฃ แƒ แƒแƒ˜แƒ›แƒ” แƒ™แƒแƒ›แƒฃแƒœแƒ˜แƒ™แƒแƒชแƒ˜แƒ˜แƒก แƒžแƒ แƒแƒ‘แƒšแƒ”แƒ›แƒ แƒ“แƒแƒคแƒ˜แƒฅแƒกแƒ˜แƒ แƒ“แƒ node แƒ”แƒ‘แƒก แƒจแƒแƒ แƒ˜แƒก (partition ), แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ”แƒ‘แƒ˜ แƒ˜แƒฅแƒœแƒ”แƒ‘แƒ แƒแƒ แƒแƒกแƒ˜แƒœแƒฅแƒ แƒแƒœแƒ˜แƒ แƒ”แƒ‘แƒฃแƒšแƒ˜ แƒกแƒแƒœแƒแƒ› แƒžแƒ แƒแƒ‘แƒšแƒ”แƒ›แƒ แƒแƒ  แƒ’แƒแƒ“แƒแƒ˜แƒญแƒ แƒ”แƒ‘แƒ. แƒแƒœแƒฃ node แƒ”แƒ‘แƒก แƒจแƒแƒ แƒ˜แƒก แƒกแƒฎแƒ•แƒแƒ“แƒแƒกแƒฎแƒ•แƒ แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ”แƒ‘แƒ˜ แƒ˜แƒฅแƒœแƒ”แƒ‘แƒ.

CP แƒแƒฅแƒแƒช แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ”แƒ‘แƒ˜ แƒ›แƒฃแƒ“แƒ›แƒ˜แƒ•แƒ˜แƒ แƒงแƒ•แƒ”แƒšแƒ node แƒจแƒ˜. แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒแƒ“, แƒ“แƒแƒคแƒ˜แƒฅแƒกแƒ˜แƒ แƒ“แƒ แƒ“แƒแƒคแƒ˜แƒฅแƒกแƒ˜แƒ แƒ“แƒ แƒ™แƒแƒ›แƒฃแƒœแƒ˜แƒ™แƒแƒชแƒ˜แƒ˜แƒก แƒžแƒ แƒแƒ‘แƒšแƒ”แƒ›แƒ. แƒแƒ› แƒ“แƒ แƒแƒก แƒแƒ แƒแƒกแƒ˜แƒœแƒฅแƒ แƒแƒœแƒฃแƒšแƒ˜ แƒ แƒแƒ› แƒแƒ  แƒ˜แƒงแƒแƒก แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ”แƒ‘แƒ˜ แƒจแƒ”แƒกแƒแƒ‘แƒแƒ›แƒ˜แƒกแƒ˜ node แƒ’แƒแƒฎแƒ“แƒ”แƒ‘แƒ แƒ’แƒแƒฃแƒฅแƒ›แƒ”แƒ‘แƒฃแƒšแƒ˜ แƒแƒœแƒฃ แƒฌแƒแƒ™แƒ˜แƒ—แƒฎแƒ•แƒ/แƒฉแƒแƒฌแƒ”แƒ แƒ แƒ˜แƒฅแƒœแƒ”แƒ‘แƒ แƒ’แƒแƒฉแƒ”แƒ แƒ”แƒ‘แƒฃแƒšแƒ˜ แƒจแƒ”แƒกแƒแƒ‘แƒแƒ›แƒ˜แƒก node แƒจแƒ˜. แƒแƒฅ แƒ—แƒแƒ•แƒ˜ แƒ’แƒ•แƒแƒฅ แƒ“แƒแƒชแƒฃแƒšแƒ˜ แƒ˜แƒ›แƒ˜แƒกแƒ’แƒแƒœ แƒ แƒแƒ› แƒกแƒฎแƒ•แƒแƒ“แƒแƒกแƒฎแƒ•แƒ แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ”แƒ‘แƒ˜ แƒแƒ  แƒ’แƒ•แƒ”แƒฌแƒ”แƒ แƒแƒก แƒ‘แƒแƒ–แƒแƒจแƒ˜.

AP แƒ˜แƒ’แƒ˜แƒ•แƒ” แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒ˜ – แƒ“แƒแƒคแƒ˜แƒกแƒฅแƒ˜แƒ แƒ“แƒ แƒžแƒ แƒแƒ‘แƒšแƒ”แƒ›แƒ node แƒ”แƒ‘แƒก แƒจแƒแƒ แƒ˜แƒก. แƒแƒฅ แƒ“แƒแƒ–แƒ˜แƒแƒœแƒ”แƒ‘แƒฃแƒšแƒ˜ node แƒ”แƒ‘แƒ˜ แƒแƒ  แƒแƒ แƒ˜แƒแƒœ แƒ’แƒแƒฃแƒฅแƒ›แƒ”แƒ‘แƒฃแƒšแƒ”แƒ‘แƒ˜. แƒ˜แƒกแƒ˜แƒœแƒ˜ แƒ“แƒแƒ›แƒแƒฃแƒ™แƒ˜แƒ“แƒ”แƒ‘แƒšแƒแƒ“ แƒ’แƒแƒœแƒแƒ’แƒ แƒซแƒแƒ‘แƒ”แƒœ แƒ›แƒฃแƒจแƒแƒแƒ‘แƒแƒก. แƒ แƒแƒ“แƒ”แƒกแƒแƒช แƒ™แƒแƒ›แƒฃแƒœแƒ˜แƒ™แƒแƒชแƒ˜แƒ˜แƒก แƒžแƒ แƒแƒ‘แƒšแƒ”แƒ›แƒ แƒแƒฆแƒ“แƒ’แƒ”แƒ‘แƒ แƒ“แƒแƒ˜แƒฌแƒงแƒ”แƒ‘แƒ แƒกแƒ˜แƒœแƒฅแƒ แƒแƒœแƒ˜แƒ–แƒแƒชแƒ˜แƒ แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ”แƒ‘แƒ˜แƒก, แƒ—แƒฃแƒ›แƒชแƒ แƒ’แƒแƒ แƒแƒœแƒขแƒ˜แƒ แƒแƒ  แƒ’แƒ•แƒแƒฅแƒ•แƒก แƒ แƒแƒ› แƒงแƒ•แƒ”แƒšแƒ แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ˜ แƒ˜แƒ’แƒ˜แƒ•แƒ” แƒ˜แƒฅแƒœแƒ”แƒ‘แƒ แƒœแƒแƒฃแƒ“แƒ”แƒ‘แƒก แƒจแƒแƒ แƒ˜แƒก.

Wednesday, May 14, 2014

RBS Drools (PART I, BASICS)

Rule-based systems - แƒฌแƒ”แƒกแƒ”แƒ‘แƒ–แƒ”/แƒ‘แƒ แƒซแƒแƒœแƒ”แƒ‘แƒ”แƒ‘แƒ–แƒ” แƒ“แƒแƒคแƒฃแƒซแƒœแƒ”แƒ‘แƒฃแƒšแƒ˜ แƒกแƒ˜แƒกแƒขแƒ”แƒ›แƒ–  แƒซแƒ˜แƒ แƒ˜แƒ—แƒแƒ“แƒแƒ“ แƒ˜แƒกแƒ”แƒ—แƒ˜ แƒแƒ›แƒแƒชแƒแƒœแƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒ“แƒแƒญแƒ แƒแƒจแƒ˜ แƒ’แƒแƒ›แƒแƒ˜แƒงแƒ”แƒœแƒ”แƒ‘แƒ แƒกแƒแƒ“แƒแƒช  แƒฎแƒ”แƒšแƒแƒ•แƒœแƒฃแƒ แƒ˜ แƒ˜แƒœแƒขแƒ”แƒšแƒ”แƒฅแƒขแƒ˜แƒ แƒกแƒแƒญแƒ˜แƒ แƒ แƒแƒœ แƒ›แƒซแƒšแƒแƒ•แƒ แƒ˜ แƒ’แƒแƒ›แƒแƒ—แƒ•แƒšแƒ”แƒ‘แƒ˜แƒ แƒ’แƒแƒœแƒกแƒแƒฎแƒแƒ แƒชแƒ˜แƒ”แƒšแƒ”แƒ‘แƒ”แƒšแƒ˜. แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒแƒ“:  แƒ›แƒ’แƒ–แƒแƒ•แƒ แƒแƒ‘แƒ แƒ›แƒแƒฅแƒกแƒ˜แƒ›แƒแƒšแƒฃแƒ แƒแƒ“ แƒ‘แƒ”แƒ•แƒ  แƒฅแƒแƒšแƒแƒฅแƒจแƒ˜ แƒ˜แƒกแƒ” แƒ แƒแƒ› แƒ›แƒแƒฅแƒกแƒ˜แƒ›แƒแƒšแƒฃแƒ แƒแƒ“ แƒชแƒแƒขแƒ แƒ—แƒแƒœแƒฎแƒ แƒ“แƒแƒ•แƒฎแƒแƒ แƒฏแƒแƒ—, แƒญแƒแƒ“แƒ แƒแƒ™แƒ˜ แƒแƒœ แƒ—แƒฃแƒœแƒ“แƒแƒช แƒกแƒฃแƒ“แƒแƒ™แƒฃ...

RBS–แƒกแƒแƒ—แƒ•แƒ˜แƒก แƒ‘แƒ”แƒ•แƒ แƒ˜ แƒžแƒ แƒแƒ”แƒฅแƒขแƒ”แƒ‘แƒ˜ แƒแƒ แƒ˜แƒก แƒจแƒ”แƒฅแƒ›แƒœแƒ˜แƒšแƒ˜, แƒ”แƒ แƒ—แƒ”แƒ แƒ—แƒ˜ แƒแƒ แƒ˜แƒก Jboss Drools. แƒ”แƒก แƒ’แƒแƒฎแƒšแƒแƒ•แƒ— openSource แƒžแƒ แƒแƒ”แƒฅแƒขแƒ˜, แƒ แƒแƒ›แƒ”แƒšแƒกแƒแƒช แƒกแƒฎแƒ•แƒแƒ“แƒแƒกแƒฎแƒ•แƒ แƒจแƒ•แƒ˜แƒšแƒแƒ‘แƒ˜แƒšแƒ˜ (sub) แƒžแƒ แƒแƒ”แƒฅแƒขแƒ”แƒ‘แƒ˜ แƒ’แƒแƒแƒฉแƒœแƒ˜แƒ – Drools Expert, Drools Fusion, Drools Guvnor, Drools Planner แƒ“แƒ แƒแƒกแƒ” แƒจแƒ”แƒ›แƒ“แƒ”แƒ’.

แƒ’แƒแƒ›แƒแƒฎแƒกแƒ”แƒœแƒ“แƒ แƒ™แƒ˜แƒ“แƒ”แƒ• Scala, แƒแƒœ IBM –แƒก แƒแƒฅแƒ•แƒก Jrules แƒžแƒ แƒแƒ”แƒฅแƒขแƒ˜. Jrules แƒคแƒแƒกแƒ˜แƒแƒœแƒ˜แƒ, แƒ—แƒฃ แƒคแƒฃแƒšแƒ˜ แƒแƒ  แƒ’แƒ•แƒแƒฅแƒ•แƒก, แƒฃแƒ‘แƒ แƒแƒšแƒแƒ“ แƒฃแƒœแƒ“แƒ แƒ“แƒแƒ•แƒ™แƒ›แƒแƒงแƒแƒคแƒ˜แƒšแƒ“แƒ”แƒ— แƒ˜แƒ›แƒ˜แƒ— แƒ แƒแƒช แƒ’แƒ•แƒแƒฅแƒ•แƒก. แƒแƒ›แƒฏแƒ”แƒ แƒแƒ“ แƒแƒ› แƒกแƒขแƒแƒขแƒ˜แƒแƒจแƒ˜ Drools แƒ–แƒ” แƒ•แƒ˜แƒกแƒแƒฃแƒ‘แƒ แƒ”แƒ‘แƒ—.

แƒกแƒ˜แƒœแƒขแƒแƒฅแƒกแƒ˜


 
rule "HelloPersons" 
  when 
       Person( firstName == "mariam" ) 
  then 
     // แƒจแƒ”แƒกแƒ แƒฃแƒšแƒ”แƒ‘แƒ
end  

แƒ›แƒแƒ แƒขแƒ˜แƒ•แƒ˜ แƒกแƒ˜แƒœแƒขแƒแƒฅแƒกแƒ˜แƒ. แƒ—แƒฃ แƒกแƒแƒฎแƒ”แƒšแƒ˜ แƒ”แƒฅแƒ•แƒ˜แƒ•แƒแƒšแƒ”แƒœแƒขแƒฃแƒ แƒ˜แƒ แƒ›แƒแƒ แƒ˜แƒแƒ›แƒ˜แƒก, แƒ›แƒแƒจแƒ˜แƒœ
then แƒจแƒ˜ แƒ’แƒแƒ“แƒแƒ•แƒ“แƒ˜แƒ•แƒแƒ แƒ—. แƒ™แƒแƒ›แƒžแƒ˜แƒšแƒ”แƒ แƒ˜ แƒญแƒ™แƒ•แƒ˜แƒแƒœแƒ˜แƒ แƒ“แƒ แƒ˜แƒชแƒ˜แƒก แƒ แƒแƒ› == แƒ˜แƒ’แƒ˜แƒ•แƒ”แƒ แƒ แƒแƒช String.equals

Person แƒ™แƒšแƒแƒกแƒ˜แƒก แƒกแƒฎแƒ•แƒ แƒ•แƒ”แƒšแƒ”แƒ‘แƒ˜แƒก แƒจแƒ”แƒ›แƒแƒฌแƒ›แƒ”แƒ‘แƒแƒช แƒจแƒ”แƒ’แƒ•แƒ˜แƒซแƒšแƒ˜แƒ แƒ“แƒ แƒแƒกแƒ”แƒ—แƒ˜ แƒกแƒ˜แƒœแƒขแƒแƒฅแƒกแƒ˜ แƒ’แƒ•แƒ”แƒฅแƒœแƒ”แƒ‘แƒ:

 
rule "CheckPerson" 
when
    p: Person(age >= 18, country == "Georgia", nick: nickName)
then
    System.out.println( "Hello Mariam" );
end


แƒแƒ› แƒจแƒ”แƒ›แƒ—แƒฎแƒ•แƒ”แƒ•แƒจแƒ˜ p  แƒแƒ แƒ˜แƒก reference variable.  แƒแƒฅแƒ•แƒ” แƒžแƒ”แƒ แƒกแƒแƒœแƒ˜แƒก แƒแƒ‘แƒ˜แƒ”แƒฅแƒขแƒ˜แƒ“แƒแƒœ nickName แƒ•แƒ”แƒšแƒ˜ แƒแƒ›แƒแƒ•แƒ˜แƒฆแƒ” แƒ“แƒ nick แƒชแƒ•แƒšแƒแƒ“แƒจแƒ˜ แƒฉแƒแƒ•แƒฌแƒ”แƒ แƒ” (แƒ แƒแƒ—แƒฅแƒ›แƒแƒฃแƒœแƒ“แƒ  แƒกแƒฅแƒแƒฃแƒคแƒ˜ แƒจแƒ”แƒ–แƒฆแƒฃแƒ“แƒฃแƒšแƒ˜ แƒแƒฅ แƒแƒ› แƒชแƒ•แƒšแƒแƒ“แƒก).


แƒžแƒ แƒแƒ’แƒ แƒแƒ›แƒ˜แƒก แƒ’แƒแƒกแƒแƒจแƒ•แƒ”แƒ‘แƒแƒ“ 2 แƒ’แƒ–แƒ แƒ’แƒ•แƒแƒฅแƒ•แƒก. แƒžแƒ˜แƒ แƒ•แƒ”แƒšแƒ˜ แƒ”แƒกแƒแƒ แƒคแƒšแƒแƒ’แƒ˜แƒœแƒ˜แƒก แƒ“แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ IDE แƒจแƒ˜.

แƒ•แƒ”แƒ แƒกแƒ˜แƒ”แƒ‘แƒ˜ แƒจแƒ”แƒ’แƒ˜แƒซแƒšแƒ˜แƒแƒ— แƒแƒฅแƒ”แƒ“แƒแƒœ แƒแƒ›แƒแƒ˜แƒ แƒฉแƒ˜แƒแƒ—:
 
http://download.jboss.org/drools/release/

แƒ—แƒฃแƒ›แƒชแƒ แƒ›แƒ” แƒงแƒแƒ•แƒ”แƒšแƒ—แƒ•แƒ˜แƒก แƒ‘แƒแƒšแƒ แƒ’แƒแƒœแƒแƒฎแƒšแƒ”แƒ‘แƒฃแƒšแƒก แƒ•แƒ˜แƒฆแƒ”แƒ‘, แƒแƒœแƒฃ แƒจแƒ”แƒ’แƒ˜แƒซแƒšแƒ˜แƒแƒ— แƒ“แƒแƒแƒ˜แƒœแƒกแƒขแƒแƒšแƒ˜แƒ แƒแƒ— แƒ”แƒ™แƒšแƒ˜แƒคแƒกแƒจแƒ˜ แƒจแƒ”แƒ›แƒ“แƒ”แƒ’แƒ˜ แƒšแƒ˜แƒœแƒ™แƒ˜แƒ“แƒแƒœ :
 
http://download.jboss.org/drools/release/latest/org.drools.updatesite/ 


แƒ›แƒ”แƒแƒ แƒ” แƒ’แƒ–แƒแƒ แƒ›แƒแƒ•แƒ”แƒœแƒ˜แƒก (แƒแƒœแƒฃ แƒ˜แƒ’แƒ˜แƒ•แƒ” แƒ›แƒแƒ•แƒœแƒ”) แƒ“แƒ”แƒคแƒ”แƒœแƒ“แƒ”แƒœแƒกแƒ”แƒ‘แƒจแƒ˜ แƒ“แƒแƒ•แƒแƒ›แƒแƒขแƒแƒ—:

 
<dependency> 
        <groupId>org.drools</groupId> 
            <artifactId>drools-compiler</artifactId>
            <version> [แƒ•แƒ”แƒ แƒกแƒ˜แƒ]</version> 
        </dependency> 
<dependency> 



rule แƒ‘แƒ˜แƒก แƒ“แƒแƒกแƒแƒฌแƒ”แƒ แƒแƒ“ แƒจแƒ”แƒฅแƒ›แƒ”แƒœแƒ˜แƒ— แƒกแƒแƒฎแƒ”แƒšแƒ˜.drl แƒคแƒแƒ˜แƒšแƒ˜ แƒ แƒ”แƒกแƒฃแƒ แƒกแƒ”แƒ‘แƒจแƒ˜. แƒ’แƒแƒกแƒแƒจแƒ•แƒ”แƒ‘แƒแƒ“ แƒ™แƒ˜ Drools แƒ“แƒ jBPM แƒ˜แƒก แƒ›แƒ˜แƒ”แƒ  แƒจแƒ”แƒ›แƒแƒ—แƒแƒ•แƒแƒ–แƒ”แƒ‘แƒฃแƒšแƒ˜ KIE API แƒ’แƒแƒ›แƒแƒ’แƒ•แƒแƒ“แƒ’แƒ”แƒ‘แƒ.


KieServices ks = KieServices.Factory.get(); 
KieContainer kContainer = ks.getKieClasspathContainer();
KieSession kSession = kContainer.newKieSession("ksession-rules"); 
 
Person p= new Person();

...     

kSession.insert(p); 
kSession.fireAllRules(); 


แƒ’แƒแƒœแƒ•แƒ˜แƒฎแƒ˜แƒšแƒแƒ—  แƒชแƒแƒขแƒ แƒ“แƒแƒฎแƒ•แƒ”แƒฌแƒ˜แƒšแƒ˜ แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒ˜. แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒแƒ“, แƒคแƒ˜แƒ‘แƒแƒœแƒแƒฉแƒ˜แƒก แƒ›แƒ˜แƒ›แƒ“แƒ”แƒ•แƒ แƒแƒ‘แƒแƒ–แƒ”:

แƒฉแƒ•แƒ”แƒœ แƒ•แƒ˜แƒชแƒ˜แƒ— แƒ แƒแƒ›
 F(n)=F(n-1) + F(n+2)
แƒแƒ›แƒแƒกแƒ—แƒแƒœ
 F(1) =1, แƒ“แƒ F(2)=1;



 public static class Fibonacci {

  private int sequence;
  private long value;

  public Fibonacci(int sequence) {
   this.setSequence(sequence);
   this.setValue(-1);
  }
   //... 
 } 


แƒ—แƒแƒ•แƒ˜แƒ“แƒแƒœ  -1 แƒ›แƒœแƒ˜แƒจแƒ•แƒœแƒ”แƒšแƒแƒ‘แƒ”แƒ‘แƒ˜ แƒ›แƒ˜แƒ•แƒแƒœแƒ˜แƒญแƒแƒ—  (–1 แƒ˜แƒ— แƒแƒ•แƒฆแƒœแƒ˜แƒจแƒœแƒแƒ—   แƒฏแƒ”แƒ  แƒ’แƒแƒ›แƒแƒฃแƒ—แƒ•แƒšแƒ”แƒšแƒ˜ แƒ›แƒœแƒ˜แƒจแƒ•แƒœแƒ”แƒšแƒแƒ‘แƒ”แƒ‘แƒ˜  )

rule "แƒคแƒ˜แƒ‘แƒแƒœแƒแƒฉแƒ˜แƒก แƒแƒ‘แƒ˜แƒ”แƒฅแƒขแƒ”แƒ‘แƒ˜แƒก แƒจแƒ”แƒฅแƒ›แƒœแƒ"
    when
        f : Fibonacci ( value == -1 )
        not ( Fibonacci ( sequence == 1 ) )   
    then
        insert( new Fibonacci( f.sequence - 1 ) );
        System.out.println( "recurse for " + f.sequence );
end



when –> แƒ—แƒฃ  Fibonacci แƒแƒ‘แƒ˜แƒ”แƒฅแƒขแƒจแƒ˜ แƒ›แƒœแƒ˜แƒจแƒ•แƒœแƒ”แƒšแƒแƒ‘แƒ แƒแƒ แƒ˜แƒก -1 (แƒฉแƒ•แƒ”แƒœ แƒจแƒ”แƒฅแƒ›แƒœแƒ˜แƒกแƒแƒก –1 แƒ›แƒ˜แƒ•แƒแƒœแƒ˜แƒญแƒ”แƒ—, แƒจแƒ”แƒกแƒแƒ‘แƒแƒ›แƒ˜แƒกแƒแƒ“ แƒแƒ แƒ˜แƒก), แƒ›แƒแƒจแƒ˜แƒœ –> แƒจแƒ”แƒ•แƒฅแƒ›แƒœแƒแƒ— แƒแƒฎแƒแƒšแƒ˜ แƒแƒ‘แƒ˜แƒ”แƒฅแƒขแƒ˜ , แƒ”แƒ แƒ—แƒ˜แƒ— แƒœแƒแƒ™แƒšแƒ”แƒ‘แƒ˜ แƒ›แƒ˜แƒ›แƒ“แƒ”แƒ•แƒ แƒแƒ‘แƒ˜แƒก แƒœแƒแƒ›แƒ แƒ˜แƒ—.  


 rule "F(1) , F(2) แƒ˜แƒก แƒ˜แƒœแƒ˜แƒชแƒ˜แƒแƒšแƒ˜แƒ–แƒ”แƒ‘แƒ"
    when
        f : Fibonacci(  sequence==1 || ==2, value == -1  ) 
    then
            modify ( f ){
         value = 1
     };
        System.out.println( f.sequence + " แƒ“แƒ " + f.value ); 
end



แƒงแƒ•แƒ”แƒšแƒ แƒจแƒ”แƒ›แƒ—แƒฎแƒ•แƒ”แƒ•แƒแƒจแƒ˜ แƒ•แƒ˜แƒชแƒ˜แƒ— แƒ แƒแƒ› 1 –แƒก แƒฃแƒ“แƒ แƒ˜แƒก F(1) , F(2). แƒแƒ›แƒ˜แƒขแƒแƒ›: แƒ แƒแƒชแƒ  sequence==1 แƒแƒœ  sequence==2 , แƒ›แƒแƒจแƒ˜แƒœ แƒ’แƒแƒ“แƒแƒ•แƒแƒ™แƒ”แƒ—แƒแƒ— แƒ›แƒœแƒ˜แƒจแƒ•แƒœแƒ”แƒšแƒแƒ‘แƒ”แƒ‘แƒ˜ 1 แƒ˜แƒ—. แƒแƒ›แƒแƒกแƒ—แƒแƒœ value == -1 แƒžแƒ˜แƒ แƒแƒ‘แƒแƒช แƒ“แƒแƒ•แƒแƒ›แƒแƒขแƒแƒ—, แƒ—แƒแƒ แƒ”แƒ› แƒฉแƒแƒ•แƒ˜แƒชแƒ˜แƒ™แƒšแƒ”แƒ‘แƒ˜แƒ—.


แƒ“แƒ แƒ‘แƒแƒšแƒแƒก แƒ’แƒแƒ›แƒแƒ•แƒ—แƒ•แƒแƒšแƒแƒ—:

rule "แƒ’แƒแƒ›แƒแƒ—แƒ•แƒšแƒ"
    when
        f1 : Fibonacci( s1 : sequence, value != -1) 
        f2 : Fibonacci( s2: sequence == (s1+1), value != -1 )
        f3 : Fibonacci( s3 : sequence == (f1.sequence+2 ), value == -1 )             
    then   
        modify ( f3 ) {
          value = f1.value + f2.value
         };
        System.out.println( s3 + " == " + f3.value ); 
end 



แƒจแƒ”แƒ“แƒ”แƒ’แƒ˜
1 = 1
2 = 1
3 == 2
4 == 3
5 == 5
6 == 8
7 == 13
8 == 21
9 == 34
10 == 55
11 == 89
12 == 144
13 == 233
14 == 377
15 == 610
16 == 987
17 == 1597
18 == 2584
19 == 4181
20 == 6765
21 == 10946
22 == 17711
23 == 28657
24 == 46368
25 == 75025
26 == 121393
27 == 196418
28 == 317811
29 == 514229
30 == 832040
31 == 1346269
32 == 2178309
33 == 3524578
34 == 5702887
35 == 9227465
36 == 14930352
37 == 24157817
38 == 39088169
39 == 63245986
40 == 102334155
41 == 165580141
42 == 267914296
43 == 433494437
44 == 701408733
45 == 1134903170
46 == 1836311903
47 == 2971215073
48 == 4807526976
49 == 7778742049
50 == 12586269025
51 == 20365011074
52 == 32951280099
53 == 53316291173
54 == 86267571272
55 == 139583862445
56 == 225851433717
57 == 365435296162
58 == 591286729879
59 == 956722026041
60 == 1548008755920
61 == 2504730781961
62 == 4052739537881
63 == 6557470319842
64 == 10610209857723
65 == 17167680177565
66 == 27777890035288
67 == 44945570212853
68 == 72723460248141
69 == 117669030460994
70 == 190392490709135
71 == 308061521170129
72 == 498454011879264
73 == 806515533049393
74 == 1304969544928657
75 == 2111485077978050
76 == 3416454622906707
77 == 5527939700884757
78 == 8944394323791464
79 == 14472334024676221
80 == 23416728348467685
81 == 37889062373143906
82 == 61305790721611591
83 == 99194853094755497
84 == 160500643816367088
85 == 259695496911122585
86 == 420196140727489673
87 == 679891637638612258
88 == 1100087778366101931
89 == 1779979416004714189
90 == 2880067194370816120
91 == 4660046610375530309
92 == 7540113804746346429 
...
...
...