carrierwave 画像の回転を防ぐ

普段carrierwave と RMagickを使って画像をアップロードしてるんですけど、
時間があったんでorientation情報の影響で勝手に回転してしまう問題を解決しました

javaだとこんな感じですが、回転や反転を直してやることで表示したときに画像の向きが「おかしい」といった問題を対処することができます

private static final int NONE = 0;
private static final int HORIZONTAL = 1;
private static final int VERTICAL = 2;
private static final int[][] OPERATIONS = new int[][] {
        new int[] {  0, NONE},
        new int[] {  0, HORIZONTAL},
        new int[] {180, NONE},
        new int[] {  0, VERTICAL},
        new int[] { 90, HORIZONTAL},
        new int[] { 90, NONE},
        new int[] {-90, HORIZONTAL},
        new int[] {-90, NONE},
        };
 
public static MagickImage rotateByExif(MagickImage image) throws MagickException {
    try {
        int index = Integer.parseInt(image.getImageAttribute("EXIF:Orientation")) - 1;
        int degrees = OPERATIONS[index][0];
        if (degrees != 0)
            image = image.rotateImage(degrees);
        switch (OPERATIONS[index][1]) {
            case HORIZONTAL:
                image = image.flopImage();
                break;
            case VERTICAL:
                image = image.flipImage();
        }
    }
    catch (NumberFormatException exc) {}
    catch (NullPointerException exc) {}
    return image;
}

javaみたいにコードを書いていってもいいんでしょうけど、RMagickには auto_orient
という便利なメソッドがあるのでそちらを使うと、簡単に実装できます!

class PostImageUploader < CarrierWave::Uploader::Base

  include CarrierWave::RMagick
  storage :file

  def store_dir
    "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
  end

  def cache_dir
    "#{Rails.root}/tmp/uploads"
  end

  def extension_white_list
    %w(jpg jpeg gif png)
  end

  # ここでorientationの問題を解消しています
  def auto
    manipulate! do|image|
      image.auto_orient
    end
  end
 
  # ここも追加 
  process :auto
  process :resize_to_limit => [850, 600]
  version :thumb do
    process :resize_to_fit => [400, 400]
  end

end

orientationの問題を解決するコード・記事は様々な種類があると思いますが、
今回実装したこのメソッドが一番シンプルなのではないかと思います

あと、process :auto を加えていますが、だたメソッドを定義しただけでは
実行されないようです

下記リンクにorientationテスト用画像のページがありますので、そちらを利用すると結構捗ります!

Rotate images according to EXIF info
こちらのリンクにはorientation1 ~ 8 までの画像があります↓
Rotating images doesn’t adjust orientation for imagick

gulp導入後モジュールが見つかりませんって言われた

会社のWebデザインがどんな感じで進んでいるか確認してくて、どうやらgulpを使ってるっぽいんで
導入して確認しようとしたらなんかエラーが出てきました

$ Error: Cannot find module 'browser-sync'

# 以下を実行
$ npm i browser-sync --save

実行後、今度はまた別のエラーが出てきました

$ Error: Cannot find module 'gulp-sass'

# 以下を実行
$ npm install gulp-sass --save-dev

上のコードを実行後無事に動きました〜

$ gulp sass
[22:43:36] Using gulpfile ~/Web/template/gulpfile.js
[22:43:36] Starting 'sass'...
[22:43:36] Finished 'sass' after 150 ms

gulp触ったのは初めてだったんでよくわかんなかったんですけど、
gulpfile.jsの最初に定義されているモジュール群をインストールすれば動くみたいですね

var gulp = require('gulp');
var browserSync = require('browser-sync').create();
var sass = require('gulp-sass');

普段はフロント触るときはAngularばっかなので、いい勉強になりました!

参考にした記事

Error: Cannot find module ‘browser-sync’
Error: Cannot find module ‘gulp-sass’

Undefined method `belong_to’ for RSpec, Rails

rspecでShoulda::Matchersを使っていたのですが、長い間
タイトルのエラーを解決できずにいました

デバッグしても、実際に動かしても問題がなかったので放っておいたのですが、
今日原因を発見してしまいました!

describe FileUploader, type: :mpdel do
end

ものすごいしょうもないミスなんですけど、 model を mpdel とタイポしてたみたいです。。。。。

すんごい恥ずかしかったけど、治ってよかった。。。。。

参考にした記事
Undefined method `belong_to’ for RSpec, Rails

npm start したら Error: Cannot find module ‘../lib/tsc.js’ が出てきた

久しぶりに違うプロジェクトを開いたらこんなエラーが帰ってきた

Error: Cannot find module '../lib/tsc.js'

色々とやり方はあるんだろうけど、

$ rm -rf node_modules

# 終わったらインストール

$ npm install 

原因はわからないけど、とりあえずこれで治りました!

ssh でサーバーにログインしようとしたらエラーが出た

デプロイするためにサーバーにログインしようとしたらこんなエラーが出てきました

Initialized empty Git repository in

> @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
> @    WARNING: UNPROTECTED PRIVATE KEY FILE!          @
> @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
> Permissions 0644 for

Load key "Documents/test/test.pem": bad permissions Permission denied (publickey).

なんで出てきたかはわかんないけど、とりあえず以下のコードをターミナルで叩いたら治りました〜

# test.pem があるディレクトリに移動して以下を実行

$ chmod og-r *test.pem*

android USBで認識されない

30分ぐらい色々探して見ましたが、問題点は
アンドロイド端末の -> 端末管理 -> 開発者オプション -> USBデバッグ
にチェックを入れてなかったからでした。。。

調べてる時に見つかって記事です
あんまり関係ないですが、、、

Android Studio doesn’t see device

Android Studio doesn’t recognize my device

起動しようとしたら No Target Device Found が出てきた

最近アンドロイドの勉強をしてるんですけど、
昨日まで起動できてたのに、次の日にはなぜか動かないってこともあってよくわかんなくなってきました。。。

とりあえずこのエラーは

  • Run の “Edit Configurations”の”Deployment Target Options”のとこの
  • “Target” を “USB Device” から “Open Select Deployment Target Dialog”に変更
  • その後下に出てくるチェックボックス “Use same device for future launches” にチェックを入れる

の手順を踏めば端末を認識するようになります!

参考にした記事

no target device found android studio 2.1.1

your ruby versionを聞かれまくる

久しぶりにrailsを触っていたら

Your Ruby version is 2.0.0, but your Gemfile specified 2.3.1

を連発されてしまいました

解決方法

 $ rbenv local system
$ gem uninstall bundler
$ rbenv local [rubyのバージョンを入れる]
$ gem uninstall bundler
$ gem install bundle

これで無事に解決できました〜!

参考にした記事

Why do I get the error “Your Ruby version is 2.0.0, but your Gemfile specified 2.2.2” although I have 2.2.2 installed

Intellij で Android-sdkを追加する

普段intellijを使ってるので、intellijでandroidを開発できればと思って
android-sdkを追加してみました〜

まずはAndroid-sdkを使うためのキットをダウンロードします
Android Studio

toolsというディレクトリができるので、その中にあるandroid をクリック
そうすると、インストールマネージャーが開く必要なものを引っ張ってきます

どれを選んでいいかわからなかったので、僕は全部ダウンロードしました!

ダウンロード後

  • build-tools
  • platform-tools
  • sources

といったディレクトリが作成されるので、それらを一つのディレクトリにまとめて、
Android-sdkとしてintellijに追加すれば使用できるようになります!

brew でAndroid-sdk 導入 + PATH指定 + emulatorの導入

※当初はjavaで開発を進める予定でしたが、objective-cを勉強するのもあれなのでNativescriptにしました
一応はNativescriptの開発を予定している方向けですが、おそらくどちらでも問題ないはずです

そろそろAndroidの開発もやりたいなーっと思って環境を構築しました〜

以下のコードでいけるかと思ったらエラーが返ってきたので

$ brew install android-sdk
Updating Homebrew...
Error: No available formula with the name "android-sdk" 
It was migrated from homebrew/core to caskroom/cask.
You can access it again by running:
  brew tap caskroom/cask

こちらの3行で実行してみたところ無事インストール完了

$ brew tap caskroom/cask

$ brew cask install android-sdk

$ brew cask install android-platform-tools

次はパスを指定します

# Java SDKの設定
#インストールすると、基本的に以下のルートにsdkが置かれる
# なので、android_homeとhome内のtoolsとplatform-toolが使えるように修正

export ANDROID_HOME=“/usr/local/share/android-sdk”
export PATH=“${PATH}:$ANDROID_HOME/tools:$ANDROID_HOME/platform-tools”

 

※sdkとパスでエラーが出る場合はこちらの記事を参考にしてください。エラー内容を一つずつ追っているのでおそらくかいけるできるかと思います。Android-sdkエラー(Nativescript,Javaどっちでも)

パスが修正できたらemulatorをインストールします
昔のバージョンだと

$ android

でインストールマネージャーが起動できるのですが新しいバージョンなのでAndroid studioでインストールしていきます
ちなみにNativescriptがメインなので、Nativescriptで開発を予定されている方は生成したNativescriptプロジェクトのplatform/androidのディレクトリを開いてから設定をしてください
でないと、toolsの項目で「Android」が出て来ないので

念のためですが違うディレクトリを参照している場合はもちろん出ないのでNativescriptの開発をしている方は気をつけてください

次にAndroid/Avdマネージャーを開くと選択画面が出てくるので、選択して必要なモジュールなどをインストールします
私は適当にネクサスあたりを選びました

完了するとこのように追加されています

以上で設定は完了です
Nativescriptの方は以下のコードで実行できます!

$ tns run android

参考にした記事

Android platform tools moved but cask install instructions fail #11656
Mac に brew で Android SDK 導入
Setup Android Emulators (AVD)