Skip to content

Instantly share code, notes, and snippets.

{"created_at":"Wed Mar 03 06:41:53 +0000 2021","id":1367002268105588738,"id_str":"1367002268105588738","text":"Was ein schlechter hashtag? #socialLp12345","source":"\u003ca href=\"https:\/\/mobile.twitter.com\" rel=\"nofollow\"\u003eTwitter Web App\u003c\/a\u003e","truncated":false,"in_reply_to_status_id":null,"in_reply_to_status_id_str":null,"in_reply_to_user_id":null,"in_reply_to_user_id_str":null,"in_reply_to_screen_name":null,"user":{"id":1338498629976399881,"id_str":"1338498629976399881","name":"lptweet","screen_name":"lptweet3","location":null,"url":null,"description":null,"translator_type":"none","protected":false,"verified":false,"followers_count":0,"friends_count":0,"listed_count":0,"favourites_count":0,"statuses_count":29,"created_at":"Mon Dec 14 14:58:46 +0000 2020","utc_offset":null,"time_zone":null,"geo_enabled":false,"lang":null,"contributors_enabled":false,"is_translator":false,"profile_background_color":"F5F8FA","profile_background_image_url":"","profile_background_image_url_https":"","profile
@tobnee
tobnee / UriBuilder.scala
Created June 30, 2016 09:07
query builder helper for play
object UriBuilder {
def base(base: String) = new UriBuilder(base, Vector.empty, Vector.empty)
}
case class UriBuilder(
base: String, path: Vector[String], query: Vector[(String, String)]) {
def path(segments: String*): UriBuilder =
new UriBuilder(base, segments.toVector, Vector.empty)

####Kommentar zu M. Nygard - Maneuverable Web Architecture:

Was kann man mitnehmen aus einem Talk von M. Nygard? Viel, aber nie das was man erwartet. Zugegeben ist die Analogie zu den Kampfpiloten recht weit hergeholt und hat in erster Linie wenig mit Architekturen zu tun. Nygard hat aber genauer hingeschaut und anschaulich erklärt, wie sich Kampfpiloten physikalische Kräfte zu nutzen machen um ihre Dogfights in den Lüften zu gewinnen. Das zielgerichtete Freisetzen und Aufnehmen von Impulsen, um sich in dem Raum der physikalischen Gesetze optimal zu bewegen, verbindet Nygard mit dem Schlüsselwort der Manövrierfähigkeit.

Die Architektur eines IT-Systems bewegt sich ebenfalls in einem Raum. Oftmals in einem turbulenten Projektgeschäft mit ständig wechselnden Anforderungen. Nygard forciert hier das Ziel: eine Architektur so zu gestallten, dass sie Impulse steuern kann. Es geht dabei um Kontrolle von Tempo, Anpassung und Wachstum.

Diese Ideen sind nicht völlig neu, wenn auch anschaulich dargestellt. Als E

Phil Calçado lernte ich bereits vor einiger Zeit auf einem Event in Berlin kennen und hatte daher hohe Erwartungen an seinen Vortrag APIs: The Problems with Eating your Own Dog food. Ich sollte nicht enttäuscht werden. Nachdem die Frage: "Was ist Soundcloud?" und die damit verbundenen Anforderungen an Performanz geklärt waren, wurde dargestellt, wie sich die Soundcloud Architektur über die Zeit entwickelt hat.

Während dieser Evolution wurde zeitweise das Rendern der Webseite auf den Browser verlagert, was zu ungefähr 159 API-Anfragen pro Seitenanfrage führte. Nicht nur dem Publikum machte diese Zahl Angst sondern auch der Soundcloud Crew, jedoch war man zuversichtlich dass durch zusätzliche Server diese Last zu schaffen sei. Schnell lernte man, dass nach dem Zusammenbruch des HAProxy weitere Komponenten (memcached/Rails/MySQL) der Masse an Anfragen nicht gewachsen waren.

@tobnee
tobnee / PimpAcceptHeader.scala
Created September 26, 2013 20:42
Change the Accept header based on a query parameter in Play. (http://mysite/stuff/1?as=json)
import play.api.http.{ HeaderNames, MimeTypes }
import play.api.mvc.{ Headers, Handler, RequestHeader }
import scala.collection.mutable.ArrayBuffer
import play.api.GlobalSettings
object Global extends GlobalSettings {
override def onRequestReceived(request: RequestHeader): (RequestHeader, Handler) = {
val defaultHeader = super.onRequestReceived(request)
val (header, handler) = defaultHeader
trait Github {
def login(cred:Credentials) = {
val response: Future[Response] = WS
.url(models.github.baseUrl+"/user")
.withAuth(cred.username, cred.password, AuthScheme.BASIC)
.head()
response.onSuccess{ case response =>
Cache.set(cred.password+""+"passwd", response)
}
import akka.actor.{ActorSystem, Props, Actor}
import collection.mutable
import play.api.cache.Cache
import concurrent.Future
import akka.pattern.ask
import akka.util.Timeout
import scala.concurrent.duration._
import play.api.libs.concurrent.Akka._
object AsyncCache {
@tobnee
tobnee / CNPlay.scala
Last active December 11, 2015 11:28
Play2 based content negotiation
import play.api.mvc._
import play.api.mvc.Results._
import play.api.http.MimeTypes._
def resource() = Action { implicit request =>
negotiate(
HTML ->
(() => Ok("html")),
JSON ->
(() => Ok("json")),
@tobnee
tobnee / gist:3820858
Created October 2, 2012 16:40
Render ChemVector (Jquery/Knockout)
<!DOCTYPE html>
<html lang="en">
<head>
<title>mols</title>
<script src="/assets/javascripts/jquery-1.7.2.min.js" type="text/javascript"></script>
<script src="/assets/javascripts/jquery-ui-1.8.20.custom.min.js" type="text/javascript"></script>
<script src="/assets/javascripts/knockout-2.1.0.js" type="text/javascript"></script>
<link rel="stylesheet" type="text/css" href="/assets/stylesheets/chemvector.css" />
<link rel="stylesheet/chemical" type="application/json" href="/assets/stylesheets/chemistry.json" />
<script src="/assets/javascripts/chemvector.js"></script>
@tobnee
tobnee / gist:3808506
Created September 30, 2012 21:33
ChemVector Integration
<!-- knockout js bind -->
<div data-bind="visible: searchable">
<div class="well">
<strong class="control-label">Name:</strong>
<p id="selectstype" data-bind="text: selectedProduct().name"> </p>
<strong class="control-label">CAS:</strong>
<p id="selectc" data-bind="text: selectedProduct().cas"> </p>
<div class="cell" id="resize-cell">
<div class="structure" id="resize-structure">
<object width="300" height="150" class="chemvector-object" id="resize-object">