Tomcatアプリケーションにおけるクラス利用

って必要性がないような気がする。JAVAなのでクラスは作成して利用することができるがTomcatアプリケーションはクラスを自分で作ってまで実装するような複雑なシステムにはならないような。同じことはPHPでの開発でも言えるかもしれない。既存の便利なクラスを利用することはあるけれども。結構長い間JAVA/Tomcatを扱っていたが私がクラスの利便性になかなか気づけなかったのはそのせいかもしれない。ウェブアプリケーションでHTMLファイルを出力するくらいなのでわざわざクラスを設計するまでもないし、あえて使うこともできるかもしれないがかえってコードが長くなるだけになる。要するにウェブ開発でオブジェクト指向プログラミングは必要ないのである。せいぜいMVCを意識して作り上げるくらい。

Tomcatアプリケーションは基本となるサーブレットクラスというものがあって、開発者はそれを継承してそれぞれ内容を実装していく。なので一応クラスを設計しているようではあるが中身の実装をしているだけなので、オブジェクト指向・クラスの便利さは開発者はわからなくてもなんとかなってしまう。TomcatやPHPで開発していてクラスのことがわかってなくても別に問題なく、クラスを使う必要性があるときだけ使えばいい。TomcatやPHPではクラスを自分で作る必要性がないことが多い。ウェブアプリケーションは同時多数のアクセスがあったときでも捌けるように軽く速く作るのを目指すべきだが、クラスを作成してオブジェクトを生成するというのはどうしてもコストがかかりパフォーマンスが犠牲になる。仮にクラスを設計してそのオブジェクトをアクセスされるたびに量産していたんではサーバが大変なことになる。

pythonの配列と配列に似たようなものについて

pythonの配列

配列の宣言

list = []

pythonでは配列のことを主にリストと呼ぶ。

配列の要素への代入

list = [0,1,2,3,4]

配列の要素へのアクセス

print(list[0])

配列のループでの処理

for item in list:
print(item)

pythonの配列に似たもの1:tuple(タプル)

タプルの宣言

list = ()

配列との違いはその要素を変更できないという点。(immutable)

タプルの要素への代入

list = (0,1,2,3,4,’zero’,’one’,’two’)

タプルの要素へのアクセス

print(list(0))

タプルのループでの処理

for item in list:
print(item)

pythonの配列に似たもの2:dict(辞書)

dictの宣言

dict = {}

辞書型のオブジェクトでキーと値の関係で要素を代入するので別言語のハッシュテーブル・連想配列のような印象。配列との使い所の違いとしてはキーがあらかじめわかっていて要素への高速なアクセスをするときなどに便利かと。場合によってはループ処理で順次値を処理するということもできる。

dictの要素への代入

dict = {‘key1′:1,’key2′:2,’key3’:3}

dictの要素へのアクセス

print(dict(‘key1’))

dictのループでの処理

for item in dict.iteritems()
print(item)

まとめ

配列
l = []
タプル
t = ()
辞書
d = {}

余談

上記の辞書型オブジェクトのdictについて。私自身は別の言語も学習したことがあったのでハッシュテーブルというものの存在は知っていたが、pythonのこのdictについてはなにかと有用な印象を今更ながら感じた。dictは配列のようなものでキーと値というセットで格納することができるが、pythonはオブジェクト指向言語でもあるのでクラスを作成するということもでき、クラスのオブジェクト(インスタンスともいう)をキーとセットでdictに保存するということもできる。これって多重配列をずっと扱いやすくしたようなものだと思う。今までなぜあまり使ってこなかったのかと不思議なくらいだが、クラスとハッシュテーブルは相性がいいのかもしれない。(使う必要性がなければ使わないくていいのだけれども)単にキーと値というペアで存在するデータの集まりと考えたらDBで代用できるしあまりありがたみがないが、クラスから生成したオブジェクトを管理するツールとしてみれば抜群に使い勝手が良い。例を挙げてみる。(コードは適当)


class Person:

  def __init__(self,name,role):
    self.name = name
    self.role = role
  self.active = True
    self.limit = 2024

  def hello(self):
    print("hello!")

naikaku = {}

person = Person("菅義偉","総理")
naikaku["菅義偉"] = person

person = Person("麻生太郎","副総理")
naikaku["麻生太郎"] = person

person = Person("武田良太","総務大臣")
naikaku["武田良太"] = person

person = Person("上川陽子","法務大臣")
naikaku["上川陽子"] = person


for active , person in self.naikaku.items():
  if active == True:
    person.hello()

for name , person in self.naikaku.items():
  if name == "上川陽子"
    person.active = False

if "上川陽子" in self.naikaku:
  del self.naikaku["上川陽子"]

歌詞 Beautiful Things

歌詞

Beautiful Things

雨音があわ立って さよならをかき消すよ
何から話せばいいのだろう 
冷めた街がやけに不釣り合いで
見るもの全てに 心動いて 君だけを見ていた
時折強く吹く風の中に 僕ら手を伸ばした

まだ夢の中 Beautiful Things
ほら夢の中 Beautiful Days
まだ夢の中 Beautiful Dreams
ほら夢の中に いるみたいだ

何から話せばいいのだろう
賑やかさが今は不釣り合いで
同じものを見て 見てもすれ違う思いが わかるよ
時折強く吹く風の中で 僕ら手をはなした

まだ夢の中 Beautiful Things
ほら夢の中 Beautiful Days
まだ夢の中 Beautiful Dreams
ほら夢の中に いるみたいだ 
もう 夢をかき消して
雨音があわだって
さよならをかき消すよ かき消すよ まだ夢の中に


誰の曲・作詞なのか不明。情報求む。

マルチディスプレイは気が散るか効率がいいかどっちなのか

人間はシングルタスクしかできないようになっているためマルチタスクは能率が悪く害悪でしかないというような意見があるようなのだが、その原因となっているのが複数ディスプレイを設置するいわゆるマルチディスプレイ・デュアル・トリプルモニターといったパソコンの利用形態。

私自身多いときでディスプレイを3つも設置していたことがあって、そのときは作業領域が広がって快適だと思っていたが複数のウインドウを展開できるということもあってたしかに気が散漫になって作業が捗らないような気もしていた。というわけで思い切ってディスプレイを1つだけにしてみた。最近ではミニマムなんとかとか断捨離とか物が少ないほうが良いような流行もあるのでいいんじゃないかなと。

ディスプレイが1つだけにしたことによるメリットは多い。

  • 机のスペースがディスプレイ1つだけなので広々使える
  • 電気代がその分減る
  • ディスプレイ間の視線移動がなくなる

などなど。で、肝心の作業の能率は上がったかというと、私自身の場合で言えば、あまり変わらなかった。1つのディスプレイで作業していて、なにかわからないことがあって調べるというようなときにウインドウを切り替えて裏に回ってとかやってると結局マルチディスプレイで視線移動しているのと変わらないから。

というわけでさすがにディスプレイ1つだけというのは不便すぎるのでデュアルディスプレイに落ち着いた。トリプルディスプレイはやりすぎだと思う。最近ではFull-HDよりも解像度が大きいワイドFHDとかさらに大きいのとかに対応したディスプレイも販売されているのでそういうのを使って作業領域を確保すればデュアルディスプレイ環境と同じことができると思われる。

デュアルディスプレイやマルチディスプレイがマルチタスクの原因となっているというのは結局のところ作業領域が広いといくつもウインドウを開くことができるからということなので、高解像度な1つのディスプレイでも同じことが起こりうる。ディスプレイの数に関わらず起動するソフトを絞ればいいということなのかもしれない。

SteelSeries Flux の良さを語る

私が愛用しているSteelseriesのfluxという名前のヘッドセットについてあまりにも良いのでその良さをまとめる。同じ名前でイヤホンタイプも販売されていたようだがここでは頭に装着するヘッドホンタイプについて取り上げる。

良い点

  • コードが着脱式で左右どちらにも差し込める
  • 音が意外にも良くてゲームなど足音も良く聞こえる
  • 軽くコンパクトで持ち運びにもかさばらない。(持ち運んだことなんか一度もないが)
  • 装着感はきつくなく長時間でも苦にならない(個人差あり)
  • マイク付きのコードと無しのコード2種が付属していてヘッドセットとしても使える
  • イヤーの部分が取り外しできてカスタマイズして見た目を変えることができる(自分からは見えないので意味はない)
  • 安い。定価は5~6千円ぐらい。

残念な点

  • 現在は廃盤
  • コードが猫にかじられると簡単に千切れる(猫を飼ってない人には関係ない)

3~4年ほど使っていると耳あてのパッドが劣化して破れてくる。で、その交換もしたので画像のような感じになった。本来は赤色の布地のパッドが装着されていたが交換用は他社製のやつになったのでこのような見た目に。イヤーの部分のサイズは約7cmだったのでこの交換用イヤーパッドがぴったりのサイズだった。

猫を飼っている人には特にオススメできるヘッドセット。付属していたコードは全て齧られてゴミになってしまったが着脱式であるためこういう耐久性のありそうなコードに交換するということもできる。ゲーミングマウスなどに使われているような布巻きのコードなんかも猫の齧られ対策にいいかもしれない。

org.xml.sax.SAXParseException; lineNumber: 1; columnNumber: 1; 途中でファイルの末尾に達しました。

org.xml.sax.SAXParseException; lineNumber: 1; columnNumber: 1; 途中でファイルの末尾に達しました。

javax.naming.NamingException: 途中でファイルの末尾に達しました。

重大: キー UserDatabase でユーザデータベースを検索中の例外です
javax.naming.NamingException: 途中でファイルの末尾に達しました。

LifecycleException: キー UserDatabase でユーザデータベースコンポーネントが見つかりません

tomcatの起動時に発生したエラー。原因はconfディレクトリ内にある「tomcat-users.xml」というファイルに問題があるために発生している模様。私のこのエラーが発生する環境では、当該のファイルの中身が消去されてしまっていた。意味がわからないが再起動かなんかのタイミングでエラーが発生してtomcat-users.xmlのファイルの中身が削除されてしまったのだろう(そんなことがあり得るのだろうか・・・)

とりあえず新たにtomcatのアーカイブを解凍してtomcat-users.xmlのファイルだけをコピーしてきて問題のあるファイルと置き換える。これで一応起動できるようにはなった。ただどうしてこんなことになったのかという原因がわからずじまい。またこのファイルの中身がどっか消失したらコピーしてきてと応急処置を繰り返すのか。さらに謎なのは同じ構成のPCが他にもあって問題が起こっているのはこの1台だけという状況。他のマシンも同様のエラーが発生しているのならわかるのだが。

No space left on device デバイスに空き領域がありません

Ubuntuサーバーでファイルをmvしようとしたとき、No space left on device となってファイルの移動コマンドを受け付けないようになってしまった。移動できない場合の原因として主なものは

  • ディスクの容量が本当にいっぱいでこれ以上保存できない場合
  • inodeを使い切ってしまっていて追加できない場合

大体この2つが原因らしい。

私の場合はそのどちらでもなく、ディスクスペースもinodeも余裕があるにもかかわらずNo space left on deviceというエラーが発生するようになってしまった。現象としては

  • 特定のファイルが移動できない
  • エラーが出たファイルとは別の名前のファイルなら移動できる

というような感じ。

このようなエラーが出るようになったきっかけは、思い当たるところではmvコマンドを実行中に途中で強制的にコマンドを遮断してしまったことぐらい。イレギュラーな操作をしてしまったことでディレクトリ情報の何かが壊れてしまって特定のファイルのコピーを受け付けないようになってしまったのかなと予想しているがそんなことがあり得るのかどうか不明。結局、そのディレクトリにはファイル移動ができなくなってしまったので新たにディレクトリを作成して、今度はmvコマンドのプロセスを途中でkillするようなことなく最後まで完遂させることにした。こういうことがあると巨大なファイルや膨大なファイルを移動させるときに今後は細心の注意を払う必要がある。

容量の大きいディスクから小さいディスクへddコマンドでクローンする場合

linuxのターミナルで使うことができるddコマンドについて、ddコマンドとはディスクのクローンを作るときに使われるコマンドで、あるディスクとそっくりそのままの内容を別のディスクへ複製することができる。ただし条件があり、
・元となるディスクと同じ容量か大きいディスクのみクローン作成可能
・元となるディスクより容量が小さいディスクへはクローンできない
といった条件がある。

またddコマンドができることは
・ディスクのクローン作成
・パーティションのコピー
といったことができる。

で、大きい容量から小さい容量のディスクへコピーする場合について。たとえばubuntuのOSが入っているディスクのクローンを作成する場合、パーティションが切られているのが普通であり、ブートローダがあるバーティション、本体のファイルシステムがあるパーティションといった具合に存在する。容量の大きいディスクから小さいディスクへのクローン作成は本体のファイルシステムのあるパーティションをddコマンドでコピーすることで目的を達成することにした。

Ubuntuでクローンを作成する場合
手順としては、

  1. 元となるディスクの最も大きいパーティションのサイズをgpartedを使って小さいディスクの容量に収まるようにリサイズする。
  2. 移行先となる容量の小さいディスクに元となるディスクに存在するOSと同じものをクリーンインストールする
  3. ubunbtuのインストールメディアをusbかなんかに保存してliveインストールディスクとして使えるようにする。(遊んでるlinuxマシンがある人はそちらで可)
  4. 3で作ったインストールディスクでliveOSを起動する(この起動するマシンに移行元と移行先のディスクをあらかじめ接続しておく)
  5. liveOSでデスクトップが起動したらターミナルを起動してddコマンドを実行してパーティションをコピーする
    例:# dd if=/dev/sda2 of=/dev/sdb2 bs=4M

以上のような手順でとりあえずディスクのクローンという目的は達成することができた。容量大から容量小へのddコマンドディスク複製の実行はたとえパーティションサイズが同じであってもディスク全体の容量が違うということでコマンドを完遂することができない。当たり前といえば当たり前だけれども。パーティションサイズを整えて使用済みの容量と移行先の容量は揃えたからあとはddコマンドさんよろしく・・・というようなことはできない模様。ifには元となるディスクまたはパーティションを指定、ofには移行先となるディスクまたはパーティションを指定。

ディスクをクローンする場合
例:# dd if=/dev/sda of=/dev/sdb bs=4M

パーティションをクローンする場合
例:# dd if=/dev/sda2 of=/dev/sdb2 bs=4M

詳しくは # fdisk -l とかしてディスク状況を確認するといいかもしれない。bsのサイズは適当。

M.2 NVME SSDの速度は体感できる

普通のSATA接続のSSDからm.2規格のNVME SSDに換装した。Intel 760pという品で最高Read 3210 MB/s 出るらしい2020年現在でもまだハイエンドのSSDへと環境を移行したが、前情報だとNVMEも普通のSATA SSDも体感できないというのが定説だったが、実際に使ってみると明らかに違う。大きなファイルやゲームなどで違いが出るのかなと勝手に思っていたが、OSの起動もそうだが全ての動作がいちいち速くなる。もうSATASSDには戻れない。

・・・2~3日もすると慣れてわからなくなった。

SSDにクローンしたらWindows10が起動できなかった件

現象

・クローン化したSSDを起動ドライブとしてPCを起動すると、初期のロード画面が終わってからログインのパスワードを入力する画面が表示されず真っ暗なまま。マウスを動かすとカーソルは一定時間表示される。処理中のアイコンも表示される。

原因(推測)

クローンソフトを使ってSSDにクローンしたが既存のSSDにあるパーティションの設定などが存在していたためクローン作業そのものは問題なく終わったものの起動時に何かしらのエラーが発生するようになったのかもしれない。

対策

・一度Windowsをクリーンインストールしてみて正常にインストールできるかどうかを確認する。インストールできて問題なく起動できたならばそのOS上でバックアップから復元をしてクローンの代わりにする。

使ったソフト

・Acronis True Image WD Edition (当該のPCにUSBでもなんでもWD製のストレージが接続されていれば無料で使える)

復元の手順

1.移行元のストレージをAcronis True Imageでバックアップする(私はコンピュータ全体ではなくディスクとパーティションだけをバックアップした)
2.移行先のSSDにWindows10を新規インストール(ライセンスキーの入力はありませんでいい)
3.移行先のSSDでWindowsを起動してAcronis True Imageをインストール&起動、バックアップタブを選択して下向き矢印のアイコンから既存のバックアップを追加を選択する。1で保存しておいたバックアップファイルを選択してディスクの復元をクリックしてバックアップと復元先をそれぞれ選択して復元する。以上