출처를 모르겠음..


#include <stdio.h>
typedef unsigned long u32;
#define MIN_CHAR 33
#define MAX_CHAR 126
#define MAX_LEN 12
#define MASK 0x7fffffffL
int crack0(int stop, u32 targ1, u32 targ2, int *pass_ary)
{
  int i, c;
  u32 d, e, sum, step, diff, div, xor1, xor2, state1, state2;
  u32 newstate1, newstate2, newstate3;
  u32 state1_ary[MAX_LEN-2], state2_ary[MAX_LEN-2];
  u32 xor_ary[MAX_LEN-3], step_ary[MAX_LEN-3];
  i = -1;
  sum = 7;
  state1_ary[0] = 1345345333L;
  state2_ary[0] = 0x12345671L;
  while (1) {
   while (i < stop) {
     i++;
     pass_ary[i] = MIN_CHAR;
     step_ary[i] = (state1_ary[i] & 0x3f) + sum;
     xor_ary[i] = step_ary[i]*MIN_CHAR + (state1_ary[i] << 8);
     sum += MIN_CHAR;
     state1_ary[i+1] = state1_ary[i] ^ xor_ary[i];
     state2_ary[i+1] = state2_ary[i]
       + ((state2_ary[i] << 8) ^ state1_ary[i+1]);
   }
   state1 = state1_ary[i+1];
   state2 = state2_ary[i+1];
   step = (state1 & 0x3f) + sum;
   xor1 = step*MIN_CHAR + (state1 << 8);
   xor2 = (state2 << 8) ^ state1;
   for (c = MIN_CHAR; c <= MAX_CHAR; c++, xor1 += step) {
     newstate2 = state2 + (xor1 ^ xor2);
     newstate1 = state1 ^ xor1;
     newstate3 = (targ2 - newstate2) ^ (newstate2 << 8);
     div = (newstate1 & 0x3f) + sum + c;
     diff = ((newstate3 ^ newstate1) - (newstate1 << 8)) & MASK;
     if (diff % div != 0) continue;
     d = diff / div;
     if (d < MIN_CHAR || d > MAX_CHAR) continue;
     div = (newstate3 & 0x3f) + sum + c + d;
     diff = ((targ1 ^ newstate3) - (newstate3 << 8)) & MASK;
     if (diff % div != 0) continue;
     e = diff / div;
     if (e < MIN_CHAR || e > MAX_CHAR) continue;
     pass_ary[i+1] = c;
     pass_ary[i+2] = d;
     pass_ary[i+3] = e;
     return 1;
   }
   while (i >= 0 && pass_ary[i] >= MAX_CHAR) {
     sum -= MAX_CHAR;
     i--;
   }
   if (i < 0) break;
   pass_ary[i]++;
   xor_ary[i] += step_ary[i];
   sum++;
   state1_ary[i+1] = state1_ary[i] ^ xor_ary[i];
   state2_ary[i+1] = state2_ary[i]
     + ((state2_ary[i] << 8) ^ state1_ary[i+1]);
  }
  return 0;
}
void crack(char *hash)
{
  int i, len;
  u32 targ1, targ2, targ3;
  int pass[MAX_LEN];
  if ( sscanf(hash, "%8lx%lx", &targ1, &targ2) != 2 ) {
   printf("Invalid password hash: %s\n", hash);
   return;
  }
  printf("Hash: %08lx%08lx\n", targ1, targ2);
  targ3 = targ2 - targ1;
  targ3 = targ2 - ((targ3 << 8) ^ targ1);
  targ3 = targ2 - ((targ3 << 8) ^ targ1);
  targ3 = targ2 - ((targ3 << 8) ^ targ1);
  for (len = 3; len <= MAX_LEN; len++) {
   printf("Trying length %d\n", len);
   if ( crack0(len-4, targ1, targ3, pass) ) {
     printf("Found pass: ");
     for (i = 0; i < len; i++)
       putchar(pass[i]);
     putchar('\n');
     break;
   }
  }
  if (len > MAX_LEN)
   printf("Pass not found\n");
}
int main(int argc, char *argv[])
{
  int i;
  if (argc <= 1)
   printf("usage: %s hash\n", argv[0]);
  for (i = 1; i < argc; i++)
   crack(argv[i]);
  return 0;
}


오류가 나서 update 쿼리(drop,insert,update,delete..) 실행이 안될때..

"Not Acceptable"

http 406 오류

php나 mysql 버전은 나중에 체크하고 일단, apache 모듈부터 체크한다.

mod_security 모듈에서 sql 쿼리 정의되어 있는부분을 주석처리후 apache 재기동

SQL injection 공격을 막기위한 모듈인데 이렇게해도 안될때 google에서 검색해봐라~~ㅋ
#!/bin/sh

# 주의
# 바꿀 문자열의 디렉토리명도 바꾼다.
# 파일부터 바꾼다음 디렉토리를 바꾼다.
# find 로 검색한 결과를 순차적으로 바꾸면 나중에 나오는 파일은 못찾게 된다.

target_dir="/home/test"
target_files=`find "$target_dir" -type f`

from="old_name"
to="new_name"

# 파일을 바꾼다
for file in $target_files ; do

       # 순수 파일명 추출
       f=`basename $file`

       # 해당파일인지 판별후 변환
       if [ `echo $f | grep "$from"` ]; then
               tmp=`echo $f | sed "s/$from/$to/g"`

               new_file=`dirname ${file}`/${tmp}

               mv -f $file $new_file

               echo "change file : $file ===> $new_file "
       fi
done


# 디렉토리를 바꾼다
dir_file=`find "$target_dir" -type d`
for dir in $dir_file ; do
       # 해당 디렉토리인지 판별후 변환
       if [ `echo $dir | grep "$from"` ]; then
               new_dir=`echo $dir | sed "s/$from/$to/g"`

               mv -f $dir $new_dir
               echo "change dir : $dir ===> $new_dir "
       fi
done

exit 0
다음카페 같은데 보면 방문자 정보를 10개씩 뿌려주는데 그거 긁어오는거..
스크립트를 cron 에 등록시키고 매 1분마다 실행시킨다.
데이터를 긁어와 특정한 곳에 파일 또는 DB로 저장한다.
url 정보가 바뀌진 않지만 만약, 디자인 레이아웃이 바뀌면 말짱 도루묵.. 고로 그때그때 맞게 수정해야 된다.
charset도 시스템에 맞게 적절히 수정..


#!/usr/bin/perl -w

#####################################################################################
# author : gogisnim (gogisnim@gmail.com)
# file   : getCafe.pl
# date   : 2009.10.05
# desc   : LWP 모듈 테스트용, perl 감각익히기
#         : 다음카페의 방문자 목록을 얻는 perl script
#         : 단, cron으로 돌릴땐 local::lib 모듈을 지정해 주어야 한다.
#          : perl -I$HOME/perl5/lib/perl5 -Mlocal::lib ~/perl/getCafe.pl 이런식으로...
#####################################################################################

use strict;
use warnings;
use LWP::Simple;    # LWP 모듈

# 변수선언
my ($url, $html, $html2, $div1, $div2, $dir, $prev_txt, $old_txt, $new_txt, $data, $file_name) = ();
my (@nick,@tmp) = ();

$dir = "/home/xxx/perl/fun";
$url = "html긁어올url";
$html = get($url);

# html을 얻어오지 못하면 종료한다.
exit if ( !$html );

# $div1으로 나눈 2번째 요소를 취하고 $div2로 나눈 첫번째 요소를 취한다.
$div1 = "<div class=\"component_list group\">";
$div2 = "</div>";
($html2) = ( split $div2, (split $div1,$html)[1] )[0];

# 필요한 html을 \n 으로 분리해서 @tmp 배열에 넣는다.
@tmp = split("\n", $html2);

open (FH, $dir."/curr") or die("curr file error");
#binmode FH, ':encoding(UTF-8)';
binmode FH, ':encoding(euc-kr)';

# 문자열 초기화
$prev_txt = $old_txt = $new_txt = "";


# curr 파일의 내용을 읽어서 $prev_txt에 저장
# 주의. UTF-8로 인코딩 해야한다.
while ( <FH> ) {
   $prev_txt .= $_;
}
close(FH);


# 얻은 html 정보를 라인별로 읽어 정규표현식 <li title=\"(.+)\"> 에 만족하는 부분의 괄호부분($1)을 $old_txt에 저장
# 그중에서 이전 데이터($prev_txt)에 없는 정보(새로운 닉네임)은 $new_txt에 저장한다.
foreach ( @tmp ) {
   if ( /<li title=\"(.+)\">/ ) {
       $old_txt .= $1.",";
       if ( index($prev_txt,$1) == -1 ) {
           $new_txt .= $1.",";
       }
   }    
}

# curr 파일을 쓰기모드로 열고 UTF-8로 인코딩한다음 $old_txt 내용을 저장한다.
open (FH, ">".$dir."/curr") or die("curr file error");
#binmode FH, ':encoding(UTF-8)';
binmode FH, ':encoding(euc-kr)';
print FH $old_txt;
close(FH);


# 하루에 해당하는 파일 "년월일" $file_name 을 구한다.  예) 20091006
my ( $sec, $min, $hour, $mday, $mon, $year ) = ();
($sec, $min, $hour, $mday, $mon, $year) = localtime(time);
$year = $year + 1900;
$mon = $mon + 1;
if(length($mon)==1)     { $mon  = '0'.$mon; }
if(length($mday)==1)    { $mday = '0'.$mday; }
if(length($hour)==1)    { $hour = '0'.$hour; }
if(length($min)==1)     { $min  = '0'.$min; }
$file_name = $year.$mon.$mday;


# 새로운 닉네임($new_txt) 내용을 $file_name에 저장한다.
open (FH, ">>".$dir."/$file_name") or die("data file error");
$data = "\n".$hour.":".$min." ==> ".$new_txt;
#binmode FH, ':encoding(UTF-8)';
binmode FH, ':encoding(euc-kr)';
print FH $data;
close(FH);

사용자 삽입 이미지


가장 최근에 읽었던 책이다.

보통 펠로폰네소스 전쟁사는 당시 전쟁이 참여했던 투키디데스의 역사서로 알고 있지만 투키디데스의 펠로폰네소스 전쟁사는 전쟁 마지막 7년의 기간이 누락되어 있다.
그리고 투키디데스의 글은 너무 어려워 일반인이 이해하기가 힘들다고 한다.
이 책은 예일대 석좌교수인 도날드 케이건이 쓴 책인데 이 양반은 펠로폰네소스 전쟁에 관한한 세계에서 가장 저명한 학자라 할수있다.
보통 보름쯤이면 책한권은 뚝딱하는데 이책은 거의 한달이 걸린거 같다.
이유를 생각해보니..

첫째, 어렵다.
펠로폰네소스 전쟁을 이해하기 위해선 어느정도의 사전지식이 있어야 한다는 개인적인 생각이다.
그리스에 도시국가가 어떻게해 탄생했는지, 과두정이 뭔지, 페르시아전쟁이 어떻게 결말이 났는지, 당시 전쟁이 어떤형태였는지.. 등에 대한 정보는 있어야 내용을 이해하는데 무리가 없을거 같다는 생각이다.

둘째, 책의 서술이 너무 무미건조하고 딱딱하다.
책을 읽는순간에도 그냥 멍~ 했던적이 많았던거 같다. 글고 이 양반 글쓰는 스타일이 약간 빌빌 꼬는걸 즐기는거 같다.

셋째, 본인은 그리스어 네이밍 스타일이 참 적응이 안된다.
페르시아 전쟁사, 알렉산드로스 평전을 통해서 어느정도 익숙해졌다면 익숙해졌을법도한데 끝까지 방심하다간 딴 인물에 대한 글을 읽고있을때가 있다.
아리스토크라테스, 아리스토텔레스, 아리스토클레스, 아리스토파네스 ... 어렵다.

넷째, 등장인물이 너무나 많다.
전쟁기간이 거의 30여년이다 보니 많은 인물등장은 어쩔수 없긴하다.

그럼에도 불구하고 펠로폰네소스 전쟁사는 읽을만한 가치가 있는책이다.

역사는 현재의 거울이자 우리가 살아가는 방향타 역할을 한다고 하는데..
펠로폰네소스 전쟁은 아테네와 스파르타로 대표되는 민주정과 과두정 체제대결의 압축판이고 우리의 현실과 충분히 비교해볼수 있는부분이 굉장히 많다.
대부분의 전쟁이 그렇겠지만 펠로폰네소스 전쟁역시 그리스세계에 많은 아픔을 양산했고 문명은 퇴보하게 되었다.
국가간 분쟁의 최선책은 외교적인 접근이다.
전쟁은 목적달성을 위한 최후의 수단이어야지 그 자체가 목적이어선 안된다.
현재 우리가 직면하고있는 한반도 긴장상황이 2400여년전 펠로폰네소스전쟁의 발단이된 코린토스와 코르키라의 갈등이 연상된다.

다시 읽어보고 있는데 확실히 두번째 읽으니 첫번째보단 속도도 나고 이해하지 못했던 부분도 많이 줄어들었음을 확인할 수 있다.
펠로폰네소스 전쟁사를 완벽히 이해하기 위해선 서너번은 읽어봐야 하지않을까싶다.