タグ

ブックマーク / qiita.com/joker1007 (32)

  • Kafka StreamsのWindowStateStoreを利用した集計処理で未来のタイムスタンプを扱う際の危険な罠 - Qiita

    Kafka StreamsにはWindow Aggregationという仕組みがある。 特定の時間間隔毎にイベントの数を数えたり等を行うための機能だ。 で、それを利用してユーザー毎のイベント実行回数をカウントする処理を書いていたのだが、何故か結果が合わない。 テストコードでは再現しないし確率的に結果がズレるという状況が発生した。 物凄くハマったが、原因は未来のtimestampが来た時の処理にあった。 検証バージョン kafka-streams-2.4.0 問題の詳細 一度書き込んでバックエンドのKafkaトピックまでデータが届いているにも関わらず、データを再度取得しようとした時に既存の集計カウントが取得できない。 そのためカウントがリセットされるし、他の箇所でも結果が取得できない状態になっていた。 確実にput処理は行われている 紐付いているKafkaのトピックには確実にデータが届いてい

    Kafka StreamsのWindowStateStoreを利用した集計処理で未来のタイムスタンプを扱う際の危険な罠 - Qiita
  • 「Docker時代の分散RSpec環境の作り方」の補足 - Qiita

    この記事は、大江戸Ruby会議06で発表した Docker時代の分散RSpec環境の作り方 // Speaker Deck の補足です。 何人かに質問されたことや、良いことばかりじゃなくて現状存在している課題について補足として、ここで書かせてもらいます。 まず、良く質問されたのがテストケースの分割方法です。 テストケースの分割は、現状とても雑にやってます。 まず、featureスペックのファイルだけをリストアップして適当にシャッフルして詰めます。 その後で、他のテストケースを順番に詰める、という感じです。 多少、無駄ではあるんですが、前のテスト結果のプロファイルの収集と詰めるロジックを書くのをサボっても、現状大分早くできたので、とりあえず作りを簡単にする方を優先しました。 課題の中で最も大きな問題は、ログが見辛いという点です。 ECSはログを準リアルタイムで確認するのが、かなり難しいという

    「Docker時代の分散RSpec環境の作り方」の補足 - Qiita
  • AWS Key Management Serviceを使ってconfigファイルを暗号化すると便利 - Qiita

    以前、yaml_vault というyamlで書いた設定ファイルを暗号化するgemを作りました。 そのyaml_vaultでAWS KMSを利用した暗号化をサポートしました。 AWS KMSで作った暗号化キーで、4kバイトまでの文字列を直接暗号化できます。 普通のconfigパラメーターは4kバイトも無いので、ほとんど直接暗号化だけでカバーできるでしょう。 使い方はこんな感じ % yaml_vault encrypt secrets.yml -o encrypted_secrets.yml --cryptor=aws-kms \ --aws-region=ap-northeast-1 \ --aws-kms-key-id=<kms-cms-key-id> \ --aws-access-key-id=<AWS_ACCESS_KEY_ID> \ --aws-secret-access-key=<

    AWS Key Management Serviceを使ってconfigファイルを暗号化すると便利 - Qiita
    a2ikm
    a2ikm 2017/07/18
  • サービスドメインに組込むためのジョブスケジューラ crono_trigger を作った - Qiita

    ある時間になったらジョブを起動するスケジューラを実装したgemは、世の中に色々とあります。 javan/whenever: Cron jobs in Ruby adamwiggins/clockwork: A scheduler process to replace cron moove-it/sidekiq-scheduler: Lightweight job scheduler extension for Sidekiq しかし、いまいち自分の用途に合致するものがなかったので自作しました。 基的に上記のgemは、事前に設定ファイルを書いてあるジョブクラスをトリガーするスケジュールを登録するスタイルです。 システムの運用に関わるバッチのトリガーとかならそれでも便利なんですが、サービスの機能としてユーザーにスケジューラを提供したい場合に困ります。 例えば、ユーザーが毎日12時に広告メール

    サービスドメインに組込むためのジョブスケジューラ crono_trigger を作った - Qiita
  • 俺が悪かった。素直に間違いを認めるから、もうサービスクラスとか作るのは止めてくれ - Qiita

    ちなみに、最初に結論だけ言っておくと、まずSandi Metzの「オブジェクト指向設計実践ガイド」を読め、という話です それだけで終わってしまいたい気持ちはあるが、不親切過ぎるしもうちょっとRails向けの話を書こうと思う。 ただ言いたいことは、よく分かってないのに使うのは止めろということ。 自分もで書いたりした手前、それが参考にされた結果なのかもしれないが、世の中には当に酷いクラスが存在するもので、雑にサンプルで書くと以下の様な感じのコードが存在したりする。 class HogehogeService # Hogehogeはモデル名まんま def process(hogehoge, option_a: nil, option_b: nil, option_c: false) history = hogehoge.histories.last unless hogehoge.activ

    俺が悪かった。素直に間違いを認めるから、もうサービスクラスとか作るのは止めてくれ - Qiita
  • 開発しやすいRails on Docker環境の作り方 - Qiita

    最近、Rails界隈でDocker使い始めました、という話を聞く機会が増えてきたので、自分が開発環境整備用に構築したDockerの設定をまとめておく。 ちなみに、production運用については以前書いたので適当に探してくださいw 結論から書いておくと、volumeをちゃんと活用すればいい、ってだけの話です。 まず、番用と開発用のDockerfileは分けた方が良い。一つでやろうとするとどうにも無理がでるので。 自分はDockerfileとDockerfile-devというものを用意している。 docker-composeはほぼ必須です。少なくともrailsプロセスとDBだけでも二つは必要だし、Dockerfileを分けてると事故るので。 Dockerfileはこんな感じ。 FROM mybase:ruby-2.3.1-debian RUN echo "deb http://http.

    開発しやすいRails on Docker環境の作り方 - Qiita
  • Ruby製のシンプルなワークフローエンジンRukawaの紹介 - Qiita

    Bigqueryを使ったバッチジョブを色々と実行しているのですが、Rakeで複雑な依存関係を管理したり、並列実行させたりするのが辛くなってきたのでRukawaというワークフローエンジンを自作しました。 自作したのは、RailsプロダクトにAirflowとかLuigiとかAzkabanとか入れるにはちょっと重厚過ぎる感じだったのと、Rubyで書ける方が楽で良いやという理由からです。 RukawaとはRUby KAntan Workflow Assistantの略です(後付け) (当はミッチーとか水戸の方が好きなんだけど良い名前が浮かばなかった) 実際は、並列実行を可能にして書き方を変えてみたRakeとそんなに大差無い。 Rukawaの機能 ジョブの定義 まず実行したい処理をジョブクラスに記述します。 module ExecuteLog def self.store @store ||= {

    Ruby製のシンプルなワークフローエンジンRukawaの紹介 - Qiita
  • embulk bundleだけでJavaで書かれたプラグインをインストールし利用する方法 - Qiita

    以前embulkjava pluginをbundlerっぽくgithubからインストールして実行できるラッパーを作った - Qiitaという記事を書いた。 要はJava製のプラグインをgithubから直接インストールしてリリース前のものを使いたいというものだ。 で、コマンドをラップするgemを作ってみたのだが、DSLの挙動をちゃんと制御するのは面倒だしコマンドをラップするのは色々とポータビリティが悪い。 しかし、ある時天啓が降りてきた。 「Bundlerを弄ればいいや」と。 で、ソースコード読んで、gemspecの判別がどうなってるのかとモンキーパッチを当てるのにちょうど良い場所を探して試してみた所、とてもシンプルなハックで上手くいった。 Gemfile上でBundlerにモンキーパッチを当てるというダーティさに目を瞑れば割と便利ではないだろうか。 こんな風に書く。 require 'b

    embulk bundleだけでJavaで書かれたプラグインをインストールし利用する方法 - Qiita
  • Railsのurl_forを30%高速化するgemを作った - Qiita

    まあ、タイトルは若干釣りで、特定のユースケースにおいて3割程度の高速化が見込める、というだけです。 joker1007/curl_escape: This gem provides fast URL escape by libcurl. 以下、実装経緯。 Railsのurl_forを辿っていくと、最終的にクエリパラメーターとして渡したハッシュやらArrayやらに対して、Object#to_queryを発行します。 このObject#to_queryの実装は、ほぼCGI.escapeの実行です。 やたらとlink_toの数が多くて、クエリパラメーターをそれなりに渡している、というページを表示しようとすると、割とこの処理時間が馬鹿にならない感じになってきます。 ということで、CGI.escapeを早くすれば、ちょっとはマシになるんじゃないかと思いました。 しかし、CGI.escapeの実装をR

    Railsのurl_forを30%高速化するgemを作った - Qiita
  • Electronを使ってMac向けのアプリを開発する時のファイル名の扱いについて (所謂UTF-8-MAC問題) - Qiita

    以前Nodeで作っていたものをElectronで作り直していて、同じ問題にまたハマったので書いておく。 所謂、UTF-8-MAC問題である。もう遥か昔にNodeでハマった時の記事がある。 node.jsでUTF-8-MACを扱う - joker1007の日記 Macのファイルシステムはファイル名に対してNFDとかいう正規化を行っていて、ファイルシステムにアクセスする時に勝手に変換しやがる仕組みになっている。 このせいで、濁点が入ると急に死ぬとか、当辛い問題が起きる。何の嫌がらせなんだと……。この世界は文字が8ビットで済む様な国ばっかじゃねえんだよ! とりあえずMac NFDでググると辛いのは俺だけじゃない気持ちになれる。 で、昔は上で貼ったブログに書いたような方法で解決していたのだが、正直、この解決策は2015年にもなって面倒過ぎるだろと思っていた。 (マジかよーってググって自分の記事が

    Electronを使ってMac向けのアプリを開発する時のファイル名の扱いについて (所謂UTF-8-MAC問題) - Qiita
  • Rubyのコードを読むのが捗る技 (Vim) - Qiita

    Rubyでソースコードを読む時の小技について書いてみようと思う。 この投稿も参考になる。 Rubyでメソッドの定義場所を見つける方法 #Ruby - Qiita http://qiita.com/items/fc8a61b421d026a23ffe ちなみに、私はVimmerなので、Vimに寄った話です。 emacsについては身近にemacsユーザーに聞きましょう。 ctagsを活用する ctagsでtagsファイルを出力しておけば、メソッドの定義元に飛ぶのが非常に楽になります。 Railsで開発しているなら、Railsプロジェクトルートで以下のようなコマンドを打ちます。 (bundlerでプロジェクト内にGemがある場合を想定) langmapとかは別に無くても大丈夫だと思いますが。 --excludeを付けずにctagsを実行するとjavascriptのライブラリもタグ付けされて、

    Rubyのコードを読むのが捗る技 (Vim) - Qiita
    a2ikm
    a2ikm 2015/08/07
    Xcode付属のctagsは使いにくいのでbrew install ctagsする
  • [小ネタ]実はRubyのブロック引数受け取りにキーワード引数が使える - Qiita

    今更ながらブロック引数の受け取りにキーワード引数が使える事に気付いた。 よくよく考えるとブロック引数の受け取りはメソッドの引数受け取りと同じ処理してるんだから、メソッドの定義で使えるものは基的に使えるはずで、至極当たり前の事といえばその通りなのだが……。 (自分は今日意識するまで気付いてなかった……) だからこんな感じで書ける。 [23] pry(main)> [{hoge: "fuga", foo: "bar"}].each do |hoge:, foo:| [23] pry(main)* puts hoge [23] pry(main)* puts foo [23] pry(main)* end fuga bar

    [小ネタ]実はRubyのブロック引数受け取りにキーワード引数が使える - Qiita
  • JSでRailsのヘルパーメソッドを限定的に利用するためのgem - Qiita

    Railsではassets:precompileをした時にファイルのハッシュ値をファイル名の末尾に追加してキャッシュ管理を楽にする機能があります。 JSの内部でそれを検知することは基的にできないため、.coffee.erbなどという形にしてRailsのヘルパーをerbの形で埋め込んだりします。 しかし、これが氾濫するとlintが使えないしエディタによってはシンタックスハイライトも死ぬし、もしSprocketsを将来的に外したくなった時に非常に邪魔になります。 なので、必要になるにしても局所化したい。できれば余り目に付かない所に押し込めたい。 というわけで、限定的にRailsのヘルパーメソッドっぽいものをJS上に定義するgemを作りました。 名前が思い付かなかったので、単純に rails_js_helper というgemです。 使い方 コンフィグファイルの生成 $ bundle exec

    JSでRailsのヘルパーメソッドを限定的に利用するためのgem - Qiita
  • FactoryGirlのtransientとtraitを活用する - Qiita

    FactoryGirlでテストデータを定義する時に、transientとtraitを活用すると色々捗るという話。 transientは実際に作成するデータと直接関係無い新しいattributeを定義する機能。 そこで定義されたものは実際のmodelにはセットされないしattributes_forでも出力されません。 何のために使うかというと作成時に挙動を変更するためのフラグや追加データとして利用するのが一般的です。 traitは属性の定義を一纏めにして名前を付けられる機能です。 parentを指定したfactoryの継承とは違い、traitは単体ではfactoryとして機能しません。 あるfactoryの特定の状態に名前を付けて、付け外しできるようにする、というのが主な使い方になります。 例えば、あるfactoryをある時はadminある時は非adminで作りたい時等に有効です。 個人的に

    FactoryGirlのtransientとtraitを活用する - Qiita
    a2ikm
    a2ikm 2015/05/05
    traitなるほど
  • ActiveRecordの読み込みが実際にトリガーされた場所をログに記録するgem - Qiita

    ActiveRecordは必要になるまでDB読み込みをしません。 なのでやたら複雑なビューの中でクエリを弄ったり、コントローラーが肥大化してる状態でひどいSQLがログに流れてくると、パっと見ではどこが原因なのかすぐに分からない。 なので、SQLが実行された時にそれが実際にトリガーされたソースコードの位置も一緒にログに吐いてくれるgemを作りました。 bulletで分からないような、ビューのループの中で直接モデル読んでるみたいなヤバイ箇所を速やかに見つけるためのものです。 joker1007/activerecord-cause 仕組み的にはActiveRecordのロギングの仕組みを丸パクリしてcaller_locationsを足した感じ。 全ての読み込み位置を表示するわけではなく正規表現でマッチするパスを持ったソースコードの位置のみをログに記録します。 Railsで利用する場合は自動的に

    ActiveRecordの読み込みが実際にトリガーされた場所をログに記録するgem - Qiita
  • [小ネタ]RailsのScaffoldテンプレートを上書きするススメ - Qiita

    管理画面作る時にrails_adminとかactiveadminを使いたくなるかもしれないがグッと堪えてscaffoldベースで作る方が基的にマシなのでは無いかと思う。 bootstrapなりfoundationなりのフレームワークに合わせた見た目が欲しいなら、テンプレートを上書きすればいい。 Railsは#{Rails.root}/lib/templates/#{template engine}/scaffold/index.html.hamlって感じのファイルを置いておくとコードジェネレーションの時にそちらを利用するようになっている。 simple_formなんかはそれを利用してデフォルトのformテンプレートを置き換える機能がある。 ちなみに元のテンプレートはerbならrailties/lib/rails/generators/erb/scaffold/templates/にある。

    [小ネタ]RailsのScaffoldテンプレートを上書きするススメ - Qiita
    a2ikm
    a2ikm 2015/03/23
    上書きできたのかー。毎回既存のものからコピペしてて辛かった
  • Rails-4.2+MySQL-5.6での時刻オブジェクトのミリ秒の扱いについて - Qiita

    MySQLは5.6系から時刻系のデータ型がミリ秒を持てるようになった。 やっとかよって感じですが。 最近持てるようになったので、Railsでは4.1まではMySQLに対してクエリを投げる時はミリ秒以下は問答無用で切り捨ててクエリを構築していた。 しかし、4.2betaが出る辺りで、MySQLにミリ秒対応のクエリを送るPRがマージされた。 MySQL 5.6 Fractional Seconds by arthurnn · Pull Request #14359 · rails/rails 既にMySQL側のカラムがミリ秒精度を持っている場合は特に問題は起きない。 けど、RailsMySQL使っててRailsのバージョン上げようかって時に、そんなことはほぼ無いだろうと思う。 その場合、ちょっと面倒なことになる。 MySQL5.6がミリ秒以下の値を受け取った場合、精度が足りない部分は四捨五入

    Rails-4.2+MySQL-5.6での時刻オブジェクトのミリ秒の扱いについて - Qiita
  • Refinement関係の小技とできない事をまとめてみた - Qiita

    Refinementを実用的に使うために、色々と調査してみて分かったことがいくつかあるのでまとめておく。 できる事 Module#using まず、Ruby2.1からModule#usingが使えるようになっている。 これはとても素晴らしい。この調子でもうちょっと自由度が上がっていってくれると最高。 Refinementでクラスメソッドを定義する方法 これは駄目な例 module BadClassMethodRefine refine String do def self.hoge p "hoge" end end end using BadClassMethodRefine String.hoge # NoMethodError

    Refinement関係の小技とできない事をまとめてみた - Qiita
  • Sprockets再考 モダンなJSのエコシステムとRailsのより良い関係を探す - Qiita

    すいません。締切守れませんでした…。 やっぱ、java-jaの忘年会の翌日は辛い…。 はじめに Webシステムを開発していると切っても切れないのがJavaScriptです。 Railsはかなり早い時期からalt-JSや結合、minify等を組み込めるようにフレームワークにそれを取り入れてきました。 それを支えているのがRails3.1から導入されたsprocketsです。 それに伴なってJSのライブラリをどうやって管理するかという点について、独自の路線を取ることになりました。 JSのライブラリを同梱したgemパッケージにラップしてrubygemsとして管理する方法です。 ある程度は上手くいっていたし、今もその流れは続いているんですが、時々問題になることもあります。 例えばメンテナの対応時期がズレてて古いバージョンのままだったり、似たようなgemが乱立してややこしくなったり。(backbon

    Sprockets再考 モダンなJSのエコシステムとRailsのより良い関係を探す - Qiita
  • これを読むとRSpecの裏側がどうやって動いているのか分かるかもしれないぜ - Qiita

    これはTokyuRuby会議08にて発表した資料を元にQiita向けに再編集したものです。 元々Advent Calendarと共用にしようと思って、どう考えても5分で話せない資料でLTしたのでした。 最初に RubyのテスティングフレームワークとしてはトップクラスにメジャーなRSpecですが、内側の実装が黒魔術感に溢れていて非常に読み辛い。 そしてカスタマイズするにも学習コストが高いという話を聞きます。 最近「RSpec止めますか、人間(Rubyist)止めますか」みたいな風潮が出ていてバリバリのRSpec派の私としては見過ごせない感じになってきたので、いっちょRSpecがどんな感じで動いてるのかを大まかに解説していくことで、世の中に対して再びRSpecを啓蒙していこうと思うわけです。 この話はrspec-core-3.1.7辺りをベースにしています。 起動 rspecのコマンドエンドポ

    これを読むとRSpecの裏側がどうやって動いているのか分かるかもしれないぜ - Qiita
    a2ikm
    a2ikm 2014/12/02