2023年10月18日水曜日

Android ライブラリの依存関係を確認する

ライブラリでトラブった時に、とりあえず依存関係を確認する。

./gradlew dependencies

参考

Android リップルエフェクト(Ripple Effect)を簡単に実装する方法を解説

どうも。どっことです。今回はリップルエフェクト(Ripple Effect)の実装方法について解説していきます。

リップルエフェクトを設定する

リップルエフェクトは、Viewにタップした時に水の波紋のように色が広がっていくような表示のことです。

これを設定しなくても動作に影響することはありませんが、ユーザにタッチしたことを知らせるには重要な効果だと思います。

実装方法

実装自体は簡単で、android:backgroundに以下を設定するだけです。

android:background="?attr/selectableItemBackground"

なお、すでに背景色を設定済みであれば、android:foregroundに設定することで同様に表示することができます。

android:foreground="?attr/selectableItemBackground"

まとめ

今回はリップルエフェクトの実装方法について解説しました。もはや一行追加するだけという非常に簡単な設定だけなので、解説というにはあまりにもネタが少ないかなと頭を悩ませています。

2023年10月17日火曜日

SQL テーブルにカラムを追加するALTER文を紹介

どうも。どっことです。今回は、既存のテーブルにカラムを追加するALTER文について紹介したいと思います。

テーブルにカラムを追加するALTER文

アプリのアップデートに伴い、もともと管理していたデータテーブルにさらに情報を追加したい、など、どうしてもテーブルにカラムの追加が必要になることがあると思います。そんな時は、ALTERを使って既存のテーブルにカラムを追加することができます。

サンプル①

まずはシンプルなALTER文です。

alter table テーブル名 add column カラム名 型;

テーブル名カラム名は必要な値を設定してください。

サンプル② オプション付き

またオプションとして、初期値を設定することができます。DEFAULT 節を使って初期値を指定します。

alter table テーブル名 add column カラム名 型 default 初期値;

例えば、userというテーブルにage カラムをデフォルト値を18として追加する場合は以下となります。

alter table user add column age int default 18;

まとめ

今回は、既存のテーブルにカラムを追加するALTER文について紹介しました。

新しいテーブルに引っ越したり、そもそも別テーブルで管理するなどの方法もありますが、今回はそんな中での一つの解決案として紹介させていただきました。

SQLはデータベースにおけるデータの永続化をする上で避けることができない技術だと思いますので、頭の片隅にいれておくだけでも開発効率やスピードに違いが出てくると思います。

参考

2023年10月16日月曜日

iOS 可変長引数を持つメソッドの定義

Javaと似てて、末尾に ... を追加するだけ。参照する際は、配列と同じように扱える。

func print(texts: String...) {
    // 配列のように要素数を参照できる
    if texts.count == 0 {
       return
    }
    // 配列のように要素を参照できる
    print("first: \(texts[0])")
    for text in texts {
      print("element: \(text)")
    }
}

参考

2023年10月15日日曜日

iOS よくわからないエラー集「Undefined symbol:...」

ライブラリをアプリに組み込んでビルドしたら、以下のエラーが出力されたが、知ってしまえばなんてことはない。

Undefined symbol: _GULLogBasic
Undefined symbol: _OBJC_CLASS_$_***
Undefined symbol: _OBJC_CLASS_$_***
Undefined symbol: _OBJC_CLASS_$_***
Undefined symbol: _OBJC_CLASS_$_***

「それ実機でしかビルドできないのに、シミュレータを対象にビルドしているよ」というときに表示されるエラーなので、「シミュレータでも動作するライブラリを使う」か、それが無理なら「シミュレータをターゲットにビルドするときは、該当のライブラリを組み込まずに使う、という方針となる。

2023年10月14日土曜日

アジャイル開発 と スクラム開発 スクラムイベントついて解説

どうも。どっことです。今回は、アジャイル開発(アジャイル)とスクラム開発の違い、そしてスクラム開発におけるイベントについてします。

アジャイル

アジャイルとは「俊敏性の高いソフトウェア開発」のことを指します。

スクラム(スクラム開発)

そして、スクラムとは「俊敏性の高いソフトウェア開発」の手法のひとつです。つまりスクラム開発はアジャイルに分類される手法の一つとなります。

固定的かつ長期的なメンバーで開発が進行することを想定しています。それによりチームワークを高まり、結果として生産性の最大化やビジネス目標の達成を図ります。

スクラム開発ではプロダクトオーナー、開発者、スクラムマスターの役割があり、各役職はメンバーに割り当てられます。

スクラムイベントについて

スクラム開発には4つのプロセス(イベント)があります。

1.スプリントプランニング

スプリントの最初に実施するプロセスです。

プロダクトバックログ(プロジェクトで消化すべきタスクの一覧)から優先度の高いアイテムを抽出し、タスク化します。タスク化する対象は、メンバーで認識相違がないことをあらかじめ確認したうえで決まります。そうしてタスク化されたアイテムがそのスプリントで消化するバックログ(スプリントバックログ)となります。

2.デイリースクラム

平日の決まった時間(午前中、特に朝が一般的)に短い時間でのミーティングを実施し、進捗確認や要求変化の確認を行います。スクラムマスターが全員に「今日は何やりますか」と質問し、その回答を確認することだけが実施される。問題があれば、スクラムマスターは別途会議などを設定することで解決を促しますが、スクラムマスターは、その問題解決意思決定の責務を負います。

3.スプリントレビュー

スプリント後に実施します。開発されたソフトウェアのレビューを行い、必要に応じてバックログをアップデートします。製品の機能や品質が十分であると判断されるまでスプリントとスプリントレビューを繰り返されます。

4.スプリントレトロスペクティブ

いわゆる振り返りです。スプリントの最後に実施します。

「スプリントの成果」にフォーカスが宛てられるスプリントレビューに対して、スプリントレトロスペクティブは「スクラムチームの動き」などの、プロセスにフォーカスされる。例えば、以下の事項について議論されます。

  • 直近のスプリントについての評価
  • 良かった点や今後の課題
  • スプリントの中で課題を解決した事例
  • 次回以降のスプリントにおける改善点

補足

アジャイル開発にはスクラム以外にもエクストリーム・プログラミング(XP)やカンバンなどがあげられます。

まとめ

今回は、アジャイル開発(アジャイル)とスクラム開発の違い、そしてスクラム開発におけるイベントについて解説しました。

参考

2023年10月13日金曜日

HTML/CSS CSSを設定するときに頻出する設定項目

このブログの表示感を調整するためにCSSをカスタマイズしていたが、毎回調べなおしていたので備忘録。

  • width
    • タグ要素の幅。divで頻出。
  • height
    • タグ要素の幅。divで頻出。
  • background-color
    • タグ要素内の背景色。RGB指定。
  • font-size
    • タグ要素内のテキストのテキストサイズ。 指定方法が色々ある。
    • px,emとか。
    • larger/smaller (親要素のフォントサイズとの相対)とか。
  • color
    • タグ要素内のテキストの色。RGB指定。
  • font-style
    • タグ要素内のテキストのスタイル。
    • normalitalicobliqueとか。
  • padding
    • タグ要素内に設定する余白。px,em指定。
    • 1つ指定は全方向に同一の値を設定。
    • 4つ指定はの順に設定される。
  • margin
    • タグ要素外に設定する余白。px,em指定。
    • 1つ指定は全方向に同一の値を設定。
    • 4つ指定はの順に設定される。
  • list-style
    • リストタグ(ul)限定。左につくボッチの指定。
    • noneを指定すると消える。
  • border-style
    • 枠線を表示する際のスタイルを指定できる。
    • solid(実線),dashed(破線)など。
  • border-width
    • 枠線を表示する際の枠線の太さ設定。
    • px, em指定。
  • border-color
    • 枠線を表示する際の枠線の色指定。
    • RGB指定。
  • border
    • border-style, border-width, border-colorを一括で指定できるプロパティ。

2023年10月12日木曜日

iOS ボタンタップ中の色を変えたい

ViewのプロパティであるisHighlightedの更新を受けて、背景色を設定するだけ。

カスタムViewを実装する際に、isHighlightedをオーバーライドし、didSetbackgroundColorを設定すればいいだけ。こんなん。

override open var isHighlighted: Bool {
    didSet {
        backgroundColor = isHighlighted ? .lightGray : .blue
    }
}

ちなみにisHighlightedとは、Androidでいうところのstate_pressedUIButtonなどのUIControlクラスを継承したViewは状態に対して背景を変えるメソッドがあるため、それを使えばタップ中の色を変えることができる。

参考

2023年10月11日水曜日

iOS UIViewを角丸にしたり、枠線を付ける実装方法を解説

どうも。どっことです。今回は、iOSのUIViewについて角丸や枠線をつけ方について実装を解説していきたいと思います。

iOSで角丸や枠線を付ける実装方法

私自身がAndroidエンジニアとしてやってきた時間が長いので、どうしてもAndroid開発者目線となってしまうのですが、Viewを角丸にしたり、枠線をつけたりする実装が本当に面倒くさいです。簡単に見せるだけでも、新規に背景用ファイルを用意してあげる必要があります。

しかし、iOSは角丸や枠線を超簡単に実装できます。本当に羨ましいです。別に悔しくねーし。

実装方法

それでは、実装方法について解説していきたいと思います。

角丸にする

UIViewが共通に持っているlayerという変数に対応するパラメータがあるので、コード上であれば以下に値を設定することで角丸にすることができます。

layer.cornerRadius

枠線を付ける

枠線の実装も同様で、以下に値を設定することで枠線を付けることができます。

layer.borderWidth
layer.borderUIColor

ちなみに、borderUIColorCGColorクラスを設定する必要があることに注意してください。

まとめ

今回は、UIViewを角丸にしたり枠線をつけたりする実装方法を解説しました。特に見せ方を柔らかくする角丸の実装が簡単なのは、iOSはとても良いなと思いました。

参考

2023年10月10日火曜日

Android Activityを透明にするための設定を解説

どうも。どっことです。今回はActivityを透明にするための設定について解説します。

Activityを透明にする

完全に透明なActivityでなにかしら処理する(つまりAPI通信する、DBの更新処理するなどを完全に透明なActivityで実行する)のはユーザ観点ではよくないですが、例えばダイアログを表示するためだけのActivityなどであれば、背景が見えて別画面に見えてしまうのは不自然であるため、確かに透明である必要があります。そういった、不自然なことを回避する目的でActivityを透明にする設定を紹介していきたいと思います。

設定方法

AndroidManifest.xmlで透明にしたいActivitythemeに以下を設定します。

<item name="android:windowBackground">@android:color/transparent</item>
<item name="android:colorBackgroundCacheHint">@null</item>
<item name="android:windowIsTranslucent">true</item>

例えば、上記の設定を適用したthemeTransparentActivityThemeとして用意しました。

<style name="TransparentActivityTheme" parent="AppTheme.NoActionBar">
    <item name="android:windowBackground">@android:color/transparent</item>
    <item name="android:colorBackgroundCacheHint">@null</item>
    <item name="android:windowIsTranslucent">true</item>
</style>

上記をAndroidManifest.xmlの透明にしたいActivitythemeに適用します。以下はTransparentActivityというActivityに設定したときの例です。

<activity
    android:name="com.sample.application.TransparentActivity"
    android:theme="@style/TransparentActivityTheme"/>

orientation指定をするとクラッシュするので注意

ただし実際にアプリ内に組み込む場合、注意が必要です。透明なActivityには危険が含まれているのです。 透明なActivityに対してorientationの指定をするとクラッシュします。実装でorientationを指定したり、AndroidManifestでのActivityscreenOrientationを指定するとアプリがクラッシュするようです。呼び出し元のActivityと同じorientationで制御されるようなので、透明なActivityを呼び出す時は気をつけてください。

参考

2023年10月9日月曜日

Android Activityをダイアログぽく表示する方法を紹介

どうも。どっことです。今回はActivityをダイアログっぽく表示する方法を紹介します。

Activityをダイアログのように表示する

色々カスタマイズできるのは嬉しいDialogFragmentですが、実装が面倒で「それっぽければActivityで十分なんだよなぁ…」と思ってしまった私への、「ActivityだけでDialogぽい見た目の画面(というかダイアログ)の作り方」備忘録です。

最小限の設定の場合

対象のActivityに以下のThemeを設定するだけです。

Theme.MaterialComponents.DayNight.Dialog

DialogFragmentStyleとして設定される値を、Activityに設定してあげるだけです。本当にそれっぽくできるだけで、これだけだと決定もキャンセルもなにもないのでレイアウト側で追加の実装が必要となります。

色々カスタマイズしたい場合

Themeを継承してカスタマイズします。

最低限の設定を参考にダイアログぽいものを実装するとテーマの設定が引き継がれていないため、他のActivityと統一感が取れていないダイアログが表示されます。レイアウト側で調整すればなんとかなりますが、いい感じの統一感を目指すならThemeを意識したカスタマイズが必要となります。

Theme.MaterialComponents.DayNight.Dialogの継承元を追っていくと分かりますが、ダイアログぽいActivityにしてくれるこのテーマはいくつかの属性が設定されています。以下抜粋。もしかしたら漏れてるかも。

<item name="android:windowFrame">@null</item>
<item name="android:windowTitleStyle">@style/RtlOverlay.DialogWindowTitle.AppCompat</item>
<item name="android:windowTitleBackgroundStyle">@style/Base.DialogWindowTitleBackground.AppCompat</item>
<item name="android:windowBackground">@drawable/abc_dialog_material_background</item>
<item name="android:windowIsFloating">true</item>
<item name="android:backgroundDimEnabled">true</item>
<item name="android:windowContentOverlay">@null</item>
<item name="android:windowAnimationStyle">@style/Animation.AppCompat.Dialog</item>
<item name="android:windowSoftInputMode">stateUnspecified|adjustPan</item>

アプリ共通のテーマを継承しつつ、これらの設定をテーマに設定することで、統一感のあるダイアログを実装することができます。

まとめ

今回はActivityをダイアログぽく表示する方法について紹介しました。DialogFragmentは実装に少しクセがあるコンポーネントなので、単に表示するだけなら今回の設定で簡単に実装することができます。ただ、ここまで書いてていまさらだが、Activityをダイアログとして表示するのはAndroidのお作法的に正直あまりオススメしません。用法用量を守って計画的に。

2023年10月8日日曜日

VBA セルやセル範囲を参照・選択する

VBAって、ワークシートとセルの参照、検索が手になじむくらい使えるようになれば、あとはいくらでも融通が利くようになると思うんだ。

Cells を使ってセルを参照する

Cells(1, 1) = "A1に値を設定します"
Cells(1,"A") = "A1に値を設定します"
Cells(2, 1) = "A2に値を設定します"
Cells(4,"D") = "D4に値を設定します"

Range を使ってセルを参照する

Range("A1") = "A1に値を設定します"
Range("A2,D2") = "A2,D2に値を設定します"
Range("A3:D3") = "A3~D3 (=A3,B3,C3,D3)に値を設定します"
Range("A:D") = "A~D列(=A,B,C,D列のすべてのセル)に値を設定します"
Range("1:4") = "1~4行(=1,2,3,4行のすべてのセル)に値を設定します"
Range("A2:C3") = "A2~C3(=A2,A3,B2,B3,C2,C3)に値を設定します"

参考

2023年10月6日金曜日

Android ファイルアクセスが拒否されるせいでビルドが全然通らない問題と解決方法を紹介

どうも。どっことです。今回ですが、ここ2,3年、AndroidStudioでのビルドが20回に1回程度しか成功しなくなり開発モチベが著しく低下していたが、ついにその問題を解決することができたので備忘録として記載します。

現象と根本の原因

How to solve this error app:packageDebug FAILED

A failure occurred while executing com.android.build.gradle.tasks.PackageAndroidArtifact$IncrementalSplitterRunnable java.io.FileNotFoundException: C:\Users\HP\AndroidStudioProjects\Chatter\app\build\intermediates\incremental\packageDebug\tmp\debug\zip-cache\androidResources (Access is denied)

このエラーが解決できずに、この2,3年本当に困っていました。「はー。もうダルイし、Macでも買うか。」とここぞとばかりに物欲全開に検討していました。

そして解決へ

そんなこんなでPCのリプレースも検討していたのですが、上記のページをみていくとコメント欄に以下の記述がありました。

The actual problem is that your anti-virus is preventing the access to the files. Make the Android Studio application as trusted application(recommended) or try turning off your antivirus.(おまえのPCのウイルス対策ソフト、ちゃんと設定しとるんか?AndroidStudioを信頼できるアプリに設定しとるか?あとは試しにソフトの機能をOFFにしてビルドしてみ?)

私「...」
私「...」
私「それだわー」

ウイルス対策ソフトの機能をOFFにしてビルドしたところ、何事もなかったかのようにビルドが成功しました。

ウイルス対策ソフトをインストールしてからすぐのAndroid Studio起動で「なんか知らんツールがアクセスしたがってるけどええか?」という警告が表示されていたので脳死でOKを設定していましたが、それだけじゃ足りなかったようです。公式サイト(参考に記載)にも「ビルドのパフォーマンスが著しく低下するで?ちゃんと設定するんやで?」というアナウンスがされていました。

原因が分かったので、ウイルス対策ソフトの設定に対象外フォルダを設定することで無事に解決しました。本当に良かった。

最後に

私のPCではソースネクスト社のウイルスセキュリティソフトをインストールしています。絶対にツッコませない。このソフトでの対象外フォルダ指定手順を紹介して終了したいと思います。

  1. ウイルスセキュリティソフト のホーム画面を開く
  2. 設定 > ウイルス・スパイウェア対策 >設定(セクションタイトル下部に導線有)
  3. ウイルス自動検知タブ > 検査したくないファイル、フォルダを指定する
  4. ファイルやフォルダを追加で検査対象外のフォルダを追加する。以下にチェックを入れる。
    • ウイルス自動検知の対象にしない
    • サブフォルダも含む

参考

2023年10月5日木曜日

VBA HTTP通信して情報取得する実装を紹介

どうも。どっことです。毎度おなじみ通信して取得する処理の紹介です。今回はVBAでの実装を備忘録として紹介します。

VBAで通信して情報取得する

実装サンプルを以下に載せます。XMLHTTP60DOMDocument60JsonConverterを使うことで、比較的簡単に実装することができます。

Set http = New XMLHTTP60
url = "取得対象となるリソースのURL"
http.Open "GET", url, False
http.send
'エラーハンドリング
Set http = New XMLHTTP60
If http.statusText <> "OK" Then
  MsgBox "サーバーへの接続に失敗しました"
  Exit Sub
End If
'データの解析 XML形式の場合
Set doc = New DOMDocument60
doc.LoadXML (http.responseText)
'データがjson形式の場合はこっち
Set jsonObj = JsonConverter.ParseJson(http.responseText)

まとめ

簡単ですが、以上です。業務上、EXCELを利用するエンジニアは多いと思いますが是非ともVBAも活用して、業務効率の向上などに役立ててください。

参考

2023年10月4日水曜日

Android gradleのキャッシュを削除するコマンドを紹介

どうも。どっことです。今回は、毎回忘れるGradleのキャッシュ削除のコマンドを備忘録として紹介します。

gradleのキャッシュを削除するコマンド

早速ですが、コマンドを載せます。

rm -rf ~/.gradle/cashes

~/となっていることを見ても分かる通り、削除するディレクトリはアプリプロジェクトにあるディレクトリではなくユーザディレクトリにあるキャッシュのディレクトリになります。これを実行すると、次回ビルドは非常に時間がかかるのが見込まれますので、「PCやプロジェクトがおかしいな?」と思った時にやるのがちょうどいいと思います。

ちなみに .gradle フォルダを削除しても、Gradle がビルドする時に再構築してくれるらしいので気にすることは全くありません。

独り言

ただ、最近AndroidStudioのビルドが全く通らない。

C:\Users\XXXXX\Documents\project\sampleProject\app\build\intermediates\incremental\packageDebug\tmp\debug\zip-cache\androidResources (アクセスが拒否されました。)

いったいなんだってばよ。

追記。なんか解決した。新規に記事にした。

2023年10月2日月曜日

SQL SQLでもビット演算は計算できる

どうも。どっことです。今回はSQLでのビット演算について備忘録を記載します。

SQLでビット演算

SQLでもビット演算することができます。ビット演算は情報系の学生やエンジニアには基礎的な内容ですが、Androidだけで言えば使うことがあまり多くないかもしれません。

しかし、確かにビット演算による機能実装は行われており、例えばIntentに付与するflagの値はこのビット演算により制御されています。

これをもとに考えると、アプリやデータなどの複数の重複した状態を管理するのに向いていそうです。例えばSNSのコメントの「お気に入り」「リブート/リポスト」「いいね」などを管理するとき、booleanで管理するのが一番シンプルな実現方法ですが、最大値7の整数(000〜111)でまとめてしまう、という管理でも実現することができます。これの嬉しいことは、似たようなデータ要素を追加するとき、例えば「ミュート」を追加する場合にも、変数を追加せずに最大桁数を7→15の整数(0000〜1111)に上げることだけで十分実現できるということです。

変数を追加するというのはプログラムのデータ上だけでなくデータベースのテーブルやAPIでのやりとりにも影響してくるので、このようなOn/Offのデータをビット管理するのは拡張性を意識したときに優れていると考えられます。

積(and)

select 1 & 1; 1
select 1 & 0; 0

和(or)

select 1 | 1; 1
select 1 | 0; 1
select 0 | 0; 0

反転(not)

select ~0; -1
select ~1; 0

左シフト

select 1<<2; 4

右シフト

select 4>>1; 2

移行予定

どうも。どっことです。 タイトルの通りですが、諸事情により GitHubPage に移行予定です。 https://mkt120.github.io/ この備忘録に記載の内容を転記しつつ、今後はこちらのページを更新していく予定です。