라즈베리파이1에서는 netbeans 를 설치할 수는 있지만 사용이 불가할 정도록 느렸다. 라즈베리파이2에서는 어떤지 궁금해서 설치를 진행해보았다. 설치 방법은 정말 간단한데 오라클 홈페이지에서 리눅스용으로 다운로드를 받는다.


[그림 1] 홈페이지에서 리눅스용으로 선택한 후 JAVA SE 버전을 다운받는다.


그러면 사용자의 Download 디렉토리에 netbeans-8.0.2-javase-linux.sh 라는 파일이 다운로드되는데 명령창에서 다음과 같이 한다. (이 파일을 다 타이핑할 필요 없이 ne 까지만 치고 tab키를 누르면 자동완성된다.)


$sudo sh netbeans-8.0.2-javase-linux.sh


그러면 설치 대화창이 화면에 나타나고 그대로 진행하면 된다.


 설치가 끝났다면 사용자 디렉토리에 netbeans-8.0.2 디렉토리가 생성되고 그 안에 실행파일이 있다. <userHome>/netbeans-8.0.2/bin/netbeans 파일을 실행하면 IDE가 실행된다.


 잠깐 사용해 본 느낌은 의외로 잘 동작한다는 것이다. JDK8과 JVM도 무난하게 깔리고 잘 동작한다. 윈도에서 개발하던 도구 그대로 라즈베리파이(2)의 데비안 OS에서 사용할 수 있다는 것이 무척 신기하다.



Posted by 살레시오
,

 라즈베리파이2에서 무선랜을 설정하는 방법을 알아보자. 라즈비안에 무선랜을 반자동으로 설정해주는 Wifi_Config 가 없어서 쉘명령어로 설정을 해야하는데 비교적 간단히 할 수 있다.


 무선랜 동글을 꼽고 먼저 다음과 같은 명령어로 이것이 인식이 되는지 확인한다.


$sudo iwlist wlan0 scan


그러면 랜카드가 인식한 와이파이 리스트가 나오는데 검색된 무선 공유기의 ESSID 를 확인한다. 그리고 다음과 같은 화일을 nano 에디터로 연다.


$sudo nano /etc/network/interfaces


이 파일에 다음과 같이 내용을 추가한다.



여기서 wpa-ssid 옆에 문자열로 방금 전 검색한 ESSID를 입력하고 wap-psk 옵션에는 비밀번호를 입력한다.


이 파일을 저장하고 나오면 자동으로 설정이 적용되는데 만약 인터넷에 여전히 연결이 안 된다면 다음과 같이 무선랜을 껐다가 켠다.


$sudo ifdown wlan0

$sudo ifup wlan0


그러면 새로운 설정이 적용되어 무선 인터넷에 연결이 된다.



Posted by 살레시오
,

 증감 연산자 ++와 --는 한 개의 피연산자를 갖는 단항 연산자로서 피연산자를 1씩 증가 혹은 감소시키는 것이다. (증감연산자는 C/C++에서의 용법과 동일하다.) 반복문에서 많이 사용되며 피연산자로서 정수형과 실수형 모두 사용할 수 있으나 주로 정수형 변수에 사용된다.


int ia = 10;

ia++; //  ia = ia + 1 과 같다.


double da = 1.0;

da++; // da = da + 1과 같다.


이와 같이 증감 연산자는 수식을 간결하게 만들어주고 실행속도 면에서 좀 더 효율적이다. 이 연산자는 매우 자주 쓰이는 연산자이지만 잘못 사용한 경우에는 발견하기 힘든 오류을 발생시킬 수 있으므로 주의해서 사용해야 한다.


[표 1] 증감 연산자의 종류와 용법

형식

의미

++x

x를 먼저 1증가시킨 후 그 값을 사용

--x

x를 먼저 1감소시킨 후 그 값을 사용

x++

x값을 먼저 사용한 후 1 증가

x--

x값을 먼저 사용한 후 1 감소


위 표에서와 같이 증감연산자는 변수 앞에도 붙을 수 있고 뒤에 올수도 있다.  ++x 나 x++ 는 프로그램에서 다른 조건식이나 수식에 연결되지 않고 단일문으로 쓰일 경우에는 같은 결과를 얻지만 수식의 일부분으로 사용할 경우에는 그 의미가 달라질 수 있다. 다음 예를 보자. (package와 class이름은 각자 다를 수 있다.)


package tut02;
public class Tut02 {
   public static void main(String[] args) {
       int ia, ib;
       ia = ib = 1;
       ia++;
       ib--;
       System.out.println("ia:"+ia+",ib:"+ib);
   }
}


이 예에서 출력되는 ia와 ib값은 각각 2와 0이다. ia++, ib--은 각각 다음과 같다.


ia = ia + 1;
ib = ib - 1;


다음 예에서와 같이 증감연산자가 다른 연산자와 사용될 때에는 주의해야 한다.


package tut02;
public class Tut02 {
   public static void main(String[] args) {
       int  ia = 10, ib = 10, ix, iy;
       ia++;
       ++ib;
       System.out.println("ia:"+ia+", ib:"+ib);

       ix = --ia;
       iy = ib--;
       System.out.println("ia:"+ia+", ib:"+ib);
       System.out.println("ix:"+ix+", iy:"+iy);
   }
}


ia:11, ib:11
ia:10, ib:10
ix:10, iy:11


이 예제에서 ia에 저장되는 값과 ib에 저장되는 값은 각각 10과 11이다. ix=--ia 에서는 ix에 대입되기 전에 먼저 ia값이 1 감소하고 그 후에 그 값이 ix에 대입된다. iy=ib-- 에서는 iy에 ib값이 먼저 대입되고 ib값이 1 감소한다. 증감연산자가 앞에 붙느냐 혹은 뒤에 붙느냐에 따라 동작의 순서가 달라진다는 점에 유의해야 한다.

 관례적으로 증감연산자를 쓰지 말아야 할 경우가 있다.

  1. 하나의 변수가 수식 내에서 두 번 이상 사용될 경우에는 증감연산자를 사용하지 않는다. 예: y = x*2 + x++

  2. 한 변수가 어떤 함수의 인자로 두 번 이상 사용될 경우에는 이 변수에 증감 연산자 ++, --를 사용하지 않는다. 예: func(x*2, x++)

그 외에도 프로그램 작성자가 혼동의 여지가 있을 것 같다면 명확하게 작성하도록 유의해야 한다.



Posted by 살레시오
,

 산술 연산자는 덧셈, 뺄셈 등 산술 연산을 수행하는 연산자들이고 부호 연산자는 부호를 지정하는 것들이다. 산술 연산자는 피연산자가 두 개이므로 이항 연산자이고 부호 연산자는 피연산자가 하나이므로 단항 연산자에 해당된다. 산술 연산자는 다음과 같은 것들이 있다.


[표 1] 산술 연산자

기호

기능

용례

+

덧셈/부호

12+13, a+b, 12.3+45.6+c, +12, +d
-

뺄셈/부호

12-13, a-b, 12.3-45.6-c, -12, -d
*

곱셈

12*13, a*b, 12.3*45.6*c
/

나눗셈

12/13, a/b, 12.3/45.6/c
%

나머지

12%13, a%b


예를 들면 다음과 같다.


int ia = 11, ib = 22, ic, id, ie;
ic = 1a + ib;
id = ia – ib;
ie = ia * ib;
double da = 1.1, db=2.2;
da = ie*ie;
db = da/ia;


부호 연산자는 어떤 값의 부호를 지정하거나 바꾸는데 쓰인다. +, -기호는 부호 연산자로도 사용되며, 부호 연산자는 한 개의 피연산자를 요구하는 단항 연산자이다.  예를 들면 다음과 같다.


+1234   -1234   -temp   +a   -b


따라서 다음과 같은 표현식에서 첫 번째 ‘-’는 부호연산자이고 두번째 ‘-’는 산술연산자이다.


ia = -ib - ic;


 연산의 결과를 변수에 저장할 때는 결과 값이 그 변수의 허용 범위에 들어가는지 여부를 잘 판단해야 한다.


int ia = 2000000;
int ib = ia*10;
byte bya = 129; // 오류
short sa = 700000;//오류


나머지(%)연산의 예를 들면 다음과 같다.


10%5 // 0
3%2 // 1
8%3 // 2
3%5 // 3


한 가지 주의할 점은 %연산자의 피연산자는 정수형과 실수형 모두 사용 가능하다. (C/C++에서는 정수형만 사용가능하지만 자바는 그렇지 않다.)


double da=5.2, db=4.1;
System.out.println(da%db); // 1.1이 출력됨


 다음 예제는 다양한 숫자의 2로 나눈 나머지를 출력해 주는 프로그램이다.


package tut02;
public class Tut02 {
   public static void main(String[] args) {
       byte bya = 13;
       int ia = 23456;
       float fa = 78.567f;
       System.out.println(bya%2);
       System.out.println(ia%2);
       System.out.println(fa%2);
   }
}


1
0
0.56700134


 다음 예제는 두 수의 덧셈, 뺄셈, 곱셈, 나눗셈의 결과를 표시해 주는 프로그램이다.


package tut02;
public class Tut02 {
   public static void main(String[] args) {
       int ia = 23456, ib=789;
       int ir = ia + ib;
       System.out.println("ia + ib = "+ir);
       ir = ia - ib;
       System.out.println("ia - ib = "+ir);
       ir = ia * ib;
       System.out.println("ia * ib = "+ir);
       System.out.println("ia / ib = "+(ia/ib));
   }
}


ia + ib = 24245
ia - ib = 22667
ia * ib = 18506784
ia / ib = 29


 자바는 컴파일하는 시점에서 변수에 어떤 상수를 입력할 때 범위를 체크하여 허용 범위를 넘어선다면 에러를 발생시킨다. 또한 산술연산을 할 때 다음과 같이 자동 형 변환이 일어난다.


  • 두 피연산자 중 하나라도 double 형이면 다른 하나도 double 형으로 변환하고 결과도 double형이다.

  • 그렇지 않고 두 피연산자 중 하나라도 float 형이면 다른 하나도 float 형으로 변환하고 결과도 float형이다.

  • 그렇지 않고 두 피연산자 중 하나라도 long 형이면 다른 하나도 long 형으로 변환하고 결과도 long형이다.

  • 그렇지 않다면 두 피연산자를 모두 int 형으로 변환하고 결과도 int 형이다.


자바에서 산술연산에 대해서는 이 네 가지의 규칙을 따른다. (c/c++의 경우보다 훨씬 더 간결하다.) 특히 마지막 규칙 때문에 예를 들어서 두 개의 byte형이나  short 형의 연산의 결과는 int형이 된다. 따라서 다음과 같은 간단한 연산도 에러를 발생한다.


short sa = 10, sb=20;
short sc = -sa;
short sd = sa+sb; //에러


범위를 벗어나는 것도 아닌데 왜 에러가 발생하는지 처음에는 의아할 수 있다. -sa와  sa+sb의 연산 결과는 int 형이고 이것을 short 형에 대입하려고 하기 때문이다. (C/C++ 프로그래머는 처음에 혼동하기 쉽다.) 자바에서는 크기가 작은 자료형으로의 형변환(lossy conversion)은 무조건 명시적으로 해 주어야 한다. 따라서 다음과 같이 명시적으로 형변환을 해주어야 한다.


short sa = 10, sb=20;

short sc = (short)(-sa);

short sd = (short)(sa+sb);


이것은 byte형에 대해서도 마찬가지이다.




Posted by 살레시오
,

 자바에서 같은 바이트 수를 가지는 long 형과 double 형의 계산 속도 차이가 거의 나지 않는다는 것을 며칠 삽질한 결과 알아냈다. 정수형 연산이 훨씬 빠를거라고 지레 짐작했던 것이 보기 좋게 빗나간 것이다. 왜 그런지는 아직도 잘 모르겠다.


 실험 방법은 long형으로 고정 소숫점 숫자 연산을 간단하게 구현하고,  예를 들어 처음 여섯 자리를 소수 자리로 간주한다면 (즉 1,000,000이 1.0임)


  • 덧셈,뺄셈은 그대로 수행한다.

  • 두 수의 곱셈은 각각을 1000으로 먼저 나누고 곱셈

  • 두 수의 나눗셈은 나눈 결과에 1000000을 곱한다.


이렇게 연산을 하게끔 구성해 놓고 거의 동일한 연산을 수행해 보았더니 오히려 double형을 사용한 것이 더 빠르다는 결과가 나왔다.


 이제는 C++로 코딩해도 똑같은 결과가 나올까 궁금하다.





Posted by 살레시오
,

 맥시마(Maxima)로 미분방정식을 풀 수 있다. 이때 사용되는 대표적인 함수로서 ode2() 함수와 desolve() 함수가 있는데 이 중에서 ode2()함수를 이용하여 아래의 2계 선형 상미방을 풀어보자.

이것을 손으로 풀면 A4용지 한 페이지가 꽉 찰 정도로 풀이 과정이 꽤 복잡한 문제이다. ode2()함수의 첫번째 인자는 미분방정식을 입력해야 된다. wxMaxima에서는

y'(x) 은 'diff(y,x)
y''(x) 는 'diff(y,x,2)

로 입력한다. 그리고 ode2()의 두 번째 인자는 함수(이 경우는 y), 세 번째 인자는 독립변수(이 예제에서는 x이다.)를 넣어주면 된다.


위에서 %k1, %k2는 적분상수를 표시한다. 초기 조건(initial condition)을 입력하여 적분상수를 구하려면 다음과 같이 ic2()함수를 이용하면 된다.


이것으로부터 미방의 해는 y=sin(x) + 3x/25 - 8/25 + 3.1e-0.5x 임을 알 수 있다.


 이 해의 그래프를 그려보고 싶다면 wxplot2d()함수를 이용하면 된다.

위 에서 wxplot2d()의 첫 번째 인자로 도시하려는 함수를 입력해야 하는데 rhs(%o2)라고 되어 있다. 이것은 결과가 저장된 변수 %o2 의 우변(right-hand side)을 추출하는 함수이다. 그리고 두 번째 인자는 [x,0,20] 인데 x축의 범위를 설정하는 것이다.



Posted by 살레시오
,

 맥시마(Maxima)에서 라플라스 변환을 구하기 위한 함수로 laplace() 가 있다.

         문법 : laplace ( f , t , s ) 함수, 시간 변수, 라플라스 변수의 순으로 입력한다.

예를 들어서 1, eat, sin(wt), cosh(at) 함수들의 라플라스 변환을 구하면 다음과 같다.

약간 더 복잡한 함수로 eatcos(wt), tsin(wt), δ(t), t^1.5 의 라플라스 변환은 다음과 같다.

역라플라스 변환은 ilt() 함수를 이용하면 된다.

         문법 : ilt( F, s, t) 라플라스 함수, 라플라스변수, 시간변수 순서대로 입력한다.

예를 들면 다음과 같다.


이와 같이 맥시마를 이용하면 라플라스 변환과 역라플라스 변환 결과를 손쉽게 구할 수 있다.



Posted by 살레시오
,

 자바에서는 문자열(string)을 처리할 수 있는 String 클래스를 제공한다. 클래스에 대해서는 아직 설명하지 않았지만 문자열은 간단하게라도 알고 넘어가야 한다. 자바에서 문자열은 기본형이 아니라 참조형이고 큰따옴표를 이용하여 표현한다. 그리고 문자열 변수를 선언/초기화하는 것은 String은 클래스이지만 기본형의 변수를 선언하고 초기화하는 방법과 동일하다.


String name; //문자열 선언
name = “홍길동”; // 문자열 초기화

String title = “선생님”;//선언과 동시에 초기화


다음과 같이 화면에 출력할 수도 있다.


System.out.println(name); // name 문자열의 내용이 화면에 출력된다.


두 개의 문자열을 서로 연결하는 데 ‘+’연산자를 이용할 수도 있다.


String fullName = name + title; // 두 문자열 연걸
String sayHi = “안녕하세요. “ + name;
String sayHello = “안녕하세요. “ + name + title; //세 개 이상도 연결 가능


다음과 같이 System.out.println() 함수에 문자열 연결식을 직접 입력할 수도 있다.


System.out.println(“안녕하세요. “+name+”씨.”);


이렇게 하면 불필요한 문자열 변수를 생성하지 않고 직접 연결된 문자열을 화면에 출력할 수 있다.


 어떤 기본형 변수의 값을 출력할 때에도 System.out.println()함수를 사용할 수 있다.


double da = 11.2;
System.out.println(da);


함수 System.out.println() 는 문자열을 인자로 주어야 하는데 이경우 변수값 da는 내부적으로 문자열로 자동으로 변환되어서 System.out.println()에 그 문자열을 넘겨준다. 따라서 다음과 같이 연결하는 것도 가능하다.


double da = 11.2;
System.out.println(“da 값은 “ + da + “입니다.”);


이 경우 연결이 일어나기 전에 da값은 문자열로 변환되어 세 개의 문자열을 연결한 새로운 문자열이 System.out.println()에 인자로 넘어가는 것이다.




Posted by 살레시오
,

 자바 프로젝트를 netbean 에서 윈도 실행 파일로 빌드하는 방법은 매우 간단한데 다음과 같이 프로젝트의 속성창에서 설정해주면 된다. (프로젝트명에서 오른 클릭을 하면 '속성'메뉴가 나온다.)

이 메뉴가 체크되었다면 프로젝트명에서 오른 클릭을 하면 'Pakage As..' 메뉴가 새로 생긴 것을 확인할 수 있을 것이다. 하위 메뉴의 'Image Only' 항을 선택하면 윈도우exe파일을 생성할 수 있다. 생성된 이미지는 프로젝트폴더/dist/bundle 폴더 안에 생성된다.


 만약 이것으로부터 msi 인스톨러를 생성하려면 Wix 와 같은 외부툴을 설치하여 사용해야 한다.


 그런데 javafx2 응용프로그램을 image build 를 해서 윈도우 exe 를 생성했을 경우 아이콘이 제대로 심어지지 않는다는 문제가 있다. (아직도 해결이 안 된 것 깉다.) 일단 프로그램 내부에서 사용되는 아이콘 이미지는 다음과 같이 설정해 주면 된다.

@Override

   public void start(Stage stage) throws Exception {

       primaryStage = stage;

       

       Parent root = FXMLLoader.load(getClass().getResource("FXMLDoc.fxml"));

       Scene scene = new Scene(root);

       stage.setScene(scene);

       stage.show();

       stage.getIcons().add(new Image("file:_resources\\icon_256.png"));

   }

하지만 deploy 된 실행 파일에는 아이콘이 제대로 표시되지 않으며 단축아이콘을 바탕화면으로 빼도 역시나 아이콘이 잘 못 표기된다. 여러가지 해결책이 검색되었지만 윈도7에서는 잘 해결되지 않았다.


 그 런데 'Bat to Exe Converter' 라는 프로그램을 이용하여 문제를 한 다리 건너서 해결하는 수가 있었다. 원래의 exe파일을 실행하는 배치파일을 다시 실행파일로 생성한 후 이것에 아이콘을 지정해 주면 문제가 해결되었다. 만약 원래의 실행파일이 ArudinoHarp.exe라고 한다면 다음과 같은 launcher.bat 화일을 생성한다.

    @echo off

    start ArduinoHarp.exe

이것을  'Bat to Exe Converter'  프로그램을 이용하여 아이콘을 지정해 준 후 실행파일로 바꾸는 것이다. 사용자는 이렇게 생성된 launcher.exe 파일을 실행시키거나 바탕화면에 단축아이콘을 지정해 줄 수 있다. 아이콘 이미지의 해상도는 64x64 이상이어야 제대로 표시된다.



Posted by 살레시오
,

 애드센스 수익금이 10달러가 처음 넘으면 등록된 주소를 인증해야 하는데 구글에서는 등록된 주소로 핀(PIN) 번호라는 것을 적은 엽서를 보내 사용자가 수령 후 그 번호를 애드센서에 입력하는 것으로 인증을 하게 된다. 그런데 애드센스를 가입할 때 주소에 아파트 동호수를 적지 않아서 주소를 다시 수정해야 했다. 애드센스 도움말에는 다음과 같이 나와있다.

그런데 아무리 여기 나온대로 톱니바퀴>설정>계정 정보 에 들어가도 ‘주소 수정’항목이 없어서 한참을 헤맸다. 좀 더 검색해 보니다음과 같은 절차를 따르면 된다.


 먼저 애드센스에 로그인한 후 ‘톱니바퀴>지급’ 항목으로 들어가야 한다.



위에서 보는 대로 ‘지급’ 항목으로 들어가는 것이 중요하다.


수취인 프로필로 들어가서 바로 있는 ‘수정’ 링크를 클릭한다.



여기서 주소를 수정한 후 ‘저장’ 버튼을 누른다. 이러면 된다.


 하지만 여기서 주소를 수정했다고 하더라도 이미 잘못된 주소로 발송된 핀번호 엽서는 어쩔수 없다. 3~4주 기다리면 다시 발송된다고 하니 기다리는 수 밖에 없다.



Posted by 살레시오
,