【Mac】ホームディレクトリ内のアクセス権をリセットする方法

ローカルなLAN内で大容量な母艦デスクトップにラップトップやその他クライアントからファイル置場として使おうと「共有」まわりを触っていたら固まって何もできなくなった。

Chrome も開かない。

Android Studio 他アプリのログを見る限り、「ファイルが保存できません」的なエラーメッセージだらけ。

何なのでしょう?!

リセットしたい

以下、Apple公式ページに今回の症状にピッタリな解決策がありました。

「アクセス権をリセットする」が解決手順となります。

👉 ホームフォルダの中のアイテムのアクセス権を変更した後で起きる問題を解決する - Apple サポート 

この手順をそのまま実行したら復活しました!!

しかし、意味が分からないままやってるけど何なのか。

やっていること

以下のように覚えやすくシンプルに理解しました。

1. ログインしているユーザーフォームディレクトリ内を再帰的に読み/書き可能にする。
2. ターミナルから diskutil resetUserPermissions を使って拡張アクセス権をリセットしてOS再起動。

詳細以下ページが解決のきっかけになりました。ありがとうございます。

👉 コマンド ls -l で表示されるアクセス権「+」を消す手順 
👉 Mac: ファイルの拡張属性を一気にはぎ取る - Qiita 
👉 ls -l コマンドで@が表示されたら念のため ls-le を使おう 


Related Categories :  applemac


Navigation Component がタブごとのバックスタックを実装すると思える理由

公開されているGoogleサンプルにて

下部タブごとのバックスタック実装。



自然だと思う。

コード内コメントを見ていると

👉 architecture-components-samples/NavigationExtensions.kt at master · android/architecture-components-samples 

This sample is a workaround until the Navigation Component supports multiple back stacks.

このサンプルは、ナビゲーションコンポーネントが複数のバックスタックをサポートするまでの回避策です。

この拡張関数周りのコードはコンポーネント内に内包されることになるのだろう。

が、しかし、Fragment のライフサイクルに依存しながら動くMVVMのスタイルでは、そのコンテンツデータの読み込みは再度行われることになるはず。

はっきり衝突してないか、

AAC と MVVM。

このサンプルでは、Fragment のみの実装なので複数のバックスタックがまともに動いているが、実際の現場ではそうはいかないはず。


Retorofit + JSON には「Kotlin Serialization Converter」がよい。

Retrofit は非常に有名なSquare製のJavaで書かれたAndroid 向け HTTP クライアントです。

👉 square/retrofit: Type-safe HTTP client for Android and Java by Square, Inc. 

その内部には Kotlin Serialization はサポートされていませんが、オブジェクトのシリアル化のためのコンバータファクトリを追加することができます。独自のコンバータファクトリを作成することもできますし、Jake Wharton が書いたものを使うこともできます。

👉 JakeWharton/retrofit2-kotlinx-serialization-converter: A Retrofit 2 Converter.Factory for Kotlin serialization. 

Retrofit2 Converter.Factory を利用するには、ライブラリ dependencies に追加したあと、Retorofit インスタンス生成時に、Extension Function である asConvertFactory を使ってそれを追加します。


val contentType = "application/json".toMediaType()

val retrofit = Retrofit.Builder()
 .baseUrl("https://www.example.com")
 .addConverterFactory(Json.asConverterFactory(contentType))
 .build()

簡単ですね!

ちなみに、.toMediaType() とは、


okhttp3.MediaType.Companion.toMediaType

です。

👉 「Kotlinx Json」の登場でサードパーティJSONライブラリは不要となる。 


「Kotlinx Json」の登場でサードパーティJSONライブラリは不要となる。

JSONのライブラリ何を使ってますか?

👉 square/moshi: A modern JSON library for Kotlin and Java. 
👉 FasterXML/jackson: Main Portal page for the Jackson project 
👉 google/gson: A Java serialization/deserialization library to convert Java Objects into JSON and back 

これらは、Javaベースで書かれています。Kotlin は100%相互運用可能ですが微妙に期待しない挙動をします。


data class User(
    val name: String,
    val email: String,
    val age: Int = 13,
    val role: Role = Role.Viewer
)

enum class Role { Viewer, Editor, Owner }


{
    "name" : "John Doe",
    "email" : "[email protected]"
}


class JsonUnitTest {

    private val jsonString = """
            {
                "name" : "John Doe",
                "email" : "[email protected]"
            }
        """.trimIndent()

    @Test
    fun gsonTest() {
        val user = Gson().fromJson(jsonString, User::class.java)

        assertEquals("John Doe",user.name)
        assertEquals(null, user.role)
        assertEquals(0, user.age)

//      User(name=John Doe, 
//           [email protected], 
//           age=0, 
//           role=null)

    }

}

デフォルト値が期待通りにパースできません。

kotlinx.serialization が登場!!

JetBrains産です。間違いないでしょう。



👉 Kotlin/kotlinx.serialization: Kotlin multiplatform / multi-format serialization 

- クロスプラットフォーム
- 非リフレクション
- アノテーション @Serializable
- Kotlin v1.3.30+


@Serializable
data class User(
    val name: String,
    val email: String,
    val age: Int = 13,
    val role: Role = Role.Viewer
)

enum class Role { Viewer, Editor, Owner }

class JsonUnitTest {

    private val jsonString = """
            {
                "name" : "John Doe",
                "email" : "[email protected]"
            }
        """.trimIndent()

    @Test
    fun jsonTest() {
        val user = Json.parse(User.serializer(), jsonString)

        assertEquals("John Doe", user.name)
        assertEquals(Role.Viewer, user.role)
        assertEquals(13, user.age)

//      User(name=John Doe, 
//           [email protected], 
//           age=13, 
//           role=Viewer)

    }
}

Gson では無視されていたデフォルト値がきちんと使用されます。

以下のセットアップでどうぞ。


buildscript {
    ext.kotlin_version = '1.3.60'
    repositories { jcenter() }

    dependencies {
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
        classpath "org.jetbrains.kotlin:kotlin-serialization:$kotlin_version"
    }
}


apply plugin: 'kotlin' 
apply plugin: 'kotlinx-serialization'


repositories {
    jcenter()
}

dependencies {
    implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
    implementation "org.jetbrains.kotlinx:kotlinx-serialization-runtime:0.14.0" // JVM dependency
}

👉 Kotlinx Json vs Gson - Juraj Kušnier - Medium 



GoPro 分割された動画ファイルの命名規則



対象製品
- HERO7 (White、Silver、Black)
- HERO6 Black
- Fusion
- HERO (2018)
- HERO5 Black
- HERO5 Session
- HERO4 Black & Silver
- HERO Session / HERO4 Session
- HERO (2014)
- HERO3+
- HERO3
- HD HERO2


👉 GoProカメラのファイルの命名規則 

GHzzxxxx.mp4

ということですが、なぜにファイル名による並び替えが可能な

GHxxxxzz.mp4

にしなかったのか?

何らかの理由はあったのだろうと思うけども。

一括で変更する

スクリプトで一括で変更します。

以下動画のように使います。




Related Categories :  Recommended