Saturngod

What's on my mind

Swift Is Fast Now

Today, I update the Xcode 6 Beta 3 and retest the bubble sort that I wrote yesterday. In Beta 3, bubble sort is done in 11 miliseconds in Debug Mode. Before it done in 14 miliseconds. After that I changed to the Release Mode and run it. It done in the 0.15 miliseconds. Yes, this time swift is faster than Objective-C now. In objective-C , it done in 0.28 miliseconds.

Swift Programming Language book has been updated and you need to update it.

Changes in Xcode 6 beta 3 for Swift are

  • Array in Swift has been completely redesigned to have full value semantics like Dictionary and String have always had in Swift. This resolves various mutability problems – now a ‘let’ array is completely immutable, and a ‘var’ array is completely mutable – composes properly with Dictionary and String, and solves other deeper problems. Value semantics may be surprising if you are used to NSArray or C arrays: a copy of the array now produces a full and independent copy of all of the elements using an efficient lazy copy implementation. This is a major change for Array, and there are still some performance issues to be addressed. Please see the Swift Programming Language for more information. (17192555)!
  • The Array and Dictionary “sugar” syntax has been redesigned: You now declare arrays as [Int] instead of as Int[], as shorthand for Array. The old syntax made sense when arrays had semantics closer to C arrays, but would be misleading with the new value semantics approach. Along with this, Dictionary syntax has improved so that [Key:Value] is treated as sugar for Dictionary. Both of these are now consistent with each other and with the literal syntax used to build an array or dictionary. Please see the Swift Programming Language for more information.!
  • NSDictionary* is now imported from Objective-C APIs as [NSObject : AnyObject]. (16870626)!
  • The half-closed range operator has been changed from .. to ..< to reduce confusion and ambiguity. Now the two range operators are ..< and … for half-closed and closed ranges, respectively (17203527).!
  • nil is now a literal in the language, not a global constant of _Nil type. This change resolved a number of problems with nil; e.g. nil in a collection, nil converting to Any, etc. Types can now indicate that they are nil compatible by conforming to the NilLiteralConvertible protocol. (16951729)!
  • APIs imported from C no longer use type aliases like CInt or CFloat, which obfuscated the underlying type. They are now imported as Int32 and Float, etc.!
  • APIs imported from C that use C pointers are now imported with a much simpler API type structure which is more predictable, preserves const mutability in more cases, and preserves __autoreleased pointer information. Now you will see UnsafePointer, ConstUnsafePointer, AutoreleasingUnsafePointer, etc. Function pointers are also imported now, and can be referenced and passed around. However, you cannot call a C function pointer or convert a closure to C function pointer type.!

You can read more at here

Is Swift Really Fast ?

Apple claimed that swift is faster than the Objective-C. However, I feel is slower than Objective-C. When I writing the custom keyboard with Swift , IDE response too slow and Sourcekitservice use over 100% CPU usages. It may be the IDE bug and X-Code 6 still beta 2.

So, I tried to sort the array with bubblesort with Objective-C and Swift like following.

As the result , Objective-C done is 0.297070 miliseconds and Swift Done in 14 miliseconds. It’s so much different. So, I change the swift compiler method to Fastest and It done ine 0.5 miliseconds. Not so much different with Objective-C but still slow.

I hope, it’s a bug and apple will fix in next version of xcode 6 release. I love the Swift because it’s safer and easier than Objective-C. However, I don’t want to use if it’s slower than Obective-C at run time.

Group By Date in mongodb

I am using mongodb for tracking my website. I am saving date and time with ISODate , "time" : ISODate("2014-05-18T13:23:04.227Z") .

So, I wrote like that.

db.analystic.aggregate(
{
    "$project": {
        "y": {
            "$year": "$time"
        },
        "m": {
            "$month": "$time"
        },
        "d": {
            "$dayOfMonth": "$time"
        }
    }
},
{
    "$group": {
        "_id": {
            "year": "$y",
            "month": "$m",
            "day": "$d"
        },
        count: {
            "$sum": 1
        }
    }
},
{
    $sort: {
        "_id.year": 1,
        "_id.month": 1,
        "_id.day": 1
    }
})

First , need to separate the year , month and date. After that , make a group and then sort it.

EMV TLV Decoder For Objective-c

I couldn’t find the EMV TLV decoder for iOS. However, I found a PHP code on github. So, I port to iOS version. However, I only need decoder. So, ios code include only decoder.

#import "SGTLVDecode.h"

//some of your code
//usage it

NSDictionary *value = [SGTLVDecode decodeWithString:@"Your TLV String"];

NSLog(@"TLV %@",value);

Fixed Disqus For WinterSmit

I am using disqus for my blog. However, it has a problem. If the URL is include query string , comments can’t show and it’s showing new one. I found a solution JavaScript configuration variables of disqus.

We need to put correct URL at disqus_url variable. So, I put

var disqus_url = document.location.origin + document.location.pathname;

For jade template , it will look like

#disqus_thread
  script(type='text/javascript')
      |/* * * CONFIGURATION VARIABLES: EDIT BEFORE PASTING INTO YOUR WEBPAGE * * */
      |var disqus_shortname = 'myblogname'; // required: replace example with your forum shortname
      |var disqus_url = document.location.origin + document.location.pathname;
      |/* * * DON'T EDIT BELOW THIS LINE * * */
      |(function() {
      |var dsq = document.createElement('script'); dsq.type = 'text/javascript'; dsq.async = true;
      |dsq.src = '//' + disqus_shortname + '.disqus.com/embed.js';
      |(document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(dsq);
      |})();
    noscript
      | Please enable JavaScript to view the
      a(href='http://disqus.com/?ref_noscript') comments powered by Disqus.
    a.dsq-brlink(href='http://disqus.com')
      | comments powered by
      span.logo-disqus Disqus

After that , there is no more problem about query string URL problem.

Xcode 5 Build With Post Action

I build the library(SDK) file for iOS. I have a one problem. That is to support both simulator and device. After building both simulator and device , I need to do

  1. copy the files from Debug-iphoneos folder to release folder
  2. change mylib.a to mylibDevice.a
  3. copy mylib.a from Debug-iphonesimulator folder to release folder
  4. change mylibSimulator.a
  5. After that merge with lipo -create mylibDevice.a mylibSimulator.a -output mylib.a

I always need to do when release the library.

It’s really troublesome for doing many time.

So, I decided to create the script in post-action.

Go to the Product > Scheme > Edit Scheme.

And then Duplicate Scheme because we will only do post action when it ready to release. Give a name , release build.

Chose the release build scheme and Build > Post Action.

post action

Click the + icon.

plus icon

Need to choose the target build in Provide build setting from .

I create a script like that

rm -r ~/Desktop/mylib
mkdir ~/Desktop/mylib
mkdir ~/Desktop/mylib/Device+Simulator
mkdir ~/Desktop/mylib/Device


cd ${BUILT_PRODUCTS_DIR}
cd ..
cd Debug-iphoneos
cp mylib.a ~/Desktop/eb/Device+Simulator/mylibDevice.a
cp -r mylib.bundle ~/Desktop/eb/Device+Simulator/mylib.bundle
cp -r usr ~/Desktop/eb/Device+Simulator/usr

cp mylib.a ~/Desktop/eb/Device/mylib.a
cp -r mylib.bundle ~/Desktop/eb/Device/mylib.bundle
cp -r usr ~/Desktop/eb/Device/usr

cd ..
cd Debug-iphonesimulator
cp mylib.a ~/Desktop/eb/Device+Simulator/mylibSimulator.a

cd ~/Desktop/mylib/Device+Simulator
lipo -create mylibDevice.a mylibSimulator.a -output mylib.a
rm mylibSimulator.a
rm mylibDevice.a

After ready to publish , I built the app that use mylib static library project for both device and simulator.

And then choose the release build and build again.

After that I got mylib static library on my desktop. Nothing to do anymore and ready to use.

Wordpress To Wintersmith

After moving to the wintersmith from wordpress, I have two problem.

  1. need to redirect old url to new url
  2. re-import old comments to new url
  3. re-import old images
[...]

Wintersmith

Today, I moved to the wintersmith from the wordpress. Wordpress is amazing blog platform. However, I want to try a static generated blog instead of dyanmic. Actually there is no reason for changing to static page. After testing wintersmith , it is really fast. It is easy to use.

Pros : support markdown. Static pages. Really fast. Can use with github pages.

Cons : no full text search and use with google custom search. Need to use jade for creating template. Only few templates. You need computer to write blog.

I prefer wintersmith than jekyll because of node.js. I can customize if it’s require to change.

[...]

Haroopad Markdwon Editor

I used lightpaper , Mouapp , textastic and atom for writing markdown. However, I can’t satisfy with this editor. Lightpaper and Mou are not support GitHub Flavored Markdown. So, syntax highlight alwasy problem. Can’t export syntax highlight with pre and code with class.When I export , it should be like that

<pre><code class='objc'></code></pre>

However, it didn’t and I need to change manually.

Mou is too slow when write a lot of text. Lightpaper is really light weight and only problem with Github Flavoured Markdown and export. I don’t want to export text. I just want top copy HTML from markdown after writing.

Haroopad is exactly what I want but it still not support unicode character. Same like other web editor, cursor position wrong when I use Myanmar Unicode.

However, it’s light weight and support theme. It can export HTML to clipboard. So, I can paste it in my blog. The other best thing is , it support GitHub Flavored Markdown. I can export the syntax highlight text , table , etc.

It also support cross platform (mac,windows and linux) and it’s opensource.

Add new fonts in iOS 7

Install new font in iOS 7

iOS 7 allow to add new font. However ,font fallback can’t work in app at iOS 7.1. To install font , you need to create the mobileconfig file.

[...]