Jan 192017
 

64비트 Objective-C에 대한 글을 쓰기 앞서서 C 언어 데이터 모델이 무엇인지 이야기하고자 한다. 64비트 시스템이 나오면서 기존의 플랫폼에 따른 타입들의 크기를 재정의 해야할 필요가 생겼는데 이에 대한 이야기이다. 플랫폼에 따라 변하는 기본 타입들은  int, void*(pointer), long, long long 등을 말한다. 물론 16비트 CPU에서 32비트로 전환되던 시절에도 이 이슈는 존재하였다. 예를 들면 16비트 cpu의 경우 16비트의 주소값으로는 65.536Byte 밖에 표현할 수 없는데, 이에 20비트의 포인터를 사용하였었다(모든 기종이 그렇다는 것은 아니다). 여기서 문제는 처리 단위가 16비트이다 보니 segment value(기준 주소를 4비트 시프트)와 offset(segment value로 부터의 실제 좌표의 차이)과 같이 포인터를 좀 더 복잡하게 고민하여 처리해야했다. near pointer와 far pointer로 구분하여 사용하던 시절이 있었다. 어쨋든 32비트에서 64비트로 바뀔 때도 비슷한 이슈가 있었는데, 이 것이 지금 말하려는 C언어 데이터 모델이다.

컴파일러나 플랫폼에 따라 선택한 데이터 모델은 달라진다. 기존 32bit 프로그래밍 모델에서는 ILP32를 사용한다. LP32는 기존 Win16CAPI에서 사용되곤 했다. LLP64의 경우 윈도우에서 채택[2] 했으며, LP64의 경우 일부 유닉스 계열에서 사용한다.

여기서 L은 long에 해당하며, P는 pointer size를 이야기 하며, I는 int를 의미, LL은 long long을 의미한다. long long의 경우 지원하지 컴파일러에 따라 지원하지 않을 수도 있다[2].

Datatype LP64 ILP64 LLP64 ILP32 LP32
char 8 8 8 8 8
short 16 16 16 16 16
int 32 64 32 32 16
long 64 64 32 32 32
long long 64
pointer 64 64 64 32 32

위의 테이블을 보면 각 데이터 모델에 따라서 어떤 값을 가지게 되는지 알 수 있다. pointer의 경우 확실히 다르기 때문에 기존 32bit 코드를 64bit로 변경할 때 꼭 주의 하여야 한다. long type의 변수에 포인터 값을 할당하여 사용하는 경우도 멀티플랫폼을 지원하기위한 개발을 한다거나 할 때 위험하기 때문에 잘 고려해서 선택해야한다.

차라리 C99에서 정확한 사이즈가 지정된 데이터 타입이 추가되었는데, 컴파일러가 C99와 호환된다면 이를 선택하는 것이 좋을 수도 있다. int8_t, uint8_t, int32_t, int64_t 등과 같이 unsigned된 형태와 8,16,32,64를 지원한다. 하지만 문제 점도 있는데, int32_t를 썼는데 16비트 컴퓨터에서 동작시킨다면 성능이 나빠질 수도 있다던지 하기 때문에 상황에 알맞게 구현해야할 것이다. 32비트와 64비트 빌드를 둘 다 지원하는 경우도 마찬가지로 데이터 타입의 사이즈를 고려해야 한다. 또한 size_t인 데이터도 사용할 때 사이즈에 주의해야한다.

참고자료

[1] Unix.org, “64-Bit Programming Models: Why LP64?”,  http://www.unix.org/version2/whatsnew/lp64_wp.html

[2] Hook, B. (2005). Write Portable Code: An Introduction to Developing Software for Multiple Platforms. No Starch Press., pp85-89

Jun 142014
 

다음 자동완성 워크플로우에 대한 수요가 있어서 만들어 보았습니다. 개인적으로 사전 자동완성은 타사 보다 다음이 좀 더 나은 것 같습니다. 혹시 원하는 사전이 있다면 말씀해 주시면 추가하도록 하겠습니다. 그리고 버그 알려주시는 것은 언제나 환영합니다^^ 방법은 이메일이나 코멘트를 통하여 부탁드립니다!

Screen Shot 2014-06-14 at 4.33.31 PM

 

설치 방법


방법은 간단합니다. Alfred 4 가 설치되어 있는 컴퓨터에서 아래의 workflow를 다운로드 받아서 실행하는 것 만으로 충분합니다.

링크

링크에 접속하여 `alfdaumsearch.alfredworkflow` 를 다운받아 설치합니다.

 

 사용 방법


사용방법은 다음과 같습니다.  제가 만든 네이버 검색 워크플로우 와 기본적인 방법은 같습니다.

  • ds ...  : 일반 키워드 검색
  • dk ...  : 국어사전 검색
  • dh ... : 한자사전 검색
  • dj ... : 일어사전 검색
  • de ... : 영어사전 검색
  • dc ... : 중국어사전 검색
  • di ... : 인도네시아어사전 검색
  • dv ... : 베트남어사전 검색
  • dit ... : 이태리어사전(이탈리아어) 검색
  • dru ... : 러시아어사전(노어) 검색
  • df ... : 프랑스어사전 검색
  • dtr ... : 터키어사전 검색
  • dth ... : 타이어사전(태국어) 검색
  • dpl ... : 폴란드어사전 검색
  • dpt ... : 포루투갈사전 검색
  • dcs ... : 체코어사전 검색
  • dhu ... : 헝가리어사전 검색
  • dar ... : 아랍어사전 검색
  • dsv ... : 스웨덴어사전 검색
  • dhi ... : 힌디어사전 검색
  • dnl ... : 네덜란드어사전 검색
  • dfa ... : 패르시아어사전 검색
  • dsw ... : 스와힐리어사전 검색
  • dro ... : 루마니아어사전 검색

 

 변경이력


  • [2014.06.30] v0.0.2 런치 : 알프레드에서 검색 후 엔터를 쳤을 때 "r"으로만 검색되는 버그 수정
  • [2016.12.09] v0.0.4 : 인도네시아어 사전 추가
  • [수정 2017-07-25 03:45+0900] 연관 프레임워크 업데이트 (시에라 백그라운드 버그 해결)
  • [2021-01-01] v0.0.5 : 다음 자동완성 주소 변경
  • [2021-01-07] v0.0.6 : 17 종류의 사전 추가
  • [2021-01-07] v0.2.0 : macOS 12.3 대응 -> python3 설치 필요
  • [2024-02-15] v0.3.0 : SSL에러 이슈 해결

 

기능 개선 참여 방법


해당 다음 검색 워크플로우는 MIT로 공개되어 있는 오픈소스입니다. 개선을 도우고 싶으신 분이 있으시면, Github alfdaumsearch 를 통하여 참여부탁드립니다.

Dec 032013
 

OSX에는 알프레드(http://www.alfredapp.com/)라는 앱이 있습니다. 이 앱은 쉽게 키보드로 여러 기능을 빠르게 실행할 수 있게 해줍니다. 기본적인 기능은 무료 버전을 다운로드 받으시면 됩니다. 하지만 Alfred에 기능(워크플로우)을 추가할 수 있는 기능은 따로 파워팩을 구매해야만 합니다.

이 앱을 사용하다 보니 네이버 검색이나, 사전에서 같은 것을 쉽게 쓸 수 있었으면 좋을 것 같다는 생각을 하게 되었습니다. 기존에 자동완성은 되지 않지만 브라우져 창을 열어 주는 것은 기존에 있었습니다. 저는 자동완성도 되길 원했기 때문에 간단히 만들어 보았습니다. 그리고 작성한 코드는 github에(https://github.com/Kuniz/alfnaversearch) 공개하였습니다.  아래 링크에서 다운 받으면 됩니다.

다운로드 

사용하면서 버그나 추가적으로 필요하신 기능같은게 있다면 댓글을 달아주세요. 가능한 범위 내에서 적용하도록 하겠습니다.

[수정 2014-04-18 01:32+0900] shasing님, 이재호님께서 제보해주신 부분 중 자동완성 후 브라우져 작동시 잘 못되는 문제 해결하였습니다.
[수정 2014-04-18 01:38+0900] shasing님께서 말씀하신 일본어 한자 자동완성 기능도 추가하였습니다.
[수정 2014-04-22 01:32+0900] shasing님께서 말씀하신 일본어 자동완성 버그 수정하였습니다.
[수정 2014-05-18 18:26+0900] 1. 국빵님께서 요청하신 중국어 자동완성 기능 넣었습니다.  2. 라이브러리 성능을 개선하였습니다. 기존에 쓰시던 분들도 다시 받아주세요 ㅎㅎ 3. 중국어 자동완성에 있어서 한글로 입력을 했을 때 한글로만 나오는건 네이버 중국어 사전 자동완성 기능이 그 부분만 제공하기 때문입니다 ㅠㅠ
[수정 2014-07-23 12:07+0900] 독일어, 한자사전 추가됬습니다.
[수정 2014-11-08 16:36+0900] 프랑스어 추가 및 링크 깨진 것 수정 하였습니다.
[수정 2016-07-02 01:26+0900] norux님이 워크플로우에 한글 디렉토리명이 있는 경우에 대한 버그 수정 기여해주셨습니다~ 감사합니다.  버그 수정한 버전 업로드 되어 있습니다!
[수정 2016-10-01 01:09+0900] 이탈리아어 사전 추가했습니다.
[수정 2016-10-15 22:30+0900] 러시아어, 스페인어, 태국어, 베트남어 사전 추가했습니다.
[수정 2016-12-11 15:07+0900] 러시아어, 스페인어, 태국어, 베트남어 사전 추가했습니다.
[수정 2016-01-01 16:05+0900] 중국어 사전 자동완성 결과 개선
[수정 2017-07-25 03:45+0900] 연관 프레임워크 업데이트 (시에라 백그라운드 버그 해결)

[수정 2017-12-14 02:06+0900] 독일어사전 API주소 변경

[수정 2021-01-01 12:38+0900] 네이버 자동완성 API주소 변경
[수정 2021-08-23 01:15+0900] 24개 언어 추가 및 일본어 사전 자동완성 주소 변경

[수정 2021-10-20 12:00+0900] 네이버 쇼핑 자동완성 적용

[수정 2022-01-04 01:50+0900] 각종 버그 수정 및 macos 등 지원 강화

[수정 2022-01-28 01:17+0900] na명령 버그 수정 및 영영사전 추가

[수정 2022-02-09 01:53+0900] python2/3 지원. @kw-lee 님 감사합니다 🙂 -> macOS 12.3에서 안될시 python3 설치 후 다운받아주세요.
 

[수정 2022-04-06 01:22+0900] 자동완성의 상세내용을 cmd+C 로 클립보드 복사되도록 기능 추가

사용방법


 na 명령 : 네이버 일반 검색을 수행합니다.

2013-12-03_20-36-02

ns 명령 : 네이버 쇼핑 검색을 수행합니다.

nae 명령 : 네이버 영어사전 검색을 수행합니다.

영어로 입력시 한글 단어가 나오며, 한글로 입력시 영어 단어가 나옵니다.

2013-12-03_20-36-35

2013-12-03_20-36-56

 

naj 명령: 네이버에서 일어사전 검색을 합니다.

로마자 입력 검색시 일문, 일어 검색시 한국어, 한국어 검색시 일어 단어가 출력됩니다.

2013-12-03_20-37-57

2013-12-03_20-37-24

2013-12-03_20-37-10

 

* `nak ...` : Naver Korean Dictionary (국어 사전)
* `nae ...` : Naver Korean-English Dictionary (영어 사전)
* `naee ...` : Naver English-English Dictionary (영어 사전)
* `naj ...` : Naver Korean-Japanese Dictionary (일본어 사전)
* `nac ...` : Naver Korean-Chinese Dictionary (중국어 사전)
* `nah ...` : Naver Hanja Dictionary (한자 사전)
* `nad ...` : Naver Korean-German Dictionary (독일어 사전)
* `naf ...` : Naver Korean-French Dictionary (프랑스어 사전)
* `nai ...` : Naver Korean-Italian Dictionary (이탈리아어 사전)
* `nar ...` : Naver Korean-Russian Dictionary (러시아어 사전)
* `nas ...` : Naver Korean-Spanish Dictionary (스페인어 사전)
* `nat ...` : Naver Korean-Thai Dictionary (태국어 사전)
* `nav ...` : Naver Korean-Vietnamese Dictionary (베트남어 사전)
* `nan ...` : Naver Korean-Indonesian Dictionary (인도네시아어 사전)
* `nau ...` : Naver Korean-Uzbekistan Dictionary (우즈베키스탄어 사전)
* `nane ...` : Naver Korean-Nepali Dictionary (네팔어 사전)
* `namn ...` : Naver Korean-Mongolian Dictionary (몽골어 사전)
* `namy ...` : Naver Korean-Burmese Dictionary (미안마어 사전)
* `nasw ...` : Naver Korean-Swahili Dictionary (스와힐리어 사전)
* `naar ...` : Naver Korean-Aramaic Dictionary (아랍어 사전)
* `nakm ...` : Naver Korean-Cambodian Dictionary (캄보디아어 사전)
* `nafa ...` : Naver Korean-Persian Dictionary (페르시아어 사전)
* `nahi ...` : Naver Korean-Hindi Dictionary (힌디어 사전)
* `nanl ...` : Naver Korean-Dutch Dictionary (네덜란드어 사전)
* `nasv ...` : Naver Korean-Swedish Dictionary (스웨덴어 사전)
* `nauk ...` : Naver Korean-Ukrainian Dictionary (우크라이나어 사전)
* `naka ...` : Naver Korean-Gruziya Dictionary (조지아어 사전)
* `nacs ...` : Naver Korean-Czech Dictionary (체코어 사전)
* `nahr ...` : Naver Korean-Croatian Dictionary (크로아티아어 사전)
* `natr ...` : Naver Korean-Turkish Dictionary (터키어 사전)
* `napt ...` : Naver Korean-Portuguese Dictionary (포르투갈어 사전)
* `napl ...` : Naver Korean-Polish Dictionary (폴란드어 사전)
* `nafi ...` : Naver Korean-Finnish Dictionary (핀란드어 사전)
* `nahu ...` : Naver Korean-Hungarian Dictionary (헝가리어 사전)
* `nasq ...` : Naver Korean-Albanian Dictionary (알바니아어 사전)
* `naro ...` : Naver Korean-Rumanian Dictionary (루마니아어 사전)
* `nala ...` : Naver Korean-Latin Dictionary (라틴어 사전)
* `nael ...` : Naver Korean-Greek Dictionary (그리스어 사전)
Aug 302011
 

1. lighttpd의 설치
> sudo apt-get install lighttpd

2. 포트 변경
> sudo vi /etc/lighttpd/lighttpd.conf

# 아래 문장 추가
server.port = 8081

3. 디렉토리 view disable하기
> sudo vi /etc/lighttpd/lighttpd.conf

server.dir-listing = “disable”

4. lighttpd cgi 사용
> sudo vi /etc/lighttpd/lighttpd.conf

server.modules = (

“mod_cgi”,                          # 추가
)

cgi.assign = (“.cgi” => “”)            # 추가

# “.cgi” => “”  (자체 실행을 의미) ,
# “.pl” => “/usr/bin/perl”  (.pl일 경우 perl 프로그램을 실행)

5. 개인화 폴더 설정 ( http://redmine.lighttpd.net/wiki/1/Docs:ModUserDir )
> sudo vi /etc/lighttpd/lighttpd.conf

server.modules = (


“mod_userdir”,

)

userdir.path = “public_html”    # ~ 아래의 폴더를 웹 페이지의 메인으로 선택
userdir.exclude-user = (“root”, “postmaster”)  # 사용하지 않을 유저 설정

6. ssl 설정 ( http://redmine.lighttpd.net/wiki/1/Docs:SSL )
> sudo vi /etc/lighttpd/lighttpd.conf

$SERVER[“socket”] == “:8082” {

ssl.engine = “enable”
ssl.pemfile = “/var/www/ssl/myserv.pem”

}

인증서 파일은 보안 설정을 400으로 할 것!

7. 서버 재시작
> sudo /etc/init.d/lighttpd restart

Aug 212011
 

Ubuntu에서 apache2만 설치되어 있다고 가정.

1. cgi-bin 폴더를 cgi사용 가능하게 만들기
> sudo vi /etc/apache2/mods-enabled/userdir.conf

– <IfModule mod_userdir.c> 안에 아래 내용 추가

<Directory /home/*/public_html/cgi-bin> 

Options ExecCGI
AddHandler cgi-script .cgi
</Directory>
 – Options ExecCGI와 AddHandler를 Root에다가 적으면 모든 곳에서 cgi 사용 가능! 

2. 서버 재시작 한다.
> sudo /etc/init.d/apache2 restart

3. ~/public_html/cgi-bin 밑에 서비스 복사
currentTime.cgi 와 currentTime.wsdl을 복사한다.
currentTime.cgi에는 755의 권한을 준다.

4. 웹 브라우져에서 잘 작동되는지 확인한다.

주석 :
mime에서 cgi를 연결
> sudo vi /etc/apache2/mods-enabled/mime.conf

– #AddHandler cgi-script .cgi 의 주석 해제

Aug 112011
 

본 문서는 gSOAP User Guide[1]를 기반으로 해서 작성하였음.

– gSOAP으로 구현된 WS Provider는 CGI 기반으로 만들어 짐

* 현재 시각을 돌려주는 간단한 Web Service Provider 작성

1. currentTime.h   (헤더파일 생성)

// File: currentTime.h

//gsoap ns service name: currentTime

//gsoap ns service namespace: urn:currentTime

//gsoap ns service location: http://www.yourdomain.com/currentTime.cgi

int ns__currentTime(time_t& response);

 

–  주석에 사용되는 내용은 의미가 있음
– ns뒤에 ‘__’ 두번 한 후 함수 작성

2. currentTime.cpp (실행 코드 작성)
1) object를 사용하지 않을 경우

// File: currentTime.cpp

#include “soapH.h” // include the generated declarations

#include “currentTime.nsmap” // include the XML namespace mappings

int main()

{

 

// create soap context and serve one CGI-based request:

return soap_serve(soap_new());

 

}

int ns__currentTime(struct soap *soap, time_t& response)

{

response = time(0);

 

return SOAP_OK;

 

}

 

2) object를 사용하는 경우

// File: currentTime.cpp

#include “soapcurrentTimeService.h” // include the proxy declarations

#include “currentTime.nsmap” // include the XML namespace mappings

int main()

{

 

// create server and serve one CGI-based request:

 

currentTimeService server;

 

return server.serve();

 

}

int currentTimeService::currentTime(time_t& response)
{

 

response = time(0);

return SOAP_OK;

 

}

 

* stand-alone(non-multithreaded)서버를 돌리고 싶은 경우 main함수에서 return currentTimeService.run(8080);으로 변경

3. 서버용 SOAP 작동을 위한 코드 생성
1) 앞에서 object를 사용하지 않는 경우
> soapcpp2 -S currentTime.h
2) 앞에서 object를 사용하는 경우
> soapcpp2 -c -S currentTime.h

* ‘-c’ 옵션을 사용하면 c코드로 서버코드가 생성됨

4. CGI binary로 컴파일
> c++ -o currentTime.cgi currentTime.cpp soapC.cpp soapServer.cpp -lgsoap++

5. cgi 파일 테스트
./currentTime.cgi < currentTime.currentTime.req.xml

[1] Robert van Engelen, “gSOAP 2.8.3 User Guide”, GENIVIA INC, June 24, 2011, p11~14

Aug 112011
 

본 문서는 gSOAP User Guide[1]를 기반으로 해서 작성하였음.

– 간단한 SOAP Client 제작

http://www.genivia.com/calc.wsdl 에 있는 SOAP Provider로 부터 Stub을 작성하여 C++ 기반으로 작성하였음.
calc 서비스는 간단히 double Type의 두개의 매개변수를 받아 덧셈, 곱셈 등 계산을 하여 double Type의 계산 결과를 리턴하는 서비스이다.

1. ‘.h 헤더 파일’ 생성
(1) C++ without STL ( -s 옵션에 의해 STL이 빠짐)
> wsdl2h -s -o calc.h http://www.genivia.com/calc.wsdl

(2) Pure C Application (-c 옵션)
> wsdl2h -c -o calc.h http://www.genivia.com/calc.wsdl

2. 헤더 파일을 통해 C/C++ API를 생성
(1) C++
> soapcpp2 -i -C -I<import> calc.h
여기서 ‘<import>’는 ~/gsoap-2.8/gsoap/import 경로를 입력
– ‘-C’옵션은 Client 코드만 생성

(2) C
> soapcpp2 -c -C -I<import> calc.h

3. 실제 서비스를 사용해보는 예제 코드
1) cpp 코드  (예를들어 main.cpp)

#include “soapcalcProxy.h”

#include “calc.nsmap”

int main()

{

calcProxy service;

double result;

if (service.add(1.0, 2.0, result) == SOAP OK)

std::cout << “The sum of 1.0 and 2.0 is ” << result << std::endl;

else

service.soap_stream_fault(std::cerr);

return 0;

}

 

2) C 코드 (예를들어 main.c)

#include “soapH.h”

#include “calc.nsmap”

int main()

{

 

struct soap *soap = soap_new();

double result;

if (soap_call_ns2__add(soap, NULL, NULL, 1.0, 2.0, &result) == SOAP_OK)

printf(“The sum of 1.0 and 2.0 is %lg\n”, result);

else

soap_print_fault(soap, stderr);

soap_end(soap);

soap_free(soap);

return 0;

 

}

 

4. 컴파일
1) c++
> g++ ~/gsoap-2.8/gsoap/stdsoap2.cpp main.cpp soapC.cpp soapcalcProxy.cpp

2) c
> gcc ~/gsoap-2.8/gsoap/stdsoap2.c main.c soapC.c soapClient.c

5. 실행해서 잘 되는지 확인하기

[1] Robert van Engelen, “gSOAP 2.8.3 User Guide”, GENIVIA INC, June 24, 2011, p8~11

Aug 112011
 

* 환 경
– Ubuntu 11.04
– gcc, make, configure, perl (default)
– Bison (우분투 설치 관리자에서 설치 가능)
– Flex (우분투 설치 관리자에서 설치 가능)
– Zlib (zlib.net, http://syaku.tistory.com/69 참조)
– openssl (기본으로 설치 되나 라이브러리 추가 설치 필요 : libssl-dev)

* gsoap을 적당한 위치에 복사해서 아래 명령 실행하면 설치 완료

$ ./configure
$ ./make
$ ./make install

* 설치시 옵션을 붙일 수 있음
./configure –enable-samples (예제도 같이 설치)
./configure –enable-debug (sent.log, recv.log, test.log 파일로 로그가 남음)
./configure –enable-ipv6 (IP v6를 사용하도록 컴파일)

자세한 것은 INSTALL.TXT 파일 참조