ベスパリブ

プログラミングを主とした日記・備忘録です。ベスパ持ってないです。

ABC 143: D問題の解説 (Python3)

問題:AtCoder Beginner Contest 143: D - Triangles

公式解説PDF:https://img.atcoder.jp/abc143/editorial.pdf

公式解説動画:https://youtu.be/3U_N7zelnMM?t=2983

解説

解説動画まんまです。

二分探索問題です。


問題の条件の、

  • a < b + c
  • b < c + a
  • c < a + b

というのは三角形の成立条件ですね

3つの棒を選んで、それでいくつ三角形を作れるかという問題ですが、便宜上、選んだ3辺のうち最も長い辺をcとします。

単純な方法で求めるならば全探索で、a,b,cそれぞれでループ(3重ループ)回せばよいですが、それだと O(N^3)でTLEします。


しょうがないので、aとbを固定して考えてみます(aとbについてforループで回します)。

与えられた棒が 2 3 4 6 6 7 10 とします。これをリストに入れて予めソートしておきます。

今、a=3, b=6 とすると、

2 3 4 6 6 7 10
a b

a + b = 9なので、a + b > c より、cは9未満になります。

2 3 4 6 6 7 10
a b

上記の○の数を数えていけば、答えは求まります。

ここで問題となるのが、上でいう「7以下」という境界をどう高速に求めればよいのかということですが、これは二分探索で高速に求まります。

f:id:takeg:20191122214936j:plain

コーナーケース

  • 特になし

実装

# -*- coding:utf-8 -*-
import bisect

def solve():
    N = int(input())
    Ls = list(map(int, input().split()))
    Ls.sort()

    # O(N^2 * logN)の全探索で解く
    ans = 0
    for a_i in range(N):
        for b_i in range(a_i+1, N):
            c_i = bisect.bisect_left(Ls, Ls[a_i]+Ls[b_i])
            if c_i > b_i:
                ans += c_i - b_i - 1
            else:
                pass

    print(ans)

if __name__ == "__main__":
    solve()

計算量は O(N^2 logN)です 。

HHKB Professional JPを 1ヶ月使った感想

2019/09/08(日)、HHKBのキーボードを買いました。

www.pfu.fujitsu.com

買ったのはHHKB Professional JPの墨(PD-KB420B)です。

買った理由

  • 長くなりそうなITエンジニア人生、HHKBを一度くらい使ってみたいと思った
  • 人生の仕事に割り振る時間は多く、この仕事の時間はできるだけ楽しく快適にしたいというモチベーションは常々あった。少しでも快適なものになる可能性があるならそうしたい
  • 仕事が行き詰まってる感あったので、新しいキーボードで気分を変えたい
  • 「使用キーボードはHHKBです」とか言ってみたい
    • ブランドもの欲しがるやつみたい
  • 本当は赤ポチキーボードが欲しくてYODA IIが欲しかったけど、再販に時間がかかりそうで待てなかった
  • 他の赤ポチキーボードで良さそうなのがなかった

などです。

BT(Bluetooth)版を買わなかった理由

キーボードは基本Bluetoothのものしか買わないのですが、以下の理由でBT版は見送りました。

USB接続はやっぱ面倒くさいですが、会社の広めできれいな机ならばまぁ許容できます。

ただHHKBのUSB接続の非常に良い点として、USB接続のHHKB本体側はmini USB Bタイプになっているので、本体とケーブルを完全に取り外しが可能です。ちょっと横に置くときとかに便利ですし、ケーブルが断線した場合はケーブルのみ買い換えればOKです。

Type-Sを買わなかった理由

現在(2019/09/08)の最新モデルはHHKB Professional Type-Sと呼ばれるもので、こちらはSpeed(早打ち)とSilent(静音性)の性能が高くなってるとのこと。基本的に最新のものを欲しいと思う性分なので本当はこっちが欲しかったけど以下の理由で見送りました。

  • 白キーボードしかなく、白キーボードが嫌だった
  • かつてのPayPay特需で貯まっていたビックカメラのポイントで買いに行ったが、そもそも在庫にType-Sがなかった
  • HHKB Professionalより1万円くらい高い。まあ許容範囲だと思ったけど、上記のビックカメラのポイントを使いたかったのと、在庫がなかったのでもういいやと思った。

日本語配列にした理由

キーボードの右下がHHKBと刻印されてるやつがカッコいいのですが、それは英語配列版なのです。英語配列は以下の理由で見送りました。

  • 日本語配列しか使ったことない
  • 英語配列を覚える気はさらさらない
  • やっぱり「i」の上には「(」「)」があって欲しい
    • キーボードを試打するときは頭の中で「int main(void){ (FizzBuzzのコード) }」とか「class Hoge(): def __init__(self):」とか「kodomoootokage」とか打つのだが、やはり「()」は「i」キーの上だよなぁ
  • 日本語配列版は十字キー(↑←↓→キー)が存在します。なんだかんだで使い慣れてるのであったほうが便利。

使用感

  • 話に聞いていたが、やっぱりスコスコして気持ちいい。
    • 第一印象としては「スコスコして気持ちいい」
    • 3週間くらい経つと、打キー感が最高なのと独特の配列に慣れて、もうずっとこれでいいんじゃないかと思えてくる
  • 打キー感はかなり良い。普段は2千円くらいのワイヤレスキーボードを好んで使っていて、それはそれで大好きなんだけど、打キー感に関しては段違いに良いと言っていいかも。
  • HHKBは特殊なキー配列になっているが、やはり慣れは必要。
    • 特に「Ctrl」キーの位置の違い、「半角/全角」キーの位置の違いは最大の慣れポイント
  • キーの数を減らしてる分、F5キーとかはFnキーと組み合わせて使うように設計されているのだが、慣れてきたらまぁ違和感なく使えるのだけれど、F5キーとかスクリーンショットキーとかを結構頻繁に使うフロントエンドやWiki業務のときはちょっと結構めんどくさい
    • 他の人のレビューで見てなるほどと思ったが、HHKBは省スペース性とプログラミングに特化しているが、文章を書くときやファンクションキーやPrtScキーなど特殊キーをよく使う場合はフルキーボードのほうが使い勝手がいいかもしれない
  • 少し後悔としては、RealForce + HHKBのキーボードにすれば良かったかもしれないと思っている。やはり会社でHHKB配列に慣れて、家でコード書くときにHHKB配列じゃないのはかなり煩わしい。普通の配列のRealForce型にしとけばよかったかも。それとも家用のHHKBを買うしかない...?
    • マジで会社と家で配列が違うのはストレスなので、家用を買おうか悩んでいる

通常のキーとHHKB JPキーの配置の違い

通常のキーボードとHHKB JP(日本語配列)はキー配置が違います(英語配列はまた違う)。詳しくはこちら

一番下の段のキーのマークと配置が独特なので、それらについて少し解説します。

  • 一番左のキーが「Fn」キー
    • 通常は一番左下は「Ctrl」だが、HHKB JPは「Fn」キー
  • 左から2番目の「HH」キー
    • 「HH」みたいなマークのキーは、「半角/全角」キーに該当する。
    • 半角全角切り替えを左手小指ですることになるので、ここは慣れポイント。
  • 左から3番目の「◇」キー
    • Windowsでは、「Win」キーに該当する。Macでは知らない。これは通常とマークが違うだけで同じ配置
  • 左から4番目の「Alt」キー
    • Altキーは通常とまんま
  • 左から5番目の「↑\↓」キー
    • 「↑\↓」みたいなマークのキーは、「無変換」キーに該当する。これは通常とマークが違うだけで同じ配置
  • 左から6番目の「スペース」キー
    • 言わずもがなスペースキー。通常と同じ配置(真ん中に大きく配置)。
  • 左から7番目の「↺」キー
    • 「↺」みたいなマークのキーは、「変換」キーに該当する。これは通常とマークが違うだけで同じ配置

みたいに、配置はともかく謎マークのキーが存在します。この謎マークは背面のDIPスイッチでPC(Windows)モードやMacモードを切り替えたときにマークの意味に矛盾を生じさせないためでしょう。それが逆にわかりにくくなってる感はありますが。

おまけ1

カラーキートップを購入し、少しカスタマイズしました。

f:id:takeg:20190914184326j:plain
その1。いいね

f:id:takeg:20190914184228j:plain
その2。うーん

f:id:takeg:20190914184139j:plain
その3。オッ

今はその3で運用しています。

  • 「なんでESCキーは黒のままなの?」
    • ESCを目立たせるメリットがないと思った。端っこのキーだし。
  • 「なんで0(F10)キーを青くしてるの?」
    • 0キーを青くすることでここから左のキーが数字で、右側が記号と判別しやすい
    • F10キーをよく使う。日本語入力してるとたまにある「design」って入力しようとして「でしgn」って入力しちゃったときにF10で即「design」にできる。ということを良くするので。
    • その2と見比べたら、ESCを青くしたらなんか変。なのでESCは黒のままで。

おまけ2

NEW GAME! 涼風青葉のねんどろいどを買いました。購入した理由は以下の理由です。

  • 長くなりそうなITエンジニア人生、相談できる相手はすぐそばに置いておきたい
  • 人生の仕事に割り振る時間は多く、この仕事の時間はできるだけ楽しく快適にしたいというモチベーションは常々あった。少しでも快適なものになる可能性があるならそうしたい
  • 仕事が行き詰まってる感あったので、フィギュアでも置いて気分を変えたい
  • 女性社員が机の上にちっちゃい動物の置物をたくさん置いてて、いいなと思った

しかし以下の理由で、まだ会社に持っていけていません。

  • キモいと思われたくない

シット!なんてこったブッダ!俺は涼風青葉と一緒に仕事をしたいっていうのに、他人の目を気にして行動できないままでいやがる。お前はいつもそうだ。何をするにも中途半端で、誰もお前を愛さない。

ABC 112: D問題の解説 (Python3)

問題:AtCoder Beginner Contest 112: D - Partition

公式解説PDF:https://img.atcoder.jp/abc112/editorial.pdf

公式解説動画:AtCoder Beginner Contest 112 解説放送 - YouTube

解説

解説動画まんまです。


 a_1 + a_2 + ... + a_N = M のとき、最大公約数 gcd(a_1, a_2, ..., a_N)の最大値は?という問題です。

ここで gcd(a_1, a_2, ..., a_N) = Kとおくと、

 a_1, a_2, ... , a_N はそれぞれKの倍数なので、MもKの倍数です。

MがKの倍数ということは、KはMの約数ということです。


KはMの約数ということは、 M \geq K N と書けます。

たとえば、N=10, M=168のときの、約数Kの最大値を求めたいとします。

Mの約数は1, 2, 3, 4, 6, 7, 8, 12, 14, 21, 24, 28, 42, 56, 84, 168です。

  • K = 1のとき

 M = 9K + 159K となるのでOKです。

  • K = 7のとき

 M = 9K + 15KとなるのでOKです。

  • K = 8のとき

 M = 9K + 12KとなるのでOKです。

  • K = 12のとき

 M = 9K + 5K となるのでOKです。

  • K = 14のとき

 M = 9K + 3K となるのでOKです。

  • K = 21のとき

 M = 9K - 21 で、9KはM=168の値を超えてしまうのでだめです。

K=24以降も、同様に9KがMを超えてしまうのでだめです。


以上の考察から、Mの約数Kのうち、 M \geq K N を満たす最大のKを探索すれば良いです。

制約より、Mのとりうる最大値は 10^9と大きいですが、 M=ABとしたときの約数のペア(A, B)は高々 \sqrt{M}を境に対称なので、探索は \sqrt{M}以下までで十分です。

対称というのはたとえば、M=100のとき、約数のペア(A, B)は、

  • M = 1 * 100
  • M = 2 * 50
  • M = 4 * 25
  • M = 5 * 20
  • M = 10 * 10 (ここから対称)
  • M = 20 * 5
  • M = 25 * 4
  • M = 50 * 2
  • M = 100 * 1

となるので、約数のペアを探すのに1~100まで探索しなくても、1~10までの探索でOKです。

コーナーケース

  • 特になし

実装

def solve():
    N, M = list(map(int, input().split()))

    # Mの約数をすべて調べる
    divs = set()  # Mの約数を格納する
    n = 1
    while n <= M**(1/2):
        if M%n == 0:
            # nがMの約数ならば
            divs.add(n)
            divs.add(M//n)
        n += 1

    # Mの約数dの中で、M >= d*Nを満たす最大のものが答え
    ans = 0
    for d in divs:
        if M >= d*N:
            ans = max(ans, d)
    print(ans)


if __name__ == "__main__":
    solve()

計算量は O(\sqrt{M})です 。

boogie board Model:WT13150の電池交換

2019/1/1にキングジム ブギーボード 電子メモパッド BB-1GXクロ クロをAmazonで購入しました。個人的にコードやアイデアの殴り書きに使っていてかなり気に入っていたのですが、2019/9/後半くらいに消去ボタンを押しても文字が消えなくなりました。寿命かな?と思ったけど、購入してから1年経ってないし、消去回数約5万回に達しているとは思えないので、初期不良品か故障か電池切れのどれかだろうなと思いました。まあそんなに高価なものでもないしおもちゃとしては面白かったので捨てようかなと思ったのですが、ダメ元ついでに分解してみることにしました。

f:id:takeg:20191002143559j:plain
ペンを止めるやつと、ネジを外すと、上部分が外れる

唯一ネジ止めしてある裏側の4つのネジを外すと、ボタン電池を発見。ボタン電池を一旦外し、再度取り付けて消去ボタンを押すと文字が消えました。どうやら電池(電池のズレか、電池切れ)が原因だったっぽい。うちわのように仰いでたりしてたので、何かの拍子でズレたのかも。しらんけど。

ボタン電池はCR2025の3ボルト。電池交換したらまた使えるようになりました。

この型式のものは公式的には電池交換不可能なものなので、交換の際は自己責任でお願いします。

ABC 142: D問題の解説 (Python3)

問題:AtCoder Beginner Contest 142: D - Disjoint Set of Common Divisors

公式解説PDF:https://img.atcoder.jp/abc142/editorial.pdf

公式解説動画:AtCoder Beginner Contest 142 - YouTube

解説

要約すると、(gcd(A, B)を素因数分解したときの素因数の個数)+1が答え。


入力例2を考えます。

「420と660の正の公約数の中からいくつか約数を選んで、選んだやつのどの異なる2つの整数も互いに素となる最大の約数の個数は何か?」という問題になります。

420と660の正の公約数は、必ず最大公約数以下の値になります。よって約数のとりうる範囲は1 ~ 最大公約数になります。420と660 の最大公約数gcd(420, 660)は60です。

60の約数を列挙してみます。

1, 2, 3, 4, 5, 6, 10, 12, 15, 20, 30, 60

このうち、どの2つの整数も互いに素となる約数の個数が最大となる選び方は、

1, 2, 3, 5 の4つです。

見やすく表にして整理すると、

60の約数 1 2 3 4 5 6 10 12 15 20 30 60
答え 1 2 3 5

たとえば15はなぜいけないのでしょうか?それは15を素因数分解すると 15 = 3^1 * 5^1 なので、15を選ぶと3と5が選べなくなってしまいます。 よって15を選ぶより3と5を選んだほうが多くを選べるということになります。

12や20なんかも同様の理由で選べません。

4はどうでしょうか?これは素因数分解すると 4 = 2^2になります。つまり4を選ぶと2を選べなくなります。この2を選ばないパターンの1 3 4 5は、どの2つの整数も互いに素となっているのでOKです。よって2の代わりに4を選ぶのはありですが、選ぶメリットは特にないですよね。素数しか選ばないというルールのほうが問題を簡単化できます。

ということで入力例2の場合では、gcd(420, 660)で最大公約数を求めて、その最大公約数を素因数分解したときの素因数を選べば、どの2つの整数も互いに素となります。あとついでに1も約数なのでこれも加えます。これが答えになります。


制約 A, B \leqq 10^{12}を考えます。Nがでかすぎるので、 O(N)の解法はTLEします。

この問題におけるNとは、AとBの最大公約数gcd(A, B)の値です。1~gcd(A, B)の範囲で素因数を数えることになります。gcd(A, B)の最大値は 10^{12}なので、 O(N)は無理です。

ですが実は、最大公約数Nが何かの整数pで割り切れるときは、 N = p * q と書けますので、 p \leqq \sqrt{N}となります(例: N=10^{12} のとき、 p=10^6 q=10^6 )。なのでNまで調べる必要はなく、 O(\sqrt{N})で解くことができます。

このあたりの考え方はエラトステネスの篩とかで素数を数える問題を知っていて慣れていれば、 O(\sqrt{N})で解けそうだなと当たりがつきます。

コーナーケース

  • 最大公約数が1のとき、1を出力して終了

実装

# -*- coding:utf-8 -*-
import sys
from fractions import gcd
from collections import Counter


def prime_factorization(n):
    """nを素因数分解する

    Return d(dict):
        素因数をキー、素因数の指数部を値とするディクショナリを返す

    Example:
        n=140 -> d = {2: 2, 5: 1, 7: 1}
    """
    d = Counter()
    m = 2
    while m*m <= n:
        while n%m == 0:
            n //= m
            d[m] += 1
        m = m + 1 if m == 2 else m + 2  # m=3からは、m+=2する(偶数は明らかに素数ではないので)

    if n > 1:
        d[n] += 1
    return d


def solve():
    A, B = list(map(int, sys.stdin.readline().split()))
    cd = gcd(A, B)

    if cd == 1:  # コーナーケース
        print(1)
        return

    # (素因数分解の素因数の個数)+1が答え
    prime_d = prime_factorization(cd)
    print(len(prime_d)+1)


if __name__ == "__main__":
    solve()

計算量は O(\sqrt{N})です 。

蛇足

なんか偉そうに「この問題に慣れていれば~」とか書きましたが、本番でTLEしてるんですよね。精進します。

「優れた発想はなぜゴミ箱に捨てられるのか?」読書メモ

優れた発想はなぜゴミ箱に捨てられるのか? - Amazon

キーワード

  • E4V (Eyes for Value)
    • Step1: 価値を創る
    • Step2: 価値を伝える
    • Step3: 実現への道のりを創る
  • TOC
    • Theory Of Constraints: 制約理論
    • ✕:現場のカイゼンを一つ一つ積み上げることが、企業全体の業績向上につながる
    • ◯:システム全体のパフォーマンスは制約で決まる
    • 律速原因のボトルネックを探す感じ?
  • 市場の教育
    • イノベーティブな商品は市場に理解されにくい。価値を正しく伝えて市場を教育する
    • 市場の教育を考える6つの質問
      1. 何と価値を比べるのか?
      2. 何と価格を比べるのか?
      3. お客様が最も購入したいと思う場面は?
      4. 最も適した流通チャネルは?
      5. 参入障壁をどうやって創るか?
      6. 誰と組めばビジネスモデルを強固にできるか?
  • イノベーションの価値
  • 3つの目
    • WOW!と言われるための価値を見つける3つの道具
      1. 顧客の目
      2. 市場の目
      3. 商品の目
  • 顧客の目
    • マイナス・マイナスの顧客の目
    • 顧客にとっての大きなマイナスをなくせば、大きなWOW!になる
    • 4つの質問
      1. 顧客は誰ですか?
      2. 顧客にとっての重要なマイナスは何ですか?
      3. 取り除くとWOW!と言われる重大なマイナスは何ですか?
      4. それは今までのどんな限界を取り除きますか?
  • 市場の目
    • プラス・プラスの市場の目
    • 普通の人が諦めている要望の中に、多くの人が本当は望んでいる要望が隠されている
    • 4つの質問
      1. ある要望を満たすために、あらゆる苦労を厭わない顧客グループはありますか?
      2. 彼らはどんなプラスの要望を満たそうとしていますか?
      3. その要望を満たすと大きなプラスの市場になると思われるのはどれでしょうか?
      4. それは今までのどんな限界を取り除きますか?
  • 商品の目
    • 振り切って考える商品の目
    • 顧客の目、市場の目の順番に考えることで、十分に顧客と市場の視点は考えられている。最後に商品価値を考える
    • 4つの質問
      1. 商品が構成されているパラメータは何ですか?
      2. それらのパラメータを大きく上下に変化させたり、なくしたり追加すると、どんな価値をもたらしそうですか?
      3. 大きなWOW!をもたらしそうなものはどれですか?
      4. それは今までのどんな限界を取り除きますか?
  • 「今までは〇〇○だと思ってませんでしたか?でもこれからは違います」
    • WOW!の決めゼリフ
  • WOW!カタログ
    • 既存商品のカタログをベースに、あたかもすでにWOW!と言われた新商品があるという想定でカタログを創っていく
  • WOW!ロードマップ
    • 10年後のWOW!カタログを創る
    • バックキャストでWOW!を積み重ねていく
      • 車種ごとに構想・開発を繰り返すのではなく、のちに製品化する車種のことまで視野に入れて、一括で構想・開発を進めていくマツダの一括企画
  • バックキャスト
    • バックキャストとは、未来のある時点に目標を設定し、そこから振り返って現在やるべきことを考える方法
  • ロマンとソロバン
    • マツダの言葉
    • ロマン:従業員の「やりたい」や「働き(続け)たい」というロマン的価値
    • ソロバン:経営・財務的なソロバン的価値
  • WOW!チーム
    • 会社の様々な部門に参加してもらう。
  • 変化の4象限
    • お客様の変化を検証する変化の4象限
      • 「買う買わない」と「プラスマイナス」の4象限
    • 4つの質問
      1. 買うことによって得られるプラスは?
      2. 買うことによって生じるマイナスは?
      3. 買わないことによって得られるプラスは?
      4. 買わないことによって生じるマイナスは?
  • ビジネスの可能性
    • ビジネスの可能性について評価する8項目
      1. 市場の大きさはどのくらいか?
      2. 利益はどれだけ見込めるのか?
      3. 模倣はどのくらい難しいのか?
      4. 競合が追いつくにはどのくらいかかりそうか?
      5. 投資と運用のコストはどのくらいか?
      6. 実現を難しくしている社内の制約は何か?
      7. 投資回収にどのくらいかかりそうか?
      8. 売上、利益、シェアのプランは?
  • 成功する根拠
    • 人は数字で納得するのではなく、その数字が示された根拠で納得する
    • 仮定を素早く検証し、修正していくことが成功のカギ
  • ミステリー分析
    • 失敗を学びに変える7つの分析
      1. 問題は何ですか?
      2. もともと何が起こると期待していましたか?
      3. それを起こすために、どんなことをしましたか?
      4. 実際に起きてしまったことはなんですか?
      5. 何が原因で思わぬ結果を引き起こしたのでしょうか?
      6. この原因を解消するうまい方法はありますか?
      7. この解消策をおこなうと、期待していたことが起きそうですか?
    • 思ったより良くなった・悪くなったでも、両方分析が必要
    • ワイガヤでやると良い
  • ODSC
    • Objectives, Deliverables, Success Criteria
      • 目的、成果物、成功基準
    • 3つの質問
      • 目的は何ですか?
      • 成果物は何ですか?
      • 成功基準は何ですか?
  • バックキャスト工程表
    • やるべきタスクを後ろからたどって段取りを考える
    • 段取り八分
      1. その前にやることは何ですか?
      2. 本当にそれだけですか?
      3. 〇〇をしたら、△△ができるんですね?
  • 断れない提案
    • UnRefusable Offer: URO
    • 相手がNOと言う理由をあらかじめ考え、それをことごとく潰していくことで相手にNOと言わせない状況を作ること
  • 相手の抵抗<抵抗の6階層>
    1. 取り組もうとしている問題が問題とは思えない
      • 問題を明らかにする
    2. 解決しようとしている方向性に合意しない
      • 「望ましい状況」を定義し、相手にそれの合意を得る
    3. その解決策で、問題が解決するとは思えない
      • 「望ましい状況」を提案する解決策がカバーしているかを検討する
    4. その解決策を実行すると、ネガティブな問題が発生する
      • リスクは隠さず説明する。「契約解消は(条件付きで)いつでも可能」など
    5. その解決策を実行するのは、障害があるので現実的ではない
      • 相手には相談という形で、相手の背後にいる意思決定者には提案する形をとる
    6. 知らないことに対する恐れがある
      • 相手にとってメリットが大きく、リスクが小さい第一歩を用意する
  • 詳しい取り組み
    • リビングの窓
    • 着物
    • その他もろもろ

ワークシート

変化の4象限

プラス マイナス
買う
買わない

成功の根拠を明らかにする仮定の検証

事業性のチェック項目 想定 その理由は? 検証(はい、いいえ、新たな発見)
①市場の大きさはどのくらいか?
②利益はどれだけ見込めるのか?
③模倣はどのくらい難しいのか?
④競合が追いつくにはどのくらいかかりそうか?
⑤投資と運用のコストはどのくらいか?
⑥実現を難しくしている社内の制約は何か?
⑦投資回収にどのくらいかかりそうか?
⑧売上、利益、シェアのプランは?

抵抗の6階層で考える断れない提案

相手の抵抗は何か 抵抗を乗り越えるために何を準備すべきか
①取り組もうとしている問題が問題とは思えない
②解決しようとしている方向性に合意しない
③その解決策で、問題が解決するとは思えない
④その解決策を実行すると、ネガティブな問題が発生する
⑤その解決策を実行するのは、障害があるので現実的ではない
⑥知らないことに対する恐れがある

感想

TOCというイノベーションプロセスの本。イノベーションを生み出すための方法論。会社の人におすすめされて読みました。技術的な本を読むことはあっても、こういうビジネス的な本を読む機会はあまりないので、新鮮でした。製品開発するのでこういうビジネスやマネジメントにフォーカスした本も読まないといけないのかもしれない。年齢も年齢ですし。

今回本を読むにあたって、

  • キーワードをメモする
  • そのキーワードについて口頭で説明できるようになれば、その本を理解したと同然である

というスタンスで読んでみました。

本を読んでいるときはキーワードをメモして、その後再度キーワードが書かれている箇所を読み直しまとめるという作業をしました。効率が良いとは言えないかも。全体で6時間くらいかかった?思ったより時間かかってますね。

f:id:takeg:20190926202100j:plain
読書中のメモ

AttributeError: module 'pip' has no attribute 'get_installed_distributions' のエラー対応

Google Colabでインストールされているパッケージを確認しようとしました。以下はPythonのコードです。

installed_packages = pip.get_installed_distributions()

すると以下のようなエラーが発生しました。

AttributeError: module 'pip' has no attribute 'get_installed_distributions'

エラーでググったら、まんまのエラー対処法が。

python – pip 10.0.0バージョンのpip.get_installed_distributions()に代わる機能はありますか? - コードログ

以下でインポートできるようになります。

try:
    from pip._internal.utils.misc import get_installed_distributions
except ImportError:  # pip<10
    from pip import get_installed_distributions

pipのバージョンが10.0.0からget_installed_distributions()関数が移動したっぽいので、あるいは、

if pip.__version__ >= "10.0.0":
    from pip._internal.utils.misc import get_installed_distributions
else:
    from pip import get_installed_distributions

でもいけました。

で、インストールされているパッケージの確認は以下でできます。

installed_packages = get_installed_distributions()

installed_packages_list = sorted(["%s==%s" % (i.key, i.version)
     for i in installed_packages])

print(installed_packages_list)
# ['absl-py==0.8.0', 'alabaster==0.7.12', 'albumentations==0.1.12', 'altair==3.2.0', 'astor==0.8.0', 'astropy==3.0.5', 'atari-py==0.1.15', 'atomicwrites==1.3.0', 'attrs==19.1.0', ...

参考