覚えたら書く

IT関係のデベロッパとして日々覚えたことを書き残したいです。twitter: @yyoshikaw

Java - Streamの先頭に値を追加したい

Java の Stream(java.util.stream.Stream)で扱っているデータ群の先頭に別の値を追加したい場合
Stream.concat メソッドを使うのがよいと思います。


■ソースコードサンプル

["Dta1", "Data2", "Data3", "Data4"] というデータ群の先頭に "|| Title ||" という値を追加したい という例です。

import java.util.Arrays;
import java.util.List;
import java.util.stream.Stream;

public class StreamTrial1 {

    public static void main(String[] args) {
        List<String> dataList = Arrays.asList("Dta1", "Data2", "Data3", "Data4");

        Stream<String> dataStream = dataList.stream();
        Stream<String> headerStream = Stream.of("|| Title ||");

        // 2つのStreamを結合(headerStream の後ろに dataStream を結合)
        Stream<String> resultStream = Stream.concat(headerStream, dataStream);

        // Streamから配列に変換して中身を確認してみる
        String[] stringArray = resultStream.toArray(String[]::new);
        System.out.println(Arrays.toString(stringArray));
    }
}


■実行結果

[|| Title ||, Dta1, Data2, Data3, Data4]


というわけで、Streamの先頭に値を追加することができました。

Mavenプロジェクトの依存関係にローカルのjarファイルを追加する

すぐ忘れるので自分用のメモです。

ローカルにしかないような ライブラリ(jarファイル)を Mavenプロジェクトの依存関係に追加する場合は pom.xml に以下のように記述します。

        <dependency>
            <groupId>anything-groupId</groupId>
            <artifactId>anything-artifactId</artifactId>
            <version>anything-version</version>
            <scope>system</scope>
            <systemPath>${basedir}/lib/anything-lib.jar</systemPath>
        </dependency>

上記の例で行くと、対象のMavenプロジェクトの下に lib ディレクトリが存在し、そこに anything-lib.jar が配置されているというケースになります。


具体的な記述例は以下のようになりますす。

        <dependency>
            <groupId>nl.fountain</groupId>
            <artifactId>xelem</artifactId>
            <version>3.0</version>
            <scope>system</scope>
            <systemPath>${basedir}/lib/xelem.jar</systemPath>
        </dependency>


jar ファイルは以下のような状態で存在しています。 (IntelliJ IDEA で表示した際の画面キャプチャです)

f:id:nini_y:20220321111517p:plain

Windows 11 で Internet Explorer を起動する

Windows 11 環境で、IE(Internet Explorer)のデスクトップアプリケーションを起動することは流石にできないと思ってました。
が、実は起動する手段が存在することを今さらながらに知りました。

一応自分のPCでも起動することができたので、それに関するメモです。


IEを起動するためのコマンド

IEはVBScript または PowerShell 等で起動することが可能です。

vbs の場合

以下の処理を書いた .vbs ファイルを用意して、それを実行することでIEが起動します。

CreateObject("InternetExplorer.Application").Visible=true

PowerShell

以下を PowerShell で実行するようにすればIEが起動します。

$app = New-Object -ComObject InternetExplorer.Application; $app.Visible = $true

上記だと 白紙ページを最初にIEで開きますが、例えば Googleを初期ページとして開きたい場合は以下のようにすればよいです。

$app = New-Object -ComObject InternetExplorer.Application; $app.Navigate("https://www.google.com/"); $app.Visible = $true


Edgeの設定

上記の方法でIEこそ起動しますが、MS Edgeの "Internet Explorerの互換性" の設定をしておかないと、IEで特定のWebページを開こうとするたびに Edge にリダイレクトされてしまいます。

それをさせずに、IEで直接 Webページを開くには以下設定を行います。


MS Edge のアドレスバーに edge://settings/defaultBrowser を入れて開きます。

開いた設定ページにある「Internet Explorer に Microsoft Edge でサイトを開かせる」の設定値を "なし" に変更します。

f:id:nini_y:20220321183326p:plain

これで Edge の設定はOKです。


IEの状態確認

■IEで適当なWebページを開いた状態 f:id:nini_y:20220321183526p:plain

■IEのバージョン情報を開いた状態 f:id:nini_y:20220322171329p:plain

■タスクマネージャーの状態(Internet Explorer が存在しています) f:id:nini_y:20220321183421p:plain


まとめとか

Windows 11 の環境でもまさかの IE を起動することができました。めでたしめでたし・・??

  • 補足
    • 起動した Internet Explorer をタスクバーにピン留めできますが、ピン留めしたIEのアイコンをクリックするとEdgeが立ち上がります。
    • 本件は、2022年3月時点での情報です。今後この手段ではIEが起動しなくなる可能性があります。

WSL環境へのPostgreSQLのインストール作業メモ

Windows 11のWSL(Ubuntu)環境に PostgreSQL をインストールした際の実行メモです。


■まずは sudo apt update で パッケージ一覧を更新

sudo apt update


■Postgres をインストール

sudo apt install postgresql


■Postgres の再起動を実行

sudo /etc/init.d/postgresql restart


■postgres ユーザにチェンジ

sudo -u postgres -i


■DB用のユーザ作成

createuser -d -U postgres -P db-user01


■作成したDB用のユーザをownerとする新規DBの作成

createdb db-001 --encoding=UTF-8 --owner=db-user01


■postgres ユーザから通常のユーザに戻って、psqlを使用してDBに接続できることを確認

psql -U db-user01 -h localhost -d db-001


全体的な実行のイメージは以下の通りです

ykiv@my-pc:/mnt/c/Users/ykiv$ sudo apt update
・・・
Get:1 http://archive.ubuntu.com/ubuntu focal InRelease [265 kB]
Get:2 http://security.ubuntu.com/ubuntu focal-security InRelease [114 kB]
Get:3 http://archive.ubuntu.com/ubuntu focal-updates InRelease [114 kB]
...
Get:44 http://archive.ubuntu.com/ubuntu focal-backports/universe amd64 c-n-f Metadata [804 B]
Get:45 http://archive.ubuntu.com/ubuntu focal-backports/multiverse amd64 c-n-f Metadata [116 B]
...
ykiv@my-pc:/mnt/c/Users/ykiv$
ykiv@my-pc:/mnt/c/Users/ykiv$ sudo apt install postgresql
...
Success. You can now start the database server using:

    pg_ctlcluster 12 main start

Ver Cluster Port Status Owner    Data directory              Log file
12  main    5432 down   postgres /var/lib/postgresql/12/main /var/log/postgresql/postgresql-12-main.log
update-alternatives: using /usr/share/postgresql/12/man/man1/postmaster.1.gz to provide /usr/share/man/man1/postmaster.1.gz (postmaster.1.gz) in auto mode
invoke-rc.d: could not determine current runlevel
Setting up sysstat (12.2.0-2ubuntu0.1) ...

Creating config file /etc/default/sysstat with new version
update-alternatives: using /usr/bin/sar.sysstat to provide /usr/bin/sar (sar) in auto mode
Created symlink /etc/systemd/system/multi-user.target.wants/sysstat.service → /lib/systemd/system/sysstat.service.
Setting up postgresql (12+214ubuntu0.1) ...
Processing triggers for systemd (245.4-4ubuntu3) ...
Processing triggers for man-db (2.9.1-1) ...
Processing triggers for libc-bin (2.31-0ubuntu9) ...
ykiv@my-pc:/mnt/c/Users/ykiv$
ykiv@my-pc:/mnt/c/Users/ykiv$ sudo /etc/init.d/postgresql restart
 * Restarting PostgreSQL 12 database server                                                                      [ OK ]
ykiv@my-pc:/mnt/c/Users/ykiv$
ykiv@my-pc:/mnt/c/Users/ykiv$ sudo -u postgres -i
Welcome to Ubuntu 20.04 LTS (GNU/Linux 5.10.60.1-microsoft-standard-WSL2 x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage
...
This message is shown once once a day. To disable it please create the
/var/lib/postgresql/.hushlogin file.
postgres@my-pc:~$
postgres@my-pc:~$ createuser -d -U postgres -P db-user01
Enter password for new role:
Enter it again:
postgres@my-pc:~$
postgres@my-pc:~$ createdb db-001 --encoding=UTF-8 --owner=db-user01
postgres@my-pc:~$ logout
ykiv@my-pc:/mnt/c/Users/ykiv$
ykiv@my-pc:/mnt/c/Users/ykiv$ psql -U db-user01 -h localhost -d db-001
Password for user db-user01:
psql (12.9 (Ubuntu 12.9-0ubuntu0.20.04.1))
SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, bits: 256, compression: off)
Type "help" for help.
db-001=> \q
ykiv@my-pc:/mnt/c/Users/ykiv$


Postgresユーザのパスワードを変更

postgres ユーザの DB接続パスワードを "postgres" に変更する。

sudo -u postgres psql で psql 実行して ALTER ROLE postgres WITH PASSWORD でパスワードを変更

ykiv@my-pc:/mnt/c/Users/ykiv$ sudo -u postgres psql
psql (12.9 (Ubuntu 12.9-0ubuntu0.20.04.1))
Type "help" for help.

postgres=# ALTER ROLE postgres WITH PASSWORD 'postgres';
ALTER ROLE
postgres=# 
postgres=# \q
ykiv@my-pc:/mnt/c/Users/ykiv$



関連エントリ

Selenide - Webサイトへアクセスする

以前、Selenium と Chrome (ChromeDriver)を使用してWebサイトへのアクセスを確認しました。


Selenium を使うと手数が増えてしまうようなので、各プログラム言語ごとにSeleniumのラッパーが存在しています。

Java用のライブラリをとして存在している Selenium のラッパーの一つが Selenide です。

Selenideの読み方は、セレニド or セレナイド のようです。


Selenide を使った方がコード量は圧倒的に減りそうです。

とりあえず、Selenideを使ってWebページへアクセスするところまで試しました。


Javaライブラリの準備

pom.xml に以下のように selenide の依存関係を追加します

        <dependency>
            <groupId>com.codeborne</groupId>
            <artifactId>selenide</artifactId>
            <version>6.3.4</version>
        </dependency>

本サンプルでは バージョン 6.3.4 を指定しています。


ソースコード例

ヘッドレスモードにはしていません。

以下はChrome で Googleのページを開いて検索を実行しているというサンプルです。

import com.codeborne.selenide.Configuration;
import org.openqa.selenium.chrome.ChromeOptions;

import static com.codeborne.selenide.Selectors.*;
import static com.codeborne.selenide.Selenide.$;
import static com.codeborne.selenide.Selenide.*;
import static com.codeborne.selenide.WebDriverRunner.getWebDriver;

public class TrialSelenide1 {

    public static void main(String[] args) {
        Configuration.baseUrl = "https://www.google.com";
        Configuration.browser = "chrome";
        Configuration.screenshots = false;
        Configuration.holdBrowserOpen = true; // ここでは処理後にあえてブラウザを閉じないように設定しています。

        // "Chromeは自動テストソフトウェアによって制御されています" の表示を消す (消さなくても害はないです)
        ChromeOptions options = new ChromeOptions();
        options.setExperimentalOption("useAutomationExtension", false);
        options.setExperimentalOption("excludeSwitches", new String[] { "enable-automation" });
        Configuration.browserCapabilities.setCapability(ChromeOptions.CAPABILITY, options);

        // Googleを開く
        open("");

        // ウィンドウの最大化(やる必要は特にないです)
        getWebDriver().manage().window().maximize();

        // Googleで検索を実行
        $(byName("q")).val("覚えたら書く blog.y-yuki.net").pressEnter();
    }

}

ここには、画面キャプチャ等の実行結果は貼り付けていませんが、
上記コードで無事にGoogleのページが開いて検索が実行され検索結果のページが表示されることを確認しました。


まとめ

非常に簡単な例ですが、Selenide で対象のWebページを開いて操作ができました。