Archive for the 'NSProcessInfo' Category

2017/04/26 指定画像の余白の自動トリミング

オープンソースのKGPixelBoundsClip(By David Keegan)をフレームワーク化した「KGPixelBoundsClipKit」を呼び出して指定画像を自動でトリミングするAppleScriptです。

OS X 10.10以降用にビルドしたフレームワークのバイナリを用意しておきました。興味のある方は自己責任で~/Library/Frameworksフォルダに入れてお試しください。

–> Download Framework Binary

指定画像(背景を透明に指定したPNGで実行)を自動トリミングして、デスクトップに結果を書き出します。

Photoshopにも同様の機能があったような記憶がありますが、フレームワーク経由で実行することで並列処理を行いやすい部品を作っておくことが目的です。

original_and_trimed.png

AppleScript名:指定画像の余白の自動トリミング
– Created 2017-04-26 by Takaaki Naganoya
– 2017 Piyomaru Software
use AppleScript version “2.4″
use scripting additions
use framework “Foundation”
use framework “AppKit”
use framework “KGPixelBoundsClipKit” –https://github.com/kgn/KGPixelBoundsClip
–http://piyocast.com/as/archives/4611

set aFile to POSIX path of (choose file of type {“public.image”})
set anImage to (current application’s NSImage’s alloc()’s initWithContentsOfFile:aFile)

set bImage to anImage’s imageClippedToPixelBounds()

set aDesktopPath to (current application’s NSProcessInfo’s processInfo()’s environment()’s objectForKey:(“HOME”))’s stringByAppendingString:“/Desktop/”
set savePath to aDesktopPath’s stringByAppendingString:((current application’s NSUUID’s UUID()’s UUIDString())’s stringByAppendingString:“.png”)
set fRes to saveNSImageAtPathAsPNG(bImage, savePath) of me

–NSImageを指定パスにPNG形式で保存
on saveNSImageAtPathAsPNG(anImage, outPath)
  set imageRep to anImage’s TIFFRepresentation()
  
set aRawimg to current application’s NSBitmapImageRep’s imageRepWithData:imageRep
  
set pathString to current application’s NSString’s stringWithString:outPath
  
set newPath to pathString’s stringByExpandingTildeInPath()
  
set myNewImageData to (aRawimg’s representationUsingType:(current application’s NSPNGFileType) |properties|:(missing value))
  
set aRes to (myNewImageData’s writeToFile:newPath atomically:true) as boolean
  
return aRes
end saveNSImageAtPathAsPNG

★Click Here to Open This Script 

2017/03/21 CoreImage(CIFilter)で指定画像を2階調ポスタライズ v2

CoreImageのCIFilterを用いて、指定の画像を2階調でポスタライズするAppleScriptです。

CPUImageにも同様のポスタライズ用のフィルタが存在しているのですが、パラメータを指定してもうまく効かなかったので、CIFilterを使ってみました。

6ba2129c-12c5-42bf-b1a6-48dc883a97ec.png
▲実行前

81421d35-72aa-4d9d-9e6b-e2c59f9c9109.png
▲実行後

AppleScript名:CoreImageで指定画像を2階調ポスタライズ v2
– Created 2017-03-21 by Takaaki Naganoya
– 2017 Piyomaru Software
use AppleScript version “2.4″
use scripting additions
use framework “Foundation”
use framework “ASObjCExtras”
use framework “QuartzCore”
–http://piyocast.com/as/archives/4541

–画像を選択
set aPath to POSIX path of (choose file of type {“public.image”})
set aNSImage to current application’s NSImage’s alloc()’s initWithContentsOfFile:aPath

set imgRes to execCIFilterWithNSImage(aNSImage, “CIColorPosterize”) of me

set aDesktopPath to (current application’s NSProcessInfo’s processInfo()’s environment()’s objectForKey:(“HOME”))’s stringByAppendingString:“/Desktop/”
set savePath to aDesktopPath’s stringByAppendingString:((current application’s NSUUID’s UUID()’s UUIDString())’s stringByAppendingString:“.png”)

set fRes to saveNSImageAtPathAsPNG(imgRes, savePath) of me

on convCIimageToNSImage(aCIImage)
  set aRep to current application’s NSBitmapImageRep’s alloc()’s initWithCIImage:aCIImage
  
set tmpSize to aRep’s |size|()
  
set newImg to current application’s NSImage’s alloc()’s initWithSize:tmpSize
  
newImg’s addRepresentation:aRep
  
return newImg
end convCIimageToNSImage

on convNSImageToCIimage(aNSImage)
  set tiffDat to aNSImage’s TIFFRepresentation()
  
set aRep to current application’s NSBitmapImageRep’s imageRepWithData:tiffDat
  
set newImg to current application’s CIImage’s alloc()’s initWithBitmapImageRep:aRep
  
return newImg
end convNSImageToCIimage

–NSImageをCIImageに変換してCIfilterを実行
on execCIFilterWithNSImage(aNSImage, aFilterName)
  set aCIImage to convNSImageToCIimage(aNSImage) of me
  
  
set aFilter to current application’s CIFilter’s filterWithName:aFilterName
  
aFilter’s setDefaults()
  
aFilter’s setValue:aCIImage forKey:“inputImage”
  
aFilter’s setValue:2 forKey:“inputLevels”
  
set aOutImage to aFilter’s valueForKey:“outputImage”
  
  
set newNSImage to convCIimageToNSImage(aOutImage) of me
  
return newNSImage
end execCIFilterWithNSImage

–NSImageを指定パスにPNG形式で保存
on saveNSImageAtPathAsPNG(anImage, outPath)
  set imageRep to anImage’s TIFFRepresentation()
  
set aRawimg to current application’s NSBitmapImageRep’s imageRepWithData:imageRep
  
set pathString to current application’s NSString’s stringWithString:outPath
  
set newPath to pathString’s stringByExpandingTildeInPath()
  
set myNewImageData to (aRawimg’s representationUsingType:(current application’s NSPNGFileType) |properties|:(missing value))
  
set aRes to (myNewImageData’s writeToFile:newPath atomically:true) as boolean
  
return aRes –成功ならtrue、失敗ならfalseが返る
end saveNSImageAtPathAsPNG

★Click Here to Open This Script 

2016/03/16 指定文字列からQRコード画像(PNG)をデスクトップに作成する

指定文字列からQRコードの画像をデスクトップに作成するAppleScriptです。

QRコードやバーコードを作成するためのFrameworkとしてはZXingObjCが有名で、これがAppleScriptでは扱えないCGImageを返してくるのでいろいろ悩んでいたのですが、OS X自体にQRコード作成機能があるとは予想外でした(悩んで損した、、、)。

58e2a470-ee99-4310-8a70-ba2b49c6bd98.png
▲本AppleScriptで生成したQRコードの画像

43d40cb9-6701-49e4-8cff-573570397e40.png
▲AppleScriptでバーコード画像も(CICode128BarcodeGenerator)生成できる(Code 128)

QRコードの認識機能自体もAppleScriptから呼び出せるので、本Scriptで生成したPNG画像を認識用のAppleScriptで確認して、元の文字列がデコードされることを確認しています(でも、なぜかCode128の1Dバーコードの認識機能が用意されていない。とても不思議)。

AppleScript名:指定文字列からQRコード画像(PNG)をデスクトップに作成する
– Created 2016-03-16 by Takaaki Naganoya
– 2016 Piyomaru Software
use AppleScript version “2.4″
use scripting additions
use framework “Foundation”
use framework “QuartzCore”

set a to “mailto:maro@piyocast.com”

set aStr to current application’s NSString’s stringWithString:a
set strData to aStr’s dataUsingEncoding:(current application’s NSISOLatin1StringEncoding)
set qrFilter to current application’s CIFilter’s filterWithName:“CIQRCodeGenerator”
qrFilter’s setValue:strData forKey:“inputMessage”
qrFilter’s setValue:“H” forKey:“inputCorrectionLevel”
set anImage to qrFilter’s outputImage()

set aDesktopPath to (current application’s NSProcessInfo’s processInfo()’s environment()’s objectForKey:(“HOME”))’s stringByAppendingString:“/Desktop/”
set savePath to aDesktopPath’s stringByAppendingString:((current application’s NSUUID’s UUID()’s UUIDString())’s stringByAppendingString:“.png”)
saveNSImageAtPathAsPNG(anImage, savePath) of me

–NSImageを指定パスにPNG形式で保存
on saveNSImageAtPathAsPNG(anImage, outPath)
  set imageRep to anImage’s TIFFRepresentation()
  
set aRawimg to current application’s NSBitmapImageRep’s imageRepWithData:imageRep
  
set pathString to current application’s NSString’s stringWithString:outPath
  
set newPath to pathString’s stringByExpandingTildeInPath()
  
set myNewImageData to (aRawimg’s representationUsingType:(current application’s NSPNGFileType) |properties|:(missing value))
  
set aRes to (myNewImageData’s writeToFile:newPath atomically:true) as boolean
  
return aRes –成功ならtrue、失敗ならfalseが返る
end saveNSImageAtPathAsPNG

★Click Here to Open This Script 

2016/02/19 Viewを作成してPNGで保存

View/Controlを作成して、View/Controlをデスクトップ上に画像として保存するAppleScriptです。

103bc611-92d0-45e0-b092-9caadc9439a1.png
▲本Scriptの出力結果

デバッグ用に作ったScriptです。各種ViewやControlをプログラム上から生成した際に、その内容をWindowのsubviewに指定して表示するというデバッグもありますが、それよりも手軽にビューの内容そのものをPNG画像として書き出してしまおうというものです。

Retina Display上で実行しても、得られるイメージはRetina Resolutionではないところが注意点でしょうか。

AppleScript名:ASOCで指定Viewを作成してPNGで保存
– Created 2016-02-19 by Takaaki Naganoya
– 2016 Piyomaru Software
use AppleScript version “2.4″
use scripting additions
use framework “Foundation”
use framework “AppKit”

–Get Desktop Path
set aDesktopPath to (current application’s NSProcessInfo’s processInfo()’s environment()’s objectForKey:(“HOME”))’s stringByAppendingString:“/Desktop/”

–Make Save Image Path
set savePath to aDesktopPath’s stringByAppendingString:((current application’s NSUUID’s UUID()’s UUIDString())’s stringByAppendingString:“.png”)

–Make a Control (View/Control)
set aButton to current application’s NSButton’s alloc()’s initWithFrame:(current application’s NSMakeRect(0, 0, 180, 80))
aButton’s setButtonType:(current application’s NSMomentaryLightButton)
aButton’s setBezelStyle:(current application’s NSRoundedBezelStyle)
aButton’s setTitle:“Button Image Test”

–Save a View/Control as PNG
set aRes to saveViewAtPathAsPNG(aButton, savePath) of me
–>  true

–指定Viewを指定パスにPNG形式で保存
on saveViewAtPathAsPNG(aView, outPath)
  set aIMG to current application’s NSImage’s alloc()’s initWithData:(aView’s dataWithPDFInsideRect:(aView’s |bounds|()))
  
return saveNSImageAtPathAsPNG(aIMG, outPath) of me
end saveViewAtPathAsPNG

–NSImageを指定パスにPNG形式で保存
on saveNSImageAtPathAsPNG(anImage, outPath)
  –画像のRaw画像を作成
  
set imageRep to anImage’s TIFFRepresentation()
  
set aRawimg to current application’s NSBitmapImageRep’s imageRepWithData:imageRep
  
  
–書き出しファイルパス情報を作成
  
set pathString to current application’s NSString’s stringWithString:outPath
  
set newPath to pathString’s stringByExpandingTildeInPath()
  
  
–書き出し
  
set myNewImageData to (aRawimg’s representationUsingType:(current application’s NSPNGFileType) |properties|:(missing value))
  
set aRes to (myNewImageData’s writeToFile:newPath atomically:true) as boolean
  
  
return aRes –成功ならtrue、失敗ならfalseが返る
end saveNSImageAtPathAsPNG

–ImageRepを指定パスにPNG形式で保存
on saveImageRepAtPathAsPNG(imageRep, outPath)
  –書き出しファイルパス情報を作成
  
set pathString to current application’s NSString’s stringWithString:outPath
  
set newPath to pathString’s stringByExpandingTildeInPath()
  
  
–書き出し
  
set myNewImageData to (aRawimg’s representationUsingType:(current application’s NSPNGFileType) |properties|:(missing value))
  
set aRes to (myNewImageData’s writeToFile:newPath atomically:true) as boolean
  
  
return aRes –成功ならtrue、失敗ならfalseが返る
end saveImageRepAtPathAsPNG

★Click Here to Open This Script 

2015/09/08 現在実行中のプロセスの情報を取得

Cocoaの機能を用いて、現在実行中のプロセスの情報を取得するAppleScriptです。

サンプルのログは、ASObjC Explorer 4上で実行したときのものです。OS X標準のScript Editor上で実行した場合にはまた異なるものが返ってきます。また、AppleScriptをアプレットとして保存した場合にはその状態が返ってきます。

興味深いのは、thermalStateが取得できること。エネルギー消費の激しいアプリケーション、に該当するものでしょうか?

thermal_state.png

AppleScript実行時の環境情報は地味に役立つので、いろいろ試しておきたいところです。とくに、ユーザー環境のSpotlight検索辞書が壊れていたり、Diskの修復の必要があったりするケースが見られるので、そうしたテストも行えるとよさそうです(真剣にそういうケースで困ることが、、、)。

AppleScript名:ASOCで現在実行中のプロセスの情報を取得
– Created 2015-09-08 by Takaaki Naganoya
– 2015 Piyomaru Software
use AppleScript version “2.4″
use scripting additions
use framework “Foundation”

set procInfo to current application’s NSProcessInfo’s processInfo()
–>  (NSProcessInfo)

set argList to procInfo’s arguments()
–>  (NSArray) {​​​​​”/Applications/ASObjC Explorer 4.app/Contents/MacOS/ASObjC Explorer 4″​​​}–ASObjC Explorer 4

set envList to procInfo’s environment()
–>  (NSDictionary) {​​​​​PATH:”/usr/bin:/bin:/usr/sbin:/sbin”, ​​​​​TMPDIR:”/var/folders/h4/jfhlwst88xl9z0001s7k9vk00000gr/T/”, ​​​​​LOGNAME:”me”, ​​​​​HOME:”/Users/me”, ​​​​​XPC_FLAGS:”0×0″, ​​​​​Apple_PubSub_Socket_Render:”/private/tmp/com.apple.launchd.OLjjErklL4/Render”, ​​​​​USER:”me”, ​​​​​SSH_AUTH_SOCK:”/private/tmp/com.apple.launchd.y3g31V3gh7/Listeners”, ​​​​​SECURITYSESSIONID:”XXXXX”, ​​​​​DISPLAY:”/private/tmp/com.apple.launchd.63oTa9LGKM/org.macosforge.xquartz:0″, ​​​​​XPC_SERVICE_NAME:”au.com.myriad-com.ASObjC-Explorer-4.69328″, ​​​​​SHELL:”/bin/xxxx”, ​​​​​__CF_USER_TEXT_ENCODING:”0×1F8:0×1:0xE”​​​}

set anUniqueStr to procInfo’s globallyUniqueString()
–>  (NSString) “XXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX-XXXX-XXXXXXXXXXXXXXXX”

set anID to procInfo’s processIdentifier()
–>  4283–Unix Process ID (pid)

set aName to procInfo’s processName()
–>  (NSString) “ASObjC Explorer 4″

set aHostName to procInfo’s hostName()
–>  (NSString) “mbpretina.local”

set aVersionStr to procInfo’s operatingSystemVersionString()
–>  (NSString) “バージョン 10.10.5(ビルド 14F27)”

set aVersion to procInfo’s operatingSystemVersion()
–> can’t bridge argument of type {_NSOperatingSystemVersion=qqq}. OS X 10.10ではブリッジ不可。10.11でOK

set aCPUCores to procInfo’s processorCount()
–>  8

set activeCPUCores to procInfo’s activeProcessorCount()
–>  8

set anRAMcapacity to procInfo’s physicalMemory()
–>  8.589934592E+9

set anRAMcapacity to procInfo’s systemUptime()
–>  6.8344782485801E+4

set aThermalState to procInfo’s thermalState()
–>  0 –NSProcessInfoThermalStateNominal
(*
enum {
NSProcessInfoThermalStateNominal,
NSProcessInfoThermalStateFair,
NSProcessInfoThermalStateSerious,
NSProcessInfoThermalStateCritical
};
*)

★Click Here to Open This Script 

2015/08/28 ASOCでプロセス関連のじっけん

CocoaのNSProcessInfoを叩いて、CPUコア(スレッド数)の取得を行うついでにいろいろ情報を取得してみました。

CPUのスレッド数については、Terminal上で「sysctl -n hw.ncpu」などと実行すると取得できますが、CocoaのAPIを呼び出して取得する方法を調べてみました。スピードが速いとか超豪華なデータが返ってくるとかいうことは一切なく、ただスレッド数(仮想コア数)がわかるだけです。

AppleScript名:ASOCでプロセス関連のじっけん
– Created 2015-08-28 by Takaaki Naganoya
– 2015 Piyomaru Software
use AppleScript version “2.4″
use scripting additions
use framework “Foundation”

set aCount to (current application’s NSProcessInfo’s processInfo()’s processorCount()) as integer –CPU’s Thread number
–>  8 –4 core, 8 thread machine (MacBook Pro Retina 2012)

set aInfo to current application’s NSProcessInfo’s processInfo()
–>  (NSProcessInfo)

aInfo’s hostName()
–>  (NSString) “mbpretina.local”

aInfo’s operatingSystemVersionString()
–>  (NSString) “バージョン 10.10.5(ビルド 14F27)”

–ASOC上で実行できない(T_T)
aInfo’s operatingSystemVersion()
–> can’t bridge argument of type {_NSOperatingSystemVersion=qqq}.

★Click Here to Open This Script 

OS X 10.11上でOSのバージョン取得を行ってみたところ、期待どおりの結果が得られました。

AppleScript名:10.11でOSバージョンを取得
– Created 2015-08-28 by Takaaki Naganoya
– 2015 Piyomaru Software
use AppleScript version "2.4"
use scripting additions
use framework "Foundation"

set aInfo to current application’s NSProcessInfo’s processInfo()

–OS X 10.11上では結果を正しく返す
aInfo’s operatingSystemVersion()
–> {majorVersion:10, minorVersion:11, patchVersion:0}

★Click Here to Open This Script