知識と実践と成果
下記点線より下の文章は2017年ごろに書いて下書き保存をし、いつの間にか存在をわすれていたものである。読み返してみて自分の状況があまり変わっていないなと感じることもあり、自分のために公開する。メモである。
----------------------------------------------
日本語おかしいかもしれないが、頭に浮かんだことをそのまま書き出したいので、あまり推敲せずに記述していく。
ソフトウェア開発者として自分は何者かというか、自分は典型的な受身で仕事をしてきたと思う。自分で自発的に何かをしようとしたのはIPAの資格(FE,AP)を取ったりoracleのJavaの資格とったりしたくらいだと思う。それと必要に応じて、入門的な技術書(日本語。結城さんのJavaプログラミングレッスンとか)を読んできたくらい。(いろいろ衝動的にその時々で技術書買ったが、結局自信をもって読んだと言えるのは上記Java本くらい)
しかしそれだけでは業務では何もできない。要は素人と玄人の中間くらいと自認している。
例えば、あるチェック条件を修正するために、if文などでチェックしている箇所を探し出したり、その条件式の修正を行うことはできる。既存のすでにあるシステムの似たような機能の追加や改修はできる。(感覚では1~15行程度の修正や追加)
しかし、プロジェクトで共通で使う部品の作成(言語が標準で提供しているような部品に機能を追加したり)や、DBの型桁などに注意を払った設計や、その実装はできない。上記のチェック条件修正した時のテストもまともに書けない。
ポリシーをもって、方針に対して意見をもち、必要に応じて議論ができないとプロジェクト(仕事)では前向きに仕事ができないと痛感した
下記のブログエントリをたまたま読んで、いたたまれない気持ちになった。
泥沼プロジェクト振り返り - プログラマのはしくれダイアリー
自分がアンチパターンそのものの存在
仕事を辞めるべきかどうかの、シンプルな基準
仕事をしていれば、自分の仕事についてあれこれグダグダ考えてしまうことが多いと思います。
私はそういうとき、
という記事を見て、自分を奮い立たせることがあります。
内容を自分が実践できると考えていないですが、ある種の元気をもらえます。
日本語はこちら
で、たまたまその方の他の記事を見ていて、
という記事がありました。
短い文だったので、日本語に訳しました。メモとして残してみます。
(訳は自分でこんな感じだろうと意訳した面もあります。もし読んで、おかしいでしょうこの訳は、という意見がありましたらコメントください。)
以下訳
私には仕事を辞めることに関して、シンプルな基準がある。その基準は過去に私にかなりいいものをもたらしてくれた。
あなたは自分の仕事を好きになれないときは仕事をやめるべきだ。それはストレートに自分に響いてくるが、その基準をどう定義すればいいのだろうか?
あなたが自分の仕事を好きかどうかは、月曜日がくることを楽しみにしているかどうかで判断できると思う。この感覚がないまま、たくさんの時間を過ごしているなら、あなたの置かれている状況を評価し、どこにいけばより幸せになれるか考えてみるべきだ。今の状況に諦めてはいけない。人生は短い。
仕事を楽しむということの他の側面は、学習である。学ぶことをやめたら、すぐにその仕事を辞めて、次に移った方がいい。高いレベルの知的な人々と仕事をして、それらの人々は自己成長の重要性を教えてくれた。
繰り返し処理時にArrayList中の要素を削除してもConcurrentModificationExceptionにならない場合(Java)
最近、仕事でJavaを使うことが多かったので、知識のまとめにもなると考えてJavaのSilverの試験を受験しようとしている。
曖昧な知識が整理されて勉強自体が知識の補強に役立っていると感じます。
勉強でこの本
を使っているが、その中の第4章「配列の使用と作成」の17と18の問題に、以下のようなプログラムがある。
その17番のプログラム(p.133)
public class Main {
public static void main(String args) {
ArrayList<String> list = new ArrayList<>();
list.add("A");
list.add("B");
list.add("C");
for(String str: list) {
if("B".equals(str)) {
list.remove(str);
} else {
System.out.println(str);
}
}
}}
18番のプログラム(p.134)
public class Main {
public static void main(String args) {
ArrayList<String> list = new ArrayList<>();
list.add("A");
list.add("B");
list.add("C");
list.add("D");
list.add("E");for(String str: list) {
if("C".equals(str)) {
list.remove(str);
}
}
for(String str: list) {
System.out.println(str);
}}
}
これらのプログラムをコンパイル、実行したときの結果として、正しいものを選べ、というのが設問である。
どちらのプログラムも、要素がString型のArrayList型の変数listを、拡張forループで処理している。条件に合致したときに、listから特定の要素をArrayListのremoveメソッドで削除している。
その場合、通常は繰り返し処理中にArrayListのremoveメソッドで要素を削除すると、ConcurrentModificationExceptionがthrowされる。
ArrayList (Java 2 Platform SE 5.0)
18のプログラムは、実行すると、実際にその例外がなげられる。
しかし、17のプログラムは実行してもConcurrentModificationExceptionがthrowされず、実行できてしまう。
これがなぜかわからなかった。
しかし、検索して調べてみて
この方のブログをみて納得した。
Listの最後から2番目の要素を削除すると、例外を投げることなく不正な状態で反復処理を終えてしまうそうです。
そのような、繰り返し処理中に要素を削除するようなこと自体が、言語の仕様を満たさない使用法なので、公式APIドキュメントにも言及がないらしいです。
繰り返し処理中に変更されるコレクションのことに関しては、以下の記事がわかりやすいと感じました。
MSC06-J. 繰り返し処理中に基となるコレクションを変更しない
ややこしいので、問題集にもこのことを一言書いてあるとありがたかったですが・・。
(問題集自体は非常にいい本で買ってよかったと思っています)
以上
CentOS : 端末をショートカットキーで起動する
CentOSを使用していて(筆者が使用しているバージョンは6.5)、ubuntuと異なり、端末がショートカットで起動できず不便だと感じたことはありませんか?
ubuntuならばデフォルトでは[Ctrl+Alt+T]のキーを同時に押せば端末が起動します。
centOSでは上記のような[Ctrl+Alt+T]キー押下で端末を起動させることはデフォルトの状態ではできないようになっています。(端末起動のショートカットが無効になっている)
端末をショートカットキーで起動できる方法を記載します。
- メニューバーのシステムから設定→キーボード・ショートカットを選択
- キーボード・ショートカットのウィンドウが開いたら、[デスクトップ]カテゴリの中にある[端末の起動]を選択する
- 選択すると、ショートカットの部分に、「新しいショートカット」と表示される。
- その状態で、起動のショートカットに使いたいキーを押下する([Ctrl+Alt+T]を端末起動のショートカットにしたいのであればCtrl+Alt+Tを押下する)
- 設定完了
以上です。
0120899280AMAZONPRIME AMAZON.
今日クレジットカードの明細を見ていたら、
0120899280AMAZONPRIME AMAZON.
という覚えのない項目があり、3,900円引かれていました。
これはAmazonプライムの無料体験期間が終了し
何の設定も変更しない場合、自動的にプライム会員になってしまい
その年会費が3,900円なる、ということのようです。
画像の左上の赤枠で囲われた①のamazonマークの部分にPrimeと書かれていれば
あなたはプライム会員ということになります。(この画像はプライム会員の画像ではありません)
この設定を解除するには、右上の②の赤枠のプライムと書かれた部分をクリックして
設定画面に進み、設定を解除します。(画像はヒラ会員の画面なので、プライム会員時の画面と若干違います。)
初期設定ではプライム会員の更新を自動更新にする、みたいになっているので、
それを自動更新にしないように変更します。
同時にプライムの会員資格を停止することもできるので、プライム会員になっていたくない人は停止しましょう。
停止するとメールが送られてきます。
以上です。
レジスタをたたくって何
以前、組み込みシステム開発(とある製品のファームウェア開発)の現場で作業をすることになり、チームリーダーの方から通常のアプリケーション開発と組み込みシステム開発の違いを一言でいえば・・というような話をオリエンテーションでされたことがあります。
最大の違いはレジスタを扱うかどうかだ、ということでした。
レジスタというと、組み込みなどハード関係のことに詳しくない方はCPU内の一時記憶場所、というようなイメージしかないかもしれません。私もそうでした。
しかし、組み込みの世界でレジスタといえば、
http://itroner.blog41.fc2.com/blog-entry-3.html
『組み込み機器では、いわゆるCPUだけではなく周辺機器(シリアルポートやLANポートとか)を制御する機能や特殊な演算(音声圧縮とか映像デコードと か)をする機能などを1チップ内に集積しています。これらをCPUから使用するために、各機能と入出力をおこなう領域を物理メモリ上に配置しています。こ の領域がレジスタです。』
出典「大なり小なり 組み込みで遊んでみるブログ http://itroner.blog41.fc2.com/」
といようなものです。
単純に、かつ、おおざっぱに云えば、レジスタの値を読んだり、値を書き込んだりするのが組み込みの中心的な処理といっていいかもしれません。
ハードウェアの仕様はきまっていて(仕様書があり)、この機能はレジスタのこのアドレス上の値を操作すると動かすことができる、ということになっています。
レジスタの値を読み書きすることで、その機能を使用したり、ステータス(状態)をしることができます。
例として挙げます(愚にもつかないようなコードですが)。
*((uint32_t *)0x00000002) = 0x00000001;
この処理は、レジスタの0x00000002番地に0x00000001という値を書き込む、という処理です。uint32_tというのは32ビット長の無符号整数宣言です。
とある機能のレジスタ(ここでは0x00000002番地)上に決められた値を書き込むことで(ここでは0x00000001)その機能を使用することができるようになります。