TAKOYAKING’s blog 一覧

TAKOYAKING’s blog

たこ焼き系

SourceTreeのコミット欄にプロフィール画像を表示する (Gravatar)

f:id:TAKOYAKING:20200213204439p:plain
こんな感じでSource Treeにプロフィールアイコンを表示させたかったので
git - How to set up your avatar in SourceTree.app? - Stack Overflow
ここを参考にして表示させました。

環境

iMac2019

やり方

  1. Gravatar - Globally Recognized Avatars ここでプロフィール画像を設定
  2. Source Treeを一旦閉じる
  3. ~/Library/Application Support/SourceTree/ImageCacheの中にあるファイルを削除(rm RepoAvatarURLCache)

感想

今回BitbucketからGithubに移行したときに、新しいメールアドレスが必要だったので、ついでに設定してみました。

Unityを2019.31f1にアップデートするとエラーが出た (ArgumentException: Requested value 'X86' was not found)

Unityを2019.31f1にアップデートすると以下のようなエラーが出ました

ArgumentException: Requested value 'X86' was not found.
ArgumentException: Requested value 'X86' was not found.
System.Enum+EnumResult.SetFailure (System.Enum+ParseFailureKind failure, System.String failureMessageID, System.Object failureMessageFormatArgument) (at <437ba245d8404784b9fbab9b439ac908>:0)
System.Enum.TryParseEnum (System.Type enumType, System.String value, System.Boolean ignoreCase, System.Enum+EnumResult& parseResult) (at <437ba245d8404784b9fbab9b439ac908>:0)
System.Enum.Parse (System.Type enumType, System.String value, System.Boolean ignoreCase) (at <437ba245d8404784b9fbab9b439ac908>:0)
System.Enum.Parse (System.Type enumType, System.String value) (at <437ba245d8404784b9fbab9b439ac908>:0)
GooglePlayServices.AndroidAbis.EnumValueStringToULong (System.Type enumType, System.String enumValueString) (at <0ea28fee5338451fbecc93319b91e068>:0)
GooglePlayServices.AndroidAbis.get_Current () (at <0ea28fee5338451fbecc93319b91e068>:0)
GooglePlayServices.PlayServicesResolver.PollAndroidAbis () (at <0ea28fee5338451fbecc93319b91e068>:0)
System.Reflection.MonoMethod.Invoke (System.Object obj, System.Reflection.BindingFlags invokeAttr, System.Reflection.Binder binder, System.Object[] parameters, System.Globalization.CultureInfo culture) (at <437ba245d8404784b9fbab9b439ac908>:0)
Rethrow as TargetInvocationException: Exception has been thrown by the target of an invocation.
System.Reflection.MonoMethod.Invoke (System.Object obj, System.Reflection.BindingFlags invokeAttr, System.Reflection.Binder binder, System.Object[] parameters, System.Globalization.CultureInfo culture) (at <437ba245d8404784b9fbab9b439ac908>:0)
System.Reflection.MethodBase.Invoke (System.Object obj, System.Object[] parameters) (at <437ba245d8404784b9fbab9b439ac908>:0)
System.Delegate.DynamicInvokeImpl (System.Object[] args) (at <437ba245d8404784b9fbab9b439ac908>:0)
System.MulticastDelegate.DynamicInvokeImpl (System.Object[] args) (at <437ba245d8404784b9fbab9b439ac908>:0)
System.Delegate.DynamicInvoke (System.Object[] args) (at <437ba245d8404784b9fbab9b439ac908>:0)
UnityEditor.EditorApplication.Internal_CallUpdateFunctions () (at /Users/builduser/buildslave/unity/build/Editor/Mono/EditorApplication.cs:310)

環境

  • iMac 2019
  • Unity 2019.2.16f -> Unity 2019.31f1

解決方法

android - ArgumentException: Requested value 'X86' was not found - Stack Overflow
ここに書いてありました。
google play serviceが古いようなので最新にする必要があるみたいです。

  1. PlayServicesResolverを丸ごと削除
  2. Releases · googlesamples/unity-jar-resolver · GitHub ここから最新のをダウンロード (Download hereと書いているのでそこのリンクに行きます。)
  3. Importする

これでいけるかなと思ったのですが、timeline がなんとかかんとかのエラーが出ました。
Window > Package Mangerを開くとtimelineの所に赤いビックリマークが付いていたので
timelineをupdateしました
エラーは消え去りました。

感想

2019.3は結構UIのデザインが変わって、慣れるまで時間がかかりそう・・・

Rust: Traitの匿名の引数 (Anonymous trait parameter)は廃止されていた

関連型が必要になる状況 | Rust by Example
このサンプルを行っていた時に

trait Contains<A, B> {
    fn contains(&self, &A, &B) -> bool;
}

// expected one of `:`, `@`, or `|`, found `)`

が出て動作しませんでした。


https://users.rust-lang.org/t/solved-example-of-rust-by-example-can-not-be-built-with-rust-2018-edition/24528/3
この記事によると
TraitのAnonymous trait parameterはもう廃止されているとのことでした。

正しくは

trait Contains<A, B> {
    fn contains(&self, _: &A, _: &B) -> bool;
}

公式ガイドにも書いてありました。2015年版はできたみたいですが、2018年版はできなくなったようです。
No more anonymous parameters - The Edition Guide
以下例を抜粋

// 廃止
trait Foo {
    fn foo(&self, u8);
}


// OK
trait Foo {
    fn foo(&self, baz: u8);
}

Rustでmodはネストできない

ファイルの階層構造 | Rust by Example

modの使い方を練習していたのですが、サンプルではmy/mod.rsにもmodを書いて階層化をしていたので、パスのようにmod my::nestedでnestedファイルのfunctionだけ呼びたい場合、できるかどうか試してみましたが、できませんでした。

やりたいこと

mod my::nested

のように階層化したmodをやりたい

// mod my::nested; // <= 不可
mod my

fn function() {
    println!("called `function()`");
}

fn main() {
    my::nested::function();
}
$ tree .
.
|-- my
|   |-- mod.rs
|   `-- nested.rs
`-- split.rs

結果

できませんでした。

rust - How do 'use' and 'mod' work when there are nested source directories? - Stack Overflow
このStackoverflowに書いてある通り、できないらしいです。

You cannot use :: in a mod declaration.
You need a file src/book/mod.rs, containing:

感想

Rust初心者なので、mod のネストの必要性がそもそもあるかどうかはわかりません・・・

UnityエディタでPREVIEW PACKAGES IN USE が上のバー出る時

f:id:TAKOYAKING:20200130132640p:plain

いつからか気付いた時にはこのような「REVIEW PACKAGES IN USE」が上のバーに出るようになってました。
気持ち悪いので直したいと思います。

環境

Unity2019.2
Mac

注意

Gitのようなバージョン管理していない場合は注意です。

方法

What is "PREVIEW PACKAGES IN USE" - Unity Answers
方法はこれに書いてある通りです。

  1. Window > Package Manager
  2. Reset Packages to defaults
Window > Package Manager

f:id:TAKOYAKING:20200130132646p:plain

するとこんな画面が出てきます。
f:id:TAKOYAKING:20200130132659p:plain

Reset Packages to defaults

があるのでこちらを押します。

すると以下のような警告文が出ます。
f:id:TAKOYAKING:20200130132707p:plain

OKします!

するとPackages/manifest.json
に変更箇所が記載されます(Git管理必須)

PREVIEW PACKAGES IN USE という文字が消えました!
f:id:TAKOYAKING:20200130132714p:plain

備考

UnityAnalitycsも削除されてしまったのでまた入れ直しました。

もうやってしまったあとなのでPreview版と書いてあるものだけを手動で取り除いてもいいような気がします。

感想

なんかスッキリした!

Rust 範囲のシンタックス 「...」VS 「..=」

match | Rust by Example
このサイトでパターンマッチの練習していた時に範囲を表す記法で...を使うと警告が出ました

fn main() {
    let number = 13;

    println!("Tell me about {}", number);
    match number {
        // 単一の値とのマッチをチェック
        1 => println!("One!"),
        // いくつかの値とのマッチをチェック
        2 | 3 | 5 | 7 | 11 => println!("This is a prime"),
        // 特定の範囲の値とのマッチをチェック
        13...19 => println!("A teen"),
        // その他の場合の処理
        _ => println!("Ain't special"),
    }
}
warning: `...` range patterns are deprecated
help: use `..=` for an inclusive range

この例だと13...19は13から19までを表すのですが、13..19と少し違いがわかりづらいです。
13...19は19を含みますが
13..19は19を含みません。

なので19を含む場合は代わりに13..=19と表すことで=がついているので19が含むことが明示できるようになってます。

個人的には..=はとても見やすいなと思います。境界値はいつも含むか含まないか、不安になるのですが、これだと今後不安になることはなくなると思います。

議論されていた記事

`...` vs `..=` for inclusive ranges - ideas (deprecated) - Rust Internals
この記事に書いてありました。

  1. 覚えずらい
  2. We do the opposite of Ruby (because “more dots more numbers” seems strictly better, but still). (Rubyが何とかかんとか...)
  3. タイプミスしやすい
  4. コードが間違っていないかの確認がしやすい

for文での使用例

19を含まない例

for i in 13..19 {
    println!("{}", i);
}

// output
13
14
15
16
17
18

19を含む例

for i in 13..=19 {
    println!("{}", i);
}

// output
13
14
15
16
17
18
19

注意

...は非推奨ですがmatchの時のみ記述できます。
forの時で使用するとエラーが出ます。

fastlaneでiOSビルドをしてiTunesConnectへアップロードする (個人開発)

apps.apple.com

fastlaneを使ってiTunes Connectへmetadataのアップロードを自動化する (個人開発用) - TAKOYAKING’s blog
これの続きで前回はメタデータのみのアップロードだけを行ったので、今回はiOSipaを生成してiTunesConnectへアップロードするというのをやりました

環境

今回やること

  • ビルドしてipaの作成
  • ipaをiTunesConnectへアップロード

metaデータのアップロードとビルドファイルをアップロードの処理を分けた理由

ビルドファイルをアップロードしてもiTunesConnectへ反映されるまで15分くらいあるので、先にビルドファイルだけアップロードして、反映までの間にリリースノートを書いたりしたかったので、分けました。
個人開発なのでこれでいいかなと思いました!

最終的なソースコード

Fastfile

platform :ios do
    desc "Description of what the lane does"
    lane :build do
        # add actions here: https://docs.fastlane.tools/actions
        gym(
            workspace: "/Your/Path/Unity-iPhone.xcworkspace",
        )
    end

    desc "Description of what the lane does"
    lane :release do
        # add actions here: https://docs.fastlane.tools/actions
        deliver(
            submit_for_review: false, # Appleの審査に出すかどうか
            force: true, # If set to true, no HTML report
            skip_screenshots: true, # 時間節約
            skip_binary_upload: false, # ipaアップするかどうか
            copyright: "#{Time.now.year} TAKOYAKING",
            automatic_release: true, # Appleの審査後にこのバージョンを自動的にリリースする
            # metadata_path: "./metadata"
        )
    end
end

after_all do |lane, options|
    slack(
        default_payloads: [],
        message: "#{lane} #{options} All OK!",
    )
end

error do |lane, exception, options|
    slack(
        message: exception.message,
        success: false
    )
end

Appfile

app_identifier ENV["APP_IDENTIFIER"] # The bundle identifier of your app
apple_id ENV["APPLE_ID"]  # Your Apple email address

.env.default

SLACK_URL="https://hooks.slack.com/services/your/path"
APP_IDENTIFIER="com.foo.bar"
APPLE_ID="youremail@example.com"
# FASTLANE_APPLE_APPLICATION_SPECIFIC_PASSWORD=""
SPACESHIP_2FA_SMS_DEFAULT_PHONE_NUMBER="+81 your phone number"

# もし期限切れたら -> fastlane spaceauth -u youremail@example.com
FASTLANE_SESSION=""

これも前回の構成と同じで基本的に大切な設定情報はenvファイルに記述して、コミットしないことにします。

手順

  1. Fastfileを記述する
  2. XcodeのPreferencesのCommand Line Toolsにバージョンを指定する
  3. 設定情報の記述(Appfile, env)と認証
  4. 実行

Fastfileを記述する

今回のlaneは

  • build
  • release

の2種類で
buildはXCodeでビルドしてipaを生成するlaneです。
releaseはiTunesConnectへビルドしたipaをアップロードするビルドです。
今回も成功したらslackへ通知するので、after_allでslackへの記述も行います。

buildのlaneを書くときにはまったこと
Project file is not a project file, must end with .xcodeproj

が出てビルドできなかったです。
Fastlaneにはxcodeproj用とxcworkspace用2つのオプションがあるので、間違えずに、指定してあげる必要があります。

僕のunityではxcworkspaceを使用していたのでworkspaceを指定してあげないといけないです。

gym(
            workspace: "youpath/Unity-iPhone.xcworkspace",
        )

xcodeprojならこちらです。

gym(
            project: "youpath/Unity-iPhone.xcodeproj",
        )

違いを発見するのが難しかったです。

XcodeのPreferencesのCommand Line Toolsにバージョンを指定する

もし指定されているなら大丈夫なのですが、指定されていないとbuildできません。以下のようなメッセージが出るはずです。

Unable to locate Xcode. Please make sure to have Xcode installed on your machine

下のStackOverflowの通り、Xcodeの設定でCommand Line ToolsにXcodeVersionを指定してあげるだけで解決しました!
ios - Unable to locate Xcode. Please make sure to have Xcode installed on your machine - Stack Overflow


設定情報の記述(Appfile, env)と認証

Appfileとenvファイルには前回で行った設定

  • iTunesConnecへの設定情報
  • slackのurl

に加え、認証の設定情報も必要となります。

認証

認証の設定情報がなくてもビルドは可能なのですが、iTunesConnecへアップロードができません。
パスワードを聞かれると思いますが、認証を行わないと何を入れても、NGとなります。

Continuous Integration - fastlane docs
上のサイトで認証は最終的にはFASTLANE_SESSIONに生成された値を入れことになるのですが、2つ?の方法があるっぽいです。
1つ目は暫定的な方法で月一にもう一度値を生成し直す方法
2つ目はおそらく長期的な方法でCI用。

1つめの方法は
fastlane spaceauth -u [yourmail@mail.com]
で生成される値を環境設定ファイルにFASTLANE_SESSION="生成された値"
として貼り付ける方法
この方法は月に1度生成し直さないといけないみたいです。

2つ目は
App用パスワードを作成して、
FASTLANE_APPLE_APPLICATION_SPECIFIC_PASSWORDに入れて、
FASTLANE_SESSIONに同じように定義する方法です。
これは月1の制限がないのかどうか試していないので不明ですが、多分不要なのではないでしょうか
以下を参考
fastlaneでAppleIDの2段階認証に詰まったときにやったこと - Qiita

他にもこんなやり方も参考
fastlane/credentials_manager at master · fastlane/fastlane · GitHub


とりあえず1つ目の方ほでやりました。
理由はApp用パスワードを作成したら、iPadとかにも長ったらしい値を入れないといけないのかもと思ったので、月一程度だったら個人開発なので別にいいかと思ってとりあえず、1つ目にしました。

2段階認証の初期値をsmsにする

これはお好みですが、もし初期設定をsmsにしたい場合はSPACESHIP_2FA_SMS_DEFAULT_PHONE_NUMBERを環境変数にセットする
fastlane/Authentication.md at master · fastlane/fastlane · GitHub


PACESHIP_2FA_SMS_DEFAULT_PHONE_NUMBER="+81 090 123 4567"

感想

一応これで前回の記事と合わせて、ビルドして、metaデータとipaをiTunesConnecへアップロードするという流れができました。
個人開発の作業の流れとしては

  • ビルドする
  • ビルドしたのをアップロードする
  • アップロードが反映されるまでにリリースノートを書いてアップロードする
  • 反映されていたら申請

になってます。
使ってみると結構便利です。あとは自動翻訳を残すのみです。