Keep It MECE

あったこと、気になったこと、知っておきたいこと

スピーカーを買いました

初めてAVスピーカーという物を買いました。

kakaku.com

そんなに高いものではないんですが、本体だけで40,000円以上するものに、スピーカーが2つ+ウーファーがついて46,000円ということで、かなり高コスパだと思い、こういった業界に詳しい友人と一緒に電気屋に行った上で、数時間くらい悩んだ上で、購入して持って帰ってきました。重くて持って帰るのが大変でした。運んでくれた友人、本当にありがとう。

今まで持っていたスピーカーは以下のものだったので、かなり良くなることを期待していました。

Amazon.co.jp: 【日本正規代理店品】Jawbone BIG JAMBOX ワイヤレス Bluetooth スマートスピーカー ホワイトウェーブ iPhone5対応 ALP-BJAM-WW: 家電・カメラ

結果としては、予想以上にすごかった。

 

今まで音楽をあまり意識して聴き比べたことはなかったのですが、低音の音量はともかく、音の広がりが全然違いました。

もちろん、10万くらいするものに比べたら全然ですし、いわゆる2.1chなので、これだけで分かった気になるのは尚早なのですが、値段を考えたら本当にお買い得だと思います。

欠点としては場所を取ることなので、ある程度の広さは必要な気がします。

この値段で、このクオリティのものが買える時代は本当にすごいな、と思いながら、感謝して音楽を聞いているのでした。

お勧めは、AmazonのFireStickと合わせて、映画を楽しむやり方です!

Python: requests Timeouts(タイムアウト)について調べた

Pythonのrequests.
人間が読みやすく、のポリシーが書いてあるあれです。

今回はその中のTimeoutについて調べてみました。

Timeoutを設定する

requestsのドキュメントには、普通のプロダクションコードならTimeoutを必ず書く必要があって、ない場合はハングアップするよ、と書いてあります。

You can tell Requests to stop waiting for a response after a given number of seconds with the timeout parameter. Nearly all production code should use this parameter in nearly all requests. Failure to do so can cause your program to hang indefinitely:

例えば、以下のようなコードで実現できます。

# hung upするかもしれないコード
requests.get('http://example.com')
# hung upしないコード
requests.get('http://example.com', timeout=10)

timeoutはfloatで指定してもいいようです(5.5など)
ちなみに、デフォルト値はNone(タイムアウトなし)です。
明示的にNoneを指定すると、デフォルト値としてふるまいます。

Timeoutエラーの種類

タイムアウトを設定した場合、例外が送出される場合があります。
内部的にリトライしている場合は、リトライ回数が超えた、という文言も一緒に出力されるかもしれません。

ConnectTimeout

下記の例は、リトライを設定した上で、タイムアウトを0.001秒に設定した例です。
送出される例外はConnectTimeoutです。

# code
requests.get("<HOST>", timeout=0.001)

# raises
requests.exceptions.ConnectTimeout:
 HTTPSConnectionPool(host='<HOST>', port=<PORT>):
Max retries exceeded with url: <URL>
 (Caused by
 ConnectTimeoutError(<requests.packages.urllib3.connection.VerifiedHTTPSConnection>,
'Connection to <HOST> timed out. (connect timeout=0.001)'))
ValueError

Timeoutは0未満の値を受け付けないようです。当たり前ですが。

# code
requests.get("<HOST>", timeout=-1)

# raises
ValueError: Attempted to set connect timeout to -1,
 but the timeout cannot be set to a value less than 0.

エラーには、less than 0はセットできないとあります。
この場合はValueErrorが送出されます。

ConnectionError

ではタイムアウトに0を設定した場合はどうなるのでしょうか。
0未満がだめということなら0は設定できるはず。

# code
requests.get('<HOST>', timeout=0)

# raises
requests.exceptions.ConnectionError: 
 HTTPSConnectionPool(host='<HOST>', port='<PORT'):
 Max retries exceeded with url: <URL>
 (Caused by 
NewConnectionError('<requests.packages.urllib3.connection.VerifiedHTTPSConnection>:
 Failed to establish a new connection:
  [Errno 36] Operation now in progress',))

今度はConnectionErrorが送出されています。ConnectErrorとConnectionError、とても良く似ています。

スタックトレースの最後まで見ると、0.001秒と設定した時と比べて、以下のような違いがあるのがわかります。

# timeout=0.001
ConnectTimeoutError
Connection to <HOST> timed out.

# timeout=0
NewConnectionError
Failed to establish a new connection:

そんなの当たり前じゃん、という感じなんですが、timeout=0.001の場合は、「繋ぎに行ったけどタイムアウトしたわ、ごめんね」となったのに対し、timeout=0の場合は、「繋ごうとしたらtimeout=0だったからコネクションすら確立できなかったわ、すまんな」ということなんだと思います。

なんでこんなことを調べたのか

タイムアウトする場合のテストを書いていて、

  • timeout=0.001くらいにとしておけばだいたい大丈夫か?
  • requests.Timeoutsのサンプルがそうなっている
  • でも、将来的にちょうはやい回線が出てきたときに、1ms以内でレスポンス返るようになることもあるんじゃ?
  • まあ、多分そんなことはないと思うけど。
  • (もしあった場合に)そしたら0.0000001とかにするんかな?
  • timeoutは負の値は無理だけど0はいけるらしい
  • じゃあ、0にすればいいんじゃね???

という経緯で、0にしてみたら微妙に違うエラーが出た…ということです。

デフォルト値がNoneなのが微妙

関数の引数にtimeoutを渡す場合、デフォルト値を設定したくなるんですが、Noneは意味がある(タイムアウトなし)ため、デフォルト値に悩みます。
デフォルト値を負にして、負の場合は無指定とみなすか、0にして0の場合は無指定とみなすか、とか色々考えているところです。
普通のユースケースなら0で十分な気もします(0の場合はテストができなくなりますが)

最後に

Timeoutを書き忘れると1時間とか止まるケースがあるようなので(実体験)皆様、気をつけてください。

通勤路線評価

東京の通勤路線を勝手に評価する。

混雑率を評価したサイトはそれなりにありますが、ここでは勝手な主観だったり、体験を踏まえた内容が多いはず。

乗ったことがあるところが優先的に、贔屓的に出てくると思われる。

2016/12/10 とりあえず書き始めた。

評価の目安

  • S:全体を通して快適。ただしオフィスの場所次第。
  • A:快適。長距離でもあまり気にならない。
  • B:まずまず。他人にお勧めできるラインのギリギリ。
  • C:座れることはあまりないが、許容できるレベル。人と触れ合うことがある。
  • D:俗に満員電車と呼ばれる。優先席という分類はもはやない。
  • E:女性専用車も満員。電車に乗れないことがある。遅れるのは日常茶飯事
  • F:東京に慣れていない人にはおすすめできない。

Sランク

Aランク

日比谷線 築地ー中目黒方面

築地、銀座あたりでほぼ人がはけるので、まず座れる。

周辺エリアはそもそも高いので、住めるところがあるかどうか…

東西線 日本橋ー中野方面

茅場町が乗り換え駅となっていて、それより先は空いている。

西側に住みたいところだが、反対側はそれなりに混んでいる。

Bランク

中央線 下り

上りが混んでいる分、下りは空いている。中央線沿いの駅は神奈川へのアクセスが悪いので、オフィスが川崎方面、横浜方面の場合はおすすめできない。

Cランク

日比谷線 上り 北千住ー中目黒

北千住始発なので、何本か見送れば座れる。

昔は東横線の菊名まで直通の電車があったが、副都心線の方にシフトしてしまった。北千住から築地までは非常に混む。霞が関までは千代田線の方がはやくつく。

千代田線 上り 北綾瀬代々木上原

北千住乗り換えの場合、日比谷線と千代田線でルートがかぶるため、そこまで混雑しない。北綾瀬なら始発なので座れることも。

Dランク

中央線 上り

乗る場所によって快適さが大きく変わってくるエリア。高尾、八王子からの通勤の場合は比較的快適だと思われる。

立川を過ぎたあたりから人が増え始め、それより新宿よりは基本的に単調増加と見てよさそう。

ピークは7時から7時半くらいだと思われる。

Eランク

田園都市線 上り 急行、準急

東横線 上り 急行

Fランク

小田急線 上り

JR埼京線 上り

責任を持たないということは責任を押し付けるということだ

※この話はフィクションです。

ここに2つのチーム(甲と乙)がある。

 

それぞれのチームに、営業担当と技術担当がいる。

技術担当は営業から言われた仕事をこなし、営業は外からの要望を技術に伝える仕事をしている。

基本的には甲と乙は独立しており、それぞれ営業と技術が会話をして仕事をこなしていいる。チームの関係性としては、やや乙チームの方が強いと考えていい。

あるとき、乙チームが甲チームと連携して仕事をしたい、と言い出した。言い出した人は、甲と乙チームの更に上のチーム(松チームとしよう)のメンバーだ。

乙チームの営業が取ってきた仕事を、甲チームでもノウハウを貯めるために把握しておきたい、ということだった。

そのためには、以下のアプローチがある

  1. 乙チームの営業が、甲チームの営業担当と連携を取る
  2. 乙チームの営業が、甲チームの技術担当と連携を取る
  3. 乙チームの技術が、甲チームの営業担当と連携を取る
  4. 乙チームの技術が、甲チームの技術担当と連携を取る

しかし、甲チームの技術担当は癖が強く、自分の営業担当と喋る以外は無口になってしまう。また、営業同士は非常に仲が悪い。

ということで、3以外の連携方法がない、ということになった。

連携を取る、ということが決まったものの、更に問題が生まれた。
誰がどうやって連携を取るのかが決まらないのだ。

  1. 甲チームの営業は非常に忙しいので、受注した仕事内容をいちいち説明するのが大変。概ね伝えることはできるが、漏れることがある
  2. 乙チームの営業と甲チームの営業の連携は必須なので、そこは乙チームの技術が頑張って欲しい
  3. 甲チームの技術担当は非常に気難しい上に多忙なので、そこから情報が入ることはないと思ってほしい。その情報が知りたい場合は営業担当に聞いてほしい
  4. 甲チームは、基本的に乙チームの仕事には興味がない。乙チームが甲チームに興味をもつのは勝手だが、こちらに迷惑はかけないでほしい
  5. 甲チームと乙チームが連携する、というのは松チームが決めたことなので、逆らえない

今回の連携で、新規案件を受注した場合、乙チームの営業担当→乙チームの技術担当、というルートの他に、乙チームの営業担当→甲チームの技術担当のルートが生まれたわけだが、このルートが必ず信用できるわけではない。よって、乙チームの技術担当は、定期的に甲チームの営業担当に話を聞きに行かなければならない。

彼らはslackやchatworkなどが使えないので、連絡手段はメールか電話だ。非常に効率が悪い。

その上、松チームは連携は素早くしなければダメだ、と強く主張している。(そもそももっと上からオリてきた話だ、とも言う)

そして、甲チームの技術担当は、新規案件が来たかどうかを乙チームに確認しに行かなければならなくなり、甲チームの営業担当とのやり取りも希薄になっていく。甲チームの営業は、案件情報を聞くために甲チームとの技術とやり取りをしに行かなければならない。

 

本来、上からの命令ということで、それに従わなければならないはずが、すでに出来上がっているチームの関係性が邪魔をしている、という状況が起きているわけだ。

新規案件の情報や、進捗を確認するには、乙チームの技術担当に話を聞くのが早い。しかし、甲チームから乙チームの技術担当に話を聞くのは無理だ。乙チームからすると、甲チームのほうから案件があった場合は声をかけてほしいと思うのだが、それもできない。

松チームのメンバーは「乙チームの立場は弱い。まずは自分たちが責任を持って、話を聞きに行くべき。相手から連絡がなくとも、定期的に連絡を取っていくのは義務」ということになってしまうのだ。

そして、お互いのチームが疲弊していく…

割り切れる数 Qiitaアドベントカレンダー(数学)12/16用記事

はじめまして。windcrossです。
仕事ではネットワークエンジニアをやっております。

アドベントカレンダーというと、プログラミング寄りの記事が多いような気がしていますが、今回は数学について書いてみようと思います。

こちらの記事はQiitaのアドベントカレンダー(数学)の16日の記事です。

身近で活用できる数学(算数)

数学というと、面倒で難しい割に役に立つ機会が少ない(役に立たないわけではない)というイメージを持っている方が多いと思います。

これは、的を射ている部分と、そうでない部分があるのですが、たしかに日常生活で微分積分を解けないとつらい、というふうに感じることはありません。

でも、知っているとちょっと楽しい、という場面は沢山あるのです。

今回の記事では、その中でも、○○で割り切れる数にフォーカスして記事をかいています。話をしては知っていても理屈が…という方向けです!

※以下、文章中に数字が出てきた場合は全角、数式の中の数字は半角を使用します。
※引用部分の問題の回答は末尾にあります。

A.偶数と奇数

2で割り切れる数字を偶数、割りきれない数字を奇数と呼びます。
偶数を言い換えると、末尾が0,2,4,6,8で終わる整数のことですね。

値段表示が税込みのお店で、二人でランチをした時に、全く同じものを注文した場合は、合計金額は必ず偶数になります。

偶数と奇数には、以下の関係性があります。

・和(足し算)

偶数+奇数=奇数
偶数+偶数=偶数
奇数+奇数=偶数

・積(掛け算)

偶数×偶数=偶数
偶数×奇数=偶数
奇数×奇数=奇数

このような性質は当たり前のように感じますが、問題を解くのに大きなヒントになったりします。
以下の問題を解いてみましょうましょう。

Q1.ある1桁の数字(N>1)の2乗(同じ数字同士を掛けること)を取ったら1桁の奇数になった。Nはいくつか?

どうでしょうか、解けましたか?

 B.3で割り切れる数

2で割り切れる数といえば、偶数になります。では3で割り切れる数はどんな数になるでしょうか。

まずは単純化して、3桁の数字で考えてみます。
3桁の数字Xは、以下の式ですべて表現することができます。

X = 100*a + 10*b + c

ただしaは1以上です。0になってしまうと2桁の数値になってしまいます。

これが3で割り切れる数字の場合は、次のように表現できます。

X = 3Y
= 100*a + 10*b + c

ここで、Yは任意の整数を指します。

さて、ある数字に3を掛けると、それは必ず3で割り切れる数字になりますよね。それを利用して、式変形を行ってみます。

X = 3Y
= 100*a + 10*b + c
= 99*a + 9*b + a + b + c
= 3*33*a + 3*3*b + a + b + c
= 3*(33*a + 3*b) + (a + b + c)

99と9はそれぞれ3で割り切れます。つまり、3桁の整数が3で割り切れるためには、a+b+cが3の倍数であれば良いのです。美しいですね!

もっと簡単に言い換えると、各桁の数を足した値が3の倍数になっていればいいということです。

123、456,789,これはいずれも3で割り切れます。

1桁の足し算と3の段の九九を覚えていれば良いわけですから、簡単ですね。これは桁数が増えても同じ理屈が成立します(ぜひやってみてください)

以下の問題を解いてみましょう。

Q2.123456789は3の倍数だろうか?

C.5で割り切れる数

では、5で割り切れる数はどうでしょう。これは非常に簡単です。
3で割り切れる数と同様に式変形してみます。

X = 5Y
= 100*a + 10*b + c
= 5*20*a + 5*2*b + c
= 5*(20*a + 2)*b + c

つまり、末尾の値が5で割り切れればよいということになります。簡単ですね。具体的には5,または0となります。

以下の問題を解いてみましょう。

Q3.1900以上、2000以下の整数の中で、5で割り切れる数はいくつあるか?

D.7で割り切れる数

7で割り切れる数は少し特殊です。先ほどのように式変形をしてみます。

X = 7Y
= 100*a + 10*b + c
= 7*14*a + 7*b + 2*a + 3*b + c
= 7*(14*a + b) + (2*a + 3*b + c)

今までのように、わかりやすい形に変形できませんでした。これは、10の倍数である値を7で割った値のパターンが沢山あることが原因です。

1を7で割ると、特定の小数点パターンが続くことがわかっています。また、分数を少数化した値を並べてみると、面白い特徴を持っていることがわかります。

1 / 7 = 0.142857142857...
2 / 7 = 0.2857142857...
3 / 7 = 0.42857142857...
4 / 7 = 0.57142857...
5 / 7 = 0.7142857...
6 / 7 = 0.857142857...

パターンと先頭の小数点の値さえ覚えておけば、いつでも暗算ができますね。

Q4.22/7を小数で表現した時、小数点第100位の値を求めよ。

※小数1.23があったとき、2を小数第1位、3を小数第2位…というように呼ぶ。

 

数学は魔法

数学を知っていると、一見解くのが困難に思える問題をさくっと解くことができます。

例えば、BMIは 体重(kg) / 身長(m)^2 で計算できますが、身長の値を特定の値の平方根と見ることで、以下の知識が応用できます。

平方根の覚え方と値(sqrtはルート(√)を表します)

sqrt(2) = 1.41421356..(一夜一夜に人見頃)
sqrt(3) = 1.7320508..(人並みにおごれや)
sqrt(5) = 2.2360679..(富士山麓オウム鳴く)

つまり、身長が170センチの人は、体重を3で割ることによって、おおまかなBMIが算出できます。173センチならほぼ正しい値が期待できますね。

日常生活、特に雑談において正確な値が必要になることは稀ですから、こういった数字を覚えておいて、必要なときにアウトプットできるようになると、一歩魔法使いに近づけると思います。

また機会があれば、数学に関する小ネタを書いていきます!

解答

Q1.ある1桁の数字(N>1)の2乗(同じ数字同士を掛けること)を取ったら1桁の奇数になった。Nはいくつか?

答え:

掛け算をしたら奇数になったので、Nは奇数。1桁の奇数は1,3,5,7,9の5種類N>1だから、3,5,7,9のどれか。掛け算をして1桁の値になるのは3だけ。

Q2.123456789は3の倍数だろうか?

答え:3の倍数である

123456789の各桁を足すと45になる。これは3の倍数なので、3の倍数。

ちなみに、123,234などの、連続した値が続く3桁の整数はすべて3の倍数になる。理由を考えてみよう。

Q3.1900以上、2000以下の整数の中で、5で割り切れる数はいくつあるか?

答え:21個

 該当する整数は19{0,1,2,3,4,5,6,7,8,9}{0,5}と2000である。19XXのパターンは10×2で20通り。2000を含めると21個になる。

Q4.22/7を小数で表現した時、小数点第100位の値を求めよ。

答え:

 22/7 = 3 + 1/7と変形できれば、22/7 = 3.142857..と続くことがわかる。

100 / 7 = 14余り2なので、100番目は142857を14回繰り返して、2個進めれば良い。よって、答えは3.142857...1428571[4]の4になる。

交通費と住居代を考える

お久しぶりです。

しばらく間が開いてしまいました。

個人的な事情ですが、転職しまして、現在新天地で働いております。

世間では景気が悪いなどと言われ、日経平均は大きく前後しているなんとも言えない時期ですが、楽しく過ごしております。

 

今日は、表題のように、交通費と住居代について考えてみたいと思います。

 

引っ越しと交通費

転職をすると職場も変わるわけで、自分も例外なく最寄り駅が変化しました。そこで、これを気に引っ越しをしよう、そう考えました。

ここで問題になってくるのは、引越代と引越し先の場所、そして家賃(ローン)でしょう。

ここで、仮にAさんのケースを考えてみます。

  • 年齢 30歳
  • 年収 600万円(手取りおよそ30万、ボーナス年間100万)
  • 貯金 400万円
  • 現在 独身(結婚は数年後予定)
  • 住居 家賃11万 神奈川県、職場までおよそ1時間

このAさんが今回転職をして、収入が少しだけ増えました。そこで引っ越しをしようと思い立ちました。

  • 案1
    引っ越しをしない
  • 案2
    通勤時間を30分削減する
    家賃は+2万
  • 案3
    通勤時間を40分削減する
    家賃は+3万
  • 案4
    マンションを買う
    初期費用は400万、4200万のマンションを購入
    通勤時間は20分、月々の支払は13万ほど

 それぞれの初期費用、維持費は以下のようになります。

  • 案1
    初期費用なし
    維持費 11*25/24 = 114,500円
  • 案2
    初期費用 13(*4) 52万
    維持費 13*25/24 = 135,400円
    通勤時間 月間20時間削減
  • 案3
    初期費用 14(*4) 56万
    維持費 14*25/24 = 145,800円
    通勤時間 月間25時間削減
  • 案4
    初期費用 400万
    維持費 13*24 = 130,000円
    通勤時間 月間25時間削減

こうやってみると、1ヶ月の残業時間削減効果はすごいなあと思う反面、引っ越しには金がかかるなあと思うわけです。

Aさんの場合はどうしたのかわかりませんが、このくらいの金額になると分譲を買うという手も検討できそうですね。

北欧一人旅に行ってきました(1)

こんにちは。

前回の投稿から、さらに時間がたってしまいました。

プライベートな部分や仕事の部分それぞれでゴタゴタがあり、ようやく落ち着いてきたところです。

おかげさまで、しばらくお休みをいただくことができ、その休みを利用して北欧に行ってきました。

行った都市はヘルシンキフィンランド)、タリン(エストニア)、ストックホルムスウェーデン)です。

日程は7泊8日(機中泊含む)で計画を立てることにして、おおざっぱな日程は以下のようになりました。

  1. 成田(11:00)→ヘルシンキ(15:10) ホテル泊
  2. ヘルシンキ滞在 ホテル泊
  3. ヘルシンキ→タリン(2時間)→ヘルシンキ ホテル泊
  4. ヘルシンキ滞在 ホテル泊
  5. ヘルシンキ滞在 ホテル泊
  6. ヘルシンキストックホルム 船内泊
  7. ストックホルム滞在 ストックホルムヘルシンキ 船内泊
  8. ヘルシンキ(17:15)→成田(8:55) 機中泊

計画をたてる際には、以下の点を考慮しました。

  • ヘルシンキ観光がメイン(3日以上滞在したい)
  • 船内泊がしたい
  • 最低3カ国以上回りたい
  • 移動、滞在費は20万くらいにしたい

一般のツアーの場合ですと、2名以上参加で、6泊8日の最安が12万から、といったところでした。北欧のホテルは(日本も観光地はそうだと思いますが)定員が2名以上の部屋ばかりですので、一人旅の場合は高くついてしまいます。(プラス5万〜)

そこで、上記金額を参考にしたうえで、ツアーでは組み込みづらい船旅を含めて計画を立てよう、ということになりました。

もちろん、その場合は航空機のチケットからホテル、フェリー、すべてを自分で予約しなければならないため、手間がかかります。

  • 往復航空券(成田←→ヘルシンキ 往復 直行便) 85,000円
    直行便がFinnairとJALしかないので、こちらで予約。
  • ホテル5泊分(Original Hotel Sokos Presidentti) 72,000円
    ツアーだとミドルクラスくらいのホテル。駅から近い。
  • フェリー(ヘルシンキ→タリン→ヘルシンキ) 8,045円(58€)
    タリンクシリアラインで予約。ネット(Aferry)で予約したが、行きと帰りを逆に買ってしまって、窓口で29€支払って反対にしてもらった。危ない。
  • フェリー(ヘルシンキストックホルムヘルシンキ) 27,000円(200€)
    バイキングラインで予約。2名用の個室を一人で使うタイプ。少し広めのキャビンタイプ。朝食、夕食(1日分)、サウナ(1日分)込。

以上で、合計すると19万くらい。

フェリーを足した分少し高くなってしまいましたが、ツアーと比べ、「船内泊がある」「タリンに行ける」「合計3カ国回る」という点では優っています。

ちなみにバイキングラインは往復(1日目夕方発→2日目朝着、2日目夕方発→3日目朝着)で予約すると割引があるのですが、この場合は荷物を部屋に置いて行くことができるので、コインロッカーの心配をすることがなく、安心です。

これを書いているのが、ストックホルムヘルシンキの船内(WiFiあり)からなので、すべてが終わっているわけではないのですが…

まったくヘルシンキを知らない(ガイドブックのみ)、かつ英語もあまりできない人間の一人旅情報が何かの役に立てば、ということで書き残そうと思います。

役立つ豆知識的なものも紹介していこうと思いますので、よかったら御覧くださいませ。

(2)に続きます。