フリーランチ食べたい

機械学習、データサイエンス、ソフトウェアエンジニアリング、プロダクティビティ...

SeleniumでJavascriptObjectの状態の変化を待機してから動作させる

TLDR

Custom Wait Conditionsとdriver.execute_scriptを組み合わせるとできる

Seleniumで「ある特定の動作を待つ」

最近はSPA的なサイトが増えてきたので「求めているDOMがブラウザにレンダリングされた」後に「ある特定の動作をさせたい」という気持ちになるときは多いのではないでしょうか。 そういう場合のために、Seleniumには、「待機する」用のClassが用意されています。例えば WebDriverWaitexpected_conditions です。 公式ドキュメントの例ですが、下記のように書くことができます。

5. Waits — Selenium Python Bindings 2 documentation

下記の例の場合、「idがmyDynamicElementの要素が出現するまで10秒ごと待機する」コードになります。

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

driver = webdriver.Firefox()
driver.get("http://somedomain/url_that_delays_loading")
try:
    element = WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.ID, "myDynamicElement"))
    )
finally:
    driver.quit()

様々な条件で待つ

presence_of_element_located 以外にも下記のようにメソッドが用意されており、様々な条件で待機することができます。

* title_is
* title_contains
* presence_of_element_located
* visibility_of_element_located
* visibility_of
* presence_of_all_elements_located
* text_to_be_present_in_element
* text_to_be_present_in_element_value
* frame_to_be_available_and_switch_to_it
* invisibility_of_element_located
* element_to_be_clickable
* staleness_of
* element_to_be_selected
* element_located_to_be_selected
* element_selection_state_to_be
* element_located_selection_state_to_be
* alert_is_present

JS Objectをチェックしたい

ただ問題としては全てHTMLの条件をチェックするということです。 待機する要素が多数に渡る場合は全ての要素をチェックするのはかなりしんどいので「一連の動作が終わったあとに、あるJS Objectの要素が書き換わる」ことをチェックしたいケースは少なからずあるのではないでしょうか。そんな場合は上記のメソッドは使えません。

Custom Wait Conditions

そんなときに使えるのがCustom Wait Conditionsで自分で特定の条件を書くことができます。 公式のも例がありますが、最もシンプルな例ではないので、もっとシンプルに書くと第二引数に driver を受け取る __call__ さえあればOKです。 __call__ は「ある特定の条件を満たしていなかったら False をそれ以外は受け取りたい要素を返す」ように実装します。

class CustomCondition:
  def __call__(self, driver):
    some_value = driver.some_method()
    if some_value == “some_condition":
        return some_value
    else:
        return False

wait = WebDriverWait(driver, 1)
some_condition = wait.until(CustomCondition())

この例だと「1秒ごとに状況をチェックしにいって、Falseでなかったら終了(値が帰ってくる)」コードになります。

driver.execute_script でJS Objectの状況取得

あとはこの条件にJS Objectの状況を入れられれば任務完了になります。SeleniumからJS Objectを取得するには driver.execute_script メソッドを使えば良いです。

7. WebDriver API — Selenium Python Bindings 2 documentation

例えばグローバルに以下のようなオブジェクトがあった時に

foo = {bar: ‘hoge'}

下記のようにして値を取得することが出来ます。

value = driver.driver.execute_script(‘return window.foo.bar’)
print(value) # => hoge

組み合わせる

これをCustom Wait Conditionsと組み合わせるとこのようになります。

class CustomCondition:
  def __call__(self, driver):
    some_value = driver.driver.execute_script(‘return window.foo.bar’)
    if some_value == “hoge":
        return some_value
    else:
        return False

wait = WebDriverWait(driver, 1)
some_value = wait.until(CustomCondition())

これで「 foo.bar == “hoge” になるまで動作を待機する」コードが書けました。めでたしめでたし。

(古典)統計学と機械学習の翻訳テーブル

(古典)統計学機械学習では使う名称が全然違う

土日は医学系研究室で客員研究員として粛々と研究しているのですが、医学系の研究というのはまだまだ古典統計学が主流です。古典統計学を扱う時の問題は色々あるのですが、その中でも大きいのは機械学習と同じ概念なのに名称が違うことです。 これはけっこう大変で、自分は普段「機械学習の用語」で考えているので、「(古典)統計学の用語」で考えている教授や学生さんと話すときに脳をフル回転させて同時翻訳する必要があります。もはやバイリンガルみたいな気持ちです。

まぁ大変なだけだったら良くないけど良いのですが、ときどき認識の齟齬が発生したりして、それは実質的な問題なので、とりあえず今後間違いを減らせるように「翻訳テーブル」を作ってみました。

モデルに対する翻訳テーブル

(古典)統計学 機械学習 備考
重回帰分析 一般線形回帰モデル 一般化線形回帰モデルを(古典)統計学でなんと呼ぶのだろうか
従属変数(dependent variable) 目的変数(response variable) 数式ではY
独立変数(independence variable) 説明変数(explanatory variable) 数式ではX
要因, 質的変数 離散の説明変数 (古典)統計学では名義尺度、順序尺度などさらに分かれている
共変量, 量的変数 連続の説明変数
偏回帰係数, 回帰係数 パラメータ、係数
尤度関数 目的関数, 損失関数(符号は逆)

適宜更新していきたい

とりあえず今思いついたものを書き出してみただけなのですが、普段から言語の壁を感じまくっているので気付いたら書き足していきたいと思ってます。「これもあるよ!」という方がいたら教えてください。

リモートワークの戦略とメリデメを整理する+弊社のリモートワーク事例の紹介

「リモートワークどうですか?」に対する回答を考える

今、自分が働いている会社はリモートワークを推進していて、自分自身も週3~4でリモートワークをしています。そういう状況なので、最近よく「リモートワークってどうですか?上手くいきますか?」と聞かれることが多いです。自分に関して言えば、リモートワークは「上手くいっていて最高!」なのですが、世の中では「リモートワークの失敗例」というものも表面化していて、一概に「リモートワークはイイ!」「リモートワークはワルイ!」で語ることに限界を感じていました。

ちょうど良い案件があった

そんなことを考えているところに、リモートワーク導入を考えている会社の友人から質問リストをもらったので、それに回答しながらリモートワークにおける戦略とメリットデメリットを整理してみました。 基本的にここに書いたことは自分の経験を元に仮説として考えたものでたたき台のイメージです。これを元にリモートワーク導入について誰かと議論できたらいいなと思っています。また、結果的に弊社のリモートワーク事例の紹介にもなりました。

質問リスト

それでは、下記の質問に答えていきたいと思います。

①リモートワークと会社出勤、両方選べるならどっち選ぶ?
②その理由はなんで?
③リモートワークで起きるいいこと
④リモートワークで起きる悪いこと
⑤生産性あがった?
⑥会社として生産性管理やモチベーション管理はどうしてる?
⑦MTGはどうしてる?
⑧今後リモートワークができる会社に有能な人は集まると思う?

①リモートワークと会社出勤、両方選べるならどっち選ぶ?②その理由はなんで?

タスクによって向き不向きがあると感じているので、ときと場合によって使い分けています。

分類してみる

具体的には下の図のように分類できるのではないかと、ふわふわ考えています。

まずタスクの分類です。色々な分け方があるかと思いますが、今回はタスクの難易度意思決定の頻度で見てみました。

f:id:mergyi:20180804020931p:plain

自分の場合は

  • A(タスク難, 連絡 少): 基本的にリモートワーク
  • B(タスク易, 連絡 少): どちらでも良い(都合の良い方)
  • C(タスク易, 連絡 多): どちらでも良い(都合の良い方)
  • D(タスク難, 連絡 多): 基本的に出社

するようにしています。こう見てみると、タスクが簡単であれば、リモートでも出社してもそんなに生産性に差がなく、タスクが難しく複雑なときは生産性に大きく影響するのではという仮説を立てることができます。リモートワークの生産性に関して語るのであれば、タスクを分類して生産性が下がりそうなタスクに対してどう対応していくかが大事だと思います。

割合は?

人によってバラバラだと思いますが、自分はざっくりと下のような感じです。 f:id:mergyi:20180806120909p:plain

A(タスク難, 連絡 少)の割合が多く、(Aに集中させてもらえてるのは貴重なことだと思うので感謝してます)リモートワークで生産性がかなり上がった、と感じています。

③リモートワークで起きる良いこと

「リモートワークできる」ということは単純に人生というRPGの自由度が上がるということなので良いことはたくさんあります。

仕事に集中できる

オフィスで働いているときはいろんなインターラプトがありました。 誰かに質問されたり、近くで気になる会話をしていて耳をそばだててしまったり。 これは良い刺激だし、楽しいのですが、やはりフロー状態に入る回数は少なかったと思います。 今はインターラプトは宅急便くらいしかないし、集中できる時間帯(自分は深夜が一番捗ります)にまとめて作業できるので捗ります。フロー状態に入る回数はかなり多くなったと思います。

土日が「真の休日」になる

これはリモートワークしていないと意外とわからないかも、と思いました。 以前も土日は休みだったんですが、平日にできない家事や荷物受け取り、市役所・病院に行く用事などをするのに毎週半日は使ってたと思います。今はこれらの作業は全て仕事をこなしながら平日に行ってます。なので土日は完全に自分の時間として使えます。

家族との時間が取れるようになる

僕は独り身なので実感は薄いのですが、チームのメンバーを見ていると「子どもの送り迎え」や「ご家族の看病」など家庭へのコミット度がハンパないなと感じます。お子さんを膝に載せながら働いているメンバーを見ると微笑ましすぎてとても幸せな気持ちになってしまいます。普通に「自分の父親もこういう働き方していたら母親はありがたかったろうな〜」と思うことが多いです。

健康になる

これは人による、と思いますが、自分は転職前は食事は基本的に外食、運動は時間が取れず出来てないという、まさに現代人、な状態だったのですが、今は、食事は自炊が8割、毎日2回ジョギング、週に3回トレーニングしている状態なので、激変したと思います。食事も野菜の量に気を使ったりできるようになりました。「それってリモートワーク関係なくない?」と思われるかもしれませんが、実際リモートワークして変わったのです。多分、時間と精神的な余裕のおかげかなと思ってます。

※福利厚生と書いてありますが、会社の福利厚生ではないです。笑

遊びの自由度が広がる

遊びたいときに遊び、働きたいときに働くスタイルになりました。 ふつうの平日の昼間に外で流しそうめんをするなんてリモートワークしなければ考えられなかったです。

④リモートワークで起きる悪いこと

上述させてもらった内容になりますが、「リモートワークできる」ということは単純に(自分も他のメンバーも)人生というRPGの自由度が上がる、ということなのでリモートワークすると絶対に起きる「悪いこと」というのは存在しないと思います。ただ、RPGと同じ(?)で自由度が上がれば難易度も上がります。では「何ができなかったら、どんな悪いことが起きるのか」を考えてみました。 f:id:mergyi:20180804033150p:plain

上記のように「組織としてカバーすべきこと」「個人がカバーすべきこと」のどちらかが達成されなかった時に悪影響が発生すると考えています。この図自体はリモートワーク関係ないのですが、リモートワークは非リモートワークに比べて「組織に求められるもの」も「個人に求められるもの」もレベルがかなりあがるイメージがあります。

⑤生産性あがった?

①に書いたAのタスクに関しては非常に生産性が上がったと感じてます。 入社して3ヶ月で月間MVP、上半期MVPもらえたのはこの生産性向上がなかったら(リモートでなかったら)絶対できなかったと思ってます。(MVPはちょっと自慢。笑)

ikedaosushi on Twitter: "全社MVPをもらって喜ぶ28歳。入社して3ヶ月、大変な事もあったけど、頑張ってきた事を評価してもらえて本当に嬉しい🙌🙌🙌… "

⑥会社として生産性管理やモチベーション管理はどうしてる?

OKRを使って目標管理を行っており、全社、部門、部署、PJとドリルダウンしていく仕組みになっています。 モチベーション管理というかわからないですが、働きやすい環境をつくる工夫はたくさんされていて、その一部はBlogでも紹介されています。

⑦MTはどうしてる?

Zoomを使って行ってます。通信状態が悪くてもかなり繋がりやすいし、画面シェア機能の細かい設定ができるので便利に使ってます。 また、リモートワークだから得られた面白い利点みたいなものがあったので書いておきます。

オフィスにいてもリモートMT

今の会社に来て面白いなと思ったのは、MTに出席者が2人以上オフィスにいても参加者の何人かがリモートだとZoomでリモートMTするということです。最初はえ?と思ったのですがやってみるとパラダイムシフトが起こりました。どんな状況でもZoomを使う(使える)、ということはMTする相手がどこにいるか、や、MTの場所を一切考えなくていいんです。 今はMTを開催するまで/されるまで、の精神的障壁がかなり低く「MTの内容に集中できている」と感じます。’

どんなMTにでも参加できる

会議室ごとにZoomのURLが設定されているので、会議室で行われるような「経営会議」などには自由に参加して話している内容を聞くことができます。オンボーディングの一貫で自分が参加しない部としての方向を決定するMTにZoomで参加して部としての現状を把握するのは、その後の仕事にとても役立ちました。

⑧今後リモートワークができる会社に有能な人は集まると思う?

これは一般論半分という感じですが、下の図のように「A(リモートしたい人の集合)」「B(リモートしてもしなくても良い人の集合)」を書いた時にそれぞれに一定の割合で「優秀な人」がいるはずなので「リモートOKな会社」の方が当然、優秀な人を雇うチャンスは大きいと思います。 f:id:mergyi:20180804030348p:plain

今後、という話だと図にも書いたとおり、時代に合った働き方をしたい、みんな考えていると思うのでA(リモートしたい人の集合)が増えてくると思います。 そうなると「リモートOKな会社」の方が優秀な人を雇うチャンスはどんどん大きくなってくるのではないでしょうか。

さいごに

以上で質問への回答は以上です。今更ですが、自分はリモートワークをしているし、リモートワークが好きなので完全にポジショントークです。また、本当はもっと細かく詰めたいところばかりなのですが、体力が尽きたのでまた誰かと議論してまとまってきたら追記していきたいと思ってます!

2018-08-03 ニュースと感想

docs.google.com スライド101枚, 2時間で統計的基礎からDeepLearningまで学べるスライド。丁寧で良い教材、ただし英語。

qiita.com 10個は多いけど、勉強になる。解析する人とエキスパートはやっぱり分けるほうが多いらしい

https://arxiv.org/pdf/1703.02528.pdfarxiv.org www.reddit.com TitleとAbstがおもろい論文がある。redditで釣り、というコメントあるからそうなのかもしれないけど。w

goodpatch.com 以前から続いているレポの後編。GoodPatchで開催されたTakramとThe Guildのトークセッション

あるいは数学系からデザイナーにくる人はもっと増えると良いのではないかと思っています。特にエンジニアのなかのオブジェクト思考やモデリングなどができる人は、デザイナーになる素養がすごくあると感じています。結局先ほど言ったルールを抽象化して再構成してというところが、デザイン仕事の半分以上です。

例えば、ABテストがあるせいで、自分のクリエーションが否定されるようなことは少しネガティブな捉え方ですよね。 やはりそれらは道具だと割り切って、ABテストが流行ったおかげで「自分の作りたいものを2つ勝手に作って納品できるようになったぞ!」くらいの気分でいたほうが良いと思います。 好きなものを2つ作ったから、あとはクライアントが好きなものを選んでくれるみたいな心持ちで。 結局AかBどちらか1個にして、片方が否定されるとか考えてしまうからなかなか難しくなってしまうのだと思います。ABテストなどは、そう言うデザイナーをジャッジするツールじゃなくて、単純にデザイナーのための画材などのツールの一種だと思った方がやりやすいんじゃないかなと思います。

当然かもしれないけどデザイナーにとってA/Bテストはネガティブな材料にもなり得るんだなーと。デザイナーにとっても使いやすい「ツール」でないといけない

type.jp

彼らの興味は共通して「スキルアップ」なんですよ。決して「キャリアアップ」を目的に行動していない。技術者として興味を感じるものにアプローチして、スキルを上げていくことを楽しみながらやっている内に、自然にキャリアも上がっている。

press.forkwell.com

最近好きな言葉は「正しさには2つある」です。validationとverificationという言葉があって。validation は value から来てて、「価値がある」という意味、verification は very から来てて「とても、まさしく」という意味です。 これを両方保てる人間になってほしい、というのが最近やってることですね。期日に追われる中でも、自分たちの価値を最大化しましょうと。そのためには、結局勉強するしかないんです。ソフトウェアを勉強するというのは、両方の正しさを満たすため。どちらかやればいい、というわけではないんです。

cloudplatform-jp.googleblog.com https://cloud.google.com/functions/docs/concepts/python-runtimecloud.google.com CloudFunctionが正式リリースされたし、Pythonもサポートされたのでドキュメントみてみたらサードパーティライブラリもサポートされてる(requirements.txtおけば良い)みたいで自前でやらないとなAWS Lambdaより大分良さそう。特にネイティブエクステンション使うライブラリ群が。あとversion3.7なのも良い。 書き方はFlaskっぽく書くのが特徴的らしい。

www.rehabilimemo.com

現在のところの安全とされるタンパク質の摂取量の上限は、1日あたり1.6-2.0g/kgまでとなります。 絶対超えてた気がする。ヤバい

techlife.cookpad.com Cookpadがchaos engineeringやっていくらしい

ischool.co.jp この記事の本題でないけど、cmd+shift+p で色んな操作呼び出せるのめっちゃ便利だ。 cmd+opt+j からの cmd+shift+p で捗る

qiita.com めっちゃ面白いと思ったらいつものotsukiさんだった

matthias-endler.de system callのspliceを使って書いてみるとcatがめっちゃ高速化できるという話。 使う機会はないと思うけど、linuxとshellの勉強に良い

https://note.theguild.jp/n/n56286ffe13d3note.theguild.jp GUILDはキャラが濃くて楽しそう

theintercept.com GoogleがDragonflyというPJ名で中国向けの検閲済検索サービスをリリースする予定とのこと

japanese.engadget.com いい話だった。授業を受けた子どもたちは幸せだな〜。自分も受けたかった

webtan.impress.co.jp 利用率はYahoo, Google, Youtubeの順番

tech.starttoday-tech.com vasilyのgotoさんのエントリ。Siamese Networks, Permutation invariant

tech.nikkeibp.co.jp 噂はホントだった。IoTとのシナジーが目的とのこと

www.treasuredata.co.jp TD代表の芳川さんのエントリ。胸が熱くなる良い話

簡単で美味しい鶏肉チャーシューの作り方

後輩に教えてもらったのでメモ。タンパク質を摂るのに便利。

  1. ジップロックに鶏肉と醤油大さじ2+砂糖大さじ2+レモン汁大さじ2+酒大さじ1入れる
  2. 炊飯器にお湯とジップロックを入れる
  3. 「保温」で2h待つ。2h経ったら外に出して粗熱を取って、冷蔵庫で2hくらい寝かせる(寝かせた方が柔らかくなる)
  4. ジップロックから取り出して食べやすい大きさに切る。超美味い。玉ねぎスライスとかも合う

Linuxで `adduser` に `-gecos` を指定したら何ができるか。なぜ `gecos` という名前なのか。

あるソフトウェアのセットアップで adduser -gecos を設定するExampleがあって、何をしているか理解していなかったので調べてみました。

TLDR

  • -gecos optiongecos field を設定するときに使うもの
  • なぜ gecos というかは歴史的経緯があった
  • システムとしてのみ使う場合に便利

GECOSとは

まず man で調べてみると gecos field を設定するときに使うオプションらしいです。

# man adduser
--gecos GECOS
          Set  the  gecos field for the new entry generated.  adduser will 
          not ask for finger information if this option is given.

それでは gecos field は何かと言うと

GECOSフィールド - UnixClassWiki

本サイトでのパスワードファイル中のコメントをかけるフィールドに関してはコメントフィールドと呼んでいますが、ここは伝統的にはGECOSフィールドあるいはGECOS情報と呼ばれています。 これはGECOSとは米ジェネラル・エレクトリック社が1960年代前期に開発したオペレーティングシステム GCOS(General Comprehensive Operating System) のことです。 なぜUNIXのコメントフィールドがGECOSフィールドと呼ばれているかというと、むかしベル研究所の頃にGCOSに接続するために必要な情報がこのフィールドにかかれていたためです。 ここはカンマで区切られたリストで、特に何を書くか正確に定義づけられているわけではありませんが、慣習的に次のようになっています。

  • ユーザのフルネーム
  • 部屋番号やビル名
  • オフィスの電話番号
  • その他のコンタクト先(FAX番号など)

不意にめっちゃ面白い豆知識に当たってしまいました。 俗に言う歴史的経緯ってやつですね。

コメントフィールドと言われるくらいなのでシステム的に必要なものではないということですね。

検証

環境

docker上で行いました

# cat /etc/os-release
NAME="Ubuntu"
VERSION="16.04.4 LTS (Xenial Xerus)"

通常通り adduser してみる

# adduser test
Adding user `test' ...
Adding new group `test' (1000) ...
Adding new user `test' (1000) with group `test' ...
Creating home directory `/home/test' ...
Copying files from `/etc/skel' ...
Enter new UNIX password:
Retype new UNIX password:
passwd: password updated successfully
Changing the user information for test
Enter the new value, or press ENTER for the default
        Full Name []: myoji namae
        Room Number []: 123
        Work Phone []: 456
        Home Phone []: 789
        Other []: 000
Is the information correct? [Y/n] Y

チェックしてみる

# grep test /etc/passwd
test:x:1000:1000:myoji namae,123,456,789,000:/home/test:/bin/bash

この

myoji namae,123,123,123,123

の部分がgecos fieldです。

--gecos optionを付けてみる

Exampleにあった --gecos "" を試してみました。

# adduser --gecos "" test
Adding user `test' ...
Adding new group `test' (1000) ...
Adding new user `test' (1000) with group `test' ...
Creating home directory `/home/test' ...
Copying files from `/etc/skel' ...
Enter new UNIX password:
Retype new UNIX password:
passwd: password updated successfully

先程と違い、Full NameやRoom Number...などなどは聞かれてませんでした。 では中身をチェックしてみましょう。

# grep test /etc/passwd
test:x:1000:1000:,,,:/home/test:/bin/bash

さきほど入っていたFull NameからOtherまでの番号がなくなりました。 システム的にしか使わない場合(Chefで動的にユーザーを作成するときなど)に重宝しそうですね。 だからちょくちょく出てくるのか。スッキリしました。

参考リンク

sharadchhetri.com

2018-07-26 ニュースと感想

www.m3tech.blog folLeftとfoldRightでlistの捉え方が違うの面白い。そして図示するとめっちゃわかりやすい

www.advertimes.com マーケティングの比重がPromotionからPlaceに移行してきたというのは割と納得感ある。マーケティング会社もPlaceを広げる事業がこれから重要視されてくるんじゃないですかね(素人目線)

japan.zdnet.com ちょっと欲しい

blog-ja.sideci.com defunktのバグを直した話とかRubyのコーディング規約の変更全然伝わってない話とか面白いw

tech.instacart.com こないだのpycampでもvenvを教えててまだpipenvはデファクトじゃないのか…という気持ち。それとは別にloreは便利そう

ai.googleblog.com BigQueryにMachineLearningが追加されたとりあえず触ってみたい

twitter.com GithubからjQueryが一掃されたらしい

jaco.udcp.info k8sを抽象化してくれるもので、レイヤー的にはlambdaと近い位置にあるのかな。なるほど

www.cnet.com Chrome以外でYoutubeを見ると5倍遅いらしい。(Chromeでしか実装されていないShadowDOM v0に依存したつくりになっているため)

www.starttoday.jp インテルの跡地にできたZOZOTOWNの工場で立ち上げスタッフを募集している

tech-camp.in プロダクト中心だとプラダクトライフサイクルに引っ張られて軸がしっかりしないというのは実感がある