ライブラリでトラブった時に、とりあえず依存関係を確認する。
./gradlew dependencies
どうも。どっことです。今回はリップルエフェクト(Ripple Effect)の実装方法について解説していきます。
リップルエフェクトは、Viewにタップした時に水の波紋のように色が広がっていくような表示のことです。
これを設定しなくても動作に影響することはありませんが、ユーザにタッチしたことを知らせるには重要な効果だと思います。
実装自体は簡単で、android:background
に以下を設定するだけです。
android:background="?attr/selectableItemBackground"
なお、すでに背景色を設定済みであれば、android:foreground
に設定することで同様に表示することができます。
android:foreground="?attr/selectableItemBackground"
今回はリップルエフェクトの実装方法について解説しました。もはや一行追加するだけという非常に簡単な設定だけなので、解説というにはあまりにもネタが少ないかなと頭を悩ませています。
どうも。どっことです。今回は、既存のテーブルにカラムを追加する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はデータベースにおけるデータの永続化をする上で避けることができない技術だと思いますので、頭の片隅にいれておくだけでも開発効率やスピードに違いが出てくると思います。
Javaと似てて、末尾に ... を追加するだけ。参照する際は、配列と同じように扱える。
func print(texts: String...) {
// 配列のように要素数を参照できる
if texts.count == 0 {
return
}
// 配列のように要素を参照できる
print("first: \(texts[0])")
for text in texts {
print("element: \(text)")
}
}
ライブラリをアプリに組み込んでビルドしたら、以下のエラーが出力されたが、知ってしまえばなんてことはない。
Undefined symbol: _GULLogBasic
Undefined symbol: _OBJC_CLASS_$_***
Undefined symbol: _OBJC_CLASS_$_***
Undefined symbol: _OBJC_CLASS_$_***
Undefined symbol: _OBJC_CLASS_$_***
「それ実機でしかビルドできないのに、シミュレータを対象にビルドしているよ」というときに表示されるエラーなので、「シミュレータでも動作するライブラリを使う」か、それが無理なら「シミュレータをターゲットにビルドするときは、該当のライブラリを組み込まずに使う、という方針となる。
どうも。どっことです。今回は、アジャイル開発(アジャイル)とスクラム開発の違い、そしてスクラム開発におけるイベントについてします。
アジャイルとは「俊敏性の高いソフトウェア開発」のことを指します。
そして、スクラムとは「俊敏性の高いソフトウェア開発」の手法のひとつです。つまりスクラム開発はアジャイルに分類される手法の一つとなります。
固定的かつ長期的なメンバーで開発が進行することを想定しています。それによりチームワークを高まり、結果として生産性の最大化やビジネス目標の達成を図ります。
スクラム開発ではプロダクトオーナー、開発者、スクラムマスターの役割があり、各役職はメンバーに割り当てられます。
スクラム開発には4つのプロセス(イベント)があります。
スプリントの最初に実施するプロセスです。
プロダクトバックログ(プロジェクトで消化すべきタスクの一覧)から優先度の高いアイテムを抽出し、タスク化します。タスク化する対象は、メンバーで認識相違がないことをあらかじめ確認したうえで決まります。そうしてタスク化されたアイテムがそのスプリントで消化するバックログ(スプリントバックログ)となります。
平日の決まった時間(午前中、特に朝が一般的)に短い時間でのミーティングを実施し、進捗確認や要求変化の確認を行います。スクラムマスターが全員に「今日は何やりますか」と質問し、その回答を確認することだけが実施される。問題があれば、スクラムマスターは別途会議などを設定することで解決を促しますが、スクラムマスターは、その問題解決意思決定の責務を負います。
スプリント後に実施します。開発されたソフトウェアのレビューを行い、必要に応じてバックログをアップデートします。製品の機能や品質が十分であると判断されるまでスプリントとスプリントレビューを繰り返されます。
いわゆる振り返りです。スプリントの最後に実施します。
「スプリントの成果」にフォーカスが宛てられるスプリントレビューに対して、スプリントレトロスペクティブは「スクラムチームの動き」などの、プロセスにフォーカスされる。例えば、以下の事項について議論されます。
アジャイル開発にはスクラム以外にもエクストリーム・プログラミング(XP)やカンバンなどがあげられます。
今回は、アジャイル開発(アジャイル)とスクラム開発の違い、そしてスクラム開発におけるイベントについて解説しました。
このブログの表示感を調整するためにCSSをカスタマイズしていたが、毎回調べなおしていたので備忘録。
width
div
で頻出。height
div
で頻出。background-color
font-size
px
,em
とか。larger
/smaller
(親要素のフォントサイズとの相対)とか。
color
font-style
normal
/italic
/oblique
とか。
padding
px
,em
指定。margin
px
,em
指定。list-style
ul
)限定。左につくボッチの指定。none
を指定すると消える。border-style
solid
(実線),dashed
(破線)など。border-width
px
, em
指定。border-color
border
border-style
, border-width
,
border-color
を一括で指定できるプロパティ。
ViewのプロパティであるisHighlighted
の更新を受けて、背景色を設定するだけ。
カスタムViewを実装する際に、isHighlighted
をオーバーライドし、didSet
でbackgroundColor
を設定すればいいだけ。こんなん。
override open var isHighlighted: Bool {
didSet {
backgroundColor = isHighlighted ? .lightGray : .blue
}
}
ちなみにisHighlighted
とは、Androidでいうところのstate_pressed
。UIButton
などのUIControlクラスを継承したViewは状態に対して背景を変えるメソッドがあるため、それを使えばタップ中の色を変えることができる。
どうも。どっことです。今回は、iOSのUIViewについて角丸や枠線をつけ方について実装を解説していきたいと思います。
私自身がAndroidエンジニアとしてやってきた時間が長いので、どうしてもAndroid開発者目線となってしまうのですが、Viewを角丸にしたり、枠線をつけたりする実装が本当に面倒くさいです。簡単に見せるだけでも、新規に背景用ファイルを用意してあげる必要があります。
しかし、iOSは角丸や枠線を超簡単に実装できます。本当に羨ましいです。別に悔しくねーし。
UIView
が共通に持っているlayer
という変数に対応するパラメータがあるので、コード上であれば以下に値を設定することで角丸にすることができます。
layer.cornerRadius
枠線の実装も同様で、以下に値を設定することで枠線を付けることができます。
layer.borderWidth
layer.borderUIColor
ちなみに、borderUIColor
は
CGColor
クラスを設定する必要があることに注意してください。
今回は、UIViewを角丸にしたり枠線をつけたりする実装方法を解説しました。特に見せ方を柔らかくする角丸の実装が簡単なのは、iOSはとても良いなと思いました。
どうも。どっことです。今回はActivity
を透明にするための設定について解説します。
完全に透明なActivity
でなにかしら処理する(つまりAPI通信する、DBの更新処理するなどを完全に透明なActivity
で実行する)のはユーザ観点ではよくないですが、例えばダイアログを表示するためだけのActivity
などであれば、背景が見えて別画面に見えてしまうのは不自然であるため、確かに透明である必要があります。そういった、不自然なことを回避する目的でActivity
を透明にする設定を紹介していきたいと思います。
AndroidManifest.xml
で透明にしたいActivity
のtheme
に以下を設定します。
<item name="android:windowBackground">@android:color/transparent</item>
<item name="android:colorBackgroundCacheHint">@null</item>
<item name="android:windowIsTranslucent">true</item>
例えば、上記の設定を適用したtheme
をTransparentActivityTheme
として用意しました。
<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
の透明にしたいActivity
のtheme
に適用します。以下はTransparentActivity
というActivity
に設定したときの例です。
<activity
android:name="com.sample.application.TransparentActivity"
android:theme="@style/TransparentActivityTheme"/>
ただし実際にアプリ内に組み込む場合、注意が必要です。透明なActivity
には危険が含まれているのです。
透明なActivity
に対してorientation
の指定をするとクラッシュします。実装でorientation
を指定したり、AndroidManifest
でのActivity
にscreenOrientation
を指定するとアプリがクラッシュするようです。呼び出し元のActivity
と同じorientation
で制御されるようなので、透明なActivity
を呼び出す時は気をつけてください。
どうも。どっことです。今回はActivity
をダイアログっぽく表示する方法を紹介します。
色々カスタマイズできるのは嬉しいDialogFragment
ですが、実装が面倒で「それっぽければActivity
で十分なんだよなぁ…」と思ってしまった私への、「Activity
だけでDialog
ぽい見た目の画面(というかダイアログ)の作り方」備忘録です。
対象のActivity
に以下のTheme
を設定するだけです。
Theme.MaterialComponents.DayNight.Dialog
DialogFragment
でStyle
として設定される値を、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のお作法的に正直あまりオススメしません。用法用量を守って計画的に。
VBAって、ワークシートとセルの参照、検索が手になじむくらい使えるようになれば、あとはいくらでも融通が利くようになると思うんだ。
Cells(1, 1) = "A1に値を設定します"
Cells(1,"A") = "A1に値を設定します"
Cells(2, 1) = "A2に値を設定します"
Cells(4,"D") = "D4に値を設定します"
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)に値を設定します"
どうも。どっことです。今回ですが、ここ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ではソースネクスト社のウイルスセキュリティソフトをインストールしています。絶対にツッコませない。このソフトでの対象外フォルダ指定手順を紹介して終了したいと思います。
設定
>
ウイルス・スパイウェア対策
>設定
(セクションタイトル下部に導線有)
ウイルス自動検知
タブ >
検査したくないファイル、フォルダを指定する
ファイルやフォルダを追加
で検査対象外のフォルダを追加する。以下にチェックを入れる。
ウイルス自動検知の対象にしない
サブフォルダも含む
どうも。どっことです。毎度おなじみ通信して取得する処理の紹介です。今回はVBAでの実装を備忘録として紹介します。
実装サンプルを以下に載せます。XMLHTTP60
や
DOMDocument60
、JsonConverter
を使うことで、比較的簡単に実装することができます。
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も活用して、業務効率の向上などに役立ててください。
どうも。どっことです。今回は、毎回忘れる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 (アクセスが拒否されました。)
いったいなんだってばよ。
追記。なんか解決した。新規に記事にした。
どうも。どっことです。今回はSQLでのビット演算について備忘録を記載します。
SQLでもビット演算することができます。ビット演算は情報系の学生やエンジニアには基礎的な内容ですが、Androidだけで言えば使うことがあまり多くないかもしれません。
しかし、確かにビット演算による機能実装は行われており、例えばIntent
に付与するflag
の値はこのビット演算により制御されています。
これをもとに考えると、アプリやデータなどの複数の重複した状態を管理するのに向いていそうです。例えばSNSのコメントの「お気に入り」「リブート/リポスト」「いいね」などを管理するとき、booleanで管理するのが一番シンプルな実現方法ですが、最大値7の整数(000〜111)でまとめてしまう、という管理でも実現することができます。これの嬉しいことは、似たようなデータ要素を追加するとき、例えば「ミュート」を追加する場合にも、変数を追加せずに最大桁数を7→15の整数(0000〜1111)に上げることだけで十分実現できるということです。
変数を追加するというのはプログラムのデータ上だけでなくデータベースのテーブルやAPIでのやりとりにも影響してくるので、このようなOn/Offのデータをビット管理するのは拡張性を意識したときに優れていると考えられます。
例
select 1 & 1; 1
select 1 & 0; 0
例
select 1 | 1; 1
select 1 | 0; 1
select 0 | 0; 0
例
select ~0; -1
select ~1; 0
例
select 1<<2; 4
例
select 4>>1; 2
どうも。どっことです。 タイトルの通りですが、諸事情により GitHubPage に移行予定です。 https://mkt120.github.io/ この備忘録に記載の内容を転記しつつ、今後はこちらのページを更新していく予定です。