Androidのメモとか

ポキオの日記です。今日も遅延してない。

リクルートのAIを無料で使えるA3RTをつかってツイートにしつこくリプライしてくれるBOTを作ってみた

ぼっちでも寂しくない。

前回はGASでA3RTを触りました

relativelayout.hatenablog.com

折角なので何か作ろうと思い、TwitterBOTを作ってみました。具体的には、自分がつぶやいた内容に関して、しつこく合いの手を入れてくれるBOTです(笑)

いざ実装

とはいえ、ウェッブなエンジニアリングが苦手なので、今回もIFTTT様に頼って行きていこうと決めました。

A3RT GAS IFTTT

  1. つぶやく
  2. IFTTT経由でTwitterをトリガーにGASで作ったWebAPIを叩く
  3. GASからA3RTのTalk APIを叩いて、リプライ文言を作成
  4. IFTTT経由でリプライ専用アカウントからつぶやく

GASからTwetterを直接叩けばいいじゃんっていうツッコミはなしで。最初はこんな感じで実装してたのですが、IFTTTからGASにWebhookをなげるところが上手く行かなかったので、Google DriveのSpreadsheetを介して、Twetter⇒GASにツイート情報を渡しています・・・。

A3RT GAS IFTTT

うん、これは酷い。とりあえず動くことを確認したかったので、お許し下さい。

どんな感じに動くのか

クソコードは長くなるので、後ほど。

A3RT GAS IFTTT

「会社行きたくないな」ってつぶやくと、数分後に心配してくれるリプライをくれます(笑)

A3RT GAS IFTTT

たまに会話が噛み合わないこともありますが、ネットストーキングの如く、必ずリプライをくれます。

A3RT GAS IFTTT

気づくとこんな感じに。

クソコードはこちら

IFTTTでTwitter⇒Driveに情報を渡すと、リツイートやメンションも渡してしまうので、GASでそれらのツイートは無視するようにしています。下記のloop()を定期実行しています。

var url = "https://api.a3rt.recruit-tech.co.jp/talk/v1/smalltalk";
var apikey = "xxxxx";
var iftttUrl = "https://maker.ifttt.com/trigger/xxx/with/key/xxx";
var sheetId = "xxx";
var sheetName = "xxx";

function loop(){
  if(!isSheetDataAvailable()){
    Logger.log("no data");
    return;
  }
  
  var lastTweet = getSheetData();
  Logger.log(lastTweet);
  clearSheetData();
  
  if(lastTweet.lastIndexOf('RT', 0) == 0){
    Logger.log("ignoring retweet");
    return;
  }
  
  if(lastTweet.lastIndexOf('@', 0) == 0){
    Logger.log("ignoring mention");
    return;
  }
  
  var message = ask(lastTweet);
  Logger.log(message);
  
  triggerIfttt("@pokiiio " + message);
}

function ask(message){
  var payload =
      {
        "apikey" : apikey,
        "query" : message
      };
  
  var options =
      {
        "method" : "post",
        "payload" : payload
      };
  
  var response =  UrlFetchApp.fetch(url, options);  
  var result = JSON.parse(response.getContentText())["results"][0]["reply"];
  
  return result;
}

function isSheetDataAvailable(){
  var spreadsheet = SpreadsheetApp.openById(sheetId);
  var sheet = spreadsheet.getSheetByName(sheetName);
  var maxRow = sheet.getLastRow();
  
  return maxRow > 0;
}

function getSheetData(){
  var spreadsheet = SpreadsheetApp.openById(sheetId);
  var sheet = spreadsheet.getSheetByName(sheetName);
  var data = sheet.getSheetValues(1, 1, 1, sheet.getLastColumn()); 
  return data[0][0];
}

function clearSheetData(){
  var spreadsheet = SpreadsheetApp.openById(sheetId);
  var sheet = spreadsheet.getSheetByName(sheetName);
  sheet.clear();
}

function triggerIfttt(message){
  var payload =
      {
        "value1" : message
      };
  
  var options =
      {
        "method" : "post",
        "payload" : payload
      };
  
  UrlFetchApp.fetch(iftttUrl, options);
}

リクルートのAIを無料で使えるA3RTをGASから触ってみる

久々のGAS案件。

A3RTとは?

まぁ、このあたりを見てください。

a3rt.recruit-tech.co.jp

bita.jp

リクルートのAIであるA3RT、今回一般人にも無料で公開されたことで、夢が広がる結果となりました。

A3RT(アート)は「ANALYTICS & ARTIFICIAL INTELLIGENCE API VIA RECRUIT TECHNOLOGIES」の略称です。

公開されたのは、以下の6つのAPI

今回は、その中からTalk APIを使ってみました。

Talk APIとは

Talk APIはChatbotを作成するためのAPIです。 Recurrent Neural Network(LSTM)を用いた入力文からの応答文生成による日常会話応答機能を提供します。 Talk APIを活用したChatbotによって様々なアプリケーション上でユーザとの対話を自動化し、 どのようなタイミングにおいても即座にユーザからの問いかけに対して応答することができます。

友達がいない僕でも、話し相手になってくれそう。とりあえず使ってみようと思います。ただ使うのは芸がないので、GASからA3RTを叩いてみます。

API KEYさえあれば実装は簡単

とはいえ、APIを使うこと自体は本当に簡単。A3RTのページからAPI KEYを取得して、Endpoint URLにAPI KEYと単語をPOSTするだけ。レスポンスもJSONで返ってきます。クソコードはこんな感じ。メソッドを分けているのは、今後の伸びしろのため(笑)

var url = "https://api.a3rt.recruit-tech.co.jp/talk/v1/smalltalk";
var apikey = "xxxxx";

function myFunction() {
  ask("痩せたい");
}

function ask(message){
  var payload =
      {
        "apikey" : apikey,
        "query" : message
      };
  
  var options =
      {
        "method" : "post",
        "payload" : payload
      };
  
  var response =  UrlFetchApp.fetch(url, options);
  var result = JSON.parse(response.getContentText())["results"][0]["reply"];
  Logger.log(result);
}

痩せたいとつぶやいてみます。

A3RT GAS

「今のままで十分魅力的ですよ」だってさ(笑)

こいつ、ヤルジャン(笑)

あっけなくAPIを使うことができした。 他のサービスと組み合わせれば、かなり夢が広がりそうです。

追記

「夢はなんですか?」「ありません」

「何歳ですか?」「トップシークレットです」

「会社に行きたくないです」「どうしたんですか?」

「旅に出たいです」「旅行はいいですね」

「一緒に温泉に行きませんか?」「ご一緒してみます」

「箱根はどうですか?」「あなたはよくするんですか?」

え・・・

KiCadを使って基板(ポキオ基板)を作ってみたんだけどちょっと失敗した

ポキオ基板の爆誕

ポキオ基板

以前参加した勉強会で刺激を受けた

relativelayout.hatenablog.com

思った以上に、基板を作る(設計する)ことは簡単。そして、設計する環境であったり、基板作成を発注できる業者も沢山あって、かなり安価でした。これはもう、基板を作るしか無いと思い、今回は基板を作ってみました。

まずはKiCadで基板の設計

とはいえ、回路とかちょっとよくわからないし、キルヒホッフの法則とか大学の頃やったっきりで、よくわからなかったので、電池とLEDとスイッチと抵抗を繋ぐだけでの、簡単なLチカ回路を設計してみました。

ポキオ基板

ただ、普通に作るだけだと芸がないので・・・

  • 配線で京浜急行の路線図をつくった
  • 品川駅がLED、三崎口駅がスイッチにした
  • 羽田空港ボタン電池、我らが金沢文庫駅には抵抗を配置した
  • 大師線は本線と直通運転することはあまりないので、配線が途切れている(裏のレイヤーを介して電気的につながっている)
  • 裏面にはポキオ感を全面に出していきたい(名前と、Twitter垢、Blog URLを描いた)

こんな感じで、無駄にこだわってみました。

ポキオ基板

3D表示の図。ポキオ感ある。

スイッチサイエンスさんに基板発注

中国の業者に直接発注すれば安く済むものの、初めての基板発注だったので、チキってスイッチサイエンスさんに依頼しました。

ポキオ基板

諸々込で2500円位。赤い基板も無料で指定できて、無駄に10枚、同じ基板を作成してくれます。

ポキオ基板

基板のデータをアップロードすると、プレビュー表示してくれるんですが、なんか欠けて表示されてます・・・大丈夫かな・・・。(結果的には問題なく基板が出来上がりました)

約2週間で到着

4月2日に注文、ものが届いたのが4月18日。大体2週間。

ポキオ基板

スイッチサイエンスさんのオサレな箱で到着。ネコポスでの発送でした。

ポキオ基板

中を開けると、真っ赤な基板が!テンションアガる!

パーツを実装していきます

ポキオ基板

基板上の印字もちゃんと書かれています。基板の四隅のカーブも綺麗です。

ポキオ基板

で、まぁテキトーにパーツを半田付けしてみたんですが・・・

ポキオ基板

なぜか電池ボックスの足と、基板の穴の位置がずれていて、ちゃんとハマりませんでした・・・。むりやり足を曲げて半田付けします(笑)

ポキオ基板

スイッチを押すと・・・ピカーン!とりあえず、動作は問題なさそう!

というわけで

初めての基板作成でしたが、

  • 発注する前に、パーツを買っておく
  • 発注する前に、設計した基板をプリントアウトして、パーツがちゃんとハマるか確認する
  • 納期はそれなりにかかるので、覚悟しておく
  • 中国に直接発注すればもっと安くできる(スイッチサイエンスさんも、SeesdStudioに発注していた模様)

このあたりが、今回の反省点。 ポキオ基板Ver2にも乞うご期待(笑)

いまさらだけどKotlinでAndroidアプリを書いてみる

社内外のAndroidエンジニアが絶賛しているKotlin。このビッグウェーブに乗り遅れないために、ちょっと触ってみました。

参考

kotlinlang.org

本家サイトを参照しました。

環境構築

First, if using Android Studio, you’ll need to install the Kotlin plugin. Go to File | Settings | Plugins | Install JetBrains plugin… and then search for and install Kotlin. You’ll need to restart the IDE after this completes.

Android Kotlin

まずは、Kotlinのプラグインをインストール。ちょっと時間がかかる。インストールしたらAndroid Studioを再起動する。

Android Kotlin

起動完了。

コーディング開始

It’s extremely easy to start using Kotlin for Android development!

はい。

First let’s create a new project.

とりあえず、プロジェクトを作ります。

Open MainActivity.java file. Then invoke action Convert Java File to Kotlin File.

MainActivity.javaをKotlinに変換します。すると、MainActivity.ktに変換されます。

Android Kotlin

kotlin convertで検索すると、簡単にアクセスできます。ワンクリックで変換可能。

Android Kotlin

こんにちは、Kotlin。

Android Kotlin

エラー

なぜかビルド時にエラー。

Android Kotlin

Error:Failed to resolve: org.jetbrains.kotlin:kotlin-stdlib-jre7:1.0.7

こちらは、Kotlinのバージョンを1.1.1にしたら解決。

Android Kotlin

無事にビルトができました。

ちょっと書き足してみる

ボタンが押されたらTextViewの文字が変わるというクソ実装。

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
    }

    override fun onResume() {
        super.onResume()

        val button = findViewById(R.id.button) as Button
        val textView = findViewById(R.id.textview) as TextView

        button.setOnClickListener { textView.setText("Button is clicked!") }
    }
}

Javaに比べて、かなりシンプルに書けます。

Android Kotlin

無事にビルドも通り、動作も問題なさそうです。

サマリ

かなりJavaとは違った文法ですが、Kotlinは安心と信頼のJetBrains製。Android Studioとの親和性は問題なさそうです。コーディングもかなりシンプルになり、一度慣れてしまえば病みつきになりそうです。Swiftとの親和性もあるとのことなので、いざと慣ればiOSのプログラミングにも対応できそう・・・!?

ダァ弐号のバグフィックス

前回まで。

relativelayout.hatenablog.com

京急 遅延 ESP8266

最近、ちょっとだけバグフィックスしたのでメモ。

バグフィックス①:運休に対応

京急 遅延 ESP8266

レアな運行情報として、遅延はしないが運休があるパターンが有ったので、その場合は遅延と同じく黄色い点滅をさせるようにした。

バグフィックス②:光り方を増やす

遅延と大幅な乱れは区別がつきそうなので、遅延は黄色い点滅、大幅な乱れは黄色と赤の点滅に変更。

クソコードはこちら

#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <Adafruit_NeoPixel.h>

char ssid[] = "xxx";
char password[] = "yyy";

char unkopage[] = "unkou.keikyu.co.jp";
int intervalSec = 10 * 60;

#define PIN 4
#define NUMLED 4

Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMLED, PIN, NEO_RGB + NEO_KHZ800);


void setup() {
  Serial.begin(115200);
  Serial.println("");

  pixels.begin();
  pixels.setBrightness(60);
}

void loop() {
  connectWifi();
  String result = getPageSource();
  Serial.println(result);
  disconnectWifi();

  if (result.indexOf("受託") > 0) {
    Serial.println("振替輸送受託!");
    ledExtreme(intervalSec);
    return;
  }

  if (result.indexOf("見合わせ") > 0) {
    Serial.println("運転見合わせ!");
    ledStopped(intervalSec);
    return;
  }

  if (result.indexOf("乱れ") > 0) {
    Serial.println("大幅に乱れている!");
    ledBad(intervalSec);
    return;
  }

  if (result.indexOf("遅れ") > 0 || result.indexOf("運休") > 0) {
    Serial.println("遅延!");
    ledDelayed(intervalSec);
    return;
  }

  Serial.println("たぶん平常通り運転!");
  delay(intervalSec * 1000);
  return;
}

void connectWifi() {
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {
    Serial.print(".");
    ledConnecting(3);
  }

  Serial.println("connected!");
}

void disconnectWifi() {
  WiFi.disconnect();
  Serial.println("disconnected!");
}

String getPageSource() {
  WiFiClient client;

  if ( !client.connect(unkopage, 80) ) {
    return String("");
  }

  client.print(String("GET ") + "/" + " HTTP/1.1\r\n" +
               "Host: " + unkopage + "\r\n" +
               "Range: bytes=8000-9000\r\n" +
               "Connection: close\r\n\r\n");
  client.println();

  delay(1000);

  String body = "";
  String unko = "<!-- ======================== 運行情報 =================================== -->";

  while (client.available()) {
    body += client.readStringUntil('\r');
  }

  body = body.substring(body.indexOf(unko) + unko.length());
  body = body.substring(0, body.indexOf(unko));

  return body;
}

// 白い点滅
void ledConnecting(int sec) {
  int count = 0;

  while (count < sec) {
    for (int i = 0; i < 256; i += 5) {
      setColor( i, i, i);
    }

    for (int i = 255; i >= 0; i -= 5) {
      setColor( i, i, i);
    }

    count++;
  }
}

// 黄色い点滅
void ledDelayed(int sec) {
  int count = 0;

  while (count < sec) {
    for (int i = 0; i < 256; i += 5) {
      setColor( i, i, 0);
    }

    for (int i = 255; i >= 0; i -= 5) {
      setColor( i, i, 0);
    }

    count++;
  }
}

// 黄色と赤の点滅
void ledBad(int sec) {
  int count = 0;

  while (count < sec) {
    for (int i = 0; i < 256; i += 5) {
      setColor( i, 0, 0);
    }

    for (int i = 255; i >= 0; i -= 5) {
      setColor( i, 0, 0);
    }

    for (int i = 0; i < 256; i += 5) {
      setColor( i, i, 0);
    }

    for (int i = 255; i >= 0; i -= 5) {
      setColor( i, i, 0);
    }

    count++;
    count++;
  }
}

// 赤い点滅
void ledStopped(int sec) {
  int count = 0;

  while (count < sec) {
    for (int i = 0; i < 256; i += 5) {
      setColor( i, 0, 0);
    }

    for (int i = 255; i >= 0; i -= 5) {
      setColor( i, 0, 0);
    }

    count++;
  }
}

// パリピ
void ledExtreme(int sec) {
  int count = 0;

  while (count < sec) {

    for (int i = 0; i < 20; i++) {
      setRandomColor();
      delay(50);
    }

    count++;
  }
}

void setColor(int r, int g, int b) {
  for (int i = 0 ; i < NUMLED; i++) {
    pixels.setPixelColor(i, pixels.Color(r, g, b));
    pixels.show();
  }
  delay(10);
}

void setRandomColor() {
  for (int i = 0 ; i < NUMLED; i++) {
    pixels.setPixelColor(i, pixels.Color(64 * random(1, 5) - 1 , 64 * random(1, 5) - 1 , 64 * random(1, 5) - 1 ));
    pixels.show();
  }
  delay(10);
}

IoT縛りの勉強会! IoTLT vol.26 @ 日本オラクルに行ってきました

未来が溢れていた。

IoT縛りの勉強会! IoTLT vol.26 @ 日本オラクル

今回は日本オラクルさんで開催

iotlt.connpass.com

大人の街、青山。そのにそびえ立つオラクルさんのビルで開催。ビルの1Fにはレクサス、道の反対側にはテスラ。なんだこのラグジュアリー感。

ビルの中は非常にオラクル感にあふれていました。

はい、そうですね()

IoT縛りの勉強会! IoTLT vol.26 @ 日本オラクル

ひろいセミナールームでした。

LT開始

今回も中々面白いLTばかりでした。特に個人的に印象的だったLTをメモしておきます。(敬称略)

田中 正吾 HoloLensでIoT制御してみて感じる未来

IoT縛りの勉強会! IoTLT vol.26 @ 日本オラクル

HoloLensとIoTって言われても最初はピンと来ませんでしたが、これは可能性に満ち溢れているような気がしました。Mixed Reality上にスイッチを配置して、それをON/OFFすると、NeflyやDALI照明をコントロールするというもの。なんかここまできたら、家中のデバイスをHoloLensをつかってコントロールしたくなりますね。それと、家中にセンサーを配置して、その情報をHoloLens上に表示する。自宅警備員が捗りそうです(笑)

松岡 光隆 元汎用機エンジニアが語るIoT~そしてチャラ電結成?最後にHULFT IoTも

IoT縛りの勉強会! IoTLT vol.26 @ 日本オラクル

ギャル電に続き、チャラ電。IoTLTからさらなるユニットが誕生する予感!今後の活動に期待ですね!やっぱり光り物系ガジェットで勝負するのでしょうか?(笑)

うこ ギャル電コラボ・派手イケなディスプレイ付きIoTキャップをつくって渋谷に行ってきた

IoT縛りの勉強会! IoTLT vol.26 @ 日本オラクル

RGB LED MATRIXをつかって、色んな画像をだしたり、TwitterTweetを動的に表示したりできるガジェット。見た目のインパクトは最強(笑)技術的にも、そこまで多くない配線でMATRIXパネルを制御できそうなのでちょっと試してみたいところ。

IoT縛りの勉強会! IoTLT vol.26 @ 日本オラクル

IoT縛りの勉強会! IoTLT vol.26 @ 日本オラクル

IoT縛りの勉強会! IoTLT vol.26 @ 日本オラクル

色んな表示パターンがある模様。京急バージョンも作って頂けたので装着。なんか八百屋さん感が漂うのは内緒。

しおげん at Webiot ついに日本でも始まったIoTネットワーク「Sigfox」で桜の満開情報を集めてみた

IoT縛りの勉強会! IoTLT vol.26 @ 日本オラクル

いまHOTな通信であるLPWA。その一つであるSigfoxをつかったガジェット。かなり低価格・低消費電力で通信ができるため、かなり注目です。

IoT縛りの勉強会! IoTLT vol.26 @ 日本オラクル

桜の開花状況をサーバーに送信するガジェット。このガジェットを木に下げておいて、花見客に何分咲きなのかをガジェットを操作してもらう感じ。あまり大きいデータをpayloadに入れられないという制限はあるそうですが、簡単なセンシングであればSigfoxでも十分使えそうです。

懇親会

IoT縛りの勉強会! IoTLT vol.26 @ 日本オラクル

はい、🍺。

IoT縛りの勉強会! IoTLT vol.26 @ 日本オラクル

未来感の有る方々。

こちらは武藤感。

Arduinoを自作してみよう!Kicadで始める基板設計ハンズオンに行ってきました

たーのしー

Arduinoを自作してみよう!Kicadで始める基板設計ハンズオン

初めての基板設計

基板を起こすというのも、中国の業者とかに発注すれば誰でも安価にできるようになったものの、なんかとっつきにくく食わず嫌いでいました。

dotstudio.connpass.com

そんな時に見つけた、良い勉強会。死ぬ前に基板を起こしてみたいので、死ぬ気で参加してきました。

場所は2k540 AKI-OKA ARTISAN内の秋葉原でふわっふわのパンケーキが楽しめるカフェ|Cafe ASAN(カフェ アサン)さん

Arduinoを自作してみよう!Kicadで始める基板設計ハンズオン

Arduinoを自作してみよう!Kicadで始める基板設計ハンズオン

www.jrtk.jp

ちょうど秋葉原御徒町の真ん中。JRのガード下に作られたオシャンでアートなエリア。そこにあるCafe ASANさんで開催。

Arduinoを自作してみよう!Kicadで始める基板設計ハンズオン

Arduinoを自作してみよう!Kicadで始める基板設計ハンズオン

店内にはハンモックもあり、かなりオシャンティー度が高く、居心地もいい感じ。後日改めて行ってみたいカフェです。

ハンズオン開始!

今回はハンズオン形式。ある程度設計できているファイルを頂き、それに設計やらを追加していくスタイルでした。

Arduinoを自作してみよう!Kicadで始める基板設計ハンズオン

Arduinoを自作してみよう!Kicadで始める基板設計ハンズオン

で、今回の勉強会で欠かせないソフトがKiCad。完全無料で、オープンソースのCADソフトです。ネット上の情報量も多く、機能も充実しているらしく、メジャーな無料CADソフトのひとつらしいです。

http://kicad-pcb.org/kicad-pcb.org

ちなみに、他にもフリーのCADソフトはいくつか有るようで、

  • Eagle
  • Design Spark Electrical
  • CADLUS X

こういうのもあるようです。ハンズオンの内容はかなり端折りますが、基本的にはこんな感じで基板を設計していきます。

  1. サイズ・機能を決める
  2. 必要な部品を決める
  3. 回路図を考える
  4. 配線図を考える

まぁ、何はともあれ、どんな基板を作りたいかを具体化する必要があります。また、基板を発注する際に、基板サイズによって値段が大きく変わるため、基板サイズも重要なファクターになってきます。逆に基板を小さくしすぎると、パーツのはんだ付けが厳しかったりするので、そのあたりの兼ね合いも重要そうです。また、部品も、表面実装なのか、普段見慣れてる足が生えているパーツなのかにもよって、必要なスペースやはんだ付け難易度が変わるので奥が深いです。

回路図・配線図がたーのしー

いやー、これが楽しいんですよね。

Arduinoを自作してみよう!Kicadで始める基板設計ハンズオン

まず、回路図を考えるわけですが、懐かしいオームの法則とかキルヒホッフの法則が蘇るような感じ。実装したいパーツを選んできては、シート上に配置して、結線をしていきます。あまり本質ではないですが、綺麗に回路図をかけたときとか、本当にゾクゾクします。

Arduinoを自作してみよう!Kicadで始める基板設計ハンズオン

次に、配線図。こちらはまさにピタゴラスイッチ的な感じ。何処に部品をおけば配線できるかとか、いかにスマートに配線するか、ショートしないか、などかなり頭を使う反面、こちらも綺麗にできたときの達成感は堪りません。

Arduinoを自作してみよう!Kicadで始める基板設計ハンズオン

Arduinoを自作してみよう!Kicadで始める基板設計ハンズオン

また、3D表示もできるので、実装後のイメージもつかみやすいし、なにより、これが無料でできるということにも感動します。

そういうことです。

意外と基板作成を発注しても安い!?

中国の業者に頼んでも$20くらいのオーダーでできるそうです。ちょっと試しに基盤作ってみたくなってきました。何作ろうかな・・・!KiCadとにらめっこする日々が始まりそうです。

「Androidのメモとか」は、Amazon.co.jpを宣伝しリンクすることによってサイトが紹介料を獲得できる手段を提供することを目的に設定されたアフィリエイト宣伝プログラムである、Amazonアソシエイト・プログラムの参加者です。

このブログは個人的なメモ書きであったり、考えを書く場所であります。執筆者の所属する団体や企業のコメントや意向とは無関係であります。また、このブログは必ずしも正しいことが書かれているとは限らず、誤字脱字や意図せず誤った情報を載せる場合がありえます。それが原因で読者が不利益を被ったとしても、執筆者はいかなる責任も負いません。ありがとうございます。