2020年5月26日火曜日

Appium 入門1 ( emulatorで Hello World! ) 

はじめに
Appiumをwindows環境で構築してみようと思いました。androidの自動化が目的です。
参考にした情報はこちらです。

公式サイト

http://appium.io/docs/en/about-appium/getting-started/?lang=en

書籍

※こちらはたまに眺める程度で使用。
環境
環境はこちらです。
Windows 10
Android 8 (emulator)
appium 1.15.1

インストール

1.appiumのインストール

インストール方法が2通りあって、npmを使う方法と、デスクトップアプリで入れる方法。
npmがわからないので、デスクトップアプリを入れることにしました。
上記サイトのrelease pageからダウンロードをしました。



いろいろなバージョンがあるのですがlatest release を書かれたものをダウンロードしました。

2.ドライバーのインストール

自動化したい端末に合わせてドライバというものをインストールする必要がるようです。
手元にあるAndroidでためしたかったので、Androidのドライバをインストールすることにしました。Androidのドライバには2種類あって、EspressoとUIAutomatetor2があります。
flagshipはUIAutomator2の方ということなので、こっちを入れることにしました。

http://appium.io/docs/en/about-appium/getting-started/?lang=en


ドライバを入れるために下記のモジュールをインストールする必要があるため、入れました。こちらのページの「Basic Setup」の記事に従って入れていきました。

(準備1)Node.js (npm)

こちらからダウンロードしてインストールしました。
https://nodejs.org/en/download/
※npmはNode.jsをインストールすると入ります。
※npmがよくわからないからappiumのデスクトップ版をいれたのですが、ドライバを入れるために結局インストールすることになりました。

(準備2)JDK

JDKはこちらのサイトからダウンロードしました。
https://www.oracle.com/java/technologies/javase-downloads.html
※最新ものを入れました。 最新でよいのかはちょっと不安です。
※この記事でやっていることだけであれば、最新版でもよいのですが、動かないtoolとかもあるのでJDK8のほうが良いかもしれません。
JDK8はoracleのサイトでアカウントを登録しないとダウンロードできないので、ちょっと手間でした。


(準備3)環境変数JAVA_HOMEの設定

システム環境変数にJAVA_HOMEを設定し、JDKのパスを設定する。
「C:\Program Files\Java\jdk1.8.0_251」を設定しました。 

※システムのプロパティ - 詳細設定 - 環境変数
環境変数のダイアログのシステム環境変数(下の方)の新規ボタンを押す。
変数名 : JAVA_HOME
変数値 : C:\Program Files\Java\jdk1.8.0_251 
を設定して、OKで閉じる。 変数値のほうは環境に応じて変更してください。

(準備4)環境変数PATHの設定

システム環境変数のPathに、JDKのbinパスを追加する。
%JAVA_HOME%\bin 

※システムのプロパティ - 詳細設定 - 環境変数
環境変数のダイアログのシステム環境変数で、Pathを選択して、編集ボタンを押し、
環境変数名の編集ダイアログで新規ボタンを押す。
%JAVA_HOME%\bin を追加する。

(準備5)Android Studio のインストール

もともといれてあったので、新しくインストールはしませんでした。
入っていたバージョンは3.6.3です。

(準備6)Android SDK toolsのインストール

Android Studio - Tools - SDK Manager - SDK toolsシート
Hide Obsolete Packagesのチェックを外す
Android SDK Tools が表示されるので、チェックしてapplyボタンを押下

(準備7)環境変数ANDROID_HOMEの設定

システム環境変数にANDROID_HOMEを設定し、android SDKのパスを設定する。
sdkのパスはAndroid Studioを起動して、Toolsメニュー - SDKマネージャー を開いて、 Android SDK Locationから確認しました。

※ついでにシステム環境変数のPathに%ANDROID_HOME%\platform-toolsを追加しておくと、のちのち便利です。

(ドライバインストール)

下記のコマンドをコマンドプロンプトで実行
npm install appium-uiautomator2-driver

(appium-doctorでチェック)

コマンドプロンプトで「npm install -g appium-doctor」を実行し、appium-doctorをインストール
「appium-doctor --android」を実行し、状況をチェック
ここまでで必須のものがOKとなっていることを確認できました。
デモアプリでHello World!

1.デモアプリの準備

公式サイトからダウンロードする。
「・・・this test Apk・・・」というリンクがあるので、そこからダウンロードしました。
これをwindows上にダウンロードします。
※よくわからず、これをemulatorでダウンロードしたりして、四苦八苦しました。

2.emulatorの起動

Android Studio - Tools - AVD Manager から emulatorを作成して、起動しておく。
サンプルに合わせてandroid 8のemulatorを作成しました。

3.サンプルコードの準備

windows上の任意の場所にindex.jsファイルを作成します。
テキストに公式サイトのサンプルをそのまま貼り付けます。
app: のところを、デモアプリをダウンロードしたパスに書き換えます。
// javascript

const wdio = require("webdriverio");
const assert = require("assert");

const opts = {
  path: '/wd/hub',
  port: 4723,
  capabilities: {
    platformName: "Android",
    platformVersion: "8",
    deviceName: "Android Emulator",
    app: "C:/XXXXXXXXXXXX/ApiDemos-debug.apk", // ←ここだけ書き換える。 
    appPackage: "io.appium.android.apis",
    appActivity: ".view.TextFields",
    automationName: "UiAutomator2"
  }
};

async function main () {
  const client = await wdio.remote(opts);

  const field = await client.$("android.widget.EditText");
  await field.setValue("Hello World!");
  const value = await field.getText();
  assert.equal(value,"Hello World!");

  await client.deleteSession();
}

main();
※内容はまだ理解していないです。

4.appium起動

スタートメニュー → Appiumをクリック
特に設定等変更せずに、「サーバーVXXXXXを起動する」 ボタンを押す。

5.実行

コマンドプロンプトを開く
index.jsがおいてあるパスにcdコマンドで移動する。
「npm init -y」コマンドを実行
「npm install webdriverio」コマンドを実行
「node index.js」コマンドを実行

※npm XXXは一回やればいいのかなぁ

6.結果

emulator側でHello World!が表示されたら、成功。
できた。

2020年4月27日月曜日

10周年

このブログをはじめて10年経ちました。

もう10年がんばるぞ。

2020年4月23日木曜日

GetFontStream() 解放する?しない?

こうした
using (System.IO.Stream gfs = m_typeface.GetFontStream())   
{
   XXXX
}
これでよいという確実な根拠はないのですが、使ったものは解放したほうが良いのだろうと思い、usingを使ってます。

気になった点は、自分でnewしていないので、usingで解放されるのか?

逆に勝手に解放してよいのか?という点も気になりました。


(気になった点①)Usingで解放されるか逆コンパイルして確認する
下記のサイトを参考に確認しました。

初期化なしのusing文ってOK?

初めて逆コンパイルしたので、自分へのメモも兼ねてやり方も記載してます。

(1)スタートメニュー → Visual Studio 2019
→ Developer Command Prompt for VS 2019 を起動する。


(2)ildasmと入力してEnter


(3)IL DASMというツールが起動するので、ここに作成したexeをD&Dする。
(4)確認したいメソッドをダブルクリックすると、コードを確認できる。

(5)Disposeが呼ばれているので、おそらく解放してくれるのではないかと思う。


(気になった点②)自分でnewしたオブジェクトではないけど解放して大丈夫か?
解放した後に、getしてみたけど、例外が飛んだりしないので大丈夫なのかな?
            System.IO.Stream gfs = m_typeface.GetFontStream();
            gfs.Close();
            gfs.Dispose();
            gfs = m_typeface.GetFontStream();

2020年4月15日水曜日

GlyphTypeface クラスのGetFontStream()メソッド

これまで、fontファイルにアクセスする際は、fontファイルを直接Openして、アクセスしてました。こんな感じです。
string sfontfile = フォントファイルのパス
FileStream fs = new FileStream(sfontfile, FileMode.Open, FileAccess.Read);


先日、MSDNで、GlyphTypeFaceクラスを見てたら、GetFontStream()というメソッドがあることに気づきました。


引用元 : https://docs.microsoft.com/ja-jp/dotnet/api/system.windows.media.glyphtypeface?view=netframework-4.8


これ使えそうだなと思い、使ってみました。こんな感じです。
System.IO.Stream gfs = mytypeface.GetFontStream();
MemoryStream ms = new MemoryStream();
gfs.CopyTo(ms);
memorystreamにコピーしているのは、使い方がこれしか分からなかったためとなります。
元々Filestreamを使ってたので、Filestreamにキャストしたりしようとしてたのですが、うまくいかず、 とりあえずこの方法だと例外やエラーが発生しないので、こうしてます。


GlyphTypefaceをnewするときにフォントファイルのパスは必要なので、卵が先かにわとりが先かという感じもしますが、 一度GlyphTypefaceを作ってしまえばそこからフォントファイルにアクセスできるのは、利便性があると感じました。

2020年4月3日金曜日

異体字のメモ

(参考URL)概要がわかるサイト
・wikipedia
異体字セレクタ
・IPAのサイト
IVD/IVSとは


(参考URL)Unicodeコンソーシアムの異体字のページ
Ideographic Variation Database


わかったことのまとめ

(1)異体字とは?

同じ文字コードだけどちょっとだけグリフが違うようなものがある。それが異体字。

葛飾区と葛󠄀城市の葛が若干違う。どちらもU+854Bの文字コードだけど、グリフが少し違う。


(2)IVSとは?

Unicodeで異体字を扱うときに、文字コードにくっつける文字コード U+E0100~U+E01EF のこと。異体字セレクタの一種類。

(3)SVSとは?

Unicodeで異体字を扱うときに、文字コードにくっつける文字コード U+FE00~U+FE0F のこと。異体字セレクタの一種類。

(4)FVSとは?

Unicodeで異体字を扱うときに、文字コードにくっつける文字コード U+180B~U+180D のこと。異体字セレクタの一種類。モンゴル文字専用

(5)IVDとは?

異体字のデータベース。Unicodeコンソーシアムがこれを管理してて、ここに申請すると登録される。
Ideographic Variation Database
どうやって実現するか?
・.netのAPIで実現できないか探してみたけどなさそう。

・fontファイルを開いて、cmapテーブルを見るのがよさそう。... 大変そう...

2020年4月2日木曜日

令和の合字を使ってみた。

令和の合字U+32FFを含むフォント「IPAmj明朝フォント」v006.01をインストールして、EnumCharで表示してみました。



気になったこと。
・これまでの元号とブロックが異なる。
・令和がU+32FFでこのブロックの最後なので、次の元号はまたブロックがかわるのかな?
・このフォントだけなのかもしれないけど、令和だけ若干細い。

2020年3月18日水曜日

Pygame Zero 入門してみる

やりたいこと
日経ソフトウェア(2020年3月号)の記事で、Pygame Zero入門という記事があります。
この記事に沿って試してみました。


インストール
Anacondaがインストール済みでしたので、下記のコマンドをAnaconda Promptに入力しただけで、 インストールが完了しました。

pip install pgzero

○とか描く
○とか■とかを描くコードを書くサンプルを入力した結果です。


キャラが回る
きゃらが回るコードを書くサンプルを入力した結果です。


なるほど、draw関数とupdate関数を準備して、そこに処理を書くだけでいいようです。 なんだか簡単そうだ。
ジャンプゲーム
理解はできていないけど、とりあえずできた。

やっとあそべる。

小学生にはちょっと難しいかな。