今日の知見

Toshが諸々で得た知見を雑に書きます。

23日目-1: Windows Subsystem for Linux

ご挨拶

こんばんは。Tosh でございます。
昨日は1日中寝ておりましたので用事が何1つ片づけられませんでしたorz
当記事は22日目の穴埋めとなります。
相変わらずのネタ不足なので今回も軽めで(苦笑)

Windows Subsystem for Linux(WSL)

前置き

Windows 10 の Fall Creators Update から本格的に導入された「Linux のネイティブ環境を Windows 上で実行する仕組み」で、導入手順その他諸々の紹介記事はすでに上がっていると思います。

Tosh が業務でどう使用しているかの紹介……の前に、手順をざっくりおさらいします。

  1. 「コントロールパネル」の「プログラムと機能」より WSL を取得する(要再起動)
  2. Microsoft Store」よりお好みの Linux ディストリビュージョンを取得する
  3. 取得したディストリビュージョンを実行して、ユーザ名とパスワードを実行する

業務でどう使用しているか

今のところは一部のコンパイラなどをインストールしても動作しないようなので、もっぱらシェルスクリプトで雑務の(半)自動化をしておりますorz

困ったこと

上記でも挙げた通り、一部のコンパイラをインストールしても動作しないので、簡単なバッチ作成で場合によっては苦戦したりしております。
Tosh が試したのは下記のとおりです。

「Spring Creator Update で大体動くようになる」という情報を得たので、いったんはそれ待ちですかね……。
何か情報がございましたらご教示いただけますと幸いですm(_ _)m

ではでは、今回はこの辺で。
本日分は夕ご飯を済ませてから考えます。

21日目-2: 関数型プログラミング言語をかじってみて

ご挨拶

こんばんは。Tosh でございます。
サボりサボりのブログですが、毎日書けるほどネタがないんですorz
というわけで、今回は技術的な話はあまりしません(;´Д`)

関数型プログラミング言語をかじってみて

タイトル的にも内容的にもいくらでも叩かれそうなんですが、私の関数型プログラミング言語の習熟度って

という程度なんです(泣)
とはいえ、そのレベルでも他の言語を書く際の意識が多少変わるので、3点ほど挙げてみたいと思います。
※効果には個人差がございます。

記述量が減った、記述が簡潔になった

言語や処理によるとは思いますけど、「カウンタ設けてループ回して……」とか「イテレータ使用して……」としてリストの中身を1つずつなめて抽出や変更していくよりもラムダ式でフィルタリングかけたりマッピングかけたりする方がシンプルだったりします。
とはいえ、Java で言う Stream API とか C# でいう Enumerable な形に持っていくのにいくつもメソッドを噛まさないといけないのであればその限りではありませんが……

参照透過性を保ちやすくなった

上記と関連して、状態を管理するような変数を使用する機会が減れば実行結果を予測しやすくなると思われます。
関数の動きはなるべく関数名と引数から予測できるようにしたいものですね。

副作用を意識するようになった

これまた前述までの項目とかぶりますが、関数の引数と戻り値のほかに発生する入出力も意識するようになり、ある程度デバッグしやすい記述ができるようになりました(……と思いたいです)。

ではでは、今日はこの辺で。

21日目-1: Vagrant 高速化

ご挨拶

こんばんは。Tosh でございます。
昨日更新したのにタイトルが穴埋め分となっているのは、日数を勘違いしていたからですorz
4/1から始めたので今日で21日目ですね……
それでは、宣言通り今日はそこそこ濃い内容でお送り致しますノシ

Vagrant 高速化

……というより、正確に言うと Virtual Box の設定周りなんですが(汗)
共有ファイルの切り替えや環境の切り分け・複製が楽なのもあって仕事で使っておりますが、開発環境 VM のパフォーマンスが悪いってことで、ここ数日はパラメータ調整と検証をやっておりました。
それではさっそく Vagrantfile の中身の一部をば。

config.vm.provider :virtualbox do |v|
  v.cpus = 2
  v.memory = 2048
  v.customize["modifyvm", :id, "--ioapic", "on", "--chipset", "ich9"]
  v.customize["storagectl", :id, "--name", "SATA", "--hostiocache", "on"]
end

それでは、各項目の説明をば。

  • v.cpus
    • CPU の(論理)コア数を設定しております。
  • v.memory
    • メモリ容量を設定しております(MB 単位)。
  • v.customize
    • 上記2つ以外の設定を行っております。上記2つの設定も含めることができます。
      • modifyvm
        • Virtual Box の「システム」に相当する部分です。
          • ioapic
            • CPU をマルチコアにする場合は ON
              I/O の割り込みをどうたら……ってよく覚えてません(´・ω・`)
            • chipset
              • デフォルト設定だと互換性重視のために古いのが残っているみたいです。
      • storagectl
        • Virtual Box の「ストレージ」に相当する部分です。
          設定する場合はストレージ名も指定します。
          • hostiocache
            • ホストの I/O キャッシュを利用するようにします。
              ディスクアクセスのオーバヘッドが格段に減りますが、環境によってはホスト側のリソースを圧迫したりするかもしれません。

……とまあ、ほかにもこまごまとした設定がありますが、Tosh の観測範囲ではこの辺を見直すだけで倍以上速くなったので、効果は十分と思われます。

11~19日目: ネタがないから Git に頼る

ご挨拶

ご無沙汰しております。Tosh でございます。
前回の更新以降、仕事は落ち着きましたが、体調悪化などの諸々が重なってしまい更新が滞ってしまいましたorz

表題のとおりネタも仕入れられていない状態なので、軽めのを1つだけ。

git stash

Git を使って開発している際によくあるのが「現在の差分を commit しないとリモートから merge できない」だと思います
(実際、私の周りでもこういうので詰まってる方が割と多かったです)。
「かといって commit するほど作業が進んでない……」という状況で使えるのが stash です。
現在の差分を退避したり復元したりするコマンドですね。

書式は下記のような感じです。
私がよく使うもののみ載せておきます。

git stash [pop ${id} | list]

ではそれぞれの説明をば。

  • git stash
    • 現在の差分を退避する
  • git stash pop
    • 退避した差分を復元して list から消す
      • 衝突が発生した場合もちゃんと表示してくれる
      • コマンド例:git stash pop stash{0}
  • git stash list
    • 退避している差分の一覧を表示する

TortoiseGit のメニューから察するに差分にコメントを付けられるようなんですが、その辺は省略致しますm(_ _)m

ではでは、本日はこの辺で。
明日はちょっとしっかりしたものを書く予定です。

10日目: 変数名に悩んだら

ご挨拶

こんにちは、Toshでございます。
先月からドタバタしていた今の作業も(当初の締切を過ぎてますが)ようやく終わりが見えてきました(;'∀')
昨日はソースのサンプルを載せたので、今回は軽めにw

codic 先生

適切な変数名が思い浮かばない場合、Google 翻訳等を挟むのも手ですが、私は codic を利用しております。
(プログラマの方は結構なじみ深いと思いますが……)

codic.jp

codic のいいところとしてはそれっぽい日本語を入力すればスネークケースで結果を出してくれるところですかね。 f:id:tosh_note:20180410124215p:plain

あと、翻訳をカスタマイズすることもできるみたいです(要サインアップ)。 f:id:tosh_note:20180410124323p:plain

補足として、こういったサービス等を通しても長くなるような場合とか、そもそも適切な日本語が思い浮かばない場合などは実装を見直す必要がありそうですね……orz
その辺はまた別の機会にでも。

ではでは、今日はこの辺で。

9日目: VBScript で zip 圧縮

2018-08-07 追記: どうやら ShellApplication から zip ファイルを処理することは想定されていないようです。
Tosh の周りでは後述の処理で問題なく圧縮ができておりますが、想定しない事象が発生する可能性があるため、実行は自己責任でお願いできますと幸いです。
詳細は下記リンクにて。
https://support.microsoft.com/ja-jp/help/2679832

(「想定しない挙動」がどんなものか興味がありますので、リンク先に掲載されている以外の事象が発生しましたらコメント頂ければと。)

ご挨拶

こんにちは、Tosh でございます。
派遣先より失礼致します。
平日帰宅してからだと続けられそうにないので、仕事中のテンションを利用して(ドタバタしてなければ)休憩中に書いてしまおうというアレですね。
思い切り私用なんですが、仕事の生産性にかかわることなので許してください何でもしますから!()

VBScript で zip 圧縮

まずはサンプルコードをば。
VBScript のお作法は何も理解してないので変数名とかすごく適当なんですが、何卒何卒。

' 
' zip 圧縮
' 
Function zipCompress(ByVal fileName)
  ' ファイルシステム
  Dim fso: Set fso = CreateObject("Scripting.FileSystemObject")

  ' 拡張子を取る
  Dim withoutExt: withoutExt = Left(fileName, InStr(fileName, ".") - 1)
  
  ' zip ファイルを作成
  Dim zipFileName: zipFileName = withoutExt & ".zip"
  Dim zipFile: Set zipFile = fso.OpentextFile(zipFileName, 2, true)
  zipFile.Write Chr(&H50) & Chr(&H4B) & Chr(&H5) & Chr(&H6) & String(18, Chr(0))
  zipFile.Close
  Set zipFile = Nothing
  
  ' zip ファイルに 元のファイルを入れる
  Dim wsh: Set wsh = CreateObject("Shell.Application")
  Dim zipFileSh: Set zipFileSh = wsh.NameSpace(fso.GetAbsolutePathName(zipFileName))
  Dim parentFolderPath: parentFolderPath = fso.GetAbsolutePathName(fso.GetParentFolderName(fileName))
  zipFileSh.CopyHere wsh.NameSpace(parentFolderPath).ParseName(fso.getFileName(fileName))
  
  ' 圧縮が終わるまで待ち合わせ
  Do Until zipFileSh.Items().Count = 1: WScript.Sleep 100: Loop
  
  ' 元のファイルを削除
  fso.DeleteFile fileName
  
  Set fso = Nothing

  zipCompress = true
End Function

流れとしてはコメントの通りで、今一度下記にまとめます。

  1. ファイル名から拡張子を除いたものを抜き出す
  2. 1.の名前で空の zip ファイルを作成する
  3. 2.の zip ファイルに元のファイルを入れる
  4. 元のファイルを削除する(オプション化すべき?)

ではでは、簡単に解説をば。

1. ファイル名から拡張子を除いたものを抜き出す

単に切り出しているだけなので省略。

2. 1.の名前で空の zip ファイルを作成する

ファイル作成自体は FileSystemObject によるテキストファイル出力とほとんど変わらないと思います。 気を付けて頂きたいのは下記のおまじないですね。
どうやら zip ファイルの先頭は下記のバイナリになっているようです。 この部分が理解できれば他の言語でも zip 圧縮を実装できる?

  zipFile.Write Chr(&H50) & Chr(&H4B) & Chr(&H5) & Chr(&H6) & String(18, Chr(0))

3. 2.の zip ファイルに元のファイルを入れる

VBScript の組み込み関数ではどうしようもないみたいなので、ShellApplication を呼び出してごにょごにょやってます。
具体的には、下記のようなことを雰囲気でやっております。

  1. ShellApplication のカレントパスをファイルのパスに指定
  2. 親フォルダのパスを取得
  3. 1.と2.を使用して zip ファイルに投入

それぞれの関数の詳細は省かせて頂きますm(_ _)m

4. 元のファイルを削除する

FileSystemObject の関数を呼び出しているだけなので省略

ではでは、今日はこの辺で。

8日目-7: 【TODO】Windows Forms でWebページのキャプチャを取得する方法

ご挨拶

こんばんは、Toshでございます。
やっと記事が追い付きましたが、今回は知見というよりは TODO となります。

TODO: キャプチャツールの自作

仕事のタスクの一つに検査を自動化するツールを洗練することも含まれてますが、既存の汎用的なキャプチャツールだと負荷が高かったり AJAX による画面のタイマー更新がうまく反映されなかったりと割と問題が山積みなので、自作ツールの機能に入れてしまおうという魂胆です(・∀・;)
System.Windows.Forms.WebBrowser クラスを使えばどうにかなりそうな感じがするので、あとは BMP として吐き出すなりなんなりすれば大体OKという認識です。
WebBrowser クラス (System.Windows.Forms)

その辺、調査と実装が終わったタイミングでまとめてみようと思います。
ではでは、今日はこの辺で。