No Programming, No Life

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

Windows環境にElixirをインストールする

f:id:fumokmm:20191211185242p:plainf:id:fumokmm:20191211185740j:plain:w180:h150

突然、ElixirをやりたくなったのでWindows環境にインストールしてみた。 その時のインストール手順のスクリーンショットを貼っておきます。 環境やバージョンなどは以下の通り。

環境

バージョン
OS Windows 10 64bit
Elixir 1.9.4

手順

1. 公式サイトからインストーラーのexe1をダウンロード。

2. Click next, next, …, finish

elixir-websetup.exe を起動

f:id:fumokmm:20191211184828p:plain

バージョンは1.9.4を選択

f:id:fumokmm:20191211184833p:plain

そういえばElixirはErlang VM上で動くんだった

f:id:fumokmm:20191211184839p:plain

f:id:fumokmm:20191211184844p:plain

f:id:fumokmm:20191211184850p:plain

f:id:fumokmm:20191211184855p:plain

f:id:fumokmm:20191211184902p:plain

f:id:fumokmm:20191211184907p:plain

f:id:fumokmm:20191211184913p:plain

f:id:fumokmm:20191211184919p:plain

f:id:fumokmm:20191211184925p:plain

f:id:fumokmm:20191211184930p:plain

f:id:fumokmm:20191211184935p:plain

f:id:fumokmm:20191211184940p:plain

f:id:fumokmm:20191211184945p:plain

f:id:fumokmm:20191211184949p:plain

f:id:fumokmm:20191211184954p:plain

インストール完了!

f:id:fumokmm:20191211184958p:plain

スタートメニューから起動してみよう

f:id:fumokmm:20191211185003p:plain

Elixirの方を起動

f:id:fumokmm:20191211185008p:plain

こちらは Erlang

f:id:fumokmm:20191211185014p:plain

おしまい。

参考

Elixir

Elixir for Windows - Qiita

2行でWindowsにElixirをインストールするたった一つの冴えているようなやり方 - Qiita

Logbackで開始時に出るLogback自身のログの出力をやめたい

f:id:fumokmm:20191211191500p:plain

Logback自身のログが最初に大量に出る

logbackを導入したときに、プログラム開始時にlogback自身のログが大量に出ることがあります。こんな感じで。 f:id:fumokmm:20191210214110p:plain

調べてみると、NopStatusListener というのを指定するだけで、消せるみたい。

logback.xml

<!-- Stop output INFO at start -->
<statusListener class="ch.qos.logback.core.status.NopStatusListener" />

消えました

f:id:fumokmm:20191210214128p:plain

参考

How to stop logback status INFO at the start of every log? – Mkyong.com

How to prevent logback from outputting its own status at the start of every log? - Stack Overflow

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