2017年12月16日

【PowerShell】コピーしたソースコードに含まれる0xC2A0(no-break space)を半角スペース(0x20)に変換するスクリプトを作ってみた


当ブログの記事中に掲載しているソースコードをコピーしてVBEなどのエディターに貼り付けると、行頭の空白が変な文字に変換されててそのままでは使えないことがあります。

たとえば、このようなソースコードをコピーして、
Public Sub MakeForm()

    CreateForm
    
    DoCmd.Restore
    
End Sub

AccessのVBEに貼り付けてみると、

頭に「?」が並んだ状態になってしまいます。

これでは当然コンパイルできませんし、実行も出来ません。

調べてみると、どうやらこれはno-break spaceというものでWeb上で複数の空白を表現するのに使われたりするらしいんです。そしてUTF-8だと0xC2A0のコードになるようなんです。

あと気になるのは、この現象が起きるのはChromeだけなんですよね。
FirefoxやEdgeだと起きません。

なんなんですかね。

Javascriptの解釈の仕方が違うんですかね。

まあでも、このブログのアクセスの6割ぐらいがChromeからで無視するわけにはいかないんで、この0xC2A0を0x20に変換するスクリプトを作ってみました。

################################################################################
# Convert-C2A0.ps1
# 
# 0xC2A0を0x20に変換する
#
################################################################################

#コードを変換
function ConvertStr{
    param($code)

    [Byte[]]$data = [System.Text.Encoding]::UTF8.GetBytes($code)

    [byte[]]$b = @()

    [bool]$flag = $false

    for ($i=0; $i -lt $data.Count; $i++)
    {
        if ($data[$i].ToString("X2") -eq "C2")
        {
            $preIndex = $i
            $flag = $true
        }
        elseif (($flag -eq $true) -and ($data[$i].ToString("X2") -eq "A0"))
        {
            $b += 0x20
            $flag = $false
        }
        elseif (($flag -eq $true) -and ($data[$i].ToString("X2") -ne "A0"))
        {
            $b += $data[$preIndex]
            $b += $data[$i]
            $flag = $false
        }
        else
        {
            $b += $data[$i]
        }
    }

    $str = [System.Text.Encoding]::UTF8.GetString($b)

    return($str)
}


Add-Type -AssemblyName System.Windows.Forms
Add-Type -AssemblyName System.Drawing

#フォーム
$form = New-Object System.Windows.Forms.Form 
$form.Text = "Convert C2A0"
$form.Size = New-Object System.Drawing.Size(400,240) 
$form.StartPosition = "CenterScreen"

#ラベル
$label = New-Object System.Windows.Forms.Label
$label.Location = New-Object System.Drawing.Point(20,15) 
$label.Size = New-Object System.Drawing.Size(250,20) 
$label.Text = "コードを貼り付けて変換ボタンを押してください。"
$form.Controls.Add($label) 

#テキストボックス
$textBox = New-Object System.Windows.Forms.TextBox 
$textBox.Location = New-Object System.Drawing.Point(20,40) 
$textBox.Multiline = $True
$textBox.AcceptsReturn = $True
$textBox.AcceptsTab = $True
$textBox.WordWrap = $True
$textBox.ScrollBars = [System.Windows.Forms.ScrollBars]::Vertical
$textBox.Anchor = (([System.Windows.Forms.AnchorStyles]::Left) `
              -bor ([System.Windows.Forms.AnchorStyles]::Top) `
              -bor ([System.Windows.Forms.AnchorStyles]::Right) `
              -bor ([System.Windows.Forms.AnchorStyles]::Bottom))
$textBox.Size = New-Object System.Drawing.Size(340,110) 
$textBox.Add_KeyDown({if ($_.Control -and ($_.KeyCode -eq [System.windows.forms.Keys]::A)) 
    {$textBox.SelectAll()}})
$form.Controls.Add($textBox) 

#変換ボタン
$ConvertButton = New-Object System.Windows.Forms.Button
$ConvertButton.Location = New-Object System.Drawing.Point(270,10)
$ConvertButton.Size = New-Object System.Drawing.Size(75,23)
$ConvertButton.Text = "変換"
$ConvertButton.Anchor = (([System.Windows.Forms.AnchorStyles]::Left) `
                    -bor ([System.Windows.Forms.AnchorStyles]::Top))
$ConvertButton.Add_Click({$textBox.Text=ConvertStr $textBox.Text; `
                          [System.Windows.Forms.MessageBox]::Show("変換が完了しました。")})
$form.Controls.Add($ConvertButton)

#閉じるボタン
$ExitButton = New-Object System.Windows.Forms.Button
$ExitButton.Location = New-Object System.Drawing.Point(285,160)
$ExitButton.Size = New-Object System.Drawing.Size(75,23)
$ExitButton.Text = "閉じる"
$ExitButton.Anchor = (([System.Windows.Forms.AnchorStyles]::Right) `
                   -bor ([System.Windows.Forms.AnchorStyles]::Bottom))
$ExitButton.Add_Click({$form.Close()})
$form.Controls.Add($ExitButton)

#フォームを常に手前に表示
$form.Topmost = $True

#フォームをアクティブにし、テキストボックスにフォーカスを設定
$form.Add_Shown({$textBox.Select()})

#フォームを表示
$result = $form.ShowDialog()
少し解説すると、テキストボックスに貼り付けられた文字列を、まずUTF-8としてバイト型配列に変換します。次に、バイト型配列を1バイトずつチェックしていき、"0xC2" "0xA0"と並んで来た場合に"0x20"に置き換えるようにしています。あとは、返還後の文字列をテキストボックスに書き込んでいます。

使用法

まず、上記スクリプトを名前を付けてファイルに保存し、PowerShellのプロンプトで実行してください。


スクリプトを実行すると、このような画面が表示されます。



画面が表示されたらテキストボックスにソースコードを貼り付け、[変換]ボタンをクリックします。



変換が終わるとこのようなメッセージが表示されます。

変換後の文字列が同じテキストボックスに表示されますので、このテキストボックスのソースコードをコピーして使ってください。






2017年12月15日

【Chrome】検索結果のページ移動をキーボードで出来るようにする拡張機能を入れてみた

Googleで検索して得られる検索結果の画面で、次のページを表示する際マウスを使って行っていると思いますが、このマウスの操作がめんどくさいと思ったことありませんか?できればキーボードで操作できるようにならないかなって思ったことありませんか?

私はけっこう前から思ってたんですけど、Chromeには標準でそういうショートカットはないのであきらめてました。

ところがこの前、何気なくChromeの拡張機能を見ていたらこんなものを見つけてしまいました。

2017年12月14日

【Windows】キーボードだけでウィンドウを移動する方法

前回、キーボードだけでウィンドウサイズの変更を行う方法を書きましたが、今回はウィンドウの移動です。

では手順です。

[Alt] + [Space] ⇒ [M]

たとえばメモ帳で試してみますと、キーボードで[Alt] + [Space]を押すとこのようなメニューが表示されます。

ここで[M]キーを押すとウィンドウを移動できるモードに切り替わります。

あとは、矢印キーを使って移動します。

移動モードを終了するには[Enter]を押します。


実行例



2017年12月13日

【Windows】キーボードだけでウィンドウサイズを変更する方法

通常はマウスを使ってウィンドウサイズを変更すると思いますが、まれにマウスが無かったり、ワイヤレスマウスを使ってて急に電池が切れて使えなくなってしまうことがあったりします。そういった場合キーボードだけで操作する方法を覚えておくと役に立つことがあります。

では手順です。

[Alt] + [Space] ⇒ [S]

たとえばメモ帳で試してみますと、キーボードで[Alt] + [Space]を押すとこのようなメニューが表示されます。

ここで[S]キーを押すとウィンドウのサイズを変更できるモードに切り替わります。

あとは、矢印キーを使ってサイズを変更します。

←→ で幅、 ↑↓ で高さを変更できます。

変更モードを終了するには[Enter]を押します。


実行例



2017年12月12日

【サクラエディタ】タブの切り替えを行うショートカット



サクラエディタでタブを切り替える方法です。

次のタブ

[Ctrl] + [Tab]




前のタブ

[Shift] + [Ctrl] + [Tab]




このタブを切り替えるショートカットは、Chromeなどのブラウザでも同じですので覚えておくと便利だと思います。

2017年12月11日

【Windows】コンテキストメニューを表示するショートカット

Windowsを使っていると右クリックしてコンテキストメニューを表示させる機会が多いのですが、このコンテキストメニューをキーボードからショートカットで表示することが出来ます。

すごく簡単です。

まず、ファイルを選択します。



選択したら [Shift] + [F10] を押します。

[Shift] + [F10]



するとこのようにコンテキストメニューが表示されます。


2017年12月10日

Lightning用の変換アダプタを買ってみた

先日、スマホをiPhoneに買い替えたのですが、充電用ケーブルなどが付属でついてきたものしかなく、ちょっと困っていました。

いままではAndroidのスマホ使っていたので、マイクロUSBケーブルは長いものを含めて何本かあるんですけどね。

うーん、どうしよっかと悩んでいたところ、Amazonでこんなものを見つけてしまいました。

Lightning用の変換アダプタです。

なんと5個も入ってて千円切ってます!

さっそく注文してみました。


まず届いた商品ですが、このような袋で送られてきました。



中には5個のアダプタと、おまけでシリコン製のスマホスタンドが入ってます。



手に取ってみるとこんな感じです。



実際にマイクロUSBに挿してみました。

特に引っかかるとかなく難なく差し込めました。
また、ゆるくて抜けてしまうということもないです。


最後に、iPhoneに繋いでみて充電出来るか試してみました。

まったく問題ないですね。当たり前ですが、ちゃんと充電できました。

あと、一応5個全部確認しましたが、不良品等は一つもありませんでした。

5個でこの値段はおすすめだと思います。
Android用のケーブルも無駄にならなくていいと思います。