- 投稿日:2019-08-11T23:33:29+09:00
[Java]RecyclerViewの使用方法とアニメーション付きスワイプ処理の実装をメモ。
1. はじめに
1.1 お断り
このサイトではQiita内の投稿をいくつかリンクさせていただいております。不愉快だと感じた投稿者様はコメントしていただければ幸いです。対応させていただきます。
1.2 目的
RecyclerView
はとても便利です。僕はListView
の代わりに使っているのですがその実装方法とスワイプの実装を忘れてしまうのでここにメモをします。スワイプのアニメーションはGmail
のメール削除のスワイプをまねます。2. RecyclerView本体
この実装内容は「RecyclerViewの基本」by@naoi様と同じです。とても分かりやすく解説されています。
RecyclerView
の仕組みは少し複雑なので図も覚えとくといいと思いますよ。ここでは以下の四つを制作します。
-adapter_row.xml
-DataModel.java
-ViewHolder.java
-Adapter.java
今回、入れるデータは画像と文字列にしましょう。
2.1 一列のレイアウトを決める (adapter_row.xml)
RecyclerView
の一列のレイアウトを決めます。adapter_row<?xml version="1.0" encoding="utf-8"?> <android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal"> <ImageView android:id="@+id/imageView_adapter_show_bitmap" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <TextView android:id="@+id/textView_adapter_show_string" android:layout_width="match_parent" android:layout_height="wrap_content" /> </LinearLayout> </android.support.constraint.ConstraintLayout>2.2 構造体を作る (DataModel.java)
Javaに構造体はありませんが、
Class
で代用できますよね。DataModel.javapublic class DataModel { private Bitmap mBitmap; private String mString; public Bitmap getBitmap () { return mBitmap; } public String getString () { return mString; } public void setBitmap (Bitmap mBitmap) { this.mBitmap = mBitmap; } public void setString (String mString) { this.mString = mString; } }メンバ変数に
m
を付ける習慣って一般的にはないんですかね...余談ですが「get~」とか「set~」っていうのは
getter/setter
ていうらしいですが、AndroidStudio
で、public
まで打つとメンバ変数のgetter/setter
を作ってくれるそう。ちょっと名前変えたらそれで完成だからありがたい。2.3 一行内のViewを取得 (ViewHolder.java)
ViewHolder
を作ります。ここでxml
本体は指定しませんが一行のなかのView
をfindViewByID()
します。ViewHolder.javapublic class ViewHolder extends RecyclerView.ViewHolder { public ImageView mImageView; public TextView mTextView; // コンストラクタ public ViewHolder (@NonNull View itemView) { super(itemView); mImageView = itemView.findViewById(R.id.imageView_adapter_show_bitmap); mTextView = itemView.findViewById(R.id.textView_adapter_show_string); } }コンストラクタは
RecyclerView.ViewHolder
を継承すると引数にitemView
を追加するように要求されます。2.4 データを配置する (Adapter.java)
Adapter.javapublic class Adapter extends RecyclerView.Adapter<ViewHolder> { private List<DataModel> insertDataList; public Adapter (List<DataModel> list) { this.insertDataList = list; } @NonNull @Override public NoteViewHolder onCreateViewHolder (@NonNull ViewGroup viewGroup, int i) { View inflate = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.adapter_row, viewGroup, false); return new ViewHolder(inflate); } @Override public void onBindViewHolder (@NonNull ViewHolder viewHolder, int i) { noteViewHolder.mImageView.setImageBitmap(insertDataList.get(i).getBitmap()); noteViewHolder.mTextView.setText(insertDataList.get(i).getString()); } @Override public int getItemCount () { return insertDataList.size(); } }3.使い方
Activity
等での使い方は以下の通りです。
Adapterは他のと競合してしまうかも...(僕は実際、違う名前を付けている。)MainActivity.javapublic class RegisterNoteActivity extends AppCompatActivity { RecyclerView mRecyclerViewList; @Override protected void onCreate (Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mRecyclerViewList = findViewById(R.id.recyclerView_main); LinearLayoutManager manager = new LinearLayoutManager(this); mRecyclerViewList.setHasFixedSize(false); mRecyclerViewList.setLayoutManager(manager); mRecyclerViewList.setAdapter(new Adapter(createData())); } private List<NoteDataModel> createData() { List<NoteDataModel> list = new ArrayList<>(); for (int index = 0; index < 100; index++) { // 一行分のデータ NoteDataModel rowData = new NoteDataModel(); rowData.setBitmap(/*なんかの画像*/); rowData.setmString("この行は" + (index + 1) + "回目の繰り返しです。"); list.add(rowData); } return list; } }4. スワイプ
アニメーション付きスワイプを実装しましょう。
実をいうともともとスワイプを実装すると横にずれたり、シュッって消えたりするアニメーションはついてきます。色とアイコンはついてこないのでここを実装すればいいということです。
今回は左スワイプの時のみ削除にします。色は赤でアイコンは自前のゴミ箱マークです。MainActivity.java// ...省略 @Override protected void onCreate (Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_register_note); // ...省略... mRecyclerViewList.setAdapter(new Adapter(createData())); // さっきの // ここから追加 final Drawable deleteIcon = ContextCompat.getDrawable(this, R.drawable.ic_action_delete); ItemTouchHelper.SimpleCallback callback = new ItemTouchHelper.SimpleCallback(0, ItemTouchHelper.LEFT) { @Override public boolean onMove (@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, @NonNull RecyclerView.ViewHolder viewHolder1) { return false; } @Override public void onSwiped (@NonNull RecyclerView.ViewHolder viewHolder, int i) { int swipedPosition = viewHolder.getAdapterPosition(); Adapter adapter = (Adapter) mRecyclerView.getAdapter(); // 登録とかするんだったらなにかのリストから削除をする処理はここ // 削除されたことを知らせて反映させる。 adapter.notifyItemRemoved(swipedPosition); } @Override public void onChildDraw (@NonNull Canvas c, @NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState, boolean isCurrentlyActive) { super.onChildDraw(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive); View itemView = viewHolder.itemView; // キャンセルされた時 if (dX == 0f && !isCurrentlyActive) { clearCanvas(c, itemView.getRight() + (int) dX, itemView.getTop(), itemView.getRight(), itemView.getBottom()); super.onChildDraw(c, recyclerView, viewHolder, dX, dY, actionState, false); return; } ColorDrawable background = new ColorDrawable(); background .setColor(Color.parseColor("#f44336")); background.setBounds(itemView.getRight() + (int)dX, itemView.getTop(), itemView.getRight(), itemView.getBottom()); background.draw(c); int deleteIconTop = itemView.getTop() + (itemView.getHeight() - deleteIcon.getIntrinsicHeight()) / 2; int deleteIconMargin = (itemView.getHeight() - deleteIcon.getIntrinsicHeight()) / 2; int deleteIconLeft = itemView.getRight() - deleteIconMargin - deleteIcon.getIntrinsicWidth(); int deleteIconRight = itemView.getRight() - deleteIconMargin; int deleteIconBottom = deleteIconTop + deleteIcon.getIntrinsicHeight(); deleteIcon.setBounds(deleteIconLeft, deleteIconTop, deleteIconRight, deleteIconBottom); deleteIcon.draw(c); } }; new ItemTouchHelper(callback).attachToRecyclerView(mRecyclerView); } private void clearCanvas(Canvas c, int left, int top, int right, int bottom) { Paint paint = new Paint(); paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR)); c.drawRect(left, top, right, bottom, paint); } // 省略...アイコンの画像や計算、色コード、処理思想は「Android のリストをスワイプして削除する #あれどうやるの?」by@shts様とそのGithubからいただきました。無断ですみません。
スワイプが完了したときに発火するのは
onSwiped
ですが、それに対してキャンセルしたとしても途中に毎フレームごとに呼ばれるのがonChildDraw
です。onMove
はドラッグアンドドロップも許可したとき用だそうですがfalse
を返しとけばいいのかな?追記ですが右スワイプと左スワイプ両方を許可するのは以下の通りにやればいいみたいです。
ItemTouchHelper.SimpleCallback callback = new ItemTouchHelper.SimpleCallback(0, ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT) { @Override public boolean onMove (@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, @NonNull RecyclerView.ViewHolder viewHolder1) { return false; } @Override public void onSwiped (@NonNull RecyclerView.ViewHolder viewHolder, int i) { } @Override public void onChildDraw (@NonNull Canvas c, @NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState, boolean isCurrentlyActive) { super.onChildDraw(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive); if (dX < 0) { // 左スワイプのとき } else { // 右スワイプのとき } } };隠れてぱっと見では見えないけど、一行目の最後、
ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT
になってるので気を付けてください。
onChildDraw
は上記通りなのですが、onSwiped
での処理の分け方はわからないです。(i
を使うのかな?)5.まとめ
まずは参考にさせていただいたサイトの投稿者様誠にありがとうございました。少し雑ではありますがこちらでまとめて紹介させていただきます。
RecyclerViewの基本
RecyclerView本体についてほぼ同じようにまねさせていただたきました。RecyclerViewでドラッグアンドドロップの移動とスワイプの削除
スワイプのイメージをつかみました。Android のリストをスワイプして削除する #あれどうやるの?
スワイプの処理についてJavaに書き直させていただきました。
→画像と詳しい処理は付属のGitHubからです。Android で RecyclerView を使って横スワイプで要素を削除する方法のメモ
JavaでAdapterをどうやて更新するかを参考にしました。RecyclerViewのアイテムをスワイプで削除する方法
投稿外での追加の処理について参考にしました。皆さんありがとうございました。
こうまでして他人のコードを取りまくっていくことでしか処理を生み出せない自分が情けないですが、だからこそだれかのためになれればなと思います。Twitter: https://twitter.com/Cyber_Hacnosuke (フォローしてくださいお願いします。)
いいねもお願いします。
- 投稿日:2019-08-11T22:51:17+09:00
registerTorchCallbackのAPIバージョンmin23設定でハマった
registerTorchCallback を使用した際にハマったことのメモ
APIレベル23(Android6)以降のみで使用できるメソッド。
自分はもともとAndroid5.1まで対応可能なプロジェクトを作成していた(APIレベル22)ため、「使おうとしてるメソッドやと、おたくが設定したAPIレベルじゃ対応でけん端末があるで。ええ具合に修正してや。直さんかったらビルドさせん」エラーが発生。
改めて読んでみると、「AndroidManifestファイルに対応させたい最低限のAPIレベルを書き込むか、build.gradle(モジュール:app)に書き込めや」とのこと。
まず、manifestファイルに以下記述。
AndroidManifest.xml<uses-sdk minSdkVersion="23" />実行してもエラーが直らない。改めてエラーが発生「manifestファイルにminSdkVersionは書かんといてや。 結局gradleファイルから上書きするし」
最初からそう言えや!ということで、build.gradle(モジュール:app)内を確認すると以下記述を発見。こいつがやんちゃしてたか。
build.gradle(module_app)android{ ... defaultConfig{ minSdkVersion 22//←23に修正 ... } }修正後、manifestファイルからは当該項目を削除するとエラーが消えた。
ただし、Android6以前には対応でけん。まあ個人用やしええで。https://developer.android.com/reference/android/hardware/camera2/CameraManager.TorchCallback.html
- 投稿日:2019-08-11T22:33:55+09:00
配列の練習2
ArrayPracticeクラスのフィールド部分で
int[][]arr= new int[3][students];と入れたかったが
エラーが出たので諦め。できるだけ読みやすくなるよう努めた。
メソッドの内容は前の配列練習の文を元に少し手を加えた。ArrayExam.javapackage JavaStudy; //メソッドを分けて配列の練習 //テスト結果(教科名・平均点・科目別最高点・生徒数)を出力 public class ArrayExam { public static void main(String[] args) { final int math = 0; final int english = 1; final int science = 2; ArrayPractice t = new ArrayPractice(20); t.startExam(math); t.startExam(english); t.startExam(science); t.printResult(math); t.printResult(english); t.printResult(science); } }ArrayPractice.javapackage JavaStudy; import java.util.Random; //各項目出力用のメソッドをまとめた public class ArrayPractice { final String[] SUBJECT= {"算数","英語","理科"}; int students = 0; int [][] arr; //インスタンス生成時にクラスの生徒数を受け取る ArrayPractice(int students){ this.students = students; arr = new int[3][students]; } void printResult(int sub) { //結果を出力する System.out.println("試験科目は "+ SUBJECT[sub]+"です。"); System.out.println("生徒数は "+ students +"人です。"); System.out.println("平均点は "+ resultAverage(sub)+"点です。"); System.out.println("最高点は "+ getMax(sub)+"点です。"); System.out.println("-----------"); } int getMax(int sub) { //科目別の最高点を返す int max = 0; for(int i = 0;i < students;i++) { if(arr[sub][i] > max) max = arr[sub][i]; } return max; } void startExam(int sub) { //ランダムな点数(0〜100点)を教科の配列にいれる Random random = new Random(); for(int i = 0;i < students ;i++) arr[sub][i] = random.nextInt(101); } int resultAverage(int sub) { //平均点を返す int sum = 0; int average = 0; for(int i =0;i < students;i++) sum = sum + arr[sub][i]; average = sum/students; return average; } }
- 投稿日:2019-08-11T21:38:57+09:00
OpneJDK8 ビルド on CentOS7_x86_64
OpenJDK8 をソースコードからビルド
参考:http://hg.openjdk.java.net/jdk/jdk/file/tip/doc/building.md
必要パッケージ導入
"開発者ツール"をグループインストール
(*) OSインストール時に"開発者ツール"にチェックをいれた場合は作業不要# yum groupinstall -y "Development Tools"openjdkビルドに必要な依存パッケージ導入
ブートストラップJDKは以前のメジャーリリースのJDKを使用する(OpenJDK7)
(参考)http://hg.openjdk.java.net/jdk8/jdk8/raw-file/tip/README-builds.html#setup# yum install -y java-1.7.0-openjdk-devel # yum install -y libXtst-devel libXrender-devel cups-devel freetype-devel alsa-lib-devel libXt-devel fontconfig-develソースコードDL
バージョン管理ツール Mercurial インストール
# yum install -y hgビルド用のホームディレクトリを /usr/local/src/openjdk8 とする場合
# cd /usr/local/src # hg clone http://hg.openjdk.java.net/jdk8u/jdk8u openjdk8u # cd openjdk8u # chmod +x get_source.sh # ./get_source.shconfigureスクリプト実行
# cd /usr/local/src/openjdk8u # chmod +x configure # ./configuremakeスクリプト実行
# cd /usr/local/src/openjdk8u # make imagesビルドされたJDKの検証
build/linux-x86_64-normal-server-release/images/j2sdk-image 配下にビルド成果物が生成される(JREは j2jre-image 配下)
生成された新たなjavaコマンドバイナリでバージョン確認して検証する# cd /usr/local/src/openjdk8u # cd ./build/linux-x86_64-normal-server-release/images/j2sdk-image # ./bin/java -version
- 投稿日:2019-08-11T21:02:14+09:00
Dateクラスのbefore,afterの結果を数直線で表現してみた
- 投稿日:2019-08-11T19:50:29+09:00
【Java】Mapの使い方
初期化
Mapは型にプリミティブを指定できないので、IntegerやStringのようなラッパークラスを指定すること
Map<Integer, String> map1 = new HashMap<Integer, String>();要素の追加
オブジェクト名.put(キー, "値")
map1.put(1, "apple"); map1.put(2, "orange"); map1.put(3, "cherry");要素の取得
オブジェクト名.get(キー)
map1.get(1); map1.get(2); map1.get(3); System.out.println(map1.get(1)); //出力結果は"cherry"になる※キーが重複した場合
map1.put(1, "apple"); map1.put(2, "orange"); map1.put(1, "cherry"); System.out.println(map1.get(1)); //出力結果は"cherry"になるMap内の要素はキーで値を管理しているため重複はできない。
putで重複したキーに値を入れた時点で以前のものと置き換えられてしまう。要素の削除
一つ削除する場合
オブジェクト名.remove(キー)map1.put(1, "apple"); map1.put(2, "orange"); map1.put(3, "cherry"); map1.remove(1); System.out.println(map1); //出力結果は{2=orange, 3=cherry}となる全削除する場合
オブジェクト名.clear()map1.put(1, "apple"); map1.put(2, "orange"); map1.put(3, "cherry"); map1.clear(); System.out.println(map1); //出力結果は{}になる要素の置き換え
map1.put(1, "apple"); map1.put(2, "orange"); map1.put(3, "cherry"); map1.replace(2, "banana"); System.out.println(map1.get(2)); //出力結果はbananaになるキーの取得
mapに存在するキーを返す
オブジェクト名.keySet()map1.put(1, "apple"); map1.put(2, "orange"); map1.put(3, "cherry"); System.out.println(map1.size()); //出力結果は[1, 2, 3]になるキーの個数を取得
mapに存在するキーの個数を返す
オブジェクト名.keySet()map1.put(1, "apple"); map1.put(2, "orange"); map1.put(3, "cherry"); System.out.println(map1.size()); //出力結果は3になる
- 投稿日:2019-08-11T19:10:00+09:00
【Java】CollectionクラスのComparator
Comparator…コレクションで全体順序付けを行う比較関数
Listの要素を昇順に並び替えたい
public static void main(String[] args) { List<String> list = Arrays.asList("apple","melon","banana","cherry","orange"); Collections.sort(list, Comparator.naturalOrder()); System.out.println(list); }Listの要素を降順に並び替えたい
public static void main(String[] args) { List<String> list = Arrays.asList("apple","melon","banana","cherry","orange"); Collections.sort(list, Comparator.reverseOrder()); System.out.println(list); }
- 投稿日:2019-08-11T18:33:02+09:00
【Java】Listの要素を削除する
要素を一つ削除する
◆要素の値を指定する場合
public static void main(String[] args) { String arr[] = {"orange","apple","cherry","melon","grape"}; List<String> list = new ArrayList<>(Arrays.asList(arr)); list.remove("apple"); }◆要素のINDEX番号を指定する場合
public static void main(String[] args) { String arr[] = {"orange","apple","cherry","melon","grape"}; List<String> list = new ArrayList<>(Arrays.asList(arr)); list.remove(1); }要素を複数削除する
削除したい要素を持つlistを生成し、list.removeAll()メソッドの引数に入れる
public static void main(String[] args) { String arr[] = {"orange","apple","cherry","melon","grape"}; List<String> list = new ArrayList<>(Arrays.asList(arr)); List<String> remove = new ArrayList<>(); Collections.addAll(remove,"apple","melon"); list.removeAll(remove); System.out.println(list); }要素をすべて削除する
全削除なのでlist.sizeは0になる
public static void main(String[] args) { String arr[] = {"orange","apple","cherry","melon","grape"}; List<String> list = new ArrayList<>(Arrays.asList(arr)); list.clear(); System.out.println(list.size()); }
- 投稿日:2019-08-11T18:14:47+09:00
【SpringBoot】スコープ外でAutowireされる内容をMock化する【JUnit5】
背景
@Autowired
を用いるようなCustomValidator
が絡む内容をテストするため、Bean
をMock
化します。やり方
実装は以下の通りです、解説はそれぞれコメントを参照してください。
// この2つを付ければ@RunWith(MockitoJUnitRunner.class)やrule類のアレコレは不要 @ExtendWith(SpringExtension.class) @SpringBootTest class HogeTest { // BeanをMock化、このインスタンスがinjectされる @MockBean FugaDao fugaDao; @Test @DisplayName("Daoから取得できなかった場合") void isEmpty() { // mockに対する設定方法は通常のMockitoを用いる時と同じ when(fugaDao.selectFuga(anyInt())).thenReturn(Optional.empty()); /* 実際のバリデーションについては省略 */ } }補足
以下このやり方に関する補足です。
1
コンストラクタに入力できるなど、自分でインスタンス内容に関与可能な内容については、余程の事情が無ければ直接
Mock
化してテストした方がいいです。2
本来具体的なクラスのテストが
CustomValidator
の実装に左右されるのはおかしいため、CustomValidator
をMock
化する方がよいです。
これについては、調べた限りだとざっくり以下のやり方を見つけました。
- リフレクションを用い、
CustomValidator
をMock
に差し替えるJMockito
やPower Mock
を用い、「そのクラスのインスタンス全てをMock化する」ようにするこの記事では諸事情によりどちらの方法も用いないこととしたため、
Bean
をMock
化する方法でテストを行っています。関連記事
- 投稿日:2019-08-11T17:39:23+09:00
【Java】特定のオブジェクトが含まれているかを判定するListメソッド
list.contains()
特定の要素があるかを判定し、booleanで返す
public static void main(String[] args) { String arr[] = {"orange","apple","cherry","melon","grape"}; List<String> list = new ArrayList<>(Arrays.asList(arr)); if(list.contains("banana")) { System.out.println("存在する"); }else { System.out.println("存在しない"); } }list.indexOf()
特定の要素のINDEX番号をintで返し、存在しない場合は-1を返す
public static void main(String[] args) { String arr[] = {"orange","apple","cherry","melon","grape"}; List<String> list = new ArrayList<>(Arrays.asList(arr)); int x = list.indexOf("orange"); System.out.println(x); if(list.indexOf("orange") != -1) { System.out.println("存在する"); }else { System.out.println("存在しない"); } }
- 投稿日:2019-08-11T16:58:30+09:00
【Java】配列からListへの変換
配列からListへ変換をしたい
public static void main(String[] args) { String arr[] = {"orange","apple","cherry","melon","grape"}; List<String> list = Arrays.asList(arr);arrを引数にしたArrays.asListをlistに代入
要素数を追加したい場合
NG例
List<String> list = Arrays.asList(arr); list.add("banana");(原因)Arrays.asList()は追加や削除といったListのメソッドの操作を受け付けない
OK例
List<String> list = Arrays.asList(arr); List<String> list2 = new ArrayList<>(list); list2.add("banana");listをArrayListの引数にしてlist2に代入
上記を簡潔に書くとList<String> list = new ArrayList<>(Arrays.asList(arr)); list.add("banana");
- 投稿日:2019-08-11T14:47:03+09:00
[Java / Swift]Java Interface と Swift Protocol の比較
この記事で書くこと
Java
interface
と SwiftProtocol
の比較この記事を書いた理由
・ 基本情技術者試験対策
・ Java と Swift で似ている箇所の比較コード例(Java interface)
main.javapublic class Main { interface sampleInterface{ String sampleFunction(String a, String b); } public static void main(String[] args) throws Exception { /* クラスに interface を実装する時は、implements と書く */ class A implements sampleInterface{ public String sampleFunction(String a, String b){ return "「" + a + "」と「" + b + "」はclassAに定義されたsampleFunctionの引数"; } } class B implements sampleInterface{ public String sampleFunction(String a, String b){ return "「" + a + "」と「" + b + "」はclassBに定義されたsampleFunctionの引数"; } } A a = new A(); B b = new B(); System.out.println(a.sampleFunction("c","d")); System.out.println(b.sampleFunction("e","f")); } }出力結果(Java)
「c」と「d」はclassAに定義されたsampleFunctionの引数 「e」と「f」はclassBに定義されたsampleFunctionの引数コード例(Swift Protocol)
sample.swift// プロトコル protocol SampleProtocol{ func sampleFunction(_ a:String, _ b:String) -> String } // class A class A:SampleProtocol{ func sampleFunction(_ a:String, _ b:String) -> String{ return "「\(a)」と「\(b)」はclassAに定義されたsampleFunctionの引数" } } // class B class B:SampleProtocol{ func sampleFunction(_ a:String, _ b:String) -> String{ return "「\(a)」と「\(b)」はclassBに定義されたsampleFunctionの引数" } } var a = A() var b = B() print(a.sampleFunction("c","d")) print(b.sampleFunction("e","f"))出力結果(swift)
「c」と「d」はclassAに定義されたsampleFunctionの引数 「e」と「f」はclassBに定義されたsampleFunctionの引数
- 投稿日:2019-08-11T14:16:12+09:00
[Java]ArrayList HashMap
この記事で書くこと
Javaの
ArrayList
およびHashMap
の書き方書いた理由
基本情報技術者試験対策
コード例
main.javaimport java.util.ArrayList; import java.util.HashMap; public class Main { public static void main(String[] args) throws Exception { // ArrayList ArrayList<String> strList = new ArrayList<String>(); strList.add("sample1"); strList.add("sample2"); System.out.println(strList); strList.remove(1); System.out.println(strList); // HashMap HashMap<String,String> map = new HashMap<String,String>(); map.put("key1","value1"); map.put("key2","value2"); System.out.println(map); System.out.println(map.get("key1")); System.out.println(map.remove("key2")); System.out.println(map); } }実行結果
[sample1, sample2] [sample1] {key1=value1, key2=value2} value1 value2 {key1=value1}
- 投稿日:2019-08-11T13:04:27+09:00
【Programming News】Qiitaまとめ記事 Weekly August 2nd week, 2019 Vol.4
筆者が2019/8/4(日)~8/10(土)に気になったQiitaの記事のまとめのまとめを作成しました。日々のまとめ記事のWeekly版です。
皆様が興味のある言語や思いもよらぬハック方法をこの中から見つけられたら幸いです。
Java
- Tips
- Spring Framework
- Spring Boot
Python
- Django
- Tips
- PyAutoGUIを使ったPythonアプリをexe化するまで
- Kali LinuxにWingIDE(Python統合開発環境)インストール
- Watsonで数独を解く! Decision Optimizerを使ってみた
- pythonのパッケージ階層の話
- Gray-Scottモデルで模様のアニメーションを描く
- Expatを使ってPythonでXMLを解析する話
- PipenvでDjango開発環境をつくる
- 【Python】 Pythonで自己位置推定
- WGANgpで無限にラーメン画像生成する話
- 30行で顔認識(OpenCV)してファイル出力!
- PythonでJSONの入出力(エンコーディングもしっかりと)
- Python + Jinja2 でデータを HTML に埋め込んで JavaScript 側から利用する
- Python スタイルガイドとリンター
- Kaggle
- Tools
Ruby
Rails
- Beginner
- Tips
- RubyのRailsをMySQLでHerokuにあげてみた
- RubyOnRails/自動更新機能の実装
- RubyOnRails/インクリメンタルサーチの実装
- Rails6 のちょい足しな新機能を試す63(db:system:change 編)
- Rails 3-5 複数のデータベースに接続する方法
- Railsのerbをslimに変更する方法
- Rails6新機能 ActionText使用方法
- Rails6 のちょい足しな新機能を試す64(db:seed 編)
- RailsのStrong Parametersを一括で処理するメソッド
- Railsで開発されているOSS
- 本番環境でRailsを起動しようとした時のMysql5.7系に関するエラー
- Rails6 のちょい足しな新機能を試す65(timestamps precision編)
- Railsにdeviseを導入する方法
- deviseの日本語対応
- RailsでS3から画像やPDFファイルをダウンロードする方法
- Railsのサービスクラスを作る前に考えるべきこと
- rails font-awesome-sass導入方法
- AWS利用上のセキュリティを確保する方法
- railsでYoutube data APIを使ってみた
- gem'devise'に頼りすぎていて、sessionとcookieの概念が疎かだったので、まとめる
C#
Android
- Tips
- Androidでグラフを作ってみる
- FragmentでLiveData#observeを使うときの第一引数(Owner)には
viewLifecycleOwner
を使う- Cordova 9.0にバージョンアップする際にハマったこと
- Androidスマホの位置情報をKibanaで可視化してみる
- Android Jetpackのリリース前のバージョンを使う方法
- Android JetpackのApp Crawlerを動かしてみる
- Retrofitの返り値は
Observable
とSingle
などとはどっちがいいか- Activityを再起動させたいけど余分な画面を一枚挟まないといけない…という場合に有効なライブラリ
- AndroidX 導入手順
Swift
- Tips
- Apps
Kotlin
- Tips
Flutter
- Beginner
Fulx
JavaScript
- Beginner
- Tips
React
- Beginner
- Tips
- Apps
Node.js
- Tips
- Express
- Tools
- Apps
Vue.js
- Beginner
- Tips
Vuex
Nuxt.js
- Tips
Nest.js
Angular
jQuery
TypeScript
C#
PowerApps
ReactNative
Laravel
- Tips
C
PHP
CakePHP
Rust
Go言語
- Tips
R言語
- Tips
Scala
Haskell
Unity
Spark
Line
- Tips
- Apps
A-Frame
- Beginner
- Tips
PowerApp
Line
HTML
CSS
Sass
SQL
MySQL
- Tips
PostgreSQL
Oracle
MongoDB
SQL Server
Apache
ビッグデータ
Visual Studio Code
IntelliJ IDEA
AI
IoC
Git
- Beginner
- Tips
AWS
- Beginner
- Tips
- EC2
- AWS Lambda
- LambdaでのCloudWatch LogsからS3へのエクスポート
- Lambda×node.jsでGB単位の動画をStreamAPIでアップロードする方法
- AWS Lambdaでのbundle install
- AWS LambdaとPythonでスクレイピング処理をマイクロサービス化する
- API Gateway + LambdaでAPI Keyの値を取得する
- AWS Lambda:API GatewayとApplication Load Balancerの違い
- CloudWatchの空になったロググループ削除
- LambdaでIAMユーザーのアクセスキーを監視
- AWS Lambdaを使ってAndroid JetpackのリリースをRSSで受け取れるようにした
- Amazon S3
- Amazon MQ
- AWS CDK
- AWS CLI
- AWS SAM
- AWS Clinet VPN
- AWS CloudHSM
- AWS Certificate Manager
- AWS CloudFormation
- AWS CodeCommit
- AWS Textract
- AWS Fargate
- AWS WAF
- AWS Inspector
- DynamoDB
Azure
- Tips
Oracle Cloud
IBM Cloud
Active Directory
Cloud SQL
Cloud9
インフラ
ブロックチェーン
Ethereum
Hyperledger
セキュリティ
機械学習
自然言語処理
Network
RPA
CI
Docker
- Tips
- Dockerイメージをレジストリに登録する(ECR含む)
- Dockerを使ってKali Linuxの環境を構築した時のメモ
- Dockerでrails開発環境構築(リバースプロキシで複数アプリを構築)
- 簡単な静的ページと簡単なAPIサーバーをGoogle Cloud Runで動かす
- Docker上でLaravelを動かしてみよう(laradockなしで)
- AWS (ECS + RDS)+ CircleciによるCI/CDの理解(初学者がインプットすべき情報)~用語と概念理解編~
- Autoware(1.9.1) Docker セットアップ
- Docker for WindowsでDockerイメージを一括削除するワンライナースクリプト
- Laradockでローカルサーバを立ち上げてブラウザ表示する方法
- Docker上にDjangoとReactの環境を構築する
- macにdocker-composeでwordpressをたてる
Heroku
VirtualBox
kubernetes
OpenStack
Swagger
- Tips
AMP
OpenID
OAuth2.0
Elasticsearch
Linux
Cent OS
Windows
Mac
Redis
- Beginner
Google API
Google Apps Script
Google Cloud Platform
Google Colaboratory
Google Cloud Data Catalog
Google Drive
VB.Net
Firebase
Server Side
CSS
BootStrap
WordPress
Develop
- Beginner
- Tips
- Tools
Keras
PowerShell
Vim
Atom
awk
LaTex
Redmine
UML
- Beginner
Raspberry
- Tips
- Apps
RPA
IoT
Alexa
Line
SharePoint
VBA
ShellScript
PowerShell
Slack
Nim
Emacs
WPF
UI
Ansible
Arduino
Julia
Coral
ionic
- Tips
QRCode
OCR
EC-CUBE
- Beginner
資格
転職
更新情報
Kotlin
- Kotlin入門
Android
Java
IDE
- 投稿日:2019-08-11T02:31:33+09:00
3の倍数の出力
8/11追記
・3/0はエラー(ArithmeticException)になるけど、0/3はエラーでない基本ルール:3の倍数は"!!"がつく
1. 入力された数値を1から順に出力
2. 1を逆に出力
3. ランダムな数値を15個出力Nabeatsu.javaimport java.util.Random; import java.util.Scanner; public class Nabeatsu { public static void main(String[] args) { //3の倍数だけアホになる Scanner scan = new Scanner(System.in); int number = scan.nextInt(); for(int i = 1;i <= number; i++) { if(i % 3 == 0) System.out.println(i + "!!"); else System.out.println(i); } for(int i = number;i > 0; i--) { //逆順に if(i % 3 == 0) System.out.println(i + "!!"); else System.out.println(i); } Random random = new Random(); int i = 0; while(i<15) { int ran = random.nextInt(500); if(ran % 3 == 0) { System.out.println(ran+ "!!"); i++; }else { System.out.println(ran); i++; } } } }
- 投稿日:2019-08-11T02:31:33+09:00
3の倍数の出力とエラーの練習
基本ルール:3の倍数は"!!"がつく
1. 入力された数値を1から順に出力
2. 1を逆に出力
3. ランダムな数値を15個出力Nabeatsu.javaimport java.util.Random; import java.util.Scanner; public class Nabeatsu { public static void main(String[] args) { //3の倍数だけアホになる Scanner scan = new Scanner(System.in); int number = scan.nextInt(); for(int i = 1;i <= number; i++) { if(i % 3 == 0) System.out.println(i + "!!"); else System.out.println(i); } for(int i = number;i > 0; i--) { //逆順に if(i % 3 == 0) System.out.println(i + "!!"); else System.out.println(i); } Random random = new Random(); int i = 0; while(i<15) { int ran = random.nextInt(500); try{ if(ran % 3 == 0) { System.out.println(ran+ "!!"); i++; }else { System.out.println(ran); i++; } }catch(Exception e) { //機能しない・・・なぜ? ran/3ではないから? System.out.println("エラー ランダムに選ばれた数が0のため"); System.out.println(e); } } } }
- 投稿日:2019-08-11T00:27:19+09:00
さらばEclipse, Visual Studio Codeでそこそこ軽量JavaFX開発 ~環境構築編~
対象読者(現状の私の状況)
要求
- JavaFXでGUI開発をしようとしている。
- ライトな開発環境がほしい or 宗教上の理由によりEclipseが使えない。
- お布施が払えないのでIntelliJは使えない。
- JDKの導入くらいは自分でできる
- Javaの構文と動きがざっくり分かる
=> 最近Visual Studio CodeのJava開発がアツいらしいので試してみた。
※なお、初学者目線での実用性なので至らない点があればご指摘ください。開発環境
- Windows 10 + Visual Studio Code(1.37.0 執筆時最新)
- OpenJDK 11.0.3 + OpenJFX 11.0.2
- Visual Studio CodeのJava開発用拡張機能導入済み。
Visual Studio CodeへのJava開発環境構築とIntelliSense等を含めた拡張機能の導入方法は他の記事に譲ります(丸投げ)。余談
最近、Java開発用のVisual Studio Codeインストーラーが出ましたが、今回はこれを試していません(Javaの実行環境自体はこれ以前に作っていたため)。どうもJDKがOpenJDKではなくAdoptOpenJDKらしいですね。
事前準備
JavaFXを公式サイトからダウンロードします。
執筆時点ではJDK 12向けとLTSであるJDK 11向けのバージョンが公開されています。
SDKがついている方で、一通りまずは動作させることができるので、SDKの方を導入します。
DL先はこちら
次に、DLしたファイルを任意の場所に展開しておきます。
今回はC:\Users\myuser\Documents\jfx\
に展開したファイルを入れました。設定方法
JavaHomeをVisual Studio Codeの
settings.json
に追加
各自の環境に合わせて追加してください。すでに環境構築済みの場合は追加されているかもしれません。(IntelliSense自体はJavaHomeの設定がなくても動いてしまうため今回はここから設定)
デバッグ構成を追加
Visual Studio Codeのデバッグ設定を追加します。
サイドバーの虫のマーク(バージョンによりアイコンは変動)をクリックし歯車のマークをクリックすると、launch.json
がエディターで起動するのでここに追記を行います。"vmArgs": "--module-path C:\\Users\\myuser\\Documents\\jfx\\javafx-sdk-11.0.2\\lib --add-modules javafx.controls,javafx.fxml"のように、先程展開したJavaFXのlibディレクトリへのPATHと利用するモジュール名を追記します。
これにより、Visual Studio CodeからF5キーでデバッグモードを利用し実行結果を確認できるようになります。
まとめ
ノートパソコンのCPUでEclipseを動かすのは少し厳しいときなど、この方法が役に立つと思います。ただし、Javaの拡張機能自体がそこそこに重いので、Eclipseよりも少しはマシ、位に思うと心理的にも楽です。