AutomatorのPythonでファイル一括操作した
環境
メイン環境
MacOS X Sierra 10.12.6 (16G2016)
サブ環境
MaxOS X Mojave
やりたかったこと
一括でディレクトリ内の画像ファイルを同じ名前のディレクトリに入れたい
つまり、これを
images ├a.png └b.png
こう
images ├a │└a.png └b └b.png
最初にやってだめだったこと
シェルスクリプトを組んでターミナルから叩いてもらう
images ├a.png ├b.png └mkdir_and_mv_images.sh
mkdir_and_mv_images.sh
#!/bin/sh for filename in *.png; do echo $filename fname=`echo $filename | sed "s/\.[^\.]*$//"` echo "$fname" mkdir "$fname" mv "$filename" "$fname" done
$ cd /path/to/images/directory $ chmod +x mkdir_and_mv_images.sh $ ./mkdir_and_mv_images.sh
なぜだめだったか
- 動くけど繰り返したいときに手間かかる
- 使用者がデザイナーで黒い画面きらい
更に試してだめだったこと
Automatorでサービスを作り、その中でシェルスクリプト動かす。
サービスファイルをインストールしたらimagesディレクトリを右クリックしてメニューから選ぶだけ。
右クリックしたディレクトリまでのパスが$1に入る。
#!/bin/sh cd $1 for filename in *.png; do echo $filename fname=`echo $filename | sed "s/\.[^\.]*$//"` echo "$fname" mkdir "$fname" mv "$filename" "$fname" done
なぜだめだったか
Sierraだと動くけどMojaveだとmkdirコマンドでPermission deniedになる。
回避できず、謎すぎてはげる
解決策
前置きが長い。
Automatorのサービスの中でPythonスクリプトを動かして解決した。
# coding: utf-8 import os import sys import glob import shutil dir = sys.argv[1] os.chdir(os.path.expanduser(dir)) print(os.getcwd()) files = glob.glob('./*.png') for f in files: name, ext = os.path.splitext(f) os.mkdir(name) shutil.move(f, name)
てか標準出力表示したいんだけど
出し方がよくわかんない、なんかうまくメッセージダイアログに出せないし、
raise Exception('error')
とかしてもでない。謎。
せめてここの結果に出したいけどそのまま実行ボタン押してもsys.argvの中身無いからエラーで止まる
「パス」という項目があったので試しに置く
この「~/Desktop」の値が全くいじれねんけど!!!!!!!!!!!!
ここ押さなきゃ編集できないとか罠でしょ…
できた。
NAOqi 2.8.5.10でC++の環境構築とNAO v6上で実行バイナリ動かすまで
都度解釈が間違ってると思うので個人用の備忘録です
開発環境
- Ubuntu 16.04 Xenial Xerus - 64bits only
- NAO v6 2.8.5.10
- naoqi-sdk-2.8.5.10-linux64
- ctc-linux64-atom-2.8.5.10
環境設定
下記ドキュメントを見ながら行う。
プロジェクト作成したり実行したりは下記。
問題
実行バイナリをUbuntu上で動かすと問題無いがNAO v6上に持ってって実行しようとするとNo such file or directoryとなる。
仮説
NAO(atom)用にcross compileできてない。
そもそもドキュメントにnaoqi-sdk-○○-○の説明はあるが
ctc-○○-atom-○○をどう使うかが理解出来なかったのでいろいろ試した。
解決方法
ダウンロードしたファイルの使いかた
- naoqi-sdk-2.8.5.10-linux64 -> Host環境で動かせる実行バイナリを作るためのモジュール郡
- ctc-linux64-atom-2.8.5.10 -> NAOの中で動かせる実行バイナリを作るためのモジュール郡
以下のコマンドはLinux上で動かす実行バイナリをmakeするための設定みたいなもの
$ qitoolchain create mytoolchain ~/.qilib/naoqi-sdk-2.8.5.10/toolchain.xml $ qibuild add-config myconfig -t mytoolchain --default
この場合$ qibuild configure -> $ qibuild makeした実行バイナリはこうなる
[hf@hf-nuc:~/Documents/NaoCpp/helloworld/build-myconfig/sdk/bin]% file ./HelloWorldService ./HelloWorldService: ELF 64-bit LSB executable, x86-64, version 1 (GNU/Linux), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.32, BuildID[sha1]=11b466622d0e1f5a527f0801aa58ad94603e624e, not stripped
このバイナリをNAOに持ってって実行しようとしてもNo such file or directoryとなる。
NAO向けの実行バイナリをmakeさせるにはctcのほうのtoolchain.xmlを設定してあげる必要がある。
$ qitoolchain create naov6toolchain ~/.qilib/ctc-linux64-atom-2.8.5.10/toolchain.xml $ qibuild add-config myconfig -t naov6toolchain --default
$ qibuild configure -> $ qibuild makeした実行バイナリはこうなる
(プロジェクトにbuild-myconfigが残ってるとConfigureFailedとなったのでディレクトリごと削除した)
[hf@hf-nuc:~/Documents/NaoCpp/helloworld/build-myconfig/sdk/bin]% file ./HelloWorldService ./HelloWorldService: ELF 32-bit LSB executable, Intel 80386, version 1 (GNU/Linux), dynamically linked, interpreter /lib/ld-linux.so.2, for GNU/Linux 2.6.32, BuildID[sha1]=aad0d883dc6bd6530764d384e976076f406ceb14, not stripped
これをNAOに持ってって実行するとうまく行く。
ようやくNAOqiのC++環境が理解できた気がする。
【解決?】subprocessを非同期実行しつつ、確実にkillしたい
具体的にはarecordで音声ストリームを取得しつつ、任意のイベントを受け取るかデストラクタで確実にkillしたい。
以下のような一連のコードをThreadで実行している。
self.buff = Queue.Queue(1000) reccmd = ["arecord", "-f", "S16_LE", "-r", "16000", "-t", "raw", "-q"] process = subprocess.Popen(reccmd, stdout=subprocess.PIPE) logger.debug("start buffering process") self.flag_Buffering = True while self.flag_Buffering: self.buff.put(process.stdout.read(2048)) logger.debug("killing buffering process") process.kill()
時たまkillできずに子プロセスが居残っているのか、再度実行した時にクラッシュする。
無限ループをフラグで管理している部分が怪しい。
デストラクタでのフラグ変更は確実に呼び出される保証が無いが、 with文なら上手くいく…?
withクラスの実装。
2018年1月30日追記
発話区間の音声を取得するためにbuffというQueueを作り、 発話の検知イベントの遅れを加味して発話前のコンマ数秒からbuffに残し、 発話終わりのイベントが来たタイミングで録音終了、subprocessをkillしたかった。
そもそも別スレッドで実行する必要が無かったので メインスレッドのイベントループ内でstdout.read()した。
素直に動いてくれたけどタイトルの非同期実行しつつ確実にkillは相変わらず不明。 withか。
その他備忘録メモ
process.stdout.read()を使う時にパイプバッファが詰まって デッドロックするのでcommunicate()を使おうという記事を多々見たが ストリームの取得はstdout.read()しか方法が無い様子
NAO/Pepperで固定IPを割り当てたい
元々NAO/PepperにStatic IPを振りたかったがうまくいかず挫折。
この度手順を理解したので忘れないようにここに記す。
フォーラムを見ていると、既に設定されている(一度接続した事がある)アクセスポイントについては設定を削除してから行う必要があるとのことだが…
ロボットウェブページ、旧ロボットウェブページからは上手く設定が削除できなかったり(?)とハマりポイントがある気がしたので該当アクセスポイントの設定済みな状態からほぼ確実にIP固定する方法についての手順まとめ。
続きを読むAWS Elastic BeanstalkでWebSocketサーバーから426 Upgrade Required
備忘録として
※個人記事のため記載内容に誤りが含まれる可能性があります
やりたいこと
Application Load BarancerがWebSocketに対応したということで
Elastic Beanstalk上のNode.jsでWebSocketサーバーを立てる。
WebSocket Clientは汎用のものにしたい。(Not Socket.io)
続きを読むAutomatorとPythonでWindows/Macの共有フォルダパスを相互変換する話。
(※はてな初心者なので画像の出し方が分からぬ…)
会社で共有フォルダを使って作業していると
Windowsユーザーからは
ファイル共有しました。
\\hoge\fuga\piyo\file
Macユーザーからは
以下のパスに共有しました。
smb://hoge/fuga/piyo/file
といった連絡が入ってきて、お互いに
\\hoge\fuga\piyo\file ⇄ smb://hoge/fuga/piyo/file
とパスを書き換える必要が出てきます。
一般的にはマイノリティな立場のMacユーザーが
パスを書き換えるらしいです。
こういったやり取りが毎日行われているらしく、 自動化できないか相談を受けたため調べて解決した話を記述します。
続きを読む