- 1. 並行・並列プログラミングと同期・排他制御とイミュータブル性の話〜その2「スレッドと同期・排他制御」
- 2. Kotlin 1.8.0の変更点
- 3. Javaのクラスのアクセス制御と複数クラスの宣言
- 4. Collection.sortを勉強するその2
- 5. 並行・並列プログラミングと同期・排他制御とイミュータブル性の話〜その1「背景: クロック周波数の停滞とコア数の増加」
- 6. Collection.sortを勉強する
- 7. Arrays.asListを勉強する
- 8. java 二次元配列と拡張for文について
- 9. Javaでタグ付きPDFを作成する方法
- 10. 自動型変換 キャスト
- 11. Spring BootでThymeleafとJSPを併用する
- 12. Leetcode 1833. Maximum Ice Cream Bars
- 13. Leetcode 452. Minimum Number of Arrows to Burst Balloons
- 14. Javaのコレクションフレームワーク
- 15. いす作りで考えるfactory methodパターン
- 16. class with final
- 17. JavaでWord、Excel、PowerPoint、PDFからバーコードを読み取る方法
- 18. コレクションとジェネリクス~不変と共変~【Java】
- 19. 【Java】配列とリスト
- 20. MacにJavaをインストールする
並行・並列プログラミングと同期・排他制御とイミュータブル性の話〜その2「スレッドと同期・排他制御」
大学の授業で講義資料を作ったので,Qiitaにも展開しておきます.
この記事シリーズでは,並行・並列プログラミングについて,要(かなめ)となる同期・排他制御の役割をCとJavaを例に簡単なプログラム例を示します.次に同期・排他制御の問題点をCのプログラム例とともに示します.そしてElixir(エリクサー)によって実現されている,全てをイミュータブルにすることによる利点について示します.
シリーズ
1. [並行・並列プログラミングと同期・排他制御とイミュータブル性の話〜その1「背景: クロック周波数の停滞とコア数の増加」](https://qiita.com/zacky1972/items/bfb3bd920f7bcea02c23)
1. **並行・並列プログラミングと同期・排他制御とイミュータブル性の話〜その2「スレッドと同期・排他制御」**(本記事)# スレッド
従来の普通のプログラミング(逐次プログラミングと呼びます)では,プログラム(正確には実行したい「連続した命令列」)を同時に1つしか実行できませんが,並行・並列プログラミングでは,「連続した命令列」を同時に複数実行
Kotlin 1.8.0の変更点
※ソース記事は[こちら](https://kotlinlang.org/docs/whatsnew18.html#updated-jvm-compilation-target)
※Kotlin/JS、Kotlin/Nativeについては割愛します。
[リリース日:2022/12/28](https://kotlinlang.org/docs/releases.html#release-details)
Kotlin 1.8.0リリースが世に出され、ここにいくつかの最大のハイライトがある。
– JVMのための新しいの実験的機能:ディレクトリ内容の再帰的なコピーと削除
– kotlin-reflect性能の改善
– より良いデバッグ経験のための新しい-Xdebugコンパイラオプション
– `kotlin-stdlib-jdk7`と`kotlin-stdlib-jdk8`の`kotlin-stdlib`へのマージ
– Objective-C/Swiftとの相互運用性の向上
– Gradle 7.3との互換性# IDEのサポート
1.8.0をサポートするKotlinプラグインはこちらで利用
Javaのクラスのアクセス制御と複数クラスの宣言
Javaを基礎から復習していて、クラスについて理解が曖昧だった部分があったのでまとめておきます!
注意して書いているつもりですが、誤りがあればご指摘いただければと思います?♂️## クラスに対するアクセス制御レベル
クラスに対するアクセス制御のレベルとしては2つのみです。(⚠️メンバに対しては4つある)
以下にまとめます。
| 名前 | 指定方法 | アクセス許可の範囲 |
| :—: | :—: | :—: |
| package private | 何も書かない | 自分と同じパッケージに属するクラス |
| public | public | どこからでも |なので、クラスを宣言するときは、publicをつけるか何もつけないかの2択になります。
クラスだけでなく、列挙型である`enum`を宣言するときも同じです。
`private class Hoge` とかやってjavacすると、
> 修飾子privateをここで使用することはできませんって怒られます。
## 1つのファイルに複数のクラスを宣言する
1つのファイルに複数のクラスを
Collection.sortを勉強するその2
original classを定義してsortする。
デフォルトはsorteditemに定義したcompareToでソートされる。
comparatorを切り替えることによりsort順をコントロールできる“`java
public class Outer {
public static void main(String[] args) {
Outer o = new Outer();
SortedItem s = o.new SortedItem(“sato”,1);
Listsl = new ArrayList();
sl.add(o.new SortedItem(“aoyama”,3));
sl.add(o.new SortedItem(“yamada”,2));
sl.add(o.new SortedItem(“sato”,1));
Collections.sort(sl); //name,ascending
並行・並列プログラミングと同期・排他制御とイミュータブル性の話〜その1「背景: クロック周波数の停滞とコア数の増加」
大学の授業で講義資料を作ったので,Qiitaにも展開しておきます.
# 背景: クロック周波数の停滞とコア数の増加
コンピュータはクロック周波数に同期して計算をします.おおむね1秒間にクロック周波数の数で示されるだけの数の機械語命令を実行できると考えると良いです.たとえばクロック周波数が1GHzであれば,1GHz=1,000MHz=1,000,000(百万)kHz=1,000,000,000(10億)Hzですので,1秒間に1,000,000,000(10億)個の機械語命令を実行できるというような感じです.もちろんこれは概算です.
いわゆるヘネパタ本(J. L. Hennessy & D. A. Patterson: Computer Architecture: A Quantitative Approach, 6th edition. Morgan Kaufmann, 2017; 邦訳 中條・天野・鈴木訳: コンピュータアーキテクチャ[第6版]定量的アプローチ, 星雲社, 2019)には,このクロック周波数の伸びについて描かれています.
ヘネパタ本によると,1987〜2003年
Collection.sortを勉強する
デフォルトはacending
acending以外にしたい場合、comparatorを作って渡す
sortは、comparatorのcompare結果が0以下となるように並び替える
昇順にしたければp1-p2、降順にしたければp2-p1
“`java
public static void main(String[] args) {
Listli = new ArrayList();
li.add(1);
li.add(100);
li.add(3);
Comparator c = new Outer().new DecendingComparator();
Collections.sort(li);
for(Integer i:li) {
System.out.println(i);
}
System.out.println(“———————-“);
Arrays.asListを勉強する
Arrays.asListは、配列をArrayListに変換
プリミティブ型(下記int)は配列として登録されるため要注意。
“`java
public static void main(String[] args) {
Listsl = Arrays.asList(“a”,”b”);
for(String s:sl) {
System.out.println(s);
}
String[] strarray = {“c”,”d”};
System.out.println(“————————–“);
sl = Arrays.asList(strarray);
for(String s:sl) {
System.out.println(s);
}
System.out.println(“————————–“
java 二次元配列と拡張for文について
## javaの二次元配列について
javaにおいて一次元配列は
` String[] array = new String[5]; `
このように宣言すると
![スクリーンショット 2023-01-06 16.47.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3087483/459e959b-7acb-1bc2-ea75-7d94ee94bddc.png)5つの配列がヒープに確保されてその配列ひとまとまりを参照する参照値がString[]型のarrayに確保されます。
一次元配列と二次元配列の違いは、一次元配列はx軸にしか配列が並ばないのに対して、二次元配列はy軸の方向にも要素が並ぶという違いです。![スクリーンショット 2023-01-06 16.58.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3087483/561e350f-02cc-7ae7-4eab-f4727bdb6633.png)
Javaでタグ付きPDFを作成する方法
タグ付きPDFファイルは、構造要素を持つPDFファイルです。これらは、補助技術に依存するユーザがコンテンツにアクセスできるようにするために使用されます。[Spire.PDF for Java](https://jp.e-iceblue.com/introduce/spire-pdf-for-java.html)は、Javaアプリケーションで**タグ付きPDFを作成する**ことをサポートしています。この記事では、**テキスト、画像、図形、表などのPDF要素にタグを追加する方法**について説明します。
– **[テキストにタグを追加する](#テキストにタグを追加する)**
– **[画像にタグを追加する](#画像にタグを追加する)**
– **[表にタグを追加する](#表にタグを追加する)**
## 【依存関係の追加】
この方法は、Spire.PDF for Javaが必要ですので、先にjarファイルをインポートしてください。
### 1. Maven
Maven を使用している場合、プロジェクトの pom.xml ファイルに以下のコードを追加することで、簡単にアプリケーションに JAR
自動型変換 キャスト
***型変換***
「+」などの操作は同じデータ型同士じゃないとできません。
型の違うものを演算するときは、型を変換し同じ型にする必要があります。
javaでは自動変換あります。“`java:Main.java
System.out.println(“佐藤さんは”+20+”歳です”);
“``String型`と`int型`を足すと、`int型`が自動で`String型`に変換されて、文字列として結合されます。
“`
“佐藤さん” + “20” + “歳です”
“`
こんな感じです。
なので、出力は
“`text:java.コンソール
佐藤さんは20歳です
“`
***計算時の自動変換***`int型`と`double型`の計算結果は`double型`になります。
計算の過程でint型がdouble型に変換されます。ここで、今まで触れてなかったので補足です。
`double型`とは、小数を表すデータ型です。
“`
5 int型
3.14 double型
“`
他にも多くのデータ型があります。それを全て説明するのは、今の私にはまだ無理なので、
Spring BootでThymeleafとJSPを併用する
本来、Spring BootによるWebアプリケーションで使用するViewはThymeleafを使用することが望ましいのですが、古いプロジェクトでJSPを使用しているWebアプリケーションをThymeleafに移行する場合等、一度に全ての画面をThymeleafに移行出来ない場合にJSPと併用する方法を紹介します。
## 開発環境
* Spring Tools Suite (STS) 4
* JDK 8
* Spring Boot 2.7.7## 前提
Spring Bootのプロジェクトで既にJSPを使用したWebアプリケーションに対してThymeleafと共存させるための手順をです。
従いまして、Spring BootプロジェクトでJSPを使用する際の手順は含まれておりません。:::note warn
JSPを使用していない既存プロジェクトであれば敢えてJSPと併用するメリットはありません。
:::## Maven依存関係の設定
pom.xmlにthymeleafの依存関係を追加します。
* spring-boot-starter-thymeleaf
* spring
Leetcode 1833. Maximum Ice Cream Bars
https://leetcode.com/problems/maximum-ice-cream-bars/
## 難易度
### Medium## アプローチ
### Brute-force“`java
class Solution {
public int maxIceCream(int[] costs, int coins) {
Arrays.sort(costs);
int result = 0;
for (int c : costs) {
coins -= c;
if (coins < 0) { break; } result++; } return result; } /* WA public int maxIceCream_WA(int[] costs, int coins) { Arrays.sort(c
Leetcode 452. Minimum Number of Arrows to Burst Balloons
https://leetcode.com/problems/minimum-number-of-arrows-to-burst-balloons/description/
## 難易度
### Medium## アプローチ
### Brute-force“`java
class Solution {
public int findMinArrowShots(int[][] points) {
Arrays.sort(points, (a, b) -> Integer.compare(a[1],b[1]));int result = 1;
int prev = 0;for(int curr = 1 ; curr < points.length; curr++){ if(points[curr][0] > points[prev][1]){
result++;
prev = curr;
}
Javaのコレクションフレームワーク
## コレクションフレームワークとは
**コレクションフレームワーク**とは、コレクション(オブジェクトの集合、プログラムの中で複数のオブジェクトを管理するためのクラスやインタフェースを総称してコレクションと呼ぶ)を操作するために用意されたJava標準のAPIで、用途に応じて、リスト(List)、Set(セット)、Map(マップ)、Queue(キュー)といったインターフェイスを使い分けることができる。コレクションに求められる機能には、例えば次のようなものがある。
・**膨大な数のオブジェクトから目的のオブジェクトを素早く取り出したい**
・**同じインスタンスヘの参照が重複して格納されることのないようにしたい**
・**キーワードを使って目的のオブジェクトを取り出せるようにしたい**
・**特定の値で順番に並べ替えたい**コレクションフレームワークの実装クラスは、[実装スタイル][インターフェイス名]の形式で命名されている。
| コレクションフレームワークの主な実装クラス | | |
| — | — | — |
| インターフェイス | 実装クラス | 概要
いす作りで考えるfactory methodパターン
factoryを使わないパターン
①いす職人にウォールナットの木材で椅子を作るよう指示factoryを使うパターン
①ウォールナット材職人に木材用意するよう指示
②いす職人に指定の木材職人から渡された木材で椅子を作るよう指示
※どんな木材かは意識しない。登場クラスと紐づけ
iSample・・・広義の木材
Sample・・・ウォールナット材
iCreator・・・広義の木材職人
Creator・・・ウォールナット材職人
Logic・・・いす職人プログラム
“`java
class Sample implements ISample {
}
interface ISample {
}
interface ICreator {
public ISample create();
}
class Creator implements ICreator{
@Override
public ISample create() {
return new Sample();
}
}
class Logic {
private I
class with final
finalをつけたクラスはextendsできない
“`java
final public class SampleFinalClass {
int i;
void method(){};
}
public class SampleSubClass extends SampleFinalClass {
int i;
}
“`
“`
Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.1:compile (default-compile) on project mavenproject1: Compilation failure
com/mycompany/mavenproject1/SampleSubClass.java:[11,37] final com.mycompany.mavenproject1.SampleFinalClassからは継承できません
“`
JavaでWord、Excel、PowerPoint、PDFからバーコードを読み取る方法
バーコードは、バーとスペース(またはドット)で構成され、数字や文字を機械で読み取ることができる表現方法である。今日、バーコードは食料品店、医院、法律事務所、郵便局、小売店など、数え切れないほど広く使われている。Code39、Code128、PDF417、DataMatrix、QRなどのバーコードを様々な種類の文書(Word、Excel、PowerPoint、PDFなど)から読み取ることができることは、実に有益なことであると言えます。
今回は、[Spire.Office for Java](https://jp.e-iceblue.com/introduce/spire-office-for-java.html)を使って、Javaで**MS Office文書やPDFからバーコードを読み取る方法**について紹介します。このライブラリでは、よく見かける40種類以上の1次元・2次元バーコードがサポートされています。
– **[JavaでWordからバーコードを読み取る](#javaでwordからバーコードを読み取る)**
– **[JavaでExcelからバーコードを読み取る](#javaでe
コレクションとジェネリクス~不変と共変~【Java】
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/650867/fb48906b-bf43-d5d4-360a-df5d8aff45da.png)
この記事ではコレクションとジェネリクスを使いこなせるようになるための基礎知識をまとめています。
ラムダ・ストリーム・オプショナルを使いこなす基礎としても。# 1. コレクションとは?
Javaでは提供されている、複数のデータを扱うためのクラスのこと。配列よりも柔軟に複数のデータを扱える。配列は作成された時点で要素数が固定され、状況に応じて柔軟に要素数を変更したい処理には適さない。コレクションを利用すれば、要素数の変更にも柔軟に対応できる。
この記事では集合オブジェクトという言葉には
– 配列
– コレクションを含めます。上記の通り、コレクションと配列を区別します。
コレクションといえば下記で紹介するものになります。
## 1-1. コレクションの種類
– リスト(List) 順序通りに並べて格納
– セット(Set) 順
【Java】配列とリスト
# はじめに
プログラミング初学者の者です。オンラインでプログラミングを学習させて頂いてるのですが、さらに理解を深めていきたいと思い、学習したことを備忘録として、残して理解を深めていきたいと思います。
また、間違った点など、ありましたら、ご指摘いただけると幸いです。よろしくお願いします。# Rubyの配列との違い
Javaの配列は、Rubyの配列と性質が異なります。Javaの配列は、格納する要素の数を最初に決める必要があり、かつ後で要素数を変更することができないようです。
要素を増やす場合は、サイズの大きな配列に新たに作成して元データをコピーするか、ArrayListというリストの一種を使用します。
# Javaの配列
“`java
class Main {
public static void main(String[] args) {
int[] scores;
scores = new int[3];scores[0] = 1;
scores[1] = 5;
scores[2] = 10;System.ou
MacにJavaをインストールする
# Javaのインストール
“`bash
# 最新のJavaをインストール
brew install openjdk# パスを追加
echo ‘export PATH=”/opt/homebrew/opt/openjdk/bin:$PATH”‘ >> ~/.zshrc# 現在のバージョンを確認
java -version
“`# バージョンを切り替える場合
“`bash
# cask-versionsをインストール
brew tap homebrew/cask-versions# jenvをインストール(※バージョンを切り替えたりする場合)
brew install jenv# jenvのパスを追加(※バージョンを切り替えたりする場合)
echo ‘export PATH=”$HOME/.jenv/bin:$PATH”‘ >> ~/.zshrc
echo ‘eval “$(jenv init -)”‘ >> ~/.zshrc# ディレクトリを作成
mkdir -p ~/.jenv/versions# jenvにJDKを追加
jenv add `/u