2018년 2월 4일 일요일

Creating CRC32 Hex string

public String getCRC32HexaString(String paramString) throws Exception  {
  byte bytes[] = paramString.getBytes(DEFAULT_CHARSET);
  Checksum checksum = new java.util.zip.CRC32();
  checksum.update(bytes, 0, bytes.length);
  long checksumValue = checksum.getValue();
  return Long.toHexString(checksumValue);
}

Mysql 성능튜닝

 innodb_flush_log_at_trx_commit
Command-Line Format--innodb_flush_log_at_trx_commit[=#]
System VariableNameinnodb_flush_log_at_trx_commit
Variable ScopeGlobal
Dynamic VariableYes
Permitted ValuesTypeenumeration
Default1
Valid Values0
1
2
Controls the balance between strict ACID compliance for commit operations, and higher performance that is possible when commit-related I/O operations are rearranged and done in batches. You can achieve better performance by changing the default value, but then you can lose up to a second of transactions in a crash.
  • The default value of 1 is required for full ACID compliance. With this value, the contents of the InnoDB log buffer are written out to the log file at each transaction commit and the log file is flushed to disk.
  • With a value of 0, the contents of the InnoDB log buffer are written to the log file approximately once per second and the log file is flushed to disk. No writes from the log buffer to the log file are performed at transaction commit. Once-per-second flushing is not 100% guaranteed to happen every second, due to process scheduling issues. Because the flush to disk operation only occurs approximately once per second, you can lose up to a second of transactions with any mysqld process crash.
  • With a value of 2, the contents of the InnoDB log buffer are written to the log file after each transaction commit and the log file is flushed to disk approximately once per second. Once-per-second flushing is not 100% guaranteed to happen every second, due to process scheduling issues. Because the flush to disk operation only occurs approximately once per second, you can lose up to a second of transactions in an operating system crash or a power outage.
  • InnoDB's crash recovery works regardless of the value. Transactions are either applied entirely or erased entirely.
For the greatest possible durability and consistency in a replication setup using InnoDB with transactions, use innodb_flush_log_at_trx_commit=1 and sync_binlog=1 in your master server my.cnf file.

Mysql InnoDB 관련 설정

innodb_data_file_path
Data File(Tablespace)의 속성을 정의한다.
[Data file path]파일명:파일크기:autoextend:max:파일최대크기;
파일 구분은 ';'이고 속성 구분은 ':'이다.

innodb_autoextend_increment
Data File(Tablespace)이 확장될 때 증가되는 Size(MB) (default=8M)

innodb_additional_mem_pool_size
default : 2M
Data Dictionary 정보를 보관하기 위한 Memory Size.

innodb_buffer_pool_size
default : 8M
index 및 raw data Cache 용 Memory Size를 의미하며 Maximum Size는 Real Memory의 80%까지 정의 가능하다. 하지만, Memory Paging을 최소화 할 수 있는 Size가 적당하다. 참고로 Oracle의 권고 SGA Size는 Real Memory의 50%이다. 32 Bit O/S의 경우 Addressing 특성 상 Maximum 4G이므로 O/S 및 다른 용도의 Memory를 감안하여 이보다 작게 정의해야 한다.

innodb_flush_method
Disk I/O Buffer의 사용 여부.
일반적으로 Disk I/O가 발생하면 그 즉시 Disk에 반영되지 않고 Memory에 Caching되었다가 일정 Size이상이 되면 그 때 Disk에 Physically 반영되는데, 이러한 과정 없이 즉시로 Disk에 반영 시키는 Option이다.
[O_DIRECT] Cache Write 시 Disk에도 동일하게 반영 시킨다.
[O_DSYNC]

innodb_flush_log_at_trx_commit
Commit 시 Commit Log를 Log File에 어떻게 기록할지를 지정한다.
[0] Log Buffer가 꽉 차거나 Flush Log가 발생할때 Log File에 기록
[1] Commit이 발생할 때 마다 Log File에 기록
[2] 1초마다 Log File에 기록

innodb_log_file_size
트랜잭션을 기록하는 로그 파일의 크기를 결정하는 옵션으로  로그파일은 무한정 계속 커지는 것이 아니라 일정한 크기와 갯수를 가지고 순환식으로 처리된다.
보통 일반적으로 innodb_buffer_pool_size 의 15% 정도로 설정한다.
만약 메모리가 1GB이면 innodb_buffer_pool_size = 512M 이고, innodb_log_file_size = 80M 이다.

innodb_log_buffer_size
로그 파일을 기록하기 위한 Buffer Size로 Transaction이 작거나 거의 없다면 크게 잡는것은 낭비이다.
보통 1M~8M 사이로 설정.

innodb_log_archive
Log File의 Archive화 여부로 복구 시 Log File을 사용하므로 설정할 필요가 없음.

innodb_file_per_table
Table 마다 별도의 Data File을 가지게하는 옵션으로 하나의 Tablespace에는 하나의 Table Data만 저장한다. 단, 단점은 Data와 Index가 동일 Tablespace(Data File)에 저장된다는 것이다.


리눅스 오픈소스 바이러스 백신 CLAM

https://www.centosblog.com/enable-epel-repo-on-centos-5-and-centos-6/

어떤 젊은이의 어떤 생각

사람은 결국 쾌락으로 움직이는 것이다. 그저 뇌 속의 전기신호에 평생 좌지우지될 뿐이다.
가능한 돈이 들지 않는 쾌락을 찾아낸다. 돈이 드는 취미나 오락은 갖지 않는다.
인터넷을 최대한 활용하여 모든 오락 및 생활정보 수집은 기본료만으로도 끝낼 수 있도록 한다.
비금전적, 비물질적인 행복관을 추구해라. 쾌락에 귀천은 없다. 각자가 좋아하는 쾌락을 추구하면 충분하다.

검소검약을 항상 유념한다.
꿈은 꾸지 않는다. 희망도 갖지 않는다.
사치를 부리지 않는다. 허세를 부리지 않는다.
집착하지 않는다.
타인과 비교하지 않는다. 평균을 요구하지 않는다.
여분의 소비는 하지 않고, 물건은 오래 소중히 사용한다.
누군가에게 기대를 갖지 않는다. 세상에 무언가를 요구하지 않는다.
지금 소유한 것 이외는 갖지 않는다. 사지도 않는다. 사실 별로 필요도 없다.
무조건 경쟁심이나 질투심을 갖지 않는다. 지는 것이 이기는 것이라 생각한다.

부자들의 경쟁 권유에는 올라타지 않는다.
국가, 사회, 조직, 개인에게 충성을 맹세하지 않는다.
상식이나 도덕, 윤리, 유행 등 항상 모든 것을 의심하는 시선을 가진다.
다른 사람이나 사회에 대해 비판적인 시선은 보내지만 경쟁에는 참가하지 않는다.
노예/노동형 기업에서는 일하지 않는다. 자신이 일한 분량의 절반 정도는 승리자들에게 착취당하고 있다.
인간을 노예나 물건처럼 취급하고, 이런저런 속임수를 쓰는 모럴이 결핍된 기업이나 단체에는 돈을 쓰지 않는다.
받는 보수 이상의 일은 하지 않는다. 도를 넘은 봉사, 노력, 인내, 종속, 성실, 사람이 좋다 따위는 절대 미덕이 아니다.
모든 사건에 대해서 무관심, 방관자적 입장을 관철해라. 다만 역사나 시사 등은 잘 공부하여 지배층의 수작에 넘어가지 않도록 대비한다.

부패한 종교관에 돈을 뺏기지 말아라. 종교는 개인적인 범주라면 믿어도 좋지만, 종교 단체에는 절대 돈을 쓰지 않는다.
쓸데없는 친구는 최대한 기피한다. 쓸데없는 회식이나 다과회의 권유는 낭비의 원인이다.
무의미한 브랜드 옷 같은 것에 흥미를 갖지 않는다.
식사는 싼 식당에서 적당히 해결한다. 고급 음식점에서 쓸데없는 낭비는 하지 않는다.
가능한 한 부모님과 함께 산다. 그렇지 않을 경우에는 룸메이트를 구해서 돈을 나눠낸다.

빚을 지지 않는다. 카드도 만들지 않는다.
금융기관에 예금을 하지 않는다. 돈을 그저 장농에 잘 모셔놓는다.
차는 경차로도 충분하다. 가능하면 차 없이 자전거를 탄다.
명품, 고급차, 집은 포기한다. 사지 않는다. 갖고 싶어하지도 않는다.
술, 담배, 도박은 하지 않는다. 또한 주식이나 현물거래 등에 손을 대지 않는다.
부동산 소개소, 주인, 건설업계, 은행, 가전업계 등에 쓸데없는 돈을 소비하지 않는다.
필요한 때 이외에는 가급적 외출하지 않는다. 외출할 때는 필요한 최저한의 돈만 소지하고, 외식이나 예정에 없는 길로 돌아다니지 않는다.

신문은 인터넷, 책은 서점이나 도서관에서 공짜로 끝낸다.
자본주의 사회는 광고로 도배된 세계. 유혹에 지지 말자.
아침을 가급적 먹는다. 폭음이나 폭식은 하지 않는다. 심신의 건강을 유지 한다.

관혼상제에 돈을 들이지 않는다. 동거, 결혼, 출산 등 생산성을 재촉하는 사회 활동에는 가담하지 않는다.
결혼은 하지 않는다. 결혼해도 아이는 만들지 않는다. 아이 한 명 당 평균 4억원 이상의 지출이다. 요즘 세상에 부모가 되는 것은 제정신이 아니다.
성욕은 수음으로 해소하자. 여성은 정히 필요하다면 업소의 여성으로 적당히 때우자.
주변의 잘 나가는 사람이나 이성의 환심을 사고자 돈을 쓰지 않는다.

제행은 무상이라는 것을 안다.
잘살든 못살든 결국 도착하는 것은 죽음이다.
학력도, 돈도, 여자도, 추억도, 결국 묘지로 갖고 갈 수는 없다.



“오늘의 젊은이들은 ‘내일이 더 나아질 것이다’라는 생각을 믿지 않는다. 그들의 눈앞에 펼쳐져 있는 것은 그저 끝나지 않는 일상일 뿐이다. 그래서 지금 ‘행복하다’고 말할 수 있다. 다시 말해 인간은 미래에 대한 희망을 잃었을 때 비로소 행복해질 수 있다.”

Myabtis에서 컬럼값이 null인 경우도 null로 조회하는 설정

myabtis.xml에서 다음과 같이 설정

<settings>
...
<setting name="callSettersOnNulls" value="true"/>
...
</settings>

오라클 실행계획 보는법

--select * from table(DBMS_XPLAN.DISPLAY);
--explain plan for
SELECT 1 FROM DUAL

linux CPU 현재 사용량 조회

sar 1 1 | grep 'Average' | awk '{print $3"+"$5"="$3'+'$5}'

주가가 퍽락해쓸때 혈액형별 대응.

O형
ㅡ ㅆㅂ 한마디하고 바로 패대기 친다.
A형
ㅡ내가 사서 퍽락한건가? 하면서 조낸
고민한다.
B형
ㅡ오르던 떨어지던 비교적 관심없다.
목표가 혹은 손절가에 패대기친다.
AB형
ㅡ주가가 왜떨어졌는지 조낸 분석하고
고민하다가 2차퍽락을 맛본다.
그리고 또 조낸분석하다 3차...

xuggler 로 스트리밍 정보 및 read

package com.oopscraft.test.generator;
import com.xuggle.xuggler.ICodec;
import com.xuggle.xuggler.IContainer;
import com.xuggle.xuggler.IStream;
import com.xuggle.xuggler.IStreamCoder;

public class VideoInfo {

    private static final String filename = "rtmp://101.79.242.18/ch14/ch14_800.stream?id=3101&sa=67e56ce383fa39821e1dbe9d6445fcf5aa0f6e83fc5f719b64717325ac30693143dc407c681599bb365d38c1140db122b96fc58ed1e83a553c3a3ecbda295b2d";

    public static void main(String[] args) {
        // first we create a Xuggler container object
        IContainer container = IContainer.make();

        // we attempt to open up the container
        int result = container.open(filename, IContainer.Type.READ, null);

        // check if the operation was successful
        if (result<0)
            throw new RuntimeException("Failed to open media file");

        // query how many streams the call to open found
        int numStreams = container.getNumStreams();

        // query for the total duration
        long duration = container.getDuration();

        // query for the file size
        long fileSize = container.getFileSize();

        // query for the bit rate
        long bitRate = container.getBitRate();

        System.out.println("Number of streams: " + numStreams);
        System.out.println("Duration (ms): " + duration);
        System.out.println("File Size (bytes): " + fileSize);
        System.out.println("Bit Rate: " + bitRate);

        // iterate through the streams to print their meta data
        for (int i=0; i<numStreams; i++) {

            // find the stream object
            IStream stream = container.getStream(i);

            // get the pre-configured decoder that can decode this stream;
            IStreamCoder coder = stream.getStreamCoder();

            System.out.println("*** Start of Stream Info ***");
            System.out.printf("stream %d: ", i);
            System.out.printf("type: %s; ", coder.getCodecType());
            System.out.printf("codec: %s; ", coder.getCodecID());
            System.out.printf("duration: %s; ", stream.getDuration());
            System.out.printf("start time: %s; ", container.getStartTime());
            System.out.printf("timebase: %d/%d; ",
stream.getTimeBase().getNumerator(),
tream.getTimeBase().getDenominator());
System.out.printf("coder tb: %d/%d; ",
                 coder.getTimeBase().getNumerator(),
                 coder.getTimeBase().getDenominator());
            System.out.println();

            if (coder.getCodecType() == ICodec.Type.CODEC_TYPE_AUDIO) {
                System.out.printf("sample rate: %d; ", coder.getSampleRate());
                System.out.printf("channels: %d; ", coder.getChannels());
                System.out.printf("format: %s", coder.getSampleFormat());
            }
            else if (coder.getCodecType() == ICodec.Type.CODEC_TYPE_VIDEO) {
                System.out.printf("width: %d; ", coder.getWidth());
                System.out.printf("height: %d; ", coder.getHeight());
                System.out.printf("format: %s; ", coder.getPixelType());
                System.out.printf("frame-rate: %5.2f; ", coder.getFrameRate().getDouble());
            }

            System.out.println();
            System.out.println("*** End of Stream Info ***");
        }
    }
}

package com.oopscraft.test.generator;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
import com.xuggle.xuggler.ICodec;
import com.xuggle.xuggler.IContainer;
import com.xuggle.xuggler.IPacket;
import com.xuggle.xuggler.IStream;
import com.xuggle.xuggler.IStreamCoder;

public class Record {

        public static void main(String[] args) throws Exception {
                IContainer readContainer = IContainer.make();
                IContainer writeContainer = IContainer.make();
                int videoStreamId=0;
                int i = readContainer.open("rtmp://101.79.242.18/ch14/ch14_800.stream?id=3101&sa=6465dbea334f3242be1ebe766e15b3fd9ab267539e5381f261f1962afcf86e31f5d630016195d2bad6b83d710d03f128162d6c79da7bd4af05b2f622255fb92e",IContainer.Type.READ, null, true, false);
                writeContainer.open("header1.flv", IContainer.Type.WRITE, null);

                if (i >= 0) {
                        IStream inVideoStream = readContainer.getStream(0);
                        IStreamCoder inVideocoder = inVideoStream.getStreamCoder();
                        inVideocoder.setCodec(ICodec.ID.CODEC_ID_FLV1);
                        inVideocoder.setTimeBase(inVideoStream.getTimeBase());
                        inVideocoder.setHeight(320);
                        inVideocoder.setWidth(240);
                        IStream outVideoStream = writeContainer.addNewStream(0);
                        outVideoStream.setStreamCoder(inVideocoder);
                        int video = inVideocoder.open();
                        if (video >= 0) {
                                System.out.println("Good videoStream");
                        } else {
                                System.out.println("Wrong videoStream");

                        }

                        IStream inAudioStream = readContainer.getStream(1);
                        IStreamCoder inAudioCoder = inAudioStream.getStreamCoder();
                        inAudioCoder.setCodec(ICodec.ID.CODEC_ID_MP3);
                        inAudioCoder.setSampleRate(44100);
                        inAudioCoder.setTimeBase(inAudioStream.getTimeBase());
IStream outAudioStream = writeContainer.addNewStream(1);
                        outAudioStream.setStreamCoder(inAudioCoder);
                        int audio = inAudioCoder.open();
                        if (audio >= 0) {
                                System.out.println("Good audioStream");
                        } else {
                                System.out.println("Wrong audioStream");
                        }
                        int header = writeContainer.writeHeader();
                        if (header == 0) {
                                System.out.println("good header");
                        } else {
                                System.out.println("wrong header" + header);
                        }
                        IPacket packet = IPacket.make();
File file = new File("data0-1000.manu");
FileChannel wChannel = new FileOutputStream(file, false).getChannel();
ByteBuffer bbuf = null;
long initTS=1000;

while (readContainer.readNextPacket(packet) >= 0 && packet.isComplete()) {
bbuf = packet.getByteBuffer();
if(packet.getTimeStamp()-initTS >= 1000 && packet.isKeyPacket())
{
file = new File("data"+initTS+"-"+packet.getTimeStamp()+".manu");
initTS=packet.getTimeStamp();
wChannel = new FileOutputStream(file, false).getChannel();
}
if(bbuf!=null)
wChannel.write(bbuf);
writeContainer.writePacket(packet);
System.out.println(packet.getTimeStamp());
                        }

                        //writeContainer.writeTrailer();
                        writeContainer.close();
                        wChannel.close();
                } else {
                        System.out.print("Wrong!!!");
                }
        }
}

Proguard ANT Task 를 통한 소스 난독화

<?xml version="1.0" encoding="UTF-8"?>
<project name="generator" default="build" basedir=".">
<property name="versionNumber" value="2.4"/>
<tstamp>
  <format property="buildNumber" pattern="yyyyMMdd" locale="euc,KR"/>
</tstamp>
<property name="src" value="src"/>
<property name="classes" value="classes"/>
<property name="dist" value="dist"/>
<property name="distJar" value="non-obfuscator-light-secure-url-generator-${versionNumber}.${buildNumber}.jar"/>
<property name="obfuscatorJar" value="light-secure-url-generator-${versionNumber}.${buildNumber}.jar"/>

<target name="clean">
<delete dir="${classes}"/>
<delete file="${distJar}"/>
</target>

<target name="compile" depends="clean">
<mkdir dir="${classes}"/>
<javac srcdir="${src}"
encoding="UTF-8"
source="1.7" target="1.7"
destdir="${classes}"
debug="no"
includeantruntime="false">
</javac>
<copy todir="${classes}">
<fileset dir="${src}" includes="*.properties"/>
</copy>
</target>

<target name="build" depends="compile">
<mkdir dir="${dist}"/>
<jar jarfile="${dist}/${distJar}"
basedir="${classes}"
includes="com/gscdn/**/*"
excludes="**/*Test.*"
compress="no"
manifest="Manifest-light-secure-url.mf">
</jar>
<taskdef resource="proguard/ant/task.properties"
classpath="lib/proguard.jar" />
<proguard>
<![CDATA[
-injars ${dist}/${distJar}
-outjars ${dist}/${obfuscatorJar}
-libraryjars ${java.home}/lib/rt.jar
-libraryjars ${java.home}/lib/jce.jar
-keep public class * {
    public protected <fields>;
    public protected <methods>;
}
]]>
</proguard>
</target>

</project>



출처: http://chan77xx.tistory.com/category/?page=2 [超無 - 초무]

Creating CRC32 Hex string

public String getCRC32HexaString(String paramString) throws Exception  {   byte bytes[] = paramString.getBytes(DEFAULT_CHARSET);   Che...