윈도우 8에서 터치 이벤트를 만들기 위해 Touch Injection API 를 사용하던 도중 발생한 문제에 대한 해결 방법입니다.


Touch Injection 은 Windows 8 부터 지원되는 Windows API 이며 User32.dll 에서 Import 하실수 있습니다.


원래는 C++ 만 지원하는 API 이나 C# 에서도 지원이 가능하게 끔 만들어진 라이브러리가 있습니다.


https://code.msdn.microsoft.com/TouchInjection-on-Windows-885150d2#content


이 라이브러리를 사용하면 C# 에서도 터치 이벤트를 만들어낼수 있습니다.



아래는 제가 이 라이브러리를 사용하면서 발생했던 문제에 대한 해결 방법입니다.





문제사항해결방법
InitializeTouchInjection() 에 Parameter를 넣으면 터치이벤트가 아예 동작하지 않음InitializeTouchInjection() 에서 Parameter를 모두 제거해서 해결
양손 적용시 터치가 한군데에서만 연속적으로 클릭되던 문제각 손이 각각 업데이트 되지만 업데이트는 2개 모두 하던 방식에서 각 손만 임시 contact를 만들어 각각 업데이트 하도록 해서 Injection 시키도록 하여 해결
터치인젝션으로 터치클릭 & 무브가 안되는 문제터치클릭을 위해서 UPDATE / INRANGE / INCONTACT 옵션을 사용했는데 문제는 이 이벤트를 발생시키기 전에 DOWN / INRANGE / INCONTACT 이벤트를 발생시켜야 이 이벤트가 정상적으로 동작하여서 터치가 UP된 후 다시 터치클릭 & 무브 하려할때 해당 이벤트가 발생되지 않았으면 발생시키도록 수정
터치가 한쪽밖에 안됨기존에 터치가 한군데에서만 연속적으로 클릭되던 문제의 원인이 LeftHand 신호를 받지 않았기 때문에 발생했던 문제였기 때문에 임시로 해결했던 contacttemp 를 만들어 각각 업데이트 하도록 Injection 시키던걸 양손 모두 한꺼번에 업데이트 하도록 변경하여서 수정
두 손 터치가 제대로 되지 않는 문제스택오버플로우에 따르면 TOUCH_FEEDBACK_DEFAULT 는 윈도우의 Pen and Touch 설정에 영향을 받기 때문에 여러가지 문제가 생길수도 있어서 TOUCH_FEEDBACK_INDIRECT 를 통해 InitializeTouchInjection()을 초기화해서 해결 http://stackoverflow.com/questions/20875283/why-is-only-one-touch-being-injected-when-using-touch-injection-api-with-win8
두 손 터치가 인식은 되지만 터치클릭이 되지 않는 문제Touch Down and Move 하기 전 이전 포인트 플래그가 터치가 올라갔을때 이면 Touch Down 플래그를 등록하는데 등록한 후 한번 Move 를 진행하고 그 다음번에 Touch Down and Move 를 위한 플래그로 변경시키는 방식에서 애초에 이전 플래그가 터치가 올라갔을때 이면 Touch Down 플래그를 등록한 후 바로 TouchInjection()을 호출하여 처리한 후 Touch Down and Move 를 위한 플래그를 넣고 Move 하고 Injection 하도록 하여서 해결



파이썬으로 만든 우체국택배 택배 배송정보를 가져오는 코드입니다.


택배 송장번호를 입력하시면 배송정보를 가져옵니다.


아래 주소에서 더 예쁘게 보실수 있습니다.

https://gist.github.com/taylor224/704e46a627519d035eb9




# -*- coding: utf8 -*-

 
import urllib, httplib, BeautifulSoup
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
 
realurl = 'http://service.epost.go.kr/trace.RetrieveRegiPrclDeliv.postal?sid1='
posturl = 'trace.epost.go.kr'
 
 
def getpost(sid):
params = {
'target_command' : 'kpl.tts.tt.epost.cmd.RetrieveOrderConvEpostPoCMD',
'sid1' : sid,
'RE_ORDID' : 'null'
}
params = urllib.urlencode(params)
headers = {"Content-type": "application/x-www-form-urlencoded", "Accept": "text/plain"}
conn = httplib.HTTPConnection(posturl)
conn.request("POST", "/xtts/servlet/kpl.tts.common.svl.SttSVL", params, headers)
response = conn.getresponse()
data = response.read()
conn.close()
 
try:
soup = BeautifulSoup.BeautifulSoup(data)
addressee = soup('table', {'class' : 'traceTable traceTableType02', 'summary' : '발송인/수취인 정보'})[0].tbody.findAll('tr')[1].td.string
statuslist = soup('table', {'class' : 'traceTable traceTableType02', 'summary' : '세부결과를 보여드립니다.'})[0].tbody.findAll('tr')
status = []
 
status.append({ 'type' : 'addressee',
'addressee' : addressee
})
 
for i in range(len(statuslist)):
if i == 1:
continue
else:
tdlist = statuslist[i].findAll('td')
if statuslist[i].get('id') == 'transport1' or statuslist[i].get('id') == 'transport2':
continue
# When Received
if len(tdlist) == 1:
statusreceiver = tdlist[0].string
status.append({ 'type' : 'recipient',
'recipient' : statusreceiver.strip()
})
else:
statusdate = tdlist[0].string
statustime = tdlist[1].string
statuslocation = tdlist[2].a.string
nowstatus = tdlist[3].string
statusdetail = tdlist[4].string
status.append({ 'type' : 'status',
'date' : statusdate,
'time' : statustime,
'location' : statuslocation,
'status' : nowstatus,
'detail' : statusdetail
})
 
for statusdata in status:
for key in statusdata.keys():
if statusdata[key]:
statusdata[key] = statusdata[key].strip()
 
return status
except IndexError:
return False
 
 
data = getpost('postnumber')
 
if not data:
print 'Invalid Number'
else:
for status in data:
if status['type'] is 'addressee':
print status['addressee']
if status['type'] is 'recipient':
print status['recipient']
if status['type'] is 'status':
print status['date']
print status['time']
print status['location']
print status['status']
print status['detail']




드론 파일럿 커뮤니티에 여러분들을 초대합니다.


드론 파일럿 커뮤니티의 모든 자료는 가입없이 보실수 있으며 좋은 자료들을 여러 사람들과 그리고 해외 유저들에게도 제공하고자 가입없이 볼 수 있도록 공개를 하였습니다.


아직 컨텐츠는 많이 부족하지만 앞으로 많은 컨텐츠들로 채워나가 대한민국을 대표하는 커뮤니티로 성장하고자 합니다.


많은 분들이 가입하여 주셔서 좋은 컨텐츠들을 만들어 주셨으면 합니다.


나아가 여러 드론 관련 전산시스템을 구축하여 드론 유저들에게 편의를 제공하고 합법적으로 드론을 비행할수 있도록 노력해볼 예정입니다.


저는 커뮤니티에 예전에 개발했던 드론 제어시스템에 관한 글을 작성하였습니다.


한번 읽어보시고 마음에 드신다면 가입을 부탁드리겠습니다.


감사합니다.



+ 늦게나마 써보는 드론 제어시스템 개발 후기

http://drone.festasquare.com/devlog/186


+ DJI F450 조종신호 분석

http://drone.festasquare.com/devinfo/146


+ 커뮤니티 메인페이지 주소

http://drone.festasquare.com


+ 드론 파일럿 커뮤니티 트위터

http://twitter.com/dronepilotcomm


+ 드론 파일럿 커뮤니티 페이스북

https://www.facebook.com/dronepilotcomm


+ 드론 파일럿 커뮤니티 회원가입 하기

http://drone.festasquare.com/index.php?mid=main&act=dispMemberSignUpForm

문득 제가 블로그에 쓴 드론 관련 글들을 다른 사람에게도 보여주고 싶다는 생각이 들어서 드론 커뮤니티를 만들게 되었습니다.

아마 저는 드론 개발에 관련된 글들을 많이 쓸 것 같습니다.

많은 이용 부탁드립니다

드론 커뮤니티
http://drone.festasquare.com/

제가 쓴 첫 글
http://drone.festasquare.com/devinfo/146


'IT 이야기' 카테고리의 다른 글

TouchInjection C# API 사용중 문제 해결방법  (0) 2015.03.09
[파이썬] 우체국택배 배송정보 가져오는 코드  (0) 2015.02.27
Asterisk 설정  (0) 2014.12.10
CUCM 구매/설치하기  (2) 2014.12.04
Cisco CP-9971 구매  (0) 2014.12.02
Asterisk 설정 IT 이야기 2014. 12. 10. 19:04

Asterisk / Elastix 설정 방법



Asterisk 11 버전

Elastix 3.0 버전

Freepbx 13 버전

기준으로 작성되었습니다


Elastix 3.0 버전 쓰지마세요.. 쓰다가 집어던지고 FreePBX로 넘어왔습니다...


아래 설정은 기본설정 (Organization, Extension, User 등이 셋팅되어 있어야 합니다)


언급하지 않은 셋팅은 기본값으로 두시면 됩니다.



-------------------------------------------------

+ SIP 설정


- Elastix :

PBX - Trunks 에서 [SIP] Create New Trunk 선택 (체크박스를 SIP로 설정)


Descriptive Name 은 알기쉽게 설정 (저는 Main)

Outbound Caller ID 에 SIP 계정의 전화번호 입력

Organization 선택


Peer Settings 탭으로 들어가서

Name 은 알기쉽게 암거나 (저는 Main)

Type = peer

secret = SIP 계정 비밀번호

username = SIP 전화번호

context = from-trunk

disallow = all

allow = ulaw;alaw;gsm

qualify = yes

nat = auto

dtmfmode = rfc2833

insecure = port,invite


(Advanced Settings 를 누름)


fromuser = SIP 전화번호

defaultuser = SIP 전화번호

fromdomain = SIP 서버주소

outboundproxy = SIP 프록시 주소(없으면 입력하지 않아도 됨)


User Settings 탭으로 들어가서

Peer Settings 이랑 똑같이 하되

type = user

로 변경


Registration 탭으로 들어가서

Register String 에 

SIP전화번호:SIP계정비밀번호@SIP서버주소

라고 입력한다


그리고 저장


만약 incoming 전화가 에러가 난다면 

SIP Setting 에서 Local network 가 셋팅되어 있는지 확인해보자



아래는 FreePBX 용 셋팅


CID Option 을 Force Trunk CID 로 셋팅

(이렇게 안하면 송신자가 Call Fail 뜸)


SIP Trunk

PEER Trunk


host=서버주소

username=번호

secret=비번

type=friend

disallow=all

qualify=yes

insecure=port,invite

context=from-trunk

fromuser=번호

defaultuser=번호

authuser=번호

allow=ulaw




위 대로 해서 안된다면 이렇게 해보자 (한국쪽 SIP Provider)


host=서버주소

username=070번호

secret=비밀번호

type=friend

disallow=all

qualify=yes

insecure=port,invite

context=from-trunk

fromdomain=서버주소

outboundproxy=서버주소

callbackextension=070번호

defaultuser=070번호

fromuser=070번호

allow=ulaw


-------------------------------------------------



-------------------------------------------------

전화 자동으로 연결되게 설정하기


PBX - Inbound Routes 에서 

ADD Incomming Route 클릭

Description 에 설명입력

Set Destination 에 연결할 곳을 선택하면 끝


그리고 저장


-------------------------------------------------



-------------------------------------------------

+ SIP 설정 후 Inbound 전화가 연결음만 나고 연결이 안될때


- Asterisk :

/etc/asterisk/sip.conf 에 아래 옵션을 추가한다


externaddr=외부아이피

localnet=내부아이피


- Elastix :

PBX Admin Settings - General Settings Admin - SIP Settings 에서

Nat Support 에서

Type of NAT 을 static 으로 변경


Local Network 를 172.30.1.0 / 255.255.255.0 으로 설정

Extern Addres 에 외부아이피 입력


그리고 저장


그리고


/etc/asterisk/sip_general_custom.conf 에 

bindaddr=0.0.0.0


추가 후 저장


+ Inbound 전화가 Call Fail (비프음이 나고 끊어질 때) 뜰 때 


SIP 설정이 위와 같이 제대로 설정되어 있는지 확인

추가로 다른 설정이 기본값을 벗어났는지 확인


확인된 에러:

- Outbound Caller ID 가 설정되어 있으면 에러남

- Queue 로 전화를 연결한 후 끊으면 그 다음 전화가 Fail 날 때 Queue 의 Destination 을 지정해준다 (예: Terminate Call)

- IVR -> Queue 으로 라우팅 된 후 Queue 에서 대기하고 있을때 Queue 설정이 변경되고 Asterisk 가 reload 되면 일정확률에서 송신자 Call Fail 이 뜬다. Asterisk 를 재시작하거나 Trunk 에서 CID Option 을 다른걸로 변경하고 Apply Config 한 후 다시 원상복귀 하면 정상작동 한다 (버그인듯 하다)

멍청한 짓이였다...

No route to peer for 'Caller ID' from 'IP Address'

라는 에러메세지가 떴는데 이게 요청을 보낸 아이피주소와 요청이 오는 아이피주소가 달라서 그랬던거다.. host에 아이피주소 대신 도메인 주소를 썼기때문..

그래서 SIP Trunk 의 host 를 모두 IP 주소로 변경했더니 잘 동작한다


-------------------------------------------------


SIP Trunk 에서 컬러링(Ring back tone)이 들리지 않고 그냥 기본 통화연결음만 들릴때:

이건 기본적으로 Asterisk 가 통화가 연결될 때 까지 통화연결음을 만들어 내기 때문이다.

외국에는 컬러링 같은 개념이 없나보다..


SIP.conf 에 아래 두개를 추가해주면 된다

(Freepbx - Setttings - Asterisk SIP Settings - 오른쪽 탭 Chan SIP - 맨밑에 Other SIP Setting)

progressinband=yes

prematuremedia=no (확인해보니 이건 안넣어도 되네요)


-------------------------------------------------


+ Asterisk SIP Provider 인증상태 확인

asterisk -rx "sip show registry"


+ Asterisk Log 실시간 확인

tail -f /var/log/asterisk/full 혹은 tail -f /var/log/asterisk/messages


-------------------------------------------------


Cisco CP-9971 과 CP-9951을 Asterisk 에 연결하기

http://linuxmanr4.com/2011/09/05/telefono-cisco-9951-y-elastix/


FreePBX 12 기준 : 


아래 모든 사항은 유저셋팅, Extension 셋팅이 끝나고 나서 해야한다.

Extension 은 CHAN_SIP로 만듭니다.


아래 쪽에 있는 TFTP 설치방법을 참고하여 TFTP 설치

69번 포트 오픈

/tftpboot 폴더에 필요한 파일들을 넣는다


SEP{기기고유ID}.xml

dialplan.xml

Korean_Korea_Republic (언어파일, CME 관련된 페이지에서 받을수 있는듯 하다, 없어도 됨)

RINGLIST.DAT (벨소리리스트, 없어도 됨)


Settings - SIP Setting 에서 외부아이피 다 설정하고

NAT 은 공유기 환경이면 yes 아니면 no

그리고 오른쪽 탭의 SIP Setting 에서 맨 아래 

Other SIP Settings 에 아래 두개를 추가한다

callcounter = yes

tcpenable = yes


Extension 페이지 오른쪽 탭에서 시스코 전화기를 접속시킬 Extension 을 선택하고 

NAT MODE 를 Automatic Force Both로 선택

Port 를 5061 (CHAN_SIP 포트)로

Transport 를 All - TCP Primary 로 선택하고 저장합니다.


(추가 업데이트 예정)


-------------------------------------------------


-------------------------------------------------

TFTP 서버 설치하기


sudo apt-get install xinetd tftpd tftp


vim /etc/xinetd.d/tftp 에 아래 내용 추가


service tftp

{

protocol        = udp

port            = 69

socket_type     = dgram

wait            = yes

user            = nobody

server          = /usr/sbin/in.tftpd

server_args     = /tftpboot

disable         = no

}


sudo mkdir /tftpboot

sudo chmod -R 777 /tftpboot

sudo chown -R nobody /tftpboot


sudo /etc/init.d/xinetd restart


-------------------------------------------------



시스코 시스템 기반으로 인터넷 전화를 구성하려고 보니 라이센스 비용만 기본 100만원이 넘어가게 생겼네요..


시스코 VoIP 시스템은 인터넷에 자료도 워낙 적어서 찾느라 애를 먹었는데 일주일 정도 검색해서 정보를 모아서 결국 제일 괜찮은 구성을 찾았습니다


기본적으로 엔터프라이즈급 회사에서는 아래처럼 구성합니다




IP Phone -> L2 -> Cisco IOS Router -> CUCM -> CUBE -> SIP Provider -> Receiver


이렇게 하면 필요한 시스코 장비가 2대이고 라이센스도 여러개가 필요해서 굉장히 비쌉니다..





그래서 대체로 찾은 구성이 이것


IP Phone -> L2 -> Normal Router -> CUCM --(SIP Trunk)--> Asterisk -> SIP Provider -> Receiver


이렇게 하면 필요한 시스코 장비는 0대이고(CUCM 가상서버로 설치), 필요한 라이센스는 1 + a(필요한 기능) 입니다.




Cisco UCM(CUCM) 에서 내가 IP Phone CP-9971(Voice&Video) Enhanced 라이센스 부터 지원해서 최소 라이센스 비용이 1유저당 $210입니다.


CUCM 보통 볼륨라이센스(대량라이센스) 라이센싱을 해서 낮은 수의 유저로 계약할땐 특별할인을 받지 못해 거의 1 유저당 20만원 정도의 가격이 매겨집니다.. (나빠요 ㅠㅠ)




CUCM 설치에 대해 얘기해보자면 CUCM 가상서버에도 올라갈수 있는 설치형 시스템입니다


다만 설치할수 있는 가상서버 환경은 VMware 기반으로 제한적입니다.


최소 2기가가 필요한 제한조건만 갖추면 설치/구동이 가능합니다(성능이 낮으면 기능에 제약이 걸림). 


하지만 VMware 라이센스도 별도로 구매하려면 돈이 들고 물리적 서버를 갖추자니 관리가 힘드므로 Hyper-V 설치하는 편법을 쓰기로 했습니다


CUCM 설치시에는 하드웨어 체크를 꼼꼼히 하기때문에 회피가 불가능 하고 일단 VMware 설치를 하드디스크 파일을 Hyper-V용으로 변경 그리고 부팅하드웨어 체크 스크립트를 수정하여 하드웨어 체크를 회피합니다


이러면 Hyper-V 기반에서도 CUCM 사용이 가능합니다. 다만 정상작동 보장이 안될뿐이죠...




제가 이렇게 까지 CUCM 설치하려는 이유의 첫째는 Cisco IP Phone 사용하고 싶어서 이고(조금 멋져보임) 둘째는 Auto Attendant(ARS) 사용하고 싶어서 입니다


사실 Auto Attendant 다른 VoIP 시스템에서도 가능하지만 그냥 시스코것을 써보고싶었습니다 ㅎㅎ




-> 2014.12.4 = 오늘 CUCM 구매를 하려고 기존에 알아봤던 곳에 전화를 했는데 1유저 라이센스는 너무 작아서 판매가 어렵하고 하네요... ㅠㅠ.. 그래서 Cisco 쪽에 전화했더니 시스코 총판인 A회사라 곳을 알려주는데 이곳에서 B회사라는 곳을 연결해주었습니다.. (302 Redirect 몇번째인지 ㅠㅠ) 지금 B회사 쪽이랑 얘기중인데 아무래도 여기서는 CUCM 구매할수 있을것 같은 느낌이 듭니다! 개인 + 소량 구매유저에게 Enterprise 제품을 정말 안팔긴 하나봅니다...


-> 2014.12.5 = B회사에서 오늘 견적을 받았습니다만.. 이해가 안가는 부분이 있어서 다시 전화를 드렸습니다. 시스코 CUCM 라이센싱은 포트(?) 때문에 한 유저당 6유저 라이센스가 필요하다고 하네요.. 이 부분이 이해가 안가서 다시 여쭈어보고 연락을 기다리는 상황입니다..

제가 다른회사에서 전해들은 금액은 대충 20~30만원 선에서 구매하는 정도였는데 견적을 받은 대로라면 거의 40만원이 넘어가는 금액이라 예산을 초과하게 됩니다.. 근데 정말 이번 거래를 하면서 느낀점이 큰회사가 아닌 작은회사들은 시스코같은 큰 회사 제품을 구매하기 조차 힘들다는 것 이었습니다... 돈주고 구매하겠다는데도 안팔려고 하는곳도 많고 홀대하는 느낌을 많이 받네요... 많이 실망입니다..

2014.12.5 15:55 = 솔직히 맘같아선 CUCM 말고 그냥 Asterisk 로 구축하고 싶습니다.. 이번 거래 끝나면 Cisco 본사에 컴플레인 메일을 보낼 예정입니다. 기분이 나쁘군요

'IT 이야기' 카테고리의 다른 글

드론 커뮤니티를 만들었습니다  (0) 2015.01.26
Asterisk 설정  (0) 2014.12.10
Cisco CP-9971 구매  (0) 2014.12.02
방사능 측정 시스템 만들기  (2) 2014.07.24
Synology atom 기반 ipkg 설치하기  (1) 2014.06.12
Cisco CP-9971 구매 IT 이야기 2014. 12. 2. 11:51
Cisco VoIP 시스템을 구현하고 사용하기 위해서 Cisco CP-9971 인터넷전화기를 구매했다

일단은 CUCM이라는 VoIP 매니저 서버를 구축한 뒤 그 서버에 이 전화기를 연결하면 된다고 하는데 아직 해보지는 않아서 잘 될지 모르겠다..
CUCM 10.5 Enhanced 라이센스가 $180 정도 하는것 같은데 이것도 구매하려 하는데 시스코 한국 파트너사들이 개인고객에게 친절하지 않아서 애를 먹고있다.. 차라리 외국 파트너에게 구매하는게 나을 정도..

CP-9971은 비디오와 음성을 지원하고 터치스크린인게 특징




'IT 이야기' 카테고리의 다른 글

Asterisk 설정  (0) 2014.12.10
CUCM 구매/설치하기  (2) 2014.12.04
방사능 측정 시스템 만들기  (2) 2014.07.24
Synology atom 기반 ipkg 설치하기  (1) 2014.06.12
Python Flask 에서 미디어 파일 스트리밍 하기  (0) 2014.05.22


방사능 측정기를 샀는데 쓰지도 않고 구석에만 박혀있길래 이걸 응용해서 방사능 측정/데이터 쌓는 시스템을 만들어서 서비스로 공개해보았습니다



일단 주소는 http://ems.cloudsquare.kr 이고 들어가시면 방사능 측정 데이터를 보실 수 있습니다.



사실 제 기억속엔 측정기 만들면서 사진을 여러장 찍어놓은것 같은데 찾아보니 사진이 이것밖에 없네요




아래 사진이 제가 사용한 방사능 측정(가이거 계수기) 기판입니다.

전원을 연결하면 방사선이 저 밑에있는 가이거 튜브를 땅 하고 때릴때 마다 1이라는 신호를 전송해줍니다.

방사선이 튜브를 땅 하고 많이 때리면 방사능 수치가 높은거고 적게 때리면 수치가 낮은거지요.



이게 가이거 튜브라고 방사선한테 허구언날 퍼 맞는 앱니다.

무려 400V가 넘어가는 전압을 사용해서 만질때 조심해야 합니다.

전류가 많이 낮아서 괜찮지만 전류가 심장을 흐를경우 좋지는 않다고 하네요(안만져봐서 몰라요).

이 튜브를 위 기판의 아래쪽 네모칸에 넣어서 사용합니다.





그리고 아래가 제가 만든 최종 가이거카운터 입니다.

중간 과정에 너무 집중하느라 싹 빼먹고 다 만든 사진만 있네요.

아두이노에 가이거 카운터 데이터 케이블을 연결해서 CPM이라는 값을 모아 nSv/h 로 변환합니다(공식사용).

조금 없어보이긴 한데 가이거 튜브에서 열도 많이나고 위험하기도 해서 대충 케이스를 만들었습니다.

아두이노는 ARM보드에 연결되어서 10분간 데이터를 모아서 평균을 낸 후 서버로 전송합니다.




아래가 위 장비에서 나온 방사능 측정 값 입니다(mSv/h)

여기에 100을 곱한게 nSv/h 입니다.

보시다시피 변화의 폭이 너무 커서 바로 사용하기에는 무리가 있어서 10초 간격으로 나오는 데이터를 10분동안 모아서

평균을 내서 사용합니다.







'IT 이야기' 카테고리의 다른 글

CUCM 구매/설치하기  (2) 2014.12.04
Cisco CP-9971 구매  (0) 2014.12.02
Synology atom 기반 ipkg 설치하기  (1) 2014.06.12
Python Flask 에서 미디어 파일 스트리밍 하기  (0) 2014.05.22
슈퍼컴퓨터 2세대  (3) 2014.02.22

Synology Intel Itom CPU 기반 시스템에 ipkg 설치하는 법 입니다.


일단 root 계정으로 ssh 에 접속합니다.

root 비밀번호는 admin 비밀번호와 동일



> cd /volume1/@tmp

> wget http://ipkg.nslu2-linux.org/feeds/optware/syno-i686/cross/unstable/syno-i686-bootstrap_1.2-7_i686.xsh

> chmod 755 syno-i686-bootstrap_1.2-7_i686.xsh

> sh syno-i686-bootstrap_1.2-7_i686.xsh

> vi /root/.profile


여기까지 입력하시면 편집창이 뜰거에요 그럼 영어 i 버튼을 누르셔서 편집모드로 전환하신 후

아래 두 부분앞에 다음과 같이 #을 추가해주세용


#PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/syno/sbin:/usr/syno/bin:/usr/local/sbin:/usr/local/bin

#export PATH


이렇게 고치셨으면 ESC 를 누른 후 : 버튼을 누른 다음 wq 를 입력하시고 엔터를 누르셔서 저장하시고 빠져나옵니다.


그리고 재부팅을 위해 reboot 을 입력하시고 엔터를 치신 뒤

재부팅이 완료되면(약 1분정도) 다시 root 로 ssh 에 접속합니다.


이렇게 입력하시면 아래와 같은 글이 나옵니다.

> ipkg -v

ipkg version 0.99.163


그리고 update 와 upgrade 를 통해 사용가능한 상태를 만들어줍니다.


> ipkg update

> ipkg upgrade


만약 이렇게 나오지 않고 ipkg not found 라고 나오신다면
아래를 따라하시면 됩니다.


/etc/rc.optware stop

> rm -f /etc/rc.optware

> echo -e '#!/bin/sh\n' > /etc/rc.local   (하나라도 빠트리지 않게 조심하세요)

> reboot


재부팅이 완료되면 다시 root로 ssh 접속하신 뒤


> rm -rf /volume1/@optware


를 입력하시고 위의 방법에서 vi /root/.profile 을 수정하는것만 제외하고 따라하시면 됩니다.


'IT 이야기' 카테고리의 다른 글

Cisco CP-9971 구매  (0) 2014.12.02
방사능 측정 시스템 만들기  (2) 2014.07.24
Python Flask 에서 미디어 파일 스트리밍 하기  (0) 2014.05.22
슈퍼컴퓨터 2세대  (3) 2014.02.22
슈퍼컴퓨터 2세대 제작 준비  (2) 2014.02.07

Python Flask 에서 일반적으로 미디어 파일을 전송하게 되면 206 Partial Content 로 전송하지만 Connection 이 Close 로 전송이 되기 때문에 미디어 파일 같은 경우는 아이폰이나 안드로이드에서 재생이 되지 않습니다..


아이폰이나 여타 모바일 기기에서 제대로 재생하려면 Response Header 에서 Connection 이 Keep-Alive 로 되어있어야 하죠.

게다가 수동으로 헤더를 변경하려고 해도 오버라이드 되는지 불가능하더군요.

그래서 한 8개월 동안 때려치고 있다가 겨우 해결 방법을 찾았네요.


Nginx 와 함께 사용해야한다는 단점이 있긴 하지만 확실히 해결이 가능합니다.


내용은 아래를 참고하시면 됩니다.

영어로 정리했어도 그리 어렵진 않습니다.


http://stackoverflow.com/questions/19421014/error-occurred-in-mobile-when-send-video-using-send-file-in-python-flask


'IT 이야기' 카테고리의 다른 글

방사능 측정 시스템 만들기  (2) 2014.07.24
Synology atom 기반 ipkg 설치하기  (1) 2014.06.12
슈퍼컴퓨터 2세대  (3) 2014.02.22
슈퍼컴퓨터 2세대 제작 준비  (2) 2014.02.07
Bootcamp 에서 키보드가 안될때  (0) 2014.01.06