Raspberry Pi で Arduino のスケッチを書き込む
マルツのArduino互換ボード Maruduino UNO R3【MABTB-UNO-R3】
- ジャンル: おもちゃ・ホビー・ゲーム > おもちゃ > 知育玩具 > その他
- ショップ: マルツオンライン
- 価格: 2,220円
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
Apple社のMobile Device Management用のベンダー証明書の発行手順
概要
MDM証明書要求の手順
RSAの鍵ペアの生成
最初にRSAの公開鍵と秘密鍵のペアを生成します。 秘密鍵はプッシュ通信を行う時に使用するため、生成した秘密鍵は厳重に保管します。
証明書署名要求(Certificataion Signing Request)の生成
Apple社のMDM証明書のCSRは独自のフォーマット(plist)で生成する必要があります。
1. 証明書署名要求の生成
証明書署名要求をRSAの秘密鍵でSHA1を使って署名したバイナリイメージをBase64で変換した文字列を生成します。
2. 証明書チェーンの生成
以下のPEM形式の証明書ファイルを結合します。
- MDMベンダーの証明書
- Apple社のWWDR中間証明書
- Apple社のルート証明書
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形式のテキストファイルです。
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>
Gradle の compile で OutOfMemoryError が発生したときにしたこと
stackoverflow の記事を参考に、gradle.build に下のような記述を追加して対応しました。
compileJava { options.fork = true options.forkOptions.setMemoryMaximumSize("4g") }
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 にアクセスした画面は下のようになります。
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