chevron_left

メインカテゴリーを選択しなおす

cancel
arrow_drop_down
  • 比較演算子

    == 等価!= 不等価> 大きい< 小さい、未満>= 以上<= 以下

  • 分岐

    比較演算子 if文 if文 ブロック if else

  • 演算子の優先順位2

    括弧()の中は優先的に演算が行われる。int a; //変数aを定義int b; //変数bを定義a = 10; //右辺値10を左辺値aへ入れるb = 20; //右辺値10を左辺値bへ入れるa = (a+b)*3; //括弧が優先されるので30+3となる

  • 演算子の優先順位1

    // 加算+、減算-よりも乗算*、除算/の方が優先的に演算されるint a; //変数aを定義int b; //変数bを定義a = 10; //右辺値10を左辺値aへ入れるb = 20; //右辺値20を左辺値bへ入れるa = a+b*3; //乗算が優先されるので10+60となる

  • 四則演算と余り

    // + 加算(優先順位下位)// - 減算(優先順位下位)// * 乗算(優先順位上位)// / 除算(優先順位上位)// % 余り(優先順位上位)int a = 5;int b = 2;a = a + b; //aは7int a = 5;int b = 2;a = a - b; //aは3int a = 5;int b = 2;a = a * b; //aは10int a = 5;int b = 2;a = a / b; //aは2int a = 5;int b = 2;a = a % b; //aは1

  • 文字列と結合2

    // 文字列と数値の演算は、単純に文字として結合される// 数値として計算させたい場合は、優先順にに気を付けなければならないint a; //変数aを定義int b; //変数bを定義a = 10; //右辺値10を左辺値aへ入れるb = 20; //右辺値10を左辺値bへ入れるSystem.out.println("a+b=" + a + b);System.out.println("a+b=" + (a + b));

  • 文字列と結合

    // 文字列と数値の演算を+で行った場合、Javaでは文字列として結合されるint a; //変数aを定義int b; //変数bを定義String c; //変数cを定義a = 10; //右辺値10を左辺値aへ入れるb = 20; //右辺値10を左辺値bへ入れるc = "abcdef"; //右辺値「abcdef」を左辺値cへ入れるSystem.out.println("a=" + a);System.out.println("b=" + b);System.out.println("c=" + c);

  • 変数の扱い2

    int a; //変数aを定義int b; //変数bを定義a = 10; //右辺値10を左辺値aへ入れるb = 20; //右辺値20を左辺値bへ入れるa = a+b; //右辺値10+20を左辺値aへ入れるSystem.out.println(a);System.out.println(b);

  • 変数の扱い

    // 変数とはデータを一時的に記憶しておくための箱である。// 一般的なプログラミング言語は右辺値から左辺値へ値を代入する。// ここではintという整数型(小数は記憶できない)変数を用いて動作の確認を行う。int a; //変数aを定義int b; //変数bを定義a = 10; //右辺値10を左辺値aへ入れるb = 20; //右辺値10を左辺値bへ入れるSystem.out.println(a);System.out.println(b);

  • 変数の型

    基本データ型(プリミティブ)データ型値booleantrue or falsechar16ビットUnicode文字 ¥u0000~¥uFFFFbyte8ビット整数 -128~127short16ビット整数 -32768~32767int32ビット整数 -2147483648~2147483647long64ビット整数 -9223372036854775808~9223372036854775807float32ビット単精度浮動小数点数double64ビット倍精度浮動小数点数プリミティブ型はアクセスが速く、消費メモリが少ない単純なデータの記憶しか出来ない参照データ型(オブジェクト)データ型値Booleantrue or falseChar16ビットUnicode文字 ¥u0000~¥uFFFFByte8ビット整数 -128~127Short16ビット整数 -32768~32767Integer32ビット整数 -2147483648~2147483647Long64ビット整数 -9223372036854775808~9223372036854775807Float32ビット単精度浮動小数点数Double64ビット倍精度浮動小数点数String文字列参照型はアクセスにワンクッション必要で、アドレスなどの付加情報が必要なぶん、消費メモリが多いメソッドなど追加機能を含めることが出来るObjectが基本クラスとなり、データ型の情報などを取得することも出来る

  • スタートアップクラスの作成

    パッケージエクスプローラ → 右クリック → 新規 → クラス名前 任意のクラス名public static void mainにチェックを入れる

  • プロジェクトの作成

    ファイル → 新規 → Javaプロジェクトプロジェクト名 任意のプロジェクト名実行環境JREの使用 JavaSE-1.8

  • デバッグ

    実行したプログラムの動作を一つ一つ確認したり、変数の値などを調べる場合プロジェクト名を右クリック → デバッグ → Javaアプリケーション

  • Eclipseの起動

    以下のプログラムを実行pleiades\eclipse\eclipse.exeようこそタブが出た場合は閉じる

  • Eclipseの展開

    zipファイルを右ドラッグして展開を選ぶ

  • プログラムの実行

    作成したプログラムを実行する場合の操作プロジェクト名を右クリック → 実行 → Javaアプリケーション

  • 日本語版Eclipseのダウンロード

    検索エンジンで「Eclipse 日本語」と検索するか、http://mergedoc.sourceforge.jp/を開く。今回はEclipse4.4から「Java32bitFullEdition」をダウンロードする

  • Javaプログラムを行う上で最低限必要なこと

    ・汎用的なプログラムの知識 どの言語でも共通する、変数、分岐、ループの仕組み・Javaの基本文法 クラスの書き方、変数の定義、if、forなどの文法・処理の細分化と最低単位の見極め 入力されたデータを計算するプログラムを作らなければならない場合に、入力、計算、出力と処理を細分化して、最低単位を見極める・データの把握 処理しなければならない内容に対して、入力されるデータ、それを保存するのに必要なデータ構造、作業に必要なデータ、出力データと一連のデータを把握する・処理のセオリー アルゴリズムをコードに落とし込む場合、どんなプログラムであろうと、処理を行う上での書き方にはそれほど違いはないので、何度も書いて慣れておく・ライブラリやAPIの知識 入出力作業を行う場合に、入力を受け付けたり、出力結果を表示したりするのに必要な機能の把握 必要に応じてリファレンスを参照すればいいだけなので、暗記する必要はなく、絶対に必要なのは処理のセオリーまで

  • Javaの特徴

    ・環境に依存しない JVMと呼ばれるJavaを実行するための仕組みが組み込まれている環境であれば、作成したプログラムをそのまま別の環境に持ち込むことができる ただし、一部どうしても依存してしまう部分もあるため、完全とはいえない・メモリー管理が楽 ガーベージコレクションというリソース資源を自動的に管理する仕組みがあるので、プログラマが必要な資源を厳密に管理する必要がなくなり、開発の負荷が低減できる ただし学習用として考えると、リソース資源の管理を考えずにプログラムを組むようになるので、C/C++などでの開発の必要が生じた場合に移行しにくいという問題が起こる・分散開発しやすい クラスという単位でプログラムのファイルが生成できるので、修正したクラスを即、別のプログラムに読ませて実行することができ、大規模なシステムを構築しやすくなる C/C++だとクラスを一つ修正した後に、すべてのプログラムを束ねて時間をかけてリンク作業を行うか、ダイナミックリンクやCOMといった煩雑な仕組みを利用しなければならない

  • Javaの用途

    実務用途でJavaを用いた開発は、サーブレット、JSP、組み込みJavaが多いJavaアプリケーション Javaによって作られる一般的はアプリケーション 実務用途ではこの形式で用いられることは少ないJavaアプレット ブラウザの中でグラフィカルな表示を行うために利用される 同じような用途でFlashが存在しており、Javaアプレットが用いられることは少なくなっている Flash自体もHTML5によってシェアを縮めているサーブレット WEBサーバ上でJavaプログラムを動かす仕組み 中、大規模なWEBアプリケーションの構築に利用されることが多いJSP サーブレットと同じくWEBサーバ上でJavaプログラムを動かす仕組み 開発者によるJavaのコンパイルの手間を省いて、開発の負荷を軽減するようになっている 通常のJavaとは文法に相違がある組み込みJava 携帯電話や家電製品で使われるJava

  • 言語の種類と用途

    言語はそれぞれに利点と欠点があるので、目的や用途に応じて使い分ける必要があるJava 環境に依存せずプログラムを作成できることから普及している 最近は携帯やAndroid端末、WEBアプリケーションを作るのに使われることが多いJavaScript 主にブラウザ上で動作させる言語、Javaとは名前が似ているだけで別言語であるC/C++ OS、パッケージアプリ、ゲームを作るのに使われることが多い 高速で汎用性が高いが、環境に依存し、厳密に作り込まないとセキュリティホールを生みやすい また、習得が難しいといわれるPHP WEBアプリケーションを作るのに特化した言語で扱いが簡単になっている 小規模なWEBアプリの構築に適しているPerl 汎用的なスクリプト言語で、最近はWEBアプリに利用されることが多い PHPと似ているが、速度ではPHPに勝り、組みやすさでは劣るVB.NET/C# 主にWindows上のGUIアプリやWEBアプリケーションを作るのに利用される

  • 改行なしで出力

    // println 改行あり // print 改行なし public class Test { public static void main(String[] args) { System.out.print("こんにちは世界"); System.out.print("こんにちは世界2"); }}

  • 文字列を扱う

    Main.cpp#include "stdafx.h" extern "C" void sample02(char* buff); int main() { char buff[10]; sample02(buff); printf("%s\n",buff); return 0; } Sample.asm;Windowsで命名規則を使用しない .model flat,c ;コード領域を宣言 .code ;void sample02(char* buff) sample02 PROC buff:DWORD MOV EAX,buff MOV EDX,'A' MOV [EAX],EDX MOV EDX,'B' MOV [EAX+1],EDX MOV EDX,'C' MOV [EAX+2],EDX XOR EDX,EDX MOV [EAX+3],EDX RET sample02 ENDP END アセンブラ側でbuffに"ABC"を書き込むソースだ。[]を使うと対象アドレスへ値を書き込むことが出来る。また、文字列の終端には0が必要となるのでDXレジスタをXORで0にして代入している。

  • サンプルから学ぶアセンブラ

    スタックの動きを学ぶ 名前の装飾も自分でやる 文字列の転送 文字列を扱う

  • 文字列の転送

    Main.cpp#include "stdafx.h" extern "C" void sample03(char* buff); int main() { char buff[10]; sample02(buff); printf("%s\n",buff); return 0; } Sample.asm;Windowsで命名規則を使用しない .model flat,c ;コード領域を宣言 .code ;void sample03(char* buff) sample03 proc buff:DWORD PUSH ESI MOV EAX,buff XOR ESI,ESI @@: MOV DL,[DATA+ESI] MOV [EAX+ESI],DL INC ESI AND DL,DL JNZ @B POP ESI RET DATA BYTE 'ABC',0 sample03 endp END データとして文字列を定義し、終端コードの0を転送するまで処理を繰り返す。ちなみにAND DL,DLという一見無意味な処理をしているのは、フラグレジスタに0フラグをセットするためだ。JNZはフラグレジスタのゼロフラグが立っていなかった場合にジャンプする。つまり終端コードを発見するまで繰り返すループが作れるのだ。また@@は汎用ラベルとなっており、「@B」で一つ前の@@へバックし、「@F」で一つ後の@@へとぶ。いちいちラベルの名前を考えるのが面倒なときに重宝する。

  • 名前の装飾も自分でやる

    Main.cpp#include "stdafx.h" extern "C" int sample01C(int,int); int main() { int a = sample01C(10,20); printf("%d\n",a); return 0; } Sample.asm;Windowsで命名規則を使用しない .model flat ;コード領域を宣言 .code ;int sample01C(int a,int b)を宣言し引数を自動生成しない PUBLIC _sample01C _sample01C: PUSH EBP MOV EBP,ESP MOV EAX,[ESP+8] ;a ADD EAX,[ESP+12] ;b POP EBP RET END .modelでCを指定しなかった場合、各関数名には自分で先頭に「_」を入れる必要がある。これはMicrosoftのCコンパイラの仕様であり、MS-DOS時代からの伝統である。またPROCキーワードを使用せずにラベルという形で関数名を定義すると、PUBLICキーワードで外部から呼び出される関数だと言うことを知らせなければならない。

  • Javaの概要

    言語の種類と用途 Javaの用途 Javaの特徴 Javaプログラムを行う上で最低限必要なこと

  • スタックの動きを学ぶ

    今回はMASMの便利機能を使わず、スタックレジスタを操作して値を取得している。最初のサンプルではPROCの後ろに引数を指定しており、このあたりの処理を自動化していた。Main.cpp #include "stdafx.h" extern "C" int sample01B(int a,int b); int main() { int a = sample01B(10,20); printf("%d\n",a); return 0; } Sample.asm ;WindowsでC言語の命名規則を適用 .model flat, c ;コード領域を宣言 .code ;int sample01B(int a,int b)を宣言し引数を自動生成しない sample01B PROC PUSH EBP MOV EBP,ESP MOV EAX,[EBP+8] ;a ADD EAX,[EBP+12] ;b POP EBP RET sample01B ENDP END このプログラムのPUSH EBP実行後のスタックの状態は以下のようになっている [EBP+00] EBPを保存した値 [EBP+04] リターンアドレス [EBP+08] aの値 [EBP+12] bの値 このスタック構造はC言語側から関数を呼び出す時点で作成が始まる int sample01B(int a,int b); 1 引数bをPUSH 2 引数aをPUSH 3 リターンアドレスをPUSH 4 関数へ飛ぶ VisualCの標準関数は後ろから前に向かって積まれるが、Win32APIなどは前から後ろに積まれる。今回は標準関数と同じ方式を使っている アセンブラ側で引数を取り出すときは、PUSH命令によってESPの値が変化するので、スタック内の値の取り出しに直接使うのは適切ではない。そのため一定範囲のスタックの値を取り出したいときはESPの値をEBPに代入し、以降はEBPからスタックのアドレスを指定する

  • 領域

    種類 内容 コード 命令を格納する領域(書き込み不可、データも格納可能だが読み込み専用) データ 静的なデータを格納する領域(読み書き可能、命令は格納不可) スタック 一時変数や関数呼び出し時のリターンアドレス、レジスタの値の待避など ヒープ OSが動的に割り当ててくる領域 コード領域はOSによって書き込みが制限されている。MS-DOS時代は自己改変しながら動く芸術的なコードを書くことも出来たのだが、残念ながら現代ではそんなコードはとんでもないとされる。そんな過去の時代にはコード領域に入り込む、狭義の意味での本当のコンピュータウイルスというのが存在した。今ウイルスと呼ばれているのはマルウエアの何かであり、ウイルス以外の別物である

  • 汎用レジスタの分解

    _____________ EAX 32bit AX 16bit AH AL 8bit×2汎用レジスタは16bitや8bitの演算を行うために分解して使用できる。

  • レジスタの種類

    種類 名前 汎用 EAX EBX ECX EDX インデックス ESI EDI スタック ESP EBP フラグ 直接扱わない 実行場所 EIP 汎用とインデックス用のレジスタは一部命令で専用の役割を担うものがあるが、演算で必要であれば好きなように使ってかまわない。ただしEAX,ECX,EDX以外はプロシージャから戻る前に、元の値を復元する必要がある。やらなかった場合は、呼び出し元に戻った後に誤作動する可能性がある。

  • レジスタ(32bitの場合)と型

    ここではアセンブラを扱う前の前提知識、レジスタとデータ型に関して確認する。レジスタの種類 汎用レジスタの分解 データ型

  • C言語(C++)側のソースを作成

    Main.cpp#include "stdafx.h" extern "C" int sample01(int,int); int main() { int a = sample01(10,20); printf("%d\n",a); return 0; } C言語は外部の関数を呼び出すのにプロトタイプ宣言が必要となる。またexternでCの規則を使うことを宣言しないとデフォルトでC++の規則が適用されてしまい面倒なことになる。 最終的に出力結果が30となれば正解だが、この時点で実行するとエラーになるはずだ。何故ならアセンブラのソースがアセンブルされていないからだ。

  • 実行結果

    30

  • アセンブラのソースを作成

    Sample.asmというファイルをプロジェクトに追加する。新しい項目の追加から拡張子付きでファイル名を指定すれば、ダイアログ上のファイルの種類が別のものになっていても大丈夫だ。ビルドの設定は後ほど行う。Sample.asm;WindowsでC言語の命名規則を適用 .model flat, c ;コード領域を宣言 .code ;int sample01(int a,int b)を宣言し引数は自動生成 sample01 PROC a:DWORD,b:DWORD MOV EAX,a ADD EAX,b RET sample01 ENDP END .modelで指定しているのはメモリモデルと命名規則&引数のスタック順序の扱いだ。MS-DOS用のプログラムで無ければflatにしておく。そしてC言語から呼び出されるのが前提ならCとするのが無難だ。C言語の関数の命名規則に従いプロシージャの名前が調整され、引数がスタックに積まれる順序が決定される。何のことだか分からない人は装飾名を見て欲しい。今回の内容ではそれほど重要では無いので、スルーでもかまわない。 .codeはプログラムを置くためのコード領域を指す。他に.dataもあるが、そちらはデータ領域用だ。領域に関しての詳細は後述する。 MOVはデータの代入を行う命令で、右から左へ代入される。ADDは加算命令だ。そして一般命令ではオペランドに以下の規則が適用される。○ レジスタとレジスタ○ レジスタとメモリ× メモリとメモリ メモリ上にあるデータ同士を足したい場合、最低限どちらかをレジスタに読み出す必要がある。 戻り値は32bit値の場合、EAXレジスタに格納することによって呼び出し元に返すことが出来る。

  • 早速アセンブラに触れてみよう

    これから行う流れは、C言語からアセンブラを呼び出す形となる。オールアセンブラで作っても良いのだが、初学でそこから入ると混乱が生じるであろうことは想像に容易い。MS-DOS時代ならそれでも良かったのだが、Windowsを相手にすると作業量が増えるのだプロジェクトの作成 アセンブラのソースを作成 C言語(C++)側のソースを作成 アセンブルの設定 実行結果

  • プロジェクトの作成

    Windowsコンソールアプリケーション(Visual C++)を作成する。VisualC++2017ではコンソールアプリを作ると、プリコンパイル済みヘッダを利用するための余計なコードが自動生成されてしまう。余計なお世話ではある。しかし空のプロジェクトを作って、リンカの設定をコンソールアプリに直すのも面倒なので、そのままいくことにする。また、デフォルトで生成されるのが32bitの構成なので、アセンブラもそれにあわせて32bitを前提とする。

  • アセンブルの設定

    ソリューションエクスプローラからSample.asmのプロパティを出す。 構成をすべての構成に変更後、項目の種類でカスタムビルドツール選択し適用を押す。 すると構成プロパティにカスタムビルドツールが追加されるので、そこにアセンブル用のコマンドを設定する。 コマンドライン ml /c /coff /Zi /Fo"$(OutDir)\%(Filename).obj" "%(Identity)" 出力ファイル $(OutDir)\%(Filename).obj ここまでやると、実行結果を確認することが出来る。うれしいことにアセンブラのソースにブレークポイントを設置すると、デバッグ時にきっちりそこで止まってくれる。アセンブルするためのプログラムも標準で入っているのだから、いっそのこと拡張子との関連付けをデフォルトで行って欲しいところだ。

  • アセンブラを使うにはどうしたらいいのか

    統合環境でデバッグまで考えた場合、VisualStudioから扱うのが一番楽だ。VisualStudio2017のダウンロード先 https://visualstudio.microsoft.com/ja/downloads/MASMのドキュメント https://docs.microsoft.com/ja-jp/cpp/assembler/masm/microsoft-macro-assembler-reference?view=vs-2017 VisualStudioは無料のコミュニティ版で十分だ。インストール時は「C++ によるデスクトップ開発」にチェックを入れるべし。これでマクロアセンブラ(MASM)が一緒にインストールされる。実行コマンドはml.exeだ。

  • 日付の扱い

    現在時刻の取得SELECT CURRENT_TIMESTAMPSQLiteは日付をUTC(世界標準時刻)で扱う日本時間が必要な場合は、別途指定が必要となるローカルタイムでの日時の取得SELECT datetime(CURRENT_TIMESTAMP,'localtime')

  • 文字列を表示するプログラム

    // Javaの標準パッケージSystemから標準出力を行う命令を呼び出す // 標準出力は一般的にコンソールと呼ばれる場所に出力されるが、 // 別のアプリケーションなどに送信される場合もある。 public class Test { public static void main(String[] args) { System.out.println("こんにちは世界"); }}

  • データ型と別名

    SQLiteはデータ型の別名を大量に持っている挙げているときりが無いので公式サイトの3.1.1. Affinity Name Examplesを参照してほしい

  • 文字列を表示するプログラム2

    // 出力命令を2つ利用しているので、文字列が二行表示される public class Test { public static void main(String[] args) { System.out.println("こんにちは世界"); System.out.println("こんにちは世界2"); }}

  • 基本的なデータ型

    NULL データが空であることを示す状態INTEGER 整数 REAL 小数TEXT 文字列 BLOB バイナリ SQLiteはテーブル作成時にデータ型を省略できるが、指定した方が効率よく動かすことができる日時専用の型は無いので、無指定か各型で代用する(型ごとに日付の精度が異なる)

  • データの挿入と抽出

    insert into test values(123);select * from testカラムは型が指定されていないので、数値でも文字でも挿入することができる

  • テーブルの作成

    create table test(data)testという名前のテーブルを作っているテーブルにはdataという名前のカラムがあり、カラムの型は指定していない型の指定が省略できるのがSQLiteの特徴である

  • select文の実行

    select * from sqlite_mastersqlite_masterテーブルは、テーブルの一覧が格納されている制御用のテーブルだ初期状態では空になっているので、戻ってくるのはテーブルの構造のみとなる

  • 日付を扱う上での注意事項

    クエリー create table test2(a integer,b real,c text);insert into test2 values(CURRENT_TIMESTAMP,CURRENT_TIMESTAMP,CURRENT_TIMESTAMP);select * from test2実行結果これを見るとintegerやrealは西暦しか記録していないように見えるしかしこれは罠だクエリーselect datetime(a),datetime(b),datetime(c) from test2実行結果実はきっちり記憶されている公式ドキュメントによると、TEXT ISO8601REAL グレゴリオ暦INT UnixTimeで処理されるという記載があるしかし日付関数を利用しないと、なぜか値が取り出せず変な変換がかかるのだ

  • A5:SQL Mk-2からSQLiteの操作方法

    メニューのデータベースからデータベースの追加と削除を選び、SQLiteを選択するこの後の設定はDBファイルを指定する形となるが、ファイル選択用のウインドウは出ないので、自分でパスを入力する必要があるファイル名のみ入れた場合は、A5:SQL Mk-2のフォルダに生成されるSQLiteのDBが作成できたら、忘れてはいけないのがデータベースを選択することだこれを忘れるとクエリーが投げられないデータベース選択後はSQL文を入力し、CTRL+ENTERで実行できる

  • JavaScriptの有効化

    mWebView.getSettings().setJavaScriptEnabled(true);

  • URLをEditTextに表示

    mEditText = (EditText) findViewById(R.id.editText); mWebView.setWebViewClient(new WebViewClient(){ @Override public void onPageStarted(WebView view, String url, Bitmap favicon) { mEditText.setText(url); super.onPageStarted(view, url, favicon); } });

  • URLの直接指定

    //キーイベントを拾う mEditText.setOnKeyListener(this); 以下キーボードイベントメソッド以下キーボードイベントメソッド //エンターキー if(keyCode != KeyEvent.KEYCODE_ENTER) return false; mWebView.loadUrl(mEditText.getText().toString()); //ソフトキーボードを閉じる InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE); imm.hideSoftInputFromWindow(v.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS); return true;

  • 内部ブラウザの指定

    mWebView = (WebView) findViewById(R.id.webView); mWebView.loadUrl("http://www.yahoo.co.jp/");

  • レイアウト

    サーバやプログラミングの技術情報

  • 回転抑制

    センサーの確認のために画面の回転を抑制したい場合は以下の設定を行ってくださいマニフェストのActivityandroid:screenOrientation="portrait" を追加。

  • センサー

    Androidのセンサーは、機種によって対応の有無が違っており注意が必要です。また、使いどころが難しいので、なんだかんだでうまく活用しているアプリが少ないのが現状です。レイアウト MainActivity 回転抑制

  • MainActivity

    SensorEventListenerを実装protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); mTextAC = (TextView)findViewById(R.id.textAC); mTextGR = (TextView)findViewById(R.id.textGR); mTextGY = (TextView)findViewById(R.id.textGY); mTextLI = (TextView)findViewById(R.id.textLI); mTextAM = (TextView)findViewById(R.id.textAM); mTextMA = (TextView)findViewById(R.id.textMA); mTextPR = (TextView)findViewById(R.id.textPR); mTextPRE = (TextView)findViewById(R.id.textPRE); }protected void onResume() { super.onResume(); Sensor s; //加速度センサー s = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); mSensorManager.registerListener(this,s,SensorManager.SENSOR_DELAY_NORMAL); //重力センサー s = mSensorManager.getDefaultSensor(Sensor.TYPE_GRAVITY); mSensorManager.registerListener(this,s,SensorManager.SENSOR_DELAY_NORMA

  • ページの履歴移動

    findViewById(R.id.imageButton).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { mWebView.goBack(); } }); findViewById(R.id.imageButton2).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { mWebView.goForward(); } });

  • WebView

    WebViewを使うとアプリ上に簡単にWebページが表示可能です。Webのフロントエンドのスキルがあるならば、いっそアプリのUIをこれで作ってしまうことも可能です。レイアウト URLの指定 内部ブラウザの指定 ページの履歴移動 URLをEditTextに表示 URLの直接指定 JavaScriptの有効化 戻るボタン

  • 動作に関して

    上記のコードを設定すると、ランタイムパーミッションが必要なものがあった場合、自動的に許可を求めるUIが表示されます。そして全ての権限が揃った後、onResultが呼ばれるようになっています。

  • 戻るボタン

    onBackPressedをオーバーライド//ブラウザの履歴上で戻れるか確認 if(mWebView.canGoBackOrForward(-1)) mWebView.goBack(); //ブラウザで戻る処理 else super.onBackPressed(); //アプリのデフォルト

  • Permission.java

    これをプロジェクトに放り込みますimport android.app.Activity; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.support.v4.app.ActivityCompat; import android.support.v4.content.ContextCompat; import java.util.ArrayList; import java.util.List; public class Permission { public static interface ResultListener{ public void onResult(); } private ResultListener mListener; private Activity mActivity; public void setOnResultListener(ResultListener listener){ mListener = listener; } public boolean requestPermissions(Activity context){ mActivity = context; try { List<String > list = new ArrayList<String>(); PackageManager pm = context.getPackageManager(); PackageInfo info = pm.getPackageInfo(context.getPackageName(),PackageManager.GET_PERMISSIONS); String[] permissions = info.requestedPermissions; for(String permission : permissions) { if (Conte

  • Android6.0以降のランタイムパーミッション対策

    Android6.0以降にはカメラやストレージアクセスなど、実行後にユーザから権限許可を受ける必要があります。Activityのコールバック等があるため、これを記述するのはそれなりに面倒です。 ここでは汎用的に使える権限許可のソースコードを提示します。Permission.java MainActivit.java 動作に関して

  • 実は

    UnityPlayerはFrameLayoutクラスを継承しているただのViewなので、レイアウトの一部に貼り付けたりするのは問題なく可能なのだ。ということでAndroid側のネイティブコンポーネントと共存させるのも特に問題は無い。

  • 戻るボタンを使えるようにする

    初期状態だと戻るボタンが無視されてしまう。このままだとAndroidアプリとしては使いにくいので、Activityのデフォルト動作が行われるようにActivityのコードを変更する。やっていることはバックボタンをUnityPlayerに渡さないようにしているだけだ。 @Override public boolean onKeyUp(int keyCode, KeyEvent event) { if(event.getKeyCode() != KeyEvent.KEYCODE_BACK) return mUnityPlayer.injectEvent(event); return super.onKeyUp(keyCode,event); } @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if(event.getKeyCode() != KeyEvent.KEYCODE_BACK) return mUnityPlayer.injectEvent(event); return super.onKeyDown(keyCode,event); }

  • レイアウトを普通に読み込ませる

    UnityPlayerActivity.javaのonCreateの書き換え @Override protected void onCreate(Bundle savedInstanceState) { requestWindowFeature(Window.FEATURE_NO_TITLE); super.onCreate(savedInstanceState); mUnityPlayer = new UnityPlayer(this); setContentView(R.layout.activity_main); //新しいレイアウトを自分で作る FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); ft.replace(貼り付け先のID,new フラグメントラス名()); ft.addToBackStack(null); ft.commit(); }

  • フラグメントの作成

    Fragmentを作成し、以下のコードを追加R.id.unityはUnityPlayerを貼り付ける場所なので、Fragmentのレイアウトに場所を用意しておくこと貼り付ける対象はFrameLayoutやLinnerLayoutなどで構わない @Override public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); UnityPlayer unityPlayer = ((UnityPlayerActivity)getActivity()).getUnityPlayer(); ViewGroup parent = (ViewGroup)unityPlayer.getParent(); if(parent != null) parent.removeView(unityPlayer); ((FrameLayout)view.findViewById(R.id.unity)).addView(unityPlayer); }

  • タップ処理の追加

    各アイテムのタップ処理は自分で管理する必要があるまずはコールバック用のインタフェイスをAdapterクラスに用意するそしてタップイベントを受け取ったら、それをMainActivity側にルーティングするclass ItemAdapter extends RecyclerView.Adapter implements View.OnClickListener { interface OnItemClickListener { void onItemClick(ItemData item); } //表示用データの保存用 List<ItemData> mItemList; public void setItemList(List<ItemData> itemList){ mItemList = itemList; } //アイテムがタップされた時のイベント処理用 OnItemClickListener mItemClickListener; public void setOnItemClickListener(OnItemClickListener listener){ mItemClickListener = listener; } @NonNull @Override public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) { //レイアウトを読み出す View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.item_layout, viewGroup, false); view.setOnClickListener(this); //アイテムがタップされたイベントを拾う //一般的なやり方だと、下の部分でアイテムレイアウト内の項目のインスタンスを取り出しておくことになるが、 //後から取り出しても大して遅くはならないので、あえて処理しない

  • MainActivityでのRecyclerView初期化処理

    MainActivityは以下のような内容になるこれでリスト表示は完成となるpublic class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //サンプル用データ(ひたすら足し算)を作成 ArrayList<ItemData> itemList = new ArrayList(); for(int i=1,a=0;i<=100;i++) { ItemData item = new ItemData(); item.number = i; item.label = String.format("%d+%d=%d",a,i,a+=i); itemList.add(item); } //アダプターの作成 ItemAdapter adapter = new ItemAdapter(); adapter.setItemList(itemList); //RecyclerViewの処理 RecyclerView recyclerView = findViewById(R.id.recyclerView); //縦方向にアイテムを表示 recyclerView.setLayoutManager(new LinearLayoutManager(this)); //RecyclerViewにアダプターを設定 recyclerView.setAdapter(adapter); } }

  • Itemデータ用クラスとAdapterの作成

    今回は解説用なので全てをMainActivity上に記述する表示するデータを事前に作成するため、ItemDataというデータ用クラスを作るclass ItemData{ public int number; public String label; }class ItemAdapter extends RecyclerView.Adapter { interface OnItemClickListener { void onItemClick(ItemData item); } //表示用データの保存用 List<ItemData> mItemList; public void setItemList(List<ItemData> itemList){ mItemList = itemList; } @NonNull @Override public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) { //レイアウトを読み出す View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.item_layout, viewGroup, false); //一般的なやり方だと、下の部分でアイテムレイアウト内の項目のインスタンスを取り出しておくことになるが、 //後から取り出しても大して遅くはならないので、あえて処理しない return new RecyclerView.ViewHolder(view){}; } @Override public void onBindViewHolder(@NonNull RecyclerView.ViewHolder viewHolder, int i) { //番号に対応したアイテムデータを取り出す ItemData item = mItemList.get(i); viewHolder.itemView.setTag(item);

  • RecyclerViewの配置

    今回はEmptyActivityで作っていくのを前提とするまずはactivity_main.xmlにRecyclerViewを配置するactivity_main.xml<?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <android.support.v7.widget.RecyclerView android:id="@+id/recyclerView" android:layout_width="match_parent" android:layout_height="match_parent" /> </FrameLayout>初期状態でRecyclerViewのモジュールがロードされるようになっていないので、レイアウトエディタのRecyclerViewの後ろに表示されているダウンロードっぽいアイコンをクリックしておく必要がある。するとbuild.gradleに自動的に必要なモジュールが足されるルートレイアウトはFrameLayoutに変更しているRecyclerViewはIDをrecyclerViewとしている

  • 標準出力

    文字列を表示するプログラム 文字列を表示するプログラム2 改行なしで出力 特殊文字で改行 特殊文字の表示

  • スタートアップクラス

    プログラムを開始した直後に呼ばれる、mainメソッドを持つクラスpublic class クラス名 { public static void main(String[] args) { //プログラム内容 }}

  • ショートカットなど

    ・入力補完Ctrl + Space・ソースコードの自動整形Ctrl + Shift + F・コメントアウト/解除Ctrl + /・ソースの自動保存実行/デバッグ → 起動 → 起動時に必須エディターの保管・保存時に自動インポートJava エディター → 保管アクション → インポートの編成

  • スタイルの変更

    style.xmlのパラメータを以下のように書き換える<style name="UnityThemeSelector" parent="Theme.AppCompat.Light">

  • レイアウト

    activity_main.xmlにFragmentを貼り付ける場所を作成する貼り付け用のレイアイとはFrameLayoutやLinnerLayoutで構わない今回はFrameLayoutにfragment_areaというIDを付けているactivity_main.xml<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context=".MainActivity"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal"> <Button android:id="@+id/button1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:text="Button" /> <Button android:id="@+id/button2" android:layout_width="wrap_content" android:layout_height="

  • Fragment

    Fragmentを使えばレイアウトの表示や操作を独立したクラスとして作成することが出来る そのおかげでActivity上に大量にコードを記述する必要がなくなり、複数画面のコードを分散出来るのでコードの見通しがよくなるのだ プロジェクト レイアウト Fragmentの作成 Fragmentのレイアウトの書き換え ソースコード 実行結果

  • プロジェクト

    Fragmentを作るのに使うのはEmptyActivityで構わないそのほかのActivityから作成しても、余計なコードが挟み込まれるだけである

  • 操作動画

    サーバやプログラミングの技術情報

  • 実行結果

    サーバやプログラミングの技術情報

  • タイマーの利用

    Androidではタイマーはサブスレッド扱いとなる そしてサブスレッドを扱う上で特に注意すべきなのは、UIの操作が一切できないことだ サブスレッドからUIがらみの命令を実行すると例外が発生する サブスレッドからUIをいじるためには、いったんメインスレッドに処理を投げて、メインスレッド側でUIの操作を行う 今回はその内容を説明していくレイアウト ソースコード(エラーが発生するケース) ソースコード(エラー回避) 実行結果

  • ソースコード(エラー回避)

    MainActivity.javapackage com.example.android.test03;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.widget.TextView;import java.util.Timer;import java.util.TimerTask;public class MainActivity extends AppCompatActivity { private int mCount; private TextView mTextView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //インスタンスの取得 mTextView = (TextView)findViewById(R.id.textView); //カウントの初期化 mCount = 0; //タイマー処理の作成 TimerTask timerTask = new TimerTask() { @Override public void run() { mCount++; runOnUiThread(new Runnable() { @Override public void run() { //UI関係の処理をサブスレッドで処理するとエラー mTextView.setText(String.valueOf(mCount)); } }); } };

  • ソースコード(エラーが発生するケース)

    MainActivity.javapackage com.example.android.test03;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.widget.TextView;import java.util.Timer;import java.util.TimerTask;public class MainActivity extends AppCompatActivity { private int mCount; private TextView mTextView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //インスタンスの取得 mTextView = (TextView)findViewById(R.id.textView); //カウントの初期化 mCount = 0; //タイマー処理の作成 TimerTask timerTask = new TimerTask() { @Override public void run() { mCount++; //UI関係の処理をサブスレッドで処理するとエラー mTextView.setText(String.valueOf(mCount)); } }; //タイマー開始処理 Timer timer = new Timer(); timer.schedule(timerTask,0,1000); //1000msごとにイベントを発生させる }}TimerTaskのrun内はサブスレッドとして動作するこの中でUIの操作はNGとなる

  • レイアウト

    XML<?xml version="1.0" encoding="utf-8"?><FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <TextView android:id="@+id/textView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:text="Hello World!" /></FrameLayout>今回はトップレベルコンポーネントをFrameLayoutにしたそしてTextViewのandroid:layout_gravityをcenterにして、中央に設定しているこの設定は練習用のためである

  • UnityPlayerActivityからUnityPlayerを取り出せるようにする

    クラス内にpublic UnityPlayer getUnityPlayer(){ return mUnityPlayer; }を追加

  • 動的なオブジェクトの追加

    Androidプログラミングにおいて、コードで直接動的にオブジェクトを追加するケースは少ない しかし、少ないとはいえ無いわけではないので、一応使い方は確認しておいた方がいいレイアウトの作成 ソースコード

  • レイアウトの作成

    以下のようなレイアウトを作成するXMLでの内容<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context=".MainActivity"> <Button android:id="@+id/button" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Button" /> <LinearLayout android:id="@+id/output" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"></LinearLayout></LinearLayout> レイアウトを構成する上での注意点はlayout_weightだ ボタンを配置するとデフォルトで1が入っていることがある レイアウト上のサイズを比率で指定するものだが、これが入っていると最大限広がろうとするので、もし値が入っていた場合は削除する

  • Activityで受け取るパターン

    public class MainActivity extends AppCompatActivity implements View.OnClickListener { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Button button = findViewById(R.id.button); //オブジェクトのインスタンスを取得 button.setOnClickListener(this); //リスナーを設定 } @Override public void onClick(View v) { TextView text = findViewById(R.id.textView); //オブジェクトのインスタンスを取得 text.setText("あいうえお"); }} button.setOnClickListener(this)のthisに赤線が出たらalt+enterを押しmake implementを選ぶと、必要なインタフェイスが実装されるonClickは自分で記述しなくても大丈夫だ

  • インナークラスを変数で受け取るパターン

    View.OnClickListener listener = new View.OnClickListener() { //リスナーの作成 @Override public void onClick(View v) { TextView text = findViewById(R.id.textView); //オブジェクトのインスタンスを取得 text.setText("あいうえお"); //テキストを設定 } }; Button button = findViewById(R.id.button); //オブジェクトのインスタンスを取得 button.setOnClickListener(listener);

  • インナークラスで直接書くパターン

    Button button = findViewById(R.id.button); //オブジェクトのインスタンスを取得 button.setOnClickListener(new View.OnClickListener() { //クリック(タップ)イベントの処理 @Override public void onClick(View v) { TextView text = findViewById(R.id.textView); //オブジェクトのインスタンスを取得 text.setText("あいうえお"); //テキストを設定 } });

  • UnityからAndroidStudioにエクスポートプロジェクトでFragmentを使用する方法

    UnityからAndroidStudio用にエクスポートされたプロジェクトは、UnityPlayerというViewクラスが貼り付けられたActivityが生成される。このActivityは特殊なものではないので、自由にカスタマイズすることができる。 今回はこのUnityPlayerをFragmentに貼り付けることによって、Fragment上でUnityを表示させる部分を解説する。Fragmentを使うために、ライブラリを追加 UnityPlayerActivityの基本クラスの入れ替え UnityPlayerActivityからUnityPlayerを取り出せるようにする スタイルの変更 フラグメントの作成 レイアウトを普通に読み込ませる 動作確認 戻るボタンを使えるようにする 実は

  • Fragmentを使うために、ライブラリを追加

    build.gradleに以下の設定を追加するdependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) implementation 'com.android.support:support-v4:28.0.0' implementation 'com.android.support:appcompat-v7:28.0.0' }ライブラリのバージョンは、そのときに環境に合わせて変更すること

  • レイアウト

    レイアウトとタップイベントと同じ、TextViewとButtonが配置されていることを前提とする

  • ソースコードの変更(Buttonのイベント)

    public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Button button = findViewById(R.id.button); //オブジェクトのインスタンスを取得 button.setOnClickListener(new View.OnClickListener() { //クリック(タップ)イベントの処理 @Override public void onClick(View v) { TextView text = findViewById(R.id.textView); //オブジェクトのインスタンスを取得 text.setText("あいうえお"); //テキストを設定 } }); }}Buttonのインスタンスを取得し、setOnClickListenerでイベントを設定しているインナークラスを使っているので、慣れていないとかなり見通し辛いまた、自分で入力するのは大変なので、入力補完を活用するといいbutton.setOnClickListener(newまで入力すると補完リストがでるので、View.OnClickListenerを選択する保管が表示されない場合はctrl+spaceを押す

  • ソースコードの変更(TextViewの更新)

    MainActivity.javaを編集する初期状態のソースコードpackage com.example.android.test01;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); }} onCreateはActivity生成時に呼び出されるので、主に初期化コードを書くのに利用されるpublic class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); TextView text = findViewById(R.id.textView); //オブジェクトのインスタンスを取得 text.setText("あいうえお"); //テキストを設定 }}findViewByIdは今後のところで非常にお世話になるので覚えておこう指定したIDのインスタンスを返すオブジェクトに何らかの操作を加えるのに必要になるTextViewが赤字で表示されることになるが、alt+enterを押して必要なインポートを選択すれば解消するインスタンスさえ取得してしまえば、あとは使いたいメソッドを呼び出すだけだこのあたりのコードの作成は自動化されていないので、自分で地道に書かなければならないボタンはあるが利用していないので、起動するとすでにテキストは変更済みだ

  • オブジェクトの追加配置

    TextViewとButtonをLinnerLayoutの下に配置する プレビューにドラッグドロップすることもできるが、レイアウトが複雑になってくると目的の場所に配置することはまず不可能になるので、Component Treeを利用しよう以下のような状態にするAttributesを確認すると、自動的にIDが割り振られていることがわかるプログラムで必要になる名前だ自分で変更するときには、Javaの変数名と同じ命名規則であることに気をつけること layout_widthとlayout_heightで幅と高さが設定できる match_parentが親のサイズに合わせる、wrap_contentがコンポーネントのサイズに合わせるとなっている 特定の数値を指定することも可能だ textの部分は見た目の表示内容を変更できる

  • 最上位レイアウトの編集

    activity_main.xmlを選択し、レイアウトエディタを出す真っ白で何も表示されないならAndroidStudioのバグなので、直し方は編集の基本を参照してほしいさて、最初のミッション、それは拷問を受けているようにしか見えないHello Worldを楽にしてやることだ選択してDeleteを押してやるだけで良い。それだけでHello Worldは最悪の状況から脱することができるのだ 次はトップレベルのコンポーネントを変更する 初期状態ではConstraintLayoutというのが配置されている この配下にオブジェクトを配置することによってレイアウトを構成していくのだが、なぜデフォルトになっているか不思議なくらい使い勝手が悪い まともに使えるものに交換するComponent TreeからConstraintLayoutを右クリック、Convert Viewをクリックし、LinearLayoutを選択するLinearLayoutは配下のオブジェクトを縦、もしくは横方向に配置できるテストとして動作を確認するには最適だデフォルトではhorizontal(横方向)になっている今回はvertical(縦方向)に変更する

  • レイアウトとタップイベント

    レイアウトにテキストビューとボタンを追加し、タップされたらテキストを変更するところまで作成する最上位レイアウトの編集 オブジェクトの追加配置 ソースコードの変更(TextViewの更新) ソースコードの変更(Buttonのイベント)

  • 実機の使用

    Android端末の設定 Windowsでのドライバ組み込み

  • Android端末の設定

    USBデバッグを有効にする必要があるこのメニューを出すまで若干の設定が必要となるまずは端末を操作して「設定」を出す「端末情報」から「ソフトウエア情報」と移動していく「ビルド番号」をたっぷりタップする「設定」に戻ると「開発者向けオプション」が追加されている「USBデバッグ」を有効にする

arrow_drop_down

ブログリーダー」を活用して、空雲さんをフォローしませんか?

ハンドル名
空雲さん
ブログタイトル
空雲リファレンス
フォロー
空雲リファレンス

にほんブログ村 カテゴリー一覧

商用