Swiftのenum(列挙型)のざっくりまとめ
Objective-Cの列挙型といえば、C言語と同じく整数型の値を複数持つものでしたが、Swiftの列挙型ではかなり柔軟かつ多機能なものになっています。
その列挙型について少しまとめてみました。
定義
enum Fruits { //定数なのでアッパーキャメルケースで記述 case Apple case Orange case Grape case Banana //以下のようにも記述できる case Apple, Orange, Grape, Banana }
列挙型のメンバは定数や変数に代入可能
var f1 = Fruits.Apple let f2: Fruits = .Orange
2種類の列挙型
C言語ではメンバには整数型の値を格納することができましたが、Swiftでは値型と共用型の列挙型があります。
- 値型の列挙型 : 全メンバが同じデータ型を持つ. 実体型(raw type)の指定が必要
- 共用型の列挙型 : それぞれのメンバが異なる構造を持つ. 実体型の指定はしない.
// 値型の列挙型 enum Weather: Int { case Sunny = 0 case Cloudy // 1 case Rainy // 2 case Thunder // 3 } //値型の場合、rawValueで参照することができる let w = Weather.Sunny w.rawValue // w = 0 (Int) //共用型の列挙型 enum Ticket { case Single(Int, Date, Child: Bool) //タプルで型の定義 case OneDayPass(Date, Child: Bool) case SeniorPass String //文字列で型の定義 case Card(Int, Child: Bool) }
共用型では型がまったく異なるものをひとまとまりにできて便利に使えそうです.
列挙型でできること
Swiftの列挙型では、ただ単にまとまりのあるデータを定義するだけでなく、構造体やクラスと同等の機能が備わっています。 具体的には以下の通りです.
以下は具体的なコード例です.
//メソッドの定義 enum Fruits { case Apple case Orange case Grape case Banana func description() -> String { switch self { case .Apple: return "Apple" case .Orange: return "Orange" case .Grape: return "Grape" case .Banana: return "Banana" } } }
//タイプメソッドの定義 enum Fruits { case Apple case Orange case Grape case Banana //staticをつける static func description() -> String { return ["Apple","Orange","Grape","Banana"][self.rawValue] } }
//計算型プロパティの定義 enum Fruits { case Apple case Orange case Grape case Banana var sphere: Bool { switch self { case .Apple, .Orange: return true default: return false } } }
//イニシャライザの定義 enum Fruits { case Apple case Orange case Grape case Banana init() { self = Fruits.Apple } } //実行 var f = Fruits() // .Apple
ざっくりとですが、Swiftでの列挙型をまとめてみました。Objective-Cでの列挙型と比べるとすごい高機能なので、いろいろ便利に使っていきたいです。
また、列挙型ではprotocolに準拠することもできるみたいなので、そこらへんも後々触っていけたらなと思います。
SwiftでFactory Methodパターン
Swiftでデザインパターンの勉強をしています。参考書としては有名なGoF本をJava言語で説明している以下の本です。
- 作者: 結城浩
- 出版社/メーカー: ソフトバンククリエイティブ
- 発売日: 2004/06/19
- メディア: 大型本
- 購入: 51人 クリック: 762回
- この商品を含むブログ (400件) を見る
その中で、Factory MethodパターンをSwiftで書いてみました。
Factory Patternについて
まず、Factory Methodパターンについてですが、簡単に言うとあるクラスのインスタンスの生成を、クラスに依存しない別のクラスに任す、といった感じです。
インスタンスの生成を任すクラスをFactoryクラス、そのFactoryクラスから生成するインスタンスの型をProductとして抽象的に定義しておいて、それらのクラスを継承した具体的なクラスからインスタンスを生成する流れとなります。
今回は、例としてComputerクラスを具体的なクラスとして定義します。
- Computerクラス : Productクラスを継承した具体的なクラス。
- ComputerFactoryクラス : Factoryクラスを継承した具体的なクラス。
実際にコードを書いてみる
では、実際に書いてみます。 Java言語では抽象クラス(メソッド)を定義できますが、Swiftでは定義できないので、似たような形で書いています。
//Factoryクラス class Factory { func create(owner: String) -> Product { var p: Product = createProduct(owner) registerProduct(p) return p } func createProduct(owner: String) -> Product { fatalError("must be overridden") } func registerProduct(product: Product) { fatalError("must be overridden") } }
//Productクラス class Product { // 具体的な処理はサブクラスで実装する. func use() { fatalError("must be overridden") } }
上記のクラスを継承した具体的なクラスを定義します。
// Computerクラス class Computer: Product { let owner: String init(owner: String) { println("\(owner)のコンピュータを製造します") self.owner = owner } //具体的な処理の実装 override func use() { println("\(self.owner)のコンピュータを使います") } }
//ComputerFactoryクラス class ComputerFactory: Factory { var owners = [String]() //Factoryクラスで定義した関数をオーバーライド override func createProduct(owner: String) -> Product { return Computer(owner: owner) } override func registerProduct(product: Product) { owners.append((product as! Computer).owner) } }
実行してみます。
var factory = ComputerFactory() var computer1 = factory.create("sato") // "satoのコンピュータを製造します" var computer2 = factory.create("daisuke") //"daisukeのコンピュータを製造します" computer1.use() // => "satoのコンピュータを使います" computer2.use() // => "daisukeのコンピュータを使います"
上記のようにして、具体的なクラス(ここではComputerクラス)のインスタンスをFactoryクラスを継承したComputerFactoryクラスから生成することができました。
このFactory Methodパターンのメリットとしては、Factoryクラス、Productクラス共に具体的なクラスに依存しないことが挙げられます。具体的なクラスに依存しない、汎用的なクラスにすることで同じような処理が必要な場合に再利用できるようになります。
Tomcat下でJDBCを使ってMySQLに接続する(Mac)
サーバサイドJavaという本を読み始めて数日経ちました.
- 作者: 山田祥寛
- 出版社/メーカー: 翔泳社
- 発売日: 2013/10/30
- メディア: Kindle版
- この商品を含むブログ (1件) を見る
JDBCを使ってMySQLとの接続をする部分で少しハマったので、補助的な意味合いで簡単にまとめておこうと思います. 本の中ではWindows用に書かれていて、初めのほうにあるインストールの方法あたりを読まずに進めていたのでなんだかハマったような感じです.
初めに実行環境ですが、
Mac OS X Yosemite 10.10
Java version "1.8.0_31"
Tomcat version "8.0.18.0"
(2015/02/17日現在)
です.
ドライバをインストールする.
デフォルトのJDBCでは個々のデータベース(MySQLやPostgreSQL等)と接続することはできないので、個別に接続するデータベース用のドライバをインストールする必要があります.
今回はMySQLと接続するので、Connector/Jというドライバをインストールします. 以下のサイトからConnector/Jを選択し、「Platform Independent」から"mysql-connector-java-5.1.34.tar.gz"をダウンロードします.
http://dev.mysql.com/downloads/connector/
ダウンロードしたファイルを展開し、以下のディレクトリにコピーします.
・"/usr/share/java/"
・"/Library/Tomcat/lib/"
context.xmlファイルを編集する.
JDBCを使用するアプリケーションのcontext.xmlに以下のように記述します. (上述したサーバサイドJavaを参考にしています)
<Context displayName="Teach Yourself Java" path="/selfjsp" docBase="/selfjsp" reloadable="true"> <Resource name="jdbc/selfjsp" auth="Container" type="javax.sql.DataSource" username="username" password="password" driverClassName="org.gjt.mm.mysql.Driver" url="jdbc:mysql://localhost/selfjsp?useUnicode=true&a mp;characterEncoding=UTF-8" maxActive="4" maxWait="5000" maxIdle="2" validationQuery="SELECT count(*) FRO M member" /> </Context>
MySQLに接続する.
jspで接続を確認します.
<%@ page contentType="text/html; charset=UTF-8" import="java.sql.*,javax.naming.*,javax.sql.*" %> <!DOCTYPE> <html> <head> <meta charset="UTF-8" /> <title>データベースへの接続</title> </head> <body> <% Context context = new InitialContext(); DataSource ds = (DataSource)context.lookup("java:comp/env/jdbc/selfjsp"); Connection db = ds.getConnection(); db.close(); %> データベースへの接続に成功しました。 </body> </html>
以上です.
こうやってまとめてみると、ただ単にドライバを追加して接続させてるだけでした.(笑)
Macでロック解除時のパスワード入力が不要になる神アプリ見つけたのでブログで紹介してみる。
タイトル通りです。 セキュリティ上、Macでパスワードを設定してロックしている方が大半だと思いますが、毎回毎回パスワードを入力するのって、めちゃめちゃめんどくさいですよね。
そんな面倒な作業を完全に取っ払ってくれるアプリを、海外のとあるサイトで見つけたので紹介したいと思います。
その名も、「Near Lock」。
名前だけだと、ん??となると思いますが簡単に説明すると、
"自分のiPhoneがMacに近づくと勝手にパスワードを入力してくれてロック解除してくれる。"
アプリです。(逆にMacからiPhoneが離れると自動でロックしてくれます。)
公式PVはこちら。
個人的には、導入したら感動しました。(笑)
仕組みを簡単に説明すると、
(1)MacとiPhoneの両方にアプリを導入し、MacのパスワードをiPhone側で保持。(端末に保持するのでセキュリティ上問題ない)
(2)両端末でアプリを起動しておく。
(3)BLEを用いて距離を計測。設定した距離の範囲に入ると自動でロック解除、範囲外になるとロック。
という感じです。
【Mac】
【iPhone】
ただし、無料だとiPhone側はアプリをアクティブな状態にしている必要があります。 これだと、正直そんなに使い勝手はよくないのですが、Pro版(400円払いきり)を購入すると使い勝手が劇的に上がります。
Pro版だとバックグラウンドでも動作するようになるので、一度起動してバックグラウンドに仕込んでおくとMacに近づくだけで瞬時に解除してくれます。神です。
BLEなので省電力な点もグッド。
少し残念なのは、BLEの仕様上なのか距離計測の精度が微妙です。最小距離の1.0mで設定しても実際に1.0m以上離れるには体感3mは必要な感じです。
とはいえ、iPhoneは常に持ち歩いているので、席をはずすと勝手にロックしてくれて、戻ると勝手に解除してくれるようになるので、完全なるストレスフリーで作業に戻れる点だけでも400円の価値はあると思います。
興味ある方は以下のリンクから是非試してみてください:D
英語と筋トレとプログラミングと
全国のリア充な方たちの熱い一日に負けじと、熱い(?)エントリを書こうかなと思います。(笑)
初めに今回一番伝えたいことを書くと、
・ 現在の自分の限界を超える負荷を与えることで、ちょっとずつ成長する。
・ そして限界を超えるために必要なことは、全力で楽しむこと。
です。
英語も筋トレもプログラミングも、全部そうだと思っています。
一番分かりやすいのは筋トレ。 当たり前ですが、筋トレは筋肉に負荷をかけて細胞を壊し、その後休めることで超回復し、以前の筋肉よりも強い筋肉となって成長します。 筋トレをしている最中はなかなか辛いものですが、2,3週間も続けていればちょっとずつ成果が見え出してきて、自分の体がだんだん変わっていくことを実感でき楽しくなってきます。 筋トレはやらないとすぐ退化していきますし、また自分の限界を超える負荷を与えないと意味がありません。
英語も、外国人とコミュニケーションできれば最高に楽しいです。 しかし、英語を口にするのは結構勇気がいります。失敗を恐れて喋らないと、いつまでたってもまったく上達しません。自分の脳をフル回転させ(負荷をかけ)、失敗を恐れずに喋るからこそ、喋れるようになっていきます。
プログラミングもまた、失敗(エラー)を恐れずに、とにかく頭の中で想像したことを書きまくることでだんだんできるようになっていくと思っています。コンピュータに怒られることを恐れていてはしたいこともできず、本来創造的な作業であっても楽しくありません。
僕はこの3つのことをここ数年やってきて、そう感じています。 また、これは人生そのものにおいても言えるのではないかなと思います。
失敗を恐れず、自分の限界を超える負荷を与え続けることで、より面白い人生を送ることができるのではないかなと思います。
Get Started with Go using GVM
Goのインストール方法はいくつかありますが、rubyでいうrvmみたいなバージョン管理が容易にできるGVMM(Go Version Manager)使ってGoをインストールしてみます。(Mac OS)
やること
1 GVMを用いてGoをインストール。
2 特定のバージョンをデフォルトとして指定。
前準備
GVMをインストールする前に以下をインストールしておきます。
Homebrewでインストール
brew install mercurial
GVM
//環境に応じてシェルを変更 bash < <(curl -s -S -L https://raw.githubusercontent.com/moovweb/gvm/master/binscripts/gvm-installer)
Go
goのバージョン1.3.3をインストールします。
gvm install go1.3.3
使用するバージョンを指定します。
gvm use go1.3.3
また、--defaultオプションを付加することでシェルを起動する度にgvm useする必要が無くなります。
gvm use go1.3.3 --default
以上です。簡単ですね。
GVMのいくつかのコマンド一覧
インストールされているバージョンのリスト表示
gvm version
使用するバージョンの指定
gvm use [バージョン]
gvmの削除
gvm implode
Goのインストール
gvm install [バージョン]
Goのアンインストール
gvm uninstall [バージョン]