プログラミングBlog

PaizaのDランクで苦戦

Dランクくらい簡単でしょうと思ってましたが、何気にはまってしまいました。
Paizaの問題は基本的に公開などしてはいけないのですが、 レベルアップ問題集に関しては公開しても問題ないそうなので苦戦したところをまとめました。

なお、このコーナー内の問題については、ユーザー同士で解答を教え合ったり、コードを公開したりするのは自由としています。 授業や研修にもご利用いただけますので、ぜひ教材などにもお使いください。

コーディングスキルチェック受験での禁止行為

解いてた問題

足し算(paizaランク D 相当)

aとbを足した数を出力して下さい

入力された値aとbを足した結果を表示する問題

やりたいことの流れ。

  1. 文字列の配列を数値に直す。
  2. 1件目と2件目を足して表示。

書いたコード

mapを使用して新しく数値型の配列を生成後、Reduceで配列の合計値を返却。

var numbers = lines.map(Number).reduce((a, b) => a + b);
console.log(numbers);

提出してみましたが採点結果10点でひどい結果

JavaScriptの標準入力ではまる。

原因はこれ。

※「掛け算」の問題では入力が改行区切りで与えられましたが、今回は半角スペース区切りで与えられます。

標準入力のパターン

改行型

1
1
reader.on('line', (line) => {
  lines.push(line);
});

連続型

11
reader.on('line', (line) => {
  input_lines = line.split(" ")
});

今回の場合は連続型パターンを使わないといけない。
問題はよく読みましょう

参考サイト

qiita.com

SwiftUITutorial Building Lists and Navigation②

SwiftUITutorialで学んだことをまとめていきます。

Create the Row View

Section2で学べること

  • 構造体の表示
  • layout作成

Landmarkの表示

Jsonファイルから取得したデータが格納されているLandmark構造体を表示させる。
HStackはUI 部品を横方向に複数配置する時に使う。
今回の場合はlandmark.imageとTextを横並びに配置している。
.resizable()で画像のリサイズを行う。
.frame(width: 50, height: 50)で幅50,高さ50指定。
Spacer()で幅いっぱいにスペースを追加する。

struct LandmarkRow: View {
    var landmark: Landmark

    var body: some View {
        HStack {
            landmark.image
                .resizable()
                .frame(width: 50, height: 50)
            Text(landmark.name)

            Spacer()
        }
    }
}

SwiftUIのPreview機能
これがないとPreviewが表示されない。
LandmarkRowにlandmarks配列の最初の一件を指定

struct LandmarkRow_Previews: PreviewProvider {
    static var previews: some View {
        LandmarkRow(landmark: landmarks[0])
    }
}

Customize the Row Preview

Section3で学べること

  • PreviewLayoutの変更

PreviewLayout

Groupでまとめて、複数のPreviewを表示させる。
previewLayout(.fixed(width: 300, height: 70))でPreviewのサイズを指定できる。

struct LandmarkRow_Previews: PreviewProvider {
    static var previews: some View {
        Group {
            LandmarkRow(landmark: landmarks[0])
            LandmarkRow(landmark: landmarks[1])
        }
        .previewLayout(.fixed(width: 300, height: 70))
    }
}

LandmarkRow.swift

import SwiftUI

struct LandmarkRow: View {
    var landmark: Landmark

    var body: some View {
        HStack {
            landmark.image
                .resizable()
                .frame(width: 50, height: 50)
            Text(landmark.name)

            Spacer()
        }
    }
}

struct LandmarkRow_Previews: PreviewProvider {
    static var previews: some View {
        Group {
            LandmarkRow(landmark: landmarks[0])
            LandmarkRow(landmark: landmarks[1])
        }
        .previewLayout(.fixed(width: 300, height: 70))
    }
}

SwiftUITutorial Building Lists and Navigation①

SwiftUITutorialで学んだことをまとめていきます。

Create a Landmark Model

Section1で学べること

  • Jsonファイル読み込み
  • 読み込んだJsonファイルをStructに詰め込む

struct

構造体のことで以下の特徴がある

  • 継承できない
  • クラスは参照型で構造体は値型

Hashable

hashについてはこちら
tokuty.hatenablog.com

Codable

API通信等で取得したJsonやプロパティリストを任意のデータ型に変換するプロトコル
これがないとJsonからStructのデータ変換が上手くいかない。

CLLocationCoordinate2D

位置情報を扱うときの型
coodinate.latitude:緯度 double型
coodinate.longitude:経度 double型

ファイルまでのパスを取得

    guard let file = Bundle.main.url(forResource: filename, withExtension: nil)
    else {
        fatalError("Couldn't find \(filename) in main bundle.")
    }

ファイル内容を取得

    do {
        data = try Data(contentsOf: file)
    } catch {
        fatalError("Couldn't load \(filename) from main bundle:\n\(error)")
    }

Jsonデータをデコード

    do {
        let decoder = JSONDecoder()
        return try decoder.decode(T.self, from: data)
    } catch {
        fatalError("Couldn't parse \(filename) as \(T.self):\n\(error)")
    }

作成したファイル

Landmark.swift

import Foundation
import SwiftUI
import CoreLocation

struct Landmark: Hashable, Codable {
    var id: Int
    var name: String
    var park: String
    var state: String
    var description: String

    private var imageName: String
    var image: Image {
        Image(imageName)
    }

    private var coordinates: Coordinates
    var locationCoordinate: CLLocationCoordinate2D {
        CLLocationCoordinate2D(
            latitude: coordinates.latitude,
            longitude: coordinates.longitude)
    }

    struct Coordinates: Hashable, Codable {
        var latitude: Double
        var longitude: Double
    }
}

ModelData.swift

import Foundation

var landmarks: [Landmark] = load("landmarkData.json")

func load<T: Decodable>(_ filename: String) -> T {
    let data: Data

    guard let file = Bundle.main.url(forResource: filename, withExtension: nil)
    else {
        fatalError("Couldn't find \(filename) in main bundle.")
    }

    do {
        data = try Data(contentsOf: file)
    } catch {
        fatalError("Couldn't load \(filename) from main bundle:\n\(error)")
    }

    do {
        let decoder = JSONDecoder()
        return try decoder.decode(T.self, from: data)
    } catch {
        fatalError("Couldn't parse \(filename) as \(T.self):\n\(error)")
    }
}

勉強会㉑

勉強会

今週はLT会お休みで普通のもくもく会してました。

Pythonの実行環境を揃える

Anaconda install

Pythonディストリビューション
www.anaconda.com

PyCharm install

IDE www.jetbrains.com

やったこと

Pythonのパッケージ管理システムでライブラリをinstall
pyautogui ・・・キャプチャを撮ったり、マウス操作ができるライブラリ

pipコマンド

pip install pyautogui

キャプチャの撮り方

import pyautogui

screenshot = pyautogui.screenshot()
screenshot.save('キャプチャ.png')

キャプチャ画像読み込み

from PIL import Image

img = Image.open('スクリーンショット.png')
img.show()

1秒間停止

import time

time.sleep(1)

完成したコード

import pyautogui
import time
from PIL import Image

num = 0
sc = pyautogui.screenshot()

while True:
    if num == 10:
        break
    print(num)
    sc.save(f'スクリーンショット{num}.png')
    img = Image.open(f'スクリーンショット{num}.png')
    img.show()
    num += 1
    time.sleep(1)

print('finish')

4月の振り返り。

今月からKPTはやめて普通に振り返ろうかと思います。

最近の出来事

  • 6月から次の案件(Javaの予定
  • 学習効率アップ
  • FE試験が6月
  • Swiftを学び始めた
  • 宣言駆動開発を始める

学習効率アップの仕方

学習の効率化を進めていきたいので学習の見直しを図りたいと思います。 直近の課題は、学習時間が長いわりに結果が出ていない気がするので、学習方法の見直しをすること。 そこで効率の良い学習方法について調べてみると、驚きの事実が発覚しました。


プログラミングの勉強する時によく「一つの言語をしっかり学んでから次に行きなさい」というアドバイスが多いですが、 自分の場合はずっと続けていると飽きしまったり、興味があることがたくさんあるので、 ずっと好きなことを同時並行で学習し続けていました。 (アンチパターン 笑


実はこのやり方はインターリービングという勉強方法で同じ勉強を何時間もずっと続けるのではなく、 別の勉強も並行して進めていくことで学習効率アップに繋がる勉強方法でした。結果的にちゃんとしたやり方のようなので今後も続けて行きたいと思います。

スケジュールを決めて行動していく。

集中型学習ではなく分散型学習を進めていく。よくある一夜漬けの丸暗記はせずに時間を決めてみっちり学習を行い、集中して取り組むことで短時間でも結果を出す学習スタイルを確立したい。
特に資格をとるためだけの一夜漬けに近い形の勉強法は意味がないと思うので長くゆっくり時間をかけて学習していきたい。
そのためにはスタートとゴールを明確にして一日ごとのタスクを細分化していくことが重要である。

宣言駆動開発

毎週土曜日の朝、前日までにテーマを決めてLTをするようにしています。
意外とこれが良質なアウトプットになっているので今後も続けていく。
得られる事は資料作り、説明力、自ら考える能力などたくさんあります。
ノージャンルで行っているため、新たな発見もあり、宣言駆動開発おススメです。

SwiftUIアプリをiPhoneにinstall

SwiftUIアプリをiPhoneにinstallした際のまとめ。

やることリスト。

  1. XcodeApple IDでログイン
  2. 証明書とキーチェーン作成
  3. iPhone端末へのinstall

installまでの参考サイト

tech-blog.rakus.co.jp

キーチェーン作成後、buildしてinstallするまで少し詰まったので以下にまとめました。

iPhone端末へのInstall

赤線の部分をinstall先のiPhone端末に変更する
f:id:Tokuty:20210503225249p:plain

もし表示されない場合はiPhone端末の許可設定を行いましょう。
それでもできない場合は接触が悪い可能性があるのでUSBの確認をしましょう。
f:id:Tokuty:20210503225703p:plain

Test.xcodeprojを選択する。 f:id:Tokuty:20210503230639p:plain  

Teamを選択する。
f:id:Tokuty:20210503231140p:plain

Build実行後にiPhone端末の許可設定を行う。
f:id:Tokuty:20210503231353p:plain

設定 ⇨ 一般 ⇨ デバイス管理  installの許可をしましょう。

無事iPhone端末にinstall完了。

参考サイト

SwiftUIプロジェクト作成方法
【Xcode】超初心者のためのSwiftUIチュートリアル1|やこ|note

勉強会⑳

Hands-on and Lightning Talks

開催日時 2021年5月3日(月) 7:00-9:00
本日の発表者は私と、koboriさんとNakagawaさんの3人!

発表者 テーマ 資料 時間
Nakagawa Gitで難儀してる話 5分
Toku BootStrapのGridLayout 発表用資料 20分
Kobori BootStrapダウンロードして使うやり方(2つの方法)とカスタマイズについて 45分

各テーマの感想

Gitで難儀してる話

gitのワークフローを使わずに開発を始めた結果、失敗した話。
mainブランチのみで開発を行っているため、main→派生ブランチ→派生ブランチのような開発フローで行ったが、 何をしているかわからなくなった。
結局mainに反映する際にcherrypickで必要なコミットのみpushした話。

BootStrapのGridLayout

GridLayoutを使うと簡単にレスポンシブ対応した、レイアウトを作成できる。
基本的に横幅を12分割するので、5分割などしたい場合は、独自のcssを定義する必要がある。

BootStrapダウンロードして使うやり方(2つの方法)とカスタマイズについて

前回はCDNから読み込んだが、今回はcss、jsファイルを直接サイトからDLして読み込む方法。
DLしたファイルを改造してオリジナルのcss、jsを作成する。
Scssも対応しているため、やり方の簡単な紹介。