ぴぽのたわごと

ジャンル問わず。自由気ままに書いてます。

【iOS】XMLを解析する(swift3)

XMLを解析するには 「XMLParse」を使います。
このクラスのデリゲートメソッドによって

  • XML解析の開始/終了
  • 開始/終了タグと中のデータ

などを確認することができます。
詳しくはリファレンスを参照ください。

XMLParserDelegate - Foundation | Apple Developer Documentation

以下サンプルです。

import UIKit
class ViewController: UIViewController, XMLParserDelegate {
    
    override func viewDidLoad() {
        super.viewDidLoad()

        // XML解析実行
        loadxml()
    }

    // XMLを解析する
    func loadxml(){
        // 解析するXMLのURL
        let urlString = "https://news.yahoo.co.jp/pickup/entertainment/rss.xml"
        
        guard let url = NSURL(string: urlString) else{
            return
        }
        
        // インターネット上のXMLを取得し、NSXMLParserに読み込む
        guard let parser = XMLParser(contentsOf: url as URL) else{
            return
        }
        parser.delegate = self;
        parser.parse()
    }
    
    // XML解析開始時に実行されるメソッド
    func parserDidStartDocument(_ parser: XMLParser) {
        print("XML解析開始しました")
    }
    
    // 解析中に要素の開始タグがあったときに実行されるメソッド
    func parser(_ parser: XMLParser, didStartElement elementName: String, namespaceURI: String?, qualifiedName qName: String?, attributes attributeDict: [String : String]) {
        print("開始タグ:" + elementName)
    }
    
    // 開始タグと終了タグでくくられたデータがあったときに実行されるメソッド
    func parser(_ parser: XMLParser, foundCharacters string: String) {
        print("要素:" + string)
    }
    
    // 解析中に要素の終了タグがあったときに実行されるメソッド
    func parser(_ parser: XMLParser, didEndElement elementName: String, namespaceURI: String?, qualifiedName qName: String?) {
        print("終了タグ:" + elementName)
    }
    
    // XML解析終了時に実行されるメソッド
    func parserDidEndDocument(_ parser: XMLParser) {
        print("XML解析終了しました")
    }
    
    // 解析中にエラーが発生した時に実行されるメソッド
    func parser(_ parser: XMLParser, parseErrorOccurred parseError: Error) {
        print("エラー:" + parseError.localizedDescription)
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
}

2行目:XMLParserDelegateの定義
デリゲートを継承します。

12〜26行目:XMLParserの実行処理
対象のXMLを指定、実行します。
HTTPSではないサイトの場合はアクセスできないのでATSを設定する必要があります。(下参照)

28〜56行目:XMLParserの解析処理
開始/終了、データの中身を確認します。

サンプルURLはヤフーさんのエンタメ記事です。
実行結果

XML解析開始しました
開始タグ:rss
要素:

開始タグ:channel
要素:

開始タグ:title
要素:Yahoo!
要素:ニュース・トピックス - エンタメ
終了タグ:title
要素:

開始タグ:link
要素:https://news.yahoo.co.jp/hl?c=c_ent
終了タグ:link
要素:

開始タグ:description
要素:Yahoo! JAPAN
要素:のニュース・トピックスで取り上げている最新の見出しを提供しています。
終了タグ:description
要素:

開始タグ:language
要素:ja
終了タグ:language
要素:

開始タグ:pubDate
要素:Tue, 09 Jan 2018 01:06:36 +0900
終了タグ:pubDate
要素:

開始タグ:item
要素:

開始タグ:title
要素:矢口 再婚「準備はしてます」
終了タグ:title
要素:

開始タグ:link
要素:https://news.yahoo.co.jp/pickup/6267590
終了タグ:link
要素:

開始タグ:pubDate
要素:Mon, 08 Jan 2018 15:00:59 +0900
終了タグ:pubDate
要素:

開始タグ:enclosure
要素:

終了タグ:enclosure
要素:

開始タグ:guid
要素:yahoo/news/topics/6267590
終了タグ:guid
要素:

終了タグ:item
要素:

~~~   略   ~~~

終了タグ:channel
要素:

終了タグ:rss
XML解析終了しました

HTTPSではないサイトの場合はATSを設定する必要があるので注意してください。
info.plistに記述する方法▼
qiita.com

ATSを無効にする方法▼
qiita.com


参考サイト
【iOS Swift入門 #271】NSXMLParserを使ってXMLを解析する - Swift,Objective-Cプログラミング ~ iOS ~

【iOS】UIWebViewで読み込み終了時にJavaScript実行できなくてハマった。(swift3)

こんにちは。
swiftのお勉強を始めましたぴぽです。

僕がやりたかったことは、
Webページの読み込みが終わったらJavaScriptを実行させる
です。

なかなかハマりました。
なんとか解決法が分かったのでメモしておきます。

まず、僕の書いていたコードです。

import UIKit
class ViewController: UIViewController {
    
    @IBOutlet weak var webView: UIWebView!
    var js_func_String:String?
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        // Googleを開く
        let requestURL = NSURL(string: "https://www.google.com/")
        let req = NSURLRequest(url: requestURL! as URL)
        webView.loadRequest(req as URLRequest)
    }
    
    
    func webViewDidFinishLoad(webView: UIWebView) {
        // ページの読み込みが終わると呼ばれる

        webView.stringByEvaluatingJavaScript(from: "alert('Hello')")
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
}

結論を言うと、
JavaScriptの実行文は間違っていませんでした。

webView.stringByEvaluatingJavaScript(from: "alert('Hello')")

これでJavaScriptは実行できます。

けど実行してもページは表示されるんですけど一向にアラートが出てこないんですよね。
読み込みが終わってもwebViewDidFinishLoadが呼ばれてなかったようです。

で、よくよく調べてみると
UIWebViewDelegateってのが必要なことがわかりました。

UIWebViewDelegateプロトコルは、UIWebViewオブジェクトのデリゲートが、ウェブコンテンツを読み込んだ時の実行を選択できるメソッドを定義します。
引用元 Second Flush

は?? デリゲート???
調べるた先でさらに分からないことが出てくると萎えますよね。

ザッと調べただけなんで曖昧ですけど、

他のクラスに処理を任せたり、通知を送るもの

って理解しました。(間違ってたらごめんなさい)

今回の例だと、「Webページの読み込み終わりましたよ」ってお知らせをどこに送るのかを指定していなかったので、終わったことに気づかなくてアラートも実行されなかったのかな。

それを踏まえて改良したコードがこちら!

import UIKit
class ViewController: UIViewController, UIWebViewDelegate {
    
    @IBOutlet weak var webView: UIWebView!
    var js_func_String:String?
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        //  デリゲートの指定
        webView.delegate = self;
        
        // Googleを開く
        let requestURL = NSURL(string: "https://www.google.com/")
        let req = NSURLRequest(url: requestURL! as URL)
        webView.loadRequest(req as URLRequest)
    }
    
    func webViewDidFinishLoad(_ webView: UIWebView) {
        // ページの読み込みが終わると呼ばれる
        
        webView.stringByEvaluatingJavaScript(from: "alert('Hello')")
    }
    
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
}

変更点は3つです。

2行目:UIWebViewDelegate

class ViewController: UIViewController, UIWebViewDelegate

気づきにくいですよね、よく見たら参考にしていたサイトにも書いてました。
UIWebViewDelegateを継承するって感じかな(javaで言うextendsみたいな?)
これ書くことによってデリゲートの指定ができるようになります。

11行目:デリゲートの指定

webView.delegate = self;

= self で、お知らせはこのクラスにお願いします!って指定したことになるんですね。

19行目:引数にアンダースコア

func webViewDidFinishLoad(_ webView: UIWebView) {

上の2つの変更をするとXcodeの方から警告が出てきたので、言われるままに直しました。
よく分からないです。

とりあえず、これらの変更をして実行すると
f:id:pipoblog:20171208233331p:plain:w200

アラートしてくれました!!

たぶん本とか呼んで勉強してたらつまづくこともないんでしょうね。
精進します。

【iOS】swiftでWebViewにサイトが表示されない

こんにちは。
iOSの勉強を始めたばかりのぴぽです。

早速Webページ画面を表示するアプリを作成しようとしていたのですけど、サイトが表示されない問題にぶつかりました。
解決法をメモしておきます。

まず僕の書いていたコードです。

import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var webview: UIWebView!
    
    override func viewDidLoad() {
        super.viewDidLoad()

        let requestURL = NSURL(string: "http://www.google.com/")
        let req = NSURLRequest(url: requestURL! as URL)
        webview.loadRequest(req as URLRequest)
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
}

その結果、
f:id:pipoblog:20171208121829p:plain:w200

こんな風に真っ白な画面のままだったんですね。

どうやらこれはiOS9から追加されたApp Transport Security(ATS)が影響しているようです。

ATSとは、iOS 9.0およびOS X v10.11以降で導入された、「サーバとアプリケーション間でセキュアな通信を保証するための機能」です。
ATSを有効化にすることにより、Appleが推奨する条件を満たすHTTPS通信のみ許可され、条件を満たさないHTTPS通信やHTTP通信は強制的に接続失敗扱いとなります。
引用元 株式会社ラック

つまりHTTP通信は接続させませんよってことみたいです。
今回のコードだと

let requestURL = NSURL(string: "http://www.google.com/")

URLを"http"にしていたことが問題だったんですね。

Googleさんの場合、HTTPSも用意されているので

let requestURL = NSURL(string: "https://www.google.com/")

と変更して見たところ
f:id:pipoblog:20171208123204p:plain:w200

無事表示させることができました!


HTTPSが用意されていないサイトの場合、
通信したいドメインをinfo.plistに記述していくか、ATSを無効にするかの対策を取らないといけないようです。

参考になりそうなサイトを見つけたのであげておきます。
info.plistに記述する方法▼
qiita.com

ATSを無効にする方法▼
qiita.com

【お買い得!】Cyber Monday(サイバーマンデー)は78時間のビッグセール!!

f:id:pipoblog:20171207103402p:plain 今年もAmazonが年末のビッグセールイベント

Cyber Mondayサイバーマンデー)」

を開催するようです!

Amazon.co.jpに最も多くのユーザーが訪れるということで、今年も数多くの人気商品が用意されています。
開催期間は12月8日18:00〜12月11日23:59の72時間です。

・50%OFF以上の今年最安値商品が多数

・2000満点以上のセール対象商品

などなど今年も見逃せませんね!!


1. Cyber Mondayとは

米国では、感謝祭(11月の第4木曜日)の休暇明けの翌月曜日は「Cyber Monday」と呼ばれ、オンラインショッピングの売上が急増します。オンライン通販業界ではホリデーシーズンのセールを開始する日でもあり、ネットショッピングが一年で一番盛り上がる日としても広く知られています。
日本では12月が冬のボーナス時期でもあり、年末に向けて消費が急増する12月上旬から多くの通販サイトでセールが行われます。
Amazon.co.jpでも、多くの企業でボーナスが支給される12月第2週に、年間で最も多くのお客様がサイトを訪れていることから、12月の第2月曜日を日本版の「Cyber Monday」として記念日申請し、今年、日本記念日協会に認定されました。

つまり

たくさん人が訪れてくれるこの時期に、感謝を込めて大規模セールを開催します。

ってことですね。
年に一度の記念日セールということで、Amazonもかなりの力の入れようです。

すでにサイトが立ち上がっていますよ。▼
【Amazon公式】Cyber Monday会場


2. タイムセールは3種類

特選タイムセール

f:id:pipoblog:20171207111410p:plain:w300
通常1日で最大5件の特設のタイムセール。

24時間限定ですが、数量無制限の「本日の特選商品」です。

こちらは数に制限がないのであまり焦る必要はなさそうですね。


数量限定タイムセール

f:id:pipoblog:20171207112624p:plain:w300
最大8時間で終了する、時間・数量限定のタイムセール。

限定なだけあって、割引価格も大きいので大注目です!

ちなみにAmazonショッピングアプリを使うと「ウォッチリスト」機能が利用できます。
登録していた商品のタイムセールが始まる直前にプッシュ通知をしてくれるのでバンバン利用して見逃しを防ぎましょう。

【Amazon公式】Amazonショッピングアプリ


お買い得情報

f:id:pipoblog:20171207113936p:plain:w300

・レジで割引キャンペーン

・複数商品購入でお得になるまとめて割引

・ポイントキャンペーン

などお買い得な商品・情報をまとめています。
こちらも忘れずにチェックしていきたいですね。


3. 超オススメ! Amazonプライム

f:id:pipoblog:20171207123727p:plain

なんとプライム会員は30分早くタイムセールに参加できるようです!!
大人気のイベントなだけに売り切れてしまうのも早いので、
この30分は大きなアドバンテージになりますね。

年間費3,900円でプライム会員になることができますが、今回のイベントだけでなく

・送料、お急ぎ便、お届け日時指定便が無料!

・映画やドラマ、アニメが見放題な「プライムビデオ」

・100万曲以上の楽曲が聴き放題になる「プライムMusic」

・etc...

とにかく凄すぎるサービスです!

僕もプライム会員なのですが、。
最近新しいシリーズが始まって話題となった「プリズンブレイク」をイッキ見しましちゃいました!
f:id:pipoblog:20171207123447j:plain:w200

月額で考えても325円なので、すぐに元が取れてしまいますね。
しかも今回のイベントでは無料体験の会員でも参加可能なので、この機会に是非お試しください。
損はないと思います!!

登録はこちらから▼
【Amazon公式】Amazon Prime 会員登録・無料体験


4. 注目の商品一覧

f:id:pipoblog:20171207132641p:plain
気になりますよね!
すでにいくつかの商品が公開されているのでまとめてみました。

クリスマスギフトにも!今年の売れ筋商品

Nintendo switch 特別セット
f:id:pipoblog:20171207134710j:plain:w200

いまだに手に入れにくい状況が続いていますね。
数多くの入荷が期待できるので、まだ入手してない方はチャンスです!

ドローン
f:id:pipoblog:20171207152622j:plain:w200

飛行距離、時間、バッテリーなど性能がどんどん高まってきてますね。
イベントの空撮なんかでも飛んでるところをよく見かけるようになりました。


PC・ガジェット好きのあなたに!

Surface Pro
f:id:pipoblog:20171207141941j:plain:w200

もはやタブレットの性能ではないです。
持ち運びが便利な上に優秀なパフォーマンスと、僕も愛用しています。

PlayStation VR
f:id:pipoblog:20171207142604j:plain:w200

VRも無視できませんよね!
ゲームだけでなくCGムービー、ミュージックビデオ、360度実写映像など多彩なVRコンテンツを楽しむことができるようです。


人気のAmazonバイス

Fire TV Stick
f:id:pipoblog:20171207143329j:plain:w200

プライムビデオはもちろんHuluやNetFlix、AbemaTVなどの動画をテレビの大画面で視聴できるようになるデバイスです。
家族で集まってゆったり過ごす年末年始には必需品ですね!!

Kindle
f:id:pipoblog:20171207144609j:plain:w200

定番商品のKindleサイバーマンデーでさらにお得に購入できそうです。
購入を検討しているかたは必見です!


その他もろもろピックアップ!

Anker Sound Core 2
f:id:pipoblog:20171207150016p:plain:w200


GoPro HERO5
f:id:pipoblog:20171207150904p:plain:w200


ザバス ホエイプロテイン 100
f:id:pipoblog:20171207145810p:plain:w200


ニューバランス シューズ
f:id:pipoblog:20171207151132p:plain:w200

5. まとめ

今回はAmazonのビッグセールイベント「Cyber Mondayサイバーマンデー」についてまとめてみました。
上に紹介した以外にも数多くの商品が出品されるので、お見逃しのないようにっ!

【Amazon公式】Cyber Monday会場

【Processing】円を描く。

*Processing 3.0以上での動作になります

丸や楕円を描くには次の関数を用います。

ellipse(基準のx座標, 基準のy座標, 横幅, 縦幅)

例えばこんな感じです。

void setup(){
   // 画面サイズ
   size(300, 300);
}

void draw(){
   // (100, 100)を基準に横幅50 縦幅80の円を描く
   ellipse(100, 100, 50, 80);
}

f:id:pipoblog:20171204174240p:plain:w300

円の描き方を変更するには

ellipseMode(mode)

mode... CENTER, RADIUS, CORNER, CORNERS

を用います。

CENTER: 1,2つ目の引数で中心座標、3,4つ目で横幅,縦幅を指定します。標準の描き方。

RADIUS: 1,2つ目の引数で中心座標、3,4つ目の引数で横,縦の半径を指定します。

CORNER: 1,2つ目の引数で左上座標(丸を囲う四角の)、3,4つ目で横幅,縦幅を指定します。

CORNERS: 1,2つ目の引数で左上座標(丸を囲う四角の)、3,4つ目の引数で対になる角の座標を指定します。

例です。(画面サイズ300)

// 白い円
fill(255);
ellipseMode(RADIUS);
ellipse(100, 100, 80, 80);

// 黒い円
fill(100);
ellipseMode(CENTER);
ellipse(100, 100, 80, 80);

f:id:pipoblog:20171204180117p:plain:w300

// 白い丸
fill(255);
ellipseMode(CORNER);
ellipse(50, 50, 150, 150);

// 黒い丸
fill(100);
ellipseMode(CORNERS);
ellipse(50, 50, 150, 150);

f:id:pipoblog:20171204180604p:plain:w300

【Processing】四角を描く。

*Processing 3.0以上での動作になります

長方形や正方形を描くには次の関数を用います。

rect(基準のx座標, 基準のy座標, 横幅, 縦幅)

例えばこんな感じです。

void setup(){
   // 画面サイズ
   size(300, 300);
}

void draw(){
   // (10, 100)を基準に横幅150 縦幅200の四角を描く
   rect(10, 100, 150, 200);
}

f:id:pipoblog:20171203001115p:plain:w300

他にも、

rect(基準のx座標, 基準のy座標, 横幅, 縦幅, 角の半径)

rect(基準のx座標, 基準のy座標, 横幅, 縦幅, 左上, 右上, 右下, 左下)

で角を丸くすることができます。

例です。(画面サイズ300)

// 白い四角形
fill(255);
rect(30, 20, 110, 110, 20);

// 黒い四角形
fill(100);
rect(150, 160, 90, 90, 20, 0, 5, 40);

f:id:pipoblog:20171203005917p:plain:w300

四角形の描き方を変更するには

rectMode(mode)

mode... CORNER, CORNERS, CENTER, RADIUS

を用います。

CORNER: 1,2つ目の引数で左上座標を指定し、3つ目で横幅、4つ目で縦幅を与えます。標準の描き方。

CORNERS: 1,2つ目の引数で左上座標、3,4つ目の引数で右下の座標を指定します。

CENTER: 引数の1,2つ目で中心座標を指定し、3つ目で横幅、4つ目で縦幅を与えます。

RADIUS: 引数の1,2つ目で中心座標を指定し、3,4つ目の引数で半径を指定します。

例です。(画面サイズ300)

// 白い四角形
fill(255);
rectMode(CORNER);
rect(50, 50, 100, 100);

// 黒い四角形
fill(100);
rectMode(CORNERS);
rect(50, 50, 100, 100);

f:id:pipoblog:20171204154340p:plain:w300

// 白い四角形
fill(255);
rectMode(RADIUS);
rect(150, 150, 100, 100);

// 黒い四角形
fill(100);
rectMode(CENTER);
rect(150, 150, 100, 100);

f:id:pipoblog:20171204154921p:plain:w300

IPPONのお題って出演者も事前に見えるやんって話。

IPPON面白いですよね。

特に僕はホリケンが大好きです!

今日も笑いながら見てたんですけど視聴者回答のところでふと「あれ、回答募集してるってことは出演者も見えるんじゃない??」って疑問になりました。

 

実際、誰でも見える状態になってるんで出演者も見ようと思えば見えてしまいますよね。

でも絶対に一本取れるかどうかって分からないし、バラエティ番組なんで僕は面白ければ良いかなって思います。(たぶん見てないでしょうけどね)