20201117のMacに関する記事は2件です。

Apple Silicon 動作確認記 (随時更新)

Apple M1チップ搭載13インチMacBook Proを購入したので、各アプリケーションの対応状況を確認していきますー。
ソフトウェアエンジニアなので、その周りのアプリケーションを中心に。
対応状況は、あくまでその時点までの確認です。
使っていたら、別の状況が見えてくるかもしれませんね!

では、書いていきます。

Chrome 動く。

今この記事を書いているのも、M1 + Chrome。問題なく動作しています。
最初にRosettaをインストールしますか?って聞かれますが、すぐにインストールされました。
スクリーンショット 2020-11-17 10.35.26.png

Google日本語入力

個人的に大好きなのでインストール。問題なく動作しています。

iTerm2 動く

問題なし。

Node.js (v14.15.1)

Hello Worldは問題ない。

ito@itoutakeshinoMacBook-Pro ddd % cat index.js
console.log("hello")
ito@itoutakeshinoMacBook-Pro ddd % node index.js
hello
ito@itoutakeshinoMacBook-Pro ddd %

Docker Desktop 動かない

動かない。やばい。
image.png

Java (AdoptOpenJDK build 11.0.9+11) 動く

動く。

ito@itoutakeshinoMacBook-Pro ~ % java --version
openjdk 11.0.9 2020-10-20
OpenJDK Runtime Environment AdoptOpenJDK (build 11.0.9+11)
OpenJDK 64-Bit Server VM AdoptOpenJDK (build 11.0.9+11, mixed mode)
ito@itoutakeshinoMacBook-Pro ~ % cat Hello.java
public class Hello {
  public static void main(String... arg){
    System.out.println("hello");
  }
}
ito@itoutakeshinoMacBook-Pro ~ % javac Hello.java
ito@itoutakeshinoMacBook-Pro ~ % java Hello
hello

.Net (Core 5.0.100) 動く

動く。

ito@itoutakeshinoMacBook-Pro dotnetInspect % dotnet --version
5.0.100
ito@itoutakeshinoMacBook-Pro dotnetInspect % cat Program.cs
using System;

namespace myApp
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("hello");
        }
    }
}
ito@itoutakeshinoMacBook-Pro dotnetInspect % dotnet run
hello

VirtualBox (6.1.16 r140961 (Qt5.6.3)) 動かない

空のVMを起動しようとしましたが、ダメ。
image.png

golang (1.15.5) 動く

amd64って言っているから、Rosetta上で動いているのだと思うのですが、動く。

ito@itoutakeshinoMacBook-Pro ~ % go version
go version go1.15.5 darwin/amd64
ito@itoutakeshinoMacBook-Pro ~ % cat hello.go
package main

import "fmt"

func main() {
  fmt.Printf("hello")
}
ito@itoutakeshinoMacBook-Pro ~ % go run hello.go
hello%

Rust (動かない)

ワークアラウンドがありそうだが、サイトで公開されているインストール手順がダメ。

ito@itoutakeshinoMacBook-Pro ~ % curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
rustup: unknown CPU type: arm64

Visual Studio Code (Version: 1.51.1)

起動する。どこまで動けば動くって言えるのかはおいておいて。
結果、Electronが起動すると期待できる。
image.png

というわけで、、、仮想環境系がダメっぽい。
今どきはソフトウェア開発するのに仮想環境はいることが多いと思うので、、、今、Apple Siliconに凸するのは、、、どうだろう?という感じです。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

バイナリファイルのサンドボックス化

はじめに

App storeで自作アプリを公開しようと思ったら色々手こずったことについての備忘録。そのうち誰かの役に立つかもと思い、書き留めておく。

App storeで自作アプリを公開するには、アプリをサンドボックス化しなくてはならないとのこと。特に手こずったのは、アプリに埋め込むサードパーティ製のバイナリファイルもサンドボックス化しなくてはならなかった点だ。

サンドボックス化とは

要するにサンドボックス化とは、アプリの機能を制限する仕組みのこと。サンドボックス化していないアプリは、アプリユーザーができることは何でもしてしまい得る。アプリにセキュリティホールがあって、悪意ある第三者がこれを利用して、アプリを使って任意の機能を何でも実行できてしまう懸念がある。

アプリのサンドボックス化

アプリのサンドボックス化はそれほど難しくない。Xcodeでプロジェクトアイコンを選択して、「Target」を選択した状態で、Capabilityタブを選び、App Sandboxをオンにして、アプリが真に必要とする機能だけをオンにしてやれば良い。デフォルトではこれら機能は全てオフになっている。

設定項目は、以下のようだ。

image.png

ここで設定してやれば、あとはビルドするだけでアプリはサンドボックス化される。

ただしサンドボックス化すると、例えば、アプリが、アプリバンドル内にファイルを一時保存するといったことができなくなる。もしこのような処理をしているならコードを書き換える必要がある。この場合特定のディレクトリを、一時ファイルの置き場として利用することができる(後述)。

バイナリファイルのサンドボックス化

ここまでは良い。問題は、自作アプリに、サードパーティが作ったバイナリファイルを埋め込んで使いたいのだが、このためにValidationが通らず、バイナリファイルをサンドボックス化しなくてはならなくなったことだ。

出ていたエラーは

App Store Connect Operation Error
App sandbox not enabled. 
The following executables must include the "com.apple.security.app-sandbox" entitlement with a Boolean value of true in the entitlements property list: 
[(xx.xx.xxxx.xx.XXXX.pkg/Payload/AppName.app/Contents/Resources/binary1",
(xx.xx.xxxx.xx.XXXX.pkg/Payload/AppName.app/Contents/Resources/binary2")] 
Refer to App Sandbox page at
 https://developer.apple.com/documentation/security/app_sandbox
 for more information on sandboxing your ap.

というものだ。

すでにバイナリ化したものを、サンドボックス化できるのだろうか?これはXcodeでやるのか、それともターミナルでやるのか?

以下は色々と調べてたどり着いた解決方法だ。

[アプリ名]Release.entitlementsファイル

Sandboxの設定をすると、[アプリ名]Release.entitlementsというファイルが自動生成される。Sandboxの設定を変更すると、このファイルの中身が自動的に置き換わる。

中身はxml形式だが、Xcodeで開くと、以下のようになっている。

image.png
これをテキストエディタで開くと以下のようだ。
image.png

このファイルへのパスは、Build Settingsの中のSigningの中の、Code Signing Entitlementsで参照されている。つまりSandbox化に使われる情報は、コード署名の時に使われるということだ。

コード署名は、配布時にコードにつける署名であり、そのコードが開発者によって作成されたものであること(改ざんされていないこと)を確認するために必要なものだ。

バイナリファイルにコード署名をつける

ターミナルでつけることができた。と思ったらバイナリが動かなくなっている!現在解決を試みているところです。

codesign -f --timestamp --entitlements /Users/yoho/AppNameRelease.entitlements -s "Xxxxxx Yyyyyy (8DK4RRM7WW)" /Users/yoho/myProjects/ProjName/binary1

ここでAppNameRelease.entitlementsは、ダミーのXcodeプロジェクトでサンドボックス設定をして作成したentitlementファイル(xml形式)だ。"Xxxxxx Yyyyyy (8DK4RRM7WW)"は、コード署名に使われる開発者の名前とID?だ。これらが何であるかは、キーチェーンアクセスで「自分の証明書」を見れば良い。この証明書は、AppleのDevelopperサイトから入手したもの(のはず)だ。

コード署名を調べる方法

ターミナルで以下を実行

codesign -dvvv /Users/yoho/myProjects/ProjName/binary1

entitlementの書式が有効かチェックする方法

ターミナルで以下を実行

plutil /Users/yoho/AppNameRelease.entitlements

ファイルの置き場所

サンドボックス化されたアプリでも自由に読み書きできるフォルダ(applicationSupportDirectory)がある。そのフォルダへのパスは以下で調べることができる。

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSApplicationSupportDirectory, NSUserDomainMask, YES);
NSString *applicationSupportDirectory = [paths firstObject];

コード署名はどこにあるのか?

バイナリにコード署名をつけた場合に、この署名情報はどこにあるのだろうか?Xcodeでコマンドラインツールを作ると、コード署名されてしまうので、C言語で「Hello World」を表示するバイナリをgccで作成して、ファイルサイズを見ると8 KBであった。これにコード署名するとファイルサイズは18 KBとなった。

また実行ファイルを、署名前後でddxコマンドでダンプし、DIFFFで比較すると、コード署名の部分はバイナリファイルの後半にまとまって存在していることがわかった。

というわけで、バイナリファイルの後部にコード署名が追加されるらしいこと、この場合ではコード署名は10 KB程度のサイズであることが判明した。コード署名部分以外にも、全部で10バイトほど変更される箇所があるようだが、何の変更なのかはわからない。

終わりに

内包したバイナリ全てをサンドボックス化して、ようやくvalidationにパスした。web上に色々と情報はあったのだが、どれも直接的に解決には至らず、記事としてアップすることにした。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む