Raspberry Pi で Arduino のスケッチを書き込む

Raspbian の設定

arduino

# apt-get install arduino

python-pip

# apt-get install python-pip -y

platformio

# pip install platformio

プロジェクトを作成します

$ mkdir arduino-led
$ cd arduino-led
$ platformio init --board=uno

platformio.ini の最後に次の記述を追記します

upload_port=/dev/ttyACM0

ソースコードを記述します

#define LED_PIN (13)
void setup() {
    pinMode(LED_PIN, OUTPUT);
}
void loop() {
    digitalWrite(LED_PIN, HIGH);
    delay(5000);
    digitalWrite(LED_PIN, LOW);
    delay(5000);
}

ビルドと実行

$ platformio run --target=upload

GitHub

Apple社のMobile Device Management用のベンダー証明書の発行手順

概要

MDM証明書要求の手順

RSAの鍵ペアの生成

最初にRSAの公開鍵と秘密鍵のペアを生成します。 秘密鍵はプッシュ通信を行う時に使用するため、生成した秘密鍵は厳重に保管します。

証明書署名要求(Certificataion Signing Request)の生成

Apple社のMDM証明書のCSRは独自のフォーマット(plist)で生成する必要があります。

1. 証明書署名要求の生成

証明書署名要求をRSA秘密鍵SHA1を使って署名したバイナリイメージをBase64で変換した文字列を生成します。

2. 証明書チェーンの生成

以下のPEM形式の証明書ファイルを結合します。

3. 証明書署名要求のバイナリを署名

証明書署名要求のバイナリをMDMベンダー証明書のRSA秘密鍵SHA1を使って署名したバイナリイメージをBase64で変換した文字列を生成します。

前述の手順で作成したイメージを元に、plistイメージの生成

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Inc//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>PushCertRequestCSR</key>
<string>
証明書署名要求(*1)
</string>
<key>PushCertCertificateChain</key>
<string>
証明書チェーン(*2)
</string>
<key>PushCertSignature</key>
<string>
署名した証明書署名要求(*3)
</string>
</dict>
</plist>

plistイメージをBase64エンコード

plistイメージをBase64エンコードしたイメージをファイルに出力して、Apple Push Certificates Portalにアップロードします。

Apple社からMDM証明書をダウンロードする

Apple社にアップロードした後、MDM証明書のダウンロードボタンが有効となります。 ダウンロードされるMDM証明書はPEM形式のテキストファイルです。

github.com

Spring Boot の auto-configuration の作り方

バージョン情報

  • Spring Boot 1.4.2.RELEASE

作り方

auto-configuration の作成方法は、リファレンスの 43. Creating your own auto-configuration に書かれています。

リファレンスの説明にある通り、spring-boot-autoconfigure と spring-boot-starter の2つのモジュールを作成することが推奨されていますが、 spring-boot-starter だけにすることもできると書かれていますので、GitHub に demo-spring-boot-starter を作成して試してみました。

demo-spring-boot-starter に DemoAutoConfiguration クラスを作成し、META-INF/spring.factories を次の内容で作成しています。

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
jp.pigumer.boot.autoconfigure.DemoAutoConfiguration

JAXB の Marshaller

JAXB の marshal 時に XML 宣言を生成しないようにする

Java SE 6の Javadoc にも記述されていますが、 XML 宣言を出力したくない場合は、プロパティ jaxb.fragment の値を true にします。

jp.pigumer.Data

package jp.pigumer;

import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement
public class Data {

    @XmlElement
    public String elem1;

    @XmlElement
    public String elem2;

}

jp.pigumer.JAXBTest

package jp.pigumer;

import org.junit.Before;
import org.junit.Test;

import javax.xml.bind.*;
import java.io.IOException;
import java.io.StringWriter;

import static org.junit.Assert.*;
import static org.hamcrest.CoreMatchers.*;

public class JAXBTest {

    Marshaller marshaller;

    Data sut;

    @Before
    public void setUp() throws JAXBException {
        sut = new Data();
        sut.elem1 = "test1";
        sut.elem2 = "test2";

        JAXBContext context = JAXBContext.newInstance(Data.class);
        marshaller = context.createMarshaller();
    }

    @Test
    public void defaultMarshallerTest() throws JAXBException, IOException {
        String out;
        try (StringWriter wr = new StringWriter()) {
            marshaller.marshal(sut, wr);
            out = wr.toString();
        }
        assertThat(out, is(not(nullValue())));
        System.out.println("default: " + out);
    }

    @Test
    public void fragmentMarshallerTest() throws JAXBException, IOException {
        marshaller.setProperty(Marshaller.JAXB_FRAGMENT, true);

        String out;
        try (StringWriter wr = new StringWriter()) {
            marshaller.marshal(sut, wr);
            out = wr.toString();
        }
        assertThat(out, is(not(nullValue())));
        System.out.println("fragment: " + out);
    }
}

実行結果

fragment: <data><elem1>test1</elem1><elem2>test2</elem2></data>
default: <?xml version="1.0" encoding="UTF-8" standalone="yes"?><data><elem1>test1</elem1><elem2>test2</elem2></data>

Spring Boot 1.4.1 - Controller

Controller

Thymeleaf については次のリンクを参照してください。

http://www.thymeleaf.org/doc/tutorials/2.1/usingthymeleaf_ja.html

Thymeleaf を Spring Boot で使えるようにするために、build.gradle の dependencies に次の行を追加します。

 compile('org.springframework.boot:spring-boot-starter-thymeleaf')

1. Index

PROJECT_ROOT/src/main/resources/templates/index.html を作成します。

<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:th="http://www.thymeleaf.org">
  <head>
    <meta charset="UTF-8"/>
    <title th:text="#{title}">TITLE</title>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
  </head>
  <body>
    <p th:text="#{welcome}">WELCOME</p>
  </body>
</html>

PROJECT_ROOT/src/main/resources/messages.properties を作成します。

title=title
welcome=Welcome!!

コントローラを作成します。

package com.example;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;

@Controller
public class IndexController {

    @GetMapping("/")
    public String index() {
        return "index";
    }

}

コントローラのメソッドが返す文字列に .html を付加した templates ディレクトリにあるファイルを Thymeleaf のテンプレートとして使用して、HTML をブラウザに返します。

./gradlew bootRun

で起動して、ブラウザで http://localhost:8080 にアクセスした画面は下のようになります。

f:id:section27:20161025222402p:plain

2. ロケール

デフォルトでは、org.springframework.web.servlet.i18n.AcceptHeaderLocaleResolver を使用して、ブラウザから送られる accept-language を使用したロケールでメッセージが表示されます。

org.springframework.web.servlet.i18n.CookieLocaleResolver, org.springframework.web.servlet.i18n.SessionLocaleResolver, org.springframework.web.servlet.i18n.FixedLocaleResolver を使用した、クッキー、セッション、固定といったあらかじめ用意された LocaleResolver を使用することもできます。

ここでは独自の LocaleResolver を作成して日本語(osaka_JP)になるようにしてみます。

package com.example;

import org.springframework.web.servlet.LocaleResolver;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Locale;

public class OsakaLocaleResolver implements LocaleResolver {

    @Override
    public Locale resolveLocale(HttpServletRequest request) {
        return new Locale("osaka", "JP");
    }

    @Override
    public void setLocale(HttpServletRequest request, 
            HttpServletResponse response,
            Locale locale) {
        throw new UnsupportedOperationException("unsupported");
    }
}
package com.example;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;

@SpringBootApplication
public class DemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }

    @Bean
    OsakaLocaleResolver localeResolver() {
        return new OsakaLocaleResolver();
    }
}

PROJECT_ROOT/src/main/resources/messages_osaka.properties を作成します。

title=タイトル
welcome=大阪にようこそ

実行して、http://localhost:8080 にアクセスしてみます。

./gradlew bootRun

f:id:section27:20161025222418p:plain