急げ! あと数時間しかないぞ!

持ってる知り合いを探して、クーポン発行をお願いする、なのか?!
詳細はよう分からんがお得なはず!!
急げ! あと数時間しかないぞ!

持ってる知り合いを探して、クーポン発行をお願いする、なのか?!
詳細はよう分からんがお得なはず!!
ずっと、Nexus/Pixelシリーズの、素のAndroid OS を使ってきましたが、 今回、ドコモ版のGalaxy S8を周回遅れで購入しましたが、使わないベンダーやキャリアのアプリが頻繁に通知を送ってきます。
後付なおせっかい機能です。
Androidの煩わしさの原因に見えたりします。
以下、自己責任の不具合覚悟の方のみ。
OS OTAアップデート当たらないかもしれません。 キャリア依存。
// パッケージ名のリストをみる。
adb shell pm list packages -s
無効化できないアプリは、もう強制的に消してしまいます。
// パッケージを強制的に消す
adb shell pm uninstall -k --user 0 com.nttdocomo.android.applicationmanager
adb shell pm uninstall -k --user 0 com.nttdocomo.android.dhome
adb shell pm uninstall -k --user 0 com.nttdocomo.android.store
adb shell pm uninstall -k --user 0 jp.co.nttdocomo.lcsapp
adb shell pm uninstall -k --user 0 com.nttdocomo.android.voiceeditor (ドコモ文字編集)
adb shell pm uninstall -k --user 0 com.sec.android.inputmethod.iwnnime.japan
素のAndroid(Nexus/Pixelシリーズ)では表示されてた「パッケージ名」は、それ以外の端末では、表示できないようにされています。
ので、アンインストールしたい「アプリ名」が分かっていても、「パッケージ名」との紐づけができず困ったりします。

adb badge を使ってやるのも面倒なので、簡単にアプリ内から、「アプリ名」-「パッケージ名」のリストを見ましょう。
inline fun Context.listPackages() {
val packages = packageManager
.getInstalledApplications(PackageManager.GET_META_DATA)
.sortedBy { it.packageName }
packages.forEach {
println(
"%s %s %s".format(
it.packageName,
it.loadLabel(packageManager),
it.uid
)
)
}
}
OSアップデートや国内独自機能(NFC/トルカ?)など不具合が起こり始めるのだろうが、それを差し引いても快適で。
格安の素のAndroidを国内キャリアはなぜ出さないのかが謎。
Androidに関しては「付加価値を」とか「他社と違い」てなフレーズを使ったビジネスするしか?
いまどきのAndroid端末ってアプリのパッケージ名見れないのですか?
Package Info - Apps on Google Play
きもいですよ。
こう書いていたり、
minSdkVersion rootProject.ext.minSdkVersion
targetSdkVersion rootProject.ext.targetSdkVersion
こう書いてたり、
dependencies {
implementation "com.android.support:appcompat-v7:$rootProject.supportLibraryVersion"
implementation "com.android.support:support-v4:$rootProject.supportLibraryVersion"
implementation "com.android.support:design:$rootProject.supportLibraryVersion"
「変数を使ってまとめました!」とか言ってるけど。
きもいですよ。
そもそも、定義の位置がヘボいのですよ。
以下のように書いてました。
root/build.gradle
ext {
minSdkVersion = 24
targetSdkVersion = 27
compileSdkVersion = 27
buildToolsVersion = '27.0.2'
supportLibraryVersion = '27.1.0'
firebaseVersion = '11.8.0'
}
これのせいで、「${rootProject.firebaseVersion」とか「rootProject.ext.***」とかダラダラ書く羽目になるようです。
stackoverflow も今やゴミのだらけでどれが正しいのか分かりづらいです。
root/build.gradle
buildscript {
ext.buildConfig = [
'compileSdk': 27,
'minSdk': 24,
'targetSdk': 27
]
ext.versions = [
'supportLibrary': '27.1.0',
'kotlin': '1.2.30',
'okhttp': '3.10.0',
'retrofit': '2.3.0',
'kotshi': '1.0.1',
'dagger': '2.15',
]
ブロック buildscript {} 内に map ですっきり記述しています。
module/build.gradle
android {
compileSdkVersion buildConfig.compileSdk
defaultConfig {
minSdkVersion buildConfig.minSdk
targetSdkVersion buildConfig.targetSdk
versionCode buildConfig.versionCode
versionName buildConfig.versionName
}
}
// ....
dependencies {
implementation "org.jetbrains.kotlin:kotlin-stdlib:${versions.kotlin}"
implementation "com.android.support:appcompat-v7:${versions.supportLibrary}"
implementation "com.android.support:support-v4:${versions.supportLibrary}"
implementation "com.android.support:design:${versions.supportLibrary}"
implementation "com.google.firebase:firebase-core:${versions.firebase}"
implementation "com.google.firebase:firebase-auth:${versions.firebase}"
定形なテンプレートとして使えます。
参照する際は、「rootProject」とか「ext」の単語は不要です。
関連の以下も必須だろうと思います。
👉 【Gradle Version Catalog】libs.versions.toml キー名の形式 camelCase vs kebab-case
👉 【無料】使わなくなったスマホをライブカメラにしておじいちゃんを監視したい
GoProはパソコンとWiFi接続で接続できますよね。

このとき、
10.5.5.9 をルータとしたローカルネットワークとなり、
パソコン側は、10.5.5.10? のアドレスが割り振られます。



非SSL通信です。
今、このページを見ているパソコンをGoProにWiFi接続すると
以下のただのリンクをタップして操作できます。
まず、ストリーミングを(再)起動して、
http://10.5.5.9/gp/gpControl/execute?p1=gpStream&a1=proto_v2&c1=restart
録画開始して、
http://10.5.5.9/gp/gpControl/command/shutter?p=1
そして、録画停止。
http://10.5.5.9/gp/gpControl/command/shutter?p=0
これだけで、録画開始・停止はできるのですが、ライブ画像を見たいところです。
ffplay (ffmpeg) で見ることができます。
ffplay -loglevel panic -an -fflags nobuffer -f:v mpegts -probesize 8192 udp://:8554
実際には、ストリーミング接続を保持させる処理が必要となります。
#!/usr/bin/env python3
import sys
import socket
from urllib.request import urlopen
import subprocess
from time import sleep
import datetime
import signal
import http
import multiprocessing
# GPH 6/0.160
GOPRO_IP = "10.5.5.9"
UDP_PORT = 8554
KEEP_ALIVE = 2.5
MESSAGE = "_GPHD_:0:0:2:0.000000"
URL_PREFIX = f"http://{GOPRO_IP}/gp/gpControl"
URL_STREAM = f"{URL_PREFIX}/execute?p1=gpStream&a1=proto_v2&c1=restart"
URL_RECORD_START = f"{URL_PREFIX}/command/shutter?p=1"
URL_RECORD_STOP = f"{URL_PREFIX}/command/shutter?p=0"
CMD_VIEW = f"ffplay -loglevel panic -fflags nobuffer -f:v mpegts -probesize 8192 udp://:{UDP_PORT}"
def live():
urlopen(URL_STREAM).read()
subprocess.Popen(CMD_VIEW, shell=True)
multiprocessing.Process(target=keep_alive).start()
print("Press Ctl+C to quit.")
print("Press ENTER to start/stop recording.")
on = False
while True:
input()
on = not on
record(on)
def keep_alive():
while True:
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.sendto(bytes(MESSAGE, "utf-8"), (GOPRO_IP, UDP_PORT))
sleep(KEEP_ALIVE)
def record(on):
urlopen(URL_RECORD_START if on else URL_RECORD_STOP).read()
print(f"Record {str(on)} {datetime.datetime.today()}")
def quit_gopro(signal, frame):
sys.exit(0)
if __name__ == '__main__':
signal.signal(signal.SIGINT, quit_gopro)
live()
パソコン・スマホ共にアプリが公式に公開はされていますが、サクッと見たいですよね。
いろんな使い方ができそうです。
👉 【無料】使わなくなったスマホをライブカメラにしておじいちゃんを監視したい
Live Hero5 Session with WiFi - GOPRO SUPPORT HUB
いい記事があったので。
Room 🔗 RxJava – Google Developers – Medium
まずは、Room で Dao.
@Query(“SELECT * FROM Users WHERE id = :userId”)
User getUserById(String userId);
ここまでで問題なのは、
1. 同期呼び出しでブロッキング。
2. データ変更時に再度呼び出す必要がある。
ということで、RxJava を使いたくなります。
Room は RxJava2.x に対応しています。

Adding Components to your Project | Android Developers
どのように使うのか?
@Query(“SELECT * FROM Users WHERE id = :userId”)
Maybe<User> getUserById(String userId);
1. 該当ユーザがなければ、何も返さずに complete。
2. 該当ユーザがあれば、onSuccess となり complete。
3. Maybe が complete されたあとにユーザー情報が更新されても何もしない。
@Query(“SELECT * FROM Users WHERE id = :userId”)
Single<User> getUserById(String userId);
1. 該当ユーザがなければ、何も返さず onError(EmptyResultException)。
2. 該当ユーザがあれば、onSuccess。
3. Single が complete されたあとにユーザー情報が更新されても何もしない。
@Query(“SELECT * FROM Users WHERE id = :userId”)
Flowable<User> getUserById(String userId);
1. 該当ユーザはなければ、何も返さず emit もされない。当然、onNext も onError も呼ばれない。
2. ユーザが存在すれば、onNext。
3. ユーザ情報が更新されるたびに、自動で emit されるので、UI上を最新データに更新させることが可能になる。
これだけ数行でデータベース、非同期処理を簡潔明快に説明できる Room x RxJava の組み合わせ。
おまけに Observable から細分化された RxJava2.x の主役たちの使い方も理解することができます。
素晴らしいですよね。