Companies

Posted 6 months back at entp hoth blog - Home

Howdy.

Today we are deploying some changes to Companies. Companies are groups of users that have access to each other’s private discussions. This is often used when your product/service is used by multiple people inside a company, and they all need/want to participate in discussions/issues. This is a helpful system, but it was missing one big feature: notifications. So today, we are introducing Notifications for Companies.

So what are the changes:

  • By default, all members of a company will receive notifications about any discussion started (or replied to) by someone else in the company. This will help reduce duplicate reports, and keep everyone in the loop about what’s going on.

  • While “notifications on” will be the default, it can be turned on/off for each company individually. Small companies may want to know about everything, while larger group might just need access. You can change the default on the company page.

  • Each user of a company can set their own preference regarding notifications. This means that if the default for a company is “off”, one particular user may still decide that they want to be notified about everything. On the other hand, if the default is “on”, one or multiple users might not need to be involved all the time and can decide not to receive notifications. We feel that this offers the most flexibility, both for the support site, and for the individual users.

  • Finally, if a user is subscribed to company notifications, they can still unsubscribe from a particular discussion by clicking the “unsubscribe” button or replying #ignore by email.

While notifications are the biggest change, there are also a number of smaller improvements across the board:

  • You can now add/remove a Company as a watcher. When a user who is part of a company creates a discussion or replies to a discussion, the company gets added as a watcher. So if you need to keep the discussion private with only this user, you can simply remove the company and the original user will be the only one with access/notifications.

  • Adding watchers now autocompletes on the “add watcher” widget, as well as on the “new discussion” page, both on the frontend and on the dashboard. And you can add companies directly (or you can add a member of the company, both will work).

    Adding a watcher

  • Users get notified when they are added to a company, and will get links to update their notifications and access all the company discussions. This should make onboarding of new members easier.

  • It is now easier to add an existing user to a company: just go on their profile and select the company in the dropdown.

    Selecting the company

  • You can now see if a user is part of a company in the discussion header: John Doe (Company).

That’s about it. Hope you enjoy the changes! You can find out more about companies in the knowledge base.

Cheers.

Why is my CDN 'slow' for mobile clients?

Posted 6 months back at igvita.com

We're using a CDN but when we look at the performance numbers it appears to be far less effective for mobile clients. We're considering disabling it entirely as we're not sure that it's worth it. Someone needs to build a special CDN for mobile, we'd definitely use that to improve latency!

The frequency with which I've been hearing this and similar arguments has been rapidly increasing as more teams are finally focusing on improving performance of their mobile sites. The problem is, while the statement is often based on real data (i.e. the relative performance improvements offered by a CDN are smaller for mobile clients), the conclusion is wrong: the absolute improvements are likely the same for all clients and hence worth every penny. Also, we don't need a "mobile CDN", we need carriers to fix their networks.

The many components of latency

To understand why the relative metrics between desktop and mobile CDN performance are misleading many otherwise well-informed teams, it helps to take a step back and consider the actual topology of the internet, plus what CDNs can and cannot do. In fact, for sake of a concrete example, let's assume the following:

  • Client is located on the west coast; server is located on the east coast.
  • The propagation latency between west and east US coasts is 50 ms.
  • The server response time is 50 ms.
  • Last-mile latency for "tethered" clients: ~18 ms for fiber, ~26 ms for cable, ~44 ms for DSL.
  • Last-mile latency for "wireless" clients: ~50 ms for 4G, ~200 ms for 3G.

The total time to service the request is a combination of all of the latencies in both directions: last-mile → coast to coast (50 ms) → server response (50 ms) → coast to coast (50 ms) → last-mile. For example, if the client happens to be on a fiber connection with a 18 ms last-mile path, then the total time is 18+50+50+50+18, or 186 milliseconds.

The last-mile latencies we're using above are specific to the US and are courtesy of the Measuring Broadband America report (FCC, 2013). Sadly, FCC has not yet published any similar reports for US mobile carriers. As a result, the ~50 and ~200ms numbers are based on specified and cited targets of existing US carriers.

Accelerating content delivery with a CDN

The whole premise of a CDN is to move the bytes as close to the user as possible and to do so CDNs deploy cache servers within various data centers and peering points around the globe. In other words, in the optimal case the CDN servers are located immediately outside the ISP / carrier network: the client makes a request, incurs the cost of last-mile latency to exit the ISP / carrier network and immediately hits a CDN server that returns a response. As a result, CDN minimizes the propagation latency and if a static resource is served, also reduces the server response time by returning a cached asset.

To continue with our earlier example, let's assume that our CDN server is optimally placed (~5 ms path instead of 50 ms coast-to-coast path) and that we are requesting a publicly cacheable asset that can be served by the CDN (~5ms) without hitting the origin. For our fiber client, the new total time is the sum of the last-mile roundtrip plus the CDN response times: 18+5+5+5+18, or 51 ms in total. As a result, adding a CDN took our request time from ~186ms down to ~51ms: a 365% improvement in total latency!

Last-mile Coast-to-Coast Server Response Total (ms) Improvement
Fiber 18 50 50 186
Cable 26 50 50 202
DSL 44 50 50 238
4G 50 50 50 250
3G 200 50 50 550
CDN + Fiber 18 5 5 51 -135 ms (365%)
CDN + Cable 26 5 5 67 -135 ms (301%)
CDN + DSL 44 5 5 103 -135 ms (231%)
CDN + 4G 50 5 5 115 -135 ms (217%)
CDN + 3G 200 5 5 415 -135 ms (133%)

Repeating the same calculation for each connection profile reveals an unfortunate trend: the relative effectiveness of the CDN "declines" as the last-mile latency increases. If you consider the topology of where the CDN servers are typically placed this makes perfect sense: CDN servers are outside the ISP network. That said, note that the absolute latency improvement is still the same regardless of the last-mile profile.

CDNs help minimize propagation and server response times. If your only metric is the relative before and after improvement, then it would appear that a CDN is not doing much for mobile clients - e.g. a mere 33% improvement for 3G clients. In reality, the savings are the same, and the real takeaway is that the last-mile latency of most mobile carriers dominates all other latencies of the resource transfer - yes, a rather sad state of affairs.

Operational and business costs of living at the edge

One obvious strategy to improve the end-to-end latency is to move the cache servers even closer to the client: instead of positioning them outside the ISPs network, could we move them inside? In principle, the answer is yes, and many ISPs already deploy their own cache servers. However, in practice, this is a tricky problem.

First, the number of peering points is relatively small, which allows CDNs to deploy in dozens of well known locations around the globe to provide their service. Also, to do so, they don't have to do any special deals with individual ISPs: typically, the servers are deployed in shared data centers (peering points). By contrast, moving servers into the ISP network would require individual deals with each ISP - not impossible, but obviously a much harder operational and business problem.

For the sake of argument, let's say a CDN does strike a deal with an ISP. Now the CDN needs to deploy many more servers, and ideally as close to their customers as possible (near the radio towers and other aggregation points). Doing so would require a lot of hardware, makes maintenance and upgrades an operations nightmare, and opens a lot of security questions - e.g. would you deploy a TLS termination node within a third-party operated network that you don't have direct access to? In short, it's a cost, security, and a logistics nightmare.

That's not to say this can't be done. Many ISPs have long been trying to move "upmarket" and provide CDN functionality. However, ISPs have a different problem: it's very hard for them to sign clients because most sites are not interested in signing individual deals with every ISP on the planet. In recent news, Verizon acquired EdgeCast... It remains to be seen what they do with it and if this will actually benefit Verizon clients.

Business and operational costs aside, there is nothing particularly special about optimizing CDNs for mobile clients. The root problem is that the last-mile latency of mobile carriers is atrocious - that's what we need to fix. Instead of pushing cache servers closer to the edge, we need transparency into performance of these networks, and we need more competition between carriers to address the underlying last-mile performance problems.

CDNs are not slow for mobile, use them

In short, there is no reason why CDNs are inherently 'slower' for mobile clients: don't confuse relative gains with absolute savings. That said, the actual performance will obviously vary for each CDN provider based on location of their servers and connectivity with various mobile carriers - measure, gather real data, optimize.

The Phusion founders’ PGP keys have been updated

Posted 6 months back at Phusion Corporate Blog

Phusion takes security very seriously. This is why we strongly believe in protecting the authenticity and integrity of our communications and our software, and why we employ the use of PGP digital signatures. Using our PGP keys, you can verify the authenticity and integrity of all emails and files that we publish to you or to the world. All software releases that we make are signed with one of our PGP keys.

The founders’ keys have changed

As Phusion’s founders, we – Hongli Lai and Ninh Bui – have our own personal PGP keys as well, which we use to encrypt or sign some of our emails and git commits. We’ve recently run a security audit and noticed that our PGP keys are no longer deemed as secure as they should be. The keys that we’ve been using until today were made back in 2009, but the recommended algorithms and key sizes in 2014 are quite different from what they were 5 years ago. For this reason, we’ve decided to revoke our old keys and to create new ones, with stronger security settings.

Nothing has been compromised. We are simply renewing our keys as a precaution.

Effective immediately, our new PGP keys are as follows:

  • Hongli Lai (hongli@phusion.nl)
    Short key ID: 8C59158F
    Long key ID: CD70085E8C59158F
    Fingerprint: 218A 7255 83D0 2ECE F3A9 C2A7 CD70 085E 8C59 158F
  • Ninh Bui (ninh@phusion.nl)
    Short key ID: 69481265
    Long key ID: AE405F7869481265
    Fingerprint: A77C 9CEF 766D 0E7D A95B 8778 AE40 5F78 6948 1265

If you had our old keys in your keyring, please update them so that you see the revocations:

gpg --refresh-keys --keyserver pool.sks-servers.net
# -OR-
gpg --refresh-keys --keyserver keyserver.ubuntu.com

No effect on the signatures of our file releases

Please note that Phusion’s software releases and Ruby gems are not signed with our personal keys. Instead, they’re signed with the Phusion Software Signing key, which is still considered strong enough.

Our git commits, though, are often signed with our personal keys.

If you’re using Phusion Passenger, we strongly recommend you to cryptographically verify every release. The Phusion Passenger documentation contains comprehensive instructions that explains how you can verify our tarballs, Ruby gems, Git commits and more.

Onward and upwards!

With kind regards,
Hongli Lai
Ninh Bui

Episode #451 - March 25th, 2014

Posted 6 months back at Ruby5

Aimee and Carlos talk about Postgres & jsonb, Cucumber JVM, Rails remote factories, and deploying to OpenShift on today's episode of Ruby5.

Listen to this episode on Ruby5

Sponsored by ElixirSips

If you're interested in learning Elixir, but don't know where to start, then elixirsips.com is perfect for you. It's two short screencasts each week - between 5 and 15 minutes each. ElixirSips currently consists of over 7 hours of densely packed videos, and there are more every week.
This episode is sponsored by ElixirSips.com

PostgreSQL introduced jsonb

Oleg Bartunov has recently announced Postgres' support for jsonb, a binary JSON data type. This should come as great news for Ruby developers, since lots of us choose PostgreSQL as our database of choice. This feature is super new, and it's currently only available on the 9.4 development version of Postgres.
PostgreSQL introduced jsonb

Cucumber JVM 1.1.6

Aslak Hellesoy announced yesterday that version 1.1.6 of Cucumber-JVM has been released. Cucumber JVM is the pure Java implementation of Cucumber, with support for languages that run on the Java Virtual Machine. This new version includes over 40 bugfixes and improvements. The most significant improvements are on the areas of DataTable API, performance, concurrency and Android support. Check out the github repo for a full list of what's changed in the 1.1.6 version of Cucumber JVM.
Cucumber JVM 1.1.6

Offshore: Rails Remote Factories

The folks at TaskRabbit just released Offshore, a gem that allows you to use factories from your central application in another application’s test suite. In addition to that, a normal test suite has factories and/or fixture data and it uses database transactions to reset the data for every test, and Offshore brings this to the SOA world by handling the rollback between tests for you.
Offshore: Rails Remote Factories

Deploying to OpenShift

Ramesh Jha recently wrote a blog post on how to deploy a Rails application to OpenShift. OpenShift is an open source Platform-As-A-Service solution from RedHat. It's kind of like Heroku, as it allows you to easily manage apps without any hassle, but with OpenShift, you can install it on your server and create your own sort of private cloud.
Deploying to OpenShift

Thank You for Listening to Ruby5

Ruby5 is released Tuesday and Friday mornings. To stay informed about and active with this podcast, we encourage you to do one of the following:

Thank You for Listening to Ruby5

Introducing Lotus::View

Posted 6 months back at Luca Guidi - Home

The missing part of all the Ruby web frameworks is the distinction between views and templates. A view is an object that encapsulates the presentation logic of a page. A template is a file that defines the semantic and visual elements of a page. In order to show a result to an user, a template must be rendered by a view.

Keeping things separated, helps to declutter templates and models from presentation logic. Also, since views are objects they are easily testable. If you ever used Mustache, you are already aware of the advantages.

Lotus::View is based on these simple concepts.

Views

Here how a view looks like:

require 'lotus/view'

module Articles
  class Index
    include Lotus::View
  end
end

This syntax follows the Lotus philosophy: include a module that injects a minimal interface. Before to illustrate how to use a view, I’d like to talk about a few conventions:

* Templates are searched under Lotus::View.root, set this value according to your app structure (eg. "app/templates"). * A view will look for a template with a file name that is composed by its full class name (eg. "articles/index"). * A template must have two concatenated extensions: one for the format one for the engine (eg. ".html.erb"). * The framework must be loaded before to render for the first time: Lotus::View.load!.

Usage

Suppose that we want to render a list of articles:

require 'lotus/view'

module Articles
  class Index
    include Lotus::View
  end
end

Lotus::View.root = 'app/templates'
Lotus::View.load!

path     = Lotus::View.root.join('articles/index.html.erb')
template = Lotus::View::Template.new(path)
articles = ArticleRepository.all

Articles::Index.new(template, articles: articles).render

While this code is working fine, it’s inefficient and verbose, because we are loading a template from the filesystem for each rendering attempt. Also, this is strictly related to the HTML format, what if we want to manage other formats?

require 'lotus/view'

module Articles
  class Index
    include Lotus::View
  end

  class AtomIndex < Index
    format :atom
  end
end

Lotus::View.root = 'app/templates'
Lotus::View.load!

articles = ArticleRepository.all

Articles::Index.render(format: :html, articles: articles)
  # => This will use Articles::Index
  #    and "articles/index.html.erb"

Articles::Index.render(format: :atom, articles: articles)
  # => This will use Articles::AtomIndex
  #    and "articles/index.atom.erb"

Articles::Index.render(format: :xml, articles: articles)
  # => This will raise a Lotus::View::MissingTemplateError

First of all, we are preloading templates according to the above conventions, they are cached internally for future use. This is a huge performance improvement.

A view is able to understand the given context and decide if render by itself or delegate to a subclass.

All the objects passed in the context are called locals, they are available both in the view and in the template:

require 'lotus/view'

module Articles
  class Show
    include Lotus::View

    def authors
      article.map(&:author).join ', '
    end
  end
end
<h1><%= article.title %></h1>
<article>
  <%= article.content %>
</article>

All the methods defined in the view are accessible in the template:

<h2><%= authors %></h2>

Custom rendering

Since a view is an object, you can override #render and provide your own rendering policy:

require 'lotus/view'

module Articles
  class Show
    include Lotus::View
    format :json

    def render
      ArticleSerializer.new(article).to_json
    end
  end
end

Articles::Show.render({format: :json, article: article})
  # => This will render from ArticleSerializer,
  #    without the need of a template

Other features

Lotus::View supports countless rendering engines, layouts, partials and it has lightweight presenters. They are explained in detail in the README and the API documentation.

Roadmap

As part of the Lotus roadmap, I will open source a framework each month. On April 23rd I will release Lotus::Model.

To stay updated with the latest releases, to receive code examples, implementation details and announcements, please consider to subscribe to the Lotus mailing list.

<link href="//cdn-images.mailchimp.com/embedcode/slim-081711.css" rel="stylesheet" type="text/css"/>

Episode #450– March 21st, 2014

Posted 6 months back at Ruby5

Ruby Tricks, Prawn Release, How the Bundler API works

Listen to this episode on Ruby5

Sponsored by NewRelic

New Relic, CEO Lew Cirne made what he believes is New Relic’s biggest and most exciting announcement since the company was founded in 2008: the launch of New Relic Insights.
NewRelic

Nobody Knows Ruby

Arne Brasseur gave a great lightning talk at wroc love rb entitled Nobody Knows Ruby
Nobody Knows Ruby

The New Rubygems Index Format

Andre Arko posted an update on The New Rubygems Index Format
The New Rubygems Index Format

Rails Girls Summer of Code 2014

Rails Girls Summer of Code 2014 is now open. After their successes last summer they are going to do it again. If you run an Open Source project they would love to help you this summer
Rails Girls Summer of Code 2014

Ruby Command Line Interface Gems

Jesse Herrick has written up a summary of Ruby Command Line Interface Gems
Ruby Command Line Interface Gems

Ruby5

Thank you for listening to Ruby5. Be sure to tune in every Tuesday and Friday for the latest news in the Ruby and Rails community.
Ruby5

Prawn 1.0 is finally here

The current team says their history is long and complicated, but the basic story is that Prawn is a very powerful but unwieldy ball of legacy code that they've been trying to rebuild from the inside out for many years now.
Prawn 1.0 is finally here

Knowledge Base Only

Posted 6 months back at entp hoth blog - Home

Howdy!

While Tender is a great support platform, sometimes all you need is a simple Knowledge Base. So we just deployed an option to do just that. You can find out more in the knowledge base article.

Cheers!

Library, Bologna, Italy

Posted 6 months back at omg blog!! lol!!



Library, Bologna, Italy

Turquoise, Lake Sauris, Friuli, Italy

Posted 6 months back at omg blog!! lol!!



Turquoise, Lake Sauris, Friuli, Italy

Ancient House, Brittany, France

Posted 6 months back at omg blog!! lol!!



Ancient House, Brittany, France

Episode #449– March 18th, 2014

Posted 6 months back at Ruby5

Business time features, Rails is half your app, Rake rule tasks, Polymorphism, Hash Selectors and Rails 4.0.4 released all on today's Ruby 5.

Listen to this episode on Ruby5

Sponsored by Top Ruby Jobs

If you're looking for a top Ruby job or for top Ruby talent, then you should check out Top Ruby Jobs. Top Ruby Jobs is a website dedicated to the best jobs available in the Ruby community.
This episode is sponsored by Top Ruby Jobs

Experimental Features for business hours only.

This week David Celis at New Relic wrote about how his team uses business hours feature flags for new features in production.
Experimental Features for business hours only.

Rails is Half Your App

Marcin Kulik recently sent a blog post entitled “Rails is half of your application”.. Where he explains that there are two parts of your application, the part that only works inside Rails and the part that is independent of Rails.
Rails is Half Your App

Rake Rule Tasks

This week our very own Jacob Swanner wrote about how create “rule” tasks in rake.
Rake Rule Tasks

Back to Basics: Polymorphism

If you’re not familiar with all the different ways that Ruby can be Polymorphic, you definitely should check out Britt Ballard’s post on the Thoughtbot blog.
Back to Basics: Polymorphism

Hash Selector Pattern

Zack Siri wrote to us this week to let us know about a pattern in ruby he’s found helpful he even recorded a screencast and wrote up a blog about it. He’s calling it the Hash Selector Pattern.
Hash Selector Pattern

Rails 4.0.4 released

Last Thursday Rails 4.0.4 was released.
Rails 4.0.4 released

Thank You for Listening to Ruby5

Ruby5 is released Tuesday and Friday mornings. To stay informed about and active with this podcast, we encourage you to do one of the following:

Thank You for Listening to Ruby5

Narrow Street, Dodecanese Islands, Greece

Posted 6 months back at omg blog!! lol!!



Narrow Street, Dodecanese Islands, Greece

Phusion Passenger 4.0.39 released

Posted 6 months back at Phusion Corporate Blog

Phusion Passenger is a fast and robust web server and application server for Ruby, Python, Node.js and Meteor. Passenger takes a lot of complexity out of deploying web apps, and adds powerful enterprise-grade features that are useful in production. High-profile companies such as Apple, New York Times, AirBnB, Juniper, American Express, etc are already using it, as well as over 350.000 websites.

Phusion Passenger is under constant maintenance and development. Version 4.0.39 is a bugfix release.

Phusion Passenger also has an Enterprise version which comes with a wide array of additional features. By buying Phusion Passenger Enterprise you will directly sponsor the development of the open source version.

Recent changes

  • Fixed a crash that could happen if the client disconnects while a chunked response is being sent. Fixes issue #1062.
  • In Phusion Passenger Standalone, it is now possible to customize the Nginx configuration file on Heroku. It is now also possible to permanently apply changes to the Nginx configuration file, surviving upgrades. Please refer to the "Advanced configuration" section of the Phusion Passenger Standalone manual for more information.
  • The programming language selection menu in passenger-install-apache2-module and passenger-install-nginx-module only works on terminals that support UTF-8 and that have a UTF-8 capable font. To cater to users who cannot meet these requirements (e.g. PuTTY users using any of the default Windows fonts), it is now possible to switch the menu to a plain text mode by pressing ‘!’. Fixes issue #1066.
  • Fixed printing UTF-8 characters in log files in Phusion Passenger Standalone.
  • It is now possible to dump live backtraces of Python apps through the ‘SIGABRT’ signal.
  • Fixed closing of file descriptors on OS X 10.9.
  • Fixed compilation of native_support on Rubinius.

Installing or upgrading to 4.0.39

OS X OS X Debian Debian Ubuntu Ubuntu
Heroku Heroku Ruby gem Ruby gem Tarball Tarball

Final

Fork us on Github!

Phusion Passenger’s core is open source. Please fork or watch us on Github. :)

<iframe src="http://ghbtns.com/github-btn.html?user=phusion&amp;repo=passenger&amp;type=watch&amp;size=large&amp;count=true" allowtransparency="true" frameborder="0" scrolling="0" width="170" height="30"></iframe><iframe src="http://ghbtns.com/github-btn.html?user=phusion&amp;repo=passenger&amp;type=fork&amp;size=large&amp;count=true" allowtransparency="true" frameborder="0" scrolling="0" width="170" height="30"></iframe><iframe src="http://ghbtns.com/github-btn.html?user=phusion&amp;type=follow&amp;size=large&amp;count=true" allowtransparency="true" frameborder="0" scrolling="0" width="190" height="30"></iframe>

If you would like to stay up to date with Phusion news, please fill in your name and email address below and sign up for our newsletter. We won’t spam you, we promise.



Blue Forest, United Kingdom

Posted 6 months back at omg blog!! lol!!



Blue Forest, United Kingdom

Mountain Top, Meteora, Greece

Posted 6 months back at omg blog!! lol!!



Mountain Top, Meteora, Greece