ホーム ブログ ページ 43

【Ruby】Railsを使用せずにRubyのCGIをRailsっぽくする【CGI/Apache】

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

「一部のページを動的に表示したいけどRailsを入れる程の規模ではない」というような場合に使える方法です。 普通のhtmlと共存できます。 ディレクトリは下記のような場合を想定しています。

http.confの修正

RubyのCGIが使えるようにhttp.confを変更します。 ここでは詳しくは書きません。

1.htaccessを作成

$ cd ドキュメントルート
$ vim .htaccess
=============
RewriteEngine on
RewriteCond %{REQUEST_URI} ^/$ [OR]
RewriteCond %{REQUEST_URI} ^/news/$ [OR]
  ・
  ・    CGI表示したいページを[OR]でつなげて記述していく
  ・
RewriteCond %{REQUEST_URI} ^/news/pickup/$
RewriteRule .* /routes.rb [L]
=============

2.routes.rbの作成

$ which ruby
---rubyのディレクトリ---          ←メモ
$ vim routes.rb
=============
#!---rubyのディレクトリ---

begin
  require './model/application'
  require './controller/application_controller'
  LOAD_DIR = %w(model controller)
  LOAD_DIR.each do |dir|
    Dir.glob("./#{dir}/*.rb").each do |file|
      require file
    end
  end

  # コントローラ生成
  controller_name = Application.get_controller_and_action_name[:controller]
  action_name = Application.get_controller_and_action_name[:action] || 'index'
  @controller = Kernel.const_get([controller_name, '_controller'].join.split('_').map(&:capitalize).join).new

  # アクション呼び出し
  eval "@controller.#{action_name}”

  # view呼び出し
  @controller.render

rescue Exception
  # 例外発生時404 Not Found

  puts 'Status: 404 Not Found\n'
  puts 'Content-Type: text/html\n\n'
  puts ''
  puts '404 Not Found'
  puts "ページは移動または削除されました。"
  puts "トップページへ”

  # エラーログに書き込み
  $stderr.puts "#{$!} (#{$!.class})"
  $stderr.puts $@.join("\n")
end
=============

3. model view controlle のディレクトリ作成

$ mkdir model
$ mkdir view
$ mkdir controller
$ vim model/.htaccess
=============
Deny from all
=============
$ cp model/.htaccess controller
$ cp model/.htaccess view

4. Application モデルの作成

$ vim model/application.rb
=============
class Application
  ROOT_CONTROLLER = :top
  DEFAULT_ACTION = :index

  class << self
    def get_controller_and_action_name
      url_split = ENV['REQUEST_URI'].split('/').delete_if{|element| element.empty? || element.match(/\?/) != nil}
      controller = url_split.first || ROOT_CONTROLLER
      action = url_split[1] || DEFAULT_ACTION
      {controller: controller, action: action}
    end
  end
end
=============

5. Application コントローラの作成

$ vim controller/application_controller.rb
=============
require 'erb'
require "cgi"
require "cgi/session"

class ApplicationController
  attr_accessor :cgi, :session, :params, :controller, :action

  def initialize
    @cgi = CGI.new
    @params = @cgi.params
    @session = CGI::Session.new(@cgi)
    @render_once = true
    params_parse
    @controller = Application.get_controller_and_action_name[:controller]
    @action = Application.get_controller_and_action_name[:action]
  end

  def params_parse
    if @params != nil
      form_array = @params.map do |key, value|
        if value.size == 1 && value.kind_of?(Array)
          

[key.to_sym, value.first]

else

[key.to_sym, value]

end end.flatten(1) end @params = Hash[*form_array] end def redirect_to(url, status=”REDIRECT”) print @cgi.header( { “status” => status, “Location” => url }) end def render(viewfile=nil) if @render_once viewfile ||= “view/#{@controller}/#{@action}.html.erb” @cgi.out(){ ERB.new(File.read(viewfile).force_encoding(“utf-8”)).result(binding) } @render_once = false end end end =============

6. CGIで表示したいコンテンツのviewの作成(ここではTOPページ)

$ mkdir view/top 
$ vim view/top/index.html.erb
==============
  ・
  ・
  ・
<%= @access %> 回目のアクセスです
  ・
  ・
  ・
==============

7. CGIで表示したいコンテンツのmodelの作成(ここではTOPページ)

$ vim model/top.rb
==============
class Top
  SESSION_KEY_ID = ’top'
end
==============

8. CGIで表示したいコンテンツのcontrollerの作成(ここではTOPページ)

$ vim controller/top_controller.rb
==============
require 'csv'
require "time"

class TopController < ApplicationController
  def index
    init_session
    @access = @session[Top::SESSION_KEY_ID][:access]
  end

  private

  def init_session
    @session[Top::SESSION_KEY_ID] ||= {}
    @session[Top::SESSION_KEY_ID][:access] ||= {}
  end
end
==============

これでTOPページヘアクセスするたびにと「XX 回目のアクセスです」がカウントされていくと思います。
動的なページを増やしたいのあれば.htaccessに「/controller/action/」の形式で追記してviewmodelcontrollerを作成するだけで増やせます。

super の話

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

こんにちは、bibioです。ruby には super というオーバーライドしているメソッドを呼び出す機能があります。

何気なく使うとはまることがあるので違いを区別します。

説明した通り、superはオーバーライドしているメソッドを呼び出す機能です。

class A
  def foo
    puts "A#foo"
  end
end

class B < A
  def foo
    super
    puts "B#bar"
  end
end

のとき、次のように出力されます。

B.new.foo 
=>
A#foo
B#bar

では、以下のような例だとどうでしょうか?

class A
  def foo
    puts "A#foo"
  end
end

module M
  def foo
     puts "M#foo"
  end
end

class B < A
  include M
  def foo
    super
    puts "B#bar"
  end
end

突然ですが、問題です。 B.new.foo() を実行したときに出力されるのは次のうちどれでしょうか?

(1)

M#bar

A#bar

B#bar

(2)

A#bar

B#bar

(3)

M#bar

B#bar

正解は・・・(3)

super はオーバーライドをするメソッドを呼び出すのであって、常に親クラスのメソッドを呼び出すわけではありません。名前に引きずられそうですね。

何もMix-inされていない場合、オーバーライドする親クラスのメソッドが呼び出されます。(なければ、その親クラスの親)といって、どれにもマッチしなければ method_missing が呼ばれます。通常は、NoMethodError になります。

オーバーライドされたメソッド呼び出しの階層を注意します。

include でモジュールをMix-inした場合は、元のクラスの上位に割り込みます。

メソッドの探索順にいえば、A->M->B になります。

メソッドの階層は ancestorsメソッドを使って調べます。上の例だと次の通り(Ruby2.1.xの場合)

irb> B.ancestors
=> [B, M, A, Object, Kernel, BasicObject]

Git 〜やらかしてしまった場合の戻し方〜

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

rickNo35です。
最近Gitでやらかしてしまった時の戻し方を記載します

環境

git 1.7.1

前提

masterブランチ
hogeブランチを保持

状態

hogeブランチにてmasterブランチをマージしたところ
conflictが発生修正してcommitしたが、
conflict発生以外のマージしたファイルもcommitしてしまった。
(自分は編集していないのに他の人の修正が自分hogeブランでコミットされてしまう)
別のブランチをマージしてしまった。
などを行いなおかつ気付かずに開発を続けてしまった時など色々

修正手順

# hogeブランチ移動
git checkout hoge
# hogeの変更履歴表示(別ターミナルで表示)
git log –stat master..hoge
# masterブランチに切り替わり最新にする
git checkout master
git pull
# 新しくブランチを作成+new/hogeに移動
git checkout -b new/hoge
# 別ターミナルで表示しているhoge変更履歴より必用なcommitのみ抜き出して入れる
git cherry-pick 取り出したいlogのcommitの番号
# hogeブランチを移動
git branch -m hoge old/hoge
# new/hogeブランチをhogeに置き換える
git branch -m new/hoge hoge
# hogeにpushする
# forceを付けないとコミット順番おかしいと言われるが強制的にforceでpushする(自分以外がいじっている場合はやらないほうがいい)
git push –force origin hoge
# 問題なければold/hogeブランチを削除
git branch -d old/hoge

image_submit_tagとsubmit_tagのパラメータの違いについて

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

初めまして、中西です。

今年社会人になったばかりの新人です。

今回は、自分が少し詰まった、image_submit_tagとsubmit_tagの挙動の違いについて紹介します。

環境

Rails 4.1.4

Ruby 2.1.2

image_submit_tagとsubmit_tagの違い

form_tag等でくくった中で、submitボタンを複数配置し、押下するボタンによって処理を変えたい場合、

アクションを1つしか設定できないことから、:nameのオプションをつけて、アクション内でパラメータにより処理を分けるといったことができます。

このとき、submit_tagとimage_submit_tagで渡されるパラメータに違いが生じます。

image_submit_tagとsubmit_tagの例

例えば下記のようなsubmitボタンを書いたとします。

view
= submit_tag 'HOGE', :name => 'hoge'

= image_submit_tag 'image/huga.png', :name => 'huga'

それぞれのボタンを押下した時に、期待するパラメータはparams[:hoge]とparams[:huga]です。

しかし、実際のパラメータの中身は下記のようになります。

paramsの中
"hoge"  => "HOGE"

"huga.x" => "12", "huga.y" => "10"

上記のように、image_submit_tagの場合、params[:huga]ではなく、

params[“huga.x”]とparams[“huga.y”]という2つのパラメータとなります。

どうも、ボタンの画像の左上を(x,y)=(0,0)として、横軸にx座標、縦軸にy座標となっており、

ピクセル単位でボタンの押下位置のx,y座標それぞれのパラメーターとして飛ぶようです。

まとめ

image_submit_tagで:nameのオプションを使う場合には、パラメータには十分注意しないといけないようです。

しかし、image_submit_tagも、1枚のボタン画像のなかで、押下位置により動作を変えたいといった場合には、使えるのかもしれません。

【Rails】barbyでバーコードを作成してPNGで表示する【バーコード】

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

「barby」を利用すると数字をバーコードにできたり、英数字をQRコードにして表示できるようになります。

今回はでデータURIスキームで画像表示する方法を紹介します。

この方法を使えば画像データを保存しなくて済みます。

 Githubとwikiのリンク

Github

https://github.com/toretore/barby

wiki

https://github.com/toretore/barby/wiki

 1.Gemfileに「 gem ‘barby’」と記述してbundle install

	$ vim Gemfile
	=================
	gem ‘barby’
	=================
	$ bundle install
	

 2.バーコード作成用のclassを作成

	class Barcode
	  require 'barby'
	  require 'barby/barcode/ean_13'
	  require 'barby/barcode/ean_8'
	  require 'barby/outputter/png_outputter'
	
	  def initialize(number, type = :ean_13)
	    @number = number.to_s
	    @type = type
	  end
	
	  # PNG形式でデータURIスキームを生成
	  def to_png_image
	    'data:image/png;base64, ' + Base64.encode64(Barby::PngOutputter.new(barcode(@type, @number)).to_png)
	  end
	
	  private
	
	  def barcode(type, data)
	    case type
	    when :ean_13 # 13桁の場合
	      Barby::EAN13.new(data)
	    when :ean_8 # 8桁の場合
	      Barby::EAN8.new(data)
	    end
	  end
	end
	

 3.controllerでの記述

	def index
	   @barcode = Barcode.new(491234567890)
	end
	

 4.viewでの記述

	<%= image_tag @barcode.to_png_image %>
	

他にもQRコードの作成やテーブルタグでの出力方法等もあったりします。詳しくは公式wikiをご確認ください。

[Ruby on Rails] enumerizeの使い方

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

Railsのgem、enumerizeの使い方のご紹介。

 列挙型とは?

列挙型とは、定数のリストを定義することができる型のことです。

使い道は様々ですが、ActiveRecordのvalueと組み合わせる方法が便利です。

 定数を利用する場合

例えば、DBのユーザテーブルに「性別」というカラムがあったとします。

性別には当然「男」と「女」の2パターンがあります。

この性別のフォームを作る場合どうしたらいいでしょうか?

まず、modelに定数を宣言する方法があります。

app/models/user.rb

class User < ActiveRecord::Base
  SEX = { male => '男', famale => '女' }.freeze
end

app/views/users/_form.html.haml

.form-inputs
  = f.input :sex, collection: User::SEX.invert, include_blank: false

値が少ない場合は上記でも問題なさそうですが、値が増えた場合やI18nで多言語化をしている場合、modelの記述が膨れ上がります。

 enumerizeを利用する場合

そこで列挙型の出番です。

Rails4.1からはActiveSupportでenumが使えるようになったのですが、I18nには非対応のようです。

ですので、gemのenumerizeが便利です。ActiveRecordとI18nに対応しています。

【GitHub/enumerize】

https://github.com/brainspec/enumerize

※インストール方法は上記リンク先を参照ください。

app/models/user.rb

class User < ActiveRecord::Base
  extend Enumerize

  enumerize :sex, in: [:male, :female]
end

※extendで上手く読み込まれない場合、includeしてみてください。

多言語化する場合は「enumerize」というネームスペースを使います。

config/locales/models/ja.yml

ja:
  enumerize:
    user:
      sex:
        male: 男性
        female: 女性

app/views/users/_form.html.haml

.form-inputs
  = f.input :sex, collection: User.sex.options, include_blank: false

valueも以下のように取得できます。

@user.sex_text
#=> 男性

 最後に

選択肢が多いカラム定義の際に特に便利かと思います。

他にも色々なメソッドが使えるようになっていますので、ぜひGitHubのページをご覧ください!

Rails開発でおすすめのRackサーバ「Pow」

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

Rackサーバ「Pow」のインストールと使用方法をご紹介。

 概要

【環境】
Mac OS X 10.6.8

POWって何?

PowとはMac OS Xで使用できる設定不要なRackサーバです。

では他のサーバに比べて何が便利なのか。

1. 面倒な設定が不要

 →ApacheやNginxだと設定ファイルを修正したりしないといけませんが、それが不要。

2, メンテナンスも不要

 →システムファイルを書き換えない自己完結型のサーバです。

3. 複数のサーバを起動しておくことが可能

 →railsサーバ等だと別アプリを起動する場合はポートをずらしたりしますが、Powでは必要ありません。

4. 自動停止/自動起動

 →15分間アクセスが無い場合は自動で停止します。そして次のアクセス時に自動起動。

 インストール方法

非常に簡単です。次のコマンドを実行するのみです。

$ curl get.pow.cx | sh

これだけでインストールは完了です。

 アプリケーションの登録

さてアプリケーションの登録です。まず手動で行う方法です。

ユーザのホーム直下に .pow というディレクトリが作られているので、

そこに登録したいアプリケーションルートのシンボリックリンクを貼るだけです。

$ cd ~/.pow
$ ln -s /path/to/myapp

この状態で http://myapp.dev/ にアクセスしてみましょう。サイトが表示されるはずです。

手動でも簡単ではありますが、もっと簡単な方法があります。

powder という gem を使います。

ますは powder をインストール。

$ gem install powder

そして登録したいアプリケーションルートに移動してコマンド実行。

$ cd /path/to/myapp
$ powder link

この powder link というコマンドで、先ほど手動でシンボリックリンクを貼ったことを自動でやってくれています。

ちなみに再起動も powder のコマンドから可能です。

$ powder restart

特に複数のアプリで連携する場合などに力を発揮するサーバだと思います。

導入も非常に簡単なのでおすすめです!

svnリポジトリの移動

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

rick No34です。
いまさらですが、svnリポジトリ移動の手順を記載します。

環境

サーバA(svnが有るサーバ)
サーバB(svnを移行するサーバ)
サーバC(サーバBのレプリサーバ)

手順

・Aサーバ
バックアップ

svnadmin dump リポジトリロケーション > バックアップ名
例:
svnadmin dump /var/lib/svn/hoge > hoge.dump

hoge.dumpをサーバBへscp等で送信

・Bサーバ
svnディレクトリ作成

mkdir /var/lib/svn

svnリポジトリ用ディレクトリ作成

mkdir /var/lib/svn/hoge

ディレクトリ権限変更

chown -R apache:apache /var/lib/svn/hoge
daemonだったりもする

バックアップ移動

mv ./hoge.dump /var/lib/svn

svnリポジトリ作成

svnadmin create /var/lib/svn/hoge/

リストア

svnadmin load /home/svn/hoge/ < hoge.dump

単一サーバの場合は、これで終了

・Cサーバ
svnディレクトリ作成
(Bサーバ同様省略)
svnリポジトリ用ディレクトリ作成
(Bサーバ同様省略)
ディレクトリ権限変更
(Bサーバ同様省略)
SVNリポジトリ作成
(Bサーバ同様省略)
設定ファイル作成

cd /var/lib/svn/hoge/hook
vi pre-revprop-change

#!/bin/sh
exit 0

vi pre-revprop-change.bat

exit 0

初期化

svnsync init svn+ssh://バックアップ先//var/lib/svn/hoge svn+ssh://バックアップ元//var/lib/svn/hoge

※ssh接続先ポートが変更されている場合

vi ~/.subversion/config

[tunnels]
ssh_hoge = ssh -p 8888

これでsvn+sshをsvn+ssh_hogeに変える

権限変更

chmod +x /var/lib/svn/hoge/hooks/pre-revprop-change

同期

svnsync sync svn+ssh://バックアップ先//var/lib/svn/hoge

バッチ設定
同期のコマンドをバッチで設定、もちろんパスワードレスの状態にしておく
終了

その他

・差分だけダンプ

svnadmin dump /var/lib/svn/hoge -r 12039:12040 –incremental > hoge.dump

・差分リストア

svnadmin load /var/lib/svn/hoge/ < hoge.dump

・リビジョン確認方法

/usr/bin/svnlook youngest /var/lib/svn/hoge

・リビジョン強制戻し

cd /var/lib/svn/hoge/db
rm /revs/x/消したいリビジョン
vi current # 直したリビジョンに書き直す
echo > rep-cache.db # キャッシュ削除
rm revprops/x/

注意点

現リビジョンが100で、後から90~91の差分リストをした場合
リビジョンの90~91が更新されるわけではなく、101,102として更新される。

Apache HTTP Serverで使用しているOpenSSLのバージョンを確認する3つの方法

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

Apache HTTP Serverで使用しているOpenSSLのバージョンを確認する方法を3つご紹介します。

 HTTPのレスポンスヘッダを見る

レスポンスヘッダのServerの値を確認します。

$ wget  -S -O - http://localhost 2>&1|grep Server
  Server: ・・・・・ OpenSSL/1.0.1j 

ただし、apache側の設定で

ServerTokens ProductOnly

としている場合Serverは表示されません。

 mod_ssl.so の中身を見る

stringsコマンドを使うとバイナリファイル中の文字列を抽出できます。

mod_ssl.soファイルの中身を見てみます。

$ strings /usr/local/apache2/modules/mod_ssl.so |grep 1.0.1
OpenSSL 1.0.1i 6 Aug 2014

ただしここで表示されるのはapacheがビルドされた時点の情報で、現在このバージョンで動作しているとは限りません。

 mod_infoを使って確認する

mod_infoを使います。

インストールなどがされていなければ適宜設定をしてください。(アクセス元を限定するなど注意が必要です)

そのうえで下記のようなコマンドでバージョンの確認ができます。

$ wget -q -O - http://localhost/server-info |grep 1.0.1|sed "s/.\+\(OpenSSL\/[^ ]\+\).\+/\1/"
OpenSSL/1.0.1j

vagrant で簡単に環境をつくる-2

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

こんにちは、bibioです。まだまだぴちぴちです。

前回に続きvagrantについてです。

仮想イメージを保存する

vagrant up した仮想環境はそれぞれVagrantfileのあるディレクトリ

の下に保存されています。そのため、それをBOX形式にエクスポートする

ことができます。

$ vagrant package

注意)仮想マシンは停止されます。また、実行に時間がかかります。

デフォルトでは package.box という名前で保存されます。

仮想イメージを box に追加する

作成したイメージは box にいれておくと、使いまわすときなど便利です。

$ vagrant box add --name my_box package.box

もう package.box は不要ですので削除してしまいましょう。

今後は Vagrantfile の config.vm.box に作成した名前を追加するだけです。

よくあるトラブル

/vagrant がマウントされなくなった

yum update などで kernel のバージョンがかわるとマウントされなくなります。

vagrant up 途中でエラーがでてても、仮想マシンは起動していますのでsshで

ログインしてモジュールを作成しなおすことで回避できます。

l $ vagrant ssh
v $ sudo /sbin/service vboxadd setup

その後再度 reload してあげればマウントされていると思います。

Vagrantfile の中身を編集したが反映されない

vagrant reload をしましょう。

vagrant で簡単に環境をつくる

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

はじめまして、bibioです。中途入社のぴちぴちです。

入社早々開発環境を作ったという流れで、ぎりぎりRubyつながりなvagrantの操作をおさらいします。

そもそもvagrantって何ですか?

VirtualBox(VMwareも使えますが確か有償)をコマンドラインから簡単に動作できるようにしたツールです。

https://www.virtualbox.org/

https://www.vagrantup.com/

ホスト環境は Macですが、Windowsでも動きます。

メリット

  • 設定ファイルは Ruby で記述されている
  • OSがインストールされた仮想イメージが簡単に利用・共有できる
  • chef の検証に便利

デメリット

  • プラグインの使い方がわかりにくい
  • 初期値のメモリが少ない(512MB)のでコンパイル中にたまに固まる

キーワード

boxOSインストール済みの仮想化ファイルprovider仮想ソフトウエアの種類

前提環境と準備

今回は VirtualBox を使います。

はじめに VirtualBox と Vagrant をダウンロードしてインストールします。

https://www.virtualbox.org/

https://www.vagrantup.com/

流れ

host $ mkdir vagrant; cd vagrant
host $ vagrant init
host $ vi Vagrantfile
host $ vagrant up
host $ vagrant ssh
guest > 

基本的にこれだけです。初回の vagrant up で chef/centos-6.5 の

BOX がダウンロードされるので時間と帯域を消費します。

また、ダウンロードしたBOXは保存されるので、次回以降 chef/centos-6.5 を

使う場合は基本的にはダウンロードされません。

upした段階で VirtualBox をたちあげると仮想マシンが生きていることが確認できます。

なお、仮想マシンは up 時に BOX から複製されるので、元のBOXは変更されません。

設定ファイルの編集

Vagrantfile という設定ファイルを編集することでカスタマイズが可能です。

最低限必要なオプションは config.vm.box だけ。

VAGRANTFILE_API_VERSION = "2"
Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  # CentOS 6.5 を入れる
  config.vm.box = "chef/centos-6.5"

  # プライベートネットワーク設定するとホストからアクセス
  config.vm.network "private_network", ip: "192.168.33.10"

   # 仮想マシンのカスタマイズ
   config.vm.provider "virtualbox" do |vb|
     vb.gui = false 
    # CPU2コア,メモリ1GBを割り当てる。 ioapic がないとうまく動かないみたい
     vb.customize ["modifyvm", :id, "--memory", "1024", "--cpus", "2", "--ioapic", "on"]
   end
end

ssh でログイン

初期値のホストとポートは 127.0.0.1:2222 です。

秘密鍵は $HOME/.vagrant.d/insecure_private_key です。

パスワード未設定なので気になったら自分の秘密鍵に変更してください。

ssh の設定は以下のコマンドで確認できます。

$ vagrant ssh-config
Host default
  HostName 127.0.0.1
  User vagrant
  Port 2222
  UserKnownHostsFile /dev/null
  StrictHostKeyChecking no
  PasswordAuthentication no
  IdentityFile /home/bibio/.vagrant.d/insecure_private_key
  IdentitiesOnly yes
  LogLevel FATAL

おまけですが、秘密鍵から公開鍵を作る方法です。

$ ssh-keygen -y -f .ssh/id_rsa

仮想マシンを停止/サスペンド/削除

操作もコマンドラインからできます。

停止
$ vagrant halt
サスペンド
$ vagrant suspend
削除

容量を圧迫するので使わなくなった仮想マシンは削除しましょう。

$ vagrant destroy

なお、BOX は削除されません。

さらにBOXの複製や共有もできますが、今回はここまで。

VirtualBoxの 「for reading: -102(File not found.) E_FAIL (0x80004005)」エラー

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

VirtualBoxは下記のエラーで、仮想マーシンへのアクセスが出来ません。■エラーメッセージ
Runtime error opening ‘C:\Users\xxx\VirtualBoxVMs\xxx\xxxx.vbox’ for reading: -102 (File not found).
:
:
:
E_FAIL (0x80004005)

■発生経緯
VirtualBoxが起動して、仮想マーシンへアクセスしているままで、
パソコンが自動更新で、勝手に再起動してしまった。

探していましたが、エラーが発生するxxxx.vboxファイルはどこにもありません。
VirtualBoxを修復しても、再インストールしても、PCシステムが更新前のポイントに戻しても治せません。

仮想マーシンを再作成するしかないかと困っているところ、
C:\Users\xxx\VirtualBoxVMs\xxxにxxxx.vbox-tmpというファイルがあったことに気がつきました。
試しに、このファイルをxxxx.vboxにrenameにして、VirtualBoxを再起動してみたら、
仮想マーシンへのアクセスができるようになりました。

VirtualBoxの 「for reading: -102(File not found.) E_FAIL (0x80004005)」エラー

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

VirtualBoxは下記のエラーで、仮想マーシンへのアクセスが出来ません。■エラーメッセージ
Runtime error opening ‘C:\Users\xxx\VirtualBoxVMs\xxx\xxxx.vbox’ for reading: -102 (File not found).
:
:
:
E_FAIL (0x80004005)

■発生経緯
VirtualBoxが起動して、仮想マーシンへアクセスしているままで、
パソコンが自動更新で、勝手に再起動してしまった。

探していましたが、エラーが発生するxxxx.vboxファイルはどこにもありません。
VirtualBoxを修復しても、再インストールしても、PCシステムが更新前のポイントに戻しても治せません。

仮想マーシンを再作成するしかないかと困っているところ、
C:\Users\xxx\VirtualBoxVMs\xxxにxxxx.vbox-tmpというファイルがあったことに気がつきました。
試しに、このファイルをxxxx.vboxにrenameにして、VirtualBoxを再起動してみたら、
仮想マーシンへのアクセスができるようになりました。


  • 160 views
    • https://web.facebook.com/v2.8/plugins/like.php?action=like&app_id=&channel=https%3A%2F%2Fstaticxx.facebook.com%2Fx%2Fconnect%2Fxd_arbiter%2F%3Fversion%3D46%23cb%3Df127696a5476944%26domain%3Ddoruby.jp%26origin%3Dhttps%253A%252F%252Fdoruby.jp%252Ff1f93b8611d49c%26relation%3Dparent.parent&container_width=0&href=https%3A%2F%2Fdoruby.jp%2Fusers%2Froad_of_beginners%2Fentries%2FVirtualBox___for_reading__-102_File_not_found.__E_FAIL__0x80004005_&layout=box_count&locale=ja_JP&sdk=joey&share=true&show_faces=false
    • https://platform.twitter.com/widgets/tweet_button.96fd96193cc66c3e11d4c5e4c7c7ec97.en.html#dnt=false&id=twitter-widget-1&lang=en&original_referer=https%3A%2F%2Fdoruby.jp%2Fusers%2Froad_of_beginners%2Fentries%2FVirtualBox___for_reading__-102_File_not_found.__E_FAIL__0x80004005_&size=m&text=VirtualBox%E3%81%AE%20%E3%80%8Cfor%20reading%3A%20-102(File%20not%20found.)%20E_FAIL%20%7C%20DoRuby&time=1611202955995&type=share&url=https%3A%2F%2Fdoruby.jp%2Fusers%2Froad_of_beginners%2Fentries%2FVirtualBox___for_reading__-102_File_not_found.__E_FAIL__0x80004005_
    • javascript:false
    • https://widgets.getpocket.com/v1/button?label=pocket&count=vertical&v=1&url=https%3A%2F%2Fdoruby.jp%2Fusers%2Froad_of_beginners%2Fentries%2FVirtualBox___for_reading__-102_File_not_found.__E_FAIL__0x80004005_&title=VirtualBox%E3%81%AE%20%E3%80%8Cfor%20reading%3A%20-102(File%20not%20found.)%20E_FAIL%20%7C%20DoRuby&src=https%3A%2F%2Fdoruby.jp%2Fusers%2Froad_of_beginners%2Fentries%2FVirtualBox___for_reading__-102_File_not_found.__E_FAIL__0x80004005_&r=0.9549710731375274
    • https://apis.google.com/u/0/se/0/_/+1/fastbutton?usegapi=1&size=tall&origin=https%3A%2F%2Fdoruby.jp&url=https%3A%2F%2Fdoruby.jp%2Fusers%2Froad_of_beginners%2Fentries%2FVirtualBox___for_reading__-102_File_not_found.__E_FAIL__0x80004005_&gsrc=3p&ic=1&jsh=m%3B%2F_%2Fscs%2Fapps-static%2F_%2Fjs%2Fk%3Doz.gapi.ja.OLLmITnvXRk.O%2Fam%3DwQE%2Fd%3D1%2Fct%3Dzgms%2Frs%3DAGLTcCMuTMb4aruW2_sOgdLz_ON82D8QUg%2Fm%3D__features__#_methods=onPlusOne%2C_ready%2C_close%2C_open%2C_resizeMe%2C_renderstart%2Concircled%2Cdrefresh%2Cerefresh%2Conload&id=I0_1611202955829&_gfid=I0_1611202955829&parent=https%3A%2F%2Fdoruby.jp&pfname=&rpctoken=22232253

MongoDBのコレクション操作(名前変更、サイズ指定、サイズ変更)

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

アプリから履歴系を保存するのに好んでMongoDBを使っています。
サイズを指定しておくと古い方から消えてくれるので履歴に向いている。バッチ作って消したり、ディスク容量の心配をしなくて良いのがGood!
コレクション操作(名前変更、サイズ指定、サイズ変更)をメモしておきます。

●コレクション名を変更する

いずれは削除したいけど、当面は残す場合などに便利です。
下記は「hogehoge」から「hogehoge_bak」へ変更する例です。
use hoge
db.hogehoge.renameCollection(“hogehoge_bak”); 

●サイズ指定(古いのから削除)でコレクションを作る

Mongoはコレクションを作らなくても、なければ自動で作られるけど、サイズ指定をしたい場合は事前に実施します。
dbs単位での指定は出来なさそうなのが残念。
下記は「hogehoge」を100MBで作る例です。(sizeはバイト単位で指定)
use hoge
db.createCollection(“hogehoge”, {capped:true, size: 100000000}); 

●コレクションのサイズを変更する

既に作ってしまったコレクションのサイズを変更します。
想定よりも早く履歴が消えちゃう場合なんかに便利
下記は「hogehoge」を1GBに変更する例です。(sizeはバイト単位で指定)
use hoge
db.runCommand({“convertToCapped”: “hogehoge”, size: 1000000000}); 

●おまけ:よく使うコマンド

$ mongoshow dbs <- DBS(データベース)一覧
use hoge <- DBS(データベース)切替
show collections <- コレクション(テーブル)一覧
db.hogehoge.find() <- 検索(SELECT)
db.hogehoge.drop() <- コレクション(テーブル)削除
db.dropDatabase() <- DBS(データベース)削除

MybatisでOracleにListを一括insert

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

MybatisでOracleにList<object>を一括insert

主キーIDは自動増加ではないパターン

mybatisを利用して、OracleDBにList<object>を一括insert方法を紹介します。

主キーIDは自動増加ではないパターン

 mapperメソッド定義:

int insertBatch(@Param (“itemList” ) List<objectclass> itemList);

itemListを一括DBにinsertします。

 NGパターン

<insert id=”insertBatch” parametertype=”java.util.List”>

insert into TABLEAAA (C1, C2)

values

<foreach collection=”itemList” item=”item” index=”index” separator=”,”>

(#{item.c1},#{item.c2})

</foreach>

</insert>

書き方は大丈夫そうな感じですが、実は下記エラーが発生します。

Cause: java.sql.BatchUpdateException : ORA-00933: SQLコマンドが正しく終了されていません。

; bad SQL grammar []; nested exception is java.sql.BatchUpdateException: ORA-00933: SQLコマンドが正しく終了されていません。

Oracleの場合は特別です。

 OKパターン1

INSERT ALLを利用します。

<insert id=”insertBatch” parametertype=”java.util.List”>

INSERT ALL

<foreach collection=”itemList” item=”item”>

INTO TABLEAAA (C1, C2) values (#{item.c1},#{item.c2})

</foreach>

SELECT * FROM dual

</insert>

 OKパターン2

union allを利用します。

<insert id=”insertBatch” parametertype=”java.util.List”>

insert into TABLEAAA (C1, C2)

<foreach collection=”itemList” item=”item” separator=”union all”>

(select #{item.c1},#{item.c2} from dual)

</foreach>

</insert>

MybatisでOracleにListを一括update

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

MybatisでOracleにList<object>を一括update

mybatisを利用して、OracleDBにList<object>を一括update方法を紹介します。

 mapperメソッド定義:

int updateBatch(@Param (“itemList” ) List<objectclass> itemList);

itemListを一括DBにupdateします。

 NGパターン

      <update id="updateBatch" parametertype="java.util.List">
             <foreach collection="itemList" item="item" separator=";">
                  update TABLEAAA
                   <set>
                        C1 = #{item.c1},
                        C2 = #{item.c2}
                   </set>
                  WHERE ID = #{item.id}
             </foreach>
      </update>

書き方は大丈夫そうな感じですが、実はエラーが発生します。

Oracleの場合は特別です。

 OKパターン

      <update id="updateBatch" parametertype="java.util.List">
            begin
             <foreach collection="itemList" item="item" separator=";">
                  update TABLEAAA
                   <set>
                        C1 = #{item.c1},
                        C2 = #{item.c2}
                   </set>
                  WHERE ID = #{item.id}
             </foreach>
            ;end;
      </update>

Active Record のカラム名にエイリアスを使えるようにする Utusemi gem

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

Active Record のカラム名にエイリアスを利用できるようにするための gem「Utusemi」を紹介します。

 はじめに

Utusemi は Active Record のカラム名にエイリアスを利用できるようにするための Ruby on Rails 3, 4 向けの gem です。

Ruby on Rails にはモデルのインスタンスに対してエイリアスを張るための alias_attribute というメソッドが存在します。Utusemi は、これに加えてモデルクラスの where メソッドや order メソッドでもエイリアスが使えるようにするための gem になります。

カラム名へのエイリアスは以下のようなケースで利用されることが想定されます。

  1. カラム名が長いので実装上は短く済ませたい
  2. 既存のコードを変えずに DB のカラム名変更に対応したい
  3. gem で用意されている固定カラム名をアプリケーションの特定カラム名にマッピングさせたい

では早速インストールの仕方から紹介していきます。

 インストール方法

他の gem と同じように Bundler を使ってインストールするのがおすすめです。

この場合は Gemfile に下記の1行を追記し、bundle install を実行します。

gem 'utusemi'

また、Bundler を利用しない場合は下記のコマンドでもインストールできます。

gem install utusmei

 設定ファイルの書き方

エイリアス先のカラムとエイリアス元のカラムを設定していきます。

例として、下記のコードを config/initializer/utusemi.rb に設置します。

Utusemi.configure do
  map :sample do
    name :first_name
  end
end

 使い方

上記で設定したエイリアスの設定名を utusemi メソッドに渡すことで、エイリアスを有効にできます。

irb> User.utusemi(:sample).where(name: 'John')
SELECT "users".* FROM "users" WHERE "users"."first_name" = 'John'

例では sample というエイリアス設定を有効にすることで、User モデルの first_name カラムに対して name という名前でアクセスしています。

また、utusemi メソッドを介して取得したインスタンスでもエイリアスが有効です。

irb> user = User.utusemi(:sample).where(name: 'John').first
irb> user.name
#=> "John"

 詳細なメソッドの説明

ActiveRecord::Base.utusemi

モデルクラスに対するエイリアスを設定します。

「使い方」の項で紹介した例では、このメソッドを利用しています。

引数にはエイリアス設定名のシンボルまたは文字列を渡します。

引数を省略した場合はモデル名の小文字単数形をエイリアス設定名として利用します。

irb> Utusemi.configure do
  map(:user) { nickname :first_name }
end

irb> User.utusemi.where(nickname: 'John')
SELECT "users".* FROM "users" WHERE "users"."first_name" = 'John'

ActiveRecord::Base.utusemi!

モデルクラスに対してエイリアスを設定する、破壊的メソッドです。

ActiveRecord::Base.utusemi! を1度でも呼び出したモデルは、その後もエイリアスが有効な状態となります。

irb> User.where(name: 'John')
SQL:Error: Unknown column 'users.name' ...

irb> User.utusemi!(:sample)
irb> User.where(name: 'John')
SELECT "users".* FROM "users" WHERE "users"."first_name" = 'John'

ActiveRecord::Base#utusemi

モデルインスタンスに対するエイリアスを設定します。

irb> user = User.first

irb> user.name
NoMethodError: undefined method `name' for #<user:...>

irb> user.utusemi(:sample).name
#=> "John"

ActiveRecord::Base#utusemi!

モデルインスタンスに対してエイリアスを設定する、破壊的メソッドです。

ActiveRecord::Base#utusemi! を1度でも呼び出したインスタンスは、その後もエイリアスが有効な状態となります。

irb> user = User.first

irb> user.name
NoMethodError: undefined method `name' for #<user:...>

irb> user.utusemi(:sample)
irb> user.name
#=> "John"

 関連モデルに対するエイリアス

エイリアスの有効状態は関連モデルにも引き継がれます。

例として、User モデルに対して Blog モデルが複数紐付いている場合を詳細します。

app/models/user.rb

class User < ActiveRecord::Base
  has_many :blogs
end

app/models/blog.rb

class Blog < ActiveRecord::Base
  belongs_to :user
end

config/initializers/utusemi.rb

Utusemi.configure do
  map :user do
    name :first_name
  end

  map :blog do
    url_path :permanent_link_url
  end
end

このようなファイル構成となっているとき、次のような書き方ができます。

irb> user = User.first
irb> user.utusemi.blogs.where(url_path: 'path-to-link')
SELECT "blogs".* FROM "blogs" WHERE "blogs"."user_id" = 1 AND "blogs"."permanent_link_url" = 'path-to-link'

 リンク

https://github.com/hyoshida/utusemi

【GAIQ】2014年8月1日時点の出題傾向

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。


新たにGoogleアナリティクスIQ(GAIQ)を取得しました。

個人的に100%を狙っていましたが…結果は95%。残念…。

ともあれ、無事合格できたので一安心です。

2014年8月4日現在、日本のGAIQの合格者は506名。

増えましたね。

1年半前に確認した際は100名程だったかと思います。

GAIQの認知度、問題傾向の共有が進み

受験しようという方も増えているのだと思います。

今回はGAIQの概要紹介と、

私が受けた現時点での問題の傾向を簡単にお伝えしたいと思います。

 GAIQとは

「Google アナリティクス IQ(以下、GAIQ)はGoogleが実施している個人認定資格です。Google アナリティクスの「導入」から「分析」「レポーティング」にいたるまでの総合的な知識を確認するものでテストに合格するとGoogleから認定証が発行されます。」

 受験概要

受験費用:US50ドル(テストセンターにてクレジットカード決済)

受験言語:英語

問題数:70問

出題形式:テスト画面での選択チェック方式

テスト時間:90分

※テスト開始後は中断が可能。中断中は経過時間のカウントも停止します。

ただし、テスト開始後120時間(5日間)以内に終了しないといけません。

合格正解率:80%

 出題傾向(2014年8月1日現在)

私の場合は下記のような問題の傾向でした。

※分け方が適切ではないかもしれませんが…ザックリと。

・解析環境 …特定条件の場合のビュー構成/GAの利用規約…など

・フィルタ …ビューやレポートに適用するフィルタの内容

・マーケティング …ROIの考え方やデジタルアナリティクスとは…など

・ディメンション …ディメンションの定義や使用方法

・レポート …特定条件の場合の閲覧対象レポート/レポートの定義…など

・指標 …指標定義…など

・eコマース …eコマース機能導入方法/取得される指標に関して

・adwords …アトリビューションモデルやadwordsの評価指標に関して

・GTM …GTM導入の意義など

ちなみに、ユニバーサルアナリティクスに特化した問題は

現時点では見られませんでした。

正式リリースして数か月。

GAIQにもそろそろ採用されるんじゃないかと思うので

問題傾向も大きく変わることを懸念していたのですが…

まだ大丈夫のようです。

でも近い将来、

ユニバーサルアナリティクスの問題も増えていくのでしょうね。

(分からない英単語が増える予感…)

他の方のブログ等でウォッチしていきたと思います。

 気になる問題

一つ、回答に困った問題がありましたのでご紹介します。

You have defined goal X such that 
any PDF download qualifies as a goal conversion.
A user comes to your site once and downloads five PDFs. 
How many goal conversions will be recorded?

A) 2
B) 0
C) 1
D) 5

※私の翻訳※

あなたのサイトではPDFダウンロードを目標Xとして目標設定してます。
一回のサイト訪問で5回ダウンロードしました。
目標完了数はどのように記録されるでしょう。

A) 2
B) 0
C) 1
D) 5

PDFにはGoogleアナリティクスのタグを設置することができないので

リンクにイベントトラッキング、もしくはバーチャルページビューを仕掛けることになると思います。

例えば、

イベントトラッキングを指定しており、それを目標設定しているなら目標完了数は「5」。

バーチャルページビューを指定しており、URLを目標設定しているなら「1」になると思います。

この問題ではどちらの機能を導入しているか

明確な記述はないと思うので、どちらかの判断に迷いました。

私はGoogleアナリティクスのヘルプ等でよく

イベントトラッキングの導入例としてPDFダウンロードが挙げられているので、

恐らくイベントトラッキングが導入されているのだろうと見越し、「5」にしましたが…。

皆様はどちらだと思いますか?

もしかして翻訳に不足があるかもしれません…。

その際はご指摘いただけますと幸いです_(_ _)_

 受験してみての感想

私は事前の勉強は特に行いませんでした。

なにせ有難い一時停止機能があるので…

分からない単語や問題は都度、

Google翻訳やGoogleアナリティクスのヘルプページで調べていました。

ただ、私の場合、従来のGA・ユニバーサルアナリティクス・GTMの機能を

予め十分理解した上で挑んだつもりです。

それでも多少は戸惑いました。

やはり、少し不安がある、という方はアナリティクスアカデミーでの勉強をお勧めします。

※アナリティクスアカデミー

https://analyticsacademy.withgoogle.com/explorer

有効期限が切れて受けなおす方、

初めて受ける方に対して、少しでも参考になれば幸いです。

以上、最新GAIQのレポートでした。

Google アナリティクス セミナー インターフェイス編

Google アナリティクスのレポート画面が把握できていない方向けの講座。

レポート画面の解説や既存機能の活用法、マルチチャネルなどの新レポートのインターフェイスを解説します。

Google アナリティクス セミナー 分析手法編

インターフェイスは把握しているが、数値の意味や考え方がよく分からないという方向けの講座です。 アクセス解析を用いた課題抽出やサイト改善の考え方を解説します。

Google アナリティクス セミナー 徹底設定編

現状のGoogle アナリティクスで取得可能な数値に物足りない方向けの講座。

外部サイトへの誘導やソーシャルボタン連携、eコマース機能などのカスタマイズ方法をレクチャーします。

MacでのOWASP ZAPのプロキシ設定

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

今回はMacでOWASP ZAPのプロキシ設定を行う手順をご紹介します。

 概要

【環境】
Mac OS X 10.7.5
OWASP ZAP 2.2.2

OWASP ZAPはWEBサイトの脆弱性を診断することができる、オープンソースのツールです。

このOWASP ZAPにはプロキシを利用する手動クロールと、OWASPが自動でリンクを辿って自動クロールする動的スキャンがあります。

ただ、動的スキャンだけでは検出できない項目もあるので、より細かい診断は手動クロールがおすすめです。

この手動クロール、仕組みとしてはブラウザでのリクエストを全てローカルの8080ポート(デフォルト)で起動しているOWASP ZAPを経由して行い、診断を行うというものです。

HTTPSのサイトはこの手動クロールでは診断できないのでご注意ください。

 プロキシ設定

プロキシの設定方法は以下になります。

1. [システム環境設定]
2. [ネットワーク]
3. [(任意のデバイス)]
4. [プロキシ]
5. [Web プロキシ (HTTP)]をチェック
5-1. Webプロキシサーバ [localhost] : [8080]
6. [OK]
7. [適用]
8. ブラウザ再起動

以上で設定は完了です。

OWASP ZAPの画面を見ると、左上の[サイト]にブラウザでアクセスしたサイトのURLが表示されていくかと思います。

注意点としては、設定したPC全体のWebアクセス(HTTP)がOWASP ZAP経由となってしまいますので、ブラウザ以外でHTTPを利用する他のアプリが利用不可能となります。

診断が終わったら忘れずに設定をもとに戻すようにしましょう。

以上です。簡単に設定ができ、脆弱性診断ができるOWASP ZAPおすすめです。

PHP技術者認定試験(初級)合格経験

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

PHP技術者認定試験(初級)合格経験

 【試験難易度】

初心者向けの試験です。

PHPプログラミングの基本知識を問う試験です。

試験の合格率は70%ぐらいです。

ちなみに、上級の合格率:11%ぐらいです。

 【使用教材】

初めてのPHP5増補改訂版(買ったけど、いらない感じでした。)

徹底攻略PHP5技術者認定[初級]試験公式問題集(会社の本棚にある)

http://www.phpexam.jp/material/

 【勉強方法】

問題集を中心として勉強した。

問題をやって、回答をしっかり覚えました

問題の回答は教材見たいです。表にしているので、覚えやすいです。

問題集に出た関数は必ず覚えてください。

ITPROの問題をやりませんでした。

開発環境を構築して、気になるところを実行してみた。

実際動かしたら、印象が深いです。

 【感想】

初心者レベルです。

問題集をしっかり把握すれば、合格できます。

PHPはスクリプト言語なので、Javaと違って、Rubyと似ている。

Ruby&Rails技術者はJava技術者より取りやすいと思います。

audio.js使う時、要注意

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

部分android機種の標準ブラウザにはにaudio.jsがうまく動かないaudio.jsは、みなさんご存知のようにMP3音声ファイルの再生にとても便利なjsプラグインです。

しかし、部分android機種の標準ブラウザにはにaudio.jsがうまく動かない現象があります。

うまく動かないというのは、
①曲再生のシークンは、曲再生後、瞬間終了
②曲再生時間は0のまま
③前進、バックの操作が効かない
のことです。

jsの中身を確認すると、loadProgressファンクションには、下記のif分があります。
      if(this.element.buffered!=null&&this.element.buffered.length){
        if(!this.loadStartedCalled)this.loadStartedCalled=this.loadStarted();
        this.loadedPercent=this.element.buffered.end(this.element.buffered.length-1)/this.duration;
        this.settings.loadProgress.apply(this,[this.loadedPercent])
      }

if分岐に入って、this.loadStarted()が呼ばれると、曲の再生時間this.duration(②)がセットされます。
さらにthis.loadedPercent(①)が正しく計算されます。
さらに前進、バック時(③)、this.loadedPercentを使うので、前進、バック動作は正しく動作します。

androidの部分機種には、this.element.bufferedが取れなくて、if分に入れず、動作がおかしくなります。

あまり強引な解決方法ですが、

if(this.element.buffered!=null&&this.element.buffered.length){
:
}
//追加
else userAgentを判断して、androidかつ標準ブラウザの場合{
 //↑同じ処理
}

但し、androidかつ標準ブラウザの判断は難しい。
最初、/(android)/i.test(navigator.userAgent)&&!(/(chrome)/i.test(navigator.userAgent))
で、androidかつchrome以外で、行けるかなと思っていましたが、
どうも、一部機種には、標準ブラウザでもuserAgentに”chrome”という文字が入っています。

残念ですが、完璧の解決方法が見つかりません。audio.js使う時、注意しましょう。

最近人気な記事