2012. 3. 21. 03:07
유닉스에서는 프로그램 실행시 옵션으로 '-a','-b'등등을 줄 수 있는 것이 많은데 이 처리를 쉽게 하기 위해 만들어진 함수가 getopt입니다.

리눅스라면 getopt.h를, 유닉스 계열은 unistd.h를 include하시면 쓸 수 있습니다.

함수 정의는 당연히 위의 헤더 파일에 있을 거고요. 내용정의가 필요없다는 위의 답변은 저도 무슨 말인지 이해가 안되는군요...ㅡ.ㅡ;;

getopt의 아규먼트는 첫번째 두번째는 그냥 main에서 받는 argc랑 argv를 넘겨주면 되고, 세번째 인자는 옵션 형태입니다. 즉 위의 예제같은 경우 -a -d -i -v가 가능하다는 얘기구요. ':'의 의미는 추가 내용이 필요한 옵션이란 얘기죠. 위의 경우 -i는 -i 뒤에 또 무슨 내용이 와야 된다는 의미입니다.
ex)
while( (option = getopt( argc, argv, "t:d:s:a:" )) != -1 )
{
switch( option )
{
case 't':
strcpy( t_addr, optarg );
break;
case 'd':
strcpy( data_file, optarg );
break;
case 's':
step = atoi(optarg);
break;
case 'a':p
sprintf( account, "~%s/", optarg );
break;
default:
fprintf( stderr, "Usage : ./%s <Enter>\n", argv[0] );
exit( 1 );
}
}

Posted by k1rha
2012. 3. 21. 03:06

소켓을 사용하다보면 어떠한 신호와 연결된 채로 기다리는것이 아니라 지나가야할 경우가 발생한다
그때는 소켓을 넌블러킹으로 만들어주면 된다. 

#include <stdio.h>
#include <fcntl.h>
#include <stdlib.h>
#include <signal.h>
#include <sys/socket.h>
#include <sys/file.h>
#include <netinet/in.h>
#include <string.h>
#include <netdb.h>
#include <string.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <errno.h>

넌블럭킹 소켓

socket() 으로 생성되는 소켓은 기본값으로 Blocking 소켓이다. 하지만 이미 생성된 소켓을 fcntl() 함수를 사용하여 nonblocking socket으로 변경 가능하다.

※ Blocking Socket(B)/Nonblocking Socket(N)

(여기서 errno는 errno.h를 인클루드해야 이용할수 있다.)

- read

  • B : read 버퍼가 비어있을때 block
  • N : read 버퍼가 비어있을때 -1 return, errno==EWOULDBLOCK/EAGAIN

* Blocking socket의 경우에 read 버퍼에 존재하는 데이터의 크기가 read시 요청한 데이터의 크기보다 작은 경우라도 read 버퍼에 존재하는 데이터만큼 리턴되며 block 되지 않음.

- write

  • B : write 버퍼가 꽉 차있을때 block
  • N : write 버퍼가 꽉 차있을때 -1 return, errno==EWOULDBLOCK/EAGAIN

- accept

  • B : backlog( 현재의 connection 요청 큐 )가 비어있을때 block
  • N : backlog( 현재의 connection 요청 큐 )가 비어있을때 -1 return, errno==EWOULDBLOCK/EAGAIN

- connect

  • B : connection이 완전히 이루어질때까지 block
  • N : connection이 완전히 이루어지 않더라도 곧바로 return. 나중에 getsockopt로 connection이 완전히 이루어졌는지 확인가능.

※ Nonblocking 소켓의 장점/단점

  • 장점 : 멀티스레드를 사용하지 않고도 다른 작업을 할 수 있다.
  • 단점 : 프로그램이 복잡해지며, CPU 사용량이 증가한다.

※ Nonblocking 소켓으로 만드는 방법 : fcntl()함수를 이용한다.

int flag;

flag = fcntl( sock_fd, F_GETFL, 0 );

fcntl( sock_fd, F_SETFL, flag | O_NONBLOCK );

이미 생성된 소켓을 fcntl 로 넌블럭 소켓으로 바꿔준뒤 flag 값으로 리턴한다. 

Posted by k1rha
2012. 3. 21. 03:05

(echo "aaaa\r\n\") | nc localhost 8080

이런식으로 인자전달이 되면

login : aaaaa 

Posted by k1rha
2012. 3. 21. 03:04
1. 디렉토리 파일 fopen으로 열수가없는지?
디렉토리 파일을 연다는 것이.. 디렉토리 열어 해당 파일 리스트를 보는 것은 아래와 같이 하시면 됩니다.
opendir()을 사용하시면 됩니다.

아래는 예 입니다...
#include <stdio.h>
#include <unistd.h>
#include <dirent.h>

int main(void)
{
DIR *dir_info;
struct dirent *dir_entry;

dir_info = opendir("."); // 현재 디렉토리를 열기

if ( NULL != dir_info)
{
while(dir_entry = readdir( dir_info)) // 디렉토리 안에 있는 모든 파일과 디렉토리 출력
printf( "%s\n", dir_entry->d_name);

closedir( dir_info);
}
}
Posted by k1rha
2012. 3. 21. 03:03
오늘은 안드로이드로 하이브리드앱을 만들어볼려고 찾아보았습니다.
일단 삽질끝에 처리를 하긴 했는대 기존에 있는 데이터들과는 조금 차이가 있습니다.
제가 진행했던 방법을 기록해두겠습니다.

제일 많이 참고 했던 사이트는 다음과 같습니다.
http://wiki.phonegap.com/w/page/16494774/Getting%20started%20with%20Android%20PhoneGap%20in%20Eclipse


# 1 기본적인 설치
JAVA JDK , Android SDK, Eclipse를 일단 설치를 했구요
설치 방법은 http://v.daum.net/link/8469722?CT=WIDGET 참고 하시면 됩니다.

여기서 골치아팠던게 루비인데요... 왜 루비가 필요한건지...머리가 아파왔습니다.
일단 Apache ANT http://ant.apache.org/index.html
Ruby http://rubyinstaller.org
다음과 같이 받아서 설치를 했습니다.

그리고 다음과 같이 환경설정을 처리 했습니다.
ANDROID_HOME, location of the Android SDK (for example: D:/android-sdk-windows)

ANT_HOME, location of Android Ant (for example: D:\apache-ant-1.8.1)

JAVA_HOME, location of the JDK (for example: C:\Program Files\Java\jdk1.6.0_20)

Path, folders where the operating system always looks when given a command (includes these, for example: C:\Ruby191\bin; D:\apache-ant-1.8.1\bin; C:\Program Files\Java\jdk1.6.0_20\bin; D:\android-sdk-windows\tools)



# 2 폰갭 설치
자 이제부터 폰갭을 받아서 처리 해야 하는대요

위키상에 내용을 보면 Git를 설치해서 내려 받아라고 되어 있습니다. 전 일단 받긴했는데..
머가 잘 안되더라구요
Git Bash (Windows only)
Visit: http://code.google.com/p/msysgit/downloads/list

계속 삽질한 위키상에 대해서 이야기 하겠습니다.
http://github.com/phonegap/phonegap-android 소스를 내려 받아라고 되어 있습니다.

그리고 전 막삽질을 해도 안되었던 부분입니다.

$ ruby ./droidgap classic "C:/Progra~1/Androi~1/android-sdk-windows" pgtest com.example.android.pgtest example/ "c:/Progra~1/Androi~1/phonegap-android/output"
In the above Windows example, the following environment settings were used:
android_sdk_path = "c:\Program Files\Android SDK\android-sdk-windows"
name = pgtest
path = "c:\Program Files\Android SDK\phonegap-android\output" (This is the output location where the example files were placed)
Example (Mac environment):
> cd phonegap-android
> ruby ./droidgap classic android/android-sdk-mac_86/ test_app com.mayerdan.testapp example/ ~/projects/test_droid_phonegap
Note if you get errors like:
BUILD FAILED
~/projects/phonegap-android/framework/build.xml:49: taskdef class com.android.ant.SetupTask cannot be found
followed by more errors like:
0:in `stat': No such file or directory - ~/projects/phonegap-android/framework/phonegap.jar
To fix this, just run the command with the full path to the android SDK
"sdk.dir=/andriod/android-sdk-mac_86" => "sdk.dir=/projects/andriod/android-sdk-mac_86"
Then run `ruby ./droidgap classic /Users/danmayer/projects/android/android-sdk-mac_86 test_app com.mayerdan.testapp example/ ~/projects/test_droid_phonegap` again.

다른 분들은 어떻게 하셨는지 모르겠는대 전 오늘 오전 내내 안되더라구요....


# 3 꼼수를 찾아내다...
그러다 다른 방법을 찾았습니다.
트루모바일 대표이사이신 정우진님과 구글 플러스로 어제 질문을 드렸던 부분이 있어서 찾아보았습니다.
그리고 약간 다른 방법으로 접근을 했습니다.

먼저 폰갭 사이트에서 다운을 받았습니다.
http://www.phonegap.com/download-thankyou

압축을 푸신후에 phonegap\Android 디렉토리에서 두 파일만 딱 추출했습니다.
phonegap-1.0.0.jar , phonegap-1.0.0.js

그리고 이클립스로 기존에 안드로이드 프로젝트 생성 하듯 진행을 합니다.

프로젝트 루트 폴더에 두 개의 새로운 폴더를 만들어 둡니다
/libs
/assets/www
Android 폴더 내에 있는 phonegap.js 파일을 /assets/www 로 복사한다.
phonegap.jar 파일을 /libs 폴더로 복사한다.
xml 폴더를 /res 로 복사한다.


프로젝트 아래의 /src 폴더에 있는 Project 메인 Java 파일({$프로젝트명}Activity.java – 예:DuraboysActivity.java)에서 몇 가지 수정을 하여야 한다.
class의 extend를 Activity 에서 DroidGap으로 변경한다.
setContentView(); 를 super.loadUrl("file:///android_asset/www/index.html");로 변경한다.
import com.phonegap.*;을 추가한다.

/libs 폴더에서 오른쪽 마우스 버튼을 클릭한 후 Build Paths/ > Configure Build Paths를 선택한다.
이때 표시되는 화면의 Libraries 탭에서 Add Jars 를 선택하여
Project에 phonegap-1.0.0.jar 를 추가한다.

AndroidManifest.xml를 찾아 오른쪽 마우스를 클릭한 후 Open with > Text Editor 를
선택하여 파일을 연다.
빨간색 부분을 추가 한다.

< ?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.Dura.Demo"
android:versionCode="1"
android:versionName="1.0">
<supports-screens
android:largeScreens="true"
android:normalScreens="true"
android:smallScreens="true"
android:resizeable="true"
android:anyDensity="true"
/>
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.RECEIVE_SMS" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.WRITE_CONTACTS" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-sdk android:minSdkVersion="10" />

<application android:icon="@drawable/icon" android:label="@string/app_name" android:configChanges="orientation|keyboardHidden">
<activity android:name=".DemoActivity"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>

</application>
</manifest>


/assets/www 에 index.html 파일을 만든다
<!DOCTYPE HTML>
<html>
<head>
<title>PhoneGap</title>
<script type="text/javascript" charset="utf-8" src="phonegap.js"></script>
</head>
<body>
<h1>Hello World</h1>
</body>
</html>

여기까지하고 기존 안드로이드 빌드하듯 처리 한다.
그러면 헬로 월드를 만날수 있다.

일단 오전 삽질한 결과를 기록하는건대... 이게 정확하게 맞는건지는 잘 모르겠다.
잘못된 부분이 있음 연락 주시면 수정도 하고 저도 파악좀 했음 한다..

아직도 루비가 왜 필요한지를 모르겠다... 
Posted by k1rha
2012. 3. 21. 03:03

매니페스트에 등록 activity에 아래 추가

android:screenOrientation="portrait"

Posted by k1rha
2012. 3. 21. 03:02

 public void jsonparse() {
// String Result;
String Json = "[{\"Product\":\"Mouse\", \"Maker\":\"Samsung\", \"Price\":23000},"
+ "{\"Product\":\"KeyBoard\", \"Maker\":\"LG\", \"Price\":12000},"
+ "{\"Product\":\"HDD\", \"Maker\":\"Western Digital\", \"Price\":156000}]";
try {
String Result = "주문 목록\n";
JSONArray ja = new JSONArray(Json);
for (int i = 0; i < ja.length(); i++) {
JSONObject order = ja.getJSONObject(i);
Result += "제품명:" + order.getString("Product") + ",제조사:"
+ order.getString("Maker") + ",가격"
+ order.getInt("Price") + "\n";
}
// mResult.setText(Result);
} catch (JSONException e) {
// Toast.makeText(v.getContext(), e.getMessage(), 0).show();
}

}

Posted by k1rha
2012. 3. 21. 03:01

private OnTouchListener mTouchEvent = new OnTouchListener() {
public boolean onTouch(View v, MotionEvent event) {

Button b = (Button)v;
Button Blank = (Button) findViewById(R.id.Blank);

action = event.getAction();
int pureaction = action & MotionEvent.ACTION_MASK;
int pid = (action & MotionEvent.ACTION_POINTER_ID_MASK)
>> MotionEvent.ACTION_POINTER_ID_SHIFT;


if(action == MotionEvent.ACTION_DOWN){
if(t_flag==0){
t_left=b.getLeft();
t_right=b.getRight();
t_top=b.getTop();
t_bottom=b.getBottom();
t_flag=1;
}
}
else if (action == MotionEvent.ACTION_MOVE) {



mResult.setText("bLeft : "+b.getLeft()+"bTop : "+b.getTop()+"__Left : "+(int)event.getRawX()+"Top : "+(int)event.getRawY()+"\n");
b.layout((int)event.getRawX()-40,(int)event.getRawY()-250,(int)event.getRawX()+60,(int)event.getRawY()-150);



} else if (action == MotionEvent.ACTION_UP) {
t_flag=0;
b.layout(t_left,t_top,t_right,t_bottom);
//Toast.makeText(PuzzleActivity.this,"L:"+b.getLeft()+":"+event.getX()+"T"+b.getTop()+":"+event.getY()+"R"+b.getRight()+"B"+((int)event.getX()+100)+":"+b.getBottom()+":"+((int)event.getY()-100),Toast.LENGTH_LONG).show();
//Toast.makeText(PuzzleActivity.this,"L:"+event.getX(0)+"__"+event.getY(0),Toast.LENGTH_LONG).show();

On_Click.허용되지않은 태그 사용중(b);

// b.setBackgroundResource(R.drawable.backimg2);
//System.out.println("x=" + event.getX() + " y=" + event.getY());
}
return true;
}
};

Posted by k1rha
2012. 3. 21. 03:00

http://androiddeveloper.tistory.com/56

manifast 를 건들면된다

strings.xml 에서 바꿔줘도 간단한다. 

Posted by k1rha
2012. 3. 21. 02:59

//입력부분

SharedPreferences prefs = getSharedPreferences("k1rha", MODE_PRIVATE); //환경변수 이름
SharedPreferences.Editor ed = prefs.edit(); //설정

ed.putString("SPF_user_id", user_id); //키값설정.. (식별자임)
ed.commit();


//출력 부분
// SharedPreferences prefs = getSharedPreferences("k1rha", MODE_PRIVATE); //환경변수이름으로 가져오기
getUser = prefs.getString("SPF_user_id", ""); //식별자로 가져오기

Posted by k1rha