raqwel’s diary

Web系で働いている駆け出しエンジニアの備忘録です。

POJOとは??

それは仕事中に・・・

仕事中に実装でわからないことがあり、人に聞いてみたところ

「それはPOJOを作っといて、そこにListを作っておいてそこにどんどんaddしていって・・・」と言われました。

後半の話はわかったのですが、如何せん最初の「POJO」がわからなかったために完全にわかったとは言えませんでした。

ということでPOJOとは何なのか調べてみました。

調べてみた

とりあえずググる

Plain Old Java Object - Wikipedia

ごく普通のJavaオブジェクトであることを強調した名称

ごく普通ってなんなんだ・・・

いつだって「普通」というのは難しい・・・

もっと調べてみた

普通という意味を探しにいろいろと探してみたら、

Springの公式がとても良さそうなタイトルで教えてくれました。

Understanding POJO

この中の1つ目のコードを抜粋してみます。

public class ExampleListener implements MessageListener {

    public void onMessage(Message message) {
        if (message instanceof TextMessage) {
            try {
                System.out.println(((TextMessage) message).getText());
            }
            catch (JMSException ex) {
                throw new RuntimeException(ex);
            }
        }
        else {
            throw new IllegalArgumentException("Message must be of type TextMessage");
        }
    }

}

この1つ目の例では「MessageListner」をimplementsしているため、JMXに依存しきってしまったコードになっており、

別のメッセージ系のフレームワーク(この中だとAMQP)の移行しようとしても困難であったり、もはや不可能となってしまっている、とありました。

そこで2つめのコードとその説明です。

@Component
public class ExampleListener {

    @JmsListener(destination = "myDestination")
    public void processOrder(String message) {
    	System.out.println(message);
    }
}

これだと、なにもimplementsされておらず、代わりにアノテーションが付与されています。ここでJMXからAMQPに移行しようとしたらアノテーションを取り替えるだけで移行できそうですし、なによりimplementsみたいに依存してしまっているわけではありません。

このような特定なinterfaceやフレームワーク、規約に依存していない、単純な設計のjavaオブジェクトのことをPOJOと言うようです。

つまり・・・?

つまりPOJOというのは「特定のinterfaceやフレームワーク、規約に依存していない単純な設計となっているクラスやインスタンス等のオブジェクト」というようです。

なるほどなるほど・・・

Raspberry PiでAD変換するのにMCP3002を使おうとする話(データシート読み取り編)後編

先日に続いて、次はデータ受信編です。
ちなみに、先日の「データ送信編」は以下から

raqwel.hatenablog.com

データ受信に関しても基本的にデータシートを元に読み取っていきます。 f:id:raqwel:20171126180016p:plain

この図の「Dout」と「MCU Recieved Data」に着目すると、データがどのように返ってくるのかがわかります。

Doutを見るとB0〜B9までの10bit帰ってきてその後にNullBitが返ってくることがわかります。これはMCP3002の分解能が10bitであることから起因していると考えられます。また、データの並び方はビッグエンディアンである事もわかります。

しかしMCU Received Dataを見ると8bitずつに分けられて2回送られてきていることがわかります。ということは受信されたデータをそのまま素直に受け止めるわけにはいかなさそうです。ちなみに受信される順番はNullBitがある方から始まり、B0で終わる、というようになっています。
ではどのようにしたらデータを上手く受信して来れるのでしょうか。

先日の記事で示しました、xfer2()で送信したら返り値に受信した値を格納するようです。そしてそれは配列で受け取ることが出来る模様です。 ということは、response = xfer2()とするとresponse[0]に[X, X, X, X, X, null, B9, B8]、response[1]には残りのbitが入る事が考えられます。

値は取得できましたが、配列で2つに分かれてしまっています。
1つのセンサから得た値が2つに分かれてしまって扱うのが面倒そうなので、 出来ることなら1つの変数にまとめてしまいたいです。

そこでビット演算の出番です。 response[0]の値を左に8bitシフトしてからresponse[1]を足すと
[X, X, X, X, X, null, B9, B8, B7, B6, B5, B4, B3, B2, B1, B0]となります。これで値を全部取れそうなんですが、Xとなっている部分がちょっと邪魔です。ここの値に何か入っていると上手く値を取ることが出来ません。
欲しいのはX以外の値です。ということなのでXの部分は0にしてしまいましょう。
ここでAND演算の出番です。2進数で0b1111111111、16進数で0x3ffをAND演算すると、Xの部分はどんな値でも0になるので欲しいところだけ取得することが出来ます。

最終的な形としては

response = spi.xfer2([0x68, 0x00])
value = ((response[0] << 8) + response[1]) & 0x3ff

となります。 ここまで結構長かったですがしっかり読み取ったことで確信を持って実装に移ることが出来ます。

ということで方針が経ったので次は実際に実装していこうと思います。

Raspberry PiでAD変換するのにMCP3002を使おうとする話(データシート読み取り編)

昨日から続けて更新です(珍しい)

ちなみに昨日の現象は、ハンダをやり直したら何もなかったかのように正常に動き出しました()

Lチカも無事に済んだところで、次はAD変換でセンサの値を読み取ろうと思います。

raqwel.hatenablog.com

センサは以下の物を使おうかなと思っています。

www.switch-science.com

これを購入した時は「Raspberry Piに直接挿してAD変換行けるっしょ」と思っていたのですが、

家に帰って調べていたらRaspberry PiにはAD変換用のピンが無いことに気づきました(今までArduinoしか触っていなかった弊害がこんなところで・・・)

  ということでAD変換変換用にMCP3002を購入。

回路とコードはネットで探せばごまんとあるのですが、せっかくなのでデータシートを読んで、Raspberry Pi上でどう使えば良いのかを調べていました。

 

Raspberry PiでMCP3002を使ってAD変換するために(データ送信編)

Raspberry PiPythonを使ってSPI通信をする時は「py-spidev」を使うのがポピュラーのようです。これを使って行こうと思います。

GitHub - doceme/py-spidev

そして次はこれをどう使うか、というところです。

そこで次にMCP3002のデータシートと合わせて読んでみます。ピン配置やピンの繋げ方は省略です。

このMCP3002にはセンサからの入力を読み取るチャンネルが2つあります。

その指定はどのようにやるのでしょうか。

データシートを読んだところ、「5.0 SERIAL COMMUNICATIONS」にそれっぽい図がありました。

f:id:raqwel:20171126172427p:plain

これを見ると、どうも「SINGLE ENDED MODE」の際に[SGL/DIFF, ODD/SIGN] = [1,0]ならばチャンネル「0」、[1,1]ならチャンネル「1」になることが読み取れます。 ちなみに、この「SINGLE ENDED MODE」は「SGL/DIFF」が「1」ならばこのモードになるそうです。

ではこれをどのようにMCP3002に伝えるのか、というところですが、ここで「py-spidev」を使います。このツールのxfer2()を使うとデータを送信出来るみたいです。

xfer()もありますが、これらの違いはCSのactiveしっぱなしにするかどうかという点です。おそらくxfer2の方で大丈夫です。

xfer2で上の命令を送る前にそもそもどのような形式で送信するとよいのでしょうか。その答えは以下の図を参考にすると良さそうです。 f:id:raqwel:20171126180016p:plain

この図の「MCU Transmitted Data」を見るとわかります。

ここを見るとSGL/DIFF, ODD/SIGNというのが出てきました。ということはその部分には[1, 0]が入りそうです。
残りのStartとMSBFについてですが、Startに関しては1を入力すると良いそうです。 MSBFに関してですが、データシートを見ると、「1」だとデータを取得してくれるようです。
ということで送信すべきデータは「x1101xxxx」となります。 xはDon't Careの部分です。気にしないということなので、0を入れておきます。 そのため最終的に送信すべきデータは
011010000 00000000
という様になり、これを16進数に直して0x68, 0x00となります。
そのため、送信するにはxfer2(0x68, 0x00)と設定します。

これで送信する部分は良さそうです。次に受信されるデータはどうなるかについてですが、ちょっと長くなったので一旦区切ろうかと思います。 送信の次はMCP3002から受信したデータはどうなるかを書こうと思います。

久々ですが

久々ですが、とても久々に更新しようと思います。

最近、プライベートで Raspberry Pi zero Wを触り始めました。

マイコン自体は大学の時から触っていたのですが、その時はArduinoばっかりだったので初めて触るRaspberry Piに苦戦しています。

今日も一つ躓いてしまった点が・・・

GPIOへのはんだ付けも終わり、
とりあえず簡単にLチカをしようと、ブレッドボード上に簡単な回路を作って、pythonでプログラムを書いていざ実行したのですが・・・

何故かLEDが光らない・・・

ちなみに以下にブレッドボードで作った回路を載せます。本当に大したことないです。

f:id:raqwel:20171125213459p:plain

なぜ光らないのかを模索すること1時間。
部品も壊れていないし、ラズパイも画面出力できるし壊れていない・・・ テスターで導通チェックもした・・・

わからないままどうしようか悩んでいた時に、不意にラズパイ上のはんだ付けをしたところを押し込んでみると・・・
なぜかLEDがピカッと光出しました・・・

原因がわからず、もやもやしたままここに書き込んでいます。 はんだ付けが甘かったのかな・・・と思ったのでまたハンダをやり直してみます。 これがいいのかどうかはわかりませんが、思いついたものから試してみようと思います。

近況報告2

ほぼ1年ぶりの更新となりました。
無事に大学院を卒業し、東京の企業へ就職し早一ヶ月が経ちました。
新卒ということで忙しくて大変ですがなんとか生きています。

最近思うこと

先程大変と書きましたが何が大変かというと、もちろん会社の研修だとか覚えなくてはいけないエンジニア的なスキルとか色々あるんですが、よく考えていることは「周りの同期のレベルの高さ」だということです。この事を毎日痛感しています。

 研修の課題やタスク1つ取っても自分とは異なる視点から観察し、ロジックを組み立て、本質を突いてこなしている姿を見ると、正直敵わないなと感じてしまいます。こんな視点もあったのか、そんな考え方もあったのかと毎日痛感しています。

でも、ここで痛感してばかりではいつまで経っても成長しないままでもあると考えています。

これからどうしていくのか

今までは何か壁にぶつかったらほとんど自分の力のみで調べ、自分の力のみでこなしていたと思いました。この姿勢も必要だとは思うのですが、このままだといつまで経っても自分の殻を打ち破れないと感じました。「井の中の蛙大海を知らず」です。

これを打ち破るには、最も基本的ですが以下のことが必要なのかなと感じました。

  • 人の良いところを見る、良い所があれば盗んで自分のものにする
  • 人の指摘を受け止める
  • その上で自分なりに考えてみる

以上のことはスキル面というより物事に対する考え方、姿勢を重視した考えだと思います。自分という枠で完結するのではなく周りの人を巻き込んでいく、といったことが大事なのかなと感じた結果、この結論が出ました。

まずはこの姿勢を意識して明日からの研修に挑んでいきたいなと思います。

近況報告

随分と日にちが空きましたが生きています、raqwelです。

大体2ヶ月半?くらい空いていましたがその間に色々な事が起きていました。

その中で2つ大きな事があったのでその事について書いていきます。

 

1.MacBookPro 15inch Retina購入!

 前々から新しいノートPCが欲しいと思っていたのですが、丁度いい時期に大学の生協の展示品セールがあり、そこでMBPが79800円という破格の安さで売っていたので速攻買いました!

 

新古品みたいな感じでそんなに大した傷もなく、とても良い買い物をしました!写真はPCのフォーマットをしているところです。生協で展示品だったせいかOSがMavericksだったので、今はEl Capitanにしてガツガツコードを書いています!

2.Webアプリケーションを初作成!

 Macを買ったその後、自分の所属している研究室から実験予約システムのWebアプリケーション作成を依頼されました。

 自分の研究室は「認知心理学」、「Human-Agent-Interaction」といった分野を専門としており、その際に人に対して実験をしているので、その実験の予約をスムーズに行えるようなWebアプリをMBPを使って作成しています。

f:id:raqwel:20160719193505p:plain

  上の写真は実験システムの一部です。デザイン力が皆無すぎてものすごく簡素な見た目になってしまいました・・・w

 使用した言語、フレームワークとしてはHTML5、CSS3、PHPjQueryの4つを使用しました。Webアプリ初心者だったのですがjQueryは思ったより使いやすく、DOMをごりごり操作して実装していきました。

 初めてこういったシステムを作ったのですが、システムの流れやコーディングだけでなく、「ユーザはこれを見てスムーズに使ってもらえるだろうか?」「使うのに難しくないだろうか」などなど考えなくてはならない事が山程あってとても苦労しました。しかし作って実際に動かして使って貰えると、とても充実感があって、さらに良いフィードバックがあるととても嬉しいです。その気持ちが「もっとこのシステムを良くしていきたい」という気持ちにつながり、モチベーションにもつながっています。

 今、β版ということで実際に動かしているのですが、不具合や「ここをこうしたら?」など改善点等がまだまだあるのでそれらをちょくちょく直していきながらWebアプリケーションを勉強中です。

 

以上、最近あった大きな出来事を2つ上げてみました。Webアプリを勉強中といってもまだまだ青二才なので、これからも楽しく勉強していきたいと思っています。次、Webアプリを一から作るならReact.jsを使っていこうかなーと思っています。予約システムも自分が卒業するまでにはより良いものにしていけたらとも思っています。大体自分の研究室は12月になると皆が立て続けに実験をするので、その時に少しでも実験をスムーズに行えるようにしていきたいです。

近況報告でした!また時間ができたら更新していきます! 

 

 

 

 

疑問点を持つ

はい、raqwelです。

前回、環境設定をクラウドに置き換えることをしてみました。

環境構築はもう済んだので、よしなにか作ろうと思ったのですが・・・

その「作るもの」で悩んでいます・・・

というのは、一体何を作ろうかアイデアがうまく思いつきません。

最初のここが躓いていては何も進まないので、なかなか困っています。

そんな時に、なんか論文の「はじめに」とか「背景」を書く時に考えるのと同じだなーとふと思いました。論文も一番最初の部分が一番難しく、ここがしっかりしていないと後がうまく書けません。こう考えてみると論文と開発ってやっぱり似ているなーと。

これを解消するために、常日頃疑問点を持って生活、行動していかなくてはなと実感しました。

これから、今まで何気なくスルーしていた事にも目を向けて行きたいなと。

とりあえず今日はここまでということで。

明日からGWですねー!自分は東京に1週間程滞在します。大体遊び目的です。

そろそろ新しいノートPC欲しいと思ってたし来年から住む部屋もそろそろ探そうかと思ってたので、そこら辺も見ていこうかなと。結構楽しみですw

では。