- 投稿日:2020-08-24T23:56:57+09:00
javaのvarについて
javaの変数宣言 var
Java Silverのお勉強の整理メモです・・・
varの使い方
- SE10から登場
- ローカル変数の型推論
- 右辺の値に応じてデータ型が推論される
var v1 = "hoge"; //Stringとして扱われる var v2 = 123; //intとして扱われる
- 変数型推論なので、宣言だけができない -> 値を代入しないと型の推論ができないため
- そのため、nullの代入は不可
var v3; //これはコンパイルエラー var v4 = "huga"; //ok var v5 = null; //これもコンパイルエラー
- 変数の複数宣言ができない
int i1 = 1, i2 = 2, i3 = 3; //ok var v6 = 6, v7 = 7, v8 = 8; //コンパイルエラー
- メソッドの仮引数の型に使用できない
String piyo(var val){ ... //コンパイルエラー }
- 投稿日:2020-08-24T16:31:51+09:00
【更新中】Java屋さんのためのPython Syntaxチートシート
最近Pythonをはじめました。
が、やりたいことはググると出てくるし、Python3に至ってはオブジェクト指向になってくれたおかげで、だいたいは雰囲気つかめちゃったりするので良いのですが、いざ書いてみると躓くのは文法だったりしますよね?(私だけ?)
だいたいJavaに慣れきってたりすると、Javaだとああ書くんだけど、Pythonだとどう書くんだろ?的な発想になるので、似たようなことを考えてる人のお役に立てれば幸いです。というわけで、Javaだとこう書いてたけど、Python3だとこう書くんだよ、というのを残しておきます。
始めたばっかりなので、多少考え方とか間違ってるかもしれないけど、そのへんはご愛嬌。ざっくりです。書きながら覚えていくタイプなんで。
気が向いたら更新していくと思います。環境
Python 3.8
Java 8公式のチュートリアル
https://docs.python.org/ja/3/tutorial/index.html
公式のユニットテスト(unittest)
https://docs.python.org/ja/3/library/unittest.html
チートシート
コメント
Java
// 行単位のコメント /* * ブロックコメント */Python
# コメント
クラス定義
Java
public class Hoge { }Python
class Hoge: # コロンが大事!!コンストラクタ定義
Java
public Hoge(){ // 初期化すんよ }Python
(追記)Pythonの場合はコンストラクタというより、メソッドだそうです。
コンストラクタの中から呼ばれるメソッド、と思ったほうが良さそうdef __init__(self): # 初期化すんよインスタンス生成
Java
Hoge hoge = new Hoge();Python
hoge = Hoge()処理起点(いわゆるメイン)
Java
public static void main(String[] args) { // body of main() }Python
if __name__ == "__main__": hoge.hoge()他のモジュール(クラス)を使いたい
Java
import jp.co.hoge.Hoge;Python
なんか書き方いっぱいある・・・!
https://nansystem.com/python-module-package-import/条件式
https://docs.python.org/ja/3/tutorial/controlflow.html
Java
// a = b and b = c if (a == b && b == c) { System.out.println(a) } // a = b or b = c if (a == b || b == c) { System.out.println(a) } // 否定 if (!enable) { System.out.println(a) }Python
# a = b and b = c if a = b and b = c: print(a) # a = b or b = c if a = b or b = c: print(a) # 否定 if not enable: print(a)比較演算子
比較演算子はJavaもPythonも一緒
< <= > >= == !=null と None
Javaのnullはオブジェクトがない
PythonのNoneは 値がない
をそれぞれ意味するhttps://www.quora.com/What-is-the-difference-between-Javas-null-and-Pythons-None
In Java, null is an instance of nothing, it is often referred as "no object" or "unknown" or "unavailable" .
In Python None is an object, denoting lack of value. This object has no methods. It needs to be treated just like any other object with respect to reference counts.
So these two are not much alike, however since Java 8 Optional has come along which is more similar to None. It is a class that encapsulates an optional value.
You can view Optional as a single-value container that either contains a value or doesn't (it is empty)厳密にはnullとNoneは意味が違うので同じようには使えない、NoneはJavaでいうところのOptionalが近い。
While the difference is nuanced, Python's None by being an object itself, helps avoid some types of programming errors such a NullPointerExceptions in Java.
ただ、Noneはオブジェクトなので、ぬるぽ処理みたいなことに役立つよ
という話らしい。
エラー
https://docs.python.org/ja/3/tutorial/errors.html
既定クラスはJavaもPythonもExceptionクラスjava
try { // 例外が起きる処理 } catch (Exception e) { e.printstacktrace(); throw new CustomizeException(); } finally { // 最後にしておきたい処理 }Python
try: // 例外が起きる処理 except Exception as e: print(e)リスト
https://docs.python.org/ja/3/tutorial/datastructures.html
PythonのリストはJavaの配列とArrayListのいいとこ取りした感じのやつっぽい。
書き方はJavaの配列に似ている。
Pythonには配列型もあって、こっちがJavaの配列とほぼ同じなのかな。配列型は標準では使えず、インポートが必要。Java
List<String> list = new ArrayList<>; // 配列の長さを取得 list.size(); // リストに追加 list.add("lemon");Python
l = ["John", "Bob", "Carry"] # リストの要素数を取得(len関数を使う) len(l) # リストに追加 l.append("Mickey")その他 いろいろ参考になったサイト
- 命名規則
- 他のモジュールをimportしようとするとpylintに怒られる件
- ファイル読み込み
- unittestライブラリの使い方
- csvのインポート・エクスポート
参考
https://qiita.com/karadaharu/items/37403e6e82ae4417d1b3
https://www.rose-hulman.edu/class/cs/csse220/200910/Resources/Python_vs_Java.html
https://python.keicode.com/lang/oop-basics.php謝辞
@shiracamus さんありがとうございます
- 投稿日:2020-08-24T12:44:03+09:00
PDCAサイクルとOODAループを併用する方法
今回の記事では、PDCAサイクルとOODAループの違いについて解説し、併用する方法について紹介したいと思う。
インターネット上の記事では、OODAループとPDCAサイクルを比較する論調が目立つがその考えは誤りである。
PDCAサイクルは計画、実行、チェック、改善のループを回すことによって、全体的なパフォーマンス向上を目的としている。
OODAループは、観察、判断、意識決定、手段のループを行うことで、人間が変化が激しい現実の世界に適応する思考のプロセスをモデル化し、良い判断を行うことを目的としている。
PDCAサイクルやOODAループは人間が無意識に行っている思考のプロセスを客観化、モデル化したものである。
そのため、PDCAサイクルとOODAループは人間の思考プロセスで無意識的に併用している。PDCAサイクルとは
PDCAサイクルは戦略レベルの思考である。
1920年代において「戦略」について明確な定義を行ったのは、ロシア帝国時代とソビエト時代の将軍であるアレクサンドル・スヴェチンである。
スヴェチンが定義した「戦略」の定義は以下の内容となっている。
戦争の準備と作戦のグループ化を組み合わせて、軍が戦争によって提唱した目標を達成する技術そして、1980年代で最も適切に戦略について解説した著書「戦略論の原点」を発表したアメリカ海軍の将軍であるジョセフ・カルドウェル・ワイリーは「戦略」を以下のように定義している。
戦略とは「何かしらの目標を達成するための一つの「行動計画」であり、その目標を達成するために手段が組み合わさってシステムと一体となった、一つの「ねらい」である」戦略家であるアレクサンドル・スヴェチンとジョセフ・カルドウェル・ワイリーは戦略を目標を達成するための行動計画と定義している。
PDCAサイクルとは、戦略のパフォーマンスを検証、改善することによって、よりよい戦略を作り出すフィードバックループを構築するためのモデルと定義すること的確である。OODAループとは
OODAループとは、アメリカの航空戦略家であるジョンボイドが朝鮮戦争の航空戦、ナチスの電撃戦を研究し、変化に適応する人間の意識決定のスピードが勝敗が分けたと結論づけた。
人間の意識決定のプロセスを可視化したのが以下のOODAループである。
観察(Observe)- 情勢への適応(Orient)- 意思決定(Decide)- 行動(Act)通常の人間の認知範囲は作戦レベルに対応していると考えられている。
そして、この思考の上位に戦略レベルが下位に戦術レベルが存在している。
現場レベルの作業に従事している人間は、変化が激しい情勢に柔軟に対応しなければならない。
OODAループとは、人間が現実の世界に対応するために思考パターンをモデル化したものである。
そのため、OODAループとは作戦レベル、戦術レベルの思考パターンと考えられる。戦略レベルの行動のフェーズについて
スヴェチンは「戦略」の行動を以下のフェーズごとに分類した
1.計画フェーズ・・・目標を達成するめの行動計画を立てるフェーズ。
2.開発フェーズ・・・目標を達成するめの手段を開発するためのフェーズ。新しいアイディアの作成、アイディアに基づく手段の作成、手段を運用する人の教育、もの or サービスの作成などが該当
3.配置フェーズ・・・開発フェーズで作成したオブジェクトを配置するフェーズ。オブジェクトの管理 or 保存、人材の配置、ものの運搬経路の設定、通信経路の設定などが該当
4.運用フェーズ・・・配置フェーズで作成したオブジェクトを作戦レベルで運用するフェーズ。開発フェーズで作られたアイディアを組み合わせ、目標を達成する。
PDCAサイクルは戦略のプロセスを検証、評価、改善し、次の戦略へフィードバックすることを目的としている。PDCAサイクルとOODAループの併用
PDCAサイクルとOODAループの併用を図式化したのが以下の画像である、
戦略レベルで作成した行動計画がPDCAサイクルによってフィードバックされ、次の戦略の行動計画へ繋がり、OODAループが変化が激しい変化に適応していくためのサイクルだと理解することができる。
PDCAサイクルとOODAループを比較した際に違和感が発生するのは、比較している行動モデルの階層が一致しないためである。まとめ
PDCAサイクルとOODAループはモデルを提供することによって、人間に共通した認識を提供してくれる。
しかし、具体的な手段までは定義していないため、PDCAサイクルとOODAループを適用するためには、組織に合致した手段、チェック方法を独自に考えなければならない。
PDCAサイクルとOODAループを適切に運用できないケースとは、組織がPDCAサイクルとOODAループに合致した手段を用意できないことが原因だと思われる。
- 投稿日:2020-08-24T11:25:14+09:00
モノレポでJavaのFWを開発していることに気付いたので運用を考える。
はじめに
本記事は、JavaのFWを開発するプロジェクトにおいて、モノレポ開発のメリットを享受する為のリポジトリ運用について考える記事です。
モノレポとは
端的にいって、モジュールを横断してコードを一つのリポジトリで管理しようというリポジトリの運用戦略です。モノレポの考え方として下記の2つがありますが、本記事では後者について考えます。
- 企業のコード全てを1つのリポジトリで管理しようとする考え方
- プロジェクトのモジュール全てのコードを1つのリポジトリで管理しようとする考え方
これってモノレポでは?
私の所属するチームでは、JavaのFWを開発しています。FWはいくつかのモジュールから構成されており、それらのモジュールは1つのGitリポジトリで開発されていました。何故こういったリポジトリ構成になったのか、チームに経緯を確認した所、製品として品質保証したい範囲でリポジトリを作成した為とのことでした。
当時、Gitの経験が浅かった私は違和感を抱かなかったのですが、どうやらこういったリポジトリの運用をモノレポと言うらしいので、モノレポ運用のメリットを活かせている運用か調べてみることにします。モノレポのメリット
モノレポ開発の為のツールセットであるNxのドキュメントを参考にすると、モノレポ運用をすることのメリットとして挙げられるのは下記の4点です。
- コードが全て同じリポジトリにあり、互いに参照できるため、コードの再利用がしやすい。
- モジュール変更の影響が同じリポジトリ内で完結し、1PRで解決できる。
- 異なるツールや技術を利用したモジュール群のビルドやテスト手順を一貫したものにできる。
- モジュール毎の依存を単一のセットに固定でき、後になって依存関係の競合に悩まされない。
チームのJavaリポジトリを顧みる
下記の2点から、リポジトリはモノレポのメリットを享受できていると言えそうです。実際のところ、機能の開発・修正に伴って、あちこちのリポジトリにPRを投げるようなことはないですし、連結テストになって依存関係に悩まされることもありません。
1. 製品を構成するモジュールが同一リポジトリで管理
モジュール群はテストコードを含め、同一のリポジトリで開発されており、互いに参照されるとともに、変更の影響を確認できます(※画像の構成はイメージ)。GitLab CI/CDのように、リポジトリにパイプラインジョブを定義するファイル(.gitlab-ci.yml)が含まれる場合、パイプラインジョブの再利用がしやすいこともメリットとして挙げられますね。
2. 依存関係はgradleファイルで一意に管理されている
製品の依存関係は単一のgradleファイルで管理されています。
dependencies { implementation("org.aspectj:aspectjrt:1.9.4") implementation("org.aspectj:aspectjweaver:1.9.4") implementation("com.fasterxml:classmate:1.4.0") implementation("commons-beanutils:commons-beanutils:1.9.3") implementation("commons-betwixt:commons-betwixt:0.8") { exclude module: "commons-beanutils-core" } // 中略 }モノレポの運用
上述の通り、チームはモノレポのメリットを受けられていることを確認できました。
次はモノレポのメリットを最大化し、モノレポの運用課題に対処するために、モノレポ運用の検討事項について考えてみます。
こちらは参考文献を基に記載しています。参考文献については、本記事の末尾に記載しているので、こちらもご参照ください。1. 物理的なリポジトリサイズの増加にどう対処するか
全てのコードが単一のリポジトリで管理される都合上、リポジトリが肥大化します。サイズはもちろんのこと、ビルドやテストにかかる時間の増加への対処を検討する必要があります。一般的に、影響範囲のみのビルドやテストを実施するよう制御します。2. いじられたくないモジュールをどう守るか
全てのモジュールが単一のリポジトリに格納されると、別チームにモジュールを破壊される可能性があります。モジュールに対してチーム毎に制御を設けることなどが検討されます。3. 各モジュールに対して単一の規格をどれだけ浸透させられるか
モジュール毎にコーディングスタイルや品質の管理基準、依存セットが異なっていると、モノレポのメリットは失われ、管理が煩雑になります。対処方法としてデファクトスタンダードの規格をモジュールに強制するアプローチなどが取られます。4. モジュールの変更を素早くリポジトリ全体に浸透させられるか
モノレポ運用のメリットは、全てのモジュールの最新コードを全ての開発者が参照できることに依る所が大きいです。したがって、リポジトリの運用として、CI/CDを前提としたトランクベース開発が好ましいと考えられます。チームのJavaリポジトリ運用を顧みる
モノレポの運用と比較して、チームのリポジトリ運用の評価は下記の通りです。
- リポジトリと開発チームは巨大ではない。
- プロジェクトの性質として、多数のチームが参加して開発するものではない。
- 製品として重厚な品質管理が規定、一定の規格がモジュール間で統一されている。
- featureブランチによる開発。
チームでは、品質管理のCI/CD化を進めることでコードの変更反映を速めています。加えて、少数チームでの開発で、開発者がリポジトリ全体を掌握しきれている為、リポジトリサイズや開発規模に起因する課題は生じていないという状況だといえるでしょう。
まとめ
モノレポで開発することのメリットと運用方法について説明し、チームのモノレポとその運用について確認しました。結論として、チームのリポジトリは、モノレポ運用に関して大きな課題はなく、メリットを受けつつ開発を進められているという結論でした。
少数チームで開発するリポジトリにおいては、モノレポにすることで生じる課題はあまりないと言えるのではないでしょうか。余談ですが、レポジトリとリポジトリが並ぶと少々違和感がありますね。
参考文献
モノレポに関して、下記の参考文献をもとにメリットや運用の検討について述べています。
- Nxのドキュメント:https://nx.dev/angular/getting-started/why-nx
- Misconceptions about Monorepos: Monorepo != Monolith:https://blog.nrwl.io/misconceptions-about-monorepos-monorepo-monolith-df1250d4b03c
- Monolith→MultiRepo→MonoRepoでの リポジトリ戦略:https://slides.com/kotamat/repository-strategy
- 投稿日:2020-08-24T10:07:02+09:00
#2【備忘録】Javaで九九の計算をしてみました。
はじめに
連日、暑い日が続いていて頭も体も鈍っているけど頑張って記事の更新は続けますので!
今回は九九の計算ということで自分なりに見やすさとコードのシンプル化を意識して勉強してみました。
「ここはこうした方が良い」や「ここはそれじゃない」などご指摘がありましたらコメントよろしくお願いいたします。開発環境
今回も"Eclipse"で総合開発環境でやってみました。
こちらの記事を参考に開発環境を構築してみてください。EclipseでJava開発環境を作る(Mac編)
※今回もMacでの作業となります。実装
class Main { public static void main(String[] args) { //九九の計算 for(int i = 1; i < 10; i++) { for(int j = 1; j < 10; j++) { System.out.print(" " + i + "×" + j + "=" + i * j); } //改行 System.out.println(); } } }上記コードを上から順に解説します!
Mainクラスの中にmainメソッドを定義します。
class Main { public static void main(String[] args) {for文を使い九九の段をループします。
まずは段について、for文の中にはint型の変数iを定義して中には1を入れ、
iは10未満、そして変数の更新をi++
とします。for(int i = 1; i < 10; i++) {次に段の中身のループをします。
記述は一つ前の変数名をjに変えてあげるだけです。for(int j = 1; j < 10; j++) {出力結果が◯×◯=◯のようにしたかったので以下のようにしました。
System.out.print(" " + i + "×" + j + "=" + i * j); }そして最後に出力をしてあげます!
ここの""
はループが終わり次のループに入る際に改行するために記述するスペースです。System.out.println();Mainクラスとmainメソッドの閉じかっこも忘れずに!]
} }実行
実行結果1×1=1 1×2=2 1×3=3 1×4=4 1×5=5 1×6=6 1×7=7 1×8=8 1×9=9 2×1=2 2×2=4 2×3=6 2×4=8 2×5=10 2×6=12 2×7=14 2×8=16 2×9=18 3×1=3 3×2=6 3×3=9 3×4=12 3×5=15 3×6=18 3×7=21 3×8=24 3×9=27 4×1=4 4×2=8 4×3=12 4×4=16 4×5=20 4×6=24 4×7=28 4×8=32 4×9=36 5×1=5 5×2=10 5×3=15 5×4=20 5×5=25 5×6=30 5×7=35 5×8=40 5×9=45 6×1=6 6×2=12 6×3=18 6×4=24 6×5=30 6×6=36 6×7=42 6×8=48 6×9=54 7×1=7 7×2=14 7×3=21 7×4=28 7×5=35 7×6=42 7×7=49 7×8=56 7×9=63 8×1=8 8×2=16 8×3=24 8×4=32 8×5=40 8×6=48 8×7=56 8×8=64 8×9=72 9×1=9 9×2=18 9×3=27 9×4=36 9×5=45 9×6=54 9×7=63 9×8=72 9×9=81と表示されていれば成功です!
エラーになってしまう場合
可能性としては
;
が抜けている場合があると思いますので確認してみてください!最後に
最近、学習時間が取れていないので「どこか空き時間を作らなきゃ」と切羽詰まっています汗
でも、自分で自分を追い込むのは好きではないので色々と戦ってます、、、
頑張ります!
- 投稿日:2020-08-24T03:21:55+09:00
【Android9.0 Pie Java】LINE風にチャット一覧画面→個人チャット画面の遷移アニメーションを実装(サンプルアプリ付)
環境
Android9.0 Pie Java
はじめに
以前投稿した、
【Android9.0 Pie Java】チャットアプリで横スワイプ→ダイアログ表示→削除を実装する
の続きになります。
- チャット一覧の要素を押すと右から左へ覆い被さるようにチャット画面のfragmentが重なる
- < ボタンを押すと左から右へチャット画面のfragmentが消える
完成品URL
全てのコードを載せると大変なことになるので、この記事では省略しています。
チャット画面のlayoutやAdapter等のファイルも含めてDLして動かしてみたい方はこちらからどうぞ!
https://github.com/yuta-matsumoto/chatコード
ChatListFragment.java
「チャット一覧の要素を押すと右から左へ覆い被さるようにチャット画面のfragmentが重なる」実装のコア部分になります。
チャット一覧の各要素のonItemClickの部分をピックアップします。
ChatListFragment.javaの全文はこちらChatListFragment.java// チャット一覧のアダプター final ChatListAdapter adapter = new ChatListAdapter(list) { @Override public void onItemClick(View view, int pos, List<ChatListRowData> list) { // 選択したユーザーの情報を渡す ChatFragment fragment = new ChatFragment(); // fragment間のデータ受け渡しにはBundleが便利 Bundle args = new Bundle(); if (args != null) { args.putString("userName", list.get(pos).getName()); fragment.setArguments(args); } // 画面遷移の準備 FragmentTransaction transaction = getFragmentManager().beginTransaction(); // 左から右へfragmentを重ねるアニメーション transaction.setCustomAnimations(R.anim.slide_in_left, R.anim.slide_out_right); // (1) // ChatListFragmentの上にChatFragmentを重ねる transaction.add(R.id.mainContainer, fragment, "fragment"); // (2) // バックスタックに加える transaction.addToBackStack(null); transaction.commit(); } };(1) Fragment間の画面遷移に好きなアニメーションを利用するために、
FragmentTransaction.setCustomAnimations
を利用しています。
res配下に以下の構成でアニメーションの定義を用意して読み込みます。├res/
├anim/
├slide_in_left.xml
└slide_out_right.xmlslide_in_left.xml<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android"> <translate android:fromXDelta="100%p" android:toXDelta="0" android:duration="@android:integer/config_mediumAnimTime"/> <alpha android:fromAlpha="1.0" android:toAlpha="1.0" android:duration="@android:integer/config_mediumAnimTime" /> </set>slide_out_right.xml<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android"> <translate android:fromXDelta="0" android:toXDelta="100%p" android:duration="@android:integer/config_mediumAnimTime"/> <alpha android:fromAlpha="1.0" android:toAlpha="1.0" android:duration="@android:integer/config_mediumAnimTime" /> </set>(2)
transaction.add
を利用することで、ChatListFragmentの上にChatFragmentを重ねることができます。ChatFragment.java
「< ボタンを押すと左から右へチャット画面のfragmentが消える」実装のコア部分になります。
チャット一覧の各要素のonViewCreatedの部分をピックアップします。
ChatFragment.javaの全文はこちらChatFragment.java@Override public void onViewCreated(View view, Bundle savedInstanceState) { //・・・省略 // <ボタンのリスナー ImageButton backButton = view.findViewById(R.id.backButton); backButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // 画面遷移の準備 FragmentTransaction transaction = getFragmentManager().beginTransaction(); // 右から左へfragmentが消えるアニメーション transaction.setCustomAnimations(R.anim.slide_in_left, R.anim.slide_out_right); // (1) // ChatFragmentを削除 transaction.remove(chatFragment); // (2) transaction.commit(); } }); }(1) ChatListFragmentの記述と同様でOKです。
(2)
transaction.remove
を利用することで、ChatFragmentを削除しています。以上です。
最後に
このアニメーションの動きの再現をするには、どうしても複数のActivityを利用すると上手く決まらず、
Activity自体重いので、1 Activity + N Fragmentの構成にしました。
最近実機にビルドしてもらったのですが、結構カッコよく動いたので嬉しいです!!