데이터베이스 사랑넷에 있는 글이었던 걸 옛날 블로그에서 펌질했었죠.
옛날 블로그에서 다시 옮겨옵니다. (아직 유효한 정보인지 모르겠지만 옛날 블로그 폐쇄를 위해...)

테이블이 사용중인 블록 크기를 계산해주는 SQL


/*
** Table이 사용하는 블럭 크기를 구하는 스크립트... <<박제용>>
**
** 사용법 : 1) DBA 권한으로 로그인한다.
** 2) SQL> @tab_block [table명]
**
** Notice : sum(blocks)는 사용하는 블럭의 갯수이며 사이즈는 db_block_size를
** 곱하여 얻을 수 있다.
*/
SELECT OWNER, TABLESPACE_NAME, SEGMENT_NAME, SUM(BLOCKS)
FROM DBA_EXTENTS
WHERE SEGMENT_NAME = UPPER('&1')
GROUP BY OWNER, TABLESPACE_NAME, SEGMENT_NAME
/

이미 컴파일된 프로시져소스를 보고싶을 때 사용하는 스크립트

/*
** PL/SQL 소스를 보기위한 스크립트.. <박제용>
**
** 사용법 : find_plsql [프로시져명칭]
**
**
*/
select text
from user_source
where name = upper('&1')
order by line;

테이블을 복사해주는 스크립트 (v8.0 only)

/*
** table을 다른 스키마 혹은 table로 복사 <<박제용>>
**
** Notice) 1. Oracle 8.0 이상에서만 지원.
** 2. sql*net 이 설정되어 있어야만 한다.
** 3. 테이블과 PK만 복사하고 인덱스는 모두 다시 생성해주어야 한다.
** 따라서 테이블을 생성해 주고 입력하는것이 좋다.
** 4. sql*plus 에서만 실행된다.
** 사용법) @tab_copy scott/tiger@link source_table_name target_table_name
**
*/
copy from &1 create &3 using select * from &2

/* 다른 DB로 복사할때는
copy from &1 to &2 create &4 using select * from &3
*/

/* 미리 만들어진 table에 입력할때는
copy from &1 insert &3 using select * from &2
*/

Table Data Size를 정확히 계산해주는 스크립트

/*
** Table Data Size를 정확히 계산해주는 스크립트. <<박제용>>
**
** 사용법 : @tab_size [table_name]
**
*/
analyze table &1 delete statistics;
analyze table &1 compute statistics;

SELECT GREATEST(4, ceil(NUM_ROWS/
( (round(((1958-(INI_TRANS*23))*((100-PCT_FREE)/100))/AVG_ROW_LEN)))) * 2048) TableSize_Kbytes
FROM user_tables
WHERE table_name = upper('&1');

dead lock이 발생했을때 발생시킨 유저와 SQL문을 찾아주는 SQL

/*  
**  
**  사용법   :SQL> @find_deadlock
**  Description : 데드락이 발생할 경우 locking 된 유저와 sql문을 보여준다.
**  
**  데드락이 발생한 유저를 kill 하려면.
** Alter system kill session '{serial#},{SID}';
**
*/
Select a.serial#, a.sid, a.username, b.id1, c.sql_text
from v$session a, v$lock b, v$sqltext c
where b.id1 in( select distinct e.id1 from v$session d, v$lock e
where d.lockwait = e.kaddr)
and a.sid = b.sid
and c.hash_value = a.sql_hash_value
and b.request = 0;

딕셔너리에서 해당 키워드에 관한 뷰, 테이블을 찾아주는 SQL

/*
** 딕셔너리로부터 입력한 키워드에 관한 테이블명을 조회한다. <<박제용>>
**
** 사용법 : SQL> @dic_find [키워드(대소문자가림)]
**
*/
col TABLE_NAME format a15
col COMMENTS format a100

select * from dictionary
where COMMENTS like ('%&1%')
/

컬럼명만 가지고 테이블과 설정상태를 찾아주는 SQL

/*
** 컬럼의 스펙과, 소속 테이블을 찾는다. <<박제용>>
**
** 사용법 : SQL> @col_find [컬럼명]
**
*/
col CNAME format a20
col COLTYPE format a10
col NULLS format a5
col DEFAULTVAL format a10

select TNAME, COLNO, CNAME, COLTYPE, WIDTH, NULLS, DEFAULTVAL
from col
where CNAME = UPPER('&1')
/

Constraint 이름으로 해당 테이블과 컬럼찾는 SQL

/*
**=============================================
** CONSTRAINT 이름으로 사용 테이블 찾기
**=============================================
**
** Usage : @Show_Columns Constraint_Name
** Description : Shows The Columns Bound By A Constraint
** 사용예 : SQL> @show_Columns PK_EMPNO
*/
SET VERIFY OFF
CLEAR BREAK
BREAK ON CONSTRAINT_NAME ON TABLES

SELECT SUBSTR(CONSTRAINT_NAME,1,25) CONSTRAINT_NAME,
SUBSTR(TABLE_NAME,1,15) TABLES,
SUBSTR(COLUMN_NAME,1,15) COL_NAME
FROM ALL_CONS_COLUMNS
WHERE CONSTRAINT_NAME = UPPER('&1');

컬럼에 걸려있는 constraint 를 보여주는 SQL

/*
**=======================================
** 해당 COLUMN에 걸려 있는 CONSTRAINT확인
**=======================================
**
** Usage : @Show_Constraints Table_Name Column_Name
**
** Description : 해당 Table의 Column에 걸려 있는 Constraint를 보여준다.
**
** < 실행 예 >
** SQL> @SHOW_CONSTRAINTS WIDGETS LENGTH
**
*/

SET VERIFY OFF
CLEAR BREAK
BREAK ON TABLES ON COL_NAME
SELECT SUBSTR(TABLE_NAME,1,15) TABLES,
SUBSTR(COLUMN_NAME,1,15) COL_NAME,
SUBSTR(CONSTRAINT_NAME,1,25) CONSTRAINT_NAME
FROM USER_CONS_COLUMNS
WHERE TABLE_NAME = UPPER('&1')
AND COLUMN_NAME = UPPER('&2');

PK와 FK간의 연관관계를 찾아 보여주는 SQL

/*  
**  
**  사용법     :> @Show_Positions  Parent_Table  Child_Table  
**  Description  :  Shows Primary And Foreign Key Positions  
**  
**  WARNING   :  이 문장은 해당 Table의 Constraint생성시 Naming   
**          Convention을 따른 경우에 적용되도록 되어 있다.  
**
*/
SET VERIFY OFF  
CLEAR BREAK  
BREAK ON CONSTRAINT_NAME ON TABLES
SELECT SUBSTR(CONSTRAINT_NAME,1,27) CONSTRAINT_NAME,
SUBSTR(TABLE_NAME,1,15) TABLES,
SUBSTR(COLUMN_NAME,1,15) COL_NAME,
SUBSTR(POSITION,1,3) POSITION,
SUBSTR(OWNER,1,7) OWNER
FROM USER_CONS_COLUMNS WHERE TABLE_NAME = UPPER('&1') AND CONSTRAINT_NAME LIKE 'PK%'
UNION
SELECT SUBSTR(CONSTRAINT_NAME,1,27) CONSTRAINT_NAME,
SUBSTR(TABLE_NAME,1,15) TABLES,
SUBSTR(COLUMN_NAME,1,25) COL_NAME,
SUBSTR(POSITION,1,3) POSITION,
SUBSTR(OWNER,1,7) OWNER
FROM USER_CONS_COLUMNS WHERE TABLE_NAME = UPPER('&2') AND CONSTRAINT_NAME LIKE 'FK%'
ORDER BY 1 DESC,4 ASC;

테이블의 특정 컬럼에 중복된 값을 찾는 SQL

/*
**=============================================
** 중복된 값 있는지 찾기
**=============================================
** Usage : @중복찾기.sql [테이블명] [중복을조사할컬럼명]
**
** Warning : 똑같은값이 2개 이상있을때 처음값은 출력 않되고 2번째 값부터 출력됨. <>
*/

select * from &1 A
where rowid >
(SELECT min(rowid) FROM &1 B
WHERE B.&2 = A.&2)
order by &2;
Inside Android 책을 보면서 JNI 예제를 따라 해보고 있다.

책에서는 Visual C++로 예제를 실행하고 있어서 리눅스에서 so 만드는 법이 빠져있다.

1. 책의 예제대로 간단한 java파일을 하나 만든다. HelloJNI.java

public class HelloJNI {
native void printHello();
native void printString(String str);

static { System.loadLibrary("hellojni"); }
public static void main(String args[]) {
HelloJNI myJNI = new HelloJNI();
myJNI.printHello();
myJNI.printString("Hello World");
}
}

2. javac로 HelloJNI.java를 컴파일한다.
# javac HelloJNI.java

3. javah로 헤더를 생성한다. (HelloJNI.h가 생성된다.)
# javah HelloJNI

4. hellojni.c 파일을 만든다. (2에서 생성된 header를 include하고 함수의 바디를 구현)
#include "HelloJNI.h"
#include <stdio.h>


JNIEXPORT void JNICALL Java_HelloJNI_printHello(JNIEnv *env, jobject obj)
{
    printf("Hello World\n");
}

JNIEXPORT void JNICALL Java_HelloJNI_printString(JNIEnv *env, jobject obj, jstring string)
{
    const char *str = (*env)->GetStringUTFChars(env, string, 0); 
    printf("Hello World : %s\n", str);
}


5. hellojni.c를 컴파일한다. (생성되는 so 파일명이 libXXX.so가 되어야 한다. XXX는 java 파일에서 load한 이름)
gcc -fPIC -c hellojni.c
gcc -shared -o libhellojni.so hellojni.o

6. LD_LIBRARY_PATH를 건다.
export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH

7. 실행한다.
java HelloJNI

* 6번과 7번 대신 아래 명령어를 실행해도 된다.
java -Djava.library.path=. HelloJNI


여담) 누군가는 하루 10시간을 회사에서 일하고 휴식을 취하지만, 누군가는 10시간이 넘게 회사에서 일하고 집에서는 미래를 만든다.
동기가 쓴 책을 읽을때보다 후배가 쓴 책을 읽고 있을때 나의 게으름이 더 절실히 와닿는 것 같다.

'프로그래밍 언어 > <Java>' 카테고리의 다른 글

Sort a HashMap by Value  (0) 2011.08.07
JNI on linux  (1) 2010.12.27
[자바] 날짜, 요일 출력.  (0) 2010.11.06
[자바]일련의 숫자 임의 정렬하기  (0) 2010.07.31
[String]String.format  (0) 2010.06.16
[팁] File 읽어서 파싱하기  (0) 2010.06.10
  1. 지나가던허접맨 2018.02.22 15:26

    gcc -fPIC -c hellojni.c 명령어를 넣을 때, "$JAVA_HOME/include" -I $"JAVA_HOME/lib/linux"를 추가해야지 jni.h jni_md.h를 못찾는다는 오류를 해결할수 있습니다.

자바 안한지 너무 오래되었나 보다.

요일이 숫자로 나오게 하는 법을 모르겠음.
또, EEE로 출력시 시스템의 글자를 인식해서 한글로 나오는 듯하다.

SimpleDateFormat sdf = new SimpleDateFormat("hhmmss a");
Date date = new Date(timeMillis);
String time = sdf.format(date);

Calendar
포맷된 문자열을 얻는 방법이 아니라 각각을 얻어내는 방법인듯.
Calendar cal= Calendar.getInstance ( );
int day_of_week = cal.get ( Calendar.DAY_OF_WEEK ) - 1; // <0부터 시작하도록 함 //일요일~토요일

'프로그래밍 언어 > <Java>' 카테고리의 다른 글

Sort a HashMap by Value  (0) 2011.08.07
JNI on linux  (1) 2010.12.27
[자바] 날짜, 요일 출력.  (0) 2010.11.06
[자바]일련의 숫자 임의 정렬하기  (0) 2010.07.31
[String]String.format  (0) 2010.06.16
[팁] File 읽어서 파싱하기  (0) 2010.06.10
너무 간단한 건데, 이런걸 한번에 캐치하지 못했다.

수학시간에 배운데로 a -b < 0 은 a < b와 다를 바 없다.

하지만 프로그래밍 언어에서는?

꼭 그렇지는 않다.


위 간단한 코드를 출력해보면 무엇이 나올까?
출력 결과는
a < b
[end]

가 된다.
어찌 보면 당연한건데 막상 프로젝트에서 접하면 쉽게 발견하기 어려운 버그가 된다.
unsigned 인 a 와 b의 차를 계산하여 나온 결과가 음이 되므로 오버플로우에 의해서 a - b는 양이 된다.

이런 코딩을 하진 않겠지만 눈에도 익혀서 디버깅을 할 때 쉽게 찾을 수 있도록 노력해야겠다.



'프로그래밍 언어 > C/C++' 카테고리의 다른 글

linker 관련 링크  (0) 2011.04.15
calloc vs malloc  (7) 2011.04.06
[C언어] a - b < 0 vs. a < b  (0) 2010.10.25
C로 수행시간 체크하기  (0) 2010.09.30
__builtin_expect 키워드  (0) 2010.09.10
gcc 업그레이드 (4.5.0)  (0) 2010.07.21
http://harookie.springnote.com/pages/759316 참고





위 예제를 가지고 간단한 테스트 코드 작성.
한글 나오는 법은 추후 분석해야 할듯.

  File "parser.py", line 33, in <module>
    u = unicode(s, 'euc-kr').encode('utf-8')
UnicodeDecodeError: 'euc_kr' codec can't decode bytes in position 49-50: illegal multibyte sequence

이런 에러가 난다.

'프로그래밍 언어 > <Python>' 카테고리의 다른 글

py2exe with PMW  (0) 2010.12.28
py2exe  (0) 2010.12.28
[python]XML 처리  (0) 2010.10.12
[파이썬] CSV2SQL ver 0.1  (0) 2010.08.27
[python] Windows에서 커맨드창 하나 더 띄우기  (0) 2010.08.24
[wxPython 예제] 2. layout  (0) 2010.08.18
간단하게 수행시간 체크하는 매크로를 만들어보았다.

### c++
#ifdef _WIN32
#define ENTER { \
    LARGE_INTEGER begin, end, freq; \
    QueryPerformanceFrequency(&freq); \
    QueryPerformanceCounter(&begin);
#define LEAVE \
    QueryPerformanceCounter(&end); \
    double elapsed_time = (double)(end.QuadPart - begin.QuadPart) / freq.QuadPart; \
    printf("%s:%d] %3.2f elapsed\n", __FUNCTION__, __LINE__, elapsed_time); \
#else
#include <sys/time.h>
#define ENTER { \
    struct timeval stime, etime; \
    unsigned int performed_time; \
    gettimeofday(&stime, NULL);
#define LEAVE \
    gettimeofday(&etime, NULL); \
    performed_time = etime.tv_sec - stime.tv_sec; \
    performed_time = performed_time * 1000000 + etime.tv_usec - stime.tv_usec; \
    printf("%s:%d] %d elapsed\n", __func__, __LINE__, performed_time); \
    }
#endif




'프로그래밍 언어 > C/C++' 카테고리의 다른 글

calloc vs malloc  (7) 2011.04.06
[C언어] a - b < 0 vs. a < b  (0) 2010.10.25
C로 수행시간 체크하기  (0) 2010.09.30
__builtin_expect 키워드  (0) 2010.09.10
gcc 업그레이드 (4.5.0)  (0) 2010.07.21
Header안에 static 변수  (0) 2010.02.21
최근 이상한 매크로를 발견하고 추적하던 중 멋진 gcc의 키워드를 발견했다.

__builtin_expect라는 키워드이다.
아래 URL에 좀 더 자세히 적혀있다.


한마디로 말하면 실행할 가능성이 높은 애를 위해서 컴파일하도록 하는 매크로이다.

방어적 코딩을 하다보면 무수히 많은 if 문을 넣어야 하는데 아키텍처를 조금이라도 공부한 사람들은 Pipeline Hazard때문에 if문을 꺼리게 된다.
if문의 해악을 없앨순 없지만 되도록 실행가능성이 높은 코드를 밑에 배치해 파이프라인 해저드를 최소화 시킬수 있도록 해주는 키워드가 바로 이 키워드이다.

#define unlikely(x)     __builtin_expect(!!(x), 0)

위처럼 unlikely 키워드를 사용하면 좀 편하다. (위 URL에서 발췌)
if (__builtin_expect(조건문, 0))
과 같이 쓴다.
0이라고 적으면 if문이 false일거라고 가정하고 코드를 배치한다.

이것의 성능을 측정한 자료.
http://blog.man7.org/2012/10/how-much-do-builtinexpect-likely-and.html


'프로그래밍 언어 > C/C++' 카테고리의 다른 글

[C언어] a - b < 0 vs. a < b  (0) 2010.10.25
C로 수행시간 체크하기  (0) 2010.09.30
__builtin_expect 키워드  (0) 2010.09.10
gcc 업그레이드 (4.5.0)  (0) 2010.07.21
Header안에 static 변수  (0) 2010.02.21
디버깅하는 법 - 툴 - ltrace  (0) 2010.02.18
완전하진 않지만 csv 포맷을 sql 포맷으로 활용하기 위해 변환하는 데 유용한 스크립트입니다.
SQL 형태로 만들어주지는 않습니다. 어떤 컬럼이 들어가는지 알 수 없기 때문입니다.
허접하지만 불펌은 정중히 사양하겠습니다.

csv가 만약 단순히 , 로 이루어져 있다면 이렇게 복잡하게 할 필요가 없으나 컬럼에 ,가 내용으로 들어가 있는 경우 "" 로 문자열들이 묶여 있게 됩니다. 따라서 단순히 ,로 split 할 수 없어서 이런 스크립트를 만들었습니다.

허접한 글이지만, 도움이 되셨다면 아래 손가락 꾹 눌러주세요.


'프로그래밍 언어 > <Python>' 카테고리의 다른 글

py2exe  (0) 2010.12.28
[python]XML 처리  (0) 2010.10.12
[파이썬] CSV2SQL ver 0.1  (0) 2010.08.27
[python] Windows에서 커맨드창 하나 더 띄우기  (0) 2010.08.24
[wxPython 예제] 2. layout  (0) 2010.08.18
[TkInter 예제]2. Frame과 Layout  (2) 2010.08.18
os.system("cmd.exe")를 하면 될 것 같았는데 되지 않았다.

이는 커맨드창에서 cmd.exe를 실행했을 때도 새 커맨드 창이 뜨지 않는 것과 같은 이유이다.

무척 쉬운 방법이 있음을 발견했다.

os.system("start")
당연히 커맨드창에서 start를 입력해도 동일하게 동작한다.

리눅스에서 터미널을 하나 더 띄울때는 그냥
gnome-terminal (gnome을 쓴다면)
konsole (KDE를 쓴다면)
xterm (간단한 터미널)

중 하나를 입맛따라 골라 쓰면 된다.


허접한 글이지만, 도움이 되셨다면 아래 손가락 꾹 눌러주세요.

'프로그래밍 언어 > <Python>' 카테고리의 다른 글

[python]XML 처리  (0) 2010.10.12
[파이썬] CSV2SQL ver 0.1  (0) 2010.08.27
[python] Windows에서 커맨드창 하나 더 띄우기  (0) 2010.08.24
[wxPython 예제] 2. layout  (0) 2010.08.18
[TkInter 예제]2. Frame과 Layout  (2) 2010.08.18
[TkInter 예제]1. Hello World  (0) 2010.08.18
TkInter와 비교하면서 하려니 노력이 두배나 드는 것 같네요.

어쨌거나 TkInter보다 wxPython은 layout 이 훨씬 더 훌륭하다는 생각이 듭니다.
당장 layout을 위해 absolute positioning과 다양한 sizer를 제공하고 있습니다.
http://www.zetcode.com/wxpython/layout/



비슷하게 만들려다가 졸려서 그냥 사이트 코드를 거의 가져오다시피 했습니다.
absolute layout의 예로 pos와 size를 줘서 원하는 위치 원하는 크기에 배치하는 것이 가능합니다.

TkInter와 유사한 코드는 내일 올려야겠네요.

허접한 글이지만, 도움이 되셨다면 아래 손가락 꾹 눌러주세요.

+ Recent posts