2017/02/24

[本]ORIGINALS 誰もが「人と違うこと」ができる時代

読了。

ORIGINALS 誰もが「人と違うこと」ができる時代 (単行本)
アダム グラント シェリル サンドバーグ
三笠書房
売り上げランキング: 14,877

1 変化を生み出す「創造的破壊」―「最初の一歩」をどう考えるか
2 大胆に発想し、緻密に進める―キラリと光るアイデアとは
3 “無関心”を“情熱”へ変える法―まわりを巻き込むタフな説得力
4 賢者は時を待ち、愚者は先を急ぐ―チャンスを最大化するタイミング
5 「誰と組むか」が勝敗を決める―パワフルな結束をつくる人の見分け方
6 「はみ出す人」こそ時代をつくる―どこに可能性が隠されているか
7 ダメになる組織、飛躍する組織―風通しよく、進化を遂げるしくみづくり
8 どんな「荒波」も、しなやかに乗りこなせ―あらゆるものをエネルギーにする方法

via:目次
これはいい。

組織心理学者の著者はワービーパーカーの投資を断った原因の調査から始まり、
なぜ起業家が成功を収めているのかを分析しているのだが、納得という部分がものすごく多かった。

失敗することを後悔するよりも、やらなかったことを後悔するもそうだし、
起業を成功させるためにリスク分散をとったり、
成功するまではやはり数が必要であったりと、
他のビジネス書には書かれていない内容ばかりで背中を教えてもらった感じだ。

ただ、6章の「はみ出す人」こそ時代をつくるは、
どちらかというと子育て論っぽく、
章のタイトルと中身が合致していないような気がした。

8章のどんな「荒波」も、しなやかに乗りこなせ―あらゆるものをエネルギーにする方法
も方法論としては確かに記述があったのだが、もっと詳細を書いてほしかったなーっと。
確かに、人それぞれでケースバイケースなのかもしれないのだが。

上記のように100%完璧な本ではないのだが、
家用と会社用に2冊ほしいと思える内容であった。

2017/01/29

[本]ゴル語録 命を磨くための50の言葉

読了

ゴル語録 命を磨くための50の言葉
ゴルゴ松本
文藝春秋
売り上げランキング: 59,701
電車の広告で購入したんだけど、客観的事実を基にTIMのゴルゴ松本がアレンジした解釈をしている。

YouTubeで見た時の感動はなぜかなかった。

何故だろうか?

ひょっとしたらこっちの方が面白かったのかなー?
あっ! 命の授業
あっ! 命の授業
posted with amazlet at 17.01.28
ゴルゴ松本
廣済堂出版 (2015-04-23)
売り上げランキング: 7,716
命の授業で使われている漢字を解説しているので、あの時の感動が体感できると思ったんだけど。

2017/01/22

[本]坂本昌行のOne Dish

坂本昌行のOne Dish
坂本昌行のOne Dish
posted with amazlet at 17.01.23
坂本 昌行
扶桑社
売り上げランキング: 43,318
料理にチャレンジしようと思い、こちらを購入。

2017/01/21

2017/01/20

[Python][Google App Engine][Twitter][OAuth]statuses/update(投稿)

前回、昔、書いた[Google App Engine][twitter][oauth]ログインを自作するから少し仕様が変わったみたいで、少し見やすくして、新しくクラスを作ってみたのですが、ツイートするメソッドを追加しました。
#twitter.py

#!/usr/bin/env python
# -*- coding: utf-8 -*-
#
# Copyright 2007 Google Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#

from google.appengine.api import urlfetch
import datetime
import time
import random
import urllib
import hmac
import hashlib
import logging

class LoginTwitter(object):
    def __init__(self,consumer_secret,consumer_key):

        self.consumer_secret = consumer_secret
        self.access_token_secret = ""
        self.method = "POST"

        self.request_token_url = "https://api.twitter.com/oauth/request_token"
        self.oauth_authenticate_url = "https://api.twitter.com/oauth/authenticate?oauth_token="
        self.access_token_url = "https://api.twitter.com/oauth/access_token"
        self.statuses_update_url = "https://api.twitter.com/1.1/statuses/update.json"

        self.prms = {
            "oauth_consumer_key":consumer_key,
            "oauth_nonce":LoginTwitter._nonce(),
            "oauth_signature_method":'HMAC-SHA1',
            "oauth_version":'1.0',
            "oauth_timestamp":LoginTwitter._timeStamp()
        }

    @classmethod
    def _timeStamp(cls):
        _d = datetime.datetime.today()
        _d = time.mktime(_d.timetuple())
        _d = str(int(_d))
        return _d

    @classmethod
    def _nonce(cls):
        _s = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz123456789[]{}!$%&'()-^\:;*+><"
        _l = list(_s)
        _n = ""
        for i in range(20):
            _x = random.randint(0,len(_l)-1)
            _n += _l[_x]
        return _n

    def _signature(self,request_url):
        _prms_keys = sorted(self.prms.keys())
        _prms = ''
        for i in _prms_keys:
            _prms = _prms + "&" + i + "=" + urllib.quote_plus(self.prms[i])
        else:
            _prms = _prms[1:]

        _prms = urllib.quote_plus(self.method) + "&" + urllib.quote_plus(request_url) + "&" + urllib.quote_plus(_prms)
        _h = hmac.new("%s&%s" % (urllib.quote(self.consumer_secret), urllib.quote(self.access_token_secret)), _prms, hashlib.sha1)
        _sig = _h.digest().encode("base64").strip()
        return _sig

    def getOauthToken(self):
        if self.prms.has_key("oauth_token"):
            return self.prms["oauth_token"]
        else:
            return None

    def getRedirectOauthAuthenticateUrl(self):
        if self.prms.has_key("oauth_token"):
            _url = self.oauth_authenticate_url + self.prms["oauth_token"]
            return _url
        else:
            return None

    def requestAccessToken(self,oauth_token,oauth_verifier):
        self.prms["oauth_token"] = oauth_token
        _response = self._request(self.access_token_url,{"oauth_verifier":oauth_verifier})
        if _response:
            _response = _response.split("&")
            _result = {}
            for i in _response:
                key_value = i.split("=")
                _result[key_value[0]] = key_value[1]
        else:
            return _response

    def requestOAuthToken(self,oauth_callback_url):
        self.prms["oauth_callback"] = oauth_callback_url
        _response = self._request(self.request_token_url,{"oauth_callback":self.prms["oauth_callback"]})
        if _response is None:
            return False

        _response = _response.split("&")
        _result = {}
        for i in _response:
            key_value = i.split("=")
            _result[key_value[0]] = key_value[1]


        if _result["oauth_callback_confirmed"] == "true":
            self.prms["oauth_token"] = _result["oauth_token"]
            return True
        else:
            return False

    def _request(self,request_url,request_prms):
        self.prms['oauth_signature'] = self._signature(request_url)

        if self.method == 'POST':
            _headers = {
                'Content-Type': 'application/x-www-form-urlencoded'
            }

            _prms_keys = sorted(self.prms.keys())
            _prms = ''
            for i in _prms_keys:
                _prms = _prms + "," + i + "=\"" + urllib.quote_plus(self.prms[i]) + "\""
            else:
                _prms = _prms[1:]

            _prms = "OAuth " + _prms
            _headers["Authorization"] = _prms
            _result = urlfetch.fetch(
                url = request_url,
                payload = urllib.urlencode(request_prms),
                method = urlfetch.POST,
                headers = _headers
            )
            logging.info(_result.status_code)
            logging.info(_result.content)
            if _result.status_code == 200:
                return _result.content
            else:
                return None

    def statusesUpdate(self,access_token,access_token_secret,status):
        self.prms["oauth_token"] = access_token
        self.access_token_secret = access_token_secret
        self.prms["status"] = status
        _response = self._request(self.statuses_update_url,{"status":status})
        return _response

2017/01/19

[Python][Google App Engine][Twitter][OAuth]access token

前回、昔、書いた[Google App Engine][twitter][oauth]ログインを自作するから少し仕様が変わったみたいで、少し見やすくして、新しくクラスを作ってみたのですが、アクセストークンを取得するメソッドを追加しました。
#twitter.py

#!/usr/bin/env python
# -*- coding: utf-8 -*-
#
# Copyright 2007 Google Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#

from google.appengine.api import urlfetch
import datetime
import time
import random
import urllib
import hmac
import hashlib
import logging

#class SignInWithTwitter(object):

class LoginTwitter(object):
    def __init__(self,consumer_secret,consumer_key):
        self.consumer_secret = consumer_secret
        self.access_token_secret = ""
        self.method = "POST"


        self.request_token_url = "https://api.twitter.com/oauth/request_token"
        self.oauth_authenticate_url = "https://api.twitter.com/oauth/authenticate?oauth_token="
        self.access_token_url = "https://api.twitter.com/oauth/access_token"

        self.prms = {
            "oauth_consumer_key":consumer_key,
            "oauth_nonce":LoginTwitter._nonce(),
            "oauth_signature_method":'HMAC-SHA1',
            "oauth_version":'1.0',
            "oauth_timestamp":LoginTwitter._timeStamp()
        }

    def getOauthToken(self):
        if self.prms.has_key("oauth_token"):
            return self.prms["oauth_token"]
        else:
            return None

    def setOauthCallbackUrl(self,oauth_callback_url):
        self.prms["oauth_callback"] = oauth_callback_url

    def setOauthToken(self,oauth_token):
        self.prms["oauth_token"] = oauth_token

    def getRedirectOauthAuthenticateUrl(self):
        if self.prms.has_key("oauth_token"):
            _url = self.oauth_authenticate_url + self.prms["oauth_token"]
            return _url
        else:
            return None


    @classmethod
    def _timeStamp(cls):
        _d = datetime.datetime.today()
        _d = time.mktime(_d.timetuple())
        _d = str(int(_d))
        return _d

    @classmethod
    def _nonce(cls):
        _s = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz123456789[]{}!$%&'()-^\:;*+><"
        _l = list(_s)
        _n = ""
        for i in range(20):
            _x = random.randint(0,len(_l)-1)
            _n += _l[_x]
        return _n

    def _signature(self,request_url):
        _prms_keys = sorted(self.prms.keys())
        _prms = ''
        for i in _prms_keys:
            _prms = _prms + "&" + i + "=" + urllib.quote_plus(self.prms[i])
        else:
            _prms = _prms[1:]

        _prms = urllib.quote_plus(self.method) + "&" + urllib.quote_plus(request_url) + "&" + urllib.quote_plus(_prms)
        _h = hmac.new("%s&%s" % (urllib.quote(self.consumer_secret), urllib.quote(self.access_token_secret)), _prms, hashlib.sha1)
        _sig = _h.digest().encode("base64").strip()
        return _sig

    def requestAccessToken(self,oauth_verifier):
        _response = self._request(self.access_token_url,{"oauth_verifier":oauth_verifier})
        return _response

    def requestOAuthToken(self):
        _response = self._request(self.request_token_url,{"oauth_callback":self.prms["oauth_callback"]})
        if _response is None:
            return False

        if _response["oauth_callback_confirmed"] == "true":
            self.prms["oauth_token"] = _response["oauth_token"]
            return True
        else:
            return False

    def _request(self,request_url,request_prms):
        self.prms['oauth_signature'] = self._signature(request_url)

        if self.method == 'POST':
            _headers = {
                'Content-Type': 'application/x-www-form-urlencoded'
            }

            _prms_keys = sorted(self.prms.keys())
            _prms = ''
            for i in _prms_keys:
                _prms = _prms + "," + i + "=\"" + urllib.quote_plus(self.prms[i]) + "\""
            else:
                _prms = _prms[1:]

            _prms = "OAuth " + _prms
            _headers["Authorization"] = _prms
            _result = urlfetch.fetch(
                url = request_url,
                payload = urllib.urlencode(request_prms),
                method = urlfetch.POST,
                headers = _headers
            )
            logging.info(_result.status_code)
            logging.info(_result.content)
            if _result.status_code == 200:
                _content = _result.content
                _content = _content.split("&")
                _response = {}
                for i in _content:
                    key_value = i.split("=")
                    _response[key_value[0]] = key_value[1]
                return _response

            else:
                return None

2017/01/18

[本]新東京いい店やれる店

新東京いい店やれる店
ホイチョイ・プロダクションズ
小学館
売り上げランキング: 10,916
やれる店ということで、ラブホテルや風俗を紹介しているわけではない。

歴史を学びつつ、なぜそこがいいお店なのか、探っているところが他のレストラン本を一線を画すところ。
なので、むしろ、学校でこういう勉強がしたかったなー。かつ、高いだけのお店を紹介しているわけでもなく。
金額ベースでもコスパがいいのを紹介している。

アプリも出しているみたいなので、月額課金しようか悩んでいるところ。

2017/01/17

[Python][Google App Engine][Twitter][OAuth]request token

昔、書いた[Google App Engine][twitter][oauth]ログインを自作するから少し仕様が変わったみたいなので、少し見やすくして、新しくクラスを作ってみた。
//twitter.py

#!/usr/bin/env python
# -*- coding: utf-8 -*-
#
# Copyright 2007 Google Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#

from google.appengine.api import urlfetch
import datetime
import time
import random
import urllib
import hmac
import hashlib
import logging

class LoginTwitter(object):
    def __init__(self,consumer_secret,consumer_key,oauth_callback_url):
        self.consumer_secret = consumer_secret
        self.method = "POST"
        self.request_token_url = "https://api.twitter.com/oauth/request_token"
        self.oauth_authenticate_url = "https://api.twitter.com/oauth/authenticate"
        self.prms = {
            "oauth_consumer_key":consumer_key,
            "oauth_nonce":LoginTwitter._nonce(),
            "oauth_signature_method":'HMAC-SHA1',
            "oauth_version":'1.0',
            "oauth_timestamp":LoginTwitter._timeStamp(),
            "oauth_callback":oauth_callback_url
        }

        self.prms['oauth_signature'] = self._signature()
        self._request()

    @classmethod
    def _timeStamp(cls):
        _d = datetime.datetime.today()
        _d = time.mktime(_d.timetuple())
        _d = str(int(_d))
        return _d

    @classmethod
    def _nonce(cls):
        _s = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz123456789[]{}!$%&'()-^\:;*+><"
        _l = list(_s)
        _n = ""
        for i in range(20):
            _x = random.randint(0,len(_l)-1)
            _n += _l[_x]
        return _n

    def _signature(self):
        _prms_keys = sorted(self.prms.keys())
        _prms = ''
        for i in _prms_keys:
            _prms = _prms + "&" + i + "=" + urllib.quote_plus(self.prms[i])
        else:
            _prms = _prms[1:]

        _prms = urllib.quote_plus(self.method) + "&" + urllib.quote_plus(self.request_token_url) + "&" + urllib.quote_plus(_prms)
        _h = hmac.new("%s&%s" % (urllib.quote(self.consumer_secret), urllib.quote("")), _prms, hashlib.sha1)
        _sig = _h.digest().encode("base64").strip()
        return _sig

    def _request(self):
        
        if self.method == 'POST':
            _headers = {
                'Content-Type': 'application/x-www-form-urlencoded'
            }

            _prms_keys = sorted(self.prms.keys())
            _prms = ''
            for i in _prms_keys:
                _prms = _prms + "," + i + "=\"" + urllib.quote_plus(self.prms[i]) + "\""
            else:
                _prms = _prms[1:]

            _prms = "OAuth " + _prms
            _headers["Authorization"] = _prms
            _result = urlfetch.fetch(
                url = self.request_token_url,
                payload = urllib.urlencode({"oauth_callback":self.prms["oauth_callback"]}),
                method = urlfetch.POST,
                headers = _headers
            )
            logging.info(_result.status_code)
            logging.info(_result.content)
呼び出しはいたって簡単。
from twitter import LoginTwitter
consumer_secret
consumer_key
oauth_callback_url
LoginTwitter(consumer_secret,consumer_key,oauth_callback_url)
まだ全部の処理が書き終わっていないので、改訂が入るかも。