ずっと5月

3日坊主してます

Xcode10.1でiPadOS13をビルドする

現象

先日かいたこの記事に従って13.3のデバイスサポートファイルをよしなに配置する

akasatanappa.hatenablog.com

すると

dyld_shared_cache_extract_dylibs failed xcode

というエラーが出てビルドに失敗するようになった

対処法

$ cd ~/Library/Developer/Xcode/iOS DeviceSupport/13.3 (17C54)/Symbols/System/Library/Caches/com.apple.dyld
$ touch .processed_dyld_shared_cache_arm64e

これでXcodeを再起動すればビルドできるようになった

参考

stackoverflow.com

LeetCode#5 Merge Two Sorted Lists

2つのソート済みのListがあるからそれをマージしろっていう問題。 学生の時にCか何かでやった気がする

class Solution {
    func mergeTwoLists(_ l1: ListNode?, _ l2: ListNode?) -> ListNode? {
        if l1 == nil {return l2}
        if l2 == nil {return l1}
        
        var result:ListNode? = ListNode.init(0)
        
        if l1!.val < l2!.val {
            result = l1
            result!.next = mergeTwoLists(l1!.next, l2)
        } else {
            result = l2
            result!.next = mergeTwoLists(l1, l2!.next)
        }
        return result
    }
}

これはほぼ最適解ママだった、気がする

LeetCode#4 ZigZag Conversion

今日もやった。受け取った文字列を指定された行数でジグザグに配置したものを変えす。説明が難しい。 たとえば、"あいうえおかきくせこさしすせそ" という文字列と3を引数に受け取ったら、
f:id:uminokaze521:20200103141655p:plain
になる。行数が4で指定されたら

f:id:uminokaze521:20200103141657p:plain
になる。
公式の問題を読んだほうが良いかもしれない。

leetcode.com

解いたコードがこれ。 ジグザグが一回りする文字数は、2 * numRows - 2で求められる。
上から1行ごとに計算していくとよさそうだった。

class Solution {
    func convert(_ s: String, _ numRows: Int) -> String {
        if numRows == 1 {return s}
        let length:Int = s.count
        let cycleLen:Int = 2 * numRows - 2
        var ans:String = ""
        for i in 0..<numRows {
            for j in stride(from: 0, to: length - i, by: cycleLen) {
                ans.append(s[s.index(s.startIndex, offsetBy: i + j)])
                if (i != 0) && (i != numRows - 1) && (j + cycleLen - i < length) {
                    ans.append(s[s.index(s.startIndex, offsetBy: j + cycleLen - i)])
                }
            }
        }
        return ans
    }
}

この方法の他にもソートする方法があるらしい。

leetcode.com

LeetCode#3 Palindrome Number

今日はEasyのPalindrome Numberをやった。 回文数っていうらしい。
数字を逆さまにした時に同じならtrue, 違うならfalseを返す。(負の数の場合、マイナスも一文字としてカウントするので問答でfalseになる)
先日のReverse Integerと同じように一の位から順番にポップ&プッシュして回分数を作るといい。 で、愚直にやったのがこれ。

class Solution {
    func isPalindrome(_ x: Int) -> Bool {
        var origin:Int = x
        var palindrome:Int = 0
        while origin > 0 {
            palindrome = palindrome * 10
            palindrome += origin % 10
            origin = origin / 10
        }
        return palindrome == x
    }
}

Stringにキャストして、String.reversed()したら一行でできるらしい。

LeetCode#2 Reverse Integer

Intで来る数字を逆転させる問題。123だったら321に。
-2の31から2の31乗-1まで許容してその範囲を超えると0を返す。

で書いたコードがこれ。

class Solution {
    func reverse(_ x: Int) -> Int {
        var num = x
        var res:Int = 0
        var tmpArray: [Int] = []
        let isNegative:Bool = num < 0
        
        num = isNegative ? num * (-1) : num
        while num > 0 {
            tmpArray.append(num % 10)
            num = num / 10
        }
        var i:Int = 1;
        tmpArray = tmpArray.reversed()
        for tmpNum in tmpArray {
            res = res &+ tmpNum * i
            i *= 10
        }
        
        res = isNegative ? res * (-1) : res
        return res > Int32.max || res < Int32.min ? 0 : res
    }
}

LeetCodeはアルゴリズムを教えてくれるのでそれをみながらコードを書き直してみる。

基本的には文字列の反転と同じように最後の桁をポップして結果の先頭にプッシュする処理を繰り返すことでできる。 オーバーフローのチェック方法は、(ポップした数字+今までの計算結果)/10がSwiftでいうInt32.maxと等しいかつ、ポップした数字が7を超えていれば正の数のオーバーフローになる。 らしいんだけど、今回の問題をSwiftで解く分には、Int型で計算してれば2の31乗でオーバーフローは起きないのでループの最後にチェックすれば良さそう

最終的にこうなった

class Solution {
    func reverse(_ x: Int) -> Int {
        var num:Int = x
        var res:Int = 0
        while num != 0 {
            let pop:Int = num % 10
            num = num / 10
            res = res * 10 + pop
            
            if res > Int32.max || res < Int32.min { return 0 }
        }
        return res
    }
}

Swiftの型についてはここを参考にした

fukatsu.tech

応用情報技術者試験に合格したので勉強法を書いとく

タイトル通り。令和元年秋期の試験に合格した。
勉強期間としては1ヶ月位。で、合格点ギリギリだった。両方60点前半 このくらいやれば合格ラインの上くらいに立てるのか、くらいに思ってもらえればと。

前提

  • ITパスポートを学生時代にとった、基本情報はとってない
  • 仕事で何かしらの言語でプログラミングをしている
  • 仕事でSQLを書いたことがある このくらいのレベル感でした。

用意したもの

  • Trelloアカウント
  • 参考書 午前はこれ

キタミ式イラストIT塾 応用情報技術者 令和02年 (情報処理技術者試験)

キタミ式イラストIT塾 応用情報技術者 令和02年 (情報処理技術者試験)

午後はこれ

2020 応用情報技術者 午後問題の重点対策 (重点対策シリーズ)

2020 応用情報技術者 午後問題の重点対策 (重点対策シリーズ)

やったこと

午前問題を一通り読む

5日位で午前問題の参考書を流し読みした。こういう問題があるんだなってわかればOKくらいの気持ちでやった。やらなくてもよかったかもしれない。もしくは5日もいらなかったかも。
次の過去問をひたすら解くほうが効果的だと思う。

午前の過去問をひたすら解く(試験3週間前〜)

ひたすら解いた。 下記の過去問道場で3年前の試験回から順に問題を解いていって、正答率が80%を超えなかったらもう1周同じ問題を解く。80%を超えたら1つ前の回に進むっていうのを繰り返してた。
www.ap-siken.com

これの正答率と進捗をTrelloで管理してた。普通に今やってる回くらいは覚えられるんだけどこうするとこんだけやったんだなぁみたいな気持ちになるのでモチベ維持に良い。(言うほどたくさんやってないけども)

f:id:uminokaze521:20191226221614p:plain

飽きたらたまに模擬試験形式で問題を解いてみて自分の今の実力を確認したりしてた。自分は試験1週間前で正答率70〜80%くらいだった気がする。

午後の問題を解く(試験1週間前〜)

午後の参考書を読みながら各章の後ろにある感じの問題を解いてた。午後は選択式なので自分の得意そうな分野を絞っておくといい。困ったらマネジメント系を選んでおけば午前の分野+一般常識で答えられるやつが多い気がする。

つらくなったり飽きたりしたら午前の過去問を解く。

あとは試験を受けるだけ。

がんばって起きる。

自分が選んだ午後問題は以下

xcode10.1ではiOS12.4.1をサポートしてないと言われた時

レイアウトの調整をしていてiPadで確認しようとビルドしようとした所下記のようなエラーが。

This iPad Pro (12.9-inch) (3rd generation) is running iOS 12.4.1 (16G102), which may not be supported by this version of Xcode.

xcode10.1ではiOS12.4.1をサポートしてませんとのこと。 ぐぐってみると以下のQiitaが出てきた。

qiita.com

これの対策2をとった。 1.下記から今回ビルドしたいOSのビルドサポートファイルをダウンロードする。

github.com

2.ダウンロードしたファイルを下記のディレクトリに置く Application/Xcode/Contents/Developer/Platforms/iPhoneOS.platform/DeviceSupport

3.xcodeを再起動

これで解決