20200514のLinuxに関する記事は11件です。

ARMで起動する前にコンソールに文字を出す方法とは

起動する前にコンソールに文字を出すにはどうしたらいい?

linux が起動した後であれば、console=ttyS0,115200 などのオプションで指定する事で、コンソール接続のデバイスを指定することができる。

だが、起動する前のログを表示したかったらどうすればいいの?どうやって表示するの?というあたりを整理してみる。

調査ベースはこのあたり。

https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/tree/arch/arm

0. はじめに

MM problemやprintkが動かない場合に有効なdebugging routineではあるが、
あくまでもデバッグ用であり、製品用カーネルでは取り外す事、となっている。

取り扱いは注意が必要ですね!

arch/arm/kernel/debug.S
/*
 * Some debugging routines (useful if you've got MM problems and
 * printk isn't working).  For DEBUGGING ONLY!!!  Do not leave
 * references to these in a production kernel!
 */

1.起動時にearlyprintk を指定する。

linuxの起動オプションに、earlyprintkを指定してあげるとよいっぽい。

https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/tree/Documentation/admin-guide/kernel-parameters.txt#n1135

これを指定する事で何が起きるのか?

https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/tree/arch/arm/kernel/early_printk.c

  • early_param("earlyprintk", setup_early_printk);
  • → setup_early_printk()
  • →→ register_console(&early_console_dev);
  • →→→ early_console_write()
  • →→→→ printascii()

という流れで、表示する文字のアドレスが、printascii()関数に渡される。

2. printasciiで文字を出力しよう

printasciiの定義は、こちら。
なお、ARMのアセンブラの場合、引数はr0に入っている。
今回のケースでは、r0には文字列のポインタ。

  • \0 → 処理終了。
  • \n → \r\nに変換して文字出力
  • それ以外 → 文字出力

だと思います。

arch/arm/kernel/debug.S
#ifndef CONFIG_DEBUG_SEMIHOSTING

ENTRY(printascii)
        addruart_current r3, r1, r2 // 2.1で説明
1:      teq r0, #0
        ldrbne  r1, [r0], #1
        teqne   r1, #0
        reteq   lr
2:      teq     r1, #'\n'
        bne 3f
        mov r1, #'\r'
        waituart r2, r3 // 4.2で説明
        senduart r1, r3 // 4.3で説明
        busyuart r2, r3 // 4.4で説明
        mov r1, #'\n'
3:      waituart r2, r3
        senduart r1, r3
        busyuart r2, r3
        b   1b
ENDPROC(printascii)

<略>

#else

ENTRY(printascii)
        mov r1, r0
        mov r0, #0x04       @ SYS_WRITE0
    ARM(    svc #0x123456   )
#ifdef CONFIG_CPU_V7M
    THUMB(  bkpt    #0xab       )
#else
    THUMB(  svc #0xab       )
#endif
        ret lr
ENDPROC(printascii)

DEBUG_SEMIHOSTINGが有効か否かで振る舞いが変わっている。

無効である場合には、adduart_current / waituart/ senduart などを駆使して文字を出力しようとしている。これは製品固有の実装になる(後述)。

有効である場合は? r0レジスタに0x04, r1 レジスタに当該表示しようとしている文字をセットして、ARMモードであれば0x123456 をSVCしている。これは機種問わず利用できる機能で、JTAGなどのデバッガ経由で見ることができる(と思われる)

2.1 adduart_currentを確認しておく

全機種共通部の処理となる、adduart_currentを先に解説しておく。

arch/arm/kernel/debug.S
#ifdef CONFIG_MMU
        .macro  addruart_current, rx, tmp1, tmp2
        addruart    \tmp1, \tmp2, \rx // 4.1で説明
        mrc     p15, 0, \rx, c1, c0
        tst     \rx, #1
        moveq       \rx, \tmp1
        movne       \rx, \tmp2
        .endm

#else /* !CONFIG_MMU */
        .macro  addruart_current, rx, tmp1, tmp2
        addruart    \rx, \tmp1, \tmp2
        .endm

#endif /* CONFIG_MMU */

rx [out] tmp1/tmp2のうちアクセス可能なアドレス
temp1 [tmp] : テンポラリに利用
temp2 [tmp] : テンポラリに利用

MMUが有効であれば、MMUの状態に応じてPHYS/VIRTを切り替え、
MMUが無効であれば、PHYSとする。

つまり、先頭のレジスタに、UARTデバイスを制御するのに適切なアドレスが代入されてくることになる(r3)

3. printasciiでどこの機種のアセンブラを読むか決定する

それでは、printascii内で呼ばれている各関数がどこで定義されているのかを確認する。

arch/arm/Kconfig.debug
# These options are only for real kernel hackers who want to get their hands dirty.
config DEBUG_LL
    bool "Kernel low-level debugging functions (read help!)"
    depends on DEBUG_KERNEL
    help
      Say Y here to include definitions of printascii, printch, printhex
      in the kernel.  This is helpful if you are debugging code that
      executes before the console is initialized.

      Note that selecting this option will limit the kernel to a single
      UART definition, as specified below. Attempting to boot the kernel
      image on a different platform *will not work*, so this option should
      not be enabled for kernels that are intended to be portable.

choice
    prompt "Kernel low-level debugging port"
    depends on DEBUG_LL

    config DEBUG_ALPINE_UART0
        bool "Kernel low-level debugging messages via Alpine UART0"
        depends on ARCH_ALPINE
        select DEBUG_UART_8250
        help
          Say Y here if you want kernel low-level debugging support
          on Alpine based platforms.

これらのオプションは、手を汚したい本物のカーネルハッカーのためのものです

Yを選択する事でprintascii, printch, printhexがカーネル内に定義されます。これは、consoleが初期化されてる前に実行するcodeのデバッグをする場合に役に立つでしょう

このオプションを選択すると、以下に示すように、カーネルが単一のUART定義に制限されることに注意してください。 別のプラットフォームでカーネルイメージを起動しようとすると動作しませんので、このオプションは、移植を目的としたカーネルでは有効にしないでください。

ということで、ここは本当にべた書きされているので、移植性がなくなる修正になります。

上記の設定で、DEBUG_ALPINE_UART0などが定義されると、DEBUG_UART_8250などが指定され、更に、どのアセンブラコードをincludeするのかの定義に置換される。

arch/arm/Kconfig.debug
config DEBUG_LL_INCLUDE
    string
    default "debug/sa1100.S" if DEBUG_SA1100
    default "debug/palmchip.S" if DEBUG_UART_8250_PALMCHIP
    default "debug/8250.S" if DEBUG_LL_UART_8250 || DEBUG_UART_8250
    default "debug/at91.S" if DEBUG_AT91_UART
    default "debug/asm9260.S" if DEBUG_ASM9260_UART
    default "debug/clps711x.S" if DEBUG_CLPS711X_UART1 || DEBUG_CLPS711X_UART2
    default "debug/dc21285.S" if DEBUG_DC21285_PORT
    default "debug/meson.S" if DEBUG_MESON_UARTAO
    default "debug/pl01x.S" if DEBUG_LL_UART_PL01X || DEBUG_UART_PL01X
    default "debug/exynos.S" if DEBUG_EXYNOS_UART
    default "debug/efm32.S" if DEBUG_LL_UART_EFM32
    default "debug/icedcc.S" if DEBUG_ICEDCC

上記によって、CONFIG_DEBUG_LL_INCLUDEは、"debug/*.S"という文字列になって、これが#includeされる。

arch/arm/kernel/debug.S
#if !defined(CONFIG_DEBUG_SEMIHOSTING)
#include CONFIG_DEBUG_LL_INCLUDE
#endif

なお、すぐ4.1で使うCONFOG_DEBUG_UART_PHTSなどの定義もこちら。

arch/arm/Kconfig.debug
config DEBUG_UART_PHYS
    hex "Physical base address of debug UART"
    default 0x01c20000 if DEBUG_DAVINCI_DMx_UART0
    default 0x01c28000 if DEBUG_SUNXI_UART0
    default 0x01c28400 if DEBUG_SUNXI_UART1
    default 0x01d0c000 if DEBUG_DAVINCI_DA8XX_UART1
    default 0x01d0d000 if DEBUG_DAVINCI_DA8XX_UART2
    default 0x01f02800 if DEBUG_SUNXI_R_UART
    default 0x02530c00 if DEBUG_KEYSTONE_UART0
    default 0x02531000 if DEBUG_KEYSTONE_UART1
    default 0x03010fe0 if ARCH_RPC
    :

config DEBUG_UART_VIRT
    hex "Virtual base address of debug UART"
    default 0xc881f000 if DEBUG_RV1108_UART2
    default 0xc8821000 if DEBUG_RV1108_UART1
    default 0xc8912000 if DEBUG_RV1108_UART0
    default 0xe0010fe0 if ARCH_RPC
    default 0xf0000be0 if ARCH_EBSA110
    default 0xf0010000 if DEBUG_ASM9260_UART
    default 0xf0100000 if DEBUG_DIGICOLOR_UA0
    default 0xf01fb000 if DEBUG_NOMADIK_UART
    default 0xf0201000 if DEBUG_BCM2835 || DEBUG_BCM2836
    default 0xf1000300 if DEBUG_BCM_5301X
    default 0xf1000400 if DEBUG_BCM_HR2
    default 0xf1002000 if DEBUG_MT8127_UART0
    default 0xf1006000 if DEBUG_MT6589_UART0
    default 0xf1009000 if DEBUG_MT8135_UART3
    default 0xf1023000 if DEBUG_BCM_IPROC_UART3
    default 0xf11f1000 if DEBUG_VERSATILE
    default 0xf1600000 if DEBUG_INTEGRATOR
    :
    :

4. printasciiで実際に利用されるアセンブラ

実際のアセンブラコードは、include/debug以下にそれぞれ実装されている。
ここでは、ソースコードが一番短そうな、bcmのコードを用いて、
用意されている関数の定義を簡単に確認する。

4.1 adduart, rp,rv,tmp

/arch/arm/include/debug/bcm63xx.S
    .macro  addruart, rp, rv, tmp
    ldr \rp, =CONFIG_DEBUG_UART_PHYS
    ldr \rv, =CONFIG_DEBUG_UART_VIRT
    .endm

rp [out] : CONFIG_DEBUG_UART_PHYS
rv [out] : CONFIG_DEBUG_UART_VIRT
tmp[out] : waituart/busyuart へ渡されるデータ

なお、この関数は mmu制御のところからも間接的に呼ばれる。
多分これは、iomapのテーブルが定義されていれば使われないような気がしますけどね……

arch/arm/mm/mmu.c
    /*
     * Ask the machine support to map in the statically mapped devices.
     */
    if (mdesc->map_io)
        mdesc->map_io();
    else
        debug_ll_io_init();





#ifdef CONFIG_DEBUG_LL
void __init debug_ll_io_init(void)
{
    struct map_desc map;

    debug_ll_addr(&map.pfn, &map.virtual);
    if (!map.pfn || !map.virtual)
        return;
    map.pfn = __phys_to_pfn(map.pfn);
    map.virtual &= PAGE_MASK;
    map.length = PAGE_SIZE;
    map.type = MT_DEVICE;
    iotable_init(&map, 1);
}
#endif
arch/arm/kernel/debug.S
#ifdef CONFIG_MMU
ENTRY(debug_ll_addr)
        addruart r2, r3, ip
        str r2, [r0]
        str r3, [r1]
        ret lr
ENDPROC(debug_ll_addr)
#endif

4.2 waituart, rd,rx

/arch/arm/include/debug/bcm63xx.S
    .macro  waituart, rd, rx
1001:   ldr \rd, [\rx, #UART_IR_REG]
    tst \rd, #(1 << UART_IR_TXEMPTY)
    beq 1001b
    .endm

rd [tmp] : テンポラリに利用
rx [in] : UARTデバイスのポート

UARTデバイスポートの、UART_IR_REGのOFFSETにあるメモリを読み出して、#(1 << UART_IR_TXEMPTY)と一致するまでループ。

4.3 senduart, rd,rx

/arch/arm/include/debug/bcm63xx.S
    .macro  senduart, rd, rx
    /* word access do not work */
    strb    \rd, [\rx, #UART_FIFO_REG]
    .endm

rd [in] : 書き出す文字列
rx [in] : UARTデバイスのポート

4.4 busyuart, rd,rx

/arch/arm/include/debug/bcm63xx.S
    .macro  busyuart, rd, rx
1002:   ldr \rd, [\rx, #UART_IR_REG]
    tst \rd, #(1 << UART_IR_TXTRESH)
    beq 1002b
    .endm

rd [tmp] : テンポラリに利用
rx [in] : UARTデバイスのポート

UARTデバイスポートの、UART_IR_REGのOFFSETにあるメモリを読み出して、#(1 << UART_IR_TXTRESH)と一致するまでループ。

まとめると

  • 起動時のboot parameterにearlyprintkを追加
  • KERNEL CONFIGで、DEBUG_LL を有効化
  • arch/arm/Kconfig.debug にデバッグ用の設定を追加。
  • arch/arm/Kconfig.debug に対応するアセンブラを追加
  • arch/arm/include 以下に、対応するアセンブラを追加
    • waituart : 書き出せる状態待ち
    • senduart : 実際にFIFOなりに書き出す
    • busyuart : 書き出し完了待ち

以上です。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Javaのインストールディレクトリがわからなくなった時の探し方

サーバでいろいろな事情によりインストールディレクトリを見失ってしまった。

方法1 : 環境変数のJAVA_HOMEを見る

今使っているバージョン(javaコマンドで動くバージョン)ならこれでOK。

$ printenv JAVA_HOME
/usr/java/default

方法2 : 環境変数のPATHを見る

今使っているバージョン(javaコマンドで動くバージョン)でJAVA_HOMEがない時はこれでOK。

$ printenv PATH | sed -e 's/:/:\n/g' | grep java
/usr/java/default/bin:

方法3 : yumでインストールしたパッケージ名で探す

いくつもバージョンをインストールしていることはよくあること。
JAVA_HOMEに設定していないバージョンのJavaを探したいとき。

参考 : yumでインストールしたパッケージのインストール場所を調べる - 学生時代に頑張ったことが何もない

# バージョンからインストールしたパッケージを調べる
$ yum list installed | grep java-1.7
java-1.7.0-openjdk.x86_64  1:1.7.0.151-2.6.11.0.el6_9
java-1.7.0-openjdk-devel.x86_64

# インストールディレクトリを確認する
$ rpm -ql java-1.7.0-openjdk-devel.x86_64 | grep bin
/usr/lib/jvm/java-1.7.0-openjdk-1.7.0.151.x86_64/bin
/usr/lib/jvm/java-1.7.0-openjdk-1.7.0.151.x86_64/bin/appletviewer
...省略...
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[Go言語]ターミナルの入力をリアルタイムに取得する方法

はじめに

本記事では、Go言語を使用してターミナルの入力をリアルタイムで取得する方法をご紹介します。
今回ご紹介するのは、UNIX系OSに限った話です。
Windowsの場合は、Microsoftが用意してるAPIで実現できるらしいが......(調査不足)

目次

結論

ターミナルを非カノニカルモードにすること、即時に入力を取得可能です。
非カノニカルモードにするには、termios構造体のフィールドの値を変更しなければなりません。
以下では、サンプルコードとLinuxのマニュアルを交えて、それぞれのモードを説明します。

動作環境

  • macOS Catalina
  • CentOS 7
  • go version go1.12.6

カノニカルモードとは

非カノニカルモードを説明する前に、まずカノニカルモードについてです。
わかりやすく言えば、デフォルトの状態ですね。Enterが押下されるまで入力を受け付けます。

引用 Linuxの日本語翻訳マニュアル

  • 入力は行単位に行われる。 行区切り文字が打ち込まれた時点で、入力行が利用可能となる。行区切り文字は NL, EOL, EOL2 および行頭での EOF である。 EOF 以外の場合、 read(2) が返すバッファーに行区切り文字も含められる

  • 行編集が有効となる (ERASE, KILL が効果を持つ。 IEXTEN フラグが設定された場合は、 WERASE, REPRINT, LNEXT も効果を持つ)。 read(2) は最大でも 1行の入力しか返さない。 read(2) が要求したバイト数が現在の入力行のバイト数よりも少ない場合、 要求したのと同じバイト数だけが読み込まれ、 残りの文字は次回の read(2) で読み込まれる

非カノニカルモードとは

非カノニカルモード、リアルタイムに入力を受け付け可能なのがこちらのモードです。
MIN (c_cc[VMIN])で受付文字数を設定できます。
例えば、c_cc[VMIN] = 3とした場合、3文字入力した時点で、入力完了となりプログラムに読み込まれます。
TIME (c_cc[VTIME])でタイムアウト時間を設定でき、タイムアウトを必要としない場合は0にします。

引用 Linuxの日本語翻訳マニュアル

  • 非カノニカルモードでは、入力は即座に利用可能となり (ユーザーは行区切り文字を打ち込む必要はない)、入力処理は実行されず、行編集は無効となる。 MIN (c_cc[VMIN]) と TIME (c_cc[VTIME]) の設定により、 read(2) が完了する条件が決定される

サンプルコード

C言語の場合、termios構造体にアクセスする際には、「termios.h」の関数群を使用します。
これをGo言語で同じように使用できるよう、有志が作成したpkg/termパッケージをお借りします。
termios構造体のパラメータを変更するときは、Tcgetattr()で現在の設定を取得してから、ビット演算などで必要な設定をしていきます。
設定できるパラメータは、Linuxの日本語翻訳マニュアルを参考にしてください。
ちなみに、C言語で使用できるフラグは、基本的にはpkg/termパッケージでも使用できました。
必要な設定が完了したら、Tcsetattr()で反映できます。

sample.go
package main

import (
    "fmt"
    "syscall"

    "github.com/pkg/term/termios"
)

func main() {
    var ttystate syscall.Termios

    // ターミナルの設定を取得
    termios.Tcgetattr(uintptr(syscall.Stdin), &ttystate)

    // ターミナルの設定変更
    setNonCanonicalMode(&ttystate)

    // 標準入力を取得
    bufCh := make(chan []byte, 1)
    go readBuffer(bufCh)

    for {
        fmt.Printf(" あなたが入力したのは: %c\n", <-bufCh)
    }
}

// 非カノニカルモードに設定する
func setNonCanonicalMode(attr *syscall.Termios) {

    // カノニカルモードを無効に設定 (&^ AND NOT)
    attr.Lflag &^= syscall.ICANON

    // 読み込み時の最小文字数 = 1文字
    attr.Cc[syscall.VMIN] = 1

    //非カノニカル読み込み時のタイムアウト時間 = 0
    attr.Cc[syscall.VTIME] = 0

    // 変更した設定を反映
    termios.Tcsetattr(uintptr(syscall.Stdin), termios.TCSANOW, attr)
}

// バッファの値を取得する
func readBuffer(bufCh chan []byte) {
    buf := make([]byte, 1024)

    for {
        if n, err := syscall.Read(syscall.Stdin, buf); err == nil {
            bufCh <- buf[:n]
        }
    }
}

上記コードを実行すると、以下のような挙動になります。
入力したキーが画面に表示された後に、Printfが実行されます。
ちなみにVMINの数値を増やせば、複数の値を取得可能です。

Demo01

Rawモードとは

非カノニカルモードの特徴に加えて、入力したキーが画面に表示されません。
また特殊処理が効かないので、Ctrl + C で強制終了ができなくなります。

引用 Linuxの日本語翻訳マニュアル

  • 入力は文字単位に可能であり、エコーが無効となり、 端末の入出力文字に対する特殊処理はすべて無効となる

サンプルコード

Linuxの日本語翻訳マニュアルに示す通りにRawモードに設定したパターンです。(※ 不必要だと判断した箇所はコメントアウトしてます。)

下記コードのように何も考えずにマニュアル通りに設定してもいいが、必要に応じて設定パラメータを選択した方がいい気がしますね。

sample.go
package main

import (
    "fmt"
    "syscall"

    "github.com/pkg/term/termios"
)

func main() {
    var ttystate syscall.Termios

    // ターミナルの設定を取得
    termios.Tcgetattr(uintptr(syscall.Stdin), &ttystate)

    // ターミナルの設定変更 ※ここを変更
    //setNonCanonicalMode(&ttystate)
    setRawMode(&ttystate)

    bufCh := make(chan []byte, 1)
    go readBuffer(bufCh)

    for {
        fmt.Printf(" あなたが入力したのは: %c\n", <-bufCh)
    }
}

// Rawモードに設定する
func setRawMode(attr *syscall.Termios) {

    // 設定値は、[https://linuxjm.osdn.jp/html/LDP_man-pages/man3/termios.3.html]から引用
    // OPOSTをビットクリアすると、自分の環境では出力がおかしくなるのでコメントアウト
    // ISIGを無効にすると、Ctrl+Cが押せなくてデバッグがしづらいのでコメントアウト
    // マニュアルでは、文字サイズをCS8に指定しているが、今回の検証では不必要と判断してコメントアウト

    attr.Iflag &^= syscall.BRKINT | syscall.ICRNL | syscall.INPCK | syscall.ISTRIP | syscall.IXON

    //attr.Oflag &^= syscall.OPOST

    attr.Cflag &^= syscall.CSIZE | syscall.PARENB

    //attr.Cflag |= syscall.CS8

    attr.Lflag &^= syscall.ECHO | syscall.ICANON | syscall.IEXTEN //| syscall.ISIG

    attr.Cc[syscall.VMIN] = 1
    attr.Cc[syscall.VTIME] = 0

    // 変更した設定を反映
    termios.Tcsetattr(uintptr(syscall.Stdin), termios.TCSANOW, attr)
}

// バッファの値を取得する
func readBuffer(bufCh chan []byte) {
    // 省略
}

Demo02
上記の非カノニカルモードと違って、押下したキーが画面に表示されないですね。

参考サイト

https://linuxjm.osdn.jp/html/LDP_man-pages/man3/termios.3.html
https://www.slideshare.net/c-bata/golang-ui
https://grimoire.f5.si/archives/125

おわりに

termiosについてC言語で扱う情報は、たくさんあるのですが、Go言語でやってる事例が少なかったです。
ジョークコマンドを作成するために調べ始めたのですが、思ったより時間を取られてしまいました。
未来の自分のため、そして同じように詰まってる人のために記事にまとめました。
普段意識しない低レイヤーに触れることができて、面白かったですね。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

備忘録 : 煩わしいプロンプトをさっと見やすく改良する。 // Linux プロンプト 変更

いろいろとめんどくせえし、さっと手短に書きます。
備忘録だし、ほぼ俺のためだけのやつだし

// .bashrcを開く
$ vim .bashrc

// 一番したに移動
# prompt change
export PS="\[e[31m\]FuckMyLife\[\e[0m]: \w \$ "

$ . .bashrc

以上


補足

[e[31m] 〜 はこれ以降赤色にするよってこと
]\e[0m]    で色を元に戻す

\w はカレントディレクトリ
\$ は、まあ見たまんま。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Windows版Visual Studio CodeとWSLの連携手順について

概要

  • Windows版のVSCodeでWSLをシームレスに連携する手順の記事です
  • もはやmacOSと差がなさそう、Windowsでもストレスフリーに開発出来る

はじめに

プログラミングと言えばmacOSだと思っていましたが、どうやら最近は違うようで、WSLというのが誕生しWindowsでもLinuxシェルが使えると。
具体的にmacOSがプログラミング向きである理由は正直よくわからんというところですが、確かに同じシェルが使えれば開発環境として問題なさそうです。
VSCodeと組み合わせられればもうWindowsだけでよくなっちゃうな、ということで試した手順をまとめました。

前提

  • Pythonスクリプトをよく書きます、あとフロントでVueを書いたりします、そんなエンジニア目線の記事です
  • 他所で紹介されている手順だと、ストアのものとはと別のWSLと連携していたりしますが、本手順なら、ストアのものと同一のWSLをVSCodeでシームレスに使えるようになります

VSCodeをインストール

  • https://azure.microsoft.com/ja-jp/products/visual-studio-code/
  • Windows版のVSCodeのデフォルトの既定シェルはPowershellです
  • 本記事はVSCodeの既定シェルがPowershellである場合を想定しています
    • なので、もし既定シェルが異なる場合はPowershellに設定してから試してください

VSCodeとWSL連携

  • アプリストアでubuntuをダウンロード・インストール
  • VSCodeの左下の歯車からSettingsを開き Terminal › Integrated › Automation Shell: Windows から開けるsettings.jsonに以下の行を追加し保存する
"terminal.integrated.shellArgs.windows": ["wsl"],
  • この行は既定シェル起動時に自動で実行するコマンドを意味しています
    • つまりPowershellで「wsl」というコマンドが実行される
  • したがってVSCodeのシェル起動時にWSLが自動で起動されます

各所で様々な手法が紹介されていますが、他の手法はVSCodeで使われるWSLがストアのものとは別になったり煩雑なので、上記の方法が最もシンプルだと思います

おわりに

以上の手順で、VSCodeのシェルを起動すると自動的にWSLが立ち上がるようになりました。カレントディレクトリもよしなに初期設定してくれます。これが実現したので、もはや開発環境においてmacOSの優位性というのはあるのかどうなのか…、iOS開発をしようと思ったら必須ですが、そうでない場合は…うん。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[Docker] [drone] Drone基本安裝

目的

這是一次安裝經驗紀錄,當我們需要自己架設 CICD 環境時,我們挑選了Drone作為本次的安裝的對象

但因為他登入採用版本控款的第三方登入所以也需要搭配一個版本控管環境,我們就以Gitlab為例

預先準備環境:Docker

安裝Drone

1.設定Gitlab Application
callbackurl 依照你得drone版本不同可能要更改 新版的是用 /login, 舊版本可能要用 /authorize
drone1.png

2 . 安裝Drone

 docker run \
  --volume=/var/lib/drone:/data \
  --env=DRONE_GITLAB_SERVER=http://192.168.10.2:8888 \ # 這個是你對應Gitlab的網址,我是架設在內網,依照你的版本控管位置設定
  --env=DRONE_GITLAB_CLIENT_ID=fdfdfvbfbfgfdgfdgfdbvdfbfdgfdgdfgfdgfd\ # 這個在Gitlab UserSettings/Application 中產生
  --env=DRONE_GITLAB_CLIENT_SECRET=dfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdffd\ # 這個在Gitlab UserSettings/Application 中產生
  --env=DRONE_RPC_SECRET=http \  
  --env=DRONE_SERVER_HOST=192.168.10.2:9999 \ #drone 安裝位置的url
  --env=DRONE_SERVER_PROTO=http  \  #依照drone使用http還是https
  --publish=9999:80 \   #9999(外部監聽Port):80(Docker 內部對應Port)
  --publish=9998:443 \  #9998(外部監聽Port):443(Docker 內部對應Port)
  --restart=always \
  --detach=true \
  --name=drone \
  drone/drone:1

3.登入drone

drone2.png

這樣就完成了,之後有空再補上drone 使用方式

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

VirtualBoxにUbuntuをインストールする手順

はじめに

Linuxや環境周りの勉強がしたくて、MacにVirtualBoxとUbuntuをインストールしました。
自分の備忘録として残していきたいと思います。

環境

  • MacOS10

VirtualBoxをインストール

ダウンロードメニューからダウンロードする。

https://www.virtualbox.org/

  • VirtualBoxのplatform pagkagesをダウンロード(OS Xを選択)
  • VM VirtualBox Extension Packをダウンロード(All supported platformsを選択)

    • ダウンロードしたplatform packageをインストールする。
    • ダウンロードしたVM VirtualBox Extension Packをインストールする。

Ubuntuをインストール

Downloadをクリックしてダウンロードする

https://www.ubuntulinux.jp/

Ubuntu Desktop 日本語 Remixのダウンロードをクリック
  • ubuntu-ja-18.04.3-desktop-amd64.iso(ISOイメージ)をクリックしてダウンロード

VirtualBoxを起動する

新規ボタンをクリック
  • 名前とオペレーティングシステム画面で仮装コンピューター名を設定し、「続き」をクリック
    qiita_ubuntu2.png

  • メモリサイズを指定(4096MB以上が望ましい)
    qiita_ubuntu3.png

  • ハードディスク画面で「仮想ハードディスクを作成する」を選択し、作成ボタンをクリック
    qiita_ubuntu4.png

  • ハードディスクのファイルタイプ画面でVDIを選択し、「続き」をクリック
    qiita_ubuntu5.png

  • 物理ハードディスクにあるストレージ画面でサイズを指定(今回は可変サイズを選択)
    qiita_ubuntu7.png

  • ファイルの場所とサイズ画面でサイズを設定(最低16GB、通常運用で使いたい場合は100GBぐらい欲しい)し、「作成」をクリック
    qiita_ubuntu8.png

  • 「設定」をクリック
    qiita_ubuntu9.png

  • 「ストレージ」をクリック
    qiita_ubuntu10.png

  • 「空」を選択し、円盤マークをクリックし、「ubuntu-ja-18.04.2-desktop-amd64.iso」を選択。その後、「OK」をクリック
    qiita_ubuntu12.png

  • 「起動」ボタンをクリックするとインストールが開始する

  • 「Ubuntuをインストール」をクリック

qiita_ubuntu13.png

  • キーボードレイアウトページで「日本語」を選択
    qiita_ubuntu14.png

  • アップデートと他のソフトウェア画面で、「グラフィックスとwi-Fiハードウェアと追加のメディアフォーマットのサードパーティ製ソフトウェアをインストール」を選択
    qiita_ubuntu15.png

  • インストールの種類画面で、「ディスクを削除してUbuntuをインストール」を選択し、「インストール」をクリック
    qiita_ubuntu16.png

  • 起動ハードディスクを選択の画面で「ubuntu-ja-18.04.2-desktop-amd64.iso」を選択し、「起動」をクリック
    qiita_ubuntu19.jpg

  • 「ディスクに変更を書き込みますか?」と訊かれるので、「続ける」をクリック
    qiita_ubuntu20.png

  • 「どこに住んでいますか?」と訊かれるので、「Tokyo」を選択し「続ける」をクリック
    qiita_ubuntu21.png

  • 「あなたの情報を入力してください」画面で、名前、コンピューターの名前、ユーザー名、パスワードを設定し、「続ける」をクリック
    qiita_ubuntu22.png

  • インストールが開始する
    qiita_ubuntu23.png

  • インストール完了画面で、「今すぐ再起動する」をクリックqiita_ubuntu24.png

  • コントローラー :IDEから「ubuntu-ja-18.04.3-desktop-amd64.iso」を取り除き、OKボタンで画面を閉じてから、「Enter」をクリック
    qiita_ubuntu25.png

  • トップ画面に戻り、アカウントが作成されているので、クリック
    qiita_ubuntu26.png

  • 先ほど設定したパスワードを入力し、「サインイン」をクリック
    qiita_ubuntu27.png

  • アクティビティへ移動し、検索バーで「terminal」を検索し、ターミナルへ移動。
    qiita_ubuntu28.png

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

MBDynのインストール方法について(Linux Ubuntu)

MBDynのインストール方法

Linux初心者の備忘録です。
MBDynというツールはマイナーらしく日本語のインストール解説サイトが一つも見つかりませんでした。
おそらくLinuxというツールを使い慣れている人にとっては当たり前のことですが自分のために書き出しておきます。(後々忘れて思い出すのに苦労するので)

まず公式サイト( https://www.mbdyn.org/?Software_Installation )の Software Installationの欄を見ると詳しく解説されていますのでそちらを参照します。

必要なコマンドを列挙していきます。詳細は公式サイトを参照してください。

具体的な手順

apt update
apt install make gcc g++ gfortran

apt update
apt install libltdl-dev liblapack-dev libsuitesparse-dev libnetcdf-dev libnetcdf-cxx-dev

wget https://www.mbdyn.org/userfiles/downloads/mbdyn-1.7.3.tar.gz
(mbdyn-1.7.3の部分は欲しいバージョンに各自読み替えてください)

tar xzvf mbdyn-1.7.3.tar.gz
cd mbdyn-1.7.3/

次にリポジトリを公式サイトからローカル(自分の作業環境)に複製します。
方法は二つ書いてありますがここではgit cloneを用いて行います。

まずディレクトリを作成します。
mkdir -p ~/mbdyn-1.7.3/git
cd ~/mbdyn-1.7.3/git
git init

ここに
git clone https://public.gitlab.polimi.it/DAER/mbdyn.git
cd mbdyn
git checkout develop
(正直なぜブランチを作っているのかがわかりませんわかる方いましたら教えていただけると助かります)

sh bootstrap.sh

ここでソースツリーに戻りconfigureを実行します
cd ~/mbdyn-1.7.3
./configure
make

sudo make install
(make installするのならば上のmakeはいらないのでしょうか?)

以上です。
Linuxを何も知らないところからここまで来たためもし参照にする方がいるのならばこの記事を鵜呑みにすることはお勧めいたしません。
間違いなどありましたら指摘して頂けると大変助かります。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

vmware toolsのインストール または ダウンロード

vmware toolsのインストール または ダウンロード

ubuntu debian centos OpenSuSE RHEL Fedora centos
wmware-toolsのisoを探していたのですがなかなかダウンロードリンクが見つかりません
そして行き着いたURL下記を見ると
https://docs.vmware.com/jp/VMware-Tools/11.0.0/com.vmware.vsphere.vmwaretools.doc/GUID-C48E1F14-240D-4DD1-8D4C-25B6EBE4BB0F.html

え、ちょっと待って

[Ubuntu、Debian、および関連 OS]

sudo apt-get install open-vm-tools

Linuxのデスクトップでは

sudo apt-get update
sudo apt-get install open-vm-tools-desktop

とするだけ

Ubuntu20.04の場合
解像度の変更などは 
設定>ディスプレイ>任意倍率のスケーリング
任意倍率のスケーリングをONにするだけでウインドウサイズを
いじるだけで解像度の変更ができます
とても簡単
LINUXディスプレイ.jpg

[RHEL、Fedora、および CentOS]

sudo yum install open-vm-tools-desktop
sudo yum install open-vm-tools

[SLE および OpenSuSE]

zypper install open-vm-tools-desktop
zypper install open-vm-tools

まさかこんな便利な時代が来るとは
今回Vmwaretoolsのインストールisoをダウンロードをしようとして四苦八苦してたら
このページにたどり着いておどろきました
今までの苦労はなんだったのか・・・

共有フォルダの作り方

vmhgfs-fuse --help
Usage:  vmhgfs-fuse sharedir mountpoint [options]
Examples:
    vmhgfs-fuse .host:/ /mnt/hgfs
    vmhgfs-fuse .host:/foo/bar /mnt/bar

過去のインストール方法は以下で

https://kb.vmware.com/articleview?docid=1022525&lang=ja

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

シェルで意図的にエラーを出す方法 テスト時

filename.sh
false
echo $?
# 1が出力
true
echo $?
# 0が出力
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

linuxで使うコマンド・パッケージ・用語等備忘録(随時更新)

調べても忘れてを繰り返すのが面倒になったのでこちらに記載します。
コピペで済ませるのが怖くなってきたので、何をしているのかふんわりと分かる程度の理解を目指しています。
※自分用なので正確ではありません。

apt

後述のapt-getの設計上のミスをなくしたもの。
推奨されているコマンド。

apt-get(これよりaptを使う。)

パッケージの操作・管理。
Debian系のパッケージ管理システムであるAPT(Advanced Package Tool)ライブラリを利用してパッケージを操作・管理するコマンドラインツール。

apt-get install

指定したパッケージをインストールする。

$ apt-get install curl ca-certificates gnupg

のように、複数のパッケージを同時に指定できる。

apt-get update

パッケージの再同期を行うのに使用。
新しいバージョンはインストールせず、アップグレードが必要なパッケージのアップグレード用のパッケージリストと、リポジトリに到着したばかりの新しいパッケージを更新する。
パッケージのインデックスは、/etc/apt/sources.listに記述した場所から取得。updateは、upgradedist-upgradeを行う前に常に実行する。

apt-key

aptがパッケージを認証するのに使用するキーの一覧を管理するのに使用。このキーで認証されたパッケージは、信頼するに足るとみなせる。
Ubuntu公式以外からパッケージを取得するときは、このコマンドで認証する鍵情報を取り込んでおく必要がある。

apt-key add ファイル名

信頼キーのリストに新しいキーを追加。
ファイル名を-にすると、標準入力から読み込む。

$ curl 鍵のURL | apt-key add -

であれば、curlでURL先のファイルを受信し、apt-key add -で左の鍵のファイルを読み込むということ?

ca-certificates

パッケージであり、基本的なCA証明書が提供されている。
これがインストールされていない状態でnpm installcurlコマンドでHTTPS通信しようとすると、CA証明書のエラーが発生する。通常はcurlパッケージをインストールする際に推奨パッケージとしてインストールされる。

curl

URLシンタックスを用いてファイルを送信・受信するコマンドラインツール。
様々なプロトコルを用いてデータを転送するためのライブラリとコマンドラインツールを提供するプロジェクトであるcURLの成果。

deb

$ deb URL(パッケージをダウンロードするリポジトリ先) buster main

debはコマンドではない。
コマンドのように勘違いされやすいが、sources.listにデータ取得元のURLを形式に沿ってエントリーするためのもの。
busterDebian 10の開発コードネームで、データ取得元のURLの後にディストリビューションを記述する必要があるから記述されている。
mainは、DFSG準拠のパッケージで構成されており、この領域外のソフトウェアに依存せずに動作する。これらはDebianディストリビューションの一部と見なされる唯一のパッケージ。

finger ユーザー名

システム内のユーザーの情報を表示するコマンド。
ユーザー名@ホスト名ホスト名と指定すると、指定したホスト内のユーザー情報も確認できる。
最近はセキュリティの観点から使えなくなっている場合が多い。

gnugp

コマンドラインツールで、豊富なフロントエンドアプリケーションとライブラリが利用可能。
データと通信を暗号化して署名できる。あらゆる種類の公開鍵ディレクトリ用のアクセスモジュールとともに、多目的な鍵管理システムを備えている。

passwd

パスワードを変更。
オプションでユーザーをロックしたり、有効日数を決定したりできる。

今ログインしているユーザーのパスワードを変更
 $ passwd 
root以外が指定したユーザーのパスワードを変更
 $ sudo passwd ユーザー名

psql

PostgreSQLのターミナル型フロントエンド。
対話的に問い合わせをし、それをPostgreSQLに対して発行して結果を確認できる。

sh

よくわからない。
シェルの実行?
-cを付けたら既に存在したファイルをリダイレクトで上書きしないという意味。

sources.list

APT のデータ取得元の設定リスト。

su

他のユーザーに一時的に変更。
exitすれば元のユーザーに戻る。

yum

CentOSやFedoraのパッケージ管理。

ディストリビューション

Linuxが配布される形態のこと。

例を挙げると。

  • Red Hat Enterprise Linux (RHEL)
  • Fedora
  • Debian
  • CentOS
  • Ubuntu

標準入力

コンピュータ上で実行されているプログラムが、特に何も指定されていない場合に標準的に利用するデータ入力元。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む