2019年05月

Equalizer APOで警告メッセージが表示されるようになった

Equalizer APOの起動時に以下のようなメッセージが表示されたので対処法をメモ。

キャプチャ2

この画面で[Yes]をクリックすると以下のダイアログが表示される。

キャプチャ3

[OK]をクリックするとサウンドデバイスの選択画面が表示されるので、使用するデバイスを選択する。

その後、OSの再起動通知が表示されるので、問題なければそのまま再起動を行う。

オーディオインターフェースを追加したのが原因な気がする。

PowerShellでSeleniumを使う

導入

  • C#用のクライアントをダウンロードする

    • https://docs.seleniumhq.org/download/  から今回はselenium-dotnet-3.14.0.zipをダウンロード
    • 適当な場所に解凍。 中身の.nupkgファイルははzipファイルなので拡張子をzipに変更して解凍する。
      今回は以下のフォルダに解凍した

      selenium-dotnet-3.14.0/
       ├Selenium.Support.3.14.0/
       ├Selenium.WebDriver.3.14.0/
       ├Selenium.WebDriverBackedSelenium.3.14.0/

  • chrome用のwebdriver(chromedriver_win32.zip)をダウンロード
    • 上記のリンクから取得、WebDriverフォルダを作成し中身のchromedriver.exeをコピー

とりあえず以下のようなフォルダ構造にした。

├selenium-dotnet-3.14.0/  
  ├Selenium.Support.3.14.0/  
  ├Selenium.WebDriver.3.14.0/  
  └Selenium.WebDriverBackedSelenium.3.14.0/

├WebDriver/  
  └chromedriver.exe

サンプルコード

#使用するフレームワークのバージョンにあったものを選べばいいはず
#読み込む順番でエラーが出たりしたので、正しい順番があるかもしれない。
Add-Type -Path ".\selenium-dotnet-3.14.0\Selenium.WebDriver.3.14.0\lib\net45\WebDriver.dll";
Add-Type -Path ".\selenium-dotnet-3.14.0\Selenium.Support.3.14.0\lib\net45\WebDriver.Support.dll";
Add-Type -Path ".\selenium-dotnet-3.14.0\Selenium.WebDriverBackedSelenium.3.14.0\lib\net45\Selenium.WebDriverBackedSelenium.dll";

#webdriverを読込
#chromedriver.exeまで指定するとエラーになるのでexeファイルが存在するフォルダを指定
$driver = New-Object OpenQA.Selenium.Chrome.ChromeDriver(Convert-Path ".\WebDriver\")    
#タイムアウトの時間?(効いてるのかあまりよくわからない)
$driver.Manage().Timeouts().ImplicitWait= [System.TimeSpan]::FromSeconds(10)
#yahooのトップページを開く
$driver.Navigate().GoToUrl("http://yahoo.co.jp")

#検索ボックスの要素を取得
$element=$driver.FindElementById("srchtxtBg")

#検索ワードを入力
$element.SendKeys("powershell")
#エンターキーを送信して検索を実行
$element.SendKeys([OpenQA.Selenium.Keys]::Enter)

#webdriverを閉じる
$driver.Quit()

PowerShellでクラスを使う

SQLiteを使うときにいちいちセッションを張って開放する記述を書くのが面倒なのでクラスを使って再利用できるようにしてみる

クラスをファイルに作成。

Add-Type -path "System.Data.SQLite.dllのパス"
class Connect_SQLite_Base : System.IDisposable{     
    [psobject] $conn = (New-Object System.Data.SQLite.SQLiteConnection)
    [psobject] $cmd  = (New-Object System.Data.SQLite.SQLiteCommand($conn))

    Connect_SQLite_Base($location){
        $this.conn.ConnectionString = "Data Source =" + $location
        $this.conn.Open()
        $this.cmd = New-Object System.Data.SQLite.SQLiteCommand($this.conn)
    }

    [void] Dispose(){
        $this.cmd.Dispose()
        $this.conn.Close()
        $this.conn.Dispose()       
    }
}

作製したクラスを読み込むサンプルコード。

#クラスの読込
. ".\SQLite_Connect.ps1"

#データベースファイルの場所を渡す
$sqlite = New-Object Connect_SQLite_Base(convert-path .\sample_db.sqlite3)
$sqlite.cmd.CommandText="select * from  jobs LIMIT 5"

$read = $sqlite.cmd.ExecuteReader()

$sqlite.Dispose()

この程度の記述ならFunctionでもよかったと思う。

System.IDisposableを継承してみたが意味は無いと思う。

Usingが使えるといいのだが。

Format-List等で余分な空白、空行を除外する

Format-ListやFormat-Wideで出力すると、余分な空白や行が混じってしまう場合に取り除くメモ。

htmlをパースして特定の要素を抜き出した結果を出力した時などにそうなった。

 #Out-String -Streamで文字列として出力、?で空白行以外を抽出、%のループで文字列をトリムする
  $obj.links | Format-Wide -Column 1 | Out-String -Stream | ?{$_ -ne ""} | %{$_.trim()}

# ? Where-Objectのエイリアス
# % ForEach-Objectのエイリアス