Rails5: データベースがrakeタスクからdropできない時の対処法

問題点

Rails5になってrakeタスクのdrop動作に大きな変更があったらしく, Rails4からアップデートして初めての rake db:drop がエラーを吐いてしまう.

$ bundle exec rake db:drop
Mysql2::Error: Error dropping database (can't rmdir './db_name', errno: 66): DROP DATABASE IF EXISTS `db_name`
Couldn't drop database 'db_name'

mysqlから直接ドロップも出来ない

mysql> DROP DATABASE db_name;
ERROR 1010 (HY000): Error dropping database (can't rmdir './db_name', errno: 66)

解決策: データベースのファイルを根こそぎ削除する

まずはデータベースの入っているディレクトリを調べる:

mysql> select @@datadir;
+-----------------------+
| @@datadir             |
+-----------------------+
| /usr/local/var/mysql/ |
+-----------------------+
1 row in set (0.00 sec)

あるいは:

$ mysql -e "select @@datadir"
+-----------------------+
| @@datadir             |
+-----------------------+
| /usr/local/var/mysql/ |
+-----------------------+

データベースディレクトリに移動して, 該当ファイルを削除する:

$ cd /usr/local/val/mysql/
$ sudo rm -rf db_name

あとはデータベースを作りなおせば良い:

rake db:create

Atomエディタからはてなブログエントリーの削除ができるようになりました

かねてより開発していたAtomパッケージ hatena-blog-entry-postをアップデートし、エントリーの削除機能を追加しました。

デモ

delete

このパッケージを使って、はてなブログにエントリーを投稿すると、次のようなコメントがファイルに挿入されます。

<!--
{"id":"6653812171401174041","title":"Atomエディタからはてなブログエントリーの削除ができるようになりました","categories":["Atom","hatena-blog-entry-post"],"draft":true}
-->

このコメントが存在する場合に限り、エントリーの更新/削除が可能になります。

また、更新/削除機能の追加に伴い、パッケージをhatena-blog-entry-postからhatena-blog-and-fotolifeへ変更しました。そのままアップデートしてお使いいただけます。

Atomパッケージのリネーム

Atomパッケージのリネームの仕方は、次の通りです:

$ apm publish --rename {新しい名前}

これでスムーズにパッケージのリネームが完了します。

https://atom.io/packages/hatena-blog-entry-post にアクセスしても、 https://atom.io/packages/hatena-blog-and-fotolife へとリダイレクトされますし、パッケージのアップデートもユーザーには影響なさそうです。

なにかあれば気軽にissueへどうぞ。

"Array values in the parameter are deprecated" エラー

問題と原因

Railsのサーバーやコンソール実行時次のような警告が出る場合:

$ rails server
Array values in the parameter are deprecated. Please use a String or nil.
An Array was passed in from bin/rails:3:in `load'
.
.
.

この場合原因はbin/springの11行目にある:

Gem.paths = { "GEM_PATH" => [Bundler.bundle_path.to_s, *Gem.path].uniq }

解決策

bin/springのこの11行目を次のように修正するか:

Gem.paths = { 'GEM_PATH' => [Bundler.bundle_path.to_s, *Gem.path].uniq.join(File::PATH_SEPARATOR) }

springを次のコマンドで最新のバージョンにアップデートすることで、この警告は解消される:

$ bundle update spring && bundle exec spring binstub --remove --all && bundle exec spring binstub --all

direnv使い始め

direnv

direnvとは

  • cdのようなシェルスクリプトをフックとしてディレクトリごとに環境変数を自動で設定してくれるツール
  • ディレクトリをぬけ出すと環境変数はリセットされる

インストールとセットアップ

brewを使ってインストール:

$ brew install direnv
$ brew link direnv

あるいはdirenvはGoで書かれているので、Goとmakeを使って:

$ git clone https://github.com/direnv/direnv
$ cd direnv
$ make install

インストール後、フックを追加:

echo 'eval "$(direnv hook bash)"' >> ~/.bashrc
echo 'eval "$(direnv hook zsh)"' >> ~/.zshrc
echo 'eval (direnv hook fish)' >> ~/.config/fish/config.fish
echo 'eval `direnv hook tcsh`' >> ~/.cshrc

もし、~/.bash_profileが存在しない場合は、以下の内容で新しく~/.bash_profileを作成、あるいは追加:

if [ -f ~/.bashrc ]; then
    . ~/.bashrc
fi

使用例

  • .envrcファイルでディレクトリ固有の環境変数を指定
  • direnv edit .コマンドでそのディレクトリの.envrcファイルを作成

使用する前に環境変数EDITORを設定しておく。

export EDITOR={エディタ}

ターゲットのディレクトリに.envrcファイルを作成:

$ mkdir test
$ cd test
$ echo ${FOO-nope} //環境変数FOOは存在しないのでnopeを返す
nope
$ direnv edit .

.envrcを編集する:

export FOO=foo

リロード:

$ direnv reload
direnv: loading ~/.direnvrc
direnv: loading .envrc
direnv: export +FOO

環境変数が設定されているか、確認:

$ echo ${FOO-nope}
foo

ディレクトリを抜けだしてみる:

$ cd ..
direnv: unloading
$ echo ${FOO-nope}
nope

Error response from daemon: client is newer than server (client API version: 1.23, server API version: 1.22)

Dockerに関するエラー:

$ docker ps
Error response from daemon: client is newer than server (client API version: 1.23, server API version: 1.22)

Machineの更新が必要なので、次のコマンドを打つ:

$ docker-machine upgrade [machine名]

再度チャレンジ:

$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

大丈夫そう。

はじめてのUnity (C#)

参考: http://catlikecoding.com/unity/tutorials/clock/

シンプルな時計を作る

完成品はこちら:

unity-clock

まずはプロジェクトの作成:

プロジェクトの作成が完了したら、Create > Create Emptyから新しく"Clock"という名でゲームオブジェクトを作成する。また、Create > Create Empty Child を選択し、Clockの子オブジェクトとしてHours, Minutes, Secondsを作成:

次に、時計の針を作るために、それぞれの子オブジェクトに対し、子cubeを作成する。それぞれのポジションとスケールは次の通り:

position scale
Hours (0,1,0) (0.5, 2, 0.5)
Minuts (0, 1.5, 0) (0.25, 3, 0.25)
Seconds (0, 2, 0) (0.1, 4, 0.1)

オブジェクトのヒエラルキーと現時点でのSceneは次のようになる:

アニメーションの追加

時計を動かすにはスクリプトが必要だ。まずは、ProjectタブからCreate > C# Scriptで新しくC# スクリプトを作成し、ClockAnimatorと名前をつける。スクリプト編集するために、ファイルをエディタで開こう。

まず、UnityEngineの名前空間から必要な物を使用することを宣言する。次に、ClockAnimatorクラスにMonoBehaviourからの継承を宣言する。

using UnityEngine;

public class ClockAnimator : MonoBehaviour {
}

ClockオブジェクトのInspectorからAdd Component > Scripts > ClockAnimatorと選択して、オブジェクトとスクリプトをつなげる。

時計の針を動かすためには、Transformコンポーネントにエディタからアクセスすることが必要になるので、Transform変数を宣言し、オブジェクトのプロパティとしてそれぞれに割り当てる。

using UnityEngine;

public class ClockAnimator : MonoBehaviour {

    public Transform hours, minutes, seconds;
}

次に、Updateメソッドを追加する。このメソッドはフレーム毎に呼び出される特殊なメソッドだ。

using UnityEngine;

public class ClockAnimator : MonoBehaviour {

    public Transform hours, minutes, seconds;

    private void Update () {

    }
}

このメソッドを追加すると、コンポーネントにチェックボックスが表示され、オン・オフが設定できる。

Hoursの針は1時間毎に360/12度、Minutesの針は1分ごとに360/60度、1秒ごとに360/60度回転する。これらの値を定数の浮動小数点として次のように定義する。

using UnityEngine;

public class ClockAnimator : MonoBehaviour {

    private const float
        hoursToDegrees = 360f / 12f,
        minutesToDegrees = 360f / 60f,
        secondsToDegrees = 360f / 60f;

    public Transform hours, minutes, seconds;

    private void Update () {

    }
}

System名前空間から、現在の時刻を知るため、DateTimeNowプロパティを呼び出し、time変数に格納する。

using UnityEngine;
using System;

public class ClockAnimator : MonoBehaviour {

    private const float
        hoursToDegrees = 360f / 12f,
        minutesToDegrees = 360f / 60f,
        secondsToDegrees = 360f / 60f;

    public Transform hours, minutes, seconds;

    private void Update () {
        DateTime time = DateTime.Now;
    }
}

時計の針を動かすには、hoursminutessecondsのコンポーネントのlocalRotationを直接変更する必要がある。Quaternionのあるメソッドを使って、任意の回転を定義しよう。

using UnityEngine;
using System;

public class ClockAnimator : MonoBehaviour {

    private const float
        hoursToDegrees = 360f / 12f,
        minutesToDegrees = 360f / 60f,
        secondsToDegrees = 360f / 60f;

    public Transform hours, minutes, seconds;

    private void Update () {
        DateTime time = DateTime.Now;
        hours.localRotation =
            Quaternion.Euler(0f, 0f, time.Hour * -hoursToDegrees);
        minutes.localRotation =
            Quaternion.Euler(0f, 0f, time.Minute * -minutesToDegrees);
        seconds.localRotation =
            Quaternion.Euler(0f, 0f, time.Second * -secondsToDegrees);
    }
}

真ん中のPlayボタンを押せば、アニメーションが開始され、時計が動き始める。

unity-clock