charles leifer | What happened?: "Python 2.7 is a fantastic language for beginners and experts alike. It's so simple and readable that it's sometimes referred to as executable pseudo-code.
At some point a few years ago, things changed for the worse.
Did Python sell out? I don't know. Maybe Guido caved to some persuasive people with bad ideas. Maybe communists, wanting to reduce global productivity, railroaded through all these garbage PEPs. Maybe Python wanted to throw off its reputation as a toy language and become a serious language like Node.js... Whatever the case, when I look at all the PEPs that have been accepted over the past couple years, I can see that the inmates are now running the asylum."
'via Blog this'
Be warned that this is mostly just a collection of links to articles and demos by smarter people than I. Areas of interest include Java, C++, Scala, Go, Rust, Python, Networking, Cloud, Containers, Machine Learning, the Web, Visualization, Linux, System Performance, Software Architecture, Microservices, Functional Programming....
Monday, 27 February 2017
Friday, 24 February 2017
A Simple Guide for Python Packaging – Medium
A Simple Guide for Python Packaging – Medium: "Code reuse is a very common need. It saves you time for writing the same code multiple times, enables leveraging other smart people’s work to make new things happen. Even just for one project, it helps organize code in a modular way so you can maintain each part separately. When it comes to python, it means format your project so it can be easily packaged. This is a simple instruction on how to go from nothing to a package that you can proudly put it in your portfolio to be used by other people."
'via Blog this'
'via Blog this'
Thursday, 23 February 2017
API Design Guide | Cloud APIs | Google Cloud Platform
API Design Guide | Cloud APIs | Google Cloud Platform: "This is a general design guide for networked APIs. It has been used inside Google since 2014 and is the guide we follow when designing Cloud APIs and other Google APIs. It is shared here to inform outside developers and to make it easier for us all to work together.
External developers may find it particularly useful when designing gRPC APIs for use with Google Cloud Endpoints, and we strongly recommend such developers use these design principles. However, we don't mandate its use for any non-Google developer and you can use Cloud Endpoints and/or gRPC without following the guide.
This guide applies to both REST APIs and RPC APIs, with specific focus on gRPC APIs. gRPC APIs use Protocol Buffers to define their API surface and API Service Configuration to configure their API services, including HTTP mapping, logging, and monitoring. HTTP mapping features are used by Google APIs and gRPC Cloud Endpoints APIs for JSON/HTTP to Protocol Buffers/RPC transcoding."
'via Blog this'
External developers may find it particularly useful when designing gRPC APIs for use with Google Cloud Endpoints, and we strongly recommend such developers use these design principles. However, we don't mandate its use for any non-Google developer and you can use Cloud Endpoints and/or gRPC without following the guide.
This guide applies to both REST APIs and RPC APIs, with specific focus on gRPC APIs. gRPC APIs use Protocol Buffers to define their API surface and API Service Configuration to configure their API services, including HTTP mapping, logging, and monitoring. HTTP mapping features are used by Google APIs and gRPC Cloud Endpoints APIs for JSON/HTTP to Protocol Buffers/RPC transcoding."
'via Blog this'
Wednesday, 22 February 2017
business/startups: Chamath Palihapitiya – How we put Facebook on the path to 1 billion users | Genius
Chamath Palihapitiya – How we put Facebook on the path to 1 billion users | Genius: "
The takeaway from that were two things. One, and I'll get to this a little bit later, most people at most companies are really shit. That was manifested in large degree at AOL. I learned all the things not to do, one, and that was probably 90 percent of my learnings to be quite honest with you. Then 10 percent was reinforcing some things that I learned at Winamp which is really about core product value. What it means is create a real connection with someone. I think now we all euphemistically call it the “Aha” moment with the consumer. But also the power of how these communication networks when they develop create real entrenched usage and scale, and how these things can just dramatically accelerate adoption and engagement."
'via Blog this'
The takeaway from that were two things. One, and I'll get to this a little bit later, most people at most companies are really shit. That was manifested in large degree at AOL. I learned all the things not to do, one, and that was probably 90 percent of my learnings to be quite honest with you. Then 10 percent was reinforcing some things that I learned at Winamp which is really about core product value. What it means is create a real connection with someone. I think now we all euphemistically call it the “Aha” moment with the consumer. But also the power of how these communication networks when they develop create real entrenched usage and scale, and how these things can just dramatically accelerate adoption and engagement."
'via Blog this'
Tuesday, 21 February 2017
web: All JavaScript frameworks are terrible – Medium
All JavaScript frameworks are terrible – Medium: "A case study in confirmation bias and goalpost shifting
This article was originally written as a partnership with another one praising the virtues of all frameworks. It was intended to show in large part how easy it is to “spin” frameworks without ever being inaccurate. However, on working on both of them it was obvious to me that the other article was stronger, and I let this one wither on the vine. I’ve decided to finish it off and publish it, but need to reiterate. The other is the better article."
'via Blog this'
This article was originally written as a partnership with another one praising the virtues of all frameworks. It was intended to show in large part how easy it is to “spin” frameworks without ever being inaccurate. However, on working on both of them it was obvious to me that the other article was stronger, and I let this one wither on the vine. I’ve decided to finish it off and publish it, but need to reiterate. The other is the better article."
'via Blog this'
Monday, 20 February 2017
Linux: Getting the most out of Terminator | Al4
Getting the most out of Terminator | Al4: "Terminator is a must-have tool for Linux administrators. It’s a terminal emulator that supports multiple terminals via tabs, but also by dividing up its window with horizontal and vertical splits.
The user documentation is a bit sparse, in fact what you see in the man page is what you get. In this post I’ll take you through the features that I think make Terminator the best terminal emulator around."
'via Blog this'
The user documentation is a bit sparse, in fact what you see in the man page is what you get. In this post I’ll take you through the features that I think make Terminator the best terminal emulator around."
'via Blog this'
Sunday, 19 February 2017
ongoing by Tim Bray · Geek Career Paths
ongoing by Tim Bray · Geek Career Paths: "Suppose you’re doing technology, and like doing technology, and your career’s going well, and you find yourself wondering what you’re going to be doing in twenty years. I’ve been down several of the roads you might decide to take, and it occurs to me that talking them over might amuse and inform.
Thanks are due to Andre Leibovici, who tweeted Is it possible to be in a sr. leadership position and still be hands-on w/ tech & code? For geek leaders out there... how to juggle? and got me thinking about this."
'via Blog this'
Thanks are due to Andre Leibovici, who tweeted Is it possible to be in a sr. leadership position and still be hands-on w/ tech & code? For geek leaders out there... how to juggle? and got me thinking about this."
'via Blog this'
Data Science: The dirty secret of machine learning - O'Reilly Media
The dirty secret of machine learning - O'Reilly Media: ""Too many businesses now are pitching AI almost as though it's batteries included. I think that's dangerous because it's going to potentially lead to over-investment in things that overpromise. Then when they under-deliver, it has a deflationary effect on people's attitudes toward the space. It almost belittles the problem itself. Not everything requires the latest whiz-bang technology. In fact, the dirty secret of machine learning—and, in a way, venture capital—is so many problems could be solved by just applying simple regression analysis. Yet, very few people, very few industries do the bare minimum.""
'via Blog this'
'via Blog this'
What is the point of learning C? | CIO
What is the point of learning C? | CIO: "C is a fundamental language that is still in use in the IT industry. But that may change, says Mark Driver, a research analyst at Gartner. "They [C and C++] are the native tongue for system-level programming, and they probably will be for many years. Eventually, though, languages like Google Go or D may replace them."
"We see almost no demand for C or C++ among our IT centric clients," says Driver. "What we see is Java and other managed code languages being used," he says. "C doesn't allow you to address many modern architectural best practices, and the rise of languages such as Java and C# has been largely to address this."
But Driver says there's one rapidly growing area where there is likely to a be a huge demand for programmers with skills in C: the internet of things (IoT). He says that the rise of IoT could lead to a huge revival in the need for small footprint codebases and runtimes. "For traditional workloads there is no need to be counting the bytes like there used to be. But when it comes to IoT applications there is that need once again. So we may well see a resurgence in demand for C skills.""
'via Blog this'
"We see almost no demand for C or C++ among our IT centric clients," says Driver. "What we see is Java and other managed code languages being used," he says. "C doesn't allow you to address many modern architectural best practices, and the rise of languages such as Java and C# has been largely to address this."
But Driver says there's one rapidly growing area where there is likely to a be a huge demand for programmers with skills in C: the internet of things (IoT). He says that the rise of IoT could lead to a huge revival in the need for small footprint codebases and runtimes. "For traditional workloads there is no need to be counting the bytes like there used to be. But when it comes to IoT applications there is that need once again. So we may well see a resurgence in demand for C skills.""
'via Blog this'
Friday, 17 February 2017
Statistics: Removing Outliers Using Standard Deviation in Python
Removing Outliers Using Standard Deviation in Python: "Removing Outliers Using Standard Deviation in Python"
'via Blog this'
'via Blog this'
Jupyter Notebook Viewer: Python "objects and types and metaclasses..."
Jupyter Notebook Viewer: "The Tao of Python
The intricate relationship between "object" and "type" and how metaclasses, classes and instances are related"
'via Blog this'
The intricate relationship between "object" and "type" and how metaclasses, classes and instances are related"
'via Blog this'
Using functional programming in Python like a boss: Generators, Iterators and Decorators
Jupyter Notebook Viewer: "Using functional programming in Python like a boss: Generators, Iterators and Decorators"
'via Blog this'
'via Blog this'
Wednesday, 15 February 2017
Google’s not-so-secret new OS — Tech Specs
Google’s not-so-secret new OS — Tech Specs: "I decided to dig through open source to examine the state of Google’s upcoming Andromeda OS. For anyone unfamiliar, Andromeda seems to be the replacement for both Android and Chrome OS (cue endless debates over the semantics of that, and what it all entails). Fuchsia is the actual name of the operating system, while Magenta is the name of the kernel, or more correctly, the microkernel. Many of the architectural design decisions appear to have unsurprisingly been focused on creating a highly scalable platform.
It goes without saying that Google isn’t trying to hide Fuchsia. People have clearly discovered that Google is replacing Android’s Linux kernel. Still, I thought it would be interesting for people to get a better sense of what the OS actually is. This article is only intended to be an overview of the basics, as far as I can comment reasonably competently. (I certainly never took an operating systems class!)"
"Proof"
'via Blog this'
It goes without saying that Google isn’t trying to hide Fuchsia. People have clearly discovered that Google is replacing Android’s Linux kernel. Still, I thought it would be interesting for people to get a better sense of what the OS actually is. This article is only intended to be an overview of the basics, as far as I can comment reasonably competently. (I certainly never took an operating systems class!)"
"Proof"
Since writing my last piece, some Googlers reached out and said my assessment was largely right. The Andromeda part specifically was fairly inaccurate though, so I will try to rectify that.
Based on this code, it looks like Andromeda might be tied to free-form window mode for laptops and possibly tablets. Thus, as I wrote in my initial article, Andromeda + Fuchsia might launch initially only as a laptop platform. I think the app “chrome” will probably look like Android (because they will be Android or Flutter apps), but with floating windows and elements of or even an overall UI similar to Chrome OS. Supported inputs would be mouse or trackpad and keyboard, and possibly touch. Not wildly different from Chrome OS today, in other words. This may also explain the “Chrome OS will merge into Android” claim originally made by the Wall Street Journal. The underlying OS will still be Fuchsia, though.
Instead, I think for all Fuchsia devices, the Android API and runtime will continue to function as before, except now the underlying OS will be Fuchsia, and the kernel will be Magenta, not Linux. And then there would also be Mojo, Flutter, etc. at least starting on Andromeda devices. It’s hard to imagine pushing both the Mojo and Android APIs forever though, and Android will likely eventually (in several years) have to fade away.
Back to the more important point: yes, Fuchsia will be Google’s new OS underpinning all its consumer devices eventually. I think both a “Pixel 3” laptop (or whatever this hypothetical product would be called) and the Pixel 2 smartphone will probably run on Fuchsia, but I make zero promises as to anything shipping at any particular point in time, because I have no idea. Still, that is my suspicion based on public commits.
And again, if Google doesn’t break compatibility with the Linux user space, yes, it really can swap out the Android kernel (Linux) for Magenta/Fuchsia, and leave the Android API in its place. Standards like POSIX do exist, after all. Here is some code pointing to exactly that.
'via Blog this'
Sunday, 12 February 2017
Software Engineering at Google. I like thinking about workflow and process, so this fascinates me. ht @craigcitro https://t.co/66dZtWTROE— Jenny Bryan (@JennyBryan) February 12, 2017
Saturday, 11 February 2017
Data Science/Society: The AI Threat Isn't Skynet. It's the End of the Middle Class | WIRED
The AI Threat Isn't Skynet. It's the End of the Middle Class | WIRED: "That said, these researchers say they are intent on finding the answer. “People work through the concerns in different ways. But I haven’t met an AI researcher who doesn’t care,” Etzioni says. “People are mindful.” But they feel certain that preventing the rise of AI is not the answer. It’s also not really possible—a bit like bringing those old manufacturing jobs back."
'via Blog this'
'via Blog this'
Monitor web page changes with Go
Monitor web page changes with Go: "In this article, we will look into how to create a program that will monitor web page changes using Go programming language with optional cookies header."
'via Blog this'
'via Blog this'
Friday, 10 February 2017
Web/IOT: Designing a True REST State Machine | Nordic APIs |
Designing a True REST State Machine | Nordic APIs |: "There are many misconceptions surrounding what exactly Representational State Transfer (REST) is. The prime of which is the concept of hypermedia, or defined in full context, Hypermedia as the engine of application state (HATEOAS).
Jargon aside, hypermedia is actually a valuable idea that many self-touted “RESTful” web APIs do not adhere to. Hypermedia places heightened operational significance on resources, located at URIs. With a hypermedia API, when a request is sent to a URI, the response lists information on resource state and acceptable future operations, in essence creating a state machine that can be manipulated.
Hypermedia is truly valuable as it can create more powerful APIs that alleviate the need for API versioning. But this is only one of many facets that makes true REST design awesome.
Today, we’re dedicating time to define what exactly REST is and isn’t.
Led by RESTafarian Asbjørn Ulsberg, we’ll uncover the history of information design that has led to REST, and debunk some common misinterpretations of REST design.
We’ll also construct a mock state machine and example HTTP behaviors, demonstrating how hypermedia could be used within a REST API to trigger states on an IoT kitchen device. Actually following the REST constraints by building a HATEOAS-compliant API could be very beneficial to advancing the web, so let’s give it the focus it deserves."
'via Blog this'
Jargon aside, hypermedia is actually a valuable idea that many self-touted “RESTful” web APIs do not adhere to. Hypermedia places heightened operational significance on resources, located at URIs. With a hypermedia API, when a request is sent to a URI, the response lists information on resource state and acceptable future operations, in essence creating a state machine that can be manipulated.
Hypermedia is truly valuable as it can create more powerful APIs that alleviate the need for API versioning. But this is only one of many facets that makes true REST design awesome.
Today, we’re dedicating time to define what exactly REST is and isn’t.
Led by RESTafarian Asbjørn Ulsberg, we’ll uncover the history of information design that has led to REST, and debunk some common misinterpretations of REST design.
We’ll also construct a mock state machine and example HTTP behaviors, demonstrating how hypermedia could be used within a REST API to trigger states on an IoT kitchen device. Actually following the REST constraints by building a HATEOAS-compliant API could be very beneficial to advancing the web, so let’s give it the focus it deserves."
'via Blog this'
Thursday, 9 February 2017
Functional Programming HOWTO — Python 3.6.0 documentation
Functional Programming HOWTO — Python 3.6.0 documentation: "In this document, we’ll take a tour of Python’s features suitable for implementing programs in a functional style. After an introduction to the concepts of functional programming, we’ll look at language features such as iterators and generators and relevant library modules such as itertools and functools."
'via Blog this'
'via Blog this'
Arista: Networking Standards Move Too Slowly for Cloud Giants
Arista Founder: Networking Standards Move Too Slowly for Cloud Gi: "SANTA CLARA, California — The rise of the cloud titans has disrupted the comfortable standards cycles of the networking world and is — or at least should be — forcing the ecosystem to move faster, Arista Co-Founder Andy Bechtolsheim said during the opening talk at the Linley Cloud Hardware Conference today.
“Ten years ago, there was a single company dominating the space, and — let’s just say they didn’t have a motivation to go faster,” he said. “In the new world, it’s a fundamental change in the competitive environment.”"
'via Blog this'
“Ten years ago, there was a single company dominating the space, and — let’s just say they didn’t have a motivation to go faster,” he said. “In the new world, it’s a fundamental change in the competitive environment.”"
'via Blog this'
elements-of-python-style/README.md at master · amontalenti/elements-of-python-style · GitHub
elements-of-python-style/README.md at master · amontalenti/elements-of-python-style · GitHub: "This document goes beyond PEP8 to cover the core of what I think of as great Python style. It is opinionated, but not too opinionated. It goes beyond mere issues of syntax and module layout, and into areas of paradigm, organization, and architecture. I hope it can be a kind of condensed "Strunk & White" for Python code."
'via Blog this'
'via Blog this'
Wednesday, 8 February 2017
Web/Javascript Polyfills and the evolution of the web - TAG finding
Polyfills and the evolution of the web - TAG finding: "Polyfills are a valuable part of Web architecture, because they promote the adoption of new features during the implementation process. However, polyfills can also create problems for standardization efforts and therefore for the future of the Web. This document defines the risks, benefits, and role of polyfills on the Web, and proposes best practices for implementors, spec editors, website developers, polyfill authors, and operators of polyfill distribution platforms."
'via Blog this'
'via Blog this'
Monitoring and Tuning the Linux Networking Stack: Sending Data - Packagecloud Blog
Monitoring and Tuning the Linux Networking Stack: Sending Data - Packagecloud Blog: "This blog post explains how computers running the Linux kernel send packets, as well as how to monitor and tune each component of the networking stack as packets flow from user programs to network hardware.
This post forms a pair with our previous post Monitoring and Tuning the Linux Networking Stack: Receiving Data."
'via Blog this'
This post forms a pair with our previous post Monitoring and Tuning the Linux Networking Stack: Receiving Data."
'via Blog this'
Saturday, 4 February 2017
intermezzOS: a little OS - Systems Programming : rust
intermezzOS: a little OS: "intermezzOS is a teaching operating system, specifically focused on introducing systems programming concepts to experienced developers from other areas of programming."
'via Blog this'
'via Blog this'
Daniel Allen Deutsch: Linux/Unix: Using tmux Properly
Daniel Allen Deutsch: "I've been using terminal multiplexers for a few years, but never properly.
In the beginning, it was just me and the (plain) terminal. Then I started using Byobu, because it was company-standard at my first job. Later I installed tmux on my personal computer because it seemed more popular. And every time I work on a remote server, I use Screen. Lions and tigers and bears, oh my!
This begs a few of questions. We'll go through them in the next section.
As a quick aside before we dive in—'terminal multiplexer' is an intimidating term. But none of the concepts are complex. Terminal means console and multipexing is just running numerous processes at the same time in one place."
'via Blog this'
In the beginning, it was just me and the (plain) terminal. Then I started using Byobu, because it was company-standard at my first job. Later I installed tmux on my personal computer because it seemed more popular. And every time I work on a remote server, I use Screen. Lions and tigers and bears, oh my!
This begs a few of questions. We'll go through them in the next section.
As a quick aside before we dive in—'terminal multiplexer' is an intimidating term. But none of the concepts are complex. Terminal means console and multipexing is just running numerous processes at the same time in one place."
'via Blog this'
Rewriting Duolingo's engine in Scala | Making Duolingo Blog
Rewriting Duolingo's engine in Scala | Making Duolingo Blog:
Recently, we profoundly refactored the engine that drives Duolingo lessons. This post talks about our engineering choices, experiences, and the pain points of rewriting a highly complex system.
'via Blog this'
Recently, we profoundly refactored the engine that drives Duolingo lessons. This post talks about our engineering choices, experiences, and the pain points of rewriting a highly complex system.
- Highlights:
- Redesigned architecture
- Refactored code from Python to Scala
- Latency dropped from 750ms to 14ms
- Engine uptime increased from 99.9% to 100%
'via Blog this'
Thursday, 2 February 2017
Google Python Style Guide
Google Python Style Guide: "Python is the main scripting language used at Google. This style guide is a list of dos and don'ts for Python programs.
To help you format code correctly, we've created a settings file for Vim. For Emacs, the default settings should be fine."
'via Blog this'
To help you format code correctly, we've created a settings file for Vim. For Emacs, the default settings should be fine."
'via Blog this'
Java Performance: The JVM is not that heavy - Open Sourcery
The JVM is not that heavy - Open Sourcery: "Be very careful before judging the JVM as a target. Judge Java as a language by all means, but keep it separate from the virtual machine.
I used to believe the same things you did. I used to think of the JVM as this behemoth. Now I'm thankful to be able to throw my parentheses at it and have the work of thousands of giants support it.
By no means take this post as a sign of "the end of Node" or "the end of Ruby". Let it bring a fresh perspective. If you can't switch to the JVM, at least think about what you could do to help eliminate the bloat from your own world.
"
'via Blog this'
I used to believe the same things you did. I used to think of the JVM as this behemoth. Now I'm thankful to be able to throw my parentheses at it and have the work of thousands of giants support it.
By no means take this post as a sign of "the end of Node" or "the end of Ruby". Let it bring a fresh perspective. If you can't switch to the JVM, at least think about what you could do to help eliminate the bloat from your own world.
"
'via Blog this'
Wednesday, 1 February 2017
Introduction to Machine Learning with Python
Introduction to Machine Learning with Python: "Machine learning has long powered many products we interact with daily–from "intelligent" assistants like Apple's Siri and Google Now, to recommendation engines like Amazon's that suggest new products to buy, to the ad ranking systems used by Google and Facebook. More recently, machine learning has entered the public consciousness because of advances in "deep learning"–these include AlphaGo's defeat of Go grandmaster Lee Sedol and impressive new products around image recognition and machine translation.
In this series, we'll give an introduction to some powerful but generally applicable techniques in machine learning. These include deep learning but also more traditional methods that are often all the modern business needs. After reading the articles in the series, you should have the knowledge necessary to embark on concrete machine learning experiments in a variety of areas on your own."
'via Blog this'
In this series, we'll give an introduction to some powerful but generally applicable techniques in machine learning. These include deep learning but also more traditional methods that are often all the modern business needs. After reading the articles in the series, you should have the knowledge necessary to embark on concrete machine learning experiments in a variety of areas on your own."
'via Blog this'
The Infrastructure Behind Twitter: Scaling Networking, Storage and Provisioning
The Infrastructure Behind Twitter: Scaling Networking, Storage and Provisioning: "By late 2010 Twitter had finalised their first in-house network architecture that was designed to address scale and service issues that were encountered with the existing third-party colocated infrastructure. Initially, the use of deep buffer Top of Rack (ToR) switches, and carrier-grade core network switches allowed Twitter to support previously unseen transaction per second (TPS) volumes that were generated as a result of global events such as the World Cup Football in 2014. However, over the next several years the Twitter infrastructure team added network point-of-presence (PoPs) over five continents, and in 2015 Twitter moved from a traditional hierarchical data center network topology to a Clos network using Border Gateway Protocol (BGP) for routing. Highlights of the Clos approach include a smaller 'blast radius' of a single device failure, horizontal bandwidth scaling capabilities, and higher route capacity due to lower CPU overhead."
'via Blog this'
'via Blog this'
Is there still a business case for private cloud? – Cloud Technology Partners - Linkis.com
Is there still a business case for private cloud? – Cloud Technology Partners - Linkis.com:
Despite the increasing popularity of public cloud’s on-demand, pay-per-use model, private cloud still has a place in the enterprise, and its adoption continues to grow across platforms. There remains legitimate reasons to own and manage your own technology infrastructure, and private clouds bring some of the benefits of cloud principles to such data center deployments.
For Episode 100 of The Doppler podcast, David Linthicum sat down with private cloud proponent John Engates, and private cloud skeptic Bernard Golden to moderate a discussion around the future of private cloud and its business value in IT’s dynamic landscape.
'via Blog this'
Despite the increasing popularity of public cloud’s on-demand, pay-per-use model, private cloud still has a place in the enterprise, and its adoption continues to grow across platforms. There remains legitimate reasons to own and manage your own technology infrastructure, and private clouds bring some of the benefits of cloud principles to such data center deployments.
For Episode 100 of The Doppler podcast, David Linthicum sat down with private cloud proponent John Engates, and private cloud skeptic Bernard Golden to moderate a discussion around the future of private cloud and its business value in IT’s dynamic landscape.
'via Blog this'
http://www.liuchengxu.org: how to use vim as a python ide
how to use vim as a python ide: "I love vim and often use it to write Python code. Here are some useful plugins and tools for building a delightful vim python environment, escpecially for Vim8:"
'via Blog this'
'via Blog this'
Subscribe to:
Posts (Atom)