ついにSampleAppが動きました・・・やったー! てことで何をしたかを書いていきます。 以下の記事の完結編になります。

意外と単純なことだったのですが、なぜ動くのかは現状わかっていませんw

libVuforia.soを設定する

VuforiaSDKのSDK-PATH/build/lib/armeabi-v7a/libVuforia.soというファイルがあります。 これをSampleApp内のsrc/main/以下に設置すれば完了です!

以下の画像のような形で設置します。 VuforiaSDKのlib以下のコピーしてきて、libというフォルダ名をjniLibsという風に変えればOKです。

これでandroidを再ビルドすれば一番上の画像のように動くようになりました! やっと!やっと!!

最後に

Android色々楽しいですが、なかなか難しいですね。 まだ始めて少ししか経っていないのでなぜこれで動くのか全容がつかめてないですが少しずつ掴んでいければと思います。

参考記事

以下の通りにやればよかっただけの話でした。くー! Vuforia + AndroidStudio ARのサンプルを動かしてみた

Read more

みなさんこんにちは! Railsで僕がよく使うimpressionistというRailsのGemがあるのですが、それを用いてランキング機能を作りたい!と思ったので共有します。 一参考になればいいなぁと思います。

ランキングのコード

ひとまずコードです。

# return [ #
, #
, ....] def daily_article_ranking ids = Impression.where("created_at >= ?", Time.now.yesterday).where("created_at ids).order("field(id, #{ids.join(',')})") end

設定としてはArticle modelが存在していて、そのPVを取得している、という状況を考えています。 また、現在から考えて1日の間のrankingなのでもし◯日のランキングを作る、とかそういう場合は適宜変えていただければ、と。 これを適切なhelperに入れてもらえれば便利かと思います。

以下解説です。 まずはimpressionテーブルから必要なデータを抜き出し、グループ化してカウントし、Article idを10件ほど取得します。 そのときに参考にさせていただいた記事は以下になります。 Rails で group by して count を取りたい時のイディオム

そしてそのidsを元にidsの配列に入っているid順にArticle modelからデータを引っ張ってきます。 そのときに参考にさせていただいたのは以下の記事(英語) Finding an array of ids while keeping the order with Rails 今回例としてあげたコードはMySQLをデータベースとして考えているのですが、こちらの記事内でMySQL以外のデータベースの場合、という風にコードが示してあるのでそれを参考に書き換えていただければ動くのではないかと思います。

こんな感じでランキングをイメージしたデータを返すことが出来るようになりました! これをもとにviewを調整していただければランキングの完成です!!

最後に

Impressionist Gem便利ですね。

Read more

みなさんこんにちは! 以前の記事の続きになります。

SampleAppにLicenseKeyを入れる

以前の記事で無事build出来るようになったわけですが、正常に動きません。 おそらくLicense Keyを入れてないからじゃないか、と思ったのでLisence Keyを入れる場所を調べてみると、公式にありました!何も問題なかった!

公式によるとcom.qualcomm.vuforia.samples.SampleApplicationSampleApplicationSession.java:336に書けばよいといいことらしいので書きましょう!

private class InitVuforiaTask extends AsyncTask
    {
        // Initialize with invalid value:
        private int mProgressValue = -1;

        protected Boolean doInBackground(Void... params)
        {
            // Prevent the onDestroy() method to overlap with initialization:
            synchronized (mShutdownLock)
            {
                Vuforia.setInitParameters(mActivity, mVuforiaFlags, " your_license_key ");

                do
                {
                    // Vuforia.init() blocks until an initialization step is
                    // complete, then it proceeds to the next step and reports
                    // progress in percents (0 ... 100%).
                    // If Vuforia.init() returns -1, it indicates an error.
                    // Initialization is done when progress has reached 100%.
                    mProgressValue = Vuforia.init();

                    // Publish the progress value:
                    publishProgress(mProgressValue);

                    // We check whether the task has been canceled in the
                    // meantime (by calling AsyncTask.cancel(true)).
                    // and bail out if it has, thus stopping this thread.
                    // This is necessary as the AsyncTask will run to completion
                    // regardless of the status of the component that
                    // started is.
                } while (!isCancelled() && mProgressValue >= 0
                    && mProgressValue  0);
            }
        }

最後に

やった!これで動くだろう!と思ってわくわくして待ってたのですが、USBでつないで動かしてみると以下のエラーが(´・ω・`)

s3dReadConfigFileってやつの75行目でエラーが出てるのはわかるのですが・・・ もう少しsample appを動かすまでの旅は続きそうです。

ついに動きました!色々ありがとうございました!

Vuforia5でAndroidのSampleAppを動かすまで – 完結編 –

Read more

6244112961_f26d711b0e_b

みなさんこんにちは。 ARアプリを作りたい!と思ってAndroidでVuforiaというライブラリを使ってみてSampleをとりあえずBuildが通るまでやれたので共有しようと思います。 一応動くのですが、まだkeyをどこに入れたら動くのかわかってないので実際にARを体験出来るとこまではいけてません(笑)

それでもひとまず初心者がBuildが出来るまで!ってことで! AndroidStudio 1.3.2 です。

Vuforiaに登録する

VuforiaからSDKやSampleをダウンロードしてくるためにはVuforiaに会員登録をしなければならないのでまず会員登録しましょう。 わかるとは思いますがこちらのページから「Register」の部分をクリックして情報を入力しましょう

VuforiaからSDKとSampleをダウンロード

Vuforiaに無事登録が済み、ログイン出来るようになったらログインした状態で、Downloadページにいきましょう。 SDK、Sampleともにダウンロードしたら準備は完了です^^(もちろんAndroid Studioは入れておいてくださいねw)

Buildエラーが出ないようにする!

次はBuildエラーが出ないように調整しましょう。 まずは両方解凍し、自分の好きなフォルダに移動させてください。 そしてVuforiaSDKのフォルダ内にsamplesというフォルダがあるのでそのフォルダ内にVuforiaSamplesを移動させてください。

次にAndroidStudioを起動します。 起動すると以下のスターター画面が立ち上がるので「Import Project」をクリックしてVuforiaSamplesを選択しましょう!

Importしたら画面が立ち上がるので「Next」を2回選択。

次にVuforia.jarの場所を指定してあげないといけません。

おそらく以下の画面が立ち上がるので右側のボタンをクリックして好きな場所に移動させたVuforiaSDKのVuforiaSDK-PATH/build/java/vuforia/を指定します。

指定したら下側のclick to editと書いてある部分をクリックしてVuforia.jarのパスを指定します。 Vuforia.jarは、上記で指定したVuforiaSDK-PATH/build/java/vuforia/Vuforia.jarがあるはずなのでそれをフルパスで入力します。 以下の画像のようになったら完了ボタンを押しましょう

それが終われば無事、ElicpseのプロジェクトがAndroidStudioのプロジェクトに変換されます! 最後にVuforiaSDKの依存関係を定義して終わりです!

AndroidStudioの左メニューに出るappを右クリックしてOpen Module Settingsを選択します。

Dependenciesタブの左下の「+」ボタンをクリックして、2 File dependencyを開きます。

最後にsrc/mainの下にあるVuforia.jarを選択してOK、OK!!

これでBuildが正常に動くはずです!お疲れ様です!実機に入れてみるなりエミュレーターで動かすなりしてみてください!

最後に

正しい方法かはわかりませんがこれでBuild成功しました! やったー!

ただしまだAR体験出来てないのでVuforiaのkeyを入力する場所を探す旅です。 他にいいやり方あるよーとかどこにkey入れるんだよーとか知ってる方いれば教えてください! key入れるとこわかったらまた更新します!

key入れる場所書きました!

無事にbuild出来るようになったVuforia5 sample appにLicenseKeyを入れる

やっと動きました!

Vuforia5でAndroidのSampleAppを動かすまで – 完結編 –

Read more

467702445_b8676f60fb_n

みなさんこんにちは! 今回はRails4でTwitterのタイムライン上で実装されている◯秒前とか◯分前とか表示されるやつを実装してみたいと思います!

Rails4ではDateHelperに実装されているtime_ago_in_wordsというメソッドを使えばTwitterにある◯秒前というのを実装することが出来ます!簡単!!

ただしこのメソッドを使って日本語で表示しようと思った場合はi18n対応してあげないといけません。

具体的にはまずconfig/application.rb内にある以下のコードをjaに設定しましょう

config.i18n.default_locale = :ja

そしてこちらのファイルをコピペしてconfig/locale/ja.ymlとして保存しましょう。

ja.ymlの内容は以下の通りです

ja:
  date:
    abbr_day_names:
    - 日
    - 月
    - 火
    - 水
    - 木
    - 金
    - 土
    abbr_month_names:
    - 
    - 1月
    - 2月
    - 3月
    - 4月
    - 5月
    - 6月
    - 7月
    - 8月
    - 9月
    - 10月
    - 11月
    - 12月
    day_names:
    - 日曜日
    - 月曜日
    - 火曜日
    - 水曜日
    - 木曜日
    - 金曜日
    - 土曜日
    formats:
      default: "%Y/%m/%d"
      long: "%Y年%m月%d日(%a)"
      short: "%m/%d"
    month_names:
    - 
    - 1月
    - 2月
    - 3月
    - 4月
    - 5月
    - 6月
    - 7月
    - 8月
    - 9月
    - 10月
    - 11月
    - 12月
    order:
    - :year
    - :month
    - :day
  datetime:
    distance_in_words:
      about_x_hours:
        one: 約1時間
        other: 約%{count}時間
      about_x_months:
        one: 約1ヶ月
        other: 約%{count}ヶ月
      about_x_years:
        one: 約1年
        other: 約%{count}年
      almost_x_years:
        one: 1年弱
        other: "%{count}年弱"
      half_a_minute: 30秒前後
      less_than_x_minutes:
        one: 1分以内
        other: "%{count}分未満"
      less_than_x_seconds:
        one: 1秒以内
        other: "%{count}秒未満"
      over_x_years:
        one: 1年以上
        other: "%{count}年以上"
      x_days:
        one: 1日
        other: "%{count}日"
      x_minutes:
        one: 1分
        other: "%{count}分"
      x_months:
        one: 1ヶ月
        other: "%{count}ヶ月"
      x_seconds:
        one: 1秒
        other: "%{count}秒"
    prompts:
      day: 日
      hour: 時
      minute: 分
      month: 月
      second: 秒
      year: 年
  errors:
    format: "%{attribute}%{message}"
    messages:
      accepted: を受諾してください
      blank: を入力してください
      present: は入力しないでください
      confirmation: と%{attribute}の入力が一致しません
      empty: を入力してください
      equal_to: は%{count}にしてください
      even: は偶数にしてください
      exclusion: は予約されています
      greater_than: は%{count}より大きい値にしてください
      greater_than_or_equal_to: は%{count}以上の値にしてください
      inclusion: は一覧にありません
      invalid: は不正な値です
      less_than: は%{count}より小さい値にしてください
      less_than_or_equal_to: は%{count}以下の値にしてください
      not_a_number: は数値で入力してください
      not_an_integer: は整数で入力してください
      odd: は奇数にしてください
      record_invalid: バリデーションに失敗しました %{errors}
      restrict_dependent_destroy: "%{record}が存在しているので削除できません"
      taken: はすでに存在します
      too_long: は%{count}文字以内で入力してください
      too_short: は%{count}文字以上で入力してください
      wrong_length: は%{count}文字で入力してください
      other_than: は%{count}以外の値にしてください
    template:
      body: 次の項目を確認してください
      header:
        one: "%{model}にエラーが発生しました"
        other: "%{model}に%{count}個のエラーが発生しました"
  helpers:
    select:
      prompt: 選択してください
    submit:
      create: 登録する
      submit: 保存する
      update: 更新する
  number:
    currency:
      format:
        delimiter: ","
        format: "%n%u"
        precision: 0
        separator: "."
        significant: false
        strip_insignificant_zeros: false
        unit: 円
    format:
      delimiter: ","
      precision: 3
      separator: "."
      significant: false
      strip_insignificant_zeros: false
    human:
      decimal_units:
        format: "%n %u"
        units:
          billion: 十億
          million: 百万
          quadrillion: 千兆
          thousand: 千
          trillion: 兆
          unit: ''
      format:
        delimiter: ''
        precision: 3
        significant: true
        strip_insignificant_zeros: true
      storage_units:
        format: "%n%u"
        units:
          byte: バイト
          gb: ギガバイト
          kb: キロバイト
          mb: メガバイト
          tb: テラバイト
    percentage:
      format:
        delimiter: ''
        format: "%n%"
    precision:
      format:
        delimiter: ''
  support:
    array:
      last_word_connector: と
      two_words_connector: と
      words_connector: と
  time:
    am: 午前
    formats:
      default: "%Y/%m/%d %H:%M:%S"
      long: "%Y年%m月%d日(%a) %H時%M分%S秒 %z"
      short: "%y/%m/%d %H:%M"
    pm: 午後

これで日本語化することが出来ました! 簡単に実装出来てRailsは楽しいですね!

Read more

みなさんこんにちは!

今回はRails4+Unicorn+Nginx環境で「Error with Maximum file multiparts in content reached」というエラーがログに出ていたときの対処法を書きます!

このエラーの内容としては「ファイルアップ上限達してるよふぇぇえ」って感じなのでその制限を取っ払うなり上限アップするなりして対処しましょう!

解決方法はこちらにあるように

config/multipart_part_limit.rb というファイルを作ってその中に

Rack::Utils.multipart_part_limit = 0

と書くことで上限が取っ払われます。

ただこうすることで大量のファイルを1度にアップされると次のページに遷移するのに時間がかかってしまうため、それ用に対策を打つ必要が別途ありそうです。

また、ENV[‘RACK_MULTIPART_PART_LIMIT’] の設定が優先されるそうなのでunicornのタスクの中で指定等してあげるとファイルで指定せずとも設定出来るそうです。

Read more

8659335288_b74570bd1b_n

みなさんこんにちは! Rails4で例えばViewファイルのメニューで、あ、このURLのときはここにclass追加したいな、とか表示変えたいな!っていうことが少なからずあると思います!いやある!

そんなときにどうすればいいのかを軽く紹介します!

そんなときはURLHelperとして実装されているcurrent_page?メソッドを使いましょう!

使い方は簡単!

current_page?(root_path)
// root_pathかどうか判定

current_page?(controller: 'posts', action: 'index')
// controller, actionで判定

current_page?('http://google.com')
// 文字列で判定

こんな感じで判定出来ます!直感的ですね!

Read more

14094488767_42c93bf957

photo credit: Hauptbahnhof, Central Train Station, Hamburg – Train Lines via photopin (license)

こんにちは!

長い文字を切り取って「…」を付けたくなるとき、いっぱいありますよね! 今回はRailsでそれをやる方法を紹介します!

truncateメソッドを使おう

ActiveSupportでStringクラスにtruncateメソッドが追加されています。 ここで注意してほしいのは、”たーんけーと”じゃなく、”とらんけーと”だということ。 10分くらい、なんで動かないんだろう????(゜∀゜)ってなったのは僕だけですか?

separatorを指定するとキリのいい所で文章を切ってくれる omissionを指定すると「…」以外を文章の後ろに追加することが出来る

"This is a test case.".truncate(10)
# => "This is a ..."
"This is a test case.".truncate(10, separate: ' ')
# => "This is a ..."
"This is a test case.".truncate(10, omission: '...continued')
# => "This is a ...continued"

これで完璧! 最近はCSS3のtext-overflowプロパティでも実装出来るけど、どうなんだろう。 CanIUseを見る限りは97%以上は使えるぽいからそろそろCSSで実装してもいいのかな。

またhelperとしても提供されているので以下のようにしてもOK

# defaultだと30文字で切り取られる

# => "This is a test case...."

# 文字数の指定をする場合

# => "This is a ..."

# separator指定

# => "This is a test case...."

# omission指定

# => "This is a ...continued"

最後に

Rails楽しい!!

参考

API RubyOnRails Document – truncateActiveSupoprt API RubyOnRails Document – truncate

Read more

5807852400_6cb1047a04

photo credit: Gerbera via photopin (license)

みなさんこんにちは! 最近はRails4に夢中の@DAI199です。

今日はRailsを運用する中で、どんどん大きくなるログファイルってどうしたらいいんだろう?と思って調べたので記事書きます!

今回の環境は

  • Rails4.2

で動作確認しています。

こういう問題の解決策

どんどん大きくなるログファイル。圧迫される容量。 初期の無用なデータ。 これらをある程度消去していったりして管理したいですよね。

これを解決するために、「ログローテーション」という方法で解決することが出来ます。 もちろんフルスタックのRailsなので、ログローテーションを設定することが出来ます!

Railsで設定する方法

それではログローテーションを設定しましょう。

内容はとても簡単で、もしproduction環境において反映させたい場合は

#{Rails.root}/config/environments/production.rb

config.logger = Logger.new("log/production.log", 5, 10 * 1024 * 1024)

上記のように設定すると、10MBのログファイルが出来たら、production.log.0、production.log.1のように5つまでファイルを作成してくれる模様。 5ファイルを超えたら勝手に削除してくれます。便利!!

容量じゃなくて日程別に分けたい!

というときは下記のように設定しましょう。

#{Rails.root}/config/environments/production.rb

config.logger = Logger.new("log/production.log", 'daily')
config.logger = Logger.new("log/production.log", 'weekly')
config.logger = Logger.new("log/production.log", 'monthly')

こうやって設定するとproduction.log.20150803 のようにわけて保存してくれます!これまた便利!

最後に

実際に運用し始めると予想外の所で詰まったりして色々大変ですが、だからこそ楽しかったりしますよねw これからもRailsさんお世話になりますー((´^ω^))

参考記事

Read more