‘diff with vim’ 에러 해결방법

두파일을 비교시 나는 “Diff with Vim” 기능을 주로 이용하는데..
어느순간 아래와 같이 안됨.

vim_diff

그래 _vimrc 파일의 MyDiff 함수를 아래와 같이 수정하여 해결.

 function MyDiff()
   let opt = '-a --binary '
   if &diffopt =~ 'icase' | let opt = opt . '-i ' | endif
   if &diffopt =~ 'iwhite' | let opt = opt . '-b ' | endif
   let arg1 = v:fname_in
   if arg1 =~ ' ' | let arg1 = '"' . arg1 . '"' | endif
   let arg2 = v:fname_new
   if arg2 =~ ' ' | let arg2 = '"' . arg2 . '"' | endif
   let arg3 = v:fname_out
   if arg3 =~ ' ' | let arg3 = '"' . arg3 . '"' | endif
   if $VIMRUNTIME =~ ' '
     if &sh =~ '\<cmd'
       if empty(&shellxquote)
         let l:shxq_sav = ''
         set shellxquote&
       endif
       let cmd = '"' . $VIMRUNTIME . '\diff"'
     else
       let cmd = substitute($VIMRUNTIME, ' ', '" ', '') . '\diff"'
     endif
   else
     let cmd = $VIMRUNTIME . '\diff'
   endif
   silent execute '!' . cmd . ' ' . opt . arg1 . ' ' . arg2 . ' > ' . arg3
   if exists('l:shxq_sav')
     let &shellxquote=l:shxq_sav
   endif
 endfunction

Drupal 5 스팸 막기

Tcl 커뮤니티에 스팸 회원과 글들이 예전부터 너무 많이 올라와서 찾아봄.

이거 일단 좋아는 보여서 drupal에 적용해둠.
https://www.drupal.org/project/httpbl

그리고.. Captcha 를 이용한 한글 이미지로 스팸 방지하는 법.

출처: http://palpal.org/node/215

Captcha 를 이용한 스팸 댓글 방지책 - 한글 폰트를 이용해 보자.

외국어로 된 댓글 스팸 공격이 너무 심하다.
Captcha도 MyCaptcha모듈도 둘 다 공격을 받는다.
그렇다고 댓글을 매번 관리자 확인후 공개할 수도 없고...
영어 댓글과 막아내는 방법을 고민해 보았다.

우선 주된 댓글 스팸 문구를 분석해 보았다.
"He lost his arms"라는 내용의 광고성 스팸이다.
이 녀석은 예전에도 많았는데 이미지 Captcha를 어떻게 통과하는지 신기하다.
아마도 1. 이미지 Captcha를 분석해서 통과? 아니면 랜덤하게 연속 입력?
2. 어쩌면 치명적이게도 Captcha모듈들의 약점을 이용하는 것일까?
어찌됐던 1번 원인이라면 아래와 같은 한글 폰트를 이용해서 영미권의
스팸공격을 원천적으로 봉쇄하려고 한다(설마 외국 스팸로봇이 한글을 입력하랴?).

[드루팔에서 Captcha 확인 문구에 한글을 입력받도록 하는 법]

굴림 폰트(gulim.ttc)를 리네임(gulim.ttf)해서
modules/captcha/image_captcha/fonts/
에 집어 넣고 CAPTCHA 입력 문구에는
한글로 "그느드르므브스으즈츠"를 입력해 두었다.

특별히 "가나다라..."가 아닌 이유는 이미지 한글 문자가
Captcha에서 가로로 잘려보이는 경우가 있어서이다.

댓글 쓸 때 한글을 입력하지 않으면 안되게 됐다.
이로써 외국발 스팸 공격을 막을 수 있을까?

Boost 빌드 for MinGW

몇번의 시도끝에 얻은 MinGW 용 Boot 빌드 방법.

cmd 창에서 아래를 입력

set path=%path%;C:\MinGW-4.6.1\mingw\bin
bootstrap.bat mingw

다음 32비트의 경우..

b2.exe --prefix=C:\boost_1_55_0\release\win32 toolset=gcc variant=debug,release threading=multi install 

64비트의 경우는..

b2.exe --prefix=C:\boost_1_55_0\release\win64 toolset=gcc address-model=64 variant=debug,release threading=multi install

MySQL Connector for MinGW

우선 아래의 링크에서 mysql-connector-c-6.0.2.mingw-port.tgz 파일을 받는다.

https://sourceforge.net/projects/windiana.u/files/mysql/port-mingw/

다음 압축을 풀고.. 다음과 같이 컴파일한다.

% cmake -G "MSYS Makefiles" -DCMAKE_INSTALL_PREFIX=/c/Temp/mysql-connector-c-6.0.2-mingw32
% make
% make install

컴파일 중인 화면

컴파일된 결과 파일: mysql-connector-c-6.0.2-mingw32.zip

다음의 코드로 접속 테스트 실시.

#include <stdio.h>
#include <stdlib.h>
#include "mysql.h"

static void change_user(MYSQL *sock,const char *user, const char *password,
			const char *db,my_bool warning)
{
  if (mysql_change_user(sock,user,password,db) != warning)
  {
    fprintf(stderr,"Couldn't change user to: user: '%s', password: '%s', db: '%s':  Error: %s\n",
	    user, password ? password : "", db ? db : "",
	    mysql_error(sock));
  }
}

int main(int argc, char **argv)
{
  MYSQL *sock;

  if (!(sock=mysql_init(0)))
  {
    fprintf(stderr,"Couldn't initialize mysql struct\n");
    exit(1);
  }
  mysql_options(sock,MYSQL_READ_DEFAULT_GROUP,"connect");
  if (!mysql_real_connect(sock,"1.2.3.4","root","PASSWORD",NULL,0,NULL,0))
  {
    fprintf(stderr,"Couldn't connect to engine!\n%s\n",mysql_error(sock));
    perror("");
    exit(1);
  }
  sock->reconnect= 1;

  if (mysql_select_db(sock,"test"))
  {
    fprintf(stderr,"Couldn't select database test: Error: %s\n",
	    mysql_error(sock));
  }

  mysql_close(sock);
  exit(0);
  return 0;
}
% gcc -o connect_test.exe connect_test.c -I/c/Temp/mysql-connector-c-6.0.2-mingw32/include -L/c/Temp/mysql-connector-c-6.0.2-mingw32/lib -lmysqlclient -lws2_32

컴파일시 아래의 아래와 같은 에러가 나면..

error: unknown type name 'SOCKET'

mysql_com.h 파일에 다음을 추가한다.

#ifndef my_socket_defined
#if  defined(__WIN32__) && !defined(__WIN__)
#define my_socket SOCKET
#else
typedef int my_socket;
#endif /* __WIN__ */
#endif /* my_socket_defined */

다음과 같은 에러가 나면서 접속이 안되면..

$ ./connect_test.exe
No error
Couldn't connect to engine!
Host 'xx.xx.xx.xx' is not allowed to connect to this MySQL server

DB 접근 권한 문제로 localhost 로는 접근이 가능하지만 외부에서 다른 IP로 접근했을시 뜨는 오류 이므로 권한을 부여해서 해결한다.
참고로 root 의 host 값들은 localhost, 127.0.0.1 등으로 기본 등록되어 있지만,


mysql> use mysql;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> select host, user, password from user;
+-------------+-------+-------------------------------------------+
| host        | user  | password                                  |
+-------------+-------+-------------------------------------------+
| localhost   | root  | *xxxx |
| 127.0.0.1   | root  |                                           |
| localhost   |       |                                           |
| localhost   | mysql | *xxxxx |
+-------------+-------+-------------------------------------------+
7 rows in set (0.00 sec)

외부접속을 나타내는 값이 없다. 특정 아이피로 지정할 수도 있지만 여기선 % 기호로 어디서든 접속 가능하게 만든다.

mysql> use mysql;
mysql> grant all privileges on *.* to 'root'@'%' identified by 'root의 패스워드';
mysql> flush privileges;
mysql> select host, user, password from user;
+-------------+-------+-------------------------------------------+
| host        | user  | password                                  |
+-------------+-------+-------------------------------------------+
| localhost   | root  | *xxxx |
| 127.0.0.1   | root  |                                           |
| localhost   |       |                                           |
| localhost   | mysql | *xxxx |
| %           | root  | *xxxx |
+-------------+-------+-------------------------------------------+
8 rows in set (0.00 sec)

mysql> quit;

참고 내용: mysql.txt

참고 싸이트: http://forums.mysql.com/read.php?117,425191,425191#msg-425191

Python 에서 ctags 분석

아래와 같이 ctags 로 코드를 분석하고..

ctags --languages=tcl --fields=afmikKlnsStz -R

생성된 ctags 파일을 python 에서 아래의 모듈을 아용하여 분석.

https://code.google.com/p/python-ctags/

SET VS90COMNTOOLS=%VS100COMNTOOLS%
python setup.py install

테스트

import ctags
from ctags import CTags, TagEntry
import sys

tagFile = CTags('tags')
entry = TagEntry()

if tagFile.find(entry, 'legend', ctags.TAG_PARTIALMATCH | ctags.TAG_IGNORECASE):
	print entry['lineNumber']
	print entry['file']
	print entry['pattern']
	print entry['name']
	print entry['kind']

	# Find the next tag matching the name and options supplied to the 
	# most recent call to tagFile.find().  (replace the entry if found)
	while tagFile.findNext(entry):
		print entry['lineNumber']
		print entry['file']
		print entry['pattern']
		print entry['name']
		print entry['kind']

Doxygen 예제

/**
 * @file   example_action.h
 * @Author Me (me@example.com)
 * @date   September, 2008
 * @brief  Brief description of file.
 *
 * Detailed description of file.
 */

/**
 * @name    Example API Actions
 * @brief   Example actions available.
 * @ingroup example
 *
 * This API provides certain actions as an example.
 *
 * @param [in] repeat  Number of times to do nothing.
 *
 * @retval TRUE   Successfully did nothing.
 * @retval FALSE  Oops, did something.
 *
 * Example Usage:
 * @code
 *    example_nada(3); // Do nothing 3 times.
 * @endcode
 */
boolean example(int repeat);