56,966 blogs · [ { "id": "01a0821b-7868-7385-8ab8-7267c2f22abc", "title": "Interfacing Python and C: The CFFI Module", "url": "https://dbader.org/blog/python-cffi", "published_at": "2018-02-27T00:00:00+00:00" }, { "id": "01a0821b-7868-7385-8ab8-7267c335a6ce", "title": "Write More Pythonic Code by Applying the Things You Already Know", "url": "https://dbader.org/blog/writing-pythonic-code", "published_at": "2018-01-25T00:00:00+00:00" }, { "id": "01a0821b-7868-7385-8ab8-7267c36cb1f7", "title": "Working With File I/O in Python", "url": "https://dbader.org/blog/python-file-io", "published_at": "2018-01-16T00:00:00+00:00" }, { "id": "01a0821b-7868-7385-8ab8-7267c37665c0", "title": "How to Reverse a String in Python", "url": "https://dbader.org/blog/python-reverse-string", "published_at": "2018-01-09T00:00:00+00:00" }, { "id": "01a0821b-7868-7385-8ab8-7267c420d0b1", "title": "Mastering Click: Writing Advanced Python Command-Line Apps", "url": "https://dbader.org/blog/mastering-click-advanced-python-command-line-apps", "published_at": "2018-01-02T00:00:00+00:00" }, { "id": "01a0821b-7868-7385-8ab8-7267c4c16c36", "title": "Working with Random Numbers in Python", "url": "https://dbader.org/blog/python-random-numbers", "published_at": "2017-12-26T00:00:00+00:00" }, { "id": "01a0821b-7868-7385-8ab8-7267c526e4cf", "title": "How to Send an Email With Python", "url": "https://dbader.org/blog/python-send-email", "published_at": "2017-12-19T00:00:00+00:00" }, { "id": "01a0821b-7868-7385-8ab8-7267c56179b2", "title": "Python Tricks: The Book Is Now Available on Kindle", "url": "https://dbader.org/blog/python-tricks-book-kindle-announcement", "published_at": "2017-12-13T00:00:00+00:00" }, { "id": "01a0821b-7868-7385-8ab8-7267c618a160", "title": "Python Multi-line Comments: Your Two Best Options", "url": "https://dbader.org/blog/python-multiline-comment", "published_at": "2017-12-12T00:00:00+00:00" }, { "id": "01a0821b-7868-7385-8ab8-7267c709bccf", "title": "Writing Python Command-Line Tools With Click", "url": "https://dbader.org/blog/python-commandline-tools-with-click", "published_at": "2017-12-06T00:00:00+00:00" }, { "id": "01a0821b-7868-7385-8ab8-7267c7a0b5e1", "title": "Python’s enumerate() Function Demystified", "url": "https://dbader.org/blog/python-enumerate", "published_at": "2017-12-05T00:00:00+00:00" }, { "id": "01a0821b-7868-7385-8ab8-7267c8095f51", "title": "Using Python for Mobile Development: Kivy vs BeeWare", "url": "https://dbader.org/blog/python-mobile-development-kivy-vs-beeware", "published_at": "2017-11-28T00:00:00+00:00" }, { "id": "01a0821b-7868-7385-8ab8-7267c8afb0b5", "title": "Memoization in Python: How to Cache Function Results", "url": "https://dbader.org/blog/python-memoization", "published_at": "2017-11-21T00:00:00+00:00" }, { "id": "01a0821b-7868-7385-8ab8-7267c93e30d9", "title": "Finding Python Projects to Grow Your Programming Skills", "url": "https://dbader.org/blog/python-projects-inspiration", "published_at": "2017-11-14T00:00:00+00:00" }, { "id": "01a0821b-7868-7385-8ab8-7267c9cc440c", "title": "Interfacing Python and C: Advanced “ctypes” Features", "url": "https://dbader.org/blog/python-ctypes-tutorial-part-2", "published_at": "2017-11-07T00:00:00+00:00" }, { "id": "01a0821b-7868-7385-8ab8-7267c9ed7b55", "title": "Python Tricks: The Book Launch FAQ", "url": "https://dbader.org/blog/python-tricks-launch-faq", "published_at": "2017-11-01T00:00:00+00:00" }, { "id": "01a0821b-7868-7385-8ab8-7267ca63d343", "title": "Announcing Python Tricks: The Book!", "url": "https://dbader.org/blog/announcing-python-tricks-the-book", "published_at": "2017-10-31T00:00:00+00:00" }, { "id": "01a0821b-7868-7385-8ab8-7267cb305b6e", "title": "Python Parallel Computing (in 60 Seconds or less)", "url": "https://dbader.org/blog/python-parallel-computing-in-60-seconds", "published_at": "2017-10-24T00:00:00+00:00" }, { "id": "01a0821b-7868-7385-8ab8-7267cb98b509", "title": "Writing a Domain Specific Language (DSL) in Python", "url": "https://dbader.org/blog/writing-a-dsl-with-python", "published_at": "2017-10-17T00:00:00+00:00" }, { "id": "01a0821b-7868-7385-8ab8-7267cc8f3a49", "title": "Getting a Job as a Self-Taught Python Developer", "url": "https://dbader.org/blog/getting-a-job-as-a-self-taught-python-developer", "published_at": "2017-10-10T00:00:00+00:00" }, { "id": "01a0821b-7868-7385-8ab8-7267ccdd91f2", "title": "How to Structure Your Python Programs", "url": "https://dbader.org/blog/how-to-structure-python-programs", "published_at": "2017-10-03T00:00:00+00:00" }, { "id": "01a0821b-7868-7385-8ab8-7267cdabc410", "title": "I’m bad at math and I’ll never be a real programmer", "url": "https://dbader.org/blog/bad-at-math-programmer", "published_at": "2017-09-26T00:00:00+00:00" }, { "id": "01a0821b-7868-7385-8ab8-7267cdb10603", "title": "Contributing to Python Open-Source Projects", "url": "https://dbader.org/blog/python-open-source-contributing", "published_at": "2017-09-19T00:00:00+00:00" }, { "id": "01a0821b-7868-7385-8ab8-7267cdf14370", "title": "Iterator Chains as Pythonic Data Processing Pipelines", "url": "https://dbader.org/blog/python-iterator-chains", "published_at": "2017-09-12T00:00:00+00:00" }, { "id": "01a0821b-7868-7385-8ab8-7267ce80900d", "title": "Extending Python With C Libraries and the “ctypes” Module", "url": "https://dbader.org/blog/python-ctypes-tutorial", "published_at": "2017-09-05T00:00:00+00:00" }, { "id": "01a0821b-7868-7385-8ab8-7267ceb5ad28", "title": "Generator Expressions in Python: An Introduction", "url": "https://dbader.org/blog/python-generator-expressions", "published_at": "2017-08-29T00:00:00+00:00" }, { "id": "01a0821b-7868-7385-8ab8-7267cf5ca4b4", "title": "What Are Python Generators?", "url": "https://dbader.org/blog/python-generators", "published_at": "2017-08-22T00:00:00+00:00" }, { "id": "01a0821b-7868-7385-8ab8-7267d0060e15", "title": "Unpacking Nested Data Structures in Python", "url": "https://dbader.org/blog/python-nested-unpacking", "published_at": "2017-08-15T00:00:00+00:00" }, { "id": "01a0821b-7868-7385-8ab8-7267d02e7b69", "title": "Python String Conversion 101: Why Every Class Needs a “repr”", "url": "https://dbader.org/blog/python-repr-vs-str", "published_at": "2017-08-08T00:00:00+00:00" }, { "id": "01a0821b-7868-7385-8ab8-7267d095850a", "title": "Python Iterators: A Step-By-Step Introduction", "url": "https://dbader.org/blog/python-iterators", "published_at": "2017-08-01T00:00:00+00:00" }, { "id": "01a0821b-7868-7385-8ab8-7267d14f5282", "title": "How to Install and Uninstall Python Packages Using Pip", "url": "https://dbader.org/blog/install-and-uninstall-python-packages-using-pip", "published_at": "2017-07-25T00:00:00+00:00" }, { "id": "01a0821b-7868-7385-8ab8-7267d192e46c", "title": "How to Check if a File Exists in Python", "url": "https://dbader.org/blog/python-check-if-file-exists", "published_at": "2017-07-18T00:00:00+00:00" }, { "id": "01a0821b-7868-7385-8ab8-7267d218c343", "title": "How to Reverse a List in Python", "url": "https://dbader.org/blog/python-reverse-list", "published_at": "2017-07-11T00:00:00+00:00" }, { "id": "01a0821b-7868-7385-8ab8-7267d2242881", "title": "Array Data Structures in Python", "url": "https://dbader.org/blog/python-arrays", "published_at": "2017-07-04T00:00:00+00:00" }, { "id": "01a0821b-7868-7385-8ab8-7267d2e7f988", "title": "Linked Lists in Python", "url": "https://dbader.org/blog/python-linked-list", "published_at": "2017-06-27T00:00:00+00:00" }, { "id": "01a0821b-7868-7385-8ab8-7267d37140c0", "title": "Enriching Your Python Classes With Dunder (Magic, Special) Methods", "url": "https://dbader.org/blog/python-dunder-methods", "published_at": "2017-06-20T00:00:00+00:00" }, { "id": "01a0821b-7868-7385-8ab8-7267d44ebbeb", "title": "Understanding Asynchronous Programming in Python", "url": "https://dbader.org/blog/understanding-asynchronous-programming-in-python", "published_at": "2017-06-13T00:00:00+00:00" }, { "id": "01a0821b-7868-7385-8ab8-7267d472c73d", "title": "How to Speed Up Python Code Reviews With Linting", "url": "https://dbader.org/blog/speeding-up-python-code-reviews-with-linting", "published_at": "2017-06-08T00:00:00+00:00" }, { "id": "01a0821b-7868-7385-8ab8-7267d564c9d2", "title": "A Story About Python Mastery", "url": "https://dbader.org/blog/a-story-about-python-mastery", "published_at": "2017-06-08T00:00:00+00:00" }, { "id": "01a0821b-7868-7385-8ab8-7267d64567e3", "title": "Records, Structs, and Data Transfer Objects in Python", "url": "https://dbader.org/blog/records-structs-and-data-transfer-objects-in-python", "published_at": "2017-06-06T00:00:00+00:00" }, { "id": "01a0821b-7868-7385-8ab8-7267d73ffc3b", "title": "An Overview of Python’s “ipaddress” Module", "url": "https://dbader.org/blog/python-ipaddress-module", "published_at": "2017-06-01T00:00:00+00:00" }, { "id": "01a0821b-7868-7385-8ab8-7267d814fd5f", "title": "How to Prepare for a Python Coding Interview", "url": "https://dbader.org/blog/how-to-prepare-for-a-python-coding-interview", "published_at": "2017-05-30T00:00:00+00:00" }, { "id": "01a0821b-7868-7385-8ab8-7267d8c62788", "title": "In Love, War, and Open-Source: Never Give Up", "url": "https://dbader.org/blog/in-love-war-and-open-source-never-give-up", "published_at": "2017-05-25T00:00:00+00:00" }, { "id": "01a0821b-7868-7385-8ab8-7267d9ac880b", "title": "The Meaning of Underscores in Python", "url": "https://dbader.org/blog/meaning-of-underscores-in-python", "published_at": "2017-05-23T00:00:00+00:00" }, { "id": "01a0821b-7868-7385-8ab8-7267da647c92", "title": "When to Use Python", "url": "https://dbader.org/blog/when-to-use-python", "published_at": "2017-05-18T00:00:00+00:00" }, { "id": "01a0821b-7868-7385-8ab8-7267dae7719b", "title": "Stacks in Python", "url": "https://dbader.org/blog/stacks-in-python", "published_at": "2017-05-16T00:00:00+00:00" }, { "id": "01a0821b-7868-7385-8ab8-7267dbdb7d9d", "title": "Let’s Program with Python: Reacting to User Input (Part 4)", "url": "https://dbader.org/blog/python-intro-reacting-to-user-input", "published_at": "2017-05-11T00:00:00+00:00" }, { "id": "01a0821b-7868-7385-8ab8-7267dc660d8c", "title": "PythonistaCafe: A Peer-to-Peer Learning Community for Python Developers", "url": "https://dbader.org/blog/introducing-pythonistacafe", "published_at": "2017-05-09T00:00:00+00:00" }, { "id": "01a0821b-7868-7385-8ab8-7267dcaf3ba0", "title": "Let’s Program with Python: Conditionals and “if” Statements (Part 3)", "url": "https://dbader.org/blog/python-intro-conditionals-and-if-statements", "published_at": "2017-05-04T00:00:00+00:00" }, { "id": "01a0821b-7868-7385-8ab8-7267dd9dec61", "title": "Queues in Python", "url": "https://dbader.org/blog/queues-in-python", "published_at": "2017-05-02T00:00:00+00:00" }, { "id": "01a0821b-7868-7385-8ab8-7267ddaa8b7e", "title": "Let’s Program with Python: Functions and Lists (Part 2)", "url": "https://dbader.org/blog/python-intro-functions-and-lists", "published_at": "2017-04-27T00:00:00+00:00" }, { "id": "01a0821b-7868-7385-8ab8-7267de114272", "title": "Sets and Multisets in Python", "url": "https://dbader.org/blog/sets-and-multiset-in-python", "published_at": "2017-04-25T00:00:00+00:00" }, { "id": "01a0821b-7868-7385-8ab8-7267de73e5ef", "title": "Let’s Program with Python: Statements, Variables, and Loops (Part 1)", "url": "https://dbader.org/blog/python-intro-statements-variables-and-loops", "published_at": "2017-04-20T00:00:00+00:00" }, { "id": "01a0821b-7868-7385-8ab8-7267deccffd1", "title": "Dictionaries, Maps, and Hash Tables in Python", "url": "https://dbader.org/blog/python-dictionaries-maps-and-hashtables", "published_at": "2017-04-18T00:00:00+00:00" }, { "id": "01a0821b-7868-7385-8ab8-7267df71b312", "title": "Priority Queues in Python", "url": "https://dbader.org/blog/priority-queues-in-python", "published_at": "2017-04-12T00:00:00+00:00" }, { "id": "01a0821b-7868-7385-8ab8-7267e0023ae5", "title": "Fundamental Data Structures in Python", "url": "https://dbader.org/blog/fundamental-data-structures-in-python", "published_at": "2017-04-11T00:00:00+00:00" }, { "id": "01a0821b-7868-7385-8ab8-7267e07bbd1e", "title": "Python Decorators: A Step-By-Step Introduction", "url": "https://dbader.org/blog/python-decorators", "published_at": "2017-04-04T00:00:00+00:00" }, { "id": "01a0821b-7868-7385-8ab8-7267e148e841", "title": "Finding and Choosing Quality Python Packages", "url": "https://dbader.org/blog/finding-and-choosing-quality-python-packages", "published_at": "2017-03-28T00:00:00+00:00" }, { "id": "01a0821b-7868-7385-8ab8-7267e1d4f45a", "title": "Python’s Functions Are First-Class", "url": "https://dbader.org/blog/python-first-class-functions", "published_at": "2017-03-21T00:00:00+00:00" }, { "id": "01a0821b-7868-7385-8ab8-7267e2cbfd1e", "title": "How to Make Your Python Loops More Pythonic", "url": "https://dbader.org/blog/pythonic-loops", "published_at": "2017-03-14T00:00:00+00:00" }, { "id": "01a0821b-7868-7385-8ab8-7267e3a4609a", "title": "5 Python Development Setup Tips to Boost Your Productivity", "url": "https://dbader.org/blog/python-development-setup-tips-to-boost-your-productivity", "published_at": "2017-03-07T00:00:00+00:00" }, { "id": "01a0821b-7868-7385-8ab8-7267e3d3824c", "title": "Context Managers and the “with” Statement in Python", "url": "https://dbader.org/blog/python-context-managers-and-with-statement", "published_at": "2017-02-28T00:00:00+00:00" }, { "id": "01a0821b-7868-7385-8ab8-7267e4a09b61", "title": "Installing Python and Pip on Windows", "url": "https://dbader.org/blog/installing-python-and-pip-on-windows-10", "published_at": "2017-02-25T00:00:00+00:00" }, { "id": "01a0821b-7868-7385-8ab8-7267e4a8a761", "title": "Sublime Text Settings for Writing Clean Python", "url": "https://dbader.org/blog/sublime-text-settings-for-writing-clean-python", "published_at": "2017-02-21T00:00:00+00:00" }, { "id": "01a0821b-7868-7385-8ab8-7267e52843ae", "title": "Writing Clean Python With Namedtuples", "url": "https://dbader.org/blog/writing-clean-python-with-namedtuples", "published_at": "2017-02-14T00:00:00+00:00" }, { "id": "01a0821b-7868-7385-8ab8-7267e5fc7277", "title": "Lambda Functions in Python: What Are They Good For?", "url": "https://dbader.org/blog/python-lambda-functions", "published_at": "2017-02-07T00:00:00+00:00" }, { "id": "01a0821b-7868-7385-8ab8-7267e690fe60", "title": "Why Learn Python? Here Are 8 Data-Driven Reasons", "url": "https://dbader.org/blog/why-learn-python", "published_at": "2017-01-31T00:00:00+00:00" }, { "id": "01a0821b-7868-7385-8ab8-7267e7157c20", "title": "The 4 Major Ways to Do String Formatting in Python", "url": "https://dbader.org/blog/python-string-formatting", "published_at": "2017-01-24T00:00:00+00:00" }, { "id": "01a0821b-7868-7385-8ab8-7267e755288c", "title": "Assert Statements in Python", "url": "https://dbader.org/blog/python-assert-tutorial", "published_at": "2017-01-18T00:00:00+00:00" }, { "id": "01a0821b-7868-7385-8ab8-7267e7f705a2", "title": "Comprehending Python’s Comprehensions", "url": "https://dbader.org/blog/list-dict-set-comprehensions-in-python", "published_at": "2017-01-11T00:00:00+00:00" }, { "id": "01a0821b-7868-7385-8ab8-7267e833649c", "title": "The Difference Between “is” and “==” in Python", "url": "https://dbader.org/blog/difference-between-is-and-equals-in-python", "published_at": "2016-12-28T00:00:00+00:00" }, { "id": "01a0821b-7868-7385-8ab8-7267e884472e", "title": "How to Speak at a Python Conference", "url": "https://dbader.org/blog/how-to-speak-at-a-python-conference", "published_at": "2016-12-13T00:00:00+00:00" }, { "id": "01a0821b-7868-7385-8ab8-7267e8b03868", "title": "Cool new features in Python 3.6", "url": "https://dbader.org/blog/cool-new-features-in-python-3-6", "published_at": "2016-12-08T00:00:00+00:00" }, { "id": "01a0821b-7868-7385-8ab8-7267e907a065", "title": "3 Reasons why you need a programming blog", "url": "https://dbader.org/blog/3-reasons-why-you-need-a-programming-blog", "published_at": "2016-11-30T00:00:00+00:00" }, { "id": "01a0821b-7868-7385-8ab8-7267e9498bdb", "title": "A Python Riddle: The Craziest Dict Expression in the West", "url": "https://dbader.org/blog/python-mystery-dict-expression", "published_at": "2016-11-23T00:00:00+00:00" }, { "id": "01a0821b-7868-7385-8ab8-7267e9b2790f", "title": "The Ultimate List of Python Podcasts", "url": "https://dbader.org/blog/ultimate-list-of-python-podcasts", "published_at": "2016-11-15T00:00:00+00:00" }, { "id": "01a0821b-7868-7385-8ab8-7267ea97e417", "title": "How code linting will make you awesome at Python", "url": "https://dbader.org/blog/python-code-linting", "published_at": "2016-11-10T00:00:00+00:00" }, { "id": "01a0821b-7868-7385-8ab8-7267eaae8491", "title": "A Python refactoring gone wrong", "url": "https://dbader.org/blog/python-refactoring-gone-wrong", "published_at": "2016-11-03T00:00:00+00:00" }, { "id": "01a0821b-7868-7385-8ab8-7267ebadf87e", "title": "Python Code Review: Unplugged – Episode 3", "url": "https://dbader.org/blog/python-code-review-unplugged-episode-3", "published_at": "2016-10-26T00:00:00+00:00" }, { "id": "01a0821b-7868-7385-8ab8-7267ebcf072d", "title": "Click & jump to any file or folder from the terminal", "url": "https://dbader.org/blog/click-and-jump-to-any-file-or-folder-from-the-terminal", "published_at": "2016-10-17T00:00:00+00:00" }, { "id": "01a0821b-7868-7385-8ab8-7267ec153d16", "title": "Sublime Text plugin review: Djaneiro", "url": "https://dbader.org/blog/sublime-text-djaneiro-review", "published_at": "2016-10-11T00:00:00+00:00" }, { "id": "01a0821b-7868-7385-8ab8-7267ec6ec551", "title": "The Complete Guide to Setting up Sublime Text for Python Developers – Now Available!", "url": "https://dbader.org/blog/python-sublime-text-setup-guide", "published_at": "2016-10-04T00:00:00+00:00" }, { "id": "01a0821b-7868-7385-8ab8-7267ecbe460f", "title": "Python Code Review: Unplugged – Episode 2", "url": "https://dbader.org/blog/python-code-review-unplugged-episode-2", "published_at": "2016-09-27T00:00:00+00:00" }, { "id": "01a0821b-7868-7385-8ab8-7267eda6f287", "title": "How Do I Make My Own Command-Line Commands Using Python?", "url": "https://dbader.org/blog/how-to-make-command-line-commands-with-python", "published_at": "2016-09-23T00:00:00+00:00" }, { "id": "01a0821b-7868-7385-8ab8-7267edc4563c", "title": "Using get() to return a default value from a Python dict", "url": "https://dbader.org/blog/python-dict-get-default-value", "published_at": "2016-09-14T00:00:00+00:00" }, { "id": "01a0821b-7868-7385-8ab8-7267ee0140ac", "title": "Watch me do a “live” Python code review for a reader", "url": "https://dbader.org/blog/live-python-code-review", "published_at": "2016-09-08T00:00:00+00:00" }, { "id": "01a0821b-7868-7385-8ab8-7267eea8636b", "title": "What books should I read to move past the beginner stage in Python?", "url": "https://dbader.org/blog/python-intermediate-level-books", "published_at": "2016-08-31T00:00:00+00:00" }, { "id": "01a0821b-7868-7385-8ab8-7267ef744af1", "title": "Make your Python code more readable with custom exception classes", "url": "https://dbader.org/blog/python-custom-exceptions", "published_at": "2016-08-18T00:00:00+00:00" }, { "id": "01a0821b-7868-7385-8ab8-7267eff46521", "title": "Sublime Text for Python development — My 2016 review", "url": "https://dbader.org/blog/sublime-text-for-python-development-2016-review", "published_at": "2016-08-09T00:00:00+00:00" }, { "id": "01a0821b-7868-7385-8ab8-7267f04c301b", "title": "How to use Python’s min() and max() with nested lists", "url": "https://dbader.org/blog/python-min-max-and-nested-lists", "published_at": "2016-07-26T00:00:00+00:00" }, { "id": "01a0821b-7868-7385-8ab8-7267f0f3c40a", "title": "A better Python REPL: bpython vs python", "url": "https://dbader.org/blog/bpython-a-better-python-repl", "published_at": "2016-07-22T00:00:00+00:00" }, { "id": "01a0821b-7868-7385-8ab8-7267f1c5dba8", "title": "6 things you’re missing out on by never using classes in your Python code", "url": "https://dbader.org/blog/6-things-youre-missing-out-on-by-never-using-classes-in-your-python-code", "published_at": "2016-07-15T00:00:00+00:00" }, { "id": "01a0821b-7868-7385-8ab8-7267f1dcf227", "title": "Parsing ISO 8601 timestamps in plain Django", "url": "https://dbader.org/blog/django-parse-iso-8601-timestamp", "published_at": "2016-07-11T00:00:00+00:00" }, { "id": "01a0821b-7868-7385-8ab8-7267f29f795b", "title": "Catching bogus Python asserts on CI", "url": "https://dbader.org/blog/catching-bogus-python-asserts", "published_at": "2016-03-30T00:00:00+00:00" }, { "id": "01a0821b-7868-7385-8ab8-7267f31964a7", "title": "Generate and host your API documentation for free with open-source tools", "url": "https://dbader.org/blog/open-source-tools-to-generate-and-host-your-api-documentation-for-free", "published_at": "2016-03-17T00:00:00+00:00" }, { "id": "01a0821b-7868-7385-8ab8-7267f3231687", "title": "How to stop Django Rest Framework from leaking docstrings into OPTIONS responses", "url": "https://dbader.org/blog/django-rest-framework-options-response", "published_at": "2016-03-03T00:00:00+00:00" }, { "id": "01a0821b-7869-73fa-a7f7-d56e640e0498", "title": "Debugging memory usage in a live Python web app", "url": "https://dbader.org/blog/debugging-python-memory-usage", "published_at": "2016-02-09T00:00:00+00:00" }, { "id": "01a0821b-7869-73fa-a7f7-d56e64d76e0d", "title": "How to store photos in the cloud and avoid vendor lock-in", "url": "https://dbader.org/blog/how-to-store-photos-in-the-cloud-and-avoid-vendor-lock-in", "published_at": "2015-11-28T00:00:00+00:00" }, { "id": "01a0821b-7869-73fa-a7f7-d56e65652414", "title": "OS X notifications for your pytest runs", "url": "https://dbader.org/blog/osx-notifications-for-your-pytest-runs", "published_at": "2015-05-18T00:00:00+00:00" }, { "id": "01a0821b-7869-73fa-a7f7-d56e66228f5c", "title": "Software engineer reading list: My favourite books about programming", "url": "https://dbader.org/blog/my-favourite-books-about-programming", "published_at": "2014-05-24T00:00:00+00:00" } ] posts Claim your blog
Back to Daniel Bader
Blog · corpus.blog/blogs/dbader.org/posts

Daniel Bader

dbader.org

2018

2017

2016

2015

2014