カテゴリー: 未分類

QNAP上のファイル名の文字化けを直す

文字コードをUTF8で運用しているQNAP NAS上に、文字コードがSJISの状態で日本語ファイル名のファイルがアップロードされたため、文字化けしたファイル名(フォルダ名)を修正する

準備

概要

文字化けを起こしたファイルのリネーム方法 – Qiitaに沿って修正します。

文字化け前のファイル名を知りたいため、iconvでのファイル名確認を追加しました。

  1. lsコマンドで対象ファイル(フォルダ)のinode番号を確認
  2. iconvコマンドで元のファイル名を確認
  3. findコマンドの-inumオプションで1で確認した番号でファイルを指定し、-execオプションを使いmvでリネーム

しかしQNAPのシェルでは、

  • iconvコマンドがない
  • findコマンドの-inumオプションない

という状況のため、解決法として、NASなどの組み込みデバイス向けソフトウェアリポジトリのEntwareを使い、findとiconvをインストールしそれを利用するようにします。

Entwareインストール

  1. EntwareのInstall on QNAP NASにアクセスし、this package for standard installationのリンクからQPKGファイルをダウンロード
  2. QNAPの管理画面を開く
  3. AppCenterを開き右上の歯車(設定)をクリック AppCenterを開いたとき
  4. 手動でインストールから参照を選択し、1でダウンロードしたQPKGファイルを指定する。インストールボタンを押下してインストール パッケージの手動インストール
  5. 正常にインストールするとマイアプリに表示される Entwareインストール後

findutilsとiconvをインストール

  1. QNAPにSSHで接続(文字コードはUTF-8)
  2. Entwareのパッケージ管理コマンドのopkgコマンドを使用してfindutilsとiconvをインストール
    [~] # opkg install findutils iconv
    

文字化け修正

  1. lsコマンドで対象ファイル(フォルダ)のinode番号を確認
        [/share/homes/sample] # ls -li
        50528266 lrwxrwxrwx    1 admin    administ        31 Jun  4 17:41 @Recycle -> /share/homes/@Recycle/sample/
        50528923 -rw-rw-rw-    1 sample   everyone       161 Jun  4 17:41 ??{??t?@?C????.txt
        

    文字化けファイル名のファイルのinode番号が50528923であることを確認

  2. iconvコマンドで元のファイル名を確認
        [/share/homes/sample] # ls -li|iconv -f SJIS -t UTF-8
        50528266 lrwxrwxrwx    1 admin    administ        31 Jun  4 17:41 @Recycle -> /share/homes/@Recycle/sample/
        50528923 -rw-rw-rw-    1 sample   everyone       161 Jun  4 17:41 日本語ファイル名.txt
        
  3. findコマンドの-inumオプションで1で確認した番号でファイルを指定し、-execオプションを使いmvでリネーム
            [/share/homes/sample] # find . -inum 50528923 -ok mv '{}' "日本語ファイル名.txt" \;
            < mv ... ./??{??t?@?C????.txt > ? y
        
  4. リネーム結果を確認
        [/share/homes/sample] # ls -li
        50528266 lrwxrwxrwx    1 admin    administ        31 Jun  4 17:41 @Recycle -> /share/homes/@Recycle/sample/
        50528923 -rw-rw-rw-    1 sample   everyone       161 Jun  4 17:41 日本語ファイル名.txt
        

リネームする対象が多いとき

  1. awkを使ってコマンド文字列を生成
    ls -il|iconv -f Shift_JIS -t UTF-8 |awk -v q=\'  '{print "yes\|find . -inum "$1" -ok mv "q"{}"q" "q$10q" \\;"}'
    

    出力結果

    yes|find . -inum 61801127 -ok mv '{}' '日本語ファイル名1.jpg' \;
    yes|find . -inum 61801128 -ok mv '{}' '日本語ファイル名2.jpg' \;
    yes|find . -inum 61801129 -ok mv '{}' '日本語ファイル名3.jpg' \;
    :
    :
    :
    :
    
  2. (生成されたコマンドに問題なければ)生成した文字列を実行していく

参考

広告

package.jsonにあるversionを取得したい

コード中に自身のpackage.jsonにある値を取得するには、フィールド名の頭にnpm_package_をつけるて、process.envから参照できる。

バージョン番号(version)を取得したい場合:

console.log(process.env.npm_package_version);

パッケージで使う場合は、process.envは、読み込み元のpackage.jsonの値が使われるため、requireを使って直接package.jsonを読み込む。

p = require('package.json');
console.log(p.version);

Ubuntu 16.04でAndroid実機を接続

Ubuntu 16.04上でAndroidアプリ開発を行う中で、実機での動作を確認しようと思い、USBデバッグを有効にしたHuawei P8 liteをUSBで接続し、adb devicesを実行したところ、以下のようなレスポンスになった。

$ adb devices
List of devices attached
ARCxxxxxxxxxxxxx    no permissions (user in plugdev group; are your udev rules wrong?); see [http://developer.android.com/tools/device.html]

ハードウェア端末上でアプリを実行するを参照すると、udevにルールファイルを追加して、開発で使用する各種端末のUSB設定を追加する必要があるとのこと。

追加するルールは、udev – Android adb no permission – Ask Ubuntuの中にあったandroid-udev-rulesを使用してみた。

  1. udevルールの追加
    ~$ mkdir work
    ~$ cd work/
    ~/work$ git clone https://github.com/M0Rf30/android-udev-rules.git
    Cloning into 'android-udev-rules'...
    remote: Counting objects: 833, done.
    remote: Compressing objects: 100% (8/8), done.
    remote: Total 833 (delta 2), reused 1 (delta 0), pack-reused 825
    Receiving objects: 100% (833/833), 202.48 KiB | 285.00 KiB/s, done.
    Resolving deltas: 100% (324/324), done.
    Checking connectivity... done.
    ~/work$ cd android-udev-rules
    ~/work/android-udev-rules$ sudo cp -v 51-android.rules /etc/udev/rules.d/51-android.rules
    '51-android.rules' -> '/etc/udev/rules.d/51-android.rules'
    ~/work/android-udev-rules$ sudo chmod a+r /etc/udev/rules.d/51-android.rules
    
  2. グループの追加
    <br />~/work/android-udev-rules$ sudo groupadd adbusers
    ~/work/android-udev-rules$ sudo usermod -a -G adbusers $(whoami)
    

    ※今回は、android-udev-rulesの手順通り行ったが、ユーザーはplugdevグループに属しているので、51-android.rules中のGROUP="adbusers"GROUP="plugdev"に変更すれば、グループの追加は不要。

  3. udev再起動

    ~/work/android-udev-rules$ sudo udevadm control --reload-rules
    ~/work/android-udev-rules$ sudo service udev restart
    
  4. 実機接続

    USBで接続しているAndroid端末を一度外し、再度接続。Android Debug Bridge(adb)を再起動する。

    ~/work/android-udev-rules$ adb kill-server
    ~/work/android-udev-rules$ adb devices
    List of devices attached
    ARCxxxxxxxxxxxxx    device
    

PHPアプリケーションをHerokuにデプロイするときに”ERROR: Couldn’t parse ‘composer.lock’; it must be a valid lock”エラー

PHPアプリケーションをHerokuにデプロイしようと思い、

git push heroku master

としたところ

-----> PHP app detected
-----> Bootstrapping...
-----> Installing platform packages...
 ! ERROR: Couldn't parse 'composer.lock'; it must be a valid lock
  file generated by Composer. Run 'composer update', add/commit
  the change, then push again.
 ! Push rejected, failed to compile PHP app.
 ! Push failed

となりデプロイが失敗。

composer.lockは存在しており、指示通りcomposer updateをしてcomposer.jsoncomposer.lockを更新したうえでデプロイしても同じエラーが発生しました。

php – Heroku ERROR: Failed parsing composer.lock; it must be non-empty and valid JSON – Stack Overflow

より

composer self-updateでcomposer自体を更新し、composer updateしたうえで、デプロイすることでエラーが出なくなりデプロイできました。

phpMyAdminでDATETIME型が「BLOB」と表示される

  • PHP5.6
  • Apache 2.2
  • MySQL 5.6

をソースからビルドし

  • phpMyAdmin4.6.4

を設置・設定したうえで、DATETIME型を含むテーブルを作りデータを投入後、phpMyAdminから内容を確認すると、

DATETIME型がBlog表示

と表示されてしまいました。

MySQLコマンドでのSELECTやMySQL Workbenchを使って確認したところ、日付として表示されており問題がない状況。

調べたところ、

php – phpMyAdmin: Date Fields Display as BLOB – Stack Overflow

が見つかり、phpinfo()でPHPのMySQLモジュールに何が使われているのか確認したところ、mysqlモジュールが使われていました。
そこで、mysqliモジュールを使うようにビルドしなおしたところ、

DATETIME型が正常に表示

と正常に表示されるようになりました。

curl経由で実行するシェルスクリプトで標準入力を使いたい

症状

.gitconfigはGitで管理しておいて、git config user.name/user.emailは管理したくない | misty-magic.h
にある

GIT_CONFIG_LOCAL=~/.gitconfig.local
if [ ! -e $GIT_CONFIG_LOCAL ]; then
  echo -n "git config user.email?> "
  read GIT_AUTHOR_EMAIL

  echo -n "git config user.name?> "
  read GIT_AUTHOR_NAME

  cat < $GIT_CONFIG_LOCAL
[user]
  name = $GIT_AUTHOR_NAME
  email = $GIT_AUTHOR_EMAIL
EOF
fi

を含んだコードをgithubに保存し、

以下のような、よくあるcurlを使った呼び出し方

curl https://raw.githubusercontent.com/mistymagich/dotfiles/master/install.sh | bash

をすると、標準入力部分で入力待ちにならず、そのままエラー終了(終了コードが1)してしまう。

解決

linux – Execute bash script from URL – Stack Overflow

より、呼び出し方を変える

bash <(curl -s https://raw.githubusercontent.com/mistymagich/dotfiles/master/install.sh)

※"<"と"("を離すとbashの構文エラーになるので注意

.gitconfigはGitで管理しておいて、git config user.name/user.emailは管理したくない

Gitを使う上で、git config user.name/user.emailの設定は必要。そして.gitconfigなどのdotfilesをgithubで管理したいけど、git config user.name/user.emailはそこに記載したくない。
ということで、gitconfigのincludeを使って別ファイルにしました。

Gitで管理する.gitconfigには

[include]
  path = ~/.gitconfig.local

としておいて、dotfileの展開スクリプト内で

GIT_CONFIG_LOCAL=~/.gitconfig.local
if [ ! -e $GIT_CONFIG_LOCAL ]; then
  echo -n "git config user.email?> "
  read GIT_AUTHOR_EMAIL

  echo -n "git config user.name?> "
  read GIT_AUTHOR_NAME

  cat < $GIT_CONFIG_LOCAL
[user]
  name = $GIT_AUTHOR_NAME
  email = $GIT_AUTHOR_EMAIL
EOF
fi

とすることで、展開スクリプト実行中にプロンプトを出して、user.name/user.emailを入力させました。

実際のdotfileの展開スクリプト

参考