Swiftのenum(列挙型)のざっくりまとめ

Objective-Cの列挙型といえば、C言語と同じく整数型の値を複数持つものでしたが、Swiftの列挙型ではかなり柔軟かつ多機能なものになっています。

その列挙型について少しまとめてみました。

定義

Swiftの列挙型(enum)は以下のように定義できます。

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言語で説明している以下の本です。

増補改訂版Java言語で学ぶデザインパターン入門

増補改訂版Java言語で学ぶデザインパターン入門

その中で、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という本を読み始めて数日経ちました.

独習Java サーバサイド編 第2版

独習Java サーバサイド編 第2版

JDBCを使ってMySQLとの接続をする部分で少しハマったので、補助的な意味合いで簡単にまとめておこうと思います. 本の中ではWindows用に書かれていて、初めのほうにあるインストールの方法あたりを読まずに進めていたのでなんだかハマったような感じです.

初めに実行環境ですが、

Mac OS X Yosemite 10.10
Java version "1.8.0_31"
Tomcat version "8.0.18.0"
(2015/02/17日現在)

です.

なお、JavaTomcatはインストール済みが前提です.

ドライバをインストールする.

デフォルトのJDBCでは個々のデータベース(MySQLPostgreSQL等)と接続することはできないので、個別に接続するデータベース用のドライバをインストールする必要があります.

今回はMySQLと接続するので、Connector/Jというドライバをインストールします. 以下のサイトからConnector/Jを選択し、「Platform Independent」から"mysql-connector-java-5.1.34.tar.gz"をダウンロードします.

http://dev.mysql.com/downloads/connector/

f:id:st_dsk:20150217200134p:plain

ダウンロードしたファイルを展開し、以下のディレクトリにコピーします.

・"/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」。

名前だけだと、ん??となると思いますが簡単に説明すると、
"自分のiPhoneMacに近づくと勝手にパスワードを入力してくれてロック解除してくれる。"
アプリです。(逆にMacからiPhoneが離れると自動でロックしてくれます。)

公式PVはこちら。

個人的には、導入したら感動しました。(笑)

仕組みを簡単に説明すると、

(1)MaciPhoneの両方にアプリを導入し、MacのパスワードをiPhone側で保持。(端末に保持するのでセキュリティ上問題ない)

(2)両端末でアプリを起動しておく。

(3)BLEを用いて距離を計測。設定した距離の範囲に入ると自動でロック解除、範囲外になるとロック。

という感じです。

Mac

f:id:st_dsk:20150122011648p:plain

iPhone】  

f:id:st_dsk:20150122011626p:plain f:id:st_dsk:20150122011632p:plain

ただし、無料だとiPhone側はアプリをアクティブな状態にしている必要があります。 これだと、正直そんなに使い勝手はよくないのですが、Pro版(400円払いきり)を購入すると使い勝手が劇的に上がります。

Pro版だとバックグラウンドでも動作するようになるので、一度起動してバックグラウンドに仕込んでおくとMacに近づくだけで瞬時に解除してくれます。神です。

BLEなので省電力な点もグッド。

少し残念なのは、BLEの仕様上なのか距離計測の精度が微妙です。最小距離の1.0mで設定しても実際に1.0m以上離れるには体感3mは必要な感じです。

とはいえ、iPhoneは常に持ち歩いているので、席をはずすと勝手にロックしてくれて、戻ると勝手に解除してくれるようになるので、完全なるストレスフリーで作業に戻れる点だけでも400円の価値はあると思います。

興味ある方は以下のリンクから是非試してみてください:D

Near Lock

英語と筋トレとプログラミングと

全国のリア充な方たちの熱い一日に負けじと、熱い(?)エントリを書こうかなと思います。(笑)

初めに今回一番伝えたいことを書くと、

・ 現在の自分の限界を超える負荷を与えることで、ちょっとずつ成長する。

・ そして限界を超えるために必要なことは、全力で楽しむこと。

です。

英語も筋トレもプログラミングも、全部そうだと思っています。

一番分かりやすいのは筋トレ。 当たり前ですが、筋トレは筋肉に負荷をかけて細胞を壊し、その後休めることで超回復し、以前の筋肉よりも強い筋肉となって成長します。 筋トレをしている最中はなかなか辛いものですが、2,3週間も続けていればちょっとずつ成果が見え出してきて、自分の体がだんだん変わっていくことを実感でき楽しくなってきます。 筋トレはやらないとすぐ退化していきますし、また自分の限界を超える負荷を与えないと意味がありません。

英語も、外国人とコミュニケーションできれば最高に楽しいです。 しかし、英語を口にするのは結構勇気がいります。失敗を恐れて喋らないと、いつまでたってもまったく上達しません。自分の脳をフル回転させ(負荷をかけ)、失敗を恐れずに喋るからこそ、喋れるようになっていきます。

プログラミングもまた、失敗(エラー)を恐れずに、とにかく頭の中で想像したことを書きまくることでだんだんできるようになっていくと思っています。コンピュータに怒られることを恐れていてはしたいこともできず、本来創造的な作業であっても楽しくありません。

僕はこの3つのことをここ数年やってきて、そう感じています。 また、これは人生そのものにおいても言えるのではないかなと思います。

失敗を恐れず、自分の限界を超える負荷を与え続けることで、より面白い人生を送ることができるのではないかなと思います。

Get Started with Go using GVM

Goのインストール方法はいくつかありますが、rubyでいうrvmみたいなバージョン管理が容易にできるGVMM(Go Version Manager)使ってGoをインストールしてみます。(Mac OS)

moovweb/gvm

やること

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 [バージョン]

なんだか捗りそうなのでブログ開設した

f:id:st_dsk:20140919041734j:plain

なんだか、毎日過ごしてるわけですけど、ブログを書いたほうが捗りそうなので、開設しました。

最初にまとめておくとこんな感じです。

• ボクの脳の記憶容量はたぶん1MBくらい
TwitterFacebookではちょっと物足りない
• ブログが話の話題になったりならなかったり
• アウトプットはインプットに繋がる

続きを読む