Rupert  Beatty

Rupert Beatty

1668142440

Sugar: Something Sweet That Goes Great with Your Cocoa

Sugar

Sugar is a sweetener for your Cocoa implementations.

iOS

Application

let appName = Application.name             // CFBundleDisplayName : String
let appVersion = Application.version       // CFBundleShortVersionString : String
let appExecutable = Application.executable // CFBundleExecutable : String
let appBundle = Application.bundle         // CFBundleIdentifier : String
let appSchemes = Application.schemes       // CFBundleURLSchemes : [String]
let mainAppScheme = Application.mainScheme // CFBundleURLSchemes.first : String?

Gain easy access to main bundle information.

Screen

let pixelSize = Screen.pixelSize // CGSize(width: screenWidth * scale, height: screenHeight * scale)

Get the actual pixel information of the device screen.

Simulator

if !Simulator.isRunning {
  // add device specific operations here
}

To easily exclude operations from when you as a developer runs the application in the simulator, not subscribing to push notification or running analytics operations etc.

Keyboard Observer

Observe keyboard showing and hiding events, and handle it

let handler = BasicKeyboardHandler()
handler.show = { [weak self] height in
  // move text fields up
}

handler.hide = { [weak self] in
  // move text fields back to original position
}

keyboardObserver = KeyboardObserver(handler: handler)

Currently support

  • BasicKeyboardHandler: basic UIView animation
  • InsetKeyboardHandler: animate UIScrollView insets
  • ConstraintKeyboardHandler: animate bottom layout constraint
  • CustomKeyboardHandler: custom handling

iOS Extensions

UIView

.optimize()

let view = UIView.optimize
/*
  clipsToBounds = true
  layer.drawsAsynchronously = true
  opaque = true
*/

UIImage

+Rendering mode

image.original // imageWithRenderingMode(.AlwaysOriginal)
image.template // imageWithRenderingMode(.AlwaysTemplate)

Shared

SequenceType

let first: Int? = items.findFirst({ $0 > 10 })

Dates

Compare

if date1 < date2 {
  // do something
} else if date1 >= date2 {
  // do something else
}

Construct

let _ = 5.day
let _ = 3.week

Frame

let view = UIView()
view.width = 200
view.height = 200
view.x = 25
view.y = 25

print(view.width) // prints 200
print(view.height) // prints 200
print(view.x) // prints 25
print(view.y) // prints 25

Grand Central Dispatch

dispatch {
  // dispatch in main queue
}

dispatch(queue: .Background) {
  // dispatch in background queue
}

lazy var serialQueue = dispatch_queue_create("serialQueue", DISPATCH_QUEUE_SERIAL)
dispatch(queue: .Custom(serialQueue)) {
  // dispatch in a serial queue
}

Easy dispatching with grand central dispatch. Support all the regular global queues: Main, Interactive, Initiated, Utility, Background. And .Custom() for your own dispatch queues.

Localization

let string = localizedString("My Profile")
let formattedString = localizedString(key: "%d numbers", arguments: 10)

Swift access (pun intended) to NSLocalizedString, you will get more valid auto completion with this one, we promise.

Once

let once = Once()
once.run {
  // do something
}

once.run {
  // no effect
}

Operators

var url = NSURL(string: "hyper.no")!
url ?= NSURL(string: "\\/http")
// url is equal to hyper.no

The ?= only assigns values if the right is not nil.

Range

let acceptable = 200..<300
if acceptable.contains(response.statusCode) {
  // Status code is between 200 and 299.
}

Regex

if "ios@hyper.no".isEmail() {
  // Is email
}

let stringNumber = "1984"
if stringNumber.isNumber() {
  // Is a number
}

if stringNumber.matches("^[0-9]+$") {
  // Is a number
}

Shared Extensions

+Queueable


struct Object: Queueable {

  func process() -> Bool { return true }
}

let myQueue = [Object(), Object()]
myQueue.processQueue()

Make your own processing queue with ease, just make your object conform the Queueable.

public protocol Queueable {
  func process() -> Bool
}

URLStringConvertible

let urlString = "https://hyper.no"
let url = urlString.url

Highly inspired by / borrowed from Alamofire's implementation of URLStringConvertible.

Core Foundation

let string = "hyper/oslo"
string.length // 10
string.truncate(5) // hyper...
string.split(/) // ["hyper", oslo]

if string.isPresent {
  // do something
}

if string.contains("hyper") {
  // found hyper
}

var dirtyString = "   hyper   "
print(dirtyString.trim()) // prints "hyper"

Just some extra sugar on top of String for getting the length, truncating, trimming or splitting a String.

isPresent is the opposite of isEmpty.

contains and be used to check if a string contains a word or pharse.

Swizzler

class Swizzled: NSObject {

  override class func initialize() {
    struct Static {
      static var token: dispatch_once_t = 0
    }

    if self !== Swizzled.self {
    return
  }

  dispatch_once(&Static.token) {
    Swizzler.swizzle("method", cls: self)
  }
}

  dynamic func method() -> Bool {
    return true
  }

  func swizzled_method() -> Bool {
    return false
  }
}

let object = Swizzled()
object.method() // false

Everyday we are swizzling, this use to be mundane, now it just Swiftling, we mean, super fast.

Then

let UIView().then {
  $0.backgroundColor = UIColor.blackColor()
}

This implementation is brought to you by @devxoul by his awesome Then repository.

Type Alias

public typealias JSONArray = [[String : AnyObject]]
public typealias JSONDictionary = [String : AnyObject]

UITesting

if UITesting.isRunning {
  // tests are running
} else {
  // everything is fine, move along
}

To easily include or exclude operations for when you are running UI tests.

UnitTesting

if UnitTesting.isRunning {
  // running test
}

func testPerformance() {
  let measurement = measure {
    // run operation
  }
}

Check if you are running UniTests and to measure performance.

Installation

Sugar is available through CocoaPods. To install it, simply add the following line to your Podfile:

pod 'Sugar'

Sugar is also available through Carthage. To install just write into your Cartfile:

github "hyperoslo/Sugar"

Sugar is also available through Swift Package Manager.

.package(url: "https://github.com/hyperoslo/Sugar.git", .upToNextMajor(from: "5.0.1")),

Download Details:

Author: Hyperoslo
Source Code: https://github.com/hyperoslo/Sugar 
License: View license

#swift #ios 

What is GEEK

Buddha Community

Sugar: Something Sweet That Goes Great with Your Cocoa
Muhammad  Price

Muhammad Price

1659641220

Exception Handler: Ruby on Rails Custom Error Pages

ExceptionHandler is presently the MOST POPULAR exceptions gem for CUSTOM Rails error pages.

With 290,000+ downloads, it is the *only* gem to provide custom 400/500 exception pages for Rails 5 & 6

Current 0.8.0.0 (August 2018)

πŸ“ Introduction


ExceptionHandler replaces Rails' default error pages with dynamic views.

It does this by injecting config.exceptions_app with our controller - allowing us to populate erroneous responses with our own HTML. To understand how this works, you need to appreciate how Rails handles errors:

Rails uses ActionDispatch::ShowExceptions (above) to generate error responses.

Because web browsers (Rails is a web framework) can only interpret HTTP responses, Ruby/Rails exceptions have to be translated into something a browser can read. This is done by calling the above middleware.

--

As highlighted, an HTTP response is built independent of the Rails stack. This includes assigning an HTTP status code and HTML response body. It's the response body which ExceptionHandler is designed to override.

⚠️ Installation


πŸ’Ž RubyGems (Code) | πŸ’» Medium (Tutorial)

# Gemfile
gem 'exception_handler', '~> 0.8.0.0'

Because ExceptionHandler is built around a Rails engine, there is nothing to be done to get it working in production. Installing the Gem should translate your production 4xx/5xx error pages into dynamic views.

Environments other than production (development/staging) required the dev variable to be true.

πŸ”§ Configuration


πŸ“ Config    πŸ’» Dev    πŸ’Ύ Database    βœ‰οΈ Email    πŸ‘“ Views    πŸ’¬ Locales    πŸ“‹ Layouts    ⛔️ Custom Exceptions


 

The ONLY thing you need to manage ExceptionHandler is its config settings.

Whilst the gem works out of the box (without any configuration), if you want to manage the layouts, email, dev or the database, you'll need to set the appropriate values in the config hash.

This is done in config/application.rb or config/environments/[env].rb ↴

# config/application.rb

module YourApp
  class Application < Rails::Application

    # => This is an example of ALL available config options
    # => You're able to see exactly how it works here:
    # => https://github.com/richpeck/exception_handler/blob/master/lib/exception_handler/config.rb

    # => Config hash (no initializer required)
    config.exception_handler = {
      dev:        nil, # allows you to turn ExceptionHandler "on" in development
      db:         nil, # allocates a "table name" into which exceptions are saved (defaults to nil)
      email:      nil, # sends exception emails to a listed email (string // "you@email.com")

      # Custom Exceptions
      custom_exceptions: {
        #'ActionController::RoutingError' => :not_found # => example
      },

      # On default 5xx error page, social media links included
      social: {        
        facebook: nil, # Facebook page name   
        twitter:  nil, # Twitter handle  
        youtube:  nil, # Youtube channel name / ID
        linkedin: nil, # LinkedIn name
        fusion:   nil  # FL Fusion handle
      },  

      # This is an entirely NEW structure for the "layouts" area
      # You're able to define layouts, notifications etc ↴

      # All keys interpolated as strings, so you can use symbols, strings or integers where necessary
      exceptions: {

        :all => {
          layout: "exception", # define layout
          notification: true, # (false by default)
          deliver: #something here to control the type of response
        },
        :4xx => {
          layout: nil, # define layout
          notification: true, # (false by default)
          deliver: #something here to control the type of response    
        },    
        :5xx => {
          layout: "exception", # define layout
          notification: true, # (false by default)
          deliver: #something here to control the type of response    
        },
        500 => {
          layout: "exception", # define layout
          notification: true, # (false by default)
          deliver: #something here to control the type of response    
        },

        # This is the old structure
        # Still works but will be deprecated in future versions

        501 => "exception",
        502 => "exception",
        503 => "exception",
        504 => "exception",
        505 => "exception",
        507 => "exception",
        510 => "exception"

      }
    }
  end
end

For a full retinue of the available options, you'll be best looking at the config file itself.

--

If using an engine, you DON'T need an initializer:

# lib/engine.rb
module YourModule
  class Engine < Rails::Engine

    # => ExceptionHandler
    # => Works in and out of an initializer
    config.exception_handler = {
      dev: nil, # => this will not load the gem in development
      db:  true # => this will use the :errors table to store exceptions
    }
  end
end

The best thing about using a config options block is that you are able to only define the options that you require.

If you have particular options you only wish to run in staging, or have single options for production etc, this setup gives you the ability to manage it properly...


πŸ’» Dev

As explained, ExceptionHandler does not work in development by default.

This is because it overrides the exceptions_app middleware hook - which is only invoked in production or staging.

To get it working in development, you need to override the config.consider_all_requests_local setting (a standard component of Rails) - setting it to "false" ↴

This is normally done by changing the setting in your Rails config files. However, to make the process simpler for ExceptionHandler- we've added a dev option which allows you to override the hook through the context of the gem...

# config/application.rb
config.exception_handler = { dev: true }

This disables config.consider_all_requests_local, making Rails behave as it would in production.

Whilst simple, it's not recommended for extended use. Very good for testing new ideas etc.


πŸ’Ύ DB

To save exceptions to your database, you're able to set the db option.

Because we use a controller to manage the underlying way the system works, we're able to invoke the likes of a model with other functionality.

Ths is done automatically with the latest version of ExceptionHandler.

To do this, once you've populated the option with either true or a string, run rails db:migrate from your console.

Our new migration system will automatically run the migration.

# config/application.rb
config.exception_handler = { db: true }

This enables ActiveRecord::Base on the Exception class, allowing us to save to the database.

In order for this to work, your db needs the correct table.


βœ‰οΈ Email

ExceptionHandler also sends email notifications.

If you want to receive emails whenever your application raises an error, you can do so by adding your email to the config:

# config/application.rb
config.exception_handler = {
  email: "your@email.com"
}

Please Note this requires ActionMailer. If you don't have any outbound SMTP server, SendGrid is free.

From version 0.8.0.0, you're able to define whether email notifications are sent on a per-error basis:

# config/application.rb
config.exception_handlder = {

  # This has to be present for any "notification" declarations to work
  # Defaults to 'false'
  email: "test@test.com",

  # Each status code in the new "exceptions" block allows us to define whether email notifications are sent
  exceptions: {
    :all => { notification: true },
    :50x => { notification: false },
    500 =>  { notification: false }
  }
}

πŸ‘“ Views

What most people want out of the view is to change the way it looks. This can be done without changing the "view" itself.

To better explain, if ExceptionsController is invoked (by exceptions_app), it has ONE method (show).

This method calls the show view, which is entirely dependent on the locales for content & the layout for the look.

This means that if you wish to change how the view "looks" - you're either going to want to change your layout or the locales. There is NO reason to change the show view itself - it's succinct and entirely modular. Whilst you're definitely at liberty to change it, you'll just be making the issue more complicated than it needs to be.

--

We've also included a number of routes which shows in dev mode (allowing you to test):


πŸ’¬ Locales

Locales are used to create interchangeable text (translations/internationalization).

--

In ExceptionHandler, it provides the wording for each type of error code.

By default, the English name of the error is used ("404" will appear as "Not Found") - if you want to create custom messages, you're able to do so by referencing the error's "status_code" within your locales file:

# config/locales/en.yml
en:
  exception_handler:
    not_found:              "Your message here" # -> 404 page
    unauthorized:           "You need to login to continue"
    internal_server_error:  "This is a test to show the %{status} of the error"

You get access to %{message} and %{status}, both inferring from an @exception object we invoke in the controller...

  • %{message} is the error's actual message ("XYZ file could not be shown")
  • %{status} is the error's status code ("Internal Server Error")

--

By default, only internal_server_error is customized by the gem:

# config/locales/en.yml
en:
  exception_handler:
    internal_server_error: "<strong>%{status} Error</strong> %{message}"

πŸ“‹ Layouts

The most attractive feature of ExceptionHandler (for most) is its ability to manage layouts for HTTP status.

--

The reason for this is due to the way in which Rails works β†’ the "layout" is a "wrapper" for the returned HTML (the "styling" of a page). If you have no layout, it will render the "view" HTML and nothing else.

This means if you want to change the "look" of a Rails action, you simply have to be able to change the layout. You should not change the view at all.

To this end, ExceptionHandler has been designed around providing a SINGLE VIEW for exceptions. This view does not need to change (although you're welcome to use a generator to do so) - the key is the layout that's assigned...

  • 4xx errors are given a nil layout (by default) (inherits from ApplicationController in your main app)
  • 5xx errors are assigned our own exception layout:
# config/application.rb
config.exception_handler = {

  # The new syntax allows us to assign different values to each HTTP status code
  # At the moment, only 'layout' & 'notification' are supported
  # We plan to include several more in the future...

  exceptions: {
    all: { layout: nil } # -> this will inherit from ApplicationController's layout
  }
}

The layout system has changed between 0.7.7.0 and 0.8.0.0.

Building on the former's adoption of HTTP status-centric layouts, it is now the case that we have the all, 5xx and 4xx options - allowing us to manage the layouts for blocks of HTTP errors respectively:

# config/application.rb
config.exception_handler = {

  # Old (still works)
  # No "all" / "4xx"/"5xx" options
  layouts: {
    500 => 'exception',
    501 => 'exception'
  },

  # New
  exceptions: {
    :all => { layout: 'exception' },
    :4xx => { layout: 'exception' },
    :5xx => { layout: 'exception' }, # -> this overrides the :all declaration
    500  => { layout: nil } # -> this overrides the 5xx declaration
  }
}

We've bundled the exception layout for 5xx errors because since these denote internal server errors, it's best to isolate the view system as much as possible. Whilst you're at liberty to change it, we've found it sufficient for most use-cases.


⛔️ Custom Exceptions

As mentioned, Rails' primary role is to convert Ruby exceptions into HTTP errors.

Part of this process involves mapping Ruby/Rails exceptions to the equivalent HTTP status code.

This is done with config.action_dispatch.rescue_responses.

Whilst this works well, it may be the case that you want to map your own classes to an HTTP status code (default is Internal Server Error).

If you wanted to keep this functionality inside ExceptionHandler, you're able to do it as follows:

# config/application.rb
config.exception_handler = {
  custom_exceptions: {
    'CustomClass::Exception' => :not_found
  }
}

Alternatively, you're able to still do it with the default Rails behaviour:

# config/application.rb
config.action_dispatch.rescue_responses = { 'CustomClass::Exception' => :not_found }

πŸ’Ό Generators

If you want to edit the controller, views, model or assets, you're able to invoke them in your own application.

This is done - as with other gems - with a single generator which takes a series of arguments:

rails g exception_handler:views
rails g exception_handler:views -v views
rails g exception_handler:views -v controllers
rails g exception_handler:views -v models
rails g exception_handler:views -v assets
rails g exception_handler:views -v views controllers models assets

If you don't include any switches, this will copy all ExceptionHandler's folders put into your app.

Each switch defines which folders you want (EG -v views will only copy views dir).


βœ”οΈ Migrations

You DON'T need to generate a migration anymore.

From 0.7.5, the migration generator has been removed in favour of our own migration system.

The reason we did this was so not to pollute your migrations folder with a worthless file. Our migration doesn't need to be changed - we only have to get it into the database and the gem takes care of the rest...

If you set the db option in config, run rails db:migrate and the migration will be run.

To rollback, use the following:

rails db:migrate:down VERSION=000000

The drawback to this is that if you remove ExceptionHandler before you rollback the migration, it won't exist anymore.

You can only fire the rollback when you have ExceptionHandler installed.

☎️ Support


You're welcome to contact me directly at rpeck@frontlineutilities.co.uk.

Alternatively, you may wish to post on our GitHub Issues, or StackOverflow.

--

Medium

⭐ Changelog


1.0.0.0

  •  TBA

0.8.0.0

  •  README (focus on utility)
  •  Introduction of 4xx,5xx,:all for layouts config
  •  Changed layouts to exceptions in config
  •  Email improvement
  •  Streamlined migration
  •  Updated model

0.7.7.0

0.7.0.0

0.6.5.0

  •  Streamlined interface
  •  ActiveRecord / Middleware overhaul
  •  Supports Sprockets 4+ (manifest.js)
  •  Email integration
  •  Asset overhaul & improvement
  •  Removed dependencies

0.5.0.0

  •  Locales
  •  Email notifications
  •  Full test suite
  •  Rails 4.2 & Rails 5.0 native (request.env fix)
  •  Controller fixed
  •  DB fixed
  •  Legacy initializer support (more)
  •  Rails asset management improvement
  •  Reduced gem file size

0.4.7.0

  •  New config system
  •  Fixed controller layout issues
  •  Streamlined middleware
  •  New layout & interface

404 + 500 Errors

ExceptionHandler provides custom error pages gem for Rails 5+ 
No other gem is as simple or effective at providing branded exception pages in production


Author: richpeck
Source code: https://github.com/richpeck/exception_handler
License:  

#ruby  #ruby-on-rails 

Rupert  Beatty

Rupert Beatty

1668142440

Sugar: Something Sweet That Goes Great with Your Cocoa

Sugar

Sugar is a sweetener for your Cocoa implementations.

iOS

Application

let appName = Application.name             // CFBundleDisplayName : String
let appVersion = Application.version       // CFBundleShortVersionString : String
let appExecutable = Application.executable // CFBundleExecutable : String
let appBundle = Application.bundle         // CFBundleIdentifier : String
let appSchemes = Application.schemes       // CFBundleURLSchemes : [String]
let mainAppScheme = Application.mainScheme // CFBundleURLSchemes.first : String?

Gain easy access to main bundle information.

Screen

let pixelSize = Screen.pixelSize // CGSize(width: screenWidth * scale, height: screenHeight * scale)

Get the actual pixel information of the device screen.

Simulator

if !Simulator.isRunning {
  // add device specific operations here
}

To easily exclude operations from when you as a developer runs the application in the simulator, not subscribing to push notification or running analytics operations etc.

Keyboard Observer

Observe keyboard showing and hiding events, and handle it

let handler = BasicKeyboardHandler()
handler.show = { [weak self] height in
  // move text fields up
}

handler.hide = { [weak self] in
  // move text fields back to original position
}

keyboardObserver = KeyboardObserver(handler: handler)

Currently support

  • BasicKeyboardHandler: basic UIView animation
  • InsetKeyboardHandler: animate UIScrollView insets
  • ConstraintKeyboardHandler: animate bottom layout constraint
  • CustomKeyboardHandler: custom handling

iOS Extensions

UIView

.optimize()

let view = UIView.optimize
/*
  clipsToBounds = true
  layer.drawsAsynchronously = true
  opaque = true
*/

UIImage

+Rendering mode

image.original // imageWithRenderingMode(.AlwaysOriginal)
image.template // imageWithRenderingMode(.AlwaysTemplate)

Shared

SequenceType

let first: Int? = items.findFirst({ $0 > 10 })

Dates

Compare

if date1 < date2 {
  // do something
} else if date1 >= date2 {
  // do something else
}

Construct

let _ = 5.day
let _ = 3.week

Frame

let view = UIView()
view.width = 200
view.height = 200
view.x = 25
view.y = 25

print(view.width) // prints 200
print(view.height) // prints 200
print(view.x) // prints 25
print(view.y) // prints 25

Grand Central Dispatch

dispatch {
  // dispatch in main queue
}

dispatch(queue: .Background) {
  // dispatch in background queue
}

lazy var serialQueue = dispatch_queue_create("serialQueue", DISPATCH_QUEUE_SERIAL)
dispatch(queue: .Custom(serialQueue)) {
  // dispatch in a serial queue
}

Easy dispatching with grand central dispatch. Support all the regular global queues: Main, Interactive, Initiated, Utility, Background. And .Custom() for your own dispatch queues.

Localization

let string = localizedString("My Profile")
let formattedString = localizedString(key: "%d numbers", arguments: 10)

Swift access (pun intended) to NSLocalizedString, you will get more valid auto completion with this one, we promise.

Once

let once = Once()
once.run {
  // do something
}

once.run {
  // no effect
}

Operators

var url = NSURL(string: "hyper.no")!
url ?= NSURL(string: "\\/http")
// url is equal to hyper.no

The ?= only assigns values if the right is not nil.

Range

let acceptable = 200..<300
if acceptable.contains(response.statusCode) {
  // Status code is between 200 and 299.
}

Regex

if "ios@hyper.no".isEmail() {
  // Is email
}

let stringNumber = "1984"
if stringNumber.isNumber() {
  // Is a number
}

if stringNumber.matches("^[0-9]+$") {
  // Is a number
}

Shared Extensions

+Queueable


struct Object: Queueable {

  func process() -> Bool { return true }
}

let myQueue = [Object(), Object()]
myQueue.processQueue()

Make your own processing queue with ease, just make your object conform the Queueable.

public protocol Queueable {
  func process() -> Bool
}

URLStringConvertible

let urlString = "https://hyper.no"
let url = urlString.url

Highly inspired by / borrowed from Alamofire's implementation of URLStringConvertible.

Core Foundation

let string = "hyper/oslo"
string.length // 10
string.truncate(5) // hyper...
string.split(/) // ["hyper", oslo]

if string.isPresent {
  // do something
}

if string.contains("hyper") {
  // found hyper
}

var dirtyString = "   hyper   "
print(dirtyString.trim()) // prints "hyper"

Just some extra sugar on top of String for getting the length, truncating, trimming or splitting a String.

isPresent is the opposite of isEmpty.

contains and be used to check if a string contains a word or pharse.

Swizzler

class Swizzled: NSObject {

  override class func initialize() {
    struct Static {
      static var token: dispatch_once_t = 0
    }

    if self !== Swizzled.self {
    return
  }

  dispatch_once(&Static.token) {
    Swizzler.swizzle("method", cls: self)
  }
}

  dynamic func method() -> Bool {
    return true
  }

  func swizzled_method() -> Bool {
    return false
  }
}

let object = Swizzled()
object.method() // false

Everyday we are swizzling, this use to be mundane, now it just Swiftling, we mean, super fast.

Then

let UIView().then {
  $0.backgroundColor = UIColor.blackColor()
}

This implementation is brought to you by @devxoul by his awesome Then repository.

Type Alias

public typealias JSONArray = [[String : AnyObject]]
public typealias JSONDictionary = [String : AnyObject]

UITesting

if UITesting.isRunning {
  // tests are running
} else {
  // everything is fine, move along
}

To easily include or exclude operations for when you are running UI tests.

UnitTesting

if UnitTesting.isRunning {
  // running test
}

func testPerformance() {
  let measurement = measure {
    // run operation
  }
}

Check if you are running UniTests and to measure performance.

Installation

Sugar is available through CocoaPods. To install it, simply add the following line to your Podfile:

pod 'Sugar'

Sugar is also available through Carthage. To install just write into your Cartfile:

github "hyperoslo/Sugar"

Sugar is also available through Swift Package Manager.

.package(url: "https://github.com/hyperoslo/Sugar.git", .upToNextMajor(from: "5.0.1")),

Download Details:

Author: Hyperoslo
Source Code: https://github.com/hyperoslo/Sugar 
License: View license

#swift #ios 

Ian  Robinson

Ian Robinson

1623994140

Data and analytics: Delivering Clarity At A Time Of Great Uncertainty

TrueCue reveals the top data analytics priorities for 2021 and beyond

Looking back over the past year, it’s clear that for many organisations, regardless of size or industry, technology was invoked to survive the crisis. Much has been reported about the rapid migration to the cloud and the move to support remote working but according to James Don-Carolis, Managing Director of TrueCue, data, and the value which can be obtained from actionable, business intelligence, often acts as the differentiator between success and failure:

β€œEconomic challenges will still make it problematic for businesses to get a full sense of what lies ahead but in order to traverse the current and post-pandemic landscape, those organisations able to make insight-driven decisions will be far more likely to prosper in the coming months and years.”

In light of this Don-Carolis, outlines three key data and analytics trends that will characterise the most forward-thinking businesses in 2021.

#big data #latest news #data analytics #great uncertainty #delivering clarity #data and analytics: delivering clarity at a time of great uncertainty

Lisa joly

Lisa joly

1624053600

How to Stake in Pancake Bunny and Earn Sweet Yield | Tutorial | $10 LITECOIN Giveaway

In this video I show you by parking your Bunny tokens on Pancakebunny you can earn sweet yield and multiple your stack essentially earning you passive income. I used the Bunny Pool to stake my Bunny tokens to earn WBNB. Any question let me know. Any questions let me know in the comments.
πŸ“Ί The video in this post was made by Crypto expat
The origin of the article: https://www.youtube.com/watch?v=41vd_hDRTWY
πŸ”Ί DISCLAIMER: The article is for information sharing. The content of this video is solely the opinions of the speaker who is not a licensed financial advisor or registered investment advisor. Not investment advice or legal advice.
Cryptocurrency trading is VERY risky. Make sure you understand these risks and that you are responsible for what you do with your money
πŸ”₯ If you’re a beginner. I believe the article below will be useful to you ☞ What You Should Know Before Investing in Cryptocurrency - For Beginner
⭐ ⭐ ⭐The project is of interest to the community. Join to Get free β€˜GEEK coin’ (GEEKCASH coin)!
☞ **-----CLICK HERE-----**⭐ ⭐ ⭐
Thanks for visiting and watching! Please don’t forget to leave a like, comment and share!

#bitcoin #blockchain #pancake bunny #earn sweet yield #litecoin giveaway #how to stake in pancake bunny and earn sweet yield | pancakebunny | $10 litecoin giveaway

Mery tris

Mery tris

1624212000

Ethereum Just Did Something Unprecedented πŸš€ (ETH $10k By Summer)

0:00 Intro
0:40 Tokenmetrics
1:14 ETH Price Analysis
2:47 NEW Ethereum L2!
4:27 BNB Reaches Scaling LIMIT!
7:27 Ethereum ETF!
8:01 Tezos + Ubisoft Partnership!
9:39 Free Ampleforth Airdrop!
10:17 Join Tokenmetrics!
πŸ“Ί The video in this post was made by K Crypto
The origin of the article: https://www.youtube.com/watch?v=oqZumHn8OMw
πŸ”Ί DISCLAIMER: The article is for information sharing. The content of this video is solely the opinions of the speaker who is not a licensed financial advisor or registered investment advisor. Not investment advice or legal advice.
Cryptocurrency trading is VERY risky. Make sure you understand these risks and that you are responsible for what you do with your money
πŸ”₯ If you’re a beginner. I believe the article below will be useful to you ☞ What You Should Know Before Investing in Cryptocurrency - For Beginner
⭐ ⭐ ⭐The project is of interest to the community. Join to Get free β€˜GEEK coin’ (GEEKCASH coin)!
☞ **-----CLICK HERE-----**⭐ ⭐ ⭐
Thanks for visiting and watching! Please don’t forget to leave a like, comment and share!

#bitcoin #blockchain #eth #ethereum #ethereum just did something unprecedented #ethereum just did something unprecedented πŸš€ (eth $10k by summer)