カテゴリー: OSX

[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

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

まあそんな感じで.

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

QuickTime_Player_app
AppleScript_Editor_app
MacBook Proのモニタ全体に複数の動画ウィンドウをタイル状に隙間なく表示し、ループ再生させながら適当な間隔でその中からランダムに選択されたウィンドウが自動的にフルスクリーン化表示され設定時間が過ぎるとまたタイル状のマルチウィンドウに戻るのを繰り返しながらループ…という感じのものをやる必要があった.

まずこんな感じの機能を持った動画再生アプリケーションは?とググってみるがなさげ…まあないわな.
しょうがないのでQuickTIme PlayerをAppleScriptで制御する方向で.複数ウィンドウのタイリングは“WindowResizeSuruyo”というユーティリティにまかせれば簡単そうかな?と思い使わせてもらったけどよくわからない.ウィンドウのタイリングもAppleScriptで書けばいいのだろうとは思うけど(これが使えそうかも MacScripter / a script to “tile” all windows from the front application).

タイリングするサイズはWindowResizeSuruyoの初期値を使って設定し4画面か9画面を選べるようにしてある.MacBook Pro 13’で11:9なウィンドウをタイリングしたから4か9画面になる感じ.モニタによってWindowResizeSuruyoの設定値を変更したり画面数を変更する必要があるのかもしれない.

QuickTIme Playerは元々タイトルバーやコントローラがすぐに非表示になるのでタイリングするには都合がよかった.defaultsを変更すればタイトルバーを消せるようだ Mac QuickTime Player Xのタイトルバーを非表示にする裏技 コントローラも消せるのかもしれないけど今回はこのdefaultsの変更は使ってない.

ビデオウィンドウをタイリングして敷き詰めたりフルスクリーン表示すると気になるのがマウスカーソルなんだけど、制御の方法がわからなかったからググってCocoaRubyを使うこちらの方法を使わせていただいた あらゆる操作を実行可能マウスカーソルを動かす方法いろいろ これでAppleメニューの位置に移動させてる.

音量はマルチウィンドウ時は全てのビデオの音声を小さく流し、フルスクリーン時はそのビデオの音声だけを大きく流すようにしてある.

まずAppleScriptがわかってないし使い捨て殴り書きだからもう内容忘れちゃったけど、とりあえず目的を達成したのは以下のスクリプトになってた.二度と使う事も無いと思うけど万が一時のために載せておく.

--> Created by http://about.me/saka on Ver.0.1.0(2013/04/18) -> Ver.0.1.1(2013/07/13) 
set filesDir to "Macintosh HD:Users:User:Movies:your:dir:" --> 再生ファイルディレクトリパス
set minVol to 1 --> マルチウィンドウ時音量(最小)
set maxVol to 7 --> フルスクリーン時音量(最大)
set presenVtime to 60 --> フルスクリーン再生時秒数
set multiVtime to presenVtime / 4 --> マルチウィンドウ再生時秒数

tell application "Finder" to set myFiles to every file of folder filesDir --> 再生ファイルリスト
set myFilesCount to count myFiles --> 再生ファイルリスト数

--> 再生ウィンドウ数選択ダアログ表示(4画面/9画面選択)
display dialog "Maximum video windows:" buttons {"4 windows", "9 windows"} default button "9 windows"
set button_returned to button returned of result
if button_returned is "4 windows" then
	set multiWindows to 4
else if button_returned is "9 windows" then
	set multiWindows to 9
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

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

--> タイリングウィンドウ設定(WindowResizeSuruyo.app使用)
--> http://memogakisouko.appspot.com/WindowResizeSuruyo.html
if multiWindows = 4 then
	tell application "WindowResizeSuruyo"
		ResizeWindow "6,6,0,0,2,2&6,6,3,0,5,2&6,6,0,3,2,5&6,6,3,3,5,5"
		quit
	end tell
else
	tell application "WindowResizeSuruyo"
		ResizeWindow "6,6,0,0,1,1&6,6,2,0,3,1&6,6,4,0,5,1&6,6,0,2,1,3&6,6,2,2,3,3&6,6,4,2,5,3&6,6,0,4,1,5&6,6,2,4,3,5&6,6,4,4,5,5"
		quit
	end tell
end if

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

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

delay multiVtime --> マルチウィンドウ状態で表示するウェイト

--> マルチウィンドウ -> フルスクリーン --> マルチウィンドウ --> ループ、をそれぞれ定義時間秒数表示
--> ランダムに選択されたウィンドウをフルスクリーン化し設定時間経過後フルスクリーン解除
--> フルスクリーン化の画面遷移と解除の元ウィンドウサイズ/位置に戻る画面遷移を利用
--> QuickTime Playerが終了していればスクリプトも終了
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 a in randomList
		try
			tell application "QuickTime Player"
				set audio volume of every document to 0
				set presenting of document a to true
				set audio volume of document a to maxVol
				delay presenVtime --> フルスクリーン状態で表示するウェイト
				set presenting of document a to false
				set audio volume of every document to minVol
				delay multiVtime --> マルチウィンドウ状態で表示するウェイト
			end tell
		on error
			quit --> QuickTime Playerが終了されていれば終了
		end try
	end repeat
end repeat

なんとなく動いてる感じ?ぼんやりビデオ見るのとかに使える?わかんなけど.
よくわかんないから誰かいい感じに仕上げて連絡して、ビールおごる.

まあ、そんな感じで.

2013/07/13 追記.

数ヶ月過ぎ、ふと動かしてみるとQuickTIme PlayerがファイルをOpenするところで”An unknown error occurred (1)”とエラーを吐いて動作しない.

Twitterに何気なくつぶやいてみると…なんとあの! @Piyomaru 先生から怒涛のダメ出しで問題点をご指摘いただいた!

ありがたや.

2行目を以下に修正し
set filesDir to "Macintosh HD:Users:User:Movies:yoru:dir:"
50行目に以下を追加して
	--> display dialog theFile as string
52行目を以下に修正すると
		open theFile as alias

おお、とりあえず動いたよ!

なぜか前のコードは”/Users/user/Movies”配下にmovファイルと一緒に置いておくと動作してしまうのであった…orz.
それにこのポストにはこう書いておいた、
> よくわかんないから誰かいい感じに仕上げて連絡して、ビールおごる.

@Piyomaru 先生にビールおごるべきだと思う.

まあそんな感じで.

[Blog書いた]iPhone5のSiriで簡単にMacbook Proをリーモートコントロールする[OSX][iPhone]


TUAWにSiriを使った簡単にできるおもしろそうな記事<Talking to Siri: Remote-controlling your Mac by voice with Siri Listener | TUAW – The Unofficial Apple Weblog>があったのでやってみた.

リンク先の記事では、

  1. Siriが使えるiPhone
  2. iCloudが使えるMac
  3. インターネットへの接続
  4. iCloudにログイン
  5. Notesが同期される

という条件で、Mac側に”Siri Listener”という短かいAppleScriptを走らせ、同期される”Notes”の内容を監視し読み書きする事で実現しているようだ.注意点は”Application”としてエクスポートし”Stay open after run handler” と”Run-only”にチェックを付ける事.

日本語の環境で使うために修正してみた、

on run
	-- just here to get things started...
end run

on idle
	tell application "Notes"
		if exists note "起動中のアプリを教えて" then
			delete note "起動中のアプリを教えて"
			tell application "Finder"
				set myRunningApps to name of every process whose visible is true
				tell application "Notes"
					if exists note "起動中のアプリ:" then
						delete note "起動中のアプリ:"
					end if
					set noteTitle to "起動中のアプリ:"
					set AppleScript's text item delimiters to ", "
					set appsList to myRunningApps as text
					make new note at folder "Notes" with properties {name:noteTitle, body:appsList}
				end tell
			end tell
		else if exists note "シャットダウンする" then
			delete note "シャットダウンする"
			tell application "Finder" to quit
		else if exists note "スリープする" then
			delete note "スリープする"
			tell application "Finder" to sleep
		else if exists note "リスタートする" then
			delete note "リスタートする"
			tell application "Finder" to restart
		end if
	end tell
	return 1
end idle

iPhoneでSiriを呼び出し、

  1. “メモ”と話しかける
  2. “起動中のアプリを教えて”とメモ書き込む

と、iCloudを経由してMac側の”Notes”も同期され、AppleScriptによって、

  1. “起動中のアプリを教えて”というメモを削除する
  2. “起動中のアプリ:”というタイトルのメモを作成
  3. 内容を現在Macbook Proで起動中のアプリケーションリスト、とする

結果、またiCloudを経由してiPhone側の”Notes”も同期されるので結果が戻ってくるという動きだ.
“シャットダウンする” とか残り3つは戻りの書き込みは無くて動作だけ.
shell scriptを起動すればiPhoneにプッシュで戻す、とかなんでもできるような?

やってみるとすぐに反応しておもしろいiCloudで”Notes”ってすぐ同期されるんだ(ね?).
簡単だしあなたもSiriに”シャットダウンしといて”とか話しかけて回りの人を驚かせてみては?

まあ、そんな感じで.

[Blog書いた]iPhoneで撮影したパノラマ写真をImagemagickで加工してbackspac.esで使う[iPhone][OSX] #backspaces




iPhone5は簡単にパノラマ写真を撮影できるのがおもしろいんだけど、あまり活用する機会がなかった.プリントすればいいのかもしれないけどiPhone上でも見にくいし最初に撮っておもしろいなーと思ったまま使ってなかった.

最近 www.backspac.es に写真を上げているけど手順としては、iPhoneの純正カメラか適当なアプリで撮影 → PhotoForge 2 でエフェクト + 正方形に切り出し → アップロード、といった感じ.

でもパノラマな写真をそのままbackspac.esに上げると、これまた見にくいわけ.
たぶん正方形(1×1)な写真が綺麗に掲載されるデザインなのかな?Instagram的って事なの?

で考えた、

  1. パノラマ撮影された写真を右に90°回転させる
  2. (回転させた状態の)横幅ピクセル数を調べる
  3. 横幅ピクセル数 x 横幅ピクセル数、の正方形で上から順番に切り出し分割
  4. 最後の切り出しは正方形にならない(だろう)
  5. 上から順番に並べてbackspac.esへアップロード

というもの.
分割した画像ファイルを上から順番にbackspac.esにアップロードすると…うまく並んでパノラマっぽく掲載される、いいね!

上記手順で作成しアップロードしてみたのはここ

スクリーンショットは以下.

他のサイトでも使えるかもしれない、わかんないけど.
以下に適当にやってみた手順をメモ.

Imagemagick を使えば簡単にできそう、Imagemagickは Homebrew 一発でインストールできる.

% brew install imagemagick

iPhone5でパノラマ撮影した写真をMacbook Proに転送するにはlightningケーブルでつないで”Image Capture”を使った.

右90°に回転させる.

% convert -rotate +90 src.jpg dist.jpg

(回転させた状態の)横幅ピクセル数を調べる.

% identify -format "%w" dist.jpg

調べた横幅ピクセルをコピペして(この例では”2332″)横幅ピクセル数 x 横幅ピクセル数の正方形で上から順番に切り出す.

% convert -crop 2332x2332 dist.jpg upload.jpg

upload-0.jpg〜upload-4.jpgみたいな感じでファイルが生成されているので、QuickLookでプレビューしてみる.

% qlmanage -p upload*.jpg

好きなだけQuickLookしたらスペースキーを押して終了.

パノラマ写真もbackspac.esもおもしろい、まあそんな感じで.

[Blog書いた]www.backspac.esのプロフィールページがカッコよくなった[iPhone][OSX] #backspaces


BackspacesのiPhoneアプリはもちろんウェブインタフェースも日々進化しており…と先日ポストしたのだけど、次々とアップデートしているらしく、プロフィールページがカッコよくなってる.
今日は渋谷でパノラマ撮って載せてみた

まあ、そんな感じで.

[Blog書いた]www.backspac.esおもしろいから気に入った[iPhone][OSX] #backspaces


BackspacesのiPhoneアプリはもちろんウェブインタフェースも日々進化しており、ポストしたストーリを自分のBlogに埋め込むコードを生成できる”<>Embed Story”ボタンが装備された.

本来であれば以下のようなBackspacesにポストしたストーリのミニページを埋め込めるiframeなHTMLコードが生成され自分のBlogで使えるようなのだが、ここ(wordpress.com)ではiframeなコードの使用はできないようだったのでスクリーンショットを掲載、残念.

まあ、そんな感じで.