2019. 1. 8. 03:44

AWS Greengrass Worksheet

Recently, I am working for the project using Greengrass as a deployment solution.

AWS Greengrass is quite an early development phase, there are lots of cool new features are coming, but not yet available.

Here are some minor tips I found while I am building the service when I face some problems. (I will keep updating time by time my project progressing.) 


A Greengrass group cannot have more than one core.

Currently, you can see the CreateCoreDefinitionVersionRequest is you can see the CreateCoreDefinitionVersionRequest is accepting List<Core> as an input parameter, but this is just for future scalable, it does not support yet. It accepts only a single core now.


Greengrass Deployment Stuck In Progress

I created a group and a core using the console, and deploy something, and faced issues of deployments. Mainly the reasons are: When GG cannot communicate through MQTT, or the core daemon is not running.

So mostly I solved this by checking the core Greengrass config is correctly set (/greengrass/config/config.json), whether EC2 (or pi) network security group inbound rule has MQTT 8883 port open, and checking subscriptions between cloud and lambda, and restart the core daemon, and etc.


While you are building provisioning service using APIs, sometimes you mix-use with the console to delete resources like groups, cores, certificates. Because of that, sometimes there is a zomebie-like group showing in the console, for example,  So I removed core definition using API. After that, I got the same error like "This group is currently deployed so it cannot be deleted."


In this case, you should run "reset deployment" (if it does not work, run it with "force" option.) then you can delete the group. 

2016. 2. 15. 07:09

Paper types in visualization

Visualization 논문 리뷰 작업 중에 논문을 유형별로 나눌 필요성이 느껴져서 찾다가, 블로그에 정리해 두면 좋을거 같아서 IEEE VIS 2015 학회에 정의된 논문 제출 가이드라인 일부를 그대로 영문 번역하였다. 발번역임. (VAST 2016 에서 약간 수정된 논문 타입을 정의하였기에 추가 번역하였음.)

http://ieeevis.org/year/2015/info/call-participation/paper-submission-guidelines

http://ieeevis.org/year/2016/info/call-participation/vast-paper-types



VAST 2016 Paper Types


VAST에는 TVCG 트랙과 Conference-only 트랙, 두개의 트랙이 있는데, 각 트랙은 서로 다른 레벨의 originality, rigor, 그리고 significance를 가진다.  보통 VAST 논문들은 다른 두 VIS 학회 - InfoVIS, SciVIs - 의 논문들처럼 상세한 접수 가이드라인에 따라 작성, 접수, 리뷰의 과정을 거친다. 그러나, visual analytics의 빠른 과학, 기술, 응용의 발전에 따라, 수시로 VAST 출판물에 대한 이해도를 조정하는 것이 현명하다. 기존 5개 형식의 논문 타입에 대한 논의는 뒤로 하고, 아래에 VAST 2016의 논문 타입에 대해 명시하였다. 

Visual analytics, concepts, theories, algorithms, techniques, designs, systems, empirical studies 와 applications 는 일반적으로 분석, 시각화, 상호작용이 인간과 기계간 조화를 최적화 하도록 통합되는 곳에 컨텍스트를 생성한다. 이 컨텍스트는 VIS의 다른 학회들과 차별된다: 데이터가 spatial 인지 non-spatial인지, 기술들이 human-centric 인지 machine-centric 인지, application domain 이 대부분  any academic discipline, industry, business sector, 혹은 governmental operation 인지. 이러한 맥락에서, 개개의 VAST 논문은 새로운 기여가 존재하는 곳에 강하게 포커스를 맞추거나 다른 측면의 통합을 강조한다.


VAST has two tracks, TVCG and Conference-only tracks, which correspond to different levels of originality, rigor, and significance. In general, VAST papers should be written, submitted and reviewed in the same way as papers at the other two VIS conferences (i.e., InfoVis and SciVis), following the detailed submission guidelines. However, with the rapid development of the science, technology and application of visual analytics, it is sensible to adjust our understanding of VAST publications from time to time. We provide the following clarifications about paper types for VAST 2016, beyond the discussion of the five paper types in the shared guidelines.

In visual analytics, concepts, theories, algorithms, techniques, designs, systems, empirical studies and applications normally create a context where analysis, visualization and interaction are integrated to optimize the combination of human and machine capabilities. It is this context that differentiates VAST from other conferences in VIS, while data involved can be spatial or non-spatial, techniques can be human-centric or machine-centric, and the application domain can be almost any academic discipline, industry, business sector, or governmental operation. Within such a context, an individual VAST paper may give a strong focus on an aspect where novel contributions reside, or place its emphasis on the integration of different aspects.


VAST 논문은 일반적으로 6개의 카테고리로 분류된다:

  1. 이론과 모델

  2. 기술과 알고리즘

  3. 디자인 연구

  4. 실증 연구 (기존 가이드에서 Evaluation 형태로 분류되는 논문들.)

  5. 시스템

  6. 응용 (Design Study 에서 별도로 분류된 카테고리.)


VAST papers typically fall into one of these six categories:

  1. Theory and Model

  2. Technique and Algorithm

  3. Design Study

  4. Empirical Study (referred to as the Evaluation type in in the shared guidelines)

  5. System

  6. Application (as a separate category from the Design Study type in the shared guidelines)


Theory and Model

Fundamentals of visual analytics. Conceptual understanding and modelling of visual analytics (e.g., definitions, taxonomies, analytic frameworks, and research methods, etc.). Philosophical and sociological discourses of visual analytics (e.g., human vs machine, ethics, data security, uncertainty, biases, and privacy, etc.). Perception and cognition in visual analytics.

Mathematical abstraction and modelling of visual analytics processes. Concepts and models that govern quality metrics and benchmarks for evaluating visual analytics processes and systems.

Examples:

Megan Monroe, et al. "Temporal event sequence simplification." VAST 2013 Honorable Mention.



Technique and Algorithm

Visualization techniques in visual analytics processes. Close integration of technical components of visual analytics (e.g., statistical analysis, human-defined and machine-learned algorithms, knowledge representations, visualization/interaction techniques and methodologies, etc.) for supporting visual data mining.

Visual analytics for supporting the advancement of non-visual technical components of visual analytics (e.g., visual analytics for supporting model development, simulation, learning, monitoring, and optimization).

Integrated data acquisition, management, retrieval, processing and transformation in visual analytics (e.g., multi-sources; multi-resolution; data provenance; uncertainty; real world measures; textual, audio, visual and other media; factual, statistical, semantic, synthesized, and hypothesized data; etc.). 

VA techniques for spatial and non-spatial data, temporal data, streaming data, quantitative and qualitative data, text and document data, and so on. Techniques for production, presentation, and dissemination of VA results.

Examples:

Thomas Muhlbacher and Harald Piringer. “A Partition-based framework for building and validating regression models.” VAST 2013 Best Paper.

Stef van den Elzen et al. “Reducing snapshots to points: a visual analytics approach to dynamic network exploration.” VAST 2015 Best Paper.



Empirical Study

Understanding human-centric components in visual analytics processes (e.g., perception, cognition, interaction, communication, collaboration, etc.).

Understanding human capabilities and limitations in data intelligence (e.g., exploration, navigation, sensemaking, context awareness, knowledge discovery, learning, argumentation, causality reasoning, accountability, biases, etc.).

Understanding visual signatures in data intelligence (e.g., patterns of clusters, patterns of anomalies, etc.).

Understanding the potential merits and demerits of technologies in visual analytics (e.g., display technologies, interactive technologies, automated analytics, crowdsourcing analytics, and so on).

Human-centric comparative studies on aspects of visual analytics (e.g., visual representations, interaction techniques, active learning, visual analytics literacy, requirements analysis, etc.).

Evaluation methodologies for visual analytics techniques and systems in real world environments.

Different quantitative and qualitative (including ethnographic) forms of empirical studies (e.g., lab-based studies, field studies, crowdsourcing, group discussions, surveys, interviews, user experience observation, shadowing, case studies and casebook construction, etc.)

Transformation of scenarios and data captured in studies to benchmark problems and data-driven metrics.

Examples:

Narges Mahyar and Melanie Tory. "Supporting communication and coordination in collaborative sensemaking." VAST 2014 Best Paper. 

Hua Guo et al. "A case study using visualization interaction logs and insight metrics to understand how analysts arrive at insights." VAST 2015 Honorable Mention.



Design Study

Designing disseminative visual analytics (e.g., storytelling, illustration and animation, public engagement, etc.)

Designing observational visual analytics (e.g., multivariate data, streaming data, multimedia data, geospatial data, spatio-temporal, etc.)

Designing analytical visual analytics (e.g., clustering, anomaly detection, association and network analysis, correlation, causality, uncertainty, etc.)

Designing model-developmental visual analytics (e.g., exploring parameter space, and model space, supporting dimensionality reduction and machine learning, model-developmental life cycle, etc.)

Design methodologies for real world visual analytics systems and users.

Examples:

Jian Zhao et al. "#FluxFlow: Visual analysis of anomalous information spreading on social media." VAST 2014 Honorable Mention.



System

Methodologies for engineering real world visual analytics systems.

System platforms (from wearable devices to desktops to large infrastructures, and from architectures and software libraries (toolkits), to stand alone systems and apps, to online services and open source repositories).

Comparative studies on real world visual analytics systems.

Development tools for the software lifecycle of visual analytics systems, including requirements analysis, system specification, system design, system implementation, system testing, user evaluation, and system maintenance).

Addressing challenges in real world visual analytics systems (e.g., provenance management, scalability, uncertainty, open testbeds, etc.).

Automation, customization, and personalization, and interoperability.

Best practices (e.g., interoperability, workflow design, cost-benefit analysis, standardization, etc.)

Examples:

Tanja Blascheck et al. "VA2: A visual analytics approach for evaluating visual analytics applications." VAST 2015 Honorable Mention.



Application

Delivering visual analytics solutions to applications in academic disciplines (e.g., physical sciences, biological and medical sciences, engineering sciences, social sciences, arts and humanities, and sports sciences).

Delivering visual analytics solutions to applications in industries and governance.

Delivering visual analytics solutions to applications in public services and entertainment (e.g., resilience, healthcare, transport, sports, tourism, broadcasting, and social media).

Examples:

Conglei Shi, et al. "LoyalTracker: Visualizing loyalty dynamics in search engines." VAST 2014 Honorable Mention.








VIS 2015 Paper Types


VIS 논문의 유형 대게 5개 카테고리로 나누어진다: technique, system, design study, evaluation, or model. 이 카테고리들에 대해 아래에 간단히 설명하였다. 논문 유형은 논문 제출 과정 중에 정해지긴 하지만, 한개 이상의 카테고리를 가질 수 있다. "Process and Pitfalls in Writing Information Visualization Research Papers" by Tamara Munzner 를 참고하여 어떻게 VIS 논문을 잘 쓸 수 있는지 참고하라. 


A VIS paper typically falls into one of five categories: technique, system, design study, evaluation, or model. We briefly discuss these categories below. Although your main paper type has to be specified during the paper submission process, papers can include elements of more than one of these categories. Please see "Process and Pitfalls in Writing Information Visualization Research Papers" by Tamara Munzner for more detailed discussion on how to write a successful VIS paper.



Technique 눈문

이 유형의 논문은 해당 학계에서 이전에 본적 없던 새로운 기술(techniques)이나 알고리즘을 소개하거나, 기존 기술과 알고리즘을 현저하게 발전시킨 경우로, 예를 들어 이전보다 훨씬 큰 데이타셋으로 확장하거나 더 많은 방면으로 사용하게 되는 기술로 일반화 하는 경우이다. 기술이나 알고리즘의 상세 설명이 완전히 제공되어서 실력을 갖춘 대학원생이 이를 구현할 수 있어야 하고, 저작자는 프로토 타입 구현물을 만들어야 한다. 관련 이전 논문 참조가 반드시 있어야 하고, 이전 방법을 뛰어넘는 새로운 방법의 장점이 명백하게 기술되어야 한다. 이 새 방법이 적절한지, 제한이 있는지에 대해 작업과 데이타셋의 논의가 필요한다.  비공식 또는 공식적인 user studies 나 다른 방법을 통한 평가(Evaluation)는 논문을 더 탄탄하게 만들어 주지만,  필수사항은 아니다.


Technique papers introduce novel techniques or algorithms that have not previously appeared in the literature, or that significantly extend known techniques or algorithms, for example by scaling to datasets of much larger size than before or by generalizing a technique to a larger class of uses. The technique or algorithm description provided in the paper should be complete enough that a competent graduate student in visualization could implement the work, and the authors should create a prototype implementation of the methods. Relevant previous work must be referenced, and the advantage of the new methods over it should be clearly demonstrated. There should be a discussion of the tasks and datasets for which this new method is appropriate, and its limitations. Evaluation through informal or formal user studies, or other methods, will often serve to strengthen the paper, but are not mandatory.



System 논문

이 유형의 논문은 알고리즘, 기술적 요구사항, 사용자 요구사항, 설계 등을 융합하여 주요 문제를 풀어낸다. 제시된 System 은 새롭고 중요한 것으로서, 구현 된 것으로 여겨진다. 중요한 설계 결정을 위한 이론이 뒷받침 되고, 문서화 되어 이미 사용중인 동종 최고의 시스템과  비교되어진다. 이 비교에는 몇 가지 중요한 측면에서 이 시스템이 다른 시스템들과 어떻게 다른지, 그리고 무엇이 우수한지에 대한 구체적인 논의가 포함된다.  예를 들어, 기술된 시스템은 시각화(visualization) 시스템의 성능이나 사용성에서 상당한 우수성이나 새로운 가능성을 제공할 수도 있다. 외부적인 요소들은 (프로세서 성능, 메모리 크기, 혹은 OS의 기능면에서의 향상 등) 이러한 비교에 영향을 미치므로 가능한 모두 제거해야 한다.  추가 제안으로는, "How (and How Not) to Write a Good Systems Paper" by Roy Levin and David Redell 과  "Empirical Methods in CS and AI" by Toby Walsh 를 훑어볼 것을 권장한다. 


System papers present a blend of algorithms, technical requirements, user requirements, and design that solves a major problem. The system that is described is both novel and important, and has been implemented. The rationale for significant design decisions is provided, and the system is compared to documented, best-of-breed systems already in use. The comparison includes specific discussion of how the described system differs from and is, in some significant respects, superior to those systems. For example, the described system may offer substantial advancements in the performance or usability of visualization systems, or novel capabilities. Every effort should be made to eliminate external factors (such as advances in processor performance, memory sizes or operating system features) that would affect this comparison. For further suggestions, please review "How (and How Not) to Write a Good Systems Paper" by Roy Levin and David Redell, and "Empirical Methods in CS and AI" by Toby Walsh.



Application / Design Study 논문

이 유형의 논문은 한 응용분야에서 시각화나 시각 분석 기술을 적용할 때 발생되는 선택 사항들을 탐구한다. 예로, 대상 업무의 요구사항에 대한 상호작용 기술들과 시각적 인코딩 등을 들 수 있다. 유사하게, Application 논문은 공학 과학 문제들에 대한 통찰들을 모으기 위해 사용되는 시각화 기술들을 설명할 때, 표준으로 사용되어져 왔다. 그럼에도 불구하고 상당한 양의 도메인 배경 지식 application이 목적 업무의 상세사항을 논하는 콘텍스트의 프레이밍을 제공함에도 불구하고, case study의 주요 초점은 시각화 내용이어야만 한다. 응용 도메인에서 생성된 통찰들을 포함한 Application/Design Study 논문의 결과물들은 분명하게 전달되어야 한다. 당면한 문제를 풀기위한 새로운 기술과 알고리즘을 기술하는 것은 design study 논문을 강화하지만, Technique 논문만큼 참신함이 크게 요구되어지진 않는다. 필요할 시, 기본적인 파라메트릭 스페이스와 그것의 효과적인 검색에 대해 적절한 설명으로 밝혀야 한다. 


Application / Design Study papers explore the choices made when applying visualization and visual analytics techniques in an application area, for example relating the visual encodings and interaction techniques to the requirements of the target task. Similarly, Application papers have been the norm when researchers describe the use of visualization techniques to glean insights from problems in engineering and science. Although a significant amount of application domain background information can be useful to provide a framing context in which to discuss the specifics of the target task, the primary focus of the case study must be the visualization content. The results of the Application / Design Study, including insights generated in the application domain, should be clearly conveyed. Describing new techniques and algorithms developed to solve the target problem will strengthen a design study paper, but the requirements for novelty are less stringent than in a Technique paper. Where necessary, the identification of the underlying parametric space and its efficient search must be aptly described. The work will be judged by the design lessons learned or insights gleaned, on which future contributors can build. We invite submissions on any application area.



Evaluation 논문

이 유형의 논문은 사람에 의한 시각화와 시각적 분석의 사용을 탐구하고, 일반적으로 시각화 기술이나 시스템의 경험기반 연구가 제공된다. 저작자는 이러한 스터디가 자체적으로 사용되어지는 시스템을 구현할 필요는 없다; 연구의 기여도는 연구중인 시스템 또는 기술의 참신함과는 반대로 유효성과 경험적으로 얻은 결과의 중요성에 의해 평가된다. 학회의 커미티는 엄격한 실험을 설계하고 수행하는 중요성과 어려움을 높이 평가한며, 적절한 가설(hypotheses), 업무, 데이타셋, 대상의 선택, 측정, 유효성과 결론 등에 대한 것들이 포함된다. 이러한 노력은 실험에 대한 단순 기술보다는 예측과 설명을 목표로 한다. 인간을 대상으로 하는 실험의 설계에 익숙하지 않은 저작자는, 엄격한 경험적 프로토콜의 설계와 결과자료의 통계적 분석에 경험이 있는 심리학이나 human-computer 상호작용 영역의 동료를 원할 수 있다. 다른 새로운 형태의 evaluation 또한 권장된다.


Evaluation papers explore the usage of visualization and visual analytics by human users, and typically present an empirical study of visualization techniques or systems. Authors are not necessarily expected to implement the systems used in these studies themselves; the research contribution will be judged on the validity and importance of the experimental results as opposed to the novelty of the systems or techniques under study. The conference committee appreciates the difficulty and importance of designing and performing rigorous experiments, including the definition of appropriate hypotheses, tasks, data sets, selection of subjects, measurement, validation and conclusions. The goal of such efforts should be to move from mere description of experiments, toward prediction and explanation. We do suggest that potential authors who have not had formal training in the design of experiments involving human subjects may wish to partner with a colleague from an area such as psychology or human-computer interaction who has experience with designing rigorous experimental protocols and statistical analysis of the resulting data. Other novel forms of evaluation are also encouraged.



Theory/Model 논문

이 유형의 논문은 시각화와 시각적 분석에 대한 기초적 이론의 새로운 해석을 제시한다. 구현은 보통 이러한 논문과는 연관이 없다. 논문은 어떻게 시각화 기술이 보완되고 인간의 시각과 인지의 요소들을 활용하는지에 대한 우리의 이해 속에서 기본적인 발전성에 초점을 맞춰야 한다. 


Theory/Model papers present new interpretations of the foundational theory of visualization and visual analytics. Implementations are usually not relevant for papers in this category. Papers should focus on basic advancement in our understanding of how visualization techniques complement and exploit properties of human vision and cognition.

2015. 12. 21. 18:58

LEGO Wall-E Motorized


LEGO Wall-E Motorized using Arduino

controlling by iPhone


기말고사 기간에 레고 월E 출시 발견. 이어서, 마인드스톰 추가 구성해서 움직이게 한거 보고 넋이 나감. 

그래서 겨울 방학때 아래의 미션하에 프로젝트를 진행하였다:


1. 레고 월E 굴러가게 하기.

2. 무조건 내 핸드폰 앱으로 컨트롤 가능해야 함. 적외선 컨트롤러 이딴거 난 안쓴다.

3. 블루투스 구성 위한 마인드스톰 오지게 비쌈. 아두이노 사용해서 경비절감.


그리하여 아래와 같이 완성!


외국 친구들한테도 페북 공유하려다보니 못난 영작이 함께 들어갑니다. 리딩 흐름에 방해가 되더라도 양해 부탁드립니다.


During the last final's week, I found the LEGO's brand-new Wall E model. And soon after that, I found another Youtube video Wall-E motorized with LEGO mind storm. It was totally mind blowing work!! So, of course, I've done this project during my winter break. My missions were:

1. LEGO Wall-E Motorized

2. It has to be controlled by my iPhone. I don't wanna talk about the stupid infrared controller at all. :P

3. But, mind storm for bluetooth is freakin' expensive. Use Arduino.

At the end, voila.





Step 1. 부품을 준비한다. Prepare parts we need


Requirement parts:

  1. Lego Wall-E : $60.
  2. Motors : LEGO Power Functions M-Motor. (9v 65mA) $7 x 2 = $14.
  3. Lego Pick-a-brick : For connecting motor. 4pcs = $1
  4. Arduino UNO Rev3 : $25.
  5. Bluetooth module : HM-10. $9.
  6. 9v battery holder with on/off switch : $2
  7. 9v batteries : $3
  8. L293D Motor Drive Shield Board : $5
  9. Wires : Male to female 40pcs = $1


Total cost: $120



Step 2. 아뒤노 하드웨어 부품을 연결한다. Build Arduino hardware parts



나의 모터쉴드는 아두이노 위에 겹쳐서 꼽는 방식이었다. 그 후 모터 연결하고 전원 연결은 모터 쉴드에다 하면 되고, 블루투스 모듈은 와이어를 이용해서 그림과 같이 해당 핀에 분선하여 연결한다. 나의 경우 TX를 3번 핀, RX를 2번 핀에 연결 했다. (모터 컨트롤 핀으로 쓰이지 않는 것을 선택해야 한다. 참고로 0번과 1번, 즉 아두이노 보드의 TX와 RX는 USB와 연결된 프로그램 업로드 용이므로 사용을 피한다.)


My motor shield can be over-layered with the Arduino board. Motors and power (battery) are connected onto the motor shield, bluetooth module needs additional wires to branch from the Arduino. I used pin 3 as TX, and  pin 2 as RX. (You should choose the pins, which are not used for motor controlling. Besides, we should avoid to use pin 0 and 1 because these are for program uploading of Arduino board.)



Step 3. 아두이노에 모터 제어 프로그램을 업로딩한다. 

Upload a motor control program to Arduino.




아두이노를 컴퓨터에 연결하고, Arduino 공식 사이트에서 프로그램 업로드 소프트웨어를 다운받아 설치한다. 

Tools 메뉴에서 Board 를 Arduino Uno 로 선택한다. 코드를 작성 후 업로드 버튼을 눌러 아두이노 보드에 작성한 코드 프로그램을 업로딩한다. 참고로, 고맙게도 모터관련 라이브러리가 이미 제작되어 있다. 이를 이용하면 모터 제어를 쉽게 짤 수 있다. AFMotor임.

https://learn.adafruit.com/adafruit-motor-shield/library-install

위 URL로 들어가면 github 다운로드 링크가 나온다. 다운받은 폴더를 아뒤노 개발툴 라이브러리 폴더 안에 넣고 (e.g. ~/Arduino/libraries/AFMotor) AFMotor.h 파일을 아뒤노 코드에 인클루드 시키면 사용할 수 있다. 

내가 짠 아뒤노 코드는 이 글 최하단에 추가하였으니 참고바람.


참고로 HM-10의 커맨즈는 다음과 같다. 아뒤노 시리얼 모니터에서 입력해보고 정상적으로 응답이 오는지 확인하자. 또한 시리얼 하단에서 no line ending 옵션으로 되어 있는지도 확인한다. 

  • "AT" 전송 시 응답 "OK"
  • "AT+VERR?" 전송 시 응답은 현재 버젼 출력 
  • 이름변경: "AT+NAMEmyWallEBLT" 전송 시 응답 "OK+SET..."
  • 비번변경: "AT+PIN1234" 전송 시 응답 "OK+SET..." (디폴트:000000)
  • 스래이브/마스터변경: "AT+ROLE0" 전송 시 응답 "OK+SET:0" (디폴트: 0 슬래이브. 1은 마스터를 의미.)


Connect the Arduino to a laptop, open a developing software tool downloading from the official Arduino website.

Make sure whether choose 'Arduino Uno' on the Tools menu. Upload a code onto Arduino board. Fortunately, there is a DC motor control library for Arduino already. We can make a motor controlling code easily by using this library, named AFMotor.

https://learn.adafruit.com/adafruit-motor-shield/library-install

You can see github download link when you get into the above URL. Put the library folder into a library folder located under the Arduino developer tool folder, we can use AFMotor after include AFMotor.h file in the code.

My code is at the bottom of this article. 


Note that, HM-10 commands are following: 

  • Send "AT", receive "OK"
  • Send "AT+VERR?", receive a version of bluetooth firmware.
  • Set name: send "AT+NAMEmyWallEBLT", receive "OK+SET..."
  • Set pin: send "AT+PIN1234", receive "OK+SET..." (Default: 000000)
  • Set role: send "AT+ROLE0", receive "OK+SET:0" (Default: 0, means slave. 1 is master mode)
Send these commend to bluetooth through Arduino tool's serial monitor, check whether an answer comes correctly. Make sure the 'no line ending' option is selected at the bottom of the serial monitor.




Step 4. 아이폰 블루투스 컨트롤러 앱을 제작한다. Develop iPhone bluetooth controller app.




그냥 뭐... 잘 짜면 된다...;; 역시 하단에 필요 코드를 첨부하였다. 프로젝트는 기본 Single View 프로젝트로 생성하면 되고, Swift가 아닌 Object C 코드이다. 컴파일 후 아이폰에 올리고 실행하면 위 사진 왼쪽 화면이 나온다. (블루투스가 켜진 상태여야 함.) 내 월E 블루투스를 선택하면, 커넥션 성공 시 오른쪽 화면으로 이동하게 된다. 이것저것 눌러봐서 모터가 잘 도는지 확인한다. 


Well.. good luck. :P. It's hard to explain. I attached essential codes I wrote at the bottom of this article as well.  You need to create a project as a single view project using Xcode. My codes are written by objective C, not Swift. After compile and upload your app onto your iPhone, you can see a screen like the above left picture when you start the app. (It has to be a bluetooth on.) After choose your wall-e bluetooth device, it would move to a screen like the above right picture if it makes the connection successful. Click some buttons to see motor working well.  



Step 5. 월E를 조립한 후 조립 해 둔 하드웨어 부품을 부착한다.

Assemble the Arduino hardware parts onto the Wall-E.



일단 바퀴에 모터 두개 부착. First, attach the two motors with the wheels.



배터리는 배안에 넣어주고 전선은 목 옆쪽 공간을 통해 밖으로 빼준다.

Put a battery into the belly space of Wall-E, wires need to be out through the gap of the neck.



요런식으로 나는 등뒤에 전기테잎으로 고정하였다... 전테말고 다른 방법을 강구하고 싶지만..

(누가 우리 월E 배낭 좀 만들어주시오. ㅎㅎㅎ)


I used an electrical tape to attach the parts at the backside like above. 

I wanna use other things like a backpack or something tho..





Complete!!!








Appendix


* 모터의 선택 : 월E에 실리콘 떡질해서 모터 고정시키고 싶지 않아서 레고 모터 사용. 추가적으로 이때문에 3번 항목 구입 발생.. 모터랑 월E 바퀴 연결부품인데 필요한 브릭만 레고사에서 주문 가능.

* Selection of motors : I used LEGO motors because I don't want to use a sticky messy silicon glue on my Wall-E. That's why my 3rd purchase, pick-a-bricks, was occurred. You can make order from LEGO for picking some little amount of parts what you exactly need for connecting wheels and motors.  


* 라즈베리 파이에 대해 : 이왕이면 더 가지고 놀게 많은 PI 를 사려고 했으나, 이게 컴터 메인보드 같은거라 배터리로 안되고 파워 지속공급 되야 함. 즉, 유선 월E가 된다는 황당한 시츄에이션이... -_- (그거슨 있어서는 안되는 일이야..)

* About the Rasberry PI: We all know the PI is more versatile, however, it is kind of a mainboard, so it needs continuous power supply. It means, my Wall-E will have a stupid wire from a laptop. ABSOLUTELY NOT ALLOWED.


* 블루투스 모듈: HC-05 나 HC-06 많이들 쓰는데, 안드로이드는 이거 써도 됨. 허나 아이폰 6 부터는 블루투스 4.0 이라서 안잡힘. 이거 몰랐어서 블루투스 4.0 쓰는 HM-10으로 다시 샀음. (내 돈...)

* Bluetooth module: HC-05 or HC-06 are mostly common to use for Android application. But iPhone 6 or later have bluetooth 4.0, it cannot scan those modules. I bought HM-10 again after HC-05 because I didn't know that. 


* 모터 드라이버 쉴드: 걍 젤 싼거, 모터 두개 이상 돌릴 수 있는거로 사면 됨. 모터 쉴드는 모터 연결 편리성과 파워를 안전정으로 공급하기 위해 씀. 좀 더 자세히 말하면, 첫째는, 일반적으로 모터는 높은 전류 필요로 함. (레고 모터도 65mA임) 허나 아두이노는 핀당 20mA 출력함. 드라이버가 이를 충분한 전압과 전력으로 출력할 수 있게 해 줌. 둘째는, 모터 회전 방향 변경을 하려면 + - 바꿔줘야 하는데, 이를 위한 복잡한 전선 연결을 해결해 줘서 편리하게 방향 변경할 수 있게 해줌. (그때가 납땜에 영혼을 불사를 수 있다면 직접 해도 될듯함...) 더 자세한 내용은 네이버 아두이노 카페 글 참고 http://cafe.naver.com/arduinostory/30555

* Motor driver shield: Just bought a cheapest one, which can manage more than two motors. Motor shield is for convenience of connecting motors and provides sufficient power. In detail, first, motors require high current value mostly. (LEGO M motor is also 65mA.) But Arduino has only 20mA per pin. Driver makes it can output enough voltage and current for motors. Second, it should change the direction of + and - to change the direction of motor rotating, wire connecting is quite annoying and messy job. Driver handle this issue, it provides a pleasant environment to use multiple motors changing direction.


* 기타 제작 과정에서 도움 받은 참고 자료 및 사이트 Additional useful references. 

LEGO Wall-E 21303 Motorized with Power Functions https://youtu.be/3_9q6RjB5nM

Controlling LEGO DC motor with an Arduino https://youtu.be/PtinpaVpHeo

IPhone to Arduino using Bluetooth 4.0 http://www.instructables.com/id/IPhone-to-Arduino-using-Bluetooth-40-/

Core Bluetooth Programming Guide https://developer.apple.com/library/...

Bluetooth 4.0 datasheet http://www.pridopia.co.uk/pi-doc/BT4.0-HM-10-Serial_Port_BLE_Module_Master_Slave.pdf


* 아두이노 모터 제어 코드 Arduino motor control code.


Note 1:  모든 DC 모터는 조금씩 베이스 속도가 다르다. 이를 동일하게 맞추려면 휴리스틱한 방법으로, 두 모터의 속도 스케일 차이를 파악한 후 속도를 조정해야 한다. 뭔 말이냐면, 1번과 2번 모터를 모두 속도 10으로 맞추었는데, 육안으로 봤을때 2번 모터가 1번보다 3배 빠르게 돌아가고 있다면, 구동전에 1번 모터 속도를 30으로 2번 모터 속도를 10으로 맞추고 구동을 한다는 말이다. 


Note 2: 레고 모터는 AFMotor 라이브러리를 이용한 속도 세팅 시, 90 이하의 속도 세팅에서는 아예 구동하지 않는다.


#include <SoftwareSerial.h>

#include <AFMotor.h>

#define SPD1  100                    // Motor1 base speed.

#define SPD2  165                    // Motor2 base speed.


AF_DCMotor motor1(1);            // Motor1 is connected to slot 1.

AF_DCMotor motor2(4);          // Moter2 is connected to slot 4. 

SoftwareSerial BTSerial(3, 2);  // Pin3 is for TX, and Pin 2 is for RX.

int cmd1 = RELEASE;

int cmd2 = RELEASE;

int unavailableCount = 0;

String cmds = "";


void setup()

{

  Serial.begin(9600);

  BTSerial.begin(9600);

  Serial.println("Jisun's Wall-E world!!");

  motor1.setSpeed(SPD1);

  motor2.setSpeed(SPD2);

}


void loop()

{

  if(BTSerial.available())

  {

    char cmd = BTSerial.read();

    cmds = cmds + cmd;

    unavailableCount = 0;

  }

  else

  {

    unavailableCount = unavailableCount + 1;

  }

  

  if ( unavailableCount > 10 && cmds.length() > 0 )

  {

    int spd1 = SPD1;

    int spd2 = SPD2;

    String dbgstr = "";

    

    if ( cmds.indexOf("speed") >=0 )

    {

      int spdlv = 1;

      if ( cmds == "speed1") spdlv = 1;

      else if ( cmds == "speed2") spdlv = 2;

      else if ( cmds == "speed3") spdlv = 3;

      

      spd1 = spd1 + spdlv * 25;

      spd2 = spd2 + spdlv * 20;

      dbgstr = "Set speed level: " + String(spdlv);

      motor1.setSpeed(spd1);

      motor2.setSpeed(spd2);

    }

    else if ( cmds == "forward" )

    {

      dbgstr = "Move forward";

      cmd1 = FORWARD; cmd2 = FORWARD;

    }

    else if ( cmds == "backward" )

    {

      dbgstr = "Move backward";

      cmd1 = BACKWARD; cmd2 = BACKWARD;

    }

    else if ( cmds == "left")

    {

      dbgstr = "Turn left";

      cmd1 = RELEASE; cmd2 = FORWARD;

    }

    else if ( cmds == "right")

    {

      dbgstr = "Turn right";

      cmd1 = FORWARD; cmd2 = RELEASE;

    }

    else if ( cmds == "leftback")

    {

      dbgstr = "Turn left backward";

      cmd1 = RELEASE; cmd2 = BACKWARD;

    }

    else if ( cmds == "rightback")

    {

      dbgstr = "Turn right backward";

      cmd1 = BACKWARD; cmd2 = RELEASE;

    }

    else if ( cmds == "release" )

    {

      dbgstr = "Release";

      cmd1 = RELEASE; cmd2 = RELEASE;

    }


    if ( dbgstr.length() > 0 )

    {

      dbgstr += "(" + String(spd1) + "/" + String(spd2) + ")";

      Serial.println(dbgstr);

      motor1.run(cmd1);

      motor2.run(cmd2);

    }

    else

    {

      Serial.println(cmds);

    }

    cmds = "";

    unavailableCount = 0;

  }

  

  if(Serial.available())

  {

    char cmd = Serial.read();

    BTSerial.write(cmd);

  }

}



* 아이폰 블루투스 컨트롤러 코드 iPhone bluetooth controller code


ViewController.h


//

//  ViewController.h

//  WallEController

//

//  Created by Jisun Kang on 1/10/16.

//  Copyright © 2016 ___JSK___. All rights reserved.

//


#import <UIKit/UIKit.h>

#import <CoreBluetooth/CoreBluetooth.h>


@interface ViewController : UIViewController <CBCentralManagerDelegate>

@property (nonatomic, strong) CBCentralManager *centralManager;

@property (nonatomic, strong) CBPeripheral *peripheral;

@property (nonatomic, strong) CBCharacteristic *currentcharacteristic;


-(IBAction) goToSecondView:(id)sender;

-(IBAction) cancelConnection:(id)sender;

@end


@interface SecondViewController : UIViewController

@property (nonatomic, strong) CBCentralManager *centralManager;

@property (nonatomic, strong) CBPeripheral *peripheral;

@property (nonatomic, strong) CBCharacteristic *currentcharacteristic;


-(IBAction) pressButtons:(UIButton *)sender;

@end




ViewController.m


//

//  ViewController.m

//  WallEController

//

//  Created by Jisun Kang on 1/10/16.

//  Copyright © 2016 ___JSK___. All rights reserved.

//


#import "ViewController.h"


// this is for various device screen size.

#define SCREEN_WIDTH [[UIScreen mainScreen] bounds].size.width

#define SCREEN_HEIGHT [[UIScreen mainScreen] bounds].size.height


@interface ViewController () <UITableViewDataSource, UITableViewDelegate>

{

    NSMutableArray* cbArray;

}

@property (strong, nonatomic) IBOutlet UITableView *mainTableView;

@property (strong, nonatomic) IBOutlet UILabel *mainLabel;

@end


@implementation ViewController


- (void)viewDidLoad {

    [super viewDidLoad];


    // initializing UITableView

    cbArray = [NSMutableArray array];

    _mainTableView.delegate = self;

    _mainTableView.dataSource = self;

    _mainTableView.backgroundColor = [UIColor colorWithRed:236.0/255.0 green:236/255.0 blue:236.0/255.0 alpha:0.7];

    _mainTableView.backgroundView = nil;

    _mainTableView.allowsMultipleSelectionDuringEditing = NO;

    _mainTableView.separatorStyle = UITableViewCellSeparatorStyleSingleLineEtched;

    _mainTableView.autoresizingMask = UIViewAutoresizingNone;

    

    self.centralManager = [[CBCentralManager alloc] initWithDelegate:self queue:nil];

    self.peripheral.delegate = self;

}


- (void)viewDidAppear:(BOOL)animated {

    [super viewDidAppear: true];

    _mainLabel.text = @"";

}


- (void)didReceiveMemoryWarning {

    [super didReceiveMemoryWarning];

}


- (void)dealloc

{

    [self.centralManager stopScan];

}


- (IBAction)goToSecondView:(id)sender {

    UIStoryboard *mainStoryboard = [UIStoryboard storyboardWithName: @"Main" bundle:nil];

    SecondViewController* secVC = [mainStoryboard instantiateViewControllerWithIdentifier:@"SecondView"];

    secVC.centralManager = self.centralManager;

    secVC.peripheral = self.peripheral;

    secVC.currentcharacteristic = self.currentcharacteristic;

    [self presentViewController:secVC animated:YES completion:nil];

}


- (IBAction)cancelConnection:(id)sender {

    if ( self.peripheral == nil )

        return;

    _mainLabel.text = @"Cancel connection.";

    [self.centralManager cancelPeripheralConnection:self.peripheral];

    self.peripheral = nil;

    [self.centralManager scanForPeripheralsWithServices:nil options:nil];

}


// =========================================

// CB Central Manager

// =========================================


// Invoked when the central manager’s state is updated.

- (void)centralManagerDidUpdateState:(CBCentralManager *)central

{

    switch (central.state) {

        case CBCentralManagerStatePoweredOn:

            NSLog(@"CoreBluetooth BLE hardware is powered on and ready");

            _mainLabel.text = @"Scanning...";

            [self.centralManager scanForPeripheralsWithServices:nil options:nil]; //@{CBCentralManagerScanOptionAllowDuplicatesKey:@YES}];

            break;

        case CBCentralManagerStatePoweredOff:

        case CBCentralManagerStateResetting:

        case CBCentralManagerStateUnauthorized:

        case CBCentralManagerStateUnknown:

        case CBCentralManagerStateUnsupported:

        default:

            NSLog(@"CoreBluetooth BLE hardware is powered off or not initialized.");

            break;

    }

}


// add the device to our array and reload the table view.

- (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI

{

    CBPeripheral* currentPer = peripheral;

    

    if(![cbArray containsObject:currentPer])

    {

        [cbArray addObject:currentPer];

    }

    [_mainTableView reloadData];

}


- (void)centralManager:(CBCentralManager *)central didConnectPeripheral:(CBPeripheral *)peripheral

{

    NSLog(@"Success to connect.: %@",peripheral);

    _mainLabel.text = @"Success to connect.";

    peripheral.delegate = self;

    

    if (peripheral.services) {

        [self peripheral:peripheral didDiscoverServices:nil];

    } else {

        [peripheral discoverServices:nil];

    }

    self.peripheral = peripheral;

}


- (void)centralManager:(CBCentralManager *)central didDisconnectPeripheral:(CBPeripheral *)peripheral error:(NSError *)error {

    

    NSLog(@"Disconnected with peripheral: %@",peripheral);

    _mainLabel.text = @"Disconnected and scanning...";

    self.peripheral = nil;

    [self.centralManager scanForPeripheralsWithServices:nil options:nil];

    

    NSLog(@"The error is: %@", error.localizedDescription);

}


- (void)centralManager:(CBCentralManager *)central didFailToConnectPeripheral:(CBPeripheral *)peripheral error:(NSError *)error

{

    NSLog(@"Connection failed to peripheral: %@",peripheral);

    _mainLabel.text = @"Fail to connect.";

}


- (void)peripheral:(CBPeripheral *)peripheral didDiscoverServices:(NSError *)error

{

    for (CBService *service in peripheral.services)

    {

        NSLog(@"Discovered service %@", service);

        _mainLabel.text = @"Discovered service.";

        

        [peripheral discoverCharacteristics:nil forService:service];

    }

}


- (void)peripheral:(CBPeripheral *)peripheral didDiscoverCharacteristicsForService:(CBService *)service error:(NSError *)error

{

    NSLog(@"Looking for Characteristic...");

    for (CBCharacteristic *characteristic in service.characteristics)

    {

        if ( characteristic.properties & CBCharacteristicPropertyWriteWithoutResponse )

        {

            NSLog(@"Find Characteristic!!");

            self.currentcharacteristic = characteristic;

            [peripheral setNotifyValue:YES forCharacteristic:characteristic];

        

            [self goToSecondView:nil];

        }

    }

}


- (void)peripheral:(CBPeripheral *)peripheral didWriteValueForCharacteristic:(CBCharacteristic *)characteristic error:(NSError *)error

{

    if (error) {

        NSLog(@"Error writing characteristic value: %@",

              [error localizedDescription]);

    }

}


// =========================================

// TableView delegates

// =========================================


#pragma mark UITableView Delegate

// reload the table view when a new peripheral device is found and write their name list.

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

{

    static NSString *cellIdentifier = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];

    if (cell == nil) {

        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:cellIdentifier];

    }

    

    cell.backgroundColor = [UIColor clearColor];

    cell.selectionStyle = UITableViewCellSelectionStyleDefault;

    

    CBPeripheral* currentPer = [cbArray objectAtIndex:indexPath.row];

    cell.textLabel.text = (currentPer.name ? currentPer.name : @"Not available");

    

    return cell;

}


- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath

{

    [tableView deselectRowAtIndexPath:indexPath animated:YES];

    

    _mainLabel.text = @"Trying to connect...";

    CBPeripheral* currentPer = [cbArray objectAtIndex:indexPath.row];

    

    if ( self.peripheral != nil )

    {

        [self.centralManager cancelPeripheralConnection:self.peripheral];

    }

    currentPer.delegate = self;

    self.peripheral = currentPer;

    [self.centralManager connectPeripheral:currentPer options:nil];

    

    [self.centralManager stopScan];

}


- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {

    return [NSString stringWithFormat:@"Total count %lu",(unsigned long)cbArray.count];

}


- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section

{

    return 40;

}


#pragma mark UITableView Datasource

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath

{

    return 50;

}


- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)sectionIndex

{

    return cbArray.count;

}

@end



// =========================================

// SecondViewController

// =========================================


@interface SecondViewController ()

{

}

@property (strong, nonatomic) IBOutlet UILabel *secondLabel;

@end


@implementation SecondViewController


- (void)viewDidLoad {

    [super viewDidLoad];

}


- (void)viewDidAppear:(BOOL)animated {

    [super viewDidAppear: true];

    _secondLabel.text = @"";

}


- (void)didReceiveMemoryWarning {

    [super didReceiveMemoryWarning];

}


- (IBAction)pressButtons:(UIButton *)sender {

    _secondLabel.text = @"";

    

    NSString *buttonTag = [NSString stringWithFormat:@"%d", (int)sender.tag];

    NSString *data = @"";

    

    switch (sender.tag) {

        case 1:

            _secondLabel.text = @"Turn left";

            data = @"left";

            break;

        case 2:

            _secondLabel.text = @"Go forward";

            data = @"forward";

            break;

        case 3:

            _secondLabel.text = @"Turn right";

            data = @"right";

            break;

        case 4:

            _secondLabel.text = @"Turn left backword";

            data = @"leftback";

            break;

        case 5:

            _secondLabel.text = @"Move backward";

            data = @"backward";

            break;

        case 6:

            _secondLabel.text = @"Turn right backword";

            data = @"rightback";

            break;

        case 0:

            _secondLabel.text = @"Stop";

            data = @"release";

            break;

        case 11:

            _secondLabel.text = @"Slow speed";

            data = @"speed1";

            break;

        case 12:

            _secondLabel.text = @"Normal speed";

            data = @"speed2";

            break;

        case 13:

            _secondLabel.text = @"fast speed";

            data = @"speed3";

            break;

        default:

            break;

    }

    NSLog(_secondLabel.text);

    

    if ( self.currentcharacteristic != nil )

    {

        NSLog(@"Write value to peripheral");

        NSData *encodingdata = [data dataUsingEncoding:NSUTF8StringEncoding];

        

        [self.peripheral writeValue:encodingdata forCharacteristic:self.currentcharacteristic type:CBCharacteristicWriteWithoutResponse];

    }

}

@end



2015. 4. 4. 14:53

푸리에 변환과 라플라스 변환

출처: http://enginius.tistory.com/282


푸리에 변환과 라플라스 변환


1. 적분 변환의 정의

 푸리에 변환과 라플라스 변환은 모두 적분 변환(Integral Transform)의 일종이다. 적분 변환은 "적분을 이용하여 함수를 함수로 옮기는 사항"이다. 이것의 수학적 정의는 다음과 같다. 


 


위 식의 설명은 다음과 같다. 먼저, 함수 K(u,v)는 독립 변수가 u, v 두 개인 함수이다. 이는 이 적분 변환의 커널 함수(Kernel Function)이라도 한다. 따라서 적분 변환은 함수 f(u)에 커널 함수 K(u,v)를 곱하고 이 것을 어떤 구간 [u1, u2]에 대하여 정적분(Definite Integral) 한 것이다. 이렇게 변환을 시키고 나면 원래 u의 함수였던 f(u)가 v의 함수인 F(v)로 바뀌게 된다. 


 그렇다면, 왜 적분 변환을 하느 것일까? 함수 f(u)를 u의 영역에서 처리하기 어려울 때, 적분 변환을 통하여 v의 영역에서 처리한 후, 다시 u의 영역으로 돌리기 위해서이다. (이는 역변환이 존재할 경우에 한정되지만, 대부분 존재한다.)


2. 푸리에 변환의 정의

 푸리에 변환(Fourier Transform)의 정의는 다음과 같다. 



여기서 커널 함수는 e^(-jwt)로 시간 t와 주파수 w(=2*pi*f)의 이변수 함수로, 이 변환을 통해서 시간의 함수 f(t)는 Time Domain에서 Frequency Domain으로 옮겨진다. 이때 적분이 가능하려면, 적분 변환의 정적분 결과가 수렴해야 한다. 푸리에변환에서 커널 함수인 e^(-jwt)의 크기는 1이므로, 수렴조건은 다음과 같이 주어진다. 


 

 역 푸리에 변환(Inverse Fourier Transform)은 다음과 같다. 



3. 라플라스 변환의 정의

 라플라스 변환(Laplace Transform)에는 두 가지가 있다. 하나는 양방향 라플라스 변환(Bilateral Laplace Transform)이고, 다른 하나는 단방향 라플라스 변환(Unilateral Laplace Transform)이다. 여기서는 단뱡향 라플라스 변환만을 다루겠다. 먼저 단뱡향 라플라스 변환의 정의는 다음과 같다. 



여기서 s는 복소수로 라플라스 변환은 Time Domain에 있는 f(t)를 Complex Number Domain에 있는 F(s)로 변환시킨다. 위와 마찬가지로 적분이 가능하기 위해선, 적분 변환의 정적분 결과가 수렴해야 한다. 단방향 라플라스 변환의 수렴조건은 다음을 만족시키는 M과 r이 존재하기만 하면 된다. 



 역 라플라스 변환(Inverse Laplace Transform)은 다음과 같다. 




4. 푸리에 변환과 라플라스 변환

 푸리에 변환은 라플라스 변환에 포함된다고 볼 수 있다. 라플라스 변환을 위해 사용하는 커널 함수에서 복소수 s는 실수부와 허수부로 이뤄지는데 이 실수부가 0인 경우가 라플라스 변환인 것이다. 두 변환의 관계를 정리해 보면 다음과 같다. 



 즉 어떤 함수 f(t)의 라플라스 변환은 f(t)에 감쇠 함수 e^(row*t)를 곱하여 푸리에 변환한 것과 같다. 


5. 푸리에 변환 표(Transform Table)




6. 라플라스 변환 표(Transform Table)

 라플라스변환표.hwp



2014. 11. 5. 16:12

APA Style

APA는 American Psychological Association의 약자로, 미국에서의 각종 아카데미컬한 글을 작성할때에 쓰이는 양식입니다. 따라서 영문기준이며, 아래는 관련 내용을 번역하여 재구성한 것입니다.

참고 사이트:

What is APA style?

http://www.apastyle.org/learn/faqs/what-is-apa-style.aspx

Basics of APA style – tutorial

http://www.apastyle.org/learn/tutorials/basics-tutorial.aspx

APA Style workshop

http://owl.english.purdue.edu/owl/resource/664/01/

https://owl.english.purdue.edu/owl/resource/560/17/


What is APA Style?

APA Style®은 1929년, 심리학자, 인류학자, 비즈니스 관리자가 모여, 독해의 용이성을 높이기 위한 수많은 과학적 글의 구성요소들을 체계화 할 수 있도록, 간단한 절차와 스타일 규칙을 설립하려는 노력에 의해 시작되었다.

하나의 편집 스타일로서, APA 스타일은 규칙이나 가이드라인으로 구성되어 있고, 게시자는 서면 자료의 정확하고 일관성있는 프리젠테이션을 보장하기 위해 이를 준수한다. 다음과 같은 요소들의 균일한 사용에 관련한다:

  • 머리말의 선택, 글의 톤, 길이
  • 문장부호 및 약어
  • 통계와 수치의 프리젠테이션
  • 테이블과 사진의 구성
  • 참고문헌의 인용
  • 기타 원고를 구성하는 다른 요소들

APA Style 규칙과 가이드라인은 the sixth edition of the Publication Manual of the American Psychological Association에서 찾을 수 있다. 

APA Style의 간략한 개요는 다음의 무료 튜토리얼에서 볼 수 있다: The Basics of APA Style.

전체 설명과 정렬 정보 보기. 학교 도서관이나 지역 서점에서도 출판본을 구할 수 있다.


Why Use APA?

APA Style 은 독자로 하여금 익숙한 구조를 제공함으로서 이해력을 높일 수 있게 한다. 꾸준한 APS 스타일의 사용은 다음을 가능케 한다. :

  • 독자에게 글의 순서를 제공함으로써, 글의 아이디어를 더 효과적으로 따라갈 수 있게 하고 독자가 원하는 정보의 위치를 제공한다. 
  • 생소한 포멧으로 독자의 집중을 분산시키지 않고, 글의 아이디어에 집중할 수 있게 한다. 
  • 독자나 다른 연구자들을 인식하고 있음을 보여줌으로써 해당 연구 영역에서 글의 신뢰성이나 기풍을 확립한다.

Menuscript Format

원고의 내용은 Time New Roman과 같은 serif 서체를 사용한다. Figure의 레이블은 Arial과 같은 san serif 서체를 사용한다. 전체 원고의 줄간격은 2줄로 한다.(Double-space) 

모든 단락의 첫줄에 1.5inch 크기로 indent를 삽입한다. 오른쪽 여백에 상관 없이, 글을 왼쪽 정렬 시킨다.

페이지의 시작은 1 부터이다. 다음의 순서로 페이지를 구성한다:

  • 페이지 1: 타이틀 페이지
  • 페이지 2: Abstract
  • 페이지 3: 원고 시작.
  • 참고문헌은 마지막 페이지 다음에 새 페이지에서 작성한다. 
  • Figure는 테이블 다음에 새 페이지 도입부에 작성한다. Figure의 캡션은 Figure와 같은 페이지에 있어야 한다. 
  • Appendix는 새 페이지에서 작성한다.


Headings

Heading은 독자가 논문의 키포인트를 찾고 전개를 따라갈 수 있도록 돕는다. APA Style은 다음과 같은 5단계의 Heading을 사용한다.

  • Level 1: Centered, Boldface, Uppercase and Lowercase Headings (타이틀 포멧과도 동일)
  • Level 2: Flush Left, Boldface, Uppercase and Lowercase Headings
  • Level 3: Indented, boldface, lowercase paragraph heading ending with a period. 
      • (소문자 단락의 첫단어의 첫자는 대문자여야함).
  • Level 4: Indented, boldface, italicized, lowercase paragraph heading ending with a period. 
  • Level 5: Indented, italicized, lowercase paragraph heading ending with a period. 

헤딩 레벨을 연속적으로 사용한다. 예를 들어 논문이 3단계의 레벨로 구성된다면 아래 이미지처럼 사용한다.

Reduce Bias in Language (언어 편견 줄이기)

APA는 체계적인 보고 뿐만 아니라 개인과 집단의 공정한 처리에도 객관성을 유지하기 위해 최선을 다하고 있다. 오래지속된 문화는 글에 큰 영향을 준다. 그룹에 대해 쓸 때에는 정밀하고 세심하게 다음의 가이드를 유념하여 작성한다:

1. 특이성에 대해 적절한 레벨로 묘사한다.

예를 들어, at-risk children(위험에 처한 어린이)에 대해 언급한다면, 어떤 위험인지를 상세히 해야 한다. 만약 연령대 그룹을 다루고 있다면 그 연령대의 범위를 상세히 해야 한다.

상세하지 않은 표현: at-risk children, over 18 years of age

상세한 표현: children at risk for early school dropout, 18- to 35-year-olds

관련이 있을 때만 차이점이 언급되어야 한다. 결혼 상태, 성적 취향, 인종과 민족 정체성, 장애를 가진 사실 등은 근거없이 언급되어서는 안된다.

2. 라벨링에 주의하라.

사람들이 선호하는 명칭은 시간이 지나면 바뀔 수 있음에 유의한다. 예를들어 글에서 Native American(원주민. 인디언.)을 언급한다면, 그들이 어떻게 불리길 원하는지 결정해야 한다. 예를들어 Navajo보다는 Dine을 택하듯, 대다수의 원주민들은 모국어로 이름을 불리우는 것을 좋아한다.

자폐아에 대한 논문을 쓸 때에는, 다음과 같은 표현을 쓴다:

    • Persons diagnosed with autism may have restricted repertoire of activities relative to their age.
    • Most of the children in the autism group did not respond when asked their name.

3. Acknowledge participation.

실험에서 실험대상들의 역할에 대해 쓸 때에는, 수동적으로 실험을 당하는 것처럼 쓰기보다는 적극적인 참여자로 표현하는 언어를 사용한다. 예를들어 다음과 같은 표현을 선택한다:

    • The survey was administered to the students → The students completed the survey
    • The children were shown several on-screen objects The children viewed objects on the screen
    • The participants were run → We collected data from the participants

연구되는 사람들에 대해서 그들의 참여를 받아들이되 작업중인 영역의 전통에 일관된 방법으로 쓴다. 따라서, 비록 collage students, children, 혹은 respondents 같은 서술식 용어가 실험대상의 역할에 대한 정확한 정보를 제공하더라도, participants 나 subjects 같은 더 일반적인 표현도 있다. 


Citing References in Text

아이디어, 이론, 발견 등에 대한 인용은 나의 논문에 직접적으로 영향을 미친다. 다른 사람의 생각을 의역 하거나 설명을 한 것이더라도 그렇다. 

표절을 피하기 위해서, 모든 소스를 추적하여 꼼꼼하게 메모 하고 적절한 인용 정보를 수집한다. 

APA Style은 author-date 인용구 시스템을 사용한다. 이 시스템은 독자가 알파벳 순서로 정렬된 reference list 안에서 본문에 인용된 소스를 찾을 수 있게 한다. 

본문안에 인용구(citation)를 넣으려면, 저자의 성과 출판년도를 포함한다. 직접 인용(direct quotation)을 위해서는 page 번호나 문장이나 표현의 특정 위치를 포함한다. 

의역(paraphrasing)할때의 author-data citation 예제:

  • Kessler (2003) found that among epidemiological samples...
  • Early onset results in a more persistent and several course (Kessler, 2003).
  • In 2003, Kessler's study of epidemiological samples showed that ...

한개 이상의 업적을 함께 인용해야 할 때에는, in-text 인용구를 reference list와 동일한 알파벳 순으로 정렬한다. 예제:

  • Training materials are available (Department of Veterans Affairs, 2001, 2003) Past results (Gogel, 1990, 2006, in press)
  • Several studies (Derryberry & Reed, 2005a, 2005b, in press-a; Rothbart, 2003a, 2003b)
  • Several studies (Miller, 1999; Shafranske & Mahoney, 1998)


The Reference List

Reference list 의 목적은 독자가 소스의 출처를 찾을 수 있게 돕는것이다. 따라서 참고문헌 목록은 가능한 정확하고 완성도 높아야 한다. 

모든 인용구는, 개인통신과 오래전 작업인것을 제외하고는 모두 참고문헌 목록에 있어야 한다. 

참고문헌을 저자의 성을 기준으로 정렬한다. 성이 하나 이상인 저자의 경우 첫번째 성을 기준한다. 

내어쓰기 문단 스타일을 사용한다. 

각 참고문헌은 다은과 같은 구성을 가진다.

Author name. (Publication date). Title of work. Publication data.

웹이나 전자DB에서 발견한 소스를 인용할 때에는 다음의 가이드라인을 따른다.

  • 인용하는 버젼이 가장 최신의 것인지 확인할 것.
  • 가능하다면 저널의 볼륨 번호와 포함된 페이지 번호를 제공할 것.
  • 타이핑 하거나 copy-paste방법을 사용하여 참고문헌 끝에 DOI를 적을 것.
  • DOI가 없다면 홈페이지 URL을 적을 것.

* DOI란? Digital Object Identifier의 약자로 오브젝트에 주어지는 영구적인 디지털 식별자이다. 가장 일반적인 것은 전자 문서를 식별하는 것이다. International DOI Foundation (IDF) DOI를 이렇게 설명한다: 지적 재산권을 가진 모든 객체의 디지털 식별자. 

저자는 다양한 종류의 자료를 참고문헌 목록제 포함시킬 수 있다. 여기에는 논문(dissertation), 팟캐스트, 책 리뷰, 기록 자료 등도 포함된다. 학술 자료에서는 보통 다음과 같은 참고문헌을 사용한다:

  • journal article
  • entire issue of a journal 
  • chapter in an edited book
  • entire book
  • conference proceedings


2014. 10. 31. 12:48

Volume Rendering

요즘 지도교수님이 볼륨렌더링에 꽂히셨는지 관련 공부를 많이 시키시네요. 그냥 이런식으로 끄적이다 보면 내 머리 안에서도 정리가 되는 경우가 많기 때문에, 포스팅 하고자 합니다. 혹시 지나가시다가 이상한 정보를 발견하면 꼭 피드백 부탁드립니다. (_ _) 그리고 그래픽스에 무지한 분들도 그냥 가볍게 읽을 수 있도록 전문용어를 왠간히 풀어서 써보고자 합니다. 


볼륨 렌더링이란 말 그대로 3차원 정보의 텍스쳐를 활용하여 3차원의 꽉 찬 객체를 컴퓨터 화면 상에 그리는 일이다. Geometry 정보를 이용하여 형태를 잡고 그 위에 색을 입히거나 이미지를 입히는 것으로 생각할 수 있지만, 이는 과학이나 의학 영역의 데이터 시각화를 위해서는 부족하며, 볼륨 렌더링이라는 용어로 불리지 않는다.

* 그래픽스에서의 Geometry란 지형정보를 말하는데, 고체의 물체의 표면을 구성하기 위한 지리적 정보쯤으로 해석할 수 있겠다. 쉽게 말하면 보통 그래픽스에서는 xyz 축으로 하는 3차원 가상세계에서 객체를 표현하기 위한 좌표 집합 쯤 되겠다.

위키피디아에서는 이렇게 설명한다. 

In scientific visualization and computer graphics, volume rendering is a set of techniques used to display a 2D projection of a 3D discretely sampled data set, typically a 3D scalar field.

과학 영역의 시각화나 컴퓨터 그래픽스 분야에서, 볼륨 렌더링은 개별적으로 샘플링한 3차원 데이터를 2차원으로 프로젝션(화면 투영)하여 보여주기 위한 기술의 집합이다. 

즉, 우리가 먼지를 그리려면? 연기를 그리려면? 복잡하게는 사람 뇌와 근육 피부조직을 컴퓨터에서 시각화하고 싶다고 한다면, 단지 점과 선으로 이루어진 표현으로는 부족하다. 2차원 이미지가 픽셀로 표현되듯이, 3차원의 객체도 박셀(Voxel. 2차원의 픽셀과 같은 개념)로 표현해야 한다. (박셀의 상상은, 교수님 표현을 빌리자면, 마인크래프트를 상상하면 된다. 단지 3차원을 구성하는 큐브가 매우 작아서 한점이 되었다고 생각하면 되겠다.)

볼륨 렌더링을 위한 방법은 크게 Texture slicing 방법과 Ray casting 으로 볼 수 있다. 

(물론 큐브형태의 Solid Texture를 만들고 이를 조각하는 개념으로 Geometry 정보를 입혀 그려내는 방법도 있지만, 게임등에서 사용하면 몰라도 의학 데이터를 그려낼 수는 없다. 이 글에서는 생략.)

일단, 3D 볼륨 데이터가 어떻게 주어지는지를 먼저 보면, 한 축을 기준으로 단층을 여러장 촬영하여 한대 묶어서 표현한다. 쉽게 CT 촬영을 생각할 수 있는데, 아래 이미지를 보면 쉽게 감이 올 것이다.

(출처 - 위키피디아 'X-ray computed tomography')

머리 끝에서 코 중앙부까지 내려가며 CT 촬영 한 결과다. 이 2D 이미지들을 쭉 나열하면 아래 이미지처럼 그럴싸한 3차원 데이터가 탄생한다. (참고로 위에 부합하는 볼륨 이미지가 없어서 ㅎㅎ 축을 바꿔 촬영한 CT 단면으로 생각해주시기 바랍니다.)

(출처 - Purdue Univ. CGT521 클래스 강의 자료 중 일부 발췌 입니다. ㅎ)

다시 돌아가서, 볼륨 렌더링의 첫번째 방법인 Texture slicing 방법을 들여다보면, 그냥 이런 원리로, 슬라이스 된 2차원 이미지를 쭉쭉 그려주자는 것에 있다. (검은 영역은 투명처리 하고 나머지 밝은 영역에 적당히 알파값을 입힘.) slicing 방법도 몇가지로 나뉘는데 크게 axis-aligned 와 view-aligned 로 나뉜다. axis-aligned 방법은 이 주어진 데이터를 x, y, z 축으로 슬라이스하여 볼륨을 그리자는 것이다. 

헌데 문제가 있다. 만약 뷰의 방향을, 위 그림의 사람 얼굴과 정면으로 마주보도록 바꾼다면..? 뷰 방향은 2차원 이미지 평면의 접선이 되버려서 제대로 이미지가 그려지지 않는다. 그래서 나온 방법이 View-aligned slice 이다. 즉, 항상 볼륨 데이터를 2차원 이미지로 자를때에, x, y, z 축을 기준으로 하는게 아니라, 뷰 방향과 수직이 되는 평면으로 슬라이스를 하자는 것이다. 이것은 뷰 방향을 바꿀때마다 슬라이스를 추가적으로 재계산하여야 한다. 

그러나 이 방법은 이제 고전적인 방법으로 보인다. 예를들어 CT 사진의 검은 영역, 즉 공기 영역까지도 매번 계산량에 포함되는데다가 이런식으로 뷰 방향을 항상 고려해야 하고, 그러다보면 최적화 이슈등으로 복잡하고 어려운 기술들이 덧붙여진다. 

Ray casting 은 이러한 문제를 깔끔히 해결해주고도 높은 퀄리티의 렌더링을 얻을 수 있다. Ray casting은, 화면이라는 2차 평면의 픽셀 하나하로 광선을 하나하나 쏜다고 가정하고, 그 광선상에 위치되는 모든 박셀의 색상을 합하여 해당 픽셀을 그리겠다는 것이다. 이렇게 하면 화면의 픽셀 수만큼만 연산하면 되고, 뷰 방향에 상관 없이 single pass 만으로 볼륨을 그려낼 수 있다. 게다가 이러한 점때문에 Fragment Shader를 연산에 사용할 수 있다! (slicing 방법은 사용할 수 없다. 모든 슬라이스 정보를 Fragment shader 가 알아야 한다는 건데, 이 슬라이스 정보를 넘길 방법이 없다. 아마 추측컨데, ray casting 이 훨씬 아름다워 보임에도 그때당시 슬라이싱 방법을 사용했던 것은, Programmable Shader 유무 여부가 아니었을까 조심스레 추측해본다. Shader 가 없었다면 레이 캐스팅 방법은 상당히 헤비했을테니까.)

(출처 - a very simple volume rendering implementation with 3D textures 논문.)

더 자세한 Ray casting 에 대한 설명은 위키피디아에서 'Volume ray casting'을 찾아보면 잘 설명되어 있으므로 참고하기 바란다. 

잠깐 다음의 설명하고자 하는 Transfer function을 위해서 간단한 Ray casting 단계를 인용하고 넘어가겠다. 

  • 1단계 - Ray casting. 광선 던지기. ㅎㅎ 뷰방향과 일치하는 방향으로 광선을 모든 픽셀에서 쏜다.
  • 2단계 - Sampling. 광선과 부피의 교차지점은 선으로 볼 수 있다. 선 상의 모든 점을 더한다는건 불가능하므로 적절히 간격을 가지고 최종 색상을 결정할 데이터 점들을 선택한다. 이를 샘플링이라 한다. 
  • 3단계 - Shading. 쉐이딩. 빛 등을 고려하여 샘플링한 데이터 점의 색상을 결정한다. 
  • 4단계 - Compositing. 이렇게 결정된 광선 위의 모든 샘플링 데이터 색상을 더한다. 


(출처 - 위키피디아 Volume ray casting)

참고로 a very simple volume rendering implementation with 3D textures 논문을 보면, Ray casting with texture slices 라는 개념이 설명된다. 이 부분에서 혼동이 올 수 있는데, 해당 논문에서는 샘플링 기법으로 3D 텍스쳐를 슬라이스 해서 광선과 슬라이스 2차 평면의 교차점을 샘플링하겠다... 이 개념인듯 하다. 하지만 굳이 슬라이스를 접목할 필요 없이, Shader 내에서 샘플링 간격을 지정해주고 샘플링 하면 되므로... 텍스쳐 슬라이싱이 필요하다고 생각되지는 않는다.

여하튼, Volume ray casting 에서 1단계와 2단계는 대충 알았고, 3단계.. 색상을 어떻게 결정할지가 그 다음 이슈이다. CT촬영 결과에서 봤다시피, 우리는 신체 부위별 색상을 결정할 수가 없다. 단지 CT 에서는 X 선의 전파량에 따라 조직이 있는 부분은 희게, 조직이 없는부분은 검게 표현할 뿐이다. 즉, 조직의 밀도가 높으면 매우 하얗고 밀도가 낮을수록 점점 어둡게 표현된다고 볼수 있다. 그래서 뼈는 대부분 강렬하게 하얗다. 

뭐... 그냥 회색으로 다 표현해 버릴 수도 있다. 하지만 예쁘지 않다. ㅎㅎ -_- 그것보다... 볼륨 렌더링이 절대적으로 필요한 의학 영역의 경우, 조직과 조직간 구분이 쉽게 되어야만 한다. 의학 영역에서 볼륨 렌더링을 하는 이유는 조직을 검사하기 위한 것이기 때문에. 

따라서 볼륨에 색상을 입혀야 한다. 하지만 어떻게...? 그래서 소개한다. Transfer function!

Transfer function은 포토샵 같은 프로그램에서도 쉽게 볼수 있다. 대부분 포토샵으로 특정 색을 더 튀고 강렬하게 하거나 칼라 사진을 흑백으로 바꾸거나 한 경험이 있을것이다. 이것이 모두 Transfer function을 이용하여 색상의 변화에 규칙성을 부여하는 것이다. 

이전에 이미지의 히스토그램 개념을 먼저 알고 넘어가야 한다. 이미지의 히스토그램이란, 색상의 집약도(Intensity. 강렬도라 해야하나.. 그냥 앞으로 Intensity로 쓰겠습니다.)를 x축으로 하고 색상의 갯수를 y축으로 하는 히스토그램이다. (참고로 실제 연산시 x 축은 보통 0~1로 노멀라이즈 됨) 뭔 말이고 하면, 일단 쉽게 2차원 Greyscale이미지를 예로 들자면, 흑백이미지니까, 모든 픽셀은 0~255로 하는 회색으로 표현 가능하다. 이때, 각 색상별 갯수를 나타내는 것이다. 예를 들어 64x64 이미지가 그냥 전부 검정색이면, 히스토그램은 0에 몰빵된 그래프를 보여줄 것이다. 

그렇다면 똑같은 계산으로 3차원 박셀 데이터를 히스토그램화 할 수 있다. CT 촬영을 예로 들면, 그렇다면 Intensity 값 0근처는 공기부로 표현할 수 있고, Intensity 값이 크면서도 갯수가 많은 데이터는 뻐 등으로 유추할 수 있다. 따라서 x 축을 이러한 느낌적인 느낌으로 ㅎㅎ 구간을 나누어서, 주어진 RGB 컬러로 환산하는 함수가 바로 Transfer function 이다. 여기서 이 '느낌적인 느낌' 이게 상당히 어렵다. 자동으로는 구분이 어려워서 쉽게는 그냥 사람이 눈으로 보면서 이쯤 뼈겠구나.. 하면 거기에 하얀색 할당하고, 이쯤 뇌겠구나.. 하면 거기에 노란색 할당하는 식이다. 더 어려운건, 뇌와 비슷한 밀도를 가진 다른 조직이 있다고 하면, 그 다른 조직이 뇌로 취급되어 색상이 입혀 질 수 있다는 것이다. 물론 모든 조직의 밀도는 조금씩 다 다르므로.. 매우 섬세히 작업한다면 구분할 수 있지만, 이 섬세한 영역을 아직은 컴퓨터가 자동으로는 해주지 못하고 있다. 

일단은 간단히 그냥 0~10은 빨강, 11~20은 주황, 21~30은 초록 이런식으로 고정해서 색을 입히기도 한다. Transfer function을 자동으로 생성한다면 얼마나 좋을까. 지금은 대부분 사람이 수동으로 고쳐서 생성하는 것만큼 정확하지가 않다. 아무튼 그래도 대충이라도 자동화 하기위한 노력들이 계속되고 있다. 관련 분야가 궁금하다면 Histogram equalization과 Histogram specification을 키워드로 구글링 하라.

참고로! 히스토그램을 이용하는 방법 말고도 볼륨에 색상을 입히기 위한 다른 방법들도 당연히 있지만, 나의 연구 분야는 현재까지는 Histogram specification 으로 한정되어 있으므로... ㅎㅎㅎ (히스토그램 스페시피케이션을 위한 이용한 볼륨 렌더링에 대해 좋은 아이디어가 있다면 공유 바랍니다... 냅다 논문 내 버리게. -_-)

아래의 블로그는 Volume rendering 부터 Transfer function, Shading 까지 모든것을 구현할 수 있게 아주 친절히 설명하고 있다. (감사해요.. ㅠ 덕분에 파이널 프로젝트를 시작할 엄두는 낼 수 (?) 있게 됬습니다... 하하..) 아주 좋은 포스팅이니 구현을 원하는 분들은 꼭 참고하기 바란다.

http://graphicsrunner.blogspot.com/search/label/Volume%20Ray-Casting




여기까지 부족한 글 읽어주셔서 감사합니다. 볼륨 렌더링에 대한 영문 논문이나 블로그는 많은데 한글 자료는 잘 보이지 않는 것 같아서, 저도 공부 겸사 작성해 보았네요. 잘못된 부분이 있을 수 있으므로 적극적인 피드백 부탁드립니다. (과연 내 블로그에 오는 이가 있긴 할까만은... ㅎㅎ) 그나저나... 무지하게 바쁜데 지금 블로그 포스팅 글 작성하다가 재미들려서 완전 지금 반나절 다 까묵었네요.. 아오... ㅠ ㅠ ㅠ 

2014. 10. 27. 04:19

Toys report #1


Customizable Vehicle Track

일본에는 굉장히 많은 종류의, 그리고 실제 실존 했던 기차나 차 모형들이 굉장히 많았으며, 하여 이를 전문적으로 수집하는 이도 있다고 한다. 트랙은 대부분 완성품으로 팔거나 부품 세트로 하여 원하는 길로 구성할 수 있도록 하는 방식이었으며, 이것에 자신이 원하는 탈것을 구입하여 연결하여 올리는 식이다. 
차의 경우 차 하나하나가 완성품이지만, 기차의 경우 기차의 한 칸 한 칸 따로 팔고 있기에, 원하는 구성으로 기차를 만들어 트랙에 올릴 수 있다.

point
- 실제 존재했던 모델을 본 따 만들어서 수집의 의미를 가질 수 있게 함.
- 엄청나게 다양한 종류
- 완성품의 부품 단위로 판매하여 semi-customizing 가능.

proposal
- 트랙은 클래시컬한 전통 모양 한가지로 통일. 이것을 원하는 길이나 형태로 이을수 있게 조각 단위로 구성
- 트랙과 결합시킬 수 있는 다양한 악세서리. 승차 플랫폼, 대합실, 역무실, 집, 가게, 벤치, 신호등, 차폐막, 나무...
- 열차는 전세계적으로 유명했던 것을 그대로 모형화. 디테일에 따라 중급/상급/최상급 으로 나누어 가격 차등.
- 시즌 별로 한정판 collector 용 모형도 제작.




Animal Alive!

일본에서는 그대로 살아움직이는 듯한 봉제 인형이 인기가 많았다. 봉제 인형안에 매우 단순한 움직임의 기계 장치를 삽입하여 건전지나 태엽 등을 원동력으로 하는 것이며, 반복적이고 단순한 움직임을 보이는 것만을 대상으로 한다. 그 예로 오물오물 무언가를 씹고 있는 듯한 다람쥐 인형이라든가, 눈을 깜빡이며 골골 졸고 있는 듯한 병아리 인형, 그리고 태엽을 감으면 앞으로 조금씩 이동하는 알파가 인형등이 있었다.
예전부터 존재해 왔던 아이디어 - 짓어대는 강아지 같은 - 였으나, 실제 움직임을 그대로 관찰하여 작은 움직임을 반복적으로 따라함으로서, 마치 정말 조용히 숨쉬고 있는 작은 생명체를 마주하는 느낌을 준다.
허나, 이것은 지극히 개인주의 적이고 정서적으로 매우 정적인 일본 아이들에게 인기 있는 것으로, 활동적인 정서의 한국 아이들이나 혹은 글로벌한 측면에서는 얼마나 인기가 있을지는 모를일.

point
- 작고 미세한 움직임을 규칙적으로 따라하는 인형. 숨쉬기/오물거리기/눈깜빡이기 등
- 작은 동물. 한손에 움켜쥘 수 있게 하여 정서적으로 더 친근하게 다가가게 만듬.

proposal
- 숨쉬는 마리모 컨셉. 부드러운 털의 한 손에 들어오는 작고 동그란 물체.
- 살짝 팽창했다가 줄어드는 것을 반복. 
- 손에 들고 있다 보면 따듯해 짐.
- 내부에 light 내장. 밤에 보면 희미하게 빛남.
- 소리를 냄. 골골골....
- 방수 기능을 갖출것. 물에 들고 들어가서 씻기거나 해도 털이 빠져선 안되고 물이 흡수되어서도 안됨.
- 가능하다면 움직임을 통해 천천히 굴러갈 수 있게 함.



Dia block

일본에서 레고를 벤치마킹하여 만든 블록 장난감. 레고와 다른점은 하기와 같음.
- 더 작아서 섬세한 모양 형성 가능. (더 납작함)
- 색상이 매우 다양.
- 조립 완성형태 별로 판매 하는 것이 아닌, 조립 도면은 따로 있고, 색상별로 다양한 모양의 블럭을 한데 묶어 판매하는 형식. (판매함도 쨈병 모양의 jar에 담아 판매하는 독특한 구조)

point
- 다양한 색상. 그리고 색상 별 판매.


Alive Town Dom

옛 도시의 핫스팟을 모형화 한 돔. 건물들의 디테일이 훌륭하며, 건물의 창물을 통해 빛이 나오고 그 앞에 작은 사람들은 규칙적으로 움직임. 그 앞으로는 과거의 유물인 지상열차가 움직이고 이에따라 신호등에 불이 들어옴.
가로등도 설치되어 있고 이곳에도 불이 들어옴. 아기자기.

point
- 실존하는 큰 건물들의 디테일이 살아있는 모형.
- 갖가지 조명 장치나 움직임 장치를 통해 살아 움직이게 표현함.
- 돔 형으로서 장식의 의미가 큼. 

proposal
- 건물 모형을 다양하게 구비.
- 그외 악세서리 다양하게 구비. 벤치, 가로등, 신호등, 자동차, 사람, 솜사탕판매상, 핫도그 판매상, 이벤트 곰돌이, 키오스크, 등등.
- 각 악세서리와 건물은 동일한 모양의 핀 구비. 바닥은 이 핀이 어떤 위치 어떤 각도로도 꼽힐 수 있게 많은 핀구멍이 뚤린 바닥으로. 바닥 밑으로는 어떤것을 꼽더라도 전기가 흐를수 있게끔 장치되어 있음. (위험?)
- 바닥의 사이즈는 소/중/대 있음.



Mechanical Theater

일본 긴자 거리에 메카니컬 씨에터가 있으며, 각종 태엽으로 얽히고 섥힌 꼭두각시들이 동전을 넣으면 다양하고 재미있는 움직임을 보여준다. 관건은 태엽간의 움직임으로, 시작 원동력은 한곳에서 나와서 그것들이 다양한 태엽간 힘 분산으로 인해 다양한 타이밍으로 각각 움직이게 하는것.
따라서 전기가 아닌 사람의 힘으로, 돌리기만 하면 움직이게 하는 것도 있었다.

Point
- 한곳의 동력으로 태엽을 유기적으로 이용하여 다양한 곳으로의 동력으로 분할 활용
- 컨셉이 재미있음. 스파게티 먹는 사람, 청혼하는 사람, 창문닦는 사람 등. 단순하고 심심한게 아닌 하나의 장면으로 이야기를 만드는 느낌임. 호기심을 유발함.
- 나무소재로 되어져 있어 정서적으로 안정감을 줌.

Proposal
- 전기 장치가 아닌 전부 수동 움직임이 되게 한다. 즉, 손으로 손잡이를 돌리면 각 태엽이 유기적으로 움직이게.






2011. 12. 7. 13:37

Android NDK로 OpenSSL 사용하기.

1. 리눅스에 안드로이드 NDK 설치.

2. openssl 소스 다운로드 받기.
package com.samsung.cerm.protos.comm;

public abstract class OpenSSL {
static {
System.loadLibrary("openssl2");
}
abstract public void sendMessage(int msgID);
// synchronized 를 통해 프로그램 상에 동작하는 쓰레드 중 하나만 해당 함수를 실행 할 수 있는 권한을 줌.
public native String generatePrivateKey();
public native String makeCertificateRequest();
public native String makeCertificate(String rootCA, int rootCALen, String rootKey, int rootKeyLen);
public native void initReference();
public native void initOpenSSL();
public native void release();
}

2010. 4. 21. 16:35

UPnP NAT traversal FAQ

출처: http://www.microsoft.com/korea/windowsxp/pro/techinfo/planning/networking/natfaq.mspx

Q.


UPnP란 무엇입니까?

A.

UPnP(Universal Plug and Play)는 특히, 가정 내에서 PC와 지능형 장치 또는 기기를 피어-투-피어 방식의 네트워크로 연결하기 위해 보편적으로 사용될 아키텍처입니다. UPnP는 TCP/IP, HTTP 및 XML과 같은 인터넷 표준과 기술을 기반으로 하기 때문에 이러한 장치들이 서로 자동 연결되고 더욱 많은 사람들은 네트워킹(특히, 홈 네트워킹)을 통해 함께 사용할 수 있습니다.

Q.
일반 사용자는 UPnP를 어떻게 사용할 수 있습니까?
A.

일반 사용자는 간편해지고 더욱 혁신적인 경험을 할 수 있습니다. UPnP 기술을 사용하는 네트워킹 제품은 네트워크에 물리적으로 연결만 하면 "바로 작동"됩니다. UPnP는 유무선에 관계 없이 거의 모든 네트워킹 미디어 기술과 호환됩니다. 여기에는 Category 5 이더넷 케이블, Wi-Fi 또는 802.11B 무선 네트워크, IEEE 1394("Firewire"), 전화선 또는 전력선 네트워킹이 포함되는데, 이러한 장치와 PC가 서로 연결되면 사용자는 혁신적인 새로운 서비스와 응용 프로그램을 더욱 쉽게 활용할 수 있습니다.

Q.
UPnP Forum이란 무엇입니까?
A.

UPnP Forum은 가정과 궁극적으로는 기업 내에서 지능형 장치의 네트워킹을 단순화하는 UPnP 표준을 규정하기 위해 1999년 6월에 출범한 개방된 통신업계 컨소시엄입니다. UPnP Forum은 UPnP 장치 제어 프로토콜 및 서비스 제어 프로토콜을 정의하고 발표함으로써 이러한 목적을 달성하고 있습니다. 2001년 6월 현재 350개 이상의 기업이 UPnP Forum의 회원사로 가입하였으며, 22개 회원사로 이루어진 UPnP Steering Committee가 UPnP Forum를 주도하고 있습니다. 이 컨소시엄의 노력을 구체화하기 위해 특정 장치 분야를 전담하고 있는 Technical Committee, Marketing Committee 및 기타 다양한 위원회가 운영되고 있습니다. UPnP Forum 가입 정보 및 전체 회원사 목록은 UPnP Forum 웹 사이트  에서 볼 수 있습니다.

Q.
UPnP의 기술적 요소는 무엇입니까?
A.

UPnP는 가정 네트워크, 근접 네트워크 및 소규모 기업과 전체 기업의 네트워크를 대상으로 하기 때문에 범위가 넓다고 할 수 있습니다. 네트워크에 있는 어떤 제어 장치의 명령에 의해 두 장치 간의 데이터 통신이 이루어지도록 하는 UPnP는 특정 운영 체제, 프로그래밍 언어 또는 물리적 매개체에 상관 없이 작동합니다.

UPnP는 무인 구성 네트워킹 및 자동 감지 기능을 지원하고, 장치는 네트워크에 동적으로 연결되어 IP 주소를 얻고, 고유한 이름을 알리며, 요청에 따라 기능을 수행하고, 다른 장치의 존재 여부 및 기능을 감지합니다. DHCP 및 DNS 서버는 선택 사항이며 네트워크에서 사용 가능한 경우에 사용됩니다. 더욱이, 장치는 네트워크에 원치 않는 상태를 남기지 않고 자연스럽게 자동으로 네트워크 연결에서 분리될 수 있습니다.

UPnP는 인터넷의 성공 비결을 통해 이루어졌으며 IP, TCP, UDP, HTTP 및 XML을 포함한 인터넷 구성 요소를 많이 활용합니다. 많은 업체들이 UPnP에 사용되는 표준 장치 제어 프로토콜(DCP)을 제정하기 위해 협력하고 있습니다. 인터넷과 마찬가지로, 이러한 프로토콜은 XML로 선언 및 표현되고 HTTP를 통해 통신되는 유선 프로토콜을 기준으로 하는 규약입니다.

Q.
NAT란 무엇이며, 왜 필요합니까?
A.

NAT(Network Address translation)는 개인 네트워크(10.0.x.x, 192.168.x.x, 172.x.x.x 등의 개인 주소 범위 사용)에서 여러 PC 또는 장치가 전역적으로 라우팅 가능한 단일 IPv4 주소를 공유할 수 있도록 하기 위해 사용되는 IETF(Internet Engineering Task Force) 표준입니다. NAT가 많이 사용되고 있는 주된 이유는 현재의 인터넷 주소 방식인 IPv4 주소가 별로 남아 있지 않기 때문입니다.

NAT는 공용 인터넷과 개인 LAN 사이의 경계를 형성하는 게이트웨이 장치에서 사용됩니다. 개인 LAN의 IP 패킷이 게이트웨이를 통과할 때, NAT가 개인 IP 주소와 포트 번호를 공용 IP 주소와 포트 번호로 변환함으로써 개인 세션을 그대로 유지합니다. Microsoft Windows XP 및 Windows Me 운영 체제의 인터넷 연결 공유 및 기타 많은 인터넷 게이트웨이 장치에서 NAT를 사용하고 있으며, 특히 DSL이나 케이블 모뎀을 통한 초고속 네트워크 공유를 위해 사용됩니다. 점점 더 많은 가정과 소규모 기업에서 PC를 네트워크로 연결하고 인터넷을 공유함에 따라 NAT 사용이 크게 증가되고 있습니다.

Q.
NAT를 사용할 경우 어떠한 문제가 발생합니까?
A.

간단히 말하자면, NAT를 사용할 경우, 점점 더 많은 사람들이 가정이나 소규모 기업에서 인터넷을 사용하도록 만드는 멀티 플레이어 게임, 실시간 통신 및 기타 피어-투-피어 서비스와 같은 최신 기술과 혁신적인 PC 및 홈 네트워킹 경험을 체험하지 못할 수 있습니다. 이러한 응용 프로그램은 공용 인터넷의 개인 주소를 사용하거나 동일한 포트 번호를 동시에 사용할 경우 제대로 작동하지 않습니다. 응용 프로그램에서는 공용 주소를 사용해야 하고, 각 세션에 대해 고유한 포트 번호가 있어야 합니다. 대기업과 같은 경우는 IT 전문가를 두어 기업용 응용 프로그램이 NAT를 사용하면서도 잘 작동하도록 조치를 취할 수 있지만, 소규모 기업이나 가정에서는 그럴 만한 여력이 없습니다. UPnP NAT traversal은 NAT 사용해 응용 프로그램에 발생하는 여러 가지 문제를 자동으로 해결함하는 소규모 기업과 가정에서 활용할 수 있는 이상적인 솔루션입니다.

Q.
NAT traversal 솔루션은 어떻게 이루어졌습니까?
Q.

NAT traversal 문제를 해결하는 다른 방법은 없습니까? 방법이 있다면 UPnP를 사용하는 것이 어떠한 이유로 최선의 선택이 될 수 있습니까?

A.

물론, 이러한 문제를 해결할 수 있는 다른 방법이 있습니다. 하지만, 현재 일반 사용자를 위해 이러한 문제를 자동으로 해결하고 개발자가 폭넓게 적용 가능한 업계 표준은 UPnP 이외에는 없습니다. 다른 메커니즘의 경우 특정 응용 프로그램에서 발생하는 NAT 사용 문제를 해결하기 위해서는, 사용자가 직접 개입하거나 인터넷 게이트웨이 장치 개발업체나 소프트웨어 개발자가 특별한 노력을 기울여야 합니다. 결국, UPnP만이 이러한 문제를 일반적인 방법으로 해결할 수 있습니다.

일반 사용자의 작업이 필요합니다. NAT 문제를 직접 해결하기 위해서는 일반 사용자가 브라우저를 통해 그래픽 사용자 인터페이스 기반의 도구나 명령줄 인터페이스 도구를 사용하여 가정에 있는 인터넷 게이트웨이 장치의 일부 설정을 변경해 주어야 합니다. 이러한 작업을 많이 해 본 경험이 있거나 관심 있는 사용자는 별다른 어려움 없이 수행할 수 있겠지만, 대부분의 일반 사용자는 이러한 작업을 꺼려합니다. 더욱이, 많은 일반 사용자들은 NAT를 사용함으로써 인터넷에서 응용 프로그램이나 서비스를 이용할 때 문제가 발생할 수 있다는 사실조차 모르고 있습니다. 사용자는 멀티 플레이어 게임을 하거나 피어-투-피어 서비스를 이용하려고 하지만 어떤 이유로 접속할 수 없다는 사실을 알게 됩니다. 이에 따라, 여러 가지 문제 해결 방법을 시도하고 A/S 센터에 문의도 하지만, 결국 사용자의 불만이 쌓이게 되고 새로운 서비스나 미래의 혁신적인 경험을 시도하지 않게 될 수도 있습니다.

개발자의 작업이 필요합니다. 일반 사용자가 이러한 NAT 사용 문제를 직접 해결하지 않도록 하기 위해, 일부 인터넷 게이트웨이 장치 개발업체의 경우 응용 프로그램 계층 게이트웨이 지원 기능을 만들어 게이트웨이 장치에 포함시키기도 합니다. 이 응용 프로그램 계층 게이트웨이 소프트웨어는 특정 응용 프로그램을 염두에 두고 만들어집니다. 즉, 장치 개발업체에서는 특정 응용 프로그램의 NAT 문제를 자동으로 해결하는 코드를 작성하고 테스트합니다. 하지만, 이러한 응용 프로그램 소프트웨어가 업데이트될 경우, 장치 개발업체에서 작성한 응용 프로그램 계층 코드도 업데이트하거나 다시 테스트해야 합니다. 이와 같이, NAT 사용 문제를 한 번에 하나씩 해결하는 방법은 NAT 문제를 고려해야 할 피어-투-피어 또는 관련 응용 프로그램이 얼마 되지 않을 경우에는 크게 문제가 되지 않지만, 이러한 응용 프로그램의 수가 수백 또는 수천 개에 이를 경우 문제 해결을 위해서는 많은 비용이 들고 이러한 각 응용 프로그램이 어떻게 작동하는지에 대한 폭넓은 지식도 필요합니다. 이러한 문제를 해결하는 더 좋은 방법은 장치 제공업체에서 해당 장치가 UPnP를 이해하도록 소프트웨어나 펌웨어를 한 번만 추가하고, 다른 장치와 소프트웨어에서도 동일한 기술을 사용하여 NAT 장치와 통신할 수 있도록 하는 것입니다. 현재 이러한 역할을 충분히 수행할 수 있는 기술은 UPnP밖에 없습니다.

Q.
UPnP NAT traversal 솔루션은 무슨 역할을 합니까?
A.

UPnP 지원 NAT traversl은 다음과 같은 사용 문제를 해결할 수 있습니다.

  • 멀티 플레이어 게임
  • 피어-투-피어 연결
  • 실시간 통신
  • 원격 지원(Windows XP의 기능)

IHV의 경우, 이 솔루션을 사용함으로써 NAT 문제 해결을 위해 응용 프로그램 계층 게이트웨이(ALG) 데이터베이스를 작성하거나 관리할 필요가 없어집니다. 이 솔루션은 Windows XP 및 Windows 내의 프로그래밍 리소스인 Direct Play에서 모두 지원하므로, DPlay에 대해 작성된 소프트웨어 응용 프로그램은 NAT에서 자동으로 UPnP 솔루션을 사용하게 됩니다.

UPnP Forum의 IGD 사양은 다음과 같은 방식을 통해 자동으로 NAT traversal을 구현합니다.

  • 공용 IP 주소 얻기
  • 기존의 포트 매핑 열거
  • 포트 매핑 추가 및 제거
  • 매핑에 임대(사용) 시간 할당
Q.
어떤 업체들이 UPnP NAT traversal 솔루션을 구현하고 있습니까?
Q.
일반 사용자들이 UPnP 지원이 되는 인터넷 게이트웨이 장치가  무엇인지 어떻게 알 수 있습니까?
A.

사용자들은 해당 인터넷 게이트웨이 장치 업체의 웹 사이트를 방문하거나 제품 상자에 쓰여진 문구를 보고 UPnP 기능이 포함되어 있는지 확인할 수 있습니다. 소매업체에서도 앞으로 몇 개월 이내에 이러한 사실을 알게 될 것입니다. 몇 개월 후에 UPnP Forum에서는 인터넷 게이트웨이 장치가 UPnP Forum의 테스트 요구 사항을 만족하는지 여부를 표시하기 위해 제품 상자, 마케팅 자료 또는 제품 자체에 부착할 수 있는 UPnP 로고를 제공할 예정입니다.

Q.
개발자들이 이 솔루션을 구현하는데 필요한 리소스가 있습니까?
A.

일반 문서에서 호환성 테스트 자료(PlugFests)에 이르기까지 많은 리소스가 있습니다. 기술 문서를 보려면 http://www.upnp.org/resources/  을 방문하고, 앞으로 개최될 이벤트 정보는http://www.upnp.org/events/  을 참조하십시오. Microsoft는 MSDN Online에서 Windows XP에 대한 개발자 정보를 제공하고 있습니다.

Q.
그 밖의 정보는 무엇입니까?
A.


2010. 3. 22. 12:23

오픈 소스 기반의 DBMS 솔루션과 모바일 기기에서의 활용방법

출처: http://blog.naver.com/PostView.nhn?blogId=hongjig&logNo=150079382193

김형훈 asinayo73@hotmail.com


애플의 아이폰이 시장에 출시되면서, 많은 사람들이 모바일 컴퓨팅 기기에 관심을 가지게 되었다. 기존의 모바일 통신기기가 단순한 음성/영상 통신기기에서 멀티미디어를 비롯한 다양한 기능을 지원하는 대용량 기반의 모바일 컴퓨팅 기기로 진화하게 되면서, 많은 데이터를 처리할 수 있게 되었고 이와 관련된 처리 방법이 매우 중요한 위치를 가지게 되었다. 모바일 컴퓨팅 기기에서 데이터를 어떻게 관리해야 하는지에 대해서 살펴보도록 하자.


모든 모바일기기는 하드웨어와 소프트웨어로 구성되어 있다. ARM기반의 하드웨어에서 CPU의 성능이 향상되면서 다양한 어플리케이션을 수용할 수 있게 되었다. 기존의 ARM926EJ-S부터 시작하여 현재는 Cortex A8코어가 지원됨으로써 CPU가 처리할 수 있는 속도 및 능력이 향상되었다. 90nm 공정과 공간 최적옵션을 사용했을 때 최대 250MHz의 CPU 성능을 가지는 ARM926EJ-S가 65nm 공정과 속도 최적옵션을 사용하여 650∼1100MHz의 성능을 가지는 Cortex A8 CPU로 진화됨으로써 이러한 결과를 얻게 되었다. CPU 성능과 더불어 모바일 기기에서 가장 중요한 요소인 메모리의 경우에는 소프트웨어가 실제로 실행되는 장소인 휘발성 메모리의 용량이 증가할 수록 많은 어플리케이션이 동작할 수 있게 되고, 많은 어플리케이션이 실행될 수 있는 기기에서는 데이터베이스의 활용도 및 중요도가 그만큼 높아졌다. 이와 같이 중요한 역할을 담당하는 데이터베이스는 모바일 컴퓨팅의 성능/기능을 만족시키기 위해서 사용되는 모바일 플랫폼의 기본 시스템으로서 사용된다.

DBMS 솔루션은 비즈니스모델에 따라서 상용 솔루션과 오픈 소스 기반의 솔루션으로 나눌 수 있다. 상용 데이터베이스 솔루션은 일정한 금액을 받고 이를 원하는 업체에 제공을 하기 때문에 제공 이후의 사후 관리에 대해서도 많은 지원 대책이 존재하지만, 오픈 소스 기반의 데이터베이스 솔루션의 경우에는 오픈 소스를 활용하는 주체가 실질적인 솔루션 공급자와 운용자의 두 역할을 담당해야 하기 때문에 사후 관리에 있어서도 많은 책임이 주어진다. 물롞, 많은 오픈 소스 기반의 솔루션들도 상당한 수준의 상용화 수준을 이미 가지고 있으며, 전문적으로 이를 지원하는 조직을 가지고 있는 솔루션도 있다.

오픈 소스는 많은 형태의 라이선스를 가지고 있으며, 그 중 하나인 듀얼 라이선스 비지니스 모델을 적용한 솔루션의 경우에는 오픈 소스로 개인에게 공개하는 버전과 유상으로 기업에게 제공하는 버전이 존재한다. 이러한 오픈 소스 비즈니스 모델을 적용한 대표적인 제품으로서 MySQL이 있다. 오픈 소스기반의 솔루션을 사용할 경우에는 대체적으로 최소의 비용을 투자하여 최대의 효과를 얻을 수 있다는 점에서 많은 매력이 존재하기 때문에 기존의 성숙된 시장에 보다 용이하게 진입하고자 하는 경우에 사용될 수 있다. 하지만, 오픈 소스 기반의 솔루션을 초기에 도입하는 경우에는 이러한 작업들이 쉽게 여겨질 수 있지만, 상용화하고자 하는 타겟에 최적화하여 향상시키기 위해서는 많은 부가적인 노력이 필요하다.

대표적인 오픈 소스 기반의 DBMS 솔루션으로 다음과 같은 것들이 존재한다.

. MySQL
. PostgreSQL
. SQLite
. BerkeleyDB

MySQL은 빠른 성능과 멀티 쓰레드, 멀티 유저를 지원하는 SQL(Structured Query Language) 데이터베이스 서버 솔루션이다. MySQL은 대용량 데이터 처리 기기 뿐만 아니라 임베디드 기기에도 적용이 가능한 솔루션이며, 듀얼 라이선스 정책을 사용하여 GPL(GNU General Public License) 기반으로 코드가 오픈되어 일반 사용자들도 쉽게 접귺이 가능하다. MySQL은 C와 C++를 사용하여 만들어졌으며, Windows, OpenBSD, Mac OS X, AIX, Solaris 등의 다양한 플랫폼에 적용되어 있다. MySQL이 효과적으로 사용하기 위해서 다음과 같은 조건들을 만족하면 된다. 무엇보다도 쓰레드 라이브러리가 안정적이어야 하고, 파일 시스템의 안전성이 높으면서 성능이 높아야만 한다. 또한 테이블 사이즈와 개수도 영향을 줄 수 있는데, 큰 테이블들을 가지고 있는 파일들의 수가 증가할수록 이에 대한 파일시스템의 처리능력이 낮아질 수 있다. MySQL이 SMP(Symmetric Multi-Processor)을 사용함으로써 성능을 향상시킬 수 있으며, 사용자의 수를 제한함으로써 성능을 극대화할 수도 있다. 이러한 사항들과 더불어 MySQL이 컴파일될 때 해당 플랫폼의 최적화 옵션이 사용되어야만 한다. MySQL은 트랜잭션과 비트랜잭션 저장엔진 모두를 지원하며, 인덱스 압축을 이용한 B-tree 디스크 테이블을 사용한다. 다른 추가 저장엔진의 사용이 용이한 것도 또 다른 장점이다. 그리고, 쓰레드 기반의 메모리 할당 시스템을 사용할 수 있으며, 최적화된 스윕 멀티 조인을 사용하여 빠른 조인을 수행할 수 있다. In-memory Hash 테이블을 사용하고, 최적화된 클래스 라이브러리를 사용함으로서 빠른 SQL 함수를 제공할 수 있다. 고정길이와 가변길이 변수 타입을 지원하며, Group 관련된 함수들을 지원하고, GROUP BY/ORDER BY 젃에 대한 전반적인 지원을 수행한다.

MySQL은 최대 5천만 개의 레코드를 지원하며, 20만 개의 테이블과 50억 개의 행을 지원할 수 있다. 테이블다 64개의 인덱스를 지원할 수 있으며, 각 인덱스는 1부터 16개의 칼럼들로 구성되어 있다. 최대 인덱스 길이는 1000바이트이다. MySQL 서버로 클라이얶트는 TCP/IP를 통해서 접속할 수도 있으며, 만약에 Windows NT 계열의 시스템을 사용하는 경우에는 이름 지정 파이프를 통해서도 접귺이 가능하다.

PostgreSQL는 POSTGRES v4.2에 기반한 ORDBMS(Object Relational DBMS)이다. Windows를 비롯하여 Linux, AIX, BSD, HP-UX, Mac OS X, Solaris 등의 다양한 플랫폼을 지원한다. ACID 특성을 만족하며, 외래 키, 조인, 뷰, 트리거, 저장 프로시저에 대한 지원이 이루어지고 있다. INTEGER, NUMERIC, BOOLEAN, CHAR, VARCHAR, DATE, TIMESTAMP 등의 SQL92와 SQL99 데이터 타입을 만족하고, 그림, 사운드, 비디오를 포함하는 바이너리 형태의 큰 오브젝트들을 지원한다. 또한, PostgreSQL은 즉시 복구, 테이블공간, 비동기 복제, 중첩된 트랜잭션, 온라인 백업을 지원한다. PostgreSQL은 처리 가능한 최대 데이터베이스 크기와 테이블당 최대 행/최대 인덱스의 수에는 제약이 없으며, 최대 테이블 크기는 32TB, 최대 행 크기는 1.6TB, 최대 필드 크기는 1GB를 지원한다. PostgreSQL는 B-tree, R-tree, Hash, GiST(Generalized Search Tree)를 이용한 인덱싱 방법을 지 원한다. GiST 인덱싱은 B-tree, B+-tree, R-tree, 부분합 tree, 랭크된 B+-tree 등을 포함하는 정렬/검색 알고리즘들을 사용할 수 있도록 만들어 놓은 시스템이다.
이 외에도 테이블 상속, 룰 시스템, 데이터베이스 이벤트와 같은 특징들을 포함하고 있다. 테이블 상속은 테이블 생성 시에 베이스 클래스가 되는 다른 테이블로부터 상속받아서 새로운 테이블을 만들 수 있다. 룰 시스템은 데이터베이스 설계자가 새로운 동작을 위한 룰을 생성할 수 있도록 한다. 데이터베이스 이벤트 기능은 LISTEN/NOTIFY 명령어들을 사용하여 클라이얶트들 사이에서 전송되는 메시지와 이벤트들이 지원되는 것을 의미한다. 트리거나 저장 프로시저를 사용할 때 발생하는 이벤트들에 대한 모니터링을 통해서 처리가 테이블의 변경상황을 알 수 있다.
PostgreSQL는 SQL 표준의 많은 부분을 지원하면서, 복합 쿼리, 외래 키, 트리거, 뷰, 트랜잭션 무결성이 지원된다. PostgreSQL는 서버/클라이얶트 모델을 사용하며, 서버 프로세스는 클라이얶트 어플리케이션과 데이터베이스를 연결할 수 있도록 하고, 데이터베이스 파일을 관리한다. 서버/클라이얶트가 서로 다른 호스트에서 존재할 경우에 TCP/IP 연결을 통해서 통신할 수 있다. 서버는 여러 개의 클라이얶트들로부터의 연결을 동시에 수락할 수 있으며, 각 연결을 위해서 새로운 처리 프로세스를 생성한다.
PostgreSQL는 BSD 라이선스를 사용하기 때문에 보다 자유로운 소스코드 관리 및 활용이 이루어질 수 있다.

SQLite는 구글의 안드로이드, 노키아의 Maemo, 애플의 iPhone에 적용된 솔루션이다. 기존의 DBMS가 엔터프라이즈급에서 사용되던 것과는 달리 이는 경량화된 특성을 바탕으로 모바일 기기에 주로 적용되었다. SQLite의 대표적인 특성으로 설정이 필요없다는 것과 서버가 없다는 점이다. SQLite는 설치하는 과정이 필요없으며 셋업하는 과정도 없다. 따라서, 시작, 정지, 설정해야 하는 서버 프로세스도 없다. 별도의 관리자가 이를 관리할 필요가 없기 때문에 사용이 간단한 장점을 가지고 있다. 더군다나, SQLite는 서버/클라이얶트 모델로 동작하는 것이 아니기 때문에 클라이얶트가 서버에 TCP/IP로 접속해서 처리하는 동작이 필요없다. 디스크에 존재하는 데이터베이스 파일을 직접 읽고 쓰기 때문에 별도의 서버동작을 위한 프로세스가 존재하지 않는다. SQLite는 단 하나의 데이터베이스 파일을 사용하기 때문에 관리가 매우 용이하다.
SQLite는 가변 길이 레코드를 지원하며, BLOB, CLOB들을 사용할 수 있도록 한다. 가변 길이 레코드를 지원함으로써 더 작은 데이터베이스 파일을 만들 수 있고, 따라서 더 빠른 동작을 이끌어 낼 수 있다.
SQLite는 온라인 백업 인터페이스를 사용하여 디스크 파일의 컨텎츠를 인-메모리 데이터베이스로 또는 그 반대 방향으로 복사함으로서 핫 백업을 지원한다. 또한 동일한 페이지와 스키마 캐시를 공유하기 위한 2개 이상의 연결을 가능하게 해 준다. 데이터베이스에서 각 페이지와 인덱스 별로 각각의 B-tree가 독립적으로 사용되며, X/Y 좌표에 대한 최소/최대 값을 가지는 공간 시스템을 다루기 위해서는 R-tree를 사용한다. 그렇지만, SQLite는 몇 가지 사항에 대해서 미지원되는 것들이 존재한다. 트리거 중에 일부 특성들이 지원되지 않으며, ALTER TABLE 중 RENAME TABLE, ADD COLUMN은 지원되지 않는다. LEFT OUTER JOIN의 경우에는 지원되지만, RIGHT OUTER JOIN이나 FULL OUTER JOIN은 지원되지 않는다. VIEW는 SQLite에서는 읽기 전용이며, VIEW에서 INSERT, DELETE, UPDATE는 불가능하다.
SQLite는 Public domain이라는 라이선스 정책을 사용하고 있기 때문에 많은 사용자들이 자유롭게 사용할 수 있으며, 코드의 수정이 이루어지더라도 반드시 이를 공개할 필요는 없다. SQLite 솔루션을 지원하기 위한 조직으로서 Hwaci(www.hwaci.com/sw/sqlite)가 있으며, SQLite의 높은 품질의 지원을 받기 위해서는 SQLite 컴소시움에 가입하면 된다. 컨소시움에 가입하기 위해서는 멤버쉽 비용을 내고 따로 관리를 받으면 되며, 심비안, 블룸버그, 어도비, 모질라가 가입되어 있다.

Berkeley DB는 라이브러리 형태로 어플리케이션으로 링크되는 Oracle에서 제공하는 오픈소스 기반의 DBMS이다. Berkeley DB는 서버/클라이얶트 구조를 사용하지 않고, SQL 처리과정을 생략함으로써 성능을 향상시켰으며, 동작 시 처리 실패에 의한 복구 및 데이터 무결성을 보장하기 위한 트랜잭션 기능을 지원한다. 관리자가 별도로 필요하지 않고 각 어플리케이션이 각각의 데이터베이스에 대한 관리 기능을 수행한다.

Berkeley DB는 데이터베이스의 동시 액세스를 지원하기 때문에 멀티 프로세서 시스템에서 멀티쓰레드 또는 멀티프로세스 어플리케이션은 최대의 효과를 얻을 수 있다. 물롞 한 개의 프로세서를 사용하는 시스템의 경우에도 이러한 효과를 얻도록 되어 있다. Berkeley DB는 설계 목적과 데이터 특성에 맞추어서 높은 쓰루풋을 낼 수 있는 시스템을 구성할 수 있는 트랜잭션 기능을 제공한다. Berkeley DB는 최대 4GB의 레코드를 가질 수 있으며, 수 TB 크기의 테이블들을 가질 수 있다. 다수의 사용자가 사용할 때의 충돌을 회피하면서, 성능을 최대화하기 위해서 MVCC(Multi-Version Concurrency Control) 또는 로깅하기 이전에 쓰기 동작을 수행하는 전형적인 방법을 사용할 수 있다.

Oracle의 Berkeley DB는 인프라스트럭쳐 시스템에서도 광범위하게 사용된다. 모바일 게이트웨이, 메시지 서비스를 위한 저장 시스템, 모바일 사업자를 위한 OSS(Operational Support Systems), BSS(Business Support Systems)와 같은 시스템들에 사용될 수 있다. 이와 더불어서 작은 풋-프린트, 높은 안정성, 제로 관리기능 및 손쉬운 적용방법을 토대로 휴대용 모바일 기기에서도 영역을 넓히고 있다. 텍스트, 이메일, 인스턴스 매시지 그리고, 각종 멀티미디어 파일 등을 저장하기 위해서 사용된다.

다양한 오픈 소스 기반의 DBMS 솔루션이 존재하기 때문에 이 중에서 어떠한 솔루션을 선택해서 과제에 적용할 것인가를 결정하는 것이 무엇보다도 중요하다. DBMS를 선택하는 방법으로 다음과 같은 9가지 사항들이 있으므로, 이를 고려하도록 한다.


1. 데이터베이스가 사용자가 원하는 다양한 기능 모두를 지원할 수 있는가?
2. 높은 가격 경쟁력을 가지고 있는가?
3. 시장이 원하는 시점에 시장이 원하는 기능을 포함하는 버전을 제공할 수 있는가?
4. 크로스 플랫폼에 포팅이 가능하며 쉽게 될 수 있는가?
5. 관리자가 용이하게 관리할 수 있는가?
6. 보다 나은 성능을 지원하는가?
7. 안정성이 충분히 보장되는가?
8. 작은 풋-프린트가 지원되는가?
9. 확장이 용이하며, 사용하기 쉽고 편리한가?


가장 최우선적으로 DBMS는 사용자가 원하는 본연의 목적을 달성해야 한다. 많은 어플리케이션이 취급해야 하는 데이터들을 최상의 조건으로 다룰 수 있어야 하며, 가장 빠르게 원하는 데이터를 원할 때 가지고 올 수 있어야만 한다. 물롞 이러한 성능을 지원한다고 해서 가격경쟁력이 없다면 이는 이러한 솔루션을 사용하는 제품에 대한 가격경쟁력을 또한 저하시키므로 고려해야만 한다. DBMS는 시스템에 있어서 데이터를 다루는 기본적인 기반 소프트웨어이다. 따라서, 매우 특정한 목적을 가지는 경우가 아니면, 어느 특정 제품에서만 사용되는 것이 아니라 광범위하게 사용될 수 있다. 따라서, 광범위하게 사용될 수 있기 위해서는 다양한 플랫폼에도 포팅이 쉽게 될 수 있어야만 한다.

이러한 9가지 고려 사항 중에서 모바일 기기에서 특히 더욱 더 큰 중요성을 가지는 것으로서 관리자가 용이하게 관리할 수 있는 지, 작은 풋-프린트가 지원되는 지와 사용하기 쉬운지의 여부이다. 모바일이라는 홖경은 한정된 자원만을 사용할 수 있으며, 여러 가지 자원의 확장이 용이하지 않다. 그렇다는 것은 DBMS가 자원을 충분히 사용하지 못할 수도 있다는 것을 의미하며, 따라서 최소한의 자원만을 사용해서 동작할 수 있어야만 한다는 의미이다. 이렇게 최소한의 자원만을 사용해서 동작하기 위해서는 별도의 관리자를 통한 제어와 다양한 설정방법이 불필요할 수 있다. 이와 같은 특성을 만족시키는 대표적인 오픈 소스 DBMS가 SQLite이다. SQLite는 실제로 Android, iPhone, Maemo와 같은 모바일 플랫폼에서 기본 DBMS로 사용되고 있다.

DBMS는 많은 수의 데이터들을 빠른 시간 안에 처리하고 쉽게 관리하기 위한 것이므로, 이러한 목적이 최우선적으로 고려되어야만 한다. 모바일 기기는 전화번호, 콜 로그, 메시지, 다이어리와 파일 매니저를 비롯한 거의 모든 어플리케이션들을 지원하므로, 이러한 어플리케이션에서 다루는 데이터들의 양이 많아 질수록 DBMS의 성능이 필수 고려사항이 된다. 데이터를 처리하는 방법에 따라서 처리하고자 하는 용량이 증가시의 처리속도가 선형 그래프 형태로 증가할 수 도 있고, 로그 그래프 형태로 증가할 수 도 있다. 따라서, 사용하고자 하는 데이터베이스 솔루션이 데이터처리 방법에 있어서 어떠한 특성을 가지는지 확인한 이후에 이에 맞추어서 사용해야 한다.

또한, 다양한 오픈 소스 기반의 DBMS는 각자 자기만의 인터페이스를 가지고 있다. 따라서 만약에 기존에 이미 다른 DBMS를 사용한 업체에서 오픈 소스 기반의 DBMS를 적용하고자 한다면 기존에 적용되어 있던 인터페이스를 모두 제거하고 다시 새로운 인터페이스를 적용해야 한다. 이러한 포팅 상의 문제점은 DBMS를 새로이 적용할 때 많은 장애가 된다. 이러한 문제점을 해결하기 위해서 다음과 같은 2가지 방법을 적용할 수 있다.

- ODBC 인터페이스의 제공
- 별도의 포팅 계층을 제공


전자의 경우에는 ODBC라는 표준화된 인터페이스에 맞추어서 오픈 소스 기반의 DBMS의 드라이버를 제공함으로서, 사용자는 손쉽게 DBMS를 사용할 수 있다. ODBC 드라이버가 중간 포팅 계층의 역할을 담당하는 것이다. 이미 대부분의 오픈 소스 기반 DBMS는 이를 사용할 수 있도록 준비되어 있다.

후자의 경우에는 각 DBMS가 ODBC 드라이버를 사용할 때 다른 솔루션과 비교하여 성능상의 문제가 존재할 때 자신만의 포팅계층을 구축하는 것이다. 그리고, 그 포팅 계층에서는 다른 DBMS 인터페이스와의 부정합을 완화시켜주는 역할을 담당한다. 이때 성능의 최대 이슈가 될 수 있는 이 포팅 계층의 설계가 매우 중요하다.

오픈 소스기반의 DBMS 솔루션으로 여러가지가 존재하지만, 실제로 모바일 기기가 가지고 있는 특수한 홖경을 만족시킬 수 있는 솔루션은 많지 않다. 각 솔루션의 장단점을 파악하여, 사용하고자 하는 모바일 기기에 맞는 최적의 솔루션을 적용하도록 해야 할 것이다.



참고문헌
1. www.mysql.com
2. www.sqlite.org
3. http://www.postgresql.org/
4. www.oracle.com