読者です 読者をやめる 読者になる 読者になる

神様は有給消化中です。

技術ネタを書こうかな。時事ネタとか私生活ネタはうけないし。

【Unity5】ゆっくり動き始めて、ゆっくり止まる補間を実装する

カメラやキャラクターの移動で、以下のグラフのような補間を実装する方法を共有。ゲームで一番よく使う補間方法です。
正式名称(?)はEase-in, Ease-Outとのこと。
f:id:appleorbit:20151018205414p:plain

続きを読む

【Unity5】Visual Studio Codeを使ってデバッグする

Visuat Studio Codeを使ってデバッグするための情報が公式から出たので、試してみました。
今の所Mac OS X以外は未サポートみたいです。

環境

Mac OS X 10.10.1
・Unity 5.2.1f1
Visual Studio Code 0.8.0

やりたいこと

・UnityのエディタとしてVisual Studio Codeを使う
デバッグもしたい

続きを読む

【Unity5】【C#】string.StartsWithが激重いのでstring.IndexOfを使おう

先日Unityのプロファイラーを眺めていたところ、string.StartsWithが激重いことに気づいたので共有。

テスト用にこんなスクリプトを実行。

using UnityEngine;
using System.Collections;

public class Hoge : MonoBehaviour
{
	void Update () {
		string hoge = "abcdef";

		for (int i = 0; i < 1000; i++) {
			bool check = false;
			if(hoge.StartsWith("abc")){
				check = true;
			}
		}
	}
}

これをプロファイラーで確認すると、だいたい2.5msくらい。遅っ。

判定をstring.IndexOfに変更

//if(hoge.StartsWith("abc")){
if(hoge.IndexOf ("abc") == 0){
	check = true;
}

これを確認すると、だいたい0.3msくらい。2.2msほど軽くなりました。
なんでStartsWithは重いのかわからん・・・が、今後は使用を控えようと思います。

【Unity5】Vector3.DotとMathf.Acosの組み合わせでNan発生

Vector3.Dotで取得したラジアン値をMathf.Acosに突っ込んだところNanが発生することがあったので共有。
以下のようなソースで出ました。

Vector3 a = (end - start).normalize;
Vector3 b = hoge.transform.rotation * Vector3.forward;

float rad = Vector3.Dot(a, b); // a, bともにmagnitude=1のはず。
float result = Mathf.Acos(rad); // Nan発生

Mathf.Acosは-1〜1までの値しか与えられず、引数が範囲外になるとNanを返します。
しかし、上記例ではa, bともに正規化されているのでDotの戻り値は-1〜1のはず・・・
条件としては、a, b間のなす角が非常に小さい場合に出てました。
bの回転処理で若干の計算誤差が出て、長さが微妙に大きくなっちゃってる?うーん、わからん。

仕方ないので以下で解決しました。

Vector3 a = (end - start).normalize;
Vector3 b = hoge.transform,rotation * Vector3.forward;

float rad = Vector3.Dot(a, b);
float d = Mathf.Clamp(rad, -1.0f, 1.0f); // 追加
float result = Mathf.Acos(d);

【Rails】db:migrateでMySQLのLONGTEXT、MEDIUMTEXTを使う

MySQLで使用できる文字列型には

  • CHAR:255Bまでの固定長文字列
  • VARCHAR:64KBまでの可変長文字列
  • TINYTEXT:255Bまでの可変長文字列
  • TEXT:64KBまでの可変長文字列
  • MEDIUMTEXT:約1.6MBまでの可変長文字列
  • LONGTEXT:約4.3GBまでの可変長文字列

がありますが、rais g modelで普通にtextを指定するとTEXTが指定されちゃいます。

$ rails g model Test value:text

// こんな感じで作成される
$ rails db
mysql> show columns from tests;
+-------------+--------------+------+-----+---------+----------------+
| Field       | Type         | Null | Key | Default | Extra          |
+-------------+--------------+------+-----+---------+----------------+
| id          | int(11)      | NO   | PRI | NULL    | auto_increment |
| value       | text         | YES  |     | NULL    |                |
| created_at  | datetime     | NO   |     | NULL    |                |
| updated_at  | datetime     | NO   |     | NULL    |                |
+-------------+--------------+------+-----+---------+----------------+

上記に書いた通り、textだと64KBまでしか扱えません。
MySQLでは1文字1〜3文字と仮定するみたいなので、約VARCHAR(21845)が最大値になるということです。

これでは足りない場合は、migrationファイルに一工夫しましょう。

$ vim db/migrate/20150212101414_create_tests.rb
class CreateTests < ActiveRecord::Migration
  def change
    create_table :articles do |t|
      t.text :value, :limit => 4294967295   ←「 :limit => 4294967295」を指定

      t.timestamps null: false
    end
  end
end

// こんな感じで作成される
$ rails db
mysql> show columns from tests;
+-------------+--------------+------+-----+---------+----------------+
| Field       | Type         | Null | Key | Default | Extra          |
+-------------+--------------+------+-----+---------+----------------+
| id          | int(11)      | NO   | PRI | NULL    | auto_increment |
| value       | longtext     | YES  |     | NULL    |                |
| created_at  | datetime     | NO   |     | NULL    |                |
| updated_at  | datetime     | NO   |     | NULL    |                |
+-------------+--------------+------+-----+---------+----------------+

ちなみにlimitの値は、以下のように対応するそう。
1 ~ 255 :TINYTEXT
256 ~ 65535 :TEXT
65536 ~ 16777215 :MEDIUMTEXT
16777216 ~ 4294967295 :LONGTEXT

【Rails】Apache経由でInternal Server Error(500 Error)が発生して困った

環境

やりたいこと

  • ローカル環境で開発したRailsアプリをサーバーに入れて、Apache経由で使いたい
  • まだ作りかけのアプリなので、development環境で動作させる

やったこと

基本的にはコチラのサイトを参考に進めていく。

途中躓きながらもrails sever経由での接続までできて、いざApache経由で接続。

sudo vim /etc/httpd/conf/httpd.conf

NameVirtualHost *:80  #コメントされているので外す

<VirtualHost *:80> #ここから追加
    ServerName XXXX.XXXX.XXXX.XXXX # サーバーのIPアドレス
    DocumentRoot /home/user/testapp/public/
    <Directory "/home/user/testapp/public">
        Options -MultiViews
        AllowOverride All
        Order allow,deny
        Allow from all
    </Directory>
</VirtualHost> #ここまで
sudo service httpd restart

ブラウザからhttp://XXXX.XXXX.XXXX.XXXX/に接続

Internal Server Error

おぉ、マジか・・・。

調べてみると、どうやらPassengerではデフォルトでproductionモードで実行されるとのこと。
よく見れば /rails_root/log/production.log なるものが作られている。サイズは0。

developmentモードで実行するには、Apacheに設定が必要だそうで。
以下のように変更。

sudo vim /etc/httpd/conf/httpd.conf

NameVirtualHost *:80

<VirtualHost *:80>
    RailsEnv development # 追加!
    ServerName XXXX.XXXX.XXXX.XXXX
    DocumentRoot /home/user/testapp/public/
    <Directory "/home/user/testapp/public">
        Options -MultiViews
        AllowOverride All
        Order allow,deny
        Allow from all
    </Directory>
</VirtualHost>
sudo service httpd restart

ブラウザからhttp://XXXX.XXXX.XXXX.XXXX/に接続

無事表示できました。

というわけで、developmentモードでApache使うときはお気をつけて(常識か)

【Rails】feedzirraでRSSを取得してみる

feedzirraでRSSを取得してみる

feedzirraでRSSを取得しようとして、つまらないところでハマったのでメモ。

まずは、gemfileにfeedzirraを登録。
ネットで調べると以下のように登録するとのことで、追加。

vi Gemfile
gem 'feedzirra'

んで、いつもの

bandle install

config/application.rbに以下を追加

vi application.rb
class Application < Rails::Application
  config.autoload_paths += %W(#{config.root}/lib)
end

lib/tasks内に以下のファイルを作成。

vi update_feed.rb
class Tasks::UpdateFeed
 
  def self.getrss
    #RSSを取得する
    require 'feedzirra'
    url = ‘http://www.nextsoft.jp/feed/'
    feed = Feedzirra::Feed.fetch_and_parse(url)
  end

end

んで、実行!
・・・・すると以下のエラーが出てくる。なんじゃいこりゃ。

/Users/hoge/.rbenv/versions/2.0.0-p598/lib/ruby/gems/2.0.0/gems/feedzirra-0.8.0/lib/feedzirra.rb:2:in `<top (required)>': This project has been renamed Feedjira, find out more at feedjira.com. (RuntimeError)
from /Users/hoge/.rbenv/versions/2.0.0-p598/lib/ruby/gems/2.0.0/gems/bundler-1.7.12/lib/bundler/runtime.rb:76:in `require'
from /Users/hoge/.rbenv/versions/2.0.0-p598/lib/ruby/gems/2.0.0/gems/bundler-1.7.12/lib/bundler/runtime.rb:76:in `block (2 levels) in require'
・・・

読んでみると、どうやらfeedzirraの名前が変わってるっぽい。

This project has been renamed Feedjira, find out more at feedjira.com. 

うーん、feedjiraに変えればよろしいのか・・・?

以下のように試す。

vi Gemfile
gem 'feedjira'
bandle install
vi update_feed.rb
class Tasks::UpdateFeed
 
  def self.getrss
    #RSSを取得する
    require 'feedjira'
    url = ‘http://www.nextsoft.jp/feed/'
    feed = Feedjira::Feed.fetch_and_parse(url)
  end

end

うまくいった。
というわけで、feedzirraを使うときはfeedjiraと読み替えましょう。