[Blog書いた]MORPHE モルフェー 佐々木崑写真集 [花の形態誌] 1988年8月1日第1刷

camera

MORPHE モルフェー 佐々木崑写真集 [花の形態誌]
1988年8月1日第1刷

いつも使っているMINOTLAのマクロレンズと同じ頃に出版された佐々木崑さんの超接写な写真集を入手した.等倍を越えた5倍10倍の超接写は、人間の目で認識できる世界とはちょっと違うようだ.愛情で撮る、被写界深度は考えるな、などの文章は勉強になる気がする.
当時の3,800円な写真集というのは、高かったのだろうか?

DSC04476

DSC04478

[Blog書いた]Create twitter header photo(1500×500) with imageMagick.

twitter
twitterのプロフィール画面のヘッダーフォトが悲惨な状態になっている事に気がついた.
いつの間にかデザインが変更され画像が拡大表示されているようだ.

サイズは1500 x 500 pixelsが推奨されているらしい.

“The recommended header photo size in the test version is 1500 x 500 pixels, up from 1252 x 626 in the current design, so users with the new design will want to switch their picture so it doesn’t look stretched.”
Twitter Testing Major Profile Redesign That Looks a Lot Like Facebook

現在のヘッダーフォトに使っている元画像からimageMagickで1500 x 500へ生成し直す.

% identify mySanta.JPG
mySanta.JPG JPEG 1200x1600 1200x1600+0+0 8-bit sRGB 582KB 0.000u 0:00.000
% convert -resize 1200x500 mySanta.JPG mySanta-resize.png
% identify mySanta-resize.png
mySanta-resize.png PNG 375x500 375x500+0+0 8-bit sRGB 361KB 0.000u 0:00.000
% convert +append mySanta-resize.png mySanta-resize.png mySanta-resize.png mySanta-resize.png mySanta-append.png

元画像を縦500ピクセルに縮小し横に4枚並べて結合するとちょうど1500 x 500に生成されるだろ、簡単かな.
あっ!メニューで顔が隠れてんじゃん!最悪!なんて事してくれるんだ!

70ピクセル下方向にロールさせる.

% convert -roll +0+70 mySanta-append.png mySanta-twitter-header-photo.png
% identify mySanta-twitter-header-photo.png
mySanta-twitter-header-photo.png PNG 1500x500 1782x500+0+0 8-bit sRGB 320KB 0.000u 0:00.000

まあ、そんな感じで.

[Blog書いた]QuickTIme Player Xで複数動画ウィンドウをタイル状に並べてランダムにフルスクリーン化しながらリピート再生してみた、をまたまた修正した[OSX][AppleScript]

QuickTime_Player_app
AppleScript_Editor_app
1年ほど前だったと思うが [Blog書いた]QuickTIme Player Xで複数動画ウィンドウをタイル状に並べてランダムにフルスクリーン化しながらリピート再生してみた[OSX][AppleScript] という記事を書き、2013/07/13にはなぜか実はエラーを吐いて動作していない事が判明、 @Piyomaru 先生に問題点をご指摘いただきタイトルに[追記した]を追加し修正した経緯があった.

昨年末にメインの環境をMacbook Pro 13からMacbook Pro Retina 15に移行したり、OS XもMavericksに変化しているわけだが、またまたこのAppleScriptが動作しなくなっている事がわかった.

問題点は以下であった、

  1. WindowResizeSuruyo がうまく動作しなくなっていた(Mavericksに関連していると思われる)
  2. CocoaRuby がうまく動作しなくなっていた
  3. QuickTime Playerでオープン済みのwindowから取得していた”name of window 1″が、document名として指定できないビデオファイルがある事が判明した.
  4. 上記に関連しwindow titleが同じビデオファイルがあると、同一window titleである2本目以降のビデオファイルに対するウィンドウタイリング設定ができないおよびフルスクリーン再生でターゲットとしてセレクトできない、という2点が意図した動作をしていなかった事も判明した

修正は必要最小限の以下とした、

  1. ウィンドウのタイリングには MacScripter / a script to “tile” all windows from the front application をそのまま使わせてもらったが、組込み方法がまったくわからず適当にベタ書きで合体させみて、なんか動作はするようになった程度のレベル
  2. CocoaRubyをフルパスで指定する方法があった
  3. 実ファイル名をdocumentとして指定するようにしフルスクリーン動作対象としてセレクトできるようにした(が、タイリングはwindow titleで指定されているらしく、うまくタイリングできないビデオファイルがある問題は解決しない)
  4. MBPR15ではファンも回らずメモリも潤沢なので16画面まで再生可能にした(25画面でも問題なかった)

既知の問題は以下、

  1. 複製された(または同一window title)ビデオファイルが存在するとタイリング対象として意図した動作をしない

タイトルを削れば動くだろうが剥ぎ取り方がよくわからない.

% ffmpeg -i in.mov -map_metadata -1 -c:v copy -c:a copy out.mov

これでメタデータを削れるらしい、まだ確認していない.

property horizontalSpacing : 0 -- sets the horizontal spacing between windows
property verticalSpacing : 0 -- sets the vertical spacing between windows
property maxRows : 3
property maxCols : 3

-->本スクリプトを配置したディレクトリ内に"movies"というディレクトリを作成し
-->"movies"内に再生したいビデオファイルを置く
tell application "Finder" to set thisFolder to parent of (path to me) as text
set filesDir to thisFolder & "movies"

set minVol to 1 --> マルチウィンドウ時音量
set maxVol to 3 --> フルスクリーン時音量
set presenVtime to 30 --> フルスクリーン再生時秒数
set multiVtime to presenVtime / 4 --> マルチウィンドウ再生時秒数
tell application "Finder" to set myFiles to every file of folder filesDir --> 再生ファイルリスト
set myFilesCount to count myFiles --> 再生ファイルリスト数

--> QuickTime Playerが起動していれば終了させる
tell application "QuickTime Player"
	quit
end tell

--> 再生ウィンドウ数選択ダアログ表示(4画面/9画面/16画面選択)
display dialog "Maximum windows:" buttons {"9 windows", "16 windows", "25 windows"} default button "25 windows"
set button_returned to button returned of result
if button_returned is "9 windows" then
	set multiWindows to 9
	set maxRows to 3
	set maxCols to 3
else if button_returned is "16 windows" then
	set multiWindows to 16
	set maxRows to 4
	set maxCols to 4
else if button_returned is "25 windows" then
	set multiWindows to 25
	set maxRows to 5
	set maxCols to 5
end if

--> ウィンドウ数とディレクトリ内ファイル数が一致しない場合再生ファイル数を調整
set addFiles to 0 --> 追加ファイル数
if myFilesCount < multiWindows then
	set addFiles to myFilesCount
else
	set addFiles to multiWindows
end if

--> 再生用ランダムファイルリスト生成、重複ファイル除外
set randomFilesList to {} --> 再生用ランダムファイルリスト
set c to 0 --> 追加されたファイル数カウンタ
repeat until c = addFiles
	set randomSelect to some item of myFiles as text
	if randomFilesList = {} then
		set the end of randomFilesList to randomSelect as text
	else
		--> 重複ファイル追加除外
		if randomSelect is not in randomFilesList then
			set the end of randomFilesList to randomSelect as text
		end if
	end if
	set c to count randomFilesList
end repeat

--> 再生用ランダムファイルリストをQuickTime Playerで開く
set openWindowsNameList to {} --> オープン済みファイル名リスト
repeat with theFile in randomFilesList
	--> display dialog theFile as string
	tell application "QuickTime Player"
		open theFile as alias
		-->set theName to name of window 1
		-->set the end of openWindowsNameList to theName
	end tell
end repeat
set openWindowsNameList to randomFilesList

--> CocoaRubyを使用しマウスカーソルをApple menuへ移動
--> http://d.hatena.ne.jp/zariganitosh/20120110/moving_mouse_technique
do shell script "/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/bin/ruby -e  \"require 'osx/cocoa'\" -e \"OSX::CGWarpMouseCursorPosition(OSX::CGPointMake(" & 26 & "," & 12 & "))\""

delay 5 --> ファイルオープンのためにウェイト

--> QuickTime Playerウィンドウ以外の全てのウィンドウを非表示
tell application "QuickTime Player"
	activate
end tell
tell application "Finder"
	set visible of processes whose frontmost is false to false
end tell
tell application "QuickTime Player"
	activate
end tell

--> MacScripter / a script to "tile" all windows from the front application http://macscripter.net/viewtopic.php?id=15290
--> QuickTime Playerウィンドウをタイリングする
local a
set userscreen to my getUserScreen()

--display dialog (getFrntApp() as string)
try
	set applist to getFrntApp()
	if length of applist = 0 then
		return
	end if
	set a to item 1 of getFrntApp()
on error the error_message number the error_number
	display dialog "Error: " & the error_number & ". " & the error_message buttons {"OK"} default button 1
end try

try
	tileScriptable(a, userscreen)
on error the error_message number the error_number
	--display dialog "Error: " & the error_number & ". " & the error_message buttons {"OK"} default button 1
	try
		tileUnscriptable(a, userscreen)
	on error the error_message number the error_number
		display dialog "Error: " & the error_number & ". " & the error_message buttons {"OK"} default button 1
	end try
end try


--> すべてのQuickTime Playerドキュメントをループ再生設定/最小ボリューム設定
--> マルチウィンドウでQuickTime Playerを再生開始
tell application "QuickTime Player"
	tell every document
		set looping to true
		set audio volume to minVol
		play
	end tell
end tell

delay multiVtime --> マルチウィンドウ表示のためのウェイト

--> マルチウィンドウ -> フルスクリーン -> マルチウィンドウ …以下ループ、それぞれ定義時間秒数表示
--> ランダムに選択されたウィンドウをフルスクリーン化し設定時間経過後フルスクリーン解除
repeat
	--> ランダムな再生順リストを生成,、重複リスト除外
	set openWindowsNameListCount to count openWindowsNameList
	set randomList to {} --> ランダム再生順リスト
	set c to 0 --> 追加リスト数カウンタ
	repeat until c = openWindowsNameListCount
		set randomSelect to some item of openWindowsNameList as text
		if randomList = {} then
			set the end of randomList to randomSelect as text
		else
			--> 重複リスト追加除外
			if randomSelect is not in randomList then
				set the end of randomList to randomSelect as text
			end if
		end if
		set c to count randomList
	end repeat
	--> 再生順リスト順に"フルスクリーン -> マルチウィンドウ…以下ループ"をリピート
	repeat with aName in randomList
		tell application "Finder"
			set a to (aName as alias)'s name
		end tell
		try
			tell application "QuickTime Player"
				set audio volume of every document to 0
				set audio volume of document a to maxVol
				set presenting of document a to true
				delay presenVtime --> フルスクリーン状態で表示するウェイト
				try
					set audio volume of every document to minVol
					set presenting of document a to false
					delay multiVtime --> マルチウィンドウ状態で表示するウェイト
				on error
					if application "QuickTime Player" is running then
						tell application "QuickTime Player"
							-->quit
						end tell
					end if
					-->quit
				end try
			end tell
		on error
			if application "QuickTime Player" is running then
				tell application "QuickTime Player"
					quit
				end tell
			end if
			quit
		end try
	end repeat
end repeat

on tileScriptable(a, screen)
	local i, c
	set i to 1
	tell application named a
		set theWindows to every window of application a whose visible is true and floating is false and ¬
			modal is false -- and miniaturized is false
		set c to count theWindows
		if c = 0 then
			return
		end if
		set tiles to calTileBounds(c, screen, 1)
		repeat with theWindow in theWindows
			my tileScriptableWindow(a, theWindow, item i of tiles)
			set i to i + 1
		end repeat
	end tell
end tileScriptable

on tileUnscriptable(a, screeninfo)
	-- unscriptable app
	local i, c
	set i to 1
	tell application "System Events"
		set theWindows to (every window of application process a)
		--set theWindows to my filterUnscriptableInvisible(theWindows)
		
		set c to count theWindows
		
		if c = 0 then
			return
		end if
		
		--display dialog screeninfo as string giving up after 5
		set tiles to my calTileBounds(c, screeninfo, 1)
		repeat with theWindow in theWindows
			--display dialog (class of visible of theWindow)
			my tileUnScriptableWindow(a, theWindow, item i of tiles)
			set i to i + 1
		end repeat
		
	end tell
end tileUnscriptable

on filterUnscriptableInvisible(ws)
	-- filter out from ws windows that are docked 
	set newws to {}
	set docklist to getNamesDocked()
	--display dialog (docklist as string)
	repeat with theWindow in ws
		if name of theWindow is not in docklist then
			set end of newws to theWindow
		end if
	end repeat
	
	--display dialog (count newws)
	return newws
end filterUnscriptableInvisible

on getNamesDocked()
	tell application "System Events" to tell process "Dock"'s list 1
		set l to name of UI elements whose subrole is "AXMinimizedWindowDockItem"
	end tell
	
	return l
end getNamesDocked

on tileScriptableWindow(a, w, bound)
	tell application a
		set bounds of w to bound
	end tell
end tileScriptableWindow

on tileUnScriptableWindow(a, w, bound)
	tell application "System Events"
		--display dialog (count position of w)
		set AppleScript's text item delimiters to " "
		
		set position of w to {(item 1 of bound), (item 2 of bound)}
		
		-- why the -5?
		set size of w to {(item 3 of bound) - (item 1 of bound) - 5, ¬
			(item 4 of bound) - (item 2 of bound) - 5}
		--display dialog (count properties of w)
	end tell
end tileUnScriptableWindow

on calTileBounds(nWindows, screen, direction)
	-- return a list of lists of window bounds
	-- a simple tile algo that tiles along direction (current only 1=horizontal)
	
	local nRows, nColumns, irow, icolumn, nSpacingWidth, nSpacingHeight, nWindowWidth, nWindowHeight
	set {x0, y0, availScreenWidth, availScreenHeight} to screen
	set ret to {}
	
	set nRows to (nWindows div maxCols)
	if (nWindows mod maxCols) ≠ 0 then
		set nRows to nRows + 1
	end if
	
	if nRows < maxRows then
		set nSpacingHeight to (nRows - 1) * verticalSpacing
		set nWindowHeight to (availScreenHeight - nSpacingHeight) / nRows
	else
		set nSpacingHeight to (maxRows - 1) * verticalSpacing
		set nWindowHeight to (availScreenHeight - nSpacingHeight) / maxRows
	end if
	
	repeat with irow from 0 to nRows - 1
		if nRows ≤ maxRows and irow = nRows - 1 then
			set nColumns to nWindows - irow * maxCols
		else
			set nColumns to maxCols
		end if
		set nSpacingWidth to (nColumns - 1) * horizontalSpacing
		set nWindowWidth to (availScreenWidth - nSpacingWidth) / nColumns
		set nTop to y0 + (irow mod maxRows) * (verticalSpacing + nWindowHeight)
		--display dialog "Top: " & nTop buttons {"OK"} default button 1
		repeat with icolumn from 0 to nColumns - 1
			set nLeft to x0 + (icolumn) * (horizontalSpacing + nWindowWidth)
			set itile to {¬
				nLeft, ¬
				nTop, ¬
				nLeft + nWindowWidth, ¬
				nTop + nWindowHeight}
			set end of ret to itile
			--display dialog item 3 of itile as string
			--set itile to {x0 + (icolumn - 1) * wgrid, y0, wgrid, hgrid}
			--set item 3 of itile to ((item 1 of itile) + (item 3 of itile))
			--set item 4 of itile to ((item 2 of itile) + (item 4 of itile))
		end repeat
	end repeat
	
	return ret
end calTileBounds

on getFrntApp()
	tell application "System Events" to set frntProc to ¬
		name of every process whose frontmost is true and visible ≠ false
	return frntProc
end getFrntApp

on getUserScreen()
	-- size of the menubar
	tell application "System Events"
		set {menuBarWidth, menuBarHeight} to size of UI element 1 of application process "SystemUIServer"
		--display dialog "Menubar width: " & menubarWidth & ", height: " & menubarHeight
		set dockApp to (application process "Dock")
		set {dockWidth, dockHeight} to size of UI element 1 of dockApp
		--display dialog "Dock width: " & dockWidth & ", height: " & dockHeight
		set dockPos to position of UI element 1 of dockApp
		--display dialog "Dock x: " & (item 1 of dockPos) & ", y: " & (item 2 of dockPos)
	end tell
	
	-- size of the full screen
	(*
{word 3 of (do shell script "defaults read /Library/Preferences/com.apple.windowserver | grep -w Width") as number, ¬
word 3 of (do shell script "defaults read /Library/Preferences/com.apple.windowserver | grep -w Height") as number}
*)
	tell application "Finder"
		set screenSize to bounds of window of desktop
		set screenWidth to item 3 of screenSize
		set screenHeight to item 4 of screenSize
	end tell
	--display dialog "Screen width: " & screenWidth & ", height: " & screenHeight
	
	-- by default, set the available screen size to the full screen size
	set availableWidth to screenWidth
	set availableHeight to screenHeight - menuBarHeight
	set availableX to 0
	set availableY to menuBarHeight
	
	--determine the userscreen origin and size
	
	-- case 0: hidden dock
	-- if (item 1 of dockPos < 0 or item 1 of dockPos ≥ screenHeight) then
	-- no need to change anything
	-- end if
	
	-- case 1: bottom dock
	if ((item 2 of dockPos) + dockHeight = screenHeight) then
		set availableHeight to availableHeight - dockHeight
	end if
	
	-- case 2: left dock
	if (item 1 of dockPos = 0) then
		set availableWidth to availableWidth - dockWidth
		set availableX to dockWidth
	end if
	
	-- case 3: right dock
	if ((item 1 of dockPos) + dockWidth = screenWidth) then
		set availableWidth to availableWidth - dockWidth
	end if
	
	return {availableX, availableY, availableWidth, availableHeight}
end getUserScreen

どんどん意味不明なものにになっていく.

まあそんな感じで.