Apacheでサーバ証明書登録

kiyohime.hatenablog.com

前回の記事で作ったサーバ証明書を配置していきます。

参考記事

cspssl.jp

必要なファイルを配置

必要なファイル

f:id:kiyohime:20160519125734p:plain

1_root_bundle.crt -> 中間証明書 2_hogehoge.crt -> サーバ証明書

秘密鍵CSRを発行した際に作成したものを使います。

ApacheServerディレクトリにある2つのcrtファイルをサーバにアップします。 /etc/httpd/conf.d/ssl に置きました。

[root@dev ssl]# ll
合計 12
-rwxr-xr-x 1 root root 2106  5月 19 13:01 2016 1_root_bundle.crt
-rwxr-xr-x 1 root root 2451  5月 19 13:01 2016 2_hogehoge.crt
-rw-r--r-- 1 root root 3273  5月 19 13:02 2016 server.key

ssl.confの設定

SSLCertificateFile SSLCertificateKeyFile SSLCertificateChainFile

をそれぞれssl.confに設定します。

[root@dev conf.d]# vim /etc/httpd/conf.d/ssl.conf
SSLCertificateFile /etc/httpd/conf.d/ssl/2_hogehoge.crt
SSLCertificateKeyFile /etc/httpd/conf.d/ssl/server.key
SSLCertificateChainFile /etc/httpd/conf.d/ssl/1_root_bundle.crt

設定確認後、Apacheを再起動します。

[root@dev ssl]# service httpd configtest
Syntax OK
[root@dev ssl]# service httpd restart

確認

f:id:kiyohime:20160519131433p:plain

ブラウザで証明書を確認してちゃんと登録されてれば完了です。

StartComで無料のサーバSSL証明書発行

検証環境のサーバ証明書を新規発行する時の手順メモ

今回はStartComでサーバ証明書を発行しました

StartSSL™ Certificates; Public Key Infrastructure

アカウント登録

f:id:kiyohime:20160517123158p:plain

フリーアカウントを作ります。

SSL証明書作成

f:id:kiyohime:20160517123353p:plain

フリー証明書を選択します。

f:id:kiyohime:20160517123459p:plain

WebサーバーのSSL証明書を選択します。

f:id:kiyohime:20160517123934p:plain

証明書を作成するホスト名を入力する画面に飛びます
ここでホスト名を入力しますが、まずドメインの認証を行ってくださいとエラーが出ます
”Domain Validation"のリンクから認証画面へ

f:id:kiyohime:20160517130116p:plain

指定アドレスに認証コードを送るか、対象WEBサーバのルートに認証コードを置くかで認証は行えるようです。
今回はサーバのルートに認証コードを配置してみました。

f:id:kiyohime:20160517124725p:plain

htmlをダウンロードし対象サーバのルート(/var/www/htmlなど)に配置

f:id:kiyohime:20160517124945p:plain

認証が成功すれば次へ

f:id:kiyohime:20160517125147p:plain

ドメインの認証が通ったので次はCSRを作成します
Macで作業していたのでコマンドで発行
WindowsはStartComTool.exeでの作成もできるみたいです)

~/scrap ❯❯❯ openssl req -newkey rsa:2048 -keyout hoge.key -out hoge.csr           ⏎
Generating a 2048 bit RSA private key
...+++
.......................................................................................+++
writing new private key to 'hoge.key'
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:
State or Province Name (full name) [Some-State]:
Locality Name (eg, city) []:
Organization Name (eg, company) [Internet Widgits Pty Ltd]:
Organizational Unit Name (eg, section) []: 
Common Name (e.g. server FQDN or YOUR name) []:
Email Address []:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

上記でできるhoge.csrの中身を入力

f:id:kiyohime:20160517125849p:plain

無事証明書が作成されました
"here"からダウンロードできます

f:id:kiyohime:20160517125937p:plain

あとは自分のサーバのものを配置すれば完了です
それは次回

DeployGateを使ってみる

アプリの配布用にDeployGateを使っています

deploygate.com

アカウントを作成したらipaファイルを「アップロード」からアップロードだけでメンバーに配布できます(便利

f:id:kiyohime:20160512101707p:plain

ipaファイル

ipaファイルはプロビジョンファイルをDevelopのものに設定し「Product -> Archive」を選択

f:id:kiyohime:20160512105029p:plain

Organizerが開いたらArchivesからビルドしたものを選択し「export」を選択

f:id:kiyohime:20160512105023p:plain

Select a method for export は 「Save for Ad Hoc Deployment」を選択

あとはNextでOK

モザイクカメラアプリを作りました!

herokuを使ってみる

herokuにPHPアプリを置いてみる

herokuにアプリを作成

heroku.com

  1. herokuアカウント取得

  2. heroku toolbeltをインストール

Heroku Toolbelt

$ heroku login

$ cd ~/myapp

$ heroku create (app_name) #名前を指定しないとランダムで振られる

[f:id:kiyohime:20160425155356p:plain:w400]

「mntestphp」というアプリができました

gitリポジトリ

#./.git/config
[core]
        repositoryformatversion = 0
        filemode = true
        bare = false
        logallrefupdates = true
        ignorecase = true
        precomposeunicode = true
[remote "heroku"]
        url = https://git.heroku.com/mntestphp.git
        fetch = +refs/heads/*:refs/remotes/heroku/*

createした時にgitリポジトリもできてますね

アプリのデプロイ

試しにファイルを作成しプッシュする

$ "<?php echo("test");" > index.php

$ git add ./

$ git git commit -m 'init'

$ git push heroku master

$ heroku open

[f:id:kiyohime:20160425160614p:plain:w400]

表示を確認できます

Composerの設定

mb_convert_encodingを利用しようとしたらエラーが出た

PHP Fatal error: Call to undefined function mb_convert_encoding()

mb_stringがない
ルートディレクトリにcomposer.jsonに配置していなかった

# composer.json
{
    "require": {
        "ext-mbstring": "*"
    }
}

composer updateし再デプロイで無事解決

heroku がやたらheroicに変換される...

CocoaPodsを入れてみる

iOSのライブラリ管理ツール「CocoaPods」を入れてみる

www.atmarkit.co.jp

CocoaPodsを入れてみる

(Rubyが必要)

sudo gem install cocoa pods

pod setup

上記コマンドを実行しpodsが使えるようにする

Podfile作成

cd (projectのディレクトリ)
pod init

ディレクトリ下にPodfileが作成される

pod file編集

platform :ios, '8.0'
use_frameworks!

pod 'ACEDrawingView'

xcode BuildSetting->User-DefinedにPODS_ROOT=${SRCROOT}/Podsを追加する

f:id:kiyohime:20160422155243p:plain:w400

ライブラリをインストール

$ pod install
CocoaPods 1.0.0.beta.8 is available.
To update use: `gem install cocoapods --pre`
[!] This is a test version we'd love you to try.

For more information see http://blog.cocoapods.org
and the CHANGELOG for this version http://git.io/BaH8pQ.

Downloading dependencies
Installing ACEDrawingView (1.3.7)
Generating Pods project
Integrating client project

[!] From now on use `camera.xcworkspace`.

camera.xcworkspaceが作成されるので実行しxcodeを再起動
Podsディレクトリが追加される

f:id:kiyohime:20160422155608p:plain:w200

以上でライブラリのインストール完了

ライブラリを使ってみる

ちなみにACEDrawingViewは簡単にお絵描きViewが設定できるライブラリです

dev.classmethod.jp

storyboardでviewを追加しclassに「ACEDrawingView」を指定

f:id:kiyohime:20160422161325p:plain:w400

これだけでお絵描きViewが実装でき便利

モザイクカメラアプリを作りました!

swiftでカメラアプリ

swiftでカメラアプリ開発

swift 2.0
xcode 7.3

iphoneの実機でカメラを動かしたい!

akira-watson.com

UIImagePickerControlを使ってカメラで写真を撮って保存する機能を実装

  1. Main.stroyboardを編集

f:id:aster55isk:20160420105407p:plain:w400

下記を設置

「カメラ起動」ボタン (UIButtom) 「保存」ボタン (UIButtom) ImageView (ImageView)

  1. ViewController.swiftに記述
import UIKit

class ViewController: UIViewController,UIImagePickerControllerDelegate,UINavigationControllerDelegate {
    
    // 撮影画像の表示View
    @IBOutlet var imageView : UIImageView!

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    // カメラの撮影開始
    @IBAction func cameraStart(sender : AnyObject) {
        
        let sourceType:UIImagePickerControllerSourceType = UIImagePickerControllerSourceType.Camera
        // カメラが利用可能かチェック
        if UIImagePickerController.isSourceTypeAvailable(UIImagePickerControllerSourceType.Camera){
            // インスタンスの作成
            let cameraPicker = UIImagePickerController()
            cameraPicker.sourceType = sourceType
            cameraPicker.delegate = self
            self.presentViewController(cameraPicker, animated: true, completion: nil)
            
        }
        else{
            showAlert("", message: "Error of the camera function.")
        }
    }
    
    // 撮影が完了時した時に呼ばれる
    func imagePickerController(imagePicker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject]) {
        
        if let pickedImage = info[UIImagePickerControllerOriginalImage] as? UIImage {
            self.imageView.image = pickedImage
        }
        
        //閉じる処理
        imagePicker.dismissViewControllerAnimated(true, completion: nil)
        
    }
    
    // 写真を保存
    @IBAction func savePic(sender : AnyObject) {
        let image:UIImage! = imageView.image
        
        if image != nil {
            UIImageWriteToSavedPhotosAlbum(image, self, "image:didFinishSavingWithError:contextInfo:", nil)
        }
        else{
            showAlert("", message: "image Failed !")
        }
    }
    
    // 撮影がキャンセルされた時に呼ばれる
    func imagePickerControllerDidCancel(picker: UIImagePickerController) {
        picker.dismissViewControllerAnimated(true, completion: nil)
    }
    
    // 書き込み完了結果の受け取り
    func image(image: UIImage, didFinishSavingWithError error: NSError!, contextInfo: UnsafeMutablePointer<Void>) {
        if error != nil {
            showAlert("", message: "Failed to save the picture.")
        } else {
            showAlert("", message: "The picture was saved.")
        }
    }
    
    // アラートを表示する
    func showAlert(title: String, message: String) {
        let alertView = UIAlertView()
        alertView.title = title
        alertView.message = message
        alertView.addButtonWithTitle("OK")
        alertView.show()
    }

}
  1. storyboardと紐付け

f:id:aster55isk:20160420111140p:plain:w400
実機でテスト

実機でテストするにはiphonemacに接続しターゲットでiphoneを選択する

f:id:aster55isk:20160420111305p:plain:w200

動作確認

f:id:aster55isk:20160420111634p:plain:w200

無事カメラ機能を実装完了

モザイクカメラアプリを作りました!

swiftはじめました

2ヶ月前くらいからswift始めてみた感想

  • やたらvarやらletで怒られる

varは変数でletは定数らしい
変わってないものをvarで書いたり、letで書いたものの値を変えようとすると警告がでる

var a = "test"
print(a)
-> Variable 'a' was never mutated; consider changing to 'let' constant

let a = "test"
a = "foo"
print(a)
-> Cannot assign to value: 'a' is a 'let' constant
  • やたら!?つけろって怒られる

下のエラーがよく出る

Value of optional type 'Int?' not unwrapped; did you mean to use '!' or '?'?  

Optional型...アンラップ...(なんぞ?
Optional型とはnilを許容した型で、宣言時に?をつけてラップするらしい

var foo:Int?
foo = nil
var bar:Int = foo
-> Value of optional type 'Int?' not unwrapped; did you mean to use '!' or '?'?

値を取り出すにはアンラップしてあげないと駄目で末尾に!か?をつけてアンラップするらしい

! ?
nilが入っているとランタイムエラー nilが入っているとnilを返す

qiita.com

  • guardというものがあるらしい

アンラップ時に実値かnilかで条件分岐が必要だったりする時、guardを使っても書けるらしい

if文

func test() -> Int? {
    var foo:Int?
    foo = nil
    if foo != nil {
        return foo!
    }else{
        print("warn")
        return nil
    }
}

guard

func test() -> Int? {
    var foo:Int?
    foo = nil
    guard let bar = foo else {
        print("warn")
        return nil
    }
    return bar
}

furuya02.hatenablog.com