달력

122024  이전 다음

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

'분류 전체보기'에 해당되는 글 279건

  1. 2008.05.15 리눅스 cmdline
  2. 2008.05.15 NIO FileCopy
  3. 2008.05.15 jdk 1.5 패키지 확장
  4. 2008.05.15 java.util.Properties - loadFromXML
  5. 2008.05.14 날짜
  6. 2008.05.14 timeout test - jmapper
  7. 2008.05.14 TXID 사용
  8. 2006.10.27 utf-8 인코딩을 이용한 한글 url 처리
  9. 2006.09.25 aix, linux간의 data 이동 혹은 공유
  10. 2006.07.22 cygwin

리눅스 cmdline

OS 2008. 5. 15. 01:29

Command Description
apropos whatis Show commands pertinent to string. See also threadsafe
man -t man | ps2pdf - > man.pdf make a pdf of a manual page
  which command Show full path name of command
  time command See how long a command takes
time cat Start stopwatch. Ctrl-d to stop. See also sw
nice info Run a low priority command (The "info" reader in this case)
renice 19 -p $$ Make shell (script) low priority. Use for non interactive tasks
dir navigation
cd - Go to previous directory
cd Go to $HOME directory
  (cd dir && command) Go to dir, execute command and return to current dir
pushd . Put current dir on stack so you can popd back to it
alias l='ls -l --color=auto' quick dir listing
ls -lrt List files by date. See also newest and find_mm_yyyy
ls /usr/bin | pr -T9 -W$COLUMNS Print in 9 columns to width of terminal
  find -name '*.[ch]' | xargs grep -E 'expr' Search 'expr' in this dir and below. See also findrepo
  find -type f -print0 | xargs -r0 grep -F 'example' Search all regular files for 'example' in this dir and below
  find -maxdepth 1 -type f | xargs grep -F 'example' Search all regular files for 'example' in this dir
  find -maxdepth 1 -type d | while read dir; do echo $dir; echo cmd2; done Process each item with multiple commands (in while loop)
find -type f ! -perm -444 Find files not readable by all (useful for web site)
find -type d ! -perm -111 Find dirs not accessible by all (useful for web site)
locate -r 'file[^/]*\.txt' Search cached index for names. This re is like glob *file*.txt
look reference Quickly search (sorted) dictionary for prefix
grep --color reference /usr/share/dict/words Highlight occurances of regular expression in dictionary
archives and compression
  gpg -c file Encrypt file
  gpg file.gpg Decrypt file
  tar -c dir/ | bzip2 > dir.tar.bz2 Make archive of dir/
  bzip2 -dc dir.tar.bz2 | tar -x Extract archive (use gzip instead of bzip2 for tar.gz files)
  tar -c dir/ | gzip | gpg -c | ssh user@remote 'dd of=dir.tar.gz.gpg' Make encrypted archive of dir/ on remote machine
  find dir/ -name '*.txt' | tar -c --files-from=- | bzip2 > dir_txt.tar.bz2 Make archive of subset of dir/ and below
  find dir/ -name '*.txt' | xargs cp -a --target-directory=dir_txt/ --parents Make copy of subset of dir/ and below
  ( tar -c /dir/to/copy ) | ( cd /where/to/ && tar -x -p ) Copy (with permissions) copy/ dir to /where/to/ dir
  ( cd /dir/to/copy && tar -c . ) | ( cd /where/to/ && tar -x -p ) Copy (with permissions) contents of copy/ dir to /where/to/
  ( tar -c /dir/to/copy ) | ssh -C user@remote 'cd /where/to/ && tar -x -p' Copy (with permissions) copy/ dir to remote:/where/to/ dir
  dd bs=1M if=/dev/sda | gzip | ssh user@remote 'dd of=sda.gz' Backup harddisk to remote machine
rsync (Use the --dry-run option for testing)
  rsync -P rsync://rsync.server.com/path/to/file file Only get diffs. Do multiple times for troublesome downloads
  rsync --bwlimit=1000 fromfile tofile Locally copy with rate limit. It's like nice for I/O
  rsync -az -e ssh --delete ~/public_html/ remote.com:'~/public_html' Mirror web site (using compression and encryption)
  rsync -auz -e ssh remote:/dir/ . && rsync -auz -e ssh . remote:/dir/ Synchronize current directory with remote one
ssh (Secure SHell)
  ssh $USER@$HOST command Run command on $HOST as $USER (default command=shell)
ssh -f -Y $USER@$HOSTNAME xeyes Run GUI command on $HOSTNAME as $USER
  scp -p -r $USER@$HOST: file dir/ Copy with permissions to $USER's home directory on $HOST
  ssh -g -L 8080:localhost:80 root@$HOST Forward connections to $HOSTNAME:8080 out to $HOST:80
  ssh -R 1434:imap:143 root@$HOST Forward connections from $HOST:1434 in to imap:143
wget (multi purpose download tool)
(cd cmdline && wget -nd -pHEKk http://www.pixelbeat.org/cmdline.html) Store local browsable version of a page to the current dir
  wget -c http://www.example.com/large.file Continue downloading a partially downloaded file
  wget -r -nd -np -l1 -A '*.jpg' http://www.example.com/dir/ Download a set of files to the current directory
  wget ftp://remote/file[1-9].iso/ FTP supports globbing directly
wget -q -O- http://www.pixelbeat.org/timeline.html | grep 'a href' | head Process output directly
  echo 'wget url' | at 01:00 Download url at 1AM to current dir
  wget --limit-rate=20k url Do a low priority download (limit to 20KB/s in this case)
  wget -nv --spider --force-html -i bookmarks.html Check links in a file
  wget --mirror http://www.example.com/ Efficiently update a local copy of a site (handy from cron)
networking (Note ifconfig, route, mii-tool, nslookup commands are obsolete)
  ethtool eth0 List ethernet interface status
  ethtool --change eth0 autoneg off speed 100 duplex full Manually set ethernet interface speed
  iwconfig eth1 List wireless interface status
  iwconfig eth1 rate 1Mb/s fixed Manually set wireless interface speed
iwlist scan list wireless networks in range
ip link show List network interfaces
  ip link set dev eth0 name wan Rename interface eth0 to wan
  ip link set dev eth0 up Bring interface eth0 up (or down)
ip addr show List addresses for interfaces
  ip addr add 1.2.3.4/24 brd + dev eth0 Add (or del) ip and mask (255.255.255.0)
ip route show List routing table
  ip route add default via 1.2.3.254 Set default gateway to 1.2.3.254
tc qdisc add dev lo root handle 1:0 netem delay 20msec Add 20ms latency to loopback device (for testing)
tc qdisc del dev lo root Remove latency added above
host pixelbeat.org Lookup DNS ip address for name or vice versa
hostname -i Lookup local ip address (equivalent to host `hostname`)
whois pixelbeat.org Lookup whois info for hostname or ip address
netstat -tupl List internet services on a system
netstat -tup List active connections to/from system
windows networking (Note samba is the package that provides all this windows specific networking support)
smbtree Find windows machines. See also findsmb
  nmblookup -A 1.2.3.4 Find the windows (netbios) name associated with ip address
  smbclient -L windows_box List shares on windows machine or samba server
  mount -t smbfs -o fmask=666,guest //windows_box/share /mnt/share Mount a windows share
  echo 'message' | smbclient -M windows_box Send popup to windows machine (off by default in XP sp2)
math
echo '(1 + sqrt(5))/2' | bc -l Quick math (Calculate φ). See also bc
echo 'pad=20; min=64; (100*10^6)/((pad+min)*8)' | bc More complex (int) e.g. This shows max FastE packet rate
echo 'pad=20; min=64; print (100E6)/((pad+min)*8)' | python Python handles scientific notation
echo 'pad=20; plot [64:1518] (100*10**6)/((pad+x)*8)' | gnuplot -persist Plot FastE packet rate vs packet size
echo 'obase=16; ibase=10; 64206' | bc Base conversion (decimal to hexadecimal)
echo $((0x2dec)) Base conversion (hex to dec) ((shell arithmetic expansion))
units -t '100m/9.74s' 'miles/hour' Unit conversion (metric to imperial)
units -t '500GB' 'GiB' Unit conversion (SI to IEC prefixes)
units -t '1 googol' Definition lookup
seq 100 | (tr '\n' +; echo 0) | bc Add a column of numbers. See also add and funcpy
text manipulation (Note sed uses stdin and stdout, so if you want to edit files, append <oldfile >newfile)
  sed 's/string1/string2/g' Replace string1 with string2
  sed 's/\(.*\)1/\12/g' Modify anystring1 to anystring2
  sed '/ *#/d; /^ *$/d' Remove comments and blank lines
  sed ':a; /\\$/N; s/\\\n//; ta' Concatenate lines with trailing \
  sed 's/[ \t]*$//' Remove trailing spaces from lines
  sed 's/\([\\`\\"$\\\\]\)/\\\1/g' Escape shell metacharacters active within double quotes
seq 10 | sed "s/^/      /;s/ *\(.\{7,\}\)/\1/" Right align numbers
  sed -n '1000p;1000q' Print 1000th line
  sed -n '10,20p;20q' Print lines 10 to 20
  sed -n 's/.*<title>\(.*\)<\/title>.*/\1/ip;T;q' Extract title from HTML web page
  sort -t. -k1,1n -k2,2n -k3,3n -k4,4n Sort IPV4 ip addresses
echo 'Test' | tr '[:lower:]' '[:upper:]' Case conversion
tr -dc '[:print:]' < /dev/urandom Filter non printable characters
grep 'processor' /proc/cpuinfo | wc -l Count lines
set operations (Note you can export LANG=C for speed. Also these assume no duplicate lines within a file)
  sort file1 file2 | uniq Union of unsorted files
  sort file1 file2 | uniq -d Intersection of unsorted files
  sort file1 file1 file2 | uniq -u Difference of unsorted files
  sort file1 file2 | uniq -u Symmetric Difference of unsorted files
  comm file1 file2 | sed 's/^\t*//' Union of sorted files
  comm -12 file1 file2 Intersection of sorted files
  comm -13 file1 file2 Difference of sorted files
  comm -3 file1 file2 | sed 's/^\t*//' Symmetric Difference of sorted files
calendar
cal -3 Display a calendar
cal 9 1752 Display a calendar for a particular month year
date -d fri What date is it this friday. See also day
date --date='25 Dec' +%A What day does xmas fall on, this year
date --date '1970-01-01 UTC 2147483647 seconds' Convert number of seconds since the epoch to a date
TZ=':America/Los_Angeles' date What time is it on West coast of US (use tzselect to find TZ)
  echo "mail -s 'get the train' P@draigBrady.com < /dev/null" | at 17:45 Email reminder
echo "DISPLAY=$DISPLAY xmessage cooker" | at "NOW + 30 minutes" Popup reminder
locales
printf "%'d\n" 1234 Print number with thousands grouping appropriate to locale
BLOCK_SIZE=\'1 ls -l get ls to do thousands grouping appropriate to locale
echo "I live in `locale territory`" Extract info from locale database
LANG=en_IE.utf8 locale int_prefix Lookup locale info for specific country. See also ccodes
locale | cut -d= -f1 | xargs locale -kc | less List fields available in locale database
CDs
  gzip < /dev/cdrom > cdrom.iso.gz Save copy of data cdrom
  mkisofs -V LABEL -r dir | gzip > cdrom.iso.gz Create cdrom image from contents of dir
  mount -o loop cdrom.iso /mnt/dir Mount the cdrom image at /mnt/dir (read only)
  cdrecord -v dev=/dev/cdrom blank=fast Clear a CDRW
  gzip -dc cdrom.iso.gz | cdrecord -v dev=/dev/cdrom - Burn cdrom image (use dev=ATAPI -scanbus to confirm dev)
  cdparanoia -B Rip audio tracks from CD to wav files in current dir
  cdrecord -v dev=/dev/cdrom -audio *.wav Make audio CD from all wavs in current dir (see also cdrdao)
  oggenc --tracknum='track' track.cdda.wav -o 'track.ogg' Make ogg file from wav file
disk space (See also FSlint)
ls -lSr Show files by size, biggest last
du -s * | sort -k1,1rn | head Show top disk users in current dir. See also dutop
df -h Show free disk space
df -i Show free inodes
fdisk -l Show disks partitions sizes and types (run as root)
rpm -q -a --qf '%10{SIZE}\t%{NAME}\n' | sort -k1,1n List all packages by installed size (Bytes) on rpm distros
dpkg-query -W -f='${Installed-Size;10}\t${Package}\n' | sort -k1,1n List all packages by installed size (KBytes) on deb distros
dd bs=1 seek=2TB if=/dev/null of=ext3.test Create a large test file (taking no space). See also truncate
monitoring/debugging
tail -f /var/log/messages Monitor messages in a log file
strace -c ls >/dev/null Summarise/profile system calls made by command
strace -f -e open ls >/dev/null List system calls made by command
ltrace -f -e getenv ls >/dev/null List library calls made by command
lsof -p $$ List paths that process id has open
lsof ~ List processes that have specified path open
tcpdump not port 22 Show network traffic except ssh. See also tcpdump_not_me
ps -e -o pid,args --forest List processes in a hierarchy
ps -e -o pcpu,cpu,nice,state,cputime,args --sort pcpu | sed '/^ 0.0 /d' List processes by % cpu usage
ps -e -orss=,args= | sort -b -k1,1n | pr -TW$COLUMNS List processes by mem usage. See also ps_mem.py
ps -C firefox-bin -L -o pid,tid,pcpu,state List all threads for a particular process
ps -p 1,2 List info for particular process IDs
last reboot Show system reboot history
free -m Show amount of (remaining) RAM (-m displays in MB)
watch -n1 'cat /proc/interrupts' Watch changeable data continuously
System information (see also sysinfo) ('#' means root access is required)
uname -a Show kernel version and system architecture
head -n1 /etc/issue Show name and version of distribution
cat /proc/partitions Show all partitions registered on the system
grep MemTotal /proc/meminfo Show RAM total seen by the system
grep "model name" /proc/cpuinfo Show CPU(s) info
lspci -tv Show PCI info
lsusb -tv Show USB info
mount | column -t Show mounted filesystems on the system (and align output)
# dmidecode -q | less Display SMBIOS/DMI information
# smartctl -A /dev/sda | grep Power_On_Hours How long has this disk (system) been powered on in total
# hdparm -i /dev/sda Show info about disk sda
# hdparm -tT /dev/sda Do a read speed test on disk sda
# badblocks -s /dev/sda Test for unreadable blocks on disk sda
recode (Obsoletes iconv, dos2unix, unix2dos)
recode -l | less Show available conversions (aliases on each line)
  recode windows-1252.. file_to_change.txt Windows "ansi" to local charset (auto does CRLF conversion)
  recode utf-8/CRLF.. file_to_change.txt Windows utf8 to local charset
  recode iso-8859-15..utf8 file_to_change.txt Latin9 (western europe) to utf8
  recode ../b64 < file.txt > file.b64 Base64 encode
  recode /qp.. < file.txt > file.qp Quoted printable decode
  recode ..HTML < file.txt > file.html Text to HTML
recode -lf windows-1252 | grep euro Lookup table of characters
echo -n 0x80 | recode latin-9/x1..dump Show what a code represents in latin-9 charmap
echo -n 0x20AC | recode ucs-2/x2..latin-9/x Show latin-9 encoding
echo -n 0x20AC | recode ucs-2/x2..utf-8/x Show utf-8 encoding
interactive
mc Powerful file manager that can browse rpm, tar, ftp, ssh, ...
screen Virtual terminals with detach capability, ...
links Web browser
gnuplot Interactive/scriptable graphing
octave Matlab like environment
Miscellaneous
alias hd='od -Ax -tx1z -v' Handy hexdump. (usage e.g.: • hd /proc/self/cmdline | less)
alias realpath='readlink -f' Canonicalize path. (usage e.g.: • realpath ~/../$USER)
set | grep $USER Search current environment
  touch -c -t 0304050607 file Set file timestamp (YYMMDDhhmm)

'OS' 카테고리의 다른 글

grep과 find 활용  (0) 2008.06.04
하드웨어정보 shell  (0) 2008.05.20
UNIX 하드웨어 정보  (0) 2008.05.20
cygwin  (0) 2006.07.22
filedescriptor  (0) 2006.01.02
Posted by 알 수 없는 사용자
|

NIO FileCopy

java 2008. 5. 15. 01:25

http://qola.springnote.com/pages/713790

package example.data;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.nio.channels.FileChannel;


public class FChannel{
 public FChannel(){
 }
 public static void main(String[] args){
  long size=0;

  try{
   //원본파일
   FileInputStream fis=new FileInputStream("c:\\aaa.zip");

   //카피할파일
   FileOutputStream fos=new FileOutputStream("c:\\aaa_copied.zip");

   //File Stream으로 부터 FileChannel을 가져온다.
   FileChannel fcin=fis.getChannel();
   FileChannel fcout=fos.getChannel();

   size=fcin.size();

   System.out.println("File Size: " +size);
   //transferTo 메소드를 이용하여 카피할 파일의 채널을 지정한다.
   //옮길 포지션을 정하는데, 여기선 0부터 파일 크기만큼으로 하였다.
   fcin.transferTo(0,size,fcout);

   fcout.close();
   fcin.close();
   fos.close();
   fis.close();

   System.out.println("File Copy Ok");
  }
  catch (Exception e){
   e.printStackTrace();
  }
 }
}

'java' 카테고리의 다른 글

IBM HOST CICS Transaction 연동 (NT) - 자바서비스넷  (0) 2008.07.03
jad 옵션  (0) 2008.06.05
jdk 1.5 패키지 확장  (0) 2008.05.15
java.util.Properties - loadFromXML  (0) 2008.05.15
날짜  (0) 2008.05.14
Posted by 알 수 없는 사용자
|

jdk 1.5 패키지 확장

java 2008. 5. 15. 01:23

http://qola.springnote.com/pages/24914

java.lang.ProcessBuilder
-----------------------------------------------------------------------------------
Runtime.exec 보다 간단한 방법으로 서브 프로세스를 호출
ex)
ProcessBuilder pb = new ProcessBuilder("myCommand", "myArg1", "myArg2");
Map<String, String> env = pb.environment();
env.put("VAR1", "myValue");
env.remove("OTHERVAR");
env.put("VAR2", env.get("VAR1") + "suffix");
pb.directory("myDir");
Process p = pb.start();


java.util.Formatter
----------------------------------------------------------------------------------
   StringBuilder sb = new StringBuilder();
   // Send all output to the Appendable object sb
   Formatter formatter = new Formatter(sb, Locale.US);

   // Explicit argument indices may be used to re-order output.
   formatter.format("%4$2s %3$2s %2$2s %1$2s", "a", "b", "c", "d")
   // -> " d  c  b  a"

   // Optional locale as the first argument can be used to get
   // locale-specific formatting of numbers.  The precision and width can be
   // given to round and align the value.
   formatter.format(Locale.FRANCE, "e = %+10.4f", Math.E);
   // -> "e =    +2,7183"

   // The '(' numeric flag may be used to format negative numbers with
   // parentheses rather than a minus sign.  Group separators are
   // automatically inserted.
   formatter.format("Amount gained or lost since last statement: $ %(,.2f",
                    balanceDelta);
   // -> "Amount gained or lost since last statement: $ (6,217.58)"


java.util.Scanner
----------------------------------------------------------------------------------
Scanner sc = new Scanner(System.in);
int i = sc.nextInt();

Scanner sc = new Scanner(new File("myNumbers"));
while (sc.hasNextLong()) { long aLong = sc.nextLong();
}

String input = "1 fish 2 fish red fish blue fish";
Scanner s = new Scanner(input). useDelimiter("\\s*fish\\s*");
// "\s* : 0 또는 하나 이상의 공백 반각 스페이스  
System.out.println(s.nextInt());
System.out.println(s.nextInt());
System.out.println(s.next());
System.out.println(s.next());
s.close();

String input = "1 fish 2 fish red fish blue fish";
Scanner s = new Scanner(input);
s.findInLine("(\\d+) fish (\\d+) fish (\\w+) fish (\\w+)");
MatchResult result = s.match();
for (int i=0;i<=result.groupCount();i++) { // groupCount(): 정규 표현 그룹의 수
  System.out.println(result.group(i)); // group() 일치한 입력 부분
}
s.close();
-->
1 fish 2 fish red fish blue  
1  
2
red
blue


java.util.concurrent
----------------------------------------------------------------------------------
http://java.sun.com/j2se/1.5.0/docs/api/java/util/concurrent/package-summary.html
http://kr.sun.com/developers/techtips/c2005_0216.html
( Semaphore, CountDownLatch,  Exchanger  를 이용한 동기화 )
http://sangchin.byus.net/FlashHelp/Java_util_concurrent/fixedworkqueue.html
( Creating a Bounded Work Queus )
http://www.java2s.com/Code/JavaAPI/java.util.concurrent/Catalogjava.util.concurrent.htm
( CyclicBarrier , Executors, ExecutorService, TimeUnit 샘플)
http://www.informit.com/articles/article.asp?p=335378&rl=1
(Using the new Concurrent Utility Classes in Java 5.0)

'java' 카테고리의 다른 글

jad 옵션  (0) 2008.06.05
NIO FileCopy  (0) 2008.05.15
java.util.Properties - loadFromXML  (0) 2008.05.15
날짜  (0) 2008.05.14
utf-8 인코딩을 이용한 한글 url 처리  (0) 2006.10.27
Posted by 알 수 없는 사용자
|

http://qola.springnote.com/pages/24908

JDK1.5에는 Properties 클래스에  loadFromXML(InputStream)과 storeToXML(OutputStream,String,String) 메소드가 추가되었다.

Properties 를 사용할때 항상 문제가 되던 한글 처리가 XML을 로드하게 되면서 간단하게
<?xml version="1.0" encoding="UTF-8"?> 

하지만 아직 ResourceBundle 에선 ISO-8859-1로 인코딩된 properties 파일만 읽을수 있다.
이건 JDK 6 버전에서 ResourceBundle.control  이란 녀석을 확장해서 처리 가능하다.

ResourceBundle bundle =
ResourceBundle.getBundle("messages", new MyControl());
: MyControl 은 Resourcebundle.control  의 sub class
: java Class, properties, xml 외에도 원하는 타입으로 사용 가능하다.

/**
* JDK 6's {@link ResourceBundle.Control} subclass that allows
* loading of bundles in XML format.
* The bundles are searched first as Java classes, then as
* properties files (these two methods are the standard
* search mechanism of ResourceBundle), then as XML properties
* files.
* The filename extension of the XML properties files is assumed
* to be *.properties.xml
*/
public class ExtendedControl extends ResourceBundle.Control{  
private static final String FORMAT_XML_SUFFIX = "properties.xml";  
private static final String FORMAT_XML = "java." + FORMAT_XML_SUFFIX;  
private static final List<String> FORMATS;  

static    {      
List<String> formats = new ArrayList<String>(FORMAT_DEFAULT);      
formats.add(FORMAT_XML);      
FORMATS = Collections.unmodifiableList(formats);  
}  

@Override  
public List<String> getFormats(String baseName)    {
return FORMATS;  
}  

@Override  
public ResourceBundle newBundle(String baseName, Locale locale,String format,
 ClassLoader loader, boolean reload)
throws IllegalAccessException, InstantiationException, IOException    {
if (!FORMAT_XML.equals(format))
return super.newBundle(baseName, locale, format, loader, reload);

String bundleName = toBundleName(baseName, locale);
String resourceName = toResourceName(bundleName, FORMAT_XML_SUFFIX);
final URL resourceURL = loader.getResource(resourceName);
if (resourceURL == null) return null;      
InputStream stream = getResourceInputStream(resourceURL, reload);

try        {          
PropertyXMLResourceBundle result = new PropertyXMLResourceBundle();
result.load(stream);          
return result;      
}        finally        {
stream.close();      
}  
}

private InputStream getResourceInputStream(final URL resourceURL,
boolean reload)            throws IOException    {
if (!reload) return resourceURL.openStream();      
try        {          
// This permission has already been checked by          
// ClassLoader.getResource(String), which will return null          
// in case the code has not enough privileges.          
return AccessController.doPrivileged(    
new PrivilegedExceptionAction<InputStream>()            {  
public InputStream run() throws IOException                {  
URLConnection connection = resourceURL.openConnection();        
connection.setUseCaches(false);                
return connection.getInputStream();          
}          
});      
}        catch (PrivilegedActionException x)        {      
throw (IOException)x.getCause();      
}  
}  

/**    
* ResourceBundle that loads definitions from an XML properties file.  
*/  
public static class PropertyXMLResourceBundle extends ResourceBundle    {  
private final Properties properties = new Properties();    
public void load(InputStream stream) throws IOException {        
properties.loadFromXML(stream);      
}    

protected Object handleGetObject(String key)        {  
return properties.getProperty(key);      
  }    

public Enumeration<String> getKeys()        {
final Enumeration<Object> keys = properties.keys();
return new Enumeration<String>()            {
public boolean hasMoreElements()                {
return keys.hasMoreElements();            
}            


public String nextElement()            {    
return (String)keys.nextElement();      
}        
};      
}  
}}

http://bordet.blogspot.com/2007/01/utf-8-handling-for-resourcebundle-and.html

'java' 카테고리의 다른 글

NIO FileCopy  (0) 2008.05.15
jdk 1.5 패키지 확장  (0) 2008.05.15
날짜  (0) 2008.05.14
utf-8 인코딩을 이용한 한글 url 처리  (0) 2006.10.27
객체직렬화를 통해 직렬화된 객체를 Oracle BLOB에 저장하기  (0) 2006.07.16
Posted by 알 수 없는 사용자
|

날짜

java 2008. 5. 14. 23:50

시스템의 밀리초 구하기.(국제표준시각(UTC, GMT) 1970/1/1/0/0/0 으로부터 경과한 시각)
------------------------------------------------------------------
// 밀리초 단위(*1000은 1초), 음수이면 이전 시각
long time = System.currentTimeMillis ( );
System.out.println ( time.toString ( ) );
------------------------------------------------------------------

현재 시각을 가져오기.
------------------------------------------------------------------
Date today = new Date ();
System.out.println ( today );

결과 : Sat Jul 12 16:03:00 GMT+01:00 2000
------------------------------------------------------------------

경과시간(초) 구하기
------------------------------------------------------------------
long time1 = System.currentTimeMillis ();
long time2 = System.currentTimeMillis ();
system.out.println ( ( time2 - time1 ) / 1000.0 );
------------------------------------------------------------------

Date를 Calendar로 맵핑시키기
------------------------------------------------------------------
Date d = new Date ( );
Calendar c = Calendar.getInstance ( );
c.setTime ( d );
------------------------------------------------------------------

날짜(년/월/일/시/분/초) 구하기
------------------------------------------------------------------
import java.util.*;
import java.text.*;

SimpleDateFormat formatter = new SimpleDateFormat ( "yyyy.MM.dd HH:mm:ss", Locale.KOREA );
Date currentTime = new Date ( );
String dTime = formatter.format ( currentTime );
System.out.println ( dTime );
------------------------------------------------------------------

날짜(년/월/일/시/분/초) 구하기2
------------------------------------------------------------------
GregorianCalendar today = new GregorianCalendar ( );

int year = today.get ( today.YEAR );
int month = today.get ( today.MONTH ) + 1;
int yoil = today.get ( today.DAY_OF_MONTH );

GregorianCalendar gc = new GregorianCalendar ( );

System.out.println ( gc.get ( Calendar.YEAR ) );
System.out.println ( String.valueOf ( gc.get ( Calendar.MONTH ) + 1 ) );
System.out.println ( gc.get ( Calendar.DATE ) );
System.out.println ( gc.get ( DAY_OF_MONTH ) );
------------------------------------------------------------------

날짜(년/월/일/시/분/초) 구하기3
------------------------------------------------------------------
DateFormat df = DateFormat.getDateInstance(DateFormat.LONG, Locale.KOREA);
Calendar cal = Calendar.getInstance(Locale.KOREA);
nal = df.format(cal.getTime());
------------------------------------------------------------------

- 표준시간대를 지정하고 날짜를 가져오기.
------------------------------------------------------------------
TimeZone jst = TimeZone.getTimeZone ("JST");
Calendar cal = Calendar.getInstance ( jst ); // 주어진 시간대에 맞게 현재 시각으로 초기화된 GregorianCalender 객체를 반환.// 또는 Calendar now = Calendar.getInstance(Locale.KOREA);
System.out.println ( cal.get ( Calendar.YEAR ) + "년 " + ( cal.get ( Calendar.MONTH ) + 1 ) + "월 " + cal.get ( Calendar.DATE ) + "일 " + cal.get ( Calendar.HOUR_OF_DAY ) + "시 " +cal.get ( Calendar.MINUTE ) + "분 " + cal.get ( Calendar.SECOND ) + "초 " );

결과 : 2000년 8월 5일 16시 16분 47초
------------------------------------------------------------------

영어로된 날짜를 숫자로 바꾸기
------------------------------------------------------------------
Date myDate = new Date ( "Sun,5 Dec 1999 00:07:21" );
System.out.println ( myDate.getYear ( ) + "-" + myDate.getMonth ( ) + "-" + myDate.getDay ( ) );
------------------------------------------------------------------

"Sun, 5 Dec 1999 00:07:21"를 "1999-12-05"로 바꾸기
------------------------------------------------------------------
SimpleDateFormat formatter_one = new SimpleDateFormat ( "EEE, dd MMM yyyy hh:mm:ss",Locale.ENGLISH );
SimpleDateFormat formatter_two = new SimpleDateFormat ( "yyyy-MM-dd" );

String inString = "Sun, 5 Dec 1999 00:07:21";

ParsePosition pos = new ParsePosition ( 0 );
Date frmTime = formatter_one.parse ( inString, pos );
String outString = formatter_two.format ( frmTime );

System.out.println ( outString );
------------------------------------------------------------------

숫자 12자리를, 다시 날짜로 변환하기
------------------------------------------------------------------
Date conFromDate = new Date();
long ttl = conFromDate.parse ( "Dec 25, 1997 10:10:10" );
System.out.println ( ttl ); //예 938291839221

Date today = new Date ( ttl );
DateFormat format = DateFormat.getDateInstance ( DateFormat.FULL,Locale.US );
String formatted = format.format ( today );
System.out.println ( formatted );
------------------------------------------------------------------

특정일로부터 n일 만큼 이동한 날짜 구하기
------------------------------------------------------------------
특정일의 시간을 long형으로 읽어온다음..
날짜*24*60*60*1000 을 계산하여.
long형에 더해줍니다.
그리고 나서 Date클래스와 Calender클래스를 이용해서 날짜와 시간을 구하면 됩니다
------------------------------------------------------------------

특정일에서 일정 기간후의 날짜 구하기2
------------------------------------------------------------------
//iDay 에 입력하신 만큼 빼거나 더한 날짜를 반환 합니다.
import java.util.*;

public String getDate ( int iDay )
{
Calendar temp=Calendar.getInstance ( );
StringBuffer sbDate=new StringBuffer ( );

temp.add ( Calendar.DAY_OF_MONTH, iDay );

int nYear = temp.get ( Calendar.YEAR );
int nMonth = temp.get ( Calendar.MONTH ) + 1;
int nDay = temp.get ( Calendar.DAY_OF_MONTH );

sbDate.append ( nYear );
if ( nMonth < 10 )
sbDate.append ( "0" );
sbDate.append ( nMonth );
if ( nDay < 10 )
sbDate.append ( "0" );
sbDate.append ( nDay );

return sbDate.toString ( );
}
------------------------------------------------------------------

현재날짜에서 2달전의 날짜를 구하기
------------------------------------------------------------------
Calendar cal = Calendar.getInstance ( );//오늘 날짜를 기준으루..
cal.add ( cal.MONTH, -2 ); //2개월 전....
System.out.println ( cal.get ( cal.YEAR ) );
System.out.println ( cal.get ( cal.MONTH ) + 1 );
System.out.println ( cal.get ( cal.DATE ) );
------------------------------------------------------------------

달에 마지막 날짜 구하기
------------------------------------------------------------------
for ( int month = 1; month <= 12; month++ )
{
GregorianCalendar cld = new GregorianCalendar ( 2001, month - 1, 1 );
System.out.println ( month + "/" + cld.getActualMaximum ( Calendar.DAY_OF_MONTH ) );
}
------------------------------------------------------------------

해당하는 달의 마지막 일 구하기
------------------------------------------------------------------
GregorianCalendar today = new GregorianCalendar ( );
int maxday = today.getActualMaximum ( ( today.DAY_OF_MONTH ) );
System.out.println ( maxday );
------------------------------------------------------------------

특정일을 입력받아 해당 월의 마지막 날짜를 구하는 간단한 예제.(달은 -1 해준다.)...윤달 30일 31일 알아오기.
------------------------------------------------------------------
Calendar cal = Calendar.getInstance ( );
cal.set ( Integer.parseInt ( args[0] ), Integer.parseInt ( args [1] ) - 1, Integer.parseInt ( args [2] ) );
SimpleDateFormat dFormat = new SimpleDateFormat ( "yyyy-MM-dd" );
System.out.println ( "입력 날짜 " + dFormat.format ( cal.getTime ( ) ) );
System.out.println ( "해당 월의 마지막 일자 : " + cal.getActualMaximum ( Calendar.DATE ) );
------------------------------------------------------------------

해당월의 실제 날짜수 구하기 ( 1999년 1월달의 실제 날짜수를 구하기 )
------------------------------------------------------------------
Calendar calendar = Calendar.getInstance ( );
calendar.set ( 1999, 0, 1 );
int maxDays = calendar.getActualMaximum ( Calendar.DAY_OF_MONTH );
------------------------------------------------------------------

어제 날짜 구하기
------------------------------------------------------------------
오늘날짜를 초단위로 구해서 하루분을 빼주고 다시
셋팅해주면 쉽게 구할수 있죠..
setTime((기준일부터 오늘까지의 초를 구함) - 24*60*60)해주면 되겠죠..
------------------------------------------------------------------

어제 날짜 구하기2
------------------------------------------------------------------
import java.util.*;

public static Date getYesterday ( Date today )
{
if ( today == null )
throw new IllegalStateException ( "today is null" );
Date yesterday = new Date ( );
yesterday.setTime ( today.getTime ( ) - ( (long) 1000 * 60 * 60 * 24 ) );

return yesterday;
}
------------------------------------------------------------------

내일 날짜 구하기
------------------------------------------------------------------
Date today = new Date ( );
Date tomorrow = new Date ( today.getTime ( ) + (long) ( 1000 * 60 * 60 * 24 ) );
------------------------------------------------------------------

내일 날짜 구하기2
------------------------------------------------------------------
Calendar today = Calendar.getInstance ( );
today.add ( Calendar.DATE, 1 );
Date tomorrow = today.getTime ( );
------------------------------------------------------------------

오늘날짜에서 5일 이후 날짜를 구하기
------------------------------------------------------------------
Calendar cCal = Calendar.getInstance();
c.add(Calendar.DATE, 5);
------------------------------------------------------------------

날짜에 해당하는 요일 구하기
------------------------------------------------------------------
//DAY_OF_WEEK리턴값이 일요일(1), 월요일(2), 화요일(3) ~~ 토요일(7)을 반환합니다.
//아래 소스는 JSP일부입니다.
import java.util.*;

Calendar cal= Calendar.getInstance ( );
int day_of_week = cal.get ( Calendar.DAY_OF_WEEK );
if ( day_of_week == 1 )
m_week="일요일";
else if ( day_of_week == 2 )
m_week="월요일";
else if ( day_of_week == 3 )
m_week="화요일";
else if ( day_of_week == 4 )
m_week="수요일";
else if ( day_of_week == 5 )
m_week="목요일";
else if ( day_of_week == 6 )
m_week="금요일";
else if ( day_of_week == 7 )
m_week="토요일";

오늘은 : 입니다.
------------------------------------------------------------------

콤보박스로 선택된 날짜(예:20001023)를 통해 요일을 영문으로 가져오기
------------------------------------------------------------------
//gc.get(gc.DAY_OF_WEEK); 하면 일요일=1, 월요일=2, ..., 토요일=7이 나오니까,
//요일을 배열로 만들어서 뽑아내면 되겠죠.
GregorianCalendar gc=new GregorianCalendar ( 2000, 10 - 1 , 23 );
String [] dayOfWeek = { "", "Sun", "Mon", .... , "Sat" };
String yo_il = dayOfWeek ( gc.get ( gc.DAY_OF_WEEK ) );
------------------------------------------------------------------

두 날짜의 차이를 일수로 구하기
------------------------------------------------------------------
각각의 날짜를 Date형으로 만들어서 getTime()하면
long으로 값이 나오거든요(1970년 1월 1일 이후-맞던가?- 1/1000 초 단위로..)
그러면 이값의 차를 구해서요. (1000*60*60*24)로 나누어 보면 되겠죠.
------------------------------------------------------------------

두 날짜의 차이를 일수로 구하기2
------------------------------------------------------------------
import java.io.*;
import java.util.*;

Date today = new Date ( );
Calendar cal = Calendar.getInstance ( );
cal.setTime ( today );// 오늘로 설정.

Calendar cal2 = Calendar.getInstance ( );
cal2.set ( 2000, 3, 12 ); // 기준일로 설정. month의 경우 해당월수-1을 해줍니다.

int count = 0;
while ( !cal2.after ( cal ) )
{
count++;
cal2.add ( Calendar.DATE, 1 ); // 다음날로 바뀜

System.out.println ( cal2.get ( Calendar.YEAR ) + "년 " + ( cal2.get ( Calendar.MONTH ) + 1 ) + "월 " + cal2.get ( Calendar.DATE ) + "일" );
}

System.out.println ( "기준일로부터 " + count + "일이 지났습니다." );
------------------------------------------------------------------

두 날짜의 차이를 일수로 구하기3
------------------------------------------------------------------
import java.io.*;
import java.util.*;

public class DateDiff
{
public static int GetDifferenceOfDate ( int nYear1, int nMonth1, int nDate1, int nYear2, int nMonth2, int nDate2 )
{
Calendar cal = Calendar.getInstance ( );
int nTotalDate1 = 0, nTotalDate2 = 0, nDiffOfYear = 0, nDiffOfDay = 0;

if ( nYear1 > nYear2 )
{
for ( int i = nYear2; i < nYear1; i++ )
{
cal.set ( i, 12, 0 );
nDiffOfYear += cal.get ( Calendar.DAY_OF_YEAR );
}
nTotalDate1 += nDiffOfYear;
}
else if ( nYear1 < nYear2 )
{
for ( int i = nYear1; i < nYear2; i++ )
{
cal.set ( i, 12, 0 );
nDiffOfYear += cal.get ( Calendar.DAY_OF_YEAR );
}
nTotalDate2 += nDiffOfYear;
}

cal.set ( nYear1, nMonth1-1, nDate1 );
nDiffOfDay = cal.get ( Calendar.DAY_OF_YEAR );
nTotalDate1 += nDiffOfDay;

cal.set ( nYear2, nMonth2-1, nDate2 );
nDiffOfDay = cal.get ( Calendar.DAY_OF_YEAR );
nTotalDate2 += nDiffOfDay;

return nTotalDate1-nTotalDate2;
}

public static void main ( String args[] )
{
System.out.println ( "" + GetDifferenceOfDate (2000, 6, 15, 1999, 8, 23 ) );
}
}
------------------------------------------------------------------

파일에서 날짜정보를 가져오기
------------------------------------------------------------------
File f = new File ( directory, file );

Date date = new Date ( f.lastModified ( ) );
Calendar cal = Calendar.getInstance ( );
cal.setTime ( date );

System.out.println("Year : " + cal.get(Calendar.YEAR));
System.out.println("Month : " + (cal.get(Calendar.MONTH) + 1));
System.out.println("Day : " + cal.get(Calendar.DAY_OF_MONTH));
System.out.println("Hours : " + cal.get(Calendar.HOUR_OF_DAY));
System.out.println("Minutes : " + cal.get(Calendar.MINUTE));
System.out.println("Second : " + cal.get(Calendar.SECOND));
------------------------------------------------------------------

날짜형식으로 2000-01-03으로 처음에 인식을 시킨후
7일씩 증가해서 1년정도의 날짜를 출력해 주고 싶은데요.
------------------------------------------------------------------
SimpleDateFormat sdf = new SimpleDateFormat ( "yyyy-mm-dd" );
Calendar c = Calendar.getInstance ( );

for ( int i = 0; i < 48; i++ )
{
c.clear ( );
c.set ( 2000, 1, 3 - ( i * 7 ) );
java.util.Date d = c.getTime ( );
String thedate = sdf.format ( d );
System.out.println ( thedate );
}
------------------------------------------------------------------

쓰레드에서 날짜 바꾸면 죽는 문제
------------------------------------------------------------------
Main화면에 날짜와시간이Display되는 JPanel이 있습니다.
date로 날짜와 시간을 변경하면 Main화면의 날짜와 시간이 Display되는 Panel에
변경된 날짜가 Display되지 않고 Main화면이 종료되어 버립니다.

문제소스:
public void run ( )
{
while ( true )
{
try{
timer.sleep ( 60000 );
}
catch ( InterruptedException ex ) { }

lblTimeDate.setText ( fGetDateTime ( ) );
repaint ( );
}
}

public String fGetDateTime ( )
{
final int millisPerHour = 60 * 60 * 1000;
String DATE_FORMAT = "yyyy / MM / dd HH:mm";
SimpleDateFormat sdf = new SimpleDateFormat ( DATE_FORMAT );
SimpleTimeZone timeZone = new SimpleTimeZone ( 9 * millisPerHour, "KST" );
sdf.setTimeZone ( timeZone );

long time = System.currentTimeMillis ( );
Date date = new Date ( time );
return sdf.format ( date );
}

해답:
// 날짜와 요일 구한다. timezone 으로 날짜를 다시 셋팅하시면 됨니다.
public String getDate ( )
{
Date now = new Date ( );
SimpleDateFormat sdf4 = new SimpleDateFormat ( "yyyy/MM/dd HH:mm EE" );
sdf4.setTimeZone ( TimeZone.getTimeZone ( "Asia/Seoul" ) );

return sdf4.format ( now );
}
------------------------------------------------------------------

날짜와 시간이 유효한지 검사하려면...?
------------------------------------------------------------------
import java.util.*;
import java.text.*;

public class DateCheck
{
boolean dateValidity = true;

DateCheck ( String dt )
{
try
{
DateFormat df = DateFormat.getDateInstance ( DateFormat.SHORT );
df.setLenient ( false );
Date dt2 = df.parse ( dt );
}
catch ( ParseException e ) { this.dateValidity = false; }
catch ( IllegalArgumentException e ) { this.dateValidity = false; }
}

public boolean datevalid ( )
{
return dateValidity;
}

public static void main ( String args [] )
{
DateCheck dc = new DateCheck ( "2001-02-28" );
System.out.println ( " 유효한 날짜 : " + dc.datevalid ( ) );
}
}
------------------------------------------------------------------

두 날짜 비교하기(아래보다 정확)
------------------------------------------------------------------
그냥 날짜 두개를 long(밀리 세컨드)형으로 비교하시면 됩니다...

이전의 데이타가 date형으로 되어 있다면, 이걸 long형으로 변환하고.
현재 날짜(시간)은 System.currentTimeMillis()메소드로 읽어들이고,
두수(long형)를 연산하여 그 결과 값으로 비교를 하시면 됩니다.

만약 그 결과값이 몇시간 혹은 며칠차이가 있는지를 계산할려면,
결과값을 Calender의 setTimeInMillis(long millis) 메소드를 이용해
설정한다음 각각의 날짜나 시간을 읽어오시면 됩니다
------------------------------------------------------------------

두 날짜 비교하기2
------------------------------------------------------------------
//Calendar를 쓸 경우 데이타의 원본을 고치기 때문에 clone()을 사용하여
//복사한 후에 그 복사본을 가지고 비교한다
import java.util.*;
import java.util.Calendar.*;
import java.text.SimpleDateFormat;

public class DayComparisonTest
{
public static void main(String args[])
{
Calendar cal = Calendar.getInstance();
SimpleDateFormat dateForm = new SimpleDateFormat("yyyy-MM-dd");

Calendar aDate = Calendar.getInstance(); // 비교하고자 하는 임의의 날짜
aDate.set(2001, 0, 1);

Calendar bDate = Calendar.getInstance(); // 이것이 시스템의 날짜

// 여기에 시,분,초를 0으로 세팅해야 before, after를 제대로 비교함
aDate.set( Calendar.HOUR_OF_DAY, 0 );
aDate.set( Calendar.MINUTE, 0 );
aDate.set( Calendar.SECOND, 0 );
aDate.set( Calendar.MILLISECOND, 0 );

bDate.set( Calendar.HOUR_OF_DAY, 0 );
bDate.set( Calendar.MINUTE, 0 );
bDate.set( Calendar.SECOND, 0 );
bDate.set( Calendar.MILLISECOND, 0 );


if (aDate.after(bDate)) // aDate가 bDate보다 클 경우 출력
System.out.println("시스템 날짜보다 뒤일 경우 aDate = " + dateForm.format(aDate.getTime()));
else if (aDate.before(bDate)) // aDate가 bDate보다 작을 경우 출력
System.out.println("시스템 날짜보다 앞일 경우 aDate = " + dateForm.format(aDate.getTime()));
else // aDate = bDate인 경우
System.out.println("같은 날이구만");
}
}
Posted by 알 수 없는 사용자
|

timeout test - jmapper

2008. 5. 14. 23:01

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.

TXID 사용

2008. 5. 14. 20:05

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.


개요

    * utf-8 은 유니코드를 위한 가변길이 문자 인코딩 방식중 하나로 켄 톰프슨과 롭 파이크가 만들었다.
    * 유니코드 한문자를 표시하기 위해 1byte~4byte 까지 가변적으로 표현한다.
    * U+0000부터 U+007F 범위에 있는 아스키 문자들은 UTF-8에서 1바이트만으로 표시된다. 4바이트로 표현되는 문자는 모두 기본 다중언어 평면(BMP) 바깥의 유니코드 문자이며, 거의 사용되지 않는다.

구조

    * U+007F(0~127) 까지의 문자는 7비트 아스키 문자와 동일하게 표시된다.
    * U+007F 이후의 문자는 4byte 까지의 비트 패턴으로 표시되며 7비트 아스키 문자와 혼동되지 않게 하기 위해 모든 바이트의 최상위 비트는 1 이다.

코드 범위         UTF-16BE 표현         UTF-8 표현         설명
000000 ~00007F         00000000 0xxxxxxx         0xxxxxxx         아스키와 동일한 범위
000080 ~0007FF         00000xxx xxxxxxxx         110xxxxx 10xxxxxx         첫바이트는 110 으로 시작하고, 나머지 바이트는 10으로 시작함
000800 ~00FFFF         xxxxxxxx xxxxxxxx         1110xxxx 10xxxxxx 10xxxxxx         첫바이트는 1110으로 시작하고 , 나머지는 10으로 시작함
010000 ~10FFFF         110110yy yyxxxxxx 110111xx xxxxxxxx         11110zzz 10zzxxxx 10xxxxxx 10xxxxxx         UTF-16 "surrogate pair" 영역(yyyy=zzzzz -1)


utf-8 인코딩 예제

'위'(한글) --> U+C7404(유니코드)
U+0800부터 U+FFFF 사이의 영역에 있으므로, 표에 따라 1110xxxx 10xxxxxx 10xxxxxx 형식으로 인코딩
C704(16진수) --> 1100-0111-0000-0100(2진수) --> 11101100 10011100 10000100(utf-8 인코딩)
결과적으로 이 문자는 3바이트로 인코딩 되면 16진수로 표기하면 EC 9C 84가 된다.

(첫 128 문자는 1바이트로 표시되고, 그 다음 1920 문자 (판독 기호가 붙은 라틴 문자, 그리스 문자, 키릴 문자, 콥트 문자, 아르메니아 문자,
히브리 문자, 아랍 문자)는 2바이트로 표시되며, 나머지 문자들 중 BMP 안에 들어 있는 것은 3바이트, 아닌 것은 4바이트로 표시된다.)

관련자료

    * ksc5601 문자셋
    * cp949변환테이블

utf-8 체크

1. 입력된 문자열이 utf-8로 인코딩 되었는지 하기 위해서는 utf-8 의 인코딩 패턴을 조사한다. 즉 바이트 배열의 패턴이 utf-8 인코딩 패턴(1110xxxx 10xxxxxx 10xxxxxx)과 맞는지를 비교한다.
2. 000080 ~0007FF 범위의 110xxxxx 10xxxxxx 패턴 일 경우엔 중복되는 코드값으로 인해 utf-8 인코딩인지 아닌지 체크하는것은 사실상 불가능하다.

110xxxxx 10xxxxxx 패턴의 utf-8 판독

1. 110xxxxx 10xxxxxx 패턴의 코드일 경우 utf-8로 인코딩 되었는지 아닌지를 확인하는것은 사실상 불가능하다.
하지만 utf-8로 인코딩 되면 아스키 영역은 1byte 한글은 3byte 내지는 4byte를 사용하므로 단순하게 생각하여 2 바이트 110xxxxx 10xxxxxx 패턴의 경우는 utf-8 인코딩이 아님을 유추할수 있다.
2. 판독 기호가 붙은 라틴 문자, 그리스 문자, 키릴 문자, 콥트 문자, 아르메니아 문자, 히브리 문자, 아랍 문자 등이 입력되면 판독 오류가 발생하겠지만 이는 무시해도 좋을듯 하다.
3. Null 값의 경우 자바에서는 변형된 utf-8 인코딩 방식에 따라 1byte가 아닌 2byte(11000000 10000000)로 표기하므로 110xxxxx 10xxxxxx 의 경우 null 인지 비교해야 정확한 판독이 가능하지만 입력된 값의 인코딩여부를 판독하므로 상황에 따라서는 무시해도 괜찮을듯 하다.
4. CJK 2바이트+한글 2바이트 가 '1110xxxx 10xxxxxx 10xxxxxx 0xxxxxxx' 와 같은 패턴으로 utf-8 3바이트 와 아스키1바이트 조합과 유사할 경우 앞자리 3바이트를 유니코드 형태로 역치환 해서 000800 ~00FFFF 범위가 맞는지 체크한다.

utf-8 인코딩 체크 예제

1. '위'.getBytes("ISO-8859-1") : -20 , -100, -124
2. unsigned byte = 236, 156, 132
3. 16진수 : EC , 9C, 84
4. 2진수 : 11101100 10011100 10000100
5. urf-8 패턴제거: 00001100 00011100 00000100
6. 유니코드 타입으로 치환 : 00001100<<12 + 0011100<<6 + 00000100 = 11000000 00000100
7. 16진수 : 000800 <= 00E704 =< 00FFFF

package util;

import java.io.UnsupportedEncodingException;

/**
*  <pre>
*  작성자 : 이종희 (qola@naver.com)
*  JAlbum.com (http://jalbum.net/download.jsp?ref=list) 소스 참고함.  
*  <b>특정 문자열이 utf-8 인코딩인지 아닌지 체크한다.</b>
*
*  utf-8 인코딩 패턴인  110xxxxx 10xxxxxx , 1110xxxx 10xxxxxx 10xxxxxx 인지 비교한다.
*  2바이트 (110xxxxx 10xxxxxx) 패턴의 유니 코드 중복으로 인해 100% 검증할수 없지만
*  한글의 경우 3byte 로 표기 되므로  2바이트 패턴일 경우 utf-8 인코딩이 아닌것으로 간주한다.
*  
*  따라서 000080 ~0007FF 영역의 라틴 문자, 그리스 문자, 키릴 문자, 콥트 문자,
*  아르메니아 문자, 히브리 문자, 아랍 문자 등은 utf-8 인코딩을 비교할수 없다.
*  
*  수정된 utf-8의 의한 null값 \u0000 은 11000000 10000000 로 표기되지만 무시하기로 한다.
*  
*  </pre>
*/

public class UTFUtil {
          
       
        public static boolean isUTF8(String str) throws Exception{
                byte[] bytes=str.getBytes("ISO-8859-1");
                return isUTF8(bytes,0,bytes.length);
        }
          
        public static boolean isUTF8(byte[] buf, int offset, int length) {

               boolean yesItIs = false;
               for (int i=offset; i<offset+length; i++) {
                  if ((buf[i] & 0xC0) == 0xC0) { // 11xxxxxx 패턴 인지 체크
                     int nBytes;
                     for (nBytes=2; nBytes<8; nBytes++) {
                        int mask = 1 << (7-nBytes);
                        if ((buf[i] & mask) == 0) break;
                     }
                   

                      //CJK영역이나 아스키 영역의 경우 110xxxxx 10xxxxxx 패턴으로 올수 없다.
                     if(nBytes==2) return false;
                    
                     // Check that the following bytes begin with 0b10xxxxxx
                     for (int j=1; j<nBytes; j++) {
                        if (i+j >= length || (buf[i+j] & 0xC0) != 0x80) return false;
                     }
               
                if(nBytes==3){
                        // 유니코드 형태로 역치환 해서 0x0800 ~ 0xFFFF 사이의 영역인지 체크한다.
                    char c = (char) (((buf[i] & 0x0f) << 12) + ((buf[i+1] & 0x3F) << 6) + (buf[i+2] & 0x3F));
                    if(!(c >= 0x0800 && c <= 0xFFFF)){
                        return false;
                    }                               
                }
                       
                     yesItIs = true;
                  }
               }
               return yesItIs;
         }
           
}

한글 URL 사용시 문제 발생 케이스

    * IE에는 유니코드 지원을 위해 기본적으로 URL을 UTF-8 로 전송해 주지만 옵션 사항이므로 사용자 마다 환경이 다를수 있다.
    * utf-8로 다시 보내는 기능을 제공하지 않는 브라우저도 존재한다.
    * RSS 리더와 같은 별도의 클라이언트를 사용할경우 서버인코딩, 클라이언트, 브라우저 인코딩 이 모두 일치하여야만 한다.

해결책

    * REQUEST 요청시 URL이 UTF-8 인코딩 방식인지 아닌지를 체크하여 UTF-8 방식이면 "ISO-8859-1 --> UTF-8" 형태로 인코딩 변환을 해주고 그렇지 않으면 "ISO-8859-1 --> MS949" 로 인코딩 변환을 시켜준다.

구현 예제

    * APACHE MOD_REWRITE
          o 아래 예와 같이 MOD_REWRITE를 이용해 특정 패턴의 URL을 REWRITE 시킨다.

            RewriteEngine   on
                # // http://tag.naver.com/tag2/한글 --> http://tag.naver.com/tag/index.jsp?tag=한글
                RewriteRule ^/tag2/(.+)$  /tag/index.jsp?tag=$1 [PT]

    * JSP 샘플
          o isUTF8() 체크 메소드를 이용해 파라메터의 인코딩을 각각 처리해준다.

            <%@page language="java" contentType="text/html;charset=utf-8"%>
            <%@page import="java.net.URLEncoder, util.*" %>

            <html>
            <head>
                    <meta http-equiv="Content-type" content="text/html; charset=utf-8">
            </head>

            <body>
              index.jsp... <br>
             
              <%
                String uri=request.getRequestURL().toString();
                      String tag=request.getParameter("tag");
                      byte[] tagBytes=tag.getBytes("ISO-8859-1");
                     
                      out.println("byte[]===");
                              for(int i=0;i<tagBytes.length;i++){
                                      out.println(tagBytes[i]+",");
                              }
                      out.println("<br>");  
                     
                      boolean isUTF8=UTFUtil.isUTF8(tag);
                     
                      if(isUTF8) {
                              out.println(util.Enco.toUtf(tag));
                              out.println("<br>");
                              out.println(isUTF8);
                             
                      }else{
                              out.println(new String(tag.getBytes("ISO-8859-1"),"ms949"));
                              out.println("<br>");
                              out.println(isUTF8);
                      }
              %>
             
              <a href="http://tag_test.com/tag2/한글">http://tag_test.com/tag2/한글</a><br>
              <a href="http://tag_test.com/tag2/코리아">http://tag_test.com/tag2/코리아</a><br>
              <a href="http://tag_test.com/tag2/위">http://tag_test.com/tag2/위</a>
            </body>
            </html>


이종희 : jonghee.lee@gmail.com
        http://www.jongsclub.com
Posted by 알 수 없는 사용자
|

http://database.sarang.net/?inc=read&aid=19951&criteria=oracle&subcrit=&id=&limit=20&keyword=sam&page=5

aix oracle의 데이터를 linux oracle로 옮기려 합니다.
양쪽다 9i이고요.
데이터의 양이 적지 않기에 exp/imp를 사용하는것 이외의 방법을 찾고 있습니다.
이곳 게시판과 otn에서 찾아보니.. 파일시스템이 다르기에 가능하지 않다라는 말도 있고..  dbf, ctl, init<sid>.ora, redolog파일등을 옮겨 처리하면 가능하다고 하는 얘기도 있던데요.. 가능한건지요..

전 단순하게 dbf파일 옮겨서 control파일을 생성하려 했습니다만...

A-01503: CREATE CONTROLFILE failed
ORA-01565: error in identifying file
'/data/oracle/ora02/oradata/ORCL92/temp_data.dbf'
ORA-27047: unable to read the header block of file
Linux Error: 2: No such file or directory

이런 에러가 나는 군요.

여기서 보면 헤더를 읽을수 없다고 나오는데 이게 파일시스템의 차이로 안되는건지. 잘못된 방법으로 해서 그런지도 잘 모르겠군요. 아시는 분은 답글 남겨 주십시요. 만일 가능하다면... 어떻게 해야 하는지요.

===============================================================================
OS가 다르기 때문에 불가능합니다. 즉, 호환이 되지가 않습니다.

10g부터는 이기종간에도 Tablespace등을 전송가능한 기능이 추가되었지만 9i까지는 불가능하다고 보시면 됩니다. 오로지 운영체제 독립적인 exp/imp를 통해서 진행하시는 수 밖에는 없습니다. 이 방법은 데이타량이 많다면 사용하실 수 없는 방법입니다. imp는 insert 를 그대로 재현하는 과정이라고 보시면 되고... 그러므로 수행시간이 exp의 최소 2배에서 2.5배 이상 걸립니다.

imp 속도를 빠르게 하는 노하우는 많이 있습니다.
첫째, 색인은 빼고 imp를 한 후 색인은 imp 작업이 끝난 후 Sort_area_size를 크게 할당하고 nologging parallel 등을 활용하여 빠르게 생성하는게 더욱 효율적이다.
그리고 imp에 buffer 사이즈를 지정해줄 수 있는데 이걸 크게 잡아주는 것이 좋습니다.
또한 매건 commit하는게 아니라 테이블 단위로 commit이 가능하도록 옵션을 셋팅하고 그 정도의 트랜잭션을 커버할 수 있을 정도로 Rollback size를 미리 크게 잡아주는게 중요하겠죠.
Redo log가 너무 작으면 Log switch가 잦아져서 checkpoint가 자주 발생하므로 이거 역시 imp 발목을 잡는 주범입니다.

imp시 Redo log file size는 수백메가 정도로 잡아서 checkpoint가 자주 발생하지 않도록 하는 것도 하나의 방법입니다.
물론 사전에 Physical Design을 잘해두어야 합니다.
그 말은 Disk Layout 를 구성할 때 RAID-5 처럼 쓰기 오버헤드가 있는 곳에 Redo log file이나 Archive log, rollback, temp 등을 두어서는 안됩니다. (어떤 벤더들은 RAID-5의 쓰기 오버헤드를 자체 솔루션으로 극복하기 위해 수정한 경우도 있으니 이 경우 체크바랍니다.)

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

위의 방법으로도 IMP로 만족할 만한 속도를 얻기가 힘드시다면...
SAM파일로 text형식으로 떨군 다음에... SQL*LOADER를 통해서 로딩하는 것이 가장 빠른 방법중에 하납니다. direct 로딩이 가능하기 때문이죠.

'DB' 카테고리의 다른 글

DB Import  (0) 2008.05.30
DB Export  (0) 2008.05.30
[QUERY] 중복데이터 제거  (0) 2006.07.21
[대용량데이터베이스] 조인의 최적화  (0) 2006.07.20
SQL로 들어가서 XML로 나온다  (0) 2006.07.16
Posted by 알 수 없는 사용자
|

cygwin

OS 2006. 7. 22. 23:41




Cygwin 설정 방법 - http://ezbox.net/cygwin

'OS' 카테고리의 다른 글

grep과 find 활용  (0) 2008.06.04
하드웨어정보 shell  (0) 2008.05.20
UNIX 하드웨어 정보  (0) 2008.05.20
리눅스 cmdline  (0) 2008.05.15
filedescriptor  (0) 2006.01.02
Posted by 알 수 없는 사용자
|