INSERT INTO sites(host) VALUES('ksuther.com') 1045: Access denied for user 'www-data'@'localhost' (using password: NO) ksuther.com Estimated Worth $43,623 - MYIP.NET Website Information
Welcome to MyIP.net!
 Set MYIP as homepage      

  
           

Web Page Information

Title:
Meta Description:
Meta Keywords:
sponsored links:
Links:
Images:
Age:
sponsored links:

Traffic and Estimation

Traffic:
Estimation:

Website Ranks

Alexa Rank:
Google Page Rank:
Sogou Rank:
Baidu Cache:

Search Engine Indexed

Search EngineIndexedLinks
 Google:
 Bing:
 Yahoo!:
 Baidu:
 Sogou:
 Youdao:
 Soso:

Server Data

Web Server:
IP address:    
Location:

Registry information

Registrant:
Email:
ICANN Registrar:
Created:
Updated:
Expires:
Status:
Name Server:
Whois Server:

Alexa Rank and trends

Traffic: Today One Week Avg. Three Mon. Avg.
Rank:
PV:
Unique IP:

More ranks in the world

Users from these countries/regions

Where people go on this site

Alexa Charts

Alexa Reach and Rank

Whois data

Who is ksuther.com at whois.enom.com





Domain Name:
KSUTHER.COM

Registry Domain ID: 305765032_DOMAIN_COM-VRSN

Registrar WHOIS Server: whois.enom.com

Registrar URL: www.enom.com

Updated Date: 2012-04-19T00:31:52.00Z

Creation Date: 2006-01-04T03:53:00.00Z

Registrar Registration Expiration Date: 2017-01-04T03:53:00.00Z

Registrar: ENOM, INC.

Registrar IANA ID: 48

Reseller: NAMECHEAP.COM

Domain Status: clientTransferProhibited https://www.icann.org/epp#clientTransferProhibited

Registry Registrant ID:

Registrant Name: NAMECHEAP.COM NAMECHEAP.COM

Registrant Organization: NAMECHEAP.COM

Registrant Street: 8939 S. SEPULVEDA BLVD. #110 - 732

Registrant City: WESTCHESTER

Registrant State/Province: CA

Registrant Postal Code: 90045

Registrant Country: US

Registrant Phone: +1.6613102107

Registrant Phone Ext:

Registrant Fax: +1.6613102107

Registrant Fax Ext:

Registrant Email: SUPPORT

Registry Admin ID:

Admin Name: KENT SUTHERLAND

Admin Organization:

Admin Street: 25 ERREGGER TERRACE

Admin City: SYRACUSE

Admin State/Province: NE

Admin Postal Code: YORK 13224

Admin Country: US

Admin Phone: +1.3154461144

Admin Phone Ext:

Admin Fax:

Admin Fax Ext:

Admin Email: KSUTHER@ITHINKSW.COM

Registry Tech ID:

Tech Name: KENT SUTHERLAND

Tech Organization:

Tech Street: 25 ERREGGER TERRACE

Tech City: SYRACUSE

Tech State/Province: NE

Tech Postal Code: YORK 13224

Tech Country: US

Tech Phone: +1.3154461144

Tech Phone Ext:

Tech Fax:

Tech Fax Ext:

Tech Email: KSUTHER@ITHINKSW.COM

Name Server: ns1.linode.com

Name Server: ns2.linode.com

Name Server: ns3.linode.com

Name Server: ns4.linode.com

DNSSEC: unSigned

Registrar Abuse Contact Email: abuse@enom.com

Registrar Abuse Contact Phone: +1.4252982646

URL of the ICANN WHOIS Data Problem Reporting System: http://wdprs.internic.net/

>>> Last update of WHOIS database: 2012-04-19T00:31:52.00Z <<<



For more information on Whois status codes, please visit https://icann.org/epp





The data in this whois database is provided to you for information

purposes only, that is, to assist you in obtaining information about or

related to a domain name registration record. We make this information

available "as is," and do not guarantee its accuracy. By submitting a

whois query, you agree that you will use this data only for lawful

purposes and that, under no circumstances will you use this data to: (1)

enable high volume, automated, electronic processes that stress or load

this whois database system providing you this information; or (2) allow,

enable, or otherwise support the transmission of mass unsolicited,

commercial advertising or solicitations via direct mail, electronic

mail, or by telephone. The compilation, repackaging, dissemination or

other use of this data is expressly prohibited without prior written

consent from us.



We reserve the right to modify these terms at any time. By submitting

this query, you agree to abide by these terms.

Version 6.3 4/3/2002

Front Page Thumbnail

sponsored links:

Front Page Loading Time

Keyword Hits (Biger,better)

Other TLDs of ksuther

TLDs Created Expires Registered
.com
.net
.org
.cn
.com.cn
.asia
.mobi

Similar Websites

More...
Alexa鏍囬

Search Engine Spider Emulation

Title:Kent Sutherland | Mac and iOS development and possibly other miscellaneous things
Description:
Keywords:
Body:
Kent Sutherland | Mac and iOS development and possibly other miscellaneous things
Kent Sutherland
Mac and iOS development and possibly other miscellaneous things
Menu
Skip to content
Home
A slimmer iOS Simulator: SimulatorBorderKiller
December 12, 2013
Back when the iPhone SDK first became available, the fake iPhone bordering the simulator gave that extra thrill reminding everyone that yes, we were in fact making software for the iPhone. That initial excitement has long worn off, but the device border is still there. My workaround has been to run the simulator at 75% scale, which also hides the device border, but that stopped working after jumping on the Retina Mac bandwagon last month. Since the iOS Simulator adopts the scale of the Mac #8217;s screen, running the simulator at anything but 100% results in a tiny window. Unfortunately this also means the useless device border is back.
Thanks to a couple of hours of digging around with class-dump, otx, and lldb, the clutter of fake iPhones and iPads is gone for good. The iOS Simulator #8217;s title bar has also gained an orientation status, as I have a tendency to forget which way is up (and who can ever remember the difference between landscape left and landscape right?).
Borderless simulator bliss is now just a SIMBL plugin away. You #8217;ll also need a SIMBL injection tool, such as EasySIMBL.
SimulatorBorderKiller on GitHub
Automating iOS App Store screenshots
February 24, 2013
This originated from a short talk about screenshot automation that I gave at the Boston CocoaHeads in January. My initial goal of the talk was to just show that it was possible to do such a thing and encourage others to consider automating their own processes, but there was some interest in a more detailed write-up. Here it is. Also, thanks to Daniel Jalkut for his blog post that stirred up some more interest.
What does this look like?
First off, what am I talking about? Here #8217;s a video of Fantastical #8217;s screenshot automation, which shows the complete process in action.
Why do I want to do this?
Because you #8217;re lazy. Why take screenshots manually when your computer can do it for you? For one, consider the math. Let #8217;s say you have 5 screenshots for the App Store, for 5 languages. Oh yeah, you also have a 3.5 inch and a 4 inch screen. Maybe an iPad too. That #8217;s 5 x 5 x 2 (or 3) screenshots to take. At 30 seconds a screenshot, that #8217;s 25 (or 37.5) minutes just to take the screenshots. Don #8217;t make any mistakes, otherwise it #8217;ll take even longer. This probably isn #8217;t a one time deal either, unless you never plan on changing your app again. Trust me, this is worth taking a couple of hours to add to your app. As you #8217;ll see, I #8217;ve even done some of the work for you.
OK, show me an example
First, grab the source from KSScreenshotManager at GitHub. Be sure you clone the WaxSim submodule, otherwise the included script won #8217;t work. For those of you who aren #8217;t familiar with submodules, the command you #8217;re looking for is git submodule update --init. If you want to include this in your own project, add KSScreenshotManager as a submodule and add KSScreenshotManager and KSScreenshotAction to your project.
Safety first
Be aware that we #8217;ll be using private API to get the job done. This doesn #8217;t matter since this code isn #8217;t going to the App Store, but take care that you don #8217;t let private API declarations or usage slip into your shipping builds. You #8217;ll notice that the example uses the macro CREATING_SCREENSHOTS to ensure that none of the screenshot code is included in normal builds.
Defining your screenshots
Digging into the sample code, KSScreenshotManager and the MyScreenshotManager subclass are what we #8217;re interested in. This is where we specify what we actually want to take screenshots of in our app. In our example we #8217;re going to take two screenshots of a table view.
Our first action scrolls the table view to the second row. Once actionBlock is called, KSScreenshotManager will take a screenshot and crop out the status bar.
Objective-C
KSScreenshotAction *synchronousAction = [KSScreenshotAction actionWithName:@"tableView1" asynchronous:NO actionBlock:^{
NSIndexPath *indexPath = [NSIndexPath indexPathForRow:2 inSection:0];
[[[self tableViewController] tableView] scrollToRowAtIndexPath:indexPath atScrollPosition:UITableViewScrollPositionTop animated:NO];
} cleanupBlock:^{
[[[self tableViewController] tableView] setContentOffset:CGPointZero];
}];
[self addScreenshotAction:synchronousAction];
123456789
KSScreenshotAction *synchronousAction = [KSScreenshotAction actionWithName:@"tableView1" asynchronous:NO actionBlock:^{ NSIndexPath *indexPath = [NSIndexPath indexPathForRow:2 inSection:0]; [[[self tableViewController] tableView] scrollToRowAtIndexPath:indexPath atScrollPosition:UITableViewScrollPositionTop animated:NO];} cleanupBlock:^{ [[[self tableViewController] tableView] setContentOffset:CGPointZero];}]; [self addScreenshotAction:synchronousAction];
The next action is similar, but this time asynchronous is YES. This allows us to perform actions that take time to complete. Once the screenshot is ready, call [self actionIsReady]. This will take the screenshot and continue to the next action. Here we #8217;re just changing the device orientation, but you might need to wait for other reasons, such as animations or network activity.
Objective-C
KSScreenshotAction *asynchronousAction = [KSScreenshotAction actionWithName:@"tableView2" asynchronous:YES actionBlock:^{
NSIndexPath *indexPath = [NSIndexPath indexPathForRow:8 inSection:0];
[[[self tableViewController] tableView] scrollToRowAtIndexPath:indexPath atScrollPosition:UITableViewScrollPositionTop animated:NO];
[[UIDevice currentDevice] setOrientation:UIInterfaceOrientationLandscapeLeft]; //programmatically switch to landscape (private API)
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0 * NSEC_PER_SEC));
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
[self actionIsReady];
});
} cleanupBlock:nil];
123456789101112
KSScreenshotAction *asynchronousAction = [KSScreenshotAction actionWithName:@"tableView2" asynchronous:YES actionBlock:^{ NSIndexPath *indexPath = [NSIndexPath indexPathForRow:8 inSection:0]; [[[self tableViewController] tableView] scrollToRowAtIndexPath:indexPath atScrollPosition:UITableViewScrollPositionTop animated:NO]; [[UIDevice currentDevice] setOrientation:UIInterfaceOrientationLandscapeLeft]; //programmatically switch to landscape (private API) dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0 * NSEC_PER_SEC)); dispatch_after(popTime, dispatch_get_main_queue(), ^(void){ [self actionIsReady]; });} cleanupBlock:nil];
Once the actions are created, we need to actually create the screenshots. We do that in -[AppDelegate application:didFinishLaunchingWithOptions:]:
Objective-C
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0 * NSEC_PER_SEC));
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
MyScreenshotManager *screenshotManager = [[MyScreenshotManager alloc] init];
[screenshotManager setTableViewController:viewController];
[screenshotManager takeScreenshots];
});
1234567
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0 * NSEC_PER_SEC));dispatch_after(popTime, dispatch_get_main_queue(), ^(void){ MyScreenshotManager *screenshotManager = [[MyScreenshotManager alloc] init]; [screenshotManager setTableViewController:viewController]; [screenshotManager takeScreenshots];});
Driving the simulator
So we have the screenshot actions set up, but we still have to manually change the project target and run the app in the simulator. Fortunately we can automate this too, thanks to WaxSim. Using make_screenshots.py we can generate screenshots for any combination of devices and languages. The version of make_screenshots.py included with the sample code runs for the 3.5 inch and 4 inch iPhone in English and German, for a total of 4 runs. You #8217;ll need to change the variables in make_screenshots.py to make it work with your own project.
After running python make_screenshots.py ~/Desktop/screenshots in the Terminal, we have a fresh set of screenshots:
That #8217;s all there is to it! Any time you need screenshots, just run that script again and wait about a minute. For bonus points you can hook this up to your continuous integration server so you always have up-to-date screenshots.
Getting fancier
What you #8217;ve just seen is enough to automate screenshots in your own app. However, it can be tricky to get your app just into the right state to make a screenshot. For example, Fantastical #8217;s screenshots had to have the exact same set of events and be running on a certain date. This took a bit more than just displaying view controllers and adjusting views. Here #8217;s some additional details on what I did to get Fantastical #8217;s screenshot process running smoothly. These won #8217;t apply to every app directly, but hopefully it #8217;ll provide some ideas.
Faking the date and time
The pesky thing about time is it won #8217;t stay still. Not so helpful for screenshots of time-sensitive material such as calendars. Fortunately it #8217;s easy enough to fake the date throughout an application without actually changing any code. Method swizzling to the rescue!
Objective-C
#import lt;objc/runtime.h gt;
@implementation NSDate (ScreenshotSwizzle)
+ (void)load
{
SEL originalSelector = @selector(date);
SEL newSelector = @selector(screenshot_date);
Method origMethod = class_getClassMethod(self, originalSelector);
Method newMethod = class_getClassMethod(self, newSelector);
method_exchangeImplementations(origMethod, newMethod);
}
+ (id)screenshot_date
{
//Today is November 14, 2012
return [self dateWithTimeIntervalSince1970:1352894400];
}
@end
123456789101112131415161718192021
#import lt;objc/runtime.h gt; @implementation NSDate (ScreenshotSwizzle) + (void)load{ SEL originalSelector = @selector(date); SEL newSelector = @selector(screenshot_date); Method origMethod = class_getClassMethod(self, originalSelector); Method newMethod = class_getClassMethod(self, newSelector); method_exchangeImplementations(origMethod, newMethod);} + (id)screenshot_date{ //Today is November 14, 2012 return [self dateWithTimeIntervalSince1970:1352894400];} @end
Now the entire app thinks it is November 14 all the time. If you find yourself thinking #8220;I wish I could change what this method does everywhere in the app, #8221; think swizzling.
Abusing private API
There are all kinds of extra goodies available since this code isn #8217;t going to the App Store. In the example above, I used the private -[UIDevice setOrientation:] to force the simulator into a difference orientation. In Fantastical, private API ended up being useful for setting up consistent calendar data. Rather than creating the events by hand using EventKit #8217;s public API, class-dump revealed that EKEventStore had methods to load ics files already lurking in it. One private method later, I had events getting loaded from an ics file:
Objective-C
@interface EKEventStore ()
- (id)importICSData:(id)arg1 intoCalendar:(id)arg2 options:(unsigned int)arg3;
@end
NSData *icsData = [NSData dataWithContentsOfURL:[[NSBundle mainBundle] URLForResource:@"Home" withExtension:@"ics"]];
NSArray *events = [[self eventStore] importICSData:icsData intoCalendar:calendar options:0];
123456
@interface EKEventStore ()- (id)importICSData:(id)arg1 intoCalendar:(id)arg2 options:(unsigned int)arg3;@end NSData *icsData = [NSData dataWithContentsOfURL:[[NSBundle mainBundle] URLForResource:@"Home" withExtension:@"ics"]];NSArray *events = [[self eventStore] importICSData:icsData intoCalendar:calendar options:0];
This made it possible to create the events using a more sensible application and then feed the ics data straight into EventKit. Little things like this give even more time savings that you might not think of if you #8217;re taking screenshots by hand. Again, take care to ensure you don #8217;t let any private API leak into your App Store code.
Loading network data
Rapidly-changing network data can be problematic when you #8217;re trying to make that perfect set of screenshots. While this wasn #8217;t necessarily in Fantastical, using a mock object such as Mocktail could make life a lot easier. (Disclaimer: I #8217;ve never used Mocktail myself, but it looks handy.)
Other options
Prefer using the UI Automation instrument? UI Screen Shooter may be of interest to you. I #8217;m partial to my approach since I needed the additional control of setting NSUserDefaults based on locale, swizzling NSDate and loading specific calendar data on each launch. However, UI Automation may be more appropriate in some situations.
Wrapping up
Get the code for KSScreenshotManager at GitHub. As you #8217;ve seen, you won #8217;t be able to drop this code in and magically have automated screenshots in your own app. You still need to get your app into the right state to take the screenshots. The good news is that you only have to do it once. Happy automating!
Post navigation
larr; Older posts
Contact Me
ksuther on Twitter
ksuther on GitHub
Past Projects
Looking for old versions of Chax or Warp? They're available here.
Chax
Warp
Glypha
Search for:

Updated Time

Updating   
Friend links: ProxyFire    More...
Site Map 1 2 3 4 5 6 7 8 9 10 20 30 40 50 60 70 80 90 100 110 120 130 140 150 160 170 180 190 200 250 300 350 400 450 500 550 600 610 620 630 640 650 660 670 680 690 700 710 720 730 740 750
TOS | Contact us
© 2009 MyIP.cn Dev by MYIP Elapsed:130.268ms