Google検索を使ってTwitter検索してヒット数を表示
以前Objective-C用に書いたモノのSwift移植です。辞書と配列は大変だった・・・
TwitterSearchAPIはヒット数まで出してくれないっぽいので、強引にGoogle検索に突っ込んでます。
println(responseData)とやると検索結果すべてのデータが取れるので、そこから余分な部分をカットします。
検索ヒット数=パワーみたいな。結果はすごく正確ではないと思われます。
import UIKit class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view, typically from a nib. //つぶやきを検索してヒット数を出す searchTw() } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } func searchTw() { //キーワード var searchKey: String = "荀イク" //日本語の場合は文字コードを変換 let searchQuery: String = searchKey.stringByAddingPercentEscapesUsingEncoding(NSUTF8StringEncoding)! var urlString1 = "http://ajax.googleapis.com/ajax/services/search/web?v=1.0&q=" var urlString2 = "+site:http://twitter.com" //デフォのGoogle検索はhttp://ajax.googleapis.com/ajax/services/search/web?v=1.0&q=荀イク //Google検索でTwitterを検索する用URL(ajax)、実際はhttp://ajax.googleapis.com/ajax/services/search/web?v=1.0&q=荀イク+site:http://twitter.com var urlStringAll:String = urlString1 + searchQuery + urlString2 //urlStringAllで設定したアドレスにアクセスする設定をする var searchURL1 = NSURL(string: urlStringAll) if let searchURL2 = searchURL1 { var searchURLReq = NSURLRequest(URL: searchURL2) println("OK") NSURLConnection.sendAsynchronousRequest(searchURLReq, queue: NSOperationQueue.mainQueue(), completionHandler: self.getHttp) } else { // URLがなかったときの処理 println("NG") } } func getHttp(res:NSURLResponse?,data:NSData?,error:NSError?){ //jsonで解析する var searchdict = NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions.MutableContainers, error: nil) as! NSDictionary //「responseData」キーを取り出す var responseData = searchdict["responseData"] as! NSDictionary //「cursor」キーを取り出す var cursor = responseData["cursor"] as! NSDictionary //ヒット数に近いと思われる「estimatedResultCount」キーを取り出す var countData: NSString = cursor.objectForKey("estimatedResultCount") as! NSString //アバウトなヒット数表示 println(countData) } }
スクリーンセーバー・スライドショーもどき:テキストのフェードイン/アウト
以前Objective-c用に書いたもの(テキストアニメーション部分のみ)をSwift用に移植します。
テキストが一定時間ごとにフェードイン/アウトして、これもなんちゃってスクリーンセーバーです。スライドショーかな、むしろ。テキストを絵に変換してあげてもいけるかと。
QuartzCore.freamworkを使わなくてもいけます。
テキストラベルとボタンを設置して、結びつけておきます。
配列の数やタイマー用のカウントをもう少しちゃんとすれば、きちんとしたものができると思います。
下のですと最初の「いち」から「に」にかけての表示だけ、フェードインアウト処理の挙動が少しおかしいです。すみません。
import UIKit class ViewController: UIViewController { //フェードインアウト用タイマー var fadeInOutTimer: NSTimer? //テキストチェンジ用 var textTimer: NSTimer? //フェードインアウト用タイマー変数 var countTime = 0 //テキストチェンジ用変数 var textIndex: Int = 0 //テキストチェンジ用配列 let tenko = ["いち","に","さん","し","ご","ろく"] @IBOutlet weak var kabegami: UIImageView! @IBOutlet weak var sampleText: UILabel! override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view, typically from a nib. kabegami.image = UIImage(named: "TestAppPict1.png") sampleText.text = "いち" } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } @IBAction func timerBtn(sender: AnyObject) { //フェードインアウト用タイマー fadeInOutTimer = NSTimer.scheduledTimerWithTimeInterval(1, target: self, selector: "cdTimer:", userInfo: nil, repeats: true) //テキストチェンジタイミング用タイマー textTimer = NSTimer.scheduledTimerWithTimeInterval(8, target: self, selector: "textload:", userInfo: nil, repeats: true) } //フェードインアウト用タイマー func cdTimer(timer : NSTimer) { countTime += 1 //countTime == 8はフェードインアウトのNSTimeIntervalの合計数 if countTime == 8 { fadein() countTime = 0 } } //テキストチェンジ用 func textload(timer : NSTimer) { textIndex += 1 //textIndex > 5の5は配列の数-1(配列の5番目までいったら最初の0番目に戻る) if textIndex > 5 { textIndex = 0 } //表示したいテキストを格納した配列の中で何番目(textIndex)を読み込むか let textArray = tenko[textIndex] //配列の中で該当するものをテキストラベルに表示 sampleText.text = textArray } //フェードイン処理 func fadein() { //4秒かけてフェードイン処理を行う var changeFadeIn: NSTimeInterval = 4 UIView.animateWithDuration( NSTimeInterval(changeFadeIn), animations: { //透明度が1になったらフェードアウト処理を行う self.sampleText.alpha = 1 } , completion: { (finished: Bool) in self.fadeout() }) } //フェードアウト処理 func fadeout(){ //4秒かけてフェードアウト処理を行う var changeFadeOut: NSTimeInterval = 4 UIView.animateWithDuration( NSTimeInterval(changeFadeOut), animations: { //透明度が0になったらフェードアウト処理終了 self.sampleText.alpha = 0 } , completion: { (finished: Bool) in }) } }
Swift目次を作成しました
Swiftも目次を作成しました。ほぼ逆引きですね。随時追加していきます。
・タップした座標を獲得し、特定の範囲内かどうか検出する
http://d.hatena.ne.jp/prince9/20150517/1431817999
・スクリーンセーバー的なものを作る
http://d.hatena.ne.jp/prince9/20150518/1431897234
・スクリーンセーバー・スライドショーもどき:テキストのフェードイン/アウト
http://d.hatena.ne.jp/prince9/20150518/1431948860
・Google検索を使ってTwitter検索してヒット数を表示
http://d.hatena.ne.jp/prince9/20150519/1432003880
・Bluetoothでデータ送受信
http://d.hatena.ne.jp/prince9/20150526/1432625630
・OpenCVを使ってリアルタイムに顔認識
http://d.hatena.ne.jp/prince9/20150609/1433871814
スクリーンセーバー的なものを作る
しばらくプログラミングから離れていたので、これもまた地味に時間かかった・・・
あまりよくない書き方をしているような気がするので、もし訂正箇所があればコメント等でお願いします。
NSTimerがもっと正確な時間で作動して欲しいという場合は、
・var timeCount : Int = 0 のIntをFloatに
・NSTimer.scheduledTimerWithTimeInterval(1, target: self ...の1を0.1に
・timeCount += 1 を0.1に
・timeCount = 0 を0.0に
・if touchCount == 1 && timeCount == 4 { ... のtimeCountを4.0に
してあげれば良いかと思います(未検証)。もちろん、4秒はお好みで。
流れとしては、
1.起動して画像1表示
2.タッチすると画像2を表示
3.4秒経つと画像3を表示、タッチされなければこのまま画像3を表示
4.2と3を繰り返す
となっています。画像3のところでアニメーションを再生してあげるようにすれば、それっぽくなるのかな。
もちろん、1と3(画像1と3)の画像を同じにしてあげても良いと思います。今回は区別がつきやすいように変えてみました。
import UIKit class ViewController: UIViewController { @IBOutlet weak var screensaver: UIImageView! //タッチされた回数を示す変数 var touchCount = 0 //時間を示す変数 var timeCount : Int = 0 //タイマー var timer: NSTimer? override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view, typically from a nib. screensaver.image = UIImage(named: "iPhone4ViewPic.png") } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } //タッチされたか検知する override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent) { for touch: AnyObject in touches { //タッチされたらタイマー始動(1秒ごと・整数) timer = NSTimer.scheduledTimerWithTimeInterval(1, target: self, selector: "timeUpdate:", userInfo: nil, repeats: true) //タッチされたら1足す touchCount += 1 //スクリーンセーバーが起動していないときの画像 screensaver.image = UIImage(named: "iPhone4ViewPic2.png") } } func timeUpdate(timer : NSTimer){ //1秒ごとに1足す timeCount += 1 println("タイム= \(timeCount)") //タッチされてかつ4秒以上たったら、スクリーンセーバー始動&タイマー止まる。またタッチされたらタイマー始動 if touchCount == 1 && timeCount == 4 { touchCount = 0 timeCount = 0 //タイマー停止 self.timer?.invalidate() self.timer = nil //スクリーンセーバーの画像表示 screensaver.image = UIImage(named: "iPhone4ViewPic3.png") } } }
タップした座標を獲得し、特定の範囲内かどうか検出する
地味に大変だった・・・UIImageViewに画像を配置した状態でも検知しました。
以下は、
・UIImageViewに画像を表示、タッチ後一瞬画像が変わる(タッチされたことが分かるように)
・タッチされた座標を取得
・タッチされた位置が特定の範囲内かどうか検出する
→iPhoneの画面を18分割し、タッチされた位置が特定の範囲に入っているならその座標と18分割のどこかを表示、入っていなければはみだしてると表示
です。
switch文で「どこからどこまでならこうしなさい」って書けるのがすごく便利。for文もそうだけど、Swiftは見た目きれいなコードなのでありがたいです。
あ、なぜかはてなだとバックスラッシュが円マークになっちゃってるので、そこだけバックスラッシュに直してください。
import UIKit class ViewController: UIViewController { @IBOutlet weak var touchPointPic: UIImageView! override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view, typically from a nib. touchPointPic.image = UIImage(named: "iPhone4ViewPic.png") } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } //以下タッチ処理 override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent) { //タッチされたら直後に画像が一瞬変わる touchPointPic.image = UIImage(named: "iPhone4ViewPic2.png") //タッチした位置の座標を取得 for touch: AnyObject in touches { let point = touch.locationInView(self.view) //座標獲得 let pointXY = (point.x,point.y) /* 座標獲得、分けて書く場合 let pointX = point.x let pointY = point.y */ //条件分岐 switch pointXY { case (0.0...105.0, 0.0...70.0): println("\(point) だよ、1ばんめ") case (105.0...213.0, 70.0...141.0): println("\(point) だよ、5ばんめ") default: println("\(point) はみだしてる") } } } override func touchesEnded(touches: Set<NSObject>, withEvent event: UIEvent) { //タッチ直後、画像がもどる touchPointPic.image = UIImage(named: "iPhone4ViewPic.png") } //ステータスバー隠す override func prefersStatusBarHidden() -> Bool { return true } }
GoogleChartのメーター表示で%表示する
GoogleChartのメーター表示、gaugeで%表示をします。
%表示をするにはGoogle Visualization APIのNumberFormatを使います。
var formatter = new google.visualization.NumberFormat( {suffix: '%',pattern:'#'} ); formatter.format(data,1);
gaugeで使った場合は以下になります。
<html> <head> <meta charset="UTF-8"> <script type="text/javascript" src="https://www.google.com/jsapi"></script> <script type="text/javascript"> google.load("visualization", "1", {packages:["gauge"]}); google.setOnLoadCallback(drawChart); function drawChart() { var data = google.visualization.arrayToDataTable([ ['Label', 'Value'], ['Memory', 80], ]); var options = { width: 400, height: 120, redFrom: 90, redTo: 100, yellowFrom:75, yellowTo: 90, minorTicks: 5, animation: { duration: 1000, easing: 'inAndOut' }, redColor: '#AE0239',yellowColor: '#EDB872' }; var chart = new google.visualization.Gauge(document.getElementById('chart_div')); chart.draw(data, options); //setIntervalの3000はスピード setInterval(function() { data.setValue(0, 1, 40 + Math.round(60 * Math.random())); var formatter = new google.visualization.NumberFormat( {suffix: '%',pattern:'#'} ); formatter.format(data,1); chart.draw(data, options); }, 3000); } </script> </head> <body> <div id="chart_div" style="width: 400px; height: 120px;"></div> </body> </html>
Google Search APIで検索ヒット数を表示
Google Search APIで検索ヒット数を表示させてみたくて、調べてみました。
その数を%で表示するのも付け足してみました。
こちらとこちら(公式)を参照させて頂きました。
この結果をなんとかしてGoogle Chartに組み込むことはできそうです(が、やれてない)。
<html> <head> <meta charset="UTF-8"> <div id="resultsetumei">結果表示</div> <div id="resultcount">Loading</div> <div id="percentage">Loading</div> <style type="text/css"> #resultsetumei { color:red; font-size: 12pt; font-family: "ヒラギノ角ゴ ProN","Hiragino Kaku Gothic ProN",'メイリオ',Meiryo,sans-serif; font-weight: bold; } #resultcount { color:red; font-size: 20pt; font-family: "ヒラギノ角ゴ ProN","Hiragino Kaku Gothic ProN",'メイリオ',Meiryo,sans-serif; font-weight: bold; } #percentage { color:blue; font-size: 20pt; font-family: "ヒラギノ角ゴ ProN","Hiragino Kaku Gothic ProN",'メイリオ',Meiryo,sans-serif; font-weight: bold; } </style> <script src="https://www.google.com/jsapi" type="text/javascript"></script> <script language="Javascript" type="text/javascript"> google.load('search', '1'); function OnLoad() { // Create a search control var searchControl = new google.search.SearchControl(); searchControl.addSearcher(new google.search.WebSearch()); searchControl.setSearchCompleteCallback(searchControl,showResults); searchControl.setNoResultsString("ヒットしませんでした"); searchControl.draw(document.getElementById("searchcontrol")); searchControl.execute("三国無双7 文若"); } function showResults(seachControl,searcher){ if (searcher.cursor == undefined) { document.getElementById("resultcount").innerHTML = 0; } else { document.getElementById("resultcount").innerHTML = searcher.cursor.estimatedResultCount; //ヒット数(resultcountの中身)を数値に変換 var num1 = Number(document.getElementById("resultcount").innerHTML); //割合を出す(Google検索で「Google」と打ったときのヒット数を参照) var num2 = num1 * 100 / 7650000000; //任意の桁で切り上げる var num3 = num2 * 100000; var num4 = Math.ceil(num3) / 100000; //数値から文字へ変換 String(num4); document.getElementById("percentage").innerHTML = num4 + " %"; } } google.setOnLoadCallback(OnLoad); </script> </head> <body> <!-- searchcontrolは結果そのものを表示、resultcountはヒット数表示 <div id="searchcontrol">Loading</div> --> <div id="resultcount"></div> <div id="percentage"></div> </body> </html>