投稿日:2016年05月01日

0.環境

[OS] Mac OS X 10.11.4
[IDE] Xcode 7.2.1
[watchOS] 2.1
[Swift] 2.1.1

1.完成イメージ

  • メイン画面からサブ画面へ行って戻るサンプルを作成します。

    完成イメージ

2.プロジェクト作成

  • Xcodeのスプラッシュ画面で"Create a new Xcode project"を選択。

    スプラッシュ画面

  • watchOS Applicationを選択。

    テンプレート選択

  • 適当なプロジェクト名を入力して下さい。

    サンプルなので"Notification"と"Glance"のチェックは外します。

    オプション選択

  • プロジェクトを作成するフォルダを選択して下さい。

    下記のように /app/ を指定するとプロジェクトのパスは /app/hello-watch/ になります。

    フォルダ選択

3.実装

  • 左のプロジェクトナビゲーターで"Interface.storyboard"を選択。(A-1)

    デフォルトで用意されている Interface Controller を選択して、Identifier に適当な値(例ではIC1)を入力。 (A-2、A-3、A-4)

    ドラッグ&ドロップで Label と Button を Interface Controller 上に配置します。 (A-5)

    コントローラ準備

  • ドラッグ&ドロップで Interface Controller をもう一つ追加。(B-1)

    追加した方を選択し、Identifier に適当な値(例ではIC2)を入力。 (B-2、B-3)

    コントローラ準備

  • 上記のIC2に Label を配置し、IC2と入力しておきます。

    区別するため、IC1に配置した Label にはIC1と入力します。

    コントローラ準備

  • アシスタントエディターを表示します。(C-1)

    Button を右クリックし、[Sent Actions]-[selector] からドラッグ&ドロップでエディターまで線を伸ばします。(C-2)

    実装1

  • 適当なメソッド名を入力します。

    実装2

  • Button タップ時に呼ばれるメソッドが追加されました。(D-1、D-2)

    実装3

  • 上記で追加したメソッドにIC2へ遷移するコードを記述します。

    (IC1へ戻るリンクは自動で作成されます)

    @IBAction func onPushButton() {
        pushControllerWithName("IC2", context: "some messages")
    }
    
  • シュミレーターで Apple Watch を選択し、[Command]-[R]キーを押すと数十秒後にプログラムが実行されます。

    実行

参考ページ

投稿日:2016年04月20日

0.環境

[OS] Mac OS X 10.11.4
[cocoapods] 1.0.0.beta.6

1.エラー内容

  • pod setupを実行すると下記エラーが発生。

    $ pod setup --verbose
    
    Setting up CocoaPods master repo
    
    Cloning spec repo `master` from `https://github.com/CocoaPods/Specs.git` (branch `master`)
      $ /usr/bin/git clone https://github.com/CocoaPods/Specs.git master
      Cloning into 'master'...
      fatal: unable to access 'https://github.com/CocoaPods/Specs.git/': SSLRead() return error -9806
    [!] /usr/bin/git clone https://github.com/CocoaPods/Specs.git master
    
    Cloning into 'master'...
    fatal: unable to access 'https://github.com/CocoaPods/Specs.git/': SSLRead() return error -9806
    
            :
         【省略】
            :
    

2.解決方法

  • Safariで下記URLにアクセス。(他のブラウザではダメ)

    https://github.com

  • 再度、下記を実行するとwifi経由で1時間以上経ってからようやく成功…

    $ pod setup --verbose
    
    Setting up CocoaPods master repo
    
            :
         【省略】
            :
    
    Setup completed
    

参考ページ

投稿日:2016年02月20日

0.環境

[CentOS] 6.4 (64bit版カーネル)
[Apache] 2.2.15
[Firefox] 44.0.2

1.メールで期限通知 (【】はマスク情報)

  • 年末に設定した Let's Encrypt のSSL証明書の期限が迫り、下記のお知らせメールが届きました。

    Let's Encrypt certificate expiration notice
    
    Hello,
    
    Your certificate (or certificates) for the names listed below will expire in 17 days (on 04 Mar 16 17:44 +0000). Please make sure to renew your certificate before then, or visitors to your website will encounter errors.
    
    【以下省略】
    
  • ブラウザで有効期限を確認するとそろそろ切れそうです。

    ブラウザのアドレスバーの鍵マークをクリックし、[ > ] - [詳細を表示] - [セキュリティ] - [証明書を表示] - [有効期限]

    SSL証明書更新前

2.更新作業

  • 公式マニュアルにそってやってみました。(参考ページ①)

    letsencrypt をインストールしたディレクトリに移動し、下記のコマンドを実行。

    (letsencrypt と letsencrypt-auto コマンドは互換性があるとのことなので、初回セットアップで使ったletsencrypt-autoを指定)

    (ディレクトリを忘れた場合はlocate letsencrypt-autoなどで確認)

    # cd /usr/local/src/letsencrypt/
    #
    # ./letsencrypt-auto renew
    

    1分ほど待って下記メッセージが表示されました。成功したようです。

    # ./letsencrypt-auto renew
    Updating letsencrypt and virtual environment dependencies...You are using pip version 7.1.2, however version 8.0.2 is available.
    You should consider upgrading via the 'pip install --upgrade pip' command.
    ....
    Running with virtualenv: 【ディレクトリパス】 renew
    Processing 【ディレクトリパス】
    new certificate deployed without reload, fullchain is 【ディレクトリパス】/fullchain.pem
    
    Congratulations, all renewals succeeded. The following certs have been renewed:
      【ディレクトリパス】/fullchain.pem (success)
    
  • ブラウザをリロードしたり、再起動しても証明書の有効期限は変わらず。

  • 公式マニュアルにはありませんが、Webサーバーの再起動が必要なようです。(参考ページ②)

    # service httpd restart
    
  • Webサーバーを再起動するとブラウザ側の有効期限も延長されました。

    SSL証明書更新後

  • Cronで証明書の自動更新を設定しようかと思いましたが、成功/失敗の取り方がよく分からないので、また別の機会にします。。。(参考ページ③)

参考ページ

投稿日:2016年02月14日

環境

[CentOS] 5.6

セットアップ (文中の【】はマスク)

  • 下記記事の「リモートサーバでの実行」にそってRundeckのリモート接続を試してみました。

    ジョブスケジューラ「Rundeck」を試してみる

    下記のエラーが出るが原因が分からず…

    RundeckSSHエラー

    22:34:10 remote 1. hogeと表示。 Authentication failure connecting to node: "remote". Make sure your resource definitions and credentials are up to date.
    22:34:10 Failed: AuthenticationFailure: Authentication failure connecting to node: "remote". Make sure your resource definitions and credentials are up to date.
    22:34:10 localhost Execution failed: 21: [Workflow result: , step failures: {1=Dispatch failed on 1 nodes: [remote: AuthenticationFailure: Authentication failure connecting to node: "remote". Make sure your resource definitions and credentials are up to date.]}, Node failures: {remote=[AuthenticationFailure: Authentication failure connecting to node: "remote". Make sure your resource definitions and credentials are up to date.]}, status: failed]
    
  • Log levelを"Debug"にして調査。

    Rundeckの対象のプロジェクトで[Prepare and Run...]-[Log level] を"Debug"に変更し、エラーの詳細を表示します。

  • エラー詳細を見ると、まず公開鍵認証を試みて失敗して、さらにその後パスワード認証でも失敗しているようです。

    22:37:48 Authentications that can continue: publickey,password,keyboard-interactive
    22:37:48 Next authentication method: publickey
    22:37:48 Authentications that can continue: password,keyboard-interactive
    22:37:48 Next authentication method: password
    22:37:48 Disconnecting from 【IPアドレス】 port 22
    22:37:48 Authentication failure connecting to node: "remote". Make sure your resource definitions and credentials are up to date.
    22:37:48 Failed: AuthenticationFailure: Authentication failure connecting to node: "remote". Make sure your resource definitions and credentials are up to date.
    

    おかしいなあ、そもそも公開鍵認証で接続できる想定なんだけど…

  • Rundeck以前にそもそもsshで失敗しているようなので、ssh単体で実行してみます。

    # ssh -i $(awk '/framework.ssh.keypath = / {print $3}' /etc/rundeck/framework.properties) rundeck@【IPアドレス】
    
  • さらにコマンドを簡素化して実行してみると、パスワードを設定していない公開鍵使っているのになぜかパスワードを聞かれます。

    [22:16:34][rundeck@【サーバー名】 ~/.ssh]$ ssh -i /var/lib/rundeck/.ssh/id_rsa rundeck@【IPアドレス】
    rundeck@【IPアドレス】's password: 
    Permission denied, please try again.
    rundeck@【IPアドレス】's password: 
    Permission denied, please try again.
    rundeck@【IPアドレス】's password: 
    Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).
    
  • 色々試した結果、接続先サーバーの公開鍵ファイルのパーミッションが原因でした。

    • 接続元

      ssh -i /var/lib/rundeck/.ssh/id_rsa rundeck@【IPアドレス】
      
    • 接続先

      パーミッションが緩い分には問題ないだろうと思っていたら、厳密に600じゃないとダメなんですね。。。

      chmod 600 authorized_keys で下記のように修正したらssh接続もRundeckからのリモート接続も成功しました。

      (変更前)

      -rw-rw-r--. 1 rundeck rundeck 403 2月 4 15:58 2016 authorized_keys
      

      (変更後)

      -rw-------. 1 rundeck rundeck 403 2月 4 15:58 2016 authorized_keys
      

参考になった記事

投稿日:2016年02月07日

環境

[Android SDK]  API 21: Android 5.0(Lollipop)

実装

  • スマートウォッチ(Android Wear)に通知を送るため、NotificationCompat.Builder の

    setVibrateメソッドを使った際の自分用メモ。

    バイブレーション・パターンの設定は下記仕様ですが、

    long型配列の1つ目の要素を除いて、偶数は振動、奇数は休止

    と覚えておけば良さそうです。

    NotificationCompat.Builder builder = new NotificationCompat.Builder( getApplicationContext() );
    
    // 単位はミリ秒
    // 
    // 要素1 : 振動開始までの時間
    // 要素2 : 振動
    // 要素3 : 休止
    // 要素4 : (これ以降は要素2-3の繰り返し)
    builder.setVibrate(new long[]{0, 500, 250, 500, 250, 1000});
    

    下記の例だと、ツー・ツ・ツ みたいな感じになります。

    // 1秒振動、0.1秒休止、0.1秒振動、0.05秒休止、0.1秒振動
    builder.setVibrate(new long[]{0, 1000, 100, 100, 50, 100});
    

関連リンク

【免責事項】

本ブログのご利用につき、何らかのトラブルや損失・損害等につきましては一切責任を問わないものとします。