IT技術で仕事を減らしたい!

ITエンジニアのメモ+α

Python FITSファイルの操作

どうも、nippa です。

天文分野でよく使われれる FITS 形式のファイルを操作する必要があり、記事にまとめて おきたいと思います。

FITS 形式のファイルを扱うにはいくつかライブラリがあります。

今回、Python での操作を前提として、astropy を利用して操作したいと思います。

環境

FITS ファイル形式

FITS ファイルは複数の「ヘッダーデータユニット」(HDU)で構成されています。各 HDU は、ヘッダー部とデータ部の 2 つのセクションから成り立っています。

ヘッダーは ASCII テキストで記述されており、データの詳細が含まれています。データ 部分はバイナリ形式で記述されており、任意の形式の配列データが含まれて言います。

astropy を利用した FITS ファイルの操作

astropy のインストール

  • pip インストール
  pip install astropy
  • poetry インストール
  poetry add astropy

FITS ファイルのサンプルの取得

NASA のサイトから FITS ファイルのサンプルを取得します。

https://fits.gsfc.nasa.gov/fits_samples.html

ブラウザから取得することもできます。

  curl -o WFPC2u5780205r_c0fx.fits https://fits.gsfc.nasa.gov/samples/WFPC2u5780205r_c0fx.fits
  wget https://fits.gsfc.nasa.gov/samples/WFPC2u5780205r_c0fx.fits

FITS ファイルの読み込み

astorpy.io を利用して、データを読み込みます。

from astropy.io import fits

file_name = "WFPC2u5780205r_c0fx.fits"
hdul = fits.open(file_name)

FITS ファイルのヘッダー情報の表示

header 情報は dict 形式として取得できます。

from astropy.io import fits

file_name = "WFPC2u5780205r_c0fx.fits"
hdul = fits.open(file_name)

header = hdul[0].header
for key, value in header.items():
     print(f"{key}: {value}")

実行すると以下のような出力がされます。

SIMPLE: True
BITPIX: -32
NAXIS: 3
NAXIS1: 200
NAXIS2: 200
NAXIS3: 4
EXTEND: True
COMMENT:   FITS (Flexible Image Transport System) format is defined in 'Astronomy
COMMENT:   and Astrophysics', volume 376, page 359; bibcode: 2001A&A...376..359H
BSCALE: 1.0
BZERO: 0.0
OPSIZE: 2112
ORIGIN: STScI-STSDAS
FITSDATE: 2004-01-09
FILENAME: u5780205r_cvt.c0h
ALLG-MAX: 3777.701
ALLG-MIN: -73.19537
ODATTYPE: FLOATING
SDASMGNU: 4
CRVAL1: 182.6311886308
CRVAL2: 39.39633673411
CRPIX1: 420.0
CRPIX2: 424.5
CD1_1: -1.06704e-06
CD1_2: -1.25958e-05
CD2_1: -1.26016e-05
CD2_2: 1.06655e-06
DATAMIN: -73.19537
DATAMAX: 3777.701
MIR_REVR: True
ORIENTAT: -85.16
FILLCNT: 0
ERRCNT: 0
FPKTTIME: 51229.798574
LPKTTIME: 51229.798742
CTYPE1: RA---TAN
CTYPE2: DEC--TAN
DETECTOR: 1
DEZERO: 316.6452
BIASEVEN: 316.6715
BIASODD: 316.6189
GOODMIN: -5.064006
GOODMAX: 2552.17
DATAMEAN: 0.4182382
GPIXELS: 632387
SOFTERRS: 0
CALIBDEF: 1466
STATICD: 0
ATODSAT: 16
DATALOST: 0
BADPIXEL: 0
OVERLAP: 0
PHOTMODE: WFPC2,1,A2D7,LRF#4877.0,,CAL
PHOTFLAM: 3.44746e-16
PHOTZPT: -21.1
PHOTPLAM: 4884.258
PHOTBW: 20.20996
MEDIAN: -0.175651
MEDSHADO: -0.121681
HISTWIDE: 1.033711
SKEWNESS: -1.983727
MEANC10: 0.12958
MEANC25: 0.3129676
MEANC50: 0.4577668
MEANC100: 0.3916293
MEANC200: 0.3115222
MEANC300: 0.3295493
BACKGRND: -0.3676353
ORIGIN: NOAO-IRAF FITS Image Kernel December 2001
DATE: 2004-01-09T03:26:36
IRAF-TLM: 03:26:36 (09/01/2004)
FILETYPE: SCI
:
TELESCOP: HST
INSTRUME: WFPC2
EQUINOX: 2000.0
:
:       / WFPC-II DATA DESCRIPTOR KEYWORDS
:
ROOTNAME: u5780205r
PROCTIME: 53013.14019676
OPUS_VER: OPUS 14.5a
CAL_VER:
:
:       / SCIENCE INSTRUMENT CONFIGURATION
:
MODE: FULL
SERIALS: OFF
:
:       / IMAGE TYPE CHARACTERISTICS
:
IMAGETYP: EXT
CDBSFILE: NO
PKTFMT: 96
:
:       / FILTER CONFIGURATION
:
FILTNAM1: FR533P15
FILTNAM2:
FILTER1: 69
FILTER2: 0
FILTROT: 15.0
LRFWAVE: 4877.0
:
:       / INSTRUMENT STATUS USED IN DATA PROCESSING
:
UCH1CJTM: -88.2569
UCH2CJTM: -88.6697
UCH3CJTM: -88.3028
UCH4CJTM: -88.7671
UBAY3TMP: 13.2302
KSPOTS: OFF
SHUTTER: A
ATODGAIN: 7.0
:
:       / RSDP CONTROL KEYWORDS
:
MASKCORR: COMPLETE
ATODCORR: COMPLETE
BLEVCORR: COMPLETE
BIASCORR: COMPLETE
DARKCORR: COMPLETE
FLATCORR: SKIPPED
SHADCORR: OMIT
DOSATMAP: OMIT
DOPHOTOM: COMPLETE
DOHISTOS: OMIT
OUTDTYPE: REAL
:
:       / CALIBRATION REFERENCE FILES
:
MASKFILE: uref$f8213081u.r0h
ATODFILE: uref$dbu1405iu.r1h
BLEVFILE: ucal$u5780205r.x0h
BLEVDFIL: ucal$u5780205r.q1h
BIASFILE: uref$j9a1612mu.r2h
BIASDFIL: uref$j9a1612mu.b2h
DARKFILE: uref$j2g1549cu.r3h
DARKDFIL: uref$j2g1549cu.b3h
FLATFILE: uref$f4i1559cu.r4h
FLATDFIL: uref$f4i1559cu.b4h
SHADFILE: uref$e371355eu.r5h
PHOTTAB: u5780205r_c3t.fits
GRAPHTAB: mtab$n9i1408hm_tmg.fits
COMPTAB: mtab$nc809508m_tmc.fits
:
:       / DEFAULT KEYWORDS SET BY STSCI
:
SATURATE: 4095
USCALE: 1.0
UZERO: 0.0
:
:       / READOUT DURATION INFORMATION
:
READTIME: 464
:
:       / PLANETARY SCIENCE KEYWORDS
:
PA_V3: 49.936909
RA_SUN: 333.7194516616
DEC_SUN: -10.86675160382
EQNX_SUN: 2000.0
MTFLAG: False
EQRADTRG: 0.0
FLATNTRG: 0.0
NPDECTRG: 0.0
NPRATRG: 0.0
ROTRTTRG: 0.0
LONGPMER: 0.0
EPLONGPM: 0.0
SURFLATD: 0.0
SURFLONG: 0.0
SURFALTD: 0.0
:
:       / PODPS FILL VALUES
:
PODPSFF: 0
STDCFFF: 0
STDCFFP: 0x5569
RSDPFILL: -100
:
:       / EXPOSURE TIME AND RELATED INFORMATION
:
UEXPODUR: 300
NSHUTA17: 1
DARKTIME: 300.0
UEXPOTIM: 16880
PSTRTIME: 1999.051:19:08:37
PSTPTIME: 1999.051:19:16:37
:
:       / EXPOSURE INFORMATION
:
SUNANGLE: 141.618347
MOONANGL: 126.698997
SUN_ALT: -31.523479
FGSLOCK: FINE
:
DATE-OBS: 1999-02-20
TIME-OBS: 19:03:13
EXPSTART: 51229.79390428
EXPEND: 51229.7973765
EXPTIME: 300.0
EXPFLAG: NORMAL
:
:       / TARGET & PROPOSAL ID
TARGNAME: NGC4151
RA_TARG: 182.6355
DEC_TARG: 39.40576666667
ECL_LONG: 164.096619
ECL_LAT: 36.623709
GAL_LONG: 155.079532
GAL_LAT: 75.062679
:
PROPOSID: 8019
PEP_EXPO: 02-030
LINENUM: 02.030
SEQLINE:
SEQNAME:
HISTORY:   MASKFILE=uref$f8213081u.r0h  MASKCORR=COMPLETED
HISTORY:   PEDIGREE=INFLIGHT 01/01/1994 - 15/05/1995
HISTORY:   DESCRIP=STATIC MASK - INCLUDES CHARGE TRANSFER TRAPS
HISTORY:   BIASFILE=uref$j9a1612mu.r2h  BIASCORR=COMPLETED
HISTORY:   PEDIGREE=INFLIGHT 29/08/98 - 21/08/99
HISTORY:   DESCRIP=not significantly different from j6e16008u.
HISTORY:   DARKFILE=uref$j2g1549cu.r3h  DARKCORR=COMPLETED
HISTORY:   PEDIGREE=INFLIGHT 16/02/1999 - 16/02/1999
HISTORY:   DESCRIP=Pipeline dark: 120 frame superdark with hotpixels from
HISTORY:   16/02/99
HISTORY:   FLATFILE=uref$f4i1559cu.r4h  FLATCORR=SKIPPED
HISTORY:   PEDIGREE=DUMMY  18/04/1995
HISTORY:   DESCRIP=All pixels set to value of 1. Not flat-fielded.
HISTORY:   PC1: bias jump level ~0.100 DN.
HISTORY:   The following throughput tables were used:
HISTORY:   crotacomp$hst_ota_007_syn.fits, crwfpc2comp$wfpc2_optics_006_syn.fits,
HISTORY:   crwfpc2comp$wfpc2_lrf_004_syn.fits[wave#],
HISTORY:   crwfpc2comp$wfpc2_dqepc1_005_syn.fits,
HISTORY:   crwfpc2comp$wfpc2_a2d7pc1_004_syn.fits,
HISTORY:   crwfpc2comp$wfpc2_flatpc1_003_syn.fits
HISTORY:   The following throughput tables were used:
HISTORY:   crotacomp$hst_ota_007_syn.fits, crwfpc2comp$wfpc2_optics_006_syn.fits,
HISTORY:   crwfpc2comp$wfpc2_lrf_004_syn.fits[wave#],
HISTORY:   crwfpc2comp$wfpc2_dqewfc2_005_syn.fits,
HISTORY:   crwfpc2comp$wfpc2_a2d7wf2_004_syn.fits,
HISTORY:   crwfpc2comp$wfpc2_flatwf2_003_syn.fits
HISTORY:   The following throughput tables were used:
HISTORY:   crotacomp$hst_ota_007_syn.fits, crwfpc2comp$wfpc2_optics_006_syn.fits,
HISTORY:   crwfpc2comp$wfpc2_lrf_004_syn.fits[wave#],
HISTORY:   crwfpc2comp$wfpc2_dqewfc3_005_syn.fits,
HISTORY:   crwfpc2comp$wfpc2_a2d7wf3_004_syn.fits,
HISTORY:   crwfpc2comp$wfpc2_flatwf3_003_syn.fits
HISTORY:   The following throughput tables were used:
HISTORY:   crotacomp$hst_ota_007_syn.fits, crwfpc2comp$wfpc2_optics_006_syn.fits,
HISTORY:   crwfpc2comp$wfpc2_lrf_004_syn.fits[wave#],
HISTORY:   crwfpc2comp$wfpc2_dqewfc4_005_syn.fits,
HISTORY:   crwfpc2comp$wfpc2_a2d7wf4_004_syn.fits,
HISTORY:   crwfpc2comp$wfpc2_flatwf4_003_syn.fits
CTYPE3: GROUP_NUMBER
CD3_3: 1
CD3_1: 0
CD1_3: 0
CD2_3: 0
CD3_2: 0

FITS ファイルのデータ部分の取得

以下のコードでデータ部分を取得することができます。

サンプル FITS ファイルでは 200x200 で 4 つのイメージが格納されています。以下のコ ードでは、1 つ目のデータを取得しています(data[0])。

from astropy.io import fits

file_name = "data/WFPC2u5780205r_c0fx.fits"
hdul = fits.open(file_name)

data = hdul[0].data[0]

print(data)

FITS データの描画

matplotlib を利用して、FITS データを描画します。

matplotlib のインストール

  • pip インストール
  pip install matplotlib
  • poetry インストール
  poetry add matplotlib

matplotlib での描画

以下のコードで FITS データを描画できます。

import matplotlib.pyplot as plt
from astropy.io import fits

file_name = "data/WFPC2u5780205r_c0fx.fits"
hdul = fits.open(file_name)

data = hdul[0].data[0]

plt.figure(figsize=(10, 10))
plt.imshow(data, cmap="gray")
plt.colorbar()

plt.show()
plt.close()
hdul.close()

FITSデータの描画

感想

今回、python で astropy を利用して FITS ファイルを読み込み、ヘッダー情報の取得、 データの取得、データの描画までまとめました。

ここまで操作できれば、あとの取り扱いはデータ処理になります。参考にしてください。

ではでは、また次回。

Python PDFファイルの操作

どうも、nippa です。

Python で PDF の操作をしてみようと思いました。目標としては、PDF ファイルにタイム スタンプトークンを付与して、電子帳簿保存法で簡単にタイムスタンプを付与することを 目指します。

今回はその最初のステップとして、Python での PDF の操作を実施してみます。

Python での PDF 操作でよく知られていた PyPDF2 は開発をもとの pypdf で開発を継続 するとなっています。 PyPDF2 プロジェクト

今回は pypdf の操作についてまとめます。

環境

pypdf のインストール

パッケージ管理ツールを利用して、pypdf をインストールします。

  • pip
  pip install pypdf
  • poetry
  poetry add pypdf

pypdf での PDF の操作

PDF の読み込みとページ数の取得

PDF を読み込み、メタ情報の確認を行ってみます。

from pypdf import PdfReader

file = "sample.pdf"
reader = pypdf.PdfFileReader(file)
metadata = reader.metadata
if metadata is None:
     raise Exception("Error: No metadata")
print(metadata)
creation_date = metadata.get('/CreationDate', '不明')
mod_date = metadata.get('/ModDate', '不明')
print(f"作成日: {creation_date}")
print(f"修正日: {mod_date}")

print(f"ページ数: {len(reader.pages)}")

reader.metadataでは dict 形式で、PDF のメタ情報を取得することができます。

len(reader.pages)で PDF のページ数を取得できます。

ページ数の取得と特定ページのテキスト抽出

ページ数を指定して、そのページテキストを以下のコードで抽出します。

from pypdf import PdfReader

file = "sample.pdf"
reader = pypdf.PdfFileReader(file)
page = reader.pages[0]
text = page.extract_text()
print(text)

特定ページの切り出し

特定のページを切り出す場合、以下のようなコードで切り出す事ができます。

from pypdf import PdfReader, PdfWriter

file = "sample.pdf"
reader = PdfReader(file)
writer = PdfWriter()

page_numebr = 1
writer.add_page(reader.pages[page_numebr-1])
writer.write(f"page{page_numebr}.pdf")

PDF を結合する

PdfMergerは非推奨になっているので、PdfReaderPdfWriterを利用して PDF を結 合します。

PDF を読み込んで、新たな PDF に結合していく形になります。

from pypdf import PdfReader, PdfWriter
pdf_files = ["sample.pdf", "sample1.pdf"]

writer = PdfWriter()
for file in pdf_files:
    reader = PdfReader(file)

    for page in reader.pages:
        writer.add_page(page)

writer.write("test.pdf")

特定ページの回転させる

特定の page に対してrotate([回転角度])を指定することで、回転させることができま す。

from pypdf import PdfReader, PdfWriter

file = "sample.pdf"
reader = PdfReader(file)
writer = PdfWriter()

page_numebr = 1
writer.add_page(reader.pages[page_numebr-1])
writer.pages[-1].rotate(90)
writer.write(f"page{page_numebr}.pdf")

PDF にパスワードを設定して暗号化する

from pypdf import PdfReader, PdfWriter
password = "test"
pdf_files = ["sample.pdf"]

writer = PdfWriter()
for file in pdf_files:
    reader = PdfReader(file)

    for page in reader.pages:
        writer.add_page(page)

writer.encrypt(user_password=password, owner_password=None, use_128bit=True)
writer.write("test.pdf")

暗号化された PDF を復号する

上記で暗号化された PDF の復号は以下の通りです。

from pypdf import PdfReader
password = "test"

reader = PdfReader("test_password.pdf")
if reader.is_encrypted:
    reader.decrypt("test")
    for page in reader.pages:
        print(page)

感想

今回 pypdf を利用して、Python で PDF を扱う方法について簡単にまとめてみました。

pypdf では簡単な操作はできるもののコンテンツを修正する等は難しく、あくまでも PDF の操作だけになります。コンテンツを修正する場合は、他のライブラリの検討が必要にな ります。

次は、PDF にタイムスタンプトークンを付与する方法をテーマに記事を書きたいと思いま す。

ではでは、また次回。

SQLite3 出力モードの一覧

どうも、nippa です。

SQLite3 は軽量なファイルベースのデータベースです。SQLite3 を取り扱う必要がでてき たので、 SQLite3 の出力モードについてまとめておきたいと思います。

環境

  • macOS 12.6
  • SQLite3 3.43.0

現在の出力モードの確認

現在の出力モードは SQLite3 でデータベースにアクセスした状態で以下のコマンドで確 認できます。

.mode

# 出力
current output mode: list

出力モード種類

.mode [modeオプション]で出力形式を変更します。各 mode オプションは以下のテーブ ルになります。

mode オプション 詳細
ascii 列や行が 0x1F(単位区切り文字)と 0x1E(記録区切り文字)で区切られた形式で出力する。
box ユニコードの罫線文字を使用してテーブルを描画される。このモードは視覚的に整理された表として表示するのに適している。
csv コンマ区切り値形式で出力する。Output 先をファイルに変更すると直接 CSV ファイルとして出力できる。
column 結果を列で整理して出力する。.width コマンドを使用して、各列の幅を調整することができる。
html HTML の<table>要素を使用して結果を表現する。
insert 結果を SQL の INSERT 文として出力する。
json 結果を JJSON 配列として出力する。
line 1 行に 1 つの値を出力する。
list 値をパイプ記号"|"で区切って出力する。
markdown Markdown 形式の表として結果を出力する。
qbox box モードのショートハンドで、ラップ幅を 60、引用符で囲むオプションがデフォルトで有効になる。
quote SQL の文字列リテラルとして結果をエスケープする。データを SQL 文として安全に扱う場合に便利。
table ASCII アートを使用してテーブルを描画する。box モードと似ていますが、ユニコードではなく ASCII 文字のみを使用する。
tabs タブ区切り値形式で結果を出力する。
tc TCL リスト要素として結果を出力する。

出力モードの出力例

以下のようなテーブルで出力テストをしています。

id(integer) name(text)
1 Bob
2 Alice
  • ascii
  1Bob2Alice
  • box
  ┌────┬───────┐
  │ id │ name  │
  ├────┼───────┤
  │ 1  │ Bob   │
  │ 2  │ Alice │
  └────┴───────┘
  1,Bob
  2,Alice
  • column
  id  name
  --  -----
  1   Bob
  2   Alice
  • html
  <TR><TD>1</TD>
  <TD>Bob</TD>
  </TR>
  <TR><TD>2</TD>
  <TD>Alice</TD>
  </TR>
  • insert
  INSERT INTO "table" VALUES(1,'Bob');
  INSERT INTO "table" VALUES(2,'Alice');
  [{"id":1,"name":"Bob"},
  {"id":2,"name":"Alice"}]
  • line
  id = 1
  name = Bob

  id = 2
  name = Alice
  • list
  1|Bob
  2|Alice
  | id | name  |
  |----|-------|
  | 1  | Bob   |
  | 2  | Alice |
  • qbox
  ┌────┬─────────┐
  │ id │  name   │
  ├────┼─────────┤
  │ 1  │ 'Bob'   │
  │ 2  │ 'Alice' │
  └────┴─────────┘
  • quote
  1,'Bob'
  2,'Alice'
  • table
  +----+-------+
  | id | name  |
  +----+-------+
  | 1  | Bob   |
  | 2  | Alice |
  +----+-------+
  • tabs
  1 Bob
  2 Alice
  • tcl
  "1" "Bob"
  "2" "Alice"

感想

今回 SQLite3 の出力モードについてまとめました。出力形式を変更できると便利なこと もあるので、知っておいても損はないと思います。

ではでは、また次回。

SQLite3 ファイルが破損したときの対処方

どうも、nippa です。

SQLite3 のファイルを扱っていたときに、ファイルが破損してアクセスできなくなってし まいました。

データベースアクセス時に、ファイルを外部から操作した場合などに起きます。

今回、破損ファイルの修復を方法をまとめておきます。

環境

  • macOS 13.3
  • SQLite3 3.31.1

sqlite3 のファイル破損時のエラー

破損した SQLite3 ファイルにアクセスしてみます。

# データベースへアクセス
sqlit3 [sqlite database]

# select
select * from [table];

Runtime error: database disk image is malformed (11)

python からアクセスすると、sqlite3 のドライバから以下のようなエラー文が発生しま す。

sqlite3.DatabaseError: database disk image is malformed

破損ファイルの修復・復旧

.recover コマンドで修復

sqlite3 [sqlite database] '.recover' | sqlite3 [new sqlite database]

上記のコマンドでは、.recoverで破損したデータベースからのデータ回復を目指します 。

この機能は sqlite3 の 3.29.0 以降で導入された機能になります。

.dump コマンドでデータの救出

sqlite3 [sqlite database] '.dump' | sqlite3 [new sqlite database]

.dumpコマンドでは破損したファイルからできる限り、データを吐き出し、救出できま す。

感想

今回、SQLite3 が破損したときにファイルの復旧方法をまとめました。

ファイルが破損しても、ある程度データを復旧したり、データを吐き出すことが可能です 。

大事なファイルの場合は、バックアップをしっかり取ることも重要ですので、そちらも検 討することが大事だと思います。

ではでは、また次回。

Flutterの開発環境の構築

どうも、nippa です。

今回クロスプラットホームアプリケーション開発のための Flutter の開発環境の構築を したいと思います。

iOS、Andorid 向けの アプリケーション開発を Flutter で行う準備段階になります。

環境

  • macOS 12.6
  • Homebrew 4.1.12
  • Flutter 3.13

Flutter の環境に必要となるソフトウェア

Flutter のインストール

Homebrew でのインストール

Homebrew にも Flutter パッケージがあるので、手軽にインストール可能です。

brew install --cask flutter

Github からインストール

Flutter コマンドをインストールするディレクトリを作成します。

mkdir ${HOME}/local

github からコードを取得します。

cd ${HOME}/local
git clone https://github.com/flutter/flutter.git -b stable

PATH の設定をします。

export PATH="$PATH:${HOME}/local/flutter/bin"

必要に合わせて.zshrc や.bashrc などに PATH を記載してください。

Flutter の環境構築

Flutter の環境に必要なソフトウェアをインストールを確認します。

flutter doctor

必要なソフトウェアがインストールされていない場合は、以下のような出力がされます。

[] Android toolchain - develop for Android devices
    ✗ cmdline-tools component is missing
      Run `path/to/sdkmanager --install "cmdline-tools;latest"`
      See https://developer.android.com/studio/command-line for more details.
[] Xcode - develop for iOS and macOS
    ✗ Xcode installation is incomplete; a full installation is necessary for iOS and macOS
      development.
      Download at: https://developer.apple.com/xcode/download/
      Or install Xcode via the App Store.
      Once installed, run:
        sudo xcode-select --switch /Applications/Xcode.app/Contents/Developer
        sudo xcodebuild -runFirstLaunch
    ✗ CocoaPods not installed.
        CocoaPods is used to retrieve the iOS and macOS platform side's plugin code that responds to
        your plugin usage on the Dart side.
        Without CocoaPods, plugins will not work on iOS or macOS.
        For more info, see https://flutter.dev/platform-plugins
      To install see https://guides.cocoapods.org/using/getting-started.html#installation for
      instructions.

android-sdkAndroid toolchain)のインストールと初期設定

今回は、android-studioからインストールします。

brew install --cask android-studio

インストール後、android-stadio からAndroid SDK Command-line Toolをインストール します。

android-studio1

android-studio2

android-studio3

インストール後、以下を実行してライセンスの承諾を行います。

flutter doctor --android-licenses

Xcode のインストール

Macapp storeから Xcode をインストールします。

インストール後に、コマンドラインで以下を実行します。

sudo xcode-select --switch /Applications/Xcode.app/Contents/Developer

sudo xcodebuild -runFirstLaunch

CocoaPods のインストール

CocoaPods のインストールができていな場合で、flutter doctorを実行すると以下のよ うな警告が表示されます。

[!] Xcode - develop for iOS and macOS (Xcode 14.2)
    ✗ CocoaPods not installed.
        CocoaPods is used to retrieve the iOS and macOS platform side's plugin code that responds to
        your plugin usage on the Dart side.
        Without CocoaPods, plugins will not work on iOS or macOS.
        For more info, see https://flutter.dev/platform-plugins
      To install see https://guides.cocoapods.org/using/getting-started.html#installation for
      instructions.

CocoaPods は Homebrew からインストールできます。

brew install cocoapods

gem を利用している場合は、gem からもインストール可能です。参考 :https://cocoapods.org/

sudo gem install cocoapods

flutter doctor で環境のチェック

flutter doctor

No issues founded!であることを確認します。

これで環境の準備が整います。

感想

今回 Flutter の開発環境を整いました。

クロスプラットフォームアプリ開発を進めてみようと思います。

ではでは、また次回。