No Programming, No Life

プログラミング関連の話題や雑記

Kotlinで二つのリストの要素をペアにしたリストやマップにまとめる

f:id:fumokmm:20191207000933p:plain

zipメソッド

Kotlinでzipはどうやるのかな?と思って調べた内容です。いろいろありそうだけど、とりあえずシンプルなものをメモしておく。 Kotlinにはそのものズバリの zip というメソッドが List や Array に用意されている。

list.zip

val list1 = listOf("A", "B", "C")
val list2 = listOf(100, 200, 300)
println(list1.zip(list2))

Output

[(A, 100), (B, 200), (C, 300)]

array.zip

val array1 = arrayOf("a", "b", "c")
val array2 = arrayOf(400, 500, 600)
println(array1.zip(array2))

Output

[(a, 400), (b, 500), (c, 600)]

出力結果の (A, 100) などの部分は、Pair<out A, out B> 型となっているようです(ところでoutってなんだ?勉強不足)。

さて、これでペアのリストが得られた。例えば以下のようにすれば、1番目の最初の要素 "a" が取得できる。

array1.zip(array2)[0].first // => "a"

associateメソッド

さて、次はマップにまとめたい。それには Collection#associate を使うといいらしい。ペアのリスト List<Pair<A, B>> をアソシエイトすると、マップ Map<A, B> が出来上がるようだ。

associate map

val list1 = listOf("A", "B", "C")
val list2 = listOf(100, 200, 300)
println(list1.zip(list2).associate{ it })

Output

{A=100, B=200, C=300}
200

いい感じにマップが得られた。使い心地はこんな感じ。

list1.zip(list2).associate{ it }["B"] // => 200

参考

zip - Kotlin Programming Language

Pair - Kotlin Programming Language

【Kotlin】複数の値を返したい! - Qiita

associate - Kotlin Programming Language

Kotlin の Collection まとめ ~List編~ - Qiita

Kotlinでクラスパス上にあるプロパティファイルを読み込む

f:id:fumokmm:20191207000933p:plain

クラスパス上にあるプロパティファイルを読み込むには・・・?

Javaだとクラスパス上にあるリソースを読み込むにはJavaクラスクラス(Class<?>のクラス)の利用するがKotlinだとどうするのかな?と思って調べたもの。 Javaクラスクラスを参照するには、this.javaClassとすればいいらしい。クラスローダーも.classLoaderでいいみたい。 以下は簡単なクラスパスの通ったディレクトリに置かれたプロパティファイルを読み取るサンプル。

Main.kt

import java.io.File
import java.io.InputStreamReader
import java.net.URL
import java.util.*

class PropertiesReadSample1 {
    fun readProperty() {
        val prop = Properties()
        val resource: URL? = this.javaClass.classLoader.getResource("sample.properties")
        InputStreamReader(resource?.openStream(), "UTF-8").use { inStream ->
            prop.load(inStream)
            println("ooo's value is ${prop.getProperty("aaa")}")
            println("bbb's value is ${prop.getProperty("bbb")}")
            println("ううう's value is ${prop.getProperty("ううう")}")
        }
    }
}

fun main(args: Array<String>) {
    PropertiesReadSample1().readProperty()
}

sample.properties [UTF-8] (クラスパスの通ったディレクトリに置くこと)

aaa=100
bbb=200
ううう=300

Output

ooo's value is 100
bbb's value is 200
ううう's value is 300

ちょっと脇道に逸れるけど、Propertiesファイルってnative2asciiしなくても大丈夫になってたのね。

参考

Kotlinでクラスオブジェクトを参照する(Javaのクラス名.classの代わり) - Qiita

[Java] getResourceAsStreamの使い方

Javaリソース・プロパティーメモ(Hishidama's Java resource/property Memo)

Java 9 でようやくResourceBundle のデフォルト文字コードが UTF-8に - yanok.net

SQL Server 2017のIntegration Services(SSIS)に、SQL Server Management Studio(v18.4)から接続できなかった話

SQL ServerSSIS環境を構築してテストする必要があり、ローカル環境にSQL Server 2017のデータベースとIntegration Services(SSIS)、それからSQL Server Management Studio(SSMS)をインストールしてテストしていた時の話。めちゃめちゃニッチだが誰かの役に立つかもしれないのでメモとして残しておく。

Integration Servicesに接続できない

SQL ServerとSSMSのインストールは正常終了。だけど、以下のようなエラーが発生し接続できなかった。

f:id:fumokmm:20191201231539j:plain
IntegrationServicesに接続
f:id:fumokmm:20191201231710j:plain
接続エラー

バージョンを揃えたらエラー内容が変わった

こちらによると、

SQL Server Integration Services (SSIS) - SSMS バージョン 17.x 以降では、レガシ SQL Server Integration Services サービスへの接続はサポートされません。 以前のバージョンのレガシ Integration Services に接続するには、SQL Server のバージョンに対応する SSMS のバージョンを使用します。 たとえば、レガシ SQL Server 2016 Integration Services サービスに接続する場合は、SSMS 16.x を使用します。

SQL Serverの方と、SSMSの方のバージョンを合わせておく必要があることが分かった。 SQL Serverの方はバージョン2017なので、それに合わせて、SSMSもv17.9.1をインストール。 その後、v17.9.1のSSMSから接続を試みてみたら、エラーメッセージが変わった。おお、少し希望の光が見えてきた。

f:id:fumokmm:20191201232411j:plain
エラーメッセージが変わった、少し希望が見えた

管理者権限で実行

こちらによると、管理者権限で実行してみるといいらしい。 ということで、管理者権限でSSMS自体を起動したらめでたく接続できました。良かったー。

f:id:fumokmm:20191201232959p:plain
SSMSを管理者権限で実行(右クリック→その他→管理者として実行)

f:id:fumokmm:20191201233231j:plain
接続できた!

それにしてもツールの上位互換を切り捨てているなんてMicrosoftさんらしくないな。最近はそうでもないのかな?分らんけど。

おわり。

参考

SQL Server Management Studio (SSMS) のダウンロード - SQL Server | Microsoft Docs

SSISに接続できない

ThunderbirdのProfilesをシンボリックリンクで別フォルダに指定

Thunderbirdの1アカウント、1プロファイルという設定ファイルで管理されているみたい。 各プロファイルはデフォルトで以下フォルダのProfilesフォルダに配置されている。 環境はWindows10です。

C:\Users\<ユーザ名>\AppData\Roaming\Thunderbird\Profiles

Profilesフォルダの下には、各メールプロファイルのフォルダが入るようになっている。 ちょっとCドライブに置かれると容量の問題などで困るため、 Profilesフォルダごと実態をOneDrive管理のフォルダの方に作っておいて、 そちらにProfilesのシンボリックリンクを張ることにした。 (ちなみに、各Profileがどこにあるかは、上記Thunderbirdフォルダのprofiles.iniにて管理されている。今回は内容は割愛)

シンボリック作成コマンド(PowerShell)は以下のような感じ(管理者で実行)

Windows PowerShell
Copyright (C) Microsoft Corporation. All rights reserved.

新しいクロスプラットフォームの PowerShell をお試しください https://aka.ms/pscore6

PS C:\Windows\system32> cd C:\Users\<ユーザ名>\AppData\Roaming\Thunderbird
PS C:\Users\<ユーザー名>\AppData\Roaming\Thunderbird> New-Item -Path . -Name Profiles -ItemType SymbolicLink -Value "<Path to OneDrive>\Profiles"

    ディレクトリ: C:\Users\<ユーザ名>\AppData\Roaming\Thunderbird


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
d----l       2019/12/01     14:36                Profiles


PS C:\Users\<ユーザ名>\AppData\Roaming\Thunderbird>

できあがり f:id:fumokmm:20191201144148p:plain

これでメールデータ自体はクラウドでもバックアップされるし将来の移行も簡単になる。

Windowsでもシンボリックリンクが使える話

f:id:fumokmm:20191121224631p:plain

(illust by いらすとや)

実は

WIndows7のころから、実はWindowsでもシンボリックリンクが使えるようになっていた。現場ではあまり実用されているところにお目にかかったことがないのだが、色んなフォルダから同じファイルをツツきたいなと思い、ふとWindowsでもそういえばシンボリックリンクが使えるんじゃなかったっけ?と思い出した次第。

MKLINKコマンド

早速ですが構文を示す。こちらを参考。

mklink [[/d] | [/h] | [/j]] <Link> <Target>

このメイクリンク(と読むのかな?)コマンドはシンボリックリンクハードリンク、あとジャンクションが作成できる。ん?ジャンクションって何だ?詳しい説明は参考にしたサイトを見てほしい。簡単に言うと、シンボリックリンクと同じようなものだ。 ハードリンクはまぁちょっと考え方が違うので、また別の機会に記事にでもするとして、今回はシンボリックのお話。

ファイルのシンボリックリンク

mklink <シンボリックリンク名> <ファイルへのパス>

ファイルの場合はオプション要らない。

フォルダのシンボリックリンク

mklink /d <シンボリックリンク名> <ファイルへのパス>

ディレクトリの場合は/dオプションを付ける。

なお、ファイルへのパスは相対参照でも絶対参照でもいけるみたい。

例 (Win10で試したところ)

以下は、現在のバージョンのJDKのフォルダを指すシンボリックリンクC:\tempに作成する例だ。C:\tempに移動してから以下のようにする。

mklink /d java-currentver "C:\Program Files\Java\jdk-13.0.1"

なお、コマンドプロンプトは管理者権限で実行する必要がある。Win + Rcmdと打って、Ctrl + Shift + Enterで管理者権限でコマンドプロンプトが立ち上がる。

f:id:fumokmm:20191121232659p:plain

出来上がったシンボリックリンクを見た目はショートカットと同じ f:id:fumokmm:20191121232703p:plain

中に入ってみると、tempの下にjava-currentverがあるように見える。 f:id:fumokmm:20191121232704p:plain

参考にしたサイト

docs.microsoft.com

dev.classmethod.jp

www.atmarkit.co.jp

qiita.com

IT用語斜め読み - サプスクリプション

f:id:fumokmm:20191117132854j:plain (photo by Pixabay)

最近のIT用語検索トレンド

いつもお世話になってるいる IT用語辞典 e-Wordsさんの 2019年11月17日(日)のアクセスランキングを見てみると、

1位 JavaBeans 2位 インフラ 3位 サインイン 4位 ディスパッチ 5位 Web 6位 API 7位 Apache 8位 サブスクリプション 8位 ツール 10位 ステアリングコミッティ 10位 HD 10位 モダナイゼーション

となっていました。今回はこの中で気になった8位のサプスクリプションについてです。  

サプスクリプションって何?

最近お仕事でMicrosoft Officeが必要になったため、Office365 for Businessを購入しました。その際にもサプスクリプションという単語が出てきて良く分からないなぁと思っていました。

サブスクリプション 【subscription】 別名: サブスクライブsubscribe サブスクリプションとは、予約購読、購読料、会費、寄付(金)、出資(金)、応募、申込、加入、署名、承諾などの意味を持つ英単語。雑誌などの定期購読といった意味があり、ITの分野ではこの意味を元に、会員制のサービスへの加入や、定期的に利用権を更新するソフトウェアの販売方式などを指すことが多い。

IT用語辞典 e-Words より 

なるほど、定期購読ね。製品を一括で購入するのではなく、月々など、定期的に支払いをすることで、そのソフトウェアの使用権を得る感じですね。Kindle Unlimitedとか、Apple Musicとかもこのスタイルですね。

今回のOffice365に関して言えば、常に更新が入って最新版のOffice環境が手に入り、月々1,000円程度といった感じです。買い切りよりも良いんじゃないかな?と個人的には思います。

ビジネスモデル

今後のアプリケーションのビジネスモデル的に見ても、このサプスクリプションの流れが主流になってきているのではないかな?思います。 今は誰でもがスマートフォンを持っ時代ですし、昔のように、固定端末で一度最初にインストールしたアプリをずっと固定で使い続けるという機会も減ってゆくと思います。 かわりにサプスクリプションで月額料料金を支払って、最新版アプリをどこの環境でも利用できる、そんな感じの世の中になってきていますね。

おわりに

私も、長らく使い続けてもらえるような素敵なアプリを作っていけたらなと思います。

ExcelのHYPERLINK関数で同一ブック内の別シートにリンクしたい場合は # を付けるといいみたい

f:id:fumokmm:20191116175057j:plain ( photo by ぱくたそ )

Excelの同一ブック内でセルにハイパーリンクをはってシート間をジャンプさせたいことがある。普通だとハイパーリンクの挿入(Ctrl + K)とかで挿入すると思うが、標準のHYPERLINK関数でも実現できる。

HYPERLINK関数

HYPERLINK(リンク先, [別名])

さて、同一ブック内で別シートにリンクをはりたい場合についてですが、マイクロソフトのヘルプを見ると、こんな感じになっている。

サーバー内のフルパス

=HYPERLINK("\\FINANCE\Statements\1stqtr.xlsx", D5)

ローカルPCのフルパス

=HYPERLINK("D:\FINANCE\1stqtr.xlsx", H10)

ブック名とシート名のフルパス

=HYPERLINK("[Book1.xlsx]Sheet1!A10","Go to Sheet1 > A10")
  または
=HYPERLINK(CELL("address",Sheet1!A10),"Go to Sheet1 > A10")

などが書いてあるんだけど、いちいちファイル名(ブック名)まで指定するのは大変だし、リネームされる可能性もあるので埋め込みたくない。そんな時のためにCELL関数を使ったら?ということみたいなんだけど、ファイル名(ブック名)にリンクが使えなくなる文字とかもあったはずで、とても困ることになる。

f:id:fumokmm:20191116183745p:plain

こんな感じでリンクが使えないことがある!

解決方法

リンク先文字列の頭に # をつけるといいみたいです。こんな感じ。

同一ブック内の別シート

=HYPERLINK("#Menu!A1", "Go to menu")

同一ブック内の同一シートの別セル

=HYPERLINK("#A1", "Go to A1")

この # をつける方法はこちらで知ったのですが、マイクロソフトのヘルプにも書いてないんだよなぁ。どうなってるんだ。

参考

HYPERLINK 関数 - Office サポート

Excel(エクセル)基本講座:HYPERLINK関数の使い方

HYPERLINK関数で、同じブック内のシートにハイパーリンク:Excel(エクセル)の関数・数式の使い方/検索・行列