Date   

Re: Asking for Advice on distribution, please?

2551phil
 


On 22 Aug 2017, at 06:51, Brian Christmas <ozsanta@...> wrote:

do you know if FastSpring offers free trials, and leases by the month?


I think you’ve got the wrong idea about what they do. They don’t lease anything. They act as a payment broker for your app. They can set up a page on their website that looks like your website, so that when customers click a ‘Buy’ button on your web page, it takes them seamlessly to the payment page on FastSpring's site. Unless customers actually notice the url in the header, they won’t even be aware that they’re not on your website any longer.

The page customers get taken to has all the order details fields and can take all the various payment methods (visa, mastercard, paypal, even PO and cheque) that customers might want to use. The vendor sorts out all the taxes for your sales, then pays you on a fortnightly or monthly basis - minus their commission, of course (as I say < 10%).

If you want to understand the process more clearly, have a wander around their website:


FastSpring are not the only e-Commerce vendor around nor even the most modern or slick in terms of interface and APIs, but I’ve been using them for a couple of years and they’re both very reliable and have extremely good customer service. 

Jens, thank you for pointing out that Interarchy does not need external ftp support. My heart sank when I read Phils comment.

Sorry, I missed the Interarchy bit. I just saw mention of ftp and remembered that I’d seen that the ftp command line tool had been removed in 10.13.


Best


Phil
@sqwarq





Re: Asking for Advice on distribution, please?

Brian Christmas
 

Thanks Phil & Jens. It IS a limited market, but the bloke (Aussie for ‘Guy’) who instigated this whole thing in the first place, believes a now much more versatile App than what I’ve written for my only Client, (who I’m in dispiute with), might have unforseen use in many industries, besides the die creation businesses. He thinks there’s LOTS of people who have to print 100% accurate images, and particularly the automation of PitStop Pro would be welcome. Pitstop Pro has a wide client base. Also automated ftp monitoring, downloading and printing can save lots of time.

Typically, MM prepares and prints each image in roughly 15 seconds, on an i7 2014 iMac, with a per email overhead of about 30 seconds. Printing a 30 pdf email takes about 8 1/2 minutes, including PitStop Pro Preflight treatment.

AND, as I said, the additional printing of a Barcode is optional, but, adding a barcode opens up a whole new world of monitoring.

MM saves lots of Data, and one App displays past Clients, and how many emails and Jobs they’ve submitted. So, you instantly know who your most prolific Clientel are.

Everything I’ve ever written has my Copyright notice on it.

Who knows. I’d like to throw it out there and see.

Phil, do you know if FastSpring offers free trials, and leases by the month?

I have a Website for my Coding Company, but have never advertised it, so setting up a site will be easy.

Jens, thank you for pointing out that Interarchy does not need external ftp support. My heart sank when I read Phils comment.

Many, many thanks. Hopefully I can give Apples tight restrictions a miss. Just as well I remembered Shane’s warning, and re-read it. Thanks Shane!

Regards

Santa




On 22 Aug 2017, at 12:58 am, 2551phil <2551phil@...> wrote:


On 21 Aug 2017, at 20:39, Brian Christmas <ozsanta@...> wrote:

14. It optionally uses the ftp Client ‘Interarchy’, to monitor folders on a remote Server, automatically downloads the folders after any items are added, and prints and stores them as for an email.


There’s no ftp in High Sierra, so you’ll have to rethink that. But

31. Mail Manager requires TextEdit, Interarchy (optional), GraphicConverter, Quark (optional), Acrobat, PitStop Pro (Optional), InDesign (optional), Illustrator, Word, Excel, and of course, Mail.

Good luck trying to sandbox an app and still get it to communicate with any or all of those. I believe there are temporary entitlements to allow some kinds of interapplication communication, but I’d be surprised if you could make that work within the confines of the App Store. You can’t even save to locations outside of your sandbox except a select few that you can add entitlements for, so you’d have to find a way around all that, too.

You’re going to need a website to give it a home page, deal with customer support, provide documentation etc. It’s a requirement for App Store submission, although from what I’ve seen they’re not particularly rigorous about enforcing it. 

As for self-distribution, just throw it up on MacUpdate and similar sites, register with an e-Commerce vendor like FastSpring to handle all the payment processing, set up a simple website to give it a home page etc and away you go. It’s a lot simpler than dealing with sandboxing I can assure you, and you’re typically only paying < 10% commission, including overheads, instead of Apple’s 30%. 


Best


Phil

Me on Twitter
@philofishal
@sqwarq

Me on the web:
sqwarq.com
applehelpwriter.com

Get DetectX - The mac troubleshooting app
http://sqwarq.com/detectx




Re: Asking for Advice on distribution, please?

 


On Aug 21, 2017, at 7:58 AM, 2551phil <2551phil@...> wrote:

There’s no ftp in High Sierra, so you’ll have to rethink that.

Huh? Interarchy is an FTP app. It has its own FTP stack, so it's not dependent on any FTP implementation in the OS.


As for the app, Brian — to me it sounds very special-purpose, for a limited market. And the list of apps it requires is quite daunting! It doesn't sound like something that would work in a mass-market channel like the App Store. If I were trying to sell this I'd go for targeted marketing toward the types of professionals who'd have a use for it.

—Jens


Re: Asking for Advice on distribution, please?

2551phil
 


On 21 Aug 2017, at 20:39, Brian Christmas <ozsanta@...> wrote:

14. It optionally uses the ftp Client ‘Interarchy’, to monitor folders on a remote Server, automatically downloads the folders after any items are added, and prints and stores them as for an email.


There’s no ftp in High Sierra, so you’ll have to rethink that. But

31. Mail Manager requires TextEdit, Interarchy (optional), GraphicConverter, Quark (optional), Acrobat, PitStop Pro (Optional), InDesign (optional), Illustrator, Word, Excel, and of course, Mail.

Good luck trying to sandbox an app and still get it to communicate with any or all of those. I believe there are temporary entitlements to allow some kinds of interapplication communication, but I’d be surprised if you could make that work within the confines of the App Store. You can’t even save to locations outside of your sandbox except a select few that you can add entitlements for, so you’d have to find a way around all that, too.

You’re going to need a website to give it a home page, deal with customer support, provide documentation etc. It’s a requirement for App Store submission, although from what I’ve seen they’re not particularly rigorous about enforcing it. 

As for self-distribution, just throw it up on MacUpdate and similar sites, register with an e-Commerce vendor like FastSpring to handle all the payment processing, set up a simple website to give it a home page etc and away you go. It’s a lot simpler than dealing with sandboxing I can assure you, and you’re typically only paying < 10% commission, including overheads, instead of Apple’s 30%. 


Best


Phil

Me on Twitter
@philofishal
@sqwarq

Me on the web:
sqwarq.com
applehelpwriter.com

Get DetectX - The mac troubleshooting app
http://sqwarq.com/detectx



Asking for Advice on distribution, please?

Brian Christmas
 

G’day Folks

I’m after some advice please.

I want to place my 10-years-in-the-making Project, Mail Manager, on the open market.

At first I thought of the App Store, but reading Shane’s ‘Explored’ has me worried.

If you’ll bear with me, I’ll explain what my App does, and how. Then, if you’ve persevered, I’d appreciate any advice on how to market it, and any thoughts on if it would pass App Store scrutiny.

It’s role is to automatically process incoming email images, that can be used for such tasks as die making. It’s designed to run 24/7, and has done so for 5 years as an App, and 5 years prior as a collection of scripts..


1. It’s all wrapped into one App package, that relocates itself to the Application folder, and adds a permanent Icon in the Dock.  Once running, it runs 24/7. It contains an additional 11 embedded Apps.

2. It  places a Barcode128 font into the Fonts folder.

3. It places an Applescript ‘Mail Manager Caller’ into the Application Scripts folder.

4. It places an Applescript ‘ftp Downloader’ into the Folder Actions Scripts folder.

5. As it’s first installed, it creates a Mail Rule, and applies it to a User selected Inbox.

6. It has six embedded signed Application in a ‘Scripts’ folder, which it calls and runs as needed.

7. One of the embedded Apps, ‘Mail Manager Item Printer’, runs pretty much all the time.

8. In the same folder, it contains two pdf’s, that it opens as requested, for information.

9. It’s role is to takle all incoming email, and print pretty much any and all attached Graphic file, at 100% Size, on a user selected sized sheet, overlapping with a user set overlap on multiple page prints.

10. It optionally adds two barcodes, and two English text dialogs, to each individual image. Each Barcode starts as unique to that email, and has a terminating unique-to-that-print-Job-within-the-email number.

11. When finished, it prints a ‘Cover Sheet’, on a smaller user selected sized sheet, that contains all necessary details, such as Company Name, Email DateTime Barcode, Sender, list of Attachments, list of opened zipped attachments, text contents of email, etc.

11. It saves the finished emails in a time dated mailbox, one for each day, each month, each year.

12. It saves all Clients details for later referral. A list of details of a user set number of emails is displayed. Clicking on one will open the email, and its saved data folder.

13. It saves all images, both before and after barcoding, to the local Mac, and an optional copy to a nominated server. It has a Utility App for finding and opening old emails and their folders.

14. It optionally uses the ftp Client ‘Interarchy’, to monitor folders on a remote Server, automatically downloads the folders after any items are added, and prints and stores them as for an email.

15. It has two extra Applications in a folder, in the embedded Scripts folder, the folder which optionally can be opened to the Applications folder.

16. One of those Apps is for copying as many times as required, to any workstations, that make up part of any manufacturing process that uses the printed images.

17. This app allows scanning of the printed barcode on the image sheet on commencement of work on any particular job, and at the end of the work. More than one can be in progress at once.

18. It also seletively allows the entry of measurements of each job, in either inches or centimetres.

19. It allows a remote server such as in the Accountancy department, to be selected, and indicates the online status of that server.

20. If the server is online, it allows periodic saving of completed jobs to the server, saving the timing, measurements, and email and image sheete details. If errors occur, the job details are not lost.

21. It saves and displays sent completed jobs for 14 days, at each workstation.

22. If Accountancy access is selected, the main Mail Manager App also saves relevant data to the same Accountancy server FILE as the work stations. It is irrelevant what order the information is stored in.

23. The second App (still being written) will assess the data, and display an summation of each email (Total processed time, total processed Job area (if applicable)), and offer a range of pre-prepared email layouts using that data, that will just need completion by the Accountancy department.

24. When Mail Manager need another App to carry out anything, it saves a .dat file to the desktop,with all necessary variables, calls the App to open, which reads the saved file, trashes it, carries out the work, and closes.

25. When certain other Apps are open, such as a Utility to set up Interarchy easily, or to set up up files for interaction with PitStop Pro (an Acrobat utility), Mail Manager halts processing while those Apps are open.

26. Two Apps run permanently, one that monitors optional Interarchy downloading, and 'Mail Manager Item Printer' (this closes when Mail Manager closes), 

27. Mail Manager also optionally sends detailed emailed reports and graphs of incoming mail and total printed Jobs. These can be any hour(s) of the day (start of GMT zero time day, to present hour), a single nominated hour that sums up the previous 24 hours data, a daily, weekly, monthly, and two yearly reports (day by day, & month by month) (all optional).

28. It also can optionally send error messages (wording as set up by Operator, logo added by Mail Manager), to Clients that submit problematic artwork, and also/only to the Public Relations Department (or whatever; an email list can be constructed)

29. Every Graphic that GraphicConverter can print can be optionally turned ON/OFF individually.

30. Mail Manager can be placed into a cancelable/renewable 10 minute Standby, and can re-process emails that are dropped onto a 're-cycle’ mailbox (It only reprints the cover sheet).

31. Mail Manager requires TextEdit, Interarchy (optional), GraphicConverter, Quark (optional), Acrobat, PitStop Pro (Optional), InDesign (optional), Illustrator, Word, Excel, and of course, Mail.



What I’m wondering, is it actually simple enough that it’s worth spending time learning and carrying out sandboxing, and trying to submit to the Apps Store??? (I take Shane’s warning/advice seriously). I’ve tried to follow the KISS principle in its operation.

If not, is anyone please able to tell me what other options I’d have for distribution (I don’t want to handle it myself). Any links??

I’d prefer a monthly lease, and a two month free trial.

Thank you to anyone whose read this far, and many more thanks to anyone that answers back.

Regards

Santa



Apple events overridden.

Ilya Shebalin
 

Hi, 
I faced an issue of iTunes (or QuickTime Player) being unable to respond to events sent by my script long ago, even posted here, but now I seem to figure out the true reason behind such an odd behavior. The script is designed to wake me up at the time I tell it by interacting through dialogs by playing an iTunes tune or a one opened and played by QTP and is saved as a plugin activated upon invoking from the scripts menu icon. The strangest part is that  if I launch iTunes or QTP after I'm done with firing up the script (which, of course, always happens before the wake-up time) then the script wouldn't work but would otherwise. This is confirmed by thorough experimenting. Do this:
  1. Save the script to your user scripts folder and make sure the scripts menu icon is checked to display on the menu bar. 
  2. Run the script from there, set the time, date and song. For the purposes of testing set the closest time to the one of the actual testing.
  3. After you're done launch iTunes and quit it.
  4. When the time you set in steps ##1 & 2 arrives nothing happens. If you won't do step #3 it will.


 My question would be: is there a way to work around this obvious misbehavior/bug?  


The script is (please consider going through the information put in my comments):

property start_date : ""
property end_date : ""
property AlarmDate : ""
on MakeUnixDate(AlarmDate) --assembles the date suitable for shell commands. NB. The presence of this particular handler  was determined by my localization. US users probably won't need it and, thus, can safely disregard. For those only do shell script part is essential and has to remain for which placing it inside the handler is not necessary.  All credits for pointing me out to a better implementation of OS X-to-Unix dates conversion found inside this handler go to Yvan Koenig.
set locale_Date to date AlarmDate
set timeString to time string of locale_Date
set Unix_day to text -2 thru -1 of ((100 + (day of locale_Date)) as string)
set Unix_month to text -2 thru -1 of ((100 + (month of locale_Date)) as string)
set Unix_year to text -2 thru -1 of (year of locale_Date as string)
set ShortUnix_date to Unix_day & Unix_month & Unix_year 
set FullUnixDate to Unix_date & timeString


do shell script "sudo pmset schedule wake " & quote & FullUnixDate & quote password "" with administrator privileges  --IMPORTANT! Type in your user password instead of the empty quotes before running the script


end MakeUnixDate

repeat


display dialog "Enter event start date" default answer start_date buttons {"Cancel", "OK"} default button "OK"
set EnteredStartTime to text returned of result


try
set start_time to date EnteredStartTime


exit repeat
on error
display dialog "Invalid date. Try again."
try
on error number -128
return
end try
end try
end repeat


repeat
set EndTimePrompt to display dialog "Enter event end date" default answer end_date buttons {"Cancel", "OK"} default button "OK"
set EnteredEndTime to text returned of EndTimePrompt


try
set end_time to date EnteredEndTime
if end_time ≥ start_time then
exit repeat
else


display dialog "Invalid data: end date can't go before start date." & return & return & "Error: end date " & quote & date string of end_time & ", " & time string of end_time & quote & space & "entered is before start date " & quote & date string of start_time & ", " & time string of start_time & quote
end if
on error
display dialog "Invalid date. Try again."
try
on error number -128
return
end try
end try
end repeat

display dialog "Start date: " & start_time & return & "End date: " & end_time

set EventSummaryPrompt to display dialog "Enter brief description" default answer ""
set EventSummaryResponse to text returned of EventSummaryPrompt

set EventLocationPrompt to display dialog "Enter location" default answer ""
set EventLocationResponse to text returned of EventLocationPrompt

set EventNotesPrompt to display dialog "Enter miscellaneous information" default answer ""
set EventNotesResponse to text returned of EventNotesPrompt

set EventAlarmPrompt to display dialog "Enter reminder time, min before the start date " & (time string of start_time) default answer ""
set EventAlarmResponse to (text returned of EventAlarmPrompt) as real
set AlarmTriggerTime to start_time - EventAlarmResponse * minutes


tell application "iCal"
run
set AllCalendars to get name of every calendar
set AppleScript's text item delimiters to return
set CalendarColumn to AllCalendars as text
delay 3
set CalendarListPrompt to display dialog "Your calendars:" & return & return & CalendarColumn default answer ""
set CalendarListResponse to text returned of CalendarListPrompt
set NewCalendarEvent to make new event with properties {start date:start_time, end date:end_time, summary:EventSummaryResponse, location:EventLocationResponse, description:EventNotesResponse, status:confirmed} at end of calendar CalendarListResponse


set AlarmNotificationPrompt to display dialog "Set a reminder?" buttons {"No reminder", "Set"} default button "Set"
if button returned of AlarmNotificationPrompt is "Set" then
display dialog "Enter name of the reminder" default answer ""
set ToDoSummary to text returned of result
set NewTodo to make new todo with properties {priority:high priority, summary:ToDoSummary} at the end of calendar named CalendarListResponse
set SoundAlarmPrompt to display dialog "Set a sound alarm for the reminder?" buttons {"No sound alarm", "Set"} default button "Set"


if button returned of SoundAlarmPrompt is "Set" then
display dialog "Enter a date for the reminder" default answer ""
set AlarmDate to text returned of result
display dialog "Choose sound for the sound alarm" & return & return & "Basso, Frog, Hero, Pop, Submarine, Blow, Funk, Morse, Purr, Tink, Bottle, Glass, Ping, Sosumi" default answer ""
set SoundAlarmName to text returned of result
set SoundAlarm to make new sound alarm with properties {trigger date:date AlarmDate, sound name:SoundAlarmName} at the end of NewTodo
my MakeUnixDate(AlarmDate)
else


display dialog "Enter date for the silent reminder" & return & return default answer ""
set AlarmDate to text returned of result
set DisplayAlarm to make new display alarm with properties {trigger date:date AlarmDate} at the end of NewTodo


my MakeUnixDate(AlarmDate)
end if


end if
display dialog "Done. iCal quits" buttons {"OK"} default button "OK" giving up after 2
quit


end tell

MakeUnixDate(AlarmTriggerTime as text)

===============================SKIP UNTIL HERE IF YOU'RE ON MOUNTAIN LION OR HIGHER=============================================


repeat

display dialog "Enter wake-up date" default answer start_date buttons {"Cancel", "OK"} default button "OK"
set EnteredStartTime to text returned of result

try
set AlarmTriggerTime to date EnteredStartTime

exit repeat
on error
display dialog "Invalid date. Try again."
try
on error number -128
return
end try
end try
end repeat

set locale_Date to AlarmTriggerTime
set timeString to time string of locale_Date
set Unix_day to text -2 thru -1 of ((100 + (day of locale_Date)) as string)
set Unix_month to text -2 thru -1 of ((100 + (month of locale_Date)) as string)
set Unix_year to text -2 thru -1 of (year of locale_Date as string)
set ShortUnix_date to Unix_day & Unix_month & Unix_year 
set FullUnixDate to Unix_date & timeString

do shell script "sudo pmset schedule wake " & quote & FullUnixDate & quote password "" with administrator privileges  --IMPORTANT! Type in your user password in place of the empty quotes before running the script


tell application "iTunes"
launch
ignoring case, white space, diacriticals and punctuation
set playlistList to name of every playlist of source "Library" --IMPORTANT! The name of this source may be different in your localization


set the_body to items 2 thru -1 of playlistList --formatting the list excluding the source's name
set AppleScript's text item delimiters to return
set formatted_body to the_body as text
set theHeader to item 1 of playlistList & return & return --formatting the list including the source's name which will now be its header


display dialog theHeader & formatted_body buttons {"Cancel", "Continue"} default button "Continue" default answer "" --all playlists of the uppermost level are displayed


set playlistName to text returned of result --enter the playlist of your choice


set targetPlaylistName to name of playlist named playlistName --the entered value is the name of the playlist you chose and it becomes a value of the variable.


set targetTrackList to name of every track of playlist named targetPlaylistName --all tracks of the chosed playlist
set the_body to items of targetTrackList --formatting the list containing the tracks
set AppleScript's text item delimiters to return
set formatted_body to the_body as text
end ignoring
set theHeader to "Playlist " & targetPlaylistName & return & return
display dialog theHeader & formatted_body buttons {"Cancel", "Continue"} default button "Continue" default answer "" --list of all tracks pf the chosen playlist, formatted


set TrackName to text returned of result --enter the track of your choice
set targetTrackName to name of track named TrackName --the entered value is the name of the track you chose and it becomes a value of the variable.
set TrackToPlay to track named targetTrackName --этот трек будет воспроизведён и становится переменной, передаваемой программе "iTunes"




set VolumePrompt to display dialog "Set volume for the iTunes track" & return & return & "Any integer between 0 (min) and 100 (max)" default answer ""
set EnteredVolume to text returned of VolumePrompt --set volume for the track


display dialog "Done. iTunes quits" buttons {"OK"} default button "OK" giving up after 2
quit
end tell





repeat until (current date) = AlarmTriggerTime
delay 1
end repeat


tell application "iTunes"
launch
set visible of browser window 1 to false
set sound volume to EnteredVolume
if TrackToPlay exists then
set track_time to duration of TrackToPlay
play TrackToPlay
delay (track_time)
end if
set sound volume to 100
quit it
end tell

P.S. Already having composed this message I realized that for many of you the iCal part might be irrelevant since it's been replaced by Contacts and Reminders in Mountain Lion and onwards. However, since the most significant part of the script may not necessarily involve creating a Calendar event and the countdown to iTunes launch is of greater importance, those of you, who're on newer than Lion version of OS are suggested to skip the part up to the indicated part (separated from the iCal part with the hatch) and copy paste the rest of the script.


Sincerely Yours,
Ilya Shebalin
           ilja.shebalin@... 




Absolutely perplexed!!

Brian Christmas
 



 G’day

I’ve written before how Shane's eBook method of saving to a .plist no longer works with some data, specifically listed data from Array Controllers, in High Sierra, but with the latest iterations of current Sierra, they’ve stopped working too!!!

So, I’ve researched, and altered my approach, but still get a major problem. EVERYTHING I’ve found indicated Shane’s method is supposed to work, and WAS up until the latest release of Sierra.

The code below, which reads data from 4 controllers, works on my first pass setting it up, with default data, and the Array Controller lists set as simply {}, but on the second pass, when the Array Controllers actually contain data, and they save as a  .plist file, the list becomes unopenable after just the first write.

I’ve tried setting the READ Array Controller data to a list and a record, and saving both as  a list and a record, and enclosing the variable in curly brackets. All fail.

The icon of the .plist file, after failure, looks like this…

Error is …'Brian’s Disk:Users:OzSanta:Desktop:Mail Manager  Folder:General Data.plist’ is not a property list file


                


Can ANYONE please tell me what I’m supposed to do?

Regards

Santa

on saveTheGeneralData()
  #  Set up Emails
try
say 100
set emailText1Array to table1ArrayController's arrangedObjects() as list
say 101
on error errmsg
set emailText1Array to {}
my displayError("saveTheGeneralData 1 " & errmsg as text)
end try
try
set emailText2Array to table2ArrayController's arrangedObjects() as list
on error errmsg
set emailText2Array to {}
my displayError("saveTheGeneralData 2 " & errmsg as text)
end try
try
set emailText3Array to table3ArrayController's arrangedObjects() as list
on error errmsg
set emailText3Array to {}
my displayError("saveTheGeneralData 3 " & errmsg as text)
end try
#
try
  set (my lastReceivedEmailsList) to emailListArrayController's arrangedObjects() as list
  on error errmsg
set lastReceivedemailsListList to {}
my displayError("saveTheGeneralData 4 " & errmsg as text)
end try
try
set thePPath to POSIX path of ((path to desktop as text) & "Mail Manager Folder:General Data.plist") as text
on error errmsg number errnum
tell application "System Events" to display dialog "Setting thePPath " & errmsg
end try
try
set numbersDict to current application's NSDictionary's dictionaryWithDictionary:{sendNumbersChartAlsoKey:sendNumbersChartAlso, sendNumbersChartOnlyKey:sendNumbersChartOnly, numbersGraphStoreEachNumbersFileKey:numbersGraphStoreEachNumbersFile, numbersGraphPreviousDaysPermanentKey:numbersGraphPreviousDaysPermanent, numbersGraphPreviousWeeksPermanentKey:numbersGraphPreviousWeeksPermanent, numbersGraphPreviousMonthsPermanentKey:numbersGraphPreviousMonthsPermanent, numbersGraphLastYearsPermanentKey:numbersGraphLastYearsPermanent, theNumbersGraphTypeKey:theNumbersGraphType}
on error errmsg number errnum
my displayError("saveTheGeneralData set numbersDict  " & errmsg as text)
end try
 

tell application id "com.apple.systemevents"
set plistParentRecord to make new property list item with properties {kind:record} as record
set propertyListFile to make new property list file with properties {contents:plistParentRecord, name:thePPath}
#
# Actually Arrays
#
  tell property list items of propertyListFile
try
make new property list item at end with properties {kind:list, name:"emailText1Key", value:{emailText1Array}} — <<< ALWAYS FAILS HERE WHEN ACTUALLY WRITING DATA, Says ‘1’, but never ‘2’ once written.
say 1
end try
try
make new property list item at end with properties {kind:list, name:"emailText2Key", value:emailText2Array}
say 2
end try
try
# make new property list item at end with properties {kind:record, name:"emailText3Key", value:{emailText3Array}}
say 3
end try
try
make new property list item at end with properties {kind:list, name:"lastReceivedEmailsListKey", value:lastReceivedEmailsList}
say 3.1
end try
try
make new property list item at end with properties {kind:list, name:"numbersDictKey", value:numbersDict}
say 4
end try

try
make new property list item at end with properties {kind:list, name:"eMailAddressesListButtonKey", value:eMailAddressesListButton}
say 4.01
end try
try
make new property list item at end with properties {kind:list, name:"hourlyReportsKey", value:hourlyReports}
say 4.1
end try
try
make new property list item at end with properties {kind:list, name:"salesAddressKeeperStoreKey", value:salesAddressKeeperStore}
say 4.3
end try
try
make new property list item at end with properties {kind:list, name:"theSmallPaperListsKey", value:theSmallPaperList}
say 4.4
end try
try
make new property list item at end with properties {kind:list, name:"theLargePaperListKey", value:theLargePaperList}
say 4.5
end try
try
make new property list item at end with properties {kind:list, name:"eMailAddressesListKey", value:eMailAddressesList}
say 4.6
end try
  try
say 5
make new property list item at end with properties {kind:string, name:"mailAddressesMainErrorKey", value:mailAddressesMainError}
make new property list item at end with properties {kind:string, name:"theBusinessNameKey", value:theBusinessName}
  on error errmsg
tell application "System Events" to display dialog errmsg
end try

say 6
make new property list item at end with properties {kind:number, name:"emailsMaxRetrievableKey", value:emailsMaxRetrievable}
 # ETC.
say 7
make new property list item at end with properties {kind:date, name:"theLastMidnightCheckerStoreNSDateKey", value:theLastMidnightCheckerStoreNSDate}
  # ETC.

say 9
make new property list item at end with properties {kind:boolean, name:"serverBackupStateKey", value:serverBackupState}
  # ETC.
say 10
end tell
end tell
 
end saveTheGeneralData


Plist problem under Sierra!

Brian Christmas
 

G’day

The following shortened code has worked flawlessly for 6 years, and now party (mostly) fails, especially when saving the email addresses. I’ve checked the output of the Array Controllers, and even replaced them. The count of the output matches the lines of the filled in Table connected to the Array Controllers. However, when creating a Dictionary, it seems to fail.

Some parts write to the plist, most don’t. Basically just the simple variables.

I’ve spent all day trying to find guidance on Apples sites, but haven’t found anything.

Four array Controllers store email lists, 3 of them also have a cell tick box, 1 of them has two cell tick boxes. The Tables are naturally cell based. Always have been.

Any advice, please?

Regards

Santa

on saveTheGeneralData()
  #  Set up Emails
try
set emailText1Array to table1ArrayController's arrangedObjects() as list
on error errmsg
set emailText1Array to {}
my displayError("saveTheGeneralData 1 " & errmsg as text)
end try
try
set emailText2Array to table2ArrayController's arrangedObjects() as list
on error errmsg
set emailText2Array to {}
my displayError("saveTheGeneralData 2 " & errmsg as text)
end try
try
set emailText3Array to table3ArrayController's arrangedObjects() as list
on error errmsg
set emailText3Array to {}
my displayError("saveTheGeneralData 3 " & errmsg as text)
end try
#
try
set (my lastReceivedEmailsListto emailListArrayController's arrangedObjects() as list
on error errmsg
set lastReceivedemailsListList to {}
my displayError("saveTheGeneralData 4 " & errmsg as text)
end try
try
set mailDict to current application's NSDictionary's dictionaryWithDictionary:{mailAddressesMainErrorKey:mailAddressesMainErroremailText1Key:emailText1ArrayemailText2Key:emailText2ArrayemailText3Key:emailText3Array} ##  FAILS, cannot retrieve values.
 end try
## Lots snipped out
#
try
set (my theLastMidnightCheckerStoreNSDateto my makeNSDateFrom:theLastMidnightCheckerStore
 end try
  try
set numbersDict to current application's NSDictionary's dictionaryWithDictionary:{sendNumbersChartAlsoKey:sendNumbersChartAlsosendNumbersChartOnlyKey:sendNumbersChartOnlynumbersGraphStoreEachNumbersFileKey:numbersGraphStoreEachNumbersFilenumbersGraphPreviousDaysPermanentKey:numbersGraphPreviousDaysPermanentnumbersGraphPreviousWeeksPermanentKey:numbersGraphPreviousWeeksPermanentnumbersGraphPreviousMonthsPermanentKey:numbersGraphPreviousMonthsPermanentnumbersGraphLastYearsPermanentKey:numbersGraphLastYearsPermanenttheNumbersGraphTypeKey:theNumbersGraphType}
on error errmsg number errnum
my displayError("saveTheGeneralData set numbersDict  " & errmsg as text)
end try
 try
set (my theNSPreviousSundayto my makeNSDateFrom:(my thePreviousSunday)
on error errmsg number errnum
set (my theNSPreviousSundayto my makeNSDateFrom:(current date)
end try
   try
set myDict to current application's NSDictionary's dictionaryWithObjects:{mailDicttheBusinessNametheServerDiskserverBackupStatehourlyReportstheCoverPagePrintertheSmallPaperListtheLargePagePrintertheLargePaperListsayEveryErrorMessagertfdPapersizelargePapersizevoiceSetteremailsMaxRetrievablelastReceivedEmailsListinterarchyActivatorsaveLocalftpArchiveOnservertheLastMidnightCheckerStoreNSDateemailsToChooseFromSortDefinernumbersDicttheNShourlyReportsDateKeepertheNSPreviousSundayspecialReportSetterTitletheLastSpecialReportStoreNSDateignoreGraphicConverterCountcheckInterarchyEverytheMainEmailAddressincludeCompressedExcelSpreadSheetmaxBarcodeCharactersprintGCToA4TestbarcodeSizedontPrintSignaturesSendErrorMessageSendSalesErrorMessageshutDownCycleerrorsListDisplayeMailAddressesListprintBarcodesreplaceMissingFontsactivateInDesignAcrobatOverlapprintWithQuarkcropBoxErrorcropBoxErrordpisalesAddressKeeperStoreprintEveryImageeMailAddressesListButtontheGCPositionsaveToAccountancysaveToAccountancyPathforKeys:{"mailDictKey", "theBusinessNameKey", "sFKey", "serverBackupStateKey", "hourlyReportsKey", "theCoverPagePrinterKey", "theSmallPaperListKey", "theLargePagePrinterKey", "theLargePaperListKey", "sayEveryErrorMessageKey", "rtfdPapersizeKey", "largePapersizeKey", "voiceSetterKey", "emailsMaxRetrievableKey", "lastReceivedemailsListKey", "interarchyActivatorKey", "saveLocalftpArchiveOnserverKey", "theLastMidnightCheckerStoreNSDateKey", "emailsToChooseFromSortDefinerKey", "numbersDictKey", "hourlyReportsDateKeeperKey", "thePreviousSundayKey", "specialReportSetterKey", "theLastSpecialReportStoreNSDateKey", "ignoreGraphicConverterCountKey", "checkInterarchyEveryKey", "theMainEmailAddressKey", "includeCompressedExcelSpreadSheetKey", "maxBarcodeCharactersKey", "printGCToA4TestKey", "barcodeSizeKey", "dontPrintSignaturesKey", "SendErrorMessageKey", "SendSalesErrorMessageKey", "shutDownCycleKey", "errorsListDisplayKey", "eMailAddressesListKey", "printBarcodesKey", "replaceMissingFontsKey", "activateInDesignKey", "AcrobatOverlapKey", "printWithQuarkKey", "cropBoxErrorKey", "cropBoxErrordpiKey", "salesAddressKeeperStoreKey", "printEveryImageKey", "eMailAddressesListButtonKey", "theGCPositionKey", "saveToAccountancyKey", "saveToAccountancyPathKey"}
on error errmsg number errnum
tell application "System Events" to display dialog "Setting myDict " & errmsg
end try
try
tell application id "com.apple.systemevents"
myDict's writeToFile:thePPath atomically:true
end tell
on error errmsg number errnum
my displayError("AppDelegate's saveTheGeneralData " & errmsg as text)
end try
end saveTheGeneralData


How Do I Search For String in Contact's EMail Address?

 


test only

Willis Grant
 

Test only


Re: Trying to set up 8 column Table with 276 embedded Check Boxes.

Brian Christmas
 

G'day,

For the ObjC group. Thanks Jens. Sorry for overstepping the etiquette. I actually posted to both lists, hopefully, but it's an ASObC Project, so I think it belongs here, or else, why not please? Does the Applescript list cover these Projects?

I've been battling with the code, and simplified it, so I'll just post snippets, if that's OK.

                                         try

  set item1CBVisible to true # (current application's NSMutableDictionary's dictionaryWithObjects:{true} forKeys:{value})

set item1CBTitle to (item (iof (my extensionsToIgnoreas text#}

on error

  set item1CBVisible to false # (current application's NSMutableDictionary's dictionaryWithObjects:{false} forKeys:{value})

set item1CBTitle to "" #} forKeys:{title})

end try

  set temp to (current application's NSMutableDictionary's dictionaryWithObjects:{item1CBVisibleitem1CBTitleforKeys:{Extensions1CBValueExtensions1CBTitle})

set anObj to {Extensions1CB:temp}

I think  that should be OK, but this next is failing, with the BOOL error. (Column 1 is bound to Extensions1CBValue).

(ExtensionsArrayController's addObjects:anObj)

I think that in turn is caused by my inability to find a way of setting the value and title of the checkbox cell to the Array Controllers nested values. (Nested in the Column). I've tried to address both directly with Extensions1CBValueExtensions1CBTitle  with no result except the BOOL error. Then I tried setting a path, Extensions1CB:Extensions1CBValue using every type of separator I could think of; comma, full stop, colon, and what's shown below (a reference). All result in the BOOL error.

Does anyone know what's wrong please. Or, can someone guide me on whats the correct method of addressing nested values in an Array Controller? Nothing like it is covered in Explored 5, and I can't find anything online.

Regards

Santa



 


Trying to set up 8 column Table with 276 embedded Check Boxes.

Brian Christmas
 



 G'day scripters
 
I've got an 8 column Outline View Table, each column of which has a Check Box installed. I need to add more rows, and each Check Box needs a unique Title, and the ability to alter the State. A total of 276 unique Check Boxes.
 
I just cannot get the code right, and Shane Stanley's Explored 5 doesn't help. In interface builder I have defined the valueof each Check Box to the key 'state', and the title to the key 'title’. I don’t expect Shane to answer this, much as I’d appreciate it, as I’m ‘persona non-gratis’ to him for offering criticism of Script Debugger on-line; (two major bugs, still un-fixed after many months). Ahh well. So, I’m hoping someone else will step forward.
 
'Saving errors reports, with (the last part), ', {Extensions1CB:{|title|:"X-Face", state:true}, Extensions2CB:{|title|:"XPM", state:true}, Extensions3CB:{|title|:"XWD", state:true}, Extensions4CB:{|title|:"YUV", state:true}, Extensions5CB:{|title|:"", state:false}, Extensions6CB:{|title|:"", state:false}, Extensions7CB:{|title|:"", state:false}, Extensions8CB:{|title|:"", state:false}}} doesn’t understand the “writeToFile_atomically_” message'.
 
Columns are defined as "Extensions1CB", "Extensions2CB", "Extensions3CB", "Extensions4CB", "Extensions5CB", "Extensions6CB", "Extensions7CB", "Extensions8CB"
 
I need to set the title and State of every Check Box, save them (as the Array Controllers contents), and read them.

Any advice appreciated. I've Googled for hours, to no real avail.
 
Regards
 
Santa
 
 
My code is...
 
NOTE, this is obviously wrong...
 
  set anObj to (current application's NSMutableDictionary's dictionaryWithObjects:{item1CB, item2CB, item3CB, item4CB, item5CB, item6CB, item7CB, item8CB} forKeys:{"Extensions1CB", "Extensions2CB", "Extensions3CB", "Extensions4CB", "Extensions5CB", "Extensions6CB", "Extensions7CB", "Extensions8CB"})
 
 
--
--  AppDelegate.applescript
--  GC Name Extension lister
--
--  Created by Brian Christmas on 6/7/17.
--  Copyright © 2017 MeSelf Software. All rights reserved.
--
script AppDelegate
  # property parent : class "NSObject"
  property parent : class "ObjectWithFords"
 
  -- IBOutlets
  property ListWindow : missing value
  property box1 : missing value
  property ExtensionsArrayController : missing value
  property listValues : ""
  property firstCheckBox : missing value
  property ListWindowSetUp : false
  property ExtValueDict : {}
  property mailManagerDesktopFolderPath : ((path to desktop as text) & "Mail Manager Folder:")
  property setUpExtension : false
  property extensionsToIgnore : {".D", "8BIM", "AAI", "Acorn Sprite", "AFP", "ALIAS", "AMBER ARR", "AMC", "Analyze", "ANI", "ANPA", "Apple File Icon", "Apple Preferred", "ART", "ARW", "ASCII", "Atari Portfolio", "B3D", "Bio", "BioRad", "BLD", "BMP", "BSB", ¬
  "BSP", "BUF", "BUM", "Byte-Array Hea- der File (.H)", "CALS", "c4", "CAM", "CALS", "CEL", "CGM", "Chyron", "cicn", "CINEON", "CISCOIpPhoneI mages", "CLP", "cri", "CRW", "CR2", "csource", "CT", "CUR", "CVG", "CWK", "DCS", "DCR", "DCX", "DDS", "DeltaVision", ¬
  "DESR VFF", "DICoM", "Direct icns", "Diskus YUV", "DJ1000", "DL", "dm2/dm3", "DNG", "Doodle", "DPX", "Dr. Halo", "DrawIT", "ECW", "ElectronicImage", "EPSF", "ESM", "Facesaver", "Favicon ICO", "FAX", "FaxSTF", "fep", "fig", "First Publisher art", "FireViewer PDB", ¬
  "FITS", "FLH/FLI/FLC", "FPX", "Freehand 10", "FUJI", "GATAN", "GEM", "GFX", "GIF", "GrayPaint", "GRP", "HAM", "HD Photo (wdp)", "HDR", "HP-GL/2", "HGT", "HMR", "HTC splashscreens", "IBL", "IBM PIC", "IC ? Imagic", "lcd5", "ICo/ICN", "IFF/LBM", "IM", "Image ->Finder", ¬
  "ImageLab/PrintTechnic", "IMG/XIMG", "IMQ", "IPLab", "ithmb", "IRIS", "ISS", "j6i", "JBI", "JEDMICS C4", "JIF", "JNG", "JPEG/JFIF", "JPEG 2000", "JPF", "JPX", "KDC", "Keynote PICT", "KISS CEL", "Koala", "Kodak DCS", "KoNTRoN", "LDF", "Liberty IM", "LIFF", "LOGO", ¬
  "Lotus-PIC", "LuraDocument", "LWF (LuraWave)", "MacDraw I", "MacPaint", "MAG", "MAYA-IFF", "MBM (Psion 5)", "Meteosat 5", "MDC", "Meteosat 5", "MHT", "MonkeyLogo", "MonkeyCard", "Mov", "MPO", "MP2", "MRC", "MrSID", "MRW", "MSP", "MSX MSX2, MSX+ - MSX2+", "NAA/IPTC", ¬
  "NASA Raster Metafile", "NEF", "NEO", "NGG/NCG", "NIF", "NIST PCT", "Nokia .pict", "NoL", "NV12", "ODF", "oNCoR", "ORF", "OTA", "P ? ? Degas", "Palette", "Palm image stream", "PAM", "PAC STAD", "PaperPort (MAX)", "PBM/PGM/PPM", "PCD", "PCX", "PIC (32K)", "PIC", ¬
  "PIC", "PIC", "PICS", "PICT", "PICT resource", "PDB", "PDF", "PDS3", "PEF", "PFM", "PGC/PGF", "Photo PDB", "Photostudio", "PGPF", "PGC/PGF", "Photo Raw", "PIX", "PM", "PNG", "PoRST", "PowerPoint", "Ppat", "PSD", "PSP", "PTG", "PWP", "Pxx - Degas", "QDV", "QNT", "QTIF", ¬
  "QTL", "RAF", "RAW", "RDC", "RIFF", "RLA", "RLE", "RSB", "RTF", "RW2", "SCR", "SCR", "Scrap", "ScreenShot Hack PDB", "SCX", "SFF", "SFW", "SGI", "SHP", "SHS", "SIGMA SD10 raw", "Sinclair QL", "SIXEL", "SKETCH", "SMV", "SNX", "SoFTIMAGE", "SPC", "SRF", "ST X SBIG", "StartupScreen s", ¬
  "STV", "SUN", "Super-Hi-Res 3200", "SVG", "SWF", "System 7 clip", "TBC", "TCL", "TealPaint PDB", "TEX", "TGA", "TIFF", "TIM PSX", "Tiny Viewer PDB", "TN ?", "TRS-80", "VBM", "VFF", "VGS-8", "VITRoNIC", "VoXEL", "VPB", "VPM", "WBIN", "WBMP", "wbz", "wdb", "Webp", "Winfax (FXM)", "Winmail.dat", ¬
  "WMF", "WPG", "X11", "X3F", "XBM", "XCF", "XFIG", "X-Face", "XPM", "XWD", "YUV"} -- "asc" is  signature
 
  on applicationWillFinishLaunching:aNotification
  -- Insert code here to initialize your application before any files are opened
  tell me to activate
  my displayExtensionsWindow()
  end applicationWillFinishLaunching:
 
  on displayExtensionsWindow()
  try
  set p to 2
  set (my setUpExtension) to true
  set p to 3
  set theflag to true
  tell application "Finder"
  if not (exists file ((my mailManagerDesktopFolderPath as text) & "Extension Data.plist")) then
  set theflag to false
  end if
  end tell
  if not theflag then
  set p to 3.1
  set tempList to {}
  set p to 3.2
  ExtensionsArrayController's removeObjects:(ExtensionsArrayController's arrangedObjects())
  set p to 3.3
  repeat with i from 1 to (((((count of (my extensionsToIgnore)) + 7) div 8) * 8) - 1) by 8
  try
  set p to 3.31
  set item1CB to (current application's NSDictionary's dictionaryWithObjects:{(item i of (my extensionsToIgnore) as text), true} forKeys:{"title", "state"}) # {title:(item i of (my extensionsToIgnore) as text), value:true}
  on error
  beep
  set item1CB to (current application's NSDictionary's dictionaryWithObjects:{"", false} forKeys:{"title", "state"}) #{title:"", value:false}
  end try
  try
  set p to 3.32
  set item2CB to (current application's NSDictionary's dictionaryWithObjects:{(item (i + 1) of (my extensionsToIgnore) astext), true} forKeys:{"title", "state"}) #{title:(item (i + 1) of (my extensionsToIgnore) as text), value:true}
  on error
  set item2CB to (current application's NSDictionary's dictionaryWithObjects:{"", false} forKeys:{"title", "state"}) #{title:"", value:false}
  end try
  try
  set item3CB to (current application's NSDictionary's dictionaryWithObjects:{(item (i + 2) of (my extensionsToIgnore) astext), true} forKeys:{"title", "state"}) #{title:(item (i + 2) of (my extensionsToIgnore) as text), value:true}
  on error
  set item3CB to (current application's NSDictionary's dictionaryWithObjects:{"", false} forKeys:{"title", "state"}) #{title:"", value:false}
  end try
  try
  set item4CB to (current application's NSDictionary's dictionaryWithObjects:{(item (i + 3) of (my extensionsToIgnore) astext), true} forKeys:{"title", "state"}) #{title:(item (i + 3) of (my extensionsToIgnore) as text), value:true}
  on error
  set item4CB to (current application's NSDictionary's dictionaryWithObjects:{"", false} forKeys:{"title", "state"}) #{title:"", value:false}
  end try
  try
  set item5CB to (current application's NSDictionary's dictionaryWithObjects:{(item (i + 4) of (my extensionsToIgnore) astext), true} forKeys:{"title", "state"}) #{title:(item (i + 4) of (my extensionsToIgnore) as text), value:true}
  on error
  set item5CB to (current application's NSDictionary's dictionaryWithObjects:{"", false} forKeys:{"title", "state"}) #{title:"", value:false}
  end try
  try
  set item6CB to (current application's NSDictionary's dictionaryWithObjects:{(item (i + 5) of (my extensionsToIgnore) astext), true} forKeys:{"title", "state"}) #{title:(item (i + 5) of (my extensionsToIgnore) as text), value:true}
  on error
  set item6CB to (current application's NSDictionary's dictionaryWithObjects:{"", false} forKeys:{"title", "state"}) #{title:"", value:false}
  end try
  try
  set item7CB to (current application's NSDictionary's dictionaryWithObjects:{(item (i + 6) of (my extensionsToIgnore) astext), true} forKeys:{"title", "state"}) #{title:(item (i + 6) of (my extensionsToIgnore) as text), value:true}
  on error
  set item7CB to (current application's NSDictionary's dictionaryWithObjects:{"", false} forKeys:{"title", "state"}) #{title:"", value:false}
  end try
  try
  set item8CB to (current application's NSDictionary's dictionaryWithObjects:{(item (i + 7) of (my extensionsToIgnore) astext), true} forKeys:{"title", "state"}) #{title:(item (i + 7) of (my extensionsToIgnore) as text), value:true}
  on error
  set item8CB to (current application's NSDictionary's dictionaryWithObjects:{"", false} forKeys:{"title", "state"}) #{title:"", value:false}
  end try
  set p to 3.4
  set anObj to (current application's NSMutableDictionary's dictionaryWithObjects:{item1CB, item2CB, item3CB, item4CB, item5CB, item6CB, item7CB, item8CB} forKeys:{"Extensions1CB", "Extensions2CB", "Extensions3CB", "Extensions4CB", "Extensions5CB", "Extensions6CB", "Extensions7CB", "Extensions8CB"})
  set p to 2
  my (ExtensionsArrayController's addObject:anObj) — < DOES NOTHING
  #set temp to {Extensions1:item1CB, Extensions2:item2CB, Extensions3:item3CB, Extensions4:item4CB, Extensions5:item5CB, Extensions6:item6CB, Extensions7:item7CB, Extensions8:item8CB}  
  set p to 3.5
  #set tempArray to (current application's NSArray's arrayWithArray:temp)
  set p to 3.51
  end repeat
  set p to 3.6
  set (my ExtValueDict) to tempList
  my fordEvent()
  set p to 3.7
  my SaveExtensionData()
  else
  set (my setUpExtension) to false
  end if
  set p to 4
  try
  tell ListWindow to display()
  end try
  my fordEvent()
  set p to 5
  try
  tell me to activate
  end try
  ListWindow's makeKeyAndOrderFront:me
  set p to 6
  on error errmsg number errnum
  tell application "System Events" to display dialog ("AppDelegate's displayExtensionsWindow " & " p = " & p & "  " & errmsg as text)
  end try
  end displayExtensionsWindow
 
  on SaveExtensionData()
  try
  set thePPath to POSIX path of ((my mailManagerDesktopFolderPath as text) & "Extension Data.plist") as text
  end try
  try
  set ExtValueDict to ExtensionsArrayController's arrangedObjects() as list
  on error errmsg number errnum
  say "Extension Array controller"
  set ExtValueDict to {}
  tell application "System Events" to display dialog ("SaveExtensionData " & errmsg as text) giving up after 20
  end try
  try
  say 2000
  tell application id "com.apple.systemevents"
  ExtValueDict's writeToFile:thePPath atomically:true —< ERRORS
  end tell
  on error errmsg number errnum
  tell application "System Events" to display dialog ("AppDelegate's SaveExtensionData " & errmsg as text)
  end try
  end SaveExtensionData
 
   
  on applicationShouldTerminate:sender
  -- Insert code here to do any housekeeping before your application quits
  return current application's NSTerminateNow
  end applicationShouldTerminate:
 
end script


Test

John Stewart
 

Just to see if it works for me.


Thanks for Setting Up this Forum/Group

 

I'm not sure who is responsible for all this good stuff, but I thank you!
It looks like a modern forum, which we sorely need to communicate and establish easy-to-find references to the many great code examples this community has published.

I see there are other facilities here, like a Wiki, Files, Databases, etc.  The Wiki in particular could be very useful to all of us.

Best Regards,
JMichaelTX


TEST

Takaaki Naganoya
 

This is a test mail.

--
Takaaki Naganoya
maro@piyocast.com
http://piyocast.com/as/

261 - 275 of 275