System Compleat.

Openstack Swift with keystone on multiple nodes.

Techs


 

( Younjin.jeong@gmail.com, 정윤진)

 

 

I’ll try to explain with this post about how to make swift storage cluster works with keystone service. If you have been worked with this open-source based project, you might get struggled, or suffered to configure because there’re not many information about this brand-new cluster. It’s because not only less information, there’re so many old versions and instructions, which means there’re not many certified working set exists. The Launchpad site is some kind of chaos. If you goolge about it, there’re only questions without right answers, and closed issues without comments. One another cause is that this project is so young, and things get changed very fast. All of those reasons will make you get angry to use this, and you may throw your keyboards during setup this brand-new cluster. The hardest thing is that understanding about how the keystone works, and how it can be plugged into swift-proxy’s middle ware. I’ll do not explain about what the keystone is, and what is the swift is as well. I’ll try to give you the instructions what is the result of my research about it. I also made swift + swauth system before, but it’s not that hard, and the swauth is not welcome in nowadays.

 

One more thing to let you know is, this research is based on multi-node cluster use. All components are installed on physically different server, and it’s network is combined with Arista 10G network with iBGP and eBGP with Quagga. But network is not major issue on this post, so I’ll keep it for next time.


The storage cloud install on multiple nodes went like this. 


1. Install and connect every node physically. Power cord, TwinAx, UTP, etc.

2. Setup the server BIOS and IPMI. 

3. Configure all switches. 

4. Install Ubuntu 12.04 on management server. 

5. Write Chef code for automated install. 

6. Prepare all nodes with PXE boot and network install. 

7. Update each configurations to every node by using chef. 

8. Check its functionalities. 



Quanta servers


 

Working environment as follows :

 

1.    Keystone server which is running with 192.168.1.200

2.    Swift proxy server running with 192.168.1.2/24 for admin, and it has 10G interface for services. I made a simple rule about network expansion, so the 10G network has similar IP structure, such as 10.0.1.2/24. And it also have ipmi network for physical control, such as boot order, power managements, its IP is 192.168.1.102. Every cabinet is designed to use /24 network.

3.    Swift storage servers running with 192.168.1.3 – 10 , also has 10G for 10.0.1.3 – 10.0.1.10

4.    Swift version is 1.6.1, you can get it from openstack github.

5.    Keystone is also available on openstack github.

6.    Each storage server has 12 disks for store, and 2 ssd disks for OS.

7.    Ubuntu version is 12.04 LTS.

8.    Quanta servers were used. ( X22-RQ, X12 series )

9.    Arista 7124SX per cabinet.

10. Cisco 2960 per cabinet.



Bluesnap-XP, RS-232 to Bluetooth

 



Every servers ( a.k.a bare-metals )  are installed by automation tool, chef and pxe boot. I’ve downloaded all packages from github.com, and you can also find the url easily.  To install swift successfully, there’re some python modules are needed. If there are no modules exists, then the python will show you error message and you’ll be get which python modules is needed easily. If you don’t know the exact name of the package, then you can search it by typing “apt-get update ; apt-cache search <string>”.

 

I have installed additional python modules packages as below.

 

 

root@allnew-quanta:/root# apt-get install python-eventlet python-netifaces \ 
python-pastedeploy python-webob openssl libssl-dev \
python-setuptools python-lxml python-libxslt1 python-dev

 

After install the swift, you’ll need to configure storage server, such as xfs file system, mount all of it, and build rings.  This configurations are well documented in swift multiple-node install, so I’ll not describe about it. More important thing is, setup the swift proxy server. As you may know, the proxy server should have keystone middle ware on it. So, you need to install keystone with swift on proxy server.  It also can be easily done with python setup.py install. After install it, you need to setup the proxy-server.conf. Here’s the recommended ( I mean the basic ) configuration for it.

 

[DEFAULT]
cert_file = /etc/swift/cert.crt
key_file = /etc/swift/cert.key
bind_port = 8080
user = swift
log_facility = LOG_LOCAL1
workers = 5

[pipeline:main]
pipeline = catch_errors healthcheck cache authtoken keystone proxy-server

[app:proxy-server]
use = egg:swift#proxy
account_autocreate = true

[filter:keystone]
paste.filter_factory = keystone.middleware.swift_auth:filter_factory
operator_roles = admin, swiftoperator

[filter:authtoken]
paste.filter_factory = keystone.middleware.auth_token:filter_factory

# Delaying the auth decision is required to support token-less
# usage for anonymous referrers ('.r:*') or for tempurl/formpost
# middleware.

delay_auth_decision = 0

auth_port = 35357
auth_protocol = http
auth_host = 192.168.1.200
auth_token = ADMIN
admin_token = ADMIN

[filter:cache]
use = egg:swift#memcache
set log_name = cache

[filter:catch_errors]
use = egg:swift#catch_errors

[filter:healthcheck]
use = egg:swift#healthcheck



 

You may install additional python module needed to run swift proxy. It’s same story. Install the additional packages by referencing error messages.

 

After finish swift cluster, you’ll need to configure keystone server. You may consider high-availability for keystone service. Keystone can be sit on sqlite and mysql both, so you can find some way from goole search.

 

Here’s the keystone.conf configuration which is running with database. As you may know, there’s a way to use static file to setup, but if you want to use a feature, such like sharing, then you’ll need database to manage keystone.

 

[DEFAULT]
# A "shared secret" between keystone and other openstack services
admin_token = ADMIN

# The IP address of the network interface to listen on
bind_host = 0.0.0.0

# The port number which the public service listens on
public_port = 5000

# The port number which the public admin listens on
admin_port = 35357

# The port number which the OpenStack Compute service listens on
# compute_port = 8774

# === Logging Options ===
# Print debugging output
verbose = True

# Print more verbose output
# (includes plaintext request logging, potentially including passwords)
debug = True

# Name of log file to output to. If not set, logging will go to stdout.
log_file = keystone.log

# The directory to keep log files in (will be prepended to --logfile)
log_dir = /var/log/keystone

# Use syslog for logging.
# use_syslog = False

# syslog facility to receive log lines
# syslog_log_facility = LOG_USER

# If this option is specified, the logging configuration file specified is
# used and overrides any other logging options specified. Please see the
# Python logging module documentation for details on logging configuration
# files.
# log_config = logging.conf

# A logging.Formatter log message format string which may use any of the
# available logging.LogRecord attributes.
#log_format = %(asctime)s %(levelname)8s [%(name)s] %(message)s

# Format string for %(asctime)s in log records.
log_date_format = %Y-%m-%d %H:%M:%S

# onready allows you to send a notification when the process is ready to serve
# For example, to have it notify using systemd, one could set shell command:
# onready = systemd-notify --ready
# or a module with notify() method:
onready = keystone.common.systemd

[sql]
# The SQLAlchemy connection string used to connect to the database
#connection = sqlite:////var/lib/keystone/keystone.db
connection = mysql://keystone:XXXXX@localhost/keystone
# the timeout before idle sql connections are reaped
# idle_timeout = 200

[identity]
driver = keystone.identity.backends.sql.Identity

[catalog]
# dynamic, sql-based backend (supports API/CLI-based management commands)
driver = keystone.catalog.backends.sql.Catalog

# static, file-based backend (does *NOT* support any management commands)
#driver = keystone.catalog.backends.templated.TemplatedCatalog

template_file = /etc/keystone/default_catalog.templates 

[token]
driver = keystone.token.backends.kvs.Token

# Amount of time a token should remain valid (in seconds)
expiration = 86400

[policy]
driver = keystone.policy.backends.rules.Policy

[ec2]
# driver = keystone.contrib.ec2.backends.kvs.Ec2

[ssl]
#enable = True
#certfile = /etc/keystone/ssl/certs/keystone.pem
#certfile = /etc/keystone/cert.crt
#keyfile = /etc/keystone/ssl/private/keystonekey.pem
#keyfile = /etc/keystone/cert.key
#ca_certs = /etc/keystone/ssl/certs/ca.pem
#cert_required = True

[signing]
certfile = /etc/keystone/ssl/certs/signing_cert.pem
keyfile = /etc/keystone/ssl/private/signing_key.pem
#ca_certs = /etc/keystone/ssl/certs/ca.pem
#key_size = 1024
#valid_days = 3650
#ca_password = None

[ldap]
# url = ldap://localhost
# user = dc=Manager,dc=example,dc=com
# password = None
# suffix = cn=example,cn=com
# use_dumb_member = False

# user_tree_dn = ou=Users,dc=example,dc=com
# user_objectclass = inetOrgPerson
# user_id_attribute = cn
# user_name_attribute = sn

# tenant_tree_dn = ou=Groups,dc=example,dc=com
# tenant_objectclass = groupOfNames
# tenant_id_attribute = cn
# tenant_member_attribute = member
# tenant_name_attribute = ou

# role_tree_dn = ou=Roles,dc=example,dc=com
# role_objectclass = organizationalRole
# role_id_attribute = cn
# role_member_attribute = roleOccupant

[filter:debug]
paste.filter_factory = keystone.common.wsgi:Debug.factory

[filter:token_auth]
paste.filter_factory = keystone.middleware:TokenAuthMiddleware.factory

[filter:admin_token_auth]
paste.filter_factory = keystone.middleware:AdminTokenAuthMiddleware.factory

[filter:xml_body]
paste.filter_factory = keystone.middleware:XmlBodyMiddleware.factory

[filter:json_body]
paste.filter_factory = keystone.middleware:JsonBodyMiddleware.factory

[filter:user_crud_extension]
paste.filter_factory = keystone.contrib.user_crud:CrudExtension.factory

[filter:crud_extension]
paste.filter_factory = keystone.contrib.admin_crud:CrudExtension.factory

[filter:ec2_extension]
paste.filter_factory = keystone.contrib.ec2:Ec2Extension.factory

[filter:s3_extension]
paste.filter_factory = keystone.contrib.s3:S3Extension.factory

[filter:url_normalize]
paste.filter_factory = keystone.middleware:NormalizingFilter.factory

[filter:stats_monitoring]
paste.filter_factory = keystone.contrib.stats:StatsMiddleware.factory

[filter:stats_reporting]
paste.filter_factory = keystone.contrib.stats:StatsExtension.factory

[app:public_service]
paste.app_factory = keystone.service:public_app_factory

[app:admin_service]
paste.app_factory = keystone.service:admin_app_factory

[pipeline:public_api]
pipeline = stats_monitoring url_normalize token_auth admin_token_auth xml_body json_body debug ec2_extension user_crud_extension public_service

[pipeline:admin_api]
pipeline = stats_monitoring url_normalize token_auth admin_token_auth xml_body json_body debug stats_reporting ec2_extension s3_extension crud_extension admin_service

[app:public_version_service]
paste.app_factory = keystone.service:public_version_app_factory

[app:admin_version_service]
paste.app_factory = keystone.service:admin_version_app_factory

[pipeline:public_version_api]
pipeline = stats_monitoring url_normalize xml_body public_version_service

[pipeline:admin_version_api]
pipeline = stats_monitoring url_normalize xml_body admin_version_service

[composite:main]
use = egg:Paste#urlmap
/v2.0 = public_api
/ = public_version_api

[composite:admin]
use = egg:Paste#urlmap
/v2.0 = admin_api
/ = admin_version_api

 

 

Now, you can start keystone service by using keystone-all. If you need service management for keystone, then you can make some script for chkconfig.  There are good documents already exists.

 

Oh, before you start your keystone service with mysql, you need to configure mysql service. Create database and user, then give some proper privileges to it. You can see the database connection string in above configuration.

 

Before you setup the keystone, you may need to understand about how the tenant/user/role/key work with account/user/key in swift. If you already experienced how to use swift api, then you know the credential goes like account:user and key pair. The tenant matches with account, and user is user.

 

Here’s the instructions about how to setup the keystone, and please remember that our proxy-server.conf has allowed the role “admin” and “swiftoperators”, and the keystone.conf has default admin key, which is “ADMIN”.

 

 

First of all, install the python-keystoneclient for your setup system. There’re no mac version. Install it on your keystone server. Openstack keystone package does not contain the “keystone” tool, so you’ll need it if you didn’t install keystone with apt-get.

 

a. Create a tenant.

 

root@allnew-quanta: ~# keystone --username admin --token ADMIN --endpoint http://192.168.1.200:35357/v2.0 tenant-create --name=service 

 

Note that the “endpoint” assigned in command line. You can specify it as OS environment variable.

 

 

b. Then, create an user. Type “keystone –token ADMIN –endpint YOURENDPOINT tenant-list” to see the ID.

 

root@allnew-quanta: ~#  keystone --token ADMIN --endpoint http://192.168.1.200:35357/v2.0 user-create --name=swift --pass=swiftadmin --tenant_id=ID

 

 

c. Create services. Keystone is usually assigned as identity service, and Swift is object-store.

 

root@allnew-quanta: ~# keystone --token ADMIN --endpoint http://192.168.1.200:35357/v2.0 service-create --name=swift --type=object-store --description="Swift Service"

root@allnew-quanta: ~# keystone --token ADMIN --endpoint http://192.168.1.200:35357/v2.0 service-create --name=keystone --type=identity --description="Keystone Identity Service"

 

 

d. Attach the service with endpoint.

 

root@allnew-quanta: ~#  keystone --token ADMIN --endpoint http://172.17.17.76:35357/v2.0 endpoint-create --region RegionOne --service_id=SWIFT_SERVICE_GUID --publicurl 'https://192.168.1.2:8080/v1/AUTH_%(tenant_id)s' --adminurl 'https://192.168.1.2:8080/' --internalurl ' https://192.168.1.2:8080/v1/AUTH_%(tenant_id)s'

root@allnew-quanta: ~#  keystone --token ADMIN --endpoint http://192.168.1.200:35357/v2.0 endpoint-create --region RegionOne --service_id=KEYSTONE_SERVICE_GUID  --publicurl 'http://192.168.1.200:5000/v2.0' --adminurl 'http://192.168.1.200:35357/v2.0' --internalurl 'http://192.168.1.200:5000/v2.0'

 

 

e. Crete roles.

 

root@allnew-quanta: ~#  keystone --token ADMIN --endpoint http://192.168.1.200:35357/v2.0 role-create --name=admin 

root@allnew-quanta: ~#  keystone --token ADMIN --endpoint http://192.168.1.200:35357/v2.0 role-create --name=swiftoperator

 

 

 

f. Attach users to a role.

 

root@allnew-quanta: ~#  keystone --token ADMIN --endpoint http://192.168.1.200:35357/v2.0 user-role-add --tenant_id=TENANT_ID --user=USER_ID --role=ROLE_ID

 

 

 

With swift tool  ( the swift python client tool ), you can check it’s work or not. If it works fine, then you can see the results as below.

 

root@allnew-quanta:/etc/keystone# swift -V 2 -A http://192.168.1.200:35357/v2.0 -U service:swift -K swiftadmin stat

Account: AUTH_6049fcdd4c3a46909a9dbaad04f1636a

Containers: 0 Objects: 0 Bytes: 0 Accept-Ranges: bytes X-Timestamp: 1345122033.16266 X-Trans-Id: tx166227c25e604e4db4c5bdc9039041a4

 

This means, now you can do CRUD to swift storage cluster with swift tool.

 

root@allnew-quanta: ~#  swift -V 2 -A http://192.168.1.200:35357/v2.0 -U service:swift -K swiftadmin upload test keystone.conf
keystone.conf

root@allnew-quanta: ~# swift -V 2 -A http://192.168.1.200:35357/v2.0 -U service:swift -K swiftadmin list
test

 

Basically, the keystone controls authentications for users. More than that, it can be used to control container sharing by using tenants. Currently, I’m focusing on how to implement it as an enterprise service and how it can be installed with Chef. So, will not explain about it more.

 

As I mentioned at top of this post, install swift and keystone on multiple nodes is not simple work for now. I have no doubt that there will be good methods to install this clusters will come out later by many contributors. But for now, well until now, it was not an easy work to do. And its why I wrote this post at this moment.

 

If you’re a web developer, you may interested in how to implement it with Keystone and Swift API for your applications. There’s good explains about how to do this with curl. To understand its action more, then visit this blog.

 

http://blog.chmouel.com/2011/11/24/swift-and-keystone-middleware-part1/

 

Since the cluster works, you can test many things about to running cloud storage and S3 like infrastructure. And that’s exactly what I’m working for.

 

Hope you’ll have successfully working set of private storage cloud on your own.

 


( Younjin.jeong@gmail.com, 정윤진

Github with Xcode4

Techs

( younjin.jeong@gmail.com, 정윤진 )


인프라 기술자가 Xcode 를 사용한다는 것은 사실 엄청나게 흔한 일은 아니라고 생각한다. 나 역시도 맥북을 구매한지 벌써 2년이 넘어가지만, brew 를 사용한 맥용 패키지 관리에 필요하다는 이유로 Xcode 를 설치만 해 두고 있었다. 우분투라면 build-essential 패키지면 될 것을 어마어마한 덩치를 자랑하는 Xcode 를 왜 굳이 컴파일러와 분리해 두지 않았나 하는 생각이었달까. 


하지만 언제나 어플리케이션 디렉토리 한 구석에 자리잡은 망치는 vi 와 터미널이 슬슬 버거워 지는 '자동화 코드' 를 쓰기 시작하면서 점점 흥미를 일으켜 왔다. 뭐 물론 훨씬 가볍고 좋은 도구들이 많지만, 가끔씩 구동해서 텍스트를 넣어 보면 그 예쁘디 예쁜 syntax highlighting 이라던가, 자동 완성 등의 팬시한 모습이 '언젠간 쓰고 말꺼야' 하는 마음을 가지게 만들었다. 역시, 애플의 가장 큰 매력의 원천은 디자인으로 인한 호기심 유발, 그리고 사용해 보니 단순히 예쁜것이 아니라 기능도 좋다 라는 믿음이 발생하게끔 제품을 만드는 것이 아닌가 싶다. 



그대는 너무 아름답소



아무튼 최근의 대부분의 오픈소스 프로젝트들이 sourceforge 에서 github 로 옮겨 가면서, 이제 github 는 개발자건 관리자에게건 아주 중요한 업무의 장이 되어가고 있다. 우리 회사의 경우에도 github 에 private 계정을 만들어 사용중인데, 사내에 서버를 두고 별도로 관리 하는 것 보다 훨씬 낫다. 더군다나 웹 Front-end, Back-end 와 인프라 기술자가 각각 관장하는 코드를 하나의 저장소에서 작업하기 때문에, 또 나중에 장사 안되는 프로토타입은 open source 로 전향 할 가능성이 많기 때문에, 이 github 의 사용성은 우리에게는 축복이다. 


하여, Xcode 4 와 github 를 좀 같이 사용하면 참 좋겠다 싶은 생각에 그동안 미뤄왔던 Xcode 삽질을 오늘 시작 해 보았는데, 이 좋은 도구를 사용함에 있어 말도 안되는 부분에서 난관에 봉착하여 포스팅을 해 볼 까 한다. 그 난관이란 다름아닌 바로, 


"Xcode 의 Project 와 github 에서 받아온 repository 가 연동이 안된다." 


는 초딩스러운 문제다. 그렇다. 웃겨도 할 수 없다. 

대충 설명 하자면, 난관의 순서는 다음과 같았다. 


1. XCode 의 프로젝트는 반드시 신규 생성만 되며, 신규 생성할 때 "꼭" 디렉토리를 생성한다. 

2. XCode 에서 신규 프로젝트를 생성 할 때에는 기본으로 로컬 repository 를 생성한다. 

3. 따라서, 기존에 git clone 으로 받아온 working repository 를 직접 Xcode 에 추가 하려면 /PATH/TO/REPO/${PROJECT_NAME} 과 같은 거지 같은 형태가 된다. 

4. 해서 프로젝트를 먼저 생성 한 후에 .git 디렉토리를 init 시도를 해 보아도 연동이 되지 않았다. 



아무리 개발자가 아니라도 내 시스템 통밥이 몇년인데 이런거로 헤메자니 자괴감 마저 들었다는... 

일단 본인이 해결 한 방법은 다음과 같다. 



1. 원하는 디렉토리에 먼저 Xcode 로 File -> New -> Project 로 프로젝트를 생성한다. 본인의 경우 Xcode 에서 제공하는 컴파일러 및 라이브러리를 사용하지 않기 때문에 Empty 프로젝트를 선택 했다. 



음.. 이런 스크린샷까지 찍어버리다니!




2. Next 를 누르면, Project 이름을 묻는다. 아무리 테스트라도 나쁜 단어로 지지 하지 말자. 





3. 다음을 누르면 프로젝트가 사용 할 디렉토리를 선택하라고 한다. 



여기서 주의 할 것은, "Create local git repository for this project" 버튼의 체크를 해제 해야 한다는 것이다. 

이게 은근히 불편한 것이, Xcode 를 무시하고 터미널 작업과 같은 CLI 에 의존하는 경우 낭패를 보는 경우가 있다. 하지만 더 웃긴건, 어떤 부분에서는 CLI 로 처리를 해 주어야만 동작한다는 것. 



4. Create 버튼을 누르면 프로젝트는 생성이 완료된다. 해당 디렉토리로 가 보면, Xcode 에서 관리를 위한 무언가 디렉토리를 하나 생성해 두었다. 아마도 프로젝트 이름.xcodeproj 라는 이름의 디렉토리 일 것이다. 


기존에 있는 git repository 를 clone 해서 디렉토리를 사용 할 수 없기 때문에, git remote add origin 을 사용하여 코드를 가져온다. git 에 대해서는 별도의 설명은 하지 않는다. 한가지 더, 맥에서 git 를 설치하는 방법은 다루지 않는다. 궁금하신 분은 os x brew 로 구글링. 


Younjins-MacBook-Pro:Velox younjinjeong$ pwd
/Users/younjinjeong/Xcode/Velox
Younjins-MacBook-Pro:Velox younjinjeong$ git init 
Initialized empty Git repository in /Users/younjinjeong/Xcode/Velox/.git/
Younjins-MacBook-Pro:Velox younjinjeong$ git remote add origin https://github.com/XXXXXXXXXX/velox.git
Younjins-MacBook-Pro:Velox younjinjeong$ git pull 
remote: Counting objects: 251, done.
remote: Compressing objects: 100% (208/208), done.
remote: Total 251 (delta 38), reused 237 (delta 24)
Receiving objects: 100% (251/251), 622.49 KiB | 116 KiB/s, done.
Resolving deltas: 100% (38/38), done.
From https://github.com/XXXXXXXXXX/velox
 * [new branch]      master     -> origin/master
You asked me to pull without telling me which branch you
want to merge with, and 'branch.master.merge' in
your configuration file does not tell me, either. Please
specify which branch you want to use on the command line and
try again (e.g. 'git pull  ').
See git-pull(1) for details.

If you often merge with the same branch, you may want to
use something like the following in your configuration file:
    [branch "master"]
    remote = 
    merge = 

    [remote ""]
    url = 
    fetch = 

See git-config(1) for details.
Younjins-MacBook-Pro:Velox younjinjeong$ git branch -a 
  remotes/origin/master
Younjins-MacBook-Pro:Velox younjinjeong$ git checkout master 
Branch master set up to track remote branch master from origin.
Already on 'master'
Younjins-MacBook-Pro:Velox younjinjeong$ git branch -a 
* master
  remotes/origin/master
  remotes/origin/velox-Railway
Younjins-MacBook-Pro:Velox younjinjeong$ ls 
Velox.xcodeproj	app.js		dropbox.js	models		package.json	public		services	swauth		swift		views
Younjins-MacBook-Pro:Velox younjinjeong$ git pull 
Already up-to-date.


5. .gitignore 파일에 Xcode 에서 생성한 디렉토리를 추가한다. 


Younjins-MacBook-Pro:Velox younjinjeong$ echo "Velox.xcodeproj/*" >> .gitignore 




6. 이상 없이 모든게 완료 되었다면, 이제 다시 Xcode 로 돌아온다. Shift-CMD-2 를 누르면 Organizer 가 나타나는데, Repository Tab 에서 방금 작업한 디렉토리의 경로로 Repository 를 추가 해 준다. 



Type 이 Subversion 으로 걸리는 경우도 있는데, git repo 가 확실 하다면 git 로 선택 해 준다. 



7. Repository 의 추가가 완료 되면, 다음과 같은 화면을 볼 수 있다. Xcode 에서 Repository 를 체크하는 동안은 노랑색 아이콘이 표시되며, 확인이 완료되면 녹색으로 변경된다. 계속 주황색으로 머물러 있다면 경로나 github 의 계정을 체크 해 보도록 한다. 한가지 더, 간혹 Xcode 에서 github 사이트의 인증서가 확인이 안된다며 징징대는 경우가 있는데, 이때는 Certificate 버튼을 누르면 이 사이트는 항상 신뢰 와 비슷한 의미의 버튼을 찾아 볼 수 있다. 이 체크버튼을 활성화 하면 귀찮게 하지 않는다. 


일반적으로 github 를 커맨드 라인에서 사용할 때는 맥에 git 에 사용할 key chain 을 연동 할 수 있는데, 이는 매번 패스워드를 입력 할 필요가 없으므로 매우 유용하다. 단, key chain 에 시스템 부팅 후 처음 access 할 때에는 시스템의 패스워드를 묻는다. 






8. 이제 프로젝트 메인 화면으로 돌아오면, 처음 프로젝트를 생성 했을때와 마찬가지로 아무것도 보이지 않는다. 사실 일반적인 사용성을 가진다면 프로젝트의 디렉토리 정보를 가져다가 파일 및 디렉토리등으로 이루어진 코드들이 계층형으로 보여야 할 것 같은데, 아무것도 안보인다. 왼쪽 아래의 + 버튼을 이용하여 파일 및 디렉토리 추가를 선택하고, repository 내의 필요한 파일과 디렉토리를 모두 선택하여 추가 하도록 하자. 



하위의 디렉토리와 파일을 선택하여 모두 추가 하게 되면, 왼쪽의 프로젝트 브라우저에 계층형 구조로 추가된 디렉토리들이 리스팅된다. 이제 파일 중 하나를 살짝 변경하고 File -> Repository -> 탭으로 이동하면, 뭔가 Commit, Add, Push, Pull 과 같은 동작이 되어야 할 것 같은데, 아무것도 발생하지 않는다. 


만약 버튼이 활성화 되어 눌러보더라도, 다음과 같은 메세지가 발생한다. 



초저녁부터 자자는 얘기여 뭐여 - 타짜 광열씨 -



이것때문에 무던한 삽질을 했더랬다. 대체 왜 안되는지 모를 일이었다. 


결론은, Xcode 버그란다...


Xcode 한번 껐다 켜면 된단다.... 


윈도우냐... 



이 해법을 접하고 나서 살짝 멘붕이 올 뻔 했다. 하지만 역시 모든게 올바르게 동작하는 Xcode 는 세살배기 웃음마냥 사람 흐뭇하게 만드는 뭔가가 있다. 



이 화면은 commit 을 진행하면 나타나는데, 프로젝트 단위로 commit 이 필요한 파일의 목록을 보여준다. M 은 수정됨 의 의미이며, 신규 추가되는 경우에는 A 로 나타난다. 가운데의 코드는 당연히 diff 의 내용을 표시해 주는 것이며, 아래에는 commit 에 적용 될 메세지를 쓰는 부분이다. 


커밋하고 보면 Xcode 에서 이슈 관리 부분이 있는 것 같은데, Target 과 이슈 등을 적절히 사용하면 별다른 도구가 필요 없을 정도로 편리 할 것 같다. 


다 해 놓고 보니 별것도 아닌걸 가지고 한참을 헤멨다. 이영도님이 그랬던가. 혼돈의 신 헬카네스는 열쇠를 항상 가까운 곳에 숨겨둔다며... 


사실 그냥 몇 문장으로 그랬다 저랬다 해도 되는 내용이긴 하지만, 웬지 몇시간이나 날려버린게 서운해서 뻘포스팅 해 봤..;;; 


아참, 사용한 Xcode 버전은 4.4.1, 2012년 8월 7일 업데이트 버전인듯. 

이번 주말 및 다음주 초는 개 달려야지... 



덧1. 

왼쪽의 파일 브라우저와 같이 보이는 구조에서 실제 파일을 만들거나 하지 말아야 한다. 신규 생성하는 파일이 있다면 터미널에서 작업 해 주는 것이 안전하다. 이유인 즉슨, 실제 파일 및 디렉토리를 관리 하는 것이 아니라 논리적인 일종의 메타 브라우저인 것 같다. 이것때문에 또 한번 낭패를 볼 뻔. 


덧2. 

.gitignore 를 잘 설정 하지 않으면 엄한 파일들이 올라가므로 주의 할 것. 


( younjin.jeong@gmail.com, 정윤진 ) 


Notes for FPV, and tracking systems for RC

Hobbies

( younjin.jeong@gmail.com, 정윤진 ) 


어릴때 부터 비행기에 관심이 참 많았는데 이제는 저렴한 가격에 위험하지도 않은 방법으로 비행을 즐길 수 있는 방법이 있어 소개 겸 정리용으로 포스팅 고고. 




이렇게 저렇게 회사 시스템 준비 하면서 짬나는 시간에 많이 알아 봤는데, 다음과 같은 것들이 필요 할 듯. 
일단 목적은, 

1. UAV ( Unmanned Aerial Vehicle ) Style, FPV ( First Person View ),  Predator 의 스케일 모델 정도로 생각. ( Wing span, 2~5m ) 
2. 조종 시스템은 기존의 RC 용 조종기가 아닌, PC 용 시뮬레이터를 사용하는 걸로. 
3. Arduino / ArduPilot 을 사용, 필요한 경우 보다 좋은 상용 시스템 ( ex. 비행 안정 장치 )을 추가 
4. 모터 베이스 
5. 오토 파일럿 가능 할 것 
6. OSD
7. 10Km 이상의 장거리 지원 
8. 통신 방법 다중화 ( Radio Control, WiFi, etc. ) 
9. Instrumental Landing System 구현 ( Ground 장치 / 비행 장치 ) 
10. 가능한 경우 Solar Panel 을 사용, 체공 시간 장기화 
11. 가능한 경우 하단에 카메라 시스템을 장착. HD급 CCTV 또는 Go-Pro 카메라  
12. Head Mount Vision 
13. 각종 데이터 수집 및 컨트롤을 위해 비글보드 / Raspberry PI 사용 가능성 있음 


관련해서 찾아 본 자료들은 

1. 비행체. 일단은 기성품을 사용해 보는 것으로, 향후 경험을 바탕으로 발사등으로 제작 

Image from: http://www.nitroplanes.com/projet-drone-2500mm-kit.html


2. ArduPlane Google project. 각종 기본 시스템 구성이 가능. 또한, 코드를 원하는 대로 수정이 가능하기 때문에 원하는 기능을 추가 하거나, 필요한 경우 Arduino 보드를 추가하여 원하는 목적 달성. FLIR 및 각종 데이터 수집 목적용으로 강한 프로세싱 파워와 보다 빠른 서보 동작이 필요한 경우 시스템 업그레이드 및 별도의 코드 추가. 


http://code.google.com/p/ardupilot-mega/wiki/Introduction



3. 조이스틱을 사용한 조종 시스템 


http://www.ianjohnston.com/content/index.php?option=com_content&view=article&id=32:project-rc-joystick-tx&catid=3:hobbies&Itemid=8


하지만 나는 Throttle / Stick 이 별도인 HOTAS 를 사용해서 만들어 보고 싶음. Thrustmaster 의 Cougar 가 좋을듯. 






4. 오토 파일럿 및 향상된 자세 안정 장치 


바람이나 디테일 하지 못한 출력 컨트롤로 인해 발생하는 진동 및 자세의 변화 폭을 줄이기 위해 자세 제어장치를 사용하는데, 이 동작이 충분히 빠르지 못한 경우 불안정한 비행을 하게 됨. 좀 찾아 보니 이런 기성품이 있는데, ArduPilot 으로 충분치 않은 경우 한번 사용해 보면 좋을 듯. 


http://www.eagletreesystems.com/Guardian/index.htm




연동해서 사용 할 수 있는지는 알아봐야 함. 



5. OSD / FPV. 비행중인 비행체에 인스톨된 카메라로 부터 받아온 영상 정보에 고도, 방위, 속도 및 FPM ( Flight Path Maker, 기체의 실제 진행 방향을 표시. 기체의 머리가 향하는 방향을 표시하게 되면 AOA 등의 정보를 알 수 있음 ) 등을 실시간으로 시현해 주는 장치. ArduPilot 프로젝트에 이미 구현 방법이 있음. 원하는 경우 별도의 칩을 사용하는 것도 가능 한 듯. 



image from: http://www.fpvflying.com/categories/FPV-OSD-for-rc-airplane/


http://code.google.com/p/ardupilot-mega/wiki/OSD



이건 좀 다른 이야기지만, 차량에 전방 카메라를 설치 하려는 경우에도 비슷한 시스템으로 구현이 가능 할 듯. 



6. 별도의 카메라 마운트 시스템. 군사 목적용이라면 줌도 되고 안정성도 높고 별도로 실시간으로 전송 되는 영상과 이미지도 처리가 가능해야 하지만, 그러면 어딘가에 잡혀 갈 수 있으므로 그냥 항공 사진 정도의 느낌으로만 찍을 수 있으면 좋을 듯. 근데 이것도 움직이는 물체에서 고정적이고도 안정된 앵글을 제공해야 하므로, 자이로 기반의 카메라 마운트가 필요하다. 쉽게 말하면 손떨림 기능 보정이 필요 하다 뭐 그런 말. 


방송용의 퀄리티를 위해서는 5D Mark iI 정도는 달려 줘야 할 듯 하지만, 일단 그나마 저렴한 시스템 중에는 이런게 있다. 

http://www.dji-innovations.com/products/zenmuse-z15/overview/




카메라의 흔들림을 방지하는 자이로 기반 서보 시스템과, Panning / Rotate / Tilting 을 모두 지원한다. 만약 설정된 지점에 Lock 을 구현 할 수 있다면 더 좋을 듯. 하지만 그건 따로 만들어 줘야 하지 않나 싶음. 저렴하다고는 하지만 디게 저렴하지는 않음. 나름 프로 방송용 장비라는데. 




위의 영상은 이 장비를 사용한 영상과 어떻게 동작하는지 나타난 영상. 성현이가 필요한게 아닐까 싶다는. 

저 영상에 나오는 멀티콥터는 모터 하나가 손바닥 만한거에, 샤시와 날개가 카본으로 되어있는 제품으로 RC로 접근하면 아주 많이 비쌈. 하지만 방송장비 금액 기준으로 접근하면 매우 저렴하지 않나 싶은. 국내에 판매처가 있음. 


http://www.helsel.co.kr/front/php/product.php?product_no=21624&main_cate_no=1&display_group=2



7. 장거리 컨트롤. 


http://www.rcgroups.com/forums/showthread.php?t=799087


11Km 에서 심지어 180Km 까지 가능한 장치를 찾아 볼 수 있다. 시스템 구성에 대한 자세한 내용은 페이지를 참조. 




코딩까지 해서 아주 재미지게 즐길만한 퀄리티로 나오려면 몇년 걸리지 않겠나 싶다. 당장이라도 날리고 싶다면 준비된 기성 제품도 많고, 가격도 저렴하기 때문에 RC에 대한 지식이 있는 분이라면 쉽게 즐길 수 있지 않겠나. 


https://store.diydrones.com


이 사이트에서는 ArduPilot 관련된 제품을 많이 취급하고 있으므로 관심 있다면 시작해 보는 것도. 


AR. Drone 이 요새 한창 인기인데다가, 준호형 마저 하나를 질러 버렸는데 나는 웬지 멀티콥터는 좀 안땡김. ㅋ 배터리도 조루고. 



급한 일들 좀 정리되서 슬슬 구매 시작하면 또 포스팅 해 봐야 겠음. 




( younjin.jeong@gmail.com, 정윤진 ) 




 

 







Netduino, the great toy for .NET developers

Techs

( younjin.jeong@gmail.com, 정윤진 ) 


블로그에 Beagle Bone 을 소개하고 아는 사람은 다 아는 Arduino 를 포스팅 한 지도 벌써 몇 개월이 흘렀다. Beagle Bone 두세트와 7" LCD, 그리고 Beagle board C4 가 프로젝트에 밀려 사무실 구석에서 홀대를 받고 있다. 조만간 이뻐해 줘야 하는데... 


프로젝트와 관련하여 이것 저것 찾아보다가 문득 다음의 제품을 발견 했다. 

http://artrobot.co.kr/front/php/product.php?product_no=545&main_cate_no=4&display_group=1


오호라~ 하면서 조금 더 찾아 보니

http://netduino.com/


이를테면 닷넷 프로그래머가 아두이노를 쓸 수 있도록 만든 보드가 된다. 


아두이노를 아는 사람이라면 모두 알겠지만, 닷넷 키워드 검색을 통해 이 블로그가 얻어 걸린 분들에게는 다소 생소 할 수도 있는 이 장치의 사용에 대해 말해 보자면, 


1. 각종 이런 저런 일을 하는 무지하게 많은 종류의 센서 ( 입력 ) 

2. .NET Micro framework 를 사용하여 신나게 C# 으로 뭔가 로직 코딩 

3. 코딩의 결과를 다시 이런 저런 일을 하는 무지하게 많은 종류의 액츄에이터나 모터와 연결 ( 출력 )



간단한 장난감으로는 


1. 무인 RC 자동차, 헬리콥터, 비행기 

2. 마이크로 마우스 

3. 짝퉁 달 탐사 로봇 


을 만들 수 있다. 



맨날 LED 사다가 깜빡이 만들어 보고 아 지겹다 해서 접지 말고, 재미를 붙였다면 


http://artrobot.co.kr/front/php/product.php?product_no=522&main_cate_no=4&display_group=1

이런 비슷한 프로젝트를 달려도 얻는게 많을 듯. 


아니면, 

http://artrobot.co.kr/front/php/product.php?product_no=41&main_cate_no=48&display_group=1

http://artrobot.co.kr/front/php/product.php?product_no=578&main_cate_no=48&display_group=1


Arduino + Android 조합도 꽤 많이 있으므로, Netduino 도로 충분히 가능 할 듯. 


나는 닷넷 개발자는 아니지만 C 가 아닌 다른 언어의 개발자가 이런 재미진 임베디드를 할 수 있다는 사실은 즐거운 일이지 않은가. 



어릴때 딱딱한 성적표 만들기 이런 거로 프로그래밍 하다가 질린적이 한두번이 아닌데, 이런 장난감이 그 시절 있었다면 지금쯤 난 아마도 우주선을 만들고 있지 않을까. 여러모로 좋은 시절인 것 같다. 







이건 FPV ( First Person View ) 영상.  영상을 보면 알겠지만, 기존의 RC 처럼 날리는 것이 아니라, 안경과 같은 고글에 나오는 실시간 비디오 이미지를 보고 ArduCopter 를 날리는 모습이다. 



이런 개인 시점화 된 FPV 를 날리는 것이 가능한 것은, 바로 이 장비로 가능한 것. 



Fat Shark RCV922 Aviator Edition Full FPV KIT- 2010


조종사의 느낌으로 비행이 가능 하도록 지원 해 주는 것. 당연히 FPV 에는 카메라 장치와, 이미지 전송을 위한 장치가 필요하다. 관심이 있다면 여기서 원큐에 구매하는 것도 가능. 구글링 해 보면 판매 하는 사이트가 더 많은 것 같기도. 


http://fpvsystems.com/index.php?main_page=product_info&cPath=5&products_id=5



최근 여러가지 방송에서는 RC 에 카메라를 붙여서 영상 이미지를 얻는데 사용하는 경우가 많아지고 있다. 하지만 이렇게 얻어진 영상의 경우 대체적으로 RC 가 만들어 내는 미세한 진동 때문에 보기 불편한 경우가 있는데, 이럴때는 자이로를 이용한 Stabilizer 를 사용한 마운트로 카메라를 고정 시키는 방법도 있다. 아무튼, 여기에 5D Mark II 를 붙이면 어떻게 될까 






여기서 이제 카메라를 조금 더 오버 스펙으로 가 보자면, 

http://www.alibaba.com/product-gs/524756128/UAV_electro_optics_search_system.html


이런걸 붙이게 된다는.... 


하지만 저만한 하중을 견디려면 더 큰 사이즈의 비행체가 필요하게 된다. 이제 단순 방송 장비의 규모를 벗어나게 되면, 


1. 조종 시스템과 관찰 시스템의 분리 

2. 킬로미터 단위의 low latency radio control 

3. 킬로미터 단위로 비행 해야 할 만큼의 Long range flight 


뭐 대충 이런 요구 조건을 충족하다 보면 군사용 UAV 가 된다. 이를 테면, 

http://www.fas.org/spp/military/docops/defense/actd_mp/MAE.htm



image from: http://www.dfrc.nasa.gov/Gallery/Photo/Altair_PredatorB/HTML/ED06-0208-1.html 



해성이가 발사나무로 RC 비행기 잘 만드는데, 재미로라도 UAV 만들어 보고 싶다. 뭐 언제나 그렇지만 돈이 문제지 +ㅁ+ 

netduino 설명인데 덧이 너무 많이 붙어 버렸네. 


뭔가 날라다니는건 언제나 추락 할 위험이 있다. 그런게 싫다면, 이런거도 좋지 않을까. 



image from: http://en.wikipedia.org/wiki/File:NASA_Mars_Rover.jpg


뻘글이 넘 길어졌다. 암튼 일단 질러야 할듯. 


( younjin.jeong@gmail.com, 정윤진 ) 



Silicon Valley 에 대한 감상..

Techs

( younjin.jeong@gmail.com , 정윤진 ) 


요 몇년 새에 참 많은 업체와 사람들, 그리고 솔루션을 만났더랬다. 물론 아주 좋은 업체도 있었고, 당시에는 좋은 것 같았는데 지나고 보니 안그랬던 것 같은 업체도 많았던 듯. 한가지 강하게 느끼는 것은, 내가 뭔가를 생각해서 검색해 보면 항상 누군가는 이미 만들어 놓고 입을 벌리고 있다는 사실이다. 세상은 그렇게 부지런하기만 한데, 대체 나는 무엇을 하고 있나. 


작년에는 Cloud.com 이 Citrix 에 인수 되더니, 올해는 Nicira 가 VMware 에 인수 되어 버렸다. 게다가 Nicira 의 인수 금액은 1.5 billion 에 달하는 엄청난 돈이어서, Network virtualization 이 가지고 있는 어마어마한 가능성을 보여주지 않았나 싶다. 수형형이 언제나 이야기 했던 대로, 비슷한거 했던데는 많지만 제대로 하는데가 없었는데. 작년 KT 에서 테스트 해 보고자 했을 때만 해도 그다지 좋은 분위기의 업체라고는 생각하지 못했는데, 이렇게 떼돈 버는거 보니 참 인생 한순간이구나 싶은 생각이 들기도. 


http://www.enterprisenetworkingplanet.com/netsysm/vmware.html

http://nicira.com/


오늘 이순간에도 내가 알고 있는 회사들 중의 한군데는 내일 모레 몇천억에 팔릴지도 모른다는 생각을 하게 된다. 누구나 말할 수 있는, 남들과 엇비슷한거 만들어 봐야 어쩌구 하는 이야기 따위, 같이 메일 주고 받고 갈구던 애가 어느날 백만장자가 되어 "잘 지내냐" 하고 물어오는 걸 들어 보지 않으면 모를 일이다. 


Processing / Storage / Connectivity 3개 기본 요소 중 2개는 결판이 났네. 이제 다음은 어딘가에서 하고 있는 Elastic Storage 인가.. 아니면 어거지로 Elastic Security 하나 끼위 넣어야 하나. 


Nicira 의 소식에는 박수를!  잘하고 선두면 좋은 가격에 인수 되야 하는것이 인지상정.



투자 할 돈 따위 없으니 뭐라도 만들어야지... 

뭐라도 되겠지 하고 살다가 위궤양 걸리겠다. 


( younjin.jeong@gmail.com, 정윤진 )