【Android】CardViewのカスタマイズ
メモ
<android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+id/cardView" android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_margin="4dp" リスト用途の時の要素間の間隔として android:foreground="?android:attr/selectableItemBackground" app:cardBackgroundColor="#00F0" 背景色はこれ app:cardUseCompatPadding="true" app:cardCornerRadius="10dp" 角丸の具合 > <TextView android:id="@+id/text_data" android:textColor="#000" android:padding="6dp" CardViewに書いても効果ないので子要素から。layout_marginでもいいし用途次第 android:layout_width="wrap_content" android:layout_height="match_parent" /> </android.support.v7.widget.CardView>
【Android】javaからKotlinにコンバートした直後のエラー集
Kotlinに触ることになったので、コンバートで出くわしたエラー集をメモ代わりに記載。
随時追記していくので、増えたり訂正したりする可能性があります。
デバッグ実行時
2017/06/27 追記
デバッグ実行時にbreakで止めてる時に、ktコードだと変数ハイライトが見れない
(見れる方法はあるのだろうけど、そのままでは見れません)
watch変数なんかも名前入力しても見せてくれない。
staticなやつのアクセス
宴会の席にコンパニオンさんを呼んで、あげないといけないらしい。
class Hoge{ public static void A(){ } }
こんな感じのjavaのクラスがいたとして、そのクラス関数Aを呼ぶところが、コンバートしたらエラーになったりします。
java:
Hoge.A();
Kotlin: Hoge.Companion.A()
【クラス名】.Companion.【staticなやつ】とすればいいかも。変数なんかもこれ。
thisのアクセス
java例
class Hoge{ int a; public Hoge(int a){ this.a = a; //この部分 } }
これをkotlinで書くと、this@【クラス名】.アクセスしたいやつになるのでこんな感じ
this@Hoge.a = a
関数につけた変数でエラー
詳しい事はKotlinのドキュメントを呼んでもらうとして、
例のごとくjava例は下記。
public void ViewSetting(View view){} //この関数を呼ぶ
java:
View v = findViewById(何かID);
ViewSetting(v);
Kotlin: //Viewは取得済みと過程する コンバート時によしなになってるはずなので、ここでは言及しません ViewSetting(v!!)
javaでは[View v]と定義した変数をViewSetting関数の引数に渡したいところなのですが、
コンバート結果次第ではありますが、関数定義側がnullを許容する定義になっているかどうかが原因です。
つまり、アプローチとしては関数定義を修正するか、渡す変数側の書き方を修正するかの2通りになります。
関数定義を修正する場合は、
ViewSetting(view: View) とするか、
ViewSetting(view: View?) のように型の後ろに?をつけて、nullを許容するかどうか指示する。
変数側で対処するなら、v!!のように後ろに!!がついてるやつは「nullだったら例外」とするものらしいです。
詳しくはKotlinのリファレンスとかを読もう。
カスタムViewクラスの定義の仕方でエラー
例えば、カスタムViewを作ったとして、それをどこかのレイアウトXMLなんかに配置して使うとする。
その場合はレイアウトリソースから生成された時のコンストラクタを書いておかないとエラーになる。
その時々で必要なコンストラクタは、プライマリでもセカンダリのコンストラクタでもOK。
レイアウトリソースから呼ばれるコンストラクタの書き方の参考に。
//プライマリコンストラクタも定義しているクラス class HorizontalScrollRecycle(context: Context, attrs: AttributeSet? = null, defStyle: Int = 0) : RecyclerView(context, attrs, defStyle){ //レイアウトリソースから生成された時のための、セカンダリコンストラクタ. プライマリコンストラクタにリレーしてる constructor(context: Context, attrs: AttributeSet): this(context, attrs, 0){ } init { //やりたい初期処理 var manager: LinearLayoutManager = LinearLayoutManager(context) manager.orientation = LinearLayoutManager.HORIZONTAL layoutManager = manager } }
【Unity】【Android】AndroidプロジェクトにUnityコンテンツを追加して難読化したらハマった
普通のAndroidアプリのプロジェクトに、Unityのコンテンツを追加することが出来るわけですが、APKに難読化を行おうとすると、Unity側の実装内容によっては実行時にバグったりします。
エラー時に詳細なログが出ればまだマシですが、今回はNullReferenceExceptionで間接的なクラス情報しか出なくて、原因のコードを特定できずハマったのがこのお話。
難読化に起因する現象なので、一番簡単な解決策は、原因のクラスやらを特定し、ピンポイントで難読化除外すればいいです。
しかし、先にも書いたように間接的なクラス情報(しかもUnityC#側のクラス名)しか出力されずトホホな状態でした。
簡単に何があったのか挙げると、
- Unity側でアバターチャットを作った
- Androidプロジェクトとして出力し、AndroidStudioにて難読化ビルド
- アセットのPhotonVoiceによる発音・録音が機能しなくなった
- さらにAndroid側と連携するためのJNIも、ClassNotFoundExceptionで落ちる
- 難読化せずにビルドすると正常に動作する
こんな経緯。
で、ClassNotFoundの方はパッケージ名[bitter.jnibridge]まで出力されていたので、除外して解決。
音声の方はエラーログからは有益な情報が得られなかった。そこでAPKを解凍して中身のクラスをざっと確認し、オーディオ関連の何かをしているであろうパッケージ[org.fmod]があったので、こちらも除外したところ、無事に動作できました。
今回の件で、難読化から除外すべきパッケージやクラスを、どう突き止めるのかを学べました。APKを開けて中を見ればいい(笑)
Androidアプリの一部としてUnityコンテンツを作ってる人は、あんまり多くないと思います。同じような事をやろうとして、この壁にぶち当たった人の助けになれば幸いです。
個人事業主が年末調整でやること
個人的メモ
個人事業主が年末調整でやること
- 青色専従者、従業員さんたちの源泉徴収票の作成
その年の12月の早い時期に出してあげると優しいですね!
- 給与支払報告書を市町村に提出
これは翌年の1月1日~末日までに、「1月1日時点で住所がある役所」とのことです。
私は12月27日に引っ越しなので、1月1日時点では新しい住所となっているので、新住所の役所に出しに行きます。
サラリーマン時代と変わった点
- 「配偶者特別控除申請書」を書かなくなった
- 「給与所得者の扶養控除等申告書」も書かなくなった
当然といえば当然の事なんでしょうね。自分が雇われてるわけじゃないですから。
青色専従者さんや従業員さんには書いてもらいましょう。用紙フォーマットは税務署HPなんかで取得印刷するか、税務署に置いてあるのを取っくればいい。
年末調整の仕方
私の場合、楽が出来るように(と言うか楽と言われ)月8万の給与額に設定し、毎月の源泉所得税が発生しないようにしてました。
こうするとそもそも毎月の源泉所得税が無いので、年末調整であれこれと控除額出して所得から控除してみたいなのをスルーして、「96万払ったよ。源泉徴収税額は0円だよ」って源泉徴収票を書けばOK。
源泉徴収税が0なんだから控除のしようが無いので、控除額を算出することがそもそも無駄になるという理屈です。
節税のために、もっとちゃんとした給与設定にした場合には、手を抜かずに書類書いてもらって、きちっと処理しましょうね。
青色申告のためにfreee使っているのですが、年末調整の処理をするためには「給与計算freee」という別口のサービスも使わないとやってくれないようです。(たぶん)
とは言え、年末調整の入力フォームには触れたりしますし、年払いで¥19,800なので、税理士さん雇うよりは安上がりです。
不安だったらチャットで相談できるようですし、来年は使ってみようかと思います。来年は節税のために青色専従者給与を見直す予定だからです。
こんなの書いておきながら今更ですが、これで役所手続きとして合ってるのか…よくわかりません(笑)
経理事務がしたくてフリーエンジニアになったわけじゃないですからね~。記入内容が間違ってたら役所・税務署から連絡くれると思います…きっと。渡すついでに窓口の人にも確認できるしね。
【AWS】DynamoDBへのIAM設定
以前のエントリー『【AWS】DynamoDB Localにnode.jsでアクセスする』にて、DynamoDB Localを使って作業をしていましたが、
いよいよ本物のDynamoDBにアクセスしたくなった。
サーバーに適用する予定だった作成済みの、IAMユーザー情報に新たにDynamoDB用の設定を付け足します。
下記のような内容です。
{ "Version": "YYYY-MM-DD", //自動で発版される "Statement": [ { "Sid": "Stmt1234567890123", //自動で発版される "Effect": "Allow", "Action": [ "dynamodb:DeleteItem", "dynamodb:GetItem", "dynamodb:GetRecords", "dynamodb:ListTables", "dynamodb:PutItem", "dynamodb:Scan", "dynamodb:UpdateItem" ], "Resource": [ "*", "arn:aws:dynamodb:ap-northeast-1:[使用するAWSアカウントID]:user/${aws:username}" ] } ] }
実は記事に書くまでに、かなりハマッてました。GWの一日を使ったという、とても大きな勉強代でした。
何にハマッたかというと、”Resource”の設定内容です。
並行して作業してるAndroidアプリがあるのですが、そっちでもアプリ用のIAMを作成していて、”Resource”のARNを
arn:aws:s3:::バケット名/パス/*
と書いて、意図通りに動いていたので同じように書いたわけです。
ところが、これでは『「arn:aws:iam::AWSアカウントid:user/IAMユーザー名」に、DynamoDB APIを実行する権限はないぞ』と怒られてしまい、何が悪いのか分からなかった。
色々と記事を探していて、こちらのcloudpackさんのブログからヒントを見つけました。
最初のAllowでDescribeTableとListTablesを入れる事 →これで全体のテーブルリストを表示する事ができます。全体を表示できるように設定しておかないと、 自身のテーブルも表示出来ません。 この設定でテーブルリストの表示のみできるようになります。
記事の中盤あたりにこのように書いてあり、レスポンスのエラーメッセージにもDynamoDBのARNではなく、IAMのARNに対して権限が無いと言われていたので、冒頭の記載内容のように書いてシミュレートしたところ、意図通りの結果が得られました。
意図通りの結果が得られたからといって、”*”がセキュリティ的によろしくない気がします。
アドバイスやご指摘よろしくお願いします。
【node.js】DynamoDB Localにアクセスする
DynamoDB Localの実行方法については、いろんなところに情報が出てるのでここでは省きます。
モノを公式から落としてきて、jarを実行して”http://localhost:8000/shell/”にアクセスできることを確認する。
無事にDynamoDB JavaScript Shellの画面が表示されたら、今回の目的であるnode.jsからDynamoDBLocalとやり取りします。
var db: AWS.DynamoDB = new AWS.DynamoDB({ endpoint: new AWS.Endpoint('http://localhost:8000') }); db.scan(params, function(err, data) { if (err) console.log(err); else console.log('data.Count: ' + data.Count); });
このように、AWS.EndpointのURLをブラウザでアクセスしたものに合わせます。
ついでにDynamoDB Localのアクセスキーを何も設定しなかった場合に、下記のような名前のDBファイルが生成される
・cUniqueSessionID_us-west-2
アンダーバーより左側がアクセスキー部分に相当し、右側がリージョン文字列という具合のファイル名。
設定ファイルには
{ "accessKeyId": "cUniqueSessionID, "secretAccessKey": "何でもいい","region":"us-west-2" }
こんな感じで書き込み、
AWS.config.loadFromPath('./credentials.json');
とか配置したパスで読み込めばよい。
あとはscanとか、putItemとか色々やって遊べる。