万年素人からHackerへの道

万年素人がHackerになれるまで殴り書きするぜ。

  • ・資産運用おすすめ
    10万円は1000円くらい利益
    資産運用ブログ アセマネ
    • ・寄付お願いします
      YENTEN:YYzNPzdsZWqr5THWAdMrKDj7GT8ietDc2W
      BitZenny:ZfpUbVya8MWQkjjGJMjA7P9pPkqaLnwPWH
      c0ban:8KG95GXdEquNpPW8xJAJf7nn5kbimQ5wj1
      Skycoin:KMqcn7x8REwwzMHPi9fV9fbNwdofYAWKRo

    Classes should define instance members.の解決

    class Fuga {
      static String get hoge => 'https://hoge.com’;
      static String get bar => 'https://bar.com’;
    }

    Classes should define instance members." の警告がでる。

    警告 "Classes should define instance members." の目的は、クラスを設計する際に、クラスがインスタンスメンバーを持つことを推奨することです。

    クラスがインスタンスメンバーを持つ場合、そのクラスのインスタンスを作成して使うことができます。 しかし、すべてのメンバーが静的メンバーであるクラスは、通常はインスタンスを作成する必要がなく、静的なコンテキストで使用されるため、 このようなクラスを設計することはあまり一般的ではありません。 警告が消える理由は、静的メソッドやプロパティを持つクラスは、通常、インスタンスメンバーを持たないことが期待されるためです。静的メンバーを持つクラスは、通常、ユーティリティクラスや定数を定義する場合などに使用されます。そのため、この警告は、静的メンバーのみを持つクラスを定義する場合に、クラスがインスタンスメンバーを持つべきでないという指針に基づいています。

    よってprivate なコンストラクタを使用して、インスタンス化を封じて解決する。

    class Fuga {
      // デフォルトのコンストラクタをプライベートにすることでインスタンス化を防ぐ
      Fuga._();
      static String get hoge => 'https://hoge.com’;
      static String get bar => 'https://bar.com’;
    }
    

    FlutterでのStreamをFutureにするためのテクニック

    FirebaseAuth.instance.idTokenChanges().listen(print) 自体はstreamなので Streamを返してしまう。

    以下のように.asFuture<void>()をつけてしまうと一生このコードの下を通過しない。待機し続ける。

    await FirebaseAuth.instance.idTokenChanges().listen(print);
    
    // await FirebaseAuth.instance.idTokenChanges().listen((log){print(log)}); と同義

    以下にするとなんか長い

    final event = await FirebaseAuth.instance.idTokenChanges().first;
    print(event);

    これがいい。1回取得して終わり。

    await FirebaseAuth.instance.idTokenChanges().first.then(print);

    Watchへ画像転送

    iPhone側のコード

    import UIKit
    import WatchConnectivity
    
    class ViewController: UIViewController, WCSessionDelegate {
        
        override func viewDidLoad() {
            super.viewDidLoad()
            
            if WCSession.isSupported() {
                let session = WCSession.default
                session.delegate = self
                session.activate()
            }
        }
    
        func sendQRCodeToWatch(text: String) {
            if let qrImage = generateQRCode(from: text), let imageData = qrImage.pngData() {
                if WCSession.default.isReachable {
                    let temporaryDirectory = FileManager.default.temporaryDirectory
                    let fileURL = temporaryDirectory.appendingPathComponent(UUID().uuidString + ".png")
                    
                    do {
                        try imageData.write(to: fileURL)
                        
                        guard FileManager.default.fileExists(atPath: fileURL.path) else {
                            print("File does not exist at path: \(fileURL.path)")
                            return
                        }
                        
                        print("File exists at path: \(fileURL.path)")
                        
                        let attributes = try FileManager.default.attributesOfItem(atPath: fileURL.path)
                        print("File attributes: \(attributes)")
                        
                        WCSession.default.transferFile(fileURL, metadata: nil)
                        print("QR code image file transfer started: \(fileURL)")
                    } catch {
                        print("Failed to write image data to file: \(error)")
                    }
                } else {
                    print("WCSession is not reachable")
                }
            }
        }
    
        func generateQRCode(from string: String) -> UIImage? {
            let data = string.data(using: String.Encoding.ascii)
            
            if let filter = CIFilter(name: "CIQRCodeGenerator") {
                filter.setValue(data, forKey: "inputMessage")
                filter.setValue("Q", forKey: "inputCorrectionLevel")
                
                if let qrCodeImage = filter.outputImage {
                    let transform = CGAffineTransform(scaleX: 10, y: 10)
                    let scaledQRCodeImage = qrCodeImage.transformed(by: transform)
                    
                    if let cgImage = CIContext().createCGImage(scaledQRCodeImage, from: scaledQRCodeImage.extent) {
                        return UIImage(cgImage: cgImage)
                    }
                }
            }
            return nil
        }
    
        // WCSessionDelegate methods
        func session(_ session: WCSession, activationDidCompleteWith activationState: WCSessionActivationState, error: Error?) {
            if let error = error {
                print("WCSession activation failed with error: \(error.localizedDescription)")
                return
            }
            print("WCSession activated with state: \(activationState.rawValue)")
        }
    
        func sessionDidBecomeInactive(_ session: WCSession) { }
    
        func sessionDidDeactivate(_ session: WCSession) {
            WCSession.default.activate()
        }
    }
    

    Apple Watch側のコード

    import WatchKit
    import WatchConnectivity
    
    class ExtensionDelegate: NSObject, WKApplicationDelegate, WCSessionDelegate {
        override init() {
            super.init()
            if WCSession.isSupported() {
                let session = WCSession.default
                session.delegate = self
                session.activate()
            }
        }
    
        func session(_ session: WCSession, activationDidCompleteWith activationState: WCSessionActivationState, error: Error?) {
            if let error = error {
                print("WCSession activation failed with error: \(error.localizedDescription)")
                return
            }
            print("WCSession activated with state: \(activationState.rawValue)")
        }
    
        func sessionReachabilityDidChange(_ session: WCSession) {
            print("WCSession reachability changed: \(session.isReachable)")
        }
        
        func session(_ session: WCSession, didReceiveMessage message: [String : Any]) {
            if let receivedData = message["key"] as? String {
                print("Watch Received data: \(receivedData)")
                NotificationCenter.default.post(name: NSNotification.Name("ReceivedData"), object: receivedData)
            }
        }
        
        func session(_ session: WCSession, didReceive file: WCSessionFile) {
            let fileURL = file.fileURL
            print("Received file at URL: \(fileURL)")
            do {
                let data = try Data(contentsOf: fileURL)
                print("File data loaded successfully.")
                if let image = UIImage(data: data) {
                    print("Image created from data successfully.")
                    DispatchQueue.main.async {
                        NotificationCenter.default.post(name: NSNotification.Name("ReceivedImage"), object: image)
                    }
                } else {
                    print("Failed to create image from data.")
                }
            } catch {
                print("Failed to load data from file URL: \(error)")
            }
        }
    }
    
    Caught exception during archival: This object may only be encoded by an NSXPCCoder

    のエラーが発生。これは実機で繋がないとダメなようだ。 iPhone実機のケーブルを抜き差ししたらAppleのSettings直下の一番下のDevelopメニューを適当にONにしたら、 さらに「プライバシーとセキュリティ」の中の一番下に「ディベロッパーモード」出てきた。

    Apple Watchのデベロッパーモードが表示されない時の対応方法 #AppleWatch - Qiita

    VLCでBlu-ray再生(M1 Maxは非対応?)

    Blu-ray再生するためのmac対応のフリーのアプリケーションがない

    ⇩このWebサイトが参考になった。

    videobyte.cc

    まず

    VLC Blu-Ray

    ここから必要な2ファイルを落とすのだか、赤で囲んだ2つだ。

    keydb.cfg

    ダウンロードした keydb_eng.zip を解凍する。 その中に keydb.cfgがあるので、 ~/Library/Preferences/aacs/ フォルダ( aacs フォルダ内からそれを勝手に作って)、入れる。

    libaacs.dylib

    もう一つの libaacs.dylib ファイルについては、Applicationの中にある ALCShow Package Contents を選んで

    Contents/MacOS/lib/ と辿っていき、入れる。

    僕の環境ではエラーにはならなくなった。 しかし再生はできない

    書籍ごとに入力ソースを自動的に切り替える

    ターミナルに戻った時に日本語のままで、英語にするのが面倒臭い

    https://android.benigumo.com/20220206/auto-switch-ime/

    [書籍ごとに入力ソースを自動的に切り替える]が便利だった