rokkonet

PC・Androidソフトウェア・アプリの開発・使い方に関するメモ

シェルにおける特殊文字

2022 Jan. 02.

出典
シェルスクリプトのクォーテーションについて理解をまとめる | とものブログ
シェルスクリプトの変数はダブルクォートしなければいけない!という話 - Qiita

シェルにおける特殊文字の種類
; & ( ) | ^ < > ? * [ ] $ ‘ ” ` { } 改行 タブ スペース バックスラッシュ

これらの文字はエスケープしないと特殊な意味を有する文字と解される。

特殊文字をその文字そのものとして扱う方法(エスケープする方法)

1文字単位でのエスケープ

その特殊文字の直前にバックスラッシュを置く。

文字列の中の特殊文字をすべてエスケープ

その文字列をシングルクォーテーション(一重引用符)で囲む。

文字列の中の特定の特殊文字だけをエスケープせず、他はエスケープする

文字列をダブルクォーテーション(二重引用符)で囲む。

エスケープされない特定の特殊文字
ドルマーク($) バッククォート(`) バックスラッシュ(\) 二重引用符(")


シェル findコマンド -nameオプションでのワイルドカード

2022 Jan. 02.

出典 Linux - findコマンドのワイルドカードの使い方|teratail

-nameオプションにはワイルドカード(*)を利用できる。
findコマンドの -nameオプションには必ず引用符を付ける。
引用符を付けずにワイルドカードを使うと、-nameオプションに複数のファイル名が与えられてエラーとなり得る。

android開発 インターネット接続がwifiか、モバイル通信かを判定する

2021 Dec. 28.

引用元 【Android/Kotlin】インターネット接続の確認とNetworkInfo非推奨の解消 - Qiita

ACCESS_NETWORK_STATE権限を許可する

uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="MY.PROJECT">

    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/Theme.MyIsNetworkValid">
        <activity
            android:name=".MainActivity"
            android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>


kotlinコード

MainActivity.kt

import android.content.Context
import android.net.ConnectivityManager
import android.net.NetworkCapabilities
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import MY.PROJECT.databinding.ActivityMainBinding

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        // setContentView(R.layout.activity_main)

        val binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)

        binding.buttonShowNetStatus.setOnClickListener {
            // Grateful for https://qiita.com/taowata/items/4609dcddc3ddb4840fd6

            // ConnectivityManagerの取得
            val cm = getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager

            // NetworkCapabilitiesの取得
            // 引数にcm.activeNetworkを指定し、現在アクティブなデフォルトネットワークに対応するNetworkオブジェクトを渡している
            val capabilities = cm.getNetworkCapabilities(cm.activeNetwork)

            if (capabilities != null) {
                binding.TextViewNetStatus.text = when {
                    capabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI) ->
                        "Wifiに接続しています"
                    capabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR) ->
                        "モバイル通信に接続しています"
                    else -> "その他のネットワークに接続しています"
                }
            } else {
                binding.TextViewNetStatus.text = "インターネットに接続していません"
           }
        }
    }
}

RTL8761BUV チップ bluetooth USBアダプタのarch系manjaro linuxでの利用

2021 Dec. 22.

デスクトップのメニュー -> 設定 -> Bluetoothマネージャー -> 検索
検出されたデバイスをマウス右クリックして接続。

android開発 Snackbarのsnippet

2021 Dec. 11.

出典 [Android & Kotlin] Snackbar で通知とアクションを実装しカスタマイズする

build.bradle(:app)

implementation 'com.google.android.material:material:x.x.x'が必要

plugins {
    id 'com.android.application'
    id 'kotlin-android'
}

android {
    compileSdk 31

    defaultConfig {
        applicationId "YOUR.PACKAGE"
        minSdk 24
        targetSdk 31
        versionCode 1
        versionName "1.0"

        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
    kotlinOptions {
        jvmTarget = '1.8'
    }
    buildFeatures {
        viewBinding true
    }
}

dependencies {

    implementation 'androidx.core:core-ktx:1.7.0'
    implementation 'androidx.appcompat:appcompat:1.4.0'
    implementation 'com.google.android.material:material:1.4.0'
    implementation 'androidx.constraintlayout:constraintlayout:2.1.2'
    testImplementation 'junit:junit:4.+'
    androidTestImplementation 'androidx.test.ext:junit:1.1.3'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
}


MainActivity.kt
package net.sytes.rokkosan.myapplication

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import com.google.android.material.snackbar.Snackbar
import net.sytes.rokkosan.myapplication.databinding.ActivityMainBinding

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        // setContentView(R.layout.activity_main)

        val binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)

        val rootLayout = binding.root
        val snackbar = Snackbar.make(rootLayout , "Hello Snackbar", Snackbar.LENGTH_LONG)
        snackbar.show()
    }
}