8월 182011
 

 오래간 만의 해군 포스팅이네요… ㅇㅇ사령부에서 전역한지도 벌써 3년이 넘었습니다.. 3년동안 정말 많은 일이 있었던 것 같습니다. 

 해군 시절 때는 육군이랑 다른 그런 명칭이 많이 있었습니다. 뭐 물론 해군에 복무 중일 때는 몰랐었지만 예비역이 된 후 대학의 후배나 동기나 선배들의 말을 들어보면 안맞을 때가 많더군요. 전역한지 얼마 안되서 아직 해군에 관심이 많던 시절에 해군 용어만 모아놓은 블로그 포스팅 같은 것도 본적이 있었습니다. 그냥 한번 더 정리해볼까… 라는 생각이 들어서 한번 적어보려고 합니다. 물론 여기 적혀 있는 내용은 옛날 내용이며 확실히 서면으로 남겨져 있는 것이 아니고 당시 선임으로부터 들은 이야기도 있기 때문에 출처는 불명확 합니다.

 * 쇼 핑
   육군의 미씽이랑 같은 말로 예상.. soap이라는 비누에서 나온 단어로 추정.. 바닥에 샴푸나 비누를 풀어서 청소하는 것을 말함
 * 데 끼
   화장실 청소할 때 쓰는 Brush를 명칭
 * 레이스
   걸레를 의미함
 * 스마프 (? 스나프?)
   밀걸레를 의미 (해군은 밀걸레를 데끼로 빱니다?)
 * 셈브레이
   해상병 전투복 상의
 * 당가리
   해상병 전투복 하의
 * 사이드를 탄다
   1. 구석 및 후미진 곳을 청소한다.
   2. 꿀을 빤다.
 * 선수

   선임 수병의 약자
 * ㅇㅇ수병
   해군은 병 계급 상호간에 계급을 부르지 않고 ㅇㅇ수병으로 호칭함
 * 열외
   귀찮은 일을 하지 않게된 위치.. 신(神?)
 * 문관
   생활반장을 끝내고 전역일만 기다리는 말년병장
 * 교반
   육군의 소대(때로는 분대)와 유사(생활반으로 순화됨)
 * 교반장
    생활반장으로 순화 (내무반장과 같음)
 * 오장
    아주 작은 단위의 대표 (오와 열 할 때 ‘오’의 ‘장(長)’이란 뜻으로 예상)
 * 소재반
    부대 마다 틀릴 것 같지만, 물품 수령하고 식사당번을 짰던 것 같음..
 * 막내 오장
    막내 옷다리기, 막내 관리? 
 * 갑사 
    일종의 작업(이라고 쓰고 노가다라고 읽음)을 전문으로 하는 분들의 명칭.
 * 선임하사
    부사관(하사,중사 급?) 중 선임
 * 분대
   육군의 중대와 유사(생활관으로 순화됨)
 * 분대장
   생활지도관으로 순화 
 * 츄라이
   1. 식사당번
   2. 식판
 * 15분전
   준비 해
 * 5분전
   준비 끝

8월 172011
 

 # 문제점
   – 입력값의 반올림 주의 : Cent 이하 단위를 무시할 것.
   – 나머지 돈의 균등분배.

#include <iostream>

#include <algorithm>

#include <iomanip>

#include <cmath>

#include <functional> 

using namespace std;

int main()

{

int size;

int humens[1005];

int humens_spent[1005];

cin >> size;

while (size)

{

int sum = 0;

int avg;

for (int i=0; i<size; i++)

{

double temp;

cin >> temp;

humens[i] = (int)(temp * 100 + 0.5);

sum += humens[i];

}

sort(&humens[0], &humens[size], greater<int>() );

avg = sum/size;

int remain = sum% size;

sum = 0;

for (int i=0; i<size; i++)

{

humens_spent[i] = avg;

}

for (int i=0; i<remain; i++)

{

humens_spent[i]++;

}

for (int i=0; i<size; i++)

{

sum += abs(humens_spent[i] – humens[i]);

}

cout<< “$”<< fixed << setprecision(2) << (sum/2)/100.0 << endl;

cin >> size;

}

return 0;

}

8월 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

8월 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

8월 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 파일 참조

7월 262011
 

1) Apache .htaccess를 수정하기

RewriteEngine On
RewriteCond %{SERVER_PORT} !^443$
RewriteRule ^/directory(.*)$ https://%{HTTP_HOST}/directory$1 [L,R]

2) phpMyAdmin의 config.inc.php파일 수정하기

// 적당한 아래쪽에 설정
$cfg[‘ForceSSL’] = true;

출처 : http://www.michaelbarton.name/2009/12/13/forcing-ssl-with-phpmyadmin/

7월 032011
 

아래의 홈페이지에 들어가서 문서를 확인한다.

약 두가지 방법이 있다.
1. csrf를 끄는 방법

    from django.views.decorators.csrf import csrf_exempt

    @csrf_exempt

    def your_Function(request):

        …

 

2. 아래의 코드를 추가하기

https://docs.djangoproject.com/en/dev/ref/contrib/csrf/

영어를 읽기 귀찮으신 분들을 위해…
– JQuery를 사용하는 경우 아래의 코드를 ajax호출이 담긴 .js파일의 적당한 위치에 복사하면 됩니다.

$(document).ajaxSend(function(event, xhr, settings) {

    function getCookie(name) {

        var cookieValue = null;

        if (document.cookie && document.cookie != ”) {

            var cookies = document.cookie.split(‘;’);

            for (var i = 0; i < cookies.length; i++) {

                var cookie = jQuery.trim(cookies[i]);

                // Does this cookie string begin with the name we want?

                if (cookie.substring(0, name.length + 1) == (name + ‘=’)) {

                    cookieValue = decodeURIComponent(cookie.substring(name.length + 1));

                    break;

                }

            }

        }

        return cookieValue;

    }

    function sameOrigin(url) {

        // url could be relative or scheme relative or absolute

        var host = document.location.host; // host + port

        var protocol = document.location.protocol;

        var sr_origin = ‘//’ + host;

        var origin = protocol + sr_origin;

        // Allow absolute or scheme relative URLs to same origin

        return (url == origin || url.slice(0, origin.length + 1) == origin + ‘/’) ||

            (url == sr_origin || url.slice(0, sr_origin.length + 1) == sr_origin + ‘/’) ||

            // or any other URL that isn’t scheme relative or absolute i.e relative.

            !(/^(\/\/|http:|https:).*/.test(url));

    }

    function safeMethod(method) {

        return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));

    }

    if (!safeMethod(settings.type) && sameOrigin(settings.url)) {

        xhr.setRequestHeader(“X-CSRFToken”, getCookie(‘csrftoken’));

    }

});

 

그러면, 아마 문제가 해결되실 겁니다.

 

4월 162011
 

 
 Richard Dawkins on militant atheism – TED2002 [footnote]http://www.ted.com/talks/lang/eng/richard_dawkins_on_militant_atheism.html[/footnote]

 요즘 열심히 보고 있는 TED 동영상 중 무신론과 관련된 동영상입니다. TED.com 의 CCL에 의해 동영상은 Share 가능합니다. 

 TED2002에서 발표한 내용입니다. 약 30분 분량이구요. 이 내용을 보면 아주 재미있게 무신론에 대해서 설명하고 있습니다. 물론 지금은 도버 교육 위원회 사건(2005)[footnote]http://ko.wikipedia.org/wiki/지적_설계[/footnote]에서 해결된 ID 문제에 대해서도 나옵니다. 물론 미국과 상황은 틀립니다만 무신론자로서 무엇을 해야할지에 대한 힌트를 제공해 줍니다. 물론 저는 아직까지는 이렇게 전투적으로 무신론을 주장할 자신은 없지만요.. 하핫 ;ㅁ; 그리고 단어의 중요성을 이야기 합니다.

 저는 1년 전 까지 종교에 대해서 관대한 편이였습니다. 하지만 이러한 몇몇 동영상 강의를 보게 되면서 생각을 바꾸게 되었습니다. 아이들에게 종교는 도움이 될 것이다라고 생각했던 것이 바보 처럼 느껴졌구요. 있지도 않은 것에게 기대도록 만들고 싶지는 않게된거죠. 저는 아이들이 과학적 회의주의[footnote]http://ko.wikipedia.org/wiki/회의주의[/footnote]적 입장에 서길 바라게 되었습니다.

 믿음이라고 하는 것은 증거 없이 무언가를 참이라고 생각하는 것이라고 생각합니다. 과학은 몇번이나 생각의 전환, 패러다임의 전환을 해 왔습니다. 과학적인 증거가 나오고 검증 된다면 우리는 매우 낮은 확률로 틀릴 수도 있다고 생각하지만 사실이라고 하는 것입니다. 예를 들어서 뉴턴의 법칙은 어느 오차 범위 안에서는 사실이죠. 물론 과학적 증거(evidence)도 있습니다. 뉴턴의 법칙은 맞을 것이라고 생각하는 것은 믿음이 아니죠.

 언제나 바뀌지 않고 고인 물 처럼 하나만 바라보고 나아가는 것은 잘 못된 것이라고 생각합니다. 언제나 우리는 틀릴 수 있으며, 틀린 것을 인정하는 것도 중요하다고 봅니다.

 – 더 많은 내용을 알고 싶으시면 한국 무신론자 모임[footnote]http://www.atheism.or.kr[/footnote]을 참조해주세요.

4월 062011
 

 – 개발 프로젝트 생성시 : Bulid Target을 Google APIs 로 할 것…

= AndroidManifest.xml 수정 =


<?xml version=”1.0″ encoding=”utf-8″?>
<manifest xmlns:android=”http://schemas.android.com/apk/res/android
      package=”kr.pe.kuniz37.GoogleMapB”
      android:versionCode=”1″
      android:versionName=”1.0″>
    <uses-sdk android:minSdkVersion=”9″ />

    <application android:icon=”@drawable/icon” android:label=”@string/app_name”>
        <activity android:name=”.GoogleMaps”
                  android:label=”@string/app_name”
                  android:theme=”@android:style/Theme.NoTitleBar”>
            <intent-filter>
                <action android:name=”android.intent.action.MAIN” />
                <category android:name=”android.intent.category.LAUNCHER” />
            </intent-filter>
        </activity>
       
        <uses-library android:name=”com.google.android.maps” />
    </application>
   
    <uses-permission android:name=”android.permission.INTERNET” />
</manifest>


= res/layout/main.xml =

<?xml version=”1.0″ encoding=”utf-8″?>
<com.google.android.maps.MapView
 xmlns:android=”http://schemas.android.com/apk/res/android
 android:id=”@+id/mapview”
 android:layout_width=”fill_parent”
 android:layout_height=”fill_parent”
 android:clickable=”true”
 android:apiKey=”Your Code Input
 />

Yout Code Input 에는 debug.keystore의 md5 해시를 가져 와야 한다. 운영체제 마다 위치가 다르다.

 윈도우 7의 경우
   keytool -list -keystore /Users/<사용자 명>/.android/debug.keystore
   암호 : android

  인증서 지문(MD5) 에 나와 있는 값을 http://code.google.com/intl/ko-KR/android/maps-api-signup.html 에서 구한다.

= GoogleMaps.java =
 

import java.util.List;
import com.google.android.maps.GeoPoint;
import com.google.android.maps.MapActivity;
import com.google.android.maps.MapView;
import com.google.android.maps.Overlay;
import com.google.android.maps.OverlayItem;
import android.graphics.drawable.Drawable;
import android.os.Bundle;

public class GoogleMaps extends MapActivity {

 @Override
 protected boolean isRouteDisplayed() {
  return false;
 }

 /** Called when the activity is first created. */
 @Override
 public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.main);

  MapView mapView = (MapView) findViewById(R.id.mapview);
  mapView.setBuiltInZoomControls(true);

  List<Overlay> mapOverlays = mapView.getOverlays();
  Drawable drawable = this.getResources().getDrawable(
    R.drawable.androidmarker);
  HelloItemizedOverlay itemizedoverlay = new HelloItemizedOverlay(drawable);

  GeoPoint point = new GeoPoint(19240000, -99120000);
  OverlayItem overlayitem = new OverlayItem(point, “Hola, Mundo!”,    “I’m in Mexico City!”);
  itemizedoverlay.addOverlay(overlayitem);
  mapOverlays.add(itemizedoverlay);

 }
}

= HelloItemizedOverlay.java =

import java.util.ArrayList;
import android.app.AlertDialog;
import android.content.Context;
import android.graphics.drawable.Drawable;
import com.google.android.maps.ItemizedOverlay;
import com.google.android.maps.OverlayItem;

public class HelloItemizedOverlay extends ItemizedOverlay {
 private ArrayList<OverlayItem> mOverlays = new ArrayList<OverlayItem>();
 private Context mContext ;

 public HelloItemizedOverlay(Drawable defaultMarker) {
  super(boundCenterBottom(defaultMarker));
 }

 public void addOverlay(OverlayItem overlay) {
  mOverlays.add(overlay);
  populate();
 }

 @Override
 protected OverlayItem createItem(int i) {
  return mOverlays.get(i);
 }

 @Override
 public int size() {
  return mOverlays.size();
 }

 public HelloItemizedOverlay(Drawable defaultMarker, Context context) {
  super(defaultMarker);
  mContext = context;
 }

 @Override
 protected boolean onTap(int index) {
  OverlayItem item = mOverlays.get(index);
  AlertDialog.Builder dialog = new AlertDialog.Builder(mContext);
  dialog.setTitle(item.getTitle());
  dialog.setMessage(item.getSnippet());
  dialog.show();
  return true;
 }
}


= 실행 =
 – 지도가 안나올 경우 한번 기다린다음에 다시 시도하거나 main.xml의 키를 잘 못 입력하였는지 확인한다.

2월 202010
 

기본적으로 하위비트에서 상위비트로 LED가 shift되는 실험이다. 만약 인터럽트가 발생하면 반대방향으로 작동된다. 책의 예제에서는 한 주기를 마친다음에 적용되었었는데, 바로바로 방향이 바뀌도록 수정한 코드이다.

 

  

#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h> 

typedef unsigned char byte;

volatile byte state = 0;

ISR(INT0_vect)
{
    state = !state;
}

int main(void)
{
    byte count = 0xfe;
    EICRA = 0x02; /* 하강앳지 인터럽트 */
    EIMSK = 0x01; /* int0 사용 */
    DDRD = 0x00;
    SREG = 0x80; /* sei */
    DDRB = 0xff;

    while(1)
    {
        if (state)
        {
            count = count << 1;
            count |= 0x01;
            if (count == 0xff)
            {
                count = 0xfe;
            }
        }
        else
        {
            count = count >> 1;
            count |= 0x80;
            if (count == 0xff)
            {
                count = 0x7f;
            }
        }

        PORTB = count;

        _delay_ms(200);
    }

    return 0;
}