シェルスクリプト右往左往

Bash on Ubuntu on Windows(以下BoWと略す)の環境下で作成したシェルスクリプト(ほとんどがImageMagickとffmpeg関連)がある程度貯まってきたので、CentOS側にコピーして動かしてみたら、エラーが出まくって動かなくなった・・・トホホ。

原因のほとんどが、basenameでのエラー。BoWは Ubuntuで、coreutilsのバージョンは 8.25。CentOS 6に標準で載ってる coreutilsのバージョンは、8.4・・・7年前にリリースされたもの・・・。

ってなわけで、 `basename -s <suffix> <filepath>` となっているところを片っ端から `basename <filepath> <suffix>` に変換してようやく動く。

今までシェルスクリプトは、「なんか覚えるのメンドーだなー」とか、「Perlで組めば大抵代用できるしなー」とか思ってて、あえて避けてきたんだけど、やっぱり画像の一括リサイズとか、画像への文字合成処理とかの単純作業は、Photoshopのアクション&バッチ処理をするより、圧倒的に手間が少なく、ラクできる。 特定ディレクトリ下に無秩序に掘られたサブディレクトリに格納された画像1000枚以上にシリアル番号入れて一括リサイズなんてPhotoshopでやってらんねーーーーし!

とりあえず、if-elif-else、case、while、for、などの基本制御式さえ押さえれば、あとは manページ参照しながらやってると、よく使う find コマンドとか、imagemagickなどのオプションなんて自然とソラで書けるようになってくるのがアラ不思議(^^

google検索のおかげで、CLIはグッとハードルが下がりましたよねぇ。。。

開発環境の見直し。

「Byte range lock とは何ぞや???」

結論から言うと、その方面に詳しくないので全然わからない。検索結果を拾い読みしていくと、ファイル全体をロックするのではなく、バイト単位で範囲を指定してロックする、というものらしい。

事の始まりは、開発環境を一新したことがきっかけだった。

長年 Windowsユーザーである私は、Win32版のApache/MySQL/Perl,PHP(俗にいうWAMP環境)をセットアップして使ってきた。しかし、これらサーバー類のWindows版とLinuxなどのUNIX互換OS上のそれらとの挙動の違いなどが最近非常に気になり出しはじめ、その違いを吸収するようなコードをアプリケーションに組み込む量が多くなってきた。本来なら必要のないコード。

で、ApacheやMySQLなどのWindows版を使うのをやめ、Hyper-Vの仮想マシン(内部仮想スイッチ+WinNATで外に出るよう構築)にサーバー類を移すことにした。幸いここ数年 CentOSをいじるようになってきたのでLinuxサーバーの構築は慣れているので開発環境の移行は結構すんなりできた。

仮想化ソフトは色々あるんですが・・・まぁある程度のスペックのPCとWindows8.1以降なら迷わずWindowsに標準でついてくるHyper-V がベストだと思います。

仮想マシンを立ち上げるには、 Powershell(要権限昇格) を使うとスマート。GUIなHyperVマネージャは仮想マシン作るときだけでいいかなと。

仮想マシンの列挙
>> Get-VM

起動とシャットダウンは・・・
>> Start-VM -Name CentOS7
>> Stop-VM -Name CentOS7

コンソールにアクセスしたければ、vmconnectを実行
>> vmconnect localhost CentOS7 

もし仮想マシンがWindowsなら、リモートデスクトップで立ち上げとか。
>> mstsc /v:仮想マシンのIPアドレス

しかし、ファイルの編集などは使い慣れた Windows上のエディタ環境を使いたいしソース管理もTortoiseSVNで引き続き行いたいので、仮想マシン上に cifs-utilsをyumでインストール。Windows上のDドライブをまるごと共有し、Linux側から マウントさせ、そのディレクトリをhttpd.confで適切なURLにマッピングしてやれることでWindows上でファイルを編集しつつ、そのコードは仮想マシン上のLAMPで動くという、理想的な環境のできあがり。
図にすると、下記のような感じ。

実際に、構築して使ってみると、これが快適すぎて、もっと早くにしとけばよかった。仮想マシンをエクスポートしてバックアップしとけばPC買い替えたときもラク。

はじめ仮想スイッチを内部専用にしたせいで仮想マシン側からホスト外にアクセスできず困ってたんですが・・・PowerShellの下記コマンドでNATを設置?することで解決。

PS>> New-NetNat -Name VMNatNetwork -InternalIPInterfaceAddressPrefix 10.0.0.0/24

確認には、
PS >> Get-NetNat | fl *
Store                            : Local
TcpFilteringBehavior             : AddressDependentFiltering
UdpFilteringBehavior             : AddressDependentFiltering
UdpInboundRefresh                : False
Active                           : True
Caption                          :
Description                      :
ElementName                      :
InstanceID                       : VMNatNetwork;0
ExternalIPInterfaceAddressPrefix :
IcmpQueryTimeout                 : 30
InternalIPInterfaceAddressPrefix : 10.0.0.0/24
InternalRoutingDomainId          : {00000000-0000-0000-0000-000000000000}
Name                             : VMNatNetwork
TcpEstablishedConnectionTimeout  : 1800
TcpTransientConnectionTimeout    : 120
UdpIdleSessionTimeout            : 120
PSComputerName                   :
CimClass                         : root/StandardCimv2:MSFT_NetNat
CimInstanceProperties            : {Caption, Description, ElementName, InstanceID...}
CimSystemProperties              : Microsoft.Management.Infrastructure.CimSystemProperties

しかし、問題が一つ。Windows側に置いておいた SQLiteのデータベースファイルに読むことはできても、変更(書き込み)することが一切できなくなっていた。どうやら仮想マシン上のPHP等から CIFS経由で変更しようとすると、ロックされてタイムアウトしてしまう事象が発生。

いろいろ調べた結果、どうやら 仮想マシンのCentOSからCIFS でホスト上の共有フォルダをマウントする際に、Byte range lock を無効しないとロックされてアクセスできないよー的な記事(ほとんど英語だらけの外国の方の記事ばっかりヒットする)を見つけ、下記のように /etc/fstab に記述すると解決できた。

/etc/fstab  -----

//10.0.0.1/Devel  /mnt/devel cifs user=nakagawa,password=xxxxxx,uid=nakagawa,gid=admin,nobrl,defaults  0 0

ポイントは、nobrl というオプション。これをつけるとバイト範囲のロックを無効にする・・・らしい。が、意味は分からんが、とりあえず、SQLiteファイルの変更中(書込み処理)ロックされることはなくなった。

めでたし、めでたし。

※追記)
Windows API の LockFile/LockFileEx とか、Linuxとかだとfcntl とか? で CIFSマウントされたディレクトリ内のファイルの「byte range lock」に対応していないってことなのかな・・・う~む?

WSL 早く対応して欲しい点

Windows10 + ubuntu
最初は、こんなの使いずらい・・・と思ってましたが、先人達のブログ記事とかを漁ってうちに、「これ、いいかも・・・」と思うようになってきました(^_^;; やっぱりWindowsでLinuxネイティブバイナリが動くのは魅力。かなりずーと前にFreeBSD(98)とwineでWindowsバイナリを(かろうじて)動いていたのを思い出します。今となっては(僕にとって)実験的な興味以外意味なかったけど。

でも・・・まだまだ機能的にcygwinには追いついていないかも・・・。

早急に対応して欲しい点。

  • まともに日本語が使えるようにしてほしい。おいらの環境では日本語が入力できない・・・。表示はまぁ、なんとかなるんですが、半角・全角で崩れる・・・これって別のターミナルエミュレータとかだとちゃんと入力できるのかなー?
  • ネットワークドライブにアクセスできない・・・。samba-clientとか入れてマウントしようと試みたけど、インターフェイスがなんちゃら・・・とかいうエラーでダメ。見えない。というか、アクセスできない。なんか方法あるのかなー???
  • やっぱり使い慣れた centos とか・・・他のOSにも対応してほしい・・・

追記:

よくよく考えてみれば、CMD.EXEから起動するWSLのbashって、コンソールログインと同じ扱いなのかな・・・だとすれば、WSLのubuntu側で日本語入力できるターミナルを入れないとダメって事? Linux・・・というかCentOSですが、インストール時や緊急時以外、コンソールからログインなんかしないし・・・もししても日本語を入力するような作業することはまずないので気付かなかった。だけど・・・コンソールログインして日本語ってそもそもできるの???? っていうレベルの知識しかないです、ハイ(笑)

DOSでいうFEPみたいなもの入れるのかなー?分からん。分からん。

久しぶりに懐が痛む買い物

8年ぶりにフルサイズ素子のデジイチを買い替え。

つい一ヶ月前まで、SONY Aマウントのデジイチ、α99の後継機種を長年待ち続けていたのですが、9月に入っても発表にならず・・・つい先日、フォトキナで突然のα99 IIの発表・・・。\(^O^)/! と逝きたいところですが・・・ソニーさん、発表遅すぎるんだよ。
もうしびれ切らして、キヤノンのEOS 5D MarkIV買ってもーたやん!!!(^_^;;;

cseaq0bumaaqwyl

最近SONYはFEマウントに注力してるし・・・この先Aマウントに以前のような展開を期待するのは無理かな・・・とか、ミラーをやめてトランスルーセントミラーとかいうイマイチなものに変わって・・・とか・・・ボディ内5軸手ぶれ補正とか捨てがたい機能もあるんですが・・・他諸々の理由であまり好きになれず・・・、結局 キヤノンのEOS 5D MarkIVを買ってしまいました。

やっぱり欲しいのは 正統派のデジタル一眼レフカメラであって、デジタル家電が欲しいわけじゃないんです・・・。ソニーは α900 を最後に一眼レフカメラの新規開発自体止めちゃったんだと思います。その後の製品を見る限り僕はそう思います。

10年くらい前にコニミノのαマウントに移行した時EFレンズは全部売ってしまったので、2年前にAPS-CサイズのEOS 70Dと同時に買った EF24-70mmf2.8LII 一本しか持っていない。
今回 5D MarkIV買った時のポイントで 単50mm/f1.4もゲット。新しいデジイチ購入のため2~3年前からちょっとずつ貯金はしてたんですが・・・今回でぶっ飛びました・・・。今度はレンズ沼にはまらないぞ!と心に誓う(^^;;

そして、もう一つ、買い物。

2年縛りが9月末で終わるので、この際だから大手キャリアやめてSIMロックフリーのiPhoneSE買って、IIJとかDTIとかの格安SIMにMNPしようかな・・・と思ってたんですが、なんと、iPhone7は日本だけ特別にFeliCa搭載の特別バージョンになるFeliCa搭載って話じゃないですか!(チップは載ってて、海外版はソフトウェア的に無効にしているだけだそうです)
これで、スマホケースにiDカードを入れて「なんちゃっておサイフケータイ」する必要もなくなる! しかも防水! トイレの中に落としても大丈夫!ってなわけで、32GBのマットブラックを購入。

img_0727

背面の「総務省指定」が眩しい。老眼で見えないけど(^_^;) たぶんスティーブジョブズが生きてたら絶対許さなかったはず(笑)
叩かれまくってたのホームボタンですが・・・全然違和感ないです。僕的にはこっちの方がいいかも。日付とか時間を変更するときにクルクルと回すとき、音だけじゃなく手にもフィードバックを感じるのもマルです。

さすがに「耳からうどん」は恥ずかしいですが・・・イヤホンジャックが無くなったはホントに痛い・・・けど、そのうちデフォルトがライトニングケーブルで、ミニプラグへの変換端子を付属、なんていう逆のイヤホンの商品も出てくるはず。

大きい買い物が2つ重なってしまい・・・懐が非常にお寒い状態です。
以上グチ終わり。

はじめての・・・

常々思うんですが、(スクリプト言語も含めて)初めて本格的に学ぶプログラミング言語って大事だと思うんですよねぇ。初めて学んだプログラミング言語って、その後のプログラム的な趣味嗜好に絶大は影響を及ぼすと思うんです。

僕はC言語から入ったので、波括弧とセミコロンが無い言語は、学ぶ気が失せてしまうんですね。。。悲しきかな・・・。Webで仕事してて、当然知っていなくちゃ話にならないような、RubyとかPythonとか・・・、WindowsとSQLServerで仕事する上で知ってなきゃならない、Visual Basic(含む for Application)・・・、僕、全然知らないし、学ぼうとも思わない、という自分がいます。分かってるんです、向上心が無いのは・・・。

でも、現状の環境で、日々の雑務は全部PerlやPHP、C#で要求を満たせますし・・・需要がないんですよね、Rubyやらなきゃ!とか VB覚えなきゃ!という。

たぶんこの年(40半ば)になって同じ仕事できるような転職なんてぼぼあり得ないと思います。でもね、若い人と同じ土俵で競っても哀しい結果になると思うんです(もちろん僕限定ですけどね)。

それなら、今持ってる知識で新しい価値を作っていく方が良いと思うんですよね。

「今時 Perl ? (笑) RubyとかPython 書けないの? よくそんなんでやっていけてますね(笑)」 と、面と向かって全否定される日が来るんだろうな、、、。その時は、たぶん、僕、帰ってから晩ご飯食べながら涙流して泣くと思うんですよね(・・;;;