Unable to boot device due to insufficient system resourcesの対策法

環境:
macOS Mojave v10.14
Xcode v10.0

XcodeでプロジェクトをiPhone XS Maxのシミュレーターで走らせようとしてら、下記のようなエラーが出ました。

Unable to boot device due to insufficient system resources.

Please see Simulator Help for information on adjusting system settings to allow more simulated devices to boot at once.

maxUserProcs: 709, runningUserProcs: 645, enforcedProcBuffer: 144

結論は参考1で紹介された通り以下のコマンドを実行すれば良いです。

sudo launchctl limit maxproc 2000 2500

しかしこれで再度実行するとしたら、下記のようなエラーに変わりました。

違いとしては下部の段がこれに変わっただけです。

maxFiles: 12288, openFiles: 10990, enforcedFilesBuffer: 1868

再度参考1を見てみたら、回答のコメント欄にXcodeを再起動する必要があると書いた人もいたので、Xcodeを再起動してみたら、上記のエラーも出なく、無事アプリをシミュレーターで動かせました。
そのコメント欄には、再起動する必要ないと書いた人もいたので、人の環境によるみたいですね。

参考
  1. Unable to boot device due to insufficient system resources using Xcode 9

面白いスタッフ紹介ページ

こちらはDoodle MobileのTeamページで作ったgifです。
※少し重いので、少々お待ちいただく必要があるかもしれません。

Doodle Mobile Team

ご覧の通り、スタッフの皆さんはマウスカーソルを追って顔の向きを変えてます。
誰のプロフィールが開かれたら、残りの人たちがその人を見るようにされています。

これだけのことですが、しばらくそのページで遊んでいました。^^;
あっち向いてホイだったり、”平手打ち”を食らわせたりしていました。^^;;;

上下左右それぞれの報告に3枚+真正面の1枚の写真で作っているようです。
面白い紹介ページですね!
皆さんも遊んでみてください。^^b

bitbankの(自動売買)ruby APIの使い方

botによる仮想通貨の自動売買をやってみたいと思い、bitbankにアカウントを作り、5千円振り込んでみました。
最終的にはRailsで動かそうと思ったので、rubyを選びました。

いざやろうと思ったら、現時点公式のドキュメントがあまりにもシンプルであることが分かりました。Orz Orz Orz

こちらが公式APIの紹介です。
bitbank.cc API

そして、rubyのライブラリはこちらです。
https://github.com/bitbankinc/ruby_bitbankcc

rubyライブラリに関するドキュメントは「Installation」と「Usage」だけであり、使う例があって参考になりますが、各メソッドとパラメーターの説明がなかったので、ここで調査した結果をまとめたいと思います。

※現時点最終更新日は2017年12月5日で、10ヶ月未更新ということになります。大丈夫かな?!rubyはマイナーだった?!
※今回はお金と直接関係する部分ですので、改めて申し上げますと、ここで書いたものは私がnode.jsやJavaライブラリの参考や私自身が試した結果を基づいた情報ですので、実際操作による過失などには一切責任負いかねます。m(_ _)m



#!/usr/bin/env ruby -Ilib
require 'ruby_bitbankcc'

bbcc = Bitbankcc.new("YOUR API KEY", "YOUR SECRET KEY") #1
bbcc.read_transactions('btc_jpy') #2
bbcc.read_ticker('btc_jpy') #3
bbcc.read_order_books('btc_jpy') #4
bbcc.read_balance() #5
bbcc.read_active_orders('btc_jpy') #6
bbcc.create_order('btc_jpy', "0.001", 130000, 'buy', 'limit') #7
bbcc.cancel_order('btc_jpy', order_id) #8
bbcc.read_trade_history('btc_jpy') #9
bbcc.read_withdrawal_account('btc') #10
bbcc.request_withdrawal('btc', 'ACCOUNT UUID', '0.001', 'OTP TOKEN', 'SMS TOKEN') #11
JSON.parse(response.body) #12

  1. Bitbankcc.new

    オブジェクト作成、ログインみたいな感じですね。

  2. read_transactions

    そのまま実行すると

    => <RestClient::Response 200 "{\"success\":...">
    

    という感じで出ます。

    私最初にこれを見た時、なんぞやこれ!と思いましたね。
    実は#12のJSON解析で返ってきたレスポンスが見れますので以下実行すれば結果の中身が見れます。

    response = bbcc.read_transactions('btc_jpy')
    JSON.parse(response.body)
    

    こんな感じになると思います。

    => {"success"=>1, "data"=>{"transactions"=>[{"transaction_id"=>22250944, "side"=>"sell", "price"=>"724766", "amount"=>"0.0070", "executed_at"=>1539801871742}, {"transaction_id"=>22250943, "side"=>"buy", "price"=>"724913", "amount"=>"0.0081", "executed_at"=>1539801870475}, ...(略)...
    

    結果の中に”executed_at”のところにタイムスタンプようなものが押され、[“data”][“transactions”]のサイズが60であることから、この文は過去1分間の売買履歴を読み込むことができると推測します。

  3. read_ticker

    上記と同じく下記ので中身見れます。以降説明省略します。

    JSON.parse(bbcc.read_ticker('btc_jpy').body)
    

    こんな感じの結果が返ってきます。

    => {"success"=>1, "data"=>{"sell"=>"725989", "buy"=>"725700", "high"=>"730900", "low"=>"720555", "last"=>"725914", "vol"=>"1421.6657", "timestamp"=>1539803448525}}
    

    これは、、、ティッカーというのは、、、weblioのIT辞書によると、
    ティッカーとは、特定範囲内に文字列を流して表示させる表示方式のことである。右から左(あるいは上から下へ)文字が次々に流れてゆくのを読ませる方式であるので、限られた狭い領域で多くの情報を表示することができる。

    ティッカーの代表的な例としては、新幹線の車内や看板、証券取引所などにある電光掲示板がある。Webページにおいても、左右に文字の流れるティッカー表示が用いられる場合が珍しくない。
    だそうです。

    正直現時点この数字を見てもあまり意味が分かりません。^^;

  4. read_order_books

    現時点の取引量(?専門用語がありそうな、、)を取得できます。

    JSON.parse(bbcc.read_order_books('btc_jpy').body)
    

    実行すると、こんな感じで返ってきます。

    => {"success"=>1, "data"=>{"asks"=>[["726850", "0.0087"], ["726860", "0.0040"], ["726861", "0.0246"], ["726862", "0.2485"], ["726998", "0.0090"],
    ...(中略)...
    "bids"=>[["726800", "0.1209"], ["726672", "0.0076"],...(略)...
    

    いわゆる画面で見る以下のことだと思います。

  5. read_balance

    残高確認ですね。実行するとそのままJSON形式で返ってきます。

    => "{\"success\":1,\"data\":{\"assets\":[{\"asset\":\"jpy\",\"amount_precision\":4,\"onhand_amount\":\"5000.0000\",\"locked_amount\":\"0.0000\",\"free_amount\":\"5000.0000\",...(略)...
    

    5000円入ってるのが分かりますね。^^;

  6. read_active_orders

    有効な注文を読み込む用です。
    何もなければ、こんな感じで返ってきます。

    => "{\"success\":1,\"data\":{\"orders\":[]}}"
    

    注文がある場合は後述します。

  7. create_order

    注文です。
    正直これだけが大事のように思えます。
    他のメソッドのほとんどがreadですので、これらは間違ってもほしい情報が返ってこないだけですが、注文(買い売り)を間違えるとお金が返ってこないことになるかもしれません。

    ここパラメーターは以下に意味のようです。

    順番 意味
    1 btc_jpy 公式は「チャンネル」という名前になってますが、取引通貨のペア
    必要に応じて”btc_jpy”の部分を”xrp_jpy”, “ltc_btc”, “eth_btc”, “mona_jpy”などに変更
    2 0.001 ビットコインの額面、他のチャンネルもあるので、正確に言うと、”btc_jpy”の前者の額面だと思われる
    3 130000 円の額面、上記の同じ理由で、”btc_jpy”の後者の額面だと思われる
    4 buy 買うならbuy, 売るならsell
    5 limit 注文種類
    指値ならlimit、成行ならmarket

    なので、上記の意味合わせて、例の意味は130000円で0.001ビットコインを指値で買う注文になっています。

    例えば今は5000円しかないんですが、上記例をそのまま実行するとこうなります。

    bbcc.create_order('btc_jpy', "0.001", 130000, 'buy', 'limit')
    => "{\"success\":1,\"data\":{\"order_id\":435106822,\"pair\":\"btc_jpy\",\"side\":\"buy\",\"type\":\"limit\",\"start_amount\":\"0.00100000\",\"remaining_amount\":\"0.00100000\",\"executed_amount\":\"0.00000000\",\"price\":\"130000.0000\",\"average_price\":\"0.0000\",\"ordered_at\":1539847734642,\"status\":\"UNFILLED\"}}"
    

    そして、一つ前の有効な注文を確認するメソッドを利用すると、今の注文を確認することができます。

    bbcc.read_active_orders('btc_jpy')
    => "{\"success\":1,\"data\":{\"orders\":[{\"order_id\":435106822,\"pair\":\"btc_jpy\",\"side\":\"buy\",\"type\":\"limit\",\"start_amount\":\"0.00100000\",\"remaining_amount\":\"0.00100000\",\"executed_amount\":\"0.00000000\",\"price\":\"130000.0000\",\"average_price\":\"0.0000\",\"ordered_at\":1539847734642,\"status\":\"UNFILLED\"}]}}"
    

    statusが「UNFILLED」になっているので、その注文をそのまま残せば、13万円の残高がある時点で購入されるんでしょうかね?!

  8. cancel_order

    注文のキャンセルです。
    上記の注文キャンセルには

    bbcc.cancel_order('btc_jpy', 435106822)
    => "{\"success\":1,\"data\":{\"order_id\":435106822,\"pair\":\"btc_jpy\",\"side\":\"buy\",\"type\":\"limit\",\"start_amount\":\"0.00100000\",\"remaining_amount\":\"0.00100000\",\"executed_amount\":\"0.00000000\",\"price\":\"130000.0000\",\"average_price\":\"0.0000\",\"ordered_at\":1539847734642,\"canceled_at\":1539848335003,\"status\":\"CANCELED_UNFILLED\"}}"
    

    もう一度注文を確認すると

    bbcc.read_active_orders('btc_jpy')
    => "{\"success\":1,\"data\":{\"orders\":[]}}"
    

    注文が入っていないことが分かります。

  9. read_trade_history

    取引履歴の読み込み用です。

    例えば成行で0.0001で買う注文をするには

    bbcc.create_order('btc_jpy', "0.0001", 0, 'buy', 'market')
    => "{\"success\":1,\"data\":{\"order_id\":417094406,\"pair\":\"btc_jpy\",\"side\":\"buy\",\"type\":\"market\",\"start_amount\":\"0.00010000\",\"remaining_amount\":\"0.00010000\",\"executed_amount\":\"0.00000000\",\"average_price\":\"0.0000\",\"ordered_at\":1539849149642,\"status\":\"UNFILLED\"}}"
    

    さらに、有効な注文を確認すると

    bbcc.read_active_orders('btc_jpy')
    => "{\"success\":1,\"data\":{\"orders\":[]}}"
    

    注文が処理されたことが分かります。

    ここのstatusもが「UNFILLED」なんですね?!
    じゃあ、上記の13万円の注文の予想は違うかもしれません。^^;

    そして、その履歴を確認すると

    bbcc.read_trade_history('btc_jpy')
    => "{\"success\":1,\"data\":{\"trades\":[{\"trade_id\":45463140,\"order_id\":417094406,\"pair\":\"btc_jpy\",\"side\":\"buy\",\"type\":\"market\",\"amount\":\"0.00010000\",\"price\":\"726904.0000\",\"maker_taker\":\"taker\",\"fee_amount_base\":\"0.00000000\",\"fee_amount_quote\":\"0.0000\",\"executed_at\":1539775614206}]}}"
    
  10. read_withdrawal_account

    取りやめのアカウントを読み込む用?
    ここは不明です。
    とりあえず実行してみるとこうなります。

    bbcc.read_withdrawal_account('btc')
    => "{\"success\":1,\"data\":{\"accounts\":[]}}"
    

    パラメーターに通貨の記号がありますので、取りやめになった取引なら分かるような気がしますが、なぜかアカウントですね。

  11. request_withdrawal

    前項と似た理由で、不明です。
    bitbankの「アカウント」メニューに「アカウント連携」があり、bitbank Tradeとのアカウント連携などの情報がありますので、それ関連かもしれません。

  12. JSON.parse(response.body)

    前述の通り、JSON解析です。
    公式の紹介では、これを最初のところに持っていくべきだと思います。

一通り以上です。

最後に先程買った0.0001ビットコインを売りたいと思います!

bbcc.create_order('btc_jpy', "0.0001", 0, 'sell', 'market')
=> "{\"success\":1,\"data\":{\"order_id\":497525118,\"pair\":\"btc_jpy\",\"side\":\"sell\",\"type\":\"market\",\"start_amount\":\"0.00010000\",\"remaining_amount\":\"0.00010000\",\"executed_amount\":\"0.00000000\",\"average_price\":\"0.0000\",\"ordered_at\":1539850841760,\"status\":\"UNFILLED\"}}"

そして、履歴を確認すると

bbcc.read_trade_history('btc_jpy')
=> "{\"success\":1,\"data\":{\"trades\":[{\"trade_id\":45678136,\"order_id\":497525118,\"pair\":\"btc_jpy\",\"side\":\"sell\",\"type\":\"market\",\"amount\":\"0.00010000\",\"price\":\"724384.0000\",\"maker_taker\":\"taker\",\"fee_amount_base\":\"0.00000000\",\"fee_amount_quote\":\"0.0000\",\"executed_at\":1539851053689},{\"trade_id\":45463140,\"order_id\":417094406,\"pair\":\"btc_jpy\",\"side\":\"buy\",\"type\":\"market\",\"amount\":\"0.00010000\",\"price\":\"726904.0000\",\"maker_taker\":\"taker\",\"fee_amount_base\":\"0.00000000\",\"fee_amount_quote\":\"0.0000\",\"executed_at\":1539850121143}]}}"

になります。

先程買った時の1ビットコインの単価は726904.0000で、売った時は724384.0000でしたので、-0.252円になりました。Orz

さくらレンタルサーバーでGit管理ツールGitoliteの構築

Gitの管理ツールと言えば、Githubが一番有名だと思いますが、個人や小規模のプロジェクトなら、Bitbucketがおすすめです。
なぜなら、無料で使うには、Githubはソースコードを公開しなければいけないのに対して、Bitbucketではリポジトリーをプライベートに設定できて、公開しなくて良いからです。

それなら別に自前のGit管理ツールなんかいらないじゃん〜となりますが、はい、基本的には問題ありません。^^;
私Bitbucketを5年程使ってきましたが、接続できないとなったのは1〜2回でしたし、ソースコードが消えたような問題もありませんでしたので、これは問題ないと言っていいでしょう。
つまり、ここの話は一日0.11%(2/(5*365))の確率で発生する問題の対策になります。^^b

ソース置くぐらいなら、VPSなどルート権限付のサーバーも必要なく、共用サーバーは十分だと思います。
サーバーにベタでリポジトリーを作り、そこにプッシュする手もありますが、Gitoliteのようなツールを使うと楽です。

参考1の公式インストール手順でも十分ですが、gitolite/install -ln ~/binすることで、bin/の中にgitoliteのリンクが生成されるだけで、クローンしたソースファイルを残さなくてはいけないのがあまり好きではなく、参考2の公式Githubのページに紹介された手順はおすすめです。

手順は以下になります。

  1. Gitolite管理者用のsshキーを生成
  2. Gitoliteのインストール
  3. Gitoliteのセットアップ

Gitolite管理者用のsshキーを生成

以下のコマンドでsshキーが生成されます。

ssh-keygen -t rsa -b 4096 -N '' -C "メールアドレス" -f ファイル名

ここの「-N ”」部分はパスフレーズをなしにするオプションですので、必要に応じて外しても問題ありません。

このキーファイルはローカルに作成したならば、公開鍵(ファイル名.pub)だけscpなどでレンタルサーバーにアップロードすれば良いです。
逆にサーバーで生成したら、秘密鍵(拡張子がない)をローカルにダウンロードする必要があると思います。

Gitoliteのインストール

レンタルサーバーにログインして以下のコマンドを実行します。

git clone https://github.com/sitaramc/gitolite
mkdir -p $HOME/bin
gitolite/install -to $HOME/bin

ここまでやれば、$HOME/binの下に以下のようなファイルが増えると思います。

VERSION		commands	gitolite-shell	syntactic-sugar
VREF		gitolite	lib		triggers

Gitoliteのセットアップ

ステップ1で準備した公開鍵のファイル名をgitkey.pubだとすれば良いです。

$HOME/bin/gitolite setup -pk gitkey.pub

そうすることで、$HOME/.ssh/authorized_keysの一番最後に以下のようなものが追加されるはずです。

# gitolite start
command="/home/レンタルサーバーユーザー名/gitolite/src/gitolite-shell 管理者用sshキー",no-port-forwarding
...(中略)...
# gitolite end

さくらインターネットさんのレンタルサーバーは既に$HOME/binを$PATHに入れてますので、再ログイン(もしくはsource $HOME/.cshrcかな?!)すればgitoliteコマンドが使えるようになるはずです。

終わりに

gitoliteコマンドの確認できたら、サーバーからクローンしたgitoliteディレクトリはもう不要ですので、消しても問題ありません。
(いえいえ、是非消してください。)

ここまでがレンタルサーバーにおいてのgitolite構築手順です。結構簡単でしたね。

使い方に関しては別途書く予定です!^^;

参考:
  1. quick install and setup
  2. sitaramc/gitolite

赤ちゃんの歯磨きはいつから?

今日1歳3ヶ月の長女が初めて小児歯科にかかりました。
虫歯とかではなく、兄の虫歯予防治療のついででした。

子どもが小さい頃、歯磨きはいつから、どうしたら良いかずっとボヤッとしましたが、小児歯科の先生の話を聞いてスッキリしました。

その先生の話を要約すると以下の3点になると思います。

  1. 歯が出てきたら磨くべき
  2. 無理やり押さえて磨いてあげてもトラウマにならない
  3. 歯磨き粉はつけなくてもいい

 

まず1点目について、母乳だけでは虫歯にならないそうですが、赤ちゃんが少しずつ大きくなるにつれ、食べるものも増えていきますので、ご飯などの糖分が母乳を飲むことによって口の中に残ってしまうことがあるそうです。
その糖分の作用で虫歯になりやすいだそうです。

そして2点目について、うちの子は自分で歯ブラシを口に入れますが、磨くというよりも、ずっと噛んでるだけ?!でした。
磨いてあげるとしたら、機嫌が良いときは2,3秒ぐらいやらせて、機嫌悪いときは全然ダメでした。

そういう時、ついついまだ子どもが小さいんだから、それぐらいでいいじゃない?!思い、お終いにしてますが、ちょっと無理やりでも磨いてあげるべきだそうですね。
泣きながらでも無理やり30分も押さえ続けたら、それはもうトラウマになり、歯磨き一生大嫌いになるかもしれませんが、普段3分、5分とかの間でしたら、全然大丈夫とのことでした。

また、歯磨き粉使うべきかどうかについて、子どもが歯磨き粉好きで、つけたら喜んで磨かせてくれるなら全然いいんですが、嫌ならつけなくてもOKだそうです。

一日2回は理想ですが、難しければ、夜が大事だそうです。
これは大人でも同じですね。

もう3人目の子どもですので、本当に今更ながら、大変勉強になりました。^^;

UbuntuでMongoDBのユーザー認証有効化

久しぶりにRailsのプロジェクトを再構築しようとしたら、当時メモしたMongoDBのユーザー認証有効化コマンドdb.addUser打つと下記のエラーが出来ました。

TypeError: db.addUser is not a function

調べて見たところ、認証の有効化は変わったようです。

この記事は基本的に下部参考の情報をかき集めてUbuntuで特化したものになります。

環境:
Ubuntu: 18.04.1 LTS
MongoDB: v3.6.3

管理者ユーザーの追加:

use admin
db.createUser(
  {
    user: "任意の管理者ユーザー名",
    pwd: "管理者のパスワード",
    roles: [ { role: "userAdminAnyDatabase", db: "admin" }, "readWriteAnyDatabase" ]
  }
)

一般ユーザーの追加:

use データベース名
db.createUser(
  {
    user: "任意の一般ユーザー名",
    pwd: "一般ユーザーのパスワード",
    roles: [ { role: "readWrite", db: "データベース名" } ]
  }
)

※基本的には日本語をそれに応じたものに変えればコピペできるようになってます。

認証を有効化:

$ sudo vi /etc/mongodb.conf

22行あたりの#auth = trueのコメントアウトを外します:

auth = true

MongoDBを再起動します:

$ sudo service mongodb restart

認証の有効化は以上です。
以降ログインする場合は

use データベース名
db.auth("ユーザー名","パスワード");
#1が返ってきたら成功

でログインできます。

認証が有効にした後に一般ユーザー追加した場合、上記の一般ユーザー追加手順の前に、まず管理者としてログイン必要があります。
その場合は以下になります。

use admin
db.auth("管理者名","管理者パスワード");
#1が返ってきたら続きは上記一般ユーザー追加手順

ちなみに、なぜ再構築のような面倒くさいことするかというと、2年前にDigitalOceanで作ったサーバー(そちらでは「Droplet」と言いますが)は512MBメモリ+20GBディスクで毎月$5でしたが、最近となっては同じ毎月$5で1Gメモリ+25GBディスクになっています。

うぅん〜あなたなら、どちら取ります?!^^;

はい、そこの「イメージ作れば簡単に移せるじゃん?」と思うあなた、天才です!
私自身がそう思ったのはこの記事を書いてるただ今です!

実際スナップショットとってみたら、スペックが違ってもちゃんとイメージからDroplet作れるようです。
#最後まで作ってませんが、「Create Droplet」で最新$5タイプを選択できるところまで確認しました。
僕がその発想なかったのは、「2年前そのサーバーにデプロイしたプロジェクトはこの2年間ずっとステージング環境で動かしたから、これを機にプロダクション環境で作り変えようと思ったから」という言い訳にしましょう!^^;


参考:
  1. Enable Auth #公式
  2. MongoDB の アクセス制御 (ユーザー認証) を 有効化する 方法 #Windows環境
  3. MongoDBのユーザ管理 #CentOS環境
  4. Ubuntu 16.04 LTS で MongoDB の認証を有効にする方法 #管理者ユーザーの追加紹介のみ

UnityのMoveTo

cocos2d-xならrunAction(MoveTo(2, Vec2(50, 0)))のような感じで簡単にスプライトを動かすことができますよね。

Unity使い始めたら、オブジェクトを動かすのに、きっとcocos2d-xのような組み込みのメソッドあると思い、いろいろと探してみました。
結局そのようなもの見つかっておらず、基本的にはUpdate()におけるフレームごとの操作による演出のようです。

いくつサンプルみた中、2Dチュートリアルアプリ「Roguelike」スプライト動かすスクリプトが一番分かりやすかったと思います。

その中のMoveObjectを参考にして以下の点を変更しました。

  1. UI.Imageにも使えるようにlocal positionが変動するように変更
  2. 決まった時間で移動ではなく、決まったスピードで移動するように変更
  3. 移動終了後のコールバックを追加

そして、こうなります。

using System.Collections;
using UnityEngine;

public class MoveObject : MonoBehaviour
{

    public delegate void MoveObjectDelegate();
    protected MoveObjectDelegate callback;

    public float speed = 500f;

    public virtual void move(Vector3 targetPosition)
    {
        StartCoroutine(SmoothMovement(targetPosition));
    }

    public virtual void move(Vector3 targetPosition, MoveObjectDelegate moveObjectDelegate)
    {
        callback = moveObjectDelegate;
        StartCoroutine(SmoothMovement(targetPosition));
    }

    protected IEnumerator SmoothMovement(Vector3 targetPosition)
    {
        //Calculate the remaining distance to move based on the square magnitude of the difference between current position and end parameter. 
        //Square magnitude is used instead of magnitude because it's computationally cheaper.
        float sqrRemainingDistance = (transform.localPosition - targetPosition).sqrMagnitude;

        //While that distance is greater than a very small amount (Epsilon, almost zero):
        while (sqrRemainingDistance > float.Epsilon)
        {
            //Find a new position proportionally closer to the end, based on the moveTime
            Vector3 newPostion = Vector3.MoveTowards(transform.localPosition, targetPosition, speed * Time.deltaTime);

            //Call MovePosition on attached Rigidbody2D and move it to the calculated position.
            transform.localPosition = newPostion;
            //rb2D.MovePosition(newPostion);

            //Recalculate the remaining distance after moving.
            sqrRemainingDistance = (transform.localPosition - targetPosition).sqrMagnitude;

            //Return and loop until sqrRemainingDistance is close enough to zero to end the function
            yield return null;
        }
        OnMoveDone();
    }

    protected virtual void OnMoveDone()
    {
        if (callback != null)
            callback();
    }
}

そしたら、obj.move(GetPositionOfTarget(), OnArriced);というように使えます。

美しい歌声

先日落ち込んだ時に聞く曲のMandyさんですが、またまたMandyさんの美しい歌声です!

最後の審査員の言うことが特に好きです。

I don’t know the purpose of music, music purpose to listen and we suppose to… maybe… our emotion suppose to be touched.
Maybe because what your story is, you make us felt it because you felt it. You’re feeling music much more than any body else just singing.

後半訳すとこうなるでしょう:Mandyさんのストリーがあったからかもしれないけど、あなたは我々に音楽を感じさせました。あなたは他の単に歌を歌ってる人たちよりもずっと音楽を感じています。

もう一曲ここに付け加えたいです。

はじめに歌についての紹介はこう(のはず)です。

This next song is call “Smile” and I want to tell you just a tiny litte story about why it’s important to me.
When I was losing hearing when I was music school I got really distress as you probably could image. And I just stop doing music. I didn’t feel the need any more, I didn’t want to any more, just didn’t feel right.
But every day I sat at my room by myself and I sang the song over and over and over again. And the meaning behind it’s… I guest it suppose to be happy but not for me, It’s more like… I’m not in that good place yet, I’m not there, but I can see it in the future and I know that I need to smile to through this, I need to make it OK.
So this song for me was what pull me out of that hole. And I just want to encourage you guys there are so many things you challenge in your life that you feel it can get over, and this is your moment, you can’t just let it go because it difficult. If you have a dream you do it. If it’s different, if it changed, then go around, find a different route but find the finish line, smile through it, it’s gonna be OK.
So this is my song for you. And it was title track of my album because I need to do for myself. So I hope you enjoy it.

いいですよね〜感心しました!

歯はどのぐらいの力で動かせると思いますか?

昨日子どもを小児歯科に連れた時、そこの先生から意外なこと聞きました。

まず私従来の認識は、大人の歯に生え変わったら、しばらくの間は柔らかくて舌や指の力で動かせますが、その後徐々に固くなり、最終的には骨のように固くなると思っていました。

ところでその先生はまずうちの子どもに、どのぐらいの力で歯を動かせるかと質問し、その答えはなんとペットボトルのキャップ一つ分ぐらいの重さだというんです!
HELLO FIVE eco エコキャップ運動によると、キャップ平均の重さは2.5gとのことです。

えええぇぇ〜〜そうなんですか?!

早速大人の歯も同じですか?と質問したら、大人になるにつれ、もちろん動かしにくくなりますが、動かせますとのご返答でした!!

一方で舌や唇が歯に働く力はなんと350mlのペットボトルに水入れた状態の重さだそうです。
つまり大体350gでしょうか。歯を動かす力の140倍になります!

これは私にとってかなり意外でした。
自分の歯並びに満足していないので、毎日指とかで押したり、引っ張ったりすると、うまい具合に調整できるかもしれまんね!

しかし、この記事を読んだから歯が変になっちゃったと言われても責任は負いませんよ!^^;

その続きとして、歯を動かせると舌や唇の力が強いという前提で、口呼吸はどれだけ歯に悪い影響与えるか、鼻呼吸がいかに大事かは簡単に想像つくでしょう。

「新しいフォルダ(2)」さん

HITというゲームが7月頃の行われたイベント中の会話シーンのスクリーンショットご覧ください。

HIT1

私これ見た時、「新しいフォルダ(2)」さん?!あっ!やっちゃったな!大手でもこんなことあるんだと思い、ニヤニヤと笑いました。

そして、

HIT2

これぇ、また適当な名前だなぁ〜

そして、

HIT3

えっ!認識してるんじゃん!どういうこと?

そして、

HIT4

Orn

最後、

HIT5

私最初は本当に間違いだと思いましたね。
サプライズになりました!すごいです!

ちなみに、このゲームにおいてのサプライズこういうの以外にも結構あります。

例えば、装備は強化すればすべて最高レアランクSSSになれる点です。
プレイして1年半以上経つところでしょうか。プレイ当初は「おぉ!これ新しい!」と思いましたね。
今でもそのようなゲームは少ないではないでしょうか?!

更に驚いたことは、今年の4月末頃、「レベルジャンピング」システムの導入です。
それは何かと言いますと、キャラのレベルが30以上になれば、いきなり71レベルにジャンプすることができます。
もちろんステータスもちゃんとその分上がるし、おまけに一つ前のシーズンの装備をマックスレベル(超越済みの30レベル!)でもらえます。
しかも、これは全部タダですよ!

なんだか宣伝っぽくなりましたが、これには本当に驚きました!単にそれだけです。
これはRPGとしてありえますか?!!

あまりにも美味しすぎる話ですので、私疑っちゃいましたね。
ジャンプする前にちゃんと攻略サイトで確認しました。何かが罠がないかなぁと。

そして、参考したHITの攻略サイトいわば、デメリットとして、レベルアップごとに買える成長パックがレベル一気に飛ばされるために買えなくなるぐらいとのことです。
成長パックなんかあったんだ!買ったことない!そもそもこのゲームに課金したことがありませんでした。
これでようやく手持ちキャラ順次レベルジャンプさせました!

少し前に「OVERHIT」というタイトルの続編が出ましたが、私の中ではその続編はHITを超えてませんよ!^^;
今後でも嬉しいサプライズ期待しています!