なりそこないの綴り

エンジニア(予定)まであと半年の学生です。

JavaでLチカ!

Lチカって何?

→LED(発光ダイオード)をチカチカさせることです。

 

電池探してたらへそくりが出てきたので、前々から興味あったラズベリーパイとその他もろもろを買いました。

 

 

 

 

 

 

 

 

 

 

他にもドスパラとかでmicroSD、キーボード、マウス買いました。お金使うの楽しい。

 

f:id:mori_morio:20171110001048j:plain

こんな感じになりました。

 

環境構築はこちらのサイトを参考にチャチャっと済ませてしまいました。

http://hirazakura.hatenablog.com/entry/raspberrypi/setup/first

ありがとうございます。

 

それではLチカしていきましょう。

 

Pi4Jの設定


ターミナルで下のコマンドを実行しPi4Jをインストールします。

curl -s get.pi4j.com | sudo bash

 

BlueJの設定


ターミナルで下のコマンドを実行して、設定ファイルを開きます。

sudo nano /usr/share/bluej/bluej.defs

 

次にuserlibディレクトリの場所を指定する箇所に下の記述を追加します。

bluej.userlibLocation=/opt/pi4j/lib

 

追加したら保存し終了します。

設定が終わったらさっそく配線し、BlueJでコードを書きます。

 

配線


f:id:mori_morio:20171110001132j:plain

こちらのサイトにラズパイのGPIOの配線図が載ってます。

https://matome.naver.jp/odai/2146277598114754901

 

今回は9番ピンと12番ピンを使用しています。

 

テストコード


f:id:mori_morio:20171110001037p:plain

このコードは0.1秒の感覚で10回点滅を繰り返します。

 

書いたらさっそく実行します。

 先ほど書いたSampleLED1を右クリックして、void main(String[] args)を選択して実行します。

f:id:mori_morio:20171110001236p:plain

 

 

カーネルのVerによるのかもしれませんがこのようなエラーが出る場合があります。

Unable to determine hardware version. I see: Hardware : BCM2835

バージョンが対応してないらしく、ダウングレードしないといけないようです。

 

ターミナルで以下のコマンドを実行

sudo rpi-update 52241088c1da59a359110d39c1875cda56496764



 特に出なかった場合はそのままで。

気を取り直して実行します。

 

f:id:mori_morio:20171110001314j:plain

(動画とれないのでSSで)

 

JavaでLチカ!

 

電子工作入門しました。

 

実行終了したら、表示→デバッガウィンドウを選択しTerminateを選択し、終了させてください。

f:id:mori_morio:20171110001340p:plain



モニタやらでそれなりにお金がかかりましたが、ラズパイって色々できるんですね、とても夢を感じます。LEGOと組み合わせてロボットみたいのを作りたいですね。

 

いつになるかはわかりませんが、ここで書いているコードをGithubで公開する予定です。

ラムダ式(Java)

SE8で追加された新機能のラムダ式について。

 

ラムダ式とは


匿名クラスの記述をシンプルにしたもの。

 

今までは、一度しか使わないその場かぎりのクラスを実装する場合、匿名クラスが使われていました。が、可読性が悪く、「?」と、なりがちでした。

ラムダ式を使うことで、匿名クラスをシンプルに実装することが可能です。

 

匿名クラス(無名クラス)


抽象メソッドを持つクラス、インターフェースをその場かぎりで実装した名無しのクラス。

 

コードで書くとこの様になります。

f:id:mori_morio:20171101014147p:plain

その場で中身を実装する事ができ、その場にあった実装が出来ますが、普段なかなか見慣れない書き方なので、私が未熟なだけなのか可読性が低いと感じます。



関数型インターフェース


ラムダ式での実装を目的とした、抽象メソッドが一つだけ存在するインターフェース。

 

抽象メソッドが一つだけならば、他のメソッドがあっても関数型インターフェースと認識されます。

@FunctionalInterfaceアノテーションを付けることで関数型インターフェースとして扱われない場合エラーをはいてくれます。

f:id:mori_morio:20171101014203p:plain

f:id:mori_morio:20171101014216p:plain

SampleInter4は抽象メソッドが二つあるので関数型インターフェースとして扱うことができません。

 

ラムダ式の実装

上記のインターフェースをラムダ式と匿名クラスで実装します。

f:id:mori_morio:20171101014707p:plain

ラムダ式で書いた方がコードが短く、シンプルにかけていると思います。

このラムダ式ですが条件によってさらに短く書くことができます。

 

左辺の省略

インターフェースで既に引数の型は宣言されているので引数の型を省略する事ができます。

f:id:mori_morio:20171101014736p:plain

 

さらに引数が一つの場合()も省略可能です。引数が存在しない場合は省略できません。

f:id:mori_morio:20171101014755p:plain

 

右辺の省略

処理が一文で済む場合{}の省略が可能です。さらに{}が省略されている場合returnも省略可能です。

f:id:mori_morio:20171101014805p:plain

すごく短くなりました。

 

 先ほど説明した関数型インターフェースですが、java.util.functionパッケージにていくつか提供されてます。やる気が出たら今度書いてみようと思います。

 

最近興味のあったラズベリーパイと3.5インチのモニター買ったので、なんか電子工作したいと思います。

AtomにJavaの実行環境

前回書いた通りAtomJavaの実行環境を用意したいと思います。

それだけだと寂しいので一から書いていきたいと思います。

 

1.Atomのインストール

https://atom.io/

このページからダウンロードして下さい。

 

2.Atomの日本語化

Help→Welcom Guideを選択し、InstallPackageを選択して、OpenInstallerを選択。

f:id:mori_morio:20171028030253p:plain

次にjapaneseと入力しpackagesを押すと、japanese-menuのパッケージが出るのでインストールしてください。

f:id:mori_morio:20171028030319p:plain

これで日本語化になります。

 

3.JDKのインストール

http://www.oracle.com/technetwork/java/javase/downloads/index.html

このページからJDKを選択し、自分のOSにあったものをダウンロードしてください。

f:id:mori_morio:20171028030736p:plain

f:id:mori_morio:20171028030744p:plain

 

ダウンロードが終わったらさっそくインストールします。

f:id:mori_morio:20171028030823p:plain

f:id:mori_morio:20171028030836p:plain

保存場所は変更ボタンから変更できますが、場所が分かればいいのでどちらでも構いません。

 

4.パスの設定

インストールが終わったらパスを通します。

コントロール パネル→システムとセキュリティ→システム→システムの詳細設定を選択し、環境変数を選択します。

f:id:mori_morio:20171028030931p:plain

f:id:mori_morio:20171028031010p:plain

開くとユーザ環境変数とシステム環境変数の項目が出ます。

ユーザ環境変数に設定した場合、現在ログインしているユーザだけの設定になります。

システム環境変数に設定した場合どのアカウントでログインしていても、その設定が有効になります。

どちらでも問題はないので好きな方で構いません。

 

f:id:mori_morio:20171028031107p:plain

pathを開いたら新規を選択し、パスを入れます。

jdkをインストールした場所をエクスプローラで開き、pathをコピーし、追加します。

f:id:mori_morio:20171028031138p:plain

 

黄色い部分をクリックするとコピーできるようになるので、コピーしてください。

 

追加したらOKを選択し、閉じてください。

 

次にpathが通ったのか確認します。

コマンドプロンプトを開いて(Win+r cmdと入力 )コマンド「 java -version 」と「 javac 」と入力します。

f:id:mori_morio:20171028031217p:plain

このようにでたらOKです。

 

5.scriptの導入

先ほどのパッケージのインストール画面でscriptを検索し、インストールしてください。

f:id:mori_morio:20171028031300p:plain

このままだと文字化けしてしまうので、ファイル→起動スクリプトを選択しinit.coffeeを開きます。

開いたらそこに 「 process.env.JAVA_TOOL_OPTIONS = '-Dfile.encoding=UTF-8' 」 を追加します。

f:id:mori_morio:20171028031334p:plain

次にパッケージ→script→Configure Scriptを選択してください。

 

f:id:mori_morio:20171028031414p:plain

Current Working Directoryにjavaファイルが格納されているディレクトリのパスを入力しSaveしてください。

名前はディレクトリ名と同じにしておくとわかりやすいです。

 

shift+ctrl+alt+bでJavaコンパイルができます。

f:id:mori_morio:20171028031434p:plain

実行したいファイルが入っているディレクトリを選択します。

 

選択するとコンパイルされ結果が出力されます。

f:id:mori_morio:20171028031527p:plain

ディレクトリごとにひとつ前の設定をしないといけないのが面倒ですね。

 

これでAtomJavaの実行環境ができました。





タバコ増税つらい。

 

static修飾子(Java)

前々回の記事で書こうかなと思ったのでstatic修飾子(Java)について

 

 c++ではstatic修飾子のついた変数や、関数、メソッドは、静的変数、静的関数、静的メソッド、等静的〇〇と言われますが、Javaだとstatic〇〇と呼ばれることが多いです。

 Javaではstatic修飾子のついた変数やメソッドはクラス内で宣言されるため、static修飾子がついた変数、メソッドをクラス変数、クラスメソッドと呼ばれます。逆に、static修飾子がつかない変数やメソッドをインスタンス変数、インスタンスメソッドと呼ばれます。

 

静的メンバ変数

複数の同じインスタンスに対して一つしか存在しません。オブジェクトを生成せずに参照することができます。


 static変数とも呼ばれます。 c++と違い、宣言すれば実態も生成されます。 static変数はどのインスタンスから参照されても実態は一つしか存在しません。Javaグローバル変数のような使い方がしたい場合はこのような形で使うことになると思います。

f:id:mori_morio:20171023234707p:plain

f:id:mori_morio:20171023234710p:plain

 

f:id:mori_morio:20171023234711p:plain

f:id:mori_morio:20171023234713p:plain

となります。

 

静的メソッド

オブジェクトを生成せずに参照することができます。


 staticメソッドとも呼ばれます。 こちらもc++と同じですね。 インスタンス生成せずに参照もできますが、生成したものからでも参照することができます。

f:id:mori_morio:20171023234714p:plain

f:id:mori_morio:20171023234715p:plain

となります。

 

静的クラス

クラス内にクラス(インナークラス、メンバークラス)を生成する際に使うことができます。


 staticクラスとも呼ばれます。 クラス内にstaticクラスとして宣言することで、別ファイルに定義した普通のクラスと同じような扱いができます。 static classはクラス内でしか宣言できず、普通に宣言しようとするとエラーになります。 staticクラスから、親クラスのインスタンス変数、インスタンスメソッドは参照できませんが、クラス変数やクラスメソッドは参照できます。

f:id:mori_morio:20171023234720p:plain

f:id:mori_morio:20171023234722p:plain

となります。

 

static import

staticメソッドの呼び出しが簡単になります。


可読性が下がるのでほぼ使ったことないです。

f:id:mori_morio:20171023234724p:plain

f:id:mori_morio:20171023234727p:plain

f:id:mori_morio:20171023234725p:plain

となります。

 

 

 解説をすると、TestStatic5クラスの変数aとprintメソッドをstatic importを用いて簡略化して参照しています。

 

コードもつけると結構長くなりますね。

 

AtomETロボコンぐらいでしか使っていなかったので、次回はAtomに実行環境のプラグインを入れてみたいと思います。

 

主キーの必要性

学校の課題のシステム開発で使いそうなのでメモ程度に。

 

主キーの主な役割は「不変性」と「一意性」です。

 

不変性

不変性を持つことで整合性を取りやすくします。

 

一意性

一意性を持つことで重複レコードを許さず、テーブルから特定のレコードの検索を容易にできます。

 

   主キーのないテーブルでは重複レコードの存在を許してしまいます。重複レコードが存在する場合でもDISTINCT句等を指定して重複を排除すれば大丈夫ですが、そのような手段をとるとパフォーマンスの問題が出てしまいます。重複レコードが存在する場合では、検索はもちろん、処理の重いテーブルの結合の際にも結合レコードが増え処理が遅くなります。

 

そのためにも仮に主キーのいらないテーブル(スコアブック、中間テスト等)の場合でもつけたほうがいいでしょう。

f:id:mori_morio:20171021232951p:plain

といったテーブルにつける場合

f:id:mori_morio:20171021233014p:plain

このように主キーを追加した方が、パフォーマンスがあがるでしょう。

 

 実際のところ受験ID列は↑のテーブルにはなんら関係のない値で設計者が勝手につけたキーです。それを人工キーと言います。このやり方は推奨されていないらしく、原則に基づいて主キーには自然キーを用いた方がいいと言われていますが、私は人口キーの方が楽だしパフォーマンスもいいので人口キーを使っています。

 

早く実際の業務がしたいです。

static修飾子(c++)

ETロボコン用のコード見ていたら気になったので。


static修飾子ってどれに修飾するかで意味が異なってくるんですよね。今まで気にしていませんでしたが結構ややこしいものだなと思いました。

static修飾子がついたものは静的〇〇と呼ばれます。

静的ローカル変数

プログラムが終了するまで存在し続けます。


初期値を入れなかった場合は0が自動的に入ります。

 

静的グローバル変数

他のファイルから参照できなくります。


別につけなければ他ファイルから参照出来るわけではないですが、つけておけば完全に他ファイルから参照されることはありません。他ファイルから参照したい場合はextern修飾子について調べると出てくると思います。

c++では静的グローバル変数は推奨されていないのでnamespaceを使った方がいいみたいです。

 

静的メンバ変数

複数の同じインスタンスに対して一つしか存在しません。 インスタンスを生成せずに参照する事ができます。


クラス内で宣言しても実態はできません。別のところで宣言しないといけません。

 

静的メンバ関数

インスタンスを生成せず参照することができます。


staticなメンバ関数(静的メンバ関数)からstaticではないメンバ変数を使うことはできません。

 

静的クラス

メンバーすべてにstatic修飾子がついているクラスを指します


メンバーがすべて静的な場合わざわざインスタンス生成する必要はないのでコンストラクタは書く必要はないでしょう。

 

Javaとかではまた別の意味がありそうなのでまた今度書こうかなと思います。