2014年6月29日日曜日

[iOS] Swift Language でQRコード認識

XCode6-Beta2 と iOS8-beta2 on iPhone5で試しに書いてみました。
iOS7からAVCaptureMetadataOutputでQRコードが取得できるので、とても簡単になりましたね。ここでは試していませんが、iOS8でカメラの露光調整も制御できるようになるみたいで、ますます実用度が上がっていきますね。


1. プロジェクトの作成

XCodeでFile > New > Project... で iOSのSingle View Applicationを選択した後、以下のように View の下に View と Table View を2つ置きます。
Table View Cellの Identifier に "Cell" を入力しておきます。また、Table View、Table View Cell のバックグラウンドカラーを Clear Color にしておきます。

※一応、わざわざ View の下に 2 つ View を置いているのは、一方にカメラのプレビューのレイヤを結びつけて、もう一方にQRコードスキャンした結果を表示させたいためです。もっといい方法あるかもしれません。例えば、CATextLayerで結果表示させるのだったら、Viewは1つにして、previewおよびCATextLayerを2つaddLayerする、など。


2. ViewController.swiftの記述

ViewController.swiftを記述していきます。
先に作成した View 以下の View と TableView をそれぞれ IBOutlet で _preview と _tableviewとしてつなげておきます。その上で以下を記述します。

import UIKit
import AVFoundation
import QuartzCore

class ViewController: UIViewController, AVCaptureMetadataOutputObjectsDelegate, UITableViewDataSource, UITableViewDelegate {
    
    @IBOutlet var _tableview: UITableView
    @IBOutlet var _preview: UIView
    var _session: AVCaptureSession!
    var _qrcodes : NSMutableArray = NSMutableArray()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.

        _session = AVCaptureSession()
        var devices : NSArray = AVCaptureDevice.devicesWithMediaType(AVMediaTypeVideo)
        var device : AVCaptureDevice?
        for d : AnyObject in devices {
            if d.position == AVCaptureDevicePosition.Back {
                device = d as? AVCaptureDevice
                break
            }
        }
        // input
        var error : NSErrorPointer!
        var input : AVCaptureInput = AVCaptureDeviceInput.deviceInputWithDevice(device, error: error) as AVCaptureInput
        _session.addInput(input)

        // output
        var output : AVCaptureMetadataOutput = AVCaptureMetadataOutput()
        output.setMetadataObjectsDelegate(self, queue: dispatch_get_main_queue())
        _session.addOutput(output)
        
        // only QR
        output.metadataObjectTypes = [AVMetadataObjectTypeQRCode]
        
        // layer for preview
        var pvlayer : AVCaptureVideoPreviewLayer  = AVCaptureVideoPreviewLayer.layerWithSession(_session) as AVCaptureVideoPreviewLayer
        pvlayer.frame = self.view.bounds
        pvlayer.videoGravity = AVLayerVideoGravityResizeAspectFill
        _preview.layer.addSublayer(pvlayer)
        _session.startRunning()

    }
    
    func captureOutput(captureOutput:AVCaptureOutput?, didOutputMetadataObjects metadataObjects:NSArray, fromConnection connection:AVCaptureConnection?) {
        _qrcodes = NSMutableArray() // for new scanned qrcodes
        for metadata : AnyObject in metadataObjects {
            if (metadata as AVMetadataObject).type == AVMetadataObjectTypeQRCode {
                var qrcode : String = (metadata as AVMetadataMachineReadableCodeObject).stringValue
                println("\(qrcode)")
                _qrcodes.addObject(qrcode)
            }
        }
        _tableview.reloadData() // reload tableview
    }

    func tableView(tableView: UITableView!, numberOfRowsInSection section: Int) -> Int  {
        return _qrcodes.count
    }

    func tableView(tableView: UITableView?, cellForRowAtIndexPath indexPath:NSIndexPath!) -> UITableViewCell! {
        let cell: UITableViewCell = _tableview.dequeueReusableCellWithIdentifier("Cell") as UITableViewCell // get custom cell
        cell.text = _qrcodes[indexPath.row] as String
        return cell
    }
    
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
}

3. 実行

シミュレータではなく、実機で試してみます。QRコードをスキャンすると、オーバーレイで結果が表示されることを確認します。




以上です。

簡単ですね。Swift は .h を書かなくて良いので手間が省けますね。

2014年6月25日水曜日

SAPの権限管理ソフト

SAPの権限管理ソフトを提供しているSecurinfoという会社(南アフリカ)があります。そのファウンダの方とお話したところ、

  • 南アフリカやEU/USでは、ERPのロール、特に運用まで考えたロールの構築/運用にとてもコストがかかっており、顧客を苦しめている。自分はそれを軽減する、使えるソフトを提供している
  • 顧客の苦しみはERP構築時から始まり、南アフリカやEU/USのコンサルファームは、プロジェクトで大きなセキュリティ(権限)チームを構築し、SOXやSoDの名のもとに莫大なコストを顧客からもらい、テンプレートなどからではなく、顧客からのヒアリングをもとに1から権限を作っていることが多い。余計なコストがかかっている
  • また出来上がった権限はユーザ側やBPO(ビジネスプロセスオーナー)が到底理解できるものではなく、IT側もユーザ側が欲しい権限を分からないため、結果、従業員の人事異動時やコストセンター追加時等に何回もユーザ/BPO<->ITでメールやりとりしている。コストも時間もかかっている。権限変えようとしても下手にいじれないのでまたファームにお願いするしかなく、またコストと時間がかかっている
とのことでした。決してすべてのファーム/コンサルがプロジェクトで同じようにやっていないと思いますが、すこしは日本で当てはまる箇所もありますよね。ソリューション自体のデモを見ましたが、なかなか良かったです。というか、実際に例えばSAP GRCを入れたとしても、SoD(職務分掌)チェックがわかったり、緊急時に強い権限を貸出しすることができたり、誰が何をやったかのログ収集をすることができるくらいで、本質的なSoDを意識したロールを1から作ることはできません。一方でこのソフトは権限の責任者をきちんと考えたり、情報(場所などの定義)を付与する必要はあるものの、実際のSoDを意識したロールテンプレートをきちんともっていて、それがユーザ側にも比較的わかりやすいように整理されているため (基本はモジュール分割。ただマスタ管理が同列で定義されている。その下は基本は各マスタ/伝票に対するCRUDで整理されているが、実際のSAPシステムの権限オブジェクトを意識したものも多数追加されている)、使えそうです。ポジションベースのロール割り当てにも対応していて、HRマスタあってもなくても定義できます。また既存のデータをもとに作り出すリバースエンジニアリングにも対応しているそうです。

Securinfoのホームページはあまり更新されていないようですが、こちら

2014年6月6日金曜日

企業向けモバイルアプリ導入のポイント

いくつか企業向けモバイルアプリ導入に関わってきましたが、そこで得たポイントを書きたいと思います。

1. Systems of RecordよりSystems of Engagement。ERPなどの基幹系よりは、顧客に近い部分の仕組みをモバイル化のターゲットにする


ERPで処理する、最終的なヒト・モノ・カネのレコードを扱う業務は、すでに出来上がっており、社内でPC (社外でもノートPC) 利用で十分なことの方が多いです。
経営層は、モバイルアプリ導入をコストかけてやることに関しては、売り上げが向上したり、業務が効率化する(手間が減る、ミスが減る)ことでないと投資が難しいと感じています。
どちらかというと、より顧客に近いCRMなどの仕組みや、現在システム化されていない業務部分をモバイル化する方が、導入効果が出やすいです。


2. スマートフォンの機能を活用する。カメラ、GPS、音声など


例えばカメラで写真撮ったり、商品のQRコードを撮ったり、GPSなりiBeaconで場所の情報を得たりして、モノやコトを即デジタル化。また情報を他者と共有、です。
ただ、これを実施するにはiOSなりAndroidなりデバイスに特化した開発を行う必要があります。MEAPと呼ばれる各ITベンダが出しているモバイルプラットフォームだけでは実装は難しくなります。


3. 導入の計画を立てておく。ユーザ教育も忘れずに


一気にモバイルアプリを作成して使ってもらおうとしても、導入はうまくいかないことの方が多いです。
例えば、以下のステップです。
  1. 標準アプリの業務開放を実施 (メール/スケジュール/連絡帳等)
  2. 定番アプリの業務開放を実施 (社内ドキュメント共有、社内メッセージング、社内SNS等)
  3. 業務で利用できるアプリを作成
  4. 顧客が利用できるアプリを作成 (iOS なり GooglePlay にのせる)
あと、エンドユーザへの教育/展開は念入りに。スマホリテラシーが低い方も部署によって多いです。企業アプリを展開する際にスマホ自体の教育も併せて実施したほうが良いです。


4. モバイルアプリ開発は要件とUXデザインを最初に決めてあまり変化を起こさせない


実際のアプリ開発は、イテレーティブなインプリとします。ただし、アジャイル一辺倒ではなく、まずは要件とUXデザインは最初に決めてあまり変化を途中で起こさせないようにすることがポイントです (かなり迷走します)。シンプルイズザベストです。
要件確認後の開発サイクルは2~4週間で3回。例えば「70-20-10のルール」で、100人日の工数なら70-20-10に分けて、以下の方針です。
  1. 70: 機能性を満たす
  2. 20: UXを満たす (UX微調整)
  3. 10: バグ修正、最終化
また、非機能要件テスト(通信状況悪い場所でのテスト、パフォーマンステストなど)で多めに期間(+工数)積むことがお勧めです。デスクトップWebアプリより難しいです。


5. 運用に注意


iOSやAndroidはOSのバージョンアップが早く、またユーザ側はすぐバージョンアップを実施してしまいます。バージョンアップに対しての方針を策定しておくことが必要です (ITが検証しない限り、バージョンアップしないようにする、等)。
またネイティブアプリを利用している場合はアプリの配信にも注意です。いそがしいユーザは最新のアプリをダウンロードしてくれません。ITベンダが提供しているMDMなり、キャリアがオプションで提供しているMDMサービス(auやSoftBankは持っています)を利用し、常に最新のものを配信することを心掛けることが必要です。 

2014年6月4日水曜日

SAP Fiori とは

去年に書きましたが、HTML5で出来た新しいSAPのUXです。UIでなくUXとしているのは、単純に今までのSAPのERPのトランザクションをそのままHTML5に置き換えたわけではなく、ユーザ観点で操作性を再考してリリースすることにしたからなようです(デザインシンキングで何回もブラッシュアップしたらしいです)。もともとワークフロー系の新しいUXとして開発されていたようで、当初は経費精算やタイムシートの承認アプリしかありませんでしたが、申請系も増えてきたようです。
で、先ほど sapphire にて発表がありましたが、SAP Fiori が free (既存ライセンスに含まれる) ようになるみたいですね。"simple化"の一貫と。ただ、疑問に思うのは、これを使うためのコストです。

  • Add-onパッケージを色々いれないといけませんし、前提SPは比較的低いものも多いようですが、カスタマイズもそれなりに必要だったりします。
  • またそれに伴う現行システムの入力方法/使い方が多少なりとも変わるので、ユーザ教育して運用に手を入れないといけなくなります。
  • クライアント側やネットワークにも注意です。HTML5(w/JS)の実行エンジンはクライアント側(PCやiPadのWebブラウザ)で、UXに凝っているためそれなりに負荷かかります。またネットワーク帯域はSAPGUIのときよりも少し多く使うようですし、何よりInternetに接続させるのであれはセキュリティに注意しなければいけません。
ここらへんを考えてまで導入に踏み切れるかどうか。あくまで従業員向けのソリューションであり、「得意先が利用して売り上げを向上させる」ようなものでは残念ながらありません。「UXで従業員の生産性が上がる」といっても、既存ERPのユーザでSAPGUIに慣れているのであれば、どこまでいったい生産性が上がるのか、懐疑的です。
個人的には、どちらかというと新規導入のお客様やHANAに移行するお客様で、「どーんと色々変えてしまいましょう。UXも最新のもの導入しましょう」というのが良い気がします。

技術的に詳しい内容は以下に出ています。
http://help.sap.com/fiori_bs2013