中野智文のブログ

データ・マエショリストのメモ

東京以外のおすすめAWSリージョン

背景

東京リージョンは応答時間は早いけど、応答時間がどうでもいいなら、もっと安いリージョンがいい。 もう少し欲を言うと、AWSの最新のサービスが利用できるところがいい。 さらに欲を言うと、それでも応答時間が早いほうがいい。

リージョン比較

安いリージョン

qiita.com

によると、安いのは、us-east-1(ヴァージニア)か、us-west-2(オレゴン)だそうで。 ただちょっと古いのが気になる。us-east-2(オハイオ)も安い気がする。

最新技術

現時点で SageMaker が使える

現時点で Fargate が使える

https://aws.amazon.com/jp/about-aws/whats-new/2018/03/aws-fargate-platform-version-1-1/

その他

https://aws.amazon.com/jp/about-aws/global-infrastructure/regional-product-services/

たまにオレゴンしかないものものあるが、ヴァージニア優勢な感じ。

応答時間

qiita.com

地図上では西海岸の方が近いイメージだけど、そうらしい。

まとめ

us-east-1(バージニア北部)を使おう。

Windows PowerShell の OpenSSH でパスワードを正しく入れてもログインできない。

背景

Windows PowerShell の OpenSSH でパスワードを正しく入れてもログインできない。

原因

-v オプションをつけることで原因を見つけることができた。

read_passphrase: can't open /dev/tty: No such file or directory

入力を ' /dev/tty' から取ろうとしているけど、Windowsにそんなものはない。

~/.ssh/id_rsa.pub などを転送してやれば、パスワード入力が省略でき回避できるかもしれない。 でもそれって、結局 scp でパスワード聞かれることだよね?

issue には上がっている。

github.com

最新版で解決したの? いえ、解決していないでしょ。

WSLを入れることにしたのでした。

参考

github.com

AWSのMFAが灰色で有効にできない→一応解決

背景

AWSの「MFAの管理」が灰色で有効にできない。なぜなのか?

解決

灰色で有効にできない謎は未解決だが、一応できたのでメモ。

同じページのIAM リソース のユーザーをクリック。 自分の名前を見つけ出しクリック。 認証情報のタブをクリック。 すると、MFA デバイスの割り当てというところの右側に鉛筆のアイコンがあるのでクリック。

あとは通常のMFAの割り当てと同じ。

何か設定がおかしいのだろうけど、とりあえずできた。

BigQuery で base64 から uuid の形式へ変換する

背景

BigQuery で base64 から uuid への変換をUDFを使って行おうと思ったのでメモ。

経緯

atob さえあればそれほど大変ではないはず。ところが、 Google Developers Blog: Breaking the SQL Barrier: Google BigQuery User-Defined Functions によると、

Note that not all JavaScript functionality supported in the browser is available in BigQuery. For example, anything related to the browser DOM is unsupported, including Window and Document objects, and any functions that require them, such as atob() / btoa().

だそうで、面倒なことに。

解決

次の stack overflow の関数を拝借して解決…

create temp function base64_uuid(str string)
returns string
language js as """

  // [https://stackoverflow.com/questions/44836246]
  var chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';
  function InvalidCharacterError(message) {
    this.message = message;
  }
  InvalidCharacterError.prototype = new Error;
  InvalidCharacterError.prototype.name = 'InvalidCharacterError';
  // decoder                                                                                                                                                                                                                                                                              
  // [https://gist.github.com/1020396] by [https://github.com/atk]                                                                                                                                                                                                                        
  atob = function (input) {
    var str = String(input).replace(/[=]+$/, ''); // #31: ExtendScript bad parse of /=                                                                                                                                                                                                    
    if (str.length % 4 == 1) {
      throw new InvalidCharacterError("'atob' failed: The string to be decoded is not correctly encoded.");
    }
    for (
      // initialize result and counters                                                                                                                                                                                                                                                   
      var bc = 0, bs, buffer, idx = 0, output = '';
      // get next character                                                                                                                                                                                                                                                               
      buffer = str.charAt(idx++);
      // character found in table? initialize bit storage and add its ascii value;                                                                                                                                                                                                        
      ~buffer && (bs = bc % 4 ? bs * 64 + buffer : buffer,
        // and if not first of each 4 characters,                                                                                                                                                                                                                                         
        // convert the first 8 bits to one ascii character                                                                                                                                                                                                                                
        bc++ % 4) ? output += String.fromCharCode(255 & bs >> (-2 * bc & 6)) : 0
    ) {
      // try to find character in table (0-63, not found => -1)                                                                                                                                                                                                                           
      buffer = chars.indexOf(buffer);
    }
    return output;
  };
  
try {
  bin = atob(str);
  // [https://stackoverflow.com/questions/39460182/]
  h = bin.split('').map(function(b) {
    return ('0' + b.charCodeAt(0).toString(16)).slice(-2);
  });
  
  return [h[0],h[1],h[2],h[3],'-',h[4],h[5],'-',h[6],h[7],'-',h[8],h[9],'-',h[10],h[11],h[12],h[13],h[14],h[15]].join('')
} catch(e) {
  return ''
}
""";


select base64_uuid("1/DhINolQvadQcBOL4itew==")

BigQuery の standard sql にも ROLLUP はあるよ

背景

上手いこと使うと、全体の合計と、group で指定したそれぞれの合計が同時に取得できる rollup だが、日本語のBQの標準SQLのページには記載がない(2018/03/20現在)

具体的には次のような感じ

f:id:nakano-tomofumi:20180320103122p:plain

解決法

次のように言語の設定を英語にしよう。

f:id:nakano-tomofumi:20180320103336p:plain

すると group by の説明に…

f:id:nakano-tomofumi:20180320103349p:plain

データ解析のためのロジスティック回帰モデルを少し読んだ

背景

前から欲しかった本がある。Applied Logistic Regression 3rd Edition であるが、ご覧の通り、ハードカバーで1万6千円、Kindle 版でも1万円してしまう。

まず、Logistic Regression(ロジスティック回帰)であるが、深層学習ほど最新の研究成果があるわけでもないが、よく使う。 機械学習やビッグデータを扱うデータサイエンティストの年収や使用言語などを赤裸々にするデータ - GIGAZINEによると、Logistic Regressionは最も使われる機械学習手法で、63.5%のデータサイエンティスト(回答者)に使われるとされている。 また自分も仕事で使っているし、今後も使うと思われる。

この本のすごいところは1989年に初版が出てから、進化し第三版まで来ているところである。よく、統計や機械学習の質問サイトである、 Cross Validated でも取り上げられている。 かなり有名な書籍らしい。でも高い。

ある時ふと twitter のタイムラインを見ると、

というものが見えた。ぼやけてよく読めないがよくみると、Applied Logistic Regression と書いてあるではないか。それも日本語訳の書籍らしい。 データ解析のためのロジスティック回帰モデル という書籍らしい。 それも 3rd Edition! 調べてみると、なーんと、Amazon8856円。それも中古も出ている。 早速(中古を)注文した。

内容を少し

確かに難しい。第一章の一節目の一行目から、「応答変数」と「説明変数」がいきなり出て来るが、それについて何も説明がない。 そして、すかさず「独立変数(共変数)」が出て来るが、それ自身の説明ではなく、統計の回帰の目的について、である。

おそらく、この節で言いたいのは、ここを読んでわからない人には、この本はおすすめできません、といいたいのだろう。 だから、この本は初心者用や勉強用ではなく、実用(プロもしくは学生であればそれを使って研究している人)レベル(英語タイトルは確かにそうなのかも)と思った方がいいだろう。

まとめ

盛り上げといてなんだけど、少なくとも初心者にはおすすめできない。統計などの知識(例えば Wald検定、尤度比検定、Score検定)も必要(一章を読む限り)。 自分はとりあえず必要なところだけ読むみたいな仕方をしているが、Webにある他の情報をなどと照らし合わせながら、読んでる…。

Jupyter notebook (Python3) で mypy のチェックを行う

背景

python3 で導入された型ヒントだが、そのままだと静的にも動的にもアノテーション(単なるコメント)として扱われるらしく、ちょっと残念。 mypy というコマンドで型チェックを行ってくれるらしい。Jupyter notebook 上でも実行したい。

対応

mypy をインストールする。

pip install mypy

typecheck.py をダウンロード

ipython の profile ディレクトリの start up で typecheck.py をダウンロード

cd ~/.ipython/profile_default/startup
curl https://gist.githubusercontent.com/knowsuchagency/f7b2203dd613756a45f816d6809f01a6/raw/c9c1b7ad9fa25a57ee1903d755d5525894ffa411/typecheck.py -o typecheck.py

最新版?は、 A cell magic to enable the use of mypy within jupyter notebooks · GitHub で確認すること

カーネルの再起動

jupyter notebook の再起動でもいいけど、あのリロードボタン。

magics を評価したいセルに埋め込む

次の magics を使いたいセルの先頭に埋め込む

以下は例:

%%typecheck --ignore-missing-imports

foo: int

foo = 'var'

すると、<string>:5: error: Incompatible types in assignment (expression has type "str", variable has type "int") とエラー(警告)が表示される。 これが見たかった。

まとめ

あまり jupyter で使っている例を見ないけど、mypy は jupyter notebook で使える。

追記

残念なことに magics はセルごとに起動するので、別のセルの型ヒントや別のセルの typing から import した型は見えてないかもしれない(というか magics の仕組み上恐らく見えていないだろう)。 セルごとに毎度 import したり、まとめられるセルはまとめてしまうなどの工夫が必要。

参考

journalpanic.com