우선 windows.h 헤더를 포함해야 한다.

BOOL gotoXY(int x,int y)
{
    COORD pos;   //short 타입의 X, Y 속성이 들어 있는 구조체이다.
    pos.X=x;
    pos.Y=y;
    return SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),pos);
}




보통 set메서드가 있으면 get메서드가 있기 마련이지만
커서위치를 얻으려면 GetConsoleCursorPosition같은게 없어서 좀 다른방법을 써야 한다.
여기서는 GetConsoleScreenBufferInfo()함수를 쓰는데

buf.dwCursorPosition역시 COORD 타입이다.

COORD getXY()
{
    COORD pos;
    CONSOLE_SCREEN_BUFFER_INFO buf;
    GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE),&buf);
    pos.X = buf.dwCursorPosition.X;
    pos.Y = buf.dwCursorPosition.Y;
    return pos;
}




pitching velocity unit converter (mph - kph) 제작일기...



구글플레이에서 다운받기 :

https://play.google.com/store/apps/details?id=com.zetagate.pitchspeed





◎ 레이아웃 설정과정.


→ 메인 액티비티 레이아웃 xml 에서 ListView 배치.


→ String 배열 생성후 값 저장


→  ArrayAdapter<String> 객체 생성. 


→ 객체 생성 시 TextView 레이아웃 리소스가 @android:layout/simple_list_item_1 로 지정되어 있어서

  스타일을 자유롭게 변경 불가..


→ 프로젝트 디렉터리 내 layout폴더에 사용자정의 레이아웃 xml파일 생성 후 TextView레이아웃 정의.

  android:minHeight 으로 간격 조절.


→ 어레이어댑터 생성자에서 데이터(String[])도 역시 지정.


→ ListView객체에서 setAdapter로 어레이어댑터(텍스트뷰 레이아웃과 리스트 데이터) 설정




◎ 데이터 생성과정 (정수(integer)로만 출력되도록 처리).


→ mph 속력 * 1.609344 를 계산하여 소수점 이하 자리를 취하고 det이라 함.


→ det < 1-RATIO/2 일 시 mph속력 하나당 kph속력 하나 출력.


→ 1-RATIO/2 < det < RATIO/2 일 시 mph속력 하나당 kph속력 두 개 출력


→ else  올림 처리하여 kph속력 하나 출력.


제작자 페이지 : http://zetagate.com








1. 우선 Keystore(키스토어)자체가 다른 경우. 당연히 업로드 실패가 뜬다.





2. 그렇다면 같은 키스토어 내에서 Alias가 다른 경우는?



이것 역시 업로드가 제한된다.





3. 패키지 경로가 다른 경우도 역시 실패.






그냥 궁금해서 직접 해봤습니다...











2014. 10. 08. 개기월식 촬영

(800만 화소 폰카메라...)




19시 29분 18초





20시 33분 38초







20시 44분 40초








21시 06분 24초




Adobe AIR로 안드로이드 애플리케이션을 만들 때

플래시디벨롭 등에서 adt를 실행하여 디버그모드로 테스트하려고 하면

IP주소를 입력하라는 창이 뜨고 정상적으로 동작하지 않는 경우가 있는데,


USB디버깅을 7936번 포트를 통해서 하므로

adt에서 option에 -listen 7936 이라고 써 주면 디버그모드가 정상적으로 실행된다.




adt -package -target %TYPE%%TARGET% %OPTIONS% %SIGNING_OPTIONS% "%OUTPUT%" "%APP_XML%" %FILE_OR_DIR%

(여기서 OPTIONS 부분. 플래시디벨롭에선 packager.bat 파일에 있음.

 그리고 run.bat에서 android debug 부분을 찾아서

TARGET=-debug
OPTIONS=-listen 7936

위와 같이 설정해 주면 간편하게 할 수 있다.)





'ㄱ-힣'과 한글만 입력받게 하기


한글만 허용하도록(혹은 한글만 제한하는) 문자열을 검사할 때

ㄱ-힣 이라고 범위를 지정하는 경우를 볼 수 있는데

ㄱ는 유니코드 코드포인트가 12593,  '가'는 44032로 상당히 멀리 떨어져 있기 때문에

그 사이에 있는 문자들도 포함하게 되어버린다.


만약 다음과 같은 코드로 한글만 허용토록 했다면(Java),

if(str.matches("^[ㄱ-힣]*$"))

유니코드에서 코드포인트가 저 범위 안에 들어 있는 '誤'같은 문자까지 입력이 가능하게 된다.





따라서 자음/모음만 낱으로 있는 부분과 가-힣 부분을 따로 써야 한다.

 ^[ㄱ-ㅎㅏ-ㅣ가-힣]*$

혹은 완전한 글자만 허용하려면

 ^[가-힣]*$

으로 정규식을 쓰면 된다.



UTF-8과의 인코딩 문제 등으로 안 될 경우에는,

^[\u3131-\u318E\uAC00-\uD7A3]*$

(ㄱ-ㆎ 가-힣)

(ㆎ는 아래애)



\u1100-\u11f9 범위의 조합형 자모도 있지만 이 포스팅에서는 생략.






※사용예시 (프로그래밍 언어에 따라 정규식을 /와 /로 묶어서 표현하는 경우가 있음)


*Java


*AS3.0





결론은 ㄱ-힣 범위를 쓰면 의도와 다른 결과가 나올 수 있다는 것입니다..



안드로이드 킷캣(api 19)이 나온 뒤 이클립스를 업데이트하고

새 프로젝트를 생성하니까 appcompat_v7이 포함되면서 이전에는 없던 문제들이 생긴다.


@android:style/Theme.NoTitleBar

는 실패.(런타임 에러가 난다)


@android:style/Theme.Holo.NoActionBar

는 minSdkVersion이 11이상(안드로이드 3.0 허니콤)일 때만 돼서 실패.


에러내용들을 보면

android:theme을 "@style/AppTheme"로 해야된다고 나오는데

그렇게 설정한 뒤 액티비티의 onCreate() 내에서 requestWindowFeature로 타이틀바를 없애야한다.

setContentView()를 호출하기 전에 해야된다는 것에 유의!


예시)

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        this.requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.activity_main);




이렇게 하면 어플 실행 시 타이틀바가 잠깐 보이다가 사라지는데

뭔가 미봉책 같은 느낌...

처음부터 appcompat_v7을 생성되지 않게 하면 기존방식대로 @android:style/Theme.NoTitleBar 으로 되지 않을까 싶은데 아직 해보지는 않았다


appcompat_v7이 생성되지 않게 하는 법은 인터넷으로 검색해보면 쉽게 찾을 수 있다. 






윈도우에서 Android SDK Manager를 실행했는데 실행이 되지 않고 바로 꺼져버린다면

다음과 같은 환경변수를 추가하면 해결될 수 있다.


변수 : JAVA_HOME

값 : JDK(Java Development Kit)가 설치된 디렉터리




1. 내컴퓨터를 우클릭하여 속성 - 고급설정으로 들어간다.






2. JAVA_HOME환경변수로 jdk설치경로를 지정한다.







이전글 : 멀티플렉서 (MUX)


디멀티플렉서(Demultiplexer : 역다중화기, 디먹스)



디먹스는 먹스와 반대되는 기능을 한다.

한 개의 선으로 들어오는 입력을 n비트의 선택 입력에 따라 2ⁿ개의 선 중 하나로 출력한다.


1-to-4 디먹스로 예를 들어보면,

선택입력이 00일 때 0번 출력선으로 출력,

선택입력이 01일 때 1번 출력선으로 출력,

선택입력이 10일 때 2번 출력선으로 출력,

선택입력이 11일 때 3번 출력선으로 출력하는 것이다.




□ 1to4 디먹스의 논리식(불대수식)

4to1먹스와는 반대로 출력이 4개이므로 논리식도 4개로 써 볼 수 있다.

데이터입력 d와 선택입력 s0, s1 그리고 출력 x0, x1, x2, x3이 있으면

각각의 출력에 대한 논리식은

x0 = s1's0'd

x1 = s1's0d

x2 = s1s0'd

x3 = s1s0d


이렇게 나오는데, d를 제외한 부분을 보면 선택입력에 대한 디코더와 같은 논리가 있다는 것을 알 수 있다.

s1's0'은 선택입력이00일 때만 참이 되고,

s1's0은 선택입력이 01일 때만 참이 되고..

이런식으로 선택입력에 따라 x0~x3중 하나만 참이 되어서 데이터입력인 d값이 그곳으로 출력되는것이다.





□ 1to4 디먹스의 블록도






□ 먹스와 디먹스의 연결



먹스의 출력을 디먹스의 입력으로 넣고 동일한 sel(선택입력)을 주면

먹스와 디먹스가 서로 반대되는 역할을 하기 때문에 먹스쪽의 입력이 디먹스쪽의 출력으로 그대로 나오게 된다.

그러나 정확히 말하면 먹스쪽 데이터입력이 하이임피던스상태여도 디먹스쪽 출력은 0이 나오기 때문에 완전히 그대로 나오는 것은 아니다...




□ Verilog로 디먹스 구성하기


베릴로그로 디먹스를 구현해보자.

디먹스의 논리식을 참고하여 블록도대로 그대로 작성해보면

일단 아래와 같이 구성할 수 있다.(더 아래쪽에서 간단한 코드가 나옵니다)


module demux4(data, sel0, sel1, out0, out1, out2, out3);
    input data;
    input sel0 ,sel1;
    output out0, out1, out2, out3;
    wire w0, w1, w2, w3;
   
    and(w0, ~sel0, ~sel1);
    and(w1,  sel0, ~sel1);
    and(w2, ~sel0,  sel1);   
    and(w3,  sel0,  sel1);
   
    and(out0, w0, data);
    and(out1, w1, data);  
    and(out2, w2, data);
    and(out3, w3, data);

endmodule  



선택입력과 출력을 리스트로 묶고 동작적 모델링을 사용하여 코드를 더 간단히 해 보면,

module demux4(data, sel, out);
    input data;
    input[1:0] sel;
    output[3:0] out;
   
    wire data;
    wire[1:0] sel;
    reg[3:0] out;
   
    always @(data or sel) begin
        out[sel] = data;
    end
endmodule


여기서 4개의 출력선 중 출력이 없는 선은 하이임피던스 상태가 나오는데,

위의 코드에서 reg[3:0] out = 0; 이렇게 초기값으로 0을 인가하면 출력이 없는 선도 0값을 나오게 할 수 있다.




관련글 : 멀티플렉서(MUX)

관련글목록 : 블로그 '전자' 카테고리





VPN(Virtual Private Network : 가상 사설망)접속을 이용하면

외부 네트워크에서도 마치 내부망에서 접속하는 것처럼 사설망을 구성할 수 있다.


외부망에서 기존에 연결되어 있던 네트워크 회선 위에서 VPN연결을 하는 것으로

인터넷이 끊겨 있으면 이용할 수 없으며 모바일기기에서 3G/4G접속 시

통신사 데이터요금 없이 인터넷을 이용할 수 있는 것이 아니다.


VPN의 목적으로는 여러가지가 있지만..

비교적 적은 비용으로 외부에서 사설망에 접근할 수 있는 일종의 터널을 만드는 데에 쓰이거나

아니면 A, B, C가 있다고 할 때, A에서 C로의 접근은 차단되어 있으나 B에서 C로는 접속할 수 있고,

B에 VPN서버가 열려있고 A가 권한이 있다면, A에서 B를 거쳐 C로 접속할 수도 있다.



윈도우7(Windows7)이상에서는 자체적으로 VPN 서버를 여는 기능이 있는데

공유기 기종이나 네트워크 연결상황에 따라 안 될 수도 있다.

(공유기에서 직접 VPN서버를 열 수 있는 것도 있습니다)



1. 제어판에서 '네트워크 및 공유센터'로 들어가 '어댑터 설정 변경'을 누른다.






2. Alt키를 눌러서 메뉴를 연 뒤 '파일 - 새로 들어오는 연결'을 누른다





3. '사용자 추가'를 눌러서 계정을 만든다.

  여기서 '사용자 이름'과 '암호'는 VPN접속을 할 때 ID와 비밀번호가 되므로 잘 정해둬야 한다.





4. 체크한 뒤 다음버튼을 누른다.






5. Internet Protocol Version 4 (TCP/IPv4) 를 선택한 뒤 속성을 눌러서 IP주소를 할당한다.

  IP주소의 시작과 끝에 각각

10.1.0.1 , 10.1.0.10 이나,

192.168.5.1 , 192.168.5.10 등

현재 네트워크와 충돌하지 않는 사설IP 대역을 정해주면 된다.


하지만 VPN접속측에서 VPN서버측을 통해 인터넷으로 나가려고 할 때

VPN서버측에 공유기(DHCP서버)가 있다면 공유기의 서브넷과 맞춰줘야한다.

가령 공유기 DHCP서버의 서브넷마스크가 255.255.255.0이고  192.168.50.100 ~ 192.168.50.200 대역의 IP를 할당한다면, VPN IP주소 할당은 192.168.50.201 ~ 192.168.50.210 로 하는 것이다.

(서브넷은 같게, 공유기의 DHCP할당대역과는 다르게)






6. 위 5번에서 설정이 다 끝났으면 '엑세스 허용'을 눌러 완료한다.

  그러면 '들어오는 연결'이라는 항목이 생겨 있는데 연결을 암호화하려면 '모든 사용자의 암호 및 데이터 보안 필요'에 체크한다.






7. 공유기가 있을 경우

  1723번 포트와 47번 포트를 각각 포트포워딩해야 한다.

  그리고 공유기의 PPTP기능을 활성화시켜준다.

  공유기에 따라서 VPN관련 설정을 따로 하는 부분이 있을 수 있다.

 

포트포워딩 시 IP주소로는 VPN서버를 여는 컴퓨터의 사설IP를 입력한다.

(시작 - 맨아래 프로그램 및 파일 검색 - cmd - cmd.exe실행 후 ipconfig 명령어 입력하면 사설 IP를 볼 수 있습니다.)






8. 이제 외부 네트워크에서 접속하는 것을 테스트해 보는데

  모바일기기의 3G/LTE를 이용하면 쉽게 할 수 있어서 그걸로..


 기기마다 다 다르지만 보통 네트워크 설정하는 메뉴에서 VPN연결을 찾아볼 수 있다.








9. 외부망에서 접속하는  테스트를 위해 와이파이 대신 3G나 LTE로 연결한다.

 이름 입력란에는 이 설정의 이름을 알아볼 수 있게 적어두는 것으로 위 3번 그림에서 입력한 이름과는 관련없다.


서버주소는 VPN서버를 연 쪽의 공인IP를 적어야하는데,

그쪽 컴퓨터에서 http://ipconfig.co 등의 사이트에 접속해보면 알 수 있다.


PPP암호화는 위 6번에서 암호화에 체크를 했으면 여기서도 체크한다.




10. 설정이 끝났으면 3G/LTE상태인것을 확인하고

위 3번에서 설정했던 사용자이름과 비밀번호를 입력한다.



연결 성공시 화면





VPN서버가 있는 컴퓨터쪽에서도 연결이 들어온 것을 확인할 수 있다.





이제 모바일기기에서 공인IP주소를 확인해보면

서버쪽 IP를 통해 인터넷으로 나간다는 것을 볼 수 있다.





+ Recent posts