uka.apple のすべての投稿

3日坊主アプリ開発 204日目


    ∩∩
   (´・ω・)
   _| ⊃/(___
 / └-(____/
  ̄ ̄ ̄ ̄ ̄ ̄ ̄

  • 本日の作業

サーバ側のSSL処理を見直す。

 

iOSのセキュリティ要件が高くてなかなかサーバに接続できていませんでしたが、今日やっとiOSアプリ内から自分のサーバーに接続できました!!

tomcatとnginxのSSL接続について、以下を確認しました。

・TLS1.2をサポートしていることを確認しました。
・暗号化スイートについて、appleの要求するリスト中の TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 を使えることを確認しました。
・利用されるサーバ証明書はSHA256以上のハッシュアルゴリズムによって署名されており、2048ビット以上のRSA 鍵が使われていることを確認しました。

ただし、自己証明書を使っているため、上記要件を満たしても接続できず、結局Info.plisに以下の記述を加えて回避しました。

<key>NSAppTransportSecurity</key>
<dict>
<key>NSExceptionDomains</key>
<dict>
<key>minnano.app</key>
<dict>
<key>NSExceptionAllowsInsecureHTTPLoads</key>
<true/>
</dict>
</dict>
</dict>

http通信も可能な設定なのですが、実際にはhttpsで通信します。

アプリがリジェクト食らうようなら、SSL証明書を買う予定です。

  • 明日の予定

iOSアプリからサーブレットにアクセスする際、どちらが単位時間当たりの処理数が多いか確認する。

1.tomcatのサーブレットにアクセスする。
2.nginx経由でtomcatのサーブレットにアクセスする。

3日坊主アプリ開発 203日目


    ∩∩
   (´・ω・)
   _| ⊃/(___
 / └-(____/
  ̄ ̄ ̄ ̄ ̄ ̄ ̄

  • 今回の作業

iOSアプリからサーブレットにアクセスする際、以下3パターンでどれが一番、単位時間当たりの処理数が多いか確認する。

1.httpでtomcatのサーブレットにアクセスする。
2.httpsでtomcatのサーブレットにアクセスする。
3.httpsでnginx経由でサーブレットにアクセスする。

ええと、今日は上記3パターンの通信を実装しようとしたのですが、iOS9では、デフォルトでhttp通信は出来ないようです。なので1は除外します。また。SSL通信についても、要件が厳格で、サーバ側の処理を見直さないと通信できないようです。

・・・

・・

  • 明日の予定

サーバ側のSSL処理を見直す。

3日坊主アプリ開発 186〜202日目


    ∩∩
   (´・ω・)
   _| ⊃/(___
 / └-(____/
  ̄ ̄ ̄ ̄ ̄ ̄ ̄

  • 今回の作業

対人戦のためのサーバ側処理実装準備
・・・

・・

サボってごめんなさい。日記も作業も。

これからは毎日ちょっとずつでも、殴り書きでも、作業内容を報告します。

作業しなかった日は正直に何もしてませんって報告します・・・

当初、100日あれば余裕でアプリリリースできると思ってたら、もう200日超えちゃった・・・

( ゚∀゚)

・・・

・・

気をとりなおして。

ここ2週間ほどは、対人戦のためのサーバ側処理の準備ということで、CentOSに色んなものをセットアップしました。

以下箇条書きします。

▪️Java入れました。

# yum install java-1.8.0-openjdk
# yum install java-1.8.0-openjdk-devel

▪️Tomcat入れました。

# wget http://ftp.kddilabs.jp/infosystems/apache/tomcat/tomcat-8/v8.0.36/bin/apache-tomcat-8.0.36.tar.gz
# tar -xvzf apache-tomcat-8.0.36.tar.gz
# mkdir /opt/tomcat
# mv apache-tomcat-8.0.36 /opt/tomcat

# vi /etc/profile
JRE_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.91-1.b14.el6.x86_64/jre
CATALINA_HOME=/opt/tomcat/apache-tomcat-8.0.36
export JRE_HOME CATALINA_HOME

・・・

SSLの設定や管理画面のIP接続制限設定なども行いました。デフォルトポート8080を変更したりもしました。ちゃんとtomcat起動専用ユーザ作って、tomcatを起動するようにしました。

単純なサーブレット作って動作確認しました。

package servlet;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
* テストサーブレットクラス
*/
@WebServlet(description = “サーブレット テスト”, urlPatterns = { “/Login” })
public class Login extends HttpServlet {

/**
* GETリクエスト処理
*/
protected void doGet(
HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// レスポンスヘッダの設定
response.setContentType(“text/html; charset=UTF-8”);
// リクエストパラメタの取得
String name = request.getParameter(“name”);
// ページの描画
PrintWriter writer = response.getWriter();
writer.println(“<html>”);
writer.println(” <head>”);
writer.println(” <title>Login</title>”);
writer.println(” </head>”);
writer.println(” <body>”);
writer.println(” <p>” + name + “</p>”);
writer.println(” </body>”);
writer.println(“</html>”);
}
}

 

# javac -classpath /opt/tomcat/apache-tomcat-8.0.36/lib/servlet-api.jar Login.java

コンパイルしてtomatのwebappsの下のWEB-INFの下のclassesの下にservletフォルダ作ってclassコピーして動作することを確認しました。

WEB-INFフォルダにはweb.xmlファイルを作成して設置しました。

# vi web.xml
<?xml version=”1.0″ encoding=”UTF-8″ ?>
<web-app xmlns:xsi=”http://www.w3c.org/2001/XMLSchema-instance”>
<display-name>Catama</display-name>
</web-app>

▪️nginx入れました。

# touch /etc/yum.repos.d/nginx.repo
# vi /etc/yum.repos.d/nginx.repo

[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=0
enabled=1

# yum install nginx

nginxでもSSLの設定をしました。nginx経由でtomcat上のサーブレットを見に行くように設定しました。

また、wiresharkを使って、httpsアクセスによってリクエストパラメタの内容等がちゃんとわからないことを確認しました。

  • 明日の予定

iOSアプリからサーブレットにアクセスする際、以下3パターンでどれが一番、単位時間当たりの処理数が多いか確認しようと思います。

1.httpでtomcatのサーブレットにアクセスする。
2.httpsでtomcatのサーブレットにアクセスする。
3.httpsでnginx経由でサーブレットにアクセスする。

3日坊主アプリ開発 165〜185日目


    ∩∩
   (´・ω・)
   _| ⊃/(___
 / └-(____/
  ̄ ̄ ̄ ̄ ̄ ̄ ̄

3日坊主で終わらないために始めた3日坊主アプリ開発日記ですが、3日を大きく上回り、なんと164日続きました。

自分としては大記録です。
短い間でしたがみなさんありがとうございました。

・・・

・・

いやごめんなさい終わらないです。

ちょっと20日ほど、アプリで稼いだお金を使って別世界に行ってました。

アプリで稼いだお金は臨時収入なので、完全に自由に、勝手に好きなことに何にでも使えるのでとても嬉しいです。

もう稼いだ分、全部使い切っちゃったけど。

今日からまた開発頑張ります・・・

 

今日は対人戦用のテーブルが足りないことに気づいたので追加していました。
また、クライアントからサーバにアクセスする際のインターフェイスを考えていました。

別に仕事じゃないので、ちゃんと設計しないで行き当たりバッタリ実装の方が面白くて良いかな。

自分が楽しいことが続くコツだと思います。

・テーブル

[支配者テーブル]

内容:

争って勝ち取る15ステージの支配者情報を保持する。

カラム:

ステージID,ユーザID,連勝回数,勝利者コメント

・サーバアクセス

[支配者情報取得]

対戦ステージ選択画面用に、対戦ステージの支配者情報を取得する。

[対戦相手情報取得]

対戦ステージを選択後、対戦相手のロジック情報などを取得する。

[対戦結果送信]

対戦後、勝敗結果をサーバに送信する。

・・・だめだ、なんかER図とか書きたくなってきた。

  • 明日の予定

対人戦の実装 サーバ処理

3日坊主アプリ開発 164日目 DB設計


    ∩∩
   (´・ω・)
   _| ⊃/(___
 / └-(____/
  ̄ ̄ ̄ ̄ ̄ ̄ ̄

  • 今回の作業

対人戦の実装 17時間目(全20時間)
 

対人サーバのDBには、用意される15の対人ステージでの対戦内容や勝敗結果を格納します。また、対戦した結果、奪い合ったアイテム(ロジックパネル)の記録も保存し、万一不正をしたユーザがいたら、そのユーザを検知出来るようにします。

いくつかのテーブルを作ります。
それぞれのテーブルの内容とカラムは以下のようにします。

[対戦履歴テーブル]

内容:

対戦した内容を保持。後から対戦内容を再生できる。

カラム:

ステージID,対戦日時,1PのID,2PのID,1Pのレベル,2Pのレベル,1Pロジックデータ,2Pロジックデータ,勝敗結果,1P取得ロジックパネル,2P取得ロジックパネル

[ユーザテーブル]

内容:

ユーザが対戦した結果、今まで取得したすべてのロジックパネルを記録する。不正対策に利用する。

カラム:

プレーヤーID,識別ID,名前,パスワード,コメント,累積取得ロジックパネル

※パスワードは端末移動に利用

[ご褒美テーブル]

内容:

対戦で連勝したなど、特定の条件でプレゼントした履歴。

カラム:

プレーヤーID,取得条件,達成状況,取得ロジックパネル

 

これで大丈夫かな・・・

  • 明日の予定

対人戦の実装 18時間目(全20時間)

3日坊主アプリ開発 162〜163日目 添付メール


    ∩∩
   (´・ω・)
   _| ⊃/(___
 / └-(____/
  ̄ ̄ ̄ ̄ ̄ ̄ ̄

  • 今回の作業

対人戦の実装 15~16時間目(全20時間)
 

今回は、メールにファイルを添付するコマンドを調べました。

サーバはCentOS6です。

以下、忘備録です。

メール送信のための準備は済んでいるものとします。

 

uuencodeが必要になるため、予めインストールします。

# yum -y install sharutils

ファイルを添付してメールを送るコマンドは以下の通りです。

# uuencode ./test.png test.png | mail -s “uuencodeで添付するよ” メールアドレス

aオプションでも添付できます。

# echo “本文” | mail -s “こっちはaオプションだよ” -a test.png メールアドレス

これで添付メールが送れました!!

 

次に、メール送信を自動化します。毎日午前3時に、mysqlの特定データベースをダンプしてzip圧縮し、そのzipファイルをメールに添付して自動送信するようにしました。

/var/backup/mysqlディレクトリに一時的なバックアップファイルを置くことにします。
/var/backupディレクトリにメールを送信するスクリプトを作ります。
そしてcronでスクリプトをキックします。

具体的な内容は以下の通りです。

 

まずmysqlの接続情報ファイルを作成します。

# vi /var/backup/my.conf
—– ここから —–
[client]
user = ユーザ
password = パスワード
host = localhost
—– ここまで —–

次にスクリプトです。

# vi /var/backup/backup_mysql.sh
—– ここから —–
#!/bin/sh

# 保存期間
period=90
# 保存場所
dirpath=’/var/backup/mysql’
# ファイル名
filename=`date +%Y%m%d`

# ダンプ実行
# –single-transaction 一貫した状態をダンプ ※InnoDBのみ
mysqldump –defaults-extra-file=/var/backup/my.conf –single-transaction –databases データベース名 > $dirpath/$filename.sql

# 圧縮して元のsqlファイルを削除
zip -P パスワード $dirpath/$filename.zip $dirpath/$filename.sql
rm -f $dirpath/$filename.sql

chmod 700 $dirpath/$filename.zip

# 添付してメール送信
uuencode $dirpath/$filename.zip $filename.zip | mail -s “db backup” メールアドレス

# 保存期間を超えたら削除
oldfile=`date –date “$period days ago” +%Y%m%d`
rm -f $dirpath/$oldfile.zip
—– ここまで —–

一応、サーバ内に90日間保存しておくことにしました。90日を超えたファイルは逐次削除されますので、バックアップファイルが増加し続けることはありません。

最後に、毎日午前3時にこのスクリプトをキックして完了です。

# crontab -e
—– ここから —–
0 3 * * * /var/backup/backup_mysql.sh
—– ここまで —–

 

これで対人サーバがこの世から消し飛んでもバックアップデータがあるので安心です。

最悪1日巻き戻りますけど・・・

え?今回の作業は対人戦の実装じゃないのかって?

今回は対人戦を行うにあたって、各ユーザーのデータを格納するためのデータベースのバックアップ処理となります。

下準備の下準備みたいな感じです。
次からデータベース設計になります。

残り4時間しかない・・・

  • 明日の予定

対人戦の実装 17時間目(全20時間)

3日坊主アプリ開発 160〜161日目 アンインストール


    ∩∩
   (´・ω・)
   _| ⊃/(___
 / └-(____/
  ̄ ̄ ̄ ̄ ̄ ̄ ̄

  • 今回の作業

対人戦の実装 13~14時間目(全20時間)
 

星のドラゴンクエストをアンインストールしました”記録”は3日でした。

え?アプリ開発日記じゃないのかって?

明日から頑張ります・・・

  • 明日の予定

対人戦の実装 15時間目(全20時間)

3日坊主アプリ開発 159日目 ガチャ45万円


    ∩∩
   (´・ω・)
   _| ⊃/(___
 / └-(____/
  ̄ ̄ ̄ ̄ ̄ ̄ ̄

  • 今回の作業

対人戦の実装 11~12時間目(全20時間)
 

昨日と今日は、アプリの”勉強”のため、星のドラゴンクエストをやってました。30周年ガチャということで、ロト装備が出るみたいでした。

初めに無料でもらえる”ジェム”が10000個くらいあったので、それでガチャをやってみました。

30回くらいガチャを回して、ロトのつるぎ、ロトのかぶと、ロトの盾が出ました。幸運なほうだと思います。しかしなんとも中途半端です。是非とも残りのロトのよろい(上/下)が欲しくなりました。

うまくできてるなぁ。

ガチャを1度引くのに300円かかります。

冷静に、いくら使えば残り2つのロト装備が出るのか計算して見ます。もちろん確率ですので、いくら使っても確実にそろう保証はありません。ここではあくまで期待値として、”平均”いくら使えば揃うのかという観点で計算します。

パチンコを知らない方には申し訳ないですが、パチンコが確率内で(確率の分母数を回して)当たる割合は約63%となります。この確率分”回し”、63%の割合で当たる金額をまずは算出したいと思います。

※ジェムを大量に買うと多少値引きされますが、ここでは無視します。

さて、最近のガチャはご丁寧に出現割合が書かれています。
ほしいアイテムはロト装備の残りで

ロトのよろい上 0.5%
ロトのよろい下 0.5%

の2つです。

2個のアイテムを取る過程を2段階で考えます。

1段階目

まず、ロトのよろい上か下、どちらかが出る割合は合計1%ですので、100回=30000円分ガチャをすれば平均1回どちらかが出ます。

2段階目

次に、上下の出なかったほうのロトのよろいが出る割合は0.5%ですので、200回=60000円分ガチャをすれば平均1回出ます。

簡単な計算ですね。というわけで、期待値は3万円+6万円=9万円となりました。

私と同様な状況の人が9万円使えば、100人に63人は装備が揃います!

9万円は約63%で揃う金額となりますが、ほぼ(99%以上)揃うだろうという金額を知りたいところですね。知りたいですよね?え?知りたくない?知りたいということにしといて下さい。

パチンコ経験者限定の話で申し訳ないですが、パチンコで確率の5倍以上のはまりって意外と無いことが経験的にお分かりかと思います。確率の5倍回して当たらない割合は0.7%位となり、99.3%は当たります。

算出した額の5倍の45万円も使えばのこり2こが出てほぼほぼ揃うと思います。

同様の状況の人がいて、実際に課金しても揃う保証はしませんが。0.7% ≒ 142人に1人 は揃いませんからね。

45万円か。安いなあ。ガチャろうかなぁ(棒読み)。

  • 明日の予定

対人戦の実装 13時間目(全20時間)

3日坊主アプリ開発 157日目 バックアップ


    ∩∩
   (´・ω・)
   _| ⊃/(___
 / └-(____/
  ̄ ̄ ̄ ̄ ̄ ̄ ̄

  • 今回の作業

対人戦の実装 10時間目(全20時間)
 

対人戦を行うにあたって、サーバ内に勝敗記録や各ユーザの組んだロジックをDBに保存します。

このDBのバックアップのため、サーバで定期的にDBの内容をファイルに落とし、外部サーバにメールで自動送信します。

本日はまず下準備として、外部サーバにメールを送れるようにしました。gmailを利用します。

サーバはCentOS6です。

以下、忘備録のための記述です。postfixを使ってメールを送信します。

vi /etc/postfix/main.cf

記述を追加

relayhost = [smtp.gmail.com]:587
smtp_use_tls = yes
smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
smtp_sasl_tls_security_options = noanonymous
smtp_tls_CApath = /etc/pki/tls/certs/ca-bundle.crt

vi /etc/hosts
::1 の行を # でコメントアウト ※後続のpostmapのコマンドでエラーとなるため

echo [smtp.gmail.com]:587 メールアドレス:パスワード > /etc/postfix/sasl_passwd
chmod 600 /etc/postfix/sasl_passwd
postmap /etc/postfix/sasl_passwd

service postfix restart

送信テスト

echo メール送るよ | mail メールアドレス

  • 明日の予定

対人戦の実装 11時間目(全20時間)

3日坊主アプリ開発 156日目 対人ステージの完成


    ∩∩
   (´・ω・)
   _| ⊃/(___
 / └-(____/
  ̄ ̄ ̄ ̄ ̄ ̄ ̄

  • 今回の作業

対人戦の実装 4〜9時間目(全20時間)
 

サーバ側の処理はひとまず置いておいて、対人戦用のステージマップが完成しました。

全部で5タイプ作成し、各タイプ毎に3つの枠を用意しました。計15ステージの支配権を全ユーザで競い合うことになります。

対戦相手に勝てば、対戦相手が使っていたロジックパネルをランダムで1つ奪うことができます。負ければ盗られます。同時に、経験値も奪ったり奪われたりします。勝つとステージの支配者になり、今度は挑戦を受ける側となります。

勝利条件は、ゴールにたどり着くことです。ただし、ステージによっては、実質的に相手を倒さないとゴールにたどり着けないようになっています。99秒たっても勝負がつかない時はドローとなります。

支配したステージの防衛数や、支配したステージ数に応じて、特別なロジックパネルをプレゼントする可能性があります。

敵と味方を区別するために、色違いのキャラも作成しました。

Simulator Screen Shot 2016.05.29 12.40.17

  • 明日の予定

対人戦の実装 10時間目(全20時間)