2009년 8월 30일 일요일

국가별 아이피 차단 스크립트

커널에 ipt_iprange 모듈이 있어야 함

 

#!/bin/csh

if ($#argv < 1) then
    echo "usage : ./ip CN or China";
    exit
endif

wget -O IP.zip http://geolite.maxmind.com/download/geoip/database/GeoIPCountryCSV.zip
unzip IP.zip
cat GeoIPCountryWhois.csv  | grep $argv[1] > iplist
cat iplist | perl -pi -e 's/,/ /g'  | perl -pi -e 's/"/ /g' | awk '{ print "iptables -A INPUT -m iprange --src-range "$1 "-" $2 " -j DROP "}' > run


위 스크립트 실행후 ./run

 

한국 아이피만 허용하고 모두 막으려면 DROP 부분을 ACCEPT로 수정한 후  

iptables -A INPUT -s 0/0 -p tcp -m tcp --dport 80 -j DROP
iptables -A INPUT -s 0/0 -p udp --dport 80 -j DROP


이 두줄을 run 에 추가.

 

[출처 - PHPSCHOOL]

2009년 8월 29일 토요일

ime-mode

ime-mode : 입력언어 설정

  • auto : 텍스트 박스에 기본으로 설정됨
  • disabled : 초기 입력시 영문으로 입력, 한글 입력 불가
  • active : 초기 입력시 한글로 입력, 한/영 전환가능
  • inactive : 초기 입력시 영문으로 입력, 한/영 전환가능

     

2009년 8월 28일 금요일

동적으로 원하는 개수만큼 행을 다루기(TOP, ROWCOUNT)

SELECT TOP 20 * FROM HumanResources.Employee


DECLARE @top
INT
SET
@top =
10
SELECT TOP(@top) * FROM HumanResources.Employee

-- set value
DECLARE @top
INT
SET
@top =
10
SET
ROWCOUNT @top
SELECT * FROM
HumanResources.Employee
-- set value to return all rows
SET ROWCOUNT
0

-- update example
DECLARE @top
INT
SET
@top =
10
UPDATE TOP(@top) HumanResources.Employee SET MaritalStatus = 'S' WHERE EmployeeID <
20


-- delete example
DECLARE @top
INT
SET
@top =
10
DELETE TOP(10) HumanResources.Employee WHERE EmployeeID <
20


-- insert example
DECLARE @top
INT
SET
@top =
10
INSERT TOP(@top)
dbo.contact2
SELECT * FROM dbo.contact

2009년 8월 27일 목요일

특정 사용자에 주어진 권한 보기

SELECT USERNAME, ROLENAME, PRIVILEGE
FROM (SELECT DECODE(SA1.GRANTEE#, 1, 'PUBLIC', U1.NAME) username,
SUBSTR(U2.NAME,1,20) rolename,
SUBSTR(SPM.NAME,1,27) PRIVILEGE
FROM SYS.SYSAUTH$ SA1,
SYS.SYSAUTH$ SA2,
SYS.USER$ U1,
SYS.USER$ U2,
SYS.SYSTEM_PRIVILEGE_MAP SPM
WHERE SA1.GRANTEE# = U1.USER#
AND SA1.PRIVILEGE# = U2.USER#
AND U2.USER# = SA2.GRANTEE#
AND SA2.PRIVILEGE# = SPM.PRIVILEGE
UNION
SELECT U.NAME username, NULL rolename, SUBSTR(SPM.NAME,1,27) privilege
FROM SYS.SYSTEM_PRIVILEGE_MAP SPM, SYS.SYSAUTH$ SA, SYS.USER$ U
WHERE SA.GRANTEE#=U.USER#
AND SA.PRIVILEGE#=SPM.PRIVILEGE)
WHERE USERNAME = 'USERID';

 

 

부여된 권한 확인

 

Dictionary뷰                       설명

ROLE_SYS_PRIVS              role에 부여된 시스템 권한

ROLE_TAB_PRIVS              role에 부여된 테이블 권한

USER_ROLE_PRIVS            사용자가 액세스할 수 있는 role

USER_TAB_PRIVS_MADE    사용자가 부여한 객체 권한

USER_TAB_PRIVS_RECD    사용자에게 부여된 객체 권한

USER_COL_PRIVS_RECD    특정 Column에 대하여 사용자에게  부여된 객체 권한

2009년 8월 19일 수요일

일반검색, 구문검색, 확장검색에 확장검색의 범위 기준

구글 검색 유형 4가지.

 

키워드 = 확장검색 or 일반검색
[키워드] = 일치검색 or 완전검색
"키워드" = 구문검색
-키워드 = 제외키워드

예) 중고 도서 키워드 사용시


확장검색

중고 도서 도매 업체 - 광고 게재
중고 도서 구매 - 광고 게재
중고 희귀 도서 - 광고 게재
중고 도서 판매 - 광고 게재
중고 도서 찾기 - 광고 게재
 
구문검색

중고 도서 도매 업체 - 광고 게재

중고 도서 구매 - 광고 게재

중고 단행본 - 광고 미게재
중고 검색어 도서 - 광고 미게재
중고 희귀 도서 - 광고 미게재

 
일치검색

중고 도서 - 광고 게재

중고 도서 판매자 - 광고 미게재
중고 도서들 - 광고 미게재

 
제외어검색 (도매)

중고 도서 도매 업체 - 광고 미게재
중고 도서 도매 - 광고 미게재

 

 

2009년 8월 18일 화요일

구글의 확장검색 우선순위의 단점

네이버 클릭초이스의 경우 확장검색이 없어 세부키워드을 적극적으로 활용할 수 있다.

구글의 경우 '문자메세지' 키워드를 확장검색으로 설정, 금액을 높게 설정할 경우

'문자메세지사이트', '문자메세지보내기' 등 세부키워드 보다 우선시 노출되어

세부키워드를 활용하기 어려운 단점이 있다.... 덴당덴당.. 오버추어는???

2009년 8월 12일 수요일

MySQL errno: 145 Can't open file 테이블이름.MYI

Enter the MySQL prompt from the shell:
Code:
mysql -u dbuname -h dbhost  -p dbname;
(where dbuser, dbhost and dbname are exactly the same as in your config.php - you will also be prompted for your password, which must also be the same as in config.php)

and try the REPAIR TABLE command:
Code:
repair table 테이블이름;
You can also try from the shell command-line the myisamchk utility:
Code:
myisamchk -r 테이블이름

2009년 8월 4일 화요일

Recordset

Recordset.Open [source],[ActiveConnection],[CursorType],[LockType],[Options]

[source] : SQL 쿼리
[ActiveConnection] : Connection 개체
[CursorType] : 사용할 커서 타입(기본 1)
[LockType] : 사용할 락 타입(기본 0)
[Options] : 데이터 제공자에게 source 인수가 무엇인지 알려줌

이 중에 [CursorType],[LockType],[Options] 생략 가능

[CursorType]
1. 정적 커서(adOpenStatic - 0)
레코드세의 내용이 고정
다른 사람들에 의해 수정, 추가 또는 삭제된 모든 레코드들은 보이지 않게 됨.
레코드셋의 이동은 앞뒤 가능

2. 전진 전용 커서(adOpenForwardOnly - 1)
정적 커서랑 비슷
레코드셋에서 순차적으로 한번만 참조하는 경우 효율적

3. 동적 커서(adOpenDynamic - 2)
레코드셋을 열고 있는 동안 다른 사용자가 추가,수정,삭제한 내용을 모두 볼 수 있음.
이동은 앞뒤로 가능, 에러시 에러 내용을 자세히 알수 있으나, 서버 메모리를 많이 사용.

4. 키셋 커서(adOpenKeyset - 3)
동적 커서랑 비슷하지만, 레코드셋이 고정
다른 사용자들에 의한 변경 사항들을 볼 수 있지만, 생성된 후에 다른 사용자가 추가한 레코등 대해서는 볼 수 없음.

이동은 앞뒤로 가능

2009년 8월 2일 일요일

회원 잔액차감

DECLARE @del_date DATETIME
DECLARE @del_month INT
DECLARE @member_id VARCHAR(64)
DECLARE @cash INT
DECLARE @msg VARCHAR(64)

SET @del_month = -13

SET @del_date = DATEADD(MONTH, @del_month, GETDATE())


DECLARE pc_cursor INSENSITIVE CURSOR
FOR

 SELECT member_id, cash FROM subscriber WITH(NOLOCK)

  WHERE member_id = s.member_id
  AND cash > 0 AND visit_date  < @del_date

 

FOR READ ONLY

OPEN pc_cursor

 

FETCH NEXT FROM pc_cursor
INTO @member_id, @cash

 

WHILE @@FETCH_STATUS = 0
BEGIN

 

 SET @msg = '약관적용 건수차감  : ' +  CONVERT(VARCHAR, @cash)

 

 INSERT INTO memo(member_id, admin_id, memo) VALUES(@member_id, 'SYSTEM', @msg)
 UPDATE subscriber SET cash = 0 WHERE member_id = @member_id

 

 FETCH NEXT FROM pc_cursor
 INTO @member_id, @remain_cash
END


CLOSE pc_cursor
DEALLOCATE pc_cursor

작업스케쥴러 초단위 실행

제대로 돌아갈려나..--;

 

declare @run_sec as int
declare @sec as int
declare @run_time as int
declare @run as int
declare @delay as int
declare @stime as varchar(23)
declare @etime as varchar(23)
declare @ftime as datetime
declare @dtime as varchar(16)


set @run = 0
set @sec = 60
set @run_sec = 3
set @run_time = @sec / @run_sec

set @stime =  convert(varchar(23), getdate(), 121)
set @etime =  convert(varchar(23), dateadd(second, @sec - @run_sec, @stime), 121)


print @stime
print @etime

while @run < @run_time
begin
 if @etime > @stime
 begin
  set @stime = convert(varchar(23), getdate(), 121)

  set @dtime = '00:00:0' + convert(varchar, convert(int, rand() * @run_sec))
  waitfor delay @dtime

  set @ftime = convert(varchar(32), getdate(), 121)
  set @delay = datediff(second, @stime, @ftime)

  if @delay > 0
  begin
   if @run + 1 < @run_time
   begin
    set @dtime = '00:00:0' + convert(varchar, @run_sec - @delay)
    waitfor delay @dtime
   end
  end
  else
  begin
   if @run + 1 < @run_time
   begin
    set @dtime = '00:00:0' + convert(varchar, @run_sec)
    waitfor delay  @dtime
   end
   
  end

  print convert(varchar, @delay) + ' ' + convert(varchar, getdate(), 121)
 end
 else
 begin
  print 'else: ' + @stime
  print 'else: ' + @etime
 end
 
 set @run = @run + 1
end