Swift:配列変数に配列を代入したい
配列に配列を代入したい
let songs: [String] = {"津軽海峡冬景色", "俺ら東京行ぐだ", "蝋人形の館"} let favSongs : [String] = songs
なんのことはなかった。
MVVMモデルでViewModelを通してModelの配列をViewで受け取りたい時につかった。
View
import SwiftUI struct AlbumView: View { @ObservedObject var albumViewModel = AlbumViewModel() private var columns: [GridItem] = Array(repeating: .init(.flexible(minimum: 10), spacing: CGFloat(0.0)), count: 9) var body: some View { let songs: [String] = albumViewModel.songs ScrollView { LazyVGrid(columns: columns) { ForEach(0..<songs.count){ num in Text(songs[num]) } } } } }
ViewModel
import Foundation import SwiftUI class AlbumViewModel:ObservableObject { @Published var albumModel: AlbumModel = AlbumModel() init(){ self.getSongs() } var songs: [String]{ return albumModel.songs } func getSongs(){ albumModel.getSongs() } }
Model
import Foundation import MediaPlayer struct AlbumModel { var songs: [String] = [] mutating func getSongs(){ let mediaItems = MPMediaQuery.songs() if let collections = mediaItems.collections{ for collection in collections{ songs.append(collection.items[0].title!) } } } }
SF Symbols アプリ
iPhoneアプリ開発でアイコン(SF Symbols)を使いたいと思った時、どんなアイコンがあるか調べようとしたらアプリがあった。
カテゴリ別から探したり、任意の文字列で検索できたりとなんというか流石。
おうち使いのLinuxのファイアウォールのインバウンドとアウトバウンド
概略
大体ファイアウォールの設定ではインバウンドは固く閉じて、アウトバウンドは緩いことが多い。
リバースシェルとか緩めのアウトバウンドを使用した攻撃もあるので、そいつに対抗するべくキチンとアウトバウンドも閉めておく。
WindowsやmacはOSがファイアウォールを持っていたり、Nortonやesetのようなセキュリティソフトがそこそこいい感じにファイアウォールを設定してくれているが、Linuxはおそらく自力で頑張らなきゃいけない。
家庭用のルータにもファイアウォール(パケットフィルタリングとか名前ついてたりもする)がついているが、正直若干ザル感が否めない。
とりあえずおうちでLinuxと言ったらUbuntuなのでDebian系のフロントエンドufwを使ってみる。
コマンド類は最後に列挙します。
実践
とりあえず全部閉じ
まずは全部閉じても大丈夫。必要なものだけ開いていこう。
使うものだけ開けるって言っても・・・
使用するポートだけ開けるのが基本なのは言うまでもないが、じゃあ何を使うんだ。
→aptを使用したアップデートやパッケージのインストールに使用する。ネットサーフィンもこいつがないと話にならない。
→名前解決に使う子。こいつもないとネットに繋がらん・・・訳ではないがネットサーフィンは難しいと思う。何気にプロトコルがudp。
・Git:9418/tcp
→開発大好きな方なら開けなきゃアカン。
・VPN
→最近いろんな人がいろんな目的で使い始めたVPN。この子も使うなら開けてあげなきゃいけない。ポートはモノによって異なるので、うまく開けてあげよう。
ログ取り
個人ではあんまり使わん気もするがとりあえず取っとく。
ufwの有効化
当然有効化しないといけないが、ufwコマンドのenableだけだとufwのサービスまでは自動起動してくれないらしい。 systemdでもenableしてあげよう。
コマンド
上記の通り、基本全拒否した後に必要なものを許可する。最後にログと有効化をしておしまい。
# デフォルト全拒否 sudo ufw default deny incoming sudo ufw default deny outgoing # HTTP(S) sudo ufw allow out 80/tcp sudo ufw allow out 443/tcp sudo ufw allow out 53/udp # Git sudo ufw allow out git # ログON sudo ufw logging on # 有効化 sudo ufw enable # systemctlで念押し sudo systemctl enable ufw
余談
もしかしてこの設定をルータのファイアウォールに設定してやれば最強じゃない?と思ってやったらiPadがネットに繋がんなくなった。
ルータにも設定するなら「Apple ソフトウェア製品で使われている TCP および UDP ポート」あたりを見て適切に開いてあげる必要がありそう。
ただ、家庭用のルータだとあまり多くのルールを設定できず、不完全になってしまう可能性が高いのでやるならラズパイあたりをファイアウォール化して噛ませるのが無難か。
なるべく最小容量でParallels上にDebianを構築する。
目的
macのParallelsで使い捨ての仮想マシンを作りたい。 VMWareFusionはサスペンドが便利だけどLinuxはディスク領域の再利用が基本できないっぽい(2022/6/19現在)から一旦除外。
手順
Parallels上でisoファイルを読み込ませる。
- まずDebianのisoをDLしてくる。
- Parallelsコンパネの右上にある+あたりからインストールアシスタントを呼び出す。
- DVD/イメージファイルから〜をダブルクリック
- 画面に従ってisoファイルをD&Dでぶち込むなり選択するなりする。
- マシンの構成はお好みでどうぞ。カメラやマイクはいらん気がする。
- さっさとインストール開始する
インストール
- 言語、場所、キーマップは全て日本語(キーボードが英字の奴は知らん)
- ホスト名、ドメイン名、rootのパス等々お好みで設定をしていく。
- パーティショニングもお好みで。
- ベースシステムのインストールが始まる。
- 別のインストールメディアを検査しますかは「いいえ」
- ネットワークミラーを使いますかは「はい」。ミラーの場所は自分のネットワーク的に最も近い場所を選ぶ。
- プロキシ情報は空でOK
- 利用調査はお好みで。
- ソフトウェアの選択は全てチェックを外す。
- ブートローダのインストールは「はい」&「/dev/sda」を選択。
- 再起動
Debianの設定
一時的に英語化
インストール時に日本語にしていると、直接仮想マシンを弄ると文字化けしてしまう。 そのため、一時的に英語化する。
export LANG=C
aptのソースリストからcdromを削除する
とは言っても削除は怖いのでコメントアウトで対応する。 まずは開く。
# vi /etc/apt/source.list
次に編集。deb cdrom:の行をコメントアウトする iキーで編集モードに入り、該当箇所に矢印キーで移動、コメントアウトの#をつける。 つけ終わったらescキーでコマンドモードに戻り、Shiftキーを押しながらZキーを2回押す。
deb cdrom: ~ # deb cdrom: ~ こんな感じに#をつけるだけ。
アップデート
アップデートする。
# apt update && apt upgrade -y && apt autoremove -y
必要なパッケージのインストールを行う
# apt install ufw sudo
ファイアウォールの設定
かのアインシュタインは言いました。インバウンドだけでなくアウトバウンドにもこだわりなさいと(嘘)
# ufw default deny incoming # ufw default deny outgoing # ufw allow out http # ufw allow in http # ufw allow out https # ufw allow in https # ufw allow out 53 # ufw logging on # ufw enable # systemctl enable ufw
必要なら適宜追加。
普段使いのユーザにsudo権限をつける
# visudo
nezumi_in_dobu ALL=(ALL:ALL) ALL
GUIのインストール
好きなものをインストールすればいいが、ここでは機能美&速度が早い(気がする)Xfceをインストールする。 電源管理のパッケージも入れないとスクリーンのタイムアウト(自動ロック)が設定できない。 ついでにブラウザとフォントもインストール。フォントはいらんがあるとちょっとかっこいい。
sudo apt install xfce4 xfce4-terminal xfce4-power-manager firefox-esr fonts-ricty-diminished
再起動
# reboot now
Parallels Tools のインストール
「メニューバー->Parallels Toolsのインストール」でインストーラのcdromが仮想マシンに挿入される。 恐らくデスクトップにCDのアイコンが表示されるのでダブルクリックで表示する。 CDの内容を適当な場所に作った適当なディレクトリに全コピーし、カレントディレクトリをコピーした内容物のあるディレクトリに移動する。 もしデスクトップにCDがないなら自力で探す。CDは/device/cdromか、/media/cdromにある。こいつらを/mntに作った適当なディレクトリにマウントして使用することになる。
カレントディレクトリを移動したら
sudo ./install
でインストール開始。 たまにgccだのなんだのが足りんからインストールして出直せ的なことを言われることがあるので、その時は素直に必要なパッケをメモってインストールしてから再挑戦する。
確か再起動を促されたような。
いらないパッケージを削除
sudo apt remove xterm vi
こんな感じでいらんパッケージを削除する。適宜追加。
最後にコンパネからディスク領域の最適化をする
読んで字の如く。コンパネから対象の仮想マシンを右クリックし、ディスク領域の再利用をクリックする。 私は4.14GBになりました。イイネ!!
完
快適なLinux on Macライフを! 普段はVPNを噛ませてるけど買い物とかアマプラはVPN通さずスルーさせたりとか、gitでクローンしてきたリポジトリを怖いけどビルドして実行してみたい時とか、LibreOfficeがmac上だと色々アレだからLinux上で使いたいとか色々使い所はあるはず。
Windowsの電源ショートカットを一通り作成するPythonスクリプト
だいぶ前に作ったやつ発掘したからアップしてみる。 ネットで調べながら作ったと思う。
import subprocess import re import winshell # 取得:既存の電源設定 powercfgs = subprocess.check_output('powershell -Command powercfg /L', shell=True).decode("shift_jis", errors="surrogateescape") print(powercfgs) # 分割:改行文字 powercfgs = powercfgs.split('\r\n') # print(powercfgs) # 初期化:GUIDを含む文字列 str_guids = [] # 取得:'GUID'を含む文字列 for val in powercfgs: if('GUID' in val) == True: str_guids.append(val) str_l_target = '電源設定の GUID: ' str_r_reg = r' (.*).*' str_r_after = '' # 初期化:電源プランdict dict_plans ={} # 整形:電源プラン for val in str_guids: guid = val.lstrip(str_l_target) guid = re.sub(str_r_reg, str_r_after, guid) plan_name = re.sub(r'電.*\(', '', val) plan_name = re.sub(r'\).*', '', plan_name) dict_plans[guid] = plan_name print(dict_plans) # 書込:ショートカットファイル for key, val in dict_plans.items(): path = './' + val with winshell.shortcut(path) as link: link.path = "C:\Windows\System32\powercfg.exe" link.description = val link.arguments = '-setactive ' + key link.working_directory = val