重複している画像ファイルを削除(rubyで)

重複しているファイルを削除します。

delete_duplicate_file.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
require 'digest/md5'

file_hash = ARGV.inject(Hash.new) do |hash, file|
              hash[file] = Digest::MD5.hexdigest(File.open(file, 'rb').read)
              hash
            end

duplicated_md5 = file_hash.values.sort.inject(Hash.new) do |file_count, md5|
                   file_count[md5] = file_hash.values.count(md5)
                   file_count
                 end.select do |md5, count|
                   count > 1
                 end.keys

duplicated_md5.map do |file_md5|
  # 削除ではなく重複したファイルを他のディレクトリに退避したい場合などはここを変えてください。
  File.unlink file_hash.invert[file_md5]
end
Read on →

ファイル内の特定の行の数値をインクリメントする

yamlファイルの特定の数字をインクリメントしたくてスクリプトを書きました。 データとしてはこんな感じです。

1
2
3
4
5
6
7
8
9
10
11
12
data_one:
  col_num: 1
  name: hoge
  options: fuga
data_two:
  col_num: 1
  name: foo
  options: baa
data_three:
  col_num: 1
  name: foofoo
  options: baabaa
Read on →

はじめて医療費控除を申告してみたよ

医療費控除。

薄々は知っていたけどそんなに病院にお金を使うこともなく、領収書と取っといたりするのも面倒なのであまり意識したことはなかったのですが、
去年はエクストルージョンという歯の処置を保険適用外(15万弱しました)でやったりとかなりお金を使ったので今回は医療費控除を請求してみることにしました。

郵送で申し込みます。

Read on →



GithubPageに移行しました

移行してみました。
とりあえずそれだけです。

あらためてこちらでもよろしくお願いします。


Axlsxでエクセルのセルを折り返して全体を表示

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
require 'axlsx'

package = Axlsx::Package.new
sheet = package.workbook.add_worksheet(name: 'lists')

wrap_text = sheet.styles.add_style(
                              {
                               :fg_color=> "FFFFFF",                           # 文字色
                               :b => true,                                     # 太字
                               :bg_color => "004586",                          # 背景色
                               :sz => 12,                                      # フォントサイズ
                               :border => { :style => :thin, :color => "00" }, # 罫線
                               :alignment => { :horizontal => :center,         # 配置
                                               :vertical => :center ,
                                               :wrap_text => true}
                              }
                            )

sheet.add_row(['とっても長いテキスト', '短いテキスト'], style: wrap_text)

sheet.column_info.first.width = 5
package.serialize('test.xlsx')

Axlsxでウィンドウ枠の固定

エクセルのウィンドウ枠の固定をAxlsxで行う方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
require 'axlsx'

package = Axlsx::Package.new
sheet = package.workbook.add_worksheet(name: 'lists')

sheet.add_row(['品名', '単価', '数量', '計'] )
sheet.add_row(['にんじん',    80, 1,      '=B2*C2'])

sheet.sheet_view.pane do |pane|
  pane.top_left_cell = "B2"
  pane.state = :frozen_split
  pane.y_split = 1
  pane.x_split = 1
  pane.active_pane = :bottom_right
end

package.serialize('test.xlsx')

Axlsxでエクセルファイル作成時に注意する点とかはまりどころとか

最近Railsを使う会社が増えてきて、2年前にRailsを扱う会社をエージェントに探してもらった時はなかなか見つからなかったんですが、今は楽に見つかりそうですね。 そもそも登録した転職サイトがダメだったのかもしれないと思いますが。 千葉でRuby、Railsメインでやってる会社ないかな。

さてさて、ここのところずっと触っているAxlsxです。

型に気をつける

エクセルのセルが数値か文字列かで挙動が変わったりします。 文字列型のカラムに"1000"とか入っていた場合、エクセルでは数値として認識されてしまってvloolupなどの関数が反応しないことがあります。 その場合は明示的にtypeを指定しましょう。

1
2
3
4
5
6
7
8
9
sheet.add_row(
  [
    "1000",
    1000,
  ], types: [:string, :float])
)

# もしくは
sheet.rows[0].cells[0].type = [:string]

typesに設定できるシンボル Method: Axlsx::Cell #type — Documentation for randym/axlsx (master) [:date, :time, :float, :integer, :string, :boolean]

エクセルの関数を設定してダウンロード

そのままアップロードすると関数による値の設定が行われません。 おそらく数式はエクセルを開いた時にエクセル側で計算されるので、エクセルを一回も開かずにアップロードすると値が設定されていないことになるのかと思います fomula _valueを設定しましょう

1
2
3
4
5
sheet.add_row [1, 2, '=A1+B1'], :formula_values => [nil, nil, 3]

#_もしくは
sheet.rows[0].cells[0].value         = "=A1+B1"
sheet.rows[0].cells[0].formula_value = "3"

trueとfalseにrefinmentsを使ってメソッド追加

Rubyでモデルの値がtrueの場合は○。falseの場合は空文字を表示するメソッドが欲しかったのでrefimentsを使って実装したかったけどなかなかうまくいかない。
trueはインスタンスだと思うんだけど何か普通のインスタンスと違うのだろうか。

試行錯誤は省いて結論としてはこうしたらできました.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
module BooleanEx
  refine TrueClass do
    def true.to_circle
      "○"
    end
  end

  refine FalseClass do
    def false.to_circle
      ""
    end
  end
end

using BooleanEx

true.to_circle # => "○"
false.to_circle # => ""