カテゴリー: テクノロジー

初めてのiOSアプリ開発 – Santa’s Little Helper

IMG_1830 1
HoHoHo〜 Merry Christmas!

今日はクリスマスイブ!
日本と世界の子供達がサンタからプレゼントもらえる日ですね!

しかも、賢くしていい子でしたらたくさんもらえるといいますよね〜^^

では、今年、皆様はいい子だったのでしょうか?
それを判定できるアプリがありましたらいいよね〜

ということで、作ってみましょう〜

本日はiPhoneやiPadで使えるiOSアプリを作ってみたいと思います〜
とても簡単のもので、初心者でも、Macさえありましたら、作れると思いますよ。
(残念ながら、iOS開発はMacでしかできませんので、Windowsなど、別のOSを利用している方はiOSアプリをつくることはできません。(´□`。)°)

では、早速〜 iOSアプリを作ってみてみたい方は是非お読みください〜

注意
Appleの開発者アカウントをお持ちではない場合、実際の端末でアプリを動かすことはできません。
しかし、Xcodeのシミュレータを使うことによって、実際の端末と同じように動作を見てみることはできますので、iOS開発にお興味がある方は是非、頑張って、作ってみましょう!

Santa’s Little Helper

僕は小さかった時に、「サンタさんはとても忙しいので、お手伝いの妖精がいる」とお母さんに言われました。
英語では「Santa’s Little Helper」といいます。

本日つくるアプリは魔法の力で、もらえるプレゼント数を教えてくれるので、
アプリ名をその「Santa’s Little Helper」にしたいと思います〜

仕様

このアプリは初心者さんでも作れるものので、とても簡単です。

仕様
1.「押してください!」のスクリーンが表示される。
2. スクリーンを押すとサンタさんからもらえるプレゼント数が表示されます。
3. もう一回スクリーンを押すと、最初のページに戻ります。

では、つくりましょう〜!

アプリケーションフォルダーからXcode.appを実行してください。
実行したら、新しいプロジェクトを作成したいので、「Create a New Xcode Project」を押してください。
20151224_2.png

次、かなり簡単な1スクリーンアプリをつくりたいので、「Single View Application」をご選択ください。

20151224_3.png

最後に、以下のように、アプリ名を入れてください。
今回のアプリをAppleストアに出しませんので、Organization Name と Organization Identifier は適当でも問題ありません。
今回のアプリをSwift言語で開発しますので、LanguageをSwiftに切り替えてください。

20151224_4.png

次、アプリのGeneral管理画面が表示されます。この画面より、いろいろ細かいことはできますが、今回は単純にアプリの可能な向きをだけ指定したいと思います。
Portrait = 縦向き
Upside Down = 逆さま縦向き
Landscape Left = 左の横向き
Landscape Right = 右の横向き

それぞれ対応をきちんとできるアプリをつくることも可能ですが、今回は初めてのアプリので、できる限り簡単なものをつくりたいと思います。縦向きのみ対応しましょう〜

20151224_5.png

やった!アプリの開発準備ができました!次はコードを書きましょう!!
左側のメニューをみると、ファイルリストはあると思います。

20151224_6.png

今回、編集するのは ViewController.swift だけです。
それをクリックしたら、以下のようなコードが表示されます。

20151224_7.png

これを説明しましょう〜

説明
import UIKit = Apple社が用意していただいている、UI系のコードを使えるようにする。

class ViewController: UIViewController = このスクリーンはViewControllerです〜ViewControllerは、UIViewControllerの子種類で、ViewControllerはUIViewControllerができることもできます。
ちなみに、UIViewControllerはインポートされたUIKitの一つのもので、スクリーンにものを表示させるのに最適なコードです。

override func viewDidLoad() { = ViewControllerがロードされるとき、この { と数行下にある } の間にあるコードを実行する

super.viewDidLoad() = ViewControllerがロードされるときに初めてやること!superは親である「UIViewController」のことです。つまり、ViewControllerがロードされたら、まずはUIViewControllerがロードされる時に行うことをする。
これはあまり気にしなくて大丈夫です。そのままおいておきましょう!

override func didReceiveMemoryWarning() { = 端末のメモリーがなくなりそうな時、この中のコードを実行する
今回のアプリはメモリー的にものすごい軽いので、今回、これを無視しましょう〜

コード書きましょう!

このアプリに必要なものは以下のとおりです〜

1. 「スクリーンを押してください」という表記()
2. 「サンタからXX個のプレゼントもらえる」という表記
3. そのもらえるプレゼント数

これをコードに書きましょう〜
iOSでラベル的なものを使いた時、UIKitのUILabelというものは最適ですので、1,2に関して、それを使いましょう
プレゼント数は整数となりますので、Int (Integer(和訳:整数)の略)を使います。

このスクリーンにこの3つのものが必要ので、コードに追加しましょう〜

20151224_8.png

説明
var ~~ variableの略。日本語では「変数」。Swift言語では、「この行に書くものは新しい変数ですよ」との意味をします。

var XXX = YYY() ~~ この変数の名前はXXX。XXXの種類はYYY.

つまり、pushPleaseLabelとpresentNumberLabelという UILabel 及び、
presentNumber という Integer (整数) を作りました。

—————–
他にも見えない変数!
—————–

実は、ViewControllerはUIViewControllerの子ので、UIViewControllerからもらっている別の「見えない」変数はたくさん存在しています。

今回のアプリで、背景を表す「view」という、UIView種類の変数も使いたいと思います。
まずは背景色を変えましょう〜

20151224_9.png

説明
self ~~ このViewControllerのインスタンス(つまり、このスクリーン)
self.view ~~ このViewControllerのインスタンスのviewという背景を示すオブジェクト(つまり、このスクリーンの背景)
self.view.backgroundColor ~~ このViewControllerのインスタンスのviewの背景色(つまり、このスクリーンの背景の背景色)

UIColor.redColor ~~ 赤色

Xcodeの左上にある「再生ボタン」を押しますと、シミュレータでアプリの様子を見ることができます。
ロードスクリーン画面が表示される後、赤いスクリーンが表示されたらアプリは正常に動いています。

次、ラベルを用意しましょう!

次、ラベル(「押してください」と「XX個のプレゼントもらえるよ」の表記)をアプリに入れたいですが、
それができるのに、以下のことをしなければなりませんよね。

1.ラベルの位置を定義。
2.ラベルのテキストを定義
3.ラベルのテキストの色を定義
4.ラベルのテキストの配置を定義
5.ラベルのテキストフォントを定義

なお、背景である view に付けたいとおもいますので、それもしなければなりません。

Swiftで、それは、以下のようにできます。
コードは少し長いけど、一行一行読んでみると、非常にわかりやすいと思います。
presentNumber をテキストに入れたいので、”(“と”)”で囲みます

20151224_10.png

また、シミュレータで実行してみると・・・問題!
両方のUILabelが同時に表示されてしまいます!

20151224_11.png

presentNumberLabelの方をを非表示にしましょう。

20151224_12.png

タッチ判定(Touch Detection)

スクリーンをタッチすると、何か起こるようにしたいですね。
Swiftで意外に簡単にできることですよ。

スクリーン(つまり、self.view)にGestureRecognizer(ジェスチャ認識するもの)を追加しましょう〜
スクリーンがタップされるとscreenWasTappedというファンクションを呼ぶようにしましょう。

20151224_13.png

先ほど、片方のラベル (presentNumberLabelの方)を非表示にしましたよね〜
タップすると、ラベルの表示、非表示が変わるように、以下のIF文をscreenWasTappedファンクションに追加しましょう〜

20151224_14.png

シミュレーターで実行してみて、マウスでスクリーンをクリックすると、ラベルが正常に切り替わるはずです!
あとは、presentNumberにランダム数字を与えることと、それをpresentNumberLabelのリフレッシュ(表示させるテキストが変わりますので、再読込が必要です。)

もらえるプレゼント数を決めるのに、本当はクリスマスマジックを使いたいですが、
残念ながら、それはできないので、「Int(arc4random_uniform(XX))」(「XX」は最大数字)というファンクションを代わりに使いましょう〜

20151224_15.png

完成!

とてもとても簡単なアプリですが、第一歩は一番重要と思います!
この記事によって、すこしでもiOS開発を理解できるようになりましたら、本当に嬉しいです〜!

UILabelとIntだけではなくUIViewやUIImageViewなどあり、UIKit以外にも、ゲームに適しているSpriteKitなども存在し、それぞれに色々な特徴があり、たくさん面白いことができますので、頑張ってください!

では、今夜はあまり遅くまで起きないように〜
いい子はちゃんと寝ないとサンタさんからプレゼントもらえませんので〜

Merry Christmas!

20151224_16.png

最終のコード

import UIKit
class ViewController: UIViewController {
var pushPleaseLabel = UILabel()
var presentNumberLabel = UILabel()
var presentNumber = Int()
override func viewDidLoad() {
super.viewDidLoad()
self.view.backgroundColor = UIColor.redColor()
self.pushPleaseLabel.frame = CGRectMake(0, 0, self.view.frame.width, self.view.frame.height) // x,y,width,height
self.pushPleaseLabel.text = "押してください!"
self.pushPleaseLabel.textColor = UIColor.yellowColor()
self.pushPleaseLabel.textAlignment = NSTextAlignment.Center
self.pushPleaseLabel.font = UIFont(name: "Avenir-Black", size: 14)
self.presentNumberLabel.frame = CGRectMake(0, 0, self.view.frame.width, self.view.frame.height) // x,y,width,height
self.presentNumberLabel.text = "サンタさんから(presentNumber)個のプレゼントもらえます!"
self.presentNumberLabel.textColor = UIColor.whiteColor()
self.presentNumberLabel.textAlignment = NSTextAlignment.Center
self.presentNumberLabel.font = UIFont(name: "Avenir-Black", size: 14)
self.view.addSubview(self.pushPleaseLabel)
self.view.addSubview(self.presentNumberLabel)
self.presentNumberLabel.hidden = true
self.view.addGestureRecognizer(UITapGestureRecognizer(target: self, action: "screenWasTapped"))
// Do any additional setup after loading the view, typically from a nib.
}
func screenWasTapped() {
//スクリーンがタッチされると、このコードが実行される
if self.presentNumberLabel.hidden == true { //もし presentNumberLabel が非表示(hidden)になっている場合
self.presentNumberLabel.hidden = false  //presentNumberLabelを表示する
self.pushPleaseLabel.hidden = true      //pushPleaseLabelを隠す
self.presentNumber = Int(arc4random_uniform(5))
self.presentNumberLabel.text = "サンタさんから(presentNumber)個のプレゼントもらえます!"
println(self.presentNumber)
} else {                                    // それ以外の場合(つまり、presentNumberLabelが非表示になっていない)
self.presentNumberLabel.hidden = true   //presentNumberLabelを隠す
self.pushPleaseLabel.hidden = false     //pushPleaseLabelを表示する
}
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
}

勤怠管理システムをつくってみた

当初その日の出勤退勤のみをWeb上で記録するだけの簡易なものだったのですがちょうどRaspberry Piもあり時間もあったので簡単な社内用勤怠管理システムを作ることにしました。

そしてできたものがこちら
ams.png

ams_l.jpg
※ラズベリーパイは箱の中です

AndroidやICOCA等のカードを社員分登録しているので出勤時と退勤時にかざすだけで出勤、退勤ができるようになっています。

あとは戸締り用の鍵を持っている人が限られているので一覧で出勤時間が見ることができたり必要に応じて機能を追加してたりします。

自由に作れるのがエンジニアがいる強みですね!

ただ自由度は高いとは言っても会社の人数がそれほど大きくない規模であれば費用対効果という意味で安い勤怠システムを月額等で買ったほうがいいかも。。。
作成したのは半分趣味ですので。。。

ご興味ありましたら弊社までお問い合わせください!
http://splout.co.jp/#contact

■ 各社の商標または登録商標
「Raspberry Pi」は英国Raspberry Pi財団の登録商標です。
「SONY」「FeliCa」は、ソニー株式会社の商標または登録商標です。
「FeliCa」は、ソニー株式会社が開発した非接触ICカードの技術方式です。
「Google」は、Google Inc.の商標または登録商標です。
※ Nexus7の箱をリユースさせていただきました(^^ゞ


GoogleフォームとSlackを連携させてみた

20151119_1.jpg

社内である問題が発生しました。

“ヒトによってオフィスを閉めるときの作業漏れが発生してしまう!!”

そこで出た案
・チェックリストを紙で作成
・チェックリストをホワイトボードで作成

そうだ!Google先生にお願いしよう!!

Googleフォームでチェックボックスをすべて必須にして通知すればいいじゃないか!
それを社内情報共有ツールとして利用してるSlackに通知すればいいじゃないか!
スマホからフォーム開いて作業チェックすれば誰でも同じ対応ができそう ^q^

Google先生に相談してみよう。
「google スプレッドシート slack」でググッてみました。
Qiitaの以下記事にたどり着きました。(ありがとうございます^^
http://qiita.com/mito_log/items/6457dc110b3478e3e530

1. SlackにログインしてIncoming WebHookの設定
[Configure Integrations]-[All Services]-[Incoming WebHook]
[View]をクリックして通知先Slack Channelを選択してURLを控えます。
https://hooks.slack.com/services/xxxxxxx/xxxxxxx/xxxxxx
2. 記事を参考にしてスプレッドシートにGoogle Action Script(GAS)を設定するだけ。
[ツール]-[スクリプトエディタ]
プロジェクトのトリガー → [スプレッドシートから] で [編集時]

フォームから回答をしてみると。。。
Slackに通知されない。。。

どうやらフォーム回答でスプレッドシートが編集されてもGASをキックしてくれない模様。

べ、別に回答内容をメッセージに載せなくてもいいからシート参照しなくたっていいんだからね!(震え声

1. SlackにログインしてIncoming WebHookの設定
[Configure Integrations]-[All Services]-[Incoming WebHook]
[View]をクリックして通知先Slack Channelを選択してURLを控えます。
https://hooks.slack.com/services/xxxxxxx/xxxxxxx/xxxxxx
2. 記事を参考にしてフォームにGoogle Action Script(GAS)を設定するだけ。
[ツール]-[スクリプトエディタ]
プロジェクトのトリガー → [フォームから] で [フォーム送信時]

※ 回答シートを参照しなくてもフォームの内容は簡単に取得できました。^^
そして以下のようなフォームができました。

20151119_2.jpg

Googleフォームの新しいデザインにするとGASが編集できなくなるので元の編集ページに戻すためには左下の[EXIT]のようなアイコンをクリックしてください。(Google先生は対応予定とのことです。)

通知内容はこんな感じです。

20151119_3.jpg

解錠も同じように準備しました。
これで解決すればいいなぁ。。。

(´-`).。oO( 作業漏れあったらキムタク風に「ちょ、待てよ!」って音出すようにできないかな。(古


bttn使ってみました

会社でbttnという製品を購入しました。
DSC_0272.jpg

何の変哲もない(?)押しボタンですが、これがなんとWiFi搭載でネットに繋がってます。
ボタンを押すと特定の宛先にメールを送る、とかTwitterにツイートする、とかできてしまいます。
公共の場所での簡易インタフェースとか、お年寄りのための見守りボタン的な使い方が想定されているようです。

この記事では、ボタンを押すとインターネット経由で社内のRaspberry Piに繋がったスピーカーから音が出る、というサンプルを設定してみます。

構成図

(1) bttnユーザ登録
my.bt.tnからユーザ登録と購入したボタン登録を済ませます。

(2) ボタンを押した時に呼び出されるURLを設定
my.bt.tnにログインすると、登録済のボタン一覧が表示されます。
設定対象のボタンの行にある「Action」ボタンを押してアクションを設定します。
「NEW ACTION」→「pressed」→「HTTP」と進みます。
アクションはメール送信などいろいろな種類が用意されていますが、ここでは「HTTP」(ウェブAPI呼び出し)を選びます。
ここで表示されるフォームに以下の内容を入力します。
HTTP URL: (Specify URL) http://example.com/
HTTP METHOD: GET
HTTP AUTHENTICATION: (HTTP server requires authentication) username:hogehoge password:fugafuga
このように、BASIC認証が設定されているURLへもアクセスできるようになっています。
API用のURLは後で生成するので、ここでは仮のURLを記入しておきます。
この状態で「NEXT」→「Save」で設定完了です。

(3) ウェブAPIを準備
呼び出される側のウェブAPIを用意します。
今回は社内のRaspberry Piで動いているウェブサーバを利用しました。

<VirtualHost 192.168.150.1:8080>
       DocumentRoot /var/www/bttn
        <Directory />
                Order allow,deny
                allow from all
                AuthType Basic
                AuthName "Password for bttn"
                AuthUserFile /etc/apache2/bttn_passwd
                Require valid-user
        </Directory>
</VirtualHost>
<?php
exec('/usr/bin/mpg321 /home/pi/sound/dog1.mp3');
echo "OKn";

(4) ウェブトンネリング設定
Raspberry Piのウェブサーバはファイアウォールの内側にあってインターネット非公開です。
ngrokを使ってbt.tnのサーバからアクセスできるようにします。

まず、ダウンロードページからngrokコマンドのバイナリをダウンロードします。
Raspberry Pi用は”Linux/ARM”ですね。
ダウンロードしたものを展開し、以下のコマンドを実行します。

$ unzip ngrok_2.0.19_linux_arm.zip
$ ./ngrok http 8080

ngrok実行後の画面に以下のような表示があるはずです。

Forwarding                    http://5ae30682.ngrok.io -> localhost:8080
Forwarding                    https://5ae30682.ngrok.io -> localhost:8080

このURLでインターネットから社内のRaspberry Piにアクセスできるようになりました。

(5) URLをmy.bt.tnに設定
再びmy.bt.tnからログインして
「Action」→「Current(HTTP)」と進み、HTTP URLの欄に
http://5ae30682.ngrok.io
を記入します。

これで完了です。
ボタンを押すと犬が吠えるようになりました。
手順として書くと長くなりましたが、非常に簡単です。

この単純明快なインタフェースをどう使うか、知恵の絞り甲斐のあるデバイスですね。