CTF環境 for Mac

virturalbox

Oracle VM VirtualBox

vagrant

https://www.vagrantup.com

vagrant box add ubuntu/trusty64
cd
mkdir ubuntu
cd ubuntu
vagrant init ubuntu/trusty64
vagrant up
vagrant ssh
sudo su
dpkg --add-architecture i386
apt-get update
apt-get install libc6:i386 libncurses5:i386 libstdc++6:i386
apt-get install gcc-multilib g++-multilib
apt-get install binutils

共有フォルダ

cd
cd ubuntu
mkdir shared
vi Vagrantfile
vagrant reload

Vagrant file

config.vm.synced_folder "./shared", "/home/vagrant/shared", owner: "vagrant", group: "vagrant"

android studioバージョンアップ

アプリ更新前に以下の数字をあげる。

  • 対象ファイル build.grade
android {
  defaultConfig {
  versionCode 7
     versionName "1.0.7"
  }
}

versionCodeは必須
versionNameは必須ではないがアプリストアでアプリのバージョン表記で参照してる

Ruby on Rails 覚書き

  • config/routes.rbでルーティングを設定してもpublicのindex.htmlがある場合優先される。つまり削除かリネームしておく必要がある。
  • routes.rb設定例
Rails.application.routes.draw do
  get '/aaa', to: 'hogehoges#aaa'
end
  • アクションは特に指定のない限りにおいてメソッド内に記載された処理実行後の最後にapp/views/controller名/アクション名.html.erbを呼び出してユーザーに返す
  • データの受け渡しには「@」を使う
    • コントローラ側 : @hensu='あいうえお';
    • ビュー側 : <%= @hensu %>
  • モデルの全検索
    • コントローラ側 @records = Hogehoge.all
    • ビュー側

<% @records.each do |data| %>
名前:<%= data.name %><% end %>

Ruby on Rails(mac)

Ruby on Railsの最も簡単なサンプル

1.インストール
brew update
brew install ruby
sudo gem install rails

※Homebrewはインストール済みとする

2.アプリケーション作成
rails new first-app
3.コントローラ、ビュー、モデル作成
cd first-app
rails generate scaffold hogehoge user_id:integer name:string

※scaffold指定でコントローラ、ビュー、モデル全部作成

4.マイグレーション
rails db:migrate

マイグレーションマイグレーションファイルをもとにテーブルを作成する。
マイグレーションファイルはモデルを作成したときにfist-app/db/migrate/につくられる

5.テストデータを作成する

seeds.rbを編集

cd ~/first-app/db
vi seeds.rb

(1)テストデータを書き込む

Hogehoge.create(user_id: 1, name: 'あいうえお')
Hogehoge.create(user_id: 2, name: 'かきくけこ')

※先頭は大文字

(2)テストデータをつくる

rails db:seed

(3)以下の要領でDBを確認できる

rails dbconsole
.schema hogehoges
select * from hogehoges;

※最後に「s」がつく

6.サーバ起動
rails s

Cocos2d-x環境構築(Mac)

1.iOSアプリ

(1)XCodeのインストール

  • FinderのアプリケーションからAppStoreを選択
  • Xcodeで検索
  • 「インストール」押下

(2)cocosのインストール
http://www.cocos2d-x.org

  • 「DOWNLOAD」押下
  • ダウンロード後適当な場所に配置(今回はホームディレクトリ配下にcocos2d-x-3.14.1を配置した)

(3)setup.pyを実行
terminalで先に配置したディレクトリに移動し以下のコマンドを実行

cd ~/cocos2d-x-3.14.1
python setup.py

※途中の質問はEnter押下でスキップ(iOSアプリのみの開発であれば不要なため)

(4)環境設定ファイルの読み込み

cd
source .bash_profile

(5)cocosプロジェクト作成
cocos new コマンドを実行し、プロジェクトを作成する。

cocos new TestProject -p com.TestDomain.TestProject -l cpp -d ~/CocosProjects

・new のあとには任意のプロジェクト名を指定
・-p のあとにはパッケージ名を指定
・-l は言語名を指定。cppだとC++
・-d はプロジェクトを格納するディレクトリを指定

(6)XCodeでプロジェクトファイルをオープンして開発スタート
TestProject/proj.ios_mac/TestProject.xcodeproj
f:id:stzx:20170129223010p:plain

2.Androidアプリ

(1)Pythonのバージョン確認

python --version

※2系であること。もし違う場合は以下からインストール
https://www.python.org/downloads/

(2)jdkインストール
以下からJDKをダウンロードしインストールする
http://www.oracle.com/technetwork/java/javase/downloads/index.html

(3)Antインストール
以下からAntをダウンロードし適当なディレクトリに配置(今回はホームディレクトリ配下にapache-ant-1.10.0を配置した)
http://ant.apache.org/bindownload.cgi

(4)Homebrew
terminalを開き以下のコマンドを実行

/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

※Homebrewでインストールしたものは/usr/local/Cellar/以下にインストールされる。

(5)android-sdkインストール

brew install android-sdk

(7)SDK Managerを起動。Platform-toolsとBuild-toolsをインストール

android

Android SDK Platform-tools、Android SDK Build-toolsにチェックが入っていることを確認してインストール
f:id:stzx:20170129222441p:plain

(8)android-ndkインストール

brew install android-ndk

(9)setup.pyを実行
terminalで先に配置したディレクトリに移動し以下のコマンドを実行

cd ~/cocos2d-x-3.14.1
python setup.py

※ANT_ROOTのパスをきかれるので(3)で配置したパスを入力

(10)環境設定ファイルの読み込み

cd
source .bash_profile

(11)1.iOSアプリの(5)にて作成したTestProject ディレクトリに移動。Android実機を接続し、以下のコマンドを実行。

cd ~/CocosProjects/TestProject
cocos run -p android

cocos2d-x(Android Stuido)リリースビルド

まずはキーストアを作成する。
jdkに付属のkeytoolでコマンドラインから作成。

keytool -genkey -v -keystore c:\work\keystore -alias mykeystore -validity 10000
  • keystoreは任意の場所と名前を指定
  • aliasの名称は任意で。
  • validityは10000以上推奨。

いろいろ聞かれるので素直?に入れる。
パスワード等ひととおり入力が終わると確認を求められるので「y」を押す。
つづいて鍵のパスワードを入力が求められる。Enter。


次にプロジェクトフォルダに移動してリリース用のapkファイルを作成。

cocos run -p android --android-studio -m release

keystoreの場所を求められるので先ほど生成したkeystoreを指定する。
さらにkeystore作成時のパスワードを入力。
問題なければプロジェクトのbin/releaseの中にapkファイルが生成される。


実行して確認するのではなくコンパイルするだけなら「run」を「compile」に置き換えて、

cocos compile -p android --android-studio -m release


※キーストアはアップデート時に同じものが必要なので削除しないこと。

cocos2d-x(Android)にAdMobインタースティシャル広告を表示する

SDK Managerより、「Android Support Registory」、「Google Play Services」、「Google Repository」をインストールしておく。

build.gradle
apply plugin: 'com.android.application'

android {
    compileSdkVersion 22
    buildToolsVersion "22.0.1"

    defaultConfig {
        applicationId "xxxx.hoge.co.jp"
        minSdkVersion 10
        targetSdkVersion 22
        versionCode 2
        versionName "1.01"
    }

    sourceSets.main {
        java.srcDir "src"
        res.srcDir "res"
        jniLibs.srcDir "libs"
        manifest.srcFile "AndroidManifest.xml"
        assets.srcDir "assets"
    }

    signingConfigs {

       release {
            if (project.hasProperty("RELEASE_STORE_FILE")) {
                storeFile file(RELEASE_STORE_FILE)
                storePassword RELEASE_STORE_PASSWORD
                keyAlias RELEASE_KEY_ALIAS
                keyPassword RELEASE_KEY_PASSWORD
            }
        }
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            if (project.hasProperty("RELEASE_STORE_FILE")) {
                signingConfig signingConfigs.release
            }
        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile project(':libcocos2dx')
    compile 'com.google.android.gms:play-services-ads:+'
}

task cleanAssets(type: Delete) {
    delete 'assets'
}
task copyAssets(type: Copy) {
    from '../../Resources'
    into 'assets'
}

clean.dependsOn cleanAssets
preBuild.dependsOn copyAssets

compile 'com.google.android.gms:play-services-ads:+'を追加。

AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="s_takahashi.java_conf.gr.jp"
    android:installLocation="auto">

    <uses-feature android:glEsVersion="0x00020000" />
    
    <application
        android:label="@string/app_name"
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher">
        
        <!-- Tell Cocos2dxActivity the name of our .so -->
        <meta-data android:name="android.app.lib_name"
                   android:value="MyGame" />

        <activity
            android:name="org.cocos2dx.cpp.AppActivity"
            android:screenOrientation="landscape"
            android:configChanges="orientation|keyboardHidden|screenSize"
            android:label="@string/app_name"
            android:launchMode="singleTask"
            android:theme="@android:style/Theme.NoTitleBar.Fullscreen" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <!-- ここから追加 -->
        <meta-data android:name="com.google.android.gms.version" android:value="@integer/google_play_services_version" />
        <activity android:name="com.google.android.gms.ads.AdActivity" android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize" android:theme="@android:style/Theme.Translucent" />
        <!-- 追加ここまで -->
    </application>

    <uses-permission android:name="android.permission.INTERNET"/>
    <!-- ここから追加 -->
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
    <!-- 追加ここまで -->

</manifest>

コメントの箇所を追加。

AppActivity.java
package org.cocos2dx.cpp;

import android.content.Context;
import org.cocos2dx.lib.Cocos2dxActivity;
import android.os.Bundle;
import android.util.Log;
import com.google.android.gms.ads.AdListener;
import com.google.android.gms.ads.AdRequest;
import com.google.android.gms.ads.InterstitialAd;

public class AppActivity extends Cocos2dxActivity {

    private static InterstitialAd interstitialAd;
    private static Context context = null;

    private static native void resumeNext();

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        context = this;
        interstitialAd = new InterstitialAd(this);
        interstitialAd.setAdUnitId("ca-app-pub-xxxxxxxxxxxxxxxx/xxxxxxxxxx");
        requestNewInterstitial();
        final Cocos2dxActivity activity = (Cocos2dxActivity) context;
        activity.runOnUiThread(new Runnable() {
            public void run() {
                interstitialAd.setAdListener(new AdListener() {
                    @Override
                    public void onAdClosed() {
                        requestNewInterstitial();
                        resumeNext();
                    }
                });
            }
        });
    }

    private static void requestNewInterstitial() {
        AdRequest interRequest = new AdRequest.Builder().build();
        interstitialAd.loadAd(interRequest);
    }

    public static void launchInterstitial() {
        final Cocos2dxActivity activity = (Cocos2dxActivity) context;
        activity.runOnUiThread(new Runnable() {
            public void run() {
                if (interstitialAd.isLoaded()) {
                    interstitialAd.show();
                } else {
                    requestNewInterstitial();
                    resumeNext();
                }
            }
        });
    }
}
NativeCodeLauncher.h
#ifndef SEVENS_NATIVECODELAUNCHER_H
#define SEVENS_NATIVECODELAUNCHER_H

#include <jni.h>
#include "cocos2d.h"
#include <unistd.h>
#ifndef _Included_org_cocos2dx_cpp_AppActivity
#define _Included_org_cocos2dx_cpp_AppActivity

class NativeCodeLauncher {
public:
  static void launchInterstitial();
};

extern "C" {

JNIEXPORT void JNICALL Java_org_cocos2dx_cpp_AppActivity_resumeNext();

}

#endif

#endif //SEVENS_NATIVECODELAUNCHER_H
NativeCodeLauncher.cpp
#include <jni.h>
#include "platform/android/jni/JniHelper.h"
#include "NativeCodeLauncher.h"
//#include "GameScene.h"

#define CLASS_NAME "org/cocos2dx/cpp/AppActivity"

void NativeCodeLauncher::launchInterstitial() {
    cocos2d::JniMethodInfo t;
    if (cocos2d::JniHelper::getStaticMethodInfo(t, CLASS_NAME, "launchInterstitial", "()V")) {
        t.env->CallStaticVoidMethod(t.classID, t.methodID);
        t.env->DeleteLocalRef(t.classID);
    }
}

void Java_org_cocos2dx_cpp_AppActivity_resumeNext()
{
//    Scene* scene { GameScene::createScene() };
//    Director::getInstance()->replaceScene(scene);
}

都度ロードでは遅すぎるのでアプリ起動時にあらかじめ広告をロードしておく。
呼び出し側(ここではGameSceneクラス)からNativeCodeLauncher::launchInterstitial()を実行するとロードされた広告が表示される。
ロードしてから十分な時間を取っておくこと。上記のソースはロードされていない場合の処理を考慮していないがそもそも起動時に表示するのは規約違反
ユーザーが広告を閉じるとonAdClosed()がコールされるので次回の表示に備えて再び広告をロードした後、次の処理(ここではresumeNext)を呼び出す。
resumeNextではcocosの次の画面に遷移している。

AppActivity.javaはもともとapp\src\org\cocos2dx\cpp\AppActivity.javaにある。onCreateは起動時に実行されるメソッド。
NativeCodeLauncher.hとNativeCodeLauncher.cppはcocos2d-xとjavaの橋渡しをするためにapp/jni配下に新規に作成したクラス。