ad Auphonic Adaptive Leveler Customization (Beta Update) By feedproxy.google.com Published On :: Mon, 05 Nov 2018 11:42:22 +0000 In late August, we launched the private beta program of our advanced audio algorithm parameters. After feedback by our users and many new experiments, we are proud to release a complete rework of the Adaptive Leveler parameters: In the previous version, we based our Adaptive Leveler parameters on the Loudness Range descriptor (LRA), which is included in the EBU R128 specification. Although it worked, it turned out that it is very difficult to set a loudness range target for diverse audio content, which does include speech, background sounds, music parts, etc. The results were not predictable and it was hard to find good target values. Therefore we developed our own algorithm to measure the dynamic range of audio signals, which works similarly for speech, music and other audio content. The following advanced parameters for our Adaptive Leveler allow you to customize which parts of the audio should be leveled (foreground, all, speech, music, etc.), how much they should be leveled (dynamic range), and how much micro-dynamics compression should be applied. To try out the new algorithms, please join our private beta program and let us know your feedback! Leveler Preset The Leveler Preset defines which parts of the audio should be adjusted by our Adaptive Leveler: Default Leveler: Our classic, default leveling algorithm as demonstrated in the Leveler Audio Examples. Use it if you are unsure. Foreground Only Leveler: This preset reacts slower and levels foreground parts only. Use it if you have background speech or background music, which should not be amplified. Fast Leveler: A preset which reacts much faster. It is built for recordings with fast and extreme loudness differences, for example, to amplify very quiet questions from the audience in a lecture recording, to balance fast-changing soft and loud voices within one audio track, etc. Amplify Everything: Amplify as much as possible. Similar to the Fast Leveler, but also amplifies non-speech background sounds like noise. Leveler Dynamic Range Our default Leveler tries to normalize all speakers to a similar loudness so that a consumer in a car or subway doesn't feel the need to reach for the volume control. However, in other environments (living room, cinema, etc.) or in dynamic recordings, you might want more level differences (Dynamic Range, Loudness Range / LRA) between speakers and within music segments. The parameter Dynamic Range controls how much leveling is applied: Higher values result in more dynamic output audio files (less leveling). If you want to increase the dynamic range by 3dB (or LU), just increase the Dynamic Range parameter by 3dB. We also like to call this Loudness Comfort Zone: above a maximum and below a minimum possible level (the comfort zone), no leveling is applied. So if your input file already has a small dynamic range (is within the comfort zone), our leveler will be just bypassed. Example Use Cases: Higher dynamic range values should be used if you want to keep more loudness differences in dynamic narration or dynamic music recordings (live concert/classical). It is also possible to utilize this parameter to generate automatic mixdowns with different loudness range (LRA) values for different target environments (very compressed ones like mobile devices or Alexa, very dynamic ones like home cinema, etc.). Compressor Controls Micro-Dynamics Compression: The compressor reduces the volume of short and loud spikes like "p", "t" or laughter ( short-term dynamics) and also shapes the sound of your voice (it will sound more or less "processed"). The Leveler, on the other hand, adjusts mid-term level differences, as done by a sound engineer, using the faders of an audio mixer, so that a listener doesn't have to adjust the playback volume all the time. For more details please see Loudness Normalization and Compression of Podcasts and Speech Audio. Possible values are: Auto: The compressor setting depends on the selected Leveler Preset. Medium compression is used in Foreground Only and Default Leveler presets, Hard compression in our Fast Leveler and Amplify Everything presets. Soft: Uses less compression. Medium: Our default setting. Hard: More compression, especially tries to compress short and extreme level overshoots. Use this preset if you want your voice to sound very processed, our if you have extreme and fast-changing level differences. Off: No short-term dynamics compression is used at all, only mid-term leveling. Switch off the compressor if you just want to adjust the loudness range without any additional micro-dynamics compression. Separate Music/Speech Parameters Use the switch Separate MusicSpeech Parameters (top right), to see separate Adaptive Leveler parameters for music and speech segments, to control all leveling details separately for speech and music parts: For dialog intelligibility improvements in films and TV, it is important that the speech/dialog level and loudness range is not too soft compared to the overall programme level and loudness range. This parameter allows you to use more leveling in speech parts while keeping music and FX elements less processed. Note: Speech, music and overall loudness and loudness range of your production are also displayed in our Audio Processing Statistics! Example Use Case: Music live recordings or dynamic music mixes, where you want to amplify all speakers (speech dynamic range should be small) but keep the dynamic range within and between music segments (music dynamic range should be high). Dialog intelligibility improvements for films and TV, without effecting music and FX elements. Other Advanced Audio Algorithm Parameters We also offer advanced audio parameters for our Noise, Hum Reduction and Global Loudness Normalization algorithms: For more details, please see the Advanced Audio Algorithms Documentation. Want to know more? If you want to know more details about our advanced algorithm parameters (especially the leveler parameters), please listen to the following podcast interview with Chris Curran (Podcast Engineering School): Auphonic’s New Advanced Features, with Georg Holzmann – PES 108 Advanced Parameters Private Beta and Feedback At the moment the advanced algorithm parameters are for beta users only. This is to allow us to get user feedback, so we can change the parameters to suit user needs. Please let us know your case studies, if you need any other algorithm parameters or if you have any questions! Here are some private beta invitation codes: jbwCVpLYrl 6zmLqq8o3z RXYIUbC6al QDmIZLuPKa JIrnGRZBgl SWQOWeZOBD ISeBCA9gTy w5FdsyhZVI qWAvANQ5mC twOjdHrit3 KwnL2Le6jB 63SE2V54KK G32AULFyaM 3H0CLYAwLU mp1GFNVZHr swzvEBRCVa rLcNJHUNZT CGGbL0O4q1 5o5dUjruJ9 hAggWBpGvj ykJ57cFQSe 0OHAD2u1Dx RG4wSYTLbf UcsSYI78Md Xedr3NPCgK mI8gd7eDvO 0Au4gpUDJB mYLkvKYz1C ukrKoW5hoy S34sraR0BU J2tlV0yNwX QwNdnStYD3 Zho9oZR2e9 jHdjgUq420 51zLbV09p4 c0cth0abCf 3iVBKHVKXU BK4kTbDQzt uTBEkMnSPv tg6cJtsMrZ BdB8gFyhRg wBsLHg90GG EYwxVUZJGp HLQ72b65uH NNd415ktFS JIm2eTkxMX EV2C5RAUXI a3iwbxWjKj X1AT7DCD7V y0AFIrWo5l We are happy to send further invitation codes to all interested users - please do not hesitate to contact us! If you have an invitation code, you can enter it here to activate the advanced audio algorithm parameters: Auphonic Algorithm Parameters Private Beta Activation Full Article Audio Development
ad Advanced Multitrack Audio Algorithms Release (Beta) By feedproxy.google.com Published On :: Fri, 29 Mar 2019 10:16:41 +0000 Last weekend, at the Subscribe10 conference, we released Advanced Audio Algorithm Parameters for Multitrack Productions: We launched our advanced audio algorithm parameters for Singletrack Productions last year. Now these settings (and more) are available for Multitrack Algorithms as well, which gives you detailed control for each track of your production. The following new parameters are available: Fore/Background Settings: keep your music/clip tracks unchanged and set a custom background gain Multitrack Leveler Parameters: control the stereo panorama, leveling algorithm, dynamic range and compression Better Hum and Noise Reduction Controls for each track Maximum True Peak Level setting for the final mixdown Full API Support Please join our private beta program and let us know how you use these new features or if you need even more control! Fore/Background Settings The parameter Fore/Background controls whether a track should be in foreground, in background, ducked, or unchanged, which is especially important for music or clip tracks. For more details, please see Automatic Ducking, Foreground and Background Tracks . We now added the new option Unchanged and a new parameter to set the level of background segments/tracks: Unchanged (Foreground): We sometimes received complaints from users, which produced very complex music or clip tracks, that Auphonic changes the levels too hard. If you set the parameter Fore/Background to the new option Unchanged (Foreground), Level relations within this track won’t be changed at all. It will be added to the final mixdown so that foreground/solo parts of this track will be as loud as (foreground) speech from other tracks. Background Level: It is now possible to set the level of background segments/tracks (compared to foreground segments) in background and ducking tracks. By default, background and ducking segments are 18dB softer than foreground segments. Leveler Parameters Similar to our Singletrack Advanced Leveler Parameters (see this previous blog post), we also released leveling parameters for Multitrack Productions now. The following advanced parameters for our Multitrack Adaptive Leveler can be set for each track and allow you to customize which parts of the audio should be leveled, how much they should be leveled, how much dynamic range compression should be applied and to set the stereo panorama (balance): Leveler Preset: Select the Speech or Music Leveler for this track. If set to Automatic (default), a classifier will decide if this is a music or speech track. Dynamic Range: The parameter Dynamic Range controls how much leveling is applied: Higher values result in more dynamic output audio files (less leveling). If you want to increase the dynamic range by 3dB (or LU), just increase the Dynamic Range parameter by 3dB. For more details, please see Multitrack Leveler Parameters. Compressor: Select a preset for Micro-Dynamics Compression: Auto, Soft, Medium, Hard or Off. The Compressor adjusts short-term dynamics, whereas the Leveler adjusts mid-term level differences. For more details, please see Multitrack Leveler Parameters. Stereo Panorama (Balance): Change the stereo panorama (balance for stereo input files) of the current track. Possible values: L100, L75, L50, L25, Center, R25, R50, R75 and R100. If you understand German and want to know more about our Advanced Leveler Parameters and audio dynamics in general, watch our talk at the Subscribe10 conference: Video: Audio Lautheit und Dynamik. Better Hum and Noise Reduction Controls We now offer three parameters to control the combination of our Multitrack Noise and Hum Reduction Algorithms for each input track: Noise Reduction Amount: Maximum noise and hum reduction amount in dB, higher values remove more noise. In Auto mode, a classifier decides if and how much noise reduction is necessary (to avoid artifacts). Set to a custom (non-Auto) value if you prefer more noise reduction or want to bypass our classifier. Hum Base Frequency: Set the hum base frequency to 50Hz or 60Hz (if you know it), or use Auto to automatically detect the hum base frequency in each speech region. Hum Reduction Amount: Maximum hum reduction amount in dB, higher values remove more noise. In Auto mode, a classifier decides how much hum reduction is necessary in each speech region. Set it to a custom value (> 0), if you prefer more hum reduction or want to bypass our classifier. Use Disable Dehum to disable hum reduction and use our noise reduction algorithms only. Behavior of noise and hum reduction parameter combinations: Noise Reduction Amount Hum Base Frequency Hum Reduction Amount Auto Auto Auto Automatic hum and noise reduction Auto or > 0 * Disabled No hum reduction, only denoise Disabled 50Hz Auto or > 0 Force 50Hz hum reduction, no denoise Disabled Auto Auto or > 0 Automatic dehum, no denoise 12dB 60Hz Auto or > 0 Always do dehum (60Hz) and denoise (12dB) Maximum True Peak Level In the Master Algorithm Settings of your multitrack production, you can set the maximum allowed true peak level of the processed output file, which is controlled by the True Peak Limiter after our Loudness Normalization algorithms. If set to Auto (which is the current default), a reasonable value according to the selected loudness target is used: -1dBTP for 23 LUFS (EBU R128) and higher, -2dBTP for -24 LUFS (ATSC A/85) and lower loudness targets. Full API Support All advanced algorithm parameters, for Singletrack and Multitrack Productions, are available in our API as well, which allows you to integrate them into your scripts, external workflows and third-party applications. Singletrack API: Documentation on how to use the advanced algorithm parameters in our singletrack production API: Advanced Algorithm Parameters Multitrack API: Documentation of advanced settings for each track of a multitrack production: Multitrack Advanced Audio Algorithm Settings Join the Beta and Send Feedback Please join our beta and let us know your case studies, if you need any other algorithm parameters or if you have any questions! Here are some private beta invitation codes: 8tZPc3T9pH VAvO8VsDg9 0TwKXBW4Ni kjXJMivtZ1 J9APmAAYjT Zwm6HabuFw HNK5gF8FR5 Do1MPHUyPW CTk45VbV4t xYOzDkEnWP 9XE4dZ0FxD 0Sl3PxDRho uSoRQxmKPx TCI62OjEYu 6EQaPYs7v4 reIJVOwIr8 7hPJqZmWfw kti3m5KbNE GoM2nF0AcN xHCbDC37O5 6PabLBRm9P j2SoI8peiY olQ2vsmnfV fqfxX4mWLO OozsiA8DWo weJw0PXDky VTnOfOiL6l B6HRr6gil0 so0AvM1Ryy NpPYsInFqm oFeQPLwG0k HmCOkyaX9R G7DR5Sc9Kv MeQLSUCkge xCSvPTrTgl jyQKG3BWWA HCzWRxSrgW xP15hYKEDl 241gK62TrO Q56DHjT3r4 9TqWVZHZLE aWFMSWcuX8 x6FR5OTL43 Xf6tRpyP4S tDGbOUngU0 5BkOF2I264 cccHS0KveO dT29cF75gG 2ySWlYp1kp iJWPhpAimF We are happy to send further invitation codes to all interested users - please do not hesitate to contact us! If you have an invitation code, you can enter it here to activate the Multitrack Advanced Audio Algorithm Parameters: Auphonic Algorithm Parameters Private Beta Activation Full Article Audio Development News
ad Winter Stand Up Paddling on Horsetooth Reservoir By feedproxy.google.com Published On :: Wed, 19 Feb 2020 23:34:52 +0000 I love paddling on the Horsetooth Reservoir in cold season. Boat ramps are closed, no power boat traffic, usually quiet and calm. Snow and ice can enhance scenery. A great time to paddle, train, relax or photograph. The Horsetooth stays […] Full Article SUP trip reports cold water Colorado Horsetooth Horsetooth Reservoir photography winter
ad Concurrency & Multithreading in iOS By feedproxy.google.com Published On :: Tue, 25 Feb 2020 08:00:00 -0500 Concurrency is the notion of multiple things happening at the same time. This is generally achieved either via time-slicing, or truly in parallel if multiple CPU cores are available to the host operating system. We've all experienced a lack of concurrency, most likely in the form of an app freezing up when running a heavy task. UI freezes don't necessarily occur due to the absence of concurrency — they could just be symptoms of buggy software — but software that doesn't take advantage of all the computational power at its disposal is going to create these freezes whenever it needs to do something resource-intensive. If you've profiled an app hanging in this way, you'll probably see a report that looks like this: Anything related to file I/O, data processing, or networking usually warrants a background task (unless you have a very compelling excuse to halt the entire program). There aren't many reasons that these tasks should block your user from interacting with the rest of your application. Consider how much better the user experience of your app could be if instead, the profiler reported something like this: Analyzing an image, processing a document or a piece of audio, or writing a sizeable chunk of data to disk are examples of tasks that could benefit greatly from being delegated to background threads. Let's dig into how we can enforce such behavior into our iOS applications. A Brief History In the olden days, the maximum amount of work per CPU cycle that a computer could perform was determined by the clock speed. As processor designs became more compact, heat and physical constraints started becoming limiting factors for higher clock speeds. Consequentially, chip manufacturers started adding additional processor cores on each chip in order to increase total performance. By increasing the number of cores, a single chip could execute more CPU instructions per cycle without increasing its speed, size, or thermal output. There's just one problem... How can we take advantage of these extra cores? Multithreading. Multithreading is an implementation handled by the host operating system to allow the creation and usage of n amount of threads. Its main purpose is to provide simultaneous execution of two or more parts of a program to utilize all available CPU time. Multithreading is a powerful technique to have in a programmer's toolbelt, but it comes with its own set of responsibilities. A common misconception is that multithreading requires a multi-core processor, but this isn't the case — single-core CPUs are perfectly capable of working on many threads, but we'll take a look in a bit as to why threading is a problem in the first place. Before we dive in, let's look at the nuances of what concurrency and parallelism mean using a simple diagram: In the first situation presented above, we observe that tasks can run concurrently, but not in parallel. This is similar to having multiple conversations in a chatroom, and interleaving (context-switching) between them, but never truly conversing with two people at the same time. This is what we call concurrency. It is the illusion of multiple things happening at the same time when in reality, they're switching very quickly. Concurrency is about dealing with lots of things at the same time. Contrast this with the parallelism model, in which both tasks run simultaneously. Both execution models exhibit multithreading, which is the involvement of multiple threads working towards one common goal. Multithreading is a generalized technique for introducing a combination of concurrency and parallelism into your program. The Burden of Threads A modern multitasking operating system like iOS has hundreds of programs (or processes) running at any given moment. However, most of these programs are either system daemons or background processes that have very low memory footprint, so what is really needed is a way for individual applications to make use of the extra cores available. An application (process) can have many threads (sub-processes) operating on shared memory. Our goal is to be able to control these threads and use them to our advantage. Historically, introducing concurrency to an app has required the creation of one or more threads. Threads are low-level constructs that need to be managed manually. A quick skim through Apple's Threaded Programming Guide is all it takes to see how much complexity threaded code adds to a codebase. In addition to building an app, the developer has to: Responsibly create new threads, adjusting that number dynamically as system conditions change Manage them carefully, deallocating them from memory once they have finished executing Leverage synchronization mechanisms like mutexes, locks, and semaphores to orchestrate resource access between threads, adding even more overhead to application code Mitigate risks associated with coding an application that assumes most of the costs associated with creating and maintaining any threads it uses, and not the host OS This is unfortunate, as it adds enormous levels of complexity and risk without any guarantees of improved performance. Grand Central Dispatch iOS takes an asynchronous approach to solving the concurrency problem of managing threads. Asynchronous functions are common in most programming environments, and are often used to initiate tasks that might take a long time, like reading a file from the disk, or downloading a file from the web. When invoked, an asynchronous function executes some work behind the scenes to start a background task, but returns immediately, regardless of how long the original task might takes to actually complete. A core technology that iOS provides for starting tasks asynchronously is Grand Central Dispatch (or GCD for short). GCD abstracts away thread management code and moves it down to the system level, exposing a light API to define tasks and execute them on an appropriate dispatch queue. GCD takes care of all thread management and scheduling, providing a holistic approach to task management and execution, while also providing better efficiency than traditional threads. Let's take a look at the main components of GCD: What've we got here? Let's start from the left: DispatchQueue.main: The main thread, or the UI thread, is backed by a single serial queue. All tasks are executed in succession, so it is guaranteed that the order of execution is preserved. It is crucial that you ensure all UI updates are designated to this queue, and that you never run any blocking tasks on it. We want to ensure that the app's run loop (called CFRunLoop) is never blocked in order to maintain the highest framerate. Subsequently, the main queue has the highest priority, and any tasks pushed onto this queue will get executed immediately. DispatchQueue.global: A set of global concurrent queues, each of which manage their own pool of threads. Depending on the priority of your task, you can specify which specific queue to execute your task on, although you should resort to using default most of the time. Because tasks on these queues are executed concurrently, it doesn't guarantee preservation of the order in which tasks were queued. Notice how we're not dealing with individual threads anymore? We're dealing with queues which manage a pool of threads internally, and you will shortly see why queues are a much more sustainable approach to multhreading. Serial Queues: The Main Thread As an exercise, let's look at a snippet of code below, which gets fired when the user presses a button in the app. The expensive compute function can be anything. Let's pretend it is post-processing an image stored on the device. import UIKit class ViewController: UIViewController { @IBAction func handleTap(_ sender: Any) { compute() } private func compute() -> Void { // Pretending to post-process a large image. var counter = 0 for _ in 0..<9999999 { counter += 1 } } } At first glance, this may look harmless, but if you run this inside of a real app, the UI will freeze completely until the loop is terminated, which will take... a while. We can prove it by profiling this task in Instruments. You can fire up the Time Profiler module of Instruments by going to Xcode > Open Developer Tool > Instruments in Xcode's menu options. Let's look at the Threads module of the profiler and see where the CPU usage is highest. We can see that the Main Thread is clearly at 100% capacity for almost 5 seconds. That's a non-trivial amount of time to block the UI. Looking at the call tree below the chart, we can see that the Main Thread is at 99.9% capacity for 4.43 seconds! Given that a serial queue works in a FIFO manner, tasks will always complete in the order in which they were inserted. Clearly the compute() method is the culprit here. Can you imagine clicking a button just to have the UI freeze up on you for that long? Background Threads How can we make this better? DispatchQueue.global() to the rescue! This is where background threads come in. Referring to the GCD architecture diagram above, we can see that anything that is not the Main Thread is a background thread in iOS. They can run alongside the Main Thread, leaving it fully unoccupied and ready to handle other UI events like scrolling, responding to user events, animating etc. Let's make a small change to our button click handler above: class ViewController: UIViewController { @IBAction func handleTap(_ sender: Any) { DispatchQueue.global(qos: .userInitiated).async { [unowned self] in self.compute() } } private func compute() -> Void { // Pretending to post-process a large image. var counter = 0 for _ in 0..<9999999 { counter += 1 } } } Unless specified, a snippet of code will usually default to execute on the Main Queue, so in order to force it to execute on a different thread, we'll wrap our compute call inside of an asynchronous closure that gets submitted to the DispatchQueue.global queue. Keep in mind that we aren't really managing threads here. We're submitting tasks (in the form of closures or blocks) to the desired queue with the assumption that it is guaranteed to execute at some point in time. The queue decides which thread to allocate the task to, and it does all the hard work of assessing system requirements and managing the actual threads. This is the magic of Grand Central Dispatch. As the old adage goes, you can't improve what you can't measure. So we measured our truly terrible button click handler, and now that we've improved it, we'll measure it once again to get some concrete data with regards to performance. Looking at the profiler again, it's quite clear to us that this is a huge improvement. The task takes an identical amount of time, but this time, it's happening in the background without locking up the UI. Even though our app is doing the same amount of work, the perceived performance is much better because the user will be free to do other things while the app is processing. You may have noticed that we accessed a global queue of .userInitiated priority. This is an attribute we can use to give our tasks a sense of urgency. If we run the same task on a global queue of and pass it a qos attribute of background , iOS will think it's a utility task, and thus allocate fewer resources to execute it. So, while we don't have control over when our tasks get executed, we do have control over their priority. A Note on Main Thread vs. Main Queue You might be wondering why the Profiler shows "Main Thread" and why we're referring to it as the "Main Queue". If you refer back to the GCD architecture we described above, the Main Queue is solely responsible for managing the Main Thread. The Dispatch Queues section in the Concurrency Programming Guide says that "the main dispatch queue is a globally available serial queue that executes tasks on the application’s main thread. Because it runs on your application’s main thread, the main queue is often used as a key synchronization point for an application." The terms "execute on the Main Thread" and "execute on the Main Queue" can be used interchangeably. Concurrent Queues So far, our tasks have been executed exclusively in a serial manner. DispatchQueue.main is by default a serial queue, and DispatchQueue.global gives you four concurrent dispatch queues depending on the priority parameter you pass in. Let's say we want to take five images, and have our app process them all in parallel on background threads. How would we go about doing that? We can spin up a custom concurrent queue with an identifier of our choosing, and allocate those tasks there. All that's required is the .concurrent attribute during the construction of the queue. class ViewController: UIViewController { let queue = DispatchQueue(label: "com.app.concurrentQueue", attributes: .concurrent) let images: [UIImage] = [UIImage].init(repeating: UIImage(), count: 5) @IBAction func handleTap(_ sender: Any) { for img in images { queue.async { [unowned self] in self.compute(img) } } } private func compute(_ img: UIImage) -> Void { // Pretending to post-process a large image. var counter = 0 for _ in 0..<9999999 { counter += 1 } } } Running that through the profiler, we can see that the app is now spinning up 5 discrete threads to parallelize a for-loop. Parallelization of N Tasks So far, we've looked at pushing computationally expensive task(s) onto background threads without clogging up the UI thread. But what about executing parallel tasks with some restrictions? How can Spotify download multiple songs in parallel, while limiting the maximum number up to 3? We can go about this in a few ways, but this is a good time to explore another important construct in multithreaded programming: semaphores. Semaphores are signaling mechanisms. They are commonly used to control access to a shared resource. Imagine a scenario where a thread can lock access to a certain section of the code while it executes it, and unlocks after it's done to let other threads execute the said section of the code. You would see this type of behavior in database writes and reads, for example. What if you want only one thread writing to a database and preventing any reads during that time? This is a common concern in thread-safety called Readers-writer lock. Semaphores can be used to control concurrency in our app by allowing us to lock n number of threads. let kMaxConcurrent = 3 // Or 1 if you want strictly ordered downloads! let semaphore = DispatchSemaphore(value: kMaxConcurrent) let downloadQueue = DispatchQueue(label: "com.app.downloadQueue", attributes: .concurrent) class ViewController: UIViewController { @IBAction func handleTap(_ sender: Any) { for i in 0..<15 { downloadQueue.async { [unowned self] in // Lock shared resource access semaphore.wait() // Expensive task self.download(i + 1) // Update the UI on the main thread, always! DispatchQueue.main.async { tableView.reloadData() // Release the lock semaphore.signal() } } } } func download(_ songId: Int) -> Void { var counter = 0 // Simulate semi-random download times. for _ in 0..<Int.random(in: 999999...10000000) { counter += songId } } } Notice how we've effectively restricted our download system to limit itself to k number of downloads. The moment one download finishes (or thread is done executing), it decrements the semaphore, allowing the managing queue to spawn another thread and start downloading another song. You can apply a similar pattern to database transactions when dealing with concurrent reads and writes. Semaphores usually aren't necessary for code like the one in our example, but they become more powerful when you need to enforce synchronous behavior whille consuming an asynchronous API. The above could would work just as well with a custom NSOperationQueue with a maxConcurrentOperationCount, but it's a worthwhile tangent regardless. Finer Control with OperationQueue GCD is great when you want to dispatch one-off tasks or closures into a queue in a 'set-it-and-forget-it' fashion, and it provides a very lightweight way of doing so. But what if we want to create a repeatable, structured, long-running task that produces associated state or data? And what if we want to model this chain of operations such that they can be cancelled, suspended and tracked, while still working with a closure-friendly API? Imagine an operation like this: This would be quite cumbersome to achieve with GCD. We want a more modular way of defining a group of tasks while maintaining readability and also exposing a greater amount of control. In this case, we can use Operation objects and queue them onto an OperationQueue, which is a high-level wrapper around DispatchQueue. Let's look at some of the benefits of using these abstractions and what they offer in comparison to the lower-level GCI API: You may want to create dependencies between tasks, and while you could do this via GCD, you're better off defining them concretely as Operation objects, or units of work, and pushing them onto your own queue. This would allow for maximum reusability since you may use the same pattern elsewhere in an application. The Operation and OperationQueue classes have a number of properties that can be observed, using KVO (Key Value Observing). This is another important benefit if you want to monitor the state of an operation or operation queue. Operations can be paused, resumed, and cancelled. Once you dispatch a task using Grand Central Dispatch, you no longer have control or insight into the execution of that task. The Operation API is more flexible in that respect, giving the developer control over the operation's life cycle. OperationQueue allows you to specify the maximum number of queued operations that can run simultaneously, giving you a finer degree of control over the concurrency aspects. The usage of Operation and OperationQueue could fill an entire blog post, but let's look at a quick example of what modeling dependencies looks like. (GCD can also create dependencies, but you're better off dividing up large tasks into a series of composable sub-tasks.) In order to create a chain of operations that depend on one another, we could do something like this: class ViewController: UIViewController { var queue = OperationQueue() var rawImage = UIImage? = nil let imageUrl = URL(string: "https://example.com/portrait.jpg")! @IBOutlet weak var imageView: UIImageView! let downloadOperation = BlockOperation { let image = Downloader.downloadImageWithURL(url: imageUrl) OperationQueue.main.async { self.rawImage = image } } let filterOperation = BlockOperation { let filteredImage = ImgProcessor.addGaussianBlur(self.rawImage) OperationQueue.main.async { self.imageView = filteredImage } } filterOperation.addDependency(downloadOperation) [downloadOperation, filterOperation].forEach { queue.addOperation($0) } } So why not opt for a higher level abstraction and avoid using GCD entirely? While GCD is ideal for inline asynchronous processing, Operation provides a more comprehensive, object-oriented model of computation for encapsulating all of the data around structured, repeatable tasks in an application. Developers should use the highest level of abstraction possible for any given problem, and for scheduling consistent, repeated work, that abstraction is Operation. Other times, it makes more sense to sprinkle in some GCD for one-off tasks or closures that we want to fire. We can mix both OperationQueue and GCD to get the best of both worlds. The Cost of Concurrency DispatchQueue and friends are meant to make it easier for the application developer to execute code concurrently. However, these technologies do not guarantee improvements to the efficiency or responsiveness in an application. It is up to you to use queues in a manner that is both effective and does not impose an undue burden on other resources. For example, it's totally viable to create 10,000 tasks and submit them to a queue, but doing so would allocate a nontrivial amount of memory and introduce a lot of overhead for the allocation and deallocation of operation blocks. This is the opposite of what you want! It's best to profile your app thoroughly to ensure that concurrency is enhancing your app's performance and not degrading it. We've talked about how concurrency comes at a cost in terms of complexity and allocation of system resources, but introducing concurrency also brings a host of other risks like: Deadlock: A situation where a thread locks a critical portion of the code and can halt the application's run loop entirely. In the context of GCD, you should be very careful when using the dispatchQueue.sync { } calls as you could easily get yourself in situations where two synchronous operations can get stuck waiting for each other. Priority Inversion: A condition where a lower priority task blocks a high priority task from executing, which effectively inverts their priorities. GCD allows for different levels of priority on its background queues, so this is quite easily a possibility. Producer-Consumer Problem: A race condition where one thread is creating a data resource while another thread is accessing it. This is a synchronization problem, and can be solved using locks, semaphores, serial queues, or a barrier dispatch if you're using concurrent queues in GCD. ...and many other sorts of locking and data-race conditions that are hard to debug! Thread safety is of the utmost concern when dealing with concurrency. Parting Thoughts + Further Reading If you've made it this far, I applaud you. Hopefully this article gives you a lay of the land when it comes to multithreading techniques on iOS, and how you can use some of them in your app. We didn't get to cover many of the lower-level constructs like locks, mutexes and how they help us achieve synchronization, nor did we get to dive into concrete examples of how concurrency can hurt your app. We'll save those for another day, but you can dig into some additional reading and videos if you're eager to dive deeper. Building Concurrent User Interfaces on iOS (WWDC 2012) Concurrency and Parallelism: Understanding I/O Apple's Official Concurrency Programming Guide Mutexes and Closure Capture in Swift Locks, Thread Safety, and Swift Advanced NSOperations (WWDC 2015) NSHipster: NSOperation Full Article Code
ad African American Women Leading in Tech By feedproxy.google.com Published On :: Tue, 25 Feb 2020 08:05:00 -0500 “Close your eyes and name three people who have impacted the tech industry.”In all likelihood, that list might be overwhelmingly white and male. And you are not alone. Numerous lists online yielded the same results. In recent years, many articles have chronicled the dearth of diversity in tech. Studies have shown the ways in which venture capital firms have systematically underestimated and undervalued innovation coming particularly from women of color. In 2016 only 88 tech startups were led by African American women, in 2018 this number had climbed to a little over 200. Between 2009 and 2017, African American women raised $289MM in venture/angel funding. For perspective, this only represents .0006% of the $424.7B in total tech venture funding raised in that same time frame. In 2018, only 34 African American women had ever raised more than a million in venture funding. When it comes to innovation, it is not unusual for financial value to be the biggest predictor of what is considered innovative. In fact, a now largely controversial list posted by Forbes of America’s most innovative leaders in the fall of 2019 featured 99 men and one woman. Ironically, what was considered innovative was, in fact, very traditional in its presentation. The criteria used for the list was “media reputation for innovation,” social connections, a track record for value creation, and investor expectations for value creation. The majority of African American women-led startups raise $42,000 from largely informal networks. Criteria weighted on the side of ‘track record for value creation’ and ‘investor expectations for value creation’ devalues the immense contributions of African American women leading the charge on thoughtful and necessary tech. Had Forbes used criteria for innovation that recognized emergent leadership, novel problem-solving, or original thinking outside the circles of already well-known and well-established entrepreneurs we might have learned something new. Instead, we're basically reminded that "it takes money to make money."Meanwhile, African American women are the fastest-growing demographic of entrepreneurs in the United States. Their contributions to tech, amongst other fields, are cementing the importance of African American women in the innovation space. And they are doing this within and outside traditional tech frameworks. By becoming familiar with these entrepreneurs and their work, we can elevate their reputation and broaden our collective recognition of innovative leaders.In honor of black history month, we have compiled a list of African American women founders leading the way in tech innovation from Alabama to the Bay Area. From rethinking energy to debt forgiveness platforms these women are crossing boundaries in every field. Cultivating New Leaders Photo of Kathryn Finney, courtesy of Forbes.com. Kathryn Finney founder of DigitalundividedKathryn A. Finney is an American author, researcher, investor, entrepreneur, innovator and businesswoman. She is the founder and CEO of digitalundivided, a social enterprise that leads high potential Black and Latinx women founders through the startup pipeline from idea to exit.Laura Weidman Co-founder Code2040Laura Weidman Powers is the co-founder and executive director of Code2040, a nonprofit that creates access, awareness, and opportunities for minority engineering talent to ensure their leadership in the innovation economy.Angelica Ross founder of TransTech Social Enterprises Angelica Ross is an American businesswoman, actress, and transgender rights advocate. After becoming a self-taught computer coder, she went on to become the founder and CEO of TransTech Social Enterprises, a firm that helps employ transgender people in the tech industry.Christina Souffrant Ntim co-founder of Global Startup EcosystemChristina Souffrant Ntim is the co-founder of award-winning digital accelerator platform – Global Startup Ecosystem which graduates over 1000+ companies across 90+ countries a year.Media and EntertainmentBryanda Law founder of QuirktasticBryanda Law is the founder of Quirktastic, a modern media-tech company on a mission to grow the largest and most authentically engaged community of fandom-loving people of color.Morgan Debaun founder of Blavity Inc. Morgan DeBaun is an African American entrepreneur. She is the Founder and CEO of Blavity Inc., a portfolio of brands and websites created by and for black millennialsCheryl Contee co-founder of Do Big ThingsCheryl Contee is the award-winning CEO and co-founder of Do Big Things, a digital agency that creates new narratives and tech for a new era focused on causes and campaigns. Photo of Farah Allen, courtesy of The Source Magazine. Farah Allen founder of The Labz Farah Allen is the CEO and founder of The Labz, a collaborative workspace that provides automated tracking, rights management, protection—using Blockchain technology—of your music files during and after you create them.Health/Wellness Mara Lidey co-founder of Shine Marah Lidey is the co-founder & co-CEO of Shine. Shine aims to reinvent health and wellness for millennials through messaging technology.Alicia Thomas co-founder of Dibs Alicia Thomas is the founder and CEO of Dibs, a B2B digital platform that gives studios quick and easy access to real-time pricing for fitness classes. Photo of Erica Plybeah, courtesy of BetterTennessee.com Erica Plybeah Hemphill founder of MedHaul Erica Plybeah Hemphill is the founder of MedHaul. MedHaul offers cloud-based solutions that ease the burdens of managing patient transportation.Star Cunningham founder of 4D HealthwareStar Cunningham is the founder and CEO of 4D Healthware. 4D Healthware is patient engagement software that makes personalized medicine possible through connected data.Kimberly Wilson founder of HUEDKimberly Wilson is the founder of HUED. HUED is a healthcare technology startup that helps patients find and book appointments with Black and Latinx healthcare providers. Financial Viola Llewellyn co-founder of Ovamba SolutionsViola Llewellyn is the co-founder and the president of Ovamba Solutions, a US-based fintech company that provides micro, small, and medium enterprises in Africa and the Middle East with microfinance through a mobile platform.NanaEfua Baidoo Afoh-Manin, Briana DeCuir and Joanne Moreau founders of Shared Harvest FundNanaEfua, Briana and Joanne are the founders of Shared Harvest Fund. Shared Harvest Fund provides real opportunities for talented people to volunteer away their student loans. Photo of Sheena Allen, courtesy of People of Color in Tech. Sheena Allen founder of CapWaySheena Allen is best known as the founder and CEO of fintech company and mobile bank CapWay. Education Helen Adeosun co-founder of CareAcademyHelen Adeosun is the co-founder, president and CEO of CareAcademy, a start-up dedicated to professionalizing caregiving through online classes. CareAcademy brings professional development to caregivers at all levels. Alexandra Bernadotte founder of Beyond 12Alex Bernadotte is the founder and chief executive officer of Beyond 12, a nonprofit that integrates personalized coaching with intelligent technology to increase the number of traditionally underserved students who earn a college degree.Shani Dowell founder of PossipShani Dowell is the founder of Possip, a platform that simplifies feedback between parents, schools and districts. Learn more at possipit.com. Kaya Thomas of We Read TooKaya Thomas is an American computer scientist, app developer and writer. She is the creator of We Read Too, an iOS app that helps readers discover books for and by people of color.Kimberly Gray founder of Uvii Kimberly Gray is the founder of Uvii. Uvii helps students to communicate and collaborate on mobile with video, audio, and textNicole Neal co-founder of ProcureK12 by Noodle MarketsNicole Neal is the co-founder and CEO of ProcureK12 by Noodle Markets. ProcureK12 makes purchasing for education simple. They combine a competitive school supply marketplace with quote request tools and bid management.Beauty/Fashion/Consumer goodsRegina Gwyn founder of TresseNoireRegina Gwynn is the co-founder & CEO of TresseNoire, the leading on-location beauty booking app designed for women of color in New York City and Philadelphia.Camille Hearst co-founder of Kit.Camille Hearst is the CEO and co-founder of Kit. Kit lets experts create shoppable collections of products so their followers can buy and the experts can make some revenue from what they share. Photo of Esosa Ighodaro courtesy of Under30CEO. Esosa Ighodaro co-founder of CoSign Inc. Esosa Ighodaro is the co-founder of CoSign Inc., which was founded in 2013. CoSign is a mobile application that transfers social media content into commerce giving cash for endorsing and cosigning products and merchandise like clothing, home goods, technology and more.EnvironmentJessica Matthews founder of Uncharted PowerJessica O. Matthews is a Nigerian-American inventor, CEO and venture capitalist. She is the co-founder of Uncharted Power, which made Soccket, a soccer ball that can be used as a power generator.Etosha Cave co-founder of Opus 12 Etosha R. Cave is an American mechanical engineer based in Berkeley, California. She is the Co-Founder and Chief Scientific Officer of Opus 12, a startup that recycles carbon dioxide.Kellee James founder of Mercaris, Inc. Kellee James is the founder and CEO of Mercaris, Inc., a growing, minority-led start-up that makes efficient trading of organic and non-GMO commodities possible via market data service exchanges and trading platforms.Workplace Photo of Lisa Skeete Tatum courtesy of The Philadelphia Citezen. Lisa Skeete Tatum founder of LanditLisa Skeete Tatum is the founder and CEO of Landit, a technology platform created to increase the success and engagement of women in the workplace, and to enable companies to attract, develop, and retain high-potential, diverse talent.Netta Jenkins and Jacinta Mathis founders of Dipper Netta Jenkins and Jacinta Mathis are founders of Dipper, a platform that acts as a safe digital space for individuals of color in the workplace.Sherisse Hawkins founder of Pagedip Sherisse Hawkins is the visionary and founder of Pagedip. Pagedip is a cloud-based software solution that allows you to bring depth to digital documents, enabling people to read (text), watch (video) and do (interact) all in the same place without ever having to leave the page.Thkisha DeDe Sanogo founder of MyTAASKThkisha DeDe Sanogo is the founder of MyTAASK. MyTAASK is a personal planning platform dedicated to getting stuff done in real-time.Home Photo of Jean Brownhill, courtesy of Quartz at Work. Jean Brownhill founder of Sweeten Jean Brownhill is the founder and CEO of Sweeten, an award-winning service that helps homeowners and business owners find and manage the best vetted general contractors for major renovation projects.Reham Fagiri co-founder of AptDecoReham Fagiri is the co-founder of AptDeco. AptDeco is an online marketplace for buying and selling quality preowned furniture with pick up and delivery built into the service.Stephanie Cummings founder of Please Assist Me Stephanie Cummings is the founder and CEO of Please Assist me. Please Assist Me is an apartment task service in Nashville, TN. The organization empowers working professionals by allowing them to outsource their weekly chores to their own personal team.Law Kristina Jones co-founder of Court BuddyKristina Jones is the co-founder of Court Buddy, a service that matches clients with lawyers.Sonja Ebron and Debra Slone founders of Courtroom5Sonja Ebron and Debra Slone are the founders of Courtroom5. Courtroom5 helps you represent yourself in court with tools, training, and community designed for pro se litigants.Crowdfunding Zuley Clarke founder of Business Gift RegistryZuley Clarke is the founder of Business Gift Registry, a crowdfunding platform that lets friends and family support an entrepreneur through gift-giving just like they would support a couple for a wedding. Full Article News & Culture
ad So You've Written a Bad Design Take By feedproxy.google.com Published On :: Tue, 05 May 2020 08:00:00 -0400 So you’ve just written a blog post or tweet about why wireframes are becoming obsolete, the dangers of “too accessible” design, or how a certain style of icon creates “cognitive fatigue.” Your post went viral, but now you’re getting ratioed by rude people on the Internet. That sucks! You were just trying to start a conversation and you probably didn’t deserve all that negativity (except for you, “too accessible” guy). Most likely, you made one of these common mistakes: 1. You made generalizations about “design” You, a good user-centered designer, know that you are not your user. Nor are you every designer. First of all, let's acknowledge that there is no universal definition of design. Even if we narrow it down to software design, it’s still hard to make generalizations. Agency, in-house, product, startup, enterprise, non-profit, website, app, connected hardware, etc. – there are a lot of different work contexts and cultures for people with “designer” in their titles. "The Design Industry" is not a thing, but even if it were, you don't speak for it. Don’t assume that the kind of design work you do is the universal default. 2. You didn’t share enough context There are many great design books and few great design blog posts. (There are, to my knowledge, no great design tweets, but I am open to your suggestions.) Writing about design is not well suited to short formats, because context plays such an important role and there’s always a lot of it to cover. Writing about your work should include as much context as you would include if you were presenting your portfolio for a job interview. What kind of organization did you work for? Who was your client and/or your stakeholders? What was the goal of the project? Your timeline? What was the makeup of your team? What were the notable business rules and constraints? How are you defining effectiveness and success? Without these kinds of details, it’s not possible for other designers to know if what you’ve written is credible or applicable to them. 3. You were too certain A blog post doesn’t need to be a dissertation. It’s okay to share hunches and anecdotes, but give the necessary caveats. And if you're making claims about science, bruh, you gotta cite your sources. Be humble in your takes. Your account of what worked for you and why is more valuable to your peers than making sweeping claims and reheating the same old arguments. Be prepared to be told you’re wrong, and have the humility to realize that your perspective is just your perspective. Real conversations, like good design, are built on feedback and diverse viewpoints. — Together, we can improve the discourse in our information ecosystems. Don't generalize. Give context. Be humble. Full Article Design & Content User Experience
ad If You’re Using Beaver Builder Lite, You Need This Addon By feedproxy.google.com Published On :: Wed, 15 Apr 2020 16:22:52 +0000 Hey there, I’m Ben, and I’m a guest author here at WPZOOM. Today I thought I’d share with you my experience of one of their rather awesome plugins, an addon for Beaver Builder. I know the team at WPZOOM are big fans of Beaver Builder, why not? It’s a great page builder with an excellent feature set; chances are if […] Full Article Plugins
ad Concurrency & Multithreading in iOS By feedproxy.google.com Published On :: Tue, 25 Feb 2020 08:00:00 -0500 Concurrency is the notion of multiple things happening at the same time. This is generally achieved either via time-slicing, or truly in parallel if multiple CPU cores are available to the host operating system. We've all experienced a lack of concurrency, most likely in the form of an app freezing up when running a heavy task. UI freezes don't necessarily occur due to the absence of concurrency — they could just be symptoms of buggy software — but software that doesn't take advantage of all the computational power at its disposal is going to create these freezes whenever it needs to do something resource-intensive. If you've profiled an app hanging in this way, you'll probably see a report that looks like this: Anything related to file I/O, data processing, or networking usually warrants a background task (unless you have a very compelling excuse to halt the entire program). There aren't many reasons that these tasks should block your user from interacting with the rest of your application. Consider how much better the user experience of your app could be if instead, the profiler reported something like this: Analyzing an image, processing a document or a piece of audio, or writing a sizeable chunk of data to disk are examples of tasks that could benefit greatly from being delegated to background threads. Let's dig into how we can enforce such behavior into our iOS applications. A Brief History In the olden days, the maximum amount of work per CPU cycle that a computer could perform was determined by the clock speed. As processor designs became more compact, heat and physical constraints started becoming limiting factors for higher clock speeds. Consequentially, chip manufacturers started adding additional processor cores on each chip in order to increase total performance. By increasing the number of cores, a single chip could execute more CPU instructions per cycle without increasing its speed, size, or thermal output. There's just one problem... How can we take advantage of these extra cores? Multithreading. Multithreading is an implementation handled by the host operating system to allow the creation and usage of n amount of threads. Its main purpose is to provide simultaneous execution of two or more parts of a program to utilize all available CPU time. Multithreading is a powerful technique to have in a programmer's toolbelt, but it comes with its own set of responsibilities. A common misconception is that multithreading requires a multi-core processor, but this isn't the case — single-core CPUs are perfectly capable of working on many threads, but we'll take a look in a bit as to why threading is a problem in the first place. Before we dive in, let's look at the nuances of what concurrency and parallelism mean using a simple diagram: In the first situation presented above, we observe that tasks can run concurrently, but not in parallel. This is similar to having multiple conversations in a chatroom, and interleaving (context-switching) between them, but never truly conversing with two people at the same time. This is what we call concurrency. It is the illusion of multiple things happening at the same time when in reality, they're switching very quickly. Concurrency is about dealing with lots of things at the same time. Contrast this with the parallelism model, in which both tasks run simultaneously. Both execution models exhibit multithreading, which is the involvement of multiple threads working towards one common goal. Multithreading is a generalized technique for introducing a combination of concurrency and parallelism into your program. The Burden of Threads A modern multitasking operating system like iOS has hundreds of programs (or processes) running at any given moment. However, most of these programs are either system daemons or background processes that have very low memory footprint, so what is really needed is a way for individual applications to make use of the extra cores available. An application (process) can have many threads (sub-processes) operating on shared memory. Our goal is to be able to control these threads and use them to our advantage. Historically, introducing concurrency to an app has required the creation of one or more threads. Threads are low-level constructs that need to be managed manually. A quick skim through Apple's Threaded Programming Guide is all it takes to see how much complexity threaded code adds to a codebase. In addition to building an app, the developer has to: Responsibly create new threads, adjusting that number dynamically as system conditions change Manage them carefully, deallocating them from memory once they have finished executing Leverage synchronization mechanisms like mutexes, locks, and semaphores to orchestrate resource access between threads, adding even more overhead to application code Mitigate risks associated with coding an application that assumes most of the costs associated with creating and maintaining any threads it uses, and not the host OS This is unfortunate, as it adds enormous levels of complexity and risk without any guarantees of improved performance. Grand Central Dispatch iOS takes an asynchronous approach to solving the concurrency problem of managing threads. Asynchronous functions are common in most programming environments, and are often used to initiate tasks that might take a long time, like reading a file from the disk, or downloading a file from the web. When invoked, an asynchronous function executes some work behind the scenes to start a background task, but returns immediately, regardless of how long the original task might takes to actually complete. A core technology that iOS provides for starting tasks asynchronously is Grand Central Dispatch (or GCD for short). GCD abstracts away thread management code and moves it down to the system level, exposing a light API to define tasks and execute them on an appropriate dispatch queue. GCD takes care of all thread management and scheduling, providing a holistic approach to task management and execution, while also providing better efficiency than traditional threads. Let's take a look at the main components of GCD: What've we got here? Let's start from the left: DispatchQueue.main: The main thread, or the UI thread, is backed by a single serial queue. All tasks are executed in succession, so it is guaranteed that the order of execution is preserved. It is crucial that you ensure all UI updates are designated to this queue, and that you never run any blocking tasks on it. We want to ensure that the app's run loop (called CFRunLoop) is never blocked in order to maintain the highest framerate. Subsequently, the main queue has the highest priority, and any tasks pushed onto this queue will get executed immediately. DispatchQueue.global: A set of global concurrent queues, each of which manage their own pool of threads. Depending on the priority of your task, you can specify which specific queue to execute your task on, although you should resort to using default most of the time. Because tasks on these queues are executed concurrently, it doesn't guarantee preservation of the order in which tasks were queued. Notice how we're not dealing with individual threads anymore? We're dealing with queues which manage a pool of threads internally, and you will shortly see why queues are a much more sustainable approach to multhreading. Serial Queues: The Main Thread As an exercise, let's look at a snippet of code below, which gets fired when the user presses a button in the app. The expensive compute function can be anything. Let's pretend it is post-processing an image stored on the device. import UIKit class ViewController: UIViewController { @IBAction func handleTap(_ sender: Any) { compute() } private func compute() -> Void { // Pretending to post-process a large image. var counter = 0 for _ in 0..<9999999 { counter += 1 } } } At first glance, this may look harmless, but if you run this inside of a real app, the UI will freeze completely until the loop is terminated, which will take... a while. We can prove it by profiling this task in Instruments. You can fire up the Time Profiler module of Instruments by going to Xcode > Open Developer Tool > Instruments in Xcode's menu options. Let's look at the Threads module of the profiler and see where the CPU usage is highest. We can see that the Main Thread is clearly at 100% capacity for almost 5 seconds. That's a non-trivial amount of time to block the UI. Looking at the call tree below the chart, we can see that the Main Thread is at 99.9% capacity for 4.43 seconds! Given that a serial queue works in a FIFO manner, tasks will always complete in the order in which they were inserted. Clearly the compute() method is the culprit here. Can you imagine clicking a button just to have the UI freeze up on you for that long? Background Threads How can we make this better? DispatchQueue.global() to the rescue! This is where background threads come in. Referring to the GCD architecture diagram above, we can see that anything that is not the Main Thread is a background thread in iOS. They can run alongside the Main Thread, leaving it fully unoccupied and ready to handle other UI events like scrolling, responding to user events, animating etc. Let's make a small change to our button click handler above: class ViewController: UIViewController { @IBAction func handleTap(_ sender: Any) { DispatchQueue.global(qos: .userInitiated).async { [unowned self] in self.compute() } } private func compute() -> Void { // Pretending to post-process a large image. var counter = 0 for _ in 0..<9999999 { counter += 1 } } } Unless specified, a snippet of code will usually default to execute on the Main Queue, so in order to force it to execute on a different thread, we'll wrap our compute call inside of an asynchronous closure that gets submitted to the DispatchQueue.global queue. Keep in mind that we aren't really managing threads here. We're submitting tasks (in the form of closures or blocks) to the desired queue with the assumption that it is guaranteed to execute at some point in time. The queue decides which thread to allocate the task to, and it does all the hard work of assessing system requirements and managing the actual threads. This is the magic of Grand Central Dispatch. As the old adage goes, you can't improve what you can't measure. So we measured our truly terrible button click handler, and now that we've improved it, we'll measure it once again to get some concrete data with regards to performance. Looking at the profiler again, it's quite clear to us that this is a huge improvement. The task takes an identical amount of time, but this time, it's happening in the background without locking up the UI. Even though our app is doing the same amount of work, the perceived performance is much better because the user will be free to do other things while the app is processing. You may have noticed that we accessed a global queue of .userInitiated priority. This is an attribute we can use to give our tasks a sense of urgency. If we run the same task on a global queue of and pass it a qos attribute of background , iOS will think it's a utility task, and thus allocate fewer resources to execute it. So, while we don't have control over when our tasks get executed, we do have control over their priority. A Note on Main Thread vs. Main Queue You might be wondering why the Profiler shows "Main Thread" and why we're referring to it as the "Main Queue". If you refer back to the GCD architecture we described above, the Main Queue is solely responsible for managing the Main Thread. The Dispatch Queues section in the Concurrency Programming Guide says that "the main dispatch queue is a globally available serial queue that executes tasks on the application’s main thread. Because it runs on your application’s main thread, the main queue is often used as a key synchronization point for an application." The terms "execute on the Main Thread" and "execute on the Main Queue" can be used interchangeably. Concurrent Queues So far, our tasks have been executed exclusively in a serial manner. DispatchQueue.main is by default a serial queue, and DispatchQueue.global gives you four concurrent dispatch queues depending on the priority parameter you pass in. Let's say we want to take five images, and have our app process them all in parallel on background threads. How would we go about doing that? We can spin up a custom concurrent queue with an identifier of our choosing, and allocate those tasks there. All that's required is the .concurrent attribute during the construction of the queue. class ViewController: UIViewController { let queue = DispatchQueue(label: "com.app.concurrentQueue", attributes: .concurrent) let images: [UIImage] = [UIImage].init(repeating: UIImage(), count: 5) @IBAction func handleTap(_ sender: Any) { for img in images { queue.async { [unowned self] in self.compute(img) } } } private func compute(_ img: UIImage) -> Void { // Pretending to post-process a large image. var counter = 0 for _ in 0..<9999999 { counter += 1 } } } Running that through the profiler, we can see that the app is now spinning up 5 discrete threads to parallelize a for-loop. Parallelization of N Tasks So far, we've looked at pushing computationally expensive task(s) onto background threads without clogging up the UI thread. But what about executing parallel tasks with some restrictions? How can Spotify download multiple songs in parallel, while limiting the maximum number up to 3? We can go about this in a few ways, but this is a good time to explore another important construct in multithreaded programming: semaphores. Semaphores are signaling mechanisms. They are commonly used to control access to a shared resource. Imagine a scenario where a thread can lock access to a certain section of the code while it executes it, and unlocks after it's done to let other threads execute the said section of the code. You would see this type of behavior in database writes and reads, for example. What if you want only one thread writing to a database and preventing any reads during that time? This is a common concern in thread-safety called Readers-writer lock. Semaphores can be used to control concurrency in our app by allowing us to lock n number of threads. let kMaxConcurrent = 3 // Or 1 if you want strictly ordered downloads! let semaphore = DispatchSemaphore(value: kMaxConcurrent) let downloadQueue = DispatchQueue(label: "com.app.downloadQueue", attributes: .concurrent) class ViewController: UIViewController { @IBAction func handleTap(_ sender: Any) { for i in 0..<15 { downloadQueue.async { [unowned self] in // Lock shared resource access semaphore.wait() // Expensive task self.download(i + 1) // Update the UI on the main thread, always! DispatchQueue.main.async { tableView.reloadData() // Release the lock semaphore.signal() } } } } func download(_ songId: Int) -> Void { var counter = 0 // Simulate semi-random download times. for _ in 0..<Int.random(in: 999999...10000000) { counter += songId } } } Notice how we've effectively restricted our download system to limit itself to k number of downloads. The moment one download finishes (or thread is done executing), it decrements the semaphore, allowing the managing queue to spawn another thread and start downloading another song. You can apply a similar pattern to database transactions when dealing with concurrent reads and writes. Semaphores usually aren't necessary for code like the one in our example, but they become more powerful when you need to enforce synchronous behavior whille consuming an asynchronous API. The above could would work just as well with a custom NSOperationQueue with a maxConcurrentOperationCount, but it's a worthwhile tangent regardless. Finer Control with OperationQueue GCD is great when you want to dispatch one-off tasks or closures into a queue in a 'set-it-and-forget-it' fashion, and it provides a very lightweight way of doing so. But what if we want to create a repeatable, structured, long-running task that produces associated state or data? And what if we want to model this chain of operations such that they can be cancelled, suspended and tracked, while still working with a closure-friendly API? Imagine an operation like this: This would be quite cumbersome to achieve with GCD. We want a more modular way of defining a group of tasks while maintaining readability and also exposing a greater amount of control. In this case, we can use Operation objects and queue them onto an OperationQueue, which is a high-level wrapper around DispatchQueue. Let's look at some of the benefits of using these abstractions and what they offer in comparison to the lower-level GCI API: You may want to create dependencies between tasks, and while you could do this via GCD, you're better off defining them concretely as Operation objects, or units of work, and pushing them onto your own queue. This would allow for maximum reusability since you may use the same pattern elsewhere in an application. The Operation and OperationQueue classes have a number of properties that can be observed, using KVO (Key Value Observing). This is another important benefit if you want to monitor the state of an operation or operation queue. Operations can be paused, resumed, and cancelled. Once you dispatch a task using Grand Central Dispatch, you no longer have control or insight into the execution of that task. The Operation API is more flexible in that respect, giving the developer control over the operation's life cycle. OperationQueue allows you to specify the maximum number of queued operations that can run simultaneously, giving you a finer degree of control over the concurrency aspects. The usage of Operation and OperationQueue could fill an entire blog post, but let's look at a quick example of what modeling dependencies looks like. (GCD can also create dependencies, but you're better off dividing up large tasks into a series of composable sub-tasks.) In order to create a chain of operations that depend on one another, we could do something like this: class ViewController: UIViewController { var queue = OperationQueue() var rawImage = UIImage? = nil let imageUrl = URL(string: "https://example.com/portrait.jpg")! @IBOutlet weak var imageView: UIImageView! let downloadOperation = BlockOperation { let image = Downloader.downloadImageWithURL(url: imageUrl) OperationQueue.main.async { self.rawImage = image } } let filterOperation = BlockOperation { let filteredImage = ImgProcessor.addGaussianBlur(self.rawImage) OperationQueue.main.async { self.imageView = filteredImage } } filterOperation.addDependency(downloadOperation) [downloadOperation, filterOperation].forEach { queue.addOperation($0) } } So why not opt for a higher level abstraction and avoid using GCD entirely? While GCD is ideal for inline asynchronous processing, Operation provides a more comprehensive, object-oriented model of computation for encapsulating all of the data around structured, repeatable tasks in an application. Developers should use the highest level of abstraction possible for any given problem, and for scheduling consistent, repeated work, that abstraction is Operation. Other times, it makes more sense to sprinkle in some GCD for one-off tasks or closures that we want to fire. We can mix both OperationQueue and GCD to get the best of both worlds. The Cost of Concurrency DispatchQueue and friends are meant to make it easier for the application developer to execute code concurrently. However, these technologies do not guarantee improvements to the efficiency or responsiveness in an application. It is up to you to use queues in a manner that is both effective and does not impose an undue burden on other resources. For example, it's totally viable to create 10,000 tasks and submit them to a queue, but doing so would allocate a nontrivial amount of memory and introduce a lot of overhead for the allocation and deallocation of operation blocks. This is the opposite of what you want! It's best to profile your app thoroughly to ensure that concurrency is enhancing your app's performance and not degrading it. We've talked about how concurrency comes at a cost in terms of complexity and allocation of system resources, but introducing concurrency also brings a host of other risks like: Deadlock: A situation where a thread locks a critical portion of the code and can halt the application's run loop entirely. In the context of GCD, you should be very careful when using the dispatchQueue.sync { } calls as you could easily get yourself in situations where two synchronous operations can get stuck waiting for each other. Priority Inversion: A condition where a lower priority task blocks a high priority task from executing, which effectively inverts their priorities. GCD allows for different levels of priority on its background queues, so this is quite easily a possibility. Producer-Consumer Problem: A race condition where one thread is creating a data resource while another thread is accessing it. This is a synchronization problem, and can be solved using locks, semaphores, serial queues, or a barrier dispatch if you're using concurrent queues in GCD. ...and many other sorts of locking and data-race conditions that are hard to debug! Thread safety is of the utmost concern when dealing with concurrency. Parting Thoughts + Further Reading If you've made it this far, I applaud you. Hopefully this article gives you a lay of the land when it comes to multithreading techniques on iOS, and how you can use some of them in your app. We didn't get to cover many of the lower-level constructs like locks, mutexes and how they help us achieve synchronization, nor did we get to dive into concrete examples of how concurrency can hurt your app. We'll save those for another day, but you can dig into some additional reading and videos if you're eager to dive deeper. Building Concurrent User Interfaces on iOS (WWDC 2012) Concurrency and Parallelism: Understanding I/O Apple's Official Concurrency Programming Guide Mutexes and Closure Capture in Swift Locks, Thread Safety, and Swift Advanced NSOperations (WWDC 2015) NSHipster: NSOperation Full Article Code
ad African American Women Leading in Tech By feedproxy.google.com Published On :: Tue, 25 Feb 2020 08:05:00 -0500 “Close your eyes and name three people who have impacted the tech industry.”In all likelihood, that list might be overwhelmingly white and male. And you are not alone. Numerous lists online yielded the same results. In recent years, many articles have chronicled the dearth of diversity in tech. Studies have shown the ways in which venture capital firms have systematically underestimated and undervalued innovation coming particularly from women of color. In 2016 only 88 tech startups were led by African American women, in 2018 this number had climbed to a little over 200. Between 2009 and 2017, African American women raised $289MM in venture/angel funding. For perspective, this only represents .0006% of the $424.7B in total tech venture funding raised in that same time frame. In 2018, only 34 African American women had ever raised more than a million in venture funding. When it comes to innovation, it is not unusual for financial value to be the biggest predictor of what is considered innovative. In fact, a now largely controversial list posted by Forbes of America’s most innovative leaders in the fall of 2019 featured 99 men and one woman. Ironically, what was considered innovative was, in fact, very traditional in its presentation. The criteria used for the list was “media reputation for innovation,” social connections, a track record for value creation, and investor expectations for value creation. The majority of African American women-led startups raise $42,000 from largely informal networks. Criteria weighted on the side of ‘track record for value creation’ and ‘investor expectations for value creation’ devalues the immense contributions of African American women leading the charge on thoughtful and necessary tech. Had Forbes used criteria for innovation that recognized emergent leadership, novel problem-solving, or original thinking outside the circles of already well-known and well-established entrepreneurs we might have learned something new. Instead, we're basically reminded that "it takes money to make money."Meanwhile, African American women are the fastest-growing demographic of entrepreneurs in the United States. Their contributions to tech, amongst other fields, are cementing the importance of African American women in the innovation space. And they are doing this within and outside traditional tech frameworks. By becoming familiar with these entrepreneurs and their work, we can elevate their reputation and broaden our collective recognition of innovative leaders.In honor of black history month, we have compiled a list of African American women founders leading the way in tech innovation from Alabama to the Bay Area. From rethinking energy to debt forgiveness platforms these women are crossing boundaries in every field. Cultivating New Leaders Photo of Kathryn Finney, courtesy of Forbes.com. Kathryn Finney founder of DigitalundividedKathryn A. Finney is an American author, researcher, investor, entrepreneur, innovator and businesswoman. She is the founder and CEO of digitalundivided, a social enterprise that leads high potential Black and Latinx women founders through the startup pipeline from idea to exit.Laura Weidman Co-founder Code2040Laura Weidman Powers is the co-founder and executive director of Code2040, a nonprofit that creates access, awareness, and opportunities for minority engineering talent to ensure their leadership in the innovation economy.Angelica Ross founder of TransTech Social Enterprises Angelica Ross is an American businesswoman, actress, and transgender rights advocate. After becoming a self-taught computer coder, she went on to become the founder and CEO of TransTech Social Enterprises, a firm that helps employ transgender people in the tech industry.Christina Souffrant Ntim co-founder of Global Startup EcosystemChristina Souffrant Ntim is the co-founder of award-winning digital accelerator platform – Global Startup Ecosystem which graduates over 1000+ companies across 90+ countries a year.Media and EntertainmentBryanda Law founder of QuirktasticBryanda Law is the founder of Quirktastic, a modern media-tech company on a mission to grow the largest and most authentically engaged community of fandom-loving people of color.Morgan Debaun founder of Blavity Inc. Morgan DeBaun is an African American entrepreneur. She is the Founder and CEO of Blavity Inc., a portfolio of brands and websites created by and for black millennialsCheryl Contee co-founder of Do Big ThingsCheryl Contee is the award-winning CEO and co-founder of Do Big Things, a digital agency that creates new narratives and tech for a new era focused on causes and campaigns. Photo of Farah Allen, courtesy of The Source Magazine. Farah Allen founder of The Labz Farah Allen is the CEO and founder of The Labz, a collaborative workspace that provides automated tracking, rights management, protection—using Blockchain technology—of your music files during and after you create them.Health/Wellness Mara Lidey co-founder of Shine Marah Lidey is the co-founder & co-CEO of Shine. Shine aims to reinvent health and wellness for millennials through messaging technology.Alicia Thomas co-founder of Dibs Alicia Thomas is the founder and CEO of Dibs, a B2B digital platform that gives studios quick and easy access to real-time pricing for fitness classes. Photo of Erica Plybeah, courtesy of BetterTennessee.com Erica Plybeah Hemphill founder of MedHaul Erica Plybeah Hemphill is the founder of MedHaul. MedHaul offers cloud-based solutions that ease the burdens of managing patient transportation.Star Cunningham founder of 4D HealthwareStar Cunningham is the founder and CEO of 4D Healthware. 4D Healthware is patient engagement software that makes personalized medicine possible through connected data.Kimberly Wilson founder of HUEDKimberly Wilson is the founder of HUED. HUED is a healthcare technology startup that helps patients find and book appointments with Black and Latinx healthcare providers. Financial Viola Llewellyn co-founder of Ovamba SolutionsViola Llewellyn is the co-founder and the president of Ovamba Solutions, a US-based fintech company that provides micro, small, and medium enterprises in Africa and the Middle East with microfinance through a mobile platform.NanaEfua Baidoo Afoh-Manin, Briana DeCuir and Joanne Moreau founders of Shared Harvest FundNanaEfua, Briana and Joanne are the founders of Shared Harvest Fund. Shared Harvest Fund provides real opportunities for talented people to volunteer away their student loans. Photo of Sheena Allen, courtesy of People of Color in Tech. Sheena Allen founder of CapWaySheena Allen is best known as the founder and CEO of fintech company and mobile bank CapWay. Education Helen Adeosun co-founder of CareAcademyHelen Adeosun is the co-founder, president and CEO of CareAcademy, a start-up dedicated to professionalizing caregiving through online classes. CareAcademy brings professional development to caregivers at all levels. Alexandra Bernadotte founder of Beyond 12Alex Bernadotte is the founder and chief executive officer of Beyond 12, a nonprofit that integrates personalized coaching with intelligent technology to increase the number of traditionally underserved students who earn a college degree.Shani Dowell founder of PossipShani Dowell is the founder of Possip, a platform that simplifies feedback between parents, schools and districts. Learn more at possipit.com. Kaya Thomas of We Read TooKaya Thomas is an American computer scientist, app developer and writer. She is the creator of We Read Too, an iOS app that helps readers discover books for and by people of color.Kimberly Gray founder of Uvii Kimberly Gray is the founder of Uvii. Uvii helps students to communicate and collaborate on mobile with video, audio, and textNicole Neal co-founder of ProcureK12 by Noodle MarketsNicole Neal is the co-founder and CEO of ProcureK12 by Noodle Markets. ProcureK12 makes purchasing for education simple. They combine a competitive school supply marketplace with quote request tools and bid management.Beauty/Fashion/Consumer goodsRegina Gwyn founder of TresseNoireRegina Gwynn is the co-founder & CEO of TresseNoire, the leading on-location beauty booking app designed for women of color in New York City and Philadelphia.Camille Hearst co-founder of Kit.Camille Hearst is the CEO and co-founder of Kit. Kit lets experts create shoppable collections of products so their followers can buy and the experts can make some revenue from what they share. Photo of Esosa Ighodaro courtesy of Under30CEO. Esosa Ighodaro co-founder of CoSign Inc. Esosa Ighodaro is the co-founder of CoSign Inc., which was founded in 2013. CoSign is a mobile application that transfers social media content into commerce giving cash for endorsing and cosigning products and merchandise like clothing, home goods, technology and more.EnvironmentJessica Matthews founder of Uncharted PowerJessica O. Matthews is a Nigerian-American inventor, CEO and venture capitalist. She is the co-founder of Uncharted Power, which made Soccket, a soccer ball that can be used as a power generator.Etosha Cave co-founder of Opus 12 Etosha R. Cave is an American mechanical engineer based in Berkeley, California. She is the Co-Founder and Chief Scientific Officer of Opus 12, a startup that recycles carbon dioxide.Kellee James founder of Mercaris, Inc. Kellee James is the founder and CEO of Mercaris, Inc., a growing, minority-led start-up that makes efficient trading of organic and non-GMO commodities possible via market data service exchanges and trading platforms.Workplace Photo of Lisa Skeete Tatum courtesy of The Philadelphia Citezen. Lisa Skeete Tatum founder of LanditLisa Skeete Tatum is the founder and CEO of Landit, a technology platform created to increase the success and engagement of women in the workplace, and to enable companies to attract, develop, and retain high-potential, diverse talent.Netta Jenkins and Jacinta Mathis founders of Dipper Netta Jenkins and Jacinta Mathis are founders of Dipper, a platform that acts as a safe digital space for individuals of color in the workplace.Sherisse Hawkins founder of Pagedip Sherisse Hawkins is the visionary and founder of Pagedip. Pagedip is a cloud-based software solution that allows you to bring depth to digital documents, enabling people to read (text), watch (video) and do (interact) all in the same place without ever having to leave the page.Thkisha DeDe Sanogo founder of MyTAASKThkisha DeDe Sanogo is the founder of MyTAASK. MyTAASK is a personal planning platform dedicated to getting stuff done in real-time.Home Photo of Jean Brownhill, courtesy of Quartz at Work. Jean Brownhill founder of Sweeten Jean Brownhill is the founder and CEO of Sweeten, an award-winning service that helps homeowners and business owners find and manage the best vetted general contractors for major renovation projects.Reham Fagiri co-founder of AptDecoReham Fagiri is the co-founder of AptDeco. AptDeco is an online marketplace for buying and selling quality preowned furniture with pick up and delivery built into the service.Stephanie Cummings founder of Please Assist Me Stephanie Cummings is the founder and CEO of Please Assist me. Please Assist Me is an apartment task service in Nashville, TN. The organization empowers working professionals by allowing them to outsource their weekly chores to their own personal team.Law Kristina Jones co-founder of Court BuddyKristina Jones is the co-founder of Court Buddy, a service that matches clients with lawyers.Sonja Ebron and Debra Slone founders of Courtroom5Sonja Ebron and Debra Slone are the founders of Courtroom5. Courtroom5 helps you represent yourself in court with tools, training, and community designed for pro se litigants.Crowdfunding Zuley Clarke founder of Business Gift RegistryZuley Clarke is the founder of Business Gift Registry, a crowdfunding platform that lets friends and family support an entrepreneur through gift-giving just like they would support a couple for a wedding. Full Article News & Culture
ad So You've Written a Bad Design Take By feedproxy.google.com Published On :: Tue, 05 May 2020 08:00:00 -0400 So you’ve just written a blog post or tweet about why wireframes are becoming obsolete, the dangers of “too accessible” design, or how a certain style of icon creates “cognitive fatigue.” Your post went viral, but now you’re getting ratioed by rude people on the Internet. That sucks! You were just trying to start a conversation and you probably didn’t deserve all that negativity (except for you, “too accessible” guy). Most likely, you made one of these common mistakes: 1. You made generalizations about “design” You, a good user-centered designer, know that you are not your user. Nor are you every designer. First of all, let's acknowledge that there is no universal definition of design. Even if we narrow it down to software design, it’s still hard to make generalizations. Agency, in-house, product, startup, enterprise, non-profit, website, app, connected hardware, etc. – there are a lot of different work contexts and cultures for people with “designer” in their titles. "The Design Industry" is not a thing, but even if it were, you don't speak for it. Don’t assume that the kind of design work you do is the universal default. 2. You didn’t share enough context There are many great design books and few great design blog posts. (There are, to my knowledge, no great design tweets, but I am open to your suggestions.) Writing about design is not well suited to short formats, because context plays such an important role and there’s always a lot of it to cover. Writing about your work should include as much context as you would include if you were presenting your portfolio for a job interview. What kind of organization did you work for? Who was your client and/or your stakeholders? What was the goal of the project? Your timeline? What was the makeup of your team? What were the notable business rules and constraints? How are you defining effectiveness and success? Without these kinds of details, it’s not possible for other designers to know if what you’ve written is credible or applicable to them. 3. You were too certain A blog post doesn’t need to be a dissertation. It’s okay to share hunches and anecdotes, but give the necessary caveats. And if you're making claims about science, bruh, you gotta cite your sources. Be humble in your takes. Your account of what worked for you and why is more valuable to your peers than making sweeping claims and reheating the same old arguments. Be prepared to be told you’re wrong, and have the humility to realize that your perspective is just your perspective. Real conversations, like good design, are built on feedback and diverse viewpoints. — Together, we can improve the discourse in our information ecosystems. Don't generalize. Give context. Be humble. Full Article Design & Content User Experience
ad The Design Thinking Process Paradox By feedproxy.google.com Published On :: Mon, 04 Nov 2019 07:39:47 +0000 Designers or Design Thinkers often like to think that they require a certain level of “freedom” to allow their creativity... The post The Design Thinking Process Paradox appeared first on Design Sojourn. Please click above if you cannot see this post. Full Article Design Process Design designthinking innovation
ad Stadsbewegwijzering By designworkplan.com Published On :: Fri, 14 Dec 2012 11:01:53 +0000 City Marketing, bewegwijzering en informatie spelen een belangrijke rol in hoe communicatie in een stad effectief tot stand kan komen. Lees verder over hoe bewegwijzering ingezet kan worden als communicatie middel. Full Article blog Bewegwijzering blognl nl
ad TADTas website By traceygrady.com Published On :: Thu, 19 Feb 2015 04:54:44 +0000 Select each thumbnail to view the full image × × Full Article Uncategorised
ad Recent Work: TADTas website By traceygrady.com Published On :: Wed, 22 Apr 2015 10:36:53 +0000 The internet holds a lot of potential for non-profits to get their message out, build an audience and raise money. Using the web to tell stories about helping people in need can be very effective for a non-profit organisation looking for new avenues to generate income and build support in other ways such as a […] Full Article Design work accessible content strategy non-profit portfolio responsive Tasmania web design
ad An Inferno on the Head of a Pin By blog.codinghorror.com Published On :: Tue, 17 Jan 2017 11:37:18 GMT Today's processors contain billions of heat-generating transistors in an ever shrinking space. The power budget might go from: 1000 watts on a specialized server 100 watts on desktops 30 watts on laptops 5 watts on tablets 1 or 2 watts on a phone 100 milliwatts on an embedded system That's Full Article
ad Adding Block Patterns to Your Theme By feedproxy.google.com Published On :: Wed, 08 Apr 2020 17:07:49 +0000 Block patterns are unique, predefined combinations of blocks you can use and tweak to create stunningly designed sections of your website. Full Article Education Blocks Gutenberg Patterns
ad Good Cop & Bad Cop: Laying Down the Law and Keeping People Happy As an Independent Business Owner By feedproxy.google.com Published On :: Sat, 28 Apr 2012 00:51:13 +0000 Earlier this week I met up for coffee with a client of mine. The two of us originally met when his employeer was my client and after leaving that job he hired me to customize his personal blog and we formed our own client/designer relationship. I was excited when he emailed me last week with the […] Full Article Business Clients
ad Why Stealing Best Landing Pages Is a Bad Idea By hren.io Published On :: Sat, 09 May 2020 06:04:15 PDT https://hren.io/blog/stealing-best-landing-pages/ Full Article
ad Concussion had made my life a mess. So I gave my brain injury a name By feedproxy.google.com Published On :: Mon, 09 Mar 2020 14:15:12 EDT By turning 'Stella' into a punchline, laughter became my medicine and sharing my story became my therapy Full Article
ad Post-concussion treatment, suicide prevention ‘a team sport,’ says lead researcher By feedproxy.google.com Published On :: Tue, 10 Mar 2020 12:26:16 EDT Suicide attempts common in post-concussion patients, says Dr. Charles Tator of the Canadian Concussion Centre Full Article
ad Troops to receive Purple Hearts for injuries during Iranian missile barrage on al-Asad airbase in Iraq By feedproxy.google.com Published On :: Wed, 29 Apr 2020 13:50:08 EDT There will be Purple Hearts awarded to troops injured during the Jan. 8 Iranian missile barrage on the al-Asad airbase in Iraq, a defense official told Military Times. Full Article
ad Affinity Airbrush Shading Brushes for Premium Members By blog.spoongraphics.co.uk Published On :: Fri, 17 Apr 2020 07:00:36 +0000 Access All Areas members have been requesting more Affinity Designer resources, so this week members can download this great set of Airbrush Shading Brushes made specifically for Affinity, courtesy of The Artifex Forge. Add organic texture shading to designs and illustrations with ease! This versatile shading brush pack contains a wide variety of textures – […] The post Affinity Airbrush Shading Brushes for Premium Members appeared first on Spoon Graphics. Full Article Premium access all areas affinity resources
ad Add New Effects to Your Design Work with This Creative Toolkit By blog.spoongraphics.co.uk Published On :: Wed, 29 Apr 2020 07:00:12 +0000 This brand new All-Encompassing Creative Toolkit contains a variety of resources that take the hard work out of creating stunning visual effects. From ready-made assets you can copy/paste into your artwork to pro-grade tools that provide the building blocks you need to create original designs, these resources make it possible to create work in totally […] The post Add New Effects to Your Design Work with This Creative Toolkit appeared first on Spoon Graphics. Full Article News bundle deal design cuts
ad ColorWash Faded Photoshop Actions for Premium Members By blog.spoongraphics.co.uk Published On :: Fri, 01 May 2020 07:00:38 +0000 Access All Areas members have a useful set of Photoshop Actions to download this week, courtesy of FilterGrade. This ColorWash product adds colorful washes and fades to your images, using the same tints and light leaks you see in professional advertising campaigns. Add retro effects to your images in seconds by playing multiple actions at […] The post ColorWash Faded Photoshop Actions for Premium Members appeared first on Spoon Graphics. Full Article Premium access all areas actions photoshop actions retro
ad Troops to receive Purple Hearts for injuries during Iranian missile barrage on al-Asad airbase in Iraq By feedproxy.google.com Published On :: Wednesday, April 29, 2020 - 1:50pm There will be Purple Hearts awarded to troops injured during the Jan. 8 Iranian missile barrage on the al-Asad airbase in Iraq, a defense official told Military Times. Full Article
ad solar power advantages and disadvantages By solaronas.site123.me Published On :: 2019-10-05 13:56:00 Solar power is a free natural source of energy from up above, it's a gift of God, we call it the sun and it is for everyone to use. Solar cost may be much lower than you might expect. Full Article
ad How to Add Native Keyword Aliases to Babel By feedproxy.google.com Published On :: Thu, 16 Apr 2020 12:09:13 +0000 Those of you who follow this blog know that not every blog post is an endorsement of a technique but simply a tutorial how to accomplish something. Sometimes the technique described is probably not something you should do. This is one of those blog posts. The Babel parser is an essential tool in the web […] The post How to Add Native Keyword Aliases to Babel appeared first on David Walsh Blog. Full Article JavaScript Theory / Ideas
ad How to – Create a Pair of Reading Glasses Icon By feedproxy.google.com Published On :: Thu, 23 Apr 2020 14:00:05 +0000 In today’s tutorial, we’re going to take a quick look behind the process of creating a pair of reading glasses icon, and see how we can take some simple shapes and turn them into a finished usable product. So, assuming you already have the software running, let’s jump straight into it! Tutorial Details: Reading Glasses […] The post How to – Create a Pair of Reading Glasses Icon appeared first on Vectips. Full Article Tips and Tricks design glasses icon vector
ad 10 Step Tutorial: How to Design Flat Skateboards Using Adobe Illustrator By feedproxy.google.com Published On :: Tue, 28 Apr 2020 14:00:00 +0000 Summer is in full swing here in the states! It’s a perfect time to grab your skateboard and go cruising. Today we’re going to learn how to design flat skateboards and colorful vector longboards in Adobe Illustrator! We’ll be working with Clipping Masks, Stroke, and Pathfinder panel. Let’s get started! Tutorial Details Program: Adobe Illustrator CC Difficulty: […] The post 10 Step Tutorial: How to Design Flat Skateboards Using Adobe Illustrator appeared first on Vectips. Full Article Tips and Tricks adobe illustrator design flat flat style illustration illustrator illustrator tutorial longboard summer Tips tutorial vector vector illustration
ad Create a NAS Icon in Just 30 Minutes Using Adobe Illustrator By feedproxy.google.com Published On :: Thu, 30 Apr 2020 14:00:01 +0000 Welcome back to another Illustrator tutorial from our retro hardware series! In this how-to, we’re going to learn to create a NAS Icon (or a Network-Attached Storage icon) using some simple geometric shapes and tools. So, get your software up and running let’s jump straight into it! Tutorial Details: How to Create a NAS Icon Program: Adobe […] The post Create a NAS Icon in Just 30 Minutes Using Adobe Illustrator appeared first on Vectips. Full Article Tips and Tricks adobe adobe illustrator design icon illustration illustrator line line art line icon nas network network attached storage retro hardware series storage storage media storage unit
ad How to Draw a Stylized Flat Car in Adobe Illustrator By feedproxy.google.com Published On :: Thu, 07 May 2020 14:00:08 +0000 In this tutorial we’ll draw a funny cartoon car in a simple stylized flat car. We don’t actually need any advanced drawing skills or even a tablet to create this stylized object as we’ll be working with basic geometric shapes and the most useful tools of Adobe Illustrator. Such simple and trendy illustrations are perfect […] The post How to Draw a Stylized Flat Car in Adobe Illustrator appeared first on Vectips. Full Article Tips Tips and Tricks Tricks Tutorials adobe illustrator car car vector cartoon style vector flat flat design flat style stylized tutorial vector vector illustration vector tutorial
ad Unforgettable Road Trips in the UK-A new of enjoying your next travel By feedproxy.google.com Published On :: Thu, 04 Feb 2016 17:35:42 +0000 Scenic Road Trips in the UK that are Worth Capturing by Camera Some people like hiking. Some people like cycling. But, after chatting with online car dealership Carspring, it seems you can have just as much fun exploring your next trip in the complete, climate-controlled comfort of your car. Here we go through the most unforgettable road trips in England, Scotland and Wales. Drives that offer driving heaven, stunning scenery and plenty of fun along the way. All you need is the right company and you are all set to enjoy! England: Road from Glastonbury to Cheddar Gorge – Check out the route here. This route gives you a proper feel of medieval England. Begin deep in England’s spiritual realm on the outskirts of the hallowed town on Glastonbury (Therefore avoid at a certain summer weekend). Start at the Tor on the edge of town, where hippies will tell you ... Read more The post Unforgettable Road Trips in the UK-A new of enjoying your next travel appeared first on Digital Photography Tutorials. Full Article Uncategorized camera compact digital camera Photo Editing photography
ad Best Photos of 2017 by JMG-Galleries Blog Readers By feedproxy.google.com Published On :: Wed, 10 Jan 2018 08:01:37 +0000 Get ready to start 2018 off on the right foot with some creative inspiration. The results of my 11th annual Best of Photos project hopefully will provide just that by introducing you to photographers and their work from all over the world. Get ready to travel around the world in 100+ links. For those who are new to my blog project, photographers taking part span the gamut of photo enthusiasts to professionals. The great thing about photography is that no matter what your skill level we all can relate equally in our love for the art of photography and visually exploring. With that in mind I encourage you to reach out to photographers whose work you enjoy to keep sharing & growing as an artist. I am incredibly thankful that this tradition has been embraced and enjoy seeing how familiar faces have evolved their work & grown over the years. I hope reviewing your best photos of the year and comparing them to years pasts keeps you inspired and aware of your progress as a photographer. If you’d like to take part next year and be informed when submissions open for the “Best Photos of 2017? blog project add your name to my mail list. You won’t be spammed. I send out newsletters quite infrequently. Thank to everyone who took part! I invite you to visit each link below as I have and introduce yourself to many of the participating photographers. Best Photos of 2017 Jim M. Goldstein – Best Photos of 2017 by Jim M. Goldstein Randy Langstraat – My Ten Favorite Photos of 2017 Michael Russell – My Top 10 Photos of 2017 Phil Colla – Best Natural History Photos of 2017 Greg Russell | Alpenglow Images – 2017 year in review Mike Matenkosky – My Favorite Photos from 2017 Khürt Williams – 2017 Favourites Carl Donohue – Expeditions Alaska Kevin Ly – Kevin Ly | Best of 2017 Martin Quinn – Quinn Images – Best of 2017 Robin Mayoff – RHM Images Best of 2017 Craig L. Howe – On the Move Johann A. Briffa – 2017: A Photographic Retrospective Harold Davis – Harold Davis—My Best of 2017 Denise Goldberg – top photos :: 2017 William Bean – Bill’s Blog Greg Clure – Best Images of 2017 Rick Holliday – Best Images of 2017 Peter Carroll – Peter Carroll – Favourites of 2017 Mike Chowla – My 10 Best Photos of 2017 Wendy M. Seagren – wendy seagrens best photography 2017 QT Luong – 2017 in Review, Favorites, and Seasons Greetings Jenni Brehm – Changing Perspectives Rachel Cohen – Rachel Cohen Photography Brian Knott (FMKphoto) – 2017 year in review Shikha Shrivastava – My favorite photos of 2017 Dave Wilson – Dave Wilson Photography – Best of 2017 Larry Millican – Millican Photography Alexander S. Kunz – My Favorite Photos from 2017 Mark Duffy – 500px Stefan Baeurle – Top 10 Favorites of 2017 Adrian Klein – Favorite Photos of 2017 Alan Majchrowicz – Photo Highlights 2017 Russ Bishop – Russ Bishop Photography | 2017 – The Year in Pictures Todd Henson – Best Photos of 2017: My Favorites of the Year Peter Tellone – My 2017 Top Ten Best Images Aaron Hockley – thisGruntled – Best Photos of 2017 Tony Wu – Favorite Photos of 2017 T.M. Schultze – T.M. Schultze Website Andrew S. Gibson – My Favorite Photos From 2017 John Pemberton – JPSquared – Images of 2017 Scott Thompson – Scott Shots Photography’s Top 10 Tahoe photos of 2017 ElDuro Tuco – ElDuro Tuco The DarkSlides – The DarkSlides Jon McCormack – From Ancient Cities to Endangered Animals – 2017 in Photographs Fred Mertz Photography – Fred Mertz Photography Richard Valenti – Richard Valenti Photography Jeff Hubbard – My Favorite Photos of 2017 Andrew Scharlot – 2017 Best Pictures Deb Snelson – Favorite Photos of 2017 Richard Wong – Favorite Photos From 2017 – Richard Wong Caleb Weston – Dubland Gary Crabbe / Enlightened Images – My Favorite Landscape Photos of 2017 – A Year-End Retrospective Tom Whelan – Nature Diary Robert Varley – Robert Varley Kyle Jones – Favorites from 2017 Neil Creek – Neil Creek – Photographer tim fiddimore – North Devon 2017 Richard Murphy Photography – Best of 2017 Alan Dahl – Favorites of 2017 Gabor Ruff – Natural History Photography – Highlights from 2017 Kevin Ebi – Living Wilderness: Best of 2017 Clint Losee – 10 Best Landscape and Scenic Photos of 2017 Mark Hespenheide – Best of ’17 Ilias Katsouras – Okrivadas David J Grenier – 2017 Top 12 Photographs J. J. RAIA – 2017 Jim Goldstein Project Rob Tilley – Best of 2017 – My Favorite Images of the Year Björn Göhringer – Top 14 From 2017 Bernt-Inge Madsen – Bernt-Inge.com USKestrel Photography (Pete Miller) – My favorite images of 2017: A Different Perspective Milan Hutera – 2017 in Pictures Fred Murphy – Fred Murphy Photography Harry Hitzeman – My Top Photographs of 2017 Andrew Thomas – Best of 2017 – Aerials Dean Foster – 2017: Year in Review Simon Ng – 2017 A Year of Water Michael Katz – Michael Katz Photography Drake Dyck – Top Ten (favourite) Images of 2017 Jose Manuel Santos – The Magnificent Douro Valley Gary Buzel – Gary Buzel Studios Bryan William Jones – Top Photos of 2017 Peter Knott – 2017 Favourites Kamala Venkatesh – Kamala Venkatesh Jason Frye – My Top 10 of 2017 Jackson Frishman – Favorites of 2017 Thomas Yackley – Top Ten Landscape and Nature Photos of 2017 Mark Graf – 2017 – A Year of Despair and Dragons Kurt Lawson – 10ish Favorites of 2017 Jorge Ramirez – Selection 2017 William Neill – William Neill’s Light on the Landscape Photoblog Daniel Leu – Favorites – 2017 Derrald Farnsworth-Livingston – Top 10 Favorite Images from 2017 ~ Journey of Light Photography Mike Christoferson – 2017 Has Come and Gone Carol Schiraldi – Best of 2017 – My Top Images Robin Black – My 10 best photos (or personal favorites, anyway) of 2017 Bryn Tassell – […] Full Article Featured Photography Updates & Announcements Best of 2017 Best of Photos Blog Project
ad Best Photos of 2018 by JMG-Galleries Blog Readers By feedproxy.google.com Published On :: Wed, 09 Jan 2019 06:46:09 +0000 I’m excited to share the results of my 12th annual Best of Photos project. 115 photographers from around the world (amateur and professional alike) have shared their best photos of 2018. I’m always amazed at the quality of work shared and I hope it’s a source inspiration to you for the coming year. For those who are new to my blog project, photographers taking part span the gamut of photo enthusiasts to professionals. The great thing about photography is that no matter what your skill level we all can relate equally in our love for the art of photography and visually exploring. With that in mind I encourage you to reach out to photographers whose work you enjoy to keep sharing & growing as an artist. I am incredibly thankful that this tradition has been embraced and enjoy seeing how familiar faces have evolved their work & grown over the years. I hope reviewing your best photos of the year and comparing them to years pasts keeps you inspired and aware of your progress as a photographer. If you’d like to take part next year and be informed when submissions open for the “Best Photos of 2019” blog project add your name to my mail list. You won’t be spammed. I send out newsletters quite infrequently. Thank to everyone who took part! I invite you to visit each link below as I have and introduce yourself to many of the participating photographers. Best Photos of 2018 Jim Goldstein – Best Photos of 2018 by Jim M. Goldstein Michael Russell – My Top 10 Photographs Of 2018 Dave Wilson – Best of 2018 Joseph Smith – 2018 Favorites – A Baker’s Dozen Randy Langstraat – My Ten Favorite Photos of 2018 Chuq Von Rospach – Chuqui 2018 Best Of Photos Rachel Cohen – Best of 2018 Lucy Autrey Wilson – A Thousand Words Romain Guy – Best of 2018 Alexander S. Kunz – My Favorite Photos from 2018 Stefan Baeurle – Top 10 Favorites of 2018 QT Luong – 2018 in Review Jenni Brehm – Best pf 2018 – Changing Perspectives Sean Bagshaw – My Favorite Photos Of 2018 Johann A. Briffa – 2018: A Photographic Retrospective Exploring Light – 2018: A Year In Review Drake Dyck – Top Ten (favourite) Images of 2018 Richard Wong – Fine Art Photography Prints – 2018 Ramen Saha – 2018 – Ten moments Martin Quinn – Quinn Images 2018 Favorites TheDarkSlides – TheDarkSlides Best of 2018 Denise Goldberg – top photos :: 2018 Peter Carroll – Favourites of 2018 Jeff Hubbard – Ten Favorite Photos 2018 Gary Crabbe – My Favorite Landscape Photos of 2018 – A Year-End Retrospective Harold Davis – Harold Davis – Best of 2018 Werner Priller – My Favorite Images of 2018/ Phil Colla – Natural History Photography – Best Photos Of 2018 Aaron Hockley – Tech Photo Guy: Best Photos of 2018 Dan Baumbach – 2018 in Review Jao van de Lagemaat – Jao’s best images of 2018 Pete Miller-USKestrel Photography – Favorite Images of 2018 Shikha – Eastern Sierra – My favorite images of 2018 Bruce Leventhal – Reflecting on 2018 Christopher Sheppard – The Stories Behind My Favorite Photographs of 2018 Alan Majchrowicz – Photo Highlights 2018 Tom Whelan – Nature Diary Todd Henson – Best Photos of 2018: My Favorites of the Year Khürt Williams – Island in the Net Patricia Davidson – My Top 10 Favorite Photos of 2018 Russ Bishop – 2018 – The Year in Pictures Jim Coda – Some of My Favorite Images from 2018 Steve Cole – Birds Eye View of 2018 Fred Mertz Photography – Best Photos of 2018 Martijn van der Nat – Best of 2018 Graf Nature Photography – Twenty Eighteen Wanderings Scott Thompson – My Top 10 Tahoe Area Photos of 2018 Kyle Jones – 2018 Favorites Clint Losee – My Best Landscape and Nature Photos of 2018 Caleb Weston – Caleb Weston – Dubland Media Greg Clure – Best of 2018 Rick Holliday – Favorites from 2018 J.J. RAIA – J.J. RAIA Best Photos of 2018 Francis Gagnon – Francis Gagnon Best Photos of 2018 Mike Chowla – My Ten Best of Images of 2018 Carl Donohue – 2018 in photos Kurt Lawson – 10 Favorites of 2018: From Lava Rivers in Hawaii to Yosemite Snowstorms William Bean – William Bean T.M. Schultze – My Favorite Photographs of 2018 Andrew Thomas – Aerial Adventures – Best of 2018 Matt Conti – 2018 Top 20 Photos Daniel Leu – Favorites – 2018 Carol Schiraldi – Best of 2018 from Carol’s Little World Alan Dahl – 2018 Favorite Photos Milan Hutera – 2018 in Pictures Kathy Barnhart – Flickr Sensing Light Best of 2018 Album Greg Russell – Alpenglow Images 2018 Year in Review Derrald Farnsworth-Livingston – Top 10 Favorite Images from 2018 Kevin Ebi – Living Wilderness: Best of 2018 Jackson Frishman – Favorites of 2018 Greg A. Lato – My Favorite Photos of 2018 Mike Shipman – Mike Shipman’s Best of 2018 Beth Young – Best Photos of 2018 Dale Grosbach – My Favorites – 2018 Brent Huntley – Photography and Travel Charlie Russell – Best Wildflower Photos for 2018 Bryan William Jones – Jonesblog Tony Wu – Favorite Photos of 2018 Adrian Klein – 2018 Photo Retrospective Scott McGee – Top 10 of 2018 William Neill – My Favorite Photographs of 2018 Thomas Yackley – Yackley Photo Anne McKinnell – Best Photos of 2018 Holly Davison – Top Ten of 2018 Brian Knott – Brian Knott Photography 2018 Year In Review Anna DeStefano – Affirmation Photography’s Best of 2018 Ingeborg Fernau – Magicalglow Photography Blog Emil Powella – Top 10 of 2018 Elduro Tuco – Elduro Tuco Eric Chan – Favorites From 2018 TP Chapman – Best of 2018 Ilias Katsouras – Okrivadas Molly Dean – Best Photos of 2018 Sarah Marino – 2018 Wrap-Up and a Few Favorite Photographs Michael Frye – My Top Photographs of 2018 Jim Stamates – Memories of 2018 Tim Aston – Favorites from 2018 Samantha Decker – My Best […] Full Article Photography Updates & Announcements Best of 2018 Best of Photos Blog Project
ad Best Photos of 2019 by JMG-Galleries Blog Readers By feedproxy.google.com Published On :: Thu, 16 Jan 2020 08:13:58 +0000 I’m excited to share the results of my 13th annual Best of Photos project. 112 photographers from around the world (amateur and professional alike) have shared their best photos of 2019. I’m always amazed at the quality of work shared and I hope it’s a source inspiration to you for the coming year. For those who are new to my blog project, photographers taking part span the gamut of photo enthusiasts to professionals. The great thing about photography is that no matter what your skill level we all can relate equally in our love for the art of photography and visually exploring. With that in mind I encourage you to reach out to photographers whose work you enjoy to keep sharing & growing as an artist. I am incredibly thankful that this tradition has been embraced and enjoy seeing how familiar faces have evolved their work & grown over the years. I hope reviewing your best photos of the year and comparing them to years pasts keeps you inspired and aware of your progress as a photographer. If you’d like to take part next year and be informed when submissions open for the “Best Photos of 2020” blog project add your name to my mail list. You won’t be spammed. I send out newsletters quite infrequently. Thank to everyone who took part! I invite you to visit each link below as I have and introduce yourself to many of the participating photographers. Best Photos of 2019 Best Photos of 2019 – JMG-Galleries – Jim M. Goldstein My Top 10 Photographs Of 2019 – Michael Russell My Ten Favorite Photos of 2019 – ADVENTR – Randy Langstraat Favorite Photos of 2019 – T.M. Schultze My Favorite Photos from 2019 – Alexander S. Kunz Best of 2019 – Dave Wilson Harold Davis—Best of 2019 – Harold Davis 2019: A Photographic Retrospective – Johann A. Briffa Top 10 Favorites of 2019 – Stefan Baeurle My Best Natural History Photos of 2019 – Phil Colla My Best Photos From 2019 – Daniel Brinneman Best Photos of 2019 – Peter Tellone Rétrospective des meilleures photos de l’année 2019 – Francis Gagnon Best of 2019 by Rachel Cohen – Rachel Cohen Photo Highlights 2019 – Alan Majchrowicz My Top 10 Nature Photos of 2019 – Greg Vaughn 2019 – The Year in Pictures | Russ Bishop Photography – Russ Bishop 2019 Favorites – A Split Year – Joseph Smith My 12 Favorite Photos of 2019 – Chuq Von Rospach Wild Drake Photography – Drake Dyck Matt Payne Photography – Matt Payne My Favorite Images Of 2019 – Werner Priller Favourites from 2019 – Bryn Tassell My Favorite Photos of 2019 – A Year-End Retrospective – Gary Crabbe / Enlightened Images 2019 Favorite Photographs – Pat Ulrich Without reflection we go blindly on our way – Bjorn Kleemann 2019 – Ten moments – Ramen Saha top photos :: 2019 – Denise Goldberg Changing Perspectives – Best of 2019 – Jenni Brehm Island in the Net – Khürt Williams Best Photos of 2019: My Favorites of the Year – Todd Henson My Ten Best of Images of 2019 – Mike Chowla 2019 Favorite Photos – Alan Dahl Tech Photo Guy – Best Photos 2019 – Aaron Hockley 2019 Favorites – Martin Quinn Best of TheDarkSlides 2019 – TheDarkSlides 2019 Jim Goldstein Project – J.J. RAIA My Favorites of 2019 – Rich Greene My Favorite Images of 2019 (aka ‘Best of 2019’) – Pete Miller 2019 Year in Review, Decade in Review – Robin Black Photography Under Pressure Photography – Scott McGee My favorite Slovenia photos of 2019 – Luka Esenko 5 Moments in Time – 2019 – Gavin Crook My favorite photos of the decade – Matt Payne My Ten Favourite Images of 2019 – Jens Preshaw 2019 in Pictures – Milan Hutera Twelve from 2019 – Tom Whelan My Favorite Photos of 2019 – Jeff Hubbard 2019 Favorites – Rick Holliday Best of the Best 2019 – Richard Valenti Best Landscape and Nature Photos of 2019 – Clint Losee Best of 2019 – My Favorite Images of the Year – Rob Tilley 2019 Year in Review – Greg Russell | Alpenglow Images Best of The Decade Including 2019 – Adrian Klein Best of 2019 – Brian Knott Natural History Photography – Highlights from 2019 – Gabor Ruff Best of 2019 – Jeff Dupuie Top 2019 – Eric Chan Best of 2019 – Greg Clure Twenty Nineteen: In retrospect – Charlotte Gibb Favorite Blog Photos of 2019 – Jim Coda My Favorites 2019 – Beth Young Living Wilderness: Best of 2019 – Kevin Ebi 2019 Favorites – Mike Cleron Best of 2019 – Romain Guy 2019 Favorite Images – Sam Folsom Michael Katz Photography – Michael Katz Twenty Nineteen – Mark Graf 2019 in Review – and Happy New Year” Photography & Travel – brent huntley Top 10 Favorite Images from 2019 – Derrald Farnsworth-Livingston My Photo Highlights of 2019 – Caleb Weston Lagemaat Photography – Best images of 2019 – Jao van de Lagemaat Favorites from 2019 – Kyle Jones A Baker’s Dozen – Mike Christoferson 10 Favorites of 2019: An Amazing Year – Kurt Lawson Top 20 Photographs of 2019 – Year-End-Retrospective – Landscape Photography Reader/David Leland Hyde Favorite Photos of 2019 – Deb Snelson Favorites – 2019 – Daniel Leu Best of 2019 – Steve Cozad Fog from Above in 2019 – Andrew Thomas Favorites of 2019 – Mick McMurray Some Favorites from 2019 – Josh Meier Top 10 Images of 2019 – Stephen L. Kapp Top Ten of 2019 – Holly Davison Best 2019 – Barbara Michalowska The Creative Photographer – Andrew S. Gibson My Favorite Photos of 2019 – Patricia Davidson A Thousand Words – Lucy Autrey Wilson 2019 Top Twelve Photographs – David J Grenier Urban Dinosaurs – Steven M. Bellovin Best of 2019 – Thomas Yackley Carol’s Little World – Best of 2019 – Carol Schiraldi My favourite shots of 2019 – Catalin Marin Top 2019 Photos – Matt Conti Top Ten 2019 – Phyllis Whitman Hunter Favorites from […] Full Article Photography Updates & Announcements Best of 2019 Best of Photos Blog Project
ad From The Archives: Toronto, Canada 2019 By feedproxy.google.com Published On :: Fri, 20 Mar 2020 09:22:56 PDT Parkdale. Toronto, Canada 2019 Follow me @benhuang.photography Full Article From The Archives benhuangphotography canada landsdowne parkdale residential streetphotography toronto winter カナダ トロント パークデール ランスドーン 住宅区 冬 街撮り
ad From The Archives: Toronto, Canada 2020 By feedproxy.google.com Published On :: Sat, 25 Apr 2020 11:55:14 PDT Yonge Street. Toronto, Canada 2020 Follow me @benhuang.photography Full Article From The Archives benhuangphotography canada downtown pedestrian streetphotography toronto yongestreet カナダ ダウンタウン トロント 歩行者 街撮り
ad James Hansen’s Climate Bombshell: Dangerous Sea Level Rise Will Occur in Decades, Not Centuries By feedproxy.google.com Published On :: Wed, 23 Mar 2016 11:00:15 +0000 By Lauren McCauley Common Dreams Even scientists who question findings say ‘we ignore James Hansen at our peril.’ Dr. James Hansen, the former NASA scientist who is widely credited with being one of the first to raise concerns about human-caused … Continue reading → Full Article Ocean Dr. James Hansen Global Warming sea level rise
ad Corruption Is Bad, But Sabotage Is Worse By feedproxy.google.com Published On :: Thu, 14 Jun 2018 00:17:23 +0000 By Jill Richardson Otherwords Both are bad, but Scott Pruitt’s abuse of our environment is far more dangerous than his abuse of taxpayer money. Did you hear that the head of the Environmental Protection Agency (EPA), Scott Pruitt, is so … Continue reading → Full Article Points of View & Opinions corrpution EPA Scott Pruitt
ad For Rachel Carson, wonder was a radical state of mind By feedproxy.google.com Published On :: Fri, 27 Sep 2019 18:33:25 +0000 By Jennifer Stitt Aeon In 1957, the world watched in wonder as the Soviet Union launched Sputnik 1, the first artificial satellite, into outer space. Despite Cold War anxieties, The New York Times admitted that space exploration ‘represented a step … Continue reading → Full Article ecoView ecological philosophy Ecology Heroes Rachel Carson Silent Spring
ad Top 15 Digital Scrapbooking Downloads (Free & Paid) By justcreative.com Published On :: Mon, 27 Apr 2020 02:07:13 +0000 Scrapbooking can be a fun way to capture important moments in life and with our list of the Top 15 Scrapbooking Resources, you can start right away! Full Article Tools & Gear DesignCuts Scrapbooking
ad How to Grow Your Sales and Leads During the Coronavirus Pandemic By justcreative.com Published On :: Wed, 06 May 2020 10:16:17 +0000 Try these 10 actionable steps for streamlined, cost-effective marketing during the lockdown. Shed costs and embrace innovation to drive leads and conversions. Full Article Blogging & Content Marketing Guest Articles Content Marketing Marketing
ad GoCopy – The Best Adobe InDesign Collaboration Tool By justcreative.com Published On :: Fri, 08 May 2020 02:09:37 +0000 GoCopy is the simplest way for copywriters and designers to collaborate better on Adobe InDesign content. Get your copy free! Full Article Graphic Design Adobe GoCopy InDesign
ad Vibrant Flat Vector Planets Illustration - Free Download Pack By icanbecreative.com Published On :: Wed, 11 Mar 2020 10:57:49 PDT The galaxy is a mesmerizing place, even better throught the eyes of visual design artists around our globe, we're delighted to release another freebie for our design community. This flat vector... Full Article Vector
ad Advanced Photography Tips And Hints By icanbecreative.com Published On :: Sat, 25 Apr 2020 23:54:17 PDT It is in every case critical to pay special mind to any computerized photography insights and tips. A few people can truly take awesome photos without truly trying, yet most of us need whatever... Full Article Learning
ad ✚ Tornado Lines – Useful or Not? (The Process 088) By flowingdata.com Published On :: Thu, 07 May 2020 17:30:48 +0000 It looks like a tornado. It's messy. It's circular. It almost looks intentionally confusing. But how bad is it really?Tags: novelty, tornado Full Article The Process novelty tornado
ad Concurrency & Multithreading in iOS By feedproxy.google.com Published On :: Tue, 25 Feb 2020 08:00:00 -0500 Concurrency is the notion of multiple things happening at the same time. This is generally achieved either via time-slicing, or truly in parallel if multiple CPU cores are available to the host operating system. We've all experienced a lack of concurrency, most likely in the form of an app freezing up when running a heavy task. UI freezes don't necessarily occur due to the absence of concurrency — they could just be symptoms of buggy software — but software that doesn't take advantage of all the computational power at its disposal is going to create these freezes whenever it needs to do something resource-intensive. If you've profiled an app hanging in this way, you'll probably see a report that looks like this: Anything related to file I/O, data processing, or networking usually warrants a background task (unless you have a very compelling excuse to halt the entire program). There aren't many reasons that these tasks should block your user from interacting with the rest of your application. Consider how much better the user experience of your app could be if instead, the profiler reported something like this: Analyzing an image, processing a document or a piece of audio, or writing a sizeable chunk of data to disk are examples of tasks that could benefit greatly from being delegated to background threads. Let's dig into how we can enforce such behavior into our iOS applications. A Brief History In the olden days, the maximum amount of work per CPU cycle that a computer could perform was determined by the clock speed. As processor designs became more compact, heat and physical constraints started becoming limiting factors for higher clock speeds. Consequentially, chip manufacturers started adding additional processor cores on each chip in order to increase total performance. By increasing the number of cores, a single chip could execute more CPU instructions per cycle without increasing its speed, size, or thermal output. There's just one problem... How can we take advantage of these extra cores? Multithreading. Multithreading is an implementation handled by the host operating system to allow the creation and usage of n amount of threads. Its main purpose is to provide simultaneous execution of two or more parts of a program to utilize all available CPU time. Multithreading is a powerful technique to have in a programmer's toolbelt, but it comes with its own set of responsibilities. A common misconception is that multithreading requires a multi-core processor, but this isn't the case — single-core CPUs are perfectly capable of working on many threads, but we'll take a look in a bit as to why threading is a problem in the first place. Before we dive in, let's look at the nuances of what concurrency and parallelism mean using a simple diagram: In the first situation presented above, we observe that tasks can run concurrently, but not in parallel. This is similar to having multiple conversations in a chatroom, and interleaving (context-switching) between them, but never truly conversing with two people at the same time. This is what we call concurrency. It is the illusion of multiple things happening at the same time when in reality, they're switching very quickly. Concurrency is about dealing with lots of things at the same time. Contrast this with the parallelism model, in which both tasks run simultaneously. Both execution models exhibit multithreading, which is the involvement of multiple threads working towards one common goal. Multithreading is a generalized technique for introducing a combination of concurrency and parallelism into your program. The Burden of Threads A modern multitasking operating system like iOS has hundreds of programs (or processes) running at any given moment. However, most of these programs are either system daemons or background processes that have very low memory footprint, so what is really needed is a way for individual applications to make use of the extra cores available. An application (process) can have many threads (sub-processes) operating on shared memory. Our goal is to be able to control these threads and use them to our advantage. Historically, introducing concurrency to an app has required the creation of one or more threads. Threads are low-level constructs that need to be managed manually. A quick skim through Apple's Threaded Programming Guide is all it takes to see how much complexity threaded code adds to a codebase. In addition to building an app, the developer has to: Responsibly create new threads, adjusting that number dynamically as system conditions change Manage them carefully, deallocating them from memory once they have finished executing Leverage synchronization mechanisms like mutexes, locks, and semaphores to orchestrate resource access between threads, adding even more overhead to application code Mitigate risks associated with coding an application that assumes most of the costs associated with creating and maintaining any threads it uses, and not the host OS This is unfortunate, as it adds enormous levels of complexity and risk without any guarantees of improved performance. Grand Central Dispatch iOS takes an asynchronous approach to solving the concurrency problem of managing threads. Asynchronous functions are common in most programming environments, and are often used to initiate tasks that might take a long time, like reading a file from the disk, or downloading a file from the web. When invoked, an asynchronous function executes some work behind the scenes to start a background task, but returns immediately, regardless of how long the original task might takes to actually complete. A core technology that iOS provides for starting tasks asynchronously is Grand Central Dispatch (or GCD for short). GCD abstracts away thread management code and moves it down to the system level, exposing a light API to define tasks and execute them on an appropriate dispatch queue. GCD takes care of all thread management and scheduling, providing a holistic approach to task management and execution, while also providing better efficiency than traditional threads. Let's take a look at the main components of GCD: What've we got here? Let's start from the left: DispatchQueue.main: The main thread, or the UI thread, is backed by a single serial queue. All tasks are executed in succession, so it is guaranteed that the order of execution is preserved. It is crucial that you ensure all UI updates are designated to this queue, and that you never run any blocking tasks on it. We want to ensure that the app's run loop (called CFRunLoop) is never blocked in order to maintain the highest framerate. Subsequently, the main queue has the highest priority, and any tasks pushed onto this queue will get executed immediately. DispatchQueue.global: A set of global concurrent queues, each of which manage their own pool of threads. Depending on the priority of your task, you can specify which specific queue to execute your task on, although you should resort to using default most of the time. Because tasks on these queues are executed concurrently, it doesn't guarantee preservation of the order in which tasks were queued. Notice how we're not dealing with individual threads anymore? We're dealing with queues which manage a pool of threads internally, and you will shortly see why queues are a much more sustainable approach to multhreading. Serial Queues: The Main Thread As an exercise, let's look at a snippet of code below, which gets fired when the user presses a button in the app. The expensive compute function can be anything. Let's pretend it is post-processing an image stored on the device. import UIKit class ViewController: UIViewController { @IBAction func handleTap(_ sender: Any) { compute() } private func compute() -> Void { // Pretending to post-process a large image. var counter = 0 for _ in 0..<9999999 { counter += 1 } } } At first glance, this may look harmless, but if you run this inside of a real app, the UI will freeze completely until the loop is terminated, which will take... a while. We can prove it by profiling this task in Instruments. You can fire up the Time Profiler module of Instruments by going to Xcode > Open Developer Tool > Instruments in Xcode's menu options. Let's look at the Threads module of the profiler and see where the CPU usage is highest. We can see that the Main Thread is clearly at 100% capacity for almost 5 seconds. That's a non-trivial amount of time to block the UI. Looking at the call tree below the chart, we can see that the Main Thread is at 99.9% capacity for 4.43 seconds! Given that a serial queue works in a FIFO manner, tasks will always complete in the order in which they were inserted. Clearly the compute() method is the culprit here. Can you imagine clicking a button just to have the UI freeze up on you for that long? Background Threads How can we make this better? DispatchQueue.global() to the rescue! This is where background threads come in. Referring to the GCD architecture diagram above, we can see that anything that is not the Main Thread is a background thread in iOS. They can run alongside the Main Thread, leaving it fully unoccupied and ready to handle other UI events like scrolling, responding to user events, animating etc. Let's make a small change to our button click handler above: class ViewController: UIViewController { @IBAction func handleTap(_ sender: Any) { DispatchQueue.global(qos: .userInitiated).async { [unowned self] in self.compute() } } private func compute() -> Void { // Pretending to post-process a large image. var counter = 0 for _ in 0..<9999999 { counter += 1 } } } Unless specified, a snippet of code will usually default to execute on the Main Queue, so in order to force it to execute on a different thread, we'll wrap our compute call inside of an asynchronous closure that gets submitted to the DispatchQueue.global queue. Keep in mind that we aren't really managing threads here. We're submitting tasks (in the form of closures or blocks) to the desired queue with the assumption that it is guaranteed to execute at some point in time. The queue decides which thread to allocate the task to, and it does all the hard work of assessing system requirements and managing the actual threads. This is the magic of Grand Central Dispatch. As the old adage goes, you can't improve what you can't measure. So we measured our truly terrible button click handler, and now that we've improved it, we'll measure it once again to get some concrete data with regards to performance. Looking at the profiler again, it's quite clear to us that this is a huge improvement. The task takes an identical amount of time, but this time, it's happening in the background without locking up the UI. Even though our app is doing the same amount of work, the perceived performance is much better because the user will be free to do other things while the app is processing. You may have noticed that we accessed a global queue of .userInitiated priority. This is an attribute we can use to give our tasks a sense of urgency. If we run the same task on a global queue of and pass it a qos attribute of background , iOS will think it's a utility task, and thus allocate fewer resources to execute it. So, while we don't have control over when our tasks get executed, we do have control over their priority. A Note on Main Thread vs. Main Queue You might be wondering why the Profiler shows "Main Thread" and why we're referring to it as the "Main Queue". If you refer back to the GCD architecture we described above, the Main Queue is solely responsible for managing the Main Thread. The Dispatch Queues section in the Concurrency Programming Guide says that "the main dispatch queue is a globally available serial queue that executes tasks on the application’s main thread. Because it runs on your application’s main thread, the main queue is often used as a key synchronization point for an application." The terms "execute on the Main Thread" and "execute on the Main Queue" can be used interchangeably. Concurrent Queues So far, our tasks have been executed exclusively in a serial manner. DispatchQueue.main is by default a serial queue, and DispatchQueue.global gives you four concurrent dispatch queues depending on the priority parameter you pass in. Let's say we want to take five images, and have our app process them all in parallel on background threads. How would we go about doing that? We can spin up a custom concurrent queue with an identifier of our choosing, and allocate those tasks there. All that's required is the .concurrent attribute during the construction of the queue. class ViewController: UIViewController { let queue = DispatchQueue(label: "com.app.concurrentQueue", attributes: .concurrent) let images: [UIImage] = [UIImage].init(repeating: UIImage(), count: 5) @IBAction func handleTap(_ sender: Any) { for img in images { queue.async { [unowned self] in self.compute(img) } } } private func compute(_ img: UIImage) -> Void { // Pretending to post-process a large image. var counter = 0 for _ in 0..<9999999 { counter += 1 } } } Running that through the profiler, we can see that the app is now spinning up 5 discrete threads to parallelize a for-loop. Parallelization of N Tasks So far, we've looked at pushing computationally expensive task(s) onto background threads without clogging up the UI thread. But what about executing parallel tasks with some restrictions? How can Spotify download multiple songs in parallel, while limiting the maximum number up to 3? We can go about this in a few ways, but this is a good time to explore another important construct in multithreaded programming: semaphores. Semaphores are signaling mechanisms. They are commonly used to control access to a shared resource. Imagine a scenario where a thread can lock access to a certain section of the code while it executes it, and unlocks after it's done to let other threads execute the said section of the code. You would see this type of behavior in database writes and reads, for example. What if you want only one thread writing to a database and preventing any reads during that time? This is a common concern in thread-safety called Readers-writer lock. Semaphores can be used to control concurrency in our app by allowing us to lock n number of threads. let kMaxConcurrent = 3 // Or 1 if you want strictly ordered downloads! let semaphore = DispatchSemaphore(value: kMaxConcurrent) let downloadQueue = DispatchQueue(label: "com.app.downloadQueue", attributes: .concurrent) class ViewController: UIViewController { @IBAction func handleTap(_ sender: Any) { for i in 0..<15 { downloadQueue.async { [unowned self] in // Lock shared resource access semaphore.wait() // Expensive task self.download(i + 1) // Update the UI on the main thread, always! DispatchQueue.main.async { tableView.reloadData() // Release the lock semaphore.signal() } } } } func download(_ songId: Int) -> Void { var counter = 0 // Simulate semi-random download times. for _ in 0..<Int.random(in: 999999...10000000) { counter += songId } } } Notice how we've effectively restricted our download system to limit itself to k number of downloads. The moment one download finishes (or thread is done executing), it decrements the semaphore, allowing the managing queue to spawn another thread and start downloading another song. You can apply a similar pattern to database transactions when dealing with concurrent reads and writes. Semaphores usually aren't necessary for code like the one in our example, but they become more powerful when you need to enforce synchronous behavior whille consuming an asynchronous API. The above could would work just as well with a custom NSOperationQueue with a maxConcurrentOperationCount, but it's a worthwhile tangent regardless. Finer Control with OperationQueue GCD is great when you want to dispatch one-off tasks or closures into a queue in a 'set-it-and-forget-it' fashion, and it provides a very lightweight way of doing so. But what if we want to create a repeatable, structured, long-running task that produces associated state or data? And what if we want to model this chain of operations such that they can be cancelled, suspended and tracked, while still working with a closure-friendly API? Imagine an operation like this: This would be quite cumbersome to achieve with GCD. We want a more modular way of defining a group of tasks while maintaining readability and also exposing a greater amount of control. In this case, we can use Operation objects and queue them onto an OperationQueue, which is a high-level wrapper around DispatchQueue. Let's look at some of the benefits of using these abstractions and what they offer in comparison to the lower-level GCI API: You may want to create dependencies between tasks, and while you could do this via GCD, you're better off defining them concretely as Operation objects, or units of work, and pushing them onto your own queue. This would allow for maximum reusability since you may use the same pattern elsewhere in an application. The Operation and OperationQueue classes have a number of properties that can be observed, using KVO (Key Value Observing). This is another important benefit if you want to monitor the state of an operation or operation queue. Operations can be paused, resumed, and cancelled. Once you dispatch a task using Grand Central Dispatch, you no longer have control or insight into the execution of that task. The Operation API is more flexible in that respect, giving the developer control over the operation's life cycle. OperationQueue allows you to specify the maximum number of queued operations that can run simultaneously, giving you a finer degree of control over the concurrency aspects. The usage of Operation and OperationQueue could fill an entire blog post, but let's look at a quick example of what modeling dependencies looks like. (GCD can also create dependencies, but you're better off dividing up large tasks into a series of composable sub-tasks.) In order to create a chain of operations that depend on one another, we could do something like this: class ViewController: UIViewController { var queue = OperationQueue() var rawImage = UIImage? = nil let imageUrl = URL(string: "https://example.com/portrait.jpg")! @IBOutlet weak var imageView: UIImageView! let downloadOperation = BlockOperation { let image = Downloader.downloadImageWithURL(url: imageUrl) OperationQueue.main.async { self.rawImage = image } } let filterOperation = BlockOperation { let filteredImage = ImgProcessor.addGaussianBlur(self.rawImage) OperationQueue.main.async { self.imageView = filteredImage } } filterOperation.addDependency(downloadOperation) [downloadOperation, filterOperation].forEach { queue.addOperation($0) } } So why not opt for a higher level abstraction and avoid using GCD entirely? While GCD is ideal for inline asynchronous processing, Operation provides a more comprehensive, object-oriented model of computation for encapsulating all of the data around structured, repeatable tasks in an application. Developers should use the highest level of abstraction possible for any given problem, and for scheduling consistent, repeated work, that abstraction is Operation. Other times, it makes more sense to sprinkle in some GCD for one-off tasks or closures that we want to fire. We can mix both OperationQueue and GCD to get the best of both worlds. The Cost of Concurrency DispatchQueue and friends are meant to make it easier for the application developer to execute code concurrently. However, these technologies do not guarantee improvements to the efficiency or responsiveness in an application. It is up to you to use queues in a manner that is both effective and does not impose an undue burden on other resources. For example, it's totally viable to create 10,000 tasks and submit them to a queue, but doing so would allocate a nontrivial amount of memory and introduce a lot of overhead for the allocation and deallocation of operation blocks. This is the opposite of what you want! It's best to profile your app thoroughly to ensure that concurrency is enhancing your app's performance and not degrading it. We've talked about how concurrency comes at a cost in terms of complexity and allocation of system resources, but introducing concurrency also brings a host of other risks like: Deadlock: A situation where a thread locks a critical portion of the code and can halt the application's run loop entirely. In the context of GCD, you should be very careful when using the dispatchQueue.sync { } calls as you could easily get yourself in situations where two synchronous operations can get stuck waiting for each other. Priority Inversion: A condition where a lower priority task blocks a high priority task from executing, which effectively inverts their priorities. GCD allows for different levels of priority on its background queues, so this is quite easily a possibility. Producer-Consumer Problem: A race condition where one thread is creating a data resource while another thread is accessing it. This is a synchronization problem, and can be solved using locks, semaphores, serial queues, or a barrier dispatch if you're using concurrent queues in GCD. ...and many other sorts of locking and data-race conditions that are hard to debug! Thread safety is of the utmost concern when dealing with concurrency. Parting Thoughts + Further Reading If you've made it this far, I applaud you. Hopefully this article gives you a lay of the land when it comes to multithreading techniques on iOS, and how you can use some of them in your app. We didn't get to cover many of the lower-level constructs like locks, mutexes and how they help us achieve synchronization, nor did we get to dive into concrete examples of how concurrency can hurt your app. We'll save those for another day, but you can dig into some additional reading and videos if you're eager to dive deeper. Building Concurrent User Interfaces on iOS (WWDC 2012) Concurrency and Parallelism: Understanding I/O Apple's Official Concurrency Programming Guide Mutexes and Closure Capture in Swift Locks, Thread Safety, and Swift Advanced NSOperations (WWDC 2015) NSHipster: NSOperation Full Article Code
ad African American Women Leading in Tech By feedproxy.google.com Published On :: Tue, 25 Feb 2020 08:05:00 -0500 “Close your eyes and name three people who have impacted the tech industry.”In all likelihood, that list might be overwhelmingly white and male. And you are not alone. Numerous lists online yielded the same results. In recent years, many articles have chronicled the dearth of diversity in tech. Studies have shown the ways in which venture capital firms have systematically underestimated and undervalued innovation coming particularly from women of color. In 2016 only 88 tech startups were led by African American women, in 2018 this number had climbed to a little over 200. Between 2009 and 2017, African American women raised $289MM in venture/angel funding. For perspective, this only represents .0006% of the $424.7B in total tech venture funding raised in that same time frame. In 2018, only 34 African American women had ever raised more than a million in venture funding. When it comes to innovation, it is not unusual for financial value to be the biggest predictor of what is considered innovative. In fact, a now largely controversial list posted by Forbes of America’s most innovative leaders in the fall of 2019 featured 99 men and one woman. Ironically, what was considered innovative was, in fact, very traditional in its presentation. The criteria used for the list was “media reputation for innovation,” social connections, a track record for value creation, and investor expectations for value creation. The majority of African American women-led startups raise $42,000 from largely informal networks. Criteria weighted on the side of ‘track record for value creation’ and ‘investor expectations for value creation’ devalues the immense contributions of African American women leading the charge on thoughtful and necessary tech. Had Forbes used criteria for innovation that recognized emergent leadership, novel problem-solving, or original thinking outside the circles of already well-known and well-established entrepreneurs we might have learned something new. Instead, we're basically reminded that "it takes money to make money."Meanwhile, African American women are the fastest-growing demographic of entrepreneurs in the United States. Their contributions to tech, amongst other fields, are cementing the importance of African American women in the innovation space. And they are doing this within and outside traditional tech frameworks. By becoming familiar with these entrepreneurs and their work, we can elevate their reputation and broaden our collective recognition of innovative leaders.In honor of black history month, we have compiled a list of African American women founders leading the way in tech innovation from Alabama to the Bay Area. From rethinking energy to debt forgiveness platforms these women are crossing boundaries in every field. Cultivating New Leaders Photo of Kathryn Finney, courtesy of Forbes.com. Kathryn Finney founder of DigitalundividedKathryn A. Finney is an American author, researcher, investor, entrepreneur, innovator and businesswoman. She is the founder and CEO of digitalundivided, a social enterprise that leads high potential Black and Latinx women founders through the startup pipeline from idea to exit.Laura Weidman Co-founder Code2040Laura Weidman Powers is the co-founder and executive director of Code2040, a nonprofit that creates access, awareness, and opportunities for minority engineering talent to ensure their leadership in the innovation economy.Angelica Ross founder of TransTech Social Enterprises Angelica Ross is an American businesswoman, actress, and transgender rights advocate. After becoming a self-taught computer coder, she went on to become the founder and CEO of TransTech Social Enterprises, a firm that helps employ transgender people in the tech industry.Christina Souffrant Ntim co-founder of Global Startup EcosystemChristina Souffrant Ntim is the co-founder of award-winning digital accelerator platform – Global Startup Ecosystem which graduates over 1000+ companies across 90+ countries a year.Media and EntertainmentBryanda Law founder of QuirktasticBryanda Law is the founder of Quirktastic, a modern media-tech company on a mission to grow the largest and most authentically engaged community of fandom-loving people of color.Morgan Debaun founder of Blavity Inc. Morgan DeBaun is an African American entrepreneur. She is the Founder and CEO of Blavity Inc., a portfolio of brands and websites created by and for black millennialsCheryl Contee co-founder of Do Big ThingsCheryl Contee is the award-winning CEO and co-founder of Do Big Things, a digital agency that creates new narratives and tech for a new era focused on causes and campaigns. Photo of Farah Allen, courtesy of The Source Magazine. Farah Allen founder of The Labz Farah Allen is the CEO and founder of The Labz, a collaborative workspace that provides automated tracking, rights management, protection—using Blockchain technology—of your music files during and after you create them.Health/Wellness Mara Lidey co-founder of Shine Marah Lidey is the co-founder & co-CEO of Shine. Shine aims to reinvent health and wellness for millennials through messaging technology.Alicia Thomas co-founder of Dibs Alicia Thomas is the founder and CEO of Dibs, a B2B digital platform that gives studios quick and easy access to real-time pricing for fitness classes. Photo of Erica Plybeah, courtesy of BetterTennessee.com Erica Plybeah Hemphill founder of MedHaul Erica Plybeah Hemphill is the founder of MedHaul. MedHaul offers cloud-based solutions that ease the burdens of managing patient transportation.Star Cunningham founder of 4D HealthwareStar Cunningham is the founder and CEO of 4D Healthware. 4D Healthware is patient engagement software that makes personalized medicine possible through connected data.Kimberly Wilson founder of HUEDKimberly Wilson is the founder of HUED. HUED is a healthcare technology startup that helps patients find and book appointments with Black and Latinx healthcare providers. Financial Viola Llewellyn co-founder of Ovamba SolutionsViola Llewellyn is the co-founder and the president of Ovamba Solutions, a US-based fintech company that provides micro, small, and medium enterprises in Africa and the Middle East with microfinance through a mobile platform.NanaEfua Baidoo Afoh-Manin, Briana DeCuir and Joanne Moreau founders of Shared Harvest FundNanaEfua, Briana and Joanne are the founders of Shared Harvest Fund. Shared Harvest Fund provides real opportunities for talented people to volunteer away their student loans. Photo of Sheena Allen, courtesy of People of Color in Tech. Sheena Allen founder of CapWaySheena Allen is best known as the founder and CEO of fintech company and mobile bank CapWay. Education Helen Adeosun co-founder of CareAcademyHelen Adeosun is the co-founder, president and CEO of CareAcademy, a start-up dedicated to professionalizing caregiving through online classes. CareAcademy brings professional development to caregivers at all levels. Alexandra Bernadotte founder of Beyond 12Alex Bernadotte is the founder and chief executive officer of Beyond 12, a nonprofit that integrates personalized coaching with intelligent technology to increase the number of traditionally underserved students who earn a college degree.Shani Dowell founder of PossipShani Dowell is the founder of Possip, a platform that simplifies feedback between parents, schools and districts. Learn more at possipit.com. Kaya Thomas of We Read TooKaya Thomas is an American computer scientist, app developer and writer. She is the creator of We Read Too, an iOS app that helps readers discover books for and by people of color.Kimberly Gray founder of Uvii Kimberly Gray is the founder of Uvii. Uvii helps students to communicate and collaborate on mobile with video, audio, and textNicole Neal co-founder of ProcureK12 by Noodle MarketsNicole Neal is the co-founder and CEO of ProcureK12 by Noodle Markets. ProcureK12 makes purchasing for education simple. They combine a competitive school supply marketplace with quote request tools and bid management.Beauty/Fashion/Consumer goodsRegina Gwyn founder of TresseNoireRegina Gwynn is the co-founder & CEO of TresseNoire, the leading on-location beauty booking app designed for women of color in New York City and Philadelphia.Camille Hearst co-founder of Kit.Camille Hearst is the CEO and co-founder of Kit. Kit lets experts create shoppable collections of products so their followers can buy and the experts can make some revenue from what they share. Photo of Esosa Ighodaro courtesy of Under30CEO. Esosa Ighodaro co-founder of CoSign Inc. Esosa Ighodaro is the co-founder of CoSign Inc., which was founded in 2013. CoSign is a mobile application that transfers social media content into commerce giving cash for endorsing and cosigning products and merchandise like clothing, home goods, technology and more.EnvironmentJessica Matthews founder of Uncharted PowerJessica O. Matthews is a Nigerian-American inventor, CEO and venture capitalist. She is the co-founder of Uncharted Power, which made Soccket, a soccer ball that can be used as a power generator.Etosha Cave co-founder of Opus 12 Etosha R. Cave is an American mechanical engineer based in Berkeley, California. She is the Co-Founder and Chief Scientific Officer of Opus 12, a startup that recycles carbon dioxide.Kellee James founder of Mercaris, Inc. Kellee James is the founder and CEO of Mercaris, Inc., a growing, minority-led start-up that makes efficient trading of organic and non-GMO commodities possible via market data service exchanges and trading platforms.Workplace Photo of Lisa Skeete Tatum courtesy of The Philadelphia Citezen. Lisa Skeete Tatum founder of LanditLisa Skeete Tatum is the founder and CEO of Landit, a technology platform created to increase the success and engagement of women in the workplace, and to enable companies to attract, develop, and retain high-potential, diverse talent.Netta Jenkins and Jacinta Mathis founders of Dipper Netta Jenkins and Jacinta Mathis are founders of Dipper, a platform that acts as a safe digital space for individuals of color in the workplace.Sherisse Hawkins founder of Pagedip Sherisse Hawkins is the visionary and founder of Pagedip. Pagedip is a cloud-based software solution that allows you to bring depth to digital documents, enabling people to read (text), watch (video) and do (interact) all in the same place without ever having to leave the page.Thkisha DeDe Sanogo founder of MyTAASKThkisha DeDe Sanogo is the founder of MyTAASK. MyTAASK is a personal planning platform dedicated to getting stuff done in real-time.Home Photo of Jean Brownhill, courtesy of Quartz at Work. Jean Brownhill founder of Sweeten Jean Brownhill is the founder and CEO of Sweeten, an award-winning service that helps homeowners and business owners find and manage the best vetted general contractors for major renovation projects.Reham Fagiri co-founder of AptDecoReham Fagiri is the co-founder of AptDeco. AptDeco is an online marketplace for buying and selling quality preowned furniture with pick up and delivery built into the service.Stephanie Cummings founder of Please Assist Me Stephanie Cummings is the founder and CEO of Please Assist me. Please Assist Me is an apartment task service in Nashville, TN. The organization empowers working professionals by allowing them to outsource their weekly chores to their own personal team.Law Kristina Jones co-founder of Court BuddyKristina Jones is the co-founder of Court Buddy, a service that matches clients with lawyers.Sonja Ebron and Debra Slone founders of Courtroom5Sonja Ebron and Debra Slone are the founders of Courtroom5. Courtroom5 helps you represent yourself in court with tools, training, and community designed for pro se litigants.Crowdfunding Zuley Clarke founder of Business Gift RegistryZuley Clarke is the founder of Business Gift Registry, a crowdfunding platform that lets friends and family support an entrepreneur through gift-giving just like they would support a couple for a wedding. Full Article News & Culture
ad So You've Written a Bad Design Take By feedproxy.google.com Published On :: Tue, 05 May 2020 08:00:00 -0400 So you’ve just written a blog post or tweet about why wireframes are becoming obsolete, the dangers of “too accessible” design, or how a certain style of icon creates “cognitive fatigue.” Your post went viral, but now you’re getting ratioed by rude people on the Internet. That sucks! You were just trying to start a conversation and you probably didn’t deserve all that negativity (except for you, “too accessible” guy). Most likely, you made one of these common mistakes: 1. You made generalizations about “design” You, a good user-centered designer, know that you are not your user. Nor are you every designer. First of all, let's acknowledge that there is no universal definition of design. Even if we narrow it down to software design, it’s still hard to make generalizations. Agency, in-house, product, startup, enterprise, non-profit, website, app, connected hardware, etc. – there are a lot of different work contexts and cultures for people with “designer” in their titles. "The Design Industry" is not a thing, but even if it were, you don't speak for it. Don’t assume that the kind of design work you do is the universal default. 2. You didn’t share enough context There are many great design books and few great design blog posts. (There are, to my knowledge, no great design tweets, but I am open to your suggestions.) Writing about design is not well suited to short formats, because context plays such an important role and there’s always a lot of it to cover. Writing about your work should include as much context as you would include if you were presenting your portfolio for a job interview. What kind of organization did you work for? Who was your client and/or your stakeholders? What was the goal of the project? Your timeline? What was the makeup of your team? What were the notable business rules and constraints? How are you defining effectiveness and success? Without these kinds of details, it’s not possible for other designers to know if what you’ve written is credible or applicable to them. 3. You were too certain A blog post doesn’t need to be a dissertation. It’s okay to share hunches and anecdotes, but give the necessary caveats. And if you're making claims about science, bruh, you gotta cite your sources. Be humble in your takes. Your account of what worked for you and why is more valuable to your peers than making sweeping claims and reheating the same old arguments. Be prepared to be told you’re wrong, and have the humility to realize that your perspective is just your perspective. Real conversations, like good design, are built on feedback and diverse viewpoints. — Together, we can improve the discourse in our information ecosystems. Don't generalize. Give context. Be humble. Full Article Design & Content User Experience
ad Adobe buys Nitobi By feedproxy.google.com Published On :: Wed, 05 Oct 2011 01:52:57 +0000 As it kicked off its yearly developer event, Adobe announced that it had acquired Nitobi Software, maker of PhoneGap open source software for cross-platform mobile application building with HTML5 and JavaScript. In a blog, Nitobi CEO Andre Charland pledged to pursue donation of the PhoneGap code to the Apache Software Foundation ”to ensure open stewardship Read the rest... Full Article Front Page html5 JavaScript Mobile