- 投稿日:2020-10-06T22:16:22+09:00
【Kotlin】委譲プロパティ (Delegated Properties) 入門
【Kotlin】委譲プロパティ (Delegated Properties)について
目次
委譲プロパティ (Delegated Properties)とは
- クラスのプロパティ(メンバ)のsetter/getter処理を別のオブジェクトに移譲する仕組み
- ここで私は、移譲とはというのがまだ理解できてないレベルでした。
- byを使うことで、委譲する先を指定できます。
委譲とは
委譲 (delegation) とはオブジェクト指向プログラミングにおいて、あるオブジェクトの操作を一部他のオブジェクトに代替させる手法のこと。(wikipedia参照)例
- クラスBで処理を、クラスAのオブジェクトに委譲している。
Sample.ktclass A { fun foo { println("hoge") } } class B { // クラスBは、hogeの処理をクラスAに委譲している。 fun hoge { val a = A() a.foo() } }標準ライブラリ
delegated propertiesの標準ライブラリとしては、lazyとObservableなどがあります。
その他、NotNullなどがありますが、こちらはまだよく分かってないです。lazy
lazyは、プロパティの初期化を初めて参照された時まで遅延できます。
何が嬉しいか
- AndroidのContextなど、onCreate以降にしか参照できないもののプロパティをオプショナルにしなくて済む
- オプショナルだと、
?や!!などの記述が増えるし、nullの可能性も出てきてしまうので確認などが必要になる。例
- 現在時刻を値として持つ、プロパティ。
- 初期化されたタイミングの時間の値を持ち、immutableなので変更不可。
import java.time.LocalDateTime val lazyProperty: String by lazy { val dateAndtime: LocalDateTime = LocalDateTime.now() "Current date and time: $dateAndtime" } fun main(args: Array<String>) { println(LocalDateTime.now()) println(lazyProperty) println(lazyProperty) ==> 結果 2020-09-06T21:56:21.118270 Current date and time: 2020-10-06T21:56:21.118703 => 前のDataTimeより後の時間になっている。 Current date and time: 2020-10-06T21:56:21.118703 => 同じ値 }
- lateinitとの違い
- lateinitでも同じことを実現できますが、lateinitはmutable(あとで、値を変更できる)、lazyはimmutable(初期化した値から変更できない)という違いがあります。
Observable
Observableは、プロパティの値の変更を検知して、それに伴って処理を実行できるというものです。
- 例
Observable.ktvar observableName: String by Delegates.observable("Jonathan") { property, old, new -> println("$old to $new") } fun main(args: Array<String>) { observableName = "Joseph" => 結果 "Jonathan to Joseph" observableName = "Jotaro" => 結果 "Joseph to Jotaro" }まとめ
委譲プロパティとは
- プロパティのsetter/getter処理を別のオブジェクトに移譲する仕組み
標準ライブラリの2つある。
- lazyとは、プロパティの初期化を参照されたタイミングまで遅延できる。
- observableとは、値の変更を検知して処理を実行できる
参考にさせていただいたサイトなど
- 投稿日:2020-10-06T18:29:11+09:00
UnityAndroidでExportしたprojectをステップ実行
環境1
OS : win10 pro
Unity5.6
AndroidStudio2.3.2OS : win10 pro
Unity2019
AndroidStudio4手順
・Unity C#プラグインメソッドを呼び出す。pluginは消す。
・UnityでExportする。
・AndroidStudioでそれを開く。
・AndroidStudioで、C#で呼び出したプラグインメソッドと同じIFのメソッドを作成する。確認
Java層でブレークポイント停止するのを確認した。
AndroidJavaObjectの引数は JavaクラスへのFULLPATH / TestMainがクラス名
Unity/Assert/Plugins/Android以下は空にしてEXPORTする。c#
string PluginPackageClass = "com.ore.test.TestMain"; AndroidJavaObject mImageLoader = null; public void init_lib() { m_text.text = "init_lib"; try { mImageLoader = new AndroidJavaObject(PluginPackageClass); if (mImageLoader != null) { int t_no = mImageLoader.CallStatic<int>("getNo"); m_text.text = t_no.ToString(); } else { m_text.text = "null"; } } catch(Exception e) { Debug.Log(e.ToString()); m_text.text = "ex a"; } }ExportしたJava
Android4で開いて、PluginPackageClass を作成する。これに合わせたコードを書いていき、動作確認できたら、その部分をLibにして
Unity/Assert/Plugins/Androidにもっていく。package com.ore.test; public class TestMain { static int m_no = 0; public static int getNo(){ if ( m_no == 0) { return 44; }else{ return 22; } } public int getNo2(){ return 44; } }
- 投稿日:2020-10-06T17:29:21+09:00
unityのARFoundationでアプリ作ったのに、実機だとカメラが真っ黒になってしまう時の改善策
unityのARFoundationでARのアプリをエラーなく作ったのに、iosやAndroidで実機で立ち上げると、カメラが真っ黒で映らない!!時の改善方法をご紹介します。
改善策
- 「camera usage description」 を設定していない
Edit→project settings→Player→iosまたはAndroidを選択(実機の環境)
→camera usage descriptionの欄にCamera required for AR
というように記入してビルド
iosの場合はこれでXcodeの内のinfo.plistにPrivacy - Camera Usage Description が自動的にセットされます。
- XR Plug-in Management の Plug-in Providers を設定(私はこれで解決)
Edit→project settings→XR Plug-in Management→iosまたはAndroidを選択(実機の環境)→ARKitまたはARCoreにチェックを入れる。
XR Plug-in Managementはこちらに記載があります。
- バージョンを最新版にアップデート
Unity、ARFoundation,ios,Android,xcode,ARKit,ARCoreなどなどアップデート
ちなみXcodeのアップデートは容量と時間が必要なのでご注意を笑どこにもエラーがないのに、、
全て設定したのにカメラが動かないとなると、解決策はここら辺だと思います。
ARにおいてカメラはマストなので、しっかりと解決して実機で確認できらいいですね。
- 投稿日:2020-10-06T15:14:31+09:00
AIR GOで無料でAndroid/iOSアプリの脆弱性診断
「AIR GO」はLINEが提供しているセキュリティープラットフォーム「AIR」のプロダクトの1つで無料でモバイルアプリの脆弱性診断を行ってくれるSaaSです。
AIRのアカウント登録を行えば直ぐに使い始めることができます。
作ったAIRアカウントでログインしてAIR GOを開き、AndroidならAPKファイル、iOSならIPAファイルをアップロードするだけで、直ぐに脆弱性診断が行えます。
URLを入力すると参照先にマルウェアが含まれていないかチェックできます。脆弱性診断結果は次のようなレポート形式で表示されます。
無料でここまで脆弱性診断できるのは素晴らしいですね。
…
ただし、「一つのアカウントごと1回のみスキャン可能です。」とメッセージがでている通り、1アカウントで1回しか検査ができません…。
「1アカウントにつき1日1回」かと思いきやマジで1回のようです。じゃあ、それ以降はどうすればいいかの情報が見つからないので確かなことはわかりませんが、おそらく有償版が必要になると思われ。
その有償版のサブスクリプションはAmazon SaaS Storeで買えるようです。
https://www.amazon.co.jp/dp/B0814HJGH9
- 投稿日:2020-10-06T09:59:17+09:00
[Android開発]Javaで画像をサーバーから取得してImageViewに設定しよう!!
説明
画像ファイルをURLで参照して、サーバーから取得する方法です。(非同期処理)
Java
GetImagesUrlimport android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.os.AsyncTask; import android.widget.ImageView; import java.io.IOException; import java.io.InputStream; import java.net.MalformedURLException; import java.net.URL; public class ImageUrl extends AsyncTask<Integer, Integer, Bitmap> { ImageView bmImage; public ImageUrl(ImageView bmImage) { this.bmImage = bmImage; } @Override public Bitmap doInBackground(Integer... integers) { Bitmap image; URL imageUrl = null; try { //引数の数字で取得するURLを変える //Staric変数として画像のURLを定義しよう if (integers[0] == 0) { imageUrl = new URL(Constants.Image1); } else if (integers[0] == 1) { imageUrl = new URL(Constants.Image2); } else if (integers[0] == 2) { imageUrl = new URL(Constants.Image3); } InputStream imageIs; imageIs = imageUrl.openStream(); image = BitmapFactory.decodeStream(imageIs); } catch (MalformedURLException e) { return null; } catch (IOException e) { return null; } return image; } protected void onPostExecute(Bitmap result) { bmImage.setImageBitmap(result); } }実行
mainint ImageNum; //ImageNumに入っている数値で対象の画像を取得して、ImageViewに設定する new ImageUrl((ImageView) view.findViewById(R.id.any_image)).execute(ImageNum);




