Catama – Autonomous intelligent cat(ねこマタ – 猫型自律機械兵器) version 1.1.0 release

本日、Catama – Autonomous intelligent cat(ねこマタ – 猫型自律機械兵器)の新バージョンをリリースしました。

早速iPhoneXに対応しました。そしてアプリ製作者もクリア出来ない地獄のステージ31と32を追加しました。誰かクリア方法教えてください。

どんなアプリかはしつこいくらい詳しく解説 — ねこマタ入門でご確認下さい。

さくらのVPSからConoHaに移行しました

本日、たった今、本サイトの移行が完了しました。

さくらのVPSで運用していましたが、ConoHaに移行しました。

早速、移行前後でのWordpressの表示速度をご覧ください。キャッシュ系プラグインを使っていない状態です。Wordpressの記事数はほとんど同じです。
さくらのVPSではnginxでWordpressを運用していましたが、ConoHaではOpenLiteSpeedで構築してみました。

Query Monitorというプラグインで計測しています。

移行前:
さくらのVPS(v3) SSD 2G IK01(申込日2014/03/15)
20,139円(税込)/年

約6.58秒

移行後:
ConoHa 2Gプラン(申込日2017/09/1)
22,680円(税込)/月

約0.03秒

約200倍です。

数値で比べるまでもありません。体感でこれ以上ないほどに表示速度が改善されました。さくらのVPSでは、あまりの重さにブログに記事を追加する気になりませんでした。

さくらのVPSは、ある時期から極端に重くなりました。重くなった原因は不明です。

OpenLiteSpeedが速いのはわかっていましたが、それだけが原因ではないことは明らかです。
サーバ上のソフトウェアが壊れたかもしれないし、ハードウェアスペックが下がった!?のかもしれません・・・
3年程度の運用で、ゴミファイルが溜まっていたのかもしれません。原因不明です。

ですが、最近さくらのVPSから新プラン移行割引キャンペーンのメールを受け取りました。
おそらく、古いサーバの契約者を新しいプランに誘導したかったのではないでしょうか?

古いプランのユーザはあまり良いハードウェアを割り当ててもらえるとは思いません。
古くから契約していたユーザを軽視されているように感じました。思い込みかもしれませんが・・・

何れにしても、サーバ移行するしか選択肢はなかったですし(色々原因を調べて対策したのですが改善せず、万策が尽きた感じでした)、移行して良かったです。

・TextMangaについて

FuelPHPで構築していたTextMangaをLumen(larabel)で構築し直す予定です。FuelPHPは開発が滞っているみたいなので。ガンバルゾー

あ、すでに作ってあったTextMangaは引き続き問題なく使えます!新規追加や編集機能が停止しているだけです。

・プロモーションコード配布所について

プロモーションコード配布所については、利用者が少ない かつ アプリ製作者の方にあまりレビューが届いていない現状を踏まえて、サイトを停止することにしました。私の力不足でした。もっとちゃんと製作者の方にレビューを届けるにはどうしたら良かったんでしょうか・・・

・アプリについて

Catama(ねこマタ)は、対戦を含めたサーバ処理部分は新サーバに切り替わって動いています!表面上はわからないと思いますが・・・

あと、Pachiシミュの機種データも新サーバからの取得に切り替わっています。

macでのmp4動画の画面サイズ変更

開発者向け開発メモです。

AppPreviewの5.5インチiPhoneの動画をffmpegで4.7インチの動画から作る方法です。
普通にsオプション使うと画面サイズが思い通りにならず、1079×1920になってしまいます。

以下のようにすると、きちんと1080×1920になります。

ffmpeg -i catama4.7.mp4 -vf scale=1080×1920,setsar=1 catama5.5.mp4

WordPress(このブログ)が重い

最近、Wordpress(このブログ)が重いです。原因を色々調べましたが分かりませんでした。
ヽ(`д´)ノ うわーん

いくらあまり訪問者がいないとしても、なんとか改善したいと思います。

そこで、Wordpressを再インストールすることとしました。

9月頃にこのブログにアクセス出来なかったとしたら、メンテナンス中だと思って下さい。
。・゚・(ノ∀`)・゚・。

10/3追記
Wordpressをインストールし直し、記事数が1の状態でも全然改善しませんでした。ゴミデータやファイルが溜まってるとかということではなさそうです。


Dotter version 1.0.3 release

Dotterの新バージョンがAppStoreで販売開始されました。

2年半ぶりのバージョンアップでしたが、無事にリリース出来ました。

審査が開始されるまでの時間は約8時間、審査時間は約2時間でした。早い!

ちなみに、2年半前のバージョンアップ時は審査開始まで7日と16時間、審査時間は約30分!でした。

昔に比べて人員に余裕ができたのかしら・・・

Dotter version 1.0.3 coming soon

本日、Appleにドット絵エディタ「Dotter」新バージョンの審査依頼を行いました。また、AppStore用の紹介動画や画像を作成しました。連休中に終わって良かった・・・

今回のバージョンアップの目玉機能は「カーソル」です!

1.カーソルを1つ目の指で「ドラッグ」します。
2.ドットを打ちたい位置にカーソルが合ったら、キャンバス上(どこでもOK)に2つ目の指でタップすると、カーソルの位置にドットが打てます。

打ち間違いをかなり減らせ、格段に使い易くなっていると思います!!

AppStore用の動画作りました。地味です。無音です。音楽つければ良かった!!!

「カーソル」機能は我ながらよく出来たと思います。この機能のおかげで、全世界で1億本は売れるのではないでしょうか。

240円 X 1億 = 240億

・・・

新作アプリ「My Tiny Planet」作り出す
→ ドット絵を作る必要が出てきた
→ 自分で過去に作ったドット絵エディタ「Dotter」を使う
→ なんか使いにくいので改良した ←今ココ
→ 新作アプリ作りに戻る

さあ、新作アプリ制作がんばるぞ〜〜〜

最速でAppStore用の動画を作成する方法

前提

・ffmpegインストール済み
・実機あり(iPhone/iPad)
・macOS Sierra バージョン10.12.6

手順1

iPhone/iPadをmacに接続し、QuickTime Playerを立ち上げ、「ファイル」「新規ムービー収録」を選択。録画ボタンの右のメニューからカメラやマイクをiPhone/iPadに切り替える。

手順2

録画ボタンを押し、作成したアプリを動作させて動画を保存する。
(30秒以内。30秒を超えると、30秒以下になるよう動画を編集する必要あり)

手順3

fpsを30に落とすため、ターミナルで以下を実行する。fpsを落とした動画を、iTunesConnectでアップロードすれば終わり。

ffmpeg -i src.mov -crf 20 -r 30 dest.mov

-iオプションで、手順3で作成した動画を指定します。
-crfオプションで画質を指定します。
-rオプションでfpsを指定します。

5.5インチ向けにサイズ変更する場合

ffmpeg -i src.mov -crf 20 -r 30 -s 1080×1920 dest.mov

4.7インチ向けにサイズ変更する場合

ffmpeg -i src.mov -crf 20 -r 30 -s 750×1334 dest.mov

4インチ向けにサイズ変更する場合

ffmpeg -i src.mov -crf 20 -r 30 -s 640×1136 dest.mov

アプリ「Dotter」カーソル機能その他追加!リリースまでもうちょっと待ってね

Swiftで作ったアプリ「Dotter」を、1年半ぶりにバージョンアップします。

先日、ようやく1年半の間のSwift仕様変更に追従し、新しい開発環境で「Dotter」のソースコードが無事動作するようになりました。

そして、以下の機能を追加しました!

・「カーソルモード」追加!

狙った位置にドットが超打ちやすくなる目玉機能です。

キャンバスに「カーソル」が表示されます。

1.カーソルを1つ目の指で「ドラッグ」します。
2.ドットを打ちたい位置にカーソルが合ったら、キャンバス上(どこでもOK)に2つ目の指でタップすると、カーソルの位置にドットが打てます。

2つ目の指を置いたまま1つ目の指でカーソルをドラッグすると、連続でドットが打てたりもします。
従来通りの直接打ちをしたい場合は、「SETS」の「Direct Mode」をOnにして下さい。

カーソルはドラッグで位置が動きますが、この際、各ドットに”吸い付く”ように滑らかに動きます。ですので、打ち間違いをかなり減らせると思います。

カーソル色は、ペンだと緑色、消しゴムだと青色、ペイントだと桃色、スポイトだと水色になります。

・ドットの大きさの直接切り替え

ドットの大きさを変更する際、現バージョンでは「SETS」から大きさを指定し直す必要がありましたが、新バージョンでは、キャンバスを表示しながら、対応する太さのペンや消しゴムを選択することで、素早く切り替えられるようになりました。

・グリッドの直接切り替え

グリッドの表示/非表示を切り替える際、現バージョンでは「SETS」から設定を変更する必要がありましたが、新バージョンではキャンバスを表示しながら素早く切り替えられるようになりました。

また、グリッド線の描画方法を見直し、グリッド線が分かり易くなりました。

・キャンバスクリア

今までは、キャンバスを全てクリアするには消しゴムで頑張って消す必要がありました。

あまり多用しないかとは思いますが、キャンバスを初期化する機能を付けました。

実録! 2年半ぶりのSwiftアプリバージョンアップ 2日目 その2

続きです。今日中に終わるかなぁ・・・

【エラーメッセージ】
‘utf16Count’ is unavailable: Take the count of a UTF-16 view instead, i.e. str.utf16.count
【修正前】
if 0 < newXStr.utf16Count && 0 < newYStr.utf16Count && Util.checkNum(newXStr) && Util.checkNum(newYStr) {
【修正後】
if 0 < newXStr.utf16.count && 0 < newYStr.utf16.count && Util.checkNum(newXStr) && Util.checkNum(newYStr) {
【解説】
newYStr.utf16Count を newYStr.utf16.count に変更。

【エラーメッセージ】
Value of type ‘String’ has no member ‘toInt’
【修正前】
var newX : Int = newXStr.toInt()!
【修正後】
var newX : Int = Int(newXStr)!
【解説】
StringからIntへの変換は、Intイニシャライザを利用するようになった(Swift2で)そうです。2箇所修正。

【エラーメッセージ】
Type ‘String’ does not conform to protocol ‘Sequence’
【修正前】
for c in str
【修正後】
for c in str.characters
【解説】
「String型はSequenceプロトコルに準拠していません」とのことです。文字列を1文字ずつ取り出してforループで処理したい場合は、charactersを使うと良いみたいです。
2箇所修正。

【エラーメッセージ】
Cannot call value of non-function type ‘UIColor’
【修正前】
UIColor.lightGrayColor()
【修正後】
UIColor.lightGray
【解説】
lightGrayColor() がなくなって、lightGrayというconvenience methodで呼べるようになりました。

これでエラー全部直りました。さあ、実行してみます。

・・・

・・

・

Thread 1: EXC_BAD_INSTRUCTION code=EXC_I386_INVOP, subcode=0x0)

おやすみなさい。
さようなら2017年7月16日。

さようなら土日。

・・・続く

実録! 2年半ぶりのSwiftアプリバージョンアップ 2日目 その1

おはようございます。続きです。

【エラーメッセージ】
C-style for statement has been removed in Swift 3
【修正前】
for var y = newYStart; y <= newYEnd; y += 1 {
【修正後】
for y in newYStart … newYEnd { // 3.1
【解説】
Swift 3.0で for ループの構文が変わりました。影響はとても大きいですが、記述が簡潔になりました。英断でしたね。個人的にはそのままにして欲しかった・・・

【エラーメッセージ】
C-style for statement has been removed in Swift 3
【修正前】
for var xi = 1; xi <= xNum; xi += 1 {
【修正後】
for xi in 1 … xNum { // 3.1
【解説】
同じ

【エラーメッセージ】
C-style for statement has been removed in Swift 3
【修正前】
for var yi = 1; yi <= yNum; yi += 1 {
【修正後】
for yi in 1 … yNum { // 3.1
【解説】
同じ

【エラーメッセージ】
C-style for statement has been removed in Swift 3
【修正前】
for var i = 0; i < gs.m_touches.count; i++ {
【修正後】
for i in 0 ..< gs.m_touches.count {
【解説】
“以下”の場合は … で、”未満”の場合は ..< です。 【エラーメッセージ】
C-style for statement has been removed in Swift 3
【修正前】
for var xi = gs.m_glass.enable() ? 8 – gs.m_glass.xV % 8 : 0; xi <= xNum; xi += 8 {
【修正後】
for xi in stride(from: (gs.m_glass.enable() ? 8 – gs.m_glass.xV % 8 : 0), through: xNum, by: 8) { // 3.1
【解説】
飛び石パターンです。throughが”以下”、toが”未満”です。このパターンはもう1箇所ありました。

【エラーメッセージ】
C-style for statement has been removed in Swift 3
【修正前】
for var x:CGFloat = (bPlusX ? start.x + unitX : start.x – unitX);
(bPlusX ? x < end.x : end.x < x);
x += (bPlusX ? unitX : -unitX) {
// 処理
}
【修正後】
if (bPlusX) {
for x : CGFloat in stride(from: start.x + unitX, to: end.x, by: unitX) {
// 処理
}
} else {
for x : CGFloat in stride(from: end.x, to: start.x – unitX, by: unitX).reversed() {
// 処理
}
}
【解説】
時間かかりました・・・
事前に条件分岐して2つのforループに分けるしかない・・・よね?全体として記述が長くなってしまったパターンです。複雑なforループは書くべきじゃないということか・・・このパターンはもう1箇所ありました。

【エラーメッセージ】
Use of unresolved identifier ‘countElements’
【修正前】
countElements(target)
【修正後】
target.characters.count
【解説】
変数targetはString型です。文字の長さ取得だけで、結構手間ががかります。charactersは、見た目の文字数を取得します。

【エラーメッセージ】
‘Default’ has been renamed to ‘default’
【修正前】
UIAlertActionStyle.Default
【修正後】
UIAlertActionStyle.default
【解説】
Defaultの先頭大文字が小文字に変わっただけ。合計3箇所ありました。

【エラーメッセージ】
Cannot convert value of type ‘String’ to expected argument type ‘UnsafeMutableRawPointer’
【修正前】
if let path = Bundle.main.path(forResource: file as String, ofType: “sks”) {
var sceneData = Data(bytesNoCopy: path, count: .DataReadingMappedIfSafe, deallocator: nil)!
【修正後】
if let path = Bundle.main.path(forResource: file as String, ofType: “sks”) {
let pathURL : URL = URL(fileURLWithPath: path)
var sceneData : Data
do {
sceneData = try Data(contentsOf: pathURL, options: .mappedIfSafe)
} catch {
print(“unarchiveFromFile error.”)
}
【解説】
結構変わるなあ・・・

【エラーメッセージ】
‘init(forReadingWithData:)’ has been renamed to ‘init(forReadingWith:)’
【修正前】
var archiver = NSKeyedUnarchiver(forReadingWithData: sceneData)
【修正後】
var archiver = NSKeyedUnarchiver(forReadingWith: sceneData)
【解説】
ラベル名が変わっただけ。

【エラーメッセージ】
‘Any?’ is not convertible to ‘GameScene’; did you mean to use ‘as!’ to force downcast?
【修正前】
let scene = archiver.decodeObjectForKey(NSKeyedArchiveRootObjectKey) as GameScene
【修正後】
let scene = archiver.decodeObject(forKey: NSKeyedArchiveRootObjectKey) as! GameScene
【解説】
ダウンキャストは必ず成功する想定なので、as! で強制的にキャストして対処します、が、いつからこのエラー出るようになったんですかね?

【エラーメッセージ】
Argument labels ‘(data:)’ do not match any available overloads
【修正前】
var data: Data = Data(data:UIImagePNGRepresentation(image))
【修正後】
var data: Data = UIImagePNGRepresentation(image)!
【解説】
UIImagePNGRepresentationから直接Dataを取得可能になったようです。いつ頃変わったんだろう・・・

・・・続く

大手には作れないアプリを(気持ちだけは(๑•̀ㅂ•́)و✧)