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をアップデートし、エントリーの削除機能を追加しました。
デモ
このパッケージを使って、はてなブログにエントリーを投稿すると、次のようなコメントがファイルに挿入されます。
<!-- {"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とは
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/
シンプルな時計を作る
完成品はこちら:
まずはプロジェクトの作成:
プロジェクトの作成が完了したら、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
名前空間から、現在の時刻を知るため、DateTime
のNow
プロパティを呼び出し、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; } }
時計の針を動かすには、hours
、minutes
、seconds
のコンポーネントの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ボタンを押せば、アニメーションが開始され、時計が動き始める。