VS Code デバッグ環境 on Windows

VS CodeでKotlin, C#, VB.NET, Javaを動かす環境構築メモ。

Extensions

まずはVS Code拡張機能をインストール

.NET(C#, VB.NET)

1.Visual Studio 2019をインストール

C# 6.0(VS2015)から追加された「String Interpolation」を使用するため
※VS2019のコンパイラじゃなくてもいいなら2へ

String Interpolation(文字列補間)はこんなやつ

var x = 10;
var y = 20;

// C# 6.0以降
var str1 = $"{x}, {y}";

// C# 5.0以前
var str2 = string.Format("{0}, {1}", x, y);

2.環境変数のPathに追加

Code Runner実行時(コンパイル時)のコマンドcscvbc
Visual Studioコンパイラを使用するよう設定

C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\MSBuild\Current\Bin\Roslyn

string.Formatでもいい場合はVS2019をインストールしなくても
下記をPathに追加すればOK
※下記のパスやコンパイラがあるか要確認

C:\Windows\Microsoft.NET\Framework64\v4.0.30319

Kotlin

下記を参照

ymdevx3.hatenablog.com

Java

1.JDKをインストール

2.環境変数のPathに追加

※Versionは確認して適宜変更

C:\Program Files\Java\jdk1.8.0_60\bin

3.settings.jsonを編集

{
    "java.home": "C:\\Program Files\\Java\\jdk1.8.0_60",
}

Code Runner

下記参照

github.com

executorMapByFileExtension.vb.kt
executorMapjavacsharpのように設定すればOK

{
    "code-runner.runInTerminal": true,
    "code-runner.saveFileBeforeRun": true,
    "code-runner.cwd": "C:\\work",
    "code-runner.executorMapByFileExtension": {
        ".vb": "cd $dir && vbc /nologo $fileName && $fileNameWithoutExt",
        ".vbs": "cscript //Nologo",
        ".scala": "scala",
        ".jl": "julia",
        ".cr": "crystal",
        ".ml": "ocaml",
        ".exs": "elixir",
        ".hx": "haxe --cwd $dirWithoutTrailingSlash --run $fileNameWithoutExt",
        ".rkt": "racket",
        ".scm": "csi -script",
        ".ahk": "autohotkey",
        ".au3": "autoit3",
        ".kt": "cd $dir && kotlinc $fileName -include-runtime -d $fileNameWithoutExt.jar && java -jar $fileNameWithoutExt.jar",
        ".kts": "kotlinc -script",
        ".dart": "dart",
        ".pas": "cd $dir && fpc $fileName && $dir$fileNameWithoutExt",
        ".pp": "cd $dir && fpc $fileName && $dir$fileNameWithoutExt",
        ".d": "cd $dir && dmd $fileName && $dir$fileNameWithoutExt",
        ".hs": "runhaskell",
        ".nim": "nim compile --verbosity:0 --hints:off --run",
        ".csproj": "dotnet run --project",
        ".fsproj": "dotnet run --project",
        ".lisp": "sbcl --script",
        ".kit": "kitc --run"
    },
    "code-runner.executorMap": {
        "javascript": "node",
        "java": "cd $dir && javac -encoding UTF-8 $fileName && java $fileNameWithoutExt",
        "c": "cd $dir && gcc $fileName -o $fileNameWithoutExt && $dir$fileNameWithoutExt",
        "cpp": "cd $dir && g++ $fileName -o $fileNameWithoutExt && $dir$fileNameWithoutExt",
        "objective-c": "cd $dir && gcc -framework Cocoa $fileName -o $fileNameWithoutExt && $dir$fileNameWithoutExt",
        "php": "php",
        "python": "python -u",
        "perl": "perl",
        "perl6": "perl6",
        "ruby": "ruby",
        "go": "go run",
        "lua": "lua",
        "groovy": "groovy",
        "powershell": "powershell -ExecutionPolicy ByPass -File",
        "bat": "cmd /c",
        "shellscript": "bash",
        "fsharp": "fsi",
        // csのdefault
        //"csharp": "scriptcs",
        //"csharp": "cd $dir && csc /nologo $fileName && $fileNameWithoutExt",
        // C#のバージョンを指定する際は「/langversion:7.0」や「/langversion:latest」のようにoption追加
        // 指定できるバージョンの確認は「csc /langversion:?」
        "csharp": "cd $dir && csc /nologo /langversion:latest $fileName && $fileNameWithoutExt",
        "vbscript": "cscript //Nologo",
        "typescript": "ts-node",
        "coffeescript": "coffee",
        "scala": "scala",
        "swift": "swift",
        "julia": "julia",
        "crystal": "crystal",
        "ocaml": "ocaml",
        "r": "Rscript",
        "applescript": "osascript",
        "clojure": "lein exec",
        "haxe": "haxe --cwd $dirWithoutTrailingSlash --run $fileNameWithoutExt",
        "rust": "cd $dir && rustc $fileName && $dir$fileNameWithoutExt",
        "racket": "racket",
        "scheme": "csi -script",
        "ahk": "autohotkey",
        "autoit": "autoit3",
        "dart": "dart",
        "pascal": "cd $dir && fpc $fileName && $dir$fileNameWithoutExt",
        "d": "cd $dir && dmd $fileName && $dir$fileNameWithoutExt",
        "haskell": "runhaskell",
        "nim": "nim compile --verbosity:0 --hints:off --run",
        "lisp": "sbcl --script",
        "kit": "kitc --run"
    }
}

これで4つの言語をVS CodeのCode Runnerで動かせます。

お試し環境の構築完了。

Where <-> filter #Kotlinコレクション操作01

Kotlinのコレクション操作シリーズです。

.NETのWhere()はKotlinだとfilter()だそうで。
Javaと同じですね。

整数1~10を持ったリストを偶数と奇数に分けるサンプルです。

C# / VB.NET

using System;
using System.Collections.Generic;
using System.Linq;

namespace LinqSample
{
    class Program
    {
        static void Main(string[] args)
        {
            var myNums = new List<int> {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
            var myEvenNums = myNums.Where(x => x % 2 == 0); // 偶数
            var myOddNums = myNums.Where(x => x % 2 == 1);  // 奇数
        
            Console.WriteLine($"Even nums : [{String.Join(", ", myEvenNums)}]");
            Console.WriteLine($"Odd  nums : [{String.Join(", ", myOddNums)}]");
        }
    }
}
Imports System.Collections.Generic

Module MainModule

    Sub Main()
        Dim myNums As New List(Of Integer) From {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
        Dim myEvenNums = myNums.Where(Function(x) x Mod 2 = 0)  '偶数
        Dim myOddNums = myNums.Where(Function(x) x Mod 2 = 1)   '奇数
        
        Console.WriteLine($"Even nums : [{String.Join(", ", myEvenNums)}]")
        Console.WriteLine($"Odd  nums : [{String.Join(", ", myOddNums)}]")
    End Sub

End Module

Kotlin

fun main(args: Array<String>) {
    val nums = listOf(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
    val evenNums = nums.filter { x -> x % 2 == 0 }   // 偶数
    val oddNums = nums.filter { x -> x % 2 == 1 }    // 奇数

    println("Even nums : [${evenNums.joinToString(", ")}]")
    println("Odd  nums : [${oddNums.joinToString(", ")}]")
}

Java

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.*;

class StreamSample01 {
    public static void main(String args[]) {
        List<Integer> nums = new ArrayList<Integer>(Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10));
        Stream<Integer> evenNums = nums.stream().filter(x -> x % 2 == 0);   // 偶数
        Stream<Integer> oddNums = nums.stream().filter(x -> x % 2 == 1);    // 奇数
        
        System.out.println("Even nums : [" + String.join(", ", evenNums.map(x -> x.toString()).collect(Collectors.toList())) + "]");
        System.out.println("Odd  nums : [" + String.join(", ", oddNums.map(x -> x.toString()).collect(Collectors.toList())) + "]");
    }
}

う~ん、Javaソースコードが長くなっちゃいますね。。。
Kotlinはすっきりと書けます。
パッと見も気持ちいいですね。

ymdevx3.hatenablog.com

LINQ, StreamAPIとの対比表 #Kotlinコレクション操作00

今までC#をずっとやってきてLINQをあたりまえのように使ってるので
他の言語を勉強する際に気になるのがやはりコレクションの操作とラムダ式

なのでコレクションの操作についてメモ。

環境

お試し環境は下記を参照。

対比表

C#とKotlinの対比表です。
とりあえずLINQ (Language Integrated Query) でよく使うメソッドです。
ついでにJavaも。
下記のリンク先ではVB.NETのサンプルあり。
(今の現場がVB.NETでチームメンバーのお役に立てればと)

No .NET [C# / VB.NET] Kotlin Java 機能
01 Where filter filter 抽出
02 Select map map 射影
03 SelectMany flatmap flatmap 平坦化して
射影
04 Any any anyMatch 条件を満たす要素があるかを返す
05 Count count count 素数を返す
06 First
FirstOrDefault
first
firstOrNull
findFirst 最初の要素を返す
07 Last
LastOrDefault
last
lastOrNull
- 最後の要素を返す
08 Single
SingleOrDefault
single
singleOrNull
唯一の要素を返す
09 Skip drop skip 先頭から指定数スキップした残りの要素を返す
10 SkipWhile dropWhile - 先頭から指定条件を満たさなくなるまでスキップした残りの要素を返す
11 Take take limit 先頭から指定数分の要素を返す
12 TakeWhile takeWhle - 先頭から指定条件を満たす要素を返す
13 OrderBy
OrderByDescending
sortBy
sortByDescending
sorted ソート
14 ThenBy
ThenByDescending
- - ソートしたものに対してソート
15 GroupBy groupBy Collectors.groupingBy グループ化
16 Distinct distinct distinct 重複なし要素を返す
17 Max max max 最大値を返す
18 Min min min 最小値を返す
19 Sum sum IntStream.sum 合計を返す
20 All all allMatch 全要素が条件を満たすかを返す

とりあえず対比表だけです。
サンプルコードは徐々に更新していきます。

対比表の「No」がリンクになっていればサンプルコードありです。

SSDなしのMacBook Proを入手

今回のネタは技術的なことではないですが、
Macで開発してみたいと思ったのでMacBookを探していました。

で、見つけたのが

MacBook Pro (13-inch, 2016, Two Thunderbolt 3 ports)
[i7, RAM 16GB, SSDなし, TouchBar非搭載, US Key]

でした。

某オークションで入手したのですが、商品詳細には
「筐体キズあり、画面キズあり、充電器なし、底面ネジ1個なし」と書かれておりました。
ただ実際届いて確認してみたところ、そこまで気になるようなキズではなく
意外とキレイでびっくり。

f:id:ymdevx3:20190902015633j:plainf:id:ymdevx3:20190902020704j:plain

で、SSDは別で入手したのですが、2016モデルからいろいろと
ガラっと変わったみたいで、2016モデルはTouchBar非搭載じゃないと
SSDを換装できないようです!
さらにコヤツ専用のSSDしか使えないと。。。
なのでAmazonや某オークションサイトなどでいろいろ探してたのですが

えれぇたけぇ!
おでれぇたぞぅ!!!

まぁメインPCとしては使うつもりはなかったので256GBで十分かなと。
ココにもお金はかけたくなかったのでアリババのサイトでの購入も考えたのですが
まず今までそのサイトで購入したこともなかったですし
いきなりそこでSSDを購入するのも冒険やなと思い
今回はやめておきました。。。はいチキンです(笑)

SSDを付ける

結局、これまた某オークションサイトでちょいと値切って購入。

f:id:ymdevx3:20190902023535j:plainf:id:ymdevx3:20190902021622j:plain

とりあえず本体とSSDは同じ日に届いたのですぐに取り付けました。

が、蓋を開けるのに少し苦労しました。
私自身忘れそうなので一応残しておきます。
(まぁググったらようさん出てきますが)

f:id:ymdevx3:20190902021658j:plain

上記の箇所で止まってるようなので
まずは吸盤で下の方を少し浮かし、少し上に力を加えて
真ん中の4つを外します。(上げすぎたらダメ!!!)

で、楕円で囲んでいる箇所が、がっつりツメでロックされてるようなので
下の写真のように少し浮かせた状態にします。

f:id:ymdevx3:20190902021719j:plain

で、この状態のまま矢印の方にググっと力を入れて引っ張ります。
※裏蓋の写真撮り忘れたのでまた蓋を取ることがあれば。。。
 あと、これ見てやろうと思った方、やるなら自己責任でお願いします。

なんとか開きました。

おぉ~こんなんなんや~。。。 f:id:ymdevx3:20190902021841j:plain

SSDはココですね~。 f:id:ymdevx3:20190902021856j:plain

取り付けるとこんな感じに。 f:id:ymdevx3:20190902021907j:plain

SSD取り付けるネジが1個(右側)バカになってると聞いてたので
不安でしたが取り合えずドライバ突っ込んで回ったので
緩めに止めてる状態。。。

起動

まぁ動きゃええんでとりあえず蓋をして電源ON!!!

f:id:ymdevx3:20190902021912j:plain

ありゃ?普通に起動した!

あたしゃてっきりOSも自分で入れないとダメやと思ってたのでラッキーでした。

正直OS入ってないと思ってたので、どうやってインストールすりゃええんか
いろいろ調べてたのですが、不安になることしか書かれてなかったので
めっさ不安でした。。。

まぁサイアク、義姉の使われてないMacBookを借りてインストールメディアぐらい作れるか?
とか思いながら数日過ごしておりました。
(とは思いながらもごっさ不安でしたけどね。。。)

まぁ無事に起動したのでめでたしめでたし。

SurfaceMacBook

メインで使ってるSurfacePro3と比べるとこんな感じ。

f:id:ymdevx3:20190902021931j:plain
(左) SurfacePro3/(右) MBP 2016

うん、いいね。

今日からにわかマカーです。

SSDなしMacBook購入時の事前確認

  • MacBookのモデルに合ったSSDを入手可能か
  • 購入するSSD(またはHDD)にOSが入っているか
  • OSが入っている場合、アカウントやパスワードはなにか
  • Appleサポートは受けられないが問題ないか
  • キズなどある場合、許容できるレベルか(モニタ、キーボード、パームレストなど)

SSDなしMacBookは新しめのモデル(2016以降)ですとあまり出回っていない感じがしますが
それでもキレイな筐体であれば価値はあるのかなと思います。
SSDありMacBookの中古で同じモデルのもの(筐体も少しキズがある程度)を
オークションとかで見ていても、私が購入した価格より4~5万は高い感じですし
美品となると7~10万は高いのでお得感がありますね。
同じモデルでも目立つようなキズやシール跡があるもので10万前後ぐらいですかね。
ただ、TouchBarはどうしても必要ということであれば
SSDなしは出てこないため(ロジックボードにSSDが固定されている)
あきらめるしかなさそうです。

KotlinをVS Codeで動かす

最近Kotlinを勉強中です。

普段は仕事でC#VB.NETをメインに使ってますが
Kotlinならどう書けるの?的なことをメモで残していこうかと。

Androidやサーバーサイドで数年前からKotlinがアツイ感じなので
少し遅れてですが使えるようにしておこうかと。

数年はAndroid案件にも携わってたことがありますし
個人的に自分専用のアプリ作ったりはしてますので
まずはKotlinでAndroidのTodoアプリをサクっと作ってみました。
ただただタスクの追加、編集、削除ができるだけのモノですが
Androidスキルアップも兼ねてちょこちょこ更新していきます。

github.com

ただ、勉強する上でちょっとお試しでKotlinコード書きたいな~
ってときにちと困るんですよね~。
ということで、まずはKotlinお試し環境を作るってことで。

 ※JDK入ってるものとします。

次にVS Codeの拡張をインストール

  • Kotlin [0.2.10]
  • Kotlin Language [1.7.0]
  • Code Runner [0.9.14]

f:id:ymdevx3:20190825063904p:plain

とりあえずHello Worldを表示します。

fun main(args: Array<String>) {
    println("Hello Kotlin ! ")
}

ファイル場所に移動し、下記コマンドを実行。

$ kotlinc hello.kt -include-runtime -d hello.jar
bash: kotlinc: command not found

またはVS CodeのCode Runnerを入れて実行。

C:>cd "c:\work\Kotlin\Sample01\" && kotlinc hello.kt -include-runtime -d hello.jar && java -jar hello.jar
'kotlinc' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。

※デフォルト設定ではCode Runnerで実行するとOutputに出力されますが文字化けします。
 対策はコチラを参照してください。

で、本題に戻りますが、kotlincが認識されてねぇと。
そりゃそうだ。コンパイラ入れてねぇもん。

てことで、Kotlinをインストールしましょう。

下記から最新をダウンロード

github.com

C:\Program Files直下にkotlincを移動

環境変数のPathに追加

C:\Program Files\kotlinc\bin

さて、もっかい実行!!!

$ kotlinc hello.kt -include-runtime -d hello.jar

$ java -jar hello.jar
Hello Kotlin !

f:id:ymdevx3:20190825233904p:plain
Code Runnerの実行結果

出た!

環境作る前にとりあえず動かした~い!
という方はコチラでどうぞ。

play.kotlinlang.org

ブラウザ上で動かせます。

Code Runnerで文字化け #VS Code 02

Kotlinの環境構築の際に、Code Runnerで実行すると
OUTPUTウィンドウで文字化けが発生。

この文字化けを解決する方法がすぐには見つからなかったので
とりあえず出力結果をTerminalウィンドウへ出すよう設定を変更。

Ctrl + , で設定を表示。

f:id:ymdevx3:20190826003620p:plain
Settings

Run In Terminal のチェックをONに。

これでソースコード上で右クリックし、Run Code を選択すると
Terminalウィンドウに出力されるようになります。

デフォルトTerminal変更 #VS Code 01

VS CodeのデフォルトTerminalを変更する設定です。

Ctrl + , で設定を開き、「Search Settings」に「terminal」と入力。

f:id:ymdevx3:20190826011343p:plain
Settings

「Terminal > Integrated > Shell: Windows」の「Edit in settings.json」を選択。

{
    // cmd
    "terminal.integrated.shell.windows": "C:\\Windows\\sysnative\\cmd.exe",
    // PowerShell
    // "terminal.integrated.shell.windows": "C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\powershell.exe",
    // Git Bash
    //"terminal.integrated.shell.windows": "C:\\Program Files\\Git\\bin\\bash.exe",
}

上記3つのうちデフォルトに設定したいモノをコメント外して使えるようにしてます。