ねずみの横穴

我出来損ナイノ編程者為リ

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!)
            }
        }
    }
}

おうち使いのLinuxのファイアウォールのインバウンドとアウトバウンド

概略


大体ファイアウォールの設定ではインバウンドは固く閉じて、アウトバウンドは緩いことが多い。

リバースシェルとか緩めのアウトバウンドを使用した攻撃もあるので、そいつに対抗するべくキチンとアウトバウンドも閉めておく。

WindowsmacはOSがファイアウォールを持っていたり、Nortonやesetのようなセキュリティソフトがそこそこいい感じにファイアウォールを設定してくれているが、Linuxはおそらく自力で頑張らなきゃいけない。

家庭用のルータにもファイアウォール(パケットフィルタリングとか名前ついてたりもする)がついているが、正直若干ザル感が否めない。

とりあえずおうちでLinuxと言ったらUbuntuなのでDebian系のフロントエンドufwを使ってみる。

コマンド類は最後に列挙します。

実践


とりあえず全部閉じ

まずは全部閉じても大丈夫。必要なものだけ開いていこう。

使うものだけ開けるって言っても・・・

使用するポートだけ開けるのが基本なのは言うまでもないが、じゃあ何を使うんだ。

・HTTP(S):80/tcp, 443/tcp

 →aptを使用したアップデートやパッケージのインストールに使用する。ネットサーフィンもこいつがないと話にならない。

DNS:53/udp

 →名前解決に使う子。こいつもないとネットに繋がらん・・・訳ではないがネットサーフィンは難しいと思う。何気にプロトコル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を構築する。

目的


macParallelsで使い捨ての仮想マシンを作りたい。 VMWareFusionはサスペンドが便利だけどLinuxはディスク領域の再利用が基本できないっぽい(2022/6/19現在)から一旦除外。

手順


Parallels上でisoファイルを読み込ませる。

  1. まずDebianのisoをDLしてくる。
  2. Parallelsコンパネの右上にある+あたりからインストールアシスタントを呼び出す。
  3. DVD/イメージファイルから〜をダブルクリック
  4. 画面に従ってisoファイルをD&Dでぶち込むなり選択するなりする。
  5. マシンの構成はお好みでどうぞ。カメラやマイクはいらん気がする。
  6. さっさとインストール開始する

インストール

  1. 言語、場所、キーマップは全て日本語(キーボードが英字の奴は知らん)
  2. ホスト名、ドメイン名、rootのパス等々お好みで設定をしていく。
  3. パーティショニングもお好みで。
  4. ベースシステムのインストールが始まる。
  5. 別のインストールメディアを検査しますかは「いいえ」
  6. ネットワークミラーを使いますかは「はい」。ミラーの場所は自分のネットワーク的に最も近い場所を選ぶ。
  7. プロキシ情報は空でOK
  8. 利用調査はお好みで。
  9. ソフトウェアの選択は全てチェックを外す
  10. ブートローダのインストールは「はい」&「/dev/sda」を選択。
  11. 再起動

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でクローンしてきたリポジトリを怖いけどビルドして実行してみたい時とか、LibreOfficemac上だと色々アレだからLinux上で使いたいとか色々使い所はあるはず。

macメニューバーの文字を大きくする

macのメニューバーの文字が小さい


何時ごろからだったか小さくなった。

設定の変更


  1. りんごマーク->システムの環境設定->アクセシビリティ
  2. 左ペインの「ディスプレイ」->「ディスプレイ」タブ
  3. メニューバーのサイズを「デフォルト」から「大」に変更
  4. 「システムの環境設定」を赤ボタンで閉じると再ログインを促されるので再ログインする。

どのくらい大きくなるの?


微妙に大きくなる。 文字は大きくなるが通知領域(?)のアイコンサイズは変わらない。

所感


もう少し大きくなってもいいと思う。 そもそもなんで小さくした。

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

タイトルバーの高さ

やりたいこと


素のWindows10だとタイトルバーがぶっとく画面が勿体無い感があるので細くしたい。

場所

レジストリエディターで弄る。

コンピューター\HKEY_CURRENT_USER\Control Panel\Desktop\WindowMetrics

弄るキー


  • BorderWidth
    • -5
  • CaptionHeight
    • -270
  • CaptionWidth
    • -450
  • PaddedBorderWidth
    • -30
  • ScrollWidth
    • -175