base64_filter

카테고리 없음 2019. 7. 22. 22:12

filter

filter {
  ruby {
    path => '/home/tmp/logstash-6.8.1/enc_base64.rb'
    script_params => {
      'b64_fields' => ['ip_addr', 'pc_mac']
    }
  }
  ruby {
    path => '/home/tmp/logstash-6.8.1/dec_base64.rb'
  }
}

 

enc_base64.rb

def register(params)
    require 'base64'
    @b64_fields = params["b64_fields"]
end

def filter(event)
    @b64_fields.each do |k|
        v = event.get(k)
        puts("==> k: #{k}, v: #{v}")
	if !v.nil?
            event.set("#{k}_enc64", Base64.strict_encode64(v))
            event.remove(k)
	end
    end
    return [event]
end

dec_base64.rb

def register(params)
    require 'base64'
end

def filter(event)
    event.to_hash.each do |k, v|
        if k.end_with?("_enc64") and !v.nil?
            puts("==> k: #{k}, v: #{v}")
            event.set(k[0..-7], Base64.strict_decode64(v))
            event.remove(k)
	end
    end
    return [event]
end
Posted by 天下太平
,

리눅스에서 JBoss DataSource 패스워드 암호화시 특수문자($)에 주의하시기 바랍니다.


* DataSource 패스워드 암호화 관련 문서


영문: Encrypting Data Source Passwords

http://docs.jboss.org/jbosssecurity/docs/6.0/security_guide/html/Encrypting_Data_Source_Passwords.html 

한글: JBoss JDBC Password encryption 방법

http://misoleaf.blogspot.kr/2013/01/jboss-jdbc-password-encryption.html


* 패스워드 인코딩 시 달러싸인($)로 인해 발생한 문제


예를들어 패스워드가 abc$123이고 아래와 같이 인코딩을 하는 경우


cd $JBOSS_HOME

CP=client/jboss-logging.jar:lib/jbosssx.jar


java -cp $CP org.jboss.resource.security.SecureIdentityLoginModule abc$123

Encoded password: 2202200411c05dbe


윈도우에선 문제가 없지만 리눅스에서는 $1이 변수로 인식되어 문제가 생긴다.

즉, abc$123 이 아닌 abc23을 인코딩한 값이 리턴된다.


java -cp $CP org.jboss.resource.security.SecureIdentityLoginModule abc23

Encoded password: 2202200411c05dbe


리눅스에서는 abc\$123 <- 이렇게 해야한다.


java -cp $CP org.jboss.resource.security.SecureIdentityLoginModule abc\$123

Encoded password: 643b9f06c9ba48f2


* 윈도우에서 패스워드 인코딩 시 특수문자


http://www.microsoft.com/resources/documentation/windows/xp/all/proddocs/en-us/ntcmds_shelloverview.mspx?mfr=true


The ampersand (&), pipe (|), and parentheses ( ) are special characters that must be preceded by the escape character (^) or quotation marks when you pass them as arguments.



Posted by 天下太平
,

Apache httpd

카테고리 없음 2013. 2. 28. 14:35

- 설정파일 검사 명령

   apachectl -t 

Posted by 天下太平
,

* apache log format


    LogFormat "%h %D %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined


    10.220.147.10 1255 - [14/Feb/2013:17:15:44 +0900] "GET /img/IMG200000003295733.jpg HTTP/1.1" 304 - "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.57 Safari/537.17"




* mod_jk log format

    JKRequestLogFormat "%w %R %V %T %U %s"


    [2013 Thu Feb 14 17:15:44]cmse_wlb cmse2 example.com 0.001220 /img/IMG200000003295733.jpg 304




Posted by 天下太平
,

mod_jk, mod_proxy

Middleware 2013. 2. 13. 09:06

- ajp13

http://tomcat.apache.org/connectors-doc/ajp/ajpv13a.html


- mod_jk

http://tomcat.apache.org/connectors-doc/index.html


- Using mod_jk with JBoss

https://community.jboss.org/wiki/UsingModjk12WithJBoss


- Apache Module mod_proxy

http://httpd.apache.org/docs/2.2/mod/mod_proxy.html

Posted by 天下太平
,

JBoss 링크

Middleware 2013. 2. 5. 11:19

- JBoss 관리자 개발 가이드 (JBoss 3.2.6)

http://openframework.or.kr/framework_reference/jbossAdmin/index.html


JBossASTuningSliming

https://community.jboss.org/wiki/JBossASTuningSliming


JBoss6xTuningSlimming

https://community.jboss.org/wiki/JBoss6xTuningSlimming


TurnDeploymentScannerDown

https://community.jboss.org/wiki/TurnDeploymentScannerDown


JBoss AS Official Documentation Page

https://community.jboss.org/wiki/JBossApplicationServerOfficialDocumentationPage


Redhat 제품 설명서

https://access.redhat.com/knowledge/docs/


Redhat 제품 설명서 - JBoss EAP 문서

https://access.redhat.com/knowledge/docs/JBoss_Enterprise_Application_Platform/?locale=en-US


- JBoss startup configuration

http://www.mastertheboss.com/jboss-configuration/jboss-start-up-configuration


Posted by 天下太平
,

mod_cluster

Middleware 2013. 1. 25. 17:59

- mod_cluster documentation

http://docs.jboss.org/mod_cluster/1.2.0/html/Intro.html


Overview

- mod_jk, mod_proxy와 다르게 mod_cluster는 어플리케이션 서버와 httpd 사이에 커넥션을 하나더 사용

- 어플리케이션 서버들은 이 커넥션에 HTTP method를 통해 server-side load balance factors and lifecycle events를 httpd에게 전송한다. (MCMP: Mod Cluster Management Protocol)


- mod_jk

https://community.jboss.org/wiki/UsingModjk12WithJBoss



- mod_jk vs mod_cluster

http://stackoverflow.com/questions/13609320/mod-jk-vs-mod-cluster




Posted by 天下太平
,

Gradle

카테고리 없음 2013. 1. 21. 14:52

Gradle

http://www.gradle.org/


User Guide

http://www.gradle.org/docs/current/userguide/userguide.html


Gradle Javadoc

http://gradle.org/docs/current/javadoc/


권남님 wiki

http://wiki.kwonnam.pe.kr/gradle


Posted by 天下太平
,

http://onjava.com/pub/a/onjava/2005/01/26/classloading.html

Internals of Java Class Loading

by Binildas Christudas
01/26/2005

Class and Data
- class = code, data = state
- 모든 클래스는 java.lang.Class 의 인스턴스 형태로 code를 가진다
- 컴파일러는 class라는 이름의 public static final 필드를 모든 클래스에 삽입한다.
   public static final Class class;
- JVM이 클래스를 한 번 로드하면, 같은 클래스는 다시 로드되지 않는다.
- 여기서 같은 클래스는 fully qualified name (package name + class name)으로 구별된다.
- JVM에서 fully qualified name과 그 클래스를 로드한 ClassLoader를 함께 사용하여 하나의 고유한 클래스를 식별한다.
- 어떤 클래스를 C1, 패키지를 Pg, 클래스로더 인스턴스를 Kl1 이라고 할 때,
- JVM에서 (C1, Pg, Kl1)C1이라는 클래스의 키이다. 
- 즉, (C1, Pg, Kl1)(C1, Pg, Kl2)는 같은 클래스가 아니다.

Class Loaders
- JVM에서 모든 클래스는 어떤 java.lang.ClassLoader의 인스턴스에 의해 로드된다.
- java.lang.Object 와 기본 클래스들은 bootstrap class loader에 의해 로드된다.
- 이 기본 클래스들은 JRE/lib/rt.jar라는 파일로 패키징된다.
- boot class loader는 natively implementation 된다. JVM마다 구현은 다르다.
- 다음과 같이 core java runtime 클래스의 클래스로더를 얻으려고 하면 null을 얻게된다.
  log(java.lang.String.class.getClassLoader());
- java.ext.dirs property로 얻어지는 경로에서 extension 라이브러리를 찾을 수 있다.
- 이 경로의 모든 jar 파일은 ExtClassLoader에 의해 로드된다.
- 개발자 관점에서 가장 중요한 세번째의 클래스로더는 AppClassLoader이다.
- java.class.path property로 얻어지는 경로의 클래스들은 AppClassLoader에 의해 로드된다.
  이곳이 CLASSPATH이다.
- java.lang.Thread는 public ClassLoader getContextClassLoader()를 포함한다.
- 이것은 context class loader를 리턴한다.
- context class loader는 Thread를 생성한 코드에 의해 제공된다.
- Thread에 의해 실행되는 코드가 클래스나 리소스를 로드할 때 사용된다.

How Class Loaders Work
- bootstrap class loader를 제외한 모든 클래스로더는 parent 클래스로더를 갖는다.
- 모든 클래스로더의 타입은 java.lang.ClassLoader이다.
- 모든 클래스로더의 parent 클래스로더는 그 클래스로더를 로드한 클래스로더이다.
- 클래스로더의 loadClass() 메서드를 사용하여 클래스로더에게 클래스를 요청한다.
- loadClass() 메서드 내부동작은 다음과 같다. (from java.lang.ClassLoader 의 소스코드)

protected synchronized Class<?> loadClass
    (String name, boolean resolve)
    throws ClassNotFoundException{

    // First check if the class is already loaded
    Class c = findLoadedClass(name);
    if (c == null) {
        try {
            if (parent != null) {
                c = parent.loadClass(name, false);
            } else {
                c = findBootstrapClass0(name);
            }
        } catch (ClassNotFoundException e) {
            // If still not found, then invoke
            // findClass to find the class.
            c = findClass(name);
        }
    }
    if (resolve) {
    resolveClass(c);
    }
    return c;


- 클래스로더는 이미 로드된 클래스를 찾을 수 없을 때, parent에게 물어본다.
- parent의 parent (...) 에서도 찾지 못하고 결국 findBootstrapClass0() 역시 실패하면 findClass() 메서드를 호출한다.
- findClass() 메서드의 디폴트 구현은 ClassNotFoundException을 던지는 것이다.

    protected Class<?> findClass(String name)
        throws ClassNotFoundException {
        throw new ClassNotFoundException(name);
    } 


- 커스텀 클래스로더를 구현하는 개발자는 이 메서드를 구현하게 된다.
- findClass() 의 내부에서 클래스로더는 임의의 소스로부터 바이트코드를 얻어온다.
- 여기서 임의의 소스는 filesystem, network URL, database, 혹은 다른 어플리케이션일 수 있다.
- 바이트코드를 얻은 후에 findClass() 메서드는 defineClass() 메서드를 호출해야 한다. (바이트코드를 Class로 변환)
- 자바 런타임은 어떤 클래스로더 인스턴스가 defineClass()를 호출했는지를 구별한다.
- 두 개의 클래스로더 인스턴스가 같은 소스의 바이트코드를 define 하더라도, 두 개의 클래스는 다른 클래스이다.

The Java language specification gives a detailed explanation on the process of loading, linking, and the initialization of classes and interfaces in the Java Execution Engine.

- Figure 1


- 다른 클래스로더에서 로드된 (같은 바이트코드의) 클래스를 대입하려고 하는 경우 ClassCastException이 발생한다.

A more detailed explanation on the process of class loading, defining, and linking is in Andreas Schaefer's article "Inside Class Loaders."


Why Do We Need our Own Class Loaders?

Posted by 天下太平
,

[link] Sublime Text 2

기타 2012. 12. 11. 10:52

- 패키지 컨트롤

http://wbond.net/sublime_packages/package_control


- Korean(euc-kr) 인코딩 지원

https://github.com/seanliang/ConvertToUTF8


- Preferences > Settings - User

http://www.sublimetext.com/docs/2/font.html

{

"font_face": "굴림체",

"font_size": 13

}


- docs

http://docs.sublimetext.info/en/latest/


- Sublime Text organization at GitHub

https://github.com/SublimeText


- SublimeFileDiffs

https://github.com/colinta/SublimeFileDiffs/wiki


- Programmer 이고 싶다

http://juhoi.tistory.com/51


Posted by 天下太平
,

Continuous Integration

기타 2011. 9. 14. 11:13
Posted by 天下太平
,

Siger

카테고리 없음 2011. 9. 1. 11:11

Hyperic Sigar
http://www.hyperic.com/products/sigar

System memory, swap, cpu, load average, uptime, logins
Per-process memory, cpu, credential info, state, arguments, environment, open files
File system detection and metrics
Network interface detection, configuration information and metrics
Network route and connection tables

Download
http://sourceforge.net/projects/sigar/files/

Posted by 天下太平
,

sendSignal

카테고리 없음 2011. 8. 31. 00:32
Posted by 天下太平
,
# Encoding
- Protocol Buffers의 binary wire format 설명
- Base 128 Varints: 마지막을 제외한 모든 바이트는 MSB가 세팅됨. 나머지 7비트들의 그룹으로 2의보수를 구성. least significant group이 먼저임.
  1 == 0000 0001
  300 == 1010 1100 0000 0010
 - Message Structure: 키/값 구조, 메시지의 바이너리 버전에서 키 => 필드넘버와 wire_type.
  key: (field_number << 3) | wire_type
TypeMeaningUsed For
0 Varint int32, int64, uint32, uint64, sint32, sint64, bool, enum
1 64-bit fixed64, sfixed64, double
2 Length-delimited string, bytes, embedded messages, packed repeated fields
3 Start group groups (deprecated)
4 End group groups (deprecated)
5 32-bit fixed32, sfixed32, float
 
----------------------------------------------------------------
예제) SomeMsg.proto
message SomeMessage {
  required int32 field1 = 1;
  required int32 field2 = 300;
}
SecondMessage msg = SecondMessage.newBuilder().setField1(10).setField2(20).build();

00001000 => field_number = 1wire_type = 0
00001010 => 8 + 2 = 10
11100000 => field_number = 1100(and...)wire_type = 0
00010010 => field_number = 10010 1100 = 256 + 32 + 8 + 4 = 300
00010100 => 16 + 4 = 20
---------------------------------------------------------------- 
 - More Value Types
- Signed Integers: 음수의 경우 sint32가 int32보다 효율적
- Non Varint Numbers: 32bit = type 5, 64bit = type 1
- Strings: type 2, string, bytes, embedded messages, packed repeated fields
- Embedded Messages: 
- Optional And Repeated Elements: repeated 필드는 같은 태그넘버를 갖는 0개 이상의 key-value pairs. 연속되지 않고 다른 필드들과 섞여 있을수도 있음. 파싱될 때 순서 보존됨. 메시지에 하나의 (optional 혹은 required) 필드가 두 번 이상 나타나면 파서는 마지막 값을 취함. Embedded Message 필드의 경우 병합함.
- Packed Repeated Fields: 2.1.0버전부터 추가됨, [packed=true] 옵션, 0개의 엘리먼트를 포함한 필드는 메시지에 나타나지 않고, 1개이상이면 type 2 (length delimited) 방식. repeated primitive numeric 필드만  packed가 될 수 있음.
- Field Order: 필드넘버 순서대로 저장하는 게 좋음 (제공된 C++, Java, Python serialization 코드에서처럼), 하지만 파서는 임의 순서여도 파싱할 수 있어야 함.
unknown 필드는 Java, C++ 파서는 known 필드를 순서대로 저장한 뒤에 임의순서로 붙임. Python은 known 필드를 무시함.
 
Posted by 天下太平
,
Google Protocol Buffers

Thrift
http://stuartsierra.com/2008/07/10/thrift-vs-protocol-buffers
 
Google Protocol Buffer
# Overview 
- C++, Java, Python 지원
- *.proto 파일로 Protocol Format을 정의
- protoc 컴파일러로 *.proto 파일 컴파일
- 생성된 Message 클래스에 있는 Builder 클래스 사용

- 새로운 필드가 쉽게 추가될 수 있고, 중계서버들이 모든 필드를 알필요 없이 단순히 파싱하고 통과시킬 수 있게됨.
- 포맷이 좀더 파악하기 쉽고, 다양한 언어로 다룰 수 있음.
- 자동생성된 시리얼라이징 코드로 인해 수동 파싱을 피할 수 있게 됨
- RPC 요청으로 사용되는 것을 넘어 저장 포맷으로 쓰이기 시작함.
- 서버 RPC Interface가 protocol 파일로 선언되기 시작함.

# Language Guide
- 필드타입열거: scalar 타입, composite 타입.
- 태그할당: 유니크한 정수 태그, 메시지 바이너리 포맷에서 필드 구분, 메시지를 사용하기 시작한 뒤로 변경 불가. 1~15 (1바이트, 자주 등장하는 요소에 할당), 19000~19999는 Protocol Buffers를 위해 예약.
- 필드규칙열거: required - 오직 하나, optional - 0개 또는 1개, repeated - 0개 부터 n개(순서가 보존) [packed=true] 사용해야 효율적. required를 사용보다는 커스텀 Validation을 권장.
- 여러개의 메시지 타입을 하나의 proto파일에 기술 가능
- // 코멘트 가능

- Scala Value Types
http://code.google.com/intl/ko-KR/apis/protocolbuffers/docs/proto.html#scalar
- optional 필드는 디폴트 값을 가질 수 있다. [default = 10] 지정하지 않으면 (empty string, false, 0)
- Enumeration: enum 키워드, 32bit integer
- Other Message Types: 같은 .proto 파일에 정의한 후 필드로 사용 가능 
 - import "myproject/other_proto.proto"
- Nested Types: 
- Groups : deprecated use nested types
- Updating A Message Type
  기존숫자태그 변경X
  새 필드는 optional or repeated이어야 함
  예전 코드에서 파실할 때 새 필드는 무시되나 버려지지는 않음. (Python에서는 버려짐)
  Non-repeated 필드는 삭제가 가능 (단, 새 메시지에서 태그번호가 사용되지 않아야 함) OBSOLETE_ 붙여 이름변경하는것을 추천
  Non-repeated 필드는 extension으로 컨버팅 가능
  int32, uint32, int64, uint64, bool은 호환됨
  sint32, sing64 호환됨
  string, bytes 호환 가능
  Embeded Message는 bytes와 호환 가능
  fixed32는 sfixed32, fixed64, sfixed64와 호환됨
  디폴트 값의 변경은 일반적으로 OK

- Extensions
- Choosing Extension Numbers
- Packages
- Packages and Name Resolution: C++ 스타일, 가장안쪽부터 차례로 찾음.
- Defining Services: RPC
- Options: java_package
- Custom Options
- Generating Your Classes
Posted by 天下太平
,