まゆたまガジェット開発逆引き辞典

電子工作やプログラミングのHowtoを逆引き形式で掲載しています。作りたいモノを決めて学んでいくスタイル。プログラマではないので、コードの汚さはお許しを。参照していないものに関しては、コピペ改変まったく問いません

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>