Category Archives: 未分類

どこかで見たことあるアニメーションを自作してみました。

IMG_0986.TRIM

UIViewのExtensionに波紋を表示するためのメソッド

extension UIView {

    func 波紋(touch: UITapGestureRecognizer) {
       
        // ①: タップされた場所にlayerを置き、半径200の円を描画
        let location = touch.location(in: self)
        let layer = CAShapeLayer.init()
        self.layer.addSublayer(layer)
        layer.frame = CGRect.init(x: location.x, y: location.y, width: 100, height: 100)
        layer.position = CGPoint.init(x: location.x, y: location.y)
        layer.contents = {
            let size: CGFloat = 200.0
            UIGraphicsBeginImageContext(CGSize.init(width: size, height: size))
            let context = UIGraphicsGetCurrentContext()!
            context.saveGState()
            context.setFillColor(UIColor.clear.cgColor)
            context.fill(self.frame)
            let r = CGFloat.init(size/2-10)
            let center = CGPoint.init(x: size/2, y: size/2)
            let path : CGMutablePath = CGMutablePath()
            path.addArc(center: center, radius: r, startAngle: 0, endAngle: CGFloat(Double.pi*2), clockwise: false)
            context.addPath(path)
            context.setFillColor(UIColor.lightGray.cgColor)
            context.setStrokeColor(UIColor.lightGray.cgColor)
            context.drawPath(using: .fillStroke)
            let image = UIGraphicsGetImageFromCurrentImageContext()
            context.restoreGState()
            return image!.cgImage
        }()

        // ②: 円を拡大しつつ透明化するAnimationを用意
        let animationGroup: CAAnimationGroup = {
            let animation: CABasicAnimation = {
                let animation = CABasicAnimation(keyPath: "transform.scale")
                animation.timingFunction = CAMediaTimingFunction(name:kCAMediaTimingFunctionEaseOut)
                animation.duration = 0.5
                animation.isRemovedOnCompletion = false
                animation.fillMode = kCAFillModeForwards
                animation.fromValue = NSNumber(value: 0.5)
                animation.toValue = NSNumber(value: 5.0)
                return animation
            }()
           
            let animation2: CABasicAnimation = {
                let animation = CABasicAnimation(keyPath: "opacity")
                animation.duration = 0.5
                animation.isRemovedOnCompletion = false
                animation.fillMode = kCAFillModeForwards
                animation.fromValue = NSNumber(value: 0.5)
                animation.toValue = NSNumber(value: 0.0)
                return animation
            }()
           
            let group = CAAnimationGroup()
            group.beginTime = CACurrentMediaTime()
            group.animations = [animation, animation2]
            group.isRemovedOnCompletion = false
            group.fillMode = kCAFillModeBackwards
            return group
        }()
       
        // ③: layerにAnimationを適用
        CATransaction.setAnimationDuration(5.0)
        CATransaction.setCompletionBlock({
            layer.removeFromSuperlayer()
        })
        CATransaction.begin()
        layer.add(animationGroup, forKey: nil)
        layer.opacity = 0.0
        CATransaction.commit()
    }
}

使い方:

override func awakeFromNib() {
    super.awakeFromNib()

    let tapGesture = UITapGestureRecognizer.init(target: self, action: #selector(self.tapContentView(touch:)))
    self.contentView.addGestureRecognizer(tapGesture)
}

@objc func tapContentView(touch: UITapGestureRecognizer) {

    self.contentView.波紋(touch: touch)
}

どの画面から呼んでも大丈夫!

・Viewのモーダル表示

UIApplication.shared.keyWindow?.addSubview(view)
UIApplication.shared.keyWindow?.bringSubview(toFront: view)

・消し方(表示したViewの閉じるイベントで呼ぶ)

self.removeFromSuperview()

こんばんは。
最近暑くて、体調を崩す方が多いですね。
皆様は、お元気でお過ごしでしょうか?

さて、今回はエンジニアではなく、採用の小関がブログを書かせていただいてます。
なぜかというと!株式会社プラスアールでは、エンジニア職(PHP、iOS、Android)を絶賛募集しています!
https://www.wantedly.com/projects/58873

以前、公開して反響の大きかった「数独問題」を解き、
応募していただけた方へ今回もバックジョイをプレゼントいたします!
ご応募ではなく、「まず話を聞いてみたい!」という方でも、
先着5名様に限りプレゼントをいたします!

解けた方は、以下URLのメッセージで、解くのに用いたプログラムソースやgithubリンクを添付しご連絡ください。
https://www.wantedly.com/projects/58873
数独問題を解いて応募いただいた方は書類選考なしで、面談へお進みいただけます!
日程調整後、採用面談へ来ていただく際にバックジョイをお渡しいたします。

[問題]「16×16数独」

一般的に数独は3×3のマスが3×3、つまり9×9配置されますが、
4×4のマスが4×4、つまり16×16の盤面でも遊ぶことができます。
使う数字は1-9の9個ではなく、1-16の16個になります。
16といえば16進数ということで、0-9A-Fの16個の「数字」で数独問題を用意してみました。

ルール
・一つの列には0-9A-Fの一つずつが入る。
・一つの行には0-9A-Fの一つずつが入る。
・太枠の4×4にはそれぞれ、0-9A-Fの一つずつが入る。
※ナナメやその他のグループに制約はありません。

16×16 数独問題

上の空欄を、上記ルールに従って全て埋めて下さい。
埋め終わったら、https://www.wantedly.com/projects/58873 まで回答をメッセージにてご記載ください。
また、埋まった全ての盤面(csvでも画像でも構いません)と、
解くのに用いたプログラムソースやgithubリンクを添付して下さい。

※面接の日程についてはメールで調整致します。
※求人の定員に達し次第終了しますので、解けた方はすぐにご連絡下さい。

plusr_top-500x142

プラスアールは、健康情報&相談サイト「カラダノート」や、スマホでカラダの悩みや不安を解消するためのスマホアプリを、「カラダノート」シリーズとして両OS合計で60アプリ以上提供しております。

月間350万人以上の方にご利用いただいており、
シリーズ内の人気アプリ「妊娠なう」「陣痛きたかも」「血圧ノート」「お薬ノート」などは、AppStore/GooglePlay共にランキング上位に長らくランクインしております。

ユーザー視点の運営手法が注目され、東洋経済の新成長ビジネス100にも取り上げていただき、日経新聞にも度々サービスが紹介されるなど、多方面から注目をされているヘルスケアベンチャーです。

各アプリともにユーザーレビューも高く、感謝の声を多数いただいております。
”助けられています!”という声を多数いただけるサービス企画・開発にあなたも加わってみませんか?

ヘルスケアサービスに特化して事業を行っている会社なので、社員の健康や子育ての両立を第一に考えています。
・週1日までの在宅勤務可!毎週水曜日はノー残業デー
・ほぼ毎日家族と晩御飯を食べられる時間に帰宅しています。
・体への負担の少ないバロンチェアの導入
・腰やふくらはぎのマッサージ器完備!
・血圧計やストレスチェッカー、高性能な加湿空気清浄機の導入などを積極的に行っています。

少しでも気になった方は是非一度面談へいらしてください!
詳しくお話させていただきます。
もちろん数独問題ではなく、応募いただける方も大歓迎です。

https://www.wantedly.com/projects/58867

こんな募集もしています!
それでは、ご応募お待ちしております!

こんにちは。Android担当のseitoです。最近Web開発のお手伝いを始めました。

個人でホームページ等作ったことはありましたが、業務で携わるのは初めてでできるだけ足手纏いにならないよう頑張りたいと思います。

 

さて、今日はWeb開発用に作成したVMの挙動ではまった話です。

環境

・VirtualBox 4.3.28
・CentOS 5.11
・Vagrant 1.7.2
・Apache 2.2.15
・SublimeText 2
・PHP 5.3.3

 

現象

・CSSの更新が画面に反映されない
・更新したCSSファイルの末尾に謎の文字化けが
スクリーンショット 2015-07-17 17.35.01

 

文字化けしてることからエンコード形式が原因だと思いSublimeText2のエンコードを確認。

UndefinedになっていたのでUTF-8でエンコードし直して再度確認。。。

が改善されず。VMに入ってviでファイルを確認しても文字化けしていませんでした。

色々試していると、どうやら文字化けというよりキャッシュまわりが怪しそうな動作でした。

ぐぐってみるとドンピシャの記事を発見しました。

 

対策

この記事を元に

<Directory /var/www/html/>
    ・・・

    EnableMMAP Off
    EnableSendfile Off
</Directory>

Apacheサーバのドキュメントルートに対してキャッシュを無効にする設定を行いました。

そのあとApacheを再起動し、スーパーリロードしてあげるとCSSが反映されました。

CSSがまったく更新されなければキャッシュだと気づいたかもしれませんが、文字化けが発生するのが原因究明を遅らせました。

 

Webエンジニアへの道のりは険しい・・・

以下のようなコードがメインスレッドで実行されるのを期待している場合、2.2以前までは、データベースに保存されるが、2.3.0以降では保存されない。

let td = Todo.MR_createEntity()
td.title = titleText.text
td.managedObjectContext?. MR_saveOnlySelfAndWait()

MR_createEntity でdefaultContextにEntityが生成され、MR_saveOnlySelfAndWaitではdefaultContextに保存される。defaultContextに変更があった時点で、データベースに保存されることを期待している。しかし、2.3.0以降では、 MR_rootSavingContextができたため、defaultContextで保存処理が行われてもデータベースには反映されない。

解決策として、アプリ終了時にdefaultContextから MR_rootSavingContextに保存するか、保存のたびに MR_saveToPersistentStoreAndWait又は類似のメソッドを実行する必要がある