20210511のMacに関する記事は7件です。

【連載】初心者のためのMacCatalyst講座

この講座について この講座では「MacCatalystって何?」「MacCatalystを使ってみたい」という方向けに解説を 行っていきます。この記事を見てくれた方がMacCatalystを説明できる、MacCatalystが使える、 といったことを目標に解説していきます。 目次 第1回 iOSアプリ開発を考えているなら知っておくべきMacCatalystの基礎知識 第2回 作成中...
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

iOSアプリ開発を考えているなら知っておくべきMacCatalystの基礎知識

MacCatalystとは 「MacCatalyst」とは、Appleの統合開発環境である「Xcode」の機能の一つです。 かつては「Project Marzipan」と呼ばれていましたが2019年に「Project Catalyst」として発表され同年リリースされたXcode11から「MacCatalyst」を使用した開発が可能になりました。 iPadアプリからMacアプリを作成が可能 アプリのiPad版さえあれば簡単にMac版を作ることができます。 細かく言うと、iPadアプリのソースコードを使って、Mac版のアプリをビルドすることができます。 1つのソースコードから2つのアプリができるので、開発コストは半分になります。 (そんな単純な訳ないですが…) デバイスに合わせた機能追加も可能 また、Mac版かどうかで処理を分岐させることも可能で、Mac版のデザインや機能をiOS版と分ける事もできます。 例えば、Mac版は画面の広さを生かしてボタンを増やしたり、カメラアプリなら編集機能の追加などができます。 以上がMacCatalystの概要でした。 次回はMacCatalystを使うメリットを紹介します。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

アプリ開発の勉強記録1

スタンフォード大学の講義 SwiftUIによるアプリ開発 ある程度何らかのプログラミング言語を知っている人向け 1〜2時間の講義が14回(上がっている動画をカウントした) 音声:英語、字幕:英語 Lecture 1: Course Logistics and Introduction to SwiftUI 内容 やる:Swift言語、関数型プログラミング、リアクティブUI開発(MVVM含) やらない:UIKit、テスト手法 Xcodeインストールし、Hello Worldをそのままビルド、シミュレーターで表示 出てくるキーワードの説明は少なめ これから作る神経衰弱的なカードゲームのデモ Hello Worldを20行ほど修正追加して、カード的な表示を作成 ZStack, HStack, RoundedRectangle, ForEach 感想気付き 引数用の丸括弧など、いろいろと省略できる。確かに見やすいが省略条件がまだよくわからない。 return ZStack(content: { RoundedRectangle(cornerRadius: 10.0) Text("?") }) ZStack { RoundedRectangle(cornerRadius: 10.0) Text("?") } ドットで繋げて処理を書くことができる。それぞれ異なる処理。まるでパイプのよう。 RoundedRectangle(cornerRadius: 10.0).stroke().foregroundColor(Color.orange) 0から4未満の範囲の書き方 0..<4。4回を明示するためだと思われ。 クラスのインスタンス生成時にメンバ初期値を引数で渡すことができる。事前のインターフェース宣言は必要ない。 CodeView(isFaceUp: true) struct CodeView: View { var isFaceUp: Bool } 今後の課題 someの意味 struct, class の違い ライブラリやAPIの知識を増やす(CSS文法などに寄せている感があるので覚えやすそう)
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

いつも忘れる mac の static route 設定

macのstatic route netstat -r sudo route -n add -net 18.0.0.0/8 192.168.0.1 brew install iproute2mac ip route get 18.0.0.1 既存のを変更するとき sudo route change default 192.168.0.1
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Ubuntu Server 21.04 に Samba サーバを立てて Mac とファイルを共有する

本記事の前提 Ubuntu Server 21.04 がインストールされている Mac から Ubuntu Server のファイルを参照したい 設定手順 まずは Samba サーバのパッケージをインストールします。 $ sudo apt-get install samba 次に、Samba を使うユーザを作成します。 ユーザ名は Ubuntu Server, Mac, Samba で共通化しておくのが無難です。 $ sudo pdbedit -a hajime-f new password: retype new password: Unix username: hajime-f NT username: Account Flags: [U ] User SID: S-1-5-21-3096135977-926823050-829666163-1000 Primary Group SID: S-1-5-21-3096135977-926823050-829666163-513 Full Name: Hajime Fujita ... (後略) 次に、/etc/samba/smb.conf を編集します。デフォルトの設定ファイルに追記・修正した箇所のみを示すと、下記のとおりです。 /etc/samba/smb.conf [global] workgroup = ISLANDS unix extensions = no [homes] writeable = yes create mask = 644 directory mask = 755 workgroup が ISLANDS になっているのは、私が各マシンのホスト名に南の島の名前をつけるという個人的なポリシーを持っているからです。 最後に、Samba デーモンを再起動します。ステータスがきちんと「Active: active (running)」になっていることも確認しておきましょう。 $ sudo service smbd restart $ sudo service smbd status ● smbd.service - Samba SMB Daemon Loaded: loaded (/lib/systemd/system/smbd.service; enabled; vendor preset: enabled) Active: active (running) since Mon 2021-05-10 06:12:55 UTC; 52s ago ...(中略) May 10 06:12:55 phuket systemd[1]: Starting Samba SMB Daemon... May 10 06:12:55 phuket systemd[1]: Started Samba SMB Daemon. Mac から Ubuntu Server に接続する Finder のメニューバーで、「移動」→「サーバへ接続」を選びます。 「サーバへ接続」のポップアップが出たら、下記のように、「smb://(IPアドレス)」し、「接続」します。 Samba ユーザのユーザ名とパスワードを聞かれるので、入力しましょう。 ということで、Ubuntu サーバのホームディレクトリを参照できました。 ホームディレクトリは、/Volumes/hajime-f にマウントされているので、適当にシンボリックリンクでも張っておきましょう。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

週刊 DICOMデコーダーを創る (1) 創刊号

DICOMデコーダーの作成 医療用画像を扱う上でDICOMは避けては通ることができない形式です. 近年はPythonなど様々な言語で使用可能なDICOMプラグインが登場しているし,そもそもDICOM→扱いやすい形式へ変換可能なソフトウェアはフリーでもたくさんある.なので,今更自力でDICOMを表示することに需要はないかもしれない・・・ DICOM規格は経年的にどんどん膨れ上がっており,その全体を理解することや,すべてを実装することは個人の力では到底できない.(少なくとも自分には)(なのでライブラリを使え,と言う話だが・・・) そんな中でも,DICOMを実装したい!!と考えている人がいるはず!と期待し,少しでも誰かの役に立つといいなと思い,DICOMファイルのデコーダーの基礎部分を何回かに分けて実装したいと思います.(最後にいきなりズルしてますが) DICOMデータ DICOMデータは1つのファイルに 患者名,患者ID,生年月日,年齢,性別など患者情報 検査方法(CT, レントゲン, エコー, カテーテル, MRI, ...),検査日,検査時間,使用した機器など検査に関わる情報 画像サイズ,画像Bit数, 動画かどうか,フレームレートなど画像のメタデータ 画像の転送形式(≒圧縮形式) 画像データの集合 など多くの情報が埋め込まれている. DICOM構造の定義上は,あらゆるデータが想定されていて, 軍の階級,照会医師の住所など,そこに埋め込む必要あるのか?というようなデータ項目も定義されている. JIRAにDICOM規格書の日本語訳があり,実装には非常に参考になるので目を通してほしい. PS 3.6がDICOMで実装可能なデータセットの一覧だが,これをすべて実装するのは到底無理. DICOM binary dataの中から,適宜扱う予定のデータに必要な部分だけ取り出して実装していけば良い. DICOM dataの中の,途中の情報はすべてすっ飛ばして,画像形式・大きさ・深度情報だけを読み取って,ファイル最後尾にある,画像情報のbinaryだけを取り出せば画像は表示可能である. 雑で申し訳ない・・・・ しかし,本刊ではせっかくなので,途中に含まれるデータも階層だけは辿ってデコードしていくことにする. 題材 DICOMの画像形式はいくつかあるのだが, 全くの非圧縮 可逆圧縮(Jpeg Lossless) Jpeg圧縮 Jpeg2000圧縮 などがある.この中で,Jpeg2000はwindowsでは標準で表示できないようだが,macは表示可能(iOSは見てないのでわからない). JPEG LosslessはDICOM以外ではほとんど使用されていないと思う. ただし,一部メーカーのデジカメRAW形式はかなり近い. JPEG Losslessのデコードも需要がありそうなら挑戦するが,今回はLossy JPEGと非圧縮を題材にデコードしていくことにする. (Lossy JPEGは言ってしまえば普通のJPEGなので,DICOMファイルから該当部分のbinaryデータだけをとってきて,拡張子を.jpgにすればそれだけで表示できる) 今回は下記サイトからDICOMデータを拝借することにする まずは,リンク先の一番上 DEMO 0002 1702Kb を使用する. (これはカテーテル画像の動画になる予定です) DICOMデコーダー始動!! まずはBinaryを開けてみる. ここではバイナリエディタとして[0xED]を使用した.(WindowsならBzがおすすめ) 上記JIRAにあるDICOM規格書翻訳 PS 3.10 医療におけるデジタル画像と通信 (DICOM)第10部:媒体相互交換のための媒体保存とファイルフォーマットのp20にDICOMファイルの構造は 最初の128byteは基本0x00 続く4byteはプレフィックスでDICMと記載されている. 2.がDICOMファイルかどうかを決めているようです. この0002.DCMはサンプルファイルなので,最初の128byteに色々書いてありますが気にしないでおきましょう. AssetsにDICOMファイルである0002.DCMを登録した. DICOMファイルはバイナリデータで扱っていくので,Dataで読み込んでおく let fileName = "0002" guard let dicomData = NSDataAsset(name: fileName)?.data else { print("file not found") return } dicomDataの128バイトは無視して,続く4byteにDICMと記載されているかを確認する. Data型は単純に取り出してもbyte数を吐いてしまいます. 各byteはUInt8で表現されますが,Data型のmapはデフォルトがUInt8で処理してくれるので, dicomData[128...131].map{$0} とすれば [68, 73, 67, 77] となるはずです. これは,ファイルアドレス 0x80〜0x83にある0x44, 0x49, 0x43, 0x4DがUInt8,つまり符号なし整数(10進法)で表示されたことになります. これをasciiコードから文字列に直します. 68(0x44) = D 73(0x49) = I 67(0x43) = C 77(0x4D) = M と出力したいわけです. print(Unicode.Scalar(68)!) -> D のようにUnicode.Scalarで取り出してあげればいいわけです. この変換を今後,山程使うので, extension Data{ func getStringWithRange(start:Int, length:Int) -> String{ let aa = self[start...start+length-1] return aa.map{String(Unicode.Scalar($0))}.joined() } } として指定した場所と長さを指定すると文字が取り出せるよう,Data型を拡張しておきました.これで print(dicomData.getStringWithRange(start: 128, length: 4)) のようにすれば,DICMと出力されるようになります. // dicomデータかチェック // ヘッダは128バイトのファイルプリアンブル // つづく4バイトにプレフィックスが続く if dicomData.count < 132{ print("file size error") return } if dicomData.getStringWithRange(start: 128, length: 4) != "DICM"{ print("file type error") return } DICOMデータの基本構造 DICOMファイルかどうかのチェックをしたあとのデータには, タグ (0x0002, 0x0000)のような(Group, Element)構造 tagは規格書PS 3.6と照らし合わせて,何を示すかを確認しないとわからない VR (value representation) タグで示した場所に存在するデータの種類を表す アルファベット2文字で,この後ろに何が入っているかを表している 詳細はリンク参照 例えば,ASは年齢を表す文字列.DAは日付を表す文字列.USはunsigned integer 16 bits long(符号なし16ビット整数)が後ろに格納されていると明示している 値長さ 後ろに格納されているデータのByte数を示す 値領域 何が入っているかはVR次第だが,直前に示されたbyte数分だけデータが入っている このように, 128byte〜DICM 132byte〜   Tag, (Group, Element), VR, Length, Data   Tag, (Group, Element), VR, Length, Data   Tag, (Group, Element), VR, Length, Data   ...   Tag, (Group, Element), VR, Length, Data   Tag, (Group, Element), VR, Length, Data の繰り返し です, Tagは(0x1111, 0x2222)と4byte使って表され,続く2byteでVRを示し,続く2byteが格納されているデータのbyte数を示します.(一部特殊なVRがあり,それはlengthの示し方が異なりますが,今は無視) 先程のバイナリの例では,DICMに続く02 00 00 00がTagで(0002, 0000)を示しています,Little endianで表示することに注意してください!! 続く2byteの55 4CがasciiコードでULを示します. ULはUInt32で符号なし32bit整数値を示している,と先程の規格書に書いてあるので,後ろには数字が入っています. 続く2byteは04 00です.これは後ろに入っているデータ長を表すわけですから,後ろには4byteのUInt32が入っていることになります. 04 00はLittle endianで読むので,0x400 = 1024ではなく0x0004 = 4と解釈してください 続く4byteを読んでみます 96 00 00 00ですから150です. tag (0002, 0000)はファイルメタ情報の一部のようですので,デコードにはあまり関係ないことがわかります. つづく,02 00 01 00はtag (0002, 0010)を示していますが,これもメタデータで関係ありません.続いて,VR, length, data, tag, VR, length, data, ...と順々に読み取っていくことになります. あるソフトで読み取ってみると以下の様になっていました.これを再現していきます. 今日の最後に... 今日はいきなり長くなりました. DICOMデータは膨大ですし,データ規格が鬼のようにあるので,そのごく一部を再現することになると思います.どんな検査データにも対応できるようなDICOMソフトは実装が非常に大変だと思います. 終わりが見えないのも嫌なので,ちょっと最後にズルをしておきましょう. DICOMのtag情報から,このDICOMのImageDataはファイルアドレス 0x2B76から始まり,1枚目は17912byte格納されていることがわかりました. let pix1 = dicomData[0x2B76...0x2B76+17912-1] let img = NSImage(data: pix1) imgView.image = img どうですか?これは,このDICOMがLossy JPEGで圧縮されているので,imageのbinary dataさえ読めればかんたんに画像はデコードできます.これがJpeg losslessだとややこしいのですが・・・ ちょっと先読みでズルしましたが,次回はtag, VR, length, dataを読んでいくところを実装しようとおもいます! それではまた!
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Mac-アプリケーション設定の制御

はじめに... 調査した内容を時系列にまとめた資料なので、その点ご了承ください。 目次 実行環境 実現したいこと CLIによる制御 プロファイルを使った制御 設定値の収集 設定ファイルの作成 プロファイルの適用 プロファイルの動作確認 まとめ 1. 実行環境 項目 情報 OS macOS 11.3.1 HW MacBook Air (11-inch, Mid 2013) MDM環境 microsoft intune 2. 実現したいこと 最終目標 GUIの操作なしにmacのセットアップが行える環境を整備したい 今回の目標 GUIの操作なしにアプリケーションの設定を行いたい 今回は、Microsoft AutoUpdateの設定を行う 3. CLIによる制御 調査したところ、アプリケーションの設定は、 ~/Library/Preferences/配下に保管されていること、plutilコマンドで編集できることがわかった。 ただ、対象ファイルを修正しても、アプリケーション起動時に設定が元に戻ってしまうため、今回は採用を見送りとする。 4. プロファイルを使った制御 CLIを諦めて、プロファイルにより制御できないか調査したところ、intuneにてアプリケーション設定を配信するための機能があったため、今回はこの機能を利用する。 ※ ProfileCreatorでプロファイルを作成する方法もあるが、CLIでプロファイルを適用する方法がわからず、今回は割愛する。 5. 設定値の収集 plutilというコマンドを使って、設定値を収集する。流れとしては、(1) デフォルト値の収集(2)アプリ側で設定変更(3)設定変更後の値を収集となる。 5-1. デフォルト値の収集 plutil -p ~/Library/Preferences/com.microsoft.autoupdate2.plist (中略) "InstallLockedBy" => 0 "InstallOnCloneEnabled" => 1 "IOCRestoreFailCount" => "0" "LastUILaunchDate" => 2021-05-10 15:12:08 +0000 "LastUpdate" => 2021-05-10 14:06:48 +0000 "OptionalDataCollectionEnabled" => 0 "StartDaemonOnAppLaunch" => 1 "WindowsAzureMobileServicesInstallationId" => "C1E6B380-2E6D-4058-B18E-9B9B24F10C54" (中略) 5-2. アプリ側で設定変更 5-1. 設定変更後の値の収集 plutil -p ~/Library/Preferences/com.microsoft.autoupdate2.plist (中略) "ChannelName" => "Preview" "InstallLockedBy" => 0 "InstallOnCloneEnabled" => 1 "IOCRestoreFailCount" => "0" "LastUILaunchDate" => 2021-05-10 15:12:08 +0000 "LastUpdate" => 2021-05-10 14:06:48 +0000 "OptionalDataCollectionEnabled" => 0 "StartDaemonOnAppLaunch" => 1 "WindowsAzureMobileServicesInstallationId" => "C1E6B380-2E6D-4058-B18E-9B9B24F10C54" (中略) 結果として、「"ChannelName" => "Preview”」が必要な設定とわかった。 6. 設定ファイルの作成 intuneでは、xml形式で配信する必要があるため、設定ファイルをxml形式で作成する。 % cp ~/Library/Preferences/com.microsoft.autoupdate2.plist ~/Downloads/ % plutil -convert xml1 ~/Downloads/com.microsoft.autoupdate2.plist % grep -A 1 ChannelName ~/Downloads/com.microsoft.autoupdate2.plist <key>ChannelName</key> <string>Preview</string> % grep -A 1 ChannelName ~/Downloads/com.microsoft.autoupdate2.plist > MSupdate_Channel.plist 7. プロファイルの適用 今回は、intuneの機能を利用するため、intuneを使って、対象端末にプロファイルを適用する。 ※端末は、すでにintuneへ参加しているものとする。 Microsoft Endpoint Manager Admin Centerにログインし、 デバイス > macOS > 構成プロファイルを開き、プロファイル作成ボタンをクリック。 今回は、以下のようにポリシーを作成/適用。 8. プロファイルの確認 システム環境設定でプロファイルが適用されたこと、アプリ側で設定されたことを確認し、問題なければ設定完了。 8-1. プロファイル状態 8-1. アプリ状態 9. まとめ MDMを使って、GUIの操作なしにアプリケーション設定をすることができた アプリによっては、プロファイル設定に応じて、該当の設定箇所がグレーアウトすることも確認できた
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む