2015/06/19

Swift 丸アイコン内、テキストセンター描画

UIViewのカスタムクラスにて、overrideしたdrawRect内で、
// 丸描画
let roundRect = UIBezierPath(roundedRect: CGRectMake(1, 1, 28, 28), cornerRadius: 10)
UIColor.blueColor().setStroke()
roundRect.lineWidth = 2
roundRect.stroke()

// フォント属性
let fontAttr = [NSFontAttributeName: UIFont.systemFontOfSize(10)]
// テキスト
let str = self.initial_txt! as NSString!
// サイズ取得
let size = str.sizeWithAttributes(fontAttr)

let x_pos = (roundRect.bounds.size.width - size.width) / 2
let y_pos = (roundRect.bounds.size.height - size.height) / 2

// テキスト描画
str.drawAtPoint(CGPointMake(roundRect.bounds.origin.x + x_pos, roundRect.bounds.origin.y + y_pos),
    withAttributes: fontAttr)

結果

initial.png

参考


2015/06/17

Swiftでテキスト内リンク&テキストタップ検出


指定したテキスト内にリンクを設定したいことがあります。
@you_matz #swiftなどをリンクとして埋め込みたい場合
そしてそのリンクをタップした際に別の画面に遷移させるなど。

実現方法

①UITextViewのプロパティの設定

textView.userInteractionEnabled = true
textView.editable = false

// tapでテキストのポジション検出可能とするため
textView.selectable = true

// 行間レイアウト用
// textView.layoutManager.delegate = self

②テキスト内リンク範囲指定

let text = "Swiftでテキスト内リンク&テキストタップ検出"
let linkText = "リンク"
let nsTex = text as NSString
let link = text.rangeOfString(linkText)
let attributedString = NSMutableAttributedString(string: text)
let start = distance(text.startIndex, link!.startIndex)
let length = distance(link!.startIndex, link!.endIndex)

// リンク位置範囲生成
range = NSMakeRange(start, length)

③textviewに指定した色、カラー、下線を指定後、代入

// テキスト全体文字色
attributedString.addAttribute(NSForegroundColorAttributeName, value: UIColor.whiteColor(), range: NSMakeRange(0, nsTex.length))

// リンクカラー
attributedString.addAttribute(NSForegroundColorAttributeName, value: UIColor.blueColor(), range: range)

// リンク下線
attributedString.addAttribute(NSUnderlineStyleAttributeName, value: NSUnderlineStyle.StyleSingle.rawValue, range: range)
// 属性を代入
textView.attributedText = attributedString

④textViewにgesture追加

// gesture追加
let tap = UITapGestureRecognizer(target: self, action: "tapText:")
textView.addGestureRecognizer(tap)

⑤tap時の動作

func tapText(tap: UITapGestureRecognizer) {

    // タップされた座標をもとに最寄りの文字列の位置を取得
    let location = tap.locationInView(textView)
    let textPosition = textView.closestPositionToPoint(location)

    // テキストの先頭とタップした文字の距離をNSIntegerで取得
    let selectedPosition = firstTextView.offsetFromPosition(firstTextView.beginningOfDocument, toPosition: textPosition!)

    // タップした文字がリンク文字のrangeに含まれるか判定
    if NSLocationInRange(selectedPosition, range) {

        // リンクタップ時の処理
        // let webVC = WebViewController()
        // self.presentViewController(webVC, animated: true, completion: nil)    
    }
}

参考

NSAttributedStringを使ってリンク文字を作る(Objective-C)
https://gist.github.com/yoshimin/858d14751fc1c00807d2
UITextView でタップ可能なリンクをカスタマイズする
http://kishikawakatsumi.hatenablog.com/entry/20130605/1370370925

2015/06/14

S3でIP制限

S3でIP制限
静的なファイルの配置先としてS3を利用している場合、アクセス制限などを設けたい場合があります。どこからでもアクセスできるとセキュリティ的にもコスト的にもあれあので。
今回は特定のIPのみを許可する方法です。

実現方法

S3管理画面、特定のバケットの選択、プロパティを選択、
アクセス許可の欄より、バケットポリシーの編集をクリック
以下にてバケットポリシーを生成します。
http://awspolicygen.s3.amazonaws.com/policygen.html
説明は以下
スクリーンショット 2015-06-14 午後1.12.38.png
  • Select Type of Policyは「S3 Bucket Policy」を選択
  • Effectは「Deny」
  • Principalは「*」アスタリスクですべて
  • AWS Serviceは「Amazon S3」
  • すべてのアクセスに適用させたいなら「All Actions」にチェック
  • Amazon Resource はバケット以下が対象なら「arn:aws:s3:::yourBucketName/*」のような形で
  • 「Add Conditions (Optional)」をクリックでIP制限を追加
  • Condition 「NotIpAddress」を選択
  • Keyは「aws:SourceIp」を選択
  • Valueは許可したいIPアドレスを入力
  • 「Add Condition」で追加
  • 「Add Statement」で正式に追加
  • 複数IP追加したい場合は再度Add Conditions (Optional)で上記手順
最後に「Generate Policy」にて生成され、
S3のバケットポリシーエディターに貼り付け保存。

生成されたソースの例

{
    "Version": "2012-10-17",
    "Id": "Policy*************",
    "Statement": [
        {
            "Sid": "Stmt**********",
            "Effect": "Deny",
            "Principal": "*",
            "Action": "s3:*",
            "Resource": "arn:aws:s3:::yourBucketName/*",
            "Condition": {
                "NotIpAddress": {
                    "aws:SourceIp": "192.0.2.0/24"
                }
            }
        }
    ]
}

最後に確認

許可IPからのアクセスの場合

ファイルにアクセス可能

NGの場合、以下のXMLレスポンス

AccessDenied

2015/06/01

Amazon Machine Learningについて

Amazon Machine Learningについて
とある案件で利用したのでまとめておきます。
教師ありの機械学習のクラウドサービスがお手軽に利用できる、
Amazon Machine Learning。

結局何に使うの?という声が多い機械学習ですが、
データの分析、予測結果の妥当性を高めるために利用するのには適しているかと思います。

  • 大量の顧客情報から効率的にターゲットの顧客に対してキャンペーンを打ちたい
  • 大量のニュースの記事から新たな記事はどのカテゴリに属するか
  • 現状の在庫、売上から、特定の商品はどのくらいの在庫を持つべきか
という問に精度の高い予測、適切な予測を示してくれることでしょう。

アジェンダ

  • 導入にあたっての使用条件
  • どのようなことができるか?
  • 機械学習とは?
  • Amazon MLの導入方法
  • PHPでのAPIサンプル
  • まとめ
  • 参考資料