batファイルで多重起動(二重起動)を防止する

バッチファイルで多重起動(二重起動)を抑止するコードを探してみた。

bat 多重|二重 実行|起動 抑止|禁止|防ぐ|防止|できないように|させない - Google 検索

方法として、大まかに2つあった。

方法1:バッチファイル自身を追記モードで開く。

方法2:tsklistコマンドを使って実行している数をチェックする。

たが、方法2はチェックする前に複数起動されるとどれもチェックに引っかかり、行いたい処理が実行できない。よって方法1をベースにブラッシュアップしてみた。

@echo off
set ERRORLEVEL=1
call :main %* 0>>"%~dpnx0" && set ERRORLEVEL=0
if %ERRORLEVEL% neq 0 echo multiple start-up error 1>&2
goto :eof
:main
echo main start
timeout 15
echo main end


ちなみに方法1には、実行中はバッチファイル自体を変更できないという特徴があり、これもメリットでもあるが注意が必要である。不用意にエディタで開いているとすでに実行中であると判断されてしまいます。
これを回避するには、バッチファイル自体を読み取り専用にして、ロック用ファイルは別に開きます。

@echo off
attrib +r %~dpnx0
set ERRORLEVEL=1
call :main %* 0>"%~dpnx0.lock" && set ERRORLEVEL=0
if %ERRORLEVEL% neq 0 (echo multiple start-up error 1>&2) else (del %~dpnx0.lock)
goto :eof
:main
echo main start
timeout 15
echo main end



参考にしたページ

Microsoft製品) コマンドプロンプト:バッチの多重起動を抑制する - YiaoWang

バッチファイルlを2重起動できないようにしたい - その他(プログラミング) 締切済み 【OKWAVE】

バッチファイルの二重起動を防止する。(その2) Windows Script Programming

バッチの二重起動防止 - ひらいて

以上です。

前日のGMT日付が含まれたURLのページを表示するBookmarklet

Javascriptタイムゾーンを変更することができないのでちょっと厄介でした。

javascript:(function(d=new Date()){d=d.getTime()+(d.getTimezoneOffset()*60000);d=new Date(d+3600000*0);d.setDate(d.getDate()-1);document.location=`https://example.com/date=${d.getFullYear()}-${d.getMonth()+1}-${d.getDate()}`})();


参考にしたページ
【Javascript】翌日、前日の日付を取得する。- うぇぶろぐらまーな日誌
JavaScriptで違うタイムゾーンの時刻を得る - 刺身☆ブーメランのはてなダイアリー
JavaScript(jQuery)における文字列中に変数を記述する方法ってあるでしょうか? - スタック・オーバーフロー

ブックマークレットにdata:text/htmlを使ってiframeを含む内容を記述するとブロックされる時がある。

Firefoxブックマークレットにdata:text/htmlを使ってiframeを含む内容を記述すると、iframeが表示されない時がある。
正確にはhttpsのページを開いている状態で、そういったブックマークレットを実行すると起きる。ちなみにChromeでは起きない。
これが起きるとブラウザのコンソールに「混在アクティブコンテンツ “http://…” の読み込みをブロックしました」と警告が出る。
これを回避するには、URL欄の左のiマークをクリックして「このセッションのみ保護を無効にする」をクリックすれば良いが、いちいち面倒である。
そこでこれを回避する方法を探ってみた。最初にjavascriptのlocationで転送してみた。

data:text/html,<script>location='data:text/html,<html><body><iframe...

しかし同じくブロックされた。次にhtmlのmeta refreshを使ってみた。

data:text/html,<html><head><meta http-equiv='refresh content='0;URL=data:text/html,<html><body><iframe...

なぜかよくわからないがブロックされず、無事解決した。

RubyInstallerでMSYS2 and MINGW development toolchainをインストルール中にエラーが起きる

rubyinstaller 2.4.1-1-x64 をインストールするときに"Run 'ridk install' to install MSYS2 and development toolchan."をチェックし、コンソールで"3 - MSYS2 and MINGW development toolchain"を選んだときに、"error: target not found: mingw-w64-x86_64-winstorecompat-git" というエラーが出てインストールできない。
OSはWindows 10 Home 64bitです。

1 - MSYS2 base installation
2 - MSYS2 repository update
3 - MSYS2 and MINGW development toolchain
Which components shall be installed? 3

MSYS2 seems to be already installed
Install MSYS2 and MINGW development toolchain ...
> pacman -S --needed --noconfirm autoconf autoconf2.13 autogen automake-wrapper automake1.10 automake1.11 automake1.12 automake1.13 automake1.14 automake1.15 automake1.6 automake1.7 automake1.8 automake1.9 diffutils file gawk grep libtool m4 make patch pkg-config sed texinfo texinfo-tex wget mingw-w64-x86_64-binutils mingw-w64-x86_64-crt-git mingw-w64-x86_64-gcc mingw-w64-x86_64-gcc-libs mingw-w64-x86_64-headers-git mingw-w64-x86_64-libmangle-git mingw-w64-x86_64-libwinpthread-git mingw-w64-x86_64-make mingw-w64-x86_64-pkg-config mingw-w64-x86_64-tools-git mingw-w64-x86_64-winpthreads-git mingw-w64-x86_64-winstorecompat-git
warning: autoconf-2.69-3 is up to date -- skipping
中略
warning: mingw-w64-x86_64-winpthreads-git-5.0.0.4634.697f757-1 is up to date -- skipping
error: target not found: mingw-w64-x86_64-winstorecompat-git
Install MSYS2 and MINGW development toolchain failed
Installation failed: pacman failed

原因は、すでにシステムにMSYS2がインストールされているが、バージョンが古いためのようである。

回復の仕方

方法は2つ。

  1. インストールされているMSYS2のシェルを起動してパッケージのアップデート行う。
  2. 既存のMSYS2を消しても良いならアンインストール後、最新のMSYS2をインストールしてアップデートを行う。

なお、実行しているRubyInstaller(コンソールの方)はそのままでもよい。

MSYS2のアップデート方法

キャッシュを全て削除してパッケージを更新する。

$ pacman -Scc #全てy
$ pacman -Syy
$ pacman -Suu

ファイルのダウンロード中に何度も切断され失敗するような場合は、wget をインストールして、/etc/pacman.conf の[options]に下記の1行を追加して再試行する。

XferCommand = /usr/bin/wget --timeout=30 --tries=100 --passive-ftp -c -O %o %u

MSYS2 and MINGW development toolchainのインストール

MSYS2のパッケージを更新後、MSYS2 and MINGW development toolchainのインストールを再度試みる。

1 - MSYS2 base installation
2 - MSYS2 repository update
3 - MSYS2 and MINGW development toolchain
Which components shall be installed? 3

MSYS2 seems to be already installed
Install MSYS2 and MINGW development toolchain ...
> pacman -S --needed --noconfirm autoconf autoconf2.13 autogen automake-wrapper automake1.10 automake1.11 automake1.12 automake1.13 automake1.14 automake1.15 automake1.6 automake1.7 automake1.8 automake1.9 diffutils file gawk grep libtool m4 make patch pkg-config sed texinfo texinfo-tex wget mingw-w64-x86_64-binutils mingw-w64-x86_64-crt-git mingw-w64-x86_64-gcc mingw-w64-x86_64-gcc-libs mingw-w64-x86_64-headers-git mingw-w64-x86_64-libmangle-git mingw-w64-x86_64-libwinpthread-git mingw-w64-x86_64-make mingw-w64-x86_64-pkg-config mingw-w64-x86_64-tools-git mingw-w64-x86_64-winpthreads-git mingw-w64-x86_64-winstorecompat-git
warning: autoconf-2.69-3 is up to date -- skipping
中略
warning: libtool-2.4.6-2 is up to date -- skipping
resolving dependencies...
looking for conflicting packages...

Packages (32) glib2-2.48.2-1 libgc-7.6.0-1 libgcrypt-1.6.4-1
libguile-2.0.14-1 libunistring-0.9.7-1 libxslt-1.1.29-1
autoconf2.13-2.13-2 autogen-5.18.12-1 diffutils-3.5-1
file-5.30-1 gawk-4.1.4-2 grep-3.0-1 m4-1.4.18-1 make-4.2.1-1
mingw-w64-x86_64-binutils-2.28-1
mingw-w64-x86_64-crt-git-5.0.0.4834.33ee6cab-1
mingw-w64-x86_64-gcc-6.3.0-3 mingw-w64-x86_64-gcc-libs-6.3.0-3
mingw-w64-x86_64-headers-git-5.0.0.4836.670da35c-1
mingw-w64-x86_64-libmangle-git-5.0.0.4760.d3089b5-1
mingw-w64-x86_64-libwinpthread-git-5.0.0.4833.f057c525-1
mingw-w64-x86_64-make-4.2.1-1
mingw-w64-x86_64-pkg-config-0.29.2-1
mingw-w64-x86_64-tools-git-5.0.0.4760.d3089b5-1
mingw-w64-x86_64-winpthreads-git-5.0.0.4833.f057c525-1
mingw-w64-x86_64-winstorecompat-git-5.0.0.4760.d3089b5-1
patch-2.7.5-1 pkg-config-0.29.2-1 sed-4.4-2 texinfo-6.3-1
texinfo-tex-6.3-1 wget-1.19.1-1

Total Download Size: 59.66 MiB
Total Installed Size: 402.53 MiB
Net Upgrade Size: 58.96 MiB

:: Proceed with installation? [Y/n] Y
:: Retrieving packages...

MSYS2にすでにインストールされているパッケージによるだろうが、400MB以上ディスクを使用します。

追記

こんな面倒なことしなくても1,2,3とすればいいだけのようでした。

Windows環境でRailsを動かしてみた - 或るプログラマの開発日記

インストール時に"Use UTF-8 as default external encoding."にチェックを入れておいたほうが良いこともわかりました。もし付け忘れたときは、環境変数に"RUBYOPT=-Eutf-8"を追加しましょう。

あと、toochainのインストーラは、"/Ruby24-x64/lib/ruby/site_ruby/2.4.0/ruby_installer/runtime/ridk.rb" にありました。