MW211 EXIT

devlog
PHP/file_get_contents()の限界
2015年08月18日
「file_get_contents()」はホームページの値をまるごと取得できたりするが
JavaScriptで表示されているもの、JavaScriptで表示された値は取得できない。

つまり、起動時にJavaScriptで何らかの値を表示しているホームページに
アクセスした場合、JavaScriptが動作する前の状態を取得してしまうということだ。

なぜできないのかというと、JavaScriptは各ブラウザが処理を行うもので
PHPはそこまでは範疇ではない(JavaScriptを動作させるまでの機能を持たない)からだ。

ということで、こういったことを実現したい場合には、他をあたるしかない。

一例としては、VBScriptでIEオブジェクトを起動し
IEとしてアクセスを行い、JavaScript動作後の値を取得するとかだ。

…といって、IE以外ではVBScriptは動かないし、
IE自体もIE11以降はサポートを打ち切っているので、この案は無理に等しい。
分類:PHP
Windows/80ポート開放のやり方
2015年08月17日
「コントロールパネル」より
「システムとセキュリティ」の「Windowsファイアウォール」を選択し
「詳細設定」を選択。

「受信の規則」より「新しい規則」を選択。

「規則の種類」で「ポート」を選択。
  ┌────────────────────────────────────┐
  │新規の受信の規則ウイザード/規則の種類                                  │
  ├────────────────────────────────────┤
  │どの種類の規則を作成しますか?                                          │
  │  ○プログラム                                                          │
  │  ●ポート                                                              │
  │  ○事前定義                                                            │
  │  ○カスタム                                                            │
  └────────────────────────────────────┘

次に、「TCP」と「特定のローカルポートを選択し、ポート番号(「80」)を入力する。
  ┌────────────────────────────────────┐
  │新規の受信の規則ウイザード/プロトコルおよびポート                      │
  ├────────────────────────────────────┤
  │TCPとUDPのどちらに規則を適用しますか?                                  │
  │  ●TCP                                                                 │
  │  ○UDP                                                                 │
  │                                                                        │
  │すべてのローカルポートと特定のローカルポートの                          │
  │どちらを対象にこの規則を適用するか選択してください。                    │
  │  ○すべてのローカルポート                                              │
  │  ●特定のローカルポート                                                │
  │    ┌──────────────────────────────┐    │
  │    │80                                                          │    │
  │    └──────────────────────────────┘    │
  └────────────────────────────────────┘

次に、「接続を許可する」を選択する。
  ┌────────────────────────────────────┐
  │新規の受信の規則ウイザード/操作                                        │
  ├────────────────────────────────────┤
  │接続が指定の条件に一致した場合に、どの操作を実行しますか?              │
  │  ●接続を許可する                                                      │
  │  ○セキュリティで保護されている場合のみ接続を許可する                  │
  │  ○接続をブロックする                                                  │
  └────────────────────────────────────┘

次に、「ドメイン、プライベート、パブリック」の全てを選択する。
  ┌────────────────────────────────────┐
  │新規の受信の規則ウイザード/プロファイル                                │
  ├────────────────────────────────────┤
  │この規則はいつ適用しますか?                                            │
  │  ■ドメイン                                                            │
  │  ■プライベート                                                        │
  │  ■パブリック                                                          │
  └────────────────────────────────────┘

最後に、ファイアウォール(の規則)を命名(「HTTP」や「Apache」など)して完了。
  ┌────────────────────────────────────┐
  │新規の受信の規則ウイザード/名前                                        │
  ├────────────────────────────────────┤
  │名前                                                                    │
  │┌──────────────────────────────────┐│
  ││HTTP                                                                ││
  │└──────────────────────────────────┘│
  │説明(オプション)                                                        │
  │┌──────────────────────────────────┐│
  ││                                                                    ││
  └────────────────────────────────────┘
正規表現/入れ子回避
2015年08月16日
「{」の中にある「a」以外の「a」を検索する場合。
┌──────────────────────────────────────┐
│(?<!{[^}]*)a                                                                │
└──────────────────────────────────────┘
分類:正規表現
秀丸マクロ/gettext対応
2015年08月15日
┌────────────────┬─┬────────────────┐
│{$変数|escape}                  │→│{_($変数)|escape}               │
└────────────────┴─┴────────────────┘
Smartyテンプレートで上記の置換を行うマクロ。

まず、手動で直接行う場合。
┌────────────────┬─┬────────────────┐
│{\$([^{]*?)\|escape\}           │→│{_($\1)|escape}                 │
└────────────────┴─┴────────────────┘

これをソースコードにすると以下。
┌──────────────────────────────────────┐
│replaceall "{\\$([^{]*?)\\|escape\\}" , "{_($\\1)|escape}" , regular;       │
└──────────────────────────────────────┘
分類:正規表現
ExcelVBA/DoEventsとは
2015年08月14日
正式には「Application.DoEvents」メソッドだが、
省略形で「DoEvents」と記述されることが多い。

Unix系はマルチタスクOSだが、Windows系は疑似マルチタスクOSである。

つまり直列的に処理が行われるので、Excelで重い処理を行うと
一部の他処理が止まってしまう(画面が真っ白になったりする)。

そのような場合、処理と処理の間に「DoEvents」を挟むことにより、
そのタイミングでOSへ処理を一旦返上し、
溜まっていた処理を吐き出す(実行する)ことができるようになる。

当然ながら、再びはOSより処理は戻ってくるので、続きが行われる。
分類:ExcelVBA
Smarty/gettext()
2015年08月13日
多言語変換の」gettext()」は、翻訳対象を「_()」で囲えばよい。

では、Smartyの場合はどうか。

変数の場合。
┌────────────────┬─┬────────────────┐
│{$変数|escape}                  │→│{_($変数)|escape}               │
└────────────────┴─┴────────────────┘

定数の場合。
┌────────────────┬─┬────────────────┐
│定数                            │→│{_('定数')}                     │
└────────────────┴─┴────────────────┘
もう少しスマートなやり方がありそう。
分類:Smarty
ExcelVBA/保存先指定ダイアログ
2015年08月12日
保存先をダイアログで指定するようにする方法。
┌──────────────────────────────────────┐
│Dim 保存先ファイル名 As String                                              │
│ChDir ActiveWorkbook.Path   ' 本ファイルのフォルダを既定とする              │
│保存先ファイル名 = Application.GetSaveAsFilename( _                         │
│    InitialFileName:="既定ファイル.txt", _                                  │
│    FileFilter:="テキストファイル,*.txt,すべてのファイル,*.*" _             │
│)                                                                           │
│If 保存先ファイル名 = "False" Then                                          │
│    MsgBox "ファイルを指定し直してください", vbInformation, "処理終了"      │
│    Exit Sub                                                                │
│End If                                                                      │
│Msgbox 保存先ファイル名  ' フルパスが取得できるので保存先に利用             │
└──────────────────────────────────────┘
「.GetSaveAsFilename()」メソッドを使う。
既定ファイル名は「InitialFileName」パラメータで指定する。
既定フォルダは、直前に「ChDir」でディレクトリ移動することにより指定となる。
分類:ExcelVBA
ExcelVBA/翻訳
2015年08月11日
Google翻訳を利用した英和・和英の一括翻訳マクロ。
セル選択(複数可)して実行すると、右隣に翻訳結果が出力される。
┌──────────────────────────────────────┐
│Public Sub Google翻訳英和()                                                 │
│    Dim i As Long                                                           │
│    Dim theCell As Range                                                    │
│    Dim objIE As Object                                                     │
│    For Each theCell In Selection                                           │
│        If theCell.Value <> "" Then                                         │
│            Application.Wait Now + TimeValue("00:00:01")  ' スリープ約1秒   │
│            Set objIE = CreateObject("InternetExplorer.Application")        │
│            With objIE                                                      │
│                .Navigate "https://translate.google.co.jp/#en/ja/" _        │
│                        & theCell.Value                                     │
│                Do While .Busy Or .ReadyState <> 4                          │
│                    DoEvents                                                │
│                Loop                                                        │
│                With .Document.getElementById("result_box")                 │
│                    For i = 1 To 10000  ' リトライ                          │
│                        If .innerText <> "" Then                            │
│                            Exit For                                        │
│                        End If                                              │
│                        DoEvents                                            │
│                    Next i                                                  │
│                    theCell.Offset(, 1).Value = .innerText                  │
│                End With                                                    │
│                .Quit                                                       │
│            End With                                                        │
│        End If                                                              │
│    Next theCell                                                            │
│    MsgBox "完了"                                                           │
│End Sub                                                                     │
├──────────────────────────────────────┤
│Public Sub Google翻訳和英()                                                 │
│    Dim i As Long                                                           │
│    Dim theCell As Range                                                    │
│    Dim objIE As Object                                                     │
│    For Each theCell In Selection                                           │
│        If theCell.Value <> "" Then                                         │
│            Application.Wait Now + TimeValue("00:00:01")  ' スリープ約1秒   │
│            Set objIE = CreateObject("InternetExplorer.Application")        │
│            With objIE                                                      │
│                .Navigate "https://translate.google.co.jp/#ja/en/" _        │
│                        & theCell.Value                                     │
│                Do While .Busy Or .ReadyState <> 4                          │
│                    DoEvents                                                │
│                Loop                                                        │
│                With .Document.getElementById("result_box")                 │
│                    For i = 1 To 10000  ' リトライ                          │
│                        If .innerText <> "" Then                            │
│                            Exit For                                        │
│                        End If                                              │
│                        DoEvents                                            │
│                    Next i                                                  │
│                    theCell.Offset(, 1).Value = .innerText                  │
│                End With                                                    │
│                .Quit                                                       │
│            End With                                                        │
│        End If                                                              │
│    Next theCell                                                            │
│    MsgBox "完了"                                                           │
│End Sub                                                                     │
└──────────────────────────────────────┘
「.Busy Or .ReadyState <> 4」の条件でIEの読込完了を待つのだが、
ID指定で要素を読み込むためにはさらに若干タイムラグがある模様。

それが未だだと空欄取得となってしまうので、リトライを用意した。

なお、クローラみたいなものなので1秒間をあけて実行するようにした。
分類:ExcelVBA
ExcelVBA/UTF-8出力
2015年08月10日
ExcelVBAでは、通常「Shift-JIS」で出力されるが、これを「UTF-8」にしたい場合。

「ADODB.Stream」を使用する。
まず、参照設定にて
「Microsoft ActiveX Data Object6.1 Library」にチェックを入れること。


そしてサンプルソースとしては以下のような感じに処理を行えばよい。
┌──────────────────────────────────────┐
│Public Sub UTF8出力()                                                       │
│    Dim 出力先 As New ADODB.Stream                                          │
│    With 出力先                                                             │
│        .Type = adTypeText                                                  │
│        .Charset = "UTF-8"                                                  │
│        .LineSeparator = adCRLF                                             │
│        .Open                                                               │
│    End With                                                                │
│    出力先.WriteText Cells(1, 1).Value                                      │
│    出力先.SaveToFile ActiveWorkbook.Path & "\output.txt", _                │
│                      adSaveCreateOverWrite                                 │
│    出力先.Close                                                            │
│    MsgBox "完了"                                                           │
│End Sub                                                                     │
└──────────────────────────────────────┘
分類:ExcelVBA
ExcelVBA/ダブルクォーテーション
2015年08月09日
ダブルクォーテーションをダブルクォーテーションとして使用したい場合。

┌──────────────────────────────────────┐
│""                                                                          │
└──────────────────────────────────────┘
二つ並べる。

しかし、長文になると混乱しがちなので、
┌──────────────────────────────────────┐
│Chr(34)                                                                     │
└──────────────────────────────────────┘
と、文字コード指定としてしまった方がわかりやすいだろう。
分類:ExcelVBA
前へ 1 2 3 次へ