サクサク読めて、アプリ限定の機能も多数!
トップへ戻る
2024年ランキング
sucrose.hatenablog.com
自分がなんとなくBigQueryのクエリを書いていてハマった罠について列挙しておきます。 ドキュメントをちゃんと読めば書いてあったりするのですが、普段はそこまで細かく見てなかったりするんですよね……。 BigQueryのカレンダー | Advent Calendar 2023 - Qiita の16日目の記事です。 CAST(value AS INT64) は切り捨てではない 他のプログラミング言語などをやっているとなんとなく整数型にキャストすると切り捨てのような気がしてしまいますがBigQueryは違います。 四捨五入的な挙動になります。 SELECT CAST(1.5 AS INT64) -- => 2 Returns the closest integer value. Halfway cases such as 1.5 or -0.5 round away from zero. h
BigQueryのクエリでテーブル名を書くときに末尾に*を書いておくと、その部分が_TABLE_SUFFIXというカラムに入っていてWHEREの条件に書いて使うテーブルを絞り込むことができます BigQueryではテーブル名の末尾に日付を書いておいて、_TABLE_SUFFIXで絞り込むのがよく使われています 参照したバイト数によって課金されるので、できるだけ余分なテーブルを参照するのを避けるとコストを節約できます 以下の画像のように_TABLE_SUFFIXの条件を外すと処理されるバイト数が増えています BigQueryではパラメータ付きのViewやWITH句が書けないので、ビューの外側からパラメータとして_TABLE_SUFFIXの絞り込みを書くのはできないかと思っていたのですが、やる方法を教えてもらったので詳しい挙動を調べてブログに書いておきます ビューとWITH句でだいたい同じ挙動
前にAtCoderのレーティングの分布について調べて記事を書きました sucrose.hatenablog.com Twitterで「AtCoderにたくさん参加すればレーティングが上がる」という話を見かけて気になったので、ユーザーの参加回数とレーティングの関係を雑にグラフにしたりレーティングの分布のグラフを書いたりしてみました 調べるのが簡単なAtCoderのランキングに書いてある現在のレーティングと参加回数の表のデータを使いました https://atcoder.jp/ranking?p=1 AtCoderのレーティングの分布 レーティングの色分けについてはこちら↓ https://atcoder.jp/post/14 1回しか参加していないユーザーも数えているので灰色が全体の半分近くを占めています レーティング レーティング上位何%か 2800(赤) 1% 2400(オレンジ) 2%
PerlやPHPなどの標準の正規表現ライブラリはパターンの再帰をサポートしています(どこまでを正規表現というかはともかくとして) 以下の記事のFizzBuzzを解く話で使った3の倍数を表す正規表現が再帰を使えばスッキリ書けそうだったので試してみました 正規表現でFizzBuzz - 唯物是真 @Scaled_Wurm 上の記事では3の倍数を以下のような正規表現で判定しました (?:[0369]|[147](?:[0369]|[147][0369]*[258])*(?:[258]|[147][0369]*[147])|[258](?:[0369]|[258][0369]*[147])*(?:[147]|[258][0369]*[258]))+ この正規表現では、3で割ったあまりが0から0に遷移するパターン、0から1に遷移した後なんやかんや遷移してから0に戻るパターン、0から2に遷移した後なん
最近書いた再帰を使った正規表現を可視化しようと思ってGoogle検索してみたのですが、上位に出てくるサイトでも日本語が使えなかったりサポートしている正規表現にPCREの範囲(というか再帰)が含まれていなかったりいろいろでした いくつか正規表現の可視化サイトを試したので簡単に表にしました google: regex visualizer の検索結果上位3件を試したメモ サイト 日本語対応 正規表現の範囲 画像ダウンロード その他 Regexper ◯ 再帰はダメだった SVG, PNG Generated images licensed: CC BY 3.0と書いてあるので、生成した画像のライセンスが縛られているかも(?) Debuggex: Online visual regex tester. JavaScript, Python, and PCRE. △微妙に文字幅の計算がおかしいのか
MySQL 5.7からはJSON型のカラムが使えるようになりました このJSON型にはMySQLのいわゆるNULL値とは別に値がないことを示すnullという値があって混乱したのでメモしておきます (この記事の内容はたまたま手元にあったMySQL 5.7.20で確かめました) 便宜上この記事ではNULLをMySQL全般で使われている値がないことを示す値、nullをJSON型で値がないことを表す値のことを指しておきます(実際にはNULLの方はケースインセンシティブで、nullの方は小文字のみです) 呼び方がないと困るのでnullの方をJSON型のnullと呼んでおきます 値の取得 JSON_EXTRACT()や`カラム名`->"JSONのパス"と書くとJSONの値を取得できます mysql> SELECT JSON_EXTRACT('{"foo": "123"}', '$.foo'); +--
QiitaとAdventarにあるアドベントカレンダーについて、個別の記事とカレンダー全体のはてなブックマーク数のランキングを29日の21時ごろに集計した 個別記事上位100件のURLについては軽く目で見て文字化けを直したり最近の記事ではないURLをフィルタリングしてある(スクリプトのバグや作業ミスで抜けてる場合があったらご容赦ください。バグを直していただけるととても嬉しいです) カレンダーごとの合計数のランキング カレンダーとカレンダーに登録されている記事のはてなブックマークの合計数 順位 カレンダー名 はてなブックマーク数 1 Mercari 3411 2 ex-mixi 2870 3 ひとりでデータ分析ガチ勉 2627 4 武蔵野 1920 5 python 1888 6 CrowdWorks 1886 7 はてなエンジニア 1787 8 Livesense - 学 1621 9 ド
BigQueryでクエリを書く時に、クエリの書き方によって実行時間を高速化できたり処理するバイト数を節約したりできます Googleが公式でBigQueryのベストプラクティス集(今はまだ未翻訳)を公開してくれているので、そのうちのクエリを書く時周りのノウハウを簡単にまとめておきます。別々のページの内容なので重複があったら端折ったりしています 誤訳や解釈の誤りがあったらコメントなどで教えてください BigQueryのベストプラクティス(クエリ編) 入力されるデータの量を減らす SELECT *を避ける 日付でパーティショニングされたテーブルの場合必要なパーティションだけを指定する 可能な限り非正規化されたデータで扱う 外部リソースを入力にするのは高速ではない テーブル名をワイルドカードで指定するときは必要なテーブルだけを指定する 通信の最適化 JOINする前にデータの量を減らす WITH句
Twitterで見かけた以下の記事で紹介されていた論文がおもしろそうだったので読んだ感想と内容のてきとーな紹介(詳しく知りたい人は元論文を呼んでください) マイクロソフトの研究者による、いわゆる A/B テストにおいてメトリックを解釈するときに陥りがちな罠12選。実例がことごとく直感に反していてとても面白かった。 https://t.co/jC9JOsx1uB— Shuhei Takahashi (@nya3jp) 2017年10月11日 内容が間違っている部分があったらコメントなどで教えていただけると嬉しいです 論文 このKDD2017の論文ではABテストの結果を解釈する時に陥りがちな12種類の罠についてMicrosoftの研究者が実例と対策を交えて説明しています Pavel Dmitriev, Somit Gupta, Dong Woo Kim and Garnet Vaz, "A D
今回は機械学習系などでTwitterで見かけたのを入手した 気になった記事だけ触れます SIGNICO 『SIGNICO vol.4』 SIGNICO 冊子版とPDF版があったのでPDF版を手に入れた ミスマッチ判別機を用いたイラストの着色転写手法の提案 線画と色情報を表す参照用の画像を使って、指定した色風の画像を生成する 画像から色情報を抽出するようなネットワークと、抽出された色情報と線画を入力として画像を生成するネットワークと、抽出された色情報と線画がマッチしたものであるかどうかを判別するネットワークでGAN的なことをしている 自由にポーズを変えられる画像生成 OpenPoseを使うと画像から人間のポーズを抽出できる この抽出されたポーズからGAN(pix2pix)を使って画像を生成している ニューラルネットワークで画像圧縮 ニューラルネットワークを使った画像の圧縮手法のWaveOne
形態素解析器で分割してからBigQueryに載せればいいでしょって話ではあるのですが、既に載っているデータだったり、ログを載せるプロセスに形態素解析を新たに噛ませるのは大変だったりします とりあえず試してみたいだけの時に気軽にやりたいので、BigQuery上で単語分割できないか調べてみました さすがにSQLで単語分割するのは無理ですが、BigQueryではUDF(ユーザー定義関数)が使えるのでJavaScriptのライブラリを使います JavaScriptで単語分割できるライブラリは例えば以下のようなものがありますが、サイズなどの制限の問題でTinySegmenterを使います TinySegmenter: Javascriptだけで実装されたコンパクトな分かち書きソフトウェア stop-the-world: ブラウザで自然言語処理 - JavaScriptの形態素解析器kuromoji.
LTV(lifetime value)という顧客(ユーザー)が将来的に使う金額を予測しようという話があります 前に以下の記事でも書きましたが、月額課金制のサービスだと粗い推定として解約率を一定とみなして解約率の逆数を平均継続期間としてLTVを計算したりしています sucrose.hatenablog.com LTVがわかれば、例えばLTVが5000円のユーザーを獲得するのにコストとして3000円をかけるとユーザーを一人獲得するごとに2000円ずつ利益が出る、と言った計算ができます 新規ユーザーのLTVを既存ユーザー全体の解約率の逆数で計算しているのを見かけて「新規ユーザーの解約率って既存ユーザー全体の解約率とは全然合わないのでは?」と思ったので簡単に計算してみました(先月以前に契約した解約率の低いユーザーが残っているので新規ユーザーの解約率よりも全体の解約率は下がるはず?) シミュレーショ
勉強会で発表したので内容を適当にまとめてブログ記事にしておく いつの間にかリファレンスが日本語化されているので、全部一読したい人はそちらを読んだほうがよいかも SQL Reference | BigQuery Documentation | Google Cloud Platform ちなみに日本語版のリファレンスだと最近の変更点が載っていない場合があるので、最新の情報を知りたい場合は英語版を見た方がよいです(URLに?hl=enを足してアクセスすればよい(?)) 以下目次 BigQueryで使える2つのSQL Standard SQLを使うべき? 便利な機能や変更点 テーブル名の参照 COUNT(DISTINCT value) SELECT テーブル名.* SELECT * EXCEPT (カラム名) 複数のREPEATED型のカラムを持つテーブルのSELECT * SELECT
はてなブログの記事の下に関連記事を表示する機能が追加されました 表示位置が固定でいまいちだったので、表示位置を移動できないかなって試してみました staff.hatenablog.com はてなブログの設定(デザイン)に以下のようなタグを書けばよいです 表示位置の指定用のタグ <!-- 公式の関連記事モジュールの位置変更用(場所の指定) --> <div id="my-related-entries"></div> 表示位置の変更処理を実行するスクリプト 以下のタグは、上の表示位置の指定用のタグよりもHTML上で後の部分に書いてください(記事下やフッター) <!-- 公式の関連記事モジュールの位置変更用(処理の実行) --> <script> (function() { var position = document.querySelector('#my-related-entries')
BigQuery自体には類似文字列検索の機能はないので、文字n-gramのコサイン類似度を求めるSQLを書いて似ている文字列の検索をします ちなみに単純にある文字列が別の文字列に含まれているかどうかをみたいならWHEREにカラム名`LIKE '%探したい文字列%'のような条件を書いたりStandard SQLならSTRPOS(カラム名, '探したい文字列') != 0、Legacy SQLならカラム名 CONTAINS '探したい文字列'のように書けばよいはずです 文字n-gramのコサイン類似度による類似文字列検索 方針としては文字列同士を、文字n-gramのベクトルとみなしてコサイン類似度を計算します 文字n-gram 文字n-gramは連続したn文字のことで、これをカウントしたものをベクトルの要素とみなします 例えば文字bigram(2文字のn-gram)のベクトルを「BigQuer
相関ルール分析(頻出パターンマイニング?)で使われるリフト値(lift)と、共起の強さを測るのに使われるPMIがほぼ同じものだなぁと思ったのでメモ(それ以上の内容はない) 相関ルール分析 Association rule learning - Wikipedia 相関ルール - 機械学習の「朱鷺の杜Wiki」 相関ルール分析は商品を購入したときのバスケットデータ分析やレコメンド的なのに使われる手法です それぞれの1回分のデータ(購入など)をトランザクションと呼んで、あるアイテム\(X\)が含まれるトランザクションには\(Y\)も一緒に含まれていることを示すためのものです 基本的なやり方として以下のような数値を計算してこれらが適当に大きいものが関連のあるものと推定できるので推薦などに使います 1回のトランザクションにアイテム\(X\)が含まれる確率を\(P(X)\)としたとき support
約数の個数を求めるアルゴリズムと約数が多い数である高度合成数についてのメモ 約数の個数の求め方 実際に割ってみる方法 ある数\(n\)の約数の数を求めます \(\sqrt n\)より大きい約数は\(n\)自身しかないので、\(1\)から\(\sqrt n\)まで割れば十分です 割り切れたときにちょうど平方根でなかったら2つ分カウントすればよいです (最悪)計算量は\(O(\sqrt n)\)ぐらい(注、この記事にかかれている計算量の理解はゆるふわです) 実際に割っているのでメモリーの量が足りれば約数のリストも作れます import math def num_divisors_trial_division(n): num = 0 for i in xrange(1, int(math.sqrt(n) + 1e-9) + 1): if n % i == 0: num += 1 if n !=
なので2017年5月以降突然MathJaxの数式が表示されなくなるかも MathJax CDN shutting down on April 30, 2017 説明 MathJaxはWeb上で数式の表示ができる便利なライブラリ 公式のCDNがあってファイルを配信してくれていたのですが転送量が大きくなってしまい継続が困難になってしまったらしい 対策 公式の記事にいくつか対策が書いてある MathJax CDN shutting down on April 30, 2017 他のCDNを使う https://cdnjs.com/ がおすすめとのこと 以下のように書かれていたのを <script type="text/javascript" async src="https://cdn.mathjax.org/mathjax/2.7-latest/MathJax.js?..."> </scrip
解約率が一定であると仮定すると、解約率の逆数でユーザーの平均継続期間を求めることができます 以下の記事がバズっていた後に、解約率からユーザーの平均継続期間を計算するのを試しているのを見かけました ところが全体の解約率で計算した値と、ユーザーを属性別に分けて出した解約率を元に計算した値に結構差があって不思議そうな様子でした migi.hatenablog.com 例 どんな感じになるのか例を出してみます ユーザーが\(10\)人いて、月間の解約率が\(p=\frac{3}{4}\)であるとします これらのユーザーの平均継続期間は解約率の逆数でそれぞれ\(E=\frac{1}{p}=\frac{4}{3}\)ヶ月になります。継続期間を人数倍すると\(\frac{40}{3}\)ヶ月です 実はこの\(10\)人のユーザーは解約率が\(p_A=\frac{1}{2}\)のユーザーが\(5\)人(グ
PDCAPDCAPDCA PDCA PDCA コード CSSのアニメーションとtransformの機能を使って回し続ける 平面的な方 .pdca { display: inline-block; margin: 0; padding: 0; animation-name: pdca; animation-duration: 3s; animation-iteration-count: infinite; animation-timing-function: linear; } @keyframes pdca { from { transform: rotateZ(0deg); } to { transform: rotateZ(360deg); } } 立体的な方 perspectiveを指定しないとあまり回っているように見えなかった .pdca3d { font-size: 120px;
複数ラベルの分類問題を評価しようと思ってMean Average Precisionを計算しようと思ったが、Pythonの機械学習ライブラリのscikit-learn(sklearn)にはaverage_precision_score()関数とlabel_ranking_average_precision_score()関数があってどういう違いがあるのかドキュメントを読んでもいまいちよくわからなかったので調べました とりあえず最初に結論を書いておくと、複数ラベルの分類問題でよく使われるMean Average Precisionの計算にはlabel_ranking_average_precision_score()関数を使えばよさそう 追記: バージョン0.19からどちらも同じ挙動になったようなので注意(元々のlabel_ranking_average_precision_score()
最近あんまりパフォーマンス的によくない正規表現を見かけたので、いくつかのパターンについて正規表現をいろんな言語で試してみて実行時間を測ってみた(ついでに最悪計算量についてゆるふわに考えてみた) 実際には正規表現エンジンの実装(NFAやDFAとか?)やバージョン、オプション(?)によると思いますしなんとなくの傾向という感じです やること 以下の正規表現についてパターンマッチされる対象の文字列の長さ\(L\)が増えたときに、1回マッチするか調べる時間がどれぐらい伸びるかを調べます .*a a.*b a.*b.*c a(a|aa)*b 計測方法 以下の言語についてIdeoneで実行してみて実際に測ってみた時間を載せます(括弧内はIdeoneに書かれていたバージョン) Ruby (ruby-2.1) Python (python 2.7.10) PHP (php 5.6.4) Java (sun-
QiitaとAdventarにあるアドベントカレンダーについて、個別の記事とカレンダー全体のはてなブックマーク数のランキングを27日の0時ごろに集計した 個別記事上位100件のURLについては軽く目で見て最近の記事でなかったりするURLをフィルタリングしてある(漏れはありそう ↓途中経過は下に sucrose.hatenablog.com ちなみにQiitaは公式のランキングがあります Advent Calendar 2016ランキング - Qiita カレンダーの合計ランキング 以下カレンダーとカレンダーに登録されている記事のはてなブックマークの合計数のランキング 順位 カレンダー名 はてなブックマーク数 1 はてな 4846 2 システムエンジニア 3453 3 LITALICO Engineers 2585 4 クラウドワークス 2393 5 Supership株式会社 1981 6
去年書いたスクリプト↓がだいたいそのまま動いたのでアドベントカレンダーのはてなブックマークの合計数のランキングと記事別のランキングを今年も出してみた sucrose.hatenablog.com 全件記事を見たわけではないので変なゴミが混じっているかも 今年はディープラーニングの記事がたくさんはてブを集めていて人気を感じる ↓最終結果も出した はてなブックマーク数が多い2016年のアドベントカレンダーの記事 - 唯物是真 @Scaled_Wurm カレンダーの合計ランキング 順位 カレンダー名 はてなブックマーク数 1 システムエンジニア 3070 2 DeepLearning 1593 3 LITALICO Engineers 1535 4 N高 1504 5 Shell Script 1433 6 Fujitsu 1398 7 転職(その2) 1354 8 トレタ 1222 9 UI
シェルスクリプトのif文で文字列の辞書順の大小関係を条件判定したかったので調べました bashなどには[[]]コマンドがあるので、簡単に文字列比較ができます(ところで[[]]って検索しづらいですね [](test)コマンドの方でも文字列の大小比較はできますが、以下のように>や<をエスケープする必要があります(手元で試したらbashでは動いてzshでは動かなかった) [ string1 \< string2 ] [ string1 \> string2 ][[]]を使うと以下のように自然に書くことができます [[ string1 = string2 ]] [[ string1 == string2 ]] [[ string1 != string2 ]] [[ string1 < string2 ]] [[ string1 > string2 ]]久しぶりに書くと[]の内側や演算子の周りに空白
Google Data Studio (データスタジオ) という可視化サービスがベータ版で使えるようになっていたので試してみた 見たい数値を一覧するためのダッシュボード的なものを作るためのサービスなので、いろんな場所からデータを取ってきて一箇所でまとめて確認するのが用途っぽい(今のところ似たようなサービス・ツールの方が機能が多そう データソース データソースとしてGoogle AnalyticsやBigQuery、Google Spreadsheet、MySQLなどを選んでデータを取ってこれる データソースを選んでGUIでグラフやテキストを配置していく データの既存のフィールドに関数を適用した結果の値を使うこともできる 使える関数のリスト 下の画像ではGoogle Analyticsの「ブラウザ」(Chrome, Firefoxなど)と「ブラウザのバージョン」(バージョンの番号)をCONC
qiita.com 上の記事でBigQueryに投げたクエリのログ(Audit Log)がインポートできることを知ったので、会社で使われているBigQueryのアカウントについて毎日クエリの課金額(処理したバイト数)の多いユーザーをSlackに通知してみた ちなみにAudit Logsをインポートする設定方法はこのあたり Analyzing Audit Logs Using BigQuery | BigQuery Documentation | Google Cloud Platform 以下のクエリで計算している クエリ課金の単位のTBがテラバイト\(1000^4\)なのかテビバイト\(1024^4\)なのかよくわからなかったので、とりあえず少なめに見えて人間に優しい(?)\(1024^4\)で1日何ドルかを計算している (追記: 2017-07-01) Audit Logsのテ
競技プログラミングサイトのAtCoderのレーティングの仕組みが新しくなりました 別の競技プログラミングサイトであるCodeforcesのレーティングとどれぐらい相関があるのか、参加回数がどれぐらいあればレーティングに差がなくなってくるのかなど気になったので調べてみました ちなみにたまにAtCoderに参加してますが、最近は全然解けないでレーティングの変動がなくなってきました(弱い データの収集 AtCoderの方は、AtCoderのレーティングのランキングのページから表示されてるデータをすべて取ってきます CodeforcesはAPIがあるのでそれを使います Codeforces API - Codeforces http://codeforces.com/api/user.ratedList で1度でも参加したことのあるユーザーの情報を取ってくることができます(重いです) AtCode
概要 Google Chromeを使って、document.write()で外部のJavaScriptを読み込んでいるページを開くと、いつの間にか開発者ツールのコンソールに以下のようなメッセージが出る状態になっていた "A Parser-blocking, cross-origin script, スクリプトのURL, is invoked via document.write. This may be blocked by the browser if the device has poor network connectivity." 開発者ツールを開きながら適当なサイトを見ていると、広告っぽいURLが引っかかってることが多い この警告が何を意味しているかというと、遅い携帯電話の通信だとページの読み込みが遅くなるので、以下のようにdocument.write()でクロスオリジンのスクリ
次のページ
このページを最初にブックマークしてみませんか?
『唯物是真 @Scaled_Wurm』の新着エントリーを見る
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く