/var/log/laughingman7743.log

I thought what I'd do was, I'd pretend I was one of those deaf-mutes or should I?

PyAthenaでRedashのクエリランナー書いた

プルリクマージされました。ありがとうございます。 これでカジュアルにAthenaにクエリ投げまくりですね。 Enjoy!

AWS請求レポートをPyArrowでParquet+Snappyに変換する

AWSコストの可視化として、請求レポート*1をAthena*2でクエリを投げられる形式に変換して、Redash*3でダッシュボードを作成していたりします。 元データがCSV+ZIPと非常に扱いにくい形式なのでCSV+GZIPに変換していたのですが、カラムナー形式に変換すると良…

Amazon AthenaのPythonクライアント書いた

AthenaがAPI/CLIに対応した*1ので boto3*2で少し使ってみたのですが、クエリ実行結果のパースが非常にめんどくさい。 もっとカジュアルにクエリを投げたいなってことで、PEP249*3に準拠したクライアント書きました。 使い方はJDBC版*4と変わらないです。コー…

PyAthenaJDBCでRedashのクエリランナー書いてみた

redash-athena-proxy*1を使ってRedashからAthenaにクエリを投げれる環境を作っていたのですが、どうもtimestamp型やdate型の戻り値が日付として上手く認識しない。。。 おそらくproxy側のGSONの日付型のシリアライズ設定の問題かと思われるのですが、調べる…

S3DistCpをリモート実行したい

S3DistCp*1をよく使うのですが、 複数のS3DistCpを実行する場合、クラスタにステップを追加する形だと1ステップづつシーケンシャルに実行され、かなり待たされることになります。 ステップを追加する形ではなく、SSHでリモート実行できると任意のタイミング…

PythonからAmazon AthenaにJDBC接続するラッパー

暇を持て余していたので作ってみました。 バージョン番号は諸事情により1.0.1となってしまいました。(心温かみのある手作業でのリリースはまずい。。。) 既知の問題点 Decimal型をフェッチすると落る ドライバのバグのようです。フォーラムにも上がってまし…

PythonでAmazon Athenaにつなぐ

Amazon Athena*1への接続は現状JDBCしかサポートされていない。。。やっぱりPythonからつなぎたいですよね! PythonからJDBCでつなぐには、Py4J*2やJPype*3あたりを使うと良さそうですが、Py4JはJavaでGatewayServerを作成し、別プロセスで起動しなければな…

Hiveでカレンダーテーブルを簡単に作る

集計処理でカレンダーテーブルがあると何かと便利なのでカレンダーテーブルを作りたいなと思ったのですが、HiveにはPostgreSQLのgenerate_seriesのような関数がない。。。 UDFなら作っている人がいそうな気がしたので調べてみると、Hivemall*1のUDFにgenerat…

Feedlyではてなブックマーク数が表示されなくなったので雑に直した

オリジナルは以下です。 Feedly 移行記念、Feedly をはてブ対応させるユーザースクリプト – OTCHY.NET Enjoy!

EMRでADD JARしたくない場合の対処法

Hive ブートストラップアクションでJARを適当なディレクトリに配置し、hive-envの設定をしてやればADD JARしなくて良くなります。 (以下は /usr/lib/hive/plugin ディレクトリにJARを配置しています) Presto PrestoにはそもそもADD JARはないので、JSONデー…

HiveでネストしたJSONデータのテーブルマッピング

HiveでJSONデータを処理する場合には、json_tuple*1や get_json_object*2を使えば処理できますが、複雑なJSONだとクエリがカオスに。。。json_tupleやget_json_objectでがんばるよりも、struct型やarray型*3を使ったテーブル定義を作ってマッピングしてやる…

Hive便利UDF

元ネタがJSONだったりするとリストやマップの処理でいろいろとつらいってことで、かゆいところに手が届くUDF詰め合わせ。かなり便利です。ありがたい。 今日もETLバッチ処理でHive大活躍ですわ! Enjoy!

ELBのログをLambda、Norikra、Mackerelを使っていい感じに処理する

ELBが結構504を返したりしていたりするので、Lambda、Norikra、Mackerelを使ってモニタリングできるように処理してみました。 S3 -> Norikra ELBは適当に5分ぐらいの間隔でS3にログを出力するようにしておき、 S3のオブジェクト作成イベントをトリガに起動、…

Docker-in-DockerできるJNLP用Jenkinsスレーブ

Docker内でSSHのデーモンは上げたくないし、Supervisorもインストールしたくないなということで、dindできるJNLP用Jenkinsスレーブのイメージつくてみました。 JenkinsオフィシャルのJNLP用スレーブ*1とdind*2を組み合わせただけですが。。。 Alpine版 Ubunt…

Docker環境でのre:dashのDBマイグレーション

re:dash*1のDBマイグレーションはfabricスクリプト*2が提供されていますが、fabricだとSSHする形になるのでDocker環境では都合が悪いです。 なんとかならないかなと適当にシェルスク書いてみました。 envfile、現在のバージョン、マイグレーション先のバージ…

EMR 4.4.0でJSON SerDe

HiveでJSON SerDeであれば rcongiu/Hive-JSON-Serde*1 を使うのが一般的かと思われますが、 EMR 4.4.0からHCatalogが使えるようになっているので*2、 HCatalogのJSON SerDe*3を使うこともできます。 /usr/lib/hive-hcatalog/share/hcatalog/ 以下にJarがある…

AlpineLinuxでNorikraのDockerイメージ作ってみた

Norikra*1を手軽に使いたいってことでAlpineLinux*2でイメージ作ってみました。 https://hub.docker.com/r/laughingman7743/docker-alpine-norikra/ AlpineLinuxを使うとかなりイメージを小さくできて良いですね。それでも200MBぐらいありますが。。。 Enjoy…

AmazonECSデプロイスクリプトをPythonで再実装してみた

シェルスクリプト*1つらいってことでPythonで再実装してみました。基本的な使い方は変わらないです。(古いタスクが終了するまで待つとかなり時間がかかる場合があるので、forceフラグで新しいタスクのlastStatusがRUNNINGになったら古いタスクを強制的に止め…

PythonでRequestsを使ったSlackのAttachments通知でハマった

以下のようにattachmentsの中身をjosn.dumpsしてやればOK。 POST(application/x-www-form-urlencoded)で送っているので、ネストしたオブジェクトはJSON形式の文字列にする必要があります。 POSTでもContentTypeをapplication/jsonで、BodyをJSON形式で送るよ…

Kinesis + Lambdaの組み合わせが便利

fluentd*1で出力先をいろいろと追加するよりは、一旦Kinesisに突っ込んでLambdaで処理した方がいろいろと捗る感じがします。 特に部署やチーム毎に欲しいログの形式、バケット、パスの切り方(時間単位 or 日単位 or サーバ単位 etc...)、出力先(S3、Kibana e…

Redshift便利スクリプト

AWSLabsのGithubリポジトリにいろいろと便利なスクリプトがあります。 日次でVacuum処理やAnalyze処理を夜間に走らせたいということで、 Analyze & Vacuum Schema Utility*1をAirflow*2で使いたいなと思いましたが、 クラス化されていなかったり、ログがファ…

Boto3でEMR

最近HiveでETL処理とかするためにEMRをよくさわっています。Boto3からクラスタ起動したりステップ追加したりしています。 Boto2だとクラスタ作成時にセキュリティグループの設定等をapi_paramsに追加する形になり非常にわかりにくいです。 Boto3だとJSONライ…

Elasticsearchに空間データを突っ込む

例のごとく国土交通省のデータをダウンロードしてきてElasticsearchに突っ込んで検索してみます。 国土数値情報ダウンロードサービス GDALのドキュメント*1を参照するとogr2ogrコマンドでシェープファイルを直接Elasticsearchに投入できそうですが、 マッピ…

Playframework2.4 + Slick3.0で複数のデータベースに接続する

@NamedDatabaseアノテーションをつければ対応するDB名のDatabaseConfigProviderをDIしてくれます*1が、 なんとなくDatabaseConfigProviderをDIしたくないなってことで、別の方法で実装してみた。 どちらにしてもPlay.currentに依存してるのであまり意味ない…

Playframework2.4でActionBuilderから利用するサービスクラスをDIする方法

laughingman7743/play24-action-composition-di-example 以下のようにActionBuilderをtraitとしてコンポーネント化し、利用するコントローラ側でコンポーネントをミックスイン、 コントローラのコンストラクタでサービスクラスをDIしてやれば良さそう。 これ…

Playframework2.4で独自に追加したディレクトをdistやstageタスクに含めるたった1つの方法

以下の様なプロジェクト構成で、独自に追加したfooやhogeディレクトリをアプリ配布時に含めたい場合。 build.sbtでUniversalのマッピング定義にパスとストア先を追加すれば、独自に追加したディレクトリも含めることができます。(22〜27行目) アプリ配布時の…

Playframework2.4でActorをスケジューリングする

Play2.4でActorをスケジューリングするサンプルです。 オフィシャルドキュメント*1に少しスケジューリングの記載がありますが、 実際どうやってスケジューリング設定をするのか分かりにくかったので、簡単なサンプルを実装してみました。 基本的にPlay2.4か…

PythonでJinja2を使ったメール送信

Pythonでメール送信時に、CCやBCCを指定したい、さらに複数指定したい、差出人名を指定したい、返信先を指定したい、ファイルを添付したい、タイトルやメッセージを動的にしたい...etcといった場合に結構コードがとっ散らかってしまうので、かなり前に書いた…

Playframework2.4でSlick3.0とplay2-authを使ったログイン認証サンプル

Play2.4でSlick3.0*1とplay2-auth*2を使ったログイン認証を実装してみた。 テンプレートはSBAdmin2*3をベースに、BootswatchのSlate*4を適用しています。(チャートはHighcharts*5が使いたいので除いています) laughingman7743/play24-slick3-auth-example 認…

Playframework2.4でSlick3.0のコードジェネレーションタスクを組み込む

オフィシャルリポジトリに上がっているSBTを利用した例*1を参考に、以下のようにbuild.sbtに数行加えるだけです。(3.0からパッケージのscalaプレフィックスがなくなっています。それ以外は特に変更はないようです) ローカル環境のPostgreSQLのテーブル定義を…

いまさらながらKnockoutJSに入門してみた - フォームバリデーション

RestAPIとJavaScriptによるシングルページのアプリではなく、基本的にサーバサイドのテンプレートエンジンをガッツリ利用する形で、 フォームのリアルタイムバリデーションを低コストで実現したかったので、いまさらながらKnockoutJSに入門してみました。 (V…

ScalaのCakePatternでJavaっぽいレイヤリング

一般的なController、Service、Repositoryの3層レイヤ構成をCakePattern*1で。 Model テーブル定義を反映したプレーンなオブジェクト。 Form HTTPリクエストパラメータをバインドするプレーンなオブジェクト。 ViewModel サービスから返却されるプレーンなオ…

MuninとNagiosをNginxで動かす

かなり古いネタですが、RHEL6.5にインストールした時のメモ モニタリング関係でもApacheはもう使いたくないと。。。 Munin 基本的には下記オフィシャルのドキュメントを参考に設定しています。 MuninConfigurationMasterCGI – Munin インストール EPELから2…

PythonでPostGIS

GeoAlchemy2*1を使うと良さそう。 pipでPsycopg2*2、SQLAlchemy*3、GeoAlchemy2をインストールします。 PostgreSQLとQGISが使える環境が必要なので作ります。 MacでPostgreSQLやQGISの環境を作るには、HomebrewCask*4で簡単に済ませてしまうのが良いです。 P…

Tumblrダッシュボードの広告を非表示にするGreasemonkeyスクリプト

最近ダッシュボードに謎の枠が表示されてうざいので、グリモンスクリプト書いた。 CSSを追加して、広告を非表示にしているだけです。 下記リンクからインストールできます。 https://gist.github.com/laughingman7743/ae06567f1ca43a709ff9/raw/0f3340769d72…

MacからPythonでOracleにつなぐ

cx_Oracle*1を使います。 cx_Oracleのビルド・インストール*2には、リンク先の通り少し環境を作る必要があります。 GCCが必要なので以下のコマンドでXcode Command Line Toolsをインストールします。 Oracleが配布しているInstant Client Package*3のBasicと…

Thymeleafでシンプルなページャの実装

元ネタはFlask*1のスニペット*2です。 Spring Boot(Spring MVC)*3でテンプレートエンジンにThymeleaf*4を利用するので実装してみました。 ページャクラスは以下です。Javaではジェネレータが使えないのでリストを返却する形にしています。 ちょっとダサいで…

PythonでRabbitMQ - Consumerの実装

Pika*1を使って非同期処理の実装をするのが良さそう。 ドキュメントに実装例が充実しています。 Usage Examples — pika 0.9.13 documentation 非同期処理の実装例もあるのでそれを利用します。 Asynchronous consumer example — pika 0.9.13 documentation R…

RabbitMQクラスタ設定で開けておくポート

EPMD(Erlang Port Mapper Daemon)自体はデフォルト設定で4396を利用しますが、 RabbitMQがクラスタで利用するEPMDポートは動的に割り当てられます。*1 設定ファイル(/etc/rabbitmq/rabbitmq.conf)に以下のように記述することで固定化することが出来ます。 設…

Redsfhit(dw2.8xlarge)のリサイズ所要時間

Redshiftのリサイズ処理ってどれくらいかかるのか検索しても事例が出てこないのでメモを残しておく。 dw2.8xlarge 2ノード 約3TBストレージを利用した状態から、2ノード追加し4ノード構成にした時の所要時間は2時間23分でした。 クロスリージョンのスナップ…

PostgreSQL(PostGIS)にFileGDBデータを投入

GDAL*1 1.11からはFileGDBが開けるようになっている*2ので、 ogr2ogrコマンドでPostgreSQL(PostGIS)にFileGDBデータの投入ができるようになっています。 ESRI自体がFileGDBの読み書きができるライブラリの提供をしてくれています。OSSでないのが残念ですね。…

Redshift集計Tipsその1 - カレンダーの活用

その2があるのかは謎 適当な集計すんなksgってことで、以前会社の人に教えてもらいました。ありがとうございます。 日毎に集計を行うことが多いと思いますが、データがない日があると歯抜になり、 Window関数を利用した集計で正しい結果が求められていなかっ…

PythonライブラリのWindowsバイナリパッケージ

Python Extension Packages for Windows - Christoph Gohlke 非公式ですがバイナリパッケージを大量に提供してくれています。 pipでのインストールではVC++の環境が必要なライブラリもあったりするので非常にありがたいです。 Enjoy!

PythonでHTMLをPDF出力するたった1つの方法

HTMLをPDFに変換して出力するにはwkhtmltopdf*1を使うと言語問わず簡単に出力できますが、 PythonであればPyQt*2のQtWebkitを使うことでも出力できます。 どちらにしてもQtWebkitのレンダリングエンジンを使っていることに変わりはないです。PyQt4を使ってい…

SupervisorによるPlayframeworkアプリのデーモン化

Playframeworkデーモン化でググるとなぜかcommons-daemonを利用した例が引っかかったり。。。 Supervisorでデーモン化するのが楽です。 Play2.3系デーモン化設定ファイル例 activator clean stageしてtargetディレクトリ以下を配置しています。 起動するポー…

Supervisorのインストール

RHEL6.5にインストールする機会があったのでその時のメモ インストール pip でインストール オフィシャルリポジトリからRHEL用設定ファイルを取得 SysVinit用起動スクリプトを登録 設定ファイル echo_supervisord_confコマンドで設定ファイルの雛形を出力 設…

Redshift便利クエリその1

その2があるのかは謎 how to find size of database, schema, table in redshift 各テーブルのオーナー、容量、行数が一発で分かります。便利! 定期的に確認して、不要なテーブルは削除しましょう。 Enjoy!

RDS(PostgreSQL)に大きなデータを投入する際のパラメータ設定

RHEL6.5から20GB 6000万件ぐらいのCSVデータをpsqlコマンド(\copyコマンド)で投入していると、必ず数分してコネクションが切れる問題が発生しました。 RDSはPostgreSQL(9.3.3)を利用しており、psqlのバージョンの問題によるものかもしれないので、8.4系、9.3…

RDS(PostgreSQL)でPostGIS

AWSのドキュメントの通りにExtensionを追加するだけ。 Appendix: Common DBA Tasks for PostgreSQL - Amazon Relational Database Service 適当にDBを作る。 作ったDBにPostGISのExtensionを追加する。 空間データが扱えるとログ分析等で色々と便利だったり…

HAProxyとPgBouncerを利用したRDS(PostgreSQL)の負荷分散

HAProxyは1.5系を使いたいのでRPMのビルド環境を作る。*1 HAProxyのRPMを作成してインストールする。*2 PgBouncerはPGDG*3からyumでインストールする。 HAProxyの設定は以下 PgBouncerの設定は以下 WebアプリからはPgBouncer(5433)に接続、PgBouncerがHAProx…