[ruby] 一定時間処理を停止する。スリーパー

 ruby デフォルトの sleep は、指定した秒数処理を停止しますが、これだとループの中に sleep を刺した場合、ループ内メイン処理の時間 + sleep の秒数が掛かってしまい、指定秒数ごとに処理を実施するという要件を微妙に満たせません。

ちょっと困ったので、Sleeper クラスを作ってみました

class Sleeper
  @@sleepers = {}
  attr_accessor :sleep_time

  def self.[](name)
    return false if name.nil? || name == ""

    @@sleepers[name] ||= self.new name
  end

  def initialize(name)
    @name = name
    @before_time = Time.at 0
  end

  def reset_timer
    @before_time = Time.now
  end

  def sleep(sleep_time = nil)
    sleep_time = @sleep_time if sleep_time.nil?

    # コンマミリ秒が切り下げられて必ずスリープが少し足りなくなるので 1 を足す
    Kernel.sleep (@before_time + sleep_time - Time.now + 1).to_i if (@before_time + sleep_time) > Time.now

    @before_time = Time.now
  end
end

使い方は単純で

Sleeper['app_name'].sleep_time = 5

arr.each do |val|
  Sleeper['app_name'].sleep
  exec
end

こんな感じで使えます。

ミリ秒まで取ってないので精度は甘々ですが、
メインの処理が0秒~1分とかばらつきがある場合、スリープ時間を安定させられます。

APIを叩くのに一定時間空けたい時とかに有効です。

【ruby小ネタ】整数値を時間に変換

yml に 09:00:00 と設定すると、YAMLクラスでパースした時に 29,400(int) に変換されてしまう。
これを時間指定に使えるように変換する。

config = YAML.load_file "config/hoge.yml"
Time.at(config["time"]).utc

utc を付け忘れると TimeZone が影響して、
日本だと09:00:00 が足されるので 18:00:00 が返ってくるので注意。

【ubuntu】依存: libmysqlclient18 の解決

ひっさびさに大きくテンパったので備忘録および戒めとして、作業内容を残して置きます。

PHPの環境構築時、php5-mcrypt が必要になったのでインストールしようとしたところ

user@ /etc/php5/mods-available $ sudo apt-get install php5-mcrypt
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています
状態情報を読み取っています... 完了
以下の問題を解決するために 'apt-get -f install' を実行する必要があるかもしれません:
以下のパッケージには満たせない依存関係があります:
 libmysqlclient-dev : 依存: libmysqlclient18 (= 5.5.40-0ubuntu1) しかし、5.6.26-1ubuntu14.04 はインストールされようとしています
 php5-mcrypt : 依存: libmcrypt4 しかし、インストールされようとしていません
E: 未解決の依存関係です。'apt-get -f install' を実行してみてください (または解法を明示してください)。

そうか、libmysqlclient18を入れればいいのか。

user@ /etc/php5/mods-available $ sudo apt-get -f install libmysqlclient18
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています
状態情報を読み取っています... 完了
libmysqlclient18 は既に最新バージョンです。
libmysqlclient18 は手動でインストールしたと設定されました。
以下の問題を解決するために 'apt-get -f install' を実行する必要があるかもしれません:
以下のパッケージには満たせない依存関係があります:
 libmysqlclient-dev : 依存: libmysqlclient18 (= 5.5.40-0ubuntu1) しかし、5.6.26-1ubuntu14.04 はインストールされようとしています
E: 未解決の依存関係です。'apt-get -f install' を実行してみてください (または解法を明示してください)。

へ? 今入れようとしてるんじゃが…

と、ここで大きくテンパった
しかし、よーく見ると

 libmysqlclient-dev : 依存: libmysqlclient18 (= 5.5.40-0ubuntu1) しかし、5.6.26-1ubuntu14.04 はインストールされようとしています

……気づくのに1時間ぐらいかかった(アホです)

インストールしようとしているlibmysqlclient18は version 5.6.26-1ubuntu14.04 だけど、モジュール libmysqlclient18 は version 5.5.40-0ubuntu1 を望んでいる。

つまり

user@ /etc/php5/mods-available $ sudo apt-get install libmysqlclient18=5.5.40-0ubuntu1
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています
状態情報を読み取っています... 完了
以下のパッケージが自動でインストールされましたが、もう必要とされていません:
  nginx-common nginx-core
これを削除するには 'apt-get autoremove' を利用してください。
以下のパッケージが新たにインストールされます:
  libmysqlclient18
アップグレード: 0 個、新規インストール: 1 個、削除: 0 個、保留: 329 個。
603 kB のアーカイブを取得する必要があります。
この操作後に追加で 3,503 kB のディスク容量が消費されます。
取得:1 http://jp.archive.ubuntu.com/ubuntu/ utopic/main libmysqlclient18 amd64 5.5.40-0ubuntu1 [603 kB]
603 kB を 0秒 で取得しました (2,100 kB/s)
以前に未選択のパッケージ libmysqlclient18:amd64 を選択しています。
(データベースを読み込んでいます ... 現在 187678 個のファイルとディレクトリがインストールされてい ます。)
Preparing to unpack .../libmysqlclient18_5.5.40-0ubuntu1_amd64.deb ...
Unpacking libmysqlclient18:amd64 (5.5.40-0ubuntu1) ...
user@ /etc/php5/mods-available $ sudo apt-get install php5-mcrypt
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています
状態情報を読み取っています... 完了
以下のパッケージが自動でインストールされましたが、もう必要とされていません:
  nginx-common nginx-core
これを削除するには 'apt-get autoremove' を利用してください。
以下の特別パッケージがインストールされます:
  libmcrypt4
提案パッケージ:
  libmcrypt-dev mcrypt
以下のパッケージが新たにインストールされます:
  libmcrypt4 php5-mcrypt
アップグレード: 0 個、新規インストール: 2 個、削除: 0 個、保留: 330 個。
78.3 kB のアーカイブを取得する必要があります。
この操作後に追加で 324 kB のディスク容量が消費されます。
続行しますか? [Y/n] Y
取得:1 http://jp.archive.ubuntu.com/ubuntu/ utopic/universe libmcrypt4 amd64 2.5.8-3.3 [63.0 kB]
取得:2 http://jp.archive.ubuntu.com/ubuntu/ utopic/universe php5-mcrypt amd64 5.4.6-0ubuntu5 [15.4 kB]
78.3 kB を 0秒 で取得しました (429 kB/s)
以前に未選択のパッケージ libmcrypt4 を選択しています。
(データベースを読み込んでいます ... 現在 187686 個のファイルとディレクトリがインストールされてい ます。)
Preparing to unpack .../libmcrypt4_2.5.8-3.3_amd64.deb ...
Unpacking libmcrypt4 (2.5.8-3.3) ...
以前に未選択のパッケージ php5-mcrypt を選択しています。
Preparing to unpack .../php5-mcrypt_5.4.6-0ubuntu5_amd64.deb ...
Unpacking php5-mcrypt (5.4.6-0ubuntu5) ...

これで解決(色々調べているうちにバージョンの指定方法を見つけた)

【rails 小ネタ】pluck でOUTER JOINしたテーブルの情報を取得
User.joins(:address).pluck(:id, "addresses.city")
# SELECT
#   useres.id, addresses.city
# FROM
#   users
# LEFT OUTER JOIN
#   addresses ON useres.address_id = addresses.id;

User.includes(:address).pluck(:id, "addresses.city")
# SELECT
#   useres.id, addresses.city
# FROM
#   users
# LEFT OUTER JOIN
#   addresses ON useres.address_id = addresses.id;

 こんな感じで取得できます。
 pluck に渡す引数は SQL の SELECT 句 に書く感じで書けばOKです。

 同じテーブルに複数回 JOIN した場合、最初に出てきたカラム名は元のテーブル名のままでいいのですが、2つ目以降はちょっと癖があります。
 具体例を書いておきますね。

User.joins(:shipment_address, :company_address).pluck(:id, "addresses.city", "company_addresses_users.city")
# SELECT
#   useres.id, addresses.city, company_addresses_users.city
# FROM
#   users
# LEFT OUTER JOIN addresses ON useres.shipment_address_id = addresses.id
# LEFT OUTER JOIN addresses AS company_addresses_users ON users.shipment_address_id  = company_addresses_users.id;

 あとから参照されたカラムのリレーション先のテーブル名は

 pluckで指定した文字列の複数形 + 大本のテーブル名

 という名前になってます。忘れると仕事に支障が出るので書き残しておく次第です。

落描き

落描き、かきかき

リディア

リディア「エッチな事されずに済むわ」

コミケ落選

夏コミ落選してしまいました……

jQuery スパム投稿防止プラグイン

 最近とにかくスパム投稿が多い。
 あまりにも多い。
 かと言ってコメント欄消したく無いし、画像認証は入力する立場からしてかなり面倒なので絶対につけたくなかった。

 探すのも面倒だったせっかくなので、スパムを弾くプラグインを作ってみました。

 Block spam.

 JavaScript の keyup イベントは機械入力だと発火しないことを、業務中に発見。
 隠しフィールドを用意して、keyup イベントが発火した際、隠しフィールドがわに input タグの内容をコピーして、隠しフィールドだけ送信すれば、機械入力だと空文字が送られるというすんぽうです。

 ……最近プログラムのことしか書いてないなぁ。

  1. 1
  2. 2
  3. 3
  4. 114
RSS / feedly
  • follow us in feedly
  • follow us in feedly
ソーシャル
広告