動かざることバグの如し

猫ゆえに。。。

Pyrthon3でエクセルファイルをCSVに変換する

たいてい転がってるサンプルがPython2でキレたので書いた

変換するにはライブラリが必要である。Pythonでエクセルを扱えるメジャーなライブラリは以下

順に見ていく

openpyxl

xlsには対応していない。

Openpyxl is a Python library for reading and writing Excel 2010 xlsx/xlsm/xltx/xltm files.

今回は見送る。

pandas

コード的には一番シンプルである。

import pandas as pd

xls_file = pd.read_excel('1.xls', sheet_name = "Sheet1")
xls_file.to_csv('MySpreadsheet.csv', index = False)

が、pandas自体がそもそもエクセル用ライブラリであるわけではないので、今回変換したいファイルだと崩れてしまった。

xlrd

今回はこれで成功した

import xlrd
import csv

def csv_from_excel():
    wb = xlrd.open_workbook('1.xls')
    sheet = wb.sheet_by_index(0)
    your_csv_file = open('output.csv', 'w', encoding='utf8')
    wr = csv.writer(your_csv_file, quoting=csv.QUOTE_ALL)

    for row_index in range(sheet.nrows):
        row = sheet.row(row_index)
        for cell in row:
            wr.writerow(sheet.row_values(row_index))

    your_csv_file.close()

csv_from_excel()
広告を非表示にする

ActiveRecordのコネクションプーリングを完全に殺す

環境

コネクションプーリングとは

割愛 以下のサイトが詳しい

やり方

database.ymlにreaping_frequency: nil を追加するだけ

default: &default
  adapter: mysql2
  encoding: utf8mb4
  reaping_frequency: nil
  pool: 10

reaping_frequencyとは

ActiveRecordでは接続して処理が終わっても一定時間は接続しっぱなしになる。その一定時間がreaping_frequency(秒)

実装はactiverecord内のReaperクラスを見るとわかる

# Every +frequency+ seconds, the reaper will call +reap+ and +flush+ on
# +pool+. A reaper instantiated with a zero frequency will never reap
# the connection pool.
#
# Configure the frequency by setting +reaping_frequency+ in your database
# yaml file (default 60 seconds).
class Reaper
  attr_reader :pool, :frequency

  def initialize(pool, frequency)
    @pool      = pool
    @frequency = frequency
  end

  def run
    return unless frequency && frequency > 0
    Thread.new(frequency, pool) { |t, p|
      loop do
        sleep t
        p.reap
        p.flush
      end
    }
  end
end

デフォルトでは60秒。nilの場合はそもそもrunのsleepしないのでプーリングが走らないってわけ

広告を非表示にする

RailsのModelを動的に生成してDBに接続する方法

環境

やりたいこと

普通、RailsのModelはapp/model以下に予め記述するが、特殊な例で動的に生成させたい場合

最初はメタプログラミングでいけるやろって思ったけど、

> mymodel = Class.new(ApplicationRecord)
=> #<Class:0x007f8e422a3668> (call '#<Class:0x007f8e422a3668>.connection' to establish a connection)
> mymodel.establish_connection(dbconfig)
RuntimeError: Anonymous class is not allowed.

は??????

どうもActiverecordのソースを読むと

raise RuntimeError, "Anonymous class is not allowed." unless owner.name

となっていて無名クラスの場合は無理っぽい。なんでやねん

結果

const_setとconst_getを駆使する

Object.const_set("MyModel#{id}", Class.new(ApplicationRecord))

dbconfig = ...(略)
Object.const_get("MyModel#{id}").establish_connection(dbconfig)

Object.const_get("MyModel#{id}").where(name: "taro")

これでいける。割りと黒魔術かも知れないが

参考リンク

広告を非表示にする

mysqlcheckで壊れたDBの修復を試みる

変なタイミングでサーバーがクラッシュすると、MySQLのデータもおかしくなる時がある。

Table 'xxxx' is marked as crashed and should be repaired
Incorrect key file for table '/tmp/#sql_******'; try to repair it

とかがそれ。そんな時にmysqlcheckコマンドで治る場合がある。

とりあえずチェックだけ行いたい

mysqlcheck --check  -uUSER -p DB TABLE

チェックして壊れてたら直してほしい

mysqlcheck --auto-repair  -uUSER -p DB TABLE

クイックモードで調査してほしい

大体かかる時間はつけてないのに比べて1/3程度になる。

mysqlcheck --check --quick -uUSER -p DB TABLE

全データベースをチェックしてほしい

mysqlcheck --check --quick -uUSER -p --all-databases

あとはなんだかんだで公式ドキュメントが一番充実している

広告を非表示にする

Rubyの高速JSONパーサーojは本当に高速なのか

rubyJSONをパースするときはJSON.parseが一般的だがojライブラリを使ったほうが速いらしい。

ohler55/oj: Optimized JSON

A fast JSON parser and Object marshaller as a Ruby gem.

が、このライブラリ自体は結構昔からあるし、Ruby 2.5時代でも本当に有能なのか実際にベンチマークしてみた

やりかた

いいソースコードがあったのでこれを使った。

github.com

ただしGemfileが不足しているので

gem "yajl-ruby"                                                                                                                             

Gemfileに追記する必要がある。

結果

$bundle exec ruby benchmark_json.rb 
=== dumping ===
                      user     system      total        real
OJ:               1.036272   0.148676   1.184948 (  1.192646)
OJc:              1.290457   0.166344   1.456801 (  1.467624)
OJr:              1.341350   0.129613   1.470963 (  1.482770)
Yajl:             4.224447   0.130227   4.354674 (  4.383445)
JSON:             6.937912   0.196359   7.134271 (  7.349190)
to_json:          6.871794   0.243478   7.115272 (  7.507943)
JSON (mimic):     1.444729   0.131286   1.576015 (  1.612629)
to_json (mimic):  7.461746   0.250444   7.712190 (  8.516543)
to_json (Oj):     6.879305   0.213003   7.092308 (  7.569498)

あ、普通にOJ速かったわ。疑ってすまねえ

結論

でかいJSONをパースする、レスポンス重視の場合はoj使っていこう

広告を非表示にする