geek-pornoã®ãã¡ã³ã¯ãã£ããããã§ãããããã¡ãŒã ãŠã§ã¢ã®å€æŽããããã³ã°ãã¡ã¢ãªã«ãŒãèªäœã®ãªãŒãã³ã¯è¡ããŸããã å€æŽãå ããã«ããã¹ããã¯ãã¡ã¢ãªã«ãŒãã䜿çšããŸãã
ãã®ããããã®èšäºã§ã¯ããã©ã³ã»ã³ãWiFiã¡ã¢ãªã«ãŒãã®ShootïŒViewãããã³ã«ãåæããWindowsãLinuxãããã³MacOSã§å®è¡ãããã¯ãã¹ãã©ãããã©ãŒã ã¯ã©ã€ã¢ã³ããPythonã«æžã蟌ã¿ãŸãã ãããŠãæãçæ°ãªäººã®ããã«ãèšäºã®æåŸã«ããããžã§ã¯ãçšã®æ¢è£œã®pythonã¢ãžã¥ãŒã«ãã³ã³ãœãŒã«ã¯ã©ã€ã¢ã³ããããã³WindowsãLinuxãmacosã§åäœããGUIãŠãŒãã£ãªãã£ããããŸãã
ãããã¯ãŒã¯äžã®ã¡ã¢ãªã«ãŒããæ€çŽ¢ããŸãã
ã¡ã¢ãªã«ãŒãã¯2ã€ã®ã¢ãŒãã§åäœã§ããŸããã«ãŒããç¬èªã®ã¢ã¯ã»ã¹ãã€ã³ããäœæãããšãã®ã¢ã¯ã»ã¹ãã€ã³ãã¢ãŒããšãèšå®ã§æå®ãããã¢ã¯ã»ã¹ãã€ã³ãã«ããã£ã€ããã¢ã¯ã»ã¹ãã€ã³ããžã®æ¥ç¶ã¢ãŒãã§ãã å®éšã§ã¯ãã¢ããªã±ãŒã·ã§ã³ããAndroidãŸãã¯iOSãžã®æ¥ç¶ãèšå®ããåŸãã¢ã¯ã»ã¹ãã€ã³ããžã®æ¥ç¶ã¢ãŒãããªã³ã«ããããšããå§ãããŸãã ãŸããNeverãã€ã³ã¹ããŒã«ããŠãWiFiããªãã«ããããèšå®ããããšãå¿ããªãã§ãã ããã ãã®ãªãã·ã§ã³ã¯ã誰ãã«ãŒãã«æ¥ç¶ãããŠããªãå Žåã«WiFiãç¡å¹ã«ããŸãã æåã®æ®µéã§ã¯ãã«ãŒããã«ãŒããªãŒããŒã«æ¥ç¶ããããã¢ã€ãã«æã«é»æºãåããªãããã«ã«ã¡ã©ãèšå®ããããšããå§ãããŸãã
ããã°ã©ãã³ã°ãå§ããŸãããã ã³ã³ãœãŒã«ã¯ã©ã€ã¢ã³ãã®å Žåãè¿œå ã¢ãžã¥ãŒã«ã¯äžèŠã§ãããããå ã®ããããªãŒãã®ã¿ãå¿ èŠã§ãã ãããŠã次ã®ããšããå§ããŸãã
import socket class SDCard: def __init__(self,home_dir=''): self.home_dir=home_dir # ip , self.ip=socket.gethostbyname(socket.gethostname()) # ip self.card_ip=None if __name__=='__main__': # HOME_DIR=os.path.expanduser('~') if not os.path.exists(HOME_DIR+'/'+'ShootAndView'): os.mkdir(HOME_DIR+'/'+'ShootAndView') HOME_DIR=HOME_DIR+'/ShootAndView/' sd=SDCard(home_dir=HOME_DIR)
ã«ãŒããã¢ã¯ã»ã¹ãã€ã³ãã«æ¥ç¶ãããŠããå Žåããã®IPã¢ãã¬ã¹ã¯ãããšãã°ã«ãŒã¿ãŒã®Webã€ã³ã¿ãŒãã§ã€ã¹ã§è¡šç€ºã§ããŸãããã«ãŒãã«çŽæ¥æ¥ç¶ããŠããå Žåããã®IPã¢ãã¬ã¹ã¯192.168.11.254ïŒæ¢å®ã®èšå®ã«åŸã£ãŠïŒã§ãã
ããããã¢ãã€ã«ã¢ããªã±ãŒã·ã§ã³ã§è¡ãããããã«ãç¹ã«ãããã®äœæè ããããã¯ãŒã¯äžã§ã®æ€çŽ¢ãæäŸããŠãããããæåã§æ€çŽ¢ããããããŸããã ãã®ããã«å¿ èŠãªãã®ïŒ
- ããŒã58255ã«ãœã±ãããäœæããŸã
- ããããããŒã55777ã«ç©ºã®ãããŒããã£ã¹ãèŠæ±ãéä¿¡ããŸã
-
å¥è·¡ã«ãŒãã®åå¿ãæåŸ ãã
幞éãªããããã«å¿ããŠæ¬¡ã®ããã¹ããåãåããŸãã
Transcend WiFiSD - interface=mlan0 ip=192.168.0.16 netmask=255.255.255.0 router=192.168.0.1 mode=client essid=WiFiSDCard apmac=CE:5D:4E:5B:70:48
ããããã¹ãŠãããIPã¢ãã¬ã¹ã®ã¿ãå¿ èŠã§ãã ä»ã§ã¯ãã¹ãŠãããã°ã©ã ããããšãæ®ã£ãŠããŸãïŒ
import os import socket import thread import time class SDCard: def __init__(self,home_dir=''): self.home_dir=home_dir self.ip=socket.gethostbyname(socket.gethostname()) self.card_ip=None def find_card(self,callback=None): """ """ thread.start_new_thread(self.find_card_thread,(callback,)) def find_card_thread(self,callback=None): while not self.card_ip: """ UDP """ s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) s.settimeout(5) s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) s.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1) """ """ try:s.bind((self.ip, 58255)) except socket.error: s.close() time.sleep(1) continue """ 55777""" s.sendto('', ('<broadcast>', 55777)) try: resp=s.recv(400) s.close() try: """ """ self.card_ip=resp.split('ip=')[1].split('\n')[0] except IndexError: """ """ if callback:callback(None) """ ip""" if callback:callback(self.card_ip) except socket.timeout: callback(self.card_ip) finally: time.sleep(2) def monitor(ip): if not ip:return print 'Find card on ip:',ip if __name__=='__main__': HOME_DIR=os.path.expanduser('~') if not os.path.exists(HOME_DIR+'/'+'ShootAndView'): os.mkdir(HOME_DIR+'/'+'ShootAndView') HOME_DIR=HOME_DIR+'/ShootAndView/' if options.dir:HOME_DIR=options.dir sd=SDCard(home_dir=HOME_DIR) # "", # GUI sd.find_card(callback=monitor) # , # while 1: time.sleep(1)
å®éãæãé£ããéšåã¯çµãããŸããã æ°ããåçã®ãé åæžãã«é¢ããæ å ±ãã©ã®ããã«åä¿¡ããŠããŠã³ããŒãã§ããããèŠã€ããããšã ããæ®ã£ãŠããŸãã
æ°ããåçãååŸããŠããŸãã
åçãååŸããã®ã¯ç°¡åã§ãã ããããèŠã€ããããããŒã5566ã§ãããã«åå ããŸãã
ã«ã¡ã©ã7ã8ç§ã§æ°ãããã¬ãŒã ãååŸãããšããã«ããããã«è¡šç€ºãããæ°ãããã¡ã€ã«ã«é¢ããæ å ±ããéããŠãããœã±ãããä»ããŠååŸãããŸãã次ã®ããã«ãªããŸãã
>/mnt/DCIM/101CANON/IMG_1754.JPG
è€æ°ã®åçãæ®åœ±ããå Žåã1ã€ã®ã¡ãã»ãŒãžã§ãããã®è¡ã¯ãŒããã€ãïŒ0x00ïŒã§åºåãããŸã
ç§ã¯åŒ·èª¿ããã-ããã¯7-8ç§ã§ãã ãããè¡ãããçç±ã¯å®å šã«ã¯æããã§ã¯ãããŸãããã圱é¿ãäžããããšã¯ã§ããŸããã ãŸããjpeg圢åŒã®æ°ããåçã«é¢ããæ å ±ã®ã¿ãæäŸãããŸããããã«ãã«ãŒããœãããŠã§ã¢ã«ã¯RAWãã¡ã€ã«ããæç·jpgãã¬ãã¥ãŒãæœåºããæ©èœããããŸãïŒè©³çŽ°ã¯ä»¥äžãåç §ïŒããããã°ã©ããŒã¯jpgã§ã®æ®åœ±ãRAW + jpgã§ã®æ®åœ±ã匷å¶ããæ©èœã奪ãããšã奜ãRAWãããã«ãŒãã«æžã蟌ã¿ãjpgãå¥ã®ã«ãŒãã«æžã蟌ã¿ãŸãã ãŸããã«ãŒããªãŒããŒããåçãã³ããŒã§ããŸããã§ãããæ®åœ±ãšè¡šç€ºã¯ãã«ã¡ã©ã§æ®åœ±ãããæ°ããåçã«ã®ã¿å¿çããŸãã
ãã®ãã¹ãŠãããã°ã©ãã³ã°ããã®ã¯ç°¡åã§ãã ããããã³ãŒãã¹ããããã®è¡šç€ºãéå§ããŸããå®å šãªã³ãŒãã¯èšäºã®æåŸã«ãããŸãã
def listener_thread(self,callback): sock=socket.socket(socket.AF_INET, socket.SOCK_STREAM) # sock.connect((self.card_ip, 5566)) while self.listen_flag: message=sock.recv(1024) # ( ) new_files=message.split('\00') for x in new_files: if x: # self.all_files.append(x[1:]) # x[1:] - ">", # self.download_list.put(self.all_files[-1]) if callback:callback(self.all_files[-1])
ã¡ã¢ãªã«ãŒãããåçãããŠã³ããŒããã
ããã§æ°ãããã¡ã€ã«ã®ãªã¹ããã§ããŸãããæ®ã£ãŠããæåŸã®ã¹ãããã¯åçãã³ã³ãã¥ãŒã¿ãŒã«ã¢ããããŒãããããšã§ãã ããèªäœã§ã¯ãããŠã³ããŒãã¯ãããã®çµã¿èŸŒã¿WebãµãŒããŒãä»ããŠå®è£ ãããŸãã é©ãã¹ãããšã«ãäºå®-ãããŸã§ã«è¡ã£ããã¹ãŠã®æäœãåçã®ã¢ããããŒãããã¡ã€ã«ã®ãªã¹ãã®ååŸããã¬ãã¥ãŒã®åä¿¡ãªã©ã®ããã€ãã®ã¢ã¯ã·ã§ã³ã¯ãæ¿èªããŸã£ããå¿ èŠãšããŸããã ã€ãŸããã«ãŒããã¢ã¯ã»ã¹ãã€ã³ããšããŠèšå®ãããŠããŠããŠãŒã¶ãŒãWiFiãã¹ã¯ãŒããå€æŽããŠããªãå Žåãå®å šã«æ¥ç¶ããŠããã«ãããã¹ãŠã®ãã®ãããŠã³ããŒãã§ããŸãã å€ã«ã¯ã©ãã«ãããŠèŠ³å å°ãéããã«ã¡ã©ãæã£ã芳å 客ã®éã§WiFiãããã¯ãŒã¯ãæ¢ãå¿ èŠããããŸãã
cgi-binãã©ã«ããŒãèŠããšãä»ã®ãããžã§ã¯ãã§å¿ èŠã«ãªãå¯èœæ§ã®ããèå³æ·±ããã®ãããããèŠã€ãããŸãã ç°¡åã«èª¿ã¹ãããšãã§ããç°¡åãªæ瀺ã«åŸã£ãŠãtelnetã«ãŒãã§æã¡äžããã ãã§ååã§ãã ãããŠå éšã«ã¯ïŒ
ããšãã°ãwifi_filelistãã€ããªã¯ããã£ã¬ã¯ããªå ã®ãã¡ã€ã«ã®ãªã¹ãïŒXML圢åŒïŒãæäŸãã次ã®ããã«ã¢ã¯ã»ã¹ããŸãïŒ CARD_IP / cgi-bin / wifi_filelistïŒFn = DIR ãCARD_IPã¯æ¢ã«èŠã€ãã£ãã¡ã¢ãªã«ãŒãã®IPã¢ãã¬ã¹ãDIRã¯ãã£ã¬ã¯ããªïŒ/ mnt / DCIMãªã©ïŒã thumbNailãã€ããªã¯åçã®ãã¬ãã¥ãŒãæäŸããåãæ¹æ³ã§ãã¡ã€ã«ãžã®ãã¹ããã£ãŒãããŸãã ããã«ããµãŒããŒåŽã§ã¯ããªãœãŒã¹ã倧éã«æ¶è²»ããåçã®ã«ããã¯è¡ãããŸãããããã¬ãã¥ãŒã¯jpgãŸãã¯rawã«é ç·ãããŸãã
ããããåçãããŠã³ããŒãããããšã«èå³ããããŸãã ç®çã®åçãååŸããã«ã¯ãã¢ãã¬ã¹CARD_IP / cgi-bin / wifi_downloadïŒFn = IMAGE_PATHãžã®ç°¡åãªGETãªã¯ãšã¹ãã䜿çšããŸãã Pythonã§ã¯ãurllibã©ã€ãã©ãªã®urlretrieveé¢æ°ããã®å Žåã®èªã¿èŸŒã¿ã«é©ããŠããŸãã ããã«ããããªã¯ãšã¹ãã®çµæãããã«ãã¡ã€ã«ã«ä¿åããæãéèŠãªããšãšããŠãããŠã³ããŒãã®é²è¡ç¶æ³ãååŸã§ããŸããããã¯GUIã§åœ¹ç«ã¡ãŸãã
ããŠã³ããŒãæ©èœã¯æ¬¡ã®ããã«ãªããŸãã
def download_thread(self,download_callback,download_complete): while self.listen_flag: # if not self.download_list.empty(): # fl=self.download_list.get(block=0) # urllib.urlretrieve('http://%s/cgi-bin/wifi_download?fn=%s'%(self.card_ip,fl),self.home_dir+fl.split('/')[-1],download_callback if download_callback else None) if download_complete:download_complete(self.download_now) time.sleep(0.1)
次ã«ããã¹ãŠãæ¥ç¶ããŠæ¢è£œã®ã¢ãžã¥ãŒã«ãäœæããåæã«WindowsãLinuxãããã³MacOSã§åäœããã³ã³ãœãŒã«ã¯ã©ã€ã¢ã³ããåä¿¡ããŸãã
sdwificard.py
#coding:utf-8 """ Copyright (C) 2010 Igor zalomskij <igor.kaist@gmail.com> This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. """ import os import socket import thread import time import ping import Queue import urllib import sys class SDCard: def __init__(self,home_dir=''): self.home_dir=home_dir # ip self.ip=socket.gethostbyname(socket.gethostname()) self.card_ip=None # ip self.all_files=[] # self.download_list=Queue.Queue() # self.in_queue=[] # , GUI def find_card(self,callback=None): # thread.start_new_thread(self.find_card_thread,(callback,)) def find_card_thread(self,callback=None): """ """ while not self.card_ip: # UDP s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) s.settimeout(5) s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) s.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1) try:s.bind((self.ip, 58255)) # except socket.error: s.close() time.sleep(1) continue # 55777 s.sendto('', ('<broadcast>', 55777)) try: resp=s.recv(400) s.close() try: # self.card_ip=resp.split('ip=')[1].split('\n')[0] except IndexError: # if callback:callback(None) if callback:callback(self.card_ip) except socket.timeout: callback(None) finally: time.sleep(2) def start_listen(self,callback=None,download_callback=None,download_complete=None): """ . """ self.listen_flag=True # , thread.start_new_thread(self.listener_thread,(callback,)) # , . thread.start_new_thread(self.ping_card,()) # thread.start_new_thread(self.download_thread,(download_callback,download_complete)) def ping_card(self): # 20 . while self.listen_flag: try: resp=ping.do_one(self.card_ip) except socket.error: # , pass time.sleep(20) def listener_thread(self,callback): # sock=socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 5566 sock.connect((self.card_ip, 5566)) while self.listen_flag: message=sock.recv(1024) new_files=message.split('\00') # ( ) for x in new_files: if x: # ;) self.all_files.append(x[1:]) # x[1:] ">", self.download_list.put(self.all_files[-1]) # self.in_queue.append(self.all_files[-1]) # , GUI if callback:callback(self.all_files[-1]) def download_thread(self,download_callback,download_complete): # while self.listen_flag: if not self.download_list.empty(): # fl=self.download_list.get(block=0) self.download_now=fl # , GUI # urllib.urlretrieve('http://%s/cgi-bin/wifi_download?fn=%s'%(self.card_ip,fl),self.home_dir+fl.split('/')[-1],download_callback if download_callback else None) if download_complete:download_complete(self.download_now) time.sleep(0.1) def find_callback(ip): if not ip:return print 'Find card on ip:',ip # IP , sd.start_listen(download_complete=download_complete) def download_complete(fname): print 'New image: %s'%(HOME_DIR+fname.split('/')[-1]) if __name__=='__main__': """ , . , ip """ from optparse import OptionParser parser = OptionParser() parser.add_option("-d", "--dir", dest="dir",default=None,help="directory for storing images") parser.add_option("-i", "--ip", dest="ip",default=None,help="ip address of the computer (default %s)"%(socket.gethostbyname(socket.gethostname()))) (options, args) = parser.parse_args() # . HOME_DIR=os.path.expanduser('~') if not os.path.exists(HOME_DIR+'/'+'ShootAndView'): os.mkdir(HOME_DIR+'/'+'ShootAndView') HOME_DIR=HOME_DIR+'/ShootAndView/' if options.dir:HOME_DIR=options.dir sd=SDCard(home_dir=HOME_DIR) if options.ip:sd.ip=options.ip print 'Finding sd card...' # sd.find_card(callback=find_callback) while 1: time.sleep(1)
ç§ã¯ãpep-8ããã®éžè±ã®å¯èœæ§ã«ã€ããŠç§ãoldããªãããã«ãé¡ãããŸããçŸåšãç§ã¯éåžžã«ãŸãã«ããã°ã©ãã³ã°ãç·Žç¿ããŠããŸããç§ã¯èªåã«ããèšãããã®ã§ãããç§ã®é ã®äžã§pep-8ãèªãã§ããªãã ãã
github.com/kaist/shoot-and-viewã§ãã¹ãŠã®ãœãŒã¹ã³ãŒããååŸã§ããŸã
ã¡ã¢ãªã«ãŒãã䜿çšããŠãããšãã«ãæã pingãå®è¡ããããšããå§ãããŸãã ç¹ã«äžéšã®ãã©ãããã©ãŒã ã®ã³ã³ãœãŒã«pingãŠãŒãã£ãªãã£ã«ã¯ç®¡çè æš©éãå¿ èŠãªãããã¹ã¯ãªããã§ã¯ãç°ãªããã©ãããã©ãŒã ã§pingãå®è¡ããæ¹æ³ãæ¢ããŸããã§ããã çŽç²ãªpythonã§ping å®è£ ã䜿çšããŸãã ã ãã®ã¢ãžã¥ãŒã«ã¯ãã¹ã¯ãªããã®é£ã«é 眮ããå¿ èŠããããŸãã
GUI
GUIã«ã¯ãPythonã§æãåçŽãªããŒã«ã䜿çšããŸãããããã¯Tkinterã§ãã Windowsããã³MacOSã§ãããã«äœ¿çšå¯èœãã§ãããã¹ã¿ã³ãã¢ãã³ã¢ããªã±ãŒã·ã§ã³ããã«ãããå Žåã¯ã»ãšãã©ã¹ããŒã¹ãå æããŸããã ãããããGUIã®äœæããã»ã¹ã«ã€ããŠã¯èª¬æããŸããããã»ãã®å°ãã®æ瀺ã«éå®ããŸãã
- Tkinterãã€ã³ããŒã
from Tkinter import *
- GUIãæžã
ã³ã³ãœãŒã«ã¢ããªã±ãŒã·ã§ã³ã«ã¯è¿œå ã®ã©ã€ãã©ãªã¯å¿ èŠãããŸããããGUIããŒãžã§ã³ã«ã¯exifã®èªã¿åããã€ã¡ãŒãžã®æäœãªã©ãããŸããŸãªæ©èœãå¿ èŠã§ãããœãŒã¹ããå®è¡ããå Žåã¯ïŒç³ãèš³ãããŸãããããã®ãªãã·ã§ã³ã¯Linuxã§ã®ã¿çšæãããŠããŸãïŒ
sudo apt-get install python-tk python-imagetk python-imaging libimage-exiftool-perl
ãŸãã exiftoolãžã®æåãã€ã³ãã£ã³ã°ãã€ã³ã¹ããŒã«ããŸã ïŒ
sudo python setup.py install
ïŒ
Windowsã§ã¯ãPython 2.7ãšexiftoolãžã®ãã€ã³ãã«å ããŠã PILãšexiftoolãå¿ èŠã§ã ã
ãŸããexiftoolãã€ã³ã¹ããŒã«ããŠMacOSã«ãã€ã³ãããå¿ èŠããããŸããäžèšã®ãªã³ã¯ãåç §ããŠãã ããã
ãã®ã¢ããªã±ãŒã·ã§ã³ã¯ãWindowsã§ã¯py2exeã䜿çšããMacOSã§ã¯py2appã䜿çšããŠæ§ç¯ãããŠããŸãããœãŒã¹ã®äžããã¹ã¯ãªãããèŠã€ããããšãã§ããŸãã
ãŸãšã
çŽæã©ãããWindowsããã³MacOSåãã®æ¢è£œã®ãã«ãã¯ãæãæ forãªäººãå©çšã§ããŸãã ãã®ããŒãžã§ããããåãããšãã§ããŸã ã
æ©èœã®äžéšïŒ
- æ®åœ±å±¥æŽ-å·ŠãŸãã¯å³ã®ãã¿ã³ã䜿çšããŠãåãŸãã¯æ¬¡ã®ãã£ããã£ãããåçã衚瀺ããæ©èœã
- ãºãŒã -ãåé¡ãããŒãæŒããšãåçã100ïŒ ã«ãºãŒã ãããŸã
- èªåã¡ã¢ãªãŒã«ãŒãæ€çŽ¢
- ãããŠãã¡ãããåçšããã³éåçšã§ã®äœ¿çšã¯ãã¹ãŠç¡æã§ãã GPL v2ã©ã€ã»ã³ã¹ã§å©çšå¯èœãªãœãŒã¹
æåŸã«ãããã€ãã®ã¹ã¯ãªãŒã³ã·ã§ããïŒ
PSç§ã¯åããŠMacOSã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããŠããŸãããç¹ã«éçºè ã®pythonãã·ã³äžã§ã¯åäœããªããã©ããããã¹ãããŠãã ããïŒ
ãã®èšäºã¯ã Creative Commons Attribution 3.0 UnportedïŒCC BY 3.0ïŒã®äžã§ã©ã€ã»ã³ã¹ãããŠããŸã