Blog


프로젝트 오일러 1번

  • 2013/09/13
  • Perl

10보다 작은 자연수 중에서 3 또는 5의 배수는 3, 5, 6, 9 이고, 이것을 모두 더하면 23입니다.
1000보다 작은 자연수 중에서 3 또는 5의 배수를 모두 더하면 얼마일까요?

1부터 999까지의 자연수 중 3 또는 5의 배수를 구하자.
아주 쉬운 문제.




프로젝트 오일러 시작

프로젝트 오일러는 간단히 말해 수학적인 문제들을 프로그래밍으로 해결해 나가는 퀴즈 프로젝트이다.
이 포스트를 작성하는 2013년 9월 13일 현재까지 총 435문제가 등록되어 있으며 문제의 개수는 앞으로 계속해서 늘어날 예정이다.

자세한 정보는 http://projecteuler.net/http://euler.synap.co.kr/에서 확인하자.

사실 영어로 기술된 수학적인 문제들을 해석하는 것이 번거로워 잘 손대지 않고 있었는데, 한국어로 잘 번역된 사이트가 있는 것을 발견하고 풀어보기로 마음먹었다.

모든 문제는 perl로 풀고, 이용 가능한 수학 모듈이 있으면 활용하여 문제를 풀기로 했다.
(perl을 잘 몰라 공부하며 풀 생각이다.)
또한, 풀이 방법이 아닌 단순히 ‘펄을 이용한 문제 해결’에 집중할 예정이다.

따라서 알고리즘적인 성능 향상보다 이미 존재하는 모듈을 사용하여 해결하므로, 다소 맥빠지는 문제풀이가 될 수는 있겠다…




코드에서 생성한 View에 Id 생성하기

안드로이드에서 ListView를 사용하면서 ViewHolder 패턴이란 것을 많이 사용해 봤을 것이다.
(아니라면 [Android] ListView 구현시에 뷰홀더(ViewHolder) 사용하기 를 보자.)

viewHolder 패턴을 사용하면서 하나의 ListView에 서로 다른 구조를 가진 View들을 보여주게 되면, convertView.getId() 메서드를 이용하여 View의 교체 여부를 결정하게 된다.

위와 같은 코드를 사용하면서, 차츰 View.getId() 메서드를 이용해 View를 비교하는 방법을 즐겨 사용하게 되었는데, 그러던 와중에 문제점이 하나 발생했다.

만약 Id를 가져오고자 하는 View가 코드상에서 생성된 View라면, Id가 없다…
따라서 Id를 따로 생성해 주어야 한다.

API Level 17 부터는 View.generateViewId() 메서드를 사용하면 되겠지만, 보통 진저브레드까지 지원하도록 앱을 만드는 나는 사용할 수 없었다.

그럴 때 사용할 수 있는 메서드가 있다.
역시 내가 구현한 코드는 아니지만, 유용해보여 소개한다.

* 참고
http://stackoverflow.com/questions/1714297/android-view-setidint-id-programmatically-how-to-avoid-id-conflicts




ViewPager에서 현재 보고있는 Fragment 알아내기

안드로이드에서 ViewPager를 사용할 때, 현재 보고있는 Fragment를 알아내는 것은 여간 골치아픈 일이 아니다.

Fragment 내에서 OnResume()가 호출되는 순간으로는 올바르게 알아 낼 수 없다.
onPageChangeListener 등을 쓰는 방법도 있겠지만, 아주 간단하게 구현할 수 있는 방법이 있다.

바로 setUserVisibleHint 메소드를 오버라이드 하는 방법이다.
Android Support Library (rev 11) 에서도 사용이 가능하다.

적용하고자 하는 Fragment에서 다음과 같이 사용하자.

* 참고
http://stackoverflow.com/questions/10024739/how-to-determine-when-fragment-becomes-visible-in-viewpager




PPTP VPN 서버

간단하게 우분투를 VPN 서버로 만드는 방법을 알아보자.
PPTP로 만들면 windows 환경에서 따로 클라이언트 프로그램이 없어도 쉽게 연결할 수 있다.

설치

$ sudo apt-get install -y pptpd

local / remote ip 설정

/etc/pptpd.conf 파일 최하단에 다음을 추가한다.

locapip 192.168.13.1
remoteip 192.168.13.100-200

DNS 설정

/etc/ppp/pptpd-options 파일에서 ms-dns 항목을 주석을 풀고 수정한다.

ms-dns 8.8.8.8
ms-dns 8.8.4.4

사용자 추가

/etc/ppp/chap-secrets 파일 내용을 수정한다.
ID * Password * 순서로 사용자를 한명씩 추가하면 된다.

# Secrets for authentication using CHAP
# client    server    secret        IP addresses
userId1        *       Password1    *
userId2        *       Password2    *
userId3        *       Password3    *
userId4        *       Password4    *
userId5        *       Password5    *
userId6        *       Password6    *

NAT 설정

사용자가 VPN을 통해 인터넷에 접속하려면 필요하다.
다음 명령어를 실행한다.

$ sudo su
# iptables -t nat -A POSTROUTING -s 192.168.13.0/24 -o eth0 -j MASQUERADE
# iptables-save > /etc/iptables.rules
# exit

그리고, /etc/rc.local 파일에 다음과 같이 추가해준다.

#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will “exit 0” on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.

# 여기 한 줄을 추가한다.
/sbin/iptables-restore < /etc/iptables.rule

exit 0


IP forwarding 설정

ip 포워딩을 허용하기 위해 커널 파라미터를 수정한다.
/etc/sysctl.conf 파일에서 net.ipv4.ip_forward=1 항목의 주석을 풀어주자.

.
.
.
# Uncomment the next line to enable TCP/IP SYN cookies
# See http://lwn.net/Articles/277146/
# Note: This may impact IPv6 TCP sessions too
#net.ipv4.tcp_syncookies=1

# Uncomment the next line to enable packet forwarding for IPv4
# 여기 한 줄의 주석을 해제한다.
net.ipv4.ip_forward=1

# Uncomment the next line to enable packet forwarding for IPv6
#  Enabling this option disables Stateless Address Autoconfiguration
#  based on Router Advertisements for this host
#net.ipv6.conf.all.forwarding=1
.
.
.

그 후, 바뀐 설정을 적용하기 위해 reload 해준다.

$ sudo sysctl -p

MTU 설정

네이버나 다음 같은 국내 포털 사이트들을 접속하기 위해 MTU를 수정해준다.
/etc/ppp/ip-up.local 파일에 다음과 같이 추가한다
(파일이 존재하지 않으면 생성해주자.)

ifconfig $1 mtu 1500

만약 위 설정으로 잘 동작하지 않으면 $1 을 ppp0 으로 바꿔보자
그리고 실행 가능하도록 권한을 수정한다.

$ sudo chmod a+x /etc/ppp/ip-up.local 

pptpd 재시작

다음 명령어를 실행한다.

$ sudo service pptpd restart

위의 과정을 거치면 모든 설정이 완료된다.
시스템을 재시작해도 똑같이 적용된다.

* 참고
http://noise1.tistory.com/5
http://blog.riobard.com/2011/11/12/pptp-vpn-on-ubuntu/
http://blog.naver.com/PostView.nhn?blogId=ilinuxer0&logNo=60167759305




Boot Loader 가 망가지면?

http://ubuntuforums.org/showthread.php?t=1769482

우분투를 비롯한 리눅스를 사용하면서 윈도우와 멀티 부팅을 사용한다면, 누구나 한번쯤은 부트로더가 꼬여서 부팅이 안되는 신비한 경험을 했을 것이다.

이때 당신을 도와줄 아주 좋은 친구 Boot-Repair!

우선 우분투 Live Cd 또는 Live USB로 부팅하자.
그리고 터미널을 열고 아래와 같이 입력해준다.

그 후의 일은 심플한 GUI와 함께 하라는 대로 해주면 된다!

좀 더 자세한 설명은 아래 링크에서 확인.
http://www.howopensource.com/2012/05/reinstall-recover-grub-from-ubuntu-12-04-live-cd-usb/
http://ubuntuforums.org/showthread.php?t=1769482
http://deviantcj.tistory.com/493




비트플래그 (Bitflag)

한번에 여러 가지 속성을 동시에 지정할 때, 편리하게 사용 할 수 있는 방법 중에 하나가 비트플래그이다.
간단하게 안드로이드에서 비트플래그를 사용하는 법을 알아보자.
(사실, 자바랑 똑같다)

우선 사용하는 연산자는 다음과 같다.

~A : NOT 연산자 – A의 각 비트가 0이면 1로, 1이면 0으로 바뀐다.
A & B : AND비트 연산자 – 두 비트가 모두 1일 때 1이다.
A | B : OR비트 연산자  – 두 비트가 모두 0일 때 0이다.
A ^ B : XOR비트 연산자  – 두 비트가 모두 달라야 1이다.

아래는 간단한 예제.

http://pastebin.com/9HspchLS




Type Replace “…” with ellipsis character (…, … ?

ADT에서 Type Replace “…” with ellipsis character (…, &#8230;) ? 라는 경고가 뜬다.

ctrl + 1을 이용한 빠른 수정으로 수정이 안되는걸 보니 버그인듯.

쉽게 말하면 …을 말줄임표 유니코드로 바꾸라는 말씀.
아래처럼 바꾸면 된다.




3D Filp Animation

간단하게 안드로이드에서 사용할 수 있는 3D Filp Animation 입니다.
제가 작성한 코드는 아니고, 유용해 보여서 소개합니다.

세로축을 중심으로 플립하는 animation인데,
중간에 camera.rotateY(degrees); 를 camera.rotateX(degrees); 로 바꿔주면 가로축을 중심으로 회전합니다.
http://pastebin.com/dP7aVmM9




setLayoutParams와 java.lang.ClassCastException

안드로이드에서 setLayoutParams 메서드를 사용했더니 java.lang.ClassCastException이 발생한다면, LayoutParams를 잘못 사용했을 확률이 높다.

어떤 View에 LayoutParams를 적용할 때에는 View의 부모 레이아웃 클래스의 LayoutParams를 적용해야 한다.

예를들어 RelativeLayout a내부에 있는 LinearLayout b에 LayoutParams를 적용한다면,

이런식으로 말이다.

마찬가지로, ListView 내부의 자식 View에서는 AbsListView.LayoutParams를 사용한다.