저는 돈많은 업체가 아니라면 PHP를 권합니다.
PHP의 장점은 오픈소스이고 C를 다 몰라도 사용할 수 있을만큼 학습곡선이 가파르고 공개되어 있는 함수, OOP 클래스가 무궁무진하다는 것이죠. (것도 소스까지 공개되어서)
그리고, 어떤 언어든지 그 확장성은 꼭 언어 자체에만 있지 않습니다.
PHP로 작성한 사이트도 웹서버와 HA 오픈소스 프로젝트와 연계하면 얼마든지 확장성을 갖습니다.
결국 시스템 소프트웨어와 함께 통합했을 때 빛을 발합니다.
하지만, 오픈소스의 장점이 우리나라 IT 시장에선 껌팔이 소년 취급을 받고 있다는 것이 문제이긴 하지요.
(저는 이러한 문화적 현상을 농공행상을 무시했던 양반문화 잔재와 무관치 않다고 생각합니다)
ASP는 다양한 유료 컴포넌트를 사용해 보고 싶다면 도전해 보세요.
그 고유한 패쇄성과 답답한 인터페이스를 파고 들 시간이면 다른 언어를 하나 더 배우는 게 낫습니다.
자바, JSP를 보자면, 그 구조 자체가 상대적으로 복잡합니다. (현업에 계신 분들이라면 다들 인정하시겠죠?)
개인적으로 JSP -> Servlet java -> Java class로 이어지는 자바 아키텍처가 좀 억지라고 생각합니다.
(그냥 고집스럽게 서블릿으로 다 하지 왜 그랬어?라는 생각이 절로 드네요.)
결정적으로, 자바는 "플랫폼 독립적"이라는 달콤한 주장으로 시장을 먹어댔죠.
(저는 자바가 "플랫폼 독립적"이라는 주장에 대해 "그건 개한테나 가져다 주어라"고 말합니다.
이것은 자바 개발자들의 머리 속에나 존재하는 망상이지, 현실은 꼭 그렇지 않습니다.
물론 C나 다른 언어의 불편한 점을 개선한 부분도 있지만 그게 교과서나 여러 책자에 나오는 것처럼 완벽하지가 않고 완벽할 수도 없습니다.
차라리 Java가 platform less-dependent라고 주장한다면 저는 동의할 수 있습니다.)
그건 그렇고, 현실적으로 우리나라 공공기관, 공기업 대부분은 자바와 JSP가 아니면 명함을 내밀수 없습니다.
저도 처음엔 왜 그럴까 고민했죠.
그런데 공공기관 프로젝트 몇 건을 해보니 그 이유를 알겠더군요.
공공기관 프로젝트의 주요 고문 내지 소위 전문가 인력풀의 다수가 누군지 아십니까?
바로 대학교수들입니다.
자기들이 학교에서는 "교수님, 교수님" 소리 들어가면서 학생들에게 존경과 추앙을 받는지는 모르겠습다만
도대체 서비스와 관련된 실제 코딩은 얼마나 해봤는지 묻고 싶을 정도로 어이없는 질문과 지적을 받아본 저로서는
대학무용론을 주장하고 싶을 정도입니다.
어쨌든 이야기 하고자 하는 것은 이 샌님들 머리 속에는 온통 ideal solution으로 패러다임이 꽉 차있다는 것입니다.
Java가 학부 커리큘럼의 상당부분을 차지하고 있는 것 역시 이런 이런 패러다임의 산물입니다.
특히 유학을 통해 학위를 취득한 교수들은 자신들이 수학했던 학교에서 오라클의 자바와 관련한 수많은 소프트웨어를 접합니다.
(우리나라의 현실은 아닙니다만 미국, 영연방의 쓸만한 대학들은 오라클의 지원을 받습니다. 쉽게 말해 소프트웨어를 다 거저 줍니다. 학교로선 돈이 안드니 좋을 수 밖에요.)
그들이 배운 교과서에는 자바가 거의 완벽한 플랫폼 독립적인 언어이고 때문에 architecture neutral에 가장 가깝다고 생각하는 모양입니다. 게다가 OOP죠.
소위 시대적 패러다임을 적절히 갖춘 언어가 자바라고 스스로 깨닫기 보다는 책을 통해 배우고 그렇게 수년간이나 훈련 받게 됩니다.
이런 사람들이 XX위원, 감리, 고문을 지내고 있는 현실에서 Java, JSP로 공공기관 사이트가 도배되다시피 하는 현상은 전혀 이상해 보이지 않는다 하겠죠.
즉, 배운 거 풀어먹기 좋게 시장을 조절하는 것입니다.
단순히 자바가 더 좋고 PHP가 꼬지다고 비교할 게재가 아닙니다.
세상에서 누가 더 큰 소릴 내고 있느냐는 아주 드러운 현실의 문제죠.
Thursday, April 2, 2015
Unity3D vs Cocos2d-x 비교
Unity3D
장점.
1. reference & tech support 가 확실하다.
2. stable버전 업데이트가 빠르다.
3. 3d적 요소들(파티클 같은)을 다양하게 쓸 수 있다.
4. 기본 에셋 외에 다운로더블 에셋을 따로 지원, 런타임에서 리소스를 다운받아 적용할 수 있다.
단점.
1. 2d로 작업시 최소 필요 용량이 30MB다..(이 미친!!)
2. 2d로 작업시 기본 월드가 3d이므로 좌표 변경이 애매하다.
3. 코어단 수정은.. 정말 최악이다.
cocos2d-x
장점.
1. 일단 쉽다.
2. 2d좌표계이므로 좌표계의 정확한 의미만 이해하면 금방 만든다.
3. 라이브러리들을 so로 빌드시에 한개당 대략 4메가쯤 나온다.(본인 코드가 현재 5만줄을 넘어섰으나 포함해도 4메가 정도밖에 안됨)
4. 나름 책도 많다.
단점.
1. 버그투성이.(지속적으로 업데이트되는 내용에 관심을 가지고 봐야 한다.)
2. 버전업시에 호환성이 결여됨..(엄청 짜증남. 코드 호환이 안되서 일일이 수정해줘야 하는경우가 많음.)
3. 안드로이드의 경우엔 최악의 환경설정/디버깅 환경을 제공한다.
4. cocos2d-x.org페이지에 로그인이 안된다.(나만 그런가....)
5. 파티클을 쓸 수 없다.(대략 라이프타임 0.5초짜리 라이프사이클 1개, 파티클 150개짜리 쓰면 프레임이 5~10이 날아간다. 이거 쓸수 없다. 쓰면 프레임 먹는 소리가 들림..)
6. 알파값이 제대로 안빠진다.
http://www.gamecodi.com/board/zboard.php?id=GAMECODI_Talkdev&page=1&sn1=&divpage=1&sn=off&ss=on&sc=on&select_arrange=headnum&desc=asc&no=1936
장점.
1. reference & tech support 가 확실하다.
2. stable버전 업데이트가 빠르다.
3. 3d적 요소들(파티클 같은)을 다양하게 쓸 수 있다.
4. 기본 에셋 외에 다운로더블 에셋을 따로 지원, 런타임에서 리소스를 다운받아 적용할 수 있다.
단점.
1. 2d로 작업시 최소 필요 용량이 30MB다..(이 미친!!)
2. 2d로 작업시 기본 월드가 3d이므로 좌표 변경이 애매하다.
3. 코어단 수정은.. 정말 최악이다.
cocos2d-x
장점.
1. 일단 쉽다.
2. 2d좌표계이므로 좌표계의 정확한 의미만 이해하면 금방 만든다.
3. 라이브러리들을 so로 빌드시에 한개당 대략 4메가쯤 나온다.(본인 코드가 현재 5만줄을 넘어섰으나 포함해도 4메가 정도밖에 안됨)
4. 나름 책도 많다.
단점.
1. 버그투성이.(지속적으로 업데이트되는 내용에 관심을 가지고 봐야 한다.)
2. 버전업시에 호환성이 결여됨..(엄청 짜증남. 코드 호환이 안되서 일일이 수정해줘야 하는경우가 많음.)
3. 안드로이드의 경우엔 최악의 환경설정/디버깅 환경을 제공한다.
4. cocos2d-x.org페이지에 로그인이 안된다.(나만 그런가....)
5. 파티클을 쓸 수 없다.(대략 라이프타임 0.5초짜리 라이프사이클 1개, 파티클 150개짜리 쓰면 프레임이 5~10이 날아간다. 이거 쓸수 없다. 쓰면 프레임 먹는 소리가 들림..)
6. 알파값이 제대로 안빠진다.
http://www.gamecodi.com/board/zboard.php?id=GAMECODI_Talkdev&page=1&sn1=&divpage=1&sn=off&ss=on&sc=on&select_arrange=headnum&desc=asc&no=1936
Android 초음파 오디오 통신(SAPI) 예제 다운로드
초음파 오디오로 통신하는 SAPI 예제이다.
동영상과 동일한 기능을 하는 예제를 작성해 보았다.
API사이트는 아래와 같다.
illiri API(SAPI) : http://illiri.com/index.html
사용방법은 아래의 순서대로 하면된다.
스마트폰이 2개 필요하다.
1. 클라이언트 attach
2. 서버 create
3. 클라이언트 onAttach
4. 서버 onAttached member
5. 클라이언트 onAttached leader
6. 양방향(서버 <-> 클라이언트) transfer -> onTransfer 가능
다운로드
동영상과 동일한 기능을 하는 예제를 작성해 보았다.
API사이트는 아래와 같다.
illiri API(SAPI) : http://illiri.com/index.html
사용방법은 아래의 순서대로 하면된다.
스마트폰이 2개 필요하다.
1. 클라이언트 attach
2. 서버 create
3. 클라이언트 onAttach
4. 서버 onAttached member
5. 클라이언트 onAttached leader
6. 양방향(서버 <-> 클라이언트) transfer -> onTransfer 가능
다운로드
Visual C++ domain name을 IP로 변환
#include <winsock.h>
#pragma comment(lib, "ws2_32.lib")
void init_ws() {
WSADATA WSAData;
WSAStartup (MAKEWORD(2,2), &WSAData);
}
char* get_ip(const char* domain) {
struct hostent *host_entry;
host_entry = gethostbyname(domain);
char* ip = inet_ntoa( *(struct in_addr*)host_entry->h_addr_list[0]);
return ip;
}
int _tmain(int argc, _TCHAR* argv[])
{
init_ws();
char *ip = get_ip("www.freelab.co.kr");
printf("ip=%s\n", ip);
return 0;
}
#pragma comment(lib, "ws2_32.lib")
void init_ws() {
WSADATA WSAData;
WSAStartup (MAKEWORD(2,2), &WSAData);
}
char* get_ip(const char* domain) {
struct hostent *host_entry;
host_entry = gethostbyname(domain);
char* ip = inet_ntoa( *(struct in_addr*)host_entry->h_addr_list[0]);
return ip;
}
int _tmain(int argc, _TCHAR* argv[])
{
init_ws();
char *ip = get_ip("www.freelab.co.kr");
printf("ip=%s\n", ip);
return 0;
}
Visual C++ 파일 drag and drop
메인 이벤트 루프에 다음과 같이 추가하면 파일 드래그 앤 드랍을 받을수 있다.
case WM_DROPFILES:
{
HDROP hDropInfo = (HDROP)wParam;
char sItem[MAX_PATH];
for(int i = 0; DragQueryFile(hDropInfo, i, (LPSTR)sItem, sizeof(sItem)); i++)
{
}
DragFinish(hDropInfo);
}
break;
case WM_DROPFILES:
{
HDROP hDropInfo = (HDROP)wParam;
char sItem[MAX_PATH];
for(int i = 0; DragQueryFile(hDropInfo, i, (LPSTR)sItem, sizeof(sItem)); i++)
{
}
DragFinish(hDropInfo);
}
break;
Subscribe to:
Posts (Atom)