paranitips

Never stop learning! がモットーのゆるふわエンジニアブログ

配列から重複した要素を取り除くのではなく取り出す

ただ単に重複した要素を取り除く場合は、uniqを使えばOKです。

a = [1,2,3,5,1,2,4]
a.uniq
=> [1, 2, 3, 4, 5]

今回は、重複した要素そのものを取り出したい、つまり、先ほどの配列aから[1,2]を抽出します。

a = [1,2,3,5,1,2,4]
a.uniq.map { | e | [e, a.count(e)] }.select { | _, c | c > 1 }.map{ |e, c| e }
=> [1, 2]

ちなみにrubyのバージョンは以下のとおりです。

ruby 2.1.2p95 (2014-05-08 revision 45877) [x86_64-darwin14.0]

参考

印刷するときだけ要素を非表示にする

印刷ページを別途用意するのもいいけど、ちょっとそれはめんどくさい。。

ってときに、css3のメディアクエリを使うと便利でした。

@media print{
    .no_print{
        display: none;
    }
}
<p>このパラグラフは印刷時には表示されるよ</p>
<p class="no_print">このパラグラフは印刷時には表示されないよ</p>

ちなみに、メディアクエリに使えるタイプはprintscreenで、max-widthとかいろいろ使ってレスポンシブにできるようです〜。なるほどなるほど。

@media screen and (min-width: 600px) and (max-width: 900px) {
    .hoge {
        background: #9CF;
    }
}

参考

Carrierwaveでアップロードした画像が回転して表示されてしまう問題を解決する

結構ハマりました。

画像アップロードの構成としては、

  1. CarrierwaveでS3にアップロード
  2. nginxでS3にリバースプロキシ
  3. small_lightで指定サイズにリサイズして表示

という流れをとっています。

アップロードした画像をS3から確認してみると正しい向きで表示されたのですが、nginxのsmall_lightを介すと回転して表示されました。。

そのため、最初はnginxのsmall_lightが原因と考えて調査していたのですが、なかなか該当記事が見つからず。。。small_lightのオプションでangleも指定できますが、そんなことしてないし。。

原因

画像のExifのOrientationがおかしいのが原因で、nginxを介した際にそれを考慮して回転されてたものと思われます。(なんでS3では回転されなかったんだろう。。古いタイプのスマートフォンで撮影した写真で起きるっぽい。。)

解決方法

CarrierwaveでOrientationを正しい値に修正してから画像をアップロードするようにします。

class ImageUploader < CarrierWave::Uploader::Base

    include CarrierWave::RMagick

    process :fix_rotate

    # アップロードした写真が回転してしまう問題に対応
    def fix_rotate
        manipulate! do |img|
            img = img.auto_orient
            img = yield(img) if block_given?
            img
        end
    end
end

参考