プログラマメモ2 - programmer no memo2

(swift)if判定して値を返して変数に直接に入れるみたいな - if式 (その2) 2024/06/02

メモを帳をみなさんどうしていますか。

ぜひおすすめなのでトラベラーズノート。
トラベラーズノート(amazon)

「must be a single expression」という制約

このような書き方はできない


do { // この書き方はできない
    // let s: Int? = 100
    // let a = if let a = s {
    //     let b = a + 100
    //     String(format: "ok \(b)")
    // } else {
    //     String(format: "not 100")
    // }
    // print("*** ok a:\(a)")
}

クロージャ(無名関数?)を使えばいいのではないかという結論


do { // 中身をクロージャにすると複数行でもかける
    let s: Int? = 100
    let a = if let a = s {
        { let b = a + 100
            return String(format: "ok \(b)")
        }()
    } else {
        String(format: "not 100")
    }
    print("*** ok a:\(a)")
}

僕にとって、if式がなぜそんなに嬉しいのか。

手続きで考えれば、ある変数に値を編集して入れる場合、編集する内容を、代入する変数の前に書くのがまあ普通のことかと思います。
ただ、どうも僕はそのような書き方が好きでないようなんですよね。
まあ、多くの人にとってはたいした問題ではないと思いますが、このif式のような書き方(表現の仕方)が、いいんですよね...もうちょっと深掘り(deepなdive)してみたいですね

(swift)if判定して値を返して変数に直接に入れるみたいな - if式 2024/06/02

メモを帳をみなさんどうしていますか。

最近のマイ流行りは、トラベラーズノート。かなり昔に買っていたのですが、引越しのために整理していて、出てきたのですが、実は、このノートに自分が必要としているものが全て詰まっていたのではないかと。
トラベラーズノート(amazon)

if判定して値を返して変数に直接に入れるみたいな


do {
    let s: String? = "test"
    let a = if let a = s {
        String(format: "ok \(a)")
    } else {
        String(format: "ok nil")
    }
    print("*** ok a:\(a)")
}

分かりずらい例かとは思いますが、オプショナルな値に値があるか判定しつつ、その結果を変数に代入しているような感じだと思います。
他の言語はよくわからないのですが、この書き方をしたかったんですよね。三項演算子は、いろいろな言語にあるとは思います。
この書き方は、どうでしょうか。

参考

目玉のようなグラフィック 2024/05/18

人生ままならないものですね。

自分がこうあって欲しいと思う状況から、ほど遠く。そろそろ真剣にお酒とのお付き合いをしていかないとねー

swiftuiでまず描きます

久々にグラフィックツールを触りました。といってもたいした絵を描くわけではいのですが。使ったツールはSketch, Paintcode。あとはChatGPTですね。Paintcodeで生成されたコードをchatGPTで変換してもらってますが、実は、そんなにすんなりは行きませんでした。ききかたが悪いでしょうね。僕の。


        // Drawing container
        ZStack {
            // First shape with fillColor
            Path { path in
                path.move(to: CGPoint(x: 114, y: 0))
                path.addCurve(to: CGPoint(x: 228, y: 114), control1: CGPoint(x: 176.96, y: 0), control2: CGPoint(x: 228, y: 51.04))
                path.addCurve(to: CGPoint(x: 114, y: 228), control1: CGPoint(x: 228, y: 176.96), control2: CGPoint(x: 176.96, y: 228))
                path.addCurve(to: CGPoint(x: 0, y: 114), control1: CGPoint(x: 51.04, y: 228), control2: CGPoint(x: 0, y: 176.96))
                path.addCurve(to: CGPoint(x: 114, y: 0), control1: CGPoint(x: 0, y: 51.04), control2: CGPoint(x: 51.04, y: 0))
                path.closeSubpath()
                
                path.move(to: CGPoint(x: 114, y: 33))
                path.addCurve(to: CGPoint(x: 33, y: 114), control1: CGPoint(x: 69.26, y: 33), control2: CGPoint(x: 33, y: 69.26))
                path.addCurve(to: CGPoint(x: 114, y: 195), control1: CGPoint(x: 33, y: 158.74), control2: CGPoint(x: 69.26, y: 195))
                path.addCurve(to: CGPoint(x: 195, y: 114), control1: CGPoint(x: 158.74, y: 195), control2: CGPoint(x: 195, y: 158.74))
                path.addCurve(to: CGPoint(x: 114, y: 33), control1: CGPoint(x: 195, y: 69.26), control2: CGPoint(x: 158.74, y: 33))
                path.closeSubpath()
            }
            .fill(Color(red: 0.129, green: 0.129, blue: 0.537))
            
            // Second shape with fillColor2
            Path { path in
                path.move(to: CGPoint(x: 114.5, y: 160))
                path.addCurve(to: CGPoint(x: 161, y: 113.5), control1: CGPoint(x: 140.18, y: 160), control2: CGPoint(x: 161, y: 139.18))
                path.addCurve(to: CGPoint(x: 114.5, y: 67), control1: CGPoint(x: 161, y: 87.82), control2: CGPoint(x: 140.18, y: 67))
                path.addCurve(to: CGPoint(x: 68, y: 113.5), control1: CGPoint(x: 88.82, y: 67), control2: CGPoint(x: 68, y: 87.82))
                path.addCurve(to: CGPoint(x: 114.5, y: 160), control1: CGPoint(x: 68, y: 139.18), control2: CGPoint(x: 88.82, y: 160))
                path.closeSubpath()
            }
            .fill(Color(red: 0.965, green: 0.773, blue: 0.0))
        }.background(Color.black) // VStackの背景を黒に設定

UIImageにしてみたコード

コードで表現できたので、大きくしたり小さくしたり、いろいろできることでしょう。


import UIKit

func createImage() -> UIImage? {
    let size = CGSize(width: 228, height: 228) // 画像のサイズを設定
    UIGraphicsBeginImageContextWithOptions(size, false, 0) // 透明背景のImage Contextを開始

    // 最初のベジェ曲線を描画
    let fillColor = UIColor(red: 0.129, green: 0.129, blue: 0.537, alpha: 1.000)
    fillColor.setFill()
    let bezierPath = UIBezierPath()
    bezierPath.move(to: CGPoint(x: 114, y: 0))
    bezierPath.addCurve(to: CGPoint(x: 228, y: 114), controlPoint1: CGPoint(x: 176.96, y: 0), controlPoint2: CGPoint(x: 228, y: 51.04))
    bezierPath.addCurve(to: CGPoint(x: 114, y: 228), controlPoint1: CGPoint(x: 228, y: 176.96), controlPoint2: CGPoint(x: 176.96, y: 228))
    bezierPath.addCurve(to: CGPoint(x: 0, y: 114), controlPoint1: CGPoint(x: 51.04, y: 228), controlPoint2: CGPoint(x: 0, y: 176.96))
    bezierPath.addCurve(to: CGPoint(x: 114, y: 0), controlPoint1: CGPoint(x: 0, y: 51.04), controlPoint2: CGPoint(x: 51.04, y: 0))
    bezierPath.close()
   

    // 内側のベジェ曲線を描画
    bezierPath.move(to: CGPoint(x: 114, y: 33))
    bezierPath.addCurve(to: CGPoint(x: 33, y: 114), controlPoint1: CGPoint(x: 69.26, y: 33), controlPoint2: CGPoint(x: 33, y: 69.26))
    bezierPath.addCurve(to: CGPoint(x: 114, y: 195), controlPoint1: CGPoint(x: 33, y: 158.74), controlPoint2: CGPoint(x: 69.26, y: 195))
    bezierPath.addCurve(to: CGPoint(x: 195, y: 114), controlPoint1: CGPoint(x: 158.74, y: 195), controlPoint2: CGPoint(x: 195, y: 158.74))
    bezierPath.addCurve(to: CGPoint(x: 114, y: 33), controlPoint1: CGPoint(x: 195, y: 69.26), controlPoint2: CGPoint(x: 158.74, y: 33))
    bezierPath.close()
    bezierPath.fill()

    // 2番目のベジェ曲線を描画
    let fillColor2 = UIColor(red: 0.965, green: 0.773, blue: 0.000, alpha: 1.000)
    fillColor2.setFill()
    let bezier2Path = UIBezierPath()
    bezier2Path.move(to: CGPoint(x: 114.5, y: 160))
    bezier2Path.addCurve(to: CGPoint(x: 161, y: 113.5), controlPoint1: CGPoint(x: 140.18, y: 160), controlPoint2: CGPoint(x: 161, y: 139.18))
    bezier2Path.addCurve(to: CGPoint(x: 114.5, y: 67), controlPoint1: CGPoint(x: 161, y: 87.82), controlPoint2: CGPoint(x: 140.18, y: 67))
    bezier2Path.addCurve(to: CGPoint(x: 68, y: 113.5), controlPoint1: CGPoint(x: 88.82, y: 67), controlPoint2: CGPoint(x: 68, y: 87.82))
    bezier2Path.addCurve(to: CGPoint(x: 114.5, y: 160), controlPoint1: CGPoint(x: 68, y: 139.18), controlPoint2: CGPoint(x: 88.82, y: 160))
    bezier2Path.close()
    bezier2Path.fill()

    let image = UIGraphicsGetImageFromCurrentImageContext() // 画像を取得
    UIGraphicsEndImageContext() // Image Contextを終了

    return image
}

今年{2024-04-29.月}にAWS認定(PAS-C01)受けましたよ。 2024/05/15

鬼滅の刃「柱稽古編」がはじまりましたね!

楽しみです。

結果

試験結果は、受験後すぐに画面にでました。他の人の受験記で、すぐにでたとあったので、なるほどでたと思いました。

AWS Certified: SAP on AWS - Specialty (PAS-C01) の試験結果(スコア)は791でした。スコアはぎりぎりといえばぎりぎりなのですが、いままでの試験の中では安心して受けれたように思います。全冠をねらってみたいなと思った矢先に3つの試験がリタイアになったのですが、その内のひとつの試験がこれでした。受験してよかった試験のベスト3にはいります。もうこのテストは受験できませんが...

学習方法

SAP自体はもちろん触ったことがないのですが、検索して調べて受かったひとがちらほらいらしたので、まあなんとかなるだろうと。

学習期間は、4月の頭からはじめたのですが、集中したのは3日ぐらいだったと思います。途中で、あきらめかけてたのですが、「あきらめたらそこで試合終了ですよ」by安西先生というフレーズを、有楽町にある最近よくよらせてもらっているビールスタンドの店員さんからいわれ、おいこめたからだと思います。

CloudLicenseの問題数は、少なかったのがうれしかったです。13セクションしかなく、91問(13 x 7)しかなかったので、問題を解く苦痛が少なかったです。

SkillBuilderは「SAP on AWS (Technical) (Japanese) (Sub) 日本語字幕版」と、20問の模擬試験のみ利用しました。

この試験で一番よかったのは、「SAP Lens for AWS Well-Architected」を読みこんだことですね。印刷して、1周目で、知らない用語をマークして、問題集(CloudLicense)を一回やってから、もう一回読み込みこんで、理解が深めるという感じでした。試験の範囲は、このLensがカバーしていると思いましたよ。Lensよかった。

SAP Lens for AWS Well-Architectedフレームワークの紹介 | Amazon Web Services ブログ

とても参考になったブログはこちらです。印刷して、試験の直前まで読みました。用語集も用意されていて本当にありがとうございます。

【資格】AWS認定 SAP on AWS - 専門知識に合格した勉強法 - 顧客フロントSEのIT勉強ブログ

今回の学習法はまあよかったかなと自画自賛しております。このやり方を次に活かしたいと思っております。

「AWS Certified: SAP on AWS - Specialty (PAS-C01) 」(日本語)にたいする不満はないわけではない

日本語で受験したのですが、用語の訳語が統一されていないような気がします。あと「平行」ではなく「並行」だろとか...

他の受けた試験について

今年{2024-03-21.木}にAWS認定(DBS-C01)受けましたよ。 2024/05/12
2024/05/15

呪術廻戦

netflixで、渋谷事変を観たのですが、そこそこ陰鬱な気分になれてよかったです。続きが知りたくて、アマゾンでコミックをちょこちょこ買って読み進めていますが、はっきり登場人物と背景情報が多すぎて頭がごちゃごちゃしています。

呪術廻戦 1 (ジャンプコミックスDIGITAL) Kindle版(amazon)

結果

スコアは810でした。二度目の受験だったのですが、だめだめですね...もう少しスコアがいい勉強をしないといけないと思いました。

テストを受けながら、まあ受かっているよなーという感覚はありましたが、この問題はおとすだろうなーという感覚もあり、微妙な気持ちでしたね。

学習について

特記するようなこともなく、前回はまったくCloudLicenseをやってなかったので、問題になれるために1周して2周目はまちがったところだけというのをやりました。SkillBuilderは前回の学習のさいはかなり見ていたのでさすがに今回はモチベがわかず...

前回のMLSの試験から、学習する際にプリントアウトして勉強するという方法は継続させていて、CloudLicenseの解説からAWSへのドキュメントにとんで、印刷して、あとから見直ししたりしましたね。まあ、実は、印刷だけして見直してなかったりしてたりしましたが。

あっ、ちなみに、この試験はもう受験できませんよ!

AWS 認定の廃止と開始のお知らせ 2024.04.08 廃止

他の受けた試験について

iOS上のでバックグラウンド処理については、このQAを読むべし 2024/05/11
2024/05/12

iOS上のでバックグラウンド処理について

常駐のプロセスとして能動的に動くのは無理っぽいというお話。 3秒ごとに自分で動いて処理をするようなこととか。

なにかのタスクを実行するためには、OKなようで、それは例えばダウンロード、ストリーミングとか、あとは位置情報の更新イベントを受けるとか。

このQAを読むべしなのだろう。

iOS Background Execution Limits - https://developer.apple.com/forums/thread/685525

UIApplication Background Task Notes - https://developer.apple.com/forums/thread/85066

ファグランドとバックグラウンド

調べていて、いろいろ混乱してしまいました。 まず、フォアグラウンド状態で、背後で動かすということと、アプリがバックグラウンド状態で動かすということをいりまじっているような気がしました。 むずかしいですよね....

[swift][iot]mqttでpublishできたので、メモ 2024/05/06

あとでゆっくりまとめます

とりあえずできたので.. いろいろ注意する点はありますよ!


func importIdentity(fileName:String) {
    guard let path = Bundle.main.path(forResource: fileName, ofType: "p12") else {
        print("*** not found file")
        return
    }
    
    let url = URL(fileURLWithPath: path)
    guard let data = try? Data(contentsOf: url) else {
        print("*** not get data")
        return
    }
    
    DispatchQueue.global().async {
        let b = AWSIoTManager.importIdentity(fromPKCS12Data: data, passPhrase: "", certificateId: "bbb")
        
        if b {
            print("*** ok import")
        } else {
            print("*** failed.")
        }
        
        let iotEndPoint = AWSEndpoint(
            urlString: IOT_ENDPOINT
        )
        
        let iotDataConfiguration = AWSServiceConfiguration(
            region: AWSRegionType.APNortheast1,
            endpoint: iotEndPoint,
            credentialsProvider: nil
        )
        
        let mqttConfig = AWSIoTMQTTConfiguration(keepAliveTimeInterval: 60.0,
                                                 baseReconnectTimeInterval: 1.0,
                                                 minimumConnectionTimeInterval: 20.0,
                                                 maximumReconnectTimeInterval: 128.0,
                                                 runLoop: RunLoop.current,
                                                 runLoopMode: RunLoop.Mode.default.rawValue,
                                                 autoResubscribe: true,
                                                 lastWillAndTestament: AWSIoTMQTTLastWillAndTestament())
        
        
        
        AWSIoTDataManager.register(with:iotDataConfiguration!,
                                   with:mqttConfig,
                                   forKey: "aaaa")
    }
    
}
func aaa() {
    
    let iotDataManager = AWSIoTDataManager(forKey: "aaaa")
    let b0 = iotDataManager.connect(withClientId: "xxx", cleanSession:false, certificateId:"bbb", statusCallback: {_ in } )
    
    print("*** result \(b0)")
    let topic = "things/Test-Device/shadow/update/accepted"
    
    let b = iotDataManager.publishString("{\"message\": \"o_o! aaaaaaaaaaaaaaaa\"}", onTopic: topic, qoS: .messageDeliveryAttemptedAtLeastOnce)
    
    print("*** result \(b)")
}