simotin13's message

simotin13といいます。記事の内容でご質問やご意見がありましたらお気軽にコメントしてください\^o^/

高知県のおすすめスポットについて

このブログのアクセス内容を見ていると、去年(2016年)、高知県の栢島に行った時のことを書いた記事を最近よく閲覧頂いているようです。

mcommit.hatenadiary.com


高知県出身者としてはとてもありがたく感じております。
栢島はとてもきれいで、楽しい時間が過ごせたので今年もできれば行きたいと思います。

皆さんにもぜひ栢島に行って頂きたいという気持ちと同時に、せっかくなので高知県のほかのおすすめスポットについても一応ですが「地元民」として紹介させて頂ければと思います。

私の大雑把な主観ですが、高知市(高知駅周辺)からの移動時間の目安も記載しておきます。それほど的外れな時間感覚ではない自信はありますが、渋滞してると時間がかかる場合もあると思いますのであくまで目安としてお考え下さい

  • 秦山公園
  • 国虎屋
  • 日ノ御子河川公園キャンプ場
  • ヤシィパーク
  • 番外編(おすすめのお土産)
  • まとめ

秦山公園

f:id:simotin13:20170610014743j:plain

子供連れのファミリーにはぜひおすすめの公園です。
私も帰省した際にはいつも行っています。遊具も多く、人気の公園なので祝日や休みの日は結構にぎわっていますが、混んでるからといって遊べないということはないと思います。
駐車場(無料)も2か所ほどあり、私の経験では満車になっていたことはありません。

http://www.city.kami.kochi.jp/map/jinsankoen.htmlwww.city.kami.kochi.jp

大きな滑り台とトランポリンが見所です。
他にも遊具がたくさんありますので小学生低学年までの小さいお子さん連れの方はぜひ遊びに行ってみてください。

移動時間の目安:30分~40分(高知市から)

続きを読む

HHKB Professional BT(日本語配列)を1か月使ってみた

1か月ほど前に購入したので使用感を書いておきたいと思います。

購入のきっかけ

BluetoothタイプではないHHKBのProfessional JPをここ5年くらい使っています。

普段使っているPCはノートPCだったので優先のキーボードで特に問題はなかったのですが、最近デスクトップ型のPCを買うことになり合わせてBluetoothタイプのHHKBが欲しくなりました。

多くの方がそうだと思いますが、デスクトップPCは机の下(足元)に置く形になります。

その場合、キーボードのUSBケーブルがそれなりに長いケーブルが必要になるのですが、机の上にはそれでなくてもUSBケーブルや基板やら、LANケーブルやらはんだごてなどが居座っているので少しでもすっきりさせたいという思いで購入しました。

よかった点

基本的にはHHKBと同じなので今更あえてHHKBの良さを語るのはやめておきたいと思います。

上記の

机の上をすっきりさせたい!

という目論見は大成功で、気持ちよく作業ができます。

「USBケーブルがいらない」

というBluetoothのメリットが最大限生かせているのでいい感じです。

いまいちと感じた点

非常に満足しているBluetoothタイプのHHKBですが、1点想定外のデメリットというか困った点がありました。

それは、

長時間キーボードを放置した場合、キーボードの電源スイッチを長押ししなければならない

という点です。
Bluetooth機器なので長時間放置された場合は節電のために自動的に電源が切れるようになっています。

再度復帰させる場合はキーボード本体のスイッチを長押ししてあげる必要があります。
毎回PCを使うたびにこの作業が必要になるのですが、これが地味に面倒です。(スイッチも小さいので押しやすくはないですし)

スイッチの長押しではなくて特定のキーボードを何回か押したらとかだったらなぁ・・・と思います。
(例えばエンターキー3回とか)

しかし、よくよく考えてみるとHHKB以外にもBluetoothタイプのキーボードはあるのですが今まで使ったことがなかったです。他のBluetoothタイプキーボードも同じようなスイッチとか押す必要があるんだろうか・・・

HHKBを使う理由

私がHHKBを使う理由は単純で、

  1. 「ctrl」キーが通常のキーボードの「caps lock」の位置にある。(所謂UNIX配列)
  2. キータッチが軽い

の2点です。

そういえば同じ理由でMacbookを使っています。
エディタでemacsを使ったりターミナルで「ctrl」キーをよく使うので「ctrlキー」は「A」の横にあってほしいというシンプルな理由です。

どのOSでもソフトで切り替えたりもできますが、そういったことをいちいちする手間がないというだけでとてもありがたいです。

英語配列日本語配列か?

キーボードに対するこだわりとして「英語配列」がいいという方がいらっしゃいますが、私はまだ英語配列のキーボードを触ったことがありません。

日本語を扱う以上、「半角/全角」の切り替えが必ず必要になりますが英語配列の場合複数キーの組み合わせで切り替えをする必要があるようで、なんとなくそれが使いにくそうだなぁという印象があり日本語配列のキーボードを使っています。

英語配列は慣れると生産性が高いという声をよく聞くので機会があれば触ってみたいものです。

感想

HHKBはとても使い勝手のよいキーボードですのでこれからもずっと愛用していくことになりそうです。
両方のタイプを使ってみた感想として、同じHHKBとして比較する場合、BluetoothタイプもUSBケーブルもそれぞれメリットデメリットがありますので一概にどちらがいいとは言えないかと思いました。

作業する机の上の状況や使用するPCのタイプに合わせて検討してみるとよいかと思います。


/*~*/ コメントアウトを除去するコードをRubyで書いてみた

タイトルの通り、C言語系の複数行 /* ~ */ コメントを除去するコードを書いてみました。
Rubyで書いていますが状態遷移が基本になるのでどの言語でも同じように書けそうです。

# コメントアウトの除去
def delete_comment_out code
  status = :STATUS_WAIT_START_SLASH
  tmp = ""
  comment_out_code = ""
  code.each_char do |c|
    case status
    when :STATUS_WAIT_START_SLASH
      if (c == '/')
        tmp = c
        status = :STATUS_WAIT_START_ASTR
      else
        comment_out_code << c
      end
    when :STATUS_WAIT_START_ASTR
      if (c == '*')
        status = :STATUS_WAIT_END_ASTR
      else
        status = :STATUS_WAIT_START_SLASH
        comment_out_code << tmp
        comment_out_code << c
      end
    when :STATUS_WAIT_END_ASTR
      if (c == '*')
        status = :STATUS_WAIT_END_SLASH
      end
    when :STATUS_WAIT_END_SLASH
      if (c == '/')
        status = :STATUS_WAIT_START_SLASH
      end
    end
  end
  if status != :STATUS_WAIT_START_SLASH
    puts "status error"
  end
  comment_out_code
end

# テスト
code = File.read("test.c")
puts "--------------- before ------------------"
puts "#{code}"

comment_out_code = delete_comment_out(code)

puts "---------------  after ------------------"
puts "#{comment_out_code}"

元コード

#include <stdio.h>

// スラスラコメントは消えないよ
float func(void)
{
  float f = 1 * 2 / 3;
  int n = 1*2/3;

  /*
   * 複数行コメントも大丈夫
   */

   /* 掛け算・割り算も大丈夫 */
   return 1 * 2 / 3;
}

変換後コード

#include <stdio.h>


// スラスラコメントは消えないよ
float func(void)
{
  float f = 1 * 2 / 3;
  int n = 1*2/3;

  

   
   return 1 * 2 / 3;
}

状態遷移表

正規表現でもできると思っていたのですが、複数行でのマッチングがうまくできなかったのでコードで書いてみました。これくらい何も考えなくても10分くらいあれば書けるだろうと思っていたのですが、意外とパッと手が動かなかったので、まじめに状態遷移表を書いてからコードに落としてみました。

f:id:simotin13:20170513012803p:plain

感想

C言語の場合、コメント行の除去処理はプリプロセッサの仕事ですが、こうしてコードを書いてみると*/がない場合のエラー検出はコンパイル前に検出できますね。当たり前と言えば当たり前なんですが「コンパイルエラー」がどこで検出できるかまではあまり意識していないのでなんか新鮮な気持ちになりました。

AWS kinesis GetRecords の正しい呼び出し方

AWSのサービスの1つであるKinesis Streamを使う機会がありました。

APIを使ったデータのアップロードとダウンロードをする際にいくつか気を付けないといけない点があったので挙げておきたいと思います。

Kinesisの特徴

Kinesisの特徴はデータのリアルタイム処理ができることでクラウドにアップロードしたデータは基本的に24時間の間アクセスできます。
RDBと違って永続的に保存されるわけではなく、あくまでストリームに流したリアルタイムなデータに対して何らかの解析を行うというのがサービスの用途のようです。

データをアップロードするAPI

さて、kinesisへのデータのアップロードは、

  1. PutRecord
  2. PutRecords

という2つのAPIによって行います。

両者の違いは文字通り1つのデータか複数データかになります。

ちなみに、PutRecordsはAPIの仕様を読む限り、複数レコードのアップロードのうち、一部のデータのみアップロードに成功し、一部は失敗するということがあるようです。

トランザクション的な機能が無く、またレスポンスの内容からはどこからどこまでが成功でどこからどこまでが失敗なのかが分からないようです。手堅くデータをあげるのであればPutRecordをつかえということなのかもしれません。

データの取得はどうするのか?

アップロードしたデータを取り出す時はどうすればいいかですが、

  1. GetShardIterator

docs.aws.amazon.com

  1. GetRecords

docs.aws.amazon.com

というAPIの呼び出しによりデータの取得が可能です。


さて、このGetShardIteratorとGetRecordsの使い方ですが、単純に

「こっからここまでのデータをくれ」

という感じでの呼び出しにはなりません。

特にGetRecordsの呼び出しは一般的なWebAPIにおけるデータ取得とは少しイメージが異なる形です。

細かい説明はAPIのリファレンスを見て頂ければ分かると思いますが、ここではRubyaws-sdkを使ったPutRecordとGetRecordsを呼び出すような、サンプルプログラムを上げておきたいと思います。
特に、データを取得する処理に関して、GetRecordsを使われる方のご参考になれば幸いです。

require 'aws-sdk'

# AWS の設定用定数
REAGION = 'リージョン名'
ACCESS_KEY_ID = 'アクセスキー'
SECRET_ACCESS_KEY = 'シークレットアクセスキー'
STREAM_NAME = "ストリーム名"

Aws.config.update({
  region: REAGION,
  credentials: Aws::Credentials.new(ACCESS_KEY_ID, SECRET_ACCESS_KEY)
})

kinesis = Aws::Kinesis::Client.new(region: REAGION)

# PutRecordで上げるデータはBase64エンコードする必要がある
# →従って、文字列だけでなくバイナリデータもあげることができる
enc_data = ["123"].pack('m')

resp = kinesis.put_record({
  stream_name: STREAM_NAME,
  data: enc_data, # required
  partition_key: "key-test", # required
})

# shardIdにはputRecordのレスポンスに格納されているShardIdを設定する
# シャード数が1であれば恐らく "shardId-000000000000"になっている
shd_id = resp.shard_id
puts "shard_id:#{shd_id}"
puts "sequence_number:#{resp.sequence_number}"

resp = kinesis.get_shard_iterator({
  stream_name: STREAM_NAME, # required
  shard_id: shd_id,        # required
  shard_iterator_type: "TRIM_HORIZON"
}
)

shd_it = resp.shard_iterator

resp = kinesis.get_records({shard_iterator: shd_it, limit: 10000})

loop do
	resp = kinesis.get_records({shard_iterator: shd_it, limit: 10000})
  resp.records.each do |record|
	puts record
    end
    # millis_behind_latest が0になった場合に終了させる
    # get_records自体はデータがなくても成功する
    break if resp.millis_behind_latest == 0
    break if resp.next_shard_iterator.nil?
    shd_it = resp.next_shard_iterator
end

ポイント

GetRecordsの呼び出しで注意しないといけないポイントがあります。
GetRecordsのレスポンスとして返ってくるデータには必ずしもデータが入っているとは限りません。
NextShardIteratorがある限り呼び出しを行わないといけないのですが、実はNextShardIteratorだけでチェックしてもデータが全てとり終わったのかどうかが分かりません。

全てのデータがとり終わったかどうかは、MillisBehindLatestが0かどうかでチェックする必要があります。
このチェックがないとGetRecordsをいつまで呼び出していいか分からず無限ループにはまってしまいます。

感想

サンプルコードを書いてみたはいいのですが、私の中でkinesisやMQTTのようなサービスやプロトコルのメリットが今一つ理解できていない部分があります。

世の中には永続化すべきデータとそうでないデータがあり、両方合わせると莫大な量になるが、
「とりあえず集めるだけ集めて必要なデータだけを残そう」という思想なのかもしれません。

IoTが広がるにつれてkinesisのようなサービスはこれからどんどん使われるようになるでしょうか。。。


Amazon Web Services 基礎からのネットワーク&サーバー構築 改訂版

Amazon Web Services 基礎からのネットワーク&サーバー構築 改訂版

Amazon Web Services実践入門 (WEB+DB PRESS plus)

Amazon Web Services実践入門 (WEB+DB PRESS plus)

注意点

Kinesis Streamはデータの通信量による課金とは別に、作成したストリーム単位でも費用が発生するので、ほったらかしにしないよう注意してください。

4月の振り返りと読書録

4月が終わってGWに突入しました。

今年の自分の目標として、月に2本ブログに記事をあげることを1つのノルマとしているのですが、特に書くとがないので振り返りや読書録等を上げておきたいと思います。

書くことが無いというよりは、書きたい気分にならないというべきかもしれません。

この3月、4月は桜の景色を楽しむ暇もない忙しい春でした。

特に4月は子供達が小学校や幼稚園に入ることもあって私用も多く、また新しい仕事の引き合いも頂いて神経を使った1か月でした。

仕事の引き合いを頂いた場合、今取り組んでいる仕事の時間を削って新しい仕事に向けた時間を確保する必要があります。

お客様への満足度が下がらないように同時に物事を進めるというのはとても疲れることですし、結果としてうまくいかない場合もあります。

4月に忙しかったせいでなんだかどっと疲れたでたというかGWはのんびりと勉強したり普段できないことに時間を使いたいと思います。

最近読んだ本

書きたい気分ではないということもあるので最近読んだ本・読んでいる本を感想と一緒に上げておきたいと思います。


流通王・中内功とは何者だったのか

流通王・中内功とは何者だったのか

kindle本で読みました。
中内功さんは私の好きな経営者です。家系が土佐の方だと知ってすごく親近感がわきました。

ダイエーは結果として衰退しましたが中内さんの生き方・考え方にあこがれる部分があります。


ディープラーニングの勉強のために読んでみました。
私は文系出身なので数学は数ⅡBまでしか学んでいません。ディープラーニング人工知能について勉強するためには行列の勉強からやるべきと思いよんでみました。
マンガということもあって分かりやすいのですが、この手の数学の入門書籍を何冊か読んでみて思ったことですが、数学はやはり自分で手を動かして計算してみてなんぼだということです。
自分で紙と鉛筆を用意して計算してみないと身につきませんね・・・


電話はなぜつながるのか 知っておきたいNTT電話、IP電話、携帯電話の基礎知識

電話はなぜつながるのか 知っておきたいNTT電話、IP電話、携帯電話の基礎知識

kindle本で読みました。
CTI関係の仕事の話があったのですが、VoIP関係のプロトコルはもちろんの事、電話に関してはハードレベルのことなど何も分かっていません。
この本は電話や通信の基本的なレベルの内容から丁寧に説明されてとても分かりやすいです。
まだ読んでいる途中で、つまみ読みしかできていませんが、この本を一冊きちんと読めば電話に関する基礎知識はしっかりと身につくのではないかと思います。

振り返り

仕事が忙しくなればなるほど色々な本を読みたくなりついつい本屋さんやamazonで買ってしまうのですが読まずに終わる本も増えてしまいます。
GWは読書と勉強の時間をしっかり取って5月も頑張ろう。