確かにそこにあるのにNo such file or directory

php5.5×windows10

windowsでファイルを作成してローカルに保存してchmodするとき、1つのファイルだけ毎回

PHP Warning:  chmod(): No such file or directory

になって困ってました。

結論から言うと、日本語ファイル名(sjis-win)で、ダメ文字「ソ」が入っているファイルだけ失敗していて、うまい回避方が見つけられなかったのでファイル名を英数字で保存することにしました。

えっこれやばくない??不便過ぎない??
って思ったけどphp7.1で解決してるみたいです。

Windows版 PHP 7.1 で日本語パス(パス文字列のエンコーディング)が対応されることによる影響 - Qiita


以下結論にたどり着くまでのログ

パスが間違ってるのかな?

<?php
var_dump(file_exists("c:/test/マルソフト.txt")); // boolean false

えっパス完全に合ってるのにfalse???
とりあえず、一つ上のディレクトリにfile_exists()してみる

<?php
var_dump(file_exists("c:/test/")); //boolean true

一つ上までは存在する…。
日本語ファイル名がダメなのかな?
ファイル名を英数字だけにリネームして再度実行してみる。

<?php
var_dump(file_exists("c:/test/test.txt")); // boolean true

やっぱり日本語ファイル名か。
なにか見えない文字でも入ってる?入ってるとしたらどこだろう? glob()で1文字ずつ確認してみる。

<?php
var_dump(glob("c:/test/マ*")); // array (size=1)
var_dump(glob("c:/test/マル*")); // array (size=1)
var_dump(glob("c:/test/マルソ*")); // array (size=0) empty
var_dump(glob("c:/test/マル*フ*")); // array (size=1)
var_dump(glob("c:/test/マル*フト*"));  // array (size=1)
var_dump(glob("c:/test/マル*フト.txt"));  // array (size=1)

「ソ」が犯人です!!!

Shift_JISのダメ文字 - fudist

ggった結果「ソ」はダメ文字と呼ばれる文字の1つで、そういわれる理由があるそうです………

Maven3で最低限動くプラグインを作ってみる

Maven3で最低限動くプラグインを作って実行してみます。
下記の手順でやっていきます。

  1. mvn archetype:generate -Bでプロジェクトを作る
  2. mvn installする
  3. 実装する
  4. mvn <groupId>:<artifactId>:(<version>:)goalで実行してみる

mvn archetype:generate -B ~でプロジェクトを作る

まずプラグイン用のMavenプロジェクトを作ります。
Maven 3.5のビルドライフサイクルを学ぶ - Qiitaの記事を参考にgenerateしてみる。

> mvn archetype:generate -B -DarchetypeGroupId=org.apache.maven.archetypes -DarchetypeArtifactId=maven-archetype-plugin -DgroupId=org.sample -DartifactId=hello-maven-plugin -Dversion=1.0-SNAPSHOT

[INFO] Scanning for projects...
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 0.179 s
[INFO] Finished at: 2019-05-14T10:24:37+09:00
[INFO] ------------------------------------------------------------------------
[ERROR] The goal you specified requires a project to execute but there is no POM in this directory (C:\Users\A\mvn-plugin\hello). Please verify you invoked Maven from the correct directory. -> [Help 1]
[ERROR]
... 省略 ...

Generateしたいのにpomがないって…?
Error "The goal you specified requires a project to execute but there is no POM in this directory" after executing maven command - Stack Overflow
パラメータをダブルクォートで囲んでもう一回実行してみる。

> mvn archetype:generate -B "-DarchetypeGroupId=org.apache.maven.archetypes" "-DarchetypeArtifactId=maven-archetype-plugin" "-DgroupId=org.sample" "-DartifactId=hello-maven-plugin" "-Dversion=1.0-SNAPSHOT"
[INFO] Scanning for projects...
[INFO]
[INFO] ------------------< org.apache.maven:standalone-pom >-------------------
[INFO] Building Maven Stub Project (No POM) 1
[INFO] --------------------------------[ pom ]---------------------------------
[INFO]
[INFO] >>> maven-archetype-plugin:3.0.1:generate (default-cli) > generate-sources @ standalone-pom >>>
[INFO]
[INFO] <<< maven-archetype-plugin:3.0.1:generate (default-cli) < generate-sources @ standalone-pom <<<
[INFO]
[INFO]
[INFO] --- maven-archetype-plugin:3.0.1:generate (default-cli) @ standalone-pom ---
[INFO] Generating project in Batch mode
[INFO] Archetype [org.apache.maven.archetypes:maven-archetype-plugin:1.4] found in catalog remote
[INFO] ----------------------------------------------------------------------------
[INFO] Using following parameters for creating project from Archetype: maven-archetype-plugin:1.4
[INFO] ----------------------------------------------------------------------------
[INFO] Parameter: groupId, Value: org.sample
[INFO] Parameter: artifactId, Value: hello-maven-plugin
[INFO] Parameter: version, Value: 1.0-SNAPSHOT
[INFO] Parameter: package, Value: org.sample
[INFO] Parameter: packageInPathFormat, Value: org/sample
[INFO] Parameter: package, Value: org.sample
[INFO] Parameter: version, Value: 1.0-SNAPSHOT
[INFO] Parameter: groupId, Value: org.sample
[INFO] Parameter: artifactId, Value: hello-maven-plugin
[INFO] Project created from Archetype in dir: C:\Users\****\hello-maven-plugin
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 6.104 s
[INFO] Finished at: 2019-05-14T10:40:27+09:00
[INFO] ------------------------------------------------------------------------
[0m[0m

出来た!
確認してみます。

>tree
C:.
└─hello-maven-plugin
    └─src
        ├─it
        │  └─simple-it
        ├─main
        │  └─java
        │      └─org
        │          └─sample
        └─test
            ├─java
            │  └─org
            │      └─sample
            └─resources
                └─project-to-test

出来てるっぽいです。

mvn installする

> cd hello-maven-plugin
>mvn install
... 省略 ...
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 01:32 min
[INFO] Finished at: 2019-05-14T10:57:52+09:00
[INFO] ------------------------------------------------------------------------

上手くいきました。

実装する

Maven – Guide to Developing Java Pluginsのサンプルを作ってみます。
src\main\java\org\smaple\GreetingMojo.javaを作り、A Simple Mojoをコピペします。
(MyMojo.javaはとりあえず置いときます。)

mvn <groupId>:<artifactId>:(<version>:)goalで実行してみる

作成したプラグインを実行してみます。
mvn <groupId>:<artifactId>:(<version>:)goal形式です。
goal名はGreetingMojo.java@Mojo(name=****)の*****部分です。

> mvn org.sample:hello-maven-plugin:sayhi
[INFO] Scanning for projects...
[INFO]
[INFO] -------------------< org.sample:hello-maven-plugin >--------------------
[INFO] Building hello-maven-plugin Maven Plugin 1.0-SNAPSHOT
[INFO] ----------------------------[ maven-plugin ]----------------------------
[INFO]
[INFO] --- hello-maven-plugin:1.0-SNAPSHOT:sayhi (default-cli) @ hello-maven-plugin ---
[INFO] Hello,world.
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 0.642 s
[INFO] Finished at: 2019-05-14T11:58:25+09:00
[INFO] ------------------------------------------------------------------------

Hello,wold出来ました。

短い形式で実行する設定

Shortening the Command Lineをしたかったんですが${user.home}/.m2/settings.xmlがなかったので作ります。
Maven – Settings ReferenceのQuick Overviewのxmlをコピペして${user.home}/.m2/settings.xmlに保存。
<pluginGroups/>を消して↓に書き換えます。中身はpom.xmlのgroupIdの記述です。

<pluginGroups>
    <pluginGroup>org.sample</pluginGroup>
</pluginGroups>

短い形式で実行してみます。

> mvn hello:sayhi
[INFO] Scanning for projects...
[INFO]
[INFO] -------------------< org.sample:hello-maven-plugin >--------------------
[INFO] Building hello-maven-plugin Maven Plugin 1.0-SNAPSHOT
[INFO] ----------------------------[ maven-plugin ]----------------------------
[INFO]
[INFO] --- hello-maven-plugin:1.0-SNAPSHOT:sayhi (default-cli) @ hello-maven-plugin ---
[INFO] Hello,world.
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 1.286 s
[INFO] Finished at: 2019-05-14T12:27:56+09:00
[INFO] ------------------------------------------------------------------------

[INFO] Hello,world.出来てますね!

参考

phpのopensslが有効にならない

php.iniにextension=php_openssl.dllを追加してもphpinfoでOpenSSL supportがdisabeldのまま。
他の拡張はこれだけで動くんだけどなーって4時間ぐらいはまりました。

解決法

OpenSSL support disabled in Apache/PHP on Windows - Stack Overflow

httpd.confに↓を追加します。

LoadFile "{phpのインストールパス}\libeay32.dll"
LoadFile "{phpのインストールパス}\ssleay32.dll"
LoadFile "{phpのインストールパス}\php5ts.dll"
LoadFile "{phpのインストールパス}\libpq.dll"

私の場合scoop経由でインストールしてたのでこうですね。

LoadFile "C:\Users\{ユーザー}\scoop\apps\php55\current\libeay32.dll"
LoadFile "C:\Users\{ユーザー}\scoop\apps\php55\current\ssleay32.dll"
LoadFile "C:\Users\{ユーザー}\scoop\apps\php55\current\php5ts.dll"
LoadFile "C:\Users\{ユーザー}\scoop\apps\php55\current\libpq.dll"

apacheを再起動してphpinfoを確認
f:id:qroku:20190418150121p:plain

OpenSSL supportがenabledに!!!

英語読めないマンなのでStackOverflowの記事読んでもC:/jampp/php/がどこのことかわからなくて(ググったらWin32 OpenSSLとか出てきて…)試せなかったんです。
1日置いて「もしかして…?」でファイル検索してみたらphpインストールフォルダにありました。
徒労感あるけどとりあえずうれしい!!!


以下試行錯誤した内容

環境
Windows10
scoop経由でphp7とphp5.5とapacheインストール
コマンドはPowerShellで実行

C:\Users\{ユーザー}\scoop\persist\php\cli\conf.d編集しても効いてないようだったのでC:\Users\{ユーザー}\scoop\apps\php55\current\php.iniを編集
※たぶんapacheの設定つまずいてhttpd.confのPHPIniDirに↑指定したから

;extension=php_openssl.dll
extension=php_openssl.dll

httpdしてphpinfoを確認してみる

PS > httpd

作っておいたphpinfoにアクセス f:id:qroku:20190418125037p:plain

pearのOpenSSLがdisabledのまま…

php -mしてみる

PS > php -m
[PHP Modules]
bcmath
calendar
Core
ctype
date
dom
ereg
filter
ftp
hash
iconv
json
libxml
mbstring
mcrypt
mhash
mysql
mysqlnd
odbc
openssl
pcre
PDO
pdo_mysql
Phar
Reflection
session
SimpleXML
SPL
standard
tokenizer
wddx
xdebug
xml
xmlreader
xmlwriter
zip
zlib

[Zend Modules]
Xdebug

opensslおるな…

php --ri opensslしてみる

PS > php --ri openssl

openssl

OpenSSL support => enabled
OpenSSL Library Version => OpenSSL 1.0.1t  3 May 2016
OpenSSL Header Version => OpenSSL 1.0.1t  3 May 2016

enabled? cliでは有効でwebだと無効?apacheの設定…? →最初に戻る

WinAppDriverで日本語が文字化けする

タイトル詐欺だけど原因を知らなかった私はきっとこうググると思う…

現象

(Windows10)

DesktopSession.findElementByName("メッセージ").sendKeys(Keys.Return);みたいなコードを実行したとき、WinAppDriverのコンソールの{"using":"name","value":"メッセージ"}の"メッセージ"部分が文字化けしてた。

②今にして思えばmvn testしたとき [WARNING]がめっちゃ出てた。一瞬で流れちゃうから見てなかった…

[WARNING] File encoding has not been set, using platform encoding MS932, i.e. build is platform dependent!
[INFO] Compiling 21 source files to C:\pleiades\workspace\testtest\target\test-classes
[WARNING] test.java:[7,34] この文字は、エンコーディングMS932にマップできません

直った方法

web-dev.hatenablog.com ↑記事を参考にpom.xmlの間に下記の記述を追加

        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>

つまり、ちゃんと文字コードしていしてコンパイルしようね、ってことでした。

学び

WARNINGを読まずに無視してはいけない

WinAppDriverを使ってみる2

JavaSeleniumも英語もわからないけどとにかくwindows application driver使いたいシリーズ

前回、cmd.exeのセッション作れないー!ってなってたんですが、何かのissueからたどり着いた↓の記事のようにしたら出来ました。
WinAppDriver/README.md at v1.0-RC2 · Microsoft/WinAppDriver · GitHub

  1. デスクトップのセッションを作る
  2. デスクトップのセッションから起動したいアプリを起動する
  3. 起動したアプリのNativeWindowHandleを取得して16進数にする(←?)
  4. setCapability("appTopLevelWindow", /* 3の値 */);してセッションを作る
   @BeforeClass
    public static void setup() throws Exception {
        // デスクトップセッションを作る
        DesiredCapabilities appCapabilities = new DesiredCapabilities();
        appCapabilities.setCapability("app","Root");
        DesktopSession = new WindowsDriver<WebElement>(new URL("http://127.0.0.1:4723"), appCapabilities);
        DesktopSession.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);

        // コマンドプロンプトを起動する
        DesktopSession.findElementByAccessibilityId("{********}\\cmd.exe").click();

        // 起動しているコマンドプロンプトのハンドルを取得して...
        WebElement cmdWindow = DesktopSession.findElementByClassName("ConsoleWindowClass");
        String cmdTopLevelWindowHandle = cmdWindow.getAttribute("NativeWindowHandle");
        cmdTopLevelWindowHandle = "0x" + Integer.toHexString(Integer.parseInt(cmdTopLevelWindowHandle));

        // 起動しているコマンドプロンプトのセッションを作る
        DesiredCapabilities cmdAppCapabilities = new DesiredCapabilities();
        cmdAppCapabilities.setCapability("appTopLevelWindow", cmdTopLevelWindowHandle);
        CmdSession = new WindowsDriver<WindowsElement>(new URL("http://127.0.0.1:4723"), cmdAppCapabilities);
        CmdSession.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);

    }

タスクバーにコマンドプロンプトをピン留めしてそこをクリックして起動してます。

サンプルがJavaじゃない(?)みたいでそのままだと動かなかったのでいろいろ書き換えた結果コレで出来ました。
0x1234みたいなやつ全然意味わからないけどうまくいくからそのままにしてる…。
@AfterClassでセッションを閉じる前にコマンドプロンプトexit+Returnを送って画面閉じてます。

Ctrl+EscでWinキーの代用したかったけど出来なかった

結論

Winキー+Rで「ファイル名を指定して実行」を開きたかった。
Ctrl+Escでスタートメニュー開くから出来ると思った。
Ctrl+Esc+Rはスタートメニュー開くだけで「ファイル名を指定して実行」は開かない。 つまり Winキー != Ctrl+Esc です。

なんで調べたか

Windows Application Driverでcmd.exeを実行したかったんだけど、コマンドプロンプトは開くのにドライバ側でFailed to locate opened application window with appId ...ってエラーが出てダメ。
issue見てたらデスクトップのセッションを作ってトップレベルウィンドウを指定すれば?って書いてたので試そうとした。
Winキー+R→「ファイル名を指定して実行」→cmd→コマンドプロンプト の順でやってみようとしたけど、org.openqa.selenium.Keysにwinキーがなさそうだった。
...
結論に戻る。

WinAppDriverを使ってみる0

JavaSeleniumも英語もわからないけどとにかくwindows application driver使いたいシリーズ

とりあえず、書き始める前に実行できる環境を整備する

1. eclipsemavenプロジェクトを作る

新規 > Maven プロジェクト
f:id:qroku:20190201125903p:plain

シンプルなプロジェクトの作成にチェックを入れて次へ
f:id:qroku:20190201130112p:plain

グループId・アーティファクトId・名前・説明を入力して完了
グループIdどうすればいいのかわからないのでそれっぽい適当なの
アーティファクトIdと名前と説明はよくわからないので同じの入れてみた
f:id:qroku:20190201130738p:plain

できた
f:id:qroku:20190201130843p:plain

2. サンプルをコピペして動くか試す

pom.xmlにサンプルの<dependencies>をコピペする
f:id:qroku:20190201131227p:plain

src/test/javaにサンプルのCalculatorTest.javaをコピペする
f:id:qroku:20190201131422p:plain

コンソールでWinAppDriver.exeを実行
もう一つのコンソールでプロジェクトのルートに移動してmvn test

f:id:qroku:20190131181230p:plain

やったぜ