'분류 전체보기'에 해당되는 글 99건
- [Mac] MacPorts coreutils 설치 후 VirtualBox가 설치 안되는 문제 2013.11.11
- [Mac] Mac 설치 후 할일 2013.11.11
- [Java] SynchronizedCollections vs ConcurrentCollections 2013.08.17
- [Java] 병렬 프로그래밍에서 잊지말아야 할 조언들 2013.08.17
- [GWT] eclipse에 GWT project import 하기 2013.08.17
- How to install gnuplot in Mac OS X lion 2013.08.09
- VirtualBox clipboard sharing not working sometimes(클립보드 공유가 가끔씩 안될 때) 2013.05.24
- DHT(Distributed Hash Table 분산 해시 테이블) 2013.04.10
- [번역] Virtual Nodes Strategies 2013.04.10
- Clock & Timer resolution(시간, 타이머 해상도) 2013.01.30
[Mac] MacPorts coreutils 설치 후 VirtualBox가 설치 안되는 문제[Mac] MacPorts coreutils 설치 후 VirtualBox가 설치 안되는 문제
Posted at 2013. 11. 11. 01:07 | Posted in OS/Mac좀 더 편한 터미널 환경을 만들기 위해 MacPorts로 coreutils 설치 후 ln을 다음과 같이 변경시켰다.
(coreutils는 /opt/local/bin 에 설치되며 명령어에 'g' prefix가 붙는다.)
그후 ,VirtualBox 새버전을 내려 받아 설치했다.
그런데, 설치가 되지 않고 이런 에러만 내뱉는다. 지웠다 재설치도 해보고, 리부팅도 해보고 그래도 안된다.
(스크린샷을 안떠놔서 웹에서 영문버전 스크린샷을..)
웹 서핑을 해도 별다른 해결책이 안보인다.
혹시나 시스템 로그를 뒤져보면 뭔가 답이 나올것 같아 몇개의 파일을 살펴보던 중
/var/log/install.log 에서 VirtualBox 관련 메시지를 찾았다.
Nov 10 14:51:23 deepblues-MacBook-Air.local installd[342]: ./postflight: ln: invalid option -- 'h' Nov 10 14:51:23 deepblues-MacBook-Air.local installd[342]: ./postflight: Try 'ln --help' for more information. |
아.. 이게 뭔가.. >.<
coreutils 설치 후 ln을 /opt/local/bin/ln으로 바꿔놓은게 원인이었다. ㅜㅜ
coreutils 설치 명령은 다음과 같다.
$ sudo port install coreutils +with_default_names |
여기서 +with_default_names 옵션은 mac의 명령들을 대체하도록 하는 옵션인데, 검색해보니 수많은 문제를 일으켜 옵션이 안먹도록 제거되었다고 한다.
여러 프로그램들이 mac용 명령어의 옵션을 사용하므로, 옵션이 다른 coreutils들을 호출했다가는 에러가 나기 때문일 것으로 추측된다.
(해결)
따라서, 다음과 같이 설정을 바꾸고, 원래 mac 명령어들을 원복시켜줬다.
/bin/ln, /bin/ls는 원복해서 VirtualBox install에는 문제없게 하고, 터미널 환경은 개선하기 위해
PATH에 /opt/local/bin이 젤 앞에 오도록 하고, 자주 사용하는 ln과 ls만 rename했다.
그리고, VirtualBox 재설치..
짜잔~ 성공!
[Mac] Mac 설치 후 할일[Mac] Mac 설치 후 할일
Posted at 2013. 11. 11. 00:58 | Posted in OS/Mac맥북프로에서 맥북에어로 갈아타면서, 다음엔 시행착오 없이 잘 셋팅할 수 있게 한번 정리해본다.
다음 순서로 설치하니 우왕좌왕 않고 잘 되었다.
text wrangler - 한영키 변환시 필요 키보드 설정 - 한영키(shift+space), Home/End, Control, Command키 변경 등 마우스 설정 - 마우스 스크롤 반전 iterm2 - 마찬가지
dropbox - bash설정 등을 여기에 백업해놓음 xcode - brew를 사용하기 위해 설치 해야 함. 각종 xcode의 tool들도 설치해준다. brew (bash, coreutils, gnutils, subversion) .bashrc - dropbox에 백업해둔 파일을 복사하면 OK chrome - 좀 더 쾌적한 구글링을 위해 크롬을 먼저 설치해도 좋다. evernote source tree eclipse/intellij istat PhotoScape X ... |
(1) 키보드 / 마우스 설정
<한영 변환 shift+space키로 변경>
http://macnews.tistory.com/297
http://macnews.tistory.com/178
딜레이 없이 빠르게 OS X에서 한글-영어 입력기 전환하기.pdf
<USB 키보드 사용시 home/end 키 등 다시 설정해주기>
~/Library/KeyBindings/DefaultKeyBinding.Dict 에 위치시켜준다.
상세는 파일 내용 참조.
Karabiner-Elements 필요 없음!
<USB 키보드 Control, Option, Command 키 변경>
시스템 환경설정 > 키보드 > 키보드 > 보조키... > 키보드 선택 후 원하는 키로 변경
<휠 마우스 스크롤 방향 변경>
맥에서 일반 usb 마우스 휠 스크롤을 해보면 뭔가 좀 이상함을 느끼는데, 트랙패드 방향으로 맞춰져 있어서 Windows PC와 반대 방향으로 움직인다.
ScrollReverser를 설치하고 '수직 반전', '마우스 반전'만 켜준다. 트랙패드는 원래대로 두는 것이 자연스럽다.
- https://pilotmoon.com/scrollreverser/
(2) Xcode 설치
- 개발환경을 만들기 위해서는 기본으로 설치해야 한다.
- 아래의 MacPorts를 설치하기 위해서도 필요하다.
- Xcode가 설치되면, Preference > Downloads 탭에서 "Command Line Tools"를 설치한다.
(3) MapPorts 설치 --> 아예 설치하지 말고 homebrew를 사용하자.
- 좀 더 나은 작업환경을 위해서 2% 부족한 터미널 명령들을 업그레이드 하기 위해서 필수이다.
- MacPorts는 기타 무료 / 오픈 소스 소프트웨어 의 도입을 단순화하기위한 자유 / 오픈 소스 소프트웨어 프로젝트이다. (위키피디아)
- http://www.macports.org/install.php 에서 자신의 Mac OS버전에 맞는 링크를 눌러 다운로드 받아 설치한다.
(4) 좀 더 나은 터미널 환경 (macport는 사용말자. homebrew (4)-1 참고)
- 맥의 기본 명령어들, 대표적으로 'ls'는 기능이 미약하고, 좀 후지다. brew를 이용하여 개선해보자.
- Xcode의 'Command Line Tools'가 설치되어 있지 않다면 설치해야 한다. make가 필요하기 때문.
- homebrew 설치 (이제 모든 설치물들은 /usr/local 아래에 설치된다.)
http://brew.sh/
- bash, coreutils, binutils, gnu-utils, subversion 등을 설치
https://www.topbug.net/blog/2013/04/14/install-and-use-gnu-command-line-tools-in-mac-os-x/
(5) 디스크 파티션 분할하기
(※ 기기 변경을 몇 번 거치면서 느낀건.. 안하는게 낫더라. (1) Xcode 업데이트나 Mac OS 업데이트 시 master 파티션 공간 부족으로 이리저리 앱을 옮기거나 정리한 적이 잦았다 (2) 데이터만 남기고 mac을 재설치하거나 하는 경우는 없었다. 해서.. 굳이 이걸 할필요는 없는 듯..)
- 이 작업은 제일 먼저해도 되고, 좀 더 수월한 작업환경을 갖춰놓고 해도 좋다.
- 250GB 디스크를 70GB primary, 180GB data 파티션으로 분할했다. 혹시나 OS재설치를 대비해 home 디렉토리와 모든 데이터는 data 파티션으로 가도록 설정할 것이다. (DataHD가 data 파티션이다. 백업해뒀던 파일을 몽땅 복사했더니 용량이 얼마 안남았네 ;;;)
(6) home 디렉토리 변경 (파티션 분할 한 경우)
방법은 대강 3가지 정도가 있다.
(방법1) /Users 디렉토리를 data 파티션의 적절한 디렉토리로 마운트 하는 방법. /etc/fstab 등을 건드려야하고 할게 많다.
(방법2) 사용자 설정 > 고급 설정 에서 사용자 home 디렉토리를 data 파티션의 디렉토리로 지정하는 방법.
(방법3) /Users 디렉토리의 사용자 계정을 data 파티션의 디렉토리로 symbolic link를 걸어주는 방법.
다음은 (방법3)에 대한 절차이다. (방법1,2는 구글링으로 찾으면 많은 문서가 있다.)
- 분리한 data 파티션으로 홈 디렉토리를 옮겨준다.
- 계정 이름을 "deepblue"라고 했을 경우, 다음과 같이 symbolic link를 설정한다.
- 기존 home은 deepblue.ori로 변경하고, /Volumes/DataHD/home/deepblue 를 home으로 link를 걸어준다.
- 당연한 얘기지만, /Volumes/DataHD/home/deepblue 는 미리 생성되어 있어야 한다. 홈 디렉토리의 모든 내용을 복사해주자. 숨긴 파일까지 포함해서 옮기는건 당연~
- $ cd /Users
- $ sudo mv deepblue deepblue.ori
- $ sudo ln -s /Volumes/DataHD/home/deepblue deepblue
- symbolic link를 걸어준 후 컴퓨터를 재시작한다. (로그아웃했다가 다시 로그인해도 된다.)
- 설정들을 확인해보고 크게 문제 없으면, deepblue.ori는 삭제한다.
- ※ 맥북프로에서 맥북에어로 갈아타면서 기존 사용하던 홈을 그대로 link시켰더니, 대부분의 설정이 그대로 적용되었다. 하지만, 일부 설정은 다시 맞춰줘야 했다. 별 설정없이 기존 환경 그대로 사용할 수 있어서 편하네. ㅎㅎ
(7) 기타 프로그램들
- istat menus
- Dropbox
- Evernote
- Chrome
- PhotoScape X: 이미지 뷰어.
- VirtualBox
- VisualVm
- Wunderlist
- ...
[Java] SynchronizedCollections vs ConcurrentCollections[Java] SynchronizedCollections vs ConcurrentCollections
Posted at 2013. 8. 17. 19:04 | Posted in 개발이야기SynchronizedCollections(동기화된 컬렉션)과 ConcurrentCollections(병렬 컬렉션)
동기화된 컬렉션 클래스는 컬렉션의 내부 변수에 접근하는 통로를 일련화해서 스레드 안전성을 확보했다. 하지만 이렇게 만들다 보니 여러 스레드가 한꺼번에 동기화된 컬렉션을 사용하려고 하면 동시 사용성은 상당 부분 손해를 볼 수 밖에 없다. 하지만 병렬 컬렉션은 여러 스레드에서 동시에 사용할 수 있도록 설계되었다.
ConcurrentMap에는 put-if-absent, replace, condition-remove 등을 정의하고 있다.
기존에 사용하던 동기화 컬렉션 클래스를 병렬 컬렉션으로 교체하는 것만으로도 별다른 위험 요소 없이 전체적인 성능을 상당히 끌어 올릴 수 있다.
<에이콘 - 자바 병렬 프로그래밍(p.137) 발췌>
동기화되지 않은(unsynchronized) 컬렉션
- List: ArrayList, LinkedList
- Map: HashMap
- Set: HashSet
- SortedMap: TreeMap
- SortedSet: TreeSet
- Since JDK 1.2
- 문제점: Thread Safe하지 않다.
동기화된(synchronized) 컬렉션
- Vector, Hashtable, Collections.synchronizedXXX()로 생성된 컬렉션들
- Since JDK 1.2
- 문제점: Thread Safe하나, 두개 이상의 연산을 묶어서 처리해야 할 때 외부에서 동기화 처리를 해줘야 한다. (Iteration, put-if-absent, replace, condition-remove 등)
병렬(concurrent) 컬렉션
- List: CopyOnWriteArrayList
- Map: ConcurrentMap, ConcurrentHashMap
- Set: CopyOnWriteArraySet
- SortedMap: ConcurrentSkipListMap (Since Java 6)
- SortedSet: ConcurrentSkipListSet (Since Java 6)
- Queue 계열:ConcurrentLinkedQueue
- Since Java 5
- 특이사항: Concurrent(병렬/동시성)이란 단어에서 알 수 있듯이 Synchronized 컬렉션과 달리 여러 스레드가 동시에 컬렉션에 접근할 수 있다. ConcurrentHashMap의 경우, lock striping 이라 부르는 세밀한 동기화 기법을 사용하기 때문에 가능하다. 구현 소스를 보면 16개의 락 객체를 배열로 두고 전체 Hash 범위를 1/16로 나누어 락을 담당한다. 최대 16개의 스레드가 경쟁없이 동시에 맵 데이터를 사용할 수 있게 한다. (p.350)
반대로 단점도 있는데, clear()와 같이 전체 데이터를 독점적으로 사용해야할 경우, 단일 락을 사용할 때보다 동기화 시키기도 어렵고 자원도 많이 소모하게 된다. 또한, size(), isEmpty()같은 연산이 최신값을 반환하지 못할 수도 있다. 하지만 내부 상태를 정확하게 알려주지 못한다는 단점이 그다지 문제되는 경우는 거의 없다.
※ Queue, BlockingQueue 인터페이스는 Java 5에서 추가되었다. (Deque, BlockingDeque는 6에서 추가되었다.)
※ Synchronized 컬렉션은 객체 자체에 락을 걸어 독점하게되고, Concurrent 컬렉션은 객체 자체 독점하기가 쉽지 않은 단점이 있지만, 장점이 훨씬 더 많다. Concurrent 컬렉션은 컬렉션 전체를 독점하기 위해서는 충분히 신경을 기울여야 한다.
※ Hash를 기반으로 하는 컬렉션은 hashCode()의 해시값이 넓고 고르게 분포되지 못하면 한쪽으로 쏠린 해시 테이블을 사용하게 되는데, 최악의 경우는 단순한 Linked List와 거의 동일한 상태가 될 수 있다.
[Java] 병렬 프로그래밍에서 잊지말아야 할 조언들[Java] 병렬 프로그래밍에서 잊지말아야 할 조언들
Posted at 2013. 8. 17. 18:04 | Posted in 개발이야기여러 스레드가 클래스에 접근할 때, 실행 환경이 해당 스레드들의 실행을 어떻게 스케줄하든 어디에 끼워 넣든, 호출하는 쪽에서 추가적인 동기화나 다른 조율 없이도 정확하게 동작하면 해당 클래스는 스레드 안전하다고 말한다.(p.48)
상태 없는(Stateless) 객체는 항상 스레드 안전하다. (p.49)
종종 단순성과 성능이 서로 상충할 때가 있다. 동기화 정책을 구현할 때는 성능을 위해 조급하게 단순성(잠재적으로 안전성을 훼손하면서)을 희생하고픈 유혹을 버려야 한다. (p.65)
일례로, 한 클래스의 멤버 변수를 public으로 노출하여 사용한 경우, 이 변수가 어디서 어떻게 쓰일지 알 수 없으므로, 이 클래스를 Thread safe하게 만들기 위해서는 해당 변수를 사용한 곳을 모두 조사해봐야 한다. 그러나 private으로 숨기고 getter/setter를 사용한 경우 method 레벨에서 동기화를 구현하면 쉽게 Thread Safe한 클래스가 될 수 있다.
따라서, 번거럽더라도 getter/setter를 쓰는 것이 좋다. 너무도 명백하게 내부적으로 잠시 사용하는 inner class 같은 것들까지 getter/setter를 쓰는건 과한 것일 수도 있으니 적절히 판단해서 사용하자.
동기화와 캡슐화에 대한 이야기는 책의 여기저기에서 다른 표현들로 등장한다.
복잡하고 오래 걸리는 계산 작업, 네트웍 작업, 사용자 입출력 작업과 같이 빨리 끝나지 않을 수 있는 작업을 하는 부분에서는 가능한 한 락을 잡지 말아라. (p.65)
(계속)
[GWT] eclipse에 GWT project import 하기[GWT] eclipse에 GWT project import 하기
Posted at 2013. 8. 17. 15:06 | Posted in 개발이야기GWT 프로젝트 디렉토리를 이동하려고 다른 디렉토리에 옮겨놓은 후
다음과 같은 방법으로 다시 불러올 수 있다.
(1) .project 파일이 있는 경우: Import > General > Existing Projects into Workspace
(2) .project 파일이 없는 경우
New > Other... > GWT Designer > Model
Next 후에 project Root 디렉토리를 선택하면 .project 파일이 없어도 깔끔하게 import 된다.
How to install gnuplot in Mac OS X lionHow to install gnuplot in Mac OS X lion
Posted at 2013. 8. 9. 21:38 | Posted in OS/Machttp://bhou.wordpress.com/2011/09/13/how-to-install-gnuplot-in-mac-os-x-lion/
readline 라이브러리를 먼저 설치하고 gnuplot을 설치하면 된다.
$ ./configure --prefix=/usr/local
$ make
$ sudo make install
$ ./configure --prefix=/usr/local --with-readline=/usr/local
$ make
$ sudo make install
VirtualBox clipboard sharing not working sometimes(클립보드 공유가 가끔씩 안될 때)VirtualBox clipboard sharing not working sometimes(클립보드 공유가 가끔씩 안될 때)
Posted at 2013. 5. 24. 16:51 | Posted in Etc클립보드 공유가 가끔씩 안될 때
/usr/bin/VBoxClient --clipboard 를 재시작시키면 된다.
$ ps -ef | grep VBox | grep clipboard
deepblue 9952 1 0 16:44 ? 00:00:00 /usr/bin/VBoxClient --clipboard
$ kill -9 9952
DHT(Distributed Hash Table 분산 해시 테이블)DHT(Distributed Hash Table 분산 해시 테이블)
Posted at 2013. 4. 10. 12:33 | Posted in Server데이터와 서버를 동일한 주소 공간에 배치.
데이터의 키 값과 분산 서버 ID는 동일한 해시 함수로 동일한 주소 공간에 데이터와 노드를 배치.
중앙 서버 없이도 데이터를 관리하는 서버를 찾는 룩업에 성능이 좋다.
클러스터에 참여하는 서버의 추가/제거가 자동으로 이뤄지게 구성할 수 있다.
부하가 집중되지 않고 분산된다는 큰 장점이 있어, 극단적으로 큰 규모의 노드들도 관리할 수 있다.
종래의 순수 P2P에서 채용되었던 방식에서는 수십만 노드 정도가 한계였으나, DHT의 사용으로 수십억개의 노드를 검색범위로 할 수 있게 되었다. 그러나 DHT는 실제 구현이 어렵다.
키 공간 분할(keyspace partition)과 오버레이 네트워크(overlay network)로 구성된다.
- keyspace partition:
* 분산된 서버에 키를 어떻게 배치시킬 것인가를 결정하는 것
* 데이터의 hash(key) 값을 이용해 키 영역을 파티셔닝 시킨다.(range, interval)
- overlay network:
* 물리적인 서버의 연결과 상관없이 논리적인 서버 간의 연결 관리와 키를 담당하는 노드를 찾아가는 메커니즘을 제공.
* 특정 키를 서비스하는 노드를 찾아가는 라우팅 알로리즘을 제공한다.
DHT를 활용한 대표적인 시스템으로 비트토렌트(DHT를 확장하여 사용), eDonkey 등이 있다.
참고: 클라우드 컴퓨팅 구현 기술(에이콘), 위키백과
[번역] Virtual Nodes Strategies[번역] Virtual Nodes Strategies
Posted at 2013. 4. 10. 12:30 | Posted in Articleredis shard를 virtual node를 입혀보려고 연구중.
사례 및 기술연구를 위해 몇몇 문서를 번역해 본다.
※ 오역에 주의하시고, 잘못 번역된 부분은 댓글로 알려주세요.
Clock & Timer resolution(시간, 타이머 해상도)Clock & Timer resolution(시간, 타이머 해상도)
Posted at 2013. 1. 30. 15:28 | Posted in 개발이야기출처: https://blogs.oracle.com/dholmes/entry/inside_the_hotspot_vm_clocks
clock에는 다음 2가지가 있다.
- absolute clock (the time-of-day clock, with a low resolution)
- relative clock (some kind of "high-resolution" counter from which a "free-running" time can be calculated)
현대 컴퓨터에서는 clock과 timer는 큰 차이가 있다.
The resolution of clocks and timers in modern computers is typically very different.
timed events are triggered by operating system controlled interrupts that are normally much more coarse grained (typically 10ms)
Further, systems often have a quite different resolution for the time-of-day clock (often low resolution of 10ms or worse) and the free-running relative clock (microseconds or better), because they are actually derived from quite different pieces of hardware.
absolute clock(time-of-day)는 자바에서 System.currentTimeMillis()로 구현된다.
(System.currentTimeMillis() = 'time-of-day' clock. update resolution is same as the timer interrupt(eg. 10ms).)
The absolute "time-of-day" clock is represented by the System.currentTimeMillis() method, that returns a millisecond representation of wall-clock time in milliseconds since the epoch. As such it uses the operating system's "time of day" clock. The update resolution of this clock is often the same as the timer interrupt (eg. 10ms), but on some systems is fixed, independent of the interrupt rate.
relative-time clock 은 자바에서 System.nanoTime()으로 구현된다. high-resolution이다.
The relative-time clock is represented by the System.nanoTime() method that returns a "free-running" time in nanoseconds.
The nanoTime method uses the highest resolution clock available on the platform, and while its return value is in nanoseconds, the update resolution is typically only microseconds.
However, on some systems there is no choice but to use the same clock source as for currentTimeMillis() - fortunately this is rare and mostly affects old Linux systems, and Windows 98.
자바 타이머 관련 클래스의 해상도.
- The java.util.Timer and java.util.TimerTask - use of currentTimeMillis()
- Java 5.0 ScheduledThreadPoolExecutor (STPE) - use of nanoTime()