力あるインフラエンジニアを目指して

IT初心者が人前にインフラエンジニアですと言っても恥ずかしくないようになる日を目指します。

BLE Beaconで入退場管理しようとしてみた

2年前、BLE ビーコンとAndroid端末を使ってある場所への入退場を管理しようと試みました。

BLEビーコンはBluetooth Low Energy という電力消費を極力抑えたBluetoothの規格の電波発信機のことですね、簡単に言うと。下のサイトにわかりやすく解説載ってます。

beaconlabo.com

本当は入口付近にビーコンを置いてビーコンとAndroid端末との距離に応じてDB上の入退場ステータスを更新って感じにしたかったですが、結構距離判定の調整が難しく、エリア全域をBLEビーコン電波圏内とし、電波圏ないから出たら退場処理をするとした方が高い精度が得られました。

私が取り組んでるときはそこそこ盛り上がりを見せてて、GoogleからEddyStoneが発表され、アプリなしでURLを送信できるとか1部で話題に上がってました。

dev.classmethod.jp

紹介記事も多くは上にリンク貼っている記事も層ですが、2015年がピークみたいです(ほぼ出た直後)。

確かにたまに目にしますが、あんまり進歩していないというか、やはり私が体験したように電波の制御に苦しめられるからですかね…

当時、AltBeaconというライブラリ使ってました。

AltBeacon - The Open Proximity Beacon

MySQL JDBCドライバ入れて、Android端末からローカルネットワーク内にいるDBを直接更新するってプログラムで検証してました(セキュリティ的にありえないです笑)。

private static final String URL = "jdbc:mysql://192.168.1.13:3306/test";
private static final String USER = "root";
private static final String PASS = "";
(略)
@Override
public void didDetermineStateForRegion(int i, Region region) {
  // 領域への侵入/退出のステータスが変化したときに実行
  Log.d(TAG, "didDetermineStateForRegion");
  try {
    //Data Base へ接続
    Class.forName("com.mysql.jdbc.Driver");
    Connection con = DriverManager.getConnection(URL, USER, PASS);
    //Statement を作成
    Statement stmt = con.createStatement();
    //SQL 文を作成.ログイン状況を反転させる.
    String sql = " UPDATE memberlist SET in/out = ~in/out, time = now() WHERE accont = test ";
    //Update 文を実行
    int num = stmt.executeUpdate(sql);
    //接続を閉じる
    stmt.close();
    con.close();
  }
  catch(Exception e) {
    e.printStackTrace();
  }
}

このやり方、普通じゃないのでご注意を。

3週目の目標と2週目を振り返って

気づいたらブログをはじめて2週目も終了に差し掛かり、3週目を迎えようとしています。 書いていくうちに1週目と比べて変化もあったように思えたのでそれを振り返りながら次週の目標設定を立てて行きたいと思います。

先週の振り返りと今週の目標設定 infra-engr.hatenablog.com

  1. 毎日更新
    今週もなんとか400字以上の記事を毎日出し続けることが出来ました。 ちょっと卑怯なところもあって、投稿が危ういときはとりあえず出来てる分で投稿だけして後で編集しなおすっていう抜け道みたいなことしてました笑 学生時代にも「(論文を)締め切りまでに出さない者には差し替えの権利すらない」という言葉を頂いてたの、真理だったなと思います。 もちろん、この手がいつも通用するわけではないですけどね。

  2. 技術系記事を3本書く
    今週の記事の内容としてはMarkdown記法、SNMPについて、Syslogについて、LaTeXについて、scriptコマンドについて・・・ と、5つは技術にまつわる話が出来たかなと思うのでこれはよしとしましょう。

  3. サービス紹介orツール導入的な記事を書く
    これ、できませんでしたね・・・レビューとか出尽くしてますが、私のような初心者でも使いやすいIDEとか、VirtualBoxに導入したCentOSの初期セットアップのメモ書きとか出来たらなと思っていましたが、結局定まらず記事に出来ませんでした。 まとまった時間がないと厳しいっちゃ厳しいですね。

今回3.は達成できませんでしたが、1.と2.はなんとか達成できました。この2つが達成できた大きな理由としては2つあると思っていて1つは先週の振り返りでも言及しましたが記事を書くことが習慣になった、もう1つとしては自分也のこだわりを記事に盛り込むことが出来たことが挙げられます。 2個目に挙げたこだわりを盛り込むことができたというのがそこそこ大きな要因と思っていて、最近書いたLaTeXなんて完全に個人の好みで、結局出力結果がよければ資料作成にはどんなツールを使っててもいいわけですからね。他人が編集する必要があるとかだとまた別の話になってきますが。それでもこのtexパッケージよりこのパッケージのほうがいい、とかこうした方が綺麗に出力されるとか自分の思いを好きに語っているので自ずと記事を書こうとしてたのはよかったことだなと思います。

とりあえず、今週の目標としては引き続き

  • 毎日投稿(400字以上)
  • 技術系記事3本以上
  • ツール導入or 紹介記事

としたいと思います。特に3つ目は今週こそ達成できるように臨んでいきたいと思います。

linuxのターミナルの出力結果を保存しようとして失敗した件

 事の発端はVirtual Boxで作ったVMのCent OS7にibus-mozcを入れようと思って、折角なので作業のログ取ってみたいなと思いそんならついでに自動的にログが取れるようにと設定しようと思ったことでした。 なんでibus-mozc入れようかと思ったかというと、vimtutorialやっててCentOS7のデフォの日本語IMEちょっと使いにくいなと思いそこそこ使い慣れたMozcがいいなと思ったからです。

scriptコマンド

今更ですが作業ログを残すために使用されている、一般的によく知られてるコマンドです。

dev.classmethod.jp

毎回冒頭に書くのは面倒だなと思ったのでターミナル起動時に自動でscriptコマンドを実行するように考えました。

.bashrcに追記

無邪気に下の一文を追記しました。

script ~/log/$(date +%Y%m%d_%H%M%S)_$(whoami).log

が、想定したとおりのログが出来てませんでした(中身を見てみるとカラ)。 気になって調べてみると同じようなこと取り組んで失敗されてる方を発見。

d.hatena.ne.jp

上の記事から引用

単純にscriptコマンドを記載してしまうと、scriptコマンドが起動するシェルも、さらにscriptコマンドを実行し、無限ループになってしまう。 とのこと。この引用元でも色々と挑戦されてますが結局根本的な解決はできてなそうですかね? ちょっとまだまだ力足らずですね・・・

肝心なvimtutorialは全部終わらず・・・ しかし、CentOS7へのMozc導入は出来ました。日本語入力も快適になりました。なので近日中に気持ちよくvimtutorial終えられそうです。

研究室で使われてた古いTeXパッケージに物申す

LaTeXを使ってガシガシ資料を書いてた頃、所属していた研究室の先輩方が書かれた.texファイルを見てぐちゃぐちゃだったことに憤りを覚え環境を新しくしよう!という推進活動の一つとして資料を作っていたのを発見したのでそこから何個かピックアップしてここに書いてみます。 古いパッケージとか使ってもない意味のないパッケージを読み込むんじゃねぇ!ってスタンスです。 この資料作ったのそこそこ前なので下の資料書いてた時点では新しかったものも今では古くなってしまってるパッケージもありますが・・・
私はこんなことが冒頭に書かれたtexファイルに対して待ったをかけようとしていたそうです。

\documentclass[epsf,here,a4jsme,epic,eepic,9pt]{jsarticle}
\usepackage[dvips]{graphicx}
\usepackage{amsmath,amssymb,bm}
\usepackage{epsfig}
\usepackage{wrapfig}
\usepackage{float}
\usepackage{overpic}
\usepackage{multirow}
\usepackage{tabularx}

私自身が書いた資料から引用したコメントをブログ用に整形しました↓

\usepackage[dvips]{graphicx}に物申す

 当研究室では基本的に前者のdviを出力した後,PDFに変換する形を取っている. つまり,用いるパッケージはdvipdfmxに準したものを用いるべきである. よく見受けられるのが下のように冒頭のパッケージ記載の箇所で \usepackage[dvips]{graphicx} としていることである.dvipsはdviファイルをPSファイルに出力する ドライバである.今,PDFに出力するのだから \usepackage[dvipdfmx]{graphicx} と記述するのが正しい.

\usepackage{epsfig}に物申す

 2行目については先に挙げたように[dvips]を[dvipdfmx]に書き換える. これはいいとして,graphicxは画像読み込みパッケージとして用いられるが, 一行目にもepsfパッケージが読み込まれている. これはLaTeX2.09という古い時代に用いられたものであり, 現在では普通用いない.そのため,このepsfの記載があれば削除を推奨する. さらに言うと4行目のepsfigパッケージももepsファイルを読み込むための ものである. もちろんこれも必要がなければ存在理由もない. epsファイルのみを読みこませると決め込むのなら残しておいてもいいかもしれ ないが, 推奨はしない.

hereパッケージとfloatパッケージの混在

 そして,このまま一行目に着目すると,次はhereというパッケージを呼び出している. そして,6行目にはfloatというパッケージを呼び出している. 両者は同じパッケージであり,どちらか一方だけを呼び出せばよい. 個人的にfloat.styを用いているが,here.styの方が 新しいパッケージらしい(好みの問題).

epiパッケージとeepiパッケージについて

 ひとつ飛んで,epiそしてeepiパッケージについてだが, これはtexにおいて図を描画するためのものである. 正直texは自らで図を描写するのをあまり得意としておらず, 座標を数値入力によって指定し,コンパイルをして結果を確認する 作業を要する. epicとeepicパッケージは作図の自由度を向上させたが, 余計な空白(10\%程度らしい)を作ってしまうバグ等を有している. それならばはじめからInkscape等のドローツールで作図 したほうが簡単で早く複雑な図も直感的に綺麗に描けると私は思う. どうしても\TeX で図を描きたいならばpict2eパッケージを読み込み, さらにそれをdvipdfmxに対応させるために BXpict2eパッケージを読み込むとよいだろう (ただし,pict2eは古いVer.では dvipdfmxに対応していないバグ持ちなので 必ずVer.の確認を).

bmパッケージについて

 最後に順番が前後してしまうが, 3行目の最後のbmパッケージも個人的に推奨しない. bmパッケージは数式モード内で\bm{x} と記述するだけで, $\bm x$を出力してくれる便利なパッケージだが, これを記述するとフォントが強制的にcmmitex標準フォント) となり,フォント指定が課される学会の論文において困ることになる. そこで,\verb|\usepackage{bm}|の記述を消去して冒頭に \newcommand{\bm}[1]{\mbox{\boldmath $#1$}} と記述しておくと,bmパッケージと同様にして太字のベクトル表記を行えるよう になる. 私見だが,日本人は中高生時代の教科書を通じてそれに似通ったフォントである, cmmiを好む傾向にある気がするが, 海外ではあまり好まれないのか基本的にTimes系フォントが主流に思われる. 海外論文へ投稿を行う方は設定の見直しを行う必要があるかもしれない. なお,上記のやり方でも一部のフォントでは何故か太字設定が適応出来ないらし く, 注意が必要である.

結構LaTeXに関しては勉強しようとしてたみたいですが、肝心な研究はそこまで熱心に取り組めてなかったように思えます笑

syslog-ngとrsyslog

お仕事でちょくちょくsyslog-ng使って必要に応じてコンフィグ書き換えるってことをやってます。 でもその実態とか本質とかをよく理解せずにしてました。 最近他のサーバーからsyslog受けるように設定してと言われたので、とりあえずsyslog-ng書き換えればいいのかなーと思ってサーバーに入ってみるとrsyslogというディレクトリを見つけました。 よくわかってない私は「あれ?どっちが大元でsyslog扱ってんの?」と思い、調べてみたら解説記事があったのでまとめます。

www.atmarkit.co.jp

syslog-ng

 syslog-ngはGPLで利用可能なオープンソースソフトウェアです。ハンガリーに拠点を構えるBalaBit IT Securityにより提供されています。「ng」はnext generationを意味し、まさに次世代を意識した、さまざまな機能を備えています。

rsyslog

reliable(信頼できる)シスログデーモンを目指して名付けられた「rsyslog」は、名前の由来となっている信頼性とともに、豊富な機能も特徴としています。TCPを使ったシスログの配送や、MySQLをはじめとするデータベースとの連携など、2004年の開発開始以来、syslogdに求められた機能を積極的に取り込んでいます。

と、こんな感じだそうです。

上に貼ったURLと同じサイトの違うページ見ると、Fedora9っていうOSだと元からrsyslogが入ってるのでsyslog-ngを入れてしまったら競合してしまうそうです。 www.atmarkit.co.jp

それぞれができることを細かく追えてなかったのでもう少し掘り下げていきたいですね。

そもそもSNMPって何? snmpdとsnmptrapdの違いって?

SNMPってインフラ携わってる方だと必ず目にすると思うんですけど、改めてまとめます。

SNMPとは

SNMPはSimple Network Management Protocolの略で、ネットワーク機器やサーバ機器の監視・制御を行うプロトコルのことです。TCP/IPのアプリケーション層に分類されます。

SNMPの構成

SNMPトラップ

SNMPSNMPエージェントからSNMPマネージャに対して異常を通知する仕組みのことです。エージェントは161番ポート(UDP)を使用しマネージャ側は162番ポート(UDP)を使用します。UDPなのでマネージャ側に大量のパケットが流れてきた場合欠損する可能性があるので注意が必要なことがあります。

snmpdとsnmptrapd

SNMPトラップの設定をしようといざコンピュータ見てみるとsnmpdとsnmptrapdと似たような名前があってSNMPトラップの設定するんだからsnmptrapdを弄るのかな?と最初は無邪気に思っていましたが、異なるものなので軽く説明書きます。

snmpd

snmpエージェントとして監視したい機器の中で常駐してるプログラムのことです。

snmptrapd

snmptrapdは各機器からのアラートであるSNMPトラップを受信する常駐プログラムのことです。

つまり、前者はリクエストに対してサーバの状態を返すための機能で、後者はSNMPトラップを受け取るための機能なので、別物ってことですね。 SNMPトラップ自体は監視エージェントをインストールできないネットワーク機器などからアラートとして出力されるものですからね。

Markdown記法でよく間違えること

書き上げたソースコードでプログラムを動かしてみると、意図していたものと違う動きをするってのは往々にしてあると思うんですけど、Markdownでブログ書いてても意図しない出力になってることが多々あります。

Markdown記法で意図しない出力になる度更新予定

箇条書き

文頭に*+-を入れれば箇条書きになるという認識でしたが、上下に改行いれないといけないようで

文章
- hoge
- hoge
文章

じゃなくて

文章
(改行)
- hoge
- hoge
(改行)
文章

としなければ箇条書きとして出力されない。

順に出力結果↓
- hoge - hoge

エスケープ処理忘れ

Markdown記法では_で文字を囲うとイタリック体になる。 ファイルのパスとかで_を複数回使ってるものをコピペすると_が消えてしまうことがある。 そのためバックスラッシュを入れて\_のように書くのが適切。 ディレクトリのパスをコピペする場合、UNIXだと頭にバックスラッシュを2個つけるがそのままだと「\test\20180116_01_test」のようにバックスラッシュが一つ消えてしますので、バッククォーテーションで囲って\\test\20180116_01_01とするか、バックスラッシュを三つ連ねて\\\test\20180116\_01\_01(出力結果:\\test\20180116_01_01)とするのがよい。