JINS MEME + MQTT + Node.js ã§ãç®ãç²ãã¦é ããè¦ã¤ããæã«åæã«Macã®ç»é¢ãæ¶ãã¦ããã便å©ãªå¥´ãä½ã
ããã«ã¡ã¯ããããã§ãã
ãã®è¨äºã¯ JINS MEME Advent Calendar 2015 - Qiita ã®15æ¥ç®ã§ãã
ãã£ããã¨
ã¿ã¤ãã«ã®éãã§ãããã¾ã¨ããµã¤ãé²è¦§ä¸ ã³ã¼ãã£ã³ã°ä¸ã«ç®ãç²ãã¦é ããè¦ã¤ããæã«ãMacã®ç»é¢ãåæã«æ¶ãã¦å
éãè½ã¨ãããªã©ãã¯ã¹ãæå©ããã¦ãããããã°ã©ã ãä½ã£ã¦ã¿ã¾ããã
ã¨ãã£ã¦ãããã¡ããã¢ããªãæ¬æ°ã§ä½ã訳ã§ã¯ãªãã¦ããJINS MEMEã®ãã¼ã¿ãã¯ã©ã¦ãçµç±ã§å¸¸ã«å¨å²ã®ãã½ã³ã³ãIoTããã¤ã¹ã«éãã¤ããã¨ãã©ããªæ¥½ãããã¨ãã§ããããªï¼ãã¨ããã³ã³ã»ããã§ãJINS MEMEã®ã»ã³ãµã¼ãã¼ã¿ãMQTTã使ã£ã¦å¤é¨ã«éããåä¿¡ããããã°ã©ã å´ã§è²ã éã¶ã¨ããäºããããã¦ã¿ããã¨æãã¾ãã
ãªãã§å¤é¨ãµã¼ãï¼MQTTï¼
ç´æ¥ãã½ã³ã³ã«ãã¼ã¿ãéãã®ã§ããã°ãmito_logããã®ã¢ããã³ãã«ã¬ã³ãã¼8æ¥ç®ãJINSMEME - JINS MEMEのデータをtcp socket通信で出力、Processingに流してグラフ化してみる - Qiitaããè¯ãã¾ã¨ã¾ã£ã¦æ¸ããã¦ããã®ã§ãã²ãåèãã ããã
ä»åãå¤é¨ãµã¼ããçµç±ãã¦ãã¼ã¿ãããåãããã®ã¯ãæ¥å¸¸ã§ãã¤ãèªç¶ã«èº«ã«ä»ããäºãã§ãããã¨ããJINS MEMEã®ã¡ãªãããæ´»ããã¦ãã§ããã ãç¹æ®ãªè¨å®ããããã¯ã¼ã¯ç°å¢ï¼è¨åã®å¶ç´ãä¸åãªãããããã«ç¹ãã£ã¦ããããã°ãã¢ããªãç«ã¡ä¸ããã ãããã«ä½¿ããJINS MEMEã®å¿ç¨ä¾ãèãã¦ã¿ããã¨æã£ãããã§ãã ãã¨ãã°
-ãã¹ã¿ãã§MacBookãéããããæ¢ã«JINS MEMEãç¹ãã£ã¦ç»é¢å¶å¾¡ãã§ããã -ã家ã«å¸°ã£ãã家é»ãJINS MEMEã¨èªåã§é£æºãã¦åãåºãã
ã¿ãããªIoTãªä¸çãä½é¨ãããã¨ãã§ãã¾ãã
ä¸è¬çã«MQTTã使ãã¡ãªããã«ã¯ã以ä¸ã®æ§ãªäºãããã¾ããããã¯JINS MEMEã使ã£ããç¹ã«ãªã¢ã«ã¿ã¤ã ã®éä¿¡ãä¼´ãã¢ããªãä½ãéã«ãæç¨ã§ãã
- ãããã³ã«ã¨ãã¦è»½é
- ããã·ã¥ç¨éã§æ±ãããã
- IoTç¨éã§çµã¿è¾¼ã¿æ©å¨ã§å®è£ ããéãè² è·ãå°ãã
- ã©ã¤ãã©ãªãæ´ã£ã¦ãã
ä»åã®ãã¢ã§ã¯ãJINS MEMEããé ã®å¾ããã¼ã¿ãåããiPhoneã¢ããªããMQTTã§ããã¼ã«ã¼ï¼ãµã¼ãã¼ï¼ã«ã»ã³ãµã¼ãã¼ã¿ããããªãã·ã¥ããMQTTããã¼ã«ã¼ãçµç±ãã¦ãMacå´ã§ãµãã¹ã¯ã©ã¤ããã¦ããNode.jsã®ã¢ããªã«ãã¼ã¿ãåã渡ãã¾ããããã¦åãåã£ããã¼ã¿ãå ã«ãNode.jsã®ããã°ã©ã å´ã§ç»é¢ã®ç¹ç¯å¶å¾¡ãè¡ãã¾ãã
MQTTããã¼ã«ã¼ãç¨æãã
ããã§ã¯å®éã«éçºã«å ¥ãã¾ããããã¾ãããã¼ã¿ãä¸ç¶ããMQTTããã¼ã«ã¼ï¼ãµã¼ãï¼ãç¨æãã¾ãããã ããã¯MQTTããã¼ã«ã¼ã§ããã°ã¶ã£ã¡ããä½ã§ãè¯ãã§ããæµè¡ãã®AWS IoTã使ã£ã¦ãããã§ãããSangoãMilkcocoaã§ãè¯ãã§ãã ç§ã¯Mosquittoã使ã£ã¦Ubuntuä¸ã«èªåã§MQTTãµã¼ããç«ã¦ã¾ããï¼ã¨ã£ã¦ãç°¡åã§ãï¼ èå³ããã人ã¯ç§ã®éå»ã®è¨äºã§è©³ããã¾ã¨ãã¦ãã¾ãã®ã§ããã²åèã«ãã¦ã¿ã¦ãã ããã
iPhoneã¢ããªãä½ã
ãã¦ã次ã¯iPhoneã¢ããªãä½ããJINS MEMEã®ã»ã³ãµã¼ãã¼ã¿ãMQTTããã¼ã«ã¼ã«æãã¤ãã¾ãããã ã¨è¨ã£ã¦ããï¼ããä½ãã®ã¯é¢åãããã®ã§ãä»åã¯JINS MEMEã®ãããããã¼ãµã¤ãã§é å¸ããã¦ãããªã¢ã«ã¿ã¤ã ãã¼ã¿åå¾ã®ãµã³ãã«ï¼MEMELib_RealTimeï¼ãæ¹é ãã¦ããã¾ãã
MQTTKitã®å°å ¥
MQTTããã¼ã«ã¸ã®æ¥ç¶ã«ã¯ãã¯ã©ã¤ã¢ã³ãã©ã¤ãã©ãªã®MQTTKitã使ãã¾ãã podã§ãµã¯ãã¨å ¥ãã®ã§ãMEMELib_RealTimeã®ããã¸ã§ã¯ãã«è¿½å ãã¾ãããã
platform :ios,'8.0' pod 'MQTTKit', :git => 'https://github.com/mobile-web-messaging/MQTTKit.git'
注æç¹ã¨ãã¦ãpodå°å ¥å¾ãBuild Settingsã®Build Active Architecture OnlyãYESã«ãã¾ããããããããªãã¨ãJINS MEMEã®SDKã®é½åã§ãã«ããéãã¾ããã
MMDataViewController.mã®æ¹é
ãã¨ã¯ç°¡åãªæ¹é ã§ãããã¼ã¿åå¾ã®å¤§é¨åã¯æ¢åã®ãµã³ãã«ã使ãã®ã§ãMQTTããã¼ã«ã¸ã®éä¿¡é¨åã ã追å ã§å®è£ ãã¾ãããã ã¾ãã¯ãMQTTKitã®ãããã¼ãèªã¿è¾¼ã¿ã¾ãã
#import <MQTTKit.h>
次ã«å¿ è¦ãªããããã£ã追å
@property MQTTClient *client;
@property BOOL mqttConnected;
@property NSTimeInterval lastSentTimestamp;
viewDidLoadedã«ã¯ãMQTTããã¼ã«ã¸ã®æ¥ç¶ãã¸ãã¯ãè¨è¿°ãã¾ãã
// connect to the MQTT server _mqttConnected = NO; _lastSentTimestamp = 0; NSString *clientID = @"MEME-Client"; _client = [[MQTTClient alloc] initWithClientId:clientID]; [self.client connectToHost:@"your-mqtt-broker.com" completionHandler:^(NSUInteger code) { if (code == ConnectionAccepted) { _mqttConnected = YES; NSLog(@"MQTT Connected"); } }];
ãã¨ã¯ããã¼ã¿ãéãã¤ããã¡ã½ãããç¨æãã¾ããJINS MEMEã®ãã¼ã¿åå¾ã¬ã¼ãã¯çµæ§éãã®ã§ããããã«MQTTã¨è¨ãã©ãUnixtimeãè¦ã¦æ¯ç§ï¼åã®éä¿¡ç¨åº¦ã«å¶éãã¾ãã
ãããã¯ã¯åä¿¡å´ã®ããã°ã©ã ã¨æããã°ä½ã§ãããã§ããä»åã¯é ã®ãããæ¹åï¼ä¸ä¸ï¼ã®å¾ããã使ããªãã®ã§ããpitch:
-(void)sendDataToMQTTServer: (MEMERealTimeData*) data { if(!_mqttConnected){ return; } NSTimeInterval timeStamp = [[NSDate date] timeIntervalSince1970]; if((timeStamp - _lastSentTimestamp) > 1){ _lastSentTimestamp = timeStamp; [self.client publishString:[NSString stringWithFormat:@"pitch:%f",data.pitch] toTopic:@"meme" withQos:AtMostOnce retain:NO completionHandler:^(int mid) { NSLog(@"message has been delivered"); }]; NSLog(@"Send pitch:%f", data.pitch); } }
æå¾ã«ãmemeRealTimeModeDataReceivedã®æå¾ã«å ã»ã©è¨è¿°ãããã¼ã¿éä¿¡ã¡ã½ãããå¼ã³åºãå¦çãæ¸ã足ãã°å®æã§ãã
[self sendDataToMQTTServer:data];
Node.jså´ã®ããã°ã©ã ãæ¸ã
ããã§ã¯Macã§åããNode.jså´ã®ããã°ã©ã ãä½ãã¾ãããã ã®åã«ãMacã®ç»é¢ã®è¼åº¦ãå¶å¾¡ããããã®åããbrightnessãã¨ããç°¡åãªã³ãã³ããããã®ã§ãå ç«ã£ã¦ãããbrewã§å°å ¥ãã¾ãããã
brew install brightness
ã¾ããMQTTã©ã¤ãã©ãªãå¿ è¦ãªã®ã§ãnpmã§ã¤ã³ã¹ãã¼ã«ãã¾ãããã
npm install mqtt
ã³ã¼ããè¨è¿°ãã¾ãããã¡ãã¯ãã«ã¹ã¯ã©ããã§æ¸ããã®ã§ãJINS MEME SDKã¨éãã©ã¤ã»ã³ã¹ãèªç±ã§ãã ã©ã¤ã»ã³ã¹ã¯ã¨ããããMITã«ãã¦ããã¾ãã®ã§ãèªç±ã«ã使ããã ããã極ãã¦çãã§ãã
é ã®ç¢ºåº¦ã¯ä¸ãåãã»ã©å°ãããªãã¾ãã®ã§ãä»åã¯ããæãã«ãªã£ã-15°ã¨æ±ºãæã¡ã«ãã¦ãã¾ãã ç¶æ³ã«ãããã¦å¤ãã¦ãã ããã
以ä¸ã§éçºã¯çµããã¾ããç°¡åã§ããï¼ å®æãããiPhoneã¢ããªã¨Nodeã®ããã°ã©ã ãåãããJINS MEMEãæ¥ç¶ãã¦ãä¸ãåãã¦ã¿ã¦ãã ãããç»é¢ãæ¶ãã¾ãããï¼ï¼ï¼ä¸ãåããã®ã§ã¢ãã¿ãè¦ããªãããã§ããï¼ ãããªæãã§ãJINS MEMEã使ã£ã¦ãiPhoneã¢ããªæå¤ã®ç©ãç°¡åã«é£æºããããã¨ãã§ãã¾ããã
æ°ä»ããªããã¡ã«JINS MEMEãçæ´»ã¨é£æºããä¸çã£ã¦é¢ç½ã
ã¾ã¨ãã§ããä»åã¯JINS MEMEã¨Node.JSãMQTTã§ç¹ãããªã¢ã«ã¿ã¤ã ã«åä½ããããã°ã©ã ãä½æãã¾ããã ä»åã¯ç°¡åã«é ã®å¾ãã使ãã¾ãããããã£ã¨JINS MEMEããããç®ãéããæãã¨ããéä¸åãä¸ãã£ãæããªãããããªã¬ã¼ã«ããã¨ããã£ã¨é¢ç½ãããããã¾ãããã JINS MEMEã®ä½ããã®è¯ãã¯ã使ã£ã¦ãããã¨ãå¿ãããã¬ãã«ã«èªç¶ã«æ¥å¸¸ä½¿ããã§ããã¨ããæã ã¨æãã¾ããå®éãä»åã¯åãªããã¢ã¢ããªã§ãããããã®ããã°è¨äºãæ¸ãããéã«ãµã¨é ããè¦ã¤ããã¨ãã«Macã®ç»é¢ãæ¶ãã¦ãããã£ï¼ã¨æãã¾ããããæèããªãã¦ãããã¨ããã®ã¯ãã¨ã¦ã大åãªUXã ãªã¨åèªèãã¾ããã JINS MEMEãããããããæ¥ç¶ãããè¨å®ããªã©ã®æèçãªåä½ãä¸è¦ã«ãæ°ã¥ããªããã¡ã«ç©ºéãä¸çã¨é£æºãã¦ãããããªæªæ¥ãæ¥ãã¨é¢ç½ããªãã¨æãã¾ããã
Mosquittoã«èªè¨¼ãã©ã°ã¤ã³ãå°å ¥ãã
ä»åã¯Mosquittoã«èªè¨¼ãã©ã°ã¤ã³ã®mosquitto-auth-plugãå°å ¥ãã¦ãMQTTæ¥ç¶æã®ã¦ã¼ã¶èªè¨¼ã試ãã¦ã¿ã¾ãã
mosquitto-auth-plug
https://github.com/jpmens/mosquitto-auth-plug
ãã«ãã«å¿ è¦ãªç°å¢ãæãã
ã¯ããã«ããã«ãã«ã«å¿ è¦ãªãã®ãå ¥ãã¦ãã
sudo apt-get install make libcurl4-openssl-dev
é©å½ãªã¯ã¼ã¯ãã£ã¬ã¯ããªãæã£ã¦ãmosquitto-auth-pluginãåã£ã¦ãã
git clone https://github.com/jpmens/mosquitto-auth-plug.git
Makeã«å¿ è¦ãªã®ã§ãMosquittoã¨OpenSSLã®ã½ã¼ã¹ãæã£ã¦ãã
Mosquitto
http://mosquitto.org/download/
kyoro@iot:~/git$ wget http://mosquitto.org/files/source/mosquitto-1.4.4.tar.gz --2015-10-21 20:30:24-- http://mosquitto.org/files/source/mosquitto-1.4.4.tar.gz Resolving mosquitto.org (mosquitto.org)... 85.119.83.194, 2001:ba8:1f1:f271::2 Connecting to mosquitto.org (mosquitto.org)|85.119.83.194|:80... connected. HTTP request sent, awaiting response... 200 OK Length: 325077 (317K) [application/octet-stream] Saving to: âmosquitto-1.4.4.tar.gzâ 100%[==================================================================>] 325,077 493KB/s in 0.6s 2015-10-21 20:30:25 (493 KB/s) - âmosquitto-1.4.4.tar.gzâ saved [325077/325077] kyoro@iot:~/git$ tar zxvf mosquitto-1.4.4.tar.gz kyoro@iot:~/git$ mv -f mosquitto-1.4.4 mosquitto
Open SSL
https://www.openssl.org/source/
kyoro@iot:~/git$ git clone git://git.openssl.org/openssl.git
ãã«ãã®è¨å®
configãã¡ã¤ã«ãä½ã mosquitto-auth-plugã®ã¯ã¼ã¯ãã£ã¬ã¯ããªã«ç§»åãã¦ãconfig.mkããµã³ãã«ããä½ãã
kyoro@iot:~/git/mosquitto-auth-plug$ cp config.mk.in config.mk
configã®ä¸èº«ãç·¨é ä»åã¯HTTP-Backendã®ã¿ä½¿ãã®ã§ã以ä¸ã®ããã«ããã
# Select your backends from this list BACKEND_CDB ?= no BACKEND_MYSQL ?= no BACKEND_SQLITE ?= no BACKEND_REDIS ?= no BACKEND_POSTGRES ?= no BACKEND_LDAP ?= no BACKEND_HTTP ?= yes BACKEND_MONGO ?= no # Specify the path to the Mosquitto sources here MOSQUITTO_SRC = /home/kyoro/git/mosquitto # Specify the path the OpenSSL here OPENSSLDIR = /home/kyoro/git/openssl OSSLINC=-I$(OPENSSLDIR)/include OSSLIBS=-L$(OPENSSLDIR)/lib -lcrypto
ãã©ã°ã¤ã³ã®ãã«ã
configã®è¨å®ãçµãã£ããmake
kyoro@iot:~/git/mosquitto-auth-plug$ make Selected backends: HTTP Using mosquitto source dir: /home/kyoro/git/mosquitto OpenSSL install dir: /home/kyoro/git/openssl If you changed the backend selection, you might need to 'make clean' first cc -I/home/kyoro/git/mosquitto/src/ -I/home/kyoro/git/mosquitto/lib/ -fPIC -Wall -Werror -DBE_HTTP -I/src -DDEBUG=1 -I/home/kyoro/git/openssl/include -c -o auth-plug.o auth-plug.c cc -I/home/kyoro/git/mosquitto/src/ -I/home/kyoro/git/mosquitto/lib/ -fPIC -Wall -Werror -DBE_HTTP -I/src -DDEBUG=1 -I/home/kyoro/git/openssl/include -c -o base64.o base64.c cc -I/home/kyoro/git/mosquitto/src/ -I/home/kyoro/git/mosquitto/lib/ -fPIC -Wall -Werror -DBE_HTTP -I/src -DDEBUG=1 -I/home/kyoro/git/openssl/include -c -o pbkdf2-check.o pbkdf2-check.c cc -I/home/kyoro/git/mosquitto/src/ -I/home/kyoro/git/mosquitto/lib/ -fPIC -Wall -Werror -DBE_HTTP -I/src -DDEBUG=1 -I/home/kyoro/git/openssl/include -c -o log.o log.c cc -I/home/kyoro/git/mosquitto/src/ -I/home/kyoro/git/mosquitto/lib/ -fPIC -Wall -Werror -DBE_HTTP -I/src -DDEBUG=1 -I/home/kyoro/git/openssl/include -c -o envs.o envs.c cc -I/home/kyoro/git/mosquitto/src/ -I/home/kyoro/git/mosquitto/lib/ -fPIC -Wall -Werror -DBE_HTTP -I/src -DDEBUG=1 -I/home/kyoro/git/openssl/include -c -o hash.o hash.c cc -I/home/kyoro/git/mosquitto/src/ -I/home/kyoro/git/mosquitto/lib/ -fPIC -Wall -Werror -DBE_HTTP -I/src -DDEBUG=1 -I/home/kyoro/git/openssl/include -c -o be-psk.o be-psk.c cc -I/home/kyoro/git/mosquitto/src/ -I/home/kyoro/git/mosquitto/lib/ -fPIC -Wall -Werror -DBE_HTTP -I/src -DDEBUG=1 -I/home/kyoro/git/openssl/include -c -o backends.o backends.c cc -I/home/kyoro/git/mosquitto/src/ -I/home/kyoro/git/mosquitto/lib/ -fPIC -Wall -Werror -DBE_HTTP -I/src -DDEBUG=1 -I/home/kyoro/git/openssl/include -c -o cache.o cache.c cc -I/home/kyoro/git/mosquitto/src/ -I/home/kyoro/git/mosquitto/lib/ -fPIC -Wall -Werror -DBE_HTTP -I/src -DDEBUG=1 -I/home/kyoro/git/openssl/include -c -o be-http.o be-http.c cc -I/home/kyoro/git/mosquitto/src/ -I/home/kyoro/git/mosquitto/lib/ -fPIC -Wall -Werror -DBE_HTTP -I/src -DDEBUG=1 -I/home/kyoro/git/openssl/include -L/home/kyoro/git/mosquitto/lib/ -lcares -fPIC -shared -o auth-plug.so auth-plug.o base64.o pbkdf2-check.o log.o envs.o hash.o be-psk.o backends.o cache.o be-http.o -lcurl -L/home/kyoro/git/openssl/lib -lcrypto -lmosquitto /usr/bin/ld: cannot find -lcares /usr/bin/ld: cannot find -lmosquitto collect2: error: ld returned 1 exit status make: *** [auth-plug.so] Error 1
ãï¼ãªããæå¾ã§ã³ã±ã
é¢ä¿ãªãããã ã£ãã®ã§ãè¦ã¤ãããªãã£ã-lcaresã¨-lmosquittoãå¤ãã¦ã¿ãã
kyoro@iot:~/git/mosquitto-auth-plug$ cc -I/home/kyoro/git/mosquitto/src/ -I/home/kyoro/git/mosquitto/lib/ -fPIC -Wall -Werror -DBE_HTTP -I/src -DDEBUG=1 -I/home/kyoro/git/openssl/include -L/home/kyoro/git/mosquitto/lib/ -fPIC -shared -o auth-plug.so auth-plug.o base64.o pbkdf2-check.o log.o envs.o hash.o be-psk.o backends.o cache.o be-http.o -lcurl -L/home/kyoro/git/openssl/lib -lcrypto kyoro@iot:~/git/mosquitto-auth-plug$ ls *.so auth-plug.so
ãã¼ããã³ã³ãã¤ã«ã§ããï¼
ãã©ã°ã¤ã³ãè¨å®ãã
æ©é使ã£ã¦ã¿ã¾ãããã
ã§ããauth-plug.soãé©å½ãªå ´æã«ç§»åãã¦
kyoro@iot:~/git/mosquitto-auth-plug$ mkdir ~/bin kyoro@iot:~/git/mosquitto-auth-plug$ mv auth-plug.so ~/bin/
mosquitto.confãç·¨éãã¦auth-pluginãæå¹åãã¾ã
sudo vi /etc/mosquitto/mosquitto.conf
# Place your local configuration in /etc/mosquitto/conf.d/ # # A full description of the configuration file is at # /usr/share/doc/mosquitto/examples/mosquitto.conf.example pid_file /var/run/mosquitto.pid persistence true persistence_location /var/lib/mosquitto/ log_dest file /var/log/mosquitto/mosquitto.log include_dir /etc/mosquitto/conf.d allow_anonymous false auth_plugin /home/kyoro/bin/auth-plug.so auth_opt_backends http auth_opt_http_ip 127.0.0.1 auth_opt_http_port 3000 auth_opt_http_getuser_uri /auth auth_opt_http_superuser_uri /superuser auth_opt_http_aclcheck_uri /acl
è¨å®ãçµãã£ããmosquittoãåèµ·å
kyoro@iot:~$ sudo service mosquitto restart mosquitto stop/waiting mosquitto start/running, process 20677
åä½ç¢ºèªï¼ã¨è¨ã£ã¦ãå¼¾ããã確èªï¼
ãã¦ããã®ç¶æ ã§mosquittoã¯ã©ã¤ã¢ã³ããããããã¯ãè³¼èªã§ããã試ãã¦ã¿ã¾ããã
kyoro@iot:~$ mosquitto_sub -d -t test Client mosqsub/23400-iot sending CONNECT Client mosqsub/23400-iot received CONNACK Connection Refused: not authorised.
Anonymousã ã¨ããããªæããã¾ãï¼
kyoro@iot:~$ mosquitto_sub -d -t test -u bob -P bob-password Client mosqsub/23401-iot sending CONNECT Client mosqsub/23401-iot received CONNACK Connection Refused: not authorised.
ã¦ã¼ã¶åï¼ãã¹ã¯ã¼ããæå®ãã¦ããã¡ããæ¥ç¶ã§ãã¾ãããï¼èªè¨¼ãµã¼ããç¡ãã®ã§ï¼
ããã§Mosquittoã®èªè¨¼ãã©ã°ã¤ã³ãæå¹ã«ãªãã¾ããã 次åã¯ç°¡åãªèªè¨¼ãµã¼ããæ¸ãã¦Mosquittoã®ã¢ã¯ã»ã¹å¶å¾¡ãè¡ã£ã¦ã¿ããã¨æãã¾ãã
Ubuntuã§MQTTããã¼ã«ã¼ãæ§ç¯
AWS IoTãçºè¡¨ããã¦MQTTãã¾ãçãä¸ãã£ã¦ãã¾ããï¼ ä»æ¥ã¯èªåã§MQTTããã¼ã«ã¼ãæ§ç¯ãã¦è©¦ãã¦ã¿ãã®ã§åèé²ãæ®ãã¦ããã¾ãã MQTTã®èª¬æã«ã¤ãã¦ã¯ãããä¸ã«ãã詳ããä¸å¯§ãªæ å ±ãä¹ã£ã¦ãã¾ãã®ã§ãããã§ã¯å²æã
Ubuntu 14.04ä¸ã§Mosquittoã使ã£ãMQTTããã¼ã«ã¼ï¼ãµã¼ãï¼ãæ§ç¯ãã¾ãã
Mosquitto
ããã±ã¼ã¸ãªã¹ãã«ãªãã¸ããªã追å
kyoro@iot:~$ sudo add-apt-repository ppa:mosquitto-dev/mosquitto-ppa [sudo] password for kyoro: More info: https://launchpad.net/~mosquitto-dev/+archive/ubuntu/mosquitto-ppa Press [ENTER] to continue or ctrl-c to cancel adding it gpg: keyring `/tmp/tmpmtjlhsxh/secring.gpg' created gpg: keyring `/tmp/tmpmtjlhsxh/pubring.gpg' created gpg: requesting key 262C4500 from hkp server keyserver.ubuntu.com gpg: /tmp/tmpmtjlhsxh/trustdb.gpg: trustdb created gpg: key 262C4500: public key "Launchpad mosquitto" imported gpg: Total number processed: 1 gpg: imported: 1 (RSA: 1) OK
ããã±ã¼ã¸ãªã¹ãã®æ´æ°
kyoro@iot:~$ sudo apt-get update
ã¯ã©ã¤ã¢ã³ãã®å°å ¥
sudo apt-get install mosquitto-clients
ããã¼ã«ã¼ï¼ãµã¼ãï¼ã®å°å ¥
sudo apt-get install mosquitto
Mosquittoå°å ¥å®äºï¼
æ¥ç¶ãã¹ã
ã¯ã©ã¤ã¢ã³ãã§testãè³¼èª
kyoro@iot:~$ mosquitto_sub -d -t test Client mosqsub/12779-iot sending CONNECT Client mosqsub/12779-iot received CONNACK Client mosqsub/12779-iot sending SUBSCRIBE (Mid: 1, Topic: test, QoS: 0) Client mosqsub/12779-iot received SUBACK Subscribed (mid: 1): 0
ã¿ã¼ããã«ãå¥ã«éãã¦ã¡ãã»ã¼ã¸ãpublish
kyoro@iot:~$ mosquitto_pub -d -t test -m "Hello world!" Client mosqpub/12852-iot sending CONNECT Client mosqpub/12852-iot received CONNACK Client mosqpub/12852-iot sending PUBLISH (d0, q0, r0, m1, 'test', ... (12 bytes)) Client mosqpub/12852-iot sending DISCONNECT
ã¯ã©ã¤ã¢ã³ãå´ã§åä¿¡ããã¾ã
Client mosqsub/12779-iot received PUBLISH (d0, q0, r0, m0, 'test', ... (12 bytes)) Hello world!
ãã£ã¡ããæ軽ã§ããï¼
次åã¯èªè¨¼ãã©ã°ã¤ã³ã®å°å
¥ããã£ã¦ã¿ããã¨æãã¾ãã
â»ãããªãã¨ããååã®è¨äºããï¼å¹´ä»¥ä¸ããã°æ¾ç½®ãã¦ã¦ãããâ¦ï¼
æ ªå¼ä¼ç¤¾ãã¯ã·ã£ã寿éè·ãã¾ãã
æ¬è¨äºã¯ã寿éè·ãã¨ã³ããªã¼ã§ãã
å°ãåã®äºã§æ縮ã§ãããæ¬å¹´3æ5æ¥ï¼å·«å¥³ã®æ¥ï¼ï¼ã«ãµã³ãã©ã³ã·ã¹ã³å¸åºèã«ã¦ãã¯ã¨ããã(@hatone)ã¨çµå©ããæ´ãã¦co-founderã¨ãã¦æ°ãã家åºãã¹ã¿ã¼ãã¢ãããããã¨ã«ãªãã¾ãããã¾ããããã«ä¼´ãã¾ãã¦ãæ°åå ¥ç¤¾ãã6å¹´2ã¶æå¤ããæ ªå¼ä¼ç¤¾ãã¯ã·ã£ãåæ¥ãã¦ãã¯ã¨ãããã®å¤åå°ã§ããã·ãªã³ã³ãã¬ã¼ã«æ¬æ ¼çã«ç§»ä½ãããã¨ã«ãã¾ããã
éè·ã¨ã³ããªã¼ã«é¢ãã¦ã¯è«¸èª¬ããã®ã§ãå¥ã«æ¸ããªãã¦ã大ä¸å¤«ï¼ï¼ããªãã¦æ°è»½ã«æã£ã¦ããã®ã§ãããå®éã«ã¯çæ§ã«ãå ±åãã¦ãããªãã¨ãå®çæ´»ã§çµæ§è²ã ã¨å¤§å¤â¦ã¨ãããããã£ãããã¯ã·ã£ããä»äºã®é¢ä¿ã®ã話ãé ãã¦ããçããããã¨ãã§ãããç³ã訳ãªãã¨æãæ©ä¼ãæ¥ã å¢ãã¦ãã¾ããã®ã§ããã®æ©ä¼ã«ãã¡ãã¨ãå ±åããã¦é ãããã¨æãã¾ãã
å¨è·ä¸ã¯ç¤¾å å¤åããããªã³ã§ããªãã§ãæ¬å½ã«æ²¢å±±ã®çæ§ã«ãä¸è©±ã«ãªãã¾ããã æ¬å½ã«ãããã¨ããããã¾ããã
ã§ã¯ãè¯ã人çã®è»¢æç¹ã§ãããã¾ãã®ã§ããã®æ©ä¼ã«ãã¯ã·ã£ã§ã®çæ´»ãæ¯ãè¿ã£ã¦ã¿ããã¨æãã¾ãã
2008å¹´ã®ã¦ã§ãæ¥ç
ç§ã¯ã2008å¹´4æã«æ ªå¼ä¼ç¤¾ãã¯ã·ã£ã®æ°åæ¡ç¨ç¬¬1æçã¨ãã¦å ¥ç¤¾ãã¾ããã
å½æã¯ãWeb2.0ãã£ããããããªãã¦è¨èãåºå§ããæ代ãä»ãæãè¨èãã®ãã®ã¯ããã£ããããã以å¤ã®ä½ç©ã§ããªãã®ã§ãããå ¨ã¦ã®äººãããããä»ãã¦ç¹ããããµã¼ãã¹å士ãã©ãã©ãç¹ããããäºããæ§ã ãªæ å ±ããªã¢ã«ã¿ã¤ã ã§äº¤æãããåãªããã¼ã¿ãã¼ã¹ãã§ã¯ç¡ãã¤ã³ã¿ã¼ããããå§ã¾ãã¤ã¤ããæ代ã§ããã
ã¾ã FacebookãTwitterãã¾ã æ¥æ¬èªçã¯ããã¾ãããï¼è¿½è¨:ãã¸ã¬ã¬ã¨çµãã§Twitteræ¥æ¬èªçãå§ã¾ã£ãã®ã4æ23æ¥ãªã®ã§ãããã¯å ¥ç¤¾åå¾ã®è©±ã誤解ãæã表ç¾ã§ããããªãã) YouTubeã¯Googleã«è²·åãããåã§ãã¹ããã¨è¨ãã°æå§å¼ã¿ããããã«ã«WindowsCEãå¤ãã®äººã家ã§ã¯Tridentãå¤ã§ã¯NetFrontã§ã¬ã³ããªã³ã°ãããWebã使ã£ã¦ãã¾ããããããªæ代ã«ä½ãåºæ¥ãããä½ããã¹ãããã¾ã ç§ãå«ãå¤ãã®äººã¯çããåºãã¦ã¯ãã¾ããã§ããããæ¥ãã¹ãæ代ã®å¤æããæãããã®æªæ¥ã«Webã«é¢ããå¤ãã®äººãå¸æãæ±ããå¿ãè¸ããã¦è²ããªææ¦ããã¦ãããããªæ°ããã¾ãã
å½æã®åãä½ã£ããã¯ãã«ã¯ãæ°å¹´å¾ã®ä¸çãã¨ãã¦ãããªäºãæ¸ãã¦ããã¾ããã
ä»äººã¨ã®è·é¢ã¯ããããã§ãã£ã¨ãã£ã¨è¿ããªããä»äººã®ä½æ¸©ããããã§æããã
ã½ã¼ã·ã£ã«ãªãã¦å½¢ã¯ã©ãããã空æ°ã®ããã«å½ããåã«ãªã
éè¡ã人ã å ¨ã¦ã«IPã¢ãã¬ã¹ãæ¯ããããªã¢ã«ã¿ã¤ã ã§ã³ãã¥ãã±ã¼ã·ã§ã³ããã®ãæ®éã«ãªã
ã¹ãããå½ããåã®ä»ã§ã¯ã©ããå½ç¶ã®äºã§ããããã£ã6å¹´åã®èªåã«ã¨ã£ã¦ã¯ãä½ãããææ¥ãã ã£ãã®ã§ãã ãµã¨æ¯ãè¿ãã¨ãä½ã§ããªããããªãã®æ¥çã®æ¥ã ã®å¤åã¨ããã®ã¯ãå®ã¯åã大ããç©ãªãã ãªã¨åèªèããããã¾ãã ã¾ãåæã«ãèªåã夢è¦ã¦ããæ代ãã¡ããã¨æ¥ãäºããããå¬ããæã£ã¦ãã¾ãã
ãã¯ã·ã£ã§ãã£ããã¨
ãã¯ã·ã£ã§ã¯æ¬å½ã«å¤ãã®ä»äºãæ å½ãã¾ãããæåã®ä»äºã¯ãã«ãã·ã¹ãã ã®æ¹ä¿®ããã®å¾ã«ã³ãã¥ããã£ãã¬ãã¥ã¼ãªã©ãã³ãã¥ãã±ã¼ã·ã§ã³é¢ä¿ã®ãµã¼ãã¹ã®éçºããªãã¥ã¼ã¢ã«ãå¤ãæ å½ãã¾ããããã©ããµã¼ãã¹ã®ãªãã¥ã¼ã¢ã«ã§ã¯ããã¯ã¨ã³ãããããã³ãã¨ã³ãã¾ã§å¤§é¨åã®ã³ã¼ããæ¸ãç´ãã¾ãããããã¯ã·ã£ï¼ç¬ï¼ãã¨ãã¤ã馬鹿ã«ããããµã¼ãã¹ã§ãããããã§ãå½æã®ãã©ãã£ãã¯ã¯å¤§ãããæã«æ©ã¿ãæã«è¦ãã¿ã¤ã¤ããæ¬å½ã«æ¥½ããã¦ããç²æã®ããä»äºã§ãããåªç§ãªã¨ã³ã¸ãã¢ã«å²ã¾ãã¦ãããããªãããå¤ããå¦ã¹ãã®ãè¯ãä½é¨ã§ããã
ä¼ç¤¾å¡ã®èº«åã§çµæ§èªç±ã«ä½ã§ããããã¦ããããã®æ¬å½ã«è¯ãçµé¨ã§ãå ¬å¼ããã°ã§èããªã³ã©ã¤ã³ã³ã¼ãã¼ããããèé¦ãããã®ãã¼ãã¦ã§ã¢ããã¯ãå®åã§å ¬éãããããWeb2.0ä¸ã®äººãã¤ããã¨ããã©ã¤ãã¤ãã³ããè²ããªãã³ãã£ã¼ä¼æ¥ã®ä¸ã®äººãéãã¦ãã£ãããå人ã§ä½ã£ãNFCã使ã£ã趣å³ãµã¼ãã¹ãTagletãã絡ãã¦ä¼ç¤¾ã§ãµã¼ãã¹ãä½ã£ã¦TechCruchã«è¼ãã¦ããã£ãããè¨äºã®å·çã§ãåå¼·ä¼ã§ãå¤é¨è¬æ¼ã§ãããã¤ã社åãèè² ã£ã¦å¥½ãåæã«è²ã ãããã¦ãããã¾ããã
4å¹´ç®ã«ã¯ãã¡ãã£ã¨ã¢ã¡ãªã«è¡ã£ã¦ãããã¿ãããªç¡è¶ãªããªã§ããã¯ã·ã£ã«ç±ãç½®ããªãã1å¹´éã·ãªã³ã³ãã¬ã¼ã®ã¹ã¿ã¼ãã¢ãããfluxflexãã«æ ã«åºããã¦ãããã¾ããããã¸ãã¹ã®ç«ã¡ä¸ãããã¡ã¤ãã³ã¹ãªã©ãã¹ã¿ã¼ãã¢ãããæ¥å¸¸ãçµé¨ããä¸ã§ã0ã1ã«ããä»äºãæ°è¦äºæ¥ã®ç«ã¡ä¸ãã¯æ¬å½ã«é¢ç½ãï¼ãã¨ãå¿ããæãããã«ãªãã¾ãããã¾ããé¢ç½ããã¨ãã価å¤è¦³ããåã«ç®ç«ã¤ä¸çºãã¿ã§ã¯ãªããã¡ããã¨ãã社ä¼ã¸ã®å½±é¿ã¨æç¶æ§ãæã£ã¦åãã¦æãå¾ããã®ãã¨ãããµãã«ä¾¡å¤è¦³ã人ç観ãå¤ããã¾ãããæè¡ã ãã§ãªãããã¡ã¤ãã³ã¹ãå«ãã¦èå³ãæã£ã¦å®è·µãå§ããè¯ãæ©ä¼ã«ãªãã¾ããã
帰å½ãã¦ãã¯ã·ã£ã«å¾©å¸°ãã¦ããã¯ãã¤ããã¼ã·ã§ã³ã»ã³ã¿ã¼ã®ç«ã¡ä¸ããããä¸è²«ãã¦æ°è¦äºæ¥ã«åãçµã¿ã¾ãããã©ãããããªããæµ·å¤ã®ãã¼ã±ããã«å¯¾ãã¦ãã¢ããã¼ãã§ããäºæ¥ãé¢ç½ãã¨èããè¨èªã®å£ãè¶ ãããããéçºè æ¯æ´ããããã¯ã¨ã³ããã¨ããäºæ¥é åã«å¯¾ãã¦ããã¯ã·ã£ã®éçºåºç¤ãå ã«ãããDeployGateãã¨ããã¹ããéçºè åãã®ãã¹ããã©ãããã©ã¼ã ãä½ã£ã¦ææ¦ãæã¿ã¾ããã DeployGateã¯ããããã¾ã§93ã«å½ä»¥ä¸ã§ä½¿ã£ã¦ãããããµã¼ãã¹ã«æé·ãã75%以ä¸ãæµ·å¤ã¦ã¼ã¶ã¨ããèªåã®ä½ã£ããµã¼ãã¹ã®ä¸ã§ã¯åãã¦ã®ã°ãã¼ãã«ãªãããã¯ãã«ãªãã¾ããã ã¤ããã¼ã·ã§ã³ã»ã³ã¿ã¼ã§ã¯ä»ã«ãPoPollyãåãã¨ããæ§ã ãªãããã¿ã¤ãã®éçºãè¡ãã¾ãããä¸ã«åºããã®ãåºãªãã£ããã®å ±ã«æ²¢å±±ããã¾ããããã¸ãã¹ãå«ãã¦ä»®èª¬ãç«ã¦ã次ãã次ã¸ã¨ã¢ããä½ã£ã¦ä¸ã®ä¸ã«ã¶ã¤ãã¦æ¤è¨¼ãã¦è¡ãä½æ¥ã¯ãæ¬å½ã«æ¥½ããä»äºã§ããã
å¨è·ä¸ãçµå¶ã®æ¹ã§ã¯è²ã ã¨å¤åãå¤ãã£ããã¯ã·ã£ã§ã®6å¹´éã§ãããã ä»æãè¿ãã°ãä½ã ããã ã§ææ義ã§ãå¿ãã楽ããã£ãç´ æµãªçµé¨ã ã£ãã¨æãã¾ãã 社å å¤åãããè¯ã人éã«åºä¼ãã¦ãä¸ç·ã«è¯ãä»äºãåºæ¥ã¦æ¬å½ã«å¹¸ãã§ããã
ããããä½ããã®ï¼
ç¾å¨ã¯éè·æç¶ããçµããããã¤ã¨ãªã¢ã®San Brunoã«å®¶ãåãã¦å¦»ã¨ä¸ç·ã«æ®ããã¦ãã¾ãã
æ°å©æ©ã ãç¡è·ã«ã¸ã§ããã§ã³ã¸ã¨ãã大å¤åé¡ãªç¶æ³ã§ã¯ããã®ã§ããããã®ãããªç¶æ³ã«ç解ã示ãã次ã®ææ¦ã«åãã¦å¿æ´ãã¦ããã¦ãã妻ã«å¿ããæè¬ãä¼ãããã¨æãã¾ããï¼æ¬å½ã«ãããã¨ãï¼ï¼
ããããåãçµã¿ããã¨èãã¦ããã®ã¯ãWebã¨ã¹ããã§ãã£ã¦ããæè¡ã使ã£ã¦ããã£ã¸ã«ã«ãªä¸çã®ç¤¾ä¼çåé¡ã解決ããã¨ããäºã§ãã ããã¾ã§å人çãªæ³ããªã®ã§ãããèªåã¨ãã¦ã¯ããã¼ãã£ã«ã®ä¸çã¯çµæ§ååããåã£ããã¨ããæè¦ãæã£ã¦ãã¾ãã ä»ã¾ã§ãç§éã¯Webã®ä¸çãã¹ããã®ä¸çã¨æè¡ãæã£ã¦è²ã ãªèª²é¡ã解決ãã¦æ¥ã¾ããã ã¾ã ã¾ã Webãã¢ããªã使ãããããã®ã¸ã¨é²åãç¶ãã¦ããã¨æãã¾ããããã以ä¸ã«ããã®ä¸çã«ã¯ç»é¢ããåºã¦ããªãã¨è§£æ±ºã§ããªãåé¡ããã¾ãã«ãå¤ããã¾ãã
ã¾ãã2008å¹´ã®Webæ¥çã¨åãããã«ãMakerâs MovementãIoT(Internet of Things)/IoE(Internet Everythig)ã¨å¼ã°ããä¸çã§ã確å®ã«å¤åãèµ·ããã¤ã¤ããã¨è¨ãã®ããã¤ã¨ãªã¢ã«ããã¨èã§æããã¨ããäºãããã¾ããå®éã®ã¨ãããç¾æ®µéã§ã¯ãä½ã£ã¦ã¿ãã以ä¸ã®ãã®ã§ã¯ãªãããããã¾ããããæããã«ãã¦ãã¦ããã¾ã£ã¦ãå°æ £ãã¦ããã¦ããããã¯ããã¸ãã¹ãåé¡è§£æ±ºãå®ç¾ããï¼ã¤ã®æ段ã¨ãã¦ååã«æ¦ããã¬ãã«ã«æçãã¦ãã¦ããã¨æãã¾ããããã¯ã¾ãã§ãåãªããã¼ã¿ãã¼ã¹ã§ãã£ãã¤ã³ã¿ã¼ãããããã³ãã¥ãã±ã¼ã·ã§ã³ãã©ãããã©ã¼ã ã«å§¿ãå¤ãã¦ããéç¨ã追ä½é¨ãã¦ããããã§ãã ä»å¹´ï¼æã«ã©ã¹ãã¬ã¹ã®IoTããã«ã½ã³ã§åªåãã¦èªä¿¡ãå¾ãã¨ããã®ã大ããã®ã§ããã2009å¹´ã®èé¦ãã以éã5å¹´è¿ã趣å³ã§ãã£ã¦ãããã¼ãã¦ã§ã¢åéã§ã®èå³ããããããä»äºã¨ãã¦å®æ¦ã«ç§»ãã¦ãããé ãªããããªããã¨èãã¦ãã¾ãã
é£ãç©æµãåæµã決æ¸ãå®å ¨ããªã©ãªã©ãä»ã¾ã§Web&ã¹ããã¨ã³ã¸ãã¢ãå¹ã£ããããæè¡ãUXã®ãã¦ãã¦ãç¨ããã°ãã¡ãã£ã¨ããããã¯ã§ãã£ã¨ä¾¿å©ã«ããã£ã¨ç´ æµã«ãªãäºã¯å±±ã®ããã«ããã¾ãã次ã¯ãããã£ãäºæ¥é åã«ã身ãæãã¦ã¿ãããªã¨èãã¦ãã¾ãã ä»ãå°ããã¤ã§ã¯ããã¾ããæºåãé²ãã¦ãã¾ãã®ã§ããç¥ããã§ãã段éã«ãªãã¾ãããæ¹ãã¦ãå ±åããã¦é ãããã¨æãã¾ãã
æå¾ã«
ãµã³ãã©ã³ã·ã¹ã³ã§å ¥ç±ãã¾ããããçµå©å¼ï¼æ«é²å®´ã¯æ¥æ¬ã§ããäºå®ãªã®ã§ãçæ§ãããããé¡ããã¾ãï¼
ããã§ã¯ãä½ãé¢ç½ãã話ãããã¾ãããããã¤ã§ããæ°è»½ã«ãé£çµ¡ä¸ããã ä»å¾ã¨ããã©ããå®ãããé¡ããããã¾ãã
WebPayLiteã使ã£ã¦iOSããç°¡åã«æ±ºæ¸ç¨ãã¼ã¯ã³ãä½æãã
ãã®æ稿ã¯WebPay Advent Calendar 2013ã®18æ¥ç®ã®è¨äºã§ãã
- 17æ¥ç®: ActiveMerchantãWebPayã§ä½¿ã£ã¦ã¿ãã
- 19æ¥ç®: TBD
WebPayLiteãæ¹è¯ãã¦ã¿ã
ããã«ã¡ã¯ï¼WebPayã¢ããã³ãã«ã¬ã³ãã¼3æ¥ç®ã§ãWebPayLiteã使ã£ã¦iOSããç°¡åã«ã¯ã¬ã¸ããã«ã¼ã決æ¸ãããã¨ããè¨äºãæ¸ããã¨ãããã·ã¼ã¯ã¬ãããã¼ã使ã£ã¦ã¯ã©ã¤ã¢ã³ããµã¤ãã§æ±ºæ¸ãããå®è£ ãè¯ããªãã£ãã®ãããªããè¨äºãå¹²ããã¦ãã¾ã£ãæã«å°å³ã«è½ã¡è¾¼ãã§ããããããã§ãã( ï¼âï¼)
ã¨ã¯ãããè½ã¡è¾¼ãã§ãã¦ãä»æ¹ãªãã®ã§ãä»åã¯ç§ã®ä½ã£ããWebPayLiteãã¨ããObjective-Cåãã®è»½éWebPayã¯ã©ã¤ã¢ã³ãã»ã©ã¤ãã©ãªãæ¹è¯ããã¯ã©ã¤ã¢ã³ããµã¤ãã§ã®ãã¼ã¯ã³åã«ç¹åãããå®è£ ã«å¤æ´ãã¾ããã®ã§ç´¹ä»ãããã¨æãã¾ãã
WebPayLiteã®ä½¿ãæ¹
WebPayãWebPayLiteã®ç´¹ä»ã¯ååã¨å¤æ´ãããã¾ããã®ã§ãWebPayLiteã使ã£ã¦iOSããç°¡åã«ã¯ã¬ã¸ããã«ã¼ã決æ¸ããããåèä¸ããã ããã§ã¯ãWebPayLiteã使ã£ã¦ã«ã¼ãæ å ±ãã¯ã©ã¤ã¢ã³ãã¢ããªãµã¤ãã§ãã¼ã¯ã³åããæ¹æ³ãç´¹ä»ãã¾ãã WebPayLiteã«ã¯ãµã³ãã«ã®iPhoneã¢ããªã®ããã¸ã§ã¯ããä»éãã¦ãã¾ãã®ã§ããã¡ããåèã«ããªããèªã¿é²ãã¦ä¸ããã
1. ãã¡ã¤ã«ãããã¸ã§ã¯ãã«è¿½å ãã¾ãã
WebPayLiteãGithubããå ¥æãã¦ããWebPayLite.hãã¨ãWebPayLite.mããããªãã®ããã¸ã§ã¯ãã«è¿½å ãã¾ããããªã¼ã®ã«ã¼ãã«çªã£è¾¼ãã ãã§OKããã«ãã¿ã¼ã²ããã¸ã®è¨å®ãå¿ããã«ï¼
2. ViewController.hã«ãã¤ã³ãã¼ã宣è¨ã¨ããªã²ã¼ã宣è¨ãã¯ã©ã¹å¤æ°ã®å®ç¾©ã追å ãã¾ãã
ãã¼ã¯ã³åæ©è½ãå®è£ ããViewControllerã®ããããã¡ã¤ã«ã«ãWebPayLiteã®ã¤ã³ãã¼ã宣è¨ãã³ã¼ã«ããã¯ã®ããªã²ã¼ããåãåãããã®ããªã²ã¼ã宣è¨ãWebPayLiteã®ã¤ã³ã¹ã¿ã³ã¹ãæ ¼ç´ããã¯ã©ã¹å¤æ°ã®å®ç¾©ã追å ãã¦ãã ããã
#import "WebPayLite.h" @interface ViewController : UIViewController <WebPayLiteDelegate>{ WebPayLite *wpl; }
3.åæåå¦ç
ViewController.mã®å®è£ ãã¡ã¤ã«å´ã«ãåæåå¦çã追å ãã¾ãã 大æµã®å ´åãviewDidLoadedã¨ãã«è¿½å ããã°åé¡ãªãã¨æãã¾ãã å 容ã¯ã¤ã³ã¹ã¿ã³ã¹ã®ä½æãããªã²ã¼ãã®ç»é²ãWebPayã®å ¬éå¯è½éµã®ç»é²ã§ãã å ¬éå¯è½éµã®ãã¼ãã³ã¼ãã£ã³ã°ãæ°ã«ãªãå ´åã¯ããã¼ãã§ã¼ã³ãªã©ãå©ç¨ãã¦é©åã«ä¿è·ãã¦ãã ããã éµãè¨å®ããããããã£ã¯ãsecretKeyããapiKeyã«å¤æ´ã«ãªã£ã¦ããã®ã§ã注æãã ããã
//WebPayLite Initialize wpl = [[WebPayLite alloc] init]; wpl.delegate = self; wpl.apiKey = @"YOUR_PUBLIC_KEY";
4.ãã¼ã¯ã³å
ããã¾ã§ããã°å¾ã¯ãã¼ã¯ã³ä½æã¡ã½ãããå¼ã¶ã ãã§ããcreateTokenã¡ã½ããã§ãã¼ã¯ã³ã®ä½æãã§ãã¾ããåºæ¬çã«ã¯WebPayã®APIå¼ã³åºãæã®ãã©ã¡ã¼ã¿ããã®ã¾ã¾NSDictionaryã§ä¸ããã°ããã ãã®èãã©ãããªã®ã§ãWebPayã®APIããã¥ã¡ã³ããè¦ãªããèªç±ã«å¼ã³åºãã¦ãã ããã
NSDictionary *params = @{ @"card[number]" : @"4242424242424242", @"card[exp_month]" : @"12", @"card[exp_year]" : @"18" , @"card[cvc]" : @"123", @"card[name]" : @"KYOSUKE INOUE", @"description" : @"Test Tokenize" }; [wpl createToken:params];
5. ã³ã¼ã«ããã¯ã®å®è£
å¿ è¦ã«å¿ãã¦WebPayLiteDelegateã®å種ã³ã¼ã«ããã¯ãViewControllerã«å®è£ ãã¦ãã ãããå¼æ°ã¨ãã¦æ¸¡ãããjsonã¯NSStringã§ãã®ã§ãNSJSONSerializationãªã©ã使ã£ã¦å¿ è¦ãªãã¼ãèªã¿åã£ã¦ä¸ãããæ»ãå¤ãªã©ãåºæ¬çã«ã¯WebPayã®APIããã¥ã¡ã³ãã®éãã§ãã ããã§ã¯ãWebPayLiteDelegateCompletedãåãåã£ã¦ãä½æãããã¼ã¯ã³ãåå¾ãã¦ã¿ã¾ãã
- (void)WebPayLiteDelegateCompleted:(NSString *)jsonBody { NSDictionary *jsonObject = [NSJSONSerialization JSONObjectWithData: [jsonBody dataUsingEncoding:NSUTF8StringEncoding] options: NSJSONReadingAllowFragments error:nil]; NSString *token = [jsonObject objectForKey:@"id"]; UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Succeed!" message:[NSString stringWithFormat:@"Token: %@",token] delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil]; [alert show]; }
6. ãã¼ã¯ã³ããµã¼ãã«éä¿¡ãããµã¼ãã¼ããç§å¯éµã§èª²éããã
ããã¾ã§ããã°å¾ã¯ç°¡åã§ããWebPayLiteã§ä½æãããã¼ã¯ã³ãããªãã®ãµã¼ãã«éä¿¡ããç§å¯éµã使ã£ã¦é¡§å®¢ã®ä½æã課éãªã©ãè¡ã£ã¦ä¸ãããWebPayã«ã¯RubyãPHPãPythonãªã©ã®å種è¨èªãã¤ã³ãã£ã³ã°ãããã¾ãã®ã§ããµã¼ãã¼ãµã¤ãã®èª²éã®å®è£ ã¯ã¨ã¦ãç°¡åã§ãã詳ããã¯ä»ã®WebPayã¢ããã³ãã«ã¬ã³ãã¼ããåèãã ããã
ã¿ããªã§æ¥½ãããã¼ã¯ã³æ±ºæ¸ï¼
ãããªæãã§ãçãããã§ããã ããã¼ã¯ã³æ±ºæ¸ãè¡ãããã«å¿ããã¾ãããããã¼ã¯ã³æ±ºæ¸ã¯ã客ããã®æ±ºæ¸æ å ±ãå®ãã ãã§ãªããã¢ããªãä½ãããªãèªèº«ã®ä¸å®ãåãé¤ãã楽ãã決æ¸æ©è½ãå®è£ ã§ããããã«ãªãã¾ãã WebPayLiteã¯Githubã§ãMITã©ã¤ã»ã³ã¹ã«ã¦å ¬éä¸ã§ãããèªç±ã«ã使ãä¸ããï¼ãã«ãªã¯ã¨ã¹ãæè¿ã§ãã
ããã§ã¯ï¼
Squareãæ¿èªãããã®ã§çéã§æ±ºæ¸ãã¦ã¿ã
Squareã¤ãã«æ¥æ¬ä¸é¸ï¼ã®ãã¥ã¼ã¹ãèããç´å¾ã«ç³ãè¾¼ãã§ããæ¥æ¬ã®ã¢ã«ã¦ã³ããä»ææ¹ãç¡äºæ¿èªãããã®ã§ãçéã§æ±ºæ¸ã試ãã¦ã¿ã¾ããï¼
ãã¡ãããã¾ã ãªã¼ãã¯å±ãã¦ããªãã®ã§ãããã¢ã¡ãªã«ã§è²·ã£ããªã¼ãï¼æ§çãæ°çã両æ¹ï¼ãåé¡ãªã使ããã®ã§ãããã使ãã¾ããã
èµ·åç»é¢ã§ãããã¢ã¼ã¨ãçµããã¨ããããç»é¢ã«ãªãã¾ãã
é»åã¿ããã§ãããããã§åååã¨ãå¤æ®µãæã¡è¾¼ã¿ã¾ããç»åãä»ããã¾ããï¼å¥ã«ç©ºæ¬ã§ãããï¼
ãã¡ãããï¼ãæ¼ãã¦è¤æ°ã®ååãä¸ç·ã«æ±ºæ¸ããã®ãOKãæä½æ±ºæ¸éé¡ã¯ï¼ï¼ï¼åããã§ãç¾éã§åããã¦æ±ºæ¸ãããã¨ãã§ãã¾ãï¼ã¯ã¬ã«æ±ºæ¸åããé¤å¤ãããï¼
ãã£ãããªã®ã§åçãæ®ã£ã¦ã¿ã¾ãããï¼
ã¹ã¯ã¨ã¢å½¢ç¶ã«åååçãæ®å½±å¾ã«ã¯ãªãããã¾ãã
ååã®æã¡è¾¼ã¿çµäºãåçæ®å½±ãé¤ãã°ãããã¾ã§ãããæ°ç§ã§ãï¼ç´ æ´ãããã
ããã§ãªã¼ãã¼ãæ¥ç¶ãã¦ï¼æ¥ç¶ããã¨èªèããããã¡ãªã¿ã«ããªãã楽天ã¹ãã¼ããã¤ã§ãèªèãããï¼ç¬))
ã«ã¼ããã¹ã¯ã¤ãï¼ï¼ï¼ï¼ï¼
ãã ã¡ã«ãªã¼ã½ãªï¼æ¿èªï¼ä½æ¥ãéå§ãã
æ¿èªå®äºï¼ãµã¤ã³ãè¨å ¥ããç»é¢ãåºã¾ãã
ãµã¤ã³ãæ¸ãã¦
決æ¸å®äºã§ãï¼æ©ãï¼ï¼ï¼
ã¬ã·ã¼ãã¯SMSãã¡ã¼ã«ã§åãåããã¨ãã§ãã¾ãããçç¥ãããã¨ãã§ãã¾ãã
ã¡ã¼ã«ã§éããã¦ããã¬ã·ã¼ãã¯ãããªæãï¼
ã¨ã«ããç°¡åï¼ããã¯æ¬å½ã«ç´ æ´ãããã
ãããªç´ æµãªã¨ã¯ã¹ããªã¨ã³ã¹ãæ¥æ¬ã§ããããã誰ã§ãæå
ã«æã¦ãæ代ãããã¨æãã¨ãã¯ã¯ã¯ã¯ãã¾ããï¼ï¼ï¼
ã¡ãªã¿ã«å é±æ«ã®MakerFairï¼ ã·ãªã³ã³ãã¬ã¼ã»ãµã³ãããªã§ã¯ãæè¸ã®ãã¶ã¼ã®ã»ã¨ãã©ã®ãåºã§Squareã使ãã¦ã¯ã¬ã«ã§è²·ãç©ãã§ãã¾ãããæ£ç´ããã£ãã
é²å¤©ã®æºã®å³ä¸ã«Squareã®ãã¼ã¯ãè¼ãã¦ãã¾ããï¼
æ¥æ¬ã§ä½¿ããªãã¢ã¡ãªã«ã³ã¨ã¯ã¹ãã¬ã¹ãªã©ã使ãã¾ããæ¥æ¬ã§ä½¿ããªãã®ã¯ãããããJCBã使ããªãããã¨ããã®ãçç±ã ã¨æããã¾ããæ¥æ¬ã®ã¢ã¡ãã¯ã¹ã¯JCBã®ãããã¯ã¼ã¯ã§æ±ºæ¸ããã®ã§ãããJCBã¯æ¥æ¬ã®ä¼ç¤¾ã¨ãããã¨ããã£ã¦ããªã¹ã¯ãèªãããã¾ã ã¾ã ãã®é åã¯æ§åè¦ãªã®ã§ããããæ©ã使ããããã«ãªãã¨ãããªï¼ï¼
æ¥æ¬ã§ãããªããå³å£²ä¼ï¼ã¬ãã®ã³ãã±ã ã¨äººï¼åç·çã«ãã©ã³ã¶ã¯ã·ã§ã³ãæããªããã ãã©ï½ï¼ãããç°èã®é²å¤©ã®å «ç¾å±ã§éèè²·ãã¨ãã¾ã§ããã¹ã¦ã¯ã¬ã«æ±ºæ¸ã使ããæ代ããããããã«æ¥ã¦ãã¾ãï¼
ã¡ãªã¿ã«ã¯ãªã¹ã»ã¢ã³ãã¼ã½ã³ã®MAKERSã«ã¯ãSquareãã©ããã¦çã¾ããããã¿ãããªäºãæ¸ãã¦ãã£ããããã®ã§ãèå³ããã人ã¯ä¸åº¦èªãã§ã¿ãã¨é¢ç½ãã§ããããããã§ããï¼
Android APKã¨ããapkæ å ±ãåå¾ããgemãä½ã£ã
Android APKã¨ããgemãä½ã£ã¦rubygemsã§å ¬éãããï¼
Androidã®ããã¥ãã§ã¹ããã¡ã¤ã«ãèªãã§ãã¢ããªåãããã±ã¼ã¸æ å ±ãåå¾ã§ãã¾ãã
gemä½ãã®ã¯åãã¦ã ã£ãã®ã ãã©ãcpanããæç¶ç°¡åã§ããã£ãã
rake build -> rake releaseã¨ã³ãã³ããæã¤ã ãã§ä¸çºå ¬éãããã¯ãã°ãã
ã¨ãããã¨ã§ãèå³ã®ããæ¹ã¯ãããããã°ã©ããã
RubyGems - kyoro/android_apk
https://rubygems.org/gems/android_apk
使ãæ¹ã¯ã·ã³ãã«ã§
require 'android_apk' apk = AndroidApk.analyze("/path/to/apkfile.apk") apk.nil? #This file is invalid apk file. apk.label #Application Name apk.package_name #Package Name apk.icon #Included Icon file in apk file apk.version_code #Version Code apk.version_name "Version Name
ãããªãããï¼
ãæ¿å®ãéæè¾¼ã¿440åï¼MacBookç¨Thunderbolt(Mini Display Port)-HDMIå¤æã±ã¼ãã«ããããã
ããããã¢ãã¤âMacã®å¯¿å½ã£ã¦OSã¢ãããã¼ãï¼ååã¾ã§ã ãããããã£ããã
ããã«ã¡ã¯ãMountain Lionãçºè¡¨ããããããã«ããããMac Book Air 11ã¤ã³ã(2010å¹´å代ã¢ãã«ï¼ãè²·ãæããããªã£ã¦ããããããã§ãã
ç§ã¯ããããããã¤ã¹ããµãã©ã¤åãè²·ãï¼ããã¦å¤±æãã¦å¾æï¼ããã®ã趣å³ãªã®ã§ãããä»åã¯çãããããã¯åãã³ã¹ããè¯ãã¦æ°ã«å ¥ã£ãï¼ãã¨æã£ãååããã£ãã®ã§ç´¹ä»ãã¾ãã
Â
MacBookæã¡ãªãå ¨ç¨®é¡ã²ã¨éãæã£ã¦ãããããã£ã¹ãã¬ã¤å¤æã±ã¼ãã«ï¼é称ããã£ã½ï¼
Macã¨ã¢ãã¿ãæ¥ç¶ããã¨ãã«ä½¿ãããã£ã¹ãã¬ã¤å¤æã±ã¼ãã«ããã£ã½ï¼å°»å°¾ï¼ã¯ã¿ãªãããæã¡ã§ããï¼
ããã£ã¦å°å³ã«ç¨®é¡ãVGAã¨DVIã®ï¼ç¨®é¡ãããããåå¼·ä¼ã§ã®ãã¬ã¼ã³ãè·å ´ãªã©ã使ããã¨æã£ãæã«æã£ã¦ããã®ãå¿ããããã©ããã«ç½®ãå¿ãã¦ãªããã¡ãã£ããããã¤ã®ã¾ã«ãå人ã«å¥ªããã¦ãããæã¡éã¶ã®è²ã
é¢åãããã§ãããã
大ç»é¢ã ã¨è§£å度çã«DVIæ¥ç¶ãè¯ãããã§ããã¬ã¼ã³ã®ããã¸ã§ã¯ã¿ã ã¨å¤§æµVGAã ãããã®ãã³ã«èª°ãã«åããã®ãç³ã訳ãªãããÂ
Â
æè¿ã¯åã¯å®å
¨ã«MacBookã ãã§çæ´»ãã¦ãã®ã§ã
ãã§ããã°å°»å°¾ãæã¡éã¶ããããªãã ãã£ã¹ãã¬ã¤å´ã«å
¨é¨ã«å°»å°¾ãè£
åãã¦ã尻尾ãæã¡æ©ããªãçæ´»ãããããªã¼ãã¨æã£ã¦ããããã§ãã
ã§ã尻尾ã£ã¦æå¤ã¨é«ããã§ããããã¢ããã«ç´æ£åã ã¨3400åããã¾ãã
家ã®ãã¹ã¯ããªãã³ã°ã®ï¼ï¼ã¤ã³ã液æ¶ãã¬ããå¯å®¤ã®ããã¸ã§ã¯ã¿ãè·å ´ã®ã¢ãã¿ã
ï¼ã¤è²·ã£ãã13600åããããã«ããã¯ç¡ãï¼ï¼ã
ãè²·ãå¾ãªäºæåã使ããï¼
以ä¸ã®ãããªç¶æ³ãããå®ãäºæåãç¡ãããªãã¨æ¢ããããæ®éã«ããã¾ããã
ãªãã¨ãå¤æ®µãéæè¾¼ã¿ï¼ï¼ï¼åï¼ãããå®å¿ã®Amazonããã§ãã
Mini Display Portç¨ã¨æ¸ãã¦ããã¾ããããã¡ããThunderboltã§ã使ãã¾ããï¼
Â
ã§ãããã¤ãæ´ã«ããã®ã¯ãHDMIæ¥ç¶ã¨ããæãªãã§ãã
HDMIæ¥ç¶ãããã¨ããªãã¨é³å£°ãã¢ãã¿å´ããåºåã§ãããã§ããã¤ã¾ãã液æ¶TVãªã©ã«ç¹ãã°ãMacBookãã大ç»é¢ã§é³å£°ãä¸ç·ã«ã¢ãã¡åçã§ããããã¾ããæè¿ã®ãã«ãã¤ãã¸ã§ã³ã®å¤§å液æ¶TVã¯1920x1080ã®è¡¨ç¤ºã«ã対å¿ãã¦ãã®ã§ãHDMIæ¥ç¶ã«ããã°ãã«ãã¤ãã¸ã§ã³ã¢ãã¿ã¨ãã¦æ®éã«ä½¿ãã¾ããç®ããã«ãã«ãããã¨ãããã¾ããã大ç»é¢ã«ã¿ã¼ããã«ã表示ãã¦ãããã°ã©ã ãæããªããããªãã³ã°ã§ãã¢ããã¨ãã§ãã¡ããã¾ããããã便å©ãããã§ï¼ï¼ï¼åã¯ããªããå¾ã§ãã
Â
ãã¼ãã©ã³ããããªãã¦ãããã¦ååãèããäºã®ããæ¥æ¬ã®ã¡ã¼ã«ã¼ã®è£½åãè¯ãï¼ã¨ãã人ããå®å¿ãã ãããHDMIå¤æã¢ããã¿ã®äºæåã£ã¦çµæ§ããããªç¨®é¡ããã£ã¦ããã¨ãã°ãµãã©ã¤åã§æåãªã¨ã¬ã³ã ã®ååã ã¨ï¼ï¼ï¼ï¼åããããã©ããã¯ã¹ã ã¨ï¼ï¼ï¼ï¼åããããããã£ãããã¾ãã
Â
Â
å¤æã¢ããã¿ã¼ã ã¨HDMIã±ã¼ãã«ãå¥ã«å¿ è¦ã§ç ©ãããâ¦ã¨æã人ã«ã¯ãHDMIã±ã¼ãã«ã¨å¤æã¢ããã¿ã¼ãä¸ç·ã«ãªã£ãã¿ã¤ããããããã§ããã±ã¼ãã«ã®ä¸æ¹ãMiniDisplayPortï¼Thunderboltã§ã使ãããï¼ï¼ ããä¸æ¹ãHDMIã«ãªã£ã¦ãã®ã§ããã®ã±ã¼ãã«ä¸æ¬ã§TVã¨Macãã¤ãªãäºãã§ãã¡ããã¾ãï¼ä¾¿å©ã§ãããã
Â
Â
ã»ãã«ãäºæåã®å°»å°¾ã£ã¦ããããªç¨®é¡ããã£ã¦ãDVIãªãï¼ï¼ï¼åãVGAãªã1518åã§éæè¾¼ã¿ã§ããå
±ã«ãã©ããã¯ã¹è£½ã§ãã
ããããã¯DVIã®ï¼ï¼ï¼åã®æ¹ã§ããã¡ãã¯ãªãã¨DVIâIãåºåã§ãã¾ããã¤ã¾ããå¤æã¢ããã¿ã§DVIã«ãVGAã®ã¢ããã°ãã£ã¹ãã¬ã¤ã«ã両æ¹åºåã§ãããã§ããä¸ç³äºé³¥ï¼
ï¼Appleã®ç´æ£DVIå¤æã±ã¼ãã«ã¯DVI-Dãªã®ã§VGAã«å¤æã§ãã¾ããï¼Â
Â
å®ããã製åã«ã¯æ³¨æ
ããã«ä¸ããååã¯å
¨ã¦å®éã«èªåã§è³¼å
¥ãã¦ãããã¯ãããï¼ãã¨æãããã®ãããã¯ã¢ãããã¦ãã¾ãããã©ããã¯ã¹ã®è£½åã¯ãæã®å®ãæ¹ã¯æç·ããããã®ã§ãããã§ç´¹ä»ããPL-MDPVG02ã®æ¹ãããããã§ãã
ä»ã«ãæ¢ãã°å®ãå¤æã±ã¼ãã«ã¯æ²¢å±±åºã¦ããã®ã§ãããç¹ã«VGAã§å®ããããã¼ãã©ã³ãã®ç©ã¯ ãçªç¶æ ããªããªã£ãããæç·ãããã¨å¤§å¤ã§ãå®éã«ç§ãä½ç¨®é¡ãè³¼å
¥ããã®ã§ãããçµå±ã¯å®ç©è²·ãã®é失ãã§ããã
Â
çæ´»åããã¹ã¦Mini Display Portåï¼
ã¨ããããã§ãAppleç´æ£å°»å°¾ãï¼åè²·ãå¤æ®µã§ãäºæåãªãHDMIãDVIãVGAã¨ï¼ç¨®é¡å
¨é¨è²·ãå ããã¾ãï¼ï¼ç¬ï¼
èªåã®çæ´»åã®ã¢ãã¿ããã¹ã¦MiniDisplayPortåããããç§ã¯æ¥ã
ã®çæ´»ã幸ãã«ãªãã¾ãããã©ã³ã代ããå®ãMacã®å°»å°¾ãæ°è»½ã«è²·ãå ãã¦ãããªããç´ æµãªHackLifeãå®ç¾ãã¦ã¿ã¾ãããï¼
Â
å ¨ä¸çã®å人ããå±ããæé«ã®èªçæ¥ã¡ãã»ã¼ã¸
åãããããã£ã¨æ¬²ããã£ããªãªã³ãã¹ã®PEN mini(E-PM1)ã
ç§ã®27æ³ã®èªçæ¥ã«è´ã£ã¦é ãã¾ããï¼ï¼
æ§ãã®ã³ã³ãã¯ããã¸ã¿ã«ä¸ç¼ï¼ããããã ãã§ã幸ãä¸æ¯ã§å¬ããççºãªã®ã§ããã
ãªãã¨äºæ³ãããªããµãã©ã¤ãºãï¼
æ©éæ®ã£ãåçããã¬ãã¥ã¼ãã¦ããã
ãããããããããã¡ãã£ã¨æ»ãã¦ã¿ã¦ãã ããï¼ã
ãï¼ï¼ï¼ã
ã£ã¦ãªããªããããã¬ãã¥ã¼ãæ»ãã¦ãã㨅
ãï¼ï¼ï¼ï¼ï¼ï¼ï¼ï¼ï¼ã
ãªãã¨ãæ¥æ¬ä¸ããããã¢ã¡ãªã«ã®å人ãå«ãã¦ã
ä¸çä¸ã®å¤§å¥½ããªå人ããã®ãèªçæ¥ã®ãç¥ãã¡ãã»ã¼ã¸ãï¼ï¼
ã·ã§ã¢ãã¦ã¹ã®ã¿ããªã ããã¨æãã¯ã
ååã®ããã¡ããããã¸ã§ã³ããããããã¾ã§ã
ããã«åæµ·éã®å人ãå®å®¶ã®æ¯ããï¼ã°ãã¡ããï¼ãããã
æªè¸ã®ãã¾ãããããé«å°ã®ããã¡ãããæ©å¸«ã®å²¡ç°å
çããå¾è¼©ã
Googleã®å°è¥¿ããã¨ããµã¤ãã¼ã®ããã¨ãã¯ããã¾ãã¦ã®æ¹ï¼ï¼ï¼ï¼ç¬ï¼
ã¢ã¡ãªã«ã®fluxflexã¡ã³ãã¼ãã«ã¼ã ã¡ã¤ãã®å人ããããããã¾ã§ï¼ï¼ï¼ï¼
ããæåãã¦æ³£ãã¦ãã¾ãã¾ããã
ãªãã¦ã½ã¼ã·ã£ã«ããªãã¦æ¸©ããï¼
ãããªã«èªçæ¥ãç¥ã£ã¦ããã£ãã®ã£ã¦æ¬å½ã«åãã¦ã
ãããªã«ã大åã«ãã¦ãããã¦ã俺ã¯æ¬å½ã«å¹¸ãè
ã§ãã
å»å¹´ã®ï¼ï¼æ³ã®èªçæ¥ã¯ãæ¬å½ã«ãããããã£ãã®ã§ãã¢ã¡ãªã«ã§ä¸äººã¼ã£ã¡ã§ã
誰ã«ããã¼ã«ã«ããç¥ã£ã¦ããããªããã¿ãããã®ã§ããã
ããããï¼å¹´å¾ã«ãããªã«ã幸ãã«å
ã¾ãããªãã¦æ³åãããªãã£ã…ï¼
ã¿ãªããæ¬å½ã«ãããã¨ãã
ããã¦ããèªçæ¥ã®ãè¿ãã¾ã£ã¦ã¦ãã ãããï¼ï¼ï¼ï½
ä»å¹´ãï¼å¹´ãå
¨åã§é å¼µã£ã¦ãããã¨ãããã¾ãï¼
ã©ãããããããï¼ï¼ï¼
å ¨ã¦ã®å人éçºè ã«èªãã§ã»ããã¹ã¿ã¼ãã¢ããã®æç§æ¸ããªã¼ã³ã»ã¹ã¿ã¼ãã¢ãããã®æ¥æ¬èªçãåºããããï¼
ã¢ã¡ãªã«ã§fluxflexã®éçºã«åå ãã¦ããã¨ããã¹ã¿ã¼ãã¢ãããããä¸ã§æãå¤ãã®å¦ã³ãä¸ãã¦ããããããã°”ã¹ã¿ã¼ãã¢ããã®æç§æ¸”ãThe Lean Startupãã®æ¥æ¬èªçã4/16ã«åºããããï¼
ä»ã¾ã§ã½ããã¦ã§ã¢ã®éçºææ³ã«é¢ãã¦ã¯ãã¢ã¸ã£ã¤ã«ãã ã®ããããã¿ã¤ãã¢ããªã³ã°ãã ã®ãè²ã ã¨ãã¦ãã¦ããã¬ãã¸ãçã¾ãã¦ãã¦ã¯è©±é¡ã«ãªã£ã¦ãããããããå人çã«ã¯ãã§ãçµå±ãããã使ã£ã¦ã©ããã£ã¦ãã¸ãã¹ããããããµã¼ãã¹ãéå¶ããã°ããã®ï¼ãã¨ãããäºæ¥ä¸»ã¨ãã¦ï¼ã¾ãã¯ããã¸ã§ã¯ããéå¶ããå人éçºè ã¨ãã¦ï¼ã©ããªãã¬ã¼ã·ã§ã³ãåãã¦ããã°ããã®ããã¨ããç¹ã«é¢ãã¦ã¯ãçµå±ã®ã¨ããè¯ãçãããè¦ç¿ãã¹ãã¢ãã«ãããã³ãã¬ã¼ããå ¨ãåãããªãã¾ã¾ã ã£ãããããªèªåã«ãããï¼ã¤ã®è§£ãä¸ãã¦ãããã®ãããã®ããªã¼ã³ã»ã¹ã¿ã¼ãã¢ãããã ã
ãªã¼ã³ã»ã¹ã¿ã¼ãã¢ããã®ãªã¼ã³(lean)ã¨ã¯ãè±èªã§ãã人ãåç©ããããèã®åãããä½ãç· ã¾ã£ããç©ãããã¨ããæå³ã ããã®æ¬ã§ã¯ã極éã¾ã§å¿ è¦æå°éã«ããè½ã¨ããã¹ã¿ã¼ãã¢ãããçã¿åºãã«ã¯ãã©ããããªãã¬ã¼ã·ã§ã³ãåãã¦ããã°ãããã¨ãããã¦ãã¦ã«ã¤ãã¦ã¾ã¨ãããã¦ããã
ãã®æ¬ã§å¤§åã«ããã¦ãããã¤ã³ãã¯ããã¤ãããã®ã ããå人çã«éããç½®ãã¦ãããªã¨æãã®ã¯ãï¼ï¼¶ï¼°ãçã¿åºãäºããæ¤è¨¼å¯è½æ§ããããã®ã¯ã©ãã¾ã§ãæ¤è¨¼ãããã¨ããã¤ãã¬ã¼ã·ã§ã³ãã¨ã«ããçãããæ¤è¨¼ããå¦ã³æ¹åãããã¨ãæ ããªãäºãã¨ããäºã ã¨æãã
ãã®ä¸ãããï¼ï¼¶ï¼°ã¨ã¯ä½ãã¨ãããã¨ã«ã¤ãã¦ä»åã¯è©±ããã¨æãã
MVPã¨ããã®ã¯ãMinimum Viable productãã®ç¥ã§ãå¸å ´ãã¼ãºãè¿ éã«æ¤è¨¼ã§ããæä½è¦ä»¶ã®å°ããªãããã¯ãã¨ããæå³ã ãä½ãæ°ãããããã¯ããçã¿åºããã¨ããã¨ãããã®ãããã¯ããçµå±é¡§å®¢ã®ãã¼ãºã«åã£ã¦ãããã¨ããæ°ãã価å¤ãåµé ã§ãã¦ãããã¨ããã®ã¯ãã¯ã£ããè¨ã£ã¦çµæè«ã§ãããªãããã£ã¦ã¿ãªãã¨ããããªãäºãå¤ãããã¨ãã°æ°ååã®ç¤¾éããããããã¯ããã¸ã§ã¯ãããã«ã³ã¨æä¸ãããã®ã®ãå ¨ãå½ãããé¿ããã大ã³ã±ãããªãã¦ãã¨ã¯ãå®éã«ãããå¤ãäºä¾ã ããããä½åã®ããä¼ç¤¾ã ã£ãããã¾ãé«ãåå¼·æã£ã¦ãã¨ã«ãªãã®ã ãããã©ãå°ããªã¹ã¿ã¼ãã¢ãããå人éçºè ã«ã¨ã£ã¦ã¯ï¼åã®ãã£ã¬ã³ã¸ã§äººçãè©°ãã§ãã¾ã大å¤ãªåé¡ã ã
ããã§ãä»èªåãã¡ãåµé ãããã¨æã£ã¦ãã価å¤ã®æå°åä½ã¾ã§æ©è½ãåãè½ã¨ãããããã¯ããä½ãããããå¸å ´ã«åãå ¥ãããããå®éã«ãªãªã¼ã¹ããªããæ¤è¨¼ï¼Validation)ããé±èãæãã¾ã§ä½åº¦ãä½åº¦ãã¤ãã¬ã¼ã·ã§ã³ãåãã¦ããããããç¹°ãè¿ããã¨ã§ãæåã®ç¢ºåº¦ãé«ãããã¨è¨ããã®ã ã
ãã®ã¨ããMVPã¨ãããã®ã¨ãããã¿ã¤ãããã¼ã¿çãªããããã¡ããã¡ãã«æ¥æ¬ã§ã¯è¨³ããã¦åãæ±ããã¦ããæãããããã©ãå®éã«ã¯MVPã¯ãããã¨ã¯å¥ã®ãã®ã ã
MVPã®Mï¼ãããã ï¼ã¯æ©è½è¦ä»¶ãçµã£ãããã°ã©ã ã¨ããæå³ã®Mã§ã¯ãªãããã¸ãã¹ããµã¼ãã¹ã¨ãã¦ã®ï¼ã¨ããæå³ã§ãããã¤ã¾ããå¿ è¦æä½éã®æ©è½ããã¸ãã¹ã¢ãã«ãéã£ã¦ããå¿ è¦ããã£ã¦ããã¨ãã°èª²éã¢ãã«ãåæã®ãµã¼ãã¹ã§ããã°ããã®æä½éã®æ©è½ã«å¯¾ãã¦ã¦ã¼ã¶ããéãæ¯æãããã¨ãã仮説ã¾ã§å«ãã¦ï¼ãªãããªã®ã§ã課éã®å®è£ ããã£ããè¡ãããéãã¦ã¼ã¶ããåããªããã°ãã¡ããã¨ããï¼ï¼¶ï¼°ã§ã¯ãªããã仮説ã®æ¤è¨¼ã¯åºæ¥ãªãã
fluxflexã§è¯ã話ãã¦ããã®ã¯ãMVPã¨ã¯ã大ããªè£½åã®ï¼é¨åãã段éçã«ã¤ããäºï¼ãããã¿ã¤ãï¼ã§ã¯ãªããå°ããªå®æãããçµæ¶ãçã¿åºãä½æ¥ã ã¨ãããã¨ã
ã©ããªã«å°ããã¦ãããã®ã§ãã¾ãã¯ãã¸ãã¹ã¨ãã¦å®çµããå°ããªçµæ¶ãçã¿åºãäºã«å ¨åã«ãªãå¿ è¦ããããããã¦ããã®ãããã¯ãã®ä¸ç観ããã£ããçã¿åºãäºãã§ããã°ããã¨ã¯ç©éãæä¸ãã¦çµæ¶ãå¾ã ã«å¤§ãããã¦ããã°ããã®ã ã¨ä¿ºã¯èãã¦ããã
é·ã ã¨èªã£ã¦ãã¾ã£ãããããã ãã§ã¯ä¼ããããªãæ§ã ãªã¹ã¿ã¼ãã¢ããã®ãã¦ãã¦ããã®ï¼åã«éç´ããã¦ããã
å ¨ã¦ã®å人éçºè ã¨ãããã¯ãçç£è ã«èªãã§ã»ããæç§æ¸ãããã®ãªã¼ã³ã¹ã¿ã¼ãã¢ããã ãè±èªçãããªãã£ãã¨ãã¯åãè¦ãã¿ãªãããã¡ãã£ã¨ãã¤æã¿èªã¿ããã¦ããã¤ãã£ãã¬ãã«ã®è±èªåã®ã¡ã³ãã¼ã«è£è¶³ãã¦ããããªããç解ãæ·±ãã¦ããããããªèªã¿æ¹ã§ããå§åçã«å¾ããããã®ãå¤ãï¼åã ã£ãããã ãæ¬å½ã«è¯æ¸ãªã®ã ããæ®å¿µãªããæ´æ¸ãªã®ã§ãå ¨ã¦ã®å人ã«èªãã§ï¼ã¨ãé¡ãããã®ã¯ãããã«æ°ãå¼ããããããªã¨ãããã®ã¿ã¤ãã³ã°ã§æ¥æ¬èªçãåºãã®ã¯ã¨ã¦ããããããæ¨ãå¼µã£ã¦ããã¹ã¦ã®äººã«ãå§ããããã
åãããä¸åº¦ãæ¥æ¬èªã§èªã¿ç´ãã¦ã¿ããã¨æãã
ç´°ãããã¨ã¯ãããã ãï¼ã·ãªã³ã³ãã¬ã¼ã®NFC交éäºæ ã¨éçºã¹ã¿ã¤ã«
æ¥æ¬ã§ãããã¾ãã®SuicaãPasmoï¼æ¥æ¬ãNFCå
é²å½ã¨å¼ã°ãã¦ããã®ã¯ä»ã¯æãç±³å½ã§ãããããã¨NFCã使ãã·ãã¥ã¨ã¼ã·ã§ã³ãå¢ãã¦ãããã¨ãããããã®ï¼å¹´ã§ãã£ããæ¥å¸¸ã«æº¶ãæ··ã¿å§ãã¦ããããã®æ®åé度ã¯ã¨ã¦ãéãã
ï¼ã¾ã å©ç¨è
ã¯ããã¾ã§å¤ããªãã®ã§ãã³ã¢ãã£ãã£åã¨ã¾ã§ã¯ã¾ã è¨ããªããï¼
代表çãªã®ã¯ClipperCardãããã¯ãæ¥æ¬ã®Pasmoã¿ãããªãã®ã§ããã¹ãã«ã«ãã¬ã¤ã³ï¼é»è»ï¼ãè·¯é¢é»è»ã§å ±éãã¦ä½¿ããé»åä¹è»å¸ã ãé¢ç½ããªãã¨æãã®ããå®è£ ãè¶ ç°¡ç´ ã§ãéç¨ããã£ããã¬ã¤ã¸ã¼ãªã¨ããã
ãã¨ãã°ãèªåæ¹æãªãã¦ãã®ã¯ã«ã«ãã¬ã¤ã³ã«ã¯ãªãã
ã«ã«ãã¬ã¤ã³ã¨ããã®ã¯ãã«ãªãã©ã«ãã¢ã®è¥¿æµ·å²¸ããµã³ãã©ã³ã·ã¹ã³ãããµã³ãã¼ã¾ã§èµ°ã£ã¦ãééã§ãè»ãæããªã人ã®ç§»åã§ãã£ã¨ãä¸è¬çãªç§»åæ段ã®ï¼ã¤ã ãåçã§ã¯ãããã«ãããããããªããã©ããããã¢ã¡ãªã«ï¼ã£ã¦æãã§ãããªããã«ã¤ãï¼é建ã¦ã§ãèªè»¢è»ãªãããæã£ã¦ä¹ããã¨ãã§ããè½é³ãé¿ãããªããèµ°ãã
ã§ããã®ã«ã«ãã¬ã¤ã³ãåºæ¬çã«å ¨é¨ç¡äººé§ ã ããã¡ãããæ¹æãªãã¦ãã®ã¯ãªããã©ããã£ã¦ClipperCardã使ããã¨ããã¨ãä¹è»é§ ã«ç½®ããã¦ãã端æ«ã«ã¿ããï¼TAG ONã¨ããï¼ãã¦ãä¹è»å¾ã«ãéè»é§ ã«ç½®ããã¦ãã端æ«ã§ã¿ããï¼TAG OFF)ããã
é¢ç½ãã®ã¯èª²éæ¹å¼ã ãå®ã¯TAG ONæã«ãæ³å®ããããéãæé«é¡ã®æéï¼ï¼ï¼ãã«ãããï¼ãã«ã¼ãããå¼ãè½ã¨ãã¦ãã£ã¼ã¸ãã¦ãããTAG OFFæã«å®åºéåã®æéãæ®ããä¸ã§ãä¸è¦åãè¿éï¼Refound)ãããããã¸ããã®ãããªæãã ãã¤ã¾ããTAG OFFãå¿ããã¨è¿éãããªããTAG OFFãå¿ããæ¹ãæªãã¨ããã¹ã¿ã¤ã«ã
ãããªé©å½ãªä»çµã¿ã¨éç¨ã ã¨ãã¯ã¬ã¼ã ãã¤ãããç¡è³ä¹è»ãã人ãç¶åºããããããªãï¼ï¼ãªãã¦ã¨ã³ã¸ãã¢ã¯æã£ã¡ããããã ãã©ãããã¯éç¨ã§ã«ãã¼ãã¦ãããã«ã¼ã«ãã¨ã¦ãå³ããã®ã ã
ãã¾ã«è»æãããæ¤æããã¦è»å ãåã£ã¦ããã ãã©ããã®ã¨ãã«TAG ONãå¿ãã¦ä¹ã£ã¦ããã¨ããã®ãã£ããæããããä½äººãæããã¦ãã人ãè¦ããã¨ããããã ãã©ãæ¥æ¬ã®æãã¨ãã®ã¬ãã«ã§ã¯ãªããåè»ã¯æå¯ãé§ ã«åè»ããç½°éï¼ï¼ï¼ãã«æãããè¦å¯ãå¼ãã ãããéè»ãã¦é®æããããã©ã¡ããé¸ã¹ã¨æé³´ãããï¼æ¬å½ã«è¦å¯æ¥ã¦ãï¼ããã®ãããæããå¿ ãTAG ONã確èªããç¿æ £ãçããã
ã¢ã¡ãªã«ã®ä»çµã¿å ¨è¬çã«è¨ãããã¨ãªãã ãã©ãåºæ¬çã«èªå·±è²¬ä»»ã¨ããéç¨æ¹å¼ãå¤ããããªæ°ããããééäºæ¥è ã¯åãã ãåãããæ¶è²»è ã¯è¿ãã¦ããããåã ãè¿ãã¦ãããã¨ããæãã
ä¸è¦ä¸è¦ªåã®ããã«è¦ãããã®ä»çµã¿ã ãã©ãå®ã¯ã¨ã¦ããæ¶è²»è ã¨æä¾è ã®è²¬ä»»åçç¹ãæ確ã§åççã ãã¢ã¡ãªã«ã®éç¨ã¯ãã«ã¼ã«ã大ã¾ãã«ãã£ãããããã¦ããã£ããã¨æ±ºãããã§ãç´°ããéç¨ãåé¡ã¯ãåé¡ãçºçããã¨ãã«ãã¬ã¤ã¸ã¼ã«è£éããã£ã¦å¯¾å¿ããã
ã ããããã¨ãClipperCardã®èªèé度ãã¿ãããã¦ï¼ç§ããããããé ·ãå®è£ ã§ãï¼Suicaã®ï¼ï¼ï¼åãããåå¿é度ãæªãï¼ãèªåæ¹æãã¤ã³ãã©ã®æ´åã«ãéãæéããããªãã¦ããã«ã¼ã«ã®å¤§æ ã®ä¸ã§ãã¾ãåãããå°å ¥ãå§ã¾ãã°ãåççãªå®è£ ãã¤ä½ã³ã¹ããªã®ã§ãä¸æ°ã«åºã¾ãã
è¯ãæå³ã§é©å½ããããã¨ã¦ãã¢ã¡ãªã«çã§ããªã¼ã³ãªã¹ã¿ã¤ã«ã ãªã¨æããã ã·ãªã³ã³ãã¬ã¼ã®ã¢ããªãWebãµã¼ãã¹ã®éçºã«ãå ±éãã¦ãããªãã£ã¦æãã
é¢ç½ããã¨ã便å©ãªãã®ããç´°ãããã¨ãèããã«ãã¨ããããå®ç¨åãã¡ããã®ãã¢ã¡ãªã«æµãæ¥æ¬ã®Webãã¢ããªéçºã®ç¾å ´ã¯ãããããæåã®äººãã¡ã¨æ¦ã£ã¦ãããªããã°ãããªãã®ã ã
åé¡ã責任ã¯ããã£ã½ã©å¤§ããªãã®ãæ³å®ãããªãéããèµ·ãã£ãæã«èããã°ãããããããèãæ¹ããæ¥æ¬ã®ç¾å ´ã«ã¯ãã£ã¨å¿ è¦ãªã®ãããããªããã
æå¾ã«ãæè¡çãªãã¨ãæ¸ãã¦ããã¨ãClipperCardã¯NFCã®ç¨®é¡ã§ã¯Type2(MIFARE)ã使ã£ã¦ããæ¥æ¬ã®Suicaã«ä½¿ããã¦ãFeliCaããã¯ä¾¡æ ¼ç«¶äºåã¯ãããããã
ãã¨é¢ç½ãã®ããClipperCardã®Webãµã¤ãã§ãã«ã¼ãã®ã·ãªã¢ã«çªå·ãå ¥ãã¦ãããã«èªåã®ã¯ã¬ã¸ããã«ã¼ããã²ãã¥ããã°ãã¯ã¬ã«å¼ãè½ã¨ãã®ãªã¼ãã»ãªãã¼ãã»ã«ã¼ãã«ãªã£ãããããã¨ã¦ã便å©ã
ä¹è»å±¥æ´ãæ®é«ç¢ºèªããªã³ã©ã¤ã³ã§ã§ãã¡ããã¾ãã
ã¢ã¡ãªã«ã¯ãªã³ã©ã¤ã³ã¨ãªãã©ã¤ã³ããã¾ãçµã¿åããã¦ãµã¼ãã¹ãä½ãã®ãé²ãã§ããªã¨æãããWebã§ã§ãããã¨ã¯Webã§ããã°ãããããï¼ä¾¿å©ã ãå®ããã¹ã±ã¼ã«ãããï¼ãã¨ããã¡ãã»ã¼ã¸ãéæããæããã
å°ãªãã¨ããå ¨PCç¨ã«Pasoriãè²·ãããã£ã¦ä»çµã¿ããã¯ããããåççã ããã
ãã¹åè±ä¼è©±
ä»æ¥ã¹ã¿ãã«è¡ããã¨æ©ãã¦ããããã¼ã ã¬ã¹ã£ã½ã人ã«ãã¹åã§ï¼ã»ã³ãé æ´ã£ã¦è¨ãããã®ã§ãï¼ã»ã³ãã ãï¼ãªããããï¼ã£ã¦è¿ãã¦ãå¤ãã«ï¼ï¼ã»ã³ã硬åããããã
ã¨ããããå½¼ããone more!ãã¨ãè¨ã£ã¦ããã®ã§ãããåãã£ãï¼ã»ã³ãè¨ããããï½ï½ çç±èª¬æãã¦ã¿ï¼ãã£ã¦ããä¼è©±ã®ããåãããããã ãã©ããã®ã¨ãã®ããåããæã£ããã楽ããã£ãã
ã§ãæã£ããã ãã©ãï¼ãã«ããããããããã³ã¼ããããã£ã¦ããã¦ãï¼ï¼åããã話ããããï¼ã£ã¦è¨ã£ãããæå¤ã¨ãã¦ããããããã®ããªãè±ä¼è©±ã®ç¸æã¨èããããæå¤ã¨ã³ã¹ãããããã¨ãæã£ã¦ãã¾ã£ãã
ä»ã«ã¯ãã³ã¼ã«ã»ã³ã¿ã¼ã¨ãéè¡ãç¡æè±ä¼è©±æ室ã¨ãã¦ç§é¸ã ããã
ã¢ã¡ãªã«ã®ãã¹åã§å¾ ã£ã¦ãã¨ããã声ãããããããã¨ãå¤ã (大æµã¯ãAre you chainese?ãã ãã©ï½) æåã®ããã¯æãã¦è©±ãªãã¦ã§ããªãã£ããã ãã©ãæè¿ã¯åº¦è¸ãã¤ãã¦ãã¦æ¥½ãããªã£ã¦ãããªã£ã¦æããããããã¢ã¡ãªã«ã«æ¥ã¦ï¼å¹´ã ãã©ããããªãã«æé·ãã¦ããã ãªã
大åãªã®ã¯ã¦ã¼ã¹ã±ã¼ã¹ãçµãè¾¼ããã¨ãå¿ å®ã«ã¢ããã¼ããããã¨ã Eventbrite
ã·ãªã³ã³ãã¬ã¼ã®ã¹ã¿ã¼ãã¢ãããä½ãæè¿ã®ãµã¼ãã¹ã¯ãã¦ã¼ã¹ã±ã¼ã¹ããããSpecificã§è¯ãã
ã¦ã¼ã¹ã±ã¼ã¹ã®çµãè¾¼ã¿ã£ã¦ããµã¼ãã¹ãæ°ããä½ãä¸ã§åãéè¦ã§ããã®ã¦ã¼ã¹ã±ã¼ã¹ã«å¿ è¦ãªãã°ã決æ¸ã ãããããªãã©ã¤ã³ã ããããWebã§è§£æ±ºã§ããªããã¨ãã©ãã©ãçãè¾¼ãã§ãããããã®æ¹ãããããå®ã¯åçåãå·®å¥åã®ãã¤ã³ãã¯ããã«ããããããªãããªã£ã¦æãã
Eventbriteã¯ãã¤ãã³ãã®ä¼ç»éå¶ãããã±ããã®è²©å£²ãªãããè¡ãããµã¼ãã¹ã ãæ¥æ¬ã§è¨ãATNDã®ãããªæããªã®ã ãã©ããã±ããããªã³ã©ã¤ã³ã§è²©å£²ãã¦åå è²»ãååããããæ®å¸æ°ã®ç®¡çãèªåã§è¡ã£ããããã±ããã«ãã¼ã³ã¼ããã¤ãã¦å ¥å ´ç®¡çãªãããã§ãã¡ãã便å©ãªãµã¼ãã¹ã ããã¶ã¤ã³ã綺éºã§ãããããPeatixãªãããEventbrite for japanãçã£ã¦ããã®ã ã¨æãã
俺ãé¢ç½ããªã£ã¦æãã®ã¯ãEventbriteã®å°ç·è¨è¨ããããã·ã³ãã«ã§æ´ç·´ããã¦ãããã¨ã ãåºæ¬çã«Eventbriteã§ã¤ãã³ããæ¢ããã¨ã¯ãªãã¦ãFacebookãããã°ããªãã£ã·ã£ã«ãµã¤ããªããã«Eventbriteãã©ã°ã¤ã³ãåãè¾¼ã¾ãã¦ã¦ããããããã±ãããè³¼å ¥ãããäºç´ãå ¥ãã«è¡ãããã¡ãããã¾ã§ãã©ãããã©ã¼ã ã¨ãã¦è¨è¨ããã¦ã¦ããã¡ããã¡ããã¦ãªãã
ã¾ããåãªãã¤ãã³ãä¼ç»ã¨åéãªãWebã§ååãªãã ãã©ããã®ä¸æ©å ã®ãã¤ãã³ãã®éå¶ç®¡çã¨ãã£ããã¤ã³ã«ãã£ããã¢ããã¼ããã¦ããã¼ã«ã«ã®ã½ãªã¥ã¼ã·ã§ã³ã¾ã§ãæ¾ãä¸ãã¦ãµã¼ãã¹ã«ãã¦ãããMeetupã¨ãã§ã¯æ¨ã¦ã¦ãé¨åããã£ããæ¾ãä¸ãã¦ããã®ããããã
ATNDã¯ãã¬ã³ããæ¾ãä¸ããã®ãåãè¯ãã£ãããã¿ã¤ãã³ã°ãã°ã£ã¡ãã ã£ãããã ãããã§çµãã£ã¦ãã¾ã£ãã®ããä»ããæãã°å°ãå¿ä½ç¡ãã£ããªã¨ããæããããããªããã¦ã¼ã¹ã±ã¼ã¹ãçµãè¾¼ãã§ãå¿ å®ã«æ段ãé¸ã°ãã¢ããã¼ããç¶ãããã¨ã大åã ã
[Eventbrite] http://www.eventbrite.com/
[ATND] http://atnd.org/
[Meetup] http://www.meetup.com/
[PeaTix] http://peatix.com/
俺ãåæã«èããæ£ããMVCã®å®è£ ãã¢ãã«ã¯ãã¼ã¿APIï¼
æè¿ãä¸ç·ã«ã³ã¼ããæ¸ã人ï¼ç¹ã«Railsããå§ããå¦çããï¼ã«ã
MVCï¼Model - View - Controllerï¼ã«ããã¦ããmodel = DBãã ã¨èãã¦ãã人ãå¤ããªãã¨æããã®ã§ããã®ãããã«é¢ããèªåã®èããã¾ã¨ãã¦æ¸ãã¦ããã¾ãã
ããã¾ã§ä¿ºã®èããªã®ã§ãéã£ã¦ããããããã
MVCãã¡ããã¨ç解ãã¦ãã人ã«ã¯å½ããåããã話ãããªã®ã§ã¹ã«ã¼ã§ããããï¼
åå¦è ã¯Viewãã¢ãªã¢ãªçãã
ããã¯ããã°ã©ãã³ã°ãå§ãã人ãªã誰ã§ãçµé¨ããã¾ãããã
ããããMVCã¨ãå§ããåã®ã誰ã§ãçµé¨ããã§ããã
<?php print '<a href="${hoge}">link</a>';
ãªãã¦ã®ã¯å®å ¨ã«Viewã ãã§å®è£ ãããããã°ã©ã ã§ããã
æè¿ã®MVCã®ãã³ãã¬ã¼ãã¯ã¨ã¦ãé«æ©è½ã§ãã
å¤æ°ã®å®£è¨ããæ¡ä»¶å¦çããã«ã¼ãããããã°ã©ã è¨èªã¨ãã¦ã²ã¨éãã®ãé次ãå復ãå¶å¾¡ããã§ãã¡ããã¾ãã
ã ããããã°ã©ã ã®ãã¸ãã¯ãããã«çããã¦ãã¾ããããªãæ°æã¡ã¯ãããã¾ããããã¯ãMVCã¨ããèãæ¹ã«ããã¦ããã®å®è£
ã¯æ£ããããã¾ããã
Viewã«ãã¸ãã¯ãå
¥ãè¾¼ãã§ãã¾ãã¨ãViewã®çç£æ§ã¨ãã¼ã¿ããªãã£ãä¿å®æ§ãä¸ãã¦ãã¾ãããã§ãã
èªåãæ¬æ ¼çã«MVCã触ããæã«ä½¿ã£ããã³ãã¬ã¼ãã¯ãPerlã®HTML::Templateã§ããã
ã¨ã¦ãé«éãªä»£ããã«ãã¾ã¨ããªãã¸ãã¯ãªãã¦ä¸åè¨è¿°ã§ããªãå
ç©ã§ãæåã¯ã¨ã£ã¦ã使ãã«ããã£ãã®ã§ããã
æ°ã¥ãã°åå¼·å¶çã«Viewã¨Controllerã®åãåããæèããããã¦ãã¾ããã
æ¢ã«æ代é
ãæã¯ãããããããåé¡ãããã¾ãããç§ã¨ãã¦ã¯å¥½ããªã¢ã¸ã¥ã¼ã«ã§ãã
MVCãç解ã§ããï¼ã¨æã£ãé ã«é¥ãControllerå¨
Viewã«ãã¸ãã¯ãæ¸ããã¨ããããå¦çã¨è¡¨ç¤ºãåãåãã¦èãããããã«ãªã£ãé ã«ãå¤ãã®ã²ã¨ã¯Controllerå¨ã«ãªããControllerã«å¦çãã¢ãªã¢ãªçããå§ãã¾ãã
ã¨ããããControllerå¨ã§æ¢ã£ã¦ãã人ã¯æå¤ã¨å¤ãããããªãã§ããããã
ããã£ã¨æ¸ãã¦æ¨ã¦ãã³ã¼ããªããã³ã³ããã¼ã©ã ãã§ååãªå ´åãå¤ãã§ãã
ã¾ããRailsã«å½±é¿ãåããå¤ãã®ãã¬ã¼ã ã¯ã¼ã¯ãããã§ãããä¸è¦ããã¨ãã¢ãã«ï¼ãã¼ã¿ãã¼ã¹ãã¨æ±ã£ã¦ããããã«è¦ãã¦ãã¾ãã¾ãã®ã§å°æ´ã§ãã
ãrailsã§ã¢ãã«ã£ã¦åæã«ä½ããããã©ãèªåã§ã³ã¼ãã足ãããã¨ãªããªãã
ã£ã¦äººãããããããªãããªã
ããããã³ã³ããã¼ã©ã«ãã¹ã¦ã®ãã¸ãã¯ãåãããã§ããã¨ããããã¯ããä¿å®æ§ãä¸ããã¾ãã
ãã¨ãã°ãã¢ãã«ããå¼ã³åºãããã¼ã¿ããã£ãã·ã¥ããããMySQL以å¤ã«KVSã«æ ¼ç´ããã¦ãããã¼ã¿ã¨é£æºãããããTwitterã®APIã«ã¢ã¯ã»ã¹ããããããããªå¦çãæ³åãã¦ãã ããã
ããæ¥ãTwitterã®APIã®ã¹ãã¼ããä¸é¨å¤æ´ã«ãªãã¾ããã
ããã«å¿ãã¦KVSã¸ã®ãã¼ã¿ã®ä¿ææ¹æ³ãå¤ãã£ãããDBã®ã«ã©ã ã追å ããªããã°ãããªããªãã¾ããã
ãã®ã¨ãããã¹ã¦ã®å¦çãã³ã³ããã¼ã©ã«æ¸ãã¦ããã¨ãã¢ãã«ã®æ¸ãç´ãã«å ããã³ã³ããã¼ã©ã®å¤§å¹
ãªæ¸ãç´ããçºçãã¾ãã
ããããã³ã³ããã¼ã©ã«ã¯å
¥åå¤ã®ã´ã¡ãªãã¼ã·ã§ã³ãã表示ç¨ãã¼ã¿ã®å å·¥ã¾ã§æ§ã
ãªãã¸ãã¯ãå
¥ã£ã¦ãã¾ãã
å¦çãé·ããã¨ãå¤æ´ç®æãå¤ããã¨ã¯ãããã ãã§ãã°ãåãè¾¼ã確çãä¸ããã¾ãã
ä¿å®æ§ãä¸ããã¾ãã
æ£ããMVCã§ã¯Modelã太ã
ã³ã³ããã¼ã©å¨æ代ãä¹ãè¶ãããããããã¡ã ãã¨æãå§ããã¨ãã¨ã³ã¸ãã¢ã¯è¡¨ç¤ºãå¦çã«å ãã¦ãã¼ã¿ã¨ããæ¦å¿µãæã¡å§ããã¢ãã«ã太ããå§ãã¾ãã
æ§ã
ãªèããããã¨æãã¾ãããç§ã¯ã¢ãã«ã太ã£ã¦ããã³ã¼ãã®ã»ããå¥å
¨ã ã¨æãã¾ãã
ããä¸è¨ã®ã±ã¼ã¹ã§ããã°ãã¢ãã«ã«ã¡ã½ãããçããã¦ãã¢ãã«å
é¨ã§TwitterAPIãKVSã®å¦çãé è½ãã¦å®è£
ãã¦ããã°ããã¥ã¼ããã³ã³ããã¼ã©å´ã®å®è£
ã«ä¸åæãå ãããã¨ç¡ããããã°ã©ã ãæ¹ä¿®ãããã¨ãã§ãã¾ãã
MVCã«ãããModelã¨ã¯ãåºãæå³ã§ã®ãã¼ã¿å
¨è¬ã§ãããDBã ããå·®ããã®ã§ã¯ããã¾ããã
TwitterAPIãå¤é¨ã¹ãã¬ã¼ã¸ãMemcachedãKVSããããã£ãçãã¼ã¿ããã¼ã¿ã¹ãã¢ç³»ã¯
ãã¹ã¦Modelã§åãæ±ãããã®å¦çãé è½ãã¹ãã ã¨ç§ã¯æãã¾ãã
Modelã¯MVCã«ããããã¼ã¿API
Modelã¯MVCã«ããã¦ããã¼ã¿APIçã«è¨è¨ãã¹ãã§ãã
ããã¯ããã¨ãã°ã¢ãã«ã¸ã®ã¢ã¯ã»ã¹ãã¡ã½ããå¼ã³åºããããªããRPCãWebAPIã«ãªã£ãã¨ãã¦ãå°ããªãããã綺éºãªã¢ãã«ã®ã¤ã³ã¿ãã§ã¼ã¹ãè¨è¨ããæ¹ãããã¨ããæå³ã§ãããã¾ãã
ãã¨ãã°ãRailsã®ã¢ãã«ãã³ã³ããã¼ã©ã§newããããcreateãããã¨ã£ã¦ãã»ã¨ãã©ããã¾ããã
ãã®çç±ã¯ãããã³ãã¨ã³ãã®ãã¼ã¿ããã®ã¾ã¾ç¡å å·¥ã§æµãè¾¼ãã§çµãããã£ã¦ã·ã¼ã³ãã»ã¨ãã©ãªãããã§ãã
ã¦ã¼ã¶ç»é²ãè¡ããã¨ãèãã¦ã¿ã¾ããããã¦ã¼ã¶ç»é²æã«ãã¹ã¯ã¼ããSHA1ãªã©ã§ããã·ã¥åãã¦ä¿åãããã¨èããæã
ã³ã³ããã¼ã©å´ã§
User.create(:name => params[:name] , :password => Digest::SHA1.hexdigest(SALT + params[:password]) )
ã¨ããã®ã¯è¯ããªãå®è£
ã§ãã
SALTããããã·ã¥åã®ãã¸ãã¯ã¯ãã³ã³ããã¼ã©ã§ã¯ãªãã¢ãã«ä¾åã®é½åã®ãã®ãªã®ã§ã
ã¯ã©ã¹ã¡ã½ããã¨ãã¦ã¢ãã«å
ã«é è½ãã¹ãã§ãã
#Controller User.register(:name => params[:name] , :password => params[:password] ) #Model def self.register(args) user = User.new user.name = args[:name] user.password = Digest::SHA1.hexdigest(SALT + params[:password]) user.save end
ãããã¦ããã°ãSALTã®å¤æ´ãèªè¨¼ãã¸ãã¯ã«Twitetré£æºãä»ã®æä½ã追å ãããã¨æã£ãæã«ãã¢ãã«ã®å¤æ´ã ãã§æ¹ä¿®ãå¯è½ã«ãªãã¾ãã
ã³ã³ããã¼ã©å´ããããã°ãã¢ãã«ã®å
é¨å®è£
ãèããªãã¦ãã綺éºãªå¼ã³åºãï¼ã¤ã³ã¿ãã§ã¼ã¹ï¼ãªã®ã§ã使ããããã§ããã
ãªãã¸ã§ã¯ãæèã¯å ±åéçºã«ããããã©ã¤ãã¼ãã¹ãã¼ã¹
ã¶ã£ã¡ãããè¤æ°äººã§å
±åéçºãã¦ããã¨ãã«ã¯ãä»äººã®ã³ã¼ãï¼è¡ï¼è¡ã«ã¤ãã¦
趣å³ã価å¤è¦³ãæ¼ãä»ãããã®ã¯ããäºãã«ã¨ã£ã¦ç²¾ç¥è¡çè¯ããªããã¨ã§ãããææããæ¹ãææãããæ¹ãããªãã ãã®ã¹ã®ã¹ãã¦ãã¾ãã¾ãã
ããã«ãæ¸ãæ¹ãªãã¦äººããããã®å¥½ã¿ãããã¾ãããåéã¨ä¸ç·ã«ä½ã趣å³ããã°ã©ã ã«ãå³æ ¼ã§å³ããã³ã¼ãã£ã³ã°è¦ç´ãçå®ãããããã»ããè¾ããåãªãã§ãããã
ãªã®ã§ãã¤ã³ã¿ãã§ã¼ã¹ã綺éºã«è¨è¨ããå
é¨ã®å®è£
ã«ã¯ããç¨åº¦å¯å®¹ã«ä¸å¹²æ¸ãã¨ããã®ããã¿ããªã§æ¥½ããéçºããããã«è¯ãã¹ã¿ã¤ã«ãããªãããªã¨èãã¦ãã¾ãã
ãã®ã¶ããã¤ã³ã¿ãã§ã¼ã¹ã®è¨è¨ã«é¢ãã¦ã¯ã©ãã¾ã§ããã ãã£ã¦æè¦ãã¶ã¤ãåã£ã¦è¯ãã¨æãã¾ãã
人éé¢ä¿ãããã§ãããå
±åéçºã«ãããã©ã¤ãã¼ãã¹ãã¼ã¹ãã£ã¦å¤§åã§ãããã
ããã§ã¯ãã¿ããªã§æ¥½ããå
±åéçºãï¼
C#ã§mixi Graph APIã«ã¢ã¯ã»ã¹ãããµã³ãã«ãæ¸ããã
Macã§mono使ã£ã¦æ¸ãããæå¤ã¨ä½¿ãããï¼
kyoro/mixi_graph_api_examples · GitHub
using System; using System.Text; using System.Net; using System.Web.Script.Serialization; using System.Collections.Generic; using System.Collections.Specialized; namespace MixiGraphAPIExample { class MainClass { private const string CONSUMER_KEY = "[YOUR CONSUMER KEY]"; private const string CONSUMER_SECRET = "[YOUR CONSUMER SECRET]"; private const string REDIRECT_URL = "[YOUR REDIRECT URL]"; public static void Main (string[] args) { MixiAPIClient client = new MixiAPIClient(CONSUMER_KEY,CONSUMER_SECRET,REDIRECT_URL); Console.WriteLine("1. Open this url and allow your application access."); Console.WriteLine(client.GetAuthorizeUrl()); Console.WriteLine("2. Input 'code' parameter value of redirected url."); string code = Console.ReadLine(); client.GetToken(code); Console.WriteLine("----"); string resText = client.Call("/people/@me/@self"); Dictionary<string,object> result = MixiAPIClient.JsonToDictionary(resText); Dictionary<string,object> entry = (Dictionary<string, object>)result["entry"]; foreach(string key in entry.Keys){ Console.WriteLine(key + " : " + entry[key]); } } } class MixiAPIClient { private const string MIXI_TOKEN_ENDPOINT = "https://secure.mixi-platform.com/2/token"; private const string MIXI_API_ENDPOINT = "http://api.mixi-platform.com/2"; private const string MIXI_AUTHORIZE_URL = "https://mixi.jp/connect_authorize.pl"; private string consumer_key; private string consumer_secret; private string redirect_url; public string token = ""; public string refreshToken = ""; public static Dictionary<string,object> JsonToDictionary(string jsonText) { JavaScriptSerializer serializer = new JavaScriptSerializer(); return serializer.Deserialize<Dictionary<string,object>>(jsonText); } public MixiAPIClient(string consumer_key, string consumer_secret, string redirect_url) { this.consumer_key = consumer_key; this.consumer_secret = consumer_secret; this.redirect_url = redirect_url; } public string GetAuthorizeUrl() { return MIXI_AUTHORIZE_URL + "?scope=r_profile&client_id=" + consumer_key; } public void GetToken(string authorizationCode) { NameValueCollection data = new NameValueCollection(); data.Add ("grant_type","authorization_code"); data.Add ("client_id",consumer_key); data.Add ("client_secret",consumer_secret); data.Add ("redirect_uri",redirect_url); data.Add ("code",authorizationCode); WebClient wc = new WebClient(); Byte[] resData = wc.UploadValues(MIXI_TOKEN_ENDPOINT, data); string resText = Encoding.UTF8.GetString(resData); Dictionary<string,object> result = MixiAPIClient.JsonToDictionary(resText); token = result["access_token"].ToString(); refreshToken = result["refresh_token"].ToString(); } public string Call(string endpoint) { string url = MIXI_API_ENDPOINT + endpoint + "?oauth_token=" + token; WebClient wc = new WebClient(); byte[] resData = wc.DownloadData(url); return Encoding.UTF8.GetString(resData); } } }