- 投稿日:2020-07-04T20:17:39+09:00
XcodeでSwiftのバージョンを確認する
★XcodeでのSwiftバージョン確認方法
現在Xcodeで開発しているものは、
果たしてSwift4・・? それとも、5・・・?というときの確認方法をまとめました!①[プロジェクト名(キャプチャ内ではmemo)]を選択
②[Build Settings]▶︎TARGETS>[memo]▶︎[Basic]▶︎[Levels]と順に選択
③検索窓に[Swift]と入力してEnter
④[Swift Language version]が該当箇所!(キャプチャではSwift5)ちなみに・・・
インストール済みのSwiftバージョンの確認方法は以下①ターミナルを起動
②以下をコピペ
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/swift -v
③Enter!
- 投稿日:2020-07-04T17:48:36+09:00
iOSアプリの作成(ボタンとラベルのみのシンプルコード)
前提
本稿は前の記事の続きです。
この記事はXcode 11.5をベースに記載しています。
ボタンとラベルを追加
(参考)サイズが異なるiPhoneでも同じ位置に表示されるようにするには、Autoresizingの設定を変更する
ラベルを参照するOutletコードを追加
Assistantビューを表示してレイアウトとコードが両方表示されるようにする
Control を押しながらラベルをコードにドラッグし、Outletを追加する
ボタン押下時のActionコードを追加
Controlを押しながらボタンをコードにドラッグしてActionを追加する
ボタン押下時にLabelのテキストが変わるコードを追記する
ViewController.swift@IBAction func execute(_ sender: Any) { resultLabel.text = "実行しました" }シミュレーターで動作確認
- 投稿日:2020-07-04T17:05:27+09:00
[RxSwift]flatMap系とcombineLatestの違い
flatMap
系使い方
a.flatMap(b)
,a.flatMapFirst(b)
,a.flatMapLatest(b)
等特徴
a
のonNext
の処理に、b
のonNext
の全処理を掛け合わせていく。
a
へのある要素への掛け合わせる処理が終わらないうちに、a
へさらに次の要素が流れてきた場合、
flatMapFirst
は次の要素を無視する
flatMapLatest
は現在の要素をキャンセルし次の要素の処理を行う
flatMap
は次の要素も現在の要素も両方行う。
combineLatest
使い方
Observable.combineLatest(a, b) { $0 + $1 }
等特徴
a
とb
の最新の要素を掛け合わせる。
- 投稿日:2020-07-04T12:14:25+09:00
[Swift] カスタムstructを簡単にUserDefaultsに保存する <NSCodingは捨てよう>
NSCoding意味わかんない
意味分かんない
UserDefaultsに保存できるデータ型
UserDefaultsに保存できるデータ型は
数値型
文字列型
真偽型
データ型(Data、NSData)
とこれらを値とする
配列型
辞書型(キーは文字列型に限る)
のみとなっています。非対応のデータ型を保存する方法 その1
保存できるデータ型(Data,NSDataを除く)に変換する。
例えば CGRect を数値の配列に変換して保存するなどです。
extension UserDefaults { func set(_ value: CGRect, forKey key: String) { let rectDataArray = [value.origin.x, value.origin.y, value.width, value.height] set(rectDataArray, forKey: key) } func cgRect(forKey key: String) -> CGRect? { guard let rectDataArray = array(forKey: key) as? [CGFloat] else { return nil } guard rectDataArray.count == 4 else { return nil } return CGRect(x: rectDataArray[0], y: rectDataArray[1], width: rectDataArray[2], height: rectDataArray[3]) } }非対応のデータ型を保存する方法 その2
その1で数値や文字列にするのが難しいデータ型の場合はデータ(NSData/Data)に変換して保存します。
その助けをするのがNSCodingプロトコルとNSKeyedArchiver/NSKeyedUnarchiverです。これをやりたくない趣旨のエントリですので詳細は省きます。
非対応のデータ型を保存する方法 その3
実はSwiftにはNSCodingを使わなくてもデータ型をデータ(NSData/Data)に簡単に変換してもらえる便利なものがあります。
Codable = Encodable & Decodable
です。Codableへの準拠は変わったデータ型ではない限り、コンパイラが自動で行ってくれるのがすごくうれしい!
これを使わない手はありません。
ここではCoderとしてJSON(En/De)coderを使用しました。extension UserDefaults { func setEncoded<T: Encodable>(_ value: T, forKey key: String) { guard let data = try? JSONEncoder().encode(value) else { print("Can not Encode to JSON.") return } set(data, forKey: key) } func decodedObject<T: Decodable>(_ type: T.Type, forKey key: String) -> T? { guard let data = data(forKey: key) else { return nil } return try? JSONDecoder().decode(type, from: data) } }CGRectを保存してみましょう。
CGRectはCodableに準拠してますので特に何か付け加える必要はありません。let cgRect = CGRect(x: 0, y: 0, width: 100, height: 100) UserDefaults.standard.setEncoded(cgRect, forKey: "KEY") // storedCGRect's type is CGRect. let storedCGRect = UserDefaults.standard.decodedObject(CGRect.self, forKey: "KEY")はい、簡単、型安全。
とくにまとめることはない
簡単さと標準準拠を肝としたのでUserDefaultsのKeyがStringで危険なままですが、そのあたりは別にいろいろあるのでググったりなんだりすればいいと思う。
- 投稿日:2020-07-04T11:10:44+09:00
【Swift】ScrollViewがカクつく時の対処法
下記ブログの転載です!
https://rc-code.info/ios/post-273/iOSにて、
UIScrollView
のカクつきを改善する必要があったので備忘録。
今回はUIScrollViewDelegate.scrollViewDidScroll
を利用している時の対処法を紹介します。
UIScrollViewがカクつく理由
まず UIScrollView に限らず描画がカクつく場合、その理由は
mainthread
を圧迫していることがほとんどです。
mainthread
については、こちらを参考にしていただければと思います。scrollViewDidScroll内の処理を見直す
さて、今回解決したいのは
UIScrollView
のカクつきですが、scrollViewDidScroll
というUIScrollView.Delegate
の処理が重たくなりすぎているというケースがよく見られます。後述する対策は
scrollViewDidScroll
だけでなく、他のUIScrollView.Delegate
の関数にも有効な場合があるので、参考にしてみてください。UIScrollView のカクつきを再現する負荷試験
下記は
extension
でscrollViewDidScroll
を定義したサンプルになります。extension ViewController: UIScrollViewDelegate { func scrollViewDidScroll(_ scrollView: UIScrollView) { var count: Int = 0 var array: [Int] = [] repeat { array.append(count) array.reverse() count += 1 } while(count < 200) } }上記のソースでは、スクロールされる度に 0〜199 までの数字を配列に格納してはリバースするという再帰処理を行なっています。
count を array に格納しリバース、countに+1 (array=[0]、count=1 になる)
count を array に格納しリバース、countに+1 (array=[1,0]、count=2 になる)
以下、199まで繰り返し、、、この処理が少しでもスクロールされる度に行われるので、なかなか重いタスクとなります。
scrollViewDidScroll
という関数は、スクロール
というUI操作に紐づいているので、この重たい処理はmainthread
にて処理されてしまいます。
つまり、scrollViewDidScroll
関数内に負荷がかかると画面更新に影響するということです。
実際にこの処理を加えてUIScrollViewをスクロールしていただくと、カクつくことが分かると思います。カクつきを解消する方法
class ViewController: UIViewController { //スクロール処理用Queue private let scrollSessionQueue = DispatchQueue(label: "ScrollSessionQueue") ...以下省略 } extension ViewController: UIScrollViewDelegate { func scrollViewDidScroll(_ scrollView: UIScrollView) { // mainthread を圧迫しないように、別スレッドで処理 scrollSessionQueue.async { var count: Int = 0 var array: [Int] = [] repeat { array.append(count) array.reverse() count += 1 } while(count < 200) } } }上記のソースでは、
ViewController
にscrollLogSessionQueue
というQueueを新たに呼び出しています。そして
scrollViewDidScroll
内の処理をscrollSessionQueue.async
で囲むことで、処理をmainthread
から別threadに移譲しています。
すなわち、処理はmainthread
ではなく、UIに関連しない別のthread
にて処理されることになります。実際に動かしてみると、スクロールが滑らかになっていることが分かると思います。
DispatchQueue
の詳しい生成方法については こちら を参考にしていただければと思います。修正後の注意点
ただ、別threadにて処理を行う際には注意が必要です。
主に挙げられる注意点は①別threadにすれば100%画面更新に影響がなくなるわけではない
②別threadに移譲するので、実行タイミングがズレるという2点です。
①についてですが、
scrollLogSessionQueue.async
で別スレッドを使ってもCPUやGPUが圧迫されることは免れませんし、別スレッド内の処理によっては再度mainthread
への移譲が行われるという事もあり得ます。
なので100%影響がなくなるというわけではありません。
サンプルコードscrollLogSessionQueue.async
の中で行われている処理の負荷を上げていくと、この事が分かるかと思います。②について、指定したthreadに処理を移譲するので、当然ながら処理は画面と同期しません。
画面的にはスムーズにスクロールしたり、スクロールが既に完了していても、scrollLogSessionQueue.async
内の処理が同様に完了しているとは限らないので、注意が必要です。
検証Playground
検証環境
Mac: 10.14.4
XCode: 10.2
Swift: 5.0
参考ドキュメント
- 投稿日:2020-07-04T11:08:23+09:00
【Swift】WKWebViewでJavaScriptのコールバックを受けつける(WKUserContentControllerの使い方)
下記ブログの転載です!
https://rc-code.info/ios/post-194/iOSにて、
WKWebView
でJavaScriptのコールバックを受けつける必要があったので備忘録。
今回はWKUserContentController
を利用した方法を紹介します。
WKWebView の使い方
まずは
WKWebView
の基本的な使い方ですが、こちらを参考にしていただければと思います。
WKUserContentController の使い方
WKUserContentController
はJavaScript
からのコールバック受信や、スクリプトをWebビューに挿入する方法を提供します。
下記が導入のサンプルコードです。import UIKit import WebKit class ViewController: UIViewController { var webView: WKWebView! override func loadView() { // ① WKUserContentController の生成 let userContentController = WKUserContentController() // ② WKUserContentController にコールバックハンドラを登録 userContentController.add(self, name: "jsCallbackHandler") let webConfiguration = WKWebViewConfiguration() // ③ WKWebViewConfiguration に生成した WKUserContentController を登録する webConfiguration.userContentController = userContentController webView = WKWebView(frame: .zero, configuration: webConfiguration) view = webView } } // ④ WKScriptMessageHandler のデリゲートを記載 extension ViewController: WKScriptMessageHandler { // ⑤ JavaScript から呼び出されるコールバックハンドラ関数を記載 func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) { switch message.name { case "jsCallbackHandler": print("Javascript message arrived: jsCallbackHandler") default: return } } }1 WKUserContentController の生成
WKUserContentController
はWKWebViewConfiguration
に格納する必要があるので、まずはインスタンスを生成します。
2 WKUserContentController にコールバックハンドラを登録
WKUserContentController
のadd関数を用いて、JavaScript
から実行したい関数を持つクラスインスタンス(WKScriptMessageHandler
プロトコルに準拠したクラス)を第一引数に設定し、コールバックの判別に利用するためのString
をname引数に設定します。
このadd関数は何度も実行できるので、複数のコールバックを処理したい場合はname引数を変更して実行すれば、後述するコールバック関数内で判定することができます。
3 WKWebViewConfiguration に生成した WKUserContentController を登録する
生成した
WKUserContentController
インスタンスは、WKWebViewConfiguration
のuserContentController
プロパティに格納します。
4 WKScriptMessageHandler のデリゲートを記載
上記
ViewController
はデリゲート先としてWKUserContentController
に渡され登録されているので、WKScriptMessageHandler
プロトコルに準拠させる必要があります。
5 JavaScript から呼び出されるコールバックハンドラ関数を記載
WKScriptMessageHandler
プロトコルに準拠させるために、userContentController関数
を実装します。この関数を実装する事で、Javascript
からのコールバックを受け付けることができるようになります。JSからは下記のように、②の箇所のadd関数にて
name引数
に指定したコールバックを実行します。webkit.messageHandlers.jsCallbackHandler.postMessage("Message from Javascript");コールバックハンドラ内では
message.name
プロパティでコールバック名を取得することができるので、サンプルコードのようにswitch文等で判定する事で、処理を分岐させる事ができます。
検証Playground
検証環境
Mac: 10.13.6
XCode: 10.1
Swift: 4.2.1
参考ドキュメント
公式 WKWebView ドキュメント
公式 WKWebViewConfiguration ドキュメント
公式 WKUserContentController ドキュメント
- 投稿日:2020-07-04T11:05:30+09:00
【Swift】WKWebViewの基本的な使い方
下記ブログの転載です!
https://rc-code.info/ios/post-241/iOSにて、Webページを表示する必要があったので、
WKWebView
の基本的な使い方を備忘録。
WKWebView の使い方
WKWebView
の基本的な使い方です。
下記が公式のサンプルコードです。WKWebView を利用する際は
UIKit
とWebKit
を import します。
WKWebView の initialize はCGRect
とWKWebViewConfiguration
を引数にとります。
該当するURLページを開くには、WKWebView のload関数
を実行します。import UIKit // 1 WebKit の import import WebKit class ViewController: UIViewController { var webView: WKWebView! override func loadView() { // 2 WKWebViewConfiguration の生成 let webConfiguration = WKWebViewConfiguration() // 3 WKWebView に Configuration を引き渡し initialize webView = WKWebView(frame: .zero, configuration: webConfiguration) // 4 WKUIDelegate の移譲先として self を登録 webView.uiDelegate = self // 5 WKNavigationDelegate の移譲先として self を登録 webView.navigationDelegate = self // 6 view に webView を割り当て view = webView } override func viewDidLoad() { super.viewDidLoad() // 7 URLオブジェクトを生成 let myURL = URL(string:"https://www.apple.com") // 8 URLRequestオブジェクトを生成 let myRequest = URLRequest(url: myURL!) // 9 URLを WebView にロード webView.load(myRequest) } } // MARK: - 10 WKWebView ui delegate extension ViewController: WKUIDelegate { // delegate } // MARK: - 11 WKWebView WKNavigation delegate extension ViewController: WKNavigationDelegate { // delegate }
1 WebKit の import
WebView関連のコードを扱うには
WebKit
をimport
する必要があります。
冒頭にimport WebKit
を記載すると、XcodeにてWebView関連の補完が効くようになるかと思います。2 WKWebViewConfiguration の生成
WKWebViewConfiguration
はWKWebView
の初期化時に参照される設定プロパティが含まれるクラスです。
WKWebViewConfiguration
を使用すると、Webページがレンダリングされるまでの時間、メディア再生の処理方法、ユーザーが選択できるアイテムの細分性、およびその他の多くのオプションを決定できます。
WKWebViewConfiguration
は、WKWebView
が最初に初期化されたときにのみ使用されます。このクラスを使用して、WKWebView
の作成後にその設定を変更することはできません。3 WKWebView を initialize
WKWebView
の初期化にはframe引数にWebViewのサイズ、configuration引数に生成したWKWebViewConfigurationのインスタンスを引き渡します。4 WKUIDelegate の移譲先として self を登録
WKWebView
のuiDelegate
プロパティにself
をセットする事で、インターフェースに関わるWebViewの関数をクラス内で扱う事ができるようになります。5 WKNavigationDelegate の移譲先として self を登録
WKWebView
のnavigationDelegate
プロパティにself
をセットする事で、振る舞いに関わるWebViewの関数をクラス内で扱う事ができるようになります。6 view に webView を割り当て
生成した
WKWebView
のインスタンスをControllerのviewに割り当てます。7 URLオブジェクトを生成
表示したいURLのStringをURLクラスのstring引数に指定し、インスタンスを生成します。
8 URLRequestオブジェクトを生成
生成したURLクラスのインスタンスをURLRequestクラスのurl引数に指定し、インスタンス生成します。
9 URLを WebView にロード
WKWebView
のload関数にURLRequestインスタンスを引き渡し、実行します。
この関数を叩くことで、webViewのリクエストが走ります。10 WKWebView ui delegate
WKWebView ui delegate の部分には、
WKWebView
のインターフェースに関わるdelegate関数を記述します。
詳細は公式ドキュメント参照。
11 WKWebView WKNavigation delegate
WKWebView WKNavigation delegate の部分には、
WebView
の振る舞いに関わるdelegate関数を記述します。
詳細は公式ドキュメント参照。
実行環境
Mac: 10.13.6
XCode: 10.1
Swift: 4.2.1
参考ドキュメント
公式 WKWebView ドキュメント
公式 WKWebView ui delegate ドキュメント
公式 WKWebView WKNavigation delegate ドキュメント
- 投稿日:2020-07-04T10:48:54+09:00
【Swift】WKPreferences の minimumFontSize が効かない
下記ブログの転載です!
https://rc-code.info/ios/post-236/iOSの
WKWebViewConfigration
に設定するWKPreferences
のminimumFontSize
が効かないケースがあったので調査&備忘録。
WKWebView の使い方
WKWebView
の基本的な使い方に関しては こちら にまとめております。
合わせてご覧ください。
WKPreferences minimumFontSize の設定方法
WKPreferences
はWebビューの基本設定をカプセル化するオブジェクトです。(公式ドキュメント)
このうちminimumFontSize
はptサイズでフォントの最小サイズを決めるプロパティです。
まずは使い方を記載します。
import UIKit // ① WebKit の import import WebKit class ViewController: UIViewController { var webView: WKWebView! override func loadView() { // ② WKWebViewConfiguration の生成 let webConfiguration = WKWebViewConfiguration() // ③ WKPreferences の生成 let preferences = WKPreferences() // ④ WKPreferences の minimumFontSize プロパティに値を指定 preferences.minimumFontSize = 100.0 // ⑤ WKWebViewConfiguration に WKPreferences のインスタンスを設定 webConfiguration.preferences = preferences // ⑥ WKWebView に Configuration を引き渡し initialize webView = WKWebView(frame: CGRect(x: 150, y: 200, width: 200, height: 20), configuration: webConfiguration) // ⑦ view に WKWebView を割り当て view = webView } override func viewDidLoad() { super.viewDidLoad() loadView() webView.load(URLRequest(url: URL(string: "https://www.apple.com/")!)) } }
上記のように、まず
WKPreferences
のインスタンスを生成し、このプロパティであるminimumFontSize
に最小サイズにしたいフォントサイズをpt換算で指定します。
そして
WKPreferencesインスタンス
をWKWebViewConfiguration
にセットし、このWKWebViewConfiguration
をWKWebView
の設定として使います。
minimumFontSize が効かないケース
さて本題ですが、このWebViewで様々なサイトを見てみると、
minimumFontSize
を設定しているにも関わらず、指定フォントサイズ以下なってしまう場合が見受けられます。検証した結果、この事象にはCSSの
text-size-adjust
というスタイルが影響していることが分かりました。
text-size-adjust スタイルとは?
text-size-adjust
(ベンダープレフィックスだと-webkit-text-size-adjust
) は、一部のデバイスで使われるテキストの自動拡大アルゴリズムを制御するスタイルです。
対応していないブラウザーはこのプロパティを無視します。一部のモバイル端末には、縦向き (Portrate) と横向き (Landscape) が切り替わった際に文字サイズを自動調整する機能があり、
text-size-adjust
はこの自動調整を制御します。
text-size-adjust が設定されると minimumFontSize が効かなくなる
検証を行なった結果、
text-size-adjust
によって縮小されたサイズはminimumFontSize
によって制限されたフォントサイズよりも小さくなることが分かりました。念の為、その他のスタイル指定でフォントサイズの制限が無視されないか検証しています。
検証内容
最下部 Playground の Resources ディレクトリに様々なスタイル定義によるフォントサイズ変更を含んだHTMLファイルを用意しました。
minimumFontSize
を設定した WKWebViewにて、このHTMLをそれぞれ表示した結果、text-size-adjust
を設定したHTMLのみ、minimumFontSize
で指定した値よりフォントサイズが小さくなりました。
下記画像が、
minimumFontSize
に100
を設定し、上部テキストに様々なスタイル定義で40px
相当のフォントサイズを指定した画像です。
下記テキストは比較用のプレーンなテキストです。見た通り、スタイルで指定された
40px
を無視し、minimumFontSize
に指定されている100pt
相当の大きさで表示されています。
変わって次の画像が
text-size-adjust
にを指定した時の画像です。こちらの上部テキストでは、スタイルで指定された
40px
が無視され、minimumFontSize
に指定されている100pt
が適用されるはずですが、text-size-adjust
に指定している10%
が適用され、4px (40pxの10%)
相当の大きさになっています。
まとめ
全ての要素・スタイルを検証できているわけではないので確実ではないですが、
WKPreferences
のminimumFontSize
を指定しているのにフォントが想定以下のサイズになってしまうようであれば、text-size-adjust
の設定を疑ってみるのが良いかもしれません。
検証Playground
検証環境
Mac: 10.13.6
XCode: 10.1
Swift: 4.2.1
参考ドキュメント
WebKit
WKWebViewConfiguration
WKPreferences
text-size-adjust
- 投稿日:2020-07-04T05:10:39+09:00
名古屋で開催されている技術イベント・勉強会
はじめに
この度、名古屋を離れ、関東へ引っ越すことになりました。名古屋(東海圏)エンジニアを増やして地元を盛り上げていくという夢が叶わなくなってしまいました。
名古屋でもエンジニアコミュニティを盛り上げようと頑張っている企業さんや、エンジニアさんがたくさんいることを多くの人に共有したくこの記事を書いています。
名古屋へのUターンを考えていたり、リモートができるようになり都心を離れようかなぁと考えている人は、ぜひ次の拠点として名古屋を選択に入れる参考にしてみてください。
*以下イベント情報の概要はリンクページから一部引用させていただいています。
定期開催編
以下、定期開催されている勉強会です。
Yahoo! JAPAN Nagoya
主催:Yahoo! JAPAN
概要:ヤフー株式会社の名古屋オフィスで開催するクリエイター向け勉強会コミュニティ。 多種多様なクリエイター同士が交流できる場所として、開発スキルやノウハウについて学びながら、社内外のクリエイターがアウトプット/インプットできる機会になるべく、2019年3月にスタート。フロントエンドもくもく会
主催:Nagoya Frontend User Group
概要:フロントエンドを中心にしたもくもく会。名古屋の企業・団体からの会場提供を受けている。名古屋アジャイル勉強会
概要:アジャイルの考え方や方法を体験的に学び、職場で活かすことを応援する、誰でも参加できるグループ。
Mobile Act
主催:フェンリル
概要:モバイルアプリ開発関連の情報共有や参加者同士の交流を目的とした勉強会。Nagoya.Swift+
概要:技術者としての好奇心や向上心を満たすために技術的な挑戦をするふりをして遊びます。
nagoya.go
概要:名古屋のGoコミュニティ。もくもく会やGo勉強会が開催されている。
OthloTech
主催:OthloTech
概要:OthloTech<オスロテック>は東海圏の学生エンジニア・デザイナーによる学校を超えたコミュニティ。 月に1〜2回、学生限定の勉強会やハッカソンを開催。JAWS-UG名古屋
主催:JAWS-UG名古屋支部
概要:Amazon Web Services(AWS)のユーザグループ、JAWS-UGの名古屋支部のイベント。
AWSに興味があるんだけど周りに知ってる人がいない、がっつり勉強したい!という人たちが集い、一緒に勉強する場を企画。MISO MOKU
主催:Misoca Developer Meetup
概要:毎週ベースで行われていた、エンジニア・デザイナー向けのもくもく会。弥生株式会社と合併したため、2020年7月以降の開催は未定。Nagoya.unity
概要:名古屋を中心に活動を行うUnityユーザのコミュニティで、主に勉強会などの開催を行っています。
OWASP Nagoya
主催:OWASP Nagoya Chapter
概要:Webをはじめとするソフトウェアのセキュリティ環境の現状、またセキュアなソフトウェア開発を促進する技術・プロセスに関する情報共有と普及啓発を目的としたプロフェッショナルの集まる、オープンソース・ソフトウェアコミュニティ。名古屋ギークバー
概要:技術的なものから、アナログゲーム、LT大会、生ハムを食べるなど、幅広くイベントを開催され、名古屋のギークな人達に会える。
Nagoya.php
概要:名古屋のPHPユーザーのコミュニティで、隔月で勉強会をやっています。(現在コロナのため休止中)
番外編
開催頻度が低いけど大規模だったり、面白い試みをしているイベントを書いていきます。
NGK
概要:NGKは、東海地方IT系コミュニティ合同の大新年会。普段から東海地方の勉強会に参加している人、今まで参加したことがない人、他地域の人など、 誰にとっても、さまざまなコミュニティとつながりを広げ、深める良い機会になることを目指すイベント。
東海のエンジニアはみんな参加しているのではないか?と思うぐらい大規模なイベント。
みそかつウェブ
概要:名古屋という土地を生かし、エンジニア&デザイナーコミュニティを盛り上げるため、 IT業界に関わる人同士の交流の場として似た境遇の仲間を探したり、相談できる友人を作ったりできるコミュニティです。
最後に
思いついたイベントをばっと書いているので、どんどん追記していきます。他もあるよ~みたいなご意見ありましたら是非いただけますと嬉しいです。
コミュニティも盛り上がっているので、ぜひ色々参加してみてください。
割とアットホームな土地(外からはそう思われていないかもしれないが)なので、いいですよ~。
- 投稿日:2020-07-04T05:10:39+09:00
名古屋で開催されいている技術イベント・勉強会
はじめに
この度、名古屋を離れ、関東へ引っ越すことになりました。名古屋(東海圏)エンジニアを増やして地元を盛り上げていくという夢が叶わなくなってしまいました。
名古屋でもエンジニアコミュニティを盛り上げようと頑張っている企業さんや、エンジニアさんがたくさんいることを多くの人に共有したくこの記事を書いています。
名古屋へのUターンを考えていたり、リモートができるようになり都心を離れようかなぁと考えている人は、ぜひ次の拠点として名古屋を選択に入れる参考にしてみてください。
*以下イベント情報の概要はリンクページから一部引用させていただいています。
定期開催編
以下、定期開催されている勉強会です。
Yahoo! JAPAN Nagoya
主催:Yahoo! JAPAN
概要:ヤフー株式会社の名古屋オフィスで開催するクリエイター向け勉強会コミュニティ。 多種多様なクリエイター同士が交流できる場所として、開発スキルやノウハウについて学びながら、社内外のクリエイターがアウトプット/インプットできる機会になるべく、2019年3月にスタート。フロントエンドもくもく会
主催:Nagoya Frontend User Group
概要:フロントエンドを中心にしたもくもく会。名古屋の企業・団体からの会場提供を受けている。名古屋アジャイル勉強会
概要:アジャイルの考え方や方法を体験的に学び、職場で活かすことを応援する、誰でも参加できるグループ。
Mobile Act
主催:フェンリル
概要:モバイルアプリ開発関連の情報共有や参加者同士の交流を目的とした勉強会。Nagoya.Swift+
概要:技術者としての好奇心や向上心を満たすために技術的な挑戦をするふりをして遊びます。
nagoya.go
概要:名古屋のGoコミュニティ。もくもく会やGo勉強会が開催されている。
OthloTech
主催:OthloTech
概要:OthloTech<オスロテック>は東海圏の学生エンジニア・デザイナーによる学校を超えたコミュニティ。 月に1〜2回、学生限定の勉強会やハッカソンを開催。JAWS-UG名古屋
主催:JAWS-UG名古屋支部
概要:Amazon Web Services(AWS)のユーザグループ、JAWS-UGの名古屋支部のイベント。
AWSに興味があるんだけど周りに知ってる人がいない、がっつり勉強したい!という人たちが集い、一緒に勉強する場を企画。MISO MOKU
主催:Misoca Developer Meetup
概要:毎週ベースで行われていた、エンジニア・デザイナー向けのもくもく会。弥生株式会社と合併したため、2020年7月以降の開催は未定。Nagoya.unity
概要:名古屋を中心に活動を行うUnityユーザのコミュニティで、主に勉強会などの開催を行っています。
OWASP Nagoya
主催:OWASP Nagoya Chapter
概要:Webをはじめとするソフトウェアのセキュリティ環境の現状、またセキュアなソフトウェア開発を促進する技術・プロセスに関する情報共有と普及啓発を目的としたプロフェッショナルの集まる、オープンソース・ソフトウェアコミュニティ。名古屋ギークバー
概要:技術的なものから、アナログゲーム、LT大会、生ハムを食べるなど、幅広くイベントを開催され、名古屋のギークな人達に会える。
Nagoya.php
概要:名古屋のPHPユーザーのコミュニティで、隔月で勉強会をやっています。(現在コロナのため休止中)
番外編
開催頻度が低いけど大規模だったり、面白い試みをしているイベントを書いていきます。
NGK
概要:NGKは、東海地方IT系コミュニティ合同の大新年会。普段から東海地方の勉強会に参加している人、今まで参加したことがない人、他地域の人など、 誰にとっても、さまざまなコミュニティとつながりを広げ、深める良い機会になることを目指すイベント。
東海のエンジニアはみんな参加しているのではないか?と思うぐらい大規模なイベント。
みそかつウェブ
概要:名古屋という土地を生かし、エンジニア&デザイナーコミュニティを盛り上げるため、 IT業界に関わる人同士の交流の場として似た境遇の仲間を探したり、相談できる友人を作ったりできるコミュニティです。
最後に
思いついたイベントをばっと書いているので、どんどん追記していきます。他もあるよ~みたいなご意見ありましたら是非いただけますと嬉しいです。
コミュニティも盛り上がっているので、ぜひ色々参加してみてください。
割とアットホームな土地(外からはそう思われていないかもしれないが)なので、いいですよ~。
- 投稿日:2020-07-04T03:05:54+09:00
iOS 13 rootViewController 切替メモ
rootViewController 切替
iOS 13 から rootViewController の持ち方が SceneDelegate に代わりました。rootViewController切り替えの例です。
UIWindow, rootViewController の扱い
UIWindow, rootViewControllerは
SceneDelegate
で管理します。
ビューコントローラーを切り替えたい場合は、次のようにします。let sceneDelegate = UIApplication.shared.connectedScenes.first!.delegate as! SceneDelegate sceneDelegate.window!.rootViewController = 新しいビューコントローラーアニメーション効果
上記だけでと一瞬で画面が切り替わってしまうので、若干のアニメーション効果をつけてみます。
UIWindow間でのaddSubviewなどもできなくなってるっぽいので、やり方の例としてこんな風な処理をおこなっています。
1.遷移元の画面を画像化し、遷移先の画面に配置
2.rootViewController を入れ替える
3.アニメーションを利用して 1.の画像を透明化して削除まず先にUIViewを画像化する処理を作成します。
extension UIView { // UIVIewを画像化 func GetImage() -> UIImage { // キャプチャする範囲を取得. let rect = self.bounds // ビットマップ画像のcontextを作成. UIGraphicsBeginImageContextWithOptions(rect.size, false, 0.0) let context: CGContext = UIGraphicsGetCurrentContext()! // 対象のview内の描画をcontextに複写する. self.layer.render(in: context) // 現在のcontextのビットマップをUIImageとして取得. let capturedImage : UIImage = UIGraphicsGetImageFromCurrentImageContext()! // contextを閉じる. UIGraphicsEndImageContext() return capturedImage } }rootViewController を切り替える処理を作成します。
extension UIViewController { // rootViewController を入れ替える画面遷移 func moveTo(_ viewController: UIViewController) { // 元画面の画像をセット let imageView = UIImageView(image: self.view.GetImage()) viewController.view.addSubview(imageView) // rootViewController入れ替え let sceneDelegate = UIApplication.shared.connectedScenes.first!.delegate as! SceneDelegate sceneDelegate.window!.rootViewController = viewController // 元画面の画像を削除 UIView.animate(withDuration: 0.5, animations: { imageView.alpha = 0.0 }, completion: { _ in imageView.removeFromSuperview() }) } }
self.moveTo(遷移先のビューコントローラー)
で処理を実装できます。
- 投稿日:2020-07-04T00:46:46+09:00
[Swift5]paizaでよく使う文法メモ
背景
普段Swift使ってアプリを開発していますが、
「paizaをSランクにしておくといいかも」との助言もあり、ついこの間paizaをやりはじめてみました。普段使わない文法で慣れていなかったり、そもそもコードのバージョンが古いサイトもあったので、自分用に「paizaでよく使う文法」をまとめました。
参考にどうぞ。よく使うコード
標準入力
//1行取得 例:1 let input_line = readLine()! //複数行 /* 例: 8 2 3 */ let input_line1 = readLine()! let input_line2 = readLine()! let input_line3 = readLine()! //複数行 もっと多いときとか var strs = [String]() for _ in 0..<8 { strs.append(readLine()!) }文字列の処理
//例: 1 3 5 7 → ["1","3","5","7"] let strs = input_line.split(separator:" ") //例: 16357 → ["1","6","3","5","7"] let strs = input_line.map{String($0)} //例: ["1","3","5","7"] → [1,3,5,7] let numbers = strs.map({Int($0)!})let s = "ぎょうざたべたい" //前から◯文字取得 s.prefix(3) //ぎょう //後ろから◯文字取得 s.suffix(2) //たい //◯文字切り捨て s.dropLast(2) //ぎょうざたべ //文字列切り出し m文字目〜n文字目 let i1 = s.index(s.startIndex, offsetBy: 3) let i2 = s.index(s.startIndex, offsetBy: 6) s[i1...i2] //ざたべた s[i1..<i2] //ざたべ //文字列結合 let s1 = "はら" let s2 = "へった" s1 + s2 //はらへった let array = ["はら","へった"] array.joined() //はらへった array.joined(separator:" ") //はら,へった array.joined(separator:",") //はら へった//文字列に文字が含まれるか let s = "はろーSwift" if s.contains("は"){ print("OK") }//文字列の一部を置き換え var s = "はじめましてこんにちは" if let range = s.range(of:"こんにちは"){ s.replaceSubrange(range, with: "さようなら") //はじめましてさようなら }配列並び替え
var array = [5,2,6,7,1] array.sort{$0 < $1} //昇順 [1,2,5,6,7] array.sort{$0 > $1} //降順 [7,6,5,2,1] array.reversed() //逆順 [1,7,6,2,5]・sort()は配列を書き換える
・sorted()は配列を書き換えない配列初期化
var a = [String]() var b = [[String]]() b.append(["はじ","めまして"])配列絞り込み
//例:3で割り切れるもののみからなる配列に let array = [5,2,6,3,1] array.filter({$0 % 3 == 0}) //[6,3]絶対値
let a = abs(-6) //6累乗
let a = pow(5.0, 3)◯進数
let a = 44 let str2 = String(num, radix: 2) let str16 = String(num, radix: 16) //2進数を10進数に let int = Int("110110", radix: 2)最大、最小
max(1,5,2) //5 min(1,5,2) //2小数点以下切り捨て・切り上げ・四捨五入
let a = 3.1 floor(a) //切り捨て 3.0 ceil(a) //切り上げ 4.0 round(a) //四捨五入 3.0 //小数点をずらして整数値に let b = a * 10 floor(b) / 10 //切り捨て 3 ceil(b) / 10 //切り上げ 4 round(b) / 10 //四捨五入 30埋めする format指定
let num1 = String(format: "%04d", 9) //0009 let num2 = String(format: "%0.3f", 0.2) // 0.200大文字・小文字
let a = "swift".uppercased() let b = "SWIFT".lowercased()終わりに
「他にもこれよく使うよ」という文法があったらコメントで教えてくれると喜びます(笑)
一緒にpaizaランクSを目指しましょう!
- 投稿日:2020-07-04T00:46:46+09:00
[Swift5]paizaでよく使う文法メモ(初心者向け)
背景
普段Swift使ってアプリを開発していますが、
「paizaをSランクにしておくといいかも」との助言もあり、ついこの間paizaをやりはじめてみました。普段使わない文法で慣れていなかったり、そもそもコードのバージョンが古いサイトもあったので、自分用に「paizaでよく使う文法」をまとめました。
参考にどうぞ。よく使うコード
標準入力
//1行取得 例:1 let input_line = readLine()! //複数行 /* 例: 8 2 3 */ let input_line1 = readLine()! let input_line2 = readLine()! let input_line3 = readLine()! //複数行 var strs = [String]() for _ in 0..<8 { strs.append(readLine()!) } //複数行 while let line = readLine() { // 入力された行に対する処理 }※7/4追記
コメント欄で以下の方法を教えていただきました。ありがとうございます。//複数行取得 let s = AnyIterator { readLine() }.joined() //配列で取得(くそ便利) let arr = Array(AnyIterator { readLine() })文字列の処理
//例: 1 3 5 7 → ["1","3","5","7"] let strs = input_line.split(separator:" ") //例: 16357 → ["1","6","3","5","7"] let strs = input_line.map{String($0)} //例: ["1","3","5","7"] → [1,3,5,7] let numbers = strs.map({Int($0)!})let s = "ぎょうざたべたい" //前から◯文字取得 s.prefix(3) //ぎょう //後ろから◯文字取得 s.suffix(2) //たい //◯文字切り捨て s.dropLast(2) //ぎょうざたべ //文字列切り出し m文字目〜n文字目 let i1 = s.index(s.startIndex, offsetBy: 3) let i2 = s.index(s.startIndex, offsetBy: 6) s[i1...i2] //ざたべた s[i1..<i2] //ざたべ //文字列結合 let s1 = "はら" let s2 = "へった" s1 + s2 //はらへった let array = ["はら","へった"] array.joined() //はらへった array.joined(separator:" ") //はら,へった array.joined(separator:",") //はら へった//文字列に文字が含まれるか let s = "はろーSwift" if s.contains("は"){ print("OK") }//文字列の一部を置き換え var s = "はじめましてこんにちは" if let range = s.range(of:"こんにちは"){ s.replaceSubrange(range, with: "さようなら") //はじめましてさようなら }配列並び替え
var array = [5,2,6,7,1] array.sort{$0 < $1} //昇順 [1,2,5,6,7] array.sort{$0 > $1} //降順 [7,6,5,2,1] array.reversed() //逆順 [1,7,6,2,5]・sort()は配列を書き換える
・sorted()は配列を書き換えない配列初期化
var a = [String]() var b = [[String]]() b.append(["はじ","めまして"])配列絞り込み
//例:3で割り切れるもののみからなる配列に let array = [5,2,6,3,1] array.filter({$0 % 3 == 0}) //[6,3]絶対値
let a = abs(-6) //6累乗
let a = pow(5.0, 3)◯進数
let a = 44 let str2 = String(num, radix: 2) let str16 = String(num, radix: 16) //2進数を10進数に let int = Int("110110", radix: 2)最大、最小
max(1,5,2) //5 min(1,5,2) //2小数点以下切り捨て・切り上げ・四捨五入
let a = 3.1 floor(a) //切り捨て 3.0 ceil(a) //切り上げ 4.0 round(a) //四捨五入 3.0 //小数点をずらして整数値に let b = a * 10 floor(b) / 10 //切り捨て 3 ceil(b) / 10 //切り上げ 4 round(b) / 10 //四捨五入 30埋めする format指定
let num1 = String(format: "%04d", 9) //0009 let num2 = String(format: "%0.3f", 0.2) // 0.200大文字・小文字
let a = "swift".uppercased() let b = "SWIFT".lowercased()終わりに
「他にもこれよく使うよ」という文法があったらコメントで教えてくれると喜びます(笑)
一緒にpaizaランクSを目指しましょう!