銀の弾丸、はじめました

Unityとかガジェットとか

IntelliJ IDEA系IDEで正規表現置換文字列に$を使う場合

\\$$ に置換できる
\$ ではダメ)

$_POST["hogehoge1"];
$_POST["hogehoge2"];
$_POST["hogehoge11"];

$_POST["hugahuga1"];
$_POST["hugahuga2"];
$_POST["hugahuga11"];

に置換したい

  • 検索 \$_POST\["hogehoge(\d\d?)"\];

  • 置換 \\$_POST["hugahuga$1"];

平成ももう終わろうと言うのにasp→phpコンバート案件

asp(vbs) to php converterなどでググるasp2php と言うのが直ぐ見つかる
2008年が最終更新日で10年前のモノだ…

https://www.mikekohn.net/software/asp2php.php

他のコンバーターもググったけど変なモノやユーザー登録必須やらで面倒そうなのでやめた

asp2phpの使い方が分からなくてググったが結局わからない

色々試してたら動いた

Javaを最新のにして asp2php.exeaspファイルをD&Dすれば

aspファイルと同じディレクトリにphpファイルが生成される

Tweetbot3 macOSのURLスキームについて

tweetbot: のURLスキームを指定するとTweetbot2が起動してしまうケースに対応する
Tweetbot3はまだリリースされて間もないせいか軽微なバグや機能縮小が目立つ
なのでTweetbot2をまだ手放せない人も多いと思う
2と3を共存させつつURLスキームを分けたいケースにも対応できる

tweetbot:com.tapbots.Tweetbot3 に変えれば起動すると言う情報があるがデマ
あるいは既に過去のバージョンで現在の最新版では使えない可能性が極めて高い
確実に起動させる方法はまずURLスキームを調べる方が早いし確実
以下のコマンドをターミナルに入力する(最初の $ は不要)

$ /System/Library/Frameworks/CoreServices.framework/Frameworks/LaunchServices.framework/Support/lsregister -dump | egrep "bindings.+:" | sort|grep tweetbot

バージョンや環境によって多少内容が変わると思うが,以下のように2行表示される

bindings:      tweetbot:, tweetbot.mac:, com.tapbots.tweetbot3mac:, com.tapbots.tweetbot3mac.30200:
bindings:      tweetbot:, tweetbot.mac:, com.tapbots.tweetbotmac:, com.tapbots.tweetbotmac.25500:

tweetbot3 の文字を含む行がTweetbot3のURLスキームだ
実は1つのアプリでもURLスキームが複数あることもある

これを見ると tweetbot: が競合しているのがわかる
恐らく古い方(Tweetbot2)が優先される仕組みになっているので競合しないモノを使う
tweetbot:com.tapbots.tweetbot3mac: に書き換えれば解決

これでショートカットやランチャー,ブックマークレットからTweetbot3が起動できる

Tweetbot3のURLスキームで使えるオプションは以下の通り

  • tweetbot://<screenname>/timeline
  • tweetbot://<screenname>/mentions
  • tweetbot://<screenname>/retweets
  • tweetbot://<screenname>/direct_messages
  • tweetbot://<screenname>/lists
  • tweetbot://<screenname>/favorites
  • tweetbot://<screenname>/search
  • tweetbot://<screenname>/search?query=<text>
  • tweetbot://<screenname>/status/<tweet_id>
  • tweetbot://<screenname>/user_profile/<profile_screenname>
  • tweetbot://<screenname>/post
  • tweetbot://<screenname>/post?text=<text>
  • tweetbot://<screenname>/post?text=<text>&callback_url=<url>&in_reply_to_status_id=<tweet_id>
  • tweetbot://<screenname>/search?query=<text>&callback_url=<url>
  • tweetbot://<screenname>/status/<tweet_id>?callback_url=<url>
  • tweetbot://<screenname>/user_profile/<screenname|user_id>?callback_url=<url>
  • tweetbot://<screenname>/follow/<screenname|user_id>
  • tweetbot://<screenname>/unfollow/<screenname|user_id>
  • tweetbot://<screenname>/favorite/<tweet_id>
  • tweetbot://<screenname>/unfavorite/<tweet_id>
  • tweetbot://<screenname>/retweet/<tweet_id>
  • tweetbot://<screenname>/list/<list_id>?callback_url=<url>

Custom URL Shortener

macOSのターミナルでUSBフラッシュメモリを扱う

名前の確認

$ diskutil list

/dev/disk0 (internal, physical):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:      GUID_partition_scheme                        *1.0 TB     disk0
   1:                        EFI EFI                     209.7 MB   disk0s1
   2:                  Apple_HFS Macintosh HD            999.3 GB   disk0s2
   3:                 Apple_Boot Recovery HD             650.0 MB   disk0s3

/dev/disk1 (external, physical):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:                            USBFlash                *63.3 GB   disk1

ここでは,USBフラッシュメモリの IDENTIFIER が disk1 となっているのでこれがターゲット名になる

マウント場所を調べる

$ diskutil info disk1 | grep Mount

ファイルコピー

$ cp hogehoge.zip /Volumes/USBFlash

アンマウント(USBフラッシュメモリを安全に抜く為のアレ)

$ diskutil umount /dev/disk1
Vulume USBFlash on disk1 unmounted

JavaScript(jQuery)でロングタップさせる

ロングタップのイベントハンドラはググれば直ぐ見つかるが,
ロングタップをさせる方法がなかったので適当に書いた.

jQuery
jQuery使わない場合は適宜…)

gist73259b8979db7b4f12c28639af011f0d

setTimeout800ミリ秒750 とかでも良いかもしれない.

標準の機能として欲しい

unknown error: call function result missing 'value'の対処方法

chromedriverのバージョンが古いのでバージョンアップすると多分直る.

ここから最新版のディレクトリへ移動して,対応OSのzipファイルをダウンロード

https://chromedriver.storage.googleapis.com/index.html

あるいは,ここ

sites.google.com

解凍したらmacOSの場合, chromedriver 2chromedriver2に改名して
(スペースがファイル名に入ってると不便なので)
/usr/local/bin/ に設置する

~/.bash_profileexport PATH=$PATH:/usr/local/bin を追記

Terminalで source ~/.bash_profile を実行(Terminal再起動でも可)

Terminalで
chromedriver --version
と入力した結果と
chromedriver2 --version
と入力した結果が違う事を確認

また,後者コマンドでエラーやワーニングが出ていない事を確認する.
出る場合,違うバージョンを試してみる(最新過ぎるとワーニングが結構出るかも)

てか,macOSならHomebrewでchromedriver入れた方が管理が楽かも…

以下はPythonでchromedriver使う例

# coding: UTF-8
import os
from selenium import webdriver
from selenium.webdriver.chrome.options import Options

chrome_options = Options()

#chrome_options.add_argument("--headless")
chrome_options.binary_location = '/Applications/Google Chrome Canary.app/Contents/MacOS/Google Chrome Canary'
#wd = webdriver.Chrome(executable_path=os.path.abspath("chromedriver"), chrome_options=chrome_options)
# chromedriverのバージョンが古い所為で上手く動かなかったので新しいバージョンを指定してる
wd = webdriver.Chrome(executable_path="chromedriver2", chrome_options=chrome_options)

wd.set_window_size(1020,680)

wd.get('http://www.google.co.jp')

Selenium webdriverをChrome headless modeでPythonから使う

PhantomJSがSeleniumのサポートをやめてしまったため,
これからはヘッドレスブラウザはFireFoxChromeになるみたいです.

macOSGoogle Chrome Canaryだと起動場所は
/Applications/Google Chrome Canary.app/Contents/MacOS/Google Chrome Canary になります.
Aliasに登録しても良いしコードにゴリゴリパスを書いても良いです.
起動オプションで --headless を付ければTerminalからヘッドレスブラウザが立ち上がります.

/Applications/Google\ Chrome\ Canary.app/Contents/MacOS/Google\ Chrome\ Canary --headless https://www.google.co.jp

*Terminal等から実行する場合,スペースの前に\ を忘れないように!

# coding: UTF-8
import os
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.chrome.options import Options
import time

chrome_options = Options()
chrome_options.add_argument("--headless")
chrome_options.binary_location = '/Applications/Google Chrome Canary.app/Contents/MacOS/Google Chrome Canary'
wd = webdriver.Chrome(executable_path=os.path.abspath("chromedriver"), chrome_options=chrome_options)

wd.set_window_size(1020,680)
wd.get('http://www.google.co.jp')
time.sleep(3)
wd.save_screenshot("_____screenshot.png")
wd.quit()