2015-11-01

Static IP address in CentOS in VirtualBox

* Env
Host: Windows 7 with internet access
Hypervisor: VirtualBox v5.x
Guest OS: CentOS v7.x (Following config should work for other Linux distributions with systemd, e.g., Debian v8.x, Ubuntu v15.x, etc.)

* Requirement
Guest OS should be able to access internet with minimal config.
Host OS should be able to acess Guest OS without port forwarding.

* How to
1. Install Guest OS using NAT (not "NAT Network").
media: CentOS-7-x86_64-NetInstall-1503.iso

In CentOS installer,
- turn on the ethernet, getting dynamic IP address 10.2.0.x.
- set the Installaion Source to /centos/7/os/x86_64/, e.g., http://mirror.optus.net/centos/7/os/x86_64/

Cf https://www.centos.org/download/mirrors/
2. In the new virtual machine Setting --> Network, enable Adapter 1 and Adapter 2, choose NAT (not "NAT Network") for Adapter 1, Host-only Adapter for Adapter 2.

3. Reboot CentOS. In CentOS, check the IP address using "ip a" command to find device name and MAC address for Adapter 2, and create network script for the device.

For example, if enp0s8 is the device name for the host only adapter, create /etc/sysconfig/network-scripts/ifcfg-enp0s8 file as follows.

TYPE=Ethernet
DEVICE=enp0s8
HWADDR=08:00:27:FA:F6:6A
ONBOOT=yes
BOOTPROTO=static
IPADDR=192.168.56.101
NETMASK=255.255.255.0

Cf https://wiki.centos.org/FAQ/CentOS7

In Ubuntu, add next to /etc/network/interfaces.
auto enp0s8
iface enp0s8 inet static
    address   192.168.56.101
    netmask   255.255.255.0
    network   192.168.56.0
    broadcast 192.168.56.255

-----------------------------------

To run docker in CentOS 7.x,
- disable selinux
- run
chkconfig docker on

Cf https://docs.docker.com/installation/centos/

2014-03-09

How to install LFE (Lisp Flavored Erlang) on Windows


0. Install cygwin with git and make.

1. Install rebar
in cygwin do

export PATH=$PATH:/cygdrive/c/<erlang-install-dir>/bin

e.g. export PATH=$PATH:/cygdrive/c/erl5.10.4/bin


git clone git://github.com/rebar/rebar.git
cd rebar
bootstrap

this will generate rebar and rebar.cmd file.
 

2. Install LFE
in cygwn do

export PATH=$PATH:/cygdrive/c/<rebar-install-dir>
e.g. export PATH=$PATH:/cygdrive/c/erlang/rebar
 
git clone --branch develop git://github.com/rvirding/lfe.git
cd lfe
vi Makefile  ## change makefile to use rebar.cmd instead of rebar
%s/rebar /rebar.cmd /g
:wq
 
make

erl -pa /somewhere/lfe/ebin -noshell -s lfe_shell start

Instead of using "erl -pa ..." option, you can copy the whole lfe directory under the <erlang-install-dir>/lib
and use "erl -noshell -s lfe_shell start".


example:

$ pwd
/cygdrive/c/lfe
$ ls
bin  ebin   Emakefile  include  Makefile         rebar.config  test
doc  emacs  examples   LICENSE  README.markdown  src           VERSION
$ erl -pa ebin -noshell -s lfe_shell start
LFE Shell V5.10.4 (abort with ^G)
> (+ 1 2 )
3
> (: lists reverse '(3 2 1))
(1 2 3)
> (halt)
$
 
 
lfeshell.bat
set path=%path%;c:\erl5.10.4\bin
erl -pa ebin -noshell -s lfe_shell start
 
Starting GUI lfe shell
werl -pa \path\to\lfe\ebin
1> lfe_shell:server(). 
 
 
Ref.
https://github.com/rvirding/lfe/wiki/Get-started
https://github.com/rvirding/lfe/blob/develop/doc/lfe_shell.txt 
http://stackoverflow.com/questions/4698591/lisp-flavored-erlang-on-windows
http://stackoverflow.com/questions/2835942/how-do-i-install-lfe-on-ubuntu-karmic 

2012-08-27

Tagging UniVerse Basic in ctags

Use etags in Exuberant Ctags, instead of the one in emacs.

find -H /somewhere/UVBasic/src -name '*.[BHu]' \
 | xargs -I{} ctags -e -a -o TAGS-uvb --langdef=uvbasic --langmap=uvbasic:.B.H.u \
--regex-uvbasic='/^([^ \t]+):$/\1/' --regex-uvbasic='/^[ \t]*PROGRAM[ \t]+([^ ]+)$/\1/i'  \
--regex-uvbasic='/^[ \t]*(FUNCTION|DEFFUN)[ \t]+([^ ]+\))/\2/i'  \
--regex-uvbasic='/^[ \t]*(EQUATE|EQU)[ \t]+([^ ]+)[ \t]+TO[ \]+/\2/i' {}

2011-09-14

constructing process tree from the ps -ef result

#! /usr/bin/awk -f

# Usage:
# ps -ef | ./proctree.awk
# ps -f > proclist.txt; ./proctree.awk proclist.txt

BEGIN { pid_col = 2; ppid_col = 3 }

# find the field number for PID and PPID column
/PID +PPID/ {
for (i=1; i < NF; i++) {
if ($i == "PID") {
pid_col = i ; ppid_col = i + 1
print; break
}
}
next
}

{
processes[$pid_col] = $0
children[$ppid_col] = children[$ppid_col] "," $pid_col
if ($ppid_col == 0 || $ppid_col == 1) child_of_swapper_init = child_of_swapper_init "," $pid_col
}

END {
if (0 in processes) {
print processes[0]
split(substr(children[0], 2), child_of_swapper, ",")
for (pid in child_of_swapper) {
if (pid != 1) print processes[pid]
}
}

if (1 in processes) {
print_tree(1, 0)
} else {
## find the top processes.
for (pid in children) {
if (pid in processes) continue
origins = origins "," pid
}

split(substr(origins, 2), top_procs, ",")
for (pid in top_procs) {
print_tree(top_procs[pid], 0)
}
}
}

function print_tree(pid, depth, myfmt, mypid, mychld)
{
if (index(child_of_swapper_init, pid)) depth = 0

if (depth == 0) {
if (pid in processes) {
print processes[pid]
} else {
depth = -1
}
} else {
myfmt = sprintf("%%%is%%s", 3 * depth)
printf(myfmt "\n", " ", processes[pid])
}

split(substr(children[pid], 2), mychld, ",")
for (mypid in mychld) {
print_tree(mychld[mypid], depth + 1)
}
}

#__end__

2011-09-05

How to generate cyclic numbers in ksh

Sometimes, I need to generate limited number of temporary files in loop like below.

while :
do
ps -elf > /tmp/ps.log.$cyclic_number_here
done


Generating cyclic number is an easy job. For example, next function does that.

#! /usr/bin/ksh
GEN_CYCLIC_CALL_COUNT=1
gen_cyclic_number()
{
typeset -i max=$1 mod

((max < 1)) && print 0 && return

((mod = GEN_CYCLIC_CALL_COUNT % max))
if ((mod == 0)); then
((GEN_CYCLIC_CALL_COUNT = max + 1))
print -- $max
else
((GEN_CYCLIC_CALL_COUNT += 1))
print -- $mod
fi
}
But this function will not output the correct numbers when used in command subsititution because it's executed in a subshell.

Correct and easier way is to use proper arithmetic expressions as arithmetic expansion is done in the shell, not in a subshell.

typeset -i i=-1
while :
do
ps -elf > /tmp/ps.log.$((i = (i += 1) % 3)) # generates ps.log.0, ps.log.1, ps.log.2
done


What you need is just 0 and 1, even simpler solution is here.
typeset -i i=1
while :
do
ps -elf > /tmp/ps.log.$((i ^= 1))
done

2011-06-27

Could not access remote file "/usr/local/bin/sstep" in software item

* Problem
In installing depot file using swinstall command in HP-UX, it can fail with next error even though all the installation is done in localhost.

ERROR: Could not access remote file "/usr/local/bin/sstep" in
software item
"tusc.tusc-RUN,r=8.0,a=HP-UX_B.11.31_64,v=:/usr/local" due to
an internal error on the remote system.
ERROR: Failed installing fileset "tusc.tusc-RUN,r=8.0". Check the
above output for details.
* Retry number 1 of 1 for loading files for fileset
"tusc.tusc-RUN,r=8.0".
* Installing fileset "tusc.tusc-RUN,r=8.0" (1 of 1).
ERROR: Could not access remote file "/usr/local/bin/sstep" in
software item
"tusc.tusc-RUN,r=8.0,a=HP-UX_B.11.31_64,v=:/usr/local" due to
an internal error on the remote system.
ERROR: Failed installing fileset "tusc.tusc-RUN,r=8.0". Check the
above output for details.

* Solution
Check if your /etc/hosts file has error, correct it if so.

For example, if your hosts file is like below

127.0.0.1 loopback localhost myhostname
10.10.10.1 myhostname

Change it to

127.0.0.1 loopback localhost
10.10.10.1 myhostname

Then restart the swagentd using "swagentd -r" command.

And run the swinstall again.
For example; swinstall -s $PWD/tusc-8.0-ia64-11.31.depot \*

2010-12-17

Running X window through SSH tunnel

* Prerequisite
The secure shell daemon (sshd) in the Unix box should be set up to support X11 forwarding, to enable this
1. Login as root
2. Edit /etc/ssh/sshd_config adding next line
X11Forwarding yes
(In HP-UX, sshd_config is in /opt/ssh/etc/)
3. Restart sshd
in AIX: /etc/rc.d/rc2.d/Ssshd {stop|start} OR stopsrc -s sshd; startsrc -s sshd
in Linux: /etc/init.d/sshd {stop|start}
in Solaris: svcadm refresh ssh
in HP-UX: /sbin/init.d/secsh {stop|start}


* Case 1: my PC with cygwin directly connects to remote Unix box (my PC <----> Unix)

1. Start cygwin XWin Server using Windows menu or using startxwin command in cygwin command window.

2. Set up secure shell tunnel by running next command in a cygwin command window.
cygwin$ ssh -X -Y -C user@remote_unix_host

3. In the shell session opened in above step, make sure DISPLAY environment variable is set and run X comands like xterm, xclock, ...

Sample session:

cygwin_in_WinXP$ ssh -X -Y -C johndoe@debian
johndoe@debian's password: XXX
johndoe@debian ~$ echo $DISPLAY
localhost:11.0

johndoe@debian ~$ xterm &
[1] 1234
johndoe@debian ~$

xterm should pop up in my Windows XP box.


* Case 2: my PC with cygwin cannot connect to the remote Unix box as it's behind firewall having private IP address 192.nnn.nnn.nnn. (my PC <----> SSH relay host <----> Unix)

Let's call ssh relay host ssh_box and target Unix host xwin_box.

0. Add next lines in your Windows hosts file (C:\Windows\System32\drivers\etc\hosts).
127.0.0.1 locahost xwin_box
10.10.1.10 ssh_box # public IP address, so no problem for direct connection

Also make sure xwin_box is registered in the /etc/hosts file of ssh_box too.
(In fact, aliasing xwin_box is optional as localhost can be used in step 3 below)

1. Start cygwin XWin Server using Windows menu or using startxwin command in cygwin command window.

2. Set up secure shell tunnel by running next command in a cygwin command window.
cygwin$ ssh -C -L 2222:xwin_box:22 user@ssh_box

3. Run next command in another cygwin command window.
cygwin$ ssh -X -Y -C -p 2222 xuser@xwin_box
or
cygwin$ ssh -X -Y -p 2222 xuser@localhost

4. In the shell session opened in above step 3, make sure DISPLAY environment variable is set and run X comands like xterm, xclock, ...

2010-04-05

read timeout in ksh

Timing out read in Korn shell

It is possible to time out the read command using coroutines.
We need a helper script, let's call it timout_read.sh, and main script with read command.

1. timeout_read.sh
#! /usr/bin/ksh

typeset -i timeout_after_this=$1
sleep $timeout_after_this

kill -0 $PPID 2>/dev/null && kill -USR1 $PPID
#ps -p $PPID >/dev/null && kill -USR1 $PPID 2>/dev/null

2. main.sh

#! /usr/bin/ksh

myvar=.yes ## default value.
timeout=${1:-4}

read_myvar()
{
trap return USR1
timeout_read.sh $1 &
read myvar?"Your value for myvar: "
trap "" USR1
}

## do something

read_myvar $timeout
if [[ $myvar = .yes ]]; then
# do default action
echo Read timed out. myvar = $myvar
else
# do proper action depending on user input
echo You entered $myvar
fi
* read in bash has -t option for this functionality.

2010-03-21

* properties of binary relation
let R be a binary relation in A.
R is
reflexive in A if aRa for all a ∈ A.
symmetric in A if aRb implies bRa for all a, b ∈ A.
antisymmetric in A if aRb and bRa imply a = b for all a, b ∈ A.
asymmetric in A if aRb implies that bRa does not hold for any a, b ∈ A.
transitive in A if aRb and bRc imply aRc for all a, b, c ∈ A.

* equivalence
R is an equivalence on A if it is reflexive, symmetric, and transitive.

* ordered set
let R be a relation in A.

- poset (partially ordered set)
R is a (partial) ordering of A if it is reflexive, antisymmetric, and transitive.
(A, R) is called an ordered set.

ex: "less than or equal to" relation
divisibility relation | : a|b iff a divides b.

- strict ordering
R is a strict ordering if it is asymmetric and transitive.
ex: "less than" relation

- loset (linearly ordered set)
an ordering of A is called linear or total if any two elements of A are comparable.
(A, R) is called a linearly ordered set.

( a and b are comparable in an (partial) ordering R if aRb or bRa; in a strict ordering if aRb or bRa or a = b)

ex: < is total, but | is not.

- woset (well ordered set)
linear ordering R of A is a well-ordering if every non-empty subset of A has a R-least element.
(A, R) is called a well-ordered set.

* notions of greatest and least
let ≤ be an (partial) ordering of A, and let B is a subset of A.

- least/greatest/minimal/maximal
b ∈ B is the least element of B in the ordering ≤ if b≤x for every x ∈ B.
b ∈ B is the greatest element of B in ≤ if x≤b for every x ∈ B

b ∈ B is a minimal element of B in ≤ if there exists no x ∈ B such that x≤b and x != b.
b ∈ B is a maximal element of B in ≤ if there is no x ∈ B such that b≤x and x != b.

ex: B = positive integers greater than 1 = {2, 3, 4, ...} does not have a least element in |, but it has many minimal elements (for example, 2, 3, 5, etc)

- lower bound/upper bound/infimum/supremum
a ∈ A is a lower bound of B if a≤x for all x ∈ B.
a ∈ A is an upper bound of B if x≤a for all x ∈ B.

a ∈ A is an infimum (or greatest lower bound) of B if it is the greatest element of the set of all lower bounds of B.
a ∈ A is a supremum (or least upper bound) of B if it is the least element of the set of all upper bounds of B.

2009-08-21

Response file for Oracle 10gR2 client custom install

####################################################################
## Copyright (c) 1999, 2004 Oracle. All rights reserved. ##
## ##
## Specify values for the variables listed below to customize ##
## your installation. ##
## ##
## Each variable is associated with a comment. The comment ##
## identifies the variable type. ##
## ##
## Please specify the values in the following format: ##
## ##
## Type Example ##
## String "Sample Value" ##
## Boolean True or False ##
## Number 1000 ##
## StringList {"String value 1","String Value 2"} ##
## ##
## The values that are given as need to be ##
## specified for a silent installation to be successful. ##
## ##
## ##
## This response file is generated by Oracle Software ##
## Packager. ##
####################################################################


RESPONSEFILE_VERSION=2.2.1.0.0

#-------------------------------------------------------------------------------
#Name : UNIX_GROUP_NAME
#Datatype : String
#Description: Unix group to be set for the inventory directory. Valid only in Unix platforms.
#Example: UNIX_GROUP_NAME = "install"
#-------------------------------------------------------------------------------
UNIX_GROUP_NAME="ORAINV"

#-------------------------------------------------------------------------------
#Name : FROM_LOCATION
#Datatype : String
#Description: Complete path to the products.xml.
#Example: FROM_LOCATION = "../stage/products.xml"
#-------------------------------------------------------------------------------
FROM_LOCATION="../stage/products.xml"

#-------------------------------------------------------------------------------
#Name : FROM_LOCATION_CD_LABEL
#Datatype : String
#Description: This variable should only be used in multi-CD installations. It includes the label of the compact disk where the file "products.xml" exists. The label can be found in the file "disk.label" in the same directory as products.xml.
#Example: FROM_LOCATION_CD_LABEL = "CD Label"
#-------------------------------------------------------------------------------
FROM_LOCATION_CD_LABEL=

#-------------------------------------------------------------------------------
#Name : ORACLE_HOME
#Datatype : String
#Description: Complete path of the Oracle Home.
#Example: ORACLE_HOME = "C:\OHOME1"
#-------------------------------------------------------------------------------
ORACLE_HOME="/opt/oracle/product/10.2.0/client_1"

#-------------------------------------------------------------------------------
#Name : ORACLE_HOME_NAME
#Datatype : String
#Description: Oracle Home Name. Used in creating folders and services.
#Example: ORACLE_HOME_NAME = "OHOME1"
#-------------------------------------------------------------------------------
ORACLE_HOME_NAME="client_1"

#-------------------------------------------------------------------------------
#Name : SHOW_WELCOME_PAGE
#Datatype : Boolean
#Description: Set to true if the Welcome page in OUI needs to be shown.
#Example: SHOW_WELCOME_PAGE = false
#-------------------------------------------------------------------------------
SHOW_WELCOME_PAGE=false

#-------------------------------------------------------------------------------
#Name : SHOW_NODE_SELECTION_PAGE
#Datatype : Boolean
#Description: Set to true if the node selection page in OUI needs to be shown.
#Example: SHOW_NODE_SELECTION_PAGE = false
#-------------------------------------------------------------------------------
SHOW_NODE_SELECTION_PAGE=false

#-------------------------------------------------------------------------------
#Name : SHOW_CUSTOM_TREE_PAGE
#Datatype : Boolean
#Description: Set to true if the custom tree page in OUI needs to be shown.
#Use this page to select or de-select dependencies. This page appears only in a custom install type.
#Example: SHOW_CUSTOM_TREE_PAGE = false
#-------------------------------------------------------------------------------
SHOW_CUSTOM_TREE_PAGE=false

#-------------------------------------------------------------------------------
#Name : SHOW_COMPONENT_LOCATIONS_PAGE
#Datatype : Boolean
#Description: Set to true if the component locations page in OUI needs to be shown.
#This page only appears if there are products whose installed directory can be changed.
#If you set this to false you will prevent the user from being able to specify alternate directories.
#Example: SHOW_COMPONENT_LOCATIONS_PAGE = false
#-------------------------------------------------------------------------------
SHOW_COMPONENT_LOCATIONS_PAGE=false

#-------------------------------------------------------------------------------
#Name : SHOW_SUMMARY_PAGE
#Datatype : Boolean
#Description: Set to true if the summary page in OUI needs to be shown.
#The summary page shows the list of components that will be installed in this session.
#Example: SHOW_SUMMARY_PAGE = true
#-------------------------------------------------------------------------------
SHOW_SUMMARY_PAGE=true

#-------------------------------------------------------------------------------
#Name : SHOW_INSTALL_PROGRESS_PAGE
#Datatype : Boolean
#Description: Set to true if the install progress page in OUI needs to be shown.
#This page shows the current status in the installation. The current status includes the product being installed and the file being copied.
#Example: SHOW_INSTALL_PROGRESS_PAGE = true
#-------------------------------------------------------------------------------
SHOW_INSTALL_PROGRESS_PAGE=true

#-------------------------------------------------------------------------------
#Name : SHOW_REQUIRED_CONFIG_TOOL_PAGE
#Datatype : Boolean
#Description: Set to true if the required config assistants page in OUI needs to be shown.
#This page shows the list of required configuration assistants that are part of this installation.
#It shows the status of each assistant, including any failures with detailed information on why it failed.
#Example: SHOW_REQUIRED_CONFIG_TOOL_PAGE = true
#-------------------------------------------------------------------------------
SHOW_REQUIRED_CONFIG_TOOL_PAGE=true

#-------------------------------------------------------------------------------
#Name : SHOW_CONFIG_TOOL_PAGE
#Datatype : Boolean
#Description: Set to true if the config assistants page in OUI needs to be shown.
#This page shows the list of configuration assistants that are part of this installation and are configured to launch automatically.
#It shows the status of each assistant, including any failures with detailed information on why it failed.
#Example: SHOW_CONFIG_TOOL_PAGE = true
#-------------------------------------------------------------------------------
SHOW_CONFIG_TOOL_PAGE=true

#-------------------------------------------------------------------------------
#Name : SHOW_RELEASE_NOTES
#Datatype : Boolean
#Description: Set to true if the release notes of this installation need to be shown at the end of installation.
#This dialog is launchable from the End of Installation page and shows the list of release notes available for the products just installed.
# This also requires the variable SHOW_END_SESSION_PAGE variable to be set to true.
#Example: SHOW_RELEASE_NOTES = true
#-------------------------------------------------------------------------------
SHOW_RELEASE_NOTES=false

#-------------------------------------------------------------------------------
#Name : SHOW_ROOTSH_CONFIRMATION
#Datatype : Boolean
#Description: Set to true if the Confirmation dialog asking to run the root.sh script in OUI needs to be shown.
#Valid only for Unix platforms.
#Example: SHOW_ROOTSH_CONFIRMATION = true
#-------------------------------------------------------------------------------
SHOW_ROOTSH_CONFIRMATION=true

#-------------------------------------------------------------------------------
#Name : SHOW_END_SESSION_PAGE
#Datatype : Boolean
#Description: Set to true if the end of session page in OUI needs to be shown.
#This page shows if the installation is successful or not.
#Example: SHOW_END_SESSION_PAGE = true
#-------------------------------------------------------------------------------
SHOW_END_SESSION_PAGE=true

#-------------------------------------------------------------------------------
#Name : SHOW_EXIT_CONFIRMATION
#Datatype : Boolean
#Description: Set to true if the confirmation when exiting OUI needs to be shown.
#Example: SHOW_EXIT_CONFIRMATION = true
#-------------------------------------------------------------------------------
SHOW_EXIT_CONFIRMATION=true

#-------------------------------------------------------------------------------
#Name : NEXT_SESSION
#Datatype : Boolean
#Description: Set to true to allow users to go back to the File Locations page for another installation. This flag also needs to be set to true in order to process another response file (see NEXT_SESSION_RESPONSE).
#Example: NEXT_SESSION = true
#-------------------------------------------------------------------------------
NEXT_SESSION=false

#-------------------------------------------------------------------------------
#Name : NEXT_SESSION_ON_FAIL
#Datatype : Boolean
#Description: Set to true to allow users to invoke another session even if current install session has failed. This flag is only relevant if NEXT_SESSION is set to true.
#Example: NEXT_SESSION_ON_FAIL = true
#-------------------------------------------------------------------------------
NEXT_SESSION_ON_FAIL=true

#-------------------------------------------------------------------------------
#Name : NEXT_SESSION_RESPONSE
#Datatype : String
#Description: Set to true to allow users to go back to the File Locations page for another installation. This flag also needs to be set to true in order to process another response file (see NEXT_SESSION_RESPONSE).
#Example: NEXT_SESSION_RESPONSE = "nextinstall.rsp"
#-------------------------------------------------------------------------------
NEXT_SESSION_RESPONSE=

#-------------------------------------------------------------------------------
#Name : DEINSTALL_LIST
#Datatype : StringList
#Description: List of components to be deinstalled during a deinstall session.
#The following choices are available. The value should contain only one of these choices.
#The choices are of the form Internal Name, Version : External name. Please use the internal name and version while specifying the value.
# oracle.client, 10.2.0.1.0 : Oracle Client 10.2.0.1.0
#Example: DEINSTALL_LIST = {"oracle.client","10.2.0.1.0"}
#-------------------------------------------------------------------------------
DEINSTALL_LIST={"oracle.client","10.2.0.1.0"}

#-------------------------------------------------------------------------------
#Name : SHOW_DEINSTALL_CONFIRMATION
#Datatype : Boolean
#Description: Set to true if deinstall confimation is needed during a deinstall session.
#Example: SHOW_DEINSTALL_CONFIRMATION = true
#-------------------------------------------------------------------------------
SHOW_DEINSTALL_CONFIRMATION=true

#-------------------------------------------------------------------------------
#Name : SHOW_DEINSTALL_PROGRESS
#Datatype : Boolean
#Description: Set to true if deinstall progress is needed during a deinstall session.
#Example: SHOW_DEINSTALL_PROGRESS = true
#-------------------------------------------------------------------------------
SHOW_DEINSTALL_PROGRESS=true

#-------------------------------------------------------------------------------
#Name : CLUSTER_NODES
#Datatype : StringList
#Description: This variable represents the cluster node names selected by the user for installation.
#Example: CLUSTER_NODES = {"node1"}
#-------------------------------------------------------------------------------
CLUSTER_NODES={}

#-------------------------------------------------------------------------------
#Name : REMOTE_NODES
#Datatype : StringList
#Description: This variable represents the remote node names on which installation is carried out.
#Example: REMOTE_NODES =
#-------------------------------------------------------------------------------
REMOTE_NODES=

#-------------------------------------------------------------------------------
#Name : LOCAL_NODE
#Datatype : String
#Description: This variable represents the local node.
#Example: LOCAL_NODE =
#-------------------------------------------------------------------------------
LOCAL_NODE=

#-------------------------------------------------------------------------------
#Name : RESTART_SYSTEM
#Datatype : Boolean
#Description: Set to true to allow automatic restart of the system, if set to false then installer will exit without restarting, no exit confirmation dialog is shown
#Example: RESTART_SYSTEM = false
#-------------------------------------------------------------------------------
RESTART_SYSTEM=false

#-------------------------------------------------------------------------------
#Name : RESTART_REMOTE_SYSTEM
#Datatype : Boolean
#Description: Set to true to allow automatic restart of the remote systems, if set to false then installer will not restart the remote systems, no exit confirmation dialog is shown
#Example: RESTART_REMOTE_SYSTEM = false
#-------------------------------------------------------------------------------
RESTART_REMOTE_SYSTEM=false

#-------------------------------------------------------------------------------
#Name : ORACLE_HOSTNAME
#Datatype : String
#Description: This variable holds the hostname of the system as set by the user.
#Example: ORACLE_HOSTNAME =
#-------------------------------------------------------------------------------
ORACLE_HOSTNAME="dennis"

#-------------------------------------------------------------------------------
#Name : REMOVE_HOMES
#Datatype : StringList
#Description: List of the homes to be removed during a deinstall session. Each home is represented by its full path.
#Example: REMOVE_HOMES = {,, ...}
#-------------------------------------------------------------------------------
REMOVE_HOMES={"/opt/oracle/product/10.2.0/client_1"}

#-------------------------------------------------------------------------------
#Name : SHOW_XML_PREREQ_PAGE
#Datatype : Boolean
#Description: This variable determines whether or not to show the prereq page.
#Example: SHOW_XML_PREREQ_PAGE = true
#-------------------------------------------------------------------------------
SHOW_XML_PREREQ_PAGE=true

#-------------------------------------------------------------------------------
#Name : SHOW_END_OF_INSTALL_MSGS
#Datatype : Boolean
#Description: Set to true if the text on end of install screen is to be shown. The text is always available under /install/readme.txt.
#Example: SHOW_END_OF_INSTALL_MSGS = true
#-------------------------------------------------------------------------------
SHOW_END_OF_INSTALL_MSGS=true

#-------------------------------------------------------------------------------
#Name : ACCEPT_LICENSE_AGREEMENT
#Datatype : Boolean
#Description: By setting this variable to true, you are accepting the license agreement. This variable is used only for silent installations.
#Example: ACCEPT_LICENSE_AGREEMENT = true
#-------------------------------------------------------------------------------
ACCEPT_LICENSE_AGREEMENT=true

#-------------------------------------------------------------------------------
#Name : TOPLEVEL_COMPONENT
#Datatype : StringList
#Description: The top level component to be installed in the current session.
#The following choices are available. The value should contain only one of these choices.
#The choices are of the form Internal Name, Version : External name. Please use the internal name and version while specifying the value.
# oracle.client, 10.2.0.1.0 : Oracle Client 10.2.0.1.0
#Example: TOPLEVEL_COMPONENT = {"oracle.client","10.2.0.1.0"}
#-------------------------------------------------------------------------------
TOPLEVEL_COMPONENT={"oracle.client","10.2.0.1.0"}

#-------------------------------------------------------------------------------
#Name : SHOW_SPLASH_SCREEN
#Datatype : Boolean
#Description: Set to true if the initial splash screen in OUI needs to be shown.
#Example: SHOW_SPLASH_SCREEN =
#-------------------------------------------------------------------------------
SHOW_SPLASH_SCREEN=true

#-------------------------------------------------------------------------------
#Name : SELECTED_LANGUAGES
#Datatype : StringList
#Description: Languages in which the components will be installed.
#The following choices are available. The value should contain only one of these choices.
#The choices are of the form Internal Name : External name. Please use the internal name while specifying the value.
# en, : English
# fr, : French
# ar, : Arabic
# bn, : Bengali
# pt_BR, : Brazilian Portuguese
# bg, : Bulgarian
# fr_CA, : Canadian French
# ca, : Catalan
# hr, : Croatian
# cs, : Czech
# da, : Danish
# nl, : Dutch
# ar_EG, : Egyptian
# en_GB, : English (United Kingdom)
# et, : Estonian
# fi, : Finnish
# de, : German
# el, : Greek
# iw, : Hebrew
# hu, : Hungarian
# is, : Icelandic
# in, : Indonesian
# it, : Italian
# ja, : Japanese
# ko, : Korean
# es, : Latin American Spanish
# lv, : Latvian
# lt, : Lithuanian
# ms, : Malay
# es_MX, : Mexican Spanish
# no, : Norwegian
# pl, : Polish
# pt, : Portuguese
# ro, : Romanian
# ru, : Russian
# zh_CN, : Simplified Chinese
# sk, : Slovak
# sl, : Slovenian
# es_ES, : Spanish
# sv, : Swedish
# th, : Thai
# zh_TW, : Traditional Chinese
# tr, : Turkish
# uk, : Ukrainian
# vi, : Vietnamese
#Example: SELECTED_LANGUAGES = {"en"}
#-------------------------------------------------------------------------------
SELECTED_LANGUAGES={"en"}

#-------------------------------------------------------------------------------
#Name : COMPONENT_LANGUAGES
#Datatype : StringList
#Description: Languages in which the components will be installed.
#The following choices are available. The value should contain only one of these choices.
#The choices are of the form Internal Name : External name. Please use the internal name while specifying the value.
# en, : English
# fr, : French
# ar, : Arabic
# bn, : Bengali
# pt_BR, : Brazilian Portuguese
# bg, : Bulgarian
# fr_CA, : Canadian French
# ca, : Catalan
# hr, : Croatian
# cs, : Czech
# da, : Danish
# nl, : Dutch
# ar_EG, : Egyptian
# en_GB, : English (United Kingdom)
# et, : Estonian
# fi, : Finnish
# de, : German
# el, : Greek
# iw, : Hebrew
# hu, : Hungarian
# is, : Icelandic
# in, : Indonesian
# it, : Italian
# ja, : Japanese
# ko, : Korean
# es, : Latin American Spanish
# lv, : Latvian
# lt, : Lithuanian
# ms, : Malay
# es_MX, : Mexican Spanish
# no, : Norwegian
# pl, : Polish
# pt, : Portuguese
# ro, : Romanian
# ru, : Russian
# zh_CN, : Simplified Chinese
# sk, : Slovak
# sl, : Slovenian
# es_ES, : Spanish
# sv, : Swedish
# th, : Thai
# zh_TW, : Traditional Chinese
# tr, : Turkish
# uk, : Ukrainian
# vi, : Vietnamese
#Example: COMPONENT_LANGUAGES = {"en"}
#Component : oracle.client
#-------------------------------------------------------------------------------

COMPONENT_LANGUAGES={"en"}

#-------------------------------------------------------------------------------
#Name : INSTALL_TYPE
#Datatype : String
#Description: Installation type of the component.
#The following choices are available. The value should contain only one of these choices.
#The choices are of the form Internal Name : External name. Please use the internal name while specifying the value.
# InstantClient, : InstantClient
# Administrator, : Administrator
# Runtime, : Runtime
# Custom, : Custom
#Example: INSTALL_TYPE = "InstantClient"
#Component : oracle.client
#-------------------------------------------------------------------------------

INSTALL_TYPE="Custom"

#-------------------------------------------------------------------------------
#Name : OPTIONAL_CONFIG_TOOLS
#Datatype : StringList
#Description: List of optional config assistants that need to be launched.
#The following choices are available. The value should contain only one of these choices.
#The choices are of the form Internal Name : External name. Please use the internal name while specifying the value.
# netca_deinst, : Oracle Net Configuration Assistant - Deinstall Script
#Example: OPTIONAL_CONFIG_TOOLS = {"netca_deinst"}
#Component : oracle.network.client
#-------------------------------------------------------------------------------

OPTIONAL_CONFIG_TOOLS=

#------------------------------------------------------------------------------
#Name : DEPENDENCY_LIST
#Datatype : StringList
#Description: List of products that you would like to install.
#
# The following choices are available. You may specify any
# combination of these choices. The components you choose should
# be specified in the form ":"
# Below is a list of components you may specify to install.
#
# oracle.sqlj:10.2.0.1.0 - Oracle SQLJ
# oracle.rdbms.util:10.2.0.1.0 - Oracle Database Utilities
# oracle.javavm.client:10.2.0.1.0 - Oracle Java Client
# oracle.sqlplus:10.2.0.1.0 - SQL*Plus
# oracle.dbjava.jdbc:10.2.0.1.0 - Oracle JDBC/THIN Interfaces
# oracle.ldap.client:10.2.0.1.0 - Oracle Internet Directory Client
# oracle.rdbms.oci:10.2.0.1.0 - Oracle Call Interface (OCI)
# oracle.precomp:10.2.0.1.0 - Oracle Programmer
# oracle.xdk:10.2.0.1.0 - Oracle XML Development Kit
# oracle.swd.opatch:10.2.0.1.0 - Oracle One-Off Patch Installer
# oracle.network.aso:10.2.0.1.0 - Oracle Advanced Security
# oracle.oem.client:10.2.0.1.0 - Enterprise Manager 10g Java
# Console
# oracle.oraolap.mgmt:10.2.0.1.0 - OLAP Analytic Workspace
# Manager and Worksheet
# oracle.network.client:10.2.0.1.0 - Oracle Net
# oracle.ordim.client:10.2.0.1.0 - Oracle interMedia Client Option
# oracle.ons:10.1.0.3.0 - Oracle Notification Service
# oracle.has.client:10.2.0.1.0 - Oracle Clusterware High Availability API
#Example: DEPENDENCY_LIST = {"oracle.sqlj:10.2.0.1.0"}
#------------------------------------------------------------------------------
DEPENDENCY_LIST={"oracle.sqlj:10.2.0.1.0", "oracle.rdbms.util:10.2.0.1.0", "oracle.javavm.client:10.2.0.1.0", "oracle.sqlplus:10.2.0.1.0", "oracle.dbjava.jdbc:10.2.0.1.0", "oracle.ldap.client:10.2.0.1.0", "oracle.rdbms.oci:10.2.0.1.0", "oracle.precomp:10.2.0.1.0", "oracle.xdk:10.2.0.1.0", "oracle.swd.opatch:10.2.0.1.0", "oracle.network.aso:10.2.0.1.0", "oracle.network.client:10.2.0.1.0", "oracle.has.client:10.2.0.1.0"}

How to silent install Oracle 10g client on AIX

## run "chuser fsize=-1 oracle" command as root first if ulimit for fsize is not big enough

Login as oracle

$ cd /opt/oracle_install
$ gunzip 10gr2_aix5l64_client.cpio.gz
$ cpio -icdmv < 10gr2_aix5l64_client.cpio ## Oracle document says to use -idmv option but -c also needed for AIX
$ su -
# cd /opt/oracle_install/opt/rootpre
# ./rootpre.sh
# exit
$ cd Disk1
$ cp response/clientcustom.rsp response/my-custom-10gR2-client.rsp
## edit the response file
$ grep -v ^\# response/my-custom-10gR2-client.rsp | grep .
RESPONSEFILE_VERSION=2.2.1.0.0
UNIX_GROUP_NAME="oinstall"
FROM_LOCATION="../stage/products.xml"
FROM_LOCATION_CD_LABEL=
ORACLE_HOME="/opt/oracle/product/10.2.0/client_1"
ORACLE_HOME_NAME="client_1"
SHOW_WELCOME_PAGE=false
SHOW_NODE_SELECTION_PAGE=false
SHOW_CUSTOM_TREE_PAGE=false
SHOW_COMPONENT_LOCATIONS_PAGE=false
SHOW_SUMMARY_PAGE=true
SHOW_INSTALL_PROGRESS_PAGE=true
SHOW_REQUIRED_CONFIG_TOOL_PAGE=true
SHOW_CONFIG_TOOL_PAGE=true
SHOW_RELEASE_NOTES=false
SHOW_ROOTSH_CONFIRMATION=true
SHOW_END_SESSION_PAGE=true
SHOW_EXIT_CONFIRMATION=true
NEXT_SESSION=false
NEXT_SESSION_ON_FAIL=true
NEXT_SESSION_RESPONSE=
DEINSTALL_LIST={"oracle.client","10.2.0.1.0"}
SHOW_DEINSTALL_CONFIRMATION=true
SHOW_DEINSTALL_PROGRESS=true
CLUSTER_NODES={}
REMOTE_NODES=
LOCAL_NODE=
RESTART_SYSTEM=false
RESTART_REMOTE_SYSTEM=false
ORACLE_HOSTNAME="my-aix-box"
REMOVE_HOMES={"/opt/oracle/product/10.2.0/client_1"}
SHOW_XML_PREREQ_PAGE=true
SHOW_END_OF_INSTALL_MSGS=true
ACCEPT_LICENSE_AGREEMENT=true
TOPLEVEL_COMPONENT={"oracle.client","10.2.0.1.0"}
SHOW_SPLASH_SCREEN=true
SELECTED_LANGUAGES={"en"}
COMPONENT_LANGUAGES={"en"}
INSTALL_TYPE="Custom"
OPTIONAL_CONFIG_TOOLS=
DEPENDENCY_LIST={"oracle.sqlj:10.2.0.1.0", "oracle.rdbms.util:10.2.0.1.0", "oracle.javavm.client:10.2.0.1.0", "oracle.sqlplus:10.2.0.1.0", "oracle.dbjava.jdbc:10.2.0.1.0", "oracle.ldap.client:10.2.0.1.0", "oracle.rdbms.oci:10.2.0.1.0", "oracle.precomp:10.2.0.1.0", "oracle.xdk:10.2.0.1.0", "oracle.swd.opatch:10.2.0.1.0", "oracle.network.aso:10.2.0.1.0", "oracle.network.client:10.2.0.1.0", "oracle.has.client:10.2.0.1.0"}
$ export ORACLE_BASE=/opt/oracle
$ unset ORACLE_HOME ORACLE_SID TNS_ADMIN
$ umask 022
$ env|grep ORA
ORACLE_BASE=/opt/oracle
$ ./runInstaller -silent -noconfig -responseFile /opt/oracle_download/opt/response/my-custom-10gR2-client.rsp
**************************************************************************
******

Your platform requires the root user to perform certain pre-installation
OS preparation. The root user should run the shell script 'rootpre.sh' be
fore
you proceed with Oracle installation. rootpre.sh can be found at the top
level
of the CD or the stage area.

Answer 'y' if root has run 'rootpre.sh' so you can proceed with Oracle
installation.
Answer 'n' to abort installation and then ask root to run 'rootpre.sh'.

**************************************************************************
******

Has 'rootpre.sh' been run by root? [y/n] (n)
y

Starting Oracle Universal Installer...

No pre-requisite checks found in oraparam.ini, no system pre-requisite checks will be executed.
Preparing to launch Oracle Universal Installer from /tmp/OraInstall2009-08-22_02-55-13AM. Please wait ...$ Oracle Universal

Installer, Version 10.2.0.1.0 Production
Copyright (C) 1999, 2005, Oracle. All rights reserved.

You can find a log of this install session at:
/opt/oracle_simon/oracle_base/logs/installActions2009-08-22_02-55-13AM.log
.................................................................................................... 100% Done.


Loading Product Information
........................................................................................................... 100% Done.


Analyzing dependencies
..........................................................
Starting execution of Prerequisites...
Total No of checks: 5

Performing check for CertifiedVersions
Checking operating system requirements ...
Expected result: One of 5200.004,5300.002
Actual Result: 5300.002
Check complete. The overall result of this check is: Passed


Check complete: Passed
=======================================================================
Performing check for Packages
Checking operating system package requirements ...
Checking for bos.adt.base(0.0); found bos.adt.base(5.3.0.51). Passed
Checking for bos.adt.lib(0.0); found bos.adt.lib(5.3.0.50). Passed
Checking for bos.adt.libm(0.0); found bos.adt.libm(5.3.0.40). Passed
Checking for bos.perf.libperfstat(0.0); found bos.perf.libperfstat(5.3.0.50). Passed
Checking for bos.perf.perfstat(0.0); found bos.perf.perfstat(5.3.0.50). Passed
Checking for bos.perf.proctools(0.0); found bos.perf.proctools(5.3.0.50). Passed
Check complete. The overall result of this check is: Passed


Check complete: Passed
=======================================================================
Performing check for Patches
Checking recommended operating system patches
Checking for IY59386(bos.rte.bind_cmds,5.3.0.1); found (bos.rte.bind_cmds,5.3.0.51). Passed
Checking for IY60930(bos.mp,5.3.0.1); found (bos.mp,5.3.0.51). Passed
Checking for IY60930(bos.mp64,5.3.0.1); found (bos.mp64,5.3.0.51). Passed
Checking for IY66513(bos.mp64,5.3.0.20); found (bos.mp64,5.3.0.51). Passed
Checking for IY66513(bos.mp,5.3.0.20); found (bos.mp,5.3.0.51). Passed
Checking for IY70159(bos.mp,5.3.0.22); found (bos.mp,5.3.0.51). Passed
Checking for IY70159(bos.mp64,5.3.0.22); found (bos.mp64,5.3.0.51). Passed
Checking for IY58143(bos.mp64,5.3.0.1); found (bos.mp64,5.3.0.51). Passed
Checking for IY58143(bos.acct,5.3.0.1); found (bos.acct,5.3.0.50). Passed
Checking for IY58143(bos.adt.include,5.3.0.1); found (bos.adt.include,5.3.0.51). Passed
Checking for IY58143(bos.adt.libm,5.3.0.1); found (bos.adt.libm,5.3.0.40). Passed
Checking for IY58143(bos.adt.prof,5.3.0.1); found Not found. Failed <<<< passed ="="="="="="="="="="="="="="="="="="="="="="="="="="="="="="="="="="="="="="="="="="="="="="="="="="="="="="="="="="="="="="="="="="="="="="="" passed ="="="="="="="="="="="="="="="="="="="="="="="="="="="="="="="="="="="="="="="="="="="="="="="="="="="="="="="="="="="="="="="="="="="="="="="" oracle_owner=" oracle" oracle_home=" /opt/oracle/product/10.2.0/client_1">

2009-08-02

* ordered pair
(a, b) = {{a}, {a, b}}

* binary relation
A set R is a binary relation if all elements of R are ordered pairs.

* Cartesian product
A × B = { (a, b) | a ∈ A and b ∈ B}
So, cartesian product of A and B is a relation in which every element of A is related to every element of B.

proof of existence: A × B = { (a, b) ∈ P(P(A ∪ B)) | a ∈ A and b ∈ B}

* function
A binary relation F is a function if aFb and aFc implies b = c for any a, b, and c.
In other words, a binary relation F is a function iff for every a from domain of F there is exactly one b such that aFb.

* classification of functions
f: A -> B is
surjective (or onto) if range of f is equal to the codomain B.
injective (or one-to-one) if a != b then f(a) != f(b).
bijective if f is surjective and injective.

* Mapping rule for counting
If f: A -> B is
surjective, then |A| >= |B|;
injective, then |A| <= |B|;
bijective, then |A| = |B|.

* pigeonhole principle
If more than n pigeons fly into n pigeonholes, then at least 2 pigeons must fly into some hole.

If |A| > |B|, then no function f: A -> B is injective.

If |A| > k|B|, then every function f: A -> B maps at least k+1 different elements of A to the same element of B.
* Cardinality of a set
[Definition] Sets A and B have the same cardinality (are equipotent) if there is a one-to-one mapping of A onto B.
(notated as |A| = |B|).
(this is bijection rule for counting)

* Cardinal number
There are sets called cardinal numbers with the property that (a) for every set X there is a unique cardinal |X| and (b) sets X and Y are equipotent iff |X| is equals to |Y|.

* Cardinality of a union
|A ∪ B| = |A| + |B| if A and B are disjoint
(sum rule for counting)
proof: if |A| = a and |B| = b, i.e., there are bijections f: a -> A and g: b -> B, then f ∪ g is a bijection from a+b to A ∪ B.

* Cardinality of a cartesian product
|A × B| = |A| × |B|
(product rule for counting)
proof: similar to sum rule.

2009-08-01

Axioms of ZFC

* Definition of set by Georg Cantor
Unter einer Menge verstehen wir jede Zusammenfassung M von bestimmten wohlunterschiedenen Objekten in unserer Anschauung order unseres Denkens (welche die Elemente von M genannt werden) zu einem ganzen.
(A set is a collection into a whole of definite, distinct objects of our intuition or our thought. The objects are called elements (members) of the set.)

* ZFC : the Zermelo-Fraekel set theory with Choice
The axiom of existence: There exists a set which has no elements.
(empty set ∅ exists)

The axiom of extensionality: If every element of X is an element of Y and every element of Y is an element of X, then X = Y.
(2 sets are identical if they have same elements)

The axiom schema of comprehension: Let P(x) be a property of x. For any A, there is B such that x ∈ A and P(x) holds.
( {x | x ∈ A and P(x)} exists )

The axiom of pair: For any A and B, there is C such that x ∈ C if and only if x = A or x = B.
(C = {A, B} = unordered pair of A and B)

The axiom of union: For any S, there is U such that x ∈ U if and only if x ∈ A for some A ∈ S.
(ex: for S = {A, B}, there is ∪S such that x ∈ ∪{A, B} iff x ∈ A or x ∈ B. ∪S = ∪{A, B} = A ∪ B)

The axiom of power set: For any S, there is P such that X ∈ P if and only if X ⊆ S.

The axiom of infinity: An inductive set exists.
( I is inductive when (a) 0 ∈ I and (b) if n ∈ I, then (n + 1) ∈ I.
0 is the empty set ∅, by definition.
n + 1 is the successor of n defined as n ∪ {n})

The axiom schema of replacement: Let P(x, y) be a property such that for every x there is a unique y for which P(x, y) holds. For every A there is B such that for every x ∈ A there is y ∈ B for which P(x, y) holds.

The axiom of choice: Every system of sets has a choice function.
(choice function (or selector) of a set S is a function defined on S such that g(X) ∈ X for every nonempty X ∈ S.
For S = {{1, 2}, {2, 3, 4}, ∅}, g = { ({1,2}, 1), ({2, 3, 4}, 2), (∅, ∅)} is a selector of S).

2009-07-29

Fullwidth characters vs halfwidth characters

As of Unicode 5.1, 225 fullwidth and halfwidth characters for CJK are assigned in FF00 to FFEF range.
Following is the list of printable characters in this range, except halfwidth Hangul jamo.

1. Fullwidth(전각, 全角, zenkaku) ASCII and halfwidth(반각, 半角, hankaku) Katakana
* Fullwidth ASCII variants
!"#$%&'()*+,-./
0123456789:;<=>?@
ABCDEFGHIJKLMNOPQRSTUVWXYZ
[\]^_`
abcdefghijklmnopqrstuvwxyz
{|}~

* Fullwidth brackets
I have no available fonts for
U+FF5F #FULLWIDTH LEFT WHITE PARENTHESIS
U+FF60 #FULLWIDTH RIGHT WHITE PARENTHESIS


* Halfwidth CJK punctuation
。「」、

* Halfwidth Katakana variants
・ヲァィゥェォャュョッーアイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワン゙゚

* Halfwidth Hangul variants
I have no available fonts.

* Fullwidth symbol variants
¢£¬ ̄¦¥₩

* Halfwidth symbol variants
│←↑→↓■○

2. Corresponding halfwidth ASCII and fullwidth Katakana
* Halfwidth ASCII variants
!"#$%&'()*+,-./
0123456789:;<=>?@
ABCDEFGHIJKLMNOPQRSTUVWXYZ
[\]^_`
abcdefghijklmnopqrstuvwxyz
{|}~

* Halfwidth brackets
I have no available fonts for
U+2985 #LEFT WHITE PARENTHESIS
U+2986 #RIGHT WHITE PARENTHESIS

* Fullwidth CJK punctuation
。「」、

* Fullwidth Katakana variants
・ヲァィゥェォャュョッーアイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワン゛゜

* Fullwidth Hangul variants
ㄱㄲㄳㄴㄵㄶㄷㄸㄹㄺㄻㄼㄽㄾㄿㅀㅁㅂㅃㅄㅅㅆㅇㅈㅉㅊㅋㅌㅍㅎ
ㅏㅐㅑㅒㅓㅔㅕㅖㅗㅘㅙㅚㅛㅜㅝㅞㅟㅠㅡㅢㅣ

* Halfwidth symbol variants
¢£¬¯¦¥₩

* Fullwidth symbol variants
│←↑→↓■○

2009-07-26

test1

test1
가나다