-
The Top 5 Places To Find Good Software Developers/Contractors
One thing I am often asked is “Where can I find good developers/contractors/subcontractors?” While I have found talent many different ways, I wanted to share my top 5 with you.
This post should be useful to you if you have a project and are looking to find a developer OR are a developer looking to subcontract some of your work. I am sharing these based solely on my experiences with them and hope you find value in this list.
1. Local Meetups
Local meet ups are the absolute best place in my opinion to find developers. Almost every city in the nation has some sort of group meeting on a regular bases for a given focus of development. You should have no problems finding a rails meetup group, iOS, Android, etc…
I would suggest finding out about such meetups in your area by Googling phrases such as “[your area] iOS meetup (sub iOS for rails, python, etc…). I regularly attend a “Cocoa Heads” group full of incredibly smart and capable mobile developers all willing to work on projects.
These types of groups are always excited to have clients come in and pitch their ideas. One piece of advice though, don’t go in to these groups and start with “I have a great idea and I will give you a percentage of the company in exchange for development”. They will stop listening immediately.
2. Popular Developers/Mailing Lists
This one is going to require a bit of work and research on your part, but I will get you started. Around the internet, there are a few of what I call “celebrity developers”. These are generally guys who have made a name for themselves and who are established as experts in their space.
While many of them are not taking on contract work themselves, they may or may not have a mailing list of interested contractors. One such person that does exactly this is Ray Wenderlich and I happen to receive emails on his contractor list.
Even if these developers don’t have lists, they generally have plenty of connections to point you in the right direction. Like I said, this method isn’t easy, but it can definitely have one of the biggest payoffs in terms of quality developers.
3. Specialize Project Sites
As of late, quite a few interesting sites have been popping up that have solved a fundamental issue when it comes to pairing developers with projects. The problems are 1. it’s hard to find good developers and 2. it’s hard to find clients with realistic cost expectations. That’s why ODesk exists 😉
The first of these sites that I have found is OOOMF. OOOMF is relatively new and you must be reviewed and accepted by their team in order to be a part of it. It’s basically a private network for pairing developers with projects and it supports all different project types (mobile, web, design, etc…).
Project owners can put their project up with a relative budget and developers can “apply”. The process then moves forward with communication between the client and the developers until a price and scope have been reached.
There is an additional overhead of 15% for using this service, but I think it’s well worth it.
Another one of these sites that is more mobile centric ishttp://apphappening.com. This site is very new and I have only just begun to use it. I should have a better review of them shortly.
4. Twitter and App.net
Twitter and app.net are definitely the preferred social network of serious developers. I would steer clear of Facebook and Linked in as this is generally where the recruiters hang out. Your message will most likely get dismissed as spam.
I’d suggest searching Twitter/App.net for the keywords of your project (iOS developer, rails, etc…) and find the folks with a ton of follows and a very small following to follower ratio. You will know them right away. Also, most of their blogs come up first in Google for many related keywords.
5. Developer Conferences
This one might cost you a bit of money, but is definitely well worth it. There are conferences for every focus of software development and they occur all throughout the year. These conferences generally have a HUGE percentage of professional developers who are just as eager to work on a project as you are to have them.
One of my favorite iOS conferences is 360iDev. It’s very indie-centric and offers an incredible community of iOS developers of all abilities. If you are looking to get a mobile project done, I strongly urge you to attend. While I can’t speak for conferences in other areas(web, etc…), I would really love some suggestions in the comments of this post if you are up for it!
6. Bonus – Right Here
Shameless plug time. If you are looking for professional mobile app (iOS or Android), I have a team of developers and am always looking to work on new and exciting projects. If you want to hear more about it head over to my Hire Us page or shoot me an email brandon @ pixegon [dot] com.
Conclusion
Whether you are a person/company looking to hire developers or a developer looking to hire contractors, I hope you have found this post useful. Your feedback in the comments is greatly appreciated. Best of luck with your search!
-
Lua Scripting The UI For Pocket MUD Pro
I have just updated my MUD client [Pocket MUD Pro] to be a universal library. It was surprisingly easy to add the iPad support as most of the application was comprised of UITableViews.
The main “MUD” view was the most challenging part as it contains a couple UIWebViews, UIButons, and a UITextField. However, I chose to do something I feel is pretty cool.
Scripting The UI With Lua
If I haven’t said it enough, I love lua. Especially in the context of scripting within other applications. Pocket MUD Pro already has complete lua support in triggers in aliases, so I figured I might as well apply that same logic to the UI.
Pocket MUD Pro has 3 core sections for the UI not counting the text input field. The main view (UIWebview), the prompt view (UIWebview), and the button bar (custom UIView).
One of the core challenges I faced on the iPhone, was resizing/reorienting all of these views on orientation change as well as when the keyboard was visible and when it wasn’t. To be honest, I spent most of my cycles getting this part right. On the iPad, I decided to things a little differently which improved the speed of my development overall and paved the way for future updates that will allow user-scripted UIs.
The UI Script
I want to start by showing you the lua code that is used to script the UI by default.
–MUD mudFrame = Frame:new("mud_frame") mudFrame.type = FrameTypeMUD mudFrame.portraitFrame = {0,0,768,931} mudFrame.portraitFrameKeyboard = {0,0,768,667} mudFrame.landscapeFrame = {0,0,1024,675} mudFrame.landscapeFrameKeyboard = {0,0,1024,323} createFrame(mudFrame)
What’s happening here is, I have created a Frame class that has some properties (type, name, etc…) and injected it into the global lua space for use inside of the UIScripts. Then when the interface gets drawn, I reference the UI script for each of the MUD servers and use it to render the interface.
One interesting thing here is, I set the frames for each of the possible layout scenarios. Portrait, Landscape, with and without the keyboard. That way, when the keyboard hides/dismisses or the user rotates the device, I just reference the this script again and re-render the frame accordingly. This could have been achieved with auto-resizing masks however, it gets much more complex and things get tricky when you want to have a dynamic number of windows.
I follow this exact pattern for the button frames and the prompt frames. As you might have guessed, in a future release, I will open this script area up to MUDders and give the user the ability to script the interface however they would like. Some examples might be:
- Dedicated map window
- Dedicated chat window
- Customized movement buttons
- Customized backgrounds/borders/themes
- Custom health/status/mana
Given this powerful UI Scripting style, a user will be able to create complex interfaces such as the one below from inside the app:
I still have a ways to go with exposing various functionalities via my custom lua bridge. But things seem to be moving along quite smoothly.
If you want to learn how I was able to bridge lua into my application, consider checking out my talk on lua scripting at 360iDev 2012 later this year!
Happy Coding!
-
Beginning Jailbroken iOS Development – Your First Tweak
This is the 3rd installment of my jailbroken iOS development series. If you haven’t already, make sure you read the following tutorials to get up to speed.
- Beginning Jailbroken iOS Development – Getting The Tools
- Beginning Jailbroken iOS Development – Building And Deployment
Today I’m going to show you how to patch any internal Apple method that you want. In this demo, we are going to hook into the init method of Springboard and show a UIAlertView upon starting your phone up. It’s not the coolest of applications, but the design pattern and concepts used can be applied to patching any other internal method of any class.
Getting Set Up
In order to create a tweak, you must interface with Saurik’s libsubstrate.dylib dynamic library. This might come packaged with theos, but if not, you need to download a fresh copy. One can be found on this very spammy site. Download libsubstrate.dylib
Once you have downloaded it, copy it to the folder /opt/theos/lib. This is the folder where you will copy any other dynamic libraries that you might need to use in your application.
The iOS Headers
Most likely, theos came with the iOS headers that you need. If not, you need to obtain them by doing a header dump on the device OR Googling around for them. I suggest the latter as someone else has surely done the work for you. Once you have these headers, you need to put them in the folder /opt/theos/include. For this example you should have a folder in there called Springboard containing all of the Springboard headers.
Creating The Project
The process for creating the project is simple. I’m going to assume that you already have all of your environment variables in place that we discussed in the last tutorial. If not, you will get errors.
Open the console, cd into the directory where you want to create your application and type the following command to create a new Tweak application.
<code class=’bash’>$THEOS/bin/nic.pl</code>
Now, when prompted select the number 5 for a tweak. Next, you will enter all of the information about your project. The resulting output should look like this:
<code class=’bash’>NIC 1.0 - New Instance Creator —————————— [1.] iphone/application [2.] iphone/library [3.] iphone/preference_bundle [4.] iphone/tool [5.] iphone/tweak Choose a Template (required): 5 Project Name (required): WelcomeWagon Package Name [com.yourcompany.welcomewagon]: Author/Maintainer Name [Brandon Trebitowski]: MobileSubstrate Bundle filter [com.apple.springboard]: Instantiating iphone/tweak in welcomewagon/… Done.</code>
The Tweaks File
Once your project has been created, you can open in up in your favorite editor. I prefer TextMate. Theos creates a file for you called Tweak.xm. This is a special file that will run through theos’s preprocessor in order to hook into the classes and methods that you specify. So, rather than us having to write tons of boilerplate/crazy hook code, Theos does that all for us with a nice interface.
By default, EVERYTHING in that file is commented out. It took me longer than I care to admit to figure that out when I created my first Jailbroken iOS app.
The Preprocessor commands
There are a few commands that you need to know in order to hook into a class:
%hook and %end
<code class=’objc’>%hook Springboard // overwrite methods here %end</code>
The first command is called %hook followed by the name of the class you are hooking in to. You choose the methods to overwrite within the context of %hook className and %end. In the above code, we are saying that we want to hook into some methods in the SpringBoard class.
%orig
When inside a method, the %orig command will call the original method. You can even pass arguments to the command like this %orig(arg1,arg2). One thing to note is, if you don’t call %orig, the original method will never be called. So, if you hook SpringBoard’s init command and fail to call %orig, SpringBoard will never start and your phone will be unusable until you delete your app via ssh.
Hooking Into Springboard
Open up Tweak.xm and add the following code. Don’t worry, I will explain it afterwards.
<code class=’objc’>#import <SpringBoard/SpringBoard.h> %hook SpringBoard -(void)applicationDidFinishLaunching:(id)application { %orig;
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@“Welcome” message:@“Welcome to your iPhone Brandon!” delegate:nil cancelButtonTitle:@“Thanks” otherButtonTitles:nil]; [alert show]; [alert release];
} %end</code>
OK, so what’s going on here. First, we import the Springboard.h header. This will allow us access to springboard. Next, we tell the preprocessor to hook into the Springboard class.
The method that we are overriding here is the applicationDidFinishLaunching: method. This will of course fire right when SpringBoard starts up. Notice that we make the %orig call. If we omit this, our phone would never boot up properly as SpringBoard needs it’s initialization method.
Finally, we just throw up a UIAlertView. Again, not too exciting, but you get the point.
Adding Additional Frameworks
If you were to type build to build this project at this point you would see an error like this:
<code class=’bash’>Tweak.xm: In function ‘objc_object* $_ungrouped$SpringBoard$init(SpringBoard*, objc_selector*)’: Tweak.xm:6: error: declaration of ‘objc_object* self’ shadows a parameter</code>
This is because we depend on the UIKit framework to show alerts. In order to tell theos that we want to link in UIKit, we must create an addition to the Makefile. Add the following line to your Makefile.
<code class=’bash’>WelcomeWagon_FRAMEWORKS = UIKit</code>
This will ensure that UIKit gets linked in.
Building, Packaging, And Installing
In the terminal, cd into your project’s directory. At this point, you can type make to simply build your project. Theos has provided a nice way to automatically install your library on your device. In order for it to work you must have the THEOS_DEVICE_IP environment variable set to your iPhone/iPod’s IP address. This is explained in the previous tutorial.
In the terminal type:
<code class=’bash’>make install</code>
This will build your tweak and install it on your device. When prompted to enter your password, the default is “alpine”. Also, make sure that SSH is installed on your device.
After installation, your device will respring and you will be greeted with your custom message like this:
Conclusion
You should now have a basic understand of how to patch any method inside of iOS. With this knowledge, you can customize ANYTHING that you don’t like about the device. If you have any questions or comments, feel free to leave them in the comments section of this post.
You can download the source code for this tutorial here.
Happy Jailbreaking!
This post is part of iDevBlogADay, a group of indie iOS development blogs featuring two posts per day. You can keep up with iDevBlogADay through the web site, RSS feed, or Twitter.
-
AppBlogger: A Tool For iOS App Developers And Bloggers
Imagine that you have just found the coolest app in the world and just can’t wait to tell all of your followers about it. So, you head to the admin panel of your blogging engine (hopefully WordPress) and begin to write your review. Now, you want to insert some screenshots, icons, descriptions, app store links, etc… So, what do you do? You head on over to Bing and type in google.com. Next, you search your app name and hopefully find the iTunes URL so that you can slowly grab some information about the app. #Fail
Dum duh dum duh (trumpet noises)!
Enter AppBlogger. AppBlogger is a little tool that I have been working on that uses “Instant Search” technology (jquery fanciness) to allow you to instantly search the app store and quickly get the information you need.
How Does It Work? (you say)
As you start typing, AppBlogger makes an asynchronous request to the iTunes web service and pulls a list of applications that match your search terms. This list is presented as a bunch of icons. You will then click on one of these icons to pull of the details page of that application.
The details page (see above screenshot) then contains everything you need to write a stellar blog post about that application. It provides text fields (for easy copy and paste) with icon URLs, download URL, and screenshot URLs.
I have some plans to integrate this in the near future with my Link Share tool to auto generate shortened URLs that contain your affiliate code (so you can make $). If you have any other suggestions for it, I would love to hear them.
I know many of you are heartbroken and were expecting the next iteration of my Twitter Client For Mac series. I want you to know, you are not forgotten and I will continue the series next Thursday. So Stay Tuned!
Check out AppBlogger!
This post is part of iDevBlogADay, a group of indie iOS development blogs featuring two posts per day. You can keep up with iDevBlogADay through the web site, RSS feed, or Twitter.
-
Image Manipulation: Retrieving And Updating Pixel Values For A UIImage
Grayscale Jobs
With the recent success of cool photo manipulation apps such as Camera+ and Instagram, it got me wondering. How do these photo apps modify the pixel data of the image.
After doing a bit of research on the subject, I found countless posts on Stack Overflow and the Developer forums about various methods to get and set the pixel values of a UIImage. Most of them unanswered or partially answered. I tested out many solutions and banged my head on my computer into the whee hours of the morning with no success. Every solution I tried seemed to completely destroy the image.
It wasn’t until this morning, I had an “aha” moment, changed one line of code and was able to produce a grayscale version of a UIImage.
Having the ability to get and set pixel values of a UIImage is super important if you want to create a photo related app that has “Filters”. Once you know the basics, you can apply your ninja math skillz to implement cool filter algorithms on the pixels. Below, I will show you onc such algorithm for converting an image to grayscale (it’s not that clever).
I should note, that a good majority of my code comes from Olie’s solution on this Stack Overflow post. His example simply returns and array of UIColor objects for a given image. Mine will modify those colors and write them back to a UIImage.
Converting A UIImage Into A Pixel Array
Here is the first part of our grayscale method. It is creating a char array from a global UIImage property named workingImage.
<code class=’objc’>- (IBAction) grayscale:(id) sender { CGContextRef ctx; CGImageRef imageRef = [self.workingImage CGImage]; NSUInteger width = CGImageGetWidth(imageRef); NSUInteger height = CGImageGetHeight(imageRef); CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); unsigned char *rawData = malloc(height * width * 4); NSUInteger bytesPerPixel = 4; NSUInteger bytesPerRow = bytesPerPixel * width; NSUInteger bitsPerComponent = 8; CGContextRef context = CGBitmapContextCreate(rawData, width, height, bitsPerComponent, bytesPerRow, colorSpace, kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big); CGColorSpaceRelease(colorSpace);
CGContextDrawImage(context, CGRectMake(0, 0, width, height), imageRef); CGContextRelease(context); . . .</code>
This is a lot of Core Graphics fanciness that isn’t super important to understand. It’s just getting the RGBA values from the image and writing them into the rawData char array. There are 4 bytes per pixel (red, green, blue, alpha), so this array contains 4 * height * width elements.
Modifying The Pixels of a UIImage
Here is where the magic happens. You can replace this code with the logic necessary to apply the filter you are making. Another clever way to approach this would be to pass this code in as a block into the method (I’ll leave that as an exercise for the reader :)).
<code class=’objc’>. . . int byteIndex = 0; for (int ii = 0 ; ii < width * height ; ++ii) { int outputColor = (rawData[byteIndex] + rawData[byteIndex+1] + rawData[byteIndex+2]) / 3;
rawData[byteIndex] = (char) (outputColor); rawData[byteIndex+1] = (char) (outputColor); rawData[byteIndex+2] = (char) (outputColor);
byteIndex += 4;
}
. . .</code>
The first part is pretty straight forward, we have a for loop that goes from 0 to width * height. We index into the rawData array using a counter that we increment by 4 each time (remember 4 bytes per pixel). As you can imagine, the first pixel (rawData[byteIndex]) represents the red pixel, then green for +1, blue for +2, and finally alpha for +3. Note that the alpha byte is last because kCGImageAlphaPremultipliedLast flag above.
In order to do grayscale, we simple set all of the color values to the average color value. So, for example the color [218,232,244] (which is the light blue color of the WordPress editor’s toolbar) would be converted to [231,231,231] which is a fairly light gray color.
The most important step that everyone in the forums seemed to miss was casting the new value to a char. Remember we are using a char array, setting ints as values will generally screw up your image. (This was my “aha” moment that I mentioned above)
Writing The Pixels Back To a UIImage
The final step is to write the pixel data back to a UIImage. Again, I borrowed some of this code from somewhere else and unfortunately lost the link. If I find it, I will update the post.
<code class=’objc’>. . . ctx = CGBitmapContextCreate(rawData, CGImageGetWidth( imageRef ), CGImageGetHeight( imageRef ), 8, CGImageGetBytesPerRow( imageRef ), CGImageGetColorSpace( imageRef ), kCGImageAlphaPremultipliedLast );
imageRef = CGBitmapContextCreateImage (ctx); UIImage* rawImage = [UIImage imageWithCGImage:imageRef];
CGContextRelease(ctx);self.workingImage = rawImage;
free(rawData);
}</code>
All we are doing here is creating a new Bitmap Context, writing it to our CGImageRef and constructing a new UIImage from that CGImageRef. Finally, we just update our workingImage with the modified one. Fancy, I know…
Now, much of this code is to work with my example (download below), but it could easily be tweaked to fit within your super awesome photo app. If you have any questions or comments PLEASE leave them here or send them to me on Twitter (but probably leave them here 😉 ).
Download The Sample Source Project
- Note on the sample code: Before you give me crap about doing this in the main thread, I know. Don’t do these operation on the main thread. The example is meant to be quick and dirty and by no means is ready for production. Enjoy!
This post is part of iDevBlogADay, a group of indie iOS development blogs featuring two posts per day. You can keep up with iDevBlogADay through the web site, RSS feed, or Twitter.
-
Promoting Your Other Apps Within Your Apps
First off, Happy Thanksgiving to my American readers. And a happy Thursday to everyone else. I’m sitting here on Thursday morning drinking coffee and eating Sticky Buns (kind of like gooey doughnuts). It’s been a hectic week of family and travel, so please forgive me if this is not the most verbose post.
Showing your other applications within each of your applications (wow, the word application is starting to lose meaning) can have a tremendous impact on your sales. It’s a great way to promote your other apps for free and will give them much more exposure across a wider audience. Moving all of the promotion logic out to the web allows you to dynamically add and remove apps from the view without updating your apps in the store.
[Insert Cool Graph Backing This Statement Up Here] //I’m not that cool yet
We have seen this in many popular apps. Here is a screenshot from an iDevBlogADay veteran Owen Goss promoting his other applications from inside of LandFormer.
We are going to learn how to make something similar and I will provide you with a web template as well as the view controller to load it.
Download The Template
So, I’m sure there are a million more “elegant” ways to display your apps, but I went for super simple. So, 1337 web dev idevblogadayers, please go easy on me in the comments. Download the code below and look in the Web folder.
Here is a screenshot of what the template will look like:
It will also work in portrait mode.
Upload The Template Files To Your Web Server And Replace My Sample Data
If you have your own website (which you probably should 😉 ), upload the template files to a subdirectory. If not, or you don’t want to waste bandwidth on it, you can always host the files on Dropbox.
Next, upload your icons (the template auto rounds the corners so you can just use the one’s bundled with your app) and replace my sample images with yours.
Finally, replace the URL’s with the URLs to your applications. You can also add/remove table cells to match the number of applications you are promoting.
Add The Promotion Code To Your iPhone App
Look in the iPhone folder from the unzipped file you downloaded above and copy the following 3 files into your project:
- PromotionViewController.m
- PromotionViewController.h
- PromotionViewController.xib
Check the box to copy them into your project folder when prompted.
We will now take a look at how to display the promotion view when a button is clicked.
<code class=’objc’>- (IBAction) moreAppsTouched:(id) sender { PromotionViewController *controller = [[PromotionViewController alloc] initWithNibName:@"PromotionViewController" bundle:[NSBundle mainBundle]]; controller.promotionAddress = @"http://brandontreb.com/apps/idevblogaday/promotion.html"; [self presentModalViewController:controller animated:YES]; [controller release]; }</code>
Make sure you set controller.promotionAddress to the web address of your promotion.html file.
And there you have it! When the user tapps on a button it will display our promotion view modally and will load up your promo page. I have provided a sample application that pulls up the promotion view when a button has been clicked.
If you have any questions or comments, feel free to leave them in the comments.
Happy Coding!
—-
This post is part of iDevBlogADay, a group of indie iOS development blogs featuring two posts per day. You can keep up with iDevBlogADay through the web site, RSS feed, or Twitter.
subscribe via RSS