VS Codeでgitを使うために認証情報を入力する

VS Codeでうまくgitが使えず、メッセージどこかに出てないかなーと思ったら、ふつうに出力タブが下にあってエラーメッセージに解決内容まで載っていた。

*** Please tell me who you are.

Run

  git config --global user.email "you@example.com"
  git config --global user.name "Your Name"

to set your account's default identity.
Omit --global to set the identity only in this repository.

要するに認証を通せと言っているので、素直にターミナルでコマンド実行すると解消する。

参考

Visual Studio Code で Git を 使う | 験なきものを思はずは

PowershellでExcelファイルのシート名の一覧を取得したい(作りかけ2)

PowershellでExcelファイルのシート名の一覧を取得したい(作りかけ) - mk_55's diaryの続き。

とりあえず使えるようにはなった。あとはPesterでテスト書いたりする必要あり。いまだにVS Codeでgitが上手く使えない...

Excel.psm1

function Get-WorkSheetNames {
    [CmdletBinding()] #Write As a ScriptCmndlet
    Param (
        [parameter(mandatory = $true, ValueFromPipeline = $true)]
        [string[]]$Path,

        # todo need more better naming
        [parameter(mandatory = $false)]
        [boolean]$needsOutputFileName = $false
    )

    begin {
        # open Excel
        $excel = New-Object -ComObject Excel.Application
        $excel.Visible = $false
        $excel.DisplayAlerts = $false

    }

    process {
        try {
            # Argument Validation
            if (-not(Test-Path $Path -Include "*.xlsx", "*.xls", "*.xslm" )) {
                Write-Debug "File not Found or File not ExcelBook"
                throw  New-Object "System.ArgumentException" @("File not Found or not ExcelBook", $Path) -ErrorAction Stop
            }

            # Get absolute path (for Excel.Application.Workbooks.Open())
            $ExcelPath = Convert-Path $Path
            
            # Get sheet name
            $book = $excel.Workbooks.Open($ExcelPath)
            if ($needsOutputFileName) {
                $fileName = Split-Path $ExcelPath -Leaf
                $book.WorkSheets | ForEach-Object {Write-Host $filename ":" $_.Name }
            } else {
                $book.WorkSheets | ForEach-Object { $_.Name }
            }
            
        
        } catch [System.ArgumentException] {
            Write-Error $_

        } catch {
            # in order to close Excel in End Block
            Write-Errot $_
        
        } finally {
            # close book
            if ($book) {
                [void][System.Runtime.Interopservices.Marshal]::ReleaseComObject($book)
            }
        }
    }

    end {
        # close Excel
        Write-Debug "Close Excel"
        [void]$excel.Quit()
        [void][System.Runtime.Interopservices.Marshal]::ReleaseComObject($excel)
        
    }
}

Export-ModuleMember -Function Get-WorkSheetNames

PowershellでExcelファイルのシート名の一覧を取得したい(作りかけ)

最近技術的なことができてない。 なにか書こう、ということでPowershellのモジュール(作りかけだが)。

本当はgitとかにいれるべきだが、VSCodeとgitをまだ使いこなせていない感があり、ひとまず成果を上げる

Excel.psm1

function Get-WorkSheetNames {
    Param (
        [parameter(mandatory = $true)]
        [string]$excelPath
    )

    begin {
        # open Excel
        $excel = New-Object -ComObject Excel.Application
        $excel.Visible = $false
        $excel.DisplayAlerts = $false

    }
    process {
        #todo check Param
        #todo Convert Relative Path to absolute Path

        $book = $excel.Workbooks.Open($excelPath)
        $book.WorkSheets | ForEach-Object { $_.Name }

    }

    end {
        # todo kill some objects cleary  
        # close Excel
        [void]$excel.Quit()
        [System.Runtime.Interopservices.Marshal]::ReleaseComObject($book)
        [System.Runtime.Interopservices.Marshal]::ReleaseComObject($excel)
        
    }
}

Export-ModuleMember -Function Get-WorkSheetNames

音声入力をためしてみる

勝間和代氏が音声入力でブログを書いていており、音声入力による生産性の向上は、ざっくり「3倍」くらいのイメージと書いているのを見て、自分でも音声入力を試してみることにした。 この記事は音声入力で書かれている。音声入力は Google 音声入力を使い、PCとAndroidで試した。

PC の場合

Google ドキュメントを使って音声入力でテキストを入力することができる。Google ドキュメントで[ツール]⇒[音声入力]と選択すると、画面上にマイクのボタンが表示される。このボタンをクリックして赤くなっている間はマイクから音声が Google ドキュメントに自動で入力される。またショートカット(Ctrl-Shift+S)を利用することで入力のON/OFFを切り替えることができる。

Android の場合

Android の場合は Google 日本語入力を利用して音声入力をすることができる。音声入力はデフォルトでは無効になっているので Google ドキュメントの設定から有効化が必要だ。 参考:文字入力時に音声入力が行えない | ファーウェイお客様サポート

やってみて

PC とアンドロイドを比較すると以下のようなメリットデメリットがある。

PC の場合非常にスムーズに変換してくれる。ある程度の長さで入力すれば誤変換も文章単位で前後の文脈から認識してくれるようだ。また、入力しながらキーボードで入力することもでき、単純に音声入力を利用するという意味では PC の方が優れているだろう。 一方で PC の場合は 、PC の前で入力することになるが 、Android の場合は自由な場所で入力できることがメリットだ。例えば、寝ながら、家事をしながら、トイレの中で、など場所を選ばず入力できることは非常に強いメリットである。

このことから音声入力を利用したドキュメントは Google ドキュメント上に作成し、ある程度気合を入れて編集するときは PC で、ながら手入力する時はスマホでといったように、いつでもどこでも音声入力で編集できる環境を作ることが重要そうだ。

ただ、私はクラウド上のデータを OneNote や One Drive に集約している、ためどうにかどちら側に集約し、一元管理したい。OneNote にもアドインによって、音声入力は可能なのだが、Googleに比べると固有名詞の変換精度が大きく劣るので難しいところだ。

ともあれ、使い慣れたキーボードとは違った方法なので戸惑いもあるものの、喋ったことをそのまま記録してくれる、つまり口述筆記のようなことを簡単に行うことができた。非常に優秀なアウトプットの方法の一つであることは間違いない。 キーボードを使った入力と比較してみると、キーボードは非常に高速な一方で、入力の敷居が高く集中力も要する。一方の音声入力であれば、思ったことを簡単にメモしておき、後でそれを整形すればそれなりの文章を作ることも可能だ。これからは音声入力を積極的にシーンに応じて利用することが生産性を高めることにつながるだろう*1

*1:たとえば普段書くような技術的な記事は音声入力は難しくても、小説や漫画の感想を書く分には音声入力のほうがよほど優れているだろう

Windowsのアカウント名とユーザー名の関係がよく分からない

帰省したら実家のパソコンの問題を相談されるのは、割と業界あるあるだと思う。 結局問題を根本から解決できなかったのだが、事象の記録のためにメモ。

事象

Windows10のPCにエクスプローラーからファイル共有できない。 ユーザー名とパスワードが誤っている旨のメッセージが出力されるが、接続元のPCにはその情報でログインできる。 しかしnet useで接続しようとすると、システムエラー86がでるので、認証周りの問題であることは確か。

原因

ログインで使っているアカウント名と、実際にプログラムを動かしているユーザ名が不整合を起こしている

ログインしたアカウント名でパッと見は動いているように見えるのだが*1、タスクマネージャーでログインユーザーを確認すると名前がアカウント名が異なる net userを実行すると、ログインのアカウント名は表示されず、タスクマネージャーで出るユーザー名が表示される。

タスクマネージャーで表示されたユーザー名でファイル共有すると問題なく接続できた

その他

おそらくアカウント名を途中で変更した結果、不整合が起こっているのだとは思うが、そこまで手を入れると色々と面倒なので断念 ※フォルダ名やレジストリを整合性を保ちながら変更すればよいのだと思うが、他のソフトへの影響もよく分からないので運用対処とした とりあえず、ユーザーサポートに休み明けに連絡するか、タスクマネージャーで表示されたユーザー名でファイル共有するように言っておいたが......

参考

http://tooljp.com/windows/doc/net-use/net-use-error.html

*1:GUIの設定からアカウント名を確認すると、ログイン時のアカウント名が表示される

L2スイッチのAccess Control List(ACL)で嵌った話

概要

  • 同一ネットワークのサーバ間の通信がpingしか通らないという事象に遭遇した
  • iptableやらnetstatやらいろいろしたのだが結局OSのレベルでは切り分けられず、NW屋さんに聞いたところL2スイッチにもAccess Control List(ACL)なる仕組みがあるそうで、それによって通信が制限されていた。
  • 広い視野をもたないといけないと思ったので、簡単なメモ書き

どんな事象だったのか?

  • サーバAとサーバBの間でping(ICMP)以外の通信が通らない。

  • traceroute-U-Tもだめで、-Iだけが通る。

  • iptables(OSのファイアウォール)でポートやIPアドレスが制限されているわけでもない。

といった状況でOSレベルではどうしようもないな、ということでNW屋さんにヘルプ要請

原因はなんだったのか?

サーバが接続されているL2スイッチのAccess Control List(ACL)が適切に設定されていなかったため、サーバ同士(IPアドレス)の通信ができなかったとのこと。

そして恥ずかしながらL2スイッチにおけるACLというものの存在を初めて知った。

Access Control List(ACL)とはなにか?

いろいろ調べたのだが、結局日本語ではスイッチレベルでもパケットの制限をできるという以上のことをすっきりとわかる説明は見当たらなかった。 スイッチのACLであればインターフェース単位での制御になるとか、多層防御の考えに立てば両方やるべきという理屈はたつとか、いろいろあるのだと思うがどうもすっきりしない。

で、たどり着いたのが以下のページ

Cisco Routers and Firewalls - Differences Between an ACL and Firewalls

とても雑に要約すると以下のような感じ。ひとまず理解できた気になれる程度の情報はある。

  • 機能はよく似ている面もあるけど実際には重要な違いがある

  • ACLはインターフェース単位で制御をかけるのでパケットのフィルタリング以外にもいろいろ使える

  • ACLはパケット単体でしかフィルタリングできない(ステートレス)だが、ファイアウォールはステートフルに通信を監視できる

実際のNW屋さんはもっといろいろ考えて設計しているのだと思うのだが、ひとまずはここまで。

サブネットマスクを間違っても通信できる場合

サブネットマスクを間違うと中途半端に通信ができてしまう場合がある。

そもそも論

IPで通信する端末は、まず最初に相手が自分と同じネットワーク(サブネット)に属しているかどうかを調べ、ネットワークが異なればルータを経由して通信する

通信相手が同じサブネットに所属しているかどうかの判断は、自分に設定されたサブネットマスクを使う

IPアドレスサブネットマスク論理積(AND)をとって比較します。

で、サブネットを間違うとどうなる?

たとえば、コンピュータAのIPアドレスが「192.168.0.1」、サブネットマスクが「255.255.255.0」だったとしよう。そして、コンピュータBのIPアドレスが「192.168.0.2」、サブネットマスクが「255.255.0.0」だったとする

上記の場合、なんと設定が間違っているのに通信できてしまう サブネットマスクIPアドレスサブネットマスクから二つのコンピュータは別ネットワークであるはずだが、たまたまIPアドレスサブネットマスク論理積が同じなため、コンピュータAからはコンピュータBが、コンピュータBからはコンピュータAが自身と同じネットワークにいるように認識してしまう。

参考情報